From a7774b6677b3b94e6264510fd6eedd127cea341a Mon Sep 17 00:00:00 2001 From: Lorenz Cuno Klopfenstein Date: Tue, 10 Apr 2018 18:52:40 +0200 Subject: [PATCH 1/5] Code re-org --- .gitignore | 4 +- Lib/WindowsFormsAero.dll | Bin 97280 -> 0 bytes Lib/WindowsFormsAero.pdb | Bin 249344 -> 0 bytes Lib/WindowsFormsAero.xml | 1131 ------ OnTopReplica/OnTopReplica.csproj.user | 23 - src/.editorconfig | 33 + OnTopReplica.sln => src/OnTopReplica.sln | 104 +- .../OnTopReplica}/AppPaths.cs | 68 +- .../OnTopReplica}/AppStrings.Designer.cs | 0 .../OnTopReplica}/AppStrings.resx | 268 +- .../OnTopReplica}/AspectRatioForm.cs | 532 +-- .../OnTopReplica}/Assets/25.png | Bin .../OnTopReplica}/Assets/arrow_down.png | Bin .../OnTopReplica}/Assets/arrow_up.png | Bin .../OnTopReplica}/Assets/back.png | Bin .../OnTopReplica}/Assets/clickforwarding.png | Bin .../OnTopReplica}/Assets/component.png | Bin .../OnTopReplica}/Assets/desktop.png | Bin .../OnTopReplica}/Assets/empty-window.ico | Bin .../OnTopReplica}/Assets/flag_china.png | Bin .../OnTopReplica}/Assets/flag_czech.png | Bin .../OnTopReplica}/Assets/flag_danish.png | Bin .../OnTopReplica}/Assets/flag_germany.png | Bin .../OnTopReplica}/Assets/flag_ita.png | Bin .../OnTopReplica}/Assets/flag_poland.png | Bin .../OnTopReplica}/Assets/flag_spanish.png | Bin .../OnTopReplica}/Assets/flag_taiwan.png | Bin .../OnTopReplica}/Assets/flag_usa.png | Bin .../OnTopReplica}/Assets/flags.pdn | Bin .../OnTopReplica}/Assets/fullscreen.png | Bin .../OnTopReplica}/Assets/groupmode.png | Bin .../OnTopReplica}/Assets/icon-new-red.ico | Bin .../OnTopReplica}/Assets/icon-new.ico | Bin .../OnTopReplica}/Assets/icon.ico | Bin .../OnTopReplica}/Assets/icon.png | Bin .../OnTopReplica}/Assets/list.png | Bin .../OnTopReplica}/Assets/newicon.png | Bin .../OnTopReplica}/Assets/pos_bottomleft.pdn | Bin .../OnTopReplica}/Assets/pos_bottomleft.png | Bin .../OnTopReplica}/Assets/pos_bottomright.png | Bin .../OnTopReplica}/Assets/pos_center.png | Bin .../OnTopReplica}/Assets/pos_null.png | Bin .../OnTopReplica}/Assets/pos_topleft.png | Bin .../OnTopReplica}/Assets/pos_topright.png | Bin .../OnTopReplica}/Assets/reduce.png | Bin .../OnTopReplica}/Assets/regions.png | Bin .../OnTopReplica}/Assets/regions_new.png | Bin .../OnTopReplica}/Assets/screenshot-icon.ico | Bin .../OnTopReplica}/Assets/window16.png | Bin .../OnTopReplica}/Assets/window_border16.png | Bin .../OnTopReplica}/Assets/window_multiple.pdn | Bin .../Assets/window_multiple16.ico | Bin .../Assets/window_multiple16.png | Bin .../Assets/window_multiple48.png | Bin .../OnTopReplica}/Assets/window_opacity16.png | Bin .../Assets/window_opacity_new.png | Bin .../OnTopReplica}/Assets/window_switch.pdn | Bin .../OnTopReplica}/Assets/window_switch.png | Bin .../OnTopReplica}/Assets/windows.png | Bin .../OnTopReplica}/Assets/x-oblique.png | Bin .../OnTopReplica}/Assets/xiao_add.png | Bin .../OnTopReplica}/Assets/xiao_arrow.png | Bin .../OnTopReplica}/Assets/xiao_delete.png | Bin .../OnTopReplica}/Assets/xiao_down.png | Bin .../OnTopReplica}/Assets/xiao_help.png | Bin .../OnTopReplica}/Assets/xiao_ok.png | Bin .../OnTopReplica}/Assets/xiao_up.png | Bin .../OnTopReplica}/Assets/xiao_wrench.png | Bin .../OnTopReplica}/CREDITS.txt | 34 +- .../OnTopReplica}/CloneClickEventArgs.cs | 64 +- .../OnTopReplica}/CloseRequestEventArgs.cs | 28 +- .../OnTopReplica}/FocusedTextBox.cs | 136 +- .../OnTopReplica}/FullscreenFormManager.cs | 232 +- .../OnTopReplica}/FullscreenMode.cs | 78 +- .../OnTopReplica}/GeometryExtensions.cs | 148 +- .../OnTopReplica}/HotKeyTextBox.cs | 112 +- .../OnTopReplica}/IMessagePumpProcessor.cs | 30 +- .../OnTopReplica}/ImageComboBox.cs | 154 +- .../OnTopReplica}/LICENSE.txt | 108 +- {OnTopReplica => src/OnTopReplica}/Log.cs | 218 +- .../OnTopReplica}/MainForm.Designer.cs | 1202 +++--- .../OnTopReplica}/MainForm.cs | 922 ++--- .../OnTopReplica}/MainForm.resx | 2940 +++++++-------- .../OnTopReplica}/MainForm_ChildForms.cs | 186 +- .../OnTopReplica}/MainForm_Features.cs | 334 +- .../OnTopReplica}/MainForm_Gui.cs | 234 +- .../OnTopReplica}/MainForm_MenuEvents.cs | 404 +- .../OnTopReplica}/MessagePumpManager.cs | 170 +- .../BaseMessagePumpProcessor.cs | 78 +- .../MessagePumpProcessors/FlashCloner.cs | 70 +- .../GroupSwitchManager.cs | 266 +- .../MessagePumpProcessors/HotKeyManager.cs | 334 +- .../ShellInterceptProcessor.cs | 68 +- .../MessagePumpProcessors/WindowKeeper.cs | 80 +- .../OnTopReplica}/NDesk/Options/Options.cs | 2084 +++++------ .../OnTopReplica}/Native/CommonControls.cs | 60 +- .../OnTopReplica}/Native/ErrorMethods.cs | 74 +- .../OnTopReplica}/Native/FilesystemMethods.cs | 102 +- .../OnTopReplica}/Native/HT.cs | 28 +- .../OnTopReplica}/Native/HookMethods.cs | 108 +- .../OnTopReplica}/Native/HotKeyMethods.cs | 156 +- .../OnTopReplica}/Native/ITaskBarList.cs | 90 +- .../OnTopReplica}/Native/InputMethods.cs | 50 +- .../OnTopReplica}/Native/MK.cs | 28 +- .../OnTopReplica}/Native/MessagingMethods.cs | 68 +- .../OnTopReplica}/Native/Point.cs | 72 +- .../OnTopReplica}/Native/Rectangle.cs | 132 +- .../OnTopReplica}/Native/VirtualKeyState.cs | 386 +- .../OnTopReplica}/Native/WM.cs | 58 +- .../OnTopReplica}/Native/WMSZ.cs | 30 +- .../Native/WindowManagerMethods.cs | 216 +- .../OnTopReplica}/Native/WindowMethods.cs | 362 +- .../Native/WindowsSevenMethods.cs | 40 +- .../OnTopReplica}/NativeToolStripRenderer.cs | 1202 +++--- .../OnTopReplica}/NotificationIcon.cs | 170 +- .../OnTopReplica}/OnTopReplica.csproj | 1258 +++---- .../OnTopReplica}/OnTopReplica.exe.manifest | 106 +- .../OnTopReplica}/PlatformSupport.cs | 202 +- .../OnTopReplica}/Platforms/DebugPlatform.cs | 44 +- .../OnTopReplica}/Platforms/Other.cs | 32 +- .../OnTopReplica}/Platforms/WindowsEight.cs | 24 +- .../OnTopReplica}/Platforms/WindowsSeven.cs | 86 +- .../OnTopReplica}/Platforms/WindowsVista.cs | 104 +- .../OnTopReplica}/Platforms/WindowsXp.cs | 30 +- .../OnTopReplica}/PluginRegionLocator.cs | 204 +- {OnTopReplica => src/OnTopReplica}/Program.cs | 334 +- .../OnTopReplica}/Properties/AssemblyInfo.cs | 74 +- .../Properties/Resources.Designer.cs | 966 ++--- .../OnTopReplica}/Properties/Resources.resx | 492 +-- .../Properties/Settings.Designer.cs | 506 +-- .../Properties/Settings.settings | 124 +- .../OnTopReplica}/Properties/app.manifest | 50 +- .../OnTopReplica}/Resources/help.png | Bin .../OnTopReplica}/Resources/minimize.png | Bin .../OnTopReplica}/Resources/new-flat-icon.ico | Bin .../Resources/new-flat-logo-64.png | Bin .../OnTopReplica}/ScreenPosition.cs | 174 +- {OnTopReplica => src/OnTopReplica}/Shell.cs | 54 +- .../OnTopReplica}/SidePanel.cs | 154 +- .../SidePanelContainer.Designer.cs | 90 +- .../OnTopReplica}/SidePanelContainer.cs | 198 +- .../OnTopReplica}/SidePanelContainer.resx | 238 +- .../SidePanels/AboutPanel.Designer.cs | 146 +- .../OnTopReplica}/SidePanels/AboutPanel.cs | 66 +- .../OnTopReplica}/SidePanels/AboutPanel.resx | 238 +- .../SidePanels/AboutPanelContents.Designer.cs | 566 +-- .../SidePanels/AboutPanelContents.cs | 204 +- .../SidePanels/AboutPanelContents.resx | 238 +- .../SidePanels/GroupSwitchPanel.Designer.cs | 262 +- .../SidePanels/GroupSwitchPanel.cs | 178 +- .../SidePanels/GroupSwitchPanel.resx | 238 +- .../SidePanels/OptionsPanel.Designer.cs | 404 +- .../OnTopReplica}/SidePanels/OptionsPanel.cs | 258 +- .../SidePanels/OptionsPanel.resx | 238 +- .../SidePanels/RegionPanel.Designer.cs | 676 ++-- .../OnTopReplica}/SidePanels/RegionPanel.cs | 640 ++-- .../OnTopReplica}/SidePanels/RegionPanel.resx | 244 +- .../OnTopReplica}/StartupOptions/CliStatus.cs | 42 +- .../CommandLineReportForm.Designer.cs | 230 +- .../StartupOptions/CommandLineReportForm.cs | 60 +- .../StartupOptions/CommandLineReportForm.resx | 3146 ++++++++-------- .../OnTopReplica}/StartupOptions/Factory.cs | 300 +- .../StartupOptions/FourValueTypeConverter.cs | 142 +- .../OnTopReplica}/StartupOptions/Options.cs | 366 +- .../StartupOptions/PaddingConverter.cs | 42 +- .../StartupOptions/RectangleConverter.cs | 46 +- .../StartupOptions/ScreenPositionConverter.cs | 100 +- .../StartupOptions/SizeConverter.cs | 138 +- .../OnTopReplica}/StoredRegion.cs | 64 +- .../OnTopReplica}/StoredRegionArray.cs | 294 +- .../OnTopReplica}/StoredRegionComparer.cs | 56 +- .../OnTopReplica}/Strings.Designer.cs | 3258 ++++++++--------- .../OnTopReplica}/Strings.cs.Designer.cs | 0 .../OnTopReplica}/Strings.cs.resx | 1270 +++---- .../OnTopReplica}/Strings.da.Designer.cs | 0 .../OnTopReplica}/Strings.da.resx | 1270 +++---- .../OnTopReplica}/Strings.de.Designer.cs | 0 .../OnTopReplica}/Strings.de.resx | 1270 +++---- .../OnTopReplica}/Strings.es.Designer.cs | 0 .../OnTopReplica}/Strings.es.resx | 1268 +++---- .../OnTopReplica}/Strings.fi.Designer.cs | 0 .../OnTopReplica}/Strings.fi.resx | 0 .../OnTopReplica}/Strings.it.Designer.cs | 0 .../OnTopReplica}/Strings.it.resx | 1270 +++---- .../OnTopReplica}/Strings.no.Designer.cs | 0 .../OnTopReplica}/Strings.no.resx | 1270 +++---- .../OnTopReplica}/Strings.pl.Designer.cs | 0 .../OnTopReplica}/Strings.pl.resx | 1270 +++---- .../OnTopReplica}/Strings.pt-BR.Designer.cs | 0 .../OnTopReplica}/Strings.pt-BR.resx | 1270 +++---- .../OnTopReplica}/Strings.pt.Designer.cs | 0 .../OnTopReplica}/Strings.pt.resx | 1270 +++---- .../OnTopReplica}/Strings.resx | 1306 +++---- .../OnTopReplica}/Strings.ru.Designer.cs | 0 .../OnTopReplica}/Strings.ru.resx | 1276 +++---- .../OnTopReplica}/Strings.tr.resx | 1272 +++---- .../OnTopReplica}/Strings.zh-Hans.resx | 1270 +++---- .../OnTopReplica}/Strings.zh-TW.Designer.cs | 0 .../OnTopReplica}/Strings.zh-TW.resx | 0 .../OnTopReplica}/Strings.zh.Designer.cs | 0 .../OnTopReplica}/Strings.zh.resx | 0 .../OnTopReplica}/ThumbnailPanel.cs | 996 ++--- .../OnTopReplica}/ThumbnailRegion.cs | 444 +-- .../Update/UpdateCheckCompletedEventArgs.cs | 30 +- .../OnTopReplica}/Update/UpdateInformation.cs | 142 +- .../OnTopReplica}/Update/UpdateManager.cs | 388 +- .../OnTopReplica}/Win32Helper.cs | 252 +- .../OnTopReplica}/WindowHandle.cs | 304 +- .../OnTopReplica}/WindowListMenuManager.cs | 404 +- .../WindowSeekers/BaseWindowSeeker.cs | 136 +- .../WindowSeekers/ByClassWindowSeeker.cs | 82 +- .../WindowSeekers/ByTitleWindowSeeker.cs | 100 +- .../WindowSeekers/IWindowSeeker.cs | 46 +- .../WindowSeekers/PointBasedWindowSeeker.cs | 112 +- .../WindowSeekers/RestoreWindowSeeker.cs | 122 +- .../WindowSeekers/TaskWindowSeeker.cs | 104 +- .../OnTopReplica}/WindowsFormsExtensions.cs | 166 +- {OnTopReplica => src/OnTopReplica}/app.config | 156 +- .../OnTopReplica}/new-flat-icon.ico | Bin .../OnTopReplica}/packages.config | 0 220 files changed, 27071 insertions(+), 28198 deletions(-) delete mode 100644 Lib/WindowsFormsAero.dll delete mode 100644 Lib/WindowsFormsAero.pdb delete mode 100644 Lib/WindowsFormsAero.xml delete mode 100644 OnTopReplica/OnTopReplica.csproj.user create mode 100644 src/.editorconfig rename OnTopReplica.sln => src/OnTopReplica.sln (56%) rename {OnTopReplica => src/OnTopReplica}/AppPaths.cs (97%) rename {OnTopReplica => src/OnTopReplica}/AppStrings.Designer.cs (100%) rename {OnTopReplica => src/OnTopReplica}/AppStrings.resx (97%) rename {OnTopReplica => src/OnTopReplica}/AspectRatioForm.cs (97%) rename {OnTopReplica => src/OnTopReplica}/Assets/25.png (100%) rename {OnTopReplica => src/OnTopReplica}/Assets/arrow_down.png (100%) rename {OnTopReplica => src/OnTopReplica}/Assets/arrow_up.png (100%) rename {OnTopReplica => src/OnTopReplica}/Assets/back.png (100%) rename {OnTopReplica => src/OnTopReplica}/Assets/clickforwarding.png (100%) rename {OnTopReplica => src/OnTopReplica}/Assets/component.png (100%) rename {OnTopReplica => src/OnTopReplica}/Assets/desktop.png (100%) rename {OnTopReplica => src/OnTopReplica}/Assets/empty-window.ico (100%) rename {OnTopReplica => src/OnTopReplica}/Assets/flag_china.png (100%) rename {OnTopReplica => src/OnTopReplica}/Assets/flag_czech.png (100%) rename {OnTopReplica => src/OnTopReplica}/Assets/flag_danish.png (100%) rename {OnTopReplica => src/OnTopReplica}/Assets/flag_germany.png (100%) rename {OnTopReplica => src/OnTopReplica}/Assets/flag_ita.png (100%) rename {OnTopReplica => src/OnTopReplica}/Assets/flag_poland.png (100%) rename {OnTopReplica => src/OnTopReplica}/Assets/flag_spanish.png (100%) rename {OnTopReplica => src/OnTopReplica}/Assets/flag_taiwan.png (100%) rename {OnTopReplica => src/OnTopReplica}/Assets/flag_usa.png (100%) rename {OnTopReplica => src/OnTopReplica}/Assets/flags.pdn (100%) rename {OnTopReplica => src/OnTopReplica}/Assets/fullscreen.png (100%) rename {OnTopReplica => src/OnTopReplica}/Assets/groupmode.png (100%) rename {OnTopReplica => src/OnTopReplica}/Assets/icon-new-red.ico (100%) rename {OnTopReplica => src/OnTopReplica}/Assets/icon-new.ico (100%) rename {OnTopReplica => src/OnTopReplica}/Assets/icon.ico (100%) rename {OnTopReplica => src/OnTopReplica}/Assets/icon.png (100%) rename {OnTopReplica => src/OnTopReplica}/Assets/list.png (100%) rename {OnTopReplica => src/OnTopReplica}/Assets/newicon.png (100%) rename {OnTopReplica => src/OnTopReplica}/Assets/pos_bottomleft.pdn (100%) rename {OnTopReplica => src/OnTopReplica}/Assets/pos_bottomleft.png (100%) rename {OnTopReplica => src/OnTopReplica}/Assets/pos_bottomright.png (100%) rename {OnTopReplica => src/OnTopReplica}/Assets/pos_center.png (100%) rename {OnTopReplica => src/OnTopReplica}/Assets/pos_null.png (100%) rename {OnTopReplica => src/OnTopReplica}/Assets/pos_topleft.png (100%) rename {OnTopReplica => src/OnTopReplica}/Assets/pos_topright.png (100%) rename {OnTopReplica => src/OnTopReplica}/Assets/reduce.png (100%) rename {OnTopReplica => src/OnTopReplica}/Assets/regions.png (100%) rename {OnTopReplica => src/OnTopReplica}/Assets/regions_new.png (100%) rename {OnTopReplica => src/OnTopReplica}/Assets/screenshot-icon.ico (100%) rename {OnTopReplica => src/OnTopReplica}/Assets/window16.png (100%) rename {OnTopReplica => src/OnTopReplica}/Assets/window_border16.png (100%) rename {OnTopReplica => src/OnTopReplica}/Assets/window_multiple.pdn (100%) rename {OnTopReplica => src/OnTopReplica}/Assets/window_multiple16.ico (100%) rename {OnTopReplica => src/OnTopReplica}/Assets/window_multiple16.png (100%) rename {OnTopReplica => src/OnTopReplica}/Assets/window_multiple48.png (100%) rename {OnTopReplica => src/OnTopReplica}/Assets/window_opacity16.png (100%) rename {OnTopReplica => src/OnTopReplica}/Assets/window_opacity_new.png (100%) rename {OnTopReplica => src/OnTopReplica}/Assets/window_switch.pdn (100%) rename {OnTopReplica => src/OnTopReplica}/Assets/window_switch.png (100%) rename {OnTopReplica => src/OnTopReplica}/Assets/windows.png (100%) rename {OnTopReplica => src/OnTopReplica}/Assets/x-oblique.png (100%) rename {OnTopReplica => src/OnTopReplica}/Assets/xiao_add.png (100%) rename {OnTopReplica => src/OnTopReplica}/Assets/xiao_arrow.png (100%) rename {OnTopReplica => src/OnTopReplica}/Assets/xiao_delete.png (100%) rename {OnTopReplica => src/OnTopReplica}/Assets/xiao_down.png (100%) rename {OnTopReplica => src/OnTopReplica}/Assets/xiao_help.png (100%) rename {OnTopReplica => src/OnTopReplica}/Assets/xiao_ok.png (100%) rename {OnTopReplica => src/OnTopReplica}/Assets/xiao_up.png (100%) rename {OnTopReplica => src/OnTopReplica}/Assets/xiao_wrench.png (100%) rename {OnTopReplica => src/OnTopReplica}/CREDITS.txt (97%) rename {OnTopReplica => src/OnTopReplica}/CloneClickEventArgs.cs (96%) rename {OnTopReplica => src/OnTopReplica}/CloseRequestEventArgs.cs (95%) rename {OnTopReplica => src/OnTopReplica}/FocusedTextBox.cs (96%) rename {OnTopReplica => src/OnTopReplica}/FullscreenFormManager.cs (96%) rename {OnTopReplica => src/OnTopReplica}/FullscreenMode.cs (96%) rename {OnTopReplica => src/OnTopReplica}/GeometryExtensions.cs (97%) rename {OnTopReplica => src/OnTopReplica}/HotKeyTextBox.cs (96%) rename {OnTopReplica => src/OnTopReplica}/IMessagePumpProcessor.cs (94%) rename {OnTopReplica => src/OnTopReplica}/ImageComboBox.cs (96%) rename {OnTopReplica => src/OnTopReplica}/LICENSE.txt (98%) rename {OnTopReplica => src/OnTopReplica}/Log.cs (96%) rename {OnTopReplica => src/OnTopReplica}/MainForm.Designer.cs (98%) rename {OnTopReplica => src/OnTopReplica}/MainForm.cs (97%) rename {OnTopReplica => src/OnTopReplica}/MainForm.resx (98%) rename {OnTopReplica => src/OnTopReplica}/MainForm_ChildForms.cs (96%) rename {OnTopReplica => src/OnTopReplica}/MainForm_Features.cs (97%) rename {OnTopReplica => src/OnTopReplica}/MainForm_Gui.cs (97%) rename {OnTopReplica => src/OnTopReplica}/MainForm_MenuEvents.cs (97%) rename {OnTopReplica => src/OnTopReplica}/MessagePumpManager.cs (96%) rename {OnTopReplica => src/OnTopReplica}/MessagePumpProcessors/BaseMessagePumpProcessor.cs (95%) rename {OnTopReplica => src/OnTopReplica}/MessagePumpProcessors/FlashCloner.cs (96%) rename {OnTopReplica => src/OnTopReplica}/MessagePumpProcessors/GroupSwitchManager.cs (96%) rename {OnTopReplica => src/OnTopReplica}/MessagePumpProcessors/HotKeyManager.cs (96%) rename {OnTopReplica => src/OnTopReplica}/MessagePumpProcessors/ShellInterceptProcessor.cs (95%) rename {OnTopReplica => src/OnTopReplica}/MessagePumpProcessors/WindowKeeper.cs (97%) rename {OnTopReplica => src/OnTopReplica}/NDesk/Options/Options.cs (97%) rename {OnTopReplica => src/OnTopReplica}/Native/CommonControls.cs (96%) rename {OnTopReplica => src/OnTopReplica}/Native/ErrorMethods.cs (97%) rename {OnTopReplica => src/OnTopReplica}/Native/FilesystemMethods.cs (97%) rename {OnTopReplica => src/OnTopReplica}/Native/HT.cs (95%) rename {OnTopReplica => src/OnTopReplica}/Native/HookMethods.cs (97%) rename {OnTopReplica => src/OnTopReplica}/Native/HotKeyMethods.cs (97%) rename {OnTopReplica => src/OnTopReplica}/Native/ITaskBarList.cs (97%) rename {OnTopReplica => src/OnTopReplica}/Native/InputMethods.cs (96%) rename {OnTopReplica => src/OnTopReplica}/Native/MK.cs (95%) rename {OnTopReplica => src/OnTopReplica}/Native/MessagingMethods.cs (97%) rename {OnTopReplica => src/OnTopReplica}/Native/Point.cs (95%) rename {OnTopReplica => src/OnTopReplica}/Native/Rectangle.cs (96%) rename {OnTopReplica => src/OnTopReplica}/Native/VirtualKeyState.cs (96%) rename {OnTopReplica => src/OnTopReplica}/Native/WM.cs (97%) rename {OnTopReplica => src/OnTopReplica}/Native/WMSZ.cs (96%) rename {OnTopReplica => src/OnTopReplica}/Native/WindowManagerMethods.cs (97%) rename {OnTopReplica => src/OnTopReplica}/Native/WindowMethods.cs (97%) rename {OnTopReplica => src/OnTopReplica}/Native/WindowsSevenMethods.cs (96%) rename {OnTopReplica => src/OnTopReplica}/NativeToolStripRenderer.cs (97%) rename {OnTopReplica => src/OnTopReplica}/NotificationIcon.cs (96%) rename {OnTopReplica => src/OnTopReplica}/OnTopReplica.csproj (97%) rename {OnTopReplica => src/OnTopReplica}/OnTopReplica.exe.manifest (97%) rename {OnTopReplica => src/OnTopReplica}/PlatformSupport.cs (97%) rename {OnTopReplica => src/OnTopReplica}/Platforms/DebugPlatform.cs (94%) rename {OnTopReplica => src/OnTopReplica}/Platforms/Other.cs (96%) rename {OnTopReplica => src/OnTopReplica}/Platforms/WindowsEight.cs (95%) rename {OnTopReplica => src/OnTopReplica}/Platforms/WindowsSeven.cs (96%) rename {OnTopReplica => src/OnTopReplica}/Platforms/WindowsVista.cs (96%) rename {OnTopReplica => src/OnTopReplica}/Platforms/WindowsXp.cs (96%) rename {OnTopReplica => src/OnTopReplica}/PluginRegionLocator.cs (97%) rename {OnTopReplica => src/OnTopReplica}/Program.cs (97%) rename {OnTopReplica => src/OnTopReplica}/Properties/AssemblyInfo.cs (97%) rename {OnTopReplica => src/OnTopReplica}/Properties/Resources.Designer.cs (97%) rename {OnTopReplica => src/OnTopReplica}/Properties/Resources.resx (98%) rename {OnTopReplica => src/OnTopReplica}/Properties/Settings.Designer.cs (97%) rename {OnTopReplica => src/OnTopReplica}/Properties/Settings.settings (97%) rename {OnTopReplica => src/OnTopReplica}/Properties/app.manifest (97%) rename {OnTopReplica => src/OnTopReplica}/Resources/help.png (100%) rename {OnTopReplica => src/OnTopReplica}/Resources/minimize.png (100%) rename {OnTopReplica => src/OnTopReplica}/Resources/new-flat-icon.ico (100%) rename {OnTopReplica => src/OnTopReplica}/Resources/new-flat-logo-64.png (100%) rename {OnTopReplica => src/OnTopReplica}/ScreenPosition.cs (97%) rename {OnTopReplica => src/OnTopReplica}/Shell.cs (95%) rename {OnTopReplica => src/OnTopReplica}/SidePanel.cs (96%) rename {OnTopReplica => src/OnTopReplica}/SidePanelContainer.Designer.cs (97%) rename {OnTopReplica => src/OnTopReplica}/SidePanelContainer.cs (96%) rename {OnTopReplica => src/OnTopReplica}/SidePanelContainer.resx (97%) rename {OnTopReplica => src/OnTopReplica}/SidePanels/AboutPanel.Designer.cs (97%) rename {OnTopReplica => src/OnTopReplica}/SidePanels/AboutPanel.cs (95%) rename {OnTopReplica => src/OnTopReplica}/SidePanels/AboutPanel.resx (97%) rename {OnTopReplica => src/OnTopReplica}/SidePanels/AboutPanelContents.Designer.cs (98%) rename {OnTopReplica => src/OnTopReplica}/SidePanels/AboutPanelContents.cs (97%) rename {OnTopReplica => src/OnTopReplica}/SidePanels/AboutPanelContents.resx (97%) rename {OnTopReplica => src/OnTopReplica}/SidePanels/GroupSwitchPanel.Designer.cs (98%) rename {OnTopReplica => src/OnTopReplica}/SidePanels/GroupSwitchPanel.cs (96%) rename {OnTopReplica => src/OnTopReplica}/SidePanels/GroupSwitchPanel.resx (97%) rename {OnTopReplica => src/OnTopReplica}/SidePanels/OptionsPanel.Designer.cs (98%) rename {OnTopReplica => src/OnTopReplica}/SidePanels/OptionsPanel.cs (97%) rename {OnTopReplica => src/OnTopReplica}/SidePanels/OptionsPanel.resx (97%) rename {OnTopReplica => src/OnTopReplica}/SidePanels/RegionPanel.Designer.cs (98%) rename {OnTopReplica => src/OnTopReplica}/SidePanels/RegionPanel.cs (96%) rename {OnTopReplica => src/OnTopReplica}/SidePanels/RegionPanel.resx (97%) rename {OnTopReplica => src/OnTopReplica}/StartupOptions/CliStatus.cs (95%) rename {OnTopReplica => src/OnTopReplica}/StartupOptions/CommandLineReportForm.Designer.cs (98%) rename {OnTopReplica => src/OnTopReplica}/StartupOptions/CommandLineReportForm.cs (96%) rename {OnTopReplica => src/OnTopReplica}/StartupOptions/CommandLineReportForm.resx (98%) rename {OnTopReplica => src/OnTopReplica}/StartupOptions/Factory.cs (97%) rename {OnTopReplica => src/OnTopReplica}/StartupOptions/FourValueTypeConverter.cs (97%) rename {OnTopReplica => src/OnTopReplica}/StartupOptions/Options.cs (96%) rename {OnTopReplica => src/OnTopReplica}/StartupOptions/PaddingConverter.cs (96%) rename {OnTopReplica => src/OnTopReplica}/StartupOptions/RectangleConverter.cs (95%) rename {OnTopReplica => src/OnTopReplica}/StartupOptions/ScreenPositionConverter.cs (97%) rename {OnTopReplica => src/OnTopReplica}/StartupOptions/SizeConverter.cs (97%) rename {OnTopReplica => src/OnTopReplica}/StoredRegion.cs (93%) rename {OnTopReplica => src/OnTopReplica}/StoredRegionArray.cs (97%) rename {OnTopReplica => src/OnTopReplica}/StoredRegionComparer.cs (95%) rename {OnTopReplica => src/OnTopReplica}/Strings.Designer.cs (97%) rename {OnTopReplica => src/OnTopReplica}/Strings.cs.Designer.cs (100%) rename {OnTopReplica => src/OnTopReplica}/Strings.cs.resx (97%) rename {OnTopReplica => src/OnTopReplica}/Strings.da.Designer.cs (100%) rename {OnTopReplica => src/OnTopReplica}/Strings.da.resx (97%) rename {OnTopReplica => src/OnTopReplica}/Strings.de.Designer.cs (100%) rename {OnTopReplica => src/OnTopReplica}/Strings.de.resx (97%) rename {OnTopReplica => src/OnTopReplica}/Strings.es.Designer.cs (100%) rename {OnTopReplica => src/OnTopReplica}/Strings.es.resx (97%) rename {OnTopReplica => src/OnTopReplica}/Strings.fi.Designer.cs (100%) rename {OnTopReplica => src/OnTopReplica}/Strings.fi.resx (100%) rename {OnTopReplica => src/OnTopReplica}/Strings.it.Designer.cs (100%) rename {OnTopReplica => src/OnTopReplica}/Strings.it.resx (97%) rename {OnTopReplica => src/OnTopReplica}/Strings.no.Designer.cs (100%) rename {OnTopReplica => src/OnTopReplica}/Strings.no.resx (97%) rename {OnTopReplica => src/OnTopReplica}/Strings.pl.Designer.cs (100%) rename {OnTopReplica => src/OnTopReplica}/Strings.pl.resx (97%) rename {OnTopReplica => src/OnTopReplica}/Strings.pt-BR.Designer.cs (100%) rename {OnTopReplica => src/OnTopReplica}/Strings.pt-BR.resx (97%) rename {OnTopReplica => src/OnTopReplica}/Strings.pt.Designer.cs (100%) rename {OnTopReplica => src/OnTopReplica}/Strings.pt.resx (97%) rename {OnTopReplica => src/OnTopReplica}/Strings.resx (97%) rename {OnTopReplica => src/OnTopReplica}/Strings.ru.Designer.cs (100%) rename {OnTopReplica => src/OnTopReplica}/Strings.ru.resx (98%) rename {OnTopReplica => src/OnTopReplica}/Strings.tr.resx (97%) rename {OnTopReplica => src/OnTopReplica}/Strings.zh-Hans.resx (97%) rename {OnTopReplica => src/OnTopReplica}/Strings.zh-TW.Designer.cs (100%) rename {OnTopReplica => src/OnTopReplica}/Strings.zh-TW.resx (100%) rename {OnTopReplica => src/OnTopReplica}/Strings.zh.Designer.cs (100%) rename {OnTopReplica => src/OnTopReplica}/Strings.zh.resx (100%) rename {OnTopReplica => src/OnTopReplica}/ThumbnailPanel.cs (97%) rename {OnTopReplica => src/OnTopReplica}/ThumbnailRegion.cs (97%) rename {OnTopReplica => src/OnTopReplica}/Update/UpdateCheckCompletedEventArgs.cs (95%) rename {OnTopReplica => src/OnTopReplica}/Update/UpdateInformation.cs (97%) rename {OnTopReplica => src/OnTopReplica}/Update/UpdateManager.cs (97%) rename {OnTopReplica => src/OnTopReplica}/Win32Helper.cs (97%) rename {OnTopReplica => src/OnTopReplica}/WindowHandle.cs (96%) rename {OnTopReplica => src/OnTopReplica}/WindowListMenuManager.cs (97%) rename {OnTopReplica => src/OnTopReplica}/WindowSeekers/BaseWindowSeeker.cs (96%) rename {OnTopReplica => src/OnTopReplica}/WindowSeekers/ByClassWindowSeeker.cs (96%) rename {OnTopReplica => src/OnTopReplica}/WindowSeekers/ByTitleWindowSeeker.cs (96%) rename {OnTopReplica => src/OnTopReplica}/WindowSeekers/IWindowSeeker.cs (95%) rename {OnTopReplica => src/OnTopReplica}/WindowSeekers/PointBasedWindowSeeker.cs (96%) rename {OnTopReplica => src/OnTopReplica}/WindowSeekers/RestoreWindowSeeker.cs (96%) rename {OnTopReplica => src/OnTopReplica}/WindowSeekers/TaskWindowSeeker.cs (97%) rename {OnTopReplica => src/OnTopReplica}/WindowsFormsExtensions.cs (97%) rename {OnTopReplica => src/OnTopReplica}/app.config (97%) rename {OnTopReplica => src/OnTopReplica}/new-flat-icon.ico (100%) rename {OnTopReplica => src/OnTopReplica}/packages.config (100%) diff --git a/.gitignore b/.gitignore index ae2b6c6..1ae0732 100644 --- a/.gitignore +++ b/.gitignore @@ -1,8 +1,8 @@ -.vs/* +**/.vs/* **/bin/* **/obj/* **/publish/* Installer/OnTopReplica-Setup.exe *.user *.suo -packages/ +src/packages/* diff --git a/Lib/WindowsFormsAero.dll b/Lib/WindowsFormsAero.dll deleted file mode 100644 index 3148026148ba2a2d82929e4245e859633fdd706a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 97280 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 diff --git a/Lib/WindowsFormsAero.pdb b/Lib/WindowsFormsAero.pdb deleted file mode 100644 index 15f18562611cf04d66236b390b00a9edebaea946..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 249344 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 diff --git a/Lib/WindowsFormsAero.xml b/Lib/WindowsFormsAero.xml deleted file mode 100644 index 17ac4eb..0000000 --- a/Lib/WindowsFormsAero.xml +++ /dev/null @@ -1,1131 +0,0 @@ - - - - WindowsFormsAero - - - - - Base form class that automatically sets its font according to the Windows UX guidelines. - - - - - Constructs a new Aero styled form. - - - - Common Task Dialog buttons. OK is the default button. - - - Stores a Task Dialog message that will be sent to a dialog in order to update its state. - - - Simple int, int message. - - - Simple int, bool message. - - - Simple bool, bool message. - - - Simple bool, int message. - - - Simple int, long (hi word and lo word) message. - - - Text updating message. - The string will be marshaled: the Message must be correctly disposed after use. - - - Navigation message. - The config structure will be marshaled: must be correctly disposed after use. - - - Text values that can be updated. - - - - Control style and notification constants - - - - Occurs when the split label is clicked. - - - Occurs when the split label is clicked, but before the associated - context menu is displayed by the control. - - - Gets or sets the associated context menu that is displayed when the split - glyph of the button is clicked. - - - Gets or sets the associated context menu that is displayed when the split - glyph of the button is clicked. Exposed for backward compatibility. - - - Provides data for the clicking of split buttons and the opening - of context menus. - - - Represents the bounding box of the clicked button. - A menu should be opened, with top-left coordinates in the left-bottom point of - the rectangle and with width equal (or greater) than the width of the rectangle. - - - Set to true if you want to prevent the menu from opening. - - - Margins structure for the Glass Sheet effect. - - - - Returns whether a point in client coordinates is outside the margins defined by this instance. - - Point in client coordinates. - - - - Gets the margins value as a padding instance. - - - - - - Gets a static readonly 0-pixel margin. - This margin returns true on the IsNull property. - - - - - Gets whether this margin represents a negative measure on each side. - - - Used to specify non-existing margins on glass frames. - - - - - Gets whether this margin measures 0 pixels on each side. - - - - Displays a dialog box that can contain text, icons, buttons, command links, radio buttons and/or a progress bar. - - - Displays a task dialog that has a message. - The text to display. - - - Displays a task dialog that has a message and a title. - The text to display. - The title bar caption of the dialog. - - - Displays a task dialog that has a message, a title and an instruction. - The text to display. - The title bar caption of the dialog. - The instruction shown below the main text. - - - Displays a task dialog that has a message, a title, an instruction and one or more buttons. - The text to display. - The title bar caption of the dialog. - The instruction shown below the main text. - Value that specifies which button or buttons to display. - - - Displays a task dialog that has a message, a title, an instruction, one or more buttons and an icon. - The text to display. - The title bar caption of the dialog. - The instruction shown below the main text. - Value that specifies which button or buttons to display. - The icon to display. - - - Initializes a new Task Dialog instance without text. - - - Initializes a new Task Dialog instance with text. - The main instruction to display. - - - Initializes a new Task Dialog instance with an instruction and a title. - The main instruction to display. - The title of the Task Dialog. - - - Initializes a new Task Dialog instance with an instruction, a title and some content text. - The main instruction to display. - The title of the Task Dialog. - The content text that will be displayes below the main instruction. - - - Initializes a new Task Dialog instance with an instruction, a title, some content text and a specific button. - The main instruction to display. - The title of the Task Dialog. - The content text that will be displayes below the main instruction. - Specifies one or more buttons to be displayed on the bottom of the dialog, instead of the default OK button. - - - Initializes a new Task Dialog instance with an instruction, a title, some content text, a specific button and an icon. - The main instruction to display. - The title of the Task Dialog. - The content text that will be displayes below the main instruction. - Specifies one or more buttons to be displayed on the bottom of the dialog, instead of the default OK button. - The icon to display. - - - Injects a virtual button click. - Numeric id of the clicked button. - - - Injects a virtual radio button click. - Numeric id of the clicked radio button. - - - Injects a virtual checkbox click. - New state of the verification checkbox. - Sets whether the checkbox should have focus after state change. - - - Enables or disables a button of the dialog. - Id of the button whose state will be changed. - New state of the button. - - - Enables or disables a radio button of the dialog. - Id of the radio button whose state will be changed. - New state of the button. - - - Creates a new Task Dialog setup and replaces the existing one. Note that the window will not be - destroyed and that you should keep the existing TaskDialog reference (event handlers will still be - registered). The existing Task Dialog will simply reset and use the options of the new one. - An instance of Task Dialog, whose settings will be copied into the existing dialog. - You may safely destroy the nextDialog instance after use (do not register to events on it). - - - Adds or removes an UAC Shield icon from a button. - Id of the button. - Sets whether to display a Shield icon or not. - - - Sets whether the dialog's progress bar should be in standard or in marquee mode. - True if the progress bar should be displayed in marquee mode (no explicit progress). - - - Sets whether the dialog's progress bar should be in standard or in marquee mode and sets its marquee speed. - True if the progress bar should be displayed in marquee mode (no explicit progress). - Speed of the progress bar in marquee mode. - - - Common native callback for Task Dialogs. Will route events to the user event handler. - TODO: Currently unused, would need complex marshaling of data. - - - Prepares the internal configuration structure. - Allocates some unmanaged memory, must always be followed by a PostConfig() call. - - - Frees the unmanages memory allocated by PreConfig(). - - - Displays the task dialog without an explicit parent. - - - Displays the task dialog with an explicit parent window. - Handle to the dialog's parent window. - - - Displays the task dialog with an explicit parent form. - Instance of the dialog's parent form. - - - Is true if the task dialog is currently displayed. - - - Gets or sets the title of the dialog. - - - Gets or sets the icon of the dialog, from a set of common icons. - - - Gets or sets the icon of the dialog, from a custom Icon instance. - - - Gets or sets the dialog's buttons, from one or more common button types. - - - Gets or sets a set of custom buttons which will be displayed on the dialog. - These buttons can also be shown as Command Links optionally. - - - Gets or sets the integer identificator of the dialog's default button. - - - Gets or sets a set of custom buttons which will be displayed as radio buttons. - - - Gets or sets the identificator of the enabled radio button by default. - - - Gets or sets the text that will be shown next to a verification checkbox. - - - Gets or sets the text displayed on the control that enables the user to expand and collapse the dialog, - when the dialog is in expanded mode. - - - Gets or sets the text displayed on the control that enables the user to expand and collapse the dialog, - when the dialog is in collapsed mode. - - - Gets or sets the icon shown in the dialog's footer, from a set of common icons. - - - Gets or sets the icon shown in the dialog's footer, from a custom Icon instance. - - - Explicitly sets the desiderd width in pixels of the dialog. - Will be set automatically by the task dialog to an optimal size. - - - Gets or Sets the Main Instruction text of the TaskDialog. - Text written in blue and slightly bigger font in Windows Aero. - - - Gets or sets the Content text of the TaskDialog. - Text written with standard font, right below the Main instruction. - - - Gets or Sets the expanded information text, that will be optionally shown - by clicking on the Expand control. - - - Gets or Sets the Footer text. - - - Gets or sets the current Progress bar value. - - - Gets of sets the minimum value allowed by the Progress bar. - - - Gets or sets the maximum value allowed by the Progress bar. - - - Gets or sets the current Progress bar state. - Determines the bar's color and behavior. - - - Enables or disables Hyperlinks in the content (in the form of <A HREF="link">). - - - Gets or sets whether the dialog can be cancelled (ESC, ALT+F4 and X button) even if no Cancel button has been specified. - - - Gets or sets whether Command Link buttons should be used instead of standard custom buttons (doesn't apply to custom buttons, like OK or Cancel). - - - Gets or sets whether Command Link buttons wihtout icon should be used instead of standard custom buttons (doesn't apply to custom buttons, like OK or Cancel). - - - Gets or sets whether the ExpandedInformation should be shown in the Footer area (instead of under the Content text). - - - Gets or sets whether the ExpandedInformation is visible on dialog creation. - - - Gets or sets whether the Verification checkbox should be checked when the dialog is shown. - - - Gets or sets whether a progress bar should be displayed on the dialog. - - - Sets or gets whether the user specified callback (if any) should be called every 200ms. - - - Gets or sets whether the dialog should be positioned centered on the parent window. - - - Enables or disables right to left reading order. - - - Gets or sets whether there should be a selected radio button by default when the dialog is shown. - - - Gets or sets whether the dialog may be minimized or not. - - - Occurs when the Task Dialog is first created and before it is displayed (is sent after Construction event). - - - Occurs when the user clicks a button or a command link. By default the Dialog is closed after the notification. - - - Occurs when the user clicks on a Hyperlink in the Content text. - - - Occurs when a navigation event is raised. - - - Occurs approximately every 200ms if the Task Dialog callback timer is enabled. - - - Occurs when the Task Dialog is destroyed and the handle to the dialog is not valid anymore. - - - Occurs when the user selects a radio button. - - - Occurs when the Task Dialog is constructed and before it is displayed (is sent before Creation event). - - - Occurs when the user switches the state of the Verification Checkbox. - - - Occurs when the user presses F1 when the Task Dialog has focus. - - - Occurs when the user clicks on the expand button of the dialog, before the dialog is expanded. - - - A standard WinForms text box presenting the common Vista "search" interface. - Reacts on user input by raising "SearchStarted" events. - - - - Clean up any resources being used. - - true if managed resources should be disposed; otherwise, false. - - - - Required method for Designer support - do not modify - the contents of this method with the code editor. - - - - Puts the focus on the text box and moves the caret to the end of the text, without selecting it. - - - - Raised when the Text of the search box has changed. - - - - - Raised after an interval after the last user input. - - - - - Raised when the user clicks on the X to cancel the search. - - - - Gets or sets the background Color of the button when the mouse hovers on it. - - - Gets or sets the ForeColor of the control when the search box is active. - - - Gets or sets the BackColor of the control when the search box is active. - - - Gets or sets the ForeColor of the control when the search box is inactive. - - - Gets or sets the BackColor of the control when the search box is inactive. - - - Temporary ForeColor property of the control. You should use InactiveForeColor and ActiveForeColor instead. - - - Temporary BackColor property of the control. You should use InactiveBackColor and ActiveBackColor instead. - - - Gets or sets the text that is shown on top of the text box when the user hasn't entered any text. - - - Gets or sets the font used in the search text box. - Equals to the Font property. - - - Gets or sets the font used to write the "inactivity label" on top of the control when the user hasn't entered any text. - - - - Overall Font property of the control. - Property changes are forwarded to the ActiveFont and InactiveFont property. - - - - Returns true if the user entered some text in the search textbox. - - - - Gets or sets the delay in milliseconds between when the text is edited - and the search event is raised. - - - - - Gets or sets whether the control raises a SearchStarted event after user input. - - - - - Gets or sets whether the control raises a SearchStarted event when the user hits the Enter key. - - - - - A strongly-typed resource class, for looking up localized strings, etc. - - - - - Returns the cached ResourceManager instance used by this class. - - - - - Overrides the current thread's CurrentUICulture property for all - resource lookups using this strongly typed resource class. - - - - Represents a custom button shown on a Task Dialog. - - - Instantiates a new custom button with an ID and a text. - Unique ID that will be returned by the Task Dialog if the button is clicked. - Use values greater than 8 to prevent conflicts with common buttons. - Text label shown on the button. If you enable Command Links, a newline here - separates the upper from the lower string on the button. - - - Instantiates a new custom button with an ID and a text. - Common ID that will be returned by the Task Dialog if the button is clicked. - Text label shown on the button. If you enable Command Links, a newline here - separates the upper from the lower string on the button. - - - Unique ID that will be returned by the Task Dialog if the button is clicked. - - - Text label shown on the button. If you enable Command Links, a newline here - separates the upper from the lower string on the button. - - - - A Label containing some text that will be drawn with glowing border on top of the Glass Sheet effect. - - - - Size of the glow effect around the text. - - - Enables or disables the glow effect around the text. - - - Shadow type. - - - Gets or sets the horizontal text alignment setting. - - - Gets or sets the vertical text alignment setting. - - - Gets or sets whether the text will be laid out on a single line or on multiple lines. - - - Gets or sets whether the text lines over the label's border should be trimmed with an ellipsis. - - - Gets or sets whether the text should break only at the end of a word. - - - Gets or sets whether the text should be trimmed to the last word and an ellipse should be placed at the end of the line. - - - - A horizontal panel which resembles what is used for information and navigation in the Control Panel of Windows 7 and Vista. - - - This control is meant to be used on the left hand side of a form, it creates a graphic border on the right hand side. Also - I have VB code for this control if anyone needs it, just send me an e-mail at bpell@indiana.edu or blakepell@hotmail.com. - - - - - Constructor - - - We are by default setting the background color to Color.Transparent. The reason for this is that a lot of controls that will - be used with this, namingly the Label and LinkLabel default their back color to the color of the panel and for those controls - to display properly on this panel, their BackColor will need to be Color.Transparent (otherwise, they'll display as a black - box). This should help to isolate the developer from having to research this. - - To reduce flicker, especially when glass is enabled, I had to set all three of the below styles. - - - - - - When a control is added, we will check the type and if it meets certain criteria will change some default behaviors of - the control so that it fits our theme by default. The developer can still change this as they desire after it's added. - - - - - - The actual painting of the background of our control. - - - - The colors in use here were extracted from an image of the Control Panel taken from a Windows 7 RC1 installation. - - - - - This procedure will redraw any control, given it's handl as an image on the form. This is necessary if you want to lay this - control on top of the glass surface of an Aero form. - - - - - - Handles incoming Windows Messages. - - - - On the paint event and if the RenderOnGlass is set to true, we will redraw the control as an image directly on - the form. This has a little extra overhead but also provides the ability to lay this control directly on the - glass and have it rendered correctly. - - - - - Whether or not the control needs to be rendered on the Glass surface. - - - This is false by default, it should only be toggled to true if the control needs to lay directly on - the glass surface of the form. - - - - - Adds a handler on the Form that enables the user to move the window around - by clicking on a glass margin (or the title bar, as usual). - - The form that will be controlled. - Margins of the glass sheet. - - Eventual UI elements on the glass sheet will prevent the handler from receiving events - (except the ThemeText control, which manually redirects mouse events to the form). - - - - - Adds a handler on the Form that automatically paints the glass background black - - The form that will be controlled. - Margins of the glass sheet. - - - - - - - Handler will be kept alive by the event references on the form. - As soon as the form is disposed, the handler will be disposed as well. - - - - - - - - Handler will be kept alive by the event references on the form. - As soon as the form is disposed, the handler will be disposed as well. - - - - - The labeled divider provides a Aero styled divider with an optional caption, - similiar to what is seen in the Control Panel dialogs of Windows 7 and Vista. - - - - - Constructor - - - - - The actual painting of the background of our control. - - - - The colors in use here were extracted from an image of the Control Panel taken from a Windows 7 RC1 installation. - - - - - The position of the divider line. - - - The default value is the center position which is consistent on how this type of divider has been used throughout the Windows - 7 and Vista UI's. - - - - - The color of the divider line. - - - - - The text that should be used for the caption. If the caption is set to blank and the divider position is set to center then - a simple divider line will be drawn. - - - After a change is made to the text property we want to invalidate the control so it triggers a new paint message being sent. - - - - - The positions that the divider line can be drawn in - - - - - The divider will be centered after the text caption and will begin drawing after the string. This is the default behavior. - - - - - The divider will be drawn below the text caption. - - - - - A vertical panel which resembles what is used for information and navigation in the Control Panel of Windows 7 and Vista. - - - This control is meant to be used on the left hand side of a form, it creates a graphic border on the right hand side. Also - I have VB code for this control if anyone needs it, just send me an e-mail at bpell@indiana.edu or blakepell@hotmail.com. - - - - - Constructor - - - We are by default setting the background color to Color.Transparent. The reason for this is that a lot of controls that will - be used with this, namingly the Label and LinkLabel default their back color to the color of the panel and for those controls - to display properly on this panel, their BackColor will need to be Color.Transparent (otherwise, they'll display as a black - box). This should help to isolate the developer from having to research this. - - To reduce flicker, especially when glass is enabled, I had to set all three of the below styles. - - - - - - When a control is added, we will check the type and if it meets certain criteria will change some default behaviors of - the control so that it fits our theme by default. The developer can still change this as they desire after it's added. - - - - - - The actual painting of the background of our control. - - - - The colors in use here were extracted from an image of the Control Panel taken from a Windows 7 RC1 installation. - - - - - This procedure will redraw any control, given it's handl as an image on the form. This is necessary if you want to lay this - control on top of the glass surface of an Aero form. - - - - - - Handles incoming Windows Messages. - - - - On the paint event and if the RenderOnGlass is set to true, we will redraw the control as an image directly on - the form. This has a little extra overhead but also provides the ability to lay this control directly on the - glass and have it rendered correctly. - - - - - Whether or not the control needs to be rendered on the Glass surface. - - - This is false by default, it should only be toggled to true if the control needs to lay directly on - the glass surface of the form. - - - - Handle to a DWM Thumbnail. - - - Updates the thumbnail's display settings. - Drawing region on destination window. - Origin region from source window. - Opacity. 0 is transparent, 255 opaque. - Visibility flag. - If true, only the client area of the window will be rendered. Otherwise, the borders will be be rendered as well. - - - Updates the thumbnail's display settings. - Drawing region on destination window. - Opacity. 0 is transparent, 255 opaque. - Visibility flag. - If true, only the client area of the window will be rendered. Otherwise, the borders will be be rendered as well. - - - Returns true if the handle is valid, false if the handle has been closed or hasn't been initialized. - - - Sets the thumbnail opacity value, from 0 to 255 (opaque). - - - Sets whether only the client area of the thumbnailed window should be shown or - the entire window area. - - - Area in the destination window on which the thumbnail should be drawn. - - - Region of the source window that should be drawn. - - - Sets whether the thumbnail should be drawn or not. - - - Gets the thumbnail's original size. - - - Main DWM class, provides Thumbnail registration, glass sheet effect and blur behind. - - - Registers a thumbnail to be drawn on a Windows Form. - The thumbnail will not be drawn until you update the thumbnail's properties calling Update(). - The Windows Form instance on which to draw the thumbnail. - The handle (HWND) of the window that has to be drawn. - A Thumbnail instance, needed to unregister and to update properties. - - - Registers a thumbnail to be drawn on a window. - The thumbnail will not be drawn until you update the thumbnail's properties calling Update(). - The handle (HWND) of the window on which the thumbnail will be drawn. - The handle (HWND) of the window that has to be drawn. - A Thumbnail instance, needed to unregister and to update properties. - - - Unregisters the thumbnail handle. - The handle is unvalid after the call and should not be used again. - A handle to a registered thumbnail. - - - Enable the Aero "Blur Behind" effect on the whole client area. Background must be black. - - - Enable the Aero "Blur Behind" effect on the whole client area. Background must be black. - - - - Enable the Aero "Blur Behind" effect on a specific region. Background of the region must be black. - - - Disables the Aero "Blur Behind" effect. - - - Extends the Aero "Glass Frame" into the client area. Background must be black. - - - Extends the Aero "Glass Frame" into the client area. Background must be black. - - - Extends the Aero "Glass Frame" to the whole client area ("Glass Sheet" effect). Background must be black. - - - Extends the Aero "Glass Frame" to the whole client area ("Glass Sheet" effect). Background must be black. - - - Disables the Aero "Glass Frame". - - - Disables the Aero "Glass Frame". - - - - Sets a window's Flip 3D policy. - - Form whose policy is to be set. - Desired Flip 3D policy. - Is ignored on OSs that do not support Aero. - - - - Disallows Aero Peek on a window (or allows it). - - Form whose Aero Peek preview should be disabled. - True if Aero Peek should be disabled for the window. - Is ignored on OSs that do not support Aero Peek. - - - - Sets a window's state in order to exclude (or include) it in Aero Peek. - - Form whose Aero Peek exclusion state is to be set. - Set to true to exlude the window from Aero Peek. - Is ignored on OSs that do not support Aero Peek. - - - - Sets a window's state in order to exclude (or include) it in Aero Peek. - - Form whose Aero Peek exclusion state is to be set. - Set to true to exlude the window from Aero Peek. - Is ignored on OSs that do not support Aero Peek. - - - Returns the active windows on the current thread. - - - Sets the origin of the thumbnail and shows the thumbnail on the control. - The Form instance that will be thumbnailed. - True if the control should automatically update itself in case the thumbnailed - form changes size or is closed. - - - Forces and update of the thumbnail. - Use this method if you know that the thumbnailed window has been resized and the thumbnail control should react to these changes. - - - - Static class providing information about the current support for Vista-only features. - - - - - Gets whether the running operating system is Windows Vista or a more recent version. - - - - - Gets whether the running operating system is Windows Seven or a more recent version. - - - - - Gets whether the running operating system is Windows 8 or a more recent version. - - - - Is true if the DWM composition engine is currently enabled. - - - - Form that automatically handles glass margins and mouse dragging. - - - - - Construct a new form without glass margins. - - - - Gets or sets the glass margins of the form. - This property should be used when setting the margins from code. - - - Gets or sets the glass margins of the form. - This property should be used when setting the margins through the designer. - - - Gets or sets whether mouse dragging should be handled automatically. - - - Gets or sets whether the extended glass margin is enabled or not. - - - - Gets or sets whether the window title and icon should be hidden. - - - The window caption will still be visible, but title text and icon will not be. - A form with a hidden title will look like an Explorer window on Windows Vista or Windows 7. - - - - - Gets or sets whether the window caption should be hidden altogether. - - - Should be set before handle creation. - - - - - Applies a glow on the themed text. - - - - - Default glow size. - - - - - Glow size used commonly by Office 2007 in titles. - - - - - Precise glow effect. - - - - - Instantiates a new glow effect for themed text. - - Size of the glow effect. - - - - Gets or sets the size of the glow effect. - - - - Direct Task Dialog call. - - - Indirect Task Dialog call. Allows complex dialogs with interaction logic (via callback). - - - The Task Dialog config structure. - - - Flags used in TaskDialogConfig struct. - From CommCtrl.h. - - - Notifications returned by Task Dialogs to the callback. - From CommCtrl.h. - - - Messages that can be sent to Task Dialogs. - From CommCtrl.h. - - - - Determines a window's Flip 3D policy. - - - - - Default Flip 3D behavior. - - - - - Excludes the window from Flip 3D and hides it behind the animation. - - - - - Excludes the window from Flip 3D and shows it above the animation. - - - - Common Task Dialog icons. Determine the look of the main instruction. - - - Class that aggregates the results of an "indirect" Task Dialog. - - - Results returned by Task Dialogs when closed by the user. - - - - A strongly-typed resource class, for looking up localized strings, etc. - - - - - Returns the cached ResourceManager instance used by this class. - - - - - Overrides the current thread's CurrentUICulture property for all - resource lookups using this strongly typed resource class. - - - - - Looks up a localized string similar to Common Controls library version 6.0 not loaded. Must run on Vista and must provide a manifest.. - - - - - Looks up a localized string similar to Desktop composition is not enabled.. - - - - - Looks up a localized string similar to Desktop composition is not supported by operating system.. - - - - - Looks up a localized string similar to Unable to get thumbnail's original size.. - - - - - Looks up a localized string similar to Unable to update thumbnail properties.. - - - - - Looks up a localized string similar to Source and target windows cannot be the same.. - - - - - Looks up a localized string similar to Native call to {0} failed.. - - - - - Looks up a localized string similar to Failed to create TaskDialog.. - - - - Gets or sets the cue text that is displayed on the TextBox control. - - - Gets or sets whether the Cue text should be displyed even when the control has keybord focus. - If true, the Cue text will disappear as soon as the user starts typing. - - - diff --git a/OnTopReplica/OnTopReplica.csproj.user b/OnTopReplica/OnTopReplica.csproj.user deleted file mode 100644 index 4b61895..0000000 --- a/OnTopReplica/OnTopReplica.csproj.user +++ /dev/null @@ -1,23 +0,0 @@ - - - - publish\ - http://www.klopfenstein.net/public/Uploads/ontopreplica/|http://www.klopfenstein.net/download.aspx%3ffile=ontopreplica%252fsetup.exe/|http://www.klopfenstein.net/lorenz/programming/ontopreplica/|http://www.klopfenstein.net/lorenz/programming/|http://lorenz.klopfenstein.net/ - http://www.klopfenstein.net/lorenz.aspx/ontopreplica|http://www.klopfenstein.net/loader.php%3fsection=lorenz&page=on_top_replica|http://www.klopfenstein.net/loader.php%3fsection=lorenz&page=programming_on_top_replica - http://www.klopfenstein.net/public/Uploads/ontopreplica/|http://www.klopfenstein.net/lorenz/programming/ontopreplica/ - - - en-US - false - - - ProjectFiles - - - false - - - - - - \ No newline at end of file diff --git a/src/.editorconfig b/src/.editorconfig new file mode 100644 index 0000000..9b0f6ae --- /dev/null +++ b/src/.editorconfig @@ -0,0 +1,33 @@ +root = true + +[*] +insert_final_newline = true +trim_trailing_whitespace = true + +[*.cs] +indent_style = space +indent_size = tab +tab_size = 4 + +dotnet_style_predefined_type_for_locals_parameters_members = true +dotnet_style_predefined_type_for_member_access = true + +csharp_style_inlined_variable_declaration = true +csharp_style_conditional_delegate_call = true +csharp_prefer_braces = true + +dotnet_sort_system_directives_first = true + +csharp_new_line_before_open_brace = false +csharp_new_line_before_else = true +csharp_new_line_before_catch = true +csharp_new_line_before_finally = true +csharp_new_line_before_members_in_object_initializers = false +csharp_indent_case_contents = true +csharp_indent_switch_labels = true + +csharp_space_after_cast = false +csharp_space_after_keywords_in_control_flow_statements = false +csharp_space_between_method_declaration_parameter_list_parentheses = false +csharp_space_between_method_call_parameter_list_parentheses = false +csharp_preserve_single_line_blocks = true diff --git a/OnTopReplica.sln b/src/OnTopReplica.sln similarity index 56% rename from OnTopReplica.sln rename to src/OnTopReplica.sln index 2db74a9..16c995c 100644 --- a/OnTopReplica.sln +++ b/src/OnTopReplica.sln @@ -1,55 +1,49 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 15 -VisualStudioVersion = 15.0.27004.2008 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OnTopReplica", "OnTopReplica\OnTopReplica.csproj", "{E626BD6E-BF38-4EB7-A128-5CA6F40EF557}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Debug|x64 = Debug|x64 - Debug|x86 = Debug|x86 - Release|Any CPU = Release|Any CPU - Release|x64 = Release|x64 - Release|x86 = Release|x86 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {E626BD6E-BF38-4EB7-A128-5CA6F40EF557}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {E626BD6E-BF38-4EB7-A128-5CA6F40EF557}.Debug|Any CPU.Build.0 = Debug|Any CPU - {E626BD6E-BF38-4EB7-A128-5CA6F40EF557}.Debug|x64.ActiveCfg = Debug|Any CPU - {E626BD6E-BF38-4EB7-A128-5CA6F40EF557}.Debug|x64.Build.0 = Debug|Any CPU - {E626BD6E-BF38-4EB7-A128-5CA6F40EF557}.Debug|x86.ActiveCfg = Debug|Any CPU - {E626BD6E-BF38-4EB7-A128-5CA6F40EF557}.Debug|x86.Build.0 = Debug|Any CPU - {E626BD6E-BF38-4EB7-A128-5CA6F40EF557}.Release|Any CPU.ActiveCfg = Release|Any CPU - {E626BD6E-BF38-4EB7-A128-5CA6F40EF557}.Release|Any CPU.Build.0 = Release|Any CPU - {E626BD6E-BF38-4EB7-A128-5CA6F40EF557}.Release|x64.ActiveCfg = Release|Any CPU - {E626BD6E-BF38-4EB7-A128-5CA6F40EF557}.Release|x64.Build.0 = Release|Any CPU - {E626BD6E-BF38-4EB7-A128-5CA6F40EF557}.Release|x86.ActiveCfg = Release|Any CPU - {E626BD6E-BF38-4EB7-A128-5CA6F40EF557}.Release|x86.Build.0 = Release|Any CPU - {01391A7F-A9A1-4C90-89EB-29E0C98BF9BE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {01391A7F-A9A1-4C90-89EB-29E0C98BF9BE}.Debug|Any CPU.Build.0 = Debug|Any CPU - {01391A7F-A9A1-4C90-89EB-29E0C98BF9BE}.Debug|Any CPU.Deploy.0 = Debug|Any CPU - {01391A7F-A9A1-4C90-89EB-29E0C98BF9BE}.Debug|x64.ActiveCfg = Debug|x64 - {01391A7F-A9A1-4C90-89EB-29E0C98BF9BE}.Debug|x64.Build.0 = Debug|x64 - {01391A7F-A9A1-4C90-89EB-29E0C98BF9BE}.Debug|x64.Deploy.0 = Debug|x64 - {01391A7F-A9A1-4C90-89EB-29E0C98BF9BE}.Debug|x86.ActiveCfg = Debug|x86 - {01391A7F-A9A1-4C90-89EB-29E0C98BF9BE}.Debug|x86.Build.0 = Debug|x86 - {01391A7F-A9A1-4C90-89EB-29E0C98BF9BE}.Debug|x86.Deploy.0 = Debug|x86 - {01391A7F-A9A1-4C90-89EB-29E0C98BF9BE}.Release|Any CPU.ActiveCfg = Release|Any CPU - {01391A7F-A9A1-4C90-89EB-29E0C98BF9BE}.Release|Any CPU.Build.0 = Release|Any CPU - {01391A7F-A9A1-4C90-89EB-29E0C98BF9BE}.Release|Any CPU.Deploy.0 = Release|Any CPU - {01391A7F-A9A1-4C90-89EB-29E0C98BF9BE}.Release|x64.ActiveCfg = Release|x64 - {01391A7F-A9A1-4C90-89EB-29E0C98BF9BE}.Release|x64.Build.0 = Release|x64 - {01391A7F-A9A1-4C90-89EB-29E0C98BF9BE}.Release|x64.Deploy.0 = Release|x64 - {01391A7F-A9A1-4C90-89EB-29E0C98BF9BE}.Release|x86.ActiveCfg = Release|x86 - {01391A7F-A9A1-4C90-89EB-29E0C98BF9BE}.Release|x86.Build.0 = Release|x86 - {01391A7F-A9A1-4C90-89EB-29E0C98BF9BE}.Release|x86.Deploy.0 = Release|x86 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - SolutionGuid = {3F135F78-F70E-4127-BA77-6C262C7CCCEF} - EndGlobalSection -EndGlobal + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 15 +VisualStudioVersion = 15.0.27004.2008 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OnTopReplica", "OnTopReplica\OnTopReplica.csproj", "{E626BD6E-BF38-4EB7-A128-5CA6F40EF557}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Debug|x64 = Debug|x64 + Debug|x86 = Debug|x86 + Release|Any CPU = Release|Any CPU + Release|x64 = Release|x64 + Release|x86 = Release|x86 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {E626BD6E-BF38-4EB7-A128-5CA6F40EF557}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E626BD6E-BF38-4EB7-A128-5CA6F40EF557}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E626BD6E-BF38-4EB7-A128-5CA6F40EF557}.Debug|x64.ActiveCfg = Debug|Any CPU + {E626BD6E-BF38-4EB7-A128-5CA6F40EF557}.Debug|x64.Build.0 = Debug|Any CPU + {E626BD6E-BF38-4EB7-A128-5CA6F40EF557}.Debug|x86.ActiveCfg = Debug|Any CPU + {E626BD6E-BF38-4EB7-A128-5CA6F40EF557}.Debug|x86.Build.0 = Debug|Any CPU + {E626BD6E-BF38-4EB7-A128-5CA6F40EF557}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E626BD6E-BF38-4EB7-A128-5CA6F40EF557}.Release|Any CPU.Build.0 = Release|Any CPU + {E626BD6E-BF38-4EB7-A128-5CA6F40EF557}.Release|x64.ActiveCfg = Release|Any CPU + {E626BD6E-BF38-4EB7-A128-5CA6F40EF557}.Release|x64.Build.0 = Release|Any CPU + {E626BD6E-BF38-4EB7-A128-5CA6F40EF557}.Release|x86.ActiveCfg = Release|Any CPU + {E626BD6E-BF38-4EB7-A128-5CA6F40EF557}.Release|x86.Build.0 = Release|Any CPU + {EA7C9C89-0CCF-41E3-A379-D593AAF7A941}.Debug|Any CPU.ActiveCfg = Debug + {EA7C9C89-0CCF-41E3-A379-D593AAF7A941}.Debug|Any CPU.Build.0 = Debug + {EA7C9C89-0CCF-41E3-A379-D593AAF7A941}.Debug|x64.ActiveCfg = Debug + {EA7C9C89-0CCF-41E3-A379-D593AAF7A941}.Debug|x64.Build.0 = Debug + {EA7C9C89-0CCF-41E3-A379-D593AAF7A941}.Debug|x86.ActiveCfg = Debug + {EA7C9C89-0CCF-41E3-A379-D593AAF7A941}.Debug|x86.Build.0 = Debug + {EA7C9C89-0CCF-41E3-A379-D593AAF7A941}.Release|Any CPU.ActiveCfg = Release + {EA7C9C89-0CCF-41E3-A379-D593AAF7A941}.Release|Any CPU.Build.0 = Release + {EA7C9C89-0CCF-41E3-A379-D593AAF7A941}.Release|x64.ActiveCfg = Release + {EA7C9C89-0CCF-41E3-A379-D593AAF7A941}.Release|x64.Build.0 = Release + {EA7C9C89-0CCF-41E3-A379-D593AAF7A941}.Release|x86.ActiveCfg = Release + {EA7C9C89-0CCF-41E3-A379-D593AAF7A941}.Release|x86.Build.0 = Release + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {3F135F78-F70E-4127-BA77-6C262C7CCCEF} + EndGlobalSection +EndGlobal diff --git a/OnTopReplica/AppPaths.cs b/src/OnTopReplica/AppPaths.cs similarity index 97% rename from OnTopReplica/AppPaths.cs rename to src/OnTopReplica/AppPaths.cs index cea16b5..9cac05a 100644 --- a/OnTopReplica/AppPaths.cs +++ b/src/OnTopReplica/AppPaths.cs @@ -1,34 +1,34 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Text; - -namespace OnTopReplica { - public static class AppPaths { - - const string AppDataFolder = "OnTopReplica"; - - public static void SetupPaths() { - var roamingAppData = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData); - var roamingAppDataApplicationPath = Path.Combine(roamingAppData, AppDataFolder); - - if (!Directory.Exists(roamingAppDataApplicationPath)) { - Directory.CreateDirectory(roamingAppDataApplicationPath); - } - PrivateRoamingFolderPath = roamingAppDataApplicationPath; - } - - public static string PrivateRoamingFolderPath { get; private set; } - - public static string GenerateCrashDumpPath() { - var now = DateTime.Now; - - string dump = string.Format("OnTopReplica-dump-{0}{1}{2}-{3}{4}.txt", - now.Year, now.Month, now.Day, - now.Hour, now.Minute); - - return Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory), dump); - } - } -} +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; + +namespace OnTopReplica { + public static class AppPaths { + + const string AppDataFolder = "OnTopReplica"; + + public static void SetupPaths() { + var roamingAppData = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData); + var roamingAppDataApplicationPath = Path.Combine(roamingAppData, AppDataFolder); + + if (!Directory.Exists(roamingAppDataApplicationPath)) { + Directory.CreateDirectory(roamingAppDataApplicationPath); + } + PrivateRoamingFolderPath = roamingAppDataApplicationPath; + } + + public static string PrivateRoamingFolderPath { get; private set; } + + public static string GenerateCrashDumpPath() { + var now = DateTime.Now; + + string dump = string.Format("OnTopReplica-dump-{0}{1}{2}-{3}{4}.txt", + now.Year, now.Month, now.Day, + now.Hour, now.Minute); + + return Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory), dump); + } + } +} diff --git a/OnTopReplica/AppStrings.Designer.cs b/src/OnTopReplica/AppStrings.Designer.cs similarity index 100% rename from OnTopReplica/AppStrings.Designer.cs rename to src/OnTopReplica/AppStrings.Designer.cs diff --git a/OnTopReplica/AppStrings.resx b/src/OnTopReplica/AppStrings.resx similarity index 97% rename from OnTopReplica/AppStrings.resx rename to src/OnTopReplica/AppStrings.resx index 376870a..e9173fd 100644 --- a/OnTopReplica/AppStrings.resx +++ b/src/OnTopReplica/AppStrings.resx @@ -1,135 +1,135 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 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 - - - http://ontopreplica.codeplex.com - - - http://lorenz.klopfenstein.net - - - http://ontopreplica.codeplex.com/SourceControl/list/changesets - - - http://opensource.org/licenses/ms-rl.html - - - http://ontopreplica.codeplex.com/project/feeds/rss?ProjectRSSFeed=codeplex%3a%2f%2frelease%2fontopreplica - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + http://ontopreplica.codeplex.com + + + http://lorenz.klopfenstein.net + + + http://ontopreplica.codeplex.com/SourceControl/list/changesets + + + http://opensource.org/licenses/ms-rl.html + + + http://ontopreplica.codeplex.com/project/feeds/rss?ProjectRSSFeed=codeplex%3a%2f%2frelease%2fontopreplica + \ No newline at end of file diff --git a/OnTopReplica/AspectRatioForm.cs b/src/OnTopReplica/AspectRatioForm.cs similarity index 97% rename from OnTopReplica/AspectRatioForm.cs rename to src/OnTopReplica/AspectRatioForm.cs index 4a22c3c..ad88a87 100644 --- a/OnTopReplica/AspectRatioForm.cs +++ b/src/OnTopReplica/AspectRatioForm.cs @@ -1,266 +1,266 @@ -using System; -using System.ComponentModel; -using System.Drawing; -using System.Runtime.InteropServices; -using System.Windows.Forms; -using OnTopReplica.Native; - -namespace OnTopReplica { - - /// - /// Form that automatically keeps a certain aspect ratio and resizes without flickering. - /// - public class AspectRatioForm : WindowsFormsAero.AeroForm { - - bool _keepAspectRatio = true; - - /// - /// Gets or sets whether the form should keep its aspect ratio. - /// - /// - /// Refreshes the window's size if set to true. - /// - [Description("Enables fixed aspect ratio for this form."), Category("Appearance"), DefaultValue(true)] - public bool KeepAspectRatio { - get { - return _keepAspectRatio; - } - set { - _keepAspectRatio = value; - - if (value) - RefreshAspectRatio(); - } - } - - double _aspectRatio = 1.0; - - /// - /// Gets or sets the form's aspect ratio that will be kept automatically when resizing. - /// - [Description("Determines this form's fixed aspect ratio."), Category("Appearance"), DefaultValue(1.0)] - public double AspectRatio { - get { - return _aspectRatio; - } - set { - if (value <= 0.0 || Double.IsInfinity(value)) - return; - - _aspectRatio = value; - } - } - - Padding _extraPadding; - - /// - /// Gets or sets some additional internal padding of the form that is ignored when keeping the aspect ratio. - /// - [Description("Sets some padding inside the form's client area that is ignored when keeping the aspect ratio."), - Category("Appearance")] - public Padding ExtraPadding { - get { - return _extraPadding; - } - set { - _extraPadding = value; - - if(KeepAspectRatio) - RefreshAspectRatio(); - } - } - - /// - /// Forces the form to update its height based on the current aspect ratio setting. - /// - public void RefreshAspectRatio() { - int newWidth = ClientSize.Width; - int newHeight = (int)((ClientSize.Width - ExtraPadding.Horizontal) / AspectRatio) + ExtraPadding.Vertical; - - //Adapt height if it doesn't respect the form's minimum size - Size clientMinimumSize = FromSizeToClientSize(MinimumSize); - if (newHeight < clientMinimumSize.Height) { - newHeight = clientMinimumSize.Height; - newWidth = (int)((newHeight - ExtraPadding.Vertical) * AspectRatio) + ExtraPadding.Horizontal; - } - - //Adapt height if it exceeds the screen's height - var workingArea = Screen.GetWorkingArea(this); - if (newHeight >= workingArea.Height) { - newHeight = workingArea.Height; - newWidth = (int)((newHeight - ExtraPadding.Vertical) * AspectRatio) + ExtraPadding.Horizontal; - } - - //Update size - ClientSize = new Size(newWidth, newHeight); - - //Move form vertically to adapt to new size - //REMOVED: allows the window to correctly be restored slightly off screen - /*if (Location.Y + Size.Height > workingArea.Y + workingArea.Height) { - int offsetY = (workingArea.Y + workingArea.Height) - (Location.Y + Size.Height); - Location = new Point(Location.X, Location.Y - offsetY); - }*/ - } - - /// - /// Adjusts the size of the form by a pixel increment while keeping its aspect ratio. - /// - /// Change of size in pixels. - public void AdjustSize(int pixelOffset) { - Size origSize = Size; - - //Resize to new width (clamped to max allowed size and minimum form size) - int newWidth = Math.Max(Math.Min(origSize.Width + pixelOffset, - SystemInformation.MaxWindowTrackSize.Width), - MinimumSize.Width); - - //Determine new height while keeping aspect ratio - var clientConversionDifference = ClientWindowDifference; - int newHeight = (int)((newWidth - ExtraPadding.Horizontal - clientConversionDifference.Width) / AspectRatio) + ExtraPadding.Vertical + clientConversionDifference.Height; - - //Apply and move form to recenter - Size = new Size(newWidth, newHeight); - int deltaX = Size.Width - origSize.Width; - int deltaY = Size.Height - origSize.Height; - Location = new System.Drawing.Point(Location.X - (deltaX / 2), Location.Y - (deltaY / 2)); - } - - /// - /// Updates the aspect ratio of the form and optionally forces a refresh. - /// - /// Size from which aspect ratio should be computed. - /// True if the size of the form should be refreshed to match the new aspect ratio. - public void SetAspectRatio(Size aspectRatioSource, bool forceRefresh) { - AspectRatio = ((double)aspectRatioSource.Width / (double)aspectRatioSource.Height); - _keepAspectRatio = true; - - //Log.Write("Setting new aspect ratio {0} (for {1})", AspectRatio, aspectRatioSource); - - if (forceRefresh) { - RefreshAspectRatio(); - } - } - - #region Event overriding - - protected override void OnResizeEnd(EventArgs e) { - base.OnResizeEnd(e); - - //Ensure that the ClientSize of the form is always respected - //(not ensured by the WM_SIZING message alone because of rounding errors and the chrome space) - if (KeepAspectRatio) { - var newHeight = ComputeHeightFromWidth(ClientSize.Width); - ClientSize = new Size(ClientSize.Width, newHeight); - } - } - - protected virtual void OnResizing(EventArgs e) { - - } - - /// - /// Override WM_SIZING message to restrict resizing. - /// Taken from: http://www.vcskicks.com/maintain-aspect-ratio.php - /// Improved with code from: http://stoyanoff.info/blog/2010/06/27/resizing-forms-while-keeping-aspect-ratio/ - /// - protected override void WndProc(ref Message m) { - if (m.Msg == WM.SIZING) { - this.OnResizing(EventArgs.Empty); - - if (KeepAspectRatio) { - var clientSizeConversion = ClientWindowDifference; - - var rc = (Native.NRectangle)Marshal.PtrToStructure(m.LParam, typeof(Native.NRectangle)); - int res = m.WParam.ToInt32(); - - int width = (rc.Right - rc.Left) - clientSizeConversion.Width - ExtraPadding.Horizontal; - int height = (rc.Bottom - rc.Top) - clientSizeConversion.Height - ExtraPadding.Vertical; - - if (res == WMSZ.LEFT || res == WMSZ.RIGHT) { - //Left or right resize, adjust top and bottom - int targetHeight = (int)(width / AspectRatio); - int diffHeight = height - targetHeight; - - rc.Top += (int)(diffHeight / 2.0); - rc.Bottom = rc.Top + targetHeight + ExtraPadding.Vertical + clientSizeConversion.Height; - } - else if (res == WMSZ.TOP || res == WMSZ.BOTTOM) { - //Up or down resize, adjust left and right - int targetWidth = (int)(height * AspectRatio); - int diffWidth = width - targetWidth; - - rc.Left += (int)(diffWidth / 2.0); - rc.Right = rc.Left + targetWidth + ExtraPadding.Horizontal + clientSizeConversion.Width; - } - else if (res == WMSZ.RIGHT + WMSZ.BOTTOM || res == WMSZ.LEFT + WMSZ.BOTTOM) { - //Lower corner resize, adjust bottom - rc.Bottom = rc.Top + (int)(width / AspectRatio) + ExtraPadding.Vertical + clientSizeConversion.Height; - } - else if (res == WMSZ.LEFT + WMSZ.TOP || res == WMSZ.RIGHT + WMSZ.TOP) { - //Upper corner resize, adjust top - rc.Top = rc.Bottom - (int)(width / AspectRatio) - ExtraPadding.Vertical - clientSizeConversion.Height; - } - - Marshal.StructureToPtr(rc, m.LParam, false); - } - } - - base.WndProc(ref m); - } - - #endregion - - #region Conversion helpers - - /// - /// Converts a client size measurement to a window size measurement. - /// - /// Size of the window's client area. - /// Size of the whole window. - public Size FromClientSizeToSize(Size clientSize) { - var difference = ClientWindowDifference; - - return new Size(clientSize.Width + difference.Width, clientSize.Height + difference.Height); - } - - /// - /// Converts a window size measurement to a client size measurement. - /// - /// Size of the whole window. - /// Size of the window's client area. - public Size FromSizeToClientSize(Size size) { - var difference = ClientWindowDifference; - - return new Size(size.Width - difference.Width, size.Height - difference.Height); - } - - /// - /// Computes height from width value, according to aspect ratio of window. - /// - public int ComputeHeightFromWidth(int width) { - return (int)Math.Round(((width - ExtraPadding.Horizontal) / AspectRatio) + ExtraPadding.Vertical); - } - - /// - /// Computes width from height value, according to aspect ratio of window. - /// - public int ComputeWidthFromHeight(int height) { - return (int)Math.Round(((height - ExtraPadding.Vertical) * AspectRatio) + ExtraPadding.Horizontal); - } - - #endregion - - /// - /// Gets the difference in pixels between a client size value and a window size value (depending on window decoration). - /// - protected Size ClientWindowDifference { - get { - long style = WindowMethods.GetWindowLong(this.Handle, WindowMethods.WindowLong.Style).ToInt64(); - long exStyle = WindowMethods.GetWindowLong(this.Handle, WindowMethods.WindowLong.ExStyle).ToInt64(); - return WindowMethods.ConvertClientToWindowRect(new NRectangle(0, 0, 0, 0), style, exStyle).Size; - } - } - - } - -} +using System; +using System.ComponentModel; +using System.Drawing; +using System.Runtime.InteropServices; +using System.Windows.Forms; +using OnTopReplica.Native; + +namespace OnTopReplica { + + /// + /// Form that automatically keeps a certain aspect ratio and resizes without flickering. + /// + public class AspectRatioForm : WindowsFormsAero.AeroForm { + + bool _keepAspectRatio = true; + + /// + /// Gets or sets whether the form should keep its aspect ratio. + /// + /// + /// Refreshes the window's size if set to true. + /// + [Description("Enables fixed aspect ratio for this form."), Category("Appearance"), DefaultValue(true)] + public bool KeepAspectRatio { + get { + return _keepAspectRatio; + } + set { + _keepAspectRatio = value; + + if (value) + RefreshAspectRatio(); + } + } + + double _aspectRatio = 1.0; + + /// + /// Gets or sets the form's aspect ratio that will be kept automatically when resizing. + /// + [Description("Determines this form's fixed aspect ratio."), Category("Appearance"), DefaultValue(1.0)] + public double AspectRatio { + get { + return _aspectRatio; + } + set { + if (value <= 0.0 || Double.IsInfinity(value)) + return; + + _aspectRatio = value; + } + } + + Padding _extraPadding; + + /// + /// Gets or sets some additional internal padding of the form that is ignored when keeping the aspect ratio. + /// + [Description("Sets some padding inside the form's client area that is ignored when keeping the aspect ratio."), + Category("Appearance")] + public Padding ExtraPadding { + get { + return _extraPadding; + } + set { + _extraPadding = value; + + if(KeepAspectRatio) + RefreshAspectRatio(); + } + } + + /// + /// Forces the form to update its height based on the current aspect ratio setting. + /// + public void RefreshAspectRatio() { + int newWidth = ClientSize.Width; + int newHeight = (int)((ClientSize.Width - ExtraPadding.Horizontal) / AspectRatio) + ExtraPadding.Vertical; + + //Adapt height if it doesn't respect the form's minimum size + Size clientMinimumSize = FromSizeToClientSize(MinimumSize); + if (newHeight < clientMinimumSize.Height) { + newHeight = clientMinimumSize.Height; + newWidth = (int)((newHeight - ExtraPadding.Vertical) * AspectRatio) + ExtraPadding.Horizontal; + } + + //Adapt height if it exceeds the screen's height + var workingArea = Screen.GetWorkingArea(this); + if (newHeight >= workingArea.Height) { + newHeight = workingArea.Height; + newWidth = (int)((newHeight - ExtraPadding.Vertical) * AspectRatio) + ExtraPadding.Horizontal; + } + + //Update size + ClientSize = new Size(newWidth, newHeight); + + //Move form vertically to adapt to new size + //REMOVED: allows the window to correctly be restored slightly off screen + /*if (Location.Y + Size.Height > workingArea.Y + workingArea.Height) { + int offsetY = (workingArea.Y + workingArea.Height) - (Location.Y + Size.Height); + Location = new Point(Location.X, Location.Y - offsetY); + }*/ + } + + /// + /// Adjusts the size of the form by a pixel increment while keeping its aspect ratio. + /// + /// Change of size in pixels. + public void AdjustSize(int pixelOffset) { + Size origSize = Size; + + //Resize to new width (clamped to max allowed size and minimum form size) + int newWidth = Math.Max(Math.Min(origSize.Width + pixelOffset, + SystemInformation.MaxWindowTrackSize.Width), + MinimumSize.Width); + + //Determine new height while keeping aspect ratio + var clientConversionDifference = ClientWindowDifference; + int newHeight = (int)((newWidth - ExtraPadding.Horizontal - clientConversionDifference.Width) / AspectRatio) + ExtraPadding.Vertical + clientConversionDifference.Height; + + //Apply and move form to recenter + Size = new Size(newWidth, newHeight); + int deltaX = Size.Width - origSize.Width; + int deltaY = Size.Height - origSize.Height; + Location = new System.Drawing.Point(Location.X - (deltaX / 2), Location.Y - (deltaY / 2)); + } + + /// + /// Updates the aspect ratio of the form and optionally forces a refresh. + /// + /// Size from which aspect ratio should be computed. + /// True if the size of the form should be refreshed to match the new aspect ratio. + public void SetAspectRatio(Size aspectRatioSource, bool forceRefresh) { + AspectRatio = ((double)aspectRatioSource.Width / (double)aspectRatioSource.Height); + _keepAspectRatio = true; + + //Log.Write("Setting new aspect ratio {0} (for {1})", AspectRatio, aspectRatioSource); + + if (forceRefresh) { + RefreshAspectRatio(); + } + } + + #region Event overriding + + protected override void OnResizeEnd(EventArgs e) { + base.OnResizeEnd(e); + + //Ensure that the ClientSize of the form is always respected + //(not ensured by the WM_SIZING message alone because of rounding errors and the chrome space) + if (KeepAspectRatio) { + var newHeight = ComputeHeightFromWidth(ClientSize.Width); + ClientSize = new Size(ClientSize.Width, newHeight); + } + } + + protected virtual void OnResizing(EventArgs e) { + + } + + /// + /// Override WM_SIZING message to restrict resizing. + /// Taken from: http://www.vcskicks.com/maintain-aspect-ratio.php + /// Improved with code from: http://stoyanoff.info/blog/2010/06/27/resizing-forms-while-keeping-aspect-ratio/ + /// + protected override void WndProc(ref Message m) { + if (m.Msg == WM.SIZING) { + this.OnResizing(EventArgs.Empty); + + if (KeepAspectRatio) { + var clientSizeConversion = ClientWindowDifference; + + var rc = (Native.NRectangle)Marshal.PtrToStructure(m.LParam, typeof(Native.NRectangle)); + int res = m.WParam.ToInt32(); + + int width = (rc.Right - rc.Left) - clientSizeConversion.Width - ExtraPadding.Horizontal; + int height = (rc.Bottom - rc.Top) - clientSizeConversion.Height - ExtraPadding.Vertical; + + if (res == WMSZ.LEFT || res == WMSZ.RIGHT) { + //Left or right resize, adjust top and bottom + int targetHeight = (int)(width / AspectRatio); + int diffHeight = height - targetHeight; + + rc.Top += (int)(diffHeight / 2.0); + rc.Bottom = rc.Top + targetHeight + ExtraPadding.Vertical + clientSizeConversion.Height; + } + else if (res == WMSZ.TOP || res == WMSZ.BOTTOM) { + //Up or down resize, adjust left and right + int targetWidth = (int)(height * AspectRatio); + int diffWidth = width - targetWidth; + + rc.Left += (int)(diffWidth / 2.0); + rc.Right = rc.Left + targetWidth + ExtraPadding.Horizontal + clientSizeConversion.Width; + } + else if (res == WMSZ.RIGHT + WMSZ.BOTTOM || res == WMSZ.LEFT + WMSZ.BOTTOM) { + //Lower corner resize, adjust bottom + rc.Bottom = rc.Top + (int)(width / AspectRatio) + ExtraPadding.Vertical + clientSizeConversion.Height; + } + else if (res == WMSZ.LEFT + WMSZ.TOP || res == WMSZ.RIGHT + WMSZ.TOP) { + //Upper corner resize, adjust top + rc.Top = rc.Bottom - (int)(width / AspectRatio) - ExtraPadding.Vertical - clientSizeConversion.Height; + } + + Marshal.StructureToPtr(rc, m.LParam, false); + } + } + + base.WndProc(ref m); + } + + #endregion + + #region Conversion helpers + + /// + /// Converts a client size measurement to a window size measurement. + /// + /// Size of the window's client area. + /// Size of the whole window. + public Size FromClientSizeToSize(Size clientSize) { + var difference = ClientWindowDifference; + + return new Size(clientSize.Width + difference.Width, clientSize.Height + difference.Height); + } + + /// + /// Converts a window size measurement to a client size measurement. + /// + /// Size of the whole window. + /// Size of the window's client area. + public Size FromSizeToClientSize(Size size) { + var difference = ClientWindowDifference; + + return new Size(size.Width - difference.Width, size.Height - difference.Height); + } + + /// + /// Computes height from width value, according to aspect ratio of window. + /// + public int ComputeHeightFromWidth(int width) { + return (int)Math.Round(((width - ExtraPadding.Horizontal) / AspectRatio) + ExtraPadding.Vertical); + } + + /// + /// Computes width from height value, according to aspect ratio of window. + /// + public int ComputeWidthFromHeight(int height) { + return (int)Math.Round(((height - ExtraPadding.Vertical) * AspectRatio) + ExtraPadding.Horizontal); + } + + #endregion + + /// + /// Gets the difference in pixels between a client size value and a window size value (depending on window decoration). + /// + protected Size ClientWindowDifference { + get { + long style = WindowMethods.GetWindowLong(this.Handle, WindowMethods.WindowLong.Style).ToInt64(); + long exStyle = WindowMethods.GetWindowLong(this.Handle, WindowMethods.WindowLong.ExStyle).ToInt64(); + return WindowMethods.ConvertClientToWindowRect(new NRectangle(0, 0, 0, 0), style, exStyle).Size; + } + } + + } + +} diff --git a/OnTopReplica/Assets/25.png b/src/OnTopReplica/Assets/25.png similarity index 100% rename from OnTopReplica/Assets/25.png rename to src/OnTopReplica/Assets/25.png diff --git a/OnTopReplica/Assets/arrow_down.png b/src/OnTopReplica/Assets/arrow_down.png similarity index 100% rename from OnTopReplica/Assets/arrow_down.png rename to src/OnTopReplica/Assets/arrow_down.png diff --git a/OnTopReplica/Assets/arrow_up.png b/src/OnTopReplica/Assets/arrow_up.png similarity index 100% rename from OnTopReplica/Assets/arrow_up.png rename to src/OnTopReplica/Assets/arrow_up.png diff --git a/OnTopReplica/Assets/back.png b/src/OnTopReplica/Assets/back.png similarity index 100% rename from OnTopReplica/Assets/back.png rename to src/OnTopReplica/Assets/back.png diff --git a/OnTopReplica/Assets/clickforwarding.png b/src/OnTopReplica/Assets/clickforwarding.png similarity index 100% rename from OnTopReplica/Assets/clickforwarding.png rename to src/OnTopReplica/Assets/clickforwarding.png diff --git a/OnTopReplica/Assets/component.png b/src/OnTopReplica/Assets/component.png similarity index 100% rename from OnTopReplica/Assets/component.png rename to src/OnTopReplica/Assets/component.png diff --git a/OnTopReplica/Assets/desktop.png b/src/OnTopReplica/Assets/desktop.png similarity index 100% rename from OnTopReplica/Assets/desktop.png rename to src/OnTopReplica/Assets/desktop.png diff --git a/OnTopReplica/Assets/empty-window.ico b/src/OnTopReplica/Assets/empty-window.ico similarity index 100% rename from OnTopReplica/Assets/empty-window.ico rename to src/OnTopReplica/Assets/empty-window.ico diff --git a/OnTopReplica/Assets/flag_china.png b/src/OnTopReplica/Assets/flag_china.png similarity index 100% rename from OnTopReplica/Assets/flag_china.png rename to src/OnTopReplica/Assets/flag_china.png diff --git a/OnTopReplica/Assets/flag_czech.png b/src/OnTopReplica/Assets/flag_czech.png similarity index 100% rename from OnTopReplica/Assets/flag_czech.png rename to src/OnTopReplica/Assets/flag_czech.png diff --git a/OnTopReplica/Assets/flag_danish.png b/src/OnTopReplica/Assets/flag_danish.png similarity index 100% rename from OnTopReplica/Assets/flag_danish.png rename to src/OnTopReplica/Assets/flag_danish.png diff --git a/OnTopReplica/Assets/flag_germany.png b/src/OnTopReplica/Assets/flag_germany.png similarity index 100% rename from OnTopReplica/Assets/flag_germany.png rename to src/OnTopReplica/Assets/flag_germany.png diff --git a/OnTopReplica/Assets/flag_ita.png b/src/OnTopReplica/Assets/flag_ita.png similarity index 100% rename from OnTopReplica/Assets/flag_ita.png rename to src/OnTopReplica/Assets/flag_ita.png diff --git a/OnTopReplica/Assets/flag_poland.png b/src/OnTopReplica/Assets/flag_poland.png similarity index 100% rename from OnTopReplica/Assets/flag_poland.png rename to src/OnTopReplica/Assets/flag_poland.png diff --git a/OnTopReplica/Assets/flag_spanish.png b/src/OnTopReplica/Assets/flag_spanish.png similarity index 100% rename from OnTopReplica/Assets/flag_spanish.png rename to src/OnTopReplica/Assets/flag_spanish.png diff --git a/OnTopReplica/Assets/flag_taiwan.png b/src/OnTopReplica/Assets/flag_taiwan.png similarity index 100% rename from OnTopReplica/Assets/flag_taiwan.png rename to src/OnTopReplica/Assets/flag_taiwan.png diff --git a/OnTopReplica/Assets/flag_usa.png b/src/OnTopReplica/Assets/flag_usa.png similarity index 100% rename from OnTopReplica/Assets/flag_usa.png rename to src/OnTopReplica/Assets/flag_usa.png diff --git a/OnTopReplica/Assets/flags.pdn b/src/OnTopReplica/Assets/flags.pdn similarity index 100% rename from OnTopReplica/Assets/flags.pdn rename to src/OnTopReplica/Assets/flags.pdn diff --git a/OnTopReplica/Assets/fullscreen.png b/src/OnTopReplica/Assets/fullscreen.png similarity index 100% rename from OnTopReplica/Assets/fullscreen.png rename to src/OnTopReplica/Assets/fullscreen.png diff --git a/OnTopReplica/Assets/groupmode.png b/src/OnTopReplica/Assets/groupmode.png similarity index 100% rename from OnTopReplica/Assets/groupmode.png rename to src/OnTopReplica/Assets/groupmode.png diff --git a/OnTopReplica/Assets/icon-new-red.ico b/src/OnTopReplica/Assets/icon-new-red.ico similarity index 100% rename from OnTopReplica/Assets/icon-new-red.ico rename to src/OnTopReplica/Assets/icon-new-red.ico diff --git a/OnTopReplica/Assets/icon-new.ico b/src/OnTopReplica/Assets/icon-new.ico similarity index 100% rename from OnTopReplica/Assets/icon-new.ico rename to src/OnTopReplica/Assets/icon-new.ico diff --git a/OnTopReplica/Assets/icon.ico b/src/OnTopReplica/Assets/icon.ico similarity index 100% rename from OnTopReplica/Assets/icon.ico rename to src/OnTopReplica/Assets/icon.ico diff --git a/OnTopReplica/Assets/icon.png b/src/OnTopReplica/Assets/icon.png similarity index 100% rename from OnTopReplica/Assets/icon.png rename to src/OnTopReplica/Assets/icon.png diff --git a/OnTopReplica/Assets/list.png b/src/OnTopReplica/Assets/list.png similarity index 100% rename from OnTopReplica/Assets/list.png rename to src/OnTopReplica/Assets/list.png diff --git a/OnTopReplica/Assets/newicon.png b/src/OnTopReplica/Assets/newicon.png similarity index 100% rename from OnTopReplica/Assets/newicon.png rename to src/OnTopReplica/Assets/newicon.png diff --git a/OnTopReplica/Assets/pos_bottomleft.pdn b/src/OnTopReplica/Assets/pos_bottomleft.pdn similarity index 100% rename from OnTopReplica/Assets/pos_bottomleft.pdn rename to src/OnTopReplica/Assets/pos_bottomleft.pdn diff --git a/OnTopReplica/Assets/pos_bottomleft.png b/src/OnTopReplica/Assets/pos_bottomleft.png similarity index 100% rename from OnTopReplica/Assets/pos_bottomleft.png rename to src/OnTopReplica/Assets/pos_bottomleft.png diff --git a/OnTopReplica/Assets/pos_bottomright.png b/src/OnTopReplica/Assets/pos_bottomright.png similarity index 100% rename from OnTopReplica/Assets/pos_bottomright.png rename to src/OnTopReplica/Assets/pos_bottomright.png diff --git a/OnTopReplica/Assets/pos_center.png b/src/OnTopReplica/Assets/pos_center.png similarity index 100% rename from OnTopReplica/Assets/pos_center.png rename to src/OnTopReplica/Assets/pos_center.png diff --git a/OnTopReplica/Assets/pos_null.png b/src/OnTopReplica/Assets/pos_null.png similarity index 100% rename from OnTopReplica/Assets/pos_null.png rename to src/OnTopReplica/Assets/pos_null.png diff --git a/OnTopReplica/Assets/pos_topleft.png b/src/OnTopReplica/Assets/pos_topleft.png similarity index 100% rename from OnTopReplica/Assets/pos_topleft.png rename to src/OnTopReplica/Assets/pos_topleft.png diff --git a/OnTopReplica/Assets/pos_topright.png b/src/OnTopReplica/Assets/pos_topright.png similarity index 100% rename from OnTopReplica/Assets/pos_topright.png rename to src/OnTopReplica/Assets/pos_topright.png diff --git a/OnTopReplica/Assets/reduce.png b/src/OnTopReplica/Assets/reduce.png similarity index 100% rename from OnTopReplica/Assets/reduce.png rename to src/OnTopReplica/Assets/reduce.png diff --git a/OnTopReplica/Assets/regions.png b/src/OnTopReplica/Assets/regions.png similarity index 100% rename from OnTopReplica/Assets/regions.png rename to src/OnTopReplica/Assets/regions.png diff --git a/OnTopReplica/Assets/regions_new.png b/src/OnTopReplica/Assets/regions_new.png similarity index 100% rename from OnTopReplica/Assets/regions_new.png rename to src/OnTopReplica/Assets/regions_new.png diff --git a/OnTopReplica/Assets/screenshot-icon.ico b/src/OnTopReplica/Assets/screenshot-icon.ico similarity index 100% rename from OnTopReplica/Assets/screenshot-icon.ico rename to src/OnTopReplica/Assets/screenshot-icon.ico diff --git a/OnTopReplica/Assets/window16.png b/src/OnTopReplica/Assets/window16.png similarity index 100% rename from OnTopReplica/Assets/window16.png rename to src/OnTopReplica/Assets/window16.png diff --git a/OnTopReplica/Assets/window_border16.png b/src/OnTopReplica/Assets/window_border16.png similarity index 100% rename from OnTopReplica/Assets/window_border16.png rename to src/OnTopReplica/Assets/window_border16.png diff --git a/OnTopReplica/Assets/window_multiple.pdn b/src/OnTopReplica/Assets/window_multiple.pdn similarity index 100% rename from OnTopReplica/Assets/window_multiple.pdn rename to src/OnTopReplica/Assets/window_multiple.pdn diff --git a/OnTopReplica/Assets/window_multiple16.ico b/src/OnTopReplica/Assets/window_multiple16.ico similarity index 100% rename from OnTopReplica/Assets/window_multiple16.ico rename to src/OnTopReplica/Assets/window_multiple16.ico diff --git a/OnTopReplica/Assets/window_multiple16.png b/src/OnTopReplica/Assets/window_multiple16.png similarity index 100% rename from OnTopReplica/Assets/window_multiple16.png rename to src/OnTopReplica/Assets/window_multiple16.png diff --git a/OnTopReplica/Assets/window_multiple48.png b/src/OnTopReplica/Assets/window_multiple48.png similarity index 100% rename from OnTopReplica/Assets/window_multiple48.png rename to src/OnTopReplica/Assets/window_multiple48.png diff --git a/OnTopReplica/Assets/window_opacity16.png b/src/OnTopReplica/Assets/window_opacity16.png similarity index 100% rename from OnTopReplica/Assets/window_opacity16.png rename to src/OnTopReplica/Assets/window_opacity16.png diff --git a/OnTopReplica/Assets/window_opacity_new.png b/src/OnTopReplica/Assets/window_opacity_new.png similarity index 100% rename from OnTopReplica/Assets/window_opacity_new.png rename to src/OnTopReplica/Assets/window_opacity_new.png diff --git a/OnTopReplica/Assets/window_switch.pdn b/src/OnTopReplica/Assets/window_switch.pdn similarity index 100% rename from OnTopReplica/Assets/window_switch.pdn rename to src/OnTopReplica/Assets/window_switch.pdn diff --git a/OnTopReplica/Assets/window_switch.png b/src/OnTopReplica/Assets/window_switch.png similarity index 100% rename from OnTopReplica/Assets/window_switch.png rename to src/OnTopReplica/Assets/window_switch.png diff --git a/OnTopReplica/Assets/windows.png b/src/OnTopReplica/Assets/windows.png similarity index 100% rename from OnTopReplica/Assets/windows.png rename to src/OnTopReplica/Assets/windows.png diff --git a/OnTopReplica/Assets/x-oblique.png b/src/OnTopReplica/Assets/x-oblique.png similarity index 100% rename from OnTopReplica/Assets/x-oblique.png rename to src/OnTopReplica/Assets/x-oblique.png diff --git a/OnTopReplica/Assets/xiao_add.png b/src/OnTopReplica/Assets/xiao_add.png similarity index 100% rename from OnTopReplica/Assets/xiao_add.png rename to src/OnTopReplica/Assets/xiao_add.png diff --git a/OnTopReplica/Assets/xiao_arrow.png b/src/OnTopReplica/Assets/xiao_arrow.png similarity index 100% rename from OnTopReplica/Assets/xiao_arrow.png rename to src/OnTopReplica/Assets/xiao_arrow.png diff --git a/OnTopReplica/Assets/xiao_delete.png b/src/OnTopReplica/Assets/xiao_delete.png similarity index 100% rename from OnTopReplica/Assets/xiao_delete.png rename to src/OnTopReplica/Assets/xiao_delete.png diff --git a/OnTopReplica/Assets/xiao_down.png b/src/OnTopReplica/Assets/xiao_down.png similarity index 100% rename from OnTopReplica/Assets/xiao_down.png rename to src/OnTopReplica/Assets/xiao_down.png diff --git a/OnTopReplica/Assets/xiao_help.png b/src/OnTopReplica/Assets/xiao_help.png similarity index 100% rename from OnTopReplica/Assets/xiao_help.png rename to src/OnTopReplica/Assets/xiao_help.png diff --git a/OnTopReplica/Assets/xiao_ok.png b/src/OnTopReplica/Assets/xiao_ok.png similarity index 100% rename from OnTopReplica/Assets/xiao_ok.png rename to src/OnTopReplica/Assets/xiao_ok.png diff --git a/OnTopReplica/Assets/xiao_up.png b/src/OnTopReplica/Assets/xiao_up.png similarity index 100% rename from OnTopReplica/Assets/xiao_up.png rename to src/OnTopReplica/Assets/xiao_up.png diff --git a/OnTopReplica/Assets/xiao_wrench.png b/src/OnTopReplica/Assets/xiao_wrench.png similarity index 100% rename from OnTopReplica/Assets/xiao_wrench.png rename to src/OnTopReplica/Assets/xiao_wrench.png diff --git a/OnTopReplica/CREDITS.txt b/src/OnTopReplica/CREDITS.txt similarity index 97% rename from OnTopReplica/CREDITS.txt rename to src/OnTopReplica/CREDITS.txt index 36c6de9..d4a648c 100644 --- a/OnTopReplica/CREDITS.txt +++ b/src/OnTopReplica/CREDITS.txt @@ -1,17 +1,17 @@ -OnTopReplica credits --------------------- - -This application was inspired by Switcher (http://insentient.net) and other -DWM based application. - -All Aero controls are part of the open-source WindowsFormsAero -(http://windowsformsaero.codeplex.com) library for .NET. - -Some DWM example code has ben taken from user Ookii (http://www.ookii.org) on -Channel 9 MSDN. - -The NativeToolstripRenderer class has been taken from asztal.net -(http://wp.asztal.net/2007/12/vista-style-menus-in-dotnet). - -Some of the icons used by OnTopReplica have been taken from VistaICO.com and -the Xiao icon set. +OnTopReplica credits +-------------------- + +This application was inspired by Switcher (http://insentient.net) and other +DWM based application. + +All Aero controls are part of the open-source WindowsFormsAero +(http://windowsformsaero.codeplex.com) library for .NET. + +Some DWM example code has ben taken from user Ookii (http://www.ookii.org) on +Channel 9 MSDN. + +The NativeToolstripRenderer class has been taken from asztal.net +(http://wp.asztal.net/2007/12/vista-style-menus-in-dotnet). + +Some of the icons used by OnTopReplica have been taken from VistaICO.com and +the Xiao icon set. diff --git a/OnTopReplica/CloneClickEventArgs.cs b/src/OnTopReplica/CloneClickEventArgs.cs similarity index 96% rename from OnTopReplica/CloneClickEventArgs.cs rename to src/OnTopReplica/CloneClickEventArgs.cs index 2c137fe..76836f1 100644 --- a/OnTopReplica/CloneClickEventArgs.cs +++ b/src/OnTopReplica/CloneClickEventArgs.cs @@ -1,32 +1,32 @@ -using System; -using System.Collections.Generic; -using System.Text; -using System.Drawing; -using System.Windows.Forms; - -namespace OnTopReplica { - /// - /// EventArgs structure for clicks on a cloned window. - /// - public class CloneClickEventArgs : EventArgs { - - public Point ClientClickLocation { get; set; } - - public bool IsDoubleClick { get; set; } - - public MouseButtons Buttons { get; set; } - - public CloneClickEventArgs(Point location, MouseButtons buttons) { - ClientClickLocation = location; - Buttons = buttons; - IsDoubleClick = false; - } - - public CloneClickEventArgs(Point location, MouseButtons buttons, bool doubleClick) { - ClientClickLocation = location; - Buttons = buttons; - IsDoubleClick = doubleClick; - } - - } -} +using System; +using System.Collections.Generic; +using System.Text; +using System.Drawing; +using System.Windows.Forms; + +namespace OnTopReplica { + /// + /// EventArgs structure for clicks on a cloned window. + /// + public class CloneClickEventArgs : EventArgs { + + public Point ClientClickLocation { get; set; } + + public bool IsDoubleClick { get; set; } + + public MouseButtons Buttons { get; set; } + + public CloneClickEventArgs(Point location, MouseButtons buttons) { + ClientClickLocation = location; + Buttons = buttons; + IsDoubleClick = false; + } + + public CloneClickEventArgs(Point location, MouseButtons buttons, bool doubleClick) { + ClientClickLocation = location; + Buttons = buttons; + IsDoubleClick = doubleClick; + } + + } +} diff --git a/OnTopReplica/CloseRequestEventArgs.cs b/src/OnTopReplica/CloseRequestEventArgs.cs similarity index 95% rename from OnTopReplica/CloseRequestEventArgs.cs rename to src/OnTopReplica/CloseRequestEventArgs.cs index 377ce99..57a3e03 100644 --- a/OnTopReplica/CloseRequestEventArgs.cs +++ b/src/OnTopReplica/CloseRequestEventArgs.cs @@ -1,14 +1,14 @@ -using System; -using System.Collections.Generic; -using System.Text; -using System.Drawing; - -namespace OnTopReplica { - public class CloseRequestEventArgs : EventArgs { - - public WindowHandle LastWindowHandle { get; set; } - - public Rectangle? LastRegion { get; set; } - - } -} +using System; +using System.Collections.Generic; +using System.Text; +using System.Drawing; + +namespace OnTopReplica { + public class CloseRequestEventArgs : EventArgs { + + public WindowHandle LastWindowHandle { get; set; } + + public Rectangle? LastRegion { get; set; } + + } +} diff --git a/OnTopReplica/FocusedTextBox.cs b/src/OnTopReplica/FocusedTextBox.cs similarity index 96% rename from OnTopReplica/FocusedTextBox.cs rename to src/OnTopReplica/FocusedTextBox.cs index fcfb4c2..6be79bb 100644 --- a/OnTopReplica/FocusedTextBox.cs +++ b/src/OnTopReplica/FocusedTextBox.cs @@ -1,68 +1,68 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using WindowsFormsAero; -using System.Windows.Forms; - -namespace OnTopReplica { - - class FocusedTextBox : System.Windows.Forms.TextBox { - - protected override bool IsInputChar(char charCode) { - if (charCode == '\n' || charCode == '\r') - return true; - - return base.IsInputChar(charCode); - } - - protected override void OnKeyUp(KeyEventArgs e) { - if (e.KeyCode == Keys.Return) { - if(!string.IsNullOrEmpty(Text)) - OnConfirmInput(); - - e.Handled = true; - e.SuppressKeyPress = true; - } - else if (e.KeyCode == Keys.Escape) { - OnAbortInput(); - - e.Handled = true; - e.SuppressKeyPress = true; - } - - base.OnKeyUp(e); - } - - //List of characters to ignore on KeyPress events (because they generate bell rings) - readonly char[] IgnoreChars = new char[] { - (char)27, (char)13 - }; - - protected override void OnKeyPress(KeyPressEventArgs e) { - if (IgnoreChars.Contains(e.KeyChar)) { - e.Handled = true; - } - - base.OnKeyPress(e); - } - - public event EventHandler ConfirmInput; - - protected virtual void OnConfirmInput() { - var evt = ConfirmInput; - if (evt != null) - evt(this, EventArgs.Empty); - } - - public event EventHandler AbortInput; - - protected virtual void OnAbortInput() { - var evt = AbortInput; - if (evt != null) - evt(this, EventArgs.Empty); - } - - } - -} +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using WindowsFormsAero; +using System.Windows.Forms; + +namespace OnTopReplica { + + class FocusedTextBox : System.Windows.Forms.TextBox { + + protected override bool IsInputChar(char charCode) { + if (charCode == '\n' || charCode == '\r') + return true; + + return base.IsInputChar(charCode); + } + + protected override void OnKeyUp(KeyEventArgs e) { + if (e.KeyCode == Keys.Return) { + if(!string.IsNullOrEmpty(Text)) + OnConfirmInput(); + + e.Handled = true; + e.SuppressKeyPress = true; + } + else if (e.KeyCode == Keys.Escape) { + OnAbortInput(); + + e.Handled = true; + e.SuppressKeyPress = true; + } + + base.OnKeyUp(e); + } + + //List of characters to ignore on KeyPress events (because they generate bell rings) + readonly char[] IgnoreChars = new char[] { + (char)27, (char)13 + }; + + protected override void OnKeyPress(KeyPressEventArgs e) { + if (IgnoreChars.Contains(e.KeyChar)) { + e.Handled = true; + } + + base.OnKeyPress(e); + } + + public event EventHandler ConfirmInput; + + protected virtual void OnConfirmInput() { + var evt = ConfirmInput; + if (evt != null) + evt(this, EventArgs.Empty); + } + + public event EventHandler AbortInput; + + protected virtual void OnAbortInput() { + var evt = AbortInput; + if (evt != null) + evt(this, EventArgs.Empty); + } + + } + +} diff --git a/OnTopReplica/FullscreenFormManager.cs b/src/OnTopReplica/FullscreenFormManager.cs similarity index 96% rename from OnTopReplica/FullscreenFormManager.cs rename to src/OnTopReplica/FullscreenFormManager.cs index a09ddcb..519c178 100644 --- a/OnTopReplica/FullscreenFormManager.cs +++ b/src/OnTopReplica/FullscreenFormManager.cs @@ -1,116 +1,116 @@ -using OnTopReplica.Properties; -using System; -using System.Collections.Generic; -using System.Drawing; -using System.Linq; -using System.Text; -using System.Windows.Forms; - -namespace OnTopReplica { - class FullscreenFormManager { - - private readonly MainForm _mainForm; - - public FullscreenFormManager(MainForm form) { - _mainForm = form; - IsFullscreen = false; - } - - Point _preFullscreenLocation; - Size _preFullscreenSize; - FormBorderStyle _preFullscreenBorderStyle; - - public bool IsFullscreen { - get; - private set; - } - - public void SwitchFullscreen() { - SwitchFullscreen(Settings.Default.GetFullscreenMode()); - } - - public void SwitchFullscreen(FullscreenMode mode) { - if (IsFullscreen) { - MoveToFullscreenMode(mode); - return; - } - - if (!_mainForm.ThumbnailPanel.IsShowingThumbnail) - return; - - //On switch, always hide side panels - _mainForm.CloseSidePanel(); - - //Store state - _preFullscreenLocation = _mainForm.Location; - _preFullscreenSize = _mainForm.ClientSize; - _preFullscreenBorderStyle = _mainForm.FormBorderStyle; - - //Change state to fullscreen - _mainForm.FormBorderStyle = FormBorderStyle.None; - MoveToFullscreenMode(mode); - - CommonCompleteSwitch(true); - } - - private void MoveToFullscreenMode(FullscreenMode mode) { - var screens = Screen.AllScreens; - - var currentScreen = Screen.FromControl(_mainForm); - Size size = _mainForm.Size; - Point location = _mainForm.Location; - - switch (mode) { - case FullscreenMode.Standard: - default: - size = currentScreen.WorkingArea.Size; - location = currentScreen.WorkingArea.Location; - break; - - case FullscreenMode.Fullscreen: - size = currentScreen.Bounds.Size; - location = currentScreen.Bounds.Location; - break; - - case FullscreenMode.AllScreens: - size = SystemInformation.VirtualScreen.Size; - location = SystemInformation.VirtualScreen.Location; - break; - } - - _mainForm.Size = size; - _mainForm.Location = location; - } - - public void SwitchBack() { - if (!IsFullscreen) - return; - - //Restore state - _mainForm.FormBorderStyle = _preFullscreenBorderStyle; - _mainForm.Location = _preFullscreenLocation; - _mainForm.ClientSize = _preFullscreenSize; - _mainForm.RefreshAspectRatio(); - - CommonCompleteSwitch(false); - } - - private void CommonCompleteSwitch(bool enabled) { - //UI stuff switching - _mainForm.GlassMargins = (!enabled) ? new Padding(-1) : Padding.Empty; - _mainForm.TopMost = !enabled; - - IsFullscreen = enabled; - - Program.Platform.OnFormStateChange(_mainForm); - } - - public void Toggle() { - if (IsFullscreen) - SwitchBack(); - else - SwitchFullscreen(Settings.Default.GetFullscreenMode()); - } - - } -} +using OnTopReplica.Properties; +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Windows.Forms; + +namespace OnTopReplica { + class FullscreenFormManager { + + private readonly MainForm _mainForm; + + public FullscreenFormManager(MainForm form) { + _mainForm = form; + IsFullscreen = false; + } + + Point _preFullscreenLocation; + Size _preFullscreenSize; + FormBorderStyle _preFullscreenBorderStyle; + + public bool IsFullscreen { + get; + private set; + } + + public void SwitchFullscreen() { + SwitchFullscreen(Settings.Default.GetFullscreenMode()); + } + + public void SwitchFullscreen(FullscreenMode mode) { + if (IsFullscreen) { + MoveToFullscreenMode(mode); + return; + } + + if (!_mainForm.ThumbnailPanel.IsShowingThumbnail) + return; + + //On switch, always hide side panels + _mainForm.CloseSidePanel(); + + //Store state + _preFullscreenLocation = _mainForm.Location; + _preFullscreenSize = _mainForm.ClientSize; + _preFullscreenBorderStyle = _mainForm.FormBorderStyle; + + //Change state to fullscreen + _mainForm.FormBorderStyle = FormBorderStyle.None; + MoveToFullscreenMode(mode); + + CommonCompleteSwitch(true); + } + + private void MoveToFullscreenMode(FullscreenMode mode) { + var screens = Screen.AllScreens; + + var currentScreen = Screen.FromControl(_mainForm); + Size size = _mainForm.Size; + Point location = _mainForm.Location; + + switch (mode) { + case FullscreenMode.Standard: + default: + size = currentScreen.WorkingArea.Size; + location = currentScreen.WorkingArea.Location; + break; + + case FullscreenMode.Fullscreen: + size = currentScreen.Bounds.Size; + location = currentScreen.Bounds.Location; + break; + + case FullscreenMode.AllScreens: + size = SystemInformation.VirtualScreen.Size; + location = SystemInformation.VirtualScreen.Location; + break; + } + + _mainForm.Size = size; + _mainForm.Location = location; + } + + public void SwitchBack() { + if (!IsFullscreen) + return; + + //Restore state + _mainForm.FormBorderStyle = _preFullscreenBorderStyle; + _mainForm.Location = _preFullscreenLocation; + _mainForm.ClientSize = _preFullscreenSize; + _mainForm.RefreshAspectRatio(); + + CommonCompleteSwitch(false); + } + + private void CommonCompleteSwitch(bool enabled) { + //UI stuff switching + _mainForm.GlassMargins = (!enabled) ? new Padding(-1) : Padding.Empty; + _mainForm.TopMost = !enabled; + + IsFullscreen = enabled; + + Program.Platform.OnFormStateChange(_mainForm); + } + + public void Toggle() { + if (IsFullscreen) + SwitchBack(); + else + SwitchFullscreen(Settings.Default.GetFullscreenMode()); + } + + } +} diff --git a/OnTopReplica/FullscreenMode.cs b/src/OnTopReplica/FullscreenMode.cs similarity index 96% rename from OnTopReplica/FullscreenMode.cs rename to src/OnTopReplica/FullscreenMode.cs index 83f4700..3f8db59 100644 --- a/OnTopReplica/FullscreenMode.cs +++ b/src/OnTopReplica/FullscreenMode.cs @@ -1,39 +1,39 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Xml.Serialization; -using OnTopReplica.Properties; - -namespace OnTopReplica { - /// - /// Describes a fullscreen mode. - /// - enum FullscreenMode { - Standard, - Fullscreen, - AllScreens - } - - static class FullscreenModeExtensions { - - /// - /// Gets the fullscreen mode as an enumeration value. - /// - public static FullscreenMode GetFullscreenMode(this Settings settings) { - FullscreenMode retMode = FullscreenMode.Standard; - - Enum.TryParse(settings.FullscreenMode, out retMode); - - return retMode; - } - - /// - /// Sets the fullscreen mode. - /// - public static void SetFullscreenMode(this Settings settings, FullscreenMode mode) { - settings.FullscreenMode = mode.ToString(); - } - - } -} +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Xml.Serialization; +using OnTopReplica.Properties; + +namespace OnTopReplica { + /// + /// Describes a fullscreen mode. + /// + enum FullscreenMode { + Standard, + Fullscreen, + AllScreens + } + + static class FullscreenModeExtensions { + + /// + /// Gets the fullscreen mode as an enumeration value. + /// + public static FullscreenMode GetFullscreenMode(this Settings settings) { + FullscreenMode retMode = FullscreenMode.Standard; + + Enum.TryParse(settings.FullscreenMode, out retMode); + + return retMode; + } + + /// + /// Sets the fullscreen mode. + /// + public static void SetFullscreenMode(this Settings settings, FullscreenMode mode) { + settings.FullscreenMode = mode.ToString(); + } + + } +} diff --git a/OnTopReplica/GeometryExtensions.cs b/src/OnTopReplica/GeometryExtensions.cs similarity index 97% rename from OnTopReplica/GeometryExtensions.cs rename to src/OnTopReplica/GeometryExtensions.cs index 5f61feb..422ccc6 100644 --- a/OnTopReplica/GeometryExtensions.cs +++ b/src/OnTopReplica/GeometryExtensions.cs @@ -1,74 +1,74 @@ -using System; -using System.Collections.Generic; -using System.Text; -using System.Drawing; -using System.Windows.Forms; - -namespace OnTopReplica { - - /// - /// Common geometry extension methods. - /// - static class GeometryExtensions { - - /// - /// Returns the difference (offset vector) between two points. - /// - public static Point Difference(this Point a, Point b) { - return new Point(a.X - b.X, a.Y - b.Y); - } - - /// - /// Expands a size value by a padding distance. - /// - public static Size Expand(this Size size, Padding padding) { - return new Size(size.Width + padding.Horizontal, size.Height + padding.Vertical); - } - - /// - /// Expands a size value by a size distance. - /// - public static Size Expand(this Size size, Size expandSize) { - return new Size(size.Width + expandSize.Width, size.Height + expandSize.Height); - } - - /// - /// Computes the difference between two size values. - /// - public static Size Difference(this Size a, Size b) { - return new Size(a.Width - b.Width, a.Height - b.Height); - } - - /// - /// Ensures that the minimum size of a control respects a minimum - /// client size area. - /// - /// Control whose MinimumSize should be altered. - /// Minimum client size value to ensure. - public static void EnsureMinimumClientSize(this Control ctrl, Size minimumClientSize) { - Size offset = ctrl.Size.Difference(ctrl.ClientSize); - ctrl.MinimumSize = minimumClientSize.Expand(offset); - } - - /// - /// Attempts to fit a size structure to another fixed destination size, by maintaining - /// the original aspect ratio. - /// - public static Size Fit(this Size sourceSize, Size destinationSize) { - double sourceRatio = (double)sourceSize.Width / (double)sourceSize.Height; - double clientRatio = (double)destinationSize.Width / (double)destinationSize.Height; - - Size ret; - if (sourceRatio >= clientRatio) { - ret = new Size(destinationSize.Width, (int)((double)destinationSize.Width / sourceRatio)); - } - else { - ret = new Size((int)((double)destinationSize.Height * sourceRatio), destinationSize.Height); - } - - return ret; - } - - } - -} +using System; +using System.Collections.Generic; +using System.Text; +using System.Drawing; +using System.Windows.Forms; + +namespace OnTopReplica { + + /// + /// Common geometry extension methods. + /// + static class GeometryExtensions { + + /// + /// Returns the difference (offset vector) between two points. + /// + public static Point Difference(this Point a, Point b) { + return new Point(a.X - b.X, a.Y - b.Y); + } + + /// + /// Expands a size value by a padding distance. + /// + public static Size Expand(this Size size, Padding padding) { + return new Size(size.Width + padding.Horizontal, size.Height + padding.Vertical); + } + + /// + /// Expands a size value by a size distance. + /// + public static Size Expand(this Size size, Size expandSize) { + return new Size(size.Width + expandSize.Width, size.Height + expandSize.Height); + } + + /// + /// Computes the difference between two size values. + /// + public static Size Difference(this Size a, Size b) { + return new Size(a.Width - b.Width, a.Height - b.Height); + } + + /// + /// Ensures that the minimum size of a control respects a minimum + /// client size area. + /// + /// Control whose MinimumSize should be altered. + /// Minimum client size value to ensure. + public static void EnsureMinimumClientSize(this Control ctrl, Size minimumClientSize) { + Size offset = ctrl.Size.Difference(ctrl.ClientSize); + ctrl.MinimumSize = minimumClientSize.Expand(offset); + } + + /// + /// Attempts to fit a size structure to another fixed destination size, by maintaining + /// the original aspect ratio. + /// + public static Size Fit(this Size sourceSize, Size destinationSize) { + double sourceRatio = (double)sourceSize.Width / (double)sourceSize.Height; + double clientRatio = (double)destinationSize.Width / (double)destinationSize.Height; + + Size ret; + if (sourceRatio >= clientRatio) { + ret = new Size(destinationSize.Width, (int)((double)destinationSize.Width / sourceRatio)); + } + else { + ret = new Size((int)((double)destinationSize.Height * sourceRatio), destinationSize.Height); + } + + return ret; + } + + } + +} diff --git a/OnTopReplica/HotKeyTextBox.cs b/src/OnTopReplica/HotKeyTextBox.cs similarity index 96% rename from OnTopReplica/HotKeyTextBox.cs rename to src/OnTopReplica/HotKeyTextBox.cs index 9abcead..0be9f39 100644 --- a/OnTopReplica/HotKeyTextBox.cs +++ b/src/OnTopReplica/HotKeyTextBox.cs @@ -1,56 +1,56 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Windows.Forms; - -namespace OnTopReplica { - - class HotKeyTextBox : TextBox { - - protected override void OnCreateControl() { - ReadOnly = true; - - base.OnCreateControl(); - } - - readonly Keys[] IgnoredKeys = new Keys[] { - Keys.ControlKey, - Keys.Control, - Keys.Alt, - Keys.Menu, - Keys.ShiftKey, - Keys.Shift, - Keys.LWin, - Keys.RWin - }; - - readonly Keys[] CancelKeys = new Keys[] { - Keys.Back, - Keys.Escape - }; - - protected override void OnKeyUp(KeyEventArgs e) { - if (CancelKeys.Contains(e.KeyCode)) { - Text = string.Empty; - } - else if (!IgnoredKeys.Contains(e.KeyCode)) { - var sb = new StringBuilder(); - if (e.Control) - sb.Append("[CTRL]+"); - if (e.Alt) - sb.Append("[ALT]+"); - if (e.Shift) - sb.Append("[SHIFT]+"); - sb.Append(e.KeyCode.ToString()); - - Text = sb.ToString(); - } - - e.Handled = true; - base.OnKeyUp(e); - } - - } - -} +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Windows.Forms; + +namespace OnTopReplica { + + class HotKeyTextBox : TextBox { + + protected override void OnCreateControl() { + ReadOnly = true; + + base.OnCreateControl(); + } + + readonly Keys[] IgnoredKeys = new Keys[] { + Keys.ControlKey, + Keys.Control, + Keys.Alt, + Keys.Menu, + Keys.ShiftKey, + Keys.Shift, + Keys.LWin, + Keys.RWin + }; + + readonly Keys[] CancelKeys = new Keys[] { + Keys.Back, + Keys.Escape + }; + + protected override void OnKeyUp(KeyEventArgs e) { + if (CancelKeys.Contains(e.KeyCode)) { + Text = string.Empty; + } + else if (!IgnoredKeys.Contains(e.KeyCode)) { + var sb = new StringBuilder(); + if (e.Control) + sb.Append("[CTRL]+"); + if (e.Alt) + sb.Append("[ALT]+"); + if (e.Shift) + sb.Append("[SHIFT]+"); + sb.Append(e.KeyCode.ToString()); + + Text = sb.ToString(); + } + + e.Handled = true; + base.OnKeyUp(e); + } + + } + +} diff --git a/OnTopReplica/IMessagePumpProcessor.cs b/src/OnTopReplica/IMessagePumpProcessor.cs similarity index 94% rename from OnTopReplica/IMessagePumpProcessor.cs rename to src/OnTopReplica/IMessagePumpProcessor.cs index 824b9e5..1bd6078 100644 --- a/OnTopReplica/IMessagePumpProcessor.cs +++ b/src/OnTopReplica/IMessagePumpProcessor.cs @@ -1,15 +1,15 @@ -using System; -using System.Collections.Generic; -using System.Text; -using System.Windows.Forms; - -namespace OnTopReplica { - - interface IMessagePumpProcessor : IDisposable { - - void Initialize(MainForm form); - - bool Process(ref Message msg); - - } -} +using System; +using System.Collections.Generic; +using System.Text; +using System.Windows.Forms; + +namespace OnTopReplica { + + interface IMessagePumpProcessor : IDisposable { + + void Initialize(MainForm form); + + bool Process(ref Message msg); + + } +} diff --git a/OnTopReplica/ImageComboBox.cs b/src/OnTopReplica/ImageComboBox.cs similarity index 96% rename from OnTopReplica/ImageComboBox.cs rename to src/OnTopReplica/ImageComboBox.cs index c68522f..de809e3 100644 --- a/OnTopReplica/ImageComboBox.cs +++ b/src/OnTopReplica/ImageComboBox.cs @@ -1,77 +1,77 @@ -using System; -using System.Collections.Generic; -using System.Text; -using System.Windows.Forms; -using System.Drawing; - -namespace OnTopReplica { - class ImageComboBox : ComboBox { - - public ImageComboBox() { - DrawMode = DrawMode.OwnerDrawFixed; - } - - protected override void OnDrawItem(DrawItemEventArgs ea) { - ea.DrawBackground(); - ea.DrawFocusRectangle(); - - if (ea.Index == -1) - return; - - Rectangle bounds = ea.Bounds; - var foreBrush = new SolidBrush(ea.ForeColor); - int textLeftBound = (IconList == null) ? bounds.Left : bounds.Left + IconList.ImageSize.Width; - - var drawObject = Items[ea.Index]; - if (drawObject is ImageComboBoxItem) { - var drawItem = (ImageComboBoxItem)drawObject; - - if (drawItem.ImageListIndex != -1 && IconList != null) { - //ea.Graphics.FillRectangle(Brushes.Gray, bounds.Left, bounds.Top, IconList.ImageSize.Width, IconList.ImageSize.Height); - ea.Graphics.DrawImage(IconList.Images[drawItem.ImageListIndex], bounds.Left, bounds.Top); - } - - ea.Graphics.DrawString(drawItem.Text, ea.Font, foreBrush, textLeftBound, bounds.Top); - } - else { - ea.Graphics.DrawString(drawObject.ToString(), ea.Font, foreBrush, textLeftBound, bounds.Top); - } - - base.OnDrawItem(ea); - } - - public ImageList IconList { get; set; } - - } - - class ImageComboBoxItem { - - public ImageComboBoxItem() { - Text = ""; - ImageListIndex = -1; - } - - public ImageComboBoxItem(string text) { - if (text == null) - throw new ArgumentNullException(); - - Text = text; - ImageListIndex = -1; - } - - public ImageComboBoxItem(string text, int imageListIndex) { - if (text == null) - throw new ArgumentNullException(); - - Text = text; - ImageListIndex = imageListIndex; - } - - public string Text { get; private set; } - - public int ImageListIndex { get; private set; } - - public object Tag { get; set; } - - } -} +using System; +using System.Collections.Generic; +using System.Text; +using System.Windows.Forms; +using System.Drawing; + +namespace OnTopReplica { + class ImageComboBox : ComboBox { + + public ImageComboBox() { + DrawMode = DrawMode.OwnerDrawFixed; + } + + protected override void OnDrawItem(DrawItemEventArgs ea) { + ea.DrawBackground(); + ea.DrawFocusRectangle(); + + if (ea.Index == -1) + return; + + Rectangle bounds = ea.Bounds; + var foreBrush = new SolidBrush(ea.ForeColor); + int textLeftBound = (IconList == null) ? bounds.Left : bounds.Left + IconList.ImageSize.Width; + + var drawObject = Items[ea.Index]; + if (drawObject is ImageComboBoxItem) { + var drawItem = (ImageComboBoxItem)drawObject; + + if (drawItem.ImageListIndex != -1 && IconList != null) { + //ea.Graphics.FillRectangle(Brushes.Gray, bounds.Left, bounds.Top, IconList.ImageSize.Width, IconList.ImageSize.Height); + ea.Graphics.DrawImage(IconList.Images[drawItem.ImageListIndex], bounds.Left, bounds.Top); + } + + ea.Graphics.DrawString(drawItem.Text, ea.Font, foreBrush, textLeftBound, bounds.Top); + } + else { + ea.Graphics.DrawString(drawObject.ToString(), ea.Font, foreBrush, textLeftBound, bounds.Top); + } + + base.OnDrawItem(ea); + } + + public ImageList IconList { get; set; } + + } + + class ImageComboBoxItem { + + public ImageComboBoxItem() { + Text = ""; + ImageListIndex = -1; + } + + public ImageComboBoxItem(string text) { + if (text == null) + throw new ArgumentNullException(); + + Text = text; + ImageListIndex = -1; + } + + public ImageComboBoxItem(string text, int imageListIndex) { + if (text == null) + throw new ArgumentNullException(); + + Text = text; + ImageListIndex = imageListIndex; + } + + public string Text { get; private set; } + + public int ImageListIndex { get; private set; } + + public object Tag { get; set; } + + } +} diff --git a/OnTopReplica/LICENSE.txt b/src/OnTopReplica/LICENSE.txt similarity index 98% rename from OnTopReplica/LICENSE.txt rename to src/OnTopReplica/LICENSE.txt index 78db0fb..f11a7fb 100644 --- a/OnTopReplica/LICENSE.txt +++ b/src/OnTopReplica/LICENSE.txt @@ -1,54 +1,54 @@ -Microsoft Reciprocal License (Ms-RL) - -This license governs use of the accompanying software. If you use the -software, you accept this license. If you do not accept the license, do not -use the software. - -1. Definitions -The terms "reproduce," "reproduction," "derivative works," and "distribution" -have the same meaning here as under U.S. copyright law. -A "contribution" is the original software, or any additions or changes to the -software. -A "contributor" is any person that distributes its contribution under this -license. -"Licensed patents" are a contributor's patent claims that read directly on its -contribution. - -2. Grant of Rights -(A) Copyright Grant- Subject to the terms of this license, including the -license conditions and limitations in section 3, each contributor grants you a -non-exclusive, worldwide, royalty-free copyright license to reproduce its -contribution, prepare derivative works of its contribution, and distribute its -contribution or any derivative works that you create. -(B) Patent Grant- Subject to the terms of this license, including the license -conditions and limitations in section 3, each contributor grants you a -non-exclusive, worldwide, royalty-free license under its licensed patents to -make, have made, use, sell, offer for sale, import, and/or otherwise dispose -of its contribution in the software or derivative works of the contribution -in the software. - -3. Conditions and Limitations -(A) Reciprocal Grants- For any file you distribute that contains code from the -software (in source code or binary format), you must provide recipients the -source code to that file along with a copy of this license, which license will -govern that file. You may license other files that are entirely your own work -and do not contain code from the software under any terms you choose. -(B) No Trademark License- This license does not grant you rights to use any -contributors' name, logo, or trademarks. -(C) If you bring a patent claim against any contributor over patents that you -claim are infringed by the software, your patent license from such contributor -to the software ends automatically. -(D) If you distribute any portion of the software, you must retain all -copyright, patent, trademark, and attribution notices that are present in the -software. -(E) If you distribute any portion of the software in source code form, you may -do so only under this license by including a complete copy of this license -with your distribution. If you distribute any portion of the software in -compiled or object code form, you may only do so under a license that complies -with this license. -(F) The software is licensed "as-is." You bear the risk of using it. The -contributors give no express warranties, guarantees or conditions. You may -have additional consumer rights under your local laws which this license -cannot change. To the extent permitted under your local laws, the contributors -exclude the implied warranties of merchantability, fitness for a particular -purpose and non-infringement. +Microsoft Reciprocal License (Ms-RL) + +This license governs use of the accompanying software. If you use the +software, you accept this license. If you do not accept the license, do not +use the software. + +1. Definitions +The terms "reproduce," "reproduction," "derivative works," and "distribution" +have the same meaning here as under U.S. copyright law. +A "contribution" is the original software, or any additions or changes to the +software. +A "contributor" is any person that distributes its contribution under this +license. +"Licensed patents" are a contributor's patent claims that read directly on its +contribution. + +2. Grant of Rights +(A) Copyright Grant- Subject to the terms of this license, including the +license conditions and limitations in section 3, each contributor grants you a +non-exclusive, worldwide, royalty-free copyright license to reproduce its +contribution, prepare derivative works of its contribution, and distribute its +contribution or any derivative works that you create. +(B) Patent Grant- Subject to the terms of this license, including the license +conditions and limitations in section 3, each contributor grants you a +non-exclusive, worldwide, royalty-free license under its licensed patents to +make, have made, use, sell, offer for sale, import, and/or otherwise dispose +of its contribution in the software or derivative works of the contribution +in the software. + +3. Conditions and Limitations +(A) Reciprocal Grants- For any file you distribute that contains code from the +software (in source code or binary format), you must provide recipients the +source code to that file along with a copy of this license, which license will +govern that file. You may license other files that are entirely your own work +and do not contain code from the software under any terms you choose. +(B) No Trademark License- This license does not grant you rights to use any +contributors' name, logo, or trademarks. +(C) If you bring a patent claim against any contributor over patents that you +claim are infringed by the software, your patent license from such contributor +to the software ends automatically. +(D) If you distribute any portion of the software, you must retain all +copyright, patent, trademark, and attribution notices that are present in the +software. +(E) If you distribute any portion of the software in source code form, you may +do so only under this license by including a complete copy of this license +with your distribution. If you distribute any portion of the software in +compiled or object code form, you may only do so under a license that complies +with this license. +(F) The software is licensed "as-is." You bear the risk of using it. The +contributors give no express warranties, guarantees or conditions. You may +have additional consumer rights under your local laws which this license +cannot change. To the extent permitted under your local laws, the contributors +exclude the implied warranties of merchantability, fitness for a particular +purpose and non-infringement. diff --git a/OnTopReplica/Log.cs b/src/OnTopReplica/Log.cs similarity index 96% rename from OnTopReplica/Log.cs rename to src/OnTopReplica/Log.cs index 104ed40..19553d2 100644 --- a/OnTopReplica/Log.cs +++ b/src/OnTopReplica/Log.cs @@ -1,109 +1,109 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Text; - -namespace OnTopReplica { - static class Log { - - const string LogFileName = "lastrun.log.txt"; - const string ConflictLogFileName = "run-{0}.log.txt"; - - private readonly static StreamWriter Writer; - - static Log() { - try { - var filepath = Path.Combine(AppPaths.PrivateRoamingFolderPath, LogFileName); - Writer = new StreamWriter(new FileStream(filepath, FileMode.Create)); - Writer.AutoFlush = true; - } - catch (Exception) { - try { - var filepath = Path.Combine(AppPaths.PrivateRoamingFolderPath, string.Format(ConflictLogFileName, System.Diagnostics.Process.GetCurrentProcess().Id)); - Writer = new StreamWriter(new FileStream(filepath, FileMode.Create)); - Writer.AutoFlush = true; - } - catch (Exception) { - //No fallback logging possible - Writer = null; - } - } - } - - public static void Write(string message) { - WriteLine(message); - } - - public static void Write(string format, object arg0) { - WriteLine(string.Format(format, arg0)); - } - - public static void Write(string format, object arg0, object arg1) { - WriteLine(string.Format(format, arg0, arg1)); - } - - public static void Write(string format, params object[] args) { - WriteLine(string.Format(format, args)); - } - - public static void WriteDetails(string caption, string format, params object[] args) { - WriteLines(caption, string.Format(format, args)); - } - - public static void WriteException(string message, Exception exception) { - if (exception != null) { - WriteLines(message, exception.ToString()); - } - else { - WriteLines(message, "(No exception data.)"); - } - } - - private static void WriteLine(string message) { - var s = string.Format("{0,-8:HH:mm:ss} {1}", DateTime.Now, message); - AddToQueue(s); - - if (Writer != null) { - Writer.WriteLine(s); - } - } - - private static void WriteLines(params string[] messages) { - if (messages.Length <= 0) - return; - - var sb = new StringBuilder(); - sb.AppendFormat("{0,-8:HH:mm:ss} {1}", DateTime.Now, messages[0]); - for (int i = 1; i < messages.Length; ++i) { - sb.AppendLine(); - sb.AppendFormat(" {0}", messages[i]); - } - - AddToQueue(sb.ToString()); - - if (Writer != null) { - Writer.WriteLine(sb.ToString()); - } - } - - const int MaxQueueCapacity = 30; - - private static Queue _entriesQueue = new Queue(MaxQueueCapacity); - - private static void AddToQueue(string entry){ - _entriesQueue.Enqueue(entry); - - while(_entriesQueue.Count > MaxQueueCapacity){ - _entriesQueue.Dequeue(); - } - } - - public static IEnumerable Queue { - get { - return _entriesQueue; - } - } - - } -} +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; + +namespace OnTopReplica { + static class Log { + + const string LogFileName = "lastrun.log.txt"; + const string ConflictLogFileName = "run-{0}.log.txt"; + + private readonly static StreamWriter Writer; + + static Log() { + try { + var filepath = Path.Combine(AppPaths.PrivateRoamingFolderPath, LogFileName); + Writer = new StreamWriter(new FileStream(filepath, FileMode.Create)); + Writer.AutoFlush = true; + } + catch (Exception) { + try { + var filepath = Path.Combine(AppPaths.PrivateRoamingFolderPath, string.Format(ConflictLogFileName, System.Diagnostics.Process.GetCurrentProcess().Id)); + Writer = new StreamWriter(new FileStream(filepath, FileMode.Create)); + Writer.AutoFlush = true; + } + catch (Exception) { + //No fallback logging possible + Writer = null; + } + } + } + + public static void Write(string message) { + WriteLine(message); + } + + public static void Write(string format, object arg0) { + WriteLine(string.Format(format, arg0)); + } + + public static void Write(string format, object arg0, object arg1) { + WriteLine(string.Format(format, arg0, arg1)); + } + + public static void Write(string format, params object[] args) { + WriteLine(string.Format(format, args)); + } + + public static void WriteDetails(string caption, string format, params object[] args) { + WriteLines(caption, string.Format(format, args)); + } + + public static void WriteException(string message, Exception exception) { + if (exception != null) { + WriteLines(message, exception.ToString()); + } + else { + WriteLines(message, "(No exception data.)"); + } + } + + private static void WriteLine(string message) { + var s = string.Format("{0,-8:HH:mm:ss} {1}", DateTime.Now, message); + AddToQueue(s); + + if (Writer != null) { + Writer.WriteLine(s); + } + } + + private static void WriteLines(params string[] messages) { + if (messages.Length <= 0) + return; + + var sb = new StringBuilder(); + sb.AppendFormat("{0,-8:HH:mm:ss} {1}", DateTime.Now, messages[0]); + for (int i = 1; i < messages.Length; ++i) { + sb.AppendLine(); + sb.AppendFormat(" {0}", messages[i]); + } + + AddToQueue(sb.ToString()); + + if (Writer != null) { + Writer.WriteLine(sb.ToString()); + } + } + + const int MaxQueueCapacity = 30; + + private static Queue _entriesQueue = new Queue(MaxQueueCapacity); + + private static void AddToQueue(string entry){ + _entriesQueue.Enqueue(entry); + + while(_entriesQueue.Count > MaxQueueCapacity){ + _entriesQueue.Dequeue(); + } + } + + public static IEnumerable Queue { + get { + return _entriesQueue; + } + } + + } +} diff --git a/OnTopReplica/MainForm.Designer.cs b/src/OnTopReplica/MainForm.Designer.cs similarity index 98% rename from OnTopReplica/MainForm.Designer.cs rename to src/OnTopReplica/MainForm.Designer.cs index 99d1f76..9094761 100644 --- a/OnTopReplica/MainForm.Designer.cs +++ b/src/OnTopReplica/MainForm.Designer.cs @@ -1,601 +1,601 @@ -namespace OnTopReplica -{ - partial class MainForm - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) { - if (disposing && (components != null)) { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Windows Form Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() { - this.components = new System.ComponentModel.Container(); - System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(MainForm)); - this.menuContext = new System.Windows.Forms.ContextMenuStrip(this.components); - this.menuContextWindows = new System.Windows.Forms.ToolStripMenuItem(); - this.menuWindows = new System.Windows.Forms.ContextMenuStrip(this.components); - this.noneToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.switchToWindowToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.selectRegionToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.advancedToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.clickForwardingToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.clickThroughToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.groupSwitchModeToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.restoreLastClonedWindowToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.menuContextOpacity = new System.Windows.Forms.ToolStripMenuItem(); - this.menuOpacity = new System.Windows.Forms.ContextMenuStrip(this.components); - this.toolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripMenuItem2 = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripMenuItem3 = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripMenuItem4 = new System.Windows.Forms.ToolStripMenuItem(); - this.resizeToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.menuResize = new System.Windows.Forms.ContextMenuStrip(this.components); - this.doubleToolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem(); - this.fitToWindowToolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem(); - this.halfToolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem(); - this.quarterToolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripSeparator3 = new System.Windows.Forms.ToolStripSeparator(); - this.fullscreenToolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripSeparator2 = new System.Windows.Forms.ToolStripSeparator(); - this.restorePositionAndSizeToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.dockToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.disabledToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.topLeftToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.topRightToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.centerToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.bottomLeftToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.bottomRightToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.chromeToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.reduceToIconToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator(); - this.settingsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.aboutToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.menuContextClose = new System.Windows.Forms.ToolStripMenuItem(); - this.fullOpacityToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.fullSelectWindowToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.menuFullscreenContext = new System.Windows.Forms.ContextMenuStrip(this.components); - this.modeToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.menuModeStandardToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.menuModeFullscreenToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.menuModeAllScreensToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.enableClickthroughToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.fullExitToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.menuContext.SuspendLayout(); - this.menuWindows.SuspendLayout(); - this.menuOpacity.SuspendLayout(); - this.menuResize.SuspendLayout(); - this.menuFullscreenContext.SuspendLayout(); - this.SuspendLayout(); - // - // menuContext - // - this.menuContext.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.menuContextWindows, - this.switchToWindowToolStripMenuItem, - this.selectRegionToolStripMenuItem, - this.advancedToolStripMenuItem, - this.menuContextOpacity, - this.resizeToolStripMenuItem, - this.dockToolStripMenuItem, - this.chromeToolStripMenuItem, - this.reduceToIconToolStripMenuItem, - this.toolStripSeparator1, - this.settingsToolStripMenuItem, - this.aboutToolStripMenuItem, - this.menuContextClose}); - this.menuContext.Name = "menuContext"; - this.menuContext.Size = new System.Drawing.Size(187, 274); - this.menuContext.Opening += new System.ComponentModel.CancelEventHandler(this.Menu_opening); - // - // menuContextWindows - // - this.menuContextWindows.DropDown = this.menuWindows; - this.menuContextWindows.Image = global::OnTopReplica.Properties.Resources.list; - this.menuContextWindows.Name = "menuContextWindows"; - this.menuContextWindows.Size = new System.Drawing.Size(186, 22); - this.menuContextWindows.Text = global::OnTopReplica.Strings.MenuWindows; - this.menuContextWindows.ToolTipText = global::OnTopReplica.Strings.MenuWindowsTT; - // - // menuWindows - // - this.menuWindows.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.noneToolStripMenuItem}); - this.menuWindows.Name = "menuWindows"; - this.menuWindows.OwnerItem = this.fullSelectWindowToolStripMenuItem; - this.menuWindows.Size = new System.Drawing.Size(118, 26); - // - // noneToolStripMenuItem - // - this.noneToolStripMenuItem.Name = "noneToolStripMenuItem"; - this.noneToolStripMenuItem.Size = new System.Drawing.Size(117, 22); - this.noneToolStripMenuItem.Text = global::OnTopReplica.Strings.MenuWindowsNone; - // - // switchToWindowToolStripMenuItem - // - this.switchToWindowToolStripMenuItem.Image = global::OnTopReplica.Properties.Resources.xiao_arrow; - this.switchToWindowToolStripMenuItem.Name = "switchToWindowToolStripMenuItem"; - this.switchToWindowToolStripMenuItem.Size = new System.Drawing.Size(186, 22); - this.switchToWindowToolStripMenuItem.Text = global::OnTopReplica.Strings.MenuSwitch; - this.switchToWindowToolStripMenuItem.ToolTipText = global::OnTopReplica.Strings.MenuSwitchTT; - this.switchToWindowToolStripMenuItem.Click += new System.EventHandler(this.Menu_Switch_click); - // - // selectRegionToolStripMenuItem - // - this.selectRegionToolStripMenuItem.Enabled = false; - this.selectRegionToolStripMenuItem.Image = global::OnTopReplica.Properties.Resources.regions; - this.selectRegionToolStripMenuItem.Name = "selectRegionToolStripMenuItem"; - this.selectRegionToolStripMenuItem.Size = new System.Drawing.Size(186, 22); - this.selectRegionToolStripMenuItem.Text = global::OnTopReplica.Strings.MenuRegion; - this.selectRegionToolStripMenuItem.ToolTipText = global::OnTopReplica.Strings.MenuRegionTT; - this.selectRegionToolStripMenuItem.Click += new System.EventHandler(this.Menu_Region_click); - // - // advancedToolStripMenuItem - // - this.advancedToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.clickForwardingToolStripMenuItem, - this.clickThroughToolStripMenuItem, - this.groupSwitchModeToolStripMenuItem, - this.restoreLastClonedWindowToolStripMenuItem}); - this.advancedToolStripMenuItem.Image = global::OnTopReplica.Properties.Resources.xiao_wrench; - this.advancedToolStripMenuItem.Name = "advancedToolStripMenuItem"; - this.advancedToolStripMenuItem.Size = new System.Drawing.Size(186, 22); - this.advancedToolStripMenuItem.Text = global::OnTopReplica.Strings.MenuAdvanced; - this.advancedToolStripMenuItem.DropDownOpening += new System.EventHandler(this.Menu_Advanced_opening); - // - // clickForwardingToolStripMenuItem - // - this.clickForwardingToolStripMenuItem.Image = global::OnTopReplica.Properties.Resources.clickforwarding; - this.clickForwardingToolStripMenuItem.Name = "clickForwardingToolStripMenuItem"; - this.clickForwardingToolStripMenuItem.Size = new System.Drawing.Size(218, 22); - this.clickForwardingToolStripMenuItem.Text = global::OnTopReplica.Strings.MenuClickForwarding; - this.clickForwardingToolStripMenuItem.ToolTipText = global::OnTopReplica.Strings.MenuClickForwardingTT; - this.clickForwardingToolStripMenuItem.Click += new System.EventHandler(this.Menu_ClickForwarding_click); - // - // clickThroughToolStripMenuItem - // - this.clickThroughToolStripMenuItem.Image = global::OnTopReplica.Properties.Resources.window_opacity; - this.clickThroughToolStripMenuItem.Name = "clickThroughToolStripMenuItem"; - this.clickThroughToolStripMenuItem.Size = new System.Drawing.Size(218, 22); - this.clickThroughToolStripMenuItem.Text = global::OnTopReplica.Strings.MenuClickThrough; - this.clickThroughToolStripMenuItem.ToolTipText = global::OnTopReplica.Strings.MenuClickThroughTT; - this.clickThroughToolStripMenuItem.Click += new System.EventHandler(this.Menu_ClickThrough_click); - // - // groupSwitchModeToolStripMenuItem - // - this.groupSwitchModeToolStripMenuItem.Image = global::OnTopReplica.Properties.Resources.groupmode; - this.groupSwitchModeToolStripMenuItem.Name = "groupSwitchModeToolStripMenuItem"; - this.groupSwitchModeToolStripMenuItem.Size = new System.Drawing.Size(218, 22); - this.groupSwitchModeToolStripMenuItem.Text = global::OnTopReplica.Strings.MenuGroupSwitch; - this.groupSwitchModeToolStripMenuItem.ToolTipText = global::OnTopReplica.Strings.MenuGroupSwitchTT; - this.groupSwitchModeToolStripMenuItem.Click += new System.EventHandler(this.Menu_GroupSwitchMode_click); - // - // restoreLastClonedWindowToolStripMenuItem - // - this.restoreLastClonedWindowToolStripMenuItem.Name = "restoreLastClonedWindowToolStripMenuItem"; - this.restoreLastClonedWindowToolStripMenuItem.Size = new System.Drawing.Size(218, 22); - this.restoreLastClonedWindowToolStripMenuItem.Text = global::OnTopReplica.Strings.MenuRestoreLast; - this.restoreLastClonedWindowToolStripMenuItem.ToolTipText = global::OnTopReplica.Strings.MenuRestoreLastTT; - this.restoreLastClonedWindowToolStripMenuItem.Click += new System.EventHandler(this.Menu_RestoreLastWindow_click); - // - // menuContextOpacity - // - this.menuContextOpacity.DropDown = this.menuOpacity; - this.menuContextOpacity.Image = global::OnTopReplica.Properties.Resources.window_opacity; - this.menuContextOpacity.Name = "menuContextOpacity"; - this.menuContextOpacity.Size = new System.Drawing.Size(186, 22); - this.menuContextOpacity.Text = global::OnTopReplica.Strings.MenuOpacity; - // - // menuOpacity - // - this.menuOpacity.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.toolStripMenuItem1, - this.toolStripMenuItem2, - this.toolStripMenuItem3, - this.toolStripMenuItem4}); - this.menuOpacity.Name = "menuOpacity"; - this.menuOpacity.OwnerItem = this.fullOpacityToolStripMenuItem; - this.menuOpacity.ShowCheckMargin = true; - this.menuOpacity.ShowImageMargin = false; - this.menuOpacity.Size = new System.Drawing.Size(154, 92); - this.menuOpacity.Opening += new System.ComponentModel.CancelEventHandler(this.Menu_Opacity_opening); - // - // toolStripMenuItem1 - // - this.toolStripMenuItem1.Checked = true; - this.toolStripMenuItem1.CheckState = System.Windows.Forms.CheckState.Checked; - this.toolStripMenuItem1.Name = "toolStripMenuItem1"; - this.toolStripMenuItem1.Size = new System.Drawing.Size(153, 22); - this.toolStripMenuItem1.Tag = 1D; - this.toolStripMenuItem1.Text = global::OnTopReplica.Strings.MenuOp100; - this.toolStripMenuItem1.ToolTipText = global::OnTopReplica.Strings.MenuOp100TT; - this.toolStripMenuItem1.Click += new System.EventHandler(this.Menu_Opacity_click); - // - // toolStripMenuItem2 - // - this.toolStripMenuItem2.Name = "toolStripMenuItem2"; - this.toolStripMenuItem2.Size = new System.Drawing.Size(153, 22); - this.toolStripMenuItem2.Tag = 0.75D; - this.toolStripMenuItem2.Text = global::OnTopReplica.Strings.MenuOp75; - this.toolStripMenuItem2.ToolTipText = global::OnTopReplica.Strings.MenuOp75TT; - this.toolStripMenuItem2.Click += new System.EventHandler(this.Menu_Opacity_click); - // - // toolStripMenuItem3 - // - this.toolStripMenuItem3.Name = "toolStripMenuItem3"; - this.toolStripMenuItem3.Size = new System.Drawing.Size(153, 22); - this.toolStripMenuItem3.Tag = 0.5D; - this.toolStripMenuItem3.Text = global::OnTopReplica.Strings.MenuOp50; - this.toolStripMenuItem3.ToolTipText = global::OnTopReplica.Strings.MenuOp50TT; - this.toolStripMenuItem3.Click += new System.EventHandler(this.Menu_Opacity_click); - // - // toolStripMenuItem4 - // - this.toolStripMenuItem4.Name = "toolStripMenuItem4"; - this.toolStripMenuItem4.Size = new System.Drawing.Size(153, 22); - this.toolStripMenuItem4.Tag = 0.25D; - this.toolStripMenuItem4.Text = global::OnTopReplica.Strings.MenuOp25; - this.toolStripMenuItem4.ToolTipText = global::OnTopReplica.Strings.MenuOp25TT; - this.toolStripMenuItem4.Click += new System.EventHandler(this.Menu_Opacity_click); - // - // resizeToolStripMenuItem - // - this.resizeToolStripMenuItem.DropDown = this.menuResize; - this.resizeToolStripMenuItem.Enabled = false; - this.resizeToolStripMenuItem.Name = "resizeToolStripMenuItem"; - this.resizeToolStripMenuItem.Size = new System.Drawing.Size(186, 22); - this.resizeToolStripMenuItem.Text = global::OnTopReplica.Strings.MenuResize; - // - // menuResize - // - this.menuResize.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.doubleToolStripMenuItem1, - this.fitToWindowToolStripMenuItem1, - this.halfToolStripMenuItem1, - this.quarterToolStripMenuItem1, - this.toolStripSeparator3, - this.fullscreenToolStripMenuItem1, - this.toolStripSeparator2, - this.restorePositionAndSizeToolStripMenuItem}); - this.menuResize.Name = "menuResize"; - this.menuResize.OwnerItem = this.resizeToolStripMenuItem; - this.menuResize.Size = new System.Drawing.Size(218, 148); - this.menuResize.Opening += new System.ComponentModel.CancelEventHandler(this.Menu_Resize_opening); - // - // doubleToolStripMenuItem1 - // - this.doubleToolStripMenuItem1.Name = "doubleToolStripMenuItem1"; - this.doubleToolStripMenuItem1.Size = new System.Drawing.Size(217, 22); - this.doubleToolStripMenuItem1.Text = global::OnTopReplica.Strings.MenuFitDouble; - this.doubleToolStripMenuItem1.Click += new System.EventHandler(this.Menu_Resize_Double); - // - // fitToWindowToolStripMenuItem1 - // - this.fitToWindowToolStripMenuItem1.Name = "fitToWindowToolStripMenuItem1"; - this.fitToWindowToolStripMenuItem1.Size = new System.Drawing.Size(217, 22); - this.fitToWindowToolStripMenuItem1.Text = global::OnTopReplica.Strings.MenuFitOriginal; - this.fitToWindowToolStripMenuItem1.Click += new System.EventHandler(this.Menu_Resize_FitToWindow); - // - // halfToolStripMenuItem1 - // - this.halfToolStripMenuItem1.Name = "halfToolStripMenuItem1"; - this.halfToolStripMenuItem1.Size = new System.Drawing.Size(217, 22); - this.halfToolStripMenuItem1.Text = global::OnTopReplica.Strings.MenuFitHalf; - this.halfToolStripMenuItem1.Click += new System.EventHandler(this.Menu_Resize_Half); - // - // quarterToolStripMenuItem1 - // - this.quarterToolStripMenuItem1.Name = "quarterToolStripMenuItem1"; - this.quarterToolStripMenuItem1.Size = new System.Drawing.Size(217, 22); - this.quarterToolStripMenuItem1.Text = global::OnTopReplica.Strings.MenuFitQuarter; - this.quarterToolStripMenuItem1.Click += new System.EventHandler(this.Menu_Resize_Quarter); - // - // toolStripSeparator3 - // - this.toolStripSeparator3.Name = "toolStripSeparator3"; - this.toolStripSeparator3.Size = new System.Drawing.Size(214, 6); - // - // fullscreenToolStripMenuItem1 - // - this.fullscreenToolStripMenuItem1.Image = global::OnTopReplica.Properties.Resources.fullscreen; - this.fullscreenToolStripMenuItem1.Name = "fullscreenToolStripMenuItem1"; - this.fullscreenToolStripMenuItem1.Size = new System.Drawing.Size(217, 22); - this.fullscreenToolStripMenuItem1.Text = global::OnTopReplica.Strings.MenuFitFullscreen; - this.fullscreenToolStripMenuItem1.Click += new System.EventHandler(this.Menu_Resize_Fullscreen); - // - // toolStripSeparator2 - // - this.toolStripSeparator2.Name = "toolStripSeparator2"; - this.toolStripSeparator2.Size = new System.Drawing.Size(214, 6); - // - // restorePositionAndSizeToolStripMenuItem - // - this.restorePositionAndSizeToolStripMenuItem.Name = "restorePositionAndSizeToolStripMenuItem"; - this.restorePositionAndSizeToolStripMenuItem.Size = new System.Drawing.Size(217, 22); - this.restorePositionAndSizeToolStripMenuItem.Text = global::OnTopReplica.Strings.MenuRecall; - this.restorePositionAndSizeToolStripMenuItem.ToolTipText = global::OnTopReplica.Strings.MenuRecallTT; - this.restorePositionAndSizeToolStripMenuItem.Click += new System.EventHandler(this.Menu_Resize_RecallPosition_click); - // - // dockToolStripMenuItem - // - this.dockToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.disabledToolStripMenuItem, - this.topLeftToolStripMenuItem, - this.topRightToolStripMenuItem, - this.centerToolStripMenuItem, - this.bottomLeftToolStripMenuItem, - this.bottomRightToolStripMenuItem}); - this.dockToolStripMenuItem.Image = global::OnTopReplica.Properties.Resources.pos_null; - this.dockToolStripMenuItem.Name = "dockToolStripMenuItem"; - this.dockToolStripMenuItem.Size = new System.Drawing.Size(186, 22); - this.dockToolStripMenuItem.Text = global::OnTopReplica.Strings.MenuPosition; - this.dockToolStripMenuItem.ToolTipText = global::OnTopReplica.Strings.MenuPositionTT; - this.dockToolStripMenuItem.DropDownOpening += new System.EventHandler(this.Menu_Position_Opening); - // - // disabledToolStripMenuItem - // - this.disabledToolStripMenuItem.Checked = true; - this.disabledToolStripMenuItem.CheckState = System.Windows.Forms.CheckState.Checked; - this.disabledToolStripMenuItem.Name = "disabledToolStripMenuItem"; - this.disabledToolStripMenuItem.Size = new System.Drawing.Size(145, 22); - this.disabledToolStripMenuItem.Text = global::OnTopReplica.Strings.MenuPosDisabled; - this.disabledToolStripMenuItem.Click += new System.EventHandler(this.Menu_Position_Disable); - // - // topLeftToolStripMenuItem - // - this.topLeftToolStripMenuItem.Image = global::OnTopReplica.Properties.Resources.pos_topleft; - this.topLeftToolStripMenuItem.Name = "topLeftToolStripMenuItem"; - this.topLeftToolStripMenuItem.Size = new System.Drawing.Size(145, 22); - this.topLeftToolStripMenuItem.Text = global::OnTopReplica.Strings.MenuPosTopLeft; - this.topLeftToolStripMenuItem.Click += new System.EventHandler(this.Menu_Position_TopLeft); - // - // topRightToolStripMenuItem - // - this.topRightToolStripMenuItem.Image = global::OnTopReplica.Properties.Resources.pos_topright; - this.topRightToolStripMenuItem.Name = "topRightToolStripMenuItem"; - this.topRightToolStripMenuItem.Size = new System.Drawing.Size(145, 22); - this.topRightToolStripMenuItem.Text = global::OnTopReplica.Strings.MenuPosTopRight; - this.topRightToolStripMenuItem.Click += new System.EventHandler(this.Menu_Position_TopRight); - // - // centerToolStripMenuItem - // - this.centerToolStripMenuItem.Image = global::OnTopReplica.Properties.Resources.pos_center; - this.centerToolStripMenuItem.Name = "centerToolStripMenuItem"; - this.centerToolStripMenuItem.Size = new System.Drawing.Size(145, 22); - this.centerToolStripMenuItem.Text = global::OnTopReplica.Strings.MenuPosCenter; - this.centerToolStripMenuItem.Click += new System.EventHandler(this.Menu_Position_Center); - // - // bottomLeftToolStripMenuItem - // - this.bottomLeftToolStripMenuItem.Image = global::OnTopReplica.Properties.Resources.pos_bottomleft; - this.bottomLeftToolStripMenuItem.Name = "bottomLeftToolStripMenuItem"; - this.bottomLeftToolStripMenuItem.Size = new System.Drawing.Size(145, 22); - this.bottomLeftToolStripMenuItem.Text = global::OnTopReplica.Strings.MenuPosBottomLeft; - this.bottomLeftToolStripMenuItem.Click += new System.EventHandler(this.Menu_Position_BottomLeft); - // - // bottomRightToolStripMenuItem - // - this.bottomRightToolStripMenuItem.Image = global::OnTopReplica.Properties.Resources.pos_bottomright; - this.bottomRightToolStripMenuItem.Name = "bottomRightToolStripMenuItem"; - this.bottomRightToolStripMenuItem.Size = new System.Drawing.Size(145, 22); - this.bottomRightToolStripMenuItem.Text = global::OnTopReplica.Strings.MenuPosBottomRight; - this.bottomRightToolStripMenuItem.Click += new System.EventHandler(this.Menu_Position_BottomRight); - // - // chromeToolStripMenuItem - // - this.chromeToolStripMenuItem.Name = "chromeToolStripMenuItem"; - this.chromeToolStripMenuItem.Size = new System.Drawing.Size(186, 22); - this.chromeToolStripMenuItem.Text = global::OnTopReplica.Strings.MenuChrome; - this.chromeToolStripMenuItem.ToolTipText = global::OnTopReplica.Strings.MenuChromeTT; - this.chromeToolStripMenuItem.Click += new System.EventHandler(this.Menu_Chrome_click); - // - // reduceToIconToolStripMenuItem - // - this.reduceToIconToolStripMenuItem.Image = global::OnTopReplica.Properties.Resources.minimize; - this.reduceToIconToolStripMenuItem.Name = "reduceToIconToolStripMenuItem"; - this.reduceToIconToolStripMenuItem.Size = new System.Drawing.Size(186, 22); - this.reduceToIconToolStripMenuItem.Text = global::OnTopReplica.Strings.MenuReduce; - this.reduceToIconToolStripMenuItem.ToolTipText = global::OnTopReplica.Strings.MenuReduceTT; - this.reduceToIconToolStripMenuItem.Click += new System.EventHandler(this.Menu_Reduce_click); - // - // toolStripSeparator1 - // - this.toolStripSeparator1.Name = "toolStripSeparator1"; - this.toolStripSeparator1.Size = new System.Drawing.Size(183, 6); - // - // settingsToolStripMenuItem - // - this.settingsToolStripMenuItem.Name = "settingsToolStripMenuItem"; - this.settingsToolStripMenuItem.Size = new System.Drawing.Size(186, 22); - this.settingsToolStripMenuItem.Text = global::OnTopReplica.Strings.MenuSettings; - this.settingsToolStripMenuItem.ToolTipText = global::OnTopReplica.Strings.MenuSettingsTT; - this.settingsToolStripMenuItem.Click += new System.EventHandler(this.Menu_Settings_click); - // - // aboutToolStripMenuItem - // - this.aboutToolStripMenuItem.Image = global::OnTopReplica.Properties.Resources.help; - this.aboutToolStripMenuItem.Name = "aboutToolStripMenuItem"; - this.aboutToolStripMenuItem.Size = new System.Drawing.Size(186, 22); - this.aboutToolStripMenuItem.Text = global::OnTopReplica.Strings.MenuAbout; - this.aboutToolStripMenuItem.ToolTipText = global::OnTopReplica.Strings.MenuAboutTT; - this.aboutToolStripMenuItem.Click += new System.EventHandler(this.Menu_About_click); - // - // menuContextClose - // - this.menuContextClose.Image = global::OnTopReplica.Properties.Resources.close_new; - this.menuContextClose.Name = "menuContextClose"; - this.menuContextClose.Size = new System.Drawing.Size(186, 22); - this.menuContextClose.Text = global::OnTopReplica.Strings.MenuClose; - this.menuContextClose.Click += new System.EventHandler(this.Menu_Close_click); - // - // fullOpacityToolStripMenuItem - // - this.fullOpacityToolStripMenuItem.DropDown = this.menuOpacity; - this.fullOpacityToolStripMenuItem.Image = global::OnTopReplica.Properties.Resources.window_opacity; - this.fullOpacityToolStripMenuItem.Name = "fullOpacityToolStripMenuItem"; - this.fullOpacityToolStripMenuItem.Size = new System.Drawing.Size(189, 22); - this.fullOpacityToolStripMenuItem.Text = global::OnTopReplica.Strings.MenuOpacity; - // - // fullSelectWindowToolStripMenuItem - // - this.fullSelectWindowToolStripMenuItem.DropDown = this.menuWindows; - this.fullSelectWindowToolStripMenuItem.Image = global::OnTopReplica.Properties.Resources.list; - this.fullSelectWindowToolStripMenuItem.Name = "fullSelectWindowToolStripMenuItem"; - this.fullSelectWindowToolStripMenuItem.Size = new System.Drawing.Size(189, 22); - this.fullSelectWindowToolStripMenuItem.Text = global::OnTopReplica.Strings.MenuWindows; - this.fullSelectWindowToolStripMenuItem.ToolTipText = global::OnTopReplica.Strings.MenuWindowsTT; - // - // menuFullscreenContext - // - this.menuFullscreenContext.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.fullSelectWindowToolStripMenuItem, - this.modeToolStripMenuItem, - this.fullOpacityToolStripMenuItem, - this.enableClickthroughToolStripMenuItem, - this.fullExitToolStripMenuItem}); - this.menuFullscreenContext.Name = "menuFullscreenContext"; - this.menuFullscreenContext.Size = new System.Drawing.Size(190, 114); - // - // modeToolStripMenuItem - // - this.modeToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.menuModeStandardToolStripMenuItem, - this.menuModeFullscreenToolStripMenuItem, - this.menuModeAllScreensToolStripMenuItem}); - this.modeToolStripMenuItem.Name = "modeToolStripMenuItem"; - this.modeToolStripMenuItem.Size = new System.Drawing.Size(189, 22); - this.modeToolStripMenuItem.Text = "Mode"; - this.modeToolStripMenuItem.DropDownOpening += new System.EventHandler(this.Menu_Fullscreen_Mode_opening); - // - // menuModeStandardToolStripMenuItem - // - this.menuModeStandardToolStripMenuItem.Name = "menuModeStandardToolStripMenuItem"; - this.menuModeStandardToolStripMenuItem.Size = new System.Drawing.Size(130, 22); - this.menuModeStandardToolStripMenuItem.Text = "Standard"; - this.menuModeStandardToolStripMenuItem.Click += new System.EventHandler(this.Menu_Fullscreen_Mode_Standard_click); - // - // menuModeFullscreenToolStripMenuItem - // - this.menuModeFullscreenToolStripMenuItem.Name = "menuModeFullscreenToolStripMenuItem"; - this.menuModeFullscreenToolStripMenuItem.Size = new System.Drawing.Size(130, 22); - this.menuModeFullscreenToolStripMenuItem.Text = "Fullscreen"; - this.menuModeFullscreenToolStripMenuItem.Click += new System.EventHandler(this.Menu_Fullscreen_Mode_Fullscreen_click); - // - // menuModeAllScreensToolStripMenuItem - // - this.menuModeAllScreensToolStripMenuItem.Name = "menuModeAllScreensToolStripMenuItem"; - this.menuModeAllScreensToolStripMenuItem.Size = new System.Drawing.Size(130, 22); - this.menuModeAllScreensToolStripMenuItem.Text = "All screens"; - this.menuModeAllScreensToolStripMenuItem.Click += new System.EventHandler(this.Menu_Fullscreen_Mode_AllScreens_click); - // - // enableClickthroughToolStripMenuItem - // - this.enableClickthroughToolStripMenuItem.Image = global::OnTopReplica.Properties.Resources.clickforwarding; - this.enableClickthroughToolStripMenuItem.Name = "enableClickthroughToolStripMenuItem"; - this.enableClickthroughToolStripMenuItem.Size = new System.Drawing.Size(189, 22); - this.enableClickthroughToolStripMenuItem.Text = global::OnTopReplica.Strings.MenuClickThrough; - this.enableClickthroughToolStripMenuItem.ToolTipText = global::OnTopReplica.Strings.MenuClickThroughTT; - this.enableClickthroughToolStripMenuItem.Click += new System.EventHandler(this.Menu_ClickThrough_click); - // - // fullExitToolStripMenuItem - // - this.fullExitToolStripMenuItem.Image = global::OnTopReplica.Properties.Resources.close_new; - this.fullExitToolStripMenuItem.Name = "fullExitToolStripMenuItem"; - this.fullExitToolStripMenuItem.Size = new System.Drawing.Size(189, 22); - this.fullExitToolStripMenuItem.Text = global::OnTopReplica.Strings.MenuQuitFullscreen; - this.fullExitToolStripMenuItem.Click += new System.EventHandler(this.Menu_Fullscreen_ExitFullscreen_click); - // - // MainForm - // - this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 15F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.BackColor = System.Drawing.SystemColors.Control; - this.ClientSize = new System.Drawing.Size(326, 234); - this.ControlBox = false; - this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.SizableToolWindow; - this.HideCaption = true; - this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); - this.MaximizeBox = false; - this.MinimizeBox = false; - this.MinimumSize = new System.Drawing.Size(44, 44); - this.Name = "MainForm"; - this.Text = "OnTopReplica"; - this.TopMost = true; - this.menuContext.ResumeLayout(false); - this.menuWindows.ResumeLayout(false); - this.menuOpacity.ResumeLayout(false); - this.menuResize.ResumeLayout(false); - this.menuFullscreenContext.ResumeLayout(false); - this.ResumeLayout(false); - - } - - #endregion - - private System.Windows.Forms.ContextMenuStrip menuContext; - private System.Windows.Forms.ToolStripMenuItem menuContextWindows; - private System.Windows.Forms.ToolStripMenuItem menuContextClose; - private System.Windows.Forms.ContextMenuStrip menuWindows; - private System.Windows.Forms.ToolStripMenuItem menuContextOpacity; - private System.Windows.Forms.ToolStripSeparator toolStripSeparator1; - private System.Windows.Forms.ContextMenuStrip menuOpacity; - private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem1; - private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem2; - private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem3; - private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem4; - private System.Windows.Forms.ToolStripMenuItem aboutToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem reduceToIconToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem selectRegionToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem resizeToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem noneToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem switchToWindowToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem dockToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem topLeftToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem topRightToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem bottomLeftToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem bottomRightToolStripMenuItem; - private System.Windows.Forms.ContextMenuStrip menuResize; - private System.Windows.Forms.ToolStripMenuItem doubleToolStripMenuItem1; - private System.Windows.Forms.ToolStripMenuItem fitToWindowToolStripMenuItem1; - private System.Windows.Forms.ToolStripMenuItem halfToolStripMenuItem1; - private System.Windows.Forms.ToolStripMenuItem quarterToolStripMenuItem1; - private System.Windows.Forms.ToolStripMenuItem fullscreenToolStripMenuItem1; - private System.Windows.Forms.ToolStripSeparator toolStripSeparator3; - private System.Windows.Forms.ToolStripMenuItem chromeToolStripMenuItem; - private System.Windows.Forms.ContextMenuStrip menuFullscreenContext; - private System.Windows.Forms.ToolStripMenuItem fullSelectWindowToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem fullOpacityToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem fullExitToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem advancedToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem clickForwardingToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem clickThroughToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem groupSwitchModeToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem enableClickthroughToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem centerToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem disabledToolStripMenuItem; - private System.Windows.Forms.ToolStripSeparator toolStripSeparator2; - private System.Windows.Forms.ToolStripMenuItem restorePositionAndSizeToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem restoreLastClonedWindowToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem settingsToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem modeToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem menuModeStandardToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem menuModeFullscreenToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem menuModeAllScreensToolStripMenuItem; - } -} - +namespace OnTopReplica +{ + partial class MainForm + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) { + if (disposing && (components != null)) { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() { + this.components = new System.ComponentModel.Container(); + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(MainForm)); + this.menuContext = new System.Windows.Forms.ContextMenuStrip(this.components); + this.menuContextWindows = new System.Windows.Forms.ToolStripMenuItem(); + this.menuWindows = new System.Windows.Forms.ContextMenuStrip(this.components); + this.noneToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.switchToWindowToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.selectRegionToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.advancedToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.clickForwardingToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.clickThroughToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.groupSwitchModeToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.restoreLastClonedWindowToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.menuContextOpacity = new System.Windows.Forms.ToolStripMenuItem(); + this.menuOpacity = new System.Windows.Forms.ContextMenuStrip(this.components); + this.toolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItem2 = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItem3 = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItem4 = new System.Windows.Forms.ToolStripMenuItem(); + this.resizeToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.menuResize = new System.Windows.Forms.ContextMenuStrip(this.components); + this.doubleToolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem(); + this.fitToWindowToolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem(); + this.halfToolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem(); + this.quarterToolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator3 = new System.Windows.Forms.ToolStripSeparator(); + this.fullscreenToolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator2 = new System.Windows.Forms.ToolStripSeparator(); + this.restorePositionAndSizeToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.dockToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.disabledToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.topLeftToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.topRightToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.centerToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.bottomLeftToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.bottomRightToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.chromeToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.reduceToIconToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator(); + this.settingsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.aboutToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.menuContextClose = new System.Windows.Forms.ToolStripMenuItem(); + this.fullOpacityToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.fullSelectWindowToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.menuFullscreenContext = new System.Windows.Forms.ContextMenuStrip(this.components); + this.modeToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.menuModeStandardToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.menuModeFullscreenToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.menuModeAllScreensToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.enableClickthroughToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.fullExitToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.menuContext.SuspendLayout(); + this.menuWindows.SuspendLayout(); + this.menuOpacity.SuspendLayout(); + this.menuResize.SuspendLayout(); + this.menuFullscreenContext.SuspendLayout(); + this.SuspendLayout(); + // + // menuContext + // + this.menuContext.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.menuContextWindows, + this.switchToWindowToolStripMenuItem, + this.selectRegionToolStripMenuItem, + this.advancedToolStripMenuItem, + this.menuContextOpacity, + this.resizeToolStripMenuItem, + this.dockToolStripMenuItem, + this.chromeToolStripMenuItem, + this.reduceToIconToolStripMenuItem, + this.toolStripSeparator1, + this.settingsToolStripMenuItem, + this.aboutToolStripMenuItem, + this.menuContextClose}); + this.menuContext.Name = "menuContext"; + this.menuContext.Size = new System.Drawing.Size(187, 274); + this.menuContext.Opening += new System.ComponentModel.CancelEventHandler(this.Menu_opening); + // + // menuContextWindows + // + this.menuContextWindows.DropDown = this.menuWindows; + this.menuContextWindows.Image = global::OnTopReplica.Properties.Resources.list; + this.menuContextWindows.Name = "menuContextWindows"; + this.menuContextWindows.Size = new System.Drawing.Size(186, 22); + this.menuContextWindows.Text = global::OnTopReplica.Strings.MenuWindows; + this.menuContextWindows.ToolTipText = global::OnTopReplica.Strings.MenuWindowsTT; + // + // menuWindows + // + this.menuWindows.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.noneToolStripMenuItem}); + this.menuWindows.Name = "menuWindows"; + this.menuWindows.OwnerItem = this.fullSelectWindowToolStripMenuItem; + this.menuWindows.Size = new System.Drawing.Size(118, 26); + // + // noneToolStripMenuItem + // + this.noneToolStripMenuItem.Name = "noneToolStripMenuItem"; + this.noneToolStripMenuItem.Size = new System.Drawing.Size(117, 22); + this.noneToolStripMenuItem.Text = global::OnTopReplica.Strings.MenuWindowsNone; + // + // switchToWindowToolStripMenuItem + // + this.switchToWindowToolStripMenuItem.Image = global::OnTopReplica.Properties.Resources.xiao_arrow; + this.switchToWindowToolStripMenuItem.Name = "switchToWindowToolStripMenuItem"; + this.switchToWindowToolStripMenuItem.Size = new System.Drawing.Size(186, 22); + this.switchToWindowToolStripMenuItem.Text = global::OnTopReplica.Strings.MenuSwitch; + this.switchToWindowToolStripMenuItem.ToolTipText = global::OnTopReplica.Strings.MenuSwitchTT; + this.switchToWindowToolStripMenuItem.Click += new System.EventHandler(this.Menu_Switch_click); + // + // selectRegionToolStripMenuItem + // + this.selectRegionToolStripMenuItem.Enabled = false; + this.selectRegionToolStripMenuItem.Image = global::OnTopReplica.Properties.Resources.regions; + this.selectRegionToolStripMenuItem.Name = "selectRegionToolStripMenuItem"; + this.selectRegionToolStripMenuItem.Size = new System.Drawing.Size(186, 22); + this.selectRegionToolStripMenuItem.Text = global::OnTopReplica.Strings.MenuRegion; + this.selectRegionToolStripMenuItem.ToolTipText = global::OnTopReplica.Strings.MenuRegionTT; + this.selectRegionToolStripMenuItem.Click += new System.EventHandler(this.Menu_Region_click); + // + // advancedToolStripMenuItem + // + this.advancedToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.clickForwardingToolStripMenuItem, + this.clickThroughToolStripMenuItem, + this.groupSwitchModeToolStripMenuItem, + this.restoreLastClonedWindowToolStripMenuItem}); + this.advancedToolStripMenuItem.Image = global::OnTopReplica.Properties.Resources.xiao_wrench; + this.advancedToolStripMenuItem.Name = "advancedToolStripMenuItem"; + this.advancedToolStripMenuItem.Size = new System.Drawing.Size(186, 22); + this.advancedToolStripMenuItem.Text = global::OnTopReplica.Strings.MenuAdvanced; + this.advancedToolStripMenuItem.DropDownOpening += new System.EventHandler(this.Menu_Advanced_opening); + // + // clickForwardingToolStripMenuItem + // + this.clickForwardingToolStripMenuItem.Image = global::OnTopReplica.Properties.Resources.clickforwarding; + this.clickForwardingToolStripMenuItem.Name = "clickForwardingToolStripMenuItem"; + this.clickForwardingToolStripMenuItem.Size = new System.Drawing.Size(218, 22); + this.clickForwardingToolStripMenuItem.Text = global::OnTopReplica.Strings.MenuClickForwarding; + this.clickForwardingToolStripMenuItem.ToolTipText = global::OnTopReplica.Strings.MenuClickForwardingTT; + this.clickForwardingToolStripMenuItem.Click += new System.EventHandler(this.Menu_ClickForwarding_click); + // + // clickThroughToolStripMenuItem + // + this.clickThroughToolStripMenuItem.Image = global::OnTopReplica.Properties.Resources.window_opacity; + this.clickThroughToolStripMenuItem.Name = "clickThroughToolStripMenuItem"; + this.clickThroughToolStripMenuItem.Size = new System.Drawing.Size(218, 22); + this.clickThroughToolStripMenuItem.Text = global::OnTopReplica.Strings.MenuClickThrough; + this.clickThroughToolStripMenuItem.ToolTipText = global::OnTopReplica.Strings.MenuClickThroughTT; + this.clickThroughToolStripMenuItem.Click += new System.EventHandler(this.Menu_ClickThrough_click); + // + // groupSwitchModeToolStripMenuItem + // + this.groupSwitchModeToolStripMenuItem.Image = global::OnTopReplica.Properties.Resources.groupmode; + this.groupSwitchModeToolStripMenuItem.Name = "groupSwitchModeToolStripMenuItem"; + this.groupSwitchModeToolStripMenuItem.Size = new System.Drawing.Size(218, 22); + this.groupSwitchModeToolStripMenuItem.Text = global::OnTopReplica.Strings.MenuGroupSwitch; + this.groupSwitchModeToolStripMenuItem.ToolTipText = global::OnTopReplica.Strings.MenuGroupSwitchTT; + this.groupSwitchModeToolStripMenuItem.Click += new System.EventHandler(this.Menu_GroupSwitchMode_click); + // + // restoreLastClonedWindowToolStripMenuItem + // + this.restoreLastClonedWindowToolStripMenuItem.Name = "restoreLastClonedWindowToolStripMenuItem"; + this.restoreLastClonedWindowToolStripMenuItem.Size = new System.Drawing.Size(218, 22); + this.restoreLastClonedWindowToolStripMenuItem.Text = global::OnTopReplica.Strings.MenuRestoreLast; + this.restoreLastClonedWindowToolStripMenuItem.ToolTipText = global::OnTopReplica.Strings.MenuRestoreLastTT; + this.restoreLastClonedWindowToolStripMenuItem.Click += new System.EventHandler(this.Menu_RestoreLastWindow_click); + // + // menuContextOpacity + // + this.menuContextOpacity.DropDown = this.menuOpacity; + this.menuContextOpacity.Image = global::OnTopReplica.Properties.Resources.window_opacity; + this.menuContextOpacity.Name = "menuContextOpacity"; + this.menuContextOpacity.Size = new System.Drawing.Size(186, 22); + this.menuContextOpacity.Text = global::OnTopReplica.Strings.MenuOpacity; + // + // menuOpacity + // + this.menuOpacity.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.toolStripMenuItem1, + this.toolStripMenuItem2, + this.toolStripMenuItem3, + this.toolStripMenuItem4}); + this.menuOpacity.Name = "menuOpacity"; + this.menuOpacity.OwnerItem = this.fullOpacityToolStripMenuItem; + this.menuOpacity.ShowCheckMargin = true; + this.menuOpacity.ShowImageMargin = false; + this.menuOpacity.Size = new System.Drawing.Size(154, 92); + this.menuOpacity.Opening += new System.ComponentModel.CancelEventHandler(this.Menu_Opacity_opening); + // + // toolStripMenuItem1 + // + this.toolStripMenuItem1.Checked = true; + this.toolStripMenuItem1.CheckState = System.Windows.Forms.CheckState.Checked; + this.toolStripMenuItem1.Name = "toolStripMenuItem1"; + this.toolStripMenuItem1.Size = new System.Drawing.Size(153, 22); + this.toolStripMenuItem1.Tag = 1D; + this.toolStripMenuItem1.Text = global::OnTopReplica.Strings.MenuOp100; + this.toolStripMenuItem1.ToolTipText = global::OnTopReplica.Strings.MenuOp100TT; + this.toolStripMenuItem1.Click += new System.EventHandler(this.Menu_Opacity_click); + // + // toolStripMenuItem2 + // + this.toolStripMenuItem2.Name = "toolStripMenuItem2"; + this.toolStripMenuItem2.Size = new System.Drawing.Size(153, 22); + this.toolStripMenuItem2.Tag = 0.75D; + this.toolStripMenuItem2.Text = global::OnTopReplica.Strings.MenuOp75; + this.toolStripMenuItem2.ToolTipText = global::OnTopReplica.Strings.MenuOp75TT; + this.toolStripMenuItem2.Click += new System.EventHandler(this.Menu_Opacity_click); + // + // toolStripMenuItem3 + // + this.toolStripMenuItem3.Name = "toolStripMenuItem3"; + this.toolStripMenuItem3.Size = new System.Drawing.Size(153, 22); + this.toolStripMenuItem3.Tag = 0.5D; + this.toolStripMenuItem3.Text = global::OnTopReplica.Strings.MenuOp50; + this.toolStripMenuItem3.ToolTipText = global::OnTopReplica.Strings.MenuOp50TT; + this.toolStripMenuItem3.Click += new System.EventHandler(this.Menu_Opacity_click); + // + // toolStripMenuItem4 + // + this.toolStripMenuItem4.Name = "toolStripMenuItem4"; + this.toolStripMenuItem4.Size = new System.Drawing.Size(153, 22); + this.toolStripMenuItem4.Tag = 0.25D; + this.toolStripMenuItem4.Text = global::OnTopReplica.Strings.MenuOp25; + this.toolStripMenuItem4.ToolTipText = global::OnTopReplica.Strings.MenuOp25TT; + this.toolStripMenuItem4.Click += new System.EventHandler(this.Menu_Opacity_click); + // + // resizeToolStripMenuItem + // + this.resizeToolStripMenuItem.DropDown = this.menuResize; + this.resizeToolStripMenuItem.Enabled = false; + this.resizeToolStripMenuItem.Name = "resizeToolStripMenuItem"; + this.resizeToolStripMenuItem.Size = new System.Drawing.Size(186, 22); + this.resizeToolStripMenuItem.Text = global::OnTopReplica.Strings.MenuResize; + // + // menuResize + // + this.menuResize.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.doubleToolStripMenuItem1, + this.fitToWindowToolStripMenuItem1, + this.halfToolStripMenuItem1, + this.quarterToolStripMenuItem1, + this.toolStripSeparator3, + this.fullscreenToolStripMenuItem1, + this.toolStripSeparator2, + this.restorePositionAndSizeToolStripMenuItem}); + this.menuResize.Name = "menuResize"; + this.menuResize.OwnerItem = this.resizeToolStripMenuItem; + this.menuResize.Size = new System.Drawing.Size(218, 148); + this.menuResize.Opening += new System.ComponentModel.CancelEventHandler(this.Menu_Resize_opening); + // + // doubleToolStripMenuItem1 + // + this.doubleToolStripMenuItem1.Name = "doubleToolStripMenuItem1"; + this.doubleToolStripMenuItem1.Size = new System.Drawing.Size(217, 22); + this.doubleToolStripMenuItem1.Text = global::OnTopReplica.Strings.MenuFitDouble; + this.doubleToolStripMenuItem1.Click += new System.EventHandler(this.Menu_Resize_Double); + // + // fitToWindowToolStripMenuItem1 + // + this.fitToWindowToolStripMenuItem1.Name = "fitToWindowToolStripMenuItem1"; + this.fitToWindowToolStripMenuItem1.Size = new System.Drawing.Size(217, 22); + this.fitToWindowToolStripMenuItem1.Text = global::OnTopReplica.Strings.MenuFitOriginal; + this.fitToWindowToolStripMenuItem1.Click += new System.EventHandler(this.Menu_Resize_FitToWindow); + // + // halfToolStripMenuItem1 + // + this.halfToolStripMenuItem1.Name = "halfToolStripMenuItem1"; + this.halfToolStripMenuItem1.Size = new System.Drawing.Size(217, 22); + this.halfToolStripMenuItem1.Text = global::OnTopReplica.Strings.MenuFitHalf; + this.halfToolStripMenuItem1.Click += new System.EventHandler(this.Menu_Resize_Half); + // + // quarterToolStripMenuItem1 + // + this.quarterToolStripMenuItem1.Name = "quarterToolStripMenuItem1"; + this.quarterToolStripMenuItem1.Size = new System.Drawing.Size(217, 22); + this.quarterToolStripMenuItem1.Text = global::OnTopReplica.Strings.MenuFitQuarter; + this.quarterToolStripMenuItem1.Click += new System.EventHandler(this.Menu_Resize_Quarter); + // + // toolStripSeparator3 + // + this.toolStripSeparator3.Name = "toolStripSeparator3"; + this.toolStripSeparator3.Size = new System.Drawing.Size(214, 6); + // + // fullscreenToolStripMenuItem1 + // + this.fullscreenToolStripMenuItem1.Image = global::OnTopReplica.Properties.Resources.fullscreen; + this.fullscreenToolStripMenuItem1.Name = "fullscreenToolStripMenuItem1"; + this.fullscreenToolStripMenuItem1.Size = new System.Drawing.Size(217, 22); + this.fullscreenToolStripMenuItem1.Text = global::OnTopReplica.Strings.MenuFitFullscreen; + this.fullscreenToolStripMenuItem1.Click += new System.EventHandler(this.Menu_Resize_Fullscreen); + // + // toolStripSeparator2 + // + this.toolStripSeparator2.Name = "toolStripSeparator2"; + this.toolStripSeparator2.Size = new System.Drawing.Size(214, 6); + // + // restorePositionAndSizeToolStripMenuItem + // + this.restorePositionAndSizeToolStripMenuItem.Name = "restorePositionAndSizeToolStripMenuItem"; + this.restorePositionAndSizeToolStripMenuItem.Size = new System.Drawing.Size(217, 22); + this.restorePositionAndSizeToolStripMenuItem.Text = global::OnTopReplica.Strings.MenuRecall; + this.restorePositionAndSizeToolStripMenuItem.ToolTipText = global::OnTopReplica.Strings.MenuRecallTT; + this.restorePositionAndSizeToolStripMenuItem.Click += new System.EventHandler(this.Menu_Resize_RecallPosition_click); + // + // dockToolStripMenuItem + // + this.dockToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.disabledToolStripMenuItem, + this.topLeftToolStripMenuItem, + this.topRightToolStripMenuItem, + this.centerToolStripMenuItem, + this.bottomLeftToolStripMenuItem, + this.bottomRightToolStripMenuItem}); + this.dockToolStripMenuItem.Image = global::OnTopReplica.Properties.Resources.pos_null; + this.dockToolStripMenuItem.Name = "dockToolStripMenuItem"; + this.dockToolStripMenuItem.Size = new System.Drawing.Size(186, 22); + this.dockToolStripMenuItem.Text = global::OnTopReplica.Strings.MenuPosition; + this.dockToolStripMenuItem.ToolTipText = global::OnTopReplica.Strings.MenuPositionTT; + this.dockToolStripMenuItem.DropDownOpening += new System.EventHandler(this.Menu_Position_Opening); + // + // disabledToolStripMenuItem + // + this.disabledToolStripMenuItem.Checked = true; + this.disabledToolStripMenuItem.CheckState = System.Windows.Forms.CheckState.Checked; + this.disabledToolStripMenuItem.Name = "disabledToolStripMenuItem"; + this.disabledToolStripMenuItem.Size = new System.Drawing.Size(145, 22); + this.disabledToolStripMenuItem.Text = global::OnTopReplica.Strings.MenuPosDisabled; + this.disabledToolStripMenuItem.Click += new System.EventHandler(this.Menu_Position_Disable); + // + // topLeftToolStripMenuItem + // + this.topLeftToolStripMenuItem.Image = global::OnTopReplica.Properties.Resources.pos_topleft; + this.topLeftToolStripMenuItem.Name = "topLeftToolStripMenuItem"; + this.topLeftToolStripMenuItem.Size = new System.Drawing.Size(145, 22); + this.topLeftToolStripMenuItem.Text = global::OnTopReplica.Strings.MenuPosTopLeft; + this.topLeftToolStripMenuItem.Click += new System.EventHandler(this.Menu_Position_TopLeft); + // + // topRightToolStripMenuItem + // + this.topRightToolStripMenuItem.Image = global::OnTopReplica.Properties.Resources.pos_topright; + this.topRightToolStripMenuItem.Name = "topRightToolStripMenuItem"; + this.topRightToolStripMenuItem.Size = new System.Drawing.Size(145, 22); + this.topRightToolStripMenuItem.Text = global::OnTopReplica.Strings.MenuPosTopRight; + this.topRightToolStripMenuItem.Click += new System.EventHandler(this.Menu_Position_TopRight); + // + // centerToolStripMenuItem + // + this.centerToolStripMenuItem.Image = global::OnTopReplica.Properties.Resources.pos_center; + this.centerToolStripMenuItem.Name = "centerToolStripMenuItem"; + this.centerToolStripMenuItem.Size = new System.Drawing.Size(145, 22); + this.centerToolStripMenuItem.Text = global::OnTopReplica.Strings.MenuPosCenter; + this.centerToolStripMenuItem.Click += new System.EventHandler(this.Menu_Position_Center); + // + // bottomLeftToolStripMenuItem + // + this.bottomLeftToolStripMenuItem.Image = global::OnTopReplica.Properties.Resources.pos_bottomleft; + this.bottomLeftToolStripMenuItem.Name = "bottomLeftToolStripMenuItem"; + this.bottomLeftToolStripMenuItem.Size = new System.Drawing.Size(145, 22); + this.bottomLeftToolStripMenuItem.Text = global::OnTopReplica.Strings.MenuPosBottomLeft; + this.bottomLeftToolStripMenuItem.Click += new System.EventHandler(this.Menu_Position_BottomLeft); + // + // bottomRightToolStripMenuItem + // + this.bottomRightToolStripMenuItem.Image = global::OnTopReplica.Properties.Resources.pos_bottomright; + this.bottomRightToolStripMenuItem.Name = "bottomRightToolStripMenuItem"; + this.bottomRightToolStripMenuItem.Size = new System.Drawing.Size(145, 22); + this.bottomRightToolStripMenuItem.Text = global::OnTopReplica.Strings.MenuPosBottomRight; + this.bottomRightToolStripMenuItem.Click += new System.EventHandler(this.Menu_Position_BottomRight); + // + // chromeToolStripMenuItem + // + this.chromeToolStripMenuItem.Name = "chromeToolStripMenuItem"; + this.chromeToolStripMenuItem.Size = new System.Drawing.Size(186, 22); + this.chromeToolStripMenuItem.Text = global::OnTopReplica.Strings.MenuChrome; + this.chromeToolStripMenuItem.ToolTipText = global::OnTopReplica.Strings.MenuChromeTT; + this.chromeToolStripMenuItem.Click += new System.EventHandler(this.Menu_Chrome_click); + // + // reduceToIconToolStripMenuItem + // + this.reduceToIconToolStripMenuItem.Image = global::OnTopReplica.Properties.Resources.minimize; + this.reduceToIconToolStripMenuItem.Name = "reduceToIconToolStripMenuItem"; + this.reduceToIconToolStripMenuItem.Size = new System.Drawing.Size(186, 22); + this.reduceToIconToolStripMenuItem.Text = global::OnTopReplica.Strings.MenuReduce; + this.reduceToIconToolStripMenuItem.ToolTipText = global::OnTopReplica.Strings.MenuReduceTT; + this.reduceToIconToolStripMenuItem.Click += new System.EventHandler(this.Menu_Reduce_click); + // + // toolStripSeparator1 + // + this.toolStripSeparator1.Name = "toolStripSeparator1"; + this.toolStripSeparator1.Size = new System.Drawing.Size(183, 6); + // + // settingsToolStripMenuItem + // + this.settingsToolStripMenuItem.Name = "settingsToolStripMenuItem"; + this.settingsToolStripMenuItem.Size = new System.Drawing.Size(186, 22); + this.settingsToolStripMenuItem.Text = global::OnTopReplica.Strings.MenuSettings; + this.settingsToolStripMenuItem.ToolTipText = global::OnTopReplica.Strings.MenuSettingsTT; + this.settingsToolStripMenuItem.Click += new System.EventHandler(this.Menu_Settings_click); + // + // aboutToolStripMenuItem + // + this.aboutToolStripMenuItem.Image = global::OnTopReplica.Properties.Resources.help; + this.aboutToolStripMenuItem.Name = "aboutToolStripMenuItem"; + this.aboutToolStripMenuItem.Size = new System.Drawing.Size(186, 22); + this.aboutToolStripMenuItem.Text = global::OnTopReplica.Strings.MenuAbout; + this.aboutToolStripMenuItem.ToolTipText = global::OnTopReplica.Strings.MenuAboutTT; + this.aboutToolStripMenuItem.Click += new System.EventHandler(this.Menu_About_click); + // + // menuContextClose + // + this.menuContextClose.Image = global::OnTopReplica.Properties.Resources.close_new; + this.menuContextClose.Name = "menuContextClose"; + this.menuContextClose.Size = new System.Drawing.Size(186, 22); + this.menuContextClose.Text = global::OnTopReplica.Strings.MenuClose; + this.menuContextClose.Click += new System.EventHandler(this.Menu_Close_click); + // + // fullOpacityToolStripMenuItem + // + this.fullOpacityToolStripMenuItem.DropDown = this.menuOpacity; + this.fullOpacityToolStripMenuItem.Image = global::OnTopReplica.Properties.Resources.window_opacity; + this.fullOpacityToolStripMenuItem.Name = "fullOpacityToolStripMenuItem"; + this.fullOpacityToolStripMenuItem.Size = new System.Drawing.Size(189, 22); + this.fullOpacityToolStripMenuItem.Text = global::OnTopReplica.Strings.MenuOpacity; + // + // fullSelectWindowToolStripMenuItem + // + this.fullSelectWindowToolStripMenuItem.DropDown = this.menuWindows; + this.fullSelectWindowToolStripMenuItem.Image = global::OnTopReplica.Properties.Resources.list; + this.fullSelectWindowToolStripMenuItem.Name = "fullSelectWindowToolStripMenuItem"; + this.fullSelectWindowToolStripMenuItem.Size = new System.Drawing.Size(189, 22); + this.fullSelectWindowToolStripMenuItem.Text = global::OnTopReplica.Strings.MenuWindows; + this.fullSelectWindowToolStripMenuItem.ToolTipText = global::OnTopReplica.Strings.MenuWindowsTT; + // + // menuFullscreenContext + // + this.menuFullscreenContext.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.fullSelectWindowToolStripMenuItem, + this.modeToolStripMenuItem, + this.fullOpacityToolStripMenuItem, + this.enableClickthroughToolStripMenuItem, + this.fullExitToolStripMenuItem}); + this.menuFullscreenContext.Name = "menuFullscreenContext"; + this.menuFullscreenContext.Size = new System.Drawing.Size(190, 114); + // + // modeToolStripMenuItem + // + this.modeToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.menuModeStandardToolStripMenuItem, + this.menuModeFullscreenToolStripMenuItem, + this.menuModeAllScreensToolStripMenuItem}); + this.modeToolStripMenuItem.Name = "modeToolStripMenuItem"; + this.modeToolStripMenuItem.Size = new System.Drawing.Size(189, 22); + this.modeToolStripMenuItem.Text = "Mode"; + this.modeToolStripMenuItem.DropDownOpening += new System.EventHandler(this.Menu_Fullscreen_Mode_opening); + // + // menuModeStandardToolStripMenuItem + // + this.menuModeStandardToolStripMenuItem.Name = "menuModeStandardToolStripMenuItem"; + this.menuModeStandardToolStripMenuItem.Size = new System.Drawing.Size(130, 22); + this.menuModeStandardToolStripMenuItem.Text = "Standard"; + this.menuModeStandardToolStripMenuItem.Click += new System.EventHandler(this.Menu_Fullscreen_Mode_Standard_click); + // + // menuModeFullscreenToolStripMenuItem + // + this.menuModeFullscreenToolStripMenuItem.Name = "menuModeFullscreenToolStripMenuItem"; + this.menuModeFullscreenToolStripMenuItem.Size = new System.Drawing.Size(130, 22); + this.menuModeFullscreenToolStripMenuItem.Text = "Fullscreen"; + this.menuModeFullscreenToolStripMenuItem.Click += new System.EventHandler(this.Menu_Fullscreen_Mode_Fullscreen_click); + // + // menuModeAllScreensToolStripMenuItem + // + this.menuModeAllScreensToolStripMenuItem.Name = "menuModeAllScreensToolStripMenuItem"; + this.menuModeAllScreensToolStripMenuItem.Size = new System.Drawing.Size(130, 22); + this.menuModeAllScreensToolStripMenuItem.Text = "All screens"; + this.menuModeAllScreensToolStripMenuItem.Click += new System.EventHandler(this.Menu_Fullscreen_Mode_AllScreens_click); + // + // enableClickthroughToolStripMenuItem + // + this.enableClickthroughToolStripMenuItem.Image = global::OnTopReplica.Properties.Resources.clickforwarding; + this.enableClickthroughToolStripMenuItem.Name = "enableClickthroughToolStripMenuItem"; + this.enableClickthroughToolStripMenuItem.Size = new System.Drawing.Size(189, 22); + this.enableClickthroughToolStripMenuItem.Text = global::OnTopReplica.Strings.MenuClickThrough; + this.enableClickthroughToolStripMenuItem.ToolTipText = global::OnTopReplica.Strings.MenuClickThroughTT; + this.enableClickthroughToolStripMenuItem.Click += new System.EventHandler(this.Menu_ClickThrough_click); + // + // fullExitToolStripMenuItem + // + this.fullExitToolStripMenuItem.Image = global::OnTopReplica.Properties.Resources.close_new; + this.fullExitToolStripMenuItem.Name = "fullExitToolStripMenuItem"; + this.fullExitToolStripMenuItem.Size = new System.Drawing.Size(189, 22); + this.fullExitToolStripMenuItem.Text = global::OnTopReplica.Strings.MenuQuitFullscreen; + this.fullExitToolStripMenuItem.Click += new System.EventHandler(this.Menu_Fullscreen_ExitFullscreen_click); + // + // MainForm + // + this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 15F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.BackColor = System.Drawing.SystemColors.Control; + this.ClientSize = new System.Drawing.Size(326, 234); + this.ControlBox = false; + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.SizableToolWindow; + this.HideCaption = true; + this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); + this.MaximizeBox = false; + this.MinimizeBox = false; + this.MinimumSize = new System.Drawing.Size(44, 44); + this.Name = "MainForm"; + this.Text = "OnTopReplica"; + this.TopMost = true; + this.menuContext.ResumeLayout(false); + this.menuWindows.ResumeLayout(false); + this.menuOpacity.ResumeLayout(false); + this.menuResize.ResumeLayout(false); + this.menuFullscreenContext.ResumeLayout(false); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.ContextMenuStrip menuContext; + private System.Windows.Forms.ToolStripMenuItem menuContextWindows; + private System.Windows.Forms.ToolStripMenuItem menuContextClose; + private System.Windows.Forms.ContextMenuStrip menuWindows; + private System.Windows.Forms.ToolStripMenuItem menuContextOpacity; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator1; + private System.Windows.Forms.ContextMenuStrip menuOpacity; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem1; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem2; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem3; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem4; + private System.Windows.Forms.ToolStripMenuItem aboutToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem reduceToIconToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem selectRegionToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem resizeToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem noneToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem switchToWindowToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem dockToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem topLeftToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem topRightToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem bottomLeftToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem bottomRightToolStripMenuItem; + private System.Windows.Forms.ContextMenuStrip menuResize; + private System.Windows.Forms.ToolStripMenuItem doubleToolStripMenuItem1; + private System.Windows.Forms.ToolStripMenuItem fitToWindowToolStripMenuItem1; + private System.Windows.Forms.ToolStripMenuItem halfToolStripMenuItem1; + private System.Windows.Forms.ToolStripMenuItem quarterToolStripMenuItem1; + private System.Windows.Forms.ToolStripMenuItem fullscreenToolStripMenuItem1; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator3; + private System.Windows.Forms.ToolStripMenuItem chromeToolStripMenuItem; + private System.Windows.Forms.ContextMenuStrip menuFullscreenContext; + private System.Windows.Forms.ToolStripMenuItem fullSelectWindowToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem fullOpacityToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem fullExitToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem advancedToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem clickForwardingToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem clickThroughToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem groupSwitchModeToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem enableClickthroughToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem centerToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem disabledToolStripMenuItem; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator2; + private System.Windows.Forms.ToolStripMenuItem restorePositionAndSizeToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem restoreLastClonedWindowToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem settingsToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem modeToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem menuModeStandardToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem menuModeFullscreenToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem menuModeAllScreensToolStripMenuItem; + } +} + diff --git a/OnTopReplica/MainForm.cs b/src/OnTopReplica/MainForm.cs similarity index 97% rename from OnTopReplica/MainForm.cs rename to src/OnTopReplica/MainForm.cs index 341d227..d5d32cd 100644 --- a/OnTopReplica/MainForm.cs +++ b/src/OnTopReplica/MainForm.cs @@ -1,461 +1,461 @@ -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Drawing; -using System.Windows.Forms; -using OnTopReplica.Native; -using OnTopReplica.Properties; -using OnTopReplica.StartupOptions; -using OnTopReplica.Update; -using OnTopReplica.WindowSeekers; -using WindowsFormsAero.Dwm; -using WindowsFormsAero.TaskDialog; - -namespace OnTopReplica { - - partial class MainForm : AspectRatioForm { - - //GUI elements - ThumbnailPanel _thumbnailPanel; - - //Managers - readonly MessagePumpManager _msgPumpManager = new MessagePumpManager(); - WindowListMenuManager _windowListManager; - public FullscreenFormManager FullscreenManager { get; private set; } - - Options _startupOptions; - - public MainForm(Options startupOptions) { - _startupOptions = startupOptions; - - FullscreenManager = new FullscreenFormManager(this); - _quickRegionDrawingHandler = new ThumbnailPanel.RegionDrawnHandler(HandleQuickRegionDrawn); - - //WinForms init pass - InitializeComponent(); - - //Store default values - DefaultNonClickTransparencyKey = this.TransparencyKey; - DefaultBorderStyle = this.FormBorderStyle; - - //Thumbnail panel - _thumbnailPanel = new ThumbnailPanel { - Location = Point.Empty, - Dock = DockStyle.Fill - }; - _thumbnailPanel.CloneClick += new EventHandler(Thumbnail_CloneClick); - Controls.Add(_thumbnailPanel); - - //Set native renderer on context menus - Asztal.Szótár.NativeToolStripRenderer.SetToolStripRenderer( - menuContext, menuWindows, menuOpacity, menuResize, menuFullscreenContext - ); - - //Set to Key event preview - this.KeyPreview = true; - - Log.Write("Main form constructed"); - } - - #region Event override - - protected override void OnHandleCreated(EventArgs e){ - base.OnHandleCreated(e); - - //Window init - KeepAspectRatio = false; - GlassMargins = new Padding(-1); - - //Managers - _msgPumpManager.Initialize(this); - _windowListManager = new WindowListMenuManager(this, menuWindows); - _windowListManager.ParentMenus = new System.Windows.Forms.ContextMenuStrip[] { - menuContext, menuFullscreenContext - }; - - //Platform specific form initialization - Program.Platform.PostHandleFormInit(this); - } - - protected override void OnShown(EventArgs e) { - Log.Write("Main form shown"); - base.OnShown(e); - - //Apply startup options - _startupOptions.Apply(this); - } - - protected override void OnClosing(CancelEventArgs e) { - Log.Write("Main form closing"); - base.OnClosing(e); - - _msgPumpManager.Dispose(); - Program.Platform.CloseForm(this); - } - - protected override void OnClosed(EventArgs e) { - Log.Write("Main form closed"); - base.OnClosed(e); - } - - protected override void OnMove(EventArgs e) { - base.OnMove(e); - - AdjustSidePanelLocation(); - } - - protected override void OnResizeEnd(EventArgs e) { - base.OnResizeEnd(e); - - RefreshScreenLock(); - } - - protected override void OnResizing(EventArgs e) { - //Update aspect ratio from thumbnail while resizing (but do not refresh, resizing does that anyway) - if (_thumbnailPanel.IsShowingThumbnail) { - SetAspectRatio(_thumbnailPanel.ThumbnailPixelSize, false); - } - } - - protected override void OnActivated(EventArgs e) { - base.OnActivated(e); - - //Deactivate click-through if form is reactivated - if (ClickThroughEnabled) { - ClickThroughEnabled = false; - } - - Program.Platform.RestoreForm(this); - } - - protected override void OnDeactivate(EventArgs e) { - base.OnDeactivate(e); - - //HACK: sometimes, even if TopMost is true, the window loses its "always on top" status. - // This is a fix attempt that probably won't work... - if (!FullscreenManager.IsFullscreen) { //fullscreen mode doesn't use TopMost - TopMost = false; - TopMost = true; - } - } - - protected override void OnMouseWheel(MouseEventArgs e) { - base.OnMouseWheel(e); - - if (!FullscreenManager.IsFullscreen) { - if (_thumbnailPanel.IsShowingThumbnail) { - SetAspectRatio(_thumbnailPanel.ThumbnailPixelSize, false); - } - - int change = (int)(e.Delta / 6.0); //assumes a mouse wheel "tick" is in the 80-120 range - AdjustSize(change); - - RefreshScreenLock(); - } - } - - protected override void OnMouseDoubleClick(MouseEventArgs e) { - base.OnMouseDoubleClick(e); - - //This is handled by the WM_NCLBUTTONDBLCLK msg handler usually (because the GlassForm translates - //clicks on client to clicks on caption). But if fullscreen mode disables GlassForm dragging, we need - //this auxiliary handler to switch mode. - FullscreenManager.Toggle(); - } - - protected override void OnMouseClick(MouseEventArgs e) { - base.OnMouseClick(e); - - //Same story as above (OnMouseDoubleClick) - if (e.Button == System.Windows.Forms.MouseButtons.Right) { - OpenContextMenu(null); - } - } - - private ThumbnailPanel.RegionDrawnHandler _quickRegionDrawingHandler; - - protected override void WndProc(ref Message m) { - if (_msgPumpManager != null) { - if (_msgPumpManager.PumpMessage(ref m)) { - return; - } - } - - switch (m.Msg) { - case WM.NCRBUTTONUP: - //Open context menu if right button clicked on caption (i.e. all of the window area because of glass) - if (m.WParam.ToInt32() == HT.CAPTION) { - OpenContextMenu(null); - - m.Result = IntPtr.Zero; - return; - } - break; - - case WM.NCLBUTTONDOWN: - if ((ModifierKeys & Keys.Control) == Keys.Control && - ThumbnailPanel.IsShowingThumbnail && - !ThumbnailPanel.DrawMouseRegions) { - - ThumbnailPanel.EnableMouseRegionsDrawingWithMouseDown(); - ThumbnailPanel.RegionDrawn += _quickRegionDrawingHandler; - - m.Result = IntPtr.Zero; - return; - } - break; - - case WM.NCLBUTTONDBLCLK: - //Toggle fullscreen mode if double click on caption (whole glass area) - if (m.WParam.ToInt32() == HT.CAPTION) { - FullscreenManager.Toggle(); - - m.Result = IntPtr.Zero; - return; - } - break; - - case WM.NCHITTEST: - //Make transparent to hit-testing if in click through mode - if (ClickThroughEnabled) { - m.Result = (IntPtr)HT.TRANSPARENT; - - RefreshClickThroughComeBack(); - return; - } - break; - } - - base.WndProc(ref m); - } - - private void HandleQuickRegionDrawn(object sender, ThumbnailRegion region) { - //Reset region drawing state - ThumbnailPanel.DrawMouseRegions = false; - ThumbnailPanel.RegionDrawn -= _quickRegionDrawingHandler; - - SelectedThumbnailRegion = region; - } - - #endregion - - #region Keyboard event handling - - protected override void OnKeyUp(KeyEventArgs e) { - base.OnKeyUp(e); - - //ALT - if (e.Modifiers == Keys.Alt) { - if (e.KeyCode == Keys.Enter) { - e.Handled = true; - FullscreenManager.Toggle(); - } - - else if (e.KeyCode == Keys.D1 || e.KeyCode == Keys.NumPad1) { - FitToThumbnail(0.25); - } - - else if (e.KeyCode == Keys.D2 || e.KeyCode == Keys.NumPad2) { - FitToThumbnail(0.5); - } - - else if (e.KeyCode == Keys.D3 || e.KeyCode == Keys.NumPad3 || - e.KeyCode == Keys.D0 || e.KeyCode == Keys.NumPad0) { - FitToThumbnail(1.0); - } - - else if (e.KeyCode == Keys.D4 || e.KeyCode == Keys.NumPad4) { - FitToThumbnail(2.0); - } - } - - //F11 Fullscreen switch - else if (e.KeyCode == Keys.F11) { - e.Handled = true; - FullscreenManager.Toggle(); - } - - //ESCAPE - else if (e.KeyCode == Keys.Escape) { - //Disable click-through - if (ClickThroughEnabled) { - ClickThroughEnabled = false; - } - //Toggle fullscreen - else if (FullscreenManager.IsFullscreen) { - FullscreenManager.SwitchBack(); - } - //Disable click forwarding - else if (ClickForwardingEnabled) { - ClickForwardingEnabled = false; - } - } - } - - #endregion - - #region Thumbnail operation - - /// - /// Sets a new thumbnail. - /// - /// Handle to the window to clone. - /// Region of the window to clone or null. - public void SetThumbnail(WindowHandle handle, ThumbnailRegion region) { - try { - Log.Write("Cloning window HWND {0} of class {1}", handle.Handle, handle.Class); - - CurrentThumbnailWindowHandle = handle; - _thumbnailPanel.SetThumbnailHandle(handle, region); - - //Set aspect ratio (this will resize the form), do not refresh if in fullscreen - SetAspectRatio(_thumbnailPanel.ThumbnailPixelSize, !FullscreenManager.IsFullscreen); - } - catch (Exception ex) { - Log.WriteException("Unable to set new thumbnail", ex); - - ThumbnailError(ex, false, Strings.ErrorUnableToCreateThumbnail); - _thumbnailPanel.UnsetThumbnail(); - } - } - - /// - /// Enables group mode on a list of window handles. - /// - /// List of window handles. - public void SetThumbnailGroup(IList handles) { - if (handles.Count == 0) - return; - - //At last one thumbnail - SetThumbnail(handles[0], null); - - //Handle if no real group - if (handles.Count == 1) - return; - - CurrentThumbnailWindowHandle = null; - _msgPumpManager.Get().EnableGroupMode(handles); - } - - /// - /// Disables the cloned thumbnail. - /// - public void UnsetThumbnail() { - //Unset handle - CurrentThumbnailWindowHandle = null; - _thumbnailPanel.UnsetThumbnail(); - - //Disable aspect ratio - KeepAspectRatio = false; - } - - /// - /// Gets or sets the region displayed of the current thumbnail. - /// - public ThumbnailRegion SelectedThumbnailRegion { - get { - if (!_thumbnailPanel.IsShowingThumbnail || !_thumbnailPanel.ConstrainToRegion) - return null; - - return _thumbnailPanel.SelectedRegion; - } - set { - if (!_thumbnailPanel.IsShowingThumbnail) - return; - - _thumbnailPanel.SelectedRegion = value; - - SetAspectRatio(_thumbnailPanel.ThumbnailPixelSize, true); - - FixPositionAndSize(); - } - } - - const int FixMargin = 10; - - /// - /// Fixes the form's position and size, ensuring it is fully displayed in the current screen. - /// - private void FixPositionAndSize() { - var screen = Screen.FromControl(this); - - if (Width > screen.WorkingArea.Width) { - Width = screen.WorkingArea.Width - FixMargin; - } - if (Height > screen.WorkingArea.Height) { - Height = screen.WorkingArea.Height - FixMargin; - } - if (Location.X + Width > screen.WorkingArea.Right) { - Location = new Point(screen.WorkingArea.Right - Width - FixMargin, Location.Y); - } - if (Location.Y + Height > screen.WorkingArea.Bottom) { - Location = new Point(Location.X, screen.WorkingArea.Bottom - Height - FixMargin); - } - } - - private void ThumbnailError(Exception ex, bool suppress, string title) { - if (!suppress) { - ShowErrorDialog(title, Strings.ErrorGenericThumbnailHandleError, ex.Message); - } - - UnsetThumbnail(); - } - - /// Automatically sizes the window in order to accomodate the thumbnail p times. - /// Scale of the thumbnail to consider. - private void FitToThumbnail(double p) { - try { - Size originalSize = _thumbnailPanel.ThumbnailPixelSize; - Size fittedSize = new Size((int)(originalSize.Width * p), (int)(originalSize.Height * p)); - ClientSize = fittedSize; - RefreshScreenLock(); - } - catch (Exception ex) { - ThumbnailError(ex, false, Strings.ErrorUnableToFit); - } - } - - #endregion - - #region Accessors - - /// - /// Gets the form's thumbnail panel. - /// - public ThumbnailPanel ThumbnailPanel { - get { - return _thumbnailPanel; - } - } - - /// - /// Gets the form's message pump manager. - /// - public MessagePumpManager MessagePumpManager { - get { - return _msgPumpManager; - } - } - - /// - /// Gets the form's window list drop down menu. - /// - public ContextMenuStrip MenuWindows { - get { - return menuWindows; - } - } - - /// - /// Retrieves the window handle of the currently cloned thumbnail. - /// - public WindowHandle CurrentThumbnailWindowHandle { - get; - private set; - } - - #endregion - - } -} +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Windows.Forms; +using OnTopReplica.Native; +using OnTopReplica.Properties; +using OnTopReplica.StartupOptions; +using OnTopReplica.Update; +using OnTopReplica.WindowSeekers; +using WindowsFormsAero.Dwm; +using WindowsFormsAero.TaskDialog; + +namespace OnTopReplica { + + partial class MainForm : AspectRatioForm { + + //GUI elements + ThumbnailPanel _thumbnailPanel; + + //Managers + readonly MessagePumpManager _msgPumpManager = new MessagePumpManager(); + WindowListMenuManager _windowListManager; + public FullscreenFormManager FullscreenManager { get; private set; } + + Options _startupOptions; + + public MainForm(Options startupOptions) { + _startupOptions = startupOptions; + + FullscreenManager = new FullscreenFormManager(this); + _quickRegionDrawingHandler = new ThumbnailPanel.RegionDrawnHandler(HandleQuickRegionDrawn); + + //WinForms init pass + InitializeComponent(); + + //Store default values + DefaultNonClickTransparencyKey = this.TransparencyKey; + DefaultBorderStyle = this.FormBorderStyle; + + //Thumbnail panel + _thumbnailPanel = new ThumbnailPanel { + Location = Point.Empty, + Dock = DockStyle.Fill + }; + _thumbnailPanel.CloneClick += new EventHandler(Thumbnail_CloneClick); + Controls.Add(_thumbnailPanel); + + //Set native renderer on context menus + Asztal.Szótár.NativeToolStripRenderer.SetToolStripRenderer( + menuContext, menuWindows, menuOpacity, menuResize, menuFullscreenContext + ); + + //Set to Key event preview + this.KeyPreview = true; + + Log.Write("Main form constructed"); + } + + #region Event override + + protected override void OnHandleCreated(EventArgs e){ + base.OnHandleCreated(e); + + //Window init + KeepAspectRatio = false; + GlassMargins = new Padding(-1); + + //Managers + _msgPumpManager.Initialize(this); + _windowListManager = new WindowListMenuManager(this, menuWindows); + _windowListManager.ParentMenus = new System.Windows.Forms.ContextMenuStrip[] { + menuContext, menuFullscreenContext + }; + + //Platform specific form initialization + Program.Platform.PostHandleFormInit(this); + } + + protected override void OnShown(EventArgs e) { + Log.Write("Main form shown"); + base.OnShown(e); + + //Apply startup options + _startupOptions.Apply(this); + } + + protected override void OnClosing(CancelEventArgs e) { + Log.Write("Main form closing"); + base.OnClosing(e); + + _msgPumpManager.Dispose(); + Program.Platform.CloseForm(this); + } + + protected override void OnClosed(EventArgs e) { + Log.Write("Main form closed"); + base.OnClosed(e); + } + + protected override void OnMove(EventArgs e) { + base.OnMove(e); + + AdjustSidePanelLocation(); + } + + protected override void OnResizeEnd(EventArgs e) { + base.OnResizeEnd(e); + + RefreshScreenLock(); + } + + protected override void OnResizing(EventArgs e) { + //Update aspect ratio from thumbnail while resizing (but do not refresh, resizing does that anyway) + if (_thumbnailPanel.IsShowingThumbnail) { + SetAspectRatio(_thumbnailPanel.ThumbnailPixelSize, false); + } + } + + protected override void OnActivated(EventArgs e) { + base.OnActivated(e); + + //Deactivate click-through if form is reactivated + if (ClickThroughEnabled) { + ClickThroughEnabled = false; + } + + Program.Platform.RestoreForm(this); + } + + protected override void OnDeactivate(EventArgs e) { + base.OnDeactivate(e); + + //HACK: sometimes, even if TopMost is true, the window loses its "always on top" status. + // This is a fix attempt that probably won't work... + if (!FullscreenManager.IsFullscreen) { //fullscreen mode doesn't use TopMost + TopMost = false; + TopMost = true; + } + } + + protected override void OnMouseWheel(MouseEventArgs e) { + base.OnMouseWheel(e); + + if (!FullscreenManager.IsFullscreen) { + if (_thumbnailPanel.IsShowingThumbnail) { + SetAspectRatio(_thumbnailPanel.ThumbnailPixelSize, false); + } + + int change = (int)(e.Delta / 6.0); //assumes a mouse wheel "tick" is in the 80-120 range + AdjustSize(change); + + RefreshScreenLock(); + } + } + + protected override void OnMouseDoubleClick(MouseEventArgs e) { + base.OnMouseDoubleClick(e); + + //This is handled by the WM_NCLBUTTONDBLCLK msg handler usually (because the GlassForm translates + //clicks on client to clicks on caption). But if fullscreen mode disables GlassForm dragging, we need + //this auxiliary handler to switch mode. + FullscreenManager.Toggle(); + } + + protected override void OnMouseClick(MouseEventArgs e) { + base.OnMouseClick(e); + + //Same story as above (OnMouseDoubleClick) + if (e.Button == System.Windows.Forms.MouseButtons.Right) { + OpenContextMenu(null); + } + } + + private ThumbnailPanel.RegionDrawnHandler _quickRegionDrawingHandler; + + protected override void WndProc(ref Message m) { + if (_msgPumpManager != null) { + if (_msgPumpManager.PumpMessage(ref m)) { + return; + } + } + + switch (m.Msg) { + case WM.NCRBUTTONUP: + //Open context menu if right button clicked on caption (i.e. all of the window area because of glass) + if (m.WParam.ToInt32() == HT.CAPTION) { + OpenContextMenu(null); + + m.Result = IntPtr.Zero; + return; + } + break; + + case WM.NCLBUTTONDOWN: + if ((ModifierKeys & Keys.Control) == Keys.Control && + ThumbnailPanel.IsShowingThumbnail && + !ThumbnailPanel.DrawMouseRegions) { + + ThumbnailPanel.EnableMouseRegionsDrawingWithMouseDown(); + ThumbnailPanel.RegionDrawn += _quickRegionDrawingHandler; + + m.Result = IntPtr.Zero; + return; + } + break; + + case WM.NCLBUTTONDBLCLK: + //Toggle fullscreen mode if double click on caption (whole glass area) + if (m.WParam.ToInt32() == HT.CAPTION) { + FullscreenManager.Toggle(); + + m.Result = IntPtr.Zero; + return; + } + break; + + case WM.NCHITTEST: + //Make transparent to hit-testing if in click through mode + if (ClickThroughEnabled) { + m.Result = (IntPtr)HT.TRANSPARENT; + + RefreshClickThroughComeBack(); + return; + } + break; + } + + base.WndProc(ref m); + } + + private void HandleQuickRegionDrawn(object sender, ThumbnailRegion region) { + //Reset region drawing state + ThumbnailPanel.DrawMouseRegions = false; + ThumbnailPanel.RegionDrawn -= _quickRegionDrawingHandler; + + SelectedThumbnailRegion = region; + } + + #endregion + + #region Keyboard event handling + + protected override void OnKeyUp(KeyEventArgs e) { + base.OnKeyUp(e); + + //ALT + if (e.Modifiers == Keys.Alt) { + if (e.KeyCode == Keys.Enter) { + e.Handled = true; + FullscreenManager.Toggle(); + } + + else if (e.KeyCode == Keys.D1 || e.KeyCode == Keys.NumPad1) { + FitToThumbnail(0.25); + } + + else if (e.KeyCode == Keys.D2 || e.KeyCode == Keys.NumPad2) { + FitToThumbnail(0.5); + } + + else if (e.KeyCode == Keys.D3 || e.KeyCode == Keys.NumPad3 || + e.KeyCode == Keys.D0 || e.KeyCode == Keys.NumPad0) { + FitToThumbnail(1.0); + } + + else if (e.KeyCode == Keys.D4 || e.KeyCode == Keys.NumPad4) { + FitToThumbnail(2.0); + } + } + + //F11 Fullscreen switch + else if (e.KeyCode == Keys.F11) { + e.Handled = true; + FullscreenManager.Toggle(); + } + + //ESCAPE + else if (e.KeyCode == Keys.Escape) { + //Disable click-through + if (ClickThroughEnabled) { + ClickThroughEnabled = false; + } + //Toggle fullscreen + else if (FullscreenManager.IsFullscreen) { + FullscreenManager.SwitchBack(); + } + //Disable click forwarding + else if (ClickForwardingEnabled) { + ClickForwardingEnabled = false; + } + } + } + + #endregion + + #region Thumbnail operation + + /// + /// Sets a new thumbnail. + /// + /// Handle to the window to clone. + /// Region of the window to clone or null. + public void SetThumbnail(WindowHandle handle, ThumbnailRegion region) { + try { + Log.Write("Cloning window HWND {0} of class {1}", handle.Handle, handle.Class); + + CurrentThumbnailWindowHandle = handle; + _thumbnailPanel.SetThumbnailHandle(handle, region); + + //Set aspect ratio (this will resize the form), do not refresh if in fullscreen + SetAspectRatio(_thumbnailPanel.ThumbnailPixelSize, !FullscreenManager.IsFullscreen); + } + catch (Exception ex) { + Log.WriteException("Unable to set new thumbnail", ex); + + ThumbnailError(ex, false, Strings.ErrorUnableToCreateThumbnail); + _thumbnailPanel.UnsetThumbnail(); + } + } + + /// + /// Enables group mode on a list of window handles. + /// + /// List of window handles. + public void SetThumbnailGroup(IList handles) { + if (handles.Count == 0) + return; + + //At last one thumbnail + SetThumbnail(handles[0], null); + + //Handle if no real group + if (handles.Count == 1) + return; + + CurrentThumbnailWindowHandle = null; + _msgPumpManager.Get().EnableGroupMode(handles); + } + + /// + /// Disables the cloned thumbnail. + /// + public void UnsetThumbnail() { + //Unset handle + CurrentThumbnailWindowHandle = null; + _thumbnailPanel.UnsetThumbnail(); + + //Disable aspect ratio + KeepAspectRatio = false; + } + + /// + /// Gets or sets the region displayed of the current thumbnail. + /// + public ThumbnailRegion SelectedThumbnailRegion { + get { + if (!_thumbnailPanel.IsShowingThumbnail || !_thumbnailPanel.ConstrainToRegion) + return null; + + return _thumbnailPanel.SelectedRegion; + } + set { + if (!_thumbnailPanel.IsShowingThumbnail) + return; + + _thumbnailPanel.SelectedRegion = value; + + SetAspectRatio(_thumbnailPanel.ThumbnailPixelSize, true); + + FixPositionAndSize(); + } + } + + const int FixMargin = 10; + + /// + /// Fixes the form's position and size, ensuring it is fully displayed in the current screen. + /// + private void FixPositionAndSize() { + var screen = Screen.FromControl(this); + + if (Width > screen.WorkingArea.Width) { + Width = screen.WorkingArea.Width - FixMargin; + } + if (Height > screen.WorkingArea.Height) { + Height = screen.WorkingArea.Height - FixMargin; + } + if (Location.X + Width > screen.WorkingArea.Right) { + Location = new Point(screen.WorkingArea.Right - Width - FixMargin, Location.Y); + } + if (Location.Y + Height > screen.WorkingArea.Bottom) { + Location = new Point(Location.X, screen.WorkingArea.Bottom - Height - FixMargin); + } + } + + private void ThumbnailError(Exception ex, bool suppress, string title) { + if (!suppress) { + ShowErrorDialog(title, Strings.ErrorGenericThumbnailHandleError, ex.Message); + } + + UnsetThumbnail(); + } + + /// Automatically sizes the window in order to accomodate the thumbnail p times. + /// Scale of the thumbnail to consider. + private void FitToThumbnail(double p) { + try { + Size originalSize = _thumbnailPanel.ThumbnailPixelSize; + Size fittedSize = new Size((int)(originalSize.Width * p), (int)(originalSize.Height * p)); + ClientSize = fittedSize; + RefreshScreenLock(); + } + catch (Exception ex) { + ThumbnailError(ex, false, Strings.ErrorUnableToFit); + } + } + + #endregion + + #region Accessors + + /// + /// Gets the form's thumbnail panel. + /// + public ThumbnailPanel ThumbnailPanel { + get { + return _thumbnailPanel; + } + } + + /// + /// Gets the form's message pump manager. + /// + public MessagePumpManager MessagePumpManager { + get { + return _msgPumpManager; + } + } + + /// + /// Gets the form's window list drop down menu. + /// + public ContextMenuStrip MenuWindows { + get { + return menuWindows; + } + } + + /// + /// Retrieves the window handle of the currently cloned thumbnail. + /// + public WindowHandle CurrentThumbnailWindowHandle { + get; + private set; + } + + #endregion + + } +} diff --git a/OnTopReplica/MainForm.resx b/src/OnTopReplica/MainForm.resx similarity index 98% rename from OnTopReplica/MainForm.resx rename to src/OnTopReplica/MainForm.resx index 357b5e6..88b7fdb 100644 --- a/OnTopReplica/MainForm.resx +++ b/src/OnTopReplica/MainForm.resx @@ -1,1471 +1,1471 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 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 - - - 17, 17 - - - 142, 17 - - - 275, 17 - - - 578, 17 - - - 399, 17 - - - - - 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 - WOnXh4eD/n9cDgydCIDheC4AdCIAhmMCgE4EwHBMANCJABiOCQA6EQDDEQDoRAAMRwCgEwEwHL8DgE4E - wHAEADoRAMOxBIBOBMBwBAA6EQDDEQDoRAAMRwCgEwEwHAGATgTAcAQAOhEAwxEA6EQADEcAoBMBMBwB - gE4EwHAEADoRAMMRAOhEAAxHAKATATAcAYBOBMBwBAA6EQDDhboceEevdK5ZQQAwqdp8MEgNYQKATkwA - hiMA0IkAGI47AkEnAmA4JgDoRAAMRwCgEwEwHAGATgTAcAQAOhEAwxEA6EQADEcAoBMBMBxnAkInzgQ0 - HBMAdGICMFy4CWCbmgAIACZHAAzHmYDQiQAYjiUAdCIAhgszARQDsOZ6AoBJFdIqACd1yJxLrg20HQGo - kDATgPevAF133UgAMKnCeFpmLFoisy+8MtB2BKBCwkwAks9LdvegCK8oJuO6klAf4mTzfoE2IwAVEmYC - AHQjABVCAGAiAlAhoZYAgGYEoEKYAGAiAlAhTAAwEQGoECYAmIgAVAgBgIkIQIUQAJiIAFQIAYCJCECF - EACYiABUSGFsWOatflCaTz417l0B9ulZcb6MPP8MAdDNzWZk/9MvkMYjjo17V4B9Bh75vmT6torU1Ufy - 9QhACY7jFC/ZdPO5uHcF2CeRahJJJosXE0WBAAAWIwCAxQgAYDECAFiMAAAWIwCAxQgAYDECAFiMAAAW - IwCAxQgAYDECAFiMAAAWIwCAxQgAYDECAFiMAAAWIwCAxQgAYDECAFiMAAAWIwCAxQgAYDECAFiMAAAW - IwCAxQgAYDECAFiMAAAWIwCAxQgAYDECAFiMAAAWIwCAxQgAYDECAFiMAAAWIwCAxQgAYDECAFjsP/mS - ZR6W2nupAAAAAElFTkSuQmCCKAAAAIAAAAAAAQAAAQAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAChO - 1ihO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO - 1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO - 1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO - 1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO - 1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO - 1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO - 1yhO1yhO1yhO1yhO1yhO1yhO1yhO1ihO1yhO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO1yhO1yhO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO1yhO1yhO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO1yhO1yhO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO1yhO - 1yhO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO1yhO1yhO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO1yhO1yhO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO1yhO1yhO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO1yhO1yhO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO1yhO - 1yhO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO1yhO1yhO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO1yhO1yhO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO1yhO1yhO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO1yhO1yhO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO1yhO - 1yhO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO1yhO1yhO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO1yhO1yhO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO1yhO1yhO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO1yhO1yhO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ClP2CVL1x5G1h5G1h5G1h5G1h5G1h5G1h5G1h5G1h5G1h5G1h5G1h5G1h5G - 1h5G1h5G1h5G1h5G1h5G1h5G1h5G1h5G1h5G1h5G1h5G1h5G1h5G1h5G1h5G1h5G1h5G1h5G1h5G1h5G - 1h5G1h5G1h5G1h5G1h5G1h5G1h5G1h5G1h5G1h5G1h5G1h5G1h5G1h5G1h5G1h5G1h5G1h5G1h5G1h5G - 1h5G1h5G1h5G1h5G1h5G1h5G1h5G1h5G1h5G1h5G1h5G1h5G1h5G1h5G1h5G1h5G1h5G1h5G1h5G1h5G - 1h5G1h5G1h5G1h5G1h5G1h5G1h5G1h5G1h5G1idN2ChP2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO1yhO - 1yhO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2CVM1z5g3GmE5GmE5GmE5GmE5GmE - 5GmE5GmE5GmE5GmE5GmE5GmE5GmE5GmE5GmE5GmE5GmE5GmE5GmE5GmE5GmE5GmE5GmE5GmE5GmE5GmE - 5GmE5GmE5GmE5GmE5GmE5GmE5GmE5GmE5GmE5GmE5GmE5GmE5GmE5GmE5GmE5GmE5GmE5GmE5GmE5GmE - 5GmE5GmE5GmE5GmE5GmE5GmE5GmE5GmE5GmE5GmE5GmE5GmE5GmE5GmE5GmE5GmE5GmE5GmE5GmE5GmE - 5GmE5GmE5GmE5GmE5GmE5GmE5GmE5GmE5GmE5GmE5GmE5GmE5GmE5GmE5GmE5GmE5GeD5DFW2SZN2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO1yhO1yhO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2B1F1nKM5f////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////0Zn3SJJ1yhO2ChO2ChO2ChO2ChO2ChO2ChO2ChO1yhO1yhO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2B1F1nCK5f////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////v8/0Vm3SJJ1yhO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO1yhO1yhO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2B1F1m+K5f// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //v8/0Vm3SJJ1yhO2ChO2ChO2ChO2ChO2ChO2ChO2ChO1yhO1yhO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2B1F1m+K5f////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////v8/0Vm3SJJ1yhO2ChO2ChO2ChO2ChO2ChO2ChO2ChO1yhO - 1yhO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2B1F1m+K5f////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////v8/0Vm3SJJ1yhO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO1yhO1yhO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2B1F1m+K5f////////////////////7+/+/y/O/y/O/y/O/y/O/y/O/y/O/y/O/y/O/y/O/y/O/y - /O/y/O/y/O/y/O/y/O/y/O/y/O/y/O/y/O/y/O/y/O/y/O/y/O/y/O/y/O/y/O/y/O/y/O/y/O/y/O/y - /O/y/O/y/O/y/O/y/O/y/O/y/O/y/O/y/O/y/O/y/O/y/O/y/O/y/O/y/O/y/O/y/O/y/O/y/O/y/O/y - /O/y/O/y/O/y/O/y/O/y/O/y/O/y/O/y/O/y/O/y/O/y/O/y/O/y/O/y/O/y/O/y/O/y/O7x/PL0/f// - //////////////////v8/0Vm3SJJ1yhO2ChO2ChO2ChO2ChO2ChO2ChO2ChO1yhO1yhO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2B1F1m+K5f///////////////////+3x/GaA2l552GB6 - 2WB62WB62WB62WB62WB62WB62WB62WB62WB62WB62WB62WB62WB62WB62WB62WB62WB62WB62WB62WB6 - 2WB62WB62WB62WB62WB62WB62WB62WB62WB62WB62WB62WB62WB62WB62WB62WB62WB62WB62WB62WB6 - 2WB62WB62WB62WB62WB62WB62WB62WB62WB62WB62WB62WB62WB62WB62WB62WB62WB62WB62WB62WB6 - 2WB62WB62WB62WB62WB62Vp113+U4f////////////////////v8/0Vm3SJJ1yhO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO1yhO1yhO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2B1F1m+K5f// - /////////////////+zw/Ft211Nv1VVw1lVw1lVw1lVw1lVw1lVw1lVw1lVw1lVw1lVw1lVw1lVw1lVw - 1lVw1lVw1lVw1lVw1lVw1lVw1lVw1lVw1lVw1lVw1lVw1lVw1lVw1lVw1lVw1lVw1lVw1lVw1lVw1lVw - 1lVw1lVw1lVw1lVw1lVw1lVw1lVw1lVw1lVw1lVw1lVw1lVw1lVw1lVw1lVw1lVw1lVw1lVw1lVw1lVw - 1lVw1lVw1lVw1lVw1lVw1lVw1lVw1lVw1lVw1lVw1lVw1lVw1lVw1k9r1HWM3v////////////////// - //v8/0Vm3SJJ1yhO2ChO2ChO2ChO2ChO2ChO2ChO2ChO1yhO1yhO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2B1F1m+K5f///////////////////+zw/F142FVx1ldy11dy11dy11dy11dy - 11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy - 11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy - 11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy - 11dy11Ft1XeO3/////////////////////v8/0Vm3SJJ1yhO2ChO2ChO2ChO2ChO2ChO2ChO2ChO1yhO - 1yhO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2B1F1m+K5f////////////////// - /+zw/F142FVx1ldy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy - 11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy - 11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy - 11dy11dy11dy11dy11dy11dy11dy11dy11dy11Ft1XeO3/////////////////////v8/0Vm3SJJ1yhO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO1yhO1yhO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2B1F1m+J5f///////////////////+zw/F142FVx1ldy11dy11dy11dy11dy11dy11dy11dy11dy - 11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy - 11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy - 11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11Ft1XeN3/// - //////////////////v8/0Vm3SJJ1yhO2ChO2ChO2ChO2ChO2ChO2ChO2ChO1yhO1yhO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2B1F1m+K5f///////////////////+zw/F142FVx1ldy - 11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy - 11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy - 11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy - 11dy11dy11dy11dy11dy11Ft1XeO3/////////////////////v8/0Vm3SJJ1yhO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO1yhO1yhO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2B1F1m+K5f// - /////////////////+zw/F142FVx1ldy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy - 11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy - 11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy - 11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11Ft1XeO3/////////////////// - //v8/0Vm3SJJ1yhO2ChO2ChO2ChO2ChO2ChO2ChO2ChO1yhO1yhO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2B1F1m+J5f///////////////////+zw/F142FVx1ldy11dy11dy11dy11dy - 11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy - 11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy - 11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy - 11dy11Ft1XeN3/////////////////////v8/0Vm3SJJ1yhO2ChO2ChO2ChO2ChO2ChO2ChO2ChO1yhO - 1yhO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2B1F1m+K5f////////////////// - /+zw/F142FVx1ldy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy - 11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy - 11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy - 11dy11dy11dy11dy11dy11dy11dy11dy11dy11Ft1XeO3/////////////////////v8/0Vm3SJJ1yhO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO1yhO1yhO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2B1F1m+K5f///////////////////+zw/F142FVx1ldy11dy11dy11dy11dy11dy11dy11dy11dy - 11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy - 11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy - 11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11Ft1XeO3/// - //////////////////v8/0Vm3SJJ1yhO2ChO2ChO2ChO2ChO2ChO2ChO2ChO1yhO1yhO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2B1F1m+K5f///////////////////+zw/F142FVx1ldy - 11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy - 11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy - 11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy - 11dy11dy11dy11dy11dy11Ft1XeO3/////////////////////v8/0Vm3SJJ1yhO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO1yhO1yhO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2B1F1m+K5f// - /////////////////+zw/F142FVx1ldy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy - 11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy - 11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy - 11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11Ft1XeO3/////////////////// - //v8/0Vm3SJJ1yhO2ChO2ChO2ChO2ChO2ChO2ChO2ChO1yhO1yhO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2B1F1m+K5f///////////////////+zw/F142FVx1ldy11dy11dy11dy11dy - 11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy - 11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy - 11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy - 11dy11Ft1XeO3/////////////////////v8/0Vm3SJJ1yhO2ChO2ChO2ChO2ChO2ChO2ChO2ChO1yhO - 1yhO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2B1F1m+K5f////////////////// - /+zw/F142FVx1ldy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy - 11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy - 11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy - 11dy11dy11dy11dy11dy11dy11dy11dy11dy11Ft1XeO3/////////////////////v8/0Vm3SJJ1yhO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO1yhO1yhO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2B1F1m+K5f///////////////////+zw/F142FVx1ldy11dy11dy11dy11dy11dy11dy11dy11dy - 11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy - 11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy - 11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11Ft1XeO3/// - //////////////////v8/0Vm3SJJ1yhO2ChO2ChO2ChO2ChO2ChO2ChO2ChO1yhO1yhO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2B1F1m+K5f///////////////////+zw/F142FVx1ldy - 11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy - 11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy - 11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy - 11dy11dy11dy11dy11dy11Ft1XeO3/////////////////////v8/0Vm3SJJ1yhO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO1yhO1yhO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2B1F1m+J5f// - /////////////////+zw/F142FVx1ldy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy - 11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy - 11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy - 11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11Ft1XeN3/////////////////// - //v8/0Vm3SJJ1yhO2ChO2ChO2ChO2ChO2ChO2ChO2ChO1yhO1yhO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2B1F1m+K5f///////////////////+zw/F142FVx1ldy11dy11dy11dy11dy - 11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy - 11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy - 11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy - 11dy11Ft1XeO3/////////////////////v8/0Vm3SJJ1yhO2ChO2ChO2ChO2ChO2ChO2ChO2ChO1yhO - 1yhO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2B1F1m+K5f////////////////// - /+zw/F142FVx1ldy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy - 11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy - 11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy - 11dy11dy11dy11dy11dy11dy11dy11dy11dy11Ft1XeO3/////////////////////v8/0Vm3SJJ1yhO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO1yhO1yhO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2CdN2B1F1h1F1h1F - 1h1F1h1F1h1F1h1F1h1F1h1F1h1F1h1F1h1F1iNK1ylP2ChO2ChO2ChO2ChO2ChO2ClP2CRL1x1F1h1F - 1h1F1hE71GiD4////////////////////+vv/FVx1kxq1E9r1U9r1U9r1VZy11hz11dy11dy11dy11dy - 11dy11hz11Ft1U9r1U9r1U9r1U9r1U9r1U9r1U9r1U9r1U9r1U9r1U9r1U9r1U9r1U9r1U9r1VJu1Vhz - 11dy11dy11dy11dy11dy11hz11Zx1k9r1U9r1U9r1U9r1U9r1U9r1U9r1U9r1U9r1U9r1U9r1U9r1VRw - 1lhz11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11Ft1XeO3/// - //////////////////v8/0Vm3SJJ1yhO2ChO2ChO2ChO2ChO2ChO2ChO2ChO1yhO1yhO2ChO2ChO2ChO - 2ChO2ChO2ChO2CZN1zFV2m6I5XCK5XCK5XCK5XCK5XCK5XCK5XCK5XCK5XCK5XCK5XGK5Uhp3iRL1yhO - 2ChO2ChO2ChO2ChO2CRL10Jk3XGK5XCK5XCK5WmE5KCx7v////////////////////P1/ZSm5Y+h5JCi - 5ZCi5Y6g5F142FZx1ldy11dy11dy11dy11dy11Zx1oGW4ZCi5ZCi5ZCi5ZCi5ZCi5ZCi5ZCi5ZCi5ZCi - 5ZCi5ZCi5ZCi5ZCi5ZCi5ZCi5XyS4FVw1ldy11dy11dy11dy11dy11Zx1mF72ZCi5ZCi5ZCi5ZCi5ZCi - 5ZCi5ZCi5ZCi5ZCi5ZCi5ZCi5ZCi5WyE3FRw1ldy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy - 11dy11dy11dy11dy11dy11Ft1XeO3/////////////////////v8/0Vm3SJJ1yhO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO1yhO1yhO2ChO2ChO2ChO2ChO2ChO2ChO2CNK10Jk3f////////////////////////// - /////////////////////4yh6xpE1ShO2ChO2ChO2ChO2ChO2BxF1nqS6P////////////////////// - /////////////////////////////////////////2qC21Nv1ldy11dy11dy11dy11dy11Ju1tvh9/// - /////////////////////////////////////////////////////////8vU809r1Vdy11dy11dy11dy - 11dy11Ju1XeO3v///////////////////////////////////////////////5eo505r1Fdy11dy11dy - 11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11Ft1XeO3/////////////////// - //v8/0Vm3SJJ1yhO2ChO2ChO2ChO2ChO2ChO2ChO2ChO1yhO1yhO2ChO2ChO2ChO2ChO2ChO2ChO2CNK - 10Fj3fj5/////////////////////////////////////////////4ie6htE1ShO2ChO2ChO2ChO2ChO - 2BxF1neP5/////////////////////////////////////////////////////////////n6/2mC21Nv - 1ldy11dy11dy11dy11dy11Ju1tXc9v////////////////////////////////////////////////// - /////////8bQ8k9r1Vdy11dy11dy11dy11dy11Ju1XWN3v////////////////////////////////// - /////////////5Wm5k5r1Fdy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy - 11dy11Ft1XeO3/////////////////////v8/0Vm3SJJ1yhO2ChO2ChO2ChO2ChO2ChO2ChO2ChO1yhO - 1yhO2ChO2ChO2ChO2ChO2ChO2ChO2CNK10Fj3fj5//////////////////////////////////////// - /////4ie6htE1ShO2ChO2ChO2ChO2ChO2BxF1naP5/////////////////////////////////////// - //////////////////////n6/2mC21Nv1ldy11dy11dy11dy11dy11Ju1tXc9v////////////////// - /////////////////////////////////////////8bQ8k9r1Vdy11dy11dy11dy11dy11Ju1XWN3v// - /////////////////////////////////////////////5Wm5k5r1Fdy11dy11dy11dy11dy11dy11dy - 11dy11dy11dy11dy11dy11dy11dy11dy11dy11Ft1XeO3/////////////////////v8/0Vm3SJJ1yhO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO1yhO1yhO2ChO2ChO2ChO2ChO2ChO2ChO2CNK10Fj3fj5//////// - /////////////////////////////////////4ie6htE1ShO2ChO2ChO2ChO2ChO2BxF1naP5/////// - //////////////////////////////////////////////////////n6/2mC21Nv1ldy11dy11dy11dy - 11dy11Ju1tXc9v///////////////////////////////////////////////////////////8bQ8k9r - 1Vdy11dy11dy11dy11dy11Ju1XWN3v///////////////////////////////////////////////5Wm - 5k5r1Fdy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11Ft1XeO3/// - //////////////////v8/0Vm3SJJ1yhO2ChO2ChO2ChO2ChO2ChO2ChO2ChO1yhO1yhO2ChO2ChO2ChO - 2ChO2ChO2ChO2CNK10Fj3fj5/////////////////////////////////////////////4qg6htE1ShO - 2ChO2ChO2ChO2ChO2BxF1niQ5/////////////////////////////////////////////////////// - //////39/2qC21Nv1ldy11dy11dy11dy11dy11Ju1tjf9/////////////////////////////////// - /////////////////////////8nS809r1Vdy11dy11dy11dy11dy11Ju1XaN3v////////////////// - /////////////////////////////5Wm5k5r1Fdy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy - 11dy11dy11dy11dy11dy11Ft1XeO3/////////////////////v8/0Vm3SJJ1yhO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO1yhO1yhO2ChO2ChO2ChO2ChO2ChO2ChO2CNK10Fj3fj5/////////////////////+vu - /OTp++Xq++Xq++Xq++Xq+3uU6B1G1ShO2ChO2ChO2ChO2ChO2B5G1m2G5eXq++Xq++Xq++Po++7x/f// - //////////////////7+/+vv++ru++vu++vu++Xp+meA2lRw1ldy11dy11dy11dy11dy11Nv1sXP8uvu - ++vu++vu++vu++vu++vu++vu++vu++vu++vu++vu++vu++vu++vu++vu+7jE71Bs1Vdy11dy11dy11dy - 11dy11Nv1XKJ3evu++vu++vu++vu++vu++vv+/3+/////////////////////5Wm5k5r1Fdy11dy11dy - 11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11Ft1XiO3/////////////////// - //v8/0Vm3SJJ1yhO2ChO2ChO2ChO2ChO2ChO2ChO2ChO1yhO1yhO2ChO2ChO2ChO2ChO2ChO2ChO2CNK - 10Fj3fj5/////////////////////1x54ihN1y9U2S9U2S9U2S9U2StR2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2CtQ2C9U2S9U2S9U2SVL13SN5v///////////////////+3w/GN92Vt211132F132F132Fhz11dy - 11dy11dy11dy11dy11dy11dy11x22F132F132F132F132F132F132F132F132F132F132F132F132F13 - 2F132F132Ft22Fdy11dy11dy11dy11dy11dy11dy11hz11132F132F132F132Fx212F72eru+/////// - /////////////5Wm5k5r1Fdy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy - 11dy11Ft1XeO3/////////////////////v8/0Vm3SJJ1yhO2ChO2ChO2ChO2ChO2ChO2ChO2ChO1yhO - 1yhO2ChO2ChO2ChO2ChO2ChO2ChO2CNK10Fj3fj5/////////////////////1Rz4B1F1SZM1yZM1yZM - 1yZM1ydN2ChO2ChO2ChO2ChO2ChO2ChO2ChO2CdO2CZM1yZM1yZM1xpD1W6I5f////////////////// - /+zw/Ft311Nw1VVx1lVx1lVx1ldy11dy11dy11dy11dy11dy11dy11dy11Zx1lVx1lVx1lVx1lVx1lVx - 1lVx1lVx1lVx1lVx1lVx1lVx1lVx1lVx1lVx1lVx1lZx1ldz11dy11dy11dy11dy11dy11dy11dy11Vx - 1lVx1lVx1lVx1lRw1Vl11+nt+////////////////////5Wm5k5r1Fdy11dy11dy11dy11dy11dy11dy - 11dy11dy11dy11dy11dy11dy11dy11dy11dy11Ft1XeO3/////////////////////v8/0Vm3SJJ1yhO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO1yhO1yhO2ChO2ChO2ChO2ChO2ChO2ChO2CNK10Fj3fj5//////// - /////////////1Z04SBH1ihO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2B1F1m+K5f///////////////////+zw/F142FVx1ldy11dy11dy11dy11dy11dy11dy11dy11dy - 11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy - 11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11Zx1lt22Ont+////////////////////5Wm - 5k5r1Fdy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11Ft1XeO3/// - //////////////////v8/0Vm3SJJ1yhO2ChO2ChO2ChO2ChO2ChO2ChO2ChO1yhO1yhO2ChO2ChO2ChO - 2ChO2ChO2ChO2CNK10Fj3fj5/////////////////////1Z04SBH1ihO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2B1F1m+K5f///////////////////+zw/F142FVx1ldy - 11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy - 11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11Zx - 1lt22Ont+////////////////////5Wm5k5r1Fdy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy - 11dy11dy11dy11dy11dy11Ft1XeO3/////////////////////v8/0Vm3SJJ1yhO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO1yhO1yhO2ChO2ChO2ChO2ChO2ChO2ChO2CNK10Fk3fn6/////////////////////1d1 - 4SBH1ihO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2B1F1m+K5f// - /////////////////+zw/F142FVx1ldy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy - 11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy - 11dy11dy11dy11dy11dy11dy11dy11Zx1lt22Oru+////////////////////5Wm5k5r1Fdy11dy11dy - 11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11Ft1XeO3/////////////////// - //v8/0Vm3SJJ1yhO2ChO2ChO2ChO2ChO2ChO2ChO2ChO1yhO1yhO2ChO2ChO2ChO2ChO2ChO2ChO2CNK - 10Fk3fn6/////////////////////1d14SBH1ihO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2B1F1m+K5f///////////////////+zw/F142FVx1ldy11dy11dy11dy11dy - 11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy - 11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11Zx1lt22Oru+/////// - /////////////5Wm5k5r1Fdy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy - 11dy11Ft1XeO3/////////////////////v8/0Vm3SJJ1yhO2ChO2ChO2ChO2ChO2ChO2ChO2ChO1yhO - 1yhO2ChO2ChO2ChO2ChO2ChO2ChO2CdO2C1S2VBw31Jx4FJx4FJx4FJx4FJx4DFW2idN1yhO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2B1F1m+K5f////////////////// - /+zw/F142FVx1ldy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy - 11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy - 11dy11dy11dy11dy11hz13SK3niO33iO33iO33iO33iO32N82lZx1ldy11dy11dy11dy11dy11dy11dy - 11dy11dy11dy11dy11dy11dy11dy11dy11dy11Ft1XeO3/////////////////////v8/0Vm3SJJ1yhO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO1yhO1yhO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2CdO2CFI1iBI1iBI - 1iBI1iBI1iBI1idN2ChP2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2B1F1m+K5f///////////////////+zw/F142FVx1ldy11dy11dy11dy11dy11dy11dy11dy11dy - 11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy - 11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dz11dy11Ju1lFt1VFt1VFt1VFt1VFt1VVx - 1lhz11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11Ft1XeO3/// - //////////////////v8/0Vm3SJJ1yhO2ChO2ChO2ChO2ChO2ChO2ChO2ChO1yhO1yhO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2B1F1m+K5f///////////////////+zw/F142FVx1ldy - 11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy - 11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy - 11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy - 11dy11dy11dy11dy11dy11Ft1XeO3/////////////////////v8/0Vm3SJJ1yhO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO1yhO1yhO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2B1F1m+K5f// - /////////////////+zw/F142FVx1ldy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy - 11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy - 11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy - 11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11Ft1XeO3/////////////////// - //v8/0Vm3SJJ1yhO2ChO2ChO2ChO2ChO2ChO2ChO2ChO1yhO1yhO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2B1F1m+K5f///////////////////+zw/F142FVx1ldy11dy11dy11dy11dy - 11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy - 11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy - 11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy - 11dy11Ft1XeO3/////////////////////v8/0Vm3SJJ1yhO2ChO2ChO2ChO2ChO2ChO2ChO2ChO1yhO - 1yhO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2B1F1m+K5f////////////////// - /+zw/F142FVx1ldy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy - 11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy - 11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy - 11dy11dy11dy11dy11dy11dy11dy11dy11dy11Ft1XeO3/////////////////////v8/0Vm3SJJ1yhO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO1yhO1yhO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2B1F1m+K5f///////////////////+zw/F142FVx1ldy11dy11dy11dy11dy11dy11dy11dy11dy - 11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy - 11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy - 11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11Ft1XeO3/// - //////////////////v8/0Vm3SJJ1yhO2ChO2ChO2ChO2ChO2ChO2ChO2ChO1yhO1yhO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2CdN2CBI1iBI1iBI1iBI1iBI1iBI1iZN1yhP2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2B1F1m+K5f///////////////////+zw/F142FVx1ldy - 11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy - 11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy - 11dy11Ju1VFt1VFt1VFt1VFt1VFt1VVx1lhz11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy - 11dy11dy11dy11dy11dy11Ft1XeO3/////////////////////v8/0Vm3SJJ1yhO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO1yhO1yhO2ChO2ChO2ChO2ChO2ChO2ChO2CdN2C1T2VNx4FRz4FRz4FRz4FRz4FRz4DJW - 2idN1yhO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2B1F1m+K5f// - /////////////////+zw/F142FVx1ldy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy - 11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy - 11dy11dy11dy11dy11dy11dy11dy11dy11hz13WM3nqQ33qQ33qQ33qQ33qQ32R92lZx1ldy11dy11dy - 11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11Ft1XeO3/////////////////// - //v8/0Vm3SJJ1yhO2ChO2ChO2ChO2ChO2ChO2ChO2ChO1yhO1yhO2ChO2ChO2ChO2ChO2ChO2ChO2CNK - 10Fk3fr7/////////////////////1d14SBH1ihO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2B1F1m+K5f///////////////////+zw/F142FVx1ldy11dy11dy11dy11dy - 11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy - 11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11Zx1lt22Oru+/////// - /////////////5Wm5k5r1Fdy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy - 11dy11Ft1XeO3/////////////////////v8/0Vm3SJJ1yhO2ChO2ChO2ChO2ChO2ChO2ChO2ChO1yhO - 1yhO2ChO2ChO2ChO2ChO2ChO2ChO2CNK10Fj3fn6/////////////////////1d14SBH1ihO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2B1F1m+K5f////////////////// - /+zw/F142FVx1ldy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy - 11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy - 11dy11dy11dy11Zx1lt22Oru+////////////////////5Wm5k5r1Fdy11dy11dy11dy11dy11dy11dy - 11dy11dy11dy11dy11dy11dy11dy11dy11dy11Ft1XeO3/////////////////////v8/0Vm3SJJ1yhO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO1yhO1yhO2ChO2ChO2ChO2ChO2ChO2ChO2CNK10Fj3fj5//////// - /////////////1Z04SBH1ihO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2B1F1m+K5f///////////////////+zw/F142FVx1ldy11dy11dy11dy11dy11dy11dy11dy11dy - 11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy - 11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11Zx1lt22Ont+////////////////////5Wm - 5k5r1Fdy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11Ft1XeO3/// - //////////////////v8/0Vm3SJJ1yhO2ChO2ChO2ChO2ChO2ChO2ChO2ChO1yhO1yhO2ChO2ChO2ChO - 2ChO2ChO2ChO2CNK10Fj3fj5/////////////////////1Z04SBH1ihO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2B1F1m+K5f///////////////////+zw/Ft311Nv1VVw - 1lVw1lVw1lVw1lVw1lVw1lVw1lVw1lVw1lVw1lVw1lVw1lVw1lVw1lVw1lVw1lVw1lVw1lVw1lVw1lVw - 1lVw1lVw1lVw1lVw1lVw1lVw1lVw1lVw1lVw1lVw1lVw1lVw1lVw1lVw1lVw1lVw1lVw1lVw1lVw1lRv - 1Vl01+nt+////////////////////5Ok5Uxp01Vw1lVw1lVw1lVw1lVw1lVw1lVw1lVw1lVw1lVw1lVw - 1lVw1lVw1lVw1lVw1lVw1k9r1HaM3v////////////////////v8/0Vm3SJJ1yhO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO1yhO1yhO2ChO2ChO2ChO2ChO2ChO2ChO2CNK10Fj3fj5/////////////////////1Z0 - 4SBH1ihO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2B1F1m+K5f// - /////////////////+3x/GV/2l542GB52WB52WB52WB52WB52WB52WB52WB52WB52WB52WB52WB52WB5 - 2WB52WB52WB52WB52WB52WB52WB52WB52WB52WB52WB52WB52WB52WB52WB52WB52WB52WB52WB52WB5 - 2WB52WB52WB52WB52WB52WB52WB52V942GN92uru+////////////////////5qq51dz1mB52WB52WB5 - 2WB52WB52WB52WB52WB52WB52WB52WB52WB52WB52WB52WB52WB52Vp1136T4P////////////////// - //v8/0Vm3SJJ1yhO2ChO2ChO2ChO2ChO2ChO2ChO2ChO1yhO1yhO2ChO2ChO2ChO2ChO2ChO2ChO2CNK - 10Fj3fj5/////////////////////1Z14SBH1ihO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2B1F1m+K5f////////////////////7+/+/y/O7x/O7x/O7x/O7x/O7x/O7x - /O7x/O7x/O7x/O7x/O7x/O7x/O7x/O7x/O7x/O7x/O7x/O7x/O7x/O7x/O7x/O7x/O7x/O7x/O7x/O7x - /O7x/O7x/O7x/O7x/O7x/O7x/O7x/O7x/O7x/O7x/O7x/O7x/O7x/O7x/O7x/O7x/O/x/P7+//////// - //////////////X2/e3w++7x/O7x/O7x/O7x/O7x/O7x/O7x/O7x/O7x/O7x/O7x/O7x/O7x/O7x/O7x - /O7x/O3w+/L0/f////////////////////v8/0Vm3SJJ1yhO2ChO2ChO2ChO2ChO2ChO2ChO2ChO1yhO - 1yhO2ChO2ChO2ChO2ChO2ChO2ChO2CNK10Fj3fj5/////////////////////1Z04SBH1ihO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2B1F1m+K5f////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////v8/0Vm3SJJ1yhO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO1yhO1yhO2ChO2ChO2ChO2ChO2ChO2ChO2CNK10Fj3fj5//////// - /////////////1Z04SBH1ihO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2B1F1m+K5f////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////v8/0Vm3SJJ1yhO2ChO2ChO2ChO2ChO2ChO2ChO2ChO1yhO1yhO2ChO2ChO2ChO - 2ChO2ChO2ChO2CNK10Fj3fj5/////////////////////1Z04SBH1ihO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2B1F1m+K5f////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////v8/0Vm3SJJ1yhO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO1yhO1yhO2ChO2ChO2ChO2ChO2ChO2ChO2CNK10Fj3fj5/////////////////////1Z0 - 4SBH1ihO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2B1F1nCK5f// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //v8/0Vm3SJJ1yhO2ChO2ChO2ChO2ChO2ChO2ChO2ChO1yhO1yhO2ChO2ChO2ChO2ChO2ChO2ChO2CNK - 10Fj3fj5/////////////////////1Z04SBH1ihO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2B1F1nKM5f////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////0Zn3SJJ1yhO2ChO2ChO2ChO2ChO2ChO2ChO2ChO1yhO - 1yhO2ChO2ChO2ChO2ChO2ChO2ChO2CNK10Fj3fj5/////////////////////1Z04SBH1ihO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2CVM1z5h3GuF5GqF5GqF5GqF5GqF - 5GqF5GqF5GqF5GqF5GqF5GqF5GqF5GqF5GqF5GqF5GqF5GqF5GqF5GqF5GqF5GqF5GqF5GqF5GqF5GqF - 5GqF5GqF5GqF5GqF5GqF5GqF5GqF5GqF5GqF5GqF5GqF5GqF5GqF5GqF5GqF5GqF5GqF5GqF5GqF5GqF - 5GqF5GqF5GqF5GmE5G6I5evv/f///////////////////6Cy72J/42qF5GqF5GqF5GqF5GqF5GqF5GqF - 5GqF5GqF5GqF5GqF5GqF5GqF5GqF5GqF5GqF5GqF5GqF5GqF5GqF5GqF5GqF5GqF5GmE5DFW2SZN2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO1yhO1yhO2ChO2ChO2ChO2ChO2ChO2ChO2CNK10Fj3fj5//////// - /////////////1Z04SBH1ihO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ClP2CVL1x1F1h1F1h1F1h1F1h1F1h1F1h1F1h1F1h1F1h1F1h1F1h1F1h1F1h1F1h1F1h1F1h1F - 1h1F1h1F1h1F1h1F1h1F1h1F1h1F1h1F1h1F1h1F1h1F1h1F1h1F1h1F1h1F1h1F1h1F1h1F1h1F1h1F - 1h1F1h1F1h1F1h1F1h1F1h1F1h1F1h1F1h1F1h1F1h1F1htD1SNK1+Dn+////////////////////2+J - 5hE81B1F1h1F1h1F1h1F1h1F1h1F1h1F1h1F1h1F1h1F1h1F1h1F1h1F1h1F1h1F1h1F1h1F1h1F1h1F - 1h1F1h1F1h1F1h1F1h5G1idN2ChP2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO1yhO1yhO2ChO2ChO2ChO - 2ChO2ChO2ChO2CNK10Fj3fj5/////////////////////1Z04SBH1ihO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2CZM - 1y1S2eLo+////////////////////3WP5xxF1ihO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO1yhO1yhO2ChO2ChO2ChO2ChO2ChO2ChO2CNK10Fj3fj5/////////////////////1Z0 - 4SBH1ihO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2CZM1y1S2eLo+////////////////////3WP5xxF1ihO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO1yhO1yhO2ChO2ChO2ChO2ChO2ChO2ChO2CNK - 10Fk3fr6/////////////////////1d14SBH1ihO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2CZM1y1S2eTp+/////// - /////////////3aP5xxF1ihO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO1yhO - 1yhO2ChO2ChO2ChO2ChO2ChO2ChO2CNK10Fj3fT2/vz9//z9//z9//z9//z9/1Z04SBH1ihO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2CZM1y1S2d/l+vz9//z9//z9//z9//z9/3SO5xxF1ihO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO1yhO1yhO2ChO2ChO2ChO2ChO2ChO2ChO2CdO2CxS2Uho3klq3klq - 3klq3klq3klq3i9U2SdN1yhO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ClP2ERm3Ulq3klq3klq3klq3klq3jRY - 2iZN1yhO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO1yhO1yhO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2CdO2CJJ1yJJ1yJJ1yJJ1yJJ1yJJ1ydN2ChP2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2CNK1yJJ1yJJ1yJJ1yJJ1yJJ1yZM1ylP2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO1yhO1yhO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO1yhO1yhO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO1yhO - 1yhO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO1yhO1yhO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO1yhO1yhO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO1yhO1yhO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2CdN2B9H1h9H1h9H1h9H1h9H1h9H1iZN - 1yhP2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2CBI1h9H1h9H1h9H1h9H1h9H1iVL1ylP2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO1yhO1yhO2ChO2ChO2ChO2ChO2ChO2ChO2CdN - 2C5U2Vx54l574l574l574l574l574jRY2iZN1yhO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ClP2Fd14V974l57 - 4l574l574l974jxf3CVM1yhO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO1yhO - 1yhO2ChO2ChO2ChO2ChO2ChO2ChO2CNK10Jk3f7+/////////////////////1h24SBH1ihO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2CZM1y1S2efs/P///////////////////3iQ5xxF1ihO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO1yhO1yhO2ChO2ChO2ChO2ChO2ChO2ChO2CNK10Fj3fj5//////// - /////////////1Z14SBH1ihO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2CZM1y1S2eLo+////////////////////3aP - 5xxF1ihO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO1yhO1yhO2ChO2ChO2ChO - 2ChO2ChO2ChO2CNK10Fj3fj5/////////////////////1Z04SBH1ihO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2CZM - 1y1S2eLo+////////////////////3WP5xxF1ihO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO1yhO1yhO2ChO2ChO2ChO2ChO2ChO2ChO2CNK10Fj3fj5/////////////////////1Z0 - 4SBH1ihO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2CZM1y1S2eLo+////////////////////3WP5xxF1ihO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO1yhO1yhO2ChO2ChO2ChO2ChO2ChO2ChO2CNK - 10Fj3fj5/////////////////////1Ny4BxE1SRL1yRL1yRL1yRL1yZN1yhO2ChO2ChO2ChO2ChO2ChO - 2ChO2CdN2CRL1yRL1yRL1yRL1yRL1yRL1yRL1yRL1yRL1yRL1yRL1yRL1yRL1yRL1yRL1yVL1yhO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2CVM1yRL1yRL1yRL1yRL1yRL1yRL1yRL1yRL1yRL1yRL1yRL1yRL1yRL - 1yRL1yRL1yZM1yhO2ChO2ChO2ChO2ChO2ChO2ChO2CdO2CRL1yRL1yRL1yRL1yJJ1ilP2OHn+/////// - /////////////3WP5xxF1ihO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO1yhO - 1yhO2ChO2ChO2ChO2ChO2ChO2ChO2CNK10Fj3fj5/////////////////////2J+4zBU2Tdb2zdb2zdb - 2zdb2y9U2SdO2ChO2ChO2ChO2ChO2ChO2CdO2C5T2Tdb2zdb2zdb2zdb2zdb2zdb2zdb2zdb2zdb2zdb - 2zdb2zdb2zdb2zdb2zdb2zZa2ypQ2ChO2ChO2ChO2ChO2ChO2ChO2ChO2DNY2jdb2zdb2zdb2zdb2zdb - 2zdb2zdb2zdb2zdb2zdb2zdb2zdb2zdb2zdb2zdb2zJW2idO2ChO2ChO2ChO2ChO2ChO2ChO2CtR2Ddb - 2zdb2zdb2zdb2zVZ2jxe3OTq+////////////////////3WP5xxF1ihO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO1yhO1yhO2ChO2ChO2ChO2ChO2ChO2ChO2CNK10Fj3fj5//////// - //////////////L0/e3x/e7x/e7x/e7x/e7x/YCX6BxF1ShO2ChO2ChO2ChO2ChO2B1G1nCJ5u7x/e7x - /e7x/e7x/e7x/e7x/e7x/e7x/e7x/e7x/e7x/e7x/e7x/e7x/e7x/eXq/D1g3CRL1yhO2ChO2ChO2ChO - 2ChO2CNK17vI9O7x/e7x/e7x/e7x/e7x/e7x/e7x/e7x/e7x/e7x/e7x/e7x/e7x/e7x/e7x/am58R5G - 1ihO2ChO2ChO2ChO2ChO2CJJ1kts3u7x/e7x/e7x/e7x/e7x/e7y/f7+/////////////////////3WP - 5xxF1ihO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO1yhO1yhO2ChO2ChO2ChO - 2ChO2ChO2ChO2CNK10Fj3fj5/////////////////////////////////////////////4mf6htE1ShO - 2ChO2ChO2ChO2ChO2BxF1niQ5/////////////////////////////////////////////////////// - //////r7/0Bi3CNK1yhO2ChO2ChO2ChO2ChO2CJJ18zV9/////////////////////////////////// - /////////////////////////7fF8x1F1ihO2ChO2ChO2ChO2ChO2CFI1k9v3/////////////////// - /////////////////////////////3WP5xxF1ihO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO1yhO1yhO2ChO2ChO2ChO2ChO2ChO2ChO2CNK10Fj3fj5//////////////////////// - /////////////////////4ie6htE1ShO2ChO2ChO2ChO2ChO2BxF1naP5/////////////////////// - //////////////////////////////////////b4/z9h3CNK1yhO2ChO2ChO2ChO2ChO2CJJ18nT9v// - /////////////////////////////////////////////////////////7XD8x1F1ihO2ChO2ChO2ChO - 2ChO2CFI1k5u3////////////////////////////////////////////////3WP5xxF1ihO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO1yhO1yhO2ChO2ChO2ChO2ChO2ChO2ChO2CNK - 10Fj3fj5/////////////////////////////////////////////4ie6htE1ShO2ChO2ChO2ChO2ChO - 2BxF1naP5/////////////////////////////////////////////////////////////b4/z9h3CNK - 1yhO2ChO2ChO2ChO2ChO2CJJ18nT9v////////////////////////////////////////////////// - /////////7XD8x1F1ihO2ChO2ChO2ChO2ChO2CFI1k5u3/////////////////////////////////// - /////////////3WP5xxF1ihO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO1yhO - 1yhO2ChO2ChO2ChO2ChO2ChO2ChO2CNK10Fj3fj5//////////////////////////////////////// - /////4ie6htE1ShO2ChO2ChO2ChO2ChO2BxF1neP5/////////////////////////////////////// - //////////////////////b4/z9h3CNK1yhO2ChO2ChO2ChO2ChO2CJJ18nT9v////////////////// - /////////////////////////////////////////7XD8x1F1ihO2ChO2ChO2ChO2ChO2CFI1k5v3/// - /////////////////////////////////////////////3aP5xxF1ihO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO1yhO1yhO2ChO2ChO2ChO2ChO2ChO2ChO2CNK10Jk3f////////// - /////////////////////////////////////4ug6xtE1ShO2ChO2ChO2ChO2ChO2BxF1nmR5/////// - //////////////////////////////////////////////////////3+/0Bi3CNK1yhO2ChO2ChO2ChO - 2ChO2CJJ187X9////////////////////////////////////////////////////////////7nH9B1F - 1ihO2ChO2ChO2ChO2ChO2CFI1lBw3////////////////////////////////////////////////3iR - 5xxF1ihO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO1yhO1yhO2ChO2ChO2ChO - 2ChO2ChO2ChO2CdN2C9U2WF942N/42N/42N/42N/42N/42N/42N/42N/42N/42N/42N/40Jk3SVM1yhO - 2ChO2ChO2ChO2ChO2CVM1z5g3GN/42N/42N/42N/42N/42N/42N/42N/42N/42N/42N/42N/42N/42N/ - 42N/42B94y5U2SdN2ChO2ChO2ChO2ChO2ChO2CdN2FRz4GN/42N/42N/42N/42N/42N/42N/42N/42N/ - 42N/42N/42N/42N/42N/42N/409u3yVM1yhO2ChO2ChO2ChO2ChO2CZN1zNX2mN/42N/42N/42N/42N/ - 42N/42N/42N/42N/42N/42N/42N/4z1g3CVM1yhO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO1yhO1yhO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2CdN2B9G1h5G1h5G1h5G1h5G1h5G1h5G - 1h5G1h5G1h5G1h5G1h5G1iRL1ylP2ChO2ChO2ChO2ChO2ChO2ClP2CVL1x5G1h5G1h5G1h5G1h5G1h5G - 1h5G1h5G1h5G1h5G1h5G1h5G1h5G1h5G1h5G1h9G1idN2ChO2ChO2ChO2ChO2ChO2ChO2ChP2CFI1h5G - 1h5G1h5G1h5G1h5G1h5G1h5G1h5G1h5G1h5G1h5G1h5G1h5G1h5G1h5G1iJJ1ylP2ChO2ChO2ChO2ChO - 2ChO2ChP2CZN2B5G1h5G1h5G1h5G1h5G1h5G1h5G1h5G1h5G1h5G1h5G1h5G1iVL1ylP2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO1yhO1yhO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO1yhO - 1yhO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO1yhO1yhO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO1yhO1yhO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO1yhO1yhO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO1yhO1yhO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO1yhO - 1yhO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO1yhO1yhO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO1yhO1yhO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO1yhO1yhO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO1yhO1yhO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO1yhO - 1yhO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO1yhO1yhO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO1yhO1yhO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO1yhO1yhO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO1yhO1yhO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO1yhO - 1yhO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO1yhO1yhO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO - 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO1yhO1ihO1yhO1yhO1yhO - 1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO - 1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO - 1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO - 1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO - 1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO - 1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO - 1yhO1yhO1yhO1gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - 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 - AAAAAAAAAAAAAAAAAAAAAAAAKAAAAEAAAACAAAAAAQAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAChO - 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO - 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO - 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO - 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO - 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO - 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO - 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO - 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO - 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO - 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO - 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO - 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO - 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO - 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO - 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO - 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO - 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO - 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO - 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO - 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO - 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO - 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO - 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO - 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO - 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO - 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO - 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO - 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO - 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO - 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1rDH8sbX9sbX9sbX9sbX9sbX9sbX9sbX - 9sbX9sbX9sbX9sbX9sbX9sbX9sbX9sbX9sbX9sbX9sbX9sbX9sbX9sbX9sbX9sbX9sbX9sbX9sbX9sbX - 9sbX9sbX9sbX9sbX9sbX9sbX9sbX9sbX9sbX9sbX9sbX9sbX9sbX9sbX9rDH8ihO1ihO1ihO1ihO1ihO - 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1uPs+/////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////////////////+Ps+yhO - 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO - 1uPs+/////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////+Ps+yhO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO - 1ihO1ihO1ihO1ihO1uPs+/////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////+Ps+yhO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO - 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1uPs+/////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////+Ps+yhO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO - 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1uPs+////////////+rv+ldy1Vdy1Vdy - 1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy - 1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1erv+v///////////+Ps+yhO1ihO1ihO1ihO1ihO - 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1uPs+/////////// - /+rv+ldy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy - 1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1erv+v///////////+Ps+yhO - 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO - 1uPs+////////////+rv+ldy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy - 1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1erv+v// - /////////+Ps+yhO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO - 1ihO1ihO1ihO1ihO1uPs+////////////+rv+ldy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy - 1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy - 1Vdy1Vdy1erv+v///////////+Ps+yhO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO - 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1uPs+////////////+rv+ldy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy - 1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy - 1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1erv+v///////////+Ps+yhO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO - 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1uPs+////////////+rv+ldy1Vdy1Vdy - 1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy - 1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1erv+v///////////+Ps+yhO1ihO1ihO1ihO1ihO - 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1uPs+/////////// - /+rv+ldy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy - 1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1erv+v///////////+Ps+yhO - 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO - 1uPs+////////////+rv+ldy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy - 1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1erv+v// - /////////+Ps+yhO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO - 1ihO1ihO1ihO1ihO1uPs+////////////+rv+ldy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy - 1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy - 1Vdy1Vdy1erv+v///////////+Ps+yhO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1uPs+/////////////// - /////////1Z+4ShO1ihO1ihO1uPs+////////////////////////////7PE7Vdy1Vdy1Vdy1bPE7f// - //////////////////////////X3/Vdy1Vdy1Vdy1XSO3P///////////////////////+rv+ldy1Vdy - 1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1erv+v///////////+Ps+yhO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1uPs - +////////////////////////1Z+4ShO1ihO1ihO1uPs+////////////////////////////7PE7Vdy - 1Vdy1Vdy1bPE7f////////////////////////////X3/Vdy1Vdy1Vdy1XSO3P////////////////// - /////+rv+ldy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1erv+v///////////+Ps+yhO1ihO1ihO1ihO1ihO - 1ihO1ihO1ihO1uPs+////////////////////////1Z+4ShO1ihO1ihO1uPs+/////////////////// - /////////7PE7Vdy1Vdy1Vdy1bPE7f////////////////////////////X3/Vdy1Vdy1Vdy1XSO3P// - /////////////////////+rv+ldy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1erv+v///////////+Ps+yhO - 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1uPs+////////////////////////1Z+4ShO1ihO1ihO1uPs+/// - /////////////////////////7PE7Vdy1Vdy1Vdy1bPE7f////////////////////////////X3/Vdy - 1Vdy1Vdy1XSO3P///////////////////////+rv+ldy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1erv+v// - /////////+Ps+yhO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1uPs+/////////////n7/sbX9sbX9kpy3ihO - 1ihO1ihO1rDH8sbX9vj6/v////////////r7/tPe9Zqw51dy1Vdy1Vdy1Zqw59Pe9dPe9dPe9dPe9dPe - 9dPe9dPe9cvX81dy1Vdy1Vdy1WyH29Pe9dPe9fv8/v///////////+rv+ldy1Vdy1Vdy1Vdy1Vdy1Vdy - 1Vdy1Vdy1erv+v///////////+Ps+yhO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1uPs+////////////+Ps - +yhO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1uPs+////////////+rv+ldy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy - 1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1erv+v///////////+rv+ldy1Vdy - 1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1erv+v///////////+Ps+yhO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1uPs - +////////////+Ps+yhO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1uPs+////////////+rv+ldy1Vdy1Vdy - 1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1erv+v////// - /////+rv+ldy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1erv+v///////////+Ps+yhO1ihO1ihO1ihO1ihO - 1ihO1ihO1ihO1jtj2j5m3D5m3D5m3Dtj2ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1uPs+/////////// - /+rv+ldy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy - 1Vdy1WeC2mqE2mqE2mqE2meC2ldy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1erv+v///////////+Ps+yhO - 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO - 1uPs+////////////+rv+ldy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy - 1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1erv+v// - /////////+Ps+yhO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO - 1ihO1ihO1ihO1ihO1uPs+////////////+rv+ldy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy - 1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy - 1Vdy1Vdy1erv+v///////////+Ps+yhO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO - 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1uPs+////////////+rv+ldy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy - 1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy - 1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1erv+v///////////+Ps+yhO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1rDH - 8sbX9sbX9sbX9rDH8ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1uPs+////////////+rv+ldy1Vdy1Vdy - 1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1cPR8dPe9dPe - 9dPe9cPR8Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1erv+v///////////+Ps+yhO1ihO1ihO1ihO1ihO - 1ihO1ihO1ihO1uPs+////////////+Ps+yhO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1uPs+/////////// - /+rv+ldy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy - 1Vdy1erv+v///////////+rv+ldy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1erv+v///////////+Ps+yhO - 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1uPs+////////////+Ps+yhO1ihO1ihO1ihO1ihO1ihO1ihO1ihO - 1uPs+/////////////X3/ai766i766i766i766i766i766i766i766i766i766i766i766i766i766i7 - 66i766i766i766i766i76/X3/f////////////X3/ai766i766i766i766i766i766i766i76/X3/f// - /////////+Ps+yhO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1uPs+////////////+Ps+yhO1ihO1ihO1ihO - 1ihO1ihO1ihO1ihO1uPs+/////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////+Ps+yhO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1uPs+////////////+Ps - +yhO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1uPs+/////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////+Ps+yhO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1uPs - +////////////+Ps+yhO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1uPs+/////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////+Ps+yhO1ihO1ihO1ihO1ihO - 1ihO1ihO1ihO1uPs+////////////+Ps+yhO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1uPs+/////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////////////////+Ps+yhO - 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1uPs+////////////+Ps+yhO1ihO1ihO1ihO1ihO1ihO1ihO1ihO - 1lB44FZ+4VZ+4VZ+4VZ+4VZ+4VZ+4VZ+4VZ+4VZ+4VZ+4VZ+4VZ+4VZ+4VZ+4VZ+4VZ+4VZ+4VZ+4VZ+ - 4VZ+4VZ+4VZ+4VZ+4VZ+4erx/P///////////+rx/FZ+4VZ+4VZ+4VZ+4VZ+4VZ+4VZ+4VZ+4VZ+4VZ+ - 4VZ+4VZ+4VB44ChO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1uPs+////////////+Ps+yhO1ihO1ihO1ihO - 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO - 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1uPs+////////////+Ps+yhO1ihO1ihO1ihO1ihO1ihO - 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1lB44FZ+4VZ+4VZ+4VB4 - 4ChO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO - 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1lB44FZ+4VZ+4VZ+4VB44ChO1ihO - 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO - 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO - 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO - 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO - 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO - 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO - 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO - 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO - 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO - 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO - 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1pez7anC8qnC8qnC8pez7ShO1ihO1ihO1ihO - 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO - 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1pez7anC8qnC8qnC8pez7ShO1ihO1ihO1ihO1ihO1ihO - 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1uPs+////////////+Ps - +yhO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO - 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1uPs+////////////+Ps+yhO1ihO - 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1uPs - +////////////+zy/WOJ5GOJ5DVe2ShO1ihO1ihO1luC4mOJ5GOJ5GOJ5GOJ5GOJ5GOJ5GOJ5Edw3ihO - 1ihO1ihO1kdw3mOJ5GOJ5GOJ5GOJ5GOJ5GOJ5GOJ5F+G4yhO1ihO1ihO1jJa2GOJ5GOJ5Ozy/f////// - /////+Ps+yhO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO - 1ihO1ihO1ihO1uPs+////////////////////////1Z+4ShO1ihO1ihO1uPs+/////////////////// - /////////5u37ihO1ihO1ihO1pu37v////////////////////////////L2/ShO1ihO1ihO1kpy3v// - /////////////////////+Ps+yhO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO - 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1uPs+////////////////////////1Z+4ShO1ihO1ihO1uPs+/// - /////////////////////////5u37ihO1ihO1ihO1pu37v////////////////////////////L2/ShO - 1ihO1ihO1kpy3v///////////////////////+Ps+yhO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO - 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1uPs+////////////////////////1Z+4ShO - 1ihO1ihO1uPs+////////////////////////////5u37ihO1ihO1ihO1pu37v////////////////// - //////////L2/ShO1ihO1ihO1kpy3v///////////////////////+Ps+yhO1ihO1ihO1ihO1ihO1ihO - 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1uPs+/////////////// - /////////1Z+4ShO1ihO1ihO1uPs+////////////////////////////5u37ihO1ihO1ihO1pu37v// - //////////////////////////L2/ShO1ihO1ihO1kpy3v///////////////////////+Ps+yhO1ihO - 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1nOX - 536g6X6g6X6g6X6g6X6g6X6g6Ttj2ihO1ihO1ihO1nOX536g6X6g6X6g6X6g6X6g6X6g6X6g6VV94ShO - 1ihO1ihO1lV94X6g6X6g6X6g6X6g6X6g6X6g6X6g6Xmc6ChO1ihO1ihO1jZe2X6g6X6g6X6g6X6g6X6g - 6X6g6XOX5yhO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO - 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO - 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO - 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO - 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO - 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO - 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO - 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO - 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO - 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO - 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO - 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO - 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO - 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO - 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO - 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO - 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO - 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO - 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO - 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO - 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO - 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO - 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO - 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO - 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO - 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO - 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO - 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO - 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO - 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1gAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAKAAAADAAAABgAAAAAQAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAChO - 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO - 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO - 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO - 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO - 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO - 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO - 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO - 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO - 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO - 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO - 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO - 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO - 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO - 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO - 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ipQ - 1jJb2TJb2TJb2TJb2TJb2TJb2TJb2TJb2TJb2TJb2TJb2TJb2TJb2TJb2TJb2TJb2TJb2TJb2TJb2TJb - 2TJb2TJb2TJb2TJb2TJb2TJb2TJb2TJb2TJb2TJb2TJb2TFZ2ChO1ihO1ihO1ihO1ihO1ihO1ihO1ihO - 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1kpy3v////////////////////////////////////////////// - /////////////////////////////////////////////////////////////////////////////+Ps - +yhO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1kpy3v////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////+Ps+yhO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO - 1ihO1ihO1ihO1kpy3v////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////+Ps+yhO1ihO1ihO1ihO - 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1kpy3v///////////8nW8qi766i766i766i7 - 66i766i766i766i766i766i766i766i766i766i766i766i766i766i766i766i766i766i766i766i7 - 6+Tr+f///////+Ps+yhO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1kpy - 3v///////////5Kp5Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy - 1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1cnW8v///////+Ps+yhO1ihO1ihO1ihO1ihO1ihO1ihO1ihO - 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1kpy3v///////////5Kp5Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy - 1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1cnW8v///////+Ps - +yhO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1kpy3v///////////5Kp - 5Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy - 1Vdy1Vdy1Vdy1Vdy1cnW8v///////+Ps+yhO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO - 1ihO1ihO1ihO1kpy3v///////////5Kp5Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy - 1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1cnW8v///////+Ps+yhO1ihO1ihO1ihO - 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1kpy3v///////////5Kp5Vdy1Vdy1Vdy1Vdy - 1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy - 1cnW8v///////+Ps+yhO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1kpy - 3v///////////5Kp5Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy - 1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1cnW8v///////+Ps+yhO1ihO1ihO1ihO1ihO1ihO1rDH8sbX - 9sbX9sbX9sbX9maM5ChO1ihO1pCu7NDe+P///////////+Tr+aq97Fdy1Vdy1Yqi4tPe9dPe9dPe9dPe - 9dPe9cvX81dy1Vdy1WWA2dPe9dPe9dPe9dPe9dPe9WyH21dy1Vdy1Vdy1Vdy1Vdy1cnW8v///////+Ps - +yhO1ihO1ihO1ihO1ihO1ihO1uPs+////////////////36g6ShO1ihO1rfM9P////////////////// - /8nW8ldy1Vdy1Z2y6P////////////////////X3/Vdy1Vdy1WqE2v///////////////////3SO3Fdy - 1Vdy1Vdy1Vdy1Vdy1cnW8v///////+Ps+yhO1ihO1ihO1ihO1ihO1ihO1uPs+////////////////36g - 6ShO1ihO1rfM9P///////////////////8nW8ldy1Vdy1Z2y6P////////////////////X3/Vdy1Vdy - 1WqE2v///////////////////3SO3Fdy1Vdy1Vdy1Vdy1Vdy1cnW8v///////+Ps+yhO1ihO1ihO1ihO - 1ihO1ihO1uPs+/////////P2/dXh+WyR5ShO1ihO1pq27tzn+v///////////+vv+rLD7Vdy1Vdy1Y+m - 5N/n+N/n+N/n+N/n+N/n+NXf9Vdy1Vdy1WaB2d/n+Ovv+v///////////3SO3Fdy1Vdy1Vdy1Vdy1Vdy - 1cnW8v///////+Ps+yhO1ihO1ihO1ihO1ihO1ihO1uPs+////////7fM9ChO1ihO1ihO1ihO1ihO1kpy - 3v///////////5Kp5Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1ZKp5f// - /////////3SO3Fdy1Vdy1Vdy1Vdy1Vdy1cnW8v///////+Ps+yhO1ihO1ihO1ihO1ihO1ihO1pez7anC - 8qnC8n2f6ShO1ihO1ihO1ihO1ihO1kpy3v///////////5Kp5Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy - 1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1XuV377M777M777M72iD2ldy1Vdy1Vdy1Vdy1Vdy1cnW8v///////+Ps - +yhO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1kpy3v///////////5Kp - 5Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy - 1Vdy1Vdy1Vdy1Vdy1cnW8v///////+Ps+yhO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO - 1ihO1ihO1ihO1kpy3v///////////5Kp5Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy - 1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1cnW8v///////+Ps+yhO1ihO1ihO1ihO - 1ihO1ihO1luC4mOJ5GOJ5E943yhO1ihO1ihO1ihO1ihO1kpy3v///////////5Kp5Vdy1Vdy1Vdy1Vdy - 1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1WiD2oig4oig4oig4mB711dy1Vdy1Vdy1Vdy1Vdy - 1cnW8v///////+Ps+yhO1ihO1ihO1ihO1ihO1ihO1uPs+////////7fM9ChO1ihO1ihO1ihO1ihO1kpy - 3v///////////5Kp5Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1ZKp5f// - /////////3SO3Fdy1Vdy1Vdy1Vdy1Vdy1cnW8v///////+Ps+yhO1ihO1ihO1ihO1ihO1ihO1uPs+/// - /////7fM9ChO1ihO1ihO1ihO1ihO1kpy3v///////////9bg9b7M777M777M777M777M777M777M777M - 777M777M777M777M777M777M79bg9f///////////8rW8r7M777M777M777M777M7+vv+v///////+Ps - +yhO1ihO1ihO1ihO1ihO1ihO1uPs+////////7fM9ChO1ihO1ihO1ihO1ihO1kpy3v////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////+Ps+yhO1ihO1ihO1ihO1ihO1ihO1uPs+////////7fM9ChO1ihO - 1ihO1ihO1ihO1kpy3v////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////+Ps+yhO1ihO1ihO1ihO - 1ihO1ihO1uPs+////////7fM9ChO1ihO1ihO1ihO1ihO1kdw3vL2/fL2/fL2/fL2/fL2/fL2/fL2/fL2 - /fL2/fL2/fL2/fL2/fL2/fL2/fL2/fL2/fL2/fL2/ff6/v////////////T3/fL2/fL2/fL2/fL2/fL2 - /fL2/fL2/fL2/dbi+ShO1ihO1ihO1ihO1ihO1ihO1uPs+////////7fM9ChO1ihO1ihO1ihO1ihO1ihO - 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1nGV5/// - /////////0py3ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1nOX536g - 6X6g6WGH4yhO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO - 1ihO1ihO1ihO1ihO1ihO1ihO1kVu3n6g6X6g6X6g6TZe2ShO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO - 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO - 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO - 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO - 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO - 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO - 1ihO1ihO1n6g6Yys7Iys7GqP5ShO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO - 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1kpy3oys7Iys7Iys7Dhg2ihO1ihO1ihO1ihO1ihO - 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1uPs+////////7fM9ChO1ihO1ihO1ihO1ihO1ihO - 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1nGV5/// - /////////0py3ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1uPs+/// - /////+7z/cbX9maM5ChO1ihO1pCu7MbX9sbX9sbX9sbX9sbX9pCu7ChO1ihO1maM5MbX9sbX9sbX9sbX - 9sbX9rvP9ShO1ihO1jhg2sbX9tvm+v///////////0py3ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO - 1ihO1ihO1ihO1ihO1ihO1ihO1uPs+////////////////36g6ShO1ihO1rfM9P////////////////// - /7fM9ChO1ihO1n6g6f////////////////////L2/ShO1ihO1j5m3P///////////////////0py3ihO - 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1uPs+////////////////36g - 6ShO1ihO1rfM9P///////////////////7fM9ChO1ihO1n6g6f////////////////////L2/ShO1ihO - 1j5m3P///////////////////0py3ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO - 1ihO1ihO1sra9+Ps++Ps++Ps++Ps+3OX5yhO1ihO1qS+8OPs++Ps++Ps++Ps++Ps+6S+8ChO1ihO1nOX - 5+Ps++Ps++Ps++Ps++Ps+9bi+ShO1ihO1jtj2uPs++Ps++Ps++Ps++Ps+0Vu3ihO1ihO1ihO1ihO1ihO - 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO - 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO - 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO - 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO - 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO - 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO - 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO - 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO - 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO - 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO - 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO - 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO - 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO - 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO - 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO - 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO - 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO - 1ihO1ihO1ihO1gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgAAAAgAAAAQAAAAAEAGAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYo - TtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYo - TtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYo - TtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYo - TtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYo - TtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYo - TtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYo - TtZFbt5xledxledxledxledxledxledxledxledxledxledxledxledxledxledxledxledxledxledx - ledxledrkeUoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtZ+oOn///////////////////////// - ///////////////////////////////////////////////////////y9v0oTtYoTtYoTtYoTtYoTtYo - TtYoTtYoTtYoTtYoTtZ+oOn///////////////////////////////////////////////////////// - ///////////////////////y9v0oTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtZ+oOn////19/1X - ctVXctVXctVXctVXctVXctVXctVXctVXctVXctVXctVXctVXctVXctVXctVXctWdsuj////y9v0oTtYo - TtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtZ+oOn////19/1XctVXctVXctVXctVXctVXctVXctVXctVX - ctVXctVXctVXctVXctVXctVXctVXctWdsuj////y9v0oTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYo - TtZ+oOn////19/1XctVXctVXctVXctVXctVXctVXctVXctVXctVXctVXctVXctVXctVXctVXctVXctWd - suj////y9v0oTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtZ+oOn////19/1XctVXctVXctVXctVX - ctVXctVXctVXctVXctVXctVXctVXctVXctVXctVXctVXctWdsuj////y9v0oTtYoTtYoTtYoTtaFpuqM - rOyMrOxjieQoTtZQeOC+0fX////6+/6XreZXctVviduou+uou+uou+uou+tXctVge9eou+uou+uou+t5 - k95XctVXctVXctWdsuj////y9v0oTtYoTtYoTtYoTtby9v3///////+pwvIoTtZ+oOn////////////f - 5/hXctWIoOL///////////////9XctVqhNr///////////+dsuhXctVXctVXctWdsuj////y9v0oTtYo - TtYoTtYoTtby9v3////w9P2Xs+0oTtZzl+fv9P3////+/v/N2PNXctWBm+Dq7/rq7/rq7/rq7/pXctVn - gtrq7/r+/v////+dsuhXctVXctVXctWdsuj////y9v0oTtYoTtYoTtYoTtby9v3///9+oOkoTtYoTtYo - TtZ+oOn////19/1XctVXctVXctVXctVXctVXctVXctVXctVXctVXctX19/3///+dsuhXctVXctVXctWd - suj////y9v0oTtYoTtYoTtYoTtYyWtgyW9ktVNcoTtYoTtYoTtZ+oOn////19/1XctVXctVXctVXctVX - ctVXctVXctVXctVXctVXctVge9dge9dbdtZXctVXctVXctWdsuj////y9v0oTtYoTtYoTtYoTtYoTtYo - TtYoTtYoTtYoTtYoTtZ+oOn////19/1XctVXctVXctVXctVXctVXctVXctVXctVXctVXctVXctVXctVX - ctVXctVXctVXctWdsuj////y9v0oTtYoTtYoTtYoTtbW4vnj7Ptzl+coTtYoTtYoTtZ+oOn////19/1X - ctVXctVXctVXctVXctVXctVXctVXctVXctVXctXg5/jq7/qUq+ZXctVXctVXctWdsuj////y9v0oTtYo - TtYoTtYoTtby9v3///9+oOkoTtYoTtYoTtZ+oOn////9/v/T3vXT3vXT3vXT3vXT3vXT3vXT3vXT3vXT - 3vXT3vX9/v/////n7frT3vXT3vXT3vXn7fn////y9v0oTtYoTtYoTtYoTtby9v3///9+oOkoTtYoTtYo - TtZ+oOn///////////////////////////////////////////////////////////////////////// - ///////y9v0oTtYoTtYoTtYoTtby9v3///9+oOkoTtYoTtYoTtZbguKpwvKpwvKpwvKpwvKpwvKpwvKp - wvKpwvKpwvKpwvKpwvKpwvL7/P7////O3fepwvKpwvKpwvKpwvKpwvKguu8oTtYoTtYoTtYoTtaguu+p - wvJbguIoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtaguu+pwvJb - guIoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYo - TtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYo - TtYoTtYoTtZfhuNjieRAadwoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYo - TtYoTtZfhuNjieRAadwoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtby9v3///+Ws+08ZdsoTtY2 - XtlKct5Kct5Kct5DbN0oTtYyWthKct5Kct5Kct5Kct4oTtYsU9dKct70+P7///9+oOkoTtYoTtYoTtYo - TtYoTtYoTtYoTtYoTtYoTtYoTtby9v3///////+pwvIoTtZ+oOn////////////V4fkoTtZjieT///// - //////////8oTtY+Ztz///////////9+oOkoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtby9v3/ - //////+pwvIoTtZ+oOn////////////V4fkoTtZjieT///////////////8oTtY+Ztz///////////9+ - oOkoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtZTe+FWfuFWfuFEbN0oTtY7Y9pWfuFWfuFWfuFM - dd8oTtY1XtlWfuFWfuFWfuFWfuEoTtYtVNdWfuFWfuFWfuE7Y9ooTtYoTtYoTtYoTtYoTtYoTtYoTtYo - TtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYo - TtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYo - TtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYo - TtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYo - TtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYo - TtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYo - TtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgAAAAQAAAAIAAAAAEAGAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYo - TtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYo - TtaRr+y6zvS6zvS6zvS6zvS6zvS6zvS6zvS6zvS6zvS4zfQoTtYoTtYoTtYoTtYoTtbJ2fbT3vWou+uo - u+uou+uou+uou+uou+uou+u+zO////8oTtYoTtYoTtYoTtYoTtbJ2faou+tXctVXctVXctVXctVXctVX - ctVXctV+l+D///8oTtYoTtZWfuFMdd8yW9nW4vm8zPBeedd+l+B+l+BZddZ+l+B0jtxXctV+l+D///8o - TtYoTtb////M2/dTe+H8/f/19/1yjNz19/319/1ge9f7/P7T3vVXctV+l+D///8oTtYoTtabt+5Bat0o - TtbJ2faou+tXctVXctVXctVXctWDnOGasOdXctV+l+D///8oTtYoTtZ+oOk7Y9ooTtbJ2faou+tXctVX - ctVXctVXctV5k96KouJXctV+l+D///8oTtYoTtb///9WfuEoTtbI2Pb09/3o7vro7vro7vro7vr09/36 - +/7o7vru8vv///8oTtYoTtbV4flMdd8oTtZTe+FjieRjieRjieRjieRjieSivPDB1PZjieRjieRjieQo - TtYoTtZKct4wWNgoTtYoTtYoTtYoTtYoTtYoTtYoTtY4YNpBat0oTtYoTtYoTtYoTtYoTtb///+kvvBE - bN2pwvKguu88ZdupwvKpwvIvVtfV4fnG1/YoTtYoTtYoTtYoTtYoTtapwvKOrexEbN2pwvKguu88Zdup - wvKpwvIvVtepwvKFpuooTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYo - TtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYo - TtYAAKxBAACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQAA - rEEAAKxB - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + 17, 17 + + + 142, 17 + + + 275, 17 + + + 578, 17 + + + 399, 17 + + + + + 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 + WOnXh4eD/n9cDgydCIDheC4AdCIAhmMCgE4EwHBMANCJABiOCQA6EQDDEQDoRAAMRwCgEwEwHL8DgE4E + wHAEADoRAMOxBIBOBMBwBAA6EQDDEQDoRAAMRwCgEwEwHAGATgTAcAQAOhEAwxEA6EQADEcAoBMBMBwB + gE4EwHAEADoRAMMRAOhEAAxHAKATATAcAYBOBMBwBAA6EQDDhboceEevdK5ZQQAwqdp8MEgNYQKATkwA + hiMA0IkAGI47AkEnAmA4JgDoRAAMRwCgEwEwHAGATgTAcAQAOhEAwxEA6EQADEcAoBMBMBxnAkInzgQ0 + HBMAdGICMFy4CWCbmgAIACZHAAzHmYDQiQAYjiUAdCIAhgszARQDsOZ6AoBJFdIqACd1yJxLrg20HQGo + kDATgPevAF133UgAMKnCeFpmLFoisy+8MtB2BKBCwkwAks9LdvegCK8oJuO6klAf4mTzfoE2IwAVEmYC + AHQjABVCAGAiAlAhoZYAgGYEoEKYAGAiAlAhTAAwEQGoECYAmIgAVAgBgIkIQIUQAJiIAFQIAYCJCECF + EACYiABUSGFsWOatflCaTz417l0B9ulZcb6MPP8MAdDNzWZk/9MvkMYjjo17V4B9Bh75vmT6torU1Ufy + 9QhACY7jFC/ZdPO5uHcF2CeRahJJJosXE0WBAAAWIwCAxQgAYDECAFiMAAAWIwCAxQgAYDECAFiMAAAW + IwCAxQgAYDECAFiMAAAWIwCAxQgAYDECAFiMAAAWIwCAxQgAYDECAFiMAAAWIwCAxQgAYDECAFiMAAAW + IwCAxQgAYDECAFiMAAAWIwCAxQgAYDECAFiMAAAWIwCAxQgAYDECAFiMAAAWIwCAxQgAYDECAFjsP/mS + ZR6W2nupAAAAAElFTkSuQmCCKAAAAIAAAAAAAQAAAQAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAChO + 1ihO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO + 1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO + 1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO + 1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO + 1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO + 1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO + 1yhO1yhO1yhO1yhO1yhO1yhO1yhO1ihO1yhO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO1yhO1yhO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO1yhO1yhO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO1yhO1yhO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO1yhO + 1yhO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO1yhO1yhO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO1yhO1yhO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO1yhO1yhO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO1yhO1yhO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO1yhO + 1yhO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO1yhO1yhO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO1yhO1yhO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO1yhO1yhO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO1yhO1yhO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO1yhO + 1yhO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO1yhO1yhO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO1yhO1yhO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO1yhO1yhO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO1yhO1yhO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ClP2CVL1x5G1h5G1h5G1h5G1h5G1h5G1h5G1h5G1h5G1h5G1h5G1h5G1h5G + 1h5G1h5G1h5G1h5G1h5G1h5G1h5G1h5G1h5G1h5G1h5G1h5G1h5G1h5G1h5G1h5G1h5G1h5G1h5G1h5G + 1h5G1h5G1h5G1h5G1h5G1h5G1h5G1h5G1h5G1h5G1h5G1h5G1h5G1h5G1h5G1h5G1h5G1h5G1h5G1h5G + 1h5G1h5G1h5G1h5G1h5G1h5G1h5G1h5G1h5G1h5G1h5G1h5G1h5G1h5G1h5G1h5G1h5G1h5G1h5G1h5G + 1h5G1h5G1h5G1h5G1h5G1h5G1h5G1h5G1h5G1idN2ChP2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO1yhO + 1yhO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2CVM1z5g3GmE5GmE5GmE5GmE5GmE + 5GmE5GmE5GmE5GmE5GmE5GmE5GmE5GmE5GmE5GmE5GmE5GmE5GmE5GmE5GmE5GmE5GmE5GmE5GmE5GmE + 5GmE5GmE5GmE5GmE5GmE5GmE5GmE5GmE5GmE5GmE5GmE5GmE5GmE5GmE5GmE5GmE5GmE5GmE5GmE5GmE + 5GmE5GmE5GmE5GmE5GmE5GmE5GmE5GmE5GmE5GmE5GmE5GmE5GmE5GmE5GmE5GmE5GmE5GmE5GmE5GmE + 5GmE5GmE5GmE5GmE5GmE5GmE5GmE5GmE5GmE5GmE5GmE5GmE5GmE5GmE5GmE5GmE5GeD5DFW2SZN2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO1yhO1yhO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2B1F1nKM5f////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////0Zn3SJJ1yhO2ChO2ChO2ChO2ChO2ChO2ChO2ChO1yhO1yhO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2B1F1nCK5f////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////v8/0Vm3SJJ1yhO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO1yhO1yhO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2B1F1m+K5f// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //v8/0Vm3SJJ1yhO2ChO2ChO2ChO2ChO2ChO2ChO2ChO1yhO1yhO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2B1F1m+K5f////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////v8/0Vm3SJJ1yhO2ChO2ChO2ChO2ChO2ChO2ChO2ChO1yhO + 1yhO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2B1F1m+K5f////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////v8/0Vm3SJJ1yhO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO1yhO1yhO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2B1F1m+K5f////////////////////7+/+/y/O/y/O/y/O/y/O/y/O/y/O/y/O/y/O/y/O/y/O/y + /O/y/O/y/O/y/O/y/O/y/O/y/O/y/O/y/O/y/O/y/O/y/O/y/O/y/O/y/O/y/O/y/O/y/O/y/O/y/O/y + /O/y/O/y/O/y/O/y/O/y/O/y/O/y/O/y/O/y/O/y/O/y/O/y/O/y/O/y/O/y/O/y/O/y/O/y/O/y/O/y + /O/y/O/y/O/y/O/y/O/y/O/y/O/y/O/y/O/y/O/y/O/y/O/y/O/y/O/y/O/y/O/y/O/y/O7x/PL0/f// + //////////////////v8/0Vm3SJJ1yhO2ChO2ChO2ChO2ChO2ChO2ChO2ChO1yhO1yhO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2B1F1m+K5f///////////////////+3x/GaA2l552GB6 + 2WB62WB62WB62WB62WB62WB62WB62WB62WB62WB62WB62WB62WB62WB62WB62WB62WB62WB62WB62WB6 + 2WB62WB62WB62WB62WB62WB62WB62WB62WB62WB62WB62WB62WB62WB62WB62WB62WB62WB62WB62WB6 + 2WB62WB62WB62WB62WB62WB62WB62WB62WB62WB62WB62WB62WB62WB62WB62WB62WB62WB62WB62WB6 + 2WB62WB62WB62WB62WB62Vp113+U4f////////////////////v8/0Vm3SJJ1yhO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO1yhO1yhO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2B1F1m+K5f// + /////////////////+zw/Ft211Nv1VVw1lVw1lVw1lVw1lVw1lVw1lVw1lVw1lVw1lVw1lVw1lVw1lVw + 1lVw1lVw1lVw1lVw1lVw1lVw1lVw1lVw1lVw1lVw1lVw1lVw1lVw1lVw1lVw1lVw1lVw1lVw1lVw1lVw + 1lVw1lVw1lVw1lVw1lVw1lVw1lVw1lVw1lVw1lVw1lVw1lVw1lVw1lVw1lVw1lVw1lVw1lVw1lVw1lVw + 1lVw1lVw1lVw1lVw1lVw1lVw1lVw1lVw1lVw1lVw1lVw1lVw1lVw1k9r1HWM3v////////////////// + //v8/0Vm3SJJ1yhO2ChO2ChO2ChO2ChO2ChO2ChO2ChO1yhO1yhO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2B1F1m+K5f///////////////////+zw/F142FVx1ldy11dy11dy11dy11dy + 11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy + 11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy + 11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy + 11dy11Ft1XeO3/////////////////////v8/0Vm3SJJ1yhO2ChO2ChO2ChO2ChO2ChO2ChO2ChO1yhO + 1yhO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2B1F1m+K5f////////////////// + /+zw/F142FVx1ldy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy + 11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy + 11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy + 11dy11dy11dy11dy11dy11dy11dy11dy11dy11Ft1XeO3/////////////////////v8/0Vm3SJJ1yhO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO1yhO1yhO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2B1F1m+J5f///////////////////+zw/F142FVx1ldy11dy11dy11dy11dy11dy11dy11dy11dy + 11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy + 11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy + 11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11Ft1XeN3/// + //////////////////v8/0Vm3SJJ1yhO2ChO2ChO2ChO2ChO2ChO2ChO2ChO1yhO1yhO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2B1F1m+K5f///////////////////+zw/F142FVx1ldy + 11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy + 11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy + 11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy + 11dy11dy11dy11dy11dy11Ft1XeO3/////////////////////v8/0Vm3SJJ1yhO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO1yhO1yhO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2B1F1m+K5f// + /////////////////+zw/F142FVx1ldy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy + 11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy + 11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy + 11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11Ft1XeO3/////////////////// + //v8/0Vm3SJJ1yhO2ChO2ChO2ChO2ChO2ChO2ChO2ChO1yhO1yhO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2B1F1m+J5f///////////////////+zw/F142FVx1ldy11dy11dy11dy11dy + 11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy + 11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy + 11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy + 11dy11Ft1XeN3/////////////////////v8/0Vm3SJJ1yhO2ChO2ChO2ChO2ChO2ChO2ChO2ChO1yhO + 1yhO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2B1F1m+K5f////////////////// + /+zw/F142FVx1ldy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy + 11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy + 11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy + 11dy11dy11dy11dy11dy11dy11dy11dy11dy11Ft1XeO3/////////////////////v8/0Vm3SJJ1yhO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO1yhO1yhO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2B1F1m+K5f///////////////////+zw/F142FVx1ldy11dy11dy11dy11dy11dy11dy11dy11dy + 11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy + 11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy + 11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11Ft1XeO3/// + //////////////////v8/0Vm3SJJ1yhO2ChO2ChO2ChO2ChO2ChO2ChO2ChO1yhO1yhO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2B1F1m+K5f///////////////////+zw/F142FVx1ldy + 11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy + 11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy + 11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy + 11dy11dy11dy11dy11dy11Ft1XeO3/////////////////////v8/0Vm3SJJ1yhO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO1yhO1yhO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2B1F1m+K5f// + /////////////////+zw/F142FVx1ldy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy + 11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy + 11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy + 11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11Ft1XeO3/////////////////// + //v8/0Vm3SJJ1yhO2ChO2ChO2ChO2ChO2ChO2ChO2ChO1yhO1yhO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2B1F1m+K5f///////////////////+zw/F142FVx1ldy11dy11dy11dy11dy + 11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy + 11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy + 11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy + 11dy11Ft1XeO3/////////////////////v8/0Vm3SJJ1yhO2ChO2ChO2ChO2ChO2ChO2ChO2ChO1yhO + 1yhO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2B1F1m+K5f////////////////// + /+zw/F142FVx1ldy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy + 11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy + 11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy + 11dy11dy11dy11dy11dy11dy11dy11dy11dy11Ft1XeO3/////////////////////v8/0Vm3SJJ1yhO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO1yhO1yhO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2B1F1m+K5f///////////////////+zw/F142FVx1ldy11dy11dy11dy11dy11dy11dy11dy11dy + 11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy + 11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy + 11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11Ft1XeO3/// + //////////////////v8/0Vm3SJJ1yhO2ChO2ChO2ChO2ChO2ChO2ChO2ChO1yhO1yhO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2B1F1m+K5f///////////////////+zw/F142FVx1ldy + 11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy + 11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy + 11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy + 11dy11dy11dy11dy11dy11Ft1XeO3/////////////////////v8/0Vm3SJJ1yhO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO1yhO1yhO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2B1F1m+J5f// + /////////////////+zw/F142FVx1ldy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy + 11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy + 11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy + 11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11Ft1XeN3/////////////////// + //v8/0Vm3SJJ1yhO2ChO2ChO2ChO2ChO2ChO2ChO2ChO1yhO1yhO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2B1F1m+K5f///////////////////+zw/F142FVx1ldy11dy11dy11dy11dy + 11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy + 11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy + 11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy + 11dy11Ft1XeO3/////////////////////v8/0Vm3SJJ1yhO2ChO2ChO2ChO2ChO2ChO2ChO2ChO1yhO + 1yhO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2B1F1m+K5f////////////////// + /+zw/F142FVx1ldy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy + 11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy + 11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy + 11dy11dy11dy11dy11dy11dy11dy11dy11dy11Ft1XeO3/////////////////////v8/0Vm3SJJ1yhO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO1yhO1yhO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2CdN2B1F1h1F1h1F + 1h1F1h1F1h1F1h1F1h1F1h1F1h1F1h1F1h1F1iNK1ylP2ChO2ChO2ChO2ChO2ChO2ClP2CRL1x1F1h1F + 1h1F1hE71GiD4////////////////////+vv/FVx1kxq1E9r1U9r1U9r1VZy11hz11dy11dy11dy11dy + 11dy11hz11Ft1U9r1U9r1U9r1U9r1U9r1U9r1U9r1U9r1U9r1U9r1U9r1U9r1U9r1U9r1U9r1VJu1Vhz + 11dy11dy11dy11dy11dy11hz11Zx1k9r1U9r1U9r1U9r1U9r1U9r1U9r1U9r1U9r1U9r1U9r1U9r1VRw + 1lhz11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11Ft1XeO3/// + //////////////////v8/0Vm3SJJ1yhO2ChO2ChO2ChO2ChO2ChO2ChO2ChO1yhO1yhO2ChO2ChO2ChO + 2ChO2ChO2ChO2CZN1zFV2m6I5XCK5XCK5XCK5XCK5XCK5XCK5XCK5XCK5XCK5XCK5XGK5Uhp3iRL1yhO + 2ChO2ChO2ChO2ChO2CRL10Jk3XGK5XCK5XCK5WmE5KCx7v////////////////////P1/ZSm5Y+h5JCi + 5ZCi5Y6g5F142FZx1ldy11dy11dy11dy11dy11Zx1oGW4ZCi5ZCi5ZCi5ZCi5ZCi5ZCi5ZCi5ZCi5ZCi + 5ZCi5ZCi5ZCi5ZCi5ZCi5ZCi5XyS4FVw1ldy11dy11dy11dy11dy11Zx1mF72ZCi5ZCi5ZCi5ZCi5ZCi + 5ZCi5ZCi5ZCi5ZCi5ZCi5ZCi5ZCi5WyE3FRw1ldy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy + 11dy11dy11dy11dy11dy11Ft1XeO3/////////////////////v8/0Vm3SJJ1yhO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO1yhO1yhO2ChO2ChO2ChO2ChO2ChO2ChO2CNK10Jk3f////////////////////////// + /////////////////////4yh6xpE1ShO2ChO2ChO2ChO2ChO2BxF1nqS6P////////////////////// + /////////////////////////////////////////2qC21Nv1ldy11dy11dy11dy11dy11Ju1tvh9/// + /////////////////////////////////////////////////////////8vU809r1Vdy11dy11dy11dy + 11dy11Ju1XeO3v///////////////////////////////////////////////5eo505r1Fdy11dy11dy + 11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11Ft1XeO3/////////////////// + //v8/0Vm3SJJ1yhO2ChO2ChO2ChO2ChO2ChO2ChO2ChO1yhO1yhO2ChO2ChO2ChO2ChO2ChO2ChO2CNK + 10Fj3fj5/////////////////////////////////////////////4ie6htE1ShO2ChO2ChO2ChO2ChO + 2BxF1neP5/////////////////////////////////////////////////////////////n6/2mC21Nv + 1ldy11dy11dy11dy11dy11Ju1tXc9v////////////////////////////////////////////////// + /////////8bQ8k9r1Vdy11dy11dy11dy11dy11Ju1XWN3v////////////////////////////////// + /////////////5Wm5k5r1Fdy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy + 11dy11Ft1XeO3/////////////////////v8/0Vm3SJJ1yhO2ChO2ChO2ChO2ChO2ChO2ChO2ChO1yhO + 1yhO2ChO2ChO2ChO2ChO2ChO2ChO2CNK10Fj3fj5//////////////////////////////////////// + /////4ie6htE1ShO2ChO2ChO2ChO2ChO2BxF1naP5/////////////////////////////////////// + //////////////////////n6/2mC21Nv1ldy11dy11dy11dy11dy11Ju1tXc9v////////////////// + /////////////////////////////////////////8bQ8k9r1Vdy11dy11dy11dy11dy11Ju1XWN3v// + /////////////////////////////////////////////5Wm5k5r1Fdy11dy11dy11dy11dy11dy11dy + 11dy11dy11dy11dy11dy11dy11dy11dy11dy11Ft1XeO3/////////////////////v8/0Vm3SJJ1yhO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO1yhO1yhO2ChO2ChO2ChO2ChO2ChO2ChO2CNK10Fj3fj5//////// + /////////////////////////////////////4ie6htE1ShO2ChO2ChO2ChO2ChO2BxF1naP5/////// + //////////////////////////////////////////////////////n6/2mC21Nv1ldy11dy11dy11dy + 11dy11Ju1tXc9v///////////////////////////////////////////////////////////8bQ8k9r + 1Vdy11dy11dy11dy11dy11Ju1XWN3v///////////////////////////////////////////////5Wm + 5k5r1Fdy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11Ft1XeO3/// + //////////////////v8/0Vm3SJJ1yhO2ChO2ChO2ChO2ChO2ChO2ChO2ChO1yhO1yhO2ChO2ChO2ChO + 2ChO2ChO2ChO2CNK10Fj3fj5/////////////////////////////////////////////4qg6htE1ShO + 2ChO2ChO2ChO2ChO2BxF1niQ5/////////////////////////////////////////////////////// + //////39/2qC21Nv1ldy11dy11dy11dy11dy11Ju1tjf9/////////////////////////////////// + /////////////////////////8nS809r1Vdy11dy11dy11dy11dy11Ju1XaN3v////////////////// + /////////////////////////////5Wm5k5r1Fdy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy + 11dy11dy11dy11dy11dy11Ft1XeO3/////////////////////v8/0Vm3SJJ1yhO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO1yhO1yhO2ChO2ChO2ChO2ChO2ChO2ChO2CNK10Fj3fj5/////////////////////+vu + /OTp++Xq++Xq++Xq++Xq+3uU6B1G1ShO2ChO2ChO2ChO2ChO2B5G1m2G5eXq++Xq++Xq++Po++7x/f// + //////////////////7+/+vv++ru++vu++vu++Xp+meA2lRw1ldy11dy11dy11dy11dy11Nv1sXP8uvu + ++vu++vu++vu++vu++vu++vu++vu++vu++vu++vu++vu++vu++vu++vu+7jE71Bs1Vdy11dy11dy11dy + 11dy11Nv1XKJ3evu++vu++vu++vu++vu++vv+/3+/////////////////////5Wm5k5r1Fdy11dy11dy + 11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11Ft1XiO3/////////////////// + //v8/0Vm3SJJ1yhO2ChO2ChO2ChO2ChO2ChO2ChO2ChO1yhO1yhO2ChO2ChO2ChO2ChO2ChO2ChO2CNK + 10Fj3fj5/////////////////////1x54ihN1y9U2S9U2S9U2S9U2StR2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2CtQ2C9U2S9U2S9U2SVL13SN5v///////////////////+3w/GN92Vt211132F132F132Fhz11dy + 11dy11dy11dy11dy11dy11dy11x22F132F132F132F132F132F132F132F132F132F132F132F132F13 + 2F132F132Ft22Fdy11dy11dy11dy11dy11dy11dy11hz11132F132F132F132Fx212F72eru+/////// + /////////////5Wm5k5r1Fdy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy + 11dy11Ft1XeO3/////////////////////v8/0Vm3SJJ1yhO2ChO2ChO2ChO2ChO2ChO2ChO2ChO1yhO + 1yhO2ChO2ChO2ChO2ChO2ChO2ChO2CNK10Fj3fj5/////////////////////1Rz4B1F1SZM1yZM1yZM + 1yZM1ydN2ChO2ChO2ChO2ChO2ChO2ChO2ChO2CdO2CZM1yZM1yZM1xpD1W6I5f////////////////// + /+zw/Ft311Nw1VVx1lVx1lVx1ldy11dy11dy11dy11dy11dy11dy11dy11Zx1lVx1lVx1lVx1lVx1lVx + 1lVx1lVx1lVx1lVx1lVx1lVx1lVx1lVx1lVx1lVx1lZx1ldz11dy11dy11dy11dy11dy11dy11dy11Vx + 1lVx1lVx1lVx1lRw1Vl11+nt+////////////////////5Wm5k5r1Fdy11dy11dy11dy11dy11dy11dy + 11dy11dy11dy11dy11dy11dy11dy11dy11dy11Ft1XeO3/////////////////////v8/0Vm3SJJ1yhO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO1yhO1yhO2ChO2ChO2ChO2ChO2ChO2ChO2CNK10Fj3fj5//////// + /////////////1Z04SBH1ihO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2B1F1m+K5f///////////////////+zw/F142FVx1ldy11dy11dy11dy11dy11dy11dy11dy11dy + 11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy + 11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11Zx1lt22Ont+////////////////////5Wm + 5k5r1Fdy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11Ft1XeO3/// + //////////////////v8/0Vm3SJJ1yhO2ChO2ChO2ChO2ChO2ChO2ChO2ChO1yhO1yhO2ChO2ChO2ChO + 2ChO2ChO2ChO2CNK10Fj3fj5/////////////////////1Z04SBH1ihO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2B1F1m+K5f///////////////////+zw/F142FVx1ldy + 11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy + 11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11Zx + 1lt22Ont+////////////////////5Wm5k5r1Fdy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy + 11dy11dy11dy11dy11dy11Ft1XeO3/////////////////////v8/0Vm3SJJ1yhO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO1yhO1yhO2ChO2ChO2ChO2ChO2ChO2ChO2CNK10Fk3fn6/////////////////////1d1 + 4SBH1ihO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2B1F1m+K5f// + /////////////////+zw/F142FVx1ldy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy + 11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy + 11dy11dy11dy11dy11dy11dy11dy11Zx1lt22Oru+////////////////////5Wm5k5r1Fdy11dy11dy + 11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11Ft1XeO3/////////////////// + //v8/0Vm3SJJ1yhO2ChO2ChO2ChO2ChO2ChO2ChO2ChO1yhO1yhO2ChO2ChO2ChO2ChO2ChO2ChO2CNK + 10Fk3fn6/////////////////////1d14SBH1ihO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2B1F1m+K5f///////////////////+zw/F142FVx1ldy11dy11dy11dy11dy + 11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy + 11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11Zx1lt22Oru+/////// + /////////////5Wm5k5r1Fdy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy + 11dy11Ft1XeO3/////////////////////v8/0Vm3SJJ1yhO2ChO2ChO2ChO2ChO2ChO2ChO2ChO1yhO + 1yhO2ChO2ChO2ChO2ChO2ChO2ChO2CdO2C1S2VBw31Jx4FJx4FJx4FJx4FJx4DFW2idN1yhO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2B1F1m+K5f////////////////// + /+zw/F142FVx1ldy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy + 11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy + 11dy11dy11dy11dy11hz13SK3niO33iO33iO33iO33iO32N82lZx1ldy11dy11dy11dy11dy11dy11dy + 11dy11dy11dy11dy11dy11dy11dy11dy11dy11Ft1XeO3/////////////////////v8/0Vm3SJJ1yhO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO1yhO1yhO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2CdO2CFI1iBI1iBI + 1iBI1iBI1iBI1idN2ChP2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2B1F1m+K5f///////////////////+zw/F142FVx1ldy11dy11dy11dy11dy11dy11dy11dy11dy + 11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy + 11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dz11dy11Ju1lFt1VFt1VFt1VFt1VFt1VVx + 1lhz11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11Ft1XeO3/// + //////////////////v8/0Vm3SJJ1yhO2ChO2ChO2ChO2ChO2ChO2ChO2ChO1yhO1yhO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2B1F1m+K5f///////////////////+zw/F142FVx1ldy + 11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy + 11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy + 11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy + 11dy11dy11dy11dy11dy11Ft1XeO3/////////////////////v8/0Vm3SJJ1yhO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO1yhO1yhO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2B1F1m+K5f// + /////////////////+zw/F142FVx1ldy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy + 11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy + 11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy + 11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11Ft1XeO3/////////////////// + //v8/0Vm3SJJ1yhO2ChO2ChO2ChO2ChO2ChO2ChO2ChO1yhO1yhO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2B1F1m+K5f///////////////////+zw/F142FVx1ldy11dy11dy11dy11dy + 11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy + 11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy + 11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy + 11dy11Ft1XeO3/////////////////////v8/0Vm3SJJ1yhO2ChO2ChO2ChO2ChO2ChO2ChO2ChO1yhO + 1yhO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2B1F1m+K5f////////////////// + /+zw/F142FVx1ldy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy + 11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy + 11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy + 11dy11dy11dy11dy11dy11dy11dy11dy11dy11Ft1XeO3/////////////////////v8/0Vm3SJJ1yhO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO1yhO1yhO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2B1F1m+K5f///////////////////+zw/F142FVx1ldy11dy11dy11dy11dy11dy11dy11dy11dy + 11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy + 11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy + 11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11Ft1XeO3/// + //////////////////v8/0Vm3SJJ1yhO2ChO2ChO2ChO2ChO2ChO2ChO2ChO1yhO1yhO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2CdN2CBI1iBI1iBI1iBI1iBI1iBI1iZN1yhP2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2B1F1m+K5f///////////////////+zw/F142FVx1ldy + 11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy + 11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy + 11dy11Ju1VFt1VFt1VFt1VFt1VFt1VVx1lhz11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy + 11dy11dy11dy11dy11dy11Ft1XeO3/////////////////////v8/0Vm3SJJ1yhO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO1yhO1yhO2ChO2ChO2ChO2ChO2ChO2ChO2CdN2C1T2VNx4FRz4FRz4FRz4FRz4FRz4DJW + 2idN1yhO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2B1F1m+K5f// + /////////////////+zw/F142FVx1ldy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy + 11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy + 11dy11dy11dy11dy11dy11dy11dy11dy11hz13WM3nqQ33qQ33qQ33qQ33qQ32R92lZx1ldy11dy11dy + 11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11Ft1XeO3/////////////////// + //v8/0Vm3SJJ1yhO2ChO2ChO2ChO2ChO2ChO2ChO2ChO1yhO1yhO2ChO2ChO2ChO2ChO2ChO2ChO2CNK + 10Fk3fr7/////////////////////1d14SBH1ihO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2B1F1m+K5f///////////////////+zw/F142FVx1ldy11dy11dy11dy11dy + 11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy + 11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11Zx1lt22Oru+/////// + /////////////5Wm5k5r1Fdy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy + 11dy11Ft1XeO3/////////////////////v8/0Vm3SJJ1yhO2ChO2ChO2ChO2ChO2ChO2ChO2ChO1yhO + 1yhO2ChO2ChO2ChO2ChO2ChO2ChO2CNK10Fj3fn6/////////////////////1d14SBH1ihO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2B1F1m+K5f////////////////// + /+zw/F142FVx1ldy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy + 11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy + 11dy11dy11dy11Zx1lt22Oru+////////////////////5Wm5k5r1Fdy11dy11dy11dy11dy11dy11dy + 11dy11dy11dy11dy11dy11dy11dy11dy11dy11Ft1XeO3/////////////////////v8/0Vm3SJJ1yhO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO1yhO1yhO2ChO2ChO2ChO2ChO2ChO2ChO2CNK10Fj3fj5//////// + /////////////1Z04SBH1ihO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2B1F1m+K5f///////////////////+zw/F142FVx1ldy11dy11dy11dy11dy11dy11dy11dy11dy + 11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy + 11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11Zx1lt22Ont+////////////////////5Wm + 5k5r1Fdy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11dy11Ft1XeO3/// + //////////////////v8/0Vm3SJJ1yhO2ChO2ChO2ChO2ChO2ChO2ChO2ChO1yhO1yhO2ChO2ChO2ChO + 2ChO2ChO2ChO2CNK10Fj3fj5/////////////////////1Z04SBH1ihO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2B1F1m+K5f///////////////////+zw/Ft311Nv1VVw + 1lVw1lVw1lVw1lVw1lVw1lVw1lVw1lVw1lVw1lVw1lVw1lVw1lVw1lVw1lVw1lVw1lVw1lVw1lVw1lVw + 1lVw1lVw1lVw1lVw1lVw1lVw1lVw1lVw1lVw1lVw1lVw1lVw1lVw1lVw1lVw1lVw1lVw1lVw1lVw1lRv + 1Vl01+nt+////////////////////5Ok5Uxp01Vw1lVw1lVw1lVw1lVw1lVw1lVw1lVw1lVw1lVw1lVw + 1lVw1lVw1lVw1lVw1lVw1k9r1HaM3v////////////////////v8/0Vm3SJJ1yhO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO1yhO1yhO2ChO2ChO2ChO2ChO2ChO2ChO2CNK10Fj3fj5/////////////////////1Z0 + 4SBH1ihO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2B1F1m+K5f// + /////////////////+3x/GV/2l542GB52WB52WB52WB52WB52WB52WB52WB52WB52WB52WB52WB52WB5 + 2WB52WB52WB52WB52WB52WB52WB52WB52WB52WB52WB52WB52WB52WB52WB52WB52WB52WB52WB52WB5 + 2WB52WB52WB52WB52WB52WB52WB52V942GN92uru+////////////////////5qq51dz1mB52WB52WB5 + 2WB52WB52WB52WB52WB52WB52WB52WB52WB52WB52WB52WB52WB52Vp1136T4P////////////////// + //v8/0Vm3SJJ1yhO2ChO2ChO2ChO2ChO2ChO2ChO2ChO1yhO1yhO2ChO2ChO2ChO2ChO2ChO2ChO2CNK + 10Fj3fj5/////////////////////1Z14SBH1ihO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2B1F1m+K5f////////////////////7+/+/y/O7x/O7x/O7x/O7x/O7x/O7x + /O7x/O7x/O7x/O7x/O7x/O7x/O7x/O7x/O7x/O7x/O7x/O7x/O7x/O7x/O7x/O7x/O7x/O7x/O7x/O7x + /O7x/O7x/O7x/O7x/O7x/O7x/O7x/O7x/O7x/O7x/O7x/O7x/O7x/O7x/O7x/O7x/O/x/P7+//////// + //////////////X2/e3w++7x/O7x/O7x/O7x/O7x/O7x/O7x/O7x/O7x/O7x/O7x/O7x/O7x/O7x/O7x + /O7x/O3w+/L0/f////////////////////v8/0Vm3SJJ1yhO2ChO2ChO2ChO2ChO2ChO2ChO2ChO1yhO + 1yhO2ChO2ChO2ChO2ChO2ChO2ChO2CNK10Fj3fj5/////////////////////1Z04SBH1ihO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2B1F1m+K5f////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////v8/0Vm3SJJ1yhO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO1yhO1yhO2ChO2ChO2ChO2ChO2ChO2ChO2CNK10Fj3fj5//////// + /////////////1Z04SBH1ihO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2B1F1m+K5f////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////v8/0Vm3SJJ1yhO2ChO2ChO2ChO2ChO2ChO2ChO2ChO1yhO1yhO2ChO2ChO2ChO + 2ChO2ChO2ChO2CNK10Fj3fj5/////////////////////1Z04SBH1ihO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2B1F1m+K5f////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////v8/0Vm3SJJ1yhO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO1yhO1yhO2ChO2ChO2ChO2ChO2ChO2ChO2CNK10Fj3fj5/////////////////////1Z0 + 4SBH1ihO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2B1F1nCK5f// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //v8/0Vm3SJJ1yhO2ChO2ChO2ChO2ChO2ChO2ChO2ChO1yhO1yhO2ChO2ChO2ChO2ChO2ChO2ChO2CNK + 10Fj3fj5/////////////////////1Z04SBH1ihO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2B1F1nKM5f////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////0Zn3SJJ1yhO2ChO2ChO2ChO2ChO2ChO2ChO2ChO1yhO + 1yhO2ChO2ChO2ChO2ChO2ChO2ChO2CNK10Fj3fj5/////////////////////1Z04SBH1ihO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2CVM1z5h3GuF5GqF5GqF5GqF5GqF + 5GqF5GqF5GqF5GqF5GqF5GqF5GqF5GqF5GqF5GqF5GqF5GqF5GqF5GqF5GqF5GqF5GqF5GqF5GqF5GqF + 5GqF5GqF5GqF5GqF5GqF5GqF5GqF5GqF5GqF5GqF5GqF5GqF5GqF5GqF5GqF5GqF5GqF5GqF5GqF5GqF + 5GqF5GqF5GqF5GmE5G6I5evv/f///////////////////6Cy72J/42qF5GqF5GqF5GqF5GqF5GqF5GqF + 5GqF5GqF5GqF5GqF5GqF5GqF5GqF5GqF5GqF5GqF5GqF5GqF5GqF5GqF5GqF5GqF5GmE5DFW2SZN2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO1yhO1yhO2ChO2ChO2ChO2ChO2ChO2ChO2CNK10Fj3fj5//////// + /////////////1Z04SBH1ihO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ClP2CVL1x1F1h1F1h1F1h1F1h1F1h1F1h1F1h1F1h1F1h1F1h1F1h1F1h1F1h1F1h1F1h1F1h1F + 1h1F1h1F1h1F1h1F1h1F1h1F1h1F1h1F1h1F1h1F1h1F1h1F1h1F1h1F1h1F1h1F1h1F1h1F1h1F1h1F + 1h1F1h1F1h1F1h1F1h1F1h1F1h1F1h1F1h1F1h1F1h1F1htD1SNK1+Dn+////////////////////2+J + 5hE81B1F1h1F1h1F1h1F1h1F1h1F1h1F1h1F1h1F1h1F1h1F1h1F1h1F1h1F1h1F1h1F1h1F1h1F1h1F + 1h1F1h1F1h1F1h1F1h5G1idN2ChP2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO1yhO1yhO2ChO2ChO2ChO + 2ChO2ChO2ChO2CNK10Fj3fj5/////////////////////1Z04SBH1ihO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2CZM + 1y1S2eLo+////////////////////3WP5xxF1ihO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO1yhO1yhO2ChO2ChO2ChO2ChO2ChO2ChO2CNK10Fj3fj5/////////////////////1Z0 + 4SBH1ihO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2CZM1y1S2eLo+////////////////////3WP5xxF1ihO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO1yhO1yhO2ChO2ChO2ChO2ChO2ChO2ChO2CNK + 10Fk3fr6/////////////////////1d14SBH1ihO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2CZM1y1S2eTp+/////// + /////////////3aP5xxF1ihO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO1yhO + 1yhO2ChO2ChO2ChO2ChO2ChO2ChO2CNK10Fj3fT2/vz9//z9//z9//z9//z9/1Z04SBH1ihO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2CZM1y1S2d/l+vz9//z9//z9//z9//z9/3SO5xxF1ihO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO1yhO1yhO2ChO2ChO2ChO2ChO2ChO2ChO2CdO2CxS2Uho3klq3klq + 3klq3klq3klq3i9U2SdN1yhO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ClP2ERm3Ulq3klq3klq3klq3klq3jRY + 2iZN1yhO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO1yhO1yhO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2CdO2CJJ1yJJ1yJJ1yJJ1yJJ1yJJ1ydN2ChP2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2CNK1yJJ1yJJ1yJJ1yJJ1yJJ1yZM1ylP2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO1yhO1yhO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO1yhO1yhO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO1yhO + 1yhO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO1yhO1yhO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO1yhO1yhO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO1yhO1yhO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2CdN2B9H1h9H1h9H1h9H1h9H1h9H1iZN + 1yhP2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2CBI1h9H1h9H1h9H1h9H1h9H1iVL1ylP2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO1yhO1yhO2ChO2ChO2ChO2ChO2ChO2ChO2CdN + 2C5U2Vx54l574l574l574l574l574jRY2iZN1yhO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ClP2Fd14V974l57 + 4l574l574l974jxf3CVM1yhO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO1yhO + 1yhO2ChO2ChO2ChO2ChO2ChO2ChO2CNK10Jk3f7+/////////////////////1h24SBH1ihO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2CZM1y1S2efs/P///////////////////3iQ5xxF1ihO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO1yhO1yhO2ChO2ChO2ChO2ChO2ChO2ChO2CNK10Fj3fj5//////// + /////////////1Z14SBH1ihO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2CZM1y1S2eLo+////////////////////3aP + 5xxF1ihO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO1yhO1yhO2ChO2ChO2ChO + 2ChO2ChO2ChO2CNK10Fj3fj5/////////////////////1Z04SBH1ihO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2CZM + 1y1S2eLo+////////////////////3WP5xxF1ihO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO1yhO1yhO2ChO2ChO2ChO2ChO2ChO2ChO2CNK10Fj3fj5/////////////////////1Z0 + 4SBH1ihO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2CZM1y1S2eLo+////////////////////3WP5xxF1ihO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO1yhO1yhO2ChO2ChO2ChO2ChO2ChO2ChO2CNK + 10Fj3fj5/////////////////////1Ny4BxE1SRL1yRL1yRL1yRL1yZN1yhO2ChO2ChO2ChO2ChO2ChO + 2ChO2CdN2CRL1yRL1yRL1yRL1yRL1yRL1yRL1yRL1yRL1yRL1yRL1yRL1yRL1yRL1yRL1yVL1yhO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2CVM1yRL1yRL1yRL1yRL1yRL1yRL1yRL1yRL1yRL1yRL1yRL1yRL1yRL + 1yRL1yRL1yZM1yhO2ChO2ChO2ChO2ChO2ChO2ChO2CdO2CRL1yRL1yRL1yRL1yJJ1ilP2OHn+/////// + /////////////3WP5xxF1ihO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO1yhO + 1yhO2ChO2ChO2ChO2ChO2ChO2ChO2CNK10Fj3fj5/////////////////////2J+4zBU2Tdb2zdb2zdb + 2zdb2y9U2SdO2ChO2ChO2ChO2ChO2ChO2CdO2C5T2Tdb2zdb2zdb2zdb2zdb2zdb2zdb2zdb2zdb2zdb + 2zdb2zdb2zdb2zdb2zdb2zZa2ypQ2ChO2ChO2ChO2ChO2ChO2ChO2ChO2DNY2jdb2zdb2zdb2zdb2zdb + 2zdb2zdb2zdb2zdb2zdb2zdb2zdb2zdb2zdb2zdb2zJW2idO2ChO2ChO2ChO2ChO2ChO2ChO2CtR2Ddb + 2zdb2zdb2zdb2zVZ2jxe3OTq+////////////////////3WP5xxF1ihO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO1yhO1yhO2ChO2ChO2ChO2ChO2ChO2ChO2CNK10Fj3fj5//////// + //////////////L0/e3x/e7x/e7x/e7x/e7x/YCX6BxF1ShO2ChO2ChO2ChO2ChO2B1G1nCJ5u7x/e7x + /e7x/e7x/e7x/e7x/e7x/e7x/e7x/e7x/e7x/e7x/e7x/e7x/e7x/eXq/D1g3CRL1yhO2ChO2ChO2ChO + 2ChO2CNK17vI9O7x/e7x/e7x/e7x/e7x/e7x/e7x/e7x/e7x/e7x/e7x/e7x/e7x/e7x/e7x/am58R5G + 1ihO2ChO2ChO2ChO2ChO2CJJ1kts3u7x/e7x/e7x/e7x/e7x/e7y/f7+/////////////////////3WP + 5xxF1ihO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO1yhO1yhO2ChO2ChO2ChO + 2ChO2ChO2ChO2CNK10Fj3fj5/////////////////////////////////////////////4mf6htE1ShO + 2ChO2ChO2ChO2ChO2BxF1niQ5/////////////////////////////////////////////////////// + //////r7/0Bi3CNK1yhO2ChO2ChO2ChO2ChO2CJJ18zV9/////////////////////////////////// + /////////////////////////7fF8x1F1ihO2ChO2ChO2ChO2ChO2CFI1k9v3/////////////////// + /////////////////////////////3WP5xxF1ihO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO1yhO1yhO2ChO2ChO2ChO2ChO2ChO2ChO2CNK10Fj3fj5//////////////////////// + /////////////////////4ie6htE1ShO2ChO2ChO2ChO2ChO2BxF1naP5/////////////////////// + //////////////////////////////////////b4/z9h3CNK1yhO2ChO2ChO2ChO2ChO2CJJ18nT9v// + /////////////////////////////////////////////////////////7XD8x1F1ihO2ChO2ChO2ChO + 2ChO2CFI1k5u3////////////////////////////////////////////////3WP5xxF1ihO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO1yhO1yhO2ChO2ChO2ChO2ChO2ChO2ChO2CNK + 10Fj3fj5/////////////////////////////////////////////4ie6htE1ShO2ChO2ChO2ChO2ChO + 2BxF1naP5/////////////////////////////////////////////////////////////b4/z9h3CNK + 1yhO2ChO2ChO2ChO2ChO2CJJ18nT9v////////////////////////////////////////////////// + /////////7XD8x1F1ihO2ChO2ChO2ChO2ChO2CFI1k5u3/////////////////////////////////// + /////////////3WP5xxF1ihO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO1yhO + 1yhO2ChO2ChO2ChO2ChO2ChO2ChO2CNK10Fj3fj5//////////////////////////////////////// + /////4ie6htE1ShO2ChO2ChO2ChO2ChO2BxF1neP5/////////////////////////////////////// + //////////////////////b4/z9h3CNK1yhO2ChO2ChO2ChO2ChO2CJJ18nT9v////////////////// + /////////////////////////////////////////7XD8x1F1ihO2ChO2ChO2ChO2ChO2CFI1k5v3/// + /////////////////////////////////////////////3aP5xxF1ihO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO1yhO1yhO2ChO2ChO2ChO2ChO2ChO2ChO2CNK10Jk3f////////// + /////////////////////////////////////4ug6xtE1ShO2ChO2ChO2ChO2ChO2BxF1nmR5/////// + //////////////////////////////////////////////////////3+/0Bi3CNK1yhO2ChO2ChO2ChO + 2ChO2CJJ187X9////////////////////////////////////////////////////////////7nH9B1F + 1ihO2ChO2ChO2ChO2ChO2CFI1lBw3////////////////////////////////////////////////3iR + 5xxF1ihO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO1yhO1yhO2ChO2ChO2ChO + 2ChO2ChO2ChO2CdN2C9U2WF942N/42N/42N/42N/42N/42N/42N/42N/42N/42N/42N/40Jk3SVM1yhO + 2ChO2ChO2ChO2ChO2CVM1z5g3GN/42N/42N/42N/42N/42N/42N/42N/42N/42N/42N/42N/42N/42N/ + 42N/42B94y5U2SdN2ChO2ChO2ChO2ChO2ChO2CdN2FRz4GN/42N/42N/42N/42N/42N/42N/42N/42N/ + 42N/42N/42N/42N/42N/42N/409u3yVM1yhO2ChO2ChO2ChO2ChO2CZN1zNX2mN/42N/42N/42N/42N/ + 42N/42N/42N/42N/42N/42N/42N/4z1g3CVM1yhO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO1yhO1yhO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2CdN2B9G1h5G1h5G1h5G1h5G1h5G1h5G + 1h5G1h5G1h5G1h5G1h5G1iRL1ylP2ChO2ChO2ChO2ChO2ChO2ClP2CVL1x5G1h5G1h5G1h5G1h5G1h5G + 1h5G1h5G1h5G1h5G1h5G1h5G1h5G1h5G1h5G1h9G1idN2ChO2ChO2ChO2ChO2ChO2ChO2ChP2CFI1h5G + 1h5G1h5G1h5G1h5G1h5G1h5G1h5G1h5G1h5G1h5G1h5G1h5G1h5G1h5G1iJJ1ylP2ChO2ChO2ChO2ChO + 2ChO2ChP2CZN2B5G1h5G1h5G1h5G1h5G1h5G1h5G1h5G1h5G1h5G1h5G1h5G1iVL1ylP2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO1yhO1yhO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO1yhO + 1yhO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO1yhO1yhO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO1yhO1yhO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO1yhO1yhO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO1yhO1yhO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO1yhO + 1yhO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO1yhO1yhO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO1yhO1yhO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO1yhO1yhO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO1yhO1yhO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO1yhO + 1yhO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO1yhO1yhO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO1yhO1yhO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO1yhO1yhO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO1yhO1yhO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO1yhO + 1yhO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO1yhO1yhO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO + 2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO2ChO1yhO1ihO1yhO1yhO1yhO + 1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO + 1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO + 1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO + 1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO + 1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO + 1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO1yhO + 1yhO1yhO1yhO1gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + 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 + AAAAAAAAAAAAAAAAAAAAAAAAKAAAAEAAAACAAAAAAQAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAChO + 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO + 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO + 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO + 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO + 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO + 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO + 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO + 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO + 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO + 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO + 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO + 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO + 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO + 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO + 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO + 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO + 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO + 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO + 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO + 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO + 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO + 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO + 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO + 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO + 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO + 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO + 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO + 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO + 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO + 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1rDH8sbX9sbX9sbX9sbX9sbX9sbX9sbX + 9sbX9sbX9sbX9sbX9sbX9sbX9sbX9sbX9sbX9sbX9sbX9sbX9sbX9sbX9sbX9sbX9sbX9sbX9sbX9sbX + 9sbX9sbX9sbX9sbX9sbX9sbX9sbX9sbX9sbX9sbX9sbX9sbX9sbX9sbX9rDH8ihO1ihO1ihO1ihO1ihO + 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1uPs+/////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////+Ps+yhO + 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO + 1uPs+/////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////+Ps+yhO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO + 1ihO1ihO1ihO1ihO1uPs+/////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////+Ps+yhO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO + 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1uPs+/////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////+Ps+yhO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO + 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1uPs+////////////+rv+ldy1Vdy1Vdy + 1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy + 1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1erv+v///////////+Ps+yhO1ihO1ihO1ihO1ihO + 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1uPs+/////////// + /+rv+ldy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy + 1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1erv+v///////////+Ps+yhO + 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO + 1uPs+////////////+rv+ldy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy + 1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1erv+v// + /////////+Ps+yhO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO + 1ihO1ihO1ihO1ihO1uPs+////////////+rv+ldy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy + 1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy + 1Vdy1Vdy1erv+v///////////+Ps+yhO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO + 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1uPs+////////////+rv+ldy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy + 1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy + 1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1erv+v///////////+Ps+yhO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO + 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1uPs+////////////+rv+ldy1Vdy1Vdy + 1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy + 1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1erv+v///////////+Ps+yhO1ihO1ihO1ihO1ihO + 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1uPs+/////////// + /+rv+ldy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy + 1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1erv+v///////////+Ps+yhO + 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO + 1uPs+////////////+rv+ldy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy + 1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1erv+v// + /////////+Ps+yhO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO + 1ihO1ihO1ihO1ihO1uPs+////////////+rv+ldy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy + 1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy + 1Vdy1Vdy1erv+v///////////+Ps+yhO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1uPs+/////////////// + /////////1Z+4ShO1ihO1ihO1uPs+////////////////////////////7PE7Vdy1Vdy1Vdy1bPE7f// + //////////////////////////X3/Vdy1Vdy1Vdy1XSO3P///////////////////////+rv+ldy1Vdy + 1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1erv+v///////////+Ps+yhO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1uPs + +////////////////////////1Z+4ShO1ihO1ihO1uPs+////////////////////////////7PE7Vdy + 1Vdy1Vdy1bPE7f////////////////////////////X3/Vdy1Vdy1Vdy1XSO3P////////////////// + /////+rv+ldy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1erv+v///////////+Ps+yhO1ihO1ihO1ihO1ihO + 1ihO1ihO1ihO1uPs+////////////////////////1Z+4ShO1ihO1ihO1uPs+/////////////////// + /////////7PE7Vdy1Vdy1Vdy1bPE7f////////////////////////////X3/Vdy1Vdy1Vdy1XSO3P// + /////////////////////+rv+ldy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1erv+v///////////+Ps+yhO + 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1uPs+////////////////////////1Z+4ShO1ihO1ihO1uPs+/// + /////////////////////////7PE7Vdy1Vdy1Vdy1bPE7f////////////////////////////X3/Vdy + 1Vdy1Vdy1XSO3P///////////////////////+rv+ldy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1erv+v// + /////////+Ps+yhO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1uPs+/////////////n7/sbX9sbX9kpy3ihO + 1ihO1ihO1rDH8sbX9vj6/v////////////r7/tPe9Zqw51dy1Vdy1Vdy1Zqw59Pe9dPe9dPe9dPe9dPe + 9dPe9dPe9cvX81dy1Vdy1Vdy1WyH29Pe9dPe9fv8/v///////////+rv+ldy1Vdy1Vdy1Vdy1Vdy1Vdy + 1Vdy1Vdy1erv+v///////////+Ps+yhO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1uPs+////////////+Ps + +yhO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1uPs+////////////+rv+ldy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy + 1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1erv+v///////////+rv+ldy1Vdy + 1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1erv+v///////////+Ps+yhO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1uPs + +////////////+Ps+yhO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1uPs+////////////+rv+ldy1Vdy1Vdy + 1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1erv+v////// + /////+rv+ldy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1erv+v///////////+Ps+yhO1ihO1ihO1ihO1ihO + 1ihO1ihO1ihO1jtj2j5m3D5m3D5m3Dtj2ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1uPs+/////////// + /+rv+ldy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy + 1Vdy1WeC2mqE2mqE2mqE2meC2ldy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1erv+v///////////+Ps+yhO + 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO + 1uPs+////////////+rv+ldy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy + 1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1erv+v// + /////////+Ps+yhO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO + 1ihO1ihO1ihO1ihO1uPs+////////////+rv+ldy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy + 1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy + 1Vdy1Vdy1erv+v///////////+Ps+yhO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO + 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1uPs+////////////+rv+ldy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy + 1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy + 1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1erv+v///////////+Ps+yhO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1rDH + 8sbX9sbX9sbX9rDH8ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1uPs+////////////+rv+ldy1Vdy1Vdy + 1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1cPR8dPe9dPe + 9dPe9cPR8Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1erv+v///////////+Ps+yhO1ihO1ihO1ihO1ihO + 1ihO1ihO1ihO1uPs+////////////+Ps+yhO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1uPs+/////////// + /+rv+ldy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy + 1Vdy1erv+v///////////+rv+ldy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1erv+v///////////+Ps+yhO + 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1uPs+////////////+Ps+yhO1ihO1ihO1ihO1ihO1ihO1ihO1ihO + 1uPs+/////////////X3/ai766i766i766i766i766i766i766i766i766i766i766i766i766i766i7 + 66i766i766i766i766i76/X3/f////////////X3/ai766i766i766i766i766i766i766i76/X3/f// + /////////+Ps+yhO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1uPs+////////////+Ps+yhO1ihO1ihO1ihO + 1ihO1ihO1ihO1ihO1uPs+/////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////+Ps+yhO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1uPs+////////////+Ps + +yhO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1uPs+/////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////+Ps+yhO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1uPs + +////////////+Ps+yhO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1uPs+/////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////+Ps+yhO1ihO1ihO1ihO1ihO + 1ihO1ihO1ihO1uPs+////////////+Ps+yhO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1uPs+/////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////+Ps+yhO + 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1uPs+////////////+Ps+yhO1ihO1ihO1ihO1ihO1ihO1ihO1ihO + 1lB44FZ+4VZ+4VZ+4VZ+4VZ+4VZ+4VZ+4VZ+4VZ+4VZ+4VZ+4VZ+4VZ+4VZ+4VZ+4VZ+4VZ+4VZ+4VZ+ + 4VZ+4VZ+4VZ+4VZ+4VZ+4erx/P///////////+rx/FZ+4VZ+4VZ+4VZ+4VZ+4VZ+4VZ+4VZ+4VZ+4VZ+ + 4VZ+4VZ+4VB44ChO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1uPs+////////////+Ps+yhO1ihO1ihO1ihO + 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO + 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1uPs+////////////+Ps+yhO1ihO1ihO1ihO1ihO1ihO + 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1lB44FZ+4VZ+4VZ+4VB4 + 4ChO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO + 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1lB44FZ+4VZ+4VZ+4VB44ChO1ihO + 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO + 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO + 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO + 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO + 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO + 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO + 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO + 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO + 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO + 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO + 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1pez7anC8qnC8qnC8pez7ShO1ihO1ihO1ihO + 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO + 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1pez7anC8qnC8qnC8pez7ShO1ihO1ihO1ihO1ihO1ihO + 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1uPs+////////////+Ps + +yhO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO + 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1uPs+////////////+Ps+yhO1ihO + 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1uPs + +////////////+zy/WOJ5GOJ5DVe2ShO1ihO1ihO1luC4mOJ5GOJ5GOJ5GOJ5GOJ5GOJ5GOJ5Edw3ihO + 1ihO1ihO1kdw3mOJ5GOJ5GOJ5GOJ5GOJ5GOJ5GOJ5F+G4yhO1ihO1ihO1jJa2GOJ5GOJ5Ozy/f////// + /////+Ps+yhO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO + 1ihO1ihO1ihO1uPs+////////////////////////1Z+4ShO1ihO1ihO1uPs+/////////////////// + /////////5u37ihO1ihO1ihO1pu37v////////////////////////////L2/ShO1ihO1ihO1kpy3v// + /////////////////////+Ps+yhO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO + 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1uPs+////////////////////////1Z+4ShO1ihO1ihO1uPs+/// + /////////////////////////5u37ihO1ihO1ihO1pu37v////////////////////////////L2/ShO + 1ihO1ihO1kpy3v///////////////////////+Ps+yhO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO + 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1uPs+////////////////////////1Z+4ShO + 1ihO1ihO1uPs+////////////////////////////5u37ihO1ihO1ihO1pu37v////////////////// + //////////L2/ShO1ihO1ihO1kpy3v///////////////////////+Ps+yhO1ihO1ihO1ihO1ihO1ihO + 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1uPs+/////////////// + /////////1Z+4ShO1ihO1ihO1uPs+////////////////////////////5u37ihO1ihO1ihO1pu37v// + //////////////////////////L2/ShO1ihO1ihO1kpy3v///////////////////////+Ps+yhO1ihO + 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1nOX + 536g6X6g6X6g6X6g6X6g6X6g6Ttj2ihO1ihO1ihO1nOX536g6X6g6X6g6X6g6X6g6X6g6X6g6VV94ShO + 1ihO1ihO1lV94X6g6X6g6X6g6X6g6X6g6X6g6X6g6Xmc6ChO1ihO1ihO1jZe2X6g6X6g6X6g6X6g6X6g + 6X6g6XOX5yhO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO + 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO + 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO + 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO + 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO + 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO + 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO + 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO + 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO + 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO + 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO + 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO + 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO + 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO + 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO + 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO + 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO + 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO + 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO + 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO + 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO + 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO + 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO + 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO + 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO + 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO + 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO + 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO + 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO + 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1gAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAKAAAADAAAABgAAAAAQAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAChO + 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO + 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO + 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO + 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO + 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO + 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO + 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO + 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO + 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO + 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO + 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO + 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO + 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO + 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO + 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ipQ + 1jJb2TJb2TJb2TJb2TJb2TJb2TJb2TJb2TJb2TJb2TJb2TJb2TJb2TJb2TJb2TJb2TJb2TJb2TJb2TJb + 2TJb2TJb2TJb2TJb2TJb2TJb2TJb2TJb2TJb2TJb2TJb2TFZ2ChO1ihO1ihO1ihO1ihO1ihO1ihO1ihO + 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1kpy3v////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////////+Ps + +yhO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1kpy3v////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////+Ps+yhO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO + 1ihO1ihO1ihO1kpy3v////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////+Ps+yhO1ihO1ihO1ihO + 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1kpy3v///////////8nW8qi766i766i766i7 + 66i766i766i766i766i766i766i766i766i766i766i766i766i766i766i766i766i766i766i766i7 + 6+Tr+f///////+Ps+yhO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1kpy + 3v///////////5Kp5Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy + 1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1cnW8v///////+Ps+yhO1ihO1ihO1ihO1ihO1ihO1ihO1ihO + 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1kpy3v///////////5Kp5Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy + 1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1cnW8v///////+Ps + +yhO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1kpy3v///////////5Kp + 5Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy + 1Vdy1Vdy1Vdy1Vdy1cnW8v///////+Ps+yhO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO + 1ihO1ihO1ihO1kpy3v///////////5Kp5Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy + 1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1cnW8v///////+Ps+yhO1ihO1ihO1ihO + 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1kpy3v///////////5Kp5Vdy1Vdy1Vdy1Vdy + 1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy + 1cnW8v///////+Ps+yhO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1kpy + 3v///////////5Kp5Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy + 1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1cnW8v///////+Ps+yhO1ihO1ihO1ihO1ihO1ihO1rDH8sbX + 9sbX9sbX9sbX9maM5ChO1ihO1pCu7NDe+P///////////+Tr+aq97Fdy1Vdy1Yqi4tPe9dPe9dPe9dPe + 9dPe9cvX81dy1Vdy1WWA2dPe9dPe9dPe9dPe9dPe9WyH21dy1Vdy1Vdy1Vdy1Vdy1cnW8v///////+Ps + +yhO1ihO1ihO1ihO1ihO1ihO1uPs+////////////////36g6ShO1ihO1rfM9P////////////////// + /8nW8ldy1Vdy1Z2y6P////////////////////X3/Vdy1Vdy1WqE2v///////////////////3SO3Fdy + 1Vdy1Vdy1Vdy1Vdy1cnW8v///////+Ps+yhO1ihO1ihO1ihO1ihO1ihO1uPs+////////////////36g + 6ShO1ihO1rfM9P///////////////////8nW8ldy1Vdy1Z2y6P////////////////////X3/Vdy1Vdy + 1WqE2v///////////////////3SO3Fdy1Vdy1Vdy1Vdy1Vdy1cnW8v///////+Ps+yhO1ihO1ihO1ihO + 1ihO1ihO1uPs+/////////P2/dXh+WyR5ShO1ihO1pq27tzn+v///////////+vv+rLD7Vdy1Vdy1Y+m + 5N/n+N/n+N/n+N/n+N/n+NXf9Vdy1Vdy1WaB2d/n+Ovv+v///////////3SO3Fdy1Vdy1Vdy1Vdy1Vdy + 1cnW8v///////+Ps+yhO1ihO1ihO1ihO1ihO1ihO1uPs+////////7fM9ChO1ihO1ihO1ihO1ihO1kpy + 3v///////////5Kp5Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1ZKp5f// + /////////3SO3Fdy1Vdy1Vdy1Vdy1Vdy1cnW8v///////+Ps+yhO1ihO1ihO1ihO1ihO1ihO1pez7anC + 8qnC8n2f6ShO1ihO1ihO1ihO1ihO1kpy3v///////////5Kp5Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy + 1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1XuV377M777M777M72iD2ldy1Vdy1Vdy1Vdy1Vdy1cnW8v///////+Ps + +yhO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1kpy3v///////////5Kp + 5Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy + 1Vdy1Vdy1Vdy1Vdy1cnW8v///////+Ps+yhO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO + 1ihO1ihO1ihO1kpy3v///////////5Kp5Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy + 1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1cnW8v///////+Ps+yhO1ihO1ihO1ihO + 1ihO1ihO1luC4mOJ5GOJ5E943yhO1ihO1ihO1ihO1ihO1kpy3v///////////5Kp5Vdy1Vdy1Vdy1Vdy + 1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1WiD2oig4oig4oig4mB711dy1Vdy1Vdy1Vdy1Vdy + 1cnW8v///////+Ps+yhO1ihO1ihO1ihO1ihO1ihO1uPs+////////7fM9ChO1ihO1ihO1ihO1ihO1kpy + 3v///////////5Kp5Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1Vdy1ZKp5f// + /////////3SO3Fdy1Vdy1Vdy1Vdy1Vdy1cnW8v///////+Ps+yhO1ihO1ihO1ihO1ihO1ihO1uPs+/// + /////7fM9ChO1ihO1ihO1ihO1ihO1kpy3v///////////9bg9b7M777M777M777M777M777M777M777M + 777M777M777M777M777M777M79bg9f///////////8rW8r7M777M777M777M777M7+vv+v///////+Ps + +yhO1ihO1ihO1ihO1ihO1ihO1uPs+////////7fM9ChO1ihO1ihO1ihO1ihO1kpy3v////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////+Ps+yhO1ihO1ihO1ihO1ihO1ihO1uPs+////////7fM9ChO1ihO + 1ihO1ihO1ihO1kpy3v////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////+Ps+yhO1ihO1ihO1ihO + 1ihO1ihO1uPs+////////7fM9ChO1ihO1ihO1ihO1ihO1kdw3vL2/fL2/fL2/fL2/fL2/fL2/fL2/fL2 + /fL2/fL2/fL2/fL2/fL2/fL2/fL2/fL2/fL2/fL2/ff6/v////////////T3/fL2/fL2/fL2/fL2/fL2 + /fL2/fL2/fL2/dbi+ShO1ihO1ihO1ihO1ihO1ihO1uPs+////////7fM9ChO1ihO1ihO1ihO1ihO1ihO + 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1nGV5/// + /////////0py3ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1nOX536g + 6X6g6WGH4yhO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO + 1ihO1ihO1ihO1ihO1ihO1ihO1kVu3n6g6X6g6X6g6TZe2ShO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO + 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO + 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO + 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO + 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO + 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO + 1ihO1ihO1n6g6Yys7Iys7GqP5ShO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO + 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1kpy3oys7Iys7Iys7Dhg2ihO1ihO1ihO1ihO1ihO + 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1uPs+////////7fM9ChO1ihO1ihO1ihO1ihO1ihO + 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1nGV5/// + /////////0py3ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1uPs+/// + /////+7z/cbX9maM5ChO1ihO1pCu7MbX9sbX9sbX9sbX9sbX9pCu7ChO1ihO1maM5MbX9sbX9sbX9sbX + 9sbX9rvP9ShO1ihO1jhg2sbX9tvm+v///////////0py3ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO + 1ihO1ihO1ihO1ihO1ihO1ihO1uPs+////////////////36g6ShO1ihO1rfM9P////////////////// + /7fM9ChO1ihO1n6g6f////////////////////L2/ShO1ihO1j5m3P///////////////////0py3ihO + 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1uPs+////////////////36g + 6ShO1ihO1rfM9P///////////////////7fM9ChO1ihO1n6g6f////////////////////L2/ShO1ihO + 1j5m3P///////////////////0py3ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO + 1ihO1ihO1sra9+Ps++Ps++Ps++Ps+3OX5yhO1ihO1qS+8OPs++Ps++Ps++Ps++Ps+6S+8ChO1ihO1nOX + 5+Ps++Ps++Ps++Ps++Ps+9bi+ShO1ihO1jtj2uPs++Ps++Ps++Ps++Ps+0Vu3ihO1ihO1ihO1ihO1ihO + 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO + 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO + 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO + 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO + 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO + 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO + 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO + 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO + 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO + 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO + 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO + 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO + 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO + 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO + 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO + 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO + 1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO1ihO + 1ihO1ihO1ihO1gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgAAAAgAAAAQAAAAAEAGAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYo + TtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYo + TtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYo + TtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYo + TtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYo + TtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYo + TtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYo + TtZFbt5xledxledxledxledxledxledxledxledxledxledxledxledxledxledxledxledxledxledx + ledxledrkeUoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtZ+oOn///////////////////////// + ///////////////////////////////////////////////////////y9v0oTtYoTtYoTtYoTtYoTtYo + TtYoTtYoTtYoTtYoTtZ+oOn///////////////////////////////////////////////////////// + ///////////////////////y9v0oTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtZ+oOn////19/1X + ctVXctVXctVXctVXctVXctVXctVXctVXctVXctVXctVXctVXctVXctVXctVXctWdsuj////y9v0oTtYo + TtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtZ+oOn////19/1XctVXctVXctVXctVXctVXctVXctVXctVX + ctVXctVXctVXctVXctVXctVXctVXctWdsuj////y9v0oTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYo + TtZ+oOn////19/1XctVXctVXctVXctVXctVXctVXctVXctVXctVXctVXctVXctVXctVXctVXctVXctWd + suj////y9v0oTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtZ+oOn////19/1XctVXctVXctVXctVX + ctVXctVXctVXctVXctVXctVXctVXctVXctVXctVXctVXctWdsuj////y9v0oTtYoTtYoTtYoTtaFpuqM + rOyMrOxjieQoTtZQeOC+0fX////6+/6XreZXctVviduou+uou+uou+uou+tXctVge9eou+uou+uou+t5 + k95XctVXctVXctWdsuj////y9v0oTtYoTtYoTtYoTtby9v3///////+pwvIoTtZ+oOn////////////f + 5/hXctWIoOL///////////////9XctVqhNr///////////+dsuhXctVXctVXctWdsuj////y9v0oTtYo + TtYoTtYoTtby9v3////w9P2Xs+0oTtZzl+fv9P3////+/v/N2PNXctWBm+Dq7/rq7/rq7/rq7/pXctVn + gtrq7/r+/v////+dsuhXctVXctVXctWdsuj////y9v0oTtYoTtYoTtYoTtby9v3///9+oOkoTtYoTtYo + TtZ+oOn////19/1XctVXctVXctVXctVXctVXctVXctVXctVXctVXctX19/3///+dsuhXctVXctVXctWd + suj////y9v0oTtYoTtYoTtYoTtYyWtgyW9ktVNcoTtYoTtYoTtZ+oOn////19/1XctVXctVXctVXctVX + ctVXctVXctVXctVXctVXctVge9dge9dbdtZXctVXctVXctWdsuj////y9v0oTtYoTtYoTtYoTtYoTtYo + TtYoTtYoTtYoTtYoTtZ+oOn////19/1XctVXctVXctVXctVXctVXctVXctVXctVXctVXctVXctVXctVX + ctVXctVXctVXctWdsuj////y9v0oTtYoTtYoTtYoTtbW4vnj7Ptzl+coTtYoTtYoTtZ+oOn////19/1X + ctVXctVXctVXctVXctVXctVXctVXctVXctVXctXg5/jq7/qUq+ZXctVXctVXctWdsuj////y9v0oTtYo + TtYoTtYoTtby9v3///9+oOkoTtYoTtYoTtZ+oOn////9/v/T3vXT3vXT3vXT3vXT3vXT3vXT3vXT3vXT + 3vXT3vX9/v/////n7frT3vXT3vXT3vXn7fn////y9v0oTtYoTtYoTtYoTtby9v3///9+oOkoTtYoTtYo + TtZ+oOn///////////////////////////////////////////////////////////////////////// + ///////y9v0oTtYoTtYoTtYoTtby9v3///9+oOkoTtYoTtYoTtZbguKpwvKpwvKpwvKpwvKpwvKpwvKp + wvKpwvKpwvKpwvKpwvKpwvL7/P7////O3fepwvKpwvKpwvKpwvKpwvKguu8oTtYoTtYoTtYoTtaguu+p + wvJbguIoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtaguu+pwvJb + guIoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYo + TtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYo + TtYoTtYoTtZfhuNjieRAadwoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYo + TtYoTtZfhuNjieRAadwoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtby9v3///+Ws+08ZdsoTtY2 + XtlKct5Kct5Kct5DbN0oTtYyWthKct5Kct5Kct5Kct4oTtYsU9dKct70+P7///9+oOkoTtYoTtYoTtYo + TtYoTtYoTtYoTtYoTtYoTtYoTtby9v3///////+pwvIoTtZ+oOn////////////V4fkoTtZjieT///// + //////////8oTtY+Ztz///////////9+oOkoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtby9v3/ + //////+pwvIoTtZ+oOn////////////V4fkoTtZjieT///////////////8oTtY+Ztz///////////9+ + oOkoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtZTe+FWfuFWfuFEbN0oTtY7Y9pWfuFWfuFWfuFM + dd8oTtY1XtlWfuFWfuFWfuFWfuEoTtYtVNdWfuFWfuFWfuE7Y9ooTtYoTtYoTtYoTtYoTtYoTtYoTtYo + TtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYo + TtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYo + TtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYo + TtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYo + TtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYo + TtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYo + TtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgAAAAQAAAAIAAAAAEAGAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYo + TtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYo + TtaRr+y6zvS6zvS6zvS6zvS6zvS6zvS6zvS6zvS6zvS4zfQoTtYoTtYoTtYoTtYoTtbJ2fbT3vWou+uo + u+uou+uou+uou+uou+uou+u+zO////8oTtYoTtYoTtYoTtYoTtbJ2faou+tXctVXctVXctVXctVXctVX + ctVXctV+l+D///8oTtYoTtZWfuFMdd8yW9nW4vm8zPBeedd+l+B+l+BZddZ+l+B0jtxXctV+l+D///8o + TtYoTtb////M2/dTe+H8/f/19/1yjNz19/319/1ge9f7/P7T3vVXctV+l+D///8oTtYoTtabt+5Bat0o + TtbJ2faou+tXctVXctVXctVXctWDnOGasOdXctV+l+D///8oTtYoTtZ+oOk7Y9ooTtbJ2faou+tXctVX + ctVXctVXctV5k96KouJXctV+l+D///8oTtYoTtb///9WfuEoTtbI2Pb09/3o7vro7vro7vro7vr09/36 + +/7o7vru8vv///8oTtYoTtbV4flMdd8oTtZTe+FjieRjieRjieRjieRjieSivPDB1PZjieRjieRjieQo + TtYoTtZKct4wWNgoTtYoTtYoTtYoTtYoTtYoTtYoTtY4YNpBat0oTtYoTtYoTtYoTtYoTtb///+kvvBE + bN2pwvKguu88ZdupwvKpwvIvVtfV4fnG1/YoTtYoTtYoTtYoTtYoTtapwvKOrexEbN2pwvKguu88Zdup + wvKpwvIvVtepwvKFpuooTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYo + TtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYoTtYo + TtYAAKxBAACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQAA + rEEAAKxB + + \ No newline at end of file diff --git a/OnTopReplica/MainForm_ChildForms.cs b/src/OnTopReplica/MainForm_ChildForms.cs similarity index 96% rename from OnTopReplica/MainForm_ChildForms.cs rename to src/OnTopReplica/MainForm_ChildForms.cs index b9cdbac..79ee047 100644 --- a/OnTopReplica/MainForm_ChildForms.cs +++ b/src/OnTopReplica/MainForm_ChildForms.cs @@ -1,93 +1,93 @@ -using System; -using System.Collections.Generic; -using System.Text; -using System.Windows.Forms; -using System.Drawing; - -namespace OnTopReplica { - - partial class MainForm { - - //SidePanel _currentSidePanel = null; - SidePanelContainer _sidePanelContainer = null; - - /// - /// Opens a new side panel. - /// - /// The side panel to embed. - public void SetSidePanel(SidePanel panel) { - if (IsSidePanelOpen) { - CloseSidePanel(); - } - - _sidePanelContainer = new SidePanelContainer(this); - _sidePanelContainer.SetSidePanel(panel); - _sidePanelContainer.Location = ComputeSidePanelLocation(_sidePanelContainer); - _sidePanelContainer.Show(this); - } - - /// - /// Closes the current side panel. - /// - public void CloseSidePanel() { - if (_sidePanelContainer == null || _sidePanelContainer.IsDisposed) { - _sidePanelContainer = null; - return; - } - - _sidePanelContainer.Hide(); - _sidePanelContainer.FreeSidePanel(); - } - - /// - /// Gets whether a side panel is currently shown. - /// - public bool IsSidePanelOpen { - get { - if (_sidePanelContainer == null) - return false; - if (_sidePanelContainer.IsDisposed) { - _sidePanelContainer = null; - return false; - } - - return _sidePanelContainer.Visible; - } - } - - /// - /// Moves the side panel based on the main form's current location. - /// - protected void AdjustSidePanelLocation() { - if (!IsSidePanelOpen) - return; - - _sidePanelContainer.Location = ComputeSidePanelLocation(_sidePanelContainer); - } - - /// - /// Computes the target location of a side panel form that ensures it is visible on the current - /// screen that contains the main form. - /// - private Point ComputeSidePanelLocation(Form sidePanel) { - //Check if moving the panel on the form's right would put it off-screen - var screen = Screen.FromControl(this); - if (Location.X + Width + sidePanel.Width > screen.WorkingArea.Right) { - return new Point(Location.X - sidePanel.Width, Location.Y); - } - else { - return new Point(Location.X + Width, Location.Y); - } - } - - void SidePanel_RequestClosing(object sender, EventArgs e) { - CloseSidePanel(); - } - - void Thumbnail_CloneClick(object sender, CloneClickEventArgs e) { - Win32Helper.InjectFakeMouseClick(CurrentThumbnailWindowHandle.Handle, e); - } - - } - -} +using System; +using System.Collections.Generic; +using System.Text; +using System.Windows.Forms; +using System.Drawing; + +namespace OnTopReplica { + + partial class MainForm { + + //SidePanel _currentSidePanel = null; + SidePanelContainer _sidePanelContainer = null; + + /// + /// Opens a new side panel. + /// + /// The side panel to embed. + public void SetSidePanel(SidePanel panel) { + if (IsSidePanelOpen) { + CloseSidePanel(); + } + + _sidePanelContainer = new SidePanelContainer(this); + _sidePanelContainer.SetSidePanel(panel); + _sidePanelContainer.Location = ComputeSidePanelLocation(_sidePanelContainer); + _sidePanelContainer.Show(this); + } + + /// + /// Closes the current side panel. + /// + public void CloseSidePanel() { + if (_sidePanelContainer == null || _sidePanelContainer.IsDisposed) { + _sidePanelContainer = null; + return; + } + + _sidePanelContainer.Hide(); + _sidePanelContainer.FreeSidePanel(); + } + + /// + /// Gets whether a side panel is currently shown. + /// + public bool IsSidePanelOpen { + get { + if (_sidePanelContainer == null) + return false; + if (_sidePanelContainer.IsDisposed) { + _sidePanelContainer = null; + return false; + } + + return _sidePanelContainer.Visible; + } + } + + /// + /// Moves the side panel based on the main form's current location. + /// + protected void AdjustSidePanelLocation() { + if (!IsSidePanelOpen) + return; + + _sidePanelContainer.Location = ComputeSidePanelLocation(_sidePanelContainer); + } + + /// + /// Computes the target location of a side panel form that ensures it is visible on the current + /// screen that contains the main form. + /// + private Point ComputeSidePanelLocation(Form sidePanel) { + //Check if moving the panel on the form's right would put it off-screen + var screen = Screen.FromControl(this); + if (Location.X + Width + sidePanel.Width > screen.WorkingArea.Right) { + return new Point(Location.X - sidePanel.Width, Location.Y); + } + else { + return new Point(Location.X + Width, Location.Y); + } + } + + void SidePanel_RequestClosing(object sender, EventArgs e) { + CloseSidePanel(); + } + + void Thumbnail_CloneClick(object sender, CloneClickEventArgs e) { + Win32Helper.InjectFakeMouseClick(CurrentThumbnailWindowHandle.Handle, e); + } + + } + +} diff --git a/OnTopReplica/MainForm_Features.cs b/src/OnTopReplica/MainForm_Features.cs similarity index 97% rename from OnTopReplica/MainForm_Features.cs rename to src/OnTopReplica/MainForm_Features.cs index d39bac9..eb45b94 100644 --- a/OnTopReplica/MainForm_Features.cs +++ b/src/OnTopReplica/MainForm_Features.cs @@ -1,167 +1,167 @@ -using OnTopReplica.Native; -using OnTopReplica.Properties; -using System; -using System.Drawing; -using System.Windows.Forms; -using WindowsFormsAero.TaskDialog; - -namespace OnTopReplica { - //Contains some feature implementations of MainForm - partial class MainForm { - - #region Click forwarding - - public bool ClickForwardingEnabled { - get { - return _thumbnailPanel.ReportThumbnailClicks; - } - set { - if (value && Settings.Default.FirstTimeClickForwarding) { - TaskDialog dlg = new TaskDialog(Strings.InfoClickForwarding, Strings.InfoClickForwardingTitle, Strings.InfoClickForwardingContent) { - CommonButtons = CommonButton.Yes | CommonButton.No - }; - if (dlg.Show(this).CommonButton == CommonButtonResult.No) - return; - - Settings.Default.FirstTimeClickForwarding = false; - } - - _thumbnailPanel.ReportThumbnailClicks = value; - } - } - - #endregion - - #region Click-through - - bool _clickThrough = false; - - readonly Color DefaultNonClickTransparencyKey; - - public bool ClickThroughEnabled { - get { - return _clickThrough; - } - set { - TransparencyKey = (value) ? Color.Black : DefaultNonClickTransparencyKey; - if (value) { - //Re-force as top most (always helps in some cases) - TopMost = false; - this.Activate(); - TopMost = true; - } - - _clickThrough = value; - } - } - - //Must NOT be equal to any other valid opacity value - const double ClickThroughHoverOpacity = 0.6; - - Timer _clickThroughComeBackTimer = null; - long _clickThroughComeBackTicks; - const int ClickThroughComeBackTimerInterval = 1000; - - /// - /// When the mouse hovers over a fully opaque click-through form, - /// this fades the form to semi-transparency - /// and starts a timeout to get back to full opacity. - /// - private void RefreshClickThroughComeBack() { - if (this.Opacity == 1.0) { - this.Opacity = ClickThroughHoverOpacity; - } - - if (_clickThroughComeBackTimer == null) { - _clickThroughComeBackTimer = new Timer(); - _clickThroughComeBackTimer.Tick += _clickThroughComeBackTimer_Tick; - _clickThroughComeBackTimer.Interval = ClickThroughComeBackTimerInterval; - } - _clickThroughComeBackTicks = DateTime.UtcNow.Ticks; - _clickThroughComeBackTimer.Start(); - } - - void _clickThroughComeBackTimer_Tick(object sender, EventArgs e) { - var diff = DateTime.UtcNow.Subtract(new DateTime(_clickThroughComeBackTicks)); - if (diff.TotalSeconds > 2) { - var mousePointer = WindowMethods.GetCursorPos(); - - if (!this.ContainsMousePointer(mousePointer)) { - if (this.Opacity == ClickThroughHoverOpacity) { - this.Opacity = 1.0; - } - _clickThroughComeBackTimer.Stop(); - } - } - } - - #endregion - - #region Chrome - - readonly FormBorderStyle DefaultBorderStyle; // = FormBorderStyle.Sizable; // FormBorderStyle.SizableToolWindow; - - public bool IsChromeVisible { - get { - return (FormBorderStyle == DefaultBorderStyle); - } - set { - //Cancel hiding chrome if no thumbnail is shown - if (!value && !_thumbnailPanel.IsShowingThumbnail) - return; - - if (!value) { - Location = new Point { - X = Location.X + SystemInformation.FrameBorderSize.Width, - Y = Location.Y + SystemInformation.FrameBorderSize.Height - }; - FormBorderStyle = FormBorderStyle.None; - } - else if(value) { - Location = new Point { - X = Location.X - SystemInformation.FrameBorderSize.Width, - Y = Location.Y - SystemInformation.FrameBorderSize.Height - }; - FormBorderStyle = DefaultBorderStyle; - } - - Program.Platform.OnFormStateChange(this); - Invalidate(); - } - } - - #endregion - - #region Position lock - - ScreenPosition? _positionLock = null; - - /// - /// Gets or sets the screen position where the window is currently locked in. - /// - public ScreenPosition? PositionLock { - get { - return _positionLock; - } - set { - if (value != null) - this.SetScreenPosition(value.Value); - - _positionLock = value; - } - } - - /// - /// Refreshes window position if in lock mode. - /// - private void RefreshScreenLock() { - //If locked in position, move accordingly - if (PositionLock.HasValue) { - this.SetScreenPosition(PositionLock.Value); - } - } - - #endregion - - } -} +using OnTopReplica.Native; +using OnTopReplica.Properties; +using System; +using System.Drawing; +using System.Windows.Forms; +using WindowsFormsAero.TaskDialog; + +namespace OnTopReplica { + //Contains some feature implementations of MainForm + partial class MainForm { + + #region Click forwarding + + public bool ClickForwardingEnabled { + get { + return _thumbnailPanel.ReportThumbnailClicks; + } + set { + if (value && Settings.Default.FirstTimeClickForwarding) { + TaskDialog dlg = new TaskDialog(Strings.InfoClickForwarding, Strings.InfoClickForwardingTitle, Strings.InfoClickForwardingContent) { + CommonButtons = CommonButton.Yes | CommonButton.No + }; + if (dlg.Show(this).CommonButton == CommonButtonResult.No) + return; + + Settings.Default.FirstTimeClickForwarding = false; + } + + _thumbnailPanel.ReportThumbnailClicks = value; + } + } + + #endregion + + #region Click-through + + bool _clickThrough = false; + + readonly Color DefaultNonClickTransparencyKey; + + public bool ClickThroughEnabled { + get { + return _clickThrough; + } + set { + TransparencyKey = (value) ? Color.Black : DefaultNonClickTransparencyKey; + if (value) { + //Re-force as top most (always helps in some cases) + TopMost = false; + this.Activate(); + TopMost = true; + } + + _clickThrough = value; + } + } + + //Must NOT be equal to any other valid opacity value + const double ClickThroughHoverOpacity = 0.6; + + Timer _clickThroughComeBackTimer = null; + long _clickThroughComeBackTicks; + const int ClickThroughComeBackTimerInterval = 1000; + + /// + /// When the mouse hovers over a fully opaque click-through form, + /// this fades the form to semi-transparency + /// and starts a timeout to get back to full opacity. + /// + private void RefreshClickThroughComeBack() { + if (this.Opacity == 1.0) { + this.Opacity = ClickThroughHoverOpacity; + } + + if (_clickThroughComeBackTimer == null) { + _clickThroughComeBackTimer = new Timer(); + _clickThroughComeBackTimer.Tick += _clickThroughComeBackTimer_Tick; + _clickThroughComeBackTimer.Interval = ClickThroughComeBackTimerInterval; + } + _clickThroughComeBackTicks = DateTime.UtcNow.Ticks; + _clickThroughComeBackTimer.Start(); + } + + void _clickThroughComeBackTimer_Tick(object sender, EventArgs e) { + var diff = DateTime.UtcNow.Subtract(new DateTime(_clickThroughComeBackTicks)); + if (diff.TotalSeconds > 2) { + var mousePointer = WindowMethods.GetCursorPos(); + + if (!this.ContainsMousePointer(mousePointer)) { + if (this.Opacity == ClickThroughHoverOpacity) { + this.Opacity = 1.0; + } + _clickThroughComeBackTimer.Stop(); + } + } + } + + #endregion + + #region Chrome + + readonly FormBorderStyle DefaultBorderStyle; // = FormBorderStyle.Sizable; // FormBorderStyle.SizableToolWindow; + + public bool IsChromeVisible { + get { + return (FormBorderStyle == DefaultBorderStyle); + } + set { + //Cancel hiding chrome if no thumbnail is shown + if (!value && !_thumbnailPanel.IsShowingThumbnail) + return; + + if (!value) { + Location = new Point { + X = Location.X + SystemInformation.FrameBorderSize.Width, + Y = Location.Y + SystemInformation.FrameBorderSize.Height + }; + FormBorderStyle = FormBorderStyle.None; + } + else if(value) { + Location = new Point { + X = Location.X - SystemInformation.FrameBorderSize.Width, + Y = Location.Y - SystemInformation.FrameBorderSize.Height + }; + FormBorderStyle = DefaultBorderStyle; + } + + Program.Platform.OnFormStateChange(this); + Invalidate(); + } + } + + #endregion + + #region Position lock + + ScreenPosition? _positionLock = null; + + /// + /// Gets or sets the screen position where the window is currently locked in. + /// + public ScreenPosition? PositionLock { + get { + return _positionLock; + } + set { + if (value != null) + this.SetScreenPosition(value.Value); + + _positionLock = value; + } + } + + /// + /// Refreshes window position if in lock mode. + /// + private void RefreshScreenLock() { + //If locked in position, move accordingly + if (PositionLock.HasValue) { + this.SetScreenPosition(PositionLock.Value); + } + } + + #endregion + + } +} diff --git a/OnTopReplica/MainForm_Gui.cs b/src/OnTopReplica/MainForm_Gui.cs similarity index 97% rename from OnTopReplica/MainForm_Gui.cs rename to src/OnTopReplica/MainForm_Gui.cs index 78b1366..84b7574 100644 --- a/OnTopReplica/MainForm_Gui.cs +++ b/src/OnTopReplica/MainForm_Gui.cs @@ -1,117 +1,117 @@ -using System.Drawing; -using System.Windows.Forms; -using WindowsFormsAero.TaskDialog; - -namespace OnTopReplica { - partial class MainForm { - - /// - /// Opens the context menu. - /// - /// Optional position of the mouse, relative to which the menu is shown. - public void OpenContextMenu(Point? position) { - Point menuPosition = MousePosition; - if (position.HasValue) - menuPosition = position.Value; - - if (FullscreenManager.IsFullscreen) { - menuFullscreenContext.Show(menuPosition); - } - else { - menuContext.Show(menuPosition); - } - } - - /// - /// Gets the window's vertical chrome size. - /// - public int ChromeBorderVertical { - get { - if (IsChromeVisible) - return SystemInformation.FrameBorderSize.Height; - else - return 0; - } - } - - /// - /// Gets the window's horizontal chrome size. - /// - public int ChromeBorderHorizontal { - get { - if (IsChromeVisible) - return SystemInformation.FrameBorderSize.Width; - else - return 0; - } - } - - /// - /// Displays an error task dialog. - /// - /// Main instruction of the error dialog. - /// Detailed informations about the error. - /// Expanded error codes/messages. - private void ShowErrorDialog(string mainInstruction, string explanation, string errorMessage) { - TaskDialog dlg = new TaskDialog(mainInstruction, Strings.ErrorGenericTitle, explanation) { - CommonIcon = CommonIcon.Stop, - IsExpanded = false - }; - - if (!string.IsNullOrEmpty(errorMessage)) { - dlg.ExpandedInformation = Strings.ErrorGenericInfoText + errorMessage; - dlg.ExpandedControlText = Strings.ErrorGenericInfoButton; - } - - dlg.Show(this); - } - - /// - /// Ensures that the main form is visible (either closing the fullscreen mode or reactivating from task icon). - /// - public void EnsureMainFormVisible() { - //Reset special modes - FullscreenManager.SwitchBack(); - ClickThroughEnabled = false; - - //Restore main form in a platform-dependent method - Program.Platform.RestoreForm(this); - } - - /// - /// Opens a confirmation dialog to confirm whether to reset the main form or not. - /// - public void ResetMainFormWithConfirmation() { - var dlg = new TaskDialog(Strings.AskReset, Strings.AskResetTitle, Strings.AskResetContent); - dlg.UseCommandLinks = true; - dlg.CustomButtons = new CustomButton[] { - new CustomButton(CommonButtonResult.OK, Strings.AskResetButtonOk), - new CustomButton(CommonButtonResult.Cancel, Strings.ButtonCancel) - }; - dlg.CommonIcon = CommonIcon.Information; - - if (dlg.Show(this).CommonButton == CommonButtonResult.OK) { - ResetMainForm(); - } - } - - /// - /// Resets the main form to its initial state. - /// - public void ResetMainForm() { - //Reset form settings - UnsetThumbnail(); - CloseSidePanel(); - - //Reset location and size (edge of the screen, min size) - Point nuLoc = Screen.PrimaryScreen.WorkingArea.Location; - nuLoc.Offset(40, 40); - Location = nuLoc; - Size = new Size(240, 220); - - this.Show(); - this.Activate(); - } - - } -} +using System.Drawing; +using System.Windows.Forms; +using WindowsFormsAero.TaskDialog; + +namespace OnTopReplica { + partial class MainForm { + + /// + /// Opens the context menu. + /// + /// Optional position of the mouse, relative to which the menu is shown. + public void OpenContextMenu(Point? position) { + Point menuPosition = MousePosition; + if (position.HasValue) + menuPosition = position.Value; + + if (FullscreenManager.IsFullscreen) { + menuFullscreenContext.Show(menuPosition); + } + else { + menuContext.Show(menuPosition); + } + } + + /// + /// Gets the window's vertical chrome size. + /// + public int ChromeBorderVertical { + get { + if (IsChromeVisible) + return SystemInformation.FrameBorderSize.Height; + else + return 0; + } + } + + /// + /// Gets the window's horizontal chrome size. + /// + public int ChromeBorderHorizontal { + get { + if (IsChromeVisible) + return SystemInformation.FrameBorderSize.Width; + else + return 0; + } + } + + /// + /// Displays an error task dialog. + /// + /// Main instruction of the error dialog. + /// Detailed informations about the error. + /// Expanded error codes/messages. + private void ShowErrorDialog(string mainInstruction, string explanation, string errorMessage) { + TaskDialog dlg = new TaskDialog(mainInstruction, Strings.ErrorGenericTitle, explanation) { + CommonIcon = CommonIcon.Stop, + IsExpanded = false + }; + + if (!string.IsNullOrEmpty(errorMessage)) { + dlg.ExpandedInformation = Strings.ErrorGenericInfoText + errorMessage; + dlg.ExpandedControlText = Strings.ErrorGenericInfoButton; + } + + dlg.Show(this); + } + + /// + /// Ensures that the main form is visible (either closing the fullscreen mode or reactivating from task icon). + /// + public void EnsureMainFormVisible() { + //Reset special modes + FullscreenManager.SwitchBack(); + ClickThroughEnabled = false; + + //Restore main form in a platform-dependent method + Program.Platform.RestoreForm(this); + } + + /// + /// Opens a confirmation dialog to confirm whether to reset the main form or not. + /// + public void ResetMainFormWithConfirmation() { + var dlg = new TaskDialog(Strings.AskReset, Strings.AskResetTitle, Strings.AskResetContent); + dlg.UseCommandLinks = true; + dlg.CustomButtons = new CustomButton[] { + new CustomButton(CommonButtonResult.OK, Strings.AskResetButtonOk), + new CustomButton(CommonButtonResult.Cancel, Strings.ButtonCancel) + }; + dlg.CommonIcon = CommonIcon.Information; + + if (dlg.Show(this).CommonButton == CommonButtonResult.OK) { + ResetMainForm(); + } + } + + /// + /// Resets the main form to its initial state. + /// + public void ResetMainForm() { + //Reset form settings + UnsetThumbnail(); + CloseSidePanel(); + + //Reset location and size (edge of the screen, min size) + Point nuLoc = Screen.PrimaryScreen.WorkingArea.Location; + nuLoc.Offset(40, 40); + Location = nuLoc; + Size = new Size(240, 220); + + this.Show(); + this.Activate(); + } + + } +} diff --git a/OnTopReplica/MainForm_MenuEvents.cs b/src/OnTopReplica/MainForm_MenuEvents.cs similarity index 97% rename from OnTopReplica/MainForm_MenuEvents.cs rename to src/OnTopReplica/MainForm_MenuEvents.cs index 09a0899..a2d989e 100644 --- a/OnTopReplica/MainForm_MenuEvents.cs +++ b/src/OnTopReplica/MainForm_MenuEvents.cs @@ -1,202 +1,202 @@ -using System; -using System.ComponentModel; -using System.Drawing; -using System.Windows.Forms; -using OnTopReplica.Properties; -using WindowsFormsAero.TaskDialog; -using OnTopReplica.SidePanels; - -namespace OnTopReplica { - partial class MainForm { - - private void Menu_opening(object sender, CancelEventArgs e) { - //Cancel if currently in "fullscreen" mode or a side panel is open - if (FullscreenManager.IsFullscreen || IsSidePanelOpen) { - e.Cancel = true; - return; - } - - bool showing = _thumbnailPanel.IsShowingThumbnail; - - selectRegionToolStripMenuItem.Enabled = showing; - switchToWindowToolStripMenuItem.Enabled = showing; - resizeToolStripMenuItem.Enabled = showing; - chromeToolStripMenuItem.Checked = IsChromeVisible; - clickForwardingToolStripMenuItem.Checked = ClickForwardingEnabled; - chromeToolStripMenuItem.Enabled = showing; - clickThroughToolStripMenuItem.Enabled = showing; - clickForwardingToolStripMenuItem.Enabled = showing; - } - - private void Menu_Switch_click(object sender, EventArgs e) { - if (CurrentThumbnailWindowHandle == null) - return; - - Program.Platform.HideForm(this); - Native.WindowManagerMethods.SetForegroundWindow(CurrentThumbnailWindowHandle.Handle); - } - - private void Menu_Advanced_opening(object sender, EventArgs e) { - restoreLastClonedWindowToolStripMenuItem.Checked = Settings.Default.RestoreLastWindow; - } - - private void Menu_GroupSwitchMode_click(object sender, EventArgs e) { - SetSidePanel(new SidePanels.GroupSwitchPanel()); - } - - private void Menu_RestoreLastWindow_click(object sender, EventArgs e) { - Settings.Default.RestoreLastWindow = !Settings.Default.RestoreLastWindow; - } - - private void Menu_ClickForwarding_click(object sender, EventArgs e) { - ClickForwardingEnabled = !ClickForwardingEnabled; - } - - private void Menu_ClickThrough_click(object sender, EventArgs e) { - ClickThroughEnabled = true; - } - - private void Menu_Opacity_opening(object sender, CancelEventArgs e) { - ToolStripMenuItem[] items = { - toolStripMenuItem1, - toolStripMenuItem2, - toolStripMenuItem3, - toolStripMenuItem4 - }; - - foreach (ToolStripMenuItem i in items) { - if (((double)i.Tag) == this.Opacity) - i.Checked = true; - else - i.Checked = false; - } - } - - private void Menu_Opacity_click(object sender, EventArgs e) { - ToolStripMenuItem tsi = (ToolStripMenuItem)sender; - - if (this.Visible) { - //Target opacity is stored in the item's tag - this.Opacity = (double)tsi.Tag; - Program.Platform.OnFormStateChange(this); - } - } - - private void Menu_Region_click(object sender, EventArgs e) { - SetSidePanel(new OnTopReplica.SidePanels.RegionPanel()); - } - - private void Menu_Resize_opening(object sender, CancelEventArgs e) { - if (!_thumbnailPanel.IsShowingThumbnail) - e.Cancel = true; - - restorePositionAndSizeToolStripMenuItem.Checked = Settings.Default.RestoreSizeAndPosition; - } - - private void Menu_Resize_Double(object sender, EventArgs e) { - FitToThumbnail(2.0); - } - - private void Menu_Resize_FitToWindow(object sender, EventArgs e) { - FitToThumbnail(1.0); - } - - private void Menu_Resize_Half(object sender, EventArgs e) { - FitToThumbnail(0.5); - } - - private void Menu_Resize_Quarter(object sender, EventArgs e) { - FitToThumbnail(0.25); - } - - private void Menu_Resize_Fullscreen(object sender, EventArgs e) { - FullscreenManager.SwitchFullscreen(); - } - - private void Menu_Resize_RecallPosition_click(object sender, EventArgs e) { - Settings.Default.RestoreSizeAndPosition = !Settings.Default.RestoreSizeAndPosition; - } - - private void Menu_Position_Opening(object sender, EventArgs e) { - disabledToolStripMenuItem.Checked = (PositionLock == null); - topLeftToolStripMenuItem.Checked = (PositionLock == ScreenPosition.TopLeft); - topRightToolStripMenuItem.Checked = (PositionLock == ScreenPosition.TopRight); - centerToolStripMenuItem.Checked = (PositionLock == ScreenPosition.Center); - bottomLeftToolStripMenuItem.Checked = (PositionLock == ScreenPosition.BottomLeft); - bottomRightToolStripMenuItem.Checked = (PositionLock == ScreenPosition.BottomRight); - } - - private void Menu_Position_Disable(object sender, EventArgs e) { - PositionLock = null; - } - - private void Menu_Position_TopLeft(object sender, EventArgs e) { - PositionLock = ScreenPosition.TopLeft; - } - - private void Menu_Position_TopRight(object sender, EventArgs e) { - PositionLock = ScreenPosition.TopRight; - } - - private void Menu_Position_Center(object sender, EventArgs e) { - PositionLock = ScreenPosition.Center; - } - - private void Menu_Position_BottomLeft(object sender, EventArgs e) { - PositionLock = ScreenPosition.BottomLeft; - } - - private void Menu_Position_BottomRight(object sender, EventArgs e) { - PositionLock = ScreenPosition.BottomRight; - } - - private void Menu_Reduce_click(object sender, EventArgs e) { - //Hide form in a platform specific way - Program.Platform.HideForm(this); - } - - private void Menu_Chrome_click(object sender, EventArgs e) { - IsChromeVisible = !IsChromeVisible; - } - - private void Menu_Settings_click(object sender, EventArgs e) { - this.SetSidePanel(new OptionsPanel()); - } - - private void Menu_About_click(object sender, EventArgs e) { - this.SetSidePanel(new AboutPanel()); - } - - private void Menu_Close_click(object sender, EventArgs e) { - this.Close(); - } - - private void Menu_Fullscreen_ExitFullscreen_click(object sender, EventArgs e) { - FullscreenManager.SwitchBack(); - } - - private void Menu_Fullscreen_Mode_opening(object sender, EventArgs e) { - var mode = Settings.Default.GetFullscreenMode(); - - menuModeStandardToolStripMenuItem.Checked = (mode == FullscreenMode.Standard); - menuModeFullscreenToolStripMenuItem.Checked = (mode == FullscreenMode.Fullscreen); - menuModeAllScreensToolStripMenuItem.Checked = (mode == FullscreenMode.AllScreens); - } - - private void Menu_Fullscreen_Mode_Standard_click(object sender, EventArgs e) { - Settings.Default.SetFullscreenMode(FullscreenMode.Standard); - FullscreenManager.SwitchFullscreen(FullscreenMode.Standard); - } - - private void Menu_Fullscreen_Mode_Fullscreen_click(object sender, EventArgs e) { - Settings.Default.SetFullscreenMode(FullscreenMode.Fullscreen); - FullscreenManager.SwitchFullscreen(FullscreenMode.Fullscreen); - } - - private void Menu_Fullscreen_Mode_AllScreens_click(object sender, EventArgs e) { - Settings.Default.SetFullscreenMode(FullscreenMode.AllScreens); - FullscreenManager.SwitchFullscreen(FullscreenMode.AllScreens); - } - - } -} +using System; +using System.ComponentModel; +using System.Drawing; +using System.Windows.Forms; +using OnTopReplica.Properties; +using WindowsFormsAero.TaskDialog; +using OnTopReplica.SidePanels; + +namespace OnTopReplica { + partial class MainForm { + + private void Menu_opening(object sender, CancelEventArgs e) { + //Cancel if currently in "fullscreen" mode or a side panel is open + if (FullscreenManager.IsFullscreen || IsSidePanelOpen) { + e.Cancel = true; + return; + } + + bool showing = _thumbnailPanel.IsShowingThumbnail; + + selectRegionToolStripMenuItem.Enabled = showing; + switchToWindowToolStripMenuItem.Enabled = showing; + resizeToolStripMenuItem.Enabled = showing; + chromeToolStripMenuItem.Checked = IsChromeVisible; + clickForwardingToolStripMenuItem.Checked = ClickForwardingEnabled; + chromeToolStripMenuItem.Enabled = showing; + clickThroughToolStripMenuItem.Enabled = showing; + clickForwardingToolStripMenuItem.Enabled = showing; + } + + private void Menu_Switch_click(object sender, EventArgs e) { + if (CurrentThumbnailWindowHandle == null) + return; + + Program.Platform.HideForm(this); + Native.WindowManagerMethods.SetForegroundWindow(CurrentThumbnailWindowHandle.Handle); + } + + private void Menu_Advanced_opening(object sender, EventArgs e) { + restoreLastClonedWindowToolStripMenuItem.Checked = Settings.Default.RestoreLastWindow; + } + + private void Menu_GroupSwitchMode_click(object sender, EventArgs e) { + SetSidePanel(new SidePanels.GroupSwitchPanel()); + } + + private void Menu_RestoreLastWindow_click(object sender, EventArgs e) { + Settings.Default.RestoreLastWindow = !Settings.Default.RestoreLastWindow; + } + + private void Menu_ClickForwarding_click(object sender, EventArgs e) { + ClickForwardingEnabled = !ClickForwardingEnabled; + } + + private void Menu_ClickThrough_click(object sender, EventArgs e) { + ClickThroughEnabled = true; + } + + private void Menu_Opacity_opening(object sender, CancelEventArgs e) { + ToolStripMenuItem[] items = { + toolStripMenuItem1, + toolStripMenuItem2, + toolStripMenuItem3, + toolStripMenuItem4 + }; + + foreach (ToolStripMenuItem i in items) { + if (((double)i.Tag) == this.Opacity) + i.Checked = true; + else + i.Checked = false; + } + } + + private void Menu_Opacity_click(object sender, EventArgs e) { + ToolStripMenuItem tsi = (ToolStripMenuItem)sender; + + if (this.Visible) { + //Target opacity is stored in the item's tag + this.Opacity = (double)tsi.Tag; + Program.Platform.OnFormStateChange(this); + } + } + + private void Menu_Region_click(object sender, EventArgs e) { + SetSidePanel(new OnTopReplica.SidePanels.RegionPanel()); + } + + private void Menu_Resize_opening(object sender, CancelEventArgs e) { + if (!_thumbnailPanel.IsShowingThumbnail) + e.Cancel = true; + + restorePositionAndSizeToolStripMenuItem.Checked = Settings.Default.RestoreSizeAndPosition; + } + + private void Menu_Resize_Double(object sender, EventArgs e) { + FitToThumbnail(2.0); + } + + private void Menu_Resize_FitToWindow(object sender, EventArgs e) { + FitToThumbnail(1.0); + } + + private void Menu_Resize_Half(object sender, EventArgs e) { + FitToThumbnail(0.5); + } + + private void Menu_Resize_Quarter(object sender, EventArgs e) { + FitToThumbnail(0.25); + } + + private void Menu_Resize_Fullscreen(object sender, EventArgs e) { + FullscreenManager.SwitchFullscreen(); + } + + private void Menu_Resize_RecallPosition_click(object sender, EventArgs e) { + Settings.Default.RestoreSizeAndPosition = !Settings.Default.RestoreSizeAndPosition; + } + + private void Menu_Position_Opening(object sender, EventArgs e) { + disabledToolStripMenuItem.Checked = (PositionLock == null); + topLeftToolStripMenuItem.Checked = (PositionLock == ScreenPosition.TopLeft); + topRightToolStripMenuItem.Checked = (PositionLock == ScreenPosition.TopRight); + centerToolStripMenuItem.Checked = (PositionLock == ScreenPosition.Center); + bottomLeftToolStripMenuItem.Checked = (PositionLock == ScreenPosition.BottomLeft); + bottomRightToolStripMenuItem.Checked = (PositionLock == ScreenPosition.BottomRight); + } + + private void Menu_Position_Disable(object sender, EventArgs e) { + PositionLock = null; + } + + private void Menu_Position_TopLeft(object sender, EventArgs e) { + PositionLock = ScreenPosition.TopLeft; + } + + private void Menu_Position_TopRight(object sender, EventArgs e) { + PositionLock = ScreenPosition.TopRight; + } + + private void Menu_Position_Center(object sender, EventArgs e) { + PositionLock = ScreenPosition.Center; + } + + private void Menu_Position_BottomLeft(object sender, EventArgs e) { + PositionLock = ScreenPosition.BottomLeft; + } + + private void Menu_Position_BottomRight(object sender, EventArgs e) { + PositionLock = ScreenPosition.BottomRight; + } + + private void Menu_Reduce_click(object sender, EventArgs e) { + //Hide form in a platform specific way + Program.Platform.HideForm(this); + } + + private void Menu_Chrome_click(object sender, EventArgs e) { + IsChromeVisible = !IsChromeVisible; + } + + private void Menu_Settings_click(object sender, EventArgs e) { + this.SetSidePanel(new OptionsPanel()); + } + + private void Menu_About_click(object sender, EventArgs e) { + this.SetSidePanel(new AboutPanel()); + } + + private void Menu_Close_click(object sender, EventArgs e) { + this.Close(); + } + + private void Menu_Fullscreen_ExitFullscreen_click(object sender, EventArgs e) { + FullscreenManager.SwitchBack(); + } + + private void Menu_Fullscreen_Mode_opening(object sender, EventArgs e) { + var mode = Settings.Default.GetFullscreenMode(); + + menuModeStandardToolStripMenuItem.Checked = (mode == FullscreenMode.Standard); + menuModeFullscreenToolStripMenuItem.Checked = (mode == FullscreenMode.Fullscreen); + menuModeAllScreensToolStripMenuItem.Checked = (mode == FullscreenMode.AllScreens); + } + + private void Menu_Fullscreen_Mode_Standard_click(object sender, EventArgs e) { + Settings.Default.SetFullscreenMode(FullscreenMode.Standard); + FullscreenManager.SwitchFullscreen(FullscreenMode.Standard); + } + + private void Menu_Fullscreen_Mode_Fullscreen_click(object sender, EventArgs e) { + Settings.Default.SetFullscreenMode(FullscreenMode.Fullscreen); + FullscreenManager.SwitchFullscreen(FullscreenMode.Fullscreen); + } + + private void Menu_Fullscreen_Mode_AllScreens_click(object sender, EventArgs e) { + Settings.Default.SetFullscreenMode(FullscreenMode.AllScreens); + FullscreenManager.SwitchFullscreen(FullscreenMode.AllScreens); + } + + } +} diff --git a/OnTopReplica/MessagePumpManager.cs b/src/OnTopReplica/MessagePumpManager.cs similarity index 96% rename from OnTopReplica/MessagePumpManager.cs rename to src/OnTopReplica/MessagePumpManager.cs index af897af..2d6ac88 100644 --- a/OnTopReplica/MessagePumpManager.cs +++ b/src/OnTopReplica/MessagePumpManager.cs @@ -1,85 +1,85 @@ -using System; -using System.Collections.Generic; -using System.Windows.Forms; -using OnTopReplica.MessagePumpProcessors; -using OnTopReplica.Native; - -namespace OnTopReplica { - class MessagePumpManager : IDisposable { - - Dictionary _processors = new Dictionary(); - - public MainForm Form { get; private set; } - - private void Register(IMessagePumpProcessor processor, MainForm form) { - _processors[processor.GetType()] = processor; - processor.Initialize(form); - - Log.Write("Registered message pump processor {0}", processor.GetType()); - } - - /// - /// Instantiates all message pump processors and registers them on the main form. - /// - /// - public void Initialize(MainForm form) { - Form = form; - - //Register window shell hook - if (!HookMethods.RegisterShellHookWindow(form.Handle)) { - Log.Write("Failed to register shell hook window"); - } - else { - Log.Write("Shell hook window registered successfully"); - } - - //Register message pump processors - Register(new WindowKeeper(), form); - Register(new HotKeyManager(), form); - Register(new GroupSwitchManager(), form); - Register(new FlashCloner(), form); - } - - /// - /// Run the registered message pump processors. - /// - /// Message to process. - /// True if the message has been handled internally. - public bool PumpMessage(ref Message msg) { - foreach (var processor in _processors.Values) { - if (processor.Process(ref msg)) - return true; - } - - return false; - } - - /// - /// Get the instance of a registered message pump processor. - /// Throws if instance not found. - /// - public T Get() { - return (T)_processors[typeof(T)]; - } - - #region IDisposable Members - - public void Dispose() { - if (!HookMethods.DeregisterShellHookWindow(Form.Handle)) { - Log.Write("Failed to deregister shell hook window"); - } - else { - Log.Write("Deregistered shell hook window successfully"); - } - - foreach (var processor in _processors.Values) { - processor.Dispose(); - } - _processors.Clear(); - } - - #endregion - - } - -} +using System; +using System.Collections.Generic; +using System.Windows.Forms; +using OnTopReplica.MessagePumpProcessors; +using OnTopReplica.Native; + +namespace OnTopReplica { + class MessagePumpManager : IDisposable { + + Dictionary _processors = new Dictionary(); + + public MainForm Form { get; private set; } + + private void Register(IMessagePumpProcessor processor, MainForm form) { + _processors[processor.GetType()] = processor; + processor.Initialize(form); + + Log.Write("Registered message pump processor {0}", processor.GetType()); + } + + /// + /// Instantiates all message pump processors and registers them on the main form. + /// + /// + public void Initialize(MainForm form) { + Form = form; + + //Register window shell hook + if (!HookMethods.RegisterShellHookWindow(form.Handle)) { + Log.Write("Failed to register shell hook window"); + } + else { + Log.Write("Shell hook window registered successfully"); + } + + //Register message pump processors + Register(new WindowKeeper(), form); + Register(new HotKeyManager(), form); + Register(new GroupSwitchManager(), form); + Register(new FlashCloner(), form); + } + + /// + /// Run the registered message pump processors. + /// + /// Message to process. + /// True if the message has been handled internally. + public bool PumpMessage(ref Message msg) { + foreach (var processor in _processors.Values) { + if (processor.Process(ref msg)) + return true; + } + + return false; + } + + /// + /// Get the instance of a registered message pump processor. + /// Throws if instance not found. + /// + public T Get() { + return (T)_processors[typeof(T)]; + } + + #region IDisposable Members + + public void Dispose() { + if (!HookMethods.DeregisterShellHookWindow(Form.Handle)) { + Log.Write("Failed to deregister shell hook window"); + } + else { + Log.Write("Deregistered shell hook window successfully"); + } + + foreach (var processor in _processors.Values) { + processor.Dispose(); + } + _processors.Clear(); + } + + #endregion + + } + +} diff --git a/OnTopReplica/MessagePumpProcessors/BaseMessagePumpProcessor.cs b/src/OnTopReplica/MessagePumpProcessors/BaseMessagePumpProcessor.cs similarity index 95% rename from OnTopReplica/MessagePumpProcessors/BaseMessagePumpProcessor.cs rename to src/OnTopReplica/MessagePumpProcessors/BaseMessagePumpProcessor.cs index cfb2c5a..452ee1d 100644 --- a/OnTopReplica/MessagePumpProcessors/BaseMessagePumpProcessor.cs +++ b/src/OnTopReplica/MessagePumpProcessors/BaseMessagePumpProcessor.cs @@ -1,39 +1,39 @@ -using System; -using System.Collections.Generic; -using System.Text; -using System.Windows.Forms; - -namespace OnTopReplica.MessagePumpProcessors { - abstract class BaseMessagePumpProcessor : IMessagePumpProcessor { - - protected MainForm Form { get; private set; } - - #region IMessagePumpProcessor Members - - public virtual void Initialize(MainForm form) { - Form = form; - } - - public abstract bool Process(ref Message msg); - - #endregion - - protected abstract void Shutdown(); - - bool _isDisposed = false; - - #region IDisposable Members - - public void Dispose() { - if (_isDisposed) - return; - - Shutdown(); - - _isDisposed = true; - } - - #endregion - - } -} +using System; +using System.Collections.Generic; +using System.Text; +using System.Windows.Forms; + +namespace OnTopReplica.MessagePumpProcessors { + abstract class BaseMessagePumpProcessor : IMessagePumpProcessor { + + protected MainForm Form { get; private set; } + + #region IMessagePumpProcessor Members + + public virtual void Initialize(MainForm form) { + Form = form; + } + + public abstract bool Process(ref Message msg); + + #endregion + + protected abstract void Shutdown(); + + bool _isDisposed = false; + + #region IDisposable Members + + public void Dispose() { + if (_isDisposed) + return; + + Shutdown(); + + _isDisposed = true; + } + + #endregion + + } +} diff --git a/OnTopReplica/MessagePumpProcessors/FlashCloner.cs b/src/OnTopReplica/MessagePumpProcessors/FlashCloner.cs similarity index 96% rename from OnTopReplica/MessagePumpProcessors/FlashCloner.cs rename to src/OnTopReplica/MessagePumpProcessors/FlashCloner.cs index c1ad7c0..2a704fb 100644 --- a/OnTopReplica/MessagePumpProcessors/FlashCloner.cs +++ b/src/OnTopReplica/MessagePumpProcessors/FlashCloner.cs @@ -1,35 +1,35 @@ -using OnTopReplica.Native; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace OnTopReplica.MessagePumpProcessors { - - /// - /// Automatically clones windows that are flashing. - /// - class FlashCloner : BaseMessagePumpProcessor { - - public override bool Process(ref System.Windows.Forms.Message msg) { - if (false && - msg.Msg == HookMethods.WM_SHELLHOOKMESSAGE) { - int hookCode = msg.WParam.ToInt32(); - - if (hookCode == HookMethods.HSHELL_FLASH) { - IntPtr flashHandle = msg.LParam; - - Form.SetThumbnail(new WindowHandle(flashHandle), null); - } - } - - return false; - } - - protected override void Shutdown() { - - } - - } - -} +using OnTopReplica.Native; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace OnTopReplica.MessagePumpProcessors { + + /// + /// Automatically clones windows that are flashing. + /// + class FlashCloner : BaseMessagePumpProcessor { + + public override bool Process(ref System.Windows.Forms.Message msg) { + if (false && + msg.Msg == HookMethods.WM_SHELLHOOKMESSAGE) { + int hookCode = msg.WParam.ToInt32(); + + if (hookCode == HookMethods.HSHELL_FLASH) { + IntPtr flashHandle = msg.LParam; + + Form.SetThumbnail(new WindowHandle(flashHandle), null); + } + } + + return false; + } + + protected override void Shutdown() { + + } + + } + +} diff --git a/OnTopReplica/MessagePumpProcessors/GroupSwitchManager.cs b/src/OnTopReplica/MessagePumpProcessors/GroupSwitchManager.cs similarity index 96% rename from OnTopReplica/MessagePumpProcessors/GroupSwitchManager.cs rename to src/OnTopReplica/MessagePumpProcessors/GroupSwitchManager.cs index 76b9099..aaa199c 100644 --- a/OnTopReplica/MessagePumpProcessors/GroupSwitchManager.cs +++ b/src/OnTopReplica/MessagePumpProcessors/GroupSwitchManager.cs @@ -1,133 +1,133 @@ -using System; -using System.Collections.Generic; -using System.Text; -using System.Runtime.InteropServices; -using System.Reflection; -using System.IO; -using System.Windows.Forms; -using OnTopReplica.Native; - -namespace OnTopReplica.MessagePumpProcessors { - - class GroupSwitchManager : BaseMessagePumpProcessor { - - bool _active = false; - List _lruHandles; - - /// - /// Enables group switch mode. - /// - /// List of window handles to track. - public void EnableGroupMode(IList handles) { - if (handles == null || handles.Count == 0) - return; - - //Okey dokey, will now track handles - TrackHandles(handles); - _active = true; - } - - /// - /// Initializes the LRU sorted list of window handles. - /// - private void TrackHandles(IList handles) { - _lruHandles = new List(handles.Count); - var now = DateTime.Now; - - foreach(var h in handles){ - _lruHandles.Add(new WindowHandleWrapper { - WindowHandle = h, - LastTimeUsed = now - }); - } - } - - /// - /// Disables group switch mode. - /// - public void Disable() { - if (!_active) - return; - - _lruHandles = null; - _active = false; - } - - /// - /// Processes the message pump. - /// - public override bool Process(ref Message msg) { - if (_active && msg.Msg == HookMethods.WM_SHELLHOOKMESSAGE) { - int hookCode = msg.WParam.ToInt32(); - if (hookCode == HookMethods.HSHELL_WINDOWACTIVATED || - hookCode == HookMethods.HSHELL_RUDEAPPACTIVATED) { - - IntPtr activeHandle = msg.LParam; - HandleForegroundWindowChange(activeHandle); - } - } - - return false; - } - - private void HandleForegroundWindowChange(IntPtr activeWindow) { - //Seek window in tracked handles - WindowHandleWrapper activated = null; - foreach (var i in _lruHandles) { - if (i.WindowHandle.Handle == activeWindow) - activated = i; - } - - if (activated == null) { - //New foreground window is not tracked - return; - } - - //Update tracked handle - activated.LastTimeUsed = DateTime.Now; - _lruHandles.Sort(new LruDateTimeComparer()); - - //Get least recently used - var next = _lruHandles[0]; - - Log.Write("Switched to tracked window: switching to {0} (last use: {1})", next.WindowHandle.Title, next.LastTimeUsed); - - Form.SetThumbnail(next.WindowHandle, null); - } - - protected override void Shutdown() { - Disable(); - } - - /// - /// Gets whether the group switch manager ia active. - /// - public bool IsActive { - get { - return _active; - } - } - - #region List sorting stuff - - class WindowHandleWrapper { - public WindowHandle WindowHandle { get; set; } - public DateTime LastTimeUsed { get; set; } - } - - class LruDateTimeComparer : IComparer { - - #region IComparer Members - - public int Compare(WindowHandleWrapper x, WindowHandleWrapper y) { - return x.LastTimeUsed.CompareTo(y.LastTimeUsed); - } - - #endregion - } - - #endregion - - } - -} +using System; +using System.Collections.Generic; +using System.Text; +using System.Runtime.InteropServices; +using System.Reflection; +using System.IO; +using System.Windows.Forms; +using OnTopReplica.Native; + +namespace OnTopReplica.MessagePumpProcessors { + + class GroupSwitchManager : BaseMessagePumpProcessor { + + bool _active = false; + List _lruHandles; + + /// + /// Enables group switch mode. + /// + /// List of window handles to track. + public void EnableGroupMode(IList handles) { + if (handles == null || handles.Count == 0) + return; + + //Okey dokey, will now track handles + TrackHandles(handles); + _active = true; + } + + /// + /// Initializes the LRU sorted list of window handles. + /// + private void TrackHandles(IList handles) { + _lruHandles = new List(handles.Count); + var now = DateTime.Now; + + foreach(var h in handles){ + _lruHandles.Add(new WindowHandleWrapper { + WindowHandle = h, + LastTimeUsed = now + }); + } + } + + /// + /// Disables group switch mode. + /// + public void Disable() { + if (!_active) + return; + + _lruHandles = null; + _active = false; + } + + /// + /// Processes the message pump. + /// + public override bool Process(ref Message msg) { + if (_active && msg.Msg == HookMethods.WM_SHELLHOOKMESSAGE) { + int hookCode = msg.WParam.ToInt32(); + if (hookCode == HookMethods.HSHELL_WINDOWACTIVATED || + hookCode == HookMethods.HSHELL_RUDEAPPACTIVATED) { + + IntPtr activeHandle = msg.LParam; + HandleForegroundWindowChange(activeHandle); + } + } + + return false; + } + + private void HandleForegroundWindowChange(IntPtr activeWindow) { + //Seek window in tracked handles + WindowHandleWrapper activated = null; + foreach (var i in _lruHandles) { + if (i.WindowHandle.Handle == activeWindow) + activated = i; + } + + if (activated == null) { + //New foreground window is not tracked + return; + } + + //Update tracked handle + activated.LastTimeUsed = DateTime.Now; + _lruHandles.Sort(new LruDateTimeComparer()); + + //Get least recently used + var next = _lruHandles[0]; + + Log.Write("Switched to tracked window: switching to {0} (last use: {1})", next.WindowHandle.Title, next.LastTimeUsed); + + Form.SetThumbnail(next.WindowHandle, null); + } + + protected override void Shutdown() { + Disable(); + } + + /// + /// Gets whether the group switch manager ia active. + /// + public bool IsActive { + get { + return _active; + } + } + + #region List sorting stuff + + class WindowHandleWrapper { + public WindowHandle WindowHandle { get; set; } + public DateTime LastTimeUsed { get; set; } + } + + class LruDateTimeComparer : IComparer { + + #region IComparer Members + + public int Compare(WindowHandleWrapper x, WindowHandleWrapper y) { + return x.LastTimeUsed.CompareTo(y.LastTimeUsed); + } + + #endregion + } + + #endregion + + } + +} diff --git a/OnTopReplica/MessagePumpProcessors/HotKeyManager.cs b/src/OnTopReplica/MessagePumpProcessors/HotKeyManager.cs similarity index 96% rename from OnTopReplica/MessagePumpProcessors/HotKeyManager.cs rename to src/OnTopReplica/MessagePumpProcessors/HotKeyManager.cs index 7717b2a..fd6006f 100644 --- a/OnTopReplica/MessagePumpProcessors/HotKeyManager.cs +++ b/src/OnTopReplica/MessagePumpProcessors/HotKeyManager.cs @@ -1,167 +1,167 @@ -using System; -using System.Collections.Generic; -using System.Text; -using System.Windows.Forms; -using OnTopReplica.Native; -using OnTopReplica.Properties; - -namespace OnTopReplica.MessagePumpProcessors { - - /// - /// HotKey registration helper. - /// - class HotKeyManager : BaseMessagePumpProcessor { - - public HotKeyManager() { - Enabled = true; - } - - delegate void HotKeyHandler(); - - /// - /// Wraps hot key handler registration data. - /// - private class HotKeyHandlerRegistration : IDisposable { - private HotKeyHandlerRegistration() { - } - - private HotKeyHandlerRegistration(IntPtr hwnd, int key, HotKeyHandler handler) { - if (hwnd == IntPtr.Zero) - throw new ArgumentException(); - if (handler == null) - throw new ArgumentNullException(); - - _hwnd = hwnd; - RegistrationKey = key; - Handler = handler; - } - - static int _lastUsedKey = 0; - - /// - /// Registers a new hotkey and returns a handle to the registration. - /// - /// Returns null on failure. - public static HotKeyHandlerRegistration Register(Form owner, int keyCode, int modifiers, HotKeyHandler handler) { - var key = ++_lastUsedKey; - - if (!HotKeyMethods.RegisterHotKey(owner.Handle, key, modifiers, keyCode)) { - Log.Write("Failed to create hotkey on key {0} with modifiers {1}", keyCode, modifiers); - return null; - } - - return new HotKeyHandlerRegistration(owner.Handle, key, handler); - } - - IntPtr _hwnd; - public int RegistrationKey { get; private set; } - public HotKeyHandler Handler { get; private set; } - - public void Dispose() { - if (!HotKeyMethods.UnregisterHotKey(_hwnd, RegistrationKey)) { - Log.Write("Failed to unregister hotkey #{0}", RegistrationKey); - } - } - } - - Dictionary _handlers = new Dictionary(); - - public override void Initialize(MainForm form) { - base.Initialize(form); - - RefreshHotkeys(); - } - - public override bool Process(ref Message msg) { - if (Enabled && msg.Msg == HotKeyMethods.WM_HOTKEY) { - int keyId = msg.WParam.ToInt32(); - if (!_handlers.ContainsKey(keyId)) - return false; - - _handlers[keyId].Handler.Invoke(); - } - - return false; - } - - public bool Enabled { get; set; } - - /// - /// Refreshes registered hotkeys from Settings. - /// - /// - /// Application settings contain hotkey registration strings that are used - /// automatically by this registration process. - /// - public void RefreshHotkeys() { - ClearHandlers(); - - RegisterHandler(Settings.Default.HotKeyCloneCurrent, HotKeyCloneHandler); - RegisterHandler(Settings.Default.HotKeyShowHide, HotKeyShowHideHandler); - } - - private void RegisterHandler(string spec, HotKeyHandler handler) { - if (string.IsNullOrEmpty(spec)) - return; //this can happen and is allowed => simply don't register - if (handler == null) - throw new ArgumentNullException(); - - int modifiers = 0, keyCode = 0; - - try { - HotKeyMethods.TranslateStringToKeyValues(spec, out modifiers, out keyCode); - } - catch (ArgumentException) { - //TODO: swallowed exception - return; - } - - var reg = HotKeyHandlerRegistration.Register(Form, keyCode, modifiers, handler); - if(reg != null) - _handlers.Add(reg.RegistrationKey, reg); - } - - private void ClearHandlers() { - foreach (var hotkey in _handlers) { - hotkey.Value.Dispose(); - } - _handlers.Clear(); - } - - protected override void Shutdown() { - ClearHandlers(); - } - - #region Hotkey callbacks - - /// - /// Handles "show/hide" hotkey. Ensures the form is in restored state and switches - /// between shown and hidden states. - /// - void HotKeyShowHideHandler() { - Form.FullscreenManager.SwitchBack(); - - if (!Program.Platform.IsHidden(Form)) { - Program.Platform.HideForm(Form); - } - else { - Form.EnsureMainFormVisible(); - } - } - - /// - /// Handles the "clone current" hotkey. - /// - void HotKeyCloneHandler() { - var handle = Win32Helper.GetCurrentForegroundWindow(); - if (handle.Handle == Form.Handle) - return; - - Form.SetThumbnail(handle, null); - } - - #endregion - - } - -} +using System; +using System.Collections.Generic; +using System.Text; +using System.Windows.Forms; +using OnTopReplica.Native; +using OnTopReplica.Properties; + +namespace OnTopReplica.MessagePumpProcessors { + + /// + /// HotKey registration helper. + /// + class HotKeyManager : BaseMessagePumpProcessor { + + public HotKeyManager() { + Enabled = true; + } + + delegate void HotKeyHandler(); + + /// + /// Wraps hot key handler registration data. + /// + private class HotKeyHandlerRegistration : IDisposable { + private HotKeyHandlerRegistration() { + } + + private HotKeyHandlerRegistration(IntPtr hwnd, int key, HotKeyHandler handler) { + if (hwnd == IntPtr.Zero) + throw new ArgumentException(); + if (handler == null) + throw new ArgumentNullException(); + + _hwnd = hwnd; + RegistrationKey = key; + Handler = handler; + } + + static int _lastUsedKey = 0; + + /// + /// Registers a new hotkey and returns a handle to the registration. + /// + /// Returns null on failure. + public static HotKeyHandlerRegistration Register(Form owner, int keyCode, int modifiers, HotKeyHandler handler) { + var key = ++_lastUsedKey; + + if (!HotKeyMethods.RegisterHotKey(owner.Handle, key, modifiers, keyCode)) { + Log.Write("Failed to create hotkey on key {0} with modifiers {1}", keyCode, modifiers); + return null; + } + + return new HotKeyHandlerRegistration(owner.Handle, key, handler); + } + + IntPtr _hwnd; + public int RegistrationKey { get; private set; } + public HotKeyHandler Handler { get; private set; } + + public void Dispose() { + if (!HotKeyMethods.UnregisterHotKey(_hwnd, RegistrationKey)) { + Log.Write("Failed to unregister hotkey #{0}", RegistrationKey); + } + } + } + + Dictionary _handlers = new Dictionary(); + + public override void Initialize(MainForm form) { + base.Initialize(form); + + RefreshHotkeys(); + } + + public override bool Process(ref Message msg) { + if (Enabled && msg.Msg == HotKeyMethods.WM_HOTKEY) { + int keyId = msg.WParam.ToInt32(); + if (!_handlers.ContainsKey(keyId)) + return false; + + _handlers[keyId].Handler.Invoke(); + } + + return false; + } + + public bool Enabled { get; set; } + + /// + /// Refreshes registered hotkeys from Settings. + /// + /// + /// Application settings contain hotkey registration strings that are used + /// automatically by this registration process. + /// + public void RefreshHotkeys() { + ClearHandlers(); + + RegisterHandler(Settings.Default.HotKeyCloneCurrent, HotKeyCloneHandler); + RegisterHandler(Settings.Default.HotKeyShowHide, HotKeyShowHideHandler); + } + + private void RegisterHandler(string spec, HotKeyHandler handler) { + if (string.IsNullOrEmpty(spec)) + return; //this can happen and is allowed => simply don't register + if (handler == null) + throw new ArgumentNullException(); + + int modifiers = 0, keyCode = 0; + + try { + HotKeyMethods.TranslateStringToKeyValues(spec, out modifiers, out keyCode); + } + catch (ArgumentException) { + //TODO: swallowed exception + return; + } + + var reg = HotKeyHandlerRegistration.Register(Form, keyCode, modifiers, handler); + if(reg != null) + _handlers.Add(reg.RegistrationKey, reg); + } + + private void ClearHandlers() { + foreach (var hotkey in _handlers) { + hotkey.Value.Dispose(); + } + _handlers.Clear(); + } + + protected override void Shutdown() { + ClearHandlers(); + } + + #region Hotkey callbacks + + /// + /// Handles "show/hide" hotkey. Ensures the form is in restored state and switches + /// between shown and hidden states. + /// + void HotKeyShowHideHandler() { + Form.FullscreenManager.SwitchBack(); + + if (!Program.Platform.IsHidden(Form)) { + Program.Platform.HideForm(Form); + } + else { + Form.EnsureMainFormVisible(); + } + } + + /// + /// Handles the "clone current" hotkey. + /// + void HotKeyCloneHandler() { + var handle = Win32Helper.GetCurrentForegroundWindow(); + if (handle.Handle == Form.Handle) + return; + + Form.SetThumbnail(handle, null); + } + + #endregion + + } + +} diff --git a/OnTopReplica/MessagePumpProcessors/ShellInterceptProcessor.cs b/src/OnTopReplica/MessagePumpProcessors/ShellInterceptProcessor.cs similarity index 95% rename from OnTopReplica/MessagePumpProcessors/ShellInterceptProcessor.cs rename to src/OnTopReplica/MessagePumpProcessors/ShellInterceptProcessor.cs index fc13b6c..4cfe458 100644 --- a/OnTopReplica/MessagePumpProcessors/ShellInterceptProcessor.cs +++ b/src/OnTopReplica/MessagePumpProcessors/ShellInterceptProcessor.cs @@ -1,34 +1,34 @@ -using System; -using System.Collections.Generic; -using System.Text; -using System.Windows.Forms; -using OnTopReplica.Native; - -namespace OnTopReplica.MessagePumpProcessors { - -#if DEBUG - - /// - /// Basic shell message interceptor to use for debugging. - /// - class ShellInterceptProcessor : BaseMessagePumpProcessor { - - public override bool Process(ref Message msg) { - if (msg.Msg == HookMethods.WM_SHELLHOOKMESSAGE) { - int hookCode = msg.WParam.ToInt32(); - - Log.Write("Hook msg #{0}: {1}", hookCode, msg.LParam); - } - - return false; - } - - protected override void Shutdown() { - - } - - } - -#endif - -} +using System; +using System.Collections.Generic; +using System.Text; +using System.Windows.Forms; +using OnTopReplica.Native; + +namespace OnTopReplica.MessagePumpProcessors { + +#if DEBUG + + /// + /// Basic shell message interceptor to use for debugging. + /// + class ShellInterceptProcessor : BaseMessagePumpProcessor { + + public override bool Process(ref Message msg) { + if (msg.Msg == HookMethods.WM_SHELLHOOKMESSAGE) { + int hookCode = msg.WParam.ToInt32(); + + Log.Write("Hook msg #{0}: {1}", hookCode, msg.LParam); + } + + return false; + } + + protected override void Shutdown() { + + } + + } + +#endif + +} diff --git a/OnTopReplica/MessagePumpProcessors/WindowKeeper.cs b/src/OnTopReplica/MessagePumpProcessors/WindowKeeper.cs similarity index 97% rename from OnTopReplica/MessagePumpProcessors/WindowKeeper.cs rename to src/OnTopReplica/MessagePumpProcessors/WindowKeeper.cs index 4a0c548..0353f06 100644 --- a/OnTopReplica/MessagePumpProcessors/WindowKeeper.cs +++ b/src/OnTopReplica/MessagePumpProcessors/WindowKeeper.cs @@ -1,40 +1,40 @@ -using System; -using System.Collections.Generic; -using System.Text; -using System.Windows.Forms; -using OnTopReplica.Native; - -namespace OnTopReplica.MessagePumpProcessors { - - /// - /// Listens for shell events and closes the thumbnail if a cloned window is destroyed. - /// - class WindowKeeper : BaseMessagePumpProcessor { - - public override bool Process(ref Message msg) { - if (Form.CurrentThumbnailWindowHandle != null && - msg.Msg == HookMethods.WM_SHELLHOOKMESSAGE) { - int hookCode = msg.WParam.ToInt32(); - - if (hookCode == HookMethods.HSHELL_WINDOWDESTROYED) { - //Check whether the destroyed window is the one we were cloning - IntPtr destroyedHandle = msg.LParam; - if (destroyedHandle == Form.CurrentThumbnailWindowHandle.Handle) { - //Disable group switch mode, since a window of the group has been destroyed - Form.MessagePumpManager.Get().Disable(); - - //Disable cloning - Form.UnsetThumbnail(); - } - } - } - - return false; - } - - protected override void Shutdown() { - - } - } - -} +using System; +using System.Collections.Generic; +using System.Text; +using System.Windows.Forms; +using OnTopReplica.Native; + +namespace OnTopReplica.MessagePumpProcessors { + + /// + /// Listens for shell events and closes the thumbnail if a cloned window is destroyed. + /// + class WindowKeeper : BaseMessagePumpProcessor { + + public override bool Process(ref Message msg) { + if (Form.CurrentThumbnailWindowHandle != null && + msg.Msg == HookMethods.WM_SHELLHOOKMESSAGE) { + int hookCode = msg.WParam.ToInt32(); + + if (hookCode == HookMethods.HSHELL_WINDOWDESTROYED) { + //Check whether the destroyed window is the one we were cloning + IntPtr destroyedHandle = msg.LParam; + if (destroyedHandle == Form.CurrentThumbnailWindowHandle.Handle) { + //Disable group switch mode, since a window of the group has been destroyed + Form.MessagePumpManager.Get().Disable(); + + //Disable cloning + Form.UnsetThumbnail(); + } + } + } + + return false; + } + + protected override void Shutdown() { + + } + } + +} diff --git a/OnTopReplica/NDesk/Options/Options.cs b/src/OnTopReplica/NDesk/Options/Options.cs similarity index 97% rename from OnTopReplica/NDesk/Options/Options.cs rename to src/OnTopReplica/NDesk/Options/Options.cs index 24c4552..83e51eb 100644 --- a/OnTopReplica/NDesk/Options/Options.cs +++ b/src/OnTopReplica/NDesk/Options/Options.cs @@ -1,1042 +1,1042 @@ -// -// Options.cs (version 0.2.1) -// -// Authors: -// Jonathan Pryor -// -// Copyright (C) 2008 Novell (http://www.novell.com) -// -// Permission is hereby granted, free of charge, to any person obtaining -// a copy of this software and associated documentation files (the -// "Software"), to deal in the Software without restriction, including -// without limitation the rights to use, copy, modify, merge, publish, -// distribute, sublicense, and/or sell copies of the Software, and to -// permit persons to whom the Software is furnished to do so, subject to -// the following conditions: -// -// The above copyright notice and this permission notice shall be -// included in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -// - -// Compile With: -// gmcs -debug+ -r:System.Core Options.cs -o:NDesk.Options.dll -// gmcs -debug+ -d:LINQ -r:System.Core Options.cs -o:NDesk.Options.dll -// -// The LINQ version just changes the implementation of -// OptionSet.Parse(IEnumerable), and confers no semantic changes. - -// -// A Getopt::Long-inspired option parsing library for C#. -// -// NDesk.Options.OptionSet is built upon a key/value table, where the -// key is a option format string and the value is a delegate that is -// invoked when the format string is matched. -// -// Option format strings: -// Regex-like BNF Grammar: -// name: .+ -// type: [=:] -// sep: ( [^{}]+ | '{' .+ '}' )? -// aliases: ( name type sep ) ( '|' name type sep )* -// -// Each '|'-delimited name is an alias for the associated action. If the -// format string ends in a '=', it has a required value. If the format -// string ends in a ':', it has an optional value. If neither '=' or ':' -// is present, no value is supported. `=' or `:' need only be defined on one -// alias, but if they are provided on more than one they must be consistent. -// -// Each alias portion may also end with a "key/value separator", which is used -// to split option values if the option accepts > 1 value. If not specified, -// it defaults to '=' and ':'. If specified, it can be any character except -// '{' and '}' OR the *string* between '{' and '}'. If no separator should be -// used (i.e. the separate values should be distinct arguments), then "{}" -// should be used as the separator. -// -// Options are extracted either from the current option by looking for -// the option name followed by an '=' or ':', or is taken from the -// following option IFF: -// - The current option does not contain a '=' or a ':' -// - The current option requires a value (i.e. not a Option type of ':') -// -// The `name' used in the option format string does NOT include any leading -// option indicator, such as '-', '--', or '/'. All three of these are -// permitted/required on any named option. -// -// Option bundling is permitted so long as: -// - '-' is used to start the option group -// - all of the bundled options are a single character -// - at most one of the bundled options accepts a value, and the value -// provided starts from the next character to the end of the string. -// -// This allows specifying '-a -b -c' as '-abc', and specifying '-D name=value' -// as '-Dname=value'. -// -// Option processing is disabled by specifying "--". All options after "--" -// are returned by OptionSet.Parse() unchanged and unprocessed. -// -// Unprocessed options are returned from OptionSet.Parse(). -// -// Examples: -// int verbose = 0; -// OptionSet p = new OptionSet () -// .Add ("v", v => ++verbose) -// .Add ("name=|value=", v => Console.WriteLine (v)); -// p.Parse (new string[]{"-v", "--v", "/v", "-name=A", "/name", "B", "extra"}); -// -// The above would parse the argument string array, and would invoke the -// lambda expression three times, setting `verbose' to 3 when complete. -// It would also print out "A" and "B" to standard output. -// The returned array would contain the string "extra". -// -// C# 3.0 collection initializers are supported and encouraged: -// var p = new OptionSet () { -// { "h|?|help", v => ShowHelp () }, -// }; -// -// System.ComponentModel.TypeConverter is also supported, allowing the use of -// custom data types in the callback type; TypeConverter.ConvertFromString() -// is used to convert the value option to an instance of the specified -// type: -// -// var p = new OptionSet () { -// { "foo=", (Foo f) => Console.WriteLine (f.ToString ()) }, -// }; -// -// Random other tidbits: -// - Boolean options (those w/o '=' or ':' in the option format string) -// are explicitly enabled if they are followed with '+', and explicitly -// disabled if they are followed with '-': -// string a = null; -// var p = new OptionSet () { -// { "a", s => a = s }, -// }; -// p.Parse (new string[]{"-a"}); // sets v != null -// p.Parse (new string[]{"-a+"}); // sets v != null -// p.Parse (new string[]{"-a-"}); // sets v == null -// - -using System; -using System.Collections; -using System.Collections.Generic; -using System.Collections.ObjectModel; -using System.ComponentModel; -using System.Globalization; -using System.IO; -using System.Runtime.Serialization; -using System.Security.Permissions; -using System.Text; -using System.Text.RegularExpressions; - -#if LINQ -using System.Linq; -#endif - -#if TEST -using NDesk.Options; -#endif - -namespace NDesk.Options { - - public class OptionValueCollection : IList, IList { - - List values = new List(); - OptionContext c; - - internal OptionValueCollection(OptionContext c) { - this.c = c; - } - - #region ICollection - void ICollection.CopyTo(Array array, int index) { (values as ICollection).CopyTo(array, index); } - bool ICollection.IsSynchronized { get { return (values as ICollection).IsSynchronized; } } - object ICollection.SyncRoot { get { return (values as ICollection).SyncRoot; } } - #endregion - - #region ICollection - public void Add(string item) { values.Add(item); } - public void Clear() { values.Clear(); } - public bool Contains(string item) { return values.Contains(item); } - public void CopyTo(string[] array, int arrayIndex) { values.CopyTo(array, arrayIndex); } - public bool Remove(string item) { return values.Remove(item); } - public int Count { get { return values.Count; } } - public bool IsReadOnly { get { return false; } } - #endregion - - #region IEnumerable - IEnumerator IEnumerable.GetEnumerator() { return values.GetEnumerator(); } - #endregion - - #region IEnumerable - public IEnumerator GetEnumerator() { return values.GetEnumerator(); } - #endregion - - #region IList - int IList.Add(object value) { return (values as IList).Add(value); } - bool IList.Contains(object value) { return (values as IList).Contains(value); } - int IList.IndexOf(object value) { return (values as IList).IndexOf(value); } - void IList.Insert(int index, object value) { (values as IList).Insert(index, value); } - void IList.Remove(object value) { (values as IList).Remove(value); } - void IList.RemoveAt(int index) { (values as IList).RemoveAt(index); } - bool IList.IsFixedSize { get { return false; } } - object IList.this[int index] { get { return this[index]; } set { (values as IList)[index] = value; } } - #endregion - - #region IList - public int IndexOf(string item) { return values.IndexOf(item); } - public void Insert(int index, string item) { values.Insert(index, item); } - public void RemoveAt(int index) { values.RemoveAt(index); } - - private void AssertValid(int index) { - if (c.Option == null) - throw new InvalidOperationException("OptionContext.Option is null."); - if (index >= c.Option.MaxValueCount) - throw new ArgumentOutOfRangeException("index"); - if (c.Option.OptionValueType == OptionValueType.Required && - index >= values.Count) - throw new OptionException(string.Format( - c.OptionSet.MessageLocalizer("Missing required value for option '{0}'."), c.OptionName), - c.OptionName); - } - - public string this[int index] { - get { - AssertValid(index); - return index >= values.Count ? null : values[index]; - } - set { - values[index] = value; - } - } - #endregion - - public List ToList() { - return new List(values); - } - - public string[] ToArray() { - return values.ToArray(); - } - - public override string ToString() { - return string.Join(", ", values.ToArray()); - } - } - - public class OptionContext { - private Option option; - private string name; - private int index; - private OptionSet set; - private OptionValueCollection c; - - public OptionContext(OptionSet set) { - this.set = set; - this.c = new OptionValueCollection(this); - } - - public Option Option { - get { return option; } - set { option = value; } - } - - public string OptionName { - get { return name; } - set { name = value; } - } - - public int OptionIndex { - get { return index; } - set { index = value; } - } - - public OptionSet OptionSet { - get { return set; } - } - - public OptionValueCollection OptionValues { - get { return c; } - } - } - - public enum OptionValueType { - None, - Optional, - Required, - } - - public abstract class Option { - string prototype, description; - string[] names; - OptionValueType type; - int count; - string[] separators; - - protected Option(string prototype, string description) - : this(prototype, description, 1) { - } - - protected Option(string prototype, string description, int maxValueCount) { - if (prototype == null) - throw new ArgumentNullException("prototype"); - if (prototype.Length == 0) - throw new ArgumentException("Cannot be the empty string.", "prototype"); - if (maxValueCount < 0) - throw new ArgumentOutOfRangeException("maxValueCount"); - - this.prototype = prototype; - this.names = prototype.Split('|'); - this.description = description; - this.count = maxValueCount; - this.type = ParsePrototype(); - - if (this.count == 0 && type != OptionValueType.None) - throw new ArgumentException( - "Cannot provide maxValueCount of 0 for OptionValueType.Required or " + - "OptionValueType.Optional.", - "maxValueCount"); - if (this.type == OptionValueType.None && maxValueCount > 1) - throw new ArgumentException( - string.Format("Cannot provide maxValueCount of {0} for OptionValueType.None.", maxValueCount), - "maxValueCount"); - if (Array.IndexOf(names, "<>") >= 0 && - ((names.Length == 1 && this.type != OptionValueType.None) || - (names.Length > 1 && this.MaxValueCount > 1))) - throw new ArgumentException( - "The default option handler '<>' cannot require values.", - "prototype"); - } - - public string Prototype { get { return prototype; } } - public string Description { get { return description; } } - public OptionValueType OptionValueType { get { return type; } } - public int MaxValueCount { get { return count; } } - - public string[] GetNames() { - return (string[])names.Clone(); - } - - public string[] GetValueSeparators() { - if (separators == null) - return new string[0]; - return (string[])separators.Clone(); - } - - protected static T Parse(string value, OptionContext c) { - TypeConverter conv = TypeDescriptor.GetConverter(typeof(T)); - T t = default(T); - try { - if (value != null) - t = (T)conv.ConvertFromString(value); - } - catch (Exception e) { - throw new OptionException( - string.Format( - c.OptionSet.MessageLocalizer("Could not convert string `{0}' to type {1} for option `{2}'."), - value, typeof(T).Name, c.OptionName), - c.OptionName, e); - } - return t; - } - - internal string[] Names { get { return names; } } - internal string[] ValueSeparators { get { return separators; } } - - static readonly char[] NameTerminator = new char[] { '=', ':' }; - - private OptionValueType ParsePrototype() { - char type = '\0'; - List seps = new List(); - for (int i = 0; i < names.Length; ++i) { - string name = names[i]; - if (name.Length == 0) - throw new ArgumentException("Empty option names are not supported.", "prototype"); - - int end = name.IndexOfAny(NameTerminator); - if (end == -1) - continue; - names[i] = name.Substring(0, end); - if (type == '\0' || type == name[end]) - type = name[end]; - else - throw new ArgumentException( - string.Format("Conflicting option types: '{0}' vs. '{1}'.", type, name[end]), - "prototype"); - AddSeparators(name, end, seps); - } - - if (type == '\0') - return OptionValueType.None; - - if (count <= 1 && seps.Count != 0) - throw new ArgumentException( - string.Format("Cannot provide key/value separators for Options taking {0} value(s).", count), - "prototype"); - if (count > 1) { - if (seps.Count == 0) - this.separators = new string[] { ":", "=" }; - else if (seps.Count == 1 && seps[0].Length == 0) - this.separators = null; - else - this.separators = seps.ToArray(); - } - - return type == '=' ? OptionValueType.Required : OptionValueType.Optional; - } - - private static void AddSeparators(string name, int end, ICollection seps) { - int start = -1; - for (int i = end + 1; i < name.Length; ++i) { - switch (name[i]) { - case '{': - if (start != -1) - throw new ArgumentException( - string.Format("Ill-formed name/value separator found in \"{0}\".", name), - "prototype"); - start = i + 1; - break; - case '}': - if (start == -1) - throw new ArgumentException( - string.Format("Ill-formed name/value separator found in \"{0}\".", name), - "prototype"); - seps.Add(name.Substring(start, i - start)); - start = -1; - break; - default: - if (start == -1) - seps.Add(name[i].ToString()); - break; - } - } - if (start != -1) - throw new ArgumentException( - string.Format("Ill-formed name/value separator found in \"{0}\".", name), - "prototype"); - } - - public void Invoke(OptionContext c) { - OnParseComplete(c); - c.OptionName = null; - c.Option = null; - c.OptionValues.Clear(); - } - - protected abstract void OnParseComplete(OptionContext c); - - public override string ToString() { - return Prototype; - } - } - - [Serializable] - public class OptionException : Exception { - private string option; - - public OptionException() { - } - - public OptionException(string message, string optionName) - : base(message) { - this.option = optionName; - } - - public OptionException(string message, string optionName, Exception innerException) - : base(message, innerException) { - this.option = optionName; - } - - protected OptionException(SerializationInfo info, StreamingContext context) - : base(info, context) { - this.option = info.GetString("OptionName"); - } - - public string OptionName { - get { return this.option; } - } - - [SecurityPermission(SecurityAction.LinkDemand, SerializationFormatter = true)] - public override void GetObjectData(SerializationInfo info, StreamingContext context) { - base.GetObjectData(info, context); - info.AddValue("OptionName", option); - } - } - - public delegate void OptionAction(TKey key, TValue value); - - public class OptionSet : KeyedCollection { - public OptionSet() - : this(delegate(string f) { return f; }) { - } - - public OptionSet(Converter localizer) { - this.localizer = localizer; - } - - Converter localizer; - - public Converter MessageLocalizer { - get { return localizer; } - } - - protected override string GetKeyForItem(Option item) { - if (item == null) - throw new ArgumentNullException("option"); - if (item.Names != null && item.Names.Length > 0) - return item.Names[0]; - // This should never happen, as it's invalid for Option to be - // constructed w/o any names. - throw new InvalidOperationException("Option has no names!"); - } - - [Obsolete("Use KeyedCollection.this[string]")] - protected Option GetOptionForName(string option) { - if (option == null) - throw new ArgumentNullException("option"); - try { - return base[option]; - } - catch (KeyNotFoundException) { - return null; - } - } - - protected override void InsertItem(int index, Option item) { - base.InsertItem(index, item); - AddImpl(item); - } - - protected override void RemoveItem(int index) { - base.RemoveItem(index); - Option p = Items[index]; - // KeyedCollection.RemoveItem() handles the 0th item - for (int i = 1; i < p.Names.Length; ++i) { - Dictionary.Remove(p.Names[i]); - } - } - - protected override void SetItem(int index, Option item) { - base.SetItem(index, item); - RemoveItem(index); - AddImpl(item); - } - - private void AddImpl(Option option) { - if (option == null) - throw new ArgumentNullException("option"); - List added = new List(option.Names.Length); - try { - // KeyedCollection.InsertItem/SetItem handle the 0th name. - for (int i = 1; i < option.Names.Length; ++i) { - Dictionary.Add(option.Names[i], option); - added.Add(option.Names[i]); - } - } - catch (Exception) { - foreach (string name in added) - Dictionary.Remove(name); - throw; - } - } - - public new OptionSet Add(Option option) { - base.Add(option); - return this; - } - - sealed class ActionOption : Option { - Action action; - - public ActionOption(string prototype, string description, int count, Action action) - : base(prototype, description, count) { - if (action == null) - throw new ArgumentNullException("action"); - this.action = action; - } - - protected override void OnParseComplete(OptionContext c) { - action(c.OptionValues); - } - } - - public OptionSet Add(string prototype, Action action) { - return Add(prototype, null, action); - } - - public OptionSet Add(string prototype, string description, Action action) { - if (action == null) - throw new ArgumentNullException("action"); - Option p = new ActionOption(prototype, description, 1, - delegate(OptionValueCollection v) { action(v[0]); }); - base.Add(p); - return this; - } - - public OptionSet Add(string prototype, OptionAction action) { - return Add(prototype, null, action); - } - - public OptionSet Add(string prototype, string description, OptionAction action) { - if (action == null) - throw new ArgumentNullException("action"); - Option p = new ActionOption(prototype, description, 2, - delegate(OptionValueCollection v) { action(v[0], v[1]); }); - base.Add(p); - return this; - } - - sealed class ActionOption : Option { - Action action; - - public ActionOption(string prototype, string description, Action action) - : base(prototype, description, 1) { - if (action == null) - throw new ArgumentNullException("action"); - this.action = action; - } - - protected override void OnParseComplete(OptionContext c) { - action(Parse(c.OptionValues[0], c)); - } - } - - sealed class ActionOption : Option { - OptionAction action; - - public ActionOption(string prototype, string description, OptionAction action) - : base(prototype, description, 2) { - if (action == null) - throw new ArgumentNullException("action"); - this.action = action; - } - - protected override void OnParseComplete(OptionContext c) { - action( - Parse(c.OptionValues[0], c), - Parse(c.OptionValues[1], c)); - } - } - - public OptionSet Add(string prototype, Action action) { - return Add(prototype, null, action); - } - - public OptionSet Add(string prototype, string description, Action action) { - return Add(new ActionOption(prototype, description, action)); - } - - public OptionSet Add(string prototype, OptionAction action) { - return Add(prototype, null, action); - } - - public OptionSet Add(string prototype, string description, OptionAction action) { - return Add(new ActionOption(prototype, description, action)); - } - - protected virtual OptionContext CreateOptionContext() { - return new OptionContext(this); - } - -#if LINQ - public List Parse (IEnumerable arguments) - { - bool process = true; - OptionContext c = CreateOptionContext (); - c.OptionIndex = -1; - var def = GetOptionForName ("<>"); - var unprocessed = - from argument in arguments - where ++c.OptionIndex >= 0 && (process || def != null) - ? process - ? argument == "--" - ? (process = false) - : !Parse (argument, c) - ? def != null - ? Unprocessed (null, def, c, argument) - : true - : false - : def != null - ? Unprocessed (null, def, c, argument) - : true - : true - select argument; - List r = unprocessed.ToList (); - if (c.Option != null) - c.Option.Invoke (c); - return r; - } -#else - public List Parse(IEnumerable arguments) { - OptionContext c = CreateOptionContext(); - c.OptionIndex = -1; - bool process = true; - List unprocessed = new List(); - Option def = Contains("<>") ? this["<>"] : null; - foreach (string argument in arguments) { - ++c.OptionIndex; - if (argument == "--") { - process = false; - continue; - } - if (!process) { - Unprocessed(unprocessed, def, c, argument); - continue; - } - if (!Parse(argument, c)) - Unprocessed(unprocessed, def, c, argument); - } - if (c.Option != null) - c.Option.Invoke(c); - return unprocessed; - } -#endif - - private static bool Unprocessed(ICollection extra, Option def, OptionContext c, string argument) { - if (def == null) { - extra.Add(argument); - return false; - } - c.OptionValues.Add(argument); - c.Option = def; - c.Option.Invoke(c); - return false; - } - - private readonly Regex ValueOption = new Regex( - @"^(?--|-|/)(?[^:=]+)((?[:=])(?.*))?$"); - - protected bool GetOptionParts(string argument, out string flag, out string name, out string sep, out string value) { - if (argument == null) - throw new ArgumentNullException("argument"); - - flag = name = sep = value = null; - Match m = ValueOption.Match(argument); - if (!m.Success) { - return false; - } - flag = m.Groups["flag"].Value; - name = m.Groups["name"].Value; - if (m.Groups["sep"].Success && m.Groups["value"].Success) { - sep = m.Groups["sep"].Value; - value = m.Groups["value"].Value; - } - return true; - } - - protected virtual bool Parse(string argument, OptionContext c) { - if (c.Option != null) { - ParseValue(argument, c); - return true; - } - - string f, n, s, v; - if (!GetOptionParts(argument, out f, out n, out s, out v)) - return false; - - Option p; - if (Contains(n)) { - p = this[n]; - c.OptionName = f + n; - c.Option = p; - switch (p.OptionValueType) { - case OptionValueType.None: - c.OptionValues.Add(n); - c.Option.Invoke(c); - break; - case OptionValueType.Optional: - case OptionValueType.Required: - ParseValue(v, c); - break; - } - return true; - } - // no match; is it a bool option? - if (ParseBool(argument, n, c)) - return true; - // is it a bundled option? - if (ParseBundledValue(f, string.Concat(n + s + v), c)) - return true; - - return false; - } - - private void ParseValue(string option, OptionContext c) { - if (option != null) - foreach (string o in c.Option.ValueSeparators != null - ? option.Split(c.Option.ValueSeparators, StringSplitOptions.None) - : new string[] { option }) { - c.OptionValues.Add(o); - } - if (c.OptionValues.Count == c.Option.MaxValueCount || - c.Option.OptionValueType == OptionValueType.Optional) - c.Option.Invoke(c); - else if (c.OptionValues.Count > c.Option.MaxValueCount) { - throw new OptionException(localizer(string.Format( - "Error: Found {0} option values when expecting {1}.", - c.OptionValues.Count, c.Option.MaxValueCount)), - c.OptionName); - } - } - - private bool ParseBool(string option, string n, OptionContext c) { - Option p; - string rn; - if (n.Length >= 1 && (n[n.Length - 1] == '+' || n[n.Length - 1] == '-') && - Contains((rn = n.Substring(0, n.Length - 1)))) { - p = this[rn]; - string v = n[n.Length - 1] == '+' ? option : null; - c.OptionName = option; - c.Option = p; - c.OptionValues.Add(v); - p.Invoke(c); - return true; - } - return false; - } - - private bool ParseBundledValue(string f, string n, OptionContext c) { - if (f != "-") - return false; - for (int i = 0; i < n.Length; ++i) { - Option p; - string opt = f + n[i].ToString(); - string rn = n[i].ToString(); - if (!Contains(rn)) { - if (i == 0) - return false; - throw new OptionException(string.Format(localizer( - "Cannot bundle unregistered option '{0}'."), opt), opt); - } - p = this[rn]; - switch (p.OptionValueType) { - case OptionValueType.None: - Invoke(c, opt, n, p); - break; - case OptionValueType.Optional: - case OptionValueType.Required: { - string v = n.Substring(i + 1); - c.Option = p; - c.OptionName = opt; - ParseValue(v.Length != 0 ? v : null, c); - return true; - } - default: - throw new InvalidOperationException("Unknown OptionValueType: " + p.OptionValueType); - } - } - return true; - } - - private static void Invoke(OptionContext c, string name, string value, Option option) { - c.OptionName = name; - c.Option = option; - c.OptionValues.Add(value); - option.Invoke(c); - } - - private const int OptionWidth = 29; - - public void WriteOptionDescriptions(TextWriter o) { - foreach (Option p in this) { - int written = 0; - if (!WriteOptionPrototype(o, p, ref written)) - continue; - - if (written < OptionWidth) - o.Write(new string(' ', OptionWidth - written)); - else { - o.WriteLine(); - o.Write(new string(' ', OptionWidth)); - } - - List lines = GetLines(localizer(GetDescription(p.Description))); - o.WriteLine(lines[0]); - string prefix = new string(' ', OptionWidth + 2); - for (int i = 1; i < lines.Count; ++i) { - o.Write(prefix); - o.WriteLine(lines[i]); - } - } - } - - bool WriteOptionPrototype(TextWriter o, Option p, ref int written) { - string[] names = p.Names; - - int i = GetNextOptionIndex(names, 0); - if (i == names.Length) - return false; - - if (names[i].Length == 1) { - Write(o, ref written, " -"); - Write(o, ref written, names[0]); - } - else { - Write(o, ref written, " --"); - Write(o, ref written, names[0]); - } - - for (i = GetNextOptionIndex(names, i + 1); - i < names.Length; i = GetNextOptionIndex(names, i + 1)) { - Write(o, ref written, ", "); - Write(o, ref written, names[i].Length == 1 ? "-" : "--"); - Write(o, ref written, names[i]); - } - - if (p.OptionValueType == OptionValueType.Optional || - p.OptionValueType == OptionValueType.Required) { - if (p.OptionValueType == OptionValueType.Optional) { - Write(o, ref written, localizer("[")); - } - Write(o, ref written, localizer("=" + GetArgumentName(0, p.MaxValueCount, p.Description))); - string sep = p.ValueSeparators != null && p.ValueSeparators.Length > 0 - ? p.ValueSeparators[0] - : " "; - for (int c = 1; c < p.MaxValueCount; ++c) { - Write(o, ref written, localizer(sep + GetArgumentName(c, p.MaxValueCount, p.Description))); - } - if (p.OptionValueType == OptionValueType.Optional) { - Write(o, ref written, localizer("]")); - } - } - return true; - } - - static int GetNextOptionIndex(string[] names, int i) { - while (i < names.Length && names[i] == "<>") { - ++i; - } - return i; - } - - static void Write(TextWriter o, ref int n, string s) { - n += s.Length; - o.Write(s); - } - - private static string GetArgumentName(int index, int maxIndex, string description) { - if (description == null) - return maxIndex == 1 ? "VALUE" : "VALUE" + (index + 1); - string[] nameStart; - if (maxIndex == 1) - nameStart = new string[] { "{0:", "{" }; - else - nameStart = new string[] { "{" + index + ":" }; - for (int i = 0; i < nameStart.Length; ++i) { - int start, j = 0; - do { - start = description.IndexOf(nameStart[i], j); - } while (start >= 0 && j != 0 ? description[j++ - 1] == '{' : false); - if (start == -1) - continue; - int end = description.IndexOf("}", start); - if (end == -1) - continue; - return description.Substring(start + nameStart[i].Length, end - start - nameStart[i].Length); - } - return maxIndex == 1 ? "VALUE" : "VALUE" + (index + 1); - } - - private static string GetDescription(string description) { - if (description == null) - return string.Empty; - StringBuilder sb = new StringBuilder(description.Length); - int start = -1; - for (int i = 0; i < description.Length; ++i) { - switch (description[i]) { - case '{': - if (i == start) { - sb.Append('{'); - start = -1; - } - else if (start < 0) - start = i + 1; - break; - case '}': - if (start < 0) { - if ((i + 1) == description.Length || description[i + 1] != '}') - throw new InvalidOperationException("Invalid option description: " + description); - ++i; - sb.Append("}"); - } - else { - sb.Append(description.Substring(start, i - start)); - start = -1; - } - break; - case ':': - if (start < 0) - goto default; - start = i + 1; - break; - default: - if (start < 0) - sb.Append(description[i]); - break; - } - } - return sb.ToString(); - } - - private static List GetLines(string description) { - List lines = new List(); - if (string.IsNullOrEmpty(description)) { - lines.Add(string.Empty); - return lines; - } - int length = 80 - OptionWidth - 2; - int start = 0, end; - do { - end = GetLineEnd(start, length, description); - bool cont = false; - if (end < description.Length) { - char c = description[end]; - if (c == '-' || (char.IsWhiteSpace(c) && c != '\n')) - ++end; - else if (c != '\n') { - cont = true; - --end; - } - } - lines.Add(description.Substring(start, end - start)); - if (cont) { - lines[lines.Count - 1] += "-"; - } - start = end; - if (start < description.Length && description[start] == '\n') - ++start; - } while (end < description.Length); - return lines; - } - - private static int GetLineEnd(int start, int length, string description) { - int end = Math.Min(start + length, description.Length); - int sep = -1; - for (int i = start; i < end; ++i) { - switch (description[i]) { - case ' ': - case '\t': - case '\v': - case '-': - case ',': - case '.': - case ';': - sep = i; - break; - case '\n': - return i; - } - } - if (sep == -1 || end == description.Length) - return end; - return sep; - } - } -} - +// +// Options.cs (version 0.2.1) +// +// Authors: +// Jonathan Pryor +// +// Copyright (C) 2008 Novell (http://www.novell.com) +// +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to +// permit persons to whom the Software is furnished to do so, subject to +// the following conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// + +// Compile With: +// gmcs -debug+ -r:System.Core Options.cs -o:NDesk.Options.dll +// gmcs -debug+ -d:LINQ -r:System.Core Options.cs -o:NDesk.Options.dll +// +// The LINQ version just changes the implementation of +// OptionSet.Parse(IEnumerable), and confers no semantic changes. + +// +// A Getopt::Long-inspired option parsing library for C#. +// +// NDesk.Options.OptionSet is built upon a key/value table, where the +// key is a option format string and the value is a delegate that is +// invoked when the format string is matched. +// +// Option format strings: +// Regex-like BNF Grammar: +// name: .+ +// type: [=:] +// sep: ( [^{}]+ | '{' .+ '}' )? +// aliases: ( name type sep ) ( '|' name type sep )* +// +// Each '|'-delimited name is an alias for the associated action. If the +// format string ends in a '=', it has a required value. If the format +// string ends in a ':', it has an optional value. If neither '=' or ':' +// is present, no value is supported. `=' or `:' need only be defined on one +// alias, but if they are provided on more than one they must be consistent. +// +// Each alias portion may also end with a "key/value separator", which is used +// to split option values if the option accepts > 1 value. If not specified, +// it defaults to '=' and ':'. If specified, it can be any character except +// '{' and '}' OR the *string* between '{' and '}'. If no separator should be +// used (i.e. the separate values should be distinct arguments), then "{}" +// should be used as the separator. +// +// Options are extracted either from the current option by looking for +// the option name followed by an '=' or ':', or is taken from the +// following option IFF: +// - The current option does not contain a '=' or a ':' +// - The current option requires a value (i.e. not a Option type of ':') +// +// The `name' used in the option format string does NOT include any leading +// option indicator, such as '-', '--', or '/'. All three of these are +// permitted/required on any named option. +// +// Option bundling is permitted so long as: +// - '-' is used to start the option group +// - all of the bundled options are a single character +// - at most one of the bundled options accepts a value, and the value +// provided starts from the next character to the end of the string. +// +// This allows specifying '-a -b -c' as '-abc', and specifying '-D name=value' +// as '-Dname=value'. +// +// Option processing is disabled by specifying "--". All options after "--" +// are returned by OptionSet.Parse() unchanged and unprocessed. +// +// Unprocessed options are returned from OptionSet.Parse(). +// +// Examples: +// int verbose = 0; +// OptionSet p = new OptionSet () +// .Add ("v", v => ++verbose) +// .Add ("name=|value=", v => Console.WriteLine (v)); +// p.Parse (new string[]{"-v", "--v", "/v", "-name=A", "/name", "B", "extra"}); +// +// The above would parse the argument string array, and would invoke the +// lambda expression three times, setting `verbose' to 3 when complete. +// It would also print out "A" and "B" to standard output. +// The returned array would contain the string "extra". +// +// C# 3.0 collection initializers are supported and encouraged: +// var p = new OptionSet () { +// { "h|?|help", v => ShowHelp () }, +// }; +// +// System.ComponentModel.TypeConverter is also supported, allowing the use of +// custom data types in the callback type; TypeConverter.ConvertFromString() +// is used to convert the value option to an instance of the specified +// type: +// +// var p = new OptionSet () { +// { "foo=", (Foo f) => Console.WriteLine (f.ToString ()) }, +// }; +// +// Random other tidbits: +// - Boolean options (those w/o '=' or ':' in the option format string) +// are explicitly enabled if they are followed with '+', and explicitly +// disabled if they are followed with '-': +// string a = null; +// var p = new OptionSet () { +// { "a", s => a = s }, +// }; +// p.Parse (new string[]{"-a"}); // sets v != null +// p.Parse (new string[]{"-a+"}); // sets v != null +// p.Parse (new string[]{"-a-"}); // sets v == null +// + +using System; +using System.Collections; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.ComponentModel; +using System.Globalization; +using System.IO; +using System.Runtime.Serialization; +using System.Security.Permissions; +using System.Text; +using System.Text.RegularExpressions; + +#if LINQ +using System.Linq; +#endif + +#if TEST +using NDesk.Options; +#endif + +namespace NDesk.Options { + + public class OptionValueCollection : IList, IList { + + List values = new List(); + OptionContext c; + + internal OptionValueCollection(OptionContext c) { + this.c = c; + } + + #region ICollection + void ICollection.CopyTo(Array array, int index) { (values as ICollection).CopyTo(array, index); } + bool ICollection.IsSynchronized { get { return (values as ICollection).IsSynchronized; } } + object ICollection.SyncRoot { get { return (values as ICollection).SyncRoot; } } + #endregion + + #region ICollection + public void Add(string item) { values.Add(item); } + public void Clear() { values.Clear(); } + public bool Contains(string item) { return values.Contains(item); } + public void CopyTo(string[] array, int arrayIndex) { values.CopyTo(array, arrayIndex); } + public bool Remove(string item) { return values.Remove(item); } + public int Count { get { return values.Count; } } + public bool IsReadOnly { get { return false; } } + #endregion + + #region IEnumerable + IEnumerator IEnumerable.GetEnumerator() { return values.GetEnumerator(); } + #endregion + + #region IEnumerable + public IEnumerator GetEnumerator() { return values.GetEnumerator(); } + #endregion + + #region IList + int IList.Add(object value) { return (values as IList).Add(value); } + bool IList.Contains(object value) { return (values as IList).Contains(value); } + int IList.IndexOf(object value) { return (values as IList).IndexOf(value); } + void IList.Insert(int index, object value) { (values as IList).Insert(index, value); } + void IList.Remove(object value) { (values as IList).Remove(value); } + void IList.RemoveAt(int index) { (values as IList).RemoveAt(index); } + bool IList.IsFixedSize { get { return false; } } + object IList.this[int index] { get { return this[index]; } set { (values as IList)[index] = value; } } + #endregion + + #region IList + public int IndexOf(string item) { return values.IndexOf(item); } + public void Insert(int index, string item) { values.Insert(index, item); } + public void RemoveAt(int index) { values.RemoveAt(index); } + + private void AssertValid(int index) { + if (c.Option == null) + throw new InvalidOperationException("OptionContext.Option is null."); + if (index >= c.Option.MaxValueCount) + throw new ArgumentOutOfRangeException("index"); + if (c.Option.OptionValueType == OptionValueType.Required && + index >= values.Count) + throw new OptionException(string.Format( + c.OptionSet.MessageLocalizer("Missing required value for option '{0}'."), c.OptionName), + c.OptionName); + } + + public string this[int index] { + get { + AssertValid(index); + return index >= values.Count ? null : values[index]; + } + set { + values[index] = value; + } + } + #endregion + + public List ToList() { + return new List(values); + } + + public string[] ToArray() { + return values.ToArray(); + } + + public override string ToString() { + return string.Join(", ", values.ToArray()); + } + } + + public class OptionContext { + private Option option; + private string name; + private int index; + private OptionSet set; + private OptionValueCollection c; + + public OptionContext(OptionSet set) { + this.set = set; + this.c = new OptionValueCollection(this); + } + + public Option Option { + get { return option; } + set { option = value; } + } + + public string OptionName { + get { return name; } + set { name = value; } + } + + public int OptionIndex { + get { return index; } + set { index = value; } + } + + public OptionSet OptionSet { + get { return set; } + } + + public OptionValueCollection OptionValues { + get { return c; } + } + } + + public enum OptionValueType { + None, + Optional, + Required, + } + + public abstract class Option { + string prototype, description; + string[] names; + OptionValueType type; + int count; + string[] separators; + + protected Option(string prototype, string description) + : this(prototype, description, 1) { + } + + protected Option(string prototype, string description, int maxValueCount) { + if (prototype == null) + throw new ArgumentNullException("prototype"); + if (prototype.Length == 0) + throw new ArgumentException("Cannot be the empty string.", "prototype"); + if (maxValueCount < 0) + throw new ArgumentOutOfRangeException("maxValueCount"); + + this.prototype = prototype; + this.names = prototype.Split('|'); + this.description = description; + this.count = maxValueCount; + this.type = ParsePrototype(); + + if (this.count == 0 && type != OptionValueType.None) + throw new ArgumentException( + "Cannot provide maxValueCount of 0 for OptionValueType.Required or " + + "OptionValueType.Optional.", + "maxValueCount"); + if (this.type == OptionValueType.None && maxValueCount > 1) + throw new ArgumentException( + string.Format("Cannot provide maxValueCount of {0} for OptionValueType.None.", maxValueCount), + "maxValueCount"); + if (Array.IndexOf(names, "<>") >= 0 && + ((names.Length == 1 && this.type != OptionValueType.None) || + (names.Length > 1 && this.MaxValueCount > 1))) + throw new ArgumentException( + "The default option handler '<>' cannot require values.", + "prototype"); + } + + public string Prototype { get { return prototype; } } + public string Description { get { return description; } } + public OptionValueType OptionValueType { get { return type; } } + public int MaxValueCount { get { return count; } } + + public string[] GetNames() { + return (string[])names.Clone(); + } + + public string[] GetValueSeparators() { + if (separators == null) + return new string[0]; + return (string[])separators.Clone(); + } + + protected static T Parse(string value, OptionContext c) { + TypeConverter conv = TypeDescriptor.GetConverter(typeof(T)); + T t = default(T); + try { + if (value != null) + t = (T)conv.ConvertFromString(value); + } + catch (Exception e) { + throw new OptionException( + string.Format( + c.OptionSet.MessageLocalizer("Could not convert string `{0}' to type {1} for option `{2}'."), + value, typeof(T).Name, c.OptionName), + c.OptionName, e); + } + return t; + } + + internal string[] Names { get { return names; } } + internal string[] ValueSeparators { get { return separators; } } + + static readonly char[] NameTerminator = new char[] { '=', ':' }; + + private OptionValueType ParsePrototype() { + char type = '\0'; + List seps = new List(); + for (int i = 0; i < names.Length; ++i) { + string name = names[i]; + if (name.Length == 0) + throw new ArgumentException("Empty option names are not supported.", "prototype"); + + int end = name.IndexOfAny(NameTerminator); + if (end == -1) + continue; + names[i] = name.Substring(0, end); + if (type == '\0' || type == name[end]) + type = name[end]; + else + throw new ArgumentException( + string.Format("Conflicting option types: '{0}' vs. '{1}'.", type, name[end]), + "prototype"); + AddSeparators(name, end, seps); + } + + if (type == '\0') + return OptionValueType.None; + + if (count <= 1 && seps.Count != 0) + throw new ArgumentException( + string.Format("Cannot provide key/value separators for Options taking {0} value(s).", count), + "prototype"); + if (count > 1) { + if (seps.Count == 0) + this.separators = new string[] { ":", "=" }; + else if (seps.Count == 1 && seps[0].Length == 0) + this.separators = null; + else + this.separators = seps.ToArray(); + } + + return type == '=' ? OptionValueType.Required : OptionValueType.Optional; + } + + private static void AddSeparators(string name, int end, ICollection seps) { + int start = -1; + for (int i = end + 1; i < name.Length; ++i) { + switch (name[i]) { + case '{': + if (start != -1) + throw new ArgumentException( + string.Format("Ill-formed name/value separator found in \"{0}\".", name), + "prototype"); + start = i + 1; + break; + case '}': + if (start == -1) + throw new ArgumentException( + string.Format("Ill-formed name/value separator found in \"{0}\".", name), + "prototype"); + seps.Add(name.Substring(start, i - start)); + start = -1; + break; + default: + if (start == -1) + seps.Add(name[i].ToString()); + break; + } + } + if (start != -1) + throw new ArgumentException( + string.Format("Ill-formed name/value separator found in \"{0}\".", name), + "prototype"); + } + + public void Invoke(OptionContext c) { + OnParseComplete(c); + c.OptionName = null; + c.Option = null; + c.OptionValues.Clear(); + } + + protected abstract void OnParseComplete(OptionContext c); + + public override string ToString() { + return Prototype; + } + } + + [Serializable] + public class OptionException : Exception { + private string option; + + public OptionException() { + } + + public OptionException(string message, string optionName) + : base(message) { + this.option = optionName; + } + + public OptionException(string message, string optionName, Exception innerException) + : base(message, innerException) { + this.option = optionName; + } + + protected OptionException(SerializationInfo info, StreamingContext context) + : base(info, context) { + this.option = info.GetString("OptionName"); + } + + public string OptionName { + get { return this.option; } + } + + [SecurityPermission(SecurityAction.LinkDemand, SerializationFormatter = true)] + public override void GetObjectData(SerializationInfo info, StreamingContext context) { + base.GetObjectData(info, context); + info.AddValue("OptionName", option); + } + } + + public delegate void OptionAction(TKey key, TValue value); + + public class OptionSet : KeyedCollection { + public OptionSet() + : this(delegate(string f) { return f; }) { + } + + public OptionSet(Converter localizer) { + this.localizer = localizer; + } + + Converter localizer; + + public Converter MessageLocalizer { + get { return localizer; } + } + + protected override string GetKeyForItem(Option item) { + if (item == null) + throw new ArgumentNullException("option"); + if (item.Names != null && item.Names.Length > 0) + return item.Names[0]; + // This should never happen, as it's invalid for Option to be + // constructed w/o any names. + throw new InvalidOperationException("Option has no names!"); + } + + [Obsolete("Use KeyedCollection.this[string]")] + protected Option GetOptionForName(string option) { + if (option == null) + throw new ArgumentNullException("option"); + try { + return base[option]; + } + catch (KeyNotFoundException) { + return null; + } + } + + protected override void InsertItem(int index, Option item) { + base.InsertItem(index, item); + AddImpl(item); + } + + protected override void RemoveItem(int index) { + base.RemoveItem(index); + Option p = Items[index]; + // KeyedCollection.RemoveItem() handles the 0th item + for (int i = 1; i < p.Names.Length; ++i) { + Dictionary.Remove(p.Names[i]); + } + } + + protected override void SetItem(int index, Option item) { + base.SetItem(index, item); + RemoveItem(index); + AddImpl(item); + } + + private void AddImpl(Option option) { + if (option == null) + throw new ArgumentNullException("option"); + List added = new List(option.Names.Length); + try { + // KeyedCollection.InsertItem/SetItem handle the 0th name. + for (int i = 1; i < option.Names.Length; ++i) { + Dictionary.Add(option.Names[i], option); + added.Add(option.Names[i]); + } + } + catch (Exception) { + foreach (string name in added) + Dictionary.Remove(name); + throw; + } + } + + public new OptionSet Add(Option option) { + base.Add(option); + return this; + } + + sealed class ActionOption : Option { + Action action; + + public ActionOption(string prototype, string description, int count, Action action) + : base(prototype, description, count) { + if (action == null) + throw new ArgumentNullException("action"); + this.action = action; + } + + protected override void OnParseComplete(OptionContext c) { + action(c.OptionValues); + } + } + + public OptionSet Add(string prototype, Action action) { + return Add(prototype, null, action); + } + + public OptionSet Add(string prototype, string description, Action action) { + if (action == null) + throw new ArgumentNullException("action"); + Option p = new ActionOption(prototype, description, 1, + delegate(OptionValueCollection v) { action(v[0]); }); + base.Add(p); + return this; + } + + public OptionSet Add(string prototype, OptionAction action) { + return Add(prototype, null, action); + } + + public OptionSet Add(string prototype, string description, OptionAction action) { + if (action == null) + throw new ArgumentNullException("action"); + Option p = new ActionOption(prototype, description, 2, + delegate(OptionValueCollection v) { action(v[0], v[1]); }); + base.Add(p); + return this; + } + + sealed class ActionOption : Option { + Action action; + + public ActionOption(string prototype, string description, Action action) + : base(prototype, description, 1) { + if (action == null) + throw new ArgumentNullException("action"); + this.action = action; + } + + protected override void OnParseComplete(OptionContext c) { + action(Parse(c.OptionValues[0], c)); + } + } + + sealed class ActionOption : Option { + OptionAction action; + + public ActionOption(string prototype, string description, OptionAction action) + : base(prototype, description, 2) { + if (action == null) + throw new ArgumentNullException("action"); + this.action = action; + } + + protected override void OnParseComplete(OptionContext c) { + action( + Parse(c.OptionValues[0], c), + Parse(c.OptionValues[1], c)); + } + } + + public OptionSet Add(string prototype, Action action) { + return Add(prototype, null, action); + } + + public OptionSet Add(string prototype, string description, Action action) { + return Add(new ActionOption(prototype, description, action)); + } + + public OptionSet Add(string prototype, OptionAction action) { + return Add(prototype, null, action); + } + + public OptionSet Add(string prototype, string description, OptionAction action) { + return Add(new ActionOption(prototype, description, action)); + } + + protected virtual OptionContext CreateOptionContext() { + return new OptionContext(this); + } + +#if LINQ + public List Parse (IEnumerable arguments) + { + bool process = true; + OptionContext c = CreateOptionContext (); + c.OptionIndex = -1; + var def = GetOptionForName ("<>"); + var unprocessed = + from argument in arguments + where ++c.OptionIndex >= 0 && (process || def != null) + ? process + ? argument == "--" + ? (process = false) + : !Parse (argument, c) + ? def != null + ? Unprocessed (null, def, c, argument) + : true + : false + : def != null + ? Unprocessed (null, def, c, argument) + : true + : true + select argument; + List r = unprocessed.ToList (); + if (c.Option != null) + c.Option.Invoke (c); + return r; + } +#else + public List Parse(IEnumerable arguments) { + OptionContext c = CreateOptionContext(); + c.OptionIndex = -1; + bool process = true; + List unprocessed = new List(); + Option def = Contains("<>") ? this["<>"] : null; + foreach (string argument in arguments) { + ++c.OptionIndex; + if (argument == "--") { + process = false; + continue; + } + if (!process) { + Unprocessed(unprocessed, def, c, argument); + continue; + } + if (!Parse(argument, c)) + Unprocessed(unprocessed, def, c, argument); + } + if (c.Option != null) + c.Option.Invoke(c); + return unprocessed; + } +#endif + + private static bool Unprocessed(ICollection extra, Option def, OptionContext c, string argument) { + if (def == null) { + extra.Add(argument); + return false; + } + c.OptionValues.Add(argument); + c.Option = def; + c.Option.Invoke(c); + return false; + } + + private readonly Regex ValueOption = new Regex( + @"^(?--|-|/)(?[^:=]+)((?[:=])(?.*))?$"); + + protected bool GetOptionParts(string argument, out string flag, out string name, out string sep, out string value) { + if (argument == null) + throw new ArgumentNullException("argument"); + + flag = name = sep = value = null; + Match m = ValueOption.Match(argument); + if (!m.Success) { + return false; + } + flag = m.Groups["flag"].Value; + name = m.Groups["name"].Value; + if (m.Groups["sep"].Success && m.Groups["value"].Success) { + sep = m.Groups["sep"].Value; + value = m.Groups["value"].Value; + } + return true; + } + + protected virtual bool Parse(string argument, OptionContext c) { + if (c.Option != null) { + ParseValue(argument, c); + return true; + } + + string f, n, s, v; + if (!GetOptionParts(argument, out f, out n, out s, out v)) + return false; + + Option p; + if (Contains(n)) { + p = this[n]; + c.OptionName = f + n; + c.Option = p; + switch (p.OptionValueType) { + case OptionValueType.None: + c.OptionValues.Add(n); + c.Option.Invoke(c); + break; + case OptionValueType.Optional: + case OptionValueType.Required: + ParseValue(v, c); + break; + } + return true; + } + // no match; is it a bool option? + if (ParseBool(argument, n, c)) + return true; + // is it a bundled option? + if (ParseBundledValue(f, string.Concat(n + s + v), c)) + return true; + + return false; + } + + private void ParseValue(string option, OptionContext c) { + if (option != null) + foreach (string o in c.Option.ValueSeparators != null + ? option.Split(c.Option.ValueSeparators, StringSplitOptions.None) + : new string[] { option }) { + c.OptionValues.Add(o); + } + if (c.OptionValues.Count == c.Option.MaxValueCount || + c.Option.OptionValueType == OptionValueType.Optional) + c.Option.Invoke(c); + else if (c.OptionValues.Count > c.Option.MaxValueCount) { + throw new OptionException(localizer(string.Format( + "Error: Found {0} option values when expecting {1}.", + c.OptionValues.Count, c.Option.MaxValueCount)), + c.OptionName); + } + } + + private bool ParseBool(string option, string n, OptionContext c) { + Option p; + string rn; + if (n.Length >= 1 && (n[n.Length - 1] == '+' || n[n.Length - 1] == '-') && + Contains((rn = n.Substring(0, n.Length - 1)))) { + p = this[rn]; + string v = n[n.Length - 1] == '+' ? option : null; + c.OptionName = option; + c.Option = p; + c.OptionValues.Add(v); + p.Invoke(c); + return true; + } + return false; + } + + private bool ParseBundledValue(string f, string n, OptionContext c) { + if (f != "-") + return false; + for (int i = 0; i < n.Length; ++i) { + Option p; + string opt = f + n[i].ToString(); + string rn = n[i].ToString(); + if (!Contains(rn)) { + if (i == 0) + return false; + throw new OptionException(string.Format(localizer( + "Cannot bundle unregistered option '{0}'."), opt), opt); + } + p = this[rn]; + switch (p.OptionValueType) { + case OptionValueType.None: + Invoke(c, opt, n, p); + break; + case OptionValueType.Optional: + case OptionValueType.Required: { + string v = n.Substring(i + 1); + c.Option = p; + c.OptionName = opt; + ParseValue(v.Length != 0 ? v : null, c); + return true; + } + default: + throw new InvalidOperationException("Unknown OptionValueType: " + p.OptionValueType); + } + } + return true; + } + + private static void Invoke(OptionContext c, string name, string value, Option option) { + c.OptionName = name; + c.Option = option; + c.OptionValues.Add(value); + option.Invoke(c); + } + + private const int OptionWidth = 29; + + public void WriteOptionDescriptions(TextWriter o) { + foreach (Option p in this) { + int written = 0; + if (!WriteOptionPrototype(o, p, ref written)) + continue; + + if (written < OptionWidth) + o.Write(new string(' ', OptionWidth - written)); + else { + o.WriteLine(); + o.Write(new string(' ', OptionWidth)); + } + + List lines = GetLines(localizer(GetDescription(p.Description))); + o.WriteLine(lines[0]); + string prefix = new string(' ', OptionWidth + 2); + for (int i = 1; i < lines.Count; ++i) { + o.Write(prefix); + o.WriteLine(lines[i]); + } + } + } + + bool WriteOptionPrototype(TextWriter o, Option p, ref int written) { + string[] names = p.Names; + + int i = GetNextOptionIndex(names, 0); + if (i == names.Length) + return false; + + if (names[i].Length == 1) { + Write(o, ref written, " -"); + Write(o, ref written, names[0]); + } + else { + Write(o, ref written, " --"); + Write(o, ref written, names[0]); + } + + for (i = GetNextOptionIndex(names, i + 1); + i < names.Length; i = GetNextOptionIndex(names, i + 1)) { + Write(o, ref written, ", "); + Write(o, ref written, names[i].Length == 1 ? "-" : "--"); + Write(o, ref written, names[i]); + } + + if (p.OptionValueType == OptionValueType.Optional || + p.OptionValueType == OptionValueType.Required) { + if (p.OptionValueType == OptionValueType.Optional) { + Write(o, ref written, localizer("[")); + } + Write(o, ref written, localizer("=" + GetArgumentName(0, p.MaxValueCount, p.Description))); + string sep = p.ValueSeparators != null && p.ValueSeparators.Length > 0 + ? p.ValueSeparators[0] + : " "; + for (int c = 1; c < p.MaxValueCount; ++c) { + Write(o, ref written, localizer(sep + GetArgumentName(c, p.MaxValueCount, p.Description))); + } + if (p.OptionValueType == OptionValueType.Optional) { + Write(o, ref written, localizer("]")); + } + } + return true; + } + + static int GetNextOptionIndex(string[] names, int i) { + while (i < names.Length && names[i] == "<>") { + ++i; + } + return i; + } + + static void Write(TextWriter o, ref int n, string s) { + n += s.Length; + o.Write(s); + } + + private static string GetArgumentName(int index, int maxIndex, string description) { + if (description == null) + return maxIndex == 1 ? "VALUE" : "VALUE" + (index + 1); + string[] nameStart; + if (maxIndex == 1) + nameStart = new string[] { "{0:", "{" }; + else + nameStart = new string[] { "{" + index + ":" }; + for (int i = 0; i < nameStart.Length; ++i) { + int start, j = 0; + do { + start = description.IndexOf(nameStart[i], j); + } while (start >= 0 && j != 0 ? description[j++ - 1] == '{' : false); + if (start == -1) + continue; + int end = description.IndexOf("}", start); + if (end == -1) + continue; + return description.Substring(start + nameStart[i].Length, end - start - nameStart[i].Length); + } + return maxIndex == 1 ? "VALUE" : "VALUE" + (index + 1); + } + + private static string GetDescription(string description) { + if (description == null) + return string.Empty; + StringBuilder sb = new StringBuilder(description.Length); + int start = -1; + for (int i = 0; i < description.Length; ++i) { + switch (description[i]) { + case '{': + if (i == start) { + sb.Append('{'); + start = -1; + } + else if (start < 0) + start = i + 1; + break; + case '}': + if (start < 0) { + if ((i + 1) == description.Length || description[i + 1] != '}') + throw new InvalidOperationException("Invalid option description: " + description); + ++i; + sb.Append("}"); + } + else { + sb.Append(description.Substring(start, i - start)); + start = -1; + } + break; + case ':': + if (start < 0) + goto default; + start = i + 1; + break; + default: + if (start < 0) + sb.Append(description[i]); + break; + } + } + return sb.ToString(); + } + + private static List GetLines(string description) { + List lines = new List(); + if (string.IsNullOrEmpty(description)) { + lines.Add(string.Empty); + return lines; + } + int length = 80 - OptionWidth - 2; + int start = 0, end; + do { + end = GetLineEnd(start, length, description); + bool cont = false; + if (end < description.Length) { + char c = description[end]; + if (c == '-' || (char.IsWhiteSpace(c) && c != '\n')) + ++end; + else if (c != '\n') { + cont = true; + --end; + } + } + lines.Add(description.Substring(start, end - start)); + if (cont) { + lines[lines.Count - 1] += "-"; + } + start = end; + if (start < description.Length && description[start] == '\n') + ++start; + } while (end < description.Length); + return lines; + } + + private static int GetLineEnd(int start, int length, string description) { + int end = Math.Min(start + length, description.Length); + int sep = -1; + for (int i = start; i < end; ++i) { + switch (description[i]) { + case ' ': + case '\t': + case '\v': + case '-': + case ',': + case '.': + case ';': + sep = i; + break; + case '\n': + return i; + } + } + if (sep == -1 || end == description.Length) + return end; + return sep; + } + } +} + diff --git a/OnTopReplica/Native/CommonControls.cs b/src/OnTopReplica/Native/CommonControls.cs similarity index 96% rename from OnTopReplica/Native/CommonControls.cs rename to src/OnTopReplica/Native/CommonControls.cs index bf2123c..b223225 100644 --- a/OnTopReplica/Native/CommonControls.cs +++ b/src/OnTopReplica/Native/CommonControls.cs @@ -1,30 +1,30 @@ -using System; -using System.Collections.Generic; -using System.Text; -using System.Runtime.InteropServices; - -namespace OnTopReplica.Native { - public static class CommonControls { - - [DllImport("comctl32.dll", EntryPoint = "InitCommonControlsEx", CallingConvention = CallingConvention.StdCall)] - static extern bool InitCommonControlsEx(ref INITCOMMONCONTROLSEX iccex); - - const int ICC_STANDARD_CLASSES = 0x00004000; - const int ICC_WIN95_CLASSES = 0x000000FF; - - public static bool InitStandard() { - INITCOMMONCONTROLSEX ex = new INITCOMMONCONTROLSEX(); - ex.dwSize = 8; - ex.dwICC = ICC_STANDARD_CLASSES | ICC_WIN95_CLASSES; - - return InitCommonControlsEx(ref ex); - } - - } - - struct INITCOMMONCONTROLSEX { - public int dwSize; - public int dwICC; - } - -} +using System; +using System.Collections.Generic; +using System.Text; +using System.Runtime.InteropServices; + +namespace OnTopReplica.Native { + public static class CommonControls { + + [DllImport("comctl32.dll", EntryPoint = "InitCommonControlsEx", CallingConvention = CallingConvention.StdCall)] + static extern bool InitCommonControlsEx(ref INITCOMMONCONTROLSEX iccex); + + const int ICC_STANDARD_CLASSES = 0x00004000; + const int ICC_WIN95_CLASSES = 0x000000FF; + + public static bool InitStandard() { + INITCOMMONCONTROLSEX ex = new INITCOMMONCONTROLSEX(); + ex.dwSize = 8; + ex.dwICC = ICC_STANDARD_CLASSES | ICC_WIN95_CLASSES; + + return InitCommonControlsEx(ref ex); + } + + } + + struct INITCOMMONCONTROLSEX { + public int dwSize; + public int dwICC; + } + +} diff --git a/OnTopReplica/Native/ErrorMethods.cs b/src/OnTopReplica/Native/ErrorMethods.cs similarity index 97% rename from OnTopReplica/Native/ErrorMethods.cs rename to src/OnTopReplica/Native/ErrorMethods.cs index f1863eb..06ec99b 100644 --- a/OnTopReplica/Native/ErrorMethods.cs +++ b/src/OnTopReplica/Native/ErrorMethods.cs @@ -1,37 +1,37 @@ -using System; -using System.Collections.Generic; -using System.Text; -using System.Runtime.InteropServices; - -namespace OnTopReplica.Native { - /// - /// Common Win32 error handling methods. - /// - static class ErrorMethods { - - [DllImport("kernel32.dll")] - static extern uint FormatMessage(uint dwFlags, IntPtr lpSource, - int dwMessageId, uint dwLanguageId, [Out] StringBuilder lpBuffer, - uint nSize, IntPtr Arguments); - - /// - /// Gets a string representation of a Win32 error code. - /// - /// ID of the Win32 error code. - /// String representation of the error. - public static string GetErrorMessage(int msgCode) { - var sb = new StringBuilder(300); - FormatMessage((uint)(0x00001000), IntPtr.Zero, msgCode, 0, sb, 299, IntPtr.Zero); - return sb.ToString(); - } - - /// - /// Gets a string representation of the last Win32 error on this thread. - /// - public static string GetLastErrorMessage() { - int errorCode = Marshal.GetLastWin32Error(); - return GetErrorMessage(errorCode); - } - - } -} +using System; +using System.Collections.Generic; +using System.Text; +using System.Runtime.InteropServices; + +namespace OnTopReplica.Native { + /// + /// Common Win32 error handling methods. + /// + static class ErrorMethods { + + [DllImport("kernel32.dll")] + static extern uint FormatMessage(uint dwFlags, IntPtr lpSource, + int dwMessageId, uint dwLanguageId, [Out] StringBuilder lpBuffer, + uint nSize, IntPtr Arguments); + + /// + /// Gets a string representation of a Win32 error code. + /// + /// ID of the Win32 error code. + /// String representation of the error. + public static string GetErrorMessage(int msgCode) { + var sb = new StringBuilder(300); + FormatMessage((uint)(0x00001000), IntPtr.Zero, msgCode, 0, sb, 299, IntPtr.Zero); + return sb.ToString(); + } + + /// + /// Gets a string representation of the last Win32 error on this thread. + /// + public static string GetLastErrorMessage() { + int errorCode = Marshal.GetLastWin32Error(); + return GetErrorMessage(errorCode); + } + + } +} diff --git a/OnTopReplica/Native/FilesystemMethods.cs b/src/OnTopReplica/Native/FilesystemMethods.cs similarity index 97% rename from OnTopReplica/Native/FilesystemMethods.cs rename to src/OnTopReplica/Native/FilesystemMethods.cs index d48d741..a8063e6 100644 --- a/OnTopReplica/Native/FilesystemMethods.cs +++ b/src/OnTopReplica/Native/FilesystemMethods.cs @@ -1,51 +1,51 @@ -using System; -using System.Collections.Generic; -using System.Text; -using System.Runtime.InteropServices; -using System.IO; - -namespace OnTopReplica.Native { - - /// - /// Native methods for filesystem interop. - /// - static class FilesystemMethods { - - /// - /// Gets the path to the current user's download path. - /// - /// - /// Code taken from http://stackoverflow.com/questions/3795023/downloads-folder-not-special-enough - /// - public static string DownloadsPath { - get { - string path = null; - - //Requires Vista or superior - if (Environment.OSVersion.Version.Major >= 6) { - IntPtr pathPtr; - Guid folderId = FolderDownloads; - int hr = SHGetKnownFolderPath(ref folderId, 0, IntPtr.Zero, out pathPtr); - if (hr == 0) { - path = Marshal.PtrToStringUni(pathPtr); - Marshal.FreeCoTaskMem(pathPtr); - return path; - } - } - - //Fallback code - path = Path.GetDirectoryName(Environment.GetFolderPath(Environment.SpecialFolder.Personal)); - path = Path.Combine(path, "Downloads"); - return path; - } - } - - - static readonly Guid FolderDownloads = new Guid("374DE290-123F-4565-9164-39C4925E467B"); - - [DllImport("shell32.dll", CharSet = CharSet.Auto)] - private static extern int SHGetKnownFolderPath(ref Guid id, int flags, IntPtr token, out IntPtr path); - - } - -} +using System; +using System.Collections.Generic; +using System.Text; +using System.Runtime.InteropServices; +using System.IO; + +namespace OnTopReplica.Native { + + /// + /// Native methods for filesystem interop. + /// + static class FilesystemMethods { + + /// + /// Gets the path to the current user's download path. + /// + /// + /// Code taken from http://stackoverflow.com/questions/3795023/downloads-folder-not-special-enough + /// + public static string DownloadsPath { + get { + string path = null; + + //Requires Vista or superior + if (Environment.OSVersion.Version.Major >= 6) { + IntPtr pathPtr; + Guid folderId = FolderDownloads; + int hr = SHGetKnownFolderPath(ref folderId, 0, IntPtr.Zero, out pathPtr); + if (hr == 0) { + path = Marshal.PtrToStringUni(pathPtr); + Marshal.FreeCoTaskMem(pathPtr); + return path; + } + } + + //Fallback code + path = Path.GetDirectoryName(Environment.GetFolderPath(Environment.SpecialFolder.Personal)); + path = Path.Combine(path, "Downloads"); + return path; + } + } + + + static readonly Guid FolderDownloads = new Guid("374DE290-123F-4565-9164-39C4925E467B"); + + [DllImport("shell32.dll", CharSet = CharSet.Auto)] + private static extern int SHGetKnownFolderPath(ref Guid id, int flags, IntPtr token, out IntPtr path); + + } + +} diff --git a/OnTopReplica/Native/HT.cs b/src/OnTopReplica/Native/HT.cs similarity index 95% rename from OnTopReplica/Native/HT.cs rename to src/OnTopReplica/Native/HT.cs index 231e928..34c54d6 100644 --- a/OnTopReplica/Native/HT.cs +++ b/src/OnTopReplica/Native/HT.cs @@ -1,14 +1,14 @@ -using System; -using System.Collections.Generic; -using System.Text; - -namespace OnTopReplica.Native { - /// - /// Native Win32 Hit Testing codes. - /// - static class HT { - public const int TRANSPARENT = -1; - public const int CLIENT = 1; - public const int CAPTION = 2; - } -} +using System; +using System.Collections.Generic; +using System.Text; + +namespace OnTopReplica.Native { + /// + /// Native Win32 Hit Testing codes. + /// + static class HT { + public const int TRANSPARENT = -1; + public const int CLIENT = 1; + public const int CAPTION = 2; + } +} diff --git a/OnTopReplica/Native/HookMethods.cs b/src/OnTopReplica/Native/HookMethods.cs similarity index 97% rename from OnTopReplica/Native/HookMethods.cs rename to src/OnTopReplica/Native/HookMethods.cs index e90f864..95809d5 100644 --- a/OnTopReplica/Native/HookMethods.cs +++ b/src/OnTopReplica/Native/HookMethods.cs @@ -1,54 +1,54 @@ -using System; -using System.Collections.Generic; -using System.Runtime.InteropServices; -using System.Text; - -namespace OnTopReplica.Native { - - /// - /// Helpers for interop with native Windows hooks. - /// - static class HookMethods { - - static HookMethods() { - WM_SHELLHOOKMESSAGE = RegisterWindowMessage("SHELLHOOK"); - if (WM_SHELLHOOKMESSAGE == 0) { - Log.Write("Failed to register SHELLHOOK window message"); - } - } - - public static int WM_SHELLHOOKMESSAGE { - get; - private set; - } - - const int HSHELL_HIGHBIT = 0x8000; - - public const int HSHELL_WINDOWCREATED = 1; - public const int HSHELL_WINDOWDESTROYED = 2; - public const int HSHELL_WINDOWACTIVATED = 4; - public const int HSHELL_REDRAW = 6; - public const int HSHELL_RUDEAPPACTIVATED = (HSHELL_WINDOWACTIVATED | HSHELL_HIGHBIT); - public const int HSHELL_FLASH = (HSHELL_REDRAW | HSHELL_HIGHBIT); - - /// - /// Registers the WM_ID for a window message. - /// - /// Name of the window message. - [DllImport("User32.dll")] - public static extern int RegisterWindowMessage(string wndMessageName); - - /// - /// Registers a window as a shell hook window. - /// - [DllImport("User32.dll")] - public static extern bool RegisterShellHookWindow(IntPtr hwnd); - - /// - /// Deregisters a window as a shell hook window. - /// - [DllImport("User32.dll")] - public static extern bool DeregisterShellHookWindow(IntPtr hwnd); - - } -} +using System; +using System.Collections.Generic; +using System.Runtime.InteropServices; +using System.Text; + +namespace OnTopReplica.Native { + + /// + /// Helpers for interop with native Windows hooks. + /// + static class HookMethods { + + static HookMethods() { + WM_SHELLHOOKMESSAGE = RegisterWindowMessage("SHELLHOOK"); + if (WM_SHELLHOOKMESSAGE == 0) { + Log.Write("Failed to register SHELLHOOK window message"); + } + } + + public static int WM_SHELLHOOKMESSAGE { + get; + private set; + } + + const int HSHELL_HIGHBIT = 0x8000; + + public const int HSHELL_WINDOWCREATED = 1; + public const int HSHELL_WINDOWDESTROYED = 2; + public const int HSHELL_WINDOWACTIVATED = 4; + public const int HSHELL_REDRAW = 6; + public const int HSHELL_RUDEAPPACTIVATED = (HSHELL_WINDOWACTIVATED | HSHELL_HIGHBIT); + public const int HSHELL_FLASH = (HSHELL_REDRAW | HSHELL_HIGHBIT); + + /// + /// Registers the WM_ID for a window message. + /// + /// Name of the window message. + [DllImport("User32.dll")] + public static extern int RegisterWindowMessage(string wndMessageName); + + /// + /// Registers a window as a shell hook window. + /// + [DllImport("User32.dll")] + public static extern bool RegisterShellHookWindow(IntPtr hwnd); + + /// + /// Deregisters a window as a shell hook window. + /// + [DllImport("User32.dll")] + public static extern bool DeregisterShellHookWindow(IntPtr hwnd); + + } +} diff --git a/OnTopReplica/Native/HotKeyMethods.cs b/src/OnTopReplica/Native/HotKeyMethods.cs similarity index 97% rename from OnTopReplica/Native/HotKeyMethods.cs rename to src/OnTopReplica/Native/HotKeyMethods.cs index d40fee4..2122f0f 100644 --- a/OnTopReplica/Native/HotKeyMethods.cs +++ b/src/OnTopReplica/Native/HotKeyMethods.cs @@ -1,78 +1,78 @@ -using System; -using System.Collections.Generic; -using System.Text; -using System.Runtime.InteropServices; -using System.Windows.Forms; - -namespace OnTopReplica.Native { - - [Flags] - public enum HotKeyModifiers : int { - Alt = 0x1, - Control = 0x2, - Shift = 0x4, - Windows = 0x8 - } - - /// - /// Static native methods for HotKey management. - /// - static class HotKeyMethods { - - public const int WM_HOTKEY = 0x312; - - [DllImport("user32.dll")] - public static extern bool RegisterHotKey(IntPtr hWnd, int id, int fsModifiers, int vlc); - - [DllImport("user32.dll")] - public static extern bool UnregisterHotKey(IntPtr hWnd, int id); - - /// - /// Translates a key combination specification into key code values. - /// - /// Key combination specification (see remarks). - /// Modifier values. - /// Key values. - /// - /// Specification can contain one single key value (from the enumeration System.Windows.Forms.Keys) - /// preceded by modifier strings (each one separated by a single '+'). - /// For instance: - /// [CTRL]+[ALT]+A - /// or - /// [ALT]+[SHIFT]+O - /// - public static void TranslateStringToKeyValues(string hotkeySpec, out int modifiers, out int keys) { - if (string.IsNullOrEmpty(hotkeySpec)) - throw new ArgumentNullException(); - - modifiers = 0; - keys = 0; - - if (ExtractModifier(ref hotkeySpec, "[CTRL]+")) - modifiers |= (int)HotKeyModifiers.Control; - if (ExtractModifier(ref hotkeySpec, "[ALT]+")) - modifiers |= (int)HotKeyModifiers.Alt; - if (ExtractModifier(ref hotkeySpec, "[SHIFT]+")) - modifiers |= (int)HotKeyModifiers.Shift; - - //Attempt to translate last part (should be single key) - try { - var keyValue = Enum.Parse(typeof(Keys), hotkeySpec, true); - keys = (int)keyValue; - } - catch (ArgumentException) { - throw new ArgumentException("Couldn't parse key value '" + hotkeySpec + "'."); - } - } - - private static bool ExtractModifier(ref string spec, string modifier) { - int modIndex = spec.IndexOf(modifier); - if (modIndex == -1) - return false; - - spec = spec.Remove(modIndex, modifier.Length); - return true; - } - - } -} +using System; +using System.Collections.Generic; +using System.Text; +using System.Runtime.InteropServices; +using System.Windows.Forms; + +namespace OnTopReplica.Native { + + [Flags] + public enum HotKeyModifiers : int { + Alt = 0x1, + Control = 0x2, + Shift = 0x4, + Windows = 0x8 + } + + /// + /// Static native methods for HotKey management. + /// + static class HotKeyMethods { + + public const int WM_HOTKEY = 0x312; + + [DllImport("user32.dll")] + public static extern bool RegisterHotKey(IntPtr hWnd, int id, int fsModifiers, int vlc); + + [DllImport("user32.dll")] + public static extern bool UnregisterHotKey(IntPtr hWnd, int id); + + /// + /// Translates a key combination specification into key code values. + /// + /// Key combination specification (see remarks). + /// Modifier values. + /// Key values. + /// + /// Specification can contain one single key value (from the enumeration System.Windows.Forms.Keys) + /// preceded by modifier strings (each one separated by a single '+'). + /// For instance: + /// [CTRL]+[ALT]+A + /// or + /// [ALT]+[SHIFT]+O + /// + public static void TranslateStringToKeyValues(string hotkeySpec, out int modifiers, out int keys) { + if (string.IsNullOrEmpty(hotkeySpec)) + throw new ArgumentNullException(); + + modifiers = 0; + keys = 0; + + if (ExtractModifier(ref hotkeySpec, "[CTRL]+")) + modifiers |= (int)HotKeyModifiers.Control; + if (ExtractModifier(ref hotkeySpec, "[ALT]+")) + modifiers |= (int)HotKeyModifiers.Alt; + if (ExtractModifier(ref hotkeySpec, "[SHIFT]+")) + modifiers |= (int)HotKeyModifiers.Shift; + + //Attempt to translate last part (should be single key) + try { + var keyValue = Enum.Parse(typeof(Keys), hotkeySpec, true); + keys = (int)keyValue; + } + catch (ArgumentException) { + throw new ArgumentException("Couldn't parse key value '" + hotkeySpec + "'."); + } + } + + private static bool ExtractModifier(ref string spec, string modifier) { + int modIndex = spec.IndexOf(modifier); + if (modIndex == -1) + return false; + + spec = spec.Remove(modIndex, modifier.Length); + return true; + } + + } +} diff --git a/OnTopReplica/Native/ITaskBarList.cs b/src/OnTopReplica/Native/ITaskBarList.cs similarity index 97% rename from OnTopReplica/Native/ITaskBarList.cs rename to src/OnTopReplica/Native/ITaskBarList.cs index e4a53bb..ae227d5 100644 --- a/OnTopReplica/Native/ITaskBarList.cs +++ b/src/OnTopReplica/Native/ITaskBarList.cs @@ -1,45 +1,45 @@ -using System; -using System.Collections.Generic; -using System.Text; -using System.Runtime.InteropServices; - -namespace OnTopReplica.Native { - [ComImport, - Guid("56fdf342-fd6d-11d0-958a-006097c9a090"), - InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] - public interface ITaskbarList { - /// - /// Initializes the taskbar list object. This method must be called before any other ITaskbarList methods can be called. - /// - void HrInit(); - - /// - /// Adds an item to the taskbar. - /// - /// A handle to the window to be added to the taskbar. - void AddTab([In] IntPtr hWnd); - - /// - /// Deletes an item from the taskbar. - /// - /// A handle to the window to be deleted from the taskbar. - void DeleteTab([In] IntPtr hWnd); - - /// - /// Activates an item on the taskbar. The window is not actually activated; the window's item on the taskbar is merely displayed as active. - /// - /// A handle to the window on the taskbar to be displayed as active. - void ActivateTab([In] IntPtr hWnd); - - /// - /// Marks a taskbar item as active but does not visually activate it. - /// - /// A handle to the window to be marked as active. - void SetActiveAlt([In] IntPtr hWnd); - } - - [ComImport] - [Guid("56fdf344-fd6d-11d0-958a-006097c9a090")] - public class CoTaskbarList { - } -} +using System; +using System.Collections.Generic; +using System.Text; +using System.Runtime.InteropServices; + +namespace OnTopReplica.Native { + [ComImport, + Guid("56fdf342-fd6d-11d0-958a-006097c9a090"), + InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] + public interface ITaskbarList { + /// + /// Initializes the taskbar list object. This method must be called before any other ITaskbarList methods can be called. + /// + void HrInit(); + + /// + /// Adds an item to the taskbar. + /// + /// A handle to the window to be added to the taskbar. + void AddTab([In] IntPtr hWnd); + + /// + /// Deletes an item from the taskbar. + /// + /// A handle to the window to be deleted from the taskbar. + void DeleteTab([In] IntPtr hWnd); + + /// + /// Activates an item on the taskbar. The window is not actually activated; the window's item on the taskbar is merely displayed as active. + /// + /// A handle to the window on the taskbar to be displayed as active. + void ActivateTab([In] IntPtr hWnd); + + /// + /// Marks a taskbar item as active but does not visually activate it. + /// + /// A handle to the window to be marked as active. + void SetActiveAlt([In] IntPtr hWnd); + } + + [ComImport] + [Guid("56fdf344-fd6d-11d0-958a-006097c9a090")] + public class CoTaskbarList { + } +} diff --git a/OnTopReplica/Native/InputMethods.cs b/src/OnTopReplica/Native/InputMethods.cs similarity index 96% rename from OnTopReplica/Native/InputMethods.cs rename to src/OnTopReplica/Native/InputMethods.cs index fe8233e..193550f 100644 --- a/OnTopReplica/Native/InputMethods.cs +++ b/src/OnTopReplica/Native/InputMethods.cs @@ -1,25 +1,25 @@ -using System; -using System.Collections.Generic; -using System.Text; -using System.Runtime.InteropServices; - -namespace OnTopReplica.Native { - static class InputMethods { - - [DllImport("user32.dll")] - static extern short GetKeyState(VirtualKeyState nVirtKey); - - const int KeyToggled = 0x1; - - const int KeyPressed = 0x8000; - - public static bool IsKeyPressed(VirtualKeyState virtKey) { - return (GetKeyState(virtKey) & KeyPressed) != 0; - } - - public static bool IsKeyToggled(VirtualKeyState virtKey) { - return (GetKeyState(virtKey) & KeyToggled) != 0; - } - - } -} +using System; +using System.Collections.Generic; +using System.Text; +using System.Runtime.InteropServices; + +namespace OnTopReplica.Native { + static class InputMethods { + + [DllImport("user32.dll")] + static extern short GetKeyState(VirtualKeyState nVirtKey); + + const int KeyToggled = 0x1; + + const int KeyPressed = 0x8000; + + public static bool IsKeyPressed(VirtualKeyState virtKey) { + return (GetKeyState(virtKey) & KeyPressed) != 0; + } + + public static bool IsKeyToggled(VirtualKeyState virtKey) { + return (GetKeyState(virtKey) & KeyToggled) != 0; + } + + } +} diff --git a/OnTopReplica/Native/MK.cs b/src/OnTopReplica/Native/MK.cs similarity index 95% rename from OnTopReplica/Native/MK.cs rename to src/OnTopReplica/Native/MK.cs index 90c7e90..b6982e6 100644 --- a/OnTopReplica/Native/MK.cs +++ b/src/OnTopReplica/Native/MK.cs @@ -1,14 +1,14 @@ -using System; -using System.Collections.Generic; -using System.Text; - -namespace OnTopReplica.Native { - /// - /// Native Mouse click codes. - /// - static class MK { - public const int LBUTTON = 0x0001; - public const int RBUTTON = 0x0002; - public const int MBUTTON = 0x0010; - } -} +using System; +using System.Collections.Generic; +using System.Text; + +namespace OnTopReplica.Native { + /// + /// Native Mouse click codes. + /// + static class MK { + public const int LBUTTON = 0x0001; + public const int RBUTTON = 0x0002; + public const int MBUTTON = 0x0010; + } +} diff --git a/OnTopReplica/Native/MessagingMethods.cs b/src/OnTopReplica/Native/MessagingMethods.cs similarity index 97% rename from OnTopReplica/Native/MessagingMethods.cs rename to src/OnTopReplica/Native/MessagingMethods.cs index cabe03e..e9e394e 100644 --- a/OnTopReplica/Native/MessagingMethods.cs +++ b/src/OnTopReplica/Native/MessagingMethods.cs @@ -1,34 +1,34 @@ -using System; -using System.Collections.Generic; -using System.Text; -using System.Runtime.InteropServices; - -namespace OnTopReplica.Native { - /// - /// Common methods for Win32 messaging. - /// - static class MessagingMethods { - - [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = false)] - public static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam); - - [Flags] - public enum SendMessageTimeoutFlags : uint { - AbortIfHung = 2, - Block = 1, - Normal = 0 - } - - [DllImport("user32.dll")] - public static extern IntPtr SendMessageTimeout(IntPtr hwnd, uint message, IntPtr wparam, IntPtr lparam, SendMessageTimeoutFlags flags, uint timeout, out IntPtr result); - - [return: MarshalAs(UnmanagedType.Bool)] - [DllImport("user32.dll", SetLastError = false)] - public static extern bool PostMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam); - - public static IntPtr MakeLParam(int LoWord, int HiWord) { - return new IntPtr((HiWord << 16) | (LoWord & 0xffff)); - } - - } -} +using System; +using System.Collections.Generic; +using System.Text; +using System.Runtime.InteropServices; + +namespace OnTopReplica.Native { + /// + /// Common methods for Win32 messaging. + /// + static class MessagingMethods { + + [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = false)] + public static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam); + + [Flags] + public enum SendMessageTimeoutFlags : uint { + AbortIfHung = 2, + Block = 1, + Normal = 0 + } + + [DllImport("user32.dll")] + public static extern IntPtr SendMessageTimeout(IntPtr hwnd, uint message, IntPtr wparam, IntPtr lparam, SendMessageTimeoutFlags flags, uint timeout, out IntPtr result); + + [return: MarshalAs(UnmanagedType.Bool)] + [DllImport("user32.dll", SetLastError = false)] + public static extern bool PostMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam); + + public static IntPtr MakeLParam(int LoWord, int HiWord) { + return new IntPtr((HiWord << 16) | (LoWord & 0xffff)); + } + + } +} diff --git a/OnTopReplica/Native/Point.cs b/src/OnTopReplica/Native/Point.cs similarity index 95% rename from OnTopReplica/Native/Point.cs rename to src/OnTopReplica/Native/Point.cs index c34db85..b6fc64c 100644 --- a/OnTopReplica/Native/Point.cs +++ b/src/OnTopReplica/Native/Point.cs @@ -1,36 +1,36 @@ -using System; -using System.Collections.Generic; -using System.Text; -using System.Runtime.InteropServices; - -namespace OnTopReplica.Native { - /// - /// Native Point structure. - /// - [StructLayout(LayoutKind.Sequential)] - public struct NPoint { - public int X, Y; - - public NPoint(int x, int y) { - X = x; - Y = y; - } - - public NPoint(NPoint copy) { - X = copy.X; - Y = copy.Y; - } - - public static NPoint FromPoint(System.Drawing.Point point) { - return new NPoint(point.X, point.Y); - } - - public System.Drawing.Point ToPoint() { - return new System.Drawing.Point(X, Y); - } - - public override string ToString() { - return "{" + X + "," + Y + "}"; - } - } -} +using System; +using System.Collections.Generic; +using System.Text; +using System.Runtime.InteropServices; + +namespace OnTopReplica.Native { + /// + /// Native Point structure. + /// + [StructLayout(LayoutKind.Sequential)] + public struct NPoint { + public int X, Y; + + public NPoint(int x, int y) { + X = x; + Y = y; + } + + public NPoint(NPoint copy) { + X = copy.X; + Y = copy.Y; + } + + public static NPoint FromPoint(System.Drawing.Point point) { + return new NPoint(point.X, point.Y); + } + + public System.Drawing.Point ToPoint() { + return new System.Drawing.Point(X, Y); + } + + public override string ToString() { + return "{" + X + "," + Y + "}"; + } + } +} diff --git a/OnTopReplica/Native/Rectangle.cs b/src/OnTopReplica/Native/Rectangle.cs similarity index 96% rename from OnTopReplica/Native/Rectangle.cs rename to src/OnTopReplica/Native/Rectangle.cs index 1166648..d42c2d4 100644 --- a/OnTopReplica/Native/Rectangle.cs +++ b/src/OnTopReplica/Native/Rectangle.cs @@ -1,66 +1,66 @@ -using System; -using System.Collections.Generic; -using System.Text; -using System.Runtime.InteropServices; -using System.Drawing; - -namespace OnTopReplica.Native { - - /// A native Rectangle Structure. - [StructLayout(LayoutKind.Sequential)] - struct NRectangle { - public NRectangle(int left, int top, int right, int bottom) { - Left = left; - Top = top; - Right = right; - Bottom = bottom; - } - - public NRectangle(System.Drawing.Rectangle rect) { - Left = rect.X; - Top = rect.Y; - Right = rect.Right; - Bottom = rect.Bottom; - } - - public int Left; - public int Top; - public int Right; - public int Bottom; - - public int Width { - get { - return Right - Left; - } - } - public int Height { - get { - return Bottom - Top; - } - } - - public System.Drawing.Rectangle ToRectangle() { - return new System.Drawing.Rectangle(Left, Top, Right - Left, Bottom - Top); - } - - public System.Drawing.Size Size { - get { - return new System.Drawing.Size(Width, Height); - } - } - - public override string ToString() { - return string.Format("{{{0},{1},{2},{3}}}", Left, Top, Right, Bottom); - } - - } - - static class NRectangleExtensions { - - public static NRectangle ToNativeRectangle(this Size size) { - return new NRectangle(0, 0, size.Width, size.Height); - } - - } - -} +using System; +using System.Collections.Generic; +using System.Text; +using System.Runtime.InteropServices; +using System.Drawing; + +namespace OnTopReplica.Native { + + /// A native Rectangle Structure. + [StructLayout(LayoutKind.Sequential)] + struct NRectangle { + public NRectangle(int left, int top, int right, int bottom) { + Left = left; + Top = top; + Right = right; + Bottom = bottom; + } + + public NRectangle(System.Drawing.Rectangle rect) { + Left = rect.X; + Top = rect.Y; + Right = rect.Right; + Bottom = rect.Bottom; + } + + public int Left; + public int Top; + public int Right; + public int Bottom; + + public int Width { + get { + return Right - Left; + } + } + public int Height { + get { + return Bottom - Top; + } + } + + public System.Drawing.Rectangle ToRectangle() { + return new System.Drawing.Rectangle(Left, Top, Right - Left, Bottom - Top); + } + + public System.Drawing.Size Size { + get { + return new System.Drawing.Size(Width, Height); + } + } + + public override string ToString() { + return string.Format("{{{0},{1},{2},{3}}}", Left, Top, Right, Bottom); + } + + } + + static class NRectangleExtensions { + + public static NRectangle ToNativeRectangle(this Size size) { + return new NRectangle(0, 0, size.Width, size.Height); + } + + } + +} diff --git a/OnTopReplica/Native/VirtualKeyState.cs b/src/OnTopReplica/Native/VirtualKeyState.cs similarity index 96% rename from OnTopReplica/Native/VirtualKeyState.cs rename to src/OnTopReplica/Native/VirtualKeyState.cs index 91e94a0..6114471 100644 --- a/OnTopReplica/Native/VirtualKeyState.cs +++ b/src/OnTopReplica/Native/VirtualKeyState.cs @@ -1,193 +1,193 @@ -using System; -using System.Collections.Generic; -using System.Text; - -namespace OnTopReplica.Native { - enum VirtualKeyState : int { - VK_LBUTTON = 0x01, - VK_RBUTTON = 0x02, - VK_CANCEL = 0x03, - VK_MBUTTON = 0x04, - // - VK_XBUTTON1 = 0x05, - VK_XBUTTON2 = 0x06, - // - VK_BACK = 0x08, - VK_TAB = 0x09, - // - VK_CLEAR = 0x0C, - VK_RETURN = 0x0D, - // - VK_SHIFT = 0x10, - VK_CONTROL = 0x11, - VK_MENU = 0x12, - VK_PAUSE = 0x13, - VK_CAPITAL = 0x14, - // - VK_KANA = 0x15, - VK_HANGEUL = 0x15, /* old name - should be here for compatibility */ - VK_HANGUL = 0x15, - VK_JUNJA = 0x17, - VK_FINAL = 0x18, - VK_HANJA = 0x19, - VK_KANJI = 0x19, - // - VK_ESCAPE = 0x1B, - // - VK_CONVERT = 0x1C, - VK_NONCONVERT = 0x1D, - VK_ACCEPT = 0x1E, - VK_MODECHANGE = 0x1F, - // - VK_SPACE = 0x20, - VK_PRIOR = 0x21, - VK_NEXT = 0x22, - VK_END = 0x23, - VK_HOME = 0x24, - VK_LEFT = 0x25, - VK_UP = 0x26, - VK_RIGHT = 0x27, - VK_DOWN = 0x28, - VK_SELECT = 0x29, - VK_PRINT = 0x2A, - VK_EXECUTE = 0x2B, - VK_SNAPSHOT = 0x2C, - VK_INSERT = 0x2D, - VK_DELETE = 0x2E, - VK_HELP = 0x2F, - // - VK_LWIN = 0x5B, - VK_RWIN = 0x5C, - VK_APPS = 0x5D, - // - VK_SLEEP = 0x5F, - // - VK_NUMPAD0 = 0x60, - VK_NUMPAD1 = 0x61, - VK_NUMPAD2 = 0x62, - VK_NUMPAD3 = 0x63, - VK_NUMPAD4 = 0x64, - VK_NUMPAD5 = 0x65, - VK_NUMPAD6 = 0x66, - VK_NUMPAD7 = 0x67, - VK_NUMPAD8 = 0x68, - VK_NUMPAD9 = 0x69, - VK_MULTIPLY = 0x6A, - VK_ADD = 0x6B, - VK_SEPARATOR = 0x6C, - VK_SUBTRACT = 0x6D, - VK_DECIMAL = 0x6E, - VK_DIVIDE = 0x6F, - VK_F1 = 0x70, - VK_F2 = 0x71, - VK_F3 = 0x72, - VK_F4 = 0x73, - VK_F5 = 0x74, - VK_F6 = 0x75, - VK_F7 = 0x76, - VK_F8 = 0x77, - VK_F9 = 0x78, - VK_F10 = 0x79, - VK_F11 = 0x7A, - VK_F12 = 0x7B, - VK_F13 = 0x7C, - VK_F14 = 0x7D, - VK_F15 = 0x7E, - VK_F16 = 0x7F, - VK_F17 = 0x80, - VK_F18 = 0x81, - VK_F19 = 0x82, - VK_F20 = 0x83, - VK_F21 = 0x84, - VK_F22 = 0x85, - VK_F23 = 0x86, - VK_F24 = 0x87, - // - VK_NUMLOCK = 0x90, - VK_SCROLL = 0x91, - // - VK_OEM_NEC_EQUAL = 0x92, // '=' key on numpad - // - VK_OEM_FJ_JISHO = 0x92, // 'Dictionary' key - VK_OEM_FJ_MASSHOU = 0x93, // 'Unregister word' key - VK_OEM_FJ_TOUROKU = 0x94, // 'Register word' key - VK_OEM_FJ_LOYA = 0x95, // 'Left OYAYUBI' key - VK_OEM_FJ_ROYA = 0x96, // 'Right OYAYUBI' key - // - VK_LSHIFT = 0xA0, - VK_RSHIFT = 0xA1, - VK_LCONTROL = 0xA2, - VK_RCONTROL = 0xA3, - VK_LMENU = 0xA4, - VK_RMENU = 0xA5, - // - VK_BROWSER_BACK = 0xA6, - VK_BROWSER_FORWARD = 0xA7, - VK_BROWSER_REFRESH = 0xA8, - VK_BROWSER_STOP = 0xA9, - VK_BROWSER_SEARCH = 0xAA, - VK_BROWSER_FAVORITES = 0xAB, - VK_BROWSER_HOME = 0xAC, - // - VK_VOLUME_MUTE = 0xAD, - VK_VOLUME_DOWN = 0xAE, - VK_VOLUME_UP = 0xAF, - VK_MEDIA_NEXT_TRACK = 0xB0, - VK_MEDIA_PREV_TRACK = 0xB1, - VK_MEDIA_STOP = 0xB2, - VK_MEDIA_PLAY_PAUSE = 0xB3, - VK_LAUNCH_MAIL = 0xB4, - VK_LAUNCH_MEDIA_SELECT = 0xB5, - VK_LAUNCH_APP1 = 0xB6, - VK_LAUNCH_APP2 = 0xB7, - // - VK_OEM_1 = 0xBA, // ';:' for US - VK_OEM_PLUS = 0xBB, // '+' any country - VK_OEM_COMMA = 0xBC, // ',' any country - VK_OEM_MINUS = 0xBD, // '-' any country - VK_OEM_PERIOD = 0xBE, // '.' any country - VK_OEM_2 = 0xBF, // '/?' for US - VK_OEM_3 = 0xC0, // '`~' for US - // - VK_OEM_4 = 0xDB, // '[{' for US - VK_OEM_5 = 0xDC, // '\|' for US - VK_OEM_6 = 0xDD, // ']}' for US - VK_OEM_7 = 0xDE, // ''"' for US - VK_OEM_8 = 0xDF, - // - VK_OEM_AX = 0xE1, // 'AX' key on Japanese AX kbd - VK_OEM_102 = 0xE2, // "<>" or "\|" on RT 102-key kbd. - VK_ICO_HELP = 0xE3, // Help key on ICO - VK_ICO_00 = 0xE4, // 00 key on ICO - // - VK_PROCESSKEY = 0xE5, - // - VK_ICO_CLEAR = 0xE6, - // - VK_PACKET = 0xE7, - // - VK_OEM_RESET = 0xE9, - VK_OEM_JUMP = 0xEA, - VK_OEM_PA1 = 0xEB, - VK_OEM_PA2 = 0xEC, - VK_OEM_PA3 = 0xED, - VK_OEM_WSCTRL = 0xEE, - VK_OEM_CUSEL = 0xEF, - VK_OEM_ATTN = 0xF0, - VK_OEM_FINISH = 0xF1, - VK_OEM_COPY = 0xF2, - VK_OEM_AUTO = 0xF3, - VK_OEM_ENLW = 0xF4, - VK_OEM_BACKTAB = 0xF5, - // - VK_ATTN = 0xF6, - VK_CRSEL = 0xF7, - VK_EXSEL = 0xF8, - VK_EREOF = 0xF9, - VK_PLAY = 0xFA, - VK_ZOOM = 0xFB, - VK_NONAME = 0xFC, - VK_PA1 = 0xFD, - VK_OEM_CLEAR = 0xFE - } -} +using System; +using System.Collections.Generic; +using System.Text; + +namespace OnTopReplica.Native { + enum VirtualKeyState : int { + VK_LBUTTON = 0x01, + VK_RBUTTON = 0x02, + VK_CANCEL = 0x03, + VK_MBUTTON = 0x04, + // + VK_XBUTTON1 = 0x05, + VK_XBUTTON2 = 0x06, + // + VK_BACK = 0x08, + VK_TAB = 0x09, + // + VK_CLEAR = 0x0C, + VK_RETURN = 0x0D, + // + VK_SHIFT = 0x10, + VK_CONTROL = 0x11, + VK_MENU = 0x12, + VK_PAUSE = 0x13, + VK_CAPITAL = 0x14, + // + VK_KANA = 0x15, + VK_HANGEUL = 0x15, /* old name - should be here for compatibility */ + VK_HANGUL = 0x15, + VK_JUNJA = 0x17, + VK_FINAL = 0x18, + VK_HANJA = 0x19, + VK_KANJI = 0x19, + // + VK_ESCAPE = 0x1B, + // + VK_CONVERT = 0x1C, + VK_NONCONVERT = 0x1D, + VK_ACCEPT = 0x1E, + VK_MODECHANGE = 0x1F, + // + VK_SPACE = 0x20, + VK_PRIOR = 0x21, + VK_NEXT = 0x22, + VK_END = 0x23, + VK_HOME = 0x24, + VK_LEFT = 0x25, + VK_UP = 0x26, + VK_RIGHT = 0x27, + VK_DOWN = 0x28, + VK_SELECT = 0x29, + VK_PRINT = 0x2A, + VK_EXECUTE = 0x2B, + VK_SNAPSHOT = 0x2C, + VK_INSERT = 0x2D, + VK_DELETE = 0x2E, + VK_HELP = 0x2F, + // + VK_LWIN = 0x5B, + VK_RWIN = 0x5C, + VK_APPS = 0x5D, + // + VK_SLEEP = 0x5F, + // + VK_NUMPAD0 = 0x60, + VK_NUMPAD1 = 0x61, + VK_NUMPAD2 = 0x62, + VK_NUMPAD3 = 0x63, + VK_NUMPAD4 = 0x64, + VK_NUMPAD5 = 0x65, + VK_NUMPAD6 = 0x66, + VK_NUMPAD7 = 0x67, + VK_NUMPAD8 = 0x68, + VK_NUMPAD9 = 0x69, + VK_MULTIPLY = 0x6A, + VK_ADD = 0x6B, + VK_SEPARATOR = 0x6C, + VK_SUBTRACT = 0x6D, + VK_DECIMAL = 0x6E, + VK_DIVIDE = 0x6F, + VK_F1 = 0x70, + VK_F2 = 0x71, + VK_F3 = 0x72, + VK_F4 = 0x73, + VK_F5 = 0x74, + VK_F6 = 0x75, + VK_F7 = 0x76, + VK_F8 = 0x77, + VK_F9 = 0x78, + VK_F10 = 0x79, + VK_F11 = 0x7A, + VK_F12 = 0x7B, + VK_F13 = 0x7C, + VK_F14 = 0x7D, + VK_F15 = 0x7E, + VK_F16 = 0x7F, + VK_F17 = 0x80, + VK_F18 = 0x81, + VK_F19 = 0x82, + VK_F20 = 0x83, + VK_F21 = 0x84, + VK_F22 = 0x85, + VK_F23 = 0x86, + VK_F24 = 0x87, + // + VK_NUMLOCK = 0x90, + VK_SCROLL = 0x91, + // + VK_OEM_NEC_EQUAL = 0x92, // '=' key on numpad + // + VK_OEM_FJ_JISHO = 0x92, // 'Dictionary' key + VK_OEM_FJ_MASSHOU = 0x93, // 'Unregister word' key + VK_OEM_FJ_TOUROKU = 0x94, // 'Register word' key + VK_OEM_FJ_LOYA = 0x95, // 'Left OYAYUBI' key + VK_OEM_FJ_ROYA = 0x96, // 'Right OYAYUBI' key + // + VK_LSHIFT = 0xA0, + VK_RSHIFT = 0xA1, + VK_LCONTROL = 0xA2, + VK_RCONTROL = 0xA3, + VK_LMENU = 0xA4, + VK_RMENU = 0xA5, + // + VK_BROWSER_BACK = 0xA6, + VK_BROWSER_FORWARD = 0xA7, + VK_BROWSER_REFRESH = 0xA8, + VK_BROWSER_STOP = 0xA9, + VK_BROWSER_SEARCH = 0xAA, + VK_BROWSER_FAVORITES = 0xAB, + VK_BROWSER_HOME = 0xAC, + // + VK_VOLUME_MUTE = 0xAD, + VK_VOLUME_DOWN = 0xAE, + VK_VOLUME_UP = 0xAF, + VK_MEDIA_NEXT_TRACK = 0xB0, + VK_MEDIA_PREV_TRACK = 0xB1, + VK_MEDIA_STOP = 0xB2, + VK_MEDIA_PLAY_PAUSE = 0xB3, + VK_LAUNCH_MAIL = 0xB4, + VK_LAUNCH_MEDIA_SELECT = 0xB5, + VK_LAUNCH_APP1 = 0xB6, + VK_LAUNCH_APP2 = 0xB7, + // + VK_OEM_1 = 0xBA, // ';:' for US + VK_OEM_PLUS = 0xBB, // '+' any country + VK_OEM_COMMA = 0xBC, // ',' any country + VK_OEM_MINUS = 0xBD, // '-' any country + VK_OEM_PERIOD = 0xBE, // '.' any country + VK_OEM_2 = 0xBF, // '/?' for US + VK_OEM_3 = 0xC0, // '`~' for US + // + VK_OEM_4 = 0xDB, // '[{' for US + VK_OEM_5 = 0xDC, // '\|' for US + VK_OEM_6 = 0xDD, // ']}' for US + VK_OEM_7 = 0xDE, // ''"' for US + VK_OEM_8 = 0xDF, + // + VK_OEM_AX = 0xE1, // 'AX' key on Japanese AX kbd + VK_OEM_102 = 0xE2, // "<>" or "\|" on RT 102-key kbd. + VK_ICO_HELP = 0xE3, // Help key on ICO + VK_ICO_00 = 0xE4, // 00 key on ICO + // + VK_PROCESSKEY = 0xE5, + // + VK_ICO_CLEAR = 0xE6, + // + VK_PACKET = 0xE7, + // + VK_OEM_RESET = 0xE9, + VK_OEM_JUMP = 0xEA, + VK_OEM_PA1 = 0xEB, + VK_OEM_PA2 = 0xEC, + VK_OEM_PA3 = 0xED, + VK_OEM_WSCTRL = 0xEE, + VK_OEM_CUSEL = 0xEF, + VK_OEM_ATTN = 0xF0, + VK_OEM_FINISH = 0xF1, + VK_OEM_COPY = 0xF2, + VK_OEM_AUTO = 0xF3, + VK_OEM_ENLW = 0xF4, + VK_OEM_BACKTAB = 0xF5, + // + VK_ATTN = 0xF6, + VK_CRSEL = 0xF7, + VK_EXSEL = 0xF8, + VK_EREOF = 0xF9, + VK_PLAY = 0xFA, + VK_ZOOM = 0xFB, + VK_NONAME = 0xFC, + VK_PA1 = 0xFD, + VK_OEM_CLEAR = 0xFE + } +} diff --git a/OnTopReplica/Native/WM.cs b/src/OnTopReplica/Native/WM.cs similarity index 97% rename from OnTopReplica/Native/WM.cs rename to src/OnTopReplica/Native/WM.cs index dceaced..293b1a9 100644 --- a/OnTopReplica/Native/WM.cs +++ b/src/OnTopReplica/Native/WM.cs @@ -1,29 +1,29 @@ -using System; -using System.Collections.Generic; -using System.Text; - -namespace OnTopReplica.Native { - /// - /// Native Windows Message codes. - /// - static class WM { - public const int GETICON = 0x7f; - public const int SIZING = 0x214; - public const int NCHITTEST = 0x84; - public const int NCPAINT = 0x0085; - public const int LBUTTONDOWN = 0x0201; - public const int LBUTTONUP = 0x0202; - public const int LBUTTONDBLCLK = 0x0203; - public const int RBUTTONDOWN = 0x0204; - public const int RBUTTONUP = 0x0205; - public const int RBUTTONDBLCLK = 0x0206; - public const int NCLBUTTONUP = 0x00A2; - public const int NCLBUTTONDOWN = 0x00A1; - public const int NCLBUTTONDBLCLK = 0x00A3; - public const int NCRBUTTONUP = 0x00A5; - public const int NCMOUSELEAVE = 0x02A2; - public const int SYSCOMMAND = 0x0112; - public const int GETTEXT = 0x000D; - public const int GETTEXTLENGTH = 0x000E; - } -} +using System; +using System.Collections.Generic; +using System.Text; + +namespace OnTopReplica.Native { + /// + /// Native Windows Message codes. + /// + static class WM { + public const int GETICON = 0x7f; + public const int SIZING = 0x214; + public const int NCHITTEST = 0x84; + public const int NCPAINT = 0x0085; + public const int LBUTTONDOWN = 0x0201; + public const int LBUTTONUP = 0x0202; + public const int LBUTTONDBLCLK = 0x0203; + public const int RBUTTONDOWN = 0x0204; + public const int RBUTTONUP = 0x0205; + public const int RBUTTONDBLCLK = 0x0206; + public const int NCLBUTTONUP = 0x00A2; + public const int NCLBUTTONDOWN = 0x00A1; + public const int NCLBUTTONDBLCLK = 0x00A3; + public const int NCRBUTTONUP = 0x00A5; + public const int NCMOUSELEAVE = 0x02A2; + public const int SYSCOMMAND = 0x0112; + public const int GETTEXT = 0x000D; + public const int GETTEXTLENGTH = 0x000E; + } +} diff --git a/OnTopReplica/Native/WMSZ.cs b/src/OnTopReplica/Native/WMSZ.cs similarity index 96% rename from OnTopReplica/Native/WMSZ.cs rename to src/OnTopReplica/Native/WMSZ.cs index 2052280..327a73b 100644 --- a/OnTopReplica/Native/WMSZ.cs +++ b/src/OnTopReplica/Native/WMSZ.cs @@ -1,15 +1,15 @@ -using System; -using System.Collections.Generic; -using System.Text; - -namespace OnTopReplica.Native { - /// - /// Native Win32 sizing codes (used by WM_SIZING message). - /// - static class WMSZ { - public const int LEFT = 1; - public const int RIGHT = 2; - public const int TOP = 3; - public const int BOTTOM = 6; - } -} +using System; +using System.Collections.Generic; +using System.Text; + +namespace OnTopReplica.Native { + /// + /// Native Win32 sizing codes (used by WM_SIZING message). + /// + static class WMSZ { + public const int LEFT = 1; + public const int RIGHT = 2; + public const int TOP = 3; + public const int BOTTOM = 6; + } +} diff --git a/OnTopReplica/Native/WindowManagerMethods.cs b/src/OnTopReplica/Native/WindowManagerMethods.cs similarity index 97% rename from OnTopReplica/Native/WindowManagerMethods.cs rename to src/OnTopReplica/Native/WindowManagerMethods.cs index 01eabc8..9fb556b 100644 --- a/OnTopReplica/Native/WindowManagerMethods.cs +++ b/src/OnTopReplica/Native/WindowManagerMethods.cs @@ -1,108 +1,108 @@ -using System; -using System.Collections.Generic; -using System.Text; -using System.Runtime.InteropServices; - -namespace OnTopReplica.Native { - /// - /// Common Win32 Window Manager native methods. - /// - static class WindowManagerMethods { - - [DllImport("user32.dll")] - public static extern IntPtr GetForegroundWindow(); - - [DllImport("user32.dll")] - public static extern IntPtr RealChildWindowFromPoint(IntPtr parent, NPoint point); - - [return: MarshalAs(UnmanagedType.Bool)] - public delegate bool EnumWindowsProc(IntPtr hWnd, IntPtr lParam); - - [DllImport("user32.dll")] - [return: MarshalAs(UnmanagedType.Bool)] - public static extern bool EnumWindows(EnumWindowsProc lpEnumFunc, IntPtr lParam); - - [DllImport("user32.dll")] - [return: MarshalAs(UnmanagedType.Bool)] - public static extern bool EnumChildWindows(IntPtr hWnd, EnumWindowsProc lpEnumFunc, IntPtr lParam); - - [DllImport("user32.dll")] - [return: MarshalAs(UnmanagedType.Bool)] - public static extern bool IsWindowVisible(IntPtr hWnd); - - [DllImport("user32.dll")] - public static extern IntPtr GetDesktopWindow(); - - [DllImport("user32.dll")] - static extern bool ClientToScreen(IntPtr hwnd, ref NPoint point); - - /// - /// Converts a point in client coordinates of a window to screen coordinates. - /// - /// Handle to the window of the original point. - /// Point expressed in client coordinates. - /// Point expressed in screen coordinates. - public static NPoint ClientToScreen(IntPtr hwnd, NPoint clientPoint) { - NPoint localCopy = new NPoint(clientPoint); - - if (ClientToScreen(hwnd, ref localCopy)) - return localCopy; - else - return new NPoint(); - } - - [DllImport("user32.dll")] - static extern bool ScreenToClient(IntPtr hwnd, ref NPoint point); - - /// - /// Converts a point in screen coordinates in client coordinates relative to a window. - /// - /// Handle of the window whose client coordinate system should be used. - /// Point expressed in screen coordinates. - /// Point expressed in client coordinates. - public static NPoint ScreenToClient(IntPtr hwnd, NPoint screenPoint) { - NPoint localCopy = new NPoint(screenPoint); - - if (ScreenToClient(hwnd, ref localCopy)) - return localCopy; - else - return new NPoint(); - } - - [DllImport("user32.dll", CharSet = CharSet.Auto)] - public static extern IntPtr GetParent(IntPtr hWnd); - - [DllImport("User32", CharSet = CharSet.Auto)] - public static extern IntPtr SetParent(IntPtr hWndChild, IntPtr hWndParent); - - [DllImport("user32.dll", SetLastError = false)] - public static extern bool SetForegroundWindow(IntPtr hwnd); - - public enum GetWindowMode : uint { - GW_HWNDFIRST = 0, - GW_HWNDLAST = 1, - GW_HWNDNEXT = 2, - GW_HWNDPREV = 3, - GW_OWNER = 4, - GW_CHILD = 5, - GW_ENABLEDPOPUP = 6 - } - - [DllImport("user32.dll")] - public static extern IntPtr GetWindow(IntPtr hwnd, GetWindowMode mode); - - /// - /// Checks whether a window is a top-level window (has no owner nor parent window). - /// - /// Handle to the window to check. - public static bool IsTopLevel(IntPtr hwnd) { - bool hasParent = WindowManagerMethods.GetParent(hwnd).ToInt64() != 0; - bool hasOwner = WindowManagerMethods.GetWindow(hwnd, WindowManagerMethods.GetWindowMode.GW_OWNER).ToInt64() != 0; - - return (!hasParent && !hasOwner); - } - - [DllImport("user32.dll")] - public static extern IntPtr FindWindow(string className, string windowName); - } -} +using System; +using System.Collections.Generic; +using System.Text; +using System.Runtime.InteropServices; + +namespace OnTopReplica.Native { + /// + /// Common Win32 Window Manager native methods. + /// + static class WindowManagerMethods { + + [DllImport("user32.dll")] + public static extern IntPtr GetForegroundWindow(); + + [DllImport("user32.dll")] + public static extern IntPtr RealChildWindowFromPoint(IntPtr parent, NPoint point); + + [return: MarshalAs(UnmanagedType.Bool)] + public delegate bool EnumWindowsProc(IntPtr hWnd, IntPtr lParam); + + [DllImport("user32.dll")] + [return: MarshalAs(UnmanagedType.Bool)] + public static extern bool EnumWindows(EnumWindowsProc lpEnumFunc, IntPtr lParam); + + [DllImport("user32.dll")] + [return: MarshalAs(UnmanagedType.Bool)] + public static extern bool EnumChildWindows(IntPtr hWnd, EnumWindowsProc lpEnumFunc, IntPtr lParam); + + [DllImport("user32.dll")] + [return: MarshalAs(UnmanagedType.Bool)] + public static extern bool IsWindowVisible(IntPtr hWnd); + + [DllImport("user32.dll")] + public static extern IntPtr GetDesktopWindow(); + + [DllImport("user32.dll")] + static extern bool ClientToScreen(IntPtr hwnd, ref NPoint point); + + /// + /// Converts a point in client coordinates of a window to screen coordinates. + /// + /// Handle to the window of the original point. + /// Point expressed in client coordinates. + /// Point expressed in screen coordinates. + public static NPoint ClientToScreen(IntPtr hwnd, NPoint clientPoint) { + NPoint localCopy = new NPoint(clientPoint); + + if (ClientToScreen(hwnd, ref localCopy)) + return localCopy; + else + return new NPoint(); + } + + [DllImport("user32.dll")] + static extern bool ScreenToClient(IntPtr hwnd, ref NPoint point); + + /// + /// Converts a point in screen coordinates in client coordinates relative to a window. + /// + /// Handle of the window whose client coordinate system should be used. + /// Point expressed in screen coordinates. + /// Point expressed in client coordinates. + public static NPoint ScreenToClient(IntPtr hwnd, NPoint screenPoint) { + NPoint localCopy = new NPoint(screenPoint); + + if (ScreenToClient(hwnd, ref localCopy)) + return localCopy; + else + return new NPoint(); + } + + [DllImport("user32.dll", CharSet = CharSet.Auto)] + public static extern IntPtr GetParent(IntPtr hWnd); + + [DllImport("User32", CharSet = CharSet.Auto)] + public static extern IntPtr SetParent(IntPtr hWndChild, IntPtr hWndParent); + + [DllImport("user32.dll", SetLastError = false)] + public static extern bool SetForegroundWindow(IntPtr hwnd); + + public enum GetWindowMode : uint { + GW_HWNDFIRST = 0, + GW_HWNDLAST = 1, + GW_HWNDNEXT = 2, + GW_HWNDPREV = 3, + GW_OWNER = 4, + GW_CHILD = 5, + GW_ENABLEDPOPUP = 6 + } + + [DllImport("user32.dll")] + public static extern IntPtr GetWindow(IntPtr hwnd, GetWindowMode mode); + + /// + /// Checks whether a window is a top-level window (has no owner nor parent window). + /// + /// Handle to the window to check. + public static bool IsTopLevel(IntPtr hwnd) { + bool hasParent = WindowManagerMethods.GetParent(hwnd).ToInt64() != 0; + bool hasOwner = WindowManagerMethods.GetWindow(hwnd, WindowManagerMethods.GetWindowMode.GW_OWNER).ToInt64() != 0; + + return (!hasParent && !hasOwner); + } + + [DllImport("user32.dll")] + public static extern IntPtr FindWindow(string className, string windowName); + } +} diff --git a/OnTopReplica/Native/WindowMethods.cs b/src/OnTopReplica/Native/WindowMethods.cs similarity index 97% rename from OnTopReplica/Native/WindowMethods.cs rename to src/OnTopReplica/Native/WindowMethods.cs index 3fc2bcb..ca0d748 100644 --- a/OnTopReplica/Native/WindowMethods.cs +++ b/src/OnTopReplica/Native/WindowMethods.cs @@ -1,181 +1,181 @@ -using System; -using System.Collections.Generic; -using System.Text; -using System.Runtime.InteropServices; - -namespace OnTopReplica.Native { - /// - /// Common Win32 methods for operating on windows. - /// - static class WindowMethods { - - public static System.Drawing.Point GetCursorPos() { - NPoint ret; - if (GetCursorPosInternal(out ret)) - return ret.ToPoint(); - else { -#if DEBUG - throw new InvalidOperationException("Unable to GetCursorPos"); -#else - return default(System.Drawing.Point); -#endif - } - } - - [DllImport("user32.dll", EntryPoint="GetCursorPos")] - private static extern bool GetCursorPosInternal(out NPoint point); - - [DllImport("user32.dll", SetLastError = true)] - public static extern bool GetClientRect(IntPtr handle, out NRectangle rect); - - [DllImport("user32.dll", SetLastError = true)] - public static extern bool GetWindowRect(IntPtr handle, out NRectangle rect); - - [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)] - static extern int GetWindowText(IntPtr hWnd, [Out] StringBuilder lpString, int nMaxCount); - - [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)] - static extern int GetWindowTextLength(IntPtr hWnd); - - /// - /// Gets a window's text via API call. - /// - /// Window handle. - /// Title of the window. - public static string GetWindowText(IntPtr hwnd) { - int length = GetWindowTextLength(hwnd); - - if (length > 0) { - StringBuilder sb = new StringBuilder(length + 1); - if (WindowMethods.GetWindowText(hwnd, sb, sb.Capacity) > 0) - return sb.ToString(); - else - return String.Empty; - } - else - return String.Empty; - } - - public enum WindowLong { - WndProc = (-4), - HInstance = (-6), - HwndParent = (-8), - Style = (-16), - ExStyle = (-20), - UserData = (-21), - Id = (-12) - } - - [Flags] - public enum WindowStyles : long { - None = 0, - Child = 0x40000000L, - Disabled = 0x8000000L, - Minimize = 0x20000000L, - MinimizeBox = 0x20000L, - Visible = 0x10000000L - } - - [Flags] - public enum WindowExStyles : long { - AppWindow = 0x40000, - Layered = 0x80000, - NoActivate = 0x8000000L, - ToolWindow = 0x80, - TopMost = 8, - Transparent = 0x20 - } - - public static IntPtr GetWindowLong(IntPtr hWnd, WindowLong i) { - if (IntPtr.Size == 8) { - return GetWindowLongPtr64(hWnd, i); - } - else { - return new IntPtr(GetWindowLong32(hWnd, i)); - } - } - - [DllImport("user32.dll", EntryPoint = "GetWindowLong")] - static extern int GetWindowLong32(IntPtr hWnd, WindowLong nIndex); - - [DllImport("user32.dll", EntryPoint = "GetWindowLongPtr")] - static extern IntPtr GetWindowLongPtr64(IntPtr hWnd, WindowLong nIndex); - - public static IntPtr SetWindowLong(IntPtr hWnd, WindowLong i, IntPtr dwNewLong) { - if (IntPtr.Size == 8) { - return SetWindowLongPtr64(hWnd, i, dwNewLong); - } - else { - return new IntPtr(SetWindowLong32(hWnd, i, dwNewLong.ToInt32())); - } - } - - [DllImport("user32.dll", EntryPoint = "SetWindowLong")] - static extern int SetWindowLong32(IntPtr hWnd, WindowLong nIndex, int dwNewLong); - - [DllImport("user32.dll", EntryPoint = "SetWindowLongPtr")] - static extern IntPtr SetWindowLongPtr64(IntPtr hWnd, WindowLong nIndex, IntPtr dwNewLong); - - #region Window class - - const int MaxClassLength = 255; - - public static string GetWindowClass(IntPtr hwnd) { - var sb = new StringBuilder(MaxClassLength + 1); - RealGetWindowClass(hwnd, sb, MaxClassLength); - return sb.ToString(); - } - - [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)] - static extern uint RealGetWindowClass(IntPtr hwnd, [Out] StringBuilder lpString, uint maxCount); - - public enum ClassLong { - Icon = -14, - IconSmall = -34 - } - - [DllImport("user32.dll", EntryPoint = "GetClassLongPtrW")] - static extern IntPtr GetClassLong64(IntPtr hWnd, int nIndex); - - [DllImport("user32.dll", EntryPoint = "GetClassLongW")] - static extern int GetClassLong32(IntPtr hWnd, int nIndex); - - public static IntPtr GetClassLong(IntPtr hWnd, ClassLong i) { - if (IntPtr.Size == 8) { - return GetClassLong64(hWnd, (int)i); - } - else { - return new IntPtr(GetClassLong32(hWnd, (int)i)); - } - } - - #endregion - - [DllImport("user32.dll")] - public static extern IntPtr GetMenu(IntPtr hwnd); - - /// - /// Converts client size rectangle to window rectangle, according to window styles. - /// - /// Client area bounding box. - /// Style of window to compute. - /// Extended style of window to compute. - public static NRectangle ConvertClientToWindowRect(NRectangle clientRectangle, long windowStyle, long extendedWindowStyle) { - NRectangle tmp = clientRectangle; - if (AdjustWindowRectEx(ref tmp, windowStyle, false, extendedWindowStyle)) { - return tmp; - } - else { -#if DEBUG - throw new InvalidOperationException("Failed to convert client rectangle to window rectangle"); -#else - return clientRectangle; -#endif - } - } - - [DllImport("user32.dll")] - private static extern bool AdjustWindowRectEx(ref NRectangle clientToWindowRect, long windowStyle, bool hasMenu, long extendedWindowStyle); - - } -} +using System; +using System.Collections.Generic; +using System.Text; +using System.Runtime.InteropServices; + +namespace OnTopReplica.Native { + /// + /// Common Win32 methods for operating on windows. + /// + static class WindowMethods { + + public static System.Drawing.Point GetCursorPos() { + NPoint ret; + if (GetCursorPosInternal(out ret)) + return ret.ToPoint(); + else { +#if DEBUG + throw new InvalidOperationException("Unable to GetCursorPos"); +#else + return default(System.Drawing.Point); +#endif + } + } + + [DllImport("user32.dll", EntryPoint="GetCursorPos")] + private static extern bool GetCursorPosInternal(out NPoint point); + + [DllImport("user32.dll", SetLastError = true)] + public static extern bool GetClientRect(IntPtr handle, out NRectangle rect); + + [DllImport("user32.dll", SetLastError = true)] + public static extern bool GetWindowRect(IntPtr handle, out NRectangle rect); + + [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)] + static extern int GetWindowText(IntPtr hWnd, [Out] StringBuilder lpString, int nMaxCount); + + [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)] + static extern int GetWindowTextLength(IntPtr hWnd); + + /// + /// Gets a window's text via API call. + /// + /// Window handle. + /// Title of the window. + public static string GetWindowText(IntPtr hwnd) { + int length = GetWindowTextLength(hwnd); + + if (length > 0) { + StringBuilder sb = new StringBuilder(length + 1); + if (WindowMethods.GetWindowText(hwnd, sb, sb.Capacity) > 0) + return sb.ToString(); + else + return String.Empty; + } + else + return String.Empty; + } + + public enum WindowLong { + WndProc = (-4), + HInstance = (-6), + HwndParent = (-8), + Style = (-16), + ExStyle = (-20), + UserData = (-21), + Id = (-12) + } + + [Flags] + public enum WindowStyles : long { + None = 0, + Child = 0x40000000L, + Disabled = 0x8000000L, + Minimize = 0x20000000L, + MinimizeBox = 0x20000L, + Visible = 0x10000000L + } + + [Flags] + public enum WindowExStyles : long { + AppWindow = 0x40000, + Layered = 0x80000, + NoActivate = 0x8000000L, + ToolWindow = 0x80, + TopMost = 8, + Transparent = 0x20 + } + + public static IntPtr GetWindowLong(IntPtr hWnd, WindowLong i) { + if (IntPtr.Size == 8) { + return GetWindowLongPtr64(hWnd, i); + } + else { + return new IntPtr(GetWindowLong32(hWnd, i)); + } + } + + [DllImport("user32.dll", EntryPoint = "GetWindowLong")] + static extern int GetWindowLong32(IntPtr hWnd, WindowLong nIndex); + + [DllImport("user32.dll", EntryPoint = "GetWindowLongPtr")] + static extern IntPtr GetWindowLongPtr64(IntPtr hWnd, WindowLong nIndex); + + public static IntPtr SetWindowLong(IntPtr hWnd, WindowLong i, IntPtr dwNewLong) { + if (IntPtr.Size == 8) { + return SetWindowLongPtr64(hWnd, i, dwNewLong); + } + else { + return new IntPtr(SetWindowLong32(hWnd, i, dwNewLong.ToInt32())); + } + } + + [DllImport("user32.dll", EntryPoint = "SetWindowLong")] + static extern int SetWindowLong32(IntPtr hWnd, WindowLong nIndex, int dwNewLong); + + [DllImport("user32.dll", EntryPoint = "SetWindowLongPtr")] + static extern IntPtr SetWindowLongPtr64(IntPtr hWnd, WindowLong nIndex, IntPtr dwNewLong); + + #region Window class + + const int MaxClassLength = 255; + + public static string GetWindowClass(IntPtr hwnd) { + var sb = new StringBuilder(MaxClassLength + 1); + RealGetWindowClass(hwnd, sb, MaxClassLength); + return sb.ToString(); + } + + [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)] + static extern uint RealGetWindowClass(IntPtr hwnd, [Out] StringBuilder lpString, uint maxCount); + + public enum ClassLong { + Icon = -14, + IconSmall = -34 + } + + [DllImport("user32.dll", EntryPoint = "GetClassLongPtrW")] + static extern IntPtr GetClassLong64(IntPtr hWnd, int nIndex); + + [DllImport("user32.dll", EntryPoint = "GetClassLongW")] + static extern int GetClassLong32(IntPtr hWnd, int nIndex); + + public static IntPtr GetClassLong(IntPtr hWnd, ClassLong i) { + if (IntPtr.Size == 8) { + return GetClassLong64(hWnd, (int)i); + } + else { + return new IntPtr(GetClassLong32(hWnd, (int)i)); + } + } + + #endregion + + [DllImport("user32.dll")] + public static extern IntPtr GetMenu(IntPtr hwnd); + + /// + /// Converts client size rectangle to window rectangle, according to window styles. + /// + /// Client area bounding box. + /// Style of window to compute. + /// Extended style of window to compute. + public static NRectangle ConvertClientToWindowRect(NRectangle clientRectangle, long windowStyle, long extendedWindowStyle) { + NRectangle tmp = clientRectangle; + if (AdjustWindowRectEx(ref tmp, windowStyle, false, extendedWindowStyle)) { + return tmp; + } + else { +#if DEBUG + throw new InvalidOperationException("Failed to convert client rectangle to window rectangle"); +#else + return clientRectangle; +#endif + } + } + + [DllImport("user32.dll")] + private static extern bool AdjustWindowRectEx(ref NRectangle clientToWindowRect, long windowStyle, bool hasMenu, long extendedWindowStyle); + + } +} diff --git a/OnTopReplica/Native/WindowsSevenMethods.cs b/src/OnTopReplica/Native/WindowsSevenMethods.cs similarity index 96% rename from OnTopReplica/Native/WindowsSevenMethods.cs rename to src/OnTopReplica/Native/WindowsSevenMethods.cs index 88e5cf5..f41eda8 100644 --- a/OnTopReplica/Native/WindowsSevenMethods.cs +++ b/src/OnTopReplica/Native/WindowsSevenMethods.cs @@ -1,20 +1,20 @@ -using System; -using System.Collections.Generic; -using System.Text; -using System.Runtime.InteropServices; - -namespace OnTopReplica.Native { - - static class WindowsSevenMethods { - - [DllImport("shell32.dll")] - internal static extern void SetCurrentProcessExplicitAppUserModelID( - [MarshalAs(UnmanagedType.LPWStr)] string appId); - - [DllImport("shell32.dll")] - internal static extern void GetCurrentProcessExplicitAppUserModelID( - [Out(), MarshalAs(UnmanagedType.LPWStr)] out string appId); - - } - -} +using System; +using System.Collections.Generic; +using System.Text; +using System.Runtime.InteropServices; + +namespace OnTopReplica.Native { + + static class WindowsSevenMethods { + + [DllImport("shell32.dll")] + internal static extern void SetCurrentProcessExplicitAppUserModelID( + [MarshalAs(UnmanagedType.LPWStr)] string appId); + + [DllImport("shell32.dll")] + internal static extern void GetCurrentProcessExplicitAppUserModelID( + [Out(), MarshalAs(UnmanagedType.LPWStr)] out string appId); + + } + +} diff --git a/OnTopReplica/NativeToolStripRenderer.cs b/src/OnTopReplica/NativeToolStripRenderer.cs similarity index 97% rename from OnTopReplica/NativeToolStripRenderer.cs rename to src/OnTopReplica/NativeToolStripRenderer.cs index 4427e04..3389b63 100644 --- a/OnTopReplica/NativeToolStripRenderer.cs +++ b/src/OnTopReplica/NativeToolStripRenderer.cs @@ -1,601 +1,601 @@ -using System; -using System.Collections.Generic; -using System.Text; -using System.Drawing; -using System.Diagnostics.CodeAnalysis; -using System.Windows.Forms; -using System.Windows.Forms.VisualStyles; -using System.Runtime.InteropServices; - -namespace Asztal.Szótár { - public enum ToolbarTheme { - Toolbar, - MediaToolbar, - CommunicationsToolbar, - BrowserTabBar - } - - /// - /// Renders a toolstrip using the UxTheme API via VisualStyleRenderer. Visual styles must be supported for this to work; if you need to support other operating systems use - /// - class UXThemeToolStripRenderer : ToolStripSystemRenderer { - /// - /// It shouldn't be necessary to P/Invoke like this, however a bug in VisualStyleRenderer.GetMargins forces my hand. - /// - static internal class NativeMethods { - [StructLayout(LayoutKind.Sequential, Pack = 1)] - public struct MARGINS { - public int cxLeftWidth; - public int cxRightWidth; - public int cyTopHeight; - public int cyBottomHeight; - } - - [DllImport("uxtheme", ExactSpelling = true)] - public extern static Int32 GetThemeMargins(IntPtr hTheme, IntPtr hdc, int iPartId, int iStateId, int iPropId, IntPtr rect, out MARGINS pMargins); - } - - //See http://msdn2.microsoft.com/en-us/library/bb773210.aspx - "Parts and States" - #region Parts and States - - enum MenuParts : int { - MENU_MENUITEM_TMSCHEMA = 1, - MENU_MENUDROPDOWN_TMSCHEMA = 2, - MENU_MENUBARITEM_TMSCHEMA = 3, - MENU_MENUBARDROPDOWN_TMSCHEMA = 4, - MENU_CHEVRON_TMSCHEMA = 5, - MENU_SEPARATOR_TMSCHEMA = 6, - MENU_BARBACKGROUND = 7, - MENU_BARITEM = 8, - MENU_POPUPBACKGROUND = 9, - MENU_POPUPBORDERS = 10, - MENU_POPUPCHECK = 11, - MENU_POPUPCHECKBACKGROUND = 12, - MENU_POPUPGUTTER = 13, - MENU_POPUPITEM = 14, - MENU_POPUPSEPARATOR = 15, - MENU_POPUPSUBMENU = 16, - MENU_SYSTEMCLOSE = 17, - MENU_SYSTEMMAXIMIZE = 18, - MENU_SYSTEMMINIMIZE = 19, - MENU_SYSTEMRESTORE = 20 - } - - enum MenuBarStates : int { - MB_ACTIVE = 1, - MB_INACTIVE = 2 - } - - enum MenuBarItemStates : int { - MBI_NORMAL = 1, - MBI_HOT = 2, - MBI_PUSHED = 3, - MBI_DISABLED = 4, - MBI_DISABLEDHOT = 5, - MBI_DISABLEDPUSHED = 6 - } - - enum MenuPopupItemStates : int { - MPI_NORMAL = 1, - MPI_HOT = 2, - MPI_DISABLED = 3, - MPI_DISABLEDHOT = 4 - } - - enum MenuPopupCheckStates : int { - MC_CHECKMARKNORMAL = 1, - MC_CHECKMARKDISABLED = 2, - MC_BULLETNORMAL = 3, - MC_BULLETDISABLED = 4 - } - - enum MenuPopupCheckBackgroundStates : int { - MCB_DISABLED = 1, - MCB_NORMAL = 2, - MCB_BITMAP = 3 - } - - enum MenuPopupSubMenuStates : int { - MSM_NORMAL = 1, - MSM_DISABLED = 2 - } - - enum MarginTypes : int { - TMT_SIZINGMARGINS = 3601, - TMT_CONTENTMARGINS = 3602, - TMT_CAPTIONMARGINS = 3603 - } - - const int RP_BACKGROUND = 6; - - #endregion - - #region Theme helpers - - Padding GetThemeMargins(IDeviceContext dc, MarginTypes marginType) { - NativeMethods.MARGINS margins; - try { - IntPtr hDC = dc.GetHdc(); - if (0 == NativeMethods.GetThemeMargins(renderer.Handle, hDC, renderer.Part, renderer.State, (int)marginType, IntPtr.Zero, out margins)) - return new Padding(margins.cxLeftWidth, margins.cyTopHeight, margins.cxRightWidth, margins.cyBottomHeight); - return new Padding(-1); - } finally { - dc.ReleaseHdc(); - } - } - - private static int GetItemState(ToolStripItem item) { - bool pressed = item.Pressed; - bool hot = item.Selected; - - if (item.Owner.IsDropDown) { - if (item.Enabled) - return hot ? (int)MenuPopupItemStates.MPI_HOT : (int)MenuPopupItemStates.MPI_NORMAL; - return hot ? (int)MenuPopupItemStates.MPI_DISABLEDHOT : (int)MenuPopupItemStates.MPI_DISABLED; - } else { - if (pressed) - return item.Enabled ? (int)MenuBarItemStates.MBI_PUSHED : (int)MenuBarItemStates.MBI_DISABLEDPUSHED; - if (item.Enabled) - return hot ? (int)MenuBarItemStates.MBI_HOT : (int)MenuBarItemStates.MBI_NORMAL; - return hot ? (int)MenuBarItemStates.MBI_DISABLEDHOT : (int)MenuBarItemStates.MBI_DISABLED; - } - } - - #endregion - - #region Theme subclasses - - public ToolbarTheme Theme { - get; set; - } - - private string RebarClass { - get { - return SubclassPrefix + "Rebar"; - } - } - - private string ToolbarClass { - get { - return SubclassPrefix + "ToolBar"; - } - } - - private string MenuClass { - get { - return SubclassPrefix + "Menu"; - } - } - - private string SubclassPrefix { - get { - switch (Theme) { - case ToolbarTheme.MediaToolbar: return "Media::"; - case ToolbarTheme.CommunicationsToolbar: return "Communications::"; - case ToolbarTheme.BrowserTabBar: return "BrowserTabBar::"; - default: return string.Empty; - } - } - } - - private VisualStyleElement Subclass(VisualStyleElement element) { - return VisualStyleElement.CreateElement(SubclassPrefix + element.ClassName, - element.Part, element.State); - } - - #endregion - - VisualStyleRenderer renderer; - - public UXThemeToolStripRenderer(ToolbarTheme theme) { - Theme = theme; - renderer = new VisualStyleRenderer(VisualStyleElement.Button.PushButton.Normal); - } - - #region Borders - protected override void OnRenderToolStripBorder(ToolStripRenderEventArgs e) { - renderer.SetParameters(MenuClass, (int)MenuParts.MENU_POPUPBORDERS, 0); - if (e.ToolStrip.IsDropDown) { - Region oldClip = e.Graphics.Clip; - - //Tool strip borders are rendered *after* the content, for some reason. - //So we have to exclude the inside of the popup otherwise we'll draw over it. - Rectangle insideRect = e.ToolStrip.ClientRectangle; - insideRect.Inflate(-1, -1); - e.Graphics.ExcludeClip(insideRect); - - renderer.DrawBackground(e.Graphics, e.ToolStrip.ClientRectangle, e.AffectedBounds); - - //Restore the old clip in case the Graphics is used again (does that ever happen?) - e.Graphics.Clip = oldClip; - } - } - #endregion - - #region Backgrounds - protected override void OnRenderMenuItemBackground(ToolStripItemRenderEventArgs e) { - int partId = e.Item.Owner.IsDropDown ? (int)MenuParts.MENU_POPUPITEM : (int)MenuParts.MENU_BARITEM; - renderer.SetParameters(MenuClass, partId, GetItemState(e.Item)); - - Rectangle bgRect = e.Item.ContentRectangle; - - Padding content = GetThemeMargins(e.Graphics, MarginTypes.TMT_CONTENTMARGINS), - sizing = GetThemeMargins(e.Graphics, MarginTypes.TMT_SIZINGMARGINS), - caption = GetThemeMargins(e.Graphics, MarginTypes.TMT_CAPTIONMARGINS); - - if (!e.Item.Owner.IsDropDown) { - bgRect.Y = 0; - bgRect.Height = e.ToolStrip.Height; - bgRect.Inflate(-1, -1); //GetMargins here perhaps? - } - - renderer.DrawBackground(e.Graphics, bgRect, bgRect); - } - - protected override void OnRenderToolStripPanelBackground(ToolStripPanelRenderEventArgs e) { - //Draw the background using Rebar & RP_BACKGROUND (or, if that is not available, fall back to - //Rebar.Band.Normal) - if (VisualStyleRenderer.IsElementDefined(VisualStyleElement.CreateElement(RebarClass, RP_BACKGROUND, 0))) { - renderer.SetParameters(RebarClass, RP_BACKGROUND, 0); - } else { - renderer.SetParameters(RebarClass, 0, 0); - //renderer.SetParameters(VisualStyleElement.Taskbar.BackgroundBottom.Normal); - //renderer.SetParameters(Subclass(VisualStyleElement.Rebar.Band.Normal)); - } - - if (renderer.IsBackgroundPartiallyTransparent()) - renderer.DrawParentBackground(e.Graphics, e.ToolStripPanel.ClientRectangle, e.ToolStripPanel); - - renderer.DrawBackground(e.Graphics, e.ToolStripPanel.ClientRectangle); - - //Draw the etched edges of each row. - //renderer.SetParameters(Subclass(VisualStyleElement.Rebar.Band.Normal)); - //foreach (ToolStripPanelRow row in e.ToolStripPanel.Rows) { - // Rectangle rowBounds = row.Bounds; - // rowBounds.Offset(0, -1); - // renderer.DrawEdge(e.Graphics, rowBounds, Edges.Top, EdgeStyle.Etched, EdgeEffects.None); - //} - - e.Handled = true; - } - - //Render the background of an actual menu bar, dropdown menu or toolbar. - protected override void OnRenderToolStripBackground(System.Windows.Forms.ToolStripRenderEventArgs e) { - if (e.ToolStrip.IsDropDown) { - renderer.SetParameters(MenuClass, (int)MenuParts.MENU_POPUPBACKGROUND, 0); - } else { - //It's a MenuStrip or a ToolStrip. If it's contained inside a larger panel, it should have a - //transparent background, showing the panel's background. - - if (e.ToolStrip.Parent is ToolStripPanel) { - //The background should be transparent, because the ToolStripPanel's background will be visible. - //(Of course, we assume the ToolStripPanel is drawn using the same theme, but it's not my fault - //if someone does that.) - return; - } else { - //A lone toolbar/menubar should act like it's inside a toolbox, I guess. - //Maybe I should use the MenuClass in the case of a MenuStrip, although that would break - //the other themes... - if(VisualStyleRenderer.IsElementDefined(VisualStyleElement.CreateElement(RebarClass, RP_BACKGROUND, 0))) - renderer.SetParameters(RebarClass, RP_BACKGROUND, 0); - else - renderer.SetParameters(RebarClass, 0, 0); - } - } - - if (renderer.IsBackgroundPartiallyTransparent()) - renderer.DrawParentBackground(e.Graphics, e.ToolStrip.ClientRectangle, e.ToolStrip); - - renderer.DrawBackground(e.Graphics, e.ToolStrip.ClientRectangle, e.AffectedBounds); - } - - protected override void OnRenderToolStripContentPanelBackground(ToolStripContentPanelRenderEventArgs e) { - //e.Graphics.FillRectangle(Brushes.RosyBrown, e.ToolStripContentPanel.ClientRectangle); - //base.OnRenderToolStripContentPanelBackground(e); - } - - //Some sort of chevron thing? - //protected override void OnRenderOverflowButtonBackground(ToolStripItemRenderEventArgs e) { - // base.OnRenderOverflowButtonBackground(e); - //} - #endregion - - #region Text - protected override void OnRenderItemText(ToolStripItemTextRenderEventArgs e) { - int partId = e.Item.Owner.IsDropDown ? (int)MenuParts.MENU_POPUPITEM : (int)MenuParts.MENU_BARITEM; - renderer.SetParameters(MenuClass, partId, GetItemState(e.Item)); - Color color = renderer.GetColor(ColorProperty.TextColor); - - if(e.Item.Owner.IsDropDown || e.Item.Owner is MenuStrip) - e.TextColor = color; - - base.OnRenderItemText(e); - } - #endregion - - #region Glyphs - - //protected override void OnRenderGrip(ToolStripGripRenderEventArgs e) { - // if (e.GripStyle == ToolStripGripStyle.Visible) { - // renderer.SetParameters(VisualStyleElement.Rebar.Gripper.Normal); - // renderer.DrawBackground(e.Graphics, e.GripBounds, e.AffectedBounds); - // } - //} - - protected override void OnRenderImageMargin(ToolStripRenderEventArgs e) { - if (e.ToolStrip.IsDropDown) { - renderer.SetParameters(MenuClass, (int)MenuParts.MENU_POPUPGUTTER, 0); - Rectangle displayRect = e.ToolStrip.DisplayRectangle, - marginRect = new Rectangle(0, displayRect.Top, displayRect.Left, displayRect.Height); - //e.Graphics.DrawRectangle(Pens.Black, marginRect); - renderer.DrawBackground(e.Graphics, marginRect, marginRect); - } - } - - protected override void OnRenderSeparator(ToolStripSeparatorRenderEventArgs e) { - if (e.ToolStrip.IsDropDown) { - renderer.SetParameters(MenuClass, (int)MenuParts.MENU_POPUPSEPARATOR, 0); - Rectangle rect = new Rectangle(e.ToolStrip.DisplayRectangle.Left, 0, e.ToolStrip.DisplayRectangle.Width, e.Item.Height); - renderer.DrawBackground(e.Graphics, rect, rect); - } else { - base.OnRenderSeparator(e); - } - } - - protected override void OnRenderItemCheck(ToolStripItemImageRenderEventArgs e) { - ToolStripMenuItem item = e.Item as ToolStripMenuItem; - if (item != null) { - if (item.Checked) { - Rectangle rect = e.Item.ContentRectangle; - rect.Width = rect.Height; - - //Center the checkmark horizontally in the gutter (looks ugly, though) - //rect.X = (e.ToolStrip.DisplayRectangle.Left - rect.Width) / 2; - - renderer.SetParameters(MenuClass, (int)MenuParts.MENU_POPUPCHECKBACKGROUND, e.Item.Enabled ? (int)MenuPopupCheckBackgroundStates.MCB_NORMAL : (int)MenuPopupCheckBackgroundStates.MCB_DISABLED); - renderer.DrawBackground(e.Graphics, rect); - - Padding margins = GetThemeMargins(e.Graphics, MarginTypes.TMT_SIZINGMARGINS); - - rect = new Rectangle(rect.X + margins.Left, rect.Y + margins.Top, - rect.Width - margins.Horizontal, - rect.Height - margins.Vertical); - - //I don't think ToolStrip even supports radio box items. So no need to render them. - renderer.SetParameters(MenuClass, (int)MenuParts.MENU_POPUPCHECK, e.Item.Enabled ? (int)MenuPopupCheckStates.MC_CHECKMARKNORMAL : (int)MenuPopupCheckStates.MC_CHECKMARKDISABLED); - - renderer.DrawBackground(e.Graphics, rect); - } - } else { - base.OnRenderItemCheck(e); - } - } - - //This is broken for RTL - protected override void OnRenderArrow(ToolStripArrowRenderEventArgs e) { - int stateId = e.Item.Enabled ? (int)MenuPopupSubMenuStates.MSM_NORMAL : (int)MenuPopupSubMenuStates.MSM_DISABLED; - renderer.SetParameters(MenuClass, (int)MenuParts.MENU_POPUPSUBMENU, stateId); - renderer.DrawBackground(e.Graphics, e.ArrowRectangle); - } - - protected override void OnRenderOverflowButtonBackground(ToolStripItemRenderEventArgs e) { - renderer.SetParameters(RebarClass, VisualStyleElement.Rebar.Chevron.Normal.Part, VisualStyleElement.Rebar.Chevron.Normal.State); - renderer.DrawBackground(e.Graphics, e.Item.ContentRectangle); - - //base.OnRenderOverflowButtonBackground(e); - } - #endregion - - private static bool? _isSupportedCache = null; - - public static bool IsSupported { - get { - if (_isSupportedCache.HasValue) - return _isSupportedCache.Value; - - if (!VisualStyleRenderer.IsSupported) { - _isSupportedCache = false; - return false; - } - - _isSupportedCache = VisualStyleRenderer.IsElementDefined(VisualStyleElement.CreateElement("MENU", (int)MenuParts.MENU_BARBACKGROUND, (int)MenuBarStates.MB_ACTIVE)); - return _isSupportedCache.Value; - } - } - } - - /// - /// Renders a toolstrip using UXTheme if possible, and switches back to the default - /// ToolStripRenderer when UXTheme-based rendering is not available. - /// Designed for menu bars and context menus - it is not guaranteed to work with anything else. - /// - /// - /// NativeToolStripRenderer.SetToolStripRenderer(toolStrip1, toolStrip2, contextMenuStrip1); - /// - /// - /// toolStrip1.Renderer = new NativeToolStripRenderer(); - /// - public class NativeToolStripRenderer : ToolStripRenderer { - UXThemeToolStripRenderer nativeRenderer; - ToolStripRenderer defaultRenderer; - ToolStrip toolStrip; - - //NativeToolStripRenderer looks best with no padding - but keep the old padding in case the - //visual styles become unsupported again (e.g. user changes to windows classic skin) - Padding defaultPadding; - - #region Constructors - /// - /// Creates a NativeToolStripRenderer for a particular ToolStrip. NativeToolStripRenderer will subscribe to some events - /// of this ToolStrip. - /// - /// The toolstrip for this NativeToolStripRenderer. NativeToolStripRenderer will subscribe to some events - /// of this ToolStrip. - public NativeToolStripRenderer(ToolStrip toolStrip, ToolbarTheme theme) { - if (toolStrip == null) - throw new ArgumentNullException("toolStrip", "ToolStrip cannot be null."); - - Theme = theme; - - this.toolStrip = toolStrip; - defaultRenderer = toolStrip.Renderer; - - defaultPadding = toolStrip.Padding; - toolStrip.SystemColorsChanged += new EventHandler(toolStrip_SystemColorsChanged); - - //Can't initialize here - constructor throws if visual styles not enabled - //nativeRenderer = new NativeToolStripRenderer(); - } - - public NativeToolStripRenderer(ToolStripPanel panel, ToolbarTheme theme) { - if (panel == null) - throw new ArgumentNullException("panel", "Panel cannot be null."); - - Theme = theme; - - this.toolStrip = null; - defaultRenderer = panel.Renderer; - } - #endregion - - public ToolbarTheme Theme { get; set; } - - void toolStrip_SystemColorsChanged(object sender, EventArgs e) { - if (toolStrip == null) - return; - - if (UXThemeToolStripRenderer.IsSupported) - toolStrip.Padding = Padding.Empty; - else - toolStrip.Padding = defaultPadding; - } - - //This is indeed called every time a menu part is rendered, but I can't - //find a way of caching it that I can be sure has no race conditions. - //The check is no longer very costly, anyway. - protected ToolStripRenderer ActualRenderer { - get { - bool nativeSupported = UXThemeToolStripRenderer.IsSupported; - - if (nativeSupported) { - if (nativeRenderer == null) - nativeRenderer = new UXThemeToolStripRenderer(Theme); - return nativeRenderer; - } - - return defaultRenderer; - } - } - - #region InitializeXXX - protected override void Initialize(ToolStrip toolStrip) { - base.Initialize(toolStrip); - - toolStrip.Padding = Padding.Empty; - - if (/*!(toolStrip is MenuStrip) &&*/ toolStrip.Parent is ToolStripPanel) { - toolStrip.BackColor = Color.Transparent; - } - } - - protected override void InitializePanel(ToolStripPanel toolStripPanel) { - base.InitializePanel(toolStripPanel); - } - - protected override void InitializeItem(ToolStripItem item) { - base.InitializeItem(item); - } - #endregion - - #region SetToolStripRenderer - /// - /// Sets the renderer of each ToolStrip to a NativeToolStripRenderer. A convenience method. - /// - /// A parameter list of ToolStrips. - [SuppressMessage("Microsoft.Design", "CA1062")] //The parameter array is actually checked. - public static void SetToolStripRenderer(ToolbarTheme theme, params Control[] toolStrips) { - foreach (Control ts in toolStrips) { - if (ts == null) - throw new ArgumentNullException("toolStrips", "ToolStrips cannot contain a null reference."); - } - - foreach (Control ts in toolStrips) { - if (ts is ToolStrip) { - ToolStrip t = (ToolStrip)ts; - t.Renderer = new NativeToolStripRenderer(t, theme); - } else if (ts is ToolStripPanel) { - ToolStripPanel t = (ToolStripPanel)ts; - t.Renderer = new NativeToolStripRenderer(t, theme); - } else - throw new ArgumentException("Can't set the renderer for a " + ts.GetType().Name); - } - } - - public static void SetToolStripRenderer(params Control[] toolStrips) { - SetToolStripRenderer(ToolbarTheme.Toolbar, toolStrips); - } - #endregion - - #region Overridden Methods - Deferred to actual renderer - protected override void OnRenderArrow(ToolStripArrowRenderEventArgs e) { - ActualRenderer.DrawArrow(e); - } - - protected override void OnRenderButtonBackground(ToolStripItemRenderEventArgs e) { - ActualRenderer.DrawButtonBackground(e); - } - - protected override void OnRenderDropDownButtonBackground(ToolStripItemRenderEventArgs e) { - ActualRenderer.DrawDropDownButtonBackground(e); - } - - protected override void OnRenderGrip(ToolStripGripRenderEventArgs e) { - ActualRenderer.DrawGrip(e); - } - - protected override void OnRenderImageMargin(ToolStripRenderEventArgs e) { - ActualRenderer.DrawImageMargin(e); - } - - protected override void OnRenderItemBackground(ToolStripItemRenderEventArgs e) { - ActualRenderer.DrawItemBackground(e); - } - - protected override void OnRenderItemCheck(ToolStripItemImageRenderEventArgs e) { - ActualRenderer.DrawItemCheck(e); - } - - protected override void OnRenderItemImage(ToolStripItemImageRenderEventArgs e) { - ActualRenderer.DrawItemImage(e); - } - - protected override void OnRenderItemText(ToolStripItemTextRenderEventArgs e) { - ActualRenderer.DrawItemText(e); - } - - protected override void OnRenderMenuItemBackground(ToolStripItemRenderEventArgs e) { - ActualRenderer.DrawMenuItemBackground(e); - } - - protected override void OnRenderSeparator(ToolStripSeparatorRenderEventArgs e) { - ActualRenderer.DrawSeparator(e); - } - - protected override void OnRenderToolStripBackground(ToolStripRenderEventArgs e) { - ActualRenderer.DrawToolStripBackground(e); - } - - protected override void OnRenderToolStripBorder(ToolStripRenderEventArgs e) { - ActualRenderer.DrawToolStripBorder(e); - } - - protected override void OnRenderToolStripContentPanelBackground(ToolStripContentPanelRenderEventArgs e) { - ActualRenderer.DrawToolStripContentPanelBackground(e); - } - - protected override void OnRenderToolStripPanelBackground(ToolStripPanelRenderEventArgs e) { - ActualRenderer.DrawToolStripPanelBackground(e); - } - #endregion - } -} +using System; +using System.Collections.Generic; +using System.Text; +using System.Drawing; +using System.Diagnostics.CodeAnalysis; +using System.Windows.Forms; +using System.Windows.Forms.VisualStyles; +using System.Runtime.InteropServices; + +namespace Asztal.Szótár { + public enum ToolbarTheme { + Toolbar, + MediaToolbar, + CommunicationsToolbar, + BrowserTabBar + } + + /// + /// Renders a toolstrip using the UxTheme API via VisualStyleRenderer. Visual styles must be supported for this to work; if you need to support other operating systems use + /// + class UXThemeToolStripRenderer : ToolStripSystemRenderer { + /// + /// It shouldn't be necessary to P/Invoke like this, however a bug in VisualStyleRenderer.GetMargins forces my hand. + /// + static internal class NativeMethods { + [StructLayout(LayoutKind.Sequential, Pack = 1)] + public struct MARGINS { + public int cxLeftWidth; + public int cxRightWidth; + public int cyTopHeight; + public int cyBottomHeight; + } + + [DllImport("uxtheme", ExactSpelling = true)] + public extern static Int32 GetThemeMargins(IntPtr hTheme, IntPtr hdc, int iPartId, int iStateId, int iPropId, IntPtr rect, out MARGINS pMargins); + } + + //See http://msdn2.microsoft.com/en-us/library/bb773210.aspx - "Parts and States" + #region Parts and States + + enum MenuParts : int { + MENU_MENUITEM_TMSCHEMA = 1, + MENU_MENUDROPDOWN_TMSCHEMA = 2, + MENU_MENUBARITEM_TMSCHEMA = 3, + MENU_MENUBARDROPDOWN_TMSCHEMA = 4, + MENU_CHEVRON_TMSCHEMA = 5, + MENU_SEPARATOR_TMSCHEMA = 6, + MENU_BARBACKGROUND = 7, + MENU_BARITEM = 8, + MENU_POPUPBACKGROUND = 9, + MENU_POPUPBORDERS = 10, + MENU_POPUPCHECK = 11, + MENU_POPUPCHECKBACKGROUND = 12, + MENU_POPUPGUTTER = 13, + MENU_POPUPITEM = 14, + MENU_POPUPSEPARATOR = 15, + MENU_POPUPSUBMENU = 16, + MENU_SYSTEMCLOSE = 17, + MENU_SYSTEMMAXIMIZE = 18, + MENU_SYSTEMMINIMIZE = 19, + MENU_SYSTEMRESTORE = 20 + } + + enum MenuBarStates : int { + MB_ACTIVE = 1, + MB_INACTIVE = 2 + } + + enum MenuBarItemStates : int { + MBI_NORMAL = 1, + MBI_HOT = 2, + MBI_PUSHED = 3, + MBI_DISABLED = 4, + MBI_DISABLEDHOT = 5, + MBI_DISABLEDPUSHED = 6 + } + + enum MenuPopupItemStates : int { + MPI_NORMAL = 1, + MPI_HOT = 2, + MPI_DISABLED = 3, + MPI_DISABLEDHOT = 4 + } + + enum MenuPopupCheckStates : int { + MC_CHECKMARKNORMAL = 1, + MC_CHECKMARKDISABLED = 2, + MC_BULLETNORMAL = 3, + MC_BULLETDISABLED = 4 + } + + enum MenuPopupCheckBackgroundStates : int { + MCB_DISABLED = 1, + MCB_NORMAL = 2, + MCB_BITMAP = 3 + } + + enum MenuPopupSubMenuStates : int { + MSM_NORMAL = 1, + MSM_DISABLED = 2 + } + + enum MarginTypes : int { + TMT_SIZINGMARGINS = 3601, + TMT_CONTENTMARGINS = 3602, + TMT_CAPTIONMARGINS = 3603 + } + + const int RP_BACKGROUND = 6; + + #endregion + + #region Theme helpers + + Padding GetThemeMargins(IDeviceContext dc, MarginTypes marginType) { + NativeMethods.MARGINS margins; + try { + IntPtr hDC = dc.GetHdc(); + if (0 == NativeMethods.GetThemeMargins(renderer.Handle, hDC, renderer.Part, renderer.State, (int)marginType, IntPtr.Zero, out margins)) + return new Padding(margins.cxLeftWidth, margins.cyTopHeight, margins.cxRightWidth, margins.cyBottomHeight); + return new Padding(-1); + } finally { + dc.ReleaseHdc(); + } + } + + private static int GetItemState(ToolStripItem item) { + bool pressed = item.Pressed; + bool hot = item.Selected; + + if (item.Owner.IsDropDown) { + if (item.Enabled) + return hot ? (int)MenuPopupItemStates.MPI_HOT : (int)MenuPopupItemStates.MPI_NORMAL; + return hot ? (int)MenuPopupItemStates.MPI_DISABLEDHOT : (int)MenuPopupItemStates.MPI_DISABLED; + } else { + if (pressed) + return item.Enabled ? (int)MenuBarItemStates.MBI_PUSHED : (int)MenuBarItemStates.MBI_DISABLEDPUSHED; + if (item.Enabled) + return hot ? (int)MenuBarItemStates.MBI_HOT : (int)MenuBarItemStates.MBI_NORMAL; + return hot ? (int)MenuBarItemStates.MBI_DISABLEDHOT : (int)MenuBarItemStates.MBI_DISABLED; + } + } + + #endregion + + #region Theme subclasses + + public ToolbarTheme Theme { + get; set; + } + + private string RebarClass { + get { + return SubclassPrefix + "Rebar"; + } + } + + private string ToolbarClass { + get { + return SubclassPrefix + "ToolBar"; + } + } + + private string MenuClass { + get { + return SubclassPrefix + "Menu"; + } + } + + private string SubclassPrefix { + get { + switch (Theme) { + case ToolbarTheme.MediaToolbar: return "Media::"; + case ToolbarTheme.CommunicationsToolbar: return "Communications::"; + case ToolbarTheme.BrowserTabBar: return "BrowserTabBar::"; + default: return string.Empty; + } + } + } + + private VisualStyleElement Subclass(VisualStyleElement element) { + return VisualStyleElement.CreateElement(SubclassPrefix + element.ClassName, + element.Part, element.State); + } + + #endregion + + VisualStyleRenderer renderer; + + public UXThemeToolStripRenderer(ToolbarTheme theme) { + Theme = theme; + renderer = new VisualStyleRenderer(VisualStyleElement.Button.PushButton.Normal); + } + + #region Borders + protected override void OnRenderToolStripBorder(ToolStripRenderEventArgs e) { + renderer.SetParameters(MenuClass, (int)MenuParts.MENU_POPUPBORDERS, 0); + if (e.ToolStrip.IsDropDown) { + Region oldClip = e.Graphics.Clip; + + //Tool strip borders are rendered *after* the content, for some reason. + //So we have to exclude the inside of the popup otherwise we'll draw over it. + Rectangle insideRect = e.ToolStrip.ClientRectangle; + insideRect.Inflate(-1, -1); + e.Graphics.ExcludeClip(insideRect); + + renderer.DrawBackground(e.Graphics, e.ToolStrip.ClientRectangle, e.AffectedBounds); + + //Restore the old clip in case the Graphics is used again (does that ever happen?) + e.Graphics.Clip = oldClip; + } + } + #endregion + + #region Backgrounds + protected override void OnRenderMenuItemBackground(ToolStripItemRenderEventArgs e) { + int partId = e.Item.Owner.IsDropDown ? (int)MenuParts.MENU_POPUPITEM : (int)MenuParts.MENU_BARITEM; + renderer.SetParameters(MenuClass, partId, GetItemState(e.Item)); + + Rectangle bgRect = e.Item.ContentRectangle; + + Padding content = GetThemeMargins(e.Graphics, MarginTypes.TMT_CONTENTMARGINS), + sizing = GetThemeMargins(e.Graphics, MarginTypes.TMT_SIZINGMARGINS), + caption = GetThemeMargins(e.Graphics, MarginTypes.TMT_CAPTIONMARGINS); + + if (!e.Item.Owner.IsDropDown) { + bgRect.Y = 0; + bgRect.Height = e.ToolStrip.Height; + bgRect.Inflate(-1, -1); //GetMargins here perhaps? + } + + renderer.DrawBackground(e.Graphics, bgRect, bgRect); + } + + protected override void OnRenderToolStripPanelBackground(ToolStripPanelRenderEventArgs e) { + //Draw the background using Rebar & RP_BACKGROUND (or, if that is not available, fall back to + //Rebar.Band.Normal) + if (VisualStyleRenderer.IsElementDefined(VisualStyleElement.CreateElement(RebarClass, RP_BACKGROUND, 0))) { + renderer.SetParameters(RebarClass, RP_BACKGROUND, 0); + } else { + renderer.SetParameters(RebarClass, 0, 0); + //renderer.SetParameters(VisualStyleElement.Taskbar.BackgroundBottom.Normal); + //renderer.SetParameters(Subclass(VisualStyleElement.Rebar.Band.Normal)); + } + + if (renderer.IsBackgroundPartiallyTransparent()) + renderer.DrawParentBackground(e.Graphics, e.ToolStripPanel.ClientRectangle, e.ToolStripPanel); + + renderer.DrawBackground(e.Graphics, e.ToolStripPanel.ClientRectangle); + + //Draw the etched edges of each row. + //renderer.SetParameters(Subclass(VisualStyleElement.Rebar.Band.Normal)); + //foreach (ToolStripPanelRow row in e.ToolStripPanel.Rows) { + // Rectangle rowBounds = row.Bounds; + // rowBounds.Offset(0, -1); + // renderer.DrawEdge(e.Graphics, rowBounds, Edges.Top, EdgeStyle.Etched, EdgeEffects.None); + //} + + e.Handled = true; + } + + //Render the background of an actual menu bar, dropdown menu or toolbar. + protected override void OnRenderToolStripBackground(System.Windows.Forms.ToolStripRenderEventArgs e) { + if (e.ToolStrip.IsDropDown) { + renderer.SetParameters(MenuClass, (int)MenuParts.MENU_POPUPBACKGROUND, 0); + } else { + //It's a MenuStrip or a ToolStrip. If it's contained inside a larger panel, it should have a + //transparent background, showing the panel's background. + + if (e.ToolStrip.Parent is ToolStripPanel) { + //The background should be transparent, because the ToolStripPanel's background will be visible. + //(Of course, we assume the ToolStripPanel is drawn using the same theme, but it's not my fault + //if someone does that.) + return; + } else { + //A lone toolbar/menubar should act like it's inside a toolbox, I guess. + //Maybe I should use the MenuClass in the case of a MenuStrip, although that would break + //the other themes... + if(VisualStyleRenderer.IsElementDefined(VisualStyleElement.CreateElement(RebarClass, RP_BACKGROUND, 0))) + renderer.SetParameters(RebarClass, RP_BACKGROUND, 0); + else + renderer.SetParameters(RebarClass, 0, 0); + } + } + + if (renderer.IsBackgroundPartiallyTransparent()) + renderer.DrawParentBackground(e.Graphics, e.ToolStrip.ClientRectangle, e.ToolStrip); + + renderer.DrawBackground(e.Graphics, e.ToolStrip.ClientRectangle, e.AffectedBounds); + } + + protected override void OnRenderToolStripContentPanelBackground(ToolStripContentPanelRenderEventArgs e) { + //e.Graphics.FillRectangle(Brushes.RosyBrown, e.ToolStripContentPanel.ClientRectangle); + //base.OnRenderToolStripContentPanelBackground(e); + } + + //Some sort of chevron thing? + //protected override void OnRenderOverflowButtonBackground(ToolStripItemRenderEventArgs e) { + // base.OnRenderOverflowButtonBackground(e); + //} + #endregion + + #region Text + protected override void OnRenderItemText(ToolStripItemTextRenderEventArgs e) { + int partId = e.Item.Owner.IsDropDown ? (int)MenuParts.MENU_POPUPITEM : (int)MenuParts.MENU_BARITEM; + renderer.SetParameters(MenuClass, partId, GetItemState(e.Item)); + Color color = renderer.GetColor(ColorProperty.TextColor); + + if(e.Item.Owner.IsDropDown || e.Item.Owner is MenuStrip) + e.TextColor = color; + + base.OnRenderItemText(e); + } + #endregion + + #region Glyphs + + //protected override void OnRenderGrip(ToolStripGripRenderEventArgs e) { + // if (e.GripStyle == ToolStripGripStyle.Visible) { + // renderer.SetParameters(VisualStyleElement.Rebar.Gripper.Normal); + // renderer.DrawBackground(e.Graphics, e.GripBounds, e.AffectedBounds); + // } + //} + + protected override void OnRenderImageMargin(ToolStripRenderEventArgs e) { + if (e.ToolStrip.IsDropDown) { + renderer.SetParameters(MenuClass, (int)MenuParts.MENU_POPUPGUTTER, 0); + Rectangle displayRect = e.ToolStrip.DisplayRectangle, + marginRect = new Rectangle(0, displayRect.Top, displayRect.Left, displayRect.Height); + //e.Graphics.DrawRectangle(Pens.Black, marginRect); + renderer.DrawBackground(e.Graphics, marginRect, marginRect); + } + } + + protected override void OnRenderSeparator(ToolStripSeparatorRenderEventArgs e) { + if (e.ToolStrip.IsDropDown) { + renderer.SetParameters(MenuClass, (int)MenuParts.MENU_POPUPSEPARATOR, 0); + Rectangle rect = new Rectangle(e.ToolStrip.DisplayRectangle.Left, 0, e.ToolStrip.DisplayRectangle.Width, e.Item.Height); + renderer.DrawBackground(e.Graphics, rect, rect); + } else { + base.OnRenderSeparator(e); + } + } + + protected override void OnRenderItemCheck(ToolStripItemImageRenderEventArgs e) { + ToolStripMenuItem item = e.Item as ToolStripMenuItem; + if (item != null) { + if (item.Checked) { + Rectangle rect = e.Item.ContentRectangle; + rect.Width = rect.Height; + + //Center the checkmark horizontally in the gutter (looks ugly, though) + //rect.X = (e.ToolStrip.DisplayRectangle.Left - rect.Width) / 2; + + renderer.SetParameters(MenuClass, (int)MenuParts.MENU_POPUPCHECKBACKGROUND, e.Item.Enabled ? (int)MenuPopupCheckBackgroundStates.MCB_NORMAL : (int)MenuPopupCheckBackgroundStates.MCB_DISABLED); + renderer.DrawBackground(e.Graphics, rect); + + Padding margins = GetThemeMargins(e.Graphics, MarginTypes.TMT_SIZINGMARGINS); + + rect = new Rectangle(rect.X + margins.Left, rect.Y + margins.Top, + rect.Width - margins.Horizontal, + rect.Height - margins.Vertical); + + //I don't think ToolStrip even supports radio box items. So no need to render them. + renderer.SetParameters(MenuClass, (int)MenuParts.MENU_POPUPCHECK, e.Item.Enabled ? (int)MenuPopupCheckStates.MC_CHECKMARKNORMAL : (int)MenuPopupCheckStates.MC_CHECKMARKDISABLED); + + renderer.DrawBackground(e.Graphics, rect); + } + } else { + base.OnRenderItemCheck(e); + } + } + + //This is broken for RTL + protected override void OnRenderArrow(ToolStripArrowRenderEventArgs e) { + int stateId = e.Item.Enabled ? (int)MenuPopupSubMenuStates.MSM_NORMAL : (int)MenuPopupSubMenuStates.MSM_DISABLED; + renderer.SetParameters(MenuClass, (int)MenuParts.MENU_POPUPSUBMENU, stateId); + renderer.DrawBackground(e.Graphics, e.ArrowRectangle); + } + + protected override void OnRenderOverflowButtonBackground(ToolStripItemRenderEventArgs e) { + renderer.SetParameters(RebarClass, VisualStyleElement.Rebar.Chevron.Normal.Part, VisualStyleElement.Rebar.Chevron.Normal.State); + renderer.DrawBackground(e.Graphics, e.Item.ContentRectangle); + + //base.OnRenderOverflowButtonBackground(e); + } + #endregion + + private static bool? _isSupportedCache = null; + + public static bool IsSupported { + get { + if (_isSupportedCache.HasValue) + return _isSupportedCache.Value; + + if (!VisualStyleRenderer.IsSupported) { + _isSupportedCache = false; + return false; + } + + _isSupportedCache = VisualStyleRenderer.IsElementDefined(VisualStyleElement.CreateElement("MENU", (int)MenuParts.MENU_BARBACKGROUND, (int)MenuBarStates.MB_ACTIVE)); + return _isSupportedCache.Value; + } + } + } + + /// + /// Renders a toolstrip using UXTheme if possible, and switches back to the default + /// ToolStripRenderer when UXTheme-based rendering is not available. + /// Designed for menu bars and context menus - it is not guaranteed to work with anything else. + /// + /// + /// NativeToolStripRenderer.SetToolStripRenderer(toolStrip1, toolStrip2, contextMenuStrip1); + /// + /// + /// toolStrip1.Renderer = new NativeToolStripRenderer(); + /// + public class NativeToolStripRenderer : ToolStripRenderer { + UXThemeToolStripRenderer nativeRenderer; + ToolStripRenderer defaultRenderer; + ToolStrip toolStrip; + + //NativeToolStripRenderer looks best with no padding - but keep the old padding in case the + //visual styles become unsupported again (e.g. user changes to windows classic skin) + Padding defaultPadding; + + #region Constructors + /// + /// Creates a NativeToolStripRenderer for a particular ToolStrip. NativeToolStripRenderer will subscribe to some events + /// of this ToolStrip. + /// + /// The toolstrip for this NativeToolStripRenderer. NativeToolStripRenderer will subscribe to some events + /// of this ToolStrip. + public NativeToolStripRenderer(ToolStrip toolStrip, ToolbarTheme theme) { + if (toolStrip == null) + throw new ArgumentNullException("toolStrip", "ToolStrip cannot be null."); + + Theme = theme; + + this.toolStrip = toolStrip; + defaultRenderer = toolStrip.Renderer; + + defaultPadding = toolStrip.Padding; + toolStrip.SystemColorsChanged += new EventHandler(toolStrip_SystemColorsChanged); + + //Can't initialize here - constructor throws if visual styles not enabled + //nativeRenderer = new NativeToolStripRenderer(); + } + + public NativeToolStripRenderer(ToolStripPanel panel, ToolbarTheme theme) { + if (panel == null) + throw new ArgumentNullException("panel", "Panel cannot be null."); + + Theme = theme; + + this.toolStrip = null; + defaultRenderer = panel.Renderer; + } + #endregion + + public ToolbarTheme Theme { get; set; } + + void toolStrip_SystemColorsChanged(object sender, EventArgs e) { + if (toolStrip == null) + return; + + if (UXThemeToolStripRenderer.IsSupported) + toolStrip.Padding = Padding.Empty; + else + toolStrip.Padding = defaultPadding; + } + + //This is indeed called every time a menu part is rendered, but I can't + //find a way of caching it that I can be sure has no race conditions. + //The check is no longer very costly, anyway. + protected ToolStripRenderer ActualRenderer { + get { + bool nativeSupported = UXThemeToolStripRenderer.IsSupported; + + if (nativeSupported) { + if (nativeRenderer == null) + nativeRenderer = new UXThemeToolStripRenderer(Theme); + return nativeRenderer; + } + + return defaultRenderer; + } + } + + #region InitializeXXX + protected override void Initialize(ToolStrip toolStrip) { + base.Initialize(toolStrip); + + toolStrip.Padding = Padding.Empty; + + if (/*!(toolStrip is MenuStrip) &&*/ toolStrip.Parent is ToolStripPanel) { + toolStrip.BackColor = Color.Transparent; + } + } + + protected override void InitializePanel(ToolStripPanel toolStripPanel) { + base.InitializePanel(toolStripPanel); + } + + protected override void InitializeItem(ToolStripItem item) { + base.InitializeItem(item); + } + #endregion + + #region SetToolStripRenderer + /// + /// Sets the renderer of each ToolStrip to a NativeToolStripRenderer. A convenience method. + /// + /// A parameter list of ToolStrips. + [SuppressMessage("Microsoft.Design", "CA1062")] //The parameter array is actually checked. + public static void SetToolStripRenderer(ToolbarTheme theme, params Control[] toolStrips) { + foreach (Control ts in toolStrips) { + if (ts == null) + throw new ArgumentNullException("toolStrips", "ToolStrips cannot contain a null reference."); + } + + foreach (Control ts in toolStrips) { + if (ts is ToolStrip) { + ToolStrip t = (ToolStrip)ts; + t.Renderer = new NativeToolStripRenderer(t, theme); + } else if (ts is ToolStripPanel) { + ToolStripPanel t = (ToolStripPanel)ts; + t.Renderer = new NativeToolStripRenderer(t, theme); + } else + throw new ArgumentException("Can't set the renderer for a " + ts.GetType().Name); + } + } + + public static void SetToolStripRenderer(params Control[] toolStrips) { + SetToolStripRenderer(ToolbarTheme.Toolbar, toolStrips); + } + #endregion + + #region Overridden Methods - Deferred to actual renderer + protected override void OnRenderArrow(ToolStripArrowRenderEventArgs e) { + ActualRenderer.DrawArrow(e); + } + + protected override void OnRenderButtonBackground(ToolStripItemRenderEventArgs e) { + ActualRenderer.DrawButtonBackground(e); + } + + protected override void OnRenderDropDownButtonBackground(ToolStripItemRenderEventArgs e) { + ActualRenderer.DrawDropDownButtonBackground(e); + } + + protected override void OnRenderGrip(ToolStripGripRenderEventArgs e) { + ActualRenderer.DrawGrip(e); + } + + protected override void OnRenderImageMargin(ToolStripRenderEventArgs e) { + ActualRenderer.DrawImageMargin(e); + } + + protected override void OnRenderItemBackground(ToolStripItemRenderEventArgs e) { + ActualRenderer.DrawItemBackground(e); + } + + protected override void OnRenderItemCheck(ToolStripItemImageRenderEventArgs e) { + ActualRenderer.DrawItemCheck(e); + } + + protected override void OnRenderItemImage(ToolStripItemImageRenderEventArgs e) { + ActualRenderer.DrawItemImage(e); + } + + protected override void OnRenderItemText(ToolStripItemTextRenderEventArgs e) { + ActualRenderer.DrawItemText(e); + } + + protected override void OnRenderMenuItemBackground(ToolStripItemRenderEventArgs e) { + ActualRenderer.DrawMenuItemBackground(e); + } + + protected override void OnRenderSeparator(ToolStripSeparatorRenderEventArgs e) { + ActualRenderer.DrawSeparator(e); + } + + protected override void OnRenderToolStripBackground(ToolStripRenderEventArgs e) { + ActualRenderer.DrawToolStripBackground(e); + } + + protected override void OnRenderToolStripBorder(ToolStripRenderEventArgs e) { + ActualRenderer.DrawToolStripBorder(e); + } + + protected override void OnRenderToolStripContentPanelBackground(ToolStripContentPanelRenderEventArgs e) { + ActualRenderer.DrawToolStripContentPanelBackground(e); + } + + protected override void OnRenderToolStripPanelBackground(ToolStripPanelRenderEventArgs e) { + ActualRenderer.DrawToolStripPanelBackground(e); + } + #endregion + } +} diff --git a/OnTopReplica/NotificationIcon.cs b/src/OnTopReplica/NotificationIcon.cs similarity index 96% rename from OnTopReplica/NotificationIcon.cs rename to src/OnTopReplica/NotificationIcon.cs index 9c4fe21..19c261d 100644 --- a/OnTopReplica/NotificationIcon.cs +++ b/src/OnTopReplica/NotificationIcon.cs @@ -1,85 +1,85 @@ -using System; -using System.Collections.Generic; -using System.Text; -using System.Windows.Forms; -using OnTopReplica.Properties; - -namespace OnTopReplica { - /// - /// Notification icon that installs itself in the "tray" and manipulates the OnTopReplica main form. - /// - class NotificationIcon : IDisposable { - - public NotificationIcon(MainForm form) { - Form = form; - Install(); - } - - public MainForm Form { get; private set; } - - NotifyIcon _taskIcon; - ContextMenuStrip _contextMenu; - - private void Install() { - _contextMenu = new ContextMenuStrip(); - _contextMenu.Items.AddRange(new ToolStripItem[] { - new ToolStripMenuItem(Strings.MenuOpen, Resources.icon, TaskIconOpen_click) { - ToolTipText = Strings.MenuOpenTT, - }, - new ToolStripMenuItem(Strings.MenuWindows, Resources.list){ - DropDown = Form.MenuWindows, - ToolTipText = Strings.MenuWindowsTT - }, - new ToolStripMenuItem(Strings.MenuReset, null, TaskIconReset_click){ - ToolTipText = Strings.MenuResetTT - }, - new ToolStripMenuItem(Strings.MenuClose, Resources.close_new, TaskIconExit_click){ - ToolTipText = Strings.MenuCloseTT - } - }); - Asztal.Szótár.NativeToolStripRenderer.SetToolStripRenderer(_contextMenu); - - _taskIcon = new NotifyIcon { - Text = Strings.ApplicationName, - Icon = Resources.new_flat_icon, - Visible = true, - ContextMenuStrip = _contextMenu - }; - _taskIcon.DoubleClick += new EventHandler(TaskIcon_doubleclick); - } - - #region IDisposable Members - - public void Dispose() { - //Destroy NotifyIcon - if (_taskIcon != null) { - _taskIcon.Visible = false; - _taskIcon.Dispose(); - _taskIcon = null; - } - } - - #endregion - - #region Task Icon events - - void TaskIcon_doubleclick(object sender, EventArgs e) { - Form.EnsureMainFormVisible(); - } - - private void TaskIconOpen_click(object sender, EventArgs e) { - Form.EnsureMainFormVisible(); - } - - private void TaskIconReset_click(object sender, EventArgs e) { - Form.ResetMainFormWithConfirmation(); - } - - private void TaskIconExit_click(object sender, EventArgs e) { - Form.Close(); - } - - #endregion - - } -} +using System; +using System.Collections.Generic; +using System.Text; +using System.Windows.Forms; +using OnTopReplica.Properties; + +namespace OnTopReplica { + /// + /// Notification icon that installs itself in the "tray" and manipulates the OnTopReplica main form. + /// + class NotificationIcon : IDisposable { + + public NotificationIcon(MainForm form) { + Form = form; + Install(); + } + + public MainForm Form { get; private set; } + + NotifyIcon _taskIcon; + ContextMenuStrip _contextMenu; + + private void Install() { + _contextMenu = new ContextMenuStrip(); + _contextMenu.Items.AddRange(new ToolStripItem[] { + new ToolStripMenuItem(Strings.MenuOpen, Resources.icon, TaskIconOpen_click) { + ToolTipText = Strings.MenuOpenTT, + }, + new ToolStripMenuItem(Strings.MenuWindows, Resources.list){ + DropDown = Form.MenuWindows, + ToolTipText = Strings.MenuWindowsTT + }, + new ToolStripMenuItem(Strings.MenuReset, null, TaskIconReset_click){ + ToolTipText = Strings.MenuResetTT + }, + new ToolStripMenuItem(Strings.MenuClose, Resources.close_new, TaskIconExit_click){ + ToolTipText = Strings.MenuCloseTT + } + }); + Asztal.Szótár.NativeToolStripRenderer.SetToolStripRenderer(_contextMenu); + + _taskIcon = new NotifyIcon { + Text = Strings.ApplicationName, + Icon = Resources.new_flat_icon, + Visible = true, + ContextMenuStrip = _contextMenu + }; + _taskIcon.DoubleClick += new EventHandler(TaskIcon_doubleclick); + } + + #region IDisposable Members + + public void Dispose() { + //Destroy NotifyIcon + if (_taskIcon != null) { + _taskIcon.Visible = false; + _taskIcon.Dispose(); + _taskIcon = null; + } + } + + #endregion + + #region Task Icon events + + void TaskIcon_doubleclick(object sender, EventArgs e) { + Form.EnsureMainFormVisible(); + } + + private void TaskIconOpen_click(object sender, EventArgs e) { + Form.EnsureMainFormVisible(); + } + + private void TaskIconReset_click(object sender, EventArgs e) { + Form.ResetMainFormWithConfirmation(); + } + + private void TaskIconExit_click(object sender, EventArgs e) { + Form.Close(); + } + + #endregion + + } +} diff --git a/OnTopReplica/OnTopReplica.csproj b/src/OnTopReplica/OnTopReplica.csproj similarity index 97% rename from OnTopReplica/OnTopReplica.csproj rename to src/OnTopReplica/OnTopReplica.csproj index c7bec43..883c003 100644 --- a/OnTopReplica/OnTopReplica.csproj +++ b/src/OnTopReplica/OnTopReplica.csproj @@ -1,630 +1,630 @@ - - - - Debug - AnyCPU - 9.0.30729 - 2.0 - {E626BD6E-BF38-4EB7-A128-5CA6F40EF557} - WinExe - Properties - OnTopReplica - OnTopReplica - v4.7 - 512 - new-flat-icon.ico - false - false - Internet - OnTopReplica.Program - - - false - A305A505E19CF40E069521C80C13AB3C900EDB7C - OnTopReplica_1_TemporaryKey.pfx - false - - - - - 3.5 - - - - publish\ - true - Disk - true - Background - 1 - Weeks - true - false - true - http://www.klopfenstein.net/public/Uploads/ontopreplica/ - http://www.klopfenstein.net/lorenz.aspx/ontopreplica - en - OnTopReplica - Lorenz Cuno Klopfenstein - true - publish.htm - false - 0 - 3.5.1.%2a - false - true - true - - - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - - - false - true - false - - - pdbonly - true - bin\Release\ - - - prompt - 4 - - - true - false - false - - - - - - - - - OnTopReplica.exe.manifest - - - - - - - - - ..\packages\Windows-Forms-Aero.3.0.1\lib\net461\WindowsFormsAero.dll - - - - - - True - True - AppStrings.resx - - - Form - - - - - - - - Component - - - Component - - - - Form - - - Form - - - Form - - - Form - - - - - - - - - - - - - - - - - - True - True - Resources.resx - - - True - True - Settings.settings - - - - Form - - - SidePanelContainer.cs - - - UserControl - - - AboutPanel.cs - - - UserControl - - - AboutPanelContents.cs - - - UserControl - - - OptionsPanel.cs - - - UserControl - - - GroupSwitchPanel.cs - - - - - True - True - Strings.zh-TW.resx - - - Strings.zh.resx - True - True - - - True - True - Strings.cs.resx - - - True - True - Strings.da.resx - - - True - True - Strings.de.resx - - - True - True - Strings.resx - - - True - True - Strings.es.resx - - - True - True - Strings.fi.resx - - - True - True - Strings.it.resx - - - True - True - Strings.no.resx - - - True - True - Strings.pl.resx - - - True - True - Strings.pt-BR.resx - - - True - True - Strings.pt.resx - - - True - True - Strings.ru.resx - - - - - - - - - - - - - ResXFileCodeGenerator - AppStrings.Designer.cs - - - SidePanelContainer.cs - - - AboutPanel.cs - - - AboutPanelContents.cs - - - ResXFileCodeGenerator - Strings.zh-TW.Designer.cs - - - ResXFileCodeGenerator - Strings.zh.Designer.cs - - - ResXFileCodeGenerator - Strings.pl.Designer.cs - - - ResXFileCodeGenerator - Strings.Designer.cs - - - ResXFileCodeGenerator - Strings.ru.Designer.cs - - - - - - - - - - - - - - - - - UserControl - - - - Form - - - CommandLineReportForm.cs - - - - - - - - - - - - - - - - - Component - - - Form - - - MainForm.cs - - - - - - GroupSwitchPanel.cs - - - OptionsPanel.cs - - - CommandLineReportForm.cs - - - ResXFileCodeGenerator - Strings.cs.Designer.cs - - - ResXFileCodeGenerator - Strings.da.Designer.cs - - - ResXFileCodeGenerator - Strings.de.Designer.cs - - - ResXFileCodeGenerator - Strings.es.Designer.cs - - - ResXFileCodeGenerator - Strings.fi.Designer.cs - - - ResXFileCodeGenerator - Strings.it.Designer.cs - Designer - - - MainForm.cs - Designer - - - ResXFileCodeGenerator - Resources.Designer.cs - Designer - - - RegionPanel.cs - Designer - - - ResXFileCodeGenerator - Strings.no.Designer.cs - - - ResXFileCodeGenerator - Strings.pt-BR.Designer.cs - - - ResXFileCodeGenerator - Strings.pt.Designer.cs - - - - - SettingsSingleFileGenerator - Settings.Designer.cs - - - UserControl - - - RegionPanel.cs - - - - - Component - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Always - - - Always - - - - - - - - - - - - - - - - - - - - - - - - - - - False - .NET Framework 3.5 SP1 Client Profile - false - - - False - .NET Framework 2.0 %28x86%29 - true - - - False - .NET Framework 3.0 %28x86%29 - false - - - False - .NET Framework 3.5 - false - - - False - .NET Framework 3.5 SP1 - false - - - - - - - - - - - - - - - - - - - - - - - - - - - False - - - - - Exclude - True - File - - - False - - - - - Exclude - True - File - - - False - - - - - Exclude - True - File - - - False - - - - - Exclude - True - File - - - False - - - - - Include - True - Satellite - - - False - - - - - Include - True - Satellite - - - False - - - - - Include - True - Satellite - - - - - - - - + + + + Debug + AnyCPU + 9.0.30729 + 2.0 + {E626BD6E-BF38-4EB7-A128-5CA6F40EF557} + WinExe + Properties + OnTopReplica + OnTopReplica + v4.7 + 512 + new-flat-icon.ico + false + false + Internet + OnTopReplica.Program + + + false + A305A505E19CF40E069521C80C13AB3C900EDB7C + OnTopReplica_1_TemporaryKey.pfx + false + + + + + 3.5 + + + + publish\ + true + Disk + true + Background + 1 + Weeks + true + false + true + http://www.klopfenstein.net/public/Uploads/ontopreplica/ + http://www.klopfenstein.net/lorenz.aspx/ontopreplica + en + OnTopReplica + Lorenz Cuno Klopfenstein + true + publish.htm + false + 0 + 3.5.1.%2a + false + true + true + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + false + true + false + + + pdbonly + true + bin\Release\ + + + prompt + 4 + + + true + false + false + + + + + + + + + OnTopReplica.exe.manifest + + + + + + + + + ..\packages\Windows-Forms-Aero.3.0.1\lib\net461\WindowsFormsAero.dll + + + + + + True + True + AppStrings.resx + + + Form + + + + + + + + Component + + + Component + + + + Form + + + Form + + + Form + + + Form + + + + + + + + + + + + + + + + + + True + True + Resources.resx + + + True + True + Settings.settings + + + + Form + + + SidePanelContainer.cs + + + UserControl + + + AboutPanel.cs + + + UserControl + + + AboutPanelContents.cs + + + UserControl + + + OptionsPanel.cs + + + UserControl + + + GroupSwitchPanel.cs + + + + + True + True + Strings.zh-TW.resx + + + Strings.zh.resx + True + True + + + True + True + Strings.cs.resx + + + True + True + Strings.da.resx + + + True + True + Strings.de.resx + + + True + True + Strings.resx + + + True + True + Strings.es.resx + + + True + True + Strings.fi.resx + + + True + True + Strings.it.resx + + + True + True + Strings.no.resx + + + True + True + Strings.pl.resx + + + True + True + Strings.pt-BR.resx + + + True + True + Strings.pt.resx + + + True + True + Strings.ru.resx + + + + + + + + + + + + + ResXFileCodeGenerator + AppStrings.Designer.cs + + + SidePanelContainer.cs + + + AboutPanel.cs + + + AboutPanelContents.cs + + + ResXFileCodeGenerator + Strings.zh-TW.Designer.cs + + + ResXFileCodeGenerator + Strings.zh.Designer.cs + + + ResXFileCodeGenerator + Strings.pl.Designer.cs + + + ResXFileCodeGenerator + Strings.Designer.cs + + + ResXFileCodeGenerator + Strings.ru.Designer.cs + + + + + + + + + + + + + + + + + UserControl + + + + Form + + + CommandLineReportForm.cs + + + + + + + + + + + + + + + + + Component + + + Form + + + MainForm.cs + + + + + + GroupSwitchPanel.cs + + + OptionsPanel.cs + + + CommandLineReportForm.cs + + + ResXFileCodeGenerator + Strings.cs.Designer.cs + + + ResXFileCodeGenerator + Strings.da.Designer.cs + + + ResXFileCodeGenerator + Strings.de.Designer.cs + + + ResXFileCodeGenerator + Strings.es.Designer.cs + + + ResXFileCodeGenerator + Strings.fi.Designer.cs + + + ResXFileCodeGenerator + Strings.it.Designer.cs + Designer + + + MainForm.cs + Designer + + + ResXFileCodeGenerator + Resources.Designer.cs + Designer + + + RegionPanel.cs + Designer + + + ResXFileCodeGenerator + Strings.no.Designer.cs + + + ResXFileCodeGenerator + Strings.pt-BR.Designer.cs + + + ResXFileCodeGenerator + Strings.pt.Designer.cs + + + + + SettingsSingleFileGenerator + Settings.Designer.cs + + + UserControl + + + RegionPanel.cs + + + + + Component + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Always + + + Always + + + + + + + + + + + + + + + + + + + + + + + + + + + False + .NET Framework 3.5 SP1 Client Profile + false + + + False + .NET Framework 2.0 %28x86%29 + true + + + False + .NET Framework 3.0 %28x86%29 + false + + + False + .NET Framework 3.5 + false + + + False + .NET Framework 3.5 SP1 + false + + + + + + + + + + + + + + + + + + + + + + + + + + + False + + + + + Exclude + True + File + + + False + + + + + Exclude + True + File + + + False + + + + + Exclude + True + File + + + False + + + + + Exclude + True + File + + + False + + + + + Include + True + Satellite + + + False + + + + + Include + True + Satellite + + + False + + + + + Include + True + Satellite + + + + + + + + \ No newline at end of file diff --git a/OnTopReplica/OnTopReplica.exe.manifest b/src/OnTopReplica/OnTopReplica.exe.manifest similarity index 97% rename from OnTopReplica/OnTopReplica.exe.manifest rename to src/OnTopReplica/OnTopReplica.exe.manifest index a2d4660..9dcb4bb 100644 --- a/OnTopReplica/OnTopReplica.exe.manifest +++ b/src/OnTopReplica/OnTopReplica.exe.manifest @@ -1,53 +1,53 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - A real-time always-on-top “replica” of a window of your choice. - - - - true - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + A real-time always-on-top “replica” of a window of your choice. + + + + true + + + + diff --git a/OnTopReplica/PlatformSupport.cs b/src/OnTopReplica/PlatformSupport.cs similarity index 97% rename from OnTopReplica/PlatformSupport.cs rename to src/OnTopReplica/PlatformSupport.cs index ef81bdb..9ca1394 100644 --- a/OnTopReplica/PlatformSupport.cs +++ b/src/OnTopReplica/PlatformSupport.cs @@ -1,101 +1,101 @@ -using System; -using System.Collections.Generic; -using System.Text; -using OnTopReplica.Platforms; -using System.Windows.Forms; - -namespace OnTopReplica { - - abstract class PlatformSupport { - - /// - /// Creates a concrete PlatformSupport instance based on the OS the app is running on. - /// - public static PlatformSupport Create() { - var os = Environment.OSVersion; - var platform = CreateFromOperatingSystem(os); - - Log.Write("{0} detected, using support class {1}", - os.VersionString, platform.GetType().FullName); - - return platform; - } - - private static PlatformSupport CreateFromOperatingSystem(OperatingSystem os) { - if (os.Platform != PlatformID.Win32NT) - return new Other(); - - if (os.Version.Major == 6) { - if (os.Version.Minor >= 2) - return new WindowsEight(); - else if (os.Version.Minor == 1) - return new WindowsSeven(); - else - return new WindowsVista(); - } - else if (os.Version.Major > 6) { - //Ensures forward compatibility - return new WindowsSeven(); - } - else { - //Generic NT - return new WindowsXp(); - } - } - - /// - /// Checks whether OnTopReplica is compatible with the platform. - /// - /// Returns false if OnTopReplica cannot run and should terminate right away. - public abstract bool CheckCompatibility(); - - /// - /// Initializes a form before it is fully constructed and before the window handle has been created. - /// - public virtual void PreHandleFormInit() { - } - - /// - /// Initializes a form after its handle has been created. - /// - /// Form to initialize. - public virtual void PostHandleFormInit(MainForm form) { - } - - /// - /// Called before closing a form. Called once during a form's lifetime. - /// - public virtual void CloseForm(MainForm form) { - } - - /// - /// Hides the main form in a way that it can be restored later by the user. - /// - /// Form to hide. - public virtual void HideForm(MainForm form) { - } - - /// - /// Gets whether the form is currently hidden or not. - /// - public virtual bool IsHidden(MainForm form) { - return false; - } - - /// - /// Restores the main form to its default state after is has been hidden. - /// Can be called whether the form is hidden or not. - /// - /// Form to restore. - public virtual void RestoreForm(MainForm form) { - } - - /// - /// Called when the form changes its state, without calling into or . - /// Enables inheritors to update the form's state on each state change. - /// - public virtual void OnFormStateChange(MainForm form) { - } - - } -} +using System; +using System.Collections.Generic; +using System.Text; +using OnTopReplica.Platforms; +using System.Windows.Forms; + +namespace OnTopReplica { + + abstract class PlatformSupport { + + /// + /// Creates a concrete PlatformSupport instance based on the OS the app is running on. + /// + public static PlatformSupport Create() { + var os = Environment.OSVersion; + var platform = CreateFromOperatingSystem(os); + + Log.Write("{0} detected, using support class {1}", + os.VersionString, platform.GetType().FullName); + + return platform; + } + + private static PlatformSupport CreateFromOperatingSystem(OperatingSystem os) { + if (os.Platform != PlatformID.Win32NT) + return new Other(); + + if (os.Version.Major == 6) { + if (os.Version.Minor >= 2) + return new WindowsEight(); + else if (os.Version.Minor == 1) + return new WindowsSeven(); + else + return new WindowsVista(); + } + else if (os.Version.Major > 6) { + //Ensures forward compatibility + return new WindowsSeven(); + } + else { + //Generic NT + return new WindowsXp(); + } + } + + /// + /// Checks whether OnTopReplica is compatible with the platform. + /// + /// Returns false if OnTopReplica cannot run and should terminate right away. + public abstract bool CheckCompatibility(); + + /// + /// Initializes a form before it is fully constructed and before the window handle has been created. + /// + public virtual void PreHandleFormInit() { + } + + /// + /// Initializes a form after its handle has been created. + /// + /// Form to initialize. + public virtual void PostHandleFormInit(MainForm form) { + } + + /// + /// Called before closing a form. Called once during a form's lifetime. + /// + public virtual void CloseForm(MainForm form) { + } + + /// + /// Hides the main form in a way that it can be restored later by the user. + /// + /// Form to hide. + public virtual void HideForm(MainForm form) { + } + + /// + /// Gets whether the form is currently hidden or not. + /// + public virtual bool IsHidden(MainForm form) { + return false; + } + + /// + /// Restores the main form to its default state after is has been hidden. + /// Can be called whether the form is hidden or not. + /// + /// Form to restore. + public virtual void RestoreForm(MainForm form) { + } + + /// + /// Called when the form changes its state, without calling into or . + /// Enables inheritors to update the form's state on each state change. + /// + public virtual void OnFormStateChange(MainForm form) { + } + + } +} diff --git a/OnTopReplica/Platforms/DebugPlatform.cs b/src/OnTopReplica/Platforms/DebugPlatform.cs similarity index 94% rename from OnTopReplica/Platforms/DebugPlatform.cs rename to src/OnTopReplica/Platforms/DebugPlatform.cs index 8b8da3a..ecf1fce 100644 --- a/OnTopReplica/Platforms/DebugPlatform.cs +++ b/src/OnTopReplica/Platforms/DebugPlatform.cs @@ -1,22 +1,22 @@ -using System; -using System.Collections.Generic; -using System.Text; - -namespace OnTopReplica.Platforms { - -#if DEBUG - - /// - /// Fake platform for debugging. - /// - class DebugPlatform : PlatformSupport { - - public override bool CheckCompatibility() { - return true; - } - - } - -#endif - -} +using System; +using System.Collections.Generic; +using System.Text; + +namespace OnTopReplica.Platforms { + +#if DEBUG + + /// + /// Fake platform for debugging. + /// + class DebugPlatform : PlatformSupport { + + public override bool CheckCompatibility() { + return true; + } + + } + +#endif + +} diff --git a/OnTopReplica/Platforms/Other.cs b/src/OnTopReplica/Platforms/Other.cs similarity index 96% rename from OnTopReplica/Platforms/Other.cs rename to src/OnTopReplica/Platforms/Other.cs index abd253d..6839cfa 100644 --- a/OnTopReplica/Platforms/Other.cs +++ b/src/OnTopReplica/Platforms/Other.cs @@ -1,16 +1,16 @@ -using System; -using System.Collections.Generic; -using System.Text; -using System.Windows.Forms; - -namespace OnTopReplica.Platforms { - class Other : PlatformSupport { - - public override bool CheckCompatibility() { - MessageBox.Show(Strings.ErrorNoDwm, Strings.ErrorNoDwmTitle, - MessageBoxButtons.OK, MessageBoxIcon.Error); - return false; - } - - } -} +using System; +using System.Collections.Generic; +using System.Text; +using System.Windows.Forms; + +namespace OnTopReplica.Platforms { + class Other : PlatformSupport { + + public override bool CheckCompatibility() { + MessageBox.Show(Strings.ErrorNoDwm, Strings.ErrorNoDwmTitle, + MessageBoxButtons.OK, MessageBoxIcon.Error); + return false; + } + + } +} diff --git a/OnTopReplica/Platforms/WindowsEight.cs b/src/OnTopReplica/Platforms/WindowsEight.cs similarity index 95% rename from OnTopReplica/Platforms/WindowsEight.cs rename to src/OnTopReplica/Platforms/WindowsEight.cs index c305954..6be87e9 100644 --- a/OnTopReplica/Platforms/WindowsEight.cs +++ b/src/OnTopReplica/Platforms/WindowsEight.cs @@ -1,12 +1,12 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Windows.Forms; -using OnTopReplica.Native; - -namespace OnTopReplica.Platforms { - class WindowsEight : WindowsSeven { - - } -} +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Windows.Forms; +using OnTopReplica.Native; + +namespace OnTopReplica.Platforms { + class WindowsEight : WindowsSeven { + + } +} diff --git a/OnTopReplica/Platforms/WindowsSeven.cs b/src/OnTopReplica/Platforms/WindowsSeven.cs similarity index 96% rename from OnTopReplica/Platforms/WindowsSeven.cs rename to src/OnTopReplica/Platforms/WindowsSeven.cs index 1a2360e..5492e0a 100644 --- a/OnTopReplica/Platforms/WindowsSeven.cs +++ b/src/OnTopReplica/Platforms/WindowsSeven.cs @@ -1,43 +1,43 @@ -using System; -using System.Windows.Forms; -using OnTopReplica.Native; -using WindowsFormsAero.Dwm; - -namespace OnTopReplica.Platforms { - - class WindowsSeven : WindowsVista { - - private double? PreviousOpacity { get; set; } - - public override void PreHandleFormInit() { - //Set Application ID - WindowsSevenMethods.SetCurrentProcessExplicitAppUserModelID("LorenzCunoKlopfenstein.OnTopReplica.MainForm"); - } - - public override void PostHandleFormInit(MainForm form) { - DwmManager.SetWindowFlip3dPolicy(form, WindowsFormsAero.Flip3DPolicy.ExcludeAbove); - DwmManager.SetExcludeFromPeek(form, true); - DwmManager.SetDisallowPeek(form, true); - } - - public override void HideForm(MainForm form) { - PreviousOpacity = form.Opacity; - form.Opacity = 0; - } - - public override bool IsHidden(MainForm form) { - return (form.Opacity == 0.0); - } - - public override void RestoreForm(MainForm form) { - if (form.Opacity == 0.0) { - form.Opacity = PreviousOpacity.GetValueOrDefault(1.0); - PreviousOpacity = null; - } - - form.Show(); - } - - } - -} +using System; +using System.Windows.Forms; +using OnTopReplica.Native; +using WindowsFormsAero.Dwm; + +namespace OnTopReplica.Platforms { + + class WindowsSeven : WindowsVista { + + private double? PreviousOpacity { get; set; } + + public override void PreHandleFormInit() { + //Set Application ID + WindowsSevenMethods.SetCurrentProcessExplicitAppUserModelID("LorenzCunoKlopfenstein.OnTopReplica.MainForm"); + } + + public override void PostHandleFormInit(MainForm form) { + DwmManager.SetWindowFlip3dPolicy(form, WindowsFormsAero.Flip3DPolicy.ExcludeAbove); + DwmManager.SetExcludeFromPeek(form, true); + DwmManager.SetDisallowPeek(form, true); + } + + public override void HideForm(MainForm form) { + PreviousOpacity = form.Opacity; + form.Opacity = 0; + } + + public override bool IsHidden(MainForm form) { + return (form.Opacity == 0.0); + } + + public override void RestoreForm(MainForm form) { + if (form.Opacity == 0.0) { + form.Opacity = PreviousOpacity.GetValueOrDefault(1.0); + PreviousOpacity = null; + } + + form.Show(); + } + + } + +} diff --git a/OnTopReplica/Platforms/WindowsVista.cs b/src/OnTopReplica/Platforms/WindowsVista.cs similarity index 96% rename from OnTopReplica/Platforms/WindowsVista.cs rename to src/OnTopReplica/Platforms/WindowsVista.cs index c513a3f..b39c58b 100644 --- a/OnTopReplica/Platforms/WindowsVista.cs +++ b/src/OnTopReplica/Platforms/WindowsVista.cs @@ -1,52 +1,52 @@ -using System; -using System.Windows.Forms; -using WindowsFormsAero.Dwm; - -namespace OnTopReplica.Platforms { - - class WindowsVista : PlatformSupport { - - public override bool CheckCompatibility() { - if (!WindowsFormsAero.OsSupport.IsCompositionEnabled) { - MessageBox.Show(Strings.ErrorDwmOffContent, Strings.ErrorDwmOff, MessageBoxButtons.OK, MessageBoxIcon.Error); - return false; - } - - return true; - } - - NotificationIcon _icon; - - public override void PostHandleFormInit(MainForm form) { - //Do not show in task bar, but display notify icon - //NOTE: this effectively makes Windows ignore the Flip 3D policy set above (on Windows 7) - //NOTE: this also makes HotKey registration critically fail on Windows 7 - form.ShowInTaskbar = false; - - DwmManager.SetWindowFlip3dPolicy(form, WindowsFormsAero.Flip3DPolicy.ExcludeAbove); - - _icon = new NotificationIcon(form); - } - - public override void CloseForm(MainForm form) { - if (_icon != null) { - _icon.Dispose(); - _icon = null; - } - } - - public override bool IsHidden(MainForm form) { - return !form.Visible; - } - - public override void HideForm(MainForm form) { - form.Hide(); - } - - public override void RestoreForm(MainForm form) { - form.Show(); - } - - } - -} +using System; +using System.Windows.Forms; +using WindowsFormsAero.Dwm; + +namespace OnTopReplica.Platforms { + + class WindowsVista : PlatformSupport { + + public override bool CheckCompatibility() { + if (!WindowsFormsAero.OsSupport.IsCompositionEnabled) { + MessageBox.Show(Strings.ErrorDwmOffContent, Strings.ErrorDwmOff, MessageBoxButtons.OK, MessageBoxIcon.Error); + return false; + } + + return true; + } + + NotificationIcon _icon; + + public override void PostHandleFormInit(MainForm form) { + //Do not show in task bar, but display notify icon + //NOTE: this effectively makes Windows ignore the Flip 3D policy set above (on Windows 7) + //NOTE: this also makes HotKey registration critically fail on Windows 7 + form.ShowInTaskbar = false; + + DwmManager.SetWindowFlip3dPolicy(form, WindowsFormsAero.Flip3DPolicy.ExcludeAbove); + + _icon = new NotificationIcon(form); + } + + public override void CloseForm(MainForm form) { + if (_icon != null) { + _icon.Dispose(); + _icon = null; + } + } + + public override bool IsHidden(MainForm form) { + return !form.Visible; + } + + public override void HideForm(MainForm form) { + form.Hide(); + } + + public override void RestoreForm(MainForm form) { + form.Show(); + } + + } + +} diff --git a/OnTopReplica/Platforms/WindowsXp.cs b/src/OnTopReplica/Platforms/WindowsXp.cs similarity index 96% rename from OnTopReplica/Platforms/WindowsXp.cs rename to src/OnTopReplica/Platforms/WindowsXp.cs index 88d3895..ad44c7d 100644 --- a/OnTopReplica/Platforms/WindowsXp.cs +++ b/src/OnTopReplica/Platforms/WindowsXp.cs @@ -1,15 +1,15 @@ -using System; -using System.Collections.Generic; -using System.Text; -using System.Windows.Forms; - -namespace OnTopReplica.Platforms { - class WindowsXp : PlatformSupport { - - public override bool CheckCompatibility() { - MessageBox.Show(Strings.ErrorNoDwm, Strings.ErrorNoDwmTitle, MessageBoxButtons.OK, MessageBoxIcon.Error); - return false; - } - - } -} +using System; +using System.Collections.Generic; +using System.Text; +using System.Windows.Forms; + +namespace OnTopReplica.Platforms { + class WindowsXp : PlatformSupport { + + public override bool CheckCompatibility() { + MessageBox.Show(Strings.ErrorNoDwm, Strings.ErrorNoDwmTitle, MessageBoxButtons.OK, MessageBoxIcon.Error); + return false; + } + + } +} diff --git a/OnTopReplica/PluginRegionLocator.cs b/src/OnTopReplica/PluginRegionLocator.cs similarity index 97% rename from OnTopReplica/PluginRegionLocator.cs rename to src/OnTopReplica/PluginRegionLocator.cs index eaebb70..0f35a9a 100644 --- a/OnTopReplica/PluginRegionLocator.cs +++ b/src/OnTopReplica/PluginRegionLocator.cs @@ -1,102 +1,102 @@ -using System; -using System.Collections.Generic; -using System.Text; -using System.Drawing; -using OnTopReplica.Native; - -namespace OnTopReplica { - /// - /// Facility class that attempts to locate the region occupied by plugins inside another window. - /// - class PluginRegionLocator { - - static PluginRegionLocator() { - _pluginClassNames = new HashSet() { - //Opera 11 Flash plugin - "aPluginWinClass", - - //IE 9 Flash plugin - "MacromediaFlashPlayerActiveX", - - //Google Chrome - "NativeWindowClass", //Flash plugin - "Chrome_RenderWidgetHostHWND", //Tab content - - //Firefox 9 Flash plugin - "GeckoPluginWindow", - }; - } - - static readonly HashSet _pluginClassNames; - - /// - /// Attempts to locate a plugin region inside a window. - /// - /// The handle to the parent window. - /// The region where a plugin window is located or null if none found. - public Rectangle? LocatePluginRegion(WindowHandle handle) { - if (handle == null) - throw new ArgumentNullException(); - - WindowManagerMethods.EnumChildWindows(handle.Handle, LocatingWndProc, IntPtr.Zero); - - if (_selectedHandle != null) { - Console.Out.WriteLine("Selected {0} '{1}' (class {2})", _selectedHandle.Handle, _selectedHandle.Title, _selectedHandle.Class); - - NRectangle rect; - WindowMethods.GetWindowRect(_selectedHandle.Handle, out rect); - - NRectangle clientRect; - WindowMethods.GetClientRect(_selectedHandle.Handle, out clientRect); - - Console.Out.WriteLine("WindowRect: {0}", rect); - - NRectangle ownerRect; - WindowMethods.GetWindowRect(handle.Handle, out ownerRect); - - Console.Out.WriteLine("Owner WindowRect: {0}", ownerRect); - - var ret = new Rectangle { - X = rect.Left - ownerRect.Left, - Y = rect.Top - ownerRect.Top, - Width = clientRect.Width, - Height = clientRect.Height - }; - - //Safety check (this may happen when the plugin client area is 0 pixel large) - if (ret.Width < 0 || ret.Height < 0) - return null; - - Console.Out.WriteLine("Selected region: {0}", ret); - - return ret; - } - else { - Console.Out.WriteLine("None found."); - return null; - } - } - - WindowHandle _selectedHandle = null; - - private bool LocatingWndProc(IntPtr handle, IntPtr lParam) { - //Skip non visible windows - if (!WindowManagerMethods.IsWindowVisible(handle)) { - return true; - } - - //Class name check - string cl = WindowMethods.GetWindowClass(handle); - System.Diagnostics.Trace.WriteLine(string.Format("Child window, class {0}", cl)); - - if (_pluginClassNames.Contains(cl)) { - //Found plugin window, stop now - _selectedHandle = new WindowHandle(handle); - return false; - } - - return true; - } - - } -} +using System; +using System.Collections.Generic; +using System.Text; +using System.Drawing; +using OnTopReplica.Native; + +namespace OnTopReplica { + /// + /// Facility class that attempts to locate the region occupied by plugins inside another window. + /// + class PluginRegionLocator { + + static PluginRegionLocator() { + _pluginClassNames = new HashSet() { + //Opera 11 Flash plugin + "aPluginWinClass", + + //IE 9 Flash plugin + "MacromediaFlashPlayerActiveX", + + //Google Chrome + "NativeWindowClass", //Flash plugin + "Chrome_RenderWidgetHostHWND", //Tab content + + //Firefox 9 Flash plugin + "GeckoPluginWindow", + }; + } + + static readonly HashSet _pluginClassNames; + + /// + /// Attempts to locate a plugin region inside a window. + /// + /// The handle to the parent window. + /// The region where a plugin window is located or null if none found. + public Rectangle? LocatePluginRegion(WindowHandle handle) { + if (handle == null) + throw new ArgumentNullException(); + + WindowManagerMethods.EnumChildWindows(handle.Handle, LocatingWndProc, IntPtr.Zero); + + if (_selectedHandle != null) { + Console.Out.WriteLine("Selected {0} '{1}' (class {2})", _selectedHandle.Handle, _selectedHandle.Title, _selectedHandle.Class); + + NRectangle rect; + WindowMethods.GetWindowRect(_selectedHandle.Handle, out rect); + + NRectangle clientRect; + WindowMethods.GetClientRect(_selectedHandle.Handle, out clientRect); + + Console.Out.WriteLine("WindowRect: {0}", rect); + + NRectangle ownerRect; + WindowMethods.GetWindowRect(handle.Handle, out ownerRect); + + Console.Out.WriteLine("Owner WindowRect: {0}", ownerRect); + + var ret = new Rectangle { + X = rect.Left - ownerRect.Left, + Y = rect.Top - ownerRect.Top, + Width = clientRect.Width, + Height = clientRect.Height + }; + + //Safety check (this may happen when the plugin client area is 0 pixel large) + if (ret.Width < 0 || ret.Height < 0) + return null; + + Console.Out.WriteLine("Selected region: {0}", ret); + + return ret; + } + else { + Console.Out.WriteLine("None found."); + return null; + } + } + + WindowHandle _selectedHandle = null; + + private bool LocatingWndProc(IntPtr handle, IntPtr lParam) { + //Skip non visible windows + if (!WindowManagerMethods.IsWindowVisible(handle)) { + return true; + } + + //Class name check + string cl = WindowMethods.GetWindowClass(handle); + System.Diagnostics.Trace.WriteLine(string.Format("Child window, class {0}", cl)); + + if (_pluginClassNames.Contains(cl)) { + //Found plugin window, stop now + _selectedHandle = new WindowHandle(handle); + return false; + } + + return true; + } + + } +} diff --git a/OnTopReplica/Program.cs b/src/OnTopReplica/Program.cs similarity index 97% rename from OnTopReplica/Program.cs rename to src/OnTopReplica/Program.cs index 03fd60a..b2e2445 100644 --- a/OnTopReplica/Program.cs +++ b/src/OnTopReplica/Program.cs @@ -1,167 +1,167 @@ -using System; -using System.IO; -using System.Reflection; -using System.Threading; -using System.Windows.Forms; -using OnTopReplica.Properties; -using OnTopReplica.StartupOptions; -using OnTopReplica.Update; - -namespace OnTopReplica { - - static class Program { - - public static PlatformSupport Platform { get; private set; } - - public static UpdateManager Update { get; private set; } - - static MainForm _mainForm; - - /// - /// The main entry point for the application. - /// - [STAThread] - static void Main(string[] args) { - try { - AppPaths.SetupPaths(); - } - catch (Exception ex) { - MessageBox.Show(string.Format("Unable to setup application folders: {0}", ex), "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); - } - - Log.Write("Launching OnTopReplica v.{0}", Application.ProductVersion); - - //Hook fatal abort handler - AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException); - - //Initialize and check for platform support - Platform = PlatformSupport.Create(); - if (!Platform.CheckCompatibility()) - return; - Platform.PreHandleFormInit(); - - Log.Write("Platform support initialized"); - - Application.EnableVisualStyles(); - Application.SetCompatibleTextRenderingDefault(false); - - //Update settings if needed - if (Settings.Default.MustUpdate) { - Settings.Default.Upgrade(); - Settings.Default.MustUpdate = false; - } - - //Load startup options - var options = StartupOptions.Factory.CreateOptions(args); - string optionsMessage = options.DebugMessage; - if (!string.IsNullOrEmpty(optionsMessage)) { //show dialog if debug message present or if parsing failed - var dlg = new CommandLineReportForm(options.Status, optionsMessage); - dlg.ShowDialog(); - } - if (options.Status == CliStatus.Information || options.Status == CliStatus.Error) - return; - - //Load language - Thread.CurrentThread.CurrentUICulture = Settings.Default.Language; - - //Show form - using (_mainForm = new MainForm(options)) { - Application.Idle += _handlerIdleUpdater; - - Log.Write("Entering application loop"); - - //Enter GUI loop - Application.Run(_mainForm); - - //Re-enable chrome to store correct position (position is stored always WITH chrome: when restoring fails, the position stays ok) - Settings.Default.RestoreLastShowChrome = _mainForm.IsChromeVisible; - if (!_mainForm.IsChromeVisible) - _mainForm.IsChromeVisible = true; - - //Persist settings - Log.Write("Last position before shutdown: {0}, size: {1}", _mainForm.Location, _mainForm.Size); - Settings.Default.RestoreLastPosition = _mainForm.Location; - Settings.Default.RestoreLastSize = _mainForm.ClientSize; - - //Store last thumbnail, if any - if (_mainForm.ThumbnailPanel.IsShowingThumbnail && _mainForm.CurrentThumbnailWindowHandle != null) { - Settings.Default.RestoreLastWindowTitle = _mainForm.CurrentThumbnailWindowHandle.Title; - Settings.Default.RestoreLastWindowHwnd = _mainForm.CurrentThumbnailWindowHandle.Handle.ToInt64(); - Settings.Default.RestoreLastWindowClass = _mainForm.CurrentThumbnailWindowHandle.Class; - } - else { - Settings.Default.RestoreLastWindowTitle = string.Empty; - Settings.Default.RestoreLastWindowHwnd = 0; - Settings.Default.RestoreLastWindowClass = string.Empty; - } - - Log.Write("Persisting settings"); - Settings.Default.Save(); - } - - Log.Write("Shutting down OnTopReplica"); - } - - private static EventHandler _handlerIdleUpdater = new EventHandler(Application_Idle); - - /// - /// Callback detecting application idle time. - /// - static void Application_Idle(object sender, EventArgs e) { - Application.Idle -= _handlerIdleUpdater; - - Update = new UpdateManager(_mainForm); - Update.UpdateCheckCompleted += new EventHandler(UpdateManager_CheckCompleted); - Update.CheckForUpdate(); - } - - /// - /// Callback that handles update checking. - /// - static void UpdateManager_CheckCompleted(object sender, UpdateCheckCompletedEventArgs e) { - if (e.Success && e.Information != null) { - Log.Write("Update check successful (latest version is {0})", e.Information.LatestVersion); - - if (e.Information.IsNewVersionAvailable) { - Update.ConfirmAndInstall(); - } - } - else { - Log.WriteException("Unable to check for updates", e.Error); - } - } - - static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e) { - Log.WriteException("Unhandled exception", e.ExceptionObject as Exception); - - string path = AppPaths.GenerateCrashDumpPath(); - - using (var s = new FileStream(path, FileMode.Create)) { - using (var sw = new StreamWriter(s)) { - sw.WriteLine("OnTopReplica Dump file"); - sw.WriteLine("This file has been created because OnTopReplica crashed."); - sw.WriteLine("Please send it to lck@klopfenstein.net to help fix the bug that caused the crash."); - sw.WriteLine(); - - sw.WriteLine("Last exception:"); - sw.WriteLine(e.ExceptionObject.ToString()); - sw.WriteLine(); - - sw.WriteLine("Last log entries:"); - foreach (var logEntry in Log.Queue) { - sw.WriteLine(logEntry); - } - sw.WriteLine(); - - sw.WriteLine("OnTopReplica v.{0}", Application.ProductVersion); - sw.WriteLine("OS: {0}", Environment.OSVersion.ToString()); - sw.WriteLine(".NET: {0}", Environment.Version.ToString()); - sw.WriteLine("DWM: {0}", WindowsFormsAero.OsSupport.IsCompositionEnabled); - sw.WriteLine("Launch command: {0}", Environment.CommandLine); - sw.WriteLine("UTC time: {0} {1}", DateTime.UtcNow.ToShortDateString(), DateTime.UtcNow.ToShortTimeString()); - } - } - } - - } -} +using System; +using System.IO; +using System.Reflection; +using System.Threading; +using System.Windows.Forms; +using OnTopReplica.Properties; +using OnTopReplica.StartupOptions; +using OnTopReplica.Update; + +namespace OnTopReplica { + + static class Program { + + public static PlatformSupport Platform { get; private set; } + + public static UpdateManager Update { get; private set; } + + static MainForm _mainForm; + + /// + /// The main entry point for the application. + /// + [STAThread] + static void Main(string[] args) { + try { + AppPaths.SetupPaths(); + } + catch (Exception ex) { + MessageBox.Show(string.Format("Unable to setup application folders: {0}", ex), "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + + Log.Write("Launching OnTopReplica v.{0}", Application.ProductVersion); + + //Hook fatal abort handler + AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException); + + //Initialize and check for platform support + Platform = PlatformSupport.Create(); + if (!Platform.CheckCompatibility()) + return; + Platform.PreHandleFormInit(); + + Log.Write("Platform support initialized"); + + Application.EnableVisualStyles(); + Application.SetCompatibleTextRenderingDefault(false); + + //Update settings if needed + if (Settings.Default.MustUpdate) { + Settings.Default.Upgrade(); + Settings.Default.MustUpdate = false; + } + + //Load startup options + var options = StartupOptions.Factory.CreateOptions(args); + string optionsMessage = options.DebugMessage; + if (!string.IsNullOrEmpty(optionsMessage)) { //show dialog if debug message present or if parsing failed + var dlg = new CommandLineReportForm(options.Status, optionsMessage); + dlg.ShowDialog(); + } + if (options.Status == CliStatus.Information || options.Status == CliStatus.Error) + return; + + //Load language + Thread.CurrentThread.CurrentUICulture = Settings.Default.Language; + + //Show form + using (_mainForm = new MainForm(options)) { + Application.Idle += _handlerIdleUpdater; + + Log.Write("Entering application loop"); + + //Enter GUI loop + Application.Run(_mainForm); + + //Re-enable chrome to store correct position (position is stored always WITH chrome: when restoring fails, the position stays ok) + Settings.Default.RestoreLastShowChrome = _mainForm.IsChromeVisible; + if (!_mainForm.IsChromeVisible) + _mainForm.IsChromeVisible = true; + + //Persist settings + Log.Write("Last position before shutdown: {0}, size: {1}", _mainForm.Location, _mainForm.Size); + Settings.Default.RestoreLastPosition = _mainForm.Location; + Settings.Default.RestoreLastSize = _mainForm.ClientSize; + + //Store last thumbnail, if any + if (_mainForm.ThumbnailPanel.IsShowingThumbnail && _mainForm.CurrentThumbnailWindowHandle != null) { + Settings.Default.RestoreLastWindowTitle = _mainForm.CurrentThumbnailWindowHandle.Title; + Settings.Default.RestoreLastWindowHwnd = _mainForm.CurrentThumbnailWindowHandle.Handle.ToInt64(); + Settings.Default.RestoreLastWindowClass = _mainForm.CurrentThumbnailWindowHandle.Class; + } + else { + Settings.Default.RestoreLastWindowTitle = string.Empty; + Settings.Default.RestoreLastWindowHwnd = 0; + Settings.Default.RestoreLastWindowClass = string.Empty; + } + + Log.Write("Persisting settings"); + Settings.Default.Save(); + } + + Log.Write("Shutting down OnTopReplica"); + } + + private static EventHandler _handlerIdleUpdater = new EventHandler(Application_Idle); + + /// + /// Callback detecting application idle time. + /// + static void Application_Idle(object sender, EventArgs e) { + Application.Idle -= _handlerIdleUpdater; + + Update = new UpdateManager(_mainForm); + Update.UpdateCheckCompleted += new EventHandler(UpdateManager_CheckCompleted); + Update.CheckForUpdate(); + } + + /// + /// Callback that handles update checking. + /// + static void UpdateManager_CheckCompleted(object sender, UpdateCheckCompletedEventArgs e) { + if (e.Success && e.Information != null) { + Log.Write("Update check successful (latest version is {0})", e.Information.LatestVersion); + + if (e.Information.IsNewVersionAvailable) { + Update.ConfirmAndInstall(); + } + } + else { + Log.WriteException("Unable to check for updates", e.Error); + } + } + + static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e) { + Log.WriteException("Unhandled exception", e.ExceptionObject as Exception); + + string path = AppPaths.GenerateCrashDumpPath(); + + using (var s = new FileStream(path, FileMode.Create)) { + using (var sw = new StreamWriter(s)) { + sw.WriteLine("OnTopReplica Dump file"); + sw.WriteLine("This file has been created because OnTopReplica crashed."); + sw.WriteLine("Please send it to lck@klopfenstein.net to help fix the bug that caused the crash."); + sw.WriteLine(); + + sw.WriteLine("Last exception:"); + sw.WriteLine(e.ExceptionObject.ToString()); + sw.WriteLine(); + + sw.WriteLine("Last log entries:"); + foreach (var logEntry in Log.Queue) { + sw.WriteLine(logEntry); + } + sw.WriteLine(); + + sw.WriteLine("OnTopReplica v.{0}", Application.ProductVersion); + sw.WriteLine("OS: {0}", Environment.OSVersion.ToString()); + sw.WriteLine(".NET: {0}", Environment.Version.ToString()); + sw.WriteLine("DWM: {0}", WindowsFormsAero.OsSupport.IsCompositionEnabled); + sw.WriteLine("Launch command: {0}", Environment.CommandLine); + sw.WriteLine("UTC time: {0} {1}", DateTime.UtcNow.ToShortDateString(), DateTime.UtcNow.ToShortTimeString()); + } + } + } + + } +} diff --git a/OnTopReplica/Properties/AssemblyInfo.cs b/src/OnTopReplica/Properties/AssemblyInfo.cs similarity index 97% rename from OnTopReplica/Properties/AssemblyInfo.cs rename to src/OnTopReplica/Properties/AssemblyInfo.cs index d35cf7f..8c942d4 100644 --- a/OnTopReplica/Properties/AssemblyInfo.cs +++ b/src/OnTopReplica/Properties/AssemblyInfo.cs @@ -1,37 +1,37 @@ -using System.Reflection; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; - -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -[assembly: AssemblyTitle("OnTopReplica")] -[assembly: AssemblyDescription("Real-time, always on top thumbnail of a window of your choice.")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("Lorenz Cuno Klopfenstein")] -[assembly: AssemblyProduct("OnTopReplica")] -[assembly: AssemblyCopyright("Copyright © Lorenz Cuno Klopfenstein 2010")] -//[assembly: AssemblyCopyright("Copyright © Lorenz Cuno Klopfenstein 2007")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from -// COM, set the ComVisible attribute to true on that type. -[assembly: ComVisible(false)] - -// The following GUID is for the ID of the typelib if this project is exposed to COM -[assembly: Guid("015090d1-7559-4c59-b9d1-e7e066c4a948")] - -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// You can specify all the values or you can default the Build and Revision Numbers -// by using the '*' as shown below: -// [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("3.5.1.0")] -[assembly: AssemblyFileVersion("3.5.1.0")] +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("OnTopReplica")] +[assembly: AssemblyDescription("Real-time, always on top thumbnail of a window of your choice.")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("Lorenz Cuno Klopfenstein")] +[assembly: AssemblyProduct("OnTopReplica")] +[assembly: AssemblyCopyright("Copyright © Lorenz Cuno Klopfenstein 2010")] +//[assembly: AssemblyCopyright("Copyright © Lorenz Cuno Klopfenstein 2007")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("015090d1-7559-4c59-b9d1-e7e066c4a948")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("3.5.1.0")] +[assembly: AssemblyFileVersion("3.5.1.0")] diff --git a/OnTopReplica/Properties/Resources.Designer.cs b/src/OnTopReplica/Properties/Resources.Designer.cs similarity index 97% rename from OnTopReplica/Properties/Resources.Designer.cs rename to src/OnTopReplica/Properties/Resources.Designer.cs index 50d7ae9..508029c 100644 --- a/OnTopReplica/Properties/Resources.Designer.cs +++ b/src/OnTopReplica/Properties/Resources.Designer.cs @@ -1,483 +1,483 @@ -//------------------------------------------------------------------------------ -// -// 這段程式碼是由工具產生的。 -// 執行階段版本:4.0.30319.42000 -// -// 對這個檔案所做的變更可能會造成錯誤的行為,而且如果重新產生程式碼, -// 變更將會遺失。 -// -//------------------------------------------------------------------------------ - -namespace OnTopReplica.Properties { - using System; - - - /// - /// 用於查詢當地語系化字串等的強類型資源類別。 - /// - // 這個類別是自動產生的,是利用 StronglyTypedResourceBuilder - // 類別透過 ResGen 或 Visual Studio 這類工具。 - // 若要加入或移除成員,請編輯您的 .ResX 檔,然後重新執行 ResGen - // (利用 /str 選項),或重建您的 VS 專案。 - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "15.0.0.0")] - [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] - [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - internal class Resources { - - private static global::System.Resources.ResourceManager resourceMan; - - private static global::System.Globalization.CultureInfo resourceCulture; - - [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] - internal Resources() { - } - - /// - /// 傳回這個類別使用的快取的 ResourceManager 執行個體。 - /// - [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] - internal static global::System.Resources.ResourceManager ResourceManager { - get { - if (object.ReferenceEquals(resourceMan, null)) { - global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("OnTopReplica.Properties.Resources", typeof(Resources).Assembly); - resourceMan = temp; - } - return resourceMan; - } - } - - /// - /// 覆寫目前執行緒的 CurrentUICulture 屬性,對象是所有 - /// 使用這個強類型資源類別的資源查閱。 - /// - [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] - internal static global::System.Globalization.CultureInfo Culture { - get { - return resourceCulture; - } - set { - resourceCulture = value; - } - } - - /// - /// 查詢類型 System.Drawing.Bitmap 的當地語系化資源。 - /// - internal static System.Drawing.Bitmap back { - get { - object obj = ResourceManager.GetObject("back", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// 查詢類型 System.Drawing.Bitmap 的當地語系化資源。 - /// - internal static System.Drawing.Bitmap clickforwarding { - get { - object obj = ResourceManager.GetObject("clickforwarding", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// 查詢類型 System.Drawing.Bitmap 的當地語系化資源。 - /// - internal static System.Drawing.Bitmap close_new { - get { - object obj = ResourceManager.GetObject("close_new", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// 查詢類型 System.Drawing.Bitmap 的當地語系化資源。 - /// - internal static System.Drawing.Bitmap desktop { - get { - object obj = ResourceManager.GetObject("desktop", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// 查詢類型 System.Drawing.Bitmap 的當地語系化資源。 - /// - internal static System.Drawing.Bitmap flag_china { - get { - object obj = ResourceManager.GetObject("flag_china", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// 查詢類型 System.Drawing.Bitmap 的當地語系化資源。 - /// - internal static System.Drawing.Bitmap flag_czech { - get { - object obj = ResourceManager.GetObject("flag_czech", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// 查詢類型 System.Drawing.Bitmap 的當地語系化資源。 - /// - internal static System.Drawing.Bitmap flag_danish { - get { - object obj = ResourceManager.GetObject("flag_danish", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// 查詢類型 System.Drawing.Bitmap 的當地語系化資源。 - /// - internal static System.Drawing.Bitmap flag_germany { - get { - object obj = ResourceManager.GetObject("flag_germany", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// 查詢類型 System.Drawing.Bitmap 的當地語系化資源。 - /// - internal static System.Drawing.Bitmap flag_ita { - get { - object obj = ResourceManager.GetObject("flag_ita", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// 查詢類型 System.Drawing.Bitmap 的當地語系化資源。 - /// - internal static System.Drawing.Bitmap flag_poland { - get { - object obj = ResourceManager.GetObject("flag_poland", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// 查詢類型 System.Drawing.Bitmap 的當地語系化資源。 - /// - internal static System.Drawing.Bitmap flag_spanish { - get { - object obj = ResourceManager.GetObject("flag_spanish", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// 查詢類型 System.Drawing.Bitmap 的當地語系化資源。 - /// - internal static System.Drawing.Bitmap flag_taiwan { - get { - object obj = ResourceManager.GetObject("flag_taiwan", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// 查詢類型 System.Drawing.Bitmap 的當地語系化資源。 - /// - internal static System.Drawing.Bitmap flag_usa { - get { - object obj = ResourceManager.GetObject("flag_usa", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// 查詢類型 System.Drawing.Bitmap 的當地語系化資源。 - /// - internal static System.Drawing.Bitmap flat_logo_64 { - get { - object obj = ResourceManager.GetObject("flat_logo_64", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// 查詢類型 System.Drawing.Bitmap 的當地語系化資源。 - /// - internal static System.Drawing.Bitmap fullscreen { - get { - object obj = ResourceManager.GetObject("fullscreen", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// 查詢類型 System.Drawing.Bitmap 的當地語系化資源。 - /// - internal static System.Drawing.Bitmap groupmode { - get { - object obj = ResourceManager.GetObject("groupmode", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// 查詢類型 System.Drawing.Bitmap 的當地語系化資源。 - /// - internal static System.Drawing.Bitmap help { - get { - object obj = ResourceManager.GetObject("help", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// 查詢類型 System.Drawing.Bitmap 的當地語系化資源。 - /// - internal static System.Drawing.Bitmap icon { - get { - object obj = ResourceManager.GetObject("icon", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// 查詢類型 System.Drawing.Bitmap 的當地語系化資源。 - /// - internal static System.Drawing.Bitmap list { - get { - object obj = ResourceManager.GetObject("list", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// 查詢類型 System.Drawing.Bitmap 的當地語系化資源。 - /// - internal static System.Drawing.Bitmap minimize { - get { - object obj = ResourceManager.GetObject("minimize", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// 查詢類似 (圖示) 的類型 System.Drawing.Icon 當地語系化資源。 - /// - internal static System.Drawing.Icon new_flat_icon { - get { - object obj = ResourceManager.GetObject("new_flat_icon", resourceCulture); - return ((System.Drawing.Icon)(obj)); - } - } - - /// - /// 查詢類型 System.Drawing.Bitmap 的當地語系化資源。 - /// - internal static System.Drawing.Bitmap pos_bottomleft { - get { - object obj = ResourceManager.GetObject("pos_bottomleft", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// 查詢類型 System.Drawing.Bitmap 的當地語系化資源。 - /// - internal static System.Drawing.Bitmap pos_bottomright { - get { - object obj = ResourceManager.GetObject("pos_bottomright", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// 查詢類型 System.Drawing.Bitmap 的當地語系化資源。 - /// - internal static System.Drawing.Bitmap pos_center { - get { - object obj = ResourceManager.GetObject("pos_center", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// 查詢類型 System.Drawing.Bitmap 的當地語系化資源。 - /// - internal static System.Drawing.Bitmap pos_null { - get { - object obj = ResourceManager.GetObject("pos_null", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// 查詢類型 System.Drawing.Bitmap 的當地語系化資源。 - /// - internal static System.Drawing.Bitmap pos_topleft { - get { - object obj = ResourceManager.GetObject("pos_topleft", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// 查詢類型 System.Drawing.Bitmap 的當地語系化資源。 - /// - internal static System.Drawing.Bitmap pos_topright { - get { - object obj = ResourceManager.GetObject("pos_topright", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// 查詢類型 System.Drawing.Bitmap 的當地語系化資源。 - /// - internal static System.Drawing.Bitmap refresh { - get { - object obj = ResourceManager.GetObject("refresh", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// 查詢類型 System.Drawing.Bitmap 的當地語系化資源。 - /// - internal static System.Drawing.Bitmap regions { - get { - object obj = ResourceManager.GetObject("regions", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// 查詢類型 System.Drawing.Bitmap 的當地語系化資源。 - /// - internal static System.Drawing.Bitmap window_border16 { - get { - object obj = ResourceManager.GetObject("window_border16", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// 查詢類型 System.Drawing.Bitmap 的當地語系化資源。 - /// - internal static System.Drawing.Bitmap window_multiple16 { - get { - object obj = ResourceManager.GetObject("window_multiple16", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// 查詢類型 System.Drawing.Bitmap 的當地語系化資源。 - /// - internal static System.Drawing.Bitmap window_opacity { - get { - object obj = ResourceManager.GetObject("window_opacity", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// 查詢類型 System.Drawing.Bitmap 的當地語系化資源。 - /// - internal static System.Drawing.Bitmap window_switch { - get { - object obj = ResourceManager.GetObject("window_switch", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// 查詢類型 System.Drawing.Bitmap 的當地語系化資源。 - /// - internal static System.Drawing.Bitmap window16 { - get { - object obj = ResourceManager.GetObject("window16", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// 查詢類型 System.Drawing.Bitmap 的當地語系化資源。 - /// - internal static System.Drawing.Bitmap xiao_add { - get { - object obj = ResourceManager.GetObject("xiao_add", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// 查詢類型 System.Drawing.Bitmap 的當地語系化資源。 - /// - internal static System.Drawing.Bitmap xiao_arrow { - get { - object obj = ResourceManager.GetObject("xiao_arrow", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// 查詢類型 System.Drawing.Bitmap 的當地語系化資源。 - /// - internal static System.Drawing.Bitmap xiao_component { - get { - object obj = ResourceManager.GetObject("xiao_component", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// 查詢類型 System.Drawing.Bitmap 的當地語系化資源。 - /// - internal static System.Drawing.Bitmap xiao_delete { - get { - object obj = ResourceManager.GetObject("xiao_delete", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// 查詢類型 System.Drawing.Bitmap 的當地語系化資源。 - /// - internal static System.Drawing.Bitmap xiao_down { - get { - object obj = ResourceManager.GetObject("xiao_down", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// 查詢類型 System.Drawing.Bitmap 的當地語系化資源。 - /// - internal static System.Drawing.Bitmap xiao_ok { - get { - object obj = ResourceManager.GetObject("xiao_ok", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// 查詢類型 System.Drawing.Bitmap 的當地語系化資源。 - /// - internal static System.Drawing.Bitmap xiao_up { - get { - object obj = ResourceManager.GetObject("xiao_up", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// 查詢類型 System.Drawing.Bitmap 的當地語系化資源。 - /// - internal static System.Drawing.Bitmap xiao_wrench { - get { - object obj = ResourceManager.GetObject("xiao_wrench", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - } -} +//------------------------------------------------------------------------------ +// +// 這段程式碼是由工具產生的。 +// 執行階段版本:4.0.30319.42000 +// +// 對這個檔案所做的變更可能會造成錯誤的行為,而且如果重新產生程式碼, +// 變更將會遺失。 +// +//------------------------------------------------------------------------------ + +namespace OnTopReplica.Properties { + using System; + + + /// + /// 用於查詢當地語系化字串等的強類型資源類別。 + /// + // 這個類別是自動產生的,是利用 StronglyTypedResourceBuilder + // 類別透過 ResGen 或 Visual Studio 這類工具。 + // 若要加入或移除成員,請編輯您的 .ResX 檔,然後重新執行 ResGen + // (利用 /str 選項),或重建您的 VS 專案。 + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "15.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() { + } + + /// + /// 傳回這個類別使用的快取的 ResourceManager 執行個體。 + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("OnTopReplica.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// 覆寫目前執行緒的 CurrentUICulture 屬性,對象是所有 + /// 使用這個強類型資源類別的資源查閱。 + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + + /// + /// 查詢類型 System.Drawing.Bitmap 的當地語系化資源。 + /// + internal static System.Drawing.Bitmap back { + get { + object obj = ResourceManager.GetObject("back", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查詢類型 System.Drawing.Bitmap 的當地語系化資源。 + /// + internal static System.Drawing.Bitmap clickforwarding { + get { + object obj = ResourceManager.GetObject("clickforwarding", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查詢類型 System.Drawing.Bitmap 的當地語系化資源。 + /// + internal static System.Drawing.Bitmap close_new { + get { + object obj = ResourceManager.GetObject("close_new", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查詢類型 System.Drawing.Bitmap 的當地語系化資源。 + /// + internal static System.Drawing.Bitmap desktop { + get { + object obj = ResourceManager.GetObject("desktop", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查詢類型 System.Drawing.Bitmap 的當地語系化資源。 + /// + internal static System.Drawing.Bitmap flag_china { + get { + object obj = ResourceManager.GetObject("flag_china", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查詢類型 System.Drawing.Bitmap 的當地語系化資源。 + /// + internal static System.Drawing.Bitmap flag_czech { + get { + object obj = ResourceManager.GetObject("flag_czech", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查詢類型 System.Drawing.Bitmap 的當地語系化資源。 + /// + internal static System.Drawing.Bitmap flag_danish { + get { + object obj = ResourceManager.GetObject("flag_danish", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查詢類型 System.Drawing.Bitmap 的當地語系化資源。 + /// + internal static System.Drawing.Bitmap flag_germany { + get { + object obj = ResourceManager.GetObject("flag_germany", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查詢類型 System.Drawing.Bitmap 的當地語系化資源。 + /// + internal static System.Drawing.Bitmap flag_ita { + get { + object obj = ResourceManager.GetObject("flag_ita", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查詢類型 System.Drawing.Bitmap 的當地語系化資源。 + /// + internal static System.Drawing.Bitmap flag_poland { + get { + object obj = ResourceManager.GetObject("flag_poland", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查詢類型 System.Drawing.Bitmap 的當地語系化資源。 + /// + internal static System.Drawing.Bitmap flag_spanish { + get { + object obj = ResourceManager.GetObject("flag_spanish", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查詢類型 System.Drawing.Bitmap 的當地語系化資源。 + /// + internal static System.Drawing.Bitmap flag_taiwan { + get { + object obj = ResourceManager.GetObject("flag_taiwan", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查詢類型 System.Drawing.Bitmap 的當地語系化資源。 + /// + internal static System.Drawing.Bitmap flag_usa { + get { + object obj = ResourceManager.GetObject("flag_usa", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查詢類型 System.Drawing.Bitmap 的當地語系化資源。 + /// + internal static System.Drawing.Bitmap flat_logo_64 { + get { + object obj = ResourceManager.GetObject("flat_logo_64", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查詢類型 System.Drawing.Bitmap 的當地語系化資源。 + /// + internal static System.Drawing.Bitmap fullscreen { + get { + object obj = ResourceManager.GetObject("fullscreen", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查詢類型 System.Drawing.Bitmap 的當地語系化資源。 + /// + internal static System.Drawing.Bitmap groupmode { + get { + object obj = ResourceManager.GetObject("groupmode", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查詢類型 System.Drawing.Bitmap 的當地語系化資源。 + /// + internal static System.Drawing.Bitmap help { + get { + object obj = ResourceManager.GetObject("help", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查詢類型 System.Drawing.Bitmap 的當地語系化資源。 + /// + internal static System.Drawing.Bitmap icon { + get { + object obj = ResourceManager.GetObject("icon", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查詢類型 System.Drawing.Bitmap 的當地語系化資源。 + /// + internal static System.Drawing.Bitmap list { + get { + object obj = ResourceManager.GetObject("list", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查詢類型 System.Drawing.Bitmap 的當地語系化資源。 + /// + internal static System.Drawing.Bitmap minimize { + get { + object obj = ResourceManager.GetObject("minimize", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查詢類似 (圖示) 的類型 System.Drawing.Icon 當地語系化資源。 + /// + internal static System.Drawing.Icon new_flat_icon { + get { + object obj = ResourceManager.GetObject("new_flat_icon", resourceCulture); + return ((System.Drawing.Icon)(obj)); + } + } + + /// + /// 查詢類型 System.Drawing.Bitmap 的當地語系化資源。 + /// + internal static System.Drawing.Bitmap pos_bottomleft { + get { + object obj = ResourceManager.GetObject("pos_bottomleft", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查詢類型 System.Drawing.Bitmap 的當地語系化資源。 + /// + internal static System.Drawing.Bitmap pos_bottomright { + get { + object obj = ResourceManager.GetObject("pos_bottomright", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查詢類型 System.Drawing.Bitmap 的當地語系化資源。 + /// + internal static System.Drawing.Bitmap pos_center { + get { + object obj = ResourceManager.GetObject("pos_center", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查詢類型 System.Drawing.Bitmap 的當地語系化資源。 + /// + internal static System.Drawing.Bitmap pos_null { + get { + object obj = ResourceManager.GetObject("pos_null", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查詢類型 System.Drawing.Bitmap 的當地語系化資源。 + /// + internal static System.Drawing.Bitmap pos_topleft { + get { + object obj = ResourceManager.GetObject("pos_topleft", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查詢類型 System.Drawing.Bitmap 的當地語系化資源。 + /// + internal static System.Drawing.Bitmap pos_topright { + get { + object obj = ResourceManager.GetObject("pos_topright", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查詢類型 System.Drawing.Bitmap 的當地語系化資源。 + /// + internal static System.Drawing.Bitmap refresh { + get { + object obj = ResourceManager.GetObject("refresh", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查詢類型 System.Drawing.Bitmap 的當地語系化資源。 + /// + internal static System.Drawing.Bitmap regions { + get { + object obj = ResourceManager.GetObject("regions", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查詢類型 System.Drawing.Bitmap 的當地語系化資源。 + /// + internal static System.Drawing.Bitmap window_border16 { + get { + object obj = ResourceManager.GetObject("window_border16", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查詢類型 System.Drawing.Bitmap 的當地語系化資源。 + /// + internal static System.Drawing.Bitmap window_multiple16 { + get { + object obj = ResourceManager.GetObject("window_multiple16", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查詢類型 System.Drawing.Bitmap 的當地語系化資源。 + /// + internal static System.Drawing.Bitmap window_opacity { + get { + object obj = ResourceManager.GetObject("window_opacity", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查詢類型 System.Drawing.Bitmap 的當地語系化資源。 + /// + internal static System.Drawing.Bitmap window_switch { + get { + object obj = ResourceManager.GetObject("window_switch", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查詢類型 System.Drawing.Bitmap 的當地語系化資源。 + /// + internal static System.Drawing.Bitmap window16 { + get { + object obj = ResourceManager.GetObject("window16", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查詢類型 System.Drawing.Bitmap 的當地語系化資源。 + /// + internal static System.Drawing.Bitmap xiao_add { + get { + object obj = ResourceManager.GetObject("xiao_add", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查詢類型 System.Drawing.Bitmap 的當地語系化資源。 + /// + internal static System.Drawing.Bitmap xiao_arrow { + get { + object obj = ResourceManager.GetObject("xiao_arrow", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查詢類型 System.Drawing.Bitmap 的當地語系化資源。 + /// + internal static System.Drawing.Bitmap xiao_component { + get { + object obj = ResourceManager.GetObject("xiao_component", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查詢類型 System.Drawing.Bitmap 的當地語系化資源。 + /// + internal static System.Drawing.Bitmap xiao_delete { + get { + object obj = ResourceManager.GetObject("xiao_delete", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查詢類型 System.Drawing.Bitmap 的當地語系化資源。 + /// + internal static System.Drawing.Bitmap xiao_down { + get { + object obj = ResourceManager.GetObject("xiao_down", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查詢類型 System.Drawing.Bitmap 的當地語系化資源。 + /// + internal static System.Drawing.Bitmap xiao_ok { + get { + object obj = ResourceManager.GetObject("xiao_ok", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查詢類型 System.Drawing.Bitmap 的當地語系化資源。 + /// + internal static System.Drawing.Bitmap xiao_up { + get { + object obj = ResourceManager.GetObject("xiao_up", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查詢類型 System.Drawing.Bitmap 的當地語系化資源。 + /// + internal static System.Drawing.Bitmap xiao_wrench { + get { + object obj = ResourceManager.GetObject("xiao_wrench", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + } +} diff --git a/OnTopReplica/Properties/Resources.resx b/src/OnTopReplica/Properties/Resources.resx similarity index 98% rename from OnTopReplica/Properties/Resources.resx rename to src/OnTopReplica/Properties/Resources.resx index c39b077..e3e39d6 100644 --- a/OnTopReplica/Properties/Resources.resx +++ b/src/OnTopReplica/Properties/Resources.resx @@ -1,247 +1,247 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 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 - - - - ..\Assets\flag_ita.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Assets\xiao_add.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Assets\x-oblique.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Assets\component.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Assets\25.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Assets\window_multiple16.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Assets\xiao_delete.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Assets\regions_new.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Assets\pos_null.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Assets\window_opacity_new.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Assets\pos_topleft.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Assets\pos_bottomleft.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Assets\pos_topright.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Assets\clickforwarding.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Assets\newicon.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Assets\back.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Assets\xiao_up.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Assets\window16.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Assets\flag_czech.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Assets\pos_bottomright.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Assets\window_switch.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Assets\desktop.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Assets\flag_danish.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Assets\xiao_ok.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Assets\xiao_wrench.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Assets\list.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Assets\fullscreen.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Assets\xiao_down.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Assets\xiao_arrow.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Assets\window_border16.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Assets\flag_usa.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Assets\groupmode.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Assets\pos_center.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Assets\flag_spanish.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Assets\flag_poland.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Assets\flag_germany.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Assets\flag_china.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\minimize.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\help.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\new-flat-icon.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\new-flat-logo-64.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\assets\flag_taiwan.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + + ..\Assets\flag_ita.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Assets\xiao_add.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Assets\x-oblique.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Assets\component.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Assets\25.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Assets\window_multiple16.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Assets\xiao_delete.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Assets\regions_new.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Assets\pos_null.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Assets\window_opacity_new.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Assets\pos_topleft.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Assets\pos_bottomleft.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Assets\pos_topright.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Assets\clickforwarding.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Assets\newicon.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Assets\back.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Assets\xiao_up.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Assets\window16.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Assets\flag_czech.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Assets\pos_bottomright.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Assets\window_switch.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Assets\desktop.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Assets\flag_danish.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Assets\xiao_ok.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Assets\xiao_wrench.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Assets\list.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Assets\fullscreen.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Assets\xiao_down.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Assets\xiao_arrow.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Assets\window_border16.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Assets\flag_usa.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Assets\groupmode.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Assets\pos_center.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Assets\flag_spanish.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Assets\flag_poland.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Assets\flag_germany.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Assets\flag_china.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\minimize.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\help.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\new-flat-icon.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\new-flat-logo-64.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\assets\flag_taiwan.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + \ No newline at end of file diff --git a/OnTopReplica/Properties/Settings.Designer.cs b/src/OnTopReplica/Properties/Settings.Designer.cs similarity index 97% rename from OnTopReplica/Properties/Settings.Designer.cs rename to src/OnTopReplica/Properties/Settings.Designer.cs index 0d186a5..cb8029e 100644 --- a/OnTopReplica/Properties/Settings.Designer.cs +++ b/src/OnTopReplica/Properties/Settings.Designer.cs @@ -1,253 +1,253 @@ -//------------------------------------------------------------------------------ -// -// This code was generated by a tool. -// Runtime Version:4.0.30319.42000 -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -namespace OnTopReplica.Properties { - - - [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "15.1.0.0")] - internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { - - private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); - - public static Settings Default { - get { - return defaultInstance; - } - } - - [global::System.Configuration.UserScopedSettingAttribute()] - [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] - public global::OnTopReplica.StoredRegionArray SavedRegions { - get { - return ((global::OnTopReplica.StoredRegionArray)(this["SavedRegions"])); - } - set { - this["SavedRegions"] = value; - } - } - - [global::System.Configuration.UserScopedSettingAttribute()] - [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] - [global::System.Configuration.DefaultSettingValueAttribute("255")] - public byte Opacity { - get { - return ((byte)(this["Opacity"])); - } - set { - this["Opacity"] = value; - } - } - - [global::System.Configuration.UserScopedSettingAttribute()] - [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] - [global::System.Configuration.DefaultSettingValueAttribute("(Default)")] - public global::System.Globalization.CultureInfo Language { - get { - return ((global::System.Globalization.CultureInfo)(this["Language"])); - } - set { - this["Language"] = value; - } - } - - [global::System.Configuration.UserScopedSettingAttribute()] - [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] - [global::System.Configuration.DefaultSettingValueAttribute("True")] - public bool MustUpdate { - get { - return ((bool)(this["MustUpdate"])); - } - set { - this["MustUpdate"] = value; - } - } - - [global::System.Configuration.UserScopedSettingAttribute()] - [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] - [global::System.Configuration.DefaultSettingValueAttribute("True")] - public bool ClickThrough { - get { - return ((bool)(this["ClickThrough"])); - } - set { - this["ClickThrough"] = value; - } - } - - [global::System.Configuration.UserScopedSettingAttribute()] - [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] - [global::System.Configuration.DefaultSettingValueAttribute("True")] - public bool FirstTimeClickThrough { - get { - return ((bool)(this["FirstTimeClickThrough"])); - } - set { - this["FirstTimeClickThrough"] = value; - } - } - - [global::System.Configuration.UserScopedSettingAttribute()] - [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] - [global::System.Configuration.DefaultSettingValueAttribute("True")] - public bool FirstTimeClickForwarding { - get { - return ((bool)(this["FirstTimeClickForwarding"])); - } - set { - this["FirstTimeClickForwarding"] = value; - } - } - - [global::System.Configuration.UserScopedSettingAttribute()] - [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] - [global::System.Configuration.DefaultSettingValueAttribute("False")] - public bool FullscreenAlwaysOnTop { - get { - return ((bool)(this["FullscreenAlwaysOnTop"])); - } - set { - this["FullscreenAlwaysOnTop"] = value; - } - } - - [global::System.Configuration.UserScopedSettingAttribute()] - [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] - [global::System.Configuration.DefaultSettingValueAttribute("False")] - public bool RestoreSizeAndPosition { - get { - return ((bool)(this["RestoreSizeAndPosition"])); - } - set { - this["RestoreSizeAndPosition"] = value; - } - } - - [global::System.Configuration.UserScopedSettingAttribute()] - [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] - [global::System.Configuration.DefaultSettingValueAttribute("0, 0")] - public global::System.Drawing.Size RestoreLastSize { - get { - return ((global::System.Drawing.Size)(this["RestoreLastSize"])); - } - set { - this["RestoreLastSize"] = value; - } - } - - [global::System.Configuration.UserScopedSettingAttribute()] - [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] - [global::System.Configuration.DefaultSettingValueAttribute("0, 0")] - public global::System.Drawing.Point RestoreLastPosition { - get { - return ((global::System.Drawing.Point)(this["RestoreLastPosition"])); - } - set { - this["RestoreLastPosition"] = value; - } - } - - [global::System.Configuration.UserScopedSettingAttribute()] - [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] - [global::System.Configuration.DefaultSettingValueAttribute("False")] - public bool RestoreLastWindow { - get { - return ((bool)(this["RestoreLastWindow"])); - } - set { - this["RestoreLastWindow"] = value; - } - } - - [global::System.Configuration.UserScopedSettingAttribute()] - [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] - [global::System.Configuration.DefaultSettingValueAttribute("")] - public string RestoreLastWindowClass { - get { - return ((string)(this["RestoreLastWindowClass"])); - } - set { - this["RestoreLastWindowClass"] = value; - } - } - - [global::System.Configuration.UserScopedSettingAttribute()] - [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] - [global::System.Configuration.DefaultSettingValueAttribute("")] - public string RestoreLastWindowTitle { - get { - return ((string)(this["RestoreLastWindowTitle"])); - } - set { - this["RestoreLastWindowTitle"] = value; - } - } - - [global::System.Configuration.UserScopedSettingAttribute()] - [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] - [global::System.Configuration.DefaultSettingValueAttribute("0")] - public long RestoreLastWindowHwnd { - get { - return ((long)(this["RestoreLastWindowHwnd"])); - } - set { - this["RestoreLastWindowHwnd"] = value; - } - } - - [global::System.Configuration.UserScopedSettingAttribute()] - [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] - [global::System.Configuration.DefaultSettingValueAttribute("[CTRL]+[SHIFT]+C")] - public string HotKeyCloneCurrent { - get { - return ((string)(this["HotKeyCloneCurrent"])); - } - set { - this["HotKeyCloneCurrent"] = value; - } - } - - [global::System.Configuration.UserScopedSettingAttribute()] - [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] - [global::System.Configuration.DefaultSettingValueAttribute("[CTRL]+[SHIFT]+O")] - public string HotKeyShowHide { - get { - return ((string)(this["HotKeyShowHide"])); - } - set { - this["HotKeyShowHide"] = value; - } - } - - [global::System.Configuration.UserScopedSettingAttribute()] - [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] - [global::System.Configuration.DefaultSettingValueAttribute("Standard")] - public string FullscreenMode { - get { - return ((string)(this["FullscreenMode"])); - } - set { - this["FullscreenMode"] = value; - } - } - - [global::System.Configuration.UserScopedSettingAttribute()] - [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] - [global::System.Configuration.DefaultSettingValueAttribute("True")] - public bool RestoreLastShowChrome { - get { - return ((bool)(this["RestoreLastShowChrome"])); - } - set { - this["RestoreLastShowChrome"] = value; - } - } - } -} +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.42000 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace OnTopReplica.Properties { + + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "15.1.0.0")] + internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { + + private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); + + public static Settings Default { + get { + return defaultInstance; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + public global::OnTopReplica.StoredRegionArray SavedRegions { + get { + return ((global::OnTopReplica.StoredRegionArray)(this["SavedRegions"])); + } + set { + this["SavedRegions"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("255")] + public byte Opacity { + get { + return ((byte)(this["Opacity"])); + } + set { + this["Opacity"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("(Default)")] + public global::System.Globalization.CultureInfo Language { + get { + return ((global::System.Globalization.CultureInfo)(this["Language"])); + } + set { + this["Language"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("True")] + public bool MustUpdate { + get { + return ((bool)(this["MustUpdate"])); + } + set { + this["MustUpdate"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("True")] + public bool ClickThrough { + get { + return ((bool)(this["ClickThrough"])); + } + set { + this["ClickThrough"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("True")] + public bool FirstTimeClickThrough { + get { + return ((bool)(this["FirstTimeClickThrough"])); + } + set { + this["FirstTimeClickThrough"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("True")] + public bool FirstTimeClickForwarding { + get { + return ((bool)(this["FirstTimeClickForwarding"])); + } + set { + this["FirstTimeClickForwarding"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("False")] + public bool FullscreenAlwaysOnTop { + get { + return ((bool)(this["FullscreenAlwaysOnTop"])); + } + set { + this["FullscreenAlwaysOnTop"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("False")] + public bool RestoreSizeAndPosition { + get { + return ((bool)(this["RestoreSizeAndPosition"])); + } + set { + this["RestoreSizeAndPosition"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("0, 0")] + public global::System.Drawing.Size RestoreLastSize { + get { + return ((global::System.Drawing.Size)(this["RestoreLastSize"])); + } + set { + this["RestoreLastSize"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("0, 0")] + public global::System.Drawing.Point RestoreLastPosition { + get { + return ((global::System.Drawing.Point)(this["RestoreLastPosition"])); + } + set { + this["RestoreLastPosition"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("False")] + public bool RestoreLastWindow { + get { + return ((bool)(this["RestoreLastWindow"])); + } + set { + this["RestoreLastWindow"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("")] + public string RestoreLastWindowClass { + get { + return ((string)(this["RestoreLastWindowClass"])); + } + set { + this["RestoreLastWindowClass"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("")] + public string RestoreLastWindowTitle { + get { + return ((string)(this["RestoreLastWindowTitle"])); + } + set { + this["RestoreLastWindowTitle"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("0")] + public long RestoreLastWindowHwnd { + get { + return ((long)(this["RestoreLastWindowHwnd"])); + } + set { + this["RestoreLastWindowHwnd"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("[CTRL]+[SHIFT]+C")] + public string HotKeyCloneCurrent { + get { + return ((string)(this["HotKeyCloneCurrent"])); + } + set { + this["HotKeyCloneCurrent"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("[CTRL]+[SHIFT]+O")] + public string HotKeyShowHide { + get { + return ((string)(this["HotKeyShowHide"])); + } + set { + this["HotKeyShowHide"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("Standard")] + public string FullscreenMode { + get { + return ((string)(this["FullscreenMode"])); + } + set { + this["FullscreenMode"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("True")] + public bool RestoreLastShowChrome { + get { + return ((bool)(this["RestoreLastShowChrome"])); + } + set { + this["RestoreLastShowChrome"] = value; + } + } + } +} diff --git a/OnTopReplica/Properties/Settings.settings b/src/OnTopReplica/Properties/Settings.settings similarity index 97% rename from OnTopReplica/Properties/Settings.settings rename to src/OnTopReplica/Properties/Settings.settings index 70d1706..1757221 100644 --- a/OnTopReplica/Properties/Settings.settings +++ b/src/OnTopReplica/Properties/Settings.settings @@ -1,63 +1,63 @@ - - - - - - - - - 255 - - - (Default) - - - True - - - True - - - True - - - True - - - False - - - False - - - 0, 0 - - - 0, 0 - - - False - - - - - - - - - 0 - - - [CTRL]+[SHIFT]+C - - - [CTRL]+[SHIFT]+O - - - Standard - - - True - - + + + + + + + + + 255 + + + (Default) + + + True + + + True + + + True + + + True + + + False + + + False + + + 0, 0 + + + 0, 0 + + + False + + + + + + + + + 0 + + + [CTRL]+[SHIFT]+C + + + [CTRL]+[SHIFT]+O + + + Standard + + + True + + \ No newline at end of file diff --git a/OnTopReplica/Properties/app.manifest b/src/OnTopReplica/Properties/app.manifest similarity index 97% rename from OnTopReplica/Properties/app.manifest rename to src/OnTopReplica/Properties/app.manifest index c29c96a..232c715 100644 --- a/OnTopReplica/Properties/app.manifest +++ b/src/OnTopReplica/Properties/app.manifest @@ -1,26 +1,26 @@ - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/OnTopReplica/Resources/help.png b/src/OnTopReplica/Resources/help.png similarity index 100% rename from OnTopReplica/Resources/help.png rename to src/OnTopReplica/Resources/help.png diff --git a/OnTopReplica/Resources/minimize.png b/src/OnTopReplica/Resources/minimize.png similarity index 100% rename from OnTopReplica/Resources/minimize.png rename to src/OnTopReplica/Resources/minimize.png diff --git a/OnTopReplica/Resources/new-flat-icon.ico b/src/OnTopReplica/Resources/new-flat-icon.ico similarity index 100% rename from OnTopReplica/Resources/new-flat-icon.ico rename to src/OnTopReplica/Resources/new-flat-icon.ico diff --git a/OnTopReplica/Resources/new-flat-logo-64.png b/src/OnTopReplica/Resources/new-flat-logo-64.png similarity index 100% rename from OnTopReplica/Resources/new-flat-logo-64.png rename to src/OnTopReplica/Resources/new-flat-logo-64.png diff --git a/OnTopReplica/ScreenPosition.cs b/src/OnTopReplica/ScreenPosition.cs similarity index 97% rename from OnTopReplica/ScreenPosition.cs rename to src/OnTopReplica/ScreenPosition.cs index b792b0b..f7a44a3 100644 --- a/OnTopReplica/ScreenPosition.cs +++ b/src/OnTopReplica/ScreenPosition.cs @@ -1,87 +1,87 @@ -using System; -using System.Collections.Generic; -using System.Text; -using System.Windows.Forms; -using System.Drawing; - -namespace OnTopReplica { - - /// - /// Describes a resolution independent screen position. - /// - enum ScreenPosition { - TopLeft, - TopRight, - BottomLeft, - BottomRight, - Center - } - - /// - /// Extension methods for ScreenPositions. - /// - static class ScreenPositionExtensions { - - /// - /// Gets the coordinates point matching an independent screen position value. - /// - /// Screen position value. - /// Pixel point in screen coordinates. - public static Point ResolveScreenPosition(this Screen screen, ScreenPosition position) { - var rect = screen.WorkingArea; - - return ResolveScreenPositionToRectangle(rect, position); - } - - /// - /// Gets the coordinates matching an independent screen position value. - /// - /// Target control for which the coordinates should be resolved. - /// Screen position value. - /// Pixel point in screen coordinates. - public static Point ResolveScreenPositionEdge(this Control ctrl, ScreenPosition position) { - var ctrlRegion = ctrl.RectangleToScreen(ctrl.ClientRectangle); - - return ResolveScreenPositionToRectangle(ctrlRegion, position); - } - - private static Point ResolveScreenPositionToRectangle(Rectangle rect, ScreenPosition position) { - switch (position) { - case ScreenPosition.TopLeft: - return new Point(rect.X, rect.Y); - case ScreenPosition.TopRight: - return new Point(rect.X + rect.Width, rect.Y); - case ScreenPosition.BottomLeft: - return new Point(rect.X, rect.Y + rect.Height); - case ScreenPosition.BottomRight: - return new Point(rect.X + rect.Width, rect.Y + rect.Height); - case ScreenPosition.Center: - return new Point(rect.X + (rect.Width / 2), rect.Y + (rect.Height / 2)); - default: - throw new ArgumentException("Invalid ScreenPosition value."); - } - } - - /// - /// Sets the form's screen position in independent coordinates. - /// - /// - /// Position is set relative to the form's current screen. - /// - public static void SetScreenPosition(this MainForm form, ScreenPosition position) { - var screen = Screen.FromControl(form); - - var start = form.ResolveScreenPositionEdge(position); - var end = screen.ResolveScreenPosition(position); - - var move = end.Difference(start); - - //System.Diagnostics.Trace.WriteLine(string.Format("From {0} to {1} => {2}.", start, end, move)); - - var original = form.Location; - form.Location = new Point(original.X + move.X, original.Y + move.Y); - } - - } - -} +using System; +using System.Collections.Generic; +using System.Text; +using System.Windows.Forms; +using System.Drawing; + +namespace OnTopReplica { + + /// + /// Describes a resolution independent screen position. + /// + enum ScreenPosition { + TopLeft, + TopRight, + BottomLeft, + BottomRight, + Center + } + + /// + /// Extension methods for ScreenPositions. + /// + static class ScreenPositionExtensions { + + /// + /// Gets the coordinates point matching an independent screen position value. + /// + /// Screen position value. + /// Pixel point in screen coordinates. + public static Point ResolveScreenPosition(this Screen screen, ScreenPosition position) { + var rect = screen.WorkingArea; + + return ResolveScreenPositionToRectangle(rect, position); + } + + /// + /// Gets the coordinates matching an independent screen position value. + /// + /// Target control for which the coordinates should be resolved. + /// Screen position value. + /// Pixel point in screen coordinates. + public static Point ResolveScreenPositionEdge(this Control ctrl, ScreenPosition position) { + var ctrlRegion = ctrl.RectangleToScreen(ctrl.ClientRectangle); + + return ResolveScreenPositionToRectangle(ctrlRegion, position); + } + + private static Point ResolveScreenPositionToRectangle(Rectangle rect, ScreenPosition position) { + switch (position) { + case ScreenPosition.TopLeft: + return new Point(rect.X, rect.Y); + case ScreenPosition.TopRight: + return new Point(rect.X + rect.Width, rect.Y); + case ScreenPosition.BottomLeft: + return new Point(rect.X, rect.Y + rect.Height); + case ScreenPosition.BottomRight: + return new Point(rect.X + rect.Width, rect.Y + rect.Height); + case ScreenPosition.Center: + return new Point(rect.X + (rect.Width / 2), rect.Y + (rect.Height / 2)); + default: + throw new ArgumentException("Invalid ScreenPosition value."); + } + } + + /// + /// Sets the form's screen position in independent coordinates. + /// + /// + /// Position is set relative to the form's current screen. + /// + public static void SetScreenPosition(this MainForm form, ScreenPosition position) { + var screen = Screen.FromControl(form); + + var start = form.ResolveScreenPositionEdge(position); + var end = screen.ResolveScreenPosition(position); + + var move = end.Difference(start); + + //System.Diagnostics.Trace.WriteLine(string.Format("From {0} to {1} => {2}.", start, end, move)); + + var original = form.Location; + form.Location = new Point(original.X + move.X, original.Y + move.Y); + } + + } + +} diff --git a/OnTopReplica/Shell.cs b/src/OnTopReplica/Shell.cs similarity index 95% rename from OnTopReplica/Shell.cs rename to src/OnTopReplica/Shell.cs index 7ace07c..b241b1e 100644 --- a/OnTopReplica/Shell.cs +++ b/src/OnTopReplica/Shell.cs @@ -1,27 +1,27 @@ -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.Linq; -using System.Text; - -namespace OnTopReplica { - - static class Shell { - - /// - /// Executes a filename via Windows shell. - /// - /// Filename to execute. - public static void Execute(string filename){ - if (filename == null) - throw new ArgumentNullException(); - - Process.Start(new ProcessStartInfo { - FileName = filename, - UseShellExecute = true - }); - } - - } - -} +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Linq; +using System.Text; + +namespace OnTopReplica { + + static class Shell { + + /// + /// Executes a filename via Windows shell. + /// + /// Filename to execute. + public static void Execute(string filename){ + if (filename == null) + throw new ArgumentNullException(); + + Process.Start(new ProcessStartInfo { + FileName = filename, + UseShellExecute = true + }); + } + + } + +} diff --git a/OnTopReplica/SidePanel.cs b/src/OnTopReplica/SidePanel.cs similarity index 96% rename from OnTopReplica/SidePanel.cs rename to src/OnTopReplica/SidePanel.cs index 52efd81..4eb42c8 100644 --- a/OnTopReplica/SidePanel.cs +++ b/src/OnTopReplica/SidePanel.cs @@ -1,77 +1,77 @@ -using System; -using System.Collections.Generic; -using System.Text; -using System.Windows.Forms; -using WindowsFormsAero.Dwm; -using System.Drawing; - -namespace OnTopReplica { - - /// - /// Represents a side panel that can be embedded in OnTopReplica. - /// - class SidePanel : UserControl { - - public SidePanel() { - this.FixDefaultFont(); - } - - protected override void OnCreateControl() { - if (!DesignMode) { - Dock = DockStyle.Fill; - } - - base.OnCreateControl(); - } - - /// - /// Gets the panel's parent form. - /// - protected MainForm ParentMainForm { get; private set; } - - /// - /// Raised when the side panel requests to be closed. - /// - public event EventHandler RequestClosing; - - protected virtual void OnRequestClosing() { - var evt = RequestClosing; - if (evt != null) - evt(this, EventArgs.Empty); - } - - /// - /// Is called when the side panel is embedded and first shown. - /// - /// Parent form that is embedding the side panel. - public virtual void OnFirstShown(MainForm form) { - ParentMainForm = form; - } - - /// - /// Is called before removing the side panel. - /// - /// Parent form that is embedding the side panel. - public virtual void OnClosing(MainForm form) { - } - - /// - /// Gets the side panel's title. - /// - public virtual string Title { - get { - return "Side panel"; - } - } - - /// - /// Gets the panel's desired glass margins. - /// - public virtual Padding GlassMargins { - get { - return Padding.Empty; - } - } - - } -} +using System; +using System.Collections.Generic; +using System.Text; +using System.Windows.Forms; +using WindowsFormsAero.Dwm; +using System.Drawing; + +namespace OnTopReplica { + + /// + /// Represents a side panel that can be embedded in OnTopReplica. + /// + class SidePanel : UserControl { + + public SidePanel() { + this.FixDefaultFont(); + } + + protected override void OnCreateControl() { + if (!DesignMode) { + Dock = DockStyle.Fill; + } + + base.OnCreateControl(); + } + + /// + /// Gets the panel's parent form. + /// + protected MainForm ParentMainForm { get; private set; } + + /// + /// Raised when the side panel requests to be closed. + /// + public event EventHandler RequestClosing; + + protected virtual void OnRequestClosing() { + var evt = RequestClosing; + if (evt != null) + evt(this, EventArgs.Empty); + } + + /// + /// Is called when the side panel is embedded and first shown. + /// + /// Parent form that is embedding the side panel. + public virtual void OnFirstShown(MainForm form) { + ParentMainForm = form; + } + + /// + /// Is called before removing the side panel. + /// + /// Parent form that is embedding the side panel. + public virtual void OnClosing(MainForm form) { + } + + /// + /// Gets the side panel's title. + /// + public virtual string Title { + get { + return "Side panel"; + } + } + + /// + /// Gets the panel's desired glass margins. + /// + public virtual Padding GlassMargins { + get { + return Padding.Empty; + } + } + + } +} diff --git a/OnTopReplica/SidePanelContainer.Designer.cs b/src/OnTopReplica/SidePanelContainer.Designer.cs similarity index 97% rename from OnTopReplica/SidePanelContainer.Designer.cs rename to src/OnTopReplica/SidePanelContainer.Designer.cs index 1c6f3e1..9258ec1 100644 --- a/OnTopReplica/SidePanelContainer.Designer.cs +++ b/src/OnTopReplica/SidePanelContainer.Designer.cs @@ -1,46 +1,46 @@ -namespace OnTopReplica { - partial class SidePanelContainer { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) { - if (disposing && (components != null)) { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Windows Form Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() { - this.SuspendLayout(); - // - // SidePanelContainer - // - this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 15F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(287, 346); - this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.SizableToolWindow; - this.MinimizeBox = false; - this.Name = "SidePanelContainer"; - this.ShowInTaskbar = false; - this.StartPosition = System.Windows.Forms.FormStartPosition.Manual; - this.Text = "Side Panel container"; - this.TopMost = true; - this.ResumeLayout(false); - - } - - #endregion - } +namespace OnTopReplica { + partial class SidePanelContainer { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) { + if (disposing && (components != null)) { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() { + this.SuspendLayout(); + // + // SidePanelContainer + // + this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 15F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(287, 346); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.SizableToolWindow; + this.MinimizeBox = false; + this.Name = "SidePanelContainer"; + this.ShowInTaskbar = false; + this.StartPosition = System.Windows.Forms.FormStartPosition.Manual; + this.Text = "Side Panel container"; + this.TopMost = true; + this.ResumeLayout(false); + + } + + #endregion + } } \ No newline at end of file diff --git a/OnTopReplica/SidePanelContainer.cs b/src/OnTopReplica/SidePanelContainer.cs similarity index 96% rename from OnTopReplica/SidePanelContainer.cs rename to src/OnTopReplica/SidePanelContainer.cs index 1860116..277e8b8 100644 --- a/OnTopReplica/SidePanelContainer.cs +++ b/src/OnTopReplica/SidePanelContainer.cs @@ -1,99 +1,99 @@ -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Drawing; -using System.Text; -using System.Windows.Forms; - -namespace OnTopReplica { - /// - /// Acts as a form that can contain a SidePanel instance. - /// - partial class SidePanelContainer : WindowsFormsAero.AeroForm { - - EventHandler RequestClosingHandler; - - MainForm _parent; - - public SidePanelContainer(MainForm mainForm) { - InitializeComponent(); - - _parent = mainForm; - RequestClosingHandler = new EventHandler(Panel_RequestClosing); - } - - void Panel_RequestClosing(object sender, EventArgs e) { - FreeSidePanel(); - this.Close(); - } - - protected override void OnClosing(CancelEventArgs e) { - base.OnClosing(e); - - //Ensure side panel closing code is run - FreeSidePanel(); - } - - /// - /// Sets a new side panel and refreshes the window. The panel is - /// managed by the SidePanelContainer from now on. - /// - /// SidePanel to embed and to manage. - public void SetSidePanel(SidePanel panel) { - panel.OnFirstShown(_parent); - - this.SuspendLayout(); - - //Title - this.Text = panel.Title; - - //Set panel - CurrentSidePanel = panel; - panel.RequestClosing += RequestClosingHandler; - this.Controls.Add(panel); - - var minSize = panel.MinimumSize.Expand(this.Padding); - this.ClientSize = minSize; - this.EnsureMinimumClientSize(minSize); - this.GlassMargins = panel.GlassMargins; - - this.ResumeLayout(); - } - - /// - /// Removes the current side panel and disposes it. - /// - public void FreeSidePanel() { - if (CurrentSidePanel == null) - return; - - this.SuspendLayout(); - - FreeSidePanelCore(); - - this.ResumeLayout(); - } - - /// - /// Removes the current side panel and disposes it (doesn't suspend layout). - /// - private void FreeSidePanelCore() { - CurrentSidePanel.OnClosing(_parent); - - //Free hook - CurrentSidePanel.RequestClosing -= RequestClosingHandler; - - //Remove - this.Controls.Remove(CurrentSidePanel); - - //Free - CurrentSidePanel.Dispose(); - CurrentSidePanel = null; - } - - public SidePanel CurrentSidePanel { - get; - private set; - } - } -} +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +namespace OnTopReplica { + /// + /// Acts as a form that can contain a SidePanel instance. + /// + partial class SidePanelContainer : WindowsFormsAero.AeroForm { + + EventHandler RequestClosingHandler; + + MainForm _parent; + + public SidePanelContainer(MainForm mainForm) { + InitializeComponent(); + + _parent = mainForm; + RequestClosingHandler = new EventHandler(Panel_RequestClosing); + } + + void Panel_RequestClosing(object sender, EventArgs e) { + FreeSidePanel(); + this.Close(); + } + + protected override void OnClosing(CancelEventArgs e) { + base.OnClosing(e); + + //Ensure side panel closing code is run + FreeSidePanel(); + } + + /// + /// Sets a new side panel and refreshes the window. The panel is + /// managed by the SidePanelContainer from now on. + /// + /// SidePanel to embed and to manage. + public void SetSidePanel(SidePanel panel) { + panel.OnFirstShown(_parent); + + this.SuspendLayout(); + + //Title + this.Text = panel.Title; + + //Set panel + CurrentSidePanel = panel; + panel.RequestClosing += RequestClosingHandler; + this.Controls.Add(panel); + + var minSize = panel.MinimumSize.Expand(this.Padding); + this.ClientSize = minSize; + this.EnsureMinimumClientSize(minSize); + this.GlassMargins = panel.GlassMargins; + + this.ResumeLayout(); + } + + /// + /// Removes the current side panel and disposes it. + /// + public void FreeSidePanel() { + if (CurrentSidePanel == null) + return; + + this.SuspendLayout(); + + FreeSidePanelCore(); + + this.ResumeLayout(); + } + + /// + /// Removes the current side panel and disposes it (doesn't suspend layout). + /// + private void FreeSidePanelCore() { + CurrentSidePanel.OnClosing(_parent); + + //Free hook + CurrentSidePanel.RequestClosing -= RequestClosingHandler; + + //Remove + this.Controls.Remove(CurrentSidePanel); + + //Free + CurrentSidePanel.Dispose(); + CurrentSidePanel = null; + } + + public SidePanel CurrentSidePanel { + get; + private set; + } + } +} diff --git a/OnTopReplica/SidePanelContainer.resx b/src/OnTopReplica/SidePanelContainer.resx similarity index 97% rename from OnTopReplica/SidePanelContainer.resx rename to src/OnTopReplica/SidePanelContainer.resx index 29dcb1b..1af7de1 100644 --- a/OnTopReplica/SidePanelContainer.resx +++ b/src/OnTopReplica/SidePanelContainer.resx @@ -1,120 +1,120 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 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 - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + \ No newline at end of file diff --git a/OnTopReplica/SidePanels/AboutPanel.Designer.cs b/src/OnTopReplica/SidePanels/AboutPanel.Designer.cs similarity index 97% rename from OnTopReplica/SidePanels/AboutPanel.Designer.cs rename to src/OnTopReplica/SidePanels/AboutPanel.Designer.cs index 64c9697..79d8f01 100644 --- a/OnTopReplica/SidePanels/AboutPanel.Designer.cs +++ b/src/OnTopReplica/SidePanels/AboutPanel.Designer.cs @@ -1,73 +1,73 @@ -namespace OnTopReplica.SidePanels { - partial class AboutPanel { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) { - if (disposing && (components != null)) { - components.Dispose(); - } - 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() { - this.labelVersion = new WindowsFormsAero.ThemeLabel(); - this.panelContents = new OnTopReplica.SidePanels.AboutPanelContents(); - this.SuspendLayout(); - // - // labelVersion - // - this.labelVersion.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.labelVersion.Location = new System.Drawing.Point(0, 312); - this.labelVersion.Name = "labelVersion"; - this.labelVersion.Padding = new System.Windows.Forms.Padding(0, 0, 0, 3); - this.labelVersion.Size = new System.Drawing.Size(344, 23); - this.labelVersion.TabIndex = 0; - this.labelVersion.Text = "Version"; - this.labelVersion.TextAlign = System.Windows.Forms.HorizontalAlignment.Center; - this.labelVersion.TextAlignVertical = System.Windows.Forms.VisualStyles.VerticalAlignment.Bottom; - // - // panelContents - // - this.panelContents.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.panelContents.AutoScroll = true; - this.panelContents.Location = new System.Drawing.Point(7, 7); - this.panelContents.Name = "panelContents"; - this.panelContents.Size = new System.Drawing.Size(330, 294); - this.panelContents.TabIndex = 1; - // - // AboutPanel - // - this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 15F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.Controls.Add(this.panelContents); - this.Controls.Add(this.labelVersion); - this.MinimumSize = new System.Drawing.Size(344, 335); - this.Name = "AboutPanel"; - this.Size = new System.Drawing.Size(344, 335); - this.ResumeLayout(false); - - } - - #endregion - - private WindowsFormsAero.ThemeLabel labelVersion; - private AboutPanelContents panelContents; - - } -} +namespace OnTopReplica.SidePanels { + partial class AboutPanel { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) { + if (disposing && (components != null)) { + components.Dispose(); + } + 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() { + this.labelVersion = new WindowsFormsAero.ThemeLabel(); + this.panelContents = new OnTopReplica.SidePanels.AboutPanelContents(); + this.SuspendLayout(); + // + // labelVersion + // + this.labelVersion.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.labelVersion.Location = new System.Drawing.Point(0, 312); + this.labelVersion.Name = "labelVersion"; + this.labelVersion.Padding = new System.Windows.Forms.Padding(0, 0, 0, 3); + this.labelVersion.Size = new System.Drawing.Size(344, 23); + this.labelVersion.TabIndex = 0; + this.labelVersion.Text = "Version"; + this.labelVersion.TextAlign = System.Windows.Forms.HorizontalAlignment.Center; + this.labelVersion.TextAlignVertical = System.Windows.Forms.VisualStyles.VerticalAlignment.Bottom; + // + // panelContents + // + this.panelContents.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.panelContents.AutoScroll = true; + this.panelContents.Location = new System.Drawing.Point(7, 7); + this.panelContents.Name = "panelContents"; + this.panelContents.Size = new System.Drawing.Size(330, 294); + this.panelContents.TabIndex = 1; + // + // AboutPanel + // + this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 15F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.panelContents); + this.Controls.Add(this.labelVersion); + this.MinimumSize = new System.Drawing.Size(344, 335); + this.Name = "AboutPanel"; + this.Size = new System.Drawing.Size(344, 335); + this.ResumeLayout(false); + + } + + #endregion + + private WindowsFormsAero.ThemeLabel labelVersion; + private AboutPanelContents panelContents; + + } +} diff --git a/OnTopReplica/SidePanels/AboutPanel.cs b/src/OnTopReplica/SidePanels/AboutPanel.cs similarity index 95% rename from OnTopReplica/SidePanels/AboutPanel.cs rename to src/OnTopReplica/SidePanels/AboutPanel.cs index 0e7a323..a3e66ad 100644 --- a/OnTopReplica/SidePanels/AboutPanel.cs +++ b/src/OnTopReplica/SidePanels/AboutPanel.cs @@ -1,33 +1,33 @@ -using OnTopReplica.Properties; -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Drawing; -using System.Text; -using System.Windows.Forms; -using WindowsFormsAero.Dwm; - -namespace OnTopReplica.SidePanels { - partial class AboutPanel : SidePanel { - - public AboutPanel() { - InitializeComponent(); - - //Display version number - labelVersion.Text = string.Format(Strings.AboutVersion, Application.ProductVersion); - } - - public override string Title { - get { - return Strings.AboutTitle; - } - } - - public override Padding GlassMargins { - get { - return new Padding(0, 0, 0, labelVersion.Height); - } - } - - } -} +using OnTopReplica.Properties; +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Text; +using System.Windows.Forms; +using WindowsFormsAero.Dwm; + +namespace OnTopReplica.SidePanels { + partial class AboutPanel : SidePanel { + + public AboutPanel() { + InitializeComponent(); + + //Display version number + labelVersion.Text = string.Format(Strings.AboutVersion, Application.ProductVersion); + } + + public override string Title { + get { + return Strings.AboutTitle; + } + } + + public override Padding GlassMargins { + get { + return new Padding(0, 0, 0, labelVersion.Height); + } + } + + } +} diff --git a/OnTopReplica/SidePanels/AboutPanel.resx b/src/OnTopReplica/SidePanels/AboutPanel.resx similarity index 97% rename from OnTopReplica/SidePanels/AboutPanel.resx rename to src/OnTopReplica/SidePanels/AboutPanel.resx index 29dcb1b..1af7de1 100644 --- a/OnTopReplica/SidePanels/AboutPanel.resx +++ b/src/OnTopReplica/SidePanels/AboutPanel.resx @@ -1,120 +1,120 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 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 - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + \ No newline at end of file diff --git a/OnTopReplica/SidePanels/AboutPanelContents.Designer.cs b/src/OnTopReplica/SidePanels/AboutPanelContents.Designer.cs similarity index 98% rename from OnTopReplica/SidePanels/AboutPanelContents.Designer.cs rename to src/OnTopReplica/SidePanels/AboutPanelContents.Designer.cs index cebc1e2..ffc8077 100644 --- a/OnTopReplica/SidePanels/AboutPanelContents.Designer.cs +++ b/src/OnTopReplica/SidePanels/AboutPanelContents.Designer.cs @@ -1,283 +1,283 @@ -namespace OnTopReplica.SidePanels { - partial class AboutPanelContents { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) { - if (disposing && (components != null)) { - components.Dispose(); - } - 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() { - this.labelTranslators = new System.Windows.Forms.Label(); - this.linkCredits = new System.Windows.Forms.LinkLabel(); - this.progressUpdate = new WindowsFormsAero.ProgressBar(); - this.buttonUpdate = new System.Windows.Forms.Button(); - this.lblUpdateDisclaimer = new System.Windows.Forms.Label(); - this.labeledDivider2 = new WindowsFormsAero.LabeledDivider(); - this.labeledDivider1 = new WindowsFormsAero.LabeledDivider(); - this.linkHomepage = new System.Windows.Forms.LinkLabel(); - this.linkAuthor = new System.Windows.Forms.LinkLabel(); - this.lblSlogan = new System.Windows.Forms.Label(); - this.labeledDivider3 = new WindowsFormsAero.LabeledDivider(); - this.linkLicense = new System.Windows.Forms.LinkLabel(); - this.labeledDivider4 = new WindowsFormsAero.LabeledDivider(); - this.linkContribute = new System.Windows.Forms.LinkLabel(); - this.pictureBox1 = new System.Windows.Forms.PictureBox(); - ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit(); - this.SuspendLayout(); - // - // labelTranslators - // - this.labelTranslators.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.labelTranslators.AutoEllipsis = true; - this.labelTranslators.Location = new System.Drawing.Point(0, 289); - this.labelTranslators.Name = "labelTranslators"; - this.labelTranslators.Size = new System.Drawing.Size(302, 101); - this.labelTranslators.TabIndex = 31; - this.labelTranslators.Text = "Translators:"; - // - // linkCredits - // - this.linkCredits.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.linkCredits.AutoEllipsis = true; - this.linkCredits.LinkBehavior = System.Windows.Forms.LinkBehavior.HoverUnderline; - this.linkCredits.Location = new System.Drawing.Point(0, 223); - this.linkCredits.Name = "linkCredits"; - this.linkCredits.Size = new System.Drawing.Size(302, 57); - this.linkCredits.TabIndex = 30; - this.linkCredits.TabStop = true; - this.linkCredits.Text = "%CREDITS%"; - this.linkCredits.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.LinkCredits_click); - // - // progressUpdate - // - this.progressUpdate.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.progressUpdate.Location = new System.Drawing.Point(0, 155); - this.progressUpdate.Name = "progressUpdate"; - this.progressUpdate.Size = new System.Drawing.Size(194, 23); - this.progressUpdate.Style = System.Windows.Forms.ProgressBarStyle.Marquee; - this.progressUpdate.TabIndex = 29; - this.progressUpdate.Visible = false; - // - // buttonUpdate - // - this.buttonUpdate.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); - this.buttonUpdate.Location = new System.Drawing.Point(200, 155); - this.buttonUpdate.Name = "buttonUpdate"; - this.buttonUpdate.Size = new System.Drawing.Size(102, 23); - this.buttonUpdate.TabIndex = 28; - this.buttonUpdate.Text = global::OnTopReplica.Strings.AboutUpdatesCheckNow; - this.buttonUpdate.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageBeforeText; - this.buttonUpdate.UseVisualStyleBackColor = true; - this.buttonUpdate.Click += new System.EventHandler(this.UpdateButton_click); - // - // lblUpdateDisclaimer - // - this.lblUpdateDisclaimer.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.lblUpdateDisclaimer.AutoEllipsis = true; - this.lblUpdateDisclaimer.Location = new System.Drawing.Point(0, 108); - this.lblUpdateDisclaimer.Name = "lblUpdateDisclaimer"; - this.lblUpdateDisclaimer.Size = new System.Drawing.Size(302, 44); - this.lblUpdateDisclaimer.TabIndex = 27; - this.lblUpdateDisclaimer.Text = "OnTopReplica automatically checks for updates at every start up."; - // - // labeledDivider2 - // - this.labeledDivider2.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.labeledDivider2.DividerColor = System.Drawing.Color.FromArgb(((int)(((byte)(176)))), ((int)(((byte)(191)))), ((int)(((byte)(222))))); - this.labeledDivider2.Font = new System.Drawing.Font("Microsoft Sans Serif", 9F); - this.labeledDivider2.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(51)))), ((int)(((byte)(170))))); - this.labeledDivider2.Location = new System.Drawing.Point(0, 197); - this.labeledDivider2.Name = "labeledDivider2"; - this.labeledDivider2.Size = new System.Drawing.Size(302, 23); - this.labeledDivider2.TabIndex = 26; - this.labeledDivider2.Text = global::OnTopReplica.Strings.AboutDividerCredits; - // - // labeledDivider1 - // - this.labeledDivider1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.labeledDivider1.DividerColor = System.Drawing.Color.FromArgb(((int)(((byte)(176)))), ((int)(((byte)(191)))), ((int)(((byte)(222))))); - this.labeledDivider1.Font = new System.Drawing.Font("Microsoft Sans Serif", 9F); - this.labeledDivider1.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(51)))), ((int)(((byte)(170))))); - this.labeledDivider1.Location = new System.Drawing.Point(0, 82); - this.labeledDivider1.Name = "labeledDivider1"; - this.labeledDivider1.Size = new System.Drawing.Size(302, 23); - this.labeledDivider1.TabIndex = 25; - this.labeledDivider1.Text = global::OnTopReplica.Strings.AboutDividerUpdates; - // - // linkHomepage - // - this.linkHomepage.AutoSize = true; - this.linkHomepage.BackColor = System.Drawing.Color.Transparent; - this.linkHomepage.LinkBehavior = System.Windows.Forms.LinkBehavior.HoverUnderline; - this.linkHomepage.Location = new System.Drawing.Point(67, 50); - this.linkHomepage.Name = "linkHomepage"; - this.linkHomepage.Size = new System.Drawing.Size(167, 17); - this.linkHomepage.TabIndex = 23; - this.linkHomepage.TabStop = true; - this.linkHomepage.Text = "http://ontopreplica.codeplex.com"; - this.linkHomepage.UseCompatibleTextRendering = true; - this.linkHomepage.VisitedLinkColor = System.Drawing.Color.Blue; - this.linkHomepage.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.LinkHomepage_clicked); - // - // linkAuthor - // - this.linkAuthor.AutoSize = true; - this.linkAuthor.BackColor = System.Drawing.Color.Transparent; - this.linkAuthor.LinkBehavior = System.Windows.Forms.LinkBehavior.HoverUnderline; - this.linkAuthor.LinkColor = System.Drawing.Color.Blue; - this.linkAuthor.Location = new System.Drawing.Point(67, 33); - this.linkAuthor.Name = "linkAuthor"; - this.linkAuthor.Size = new System.Drawing.Size(72, 17); - this.linkAuthor.TabIndex = 22; - this.linkAuthor.TabStop = true; - this.linkAuthor.Text = "%AUTHOR%"; - this.linkAuthor.UseCompatibleTextRendering = true; - this.linkAuthor.VisitedLinkColor = System.Drawing.Color.Blue; - this.linkAuthor.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.LinkAuthor_clicked); - // - // lblSlogan - // - this.lblSlogan.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.lblSlogan.AutoEllipsis = true; - this.lblSlogan.BackColor = System.Drawing.Color.Transparent; - this.lblSlogan.Location = new System.Drawing.Point(67, 0); - this.lblSlogan.Name = "lblSlogan"; - this.lblSlogan.Size = new System.Drawing.Size(235, 33); - this.lblSlogan.TabIndex = 24; - this.lblSlogan.Text = "A lightweight, real-time, always on top thumbnail of a window of your choice."; - // - // labeledDivider3 - // - this.labeledDivider3.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.labeledDivider3.DividerColor = System.Drawing.Color.FromArgb(((int)(((byte)(176)))), ((int)(((byte)(191)))), ((int)(((byte)(222))))); - this.labeledDivider3.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(51)))), ((int)(((byte)(170))))); - this.labeledDivider3.Location = new System.Drawing.Point(0, 393); - this.labeledDivider3.Name = "labeledDivider3"; - this.labeledDivider3.Size = new System.Drawing.Size(302, 23); - this.labeledDivider3.TabIndex = 32; - this.labeledDivider3.Text = "License"; - // - // linkLicense - // - this.linkLicense.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.linkLicense.AutoEllipsis = true; - this.linkLicense.LinkBehavior = System.Windows.Forms.LinkBehavior.HoverUnderline; - this.linkLicense.Location = new System.Drawing.Point(0, 419); - this.linkLicense.Name = "linkLicense"; - this.linkLicense.Size = new System.Drawing.Size(302, 81); - this.linkLicense.TabIndex = 33; - this.linkLicense.TabStop = true; - this.linkLicense.Text = "%LICENSE%"; - this.linkLicense.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.LinkLicense_click); - // - // labeledDivider4 - // - this.labeledDivider4.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.labeledDivider4.DividerColor = System.Drawing.Color.FromArgb(((int)(((byte)(176)))), ((int)(((byte)(191)))), ((int)(((byte)(222))))); - this.labeledDivider4.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(51)))), ((int)(((byte)(170))))); - this.labeledDivider4.Location = new System.Drawing.Point(0, 503); - this.labeledDivider4.Name = "labeledDivider4"; - this.labeledDivider4.Size = new System.Drawing.Size(302, 23); - this.labeledDivider4.TabIndex = 34; - this.labeledDivider4.Text = "Contribute"; - // - // linkContribute - // - this.linkContribute.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.linkContribute.AutoEllipsis = true; - this.linkContribute.LinkBehavior = System.Windows.Forms.LinkBehavior.HoverUnderline; - this.linkContribute.Location = new System.Drawing.Point(0, 529); - this.linkContribute.Name = "linkContribute"; - this.linkContribute.Size = new System.Drawing.Size(302, 84); - this.linkContribute.TabIndex = 35; - this.linkContribute.TabStop = true; - this.linkContribute.Text = "%CONTRIBUTE%"; - this.linkContribute.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.LinkContribute_clicked); - // - // pictureBox1 - // - this.pictureBox1.Image = global::OnTopReplica.Properties.Resources.flat_logo_64; - this.pictureBox1.Location = new System.Drawing.Point(0, 0); - this.pictureBox1.Margin = new System.Windows.Forms.Padding(0); - this.pictureBox1.Name = "pictureBox1"; - this.pictureBox1.Size = new System.Drawing.Size(64, 64); - this.pictureBox1.SizeMode = System.Windows.Forms.PictureBoxSizeMode.CenterImage; - this.pictureBox1.TabIndex = 36; - this.pictureBox1.TabStop = false; - // - // AboutPanelContents - // - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.AutoScroll = true; - this.Controls.Add(this.pictureBox1); - this.Controls.Add(this.linkContribute); - this.Controls.Add(this.labeledDivider4); - this.Controls.Add(this.linkLicense); - this.Controls.Add(this.labeledDivider3); - this.Controls.Add(this.labelTranslators); - this.Controls.Add(this.linkCredits); - this.Controls.Add(this.progressUpdate); - this.Controls.Add(this.buttonUpdate); - this.Controls.Add(this.lblUpdateDisclaimer); - this.Controls.Add(this.labeledDivider2); - this.Controls.Add(this.labeledDivider1); - this.Controls.Add(this.linkHomepage); - this.Controls.Add(this.linkAuthor); - this.Controls.Add(this.lblSlogan); - this.Margin = new System.Windows.Forms.Padding(0); - this.Name = "AboutPanelContents"; - this.Size = new System.Drawing.Size(305, 613); - ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit(); - this.ResumeLayout(false); - this.PerformLayout(); - - } - - #endregion - - private System.Windows.Forms.Label labelTranslators; - private System.Windows.Forms.LinkLabel linkCredits; - private WindowsFormsAero.ProgressBar progressUpdate; - private System.Windows.Forms.Button buttonUpdate; - private System.Windows.Forms.Label lblUpdateDisclaimer; - private WindowsFormsAero.LabeledDivider labeledDivider2; - private WindowsFormsAero.LabeledDivider labeledDivider1; - private System.Windows.Forms.LinkLabel linkHomepage; - private System.Windows.Forms.LinkLabel linkAuthor; - private System.Windows.Forms.Label lblSlogan; - private WindowsFormsAero.LabeledDivider labeledDivider3; - private System.Windows.Forms.LinkLabel linkLicense; - private WindowsFormsAero.LabeledDivider labeledDivider4; - private System.Windows.Forms.LinkLabel linkContribute; - private System.Windows.Forms.PictureBox pictureBox1; - - } -} +namespace OnTopReplica.SidePanels { + partial class AboutPanelContents { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) { + if (disposing && (components != null)) { + components.Dispose(); + } + 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() { + this.labelTranslators = new System.Windows.Forms.Label(); + this.linkCredits = new System.Windows.Forms.LinkLabel(); + this.progressUpdate = new WindowsFormsAero.ProgressBar(); + this.buttonUpdate = new System.Windows.Forms.Button(); + this.lblUpdateDisclaimer = new System.Windows.Forms.Label(); + this.labeledDivider2 = new WindowsFormsAero.LabeledDivider(); + this.labeledDivider1 = new WindowsFormsAero.LabeledDivider(); + this.linkHomepage = new System.Windows.Forms.LinkLabel(); + this.linkAuthor = new System.Windows.Forms.LinkLabel(); + this.lblSlogan = new System.Windows.Forms.Label(); + this.labeledDivider3 = new WindowsFormsAero.LabeledDivider(); + this.linkLicense = new System.Windows.Forms.LinkLabel(); + this.labeledDivider4 = new WindowsFormsAero.LabeledDivider(); + this.linkContribute = new System.Windows.Forms.LinkLabel(); + this.pictureBox1 = new System.Windows.Forms.PictureBox(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit(); + this.SuspendLayout(); + // + // labelTranslators + // + this.labelTranslators.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.labelTranslators.AutoEllipsis = true; + this.labelTranslators.Location = new System.Drawing.Point(0, 289); + this.labelTranslators.Name = "labelTranslators"; + this.labelTranslators.Size = new System.Drawing.Size(302, 101); + this.labelTranslators.TabIndex = 31; + this.labelTranslators.Text = "Translators:"; + // + // linkCredits + // + this.linkCredits.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.linkCredits.AutoEllipsis = true; + this.linkCredits.LinkBehavior = System.Windows.Forms.LinkBehavior.HoverUnderline; + this.linkCredits.Location = new System.Drawing.Point(0, 223); + this.linkCredits.Name = "linkCredits"; + this.linkCredits.Size = new System.Drawing.Size(302, 57); + this.linkCredits.TabIndex = 30; + this.linkCredits.TabStop = true; + this.linkCredits.Text = "%CREDITS%"; + this.linkCredits.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.LinkCredits_click); + // + // progressUpdate + // + this.progressUpdate.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.progressUpdate.Location = new System.Drawing.Point(0, 155); + this.progressUpdate.Name = "progressUpdate"; + this.progressUpdate.Size = new System.Drawing.Size(194, 23); + this.progressUpdate.Style = System.Windows.Forms.ProgressBarStyle.Marquee; + this.progressUpdate.TabIndex = 29; + this.progressUpdate.Visible = false; + // + // buttonUpdate + // + this.buttonUpdate.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.buttonUpdate.Location = new System.Drawing.Point(200, 155); + this.buttonUpdate.Name = "buttonUpdate"; + this.buttonUpdate.Size = new System.Drawing.Size(102, 23); + this.buttonUpdate.TabIndex = 28; + this.buttonUpdate.Text = global::OnTopReplica.Strings.AboutUpdatesCheckNow; + this.buttonUpdate.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageBeforeText; + this.buttonUpdate.UseVisualStyleBackColor = true; + this.buttonUpdate.Click += new System.EventHandler(this.UpdateButton_click); + // + // lblUpdateDisclaimer + // + this.lblUpdateDisclaimer.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.lblUpdateDisclaimer.AutoEllipsis = true; + this.lblUpdateDisclaimer.Location = new System.Drawing.Point(0, 108); + this.lblUpdateDisclaimer.Name = "lblUpdateDisclaimer"; + this.lblUpdateDisclaimer.Size = new System.Drawing.Size(302, 44); + this.lblUpdateDisclaimer.TabIndex = 27; + this.lblUpdateDisclaimer.Text = "OnTopReplica automatically checks for updates at every start up."; + // + // labeledDivider2 + // + this.labeledDivider2.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.labeledDivider2.DividerColor = System.Drawing.Color.FromArgb(((int)(((byte)(176)))), ((int)(((byte)(191)))), ((int)(((byte)(222))))); + this.labeledDivider2.Font = new System.Drawing.Font("Microsoft Sans Serif", 9F); + this.labeledDivider2.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(51)))), ((int)(((byte)(170))))); + this.labeledDivider2.Location = new System.Drawing.Point(0, 197); + this.labeledDivider2.Name = "labeledDivider2"; + this.labeledDivider2.Size = new System.Drawing.Size(302, 23); + this.labeledDivider2.TabIndex = 26; + this.labeledDivider2.Text = global::OnTopReplica.Strings.AboutDividerCredits; + // + // labeledDivider1 + // + this.labeledDivider1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.labeledDivider1.DividerColor = System.Drawing.Color.FromArgb(((int)(((byte)(176)))), ((int)(((byte)(191)))), ((int)(((byte)(222))))); + this.labeledDivider1.Font = new System.Drawing.Font("Microsoft Sans Serif", 9F); + this.labeledDivider1.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(51)))), ((int)(((byte)(170))))); + this.labeledDivider1.Location = new System.Drawing.Point(0, 82); + this.labeledDivider1.Name = "labeledDivider1"; + this.labeledDivider1.Size = new System.Drawing.Size(302, 23); + this.labeledDivider1.TabIndex = 25; + this.labeledDivider1.Text = global::OnTopReplica.Strings.AboutDividerUpdates; + // + // linkHomepage + // + this.linkHomepage.AutoSize = true; + this.linkHomepage.BackColor = System.Drawing.Color.Transparent; + this.linkHomepage.LinkBehavior = System.Windows.Forms.LinkBehavior.HoverUnderline; + this.linkHomepage.Location = new System.Drawing.Point(67, 50); + this.linkHomepage.Name = "linkHomepage"; + this.linkHomepage.Size = new System.Drawing.Size(167, 17); + this.linkHomepage.TabIndex = 23; + this.linkHomepage.TabStop = true; + this.linkHomepage.Text = "http://ontopreplica.codeplex.com"; + this.linkHomepage.UseCompatibleTextRendering = true; + this.linkHomepage.VisitedLinkColor = System.Drawing.Color.Blue; + this.linkHomepage.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.LinkHomepage_clicked); + // + // linkAuthor + // + this.linkAuthor.AutoSize = true; + this.linkAuthor.BackColor = System.Drawing.Color.Transparent; + this.linkAuthor.LinkBehavior = System.Windows.Forms.LinkBehavior.HoverUnderline; + this.linkAuthor.LinkColor = System.Drawing.Color.Blue; + this.linkAuthor.Location = new System.Drawing.Point(67, 33); + this.linkAuthor.Name = "linkAuthor"; + this.linkAuthor.Size = new System.Drawing.Size(72, 17); + this.linkAuthor.TabIndex = 22; + this.linkAuthor.TabStop = true; + this.linkAuthor.Text = "%AUTHOR%"; + this.linkAuthor.UseCompatibleTextRendering = true; + this.linkAuthor.VisitedLinkColor = System.Drawing.Color.Blue; + this.linkAuthor.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.LinkAuthor_clicked); + // + // lblSlogan + // + this.lblSlogan.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.lblSlogan.AutoEllipsis = true; + this.lblSlogan.BackColor = System.Drawing.Color.Transparent; + this.lblSlogan.Location = new System.Drawing.Point(67, 0); + this.lblSlogan.Name = "lblSlogan"; + this.lblSlogan.Size = new System.Drawing.Size(235, 33); + this.lblSlogan.TabIndex = 24; + this.lblSlogan.Text = "A lightweight, real-time, always on top thumbnail of a window of your choice."; + // + // labeledDivider3 + // + this.labeledDivider3.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.labeledDivider3.DividerColor = System.Drawing.Color.FromArgb(((int)(((byte)(176)))), ((int)(((byte)(191)))), ((int)(((byte)(222))))); + this.labeledDivider3.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(51)))), ((int)(((byte)(170))))); + this.labeledDivider3.Location = new System.Drawing.Point(0, 393); + this.labeledDivider3.Name = "labeledDivider3"; + this.labeledDivider3.Size = new System.Drawing.Size(302, 23); + this.labeledDivider3.TabIndex = 32; + this.labeledDivider3.Text = "License"; + // + // linkLicense + // + this.linkLicense.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.linkLicense.AutoEllipsis = true; + this.linkLicense.LinkBehavior = System.Windows.Forms.LinkBehavior.HoverUnderline; + this.linkLicense.Location = new System.Drawing.Point(0, 419); + this.linkLicense.Name = "linkLicense"; + this.linkLicense.Size = new System.Drawing.Size(302, 81); + this.linkLicense.TabIndex = 33; + this.linkLicense.TabStop = true; + this.linkLicense.Text = "%LICENSE%"; + this.linkLicense.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.LinkLicense_click); + // + // labeledDivider4 + // + this.labeledDivider4.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.labeledDivider4.DividerColor = System.Drawing.Color.FromArgb(((int)(((byte)(176)))), ((int)(((byte)(191)))), ((int)(((byte)(222))))); + this.labeledDivider4.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(51)))), ((int)(((byte)(170))))); + this.labeledDivider4.Location = new System.Drawing.Point(0, 503); + this.labeledDivider4.Name = "labeledDivider4"; + this.labeledDivider4.Size = new System.Drawing.Size(302, 23); + this.labeledDivider4.TabIndex = 34; + this.labeledDivider4.Text = "Contribute"; + // + // linkContribute + // + this.linkContribute.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.linkContribute.AutoEllipsis = true; + this.linkContribute.LinkBehavior = System.Windows.Forms.LinkBehavior.HoverUnderline; + this.linkContribute.Location = new System.Drawing.Point(0, 529); + this.linkContribute.Name = "linkContribute"; + this.linkContribute.Size = new System.Drawing.Size(302, 84); + this.linkContribute.TabIndex = 35; + this.linkContribute.TabStop = true; + this.linkContribute.Text = "%CONTRIBUTE%"; + this.linkContribute.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.LinkContribute_clicked); + // + // pictureBox1 + // + this.pictureBox1.Image = global::OnTopReplica.Properties.Resources.flat_logo_64; + this.pictureBox1.Location = new System.Drawing.Point(0, 0); + this.pictureBox1.Margin = new System.Windows.Forms.Padding(0); + this.pictureBox1.Name = "pictureBox1"; + this.pictureBox1.Size = new System.Drawing.Size(64, 64); + this.pictureBox1.SizeMode = System.Windows.Forms.PictureBoxSizeMode.CenterImage; + this.pictureBox1.TabIndex = 36; + this.pictureBox1.TabStop = false; + // + // AboutPanelContents + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.AutoScroll = true; + this.Controls.Add(this.pictureBox1); + this.Controls.Add(this.linkContribute); + this.Controls.Add(this.labeledDivider4); + this.Controls.Add(this.linkLicense); + this.Controls.Add(this.labeledDivider3); + this.Controls.Add(this.labelTranslators); + this.Controls.Add(this.linkCredits); + this.Controls.Add(this.progressUpdate); + this.Controls.Add(this.buttonUpdate); + this.Controls.Add(this.lblUpdateDisclaimer); + this.Controls.Add(this.labeledDivider2); + this.Controls.Add(this.labeledDivider1); + this.Controls.Add(this.linkHomepage); + this.Controls.Add(this.linkAuthor); + this.Controls.Add(this.lblSlogan); + this.Margin = new System.Windows.Forms.Padding(0); + this.Name = "AboutPanelContents"; + this.Size = new System.Drawing.Size(305, 613); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.Label labelTranslators; + private System.Windows.Forms.LinkLabel linkCredits; + private WindowsFormsAero.ProgressBar progressUpdate; + private System.Windows.Forms.Button buttonUpdate; + private System.Windows.Forms.Label lblUpdateDisclaimer; + private WindowsFormsAero.LabeledDivider labeledDivider2; + private WindowsFormsAero.LabeledDivider labeledDivider1; + private System.Windows.Forms.LinkLabel linkHomepage; + private System.Windows.Forms.LinkLabel linkAuthor; + private System.Windows.Forms.Label lblSlogan; + private WindowsFormsAero.LabeledDivider labeledDivider3; + private System.Windows.Forms.LinkLabel linkLicense; + private WindowsFormsAero.LabeledDivider labeledDivider4; + private System.Windows.Forms.LinkLabel linkContribute; + private System.Windows.Forms.PictureBox pictureBox1; + + } +} diff --git a/OnTopReplica/SidePanels/AboutPanelContents.cs b/src/OnTopReplica/SidePanels/AboutPanelContents.cs similarity index 97% rename from OnTopReplica/SidePanels/AboutPanelContents.cs rename to src/OnTopReplica/SidePanels/AboutPanelContents.cs index bdd0797..843d4d4 100644 --- a/OnTopReplica/SidePanels/AboutPanelContents.cs +++ b/src/OnTopReplica/SidePanels/AboutPanelContents.cs @@ -1,102 +1,102 @@ -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Drawing; -using System.Text; -using System.Windows.Forms; -using OnTopReplica.Update; -using System.Diagnostics; -using WindowsFormsAero.TaskDialog; -using System.IO; -using WindowsFormsAero; - -namespace OnTopReplica.SidePanels { - public partial class AboutPanelContents : UserControl { - - EventHandler _updateHandler; - - public AboutPanelContents() { - InitializeComponent(); - - LocalizePanel(); - - this.FixDefaultFont(); - } - - private void LocalizePanel() { - lblSlogan.Text = Strings.AboutSlogan; - linkAuthor.Internationalize(Strings.AboutAuthor, Strings.AboutAuthorContent); - labeledDivider1.Text = Strings.AboutDividerUpdates; - lblUpdateDisclaimer.Text = Strings.AboutUpdatesDisclaimer; - buttonUpdate.Text = Strings.AboutUpdatesCheckNow; - labeledDivider2.Text = Strings.AboutDividerCredits; - linkCredits.Internationalize(Strings.AboutCreditsSources, Strings.AboutCreditsSourcesContent); - labelTranslators.Text = string.Format(Strings.AboutTranslators, Strings.AboutTranslatorsContent); - labeledDivider3.Text = Strings.AboutDividerLicense; - linkLicense.Internationalize(Strings.AboutLicense, Strings.AboutLicenseContent); - labeledDivider4.Text = Strings.AboutDividerContribute; - linkContribute.Internationalize(Strings.AboutContribute, Strings.AboutContributeContent); - } - - protected override void OnHandleCreated(EventArgs e) { - base.OnHandleCreated(e); - - if (!DesignMode) { - //Updating - _updateHandler = new EventHandler(UpdateCheckCompleted); - Program.Update.UpdateCheckCompleted += _updateHandler; - } - } - - protected override void OnHandleDestroyed(EventArgs e) { - base.OnHandleDestroyed(e); - - if (!DesignMode) { - Program.Update.UpdateCheckCompleted -= _updateHandler; - } - } - - private void LinkHomepage_clicked(object sender, LinkLabelLinkClickedEventArgs e) { - Shell.Execute(AppStrings.ApplicationWebsite); - } - - private void LinkAuthor_clicked(object sender, LinkLabelLinkClickedEventArgs e) { - Shell.Execute(AppStrings.AuthorWebsite); - } - - private void LinkCredits_click(object sender, LinkLabelLinkClickedEventArgs e) { - var exeDir = Path.GetDirectoryName(Application.ExecutablePath); - var filePath = Path.Combine(exeDir, "CREDITS.txt"); - - Shell.Execute(filePath); - } - - void UpdateButton_click(object sender, System.EventArgs e) { - progressUpdate.Visible = true; - - Program.Update.CheckForUpdate(); - } - - void UpdateCheckCompleted(object sender, UpdateCheckCompletedEventArgs e) { - this.Invoke(new Action(() => { - if (!e.Success || e.Information == null) { - //TODO - MessageBox.Show("Failed to download update info."); - } - else if (!e.Information.IsNewVersionAvailable) { - Program.Update.DisplayInfo(); - } - - progressUpdate.Visible = false; - })); - } - - private void LinkLicense_click(object sender, LinkLabelLinkClickedEventArgs e) { - Shell.Execute(AppStrings.MsRlLicenseLink); - } - - private void LinkContribute_clicked(object sender, LinkLabelLinkClickedEventArgs e) { - Shell.Execute(AppStrings.LatestCommitsLink); - } - } -} +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Text; +using System.Windows.Forms; +using OnTopReplica.Update; +using System.Diagnostics; +using WindowsFormsAero.TaskDialog; +using System.IO; +using WindowsFormsAero; + +namespace OnTopReplica.SidePanels { + public partial class AboutPanelContents : UserControl { + + EventHandler _updateHandler; + + public AboutPanelContents() { + InitializeComponent(); + + LocalizePanel(); + + this.FixDefaultFont(); + } + + private void LocalizePanel() { + lblSlogan.Text = Strings.AboutSlogan; + linkAuthor.Internationalize(Strings.AboutAuthor, Strings.AboutAuthorContent); + labeledDivider1.Text = Strings.AboutDividerUpdates; + lblUpdateDisclaimer.Text = Strings.AboutUpdatesDisclaimer; + buttonUpdate.Text = Strings.AboutUpdatesCheckNow; + labeledDivider2.Text = Strings.AboutDividerCredits; + linkCredits.Internationalize(Strings.AboutCreditsSources, Strings.AboutCreditsSourcesContent); + labelTranslators.Text = string.Format(Strings.AboutTranslators, Strings.AboutTranslatorsContent); + labeledDivider3.Text = Strings.AboutDividerLicense; + linkLicense.Internationalize(Strings.AboutLicense, Strings.AboutLicenseContent); + labeledDivider4.Text = Strings.AboutDividerContribute; + linkContribute.Internationalize(Strings.AboutContribute, Strings.AboutContributeContent); + } + + protected override void OnHandleCreated(EventArgs e) { + base.OnHandleCreated(e); + + if (!DesignMode) { + //Updating + _updateHandler = new EventHandler(UpdateCheckCompleted); + Program.Update.UpdateCheckCompleted += _updateHandler; + } + } + + protected override void OnHandleDestroyed(EventArgs e) { + base.OnHandleDestroyed(e); + + if (!DesignMode) { + Program.Update.UpdateCheckCompleted -= _updateHandler; + } + } + + private void LinkHomepage_clicked(object sender, LinkLabelLinkClickedEventArgs e) { + Shell.Execute(AppStrings.ApplicationWebsite); + } + + private void LinkAuthor_clicked(object sender, LinkLabelLinkClickedEventArgs e) { + Shell.Execute(AppStrings.AuthorWebsite); + } + + private void LinkCredits_click(object sender, LinkLabelLinkClickedEventArgs e) { + var exeDir = Path.GetDirectoryName(Application.ExecutablePath); + var filePath = Path.Combine(exeDir, "CREDITS.txt"); + + Shell.Execute(filePath); + } + + void UpdateButton_click(object sender, System.EventArgs e) { + progressUpdate.Visible = true; + + Program.Update.CheckForUpdate(); + } + + void UpdateCheckCompleted(object sender, UpdateCheckCompletedEventArgs e) { + this.Invoke(new Action(() => { + if (!e.Success || e.Information == null) { + //TODO + MessageBox.Show("Failed to download update info."); + } + else if (!e.Information.IsNewVersionAvailable) { + Program.Update.DisplayInfo(); + } + + progressUpdate.Visible = false; + })); + } + + private void LinkLicense_click(object sender, LinkLabelLinkClickedEventArgs e) { + Shell.Execute(AppStrings.MsRlLicenseLink); + } + + private void LinkContribute_clicked(object sender, LinkLabelLinkClickedEventArgs e) { + Shell.Execute(AppStrings.LatestCommitsLink); + } + } +} diff --git a/OnTopReplica/SidePanels/AboutPanelContents.resx b/src/OnTopReplica/SidePanels/AboutPanelContents.resx similarity index 97% rename from OnTopReplica/SidePanels/AboutPanelContents.resx rename to src/OnTopReplica/SidePanels/AboutPanelContents.resx index 29dcb1b..1af7de1 100644 --- a/OnTopReplica/SidePanels/AboutPanelContents.resx +++ b/src/OnTopReplica/SidePanels/AboutPanelContents.resx @@ -1,120 +1,120 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 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 - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + \ No newline at end of file diff --git a/OnTopReplica/SidePanels/GroupSwitchPanel.Designer.cs b/src/OnTopReplica/SidePanels/GroupSwitchPanel.Designer.cs similarity index 98% rename from OnTopReplica/SidePanels/GroupSwitchPanel.Designer.cs rename to src/OnTopReplica/SidePanels/GroupSwitchPanel.Designer.cs index c3d8cc6..63b7c6a 100644 --- a/OnTopReplica/SidePanels/GroupSwitchPanel.Designer.cs +++ b/src/OnTopReplica/SidePanels/GroupSwitchPanel.Designer.cs @@ -1,131 +1,131 @@ -namespace OnTopReplica.SidePanels { - partial class GroupSwitchPanel { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) { - if (disposing && (components != null)) { - components.Dispose(); - } - 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() { - this.groupBox1 = new System.Windows.Forms.GroupBox(); - this.labelStatus = new System.Windows.Forms.Label(); - this.buttonCancel = new System.Windows.Forms.Button(); - this.buttonEnable = new System.Windows.Forms.Button(); - this.listWindows = new System.Windows.Forms.ListView(); - this.colName = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); - this.groupBox1.SuspendLayout(); - this.SuspendLayout(); - // - // groupBox1 - // - this.groupBox1.Controls.Add(this.labelStatus); - this.groupBox1.Controls.Add(this.buttonCancel); - this.groupBox1.Controls.Add(this.buttonEnable); - this.groupBox1.Controls.Add(this.listWindows); - this.groupBox1.Dock = System.Windows.Forms.DockStyle.Fill; - this.groupBox1.Location = new System.Drawing.Point(6, 6); - this.groupBox1.Name = "groupBox1"; - this.groupBox1.Size = new System.Drawing.Size(271, 325); - this.groupBox1.TabIndex = 1; - this.groupBox1.TabStop = false; - this.groupBox1.Text = "Group switch mode:"; - // - // labelStatus - // - this.labelStatus.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.labelStatus.Location = new System.Drawing.Point(3, 276); - this.labelStatus.Name = "labelStatus"; - this.labelStatus.Size = new System.Drawing.Size(262, 17); - this.labelStatus.TabIndex = 3; - this.labelStatus.Text = "-"; - this.labelStatus.TextAlign = System.Drawing.ContentAlignment.BottomRight; - // - // buttonCancel - // - this.buttonCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.buttonCancel.Location = new System.Drawing.Point(195, 296); - this.buttonCancel.Name = "buttonCancel"; - this.buttonCancel.Size = new System.Drawing.Size(70, 23); - this.buttonCancel.TabIndex = 2; - this.buttonCancel.Text = global::OnTopReplica.Strings.GroupSwitchModeDisableButton; - this.buttonCancel.UseVisualStyleBackColor = true; - this.buttonCancel.Click += new System.EventHandler(this.Cancel_click); - // - // buttonEnable - // - this.buttonEnable.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.buttonEnable.Image = global::OnTopReplica.Properties.Resources.xiao_ok; - this.buttonEnable.Location = new System.Drawing.Point(55, 296); - this.buttonEnable.Name = "buttonEnable"; - this.buttonEnable.Size = new System.Drawing.Size(134, 23); - this.buttonEnable.TabIndex = 1; - this.buttonEnable.Text = global::OnTopReplica.Strings.GroupSwitchModeEnableButton; - this.buttonEnable.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageBeforeText; - this.buttonEnable.UseVisualStyleBackColor = true; - this.buttonEnable.Click += new System.EventHandler(this.Enable_click); - // - // listWindows - // - this.listWindows.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.listWindows.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { - this.colName}); - this.listWindows.FullRowSelect = true; - this.listWindows.GridLines = true; - this.listWindows.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.None; - this.listWindows.HideSelection = false; - this.listWindows.LabelWrap = false; - this.listWindows.Location = new System.Drawing.Point(6, 19); - this.listWindows.Name = "listWindows"; - this.listWindows.Size = new System.Drawing.Size(259, 254); - this.listWindows.TabIndex = 0; - this.listWindows.UseCompatibleStateImageBehavior = false; - this.listWindows.View = System.Windows.Forms.View.List; - // - // colName - // - this.colName.Text = global::OnTopReplica.Strings.GroupSwitchModeWindows; - this.colName.Width = 187; - // - // GroupSwitchPanel - // - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.Controls.Add(this.groupBox1); - this.MinimumSize = new System.Drawing.Size(240, 240); - this.Name = "GroupSwitchPanel"; - this.Padding = new System.Windows.Forms.Padding(6); - this.Size = new System.Drawing.Size(283, 337); - this.groupBox1.ResumeLayout(false); - this.ResumeLayout(false); - - } - - #endregion - - private System.Windows.Forms.GroupBox groupBox1; - private System.Windows.Forms.Label labelStatus; - private System.Windows.Forms.Button buttonCancel; - private System.Windows.Forms.Button buttonEnable; - private System.Windows.Forms.ListView listWindows; - private System.Windows.Forms.ColumnHeader colName; - } -} +namespace OnTopReplica.SidePanels { + partial class GroupSwitchPanel { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) { + if (disposing && (components != null)) { + components.Dispose(); + } + 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() { + this.groupBox1 = new System.Windows.Forms.GroupBox(); + this.labelStatus = new System.Windows.Forms.Label(); + this.buttonCancel = new System.Windows.Forms.Button(); + this.buttonEnable = new System.Windows.Forms.Button(); + this.listWindows = new System.Windows.Forms.ListView(); + this.colName = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.groupBox1.SuspendLayout(); + this.SuspendLayout(); + // + // groupBox1 + // + this.groupBox1.Controls.Add(this.labelStatus); + this.groupBox1.Controls.Add(this.buttonCancel); + this.groupBox1.Controls.Add(this.buttonEnable); + this.groupBox1.Controls.Add(this.listWindows); + this.groupBox1.Dock = System.Windows.Forms.DockStyle.Fill; + this.groupBox1.Location = new System.Drawing.Point(6, 6); + this.groupBox1.Name = "groupBox1"; + this.groupBox1.Size = new System.Drawing.Size(271, 325); + this.groupBox1.TabIndex = 1; + this.groupBox1.TabStop = false; + this.groupBox1.Text = "Group switch mode:"; + // + // labelStatus + // + this.labelStatus.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.labelStatus.Location = new System.Drawing.Point(3, 276); + this.labelStatus.Name = "labelStatus"; + this.labelStatus.Size = new System.Drawing.Size(262, 17); + this.labelStatus.TabIndex = 3; + this.labelStatus.Text = "-"; + this.labelStatus.TextAlign = System.Drawing.ContentAlignment.BottomRight; + // + // buttonCancel + // + this.buttonCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.buttonCancel.Location = new System.Drawing.Point(195, 296); + this.buttonCancel.Name = "buttonCancel"; + this.buttonCancel.Size = new System.Drawing.Size(70, 23); + this.buttonCancel.TabIndex = 2; + this.buttonCancel.Text = global::OnTopReplica.Strings.GroupSwitchModeDisableButton; + this.buttonCancel.UseVisualStyleBackColor = true; + this.buttonCancel.Click += new System.EventHandler(this.Cancel_click); + // + // buttonEnable + // + this.buttonEnable.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.buttonEnable.Image = global::OnTopReplica.Properties.Resources.xiao_ok; + this.buttonEnable.Location = new System.Drawing.Point(55, 296); + this.buttonEnable.Name = "buttonEnable"; + this.buttonEnable.Size = new System.Drawing.Size(134, 23); + this.buttonEnable.TabIndex = 1; + this.buttonEnable.Text = global::OnTopReplica.Strings.GroupSwitchModeEnableButton; + this.buttonEnable.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageBeforeText; + this.buttonEnable.UseVisualStyleBackColor = true; + this.buttonEnable.Click += new System.EventHandler(this.Enable_click); + // + // listWindows + // + this.listWindows.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.listWindows.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { + this.colName}); + this.listWindows.FullRowSelect = true; + this.listWindows.GridLines = true; + this.listWindows.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.None; + this.listWindows.HideSelection = false; + this.listWindows.LabelWrap = false; + this.listWindows.Location = new System.Drawing.Point(6, 19); + this.listWindows.Name = "listWindows"; + this.listWindows.Size = new System.Drawing.Size(259, 254); + this.listWindows.TabIndex = 0; + this.listWindows.UseCompatibleStateImageBehavior = false; + this.listWindows.View = System.Windows.Forms.View.List; + // + // colName + // + this.colName.Text = global::OnTopReplica.Strings.GroupSwitchModeWindows; + this.colName.Width = 187; + // + // GroupSwitchPanel + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.groupBox1); + this.MinimumSize = new System.Drawing.Size(240, 240); + this.Name = "GroupSwitchPanel"; + this.Padding = new System.Windows.Forms.Padding(6); + this.Size = new System.Drawing.Size(283, 337); + this.groupBox1.ResumeLayout(false); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.GroupBox groupBox1; + private System.Windows.Forms.Label labelStatus; + private System.Windows.Forms.Button buttonCancel; + private System.Windows.Forms.Button buttonEnable; + private System.Windows.Forms.ListView listWindows; + private System.Windows.Forms.ColumnHeader colName; + } +} diff --git a/OnTopReplica/SidePanels/GroupSwitchPanel.cs b/src/OnTopReplica/SidePanels/GroupSwitchPanel.cs similarity index 96% rename from OnTopReplica/SidePanels/GroupSwitchPanel.cs rename to src/OnTopReplica/SidePanels/GroupSwitchPanel.cs index a168d53..c56088a 100644 --- a/OnTopReplica/SidePanels/GroupSwitchPanel.cs +++ b/src/OnTopReplica/SidePanels/GroupSwitchPanel.cs @@ -1,89 +1,89 @@ -using System; -using System.Collections.Generic; -using System.Windows.Forms; -using OnTopReplica.MessagePumpProcessors; -using OnTopReplica.WindowSeekers; - -namespace OnTopReplica.SidePanels { - partial class GroupSwitchPanel : SidePanel { - public GroupSwitchPanel() { - InitializeComponent(); - - LocalizePanel(); - } - - private void LocalizePanel() { - groupBox1.Text = Strings.GroupSwitchModeTitle; - buttonEnable.Text = Strings.GroupSwitchModeEnableButton; - buttonCancel.Text = Strings.GroupSwitchModeDisableButton; - } - - public override string Title { - get { - return Strings.MenuGroupSwitch; - } - } - - public override void OnFirstShown(MainForm form) { - base.OnFirstShown(form); - - LoadWindowList(); - - labelStatus.Text = (ParentMainForm.MessagePumpManager.Get().IsActive) ? - Strings.GroupSwitchModeStatusEnabled : - Strings.GroupSwitchModeStatusDisabled; - } - - private void LoadWindowList() { - var manager = new TaskWindowSeeker { - SkipNotVisibleWindows = true - }; - manager.Refresh(); - - var imageList = new ImageList(); - imageList.ColorDepth = ColorDepth.Depth32Bit; - foreach (var w in manager.Windows) { - var item = new ListViewItem(w.Title) { - Tag = w - }; - - if (w.Icon != null) { - imageList.Images.Add(w.Icon); - item.ImageIndex = imageList.Images.Count - 1; - } - - listWindows.Items.Add(item); - } - listWindows.SmallImageList = imageList; - } - - public override void OnClosing(MainForm form) { - base.OnClosing(form); - - if (_enableOnClose && listWindows.SelectedItems.Count > 0) { - List ret = new List(); - foreach (ListViewItem i in listWindows.SelectedItems) { - ret.Add((WindowHandle)i.Tag); - } - - form.SetThumbnailGroup(ret); - } - else { - form.MessagePumpManager.Get().Disable(); - } - } - - bool _enableOnClose = false; - - private void Enable_click(object sender, EventArgs e) { - _enableOnClose = true; - OnRequestClosing(); - } - - private void Cancel_click(object sender, EventArgs e) { - OnRequestClosing(); - } - - } - -} +using System; +using System.Collections.Generic; +using System.Windows.Forms; +using OnTopReplica.MessagePumpProcessors; +using OnTopReplica.WindowSeekers; + +namespace OnTopReplica.SidePanels { + partial class GroupSwitchPanel : SidePanel { + public GroupSwitchPanel() { + InitializeComponent(); + + LocalizePanel(); + } + + private void LocalizePanel() { + groupBox1.Text = Strings.GroupSwitchModeTitle; + buttonEnable.Text = Strings.GroupSwitchModeEnableButton; + buttonCancel.Text = Strings.GroupSwitchModeDisableButton; + } + + public override string Title { + get { + return Strings.MenuGroupSwitch; + } + } + + public override void OnFirstShown(MainForm form) { + base.OnFirstShown(form); + + LoadWindowList(); + + labelStatus.Text = (ParentMainForm.MessagePumpManager.Get().IsActive) ? + Strings.GroupSwitchModeStatusEnabled : + Strings.GroupSwitchModeStatusDisabled; + } + + private void LoadWindowList() { + var manager = new TaskWindowSeeker { + SkipNotVisibleWindows = true + }; + manager.Refresh(); + + var imageList = new ImageList(); + imageList.ColorDepth = ColorDepth.Depth32Bit; + foreach (var w in manager.Windows) { + var item = new ListViewItem(w.Title) { + Tag = w + }; + + if (w.Icon != null) { + imageList.Images.Add(w.Icon); + item.ImageIndex = imageList.Images.Count - 1; + } + + listWindows.Items.Add(item); + } + listWindows.SmallImageList = imageList; + } + + public override void OnClosing(MainForm form) { + base.OnClosing(form); + + if (_enableOnClose && listWindows.SelectedItems.Count > 0) { + List ret = new List(); + foreach (ListViewItem i in listWindows.SelectedItems) { + ret.Add((WindowHandle)i.Tag); + } + + form.SetThumbnailGroup(ret); + } + else { + form.MessagePumpManager.Get().Disable(); + } + } + + bool _enableOnClose = false; + + private void Enable_click(object sender, EventArgs e) { + _enableOnClose = true; + OnRequestClosing(); + } + + private void Cancel_click(object sender, EventArgs e) { + OnRequestClosing(); + } + + } + +} diff --git a/OnTopReplica/SidePanels/GroupSwitchPanel.resx b/src/OnTopReplica/SidePanels/GroupSwitchPanel.resx similarity index 97% rename from OnTopReplica/SidePanels/GroupSwitchPanel.resx rename to src/OnTopReplica/SidePanels/GroupSwitchPanel.resx index 5ea0895..7080a7d 100644 --- a/OnTopReplica/SidePanels/GroupSwitchPanel.resx +++ b/src/OnTopReplica/SidePanels/GroupSwitchPanel.resx @@ -1,120 +1,120 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 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 - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + \ No newline at end of file diff --git a/OnTopReplica/SidePanels/OptionsPanel.Designer.cs b/src/OnTopReplica/SidePanels/OptionsPanel.Designer.cs similarity index 98% rename from OnTopReplica/SidePanels/OptionsPanel.Designer.cs rename to src/OnTopReplica/SidePanels/OptionsPanel.Designer.cs index 9fbfd26..724975a 100644 --- a/OnTopReplica/SidePanels/OptionsPanel.Designer.cs +++ b/src/OnTopReplica/SidePanels/OptionsPanel.Designer.cs @@ -1,202 +1,202 @@ -namespace OnTopReplica.SidePanels { - partial class OptionsPanel { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) { - if (disposing && (components != null)) { - components.Dispose(); - } - 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() { - this.btnClose = new System.Windows.Forms.Button(); - this.panelMain = new System.Windows.Forms.Panel(); - this.groupHotkeys = new System.Windows.Forms.GroupBox(); - this.label1 = new System.Windows.Forms.Label(); - this.lblHotKeyShowHide = new System.Windows.Forms.Label(); - this.txtHotKeyShowHide = new OnTopReplica.HotKeyTextBox(); - this.lblHotKeyClone = new System.Windows.Forms.Label(); - this.txtHotKeyClone = new OnTopReplica.HotKeyTextBox(); - this.groupLanguage = new System.Windows.Forms.GroupBox(); - this.comboLanguage = new OnTopReplica.ImageComboBox(); - this.lblLanguage = new System.Windows.Forms.Label(); - this.panelMain.SuspendLayout(); - this.groupHotkeys.SuspendLayout(); - this.groupLanguage.SuspendLayout(); - this.SuspendLayout(); - // - // btnClose - // - this.btnClose.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.btnClose.Location = new System.Drawing.Point(220, 243); - this.btnClose.Name = "btnClose"; - this.btnClose.Size = new System.Drawing.Size(87, 27); - this.btnClose.TabIndex = 0; - this.btnClose.Text = global::OnTopReplica.Strings.MenuClose; - this.btnClose.UseVisualStyleBackColor = true; - this.btnClose.Click += new System.EventHandler(this.Close_click); - // - // panelMain - // - this.panelMain.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.panelMain.AutoScroll = true; - this.panelMain.Controls.Add(this.groupHotkeys); - this.panelMain.Controls.Add(this.groupLanguage); - this.panelMain.Location = new System.Drawing.Point(7, 7); - this.panelMain.Name = "panelMain"; - this.panelMain.Size = new System.Drawing.Size(301, 230); - this.panelMain.TabIndex = 1; - // - // groupHotkeys - // - this.groupHotkeys.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.groupHotkeys.Controls.Add(this.label1); - this.groupHotkeys.Controls.Add(this.lblHotKeyShowHide); - this.groupHotkeys.Controls.Add(this.txtHotKeyShowHide); - this.groupHotkeys.Controls.Add(this.lblHotKeyClone); - this.groupHotkeys.Controls.Add(this.txtHotKeyClone); - this.groupHotkeys.Location = new System.Drawing.Point(3, 89); - this.groupHotkeys.Name = "groupHotkeys"; - this.groupHotkeys.Size = new System.Drawing.Size(294, 130); - this.groupHotkeys.TabIndex = 1; - this.groupHotkeys.TabStop = false; - this.groupHotkeys.Text = "Hot keys:"; - // - // label1 - // - this.label1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.label1.Location = new System.Drawing.Point(7, 78); - this.label1.Name = "label1"; - this.label1.Size = new System.Drawing.Size(182, 50); - this.label1.TabIndex = 4; - this.label1.Text = "These system-wide shortcuts can also be used when OnTopReplica is not in focus."; - // - // lblHotKeyShowHide - // - this.lblHotKeyShowHide.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); - this.lblHotKeyShowHide.BackColor = System.Drawing.Color.Transparent; - this.lblHotKeyShowHide.Location = new System.Drawing.Point(196, 25); - this.lblHotKeyShowHide.Name = "lblHotKeyShowHide"; - this.lblHotKeyShowHide.Size = new System.Drawing.Size(91, 20); - this.lblHotKeyShowHide.TabIndex = 3; - this.lblHotKeyShowHide.Text = "Show/Hide"; - // - // txtHotKeyShowHide - // - this.txtHotKeyShowHide.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.txtHotKeyShowHide.Location = new System.Drawing.Point(7, 22); - this.txtHotKeyShowHide.Name = "txtHotKeyShowHide"; - this.txtHotKeyShowHide.ReadOnly = true; - this.txtHotKeyShowHide.Size = new System.Drawing.Size(181, 23); - this.txtHotKeyShowHide.TabIndex = 2; - // - // lblHotKeyClone - // - this.lblHotKeyClone.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); - this.lblHotKeyClone.BackColor = System.Drawing.Color.Transparent; - this.lblHotKeyClone.Location = new System.Drawing.Point(196, 55); - this.lblHotKeyClone.Name = "lblHotKeyClone"; - this.lblHotKeyClone.Size = new System.Drawing.Size(91, 33); - this.lblHotKeyClone.TabIndex = 1; - this.lblHotKeyClone.Text = "Clone current window"; - // - // txtHotKeyClone - // - this.txtHotKeyClone.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.txtHotKeyClone.Location = new System.Drawing.Point(7, 52); - this.txtHotKeyClone.Name = "txtHotKeyClone"; - this.txtHotKeyClone.ReadOnly = true; - this.txtHotKeyClone.Size = new System.Drawing.Size(181, 23); - this.txtHotKeyClone.TabIndex = 0; - // - // groupLanguage - // - this.groupLanguage.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.groupLanguage.Controls.Add(this.comboLanguage); - this.groupLanguage.Controls.Add(this.lblLanguage); - this.groupLanguage.Location = new System.Drawing.Point(3, 3); - this.groupLanguage.Name = "groupLanguage"; - this.groupLanguage.Size = new System.Drawing.Size(294, 78); - this.groupLanguage.TabIndex = 0; - this.groupLanguage.TabStop = false; - this.groupLanguage.Text = "Language:"; - // - // comboLanguage - // - this.comboLanguage.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.comboLanguage.DrawMode = System.Windows.Forms.DrawMode.OwnerDrawFixed; - this.comboLanguage.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.comboLanguage.FormattingEnabled = true; - this.comboLanguage.IconList = null; - this.comboLanguage.Location = new System.Drawing.Point(10, 22); - this.comboLanguage.Name = "comboLanguage"; - this.comboLanguage.Size = new System.Drawing.Size(276, 24); - this.comboLanguage.TabIndex = 2; - this.comboLanguage.SelectedIndexChanged += new System.EventHandler(this.LanguageBox_IndexChange); - // - // lblLanguage - // - this.lblLanguage.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.lblLanguage.Location = new System.Drawing.Point(7, 50); - this.lblLanguage.Name = "lblLanguage"; - this.lblLanguage.Size = new System.Drawing.Size(280, 25); - this.lblLanguage.TabIndex = 1; - this.lblLanguage.Text = "Requires a restart."; - // - // OptionsPanel - // - this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 15F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.AutoScroll = true; - this.Controls.Add(this.panelMain); - this.Controls.Add(this.btnClose); - this.MinimumSize = new System.Drawing.Size(315, 277); - this.Name = "OptionsPanel"; - this.Padding = new System.Windows.Forms.Padding(7, 7, 7, 7); - this.Size = new System.Drawing.Size(315, 277); - this.panelMain.ResumeLayout(false); - this.groupHotkeys.ResumeLayout(false); - this.groupHotkeys.PerformLayout(); - this.groupLanguage.ResumeLayout(false); - this.ResumeLayout(false); - - } - - #endregion - - private System.Windows.Forms.Button btnClose; - private System.Windows.Forms.Panel panelMain; - private System.Windows.Forms.GroupBox groupLanguage; - private System.Windows.Forms.Label lblLanguage; - private ImageComboBox comboLanguage; - private System.Windows.Forms.GroupBox groupHotkeys; - private HotKeyTextBox txtHotKeyClone; - private System.Windows.Forms.Label lblHotKeyShowHide; - private HotKeyTextBox txtHotKeyShowHide; - private System.Windows.Forms.Label lblHotKeyClone; - private System.Windows.Forms.Label label1; - } -} +namespace OnTopReplica.SidePanels { + partial class OptionsPanel { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) { + if (disposing && (components != null)) { + components.Dispose(); + } + 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() { + this.btnClose = new System.Windows.Forms.Button(); + this.panelMain = new System.Windows.Forms.Panel(); + this.groupHotkeys = new System.Windows.Forms.GroupBox(); + this.label1 = new System.Windows.Forms.Label(); + this.lblHotKeyShowHide = new System.Windows.Forms.Label(); + this.txtHotKeyShowHide = new OnTopReplica.HotKeyTextBox(); + this.lblHotKeyClone = new System.Windows.Forms.Label(); + this.txtHotKeyClone = new OnTopReplica.HotKeyTextBox(); + this.groupLanguage = new System.Windows.Forms.GroupBox(); + this.comboLanguage = new OnTopReplica.ImageComboBox(); + this.lblLanguage = new System.Windows.Forms.Label(); + this.panelMain.SuspendLayout(); + this.groupHotkeys.SuspendLayout(); + this.groupLanguage.SuspendLayout(); + this.SuspendLayout(); + // + // btnClose + // + this.btnClose.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.btnClose.Location = new System.Drawing.Point(220, 243); + this.btnClose.Name = "btnClose"; + this.btnClose.Size = new System.Drawing.Size(87, 27); + this.btnClose.TabIndex = 0; + this.btnClose.Text = global::OnTopReplica.Strings.MenuClose; + this.btnClose.UseVisualStyleBackColor = true; + this.btnClose.Click += new System.EventHandler(this.Close_click); + // + // panelMain + // + this.panelMain.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.panelMain.AutoScroll = true; + this.panelMain.Controls.Add(this.groupHotkeys); + this.panelMain.Controls.Add(this.groupLanguage); + this.panelMain.Location = new System.Drawing.Point(7, 7); + this.panelMain.Name = "panelMain"; + this.panelMain.Size = new System.Drawing.Size(301, 230); + this.panelMain.TabIndex = 1; + // + // groupHotkeys + // + this.groupHotkeys.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.groupHotkeys.Controls.Add(this.label1); + this.groupHotkeys.Controls.Add(this.lblHotKeyShowHide); + this.groupHotkeys.Controls.Add(this.txtHotKeyShowHide); + this.groupHotkeys.Controls.Add(this.lblHotKeyClone); + this.groupHotkeys.Controls.Add(this.txtHotKeyClone); + this.groupHotkeys.Location = new System.Drawing.Point(3, 89); + this.groupHotkeys.Name = "groupHotkeys"; + this.groupHotkeys.Size = new System.Drawing.Size(294, 130); + this.groupHotkeys.TabIndex = 1; + this.groupHotkeys.TabStop = false; + this.groupHotkeys.Text = "Hot keys:"; + // + // label1 + // + this.label1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.label1.Location = new System.Drawing.Point(7, 78); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(182, 50); + this.label1.TabIndex = 4; + this.label1.Text = "These system-wide shortcuts can also be used when OnTopReplica is not in focus."; + // + // lblHotKeyShowHide + // + this.lblHotKeyShowHide.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.lblHotKeyShowHide.BackColor = System.Drawing.Color.Transparent; + this.lblHotKeyShowHide.Location = new System.Drawing.Point(196, 25); + this.lblHotKeyShowHide.Name = "lblHotKeyShowHide"; + this.lblHotKeyShowHide.Size = new System.Drawing.Size(91, 20); + this.lblHotKeyShowHide.TabIndex = 3; + this.lblHotKeyShowHide.Text = "Show/Hide"; + // + // txtHotKeyShowHide + // + this.txtHotKeyShowHide.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.txtHotKeyShowHide.Location = new System.Drawing.Point(7, 22); + this.txtHotKeyShowHide.Name = "txtHotKeyShowHide"; + this.txtHotKeyShowHide.ReadOnly = true; + this.txtHotKeyShowHide.Size = new System.Drawing.Size(181, 23); + this.txtHotKeyShowHide.TabIndex = 2; + // + // lblHotKeyClone + // + this.lblHotKeyClone.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.lblHotKeyClone.BackColor = System.Drawing.Color.Transparent; + this.lblHotKeyClone.Location = new System.Drawing.Point(196, 55); + this.lblHotKeyClone.Name = "lblHotKeyClone"; + this.lblHotKeyClone.Size = new System.Drawing.Size(91, 33); + this.lblHotKeyClone.TabIndex = 1; + this.lblHotKeyClone.Text = "Clone current window"; + // + // txtHotKeyClone + // + this.txtHotKeyClone.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.txtHotKeyClone.Location = new System.Drawing.Point(7, 52); + this.txtHotKeyClone.Name = "txtHotKeyClone"; + this.txtHotKeyClone.ReadOnly = true; + this.txtHotKeyClone.Size = new System.Drawing.Size(181, 23); + this.txtHotKeyClone.TabIndex = 0; + // + // groupLanguage + // + this.groupLanguage.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.groupLanguage.Controls.Add(this.comboLanguage); + this.groupLanguage.Controls.Add(this.lblLanguage); + this.groupLanguage.Location = new System.Drawing.Point(3, 3); + this.groupLanguage.Name = "groupLanguage"; + this.groupLanguage.Size = new System.Drawing.Size(294, 78); + this.groupLanguage.TabIndex = 0; + this.groupLanguage.TabStop = false; + this.groupLanguage.Text = "Language:"; + // + // comboLanguage + // + this.comboLanguage.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.comboLanguage.DrawMode = System.Windows.Forms.DrawMode.OwnerDrawFixed; + this.comboLanguage.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.comboLanguage.FormattingEnabled = true; + this.comboLanguage.IconList = null; + this.comboLanguage.Location = new System.Drawing.Point(10, 22); + this.comboLanguage.Name = "comboLanguage"; + this.comboLanguage.Size = new System.Drawing.Size(276, 24); + this.comboLanguage.TabIndex = 2; + this.comboLanguage.SelectedIndexChanged += new System.EventHandler(this.LanguageBox_IndexChange); + // + // lblLanguage + // + this.lblLanguage.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.lblLanguage.Location = new System.Drawing.Point(7, 50); + this.lblLanguage.Name = "lblLanguage"; + this.lblLanguage.Size = new System.Drawing.Size(280, 25); + this.lblLanguage.TabIndex = 1; + this.lblLanguage.Text = "Requires a restart."; + // + // OptionsPanel + // + this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 15F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.AutoScroll = true; + this.Controls.Add(this.panelMain); + this.Controls.Add(this.btnClose); + this.MinimumSize = new System.Drawing.Size(315, 277); + this.Name = "OptionsPanel"; + this.Padding = new System.Windows.Forms.Padding(7, 7, 7, 7); + this.Size = new System.Drawing.Size(315, 277); + this.panelMain.ResumeLayout(false); + this.groupHotkeys.ResumeLayout(false); + this.groupHotkeys.PerformLayout(); + this.groupLanguage.ResumeLayout(false); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.Button btnClose; + private System.Windows.Forms.Panel panelMain; + private System.Windows.Forms.GroupBox groupLanguage; + private System.Windows.Forms.Label lblLanguage; + private ImageComboBox comboLanguage; + private System.Windows.Forms.GroupBox groupHotkeys; + private HotKeyTextBox txtHotKeyClone; + private System.Windows.Forms.Label lblHotKeyShowHide; + private HotKeyTextBox txtHotKeyShowHide; + private System.Windows.Forms.Label lblHotKeyClone; + private System.Windows.Forms.Label label1; + } +} diff --git a/OnTopReplica/SidePanels/OptionsPanel.cs b/src/OnTopReplica/SidePanels/OptionsPanel.cs similarity index 97% rename from OnTopReplica/SidePanels/OptionsPanel.cs rename to src/OnTopReplica/SidePanels/OptionsPanel.cs index 9985abb..e1d47f9 100644 --- a/OnTopReplica/SidePanels/OptionsPanel.cs +++ b/src/OnTopReplica/SidePanels/OptionsPanel.cs @@ -1,129 +1,129 @@ -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Drawing; -using System.Text; -using System.Windows.Forms; -using OnTopReplica.Properties; -using System.Globalization; - -namespace OnTopReplica.SidePanels { - partial class OptionsPanel : SidePanel { - - public OptionsPanel() { - InitializeComponent(); - - LocalizePanel(); - } - - private void LocalizePanel() { - groupLanguage.Text = Strings.SettingsLanguageTitle; - lblLanguage.Text = Strings.SettingsRestartRequired; - - groupHotkeys.Text = Strings.SettingsHotKeyTitle; - lblHotKeyShowHide.Text = Strings.SettingsHotKeyShowHide; - lblHotKeyClone.Text = Strings.SettingsHotKeyClone; - label1.Text = Strings.SettingsHotKeyDescription; - - btnClose.Text = Strings.MenuClose; - } - - public override void OnFirstShown(MainForm form) { - base.OnFirstShown(form); - - PopulateLanguageComboBox(); - - //Stop hotkey handling and load current shortcuts - form.MessagePumpManager.Get().Enabled = false; - txtHotKeyShowHide.Text = Settings.Default.HotKeyShowHide; - txtHotKeyClone.Text = Settings.Default.HotKeyCloneCurrent; - } - - private void Close_click(object sender, EventArgs e) { - OnRequestClosing(); - } - - public override string Title { - get { - return Strings.SettingsTitle; - } - } - - public override void OnClosing(MainForm form) { - base.OnClosing(form); - - //Update hotkey settings and update processor - Settings.Default.HotKeyShowHide = txtHotKeyShowHide.Text; - Settings.Default.HotKeyCloneCurrent = txtHotKeyClone.Text; - var manager = form.MessagePumpManager.Get(); - manager.RefreshHotkeys(); - manager.Enabled = true; - } - - #region Language - - class CultureWrapper { - public CultureWrapper(string name, CultureInfo culture, Image img) { - Culture = culture; - Image = img; - Name = name; - } - public CultureInfo Culture { get; set; } - public Image Image { get; set; } - public string Name { get; set; } - } - - CultureWrapper[] _languageList = { - new CultureWrapper("English", new CultureInfo("en-US"), Resources.flag_usa), - new CultureWrapper("Čeština", new CultureInfo("cs-CZ"), Resources.flag_czech), - new CultureWrapper("Dansk", new CultureInfo("da-DK"), Resources.flag_danish), - new CultureWrapper("Deutsch", new CultureInfo("de-DE"), Resources.flag_germany), - new CultureWrapper("Español", new CultureInfo("es-ES"), Resources.flag_spanish), - new CultureWrapper("Italiano", new CultureInfo("it-IT"), Resources.flag_ita), - new CultureWrapper("Polski", new CultureInfo("pl-PL"), Resources.flag_poland), - new CultureWrapper("简体中文", new CultureInfo("zh-CN"), Resources.flag_china), - new CultureWrapper("繁體中文", new CultureInfo("zh-TW"), Resources.flag_taiwan), - }; - - private void PopulateLanguageComboBox() { - comboLanguage.Items.Clear(); - - var imageList = new ImageList() { - ImageSize = new Size(16, 16), - ColorDepth = ColorDepth.Depth32Bit - }; - comboLanguage.IconList = imageList; - - int selectedIndex = -1; - foreach (var langPair in _languageList) { - var item = new ImageComboBoxItem(langPair.Name, imageList.Images.Count) { - Tag = langPair.Culture - }; - imageList.Images.Add(langPair.Image); - comboLanguage.Items.Add(item); - - if (langPair.Culture.Equals(CultureInfo.CurrentUICulture)) { - selectedIndex = comboLanguage.Items.Count - 1; - } - } - - //Handle case when there is not explicitly set culture (default to first one, i.e. english) - if (CultureInfo.CurrentUICulture.Equals(CultureInfo.InvariantCulture)) - selectedIndex = 0; - - comboLanguage.SelectedIndex = selectedIndex; - } - - private void LanguageBox_IndexChange(object sender, EventArgs e) { - var item = comboLanguage.SelectedItem as ImageComboBoxItem; - if (item == null) - return; - - Settings.Default.Language = item.Tag as CultureInfo; - } - - #endregion - - } - -} +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Text; +using System.Windows.Forms; +using OnTopReplica.Properties; +using System.Globalization; + +namespace OnTopReplica.SidePanels { + partial class OptionsPanel : SidePanel { + + public OptionsPanel() { + InitializeComponent(); + + LocalizePanel(); + } + + private void LocalizePanel() { + groupLanguage.Text = Strings.SettingsLanguageTitle; + lblLanguage.Text = Strings.SettingsRestartRequired; + + groupHotkeys.Text = Strings.SettingsHotKeyTitle; + lblHotKeyShowHide.Text = Strings.SettingsHotKeyShowHide; + lblHotKeyClone.Text = Strings.SettingsHotKeyClone; + label1.Text = Strings.SettingsHotKeyDescription; + + btnClose.Text = Strings.MenuClose; + } + + public override void OnFirstShown(MainForm form) { + base.OnFirstShown(form); + + PopulateLanguageComboBox(); + + //Stop hotkey handling and load current shortcuts + form.MessagePumpManager.Get().Enabled = false; + txtHotKeyShowHide.Text = Settings.Default.HotKeyShowHide; + txtHotKeyClone.Text = Settings.Default.HotKeyCloneCurrent; + } + + private void Close_click(object sender, EventArgs e) { + OnRequestClosing(); + } + + public override string Title { + get { + return Strings.SettingsTitle; + } + } + + public override void OnClosing(MainForm form) { + base.OnClosing(form); + + //Update hotkey settings and update processor + Settings.Default.HotKeyShowHide = txtHotKeyShowHide.Text; + Settings.Default.HotKeyCloneCurrent = txtHotKeyClone.Text; + var manager = form.MessagePumpManager.Get(); + manager.RefreshHotkeys(); + manager.Enabled = true; + } + + #region Language + + class CultureWrapper { + public CultureWrapper(string name, CultureInfo culture, Image img) { + Culture = culture; + Image = img; + Name = name; + } + public CultureInfo Culture { get; set; } + public Image Image { get; set; } + public string Name { get; set; } + } + + CultureWrapper[] _languageList = { + new CultureWrapper("English", new CultureInfo("en-US"), Resources.flag_usa), + new CultureWrapper("Čeština", new CultureInfo("cs-CZ"), Resources.flag_czech), + new CultureWrapper("Dansk", new CultureInfo("da-DK"), Resources.flag_danish), + new CultureWrapper("Deutsch", new CultureInfo("de-DE"), Resources.flag_germany), + new CultureWrapper("Español", new CultureInfo("es-ES"), Resources.flag_spanish), + new CultureWrapper("Italiano", new CultureInfo("it-IT"), Resources.flag_ita), + new CultureWrapper("Polski", new CultureInfo("pl-PL"), Resources.flag_poland), + new CultureWrapper("简体中文", new CultureInfo("zh-CN"), Resources.flag_china), + new CultureWrapper("繁體中文", new CultureInfo("zh-TW"), Resources.flag_taiwan), + }; + + private void PopulateLanguageComboBox() { + comboLanguage.Items.Clear(); + + var imageList = new ImageList() { + ImageSize = new Size(16, 16), + ColorDepth = ColorDepth.Depth32Bit + }; + comboLanguage.IconList = imageList; + + int selectedIndex = -1; + foreach (var langPair in _languageList) { + var item = new ImageComboBoxItem(langPair.Name, imageList.Images.Count) { + Tag = langPair.Culture + }; + imageList.Images.Add(langPair.Image); + comboLanguage.Items.Add(item); + + if (langPair.Culture.Equals(CultureInfo.CurrentUICulture)) { + selectedIndex = comboLanguage.Items.Count - 1; + } + } + + //Handle case when there is not explicitly set culture (default to first one, i.e. english) + if (CultureInfo.CurrentUICulture.Equals(CultureInfo.InvariantCulture)) + selectedIndex = 0; + + comboLanguage.SelectedIndex = selectedIndex; + } + + private void LanguageBox_IndexChange(object sender, EventArgs e) { + var item = comboLanguage.SelectedItem as ImageComboBoxItem; + if (item == null) + return; + + Settings.Default.Language = item.Tag as CultureInfo; + } + + #endregion + + } + +} diff --git a/OnTopReplica/SidePanels/OptionsPanel.resx b/src/OnTopReplica/SidePanels/OptionsPanel.resx similarity index 97% rename from OnTopReplica/SidePanels/OptionsPanel.resx rename to src/OnTopReplica/SidePanels/OptionsPanel.resx index 29dcb1b..1af7de1 100644 --- a/OnTopReplica/SidePanels/OptionsPanel.resx +++ b/src/OnTopReplica/SidePanels/OptionsPanel.resx @@ -1,120 +1,120 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 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 - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + \ No newline at end of file diff --git a/OnTopReplica/SidePanels/RegionPanel.Designer.cs b/src/OnTopReplica/SidePanels/RegionPanel.Designer.cs similarity index 98% rename from OnTopReplica/SidePanels/RegionPanel.Designer.cs rename to src/OnTopReplica/SidePanels/RegionPanel.Designer.cs index 48696d9..909d721 100644 --- a/OnTopReplica/SidePanels/RegionPanel.Designer.cs +++ b/src/OnTopReplica/SidePanels/RegionPanel.Designer.cs @@ -1,338 +1,338 @@ -namespace OnTopReplica.SidePanels { - partial class RegionPanel { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) { - if (disposing && (components != null)) { - components.Dispose(); - } - 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() { - this.components = new System.ComponentModel.Container(); - this.groupRegions = new System.Windows.Forms.GroupBox(); - this.checkRelative = new System.Windows.Forms.CheckBox(); - this.textRegionName = new OnTopReplica.FocusedTextBox(); - this.numH = new System.Windows.Forms.NumericUpDown(); - this.numW = new System.Windows.Forms.NumericUpDown(); - this.numY = new System.Windows.Forms.NumericUpDown(); - this.numX = new System.Windows.Forms.NumericUpDown(); - this.buttonDone = new System.Windows.Forms.Button(); - this.buttonReset = new System.Windows.Forms.Button(); - this.labelHeight = new System.Windows.Forms.Label(); - this.labelWidth = new System.Windows.Forms.Label(); - this.labelY = new System.Windows.Forms.Label(); - this.labelX = new System.Windows.Forms.Label(); - this.labelCurrentRegion = new System.Windows.Forms.Label(); - this.buttonDelete = new System.Windows.Forms.Button(); - this.buttonSave = new System.Windows.Forms.Button(); - this.comboRegions = new WindowsFormsAero.ComboBox(); - this.toolTip = new System.Windows.Forms.ToolTip(this.components); - this.groupRegions.SuspendLayout(); - ((System.ComponentModel.ISupportInitialize)(this.numH)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.numW)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.numY)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.numX)).BeginInit(); - this.SuspendLayout(); - // - // groupRegions - // - this.groupRegions.Controls.Add(this.checkRelative); - this.groupRegions.Controls.Add(this.textRegionName); - this.groupRegions.Controls.Add(this.numH); - this.groupRegions.Controls.Add(this.numW); - this.groupRegions.Controls.Add(this.numY); - this.groupRegions.Controls.Add(this.numX); - this.groupRegions.Controls.Add(this.buttonDone); - this.groupRegions.Controls.Add(this.buttonReset); - this.groupRegions.Controls.Add(this.labelHeight); - this.groupRegions.Controls.Add(this.labelWidth); - this.groupRegions.Controls.Add(this.labelY); - this.groupRegions.Controls.Add(this.labelX); - this.groupRegions.Controls.Add(this.labelCurrentRegion); - this.groupRegions.Controls.Add(this.buttonDelete); - this.groupRegions.Controls.Add(this.buttonSave); - this.groupRegions.Controls.Add(this.comboRegions); - this.groupRegions.Dock = System.Windows.Forms.DockStyle.Fill; - this.groupRegions.Location = new System.Drawing.Point(7, 7); - this.groupRegions.Name = "groupRegions"; - this.groupRegions.Size = new System.Drawing.Size(254, 208); - this.groupRegions.TabIndex = 0; - this.groupRegions.TabStop = false; - this.groupRegions.Text = "Regions:"; - // - // checkRelative - // - this.checkRelative.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.checkRelative.CheckAlign = System.Drawing.ContentAlignment.MiddleRight; - this.checkRelative.Location = new System.Drawing.Point(7, 137); - this.checkRelative.Name = "checkRelative"; - this.checkRelative.Size = new System.Drawing.Size(240, 21); - this.checkRelative.TabIndex = 12; - this.checkRelative.Text = "Relative to border"; - this.checkRelative.TextAlign = System.Drawing.ContentAlignment.MiddleRight; - this.checkRelative.UseVisualStyleBackColor = true; - this.checkRelative.CheckedChanged += new System.EventHandler(this.CheckRelative_checked); - // - // textRegionName - // - this.textRegionName.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.textRegionName.BackColor = System.Drawing.SystemColors.ActiveCaption; - this.textRegionName.ForeColor = System.Drawing.SystemColors.ActiveCaptionText; - this.textRegionName.Location = new System.Drawing.Point(7, 51); - this.textRegionName.Name = "textRegionName"; - this.textRegionName.Size = new System.Drawing.Size(242, 23); - this.textRegionName.TabIndex = 11; - this.textRegionName.Visible = false; - this.textRegionName.ConfirmInput += new System.EventHandler(this.Save_confirm); - this.textRegionName.AbortInput += new System.EventHandler(this.Save_lost); - // - // numH - // - this.numH.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); - this.numH.Enabled = false; - this.numH.Location = new System.Drawing.Point(197, 107); - this.numH.Maximum = new decimal(new int[] { - 100000, - 0, - 0, - 0}); - this.numH.Minimum = new decimal(new int[] { - 100000, - 0, - 0, - -2147483648}); - this.numH.Name = "numH"; - this.numH.Size = new System.Drawing.Size(50, 23); - this.numH.TabIndex = 7; - this.numH.ValueChanged += new System.EventHandler(this.RegionValueSpinner_value_change); - // - // numW - // - this.numW.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); - this.numW.Enabled = false; - this.numW.Location = new System.Drawing.Point(197, 77); - this.numW.Maximum = new decimal(new int[] { - 100000, - 0, - 0, - 0}); - this.numW.Minimum = new decimal(new int[] { - 100000, - 0, - 0, - -2147483648}); - this.numW.Name = "numW"; - this.numW.Size = new System.Drawing.Size(50, 23); - this.numW.TabIndex = 6; - this.numW.ValueChanged += new System.EventHandler(this.RegionValueSpinner_value_change); - // - // numY - // - this.numY.Enabled = false; - this.numY.Location = new System.Drawing.Point(64, 107); - this.numY.Maximum = new decimal(new int[] { - 100000, - 0, - 0, - 0}); - this.numY.Minimum = new decimal(new int[] { - 100000, - 0, - 0, - -2147483648}); - this.numY.Name = "numY"; - this.numY.Size = new System.Drawing.Size(50, 23); - this.numY.TabIndex = 5; - this.numY.ValueChanged += new System.EventHandler(this.RegionValueSpinner_value_change); - // - // numX - // - this.numX.Enabled = false; - this.numX.Location = new System.Drawing.Point(64, 77); - this.numX.Maximum = new decimal(new int[] { - 100000, - 0, - 0, - 0}); - this.numX.Minimum = new decimal(new int[] { - 100000, - 0, - 0, - -2147483648}); - this.numX.Name = "numX"; - this.numX.Size = new System.Drawing.Size(50, 23); - this.numX.TabIndex = 4; - this.numX.ValueChanged += new System.EventHandler(this.RegionValueSpinner_value_change); - // - // buttonDone - // - this.buttonDone.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.buttonDone.Image = global::OnTopReplica.Properties.Resources.xiao_ok; - this.buttonDone.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft; - this.buttonDone.Location = new System.Drawing.Point(166, 174); - this.buttonDone.Name = "buttonDone"; - this.buttonDone.Size = new System.Drawing.Size(82, 27); - this.buttonDone.TabIndex = 9; - this.buttonDone.Text = global::OnTopReplica.Strings.RegionsDoneButton; - this.buttonDone.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageBeforeText; - this.buttonDone.UseVisualStyleBackColor = true; - this.buttonDone.Click += new System.EventHandler(this.Close_click); - // - // buttonReset - // - this.buttonReset.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.buttonReset.Location = new System.Drawing.Point(77, 174); - this.buttonReset.Name = "buttonReset"; - this.buttonReset.Size = new System.Drawing.Size(82, 27); - this.buttonReset.TabIndex = 8; - this.buttonReset.Text = global::OnTopReplica.Strings.RegionsResetButton; - this.buttonReset.UseVisualStyleBackColor = true; - this.buttonReset.Click += new System.EventHandler(this.Reset_click); - // - // labelHeight - // - this.labelHeight.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); - this.labelHeight.ForeColor = System.Drawing.SystemColors.ControlDark; - this.labelHeight.Location = new System.Drawing.Point(121, 110); - this.labelHeight.Name = "labelHeight"; - this.labelHeight.Size = new System.Drawing.Size(70, 21); - this.labelHeight.TabIndex = 9; - this.labelHeight.Text = "Height"; - this.labelHeight.TextAlign = System.Drawing.ContentAlignment.TopRight; - // - // labelWidth - // - this.labelWidth.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); - this.labelWidth.ForeColor = System.Drawing.SystemColors.ControlDark; - this.labelWidth.Location = new System.Drawing.Point(125, 80); - this.labelWidth.Name = "labelWidth"; - this.labelWidth.Size = new System.Drawing.Size(66, 21); - this.labelWidth.TabIndex = 8; - this.labelWidth.Text = "Width"; - this.labelWidth.TextAlign = System.Drawing.ContentAlignment.TopRight; - // - // labelY - // - this.labelY.ForeColor = System.Drawing.SystemColors.ControlDark; - this.labelY.Location = new System.Drawing.Point(7, 111); - this.labelY.Name = "labelY"; - this.labelY.Size = new System.Drawing.Size(50, 20); - this.labelY.TabIndex = 5; - this.labelY.Text = "Y"; - this.labelY.TextAlign = System.Drawing.ContentAlignment.TopRight; - // - // labelX - // - this.labelX.ForeColor = System.Drawing.SystemColors.ControlDark; - this.labelX.Location = new System.Drawing.Point(7, 81); - this.labelX.Name = "labelX"; - this.labelX.Size = new System.Drawing.Size(50, 20); - this.labelX.TabIndex = 4; - this.labelX.Text = "X"; - this.labelX.TextAlign = System.Drawing.ContentAlignment.TopRight; - // - // labelCurrentRegion - // - this.labelCurrentRegion.AutoSize = true; - this.labelCurrentRegion.Location = new System.Drawing.Point(7, 54); - this.labelCurrentRegion.Name = "labelCurrentRegion"; - this.labelCurrentRegion.Size = new System.Drawing.Size(87, 15); - this.labelCurrentRegion.TabIndex = 3; - this.labelCurrentRegion.Text = "Current region:"; - // - // buttonDelete - // - this.buttonDelete.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); - this.buttonDelete.Enabled = false; - this.buttonDelete.Image = global::OnTopReplica.Properties.Resources.xiao_delete; - this.buttonDelete.Location = new System.Drawing.Point(223, 21); - this.buttonDelete.Name = "buttonDelete"; - this.buttonDelete.Size = new System.Drawing.Size(27, 25); - this.buttonDelete.TabIndex = 3; - this.buttonDelete.UseVisualStyleBackColor = true; - this.buttonDelete.Click += new System.EventHandler(this.Delete_click); - // - // buttonSave - // - this.buttonSave.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); - this.buttonSave.Enabled = false; - this.buttonSave.Image = global::OnTopReplica.Properties.Resources.xiao_add; - this.buttonSave.Location = new System.Drawing.Point(196, 21); - this.buttonSave.Name = "buttonSave"; - this.buttonSave.Size = new System.Drawing.Size(27, 25); - this.buttonSave.TabIndex = 1; - this.buttonSave.UseVisualStyleBackColor = false; - this.buttonSave.Click += new System.EventHandler(this.Save_click); - // - // comboRegions - // - this.comboRegions.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.comboRegions.CueBannerText = global::OnTopReplica.Strings.RegionsStoredRegions; - this.comboRegions.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.comboRegions.FlatStyle = System.Windows.Forms.FlatStyle.System; - this.comboRegions.FormattingEnabled = true; - this.comboRegions.Location = new System.Drawing.Point(7, 22); - this.comboRegions.Name = "comboRegions"; - this.comboRegions.Size = new System.Drawing.Size(186, 23); - this.comboRegions.TabIndex = 0; - this.comboRegions.SelectedIndexChanged += new System.EventHandler(this.RegionCombo_index_change); - // - // RegionPanel - // - this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 15F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.Controls.Add(this.groupRegions); - this.MinimumSize = new System.Drawing.Size(268, 213); - this.Name = "RegionPanel"; - this.Padding = new System.Windows.Forms.Padding(7); - this.Size = new System.Drawing.Size(268, 222); - this.groupRegions.ResumeLayout(false); - this.groupRegions.PerformLayout(); - ((System.ComponentModel.ISupportInitialize)(this.numH)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.numW)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.numY)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.numX)).EndInit(); - this.ResumeLayout(false); - - } - - #endregion - - private System.Windows.Forms.GroupBox groupRegions; - private System.Windows.Forms.Button buttonDelete; - private System.Windows.Forms.Button buttonSave; - private WindowsFormsAero.ComboBox comboRegions; - private System.Windows.Forms.Button buttonDone; - private System.Windows.Forms.Button buttonReset; - private System.Windows.Forms.Label labelHeight; - private System.Windows.Forms.Label labelWidth; - private System.Windows.Forms.Label labelY; - private System.Windows.Forms.Label labelX; - private System.Windows.Forms.Label labelCurrentRegion; - private System.Windows.Forms.NumericUpDown numH; - private System.Windows.Forms.NumericUpDown numW; - private System.Windows.Forms.NumericUpDown numY; - private System.Windows.Forms.NumericUpDown numX; - private FocusedTextBox textRegionName; - private System.Windows.Forms.ToolTip toolTip; - private System.Windows.Forms.CheckBox checkRelative; - } -} +namespace OnTopReplica.SidePanels { + partial class RegionPanel { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) { + if (disposing && (components != null)) { + components.Dispose(); + } + 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() { + this.components = new System.ComponentModel.Container(); + this.groupRegions = new System.Windows.Forms.GroupBox(); + this.checkRelative = new System.Windows.Forms.CheckBox(); + this.textRegionName = new OnTopReplica.FocusedTextBox(); + this.numH = new System.Windows.Forms.NumericUpDown(); + this.numW = new System.Windows.Forms.NumericUpDown(); + this.numY = new System.Windows.Forms.NumericUpDown(); + this.numX = new System.Windows.Forms.NumericUpDown(); + this.buttonDone = new System.Windows.Forms.Button(); + this.buttonReset = new System.Windows.Forms.Button(); + this.labelHeight = new System.Windows.Forms.Label(); + this.labelWidth = new System.Windows.Forms.Label(); + this.labelY = new System.Windows.Forms.Label(); + this.labelX = new System.Windows.Forms.Label(); + this.labelCurrentRegion = new System.Windows.Forms.Label(); + this.buttonDelete = new System.Windows.Forms.Button(); + this.buttonSave = new System.Windows.Forms.Button(); + this.comboRegions = new WindowsFormsAero.ComboBox(); + this.toolTip = new System.Windows.Forms.ToolTip(this.components); + this.groupRegions.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.numH)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.numW)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.numY)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.numX)).BeginInit(); + this.SuspendLayout(); + // + // groupRegions + // + this.groupRegions.Controls.Add(this.checkRelative); + this.groupRegions.Controls.Add(this.textRegionName); + this.groupRegions.Controls.Add(this.numH); + this.groupRegions.Controls.Add(this.numW); + this.groupRegions.Controls.Add(this.numY); + this.groupRegions.Controls.Add(this.numX); + this.groupRegions.Controls.Add(this.buttonDone); + this.groupRegions.Controls.Add(this.buttonReset); + this.groupRegions.Controls.Add(this.labelHeight); + this.groupRegions.Controls.Add(this.labelWidth); + this.groupRegions.Controls.Add(this.labelY); + this.groupRegions.Controls.Add(this.labelX); + this.groupRegions.Controls.Add(this.labelCurrentRegion); + this.groupRegions.Controls.Add(this.buttonDelete); + this.groupRegions.Controls.Add(this.buttonSave); + this.groupRegions.Controls.Add(this.comboRegions); + this.groupRegions.Dock = System.Windows.Forms.DockStyle.Fill; + this.groupRegions.Location = new System.Drawing.Point(7, 7); + this.groupRegions.Name = "groupRegions"; + this.groupRegions.Size = new System.Drawing.Size(254, 208); + this.groupRegions.TabIndex = 0; + this.groupRegions.TabStop = false; + this.groupRegions.Text = "Regions:"; + // + // checkRelative + // + this.checkRelative.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.checkRelative.CheckAlign = System.Drawing.ContentAlignment.MiddleRight; + this.checkRelative.Location = new System.Drawing.Point(7, 137); + this.checkRelative.Name = "checkRelative"; + this.checkRelative.Size = new System.Drawing.Size(240, 21); + this.checkRelative.TabIndex = 12; + this.checkRelative.Text = "Relative to border"; + this.checkRelative.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + this.checkRelative.UseVisualStyleBackColor = true; + this.checkRelative.CheckedChanged += new System.EventHandler(this.CheckRelative_checked); + // + // textRegionName + // + this.textRegionName.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.textRegionName.BackColor = System.Drawing.SystemColors.ActiveCaption; + this.textRegionName.ForeColor = System.Drawing.SystemColors.ActiveCaptionText; + this.textRegionName.Location = new System.Drawing.Point(7, 51); + this.textRegionName.Name = "textRegionName"; + this.textRegionName.Size = new System.Drawing.Size(242, 23); + this.textRegionName.TabIndex = 11; + this.textRegionName.Visible = false; + this.textRegionName.ConfirmInput += new System.EventHandler(this.Save_confirm); + this.textRegionName.AbortInput += new System.EventHandler(this.Save_lost); + // + // numH + // + this.numH.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.numH.Enabled = false; + this.numH.Location = new System.Drawing.Point(197, 107); + this.numH.Maximum = new decimal(new int[] { + 100000, + 0, + 0, + 0}); + this.numH.Minimum = new decimal(new int[] { + 100000, + 0, + 0, + -2147483648}); + this.numH.Name = "numH"; + this.numH.Size = new System.Drawing.Size(50, 23); + this.numH.TabIndex = 7; + this.numH.ValueChanged += new System.EventHandler(this.RegionValueSpinner_value_change); + // + // numW + // + this.numW.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.numW.Enabled = false; + this.numW.Location = new System.Drawing.Point(197, 77); + this.numW.Maximum = new decimal(new int[] { + 100000, + 0, + 0, + 0}); + this.numW.Minimum = new decimal(new int[] { + 100000, + 0, + 0, + -2147483648}); + this.numW.Name = "numW"; + this.numW.Size = new System.Drawing.Size(50, 23); + this.numW.TabIndex = 6; + this.numW.ValueChanged += new System.EventHandler(this.RegionValueSpinner_value_change); + // + // numY + // + this.numY.Enabled = false; + this.numY.Location = new System.Drawing.Point(64, 107); + this.numY.Maximum = new decimal(new int[] { + 100000, + 0, + 0, + 0}); + this.numY.Minimum = new decimal(new int[] { + 100000, + 0, + 0, + -2147483648}); + this.numY.Name = "numY"; + this.numY.Size = new System.Drawing.Size(50, 23); + this.numY.TabIndex = 5; + this.numY.ValueChanged += new System.EventHandler(this.RegionValueSpinner_value_change); + // + // numX + // + this.numX.Enabled = false; + this.numX.Location = new System.Drawing.Point(64, 77); + this.numX.Maximum = new decimal(new int[] { + 100000, + 0, + 0, + 0}); + this.numX.Minimum = new decimal(new int[] { + 100000, + 0, + 0, + -2147483648}); + this.numX.Name = "numX"; + this.numX.Size = new System.Drawing.Size(50, 23); + this.numX.TabIndex = 4; + this.numX.ValueChanged += new System.EventHandler(this.RegionValueSpinner_value_change); + // + // buttonDone + // + this.buttonDone.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.buttonDone.Image = global::OnTopReplica.Properties.Resources.xiao_ok; + this.buttonDone.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft; + this.buttonDone.Location = new System.Drawing.Point(166, 174); + this.buttonDone.Name = "buttonDone"; + this.buttonDone.Size = new System.Drawing.Size(82, 27); + this.buttonDone.TabIndex = 9; + this.buttonDone.Text = global::OnTopReplica.Strings.RegionsDoneButton; + this.buttonDone.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageBeforeText; + this.buttonDone.UseVisualStyleBackColor = true; + this.buttonDone.Click += new System.EventHandler(this.Close_click); + // + // buttonReset + // + this.buttonReset.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.buttonReset.Location = new System.Drawing.Point(77, 174); + this.buttonReset.Name = "buttonReset"; + this.buttonReset.Size = new System.Drawing.Size(82, 27); + this.buttonReset.TabIndex = 8; + this.buttonReset.Text = global::OnTopReplica.Strings.RegionsResetButton; + this.buttonReset.UseVisualStyleBackColor = true; + this.buttonReset.Click += new System.EventHandler(this.Reset_click); + // + // labelHeight + // + this.labelHeight.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.labelHeight.ForeColor = System.Drawing.SystemColors.ControlDark; + this.labelHeight.Location = new System.Drawing.Point(121, 110); + this.labelHeight.Name = "labelHeight"; + this.labelHeight.Size = new System.Drawing.Size(70, 21); + this.labelHeight.TabIndex = 9; + this.labelHeight.Text = "Height"; + this.labelHeight.TextAlign = System.Drawing.ContentAlignment.TopRight; + // + // labelWidth + // + this.labelWidth.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.labelWidth.ForeColor = System.Drawing.SystemColors.ControlDark; + this.labelWidth.Location = new System.Drawing.Point(125, 80); + this.labelWidth.Name = "labelWidth"; + this.labelWidth.Size = new System.Drawing.Size(66, 21); + this.labelWidth.TabIndex = 8; + this.labelWidth.Text = "Width"; + this.labelWidth.TextAlign = System.Drawing.ContentAlignment.TopRight; + // + // labelY + // + this.labelY.ForeColor = System.Drawing.SystemColors.ControlDark; + this.labelY.Location = new System.Drawing.Point(7, 111); + this.labelY.Name = "labelY"; + this.labelY.Size = new System.Drawing.Size(50, 20); + this.labelY.TabIndex = 5; + this.labelY.Text = "Y"; + this.labelY.TextAlign = System.Drawing.ContentAlignment.TopRight; + // + // labelX + // + this.labelX.ForeColor = System.Drawing.SystemColors.ControlDark; + this.labelX.Location = new System.Drawing.Point(7, 81); + this.labelX.Name = "labelX"; + this.labelX.Size = new System.Drawing.Size(50, 20); + this.labelX.TabIndex = 4; + this.labelX.Text = "X"; + this.labelX.TextAlign = System.Drawing.ContentAlignment.TopRight; + // + // labelCurrentRegion + // + this.labelCurrentRegion.AutoSize = true; + this.labelCurrentRegion.Location = new System.Drawing.Point(7, 54); + this.labelCurrentRegion.Name = "labelCurrentRegion"; + this.labelCurrentRegion.Size = new System.Drawing.Size(87, 15); + this.labelCurrentRegion.TabIndex = 3; + this.labelCurrentRegion.Text = "Current region:"; + // + // buttonDelete + // + this.buttonDelete.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.buttonDelete.Enabled = false; + this.buttonDelete.Image = global::OnTopReplica.Properties.Resources.xiao_delete; + this.buttonDelete.Location = new System.Drawing.Point(223, 21); + this.buttonDelete.Name = "buttonDelete"; + this.buttonDelete.Size = new System.Drawing.Size(27, 25); + this.buttonDelete.TabIndex = 3; + this.buttonDelete.UseVisualStyleBackColor = true; + this.buttonDelete.Click += new System.EventHandler(this.Delete_click); + // + // buttonSave + // + this.buttonSave.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.buttonSave.Enabled = false; + this.buttonSave.Image = global::OnTopReplica.Properties.Resources.xiao_add; + this.buttonSave.Location = new System.Drawing.Point(196, 21); + this.buttonSave.Name = "buttonSave"; + this.buttonSave.Size = new System.Drawing.Size(27, 25); + this.buttonSave.TabIndex = 1; + this.buttonSave.UseVisualStyleBackColor = false; + this.buttonSave.Click += new System.EventHandler(this.Save_click); + // + // comboRegions + // + this.comboRegions.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.comboRegions.CueBannerText = global::OnTopReplica.Strings.RegionsStoredRegions; + this.comboRegions.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.comboRegions.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.comboRegions.FormattingEnabled = true; + this.comboRegions.Location = new System.Drawing.Point(7, 22); + this.comboRegions.Name = "comboRegions"; + this.comboRegions.Size = new System.Drawing.Size(186, 23); + this.comboRegions.TabIndex = 0; + this.comboRegions.SelectedIndexChanged += new System.EventHandler(this.RegionCombo_index_change); + // + // RegionPanel + // + this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 15F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.groupRegions); + this.MinimumSize = new System.Drawing.Size(268, 213); + this.Name = "RegionPanel"; + this.Padding = new System.Windows.Forms.Padding(7); + this.Size = new System.Drawing.Size(268, 222); + this.groupRegions.ResumeLayout(false); + this.groupRegions.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.numH)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.numW)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.numY)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.numX)).EndInit(); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.GroupBox groupRegions; + private System.Windows.Forms.Button buttonDelete; + private System.Windows.Forms.Button buttonSave; + private WindowsFormsAero.ComboBox comboRegions; + private System.Windows.Forms.Button buttonDone; + private System.Windows.Forms.Button buttonReset; + private System.Windows.Forms.Label labelHeight; + private System.Windows.Forms.Label labelWidth; + private System.Windows.Forms.Label labelY; + private System.Windows.Forms.Label labelX; + private System.Windows.Forms.Label labelCurrentRegion; + private System.Windows.Forms.NumericUpDown numH; + private System.Windows.Forms.NumericUpDown numW; + private System.Windows.Forms.NumericUpDown numY; + private System.Windows.Forms.NumericUpDown numX; + private FocusedTextBox textRegionName; + private System.Windows.Forms.ToolTip toolTip; + private System.Windows.Forms.CheckBox checkRelative; + } +} diff --git a/OnTopReplica/SidePanels/RegionPanel.cs b/src/OnTopReplica/SidePanels/RegionPanel.cs similarity index 96% rename from OnTopReplica/SidePanels/RegionPanel.cs rename to src/OnTopReplica/SidePanels/RegionPanel.cs index 9ef4983..3ddf166 100644 --- a/OnTopReplica/SidePanels/RegionPanel.cs +++ b/src/OnTopReplica/SidePanels/RegionPanel.cs @@ -1,320 +1,320 @@ -using System; -using System.Drawing; -using System.Windows.Forms; -using OnTopReplica.Properties; - -namespace OnTopReplica.SidePanels { - - partial class RegionPanel : SidePanel { - - public RegionPanel() { - InitializeComponent(); - - Localize(); - - //Copy settings into combo box - if (Settings.Default.SavedRegions != null) { - foreach (object o in Settings.Default.SavedRegions) { - comboRegions.Items.Add(o); - } - } - - _regionDrawnHandler = new ThumbnailPanel.RegionDrawnHandler(ThumbnailPanel_RegionDrawn); - } - - /// - /// Localizes the dialog's labels. - /// - private void Localize() { - this.SuspendLayout(); - - groupRegions.Text = Strings.RegionsTitle; - comboRegions.CueBannerText = Strings.RegionsStoredRegions; - labelCurrentRegion.Text = Strings.RegionsCurrentRegion; - buttonReset.Text = Strings.RegionsResetButton; - buttonDone.Text = Strings.RegionsDoneButton; - UpdateRegionLabels(); - - toolTip.SetToolTip(buttonSave, Strings.RegionsSaveButton); - toolTip.SetToolTip(buttonDelete, Strings.RegionsDeleteButton); - - this.ResumeLayout(); - } - - /// - /// Updates the labels for the region value selectors and the relative mode checkbox. - /// - private void UpdateRegionControls(ThumbnailRegion region) { - checkRelative.Checked = region.Relative; - - if (region.Relative) { - Padding p = region.BoundsAsPadding; - numX.Value = p.Left; - numY.Value = p.Top; - numW.Value = p.Right; - numH.Value = p.Bottom; - } - else { - Rectangle r = region.Bounds; - numX.Value = r.X; - numY.Value = r.Y; - numW.Value = r.Width; - numH.Value = r.Height; - } - - UpdateRegionLabels(); - } - - /// - /// Updates the labels of region selectors based on the dialog's state. - /// - private void UpdateRegionLabels() { - if (checkRelative.Checked) { - labelX.Text = Strings.RegionsLeft; - labelY.Text = Strings.RegionsTop; - labelWidth.Text = Strings.RegionsRight; - labelHeight.Text = Strings.RegionsBottom; - } - else { - labelX.Text = Strings.RegionsX; - labelY.Text = Strings.RegionsY; - labelWidth.Text = Strings.RegionsWidth; - labelHeight.Text = Strings.RegionsHeight; - } - } - - public override string Title { - get { - return Strings.MenuRegion; - } - } - - ThumbnailPanel.RegionDrawnHandler _regionDrawnHandler; - - public override void OnFirstShown(MainForm form) { - base.OnFirstShown(form); - - //Init shown region if current thumbnail is clipped to region - if (form.SelectedThumbnailRegion != null) { - SetRegion(form.SelectedThumbnailRegion); - } - - //Enable region drawing - form.ThumbnailPanel.DrawMouseRegions = true; - form.ThumbnailPanel.RegionDrawn += _regionDrawnHandler; - } - - public override void OnClosing(MainForm form) { - base.OnClosing(form); - - //Reset region drawing - form.ThumbnailPanel.DrawMouseRegions = false; - form.ThumbnailPanel.RegionDrawn -= _regionDrawnHandler; - } - - void ThumbnailPanel_RegionDrawn(object sender, ThumbnailRegion region) { - SetRegion(region); - } - - #region Interface - - /// - /// Sets the current selected region to a specific instance of a stored region. - /// - /// A stored region instance or null to reset. - public void SetRegion(StoredRegion region) { - if (region == null) { - Reset(); - return; - } - - SetRegion(region.Region); - - //Select right combobox - if (comboRegions.Items.Contains(region)) { - comboRegions.SelectedItem = region; - } - } - - /// - /// Sets the current selected region to a specific region rectangle. - /// - /// The region boundaries. - public void SetRegion(ThumbnailRegion region) { - try { - _ignoreValueChanges = true; - - UpdateRegionControls(region); - - numX.Enabled = numY.Enabled = numW.Enabled = numH.Enabled = true; - } - finally { - _ignoreValueChanges = false; - } - - OnRegionSet(region); - } - - /// - /// Resets the selected region and disables the num spinners. - /// - public void Reset() { - try { - _ignoreValueChanges = true; - - numX.Value = numY.Value = numW.Value = numH.Value = 0; - numX.Enabled = numY.Enabled = numW.Enabled = numH.Enabled = false; - checkRelative.Checked = false; - UpdateRegionLabels(); - - buttonSave.Enabled = false; - - comboRegions.SelectedIndex = -1; - } - finally { - _ignoreValueChanges = false; - } - } - - #endregion - - /// - /// Constructs a ThumbnailRegion from the dialog's current state. - /// - protected ThumbnailRegion ConstructCurrentRegion() { - Rectangle bounds = new Rectangle { - X = (int)numX.Value, - Y = (int)numY.Value, - Width = (int)numW.Value, - Height = (int)numH.Value - }; - - ThumbnailRegion newRegion = new ThumbnailRegion(bounds, checkRelative.Checked); - - return newRegion; - } - - /// - /// Adds a new stored region. - /// - /// Region bounds. - /// Name of the region. - /// Whether the region is relative to the border. - private void StoreCurrentRegion(string regionName) { - StoredRegion storedRegion = new StoredRegion(this.ConstructCurrentRegion(), regionName); - - int index = comboRegions.Items.Add(storedRegion); - comboRegions.SelectedIndex = index; - - if (Settings.Default.SavedRegions == null) - Settings.Default.SavedRegions = new StoredRegionArray(); - Settings.Default.SavedRegions.Add(storedRegion); - } - - /// - /// Internal event raised when a change occurs in the selected region. - /// - /// Region bounds. - protected virtual void OnRegionSet(ThumbnailRegion region) { - //Forward region to thumbnail - ParentMainForm.SelectedThumbnailRegion = region; - - //Have region, allowed to save - buttonSave.Enabled = true; - } - - #region GUI event handlers - - private void Close_click(object sender, EventArgs e) { - OnRequestClosing(); - } - - private void Reset_click(object sender, EventArgs e) { - Reset(); - ParentMainForm.SelectedThumbnailRegion = null; - } - - private void Delete_click(object sender, EventArgs e) { - if (comboRegions.SelectedIndex < 0) - return; - - var origIndex = comboRegions.SelectedIndex; - comboRegions.SelectedIndex = -1; - - Settings.Default.SavedRegions.RemoveAt(origIndex); - comboRegions.Items.RemoveAt(origIndex); - } - - private void Save_click(object sender, EventArgs e) { - //Display textbox instead of button - buttonSave.Enabled = buttonDelete.Enabled = false; - textRegionName.Visible = true; - textRegionName.Focus(); - } - - private void Save_confirm(object sender, EventArgs e) { - if (!string.IsNullOrEmpty(textRegionName.Text)) { - StoreCurrentRegion(textRegionName.Text); - } - - //Hide textbox and show button again - textRegionName.Visible = false; - textRegionName.Text = string.Empty; - - buttonSave.Enabled = buttonDelete.Enabled = true; - } - - private void Save_lost(object sender, EventArgs e) { - //Reset textbox - textRegionName.Visible = false; - textRegionName.Text = string.Empty; - - buttonSave.Enabled = buttonDelete.Enabled = true; - buttonSave.Focus(); - } - - // Used to signal to the value change handler that all events should be temporarily ignored. - bool _ignoreValueChanges = false; - - private void RegionValueSpinner_value_change(object sender, EventArgs e) { - if (_ignoreValueChanges) - return; - - OnRegionSet(ConstructCurrentRegion()); - } - - private void RegionCombo_index_change(object sender, EventArgs e) { - buttonDelete.Enabled = (comboRegions.SelectedIndex >= 0); - - if (comboRegions.SelectedIndex >= 0) { - var region = comboRegions.SelectedItem as StoredRegion; - if (region == null) { - Log.Write("Stored region at index {0} does not contain a valid StoredRegion instance (object is {2})", comboRegions.SelectedIndex, comboRegions.SelectedItem); - return; - } - - SetRegion(region.Region); - } - } - - private void CheckRelative_checked(object sender, EventArgs e) { - if (_ignoreValueChanges) - return; - - //Get current region and switch mode - var region = ConstructCurrentRegion(); - region.Relative = !region.Relative; //this must be reversed because the GUI has already switched state when calling ConstructCurrentRegion() - if (checkRelative.Checked) - region.SwitchToRelative(ParentMainForm.ThumbnailPanel.ThumbnailOriginalSize); - else - region.SwitchToAbsolute(ParentMainForm.ThumbnailPanel.ThumbnailOriginalSize); - - //Update GUI - SetRegion(region); - } - - #endregion - - } - -} +using System; +using System.Drawing; +using System.Windows.Forms; +using OnTopReplica.Properties; + +namespace OnTopReplica.SidePanels { + + partial class RegionPanel : SidePanel { + + public RegionPanel() { + InitializeComponent(); + + Localize(); + + //Copy settings into combo box + if (Settings.Default.SavedRegions != null) { + foreach (object o in Settings.Default.SavedRegions) { + comboRegions.Items.Add(o); + } + } + + _regionDrawnHandler = new ThumbnailPanel.RegionDrawnHandler(ThumbnailPanel_RegionDrawn); + } + + /// + /// Localizes the dialog's labels. + /// + private void Localize() { + this.SuspendLayout(); + + groupRegions.Text = Strings.RegionsTitle; + comboRegions.CueBannerText = Strings.RegionsStoredRegions; + labelCurrentRegion.Text = Strings.RegionsCurrentRegion; + buttonReset.Text = Strings.RegionsResetButton; + buttonDone.Text = Strings.RegionsDoneButton; + UpdateRegionLabels(); + + toolTip.SetToolTip(buttonSave, Strings.RegionsSaveButton); + toolTip.SetToolTip(buttonDelete, Strings.RegionsDeleteButton); + + this.ResumeLayout(); + } + + /// + /// Updates the labels for the region value selectors and the relative mode checkbox. + /// + private void UpdateRegionControls(ThumbnailRegion region) { + checkRelative.Checked = region.Relative; + + if (region.Relative) { + Padding p = region.BoundsAsPadding; + numX.Value = p.Left; + numY.Value = p.Top; + numW.Value = p.Right; + numH.Value = p.Bottom; + } + else { + Rectangle r = region.Bounds; + numX.Value = r.X; + numY.Value = r.Y; + numW.Value = r.Width; + numH.Value = r.Height; + } + + UpdateRegionLabels(); + } + + /// + /// Updates the labels of region selectors based on the dialog's state. + /// + private void UpdateRegionLabels() { + if (checkRelative.Checked) { + labelX.Text = Strings.RegionsLeft; + labelY.Text = Strings.RegionsTop; + labelWidth.Text = Strings.RegionsRight; + labelHeight.Text = Strings.RegionsBottom; + } + else { + labelX.Text = Strings.RegionsX; + labelY.Text = Strings.RegionsY; + labelWidth.Text = Strings.RegionsWidth; + labelHeight.Text = Strings.RegionsHeight; + } + } + + public override string Title { + get { + return Strings.MenuRegion; + } + } + + ThumbnailPanel.RegionDrawnHandler _regionDrawnHandler; + + public override void OnFirstShown(MainForm form) { + base.OnFirstShown(form); + + //Init shown region if current thumbnail is clipped to region + if (form.SelectedThumbnailRegion != null) { + SetRegion(form.SelectedThumbnailRegion); + } + + //Enable region drawing + form.ThumbnailPanel.DrawMouseRegions = true; + form.ThumbnailPanel.RegionDrawn += _regionDrawnHandler; + } + + public override void OnClosing(MainForm form) { + base.OnClosing(form); + + //Reset region drawing + form.ThumbnailPanel.DrawMouseRegions = false; + form.ThumbnailPanel.RegionDrawn -= _regionDrawnHandler; + } + + void ThumbnailPanel_RegionDrawn(object sender, ThumbnailRegion region) { + SetRegion(region); + } + + #region Interface + + /// + /// Sets the current selected region to a specific instance of a stored region. + /// + /// A stored region instance or null to reset. + public void SetRegion(StoredRegion region) { + if (region == null) { + Reset(); + return; + } + + SetRegion(region.Region); + + //Select right combobox + if (comboRegions.Items.Contains(region)) { + comboRegions.SelectedItem = region; + } + } + + /// + /// Sets the current selected region to a specific region rectangle. + /// + /// The region boundaries. + public void SetRegion(ThumbnailRegion region) { + try { + _ignoreValueChanges = true; + + UpdateRegionControls(region); + + numX.Enabled = numY.Enabled = numW.Enabled = numH.Enabled = true; + } + finally { + _ignoreValueChanges = false; + } + + OnRegionSet(region); + } + + /// + /// Resets the selected region and disables the num spinners. + /// + public void Reset() { + try { + _ignoreValueChanges = true; + + numX.Value = numY.Value = numW.Value = numH.Value = 0; + numX.Enabled = numY.Enabled = numW.Enabled = numH.Enabled = false; + checkRelative.Checked = false; + UpdateRegionLabels(); + + buttonSave.Enabled = false; + + comboRegions.SelectedIndex = -1; + } + finally { + _ignoreValueChanges = false; + } + } + + #endregion + + /// + /// Constructs a ThumbnailRegion from the dialog's current state. + /// + protected ThumbnailRegion ConstructCurrentRegion() { + Rectangle bounds = new Rectangle { + X = (int)numX.Value, + Y = (int)numY.Value, + Width = (int)numW.Value, + Height = (int)numH.Value + }; + + ThumbnailRegion newRegion = new ThumbnailRegion(bounds, checkRelative.Checked); + + return newRegion; + } + + /// + /// Adds a new stored region. + /// + /// Region bounds. + /// Name of the region. + /// Whether the region is relative to the border. + private void StoreCurrentRegion(string regionName) { + StoredRegion storedRegion = new StoredRegion(this.ConstructCurrentRegion(), regionName); + + int index = comboRegions.Items.Add(storedRegion); + comboRegions.SelectedIndex = index; + + if (Settings.Default.SavedRegions == null) + Settings.Default.SavedRegions = new StoredRegionArray(); + Settings.Default.SavedRegions.Add(storedRegion); + } + + /// + /// Internal event raised when a change occurs in the selected region. + /// + /// Region bounds. + protected virtual void OnRegionSet(ThumbnailRegion region) { + //Forward region to thumbnail + ParentMainForm.SelectedThumbnailRegion = region; + + //Have region, allowed to save + buttonSave.Enabled = true; + } + + #region GUI event handlers + + private void Close_click(object sender, EventArgs e) { + OnRequestClosing(); + } + + private void Reset_click(object sender, EventArgs e) { + Reset(); + ParentMainForm.SelectedThumbnailRegion = null; + } + + private void Delete_click(object sender, EventArgs e) { + if (comboRegions.SelectedIndex < 0) + return; + + var origIndex = comboRegions.SelectedIndex; + comboRegions.SelectedIndex = -1; + + Settings.Default.SavedRegions.RemoveAt(origIndex); + comboRegions.Items.RemoveAt(origIndex); + } + + private void Save_click(object sender, EventArgs e) { + //Display textbox instead of button + buttonSave.Enabled = buttonDelete.Enabled = false; + textRegionName.Visible = true; + textRegionName.Focus(); + } + + private void Save_confirm(object sender, EventArgs e) { + if (!string.IsNullOrEmpty(textRegionName.Text)) { + StoreCurrentRegion(textRegionName.Text); + } + + //Hide textbox and show button again + textRegionName.Visible = false; + textRegionName.Text = string.Empty; + + buttonSave.Enabled = buttonDelete.Enabled = true; + } + + private void Save_lost(object sender, EventArgs e) { + //Reset textbox + textRegionName.Visible = false; + textRegionName.Text = string.Empty; + + buttonSave.Enabled = buttonDelete.Enabled = true; + buttonSave.Focus(); + } + + // Used to signal to the value change handler that all events should be temporarily ignored. + bool _ignoreValueChanges = false; + + private void RegionValueSpinner_value_change(object sender, EventArgs e) { + if (_ignoreValueChanges) + return; + + OnRegionSet(ConstructCurrentRegion()); + } + + private void RegionCombo_index_change(object sender, EventArgs e) { + buttonDelete.Enabled = (comboRegions.SelectedIndex >= 0); + + if (comboRegions.SelectedIndex >= 0) { + var region = comboRegions.SelectedItem as StoredRegion; + if (region == null) { + Log.Write("Stored region at index {0} does not contain a valid StoredRegion instance (object is {2})", comboRegions.SelectedIndex, comboRegions.SelectedItem); + return; + } + + SetRegion(region.Region); + } + } + + private void CheckRelative_checked(object sender, EventArgs e) { + if (_ignoreValueChanges) + return; + + //Get current region and switch mode + var region = ConstructCurrentRegion(); + region.Relative = !region.Relative; //this must be reversed because the GUI has already switched state when calling ConstructCurrentRegion() + if (checkRelative.Checked) + region.SwitchToRelative(ParentMainForm.ThumbnailPanel.ThumbnailOriginalSize); + else + region.SwitchToAbsolute(ParentMainForm.ThumbnailPanel.ThumbnailOriginalSize); + + //Update GUI + SetRegion(region); + } + + #endregion + + } + +} diff --git a/OnTopReplica/SidePanels/RegionPanel.resx b/src/OnTopReplica/SidePanels/RegionPanel.resx similarity index 97% rename from OnTopReplica/SidePanels/RegionPanel.resx rename to src/OnTopReplica/SidePanels/RegionPanel.resx index 026c576..bb86328 100644 --- a/OnTopReplica/SidePanels/RegionPanel.resx +++ b/src/OnTopReplica/SidePanels/RegionPanel.resx @@ -1,123 +1,123 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 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 - - - 17, 17 - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + 17, 17 + \ No newline at end of file diff --git a/OnTopReplica/StartupOptions/CliStatus.cs b/src/OnTopReplica/StartupOptions/CliStatus.cs similarity index 95% rename from OnTopReplica/StartupOptions/CliStatus.cs rename to src/OnTopReplica/StartupOptions/CliStatus.cs index a445e68..a1bdd6b 100644 --- a/OnTopReplica/StartupOptions/CliStatus.cs +++ b/src/OnTopReplica/StartupOptions/CliStatus.cs @@ -1,21 +1,21 @@ -using System; -using System.Collections.Generic; -using System.Text; - -namespace OnTopReplica.StartupOptions { - public enum CliStatus { - /// - /// No errors while parsing. - /// - Ok, - /// - /// User asked for help. - /// - Information, - /// - /// Error while parsing. - /// - Error - } - -} +using System; +using System.Collections.Generic; +using System.Text; + +namespace OnTopReplica.StartupOptions { + public enum CliStatus { + /// + /// No errors while parsing. + /// + Ok, + /// + /// User asked for help. + /// + Information, + /// + /// Error while parsing. + /// + Error + } + +} diff --git a/OnTopReplica/StartupOptions/CommandLineReportForm.Designer.cs b/src/OnTopReplica/StartupOptions/CommandLineReportForm.Designer.cs similarity index 98% rename from OnTopReplica/StartupOptions/CommandLineReportForm.Designer.cs rename to src/OnTopReplica/StartupOptions/CommandLineReportForm.Designer.cs index 9a2ec68..d6044a0 100644 --- a/OnTopReplica/StartupOptions/CommandLineReportForm.Designer.cs +++ b/src/OnTopReplica/StartupOptions/CommandLineReportForm.Designer.cs @@ -1,116 +1,116 @@ -namespace OnTopReplica.StartupOptions { - partial class CommandLineReportForm { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) { - if (disposing && (components != null)) { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Windows Form 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(CommandLineReportForm)); - this.buttonOk = new System.Windows.Forms.Button(); - this.labelInstruction = new System.Windows.Forms.Label(); - this.txtDescription = new System.Windows.Forms.TextBox(); - this.label1 = new System.Windows.Forms.Label(); - this.txtCliArgs = new System.Windows.Forms.TextBox(); - this.SuspendLayout(); - // - // buttonOk - // - this.buttonOk.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.buttonOk.DialogResult = System.Windows.Forms.DialogResult.OK; - this.buttonOk.Location = new System.Drawing.Point(440, 200); - this.buttonOk.Name = "buttonOk"; - this.buttonOk.Size = new System.Drawing.Size(75, 23); - this.buttonOk.TabIndex = 0; - this.buttonOk.Text = "OK"; - this.buttonOk.UseVisualStyleBackColor = true; - // - // labelInstruction - // - this.labelInstruction.AutoSize = true; - this.labelInstruction.Font = new System.Drawing.Font("Segoe UI", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.labelInstruction.ForeColor = System.Drawing.SystemColors.HotTrack; - this.labelInstruction.Location = new System.Drawing.Point(12, 10); - this.labelInstruction.Name = "labelInstruction"; - this.labelInstruction.Size = new System.Drawing.Size(112, 21); - this.labelInstruction.TabIndex = 1; - this.labelInstruction.Text = "Command line"; - // - // txtDescription - // - this.txtDescription.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.txtDescription.Font = new System.Drawing.Font("Consolas", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.txtDescription.Location = new System.Drawing.Point(12, 42); - this.txtDescription.Multiline = true; - this.txtDescription.Name = "txtDescription"; - this.txtDescription.ReadOnly = true; - this.txtDescription.ScrollBars = System.Windows.Forms.ScrollBars.Vertical; - this.txtDescription.Size = new System.Drawing.Size(503, 152); - this.txtDescription.TabIndex = 2; - // - // label1 - // - this.label1.AutoSize = true; - this.label1.Location = new System.Drawing.Point(13, 205); - this.label1.Name = "label1"; - this.label1.Size = new System.Drawing.Size(60, 13); - this.label1.TabIndex = 3; - this.label1.Text = "Arguments:"; - // - // txtCliArgs - // - this.txtCliArgs.Location = new System.Drawing.Point(79, 202); - this.txtCliArgs.Name = "txtCliArgs"; - this.txtCliArgs.ReadOnly = true; - this.txtCliArgs.Size = new System.Drawing.Size(355, 20); - this.txtCliArgs.TabIndex = 4; - // - // CommandLineReportForm - // - this.AcceptButton = this.buttonOk; - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.BackColor = System.Drawing.SystemColors.ControlLightLight; - this.ClientSize = new System.Drawing.Size(527, 235); - this.Controls.Add(this.txtCliArgs); - this.Controls.Add(this.label1); - this.Controls.Add(this.txtDescription); - this.Controls.Add(this.labelInstruction); - this.Controls.Add(this.buttonOk); - this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; - this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); - this.Name = "CommandLineReportForm"; - this.Text = "Command line parameters"; - this.ResumeLayout(false); - this.PerformLayout(); - - } - - #endregion - - private System.Windows.Forms.Button buttonOk; - private System.Windows.Forms.Label labelInstruction; - private System.Windows.Forms.TextBox txtDescription; - private System.Windows.Forms.Label label1; - private System.Windows.Forms.TextBox txtCliArgs; - } +namespace OnTopReplica.StartupOptions { + partial class CommandLineReportForm { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) { + if (disposing && (components != null)) { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form 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(CommandLineReportForm)); + this.buttonOk = new System.Windows.Forms.Button(); + this.labelInstruction = new System.Windows.Forms.Label(); + this.txtDescription = new System.Windows.Forms.TextBox(); + this.label1 = new System.Windows.Forms.Label(); + this.txtCliArgs = new System.Windows.Forms.TextBox(); + this.SuspendLayout(); + // + // buttonOk + // + this.buttonOk.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.buttonOk.DialogResult = System.Windows.Forms.DialogResult.OK; + this.buttonOk.Location = new System.Drawing.Point(440, 200); + this.buttonOk.Name = "buttonOk"; + this.buttonOk.Size = new System.Drawing.Size(75, 23); + this.buttonOk.TabIndex = 0; + this.buttonOk.Text = "OK"; + this.buttonOk.UseVisualStyleBackColor = true; + // + // labelInstruction + // + this.labelInstruction.AutoSize = true; + this.labelInstruction.Font = new System.Drawing.Font("Segoe UI", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.labelInstruction.ForeColor = System.Drawing.SystemColors.HotTrack; + this.labelInstruction.Location = new System.Drawing.Point(12, 10); + this.labelInstruction.Name = "labelInstruction"; + this.labelInstruction.Size = new System.Drawing.Size(112, 21); + this.labelInstruction.TabIndex = 1; + this.labelInstruction.Text = "Command line"; + // + // txtDescription + // + this.txtDescription.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.txtDescription.Font = new System.Drawing.Font("Consolas", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.txtDescription.Location = new System.Drawing.Point(12, 42); + this.txtDescription.Multiline = true; + this.txtDescription.Name = "txtDescription"; + this.txtDescription.ReadOnly = true; + this.txtDescription.ScrollBars = System.Windows.Forms.ScrollBars.Vertical; + this.txtDescription.Size = new System.Drawing.Size(503, 152); + this.txtDescription.TabIndex = 2; + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Location = new System.Drawing.Point(13, 205); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(60, 13); + this.label1.TabIndex = 3; + this.label1.Text = "Arguments:"; + // + // txtCliArgs + // + this.txtCliArgs.Location = new System.Drawing.Point(79, 202); + this.txtCliArgs.Name = "txtCliArgs"; + this.txtCliArgs.ReadOnly = true; + this.txtCliArgs.Size = new System.Drawing.Size(355, 20); + this.txtCliArgs.TabIndex = 4; + // + // CommandLineReportForm + // + this.AcceptButton = this.buttonOk; + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.BackColor = System.Drawing.SystemColors.ControlLightLight; + this.ClientSize = new System.Drawing.Size(527, 235); + this.Controls.Add(this.txtCliArgs); + this.Controls.Add(this.label1); + this.Controls.Add(this.txtDescription); + this.Controls.Add(this.labelInstruction); + this.Controls.Add(this.buttonOk); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; + this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); + this.Name = "CommandLineReportForm"; + this.Text = "Command line parameters"; + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.Button buttonOk; + private System.Windows.Forms.Label labelInstruction; + private System.Windows.Forms.TextBox txtDescription; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.TextBox txtCliArgs; + } } \ No newline at end of file diff --git a/OnTopReplica/StartupOptions/CommandLineReportForm.cs b/src/OnTopReplica/StartupOptions/CommandLineReportForm.cs similarity index 96% rename from OnTopReplica/StartupOptions/CommandLineReportForm.cs rename to src/OnTopReplica/StartupOptions/CommandLineReportForm.cs index e3315ca..339aa04 100644 --- a/OnTopReplica/StartupOptions/CommandLineReportForm.cs +++ b/src/OnTopReplica/StartupOptions/CommandLineReportForm.cs @@ -1,30 +1,30 @@ -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Drawing; -using System.Text; -using System.Windows.Forms; - -namespace OnTopReplica.StartupOptions { - public partial class CommandLineReportForm : Form { - - public CommandLineReportForm(CliStatus status, string message) { - InitializeComponent(); - - switch (status) { - case CliStatus.Information: - labelInstruction.Text = "Command line help"; - break; - - case CliStatus.Error: - labelInstruction.Text = "Command line parsing error"; - break; - } - - txtDescription.Text = message; - - txtCliArgs.Text = Environment.CommandLine; - } - - } -} +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +namespace OnTopReplica.StartupOptions { + public partial class CommandLineReportForm : Form { + + public CommandLineReportForm(CliStatus status, string message) { + InitializeComponent(); + + switch (status) { + case CliStatus.Information: + labelInstruction.Text = "Command line help"; + break; + + case CliStatus.Error: + labelInstruction.Text = "Command line parsing error"; + break; + } + + txtDescription.Text = message; + + txtCliArgs.Text = Environment.CommandLine; + } + + } +} diff --git a/OnTopReplica/StartupOptions/CommandLineReportForm.resx b/src/OnTopReplica/StartupOptions/CommandLineReportForm.resx similarity index 98% rename from OnTopReplica/StartupOptions/CommandLineReportForm.resx rename to src/OnTopReplica/StartupOptions/CommandLineReportForm.resx index b6de04b..8433ced 100644 --- a/OnTopReplica/StartupOptions/CommandLineReportForm.resx +++ b/src/OnTopReplica/StartupOptions/CommandLineReportForm.resx @@ -1,1574 +1,1574 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 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 - - - - - AAABAAYAgIAAAAEAIAAoCAEAZgAAADAwAAABACAAqCUAAI4IAQAgIAAAAQAgAKgQAAA2LgEAGBgAAAEA - IACICQAA3j4BABQUAAABACAAuAYAAGZIAQAQEAAAAQAgAGgEAAAeTwEAKAAAAIAAAAAAAQAAAQAgAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAABAAAAAgAAAAMAAAAGAAAABwAAAAoAAAANAAAADwAA - ABEAAAAVAAAAGAAAABoAAAAdAAAAHgAAACAAAAAhAAAAIgAAACIAAAAjAAAAIwAAACIAAAAiAAAAIgAA - ACIAAAAiAAAAIgAAACIAAAAiAAAAIgAAACIAAAAiAAAAIgAAACIAAAAiAAAAIgAAACIAAAAiAAAAIgAA - ACIAAAAiAAAAIgAAACIAAAAiAAAAIgAAACIAAAAiAAAAIgAAACIAAAAiAAAAIgAAACIAAAAiAAAAIgAA - ACIAAAAiAAAAIgAAACIAAAAiAAAAIgAAACIAAAAiAAAAIgAAACIAAAAiAAAAIgAAACIAAAAiAAAAIgAA - ACIAAAAiAAAAIgAAACIAAAAiAAAAIgAAACIAAAAiAAAAIgAAACIAAAAiAAAAIgAAACIAAAAiAAAAIgAA - ACIAAAAiAAAAIgAAACIAAAAiAAAAIgAAACIAAAAiAAAAIgAAACIAAAAiAAAAIgAAACIAAAAiAAAAIgAA - ACIAAAAiAAAAIgAAACIAAAAiAAAAIgAAACIAAAAiAAAAIgAAACIAAAAiAAAAIgAAACIAAAAiAAAAIgAA - ACAAAAAfAAAAHgAAABwAAAAZAAAAFwAAABMAAAAQAAAADgAAAAsAAAAIAAAABwAAAAQAAAACAAAAAgAA - AAMAAAAEAAAABQAAAAkAAAALAAAADgAAABIAAAAWAAAAGQAAAB0AAAAgAAAAJAAAACcAAAAqAAAAKwAA - AC0AAAAvAAAALwAAADAAAAAwAAAALwAAAC8AAAAvAAAALwAAAC8AAAAvAAAALwAAAC8AAAAvAAAALwAA - AC8AAAAvAAAALwAAAC8AAAAvAAAALwAAAC8AAAAvAAAALwAAAC8AAAAvAAAALwAAAC8AAAAvAAAALwAA - AC8AAAAvAAAALwAAAC8AAAAvAAAALwAAAC8AAAAvAAAALwAAAC8AAAAvAAAALwAAAC8AAAAvAAAALwAA - AC8AAAAvAAAALwAAAC8AAAAvAAAALwAAAC8AAAAvAAAALwAAAC8AAAAvAAAALwAAAC8AAAAvAAAALwAA - AC8AAAAvAAAALwAAAC8AAAAvAAAALwAAAC8AAAAvAAAALwAAAC8AAAAvAAAALwAAAC8AAAAvAAAALwAA - AC8AAAAvAAAALwAAAC8AAAAvAAAALwAAAC8AAAAvAAAALwAAAC8AAAAvAAAALwAAAC8AAAAvAAAALwAA - AC8AAAAvAAAALwAAAC8AAAAvAAAALwAAAC8AAAAuAAAALQAAACsAAAApAAAAJgAAACIAAAAfAAAAHAAA - ABgAAAAUAAAAEAAAAAwAAAAKAAAABwAAAAQAAAADAAAABAAAAAYAAAAIAAAADAAAAA8AAAATAAAAGAAA - AB0AAAAiAAAAJgAAACoAAAAuAAAAMQAAADQAAAA2AAAAOAAAADoAAAA7AAAAOwAAADsAAAA7AAAAOwAA - ADsAAAA7AAAAOwAAADsAAAA7AAAAOwAAADsAAAA7AAAAOwAAADsAAAA7AAAAOwAAADsAAAA7AAAAOwAA - ADsAAAA7AAAAOwAAADsAAAA7AAAAOwAAADsAAAA7AAAAOwAAADsAAAA7AAAAOwAAADsAAAA7AAAAOwAA - ADsAAAA7AAAAOwAAADsAAAA7AAAAOwAAADsAAAA7AAAAOwAAADsAAAA7AAAAOwAAADsAAAA7AAAAOwAA - ADsAAAA7AAAAOwAAADsAAAA7AAAAOwAAADsAAAA7AAAAOwAAADsAAAA7AAAAOwAAADsAAAA7AAAAOwAA - ADsAAAA7AAAAOwAAADsAAAA7AAAAOwAAADsAAAA7AAAAOwAAADsAAAA7AAAAOwAAADsAAAA7AAAAOwAA - ADsAAAA7AAAAOwAAADsAAAA7AAAAOwAAADsAAAA7AAAAOwAAADsAAAA7AAAAOwAAADsAAAA7AAAAOgAA - ADkAAAA4AAAANgAAADMAAAAwAAAALAAAACgAAAAlAAAAIAAAABsAAAAWAAAAEQAAAA4AAAAKAAAABwAA - AAQAAAAFAAAACAAAAAsAAAAPAAAAEwAAABkAAAAfAAAAJQAAACoAAAAvAAAANQAAADoAAAA+AAAAQQAA - AEQAAABGAAAASAAAAEkAAABJAAAASQAAAEkAAABJAAAASQAAAEkAAABJAAAASQAAAEkAAABJAAAASQAA - AEkAAABJAAAASQAAAEkAAABJAAAASQAAAEkAAABJAAAASQAAAEkAAABJAAAASQAAAEkAAABJAAAASQAA - AEkAAABJAAAASQAAAEkAAABJAAAASQAAAEkAAABJAAAASQAAAEkAAABJAAAASQAAAEkAAABJAAAASQAA - AEkAAABJAAAASQAAAEkAAABJAAAASQAAAEkAAABJAAAASQAAAEkAAABJAAAASQAAAEkAAABJAAAASQAA - AEkAAABJAAAASQAAAEkAAABJAAAASQAAAEkAAABJAAAASQAAAEkAAABJAAAASQAAAEkAAABJAAAASQAA - AEkAAABJAAAASQAAAEkAAABJAAAASQAAAEkAAABJAAAASQAAAEkAAABJAAAASQAAAEkAAABJAAAASQAA - AEkAAABJAAAASQAAAEkAAABJAAAASQAAAEkAAABIAAAARwAAAEUAAABDAAAAQAAAADwAAAA4AAAAMwAA - AC0AAAAoAAAAIgAAABwAAAAWAAAAEgAAAA0AAAAJAAAABQAAAAcAAAALAAAADQAAABIAAAAYAAAAIAAA - ACYAAAAtAAAANAAAADoAAABAAAAARgAAAEsAAABPAAAAUQAAAFQAAABWAAAAVwAAAFcAAABXAAAAVwAA - AFcAAABXAAAAVwAAAFcAAABXAAAAVwAAAFcAAABXAAAAVwAAAFcAAABXAAAAVwAAAFcAAABXAAAAVwAA - AFcAAABXAAAAVwAAAFcAAABXAAAAVwAAAFcAAABXAAAAVwAAAFcAAABXAAAAVwAAAFcAAABXAAAAVwAA - AFcAAABXAAAAVwAAAFcAAABXAAAAVwAAAFcAAABXAAAAVwAAAFcAAABXAAAAVwAAAFcAAABXAAAAVwAA - AFcAAABXAAAAVwAAAFcAAABXAAAAVwAAAFcAAABXAAAAVwAAAFcAAABXAAAAVwAAAFcAAABXAAAAVwAA - AFcAAABXAAAAVwAAAFcAAABXAAAAVwAAAFcAAABXAAAAVwAAAFcAAABXAAAAVwAAAFcAAABXAAAAVwAA - AFcAAABXAAAAVwAAAFcAAABXAAAAVwAAAFcAAABXAAAAVwAAAFcAAABXAAAAVwAAAFcAAABXAAAAVwAA - AFYAAABVAAAAUwAAAFAAAABOAAAASQAAAEQAAAA+AAAAOAAAADEAAAAqAAAAIwAAAB0AAAAWAAAAEAAA - AAsAAAAGAAAACAAAAA0AAAARAAAAFwAAAB8AAAAmAAAALgAAADcAAAA+AAAARgAAAEwAAABSAAAAVwAA - AFwAAABfAAAAYgAAAGMAAABkAAAAZQAAAGQAAABkAAAAZAAAAGQAAABkAAAAZAAAAGQAAABkAAAAZAAA - AGQAAABkAAAAZAAAAGQAAABkAAAAZAAAAGQAAABkAAAAZAAAAGQAAABkAAAAZAAAAGQAAABkAAAAZAAA - AGQAAABkAAAAZAAAAGQAAABkAAAAZAAAAGQAAABkAAAAZAAAAGQAAABkAAAAZAAAAGQAAABkAAAAZAAA - AGQAAABkAAAAZAAAAGQAAABkAAAAZAAAAGQAAABkAAAAZAAAAGQAAABkAAAAZAAAAGQAAABkAAAAZAAA - AGQAAABkAAAAZAAAAGQAAABkAAAAZAAAAGQAAABkAAAAZAAAAGQAAABkAAAAZAAAAGQAAABkAAAAZAAA - AGQAAABkAAAAZAAAAGQAAABkAAAAZAAAAGQAAABkAAAAZAAAAGQAAABkAAAAZAAAAGQAAABkAAAAZAAA - AGQAAABkAAAAZAAAAGQAAABkAAAAZAAAAGQAAABkAAAAYwAAAGMAAABhAAAAXgAAAFoAAABVAAAAUAAA - AEoAAABDAAAAOgAAADIAAAAqAAAAIwAAABwAAAAVAAAADgAAAAgAAAAKAAAAEAAAABUAAAAdAAAAJAAA - AC0AAAA2AAAAQAAAAEkAAABRAAAAWAAAAF4AAABkAAAAaQAAAGwAAABuAAAAcAAAAHEAAAByAAAAcQAA - AHEAAABxAAAAcQAAAHEAAABxAAAAcQAAAHEAAABxAAAAcQAAAHEAAABxAAAAcQAAAHEAAABxAAAAcQAA - AHEAAABxAAAAcQAAAHEAAABxAAAAcQAAAHEAAABxAAAAcQAAAHEAAABxAAAAcQAAAHEAAABxAAAAcQAA - AHEAAABxAAAAcQAAAHEAAABxAAAAcQAAAHEAAABxAAAAcQAAAHEAAABxAAAAcQAAAHEAAABxAAAAcQAA - AHEAAABxAAAAcQAAAHEAAABxAAAAcQAAAHEAAABxAAAAcQAAAHEAAABxAAAAcQAAAHEAAABxAAAAcQAA - AHEAAABxAAAAcQAAAHEAAABxAAAAcQAAAHEAAABxAAAAcQAAAHEAAABxAAAAcQAAAHEAAABxAAAAcQAA - AHEAAABxAAAAcQAAAHEAAABxAAAAcQAAAHEAAABxAAAAcQAAAHEAAABxAAAAcQAAAHEAAABxAAAAcQAA - AHEAAABwAAAAbwAAAG4AAABqAAAAZwAAAGIAAABcAAAAVQAAAE4AAABFAAAAPAAAADIAAAApAAAAIAAA - ABoAAAASAAAACQAAAA0AAAATAAAAGQAAACEAAAArAAAANQAAAD8AAABJAAAAUwAAAFwAAABlAAAAawAA - AHEAAAB2AAAAeQAAAHsAAAB9AAAAfwAAAH8AAAB+AAAAfwAAAH8AAAB/AAAAfwAAAH8AAAB/AAAAfwAA - AH8AAAB/AAAAfwAAAH8AAAB/AAAAfwAAAH8AAAB/AAAAfwAAAH8AAAB/AAAAfwAAAH8AAAB/AAAAfwAA - AH8AAAB/AAAAfwAAAH8AAAB/AAAAfwAAAH8AAAB/AAAAfwAAAH8AAAB/AAAAfwAAAH8AAAB/AAAAfwAA - AH8AAAB/AAAAfwAAAH8AAAB/AAAAfwAAAH8AAAB/AAAAfwAAAH8AAAB/AAAAfwAAAH8AAAB/AAAAfwAA - AH8AAAB/AAAAfwAAAH8AAAB/AAAAfwAAAH8AAAB/AAAAfwAAAH8AAAB/AAAAfwAAAH8AAAB/AAAAfwAA - AH8AAAB/AAAAfwAAAH8AAAB/AAAAfwAAAH8AAAB/AAAAfwAAAH8AAAB/AAAAfwAAAH8AAAB/AAAAfwAA - AH8AAAB/AAAAfwAAAH8AAAB/AAAAfwAAAH8AAAB/AAAAfwAAAH0AAAB8AAAAfAAAAHcAAAB0AAAAbQAA - AGcAAABgAAAAWAAAAE8AAABFAAAAOgAAADAAAAAmAAAAHgAAABUAAAALAAAADwAAABYAAAAeAAAAJgAA - ADAAAAA8AAAASAAAAFQAAABeAAAAagAAAHQAAAB8AAAAgwAAAIcAAACLAAAAjAAAAI0AAACOAAAAjgAA - AI4AAACOAAAAjgAAAI4AAACOAAAAjgAAAI4AAACOAAAAjgAAAI4AAACOAAAAjgAAAI4AAACOAAAAjgAA - AI4AAACOAAAAjgAAAI4AAACOAAAAjgAAAI4AAACOAAAAjgAAAI4AAACOAAAAjgAAAI4AAACOAAAAjgAA - AI4AAACOAAAAjgAAAI4AAACOAAAAjgAAAI4AAACOAAAAjgAAAI4AAACOAAAAjgAAAI4AAACOAAAAjgAA - AI4AAACOAAAAjgAAAI4AAACOAAAAjgAAAI4AAACOAAAAjgAAAI4AAACOAAAAjgAAAI4AAACOAAAAjgAA - AI4AAACOAAAAjgAAAI4AAACOAAAAjgAAAI4AAACOAAAAjgAAAI4AAACOAAAAjgAAAI4AAACOAAAAjgAA - AI4AAACOAAAAjgAAAI4AAACOAAAAjgAAAI4AAACOAAAAjgAAAI4AAACOAAAAjgAAAI4AAACOAAAAjgAA - AI4AAACOAAAAjQAAAI0AAACLAAAAhwAAAIEAAAB6AAAAcgAAAGoAAABiAAAAWAAAAE0AAABCAAAANwAA - ACwAAAAiAAAAGQAAAA0AAAARAAAAGQAAACEAAAAqAAAANQAAAEIAAABPAAAAXgAAAG0AAAB8AAAAkAAA - AKAAAACkAAAAqAAAAKoAAACrAAAArAAAAK0AAACtAAAArQAAAK0AAACtAAAArQAAAK0AAACtAAAArQAA - AK0AAACtAAAArQAAAK0AAACtAAAArQAAAK0AAACtAAAArQAAAK0AAACtAAAArQAAAK0AAACtAAAArQAA - AK0AAACtAAAArQAAAK0AAACtAAAArQAAAK0AAACtAAAArQAAAK0AAACtAAAArQAAAK0AAACtAAAArQAA - AK0AAACtAAAArQAAAK0AAACtAAAArQAAAK0AAACtAAAArQAAAK0AAACtAAAArQAAAK0AAACtAAAArQAA - AK0AAACtAAAArQAAAK0AAACtAAAArQAAAK0AAACtAAAArQAAAK0AAACtAAAArQAAAK0AAACtAAAArQAA - AK0AAACtAAAArQAAAK0AAACtAAAArQAAAK0AAACtAAAArQAAAK0AAACtAAAArQAAAK0AAACtAAAArQAA - AK0AAACtAAAArQAAAK0AAACtAAAArQAAAK0AAACtAAAArQAAAK0AAACsAAAAqwAAAKoAAAChAAAAlAAA - AIgAAAB9AAAAcwAAAGoAAABgAAAAVQAAAEkAAAA9AAAAMQAAACYAAAAdAAAADwAAABQAAAAbAAAAJQAA - AC4AAAA5AAAARwAAAFcAAABpAAAAgwAAALMMDAzWTk5O8FxcXOxZWVjrWVlY61lZWetaWVnrWllZ61pZ - WetbWlrrWlpa61paWutaWlrrW1pa61paW+taW1vrW1tb61tbW+tbW1vrW1tb61tbW+tbW1vqW1tb6ltb - W+pcW1zqXFtb6lxbW+pcW1vqXFtb6lxbW+pcW1vqXFtb6lxcXOpcXFzqXFxc6lxbW+pcW1vqW1tb6ltb - W+pbW1vqW1tb6lpaW+paWlrqWlpa6lpaWupaWlrqWlpa6lpaWupZWVrqWlla6lpZWepaWlrqWlpa6lpb - WutaW1rrWlta61pbWutaWlrrWlpa61taWutaWlrrWlpa61paWutaWlrrWlpa61paWutaWlrrWlpa61pa - WutaWlrrWlpa61paWutaWlnqWlpZ6lpZWepaWVnqWllZ6lpZWepaWVnqWllZ6lpaWepaWlnqWVlZ61pa - WepaWlnrWlpZ6lpaWupaWlrqWlpa6ltaWupbWlvqWlpa6lpaWupaWlrqWlpa6ltaWupaWlrqWlpa6lpa - WepaWlnqWlpZ6lpaWepbW1vrVFRU7RcXFuEAAADEAAAAngAAAIMAAAB4AAAAcgAAAGYAAABbAAAATwAA - AEMAAAA2AAAAKwAAACEAAAAQAAAAFgAAAB8AAAAoAAAAMgAAAEAAAABRAAAAZQAAAIEAAADLWVlY8ZmY - lc/HwburzsfBp8rGvafKxL2oycO7psbAuaXFvrilxL62pMO+taPBurKjvbiwo7+4r6G9tq6iu7Wtoby0 - rKG6s6yhubOrobeyqqG3s6qgt7KpoLeyqZ62saietK+mnrKupJ6zrqWes66lnrOupZ6zrqWes66lnrOt - pZ6zrKWesquknbKrpJ2yq6Sds6ylnrKspZ60raWdtK6lnbavp524saieurGpn7qzq5+7ta2fvLevnr63 - sZ/AubGfwbqxn8K6sp/FvbSew7yzoMS+tZ/EvrSfxL+1oMS/taHEv7WhxL+1ocW/tqLFv7aixsC4ocfA - uaHHwLmhx8C5ocfAuaHHwLmhyMG5ocjBuaHIwbmhyMG5ocjBuaHIwrqiycK6osnCuaDJwrmhycO7ocnD - u6HJw7uhycO7ocnDu6HJw7uhycK6ocnCuqHKw7uhycK7ocjCuqHHw7mgxsG4oMa+tqDEvbagxLy0nsO7 - sp7BurGew7yznsK7s5/EvLSfxb21nsW+tZ/Gv7igxsC5oMjDuqLJwrqiycO7os3GvqPIw7uloZ6cxWZl - ZO0JCQjdAAAAogAAAIQAAAB7AAAAbQAAAGAAAABUAAAASAAAADsAAAAvAAAAIwAAABIAAAAYAAAAIQAA - ACoAAAA1AAAARAAAAFgAAAB7BQUExHBvbu/Lx8Ktpp2Qd3xxY2RxZVhjcmdZY3JnW2JzZlhhcGZXYW1h - VmBqYFFeZ1xMXmRZSl1hV0hdYVZFXGBURFtdUEFaW01AWlhNP1lXTT1ZVUs7WFJKOlhSSTlYU0g5V1FH - N1dORTRWS0IxVkxBMVZMQTFWTEExVkxBMVZMQTFWTD8xVkw/MVZLPTBWSjwvVUo9MFZMPzFWTEAxVU5B - MVVRQzNVUkU0VVVIOVZZSztWWk09VltPQVdfU0VXYlVIV2NXSFdmWUlXaFpKV2pdTlhqX05YaWBPWGlf - TlhqYE9YamBPWWpgT1lrYVFZbGFSWmxhUlpuYVVabmFVWm9iVlpvYlZab2JWWnBjVlpyZVZacmVWWnJl - VlpyZVZacmVWWnNmV1xzZ1hcdGdYXHRnWF11altddWpbXXVqW111altddWpbXXVqW110aVtddmlaXXZq - Wlx1aVtddGdZXG9lV1twZFRabGBSWmpeUVlqXU1XZ1xMV2lcS1dpXUxXZltMWGleTlhrX09YbWFRWm1i - VFpvZFdbcmVYXHBkVltwZFdccGNVXHNpWluflIdszcfCn4WEg+kODg3XAAAAnQAAAIMAAABzAAAAZgAA - AFkAAABLAAAAPQAAADIAAAAmAAAAFAAAABoAAAAjAAAALQAAADkAAABJAAAAYQAAAI8cGxrmz83JwI2E - eG2Bd2ptioB1dJGIfHeUiYF5l46EepmQh3yakYh8mZKIe5aPhXuUjIJ6k4uAepGJf3mPiH14kId7d46E - e3aLgnh2ioN5doqDeHWKgnd0h4B1dISAdXSFgHV0hn90c4N8cXODe3FygnpvcoJ6b3KCem9ygnpvcoJ5 - b3KCd29ygndvcoJ3b3J/d21ygHducoJ3b3KDem9xhXxwcYZ8cXGGfXJyiYB1couCd3KMhHhyjYZ7c4+G - fXOSiX9zk4p/c5WMgHOWjYF0lo2CdJaPhHSWj4N0lo+EdJeQhXWXkIV1l5GFdpiRhnaYkYd2mZGIdpqR - iHaakIh2mpCIdpqQiHaakIh2m5GIdpySiHackoh2nJKIdpySiHackoh2nZOJd52UiXedlYl4nZWJeJ2W - i3idlot4nZaLeJ2Wi3idlot4nZaLeJ+YjXiflot4npaLeJ2Ui3iblIl3mpKIdpmQh3aYj4d2mJCEdJWN - gnSTjIJ0l4+EdJWNg3WVjoN1mJCEdZmRhXaakId2mpOId5qRiHaZj4Z1lIyCdJKJfnKLg3hvh3xwbH91 - Z2eCeGxi1NDLrjY1NOoAAAC0AAAAjAAAAHgAAABpAAAAXQAAAE4AAABAAAAANQAAACgAAAAUAAAAGQAA - ACMAAAAuAAAAOgAAAE0AAABkAAAAt4OCgeKupp+JiX9zcpGJf3iZk4d8o5yTg6qknYmwqqOMtK2nkLaw - qpK4sauTt7GqkrWvqZK0r6iRs62nkbOspY+xrKSPsaqkjq+po46vqqKOrqmija6poYyuqaGMrKigjKuo - oIyrqKCMq6Wdi6qlnYqqpZ2KqaOciqmjnIqpopyKqaKciqminIqpopyKqaKciqmjnIupo5yLqaKciqqk - nYqtpp6Kraaeiq6noIqvqaGKr6uii7GspIuzrKaLs66ni7Wvp4u3sKmLuLGqi7ewqYy3sKmMt7KrjLey - qoy3sqqMt7Krjbeyq423squNt7KrjbiyrI24sqyNuLKsjbmzrY65s62OubOtjrmzrY66tK2OurStjrq0 - rY66tK2OurStjru0rY67ta2PurWtj7q1rY+6ta6PurWuj7q1ro+6ta6PurWuj7q1ro+8t6+PvLWuj7y2 - ro+7ta6PubStj7m0rY65s6yOuLKsjbiyqoy4squMtbCpjLewqYu1samMtrCpjLeyq4y4sauNubOtjrq0 - rY64sauOtrGqjLOtpYmuqKCFpqCXgJ2Ui3mUjIF0joR5cIF3bGmknZR4lpST1wcHB8wAAACRAAAAfgAA - AGwAAABfAAAAUAAAAEIAAAA2AAAAKgAAABYAAAAcAAAAJQAAAC8AAAA8AAAAUAAAAGkAAADJ0tHP2pWM - g3eWjIJ6nZWNgKijm4m+saqOzLy2l9PFv6HZy8Wm3M/Kq97RzK3dz8ut3c/KrNzPyqvczsmr287JqtvN - yarazcep2s7IqdnMyKnZzMep2MzGqNjMxqjYzMan18vGp9XKxafVysWn1srFp9XKxabVysWm1MnEptTI - xKbUyMSm1MjEptPIxKbTyMSm08nEp9PJxKfUycWn1srFptbKxabWysam18vHptfMyKbXzcmn2M7Jp9nO - yqfZzsqn2c/Kp9vRy6fb0Mun2tDLp9rQzKfa0cyn2tHMqNrQzKjZ0M2o2dDNqNnQzKjZ0Myo2tDNqNrQ - zajZ0M6o2tDOqdrQzqna0M6p2tDPqdrRz6nZ0c+p2dHPqdnRz6nZ0c+p2NDOqdnRzqrZ0c6q2NHOqtjR - zqrY0c6q19HOqtfRzarX0c2q1tLOqtXRzarW0c2q1dHMqtTQzKnU0cyq1NDLqdTPzKnTz8uo08/KqNLO - yqjTz8qn0s7Jp9LOyqjTz8qn0s7KqNPQy6jU0cyp1NDNqtPPzajPzMqky8fFnsO/vpa5s7GLrqehhqOa - kXyXjoR2jIR5cYqBdWvf29jHExIS2gAAAJUAAACAAAAAbgAAAGAAAABSAAAARAAAADgAAAArAAAAFgAA - ABsAAAAlAAAAMAAAAD0AAABUAAAAbAAAAMjT0c/fnZOJe52Vi3+qo5yJvbStk6TJyrqi1NbKq9rc0LDf - 4dey4eTasuLl3LHh49yx4OTcseDj27Lg49uw4eLcseDi27Hg49uy4OLbsuDi2rLg4dqy4OHas+Di2rTh - 4dq04OHateDg2rXg4dq24OHatuDg2bbg4Nm24eDZtt/f2bfg39m44N/ZueDf2brg39q54N7auuDe2rrh - 39m74d/ZvOHf2b3h4Nm+4uHZveLh2sDj4trB5OLawuXj2sPl5NrF5eTaxubk2sbl49rG5eTaxuXi2sbl - 4trG5eHax+Xh2sjm4trJ5eLayuXi2srm4trM5uHazObh2s3n4NrO59/azuff2s7o39rQ6d/a0erf2tHr - 39rT697a0+ze2tXt3trX7d/b1+7g29nu4dvb7uLb3e7i293u4tve7uPb4e7j2+Xu5dvp7ufb7O7n2+7v - 6tvw7urb7+7s2+/u7Nvv7uza7u3s2u7t7Nrv7eza7u3s2u/t7Nru7eza7+7t2u3u7tru7e7a7+7w2u/t - 7tvw7uvb7u3l2uzr3Nbp59TR5ePKy93bv8LCvbWYsKuhh6GakXyVjIF1jYV6bt7d2swTExLaAAAAmAAA - AIEAAABvAAAAYQAAAFMAAABFAAAAOQAAACwAAAAXAAAAHAAAACYAAAAxAAAAPgAAAFQAAABtAAAAydTS - 0d+hmZCAp5+XhbeyqpLTxL+fW9vm9jjg7f8/3ur/P97r/z/c6f8+2+f/Pdvn/z7b6P8+2+j/Qdzm/0Hc - 5v9B3Ob/Qtvm/0Pc5v9E3OX/Rtzk/0je5f9L3uX/TN/k/03f5P9Q3+T/Ud7k/1Hf4v9T3+P/VeDi/1bg - 4f9Y4OH/WuHh/1zh4P9e4eH/X+Hf/17h3/9g4d7/YuLe/2Pi3v9l4t7/Z+Te/2nj3v9q497/bebe/3Hm - 4P9y59//defh/3nn4v976OL/fOnj/37p4/+B6eP/guni/4Lq4f+G6+H/iezg/4rs3v+M7N//j+3e/5Pv - 3v+V8d//mPPe/5r13f+c9t3/nvjd/6L73P+k/Nv/qf3b/67+2/+w/9v/s//a/7X/2/+3/9v/vP/d/8T/ - 4P/N/+T/1v/n/9//7v/o//T/8P/3//f/+v/8//v////+//////////////////////////////////// - ///////////////////////////9////9v////D////n////2////87////C////t////67///+q/9PQ - xKy9ubOSraWdhJqTiXmRiX1w4N3azBMSEtoAAACYAAAAggAAAHAAAABiAAAAVAAAAEYAAAA6AAAALAAA - ABcAAAAcAAAAJgAAADEAAAA+AAAAVAAAAG0AAADJ1NPR36WfloOspZ6KwLu0mt3Qy6xm2+LyQdvk/0bb - 4/9F2uP/Rtni/0fa4f9H2uH/SNvi/0nb4v9K2+D/S9vh/0vb3/9M29//Tdvf/03b3v9P3N3/Utze/1Pd - 3f9U3d3/Vt7d/1fe3P9X3dz/WN7b/1zf2v9e4Nn/YN/Z/2Dg2v9f39n/YN/X/2Hf1v9g4Nb/YuDW/2Th - 1f9m4dX/Z+LU/2rh0/9s4tP/beLT/27j0v9w5ND/ceXQ/3Ll0f9059D/debS/3jo1P976tX/f+zX/4Ts - 2f+F7tv/ifDc/43w3f+R8t7/kvXf/5P23/+W997/mvne/5z83v+f/d7/o/3g/6f+4f+r/+L/rf/j/6// - 4v+z/+P/uP/j/7z/5P/C/+b/yf7m/9L+6f/b/uv/5v7w/+/+9P/3/vn//P/9//////////////////// - ///////////////+///7/v//+P78//r+/v///v/////7///+8f/8/uf/+v7d//j+1P/2/sv/8/6//+/+ - tP/s/6z/7P+m/+z+o//s/6H/6f+j/+r/n//n/53/2tnOuMfCvpyzr6aKoJmPfJSMgnLg3dvNExIS2gAA - AJgAAACDAAAAcQAAAGMAAABUAAAARgAAADoAAAAtAAAAFwAAABwAAAAmAAAAMQAAAD4AAABUAAAAbgAA - AMnU09Hfp6CYhbGro47FwLuf5djUtWLa3/Q62N7/Qdjd/0HY3f9B2dz/Q9na/0PZ2/9E2dv/Rdna/0Xa - 2f9H2tj/R9nY/0ja2P9I2tj/SNrY/0ra1v9L29X/TNvV/03c1f9Q3NX/UtzV/1Td1P9U3dP/Vd7S/1bd - 0f9W3dD/V97P/1fezv9Y3s3/Wd7M/1nezP9c3sv/Xd/K/1/fyv9h4Mn/Y+DJ/2Liyf9j48j/ZuTI/2jm - x/9p5sj/a+bI/2zox/9u6cf/cOrI/3HsyP9178f/d/DI/3nyyf999cv/gvjO/4f60f+L/df/k//a/5n/ - 3v+d/+L/o//k/6j/5P+t/uT/tP/k/7r+5f/B/uj/yv3t/9T+8v/d/vb/6f74//P++v/5//z/+//9//3/ - /v///////////////////////////////v////v////6////+f////b/+/3y/+v87v/g/ez/3v3p/9f8 - 4//i/d//6f3Q/+P+u//f/63/2P+k/9L/nf/N/5j/zv2V/8/9kv/Q/Y//0PyN/9P8jP/V+pD/wPac/6T3 - pv/Z3tbBzsnFo7mzrI+lnpR+mI+GdOHd3M0TEhLaAAAAmQAAAIMAAABxAAAAYwAAAFUAAABHAAAAOgAA - AC0AAAAXAAAAHAAAACYAAAAyAAAAPgAAAFQAAABuAAAAydTT0eCqpJqGs66okcnFwKXq3Nm7bN/l9UXd - 5f9M3eX/Td3l/0zd4v9L297/SNvc/0Xa2f9F2dj/RNrV/0PZ0v9E2dL/RdnR/0TY0P9F2ND/RtnP/0na - zv9M3M//TtzP/1Hbzv9Q3Mz/TtvK/07Zyf9P2sn/UNrH/1Dbxv9S28X/VNvF/1XcxP9V3MT/Vt3E/1je - xP9Y3sP/Wd/C/1vhwv9c4sL/X+LB/2Dlwf9j5sD/ZebB/2Xowv9n6sH/aevC/2ruwf9s8cH/bvPC/3D2 - w/9y+cT/dvzE/3n+xv99/8j/gf/I/4f+zP+Q/s//mv7W/6v+3/+8/ur/yv3y/9b+9v/e/vn/5v77/+r+ - /P/t/v7/7P7///H////4///////////////////////////////////////+//3/+f/5//T/9P7n/+z/ - 2f/l/s7/3v/F/9D+wf+5+8L/ofrD/5n8xf+X+8b/l/rF/577yf+j+83/pvvH/7D9uv+8/af/yPyb/8v7 - lv/K+ZL/yfiP/8v2jP/S94//2viS/+T6kv/c+ZX/rfKe/93i2sfSzcqovbexkqihmICakYh14N3bzhMS - EtoAAACZAAAAgwAAAHEAAABjAAAAVQAAAEcAAAA6AAAALQAAABcAAAAdAAAAJwAAADIAAAA+AAAAVAAA - AG4AAADJ1NPR4KulnIa2sauSzMfEqO/h3sFc19n2MdLU/zjS1P850tT/OtPT/znS0f850dH/OdLP/znR - zf860sz/O9LM/zrSyv870cr/PNHJ/z3Syf8+0cf/PtHG/0LRxv9D0cX/QdDD/0HSwf9B0sH/RNLA/0XR - wP9G0sD/RtO//0bUvv9J1L3/Sta+/0zVvf9O1rz/Tti7/07Xu/9P2bz/Udu7/1Ldu/9V3br/VuG7/1jj - u/9Z5rv/Wum8/1ztvP9e8b7/YvW+/2X5v/9p/MH/b/3G/3X+yf98/s3/h/7U/5X93f+g/eT/p/3p/639 - 6f+z/ev/t/7s/7j+7v+z/e3/s/7r/7b+7v+9/vT/y/73/9z+/P/w////+//8//r/+//2/vf/7/7x/+b+ - 6f/e/uL/2P7f/9L/3f/P/tb/y/7N/8n/x/+//sD/r/26/6n9tv+j+7H/gfmx/2z4sv9o97P/aPi2/2j4 - tv9v+Lj/ffq//376wP97+8P/hfvL/4j6yP+k+r7/w/iy/9j5qP/d+Z7/2/eV/9r1j//U9IT/z/B5/83t - cP++5G7/4uTazdTQzqzAu7SVqqOagpyTinbh3tzPExIS2gAAAJkAAACDAAAAcQAAAGMAAABVAAAARwAA - ADoAAAAtAAAAFwAAAB0AAAAnAAAAMgAAAD4AAABUAAAAbgAAAMnU09HgrqafiLizrJPNycap8OLfwlPU - 2fYlzNT/Lc3T/y3O0/8tzdH/LczQ/yzN0P8uztD/Ls7P/y/Nz/8wzM7/MM7M/zHMyv8wzMr/MM3I/zPM - x/8zzcf/Nc3H/zfOxv84zsX/Oc/F/zvPxf860MP/O9DD/zvQw/880MH/PNLA/z/Tv/9A1MD/Q9XA/0bW - v/9G2MD/R9nA/0fbwf9J38H/S+LB/03mv/9N6sH/Uu3D/1jxxf9f9Mn/Z/fM/2z50P90+tb/gPzc/4v+ - 4/+R/ej/kv3s/5T98P+Y/fL/mv3x/5f+7/+S/+r/jf/i/47/3v+P/97/lf/f/6L+5P+x/un/wP7t/8z+ - 8f/U/u7/1v7o/9H+3v/I/tP/vv/N/7b/x/+x/8T/rv+//67/uf+h/7b/i/+0/4T+sv+B/rH/g/2u/3/8 - r/9w+bD/Zfex/2Hyr/9c8K7/WfGx/2bzuP9t9bv/bve7/3j6vv9++8H/fvq+/4H7wf+S+8j/kvvM/5j7 - 1f+b/dT/qP3E/7T4o/+864X/u990/7bZbf+z1mr/sNFl/6/LX//j5NnO19PQrsG8tZasppyDnpWNd+Lf - 3M4TEhLaAAAAmQAAAIMAAABxAAAAYwAAAFUAAABHAAAAOgAAAC0AAAAXAAAAHAAAACYAAAAyAAAAPgAA - AFQAAABuAAAAydTT0uGtp6CKubSulc7Lxqrw4t/DVtbd9ijQ1/8v0Nf/L9DW/y/Q1v8x0dX/MdLU/zLR - 1P8y0NT/MtDT/zLR0P8z0tD/NNHP/zXSz/83087/OdTO/zrUz/881c7/PNXN/z3Wzf881sz/P9fL/z/W - yv9A2Mv/QdnL/0Payf9F3cr/R97K/0jhyv9I5Mv/SOfK/0nry/9N7s7/UvDP/1n10v9h+tf/afzb/3H9 - 4/97/ej/hP/u/4v/8/+N//b/jf/3/47/+P+Q//j/jv73/4j/8f+F/uz/gf/l/3//4f+B/tv/hP/Z/4z/ - 3v+X/+T/pv/t/7f+8//F/fb/0P3z/8/+6v/I/t7/vv/V/7P/yv+m/77/mv+0/5T/rv+S/6j/kP6k/5H8 - oP+S+p7/lfed/5b0nP+U8pz/kPGc/43vnv+G7Z//gOyf/37qof9566T/de2o/3jxsf+A9bn/jvXC/5n3 - yf+c+cz/qfrQ/6H7zP+S/Mf/lPrK/4/6yf+J+sT/lPrB/5b5vP+X+Lr/mfe3/5vyp/+k5pD/rtV6/7LL - b/+xym//rshr/+Tk2s7X1NCuwby2lq6mnoWgl4944+HdzxMTEtoAAACZAAAAgwAAAHEAAABjAAAAVQAA - AEcAAAA6AAAALQAAABcAAAAcAAAAJgAAADEAAAA+AAAAVAAAAG0AAADI1dPS4bCpoYq5s66VzsvHqvHk - 4MNW1dn3J87T/y/P1P8vztP/L8/S/zHP0v8x0ND/MdDQ/zLQ0P800dD/NdLP/zbUzv821M7/N9TO/znU - zv861c7/OtXN/zvWzP871sz/PNfN/z3Xzf9A2sz/QdzL/0Lezf9D38z/ReLL/0bmy/9I6M3/TuvS/1Tw - 1v9c9Nr/ZPfh/2r56P9z++3/e/vy/3z98/97/fX/fP30/3v98/96/fH/eP3t/3f96P90/eT/dP3e/3L+ - 2v9x/9b/c//R/3j+0P98/tH/gv/Z/4/+4f+d/uj/qP7r/7P96v+1/eT/sP7a/6j+z/+g/8b/l/+8/47/ - sv+K/6r/if2n/4j7pP+I96D/h/Sb/4jvl/+H7ZX/h+mR/4fnjv+F44z/huCJ/4jehf+J24P/kNuD/5je - h/+g5Iv/qOqO/6/wkv+39Zn/tveb/67zmP+q7Jv/seql/7brsv+x7bL/rfC2/6/0vv+w98L/qfe7/6P1 - sf+i9Kv/mvWi/5z0n/+e86L/m/Wn/5r0pv+c65X/nth+/6DEav+lu2P/4+Paz9jU0a/DvreYrqighaKa - kHnj4N3PExIS2gAAAJkAAACDAAAAcQAAAGMAAABVAAAARwAAADoAAAAtAAAAFwAAABwAAAAmAAAAMQAA - AD4AAABUAAAAbQAAAMjU09LhsKqii7u1r5bOy8ir8ePhxFXU1vcnzdD/L87R/y/P0f8w0ND/M9DR/zPS - z/8z0tD/NNPQ/zPTzv810s3/NNPN/zbUzf821M3/ONbN/zrVzf87183/O9jM/zzZzP89283/P97M/0Lg - z/9G49D/TOfT/1Pr2P9a7t7/XvLk/2L16v9q+O//bvrx/2778f9r/PD/aPzt/2f96f9n/OT/Zvzg/2X9 - 3f9k/dj/ZP3V/2T90v9l/s7/af7K/2v+yP9s/sf/b/7I/3T+zP98/tH/h/7Y/5H+3v+a/+L/nf7d/5n/ - 0v+T/sX/iv66/4X9s/+D/K//gfqp/3/3pP9/86L/fvCe/4Dsmv+B6Zb/gOaS/4DikP+A343/gNyM/4Da - iv+A2Ij/gtiF/4bZhf+O3of/l+SK/57qjP+k747/qfKQ/6fxjP+i7ob/n+iD/53jgP+a3Hv/mth3/5nV - df+a0XL/mdBz/5rPcv+gznb/rNR+/7bdhP+85Yj/wO2M/77wkf+w8ZH/pu+Q/57ujv+c7o7/ou6Y/6Tx - m/+n8Jf/ouaI/5rOcP/i5NrO19TRr8S/uZmwqaKHopuSe+Ti3c8TEhLaAAAAmQAAAIMAAABxAAAAYwAA - AFUAAABHAAAAOgAAAC0AAAAXAAAAHAAAACYAAAAxAAAAPgAAAFQAAABtAAAAyNTS0uKzrKOLu7awl9DM - yKvx4+DEVtXW9ynP0f8w0NL/MdHS/zHT0P8z0tD/M9LO/zPSzf8z0s7/MtTN/zTTzv811c//N9fP/znY - zv872s7/PNvR/z7d0/9C4dX/SeXZ/1Dp3f9V7uP/V/Hn/1316/9h9+//Yfru/1/66/9c+ej/Wvrj/1n5 - 3f9Y+dj/VvjV/1f50f9X+M7/WvjL/1v3yf9c9sb/XfXD/171wv9g9sH/Y/nB/2b8wf9r/sT/cP/H/3r/ - zv+C/9f/if7Y/4z+1f+L/Mz/gvu9/3z5sv9396z/dPWm/3Pxov9z7Z7/deqc/3jom/975Zj/fOGW/3re - k/9424//eteN/3jWif971ob/fNWG/37WhP+D2IT/i96J/5Pki/+Z6oz/n+6O/6Lvjf+e7Ir/l+aG/5Xg - gP+R23z/j9Z4/5DRd/+Qz3X/kMxz/5DKcf+Rx23/kcZq/5HDaP+TwWX/l8Bh/5m/Wv+bvlP/m71Q/52+ - U/+kwl3/q81q/7XZdP+6437/teh+/6voef+n6Xv/pumD/6zskv+y75v/r++a/+Tn38/X1NGwxL65mbCq - o4ilnpN85OLe0BMSEdoAAACZAAAAgwAAAHEAAABjAAAAVQAAAEcAAAA6AAAALQAAABcAAAAcAAAAJgAA - ADEAAAA+AAAAVAAAAG0AAADI1dPS4rOtpIy9ubGX0M3IrPHj4cVZ19j3KtHQ/zHSz/8v0s7/MNLN/zHT - zv8x083/NNTO/zbVz/8419H/O9rT/z7f1/9D5Nv/SOjg/03s5f9R7uj/UvLr/1T17f9W9+3/Vvbr/1H1 - 5/9Q9OH/TPPZ/0zx1f9L79D/S+7M/07syP9P7Mb/UerD/1Lqwv9T6cH/U+m//1Xovv9V57v/V+m6/1nr - uf9d77r/YvW//2j5xP9v/cr/d/7Q/33+0v+B/c7/gfrK/3v2v/9086//be6l/2rpoP9q5J3/a+Gb/2vf - mP9t3ZT/bduS/27Zkf9x15D/c9WP/3TTjf9304r/eNGI/3nSh/981Yb/gtiG/4veiP+S5Yv/lOqK/5fs - i/+Y7In/lOmG/47ggv+J13z/htJ4/4jOdf+IzHT/iclx/4rGb/+Kxm3/i8Nr/4vCav+NwGn/jL1o/427 - Zv+QumP/krpe/5e5Vv+cuVD/mrlO/5e6Tv+WuVL/k7ZV/5G1VP+Ss1P/lbRU/6C8XP+tyGT/t9Rp/7rc - a/+1327/suB5/7Lkjv+565//5efgz9jU0bDEv7qasquliKefln3j4d7QExIR2gAAAJkAAACDAAAAcQAA - AGMAAABVAAAARwAAADoAAAAtAAAAFwAAABwAAAAmAAAAMQAAAD4AAABUAAAAbQAAAMjV09LitK2mjL23 - spjRzcmt8uTixVbX1fcp0c3/M9PP/zTV0f8219P/OtrW/z3e2v9D4t7/R+bj/0rr6P9N7+z/UPPu/1H0 - 7v9Q9e3/TvHp/0vv4/9H7N3/Q+nV/0Hlz/9C5Mv/Q+HH/0bhxf9H38P/Sd7C/0ndwP9L3L//TNy+/03d - uv9O3bf/UNy3/1Hdtv9S37X/VeS2/1rruv9h8sH/Z/jH/2/7y/91/dD/dvvN/3f2xv9z8r3/be2w/2jo - pf9k4p//ZN2c/2Xamf9l2Jf/aNeU/2nVk/9p05D/adKN/2fQif9pzYb/acuF/23Nh/930Yj/fNWL/4Pa - jP+K4Y7/j+aN/5Dojf+S6Yv/keeI/4zhgv+G233/gdN6/3/Mdv+ByHP/gsZx/4PEb/+ExG7/hMJr/4PA - av+EvWj/hLxl/4a6Zf+Gt2P/h7di/4e1Yf+LtF//j7Ra/5W1Vf+Yt07/mLdI/5a3Sv+RtlD/j7ZT/5C2 - Vv+Ttlj/lbZY/5u2Wf+duFv/m7dZ/56zVv+jtVj/q7xa/7PFWf+4y1z/ts1i/7rUd//l5t7P2dXSscXA - vJuyraWJqKCWfeTi3tATEhHaAAAAmQAAAIMAAABxAAAAYwAAAFUAAABHAAAAOgAAAC0AAAAXAAAAHAAA - ACYAAAAxAAAAPgAAAFQAAABtAAAAyNXU0uK0raiOvreymdLOyq7x5OLGX9/d9zff3f9B5OH/Q+fk/0Lq - 5v9E6+j/RO3p/0Xu6f9G7OX/ROjg/0Pm2/9B4tb/P+HR/z/fzv8+38z/QN3J/0Daxv9A2cT/QdjB/0TW - v/9F1Lz/RdS7/0fTu/9J1Lr/SdS2/0vVtf9L1bT/TNex/07asf9U4Lb/Wui9/2DxxP9m98v/bPnO/3D4 - zv9u9MX/bO68/2jns/9i4af/YNye/13Ymf9f05b/YNOX/2LRlv9k0ZP/Y9CP/2XPjf9kzIr/ZMmI/2PH - hf9myYT/a86G/3XUh/972ov/g+KO/4zokf+M6JD/jOeP/43ki/+I3oT/gtZ+/33PeP95yXP/esZw/3vE - b/98wm3/fcFs/3++af9/vWf/f7tl/3+5ZP+At2P/gLdh/4G1YP+Ds17/g7Jd/4SwXf+Hslv/jLJX/5Oy - T/+Vtkn/lrdH/5G4Sf+Nt07/irZT/4u2WP+SuFr/lrpc/5q8Xv+evF//oL1d/6G9Xf+jvlz/p7xa/6e7 - WP+muVX/qrlU/6y3Uv+ttUz/tbVI/+bk2dDa1tSyx8G9nLStp4unoJh/5OLf0RMSEdoAAACZAAAAgwAA - AHEAAABjAAAAVQAAAEcAAAA6AAAALQAAABcAAAAcAAAAJgAAADEAAAA+AAAAVAAAAG0AAADI1tTT47Sw - qI++ubSZ0c3KrvDi4MZj6eb3N+jk/z7o4P895d3/O+HY/zrd0/852c7/ONfL/znWyP871sj/PdfJ/z/Y - yv8+2Mr/QdnJ/0DXxf8/0r7/QdC7/0DQuv9B0bn/RNG4/0TQtv9E0bT/RtC0/0fRs/9J0rD/TNaw/1Dd - tv9Y5r//X+/H/2X0zP9p9c7/afHH/2Xrvv9h47P/Xtur/1zWov9b0p3/WtCZ/1zOlf9ezJT/YMyT/1/K - kf9hy5D/YcmN/1/Hif9fx4b/ZMiF/2nMh/9v1In/dNuL/33ijf+C55H/gOaO/4Hjif+C3oj/gdqG/3/V - gv9/0H//f8t6/3zIdf97xXL/esFu/3i/av95vmj/erxm/3q7ZP96uGP/fLdh/3y2X/9+tF7/frNd/3+y - Xf+BsFv/gbBa/4OwWv+GsFn/i7JU/5G0Tv+Vtkf/k7lF/4+8SP+JvFL/ibxZ/429YP+SwWT/mMRl/57F - Zv+ix2b/o8Zl/6LDYf+iwV3/o75a/6O9WP+kulb/pLhT/6S2UP+mtE7/qLRL/6mySv+ssUX/5eTa0NnX - 1LLGwr2dtq6ojKmimYDk4uDRExIR2gAAAJkAAACDAAAAcQAAAGMAAABVAAAARwAAADoAAAAtAAAAFwAA - ABwAAAAmAAAAMQAAAD4AAABUAAAAbQAAAMjW1NPjtbCqj7+6tJrRzcqv8eTjx13c1Pcw1Mv/ONLK/zfR - x/840cf/N9HG/zjRxP850MX/OtLF/z3SxP88z8H/PM28/zzKuf89yrr/QM27/0HPvP9Bz7v/Qc65/0HO - tv9CzbP/Rc2w/0bPsP9J1LL/T926/1fmxP9d7cj/YvDM/2Lvyv9g6L//Xd+1/1rarP9X1ab/WNCi/1fN - nP9Xy5j/V8uX/1rJlf9cyJP/XceR/1/Gjv9exYz/YMSL/2LGiP9nzIr/bdON/3Tbjv954pH/feaS/3zm - jv944Iv/d9qG/3TTgP9xz3z/dM16/3bJef94yHr/fMd5/4HHd/+AxHT/fMJv/3q+a/94u2f/eLlj/3m3 - Yf96tWD/e7Rg/3y0Xv97s1z/fbJb/3+xWv+CsVn/g7FY/4OxV/+GsFf/i7NT/5C2Tv+Uu0n/k79K/43E - U/+Kxl7/i8Vn/5DGbP+Tx27/lshv/5jJbf+Zx2n/m8Rm/5vAZP+cv2D/nL9c/5+/WP+jv1b/psBW/6fD - U/+rw1L/rsJP/66/Tf+wvUn/r7tG/7C3Q//m5NnQ2tbVs8jEvp63saiMq6OagOTi4NETEhHaAAAAmQAA - AIMAAABxAAAAYwAAAFUAAABHAAAAOgAAAC0AAAAXAAAAHAAAACYAAAAxAAAAPgAAAFQAAABtAAAAyNbU - 0+O2sauQv7u0m9LOyq/y5uPHXdPM9y/Lw/81zcP/NszC/zbMwP80yr3/Nsi6/znEuP84xLb/Ose3/zzL - uv8/z7z/QM6+/0HQvv9Czrz/Qcu2/0HIsf9EyrD/RtCz/0nVuP9Q38D/VOjI/1rrzP9d68r/W+bD/1ff - t/9U163/VNKn/1TOpP9VyqD/VMme/1bInP9YyJn/VsaX/1fHk/9XxpH/WMaP/13Fjf9fx4z/Y8yN/2nT - kf9w25P/deGS/3rllf9545L/dN+L/3HYh/9w0oP/bs9//2/Le/9vyHf/bcZ0/3DDcv90w3L/dsNz/3rE - dP9/xXP/g8N0/4HCcP99vmr/e7tn/3q3Y/95tV//erVe/3u0Xf99tF3/f7Vb/3+1Wf+BtVj/g7ZZ/4e2 - WP+Lt1j/j7lW/5S9T/+Wwkz/lMhQ/4/NWv+Mz2r/itB1/4zNeP+Qy3X/k8p0/5XKcv+Xym//l8xp/5rM - Z/+ezmT/oM1i/6DKXv+hyFv/o8VX/6TBUv+kvU7/o7dL/6KxSf+iq0P/naQ+/5yeOv+cmTf/nJY2/+Th - 2dHc2dWzycS+nrexqo2rpZyB5OLg0hMSEdoAAACZAAAAgwAAAHEAAABjAAAAVQAAAEcAAAA6AAAALQAA - ABcAAAAcAAAAJgAAADEAAAA+AAAAVAAAAG0AAADI1tTT47axq5HBvLWc0s/Lr/Lm5Mdbzsb3LcO4/zXD - uf84wrj/NsK2/zbEtv84xbn/Oca3/zjHt/88yLj/Pci3/z3Fs/8/w7D/QMax/0HMt/9H1b7/TNzD/1Dk - yf9U6c7/VujN/1blx/9T3r7/T9ax/07OqP9PyqP/UMqi/1HIof9Tx5//U8ed/1PFmf9TxJf/VsOV/1jD - k/9bxZT/X8iU/2LNk/9o1ZX/bNyV/3Hglv9z5Jf/dOSU/3LekP9v1or/btCH/23Og/9tzH7/bsp7/2/H - ef9ux3b/b8V0/2/Ecf9vwW//cMBt/3XAbv93wW//fcNx/4TDb/+Gw2//hMFr/4G+Z/9/vWT/fbpg/326 - Xf9+vF7/grtc/4a8XP+Jv1z/i8Fc/4/CWv+SxFr/l8VY/5nJVv+ZzlP/ldNW/4/VZf+J13T/idd//4vW - gf+P1n7/k9V7/5LSdf+TzXD/kshq/5HCZv+PvmD/j7la/4+0Vf+Nq0//i6JK/4qcRv+KmEH/i5Q9/4uS - O/+MkTj/jpA3/5OPNf+UjzT/lZAz/5ePMv+YjjD/5OLZ0dzZ1bTJxL6euLOrjqylnYLk4uDTExIR2gAA - AJkAAACDAAAAcQAAAGMAAABVAAAARwAAADoAAAAtAAAAFwAAABwAAAAmAAAAMQAAAD4AAABUAAAAbQAA - AMjW1NPjtrGrksC8tp3T0Muw8+flx1vJwfcwv7T/N8K2/zXDtv82wrX/NsOz/zjBsv84wK//Ob+t/zu/ - rv8+xbT/Q9K+/0fZxP9M4cv/UOfS/1Hq0f9R5sz/UN/E/07Yuv9M0LD/SMmm/0jHo/9LxqL/TsWf/07F - nv9QxJz/UcGa/1HBmP9Vw5j/V8eY/1zMmf9h0Jv/aNef/27dn/9v4J7/ceOb/3LimP9v3pX/bdiP/2zT - iv9s0If/bM2C/23LgP9uyn7/b8l7/23Jev9vyHf/ccV0/3HFcv9xxG//csJt/3HAav9zv2n/eMFq/33E - bf+FxnH/jclx/47Lb/+Mymz/i8to/4nLZP+JzGL/is1h/4zNYv+R0GP/lNJi/5jRYP+b0GD/nNFc/5nV - W/+U2F7/jttk/4rabv+F1Xr/g9CC/4TLgP+GxHf/iL9t/4e4Zv+FsGD/gqdY/36hUP9+mkv/fpVH/32R - RP98j0D/f409/4GMPP+EjTn/h4w3/4iNNf+LjDX/jYwz/4+MMP+PjC7/kYot/5OLLf+UiSz/loks/5iJ - Kv/k4tnS3NrWtcnFv5+3squPr6ifgubj4tITEhHaAAAAmQAAAIMAAABxAAAAYwAAAFUAAABHAAAAOgAA - AC0AAAAXAAAAHAAAACYAAAAxAAAAPgAAAFQAAABtAAAAyNXU0+S3sayTwbu3nNPQzLDy5+XIXce/9zC9 - sP83v7H/N7+u/za9rv83vq7/OcGw/z3Jt/9C0b7/R9jE/0vgy/9P5M//TeLN/07hyP9O28P/S9S6/0jM - rv9Hx6X/SMek/0jGpf9JxqP/SsWg/0vDnP9OwZr/TsOb/1PHmv9YzZ7/XNKi/2TapP9q3qf/a+Gk/23i - o/9v4qD/cN+b/27alv9r15H/atKL/2nQif9rzof/bc6F/3DOgf9wzn//csx9/3LMef9yy3f/csp2/3PJ - cv9zxnH/dcdu/3THbP93yGv/e8tr/4DPa/+J023/kthx/5rcd/+h4Xz/oeF6/57gdP+a3m//ltxq/5PZ - Zv+U1WL/ltJe/5fQW/+Ry13/islf/4XLX/+Az17/fM5g/33HZP9/v2j/fbVs/32uZ/99qF7/f6NU/36d - Tv98mUj/e5VD/3qRP/97jjv/e445/3uMNv99jTP/f4wz/3+KMv+EiTD/hYgu/4WILf+Hhiv/iIYr/4uF - Kv+LhCr/jIQq/42EJ/+OhCf/j4Qn/5KEJ/+UhSf/lYUl/+Th2dLd2de1ysTAoLm0rI+wqaGE5uXi0hMS - EdkAAACZAAAAgwAAAHEAAABjAAAAVQAAAEcAAAA6AAAALQAAABcAAAAcAAAAJgAAADEAAAA+AAAAVAAA - AG0AAADI1dXT5LmzrZLBvLed1NHMsfLn5chcyLz3L7ys/ze/rv85xLL/Psu6/0LRwP9F1sX/SdvI/0nd - yf9J28P/SNe+/0rUu/9IzbT/Rser/0fGp/9IyKn/Ssqs/0rKqv9KyKb/Scah/0vDnf9Ox57/U82h/1fU - pf9e2qr/ZOCr/2Tiqv9o4qj/auKm/2zgo/9t3p3/bdyZ/27Ylf9w1pP/cNeP/2/UjP9w1Ir/cNOI/3PT - hv9y04T/ctN//3TRfP930Hr/eNB2/3nRdv9+1Xb/gtl3/4bedv+J4Xb/jOV3/5Dpd/+R6Xf/j+V0/5Tj - dP+a4XT/nd92/5/ddv+c13D/lc5l/43EWv+IvVP/hLZP/4C0Uv93tV//brlk/2m8Yv9svlz/dLtS/3q2 - Tf9/rkv/gaZK/3+hSf99nET/fJk//3yVO/97kzf/eZAz/3qPM/96jDD/fIou/3yILP97hyz/e4cr/3yF - Kv9+hSn/f4Mp/4GCJ/+Cgib/goEm/4SAJf+GgCb/h4Al/4h/Jf+JgCX/i38k/4yBJf+NgCX/kYEl/5OB - JP+SgSP/5eLZ0t3Z1rbLxcGhu7Suj7GrooTm5eLSExIR2QAAAJkAAACDAAAAcQAAAGMAAABVAAAARwAA - ADoAAAAtAAAAFwAAABwAAAAmAAAAMQAAAD4AAABUAAAAbQAAAMjV1dPkurStksO9t57U0cyx8ublyV/Q - wvc3zLv/Q9PB/0bWxv9H2cf/RdfC/0LRu/9Bzrb/Qsux/0TGrP9Ew6f/Q8Om/0fHq/9Ky67/S82y/0zM - sP9Nyab/T8mj/1POp/9X1az/Wtyw/17isf9h47D/Y+Os/2Xiqv9m4qf/aOGk/2vgof9q3p7/bd2c/3Hb - mf9z3Jf/dduV/3fbk/933Y//dd2N/3bdiv953Yn/fd6E/4Ddhf+C4Yb/h+WG/4rphv+O7Yb/ke2G/4/t - g/+O6X//jOJ5/4fbcv+D1W3/gc1n/37FX/98vVv/g7tZ/4e8Wf+Lu1j/jbpY/4m3Wf+Aslv/da9j/2mu - a/9fsHL/WrZ0/1+5af9tuFP/f7NC/4WvPf+GqDr/hKE4/3+ZN/97lDX/d5Ey/3aOLv92iy3/doos/3eJ - LP94iCv/eIcq/3mGKv95hSn/eIMn/3mCJ/95gSb/eYAl/3x/Jf99fSX/fHwj/358I/9/eyL/gXsi/4J7 - Iv+DeyL/g3wj/4Z7I/+IfSP/i30j/419JP+NfST/j34j/5B9Iv/k4dnT3NrYtszHwqG9t6+Qsqujhebk - 4tMTEhHaAAAAmQAAAIMAAABxAAAAYwAAAFUAAABHAAAAOgAAAC0AAAAXAAAAHAAAACYAAAAxAAAAPgAA - AFQAAABtAAAAyNbV0+S6tK2Sw764ntTRzbLx5uPJatvP90DWxP9D077/Qcu2/z/Isf9Axq3/QMKq/0HA - qP9Cwaj/Q8Wq/0fIrf9Ky6//S82v/07Nq/9S0qr/V9ix/1zguP9h57z/Yuu8/2Hqt/9g6LP/Y+ev/2Pm - q/9j5ar/ZuWm/2rjpP9t5KD/cOOf/3TkoP945p3/fOab/4DonP+D6pv/huya/4fvmP+J8Jj/je+Y/4/t - lv+N6JH/i+OM/4nghv+F2oL/gdR8/3zLc/94w2n/crli/3KzXP9yrlj/catU/3CpUP9wp0//b6dN/3Kp - UP93rFf/eK9j/3iycv90t3//Z7eI/1+2iP9atn//W7Vt/2WxV/90sEP/gas1/4WnM/+DoDL/fpky/3iT - MP90jS//cIou/3GHLf9xhyr/c4Yq/3OGKf91hin/d4Uo/3eDKP93gif/eIEm/3Z/Jf92fiT/dn0j/3h8 - I/96eyP/e3oi/3x6Iv97eSH/fnkh/394If+AeiH/gXoh/4N5If+EeiL/hHoi/4Z7I/+HfCP/iX0j/418 - I/+PfST/kH0i/+Th2dPd2ti2zMjDob23sJGyqqOF5uTi0xMSEdoAAACZAAAAgwAAAHEAAABjAAAAVQAA - AEcAAAA6AAAALQAAABcAAAAcAAAAJgAAADEAAAA+AAAAVAAAAG0AAADI1tXT5Lu0rpPDv7mf1dLOsvPm - 5clj0L/3OMWu/0DErf8/xKz/QMOq/0HEqv9Dxqv/RMes/0bMrP9K0a3/UNSu/1TZsf9a4bn/YOq//2Tw - xP9l8sX/ZPHB/2Tvu/9j77j/ZO+0/2Tvs/9n7rD/au2r/2ztqv9y76n/d++p/3zyqP+A86f/hfSm/4ny - pf+N8aL/j+6i/47nnf+K4pf/hduR/4LTiP99zIL/eMV4/3K7cP9ttGj/arBh/2qtXP9rq1v/a6lX/2up - Vf9uqFP/bqZU/2ylU/9so1T/aaJY/2WgXf9joWL/YqVv/2GrfP9isIb/Y7iK/2m7hP9rt3H/brRb/3Kv - Rf92qjb/eqQx/32fMP97mS7/dpIt/3KMLf9uiCz/bIUr/2yEK/9tgyr/b4Mp/2+DJ/9xgib/coIm/3SC - Jf91gST/dYAk/3d/JP92fiP/d30j/3p7If95eiD/eXkg/3p5H/96eR//e3ge/3p3IP98eCD/f3cg/393 - IP+AeCD/gXkf/4J4IP+DeSH/hXkh/4Z5If+JeiL/inoh/417Iv+OeyH/5eHZ097c2bfNycOivbawkrOs - pIbm5OLTExIR2gAAAJkAAACDAAAAcQAAAGMAAABVAAAARwAAADoAAAAtAAAAFwAAABwAAAAmAAAAMQAA - AD4AAABUAAAAbQAAAMjW1dPkvLavlMO+uKDV0s2y8+fnyWTNvPg5xaz/Qciw/0TMsv9Hz7D/StOw/03Y - sv9Q3LT/VOG3/1rnv/9d7MT/YO7H/2TwyP9l8cb/aPDF/2vxw/9r8b7/bfK+/2/yu/9v8bb/c/K0/3by - sv969LD/fvKt/3zup/9966T/feei/3vgm/962ZP/edGO/3bKhv9zxIH/cLx6/225dP9ptW7/aLFp/2av - Zv9ormL/a61f/2usW/9qqln/aqhX/2mmVv9oo1b/ZaBZ/2SfWf9inWD/XZxi/12dZP9bn2j/V59q/1qj - a/9fqGz/Za1r/22wZv92tV3/fbZQ/3+xQv97qzn/d6Iy/3WZLv9zkCr/cIso/2+HKf9uhCn/bIQp/2qD - KP9qgij/bYIn/26AJv9vgCX/cYAk/3KAI/91gCP/d4Ei/3iAIv94fyH/en8f/3l9H/96fCD/enof/3l5 - H/94eB7/eXge/3h4Hv95eB7/e3cf/3t2Hv98dR7/fnYf/4B3IP+Adx//gXcf/4J4IP+EeCD/h3ch/4l3 - IP+JeCH/i3kh/416If/k4dnT3tvZt83Iw6O9uLGRs62khefl4tMTEhHZAAAAmQAAAIMAAABxAAAAYwAA - AFUAAABHAAAAOgAAAC0AAAAXAAAAHAAAACYAAAAxAAAAPgAAAFQAAABtAAAAyNXU0+W+uLGVxL+6n9TR - zrPx5ubKa9nA90XWtP9Q27r/VN+7/1bivP9Z5cH/XebG/1/ox/9j6cj/ZerL/2bqy/9q68n/a+rF/23q - wv9x68D/c+7A/3Lvvv9y7Lj/ceas/3Dlq/9v4qf/atqf/2fRlf9lyY3/YcWJ/2DAhf9gu4D/YLZ5/2Kz - df9ksnP/ZrFv/2exbf9psmv/abFo/2isZP9mqWD/Zqdd/2elXP9mo1r/ZaFa/2KfXf9hm2D/X5th/1ya - Yf9ammL/Wppj/1ubY/9am2H/W55f/12fXf9doFn/YqJT/2mlT/9yqUz/e65K/4GzRf+BsDz/e6Y0/3Wa - L/9wkCr/bYcn/2yCJf9qgSb/bIIn/22CJv9tgib/bYEm/22AJf9vgCT/bn4j/3F/I/90fyP/coAi/3aA - Iv95fyH/e38g/3t+H/96fh7/e3we/3t7IP95eR7/eXge/3h3Hf94dx3/eHYd/3l2H/96dR3/fHUe/3x1 - Hv99dR7/fnUe/392Hv+AdiD/gHYe/4J3H/+Fdx//hncg/4l3IP+LeCH/jHgg/+Xh2tTf29m4zcrEor+5 - s5KyraaH5eXj1BMSEdoAAACZAAAAgwAAAHEAAABjAAAAVQAAAEcAAAA6AAAALQAAABcAAAAcAAAAJgAA - ADEAAAA+AAAAVAAAAG0AAADI1tXT5b62sZXEv7uh1dHPtPDm5sp54sj3WODB/2PhyP9m5Mr/ZeTM/2bi - yv9l4sj/ZeLE/2Tiwv9i47v/ZOCz/2bgsv9m4LL/aN+w/2rfsf9n2qf/YtKf/1/Om/9by5n/WcOR/1a6 - hv9TtoL/UrN+/1Wve/9VrXf/WKx0/1mrc/9crG//YKts/2Ksa/9mrGn/aKtm/2ipZP9np2L/ZKNf/2Cg - Xf9fnV//X5xg/12bYv9cmmP/XJlj/1qYYv9amGL/WZld/1qYW/9cmVv/XJtY/16bVf9fnFH/YpxN/2Ob - R/9pnkP/cqVA/3qpP/99qzz/fqg3/3mgMP91lir/c40o/22IJf9qgiT/bIEk/2uAJf9sgCX/aoEk/2yA - I/9tgCP/boAj/25+I/9wfiH/cn4h/3N+If91gCD/eIAg/3qAH/98fh7/fH4e/3t9Hf96fB3/enkd/3l4 - Hf95eB3/eHcd/3d2HP94dhz/eXUd/3p0Hf97dB3/e3Qd/3x0Hf99dR3/fnYd/391Hv+Adh7/gnYe/4J2 - Hv+Edx//iHYf/4p4H/+Jdx7/5OHa1N/d2rjPysWjvrmzk7Gtpojm5ePUExIR2gAAAJkAAACDAAAAcQAA - AGMAAABVAAAARwAAADoAAAAtAAAAFwAAABwAAAAmAAAAMQAAAD4AAABUAAAAbQAAAMjW1dPlvLexlsTA - u6HV0s+08Obly33hz/hZ3cT/Xt3C/1zevf9b3rj/Wty2/1resv9Y3K3/Wdmo/1vWpv9b1KT/WNCk/1XG - m/9TvZD/U7uO/1K9kv9UvpP/UreJ/1Gygv9RsX//UbB9/1GreP9Sp3P/UqZw/1Smbv9WpGr/WKNn/1ui - Zv9epGP/YqVi/2OlY/9lpWT/ZaNl/2GgZ/9dnWb/Wppj/1qZYv9dml//XJpg/1yZXv9cmVr/W5dZ/1yY - Vv9cmFX/XJdT/12YUP9gmE3/ZJlI/2SZRf9lmkD/apw9/3CfOf90oDb/dp0y/3adLv96nS3/epgq/3iS - J/9ziyX/bYQj/2l/I/9pfiL/aX4j/2t/Iv9tfyL/bX8i/25/If9wgCD/cn4f/3J+Hv90fR7/dn4e/3p+ - Hv97gB7/fIAd/3yAHP98fhz/fH0d/3t8Hf96ehv/eXgc/3h3Hf93dhz/eHQc/3h0HP94dRz/eXUc/3ly - G/95cxz/e3Mc/310Hf98dBz/fnUe/351Hv+AdR3/g3Yd/4Z1Hv+Hdh//iXcf/4l1Hv/k4trU39zauM7K - xaS9uLOUtK+oiOfl49QSEhHaAAAAmQAAAIMAAABxAAAAYwAAAFUAAABHAAAAOgAAAC0AAAAXAAAAHAAA - ACYAAAAxAAAAPgAAAFQAAABtAAAAyNbV1OW/ubOWxMC7odXTz7Tx5ufLdt/B+FHasv9Y2bL/V9eu/1jU - q/9WzaX/VMae/1C/lv9JupP/SLiR/0mxi/9KsIb/S7GG/020i/9PtYz/T66D/06sf/9OrX7/UK9//0+o - dv9Po2//T6Jt/1Cha/9Qn2b/Upxk/1SdY/9VnWH/WZxh/1mdZP9bn2b/XqBo/1+gav9goWb/YJ9k/12d - Yf9dml3/XJhb/12YWf9dmFj/XplW/16ZVP9dmVP/X5hQ/2CYTv9gl0v/YphG/2WYQv9omj//apo7/2ya - Nv9sljL/aZEu/2uSKv9zlSn/e5so/4CdJ/99lif/d5Am/3KIJP9rgCH/aX0h/2l8IP9pfSD/a34g/21/ - IP9ufx//b34f/3F+Hf9zfx3/c34c/3V+Hf92fhz/en8d/3yCHP9+ghv/fYAc/31+HP98fRz/fHsc/3p6 - HP95eBz/eXYc/3h1G/94dBv/eHQb/3hzG/95chv/eXIb/3lyG/96chv/e3Ib/3xyG/9+cxz/f3Md/4B0 - Hf+DdB3/hXQd/4V0Hf+HdR//iHUe/+Ti2tTf3Nq5zsrFpMC6s5S0sKiJ5uXj1RMSEdoAAACZAAAAgwAA - AHEAAABjAAAAVQAAAEcAAAA6AAAALQAAABcAAAAcAAAAJgAAADEAAAA+AAAAVAAAAG0AAADI1tXU5b65 - s5bEwryg1dPPtPLo6Mty0LT4S8Kg/029nP9JuZf/R7aT/0WxkP9ErYv/RauI/0Wog/9GqoH/RamB/0ir - g/9IqH//SKZ7/0qlef9Kp3z/Tap9/02kdf9NoHH/TKFt/02ia/9PnGX/UJlh/0+aYf9PlmP/UJZl/1CX - ZP9TmGX/V5tm/1udZf9dn2T/YKBj/2KhYf9joF3/YZ1a/2CYWP9emVb/YJlV/2GZVP9gmVL/YJhP/2CY - TP9il0j/ZJdF/2SXQv9olz7/a5k7/2yZN/9pkzD/ZYsr/2SGJv9niSb/cJAm/3mVJP+AmyT/f5kl/3qT - I/91jCP/b4Qg/2p8H/9pex3/aHse/2p8Hv9sfR7/bn0c/29+HP9yfR3/c38b/3V/G/90fhz/dX4c/3d/ - G/99gBz/foIc/3+CGv9+ghr/fn8b/319G/98exv/enka/3l3Gf95dhv/eHQb/3dzGv93cxr/d3Ea/3ly - G/95chv/eXIb/3pyG/97chv/fHIb/31zG/9/chz/f3Ic/4JzHf+Ecxz/hXQd/4d1Hv+HdB3/5OLZ1d7c - 2rnPysWkv7u0lbOwqInm5ePVExIR2gAAAJkAAACDAAAAcQAAAGMAAABVAAAARwAAADoAAAAtAAAAFwAA - ABwAAAAmAAAAMQAAAD4AAABUAAAAbQAAAMjW1dTlvbi0l8XCvaLW09C18urqy2S7ovg7rYv/RLCO/0Ov - jP9DrIn/RKiF/0Slgv9EpH7/QqB7/0Khef9DoHb/RKB1/0addP9In3T/SaF0/0mgc/9Lnmz/TZ9s/02h - bP9MnWj/S5hl/02YZ/9LlmT/SpNj/02TZf9NlGT/UZZh/1WYYf9aml//Xp1f/2CgXv9joV3/ZaJd/2Wg - Wv9jnFf/YZpU/2CZUf9imlH/ZZtP/2SYTP9kl0f/ZpZE/2aWQP9plz7/apg7/22XN/9pkTD/ZIoq/2CE - Jv9igyT/Z4Uk/26KI/91jyP/fJUk/3+YJf99liT/eY8h/3SJIP9tgh3/aXod/2h6HP9pexz/bHoc/258 - HP9vfRn/cH0Z/3J+HP91gRz/dYAa/3WAGf94fhr/fIAc/3+CGv+Agxv/f4Ma/3+CGf9/fxn/fn4a/318 - Gv97eRn/eXcZ/3l2Gf94dBv/d3Ma/3dzGf93cRr/eXEb/3lyG/96cBn/enAZ/3twGf98chv/e3Ea/39y - HP9/chz/gnEb/4RzHP+Dchv/hXMc/4VyG//l4tnV4N3buc7Lx6a/vbaWta+piufl49UTEhHZAAAAmQAA - AIMAAABxAAAAYwAAAFUAAABHAAAAOgAAAC0AAAAXAAAAHAAAACYAAAAxAAAAPgAAAFQAAABtAAAAyNbW - 1OW+uLSXxcK+otbTz7Xz6+vLZred+DumhP9CqYf/Q6eE/0Gkgf9BoX3/Qp94/0CbdP9BmXP/Q5pw/0OZ - bP9EmW3/RJpt/0ecbf9ImWj/Spto/0ufbP9LnWr/Spdo/0ubaf9KmGn/SpNm/0uVY/9MlGL/T5Nf/1GU - Xf9Tllz/WJhc/1ybXP9gnlr/Y6Ba/2aiWf9po1j/aKFW/2adUv9lmk//ZZlM/2eaS/9pm0n/Z5lE/2mY - QP9qlz//bJg8/2yYOP9nkDL/ZIgr/2GDJ/9ggiP/Y4Mj/2aCI/9shCL/dIki/3mOIf99kyL/f5Yj/3yT - If94jSD/c4ce/2x/G/9peRv/ankb/2t5Gf9sehr/bnwa/3B9GP9wfhj/c4Aa/3WDGv92ghr/d4EY/3qA - GP99ghr/gIQa/4GEGf+Bgxr/gYIZ/4CBGf9/gBj/fnwY/3x5Gf97eBr/encZ/3h1Gv95dBn/eHMY/3hx - Gf93cBn/eHEa/3lwGf95cBn/eXAZ/3pwGf98cRv/fXAa/31wGv+AcRv/gnEa/4NyG/+Fcxz/hXIb/+Xi - 2tXg3du6zszHpr+8tpa2r6mK5+Xj1hISEdoAAACZAAAAgwAAAHEAAABjAAAAVQAAAEcAAAA6AAAALQAA - ABcAAAAcAAAAJgAAADEAAAA+AAAAVAAAAG0AAADI1tbV5b+8tZfGwr2j19TRtvTs7MxksZX4OZ56/0Gi - f/9Aon3/QZ94/0Kcdf9CmnL/QJhw/0GTa/9Bkmf/Q5Vn/0OYaf9ElGX/RpRl/0aZaP9ImWv/R5Vn/0mZ - af9KnGv/SZdk/0uXY/9Nl2L/TZNf/06TXP9QlFv/U5NZ/1WWWf9amVj/X5tX/2OeV/9moVb/aaNX/22k - U/9solL/ap5N/2maSf9pmkf/a5pE/22ZQv9tmT//bpk8/26YOP9qkjP/Y4gs/2CEKP9igiX/ZIIj/2WC - Iv9ngSH/an8g/3CEH/93iB7/eo0e/36SIf9/lCH/fI8g/3eJH/9yhBz/bXsa/2p4Gf9reRj/a3oY/257 - Gf9vfRn/cH4W/3KAFv91ghj/d4QZ/3aDGf94gBf/fIEX/32DGP+AhRj/goYY/4SEGf+Dgxn/goIY/4GA - GP9/fRf/fXoY/3x4Gf97dxn/eXQZ/3l0Gf94chn/d3EY/3ZwF/93cRj/eXEY/3lwGf95bxj/eW8Y/3tw - Gf99cBr/fXAa/4BwGv+CcRv/g3Ia/4RxGv+EcRn/5eLZ1eDd3LvQzMemwr23lrexq4vn5ePWEhIR2gAA - AJkAAACDAAAAcQAAAGMAAABVAAAARwAAADoAAAAtAAAAFwAAABwAAAAmAAAAMQAAAD4AAABUAAAAbQAA - AMjW1tXlwLy1mMbEvqPX1NG29OzszGSukPg4mnT/P5x3/0Gedv9CnXT/Qppx/0GVa/9Ckmf/Q5Jn/0KT - Z/9CkGT/RI9j/0SSaP9FlWr/RZFl/0iTaP9Mm2r/TJdl/0uVY/9OmWP/TZZf/06TXP9QlFz/T5NZ/1CS - V/9Vk1b/WJZV/1yYVP9gmlX/ZZ9T/2qhUv9to1L/b6RP/2+hSv9tnkb/a5pD/2yaQf9vmj//cZo8/3KZ - Ov9ukzT/ZYst/2OFJ/9jgyX/ZYIl/2SAI/9mgCH/aIAf/2mAHf9vfhz/coIc/3aIHf97jR//fpIe/3+R - H/97ix7/eIgd/3GCGv9sexn/a3kY/2t6GP9texn/b3sZ/3B9F/9xfxb/c4EX/3eEGP96gxn/eYEY/3qA - F/99ghf/f4QX/4KFF/+Ehhj/hIQX/4ODGP+Cghj/gYAY/399F/99ehf/e3gY/3p2F/95dBf/eHMY/3dy - GP93chf/d3AX/3hwF/95cBn/eG8Y/3hvGP95bxj/enAZ/3xvGf98bxn/fHAZ/39xGf+CcBn/hHEa/4Rx - Gf/l4tnW4N3cu9HMx6bDvbiXuLOsi+fl49YSEhHaAAAAmQAAAIMAAABxAAAAYwAAAFUAAABHAAAAOgAA - AC0AAAAXAAAAHAAAACYAAAAxAAAAPgAAAFQAAABtAAAAyNfW1eXAvLWYx8O+o9fU0bb07O3MY6qL+DiW - bf9BnHT/Qpxz/0Gab/9Cl2v/Q5Rp/0KTZv9DjmT/QYxj/0GOZv9DkWb/RY9j/0WQYv9HlWX/SZVk/0mS - X/9NmGL/Tphh/02UW/9Oll3/UJRb/1GRVv9Sk1f/U5JU/1eSU/9ZlVH/XJhQ/2KbUP9nnk7/baFO/3Kj - Tf90o0n/dKFF/3CdQv9umj7/cJo8/3ScO/9xmTb/a48v/2WIKf9lhSf/ZoQl/2aDIv9ngiD/aIAe/2l/ - Hf9rfhz/bH4b/29+G/9ygxv/dogc/3uMHf99kBz/fpAd/3qKHP93hxv/cIEY/2t7Gf9rehj/bHoY/258 - F/9wfhX/cH4U/3J/Ff91gRf/eoUY/3yEGP97ghj/fIEX/36DF/+BhRf/hIYY/4SGGP+Fhhj/hIQY/4OB - F/+CgBj/gH0X/356Fv98eBj/eXUX/3l0F/94cxj/d3IX/3ZxF/93cBf/eHAX/3dvF/94bxj/eG8Y/3hu - GP95bxj/e24Y/3xvGf98bxn/f3AZ/4FvGf+EcRr/g3AZ/+Xh2dbg3ty70c3JpsS/uJe5tKyL5+Xj1hIS - EdoAAACZAAAAgwAAAHEAAABjAAAAVQAAAEcAAAA6AAAALQAAABcAAAAcAAAAJgAAADEAAAA+AAAAVAAA - AG0AAADI19bV5cC8tpnHw76j19TRtvTs7cxiqon4OJZo/0Cabf9Cm23/Qplt/0GWav9BkWf/Qo1j/0CN - Y/9CjWH/Q41f/0OLX/9Gj2D/SJFf/0eOXv9JkV3/S5de/0uSWv9PlFv/TpZc/1CSVv9Sk1b/VJNU/1WQ - Uv9XklH/WJJP/1uVT/9gmEv/ZZxJ/2ygSf9xo0j/d6RF/3qkQv94okH/dp89/3OZOf9ylzb/bpQy/2mN - LP9piij/aIgn/2iEJP9ogyL/aIIf/2qAHf9rfxz/bH8b/21+Gv9tfBn/b34Z/3OBGP92hxr/eYob/32Q - HP99jxr/eosa/3eIGv9wgBj/bHsY/2x6F/9ufBf/b30X/3B+Ff9xfxX/dIEU/3mDFv98hRf/fYQX/3uC - Fv98ghX/foQW/4KGFf+GiBb/hocX/4aGF/+GhRb/hIEY/4OAF/+BfhX/f3oV/3x3F/97dhb/eXQW/3lz - F/93chb/d3EW/3hwF/94cBf/d28W/3huFv94bhb/d20W/3luF/97bhj/fG8Y/35uGP+Abxj/gG8Z/4Jw - Gf+Cbxf/5eLZ1uHe3LvRzsmmxL+4l7myrIzn5eTWEhIR2gAAAJkAAACDAAAAcQAAAGMAAABVAAAARwAA - ADoAAAAtAAAAFwAAABwAAAAmAAAAMQAAAD4AAABUAAAAbQAAAMjX1tXlv723msjEv6XY1dK39e3tzWOo - hPg5lGX/QZlr/0KZbf9Dl2z/QpNp/0KQZf9CjGH/Qoxd/0SLXP9Filz/Rotd/0eLW/9Hi1n/SZBb/0qP - WP9NkFb/UJRZ/0+TVv9RkVb/U5VW/1KSUf9Uk1D/VpBN/1eSTP9Zk0z/X5ZJ/2SaRv9snUX/cqBF/3ak - Qf97pj//faY9/32kPP95njf/cJQx/2uOLP9qjCn/bYwn/22LJP9rhyD/bIMg/2yBHv9sgB3/bX8c/25+ - Gv9ufRn/b3wX/257Fv9vfRf/c4IZ/3eGGf96ihv/fpAb/32PG/96jBn/d4gY/3B/F/9texb/bnsU/29+ - FP9xfxX/cX8U/3KBFP93ghT/fIQV/36HF/9+hBX/fYIV/32CFf9/hhX/g4YV/4eIFf+Hhxb/h4YV/4aF - Fv+Eghf/gn8V/4F+FP9+exP/fXcV/3x2Ff96dBX/enMW/3hxFP94cRX/d28W/3dvFv93bxb/d28W/3du - Fv93bRb/eW4V/3ptF/96bhb/fW8X/39uF/+Abxf/gHAZ/4JvF//l49rW4d/cvNLNyafDvriYuLKsjebl - 5NcSEhHaAAAAmQAAAIMAAABxAAAAYwAAAFUAAABHAAAAOgAAAC0AAAAXAAAAHAAAACYAAAAxAAAAPgAA - AFQAAABtAAAAyNfW1eXAvbeax8W/pdjV0rf07O7NZKeD+DiRZP9Clmr/RJlr/0OXaP9Dk2T/RJBg/0SN - Xv9EiVr/RIlY/0WKWf9Fh1f/R4pW/0mMVf9Ji1T/TI5U/0+RVP9QjlP/UpNS/1KSUf9Uk0//VZVN/1WS - S/9Ykkr/WpJH/16WRf9lmUP/bJ1B/3KfQf92oj7/e6U8/4GnPP+Epzn/fqE1/3KVL/9rjCj/a4wm/26M - Jf9xjSL/cIoi/26GIP9uhB3/boEc/25/G/9ufhn/cH8W/299Ff9uehb/bnoW/3B+F/9zgxj/eIkZ/3uO - Gf9/khr/fY8a/3qNGP93hxf/cH4V/258E/9vfRT/cH4U/3OAFf90gBX/dIEU/3mDE/99hxT/f4cW/36G - FP99hBT/f4MT/4KHFf+FiBb/iIkV/4iIFf+GhhX/hoQW/4WCFv+CgBT/gH0U/398E/99eBT/fHYW/3p0 - Ff95cxX/eXIV/3hxFf93bxb/d28V/3dvFv93bhX/d20V/3dtFf94bRX/eW0W/3ltFf99bhb/f20W/39t - Fv9/bhf/gW4W/+bi2tbh3ty80c3JqMO+uJm6tK6N5+bl1hISEdoAAACZAAAAgwAAAHEAAABjAAAAVQAA - AEcAAAA6AAAALQAAABcAAAAcAAAAJgAAADEAAAA+AAAAVAAAAG0AAADI1tXV5sG9t5rIxb+l19bSt/Tt - 7s1jo4H4O5Bi/0SWZ/9ElmX/RZVj/0WUYf9Djlz/RYpY/0SJV/9Eh1X/RYZS/0mJU/9JiFL/SohP/02N - Uf9NjE//To1O/1KQUP9Tj0z/VZNN/1STSf9Yk0n/WpRH/16WRv9hl0P/ZJpC/2qbQP9vnT3/dKA7/3uj - Of+Bpzj/hKg3/3+jMv94mS7/cJAo/2yKJP9uiiP/cowi/3ONIP9zih7/cYYe/3CFGf9ygxj/cYEX/3B/ - Ff9vfhT/bn0U/256Fv9uexT/cX8W/3WFF/95ixf/fpAY/4GTGP9+jxf/fo8X/3mIFv9wfRT/b30T/3F+ - Ff9yfhb/dIAV/3iCFP95ghX/fIYU/4GKFf+AiBX/foQT/32DEv9/hRP/hYgV/4mKFv+HiBX/h4gU/4eH - FP+GgxX/hIEV/4OAE/+BfRP/f3wU/316Ev98eBT/enQT/3lzFP95cxT/eXMU/3hxFP94bxX/eG8V/3dt - Ff93bRX/d20V/3htFf95bRX/eW0V/3xtFf9+bRb/fm0W/39uF/+AbRX/5uLa1uHe3LzQzcmoxL+6mb21 - r43o5+XWEhIR2gAAAJkAAACDAAAAcQAAAGMAAABVAAAARwAAADoAAAAtAAAAFwAAABwAAAAmAAAAMQAA - AD4AAABUAAAAbQAAAMjX1dXmw723msjFv6XY1dK39OzvzWWkfvg7jlv/RJRi/0eXY/9JlmD/RZBc/0aN - Wf9GjFb/Q4ZQ/0SEUP9IiE//SYVN/0mGTv9LiEz/TIdJ/0+MS/9PjUr/Uo1K/1WPSv9WkEf/WpZF/16X - Rf9hm0P/ZJtC/2aaQP9omz7/bZs7/3OeOf96ojf/g6Y2/4GmMv99oiz/epsp/3mVKP9yjyT/bYki/3KK - If92jB7/dYse/3WJHP91hxn/coQZ/3OCF/9ygRX/b34U/3B+FP9vfRT/bnsV/257E/9xfxX/doUW/3qL - Fv+AkRf/gJMY/36PFv+CkBj/eIcV/3B+FP9wfxX/cn8T/3OAE/93gRP/eYIU/3yEE/+AiRT/gYsU/4GJ - E/9+hBP/fYMS/4CGE/+GiRT/iIkT/4mKFP+HiBT/h4cV/4aEFP+EgRP/g4AT/4F9E/9+ehL/fHoR/3t3 - Ev96dBP/enMU/3lzFP95chP/eHAU/3hvFP93bhT/d20V/3dtFf93bBX/eG0V/3ltFf95bBX/em0V/3xs - Ff9+bRb/f24X/4BtFf/m4trX4d7dvdHOyajFv7qZvLWvjejn5dYSEhHZAAAAmQAAAIMAAABxAAAAYwAA - AFUAAABHAAAAOgAAAC0AAAAXAAAAHAAAACYAAAAxAAAAPgAAAFQAAABtAAAAyNbW1ebDvbeaycXApdfW - 0bf07u/NZqJ6+DyOWP9Gll//RpVc/0iVWv9Hklr/RYxX/0WIUP9Ghk7/R4RL/0qCS/9Lhkr/SoVK/0yG - R/9OiUf/T4hG/1CKR/9TjEP/V5FD/12XRP9jnEP/Zp5B/2aeQP9mnD3/aZo6/22aOf9znzj/e6Y1/36m - Mv98oS//eJsq/3qaJf98mST/epUm/3OOIv9xiR7/dYod/3iMGv96jBr/eYoZ/3eHGf91hBj/dIMW/3KB - FP9wfxP/cH0U/298E/9ufBP/bnwT/3OCE/94iBT/fI0V/4KTFv+Bkhb/gpEV/4aUFv95hxX/cIAU/3KB - E/90gRP/d4IS/3mCEv95gxL/fIUS/4KKEv+EjBP/gooR/3+GEv9/hBH/gocS/4iKE/+JixL/iYoS/4iI - Ev+HhhP/hoUT/4SCEv+DgBP/gX0Q/396EP99ehD/fHcS/3t0E/97dRH/e3MT/3pyFP95cRT/eHAT/3dv - E/93bhT/d24U/3dsFP94bBT/eW0V/3htFP95bRX/em0V/31sFf99bRb/gG0V/+bi2tfi3929087KqMTA - upm7ta6N6efl1hISEdkAAACZAAAAgwAAAHEAAABjAAAAVQAAAEcAAAA6AAAALQAAABcAAAAcAAAAJgAA - ADEAAAA+AAAAVAAAAG0AAADI1tbV5sK+uJvJxcCl19bRt/Pu781mo3j4PIxU/0aTWP9Jlln/SJVY/0aR - Vf9GjVL/R4hO/0iDSf9Igkf/S4RI/0uDRv9NhEX/TIVF/06EQ/9QiEL/U4xA/1yTQf9gmkD/ZZ9A/2if - Pv9lnjz/ZZs7/2mYOf9umzj/dqQ2/3mpMf93oy3/dZkq/3WVJ/96mST/fpoi/36aJP98lCP/dYwd/3SJ - G/93ihr/eo0Z/3uNGf96ixj/eYgY/3aEFf90hBX/coIU/3F/FP9wfhP/bn0T/298Ev9wfhP/dYYS/3uL - FP9/jxT/hpQV/4aTFP+FlBX/iJUW/3eGE/91gRH/dYMS/3iEEf96hBH/e4US/3yFEf9/iBH/hIwT/4aN - FP+DihH/gIYR/4GFEP+GhxD/iYsR/4mLEf+JihL/iIkQ/4aHEf+FhRL/hIIS/4OBEf+Bfg//f3sR/315 - Ef98dxH/e3YQ/3t2EP96dRL/e3QT/3lxFP95cBP/eHAS/3duE/93bhT/eW4T/3htE/94bRP/eG0U/3ts - E/99axX/fWwV/31tFv+AbhT/5uLb1+Lf3b3TzsqpxMC6mbu2sI7p5+XWEhIR2QAAAJkAAACDAAAAcQAA - AGMAAABVAAAARwAAADoAAAAtAAAAFwAAABwAAAAmAAAAMQAAAD4AAABUAAAAbQAAAMjX1tXmw764m8jF - v6bY1tK49O7wzmiidPg/i0//R5JV/0iUVP9KlFT/SZBR/0qMTf9Kh0r/SYRG/0mCRP9KgUP/TYNC/0yC - QP9Og0D/UIc//1qOPv9gmD7/ZJw+/2efPP9mnTv/Zps4/2aZOP9qmTj/c6E1/3itNf93qS//b5kp/26Q - Jv90kCP/eZUi/3+aIP+AmSL/gJkg/36TIP93ixv/dYob/3qMGP98jBn/fY0Z/36MGP98hxb/eIUV/3aE - E/9zgRX/c4EU/3J/Ev9wfhH/cX4R/3OAEv95hhL/gIwT/4STFf+Jlxb/hpQW/4qXFf+KlhX/eYUS/3iC - Ef95hBD/e4YS/32GEv99hxL/f4cS/4KLEP+HjxL/ho4S/4OKEf+Ahw//gYcO/4aKD/+JixD/iYsQ/4mL - EP+HiBD/h4UR/4aEEf+DghD/gX8P/4B9Dv9+ehH/fXgR/3x2EP97dxH/e3YQ/3x0Ev99cxP/e3IS/3tx - Ev96bxP/eW4S/3luEv95bhT/eG0T/3htE/94bRP/e20T/31sE/98bRP/fm4V/4BuE//m4tvX4d/dvdLO - y6rFwLuavLawjunn5dYSEhHZAAAAmQAAAIMAAABxAAAAYwAAAFUAAABHAAAAOgAAAC0AAAAXAAAAHAAA - ACYAAAAxAAAAPgAAAFQAAABtAAAAyNfW1ebCvribx8XAptjW0rn07e/OaKBw+ECJS/9JkVH/SpNR/0yU - Uf9NkE//S4xJ/0yHRv9MgkP/S4FA/0uAP/9LgT7/ToQ9/1WKPP9clTz/Yps8/2aePf9mmzr/Zpk4/2OY - Nf9mmDX/bZw1/3erNf94tDL/b58s/2yMJ/9siCX/cI0i/3eTIP99lyD/gJkf/4ObHv+BmB3/f5Me/3mM - Gv94iRj/eYsY/3+NF/+Cjhj/gYsX/3+IFf97hRT/doQT/3SCFP90gRP/cn8R/3J/Ef9yfxH/doIT/32I - E/+CjhP/iJUU/4uYFf+IlRT/j5wU/4qVFP98hRL/e4US/3yFEf9+hxL/focS/3+HEf+AiRD/hI4R/4qQ - E/+HjhL/gooP/4KHDv+DiA//h4sP/4mLD/+Jiw//iIsQ/4iIEP+IhRD/hYMR/4OBEP+CgBD/gH0P/356 - D/98eBD/fHcP/352EP9+dxD/fXUP/310EP98cxD/e3IS/3twE/96bxP/eW4S/3htEv94bRL/eG0T/3ht - E/96bRP/fGwT/3xsE/9+bhX/gG4T/+bi29fh392+0s7LqsXAu5q9tq+O6efl1hISEdkAAACZAAAAgwAA - AHEAAABjAAAAVQAAAEcAAAA6AAAALQAAABcAAAAcAAAAJgAAADEAAAA+AAAAVAAAAG0AAADI19bV5sK/ - uZzGxb+m19XSufTt785soHD4QopJ/0iQTP9LlE7/TJVO/02QTP9MjUf/TYdD/02DQv9MgD//ToA8/1OG - PP9ZkDr/YJk5/2WeOf9knTn/Ypg4/2OUNv9llDL/aZky/3OmMv95uTP/c7Av/2mRKP9mgiX/a4Uj/3GL - If91kCD/fJQe/3+YH/+CmR//hZwc/4SaHP+DlB3/fIsZ/3qIGP99ixf/g44V/4SPFv+CjBX/f4gU/3uG - Ev95hBP/d4IS/3Z/Ef90fxD/c4AR/3aCEf96hhL/gIsT/4WSFP+LlxX/jJoT/4qXEv+TnxX/iJMT/32H - Ef99hxL/fokR/4CKEP+Aig//gIgR/4OMEP+JkBL/ipES/4eNEf+EiQ7/g4cM/4aJDv+Kiw//iowQ/4mL - D/+Jig7/iYgO/4eFEP+GgxH/hIAP/4N/D/+BfRD/f3oP/314D/9+eA//fncP/353EP9+dxD/fXYP/3x0 - Ef97chL/e3IR/3pwEv96cBL/eW4Q/3ttEP97bRL/e20S/3ttEv98bBP/fWwT/39uFP+AbxL/5ePb1+Lf - 3b7TzsuqxcC7mry2r4/p5+XWEhIR2QAAAJkAAACDAAAAcQAAAGMAAABVAAAARwAAADoAAAAtAAAAFwAA - ABwAAAAmAAAAMQAAAD4AAABUAAAAbQAAAMjX1tXmw764m8jFwKbW1dK58+3wzmudbPhDiEP/S5BL/0qU - S/9LlEr/T5JI/06LRP9OhkH/TIM9/1CDPP9YjDv/YJc6/2SdOf9lnTj/ZJg3/2OUNP9hkDL/Y5Ix/2ye - L/92tTL/eb8w/2yiK/9kgiT/ZoAi/2eFIv9tiCD/c40f/3eRH/99lB7/gpgd/4eaHP+Imxr/hpkc/4SU - Hv97ixn/eogX/4CLFv+DjxX/hI8V/4KMFP9/iBP/e4YT/3qEEv94gRH/d4AQ/3aBD/90gRD/eIMR/3yI - Ef+CjRP/iZQU/42aEv+NmxP/jJkS/5WgFf+GkRL/fogR/3+HEf9/iQ//gIsP/4GLD/+BiQ//hY0Q/4uT - Ef+MlBH/h40R/4WJD/+EiA3/iIoO/4uLDv+LjA//iYoO/4mJDf+Ihw3/hoUO/4WDD/+EgA//g34O/4F8 - Dv+Aeg3/fngO/354Dv9+eA7/f3YP/393EP9+dg//fXQQ/31zEf98cxD/fHER/3twEv97bxL/fG0R/3xt - Ef98bRH/fG0S/3xsEv99bRT/gG8T/4FwEv/l49vX4t/dvtPOyqrFwLubvLawkOnn5dYSEhHZAAAAmQAA - AIMAAABxAAAAYwAAAFUAAABHAAAAOgAAAC0AAAAXAAAAHAAAACYAAAAxAAAAPgAAAFQAAABtAAAAyNfW - 1ebDv7mcyMbBptjW07nz7fDOa55o+ESHQP9Lj0f/TZRH/06VRv9QkEP/UIs//1GIPv9Uizv/XZM7/2ac - Of9mnzj/Y5w2/1+TNf9ejjH/X44v/2eSL/9xqzD/eMMy/3G6Lv9kjib/Ynsg/2R/If9mgyH/aYce/3CK - Hv92jR7/eZEe/4CVHf+DmRr/h5kZ/4ebGf+KmRv/iJUf/36LF/99iBX/gYsV/4SNFP+FjhX/gosU/3+J - E/97hhL/eYMR/3iDEP93gg//d4EP/3eCD/95hBH/fokR/4WQEf+LlhL/kJwR/4+bEv+RnBL/lqEU/4SO - EP9/ig//gIoO/4GMDv+DjBD/g4sP/4OKD/+HjxD/jJQQ/4uTEf+GjRH/hIkO/4aJDP+IjA3/i40N/4yN - Dv+Kiw3/iYkN/4iHDf+HhQ3/hYQM/4SADv+Dfw//gX0N/4B6DP9+eAz/f3kO/354Df+Cdw7/gncP/4J2 - D/+BdRD/gHQP/4B0Dv9/chD/f3AR/31uEf99bhH/fG0Q/3xtEf98bRH/fG0R/35uE/+AcBL/gXAS/+bj - 29ji392908/KqsXBu5u9uLGP6Obl1xIREdkAAACZAAAAgwAAAHEAAABjAAAAVQAAAEcAAAA6AAAALQAA - ABcAAAAcAAAAJgAAADEAAAA+AAAAVAAAAG0AAADI19bV5sO/uZzJxsGm2NbTufTu8c5snGb4RIY9/02Q - RP9Ok0T/UZND/1GQQf9TkT7/XZU8/2KcPP9moTr/Zp43/2GXM/9ejzH/W4sw/1+LLv9pmC3/dr0x/3bK - Mv9qqSv/YYEj/2F7IP9kgSD/ZoIg/2eFH/9uhx3/cowd/3ePHf9+kRz/gZYa/4WYGf+KmRj/i5oX/4yZ - HP+KlR//gYsV/3+IFP+BjBT/hI8S/4SOE/+CihL/gIgQ/32GEv97hRD/eoMP/3qDD/95gw//eYMP/3yG - EP+BixH/h5IR/46ZEv+TnRL/kZsT/5WfE/+VnxH/go0P/4GLDv+Diw//hI4O/4SMD/+Diw7/hYwP/4yQ - EP+PlBH/jJIQ/4iMEP+Gig3/h4kN/4qMDP+NjQ3/jYwO/4mKDP+IiA3/ioUM/4iFDP+Egw3/g38N/4J+ - Dv+Aew3/f3kN/354Df9+eA3/f3gN/4J4Df+CeA7/gncP/4F1D/+AdA7/gHQO/39yEP9+cBD/fm8Q/31u - Ef99bRD/fG0Q/3xtEP9+bRL/gXAS/4JyEf+DchH/5uPb2OHg3b7Sz8urxsO8m725sY/o5uXXEhER2QAA - AJkAAACDAAAAcQAAAGMAAABVAAAARwAAADoAAAAtAAAAFwAAABwAAAAmAAAAMQAAAD4AAABUAAAAbQAA - AMjZ19bnwr64m8rGwabZ19O59O7yzmybY/hFhzn/TY5A/0+RP/9SlkH/WZpA/2GiP/9opDz/Z6M5/2Ka - NP9ekjH/XIsv/1yJLf9hjCz/bKUt/3bPMv9xxy//Y5Qn/2F6Iv9ifSL/ZIAh/2WBIP9ogx7/bIQd/3GH - Hv90jB3/epAd/3+TGv+Clhn/h5kY/42bGP+NmhX/jpoc/4uVIf+AihT/fogS/4KNFP+FjhL/ho4R/4KK - EP9/iBD/fYUR/3yFD/97gw7/e4MO/3qDDv97gw7/fogP/4SOD/+KlA//kJsR/5WfEv+SnBH/maES/5Kc - EP+CjQ//g4wO/4SMDv+Gjg//ho0O/4WMDf+Hjw7/jpQQ/5CWEP+MkhD/iIwP/4WKDP+Jiwz/jo0N/5CM - DP+PjAz/jIoK/4uHC/+KhAv/hoQL/4OBDf+Dfw7/gX0M/397C/9+egz/f3gM/4F3DP+CeQ3/gngN/4J4 - Df+CeA3/gHYO/4B1Dv9/dA7/f3MO/39yEP9+cBH/fW8P/3xuD/98bRD/fW0Q/39vEv+BcBH/gnIS/4V0 - D//m5NrY4uDevtTRzKvHw72bu7avjuno5tkTEhHaAAAAmQAAAIMAAABxAAAAYwAAAFUAAABHAAAAOgAA - AC0AAAAXAAAAHAAAACYAAAAxAAAAPgAAAFQAAABtAAAAyNrY1+jCvbecysbBqNnX07n07/LObJtg+ESF - NP9NjD3/VJc+/12kQP9mq0D/aas8/2ikN/9imDP/XI0w/1uJLf9diiz/Y5It/2+2L/9x1zH/ZrIt/2GF - Jf9ifCL/ZIEg/2SBH/9lgR7/aIEd/2qDHv9uhRv/cYob/3eMGv98kBv/gJMa/4eWGf+Jmhj/jZoW/46a - FP+Qmh7/jJUh/4GKEf+AiBL/g4oR/4WNEv+FjRD/gooO/4CJD/99hg7/fIQP/3uDD/97gw7/e4MO/3uE - D/+BiQ7/h5AP/42XD/+TnhD/l6AP/5OcD/+cpBL/kZkQ/4WODf+Gjgz/hY4M/4ePDv+Gjg7/hYwN/4mP - Dv+Plg7/kJcP/4uQDv+Hig7/hokM/4qLDP+OjQz/kY0N/4+LDP+NiQv/jIcL/4mEC/+Hgwr/hYEL/4F9 - Df+AfAz/f3oL/355C/+AeQz/gncM/4N4DP+CeA3/g3gN/4N3Dv+CdQ3/gnUN/4JzDf+Acw7/f3IO/4Bw - Dv9/bw//fW4O/3xuDv9+bg7/gHAQ/4BxEP+CcxH/hnUR/+bk29jj4N6+1NHMq8bDvZy5tK6N6unn2hMS - EdoAAACZAAAAgwAAAHEAAABjAAAAVQAAAEcAAAA6AAAALQAAABcAAAAcAAAAJgAAADEAAAA+AAAAVAAA - AG0AAADI2djX6MG9t5zKxsGn2dfTuvTv8s9rmV74RYUx/1SWO/9gpj7/Z7E//2mvPf9mpTn/YJgz/16O - L/9ciCz/X4os/2idLv9xyjH/bNIx/2CYKf9deyP/YX4i/2WDIf9lgx//Z4Ie/2iCH/9qgh3/bYMd/3CG - G/9zihn/eIwZ/32QGv+Ekxf/ipYY/4yaF/+QmhX/kJoT/5GaHv+MlCD/f4gR/4CHEv+EihH/hY0Q/4OM - D/+Ciw//gIkM/36GDf99hQ7/e4QN/3uEDf97hAz/foUN/4KKDf+JkQ7/kJgP/5WdEP+Wng7/lJwP/52k - Ev+Olg7/ho4N/4aODP+Ijwz/iI8M/4eODf+IjQ7/jJMO/5GYDf+Qlg7/i44O/4eJDf+JiQv/jYwL/4+O - Cv+RjAv/kIoM/4yIC/+Lhgv/iYQL/4iBCv+EgAr/gX0M/4B8DP+AeQr/f3gK/4F4DP+Bdwv/gngM/4J4 - Df+Ddwz/hHcM/4N1Df+CdA3/gXQN/4B0Dv9/cg3/gHAN/39wDv9+bw//fW8P/35vD/+AcBD/gnIP/4R1 - EP+GdxH/5uTb2OPg3r7U0MurxsS9nLi0rY7q6efaExIR2gAAAJkAAACDAAAAcQAAAGMAAABVAAAARwAA - ADoAAAAtAAAAFwAAABwAAAAmAAAAMQAAAD4AAABUAAAAbQAAAMjZ2NfowL24ncnHwqjZ1tO59O7yz3Cd - XPhPkjL/YKc7/2auO/9nrjv/Y6U4/16ZNP9bkS//XIst/2COLP9qrS7/cNoy/2bDLf9bgyP/Wncj/15+ - Iv9igSD/ZYIf/2eDIP9ogx//aoId/2qCHP9sghz/cYUZ/3WKGP96jBj/gJAY/4eTF/+Klhb/jZkV/5GY - Ff+QmRL/kpsf/4uUH/9/hxD/gIcS/4OJEP+Fiw//hIwP/4GKDv+AiA3/f4YN/36FDP98hAv/e4QL/3yE - C/9/hwv/hIwO/4uSDv+SmRD/mJ8Q/5idDv+ang7/nqQQ/4uUDv+Gjg3/ho4M/4mPDP+Jjwz/iI0L/4mP - Df+PlQ7/lJkN/5CVDf+Jjg7/h4oM/4yKDP+Qjgz/kI4K/5GNC/+Pigv/jIgL/4uGC/+JhAr/iIEK/4R/ - Cf+BfQv/gHwM/4F5Cv+CeAv/gngM/4J4DP+CeAz/gngM/4N4DP+Edwz/g3YN/4J1Df9/dQz/f3MN/4Bz - Df+AcAz/fnAM/31vD/9/bw//f28P/4BwD/+Ccw//hXYR/4d4EP/m5NvY4+Dev9TQy6vIxL2cubStjurp - 59oTEhHaAAAAmQAAAIMAAABxAAAAYwAAAFUAAABHAAAAOgAAAC0AAAAXAAAAHAAAACYAAAAxAAAAPgAA - AFQAAABtAAAAyNnY1+jBvbidyMfCqdnW1Lrz7fLPd6pc+FmeMP9jqTj/Y6k2/2CjNv9dmzX/XJUx/12Q - Lv9ili7/bsAx/2zhMv9grir/WHgj/1l4IP9bfCH/Xn8f/2SCHv9mgh7/aYMe/2qCHP9rghr/a4QY/2+E - Gv9zhhr/d4oY/32NF/+DkBX/h5QU/4uWFP+OmBX/kZgV/5GYE/+UmSH/jJId/4GJDP+Bhw7/hIkP/4WL - Dv+Fiw7/g4gM/4KHDf+AhQz/foUL/32EC/99hAv/fYUL/4CIC/+GjQ3/jZQN/5SbD/+ZoQ7/l54N/56i - Dv+eog//jJEN/4mPDP+Kjwz/i5AN/4qPDP+Kjgv/jZAM/5GWDf+UmQ3/kZUN/4qNC/+JiQv/j4wL/5KO - Cf+Sjgr/ko0L/5CKCv+OiAn/i4cJ/4mECv+HgQr/hn8K/4N9Cv9/fAr/gXkJ/4J4Cf+CeQv/g3gL/4R5 - Cv+EeAz/hHgM/4N3C/+Ddg3/gnUN/4F1DP+Bcw3/gHIM/4BxDf9+bwz/fm4N/35vDP9/cAz/gXIN/4N0 - D/+FdhD/h3kO/+bk2tji4N6/1NDLq8XDvZ24s62O7Onn2hMSEdoAAACZAAAAgwAAAHEAAABjAAAAVQAA - AEcAAAA6AAAALQAAABcAAAAcAAAAJgAAADEAAAA+AAAAVAAAAG0AAADI2djX6MO+uJzJx8Ko2NbTuvLs - 8s96sFv4V58t/1ygM/9cnjT/W5w0/1yaM/9flzD/ZqIw/27TNP9p2zH/XJon/1dxIf9ZeSD/WHog/1x6 - IP9ffh3/Y4Ee/2aCHP9oghz/aYEb/2uBGP9sghn/boQZ/3KHF/95ihf/fo0V/4OPFP+GkxP/i5YT/5CX - FP+SmRT/kJcT/5OXIf+Mkhr/gYgK/3+GDf+DiA7/hYwO/4WLDf+DiQ3/gYcK/4CFCv99hQr/foQJ/36E - Cf+AhAv/g4kK/4iPDP+QlQ3/mJwN/5ygDf+anQ3/oaQO/5yeDf+MkAz/i48L/4uQDP+LkAz/jI4M/4yP - C/+OkQ3/kpcN/5SZDP+Okgz/iYwL/4uJCv+Qjgr/kpAJ/5KPCv+RjQr/kIoK/46ICf+Lhwn/iIMI/4eC - Cf+Gfwr/gnwJ/357CP+AeQj/gXkI/4F5Cf+CeQr/gnkK/4N4Cf+DeAv/hHgM/4J1C/+CdQv/gXQM/39z - Df9+cgz/f3EL/35vDP9+bgv/fnAM/4ByDf+CdA7/hHYQ/4Z3Ef+HeQ//5uTa2OPg3r/T0MusxsO8nbu0 - ro3r6efaExIR2gAAAJkAAACDAAAAcQAAAGMAAABVAAAARwAAADoAAAAtAAAAFwAAABwAAAAmAAAAMQAA - AD4AAABUAAAAbQAAAMjZ2dfow7+5nMvIw6fa2NS68+zzz3erWfhRlCr/VZUw/1eXMv9anDL/YJ8x/2my - Mv9u4Df/Zc0y/1qJJv9XciH/WXoh/1p7H/9aeR7/Xnoe/2F+Hv9kgR3/aIQa/2qDGv9qghn/bIMX/22C - GP9vhBj/dIgW/3qKFf9+jRX/hJEU/4iVE/+MmBP/kZkU/5GZEv+QlxL/k5cj/4uQGf+Ahgr/gIYO/4SJ - Df+Giw3/hooN/4SIC/+Chwr/gIUK/3+GCv9/hQr/gIUK/4GGCf+Fiwv/i5EM/5GXDf+anQ3/naAO/5ue - Df+ipg3/lpwL/4uRC/+LkAv/i5EL/4yRCv+Mjwv/jJAL/5CUC/+WmQv/lZkL/46RCv+Liwr/josK/5KO - Cv+Tjwr/k44K/5KMCv+Qigr/jogJ/4yGCf+KhAn/h4EI/4R+Cf+DfAn/gHsI/4F5CP+Begj/gnoJ/4J5 - Cv+DeQr/g3gJ/4N3Cv+Ddwz/gnYL/4J1C/+BdAz/gHIM/39xC/9/cAv/fm8L/39vDP9/cAz/gHIN/4J0 - Dv+FdhD/h3kQ/4l7D//n5NvY4+Dev9PRy6vIxL2cubStjuro5tsTEhHaAAAAmQAAAIMAAABxAAAAYwAA - AFUAAABHAAAAOgAAAC0AAAAXAAAAHAAAACYAAAAxAAAAPgAAAFQAAABtAAAAyNnZ1+jDv7mcy8fDp9rY - 1Lr07/TPdKJV+E2IJf9VkC7/V5cw/1+jMv9qwDb/bOk5/2C/MP9Zgif/WHYk/1p6If9Zeh//W3kd/1t4 - HP9dehv/Yn4d/2aBG/9pgxj/bIIY/2uDF/9sghf/boIW/3KDFv91hxT/e4oU/4CNFP+HkRP/ipUS/4+X - E/+RmBH/kZgP/4+WEf+TmSL/iI8V/3+FCP+Bhgz/hIoN/4aKC/+FiQr/g4cJ/4OHCf+BhQj/f4QJ/3+E - Cf+AhQn/g4cJ/4eMCv+Nkwv/lJkM/5ufDP+coA3/nJ8M/6OmDv+TmQv/i5IK/4uRCv+Nkgv/jpEK/4yQ - Cv+OkQr/k5gK/5qaC/+Wlgz/j48K/42MCf+QjQj/k44K/5SQCf+Ujwn/kowJ/4+KCP+Nhwj/jIYJ/4qD - CP+HgQj/hH8I/4N8CP+Cewj/gXoH/4J6B/+DeQj/g3kH/4N5CP+DeAn/gncJ/4N3Cf+BdQr/gHQK/4Bz - C/9/cwv/fnIL/31xCv99bwr/fnAM/39wC/+Bcwz/g3UN/4V3Dv+Ieg//inwO/+bk2tji4N6/1NHMq8fD - vJ23sayQ6ejm2xMSEdoAAACZAAAAgwAAAHEAAABjAAAAVQAAAEcAAAA6AAAALQAAABcAAAAcAAAAJgAA - ADEAAAA+AAAAVAAAAG0AAADI2djX6MS+up3MxsOp2tfUuvTv9M9xnFT4TIQl/1iQLv9gozH/a882/2vo - Of9gsS//WYQm/1l/JP9afSH/W3of/1t6Hv9beRz/W3gb/117Gv9hfhv/Z4EZ/2qDGP9sghf/a4MX/22C - Ff9vghT/coMV/3WGE/98ixT/go0T/4aREv+MlBL/kJYR/5GXEP+Rlw//kJYR/5OYIf+HjhL/gIUJ/4GF - DP+Eig3/howL/4aJCv+Ehwn/g4cJ/4GFCP+AhAn/gIQI/4CFCP+Dhwn/h40J/4+UC/+Ymgv/naAM/5yg - DP+eoA3/oaUN/5KXCf+LkQn/jJEK/42RCv+NkQr/jJEJ/4+UCv+VmQr/mpoL/5WUC/+Qjgr/jowJ/5KO - CP+Ujwn/lJEH/5SPCf+SjQj/kIsI/46ICP+MhQj/ioMI/4eCB/+EgAb/g3wH/4F6CP+Begf/gnoH/4N5 - B/+DeQb/g3kI/4N4Cf+DeAn/g3cJ/4F1Cv+AdAr/fnML/35zC/99cQr/fXAK/31vCv99cAv/fnEL/4F0 - DP+Ddg3/hXgN/4h7D/+KfA3/5uTa2eLg3r/U0MysxsG8nrexrJDp6ObbExIR2gAAAJkAAACDAAAAcQAA - AGMAAABVAAAARwAAADoAAAAtAAAAFwAAABwAAAAmAAAAMQAAAD4AAABUAAAAbQAAAMjZ2NfoxL66nczH - xKna1tO69O/zz3GaVPhNhiT/XaIv/2jWN/9o5Dn/XKUt/1mGJ/9Zhib/WYIi/1t9H/9beh3/XHoc/115 - G/9deBr/XnoZ/2F+Gv9ogRj/bIMW/2uCFv9rghb/boEU/3CBE/9zgxT/d4cT/3qLEv+CjhP/h5AR/4uT - Ef+Olg//kZYQ/5CWDv+PlRH/lJgh/4eMEf9+hQf/gYYL/4aKC/+Gigr/hokK/4SHCf+Dhwn/goYJ/4GF - Cf+Chgj/gYUH/4OJBv+Jjwf/kpUH/5qbCf+foQz/nKAL/6CkCv+hpAr/kJQJ/42QCf+NkAn/jpEK/42R - Cv+Okgn/k5UJ/5qYC/+ZmQr/k5MK/4+NCf+PjAj/ko4I/5SRBv+UkQf/k48I/5GLB/+Qign/jogI/4yF - CP+JgQj/hoEH/4N/Bf+DfAf/gnsI/4F6Bv+Aegf/gnkI/4J3B/+DeAj/gncJ/4N4Cf+Bdgj/gXQK/4Bz - Cf+Acwv/f3IK/31wCP99bwn/fW8J/39wCv9/cgv/gHMK/4N1DP+Gdw3/iHoN/4t+Df/n5drZ4uHev9LP - y6zFv7yft7KskOro5tsTEhHaAAAAmQAAAIMAAABxAAAAYwAAAFUAAABHAAAAOgAAAC0AAAAXAAAAHAAA - ACYAAAAxAAAAPgAAAFQAAABtAAAAyNnY1+jDvrqdzMfEqNrW1Lr17vPPcp1S+FWfJf9k3DX/YNk1/1qZ - LP9ZiSj/W4wn/1qHJP9ZgiD/WXwd/1t5HP9cehv/XXka/114Gv9gexn/ZX4X/2iBFv9rghb/a4IV/2yB - Ff9wgBT/cYET/3OEEv95hxH/fYsR/4ONEP+IjxH/i5IP/4+WD/+Qlg3/j5YK/5CVEP+TliD/hooO/4GD - B/+BhQr/hYkL/4WJCf+FiQj/hIcI/4OGCf+ChQf/goUH/4KFB/+ChQf/hYoI/4uQCP+Ulgf/m50I/5+g - DP+cnwv/pKYK/56hC/+Skwj/kZII/5GRCP+Skgn/kZAK/5GRCf+Wlgv/mpoK/5maCv+Tkgj/j40I/5GM - CP+Ujwj/l5EI/5aRCP+Tjgj/kYwI/5CLB/+OiAf/i4QI/4mCB/+HgAX/hX4G/4J8Bf+CfAb/gXsE/4B6 - Bf+Cegf/gngG/4J4Bv+Cdwf/gncI/4F2CP+AdAn/f3QJ/35zCP99cgn/fHAJ/3tvCP98cAn/fXEJ/39y - Cf+BdAr/hHcN/4Z6DP+Iew3/in0N/+bk2tni4d6/0s/LrcXAvJ+3sqyQ6ejm2xMSEdoAAACZAAAAgwAA - AHEAAABjAAAAVQAAAEcAAAA6AAAALQAAABcAAAAcAAAAJgAAADEAAAA+AAAAVAAAAG0AAADI2djX6MO+ - up7Lx8Sp2tbUu/Ts8896ulX4Wt0r/1rKMf9VjSj/V4op/1mQKP9aiiX/Wocj/1mAH/9Zexz/XHob/114 - G/9ceBr/XHcY/196F/9lfRX/aIAV/2uCFv9tgRX/boEU/29/Ev9xgRL/c4QQ/3qGD/9/ihH/g4wR/4iP - EP+Lkg7/j5YN/4+WC/+QlAj/kZUR/5KWIf+EiA3/gYQH/4KFCf+Fhwr/h4gJ/4aIB/+Fhwj/hIUI/4KF - B/+DhQf/goUH/4KFCP+Iigf/j5AI/5aYCP+cngj/n6EL/52fCv+mpwv/nZwL/5GSB/+RkQf/kpII/5KS - CP+RkAj/k5EJ/5iWC/+bmwn/mJcI/5KQBv+QjQf/ko4G/5WRCP+XkQb/lpAH/5ONCP+Riwj/kIoF/46H - Bv+Mgwj/iYMG/4iABv+Ffgf/hHwF/4F8Bf+CeQb/gnkH/4J4B/+DeQj/gngH/4J3B/+Cdwb/gXYJ/390 - Cf9+cwn/fHEI/3twCP97cAj/e28I/3pvCP99cgr/gHMJ/4N1C/+Edw7/hnoN/4h9DP+Kfw3/5uXb2eLg - 3r/Sz8utxcC8n7exq5Hp6ObbExIR2gAAAJkAAACDAAAAcQAAAGMAAABVAAAARwAAADoAAAAtAAAAFwAA - ABwAAAAmAAAAMQAAAD4AAABUAAAAbQAAAMjZ2dfow767nsvHw6na1tS69Ojy0HzoWvhQuCX/UYIl/1aG - Jf9ZkCf/Wo4m/1uLI/9ahSH/WoAd/1t8G/9beRn/XHgZ/1x4GP9cdxf/XnkW/2R8Ff9ofxT/bIEU/26B - E/9tgBH/boAQ/3CCEP90gw7/e4YP/3+KEP+EjRH/iJAO/4yTDf+OlQv/jpUJ/4+UCP+QkxD/kZUh/4OI - C/+AhAb/gYUI/4SICP+Ghwf/hocG/4WGBv+Dhgb/goQH/4KEBv+BhAb/hIYH/4mMBv+Rkgb/mJoG/52e - B/+enwn/np8J/6WnCv+amgf/kpEI/5KSCP+TkQf/kpII/5KRB/+Vkwj/mZgJ/5qbCv+WlAn/kY4H/5CM - CP+Tjgf/lpAH/5aRBv+Wjwf/lI0I/5KKB/+QiAX/jYYH/4uECP+IggX/hn8F/4V9B/+EfAX/g3wF/4N6 - Bv+DeQX/gngF/4N4CP+Bdgb/gXYG/4F2Bv9/dQf/fXMI/3xyCP98cQn/e3AI/3pvB/96bwf/em8I/31y - Cf9/cgj/gnYK/4R4DP+FeQz/iX0N/4p/Df/m5dvZ4uDfwNLOy67Fv7yft7KskOro5tsTEhHaAAAAmQAA - AIMAAABxAAAAYwAAAFUAAABHAAAAOgAAAC0AAAAXAAAAHAAAACYAAAAxAAAAPgAAAFQAAABtAAAAyNnZ - 1+jCv7ueysfDqdjX07v17fPQcaxQ+Ep2G/9UfyT/Vooj/1qPJf9ajiX/XIsi/1uGIP9bgB3/XXwb/1x5 - Gf9ceBj/XHgW/1x3Fv9geRb/ZHsU/2h+E/9tgRP/bYAS/21/EP9vgA//cYIO/3eED/98hg7/f4kP/4SN - Dv+IkQ3/i5MM/42UCv+PlQr/j5MI/5CTE/+RlR//g4gI/4CEBv+ChQj/hYgH/4eIB/+Ghwb/hIYG/4OG - Bv+ChAb/goQG/4OFB/+Fhwf/i40G/5OTB/+amwb/np8H/5+gCP+iogj/p6cK/5iXCP+Tkgj/k5MI/5SS - CP+Skgj/k5EH/5aUCP+amQj/mpkJ/5WTCP+Rjgf/kI0G/5SPB/+XkQf/l5EG/5eRB/+Ujgb/kosG/5CJ - B/+Nhwf/i4MG/4iBBv+GfwX/hX0F/4R8BP+EfAT/g3sE/4N7A/+DegT/gnkG/4J3Bv+AdQX/gXYG/4B1 - Bv99cwf/e3EH/3twB/97cAf/em8H/3pvB/97cQf/fXMI/4F1CP+Ddwr/hHkL/4Z7C/+Kfg3/in8M/+Xl - 2tng397A0s3KrsXAu5+3sqyQ6ujm2xMSEdoAAACZAAAAgwAAAHEAAABjAAAAVQAAAEcAAAA6AAAALQAA - ABcAAAAcAAAAJgAAADEAAAA+AAAAVAAAAG0AAADI2dnX6MK/up7LyMSp2tfUu/Xw89BvjEv4SnYa/1KC - If9WiSL/Wo8j/1qPI/9ciyH/XIUf/1yBHf9cfBv/XXgY/1t3F/9beBX/XHcU/2F2Ff9lehP/aX0T/2x/ - Ef9tfw//bX4P/29/Dv9wgA3/doMN/3qGDf+AiA3/g4wN/4eQC/+KkQr/jpMJ/4+UCP+Nkgf/kZMU/5GU - Hv+Chwb/foMF/4OEBv+Ghgb/iYgG/4eGBf+EhQX/hIUG/4OEBv+DhAb/g4UG/4eHBf+OjQX/lZUG/5ub - B/+goQX/oJ8G/6WjB/+lpAj/lpQF/5ORBv+Ukwf/lJMH/5SSB/+Ukwb/lpYH/5yaCP+amAf/lJIE/5GN - BP+Sjgb/lpEG/5eSB/+YkQb/l5AF/5ONBP+RiwX/j4gF/4yGBf+LhAX/iIEF/4Z+Bf+FfQT/hHwD/4R8 - A/+DewT/g3sE/4J7A/+CeQT/gXcF/4F2Bv+Bdgb/f3MF/31yB/97cQb/e3EF/3pvBv96bwf/enAH/3xy - Bv9/cwf/gXUJ/4N3Cv+Fegr/h3wM/4l+DP+LgQr/5eXa2eDf3cDSzsquxcG8n7eyrJDp6ObbExIR2gAA - AJkAAACDAAAAcQAAAGMAAABVAAAARwAAADoAAAAtAAAAFwAAABwAAAAmAAAAMQAAAD4AAABUAAAAbQAA - AMja2dfow7+6nsvIxKna19W89fD10G+RS/hJdxj/UoEg/1aIIf9ajyD/XJAg/12LH/9chR//XIEc/1x8 - GP9ceRb/W3YW/112FP9fdBT/YXcU/2R6E/9ofRH/bH8Q/21/EP9tfg//bn4O/3F/Df94gg3/e4UO/3+I - DP+DjAz/h48L/4yRC/+PlAr/j5MH/5CRBv+SlBX/kJId/4GGBf9/ggX/goMF/4SGBP+IhwX/h4YF/4SF - Bf+DhAX/g4QG/4OEBv+DhQT/h4kE/4+NBf+WlQX/m5wG/6CiBv+foAX/paUG/6OiB/+Vkwb/k5IG/5ST - B/+Ukwf/lJIH/5WTBf+Zlwb/nJoH/5mVBv+TkAX/kY4E/5SPBf+XkQb/mJEG/5iRBv+Wjgb/lIwF/5KK - Bf+PiAb/jIUH/4uCBv+IgQX/hn4F/4V9A/+EfAP/hHwD/4N7BP+DewT/gnkF/4J4Bv+AdgT/gXYG/350 - Bf99cwX/fHIH/3txBv96bwf/eW4G/3lvBv96cQX/fHIH/31zB/9/dQn/gncK/4V6Cv+HfAv/iX4N/4uB - C//m5NrZ4t/dwNHOy67FwbyftbCrkeno5tsTEhHaAAAAmQAAAIMAAABxAAAAYwAAAFUAAABHAAAAOgAA - AC0AAAAXAAAAHAAAACYAAAAxAAAAPgAAAFQAAABtAAAAyNrZ1+jFv7yezMjEqdrX1bz18PXQbpBJ+Eh1 - F/9SgB//Vocg/1mPH/9ckCD/XIwe/1yFH/9bgBv/WnsY/1t3Fv9bdhb/XnUU/190Ff9hdhP/ZHkS/2h8 - Ef9rfBD/bX4Q/21+D/9vfQ7/dH8N/3iCDf97hA3/f4gL/4OLC/+Ijgn/ipEK/4yTCP+Pkgf/kY4I/5KU - Gf+Okhz/gYUE/3+BBf+ChAX/hIcE/4iGBf+GhQT/hIUG/4OEBv+DhAb/g4QG/4OFBf+IiQT/j5AF/5eW - B/+enQX/oaIG/6CgBP+npwb/n58F/5SSBv+UkQb/k5EG/5SSB/+Tkgb/lZQF/5uZBv+bmgj/lZIF/5GO - A/+SjgT/lJAF/5eRBv+YkQb/mJEG/5WOBP+Tiwb/kYkF/4+HBf+LhAb/ioEG/4eABf+FfgX/hHwD/4R8 - BP+EfAX/hHwF/4N7A/+CeQX/gXcG/393BP9+dgP/fXQF/3xzBP97cQX/e3EG/3puB/95bgb/eW8G/3px - Bf98cgf/fXMH/351CP+CeAj/hHkK/4Z8C/+Ifw3/jIEL/+bk2tng3t7B0c7LrsXBvZ+3squR6ujm2xMS - EdoAAACZAAAAgwAAAHEAAABjAAAAVQAAAEcAAAA6AAAALQAAABcAAAAcAAAAJgAAADEAAAA+AAAAVAAA - AG0AAADI2tjX6MTAvJ7MyMWp29jWvPXw9dBtkEj4R3QX/1GAHv9Whx7/Wo8g/1yRIP9cjB3/XIYc/1yA - G/9cehj/W3YW/1x0Ff9dcxX/XnQV/2F1Ev9jeRH/Z3wQ/2p7D/9sfBD/bnwN/298Df90fg3/d4EN/3qE - DP9+iAv/hIoK/4iNCv+KkAn/jZIJ/42RCP+Ojwj/k5Qc/46RG/+BgwL/f4AG/4KCBP+EhQT/h4UF/4aF - Bf+ChAb/goMF/4KDBf+DhAX/hIUF/4uKBf+RkAb/mJgG/5+eBv+goQb/oKAF/6inBv+cmwX/k5EG/5OQ - Bf+UkQb/lJEG/5SRBv+WlQb/m5kH/5mYBv+Tkgb/kY4E/5ONBv+Vjwb/mJEG/5iRBv+XjwX/lIwF/5KL - Bv+QiQf/joUG/4qCBf+JgQX/h4AF/4V+A/+EfAP/hHwD/4R7Bf+EfAX/g3sD/4J5BP+BdwX/fncF/311 - BP99cwX/e3EF/3twBf96bwX/d28G/3ZuBf93bwX/eXEF/3xxBv98cgb/f3YH/4B3CP+Eewn/hn0K/4iA - Cv+Mgwn/5uPa2uDf3cDS0MquxMG8oLayrJLq6ObbExIR2gAAAJkAAACDAAAAcQAAAGMAAABVAAAARwAA - ADoAAAAtAAAAFwAAABwAAAAmAAAAMQAAAD4AAABUAAAAbQAAAMja2dfoxcC8ns3Jxanb2Na89vD20G6O - SfhIdBX/UX8d/1WGHf9bjR7/XJAe/12MHf9bhhr/XH8Z/117F/9cdxX/XXMU/15zFP9echP/X3QS/2N3 - Ef9oeg//a3wO/2x9Dv9tew3/bnsN/3J+DP91gAv/eoMM/3+HCv+DiQr/ho0J/4mPCf+MkAr/jI8J/4uO - B/+TlR3/jY8Z/3+BAv9/fwX/goIE/4KEA/+GhAT/hYQG/4KDBf+Cgwb/goIG/4KDBf+Hhgb/jYsF/5OR - Bf+ZmAX/n58G/5+fBv+hoQb/p6UG/5mXBP+SkAX/lJEG/5SRBv+TkAb/lJEF/5iVBv+bmAb/mJYF/5KQ - Bf+QjAb/k4sH/5eQBf+YkQb/mJAG/5WOBv+TjAb/kYoH/4+HBv+NhAf/ioIG/4mBBf+GfwT/hHwD/4R8 - A/+EfAP/g3sE/4N7BP+DegT/gXgF/4B2BP9+dQT/fHMF/3tyBP97cQb/em8F/3duBP90bgX/dG4F/3Ru - Bf93cAX/enIH/31zB/9/dgf/gHgI/4N7Cf+FfAn/iYAI/4uDCf/l49ra4N/ewdHPy67EwLugtrKrkuro - 5tsTEhHaAAAAmQAAAIMAAABxAAAAYwAAAFUAAABHAAAAOgAAAC0AAAAXAAAAHAAAACYAAAAxAAAAPgAA - AFQAAABtAAAAyNrZ1+jFwLyfzcnFqdvY1rz28PbQcI1I+Eh0FP9Rfhz/VYUe/1qNHf9djx7/XYwc/1yH - Gf9dgBn/XHsW/1t3FP9ccxT/XnMU/15yE/9edBH/YncQ/2d5D/9qfA3/a3wN/2x8Df9tfA3/c30L/3WA - DP96ggv/f4YK/4SJCv+HjQn/iI8J/4qPCP+Ljwn/io4I/5KWIP+Ljhb/f4EC/35/BP+BggT/g4QD/4OE - BP+DhAT/goMF/4KDBv+Cggb/goMF/4eGBv+NiwX/lJIF/5uYBv+fnwb/n54G/6SiB/+lpQf/lZMF/5KQ - Bf+TkAX/lJEG/5OQBf+UkQX/mZQF/5qXBv+WkwX/ko0G/5CLB/+TjAf/l5AF/5iRBv+XjwX/lY0F/5OL - Bv+RigX/j4YG/4yDBv+JgQX/iIAF/4V9BP+EfAP/hHwD/4N7A/+DewT/g3sE/4N5Bv+Bdwb/gHYE/390 - BP98cwT/enEE/3pwBf93bgT/dG4F/3RuBf90bgX/dG4F/3VvBP93cQb/fHMH/392B/+BeAj/gXoI/4R9 - Cf+JgQj/i4QJ/+Xk2trg397B0c/LrsTAu6C2sqyS6ejm2xMSEdoAAACZAAAAgwAAAHEAAABjAAAAVQAA - AEcAAAA6AAAALQAAABcAAAAcAAAAJgAAADEAAAA+AAAAVAAAAG0AAADI2tnX6MXAvJ/NyMWq29jWvPbx - 9tBvjUf4R3IV/1F9Hf9VhR7/Wo0d/12QHf9djRv/XIgZ/12BFv9cexb/W3YU/1xzE/9echP/XnET/2Bz - EP9kdhD/aHkP/2t7DP9rewz/bHwM/2x8DP9xfQv/dn4L/3mDCP9/hQn/g4kJ/4eMCf+IjQr/io8I/4uP - CP+LjQj/k5Yi/4uMFP9/gAD/fn8E/4GCA/+DhAP/g4QE/4OEBP+Cggb/goIG/4KCBv+CgwX/h4YG/46M - Bf+Ukwb/nJoF/5+fBv+fngb/o6QF/6GiBv+TkQX/k5AG/5OQBf+UkQb/k5AG/5WSBv+ZlQb/mZYF/5SR - Bf+RjQb/kosG/5ONBf+XkAX/mJEG/5aPBv+UjAj/kokH/5CHBv+OhQb/jIMG/4mBBf+IgAX/hX0E/4R8 - A/+EfAT/g3sE/4N7BP+DewT/gnkF/4B2Bv9/dAX/fXQF/3xyBv93cQT/dnAE/3RuBP90bgX/dG4F/3Ru - Bf90bgX/dXAE/3dyBf95dAf/fnYH/4F4CP+Bewn/hH0L/4mCCv+Kgwj/5eTa2uDg3sHRz8uuw8C7obWy - rJPq6ObbExIR2gAAAJkAAACDAAAAcQAAAGMAAABVAAAARwAAADoAAAAtAAAAFwAAABwAAAAmAAAAMQAA - AD4AAABUAAAAbQAAAMjZ2NfpxcC8n83Jxarc2ta89vH20G+MR/hIcRT/UHwc/1SEG/9ZjBz/W5Ac/12M - G/9dhxj/XYAW/1x7Fv9bdhT/W3MT/11xEv9dcRH/X3IQ/2R1D/9peQ3/a3oN/2p6C/9rewz/bHoL/298 - Cv91fwr/eoII/36FCf+CiQn/howJ/4iOCP+Ljgn/io0I/4qNCP+UliT/iYsS/32AAP99fgP/gYEE/4KD - A/+CgwT/goME/4GBBf+BgQX/gYEF/4KCBv+HhwX/jo0F/5WTBf+cmwX/oJ8G/6CdBf+mpgX/n54F/5OP - Bf+TkAb/lJAF/5SQBf+Tjwb/lpMF/5mVBv+ZlQb/lI8E/5GLBf+SigX/lI0F/5eQBv+XkAX/lo0G/5OL - B/+RiQX/j4YE/42EBf+LggX/iIAF/4Z+BP+EfAP/hHwD/4N7BP+DewT/g3sE/4N7BP+CeAX/gXYG/390 - BP98cwX/e3EF/3dwBP90bgP/dG4E/3NtBP9zbQT/c20E/3VvBf93cQX/d3IF/3l0B/97dQf/f3gH/4J6 - CP+Ffgj/ioMJ/4mAB//l5Nra4N/dwdHNyq/DwLuhtbKsk+ro5tsTEhHaAAAAmQAAAIMAAABxAAAAYwAA - AFUAAABHAAAAOgAAAC0AAAAXAAAAHAAAACYAAAAxAAAAPgAAAFQAAABtAAAAyNnY1+nGwbyfzsvGqdza - 1rz28fXQb4tG+ElyEv9SfBr/VYQb/1qMG/9dkBv/Xowb/12HGP9dgBf/XHsW/1p2E/9bchL/XHES/11x - Ef9fchD/ZHUP/2d4Df9qeQ3/anoM/2t7DP9teQz/cXsJ/3V/Cv95ggn/foUI/4GICf+GjAn/iY0I/4qO - Cf+KjQf/io0J/5SWJ/+IiQ//fYAA/31+A/+BgQT/goMD/4KDBP+BggT/gYEF/4GBBf+BgQX/gYIG/4mI - Bf+RjQX/lpQH/52bBv+hngb/oJ0F/6imBv+cmAX/k48E/5OQBv+VkAb/lY8F/5aPBf+ZkwX/mpUG/5eT - BP+TjQX/kYsE/5KKBf+VjQX/mJAG/5ePBf+WjQb/lIsG/5GIBf+PhgX/jIMF/4qCBf+IfwX/hn0E/4R8 - Av+EfAP/g3sE/4N7BP+DewT/gnoF/4F4Bf+AdQX/f3QE/3xzA/97cQX/d3AE/3NtA/9zbQT/c20E/3Fr - BP9ybQT/dG8F/3dwBf93cgX/eXQG/3p2B/98eAf/gXoJ/4aBB/+Iggf/hXsH/+Xj2trg3t3C0c3Kr8PA - u6G1sqyT6efm3BMSEdoAAACZAAAAgwAAAHEAAABjAAAAVQAAAEcAAAA6AAAALQAAABcAAAAcAAAAJgAA - ADEAAAA+AAAAVAAAAG0AAADI2djX6cfDvp7Py8aq3drWvPfy99BwikX4SXER/1N8Gf9Wgxn/Wowa/2CP - Gf9fjBn/XYYZ/1yAF/9cexb/WnYT/1pyEv9dcBL/XG8Q/2BxEP9kdA7/ZncM/2l4DP9peQz/ankL/2t5 - Cv9xfAr/dX4J/3iBCP99hQj/gYgI/4WKCP+JjAj/i44I/4qMBv+KjQr/lJUp/4aGDf99fgD/fH4E/3+A - BP+BggT/gYIE/4CCBP+AgQT/gIAE/4GBBf+Dgwb/i4kE/5KPBf+Ylgf/nZwF/6GeB/+gnwX/qKQH/5mU - Bf+Tjgb/kpAG/5SOBf+Vjwb/lZAF/5iSBf+alAX/lZAE/5KKBv+RiQb/k4wG/5eOBf+XjgX/lo4G/5WM - Bf+TiQb/kYYE/4+EBv+Lgwb/iYEF/4d+Bf+EfAT/g3wD/4R7BP+DewX/g3sE/4N7A/+CeAb/gHYF/350 - BP99cwX/fHID/3pwBP93bwP/cm4D/3JsBf9ybQX/cGsD/3FtBP9zbgX/d3EE/3dzBf95dQX/enYG/3t3 - B/+Aewj/hoEH/4aBCP+Aegb/5OLZ2uDe3cLRzcqvw8C7obWyrJTp5+bcExIR2gAAAJkAAACDAAAAcQAA - AGMAAABVAAAARwAAADoAAAAtAAAAFwAAABwAAAAmAAAAMQAAAD4AAABUAAAAbQAAAMjZ2Nfpx8O+oM/K - xqvd2da89/L30G+KRfhJbxH/U3oZ/1WCGf9aixn/X48Y/16LGP9dhxj/XH8W/1x7E/9bdRL/XHER/11v - EP9dbg//YHAP/2NzDf9mdgz/aHgM/2l4DP9pdwv/a3gJ/3B7Cf91fQj/eIAI/32EB/+Bhwj/hIkJ/4iL - CP+LjAf/iIwH/4uMDP+VlSr/hIUK/3x9Av97fAT/f4EE/4GCBP+BggT/gIAD/39/BP+AgAP/gIAE/4WD - BP+MiAX/k5AG/5iYBf+enQX/n5wH/6KgBv+mogb/l5EE/5SNBv+Ujgb/lI0G/5ONBv+VkAX/l5MF/5iT - Bv+UjwX/kYkF/5GJBv+UjAb/lo4G/5iOBv+XjAb/lIoG/5GHBv+PhQX/jYUF/4qCBv+IgAT/hn4D/4R7 - Av+DegT/g3oD/4N6A/+CegP/gXkD/4F4BP+AdQT/fXQF/3xzBf96cAT/eXAE/3VuA/9ybQP/cGwD/3Bs - A/9wbAP/cW0E/3NvBP91cQX/dnIE/3h0Bv96dgb/fHkH/4F9Bv+GgAb/gn4H/3x4Bv/k4tna4N/ewtHP - y6/EwbyhtbKslOnn5twTEhHaAAAAmQAAAIMAAABxAAAAYwAAAFUAAABHAAAAOgAAAC0AAAAXAAAAHAAA - ACYAAAAxAAAAPgAAAFQAAABtAAAAyNnY1+nHw72gz8rHq93a17z38vbQbotF+EhuD/9Rehj/VoEY/1uJ - GP9ejhf/XowW/1yHF/9cgBb/XXoU/110Ev9ccBH/XXAP/11vDv9fbw7/YnIN/2V1Df9odwv/aXcL/2t3 - C/9vdwn/cnoJ/3R9B/94fwj/fIQH/4CGB/+FiQj/iIoJ/4mLB/+HiwX/i4sP/5SVKv+ChAf/fHwB/3t7 - A/9/gAT/gIAE/4CABP+AgAT/f38D/39/A/+BgQX/hoMF/4yJBf+SkAb/mZgG/6CdBf+fmwX/paEH/6Ke - Bv+TjgT/k40F/5OMB/+UjQj/k4wH/5aQBf+ZkgX/lpEG/5KMBP+QiAX/kYgF/5SMBv+VjAf/mIwI/5WK - Bv+SiAX/kIYG/46EBf+Nggb/ioEG/4h/Bf+GfQT/g3sC/4R6A/+DeQP/hHoD/4J4BP+BdwX/gHYE/4B1 - BP99cwT/fHIE/3pwBP91bwT/dG4E/3JtBP9wawP/b2oD/3BsA/9xbQT/cm8E/3NxBP91cgX/dnMG/3l1 - Bv98eQf/gn0I/4R/B/99egj/eXQG/+Ti2drg4N7C0c/Lr8PAu6K1sqyU6efm3BMSEdoAAACZAAAAgwAA - AHEAAABjAAAAVQAAAEcAAAA6AAAALQAAABcAAAAcAAAAJgAAADEAAAA+AAAAVAAAAG0AAADI2dnX6cfD - vaDPyser3drYvPfy99FuiUT5SG4P/1J5GP9WgBf/WogY/16OF/9fixb/XYcX/1yAFv9eeRP/XXUR/1xx - D/9cbw7/XG8N/19vDf9icgz/ZXUL/2h2DP9odgv/anYK/293Cf9xeQj/dHwH/3iABv98gwb/f4YH/4SJ - CP+Hign/iIoI/4iJBf+LjBH/lJQp/4CDBP97fAL/e3sF/35+BP+AgAT/gIAE/4B/BP9/fgT/f38E/4CA - BP+Ggwb/jYoF/5SRBf+blwb/oJwH/5+bBv+logb/n5sF/5KMBf+RjAf/kowH/5OMB/+TjQf/lpAF/5iR - BP+Vjwb/kYoF/5CHBv+Qhwb/lIoG/5eLB/+Xiwf/lIkF/5GHBf+PhQX/jYMF/4uBBP+KgQX/iH8E/4V7 - Bf+EegT/g3kD/4J4BP+DeAX/gncF/4F3Bf+AdQX/f3QE/31zBP97cgP/eW8D/3htBf90bQT/cWwD/29q - A/9vagP/cGwD/3FtBP9ybwT/c3AD/3RxBP92cwb/eXQG/3x7Bv+Afgb/gH0H/3t3CP94cgf/5OPa2uDg - 3sLRz8uvw8C7orWyrJTp5+bcExIR2gAAAJkAAACDAAAAcQAAAGMAAABVAAAARwAAADoAAAAtAAAAFwAA - ABwAAAAmAAAAMQAAAD4AAABUAAAAbQAAAMjZ2dfpx8O9oM/MyKvd29i89/L30W6IRPlHbQ7/UngW/1Z/ - F/9aiBf/XY4Y/16KFv9chhb/XoEW/115E/9ddBD/W3AO/1tuDf9cbgz/X3AN/2JyDP9ldAv/Z3UL/2h2 - C/9qdgr/a3YJ/3F5Cf90fAf/eIAG/3yDB/9/hQb/hIkI/4iKCP+Iigj/h4gF/4yNFf+UlCj/gIME/3t8 - A/97fAT/fX8E/4CAA/+AgAT/fn4D/359BP9/fgT/gIAE/4eDBP+Oiwb/lJIF/5uYBf+gnAb/n5sG/6ak - Bf+blgb/kYwG/5GLB/+TjAf/kosG/5KLBv+WkAX/l5EE/5ONBv+PiAb/kIcG/5CHB/+UiQb/losH/5aK - Bv+ThwX/kYUG/4+DBf+MgwX/i4EE/4uBBf+JgAP/hHoE/4R6BP+DeQX/gngF/4J3Bv+CdwX/gXcF/4B0 - Bf9/cwT/fHME/3pxA/94bgT/dm0E/3JsBP9xawP/b2oD/29qA/9vawL/cW0D/3JvBP9zcAP/c3EE/3Zz - Bf94dQb/fXwF/39+B/97eAj/d3QH/3VxBv/k4tra4N/dwtDOyrDFwLuiuLKslOnn5twTEhHaAAAAmQAA - AIMAAABxAAAAYwAAAFUAAABHAAAAOgAAAC0AAAAXAAAAHAAAACYAAAAxAAAAPgAAAFQAAABtAAAAyNnZ - 1+nIxL+g0M3Jq93b2L338/fRbYdD+UdsDf9ReBb/VX0W/1uIF/9djBb/XooW/12HFf9egBT/XXoR/1x0 - D/9bbg7/W24N/1ttDP9ebg3/YXEL/2RzCv9mdAv/aHUK/2h0Cf9rdgn/cHgI/3R7B/93gAf/eoIH/3+E - B/+FiQj/iIoH/4iKCP+FhwT/jo4Y/5KSKP+AgQL/ensD/3l7BP99fgT/gH8D/39/BP9/fgT/fn0D/39+ - BP+BgAT/iIMD/4+LBf+Vkwb/nJkF/5+bBv+fmwb/p6QG/5aSBP+Riwb/kooG/5KLBv+RigX/k4wF/5aQ - Bf+VjwT/kYoE/46FBv+OhQb/kIcH/5SKB/+WigX/lYkF/5KGBv+QhAX/jIIF/4uBBf+LgQX/i4AE/4h+ - A/+DegP/g3kE/4N4Bv+Cdwb/gXcF/4F2Bf+AdQX/f3QE/31zA/97cQT/enAE/3huA/90bgT/cmsD/3Fr - BP9vagP/b2oD/29rAv9xbgP/cm8D/3JvA/90cQT/dnQE/3h3Bf9+fQX/fXsG/3h1B/92cgj/c24G/+Ti - 2trf393C0M7KsMXAu6K3sqyU6efm3BMSEdoAAACZAAAAgwAAAHEAAABjAAAAVQAAAEcAAAA6AAAALQAA - ABcAAAAcAAAAJgAAADEAAAA+AAAAVAAAAG0AAADI2dnY6cnFv6DRzcmr3dvYvffz99Fth0L5RmwL/1B2 - FP9WfhX/XIcX/1+LFv9eihX/XYcT/16AEv9cfA//XHMO/1tuDv9abQ3/WmwL/1xuDP9hcAz/ZHIK/2V0 - Cv9odQv/Z3MJ/2x1B/9veAf/c3wH/3Z/CP96ggb/gIUI/4OICP+HiQj/hogH/4SFAv+PkBz/kJIm/35/ - AP94eQX/enoG/319Bf9+fQT/fn4E/319A/99fAP/fn0F/4CABP+JhQX/kIwE/5WUBf+dmgb/n5sG/6Cd - B/+loAb/lI4E/5CKBv+RiQf/kYkH/5GKBf+SjQP/lJAE/5ONBv+QiAX/joUG/4+GBv+Rhwf/k4oG/5aK - Bv+ThwX/kIYF/46EBf+Lggb/in8G/4uBBf+LgQT/hnwE/4N4A/+Bdwb/gncF/4F4Bf+AdgX/gXYF/390 - BP9/cwT/fHME/3lxA/94bwX/d24E/3JsBP9ybAT/cWoD/29rA/9vagP/cGwD/3FsBP9wbQT/c28D/3Ry - A/92dAT/enkF/318Bv96eAb/dXIG/3RwB/9xbAX/4+LZ2uDf3cLRzsqwxcC7oreyrJTp5+bcExIR2gAA - AJkAAACDAAAAcQAAAGMAAABVAAAARwAAADoAAAAtAAAAFwAAABwAAAAmAAAAMQAAAD4AAABUAAAAbQAA - AMjb2tnoy8bAoNHOyKve29i9+PP40W6GQvlFagv/T3YU/1V9Ff9ahhX/XosV/16KFP9ehRH/XIAS/1t7 - D/9acw//Wm0M/1trDf9bawz/XG0M/19vDP9kcQr/ZXMK/2VyCP9ncwj/aXUH/3B4B/9zewf/dnwI/3yB - B/+AhAf/g4cG/4aIB/+Fhgb/hIQD/4+QIf+OkCP/fX4A/3d4Bf95egX/fX0E/359A/98fQL/fH0D/318 - BP9/fQX/g4AE/4iGBP+QjAT/lpQG/5yaBf+dmQb/o54H/6KcBf+Riwb/kIoF/5GJBv+QiAb/kYkF/5KM - BP+TjgT/kowG/42GBf+NhAX/j4UG/5KHB/+TiAX/lYgF/5KHBv+PhAX/jYIE/4qABf+KgAT/i4EF/4qA - BP+FeQP/gncF/4F3Bf+BdwX/gXcF/4B2BP9/dAT/f3QE/31zBP97cQP/em8E/3hvBP90bQT/cmsE/3Br - BP9vawT/b2oD/3BrA/9wbAP/cW0E/3BtA/9ybwP/c3EE/3Z0Bf96eQb/e3sH/3d0Bv9zcQX/cm0G/29p - Bf/j4tna4N/dwtHOyrDFwLuit7KtlOnn5t0TEhHaAAAAmQAAAIMAAABxAAAAYwAAAFUAAABHAAAAOgAA - AC0AAAAXAAAAHAAAACYAAAAxAAAAPgAAAFQAAABtAAAAyNva2ejLxsGh0M7JrN7b2b348/jRbIVB+UZp - Cv9QdRT/VHwU/1qEFf9eihT/XokT/1yGEP9dgBH/XHgQ/1tzD/9abQ3/WWsN/1lqDP9bbQv/YG0L/2Ny - Cf9kcwn/ZXII/2dzCP9rdAb/b3cF/3J5B/91fAj/fIEF/4CEBv+ChQX/hIYE/4WGBv+EhAL/kZIl/4yO - If99fQD/d3gE/3h6BP98fAT/fXwE/3x8BP97fAT/e3wE/399Bf+EgAT/ioYE/5COA/+YlQX/nZkF/5yY - BP+loAb/nZcG/5CKBf+PiAX/kYkF/5CIBf+RiAX/kYoG/5KMBv+QiAX/jYQG/4yDBP+PhQb/kYYG/5KI - Bf+Thgb/kIQF/46CBv+MgQX/iX8E/4l/A/+LgQX/iH8E/4J4Bf+CdwX/gXcF/4F3Bf+AdQX/f3QE/390 - BP9+cwT/fHMD/3lwA/95bwT/d24D/3JsA/9yawT/cGoD/29qA/9vagP/cGsE/3BsA/9vbAP/cG0D/3Fv - Av9zcgT/dnUF/3l5Bv94dgX/c3EF/3JvBv9wbAX/bmcG/+Pi2drg393C0c7KsMTAvKK2sq2V6efm3RMS - EdoAAACZAAAAgwAAAHEAAABjAAAAVQAAAEcAAAA6AAAALQAAABcAAAAcAAAAJgAAADEAAAA+AAAAVAAA - AG0AAADI29rZ6MvHwqHRzsqs39zZvfj0+NFthED5RmgL/1B0E/9UexL/WYMU/12JE/9diBL/XIUQ/11/ - EP9ceBD/W3IP/1psDv9Yagz/WWoL/1xrCv9gbgv/Y3EJ/2RyCf9lcgj/Z3II/2t0Bf9vdwb/cnkH/3R8 - B/97gAX/f4MG/4GEBP+DhQT/hIUF/4KDAv+Rkyf/iosd/3x8AP92dgX/eHkE/3t8BP98fAT/e3wE/3p7 - A/97fAT/fnwE/4WAA/+KhgT/kY4E/5iVBP+bmQX/m5gF/6SgBf+YlAX/jokF/46HBv+PhwX/j4cG/5CI - Bf+Rigb/kosG/46GBf+Mgwb/jIIF/4+EBv+RhQb/k4cG/5GGBf+PhAX/jYEF/4qABP+JfgP/iYAD/4uB - BP+GfAT/gXcF/4F3Bf+BdwX/gHYE/4B2Bf9/dAT/f3QE/31zBP97cQP/enAD/3duBf90bQT/cmsE/3Jr - BP9wagP/b2oD/29qA/9vagP/b2wD/29sA/9wbQP/cW8C/3NxA/93dQX/eHkF/3VzBP9ybwX/cW0H/29p - Bv9sZQX/4+LZ2uHf3MLRzsqwxMC8o7ayrZXp5+bdExIR2gAAAJkAAACDAAAAcQAAAGMAAABVAAAARwAA - ADoAAAAtAAAAFwAAABwAAAAmAAAAMQAAAD4AAABUAAAAbQAAAMjb2tnoy8fCodPPyqzf3Nm9+PT40W6E - QflFZgv/UHIT/1R5Ev9YghP/W4gS/1yIEv9cgw//XH4O/1x4Dv9bcw7/Wm0N/1hqDP9Zagv/XGoK/15u - Cv9icQj/ZHIJ/2RxCP9ncgf/a3MG/252Bf9xeAf/c3wG/3t/Bf9/gwb/gYQE/4OEBP+DhAT/goMD/5KT - LP+IiBr/enoA/3R1BP94eAT/ensE/3t8BP96ewT/eXoE/3p7Bf99fAT/hYED/4uIBP+SjgT/mZUE/5uY - Bv+bmAb/o6AE/5OOA/+NiAX/jYYG/4+GBv+Phgb/kIgF/5GKBv+RiQX/jYUE/4yCBv+Ngwf/j4QG/5GE - Bv+Thgb/kYUF/46DBP+MgAT/iX4D/4l+BP+KgQT/ioED/4R6BP+BdgX/gXYF/4B2BP+AdgT/f3UE/390 - BP9+cwP/fHME/3txBf96cAT/dm8E/3JtBP9yawT/cGoD/3BqA/9vagP/b2oD/29rA/9vbAP/b2wD/29t - A/9xbwP/dHEC/3h2BP93dgX/cnAF/3BuBf9vawb/bWYH/2pkBP/j4tna4d/dw9HNyrDEwLyjtrKtlenn - 5t0TEhHaAAAAmQAAAIMAAABxAAAAYwAAAFUAAABHAAAAOgAAAC0AAAAXAAAAHAAAACYAAAAxAAAAPgAA - AFQAAABtAAAAyNrZ2enLx8Oh08/MrN/d2r349fjRbYNB+UVmCf9OcRL/U3cT/1Z/Ev9ahxH/XIcR/12C - D/9bfg3/XHgN/1tyDf9ZbQv/WGkM/1ppC/9cagr/X20I/2JxCP9icQf/ZHEI/2ZyBv9rcwX/bnUG/3F3 - B/92ewX/fH8G/36ABf+AgwX/goMD/4OEBP+CggX/k5Mw/4aHF/95eQD/dHQE/3d3Bf95egX/ensE/3p6 - Bf95eQX/eXoG/3x8BP+EgQP/jIkD/5OPBf+alQX/nJcG/56ZBv+gnQX/j4sE/4yHBP+Lhgb/jocF/4+F - Bf+QiAT/kYkF/4+HBf+KgwX/iYIF/4yDBv+Pgwb/kIUG/5GGBv+PgwT/jYEE/4t/BP+IfQP/iH0D/4yB - Bf+IfwX/gXgD/4B2Bf+AdQX/gHUF/4B1Bf9/dAT/f3QF/31zBP97cgP/enAE/3luBP92bQP/c20E/3Jr - BP9vagP/b2oD/29qA/9vawL/cGwD/3BsA/9vbAP/cG4D/3FvA/9zcgL/d3cE/3RzBf9vbQX/bWwD/21o - Bf9rZQf/aGEE/+Lh2dvh393D0c3KsMTAvKO2sq2V6ejm3RMSEdoAAACZAAAAgwAAAHEAAABjAAAAVQAA - AEcAAAA6AAAALQAAABcAAAAcAAAAJgAAADEAAAA+AAAAVAAAAG0AAADI2trZ6cvIxKLTz8yt4N3avfj1 - +NFsgkD5RWQJ/05vEf9RdRH/Vn0Q/1qEEf9chRD/XIEQ/1x9D/9cdg7/XHEO/1lsDP9YaAr/WmkK/1xq - Cf9fbQj/YXAH/2JwB/9icAb/ZXAG/2pxB/9tdQb/cHkG/3Z8Bf96fwT/fYAD/3+CBP+CggT/gYID/4CC - Bf+TlDH/g4UT/3Z5AP9zdAT/eHYE/3l5Bf95eQX/eHgE/3l5Bf95eQX/fXsD/4WCBP+MiQP/k48E/5uW - Bv+alQX/oJsG/56aBP+NiQP/i4UF/4yEBv+MhQb/jYUE/4+HA/+PhwT/jYQE/4iBBf+IgAT/ioID/46D - BP+QhQT/j4UE/42BA/+LfwT/iX4E/4d8A/+KfwT/jIEF/4Z8Bf9/dQP/f3QE/4B1Bf9/dAT/f3QE/35z - BP99cgP/e3ED/3pwBP96cAT/eG0E/3RsBP9ybAP/cWoD/29qA/9vagP/b2oD/25rA/9vbAP/b2sC/29s - A/9wbQP/cXAC/3R0A/91dQP/b24D/2xrBP9raQT/a2UE/2ljBf9mYQX/4uDZ2+Hf3cPRzcqwxL+8o7ay - rZXp6ObdExIR2gAAAJkAAACDAAAAcQAAAGMAAABVAAAARwAAADoAAAAtAAAAFwAAABwAAAAmAAAAMQAA - AD4AAABUAAAAbQAAAMja2tnpzMjEodTQzKzg3dq9+PX40WuBP/lEYwj/T24R/1FzEP9VfQ//WoMP/1yE - D/9agRD/W3wO/1t1D/9ccQ3/WmwK/1hoCv9ZaAn/XGoJ/19sCf9hbQn/Ym8H/2JwBv9lcAb/anEH/21y - B/9xeAj/dXsH/3p8BP99gQT/foEE/3+BBP9+gQL/gYIH/5SUMv+Bgw7/dXgB/3JzBP93dQX/eHgF/3h5 - BP94eAT/eHgE/3h4BP9+fAT/hoIF/42JA/+UkAT/mZUH/5eTBf+hnQT/mpUF/4yIBP+LhAX/i4QF/4qE - BP+LhQX/j4cD/46HBP+KggX/h38D/4d/BP+KggP/jYIE/46CBP+NggT/ioAE/4l/A/+HfQT/hnwE/4t/ - BP+KgAT/g3kD/350BP9/dAT/f3QE/390BP9+cwP/fnME/31yBP96cAT/enAE/3lvA/91bgP/c2wF/3Jr - BP9xagP/b2oD/29qA/9vaQP/b2oD/29sAv9uawL/b2wD/3BtBP9ycQP/dXQD/3JyAv9sawP/a2oD/2lm - BP9oZAX/ZmIE/2RgA//i4Nnb4d/dw9HNyrDEv7yjtrKtleno5t0TEhHaAAAAmQAAAIMAAABxAAAAYwAA - AFUAAABHAAAAOgAAAC0AAAAXAAAAHAAAACYAAAAxAAAAPgAAAFQAAABtAAAAyNra2enMyMSh1NDMrODe - 27359fnRbIE/+URjB/9NbBD/UXIQ/1Z6D/9ZgRD/W4MP/1uAD/9cewz/XXYL/1xxDP9abAr/WGgJ/1lo - Cv9baQj/XmsJ/2BtB/9hbwb/Ym8G/2VvBf9qcQb/bHQF/3B2Bv90eQb/eX0E/3x/BP99gAT/foED/31/ - Av+Bgwr/lJQ0/3+BDf91dwP/cnEE/3Z1BP93dwX/eHcF/3d3BP93dwT/eHgF/358A/+GgwT/jYkE/5SQ - Bf+YlQX/l5QF/6GeBf+UkAT/i4UE/4uEBf+LgwX/ioIF/4qEBP+MhgT/jIUE/4iABP+GfwP/h4AE/4qB - BP+NggT/joIE/42BBf+KgAX/iH4E/4Z8A/+GfQP/ioAE/4d9Bf+AdgT/f3QE/390BP9/dAT/f3QF/35z - A/99cgT/fHEF/3pwBP96cAX/dW4E/3RtBP9zbAT/cGoD/3BqA/9vagP/bmoC/29rA/9vawP/bmsD/25r - Av9vbAP/cG4E/3NyA/90cwP/b24D/2tqA/9raQP/aWUE/2diBf9lYAX/ZF4D/+Lg2dvi393D0c7KsMS/ - vKO2sq2V6ejm3RMSEdoAAACZAAAAgwAAAHEAAABjAAAAVQAAAEcAAAA6AAAALQAAABcAAAAcAAAAJgAA - ADEAAAA+AAAAVAAAAG0AAADI2trZ6c7JxaHV0cys4d7bvvn2+dFsgT/4RGEG/01sD/9RcQ//VXkO/1iA - EP9bgg//XH8O/1x6Df9ddgr/W3EL/1psCv9YaAn/WWgK/1ppB/9dagj/X2wG/2FvBf9ibwb/ZG8F/2lw - Bv9scwX/cHYG/3R5Bv94fAT/e34D/3yABP9+gQP/fH4B/4KDDP+TlDP/fX8K/3R1A/9xcQT/dHUE/3d3 - Bf93dwX/d3YE/3d2BP94dwX/fnwE/4aDA/+OigT/lZAG/5eTBP+YlAX/n50E/5GMBP+KgwX/ioMF/4qD - Bv+JgQb/ioIE/4qEBP+KggP/h34D/4Z9A/+HfwX/ioAE/42CBf+OggT/i4AF/4l+BP+HfAT/hHsD/4Z9 - A/+KgAT/hXwF/311BP9/dAT/f3QE/390BP9/dAX/fXID/3xwBP97cAX/enAD/3lvA/90bQT/cmwE/3Js - BP9xaQP/bmoD/29qA/9uagP/bmsC/29rA/9uawP/bmsC/29sA/9xbgP/c3MC/3NyA/9sbAL/a2gC/2lm - A/9nYwT/ZGEF/2NfBP9iXAL/4uHZ2+Lf3cPRzcqxxL+8o7ayrZXp6ObdExIR2gAAAJkAAACDAAAAcQAA - AGMAAABVAAAARwAAADoAAAAtAAAAFwAAABwAAAAmAAAAMQAAAD4AAABUAAAAbQAAAMja2tnpzsnGodXR - zKzh3tu++fb60WyAPvhEYAX/TWsN/09wD/9VeA//WX4O/1yADv9cfg7/WnoM/1x2Cv9bcAn/WWsJ/1dn - Cv9YZwj/WmgG/11pCP9ebAj/YG4F/2FuBf9jbgb/aHAF/21zBv9udgb/dHgE/3h7Bf97fgP/fIAD/32A - A/97fQD/g4UQ/5GRMv97fQb/dHQE/3BxBf9zcwT/dnYE/3Z1BP92dQP/dnUE/3l3Bf9/fAT/h4QE/46K - BP+VkAb/lpIE/5qWBf+emwT/jogD/4mDBf+IggX/iIEF/4mABP+KgwT/ioME/4eAA/+FfAL/hnwE/4h+ - BP+KgAT/i4EF/4uABP+JfgT/h30D/4V7BP+EegX/iH8D/4qABP+DeQP/e3MD/31zBP9+cwT/fnMD/35z - A/99cQX/e3AF/3pwBP94bwP/d24D/3NtBP9ybAT/cmoE/3BpAv9uaQL/bmkC/25qAv9tagL/bmsD/25r - A/9uawL/b2wD/3FuA/90cwP/cG8C/2tpAv9oaAH/Z2QC/2ViBP9iYAP/YV4E/19aAv/i4dnb4d7dw9HN - yrHEv7yjt7Ktluno590TEhHaAAAAmQAAAIMAAABxAAAAYwAAAFUAAABHAAAAOgAAAC0AAAAXAAAAHAAA - ACYAAAAxAAAAPgAAAFQAAABtAAAAyNva2enQy8ai1tPOreHe27759frRa389+ENgBf9Nag3/UG8N/1N3 - D/9YfA//W38N/1t9Df9Zegz/XHYK/1twCf9Zagn/V2cJ/1ZlB/9aZgf/W2kG/11rBv9gbQX/YG0E/2Nt - Bf9obwX/bHIG/291Bv90eAT/eHkG/3p8BP98gAL/fH4C/3l7AP+EhhX/kJAx/3t8A/9xcwP/cHAF/3N0 - BP92dAX/dXQE/3V0BP91dAT/eHcF/399BP+GhAT/j4oF/5WRBP+VkAX/nJgF/5qXA/+MhQX/iYIF/4iB - Bf+GgAb/iIAF/4iBBP+HgAX/hX0E/4R8A/+GfAP/iH4E/4qABP+KgAT/iYAE/4l+BP+FfAP/g3oE/4V6 - Bf+KfwX/iH0F/391Bf98cgT/fXME/35zBP99cwT/fXID/3xxBf96cQX/eW8D/3dtBP90bgX/c20E/3Jr - A/9vagL/bmoD/25pAv9uaQL/bmoC/25rA/9uawP/bmsD/25rAv9wbQL/cnED/3NyBP9tbAP/amgC/2Zm - Av9kYwT/Y2AD/2JfBP9gXQT/XlgD/+Lh2dvh3t3D0c3KscTAvKS4sq2X6ejn3RMSEdoAAACZAAAAgwAA - AHEAAABjAAAAVQAAAEcAAAA6AAAALQAAABcAAAAcAAAAJgAAADEAAAA+AAAAVAAAAG0AAADI29rZ6dDL - xqHW086s4d/cvvr2+tFrfz34Ql4G/0xpDf9Pbg3/VHUO/1h7Dv9afwz/W3wM/1p5C/9adgn/Wm8I/1lq - CP9WZgn/VmUH/1lmCP9caAf/XmoG/2BrBv9hawb/Y24E/2hwBP9scQX/b3QE/3N3BP93egX/ensD/3p+ - A/97fgP/eHsA/4aGGv+Ojy//eXwC/29xA/9vcQT/c3QE/3V0BP91dAT/dHMD/3V0BP93eQP/gH0D/4iE - BP+PiwX/k5AF/5OPBP+dmQX/l5IF/4iBBf+HgAX/h4EF/4aABP+GfwT/hn8D/4V9A/+DegP/gnoD/4R8 - A/+GfwT/iX4E/4l+BP+IfgP/iH0D/4R6BP+DeQP/hnsE/4p/BP+DewX/e3MF/3xyA/99cgP/fXID/3ty - A/97cQT/enAE/3pwBP94bgT/d20F/3NtBP9yawP/cmoD/29pAv9uaQL/bWgC/21qAv9tagP/bWoD/21q - Av9uawP/bmsC/3BtAv9zcgP/cXAD/2tqA/9oZgP/ZWQE/2NiBP9hXgP/YFwD/15bAv9bVwH/4eDZ2+Hf - 3cTRzsuyxcC8pLeyrZbp6OfdExIR2gAAAJgAAACCAAAAcAAAAGIAAABUAAAARgAAADoAAAAtAAAAFgAA - ABsAAAAlAAAAMAAAAD4AAABUAAAAbQAAAMjb2tnp0MzHodbTz63h39y9+fb60mp+PPlBXQX/S2gN/09s - Df9Tcw3/V3oN/1p8DP9afAz/WnkK/1pzCf9abgn/WWoI/1ZmCP9WZQf/WWYI/1xoB/9daQj/XmoG/2Bs - Bv9jbQT/Z28F/2lxBf9vdAT/cncD/3Z6A/93fAP/eX0C/3p9Av93egD/iIke/4yMLP94eQH/bnED/25w - A/9ycgT/dHMF/3RzBf90cwP/dXQD/3l5BP+BfgT/iIQE/4+LBP+TjwX/lI8E/56ZBf+RjgT/hoEE/4Z/ - Bf+GfgT/hX0E/4V+A/+FfQP/gnoE/4F4Bf+CeAX/hXsE/4Z+BP+IfgT/iX4F/4h9A/+FegT/g3gD/4N4 - A/+HfAP/ioAE/4B4A/96cQP/e3ID/3txBP97cQT/e3EE/3pwBP96cAT/enAE/3huBP93bQX/c2wF/3Jr - A/9vagP/bmkD/21oAv9uaQP/bWkD/21pA/9saAH/bWoC/25rA/9vbAP/cnAC/3JxA/9tbQP/aWcC/2dl - A/9lYwP/Yl8E/2FdA/9fWwP/XVkD/1pWAf/i4Nnb4d7dw9HPy7LFwLykt7Ktluno590TEhHaAAAAmAAA - AIIAAABwAAAAYgAAAFQAAABGAAAAOQAAACsAAAAWAAAAGwAAACUAAAAwAAAAPQAAAFMAAABsAAAAyNva - 2enQzMeh1tLOreDe2r349PrRan47+UJdAv9LaA7/Tm0N/1JzDP9WeQz/WnsM/1p7DP9ZeAr/WnMJ/1pu - Cf9Zagj/VWUH/1ZlB/9YZgj/WmcH/1xpCP9eagb/X2wF/2JsBP9obgb/anEF/250A/9zdwP/dXoC/3h8 - Av96fAL/enwD/3Z5AP+JiyP/i4so/3Z4AP9tbwL/bm8D/3JxBf9zcwX/c3IF/3RzBf91dAP/eXkD/4F/ - BP+IhQX/kIwF/5KPBf+UkAT/nZgF/46JBP+GfwT/hn8F/4Z+BP+DfAX/g3wE/4J7A/+AeQX/gHgF/4N5 - Bf+FewT/hnwE/4h+BP+HfgP/hnwD/4R6BP+CeAT/hHkD/4l/BP+IfgT/fXUD/3tyA/96cQT/e3EF/3tx - Bf96cAT/enAE/3pwBP95bwX/eG4E/3VsBf9ybAX/cGoD/29qA/9taQP/bWgC/25pA/9taAP/bWkD/2xp - Av9tawP/bWsE/29tA/9ycAT/cG4E/2poA/9oZgP/ZmQD/2RhA/9hXgT/X10C/1xZAv9bWAP/WVUC/+Hf - 2Nrg3tzC0c3LssTAvKS3sq2W6ejn3RMSEdoAAACXAAAAgQAAAG8AAABhAAAAUwAAAEUAAAA5AAAALAAA - ABYAAAAbAAAAJQAAAC8AAAA8AAAAUgAAAGsAAADI3Nva6dDMxqHU0s2s393ZvPfz+M5rfjv4Q10C/0tn - Df9Oawz/UHEL/1V3C/9Zegv/WXoL/1h3Cf9acwn/Wm4I/1hpB/9VZQf/VWQG/1dlBv9ZZgf/XGgG/15q - Bv9fawT/Y2wE/2htBf9qcAP/bXQD/3J3A/91eQL/d3wD/3l7A/95ewP/dXgA/4mLJ/+IiSX/dHYA/2xv - Av9tbwP/cHAD/3JyBP9zcgT/c3IE/3R0BP95eAP/gH4E/4mGBv+Piwb/kI0F/5WSBf+blwX/i4UF/4Z+ - BP+EfQT/g3wF/4F7Bf+BegT/f3gF/353BP9/dwT/gnkG/4N8A/+FfQT/hn4D/4V9A/+EewP/g3kE/4F3 - Bf+DegT/iX8E/4V8A/98cQT/e3AE/3pwBP97cQX/enAE/3pwBP96cAT/eG8E/3dtBf91bQT/cmwD/3Fq - A/9vagP/bmkC/21oAv9taAL/bGgC/2xoAv9saAL/bWkC/21rA/9sawL/bm4C/3FvA/9ubQP/aWcD/2hl - A/9lYgT/Y2AE/2FdA/9eWwL/W1kC/1pXAv9YVAL/397X19/c28DQzMmxw8C7pLeyrpfp6OfdExIR2gAA - AJcAAACBAAAAbgAAAGAAAABSAAAARAAAADgAAAArAAAAFAAAABkAAAAjAAAALgAAADoAAABPAAAAaQAA - AMjc29rp0MvGodTQy6rd2ti59PD0yWp8O/dDWwL/TGYM/09pDP9Rbgz/VHUK/1h6Cv9YeAr/WHUJ/1px - B/9Ybgf/VmgG/1VlBv9VZAb/V2UG/1pmBv9cZgb/XWkG/19rBP9jbAT/aG0D/2pwA/9scwT/cHYC/3Z3 - BP92eQX/eHoD/3h6Af91dwD/iowr/4aHIf9zdQH/am0D/21uBP9wcAP/cXED/3JyBP9zcgT/dHME/3l5 - A/+AgAX/iYYG/4+LBP+QjAP/lpME/5eTBf+IgQX/hH0E/4J9BP+BfAT/gHoF/4B5Bv99dgT/fXUE/391 - BP+CeAT/g3sE/4V8A/+FfAP/hHoE/4N5BP+BdwX/gHYE/4V7BP+IfwT/f3cE/3lvBP96cAT/enAE/3pw - BP96cAT/eXAD/3hvBP92bwT/c20D/3NsBP9xagP/b2oD/29qAv9uaQL/bWgC/21oAv9saAL/bGgC/2xo - Av9taQL/bGoC/2xrA/9vbwL/b28D/2ppAv9oZgL/ZmUC/2NiA/9hXwT/YVwD/11ZAv9bWAP/WVUC/1dS - Av/c2tPT3NnYvc7Lx67Dv7ujt7Kuluno590TEhHaAAAAlQAAAH8AAABsAAAAXwAAAFAAAABCAAAANgAA - ACkAAAAUAAAAGgAAACIAAAAsAAAAOAAAAE0AAABnAAAAx9zb2unPy8Sf0s3JqNnX1LXw7PDCaHo69UJb - Av9MZAv/TmkL/1BsC/9Vcwv/V3cK/1d3Cv9XdQj/WXIH/1dtB/9WaAb/VGQF/1NkBv9XZAb/WmUG/1xn - B/9daAT/YGoE/2JrA/9mbAP/aW8C/2xxBP9vdQP/c3cE/3Z4BP94eQT/eHgE/3R3AP+LjS//g4Uc/3N1 - AP9pbQL/bW0D/29vA/9vbwP/cHAD/3FyA/90cwT/eXkE/4CABf+Jhgb/jowF/46LBv+WkwX/k48E/4Z/ - Bf+DfQX/gnwE/4F7Bf+AeQb/fncF/3l0BP97dQT/fncE/4B4BP+DewP/hXsF/4V6BP+DeAX/g3cF/4B2 - Bf+AdwX/h34E/4Z+Bf99cwT/em8E/3pwBP96bwP/em8D/3pwBP94bwP/dm8E/3RuBf9zbgT/cmwD/3Bq - A/9uaQL/bmkC/25oA/9saAL/bGgC/2xoAv9saAL/bGgC/2xoA/9raQL/bWwC/3BvAv9tbAP/Z2YC/2Zl - A/9kYwP/YmAC/19eA/9eWwT/W1kB/1lWAv9XVAT/VVEB/9fWzszY1tS4y8fEq8K9uKG2sq2V6ejn3RMS - EdoAAACTAAAAfAAAAGkAAABcAAAATgAAAEAAAAA0AAAAKAAAABIAAAAYAAAAIAAAACkAAAA1AAAASgAA - AGMAAADG29rZ6M3JxJ/Oysam19PPsOzn67hgcy32OFQA/0BcAP9CXwD/RWUA/0prAP9MbgD/TG0A/01t - AP9QagD/TWQA/0xgAP9KWwD/SlsA/01bAP9QXAD/Ul4A/1VgAP9VYAD/V2IA/1xkAP9hZwD/ZGoA/2dt - AP9rbwD/bnAA/29xAP9vcAD/bG8A/4SHJf94egv/aWwA/2FjAP9jZgD/ZmcA/2dnAP9oaAD/aWkA/2xs - AP9xcgD/e3oA/4KBAP+HhQD/iIUA/5KPAP+HgwD/e3QA/3p0AP96dAD/eXIA/3ZvAP9xbAD/cGwA/3Ns - AP92bwD/eXEA/3xzAP99cwD/fXIA/3twAP96bwD/eW0A/3txAP+AeAD/fHQA/3FpAP9yaAD/cmgA/3Fn - AP9xZwD/cmgA/3FnAP9tZwD/bGYA/2tlAP9qYwD/Z2IA/2ZhAP9mYQD/ZGAA/2RgAP9jYAD/ZGAA/2Rg - AP9jXwD/Y2AA/2NiAP9mZgD/amcA/2NhAP9fXQD/XVsA/1tZAP9ZVwD/VVUA/1NRAP9RTgD/UEwA/05L - AP9MSAD/0c/GxNPQzrLIxMCnwLu2n7Wwq5bp6OfdExIR2QAAAI8AAAB5AAAAZgAAAFcAAABKAAAAPAAA - ADEAAAAmAAAAEAAAABUAAAAeAAAAJgAAADEAAABGAAAAXgAAAMXb2tnpy8fDn8vGwqLTz8qp3dnVssnK - u8fGybbRy9C82M7SvtzQ1cDg0tfB4tPYweLT18Hi0tjB4tPXweLT1sHi09XB4tLUwOLS1MDi0tTB4tPU - weLT1cDi1NXA4tTVwOLU1sDi1dbB4tbXweLX18Hi19jB4tjYweLY2MHi2NjB4tjYwOLY18Di3dzJ4dnZ - xOHX1r/h1tW/4dbWwODW1r/g19a/39bWv9/W1r/f19a/39jXv9/Z2L/f29m/39vZv9/c2r/e3ty/3tva - v97Z17/e2de/3tnXv97Z17/e2Na/3tfWvt7X1r/e2Na+3tjWv97Z17/e2de+3trXv97a177f2de/39nW - v9/Z1r/f2de+39rZv9/Z2L/f19bA39fWv9/Y1b/f2NW/39jVv9/Y1b/f2NW/4NjVv+DX1b/g19W+4NfU - vuDW1b/g1tW/4NbVv+DW1L/g1tS/4NbUvuDV077g1dO+4NXTvuDV077g1NO+4dXUvuHV1L7h1NO+4dPS - vuHT0r7h09G+4dLRvuHS0b3h0M+94M7Mu93LybjZx8W008G+rcvSzsu2y8fFq8O/vKO9uLSdtrGrlevp - 5twTEhHYAAAAiwAAAHIAAABgAAAAUwAAAEYAAAA4AAAALQAAACMAAAAOAAAAEwAAABsAAAAjAAAALgAA - AEEAAABWAAAAxdLRz93LxsGcyMTAn87KxaTU0Mqq3trYsOPg4Lfn5OS+6ubowuzo6sXs6evG7Onrxuzp - 68bs6evG7Onrxuzp68bs6evG7Onrxuzq68bs6evG7errxuzp68fs6evH7Onrx+zq68br6uvG7Orrxuzq - 68bs6uvG7Orrxuzq68bs6erG7Onqxuvo6sbq6OjF6efpxero6sTq6OnE6+jpw+ro6cPo5ufC6ebnwejl - 58Lo5ufB6Obnwefk58Hn5OfB5+Tnwefk58Hm5efA5uXnwOfl58Dn5efA5+XnwOfm58Dn5ufA5+bnwOfm - 58Dn5ufA6ObnwOfm58Dn5efA5+bnwefm58Hn5ufB5+bnwefm58Hn5efC6Obnwejm58Hp5ufB6Obnwujm - 58Lo5ufC6Obnwujm6MPo5ujD6Obow+jm6MPo5+jD6ejpw+ro6cPq6OnD6ujpw+ro6cPp5+jD6efow+fl - 58Tn5efE5+XnxOfl58Tm5ebE5uXmxObl5sTm5ebE5uXmxObl5sTn5ebF5+Xmxefl5sXn5ObE5OLiwuDf - 4L7d29q419TUscvHxavFwb2lwLu3oLq1sZu3sayV4uDf0REQENYAAACEAAAAbQAAAFoAAABNAAAAQQAA - ADUAAAAqAAAAIAAAAA0AAAASAAAAGQAAACAAAAApAAAAOgAAAE8AAACtcG9u5NzZ1a/EwLmYy8fBoM7J - xKPRzsmo1dLOrdfU0LDZ1dOz3NfVtdzZ1bbc2dW23NnVttzZ1bbb2NW23NnVttzY1bbb2NW23NnVttvY - 1bbc2dW23NjUttvY1Lfa2NS33NnVttzZ1bbb2dW23NnVttzZ1bbc2dW229nUttvZ1Lbb2NS22tfVtdvX - 1LXZ1tO02tbTs9nW07HZ1dOy2NXRsdfU0LDX1NCw1tLQsNXTz6/V08+v1dPOrtXSzq7V0s6u1dLOrtXS - zq7W0s6u1tLOrtbSzq7W0s6u1tLOrtbSzq7W0s6u1tLOrtbSzq7W0s6u1tLOrtbSzq7V086v1dPPr9XT - z7DW0tCw1tLQsNbT0LDX1NCw19TQsNfU0LDX1NCw19TQsNfU0LHX09Cx19PQsdfT0LHX1NCx19XRsdjV - 0rHY1dKx2NXSsdjW0rHY1dKx2NXRsdfU0LHX09Cx1tLPstbSz7LW0s+z1dHPs9TRzrPU0c2z1NHNs9TR - zrPU0c2z1NHOtNTRzrTU0c601NHOtNPQzbPRzsyzz8zJsMzJxazIxcGpw7+8o8C7t6C9uLOdtK+qldLN - yaaHhoXfBQUFxAAAAHkAAABkAAAAUwAAAEYAAAA7AAAAMAAAACYAAAAdAAAACwAAAA8AAAAVAAAAHAAA - ACUAAAAyAAAARwAAAHkSERDm29nX19DMxpzDvreXysS+ncrIwqDNyMSjzsvFpc/Lx6bRzcin0c3Ip9HN - yKfRzcin0c3Ip9LOyKfSzsin0s7Ip9LOyKfRzcin0s7Ip9LOyKfSzsin0s3IqNHNyajRzsin0c7Ip9HO - yKfRzsin0c7Ip9HOyKfRzsmn0c7Jp9HMx6fQzMimz8vHps/LxaXPy8WkzsrFos7JxKPMxsOizMbBocvH - waDKx8GgycXAoMnFvp/Jxb+fyca/n8nFv5/JxL+fycS/n8nEv5/Jxr+eycW/nsnFv57Jxb+eycW/nsnF - v57Jxb+eycW/nsnGv57Jxr+fyca/n8nGwKDJxcCgycXBocnFwaHJxcGhysbBoMzGwaHMxsGhzMbBocvH - waHLxsGhy8XCosvFwqLLxcKiy8XCoszJw6LNycSizcnEos3JxKLNycSizcjEos3Hw6LNx8OizMfCosvG - waPJxcGjycXBo8jEwaTIxMCkx8S/pMfEv6THxMCkyMTApMfDv6XHw7+lx8O/pcfDv6XHw7+lx8O/pcXB - vaXDwLykwr66o7+7t5+9ubWdu7axnLSvqZW+urSV4+DeyyspKO0AAAChAAAAbAAAAFoAAABLAAAAQAAA - ADUAAAArAAAAIgAAABkAAAAJAAAADQAAABMAAAAZAAAAIQAAACoAAAA6AAAAXgMCAqdVVVT13tzZz+fk - 3arHwruWwr63lcPAuZbFwbuXx8G8mMfCvJjHwbyYx8G8mMfBvJjHwryYyMO8mMjDvJjIw7yYyMO8mMfC - vJjIw7yYyMO8mMjDvJjIxLyZx8S9mcfEvJnHw7yYx8O8mMfDvJjHw7yYxsG7mMbBu5jGwbuYxsC6l8XA - upbDvrmVw764lcG8tpTBu7WTwLu0k765spK+ubGQvbexj763sY+9uLGPvbiwjry4r467t6+Ou7evjru2 - r467tq+Ou7avjru3r468tq+Ovbavjb22r428tq+NvLavjby2r428tq+Nu7avjru2r467tq+OvLawj7y2 - sJC8tbCQvLawkL23sZC+ubGPvrixkL64sZC+uLGQvriykb63spG+t7KRvreykb63spG/ubOQwLu0kcC7 - s5HAu7ORwLuzkcG6tJLBubSSwbm0kr+5s5K+uLKTvLexk7u2sZS7trGUurWwlLm1sJS4ta+UurWvlLm1 - sJW5tK+VubSvlbm0r5W5tK+VubSvlbizr5W4s66WuLOulrezrpa3sq2VtrCrlLSvqpK3sa2T1tHOpOPi - 38hsbGrzCQgIwQAAAHsAAABfAAAATgAAAEIAAAA4AAAALwAAACUAAAAeAAAAFQAAAAgAAAALAAAAEAAA - ABQAAAAbAAAAIwAAAC4AAABLAAAAYQAAAKk3NzfxgoF/4eHg3tH39vPS8vHu0vPx79Lz8u/S8/Hv0vPx - 79Lz8e/S8/Hv0vPy79Lz8u/S8/Lv0vPy79Lz8u/S8/Lv0vXy79L08u/S8/Lv0vPy79Lz8u/S8/Lv0vPy - 79Lz8u/S8/Lv0vPy79Ly8e7S8/Hu0vPw7tLz8O/S8/Hu0fLx7tDx8O3Q8e/tz/Hu7NDv7uvQ7+3rz/Du - 687w7evO8O3rzu/t687w7uvO7+3rzu/t687v7evO7+3rzu/t687v7evO7+3rzu/t687v7erN7+3qzfHt - 683y7uzM8u7szPLu7M3y7uzN8e7szfDt7M7x7ezO8e3szvHu7M7x7+zO8e/szvHv7M7x7+zO8e/szvLv - 7M7z7+3O8+/tzvPv7c7z7+3O8+/tzvPw7c7z8O3O8/DtzvPw7c7z8O3O8+/tz/Pw7c/z8O3P8vDsz/Lv - 7M/y7+zP8e7sz/Hu7M/x7uzP7+7r0PHu7M/x7uvQ8O3r0PDt69Dw7evQ8O3r0PDt69Dw7evQ8O3r0fDt - 69Hw7evR8O3r0fDt69Dw7evR8/Dt0Ojl49CPjYzdQD8/8gEBAcMAAAB5AAAAXwAAAFAAAABCAAAAOQAA - ADAAAAAoAAAAIAAAABkAAAASAAAABgAAAAgAAAANAAAAEAAAABUAAAAcAAAAJAAAADcAAABMAAAAYAAA - AIYEAwO9KSko6TEwMOMvLy7jLy8u4y8uLuMvLi7jLy4u4y8uLuMvLi7jLy4u4y8uLuMvLi7jLy4u4y8u - LuMvLi7jLy4u4y8uLuMvLi7jLy4u4y8uLuMvLi7jLy4u4y8uLuMvLi7jLy4u4y8vLuMvLy7jLy4u4y8u - LuMvLy7jLy8u4y8vLuMwLy7jLy8u4y8vLuMvLy7jMC8u4zAvLuMwLy7jLy8u4y8vLuMvLy7jLy8u4y8v - LuMvLy7jLy8u4y8vLuMvLy7jLy8u4y8vLuMvLy7jMC8v4zAvL+MwLy/jMC8v4zAvL+MwLy/jMC8v4zAv - L+MwLy/jMC8v4zAvL+MwLy/jMC8v4zAvL+MwLy/jMC8v4zAvL+MwLy/jMC8v4zAvL+MwLy/jMC8v4zAv - L+MwLy/jMC8v4zAvL+MwLy7jMC8u4zAvLuMwLy/jMC8v4zAvL+MwLy/jMC8v4zAvL+MwLy7jMS8v4zAv - LuMwLy7jMC8u4zAvLuMwLy7jMC8u4zAvLuMwLy/jMC8v4zAvL+MwLy/jMC8v4zAvL+MxMDDjLS0s5woJ - CMwAAACWAAAAdAAAAFsAAABOAAAAQgAAADgAAAAwAAAAKAAAACIAAAAbAAAAFAAAAA4AAAAHAAAACAAA - AAwAAAAQAAAAFQAAABsAAAAiAAAALAAAADkAAABGAAAAUAAAAGAAAABsAAAAcAAAAHIAAABzAAAAdQAA - AHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAA - AHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHcAAAB2AAAAdgAA - AHYAAAB3AAAAdwAAAHcAAAB3AAAAdwAAAHcAAAB3AAAAdwAAAHcAAAB3AAAAdwAAAHcAAAB3AAAAdwAA - AHcAAAB3AAAAdwAAAHcAAAB3AAAAdwAAAHcAAAB3AAAAdwAAAHcAAAB3AAAAdwAAAHcAAAB3AAAAdwAA - AHcAAAB3AAAAdwAAAHcAAAB3AAAAdwAAAHcAAAB3AAAAdwAAAHcAAAB3AAAAdwAAAHcAAAB3AAAAdwAA - AHcAAAB3AAAAdwAAAHcAAAB3AAAAdwAAAHYAAAB3AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAA - AHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHUAAAB0AAAAbAAAAGAAAABXAAAATAAAAEIAAAA4AAAAMQAA - ACsAAAAkAAAAHwAAABkAAAATAAAADgAAAAUAAAAGAAAACQAAAAwAAAAQAAAAFQAAABoAAAAhAAAAKAAA - ADEAAAA4AAAAPwAAAEMAAABIAAAASwAAAEwAAABOAAAAUAAAAFAAAABQAAAAUAAAAFAAAABQAAAAUAAA - AFAAAABQAAAAUAAAAFAAAABQAAAAUAAAAFAAAABQAAAAUAAAAFAAAABQAAAAUAAAAFAAAABQAAAAUAAA - AFAAAABQAAAAUAAAAFAAAABQAAAAUAAAAFAAAABQAAAAUAAAAFAAAABQAAAAUAAAAFAAAABQAAAAUAAA - AFAAAABQAAAAUAAAAFAAAABQAAAAUAAAAFAAAABQAAAAUAAAAFAAAABQAAAAUAAAAFAAAABQAAAAUAAA - AFAAAABQAAAAUAAAAFAAAABQAAAAUAAAAFAAAABQAAAAUAAAAFAAAABQAAAAUAAAAFAAAABQAAAAUAAA - AFAAAABQAAAAUAAAAFAAAABQAAAAUAAAAFAAAABQAAAAUAAAAFAAAABQAAAAUAAAAFAAAABQAAAAUAAA - AFAAAABQAAAAUAAAAFAAAABQAAAAUAAAAFAAAABQAAAAUAAAAFAAAABQAAAAUAAAAFAAAABQAAAATwAA - AE0AAABJAAAARQAAAD4AAAA4AAAAMwAAAC0AAAAoAAAAIwAAAB0AAAAYAAAAEwAAAA4AAAAKAAAABAAA - AAUAAAAHAAAACQAAAAwAAAAPAAAAFAAAABgAAAAdAAAAIgAAACYAAAArAAAALgAAADEAAAAzAAAANQAA - ADYAAAA3AAAAOAAAADcAAAA3AAAANwAAADcAAAA3AAAANwAAADcAAAA3AAAANwAAADcAAAA3AAAANwAA - ADcAAAA3AAAANwAAADcAAAA3AAAANwAAADcAAAA3AAAANwAAADcAAAA3AAAANwAAADcAAAA3AAAANwAA - ADcAAAA3AAAANwAAADcAAAA3AAAANwAAADcAAAA3AAAANwAAADcAAAA3AAAANwAAADcAAAA3AAAANwAA - ADcAAAA3AAAANwAAADcAAAA3AAAANwAAADcAAAA3AAAANwAAADcAAAA3AAAANwAAADcAAAA3AAAANwAA - ADcAAAA3AAAANwAAADcAAAA3AAAANwAAADcAAAA3AAAANwAAADcAAAA3AAAANwAAADcAAAA3AAAANwAA - ADcAAAA3AAAANwAAADcAAAA3AAAANwAAADcAAAA3AAAANwAAADcAAAA3AAAANwAAADcAAAA3AAAANwAA - ADcAAAA3AAAANwAAADcAAAA3AAAANwAAADcAAAA3AAAANgAAADMAAAAyAAAALgAAACoAAAAnAAAAIwAA - AB8AAAAbAAAAFgAAABEAAAAOAAAACwAAAAgAAAACAAAAAwAAAAUAAAAHAAAACQAAAAsAAAAPAAAAEwAA - ABUAAAAYAAAAHAAAAB8AAAAhAAAAJAAAACYAAAAnAAAAKAAAACkAAAAqAAAAKQAAACkAAAApAAAAKQAA - ACkAAAApAAAAKQAAACkAAAApAAAAKQAAACkAAAApAAAAKQAAACkAAAApAAAAKQAAACkAAAApAAAAKQAA - ACkAAAApAAAAKQAAACkAAAApAAAAKQAAACkAAAApAAAAKQAAACkAAAApAAAAKQAAACkAAAApAAAAKQAA - ACkAAAApAAAAKQAAACkAAAApAAAAKQAAACkAAAApAAAAKQAAACkAAAApAAAAKQAAACkAAAApAAAAKQAA - ACkAAAApAAAAKQAAACkAAAApAAAAKQAAACkAAAApAAAAKQAAACkAAAApAAAAKQAAACkAAAApAAAAKQAA - ACkAAAApAAAAKQAAACkAAAApAAAAKQAAACkAAAApAAAAKQAAACkAAAApAAAAKQAAACkAAAApAAAAKQAA - ACkAAAApAAAAKQAAACkAAAApAAAAKQAAACkAAAApAAAAKQAAACkAAAApAAAAKQAAACkAAAApAAAAKQAA - ACkAAAAoAAAAJgAAACUAAAAjAAAAIAAAAB4AAAAaAAAAFwAAABQAAAARAAAADQAAAAoAAAAJAAAABgAA - AAEAAAACAAAAAwAAAAQAAAAHAAAACAAAAAsAAAAOAAAAEAAAABEAAAAVAAAAFwAAABkAAAAcAAAAHQAA - AB0AAAAfAAAAHwAAACAAAAAfAAAAHwAAAB8AAAAfAAAAHwAAAB8AAAAfAAAAHwAAAB8AAAAfAAAAHwAA - AB8AAAAfAAAAHwAAAB8AAAAfAAAAHwAAAB8AAAAfAAAAHwAAAB8AAAAfAAAAHwAAAB8AAAAfAAAAHwAA - AB8AAAAfAAAAHwAAAB8AAAAfAAAAHwAAAB8AAAAfAAAAHwAAAB8AAAAfAAAAHwAAAB8AAAAfAAAAHwAA - AB8AAAAfAAAAHwAAAB8AAAAfAAAAHwAAAB8AAAAfAAAAHwAAAB8AAAAfAAAAHwAAAB8AAAAfAAAAHwAA - AB8AAAAfAAAAHwAAAB8AAAAfAAAAHwAAAB8AAAAfAAAAHwAAAB8AAAAfAAAAHwAAAB8AAAAfAAAAHwAA - AB8AAAAfAAAAHwAAAB8AAAAfAAAAHwAAAB8AAAAfAAAAHwAAAB8AAAAfAAAAHwAAAB8AAAAfAAAAHwAA - AB8AAAAfAAAAHwAAAB8AAAAfAAAAHwAAAB8AAAAfAAAAHwAAAB8AAAAdAAAAHQAAABsAAAAYAAAAFgAA - ABMAAAARAAAADwAAAA0AAAAJAAAABwAAAAcAAAADAAAAAQAAAAEAAAACAAAAAwAAAAQAAAAFAAAABwAA - AAkAAAALAAAADAAAAA4AAAAQAAAAEgAAABQAAAAVAAAAFQAAABcAAAAXAAAAGAAAABcAAAAXAAAAFwAA - ABcAAAAXAAAAFwAAABcAAAAXAAAAFwAAABcAAAAXAAAAFwAAABcAAAAXAAAAFwAAABcAAAAXAAAAFwAA - ABcAAAAXAAAAFwAAABcAAAAXAAAAFwAAABcAAAAXAAAAFwAAABcAAAAXAAAAFwAAABcAAAAXAAAAFwAA - ABcAAAAXAAAAFwAAABcAAAAXAAAAFwAAABcAAAAXAAAAFwAAABcAAAAXAAAAFwAAABcAAAAXAAAAFwAA - ABcAAAAXAAAAFwAAABcAAAAXAAAAFwAAABcAAAAXAAAAFwAAABcAAAAXAAAAFwAAABcAAAAXAAAAFwAA - ABcAAAAXAAAAFwAAABcAAAAXAAAAFwAAABcAAAAXAAAAFwAAABcAAAAXAAAAFwAAABcAAAAXAAAAFwAA - ABcAAAAXAAAAFwAAABcAAAAXAAAAFwAAABcAAAAXAAAAFwAAABcAAAAXAAAAFwAAABcAAAAXAAAAFwAA - ABcAAAAXAAAAFwAAABUAAAAVAAAAEwAAABEAAAAPAAAADgAAAAwAAAAKAAAACAAAAAYAAAAFAAAABAAA - AAIAAAABAAAAAQAAAAEAAAACAAAAAwAAAAMAAAAFAAAABgAAAAcAAAAIAAAACgAAAAsAAAAMAAAADQAA - AA8AAAAPAAAADwAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAA - ABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAA - ABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAA - ABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAA - ABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAA - ABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAA - ABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAPAAAADwAAAA4AAAANAAAACwAA - AAsAAAAJAAAACAAAAAYAAAAFAAAABAAAAAMAAAADAAAAAQAAAAAAAAABAAAAAQAAAAEAAAABAAAAAgAA - AAIAAAADAAAABAAAAAQAAAAFAAAABwAAAAcAAAAIAAAACQAAAAkAAAAJAAAACgAAAAoAAAAKAAAACgAA - AAoAAAAKAAAACgAAAAoAAAAKAAAACgAAAAoAAAAKAAAACgAAAAoAAAAKAAAACgAAAAoAAAAKAAAACgAA - AAoAAAAKAAAACgAAAAoAAAAKAAAACgAAAAoAAAAKAAAACgAAAAoAAAAKAAAACgAAAAoAAAAKAAAACgAA - AAoAAAAKAAAACgAAAAoAAAAKAAAACgAAAAoAAAAKAAAACgAAAAoAAAAKAAAACgAAAAoAAAAKAAAACgAA - AAoAAAAKAAAACgAAAAoAAAAKAAAACgAAAAoAAAAKAAAACgAAAAoAAAAKAAAACgAAAAoAAAAKAAAACgAA - AAoAAAAKAAAACgAAAAoAAAAKAAAACgAAAAoAAAAKAAAACgAAAAoAAAAKAAAACgAAAAoAAAAKAAAACgAA - AAoAAAAKAAAACgAAAAoAAAAKAAAACgAAAAoAAAAKAAAACgAAAAoAAAAKAAAACgAAAAoAAAAKAAAACgAA - AAoAAAAKAAAACgAAAAkAAAAJAAAACQAAAAcAAAAHAAAABgAAAAUAAAAEAAAABAAAAAIAAAACAAAAAgAA - AAEAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAEAAAABAAAAAQAAAAIAAAADAAAAAwAAAAQAAAAFAAAABQAA - AAYAAAAHAAAABwAAAAcAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAA - AAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAA - AAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAA - AAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAA - AAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAA - AAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAA - AAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABwAAAAcAAAAHAAAABQAA - AAUAAAAFAAAABAAAAAMAAAADAAAAAQAAAAEAAAABAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - 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 - AAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAA4AAAAAAAAAAAAAAAAAAAACgAAAAwAAAAYAAAAAEA - IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAABgAAAA4AAAAXAAAAIAAAACcAAAArAAAALAAA - ACwAAAAsAAAALAAAACwAAAAsAAAALAAAACwAAAAsAAAALAAAACwAAAAsAAAALAAAACwAAAAsAAAALAAA - ACwAAAAsAAAALAAAACwAAAAsAAAALAAAACwAAAAsAAAALAAAACwAAAAsAAAALAAAACwAAAAsAAAALAAA - ACwAAAAsAAAALAAAACwAAAArAAAAJwAAAB8AAAAXAAAADQAAAAYAAAAGAAAADgAAAB0AAAAtAAAAPQAA - AEgAAABOAAAATwAAAE8AAABPAAAATwAAAE8AAABPAAAATwAAAE8AAABPAAAATwAAAE8AAABPAAAATwAA - AE8AAABPAAAATwAAAE8AAABPAAAATwAAAE8AAABPAAAATwAAAE8AAABPAAAATwAAAE8AAABPAAAATwAA - AE8AAABPAAAATwAAAE8AAABPAAAATwAAAE8AAABOAAAASAAAAD0AAAAtAAAAHAAAAA0AAAALAAAAGQAA - ADAAAABHAAAAWwAAAGkAAABwAAAAcQAAAHEAAABxAAAAcQAAAHEAAABxAAAAcQAAAHEAAABxAAAAcQAA - AHEAAABxAAAAcQAAAHEAAABxAAAAcQAAAHEAAABxAAAAcQAAAHEAAABxAAAAcQAAAHEAAABxAAAAcQAA - AHEAAABxAAAAcQAAAHEAAABxAAAAcQAAAHEAAABxAAAAcQAAAHEAAABwAAAAaQAAAF0AAABIAAAALwAA - ABgAAAARAAAAJAAAAEEAAABsCgoLpBgYGLIWFxe0FxcXtBcXF7QXFxe0FxcXtRcXGLQXFxi0FxgYtBcY - GLQXGBi0GBgYtBcYGLQXFxi0FxcXtBcXF7QXFxe0FxcXtBcXF7QXFxe1FxcXtRcXF7UXFxe0FxcXtBcX - F7QXFxe0FhcXtBYWF7QWFhe0FhYWtBYWF7QXFxe0FxcXtBcXF7QXFxe0FxcXtBcXF7QYGBi1AQECpgAA - AHkAAABfAAAAQQAAACQAAAAXAAAALAAAAF05OTe7joiApZOMgpSRiICTjIR6kod/dZCEe3KPgHlvjn54 - bY18dWuMeXJni3lyZ4t5cWeLeG5mi3lvZot7cmiKgHdsi4N7coyIf3aMjIJ4jIyFeo2NhnuOjYd8j4+H - fo+Qh3+PkYh/j5KJf4+SiYCPk4uAkJOMgpCTjIKQlIyCkJOLgZCPiH6OjIR6jYuCeIyMg3mNj4d9jpGJ - gI+SioCOfnlzshcXF7UAAABxAAAAUAAAAC4AAAAbAAAAMAkJCYmSjIasnpWJcLKmnYW/s6yQvbKrkbqv - p4+3rKWNtaujjLOqoYuxp5+KsKWdia6knYmuo52JrqKdiq+knYmypp+JtKqjibitp4q7saqKvLKri7yz - q4u7s6yMvLOtjLyzrYy9s66NvbSujb21ro29ta6OvLaujru2ro68tq6Ovbevjry1ro66s6yMuLKri7ex - rIu5s6+Mu7SyjbStqYaelY10n5WIbGdlYb0AAACJAAAAVgAAADMAAAAcAAAAMhESEpKpoZqlsriymXPd - 4+tx4Ofyc+Dn83Xg5/N24ObzeeHl83zi5fJ/4uTyguPk8oXj4vKH4+LyieTg8ozl3/KP5d/yk+bf8pfo - 4PKc6eLyoOrj8qTs4vKo7uLzrfDi8rLz4fK29uHzvPjh88T64fPO++Tz3vvq8+z78/P5+/nz//v98//7 - /vP/+/3y//v38vz77fL3++Lz9vvR8/P5vu7V1rm7qaKbdX98d7UAAACRAAAAWQAAADYAAAAdAAAAMxAQ - EJGwqKKsws7JsEjd5P882d//Pdna/z7Z1/8/2dX/QdnT/0ba0v9K29D/S9vO/07by/9Q3Mn/U9zH/1be - xf9a4cP/XeTC/2Lowv9o78T/cPXH/336zv+M/db/nf/g/7L/6v/F//H/2v/5/+///f/3//z/+f/8//r/ - +v/y/+v/4f/e/7/92v+3/dn/wv7O/8r/sf/V/Zv/2vyO/9f9jP/Q5r7WvbOxgn57d7gAAACRAAAAWgAA - ADcAAAAdAAAAMw8PD5G0q6avxtLPtjzT2f8v0NP/MtDR/zPPz/800Mv/N9DJ/zrQyP880cX/PdLD/0DV - wf9F2cL/St7E/1LlyP9b7M3/ZvLT/3H42P97/d3/gv/g/4v/5P+Z/+j/qf/r/7n/7P/E/+f/x//b/7// - zP+0/L//pfm1/5n3r/+M9qv/ePWs/3P3uP+C+sP/hf3J/5D9y/+q+7n/uO2R/7XXZ//P2a3Zxb27iIB9 - ebkAAACRAAAAWgAAADcAAAAdAAAAMw8PD5G1rqiwx9PQtzjS1f8sz9D/MdDP/zLRzv811M7/OdfP/z/b - 0f9E4dX/TOjY/1Pu3P9a9OD/YPni/2X74f9q/N//bv7d/3T/2/96/9r/gf/X/4r+1P+Q/Mv/kfi//43z - sP+F7p//gOmT/4Hmjf+G5Yr/j+WI/5bmh/+a5ob/nOKG/57ahv+k14n/qdyM/6zmkP+k7pT/n/CW/6Hi - hf/K27fayL+9i4J/e7oAAACRAAAAWgAAADYAAAAdAAAAMw8PD5G3r6qxydXRuT7Y1/8z2dX/Ot3Y/0Di - 3P9F6N//SOrg/0nq2/9M6tb/TujQ/0/myf9R58P/VerB/1zwwv9k9cL/a/fA/2/yuf9w6q//buKh/2vb - lf9r2Y3/dNmM/33bi/+C24f/h9uC/4jafv+K1Hr/ic10/4fFbf+Ivmj/jLhg/5K3Vf+Ttkv/lLVO/5m2 - Vf+kvl3/rsti/7HXbf/S4LzbysLAjYOAfLsAAACQAAAAWgAAADYAAAAdAAAAMw8PD5G4sKyzytfTukbh - 3P853tb/PNvR/z/azf8/2Mj/QNTC/z/Quf9D0bb/Ste4/1Leuv9a5L3/X+S5/1/esP9f1qL/X8+X/2HM - kP9lz4z/bNOJ/3HWiP9314T/ftWD/4PRf/9+yHP/eb5o/3m4Y/97s1//f7Bc/4WwVv+MtVH/j7xS/5DA - W/+TxGT/nMVl/6HDYP+kwFj/qLtS/6mzQP/Qz6LczcfHkISBfrwAAACQAAAAWgAAADYAAAAdAAAAMw8P - D5G5sq60y9bSuz/Kwf8yxLf/NsO0/zvHtv9Bzbv/RtXA/0vZv/9O2rv/Udaz/1PQqf9VyqH/WMia/13L - lf9j0JL/adOQ/27VjP9w04b/cM5+/3DHdf9wwm//e8Nx/4bGcf+CwWX/gb9e/4i/Xv+Mw1z/kMdc/5DM - Yf+Mz27/i8tz/47BbP+PuWD/kbJU/5KoSf+WokH/mJw6/5aRKv/Iw5vc0MzKkYWCf70AAACQAAAAWgAA - ADYAAAAdAAAAMg8PD5G6s6+2zNbRvELFuP84xrb/QM27/0XSvf9J1L3/StK3/0vMrP9MyKT/Ucug/1rR - of9j2KH/a9ye/3Dcl/9x2o//c9eI/3fVgf961Xz/ftV2/4DUcP+F02r/ldRu/5nTbv+JyWX/gcZi/4PH - XP+FwlT/grdU/32pVf98nUn/fJM8/3uLNP98hi//gIMr/4SBKP+IgCf/i4Em/4x8Gv/GvZbd08/Nk4eE - gb0AAACQAAAAWgAAADYAAAAdAAAAMg8PD5G8tbC2ztnTvUrQvv8+yrT/Qsqv/0fMrf9P07H/WN22/1/l - t/9j6rT/au2v/3Lsqf956qP/gead/4LilP+A3Ir/f9N+/33Mc/97xGn/d7th/3KyXf9vr2H/d7Zx/3O4 - cP9pr1n/cadC/3icNP90ji//coYq/3SDJv92giT/d38j/3h8If96eiD/fHgg/4B4IP+DeSD/h3oi/4h2 - F//Eu5be1tHQlYeEgb4AAACQAAAAWgAAADYAAAAdAAAAMg8PD5G8tbG4z9nTvlbXvf9S2rv/WuK//2Hp - wv9o7ML/be2//2zps/9p4KX/adWX/2nMjP9txIH/cLx3/22zbf9nqWP/ZKJd/2GdW/9dmlv/XJlc/1yc - W/9lpVn/drBT/3imO/9xjyf/b4Qk/2yAJf9sfiT/cH4j/3aAIv96fx//ense/3l4Hv95dx3/e3Ue/351 - Hv+Adh//hHcf/4VyFf/Dupbe19PSl4eFgr8AAACQAAAAWgAAADYAAAAdAAAAMg8PD5G9trO40dvVv2Te - v/9Y17P/Vs+o/1PHnP9Tv5T/U7mO/1KzhP9Qqnb/UKFr/1OeZv9anmP/YKFk/2CfYv9cmV3/XJhc/1yY - V/9emFD/ZJpH/2eYOv9wmS//fZ0p/3aPJP9qfSH/an0h/25/IP9yfh7/dX4d/3yAHf99fxz/e3oc/3l2 - HP94dBv/eXMc/3tzHP99dBz/gnQd/4JvEv/CuZXe2NTUmIiGg8AAAACQAAAAWgAAADYAAAAdAAAAMg8P - D5C9t7W50NjSwE+3lv9Bq4f/QqF9/0KddP9FnXL/SJ5w/0uebf9Lmmf/TJVi/1CUYP9ZmV//YqFe/2Wf - Wf9imVL/ZZlM/2eYQ/9olDn/Zo0s/2aFJP90jSL/f5Yj/3KHH/9peRz/bHsb/3F+Gv91gRr/eoAa/4CD - Gv9/gBn/fHsa/3l2Gv94chn/eHEa/3lxGf98cRr/gHIb/4BsEP/BuJTf2dbWmoiGg8AAAACQAAAAWgAA - ADYAAAAdAAAAMg8PD5C+ura60NbQwUmjgP8/nHP/QpVs/0GRZv9EkmX/R5Vn/0uYZv9NlmH/T5Nb/1SU - V/9fmlT/a6JT/26hTP9tm0P/b5g7/2iOL/9khCX/Zn8g/26AHf97jR7/fZAe/3GBG/9reRj/b3wX/3SB - F/95gxj/foMX/4SGGP+Dghj/fnwY/3p2GP93chj/d3AY/3hvGP96bxj/fXAZ/31qDv/BuJTg3NjXm4mH - hMEAAACQAAAAWgAAADYAAAAdAAAAMg8PDpC/ure70NbPwUmedP9Al2r/Qo9k/0OLX/9FjF3/SZBc/06T - Wv9Qk1b/U5JR/1qTTP9onEj/eKVE/3qhPf9vlDH/bIwo/2mDIf9rgBz/bX0Z/3B+GP96ixr/fI4a/3F/ - F/9ufBb/cn8V/3qEFf99gxb/gYUW/4eHFv+Fgxb/f3wV/3t1Fv94chb/d28W/3duFv94bhb/fG4X/3to - DP/AuJTg3dnYm4mHhMEAAACQAAAAWgAAADYAAAAdAAAAMg8ODpC/u7i70NbPwkuabf9ClGH/RI1a/0WH - U/9JiFH/TItP/1GOTv9XlEr/XZdG/2aZQP92ojz/gaY1/3eYLP9uiiP/c4oe/3KEGv9wfxX/bnsU/3KA - Fv99jxj/fo8Y/3KAFP9yfhT/eIMU/4CIFP9+hRP/hogU/4iIFP+FgxT/f3wT/3x2E/95cxT/eHAU/3dt - Ff93bRX/e20V/3hmCv/At5Pg3dnanYqIhcEAAACQAAAAWgAAADYAAAAdAAAAMg4ODpDAvLm80dbPwk6Y - Y/9Gk1b/R4pQ/0iCSP9Kgkb/UIhD/1uUQv9kmz7/ap87/3OhNf94nSz/fZok/3mSIP92ihv/e4wZ/3aF - Fv9xgBT/bnwS/3aFE/+DkxX/hZIV/3aDEv94gxL/f4cS/4SMEv+BhxH/iYoR/4iJEv+EgxL/gHwQ/3x3 - Ef97dBL/eXET/3duE/94bRP/eWwU/3dlCf/At5Ph3trbnYqIhcIAAACQAAAAWgAAADYAAAAdAAAAMg8O - DpDAvLm80dbNw1GUWP9Jkk3/TIhH/0yAP/9Vizz/YJc6/2WYN/9upTX/cKAv/22OJf93kSD/g5oe/3+S - HP97ixf/go0W/3qGFP90gBL/c38R/3+LE/+LmRT/ipUU/3yGEf9+iBH/hY0R/4aNEf+FiQ7/iYsP/4iI - D/+EgRD/f3wP/314D/99dhD/fHMR/3pvEv95bRL/em0S/3dmB//AuJLh3trbnouIhsIAAACQAAAAWgAA - ADYAAAAdAAAAMg8ODpDAvLq80tXNw1SSUP9LkEP/U44//16VOv9hlDT/ZZgx/26sL/9qmCf/ZYIg/3CJ - Hv9/lRz/ipsa/4WSGv+AixX/hI0T/3yGEv94gQ//eYMQ/4aSEv+SnhL/i5YR/4CKD/+Ciw7/ipEQ/4iN - D/+Jiw3/i4wN/4iGDP+EgQ7/gHsN/394Df+BeA//gHUP/35yEP99bhH/fG0R/3loBv/BuZLh39zcn4uJ - hsIAAACPAAAAWgAAADYAAAAdAAAAMg8PD5HBvLq90tXMxFWRR/9Znz3/ZaM6/2CPMP9koC7/aa4t/2WN - JP9kfR//a4Qd/3eNG/+Flhj/j5sX/4iSGv+CihL/g4wQ/32GDv96gg7/focO/42XEP+XoBD/jZUP/4WN - Df+Hjg3/j5QP/4iMDv+NjAz/jooM/4mECv+Cfwz/f3oL/4F4DP+DeA3/gnUN/4BzDv9+bw//fW4P/3xr - BP/Cu5Lh39zcn4uJhsMAAACQAAAAWgAAADYAAAAdAAAAMg8PD5HAvLu+09bMxGOjQv9hpjb/X5cx/2Wu - Lv9ipCn/XH4h/2WAHv9qghz/b4Ua/32NF/+LlhX/kpoW/4mQGP+CiA//g4sN/3+GDP98gwv/g4oM/5Sb - Dv+coQ//jZMN/4iODP+MkQz/kJYN/4uLDP+Rjgr/j4oL/4mDCf+CfQr/gHkK/4J4C/+DeAz/g3YN/4Bz - Df9/bw3/fm8N/35uA//DvZLh3tzcoIuJhsMAAACPAAAAWgAAADYAAAAdAAAAMg8PD5HCvbu91NjMxF+Z - O/9boTD/Zr4z/16YKP9YdR//X3sd/2iDG/9sghj/coUX/4COFP+NlxP/kpkW/4iOFf+CiAz/hYkM/4CF - Cv9/hQn/iI4L/5qeDf+doQ3/jZIL/4uQC/+RlQv/kpQL/46MCf+Ujwn/j4kJ/4mDCP+DfQn/gXkI/4N5 - CP+DeAr/gnYL/39yDP9+bwv/gHEM/4BxAv/EvpHh39vcoIuIhcQAAACPAAAAWgAAADYAAAAdAAAAMg8P - D5DCvby+09TLxGCiOf9hwTH/W5cp/1l3H/9beBv/YXwZ/2uDF/9tgRX/dYUT/4OOEv+Plg//kpcT/4eM - Ev+DiAr/hYkJ/4KFCP+Bhgj/jpII/56hC/+doAv/jZEJ/46RCv+WmAr/k5EJ/5KOCP+Ujwj/j4kI/4mC - B/+DfQb/gXoG/4N5B/+Cdwn/gXQK/35xCv99bwn/gHIL/4FzAP/Ev5Hi3drboYqIhcQAAACPAAAAWgAA - ADYAAAAdAAAAMg8PD5DBvLy/1dzMxWG4N/9WkSX/WoUi/1t8HP9cdxn/YnsW/2uBFP9vgBH/d4UQ/4WN - EP+OlQv/kZUQ/4aKEP+Dhgf/hYgH/4KEB/+Ehgf/lJUH/6GiCv+cnQn/kZEH/5OSCP+ZmAn/ko8I/5WQ - B/+Vjwf/j4gH/4mCBv+EfQX/gnoF/4J4Bv+Cdgf/fnQI/3twCP97cAj/gXQK/4F1AP/Ev5Hi3djbooqI - hcQAAACPAAAAWgAAADYAAAAdAAAAMg8PD5DBvr2/1NbLxlmELP9Wih//XIkg/1x7Gf9cdhb/Y3kU/2x/ - Ef9ufw7/eYQN/4SNDP+Nkwj/kZQQ/4WJDf+EhQX/hoYF/4KEBv+GhwX/mJgG/6OkBv+bmgf/k5EH/5aV - Bv+Zlwf/ko8F/5eRBv+VjgX/jocG/4iBBf+EfAT/g3sE/4J4Bf9/dQb/fHIG/3pvBv97cQb/gnYJ/4J3 - AP/Ev5Di3NnbooqIhcQAAACPAAAAWgAAADYAAAAdAAAAMg8PDpDDvr2/1NXLxleCKf9Xixz/XIoe/1t6 - GP9ddBX/Y3cS/2t8D/9vfQ3/eYIM/4SLC/+MkQj/kJIS/4SGDP+DhAP/hYUF/4KDBf+KiQX/m5oG/6Ok - Bf+YlgX/k5AG/5iWBv+Wkwb/lI8F/5iRBv+Tiwb/jYQG/4d/BP+EfAP/g3sE/4B4Bf99dAT/enAF/3du - Bv96cQb/gHYI/4J3AP/EwI/j3Nnbo4qIhcUAAACPAAAAWgAAADYAAAAdAAAAMg8PDpDDv77A1dXMxliA - KP9Wihv/XYob/1x6Fv9dchP/YnUQ/2t7Dv9tfAz/eIEL/4SKCv+Kjwf/jpET/4KECf+BggP/g4MF/4KC - Bv+NiwX/nZwF/6KiBv+VkwX/k5AG/5iVBv+Tjwb/lY4G/5ePBv+QiQb/i4IG/4V9BP+DfAP/g3oF/391 - Bf96cQT/dW4E/3RuBf94cQb/f3cI/4F5AP/EwY7j29nbpIqIhcUAAACPAAAAWgAAADYAAAAdAAAAMg8O - DpHEwL7A1dbMxll+Jv9XiRj/XooZ/1t6Ff9bcBL/YnMP/2l5DP9segv/d4AJ/4OJCP+KjQf/jpAV/4CC - CP+AgQP/gYIE/4GBBf+PjQX/n50G/6GeBf+Ujwb/lZAG/5iTBf+SiwX/lo4F/5WMBv+PhgX/iIAF/4R7 - A/+DewT/gngF/350BP93cAT/cm0E/3JtBP93cgX/fHcH/4B5AP/Bvo3j29jbpImIhcYAAACPAAAAWgAA - ADYAAAAdAAAAMg4ODpDEwL/A1tbMxll8I/9YhhX/XooY/1x5FP9cbxD/YXEN/2h3DP9teAr/dn8I/4GH - CP+Jiwf/jY4V/36AB/9/gAT/f4AD/4KBBP+Sjwb/oJ4G/56ZBv+SjAf/lY8G/5WQBf+RiQb/l4wG/5OJ - Bf+NgwX/h34E/4N6A/+DeQT/gHYE/3xyBP91bgT/cGsD/3FtBP91cQX/e3gG/3t3AP+9uo3j3NrbpYmI - hcYAAACPAAAAWgAAADYAAAAdAAAAMg4ODpDFwb/A1tfNx1d6If9XhBP/XokW/115Ev9bbg3/X3AM/2d0 - C/9sdgn/dX0H/4GGB/+IiQf/jI0W/3x+Bf9+fgP/fn4D/4OABP+UkQX/oZ4G/5qUBv+RiQf/lY4F/5KL - Bf+Qhwf/looG/5CFBf+LgQX/hnwE/4J4Bf+BdgX/fnME/3pwBP9zbAT/b2oD/3FtA/90cQT/e3oF/3Nw - AP+6uI3j3drbpYqIhcYAAACPAAAAWgAAADYAAAAdAAAAMg8ODpDHw8HB1tfNx1Z4H/9XghL/XogT/1x5 - EP9abA3/Xm4L/2VyCf9qdQf/dXwH/4GEBv+Ghwb/i4sY/3p7Bf98fQT/fHwD/4SBBP+VkwX/oZ0G/5WP - Bv+QiAX/k40F/4+HBf+Rhgb/k4cF/4yCBf+KgAT/hHkE/4F3Bf+AdQT/fHIE/3ZuBP9wawT/b2oD/3Bs - A/9zcQP/eXgF/21pAP+5tY3j3drbpYqIhsYAAACPAAAAWgAAADYAAAAdAAAAMg4ODpDHw8LB2NjOx1Z1 - H/9Vfw//XYYR/1x3Dv9Zag3/XmwK/2NxCP9qcwb/dHsG/3+DBf+EhQb/iYkZ/3h4A/96ewT/enoE/4WC - BP+XlAT/npsF/4+KBf+Phgb/kIkF/4yDBf+RhQb/kIMF/4p/BP+IfwP/gXcF/4B1BP9+cwT/enAE/3Ns - BP9wagP/b2oD/29sA/90cgP/dHMF/2diAP+2s4zj3drcpoqIhsYAAACPAAAAWgAAADYAAAAdAAAAMg4O - DpDHxMPB2NjOx1VyHf9Teg3/XIQQ/1x2Df9ZaQv/XWsI/2JwB/9pcQb/c3kG/36BBP+ChAf/hocZ/3V2 - Av94eAX/eXgE/4aDA/+ZlAX/m5cF/4yFBf+NhgX/jYUE/4mABP+PgwT/i4AE/4l+BP+FewT/f3QE/390 - BP98cgT/d24E/3JrA/9vagP/b2sD/29sA/9zcwP/bm0D/2FdAP+0sozj3drcpoqIhsYAAACPAAAAWgAA - ADYAAAAdAAAAMg4ODpDJxcTB2dnPx1RvG/9Sdgz/W4EO/1x1C/9ZaQn/W2kH/2BuBf9ocQX/cncG/3t+ - A/+Aggj/hIUY/3JzAv92dgX/eHcE/4iEBP+YlAX/lpIE/4iCBf+KgwX/iIAD/4h/BP+NgQT/h30E/4d+ - BP+BeAT/f3ME/31yBP96cAT/dG0E/3BqA/9uagP/bmsD/3BtA/9xcQP/aWcC/1xYAP+zsIvj3trcpoqI - hsYAAACPAAAAWgAAADYAAAAdAAAAMg4ODpDKx8XB2drQyFNtGf9Rcgv/W34N/1t0Cv9YaAj/WmcH/19s - Bv9mbwX/cXYE/3l8Av9/gQr/goIW/3BxAv91dAT/d3YE/4mFBP+YlAX/kYwF/4Z/Bf+GfwT/g3sE/4h+ - BP+JfgT/hXsD/4Z8BP99dAT/fXIE/3txBP93bgT/cWsD/25pAv9tagL/bWoC/3FvA/9tbAP/ZGID/1dU - AP+xrovk39vcqIqIhscAAACPAAAAWgAAADYAAAAbAAAAMQ4ODo/Kx8XB2NjOxlFpFv9NbQb/V3oJ/1hx - Bv9UZQT/V2QE/1xoA/9kbAH/bnMA/3Z5AP99fwr/fX4S/2xtAP9xcAH/dnUB/4iFAv+VkQL/i4QB/4F7 - Av9/eAH/f3cC/4R7Af+EegH/g3gB/4J4Af94bwH/eW8C/3duAf9yawL/bWgA/2tnAP9rZwD/a2kA/25t - AP9mZQD/YF0A/1JOAP+uq4nj3tvcp4qIhscAAACNAAAAWAAAADUAAAAYAAAALBAPD4zKxsS/0tHHvVZt - Hf5TcA//XHsQ/111Dv9aag3/XWkO/2NtDP9qcQr/c3gL/3p8Cv+Bgxf/foEa/3BxCP91dAv/e3sM/42L - Df+XlA3/ioQN/4R+Df9/eQz/g3wM/4iAC/+GfAz/iH8M/4J5DP99dAz/fXQM/3lzDP91bwv/cm0K/3Ft - Cf9xbQr/cnEK/3FwCv9paAv/ZGIK/1ZSB/+ppofa2NXVoYyKiMYAAACJAAAAUgAAADAAAAAUAAAAJAsL - C4K/vLi/1dHLo8zNwMHS1MbM1NbHztXWx87U1cfO1dXHztXVx8/W1sfO2NfHztjXx87Z18jO19bHzNXU - xcvV08PK1dTDydfVw8nY1sPJ1tTDyNbTw8jV08PJ1tPDydfUw8nW08PK19TEytbUxMrW08PK1tPEy9bT - xMvW1MXL1tPFy9XSw8vU0cPM09HCzNLRwszRz8LM0c7CzMnHu8XGwruwzcjEmYSCgMYAAAB7AAAARgAA - ACgAAAAOAAAAGgAAAFNpaGbH2NTOsuDc2avi3duv4t3br+Pe26/j3tuv49/br+Lf27Dh39uv4d7br+Hd - 26/g29qu3trYrNzY1qnb1tOo2dXSp9jU0afY09Gn2NXRptnU0aba1NGl2dXRptnU0qfZ1NOo2tbUqNvW - 1Kjb1tSp3NbVqd3Y1qnd2dap3dfWqtrW1KrY1NOs19TSrNfT0qzX09Ks19PSrdbRz6vQy8envrq2vTEx - MLgAAABXAAAANQAAAB4AAAAJAAAAEgAAACcAAABnMzMyq09OTbRMS0qzS0tKtExLSrRMS0q0TEtKtExL - SrRLS0q0S0tKtEtLSrRLS0qzS0pJs0pJSbNLSkizSkpJs0pKSLNKSkizSkpIs0tJSLNLSkmyS0pJsktK - SbNLSkmzS0pJs0tKSbNMSkmzTEpJs0xKSbNMSkmzTEpJs0tKSbNLSkmzS0pJs0tKSbNLSkmzS0lJs0tK - SbRNTEu2Hh0dowAAAF4AAAA4AAAAJQAAABMAAAAFAAAACwAAABYAAAAhAAAALQAAADcAAAA6AAAAOgAA - ADoAAAA6AAAAOgAAADoAAAA6AAAAOgAAADoAAAA6AAAAOwAAADsAAAA7AAAAOwAAADsAAAA7AAAAOwAA - ADsAAAA7AAAAOwAAADsAAAA7AAAAOwAAADsAAAA7AAAAOwAAADsAAAA7AAAAOwAAADsAAAA7AAAAOwAA - ADsAAAA7AAAAOgAAADsAAAA6AAAAMwAAACsAAAAhAAAAFQAAAAsAAAACAAAABAAAAAkAAAAOAAAAEwAA - ABcAAAAZAAAAGQAAABkAAAAZAAAAGQAAABkAAAAZAAAAGQAAABkAAAAZAAAAGQAAABkAAAAZAAAAGQAA - ABkAAAAZAAAAGQAAABkAAAAZAAAAGQAAABkAAAAZAAAAGQAAABkAAAAZAAAAGQAAABkAAAAZAAAAGQAA - ABkAAAAZAAAAGQAAABkAAAAZAAAAGQAAABkAAAAYAAAAFwAAABMAAAAOAAAACAAAAAQAAAAAAAAAAQAA - AAIAAAAEAAAABwAAAAkAAAAKAAAACgAAAAoAAAAKAAAACgAAAAoAAAAKAAAACgAAAAoAAAAKAAAACgAA - AAoAAAAKAAAACgAAAAoAAAAKAAAACgAAAAoAAAAKAAAACgAAAAoAAAAKAAAACgAAAAoAAAAKAAAACgAA - AAoAAAAKAAAACgAAAAoAAAAKAAAACgAAAAoAAAAKAAAACgAAAAoAAAAKAAAACQAAAAcAAAAEAAAAAgAA - AAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAoAAAAIAAAAEAAAAABACAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAABAAAAA4AAAAfAAAALQAAADQAAAA0AAAANAAAADQAAAA0AAAANAAAADQAAAA0AAAANAAA - ADQAAAA0AAAANAAAADQAAAA0AAAANAAAADQAAAA0AAAANAAAADQAAAA0AAAANAAAADQAAAA0AAAANAAA - ADIAAAApAAAAGQAAAAoAAAAMAAAAJAAAAEQAAABhAAAAawAAAGsAAABrAAAAawAAAGwAAABsAAAAbAAA - AGwAAABsAAAAbAAAAGwAAABsAAAAawAAAGsAAABrAAAAawAAAGsAAABrAAAAawAAAGsAAABrAAAAbAAA - AGwAAABsAAAAaAAAAFcAAAA7AAAAGgAAABcAAAA+ExMSkD07OKo7ODWpODUyqDczMKg1Mi+nNDEupzMw - LaczMC2nMzAtpzQxLqY2MzCnODUypzk2M6c5NzOoOjc0qDs3Nag7ODWoOzg1qDs4Nag7ODWoOzg1qDk3 - NKc4NTKnOTYypzs5Nqg5NzSuCQkJlwAAAFsAAAAuAAAAHAYGBmmCfHamr6adhbevp5GyqqKQraWdjami - mYumn5aKpJyUiaSalImkm5OJqJ+Xia6lnoq0qqOKta2li7WtpYy1rqaNtq6njbawpo22saeOt7Opj7mz - q4+8squPua+ojLWsp4u4rquNt62oiaiek3llYVysAAAAfAAAADoAAAAeEA8PdbClnqGF19nWY+Hn9mng - 5PZs3+L1cOHh9XXi3/V44t31e+La9X/j2PWE5Nf1iefX9ZDr2fWY8Nv1o/Tf9bL35PXB+un11Pzu9eX9 - 8vX2/fn1/v759fX99vXu/PL18P3e9fD9x/bu/bfzy860qIiBfp0AAACHAAAAPQAAAB4ODg1zvbGsrmza - 3uwp09b/MtLR/zTSzf8508r/PdTH/0HXxf9H3MX/UOPI/1rry/9m89D/c/vV/4P/3f+Z/+X/s//s/8f/ - 6v/P/9//yf7R/7z8yP+p/Lz/jfq+/5D9yf+f/8T/ufyk/8Dre//P17a/j4iIowAAAIYAAAA+AAAAHg4O - DXPAtK+xadjZ6yfR0f811tP/O9vV/0Hg1v9H5tf/T+vX/1fx1v9f99f/af3X/3L/1f96+8//f/XF/4Xx - uP+J7ar/humY/4Tmi/+I4oT/jN5//4/YfP+U0Hj/nc12/6HVfv+j4ob/p+SD/8/YvcGTjIumAAAAhgAA - AD4AAAAeDg4Nc8G2srNx4dzrMtzV/z/c0v9C3dD/RNvI/0jcwf9P377/V+O7/1zjtP9h3qn/Zdmd/2nW - kv9s1In/ctOC/37SgP9+y3X/fsJr/4G7Zf+Ft13/i7hY/5G9WP+Vv1r/nL5a/6W8Vf+uv1H/09S0w5SQ - kKgAAACFAAAAPgAAAB4ODg5zw7m1tW/RyewuxLb/PMq4/0PQvP9I0rj/TNCv/1PPqP9az6H/YdCZ/2fS - j/9u1In/c9OB/3bPd/99y3D/jcxw/4XEZP+Ewl//i8Vb/4vDX/+IvmP/h7Rd/4qpUP+PoEL/kpg4/5aQ - K//OyKrFmJWVqwAAAIUAAAA+AAAAHg4ODXPEura2ddTG7DjKs/9H0LX/Udi4/1netf9f4a7/aeWo/3bl - of994Zb/fNmH/3vPeP96x23/d79l/3q+af+Bwm//dbZY/3mrQ/94mzn/dY40/3eFLP94fiT/enoh/395 - IP+EeSD/inod/83FqcabmJisAAAAhQAAAD4AAAAeDg4Nc8W7uLiE4MztUNy6/1zfuP9j37X/Zdyq/2LP - lf9jwoP/arl4/2uxbf9kpWP/YJ1c/16aWP9fmlL/bKNM/3aiO/9tiCb/bH8j/258If91fh//en0e/3l4 - Hf95dRz/fHQd/4B2Hv+GdRr/zcWqx5yamq0AAACFAAAAPgAAAB4ODg5zxr27uYDOtu1DtY//R6mB/0ik - ef9LonP/S5pn/06UYP9aml//Yp5c/2CYVP9jmEv/ZJQ8/2aMK/93kyP/d40g/2l6Hf9ufRz/dX8b/36B - G/9/fxr/eXca/3hyGv96cRr/fXIb/4JxF//MxKrJnZubrwAAAIUAAAA+AAAAHg4ODnPHwL66draa7jiU - av9Bj2T/RJFj/0qWY/9Nk13/U5JV/2SdUf9xo0r/bpk8/2qNLf9mgSH/bH4b/3yNHf90hRv/bHoX/3SB - Fv97gxf/g4YX/4OBF/97dxf/d3EX/3hvF/96bhj/f20U/83FqsmfnJ2wAAAAhQAAAD4AAAAeDg4Oc8jB - wLx4sZHuO5Bd/0SJWP9IiVP/T45R/1aUTP9hl0X/dqM9/3ueMv9wjCT/cIUc/259Fv9wfhb/fY4Y/3WE - Fv9xfhT/fIUU/4CGFP+HiBX/hIEU/3x4E/94cRX/d24V/3htFf98axH/zMWqyqCenrEAAACFAAAAPgAA - AB4ODg5zyMLBvHuvhu5AjU3/SIJH/06GQv9bkj//aKA8/3CeMv96mif/e5Qf/3mLGf96hxb/cH4S/3aD - E/+GlRX/fIkT/3uEEv+DixH/hYkQ/4mKEf+DgRH/fXgQ/3t0Ev95bxP/eGwT/3pqDv/MxarLoZ6fsgAA - AIUAAAA+AAAAHg4ODnPJw8K9fat87kaMP/9XjTz/YJQ1/2qjMv9qmCn/bYkg/4CWHP+FlRr/gYwV/36I - Ev92gBD/gYwR/5CcE/+DjRD/hIwP/4iPEP+Jiw3/iYkO/4N/Dv9+eA7/gHcP/35yEP97bRH/e2sM/83G - qsyhn6CzAAAAhQAAAD4AAAAeDg4Oc8jCw76Dr3PuV5w0/2OcMv9lpCz/ZZAk/2d/Hf91ihr/ipkY/4yV - Gf+DixH/f4gO/3uDDf+LlA//lp4Q/4ePDf+LkQ7/i48O/46MC/+Khgv/gX0L/4F4DP+Ddw3/gXQO/35u - Dv9/bgr/z8mqzKGfoLMAAACFAAAAPgAAAB4ODg5zyMPEvomzbe5apyv/YqYs/1uAIP9kfRv/bYMZ/3yM - Fv+PmBT/jJIW/4OJDf+Bhgr/gIYK/5WaDf+ZnQ3/ipAL/5GVDP+Pjwr/ko0K/4uFCf+CfAj/gnkJ/4N3 - C/+Acwz/fm8L/4FyCP/QyqrNoZ+gswAAAIUAAAA+AAAAHg4ODnPJwsW+ib9r7leoJf9afyD/XHca/2iB - F/9wghT/gIwR/5CXD/+KjxH/hIcJ/4OGCP+FiQj/nJ4K/5mbCv+PkQn/lpYK/5OPCP+Tjgj/ioQH/4N8 - Bv+CeQf/gnYI/31yCf98cAn/g3YG/9DKqc2gnZ+1AAAAhQAAAD4AAAAeDg4Oc8nExr+Fr2TvUYYZ/1t+ - HP9ddxb/aX4S/3GBD/+Ciw3/kJUL/4mMD/+EhgX/g4UG/4qLBv+goQf/mZgH/5WTB/+WlAf/lZAG/5SN - Bv+Kggb/hHwE/4J5Bf9/dQb/enAH/3xxB/+EeAX/z8qozp+dn7UAAACEAAAAPgAAAB4ODg5zy8XHv4Ke - X+9ShhT/XH8Z/15zE/9oeg//cX4N/4GJCv+Okgv/iIoO/4ODA/+CgwX/j44F/6GhBv+XlAX/lpQG/5WR - Bf+XkAb/kYkG/4iABf+EfAP/gXgF/3tyBP92bgX/e3IG/4N6A//Py6fOn52ftQAAAIQAAAA+AAAAHg4O - DnPLxsjAg55d71OFEf9dfxb/XXER/2d3Df9vfAr/gIcI/4yQDP+Ghw3/gIEC/4GBBf+TkQX/oZ8G/5WQ - Bv+XkgX/lI4F/5aOBv+OhQX/hX0E/4N7BP9/dQX/dm8E/3JtBP93cwX/gXsB/87Kp8+fnZ+2AAAAhAAA - AD4AAAAeDg4Oc8zHycCDnFzvU4MN/11+FP9dbw//ZnQM/295Cf9+hQf/i40N/4OEDP9+fgL/gYAE/5eU - Bv+fmwb/k40G/5WPBf+Tigb/lIkG/4uCBf+EewT/gngE/31yBP9zbAP/cGwD/3ZzBP98eAD/ysemz5+d - n7cAAACEAAAAPgAAAB4ODg5zzcnKwYKaWe9TgQr/XX4R/1tsDP9jcgr/bXcH/32CBv+Jiw3/gIEM/3t7 - A/+CgAT/mpYF/5uVBv+Rigb/kYoF/5KHBv+QhAX/iX8E/4J3Bf9/dQT/eXAE/3BrBP9wbAP/dnQD/3Rx - AP/HxKbPoJ6gtwAAAIQAAAA+AAAAHg4ODnPPyszBgpdZ71B8B/9cfA//WmoL/2FvCP9sdQb/fIAE/4eI - Dv99fgz/eHgD/4KABP+blwX/lI8F/46GBf+NhAX/kIQF/4yABP+FewT/f3UE/31yBP91bQT/b2oD/29s - A/90cwP/a2gA/8XBptCgnqC3AAAAhAAAAD4AAAAeDg4Oc9HMzsGBlFbvTnYE/1x5Df9aaQn/X2wG/2py - Bv95fQP/hIUO/3l6C/91dQP/g4AE/5qWBf+OiAX/ioIE/4mABP+LgAT/iH0E/4F3BP9+cgT/eW8E/3Fr - A/9uagP/cG0D/29vAv9jXwD/w8Cm0KGeoLgAAACEAAAAPgAAAB4ODg5z0s7Pwn6RU/FKbgD/WXUH/1Vl - Bf9baAP/Z28B/3V4AP9/gQz/c3QF/3FwAP+DgAH/lZEB/4aAAf+CegH/hHsA/4Z7AP+DeQD/e3EA/3lv - Af9zawH/bGcA/2toAP9ubAD/aGYA/1pXAP/BvqXRop+guAAAAIQAAAA9AAAAGhAPD3HRzM69g5JZ7FNy - DP9hexT/Xm0S/2RvEf9vdg//e38O/4WHHf93ehP/eHgP/4yKEf+XkxH/iIIR/4R9EP+KgRD/ioAR/4d/ - EP+AdxD/fXYQ/3dyD/90cA7/dHEO/3V0D/9sag//X1wM/725o8qjoKG3AAAAgAAAADgAAAARCAgIX7e0 - sL3e3dK13NzOxd7ez8bd3M/G3t3Pxt/ez8bh3s/G4N3Pxd3azMLc2crB3drJv93ayb/c2Mm/3NjIv93Z - yb/d2crB3drKwd3YysHd2cvB3drMwtzYysLa1snD2dbIw9jVycTT0MTA19LMqoqHhbsAAABpAAAAKwAA - AAsAAAAqLy4tj3t5d698eXmte3h4rXt5eK17eXitenl4rXp4eK15d3eseHV2q3d1dap2dHSpdXN0qXZ0 - dKl3dHSodnR1qXd1dap3dXWqeHV2qnh2dqp5dnaqeHV1q3Z0dat2dHSsdnR0rHh2dqxubGqwGhkZiAAA - ADgAAAAaAAAABQAAAA4AAAAdAAAAMAAAADUAAAA1AAAANQAAADUAAAA1AAAANQAAADUAAAA1AAAANQAA - ADUAAAA1AAAANQAAADYAAAA1AAAANQAAADUAAAA1AAAANQAAADUAAAA1AAAANQAAADUAAAA1AAAANQAA - ADQAAAAlAAAAGAAAAAsAAAABAAAAAwAAAAYAAAAKAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAA - AAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAA - AAwAAAAMAAAADAAAAAoAAAAGAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKAAAABgAAAAwAAAAAQAgAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAcAAAAaAAAAMQAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAA - ADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADgAAAAnAAAADwAAABUAAABKDAsKhg8N - DI8ODAuODQsKjg0LCo4MCwqODAsKjg0LCo4NCwuODQwLjg4MC44ODAyODgwMjg0MDI4NDAyODQwMjg0M - C44MDAuODg0NjwkJCY4AAABhAAAAKgAAACYyMC6KmpSMnKGclZ2alY6blZGKmZKOhpeQi4SXkYqEl5WO - iJeclZCYoJmTmJ+ak5mgm5SaoJ2UmqKelZumn5mbq5+bm6ebl5mkmpeZpZyYlo+Hf5YgHx6XAAAAQgAA - AC9kWVWRm9nZy1vg5fRi3t/0Zt7c9Gze2fNw3tXzdeHT833l0/OH7NbzlPPb86f55PTB/O702v/y9Oj/ - 8/Tv//P04f/u9Nj/6/Pj/8706Puu8svNtKc9OjuaAAAASgAAAC5pXVqVid3d4CPS1P8x1ND/ONjP/z/d - z/9I5c//VO7S/2L41v9y/9j/gP/Y/5T91P+k+sr/qPa3/6TyqP+b757/jOmb/5Ppo/+j8qH/seyH/87T - ub1APD6aAAAASgAAAC1qXluWjuHd4C/a1P8/3NL/RN7O/0rgyP9U5MP/XOe9/2Tlsf9q4KT/btuU/3XY - if99037/fMpv/4LDaP+KwGH/ksBd/5m/Wv+hwFv/rMhg/9HSub5BPkCcAAAASQAAAC1rYF6XkNnR4S/H - t/9Bzrn/SdO3/1DTrv9c1qb/Z9ec/27Wjv901IH/d890/4LLcP+IyG3/gcBc/4a7VP+EtFb/g6pR/4ie - RP+NlDb/lo4t/87HrsFDQkSdAAAASQAAAC1rYF+YmuDS4kXXuf9Y3rv/YuO2/2XepP9v15T/d82F/3K+ - c/9ts2b/aqxe/3SyXv91qUv/cZQy/3GHKv92gCT/eHke/3l1HP9/dRz/iXgf/87Hr8NFREaeAAAASQAA - AC1rYmKZn9vI40a+l/9OtIn/Ua5//0+hbf9Wm2L/YZ5e/2CYVP9glEj/Y441/3aWKP9wgx7/a3oc/3V+ - G/9+gBr/enga/3hyGv97cRr/hHQc/87HsMVFRUafAAAASQAAACxtZmaalsWu5DeQZP9CjGD/SZJf/06R - WP9dmFD/cqJI/26VNv9phSP/bX4a/3qLG/9vfhj/c38W/36EF/+FhRf/fXkW/3dwF/94bhb/gHAX/8/I - scZHRkifAAAASQAAACxtZ2ibmcKl5TyLUv9Hg0z/Uo1I/2GaQ/9ynjf/fJsp/3WKHP9ygRb/cn8U/3+P - Fv91ghP/fYcT/4WJEv+HhhP/fnoS/3lxE/93bRP/fG0U/8/IssdHRkifAAAASQAAACxtZ2mbnL+b5UWK - Pv9YjDr/Zp40/2uXKv92kR//g5Ua/4GMFf94gxH/fYkR/4yYE/+BihD/h44Q/4mLDv+GhA7/f3kO/391 - EP97bhD/fW0R/9DJsslHR0mgAAAASQAAACxsZ2ucosKS5lidMP9joS3/ZI8k/2mBG/+Bkhf/jZYY/4OK - EP98hAz/ipIO/5ObD/+Ijw3/jZEN/46LC/+GgQr/gXkL/4N3Df9/cAz/gXEO/9HMsslHR0mgAAAASQAA - ACxtZ2ycpsqN5linJv9bgyD/Y3sZ/3GEFv+JkxL/jpMT/4OIC/+AhQn/lJgL/5aaC/+Pkwv/k5EJ/5GM - Cf+GgAj/gnkI/4J2Cv99cAn/g3UL/9LMsspHRkmhAAAASAAAACxtaG2do8WJ5lGJGf9beBn/ZnwT/3SD - D/+KkQz/jI8O/4SFBv+Ehgb/m5wH/5iYB/+VlAf/lZEH/5KLBv+GfwX/gnkF/390B/96bwb/hXkJ/9HM - sMtHRkmhAAAASAAAACxuaW6dobWE51GDEf9cdxX/ZngQ/3SADP+Ijgr/iowN/4GCBP+HhwX/np0F/5eU - Bv+Wkwb/lo8G/4+HBv+FfQT/gXkE/3lwBP92bwT/hHsH/9HNr8xGRkmhAAAASAAAACxuam6dorWD51KC - Df9cdhP/ZHQN/3J9Cf+Hiwn/h4gN/35/A/+KiQX/n5wG/5WQBv+VjgX/lYsG/4uCBf+DewT/f3UE/3Nt - A/9zbwP/gHsG/87Lr8xGRkmiAAAASAAAACxva2+dorSB51J/Cf9cdA//YXAL/3F6B/+FiAn/hIQN/3t7 - A/+OiwT/nJgG/5KLBv+SiQb/kYYF/4h+BP+BdwX/e3EE/3BrA/9ybwL/eHYE/8vIr81HRkmiAAAASAAA - ACxwbXGeorGB51B6BP9bcg3/X2wI/293Bv+ChQj/f4AN/3h4A/+QjAT/lpEF/42FBf+OgwX/jIEE/4R5 - BP9+cwT/dm0E/29qA/9xbwL/b2wD/8jFr81IR0miAAAASAAAACxyb3Keoa5+6UtwAP9YbQb/WmcD/2px - AP99fwT/eHkJ/3NyAP+OiwH/jogB/4R8AP+HfQD/hXsA/31yAP94bgD/b2kA/2xoAP9tawD/Yl8A/8bD - rs9IR0mjAAAASAAAACl0cXScprGE41Z1D/9idhb/ZG8U/3R6Ef+Ehhj/fn8Z/3x8Ev+WkxP/jokT/4eA - E/+NgxP/ioET/4N6E/99dhL/dnIR/3d0Ef9zchH/ZmMP/sbCsMlLSkuiAAAARAAAABhKSEeN09HJw9DR - w8rR0MPK0dDDy9PRw8rU0cPK0c7Bx8/MvsXQzb3E0My9xM/MvcTQzL3F0c2+xdDMvsbQzb/Gz8y/x83K - vcjMyb3Jyse8xsK+uLwtLSyQAAAALgAAAAgAAAAyJCMjbSwrLHErKitwKyorcCoqK3AqKStwKSkqcCko - Km8oKCpvKSgqbykoKm8pKCpvKSgqbykpKm8qKSpvKikqcCkoKnApKCpwKyoscR0cHG8AAAA6AAAAFAAA - AAIAAAAFAAAACAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAA - AAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAsAAAAKAAAABAAAAEEAAABBAAAAQQAAAEEAAABBAAAAQQAA - AEEAAABBAAAAQQAAAEEAAABBAAAAQQAAAEEAAABBAAAAQQAAAEEAAABBAAAAQQAAAEEAAABBAAAAQQAA - AEEAAABBAAAAQSgAAAAUAAAAKAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKAAAAJgAA - AEMAAABIAAAARwAAAEcAAABHAAAARwAAAEcAAABHAAAARwAAAEcAAABHAAAARwAAAEcAAABHAAAARwAA - AEcAAAA0AAAAFQAAACIWFRN0PzUxlDwwLJI4LSqQNiwokDUqJ481KiiPOC4rkDowLpA5MS6RODEvkTcx - L5E1Mi+RNjIvkTQwLpA0MDCQNjIylRAPDoQAAAA5AAAAPXd1cJyfzsy9k8rIxZLGwsOTxL7BlMG6wZjD - usGhyr/BqtHEwrTWycPC2c/D0dzTxN7e2MTg3tnE2NvRwtvbwcPS0bOsX1xYnAAAAFYAAAA9jI+Mqk/h - 5v8w2Nn/O9zW/0Tg1f9O6NT/XPLX/2382v+A/9//nP/j/7b/3v/B/8//vf3D/6f5vf+n+8L/vP+m/9Pv - qOh1b3CeAAAAVwAAADyNkI2tUuHd+jbZ0v9B3c//SeDJ/1XmxP9g6r3/auix/3Hhof973ZH/gNZ//3/N - b/+Gx2f/jsVj/5jEYv+gyF//xdeT5nh0daIAAABWAAAAPI6Rjq5X1cf6Pc66/0zXuv9V2a//ZNqk/27Y - lP9z04L/dsxy/4HJcP+CwmX/gbdR/4KtTv+Bo0n/hpc8/4uJJ/+4rm3nfHp7pQAAAFYAAAA8kZOQsGvg - xvpT17H/X9ep/2DMkv9rwYD/bbVw/2eoYf9lolT/c6hL/3CVM/9vgyX/dX4g/3h4HP95chv/fG8T/7Gj - aOh/fX6nAAAAVgAAADySlJCyYruZ+0Gccf9Jmmv/TJJf/1yYV/9om03/ZI86/2iGJf94jB3/bXsY/3R/ - GP+Agxn/fXoY/3dxGf93axD/rqFm6YB/gKgAAABVAAAAPJKUj7Nfpnv7QIVS/02MT/9cl0n/c6A7/3eV - Kv9wgxr/cH4V/3uLF/90gBT/f4YU/4eHFP9/exP/eHAU/3NnC/+rnmPqgoCCqQAAAFUAAAA8kpOPs2aj - Z/tPiTz/Ypo2/2yXK/98lR//gpAY/3uFEv97hxH/iJUS/4GKEf+IjA//iIcO/4B7Dv99dBD/dmgH/6uf - YeqDgYOqAAAAVQAAADyTk4+0da9X+1+gLP9kjiP/bYMa/4mVF/+JkBT/foUM/4mQDv+SmQ7/ipAN/4+O - DP+KhQr/gXkL/4N2DP96awP/rqNg6oOBg6sAAABVAAAAPJSVj7V2uE37WIcd/2J6F/91hhP/jZUR/4iM - Dv+BhQf/k5YJ/5eZCv+Tkwn/lI8I/4qDB/+Cegf/gXUJ/3lsAP+xp17rgoCDrAAAAFUAAAA8lJSPtXCd - QfxYexX/ZHkS/3eDDf+MkQz/hogJ/4SEBf+amgb/mZcG/5aTBv+Vjgb/iYEF/4J6BP97cQX/d20A/7Gq - XOuBgIOtAAAAVQAAADyVlJC1cZg8/Fl7Ef9jdA7/dX8J/4qNDP+Cgwj/hIQE/52aBv+XkgX/lY8F/5KJ - Bv+GfgT/gHYE/3RtBP9zbgD/r6pa7IGAg64AAABVAAAAPJaVkLZxlTj8WXkM/2BvC/9zfAf/h4oM/35/ - B/+GhAP/nJcG/5OMBv+TiQb/jYMF/4N5Bf98cgT/cGsD/3BtAP+no1nsgoCDrgAAAFUAAAA8l5aStm+P - NPxXdgj/XmsI/3F4Bf+EhQv/eXkH/4eFBP+XkgX/jIQF/42DBf+IfQT/f3QE/3ZuBP9vawP/a2oA/56a - WOyCgIOuAAAAVQAAADyZmJS4ZYIm/01qAP9TYAD/Z24A/3h6AP9tbQD/goAA/4qDAP9+dgD/gngA/3tx - AP90aQD/amMA/2dlAP9dWwD/kY5P8ISDha8AAABVAAAAM5eVkbGyvY7jo7B16aasd+mwsnXouLd66LCv - dOa8uXPlvLdz5beyc+W7tHPmt7F05rOudOavq3Pmrqty56akcei/u5vWe3l5rQAAAEgAAAASKikoaG5r - bpFtam6PbGptj2tpbY9pZ2yOaGZqjGZkaYtmZGmLZ2Vqi2dlaoxoZmuMaWdrjGlna41nZmqNaWdrjmVj - ZJAdHBtrAAAAHwAAAAMAAAAJAAAAFQAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAA - ABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAAA4AAAAGAAAAQQAAAEEAAABBAAAAQQAAAEEAAABBAAAAQQAA - AEEAAABBAAAAQQAAAEEAAABBAAAAQQAAAEEAAABBAAAAQQAAAEEAAABBAAAAQQAAAEEoAAAAEAAAACAA - AAABACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEQAAAEAAAABXAAAAVQAAAFUAAABVAAAAVQAA - AFUAAABVAAAAVQAAAFUAAABVAAAAVQAAAFcAAABMAAAAHwQEBD5WVFCVc3JuoWpqZp5nZ2KdZmRgnGpo - Y51wbmmdcXBrnnRybZ95dHGffnRzn3txb558dXCdTUpFmAABAVQXDg1Qj7m4w1jj5vRe3tv0ZuHY9G/n - 1vN/8tr0k/zi9LH/6vTP/+n02//i9M//3fTK/9n03/+58qenk68DAQRlGQ8OToS7uc8u29f/OtvP/0Xg - yf9U6sX/Ze69/3Lrrv+C5Z7/idyI/4rUd/+Mzm//ls5v/6/YdP+lp5O7BAIGYhkPEE+KubLQP9bB/1Db - vf9b3K3/a9mb/3HQhP9yxnD/fcRq/322VP9+p0b/gJtA/4WOMf+ZkDP/pJ+MvQUFCGMYEBJPkbqu0U7K - pP9WwJL/WbN7/2asa/9moVn/ZZdE/3OYNP9tgiH/dX0c/3p4Gf93bxf/insl/6SejcAFBgljGRMWUI6r - m9M+kWL/R4tX/1aUT/9vnUH/bo0q/22AGf93hhf/c34V/4KGFf+AfRb/dm4U/4V3If+ln47BBgYJYxkU - GFCQqJHUS41G/12UOv9tmC7/gJYe/3yIFP96hRH/hJAS/4KKEP+Jig//gX0P/3txD/+Edhz/paCPwwYG - CWMYFBlQlqyJ1F6jMP9jjSL/c4cY/4yVFf+BiA7/iI8N/5GYDf+NkQz/jYkK/4J7Cv+BdAr/iXoX/6ei - j8QGBgljGBQaUJeuhdVYjx//YngV/3uIEP+Nkg7/g4UI/5OVB/+YmQj/lZII/4+IBv+DegX/fXIF/4p+ - E/+no47FBgYJYxkWG1CVo4HVV4IV/2J1EP96hAr/iowL/4KCBP+YlgX/mJUG/5aQBf+MhAX/gngE/3Zu - A/+HgBH/pqONxgYGCWMZFhxQlqJ/1liAD/9gcAz/d38I/4aHC/+AgAT/mZUG/5SNBv+SiAb/iH0E/31z - BP9wawH/gH4P/6OhjMYGBgpjGhcdUJagftdTdwb/W2oF/3J4Av99fgj/fXsA/5OOAf+KggH/in4B/4B1 - AP91bAD/bWkA/3RyCf+gnYzIBwcKZBoYHVGhqIrWZoIc/216Hf+Bhhv/iYoh/42LGv+blhv/koob/5SK - G/+LgRv/gXsa/357F/98eiL/paKUxwcHCmMGBgcxenl0oJydkbaZmI20mpmNtZmXjLOYloiwmJaIsJiV - iLCZlomxmZWKsZiVirKWlImzmZeNtGpoZp0BAQE9AAAABQAAAB4AAAAqAAAAKQAAACkAAAApAAAAKQAA - ACkAAAApAAAAKQAAACkAAAApAAAAKQAAACsAAAAjAAAACgAArEEAAKxBAACsQQAArEEAAKxBAACsQQAA - rEEAAKxBAACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQAArEE= - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + + + AAABAAYAgIAAAAEAIAAoCAEAZgAAADAwAAABACAAqCUAAI4IAQAgIAAAAQAgAKgQAAA2LgEAGBgAAAEA + IACICQAA3j4BABQUAAABACAAuAYAAGZIAQAQEAAAAQAgAGgEAAAeTwEAKAAAAIAAAAAAAQAAAQAgAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAABAAAAAgAAAAMAAAAGAAAABwAAAAoAAAANAAAADwAA + ABEAAAAVAAAAGAAAABoAAAAdAAAAHgAAACAAAAAhAAAAIgAAACIAAAAjAAAAIwAAACIAAAAiAAAAIgAA + ACIAAAAiAAAAIgAAACIAAAAiAAAAIgAAACIAAAAiAAAAIgAAACIAAAAiAAAAIgAAACIAAAAiAAAAIgAA + ACIAAAAiAAAAIgAAACIAAAAiAAAAIgAAACIAAAAiAAAAIgAAACIAAAAiAAAAIgAAACIAAAAiAAAAIgAA + ACIAAAAiAAAAIgAAACIAAAAiAAAAIgAAACIAAAAiAAAAIgAAACIAAAAiAAAAIgAAACIAAAAiAAAAIgAA + ACIAAAAiAAAAIgAAACIAAAAiAAAAIgAAACIAAAAiAAAAIgAAACIAAAAiAAAAIgAAACIAAAAiAAAAIgAA + ACIAAAAiAAAAIgAAACIAAAAiAAAAIgAAACIAAAAiAAAAIgAAACIAAAAiAAAAIgAAACIAAAAiAAAAIgAA + ACIAAAAiAAAAIgAAACIAAAAiAAAAIgAAACIAAAAiAAAAIgAAACIAAAAiAAAAIgAAACIAAAAiAAAAIgAA + ACAAAAAfAAAAHgAAABwAAAAZAAAAFwAAABMAAAAQAAAADgAAAAsAAAAIAAAABwAAAAQAAAACAAAAAgAA + AAMAAAAEAAAABQAAAAkAAAALAAAADgAAABIAAAAWAAAAGQAAAB0AAAAgAAAAJAAAACcAAAAqAAAAKwAA + AC0AAAAvAAAALwAAADAAAAAwAAAALwAAAC8AAAAvAAAALwAAAC8AAAAvAAAALwAAAC8AAAAvAAAALwAA + AC8AAAAvAAAALwAAAC8AAAAvAAAALwAAAC8AAAAvAAAALwAAAC8AAAAvAAAALwAAAC8AAAAvAAAALwAA + AC8AAAAvAAAALwAAAC8AAAAvAAAALwAAAC8AAAAvAAAALwAAAC8AAAAvAAAALwAAAC8AAAAvAAAALwAA + AC8AAAAvAAAALwAAAC8AAAAvAAAALwAAAC8AAAAvAAAALwAAAC8AAAAvAAAALwAAAC8AAAAvAAAALwAA + AC8AAAAvAAAALwAAAC8AAAAvAAAALwAAAC8AAAAvAAAALwAAAC8AAAAvAAAALwAAAC8AAAAvAAAALwAA + AC8AAAAvAAAALwAAAC8AAAAvAAAALwAAAC8AAAAvAAAALwAAAC8AAAAvAAAALwAAAC8AAAAvAAAALwAA + AC8AAAAvAAAALwAAAC8AAAAvAAAALwAAAC8AAAAuAAAALQAAACsAAAApAAAAJgAAACIAAAAfAAAAHAAA + ABgAAAAUAAAAEAAAAAwAAAAKAAAABwAAAAQAAAADAAAABAAAAAYAAAAIAAAADAAAAA8AAAATAAAAGAAA + AB0AAAAiAAAAJgAAACoAAAAuAAAAMQAAADQAAAA2AAAAOAAAADoAAAA7AAAAOwAAADsAAAA7AAAAOwAA + ADsAAAA7AAAAOwAAADsAAAA7AAAAOwAAADsAAAA7AAAAOwAAADsAAAA7AAAAOwAAADsAAAA7AAAAOwAA + ADsAAAA7AAAAOwAAADsAAAA7AAAAOwAAADsAAAA7AAAAOwAAADsAAAA7AAAAOwAAADsAAAA7AAAAOwAA + ADsAAAA7AAAAOwAAADsAAAA7AAAAOwAAADsAAAA7AAAAOwAAADsAAAA7AAAAOwAAADsAAAA7AAAAOwAA + ADsAAAA7AAAAOwAAADsAAAA7AAAAOwAAADsAAAA7AAAAOwAAADsAAAA7AAAAOwAAADsAAAA7AAAAOwAA + ADsAAAA7AAAAOwAAADsAAAA7AAAAOwAAADsAAAA7AAAAOwAAADsAAAA7AAAAOwAAADsAAAA7AAAAOwAA + ADsAAAA7AAAAOwAAADsAAAA7AAAAOwAAADsAAAA7AAAAOwAAADsAAAA7AAAAOwAAADsAAAA7AAAAOgAA + ADkAAAA4AAAANgAAADMAAAAwAAAALAAAACgAAAAlAAAAIAAAABsAAAAWAAAAEQAAAA4AAAAKAAAABwAA + AAQAAAAFAAAACAAAAAsAAAAPAAAAEwAAABkAAAAfAAAAJQAAACoAAAAvAAAANQAAADoAAAA+AAAAQQAA + AEQAAABGAAAASAAAAEkAAABJAAAASQAAAEkAAABJAAAASQAAAEkAAABJAAAASQAAAEkAAABJAAAASQAA + AEkAAABJAAAASQAAAEkAAABJAAAASQAAAEkAAABJAAAASQAAAEkAAABJAAAASQAAAEkAAABJAAAASQAA + AEkAAABJAAAASQAAAEkAAABJAAAASQAAAEkAAABJAAAASQAAAEkAAABJAAAASQAAAEkAAABJAAAASQAA + AEkAAABJAAAASQAAAEkAAABJAAAASQAAAEkAAABJAAAASQAAAEkAAABJAAAASQAAAEkAAABJAAAASQAA + AEkAAABJAAAASQAAAEkAAABJAAAASQAAAEkAAABJAAAASQAAAEkAAABJAAAASQAAAEkAAABJAAAASQAA + AEkAAABJAAAASQAAAEkAAABJAAAASQAAAEkAAABJAAAASQAAAEkAAABJAAAASQAAAEkAAABJAAAASQAA + AEkAAABJAAAASQAAAEkAAABJAAAASQAAAEkAAABIAAAARwAAAEUAAABDAAAAQAAAADwAAAA4AAAAMwAA + AC0AAAAoAAAAIgAAABwAAAAWAAAAEgAAAA0AAAAJAAAABQAAAAcAAAALAAAADQAAABIAAAAYAAAAIAAA + ACYAAAAtAAAANAAAADoAAABAAAAARgAAAEsAAABPAAAAUQAAAFQAAABWAAAAVwAAAFcAAABXAAAAVwAA + AFcAAABXAAAAVwAAAFcAAABXAAAAVwAAAFcAAABXAAAAVwAAAFcAAABXAAAAVwAAAFcAAABXAAAAVwAA + AFcAAABXAAAAVwAAAFcAAABXAAAAVwAAAFcAAABXAAAAVwAAAFcAAABXAAAAVwAAAFcAAABXAAAAVwAA + AFcAAABXAAAAVwAAAFcAAABXAAAAVwAAAFcAAABXAAAAVwAAAFcAAABXAAAAVwAAAFcAAABXAAAAVwAA + AFcAAABXAAAAVwAAAFcAAABXAAAAVwAAAFcAAABXAAAAVwAAAFcAAABXAAAAVwAAAFcAAABXAAAAVwAA + AFcAAABXAAAAVwAAAFcAAABXAAAAVwAAAFcAAABXAAAAVwAAAFcAAABXAAAAVwAAAFcAAABXAAAAVwAA + AFcAAABXAAAAVwAAAFcAAABXAAAAVwAAAFcAAABXAAAAVwAAAFcAAABXAAAAVwAAAFcAAABXAAAAVwAA + AFYAAABVAAAAUwAAAFAAAABOAAAASQAAAEQAAAA+AAAAOAAAADEAAAAqAAAAIwAAAB0AAAAWAAAAEAAA + AAsAAAAGAAAACAAAAA0AAAARAAAAFwAAAB8AAAAmAAAALgAAADcAAAA+AAAARgAAAEwAAABSAAAAVwAA + AFwAAABfAAAAYgAAAGMAAABkAAAAZQAAAGQAAABkAAAAZAAAAGQAAABkAAAAZAAAAGQAAABkAAAAZAAA + AGQAAABkAAAAZAAAAGQAAABkAAAAZAAAAGQAAABkAAAAZAAAAGQAAABkAAAAZAAAAGQAAABkAAAAZAAA + AGQAAABkAAAAZAAAAGQAAABkAAAAZAAAAGQAAABkAAAAZAAAAGQAAABkAAAAZAAAAGQAAABkAAAAZAAA + AGQAAABkAAAAZAAAAGQAAABkAAAAZAAAAGQAAABkAAAAZAAAAGQAAABkAAAAZAAAAGQAAABkAAAAZAAA + AGQAAABkAAAAZAAAAGQAAABkAAAAZAAAAGQAAABkAAAAZAAAAGQAAABkAAAAZAAAAGQAAABkAAAAZAAA + AGQAAABkAAAAZAAAAGQAAABkAAAAZAAAAGQAAABkAAAAZAAAAGQAAABkAAAAZAAAAGQAAABkAAAAZAAA + AGQAAABkAAAAZAAAAGQAAABkAAAAZAAAAGQAAABkAAAAYwAAAGMAAABhAAAAXgAAAFoAAABVAAAAUAAA + AEoAAABDAAAAOgAAADIAAAAqAAAAIwAAABwAAAAVAAAADgAAAAgAAAAKAAAAEAAAABUAAAAdAAAAJAAA + AC0AAAA2AAAAQAAAAEkAAABRAAAAWAAAAF4AAABkAAAAaQAAAGwAAABuAAAAcAAAAHEAAAByAAAAcQAA + AHEAAABxAAAAcQAAAHEAAABxAAAAcQAAAHEAAABxAAAAcQAAAHEAAABxAAAAcQAAAHEAAABxAAAAcQAA + AHEAAABxAAAAcQAAAHEAAABxAAAAcQAAAHEAAABxAAAAcQAAAHEAAABxAAAAcQAAAHEAAABxAAAAcQAA + AHEAAABxAAAAcQAAAHEAAABxAAAAcQAAAHEAAABxAAAAcQAAAHEAAABxAAAAcQAAAHEAAABxAAAAcQAA + AHEAAABxAAAAcQAAAHEAAABxAAAAcQAAAHEAAABxAAAAcQAAAHEAAABxAAAAcQAAAHEAAABxAAAAcQAA + AHEAAABxAAAAcQAAAHEAAABxAAAAcQAAAHEAAABxAAAAcQAAAHEAAABxAAAAcQAAAHEAAABxAAAAcQAA + AHEAAABxAAAAcQAAAHEAAABxAAAAcQAAAHEAAABxAAAAcQAAAHEAAABxAAAAcQAAAHEAAABxAAAAcQAA + AHEAAABwAAAAbwAAAG4AAABqAAAAZwAAAGIAAABcAAAAVQAAAE4AAABFAAAAPAAAADIAAAApAAAAIAAA + ABoAAAASAAAACQAAAA0AAAATAAAAGQAAACEAAAArAAAANQAAAD8AAABJAAAAUwAAAFwAAABlAAAAawAA + AHEAAAB2AAAAeQAAAHsAAAB9AAAAfwAAAH8AAAB+AAAAfwAAAH8AAAB/AAAAfwAAAH8AAAB/AAAAfwAA + AH8AAAB/AAAAfwAAAH8AAAB/AAAAfwAAAH8AAAB/AAAAfwAAAH8AAAB/AAAAfwAAAH8AAAB/AAAAfwAA + AH8AAAB/AAAAfwAAAH8AAAB/AAAAfwAAAH8AAAB/AAAAfwAAAH8AAAB/AAAAfwAAAH8AAAB/AAAAfwAA + AH8AAAB/AAAAfwAAAH8AAAB/AAAAfwAAAH8AAAB/AAAAfwAAAH8AAAB/AAAAfwAAAH8AAAB/AAAAfwAA + AH8AAAB/AAAAfwAAAH8AAAB/AAAAfwAAAH8AAAB/AAAAfwAAAH8AAAB/AAAAfwAAAH8AAAB/AAAAfwAA + AH8AAAB/AAAAfwAAAH8AAAB/AAAAfwAAAH8AAAB/AAAAfwAAAH8AAAB/AAAAfwAAAH8AAAB/AAAAfwAA + AH8AAAB/AAAAfwAAAH8AAAB/AAAAfwAAAH8AAAB/AAAAfwAAAH0AAAB8AAAAfAAAAHcAAAB0AAAAbQAA + AGcAAABgAAAAWAAAAE8AAABFAAAAOgAAADAAAAAmAAAAHgAAABUAAAALAAAADwAAABYAAAAeAAAAJgAA + ADAAAAA8AAAASAAAAFQAAABeAAAAagAAAHQAAAB8AAAAgwAAAIcAAACLAAAAjAAAAI0AAACOAAAAjgAA + AI4AAACOAAAAjgAAAI4AAACOAAAAjgAAAI4AAACOAAAAjgAAAI4AAACOAAAAjgAAAI4AAACOAAAAjgAA + AI4AAACOAAAAjgAAAI4AAACOAAAAjgAAAI4AAACOAAAAjgAAAI4AAACOAAAAjgAAAI4AAACOAAAAjgAA + AI4AAACOAAAAjgAAAI4AAACOAAAAjgAAAI4AAACOAAAAjgAAAI4AAACOAAAAjgAAAI4AAACOAAAAjgAA + AI4AAACOAAAAjgAAAI4AAACOAAAAjgAAAI4AAACOAAAAjgAAAI4AAACOAAAAjgAAAI4AAACOAAAAjgAA + AI4AAACOAAAAjgAAAI4AAACOAAAAjgAAAI4AAACOAAAAjgAAAI4AAACOAAAAjgAAAI4AAACOAAAAjgAA + AI4AAACOAAAAjgAAAI4AAACOAAAAjgAAAI4AAACOAAAAjgAAAI4AAACOAAAAjgAAAI4AAACOAAAAjgAA + AI4AAACOAAAAjQAAAI0AAACLAAAAhwAAAIEAAAB6AAAAcgAAAGoAAABiAAAAWAAAAE0AAABCAAAANwAA + ACwAAAAiAAAAGQAAAA0AAAARAAAAGQAAACEAAAAqAAAANQAAAEIAAABPAAAAXgAAAG0AAAB8AAAAkAAA + AKAAAACkAAAAqAAAAKoAAACrAAAArAAAAK0AAACtAAAArQAAAK0AAACtAAAArQAAAK0AAACtAAAArQAA + AK0AAACtAAAArQAAAK0AAACtAAAArQAAAK0AAACtAAAArQAAAK0AAACtAAAArQAAAK0AAACtAAAArQAA + AK0AAACtAAAArQAAAK0AAACtAAAArQAAAK0AAACtAAAArQAAAK0AAACtAAAArQAAAK0AAACtAAAArQAA + AK0AAACtAAAArQAAAK0AAACtAAAArQAAAK0AAACtAAAArQAAAK0AAACtAAAArQAAAK0AAACtAAAArQAA + AK0AAACtAAAArQAAAK0AAACtAAAArQAAAK0AAACtAAAArQAAAK0AAACtAAAArQAAAK0AAACtAAAArQAA + AK0AAACtAAAArQAAAK0AAACtAAAArQAAAK0AAACtAAAArQAAAK0AAACtAAAArQAAAK0AAACtAAAArQAA + AK0AAACtAAAArQAAAK0AAACtAAAArQAAAK0AAACtAAAArQAAAK0AAACsAAAAqwAAAKoAAAChAAAAlAAA + AIgAAAB9AAAAcwAAAGoAAABgAAAAVQAAAEkAAAA9AAAAMQAAACYAAAAdAAAADwAAABQAAAAbAAAAJQAA + AC4AAAA5AAAARwAAAFcAAABpAAAAgwAAALMMDAzWTk5O8FxcXOxZWVjrWVlY61lZWetaWVnrWllZ61pZ + WetbWlrrWlpa61paWutaWlrrW1pa61paW+taW1vrW1tb61tbW+tbW1vrW1tb61tbW+tbW1vqW1tb6ltb + W+pcW1zqXFtb6lxbW+pcW1vqXFtb6lxbW+pcW1vqXFtb6lxcXOpcXFzqXFxc6lxbW+pcW1vqW1tb6ltb + W+pbW1vqW1tb6lpaW+paWlrqWlpa6lpaWupaWlrqWlpa6lpaWupZWVrqWlla6lpZWepaWlrqWlpa6lpb + WutaW1rrWlta61pbWutaWlrrWlpa61taWutaWlrrWlpa61paWutaWlrrWlpa61paWutaWlrrWlpa61pa + WutaWlrrWlpa61paWutaWlnqWlpZ6lpZWepaWVnqWllZ6lpZWepaWVnqWllZ6lpaWepaWlnqWVlZ61pa + WepaWlnrWlpZ6lpaWupaWlrqWlpa6ltaWupbWlvqWlpa6lpaWupaWlrqWlpa6ltaWupaWlrqWlpa6lpa + WepaWlnqWlpZ6lpaWepbW1vrVFRU7RcXFuEAAADEAAAAngAAAIMAAAB4AAAAcgAAAGYAAABbAAAATwAA + AEMAAAA2AAAAKwAAACEAAAAQAAAAFgAAAB8AAAAoAAAAMgAAAEAAAABRAAAAZQAAAIEAAADLWVlY8ZmY + lc/HwburzsfBp8rGvafKxL2oycO7psbAuaXFvrilxL62pMO+taPBurKjvbiwo7+4r6G9tq6iu7Wtoby0 + rKG6s6yhubOrobeyqqG3s6qgt7KpoLeyqZ62saietK+mnrKupJ6zrqWes66lnrOupZ6zrqWes66lnrOt + pZ6zrKWesquknbKrpJ2yq6Sds6ylnrKspZ60raWdtK6lnbavp524saieurGpn7qzq5+7ta2fvLevnr63 + sZ/AubGfwbqxn8K6sp/FvbSew7yzoMS+tZ/EvrSfxL+1oMS/taHEv7WhxL+1ocW/tqLFv7aixsC4ocfA + uaHHwLmhx8C5ocfAuaHHwLmhyMG5ocjBuaHIwbmhyMG5ocjBuaHIwrqiycK6osnCuaDJwrmhycO7ocnD + u6HJw7uhycO7ocnDu6HJw7uhycK6ocnCuqHKw7uhycK7ocjCuqHHw7mgxsG4oMa+tqDEvbagxLy0nsO7 + sp7BurGew7yznsK7s5/EvLSfxb21nsW+tZ/Gv7igxsC5oMjDuqLJwrqiycO7os3GvqPIw7uloZ6cxWZl + ZO0JCQjdAAAAogAAAIQAAAB7AAAAbQAAAGAAAABUAAAASAAAADsAAAAvAAAAIwAAABIAAAAYAAAAIQAA + ACoAAAA1AAAARAAAAFgAAAB7BQUExHBvbu/Lx8Ktpp2Qd3xxY2RxZVhjcmdZY3JnW2JzZlhhcGZXYW1h + VmBqYFFeZ1xMXmRZSl1hV0hdYVZFXGBURFtdUEFaW01AWlhNP1lXTT1ZVUs7WFJKOlhSSTlYU0g5V1FH + N1dORTRWS0IxVkxBMVZMQTFWTEExVkxBMVZMQTFWTD8xVkw/MVZLPTBWSjwvVUo9MFZMPzFWTEAxVU5B + MVVRQzNVUkU0VVVIOVZZSztWWk09VltPQVdfU0VXYlVIV2NXSFdmWUlXaFpKV2pdTlhqX05YaWBPWGlf + TlhqYE9YamBPWWpgT1lrYVFZbGFSWmxhUlpuYVVabmFVWm9iVlpvYlZab2JWWnBjVlpyZVZacmVWWnJl + VlpyZVZacmVWWnNmV1xzZ1hcdGdYXHRnWF11altddWpbXXVqW111altddWpbXXVqW110aVtddmlaXXZq + Wlx1aVtddGdZXG9lV1twZFRabGBSWmpeUVlqXU1XZ1xMV2lcS1dpXUxXZltMWGleTlhrX09YbWFRWm1i + VFpvZFdbcmVYXHBkVltwZFdccGNVXHNpWluflIdszcfCn4WEg+kODg3XAAAAnQAAAIMAAABzAAAAZgAA + AFkAAABLAAAAPQAAADIAAAAmAAAAFAAAABoAAAAjAAAALQAAADkAAABJAAAAYQAAAI8cGxrmz83JwI2E + eG2Bd2ptioB1dJGIfHeUiYF5l46EepmQh3yakYh8mZKIe5aPhXuUjIJ6k4uAepGJf3mPiH14kId7d46E + e3aLgnh2ioN5doqDeHWKgnd0h4B1dISAdXSFgHV0hn90c4N8cXODe3FygnpvcoJ6b3KCem9ygnpvcoJ5 + b3KCd29ygndvcoJ3b3J/d21ygHducoJ3b3KDem9xhXxwcYZ8cXGGfXJyiYB1couCd3KMhHhyjYZ7c4+G + fXOSiX9zk4p/c5WMgHOWjYF0lo2CdJaPhHSWj4N0lo+EdJeQhXWXkIV1l5GFdpiRhnaYkYd2mZGIdpqR + iHaakIh2mpCIdpqQiHaakIh2m5GIdpySiHackoh2nJKIdpySiHackoh2nZOJd52UiXedlYl4nZWJeJ2W + i3idlot4nZaLeJ2Wi3idlot4nZaLeJ+YjXiflot4npaLeJ2Ui3iblIl3mpKIdpmQh3aYj4d2mJCEdJWN + gnSTjIJ0l4+EdJWNg3WVjoN1mJCEdZmRhXaakId2mpOId5qRiHaZj4Z1lIyCdJKJfnKLg3hvh3xwbH91 + Z2eCeGxi1NDLrjY1NOoAAAC0AAAAjAAAAHgAAABpAAAAXQAAAE4AAABAAAAANQAAACgAAAAUAAAAGQAA + ACMAAAAuAAAAOgAAAE0AAABkAAAAt4OCgeKupp+JiX9zcpGJf3iZk4d8o5yTg6qknYmwqqOMtK2nkLaw + qpK4sauTt7GqkrWvqZK0r6iRs62nkbOspY+xrKSPsaqkjq+po46vqqKOrqmija6poYyuqaGMrKigjKuo + oIyrqKCMq6Wdi6qlnYqqpZ2KqaOciqmjnIqpopyKqaKciqminIqpopyKqaKciqmjnIupo5yLqaKciqqk + nYqtpp6Kraaeiq6noIqvqaGKr6uii7GspIuzrKaLs66ni7Wvp4u3sKmLuLGqi7ewqYy3sKmMt7KrjLey + qoy3sqqMt7Krjbeyq423squNt7KrjbiyrI24sqyNuLKsjbmzrY65s62OubOtjrmzrY66tK2OurStjrq0 + rY66tK2OurStjru0rY67ta2PurWtj7q1rY+6ta6PurWuj7q1ro+6ta6PurWuj7q1ro+8t6+PvLWuj7y2 + ro+7ta6PubStj7m0rY65s6yOuLKsjbiyqoy4squMtbCpjLewqYu1samMtrCpjLeyq4y4sauNubOtjrq0 + rY64sauOtrGqjLOtpYmuqKCFpqCXgJ2Ui3mUjIF0joR5cIF3bGmknZR4lpST1wcHB8wAAACRAAAAfgAA + AGwAAABfAAAAUAAAAEIAAAA2AAAAKgAAABYAAAAcAAAAJQAAAC8AAAA8AAAAUAAAAGkAAADJ0tHP2pWM + g3eWjIJ6nZWNgKijm4m+saqOzLy2l9PFv6HZy8Wm3M/Kq97RzK3dz8ut3c/KrNzPyqvczsmr287JqtvN + yarazcep2s7IqdnMyKnZzMep2MzGqNjMxqjYzMan18vGp9XKxafVysWn1srFp9XKxabVysWm1MnEptTI + xKbUyMSm1MjEptPIxKbTyMSm08nEp9PJxKfUycWn1srFptbKxabWysam18vHptfMyKbXzcmn2M7Jp9nO + yqfZzsqn2c/Kp9vRy6fb0Mun2tDLp9rQzKfa0cyn2tHMqNrQzKjZ0M2o2dDNqNnQzKjZ0Myo2tDNqNrQ + zajZ0M6o2tDOqdrQzqna0M6p2tDPqdrRz6nZ0c+p2dHPqdnRz6nZ0c+p2NDOqdnRzqrZ0c6q2NHOqtjR + zqrY0c6q19HOqtfRzarX0c2q1tLOqtXRzarW0c2q1dHMqtTQzKnU0cyq1NDLqdTPzKnTz8uo08/KqNLO + yqjTz8qn0s7Jp9LOyqjTz8qn0s7KqNPQy6jU0cyp1NDNqtPPzajPzMqky8fFnsO/vpa5s7GLrqehhqOa + kXyXjoR2jIR5cYqBdWvf29jHExIS2gAAAJUAAACAAAAAbgAAAGAAAABSAAAARAAAADgAAAArAAAAFgAA + ABsAAAAlAAAAMAAAAD0AAABUAAAAbAAAAMjT0c/fnZOJe52Vi3+qo5yJvbStk6TJyrqi1NbKq9rc0LDf + 4dey4eTasuLl3LHh49yx4OTcseDj27Lg49uw4eLcseDi27Hg49uy4OLbsuDi2rLg4dqy4OHas+Di2rTh + 4dq04OHateDg2rXg4dq24OHatuDg2bbg4Nm24eDZtt/f2bfg39m44N/ZueDf2brg39q54N7auuDe2rrh + 39m74d/ZvOHf2b3h4Nm+4uHZveLh2sDj4trB5OLawuXj2sPl5NrF5eTaxubk2sbl49rG5eTaxuXi2sbl + 4trG5eHax+Xh2sjm4trJ5eLayuXi2srm4trM5uHazObh2s3n4NrO59/azuff2s7o39rQ6d/a0erf2tHr + 39rT697a0+ze2tXt3trX7d/b1+7g29nu4dvb7uLb3e7i293u4tve7uPb4e7j2+Xu5dvp7ufb7O7n2+7v + 6tvw7urb7+7s2+/u7Nvv7uza7u3s2u7t7Nrv7eza7u3s2u/t7Nru7eza7+7t2u3u7tru7e7a7+7w2u/t + 7tvw7uvb7u3l2uzr3Nbp59TR5ePKy93bv8LCvbWYsKuhh6GakXyVjIF1jYV6bt7d2swTExLaAAAAmAAA + AIEAAABvAAAAYQAAAFMAAABFAAAAOQAAACwAAAAXAAAAHAAAACYAAAAxAAAAPgAAAFQAAABtAAAAydTS + 0d+hmZCAp5+XhbeyqpLTxL+fW9vm9jjg7f8/3ur/P97r/z/c6f8+2+f/Pdvn/z7b6P8+2+j/Qdzm/0Hc + 5v9B3Ob/Qtvm/0Pc5v9E3OX/Rtzk/0je5f9L3uX/TN/k/03f5P9Q3+T/Ud7k/1Hf4v9T3+P/VeDi/1bg + 4f9Y4OH/WuHh/1zh4P9e4eH/X+Hf/17h3/9g4d7/YuLe/2Pi3v9l4t7/Z+Te/2nj3v9q497/bebe/3Hm + 4P9y59//defh/3nn4v976OL/fOnj/37p4/+B6eP/guni/4Lq4f+G6+H/iezg/4rs3v+M7N//j+3e/5Pv + 3v+V8d//mPPe/5r13f+c9t3/nvjd/6L73P+k/Nv/qf3b/67+2/+w/9v/s//a/7X/2/+3/9v/vP/d/8T/ + 4P/N/+T/1v/n/9//7v/o//T/8P/3//f/+v/8//v////+//////////////////////////////////// + ///////////////////////////9////9v////D////n////2////87////C////t////67///+q/9PQ + xKy9ubOSraWdhJqTiXmRiX1w4N3azBMSEtoAAACYAAAAggAAAHAAAABiAAAAVAAAAEYAAAA6AAAALAAA + ABcAAAAcAAAAJgAAADEAAAA+AAAAVAAAAG0AAADJ1NPR36WfloOspZ6KwLu0mt3Qy6xm2+LyQdvk/0bb + 4/9F2uP/Rtni/0fa4f9H2uH/SNvi/0nb4v9K2+D/S9vh/0vb3/9M29//Tdvf/03b3v9P3N3/Utze/1Pd + 3f9U3d3/Vt7d/1fe3P9X3dz/WN7b/1zf2v9e4Nn/YN/Z/2Dg2v9f39n/YN/X/2Hf1v9g4Nb/YuDW/2Th + 1f9m4dX/Z+LU/2rh0/9s4tP/beLT/27j0v9w5ND/ceXQ/3Ll0f9059D/debS/3jo1P976tX/f+zX/4Ts + 2f+F7tv/ifDc/43w3f+R8t7/kvXf/5P23/+W997/mvne/5z83v+f/d7/o/3g/6f+4f+r/+L/rf/j/6// + 4v+z/+P/uP/j/7z/5P/C/+b/yf7m/9L+6f/b/uv/5v7w/+/+9P/3/vn//P/9//////////////////// + ///////////////+///7/v//+P78//r+/v///v/////7///+8f/8/uf/+v7d//j+1P/2/sv/8/6//+/+ + tP/s/6z/7P+m/+z+o//s/6H/6f+j/+r/n//n/53/2tnOuMfCvpyzr6aKoJmPfJSMgnLg3dvNExIS2gAA + AJgAAACDAAAAcQAAAGMAAABUAAAARgAAADoAAAAtAAAAFwAAABwAAAAmAAAAMQAAAD4AAABUAAAAbgAA + AMnU09Hfp6CYhbGro47FwLuf5djUtWLa3/Q62N7/Qdjd/0HY3f9B2dz/Q9na/0PZ2/9E2dv/Rdna/0Xa + 2f9H2tj/R9nY/0ja2P9I2tj/SNrY/0ra1v9L29X/TNvV/03c1f9Q3NX/UtzV/1Td1P9U3dP/Vd7S/1bd + 0f9W3dD/V97P/1fezv9Y3s3/Wd7M/1nezP9c3sv/Xd/K/1/fyv9h4Mn/Y+DJ/2Liyf9j48j/ZuTI/2jm + x/9p5sj/a+bI/2zox/9u6cf/cOrI/3HsyP9178f/d/DI/3nyyf999cv/gvjO/4f60f+L/df/k//a/5n/ + 3v+d/+L/o//k/6j/5P+t/uT/tP/k/7r+5f/B/uj/yv3t/9T+8v/d/vb/6f74//P++v/5//z/+//9//3/ + /v///////////////////////////////v////v////6////+f////b/+/3y/+v87v/g/ez/3v3p/9f8 + 4//i/d//6f3Q/+P+u//f/63/2P+k/9L/nf/N/5j/zv2V/8/9kv/Q/Y//0PyN/9P8jP/V+pD/wPac/6T3 + pv/Z3tbBzsnFo7mzrI+lnpR+mI+GdOHd3M0TEhLaAAAAmQAAAIMAAABxAAAAYwAAAFUAAABHAAAAOgAA + AC0AAAAXAAAAHAAAACYAAAAyAAAAPgAAAFQAAABuAAAAydTT0eCqpJqGs66okcnFwKXq3Nm7bN/l9UXd + 5f9M3eX/Td3l/0zd4v9L297/SNvc/0Xa2f9F2dj/RNrV/0PZ0v9E2dL/RdnR/0TY0P9F2ND/RtnP/0na + zv9M3M//TtzP/1Hbzv9Q3Mz/TtvK/07Zyf9P2sn/UNrH/1Dbxv9S28X/VNvF/1XcxP9V3MT/Vt3E/1je + xP9Y3sP/Wd/C/1vhwv9c4sL/X+LB/2Dlwf9j5sD/ZebB/2Xowv9n6sH/aevC/2ruwf9s8cH/bvPC/3D2 + w/9y+cT/dvzE/3n+xv99/8j/gf/I/4f+zP+Q/s//mv7W/6v+3/+8/ur/yv3y/9b+9v/e/vn/5v77/+r+ + /P/t/v7/7P7///H////4///////////////////////////////////////+//3/+f/5//T/9P7n/+z/ + 2f/l/s7/3v/F/9D+wf+5+8L/ofrD/5n8xf+X+8b/l/rF/577yf+j+83/pvvH/7D9uv+8/af/yPyb/8v7 + lv/K+ZL/yfiP/8v2jP/S94//2viS/+T6kv/c+ZX/rfKe/93i2sfSzcqovbexkqihmICakYh14N3bzhMS + EtoAAACZAAAAgwAAAHEAAABjAAAAVQAAAEcAAAA6AAAALQAAABcAAAAdAAAAJwAAADIAAAA+AAAAVAAA + AG4AAADJ1NPR4KulnIa2sauSzMfEqO/h3sFc19n2MdLU/zjS1P850tT/OtPT/znS0f850dH/OdLP/znR + zf860sz/O9LM/zrSyv870cr/PNHJ/z3Syf8+0cf/PtHG/0LRxv9D0cX/QdDD/0HSwf9B0sH/RNLA/0XR + wP9G0sD/RtO//0bUvv9J1L3/Sta+/0zVvf9O1rz/Tti7/07Xu/9P2bz/Udu7/1Ldu/9V3br/VuG7/1jj + u/9Z5rv/Wum8/1ztvP9e8b7/YvW+/2X5v/9p/MH/b/3G/3X+yf98/s3/h/7U/5X93f+g/eT/p/3p/639 + 6f+z/ev/t/7s/7j+7v+z/e3/s/7r/7b+7v+9/vT/y/73/9z+/P/w////+//8//r/+//2/vf/7/7x/+b+ + 6f/e/uL/2P7f/9L/3f/P/tb/y/7N/8n/x/+//sD/r/26/6n9tv+j+7H/gfmx/2z4sv9o97P/aPi2/2j4 + tv9v+Lj/ffq//376wP97+8P/hfvL/4j6yP+k+r7/w/iy/9j5qP/d+Z7/2/eV/9r1j//U9IT/z/B5/83t + cP++5G7/4uTazdTQzqzAu7SVqqOagpyTinbh3tzPExIS2gAAAJkAAACDAAAAcQAAAGMAAABVAAAARwAA + ADoAAAAtAAAAFwAAAB0AAAAnAAAAMgAAAD4AAABUAAAAbgAAAMnU09HgrqafiLizrJPNycap8OLfwlPU + 2fYlzNT/Lc3T/y3O0/8tzdH/LczQ/yzN0P8uztD/Ls7P/y/Nz/8wzM7/MM7M/zHMyv8wzMr/MM3I/zPM + x/8zzcf/Nc3H/zfOxv84zsX/Oc/F/zvPxf860MP/O9DD/zvQw/880MH/PNLA/z/Tv/9A1MD/Q9XA/0bW + v/9G2MD/R9nA/0fbwf9J38H/S+LB/03mv/9N6sH/Uu3D/1jxxf9f9Mn/Z/fM/2z50P90+tb/gPzc/4v+ + 4/+R/ej/kv3s/5T98P+Y/fL/mv3x/5f+7/+S/+r/jf/i/47/3v+P/97/lf/f/6L+5P+x/un/wP7t/8z+ + 8f/U/u7/1v7o/9H+3v/I/tP/vv/N/7b/x/+x/8T/rv+//67/uf+h/7b/i/+0/4T+sv+B/rH/g/2u/3/8 + r/9w+bD/Zfex/2Hyr/9c8K7/WfGx/2bzuP9t9bv/bve7/3j6vv9++8H/fvq+/4H7wf+S+8j/kvvM/5j7 + 1f+b/dT/qP3E/7T4o/+864X/u990/7bZbf+z1mr/sNFl/6/LX//j5NnO19PQrsG8tZasppyDnpWNd+Lf + 3M4TEhLaAAAAmQAAAIMAAABxAAAAYwAAAFUAAABHAAAAOgAAAC0AAAAXAAAAHAAAACYAAAAyAAAAPgAA + AFQAAABuAAAAydTT0uGtp6CKubSulc7Lxqrw4t/DVtbd9ijQ1/8v0Nf/L9DW/y/Q1v8x0dX/MdLU/zLR + 1P8y0NT/MtDT/zLR0P8z0tD/NNHP/zXSz/83087/OdTO/zrUz/881c7/PNXN/z3Wzf881sz/P9fL/z/W + yv9A2Mv/QdnL/0Payf9F3cr/R97K/0jhyv9I5Mv/SOfK/0nry/9N7s7/UvDP/1n10v9h+tf/afzb/3H9 + 4/97/ej/hP/u/4v/8/+N//b/jf/3/47/+P+Q//j/jv73/4j/8f+F/uz/gf/l/3//4f+B/tv/hP/Z/4z/ + 3v+X/+T/pv/t/7f+8//F/fb/0P3z/8/+6v/I/t7/vv/V/7P/yv+m/77/mv+0/5T/rv+S/6j/kP6k/5H8 + oP+S+p7/lfed/5b0nP+U8pz/kPGc/43vnv+G7Z//gOyf/37qof9566T/de2o/3jxsf+A9bn/jvXC/5n3 + yf+c+cz/qfrQ/6H7zP+S/Mf/lPrK/4/6yf+J+sT/lPrB/5b5vP+X+Lr/mfe3/5vyp/+k5pD/rtV6/7LL + b/+xym//rshr/+Tk2s7X1NCuwby2lq6mnoWgl4944+HdzxMTEtoAAACZAAAAgwAAAHEAAABjAAAAVQAA + AEcAAAA6AAAALQAAABcAAAAcAAAAJgAAADEAAAA+AAAAVAAAAG0AAADI1dPS4bCpoYq5s66VzsvHqvHk + 4MNW1dn3J87T/y/P1P8vztP/L8/S/zHP0v8x0ND/MdDQ/zLQ0P800dD/NdLP/zbUzv821M7/N9TO/znU + zv861c7/OtXN/zvWzP871sz/PNfN/z3Xzf9A2sz/QdzL/0Lezf9D38z/ReLL/0bmy/9I6M3/TuvS/1Tw + 1v9c9Nr/ZPfh/2r56P9z++3/e/vy/3z98/97/fX/fP30/3v98/96/fH/eP3t/3f96P90/eT/dP3e/3L+ + 2v9x/9b/c//R/3j+0P98/tH/gv/Z/4/+4f+d/uj/qP7r/7P96v+1/eT/sP7a/6j+z/+g/8b/l/+8/47/ + sv+K/6r/if2n/4j7pP+I96D/h/Sb/4jvl/+H7ZX/h+mR/4fnjv+F44z/huCJ/4jehf+J24P/kNuD/5je + h/+g5Iv/qOqO/6/wkv+39Zn/tveb/67zmP+q7Jv/seql/7brsv+x7bL/rfC2/6/0vv+w98L/qfe7/6P1 + sf+i9Kv/mvWi/5z0n/+e86L/m/Wn/5r0pv+c65X/nth+/6DEav+lu2P/4+Paz9jU0a/DvreYrqighaKa + kHnj4N3PExIS2gAAAJkAAACDAAAAcQAAAGMAAABVAAAARwAAADoAAAAtAAAAFwAAABwAAAAmAAAAMQAA + AD4AAABUAAAAbQAAAMjU09LhsKqii7u1r5bOy8ir8ePhxFXU1vcnzdD/L87R/y/P0f8w0ND/M9DR/zPS + z/8z0tD/NNPQ/zPTzv810s3/NNPN/zbUzf821M3/ONbN/zrVzf87183/O9jM/zzZzP89283/P97M/0Lg + z/9G49D/TOfT/1Pr2P9a7t7/XvLk/2L16v9q+O//bvrx/2778f9r/PD/aPzt/2f96f9n/OT/Zvzg/2X9 + 3f9k/dj/ZP3V/2T90v9l/s7/af7K/2v+yP9s/sf/b/7I/3T+zP98/tH/h/7Y/5H+3v+a/+L/nf7d/5n/ + 0v+T/sX/iv66/4X9s/+D/K//gfqp/3/3pP9/86L/fvCe/4Dsmv+B6Zb/gOaS/4DikP+A343/gNyM/4Da + iv+A2Ij/gtiF/4bZhf+O3of/l+SK/57qjP+k747/qfKQ/6fxjP+i7ob/n+iD/53jgP+a3Hv/mth3/5nV + df+a0XL/mdBz/5rPcv+gznb/rNR+/7bdhP+85Yj/wO2M/77wkf+w8ZH/pu+Q/57ujv+c7o7/ou6Y/6Tx + m/+n8Jf/ouaI/5rOcP/i5NrO19TRr8S/uZmwqaKHopuSe+Ti3c8TEhLaAAAAmQAAAIMAAABxAAAAYwAA + AFUAAABHAAAAOgAAAC0AAAAXAAAAHAAAACYAAAAxAAAAPgAAAFQAAABtAAAAyNTS0uKzrKOLu7awl9DM + yKvx4+DEVtXW9ynP0f8w0NL/MdHS/zHT0P8z0tD/M9LO/zPSzf8z0s7/MtTN/zTTzv811c//N9fP/znY + zv872s7/PNvR/z7d0/9C4dX/SeXZ/1Dp3f9V7uP/V/Hn/1316/9h9+//Yfru/1/66/9c+ej/Wvrj/1n5 + 3f9Y+dj/VvjV/1f50f9X+M7/WvjL/1v3yf9c9sb/XfXD/171wv9g9sH/Y/nB/2b8wf9r/sT/cP/H/3r/ + zv+C/9f/if7Y/4z+1f+L/Mz/gvu9/3z5sv9396z/dPWm/3Pxov9z7Z7/deqc/3jom/975Zj/fOGW/3re + k/9424//eteN/3jWif971ob/fNWG/37WhP+D2IT/i96J/5Pki/+Z6oz/n+6O/6Lvjf+e7Ir/l+aG/5Xg + gP+R23z/j9Z4/5DRd/+Qz3X/kMxz/5DKcf+Rx23/kcZq/5HDaP+TwWX/l8Bh/5m/Wv+bvlP/m71Q/52+ + U/+kwl3/q81q/7XZdP+6437/teh+/6voef+n6Xv/pumD/6zskv+y75v/r++a/+Tn38/X1NGwxL65mbCq + o4ilnpN85OLe0BMSEdoAAACZAAAAgwAAAHEAAABjAAAAVQAAAEcAAAA6AAAALQAAABcAAAAcAAAAJgAA + ADEAAAA+AAAAVAAAAG0AAADI1dPS4rOtpIy9ubGX0M3IrPHj4cVZ19j3KtHQ/zHSz/8v0s7/MNLN/zHT + zv8x083/NNTO/zbVz/8419H/O9rT/z7f1/9D5Nv/SOjg/03s5f9R7uj/UvLr/1T17f9W9+3/Vvbr/1H1 + 5/9Q9OH/TPPZ/0zx1f9L79D/S+7M/07syP9P7Mb/UerD/1Lqwv9T6cH/U+m//1Xovv9V57v/V+m6/1nr + uf9d77r/YvW//2j5xP9v/cr/d/7Q/33+0v+B/c7/gfrK/3v2v/9086//be6l/2rpoP9q5J3/a+Gb/2vf + mP9t3ZT/bduS/27Zkf9x15D/c9WP/3TTjf9304r/eNGI/3nSh/981Yb/gtiG/4veiP+S5Yv/lOqK/5fs + i/+Y7In/lOmG/47ggv+J13z/htJ4/4jOdf+IzHT/iclx/4rGb/+Kxm3/i8Nr/4vCav+NwGn/jL1o/427 + Zv+QumP/krpe/5e5Vv+cuVD/mrlO/5e6Tv+WuVL/k7ZV/5G1VP+Ss1P/lbRU/6C8XP+tyGT/t9Rp/7rc + a/+1327/suB5/7Lkjv+565//5efgz9jU0bDEv7qasquliKefln3j4d7QExIR2gAAAJkAAACDAAAAcQAA + AGMAAABVAAAARwAAADoAAAAtAAAAFwAAABwAAAAmAAAAMQAAAD4AAABUAAAAbQAAAMjV09LitK2mjL23 + spjRzcmt8uTixVbX1fcp0c3/M9PP/zTV0f8219P/OtrW/z3e2v9D4t7/R+bj/0rr6P9N7+z/UPPu/1H0 + 7v9Q9e3/TvHp/0vv4/9H7N3/Q+nV/0Hlz/9C5Mv/Q+HH/0bhxf9H38P/Sd7C/0ndwP9L3L//TNy+/03d + uv9O3bf/UNy3/1Hdtv9S37X/VeS2/1rruv9h8sH/Z/jH/2/7y/91/dD/dvvN/3f2xv9z8r3/be2w/2jo + pf9k4p//ZN2c/2Xamf9l2Jf/aNeU/2nVk/9p05D/adKN/2fQif9pzYb/acuF/23Nh/930Yj/fNWL/4Pa + jP+K4Y7/j+aN/5Dojf+S6Yv/keeI/4zhgv+G233/gdN6/3/Mdv+ByHP/gsZx/4PEb/+ExG7/hMJr/4PA + av+EvWj/hLxl/4a6Zf+Gt2P/h7di/4e1Yf+LtF//j7Ra/5W1Vf+Yt07/mLdI/5a3Sv+RtlD/j7ZT/5C2 + Vv+Ttlj/lbZY/5u2Wf+duFv/m7dZ/56zVv+jtVj/q7xa/7PFWf+4y1z/ts1i/7rUd//l5t7P2dXSscXA + vJuyraWJqKCWfeTi3tATEhHaAAAAmQAAAIMAAABxAAAAYwAAAFUAAABHAAAAOgAAAC0AAAAXAAAAHAAA + ACYAAAAxAAAAPgAAAFQAAABtAAAAyNXU0uK0raiOvreymdLOyq7x5OLGX9/d9zff3f9B5OH/Q+fk/0Lq + 5v9E6+j/RO3p/0Xu6f9G7OX/ROjg/0Pm2/9B4tb/P+HR/z/fzv8+38z/QN3J/0Daxv9A2cT/QdjB/0TW + v/9F1Lz/RdS7/0fTu/9J1Lr/SdS2/0vVtf9L1bT/TNex/07asf9U4Lb/Wui9/2DxxP9m98v/bPnO/3D4 + zv9u9MX/bO68/2jns/9i4af/YNye/13Ymf9f05b/YNOX/2LRlv9k0ZP/Y9CP/2XPjf9kzIr/ZMmI/2PH + hf9myYT/a86G/3XUh/972ov/g+KO/4zokf+M6JD/jOeP/43ki/+I3oT/gtZ+/33PeP95yXP/esZw/3vE + b/98wm3/fcFs/3++af9/vWf/f7tl/3+5ZP+At2P/gLdh/4G1YP+Ds17/g7Jd/4SwXf+Hslv/jLJX/5Oy + T/+Vtkn/lrdH/5G4Sf+Nt07/irZT/4u2WP+SuFr/lrpc/5q8Xv+evF//oL1d/6G9Xf+jvlz/p7xa/6e7 + WP+muVX/qrlU/6y3Uv+ttUz/tbVI/+bk2dDa1tSyx8G9nLStp4unoJh/5OLf0RMSEdoAAACZAAAAgwAA + AHEAAABjAAAAVQAAAEcAAAA6AAAALQAAABcAAAAcAAAAJgAAADEAAAA+AAAAVAAAAG0AAADI1tTT47Sw + qI++ubSZ0c3KrvDi4MZj6eb3N+jk/z7o4P895d3/O+HY/zrd0/852c7/ONfL/znWyP871sj/PdfJ/z/Y + yv8+2Mr/QdnJ/0DXxf8/0r7/QdC7/0DQuv9B0bn/RNG4/0TQtv9E0bT/RtC0/0fRs/9J0rD/TNaw/1Dd + tv9Y5r//X+/H/2X0zP9p9c7/afHH/2Xrvv9h47P/Xtur/1zWov9b0p3/WtCZ/1zOlf9ezJT/YMyT/1/K + kf9hy5D/YcmN/1/Hif9fx4b/ZMiF/2nMh/9v1In/dNuL/33ijf+C55H/gOaO/4Hjif+C3oj/gdqG/3/V + gv9/0H//f8t6/3zIdf97xXL/esFu/3i/av95vmj/erxm/3q7ZP96uGP/fLdh/3y2X/9+tF7/frNd/3+y + Xf+BsFv/gbBa/4OwWv+GsFn/i7JU/5G0Tv+Vtkf/k7lF/4+8SP+JvFL/ibxZ/429YP+SwWT/mMRl/57F + Zv+ix2b/o8Zl/6LDYf+iwV3/o75a/6O9WP+kulb/pLhT/6S2UP+mtE7/qLRL/6mySv+ssUX/5eTa0NnX + 1LLGwr2dtq6ojKmimYDk4uDRExIR2gAAAJkAAACDAAAAcQAAAGMAAABVAAAARwAAADoAAAAtAAAAFwAA + ABwAAAAmAAAAMQAAAD4AAABUAAAAbQAAAMjW1NPjtbCqj7+6tJrRzcqv8eTjx13c1Pcw1Mv/ONLK/zfR + x/840cf/N9HG/zjRxP850MX/OtLF/z3SxP88z8H/PM28/zzKuf89yrr/QM27/0HPvP9Bz7v/Qc65/0HO + tv9CzbP/Rc2w/0bPsP9J1LL/T926/1fmxP9d7cj/YvDM/2Lvyv9g6L//Xd+1/1rarP9X1ab/WNCi/1fN + nP9Xy5j/V8uX/1rJlf9cyJP/XceR/1/Gjv9exYz/YMSL/2LGiP9nzIr/bdON/3Tbjv954pH/feaS/3zm + jv944Iv/d9qG/3TTgP9xz3z/dM16/3bJef94yHr/fMd5/4HHd/+AxHT/fMJv/3q+a/94u2f/eLlj/3m3 + Yf96tWD/e7Rg/3y0Xv97s1z/fbJb/3+xWv+CsVn/g7FY/4OxV/+GsFf/i7NT/5C2Tv+Uu0n/k79K/43E + U/+Kxl7/i8Vn/5DGbP+Tx27/lshv/5jJbf+Zx2n/m8Rm/5vAZP+cv2D/nL9c/5+/WP+jv1b/psBW/6fD + U/+rw1L/rsJP/66/Tf+wvUn/r7tG/7C3Q//m5NnQ2tbVs8jEvp63saiMq6OagOTi4NETEhHaAAAAmQAA + AIMAAABxAAAAYwAAAFUAAABHAAAAOgAAAC0AAAAXAAAAHAAAACYAAAAxAAAAPgAAAFQAAABtAAAAyNbU + 0+O2sauQv7u0m9LOyq/y5uPHXdPM9y/Lw/81zcP/NszC/zbMwP80yr3/Nsi6/znEuP84xLb/Ose3/zzL + uv8/z7z/QM6+/0HQvv9Czrz/Qcu2/0HIsf9EyrD/RtCz/0nVuP9Q38D/VOjI/1rrzP9d68r/W+bD/1ff + t/9U163/VNKn/1TOpP9VyqD/VMme/1bInP9YyJn/VsaX/1fHk/9XxpH/WMaP/13Fjf9fx4z/Y8yN/2nT + kf9w25P/deGS/3rllf9545L/dN+L/3HYh/9w0oP/bs9//2/Le/9vyHf/bcZ0/3DDcv90w3L/dsNz/3rE + dP9/xXP/g8N0/4HCcP99vmr/e7tn/3q3Y/95tV//erVe/3u0Xf99tF3/f7Vb/3+1Wf+BtVj/g7ZZ/4e2 + WP+Lt1j/j7lW/5S9T/+Wwkz/lMhQ/4/NWv+Mz2r/itB1/4zNeP+Qy3X/k8p0/5XKcv+Xym//l8xp/5rM + Z/+ezmT/oM1i/6DKXv+hyFv/o8VX/6TBUv+kvU7/o7dL/6KxSf+iq0P/naQ+/5yeOv+cmTf/nJY2/+Th + 2dHc2dWzycS+nrexqo2rpZyB5OLg0hMSEdoAAACZAAAAgwAAAHEAAABjAAAAVQAAAEcAAAA6AAAALQAA + ABcAAAAcAAAAJgAAADEAAAA+AAAAVAAAAG0AAADI1tTT47axq5HBvLWc0s/Lr/Lm5Mdbzsb3LcO4/zXD + uf84wrj/NsK2/zbEtv84xbn/Oca3/zjHt/88yLj/Pci3/z3Fs/8/w7D/QMax/0HMt/9H1b7/TNzD/1Dk + yf9U6c7/VujN/1blx/9T3r7/T9ax/07OqP9PyqP/UMqi/1HIof9Tx5//U8ed/1PFmf9TxJf/VsOV/1jD + k/9bxZT/X8iU/2LNk/9o1ZX/bNyV/3Hglv9z5Jf/dOSU/3LekP9v1or/btCH/23Og/9tzH7/bsp7/2/H + ef9ux3b/b8V0/2/Ecf9vwW//cMBt/3XAbv93wW//fcNx/4TDb/+Gw2//hMFr/4G+Z/9/vWT/fbpg/326 + Xf9+vF7/grtc/4a8XP+Jv1z/i8Fc/4/CWv+SxFr/l8VY/5nJVv+ZzlP/ldNW/4/VZf+J13T/idd//4vW + gf+P1n7/k9V7/5LSdf+TzXD/kshq/5HCZv+PvmD/j7la/4+0Vf+Nq0//i6JK/4qcRv+KmEH/i5Q9/4uS + O/+MkTj/jpA3/5OPNf+UjzT/lZAz/5ePMv+YjjD/5OLZ0dzZ1bTJxL6euLOrjqylnYLk4uDTExIR2gAA + AJkAAACDAAAAcQAAAGMAAABVAAAARwAAADoAAAAtAAAAFwAAABwAAAAmAAAAMQAAAD4AAABUAAAAbQAA + AMjW1NPjtrGrksC8tp3T0Muw8+flx1vJwfcwv7T/N8K2/zXDtv82wrX/NsOz/zjBsv84wK//Ob+t/zu/ + rv8+xbT/Q9K+/0fZxP9M4cv/UOfS/1Hq0f9R5sz/UN/E/07Yuv9M0LD/SMmm/0jHo/9LxqL/TsWf/07F + nv9QxJz/UcGa/1HBmP9Vw5j/V8eY/1zMmf9h0Jv/aNef/27dn/9v4J7/ceOb/3LimP9v3pX/bdiP/2zT + iv9s0If/bM2C/23LgP9uyn7/b8l7/23Jev9vyHf/ccV0/3HFcv9xxG//csJt/3HAav9zv2n/eMFq/33E + bf+FxnH/jclx/47Lb/+Mymz/i8to/4nLZP+JzGL/is1h/4zNYv+R0GP/lNJi/5jRYP+b0GD/nNFc/5nV + W/+U2F7/jttk/4rabv+F1Xr/g9CC/4TLgP+GxHf/iL9t/4e4Zv+FsGD/gqdY/36hUP9+mkv/fpVH/32R + RP98j0D/f409/4GMPP+EjTn/h4w3/4iNNf+LjDX/jYwz/4+MMP+PjC7/kYot/5OLLf+UiSz/loks/5iJ + Kv/k4tnS3NrWtcnFv5+3squPr6ifgubj4tITEhHaAAAAmQAAAIMAAABxAAAAYwAAAFUAAABHAAAAOgAA + AC0AAAAXAAAAHAAAACYAAAAxAAAAPgAAAFQAAABtAAAAyNXU0+S3sayTwbu3nNPQzLDy5+XIXce/9zC9 + sP83v7H/N7+u/za9rv83vq7/OcGw/z3Jt/9C0b7/R9jE/0vgy/9P5M//TeLN/07hyP9O28P/S9S6/0jM + rv9Hx6X/SMek/0jGpf9JxqP/SsWg/0vDnP9OwZr/TsOb/1PHmv9YzZ7/XNKi/2TapP9q3qf/a+Gk/23i + o/9v4qD/cN+b/27alv9r15H/atKL/2nQif9rzof/bc6F/3DOgf9wzn//csx9/3LMef9yy3f/csp2/3PJ + cv9zxnH/dcdu/3THbP93yGv/e8tr/4DPa/+J023/kthx/5rcd/+h4Xz/oeF6/57gdP+a3m//ltxq/5PZ + Zv+U1WL/ltJe/5fQW/+Ry13/islf/4XLX/+Az17/fM5g/33HZP9/v2j/fbVs/32uZ/99qF7/f6NU/36d + Tv98mUj/e5VD/3qRP/97jjv/e445/3uMNv99jTP/f4wz/3+KMv+EiTD/hYgu/4WILf+Hhiv/iIYr/4uF + Kv+LhCr/jIQq/42EJ/+OhCf/j4Qn/5KEJ/+UhSf/lYUl/+Th2dLd2de1ysTAoLm0rI+wqaGE5uXi0hMS + EdkAAACZAAAAgwAAAHEAAABjAAAAVQAAAEcAAAA6AAAALQAAABcAAAAcAAAAJgAAADEAAAA+AAAAVAAA + AG0AAADI1dXT5LmzrZLBvLed1NHMsfLn5chcyLz3L7ys/ze/rv85xLL/Psu6/0LRwP9F1sX/SdvI/0nd + yf9J28P/SNe+/0rUu/9IzbT/Rser/0fGp/9IyKn/Ssqs/0rKqv9KyKb/Scah/0vDnf9Ox57/U82h/1fU + pf9e2qr/ZOCr/2Tiqv9o4qj/auKm/2zgo/9t3p3/bdyZ/27Ylf9w1pP/cNeP/2/UjP9w1Ir/cNOI/3PT + hv9y04T/ctN//3TRfP930Hr/eNB2/3nRdv9+1Xb/gtl3/4bedv+J4Xb/jOV3/5Dpd/+R6Xf/j+V0/5Tj + dP+a4XT/nd92/5/ddv+c13D/lc5l/43EWv+IvVP/hLZP/4C0Uv93tV//brlk/2m8Yv9svlz/dLtS/3q2 + Tf9/rkv/gaZK/3+hSf99nET/fJk//3yVO/97kzf/eZAz/3qPM/96jDD/fIou/3yILP97hyz/e4cr/3yF + Kv9+hSn/f4Mp/4GCJ/+Cgib/goEm/4SAJf+GgCb/h4Al/4h/Jf+JgCX/i38k/4yBJf+NgCX/kYEl/5OB + JP+SgSP/5eLZ0t3Z1rbLxcGhu7Suj7GrooTm5eLSExIR2QAAAJkAAACDAAAAcQAAAGMAAABVAAAARwAA + ADoAAAAtAAAAFwAAABwAAAAmAAAAMQAAAD4AAABUAAAAbQAAAMjV1dPkurStksO9t57U0cyx8ublyV/Q + wvc3zLv/Q9PB/0bWxv9H2cf/RdfC/0LRu/9Bzrb/Qsux/0TGrP9Ew6f/Q8Om/0fHq/9Ky67/S82y/0zM + sP9Nyab/T8mj/1POp/9X1az/Wtyw/17isf9h47D/Y+Os/2Xiqv9m4qf/aOGk/2vgof9q3p7/bd2c/3Hb + mf9z3Jf/dduV/3fbk/933Y//dd2N/3bdiv953Yn/fd6E/4Ddhf+C4Yb/h+WG/4rphv+O7Yb/ke2G/4/t + g/+O6X//jOJ5/4fbcv+D1W3/gc1n/37FX/98vVv/g7tZ/4e8Wf+Lu1j/jbpY/4m3Wf+Aslv/da9j/2mu + a/9fsHL/WrZ0/1+5af9tuFP/f7NC/4WvPf+GqDr/hKE4/3+ZN/97lDX/d5Ey/3aOLv92iy3/doos/3eJ + LP94iCv/eIcq/3mGKv95hSn/eIMn/3mCJ/95gSb/eYAl/3x/Jf99fSX/fHwj/358I/9/eyL/gXsi/4J7 + Iv+DeyL/g3wj/4Z7I/+IfSP/i30j/419JP+NfST/j34j/5B9Iv/k4dnT3NrYtszHwqG9t6+Qsqujhebk + 4tMTEhHaAAAAmQAAAIMAAABxAAAAYwAAAFUAAABHAAAAOgAAAC0AAAAXAAAAHAAAACYAAAAxAAAAPgAA + AFQAAABtAAAAyNbV0+S6tK2Sw764ntTRzbLx5uPJatvP90DWxP9D077/Qcu2/z/Isf9Axq3/QMKq/0HA + qP9Cwaj/Q8Wq/0fIrf9Ky6//S82v/07Nq/9S0qr/V9ix/1zguP9h57z/Yuu8/2Hqt/9g6LP/Y+ev/2Pm + q/9j5ar/ZuWm/2rjpP9t5KD/cOOf/3TkoP945p3/fOab/4DonP+D6pv/huya/4fvmP+J8Jj/je+Y/4/t + lv+N6JH/i+OM/4nghv+F2oL/gdR8/3zLc/94w2n/crli/3KzXP9yrlj/catU/3CpUP9wp0//b6dN/3Kp + UP93rFf/eK9j/3iycv90t3//Z7eI/1+2iP9atn//W7Vt/2WxV/90sEP/gas1/4WnM/+DoDL/fpky/3iT + MP90jS//cIou/3GHLf9xhyr/c4Yq/3OGKf91hin/d4Uo/3eDKP93gif/eIEm/3Z/Jf92fiT/dn0j/3h8 + I/96eyP/e3oi/3x6Iv97eSH/fnkh/394If+AeiH/gXoh/4N5If+EeiL/hHoi/4Z7I/+HfCP/iX0j/418 + I/+PfST/kH0i/+Th2dPd2ti2zMjDob23sJGyqqOF5uTi0xMSEdoAAACZAAAAgwAAAHEAAABjAAAAVQAA + AEcAAAA6AAAALQAAABcAAAAcAAAAJgAAADEAAAA+AAAAVAAAAG0AAADI1tXT5Lu0rpPDv7mf1dLOsvPm + 5clj0L/3OMWu/0DErf8/xKz/QMOq/0HEqv9Dxqv/RMes/0bMrP9K0a3/UNSu/1TZsf9a4bn/YOq//2Tw + xP9l8sX/ZPHB/2Tvu/9j77j/ZO+0/2Tvs/9n7rD/au2r/2ztqv9y76n/d++p/3zyqP+A86f/hfSm/4ny + pf+N8aL/j+6i/47nnf+K4pf/hduR/4LTiP99zIL/eMV4/3K7cP9ttGj/arBh/2qtXP9rq1v/a6lX/2up + Vf9uqFP/bqZU/2ylU/9so1T/aaJY/2WgXf9joWL/YqVv/2GrfP9isIb/Y7iK/2m7hP9rt3H/brRb/3Kv + Rf92qjb/eqQx/32fMP97mS7/dpIt/3KMLf9uiCz/bIUr/2yEK/9tgyr/b4Mp/2+DJ/9xgib/coIm/3SC + Jf91gST/dYAk/3d/JP92fiP/d30j/3p7If95eiD/eXkg/3p5H/96eR//e3ge/3p3IP98eCD/f3cg/393 + IP+AeCD/gXkf/4J4IP+DeSH/hXkh/4Z5If+JeiL/inoh/417Iv+OeyH/5eHZ097c2bfNycOivbawkrOs + pIbm5OLTExIR2gAAAJkAAACDAAAAcQAAAGMAAABVAAAARwAAADoAAAAtAAAAFwAAABwAAAAmAAAAMQAA + AD4AAABUAAAAbQAAAMjW1dPkvLavlMO+uKDV0s2y8+fnyWTNvPg5xaz/Qciw/0TMsv9Hz7D/StOw/03Y + sv9Q3LT/VOG3/1rnv/9d7MT/YO7H/2TwyP9l8cb/aPDF/2vxw/9r8b7/bfK+/2/yu/9v8bb/c/K0/3by + sv969LD/fvKt/3zup/9966T/feei/3vgm/962ZP/edGO/3bKhv9zxIH/cLx6/225dP9ptW7/aLFp/2av + Zv9ormL/a61f/2usW/9qqln/aqhX/2mmVv9oo1b/ZaBZ/2SfWf9inWD/XZxi/12dZP9bn2j/V59q/1qj + a/9fqGz/Za1r/22wZv92tV3/fbZQ/3+xQv97qzn/d6Iy/3WZLv9zkCr/cIso/2+HKf9uhCn/bIQp/2qD + KP9qgij/bYIn/26AJv9vgCX/cYAk/3KAI/91gCP/d4Ei/3iAIv94fyH/en8f/3l9H/96fCD/enof/3l5 + H/94eB7/eXge/3h4Hv95eB7/e3cf/3t2Hv98dR7/fnYf/4B3IP+Adx//gXcf/4J4IP+EeCD/h3ch/4l3 + IP+JeCH/i3kh/416If/k4dnT3tvZt83Iw6O9uLGRs62khefl4tMTEhHZAAAAmQAAAIMAAABxAAAAYwAA + AFUAAABHAAAAOgAAAC0AAAAXAAAAHAAAACYAAAAxAAAAPgAAAFQAAABtAAAAyNXU0+W+uLGVxL+6n9TR + zrPx5ubKa9nA90XWtP9Q27r/VN+7/1bivP9Z5cH/XebG/1/ox/9j6cj/ZerL/2bqy/9q68n/a+rF/23q + wv9x68D/c+7A/3Lvvv9y7Lj/ceas/3Dlq/9v4qf/atqf/2fRlf9lyY3/YcWJ/2DAhf9gu4D/YLZ5/2Kz + df9ksnP/ZrFv/2exbf9psmv/abFo/2isZP9mqWD/Zqdd/2elXP9mo1r/ZaFa/2KfXf9hm2D/X5th/1ya + Yf9ammL/Wppj/1ubY/9am2H/W55f/12fXf9doFn/YqJT/2mlT/9yqUz/e65K/4GzRf+BsDz/e6Y0/3Wa + L/9wkCr/bYcn/2yCJf9qgSb/bIIn/22CJv9tgib/bYEm/22AJf9vgCT/bn4j/3F/I/90fyP/coAi/3aA + Iv95fyH/e38g/3t+H/96fh7/e3we/3t7IP95eR7/eXge/3h3Hf94dx3/eHYd/3l2H/96dR3/fHUe/3x1 + Hv99dR7/fnUe/392Hv+AdiD/gHYe/4J3H/+Fdx//hncg/4l3IP+LeCH/jHgg/+Xh2tTf29m4zcrEor+5 + s5KyraaH5eXj1BMSEdoAAACZAAAAgwAAAHEAAABjAAAAVQAAAEcAAAA6AAAALQAAABcAAAAcAAAAJgAA + ADEAAAA+AAAAVAAAAG0AAADI1tXT5b62sZXEv7uh1dHPtPDm5sp54sj3WODB/2PhyP9m5Mr/ZeTM/2bi + yv9l4sj/ZeLE/2Tiwv9i47v/ZOCz/2bgsv9m4LL/aN+w/2rfsf9n2qf/YtKf/1/Om/9by5n/WcOR/1a6 + hv9TtoL/UrN+/1Wve/9VrXf/WKx0/1mrc/9crG//YKts/2Ksa/9mrGn/aKtm/2ipZP9np2L/ZKNf/2Cg + Xf9fnV//X5xg/12bYv9cmmP/XJlj/1qYYv9amGL/WZld/1qYW/9cmVv/XJtY/16bVf9fnFH/YpxN/2Ob + R/9pnkP/cqVA/3qpP/99qzz/fqg3/3mgMP91lir/c40o/22IJf9qgiT/bIEk/2uAJf9sgCX/aoEk/2yA + I/9tgCP/boAj/25+I/9wfiH/cn4h/3N+If91gCD/eIAg/3qAH/98fh7/fH4e/3t9Hf96fB3/enkd/3l4 + Hf95eB3/eHcd/3d2HP94dhz/eXUd/3p0Hf97dB3/e3Qd/3x0Hf99dR3/fnYd/391Hv+Adh7/gnYe/4J2 + Hv+Edx//iHYf/4p4H/+Jdx7/5OHa1N/d2rjPysWjvrmzk7Gtpojm5ePUExIR2gAAAJkAAACDAAAAcQAA + AGMAAABVAAAARwAAADoAAAAtAAAAFwAAABwAAAAmAAAAMQAAAD4AAABUAAAAbQAAAMjW1dPlvLexlsTA + u6HV0s+08Obly33hz/hZ3cT/Xt3C/1zevf9b3rj/Wty2/1resv9Y3K3/Wdmo/1vWpv9b1KT/WNCk/1XG + m/9TvZD/U7uO/1K9kv9UvpP/UreJ/1Gygv9RsX//UbB9/1GreP9Sp3P/UqZw/1Smbv9WpGr/WKNn/1ui + Zv9epGP/YqVi/2OlY/9lpWT/ZaNl/2GgZ/9dnWb/Wppj/1qZYv9dml//XJpg/1yZXv9cmVr/W5dZ/1yY + Vv9cmFX/XJdT/12YUP9gmE3/ZJlI/2SZRf9lmkD/apw9/3CfOf90oDb/dp0y/3adLv96nS3/epgq/3iS + J/9ziyX/bYQj/2l/I/9pfiL/aX4j/2t/Iv9tfyL/bX8i/25/If9wgCD/cn4f/3J+Hv90fR7/dn4e/3p+ + Hv97gB7/fIAd/3yAHP98fhz/fH0d/3t8Hf96ehv/eXgc/3h3Hf93dhz/eHQc/3h0HP94dRz/eXUc/3ly + G/95cxz/e3Mc/310Hf98dBz/fnUe/351Hv+AdR3/g3Yd/4Z1Hv+Hdh//iXcf/4l1Hv/k4trU39zauM7K + xaS9uLOUtK+oiOfl49QSEhHaAAAAmQAAAIMAAABxAAAAYwAAAFUAAABHAAAAOgAAAC0AAAAXAAAAHAAA + ACYAAAAxAAAAPgAAAFQAAABtAAAAyNbV1OW/ubOWxMC7odXTz7Tx5ufLdt/B+FHasv9Y2bL/V9eu/1jU + q/9WzaX/VMae/1C/lv9JupP/SLiR/0mxi/9KsIb/S7GG/020i/9PtYz/T66D/06sf/9OrX7/UK9//0+o + dv9Po2//T6Jt/1Cha/9Qn2b/Upxk/1SdY/9VnWH/WZxh/1mdZP9bn2b/XqBo/1+gav9goWb/YJ9k/12d + Yf9dml3/XJhb/12YWf9dmFj/XplW/16ZVP9dmVP/X5hQ/2CYTv9gl0v/YphG/2WYQv9omj//apo7/2ya + Nv9sljL/aZEu/2uSKv9zlSn/e5so/4CdJ/99lif/d5Am/3KIJP9rgCH/aX0h/2l8IP9pfSD/a34g/21/ + IP9ufx//b34f/3F+Hf9zfx3/c34c/3V+Hf92fhz/en8d/3yCHP9+ghv/fYAc/31+HP98fRz/fHsc/3p6 + HP95eBz/eXYc/3h1G/94dBv/eHQb/3hzG/95chv/eXIb/3lyG/96chv/e3Ib/3xyG/9+cxz/f3Md/4B0 + Hf+DdB3/hXQd/4V0Hf+HdR//iHUe/+Ti2tTf3Nq5zsrFpMC6s5S0sKiJ5uXj1RMSEdoAAACZAAAAgwAA + AHEAAABjAAAAVQAAAEcAAAA6AAAALQAAABcAAAAcAAAAJgAAADEAAAA+AAAAVAAAAG0AAADI1tXU5b65 + s5bEwryg1dPPtPLo6Mty0LT4S8Kg/029nP9JuZf/R7aT/0WxkP9ErYv/RauI/0Wog/9GqoH/RamB/0ir + g/9IqH//SKZ7/0qlef9Kp3z/Tap9/02kdf9NoHH/TKFt/02ia/9PnGX/UJlh/0+aYf9PlmP/UJZl/1CX + ZP9TmGX/V5tm/1udZf9dn2T/YKBj/2KhYf9joF3/YZ1a/2CYWP9emVb/YJlV/2GZVP9gmVL/YJhP/2CY + TP9il0j/ZJdF/2SXQv9olz7/a5k7/2yZN/9pkzD/ZYsr/2SGJv9niSb/cJAm/3mVJP+AmyT/f5kl/3qT + I/91jCP/b4Qg/2p8H/9pex3/aHse/2p8Hv9sfR7/bn0c/29+HP9yfR3/c38b/3V/G/90fhz/dX4c/3d/ + G/99gBz/foIc/3+CGv9+ghr/fn8b/319G/98exv/enka/3l3Gf95dhv/eHQb/3dzGv93cxr/d3Ea/3ly + G/95chv/eXIb/3pyG/97chv/fHIb/31zG/9/chz/f3Ic/4JzHf+Ecxz/hXQd/4d1Hv+HdB3/5OLZ1d7c + 2rnPysWkv7u0lbOwqInm5ePVExIR2gAAAJkAAACDAAAAcQAAAGMAAABVAAAARwAAADoAAAAtAAAAFwAA + ABwAAAAmAAAAMQAAAD4AAABUAAAAbQAAAMjW1dTlvbi0l8XCvaLW09C18urqy2S7ovg7rYv/RLCO/0Ov + jP9DrIn/RKiF/0Slgv9EpH7/QqB7/0Khef9DoHb/RKB1/0addP9In3T/SaF0/0mgc/9Lnmz/TZ9s/02h + bP9MnWj/S5hl/02YZ/9LlmT/SpNj/02TZf9NlGT/UZZh/1WYYf9aml//Xp1f/2CgXv9joV3/ZaJd/2Wg + Wv9jnFf/YZpU/2CZUf9imlH/ZZtP/2SYTP9kl0f/ZpZE/2aWQP9plz7/apg7/22XN/9pkTD/ZIoq/2CE + Jv9igyT/Z4Uk/26KI/91jyP/fJUk/3+YJf99liT/eY8h/3SJIP9tgh3/aXod/2h6HP9pexz/bHoc/258 + HP9vfRn/cH0Z/3J+HP91gRz/dYAa/3WAGf94fhr/fIAc/3+CGv+Agxv/f4Ma/3+CGf9/fxn/fn4a/318 + Gv97eRn/eXcZ/3l2Gf94dBv/d3Ma/3dzGf93cRr/eXEb/3lyG/96cBn/enAZ/3twGf98chv/e3Ea/39y + HP9/chz/gnEb/4RzHP+Dchv/hXMc/4VyG//l4tnV4N3buc7Lx6a/vbaWta+piufl49UTEhHZAAAAmQAA + AIMAAABxAAAAYwAAAFUAAABHAAAAOgAAAC0AAAAXAAAAHAAAACYAAAAxAAAAPgAAAFQAAABtAAAAyNbW + 1OW+uLSXxcK+otbTz7Xz6+vLZred+DumhP9CqYf/Q6eE/0Gkgf9BoX3/Qp94/0CbdP9BmXP/Q5pw/0OZ + bP9EmW3/RJpt/0ecbf9ImWj/Spto/0ufbP9LnWr/Spdo/0ubaf9KmGn/SpNm/0uVY/9MlGL/T5Nf/1GU + Xf9Tllz/WJhc/1ybXP9gnlr/Y6Ba/2aiWf9po1j/aKFW/2adUv9lmk//ZZlM/2eaS/9pm0n/Z5lE/2mY + QP9qlz//bJg8/2yYOP9nkDL/ZIgr/2GDJ/9ggiP/Y4Mj/2aCI/9shCL/dIki/3mOIf99kyL/f5Yj/3yT + If94jSD/c4ce/2x/G/9peRv/ankb/2t5Gf9sehr/bnwa/3B9GP9wfhj/c4Aa/3WDGv92ghr/d4EY/3qA + GP99ghr/gIQa/4GEGf+Bgxr/gYIZ/4CBGf9/gBj/fnwY/3x5Gf97eBr/encZ/3h1Gv95dBn/eHMY/3hx + Gf93cBn/eHEa/3lwGf95cBn/eXAZ/3pwGf98cRv/fXAa/31wGv+AcRv/gnEa/4NyG/+Fcxz/hXIb/+Xi + 2tXg3du6zszHpr+8tpa2r6mK5+Xj1hISEdoAAACZAAAAgwAAAHEAAABjAAAAVQAAAEcAAAA6AAAALQAA + ABcAAAAcAAAAJgAAADEAAAA+AAAAVAAAAG0AAADI1tbV5b+8tZfGwr2j19TRtvTs7MxksZX4OZ56/0Gi + f/9Aon3/QZ94/0Kcdf9CmnL/QJhw/0GTa/9Bkmf/Q5Vn/0OYaf9ElGX/RpRl/0aZaP9ImWv/R5Vn/0mZ + af9KnGv/SZdk/0uXY/9Nl2L/TZNf/06TXP9QlFv/U5NZ/1WWWf9amVj/X5tX/2OeV/9moVb/aaNX/22k + U/9solL/ap5N/2maSf9pmkf/a5pE/22ZQv9tmT//bpk8/26YOP9qkjP/Y4gs/2CEKP9igiX/ZIIj/2WC + Iv9ngSH/an8g/3CEH/93iB7/eo0e/36SIf9/lCH/fI8g/3eJH/9yhBz/bXsa/2p4Gf9reRj/a3oY/257 + Gf9vfRn/cH4W/3KAFv91ghj/d4QZ/3aDGf94gBf/fIEX/32DGP+AhRj/goYY/4SEGf+Dgxn/goIY/4GA + GP9/fRf/fXoY/3x4Gf97dxn/eXQZ/3l0Gf94chn/d3EY/3ZwF/93cRj/eXEY/3lwGf95bxj/eW8Y/3tw + Gf99cBr/fXAa/4BwGv+CcRv/g3Ia/4RxGv+EcRn/5eLZ1eDd3LvQzMemwr23lrexq4vn5ePWEhIR2gAA + AJkAAACDAAAAcQAAAGMAAABVAAAARwAAADoAAAAtAAAAFwAAABwAAAAmAAAAMQAAAD4AAABUAAAAbQAA + AMjW1tXlwLy1mMbEvqPX1NG29OzszGSukPg4mnT/P5x3/0Gedv9CnXT/Qppx/0GVa/9Ckmf/Q5Jn/0KT + Z/9CkGT/RI9j/0SSaP9FlWr/RZFl/0iTaP9Mm2r/TJdl/0uVY/9OmWP/TZZf/06TXP9QlFz/T5NZ/1CS + V/9Vk1b/WJZV/1yYVP9gmlX/ZZ9T/2qhUv9to1L/b6RP/2+hSv9tnkb/a5pD/2yaQf9vmj//cZo8/3KZ + Ov9ukzT/ZYst/2OFJ/9jgyX/ZYIl/2SAI/9mgCH/aIAf/2mAHf9vfhz/coIc/3aIHf97jR//fpIe/3+R + H/97ix7/eIgd/3GCGv9sexn/a3kY/2t6GP9texn/b3sZ/3B9F/9xfxb/c4EX/3eEGP96gxn/eYEY/3qA + F/99ghf/f4QX/4KFF/+Ehhj/hIQX/4ODGP+Cghj/gYAY/399F/99ehf/e3gY/3p2F/95dBf/eHMY/3dy + GP93chf/d3AX/3hwF/95cBn/eG8Y/3hvGP95bxj/enAZ/3xvGf98bxn/fHAZ/39xGf+CcBn/hHEa/4Rx + Gf/l4tnW4N3cu9HMx6bDvbiXuLOsi+fl49YSEhHaAAAAmQAAAIMAAABxAAAAYwAAAFUAAABHAAAAOgAA + AC0AAAAXAAAAHAAAACYAAAAxAAAAPgAAAFQAAABtAAAAyNfW1eXAvLWYx8O+o9fU0bb07O3MY6qL+DiW + bf9BnHT/Qpxz/0Gab/9Cl2v/Q5Rp/0KTZv9DjmT/QYxj/0GOZv9DkWb/RY9j/0WQYv9HlWX/SZVk/0mS + X/9NmGL/Tphh/02UW/9Oll3/UJRb/1GRVv9Sk1f/U5JU/1eSU/9ZlVH/XJhQ/2KbUP9nnk7/baFO/3Kj + Tf90o0n/dKFF/3CdQv9umj7/cJo8/3ScO/9xmTb/a48v/2WIKf9lhSf/ZoQl/2aDIv9ngiD/aIAe/2l/ + Hf9rfhz/bH4b/29+G/9ygxv/dogc/3uMHf99kBz/fpAd/3qKHP93hxv/cIEY/2t7Gf9rehj/bHoY/258 + F/9wfhX/cH4U/3J/Ff91gRf/eoUY/3yEGP97ghj/fIEX/36DF/+BhRf/hIYY/4SGGP+Fhhj/hIQY/4OB + F/+CgBj/gH0X/356Fv98eBj/eXUX/3l0F/94cxj/d3IX/3ZxF/93cBf/eHAX/3dvF/94bxj/eG8Y/3hu + GP95bxj/e24Y/3xvGf98bxn/f3AZ/4FvGf+EcRr/g3AZ/+Xh2dbg3ty70c3JpsS/uJe5tKyL5+Xj1hIS + EdoAAACZAAAAgwAAAHEAAABjAAAAVQAAAEcAAAA6AAAALQAAABcAAAAcAAAAJgAAADEAAAA+AAAAVAAA + AG0AAADI19bV5cC8tpnHw76j19TRtvTs7cxiqon4OJZo/0Cabf9Cm23/Qplt/0GWav9BkWf/Qo1j/0CN + Y/9CjWH/Q41f/0OLX/9Gj2D/SJFf/0eOXv9JkV3/S5de/0uSWv9PlFv/TpZc/1CSVv9Sk1b/VJNU/1WQ + Uv9XklH/WJJP/1uVT/9gmEv/ZZxJ/2ygSf9xo0j/d6RF/3qkQv94okH/dp89/3OZOf9ylzb/bpQy/2mN + LP9piij/aIgn/2iEJP9ogyL/aIIf/2qAHf9rfxz/bH8b/21+Gv9tfBn/b34Z/3OBGP92hxr/eYob/32Q + HP99jxr/eosa/3eIGv9wgBj/bHsY/2x6F/9ufBf/b30X/3B+Ff9xfxX/dIEU/3mDFv98hRf/fYQX/3uC + Fv98ghX/foQW/4KGFf+GiBb/hocX/4aGF/+GhRb/hIEY/4OAF/+BfhX/f3oV/3x3F/97dhb/eXQW/3lz + F/93chb/d3EW/3hwF/94cBf/d28W/3huFv94bhb/d20W/3luF/97bhj/fG8Y/35uGP+Abxj/gG8Z/4Jw + Gf+Cbxf/5eLZ1uHe3LvRzsmmxL+4l7myrIzn5eTWEhIR2gAAAJkAAACDAAAAcQAAAGMAAABVAAAARwAA + ADoAAAAtAAAAFwAAABwAAAAmAAAAMQAAAD4AAABUAAAAbQAAAMjX1tXlv723msjEv6XY1dK39e3tzWOo + hPg5lGX/QZlr/0KZbf9Dl2z/QpNp/0KQZf9CjGH/Qoxd/0SLXP9Filz/Rotd/0eLW/9Hi1n/SZBb/0qP + WP9NkFb/UJRZ/0+TVv9RkVb/U5VW/1KSUf9Uk1D/VpBN/1eSTP9Zk0z/X5ZJ/2SaRv9snUX/cqBF/3ak + Qf97pj//faY9/32kPP95njf/cJQx/2uOLP9qjCn/bYwn/22LJP9rhyD/bIMg/2yBHv9sgB3/bX8c/25+ + Gv9ufRn/b3wX/257Fv9vfRf/c4IZ/3eGGf96ihv/fpAb/32PG/96jBn/d4gY/3B/F/9texb/bnsU/29+ + FP9xfxX/cX8U/3KBFP93ghT/fIQV/36HF/9+hBX/fYIV/32CFf9/hhX/g4YV/4eIFf+Hhxb/h4YV/4aF + Fv+Eghf/gn8V/4F+FP9+exP/fXcV/3x2Ff96dBX/enMW/3hxFP94cRX/d28W/3dvFv93bxb/d28W/3du + Fv93bRb/eW4V/3ptF/96bhb/fW8X/39uF/+Abxf/gHAZ/4JvF//l49rW4d/cvNLNyafDvriYuLKsjebl + 5NcSEhHaAAAAmQAAAIMAAABxAAAAYwAAAFUAAABHAAAAOgAAAC0AAAAXAAAAHAAAACYAAAAxAAAAPgAA + AFQAAABtAAAAyNfW1eXAvbeax8W/pdjV0rf07O7NZKeD+DiRZP9Clmr/RJlr/0OXaP9Dk2T/RJBg/0SN + Xv9EiVr/RIlY/0WKWf9Fh1f/R4pW/0mMVf9Ji1T/TI5U/0+RVP9QjlP/UpNS/1KSUf9Uk0//VZVN/1WS + S/9Ykkr/WpJH/16WRf9lmUP/bJ1B/3KfQf92oj7/e6U8/4GnPP+Epzn/fqE1/3KVL/9rjCj/a4wm/26M + Jf9xjSL/cIoi/26GIP9uhB3/boEc/25/G/9ufhn/cH8W/299Ff9uehb/bnoW/3B+F/9zgxj/eIkZ/3uO + Gf9/khr/fY8a/3qNGP93hxf/cH4V/258E/9vfRT/cH4U/3OAFf90gBX/dIEU/3mDE/99hxT/f4cW/36G + FP99hBT/f4MT/4KHFf+FiBb/iIkV/4iIFf+GhhX/hoQW/4WCFv+CgBT/gH0U/398E/99eBT/fHYW/3p0 + Ff95cxX/eXIV/3hxFf93bxb/d28V/3dvFv93bhX/d20V/3dtFf94bRX/eW0W/3ltFf99bhb/f20W/39t + Fv9/bhf/gW4W/+bi2tbh3ty80c3JqMO+uJm6tK6N5+bl1hISEdoAAACZAAAAgwAAAHEAAABjAAAAVQAA + AEcAAAA6AAAALQAAABcAAAAcAAAAJgAAADEAAAA+AAAAVAAAAG0AAADI1tXV5sG9t5rIxb+l19bSt/Tt + 7s1jo4H4O5Bi/0SWZ/9ElmX/RZVj/0WUYf9Djlz/RYpY/0SJV/9Eh1X/RYZS/0mJU/9JiFL/SohP/02N + Uf9NjE//To1O/1KQUP9Tj0z/VZNN/1STSf9Yk0n/WpRH/16WRv9hl0P/ZJpC/2qbQP9vnT3/dKA7/3uj + Of+Bpzj/hKg3/3+jMv94mS7/cJAo/2yKJP9uiiP/cowi/3ONIP9zih7/cYYe/3CFGf9ygxj/cYEX/3B/ + Ff9vfhT/bn0U/256Fv9uexT/cX8W/3WFF/95ixf/fpAY/4GTGP9+jxf/fo8X/3mIFv9wfRT/b30T/3F+ + Ff9yfhb/dIAV/3iCFP95ghX/fIYU/4GKFf+AiBX/foQT/32DEv9/hRP/hYgV/4mKFv+HiBX/h4gU/4eH + FP+GgxX/hIEV/4OAE/+BfRP/f3wU/316Ev98eBT/enQT/3lzFP95cxT/eXMU/3hxFP94bxX/eG8V/3dt + Ff93bRX/d20V/3htFf95bRX/eW0V/3xtFf9+bRb/fm0W/39uF/+AbRX/5uLa1uHe3LzQzcmoxL+6mb21 + r43o5+XWEhIR2gAAAJkAAACDAAAAcQAAAGMAAABVAAAARwAAADoAAAAtAAAAFwAAABwAAAAmAAAAMQAA + AD4AAABUAAAAbQAAAMjX1dXmw723msjFv6XY1dK39OzvzWWkfvg7jlv/RJRi/0eXY/9JlmD/RZBc/0aN + Wf9GjFb/Q4ZQ/0SEUP9IiE//SYVN/0mGTv9LiEz/TIdJ/0+MS/9PjUr/Uo1K/1WPSv9WkEf/WpZF/16X + Rf9hm0P/ZJtC/2aaQP9omz7/bZs7/3OeOf96ojf/g6Y2/4GmMv99oiz/epsp/3mVKP9yjyT/bYki/3KK + If92jB7/dYse/3WJHP91hxn/coQZ/3OCF/9ygRX/b34U/3B+FP9vfRT/bnsV/257E/9xfxX/doUW/3qL + Fv+AkRf/gJMY/36PFv+CkBj/eIcV/3B+FP9wfxX/cn8T/3OAE/93gRP/eYIU/3yEE/+AiRT/gYsU/4GJ + E/9+hBP/fYMS/4CGE/+GiRT/iIkT/4mKFP+HiBT/h4cV/4aEFP+EgRP/g4AT/4F9E/9+ehL/fHoR/3t3 + Ev96dBP/enMU/3lzFP95chP/eHAU/3hvFP93bhT/d20V/3dtFf93bBX/eG0V/3ltFf95bBX/em0V/3xs + Ff9+bRb/f24X/4BtFf/m4trX4d7dvdHOyajFv7qZvLWvjejn5dYSEhHZAAAAmQAAAIMAAABxAAAAYwAA + AFUAAABHAAAAOgAAAC0AAAAXAAAAHAAAACYAAAAxAAAAPgAAAFQAAABtAAAAyNbW1ebDvbeaycXApdfW + 0bf07u/NZqJ6+DyOWP9Gll//RpVc/0iVWv9Hklr/RYxX/0WIUP9Ghk7/R4RL/0qCS/9Lhkr/SoVK/0yG + R/9OiUf/T4hG/1CKR/9TjEP/V5FD/12XRP9jnEP/Zp5B/2aeQP9mnD3/aZo6/22aOf9znzj/e6Y1/36m + Mv98oS//eJsq/3qaJf98mST/epUm/3OOIv9xiR7/dYod/3iMGv96jBr/eYoZ/3eHGf91hBj/dIMW/3KB + FP9wfxP/cH0U/298E/9ufBP/bnwT/3OCE/94iBT/fI0V/4KTFv+Bkhb/gpEV/4aUFv95hxX/cIAU/3KB + E/90gRP/d4IS/3mCEv95gxL/fIUS/4KKEv+EjBP/gooR/3+GEv9/hBH/gocS/4iKE/+JixL/iYoS/4iI + Ev+HhhP/hoUT/4SCEv+DgBP/gX0Q/396EP99ehD/fHcS/3t0E/97dRH/e3MT/3pyFP95cRT/eHAT/3dv + E/93bhT/d24U/3dsFP94bBT/eW0V/3htFP95bRX/em0V/31sFf99bRb/gG0V/+bi2tfi3929087KqMTA + upm7ta6N6efl1hISEdkAAACZAAAAgwAAAHEAAABjAAAAVQAAAEcAAAA6AAAALQAAABcAAAAcAAAAJgAA + ADEAAAA+AAAAVAAAAG0AAADI1tbV5sK+uJvJxcCl19bRt/Pu781mo3j4PIxU/0aTWP9Jlln/SJVY/0aR + Vf9GjVL/R4hO/0iDSf9Igkf/S4RI/0uDRv9NhEX/TIVF/06EQ/9QiEL/U4xA/1yTQf9gmkD/ZZ9A/2if + Pv9lnjz/ZZs7/2mYOf9umzj/dqQ2/3mpMf93oy3/dZkq/3WVJ/96mST/fpoi/36aJP98lCP/dYwd/3SJ + G/93ihr/eo0Z/3uNGf96ixj/eYgY/3aEFf90hBX/coIU/3F/FP9wfhP/bn0T/298Ev9wfhP/dYYS/3uL + FP9/jxT/hpQV/4aTFP+FlBX/iJUW/3eGE/91gRH/dYMS/3iEEf96hBH/e4US/3yFEf9/iBH/hIwT/4aN + FP+DihH/gIYR/4GFEP+GhxD/iYsR/4mLEf+JihL/iIkQ/4aHEf+FhRL/hIIS/4OBEf+Bfg//f3sR/315 + Ef98dxH/e3YQ/3t2EP96dRL/e3QT/3lxFP95cBP/eHAS/3duE/93bhT/eW4T/3htE/94bRP/eG0U/3ts + E/99axX/fWwV/31tFv+AbhT/5uLb1+Lf3b3TzsqpxMC6mbu2sI7p5+XWEhIR2QAAAJkAAACDAAAAcQAA + AGMAAABVAAAARwAAADoAAAAtAAAAFwAAABwAAAAmAAAAMQAAAD4AAABUAAAAbQAAAMjX1tXmw764m8jF + v6bY1tK49O7wzmiidPg/i0//R5JV/0iUVP9KlFT/SZBR/0qMTf9Kh0r/SYRG/0mCRP9KgUP/TYNC/0yC + QP9Og0D/UIc//1qOPv9gmD7/ZJw+/2efPP9mnTv/Zps4/2aZOP9qmTj/c6E1/3itNf93qS//b5kp/26Q + Jv90kCP/eZUi/3+aIP+AmSL/gJkg/36TIP93ixv/dYob/3qMGP98jBn/fY0Z/36MGP98hxb/eIUV/3aE + E/9zgRX/c4EU/3J/Ev9wfhH/cX4R/3OAEv95hhL/gIwT/4STFf+Jlxb/hpQW/4qXFf+KlhX/eYUS/3iC + Ef95hBD/e4YS/32GEv99hxL/f4cS/4KLEP+HjxL/ho4S/4OKEf+Ahw//gYcO/4aKD/+JixD/iYsQ/4mL + EP+HiBD/h4UR/4aEEf+DghD/gX8P/4B9Dv9+ehH/fXgR/3x2EP97dxH/e3YQ/3x0Ev99cxP/e3IS/3tx + Ev96bxP/eW4S/3luEv95bhT/eG0T/3htE/94bRP/e20T/31sE/98bRP/fm4V/4BuE//m4tvX4d/dvdLO + y6rFwLuavLawjunn5dYSEhHZAAAAmQAAAIMAAABxAAAAYwAAAFUAAABHAAAAOgAAAC0AAAAXAAAAHAAA + ACYAAAAxAAAAPgAAAFQAAABtAAAAyNfW1ebCvribx8XAptjW0rn07e/OaKBw+ECJS/9JkVH/SpNR/0yU + Uf9NkE//S4xJ/0yHRv9MgkP/S4FA/0uAP/9LgT7/ToQ9/1WKPP9clTz/Yps8/2aePf9mmzr/Zpk4/2OY + Nf9mmDX/bZw1/3erNf94tDL/b58s/2yMJ/9siCX/cI0i/3eTIP99lyD/gJkf/4ObHv+BmB3/f5Me/3mM + Gv94iRj/eYsY/3+NF/+Cjhj/gYsX/3+IFf97hRT/doQT/3SCFP90gRP/cn8R/3J/Ef9yfxH/doIT/32I + E/+CjhP/iJUU/4uYFf+IlRT/j5wU/4qVFP98hRL/e4US/3yFEf9+hxL/focS/3+HEf+AiRD/hI4R/4qQ + E/+HjhL/gooP/4KHDv+DiA//h4sP/4mLD/+Jiw//iIsQ/4iIEP+IhRD/hYMR/4OBEP+CgBD/gH0P/356 + D/98eBD/fHcP/352EP9+dxD/fXUP/310EP98cxD/e3IS/3twE/96bxP/eW4S/3htEv94bRL/eG0T/3ht + E/96bRP/fGwT/3xsE/9+bhX/gG4T/+bi29fh392+0s7LqsXAu5q9tq+O6efl1hISEdkAAACZAAAAgwAA + AHEAAABjAAAAVQAAAEcAAAA6AAAALQAAABcAAAAcAAAAJgAAADEAAAA+AAAAVAAAAG0AAADI19bV5sK/ + uZzGxb+m19XSufTt785soHD4QopJ/0iQTP9LlE7/TJVO/02QTP9MjUf/TYdD/02DQv9MgD//ToA8/1OG + PP9ZkDr/YJk5/2WeOf9knTn/Ypg4/2OUNv9llDL/aZky/3OmMv95uTP/c7Av/2mRKP9mgiX/a4Uj/3GL + If91kCD/fJQe/3+YH/+CmR//hZwc/4SaHP+DlB3/fIsZ/3qIGP99ixf/g44V/4SPFv+CjBX/f4gU/3uG + Ev95hBP/d4IS/3Z/Ef90fxD/c4AR/3aCEf96hhL/gIsT/4WSFP+LlxX/jJoT/4qXEv+TnxX/iJMT/32H + Ef99hxL/fokR/4CKEP+Aig//gIgR/4OMEP+JkBL/ipES/4eNEf+EiQ7/g4cM/4aJDv+Kiw//iowQ/4mL + D/+Jig7/iYgO/4eFEP+GgxH/hIAP/4N/D/+BfRD/f3oP/314D/9+eA//fncP/353EP9+dxD/fXYP/3x0 + Ef97chL/e3IR/3pwEv96cBL/eW4Q/3ttEP97bRL/e20S/3ttEv98bBP/fWwT/39uFP+AbxL/5ePb1+Lf + 3b7TzsuqxcC7mry2r4/p5+XWEhIR2QAAAJkAAACDAAAAcQAAAGMAAABVAAAARwAAADoAAAAtAAAAFwAA + ABwAAAAmAAAAMQAAAD4AAABUAAAAbQAAAMjX1tXmw764m8jFwKbW1dK58+3wzmudbPhDiEP/S5BL/0qU + S/9LlEr/T5JI/06LRP9OhkH/TIM9/1CDPP9YjDv/YJc6/2SdOf9lnTj/ZJg3/2OUNP9hkDL/Y5Ix/2ye + L/92tTL/eb8w/2yiK/9kgiT/ZoAi/2eFIv9tiCD/c40f/3eRH/99lB7/gpgd/4eaHP+Imxr/hpkc/4SU + Hv97ixn/eogX/4CLFv+DjxX/hI8V/4KMFP9/iBP/e4YT/3qEEv94gRH/d4AQ/3aBD/90gRD/eIMR/3yI + Ef+CjRP/iZQU/42aEv+NmxP/jJkS/5WgFf+GkRL/fogR/3+HEf9/iQ//gIsP/4GLD/+BiQ//hY0Q/4uT + Ef+MlBH/h40R/4WJD/+EiA3/iIoO/4uLDv+LjA//iYoO/4mJDf+Ihw3/hoUO/4WDD/+EgA//g34O/4F8 + Dv+Aeg3/fngO/354Dv9+eA7/f3YP/393EP9+dg//fXQQ/31zEf98cxD/fHER/3twEv97bxL/fG0R/3xt + Ef98bRH/fG0S/3xsEv99bRT/gG8T/4FwEv/l49vX4t/dvtPOyqrFwLubvLawkOnn5dYSEhHZAAAAmQAA + AIMAAABxAAAAYwAAAFUAAABHAAAAOgAAAC0AAAAXAAAAHAAAACYAAAAxAAAAPgAAAFQAAABtAAAAyNfW + 1ebDv7mcyMbBptjW07nz7fDOa55o+ESHQP9Lj0f/TZRH/06VRv9QkEP/UIs//1GIPv9Uizv/XZM7/2ac + Of9mnzj/Y5w2/1+TNf9ejjH/X44v/2eSL/9xqzD/eMMy/3G6Lv9kjib/Ynsg/2R/If9mgyH/aYce/3CK + Hv92jR7/eZEe/4CVHf+DmRr/h5kZ/4ebGf+KmRv/iJUf/36LF/99iBX/gYsV/4SNFP+FjhX/gosU/3+J + E/97hhL/eYMR/3iDEP93gg//d4EP/3eCD/95hBH/fokR/4WQEf+LlhL/kJwR/4+bEv+RnBL/lqEU/4SO + EP9/ig//gIoO/4GMDv+DjBD/g4sP/4OKD/+HjxD/jJQQ/4uTEf+GjRH/hIkO/4aJDP+IjA3/i40N/4yN + Dv+Kiw3/iYkN/4iHDf+HhQ3/hYQM/4SADv+Dfw//gX0N/4B6DP9+eAz/f3kO/354Df+Cdw7/gncP/4J2 + D/+BdRD/gHQP/4B0Dv9/chD/f3AR/31uEf99bhH/fG0Q/3xtEf98bRH/fG0R/35uE/+AcBL/gXAS/+bj + 29ji392908/KqsXBu5u9uLGP6Obl1xIREdkAAACZAAAAgwAAAHEAAABjAAAAVQAAAEcAAAA6AAAALQAA + ABcAAAAcAAAAJgAAADEAAAA+AAAAVAAAAG0AAADI19bV5sO/uZzJxsGm2NbTufTu8c5snGb4RIY9/02Q + RP9Ok0T/UZND/1GQQf9TkT7/XZU8/2KcPP9moTr/Zp43/2GXM/9ejzH/W4sw/1+LLv9pmC3/dr0x/3bK + Mv9qqSv/YYEj/2F7IP9kgSD/ZoIg/2eFH/9uhx3/cowd/3ePHf9+kRz/gZYa/4WYGf+KmRj/i5oX/4yZ + HP+KlR//gYsV/3+IFP+BjBT/hI8S/4SOE/+CihL/gIgQ/32GEv97hRD/eoMP/3qDD/95gw//eYMP/3yG + EP+BixH/h5IR/46ZEv+TnRL/kZsT/5WfE/+VnxH/go0P/4GLDv+Diw//hI4O/4SMD/+Diw7/hYwP/4yQ + EP+PlBH/jJIQ/4iMEP+Gig3/h4kN/4qMDP+NjQ3/jYwO/4mKDP+IiA3/ioUM/4iFDP+Egw3/g38N/4J+ + Dv+Aew3/f3kN/354Df9+eA3/f3gN/4J4Df+CeA7/gncP/4F1D/+AdA7/gHQO/39yEP9+cBD/fm8Q/31u + Ef99bRD/fG0Q/3xtEP9+bRL/gXAS/4JyEf+DchH/5uPb2OHg3b7Sz8urxsO8m725sY/o5uXXEhER2QAA + AJkAAACDAAAAcQAAAGMAAABVAAAARwAAADoAAAAtAAAAFwAAABwAAAAmAAAAMQAAAD4AAABUAAAAbQAA + AMjZ19bnwr64m8rGwabZ19O59O7yzmybY/hFhzn/TY5A/0+RP/9SlkH/WZpA/2GiP/9opDz/Z6M5/2Ka + NP9ekjH/XIsv/1yJLf9hjCz/bKUt/3bPMv9xxy//Y5Qn/2F6Iv9ifSL/ZIAh/2WBIP9ogx7/bIQd/3GH + Hv90jB3/epAd/3+TGv+Clhn/h5kY/42bGP+NmhX/jpoc/4uVIf+AihT/fogS/4KNFP+FjhL/ho4R/4KK + EP9/iBD/fYUR/3yFD/97gw7/e4MO/3qDDv97gw7/fogP/4SOD/+KlA//kJsR/5WfEv+SnBH/maES/5Kc + EP+CjQ//g4wO/4SMDv+Gjg//ho0O/4WMDf+Hjw7/jpQQ/5CWEP+MkhD/iIwP/4WKDP+Jiwz/jo0N/5CM + DP+PjAz/jIoK/4uHC/+KhAv/hoQL/4OBDf+Dfw7/gX0M/397C/9+egz/f3gM/4F3DP+CeQ3/gngN/4J4 + Df+CeA3/gHYO/4B1Dv9/dA7/f3MO/39yEP9+cBH/fW8P/3xuD/98bRD/fW0Q/39vEv+BcBH/gnIS/4V0 + D//m5NrY4uDevtTRzKvHw72bu7avjuno5tkTEhHaAAAAmQAAAIMAAABxAAAAYwAAAFUAAABHAAAAOgAA + AC0AAAAXAAAAHAAAACYAAAAxAAAAPgAAAFQAAABtAAAAyNrY1+jCvbecysbBqNnX07n07/LObJtg+ESF + NP9NjD3/VJc+/12kQP9mq0D/aas8/2ikN/9imDP/XI0w/1uJLf9diiz/Y5It/2+2L/9x1zH/ZrIt/2GF + Jf9ifCL/ZIEg/2SBH/9lgR7/aIEd/2qDHv9uhRv/cYob/3eMGv98kBv/gJMa/4eWGf+Jmhj/jZoW/46a + FP+Qmh7/jJUh/4GKEf+AiBL/g4oR/4WNEv+FjRD/gooO/4CJD/99hg7/fIQP/3uDD/97gw7/e4MO/3uE + D/+BiQ7/h5AP/42XD/+TnhD/l6AP/5OcD/+cpBL/kZkQ/4WODf+Gjgz/hY4M/4ePDv+Gjg7/hYwN/4mP + Dv+Plg7/kJcP/4uQDv+Hig7/hokM/4qLDP+OjQz/kY0N/4+LDP+NiQv/jIcL/4mEC/+Hgwr/hYEL/4F9 + Df+AfAz/f3oL/355C/+AeQz/gncM/4N4DP+CeA3/g3gN/4N3Dv+CdQ3/gnUN/4JzDf+Acw7/f3IO/4Bw + Dv9/bw//fW4O/3xuDv9+bg7/gHAQ/4BxEP+CcxH/hnUR/+bk29jj4N6+1NHMq8bDvZy5tK6N6unn2hMS + EdoAAACZAAAAgwAAAHEAAABjAAAAVQAAAEcAAAA6AAAALQAAABcAAAAcAAAAJgAAADEAAAA+AAAAVAAA + AG0AAADI2djX6MG9t5zKxsGn2dfTuvTv8s9rmV74RYUx/1SWO/9gpj7/Z7E//2mvPf9mpTn/YJgz/16O + L/9ciCz/X4os/2idLv9xyjH/bNIx/2CYKf9deyP/YX4i/2WDIf9lgx//Z4Ie/2iCH/9qgh3/bYMd/3CG + G/9zihn/eIwZ/32QGv+Ekxf/ipYY/4yaF/+QmhX/kJoT/5GaHv+MlCD/f4gR/4CHEv+EihH/hY0Q/4OM + D/+Ciw//gIkM/36GDf99hQ7/e4QN/3uEDf97hAz/foUN/4KKDf+JkQ7/kJgP/5WdEP+Wng7/lJwP/52k + Ev+Olg7/ho4N/4aODP+Ijwz/iI8M/4eODf+IjQ7/jJMO/5GYDf+Qlg7/i44O/4eJDf+JiQv/jYwL/4+O + Cv+RjAv/kIoM/4yIC/+Lhgv/iYQL/4iBCv+EgAr/gX0M/4B8DP+AeQr/f3gK/4F4DP+Bdwv/gngM/4J4 + Df+Ddwz/hHcM/4N1Df+CdA3/gXQN/4B0Dv9/cg3/gHAN/39wDv9+bw//fW8P/35vD/+AcBD/gnIP/4R1 + EP+GdxH/5uTb2OPg3r7U0MurxsS9nLi0rY7q6efaExIR2gAAAJkAAACDAAAAcQAAAGMAAABVAAAARwAA + ADoAAAAtAAAAFwAAABwAAAAmAAAAMQAAAD4AAABUAAAAbQAAAMjZ2NfowL24ncnHwqjZ1tO59O7yz3Cd + XPhPkjL/YKc7/2auO/9nrjv/Y6U4/16ZNP9bkS//XIst/2COLP9qrS7/cNoy/2bDLf9bgyP/Wncj/15+ + Iv9igSD/ZYIf/2eDIP9ogx//aoId/2qCHP9sghz/cYUZ/3WKGP96jBj/gJAY/4eTF/+Klhb/jZkV/5GY + Ff+QmRL/kpsf/4uUH/9/hxD/gIcS/4OJEP+Fiw//hIwP/4GKDv+AiA3/f4YN/36FDP98hAv/e4QL/3yE + C/9/hwv/hIwO/4uSDv+SmRD/mJ8Q/5idDv+ang7/nqQQ/4uUDv+Gjg3/ho4M/4mPDP+Jjwz/iI0L/4mP + Df+PlQ7/lJkN/5CVDf+Jjg7/h4oM/4yKDP+Qjgz/kI4K/5GNC/+Pigv/jIgL/4uGC/+JhAr/iIEK/4R/ + Cf+BfQv/gHwM/4F5Cv+CeAv/gngM/4J4DP+CeAz/gngM/4N4DP+Edwz/g3YN/4J1Df9/dQz/f3MN/4Bz + Df+AcAz/fnAM/31vD/9/bw//f28P/4BwD/+Ccw//hXYR/4d4EP/m5NvY4+Dev9TQy6vIxL2cubStjurp + 59oTEhHaAAAAmQAAAIMAAABxAAAAYwAAAFUAAABHAAAAOgAAAC0AAAAXAAAAHAAAACYAAAAxAAAAPgAA + AFQAAABtAAAAyNnY1+jBvbidyMfCqdnW1Lrz7fLPd6pc+FmeMP9jqTj/Y6k2/2CjNv9dmzX/XJUx/12Q + Lv9ili7/bsAx/2zhMv9grir/WHgj/1l4IP9bfCH/Xn8f/2SCHv9mgh7/aYMe/2qCHP9rghr/a4QY/2+E + Gv9zhhr/d4oY/32NF/+DkBX/h5QU/4uWFP+OmBX/kZgV/5GYE/+UmSH/jJId/4GJDP+Bhw7/hIkP/4WL + Dv+Fiw7/g4gM/4KHDf+AhQz/foUL/32EC/99hAv/fYUL/4CIC/+GjQ3/jZQN/5SbD/+ZoQ7/l54N/56i + Dv+eog//jJEN/4mPDP+Kjwz/i5AN/4qPDP+Kjgv/jZAM/5GWDf+UmQ3/kZUN/4qNC/+JiQv/j4wL/5KO + Cf+Sjgr/ko0L/5CKCv+OiAn/i4cJ/4mECv+HgQr/hn8K/4N9Cv9/fAr/gXkJ/4J4Cf+CeQv/g3gL/4R5 + Cv+EeAz/hHgM/4N3C/+Ddg3/gnUN/4F1DP+Bcw3/gHIM/4BxDf9+bwz/fm4N/35vDP9/cAz/gXIN/4N0 + D/+FdhD/h3kO/+bk2tji4N6/1NDLq8XDvZ24s62O7Onn2hMSEdoAAACZAAAAgwAAAHEAAABjAAAAVQAA + AEcAAAA6AAAALQAAABcAAAAcAAAAJgAAADEAAAA+AAAAVAAAAG0AAADI2djX6MO+uJzJx8Ko2NbTuvLs + 8s96sFv4V58t/1ygM/9cnjT/W5w0/1yaM/9flzD/ZqIw/27TNP9p2zH/XJon/1dxIf9ZeSD/WHog/1x6 + IP9ffh3/Y4Ee/2aCHP9oghz/aYEb/2uBGP9sghn/boQZ/3KHF/95ihf/fo0V/4OPFP+GkxP/i5YT/5CX + FP+SmRT/kJcT/5OXIf+Mkhr/gYgK/3+GDf+DiA7/hYwO/4WLDf+DiQ3/gYcK/4CFCv99hQr/foQJ/36E + Cf+AhAv/g4kK/4iPDP+QlQ3/mJwN/5ygDf+anQ3/oaQO/5yeDf+MkAz/i48L/4uQDP+LkAz/jI4M/4yP + C/+OkQ3/kpcN/5SZDP+Okgz/iYwL/4uJCv+Qjgr/kpAJ/5KPCv+RjQr/kIoK/46ICf+Lhwn/iIMI/4eC + Cf+Gfwr/gnwJ/357CP+AeQj/gXkI/4F5Cf+CeQr/gnkK/4N4Cf+DeAv/hHgM/4J1C/+CdQv/gXQM/39z + Df9+cgz/f3EL/35vDP9+bgv/fnAM/4ByDf+CdA7/hHYQ/4Z3Ef+HeQ//5uTa2OPg3r/T0MusxsO8nbu0 + ro3r6efaExIR2gAAAJkAAACDAAAAcQAAAGMAAABVAAAARwAAADoAAAAtAAAAFwAAABwAAAAmAAAAMQAA + AD4AAABUAAAAbQAAAMjZ2dfow7+5nMvIw6fa2NS68+zzz3erWfhRlCr/VZUw/1eXMv9anDL/YJ8x/2my + Mv9u4Df/Zc0y/1qJJv9XciH/WXoh/1p7H/9aeR7/Xnoe/2F+Hv9kgR3/aIQa/2qDGv9qghn/bIMX/22C + GP9vhBj/dIgW/3qKFf9+jRX/hJEU/4iVE/+MmBP/kZkU/5GZEv+QlxL/k5cj/4uQGf+Ahgr/gIYO/4SJ + Df+Giw3/hooN/4SIC/+Chwr/gIUK/3+GCv9/hQr/gIUK/4GGCf+Fiwv/i5EM/5GXDf+anQ3/naAO/5ue + Df+ipg3/lpwL/4uRC/+LkAv/i5EL/4yRCv+Mjwv/jJAL/5CUC/+WmQv/lZkL/46RCv+Liwr/josK/5KO + Cv+Tjwr/k44K/5KMCv+Qigr/jogJ/4yGCf+KhAn/h4EI/4R+Cf+DfAn/gHsI/4F5CP+Begj/gnoJ/4J5 + Cv+DeQr/g3gJ/4N3Cv+Ddwz/gnYL/4J1C/+BdAz/gHIM/39xC/9/cAv/fm8L/39vDP9/cAz/gHIN/4J0 + Dv+FdhD/h3kQ/4l7D//n5NvY4+Dev9PRy6vIxL2cubStjuro5tsTEhHaAAAAmQAAAIMAAABxAAAAYwAA + AFUAAABHAAAAOgAAAC0AAAAXAAAAHAAAACYAAAAxAAAAPgAAAFQAAABtAAAAyNnZ1+jDv7mcy8fDp9rY + 1Lr07/TPdKJV+E2IJf9VkC7/V5cw/1+jMv9qwDb/bOk5/2C/MP9Zgif/WHYk/1p6If9Zeh//W3kd/1t4 + HP9dehv/Yn4d/2aBG/9pgxj/bIIY/2uDF/9sghf/boIW/3KDFv91hxT/e4oU/4CNFP+HkRP/ipUS/4+X + E/+RmBH/kZgP/4+WEf+TmSL/iI8V/3+FCP+Bhgz/hIoN/4aKC/+FiQr/g4cJ/4OHCf+BhQj/f4QJ/3+E + Cf+AhQn/g4cJ/4eMCv+Nkwv/lJkM/5ufDP+coA3/nJ8M/6OmDv+TmQv/i5IK/4uRCv+Nkgv/jpEK/4yQ + Cv+OkQr/k5gK/5qaC/+Wlgz/j48K/42MCf+QjQj/k44K/5SQCf+Ujwn/kowJ/4+KCP+Nhwj/jIYJ/4qD + CP+HgQj/hH8I/4N8CP+Cewj/gXoH/4J6B/+DeQj/g3kH/4N5CP+DeAn/gncJ/4N3Cf+BdQr/gHQK/4Bz + C/9/cwv/fnIL/31xCv99bwr/fnAM/39wC/+Bcwz/g3UN/4V3Dv+Ieg//inwO/+bk2tji4N6/1NHMq8fD + vJ23sayQ6ejm2xMSEdoAAACZAAAAgwAAAHEAAABjAAAAVQAAAEcAAAA6AAAALQAAABcAAAAcAAAAJgAA + ADEAAAA+AAAAVAAAAG0AAADI2djX6MS+up3MxsOp2tfUuvTv9M9xnFT4TIQl/1iQLv9gozH/a882/2vo + Of9gsS//WYQm/1l/JP9afSH/W3of/1t6Hv9beRz/W3gb/117Gv9hfhv/Z4EZ/2qDGP9sghf/a4MX/22C + Ff9vghT/coMV/3WGE/98ixT/go0T/4aREv+MlBL/kJYR/5GXEP+Rlw//kJYR/5OYIf+HjhL/gIUJ/4GF + DP+Eig3/howL/4aJCv+Ehwn/g4cJ/4GFCP+AhAn/gIQI/4CFCP+Dhwn/h40J/4+UC/+Ymgv/naAM/5yg + DP+eoA3/oaUN/5KXCf+LkQn/jJEK/42RCv+NkQr/jJEJ/4+UCv+VmQr/mpoL/5WUC/+Qjgr/jowJ/5KO + CP+Ujwn/lJEH/5SPCf+SjQj/kIsI/46ICP+MhQj/ioMI/4eCB/+EgAb/g3wH/4F6CP+Begf/gnoH/4N5 + B/+DeQb/g3kI/4N4Cf+DeAn/g3cJ/4F1Cv+AdAr/fnML/35zC/99cQr/fXAK/31vCv99cAv/fnEL/4F0 + DP+Ddg3/hXgN/4h7D/+KfA3/5uTa2eLg3r/U0MysxsG8nrexrJDp6ObbExIR2gAAAJkAAACDAAAAcQAA + AGMAAABVAAAARwAAADoAAAAtAAAAFwAAABwAAAAmAAAAMQAAAD4AAABUAAAAbQAAAMjZ2NfoxL66nczH + xKna1tO69O/zz3GaVPhNhiT/XaIv/2jWN/9o5Dn/XKUt/1mGJ/9Zhib/WYIi/1t9H/9beh3/XHoc/115 + G/9deBr/XnoZ/2F+Gv9ogRj/bIMW/2uCFv9rghb/boEU/3CBE/9zgxT/d4cT/3qLEv+CjhP/h5AR/4uT + Ef+Olg//kZYQ/5CWDv+PlRH/lJgh/4eMEf9+hQf/gYYL/4aKC/+Gigr/hokK/4SHCf+Dhwn/goYJ/4GF + Cf+Chgj/gYUH/4OJBv+Jjwf/kpUH/5qbCf+foQz/nKAL/6CkCv+hpAr/kJQJ/42QCf+NkAn/jpEK/42R + Cv+Okgn/k5UJ/5qYC/+ZmQr/k5MK/4+NCf+PjAj/ko4I/5SRBv+UkQf/k48I/5GLB/+Qign/jogI/4yF + CP+JgQj/hoEH/4N/Bf+DfAf/gnsI/4F6Bv+Aegf/gnkI/4J3B/+DeAj/gncJ/4N4Cf+Bdgj/gXQK/4Bz + Cf+Acwv/f3IK/31wCP99bwn/fW8J/39wCv9/cgv/gHMK/4N1DP+Gdw3/iHoN/4t+Df/n5drZ4uHev9LP + y6zFv7yft7KskOro5tsTEhHaAAAAmQAAAIMAAABxAAAAYwAAAFUAAABHAAAAOgAAAC0AAAAXAAAAHAAA + ACYAAAAxAAAAPgAAAFQAAABtAAAAyNnY1+jDvrqdzMfEqNrW1Lr17vPPcp1S+FWfJf9k3DX/YNk1/1qZ + LP9ZiSj/W4wn/1qHJP9ZgiD/WXwd/1t5HP9cehv/XXka/114Gv9gexn/ZX4X/2iBFv9rghb/a4IV/2yB + Ff9wgBT/cYET/3OEEv95hxH/fYsR/4ONEP+IjxH/i5IP/4+WD/+Qlg3/j5YK/5CVEP+TliD/hooO/4GD + B/+BhQr/hYkL/4WJCf+FiQj/hIcI/4OGCf+ChQf/goUH/4KFB/+ChQf/hYoI/4uQCP+Ulgf/m50I/5+g + DP+cnwv/pKYK/56hC/+Skwj/kZII/5GRCP+Skgn/kZAK/5GRCf+Wlgv/mpoK/5maCv+Tkgj/j40I/5GM + CP+Ujwj/l5EI/5aRCP+Tjgj/kYwI/5CLB/+OiAf/i4QI/4mCB/+HgAX/hX4G/4J8Bf+CfAb/gXsE/4B6 + Bf+Cegf/gngG/4J4Bv+Cdwf/gncI/4F2CP+AdAn/f3QJ/35zCP99cgn/fHAJ/3tvCP98cAn/fXEJ/39y + Cf+BdAr/hHcN/4Z6DP+Iew3/in0N/+bk2tni4d6/0s/LrcXAvJ+3sqyQ6ejm2xMSEdoAAACZAAAAgwAA + AHEAAABjAAAAVQAAAEcAAAA6AAAALQAAABcAAAAcAAAAJgAAADEAAAA+AAAAVAAAAG0AAADI2djX6MO+ + up7Lx8Sp2tbUu/Ts8896ulX4Wt0r/1rKMf9VjSj/V4op/1mQKP9aiiX/Wocj/1mAH/9Zexz/XHob/114 + G/9ceBr/XHcY/196F/9lfRX/aIAV/2uCFv9tgRX/boEU/29/Ev9xgRL/c4QQ/3qGD/9/ihH/g4wR/4iP + EP+Lkg7/j5YN/4+WC/+QlAj/kZUR/5KWIf+EiA3/gYQH/4KFCf+Fhwr/h4gJ/4aIB/+Fhwj/hIUI/4KF + B/+DhQf/goUH/4KFCP+Iigf/j5AI/5aYCP+cngj/n6EL/52fCv+mpwv/nZwL/5GSB/+RkQf/kpII/5KS + CP+RkAj/k5EJ/5iWC/+bmwn/mJcI/5KQBv+QjQf/ko4G/5WRCP+XkQb/lpAH/5ONCP+Riwj/kIoF/46H + Bv+Mgwj/iYMG/4iABv+Ffgf/hHwF/4F8Bf+CeQb/gnkH/4J4B/+DeQj/gngH/4J3B/+Cdwb/gXYJ/390 + Cf9+cwn/fHEI/3twCP97cAj/e28I/3pvCP99cgr/gHMJ/4N1C/+Edw7/hnoN/4h9DP+Kfw3/5uXb2eLg + 3r/Sz8utxcC8n7exq5Hp6ObbExIR2gAAAJkAAACDAAAAcQAAAGMAAABVAAAARwAAADoAAAAtAAAAFwAA + ABwAAAAmAAAAMQAAAD4AAABUAAAAbQAAAMjZ2dfow767nsvHw6na1tS69Ojy0HzoWvhQuCX/UYIl/1aG + Jf9ZkCf/Wo4m/1uLI/9ahSH/WoAd/1t8G/9beRn/XHgZ/1x4GP9cdxf/XnkW/2R8Ff9ofxT/bIEU/26B + E/9tgBH/boAQ/3CCEP90gw7/e4YP/3+KEP+EjRH/iJAO/4yTDf+OlQv/jpUJ/4+UCP+QkxD/kZUh/4OI + C/+AhAb/gYUI/4SICP+Ghwf/hocG/4WGBv+Dhgb/goQH/4KEBv+BhAb/hIYH/4mMBv+Rkgb/mJoG/52e + B/+enwn/np8J/6WnCv+amgf/kpEI/5KSCP+TkQf/kpII/5KRB/+Vkwj/mZgJ/5qbCv+WlAn/kY4H/5CM + CP+Tjgf/lpAH/5aRBv+Wjwf/lI0I/5KKB/+QiAX/jYYH/4uECP+IggX/hn8F/4V9B/+EfAX/g3wF/4N6 + Bv+DeQX/gngF/4N4CP+Bdgb/gXYG/4F2Bv9/dQf/fXMI/3xyCP98cQn/e3AI/3pvB/96bwf/em8I/31y + Cf9/cgj/gnYK/4R4DP+FeQz/iX0N/4p/Df/m5dvZ4uDfwNLOy67Fv7yft7KskOro5tsTEhHaAAAAmQAA + AIMAAABxAAAAYwAAAFUAAABHAAAAOgAAAC0AAAAXAAAAHAAAACYAAAAxAAAAPgAAAFQAAABtAAAAyNnZ + 1+jCv7ueysfDqdjX07v17fPQcaxQ+Ep2G/9UfyT/Vooj/1qPJf9ajiX/XIsi/1uGIP9bgB3/XXwb/1x5 + Gf9ceBj/XHgW/1x3Fv9geRb/ZHsU/2h+E/9tgRP/bYAS/21/EP9vgA//cYIO/3eED/98hg7/f4kP/4SN + Dv+IkQ3/i5MM/42UCv+PlQr/j5MI/5CTE/+RlR//g4gI/4CEBv+ChQj/hYgH/4eIB/+Ghwb/hIYG/4OG + Bv+ChAb/goQG/4OFB/+Fhwf/i40G/5OTB/+amwb/np8H/5+gCP+iogj/p6cK/5iXCP+Tkgj/k5MI/5SS + CP+Skgj/k5EH/5aUCP+amQj/mpkJ/5WTCP+Rjgf/kI0G/5SPB/+XkQf/l5EG/5eRB/+Ujgb/kosG/5CJ + B/+Nhwf/i4MG/4iBBv+GfwX/hX0F/4R8BP+EfAT/g3sE/4N7A/+DegT/gnkG/4J3Bv+AdQX/gXYG/4B1 + Bv99cwf/e3EH/3twB/97cAf/em8H/3pvB/97cQf/fXMI/4F1CP+Ddwr/hHkL/4Z7C/+Kfg3/in8M/+Xl + 2tng397A0s3KrsXAu5+3sqyQ6ujm2xMSEdoAAACZAAAAgwAAAHEAAABjAAAAVQAAAEcAAAA6AAAALQAA + ABcAAAAcAAAAJgAAADEAAAA+AAAAVAAAAG0AAADI2dnX6MK/up7LyMSp2tfUu/Xw89BvjEv4SnYa/1KC + If9WiSL/Wo8j/1qPI/9ciyH/XIUf/1yBHf9cfBv/XXgY/1t3F/9beBX/XHcU/2F2Ff9lehP/aX0T/2x/ + Ef9tfw//bX4P/29/Dv9wgA3/doMN/3qGDf+AiA3/g4wN/4eQC/+KkQr/jpMJ/4+UCP+Nkgf/kZMU/5GU + Hv+Chwb/foMF/4OEBv+Ghgb/iYgG/4eGBf+EhQX/hIUG/4OEBv+DhAb/g4UG/4eHBf+OjQX/lZUG/5ub + B/+goQX/oJ8G/6WjB/+lpAj/lpQF/5ORBv+Ukwf/lJMH/5SSB/+Ukwb/lpYH/5yaCP+amAf/lJIE/5GN + BP+Sjgb/lpEG/5eSB/+YkQb/l5AF/5ONBP+RiwX/j4gF/4yGBf+LhAX/iIEF/4Z+Bf+FfQT/hHwD/4R8 + A/+DewT/g3sE/4J7A/+CeQT/gXcF/4F2Bv+Bdgb/f3MF/31yB/97cQb/e3EF/3pvBv96bwf/enAH/3xy + Bv9/cwf/gXUJ/4N3Cv+Fegr/h3wM/4l+DP+LgQr/5eXa2eDf3cDSzsquxcG8n7eyrJDp6ObbExIR2gAA + AJkAAACDAAAAcQAAAGMAAABVAAAARwAAADoAAAAtAAAAFwAAABwAAAAmAAAAMQAAAD4AAABUAAAAbQAA + AMja2dfow7+6nsvIxKna19W89fD10G+RS/hJdxj/UoEg/1aIIf9ajyD/XJAg/12LH/9chR//XIEc/1x8 + GP9ceRb/W3YW/112FP9fdBT/YXcU/2R6E/9ofRH/bH8Q/21/EP9tfg//bn4O/3F/Df94gg3/e4UO/3+I + DP+DjAz/h48L/4yRC/+PlAr/j5MH/5CRBv+SlBX/kJId/4GGBf9/ggX/goMF/4SGBP+IhwX/h4YF/4SF + Bf+DhAX/g4QG/4OEBv+DhQT/h4kE/4+NBf+WlQX/m5wG/6CiBv+foAX/paUG/6OiB/+Vkwb/k5IG/5ST + B/+Ukwf/lJIH/5WTBf+Zlwb/nJoH/5mVBv+TkAX/kY4E/5SPBf+XkQb/mJEG/5iRBv+Wjgb/lIwF/5KK + Bf+PiAb/jIUH/4uCBv+IgQX/hn4F/4V9A/+EfAP/hHwD/4N7BP+DewT/gnkF/4J4Bv+AdgT/gXYG/350 + Bf99cwX/fHIH/3txBv96bwf/eW4G/3lvBv96cQX/fHIH/31zB/9/dQn/gncK/4V6Cv+HfAv/iX4N/4uB + C//m5NrZ4t/dwNHOy67FwbyftbCrkeno5tsTEhHaAAAAmQAAAIMAAABxAAAAYwAAAFUAAABHAAAAOgAA + AC0AAAAXAAAAHAAAACYAAAAxAAAAPgAAAFQAAABtAAAAyNrZ1+jFv7yezMjEqdrX1bz18PXQbpBJ+Eh1 + F/9SgB//Vocg/1mPH/9ckCD/XIwe/1yFH/9bgBv/WnsY/1t3Fv9bdhb/XnUU/190Ff9hdhP/ZHkS/2h8 + Ef9rfBD/bX4Q/21+D/9vfQ7/dH8N/3iCDf97hA3/f4gL/4OLC/+Ijgn/ipEK/4yTCP+Pkgf/kY4I/5KU + Gf+Okhz/gYUE/3+BBf+ChAX/hIcE/4iGBf+GhQT/hIUG/4OEBv+DhAb/g4QG/4OFBf+IiQT/j5AF/5eW + B/+enQX/oaIG/6CgBP+npwb/n58F/5SSBv+UkQb/k5EG/5SSB/+Tkgb/lZQF/5uZBv+bmgj/lZIF/5GO + A/+SjgT/lJAF/5eRBv+YkQb/mJEG/5WOBP+Tiwb/kYkF/4+HBf+LhAb/ioEG/4eABf+FfgX/hHwD/4R8 + BP+EfAX/hHwF/4N7A/+CeQX/gXcG/393BP9+dgP/fXQF/3xzBP97cQX/e3EG/3puB/95bgb/eW8G/3px + Bf98cgf/fXMH/351CP+CeAj/hHkK/4Z8C/+Ifw3/jIEL/+bk2tng3t7B0c7LrsXBvZ+3squR6ujm2xMS + EdoAAACZAAAAgwAAAHEAAABjAAAAVQAAAEcAAAA6AAAALQAAABcAAAAcAAAAJgAAADEAAAA+AAAAVAAA + AG0AAADI2tjX6MTAvJ7MyMWp29jWvPXw9dBtkEj4R3QX/1GAHv9Whx7/Wo8g/1yRIP9cjB3/XIYc/1yA + G/9cehj/W3YW/1x0Ff9dcxX/XnQV/2F1Ev9jeRH/Z3wQ/2p7D/9sfBD/bnwN/298Df90fg3/d4EN/3qE + DP9+iAv/hIoK/4iNCv+KkAn/jZIJ/42RCP+Ojwj/k5Qc/46RG/+BgwL/f4AG/4KCBP+EhQT/h4UF/4aF + Bf+ChAb/goMF/4KDBf+DhAX/hIUF/4uKBf+RkAb/mJgG/5+eBv+goQb/oKAF/6inBv+cmwX/k5EG/5OQ + Bf+UkQb/lJEG/5SRBv+WlQb/m5kH/5mYBv+Tkgb/kY4E/5ONBv+Vjwb/mJEG/5iRBv+XjwX/lIwF/5KL + Bv+QiQf/joUG/4qCBf+JgQX/h4AF/4V+A/+EfAP/hHwD/4R7Bf+EfAX/g3sD/4J5BP+BdwX/fncF/311 + BP99cwX/e3EF/3twBf96bwX/d28G/3ZuBf93bwX/eXEF/3xxBv98cgb/f3YH/4B3CP+Eewn/hn0K/4iA + Cv+Mgwn/5uPa2uDf3cDS0MquxMG8oLayrJLq6ObbExIR2gAAAJkAAACDAAAAcQAAAGMAAABVAAAARwAA + ADoAAAAtAAAAFwAAABwAAAAmAAAAMQAAAD4AAABUAAAAbQAAAMja2dfoxcC8ns3Jxanb2Na89vD20G6O + SfhIdBX/UX8d/1WGHf9bjR7/XJAe/12MHf9bhhr/XH8Z/117F/9cdxX/XXMU/15zFP9echP/X3QS/2N3 + Ef9oeg//a3wO/2x9Dv9tew3/bnsN/3J+DP91gAv/eoMM/3+HCv+DiQr/ho0J/4mPCf+MkAr/jI8J/4uO + B/+TlR3/jY8Z/3+BAv9/fwX/goIE/4KEA/+GhAT/hYQG/4KDBf+Cgwb/goIG/4KDBf+Hhgb/jYsF/5OR + Bf+ZmAX/n58G/5+fBv+hoQb/p6UG/5mXBP+SkAX/lJEG/5SRBv+TkAb/lJEF/5iVBv+bmAb/mJYF/5KQ + Bf+QjAb/k4sH/5eQBf+YkQb/mJAG/5WOBv+TjAb/kYoH/4+HBv+NhAf/ioIG/4mBBf+GfwT/hHwD/4R8 + A/+EfAP/g3sE/4N7BP+DegT/gXgF/4B2BP9+dQT/fHMF/3tyBP97cQb/em8F/3duBP90bgX/dG4F/3Ru + Bf93cAX/enIH/31zB/9/dgf/gHgI/4N7Cf+FfAn/iYAI/4uDCf/l49ra4N/ewdHPy67EwLugtrKrkuro + 5tsTEhHaAAAAmQAAAIMAAABxAAAAYwAAAFUAAABHAAAAOgAAAC0AAAAXAAAAHAAAACYAAAAxAAAAPgAA + AFQAAABtAAAAyNrZ1+jFwLyfzcnFqdvY1rz28PbQcI1I+Eh0FP9Rfhz/VYUe/1qNHf9djx7/XYwc/1yH + Gf9dgBn/XHsW/1t3FP9ccxT/XnMU/15yE/9edBH/YncQ/2d5D/9qfA3/a3wN/2x8Df9tfA3/c30L/3WA + DP96ggv/f4YK/4SJCv+HjQn/iI8J/4qPCP+Ljwn/io4I/5KWIP+Ljhb/f4EC/35/BP+BggT/g4QD/4OE + BP+DhAT/goMF/4KDBv+Cggb/goMF/4eGBv+NiwX/lJIF/5uYBv+fnwb/n54G/6SiB/+lpQf/lZMF/5KQ + Bf+TkAX/lJEG/5OQBf+UkQX/mZQF/5qXBv+WkwX/ko0G/5CLB/+TjAf/l5AF/5iRBv+XjwX/lY0F/5OL + Bv+RigX/j4YG/4yDBv+JgQX/iIAF/4V9BP+EfAP/hHwD/4N7A/+DewT/g3sE/4N5Bv+Bdwb/gHYE/390 + BP98cwT/enEE/3pwBf93bgT/dG4F/3RuBf90bgX/dG4F/3VvBP93cQb/fHMH/392B/+BeAj/gXoI/4R9 + Cf+JgQj/i4QJ/+Xk2trg397B0c/LrsTAu6C2sqyS6ejm2xMSEdoAAACZAAAAgwAAAHEAAABjAAAAVQAA + AEcAAAA6AAAALQAAABcAAAAcAAAAJgAAADEAAAA+AAAAVAAAAG0AAADI2tnX6MXAvJ/NyMWq29jWvPbx + 9tBvjUf4R3IV/1F9Hf9VhR7/Wo0d/12QHf9djRv/XIgZ/12BFv9cexb/W3YU/1xzE/9echP/XnET/2Bz + EP9kdhD/aHkP/2t7DP9rewz/bHwM/2x8DP9xfQv/dn4L/3mDCP9/hQn/g4kJ/4eMCf+IjQr/io8I/4uP + CP+LjQj/k5Yi/4uMFP9/gAD/fn8E/4GCA/+DhAP/g4QE/4OEBP+Cggb/goIG/4KCBv+CgwX/h4YG/46M + Bf+Ukwb/nJoF/5+fBv+fngb/o6QF/6GiBv+TkQX/k5AG/5OQBf+UkQb/k5AG/5WSBv+ZlQb/mZYF/5SR + Bf+RjQb/kosG/5ONBf+XkAX/mJEG/5aPBv+UjAj/kokH/5CHBv+OhQb/jIMG/4mBBf+IgAX/hX0E/4R8 + A/+EfAT/g3sE/4N7BP+DewT/gnkF/4B2Bv9/dAX/fXQF/3xyBv93cQT/dnAE/3RuBP90bgX/dG4F/3Ru + Bf90bgX/dXAE/3dyBf95dAf/fnYH/4F4CP+Bewn/hH0L/4mCCv+Kgwj/5eTa2uDg3sHRz8uuw8C7obWy + rJPq6ObbExIR2gAAAJkAAACDAAAAcQAAAGMAAABVAAAARwAAADoAAAAtAAAAFwAAABwAAAAmAAAAMQAA + AD4AAABUAAAAbQAAAMjZ2NfpxcC8n83Jxarc2ta89vH20G+MR/hIcRT/UHwc/1SEG/9ZjBz/W5Ac/12M + G/9dhxj/XYAW/1x7Fv9bdhT/W3MT/11xEv9dcRH/X3IQ/2R1D/9peQ3/a3oN/2p6C/9rewz/bHoL/298 + Cv91fwr/eoII/36FCf+CiQn/howJ/4iOCP+Ljgn/io0I/4qNCP+UliT/iYsS/32AAP99fgP/gYEE/4KD + A/+CgwT/goME/4GBBf+BgQX/gYEF/4KCBv+HhwX/jo0F/5WTBf+cmwX/oJ8G/6CdBf+mpgX/n54F/5OP + Bf+TkAb/lJAF/5SQBf+Tjwb/lpMF/5mVBv+ZlQb/lI8E/5GLBf+SigX/lI0F/5eQBv+XkAX/lo0G/5OL + B/+RiQX/j4YE/42EBf+LggX/iIAF/4Z+BP+EfAP/hHwD/4N7BP+DewT/g3sE/4N7BP+CeAX/gXYG/390 + BP98cwX/e3EF/3dwBP90bgP/dG4E/3NtBP9zbQT/c20E/3VvBf93cQX/d3IF/3l0B/97dQf/f3gH/4J6 + CP+Ffgj/ioMJ/4mAB//l5Nra4N/dwdHNyq/DwLuhtbKsk+ro5tsTEhHaAAAAmQAAAIMAAABxAAAAYwAA + AFUAAABHAAAAOgAAAC0AAAAXAAAAHAAAACYAAAAxAAAAPgAAAFQAAABtAAAAyNnY1+nGwbyfzsvGqdza + 1rz28fXQb4tG+ElyEv9SfBr/VYQb/1qMG/9dkBv/Xowb/12HGP9dgBf/XHsW/1p2E/9bchL/XHES/11x + Ef9fchD/ZHUP/2d4Df9qeQ3/anoM/2t7DP9teQz/cXsJ/3V/Cv95ggn/foUI/4GICf+GjAn/iY0I/4qO + Cf+KjQf/io0J/5SWJ/+IiQ//fYAA/31+A/+BgQT/goMD/4KDBP+BggT/gYEF/4GBBf+BgQX/gYIG/4mI + Bf+RjQX/lpQH/52bBv+hngb/oJ0F/6imBv+cmAX/k48E/5OQBv+VkAb/lY8F/5aPBf+ZkwX/mpUG/5eT + BP+TjQX/kYsE/5KKBf+VjQX/mJAG/5ePBf+WjQb/lIsG/5GIBf+PhgX/jIMF/4qCBf+IfwX/hn0E/4R8 + Av+EfAP/g3sE/4N7BP+DewT/gnoF/4F4Bf+AdQX/f3QE/3xzA/97cQX/d3AE/3NtA/9zbQT/c20E/3Fr + BP9ybQT/dG8F/3dwBf93cgX/eXQG/3p2B/98eAf/gXoJ/4aBB/+Iggf/hXsH/+Xj2trg3t3C0c3Kr8PA + u6G1sqyT6efm3BMSEdoAAACZAAAAgwAAAHEAAABjAAAAVQAAAEcAAAA6AAAALQAAABcAAAAcAAAAJgAA + ADEAAAA+AAAAVAAAAG0AAADI2djX6cfDvp7Py8aq3drWvPfy99BwikX4SXER/1N8Gf9Wgxn/Wowa/2CP + Gf9fjBn/XYYZ/1yAF/9cexb/WnYT/1pyEv9dcBL/XG8Q/2BxEP9kdA7/ZncM/2l4DP9peQz/ankL/2t5 + Cv9xfAr/dX4J/3iBCP99hQj/gYgI/4WKCP+JjAj/i44I/4qMBv+KjQr/lJUp/4aGDf99fgD/fH4E/3+A + BP+BggT/gYIE/4CCBP+AgQT/gIAE/4GBBf+Dgwb/i4kE/5KPBf+Ylgf/nZwF/6GeB/+gnwX/qKQH/5mU + Bf+Tjgb/kpAG/5SOBf+Vjwb/lZAF/5iSBf+alAX/lZAE/5KKBv+RiQb/k4wG/5eOBf+XjgX/lo4G/5WM + Bf+TiQb/kYYE/4+EBv+Lgwb/iYEF/4d+Bf+EfAT/g3wD/4R7BP+DewX/g3sE/4N7A/+CeAb/gHYF/350 + BP99cwX/fHID/3pwBP93bwP/cm4D/3JsBf9ybQX/cGsD/3FtBP9zbgX/d3EE/3dzBf95dQX/enYG/3t3 + B/+Aewj/hoEH/4aBCP+Aegb/5OLZ2uDe3cLRzcqvw8C7obWyrJTp5+bcExIR2gAAAJkAAACDAAAAcQAA + AGMAAABVAAAARwAAADoAAAAtAAAAFwAAABwAAAAmAAAAMQAAAD4AAABUAAAAbQAAAMjZ2Nfpx8O+oM/K + xqvd2da89/L30G+KRfhJbxH/U3oZ/1WCGf9aixn/X48Y/16LGP9dhxj/XH8W/1x7E/9bdRL/XHER/11v + EP9dbg//YHAP/2NzDf9mdgz/aHgM/2l4DP9pdwv/a3gJ/3B7Cf91fQj/eIAI/32EB/+Bhwj/hIkJ/4iL + CP+LjAf/iIwH/4uMDP+VlSr/hIUK/3x9Av97fAT/f4EE/4GCBP+BggT/gIAD/39/BP+AgAP/gIAE/4WD + BP+MiAX/k5AG/5iYBf+enQX/n5wH/6KgBv+mogb/l5EE/5SNBv+Ujgb/lI0G/5ONBv+VkAX/l5MF/5iT + Bv+UjwX/kYkF/5GJBv+UjAb/lo4G/5iOBv+XjAb/lIoG/5GHBv+PhQX/jYUF/4qCBv+IgAT/hn4D/4R7 + Av+DegT/g3oD/4N6A/+CegP/gXkD/4F4BP+AdQT/fXQF/3xzBf96cAT/eXAE/3VuA/9ybQP/cGwD/3Bs + A/9wbAP/cW0E/3NvBP91cQX/dnIE/3h0Bv96dgb/fHkH/4F9Bv+GgAb/gn4H/3x4Bv/k4tna4N/ewtHP + y6/EwbyhtbKslOnn5twTEhHaAAAAmQAAAIMAAABxAAAAYwAAAFUAAABHAAAAOgAAAC0AAAAXAAAAHAAA + ACYAAAAxAAAAPgAAAFQAAABtAAAAyNnY1+nHw72gz8rHq93a17z38vbQbotF+EhuD/9Rehj/VoEY/1uJ + GP9ejhf/XowW/1yHF/9cgBb/XXoU/110Ev9ccBH/XXAP/11vDv9fbw7/YnIN/2V1Df9odwv/aXcL/2t3 + C/9vdwn/cnoJ/3R9B/94fwj/fIQH/4CGB/+FiQj/iIoJ/4mLB/+HiwX/i4sP/5SVKv+ChAf/fHwB/3t7 + A/9/gAT/gIAE/4CABP+AgAT/f38D/39/A/+BgQX/hoMF/4yJBf+SkAb/mZgG/6CdBf+fmwX/paEH/6Ke + Bv+TjgT/k40F/5OMB/+UjQj/k4wH/5aQBf+ZkgX/lpEG/5KMBP+QiAX/kYgF/5SMBv+VjAf/mIwI/5WK + Bv+SiAX/kIYG/46EBf+Nggb/ioEG/4h/Bf+GfQT/g3sC/4R6A/+DeQP/hHoD/4J4BP+BdwX/gHYE/4B1 + BP99cwT/fHIE/3pwBP91bwT/dG4E/3JtBP9wawP/b2oD/3BsA/9xbQT/cm8E/3NxBP91cgX/dnMG/3l1 + Bv98eQf/gn0I/4R/B/99egj/eXQG/+Ti2drg4N7C0c/Lr8PAu6K1sqyU6efm3BMSEdoAAACZAAAAgwAA + AHEAAABjAAAAVQAAAEcAAAA6AAAALQAAABcAAAAcAAAAJgAAADEAAAA+AAAAVAAAAG0AAADI2dnX6cfD + vaDPyser3drYvPfy99FuiUT5SG4P/1J5GP9WgBf/WogY/16OF/9fixb/XYcX/1yAFv9eeRP/XXUR/1xx + D/9cbw7/XG8N/19vDf9icgz/ZXUL/2h2DP9odgv/anYK/293Cf9xeQj/dHwH/3iABv98gwb/f4YH/4SJ + CP+Hign/iIoI/4iJBf+LjBH/lJQp/4CDBP97fAL/e3sF/35+BP+AgAT/gIAE/4B/BP9/fgT/f38E/4CA + BP+Ggwb/jYoF/5SRBf+blwb/oJwH/5+bBv+logb/n5sF/5KMBf+RjAf/kowH/5OMB/+TjQf/lpAF/5iR + BP+Vjwb/kYoF/5CHBv+Qhwb/lIoG/5eLB/+Xiwf/lIkF/5GHBf+PhQX/jYMF/4uBBP+KgQX/iH8E/4V7 + Bf+EegT/g3kD/4J4BP+DeAX/gncF/4F3Bf+AdQX/f3QE/31zBP97cgP/eW8D/3htBf90bQT/cWwD/29q + A/9vagP/cGwD/3FtBP9ybwT/c3AD/3RxBP92cwb/eXQG/3x7Bv+Afgb/gH0H/3t3CP94cgf/5OPa2uDg + 3sLRz8uvw8C7orWyrJTp5+bcExIR2gAAAJkAAACDAAAAcQAAAGMAAABVAAAARwAAADoAAAAtAAAAFwAA + ABwAAAAmAAAAMQAAAD4AAABUAAAAbQAAAMjZ2dfpx8O9oM/MyKvd29i89/L30W6IRPlHbQ7/UngW/1Z/ + F/9aiBf/XY4Y/16KFv9chhb/XoEW/115E/9ddBD/W3AO/1tuDf9cbgz/X3AN/2JyDP9ldAv/Z3UL/2h2 + C/9qdgr/a3YJ/3F5Cf90fAf/eIAG/3yDB/9/hQb/hIkI/4iKCP+Iigj/h4gF/4yNFf+UlCj/gIME/3t8 + A/97fAT/fX8E/4CAA/+AgAT/fn4D/359BP9/fgT/gIAE/4eDBP+Oiwb/lJIF/5uYBf+gnAb/n5sG/6ak + Bf+blgb/kYwG/5GLB/+TjAf/kosG/5KLBv+WkAX/l5EE/5ONBv+PiAb/kIcG/5CHB/+UiQb/losH/5aK + Bv+ThwX/kYUG/4+DBf+MgwX/i4EE/4uBBf+JgAP/hHoE/4R6BP+DeQX/gngF/4J3Bv+CdwX/gXcF/4B0 + Bf9/cwT/fHME/3pxA/94bgT/dm0E/3JsBP9xawP/b2oD/29qA/9vawL/cW0D/3JvBP9zcAP/c3EE/3Zz + Bf94dQb/fXwF/39+B/97eAj/d3QH/3VxBv/k4tra4N/dwtDOyrDFwLuiuLKslOnn5twTEhHaAAAAmQAA + AIMAAABxAAAAYwAAAFUAAABHAAAAOgAAAC0AAAAXAAAAHAAAACYAAAAxAAAAPgAAAFQAAABtAAAAyNnZ + 1+nIxL+g0M3Jq93b2L338/fRbYdD+UdsDf9ReBb/VX0W/1uIF/9djBb/XooW/12HFf9egBT/XXoR/1x0 + D/9bbg7/W24N/1ttDP9ebg3/YXEL/2RzCv9mdAv/aHUK/2h0Cf9rdgn/cHgI/3R7B/93gAf/eoIH/3+E + B/+FiQj/iIoH/4iKCP+FhwT/jo4Y/5KSKP+AgQL/ensD/3l7BP99fgT/gH8D/39/BP9/fgT/fn0D/39+ + BP+BgAT/iIMD/4+LBf+Vkwb/nJkF/5+bBv+fmwb/p6QG/5aSBP+Riwb/kooG/5KLBv+RigX/k4wF/5aQ + Bf+VjwT/kYoE/46FBv+OhQb/kIcH/5SKB/+WigX/lYkF/5KGBv+QhAX/jIIF/4uBBf+LgQX/i4AE/4h+ + A/+DegP/g3kE/4N4Bv+Cdwb/gXcF/4F2Bf+AdQX/f3QE/31zA/97cQT/enAE/3huA/90bgT/cmsD/3Fr + BP9vagP/b2oD/29rAv9xbgP/cm8D/3JvA/90cQT/dnQE/3h3Bf9+fQX/fXsG/3h1B/92cgj/c24G/+Ti + 2trf393C0M7KsMXAu6K3sqyU6efm3BMSEdoAAACZAAAAgwAAAHEAAABjAAAAVQAAAEcAAAA6AAAALQAA + ABcAAAAcAAAAJgAAADEAAAA+AAAAVAAAAG0AAADI2dnY6cnFv6DRzcmr3dvYvffz99Fth0L5RmwL/1B2 + FP9WfhX/XIcX/1+LFv9eihX/XYcT/16AEv9cfA//XHMO/1tuDv9abQ3/WmwL/1xuDP9hcAz/ZHIK/2V0 + Cv9odQv/Z3MJ/2x1B/9veAf/c3wH/3Z/CP96ggb/gIUI/4OICP+HiQj/hogH/4SFAv+PkBz/kJIm/35/ + AP94eQX/enoG/319Bf9+fQT/fn4E/319A/99fAP/fn0F/4CABP+JhQX/kIwE/5WUBf+dmgb/n5sG/6Cd + B/+loAb/lI4E/5CKBv+RiQf/kYkH/5GKBf+SjQP/lJAE/5ONBv+QiAX/joUG/4+GBv+Rhwf/k4oG/5aK + Bv+ThwX/kIYF/46EBf+Lggb/in8G/4uBBf+LgQT/hnwE/4N4A/+Bdwb/gncF/4F4Bf+AdgX/gXYF/390 + BP9/cwT/fHME/3lxA/94bwX/d24E/3JsBP9ybAT/cWoD/29rA/9vagP/cGwD/3FsBP9wbQT/c28D/3Ry + A/92dAT/enkF/318Bv96eAb/dXIG/3RwB/9xbAX/4+LZ2uDf3cLRzsqwxcC7oreyrJTp5+bcExIR2gAA + AJkAAACDAAAAcQAAAGMAAABVAAAARwAAADoAAAAtAAAAFwAAABwAAAAmAAAAMQAAAD4AAABUAAAAbQAA + AMjb2tnoy8bAoNHOyKve29i9+PP40W6GQvlFagv/T3YU/1V9Ff9ahhX/XosV/16KFP9ehRH/XIAS/1t7 + D/9acw//Wm0M/1trDf9bawz/XG0M/19vDP9kcQr/ZXMK/2VyCP9ncwj/aXUH/3B4B/9zewf/dnwI/3yB + B/+AhAf/g4cG/4aIB/+Fhgb/hIQD/4+QIf+OkCP/fX4A/3d4Bf95egX/fX0E/359A/98fQL/fH0D/318 + BP9/fQX/g4AE/4iGBP+QjAT/lpQG/5yaBf+dmQb/o54H/6KcBf+Riwb/kIoF/5GJBv+QiAb/kYkF/5KM + BP+TjgT/kowG/42GBf+NhAX/j4UG/5KHB/+TiAX/lYgF/5KHBv+PhAX/jYIE/4qABf+KgAT/i4EF/4qA + BP+FeQP/gncF/4F3Bf+BdwX/gXcF/4B2BP9/dAT/f3QE/31zBP97cQP/em8E/3hvBP90bQT/cmsE/3Br + BP9vawT/b2oD/3BrA/9wbAP/cW0E/3BtA/9ybwP/c3EE/3Z0Bf96eQb/e3sH/3d0Bv9zcQX/cm0G/29p + Bf/j4tna4N/dwtHOyrDFwLuit7KtlOnn5t0TEhHaAAAAmQAAAIMAAABxAAAAYwAAAFUAAABHAAAAOgAA + AC0AAAAXAAAAHAAAACYAAAAxAAAAPgAAAFQAAABtAAAAyNva2ejLxsGh0M7JrN7b2b348/jRbIVB+UZp + Cv9QdRT/VHwU/1qEFf9eihT/XokT/1yGEP9dgBH/XHgQ/1tzD/9abQ3/WWsN/1lqDP9bbQv/YG0L/2Ny + Cf9kcwn/ZXII/2dzCP9rdAb/b3cF/3J5B/91fAj/fIEF/4CEBv+ChQX/hIYE/4WGBv+EhAL/kZIl/4yO + If99fQD/d3gE/3h6BP98fAT/fXwE/3x8BP97fAT/e3wE/399Bf+EgAT/ioYE/5COA/+YlQX/nZkF/5yY + BP+loAb/nZcG/5CKBf+PiAX/kYkF/5CIBf+RiAX/kYoG/5KMBv+QiAX/jYQG/4yDBP+PhQb/kYYG/5KI + Bf+Thgb/kIQF/46CBv+MgQX/iX8E/4l/A/+LgQX/iH8E/4J4Bf+CdwX/gXcF/4F3Bf+AdQX/f3QE/390 + BP9+cwT/fHMD/3lwA/95bwT/d24D/3JsA/9yawT/cGoD/29qA/9vagP/cGsE/3BsA/9vbAP/cG0D/3Fv + Av9zcgT/dnUF/3l5Bv94dgX/c3EF/3JvBv9wbAX/bmcG/+Pi2drg393C0c7KsMTAvKK2sq2V6efm3RMS + EdoAAACZAAAAgwAAAHEAAABjAAAAVQAAAEcAAAA6AAAALQAAABcAAAAcAAAAJgAAADEAAAA+AAAAVAAA + AG0AAADI29rZ6MvHwqHRzsqs39zZvfj0+NFthED5RmgL/1B0E/9UexL/WYMU/12JE/9diBL/XIUQ/11/ + EP9ceBD/W3IP/1psDv9Yagz/WWoL/1xrCv9gbgv/Y3EJ/2RyCf9lcgj/Z3II/2t0Bf9vdwb/cnkH/3R8 + B/97gAX/f4MG/4GEBP+DhQT/hIUF/4KDAv+Rkyf/iosd/3x8AP92dgX/eHkE/3t8BP98fAT/e3wE/3p7 + A/97fAT/fnwE/4WAA/+KhgT/kY4E/5iVBP+bmQX/m5gF/6SgBf+YlAX/jokF/46HBv+PhwX/j4cG/5CI + Bf+Rigb/kosG/46GBf+Mgwb/jIIF/4+EBv+RhQb/k4cG/5GGBf+PhAX/jYEF/4qABP+JfgP/iYAD/4uB + BP+GfAT/gXcF/4F3Bf+BdwX/gHYE/4B2Bf9/dAT/f3QE/31zBP97cQP/enAD/3duBf90bQT/cmsE/3Jr + BP9wagP/b2oD/29qA/9vagP/b2wD/29sA/9wbQP/cW8C/3NxA/93dQX/eHkF/3VzBP9ybwX/cW0H/29p + Bv9sZQX/4+LZ2uHf3MLRzsqwxMC8o7ayrZXp5+bdExIR2gAAAJkAAACDAAAAcQAAAGMAAABVAAAARwAA + ADoAAAAtAAAAFwAAABwAAAAmAAAAMQAAAD4AAABUAAAAbQAAAMjb2tnoy8fCodPPyqzf3Nm9+PT40W6E + QflFZgv/UHIT/1R5Ev9YghP/W4gS/1yIEv9cgw//XH4O/1x4Dv9bcw7/Wm0N/1hqDP9Zagv/XGoK/15u + Cv9icQj/ZHIJ/2RxCP9ncgf/a3MG/252Bf9xeAf/c3wG/3t/Bf9/gwb/gYQE/4OEBP+DhAT/goMD/5KT + LP+IiBr/enoA/3R1BP94eAT/ensE/3t8BP96ewT/eXoE/3p7Bf99fAT/hYED/4uIBP+SjgT/mZUE/5uY + Bv+bmAb/o6AE/5OOA/+NiAX/jYYG/4+GBv+Phgb/kIgF/5GKBv+RiQX/jYUE/4yCBv+Ngwf/j4QG/5GE + Bv+Thgb/kYUF/46DBP+MgAT/iX4D/4l+BP+KgQT/ioED/4R6BP+BdgX/gXYF/4B2BP+AdgT/f3UE/390 + BP9+cwP/fHME/3txBf96cAT/dm8E/3JtBP9yawT/cGoD/3BqA/9vagP/b2oD/29rA/9vbAP/b2wD/29t + A/9xbwP/dHEC/3h2BP93dgX/cnAF/3BuBf9vawb/bWYH/2pkBP/j4tna4d/dw9HNyrDEwLyjtrKtlenn + 5t0TEhHaAAAAmQAAAIMAAABxAAAAYwAAAFUAAABHAAAAOgAAAC0AAAAXAAAAHAAAACYAAAAxAAAAPgAA + AFQAAABtAAAAyNrZ2enLx8Oh08/MrN/d2r349fjRbYNB+UVmCf9OcRL/U3cT/1Z/Ev9ahxH/XIcR/12C + D/9bfg3/XHgN/1tyDf9ZbQv/WGkM/1ppC/9cagr/X20I/2JxCP9icQf/ZHEI/2ZyBv9rcwX/bnUG/3F3 + B/92ewX/fH8G/36ABf+AgwX/goMD/4OEBP+CggX/k5Mw/4aHF/95eQD/dHQE/3d3Bf95egX/ensE/3p6 + Bf95eQX/eXoG/3x8BP+EgQP/jIkD/5OPBf+alQX/nJcG/56ZBv+gnQX/j4sE/4yHBP+Lhgb/jocF/4+F + Bf+QiAT/kYkF/4+HBf+KgwX/iYIF/4yDBv+Pgwb/kIUG/5GGBv+PgwT/jYEE/4t/BP+IfQP/iH0D/4yB + Bf+IfwX/gXgD/4B2Bf+AdQX/gHUF/4B1Bf9/dAT/f3QF/31zBP97cgP/enAE/3luBP92bQP/c20E/3Jr + BP9vagP/b2oD/29qA/9vawL/cGwD/3BsA/9vbAP/cG4D/3FvA/9zcgL/d3cE/3RzBf9vbQX/bWwD/21o + Bf9rZQf/aGEE/+Lh2dvh393D0c3KsMTAvKO2sq2V6ejm3RMSEdoAAACZAAAAgwAAAHEAAABjAAAAVQAA + AEcAAAA6AAAALQAAABcAAAAcAAAAJgAAADEAAAA+AAAAVAAAAG0AAADI2trZ6cvIxKLTz8yt4N3avfj1 + +NFsgkD5RWQJ/05vEf9RdRH/Vn0Q/1qEEf9chRD/XIEQ/1x9D/9cdg7/XHEO/1lsDP9YaAr/WmkK/1xq + Cf9fbQj/YXAH/2JwB/9icAb/ZXAG/2pxB/9tdQb/cHkG/3Z8Bf96fwT/fYAD/3+CBP+CggT/gYID/4CC + Bf+TlDH/g4UT/3Z5AP9zdAT/eHYE/3l5Bf95eQX/eHgE/3l5Bf95eQX/fXsD/4WCBP+MiQP/k48E/5uW + Bv+alQX/oJsG/56aBP+NiQP/i4UF/4yEBv+MhQb/jYUE/4+HA/+PhwT/jYQE/4iBBf+IgAT/ioID/46D + BP+QhQT/j4UE/42BA/+LfwT/iX4E/4d8A/+KfwT/jIEF/4Z8Bf9/dQP/f3QE/4B1Bf9/dAT/f3QE/35z + BP99cgP/e3ED/3pwBP96cAT/eG0E/3RsBP9ybAP/cWoD/29qA/9vagP/b2oD/25rA/9vbAP/b2sC/29s + A/9wbQP/cXAC/3R0A/91dQP/b24D/2xrBP9raQT/a2UE/2ljBf9mYQX/4uDZ2+Hf3cPRzcqwxL+8o7ay + rZXp6ObdExIR2gAAAJkAAACDAAAAcQAAAGMAAABVAAAARwAAADoAAAAtAAAAFwAAABwAAAAmAAAAMQAA + AD4AAABUAAAAbQAAAMja2tnpzMjEodTQzKzg3dq9+PX40WuBP/lEYwj/T24R/1FzEP9VfQ//WoMP/1yE + D/9agRD/W3wO/1t1D/9ccQ3/WmwK/1hoCv9ZaAn/XGoJ/19sCf9hbQn/Ym8H/2JwBv9lcAb/anEH/21y + B/9xeAj/dXsH/3p8BP99gQT/foEE/3+BBP9+gQL/gYIH/5SUMv+Bgw7/dXgB/3JzBP93dQX/eHgF/3h5 + BP94eAT/eHgE/3h4BP9+fAT/hoIF/42JA/+UkAT/mZUH/5eTBf+hnQT/mpUF/4yIBP+LhAX/i4QF/4qE + BP+LhQX/j4cD/46HBP+KggX/h38D/4d/BP+KggP/jYIE/46CBP+NggT/ioAE/4l/A/+HfQT/hnwE/4t/ + BP+KgAT/g3kD/350BP9/dAT/f3QE/390BP9+cwP/fnME/31yBP96cAT/enAE/3lvA/91bgP/c2wF/3Jr + BP9xagP/b2oD/29qA/9vaQP/b2oD/29sAv9uawL/b2wD/3BtBP9ycQP/dXQD/3JyAv9sawP/a2oD/2lm + BP9oZAX/ZmIE/2RgA//i4Nnb4d/dw9HNyrDEv7yjtrKtleno5t0TEhHaAAAAmQAAAIMAAABxAAAAYwAA + AFUAAABHAAAAOgAAAC0AAAAXAAAAHAAAACYAAAAxAAAAPgAAAFQAAABtAAAAyNra2enMyMSh1NDMrODe + 27359fnRbIE/+URjB/9NbBD/UXIQ/1Z6D/9ZgRD/W4MP/1uAD/9cewz/XXYL/1xxDP9abAr/WGgJ/1lo + Cv9baQj/XmsJ/2BtB/9hbwb/Ym8G/2VvBf9qcQb/bHQF/3B2Bv90eQb/eX0E/3x/BP99gAT/foED/31/ + Av+Bgwr/lJQ0/3+BDf91dwP/cnEE/3Z1BP93dwX/eHcF/3d3BP93dwT/eHgF/358A/+GgwT/jYkE/5SQ + Bf+YlQX/l5QF/6GeBf+UkAT/i4UE/4uEBf+LgwX/ioIF/4qEBP+MhgT/jIUE/4iABP+GfwP/h4AE/4qB + BP+NggT/joIE/42BBf+KgAX/iH4E/4Z8A/+GfQP/ioAE/4d9Bf+AdgT/f3QE/390BP9/dAT/f3QF/35z + A/99cgT/fHEF/3pwBP96cAX/dW4E/3RtBP9zbAT/cGoD/3BqA/9vagP/bmoC/29rA/9vawP/bmsD/25r + Av9vbAP/cG4E/3NyA/90cwP/b24D/2tqA/9raQP/aWUE/2diBf9lYAX/ZF4D/+Lg2dvi393D0c7KsMS/ + vKO2sq2V6ejm3RMSEdoAAACZAAAAgwAAAHEAAABjAAAAVQAAAEcAAAA6AAAALQAAABcAAAAcAAAAJgAA + ADEAAAA+AAAAVAAAAG0AAADI2trZ6c7JxaHV0cys4d7bvvn2+dFsgT/4RGEG/01sD/9RcQ//VXkO/1iA + EP9bgg//XH8O/1x6Df9ddgr/W3EL/1psCv9YaAn/WWgK/1ppB/9dagj/X2wG/2FvBf9ibwb/ZG8F/2lw + Bv9scwX/cHYG/3R5Bv94fAT/e34D/3yABP9+gQP/fH4B/4KDDP+TlDP/fX8K/3R1A/9xcQT/dHUE/3d3 + Bf93dwX/d3YE/3d2BP94dwX/fnwE/4aDA/+OigT/lZAG/5eTBP+YlAX/n50E/5GMBP+KgwX/ioMF/4qD + Bv+JgQb/ioIE/4qEBP+KggP/h34D/4Z9A/+HfwX/ioAE/42CBf+OggT/i4AF/4l+BP+HfAT/hHsD/4Z9 + A/+KgAT/hXwF/311BP9/dAT/f3QE/390BP9/dAX/fXID/3xwBP97cAX/enAD/3lvA/90bQT/cmwE/3Js + BP9xaQP/bmoD/29qA/9uagP/bmsC/29rA/9uawP/bmsC/29sA/9xbgP/c3MC/3NyA/9sbAL/a2gC/2lm + A/9nYwT/ZGEF/2NfBP9iXAL/4uHZ2+Lf3cPRzcqxxL+8o7ayrZXp6ObdExIR2gAAAJkAAACDAAAAcQAA + AGMAAABVAAAARwAAADoAAAAtAAAAFwAAABwAAAAmAAAAMQAAAD4AAABUAAAAbQAAAMja2tnpzsnGodXR + zKzh3tu++fb60WyAPvhEYAX/TWsN/09wD/9VeA//WX4O/1yADv9cfg7/WnoM/1x2Cv9bcAn/WWsJ/1dn + Cv9YZwj/WmgG/11pCP9ebAj/YG4F/2FuBf9jbgb/aHAF/21zBv9udgb/dHgE/3h7Bf97fgP/fIAD/32A + A/97fQD/g4UQ/5GRMv97fQb/dHQE/3BxBf9zcwT/dnYE/3Z1BP92dQP/dnUE/3l3Bf9/fAT/h4QE/46K + BP+VkAb/lpIE/5qWBf+emwT/jogD/4mDBf+IggX/iIEF/4mABP+KgwT/ioME/4eAA/+FfAL/hnwE/4h+ + BP+KgAT/i4EF/4uABP+JfgT/h30D/4V7BP+EegX/iH8D/4qABP+DeQP/e3MD/31zBP9+cwT/fnMD/35z + A/99cQX/e3AF/3pwBP94bwP/d24D/3NtBP9ybAT/cmoE/3BpAv9uaQL/bmkC/25qAv9tagL/bmsD/25r + A/9uawL/b2wD/3FuA/90cwP/cG8C/2tpAv9oaAH/Z2QC/2ViBP9iYAP/YV4E/19aAv/i4dnb4d7dw9HN + yrHEv7yjt7Ktluno590TEhHaAAAAmQAAAIMAAABxAAAAYwAAAFUAAABHAAAAOgAAAC0AAAAXAAAAHAAA + ACYAAAAxAAAAPgAAAFQAAABtAAAAyNva2enQy8ai1tPOreHe27759frRa389+ENgBf9Nag3/UG8N/1N3 + D/9YfA//W38N/1t9Df9Zegz/XHYK/1twCf9Zagn/V2cJ/1ZlB/9aZgf/W2kG/11rBv9gbQX/YG0E/2Nt + Bf9obwX/bHIG/291Bv90eAT/eHkG/3p8BP98gAL/fH4C/3l7AP+EhhX/kJAx/3t8A/9xcwP/cHAF/3N0 + BP92dAX/dXQE/3V0BP91dAT/eHcF/399BP+GhAT/j4oF/5WRBP+VkAX/nJgF/5qXA/+MhQX/iYIF/4iB + Bf+GgAb/iIAF/4iBBP+HgAX/hX0E/4R8A/+GfAP/iH4E/4qABP+KgAT/iYAE/4l+BP+FfAP/g3oE/4V6 + Bf+KfwX/iH0F/391Bf98cgT/fXME/35zBP99cwT/fXID/3xxBf96cQX/eW8D/3dtBP90bgX/c20E/3Jr + A/9vagL/bmoD/25pAv9uaQL/bmoC/25rA/9uawP/bmsD/25rAv9wbQL/cnED/3NyBP9tbAP/amgC/2Zm + Av9kYwT/Y2AD/2JfBP9gXQT/XlgD/+Lh2dvh3t3D0c3KscTAvKS4sq2X6ejn3RMSEdoAAACZAAAAgwAA + AHEAAABjAAAAVQAAAEcAAAA6AAAALQAAABcAAAAcAAAAJgAAADEAAAA+AAAAVAAAAG0AAADI29rZ6dDL + xqHW086s4d/cvvr2+tFrfz34Ql4G/0xpDf9Pbg3/VHUO/1h7Dv9afwz/W3wM/1p5C/9adgn/Wm8I/1lq + CP9WZgn/VmUH/1lmCP9caAf/XmoG/2BrBv9hawb/Y24E/2hwBP9scQX/b3QE/3N3BP93egX/ensD/3p+ + A/97fgP/eHsA/4aGGv+Ojy//eXwC/29xA/9vcQT/c3QE/3V0BP91dAT/dHMD/3V0BP93eQP/gH0D/4iE + BP+PiwX/k5AF/5OPBP+dmQX/l5IF/4iBBf+HgAX/h4EF/4aABP+GfwT/hn8D/4V9A/+DegP/gnoD/4R8 + A/+GfwT/iX4E/4l+BP+IfgP/iH0D/4R6BP+DeQP/hnsE/4p/BP+DewX/e3MF/3xyA/99cgP/fXID/3ty + A/97cQT/enAE/3pwBP94bgT/d20F/3NtBP9yawP/cmoD/29pAv9uaQL/bWgC/21qAv9tagP/bWoD/21q + Av9uawP/bmsC/3BtAv9zcgP/cXAD/2tqA/9oZgP/ZWQE/2NiBP9hXgP/YFwD/15bAv9bVwH/4eDZ2+Hf + 3cTRzsuyxcC8pLeyrZbp6OfdExIR2gAAAJgAAACCAAAAcAAAAGIAAABUAAAARgAAADoAAAAtAAAAFgAA + ABsAAAAlAAAAMAAAAD4AAABUAAAAbQAAAMjb2tnp0MzHodbTz63h39y9+fb60mp+PPlBXQX/S2gN/09s + Df9Tcw3/V3oN/1p8DP9afAz/WnkK/1pzCf9abgn/WWoI/1ZmCP9WZQf/WWYI/1xoB/9daQj/XmoG/2Bs + Bv9jbQT/Z28F/2lxBf9vdAT/cncD/3Z6A/93fAP/eX0C/3p9Av93egD/iIke/4yMLP94eQH/bnED/25w + A/9ycgT/dHMF/3RzBf90cwP/dXQD/3l5BP+BfgT/iIQE/4+LBP+TjwX/lI8E/56ZBf+RjgT/hoEE/4Z/ + Bf+GfgT/hX0E/4V+A/+FfQP/gnoE/4F4Bf+CeAX/hXsE/4Z+BP+IfgT/iX4F/4h9A/+FegT/g3gD/4N4 + A/+HfAP/ioAE/4B4A/96cQP/e3ID/3txBP97cQT/e3EE/3pwBP96cAT/enAE/3huBP93bQX/c2wF/3Jr + A/9vagP/bmkD/21oAv9uaQP/bWkD/21pA/9saAH/bWoC/25rA/9vbAP/cnAC/3JxA/9tbQP/aWcC/2dl + A/9lYwP/Yl8E/2FdA/9fWwP/XVkD/1pWAf/i4Nnb4d7dw9HPy7LFwLykt7Ktluno590TEhHaAAAAmAAA + AIIAAABwAAAAYgAAAFQAAABGAAAAOQAAACsAAAAWAAAAGwAAACUAAAAwAAAAPQAAAFMAAABsAAAAyNva + 2enQzMeh1tLOreDe2r349PrRan47+UJdAv9LaA7/Tm0N/1JzDP9WeQz/WnsM/1p7DP9ZeAr/WnMJ/1pu + Cf9Zagj/VWUH/1ZlB/9YZgj/WmcH/1xpCP9eagb/X2wF/2JsBP9obgb/anEF/250A/9zdwP/dXoC/3h8 + Av96fAL/enwD/3Z5AP+JiyP/i4so/3Z4AP9tbwL/bm8D/3JxBf9zcwX/c3IF/3RzBf91dAP/eXkD/4F/ + BP+IhQX/kIwF/5KPBf+UkAT/nZgF/46JBP+GfwT/hn8F/4Z+BP+DfAX/g3wE/4J7A/+AeQX/gHgF/4N5 + Bf+FewT/hnwE/4h+BP+HfgP/hnwD/4R6BP+CeAT/hHkD/4l/BP+IfgT/fXUD/3tyA/96cQT/e3EF/3tx + Bf96cAT/enAE/3pwBP95bwX/eG4E/3VsBf9ybAX/cGoD/29qA/9taQP/bWgC/25pA/9taAP/bWkD/2xp + Av9tawP/bWsE/29tA/9ycAT/cG4E/2poA/9oZgP/ZmQD/2RhA/9hXgT/X10C/1xZAv9bWAP/WVUC/+Hf + 2Nrg3tzC0c3LssTAvKS3sq2W6ejn3RMSEdoAAACXAAAAgQAAAG8AAABhAAAAUwAAAEUAAAA5AAAALAAA + ABYAAAAbAAAAJQAAAC8AAAA8AAAAUgAAAGsAAADI3Nva6dDMxqHU0s2s393ZvPfz+M5rfjv4Q10C/0tn + Df9Oawz/UHEL/1V3C/9Zegv/WXoL/1h3Cf9acwn/Wm4I/1hpB/9VZQf/VWQG/1dlBv9ZZgf/XGgG/15q + Bv9fawT/Y2wE/2htBf9qcAP/bXQD/3J3A/91eQL/d3wD/3l7A/95ewP/dXgA/4mLJ/+IiSX/dHYA/2xv + Av9tbwP/cHAD/3JyBP9zcgT/c3IE/3R0BP95eAP/gH4E/4mGBv+Piwb/kI0F/5WSBf+blwX/i4UF/4Z+ + BP+EfQT/g3wF/4F7Bf+BegT/f3gF/353BP9/dwT/gnkG/4N8A/+FfQT/hn4D/4V9A/+EewP/g3kE/4F3 + Bf+DegT/iX8E/4V8A/98cQT/e3AE/3pwBP97cQX/enAE/3pwBP96cAT/eG8E/3dtBf91bQT/cmwD/3Fq + A/9vagP/bmkC/21oAv9taAL/bGgC/2xoAv9saAL/bWkC/21rA/9sawL/bm4C/3FvA/9ubQP/aWcD/2hl + A/9lYgT/Y2AE/2FdA/9eWwL/W1kC/1pXAv9YVAL/397X19/c28DQzMmxw8C7pLeyrpfp6OfdExIR2gAA + AJcAAACBAAAAbgAAAGAAAABSAAAARAAAADgAAAArAAAAFAAAABkAAAAjAAAALgAAADoAAABPAAAAaQAA + AMjc29rp0MvGodTQy6rd2ti59PD0yWp8O/dDWwL/TGYM/09pDP9Rbgz/VHUK/1h6Cv9YeAr/WHUJ/1px + B/9Ybgf/VmgG/1VlBv9VZAb/V2UG/1pmBv9cZgb/XWkG/19rBP9jbAT/aG0D/2pwA/9scwT/cHYC/3Z3 + BP92eQX/eHoD/3h6Af91dwD/iowr/4aHIf9zdQH/am0D/21uBP9wcAP/cXED/3JyBP9zcgT/dHME/3l5 + A/+AgAX/iYYG/4+LBP+QjAP/lpME/5eTBf+IgQX/hH0E/4J9BP+BfAT/gHoF/4B5Bv99dgT/fXUE/391 + BP+CeAT/g3sE/4V8A/+FfAP/hHoE/4N5BP+BdwX/gHYE/4V7BP+IfwT/f3cE/3lvBP96cAT/enAE/3pw + BP96cAT/eXAD/3hvBP92bwT/c20D/3NsBP9xagP/b2oD/29qAv9uaQL/bWgC/21oAv9saAL/bGgC/2xo + Av9taQL/bGoC/2xrA/9vbwL/b28D/2ppAv9oZgL/ZmUC/2NiA/9hXwT/YVwD/11ZAv9bWAP/WVUC/1dS + Av/c2tPT3NnYvc7Lx67Dv7ujt7Kuluno590TEhHaAAAAlQAAAH8AAABsAAAAXwAAAFAAAABCAAAANgAA + ACkAAAAUAAAAGgAAACIAAAAsAAAAOAAAAE0AAABnAAAAx9zb2unPy8Sf0s3JqNnX1LXw7PDCaHo69UJb + Av9MZAv/TmkL/1BsC/9Vcwv/V3cK/1d3Cv9XdQj/WXIH/1dtB/9WaAb/VGQF/1NkBv9XZAb/WmUG/1xn + B/9daAT/YGoE/2JrA/9mbAP/aW8C/2xxBP9vdQP/c3cE/3Z4BP94eQT/eHgE/3R3AP+LjS//g4Uc/3N1 + AP9pbQL/bW0D/29vA/9vbwP/cHAD/3FyA/90cwT/eXkE/4CABf+Jhgb/jowF/46LBv+WkwX/k48E/4Z/ + Bf+DfQX/gnwE/4F7Bf+AeQb/fncF/3l0BP97dQT/fncE/4B4BP+DewP/hXsF/4V6BP+DeAX/g3cF/4B2 + Bf+AdwX/h34E/4Z+Bf99cwT/em8E/3pwBP96bwP/em8D/3pwBP94bwP/dm8E/3RuBf9zbgT/cmwD/3Bq + A/9uaQL/bmkC/25oA/9saAL/bGgC/2xoAv9saAL/bGgC/2xoA/9raQL/bWwC/3BvAv9tbAP/Z2YC/2Zl + A/9kYwP/YmAC/19eA/9eWwT/W1kB/1lWAv9XVAT/VVEB/9fWzszY1tS4y8fEq8K9uKG2sq2V6ejn3RMS + EdoAAACTAAAAfAAAAGkAAABcAAAATgAAAEAAAAA0AAAAKAAAABIAAAAYAAAAIAAAACkAAAA1AAAASgAA + AGMAAADG29rZ6M3JxJ/Oysam19PPsOzn67hgcy32OFQA/0BcAP9CXwD/RWUA/0prAP9MbgD/TG0A/01t + AP9QagD/TWQA/0xgAP9KWwD/SlsA/01bAP9QXAD/Ul4A/1VgAP9VYAD/V2IA/1xkAP9hZwD/ZGoA/2dt + AP9rbwD/bnAA/29xAP9vcAD/bG8A/4SHJf94egv/aWwA/2FjAP9jZgD/ZmcA/2dnAP9oaAD/aWkA/2xs + AP9xcgD/e3oA/4KBAP+HhQD/iIUA/5KPAP+HgwD/e3QA/3p0AP96dAD/eXIA/3ZvAP9xbAD/cGwA/3Ns + AP92bwD/eXEA/3xzAP99cwD/fXIA/3twAP96bwD/eW0A/3txAP+AeAD/fHQA/3FpAP9yaAD/cmgA/3Fn + AP9xZwD/cmgA/3FnAP9tZwD/bGYA/2tlAP9qYwD/Z2IA/2ZhAP9mYQD/ZGAA/2RgAP9jYAD/ZGAA/2Rg + AP9jXwD/Y2AA/2NiAP9mZgD/amcA/2NhAP9fXQD/XVsA/1tZAP9ZVwD/VVUA/1NRAP9RTgD/UEwA/05L + AP9MSAD/0c/GxNPQzrLIxMCnwLu2n7Wwq5bp6OfdExIR2QAAAI8AAAB5AAAAZgAAAFcAAABKAAAAPAAA + ADEAAAAmAAAAEAAAABUAAAAeAAAAJgAAADEAAABGAAAAXgAAAMXb2tnpy8fDn8vGwqLTz8qp3dnVssnK + u8fGybbRy9C82M7SvtzQ1cDg0tfB4tPYweLT18Hi0tjB4tPXweLT1sHi09XB4tLUwOLS1MDi0tTB4tPU + weLT1cDi1NXA4tTVwOLU1sDi1dbB4tbXweLX18Hi19jB4tjYweLY2MHi2NjB4tjYwOLY18Di3dzJ4dnZ + xOHX1r/h1tW/4dbWwODW1r/g19a/39bWv9/W1r/f19a/39jXv9/Z2L/f29m/39vZv9/c2r/e3ty/3tva + v97Z17/e2de/3tnXv97Z17/e2Na/3tfWvt7X1r/e2Na+3tjWv97Z17/e2de+3trXv97a177f2de/39nW + v9/Z1r/f2de+39rZv9/Z2L/f19bA39fWv9/Y1b/f2NW/39jVv9/Y1b/f2NW/4NjVv+DX1b/g19W+4NfU + vuDW1b/g1tW/4NbVv+DW1L/g1tS/4NbUvuDV077g1dO+4NXTvuDV077g1NO+4dXUvuHV1L7h1NO+4dPS + vuHT0r7h09G+4dLRvuHS0b3h0M+94M7Mu93LybjZx8W008G+rcvSzsu2y8fFq8O/vKO9uLSdtrGrlevp + 5twTEhHYAAAAiwAAAHIAAABgAAAAUwAAAEYAAAA4AAAALQAAACMAAAAOAAAAEwAAABsAAAAjAAAALgAA + AEEAAABWAAAAxdLRz93LxsGcyMTAn87KxaTU0Mqq3trYsOPg4Lfn5OS+6ubowuzo6sXs6evG7Onrxuzp + 68bs6evG7Onrxuzp68bs6evG7Onrxuzq68bs6evG7errxuzp68fs6evH7Onrx+zq68br6uvG7Orrxuzq + 68bs6uvG7Orrxuzq68bs6erG7Onqxuvo6sbq6OjF6efpxero6sTq6OnE6+jpw+ro6cPo5ufC6ebnwejl + 58Lo5ufB6Obnwefk58Hn5OfB5+Tnwefk58Hm5efA5uXnwOfl58Dn5efA5+XnwOfm58Dn5ufA5+bnwOfm + 58Dn5ufA6ObnwOfm58Dn5efA5+bnwefm58Hn5ufB5+bnwefm58Hn5efC6Obnwejm58Hp5ufB6Obnwujm + 58Lo5ufC6Obnwujm6MPo5ujD6Obow+jm6MPo5+jD6ejpw+ro6cPq6OnD6ujpw+ro6cPp5+jD6efow+fl + 58Tn5efE5+XnxOfl58Tm5ebE5uXmxObl5sTm5ebE5uXmxObl5sTn5ebF5+Xmxefl5sXn5ObE5OLiwuDf + 4L7d29q419TUscvHxavFwb2lwLu3oLq1sZu3sayV4uDf0REQENYAAACEAAAAbQAAAFoAAABNAAAAQQAA + ADUAAAAqAAAAIAAAAA0AAAASAAAAGQAAACAAAAApAAAAOgAAAE8AAACtcG9u5NzZ1a/EwLmYy8fBoM7J + xKPRzsmo1dLOrdfU0LDZ1dOz3NfVtdzZ1bbc2dW23NnVttzZ1bbb2NW23NnVttzY1bbb2NW23NnVttvY + 1bbc2dW23NjUttvY1Lfa2NS33NnVttzZ1bbb2dW23NnVttzZ1bbc2dW229nUttvZ1Lbb2NS22tfVtdvX + 1LXZ1tO02tbTs9nW07HZ1dOy2NXRsdfU0LDX1NCw1tLQsNXTz6/V08+v1dPOrtXSzq7V0s6u1dLOrtXS + zq7W0s6u1tLOrtbSzq7W0s6u1tLOrtbSzq7W0s6u1tLOrtbSzq7W0s6u1tLOrtbSzq7V086v1dPPr9XT + z7DW0tCw1tLQsNbT0LDX1NCw19TQsNfU0LDX1NCw19TQsNfU0LHX09Cx19PQsdfT0LHX1NCx19XRsdjV + 0rHY1dKx2NXSsdjW0rHY1dKx2NXRsdfU0LHX09Cx1tLPstbSz7LW0s+z1dHPs9TRzrPU0c2z1NHNs9TR + zrPU0c2z1NHOtNTRzrTU0c601NHOtNPQzbPRzsyzz8zJsMzJxazIxcGpw7+8o8C7t6C9uLOdtK+qldLN + yaaHhoXfBQUFxAAAAHkAAABkAAAAUwAAAEYAAAA7AAAAMAAAACYAAAAdAAAACwAAAA8AAAAVAAAAHAAA + ACUAAAAyAAAARwAAAHkSERDm29nX19DMxpzDvreXysS+ncrIwqDNyMSjzsvFpc/Lx6bRzcin0c3Ip9HN + yKfRzcin0c3Ip9LOyKfSzsin0s7Ip9LOyKfRzcin0s7Ip9LOyKfSzsin0s3IqNHNyajRzsin0c7Ip9HO + yKfRzsin0c7Ip9HOyKfRzsmn0c7Jp9HMx6fQzMimz8vHps/LxaXPy8WkzsrFos7JxKPMxsOizMbBocvH + waDKx8GgycXAoMnFvp/Jxb+fyca/n8nFv5/JxL+fycS/n8nEv5/Jxr+eycW/nsnFv57Jxb+eycW/nsnF + v57Jxb+eycW/nsnGv57Jxr+fyca/n8nGwKDJxcCgycXBocnFwaHJxcGhysbBoMzGwaHMxsGhzMbBocvH + waHLxsGhy8XCosvFwqLLxcKiy8XCoszJw6LNycSizcnEos3JxKLNycSizcjEos3Hw6LNx8OizMfCosvG + waPJxcGjycXBo8jEwaTIxMCkx8S/pMfEv6THxMCkyMTApMfDv6XHw7+lx8O/pcfDv6XHw7+lx8O/pcXB + vaXDwLykwr66o7+7t5+9ubWdu7axnLSvqZW+urSV4+DeyyspKO0AAAChAAAAbAAAAFoAAABLAAAAQAAA + ADUAAAArAAAAIgAAABkAAAAJAAAADQAAABMAAAAZAAAAIQAAACoAAAA6AAAAXgMCAqdVVVT13tzZz+fk + 3arHwruWwr63lcPAuZbFwbuXx8G8mMfCvJjHwbyYx8G8mMfBvJjHwryYyMO8mMjDvJjIw7yYyMO8mMfC + vJjIw7yYyMO8mMjDvJjIxLyZx8S9mcfEvJnHw7yYx8O8mMfDvJjHw7yYxsG7mMbBu5jGwbuYxsC6l8XA + upbDvrmVw764lcG8tpTBu7WTwLu0k765spK+ubGQvbexj763sY+9uLGPvbiwjry4r467t6+Ou7evjru2 + r467tq+Ou7avjru3r468tq+Ovbavjb22r428tq+NvLavjby2r428tq+Nu7avjru2r467tq+OvLawj7y2 + sJC8tbCQvLawkL23sZC+ubGPvrixkL64sZC+uLGQvriykb63spG+t7KRvreykb63spG/ubOQwLu0kcC7 + s5HAu7ORwLuzkcG6tJLBubSSwbm0kr+5s5K+uLKTvLexk7u2sZS7trGUurWwlLm1sJS4ta+UurWvlLm1 + sJW5tK+VubSvlbm0r5W5tK+VubSvlbizr5W4s66WuLOulrezrpa3sq2VtrCrlLSvqpK3sa2T1tHOpOPi + 38hsbGrzCQgIwQAAAHsAAABfAAAATgAAAEIAAAA4AAAALwAAACUAAAAeAAAAFQAAAAgAAAALAAAAEAAA + ABQAAAAbAAAAIwAAAC4AAABLAAAAYQAAAKk3NzfxgoF/4eHg3tH39vPS8vHu0vPx79Lz8u/S8/Hv0vPx + 79Lz8e/S8/Hv0vPy79Lz8u/S8/Lv0vPy79Lz8u/S8/Lv0vXy79L08u/S8/Lv0vPy79Lz8u/S8/Lv0vPy + 79Lz8u/S8/Lv0vPy79Ly8e7S8/Hu0vPw7tLz8O/S8/Hu0fLx7tDx8O3Q8e/tz/Hu7NDv7uvQ7+3rz/Du + 687w7evO8O3rzu/t687w7uvO7+3rzu/t687v7evO7+3rzu/t687v7evO7+3rzu/t687v7erN7+3qzfHt + 683y7uzM8u7szPLu7M3y7uzN8e7szfDt7M7x7ezO8e3szvHu7M7x7+zO8e/szvHv7M7x7+zO8e/szvLv + 7M7z7+3O8+/tzvPv7c7z7+3O8+/tzvPw7c7z8O3O8/DtzvPw7c7z8O3O8+/tz/Pw7c/z8O3P8vDsz/Lv + 7M/y7+zP8e7sz/Hu7M/x7uzP7+7r0PHu7M/x7uvQ8O3r0PDt69Dw7evQ8O3r0PDt69Dw7evQ8O3r0fDt + 69Hw7evR8O3r0fDt69Dw7evR8/Dt0Ojl49CPjYzdQD8/8gEBAcMAAAB5AAAAXwAAAFAAAABCAAAAOQAA + ADAAAAAoAAAAIAAAABkAAAASAAAABgAAAAgAAAANAAAAEAAAABUAAAAcAAAAJAAAADcAAABMAAAAYAAA + AIYEAwO9KSko6TEwMOMvLy7jLy8u4y8uLuMvLi7jLy4u4y8uLuMvLi7jLy4u4y8uLuMvLi7jLy4u4y8u + LuMvLi7jLy4u4y8uLuMvLi7jLy4u4y8uLuMvLi7jLy4u4y8uLuMvLi7jLy4u4y8vLuMvLy7jLy4u4y8u + LuMvLy7jLy8u4y8vLuMwLy7jLy8u4y8vLuMvLy7jMC8u4zAvLuMwLy7jLy8u4y8vLuMvLy7jLy8u4y8v + LuMvLy7jLy8u4y8vLuMvLy7jLy8u4y8vLuMvLy7jMC8v4zAvL+MwLy/jMC8v4zAvL+MwLy/jMC8v4zAv + L+MwLy/jMC8v4zAvL+MwLy/jMC8v4zAvL+MwLy/jMC8v4zAvL+MwLy/jMC8v4zAvL+MwLy/jMC8v4zAv + L+MwLy/jMC8v4zAvL+MwLy7jMC8u4zAvLuMwLy/jMC8v4zAvL+MwLy/jMC8v4zAvL+MwLy7jMS8v4zAv + LuMwLy7jMC8u4zAvLuMwLy7jMC8u4zAvLuMwLy/jMC8v4zAvL+MwLy/jMC8v4zAvL+MxMDDjLS0s5woJ + CMwAAACWAAAAdAAAAFsAAABOAAAAQgAAADgAAAAwAAAAKAAAACIAAAAbAAAAFAAAAA4AAAAHAAAACAAA + AAwAAAAQAAAAFQAAABsAAAAiAAAALAAAADkAAABGAAAAUAAAAGAAAABsAAAAcAAAAHIAAABzAAAAdQAA + AHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAA + AHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHcAAAB2AAAAdgAA + AHYAAAB3AAAAdwAAAHcAAAB3AAAAdwAAAHcAAAB3AAAAdwAAAHcAAAB3AAAAdwAAAHcAAAB3AAAAdwAA + AHcAAAB3AAAAdwAAAHcAAAB3AAAAdwAAAHcAAAB3AAAAdwAAAHcAAAB3AAAAdwAAAHcAAAB3AAAAdwAA + AHcAAAB3AAAAdwAAAHcAAAB3AAAAdwAAAHcAAAB3AAAAdwAAAHcAAAB3AAAAdwAAAHcAAAB3AAAAdwAA + AHcAAAB3AAAAdwAAAHcAAAB3AAAAdwAAAHYAAAB3AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAA + AHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHUAAAB0AAAAbAAAAGAAAABXAAAATAAAAEIAAAA4AAAAMQAA + ACsAAAAkAAAAHwAAABkAAAATAAAADgAAAAUAAAAGAAAACQAAAAwAAAAQAAAAFQAAABoAAAAhAAAAKAAA + ADEAAAA4AAAAPwAAAEMAAABIAAAASwAAAEwAAABOAAAAUAAAAFAAAABQAAAAUAAAAFAAAABQAAAAUAAA + AFAAAABQAAAAUAAAAFAAAABQAAAAUAAAAFAAAABQAAAAUAAAAFAAAABQAAAAUAAAAFAAAABQAAAAUAAA + AFAAAABQAAAAUAAAAFAAAABQAAAAUAAAAFAAAABQAAAAUAAAAFAAAABQAAAAUAAAAFAAAABQAAAAUAAA + AFAAAABQAAAAUAAAAFAAAABQAAAAUAAAAFAAAABQAAAAUAAAAFAAAABQAAAAUAAAAFAAAABQAAAAUAAA + AFAAAABQAAAAUAAAAFAAAABQAAAAUAAAAFAAAABQAAAAUAAAAFAAAABQAAAAUAAAAFAAAABQAAAAUAAA + AFAAAABQAAAAUAAAAFAAAABQAAAAUAAAAFAAAABQAAAAUAAAAFAAAABQAAAAUAAAAFAAAABQAAAAUAAA + AFAAAABQAAAAUAAAAFAAAABQAAAAUAAAAFAAAABQAAAAUAAAAFAAAABQAAAAUAAAAFAAAABQAAAATwAA + AE0AAABJAAAARQAAAD4AAAA4AAAAMwAAAC0AAAAoAAAAIwAAAB0AAAAYAAAAEwAAAA4AAAAKAAAABAAA + AAUAAAAHAAAACQAAAAwAAAAPAAAAFAAAABgAAAAdAAAAIgAAACYAAAArAAAALgAAADEAAAAzAAAANQAA + ADYAAAA3AAAAOAAAADcAAAA3AAAANwAAADcAAAA3AAAANwAAADcAAAA3AAAANwAAADcAAAA3AAAANwAA + ADcAAAA3AAAANwAAADcAAAA3AAAANwAAADcAAAA3AAAANwAAADcAAAA3AAAANwAAADcAAAA3AAAANwAA + ADcAAAA3AAAANwAAADcAAAA3AAAANwAAADcAAAA3AAAANwAAADcAAAA3AAAANwAAADcAAAA3AAAANwAA + ADcAAAA3AAAANwAAADcAAAA3AAAANwAAADcAAAA3AAAANwAAADcAAAA3AAAANwAAADcAAAA3AAAANwAA + ADcAAAA3AAAANwAAADcAAAA3AAAANwAAADcAAAA3AAAANwAAADcAAAA3AAAANwAAADcAAAA3AAAANwAA + ADcAAAA3AAAANwAAADcAAAA3AAAANwAAADcAAAA3AAAANwAAADcAAAA3AAAANwAAADcAAAA3AAAANwAA + ADcAAAA3AAAANwAAADcAAAA3AAAANwAAADcAAAA3AAAANgAAADMAAAAyAAAALgAAACoAAAAnAAAAIwAA + AB8AAAAbAAAAFgAAABEAAAAOAAAACwAAAAgAAAACAAAAAwAAAAUAAAAHAAAACQAAAAsAAAAPAAAAEwAA + ABUAAAAYAAAAHAAAAB8AAAAhAAAAJAAAACYAAAAnAAAAKAAAACkAAAAqAAAAKQAAACkAAAApAAAAKQAA + ACkAAAApAAAAKQAAACkAAAApAAAAKQAAACkAAAApAAAAKQAAACkAAAApAAAAKQAAACkAAAApAAAAKQAA + ACkAAAApAAAAKQAAACkAAAApAAAAKQAAACkAAAApAAAAKQAAACkAAAApAAAAKQAAACkAAAApAAAAKQAA + ACkAAAApAAAAKQAAACkAAAApAAAAKQAAACkAAAApAAAAKQAAACkAAAApAAAAKQAAACkAAAApAAAAKQAA + ACkAAAApAAAAKQAAACkAAAApAAAAKQAAACkAAAApAAAAKQAAACkAAAApAAAAKQAAACkAAAApAAAAKQAA + ACkAAAApAAAAKQAAACkAAAApAAAAKQAAACkAAAApAAAAKQAAACkAAAApAAAAKQAAACkAAAApAAAAKQAA + ACkAAAApAAAAKQAAACkAAAApAAAAKQAAACkAAAApAAAAKQAAACkAAAApAAAAKQAAACkAAAApAAAAKQAA + ACkAAAAoAAAAJgAAACUAAAAjAAAAIAAAAB4AAAAaAAAAFwAAABQAAAARAAAADQAAAAoAAAAJAAAABgAA + AAEAAAACAAAAAwAAAAQAAAAHAAAACAAAAAsAAAAOAAAAEAAAABEAAAAVAAAAFwAAABkAAAAcAAAAHQAA + AB0AAAAfAAAAHwAAACAAAAAfAAAAHwAAAB8AAAAfAAAAHwAAAB8AAAAfAAAAHwAAAB8AAAAfAAAAHwAA + AB8AAAAfAAAAHwAAAB8AAAAfAAAAHwAAAB8AAAAfAAAAHwAAAB8AAAAfAAAAHwAAAB8AAAAfAAAAHwAA + AB8AAAAfAAAAHwAAAB8AAAAfAAAAHwAAAB8AAAAfAAAAHwAAAB8AAAAfAAAAHwAAAB8AAAAfAAAAHwAA + AB8AAAAfAAAAHwAAAB8AAAAfAAAAHwAAAB8AAAAfAAAAHwAAAB8AAAAfAAAAHwAAAB8AAAAfAAAAHwAA + AB8AAAAfAAAAHwAAAB8AAAAfAAAAHwAAAB8AAAAfAAAAHwAAAB8AAAAfAAAAHwAAAB8AAAAfAAAAHwAA + AB8AAAAfAAAAHwAAAB8AAAAfAAAAHwAAAB8AAAAfAAAAHwAAAB8AAAAfAAAAHwAAAB8AAAAfAAAAHwAA + AB8AAAAfAAAAHwAAAB8AAAAfAAAAHwAAAB8AAAAfAAAAHwAAAB8AAAAdAAAAHQAAABsAAAAYAAAAFgAA + ABMAAAARAAAADwAAAA0AAAAJAAAABwAAAAcAAAADAAAAAQAAAAEAAAACAAAAAwAAAAQAAAAFAAAABwAA + AAkAAAALAAAADAAAAA4AAAAQAAAAEgAAABQAAAAVAAAAFQAAABcAAAAXAAAAGAAAABcAAAAXAAAAFwAA + ABcAAAAXAAAAFwAAABcAAAAXAAAAFwAAABcAAAAXAAAAFwAAABcAAAAXAAAAFwAAABcAAAAXAAAAFwAA + ABcAAAAXAAAAFwAAABcAAAAXAAAAFwAAABcAAAAXAAAAFwAAABcAAAAXAAAAFwAAABcAAAAXAAAAFwAA + ABcAAAAXAAAAFwAAABcAAAAXAAAAFwAAABcAAAAXAAAAFwAAABcAAAAXAAAAFwAAABcAAAAXAAAAFwAA + ABcAAAAXAAAAFwAAABcAAAAXAAAAFwAAABcAAAAXAAAAFwAAABcAAAAXAAAAFwAAABcAAAAXAAAAFwAA + ABcAAAAXAAAAFwAAABcAAAAXAAAAFwAAABcAAAAXAAAAFwAAABcAAAAXAAAAFwAAABcAAAAXAAAAFwAA + ABcAAAAXAAAAFwAAABcAAAAXAAAAFwAAABcAAAAXAAAAFwAAABcAAAAXAAAAFwAAABcAAAAXAAAAFwAA + ABcAAAAXAAAAFwAAABUAAAAVAAAAEwAAABEAAAAPAAAADgAAAAwAAAAKAAAACAAAAAYAAAAFAAAABAAA + AAIAAAABAAAAAQAAAAEAAAACAAAAAwAAAAMAAAAFAAAABgAAAAcAAAAIAAAACgAAAAsAAAAMAAAADQAA + AA8AAAAPAAAADwAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAA + ABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAA + ABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAA + ABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAA + ABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAA + ABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAA + ABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAPAAAADwAAAA4AAAANAAAACwAA + AAsAAAAJAAAACAAAAAYAAAAFAAAABAAAAAMAAAADAAAAAQAAAAAAAAABAAAAAQAAAAEAAAABAAAAAgAA + AAIAAAADAAAABAAAAAQAAAAFAAAABwAAAAcAAAAIAAAACQAAAAkAAAAJAAAACgAAAAoAAAAKAAAACgAA + AAoAAAAKAAAACgAAAAoAAAAKAAAACgAAAAoAAAAKAAAACgAAAAoAAAAKAAAACgAAAAoAAAAKAAAACgAA + AAoAAAAKAAAACgAAAAoAAAAKAAAACgAAAAoAAAAKAAAACgAAAAoAAAAKAAAACgAAAAoAAAAKAAAACgAA + AAoAAAAKAAAACgAAAAoAAAAKAAAACgAAAAoAAAAKAAAACgAAAAoAAAAKAAAACgAAAAoAAAAKAAAACgAA + AAoAAAAKAAAACgAAAAoAAAAKAAAACgAAAAoAAAAKAAAACgAAAAoAAAAKAAAACgAAAAoAAAAKAAAACgAA + AAoAAAAKAAAACgAAAAoAAAAKAAAACgAAAAoAAAAKAAAACgAAAAoAAAAKAAAACgAAAAoAAAAKAAAACgAA + AAoAAAAKAAAACgAAAAoAAAAKAAAACgAAAAoAAAAKAAAACgAAAAoAAAAKAAAACgAAAAoAAAAKAAAACgAA + AAoAAAAKAAAACgAAAAkAAAAJAAAACQAAAAcAAAAHAAAABgAAAAUAAAAEAAAABAAAAAIAAAACAAAAAgAA + AAEAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAEAAAABAAAAAQAAAAIAAAADAAAAAwAAAAQAAAAFAAAABQAA + AAYAAAAHAAAABwAAAAcAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAA + AAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAA + AAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAA + AAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAA + AAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAA + AAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAA + AAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABwAAAAcAAAAHAAAABQAA + AAUAAAAFAAAABAAAAAMAAAADAAAAAQAAAAEAAAABAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + 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 + AAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAA4AAAAAAAAAAAAAAAAAAAACgAAAAwAAAAYAAAAAEA + IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAABgAAAA4AAAAXAAAAIAAAACcAAAArAAAALAAA + ACwAAAAsAAAALAAAACwAAAAsAAAALAAAACwAAAAsAAAALAAAACwAAAAsAAAALAAAACwAAAAsAAAALAAA + ACwAAAAsAAAALAAAACwAAAAsAAAALAAAACwAAAAsAAAALAAAACwAAAAsAAAALAAAACwAAAAsAAAALAAA + ACwAAAAsAAAALAAAACwAAAArAAAAJwAAAB8AAAAXAAAADQAAAAYAAAAGAAAADgAAAB0AAAAtAAAAPQAA + AEgAAABOAAAATwAAAE8AAABPAAAATwAAAE8AAABPAAAATwAAAE8AAABPAAAATwAAAE8AAABPAAAATwAA + AE8AAABPAAAATwAAAE8AAABPAAAATwAAAE8AAABPAAAATwAAAE8AAABPAAAATwAAAE8AAABPAAAATwAA + AE8AAABPAAAATwAAAE8AAABPAAAATwAAAE8AAABOAAAASAAAAD0AAAAtAAAAHAAAAA0AAAALAAAAGQAA + ADAAAABHAAAAWwAAAGkAAABwAAAAcQAAAHEAAABxAAAAcQAAAHEAAABxAAAAcQAAAHEAAABxAAAAcQAA + AHEAAABxAAAAcQAAAHEAAABxAAAAcQAAAHEAAABxAAAAcQAAAHEAAABxAAAAcQAAAHEAAABxAAAAcQAA + AHEAAABxAAAAcQAAAHEAAABxAAAAcQAAAHEAAABxAAAAcQAAAHEAAABwAAAAaQAAAF0AAABIAAAALwAA + ABgAAAARAAAAJAAAAEEAAABsCgoLpBgYGLIWFxe0FxcXtBcXF7QXFxe0FxcXtRcXGLQXFxi0FxgYtBcY + GLQXGBi0GBgYtBcYGLQXFxi0FxcXtBcXF7QXFxe0FxcXtBcXF7QXFxe1FxcXtRcXF7UXFxe0FxcXtBcX + F7QXFxe0FhcXtBYWF7QWFhe0FhYWtBYWF7QXFxe0FxcXtBcXF7QXFxe0FxcXtBcXF7QYGBi1AQECpgAA + AHkAAABfAAAAQQAAACQAAAAXAAAALAAAAF05OTe7joiApZOMgpSRiICTjIR6kod/dZCEe3KPgHlvjn54 + bY18dWuMeXJni3lyZ4t5cWeLeG5mi3lvZot7cmiKgHdsi4N7coyIf3aMjIJ4jIyFeo2NhnuOjYd8j4+H + fo+Qh3+PkYh/j5KJf4+SiYCPk4uAkJOMgpCTjIKQlIyCkJOLgZCPiH6OjIR6jYuCeIyMg3mNj4d9jpGJ + gI+SioCOfnlzshcXF7UAAABxAAAAUAAAAC4AAAAbAAAAMAkJCYmSjIasnpWJcLKmnYW/s6yQvbKrkbqv + p4+3rKWNtaujjLOqoYuxp5+KsKWdia6knYmuo52JrqKdiq+knYmypp+JtKqjibitp4q7saqKvLKri7yz + q4u7s6yMvLOtjLyzrYy9s66NvbSujb21ro29ta6OvLaujru2ro68tq6Ovbevjry1ro66s6yMuLKri7ex + rIu5s6+Mu7SyjbStqYaelY10n5WIbGdlYb0AAACJAAAAVgAAADMAAAAcAAAAMhESEpKpoZqlsriymXPd + 4+tx4Ofyc+Dn83Xg5/N24ObzeeHl83zi5fJ/4uTyguPk8oXj4vKH4+LyieTg8ozl3/KP5d/yk+bf8pfo + 4PKc6eLyoOrj8qTs4vKo7uLzrfDi8rLz4fK29uHzvPjh88T64fPO++Tz3vvq8+z78/P5+/nz//v98//7 + /vP/+/3y//v38vz77fL3++Lz9vvR8/P5vu7V1rm7qaKbdX98d7UAAACRAAAAWQAAADYAAAAdAAAAMxAQ + EJGwqKKsws7JsEjd5P882d//Pdna/z7Z1/8/2dX/QdnT/0ba0v9K29D/S9vO/07by/9Q3Mn/U9zH/1be + xf9a4cP/XeTC/2Lowv9o78T/cPXH/336zv+M/db/nf/g/7L/6v/F//H/2v/5/+///f/3//z/+f/8//r/ + +v/y/+v/4f/e/7/92v+3/dn/wv7O/8r/sf/V/Zv/2vyO/9f9jP/Q5r7WvbOxgn57d7gAAACRAAAAWgAA + ADcAAAAdAAAAMw8PD5G0q6avxtLPtjzT2f8v0NP/MtDR/zPPz/800Mv/N9DJ/zrQyP880cX/PdLD/0DV + wf9F2cL/St7E/1LlyP9b7M3/ZvLT/3H42P97/d3/gv/g/4v/5P+Z/+j/qf/r/7n/7P/E/+f/x//b/7// + zP+0/L//pfm1/5n3r/+M9qv/ePWs/3P3uP+C+sP/hf3J/5D9y/+q+7n/uO2R/7XXZ//P2a3Zxb27iIB9 + ebkAAACRAAAAWgAAADcAAAAdAAAAMw8PD5G1rqiwx9PQtzjS1f8sz9D/MdDP/zLRzv811M7/OdfP/z/b + 0f9E4dX/TOjY/1Pu3P9a9OD/YPni/2X74f9q/N//bv7d/3T/2/96/9r/gf/X/4r+1P+Q/Mv/kfi//43z + sP+F7p//gOmT/4Hmjf+G5Yr/j+WI/5bmh/+a5ob/nOKG/57ahv+k14n/qdyM/6zmkP+k7pT/n/CW/6Hi + hf/K27fayL+9i4J/e7oAAACRAAAAWgAAADYAAAAdAAAAMw8PD5G3r6qxydXRuT7Y1/8z2dX/Ot3Y/0Di + 3P9F6N//SOrg/0nq2/9M6tb/TujQ/0/myf9R58P/VerB/1zwwv9k9cL/a/fA/2/yuf9w6q//buKh/2vb + lf9r2Y3/dNmM/33bi/+C24f/h9uC/4jafv+K1Hr/ic10/4fFbf+Ivmj/jLhg/5K3Vf+Ttkv/lLVO/5m2 + Vf+kvl3/rsti/7HXbf/S4LzbysLAjYOAfLsAAACQAAAAWgAAADYAAAAdAAAAMw8PD5G4sKyzytfTukbh + 3P853tb/PNvR/z/azf8/2Mj/QNTC/z/Quf9D0bb/Ste4/1Leuv9a5L3/X+S5/1/esP9f1qL/X8+X/2HM + kP9lz4z/bNOJ/3HWiP9314T/ftWD/4PRf/9+yHP/eb5o/3m4Y/97s1//f7Bc/4WwVv+MtVH/j7xS/5DA + W/+TxGT/nMVl/6HDYP+kwFj/qLtS/6mzQP/Qz6LczcfHkISBfrwAAACQAAAAWgAAADYAAAAdAAAAMw8P + D5G5sq60y9bSuz/Kwf8yxLf/NsO0/zvHtv9Bzbv/RtXA/0vZv/9O2rv/Udaz/1PQqf9VyqH/WMia/13L + lf9j0JL/adOQ/27VjP9w04b/cM5+/3DHdf9wwm//e8Nx/4bGcf+CwWX/gb9e/4i/Xv+Mw1z/kMdc/5DM + Yf+Mz27/i8tz/47BbP+PuWD/kbJU/5KoSf+WokH/mJw6/5aRKv/Iw5vc0MzKkYWCf70AAACQAAAAWgAA + ADYAAAAdAAAAMg8PD5G6s6+2zNbRvELFuP84xrb/QM27/0XSvf9J1L3/StK3/0vMrP9MyKT/Ucug/1rR + of9j2KH/a9ye/3Dcl/9x2o//c9eI/3fVgf961Xz/ftV2/4DUcP+F02r/ldRu/5nTbv+JyWX/gcZi/4PH + XP+FwlT/grdU/32pVf98nUn/fJM8/3uLNP98hi//gIMr/4SBKP+IgCf/i4Em/4x8Gv/GvZbd08/Nk4eE + gb0AAACQAAAAWgAAADYAAAAdAAAAMg8PD5G8tbC2ztnTvUrQvv8+yrT/Qsqv/0fMrf9P07H/WN22/1/l + t/9j6rT/au2v/3Lsqf956qP/gead/4LilP+A3Ir/f9N+/33Mc/97xGn/d7th/3KyXf9vr2H/d7Zx/3O4 + cP9pr1n/cadC/3icNP90ji//coYq/3SDJv92giT/d38j/3h8If96eiD/fHgg/4B4IP+DeSD/h3oi/4h2 + F//Eu5be1tHQlYeEgb4AAACQAAAAWgAAADYAAAAdAAAAMg8PD5G8tbG4z9nTvlbXvf9S2rv/WuK//2Hp + wv9o7ML/be2//2zps/9p4KX/adWX/2nMjP9txIH/cLx3/22zbf9nqWP/ZKJd/2GdW/9dmlv/XJlc/1yc + W/9lpVn/drBT/3imO/9xjyf/b4Qk/2yAJf9sfiT/cH4j/3aAIv96fx//ense/3l4Hv95dx3/e3Ue/351 + Hv+Adh//hHcf/4VyFf/Dupbe19PSl4eFgr8AAACQAAAAWgAAADYAAAAdAAAAMg8PD5G9trO40dvVv2Te + v/9Y17P/Vs+o/1PHnP9Tv5T/U7mO/1KzhP9Qqnb/UKFr/1OeZv9anmP/YKFk/2CfYv9cmV3/XJhc/1yY + V/9emFD/ZJpH/2eYOv9wmS//fZ0p/3aPJP9qfSH/an0h/25/IP9yfh7/dX4d/3yAHf99fxz/e3oc/3l2 + HP94dBv/eXMc/3tzHP99dBz/gnQd/4JvEv/CuZXe2NTUmIiGg8AAAACQAAAAWgAAADYAAAAdAAAAMg8P + D5C9t7W50NjSwE+3lv9Bq4f/QqF9/0KddP9FnXL/SJ5w/0uebf9Lmmf/TJVi/1CUYP9ZmV//YqFe/2Wf + Wf9imVL/ZZlM/2eYQ/9olDn/Zo0s/2aFJP90jSL/f5Yj/3KHH/9peRz/bHsb/3F+Gv91gRr/eoAa/4CD + Gv9/gBn/fHsa/3l2Gv94chn/eHEa/3lxGf98cRr/gHIb/4BsEP/BuJTf2dbWmoiGg8AAAACQAAAAWgAA + ADYAAAAdAAAAMg8PD5C+ura60NbQwUmjgP8/nHP/QpVs/0GRZv9EkmX/R5Vn/0uYZv9NlmH/T5Nb/1SU + V/9fmlT/a6JT/26hTP9tm0P/b5g7/2iOL/9khCX/Zn8g/26AHf97jR7/fZAe/3GBG/9reRj/b3wX/3SB + F/95gxj/foMX/4SGGP+Dghj/fnwY/3p2GP93chj/d3AY/3hvGP96bxj/fXAZ/31qDv/BuJTg3NjXm4mH + hMEAAACQAAAAWgAAADYAAAAdAAAAMg8PDpC/ure70NbPwUmedP9Al2r/Qo9k/0OLX/9FjF3/SZBc/06T + Wv9Qk1b/U5JR/1qTTP9onEj/eKVE/3qhPf9vlDH/bIwo/2mDIf9rgBz/bX0Z/3B+GP96ixr/fI4a/3F/ + F/9ufBb/cn8V/3qEFf99gxb/gYUW/4eHFv+Fgxb/f3wV/3t1Fv94chb/d28W/3duFv94bhb/fG4X/3to + DP/AuJTg3dnYm4mHhMEAAACQAAAAWgAAADYAAAAdAAAAMg8ODpC/u7i70NbPwkuabf9ClGH/RI1a/0WH + U/9JiFH/TItP/1GOTv9XlEr/XZdG/2aZQP92ojz/gaY1/3eYLP9uiiP/c4oe/3KEGv9wfxX/bnsU/3KA + Fv99jxj/fo8Y/3KAFP9yfhT/eIMU/4CIFP9+hRP/hogU/4iIFP+FgxT/f3wT/3x2E/95cxT/eHAU/3dt + Ff93bRX/e20V/3hmCv/At5Pg3dnanYqIhcEAAACQAAAAWgAAADYAAAAdAAAAMg4ODpDAvLm80dbPwk6Y + Y/9Gk1b/R4pQ/0iCSP9Kgkb/UIhD/1uUQv9kmz7/ap87/3OhNf94nSz/fZok/3mSIP92ihv/e4wZ/3aF + Fv9xgBT/bnwS/3aFE/+DkxX/hZIV/3aDEv94gxL/f4cS/4SMEv+BhxH/iYoR/4iJEv+EgxL/gHwQ/3x3 + Ef97dBL/eXET/3duE/94bRP/eWwU/3dlCf/At5Ph3trbnYqIhcIAAACQAAAAWgAAADYAAAAdAAAAMg8O + DpDAvLm80dbNw1GUWP9Jkk3/TIhH/0yAP/9Vizz/YJc6/2WYN/9upTX/cKAv/22OJf93kSD/g5oe/3+S + HP97ixf/go0W/3qGFP90gBL/c38R/3+LE/+LmRT/ipUU/3yGEf9+iBH/hY0R/4aNEf+FiQ7/iYsP/4iI + D/+EgRD/f3wP/314D/99dhD/fHMR/3pvEv95bRL/em0S/3dmB//AuJLh3trbnouIhsIAAACQAAAAWgAA + ADYAAAAdAAAAMg8ODpDAvLq80tXNw1SSUP9LkEP/U44//16VOv9hlDT/ZZgx/26sL/9qmCf/ZYIg/3CJ + Hv9/lRz/ipsa/4WSGv+AixX/hI0T/3yGEv94gQ//eYMQ/4aSEv+SnhL/i5YR/4CKD/+Ciw7/ipEQ/4iN + D/+Jiw3/i4wN/4iGDP+EgQ7/gHsN/394Df+BeA//gHUP/35yEP99bhH/fG0R/3loBv/BuZLh39zcn4uJ + hsIAAACPAAAAWgAAADYAAAAdAAAAMg8PD5HBvLq90tXMxFWRR/9Znz3/ZaM6/2CPMP9koC7/aa4t/2WN + JP9kfR//a4Qd/3eNG/+Flhj/j5sX/4iSGv+CihL/g4wQ/32GDv96gg7/focO/42XEP+XoBD/jZUP/4WN + Df+Hjg3/j5QP/4iMDv+NjAz/jooM/4mECv+Cfwz/f3oL/4F4DP+DeA3/gnUN/4BzDv9+bw//fW4P/3xr + BP/Cu5Lh39zcn4uJhsMAAACQAAAAWgAAADYAAAAdAAAAMg8PD5HAvLu+09bMxGOjQv9hpjb/X5cx/2Wu + Lv9ipCn/XH4h/2WAHv9qghz/b4Ua/32NF/+LlhX/kpoW/4mQGP+CiA//g4sN/3+GDP98gwv/g4oM/5Sb + Dv+coQ//jZMN/4iODP+MkQz/kJYN/4uLDP+Rjgr/j4oL/4mDCf+CfQr/gHkK/4J4C/+DeAz/g3YN/4Bz + Df9/bw3/fm8N/35uA//DvZLh3tzcoIuJhsMAAACPAAAAWgAAADYAAAAdAAAAMg8PD5HCvbu91NjMxF+Z + O/9boTD/Zr4z/16YKP9YdR//X3sd/2iDG/9sghj/coUX/4COFP+NlxP/kpkW/4iOFf+CiAz/hYkM/4CF + Cv9/hQn/iI4L/5qeDf+doQ3/jZIL/4uQC/+RlQv/kpQL/46MCf+Ujwn/j4kJ/4mDCP+DfQn/gXkI/4N5 + CP+DeAr/gnYL/39yDP9+bwv/gHEM/4BxAv/EvpHh39vcoIuIhcQAAACPAAAAWgAAADYAAAAdAAAAMg8P + D5DCvby+09TLxGCiOf9hwTH/W5cp/1l3H/9beBv/YXwZ/2uDF/9tgRX/dYUT/4OOEv+Plg//kpcT/4eM + Ev+DiAr/hYkJ/4KFCP+Bhgj/jpII/56hC/+doAv/jZEJ/46RCv+WmAr/k5EJ/5KOCP+Ujwj/j4kI/4mC + B/+DfQb/gXoG/4N5B/+Cdwn/gXQK/35xCv99bwn/gHIL/4FzAP/Ev5Hi3drboYqIhcQAAACPAAAAWgAA + ADYAAAAdAAAAMg8PD5DBvLy/1dzMxWG4N/9WkSX/WoUi/1t8HP9cdxn/YnsW/2uBFP9vgBH/d4UQ/4WN + EP+OlQv/kZUQ/4aKEP+Dhgf/hYgH/4KEB/+Ehgf/lJUH/6GiCv+cnQn/kZEH/5OSCP+ZmAn/ko8I/5WQ + B/+Vjwf/j4gH/4mCBv+EfQX/gnoF/4J4Bv+Cdgf/fnQI/3twCP97cAj/gXQK/4F1AP/Ev5Hi3djbooqI + hcQAAACPAAAAWgAAADYAAAAdAAAAMg8PD5DBvr2/1NbLxlmELP9Wih//XIkg/1x7Gf9cdhb/Y3kU/2x/ + Ef9ufw7/eYQN/4SNDP+Nkwj/kZQQ/4WJDf+EhQX/hoYF/4KEBv+GhwX/mJgG/6OkBv+bmgf/k5EH/5aV + Bv+Zlwf/ko8F/5eRBv+VjgX/jocG/4iBBf+EfAT/g3sE/4J4Bf9/dQb/fHIG/3pvBv97cQb/gnYJ/4J3 + AP/Ev5Di3NnbooqIhcQAAACPAAAAWgAAADYAAAAdAAAAMg8PDpDDvr2/1NXLxleCKf9Xixz/XIoe/1t6 + GP9ddBX/Y3cS/2t8D/9vfQ3/eYIM/4SLC/+MkQj/kJIS/4SGDP+DhAP/hYUF/4KDBf+KiQX/m5oG/6Ok + Bf+YlgX/k5AG/5iWBv+Wkwb/lI8F/5iRBv+Tiwb/jYQG/4d/BP+EfAP/g3sE/4B4Bf99dAT/enAF/3du + Bv96cQb/gHYI/4J3AP/EwI/j3Nnbo4qIhcUAAACPAAAAWgAAADYAAAAdAAAAMg8PDpDDv77A1dXMxliA + KP9Wihv/XYob/1x6Fv9dchP/YnUQ/2t7Dv9tfAz/eIEL/4SKCv+Kjwf/jpET/4KECf+BggP/g4MF/4KC + Bv+NiwX/nZwF/6KiBv+VkwX/k5AG/5iVBv+Tjwb/lY4G/5ePBv+QiQb/i4IG/4V9BP+DfAP/g3oF/391 + Bf96cQT/dW4E/3RuBf94cQb/f3cI/4F5AP/EwY7j29nbpIqIhcUAAACPAAAAWgAAADYAAAAdAAAAMg8O + DpHEwL7A1dbMxll+Jv9XiRj/XooZ/1t6Ff9bcBL/YnMP/2l5DP9segv/d4AJ/4OJCP+KjQf/jpAV/4CC + CP+AgQP/gYIE/4GBBf+PjQX/n50G/6GeBf+Ujwb/lZAG/5iTBf+SiwX/lo4F/5WMBv+PhgX/iIAF/4R7 + A/+DewT/gngF/350BP93cAT/cm0E/3JtBP93cgX/fHcH/4B5AP/Bvo3j29jbpImIhcYAAACPAAAAWgAA + ADYAAAAdAAAAMg4ODpDEwL/A1tbMxll8I/9YhhX/XooY/1x5FP9cbxD/YXEN/2h3DP9teAr/dn8I/4GH + CP+Jiwf/jY4V/36AB/9/gAT/f4AD/4KBBP+Sjwb/oJ4G/56ZBv+SjAf/lY8G/5WQBf+RiQb/l4wG/5OJ + Bf+NgwX/h34E/4N6A/+DeQT/gHYE/3xyBP91bgT/cGsD/3FtBP91cQX/e3gG/3t3AP+9uo3j3NrbpYmI + hcYAAACPAAAAWgAAADYAAAAdAAAAMg4ODpDFwb/A1tfNx1d6If9XhBP/XokW/115Ev9bbg3/X3AM/2d0 + C/9sdgn/dX0H/4GGB/+IiQf/jI0W/3x+Bf9+fgP/fn4D/4OABP+UkQX/oZ4G/5qUBv+RiQf/lY4F/5KL + Bf+Qhwf/looG/5CFBf+LgQX/hnwE/4J4Bf+BdgX/fnME/3pwBP9zbAT/b2oD/3FtA/90cQT/e3oF/3Nw + AP+6uI3j3drbpYqIhcYAAACPAAAAWgAAADYAAAAdAAAAMg8ODpDHw8HB1tfNx1Z4H/9XghL/XogT/1x5 + EP9abA3/Xm4L/2VyCf9qdQf/dXwH/4GEBv+Ghwb/i4sY/3p7Bf98fQT/fHwD/4SBBP+VkwX/oZ0G/5WP + Bv+QiAX/k40F/4+HBf+Rhgb/k4cF/4yCBf+KgAT/hHkE/4F3Bf+AdQT/fHIE/3ZuBP9wawT/b2oD/3Bs + A/9zcQP/eXgF/21pAP+5tY3j3drbpYqIhsYAAACPAAAAWgAAADYAAAAdAAAAMg4ODpDHw8LB2NjOx1Z1 + H/9Vfw//XYYR/1x3Dv9Zag3/XmwK/2NxCP9qcwb/dHsG/3+DBf+EhQb/iYkZ/3h4A/96ewT/enoE/4WC + BP+XlAT/npsF/4+KBf+Phgb/kIkF/4yDBf+RhQb/kIMF/4p/BP+IfwP/gXcF/4B1BP9+cwT/enAE/3Ns + BP9wagP/b2oD/29sA/90cgP/dHMF/2diAP+2s4zj3drcpoqIhsYAAACPAAAAWgAAADYAAAAdAAAAMg4O + DpDHxMPB2NjOx1VyHf9Teg3/XIQQ/1x2Df9ZaQv/XWsI/2JwB/9pcQb/c3kG/36BBP+ChAf/hocZ/3V2 + Av94eAX/eXgE/4aDA/+ZlAX/m5cF/4yFBf+NhgX/jYUE/4mABP+PgwT/i4AE/4l+BP+FewT/f3QE/390 + BP98cgT/d24E/3JrA/9vagP/b2sD/29sA/9zcwP/bm0D/2FdAP+0sozj3drcpoqIhsYAAACPAAAAWgAA + ADYAAAAdAAAAMg4ODpDJxcTB2dnPx1RvG/9Sdgz/W4EO/1x1C/9ZaQn/W2kH/2BuBf9ocQX/cncG/3t+ + A/+Aggj/hIUY/3JzAv92dgX/eHcE/4iEBP+YlAX/lpIE/4iCBf+KgwX/iIAD/4h/BP+NgQT/h30E/4d+ + BP+BeAT/f3ME/31yBP96cAT/dG0E/3BqA/9uagP/bmsD/3BtA/9xcQP/aWcC/1xYAP+zsIvj3trcpoqI + hsYAAACPAAAAWgAAADYAAAAdAAAAMg4ODpDKx8XB2drQyFNtGf9Rcgv/W34N/1t0Cv9YaAj/WmcH/19s + Bv9mbwX/cXYE/3l8Av9/gQr/goIW/3BxAv91dAT/d3YE/4mFBP+YlAX/kYwF/4Z/Bf+GfwT/g3sE/4h+ + BP+JfgT/hXsD/4Z8BP99dAT/fXIE/3txBP93bgT/cWsD/25pAv9tagL/bWoC/3FvA/9tbAP/ZGID/1dU + AP+xrovk39vcqIqIhscAAACPAAAAWgAAADYAAAAbAAAAMQ4ODo/Kx8XB2NjOxlFpFv9NbQb/V3oJ/1hx + Bv9UZQT/V2QE/1xoA/9kbAH/bnMA/3Z5AP99fwr/fX4S/2xtAP9xcAH/dnUB/4iFAv+VkQL/i4QB/4F7 + Av9/eAH/f3cC/4R7Af+EegH/g3gB/4J4Af94bwH/eW8C/3duAf9yawL/bWgA/2tnAP9rZwD/a2kA/25t + AP9mZQD/YF0A/1JOAP+uq4nj3tvcp4qIhscAAACNAAAAWAAAADUAAAAYAAAALBAPD4zKxsS/0tHHvVZt + Hf5TcA//XHsQ/111Dv9aag3/XWkO/2NtDP9qcQr/c3gL/3p8Cv+Bgxf/foEa/3BxCP91dAv/e3sM/42L + Df+XlA3/ioQN/4R+Df9/eQz/g3wM/4iAC/+GfAz/iH8M/4J5DP99dAz/fXQM/3lzDP91bwv/cm0K/3Ft + Cf9xbQr/cnEK/3FwCv9paAv/ZGIK/1ZSB/+ppofa2NXVoYyKiMYAAACJAAAAUgAAADAAAAAUAAAAJAsL + C4K/vLi/1dHLo8zNwMHS1MbM1NbHztXWx87U1cfO1dXHztXVx8/W1sfO2NfHztjXx87Z18jO19bHzNXU + xcvV08PK1dTDydfVw8nY1sPJ1tTDyNbTw8jV08PJ1tPDydfUw8nW08PK19TEytbUxMrW08PK1tPEy9bT + xMvW1MXL1tPFy9XSw8vU0cPM09HCzNLRwszRz8LM0c7CzMnHu8XGwruwzcjEmYSCgMYAAAB7AAAARgAA + ACgAAAAOAAAAGgAAAFNpaGbH2NTOsuDc2avi3duv4t3br+Pe26/j3tuv49/br+Lf27Dh39uv4d7br+Hd + 26/g29qu3trYrNzY1qnb1tOo2dXSp9jU0afY09Gn2NXRptnU0aba1NGl2dXRptnU0qfZ1NOo2tbUqNvW + 1Kjb1tSp3NbVqd3Y1qnd2dap3dfWqtrW1KrY1NOs19TSrNfT0qzX09Ks19PSrdbRz6vQy8envrq2vTEx + MLgAAABXAAAANQAAAB4AAAAJAAAAEgAAACcAAABnMzMyq09OTbRMS0qzS0tKtExLSrRMS0q0TEtKtExL + SrRLS0q0S0tKtEtLSrRLS0qzS0pJs0pJSbNLSkizSkpJs0pKSLNKSkizSkpIs0tJSLNLSkmyS0pJsktK + SbNLSkmzS0pJs0tKSbNMSkmzTEpJs0xKSbNMSkmzTEpJs0tKSbNLSkmzS0pJs0tKSbNLSkmzS0lJs0tK + SbRNTEu2Hh0dowAAAF4AAAA4AAAAJQAAABMAAAAFAAAACwAAABYAAAAhAAAALQAAADcAAAA6AAAAOgAA + ADoAAAA6AAAAOgAAADoAAAA6AAAAOgAAADoAAAA6AAAAOwAAADsAAAA7AAAAOwAAADsAAAA7AAAAOwAA + ADsAAAA7AAAAOwAAADsAAAA7AAAAOwAAADsAAAA7AAAAOwAAADsAAAA7AAAAOwAAADsAAAA7AAAAOwAA + ADsAAAA7AAAAOgAAADsAAAA6AAAAMwAAACsAAAAhAAAAFQAAAAsAAAACAAAABAAAAAkAAAAOAAAAEwAA + ABcAAAAZAAAAGQAAABkAAAAZAAAAGQAAABkAAAAZAAAAGQAAABkAAAAZAAAAGQAAABkAAAAZAAAAGQAA + ABkAAAAZAAAAGQAAABkAAAAZAAAAGQAAABkAAAAZAAAAGQAAABkAAAAZAAAAGQAAABkAAAAZAAAAGQAA + ABkAAAAZAAAAGQAAABkAAAAZAAAAGQAAABkAAAAYAAAAFwAAABMAAAAOAAAACAAAAAQAAAAAAAAAAQAA + AAIAAAAEAAAABwAAAAkAAAAKAAAACgAAAAoAAAAKAAAACgAAAAoAAAAKAAAACgAAAAoAAAAKAAAACgAA + AAoAAAAKAAAACgAAAAoAAAAKAAAACgAAAAoAAAAKAAAACgAAAAoAAAAKAAAACgAAAAoAAAAKAAAACgAA + AAoAAAAKAAAACgAAAAoAAAAKAAAACgAAAAoAAAAKAAAACgAAAAoAAAAKAAAACQAAAAcAAAAEAAAAAgAA + AAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAoAAAAIAAAAEAAAAABACAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAABAAAAA4AAAAfAAAALQAAADQAAAA0AAAANAAAADQAAAA0AAAANAAAADQAAAA0AAAANAAA + ADQAAAA0AAAANAAAADQAAAA0AAAANAAAADQAAAA0AAAANAAAADQAAAA0AAAANAAAADQAAAA0AAAANAAA + ADIAAAApAAAAGQAAAAoAAAAMAAAAJAAAAEQAAABhAAAAawAAAGsAAABrAAAAawAAAGwAAABsAAAAbAAA + AGwAAABsAAAAbAAAAGwAAABsAAAAawAAAGsAAABrAAAAawAAAGsAAABrAAAAawAAAGsAAABrAAAAbAAA + AGwAAABsAAAAaAAAAFcAAAA7AAAAGgAAABcAAAA+ExMSkD07OKo7ODWpODUyqDczMKg1Mi+nNDEupzMw + LaczMC2nMzAtpzQxLqY2MzCnODUypzk2M6c5NzOoOjc0qDs3Nag7ODWoOzg1qDs4Nag7ODWoOzg1qDk3 + NKc4NTKnOTYypzs5Nqg5NzSuCQkJlwAAAFsAAAAuAAAAHAYGBmmCfHamr6adhbevp5GyqqKQraWdjami + mYumn5aKpJyUiaSalImkm5OJqJ+Xia6lnoq0qqOKta2li7WtpYy1rqaNtq6njbawpo22saeOt7Opj7mz + q4+8squPua+ojLWsp4u4rquNt62oiaiek3llYVysAAAAfAAAADoAAAAeEA8PdbClnqGF19nWY+Hn9mng + 5PZs3+L1cOHh9XXi3/V44t31e+La9X/j2PWE5Nf1iefX9ZDr2fWY8Nv1o/Tf9bL35PXB+un11Pzu9eX9 + 8vX2/fn1/v759fX99vXu/PL18P3e9fD9x/bu/bfzy860qIiBfp0AAACHAAAAPQAAAB4ODg1zvbGsrmza + 3uwp09b/MtLR/zTSzf8508r/PdTH/0HXxf9H3MX/UOPI/1rry/9m89D/c/vV/4P/3f+Z/+X/s//s/8f/ + 6v/P/9//yf7R/7z8yP+p/Lz/jfq+/5D9yf+f/8T/ufyk/8Dre//P17a/j4iIowAAAIYAAAA+AAAAHg4O + DXPAtK+xadjZ6yfR0f811tP/O9vV/0Hg1v9H5tf/T+vX/1fx1v9f99f/af3X/3L/1f96+8//f/XF/4Xx + uP+J7ar/humY/4Tmi/+I4oT/jN5//4/YfP+U0Hj/nc12/6HVfv+j4ob/p+SD/8/YvcGTjIumAAAAhgAA + AD4AAAAeDg4Nc8G2srNx4dzrMtzV/z/c0v9C3dD/RNvI/0jcwf9P377/V+O7/1zjtP9h3qn/Zdmd/2nW + kv9s1In/ctOC/37SgP9+y3X/fsJr/4G7Zf+Ft13/i7hY/5G9WP+Vv1r/nL5a/6W8Vf+uv1H/09S0w5SQ + kKgAAACFAAAAPgAAAB4ODg5zw7m1tW/RyewuxLb/PMq4/0PQvP9I0rj/TNCv/1PPqP9az6H/YdCZ/2fS + j/9u1In/c9OB/3bPd/99y3D/jcxw/4XEZP+Ewl//i8Vb/4vDX/+IvmP/h7Rd/4qpUP+PoEL/kpg4/5aQ + K//OyKrFmJWVqwAAAIUAAAA+AAAAHg4ODXPEura2ddTG7DjKs/9H0LX/Udi4/1netf9f4a7/aeWo/3bl + of994Zb/fNmH/3vPeP96x23/d79l/3q+af+Bwm//dbZY/3mrQ/94mzn/dY40/3eFLP94fiT/enoh/395 + IP+EeSD/inod/83FqcabmJisAAAAhQAAAD4AAAAeDg4Nc8W7uLiE4MztUNy6/1zfuP9j37X/Zdyq/2LP + lf9jwoP/arl4/2uxbf9kpWP/YJ1c/16aWP9fmlL/bKNM/3aiO/9tiCb/bH8j/258If91fh//en0e/3l4 + Hf95dRz/fHQd/4B2Hv+GdRr/zcWqx5yamq0AAACFAAAAPgAAAB4ODg5zxr27uYDOtu1DtY//R6mB/0ik + ef9LonP/S5pn/06UYP9aml//Yp5c/2CYVP9jmEv/ZJQ8/2aMK/93kyP/d40g/2l6Hf9ufRz/dX8b/36B + G/9/fxr/eXca/3hyGv96cRr/fXIb/4JxF//MxKrJnZubrwAAAIUAAAA+AAAAHg4ODnPHwL66draa7jiU + av9Bj2T/RJFj/0qWY/9Nk13/U5JV/2SdUf9xo0r/bpk8/2qNLf9mgSH/bH4b/3yNHf90hRv/bHoX/3SB + Fv97gxf/g4YX/4OBF/97dxf/d3EX/3hvF/96bhj/f20U/83FqsmfnJ2wAAAAhQAAAD4AAAAeDg4Oc8jB + wLx4sZHuO5Bd/0SJWP9IiVP/T45R/1aUTP9hl0X/dqM9/3ueMv9wjCT/cIUc/259Fv9wfhb/fY4Y/3WE + Fv9xfhT/fIUU/4CGFP+HiBX/hIEU/3x4E/94cRX/d24V/3htFf98axH/zMWqyqCenrEAAACFAAAAPgAA + AB4ODg5zyMLBvHuvhu5AjU3/SIJH/06GQv9bkj//aKA8/3CeMv96mif/e5Qf/3mLGf96hxb/cH4S/3aD + E/+GlRX/fIkT/3uEEv+DixH/hYkQ/4mKEf+DgRH/fXgQ/3t0Ev95bxP/eGwT/3pqDv/MxarLoZ6fsgAA + AIUAAAA+AAAAHg4ODnPJw8K9fat87kaMP/9XjTz/YJQ1/2qjMv9qmCn/bYkg/4CWHP+FlRr/gYwV/36I + Ev92gBD/gYwR/5CcE/+DjRD/hIwP/4iPEP+Jiw3/iYkO/4N/Dv9+eA7/gHcP/35yEP97bRH/e2sM/83G + qsyhn6CzAAAAhQAAAD4AAAAeDg4Oc8jCw76Dr3PuV5w0/2OcMv9lpCz/ZZAk/2d/Hf91ihr/ipkY/4yV + Gf+DixH/f4gO/3uDDf+LlA//lp4Q/4ePDf+LkQ7/i48O/46MC/+Khgv/gX0L/4F4DP+Ddw3/gXQO/35u + Dv9/bgr/z8mqzKGfoLMAAACFAAAAPgAAAB4ODg5zyMPEvomzbe5apyv/YqYs/1uAIP9kfRv/bYMZ/3yM + Fv+PmBT/jJIW/4OJDf+Bhgr/gIYK/5WaDf+ZnQ3/ipAL/5GVDP+Pjwr/ko0K/4uFCf+CfAj/gnkJ/4N3 + C/+Acwz/fm8L/4FyCP/QyqrNoZ+gswAAAIUAAAA+AAAAHg4ODnPJwsW+ib9r7leoJf9afyD/XHca/2iB + F/9wghT/gIwR/5CXD/+KjxH/hIcJ/4OGCP+FiQj/nJ4K/5mbCv+PkQn/lpYK/5OPCP+Tjgj/ioQH/4N8 + Bv+CeQf/gnYI/31yCf98cAn/g3YG/9DKqc2gnZ+1AAAAhQAAAD4AAAAeDg4Oc8nExr+Fr2TvUYYZ/1t+ + HP9ddxb/aX4S/3GBD/+Ciw3/kJUL/4mMD/+EhgX/g4UG/4qLBv+goQf/mZgH/5WTB/+WlAf/lZAG/5SN + Bv+Kggb/hHwE/4J5Bf9/dQb/enAH/3xxB/+EeAX/z8qozp+dn7UAAACEAAAAPgAAAB4ODg5zy8XHv4Ke + X+9ShhT/XH8Z/15zE/9oeg//cX4N/4GJCv+Okgv/iIoO/4ODA/+CgwX/j44F/6GhBv+XlAX/lpQG/5WR + Bf+XkAb/kYkG/4iABf+EfAP/gXgF/3tyBP92bgX/e3IG/4N6A//Py6fOn52ftQAAAIQAAAA+AAAAHg4O + DnPLxsjAg55d71OFEf9dfxb/XXER/2d3Df9vfAr/gIcI/4yQDP+Ghw3/gIEC/4GBBf+TkQX/oZ8G/5WQ + Bv+XkgX/lI4F/5aOBv+OhQX/hX0E/4N7BP9/dQX/dm8E/3JtBP93cwX/gXsB/87Kp8+fnZ+2AAAAhAAA + AD4AAAAeDg4Oc8zHycCDnFzvU4MN/11+FP9dbw//ZnQM/295Cf9+hQf/i40N/4OEDP9+fgL/gYAE/5eU + Bv+fmwb/k40G/5WPBf+Tigb/lIkG/4uCBf+EewT/gngE/31yBP9zbAP/cGwD/3ZzBP98eAD/ysemz5+d + n7cAAACEAAAAPgAAAB4ODg5zzcnKwYKaWe9TgQr/XX4R/1tsDP9jcgr/bXcH/32CBv+Jiw3/gIEM/3t7 + A/+CgAT/mpYF/5uVBv+Rigb/kYoF/5KHBv+QhAX/iX8E/4J3Bf9/dQT/eXAE/3BrBP9wbAP/dnQD/3Rx + AP/HxKbPoJ6gtwAAAIQAAAA+AAAAHg4ODnPPyszBgpdZ71B8B/9cfA//WmoL/2FvCP9sdQb/fIAE/4eI + Dv99fgz/eHgD/4KABP+blwX/lI8F/46GBf+NhAX/kIQF/4yABP+FewT/f3UE/31yBP91bQT/b2oD/29s + A/90cwP/a2gA/8XBptCgnqC3AAAAhAAAAD4AAAAeDg4Oc9HMzsGBlFbvTnYE/1x5Df9aaQn/X2wG/2py + Bv95fQP/hIUO/3l6C/91dQP/g4AE/5qWBf+OiAX/ioIE/4mABP+LgAT/iH0E/4F3BP9+cgT/eW8E/3Fr + A/9uagP/cG0D/29vAv9jXwD/w8Cm0KGeoLgAAACEAAAAPgAAAB4ODg5z0s7Pwn6RU/FKbgD/WXUH/1Vl + Bf9baAP/Z28B/3V4AP9/gQz/c3QF/3FwAP+DgAH/lZEB/4aAAf+CegH/hHsA/4Z7AP+DeQD/e3EA/3lv + Af9zawH/bGcA/2toAP9ubAD/aGYA/1pXAP/BvqXRop+guAAAAIQAAAA9AAAAGhAPD3HRzM69g5JZ7FNy + DP9hexT/Xm0S/2RvEf9vdg//e38O/4WHHf93ehP/eHgP/4yKEf+XkxH/iIIR/4R9EP+KgRD/ioAR/4d/ + EP+AdxD/fXYQ/3dyD/90cA7/dHEO/3V0D/9sag//X1wM/725o8qjoKG3AAAAgAAAADgAAAARCAgIX7e0 + sL3e3dK13NzOxd7ez8bd3M/G3t3Pxt/ez8bh3s/G4N3Pxd3azMLc2crB3drJv93ayb/c2Mm/3NjIv93Z + yb/d2crB3drKwd3YysHd2cvB3drMwtzYysLa1snD2dbIw9jVycTT0MTA19LMqoqHhbsAAABpAAAAKwAA + AAsAAAAqLy4tj3t5d698eXmte3h4rXt5eK17eXitenl4rXp4eK15d3eseHV2q3d1dap2dHSpdXN0qXZ0 + dKl3dHSodnR1qXd1dap3dXWqeHV2qnh2dqp5dnaqeHV1q3Z0dat2dHSsdnR0rHh2dqxubGqwGhkZiAAA + ADgAAAAaAAAABQAAAA4AAAAdAAAAMAAAADUAAAA1AAAANQAAADUAAAA1AAAANQAAADUAAAA1AAAANQAA + ADUAAAA1AAAANQAAADYAAAA1AAAANQAAADUAAAA1AAAANQAAADUAAAA1AAAANQAAADUAAAA1AAAANQAA + ADQAAAAlAAAAGAAAAAsAAAABAAAAAwAAAAYAAAAKAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAA + AAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAA + AAwAAAAMAAAADAAAAAoAAAAGAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKAAAABgAAAAwAAAAAQAgAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAcAAAAaAAAAMQAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAA + ADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADgAAAAnAAAADwAAABUAAABKDAsKhg8N + DI8ODAuODQsKjg0LCo4MCwqODAsKjg0LCo4NCwuODQwLjg4MC44ODAyODgwMjg0MDI4NDAyODQwMjg0M + C44MDAuODg0NjwkJCY4AAABhAAAAKgAAACYyMC6KmpSMnKGclZ2alY6blZGKmZKOhpeQi4SXkYqEl5WO + iJeclZCYoJmTmJ+ak5mgm5SaoJ2UmqKelZumn5mbq5+bm6ebl5mkmpeZpZyYlo+Hf5YgHx6XAAAAQgAA + AC9kWVWRm9nZy1vg5fRi3t/0Zt7c9Gze2fNw3tXzdeHT833l0/OH7NbzlPPb86f55PTB/O702v/y9Oj/ + 8/Tv//P04f/u9Nj/6/Pj/8706Puu8svNtKc9OjuaAAAASgAAAC5pXVqVid3d4CPS1P8x1ND/ONjP/z/d + z/9I5c//VO7S/2L41v9y/9j/gP/Y/5T91P+k+sr/qPa3/6TyqP+b757/jOmb/5Ppo/+j8qH/seyH/87T + ub1APD6aAAAASgAAAC1qXluWjuHd4C/a1P8/3NL/RN7O/0rgyP9U5MP/XOe9/2Tlsf9q4KT/btuU/3XY + if99037/fMpv/4LDaP+KwGH/ksBd/5m/Wv+hwFv/rMhg/9HSub5BPkCcAAAASQAAAC1rYF6XkNnR4S/H + t/9Bzrn/SdO3/1DTrv9c1qb/Z9ec/27Wjv901IH/d890/4LLcP+IyG3/gcBc/4a7VP+EtFb/g6pR/4ie + RP+NlDb/lo4t/87HrsFDQkSdAAAASQAAAC1rYF+YmuDS4kXXuf9Y3rv/YuO2/2XepP9v15T/d82F/3K+ + c/9ts2b/aqxe/3SyXv91qUv/cZQy/3GHKv92gCT/eHke/3l1HP9/dRz/iXgf/87Hr8NFREaeAAAASQAA + AC1rYmKZn9vI40a+l/9OtIn/Ua5//0+hbf9Wm2L/YZ5e/2CYVP9glEj/Y441/3aWKP9wgx7/a3oc/3V+ + G/9+gBr/enga/3hyGv97cRr/hHQc/87HsMVFRUafAAAASQAAACxtZmaalsWu5DeQZP9CjGD/SZJf/06R + WP9dmFD/cqJI/26VNv9phSP/bX4a/3qLG/9vfhj/c38W/36EF/+FhRf/fXkW/3dwF/94bhb/gHAX/8/I + scZHRkifAAAASQAAACxtZ2ibmcKl5TyLUv9Hg0z/Uo1I/2GaQ/9ynjf/fJsp/3WKHP9ygRb/cn8U/3+P + Fv91ghP/fYcT/4WJEv+HhhP/fnoS/3lxE/93bRP/fG0U/8/IssdHRkifAAAASQAAACxtZ2mbnL+b5UWK + Pv9YjDr/Zp40/2uXKv92kR//g5Ua/4GMFf94gxH/fYkR/4yYE/+BihD/h44Q/4mLDv+GhA7/f3kO/391 + EP97bhD/fW0R/9DJsslHR0mgAAAASQAAACxsZ2ucosKS5lidMP9joS3/ZI8k/2mBG/+Bkhf/jZYY/4OK + EP98hAz/ipIO/5ObD/+Ijw3/jZEN/46LC/+GgQr/gXkL/4N3Df9/cAz/gXEO/9HMsslHR0mgAAAASQAA + ACxtZ2ycpsqN5linJv9bgyD/Y3sZ/3GEFv+JkxL/jpMT/4OIC/+AhQn/lJgL/5aaC/+Pkwv/k5EJ/5GM + Cf+GgAj/gnkI/4J2Cv99cAn/g3UL/9LMsspHRkmhAAAASAAAACxtaG2do8WJ5lGJGf9beBn/ZnwT/3SD + D/+KkQz/jI8O/4SFBv+Ehgb/m5wH/5iYB/+VlAf/lZEH/5KLBv+GfwX/gnkF/390B/96bwb/hXkJ/9HM + sMtHRkmhAAAASAAAACxuaW6dobWE51GDEf9cdxX/ZngQ/3SADP+Ijgr/iowN/4GCBP+HhwX/np0F/5eU + Bv+Wkwb/lo8G/4+HBv+FfQT/gXkE/3lwBP92bwT/hHsH/9HNr8xGRkmhAAAASAAAACxuam6dorWD51KC + Df9cdhP/ZHQN/3J9Cf+Hiwn/h4gN/35/A/+KiQX/n5wG/5WQBv+VjgX/lYsG/4uCBf+DewT/f3UE/3Nt + A/9zbwP/gHsG/87Lr8xGRkmiAAAASAAAACxva2+dorSB51J/Cf9cdA//YXAL/3F6B/+FiAn/hIQN/3t7 + A/+OiwT/nJgG/5KLBv+SiQb/kYYF/4h+BP+BdwX/e3EE/3BrA/9ybwL/eHYE/8vIr81HRkmiAAAASAAA + ACxwbXGeorGB51B6BP9bcg3/X2wI/293Bv+ChQj/f4AN/3h4A/+QjAT/lpEF/42FBf+OgwX/jIEE/4R5 + BP9+cwT/dm0E/29qA/9xbwL/b2wD/8jFr81IR0miAAAASAAAACxyb3Keoa5+6UtwAP9YbQb/WmcD/2px + AP99fwT/eHkJ/3NyAP+OiwH/jogB/4R8AP+HfQD/hXsA/31yAP94bgD/b2kA/2xoAP9tawD/Yl8A/8bD + rs9IR0mjAAAASAAAACl0cXScprGE41Z1D/9idhb/ZG8U/3R6Ef+Ehhj/fn8Z/3x8Ev+WkxP/jokT/4eA + E/+NgxP/ioET/4N6E/99dhL/dnIR/3d0Ef9zchH/ZmMP/sbCsMlLSkuiAAAARAAAABhKSEeN09HJw9DR + w8rR0MPK0dDDy9PRw8rU0cPK0c7Bx8/MvsXQzb3E0My9xM/MvcTQzL3F0c2+xdDMvsbQzb/Gz8y/x83K + vcjMyb3Jyse8xsK+uLwtLSyQAAAALgAAAAgAAAAyJCMjbSwrLHErKitwKyorcCoqK3AqKStwKSkqcCko + Km8oKCpvKSgqbykoKm8pKCpvKSgqbykpKm8qKSpvKikqcCkoKnApKCpwKyoscR0cHG8AAAA6AAAAFAAA + AAIAAAAFAAAACAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAA + AAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAsAAAAKAAAABAAAAEEAAABBAAAAQQAAAEEAAABBAAAAQQAA + AEEAAABBAAAAQQAAAEEAAABBAAAAQQAAAEEAAABBAAAAQQAAAEEAAABBAAAAQQAAAEEAAABBAAAAQQAA + AEEAAABBAAAAQSgAAAAUAAAAKAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKAAAAJgAA + AEMAAABIAAAARwAAAEcAAABHAAAARwAAAEcAAABHAAAARwAAAEcAAABHAAAARwAAAEcAAABHAAAARwAA + AEcAAAA0AAAAFQAAACIWFRN0PzUxlDwwLJI4LSqQNiwokDUqJ481KiiPOC4rkDowLpA5MS6RODEvkTcx + L5E1Mi+RNjIvkTQwLpA0MDCQNjIylRAPDoQAAAA5AAAAPXd1cJyfzsy9k8rIxZLGwsOTxL7BlMG6wZjD + usGhyr/BqtHEwrTWycPC2c/D0dzTxN7e2MTg3tnE2NvRwtvbwcPS0bOsX1xYnAAAAFYAAAA9jI+Mqk/h + 5v8w2Nn/O9zW/0Tg1f9O6NT/XPLX/2382v+A/9//nP/j/7b/3v/B/8//vf3D/6f5vf+n+8L/vP+m/9Pv + qOh1b3CeAAAAVwAAADyNkI2tUuHd+jbZ0v9B3c//SeDJ/1XmxP9g6r3/auix/3Hhof973ZH/gNZ//3/N + b/+Gx2f/jsVj/5jEYv+gyF//xdeT5nh0daIAAABWAAAAPI6Rjq5X1cf6Pc66/0zXuv9V2a//ZNqk/27Y + lP9z04L/dsxy/4HJcP+CwmX/gbdR/4KtTv+Bo0n/hpc8/4uJJ/+4rm3nfHp7pQAAAFYAAAA8kZOQsGvg + xvpT17H/X9ep/2DMkv9rwYD/bbVw/2eoYf9lolT/c6hL/3CVM/9vgyX/dX4g/3h4HP95chv/fG8T/7Gj + aOh/fX6nAAAAVgAAADySlJCyYruZ+0Gccf9Jmmv/TJJf/1yYV/9om03/ZI86/2iGJf94jB3/bXsY/3R/ + GP+Agxn/fXoY/3dxGf93axD/rqFm6YB/gKgAAABVAAAAPJKUj7Nfpnv7QIVS/02MT/9cl0n/c6A7/3eV + Kv9wgxr/cH4V/3uLF/90gBT/f4YU/4eHFP9/exP/eHAU/3NnC/+rnmPqgoCCqQAAAFUAAAA8kpOPs2aj + Z/tPiTz/Ypo2/2yXK/98lR//gpAY/3uFEv97hxH/iJUS/4GKEf+IjA//iIcO/4B7Dv99dBD/dmgH/6uf + YeqDgYOqAAAAVQAAADyTk4+0da9X+1+gLP9kjiP/bYMa/4mVF/+JkBT/foUM/4mQDv+SmQ7/ipAN/4+O + DP+KhQr/gXkL/4N2DP96awP/rqNg6oOBg6sAAABVAAAAPJSVj7V2uE37WIcd/2J6F/91hhP/jZUR/4iM + Dv+BhQf/k5YJ/5eZCv+Tkwn/lI8I/4qDB/+Cegf/gXUJ/3lsAP+xp17rgoCDrAAAAFUAAAA8lJSPtXCd + QfxYexX/ZHkS/3eDDf+MkQz/hogJ/4SEBf+amgb/mZcG/5aTBv+Vjgb/iYEF/4J6BP97cQX/d20A/7Gq + XOuBgIOtAAAAVQAAADyVlJC1cZg8/Fl7Ef9jdA7/dX8J/4qNDP+Cgwj/hIQE/52aBv+XkgX/lY8F/5KJ + Bv+GfgT/gHYE/3RtBP9zbgD/r6pa7IGAg64AAABVAAAAPJaVkLZxlTj8WXkM/2BvC/9zfAf/h4oM/35/ + B/+GhAP/nJcG/5OMBv+TiQb/jYMF/4N5Bf98cgT/cGsD/3BtAP+no1nsgoCDrgAAAFUAAAA8l5aStm+P + NPxXdgj/XmsI/3F4Bf+EhQv/eXkH/4eFBP+XkgX/jIQF/42DBf+IfQT/f3QE/3ZuBP9vawP/a2oA/56a + WOyCgIOuAAAAVQAAADyZmJS4ZYIm/01qAP9TYAD/Z24A/3h6AP9tbQD/goAA/4qDAP9+dgD/gngA/3tx + AP90aQD/amMA/2dlAP9dWwD/kY5P8ISDha8AAABVAAAAM5eVkbGyvY7jo7B16aasd+mwsnXouLd66LCv + dOa8uXPlvLdz5beyc+W7tHPmt7F05rOudOavq3Pmrqty56akcei/u5vWe3l5rQAAAEgAAAASKikoaG5r + bpFtam6PbGptj2tpbY9pZ2yOaGZqjGZkaYtmZGmLZ2Vqi2dlaoxoZmuMaWdrjGlna41nZmqNaWdrjmVj + ZJAdHBtrAAAAHwAAAAMAAAAJAAAAFQAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAA + ABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAAA4AAAAGAAAAQQAAAEEAAABBAAAAQQAAAEEAAABBAAAAQQAA + AEEAAABBAAAAQQAAAEEAAABBAAAAQQAAAEEAAABBAAAAQQAAAEEAAABBAAAAQQAAAEEoAAAAEAAAACAA + AAABACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEQAAAEAAAABXAAAAVQAAAFUAAABVAAAAVQAA + AFUAAABVAAAAVQAAAFUAAABVAAAAVQAAAFcAAABMAAAAHwQEBD5WVFCVc3JuoWpqZp5nZ2KdZmRgnGpo + Y51wbmmdcXBrnnRybZ95dHGffnRzn3txb558dXCdTUpFmAABAVQXDg1Qj7m4w1jj5vRe3tv0ZuHY9G/n + 1vN/8tr0k/zi9LH/6vTP/+n02//i9M//3fTK/9n03/+58qenk68DAQRlGQ8OToS7uc8u29f/OtvP/0Xg + yf9U6sX/Ze69/3Lrrv+C5Z7/idyI/4rUd/+Mzm//ls5v/6/YdP+lp5O7BAIGYhkPEE+KubLQP9bB/1Db + vf9b3K3/a9mb/3HQhP9yxnD/fcRq/322VP9+p0b/gJtA/4WOMf+ZkDP/pJ+MvQUFCGMYEBJPkbqu0U7K + pP9WwJL/WbN7/2asa/9moVn/ZZdE/3OYNP9tgiH/dX0c/3p4Gf93bxf/insl/6SejcAFBgljGRMWUI6r + m9M+kWL/R4tX/1aUT/9vnUH/bo0q/22AGf93hhf/c34V/4KGFf+AfRb/dm4U/4V3If+ln47BBgYJYxkU + GFCQqJHUS41G/12UOv9tmC7/gJYe/3yIFP96hRH/hJAS/4KKEP+Jig//gX0P/3txD/+Edhz/paCPwwYG + CWMYFBlQlqyJ1F6jMP9jjSL/c4cY/4yVFf+BiA7/iI8N/5GYDf+NkQz/jYkK/4J7Cv+BdAr/iXoX/6ei + j8QGBgljGBQaUJeuhdVYjx//YngV/3uIEP+Nkg7/g4UI/5OVB/+YmQj/lZII/4+IBv+DegX/fXIF/4p+ + E/+no47FBgYJYxkWG1CVo4HVV4IV/2J1EP96hAr/iowL/4KCBP+YlgX/mJUG/5aQBf+MhAX/gngE/3Zu + A/+HgBH/pqONxgYGCWMZFhxQlqJ/1liAD/9gcAz/d38I/4aHC/+AgAT/mZUG/5SNBv+SiAb/iH0E/31z + BP9wawH/gH4P/6OhjMYGBgpjGhcdUJagftdTdwb/W2oF/3J4Av99fgj/fXsA/5OOAf+KggH/in4B/4B1 + AP91bAD/bWkA/3RyCf+gnYzIBwcKZBoYHVGhqIrWZoIc/216Hf+Bhhv/iYoh/42LGv+blhv/koob/5SK + G/+LgRv/gXsa/357F/98eiL/paKUxwcHCmMGBgcxenl0oJydkbaZmI20mpmNtZmXjLOYloiwmJaIsJiV + iLCZlomxmZWKsZiVirKWlImzmZeNtGpoZp0BAQE9AAAABQAAAB4AAAAqAAAAKQAAACkAAAApAAAAKQAA + ACkAAAApAAAAKQAAACkAAAApAAAAKQAAACsAAAAjAAAACgAArEEAAKxBAACsQQAArEEAAKxBAACsQQAA + rEEAAKxBAACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQAArEE= + + \ No newline at end of file diff --git a/OnTopReplica/StartupOptions/Factory.cs b/src/OnTopReplica/StartupOptions/Factory.cs similarity index 97% rename from OnTopReplica/StartupOptions/Factory.cs rename to src/OnTopReplica/StartupOptions/Factory.cs index 2016035..d977c30 100644 --- a/OnTopReplica/StartupOptions/Factory.cs +++ b/src/OnTopReplica/StartupOptions/Factory.cs @@ -1,150 +1,150 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Drawing; -using System.ComponentModel; -using OnTopReplica.Properties; -using OnTopReplica.WindowSeekers; -using System.Windows.Forms; - -namespace OnTopReplica.StartupOptions { - class Factory { - - static Factory() { - //Custom type conversion attributes - TypeDescriptor.AddAttributes(typeof(Size), new TypeConverterAttribute(typeof(SizeConverter))); - TypeDescriptor.AddAttributes(typeof(ScreenPosition), new TypeConverterAttribute(typeof(ScreenPositionConverter))); - TypeDescriptor.AddAttributes(typeof(Rectangle), new TypeConverterAttribute(typeof(RectangleConverter))); - TypeDescriptor.AddAttributes(typeof(Padding), new TypeConverterAttribute(typeof(PaddingConverter))); - } - - public static Options CreateOptions(string[] args) { - var options = new Options(); - - LoadSettings(options); - - ParseCommandLine(args, options); - - return options; - } - - private static void LoadSettings(Options options) { - if (Settings.Default.RestoreSizeAndPosition) { - options.StartLocation = Settings.Default.RestoreLastPosition; - options.StartSize = Settings.Default.RestoreLastSize; - options.DisableChrome = !Settings.Default.RestoreLastShowChrome; - - Log.Write("Restoring window at {0} size {1} {2}", Settings.Default.RestoreLastPosition, Settings.Default.RestoreLastSize, - (Settings.Default.RestoreLastShowChrome) ? "with chrome" : "without chrome"); - } - - if (Settings.Default.RestoreLastWindow) { - var handle = Settings.Default.RestoreLastWindowHwnd; - var title = Settings.Default.RestoreLastWindowTitle; - var className = Settings.Default.RestoreLastWindowClass; - - var seeker = new RestoreWindowSeeker(new IntPtr(handle), title, className); - seeker.SkipNotVisibleWindows = true; - seeker.Refresh(); - - var resultHandle = seeker.Windows.FirstOrDefault(); - - if (resultHandle != null) { - //Found a window: load it! - options.WindowId = resultHandle.Handle; - } - else { - Log.WriteDetails("Failed to find window to restore from last use", - "HWND {0}, Title '{1}', Class '{2}'", - Settings.Default.RestoreLastWindowHwnd, - Settings.Default.RestoreLastWindowTitle, - Settings.Default.RestoreLastWindowClass - ); - } - } - } - - private static void ParseCommandLine(string[] args, Options options) { - var cmdOptions = new NDesk.Options.OptionSet() - .Add("windowId=", "Window handle ({HWND}) to be cloned.", id => { - options.WindowId = new IntPtr(id); - options.WindowTitle = null; - options.WindowClass = null; - }) - .Add("windowTitle=", "Partial {TITLE} of the window to be cloned.", s => { - options.WindowId = null; - options.WindowTitle = s; - options.WindowClass = null; - }) - .Add("windowClass=", "{CLASS} of the window to be cloned.", s => { - options.WindowId = null; - options.WindowTitle = null; - options.WindowClass = s; - }) - .Add("v|visible", "If set, only clones windows that are visible.", s => { - options.MustBeVisible = true; - }) - .Add("size=", "Target {WIDTH,HEIGHT} of the cloned thumbnail, or", s => { - options.StartSize = s; - }) - .Add("width=", "Target WIDTH of cloned thumbnail, or", i => { - if (options.StartSize.HasValue || options.StartHeight.HasValue) - return; - options.StartWidth = i; - }) - .Add("height=", "Target HEIGHT of cloned thumbnail.", i => { - if (options.StartSize.HasValue || options.StartWidth.HasValue) - return; - options.StartHeight = i; - }) - .Add("position=", "Target {X,Y} of the OnTopReplica window.", s => { - options.StartLocation = new Point(s.Width, s.Height); - options.StartPositionLock = null; - }) - .Add("screenPosition=", "Resolution independent window position on current screen, with locking. Values: {TR|TL|C|BR|BL}.", pos => { - options.StartLocation = null; - options.StartPositionLock = pos; - }) - .Add("r|region=", "Region {X,Y,W,H} of the cloned window.", region => { - options.Region = new ThumbnailRegion(region); - }) - .Add("p|padding=", "Region padding {LEFT,TOP,RIGHT,BOTTOM} of the clone.", padding => { - options.Region = new ThumbnailRegion(padding); - }) - .Add("o|opacity=", "Opacity of the window: {0-255}.", opacity => { - options.Opacity = opacity; - }) - .Add("clickForwarding", "Enables click forwarding.", s => { - options.EnableClickForwarding = true; - }) - .Add("clickThrough", "Enables click through.", s => { - options.EnableClickThrough = true; - }) - .Add("chromeOff", "Disables the window's chrome (border).", s => { - options.DisableChrome = true; - }) - .Add("fs|fullscreen", "Starts up in fullscreen mode.", s => { - options.Fullscreen = true; - }) - .Add("h|help|?", "Show command line help.", s => { - options.Status = CliStatus.Information; - }); - - List values; - try { - values = cmdOptions.Parse(args); - } - catch (NDesk.Options.OptionException ex) { - options.DebugMessageWriter.WriteLine(ex.Message); - options.DebugMessageWriter.WriteLine("Try 'OnTopReplica /help' for more information."); - options.Status = CliStatus.Error; - } - - if (options.Status == CliStatus.Information) { - cmdOptions.WriteOptionDescriptions(options.DebugMessageWriter); - } - } - - } -} +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Drawing; +using System.ComponentModel; +using OnTopReplica.Properties; +using OnTopReplica.WindowSeekers; +using System.Windows.Forms; + +namespace OnTopReplica.StartupOptions { + class Factory { + + static Factory() { + //Custom type conversion attributes + TypeDescriptor.AddAttributes(typeof(Size), new TypeConverterAttribute(typeof(SizeConverter))); + TypeDescriptor.AddAttributes(typeof(ScreenPosition), new TypeConverterAttribute(typeof(ScreenPositionConverter))); + TypeDescriptor.AddAttributes(typeof(Rectangle), new TypeConverterAttribute(typeof(RectangleConverter))); + TypeDescriptor.AddAttributes(typeof(Padding), new TypeConverterAttribute(typeof(PaddingConverter))); + } + + public static Options CreateOptions(string[] args) { + var options = new Options(); + + LoadSettings(options); + + ParseCommandLine(args, options); + + return options; + } + + private static void LoadSettings(Options options) { + if (Settings.Default.RestoreSizeAndPosition) { + options.StartLocation = Settings.Default.RestoreLastPosition; + options.StartSize = Settings.Default.RestoreLastSize; + options.DisableChrome = !Settings.Default.RestoreLastShowChrome; + + Log.Write("Restoring window at {0} size {1} {2}", Settings.Default.RestoreLastPosition, Settings.Default.RestoreLastSize, + (Settings.Default.RestoreLastShowChrome) ? "with chrome" : "without chrome"); + } + + if (Settings.Default.RestoreLastWindow) { + var handle = Settings.Default.RestoreLastWindowHwnd; + var title = Settings.Default.RestoreLastWindowTitle; + var className = Settings.Default.RestoreLastWindowClass; + + var seeker = new RestoreWindowSeeker(new IntPtr(handle), title, className); + seeker.SkipNotVisibleWindows = true; + seeker.Refresh(); + + var resultHandle = seeker.Windows.FirstOrDefault(); + + if (resultHandle != null) { + //Found a window: load it! + options.WindowId = resultHandle.Handle; + } + else { + Log.WriteDetails("Failed to find window to restore from last use", + "HWND {0}, Title '{1}', Class '{2}'", + Settings.Default.RestoreLastWindowHwnd, + Settings.Default.RestoreLastWindowTitle, + Settings.Default.RestoreLastWindowClass + ); + } + } + } + + private static void ParseCommandLine(string[] args, Options options) { + var cmdOptions = new NDesk.Options.OptionSet() + .Add("windowId=", "Window handle ({HWND}) to be cloned.", id => { + options.WindowId = new IntPtr(id); + options.WindowTitle = null; + options.WindowClass = null; + }) + .Add("windowTitle=", "Partial {TITLE} of the window to be cloned.", s => { + options.WindowId = null; + options.WindowTitle = s; + options.WindowClass = null; + }) + .Add("windowClass=", "{CLASS} of the window to be cloned.", s => { + options.WindowId = null; + options.WindowTitle = null; + options.WindowClass = s; + }) + .Add("v|visible", "If set, only clones windows that are visible.", s => { + options.MustBeVisible = true; + }) + .Add("size=", "Target {WIDTH,HEIGHT} of the cloned thumbnail, or", s => { + options.StartSize = s; + }) + .Add("width=", "Target WIDTH of cloned thumbnail, or", i => { + if (options.StartSize.HasValue || options.StartHeight.HasValue) + return; + options.StartWidth = i; + }) + .Add("height=", "Target HEIGHT of cloned thumbnail.", i => { + if (options.StartSize.HasValue || options.StartWidth.HasValue) + return; + options.StartHeight = i; + }) + .Add("position=", "Target {X,Y} of the OnTopReplica window.", s => { + options.StartLocation = new Point(s.Width, s.Height); + options.StartPositionLock = null; + }) + .Add("screenPosition=", "Resolution independent window position on current screen, with locking. Values: {TR|TL|C|BR|BL}.", pos => { + options.StartLocation = null; + options.StartPositionLock = pos; + }) + .Add("r|region=", "Region {X,Y,W,H} of the cloned window.", region => { + options.Region = new ThumbnailRegion(region); + }) + .Add("p|padding=", "Region padding {LEFT,TOP,RIGHT,BOTTOM} of the clone.", padding => { + options.Region = new ThumbnailRegion(padding); + }) + .Add("o|opacity=", "Opacity of the window: {0-255}.", opacity => { + options.Opacity = opacity; + }) + .Add("clickForwarding", "Enables click forwarding.", s => { + options.EnableClickForwarding = true; + }) + .Add("clickThrough", "Enables click through.", s => { + options.EnableClickThrough = true; + }) + .Add("chromeOff", "Disables the window's chrome (border).", s => { + options.DisableChrome = true; + }) + .Add("fs|fullscreen", "Starts up in fullscreen mode.", s => { + options.Fullscreen = true; + }) + .Add("h|help|?", "Show command line help.", s => { + options.Status = CliStatus.Information; + }); + + List values; + try { + values = cmdOptions.Parse(args); + } + catch (NDesk.Options.OptionException ex) { + options.DebugMessageWriter.WriteLine(ex.Message); + options.DebugMessageWriter.WriteLine("Try 'OnTopReplica /help' for more information."); + options.Status = CliStatus.Error; + } + + if (options.Status == CliStatus.Information) { + cmdOptions.WriteOptionDescriptions(options.DebugMessageWriter); + } + } + + } +} diff --git a/OnTopReplica/StartupOptions/FourValueTypeConverter.cs b/src/OnTopReplica/StartupOptions/FourValueTypeConverter.cs similarity index 97% rename from OnTopReplica/StartupOptions/FourValueTypeConverter.cs rename to src/OnTopReplica/StartupOptions/FourValueTypeConverter.cs index 17029d4..f5c3529 100644 --- a/OnTopReplica/StartupOptions/FourValueTypeConverter.cs +++ b/src/OnTopReplica/StartupOptions/FourValueTypeConverter.cs @@ -1,71 +1,71 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.ComponentModel; -using System.Text.RegularExpressions; - -namespace OnTopReplica.StartupOptions { - abstract class FourValueTypeConverter : TypeConverter { - - public override object ConvertFrom(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value) { - if (value != null) { - var sVal = value.ToString(); - return Convert(sVal); - } - else - return base.ConvertFrom(context, culture, value); - } - - public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType) { - return sourceType == typeof(string); - } - - public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType) { - return destinationType == typeof(T); - } - - public override object ConvertTo(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value, Type destinationType) { - if (value != null && destinationType == typeof(T)) { - var sVal = value.ToString(); - return Convert(sVal); - } - else - return base.ConvertTo(context, culture, value, destinationType); - } - - static Regex _sizeRegex = new Regex("^\\D*(?\\d*)\\s*,\\s*(?\\d*)\\s*,\\s*(?\\d*)\\s*,\\s*(?\\d*)\\D*$", - RegexOptions.Compiled | RegexOptions.CultureInvariant | RegexOptions.Singleline); - - private T Convert(string s) { - var match = _sizeRegex.Match(s); - - var v1 = match.Groups["one"]; - var v2 = match.Groups["two"]; - var v3 = match.Groups["three"]; - var v4 = match.Groups["four"]; - - if (match.Success && v1.Success && v2.Success && v3.Success && v4.Success) { - int v1v, v2v, v3v, v4v; - bool v1b, v2b, v3b, v4b; - v1b = Int32.TryParse(v1.Value, out v1v); - v2b = Int32.TryParse(v2.Value, out v2v); - v3b = Int32.TryParse(v3.Value, out v3v); - v4b = Int32.TryParse(v4.Value, out v4v); - - if (v1b && v2b && v3b && v4b) { - return CreateValue(v1v, v2v, v3v, v4v); - } - else { - throw new ArgumentException("Argument '" + s + "' contains a non numeric value."); - } - } - else { - throw new ArgumentException("Argument '" + s + "' is in the wrong format."); - } - } - - protected abstract T CreateValue(int v1, int v2, int v3, int v4); - - } -} +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.ComponentModel; +using System.Text.RegularExpressions; + +namespace OnTopReplica.StartupOptions { + abstract class FourValueTypeConverter : TypeConverter { + + public override object ConvertFrom(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value) { + if (value != null) { + var sVal = value.ToString(); + return Convert(sVal); + } + else + return base.ConvertFrom(context, culture, value); + } + + public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType) { + return sourceType == typeof(string); + } + + public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType) { + return destinationType == typeof(T); + } + + public override object ConvertTo(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value, Type destinationType) { + if (value != null && destinationType == typeof(T)) { + var sVal = value.ToString(); + return Convert(sVal); + } + else + return base.ConvertTo(context, culture, value, destinationType); + } + + static Regex _sizeRegex = new Regex("^\\D*(?\\d*)\\s*,\\s*(?\\d*)\\s*,\\s*(?\\d*)\\s*,\\s*(?\\d*)\\D*$", + RegexOptions.Compiled | RegexOptions.CultureInvariant | RegexOptions.Singleline); + + private T Convert(string s) { + var match = _sizeRegex.Match(s); + + var v1 = match.Groups["one"]; + var v2 = match.Groups["two"]; + var v3 = match.Groups["three"]; + var v4 = match.Groups["four"]; + + if (match.Success && v1.Success && v2.Success && v3.Success && v4.Success) { + int v1v, v2v, v3v, v4v; + bool v1b, v2b, v3b, v4b; + v1b = Int32.TryParse(v1.Value, out v1v); + v2b = Int32.TryParse(v2.Value, out v2v); + v3b = Int32.TryParse(v3.Value, out v3v); + v4b = Int32.TryParse(v4.Value, out v4v); + + if (v1b && v2b && v3b && v4b) { + return CreateValue(v1v, v2v, v3v, v4v); + } + else { + throw new ArgumentException("Argument '" + s + "' contains a non numeric value."); + } + } + else { + throw new ArgumentException("Argument '" + s + "' is in the wrong format."); + } + } + + protected abstract T CreateValue(int v1, int v2, int v3, int v4); + + } +} diff --git a/OnTopReplica/StartupOptions/Options.cs b/src/OnTopReplica/StartupOptions/Options.cs similarity index 96% rename from OnTopReplica/StartupOptions/Options.cs rename to src/OnTopReplica/StartupOptions/Options.cs index 06bf472..03d8a51 100644 --- a/OnTopReplica/StartupOptions/Options.cs +++ b/src/OnTopReplica/StartupOptions/Options.cs @@ -1,183 +1,183 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Drawing; -using System.IO; -using OnTopReplica.WindowSeekers; - -namespace OnTopReplica.StartupOptions { - - /// - /// Represents startup options that can be set via CLI scripting (or other stuff). - /// - class Options { - - public Options() { - Status = CliStatus.Ok; - Opacity = 255; - DisableChrome = false; - MustBeVisible = false; - Fullscreen = false; - } - - #region Position and size - - public Point? StartLocation { get; set; } - - public ScreenPosition? StartPositionLock { get; set; } - - public Size? StartSize { get; set; } - - public int? StartWidth { get; set; } - - public int? StartHeight { get; set; } - - #endregion - - #region Window cloning - - public IntPtr? WindowId { get; set; } - - public string WindowTitle { get; set; } - - public string WindowClass { get; set; } - - public ThumbnailRegion Region { get; set; } - - public bool MustBeVisible { get; set; } - - #endregion - - #region Options - - public bool EnableClickForwarding { get; set; } - - public bool EnableClickThrough { get; set; } - - public byte Opacity { get; set; } - - public bool DisableChrome { get; set; } - - public bool Fullscreen { get; set; } - - #endregion - - #region Debug info - - StringBuilder _sb = new StringBuilder(); - TextWriter _sbWriter; - - public CliStatus Status { get; set; } - - /// - /// Gets a debug message writer. - /// - public TextWriter DebugMessageWriter { - get { - if (_sbWriter == null) { - _sbWriter = new StringWriter(_sb); - } - return _sbWriter; - } - } - - /// - /// Gets the debug message. - /// - public string DebugMessage { - get { - if(_sbWriter != null) - _sbWriter.Flush(); - return _sb.ToString(); - } - } - - #endregion - - #region Application - - public void Apply(MainForm form) { - Log.Write("Applying command line launch parameters"); - - form.Opacity = (double)Opacity / 255.0; - - //Seek handle for thumbnail cloning - WindowHandle handle = null; - if (WindowId.HasValue) { - handle = WindowHandle.FromHandle(WindowId.Value); - } - else if (WindowTitle != null) { - var seeker = new ByTitleWindowSeeker(WindowTitle) { - OwnerHandle = form.Handle, - SkipNotVisibleWindows = MustBeVisible - }; - seeker.Refresh(); - - handle = seeker.Windows.FirstOrDefault(); - } - else if (WindowClass != null) { - var seeker = new ByClassWindowSeeker(WindowClass) { - OwnerHandle = form.Handle, - SkipNotVisibleWindows = MustBeVisible - }; - seeker.Refresh(); - - handle = seeker.Windows.FirstOrDefault(); - } - - if (StartPositionLock.HasValue) { - form.PositionLock = StartPositionLock.Value; - } - - //Clone any found handle (this applies thumbnail and aspect ratio) - if (handle != null) { - form.SetThumbnail(handle, Region); - } - - //Adaptive size handling - if (!StartSize.HasValue && (StartWidth.HasValue || StartHeight.HasValue)) { - if (StartWidth.HasValue) { - StartSize = new Size(StartWidth.Value, form.ComputeHeightFromWidth(StartWidth.Value)); - } - else { - StartSize = new Size(form.ComputeWidthFromHeight(StartHeight.Value), StartHeight.Value); - } - } - - //Size and location start values - if (StartLocation.HasValue && StartSize.HasValue) { - form.StartPosition = System.Windows.Forms.FormStartPosition.Manual; - form.Location = StartLocation.Value; - form.ClientSize = StartSize.Value; - } - else if (StartLocation.HasValue) { - form.StartPosition = System.Windows.Forms.FormStartPosition.WindowsDefaultBounds; - form.Location = StartLocation.Value; - } - else if (StartSize.HasValue) { - form.StartPosition = System.Windows.Forms.FormStartPosition.WindowsDefaultLocation; - form.ClientSize = StartSize.Value; - } - - //Other features - if (EnableClickForwarding) { - form.ClickForwardingEnabled = true; - } - if (EnableClickThrough) { - form.ClickThroughEnabled = true; - } - - form.IsChromeVisible = !DisableChrome; - - //Fullscreen - if (Fullscreen) { - form.FullscreenManager.SwitchFullscreen(); - } - } - - #endregion - - } - -} +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Drawing; +using System.IO; +using OnTopReplica.WindowSeekers; + +namespace OnTopReplica.StartupOptions { + + /// + /// Represents startup options that can be set via CLI scripting (or other stuff). + /// + class Options { + + public Options() { + Status = CliStatus.Ok; + Opacity = 255; + DisableChrome = false; + MustBeVisible = false; + Fullscreen = false; + } + + #region Position and size + + public Point? StartLocation { get; set; } + + public ScreenPosition? StartPositionLock { get; set; } + + public Size? StartSize { get; set; } + + public int? StartWidth { get; set; } + + public int? StartHeight { get; set; } + + #endregion + + #region Window cloning + + public IntPtr? WindowId { get; set; } + + public string WindowTitle { get; set; } + + public string WindowClass { get; set; } + + public ThumbnailRegion Region { get; set; } + + public bool MustBeVisible { get; set; } + + #endregion + + #region Options + + public bool EnableClickForwarding { get; set; } + + public bool EnableClickThrough { get; set; } + + public byte Opacity { get; set; } + + public bool DisableChrome { get; set; } + + public bool Fullscreen { get; set; } + + #endregion + + #region Debug info + + StringBuilder _sb = new StringBuilder(); + TextWriter _sbWriter; + + public CliStatus Status { get; set; } + + /// + /// Gets a debug message writer. + /// + public TextWriter DebugMessageWriter { + get { + if (_sbWriter == null) { + _sbWriter = new StringWriter(_sb); + } + return _sbWriter; + } + } + + /// + /// Gets the debug message. + /// + public string DebugMessage { + get { + if(_sbWriter != null) + _sbWriter.Flush(); + return _sb.ToString(); + } + } + + #endregion + + #region Application + + public void Apply(MainForm form) { + Log.Write("Applying command line launch parameters"); + + form.Opacity = (double)Opacity / 255.0; + + //Seek handle for thumbnail cloning + WindowHandle handle = null; + if (WindowId.HasValue) { + handle = WindowHandle.FromHandle(WindowId.Value); + } + else if (WindowTitle != null) { + var seeker = new ByTitleWindowSeeker(WindowTitle) { + OwnerHandle = form.Handle, + SkipNotVisibleWindows = MustBeVisible + }; + seeker.Refresh(); + + handle = seeker.Windows.FirstOrDefault(); + } + else if (WindowClass != null) { + var seeker = new ByClassWindowSeeker(WindowClass) { + OwnerHandle = form.Handle, + SkipNotVisibleWindows = MustBeVisible + }; + seeker.Refresh(); + + handle = seeker.Windows.FirstOrDefault(); + } + + if (StartPositionLock.HasValue) { + form.PositionLock = StartPositionLock.Value; + } + + //Clone any found handle (this applies thumbnail and aspect ratio) + if (handle != null) { + form.SetThumbnail(handle, Region); + } + + //Adaptive size handling + if (!StartSize.HasValue && (StartWidth.HasValue || StartHeight.HasValue)) { + if (StartWidth.HasValue) { + StartSize = new Size(StartWidth.Value, form.ComputeHeightFromWidth(StartWidth.Value)); + } + else { + StartSize = new Size(form.ComputeWidthFromHeight(StartHeight.Value), StartHeight.Value); + } + } + + //Size and location start values + if (StartLocation.HasValue && StartSize.HasValue) { + form.StartPosition = System.Windows.Forms.FormStartPosition.Manual; + form.Location = StartLocation.Value; + form.ClientSize = StartSize.Value; + } + else if (StartLocation.HasValue) { + form.StartPosition = System.Windows.Forms.FormStartPosition.WindowsDefaultBounds; + form.Location = StartLocation.Value; + } + else if (StartSize.HasValue) { + form.StartPosition = System.Windows.Forms.FormStartPosition.WindowsDefaultLocation; + form.ClientSize = StartSize.Value; + } + + //Other features + if (EnableClickForwarding) { + form.ClickForwardingEnabled = true; + } + if (EnableClickThrough) { + form.ClickThroughEnabled = true; + } + + form.IsChromeVisible = !DisableChrome; + + //Fullscreen + if (Fullscreen) { + form.FullscreenManager.SwitchFullscreen(); + } + } + + #endregion + + } + +} diff --git a/OnTopReplica/StartupOptions/PaddingConverter.cs b/src/OnTopReplica/StartupOptions/PaddingConverter.cs similarity index 96% rename from OnTopReplica/StartupOptions/PaddingConverter.cs rename to src/OnTopReplica/StartupOptions/PaddingConverter.cs index 777394f..ce717b7 100644 --- a/OnTopReplica/StartupOptions/PaddingConverter.cs +++ b/src/OnTopReplica/StartupOptions/PaddingConverter.cs @@ -1,21 +1,21 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.ComponentModel; -using System.Windows.Forms; - -namespace OnTopReplica.StartupOptions { - class PaddingConverter : FourValueTypeConverter { - - protected override Padding CreateValue(int v1, int v2, int v3, int v4) { - return new Padding { - Left = v1, - Top = v2, - Right = v3, - Bottom = v4 - }; - } - - } -} +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.ComponentModel; +using System.Windows.Forms; + +namespace OnTopReplica.StartupOptions { + class PaddingConverter : FourValueTypeConverter { + + protected override Padding CreateValue(int v1, int v2, int v3, int v4) { + return new Padding { + Left = v1, + Top = v2, + Right = v3, + Bottom = v4 + }; + } + + } +} diff --git a/OnTopReplica/StartupOptions/RectangleConverter.cs b/src/OnTopReplica/StartupOptions/RectangleConverter.cs similarity index 95% rename from OnTopReplica/StartupOptions/RectangleConverter.cs rename to src/OnTopReplica/StartupOptions/RectangleConverter.cs index 624fee1..5b08fb3 100644 --- a/OnTopReplica/StartupOptions/RectangleConverter.cs +++ b/src/OnTopReplica/StartupOptions/RectangleConverter.cs @@ -1,23 +1,23 @@ -using System; -using System.Collections.Generic; -using System.Text; -using System.ComponentModel; -using System.Drawing; -using System.Text.RegularExpressions; - -namespace OnTopReplica.StartupOptions { - - class RectangleConverter : FourValueTypeConverter { - - protected override Rectangle CreateValue(int v1, int v2, int v3, int v4) { - return new Rectangle { - X = v1, - Y = v2, - Width = v3, - Height = v4 - }; - } - - } - -} +using System; +using System.Collections.Generic; +using System.Text; +using System.ComponentModel; +using System.Drawing; +using System.Text.RegularExpressions; + +namespace OnTopReplica.StartupOptions { + + class RectangleConverter : FourValueTypeConverter { + + protected override Rectangle CreateValue(int v1, int v2, int v3, int v4) { + return new Rectangle { + X = v1, + Y = v2, + Width = v3, + Height = v4 + }; + } + + } + +} diff --git a/OnTopReplica/StartupOptions/ScreenPositionConverter.cs b/src/OnTopReplica/StartupOptions/ScreenPositionConverter.cs similarity index 97% rename from OnTopReplica/StartupOptions/ScreenPositionConverter.cs rename to src/OnTopReplica/StartupOptions/ScreenPositionConverter.cs index 18ca1a5..dc2a865 100644 --- a/OnTopReplica/StartupOptions/ScreenPositionConverter.cs +++ b/src/OnTopReplica/StartupOptions/ScreenPositionConverter.cs @@ -1,50 +1,50 @@ -using System; -using System.Collections.Generic; -using System.Text; -using System.ComponentModel; - -namespace OnTopReplica.StartupOptions { - class ScreenPositionConverter : TypeConverter { - - public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType) { - if (sourceType == typeof(string)) - return true; - - return base.CanConvertFrom(context, sourceType); - } - - public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType) { - if (destinationType == typeof(ScreenPosition)) - return true; - - return base.CanConvertTo(context, destinationType); - } - - public override object ConvertFrom(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value) { - var sValue = value.ToString(); - - switch (sValue) { - case "TL": - return ScreenPosition.TopLeft; - case "TR": - return ScreenPosition.TopRight; - case "BL": - return ScreenPosition.BottomLeft; - case "BR": - return ScreenPosition.BottomRight; - case "C": - return ScreenPosition.Center; - default: - throw new ArgumentException("Invalid screen position value '" + sValue + "'."); - } - } - - public override object ConvertTo(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value, Type destinationType) { - if (destinationType == typeof(ScreenPosition)) - return ConvertFrom(context, culture, value); - - return base.ConvertTo(context, culture, value, destinationType); - } - - } -} +using System; +using System.Collections.Generic; +using System.Text; +using System.ComponentModel; + +namespace OnTopReplica.StartupOptions { + class ScreenPositionConverter : TypeConverter { + + public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType) { + if (sourceType == typeof(string)) + return true; + + return base.CanConvertFrom(context, sourceType); + } + + public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType) { + if (destinationType == typeof(ScreenPosition)) + return true; + + return base.CanConvertTo(context, destinationType); + } + + public override object ConvertFrom(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value) { + var sValue = value.ToString(); + + switch (sValue) { + case "TL": + return ScreenPosition.TopLeft; + case "TR": + return ScreenPosition.TopRight; + case "BL": + return ScreenPosition.BottomLeft; + case "BR": + return ScreenPosition.BottomRight; + case "C": + return ScreenPosition.Center; + default: + throw new ArgumentException("Invalid screen position value '" + sValue + "'."); + } + } + + public override object ConvertTo(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value, Type destinationType) { + if (destinationType == typeof(ScreenPosition)) + return ConvertFrom(context, culture, value); + + return base.ConvertTo(context, culture, value, destinationType); + } + + } +} diff --git a/OnTopReplica/StartupOptions/SizeConverter.cs b/src/OnTopReplica/StartupOptions/SizeConverter.cs similarity index 97% rename from OnTopReplica/StartupOptions/SizeConverter.cs rename to src/OnTopReplica/StartupOptions/SizeConverter.cs index 9dd018e..ca72dc4 100644 --- a/OnTopReplica/StartupOptions/SizeConverter.cs +++ b/src/OnTopReplica/StartupOptions/SizeConverter.cs @@ -1,69 +1,69 @@ -using System; -using System.Collections.Generic; -using System.Text; -using System.ComponentModel; -using System.Drawing; -using System.Text.RegularExpressions; - -namespace OnTopReplica.StartupOptions { - - class SizeConverter : TypeConverter { - - public override object ConvertFrom(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value) { - if (value != null) { - var sVal = value.ToString(); - return StringToSize(sVal); - } - else - return base.ConvertFrom(context, culture, value); - } - - public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType) { - return (sourceType == typeof(string) || sourceType == typeof(Size)); - } - - public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType) { - return (destinationType == typeof(Size) || destinationType == typeof(string)); - } - - public override object ConvertTo(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value, Type destinationType) { - if (value == null) - return base.ConvertTo(context, culture, value, destinationType); - - if (destinationType == typeof(Size)) { - var sVal = value.ToString(); - return StringToSize(sVal); - } - else if (destinationType == typeof(string)) { - if (value is Size) { - Size sValue = (Size)value; - return string.Format("{0}, {1}", sValue.Width, sValue.Height); - } - - return value.ToString(); - } - else - return base.ConvertTo(context, culture, value, destinationType); - } - - static Regex _sizeRegex = new Regex("^\\D*(?\\d*)\\s*,\\s*(?\\d*)\\D*$", - RegexOptions.Compiled | RegexOptions.CultureInvariant | RegexOptions.Singleline); - - private Size StringToSize(string s) { - var match = _sizeRegex.Match(s); - - var x = match.Groups["x"]; - var y = match.Groups["y"]; - - if (!match.Success || !x.Success || !y.Success) - throw new ArgumentException("Cannot convert '" + s + "' to coordinates pair."); - - var xVal = Int32.Parse(x.Value); - var yVal = Int32.Parse(y.Value); - - return new Size(xVal, yVal); - } - - } - -} +using System; +using System.Collections.Generic; +using System.Text; +using System.ComponentModel; +using System.Drawing; +using System.Text.RegularExpressions; + +namespace OnTopReplica.StartupOptions { + + class SizeConverter : TypeConverter { + + public override object ConvertFrom(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value) { + if (value != null) { + var sVal = value.ToString(); + return StringToSize(sVal); + } + else + return base.ConvertFrom(context, culture, value); + } + + public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType) { + return (sourceType == typeof(string) || sourceType == typeof(Size)); + } + + public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType) { + return (destinationType == typeof(Size) || destinationType == typeof(string)); + } + + public override object ConvertTo(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value, Type destinationType) { + if (value == null) + return base.ConvertTo(context, culture, value, destinationType); + + if (destinationType == typeof(Size)) { + var sVal = value.ToString(); + return StringToSize(sVal); + } + else if (destinationType == typeof(string)) { + if (value is Size) { + Size sValue = (Size)value; + return string.Format("{0}, {1}", sValue.Width, sValue.Height); + } + + return value.ToString(); + } + else + return base.ConvertTo(context, culture, value, destinationType); + } + + static Regex _sizeRegex = new Regex("^\\D*(?\\d*)\\s*,\\s*(?\\d*)\\D*$", + RegexOptions.Compiled | RegexOptions.CultureInvariant | RegexOptions.Singleline); + + private Size StringToSize(string s) { + var match = _sizeRegex.Match(s); + + var x = match.Groups["x"]; + var y = match.Groups["y"]; + + if (!match.Success || !x.Success || !y.Success) + throw new ArgumentException("Cannot convert '" + s + "' to coordinates pair."); + + var xVal = Int32.Parse(x.Value); + var yVal = Int32.Parse(y.Value); + + return new Size(xVal, yVal); + } + + } + +} diff --git a/OnTopReplica/StoredRegion.cs b/src/OnTopReplica/StoredRegion.cs similarity index 93% rename from OnTopReplica/StoredRegion.cs rename to src/OnTopReplica/StoredRegion.cs index d2d6894..9d537aa 100644 --- a/OnTopReplica/StoredRegion.cs +++ b/src/OnTopReplica/StoredRegion.cs @@ -1,32 +1,32 @@ -using System; -using System.Collections.Generic; -using System.Text; -using System.Xml.Serialization; -using System.Drawing; - -namespace OnTopReplica { - - public class StoredRegion { - - public StoredRegion(ThumbnailRegion r, string name) { - Region = r; - Name = name; - } - - public ThumbnailRegion Region { - get; - set; - } - - public string Name { - get; - set; - } - - public override string ToString() { - return Name; - } - - } - -} +using System; +using System.Collections.Generic; +using System.Text; +using System.Xml.Serialization; +using System.Drawing; + +namespace OnTopReplica { + + public class StoredRegion { + + public StoredRegion(ThumbnailRegion r, string name) { + Region = r; + Name = name; + } + + public ThumbnailRegion Region { + get; + set; + } + + public string Name { + get; + set; + } + + public override string ToString() { + return Name; + } + + } + +} diff --git a/OnTopReplica/StoredRegionArray.cs b/src/OnTopReplica/StoredRegionArray.cs similarity index 97% rename from OnTopReplica/StoredRegionArray.cs rename to src/OnTopReplica/StoredRegionArray.cs index f140178..e4f6426 100644 --- a/OnTopReplica/StoredRegionArray.cs +++ b/src/OnTopReplica/StoredRegionArray.cs @@ -1,147 +1,147 @@ -using System; -using System.Collections.Generic; -using System.Text; -using System.Collections; -using System.Xml.Serialization; -using System.Xml; -using System.Xml.Linq; - -namespace OnTopReplica { - - /// - /// Strongly styped array of StoredRegion elements. - /// - /// - /// Handles XML serialization. - /// - public class StoredRegionArray : List, IXmlSerializable { - - #region IXmlSerializable Members - - public System.Xml.Schema.XmlSchema GetSchema() { - return null; - } - - public void ReadXml(System.Xml.XmlReader reader) { - this.Clear(); - - var doc = XDocument.Load(reader); - foreach (var xmlRegion in doc.Descendants("StoredRegion")) { - System.Diagnostics.Debug.WriteLine(string.Format("Found region '{0}'.", xmlRegion.Attribute("name"))); - - StoredRegion parsedRegion = ParseStoredRegion(xmlRegion); - if (parsedRegion != null) { - this.Add(parsedRegion); - } - } - } - - private StoredRegion ParseStoredRegion(XElement xmlRegion) { - var xName = xmlRegion.Attribute("name"); - if (xName == null || string.IsNullOrWhiteSpace(xName.Value)) { - System.Diagnostics.Debug.Fail("Parsed stored region has no name attribute."); - return null; - } - - ThumbnailRegion region = ParseRegion(xmlRegion); - if (region == null) { - System.Diagnostics.Debug.Fail("Parsed stored region has no valid region."); - return null; - } - - return new StoredRegion(region, xName.Value); - } - - private ThumbnailRegion ParseRegion(XElement xmlRegion) { - var xRectangle = xmlRegion.Element("Rectangle"); - if (xRectangle != null) { - System.Drawing.Rectangle rectangle = ParseRectangle(xRectangle); - return new ThumbnailRegion(rectangle); - } - - var xPadding = xmlRegion.Element("Padding"); - if (xPadding != null) { - System.Windows.Forms.Padding padding = ParsePadding(xPadding); - return new ThumbnailRegion(padding); - } - - return null; - } - - private System.Windows.Forms.Padding ParsePadding(XElement xPadding) { - var p = new System.Windows.Forms.Padding(); - try { - p.Left = Int32.Parse(xPadding.Element("Left").Value); - p.Top = Int32.Parse(xPadding.Element("Top").Value); - p.Right = Int32.Parse(xPadding.Element("Right").Value); - p.Bottom = Int32.Parse(xPadding.Element("Bottom").Value); - } - catch (Exception ex) { - System.Diagnostics.Debug.Fail("Failure while parsing padding data.", ex.ToString()); - } - return p; - } - - private System.Drawing.Rectangle ParseRectangle(XElement xRectangle) { - var r = new System.Drawing.Rectangle(); - try { - r.X = Int32.Parse(xRectangle.Element("X").Value); - r.Y = Int32.Parse(xRectangle.Element("Y").Value); - r.Width = Int32.Parse(xRectangle.Element("Width").Value); - r.Height = Int32.Parse(xRectangle.Element("Height").Value); - } - catch (Exception ex) { - System.Diagnostics.Debug.Fail("Failure while parsing rectangle data.", ex.ToString()); - } - return r; - } - - public void WriteXml(System.Xml.XmlWriter writer) { - foreach (var region in this) { - WriteRegion(writer, region); - } - } - - private void WriteRegion(XmlWriter writer, StoredRegion region) { - writer.WriteStartElement("StoredRegion"); - writer.WriteAttributeString("name", region.Name); - - if (region.Region.Relative) { - WriteRelativeRegion(writer, region); - } - else { - WriteAbsoluteRegion(writer, region); - } - - writer.WriteEndElement(); - } - - private void WriteAbsoluteRegion(XmlWriter writer, StoredRegion region) { - writer.WriteStartElement("Rectangle"); - - var bounds = region.Region.Bounds; - writer.WriteElementString("X", bounds.X.ToString()); - writer.WriteElementString("Y", bounds.Y.ToString()); - writer.WriteElementString("Width", bounds.Width.ToString()); - writer.WriteElementString("Height", bounds.Height.ToString()); - - writer.WriteEndElement(); - } - - private void WriteRelativeRegion(XmlWriter writer, StoredRegion region) { - writer.WriteStartElement("Padding"); - - var padding = region.Region.BoundsAsPadding; - writer.WriteElementString("Left", padding.Left.ToString()); - writer.WriteElementString("Top", padding.Top.ToString()); - writer.WriteElementString("Right", padding.Right.ToString()); - writer.WriteElementString("Bottom", padding.Bottom.ToString()); - - writer.WriteEndElement(); - } - - #endregion - - } - -} +using System; +using System.Collections.Generic; +using System.Text; +using System.Collections; +using System.Xml.Serialization; +using System.Xml; +using System.Xml.Linq; + +namespace OnTopReplica { + + /// + /// Strongly styped array of StoredRegion elements. + /// + /// + /// Handles XML serialization. + /// + public class StoredRegionArray : List, IXmlSerializable { + + #region IXmlSerializable Members + + public System.Xml.Schema.XmlSchema GetSchema() { + return null; + } + + public void ReadXml(System.Xml.XmlReader reader) { + this.Clear(); + + var doc = XDocument.Load(reader); + foreach (var xmlRegion in doc.Descendants("StoredRegion")) { + System.Diagnostics.Debug.WriteLine(string.Format("Found region '{0}'.", xmlRegion.Attribute("name"))); + + StoredRegion parsedRegion = ParseStoredRegion(xmlRegion); + if (parsedRegion != null) { + this.Add(parsedRegion); + } + } + } + + private StoredRegion ParseStoredRegion(XElement xmlRegion) { + var xName = xmlRegion.Attribute("name"); + if (xName == null || string.IsNullOrWhiteSpace(xName.Value)) { + System.Diagnostics.Debug.Fail("Parsed stored region has no name attribute."); + return null; + } + + ThumbnailRegion region = ParseRegion(xmlRegion); + if (region == null) { + System.Diagnostics.Debug.Fail("Parsed stored region has no valid region."); + return null; + } + + return new StoredRegion(region, xName.Value); + } + + private ThumbnailRegion ParseRegion(XElement xmlRegion) { + var xRectangle = xmlRegion.Element("Rectangle"); + if (xRectangle != null) { + System.Drawing.Rectangle rectangle = ParseRectangle(xRectangle); + return new ThumbnailRegion(rectangle); + } + + var xPadding = xmlRegion.Element("Padding"); + if (xPadding != null) { + System.Windows.Forms.Padding padding = ParsePadding(xPadding); + return new ThumbnailRegion(padding); + } + + return null; + } + + private System.Windows.Forms.Padding ParsePadding(XElement xPadding) { + var p = new System.Windows.Forms.Padding(); + try { + p.Left = Int32.Parse(xPadding.Element("Left").Value); + p.Top = Int32.Parse(xPadding.Element("Top").Value); + p.Right = Int32.Parse(xPadding.Element("Right").Value); + p.Bottom = Int32.Parse(xPadding.Element("Bottom").Value); + } + catch (Exception ex) { + System.Diagnostics.Debug.Fail("Failure while parsing padding data.", ex.ToString()); + } + return p; + } + + private System.Drawing.Rectangle ParseRectangle(XElement xRectangle) { + var r = new System.Drawing.Rectangle(); + try { + r.X = Int32.Parse(xRectangle.Element("X").Value); + r.Y = Int32.Parse(xRectangle.Element("Y").Value); + r.Width = Int32.Parse(xRectangle.Element("Width").Value); + r.Height = Int32.Parse(xRectangle.Element("Height").Value); + } + catch (Exception ex) { + System.Diagnostics.Debug.Fail("Failure while parsing rectangle data.", ex.ToString()); + } + return r; + } + + public void WriteXml(System.Xml.XmlWriter writer) { + foreach (var region in this) { + WriteRegion(writer, region); + } + } + + private void WriteRegion(XmlWriter writer, StoredRegion region) { + writer.WriteStartElement("StoredRegion"); + writer.WriteAttributeString("name", region.Name); + + if (region.Region.Relative) { + WriteRelativeRegion(writer, region); + } + else { + WriteAbsoluteRegion(writer, region); + } + + writer.WriteEndElement(); + } + + private void WriteAbsoluteRegion(XmlWriter writer, StoredRegion region) { + writer.WriteStartElement("Rectangle"); + + var bounds = region.Region.Bounds; + writer.WriteElementString("X", bounds.X.ToString()); + writer.WriteElementString("Y", bounds.Y.ToString()); + writer.WriteElementString("Width", bounds.Width.ToString()); + writer.WriteElementString("Height", bounds.Height.ToString()); + + writer.WriteEndElement(); + } + + private void WriteRelativeRegion(XmlWriter writer, StoredRegion region) { + writer.WriteStartElement("Padding"); + + var padding = region.Region.BoundsAsPadding; + writer.WriteElementString("Left", padding.Left.ToString()); + writer.WriteElementString("Top", padding.Top.ToString()); + writer.WriteElementString("Right", padding.Right.ToString()); + writer.WriteElementString("Bottom", padding.Bottom.ToString()); + + writer.WriteEndElement(); + } + + #endregion + + } + +} diff --git a/OnTopReplica/StoredRegionComparer.cs b/src/OnTopReplica/StoredRegionComparer.cs similarity index 95% rename from OnTopReplica/StoredRegionComparer.cs rename to src/OnTopReplica/StoredRegionComparer.cs index cfc9438..cffd61e 100644 --- a/OnTopReplica/StoredRegionComparer.cs +++ b/src/OnTopReplica/StoredRegionComparer.cs @@ -1,28 +1,28 @@ -using System; -using System.Collections.Generic; -using System.Text; -using System.Collections; - -namespace OnTopReplica { - - /// - /// Compares two StoredRegions based on their name. - /// - class StoredRegionComparer : IComparer { - - #region IComparer Members - - public int Compare(object x, object y) { - StoredRegion a = x as StoredRegion; - StoredRegion b = y as StoredRegion; - - if (a == null || b == null) - return -1; //this is wrong, but anyway - - return a.Name.CompareTo(b.Name); - } - - #endregion - - } -} +using System; +using System.Collections.Generic; +using System.Text; +using System.Collections; + +namespace OnTopReplica { + + /// + /// Compares two StoredRegions based on their name. + /// + class StoredRegionComparer : IComparer { + + #region IComparer Members + + public int Compare(object x, object y) { + StoredRegion a = x as StoredRegion; + StoredRegion b = y as StoredRegion; + + if (a == null || b == null) + return -1; //this is wrong, but anyway + + return a.Name.CompareTo(b.Name); + } + + #endregion + + } +} diff --git a/OnTopReplica/Strings.Designer.cs b/src/OnTopReplica/Strings.Designer.cs similarity index 97% rename from OnTopReplica/Strings.Designer.cs rename to src/OnTopReplica/Strings.Designer.cs index cd692e9..aa45401 100644 --- a/OnTopReplica/Strings.Designer.cs +++ b/src/OnTopReplica/Strings.Designer.cs @@ -1,1644 +1,1644 @@ -//------------------------------------------------------------------------------ -// -// 這段程式碼是由工具產生的。 -// 執行階段版本:4.0.30319.42000 -// -// 對這個檔案所做的變更可能會造成錯誤的行為,而且如果重新產生程式碼, -// 變更將會遺失。 -// -//------------------------------------------------------------------------------ - -namespace OnTopReplica { - using System; - - - /// - /// 用於查詢當地語系化字串等的強類型資源類別。 - /// - // 這個類別是自動產生的,是利用 StronglyTypedResourceBuilder - // 類別透過 ResGen 或 Visual Studio 這類工具。 - // 若要加入或移除成員,請編輯您的 .ResX 檔,然後重新執行 ResGen - // (利用 /str 選項),或重建您的 VS 專案。 - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "15.0.0.0")] - [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] - [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - internal class Strings { - - private static global::System.Resources.ResourceManager resourceMan; - - private static global::System.Globalization.CultureInfo resourceCulture; - - [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] - internal Strings() { - } - - /// - /// 傳回這個類別使用的快取的 ResourceManager 執行個體。 - /// - [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] - internal static global::System.Resources.ResourceManager ResourceManager { - get { - if (object.ReferenceEquals(resourceMan, null)) { - global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("OnTopReplica.Strings", typeof(Strings).Assembly); - resourceMan = temp; - } - return resourceMan; - } - } - - /// - /// 覆寫目前執行緒的 CurrentUICulture 屬性,對象是所有 - /// 使用這個強類型資源類別的資源查閱。 - /// - [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] - internal static global::System.Globalization.CultureInfo Culture { - get { - return resourceCulture; - } - set { - resourceCulture = value; - } - } - - /// - /// 查詢類似 Created by: %. 的當地語系化字串。 - /// - internal static string AboutAuthor { - get { - return ResourceManager.GetString("AboutAuthor", resourceCulture); - } - } - - /// - /// 查詢類似 Lorenz Cuno Klopfenstein 的當地語系化字串。 - /// - internal static string AboutAuthorContent { - get { - return ResourceManager.GetString("AboutAuthorContent", resourceCulture); - } - } - - /// - /// 查詢類似 Abort update process. 的當地語系化字串。 - /// - internal static string AboutButtonCancelTT { - get { - return ResourceManager.GetString("AboutButtonCancelTT", resourceCulture); - } - } - - /// - /// 查詢類似 Show details about OnTopReplica. 的當地語系化字串。 - /// - internal static string AboutButtonExpanderTT { - get { - return ResourceManager.GetString("AboutButtonExpanderTT", resourceCulture); - } - } - - /// - /// 查詢類似 Reset all OnTopReplica settings. 的當地語系化字串。 - /// - internal static string AboutButtonResetTT { - get { - return ResourceManager.GetString("AboutButtonResetTT", resourceCulture); - } - } - - /// - /// 查詢類似 Update OnTopReplica now. 的當地語系化字串。 - /// - internal static string AboutButtonUpdateTT { - get { - return ResourceManager.GetString("AboutButtonUpdateTT", resourceCulture); - } - } - - /// - /// 查詢類似 Care to contribute to the project? You are welcome to improve available translations, start a new one for your native language or to check out the % from CodePlex. 的當地語系化字串。 - /// - internal static string AboutContribute { - get { - return ResourceManager.GetString("AboutContribute", resourceCulture); - } - } - - /// - /// 查詢類似 source code 的當地語系化字串。 - /// - internal static string AboutContributeContent { - get { - return ResourceManager.GetString("AboutContributeContent", resourceCulture); - } - } - - /// - /// 查詢類似 OnTopReplica is based upon the WindowsFormsAero library and some other libraries and code sources. %. 的當地語系化字串。 - /// - internal static string AboutCreditsSources { - get { - return ResourceManager.GetString("AboutCreditsSources", resourceCulture); - } - } - - /// - /// 查詢類似 Read the full credits 的當地語系化字串。 - /// - internal static string AboutCreditsSourcesContent { - get { - return ResourceManager.GetString("AboutCreditsSourcesContent", resourceCulture); - } - } - - /// - /// 查詢類似 Contribute 的當地語系化字串。 - /// - internal static string AboutDividerContribute { - get { - return ResourceManager.GetString("AboutDividerContribute", resourceCulture); - } - } - - /// - /// 查詢類似 Credits 的當地語系化字串。 - /// - internal static string AboutDividerCredits { - get { - return ResourceManager.GetString("AboutDividerCredits", resourceCulture); - } - } - - /// - /// 查詢類似 License 的當地語系化字串。 - /// - internal static string AboutDividerLicense { - get { - return ResourceManager.GetString("AboutDividerLicense", resourceCulture); - } - } - - /// - /// 查詢類似 Updates 的當地語系化字串。 - /// - internal static string AboutDividerUpdates { - get { - return ResourceManager.GetString("AboutDividerUpdates", resourceCulture); - } - } - - /// - /// 查詢類似 The application is licensed under the % license, which meets the terms of the "open-source" definition specified by OSI. 的當地語系化字串。 - /// - internal static string AboutLicense { - get { - return ResourceManager.GetString("AboutLicense", resourceCulture); - } - } - - /// - /// 查詢類似 Microsoft Reciprocal (MS-RL) 的當地語系化字串。 - /// - internal static string AboutLicenseContent { - get { - return ResourceManager.GetString("AboutLicenseContent", resourceCulture); - } - } - - /// - /// 查詢類似 A lightweight, real-time, always on top thumbnail of a window of your choice. 的當地語系化字串。 - /// - internal static string AboutSlogan { - get { - return ResourceManager.GetString("AboutSlogan", resourceCulture); - } - } - - /// - /// 查詢類似 About OnTopReplica 的當地語系化字串。 - /// - internal static string AboutTitle { - get { - return ResourceManager.GetString("AboutTitle", resourceCulture); - } - } - - /// - /// 查詢類似 Translators: {0} 的當地語系化字串。 - /// - internal static string AboutTranslators { - get { - return ResourceManager.GetString("AboutTranslators", resourceCulture); - } - } - - /// - /// 查詢類似 Christian Olaechea M., Daniel Zeus.EX, Federico Lorenzo, Goran Brecelj, Jan Romanczyk, Marco Kraxner, Patrik (batupata), Raúl Morillo, René Mihula, Roberto Leiro, Rodrigo Lourenço, Thomas Amundsen, Eric Hoffmann. 的當地語系化字串。 - /// - internal static string AboutTranslatorsContent { - get { - return ResourceManager.GetString("AboutTranslatorsContent", resourceCulture); - } - } - - /// - /// 查詢類似 Check now! 的當地語系化字串。 - /// - internal static string AboutUpdatesCheckNow { - get { - return ResourceManager.GetString("AboutUpdatesCheckNow", resourceCulture); - } - } - - /// - /// 查詢類似 OnTopReplica automatically checks for updates at every start up. 的當地語系化字串。 - /// - internal static string AboutUpdatesDisclaimer { - get { - return ResourceManager.GetString("AboutUpdatesDisclaimer", resourceCulture); - } - } - - /// - /// 查詢類似 Version {0} 的當地語系化字串。 - /// - internal static string AboutVersion { - get { - return ResourceManager.GetString("AboutVersion", resourceCulture); - } - } - - /// - /// 查詢類似 OnTopReplica 的當地語系化字串。 - /// - internal static string ApplicationName { - get { - return ResourceManager.GetString("ApplicationName", resourceCulture); - } - } - - /// - /// 查詢類似 Reset window completely? 的當地語系化字串。 - /// - internal static string AskReset { - get { - return ResourceManager.GetString("AskReset", resourceCulture); - } - } - - /// +//------------------------------------------------------------------------------ +// +// 這段程式碼是由工具產生的。 +// 執行階段版本:4.0.30319.42000 +// +// 對這個檔案所做的變更可能會造成錯誤的行為,而且如果重新產生程式碼, +// 變更將會遺失。 +// +//------------------------------------------------------------------------------ + +namespace OnTopReplica { + using System; + + + /// + /// 用於查詢當地語系化字串等的強類型資源類別。 + /// + // 這個類別是自動產生的,是利用 StronglyTypedResourceBuilder + // 類別透過 ResGen 或 Visual Studio 這類工具。 + // 若要加入或移除成員,請編輯您的 .ResX 檔,然後重新執行 ResGen + // (利用 /str 選項),或重建您的 VS 專案。 + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "15.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Strings { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Strings() { + } + + /// + /// 傳回這個類別使用的快取的 ResourceManager 執行個體。 + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("OnTopReplica.Strings", typeof(Strings).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// 覆寫目前執行緒的 CurrentUICulture 屬性,對象是所有 + /// 使用這個強類型資源類別的資源查閱。 + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + + /// + /// 查詢類似 Created by: %. 的當地語系化字串。 + /// + internal static string AboutAuthor { + get { + return ResourceManager.GetString("AboutAuthor", resourceCulture); + } + } + + /// + /// 查詢類似 Lorenz Cuno Klopfenstein 的當地語系化字串。 + /// + internal static string AboutAuthorContent { + get { + return ResourceManager.GetString("AboutAuthorContent", resourceCulture); + } + } + + /// + /// 查詢類似 Abort update process. 的當地語系化字串。 + /// + internal static string AboutButtonCancelTT { + get { + return ResourceManager.GetString("AboutButtonCancelTT", resourceCulture); + } + } + + /// + /// 查詢類似 Show details about OnTopReplica. 的當地語系化字串。 + /// + internal static string AboutButtonExpanderTT { + get { + return ResourceManager.GetString("AboutButtonExpanderTT", resourceCulture); + } + } + + /// + /// 查詢類似 Reset all OnTopReplica settings. 的當地語系化字串。 + /// + internal static string AboutButtonResetTT { + get { + return ResourceManager.GetString("AboutButtonResetTT", resourceCulture); + } + } + + /// + /// 查詢類似 Update OnTopReplica now. 的當地語系化字串。 + /// + internal static string AboutButtonUpdateTT { + get { + return ResourceManager.GetString("AboutButtonUpdateTT", resourceCulture); + } + } + + /// + /// 查詢類似 Care to contribute to the project? You are welcome to improve available translations, start a new one for your native language or to check out the % from CodePlex. 的當地語系化字串。 + /// + internal static string AboutContribute { + get { + return ResourceManager.GetString("AboutContribute", resourceCulture); + } + } + + /// + /// 查詢類似 source code 的當地語系化字串。 + /// + internal static string AboutContributeContent { + get { + return ResourceManager.GetString("AboutContributeContent", resourceCulture); + } + } + + /// + /// 查詢類似 OnTopReplica is based upon the WindowsFormsAero library and some other libraries and code sources. %. 的當地語系化字串。 + /// + internal static string AboutCreditsSources { + get { + return ResourceManager.GetString("AboutCreditsSources", resourceCulture); + } + } + + /// + /// 查詢類似 Read the full credits 的當地語系化字串。 + /// + internal static string AboutCreditsSourcesContent { + get { + return ResourceManager.GetString("AboutCreditsSourcesContent", resourceCulture); + } + } + + /// + /// 查詢類似 Contribute 的當地語系化字串。 + /// + internal static string AboutDividerContribute { + get { + return ResourceManager.GetString("AboutDividerContribute", resourceCulture); + } + } + + /// + /// 查詢類似 Credits 的當地語系化字串。 + /// + internal static string AboutDividerCredits { + get { + return ResourceManager.GetString("AboutDividerCredits", resourceCulture); + } + } + + /// + /// 查詢類似 License 的當地語系化字串。 + /// + internal static string AboutDividerLicense { + get { + return ResourceManager.GetString("AboutDividerLicense", resourceCulture); + } + } + + /// + /// 查詢類似 Updates 的當地語系化字串。 + /// + internal static string AboutDividerUpdates { + get { + return ResourceManager.GetString("AboutDividerUpdates", resourceCulture); + } + } + + /// + /// 查詢類似 The application is licensed under the % license, which meets the terms of the "open-source" definition specified by OSI. 的當地語系化字串。 + /// + internal static string AboutLicense { + get { + return ResourceManager.GetString("AboutLicense", resourceCulture); + } + } + + /// + /// 查詢類似 Microsoft Reciprocal (MS-RL) 的當地語系化字串。 + /// + internal static string AboutLicenseContent { + get { + return ResourceManager.GetString("AboutLicenseContent", resourceCulture); + } + } + + /// + /// 查詢類似 A lightweight, real-time, always on top thumbnail of a window of your choice. 的當地語系化字串。 + /// + internal static string AboutSlogan { + get { + return ResourceManager.GetString("AboutSlogan", resourceCulture); + } + } + + /// + /// 查詢類似 About OnTopReplica 的當地語系化字串。 + /// + internal static string AboutTitle { + get { + return ResourceManager.GetString("AboutTitle", resourceCulture); + } + } + + /// + /// 查詢類似 Translators: {0} 的當地語系化字串。 + /// + internal static string AboutTranslators { + get { + return ResourceManager.GetString("AboutTranslators", resourceCulture); + } + } + + /// + /// 查詢類似 Christian Olaechea M., Daniel Zeus.EX, Federico Lorenzo, Goran Brecelj, Jan Romanczyk, Marco Kraxner, Patrik (batupata), Raúl Morillo, René Mihula, Roberto Leiro, Rodrigo Lourenço, Thomas Amundsen, Eric Hoffmann. 的當地語系化字串。 + /// + internal static string AboutTranslatorsContent { + get { + return ResourceManager.GetString("AboutTranslatorsContent", resourceCulture); + } + } + + /// + /// 查詢類似 Check now! 的當地語系化字串。 + /// + internal static string AboutUpdatesCheckNow { + get { + return ResourceManager.GetString("AboutUpdatesCheckNow", resourceCulture); + } + } + + /// + /// 查詢類似 OnTopReplica automatically checks for updates at every start up. 的當地語系化字串。 + /// + internal static string AboutUpdatesDisclaimer { + get { + return ResourceManager.GetString("AboutUpdatesDisclaimer", resourceCulture); + } + } + + /// + /// 查詢類似 Version {0} 的當地語系化字串。 + /// + internal static string AboutVersion { + get { + return ResourceManager.GetString("AboutVersion", resourceCulture); + } + } + + /// + /// 查詢類似 OnTopReplica 的當地語系化字串。 + /// + internal static string ApplicationName { + get { + return ResourceManager.GetString("ApplicationName", resourceCulture); + } + } + + /// + /// 查詢類似 Reset window completely? 的當地語系化字串。 + /// + internal static string AskReset { + get { + return ResourceManager.GetString("AskReset", resourceCulture); + } + } + + /// /// 查詢類似 &Reset - ///All settings will be lost. 的當地語系化字串。 - /// - internal static string AskResetButtonOk { - get { - return ResourceManager.GetString("AskResetButtonOk", resourceCulture); - } - } - - /// - /// 查詢類似 Can be used to reset all settings if you lost control over the window or moved it beyond the screen boundary. 的當地語系化字串。 - /// - internal static string AskResetContent { - get { - return ResourceManager.GetString("AskResetContent", resourceCulture); - } - } - - /// - /// 查詢類似 Reset 的當地語系化字串。 - /// - internal static string AskResetTitle { - get { - return ResourceManager.GetString("AskResetTitle", resourceCulture); - } - } - - /// - /// 查詢類似 Reset settings? 的當地語系化字串。 - /// - internal static string AskSettingReset { - get { - return ResourceManager.GetString("AskSettingReset", resourceCulture); - } - } - - /// - /// 查詢類似 This will erase all settings of OnTopReplica, returning it to the original state right after installation (all saved information, like stored regions, will be lost). 的當地語系化字串。 - /// - internal static string AskSettingResetContent { - get { - return ResourceManager.GetString("AskSettingResetContent", resourceCulture); - } - } - - /// - /// 查詢類似 Reset settings 的當地語系化字串。 - /// - internal static string AskSettingResetTitle { - get { - return ResourceManager.GetString("AskSettingResetTitle", resourceCulture); - } - } - - /// - /// 查詢類似 &Cancel 的當地語系化字串。 - /// - internal static string ButtonCancel { - get { - return ResourceManager.GetString("ButtonCancel", resourceCulture); - } - } - - /// - /// 查詢類似 Draw regions using mouse. 的當地語系化字串。 - /// - internal static string DrawRegions { - get { - return ResourceManager.GetString("DrawRegions", resourceCulture); - } - } - - /// - /// 查詢類似 Details 的當地語系化字串。 - /// - internal static string ErrorDetailButton { - get { - return ResourceManager.GetString("ErrorDetailButton", resourceCulture); - } - } - - /// - /// 查詢類似 Details on Windows Aero 的當地語系化字串。 - /// - internal static string ErrorDetailsAero { - get { - return ResourceManager.GetString("ErrorDetailsAero", resourceCulture); - } - } - - /// - /// 查詢類似 Windows Aero is only available on Windows Vista Home Premium or higher. 的當地語系化字串。 - /// - internal static string ErrorDetailsAeroInfo { - get { - return ResourceManager.GetString("ErrorDetailsAeroInfo", resourceCulture); - } - } - - /// - /// 查詢類似 'Desktop Composition' is not enabled. 的當地語系化字串。 - /// - internal static string ErrorDwmOff { - get { - return ResourceManager.GetString("ErrorDwmOff", resourceCulture); - } - } - - /// + ///All settings will be lost. 的當地語系化字串。 + /// + internal static string AskResetButtonOk { + get { + return ResourceManager.GetString("AskResetButtonOk", resourceCulture); + } + } + + /// + /// 查詢類似 Can be used to reset all settings if you lost control over the window or moved it beyond the screen boundary. 的當地語系化字串。 + /// + internal static string AskResetContent { + get { + return ResourceManager.GetString("AskResetContent", resourceCulture); + } + } + + /// + /// 查詢類似 Reset 的當地語系化字串。 + /// + internal static string AskResetTitle { + get { + return ResourceManager.GetString("AskResetTitle", resourceCulture); + } + } + + /// + /// 查詢類似 Reset settings? 的當地語系化字串。 + /// + internal static string AskSettingReset { + get { + return ResourceManager.GetString("AskSettingReset", resourceCulture); + } + } + + /// + /// 查詢類似 This will erase all settings of OnTopReplica, returning it to the original state right after installation (all saved information, like stored regions, will be lost). 的當地語系化字串。 + /// + internal static string AskSettingResetContent { + get { + return ResourceManager.GetString("AskSettingResetContent", resourceCulture); + } + } + + /// + /// 查詢類似 Reset settings 的當地語系化字串。 + /// + internal static string AskSettingResetTitle { + get { + return ResourceManager.GetString("AskSettingResetTitle", resourceCulture); + } + } + + /// + /// 查詢類似 &Cancel 的當地語系化字串。 + /// + internal static string ButtonCancel { + get { + return ResourceManager.GetString("ButtonCancel", resourceCulture); + } + } + + /// + /// 查詢類似 Draw regions using mouse. 的當地語系化字串。 + /// + internal static string DrawRegions { + get { + return ResourceManager.GetString("DrawRegions", resourceCulture); + } + } + + /// + /// 查詢類似 Details 的當地語系化字串。 + /// + internal static string ErrorDetailButton { + get { + return ResourceManager.GetString("ErrorDetailButton", resourceCulture); + } + } + + /// + /// 查詢類似 Details on Windows Aero 的當地語系化字串。 + /// + internal static string ErrorDetailsAero { + get { + return ResourceManager.GetString("ErrorDetailsAero", resourceCulture); + } + } + + /// + /// 查詢類似 Windows Aero is only available on Windows Vista Home Premium or higher. 的當地語系化字串。 + /// + internal static string ErrorDetailsAeroInfo { + get { + return ResourceManager.GetString("ErrorDetailsAeroInfo", resourceCulture); + } + } + + /// + /// 查詢類似 'Desktop Composition' is not enabled. 的當地語系化字串。 + /// + internal static string ErrorDwmOff { + get { + return ResourceManager.GetString("ErrorDwmOff", resourceCulture); + } + } + + /// /// 查詢類似 You must enable desktop composition, by selecting 'Windows Aero' as the theme used by Windows. /// - ///To do so, right-click on the desktop and click on Personalize. 的當地語系化字串。 - /// - internal static string ErrorDwmOffContent { - get { - return ResourceManager.GetString("ErrorDwmOffContent", resourceCulture); - } - } - - /// - /// 查詢類似 Error details 的當地語系化字串。 - /// - internal static string ErrorGenericInfoButton { - get { - return ResourceManager.GetString("ErrorGenericInfoButton", resourceCulture); - } - } - - /// - /// 查詢類似 Error: 的當地語系化字串。 - /// - internal static string ErrorGenericInfoText { - get { - return ResourceManager.GetString("ErrorGenericInfoText", resourceCulture); - } - } - - /// - /// 查詢類似 It appears that the selected window has been closed or is not valid anymore. 的當地語系化字串。 - /// - internal static string ErrorGenericThumbnailHandleError { - get { - return ResourceManager.GetString("ErrorGenericThumbnailHandleError", resourceCulture); - } - } - - /// - /// 查詢類似 Error 的當地語系化字串。 - /// - internal static string ErrorGenericTitle { - get { - return ResourceManager.GetString("ErrorGenericTitle", resourceCulture); - } - } - - /// + ///To do so, right-click on the desktop and click on Personalize. 的當地語系化字串。 + /// + internal static string ErrorDwmOffContent { + get { + return ResourceManager.GetString("ErrorDwmOffContent", resourceCulture); + } + } + + /// + /// 查詢類似 Error details 的當地語系化字串。 + /// + internal static string ErrorGenericInfoButton { + get { + return ResourceManager.GetString("ErrorGenericInfoButton", resourceCulture); + } + } + + /// + /// 查詢類似 Error: 的當地語系化字串。 + /// + internal static string ErrorGenericInfoText { + get { + return ResourceManager.GetString("ErrorGenericInfoText", resourceCulture); + } + } + + /// + /// 查詢類似 It appears that the selected window has been closed or is not valid anymore. 的當地語系化字串。 + /// + internal static string ErrorGenericThumbnailHandleError { + get { + return ResourceManager.GetString("ErrorGenericThumbnailHandleError", resourceCulture); + } + } + + /// + /// 查詢類似 Error 的當地語系化字串。 + /// + internal static string ErrorGenericTitle { + get { + return ResourceManager.GetString("ErrorGenericTitle", resourceCulture); + } + } + + /// /// 查詢類似 Desktop Composition' is not supported on your Operating System. - ///You must run this application on Windows Vista Home Premium or better. 的當地語系化字串。 - /// - internal static string ErrorNoDwm { - get { - return ResourceManager.GetString("ErrorNoDwm", resourceCulture); - } - } - - /// - /// 查詢類似 Desktop Composition unsupported 的當地語系化字串。 - /// - internal static string ErrorNoDwmTitle { - get { - return ResourceManager.GetString("ErrorNoDwmTitle", resourceCulture); - } - } - - /// - /// 查詢類似 No thumbnail loaded. 的當地語系化字串。 - /// - internal static string ErrorNoThumbnail { - get { - return ResourceManager.GetString("ErrorNoThumbnail", resourceCulture); - } - } - - /// - /// 查詢類似 Unable to create thumbnail 的當地語系化字串。 - /// - internal static string ErrorUnableToCreateThumbnail { - get { - return ResourceManager.GetString("ErrorUnableToCreateThumbnail", resourceCulture); - } - } - - /// - /// 查詢類似 Unable to fit window. 的當地語系化字串。 - /// - internal static string ErrorUnableToFit { - get { - return ResourceManager.GetString("ErrorUnableToFit", resourceCulture); - } - } - - /// - /// 查詢類似 Unable to check for updates. 的當地語系化字串。 - /// - internal static string ErrorUpdate { - get { - return ResourceManager.GetString("ErrorUpdate", resourceCulture); - } - } - - /// - /// 查詢類似 It appears that OnTopReplica wasn't installed using 'ClickOnce'. You'll have to update manually (visit <a href="http://ontopreplica.codeplex.com">OnTopReplica's homepage</a>). 的當地語系化字串。 - /// - internal static string ErrorUpdateContent { - get { - return ResourceManager.GetString("ErrorUpdateContent", resourceCulture); - } - } - - /// - /// 查詢類似 OnTopReplica was unable to check whether an updated version is available. Make sure you are connected to the Internet. If you are, the website may be temporarily down. 的當地語系化字串。 - /// - internal static string ErrorUpdateContentGeneric { - get { - return ResourceManager.GetString("ErrorUpdateContentGeneric", resourceCulture); - } - } - - /// - /// 查詢類似 Mode 的當地語系化字串。 - /// - internal static string FullscreenMode { - get { - return ResourceManager.GetString("FullscreenMode", resourceCulture); - } - } - - /// - /// 查詢類似 Always on top 的當地語系化字串。 - /// - internal static string FullscreenModeAlwaysOnTop { - get { - return ResourceManager.GetString("FullscreenModeAlwaysOnTop", resourceCulture); - } - } - - /// - /// 查詢類似 Forces OnTopReplica to stay always on top. 的當地語系化字串。 - /// - internal static string FullscreenModeAlwaysOnTopTT { - get { - return ResourceManager.GetString("FullscreenModeAlwaysOnTopTT", resourceCulture); - } - } - - /// - /// 查詢類似 Click through 的當地語系化字串。 - /// - internal static string FullscreenModeClickThrough { - get { - return ResourceManager.GetString("FullscreenModeClickThrough", resourceCulture); - } - } - - /// - /// 查詢類似 OnTopReplica will behave like a transparent overlay that lets your clicks through to the windows below. 的當地語系化字串。 - /// - internal static string FullscreenModeClickThroughTT { - get { - return ResourceManager.GetString("FullscreenModeClickThroughTT", resourceCulture); - } - } - - /// - /// 查詢類似 Standard 的當地語系化字串。 - /// - internal static string FullscreenModeNormal { - get { - return ResourceManager.GetString("FullscreenModeNormal", resourceCulture); - } - } - - /// - /// 查詢類似 Behaves like an ordinary window. You can bring other windows above OnTopReplica. 的當地語系化字串。 - /// - internal static string FullscreenModeNormalTT { - get { - return ResourceManager.GetString("FullscreenModeNormalTT", resourceCulture); - } - } - - /// - /// 查詢類似 OnTopReplica fullscreen 的當地語系化字串。 - /// - internal static string FullscreenTitle { - get { - return ResourceManager.GetString("FullscreenTitle", resourceCulture); - } - } - - /// - /// 查詢類似 Disable 的當地語系化字串。 - /// - internal static string GroupSwitchModeDisableButton { - get { - return ResourceManager.GetString("GroupSwitchModeDisableButton", resourceCulture); - } - } - - /// - /// 查詢類似 Enable Group mode 的當地語系化字串。 - /// - internal static string GroupSwitchModeEnableButton { - get { - return ResourceManager.GetString("GroupSwitchModeEnableButton", resourceCulture); - } - } - - /// - /// 查詢類似 Select multiple windows to enable. 的當地語系化字串。 - /// - internal static string GroupSwitchModeStatusDisabled { - get { - return ResourceManager.GetString("GroupSwitchModeStatusDisabled", resourceCulture); - } - } - - /// - /// 查詢類似 Group switch mode is enabled. 的當地語系化字串。 - /// - internal static string GroupSwitchModeStatusEnabled { - get { - return ResourceManager.GetString("GroupSwitchModeStatusEnabled", resourceCulture); - } - } - - /// - /// 查詢類似 Group switch mode: 的當地語系化字串。 - /// - internal static string GroupSwitchModeTitle { - get { - return ResourceManager.GetString("GroupSwitchModeTitle", resourceCulture); - } - } - - /// - /// 查詢類似 Windows 的當地語系化字串。 - /// - internal static string GroupSwitchModeWindows { - get { - return ResourceManager.GetString("GroupSwitchModeWindows", resourceCulture); - } - } - - /// - /// 查詢類似 Homepage: www.codeplex.com/ontopreplica. 的當地語系化字串。 - /// - internal static string Homepage { - get { - return ResourceManager.GetString("Homepage", resourceCulture); - } - } - - /// - /// 查詢類似 Do you want to enable "click forwarding"? 的當地語系化字串。 - /// - internal static string InfoClickForwarding { - get { - return ResourceManager.GetString("InfoClickForwarding", resourceCulture); - } - } - - /// + ///You must run this application on Windows Vista Home Premium or better. 的當地語系化字串。 + /// + internal static string ErrorNoDwm { + get { + return ResourceManager.GetString("ErrorNoDwm", resourceCulture); + } + } + + /// + /// 查詢類似 Desktop Composition unsupported 的當地語系化字串。 + /// + internal static string ErrorNoDwmTitle { + get { + return ResourceManager.GetString("ErrorNoDwmTitle", resourceCulture); + } + } + + /// + /// 查詢類似 No thumbnail loaded. 的當地語系化字串。 + /// + internal static string ErrorNoThumbnail { + get { + return ResourceManager.GetString("ErrorNoThumbnail", resourceCulture); + } + } + + /// + /// 查詢類似 Unable to create thumbnail 的當地語系化字串。 + /// + internal static string ErrorUnableToCreateThumbnail { + get { + return ResourceManager.GetString("ErrorUnableToCreateThumbnail", resourceCulture); + } + } + + /// + /// 查詢類似 Unable to fit window. 的當地語系化字串。 + /// + internal static string ErrorUnableToFit { + get { + return ResourceManager.GetString("ErrorUnableToFit", resourceCulture); + } + } + + /// + /// 查詢類似 Unable to check for updates. 的當地語系化字串。 + /// + internal static string ErrorUpdate { + get { + return ResourceManager.GetString("ErrorUpdate", resourceCulture); + } + } + + /// + /// 查詢類似 It appears that OnTopReplica wasn't installed using 'ClickOnce'. You'll have to update manually (visit <a href="http://ontopreplica.codeplex.com">OnTopReplica's homepage</a>). 的當地語系化字串。 + /// + internal static string ErrorUpdateContent { + get { + return ResourceManager.GetString("ErrorUpdateContent", resourceCulture); + } + } + + /// + /// 查詢類似 OnTopReplica was unable to check whether an updated version is available. Make sure you are connected to the Internet. If you are, the website may be temporarily down. 的當地語系化字串。 + /// + internal static string ErrorUpdateContentGeneric { + get { + return ResourceManager.GetString("ErrorUpdateContentGeneric", resourceCulture); + } + } + + /// + /// 查詢類似 Mode 的當地語系化字串。 + /// + internal static string FullscreenMode { + get { + return ResourceManager.GetString("FullscreenMode", resourceCulture); + } + } + + /// + /// 查詢類似 Always on top 的當地語系化字串。 + /// + internal static string FullscreenModeAlwaysOnTop { + get { + return ResourceManager.GetString("FullscreenModeAlwaysOnTop", resourceCulture); + } + } + + /// + /// 查詢類似 Forces OnTopReplica to stay always on top. 的當地語系化字串。 + /// + internal static string FullscreenModeAlwaysOnTopTT { + get { + return ResourceManager.GetString("FullscreenModeAlwaysOnTopTT", resourceCulture); + } + } + + /// + /// 查詢類似 Click through 的當地語系化字串。 + /// + internal static string FullscreenModeClickThrough { + get { + return ResourceManager.GetString("FullscreenModeClickThrough", resourceCulture); + } + } + + /// + /// 查詢類似 OnTopReplica will behave like a transparent overlay that lets your clicks through to the windows below. 的當地語系化字串。 + /// + internal static string FullscreenModeClickThroughTT { + get { + return ResourceManager.GetString("FullscreenModeClickThroughTT", resourceCulture); + } + } + + /// + /// 查詢類似 Standard 的當地語系化字串。 + /// + internal static string FullscreenModeNormal { + get { + return ResourceManager.GetString("FullscreenModeNormal", resourceCulture); + } + } + + /// + /// 查詢類似 Behaves like an ordinary window. You can bring other windows above OnTopReplica. 的當地語系化字串。 + /// + internal static string FullscreenModeNormalTT { + get { + return ResourceManager.GetString("FullscreenModeNormalTT", resourceCulture); + } + } + + /// + /// 查詢類似 OnTopReplica fullscreen 的當地語系化字串。 + /// + internal static string FullscreenTitle { + get { + return ResourceManager.GetString("FullscreenTitle", resourceCulture); + } + } + + /// + /// 查詢類似 Disable 的當地語系化字串。 + /// + internal static string GroupSwitchModeDisableButton { + get { + return ResourceManager.GetString("GroupSwitchModeDisableButton", resourceCulture); + } + } + + /// + /// 查詢類似 Enable Group mode 的當地語系化字串。 + /// + internal static string GroupSwitchModeEnableButton { + get { + return ResourceManager.GetString("GroupSwitchModeEnableButton", resourceCulture); + } + } + + /// + /// 查詢類似 Select multiple windows to enable. 的當地語系化字串。 + /// + internal static string GroupSwitchModeStatusDisabled { + get { + return ResourceManager.GetString("GroupSwitchModeStatusDisabled", resourceCulture); + } + } + + /// + /// 查詢類似 Group switch mode is enabled. 的當地語系化字串。 + /// + internal static string GroupSwitchModeStatusEnabled { + get { + return ResourceManager.GetString("GroupSwitchModeStatusEnabled", resourceCulture); + } + } + + /// + /// 查詢類似 Group switch mode: 的當地語系化字串。 + /// + internal static string GroupSwitchModeTitle { + get { + return ResourceManager.GetString("GroupSwitchModeTitle", resourceCulture); + } + } + + /// + /// 查詢類似 Windows 的當地語系化字串。 + /// + internal static string GroupSwitchModeWindows { + get { + return ResourceManager.GetString("GroupSwitchModeWindows", resourceCulture); + } + } + + /// + /// 查詢類似 Homepage: www.codeplex.com/ontopreplica. 的當地語系化字串。 + /// + internal static string Homepage { + get { + return ResourceManager.GetString("Homepage", resourceCulture); + } + } + + /// + /// 查詢類似 Do you want to enable "click forwarding"? 的當地語系化字串。 + /// + internal static string InfoClickForwarding { + get { + return ResourceManager.GetString("InfoClickForwarding", resourceCulture); + } + } + + /// /// 查詢類似 If this mode is enabled, OnTopReplica will forward all left mouse clicks to the window that is being cloned (this will allow you to do basic mouse operations on the cloned window without having to activate it). /// - ///To exit this mode, push ESC. 的當地語系化字串。 - /// - internal static string InfoClickForwardingContent { - get { - return ResourceManager.GetString("InfoClickForwardingContent", resourceCulture); - } - } - - /// - /// 查詢類似 Click forwarding 的當地語系化字串。 - /// - internal static string InfoClickForwardingTitle { - get { - return ResourceManager.GetString("InfoClickForwardingTitle", resourceCulture); - } - } - - /// - /// 查詢類似 Enable Click-Through mode? 的當地語系化字串。 - /// - internal static string InfoClickThrough { - get { - return ResourceManager.GetString("InfoClickThrough", resourceCulture); - } - } - - /// - /// 查詢類似 Click-through only works if it has been enabled in the Resize submenu and if the window is semi-transparent. 的當地語系化字串。 - /// - internal static string InfoClickThroughDetails { - get { - return ResourceManager.GetString("InfoClickThroughDetails", resourceCulture); - } - } - - /// + ///To exit this mode, push ESC. 的當地語系化字串。 + /// + internal static string InfoClickForwardingContent { + get { + return ResourceManager.GetString("InfoClickForwardingContent", resourceCulture); + } + } + + /// + /// 查詢類似 Click forwarding 的當地語系化字串。 + /// + internal static string InfoClickForwardingTitle { + get { + return ResourceManager.GetString("InfoClickForwardingTitle", resourceCulture); + } + } + + /// + /// 查詢類似 Enable Click-Through mode? 的當地語系化字串。 + /// + internal static string InfoClickThrough { + get { + return ResourceManager.GetString("InfoClickThrough", resourceCulture); + } + } + + /// + /// 查詢類似 Click-through only works if it has been enabled in the Resize submenu and if the window is semi-transparent. 的當地語系化字串。 + /// + internal static string InfoClickThroughDetails { + get { + return ResourceManager.GetString("InfoClickThroughDetails", resourceCulture); + } + } + + /// /// 查詢類似 In this mode the fullscreen window will behave as a partially transparent overlay, allowing you to click on the other windows behind it. /// - ///To return to normal mode anytime, activate OnTopReplica by clicking on the task bar (or the tray icon). 的當地語系化字串。 - /// - internal static string InfoClickThroughInformation { - get { - return ResourceManager.GetString("InfoClickThroughInformation", resourceCulture); - } - } - - /// + ///To return to normal mode anytime, activate OnTopReplica by clicking on the task bar (or the tray icon). 的當地語系化字串。 + /// + internal static string InfoClickThroughInformation { + get { + return ResourceManager.GetString("InfoClickThroughInformation", resourceCulture); + } + } + + /// /// 查詢類似 No, thank you. - ///You can enable click-through later 的當地語系化字串。 - /// - internal static string InfoClickThroughNo { - get { - return ResourceManager.GetString("InfoClickThroughNo", resourceCulture); - } - } - - /// - /// 查詢類似 Use Click-Through 的當地語系化字串。 - /// - internal static string InfoClickThroughOk { - get { - return ResourceManager.GetString("InfoClickThroughOk", resourceCulture); - } - } - - /// - /// 查詢類似 Click-Through mode 的當地語系化字串。 - /// - internal static string InfoClickThroughTitle { - get { - return ResourceManager.GetString("InfoClickThroughTitle", resourceCulture); - } - } - - /// - /// 查詢類似 OnTopReplica has been updated. 的當地語系化字串。 - /// - internal static string InfoUpdated { - get { - return ResourceManager.GetString("InfoUpdated", resourceCulture); - } - } - - /// - /// 查詢類似 In order to use the updated version of OnTopReplica you'll have to restart the application. 的當地語系化字串。 - /// - internal static string InfoUpdatedContent { - get { - return ResourceManager.GetString("InfoUpdatedContent", resourceCulture); - } - } - - /// - /// 查詢類似 Update successful 的當地語系化字串。 - /// - internal static string InfoUpdatedTitle { - get { - return ResourceManager.GetString("InfoUpdatedTitle", resourceCulture); - } - } - - /// - /// 查詢類似 OnTopReplica is up to date. 的當地語系化字串。 - /// - internal static string InfoUpToDate { - get { - return ResourceManager.GetString("InfoUpToDate", resourceCulture); - } - } - - /// - /// 查詢類似 No update available 的當地語系化字串。 - /// - internal static string InfoUpToDateTitle { - get { - return ResourceManager.GetString("InfoUpToDateTitle", resourceCulture); - } - } - - /// - /// 查詢類似 Language 的當地語系化字串。 - /// - internal static string Language { - get { - return ResourceManager.GetString("Language", resourceCulture); - } - } - - /// - /// 查詢類似 About... 的當地語系化字串。 - /// - internal static string MenuAbout { - get { - return ResourceManager.GetString("MenuAbout", resourceCulture); - } - } - - /// - /// 查詢類似 Hides the main window and displays the "about" box. 的當地語系化字串。 - /// - internal static string MenuAboutTT { - get { - return ResourceManager.GetString("MenuAboutTT", resourceCulture); - } - } - - /// - /// 查詢類似 Advanced 的當地語系化字串。 - /// - internal static string MenuAdvanced { - get { - return ResourceManager.GetString("MenuAdvanced", resourceCulture); - } - } - - /// - /// 查詢類似 Show window border 的當地語系化字串。 - /// - internal static string MenuChrome { - get { - return ResourceManager.GetString("MenuChrome", resourceCulture); - } - } - - /// - /// 查詢類似 Toggles the display of the window border. 的當地語系化字串。 - /// - internal static string MenuChromeTT { - get { - return ResourceManager.GetString("MenuChromeTT", resourceCulture); - } - } - - /// - /// 查詢類似 Enable Click forwarding 的當地語系化字串。 - /// - internal static string MenuClickForwarding { - get { - return ResourceManager.GetString("MenuClickForwarding", resourceCulture); - } - } - - /// - /// 查詢類似 Enable "click forwarding" to the cloned window. 的當地語系化字串。 - /// - internal static string MenuClickForwardingTT { - get { - return ResourceManager.GetString("MenuClickForwardingTT", resourceCulture); - } - } - - /// - /// 查詢類似 Enable Click-Through 的當地語系化字串。 - /// - internal static string MenuClickThrough { - get { - return ResourceManager.GetString("MenuClickThrough", resourceCulture); - } - } - - /// - /// 查詢類似 OnTopReplica will behave like a transparent overlay that lets your clicks through to the windows below. 的當地語系化字串。 - /// - internal static string MenuClickThroughTT { - get { - return ResourceManager.GetString("MenuClickThroughTT", resourceCulture); - } - } - - /// - /// 查詢類似 Close 的當地語系化字串。 - /// - internal static string MenuClose { - get { - return ResourceManager.GetString("MenuClose", resourceCulture); - } - } - - /// - /// 查詢類似 Closes OnTopReplica. 的當地語系化字串。 - /// - internal static string MenuCloseTT { - get { - return ResourceManager.GetString("MenuCloseTT", resourceCulture); - } - } - - /// - /// 查詢類似 2:1 Double 的當地語系化字串。 - /// - internal static string MenuFitDouble { - get { - return ResourceManager.GetString("MenuFitDouble", resourceCulture); - } - } - - /// - /// 查詢類似 Fullscreen 的當地語系化字串。 - /// - internal static string MenuFitFullscreen { - get { - return ResourceManager.GetString("MenuFitFullscreen", resourceCulture); - } - } - - /// - /// 查詢類似 1:2 Half 的當地語系化字串。 - /// - internal static string MenuFitHalf { - get { - return ResourceManager.GetString("MenuFitHalf", resourceCulture); - } - } - - /// - /// 查詢類似 1:1 Fit to window 的當地語系化字串。 - /// - internal static string MenuFitOriginal { - get { - return ResourceManager.GetString("MenuFitOriginal", resourceCulture); - } - } - - /// - /// 查詢類似 1:4 Quarter 的當地語系化字串。 - /// - internal static string MenuFitQuarter { - get { - return ResourceManager.GetString("MenuFitQuarter", resourceCulture); - } - } - - /// - /// 查詢類似 Group Switch mode 的當地語系化字串。 - /// - internal static string MenuGroupSwitch { - get { - return ResourceManager.GetString("MenuGroupSwitch", resourceCulture); - } - } - - /// - /// 查詢類似 OnTopReplica will automatically clone a window from an user defined group, switching to the one least recently activated to the foreground. 的當地語系化字串。 - /// - internal static string MenuGroupSwitchTT { - get { - return ResourceManager.GetString("MenuGroupSwitchTT", resourceCulture); - } - } - - /// - /// 查詢類似 100% (opaque) 的當地語系化字串。 - /// - internal static string MenuOp100 { - get { - return ResourceManager.GetString("MenuOp100", resourceCulture); - } - } - - /// - /// 查詢類似 Sets OnTopReplica to be completely opaque. 的當地語系化字串。 - /// - internal static string MenuOp100TT { - get { - return ResourceManager.GetString("MenuOp100TT", resourceCulture); - } - } - - /// - /// 查詢類似 25% 的當地語系化字串。 - /// - internal static string MenuOp25 { - get { - return ResourceManager.GetString("MenuOp25", resourceCulture); - } - } - - /// - /// 查詢類似 Sets OnTopReplica to 25% opacity. 的當地語系化字串。 - /// - internal static string MenuOp25TT { - get { - return ResourceManager.GetString("MenuOp25TT", resourceCulture); - } - } - - /// - /// 查詢類似 50% 的當地語系化字串。 - /// - internal static string MenuOp50 { - get { - return ResourceManager.GetString("MenuOp50", resourceCulture); - } - } - - /// - /// 查詢類似 Sets OnTopReplica to 50% opacity. 的當地語系化字串。 - /// - internal static string MenuOp50TT { - get { - return ResourceManager.GetString("MenuOp50TT", resourceCulture); - } - } - - /// - /// 查詢類似 75% 的當地語系化字串。 - /// - internal static string MenuOp75 { - get { - return ResourceManager.GetString("MenuOp75", resourceCulture); - } - } - - /// - /// 查詢類似 Sets OnTopReplica to 75% opacity. 的當地語系化字串。 - /// - internal static string MenuOp75TT { - get { - return ResourceManager.GetString("MenuOp75TT", resourceCulture); - } - } - - /// - /// 查詢類似 Opacity 的當地語系化字串。 - /// - internal static string MenuOpacity { - get { - return ResourceManager.GetString("MenuOpacity", resourceCulture); - } - } - - /// - /// 查詢類似 Open 的當地語系化字串。 - /// - internal static string MenuOpen { - get { - return ResourceManager.GetString("MenuOpen", resourceCulture); - } - } - - /// - /// 查詢類似 Displays OnTopReplica. 的當地語系化字串。 - /// - internal static string MenuOpenTT { - get { - return ResourceManager.GetString("MenuOpenTT", resourceCulture); - } - } - - /// - /// 查詢類似 Bottom Left 的當地語系化字串。 - /// - internal static string MenuPosBottomLeft { - get { - return ResourceManager.GetString("MenuPosBottomLeft", resourceCulture); - } - } - - /// - /// 查詢類似 Bottom Right 的當地語系化字串。 - /// - internal static string MenuPosBottomRight { - get { - return ResourceManager.GetString("MenuPosBottomRight", resourceCulture); - } - } - - /// - /// 查詢類似 Center 的當地語系化字串。 - /// - internal static string MenuPosCenter { - get { - return ResourceManager.GetString("MenuPosCenter", resourceCulture); - } - } - - /// - /// 查詢類似 Disabled 的當地語系化字串。 - /// - internal static string MenuPosDisabled { - get { - return ResourceManager.GetString("MenuPosDisabled", resourceCulture); - } - } - - /// - /// 查詢類似 Position lock 的當地語系化字串。 - /// - internal static string MenuPosition { - get { - return ResourceManager.GetString("MenuPosition", resourceCulture); - } - } - - /// - /// 查詢類似 Automatically position OnTopReplica on the current screen. 的當地語系化字串。 - /// - internal static string MenuPositionTT { - get { - return ResourceManager.GetString("MenuPositionTT", resourceCulture); - } - } - - /// - /// 查詢類似 Top Left 的當地語系化字串。 - /// - internal static string MenuPosTopLeft { - get { - return ResourceManager.GetString("MenuPosTopLeft", resourceCulture); - } - } - - /// - /// 查詢類似 Top Right 的當地語系化字串。 - /// - internal static string MenuPosTopRight { - get { - return ResourceManager.GetString("MenuPosTopRight", resourceCulture); - } - } - - /// - /// 查詢類似 Quit fullscreen mode 的當地語系化字串。 - /// - internal static string MenuQuitFullscreen { - get { - return ResourceManager.GetString("MenuQuitFullscreen", resourceCulture); - } - } - - /// - /// 查詢類似 Recall last position and size 的當地語系化字串。 - /// - internal static string MenuRecall { - get { - return ResourceManager.GetString("MenuRecall", resourceCulture); - } - } - - /// - /// 查詢類似 Toggles whether OnTopReplica should store its last position and size and use them when it is restarted. 的當地語系化字串。 - /// - internal static string MenuRecallTT { - get { - return ResourceManager.GetString("MenuRecallTT", resourceCulture); - } - } - - /// - /// 查詢類似 Minimize 的當地語系化字串。 - /// - internal static string MenuReduce { - get { - return ResourceManager.GetString("MenuReduce", resourceCulture); - } - } - - /// - /// 查詢類似 Minimizes OnTopReplica to the task bar (or the tray). 的當地語系化字串。 - /// - internal static string MenuReduceTT { - get { - return ResourceManager.GetString("MenuReduceTT", resourceCulture); - } - } - - /// - /// 查詢類似 Select region... 的當地語系化字串。 - /// - internal static string MenuRegion { - get { - return ResourceManager.GetString("MenuRegion", resourceCulture); - } - } - - /// - /// 查詢類似 Switches to "region mode", that allows you to select a limited region of the source's window as thumbnail. 的當地語系化字串。 - /// - internal static string MenuRegionTT { - get { - return ResourceManager.GetString("MenuRegionTT", resourceCulture); - } - } - - /// - /// 查詢類似 Reset window 的當地語系化字串。 - /// - internal static string MenuReset { - get { - return ResourceManager.GetString("MenuReset", resourceCulture); - } - } - - /// - /// 查詢類似 Resets OnTopReplica settings and its main window. 的當地語系化字串。 - /// - internal static string MenuResetTT { - get { - return ResourceManager.GetString("MenuResetTT", resourceCulture); - } - } - - /// - /// 查詢類似 Resize 的當地語系化字串。 - /// - internal static string MenuResize { - get { - return ResourceManager.GetString("MenuResize", resourceCulture); - } - } - - /// - /// 查詢類似 Restore last cloned window 的當地語系化字串。 - /// - internal static string MenuRestoreLast { - get { - return ResourceManager.GetString("MenuRestoreLast", resourceCulture); - } - } - - /// - /// 查詢類似 When enabled, OnTopReplica will attempt to restore the last cloned window on start up. 的當地語系化字串。 - /// - internal static string MenuRestoreLastTT { - get { - return ResourceManager.GetString("MenuRestoreLastTT", resourceCulture); - } - } - - /// - /// 查詢類似 Settings... 的當地語系化字串。 - /// - internal static string MenuSettings { - get { - return ResourceManager.GetString("MenuSettings", resourceCulture); - } - } - - /// - /// 查詢類似 Displays the settings panel. 的當地語系化字串。 - /// - internal static string MenuSettingsTT { - get { - return ResourceManager.GetString("MenuSettingsTT", resourceCulture); - } - } - - /// - /// 查詢類似 Switch to window 的當地語系化字串。 - /// - internal static string MenuSwitch { - get { - return ResourceManager.GetString("MenuSwitch", resourceCulture); - } - } - - /// - /// 查詢類似 Switches to the source window and hides OnTopReplica. 的當地語系化字串。 - /// - internal static string MenuSwitchTT { - get { - return ResourceManager.GetString("MenuSwitchTT", resourceCulture); - } - } - - /// - /// 查詢類似 Select window 的當地語系化字串。 - /// - internal static string MenuWindows { - get { - return ResourceManager.GetString("MenuWindows", resourceCulture); - } - } - - /// - /// 查詢類似 - none - 的當地語系化字串。 - /// - internal static string MenuWindowsNone { - get { - return ResourceManager.GetString("MenuWindowsNone", resourceCulture); - } - } - - /// - /// 查詢類似 Displays a list of window you can select as thumbnail source. 的當地語系化字串。 - /// - internal static string MenuWindowsTT { - get { - return ResourceManager.GetString("MenuWindowsTT", resourceCulture); - } - } - - /// - /// 查詢類似 - whole - 的當地語系化字串。 - /// - internal static string MenuWindowsWholeRegion { - get { - return ResourceManager.GetString("MenuWindowsWholeRegion", resourceCulture); - } - } - - /// - /// 查詢類似 Bottom 的當地語系化字串。 - /// - internal static string RegionsBottom { - get { - return ResourceManager.GetString("RegionsBottom", resourceCulture); - } - } - - /// - /// 查詢類似 Current region: 的當地語系化字串。 - /// - internal static string RegionsCurrentRegion { - get { - return ResourceManager.GetString("RegionsCurrentRegion", resourceCulture); - } - } - - /// - /// 查詢類似 Delete 的當地語系化字串。 - /// - internal static string RegionsDeleteButton { - get { - return ResourceManager.GetString("RegionsDeleteButton", resourceCulture); - } - } - - /// - /// 查詢類似 Done 的當地語系化字串。 - /// - internal static string RegionsDoneButton { - get { - return ResourceManager.GetString("RegionsDoneButton", resourceCulture); - } - } - - /// - /// 查詢類似 Height 的當地語系化字串。 - /// - internal static string RegionsHeight { - get { - return ResourceManager.GetString("RegionsHeight", resourceCulture); - } - } - - /// - /// 查詢類似 Left 的當地語系化字串。 - /// - internal static string RegionsLeft { - get { - return ResourceManager.GetString("RegionsLeft", resourceCulture); - } - } - - /// - /// 查詢類似 Reset 的當地語系化字串。 - /// - internal static string RegionsResetButton { - get { - return ResourceManager.GetString("RegionsResetButton", resourceCulture); - } - } - - /// - /// 查詢類似 Right 的當地語系化字串。 - /// - internal static string RegionsRight { - get { - return ResourceManager.GetString("RegionsRight", resourceCulture); - } - } - - /// - /// 查詢類似 Save 的當地語系化字串。 - /// - internal static string RegionsSaveButton { - get { - return ResourceManager.GetString("RegionsSaveButton", resourceCulture); - } - } - - /// - /// 查詢類似 Stored regions 的當地語系化字串。 - /// - internal static string RegionsStoredRegions { - get { - return ResourceManager.GetString("RegionsStoredRegions", resourceCulture); - } - } - - /// - /// 查詢類似 Regions: 的當地語系化字串。 - /// - internal static string RegionsTitle { - get { - return ResourceManager.GetString("RegionsTitle", resourceCulture); - } - } - - /// - /// 查詢類似 Top 的當地語系化字串。 - /// - internal static string RegionsTop { - get { - return ResourceManager.GetString("RegionsTop", resourceCulture); - } - } - - /// - /// 查詢類似 Width 的當地語系化字串。 - /// - internal static string RegionsWidth { - get { - return ResourceManager.GetString("RegionsWidth", resourceCulture); - } - } - - /// - /// 查詢類似 X 的當地語系化字串。 - /// - internal static string RegionsX { - get { - return ResourceManager.GetString("RegionsX", resourceCulture); - } - } - - /// - /// 查詢類似 Y 的當地語系化字串。 - /// - internal static string RegionsY { - get { - return ResourceManager.GetString("RegionsY", resourceCulture); - } - } - - /// - /// 查詢類似 Right-click here to start... 的當地語系化字串。 - /// - internal static string RightClick { - get { - return ResourceManager.GetString("RightClick", resourceCulture); - } - } - - /// - /// 查詢類似 Clone current window 的當地語系化字串。 - /// - internal static string SettingsHotKeyClone { - get { - return ResourceManager.GetString("SettingsHotKeyClone", resourceCulture); - } - } - - /// - /// 查詢類似 These system-wide shortcuts can also be used when OnTopReplica is not in focus. 的當地語系化字串。 - /// - internal static string SettingsHotKeyDescription { - get { - return ResourceManager.GetString("SettingsHotKeyDescription", resourceCulture); - } - } - - /// - /// 查詢類似 Show/Hide 的當地語系化字串。 - /// - internal static string SettingsHotKeyShowHide { - get { - return ResourceManager.GetString("SettingsHotKeyShowHide", resourceCulture); - } - } - - /// - /// 查詢類似 Hot keys: 的當地語系化字串。 - /// - internal static string SettingsHotKeyTitle { - get { - return ResourceManager.GetString("SettingsHotKeyTitle", resourceCulture); - } - } - - /// - /// 查詢類似 Language: 的當地語系化字串。 - /// - internal static string SettingsLanguageTitle { - get { - return ResourceManager.GetString("SettingsLanguageTitle", resourceCulture); - } - } - - /// - /// 查詢類似 Requires a restart. 的當地語系化字串。 - /// - internal static string SettingsRestartRequired { - get { - return ResourceManager.GetString("SettingsRestartRequired", resourceCulture); - } - } - - /// - /// 查詢類似 Settings 的當地語系化字串。 - /// - internal static string SettingsTitle { - get { - return ResourceManager.GetString("SettingsTitle", resourceCulture); - } - } - - /// + ///You can enable click-through later 的當地語系化字串。 + /// + internal static string InfoClickThroughNo { + get { + return ResourceManager.GetString("InfoClickThroughNo", resourceCulture); + } + } + + /// + /// 查詢類似 Use Click-Through 的當地語系化字串。 + /// + internal static string InfoClickThroughOk { + get { + return ResourceManager.GetString("InfoClickThroughOk", resourceCulture); + } + } + + /// + /// 查詢類似 Click-Through mode 的當地語系化字串。 + /// + internal static string InfoClickThroughTitle { + get { + return ResourceManager.GetString("InfoClickThroughTitle", resourceCulture); + } + } + + /// + /// 查詢類似 OnTopReplica has been updated. 的當地語系化字串。 + /// + internal static string InfoUpdated { + get { + return ResourceManager.GetString("InfoUpdated", resourceCulture); + } + } + + /// + /// 查詢類似 In order to use the updated version of OnTopReplica you'll have to restart the application. 的當地語系化字串。 + /// + internal static string InfoUpdatedContent { + get { + return ResourceManager.GetString("InfoUpdatedContent", resourceCulture); + } + } + + /// + /// 查詢類似 Update successful 的當地語系化字串。 + /// + internal static string InfoUpdatedTitle { + get { + return ResourceManager.GetString("InfoUpdatedTitle", resourceCulture); + } + } + + /// + /// 查詢類似 OnTopReplica is up to date. 的當地語系化字串。 + /// + internal static string InfoUpToDate { + get { + return ResourceManager.GetString("InfoUpToDate", resourceCulture); + } + } + + /// + /// 查詢類似 No update available 的當地語系化字串。 + /// + internal static string InfoUpToDateTitle { + get { + return ResourceManager.GetString("InfoUpToDateTitle", resourceCulture); + } + } + + /// + /// 查詢類似 Language 的當地語系化字串。 + /// + internal static string Language { + get { + return ResourceManager.GetString("Language", resourceCulture); + } + } + + /// + /// 查詢類似 About... 的當地語系化字串。 + /// + internal static string MenuAbout { + get { + return ResourceManager.GetString("MenuAbout", resourceCulture); + } + } + + /// + /// 查詢類似 Hides the main window and displays the "about" box. 的當地語系化字串。 + /// + internal static string MenuAboutTT { + get { + return ResourceManager.GetString("MenuAboutTT", resourceCulture); + } + } + + /// + /// 查詢類似 Advanced 的當地語系化字串。 + /// + internal static string MenuAdvanced { + get { + return ResourceManager.GetString("MenuAdvanced", resourceCulture); + } + } + + /// + /// 查詢類似 Show window border 的當地語系化字串。 + /// + internal static string MenuChrome { + get { + return ResourceManager.GetString("MenuChrome", resourceCulture); + } + } + + /// + /// 查詢類似 Toggles the display of the window border. 的當地語系化字串。 + /// + internal static string MenuChromeTT { + get { + return ResourceManager.GetString("MenuChromeTT", resourceCulture); + } + } + + /// + /// 查詢類似 Enable Click forwarding 的當地語系化字串。 + /// + internal static string MenuClickForwarding { + get { + return ResourceManager.GetString("MenuClickForwarding", resourceCulture); + } + } + + /// + /// 查詢類似 Enable "click forwarding" to the cloned window. 的當地語系化字串。 + /// + internal static string MenuClickForwardingTT { + get { + return ResourceManager.GetString("MenuClickForwardingTT", resourceCulture); + } + } + + /// + /// 查詢類似 Enable Click-Through 的當地語系化字串。 + /// + internal static string MenuClickThrough { + get { + return ResourceManager.GetString("MenuClickThrough", resourceCulture); + } + } + + /// + /// 查詢類似 OnTopReplica will behave like a transparent overlay that lets your clicks through to the windows below. 的當地語系化字串。 + /// + internal static string MenuClickThroughTT { + get { + return ResourceManager.GetString("MenuClickThroughTT", resourceCulture); + } + } + + /// + /// 查詢類似 Close 的當地語系化字串。 + /// + internal static string MenuClose { + get { + return ResourceManager.GetString("MenuClose", resourceCulture); + } + } + + /// + /// 查詢類似 Closes OnTopReplica. 的當地語系化字串。 + /// + internal static string MenuCloseTT { + get { + return ResourceManager.GetString("MenuCloseTT", resourceCulture); + } + } + + /// + /// 查詢類似 2:1 Double 的當地語系化字串。 + /// + internal static string MenuFitDouble { + get { + return ResourceManager.GetString("MenuFitDouble", resourceCulture); + } + } + + /// + /// 查詢類似 Fullscreen 的當地語系化字串。 + /// + internal static string MenuFitFullscreen { + get { + return ResourceManager.GetString("MenuFitFullscreen", resourceCulture); + } + } + + /// + /// 查詢類似 1:2 Half 的當地語系化字串。 + /// + internal static string MenuFitHalf { + get { + return ResourceManager.GetString("MenuFitHalf", resourceCulture); + } + } + + /// + /// 查詢類似 1:1 Fit to window 的當地語系化字串。 + /// + internal static string MenuFitOriginal { + get { + return ResourceManager.GetString("MenuFitOriginal", resourceCulture); + } + } + + /// + /// 查詢類似 1:4 Quarter 的當地語系化字串。 + /// + internal static string MenuFitQuarter { + get { + return ResourceManager.GetString("MenuFitQuarter", resourceCulture); + } + } + + /// + /// 查詢類似 Group Switch mode 的當地語系化字串。 + /// + internal static string MenuGroupSwitch { + get { + return ResourceManager.GetString("MenuGroupSwitch", resourceCulture); + } + } + + /// + /// 查詢類似 OnTopReplica will automatically clone a window from an user defined group, switching to the one least recently activated to the foreground. 的當地語系化字串。 + /// + internal static string MenuGroupSwitchTT { + get { + return ResourceManager.GetString("MenuGroupSwitchTT", resourceCulture); + } + } + + /// + /// 查詢類似 100% (opaque) 的當地語系化字串。 + /// + internal static string MenuOp100 { + get { + return ResourceManager.GetString("MenuOp100", resourceCulture); + } + } + + /// + /// 查詢類似 Sets OnTopReplica to be completely opaque. 的當地語系化字串。 + /// + internal static string MenuOp100TT { + get { + return ResourceManager.GetString("MenuOp100TT", resourceCulture); + } + } + + /// + /// 查詢類似 25% 的當地語系化字串。 + /// + internal static string MenuOp25 { + get { + return ResourceManager.GetString("MenuOp25", resourceCulture); + } + } + + /// + /// 查詢類似 Sets OnTopReplica to 25% opacity. 的當地語系化字串。 + /// + internal static string MenuOp25TT { + get { + return ResourceManager.GetString("MenuOp25TT", resourceCulture); + } + } + + /// + /// 查詢類似 50% 的當地語系化字串。 + /// + internal static string MenuOp50 { + get { + return ResourceManager.GetString("MenuOp50", resourceCulture); + } + } + + /// + /// 查詢類似 Sets OnTopReplica to 50% opacity. 的當地語系化字串。 + /// + internal static string MenuOp50TT { + get { + return ResourceManager.GetString("MenuOp50TT", resourceCulture); + } + } + + /// + /// 查詢類似 75% 的當地語系化字串。 + /// + internal static string MenuOp75 { + get { + return ResourceManager.GetString("MenuOp75", resourceCulture); + } + } + + /// + /// 查詢類似 Sets OnTopReplica to 75% opacity. 的當地語系化字串。 + /// + internal static string MenuOp75TT { + get { + return ResourceManager.GetString("MenuOp75TT", resourceCulture); + } + } + + /// + /// 查詢類似 Opacity 的當地語系化字串。 + /// + internal static string MenuOpacity { + get { + return ResourceManager.GetString("MenuOpacity", resourceCulture); + } + } + + /// + /// 查詢類似 Open 的當地語系化字串。 + /// + internal static string MenuOpen { + get { + return ResourceManager.GetString("MenuOpen", resourceCulture); + } + } + + /// + /// 查詢類似 Displays OnTopReplica. 的當地語系化字串。 + /// + internal static string MenuOpenTT { + get { + return ResourceManager.GetString("MenuOpenTT", resourceCulture); + } + } + + /// + /// 查詢類似 Bottom Left 的當地語系化字串。 + /// + internal static string MenuPosBottomLeft { + get { + return ResourceManager.GetString("MenuPosBottomLeft", resourceCulture); + } + } + + /// + /// 查詢類似 Bottom Right 的當地語系化字串。 + /// + internal static string MenuPosBottomRight { + get { + return ResourceManager.GetString("MenuPosBottomRight", resourceCulture); + } + } + + /// + /// 查詢類似 Center 的當地語系化字串。 + /// + internal static string MenuPosCenter { + get { + return ResourceManager.GetString("MenuPosCenter", resourceCulture); + } + } + + /// + /// 查詢類似 Disabled 的當地語系化字串。 + /// + internal static string MenuPosDisabled { + get { + return ResourceManager.GetString("MenuPosDisabled", resourceCulture); + } + } + + /// + /// 查詢類似 Position lock 的當地語系化字串。 + /// + internal static string MenuPosition { + get { + return ResourceManager.GetString("MenuPosition", resourceCulture); + } + } + + /// + /// 查詢類似 Automatically position OnTopReplica on the current screen. 的當地語系化字串。 + /// + internal static string MenuPositionTT { + get { + return ResourceManager.GetString("MenuPositionTT", resourceCulture); + } + } + + /// + /// 查詢類似 Top Left 的當地語系化字串。 + /// + internal static string MenuPosTopLeft { + get { + return ResourceManager.GetString("MenuPosTopLeft", resourceCulture); + } + } + + /// + /// 查詢類似 Top Right 的當地語系化字串。 + /// + internal static string MenuPosTopRight { + get { + return ResourceManager.GetString("MenuPosTopRight", resourceCulture); + } + } + + /// + /// 查詢類似 Quit fullscreen mode 的當地語系化字串。 + /// + internal static string MenuQuitFullscreen { + get { + return ResourceManager.GetString("MenuQuitFullscreen", resourceCulture); + } + } + + /// + /// 查詢類似 Recall last position and size 的當地語系化字串。 + /// + internal static string MenuRecall { + get { + return ResourceManager.GetString("MenuRecall", resourceCulture); + } + } + + /// + /// 查詢類似 Toggles whether OnTopReplica should store its last position and size and use them when it is restarted. 的當地語系化字串。 + /// + internal static string MenuRecallTT { + get { + return ResourceManager.GetString("MenuRecallTT", resourceCulture); + } + } + + /// + /// 查詢類似 Minimize 的當地語系化字串。 + /// + internal static string MenuReduce { + get { + return ResourceManager.GetString("MenuReduce", resourceCulture); + } + } + + /// + /// 查詢類似 Minimizes OnTopReplica to the task bar (or the tray). 的當地語系化字串。 + /// + internal static string MenuReduceTT { + get { + return ResourceManager.GetString("MenuReduceTT", resourceCulture); + } + } + + /// + /// 查詢類似 Select region... 的當地語系化字串。 + /// + internal static string MenuRegion { + get { + return ResourceManager.GetString("MenuRegion", resourceCulture); + } + } + + /// + /// 查詢類似 Switches to "region mode", that allows you to select a limited region of the source's window as thumbnail. 的當地語系化字串。 + /// + internal static string MenuRegionTT { + get { + return ResourceManager.GetString("MenuRegionTT", resourceCulture); + } + } + + /// + /// 查詢類似 Reset window 的當地語系化字串。 + /// + internal static string MenuReset { + get { + return ResourceManager.GetString("MenuReset", resourceCulture); + } + } + + /// + /// 查詢類似 Resets OnTopReplica settings and its main window. 的當地語系化字串。 + /// + internal static string MenuResetTT { + get { + return ResourceManager.GetString("MenuResetTT", resourceCulture); + } + } + + /// + /// 查詢類似 Resize 的當地語系化字串。 + /// + internal static string MenuResize { + get { + return ResourceManager.GetString("MenuResize", resourceCulture); + } + } + + /// + /// 查詢類似 Restore last cloned window 的當地語系化字串。 + /// + internal static string MenuRestoreLast { + get { + return ResourceManager.GetString("MenuRestoreLast", resourceCulture); + } + } + + /// + /// 查詢類似 When enabled, OnTopReplica will attempt to restore the last cloned window on start up. 的當地語系化字串。 + /// + internal static string MenuRestoreLastTT { + get { + return ResourceManager.GetString("MenuRestoreLastTT", resourceCulture); + } + } + + /// + /// 查詢類似 Settings... 的當地語系化字串。 + /// + internal static string MenuSettings { + get { + return ResourceManager.GetString("MenuSettings", resourceCulture); + } + } + + /// + /// 查詢類似 Displays the settings panel. 的當地語系化字串。 + /// + internal static string MenuSettingsTT { + get { + return ResourceManager.GetString("MenuSettingsTT", resourceCulture); + } + } + + /// + /// 查詢類似 Switch to window 的當地語系化字串。 + /// + internal static string MenuSwitch { + get { + return ResourceManager.GetString("MenuSwitch", resourceCulture); + } + } + + /// + /// 查詢類似 Switches to the source window and hides OnTopReplica. 的當地語系化字串。 + /// + internal static string MenuSwitchTT { + get { + return ResourceManager.GetString("MenuSwitchTT", resourceCulture); + } + } + + /// + /// 查詢類似 Select window 的當地語系化字串。 + /// + internal static string MenuWindows { + get { + return ResourceManager.GetString("MenuWindows", resourceCulture); + } + } + + /// + /// 查詢類似 - none - 的當地語系化字串。 + /// + internal static string MenuWindowsNone { + get { + return ResourceManager.GetString("MenuWindowsNone", resourceCulture); + } + } + + /// + /// 查詢類似 Displays a list of window you can select as thumbnail source. 的當地語系化字串。 + /// + internal static string MenuWindowsTT { + get { + return ResourceManager.GetString("MenuWindowsTT", resourceCulture); + } + } + + /// + /// 查詢類似 - whole - 的當地語系化字串。 + /// + internal static string MenuWindowsWholeRegion { + get { + return ResourceManager.GetString("MenuWindowsWholeRegion", resourceCulture); + } + } + + /// + /// 查詢類似 Bottom 的當地語系化字串。 + /// + internal static string RegionsBottom { + get { + return ResourceManager.GetString("RegionsBottom", resourceCulture); + } + } + + /// + /// 查詢類似 Current region: 的當地語系化字串。 + /// + internal static string RegionsCurrentRegion { + get { + return ResourceManager.GetString("RegionsCurrentRegion", resourceCulture); + } + } + + /// + /// 查詢類似 Delete 的當地語系化字串。 + /// + internal static string RegionsDeleteButton { + get { + return ResourceManager.GetString("RegionsDeleteButton", resourceCulture); + } + } + + /// + /// 查詢類似 Done 的當地語系化字串。 + /// + internal static string RegionsDoneButton { + get { + return ResourceManager.GetString("RegionsDoneButton", resourceCulture); + } + } + + /// + /// 查詢類似 Height 的當地語系化字串。 + /// + internal static string RegionsHeight { + get { + return ResourceManager.GetString("RegionsHeight", resourceCulture); + } + } + + /// + /// 查詢類似 Left 的當地語系化字串。 + /// + internal static string RegionsLeft { + get { + return ResourceManager.GetString("RegionsLeft", resourceCulture); + } + } + + /// + /// 查詢類似 Reset 的當地語系化字串。 + /// + internal static string RegionsResetButton { + get { + return ResourceManager.GetString("RegionsResetButton", resourceCulture); + } + } + + /// + /// 查詢類似 Right 的當地語系化字串。 + /// + internal static string RegionsRight { + get { + return ResourceManager.GetString("RegionsRight", resourceCulture); + } + } + + /// + /// 查詢類似 Save 的當地語系化字串。 + /// + internal static string RegionsSaveButton { + get { + return ResourceManager.GetString("RegionsSaveButton", resourceCulture); + } + } + + /// + /// 查詢類似 Stored regions 的當地語系化字串。 + /// + internal static string RegionsStoredRegions { + get { + return ResourceManager.GetString("RegionsStoredRegions", resourceCulture); + } + } + + /// + /// 查詢類似 Regions: 的當地語系化字串。 + /// + internal static string RegionsTitle { + get { + return ResourceManager.GetString("RegionsTitle", resourceCulture); + } + } + + /// + /// 查詢類似 Top 的當地語系化字串。 + /// + internal static string RegionsTop { + get { + return ResourceManager.GetString("RegionsTop", resourceCulture); + } + } + + /// + /// 查詢類似 Width 的當地語系化字串。 + /// + internal static string RegionsWidth { + get { + return ResourceManager.GetString("RegionsWidth", resourceCulture); + } + } + + /// + /// 查詢類似 X 的當地語系化字串。 + /// + internal static string RegionsX { + get { + return ResourceManager.GetString("RegionsX", resourceCulture); + } + } + + /// + /// 查詢類似 Y 的當地語系化字串。 + /// + internal static string RegionsY { + get { + return ResourceManager.GetString("RegionsY", resourceCulture); + } + } + + /// + /// 查詢類似 Right-click here to start... 的當地語系化字串。 + /// + internal static string RightClick { + get { + return ResourceManager.GetString("RightClick", resourceCulture); + } + } + + /// + /// 查詢類似 Clone current window 的當地語系化字串。 + /// + internal static string SettingsHotKeyClone { + get { + return ResourceManager.GetString("SettingsHotKeyClone", resourceCulture); + } + } + + /// + /// 查詢類似 These system-wide shortcuts can also be used when OnTopReplica is not in focus. 的當地語系化字串。 + /// + internal static string SettingsHotKeyDescription { + get { + return ResourceManager.GetString("SettingsHotKeyDescription", resourceCulture); + } + } + + /// + /// 查詢類似 Show/Hide 的當地語系化字串。 + /// + internal static string SettingsHotKeyShowHide { + get { + return ResourceManager.GetString("SettingsHotKeyShowHide", resourceCulture); + } + } + + /// + /// 查詢類似 Hot keys: 的當地語系化字串。 + /// + internal static string SettingsHotKeyTitle { + get { + return ResourceManager.GetString("SettingsHotKeyTitle", resourceCulture); + } + } + + /// + /// 查詢類似 Language: 的當地語系化字串。 + /// + internal static string SettingsLanguageTitle { + get { + return ResourceManager.GetString("SettingsLanguageTitle", resourceCulture); + } + } + + /// + /// 查詢類似 Requires a restart. 的當地語系化字串。 + /// + internal static string SettingsRestartRequired { + get { + return ResourceManager.GetString("SettingsRestartRequired", resourceCulture); + } + } + + /// + /// 查詢類似 Settings 的當地語系化字串。 + /// + internal static string SettingsTitle { + get { + return ResourceManager.GetString("SettingsTitle", resourceCulture); + } + } + + /// /// 查詢類似 Cancel update - ///OnTopReplica will prompt you the next time it is started. 的當地語系化字串。 - /// - internal static string UpdateAvailableCommandCancel { - get { - return ResourceManager.GetString("UpdateAvailableCommandCancel", resourceCulture); - } - } - - /// + ///OnTopReplica will prompt you the next time it is started. 的當地語系化字串。 + /// + internal static string UpdateAvailableCommandCancel { + get { + return ResourceManager.GetString("UpdateAvailableCommandCancel", resourceCulture); + } + } + + /// /// 查詢類似 Download - ///Install OnTopReplica {0}. 的當地語系化字串。 - /// - internal static string UpdateAvailableCommandOk { - get { - return ResourceManager.GetString("UpdateAvailableCommandOk", resourceCulture); - } - } - - /// - /// 查詢類似 The new version can be downloaded and installed from the official website. 的當地語系化字串。 - /// - internal static string UpdateAvailableContent { - get { - return ResourceManager.GetString("UpdateAvailableContent", resourceCulture); - } - } - - /// + ///Install OnTopReplica {0}. 的當地語系化字串。 + /// + internal static string UpdateAvailableCommandOk { + get { + return ResourceManager.GetString("UpdateAvailableCommandOk", resourceCulture); + } + } + + /// + /// 查詢類似 The new version can be downloaded and installed from the official website. 的當地語系化字串。 + /// + internal static string UpdateAvailableContent { + get { + return ResourceManager.GetString("UpdateAvailableContent", resourceCulture); + } + } + + /// /// 查詢類似 Installed version: {0} - ///Available version: {1} 的當地語系化字串。 - /// - internal static string UpdateAvailableExpanded { - get { - return ResourceManager.GetString("UpdateAvailableExpanded", resourceCulture); - } - } - - /// - /// 查詢類似 Version {0} available 的當地語系化字串。 - /// - internal static string UpdateAvailableInstruction { - get { - return ResourceManager.GetString("UpdateAvailableInstruction", resourceCulture); - } - } - - /// - /// 查詢類似 {0}/{1} bytes downloaded. 的當地語系化字串。 - /// - internal static string UpdateDownloadingContent { - get { - return ResourceManager.GetString("UpdateDownloadingContent", resourceCulture); - } - } - - /// - /// 查詢類似 Downloading... 的當地語系化字串。 - /// - internal static string UpdateDownloadingInstruction { - get { - return ResourceManager.GetString("UpdateDownloadingInstruction", resourceCulture); - } - } - - /// + ///Available version: {1} 的當地語系化字串。 + /// + internal static string UpdateAvailableExpanded { + get { + return ResourceManager.GetString("UpdateAvailableExpanded", resourceCulture); + } + } + + /// + /// 查詢類似 Version {0} available 的當地語系化字串。 + /// + internal static string UpdateAvailableInstruction { + get { + return ResourceManager.GetString("UpdateAvailableInstruction", resourceCulture); + } + } + + /// + /// 查詢類似 {0}/{1} bytes downloaded. 的當地語系化字串。 + /// + internal static string UpdateDownloadingContent { + get { + return ResourceManager.GetString("UpdateDownloadingContent", resourceCulture); + } + } + + /// + /// 查詢類似 Downloading... 的當地語系化字串。 + /// + internal static string UpdateDownloadingInstruction { + get { + return ResourceManager.GetString("UpdateDownloadingInstruction", resourceCulture); + } + } + + /// /// 查詢類似 The latest version of OnTopReplica is already installed. The program automatically checks for updates at every start. /// - ///You can keep up to date about OnTopReplica's development, suggest improvements and new features by <a href="website">visiting the official website</a>. 的當地語系化字串。 - /// - internal static string UpdateInfoContent { - get { - return ResourceManager.GetString("UpdateInfoContent", resourceCulture); - } - } - - /// - /// 查詢類似 Latest stable version released on {0}. 的當地語系化字串。 - /// - internal static string UpdateInfoFooter { - get { - return ResourceManager.GetString("UpdateInfoFooter", resourceCulture); - } - } - - /// - /// 查詢類似 OnTopReplica is up to date 的當地語系化字串。 - /// - internal static string UpdateInfoInstruction { - get { - return ResourceManager.GetString("UpdateInfoInstruction", resourceCulture); - } - } - - /// + ///You can keep up to date about OnTopReplica's development, suggest improvements and new features by <a href="website">visiting the official website</a>. 的當地語系化字串。 + /// + internal static string UpdateInfoContent { + get { + return ResourceManager.GetString("UpdateInfoContent", resourceCulture); + } + } + + /// + /// 查詢類似 Latest stable version released on {0}. 的當地語系化字串。 + /// + internal static string UpdateInfoFooter { + get { + return ResourceManager.GetString("UpdateInfoFooter", resourceCulture); + } + } + + /// + /// 查詢類似 OnTopReplica is up to date 的當地語系化字串。 + /// + internal static string UpdateInfoInstruction { + get { + return ResourceManager.GetString("UpdateInfoInstruction", resourceCulture); + } + } + + /// /// 查詢類似 Install - ///OnTopReplica will be closed and the update installed. 的當地語系化字串。 - /// - internal static string UpdateReadyCommandOk { - get { - return ResourceManager.GetString("UpdateReadyCommandOk", resourceCulture); - } - } - - /// - /// 查詢類似 OnTopReplica version {0} is ready to be installed on your computer. 的當地語系化字串。 - /// - internal static string UpdateReadyContent { - get { - return ResourceManager.GetString("UpdateReadyContent", resourceCulture); - } - } - - /// - /// 查詢類似 Update ready 的當地語系化字串。 - /// - internal static string UpdateReadyInstruction { - get { - return ResourceManager.GetString("UpdateReadyInstruction", resourceCulture); - } - } - - /// - /// 查詢類似 OnTopReplica updates 的當地語系化字串。 - /// - internal static string UpdateTitle { - get { - return ResourceManager.GetString("UpdateTitle", resourceCulture); - } - } - } -} + ///OnTopReplica will be closed and the update installed. 的當地語系化字串。 + /// + internal static string UpdateReadyCommandOk { + get { + return ResourceManager.GetString("UpdateReadyCommandOk", resourceCulture); + } + } + + /// + /// 查詢類似 OnTopReplica version {0} is ready to be installed on your computer. 的當地語系化字串。 + /// + internal static string UpdateReadyContent { + get { + return ResourceManager.GetString("UpdateReadyContent", resourceCulture); + } + } + + /// + /// 查詢類似 Update ready 的當地語系化字串。 + /// + internal static string UpdateReadyInstruction { + get { + return ResourceManager.GetString("UpdateReadyInstruction", resourceCulture); + } + } + + /// + /// 查詢類似 OnTopReplica updates 的當地語系化字串。 + /// + internal static string UpdateTitle { + get { + return ResourceManager.GetString("UpdateTitle", resourceCulture); + } + } + } +} diff --git a/OnTopReplica/Strings.cs.Designer.cs b/src/OnTopReplica/Strings.cs.Designer.cs similarity index 100% rename from OnTopReplica/Strings.cs.Designer.cs rename to src/OnTopReplica/Strings.cs.Designer.cs diff --git a/OnTopReplica/Strings.cs.resx b/src/OnTopReplica/Strings.cs.resx similarity index 97% rename from OnTopReplica/Strings.cs.resx rename to src/OnTopReplica/Strings.cs.resx index 2360dd2..1e4cd55 100644 --- a/OnTopReplica/Strings.cs.resx +++ b/src/OnTopReplica/Strings.cs.resx @@ -1,655 +1,655 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 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 - - - Vytvořil: % - Link % is replaced by string AboutAuthorContent. - - - Přerušit aktualizaci. - - - Zobrazit podrobnosti o aplikaci OnTopReplica. - - - Resetovat nastavení OnTopReplica. - - - Aktualizovat OnTopReplica. - - - Rádi byste přispěli k vývoji projektu? Jste vřele vítáni při spolupráci na stávajících nebo nových překladech, případně si můžete stáhnout % ze serveru CodePlex. - - - zdrojové kódy - - - OnTopReplica je založena na knihovně WindowsFormsAero a několika dalších knihovnách a zdrojích. %. - Link % is replaced by string AboutCreditsSourcesContent. - - - Více informací - - - Spolupráce - - - Zásluhy - - - Licence - - - Aktualizace - - - Aplikace je vydána pod % licencí, která splňuje požadavky "open-source" definice dle OSI. - - - Nenáročný a instantní náhled libovolného otevřeného okna (nebo jeho výřezu) v systému. - - - O programu OnTopReplica - - - Překlady: % - {0} translators (do not end with period) - - - Aktualizuj! - - - Aplikace OnTopReplica automaticky kontroluje dostupné aktualizace. - - - Verze: % - - - Resetovat nastavení okna? - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Vytvořil: % + Link % is replaced by string AboutAuthorContent. + + + Přerušit aktualizaci. + + + Zobrazit podrobnosti o aplikaci OnTopReplica. + + + Resetovat nastavení OnTopReplica. + + + Aktualizovat OnTopReplica. + + + Rádi byste přispěli k vývoji projektu? Jste vřele vítáni při spolupráci na stávajících nebo nových překladech, případně si můžete stáhnout % ze serveru CodePlex. + + + zdrojové kódy + + + OnTopReplica je založena na knihovně WindowsFormsAero a několika dalších knihovnách a zdrojích. %. + Link % is replaced by string AboutCreditsSourcesContent. + + + Více informací + + + Spolupráce + + + Zásluhy + + + Licence + + + Aktualizace + + + Aplikace je vydána pod % licencí, která splňuje požadavky "open-source" definice dle OSI. + + + Nenáročný a instantní náhled libovolného otevřeného okna (nebo jeho výřezu) v systému. + + + O programu OnTopReplica + + + Překlady: % + {0} translators (do not end with period) + + + Aktualizuj! + + + Aplikace OnTopReplica automaticky kontroluje dostupné aktualizace. + + + Verze: % + + + Resetovat nastavení okna? + + &Resetovat -Všechna nastavení budou ztracena. - - - Operace "Resetovat okno" je vhodná k inicializaci všech nastavení pokud jste například ztratili kontrolu nad oknem nebo jej přesunuli mimo viditelnou plochu obrazovky. - - - Resetovat - - - Resetovat nastavení? - - - Operace "Resetovat nastavení" smaže veškerá uživatelská nastavení aplikace OnTopReplica a vrátí nastavení do stejného stavu jako po instalaci (všechny uložené informace, jako například uložené výřezy oken, budou ztraceny). - - - Resetovat nastavení - - - &Storno - & marks the ALT+[] shortcut - - - Označte výřez pomocí myši. - - - Podrobnosti - - - Podrobnosti k Windows Aero - - - Windows Aero je k dispozici pouze na systémech Windows Vista Home Premium a vyšších. - - - Funkce 'Desktop Composition' není povolena. - - +Všechna nastavení budou ztracena. + + + Operace "Resetovat okno" je vhodná k inicializaci všech nastavení pokud jste například ztratili kontrolu nad oknem nebo jej přesunuli mimo viditelnou plochu obrazovky. + + + Resetovat + + + Resetovat nastavení? + + + Operace "Resetovat nastavení" smaže veškerá uživatelská nastavení aplikace OnTopReplica a vrátí nastavení do stejného stavu jako po instalaci (všechny uložené informace, jako například uložené výřezy oken, budou ztraceny). + + + Resetovat nastavení + + + &Storno + & marks the ALT+[] shortcut + + + Označte výřez pomocí myši. + + + Podrobnosti + + + Podrobnosti k Windows Aero + + + Windows Aero je k dispozici pouze na systémech Windows Vista Home Premium a vyšších. + + + Funkce 'Desktop Composition' není povolena. + + Pro pokračování je nutné povolit funkci "Desktop Composition" výběrem tématu 'Windows Aero' v nastavení vzhledu Windows. -Uvedené lze provést například kliknutním pravým tlačítkem myši na plochu a zvolením akce "Přizpůsobit". - - - Podrobnosti k chybě - - - Chyba: - - - Zvolené okno bylo zavřeno nebo již není platné z jiných důvodů. - - - Chyba - - +Uvedené lze provést například kliknutním pravým tlačítkem myši na plochu a zvolením akce "Přizpůsobit". + + + Podrobnosti k chybě + + + Chyba: + + + Zvolené okno bylo zavřeno nebo již není platné z jiných důvodů. + + + Chyba + + Funkce 'Desktop Composition' není ve vašem systému podporována. -Tuto aplikaci je možné spouštět pouze na systémech Windows Vista Home Premium a vyšších. - - - Funkce Desktop Composition není podporována - - - Náhled nebyl nahrán. - - - Nelze vytvořit náhled. - - - Nelze vložit okno. - - - Kontrola aktualizací se nezdařila. - - - Zdá se, že aplikace OnTopReplica nebyla nainstalována pomocí 'ClickOnce'. Aktualizaci musíte provést ručně (navštivte <a href="http://ontopreplica.codeplex.com">domácí stránku aplikace OnTopReplica</a>). - - - Aplikaci OnTopReplica se nepodařilo zjistit, zda existuje nová verze. Zkontrolujte, zda jste připojeni k síti Internet. Pokud ano, je možné, že webové stránky projektu jsou dočasně mimo provoz. - - - Režim - - - Vždy na vrchu - - - Nastaví aplikaci OnTopReplica, aby zůstávala vždy na vrchu. - - - Proklikávání - - - Aplikace OnTopReplica se bude chovat jako průhledná vrstva přes kterou bude možno proklikávat do podložených oken. - - - Standardní - - - Aplikace OnTopReplica se bude chovat jako běžné okno. Jiná okna mohou překrýt okno aplikace. - - - Aplikace OnTopReplica přes celou obrazovku - - - Zrušit - - - Povolit seskupení - - - Výběrem více položek aktivujete seskupení - - - Seskupení je aktivní - - - Seskupení - - - Okna - Column Header of list, simply refers to available windows to be cloned - - - Domácí stránka: www.codeplex.com/ontopreplica. - - - Přejete si povolit "přeposílání kliknutí"? - - +Tuto aplikaci je možné spouštět pouze na systémech Windows Vista Home Premium a vyšších. + + + Funkce Desktop Composition není podporována + + + Náhled nebyl nahrán. + + + Nelze vytvořit náhled. + + + Nelze vložit okno. + + + Kontrola aktualizací se nezdařila. + + + Zdá se, že aplikace OnTopReplica nebyla nainstalována pomocí 'ClickOnce'. Aktualizaci musíte provést ručně (navštivte <a href="http://ontopreplica.codeplex.com">domácí stránku aplikace OnTopReplica</a>). + + + Aplikaci OnTopReplica se nepodařilo zjistit, zda existuje nová verze. Zkontrolujte, zda jste připojeni k síti Internet. Pokud ano, je možné, že webové stránky projektu jsou dočasně mimo provoz. + + + Režim + + + Vždy na vrchu + + + Nastaví aplikaci OnTopReplica, aby zůstávala vždy na vrchu. + + + Proklikávání + + + Aplikace OnTopReplica se bude chovat jako průhledná vrstva přes kterou bude možno proklikávat do podložených oken. + + + Standardní + + + Aplikace OnTopReplica se bude chovat jako běžné okno. Jiná okna mohou překrýt okno aplikace. + + + Aplikace OnTopReplica přes celou obrazovku + + + Zrušit + + + Povolit seskupení + + + Výběrem více položek aktivujete seskupení + + + Seskupení je aktivní + + + Seskupení + + + Okna + Column Header of list, simply refers to available windows to be cloned + + + Domácí stránka: www.codeplex.com/ontopreplica. + + + Přejete si povolit "přeposílání kliknutí"? + + V tomto režimu aplikace OnTopReplica přeposílá kliknutí levého tlačítka myši do zdrojového okna (je tedy možné provádět základní ovládání zdrojového okna bez nutnosti jej aktivovat). -Ukončit režim "přeposíání kliknutí" je možné opětovným vyvolání položky v menu. - - - Přeposílání kliknutí - - - Povolit "Proklikávání" v celoobrazovkovém režimu? - - - "Proklikávání" funguje pouze pokud je povoleno v menu a okno má nastavenou průhlednost. - - +Ukončit režim "přeposíání kliknutí" je možné opětovným vyvolání položky v menu. + + + Přeposílání kliknutí + + + Povolit "Proklikávání" v celoobrazovkovém režimu? + + + "Proklikávání" funguje pouze pokud je povoleno v menu a okno má nastavenou průhlednost. + + V tomto režimu se bude okno roztažené přes celou obrazovku chovat jako poloprůhledná vrstva, přes kterou bude možné "proklikávat" na podložená okna. -K návratu do standardního režimu je možné přejít kdykoli dvojklikem na ikonu v oznamovací oblasti (traye). - - +K návratu do standardního režimu je možné přejít kdykoli dvojklikem na ikonu v oznamovací oblasti (traye). + + Ne. -Režim "Proklikávání" je možné zvolit později v menu - - - Používat "Proklikávání" - - - Režim "Proklikávání" - - - Aplikace OnTopReplica byla aktualizována. - - - Pro použití aktualizací je potřeba aplikaci OnTopReplica restartovat. - - - Aktualizace proběhla úspěšně - - - OnTopReplica je aktuální. - - - Žádná aktualizace není k dispozici. - - - Jazyk - - - O aplikaci... - - - Skryje hlavní okno a zobrazí informace "O aplikaci". - - - Okraj - - - Přepínač, který definuje, zda má aplikace OnTopReplica viditelný okraj okna. - - - Přeposílání kliknutí - - - Zapne "přeposílání kliknutí" do zdrojového okna. - - - Proklikávání - - - Aplikace OnTopReplica se bude chovat jako průhledná vrstva přes kterou bude možno proklikávat do podložených oken. - - - Zavřít - - - Ukončí aplikaci OnTopReplica. - - - 2:1 Dvojnásobná - - - Celá obrazovka - - - 1:2 Poloviční - - - 1:1 Jako zdroj - - - 1:4 Čtvrtinová - - - Seskupení - - - OnTopReplica bude automaticky přepínat mezi okny z uživatelsky definované skupiny tak, že zobrazeno bude vždy to naposledy deaktivované okno. - - - 100% (neprůhledné) - - - Nastaví aplikaci OnTopReplica jako neprůhlednou. - - - 25% - - - Nastaví průhlednost na 25%. - - - 50% - - - Nastaví průhlednost na 50%. - - - 75% - - - Nastaví průhlednost na 75%. - - - Průhlednost - - - Otevřít - - - Zobrazí aplikaci OnTopReplica. - - - Dolní levý roh - - - Dolní pravý roh - - - Uprostřed - - - Vypnuto - - - Umístění - - - Automatická pozice aplikace OnTopReplica vzhledem k obrazovce. - - - Horní levý roh - - - Horní pravý rok - - - Opustit celoobrazovkový režim - - - Ukládat pozici a velikost okna - - - Přepínač, který definuje, zda si má aplikace OnTopReplica ukládat poslední pozici a velikost okna a obnovovat tyto údaje po restartování aplikace. - - - Minimalizovat do traye - - - Minimalizuje aplikaci OnTopReplica jako ikonu v systémové oblasti. - - - Vybrat výřez... - - - Přepne do režimu "výřezu", který umožní zvolit pouze část okna jako náhled. - - - Resetovat nastavení okna - - - Resetuje nastavení a pozici okna aplikace OnTopReplica. - - - Velikost - - - Obnovit naposledy zobrazené okno - - - Pokud je zatrženo, OnTopReplica se pokusí po spuštění obnovit naposledy zobrazované okno. - - - Nastavení... - - - Zobrazí okno s nastavením. - - - Přepnout do okna - - - Přepne do zdrojového okna a skryje aplikaci OnTopReplica. - - - Vybrat okno - - - - žádné - - - - Zobrazí seznam oken, které je možné použít jako zdroj. - - - - celé okno - - - - Aktuální výřez: - - - Smazat - - - Hotovo - - - Výška - - - Reset - - - Uložit - - - Uložené výřezy - - - Výřezy: - - - Šířka - - - Začněte klepnutím sem pravým tlačítkem myši... - - - Zavřít toto okno - - - Tyto klávesové zkratky jsou platné napříč systémem a je možné je použít i pokud OnTopReplica není aktivním oknem. - - - Zobrazit/Skrýt - - - Klávesové zkratky: - - - Jazyk: - - - Vyžaduje restart. - - - Nastavení - - +Režim "Proklikávání" je možné zvolit později v menu + + + Používat "Proklikávání" + + + Režim "Proklikávání" + + + Aplikace OnTopReplica byla aktualizována. + + + Pro použití aktualizací je potřeba aplikaci OnTopReplica restartovat. + + + Aktualizace proběhla úspěšně + + + OnTopReplica je aktuální. + + + Žádná aktualizace není k dispozici. + + + Jazyk + + + O aplikaci... + + + Skryje hlavní okno a zobrazí informace "O aplikaci". + + + Okraj + + + Přepínač, který definuje, zda má aplikace OnTopReplica viditelný okraj okna. + + + Přeposílání kliknutí + + + Zapne "přeposílání kliknutí" do zdrojového okna. + + + Proklikávání + + + Aplikace OnTopReplica se bude chovat jako průhledná vrstva přes kterou bude možno proklikávat do podložených oken. + + + Zavřít + + + Ukončí aplikaci OnTopReplica. + + + 2:1 Dvojnásobná + + + Celá obrazovka + + + 1:2 Poloviční + + + 1:1 Jako zdroj + + + 1:4 Čtvrtinová + + + Seskupení + + + OnTopReplica bude automaticky přepínat mezi okny z uživatelsky definované skupiny tak, že zobrazeno bude vždy to naposledy deaktivované okno. + + + 100% (neprůhledné) + + + Nastaví aplikaci OnTopReplica jako neprůhlednou. + + + 25% + + + Nastaví průhlednost na 25%. + + + 50% + + + Nastaví průhlednost na 50%. + + + 75% + + + Nastaví průhlednost na 75%. + + + Průhlednost + + + Otevřít + + + Zobrazí aplikaci OnTopReplica. + + + Dolní levý roh + + + Dolní pravý roh + + + Uprostřed + + + Vypnuto + + + Umístění + + + Automatická pozice aplikace OnTopReplica vzhledem k obrazovce. + + + Horní levý roh + + + Horní pravý rok + + + Opustit celoobrazovkový režim + + + Ukládat pozici a velikost okna + + + Přepínač, který definuje, zda si má aplikace OnTopReplica ukládat poslední pozici a velikost okna a obnovovat tyto údaje po restartování aplikace. + + + Minimalizovat do traye + + + Minimalizuje aplikaci OnTopReplica jako ikonu v systémové oblasti. + + + Vybrat výřez... + + + Přepne do režimu "výřezu", který umožní zvolit pouze část okna jako náhled. + + + Resetovat nastavení okna + + + Resetuje nastavení a pozici okna aplikace OnTopReplica. + + + Velikost + + + Obnovit naposledy zobrazené okno + + + Pokud je zatrženo, OnTopReplica se pokusí po spuštění obnovit naposledy zobrazované okno. + + + Nastavení... + + + Zobrazí okno s nastavením. + + + Přepnout do okna + + + Přepne do zdrojového okna a skryje aplikaci OnTopReplica. + + + Vybrat okno + + + - žádné - + + + Zobrazí seznam oken, které je možné použít jako zdroj. + + + - celé okno - + + + Aktuální výřez: + + + Smazat + + + Hotovo + + + Výška + + + Reset + + + Uložit + + + Uložené výřezy + + + Výřezy: + + + Šířka + + + Začněte klepnutím sem pravým tlačítkem myši... + + + Zavřít toto okno + + + Tyto klávesové zkratky jsou platné napříč systémem a je možné je použít i pokud OnTopReplica není aktivním oknem. + + + Zobrazit/Skrýt + + + Klávesové zkratky: + + + Jazyk: + + + Vyžaduje restart. + + + Nastavení + + Zrušit aktualizaci -Aplikace OnTopReplica vás vyzve k aktualizaci při dalším startu. - - +Aplikace OnTopReplica vás vyzve k aktualizaci při dalším startu. + + Pokračovat -Instalovat OnTopReplica {0}. - - - Nová verze bude automaticky stažena a nainstalována. - - +Instalovat OnTopReplica {0}. + + + Nová verze bude automaticky stažena a nainstalována. + + Nainstalovaná verze: {0} -Dostupná verze: {1} - - - Verze {0} je k dispozici - - - staženo {0}/{1} bajtů. +Dostupná verze: {1} + + + Verze {0} je k dispozici + + + staženo {0}/{1} bajtů. {0} downloaded bytes {1} total bytes {0} bytes geladen von {1} bytes gesamt {0} downloaded bytes {1} total bytes {0} downloaded bytes {1} total bytes -{0} downloaded bytes {1} total bytes - - - Stahování... - - +{0} downloaded bytes {1} total bytes + + + Stahování... + + Poslední verze aplikace OnTopReplica je již nainstalována. Aktualizace se kontrolují automaticky při každém spuštění. -Na <a href="website">oficiálních stránkách</a> můžete sledovat aktuální vývoj aplikace nebo hlásit chyby či navrhovat vylepšení. - The website link should be enclosed in <a href="website"></a> tags. - - - Poslední stabilní verze byla vydána {0}. - {0} last version release date - - - OnTopReplica je aktuální - - +Na <a href="website">oficiálních stránkách</a> můžete sledovat aktuální vývoj aplikace nebo hlásit chyby či navrhovat vylepšení. + The website link should be enclosed in <a href="website"></a> tags. + + + Poslední stabilní verze byla vydána {0}. + {0} last version release date + + + OnTopReplica je aktuální + + Instalovat -OnTopReplica bude nyní ukončena a spustí se aktualizace. - - - Nová verze {0} OnTopReplica je připravena k instalaci. - - - Aktualizace je připravena - - - Aktualizace OnTopReplica - - - - Must not be localized. Leave blank in non-default languages. - - - - Can be left blank. - - - - Must not be localized. Leave blank in non-default languages. - - - - Probably doesn't need localization. :) - - - Advanced - +OnTopReplica bude nyní ukončena a spustí se aktualizace. + + + Nová verze {0} OnTopReplica je připravena k instalaci. + + + Aktualizace je připravena + + + Aktualizace OnTopReplica + + + + Must not be localized. Leave blank in non-default languages. + + + + Can be left blank. + + + + Must not be localized. Leave blank in non-default languages. + + + + Probably doesn't need localization. :) + + + Advanced + \ No newline at end of file diff --git a/OnTopReplica/Strings.da.Designer.cs b/src/OnTopReplica/Strings.da.Designer.cs similarity index 100% rename from OnTopReplica/Strings.da.Designer.cs rename to src/OnTopReplica/Strings.da.Designer.cs diff --git a/OnTopReplica/Strings.da.resx b/src/OnTopReplica/Strings.da.resx similarity index 97% rename from OnTopReplica/Strings.da.resx rename to src/OnTopReplica/Strings.da.resx index ea2a6a7..103db95 100644 --- a/OnTopReplica/Strings.da.resx +++ b/src/OnTopReplica/Strings.da.resx @@ -1,650 +1,650 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 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 - - - Annuller updateringen. - - - Vis detaljer om OnTopReplica. - - - Nulstil alle OnTopReplica indstillinger. - - - Opdater OnTopReplica nu. - - - En letvægts, live, miniature udgave af et vindue du vælger, der altid er øverst. - - - Opdater nu! - - - OnTopReplica checker automatiskt for opdateringer. - - - - Probably doesn't need localization. :) - - - Nulstil vinduet helt? - - - &NulstilAlle ændringer vil blive tabt. - - - Kan bruges til at nulstille alle indstillinger hvis du mister kontrollen over vinduet eller hvis det er flyttet uden for skærmen. - - - Nulstil - - - Nulstil indstillinger? - - - Dette nulstiller OnTopReplica til standard indstillingerne (alle gemte informationer, som gemte områder, vil blive slettet). - - - Nulstil indstillingerne - - - &Annuller - & marks the ALT+[] shortcut - - - Tegn områder med musen - - - Detaljer - - - Detaljer om Windows Aero - - - Windows Aero er kun tilgængelig op Windows Vista Home Premium eller højere. - - - Windows Aero effekter er ikke slået til - - - Du skal aktiverere "Windows Aero" som tema i Windows.For at gøre dette skal du højreklikke på skrivebordet og vælge personlige indstillinger. - - - Fejl detaljer. - - - Fejl: - - - Vinduet du har valgt er lukket eller er ikke gyldigt mere. - - - Fejl - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Annuller updateringen. + + + Vis detaljer om OnTopReplica. + + + Nulstil alle OnTopReplica indstillinger. + + + Opdater OnTopReplica nu. + + + En letvægts, live, miniature udgave af et vindue du vælger, der altid er øverst. + + + Opdater nu! + + + OnTopReplica checker automatiskt for opdateringer. + + + + Probably doesn't need localization. :) + + + Nulstil vinduet helt? + + + &NulstilAlle ændringer vil blive tabt. + + + Kan bruges til at nulstille alle indstillinger hvis du mister kontrollen over vinduet eller hvis det er flyttet uden for skærmen. + + + Nulstil + + + Nulstil indstillinger? + + + Dette nulstiller OnTopReplica til standard indstillingerne (alle gemte informationer, som gemte områder, vil blive slettet). + + + Nulstil indstillingerne + + + &Annuller + & marks the ALT+[] shortcut + + + Tegn områder med musen + + + Detaljer + + + Detaljer om Windows Aero + + + Windows Aero er kun tilgængelig op Windows Vista Home Premium eller højere. + + + Windows Aero effekter er ikke slået til + + + Du skal aktiverere "Windows Aero" som tema i Windows.For at gøre dette skal du højreklikke på skrivebordet og vælge personlige indstillinger. + + + Fejl detaljer. + + + Fejl: + + + Vinduet du har valgt er lukket eller er ikke gyldigt mere. + + + Fejl + + Windows Aero effekter er ikke understøttet af dit styresystem. -Dette program kræver Windows Vista Home Premium eller bedre. - - - Skrivebords komposition ikke understøttet - - - Ingen miniature indlæst. - - - Kan ikke lave miniature. - - - Kunne ikke passes til vinduet. - - - Kan ikke søge efter opdateringer. - - - OnTopReplica blev ikke installeret ved hjælp af 'ClickOnce'. Du bliver nødt til at opdatere manuelt (besøg <a href="http://ontopreplica.codeplex.com">OnTopReplica's hjemmeside</a>). - - - Tilstande - - - Altid øverst - - - Får OnTopReplica til altid at være øverst. - - - Klikke igennem - - - OnTopReplica vil opføre sig som en gennemsigtig film der lader dig klikke igennem til de underliggende vinduer. - - - Standard - - - Opfører sig som et almindeligt vindue. Du kan trække andre viduer ind over OnTopReplica. - - - OnTopReplica fuld skærm - - - Hjemmeside: www.codeplex.com/ontopreplica. - - - Ønsker du at aktivere "click forwarding"? - - +Dette program kræver Windows Vista Home Premium eller bedre. + + + Skrivebords komposition ikke understøttet + + + Ingen miniature indlæst. + + + Kan ikke lave miniature. + + + Kunne ikke passes til vinduet. + + + Kan ikke søge efter opdateringer. + + + OnTopReplica blev ikke installeret ved hjælp af 'ClickOnce'. Du bliver nødt til at opdatere manuelt (besøg <a href="http://ontopreplica.codeplex.com">OnTopReplica's hjemmeside</a>). + + + Tilstande + + + Altid øverst + + + Får OnTopReplica til altid at være øverst. + + + Klikke igennem + + + OnTopReplica vil opføre sig som en gennemsigtig film der lader dig klikke igennem til de underliggende vinduer. + + + Standard + + + Opfører sig som et almindeligt vindue. Du kan trække andre viduer ind over OnTopReplica. + + + OnTopReplica fuld skærm + + + Hjemmeside: www.codeplex.com/ontopreplica. + + + Ønsker du at aktivere "click forwarding"? + + Hvis denne funktion er aktiveret vil OnTopReplica vidersende alle venstr museklik til det klonede vindue (dette gør dig i stand til at udføre basis musefunktioner i det klonede vindue uden at skulle aktivere det). -For at afslutte denne funktion skal du højreklikke på OnTopReplica og deaktivere "Click forwarding" i menuen. - - - Click forwarding - - - Ønskes gennem klik i fuldskærms tilstand? - - - Gennem klik virker kun hvis det er blevet aktiveret i gendan undermenuen og hvis vinduet er delvist gennemsigtigt. - - +For at afslutte denne funktion skal du højreklikke på OnTopReplica og deaktivere "Click forwarding" i menuen. + + + Click forwarding + + + Ønskes gennem klik i fuldskærms tilstand? + + + Gennem klik virker kun hvis det er blevet aktiveret i gendan undermenuen og hvis vinduet er delvist gennemsigtigt. + + I denne tilstand vil fuld skærm vinduet opføre sig som et delvist gennemsigtigt lag, hvilket gør dig i stand til at klikke på de underliggende vinduer. -For at komme tilbage til normal tilstand, dobbeltklik på OnTopReplica ikonet i meddelelsesområdet på proceslinjen. - - +For at komme tilbage til normal tilstand, dobbeltklik på OnTopReplica ikonet i meddelelsesområdet på proceslinjen. + + Nej. -Du kan aktivere gennem klik senere. - - - Brug gennem klik. - - - Gennem klik tilstand - - - OnTopReplica er blevet opdateret. - - - For at benytte den opdaterede udgave af OnTopReplica skal du genstarte programmet. - - - Opdatering fuldført - - - OnTopReplice er opdateret. - - - Ingen opdateringer er tilgængelige - - - Sprog - - - Om... - - - Skjuler hoved vinduet og viser om boxen. - - - Krom - - - Vælger Chrome kanten rundt om vinduet til/fra - - - Click forwarding - - - Aktiver "click forwarding" til det klonede vindue - - - Klikke igennem - - - OnTopReplica vil opføre sig som en gennemsigtig film der lader dig klikke igennem til de underliggende vinduer. - - - Luk - - - Lukker OnTopReplica. - - - 2:1 dobbelt - - - Fuld skærm - - - 1:2 halv - - - 1:1 Pas til vinduet - - - 1:4 kvart - - - 100% (uigennemsigtig) - - - Sæt OnTopReplica til at være helt uigennemsigtig. - - - 25% - - - Sætter OnTopReplica til 25% uigennemsigtighed. - - - 50% - - - Sætter OnTopReplica til 50% uigennemsigtighed. - - - 75% - - - Sætter OnTopReplica til 75% uigennemsigtighed. - - - Uigennemsigtighed - - - åben - - - Viser OnTopReplica. - - - Nederst venstre - - - Nederst højre - - - Position - - - Sæt OnTopReplica automatiskt på den aktuelle skærm. - - - Øverst venstre - - - Øverst højre - - - Afslut fuldskærm tilstand. - - - Gendan sidste position og størrelse - - - Vælger om OnTopReplica skal gemme sidst brugte størrelse og position, til næste gang det starter op. - - - Minimer til systembakken. - - - Minimere OnTopReplica til systembakken. - - - Vælg område... - - - Skifter til "område tilstand", der tillader dig at vælge et begrænset område af kildens vindue som miniature. - - - Nulstil vinduet - - - Nulstiller OnTopReplica indstillingerne og hoved vinduet. - - - Genskab - - - Skift til vindue - - - Skifter til kilde vinduet og gemmer OnTopReplica. - - - Vælg vindue - - - - ingen - - - - Viser en liste af vinduer du kan bruge som miniature kilde. - - - - hele - - - - Aktuelt område: - - - Slet - - - Færdig - - - Højde - - - Nulstil - - - Gem - - - Gemte områder - - - Områder: - - - Bredde - - - Højreklik her for at starte... - - - Annuller opdateringenOnTopReplica påminder dig igen næste gang det startes. - - - FortsætInstaller OnTopReplica - - - Den nye version vil automatiskt blive downloaded og installeret. - - +Du kan aktivere gennem klik senere. + + + Brug gennem klik. + + + Gennem klik tilstand + + + OnTopReplica er blevet opdateret. + + + For at benytte den opdaterede udgave af OnTopReplica skal du genstarte programmet. + + + Opdatering fuldført + + + OnTopReplice er opdateret. + + + Ingen opdateringer er tilgængelige + + + Sprog + + + Om... + + + Skjuler hoved vinduet og viser om boxen. + + + Krom + + + Vælger Chrome kanten rundt om vinduet til/fra + + + Click forwarding + + + Aktiver "click forwarding" til det klonede vindue + + + Klikke igennem + + + OnTopReplica vil opføre sig som en gennemsigtig film der lader dig klikke igennem til de underliggende vinduer. + + + Luk + + + Lukker OnTopReplica. + + + 2:1 dobbelt + + + Fuld skærm + + + 1:2 halv + + + 1:1 Pas til vinduet + + + 1:4 kvart + + + 100% (uigennemsigtig) + + + Sæt OnTopReplica til at være helt uigennemsigtig. + + + 25% + + + Sætter OnTopReplica til 25% uigennemsigtighed. + + + 50% + + + Sætter OnTopReplica til 50% uigennemsigtighed. + + + 75% + + + Sætter OnTopReplica til 75% uigennemsigtighed. + + + Uigennemsigtighed + + + åben + + + Viser OnTopReplica. + + + Nederst venstre + + + Nederst højre + + + Position + + + Sæt OnTopReplica automatiskt på den aktuelle skærm. + + + Øverst venstre + + + Øverst højre + + + Afslut fuldskærm tilstand. + + + Gendan sidste position og størrelse + + + Vælger om OnTopReplica skal gemme sidst brugte størrelse og position, til næste gang det starter op. + + + Minimer til systembakken. + + + Minimere OnTopReplica til systembakken. + + + Vælg område... + + + Skifter til "område tilstand", der tillader dig at vælge et begrænset område af kildens vindue som miniature. + + + Nulstil vinduet + + + Nulstiller OnTopReplica indstillingerne og hoved vinduet. + + + Genskab + + + Skift til vindue + + + Skifter til kilde vinduet og gemmer OnTopReplica. + + + Vælg vindue + + + - ingen - + + + Viser en liste af vinduer du kan bruge som miniature kilde. + + + - hele - + + + Aktuelt område: + + + Slet + + + Færdig + + + Højde + + + Nulstil + + + Gem + + + Gemte områder + + + Områder: + + + Bredde + + + Højreklik her for at starte... + + + Annuller opdateringenOnTopReplica påminder dig igen næste gang det startes. + + + FortsætInstaller OnTopReplica + + + Den nye version vil automatiskt blive downloaded og installeret. + + Installeret version: {0} -Tilgængelig version: {1} - - - Created by: %. - Link % is replaced by string AboutAuthorContent. - - - - Must not be localized. Leave blank in non-default languages. - - - Care to contribute to the project? You are welcome to improve available translations, start a new one for your native language or to check out the % from CodePlex. - - - source code - - - OnTopReplica is based upon the WindowsFormsAero library and some other libraries and code sources. %. - Link % is replaced by string AboutCreditsSourcesContent. - - - Read the full credits - - - Contribute - - - Credits - - - License - - - Updates - - - The application is licensed under the % license, which meets the terms of the "open-source" definition specified by OSI. - - - Microsoft Reciprocal (MS-RL) - Can be left blank. - - - About OnTopReplica - - - Translators: {0} - {0} translators (do not end with period) - - - Christian Olaechea M., Daniel Zeus.EX, Federico Lorenzo, Goran Brecelj, Jan Romanczyk, Marco Kraxner, Patrik (batupata), Raúl Morillo, René Mihula, Roberto Leiro, Rodrigo Lourenço, Thomas Amundsen, Eric Hoffmann. - Must not be localized. Leave blank in non-default languages. - - - Version {0} - - - OnTopReplica was unable to check whether an updated version is available. Make sure you are connected to the Internet. If you are, the website may be temporarily down. - - - Disable - - - Enable Group mode - - - Select multiple windows to enable. - - - Group switch mode is enabled. - - - Group switch mode: - - - Windows - Column Header of list, simply refers to available windows to be cloned - - - Advanced - - - Group Switch mode - - - OnTopReplica will automatically clone a window from an user defined group, switching to the one least recently activated to the foreground. - - - Center - - - Disabled - - - Restore last cloned window - - - When enabled, OnTopReplica will attempt to restore the last cloned window on start up. - - - Settings... - - - Displays the settings panel. - - - Clone current window - - - These system-wide shortcuts can also be used when OnTopReplica is not in focus. - - - Show/Hide - - - Hot keys: - - - Language: - - - Requires a restart. - - - Settings - - - Version {0} available - - - {0}/{1} bytes downloaded. +Tilgængelig version: {1} + + + Created by: %. + Link % is replaced by string AboutAuthorContent. + + + + Must not be localized. Leave blank in non-default languages. + + + Care to contribute to the project? You are welcome to improve available translations, start a new one for your native language or to check out the % from CodePlex. + + + source code + + + OnTopReplica is based upon the WindowsFormsAero library and some other libraries and code sources. %. + Link % is replaced by string AboutCreditsSourcesContent. + + + Read the full credits + + + Contribute + + + Credits + + + License + + + Updates + + + The application is licensed under the % license, which meets the terms of the "open-source" definition specified by OSI. + + + Microsoft Reciprocal (MS-RL) + Can be left blank. + + + About OnTopReplica + + + Translators: {0} + {0} translators (do not end with period) + + + Christian Olaechea M., Daniel Zeus.EX, Federico Lorenzo, Goran Brecelj, Jan Romanczyk, Marco Kraxner, Patrik (batupata), Raúl Morillo, René Mihula, Roberto Leiro, Rodrigo Lourenço, Thomas Amundsen, Eric Hoffmann. + Must not be localized. Leave blank in non-default languages. + + + Version {0} + + + OnTopReplica was unable to check whether an updated version is available. Make sure you are connected to the Internet. If you are, the website may be temporarily down. + + + Disable + + + Enable Group mode + + + Select multiple windows to enable. + + + Group switch mode is enabled. + + + Group switch mode: + + + Windows + Column Header of list, simply refers to available windows to be cloned + + + Advanced + + + Group Switch mode + + + OnTopReplica will automatically clone a window from an user defined group, switching to the one least recently activated to the foreground. + + + Center + + + Disabled + + + Restore last cloned window + + + When enabled, OnTopReplica will attempt to restore the last cloned window on start up. + + + Settings... + + + Displays the settings panel. + + + Clone current window + + + These system-wide shortcuts can also be used when OnTopReplica is not in focus. + + + Show/Hide + + + Hot keys: + + + Language: + + + Requires a restart. + + + Settings + + + Version {0} available + + + {0}/{1} bytes downloaded. {0} downloaded bytes {1} total bytes {0} bytes geladen von {1} bytes gesamt {0} downloaded bytes {1} total bytes {0} downloaded bytes {1} total bytes -{0} downloaded bytes {1} total bytes - - - Downloading... - - +{0} downloaded bytes {1} total bytes + + + Downloading... + + The latest version of OnTopReplica is already installed. The program automatically checks for updates at every start. -You can keep up to date about OnTopReplica's development, suggest improvements and new features by <a href="website">visiting the official website</a>. - The website link should be enclosed in <a href="website"></a> tags. - - - Latest stable version released on {0}. - {0} last version release date - - - OnTopReplica is up to date - - +You can keep up to date about OnTopReplica's development, suggest improvements and new features by <a href="website">visiting the official website</a>. + The website link should be enclosed in <a href="website"></a> tags. + + + Latest stable version released on {0}. + {0} last version release date + + + OnTopReplica is up to date + + Install -OnTopReplica will be closed and the update installed. - - - OnTopReplica version {0} is ready to be installed on your computer. - - - Update ready - - - OnTopReplica updates - +OnTopReplica will be closed and the update installed. + + + OnTopReplica version {0} is ready to be installed on your computer. + + + Update ready + + + OnTopReplica updates + \ No newline at end of file diff --git a/OnTopReplica/Strings.de.Designer.cs b/src/OnTopReplica/Strings.de.Designer.cs similarity index 100% rename from OnTopReplica/Strings.de.Designer.cs rename to src/OnTopReplica/Strings.de.Designer.cs diff --git a/OnTopReplica/Strings.de.resx b/src/OnTopReplica/Strings.de.resx similarity index 97% rename from OnTopReplica/Strings.de.resx rename to src/OnTopReplica/Strings.de.resx index 5197922..aa0f729 100644 --- a/OnTopReplica/Strings.de.resx +++ b/src/OnTopReplica/Strings.de.resx @@ -1,655 +1,655 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 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 - - - Aktualisierungsprozess abbrechen. - - - Details über OnTopReplica anzeigen. - - - Alle Einstellungen zurücksetzen. - - - OnTopReplica jetzt aktualisieren. - - - Möchtest du dem Projekt helfen? Du kannst gerne existierende Übersetzungen verbessern, einen neue für deine Sprache hinzufügen, oder den % von CodePlex herunterladen. - - - Quelltext - - - OnTopReplica basiert auf der WindowsFormsAero Bibliothek und ein paar anderen Bibliotheken und Codequellen. %. - Link % is replaced by string AboutCreditsSourcesContent. - - - Lies die vollständige Quellenliste - - - Mitwirken - - - Quellen - - - Lizenz - - - Aktualisierungen - - - Das Programm ist unter der % Lizenz lizensiert, welche die Bedingungen der Definition von "open-source" nach OSI erfüllt. - - - Ein kleines echtzeit-Vorschaubild eines Fensters deiner Wahl, welches immer im Vordergrund bleibt. - - - Über OnTopReplica - - - Übersetzer: {0} - {0} translators (do not end with period) - - - Jetzt prüfen! - - - OnTopReplica sucht automatisch bei jedem Start nach Aktualisierungen. - - - Version {0} - - - - Probably doesn't need localization. :) - - - Fenster vollständig zurücksetzen? - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Aktualisierungsprozess abbrechen. + + + Details über OnTopReplica anzeigen. + + + Alle Einstellungen zurücksetzen. + + + OnTopReplica jetzt aktualisieren. + + + Möchtest du dem Projekt helfen? Du kannst gerne existierende Übersetzungen verbessern, einen neue für deine Sprache hinzufügen, oder den % von CodePlex herunterladen. + + + Quelltext + + + OnTopReplica basiert auf der WindowsFormsAero Bibliothek und ein paar anderen Bibliotheken und Codequellen. %. + Link % is replaced by string AboutCreditsSourcesContent. + + + Lies die vollständige Quellenliste + + + Mitwirken + + + Quellen + + + Lizenz + + + Aktualisierungen + + + Das Programm ist unter der % Lizenz lizensiert, welche die Bedingungen der Definition von "open-source" nach OSI erfüllt. + + + Ein kleines echtzeit-Vorschaubild eines Fensters deiner Wahl, welches immer im Vordergrund bleibt. + + + Über OnTopReplica + + + Übersetzer: {0} + {0} translators (do not end with period) + + + Jetzt prüfen! + + + OnTopReplica sucht automatisch bei jedem Start nach Aktualisierungen. + + + Version {0} + + + + Probably doesn't need localization. :) + + + Fenster vollständig zurücksetzen? + + &Zurücksetzen -Alle Einstellungen werden gelöscht. - - - Dies kann helfen, wenn die Kontrolle über das Fenster verloren wurde, oder es sich ausserhalb des sichtbaren Bereichs des Monitors befindet. - - - Zurücksetzen - - - Einstellungen zurücksetzen? - - - Dies wird alle Einstellungen löschen und OnTopReplica in den Installationszustand zurückführen (alle gespeicherten Daten, wie zum Beispiel gespeicherte Bereiche, gehen verloren). - - - Einstellungen zurücksetzen - - - {0}/{1} bytes heruntergeladen. +Alle Einstellungen werden gelöscht. + + + Dies kann helfen, wenn die Kontrolle über das Fenster verloren wurde, oder es sich ausserhalb des sichtbaren Bereichs des Monitors befindet. + + + Zurücksetzen + + + Einstellungen zurücksetzen? + + + Dies wird alle Einstellungen löschen und OnTopReplica in den Installationszustand zurückführen (alle gespeicherten Daten, wie zum Beispiel gespeicherte Bereiche, gehen verloren). + + + Einstellungen zurücksetzen + + + {0}/{1} bytes heruntergeladen. {0} downloaded bytes {1} total bytes {0} bytes geladen von {1} bytes gesamt {0} downloaded bytes {1} total bytes {0} downloaded bytes {1} total bytes -{0} downloaded bytes {1} total bytes - - - Version {0} ist verfügbar - - +{0} downloaded bytes {1} total bytes + + + Version {0} ist verfügbar + + Installieren -OnTopReplica wird geschlossen und die Aktualisierung installiert. - - - Eine neue Version kann von der offiziellen Webseite heruntergeladen und installiert werden. - - - OnTopReplica version {0} ist zur Installation auf dem Computer bereit. - - - &Abbrechen - & marks the ALT+[] shortcut - - - Zeichne Bereiche mit der Maus. - - - Details - - - Details zu Windows Aero - - - Windows Aero ist nur mit Windows Vista Home Premium or höher verfügbar. - - - 'Desktop-Gestaltung' ist nicht aktiviert. - - +OnTopReplica wird geschlossen und die Aktualisierung installiert. + + + Eine neue Version kann von der offiziellen Webseite heruntergeladen und installiert werden. + + + OnTopReplica version {0} ist zur Installation auf dem Computer bereit. + + + &Abbrechen + & marks the ALT+[] shortcut + + + Zeichne Bereiche mit der Maus. + + + Details + + + Details zu Windows Aero + + + Windows Aero ist nur mit Windows Vista Home Premium or höher verfügbar. + + + 'Desktop-Gestaltung' ist nicht aktiviert. + + Sie müssen die Desktop-Gestaltung aktivieren, indem sie 'Windows Aero' als das von Windows benutzte Anzeigeschema auswählen. -Um dies zu tung rechtsklicken die auf den Desktop und wählen sie 'Anpassen'. - - - Fehler-details - - - Fehler: - - - Es scheint als wäre das gewählte Fenster geschlossen oder nicht länger gültig. - - - Fehler - - +Um dies zu tung rechtsklicken die auf den Desktop und wählen sie 'Anpassen'. + + + Fehler-details + + + Fehler: + + + Es scheint als wäre das gewählte Fenster geschlossen oder nicht länger gültig. + + + Fehler + + Desktop-Gestaltung' wird auf diesem Betriebssystem nicht unterstützt. -Dieses Programm benötigt Windows Vista Home Premium oder besser. - - - Desktop-Gestaltung nicht unterstützt - - - Kein Vorschaubild geladen. - - - Vorschaubild konnte nicht erstellt werden - - - Das Fenster passt nicht in das Vorschaufenster. - - - Es konnte nicht nach Aktualisierungen gesucht werden. - - - Es scheint als wäre OnTopReplica nicht mittels 'ClickOnce' installiert. Sie werden manuell aktualisieren müssen (Besuchen sie <a href="http://ontopreplica.codeplex.com">OnTopReplica's Homepage</a>). - - - OnTopReplica konnte nicht nach einer Aktualisierung suchen. Stellen sie Sicher, dass sie mit dem Internet verbunden sind. Wenn sie mit dem Internet verbunden sind, könnte die Webseite temporäre Probleme haben. - - - Mode - - - Immer im Vordergrund - - - Erzwingt, dass OnTopReplica immer im Vordergrund bleibt. - - - Durchklicken - - - OnTopReplica wird alle Klicks an das darunterliegende Fenster weiterreichen. - - - Standard - - - Verhält sich wie ein normales Fenster. Andere Fenster können OnTopReplica verdecken. - - - OnTopReplica Vollbild - - - Deaktivieren - - - Modus aktivieren - - - Mehrere Fenster zum aktivieren auswählen. - - - Der Gruppenmodus ist aktiv. - - - Gruppenmodus: - - - Fenster - Column Header of list, simply refers to available windows to be cloned - - - Homepage: www.codeplex.com/ontopreplica. - - - Klickweiterleitung aktivieren? - - +Dieses Programm benötigt Windows Vista Home Premium oder besser. + + + Desktop-Gestaltung nicht unterstützt + + + Kein Vorschaubild geladen. + + + Vorschaubild konnte nicht erstellt werden + + + Das Fenster passt nicht in das Vorschaufenster. + + + Es konnte nicht nach Aktualisierungen gesucht werden. + + + Es scheint als wäre OnTopReplica nicht mittels 'ClickOnce' installiert. Sie werden manuell aktualisieren müssen (Besuchen sie <a href="http://ontopreplica.codeplex.com">OnTopReplica's Homepage</a>). + + + OnTopReplica konnte nicht nach einer Aktualisierung suchen. Stellen sie Sicher, dass sie mit dem Internet verbunden sind. Wenn sie mit dem Internet verbunden sind, könnte die Webseite temporäre Probleme haben. + + + Mode + + + Immer im Vordergrund + + + Erzwingt, dass OnTopReplica immer im Vordergrund bleibt. + + + Durchklicken + + + OnTopReplica wird alle Klicks an das darunterliegende Fenster weiterreichen. + + + Standard + + + Verhält sich wie ein normales Fenster. Andere Fenster können OnTopReplica verdecken. + + + OnTopReplica Vollbild + + + Deaktivieren + + + Modus aktivieren + + + Mehrere Fenster zum aktivieren auswählen. + + + Der Gruppenmodus ist aktiv. + + + Gruppenmodus: + + + Fenster + Column Header of list, simply refers to available windows to be cloned + + + Homepage: www.codeplex.com/ontopreplica. + + + Klickweiterleitung aktivieren? + + OnTopReplica wird alle Linksklicks an das geklonte Fenster weiterreichen (dies erlaubt simple Interaktion ohne das andere Fenster zu aktivieren). -Um diese Modus zu beenden ESC drücken. - - - Klickweiterleitung - - - Durchklickmodus aktivieren? - - - Durchklicken funktioniert nur, wenn es im "Grössen"-Menü aktiviert wurde und das Fenster semi-transparent ist. - - +Um diese Modus zu beenden ESC drücken. + + + Klickweiterleitung + + + Durchklickmodus aktivieren? + + + Durchklicken funktioniert nur, wenn es im "Grössen"-Menü aktiviert wurde und das Fenster semi-transparent ist. + + In diesem Modus verhält sich das Vollbild-Fenster wie ein durchsichtiges Overlay und erlaubt es, die Fenster dahinter anzuklicken. -Um zum normalen Modus zurückzukehren, reicht es, OnTopReplica über die Taskleiste oder das Benachrichtigungssymbol zu aktivieren. - - +Um zum normalen Modus zurückzukehren, reicht es, OnTopReplica über die Taskleiste oder das Benachrichtigungssymbol zu aktivieren. + + Nein danke. -Durchklicken kann später aktiviert werden - - - Durchklicken aktivieren - - - Durchklick-Modus - - - OnTopReplica wurde aktualisiert. - - - Um die aktualisierte Version zu nutzen, muss OnTopReplica neu gestartet werden. - - - Aktualisierung abgeschlossen - - - OnTopReplica ist auf dem neuesten Stand. - - - Keine Aktualisierung verfügbar - - - Sprache - - - Über... - - - Versteckt das Hauptfenster und zeigt das Informationsfenster. - - - Erweitert - - - Fensterrahmen anzeigen - - - Schaltet den Fensterrahmen an und aus. - - - Klickweiterleitung aktivieren - - - Leitet klicks an das geklonte Fenster weiter. - - - Durchklicken aktivieren - - - OnTopReplica wird alle klicks an die darunterliegenden Fenster weiterleiten. - - - Schliessen - - - Schliesst OnTopReplica. - - - 2:1 Verdoppeln - - - Vollbild - - - 1:2 Halbieren - - - 1:1 An Fenster anpassen - - - 1:4 Vierteln - - - Gruppenmodus - - - OnTopReplica wird automatisch das zuletzt aktive Fenster aus einer benutzerdefinierten Gruppe klonen. - - - 100% (Undurchsichtig) - - - OnTopReplica ist völlig undurchsichtig. - - - 25% - - - OnTopReplica auf 25% Sichtbarkeit setzen. - - - 50% - - - OnTopReplica auf 50% Sichtbarkeit setzen. - - - 75% - - - OnTopReplica auf 75% Sichtbarkeit setzen. - - - Deckkraft - - - Öffnen - - - OnTopReplica anzeigen. - - - Unten Links - - - Unten Rechts - - - Mitte - - - Deaktiviert - - - Position feststlegen - - - OnTopReplica automatisch auf dem aktiven Bildschirm positionieren. - - - Oben Links - - - Oben Rechts - - - Vollbildmodus beenden - - - Letzte Position und Grösse merken - - - Legt fest, ob OnTopReplica beim Start die gleiche Position und Grösse haben soll, wie beim letzten Beenden. - - - Minimieren - - - Minimiert OnTopReplica in die Taskleiste (oder die Benachrichtigungsleiste). - - - Bereich wählen... - - - Wechselt zum "Bereichsmodus" welcher es erlaubt, nur einen ausgewählten Teil eines Fensters zu klonen. - - - Fenster zurücksetzen - - - Setzt OnTopReplica Einstellungen und das Fenster zurück. - - - Grösse - - - Letztes Fenster wieder wählen - - - OnTopReplica wird beim Start versuchen, das gleiche Fenster wie beim letzten beenden zu klonen. - - - Einstellungen... - - - Zeigt den Einstellungsdialog an. - - - Zum Fenster Wechseln - - - Wechselt zum geklonten Fenster und versteckt OnTopReplica. - - - Fenster wählen - - - - Keins - - - - Zeigt eine Liste von Fenstern die als Klonquelle gewählt werden können. - - - - Alles - - - - Aktueller Bereich: - - - Löschen - - - Fertig - - - Höhe - - - Zurücksetzen - - - Speichern - - - Gespeicherte Bereiche - - - Bereiche: - - - Breite - - - Hier rechtsklicken um zu beginnen... - - - Aktuelles Fenster klonen - - - Diese Tastenkombinationen können auch benutzt werden, wenn OnTopReplica nicht das aktive Fenster ist. - - - Zeigen/Verstecken - - - Tastenkombinationen: - - - Sprache: - - - Benötigt einen Neustart. - - - Herunterladen... - - - Aktualisierung bereit - - +Durchklicken kann später aktiviert werden + + + Durchklicken aktivieren + + + Durchklick-Modus + + + OnTopReplica wurde aktualisiert. + + + Um die aktualisierte Version zu nutzen, muss OnTopReplica neu gestartet werden. + + + Aktualisierung abgeschlossen + + + OnTopReplica ist auf dem neuesten Stand. + + + Keine Aktualisierung verfügbar + + + Sprache + + + Über... + + + Versteckt das Hauptfenster und zeigt das Informationsfenster. + + + Erweitert + + + Fensterrahmen anzeigen + + + Schaltet den Fensterrahmen an und aus. + + + Klickweiterleitung aktivieren + + + Leitet klicks an das geklonte Fenster weiter. + + + Durchklicken aktivieren + + + OnTopReplica wird alle klicks an die darunterliegenden Fenster weiterleiten. + + + Schliessen + + + Schliesst OnTopReplica. + + + 2:1 Verdoppeln + + + Vollbild + + + 1:2 Halbieren + + + 1:1 An Fenster anpassen + + + 1:4 Vierteln + + + Gruppenmodus + + + OnTopReplica wird automatisch das zuletzt aktive Fenster aus einer benutzerdefinierten Gruppe klonen. + + + 100% (Undurchsichtig) + + + OnTopReplica ist völlig undurchsichtig. + + + 25% + + + OnTopReplica auf 25% Sichtbarkeit setzen. + + + 50% + + + OnTopReplica auf 50% Sichtbarkeit setzen. + + + 75% + + + OnTopReplica auf 75% Sichtbarkeit setzen. + + + Deckkraft + + + Öffnen + + + OnTopReplica anzeigen. + + + Unten Links + + + Unten Rechts + + + Mitte + + + Deaktiviert + + + Position feststlegen + + + OnTopReplica automatisch auf dem aktiven Bildschirm positionieren. + + + Oben Links + + + Oben Rechts + + + Vollbildmodus beenden + + + Letzte Position und Grösse merken + + + Legt fest, ob OnTopReplica beim Start die gleiche Position und Grösse haben soll, wie beim letzten Beenden. + + + Minimieren + + + Minimiert OnTopReplica in die Taskleiste (oder die Benachrichtigungsleiste). + + + Bereich wählen... + + + Wechselt zum "Bereichsmodus" welcher es erlaubt, nur einen ausgewählten Teil eines Fensters zu klonen. + + + Fenster zurücksetzen + + + Setzt OnTopReplica Einstellungen und das Fenster zurück. + + + Grösse + + + Letztes Fenster wieder wählen + + + OnTopReplica wird beim Start versuchen, das gleiche Fenster wie beim letzten beenden zu klonen. + + + Einstellungen... + + + Zeigt den Einstellungsdialog an. + + + Zum Fenster Wechseln + + + Wechselt zum geklonten Fenster und versteckt OnTopReplica. + + + Fenster wählen + + + - Keins - + + + Zeigt eine Liste von Fenstern die als Klonquelle gewählt werden können. + + + - Alles - + + + Aktueller Bereich: + + + Löschen + + + Fertig + + + Höhe + + + Zurücksetzen + + + Speichern + + + Gespeicherte Bereiche + + + Bereiche: + + + Breite + + + Hier rechtsklicken um zu beginnen... + + + Aktuelles Fenster klonen + + + Diese Tastenkombinationen können auch benutzt werden, wenn OnTopReplica nicht das aktive Fenster ist. + + + Zeigen/Verstecken + + + Tastenkombinationen: + + + Sprache: + + + Benötigt einen Neustart. + + + Herunterladen... + + + Aktualisierung bereit + + Herunterladen -OnTopReplica {0} instalieren. - - +OnTopReplica {0} instalieren. + + Aktualisierung abbrechen -OnTopReplica wird beim nächsten Start darauf hinweisen. - - - OnTopReplica ist aktuell - - - Neuste stabile Programmversion vom {0}. - {0} last version release date - - +OnTopReplica wird beim nächsten Start darauf hinweisen. + + + OnTopReplica ist aktuell + + + Neuste stabile Programmversion vom {0}. + {0} last version release date + + Die aktuelle Version vom OnTopReplica ist schon installiert. Das Programm sucht automatisch bei jedem Start nach Aktualisierungen. -Sie können über die Entwicklung von OnTopReplica auf dem Laufenden bleiben und verbesserungen vorschlagen indem sie die <a href="website">offizielle Webseite besuchen</a>. - The website link should be enclosed in <a href="website"></a> tags. - - - Einstellungen - - - OnTopReplica Aktualisierungen - - +Sie können über die Entwicklung von OnTopReplica auf dem Laufenden bleiben und verbesserungen vorschlagen indem sie die <a href="website">offizielle Webseite besuchen</a>. + The website link should be enclosed in <a href="website"></a> tags. + + + Einstellungen + + + OnTopReplica Aktualisierungen + + Installierte Version: {0} -Verfügbare Version: {1} - - - Autor: %. - Link % is replaced by string AboutAuthorContent. - - - - Must not be localized. Leave blank in non-default languages. - - - Microsoft Reciprocal (MS-RL) - Can be left blank. - - - - Must not be localized. Leave blank in non-default languages. - +Verfügbare Version: {1} + + + Autor: %. + Link % is replaced by string AboutAuthorContent. + + + + Must not be localized. Leave blank in non-default languages. + + + Microsoft Reciprocal (MS-RL) + Can be left blank. + + + + Must not be localized. Leave blank in non-default languages. + \ No newline at end of file diff --git a/OnTopReplica/Strings.es.Designer.cs b/src/OnTopReplica/Strings.es.Designer.cs similarity index 100% rename from OnTopReplica/Strings.es.Designer.cs rename to src/OnTopReplica/Strings.es.Designer.cs diff --git a/OnTopReplica/Strings.es.resx b/src/OnTopReplica/Strings.es.resx similarity index 97% rename from OnTopReplica/Strings.es.resx rename to src/OnTopReplica/Strings.es.resx index 673af94..fe40e05 100644 --- a/OnTopReplica/Strings.es.resx +++ b/src/OnTopReplica/Strings.es.resx @@ -1,650 +1,650 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 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 - - - Cancela el progreso de actualización. - - - Muestra detalles acerca de OnTopReplica. - - - Reinicia la configuración de OnTopReplica a sus valores iniciales. - - - Actualiza OnTopReplica ahora. - - - Una copia liviana, en tiempo real y siempre encima de cualquier ventana. - - - Actualizar ahora! - - - OnTopReplica busca actualizaciones automáticamente. - - - - Probably doesn't need localization. :) - - - ¿Reiniciar la ventana? - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Cancela el progreso de actualización. + + + Muestra detalles acerca de OnTopReplica. + + + Reinicia la configuración de OnTopReplica a sus valores iniciales. + + + Actualiza OnTopReplica ahora. + + + Una copia liviana, en tiempo real y siempre encima de cualquier ventana. + + + Actualizar ahora! + + + OnTopReplica busca actualizaciones automáticamente. + + + + Probably doesn't need localization. :) + + + ¿Reiniciar la ventana? + + &Reiniciar -Todos los ajustes se perderán. - - - Puede ser usado para reiniciar todos los ajustes si se ha perdido el control sobre las ventanas o se ha movido más allá de los bordes de la pantalla. - - - Reiniciar - - - ¿Reiniciar los ajustes? - - - Esta acción borrará todos los ajustes de OnTopReplica tras la instalación, volviendo a la configuración inicial (toda la información guardada, como las regiones personalizadas se perderán). - - - Reiniciar ajustes - - - &Cancelar - & marks the ALT+[] shortcut - - - Crea una región utilizando el ratón. - - - Detalles - - - Detalles en Windows Aero - - - Windows Aero sólo está disponible en Windows Vista o 7, en su versión Home Premium o superior. - - - La Composición de Escritorio no está activada. - - +Todos los ajustes se perderán. + + + Puede ser usado para reiniciar todos los ajustes si se ha perdido el control sobre las ventanas o se ha movido más allá de los bordes de la pantalla. + + + Reiniciar + + + ¿Reiniciar los ajustes? + + + Esta acción borrará todos los ajustes de OnTopReplica tras la instalación, volviendo a la configuración inicial (toda la información guardada, como las regiones personalizadas se perderán). + + + Reiniciar ajustes + + + &Cancelar + & marks the ALT+[] shortcut + + + Crea una región utilizando el ratón. + + + Detalles + + + Detalles en Windows Aero + + + Windows Aero sólo está disponible en Windows Vista o 7, en su versión Home Premium o superior. + + + La Composición de Escritorio no está activada. + + Debe activar la Composición de Escritorio seleccionando "Windows Aero" como tema utilizado en Windows. -Para ello, click derecho en el escritorio y buscar la opción en Personalizar. - - - Detalles del error - - - Error: - - - Parece que la ventana seleccionada ha sido cerrada o ya no es válida. - - - Error - - +Para ello, click derecho en el escritorio y buscar la opción en Personalizar. + + + Detalles del error + + + Error: + + + Parece que la ventana seleccionada ha sido cerrada o ya no es válida. + + + Error + + La Composición de Escritorio no está soportada en su Sistema Operativo. -Es necesario utilizar Windows Vista o 7 en su versión Home Premium o superior. - - - Composición de Escritorio no soportada - - - No se ha clonado ninguna ventana. - - - Imposible clonar la ventana. - - - Imposible adaptar la ventana. - - - No se ha podido buscar actualizaciones. - - - Parece que OnTopReplica no ha podido ser instalado mediante "ClickOnce". Tendrá que actualizar manualmente visitando <a href="http://ontopreplica.codeplex.com">la homepage del progetto</a>. - - - OnTopReplica no ha podido comprobar si hay una actualización disponible. Asegúrese de que está conectado a Internet. Si lo está, quizá la página oficial está temporalmente no disponible. - - - Modo - - - Siempre encima - - - OnTopReplica permanece siempre encima. - - - Click a través - - - OnTopReplica se comporta como una ventana transparente a través de la cual puede clickar lo que se encuentra detrás. - - - Ventana standard - - - OnTopReplica se comporta como una ventana corriente de Windows, por lo tanto puede estar en segundo plano. - - - OnTopReplica a pantalla completa - - - Desactivar - - - Activar modo - - - Seleccionar varias ventanas para activar. - - - Modo en grupo activado - - - Modo en grupo: - - - Ventanas - Column Header of list, simply refers to available windows to be cloned - - - Sitio oficial: www.codeplex.com/ontopreplica. - - - Desea activar el "Click en la ventana clonada"? - - +Es necesario utilizar Windows Vista o 7 en su versión Home Premium o superior. + + + Composición de Escritorio no soportada + + + No se ha clonado ninguna ventana. + + + Imposible clonar la ventana. + + + Imposible adaptar la ventana. + + + No se ha podido buscar actualizaciones. + + + Parece que OnTopReplica no ha podido ser instalado mediante "ClickOnce". Tendrá que actualizar manualmente visitando <a href="http://ontopreplica.codeplex.com">la homepage del progetto</a>. + + + OnTopReplica no ha podido comprobar si hay una actualización disponible. Asegúrese de que está conectado a Internet. Si lo está, quizá la página oficial está temporalmente no disponible. + + + Modo + + + Siempre encima + + + OnTopReplica permanece siempre encima. + + + Click a través + + + OnTopReplica se comporta como una ventana transparente a través de la cual puede clickar lo que se encuentra detrás. + + + Ventana standard + + + OnTopReplica se comporta como una ventana corriente de Windows, por lo tanto puede estar en segundo plano. + + + OnTopReplica a pantalla completa + + + Desactivar + + + Activar modo + + + Seleccionar varias ventanas para activar. + + + Modo en grupo activado + + + Modo en grupo: + + + Ventanas + Column Header of list, simply refers to available windows to be cloned + + + Sitio oficial: www.codeplex.com/ontopreplica. + + + Desea activar el "Click en la ventana clonada"? + + Si este modo está activado, OnTopReplica permitirá hacer click en la ventana clonada (de esta forma se podrán hacer operaciones básicas con el ratón sin tener que activar la ventana original). -Para salir de este modo, pulsar ESC. - - - Click en la ventana clonada - - - Activar el modo Click a través? - - - Click a través solo funciona si se ha activado y la ventana es semi-transparente. - - +Para salir de este modo, pulsar ESC. + + + Click en la ventana clonada + + + Activar el modo Click a través? + + + Click a través solo funciona si se ha activado y la ventana es semi-transparente. + + En este modo, la ventana clonada se volverá ventana parcialmente transparente, permitiendo hacer click en las otras ventanas de detrás. -Para volver al modo normal en cualquier momento, activar OnTopReplica clickando en la barra de tareas (o en el icono del sistema). - - +Para volver al modo normal en cualquier momento, activar OnTopReplica clickando en la barra de tareas (o en el icono del sistema). + + No, gracias. -Se podrá activar Click a través más tarde - - - Utilizar Click a través - - - Modo Click a través - - - OnTopReplica ha sido actualizado. - - - Para poder utilizar la versión actualizada de OnTopReplica se ha de reiniciar la aplicación. - - - Actualización correcta. - - - OnTopReplica está actualizado. - - - No hay actualizaciones disponibles - - - Idioma - - - Acerca de - - - Oculta la ventana principal y muestra la ventana de "Acerca de" - - - Avanzado - - - Marco - - - Activa o desactiva el marco de la ventana. - - - Activar Click en la ventana clonada - - - Activa "Click en la ventana clonada" en la ventana que se ha clonado. - - - Activar Click a través - - - OnTopReplica se comporta como una ventana transparente a través de la cual puede hacer click sobre lo que se encuentra detrás. - - - Cerrar - - - Cierra OnToopReplica - - - 2:1 Doble - - - Pantalla completa - - - 1:2 Mitad - - - 1:1 Tamaño original - - - 1:4 Un cuarto - - - Modo en grupo - - - OnTopReplica clonará automáticamente una ventana de un grupo definido, eligiendo la que no ha estado en primer plano durante más tiempo. - - - 100% (opaco) - - - OnTopReplica será totalmente opaco. - - - Establece OnTopReplica al 25% de opacidad. - - - Establece OnTopReplica al 50% de opacidad. - - - Establece OnTopReplica al 75% de opacidad. - - - Opacidad - - - Abrir - - - Muestra OnTopReplica. - - - Abajo a la izquierda - - - Abajo a la derecha - - - Centrado - - - Desactivado - - - Posición - - - Posiciona automáticamente OnTopReplica sobre el monitor actual. - - - Arriba a la izquierda - - - Arriba a la derecha - - - Salir del modo pantalla completa - - - Restaurar última posición y tamaño - - - Activa o desactiva si OnTopReplica debe guardar la última posición y tamaño y usarla cuando se reinicie. - - - Minimizar - - - Minimiza OnTopReplica a la barra de tareas (o de sistema). - - - Seleccionar región - - - Activa o desactiva "Seleccionar región", que permite seleccionar una región específica de la ventana clonada. - - - Reiniciar ventana - - - Reinicia los ajustes de OnTopReplica y la ventana principal - - - Cambiar tamaño - - - Ir a la ventana original - - - Activa la ventana original y oculta OnTopReplica. - - - Seleccionar ventana - - - - ninguna - - - - Muestra una lista de ventanas que se pueden clonar. - - - - entera - - - - Región actual: - - - Borrar - - - Hecho - - - Altura - - - Reiniciar ventana - - - Guardar - - - Regiones guardadas - - - Regiones: - - - Anchura - - - Click derecho para empezar... - - +Se podrá activar Click a través más tarde + + + Utilizar Click a través + + + Modo Click a través + + + OnTopReplica ha sido actualizado. + + + Para poder utilizar la versión actualizada de OnTopReplica se ha de reiniciar la aplicación. + + + Actualización correcta. + + + OnTopReplica está actualizado. + + + No hay actualizaciones disponibles + + + Idioma + + + Acerca de + + + Oculta la ventana principal y muestra la ventana de "Acerca de" + + + Avanzado + + + Marco + + + Activa o desactiva el marco de la ventana. + + + Activar Click en la ventana clonada + + + Activa "Click en la ventana clonada" en la ventana que se ha clonado. + + + Activar Click a través + + + OnTopReplica se comporta como una ventana transparente a través de la cual puede hacer click sobre lo que se encuentra detrás. + + + Cerrar + + + Cierra OnToopReplica + + + 2:1 Doble + + + Pantalla completa + + + 1:2 Mitad + + + 1:1 Tamaño original + + + 1:4 Un cuarto + + + Modo en grupo + + + OnTopReplica clonará automáticamente una ventana de un grupo definido, eligiendo la que no ha estado en primer plano durante más tiempo. + + + 100% (opaco) + + + OnTopReplica será totalmente opaco. + + + Establece OnTopReplica al 25% de opacidad. + + + Establece OnTopReplica al 50% de opacidad. + + + Establece OnTopReplica al 75% de opacidad. + + + Opacidad + + + Abrir + + + Muestra OnTopReplica. + + + Abajo a la izquierda + + + Abajo a la derecha + + + Centrado + + + Desactivado + + + Posición + + + Posiciona automáticamente OnTopReplica sobre el monitor actual. + + + Arriba a la izquierda + + + Arriba a la derecha + + + Salir del modo pantalla completa + + + Restaurar última posición y tamaño + + + Activa o desactiva si OnTopReplica debe guardar la última posición y tamaño y usarla cuando se reinicie. + + + Minimizar + + + Minimiza OnTopReplica a la barra de tareas (o de sistema). + + + Seleccionar región + + + Activa o desactiva "Seleccionar región", que permite seleccionar una región específica de la ventana clonada. + + + Reiniciar ventana + + + Reinicia los ajustes de OnTopReplica y la ventana principal + + + Cambiar tamaño + + + Ir a la ventana original + + + Activa la ventana original y oculta OnTopReplica. + + + Seleccionar ventana + + + - ninguna - + + + Muestra una lista de ventanas que se pueden clonar. + + + - entera - + + + Región actual: + + + Borrar + + + Hecho + + + Altura + + + Reiniciar ventana + + + Guardar + + + Regiones guardadas + + + Regiones: + + + Anchura + + + Click derecho para empezar... + + Cancelar actualización -OnTopReplica le preguntará la próxima vez que se ejecute. - - +OnTopReplica le preguntará la próxima vez que se ejecute. + + Descargar -Instalar OnTopReplica {0} - - - La nueva versión puede ser descargada e instalada del sitio oficial. - - +Instalar OnTopReplica {0} + + + La nueva versión puede ser descargada e instalada del sitio oficial. + + Versión instalada: {0} -Versión disponible: {1} - - - Autor: %. - Link % is replaced by string AboutAuthorContent. - - - - Must not be localized. Leave blank in non-default languages. - - - Contribuye con el proyecto. - Unfinished. - - - código fuente - - - OnTopReplica está basado en la librería WindowsFormsAero y otras librerías y códigos fuente. %. - - - Leer los créditos completos - - - Contribuir - - - Créditos - - - Licencia - - - Actualizaciones - - - La aplicación está bajo la licencia %, por lo que rigen los términos de la definición "open-source" especificada por OSI. - - - - Can be left blank. - - - Acerca de OnTopReplica - - - Traductores: {0} - {0} translators (do not end with period) - - - - Must not be localized. Leave blank in non-default languages. - - - Versión: {0} - - - 25% - - - 50% - - - 75% - - - Restaurar la última ventana clonada - - - Si está activado, OnTopReplica intentará restaurar la última ventana clonada al iniciarse. - - - Ajustes... - - - Muestra el panel de ajustes. - - - Clona ventana actual - - - Los atajos de teclado pueden ser utilizados aunque OnTopReplica no esté en primer plano. - - - Mostrar/ocultar - - - Atajos de teclado: - - - Idioma: - - - Requiere reinicio. - - - Ajustes - - - Versión {0} disponible - - - {0}/{1} bytes descargados. - - - Descargando... - - +Versión disponible: {1} + + + Autor: %. + Link % is replaced by string AboutAuthorContent. + + + + Must not be localized. Leave blank in non-default languages. + + + Contribuye con el proyecto. + Unfinished. + + + código fuente + + + OnTopReplica está basado en la librería WindowsFormsAero y otras librerías y códigos fuente. %. + + + Leer los créditos completos + + + Contribuir + + + Créditos + + + Licencia + + + Actualizaciones + + + La aplicación está bajo la licencia %, por lo que rigen los términos de la definición "open-source" especificada por OSI. + + + + Can be left blank. + + + Acerca de OnTopReplica + + + Traductores: {0} + {0} translators (do not end with period) + + + + Must not be localized. Leave blank in non-default languages. + + + Versión: {0} + + + 25% + + + 50% + + + 75% + + + Restaurar la última ventana clonada + + + Si está activado, OnTopReplica intentará restaurar la última ventana clonada al iniciarse. + + + Ajustes... + + + Muestra el panel de ajustes. + + + Clona ventana actual + + + Los atajos de teclado pueden ser utilizados aunque OnTopReplica no esté en primer plano. + + + Mostrar/ocultar + + + Atajos de teclado: + + + Idioma: + + + Requiere reinicio. + + + Ajustes + + + Versión {0} disponible + + + {0}/{1} bytes descargados. + + + Descargando... + + La última versión de OnTopReplica ya está instalada. El programa buscará actualizaciones automáticamente con cada inicio. -Puedes mantenerte informado del desarrollo de OnTopReplica, sugerir mejoras y nuevas características <a href="website">visitando la web oficial</a>. - The website link should be enclosed in <a href="website"></a> tags. - - - Última versión estable liberada en {0}. - {0} last version release date - - - OnTopReplica está actualizado - - +Puedes mantenerte informado del desarrollo de OnTopReplica, sugerir mejoras y nuevas características <a href="website">visitando la web oficial</a>. + The website link should be enclosed in <a href="website"></a> tags. + + + Última versión estable liberada en {0}. + {0} last version release date + + + OnTopReplica está actualizado + + Instalar -OnTopReplica se cerrará y se instalará la actualización. - - - La versión de OnTopReplica {0} está lista para ser instalada en su ordenador. - - - Actualización lista - - - Actualizaciones de OnTopReplica - +OnTopReplica se cerrará y se instalará la actualización. + + + La versión de OnTopReplica {0} está lista para ser instalada en su ordenador. + + + Actualización lista + + + Actualizaciones de OnTopReplica + \ No newline at end of file diff --git a/OnTopReplica/Strings.fi.Designer.cs b/src/OnTopReplica/Strings.fi.Designer.cs similarity index 100% rename from OnTopReplica/Strings.fi.Designer.cs rename to src/OnTopReplica/Strings.fi.Designer.cs diff --git a/OnTopReplica/Strings.fi.resx b/src/OnTopReplica/Strings.fi.resx similarity index 100% rename from OnTopReplica/Strings.fi.resx rename to src/OnTopReplica/Strings.fi.resx diff --git a/OnTopReplica/Strings.it.Designer.cs b/src/OnTopReplica/Strings.it.Designer.cs similarity index 100% rename from OnTopReplica/Strings.it.Designer.cs rename to src/OnTopReplica/Strings.it.Designer.cs diff --git a/OnTopReplica/Strings.it.resx b/src/OnTopReplica/Strings.it.resx similarity index 97% rename from OnTopReplica/Strings.it.resx rename to src/OnTopReplica/Strings.it.resx index a2177be..7a0dee9 100644 --- a/OnTopReplica/Strings.it.resx +++ b/src/OnTopReplica/Strings.it.resx @@ -1,655 +1,655 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 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 - - - Creato da: %. - Link % is replaced by string AboutAuthorContent. - - - Annulla il processo di aggiornamento. - - - Mostra dettagli su OnTopReplica. - - - Resetta tutte le impostazioni di OnTopReplica. - - - Aggiorna OnTopReplica ora. - - - T'interessa partecipare? Ogni aiuto è ben accetto, sia che tu voglia migliorare una traduzione, aggiungerne una nuova oppure dare un'occhiata al % su CodePlex. - - - codice sorgente - - - OnTopReplica è basato sulla libreria WindowsFormsAero ed il codice di altri progetti open-source. %. - Link % is replaced by string AboutCreditsSourcesContent. - - - Leggi tutti i riferimenti - - - Contribuisci - - - Ringraziamenti - - - Licenza d'uso - - - Aggiornamenti - - - Questa applicazione è rilasciata sotto la licenza %, che rientra nella definizione di "open-source" data dal consorzio OSI. - - - Una copia in tempo reale e sempre in primo piano di una finestra a tua scelta. - - - A proposito di OnTopReplica - - - Traduttori: {0} - {0} translators (do not end with period) - - - Controlla! - - - OnTopReplica controlla automaticamente la presenza di aggiornamenti ad ogni avvio. - - - Versione {0} - - - - Probably doesn't need localization. :) - - - Ripristinare completamente la finestra? - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Creato da: %. + Link % is replaced by string AboutAuthorContent. + + + Annulla il processo di aggiornamento. + + + Mostra dettagli su OnTopReplica. + + + Resetta tutte le impostazioni di OnTopReplica. + + + Aggiorna OnTopReplica ora. + + + T'interessa partecipare? Ogni aiuto è ben accetto, sia che tu voglia migliorare una traduzione, aggiungerne una nuova oppure dare un'occhiata al % su CodePlex. + + + codice sorgente + + + OnTopReplica è basato sulla libreria WindowsFormsAero ed il codice di altri progetti open-source. %. + Link % is replaced by string AboutCreditsSourcesContent. + + + Leggi tutti i riferimenti + + + Contribuisci + + + Ringraziamenti + + + Licenza d'uso + + + Aggiornamenti + + + Questa applicazione è rilasciata sotto la licenza %, che rientra nella definizione di "open-source" data dal consorzio OSI. + + + Una copia in tempo reale e sempre in primo piano di una finestra a tua scelta. + + + A proposito di OnTopReplica + + + Traduttori: {0} + {0} translators (do not end with period) + + + Controlla! + + + OnTopReplica controlla automaticamente la presenza di aggiornamenti ad ogni avvio. + + + Versione {0} + + + + Probably doesn't need localization. :) + + + Ripristinare completamente la finestra? + + &Ripristina -Tutte le impostazioni saranno perse. - - - Può essere usato se si è perso il controllo della finestra o si è spostata oltre ai bordi dello schermo. - - - Ripristino - - - Resettare impostazioni? - - - Questa procedura resetterà tutte le impostazioni di OnTopReplica e cancellerà tutte le informazioni memorizzate (come, ad esempio, le regioni salvate). - - - Reimposta - - - &Annulla - & marks the ALT+[] shortcut - - - Disegna una regione usando il mouse. - - - Dettagli - - - Dettagli su Windows Aero - - - Windows Aero è disponibile soltanto su Windows Vista Home Premium o superiore. - - - Il servizio di Desktop Composition Aero non è attivo. - - +Tutte le impostazioni saranno perse. + + + Può essere usato se si è perso il controllo della finestra o si è spostata oltre ai bordi dello schermo. + + + Ripristino + + + Resettare impostazioni? + + + Questa procedura resetterà tutte le impostazioni di OnTopReplica e cancellerà tutte le informazioni memorizzate (come, ad esempio, le regioni salvate). + + + Reimposta + + + &Annulla + & marks the ALT+[] shortcut + + + Disegna una regione usando il mouse. + + + Dettagli + + + Dettagli su Windows Aero + + + Windows Aero è disponibile soltanto su Windows Vista Home Premium o superiore. + + + Il servizio di Desktop Composition Aero non è attivo. + + È necessario attivare la "composizione del desktop" (DWM) selezionando "Windows Aero" come tema utilizzato da Windows. -Per farlo, clicca col tasto destro del mouse sul desktop e poi su Personalizza. - - - Dettagli errore - - - Errore: - - - Sembra che la finestra selezionata sia stata chiusa o che non sia più valida. - - - Errore - - +Per farlo, clicca col tasto destro del mouse sul desktop e poi su Personalizza. + + + Dettagli errore + + + Errore: + + + Sembra che la finestra selezionata sia stata chiusa o che non sia più valida. + + + Errore + + La "composzione del desktop" non è supportata dal tuo sistema operativo. -È necessario utilizzare Windows Vista o superiore per avviare OnTopReplica. - - - Desktop Composition (DWM) non supportato - - - Nessuna finestra clonata al momento. - - - Impossibile clonare la finestra - - - Impossibile adattare la finestra. - - - Impossibile controllare gli aggiornamenti. - - - Sembra che OnTopReplica non sia stato installato usando 'ClickOnce'. Sarà necessario aggiornare manualmente il programma visitando <a href="http://ontopreplica.codeplex.com">la homepage del progetto</a>. - - - Non è stato possibile controllare se esiste una versione più aggiornata di OnTopReplica. Verificare di essere connessi ad Internet. Se la connessione è attiva, è possibile che il sito ufficiale sia temporaneamente offline. - - - Modalità - - - Sempre in cima - - - OnTopReplica sarà sempre la finestra sopra a tutte le altre. - - - Click through - - - OnTopReplica si comporterà come uno schermo trasparente, che permette di cliccare sulle finestre al di sotto. - - - Normale - - - Si comporta come una finestra normale. Puoi portare altre finestre sopra OnTopReplica. - - - OnTopReplica a pieno schermo - - - Disattiva - - - Abilita modalità - - - Seleziona più finestre per attivare. - - - Modalità Gruppo attivata. - - - Modalità Gruppo di finestre: - - - Finestre - Column Header of list, simply refers to available windows to be cloned - - - Sito internet: www.codeplex.com/ontopreplica. - - - Attivare la modalità di inoltro dei clic? - - +È necessario utilizzare Windows Vista o superiore per avviare OnTopReplica. + + + Desktop Composition (DWM) non supportato + + + Nessuna finestra clonata al momento. + + + Impossibile clonare la finestra + + + Impossibile adattare la finestra. + + + Impossibile controllare gli aggiornamenti. + + + Sembra che OnTopReplica non sia stato installato usando 'ClickOnce'. Sarà necessario aggiornare manualmente il programma visitando <a href="http://ontopreplica.codeplex.com">la homepage del progetto</a>. + + + Non è stato possibile controllare se esiste una versione più aggiornata di OnTopReplica. Verificare di essere connessi ad Internet. Se la connessione è attiva, è possibile che il sito ufficiale sia temporaneamente offline. + + + Modalità + + + Sempre in cima + + + OnTopReplica sarà sempre la finestra sopra a tutte le altre. + + + Click through + + + OnTopReplica si comporterà come uno schermo trasparente, che permette di cliccare sulle finestre al di sotto. + + + Normale + + + Si comporta come una finestra normale. Puoi portare altre finestre sopra OnTopReplica. + + + OnTopReplica a pieno schermo + + + Disattiva + + + Abilita modalità + + + Seleziona più finestre per attivare. + + + Modalità Gruppo attivata. + + + Modalità Gruppo di finestre: + + + Finestre + Column Header of list, simply refers to available windows to be cloned + + + Sito internet: www.codeplex.com/ontopreplica. + + + Attivare la modalità di inoltro dei clic? + + In questa modalità, OnTopReplica inoltrerà tutti i clic del pulsante sinistro sul clone della finestra alla finestra originale (questo permetterà di interagire in maniera basilare con la finestra clonata, senza averla in primo piano). -Per uscire da questa modalità, usa il tasto ESC. - - - Inoltro dei clic - - - Attivare la modalità Click-Through? - - - La modalità "Click-Through" funziona solo se l'opzione è stata attivata e se la finestra è semitrasparente. - - +Per uscire da questa modalità, usa il tasto ESC. + + + Inoltro dei clic + + + Attivare la modalità Click-Through? + + + La modalità "Click-Through" funziona solo se l'opzione è stata attivata e se la finestra è semitrasparente. + + In questa modalità la finestra clonata si comporterà come una maschera semitrasparente che permette di cliccare sulle finestre dietro di essa. -Per tornare alla modalità normale in qualsiasi momento, attiva OnTopReplica (dalla barra delle applicazioni). - - +Per tornare alla modalità normale in qualsiasi momento, attiva OnTopReplica (dalla barra delle applicazioni). + + No, grazie. -Puoi abilitare il Click-Through in futuro - - - Abilita Click-Through - - - Modalità Click-Through - - - OnTopReplica è stato aggiornato. - - - Per utilizzare la nuova versione di OnTopReplica è necessario riavviare l'applicazione. - - - Aggiornamento completato - - - La versione più aggiornata è già installata. - - - Nessun aggiornamento disponibile - - - Lingua - - - A proposito di... - - - Nasconde la finestra principale e mostra una schermata di informazioni. - - - Avanzate - - - Bordo - - - Abilita o disabilita il bordo della finestra. - - - Inoltro dei clic - - - Attiva la modalità di "inoltro dei clic" alla finestra clonata. - - - Abilita Click-Through - - - OnTopReplica si comporterà come una schermata trasparente, permettendo di cliccare sulle finestre al di sotto di essa. - - - Chiudi - - - Termina OnTopReplica. - - - 2:1 Doppio - - - Tutto schermo - - - 1:2 Metà - - - 1:1 Clone esatto - - - 1:4 Quarto - - - Modalità Gruppo di finestre - - - OnTopReplica clonerà automaticamente una finestra di un gruppo, scegliendo quella che non è stata in primo piano da più tempo. - - - 100% (opaco) - - - Imposta OnTopReplica come finestra completamente opaca. - - - 25% - - - Imposta l'opacità di OnTopReplica al 25%. - - - 50% - - - Imposta l'opacità di OnTopReplica al 50%. - - - 75% - - - Imposta l'opacità di OnTopReplica al 75%. - - - Opacità - - - Apri - - - Attiva la finestra di OnTopReplica. - - - In basso a sinistra - - - In basso a destra - - - Centrato - - - Disabilitato - - - Blocco posizione - - - Posiziona automaticamente OnTopReplica sul monitor corrente. - - - In alto a sinistra - - - In alto a destra - - - Esci da tutto schermo - - - Ripristina posizione e grandezza - - - Imposta se, al prossimo avvio di OnTopReplica, debbano essere ripristinati i valori di grandezza e posizione della finestra alla chiusura. - - - Minimizza - - - Riduce OnTopReplica ad un'icona nella barra delle applicazioni. - - - Seleziona regione... - - - Passa alla modalità di "selezione di regione", che permette di limitare la porzione di finestra che viene clonata. - - - Reimposta finestra - - - Reimposta OnTopReplica e la sua finestra principale. - - - Ridimensionamento - - - Ripristina ultima finestra - - - Se abilitato, all'avvio OnTopReplica tenterà di ripristinare l'ultima finestra precedentemente clonata. - - - Impostazioni... - - - Mostra il pannello delle impostazioni. - - - Vai alla finestra originale - - - Mostra la finestra originale e nasconde OnTopReplica. - - - Seleziona finestra - - - - nessuna - - - - Mostra una lista di finestre che è possibile clonare. - - - - intera - - - - Regione corrente: - - - Cancella - - - Chiudi - - - Altezza - - - Reset - - - Salva - - - Regioni memorizzate - - - Regioni: - - - Larghezza - - - Clic destro qui per iniziare... - - - Clona finestra corrente - - - Queste scorciatoie possono essere usate quando OnTopReplica non è attivo. - - - Nascondi - - - Scorciatoie: - - - Lingua: - - - Richiede un riavvio. - - - Impostazioni - - +Puoi abilitare il Click-Through in futuro + + + Abilita Click-Through + + + Modalità Click-Through + + + OnTopReplica è stato aggiornato. + + + Per utilizzare la nuova versione di OnTopReplica è necessario riavviare l'applicazione. + + + Aggiornamento completato + + + La versione più aggiornata è già installata. + + + Nessun aggiornamento disponibile + + + Lingua + + + A proposito di... + + + Nasconde la finestra principale e mostra una schermata di informazioni. + + + Avanzate + + + Bordo + + + Abilita o disabilita il bordo della finestra. + + + Inoltro dei clic + + + Attiva la modalità di "inoltro dei clic" alla finestra clonata. + + + Abilita Click-Through + + + OnTopReplica si comporterà come una schermata trasparente, permettendo di cliccare sulle finestre al di sotto di essa. + + + Chiudi + + + Termina OnTopReplica. + + + 2:1 Doppio + + + Tutto schermo + + + 1:2 Metà + + + 1:1 Clone esatto + + + 1:4 Quarto + + + Modalità Gruppo di finestre + + + OnTopReplica clonerà automaticamente una finestra di un gruppo, scegliendo quella che non è stata in primo piano da più tempo. + + + 100% (opaco) + + + Imposta OnTopReplica come finestra completamente opaca. + + + 25% + + + Imposta l'opacità di OnTopReplica al 25%. + + + 50% + + + Imposta l'opacità di OnTopReplica al 50%. + + + 75% + + + Imposta l'opacità di OnTopReplica al 75%. + + + Opacità + + + Apri + + + Attiva la finestra di OnTopReplica. + + + In basso a sinistra + + + In basso a destra + + + Centrato + + + Disabilitato + + + Blocco posizione + + + Posiziona automaticamente OnTopReplica sul monitor corrente. + + + In alto a sinistra + + + In alto a destra + + + Esci da tutto schermo + + + Ripristina posizione e grandezza + + + Imposta se, al prossimo avvio di OnTopReplica, debbano essere ripristinati i valori di grandezza e posizione della finestra alla chiusura. + + + Minimizza + + + Riduce OnTopReplica ad un'icona nella barra delle applicazioni. + + + Seleziona regione... + + + Passa alla modalità di "selezione di regione", che permette di limitare la porzione di finestra che viene clonata. + + + Reimposta finestra + + + Reimposta OnTopReplica e la sua finestra principale. + + + Ridimensionamento + + + Ripristina ultima finestra + + + Se abilitato, all'avvio OnTopReplica tenterà di ripristinare l'ultima finestra precedentemente clonata. + + + Impostazioni... + + + Mostra il pannello delle impostazioni. + + + Vai alla finestra originale + + + Mostra la finestra originale e nasconde OnTopReplica. + + + Seleziona finestra + + + - nessuna - + + + Mostra una lista di finestre che è possibile clonare. + + + - intera - + + + Regione corrente: + + + Cancella + + + Chiudi + + + Altezza + + + Reset + + + Salva + + + Regioni memorizzate + + + Regioni: + + + Larghezza + + + Clic destro qui per iniziare... + + + Clona finestra corrente + + + Queste scorciatoie possono essere usate quando OnTopReplica non è attivo. + + + Nascondi + + + Scorciatoie: + + + Lingua: + + + Richiede un riavvio. + + + Impostazioni + + Annulla aggiornamento -OnTopReplica si aggiornerà in un secondo momento. - - +OnTopReplica si aggiornerà in un secondo momento. + + Continua -Scarica OnTopReplica {0}. - - - Sarà possibile scaricare la nuova versione ed installarla. - - +Scarica OnTopReplica {0}. + + + Sarà possibile scaricare la nuova versione ed installarla. + + Versione installata: {0} -Versione disponibile: {1} - - - Disponibile la versione {0} - - - Scaricati {0} byte su {1}. +Versione disponibile: {1} + + + Disponibile la versione {0} + + + Scaricati {0} byte su {1}. {0} downloaded bytes {1} total bytes {0} bytes geladen von {1} bytes gesamt {0} downloaded bytes {1} total bytes {0} downloaded bytes {1} total bytes -{0} downloaded bytes {1} total bytes - - - Download in corso... - - +{0} downloaded bytes {1} total bytes + + + Download in corso... + + L'ultima versione di OnTopReplica è già installata. Il programma controllo automaticamente la presenza di aggiornamenti ad ogni avvio. -Per tenersi aggiornati sullo sviluppo di OnTopReplica o suggerire miglioramenti, <a href="website">visitare il sito ufficiale</a>. - The website link should be enclosed in <a href="website"></a> tags. - - - Ultima versione stabile rilasciata il {0}. - {0} last version release date - - - OnTopReplica è aggiornato - - +Per tenersi aggiornati sullo sviluppo di OnTopReplica o suggerire miglioramenti, <a href="website">visitare il sito ufficiale</a>. + The website link should be enclosed in <a href="website"></a> tags. + + + Ultima versione stabile rilasciata il {0}. + {0} last version release date + + + OnTopReplica è aggiornato + + Installa -OnTopReplica verrà chiuso e l'aggiornamento sarà installato. - - - La versione {0} di OnTopReplica è pronta ad essere installata sul tuo computer. - - - Aggiornamento pronto - - - Aggiornamenti di OnTopReplica - - - - Must not be localized. Leave blank in non-default languages. - - - - Can be left blank. - - - - Must not be localized. Leave blank in non-default languages. - +OnTopReplica verrà chiuso e l'aggiornamento sarà installato. + + + La versione {0} di OnTopReplica è pronta ad essere installata sul tuo computer. + + + Aggiornamento pronto + + + Aggiornamenti di OnTopReplica + + + + Must not be localized. Leave blank in non-default languages. + + + + Can be left blank. + + + + Must not be localized. Leave blank in non-default languages. + \ No newline at end of file diff --git a/OnTopReplica/Strings.no.Designer.cs b/src/OnTopReplica/Strings.no.Designer.cs similarity index 100% rename from OnTopReplica/Strings.no.Designer.cs rename to src/OnTopReplica/Strings.no.Designer.cs diff --git a/OnTopReplica/Strings.no.resx b/src/OnTopReplica/Strings.no.resx similarity index 97% rename from OnTopReplica/Strings.no.resx rename to src/OnTopReplica/Strings.no.resx index 3f04f24..3b79b0c 100644 --- a/OnTopReplica/Strings.no.resx +++ b/src/OnTopReplica/Strings.no.resx @@ -1,655 +1,655 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 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 - - - Created by: %. - Link % is replaced by string AboutAuthorContent. - - - - Must not be localized. Leave blank in non-default languages. - - - Abort update process. - - - Show details about OnTopReplica. - - - Reset all OnTopReplica settings. - - - Update OnTopReplica now. - - - Care to contribute to the project? You are welcome to improve available translations, start a new one for your native language or to check out the % from CodePlex. - - - source code - - - OnTopReplica is based upon the WindowsFormsAero library and some other libraries and code sources. %. - Link % is replaced by string AboutCreditsSourcesContent. - - - Read the full credits - - - Contribute - - - Credits - - - License - - - Updates - - - The application is licensed under the % license, which meets the terms of the "open-source" definition specified by OSI. - - - Microsoft Reciprocal (MS-RL) - Can be left blank. - - - A lightweight, real-time, always on top thumbnail of a window of your choice. - - - About OnTopReplica - - - Translators: {0} - {0} translators (do not end with period) - - - Christian Olaechea M., Daniel Zeus.EX, Federico Lorenzo, Goran Brecelj, Jan Romanczyk, Marco Kraxner, Patrik (batupata), Raúl Morillo, René Mihula, Roberto Leiro, Rodrigo Lourenço, Thomas Amundsen, Eric Hoffmann. - Must not be localized. Leave blank in non-default languages. - - - Check now! - - - OnTopReplica automatically checks for updates at every start up. - - - Version {0} - - - - Probably doesn't need localization. :) - - - Reset window completely? - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Created by: %. + Link % is replaced by string AboutAuthorContent. + + + + Must not be localized. Leave blank in non-default languages. + + + Abort update process. + + + Show details about OnTopReplica. + + + Reset all OnTopReplica settings. + + + Update OnTopReplica now. + + + Care to contribute to the project? You are welcome to improve available translations, start a new one for your native language or to check out the % from CodePlex. + + + source code + + + OnTopReplica is based upon the WindowsFormsAero library and some other libraries and code sources. %. + Link % is replaced by string AboutCreditsSourcesContent. + + + Read the full credits + + + Contribute + + + Credits + + + License + + + Updates + + + The application is licensed under the % license, which meets the terms of the "open-source" definition specified by OSI. + + + Microsoft Reciprocal (MS-RL) + Can be left blank. + + + A lightweight, real-time, always on top thumbnail of a window of your choice. + + + About OnTopReplica + + + Translators: {0} + {0} translators (do not end with period) + + + Christian Olaechea M., Daniel Zeus.EX, Federico Lorenzo, Goran Brecelj, Jan Romanczyk, Marco Kraxner, Patrik (batupata), Raúl Morillo, René Mihula, Roberto Leiro, Rodrigo Lourenço, Thomas Amundsen, Eric Hoffmann. + Must not be localized. Leave blank in non-default languages. + + + Check now! + + + OnTopReplica automatically checks for updates at every start up. + + + Version {0} + + + + Probably doesn't need localization. :) + + + Reset window completely? + + &Reset -All settings will be lost. - - - Can be used to reset all settings if you lost control over the window or moved it beyond the screen boundary. - - - Reset - - - Reset settings? - - - This will erase all settings of OnTopReplica, returning it to the original state right after installation (all saved information, like stored regions, will be lost). - - - Reset settings - - - &Cancel - & marks the ALT+[] shortcut - - - Draw regions using mouse. - - - Details - - - Details on Windows Aero - - - Windows Aero is only available on Windows Vista Home Premium or higher. - - - 'Desktop Composition' is not enabled. - - +All settings will be lost. + + + Can be used to reset all settings if you lost control over the window or moved it beyond the screen boundary. + + + Reset + + + Reset settings? + + + This will erase all settings of OnTopReplica, returning it to the original state right after installation (all saved information, like stored regions, will be lost). + + + Reset settings + + + &Cancel + & marks the ALT+[] shortcut + + + Draw regions using mouse. + + + Details + + + Details on Windows Aero + + + Windows Aero is only available on Windows Vista Home Premium or higher. + + + 'Desktop Composition' is not enabled. + + You must enable desktop composition, by selecting 'Windows Aero' as the theme used by Windows. -To do so, right-click on the desktop and click on Personalize. - - - Error details - - - Error: - - - It appears that the selected window has been closed or is not valid anymore. - - - Error - - +To do so, right-click on the desktop and click on Personalize. + + + Error details + + + Error: + + + It appears that the selected window has been closed or is not valid anymore. + + + Error + + Desktop Composition' is not supported on your Operating System. -You must run this application on Windows Vista Home Premium or better. - - - Desktop Composition unsupported - - - No thumbnail loaded. - - - Unable to create thumbnail - - - Unable to fit window. - - - Unable to check for updates. - - - It appears that OnTopReplica wasn't installed using 'ClickOnce'. You'll have to update manually (visit <a href="http://ontopreplica.codeplex.com">OnTopReplica's homepage</a>). - - - OnTopReplica was unable to check whether an updated version is available. Make sure you are connected to the Internet. If you are, the website may be temporarily down. - - - Mode - - - Always on top - - - Forces OnTopReplica to stay always on top. - - - Click through - - - OnTopReplica will behave like a transparent overlay that lets your clicks through to the windows below. - - - Standard - - - Behaves like an ordinary window. You can bring other windows above OnTopReplica. - - - OnTopReplica fullscreen - - - Disable - - - Enable Group mode - - - Select multiple windows to enable. - - - Group switch mode is enabled. - - - Group switch mode: - - - Windows - Column Header of list, simply refers to available windows to be cloned - - - Homepage: www.codeplex.com/ontopreplica. - - - Do you want to enable "click forwarding"? - - +You must run this application on Windows Vista Home Premium or better. + + + Desktop Composition unsupported + + + No thumbnail loaded. + + + Unable to create thumbnail + + + Unable to fit window. + + + Unable to check for updates. + + + It appears that OnTopReplica wasn't installed using 'ClickOnce'. You'll have to update manually (visit <a href="http://ontopreplica.codeplex.com">OnTopReplica's homepage</a>). + + + OnTopReplica was unable to check whether an updated version is available. Make sure you are connected to the Internet. If you are, the website may be temporarily down. + + + Mode + + + Always on top + + + Forces OnTopReplica to stay always on top. + + + Click through + + + OnTopReplica will behave like a transparent overlay that lets your clicks through to the windows below. + + + Standard + + + Behaves like an ordinary window. You can bring other windows above OnTopReplica. + + + OnTopReplica fullscreen + + + Disable + + + Enable Group mode + + + Select multiple windows to enable. + + + Group switch mode is enabled. + + + Group switch mode: + + + Windows + Column Header of list, simply refers to available windows to be cloned + + + Homepage: www.codeplex.com/ontopreplica. + + + Do you want to enable "click forwarding"? + + If this mode is enabled, OnTopReplica will forward all left mouse clicks to the window that is being cloned (this will allow you to do basic mouse operations on the cloned window without having to activate it). -To exit this mode, push ESC. - - - Click forwarding - - - Enable Click-Through mode? - - - Click-through only works if it has been enabled in the Resize submenu and if the window is semi-transparent. - - +To exit this mode, push ESC. + + + Click forwarding + + + Enable Click-Through mode? + + + Click-through only works if it has been enabled in the Resize submenu and if the window is semi-transparent. + + In this mode the fullscreen window will behave as a partially transparent overlay, allowing you to click on the other windows behind it. -To return to normal mode anytime, activate OnTopReplica by clicking on the task bar (or the tray icon). - - +To return to normal mode anytime, activate OnTopReplica by clicking on the task bar (or the tray icon). + + No, thank you. -You can enable click-through later - - - Use Click-Through - - - Click-Through mode - - - OnTopReplica has been updated. - - - In order to use the updated version of OnTopReplica you'll have to restart the application. - - - Update successful - - - OnTopReplica is up to date. - - - No update available - - - Language - - - About... - - - Hides the main window and displays the "about" box. - - - Advanced - - - Show window border - - - Toggles the display of the window border. - - - Enable Click forwarding - - - Enable "click forwarding" to the cloned window. - - - Enable Click-Through - - - OnTopReplica will behave like a transparent overlay that lets your clicks through to the windows below. - - - Close - - - Closes OnTopReplica. - - - 2:1 Double - - - Fullscreen - - - 1:2 Half - - - 1:1 Fit to window - - - 1:4 Quarter - - - Group Switch mode - - - OnTopReplica will automatically clone a window from an user defined group, switching to the one least recently activated to the foreground. - - - 100% (opaque) - - - Sets OnTopReplica to be completely opaque. - - - 25% - - - Sets OnTopReplica to 25% opacity. - - - 50% - - - Sets OnTopReplica to 50% opacity. - - - 75% - - - Sets OnTopReplica to 75% opacity. - - - Opacity - - - Open - - - Displays OnTopReplica. - - - Bottom Left - - - Bottom Right - - - Center - - - Disabled - - - Position lock - - - Automatically position OnTopReplica on the current screen. - - - Top Left - - - Top Right - - - Quit fullscreen mode - - - Recall last position and size - - - Toggles whether OnTopReplica should store its last position and size and use them when it is restarted. - - - Minimize - - - Minimizes OnTopReplica to the task bar (or the tray). - - - Select region... - - - Switches to "region mode", that allows you to select a limited region of the source's window as thumbnail. - - - Reset window - - - Resets OnTopReplica settings and its main window. - - - Resize - - - Restore last cloned window - - - When enabled, OnTopReplica will attempt to restore the last cloned window on start up. - - - Settings... - - - Displays the settings panel. - - - Switch to window - - - Switches to the source window and hides OnTopReplica. - - - Select window - - - - none - - - - Displays a list of window you can select as thumbnail source. - - - - whole - - - - Current region: - - - Delete - - - Done - - - Height - - - Reset - - - Save - - - Stored regions - - - Regions: - - - Width - - - Right-click here to start... - - - Clone current window - - - These system-wide shortcuts can also be used when OnTopReplica is not in focus. - - - Show/Hide - - - Hot keys: - - - Language: - - - Requires a restart. - - - Settings - - +You can enable click-through later + + + Use Click-Through + + + Click-Through mode + + + OnTopReplica has been updated. + + + In order to use the updated version of OnTopReplica you'll have to restart the application. + + + Update successful + + + OnTopReplica is up to date. + + + No update available + + + Language + + + About... + + + Hides the main window and displays the "about" box. + + + Advanced + + + Show window border + + + Toggles the display of the window border. + + + Enable Click forwarding + + + Enable "click forwarding" to the cloned window. + + + Enable Click-Through + + + OnTopReplica will behave like a transparent overlay that lets your clicks through to the windows below. + + + Close + + + Closes OnTopReplica. + + + 2:1 Double + + + Fullscreen + + + 1:2 Half + + + 1:1 Fit to window + + + 1:4 Quarter + + + Group Switch mode + + + OnTopReplica will automatically clone a window from an user defined group, switching to the one least recently activated to the foreground. + + + 100% (opaque) + + + Sets OnTopReplica to be completely opaque. + + + 25% + + + Sets OnTopReplica to 25% opacity. + + + 50% + + + Sets OnTopReplica to 50% opacity. + + + 75% + + + Sets OnTopReplica to 75% opacity. + + + Opacity + + + Open + + + Displays OnTopReplica. + + + Bottom Left + + + Bottom Right + + + Center + + + Disabled + + + Position lock + + + Automatically position OnTopReplica on the current screen. + + + Top Left + + + Top Right + + + Quit fullscreen mode + + + Recall last position and size + + + Toggles whether OnTopReplica should store its last position and size and use them when it is restarted. + + + Minimize + + + Minimizes OnTopReplica to the task bar (or the tray). + + + Select region... + + + Switches to "region mode", that allows you to select a limited region of the source's window as thumbnail. + + + Reset window + + + Resets OnTopReplica settings and its main window. + + + Resize + + + Restore last cloned window + + + When enabled, OnTopReplica will attempt to restore the last cloned window on start up. + + + Settings... + + + Displays the settings panel. + + + Switch to window + + + Switches to the source window and hides OnTopReplica. + + + Select window + + + - none - + + + Displays a list of window you can select as thumbnail source. + + + - whole - + + + Current region: + + + Delete + + + Done + + + Height + + + Reset + + + Save + + + Stored regions + + + Regions: + + + Width + + + Right-click here to start... + + + Clone current window + + + These system-wide shortcuts can also be used when OnTopReplica is not in focus. + + + Show/Hide + + + Hot keys: + + + Language: + + + Requires a restart. + + + Settings + + Cancel update -OnTopReplica will prompt you the next time it is started. - - +OnTopReplica will prompt you the next time it is started. + + Download -Install OnTopReplica {0}. - - - The new version can be downloaded and installed from the official website. - - +Install OnTopReplica {0}. + + + The new version can be downloaded and installed from the official website. + + Installed version: {0} -Available version: {1} - - - Version {0} available - - - {0}/{1} bytes downloaded. +Available version: {1} + + + Version {0} available + + + {0}/{1} bytes downloaded. {0} downloaded bytes {1} total bytes {0} bytes geladen von {1} bytes gesamt {0} downloaded bytes {1} total bytes {0} downloaded bytes {1} total bytes -{0} downloaded bytes {1} total bytes - - - Downloading... - - +{0} downloaded bytes {1} total bytes + + + Downloading... + + The latest version of OnTopReplica is already installed. The program automatically checks for updates at every start. -You can keep up to date about OnTopReplica's development, suggest improvements and new features by <a href="website">visiting the official website</a>. - The website link should be enclosed in <a href="website"></a> tags. - - - Latest stable version released on {0}. - {0} last version release date - - - OnTopReplica is up to date - - +You can keep up to date about OnTopReplica's development, suggest improvements and new features by <a href="website">visiting the official website</a>. + The website link should be enclosed in <a href="website"></a> tags. + + + Latest stable version released on {0}. + {0} last version release date + + + OnTopReplica is up to date + + Install -OnTopReplica will be closed and the update installed. - - - OnTopReplica version {0} is ready to be installed on your computer. - - - Update ready - - - OnTopReplica updates - +OnTopReplica will be closed and the update installed. + + + OnTopReplica version {0} is ready to be installed on your computer. + + + Update ready + + + OnTopReplica updates + \ No newline at end of file diff --git a/OnTopReplica/Strings.pl.Designer.cs b/src/OnTopReplica/Strings.pl.Designer.cs similarity index 100% rename from OnTopReplica/Strings.pl.Designer.cs rename to src/OnTopReplica/Strings.pl.Designer.cs diff --git a/OnTopReplica/Strings.pl.resx b/src/OnTopReplica/Strings.pl.resx similarity index 97% rename from OnTopReplica/Strings.pl.resx rename to src/OnTopReplica/Strings.pl.resx index bf277d9..1f54a1b 100644 --- a/OnTopReplica/Strings.pl.resx +++ b/src/OnTopReplica/Strings.pl.resx @@ -1,655 +1,655 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 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 - - - Autor: %. - Link % is replaced by string AboutAuthorContent. - - - Przerwij proces aktualizacji. - - - Pokaż szczegóły dotyczące OnTopReplica. - - - Resetuj wszystkie ustawienia OnTopReplica. - - - Aktualizuj teraz OnTopReplica - - - Chcesz wesprzeć projekt? Możesz ulepszyć istniejące tłumaczenia, utworzyć nowe dla Twojego rodzimego języka lub sprawdzić % na CodePlex. - - - kod źródłowy - - - OnTopReplica jest oparty na bibliotece WindowsFormsAero oraz innych bibliotekach i kodzie źródłowym. %. - Link % is replaced by string AboutCreditsSourcesContent. - - - Przeczytaj więcej - - - Wsparcie - - - Zasługi - - - Licencja - - - Aktualizacje - - - Aplikacja jest licencjonowana na warunkach licencji %, która spełnia warunki definicji "open-source" definiowane przez OSI. - - - Miniatura "zawsze na wierzchu" pokazująca "na żywo" podgląd wybranego okna. - - - O programie OnTopReplica - - - Tłumaczenie: {0} - {0} translators (do not end with period) - - - Sprawdź teraz! - - - OnTopReplica automatycznie sprawdza dostępność aktualizacji po każdym uruchomieniu. - - - Wersja {0} - - - - Probably doesn't need localization. :) - - - Całkowicie zresetować okno? - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Autor: %. + Link % is replaced by string AboutAuthorContent. + + + Przerwij proces aktualizacji. + + + Pokaż szczegóły dotyczące OnTopReplica. + + + Resetuj wszystkie ustawienia OnTopReplica. + + + Aktualizuj teraz OnTopReplica + + + Chcesz wesprzeć projekt? Możesz ulepszyć istniejące tłumaczenia, utworzyć nowe dla Twojego rodzimego języka lub sprawdzić % na CodePlex. + + + kod źródłowy + + + OnTopReplica jest oparty na bibliotece WindowsFormsAero oraz innych bibliotekach i kodzie źródłowym. %. + Link % is replaced by string AboutCreditsSourcesContent. + + + Przeczytaj więcej + + + Wsparcie + + + Zasługi + + + Licencja + + + Aktualizacje + + + Aplikacja jest licencjonowana na warunkach licencji %, która spełnia warunki definicji "open-source" definiowane przez OSI. + + + Miniatura "zawsze na wierzchu" pokazująca "na żywo" podgląd wybranego okna. + + + O programie OnTopReplica + + + Tłumaczenie: {0} + {0} translators (do not end with period) + + + Sprawdź teraz! + + + OnTopReplica automatycznie sprawdza dostępność aktualizacji po każdym uruchomieniu. + + + Wersja {0} + + + + Probably doesn't need localization. :) + + + Całkowicie zresetować okno? + + &Zresetuj -Wszystkie ustawienia zostaną utracone. - - - Może być użyte do zresetowania ustawień, jeśli została utracona kontrola nad oknem, lub zostało ono przesunięte poza granice ekranu. - - - Zresetuj - - - Zresetować ustawienia? - - - Ta opcja usunie wszystkie ustawienia spersonalizowane OnTopReplica i przywróci program do stanu jak po instalacji (wszystkie zapisane ustawienia, jak regiony, zostaną utracone). - - - Zresetuj ustawienia - - - &Anuluj - & marks the ALT+[] shortcut - - - Utwórz region używając myszy. - - - Szczegóły - - - Szczegóły dot. Windows Aero - - - Windows Aero jest dostępne w wersji Windows Vista Home Premium i nowszych. - - - Kompozycje pulpitu są wyłączone. - - +Wszystkie ustawienia zostaną utracone. + + + Może być użyte do zresetowania ustawień, jeśli została utracona kontrola nad oknem, lub zostało ono przesunięte poza granice ekranu. + + + Zresetuj + + + Zresetować ustawienia? + + + Ta opcja usunie wszystkie ustawienia spersonalizowane OnTopReplica i przywróci program do stanu jak po instalacji (wszystkie zapisane ustawienia, jak regiony, zostaną utracone). + + + Zresetuj ustawienia + + + &Anuluj + & marks the ALT+[] shortcut + + + Utwórz region używając myszy. + + + Szczegóły + + + Szczegóły dot. Windows Aero + + + Windows Aero jest dostępne w wersji Windows Vista Home Premium i nowszych. + + + Kompozycje pulpitu są wyłączone. + + Musisz włączyć kompozycje pulpitu wybierając 'Windows Aero' jako schemat używany przez Windows. -Aby to uczynić kliknij prawym przyciskiem na pulpicie i wybierz 'Personalizuj'. - - - Szczegóły błędu - - - Błąd: - - - Wygląda na to, że wybrane okno zostało zamknięte lub nie jest już dostępne. - - - Błąd - - +Aby to uczynić kliknij prawym przyciskiem na pulpicie i wybierz 'Personalizuj'. + + + Szczegóły błędu + + + Błąd: + + + Wygląda na to, że wybrane okno zostało zamknięte lub nie jest już dostępne. + + + Błąd + + Kompozycje pulpitu nie są wspierane przez Twój system operacyjny. -Aplikacja działa na Windows Vista Home Premium i nowszych. - - - Niewspierana kompozycja pulpitu - - - Nie załadowano miniatury. - - - Nie można utworzyć miniatury. - - - Nie można dopasować okna. - - - Nie można sprawdzić aktualizacji. - - - Wygląda na to, że OnTopReplica nie została zainstalowana przy użyciu 'ClickOnce'. Musisz ręcznie zaktualizować program (odwiedź <a href="http://ontopreplica.codeplex.com">stronę domową OnTopReplica's</a>). - - - Program OnTopReplica nie był w stanie sprawdzić, czy jest dostępna nowa wersja. Upewnij się, że Twoje połączenie z Internetem pracuje poprawnie. Jeśli tak, być może strona programu jest chwilowo niedostępna. - - - Tryb - - - Zawsze na wierzchu - - - Wymusza położenie okna OnTopReplica zawsze na wierzchu. - - - Kliknij-przez - - - OnTopReplica będzie się zachowywać jak półprzeźroczysta warstwa, co pozwoli Ci klikać na oknie położonym pod spodem. - - - Standardowe - - - Zachowanie jak normalne okno. Możesz przeciągnąć inne okna ponad OnTopReplica. - - - Pełny ekran OnTopReplica - - - Wyłącz - - - Włącz tryb grupowy - - - Wybierz kilka okien aby uaktywnić. - - - Tryb grupowy jest aktywny. - - - Tryb grupowy: - - - Okna - Column Header of list, simply refers to available windows to be cloned - - - Strona domowa: www.codeplex.com/ontopreplica. - - - Czy uaktywnić "przekazywanie kliknięć"? - - +Aplikacja działa na Windows Vista Home Premium i nowszych. + + + Niewspierana kompozycja pulpitu + + + Nie załadowano miniatury. + + + Nie można utworzyć miniatury. + + + Nie można dopasować okna. + + + Nie można sprawdzić aktualizacji. + + + Wygląda na to, że OnTopReplica nie została zainstalowana przy użyciu 'ClickOnce'. Musisz ręcznie zaktualizować program (odwiedź <a href="http://ontopreplica.codeplex.com">stronę domową OnTopReplica's</a>). + + + Program OnTopReplica nie był w stanie sprawdzić, czy jest dostępna nowa wersja. Upewnij się, że Twoje połączenie z Internetem pracuje poprawnie. Jeśli tak, być może strona programu jest chwilowo niedostępna. + + + Tryb + + + Zawsze na wierzchu + + + Wymusza położenie okna OnTopReplica zawsze na wierzchu. + + + Kliknij-przez + + + OnTopReplica będzie się zachowywać jak półprzeźroczysta warstwa, co pozwoli Ci klikać na oknie położonym pod spodem. + + + Standardowe + + + Zachowanie jak normalne okno. Możesz przeciągnąć inne okna ponad OnTopReplica. + + + Pełny ekran OnTopReplica + + + Wyłącz + + + Włącz tryb grupowy + + + Wybierz kilka okien aby uaktywnić. + + + Tryb grupowy jest aktywny. + + + Tryb grupowy: + + + Okna + Column Header of list, simply refers to available windows to be cloned + + + Strona domowa: www.codeplex.com/ontopreplica. + + + Czy uaktywnić "przekazywanie kliknięć"? + + Kiedy ten tryb jest aktywny, OnTopReplica będzie przekazywać kliknięcia przycisków myszy do okna, które jest klonowane (dzięki temu możesz wykonywać na tym oknie podstawowe operacje bez konieczności uaktywniania go). -Naciśnij ESC aby zakończyć ten tryb. - - - Przekazywanie kliknięć - - - Włączyć tryb kliknij-przez? - - - Kliknij-przez działa tylko wtedy, gdy zostało włączone w podmenu 'Zmień rozmiar' i kiedy okno jest półprzeźroczyste. - - +Naciśnij ESC aby zakończyć ten tryb. + + + Przekazywanie kliknięć + + + Włączyć tryb kliknij-przez? + + + Kliknij-przez działa tylko wtedy, gdy zostało włączone w podmenu 'Zmień rozmiar' i kiedy okno jest półprzeźroczyste. + + W tym trybie okno na pełnym ekranie będzie się zachowywać jak półprzeźroczysta warstwa i będziesz w stanie kliknąć na oknie znajdującym się pod nim. -Aby w dowolnym momencie powrócić do normalnego trybu aktywuj OnTopReplica klikając na pasku zadań (lub na ikonce w tacce systemowej). - - +Aby w dowolnym momencie powrócić do normalnego trybu aktywuj OnTopReplica klikając na pasku zadań (lub na ikonce w tacce systemowej). + + Nie, dziękuję. -Możesz włączyć kliknij-przez później - - - Użyj kliknij-przez - - - Tryb kliknij-przez - - - Program OnTopReplica został zaktualizowany. - - - Aby używać zaktualizowanej wersji OnTopReplica musisz zrestartować aplikację. - - - Aktualizacja zakończona powodzeniem - - - Program OnTopReplica jest aktualny. - - - Brak dostępnych aktualizacji - - - Język - - - O... - - - Wyświetla informacje o programie. - - - Zaawansowane - - - Pokazuj ramkę okna - - - Przełącznik wyświetlania ramki okna. - - - Włącz przekazywanie kliknięć - - - Uaktywnia przekazywanie kliknięć do klonowanego okna. - - - Włącz kliknij-przez - - - OnTopReplica będzie się zachowywać jak półprzeźroczysta warstwa i będziesz w stanie kliknąć na oknie znajdującym się pod nim. - - - Zamknij - - - Zamyka OnTopReplica. - - - 2:1 Podwójny - - - Pełny ekran - - - 1:2 Połowa - - - 1:1 Rozmiar oryginalny - - - 1:4 Ćwiartka - - - Tryb grupowy - - - OnTopReplica automatycznie sklonuje okno ze zdefiniowanej przez użytkownika grupy przełączając na to, które było najwcześniej zdeaktywowane. - - - 100% (nieprzeźroczyste) - - - Ustawia OnTopReplica jako całkowicie nieprzeźroczyste. - - - 25% - - - Ustawia przeźroczystość OnTopReplica na 25%. - - - 50% - - - Ustawia przeźroczystość OnTopReplica na 50%. - - - 75% - - - Ustawia przeźroczystość OnTopReplica na 75%. - - - Przeźroczystość - - - Otwórz - - - Wyświetla OnTopReplica. - - - Dół Lewo - - - Dół Prawo - - - Środek - - - Wyłączone - - - Zablokuj pozycję - - - Automatycznie ustawia pozycję OnTopReplica na bieżącym ekranie. - - - Góra Lewo - - - Góra Prawo - - - Wyjdź z trybu pełnoekranowego - - - Zapamiętaj ostatnią pozycję i rozmiar - - - Wybierz, czy OnTopReplica powinien zapamiętać ostatnią pozycję i rozmiar i użyć ich ponownie przy kolejnym uruchomieniu. - - - Minimalizuj - - - Minimalizuje OnTopReplica do paska zadań (lub tacki systemowej). - - - Wybierz region... - - - Przełącza na "tryb regionu", w którym można zaznaczyć jako miniaturę określony obszar okna źródłowego. - - - Resetuj okno - - - Resetuje ustawienia OnTopReplica i okna głównego. - - - Zmień rozmiar - - - Przywróć ostatnio klonowane okno - - - Kiedy włączone, OnTopReplica będzie próbować podczas uruchomienia przywrócić ostatnio klonowane okno. - - - Ustawienia... - - - Wyświetla okno konfiguracji. - - - Przełącz na okno - - - Przełącza na okno źródłowe i ukrywa okno OnTopReplica. - - - Wybierz okno - - - - żadne - - - - Wyświetla listę okien, które możesz wybrać jako źródło miniatur. - - - - całe - - - - Bieżący region: - - - Usuń - - - Gotowe - - - Wysokość - - - Zresetuj - - - Zapisz - - - Zapisane regiony - - - Regiony: - - - Szerokość - - - Kliknij prawym tutaj aby rozpocząć... - - - Sklonuj bieżące okno - - - Skróty klawiszowe działają również wtedy, gdy okno OnTopReplica nie jest aktywne. - - - Pokaż/Ukryj - - - Klawisze skrótu: - - - Język: - - - Wymaga restartu. - - - Ustawienia - - +Możesz włączyć kliknij-przez później + + + Użyj kliknij-przez + + + Tryb kliknij-przez + + + Program OnTopReplica został zaktualizowany. + + + Aby używać zaktualizowanej wersji OnTopReplica musisz zrestartować aplikację. + + + Aktualizacja zakończona powodzeniem + + + Program OnTopReplica jest aktualny. + + + Brak dostępnych aktualizacji + + + Język + + + O... + + + Wyświetla informacje o programie. + + + Zaawansowane + + + Pokazuj ramkę okna + + + Przełącznik wyświetlania ramki okna. + + + Włącz przekazywanie kliknięć + + + Uaktywnia przekazywanie kliknięć do klonowanego okna. + + + Włącz kliknij-przez + + + OnTopReplica będzie się zachowywać jak półprzeźroczysta warstwa i będziesz w stanie kliknąć na oknie znajdującym się pod nim. + + + Zamknij + + + Zamyka OnTopReplica. + + + 2:1 Podwójny + + + Pełny ekran + + + 1:2 Połowa + + + 1:1 Rozmiar oryginalny + + + 1:4 Ćwiartka + + + Tryb grupowy + + + OnTopReplica automatycznie sklonuje okno ze zdefiniowanej przez użytkownika grupy przełączając na to, które było najwcześniej zdeaktywowane. + + + 100% (nieprzeźroczyste) + + + Ustawia OnTopReplica jako całkowicie nieprzeźroczyste. + + + 25% + + + Ustawia przeźroczystość OnTopReplica na 25%. + + + 50% + + + Ustawia przeźroczystość OnTopReplica na 50%. + + + 75% + + + Ustawia przeźroczystość OnTopReplica na 75%. + + + Przeźroczystość + + + Otwórz + + + Wyświetla OnTopReplica. + + + Dół Lewo + + + Dół Prawo + + + Środek + + + Wyłączone + + + Zablokuj pozycję + + + Automatycznie ustawia pozycję OnTopReplica na bieżącym ekranie. + + + Góra Lewo + + + Góra Prawo + + + Wyjdź z trybu pełnoekranowego + + + Zapamiętaj ostatnią pozycję i rozmiar + + + Wybierz, czy OnTopReplica powinien zapamiętać ostatnią pozycję i rozmiar i użyć ich ponownie przy kolejnym uruchomieniu. + + + Minimalizuj + + + Minimalizuje OnTopReplica do paska zadań (lub tacki systemowej). + + + Wybierz region... + + + Przełącza na "tryb regionu", w którym można zaznaczyć jako miniaturę określony obszar okna źródłowego. + + + Resetuj okno + + + Resetuje ustawienia OnTopReplica i okna głównego. + + + Zmień rozmiar + + + Przywróć ostatnio klonowane okno + + + Kiedy włączone, OnTopReplica będzie próbować podczas uruchomienia przywrócić ostatnio klonowane okno. + + + Ustawienia... + + + Wyświetla okno konfiguracji. + + + Przełącz na okno + + + Przełącza na okno źródłowe i ukrywa okno OnTopReplica. + + + Wybierz okno + + + - żadne - + + + Wyświetla listę okien, które możesz wybrać jako źródło miniatur. + + + - całe - + + + Bieżący region: + + + Usuń + + + Gotowe + + + Wysokość + + + Zresetuj + + + Zapisz + + + Zapisane regiony + + + Regiony: + + + Szerokość + + + Kliknij prawym tutaj aby rozpocząć... + + + Sklonuj bieżące okno + + + Skróty klawiszowe działają również wtedy, gdy okno OnTopReplica nie jest aktywne. + + + Pokaż/Ukryj + + + Klawisze skrótu: + + + Język: + + + Wymaga restartu. + + + Ustawienia + + Anuluj aktualizację -OnTopReplica zapyta Cię przy następnym uruchomieniu. - - +OnTopReplica zapyta Cię przy następnym uruchomieniu. + + Pobierz -Zainstaluj OnTopReplica {0}. - - - Nowa wersja może zostać pobrana i zainstalowana z oficjalnej strony programu. - - +Zainstaluj OnTopReplica {0}. + + + Nowa wersja może zostać pobrana i zainstalowana z oficjalnej strony programu. + + Zainstalowana wersja: {0} -Dostępna wersja: {1} - - - Dostępna jest wersja {0} - - - pobrano {0}/{1} bajtów. +Dostępna wersja: {1} + + + Dostępna jest wersja {0} + + + pobrano {0}/{1} bajtów. {0} downloaded bytes {1} total bytes {0} bytes geladen von {1} bytes gesamt {0} downloaded bytes {1} total bytes {0} downloaded bytes {1} total bytes -{0} downloaded bytes {1} total bytes - - - Pobieram... - - +{0} downloaded bytes {1} total bytes + + + Pobieram... + + Najnowsza wersja OnTopReplica jest już zainstalowana. Program automatycznie sprawdza dostępność aktualizacji po każdym uruchomieniu. -Na <a href="website">oficjalnej stronie domowej</a> możesz znaleźć informacje o rozwoju OnTopReplica's oraz zaproponować nowe funkcje. - The website link should be enclosed in <a href="website"></a> tags. - - - Ostatnia wersja stabilna wydana {0}. - {0} last version release date - - - OnTopReplica jest aktualna - - +Na <a href="website">oficjalnej stronie domowej</a> możesz znaleźć informacje o rozwoju OnTopReplica's oraz zaproponować nowe funkcje. + The website link should be enclosed in <a href="website"></a> tags. + + + Ostatnia wersja stabilna wydana {0}. + {0} last version release date + + + OnTopReplica jest aktualna + + Zainstaluj -Aktualizacje zostaną zainstalowane po ponownym uruchomieniu OnTopReplica. - - - Wersja {0} OnTopReplica jest gotowa do zainstalowania. - - - Aktualizacja ukończona - - - Aktualizacje OnTopReplica - - - - Must not be localized. Leave blank in non-default languages. - - - Microsoft Reciprocal (MS-RL) - Can be left blank. - - - - Must not be localized. Leave blank in non-default languages. - +Aktualizacje zostaną zainstalowane po ponownym uruchomieniu OnTopReplica. + + + Wersja {0} OnTopReplica jest gotowa do zainstalowania. + + + Aktualizacja ukończona + + + Aktualizacje OnTopReplica + + + + Must not be localized. Leave blank in non-default languages. + + + Microsoft Reciprocal (MS-RL) + Can be left blank. + + + + Must not be localized. Leave blank in non-default languages. + \ No newline at end of file diff --git a/OnTopReplica/Strings.pt-BR.Designer.cs b/src/OnTopReplica/Strings.pt-BR.Designer.cs similarity index 100% rename from OnTopReplica/Strings.pt-BR.Designer.cs rename to src/OnTopReplica/Strings.pt-BR.Designer.cs diff --git a/OnTopReplica/Strings.pt-BR.resx b/src/OnTopReplica/Strings.pt-BR.resx similarity index 97% rename from OnTopReplica/Strings.pt-BR.resx rename to src/OnTopReplica/Strings.pt-BR.resx index 6f4f6c9..3c2b033 100644 --- a/OnTopReplica/Strings.pt-BR.resx +++ b/src/OnTopReplica/Strings.pt-BR.resx @@ -1,655 +1,655 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 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 - - - Created by: %. - Link % is replaced by string AboutAuthorContent. - - - - Must not be localized. Leave blank in non-default languages. - - - Abort update process. - - - Show details about OnTopReplica. - - - Reset all OnTopReplica settings. - - - Update OnTopReplica now. - - - Care to contribute to the project? You are welcome to improve available translations, start a new one for your native language or to check out the % from CodePlex. - - - source code - - - OnTopReplica is based upon the WindowsFormsAero library and some other libraries and code sources. %. - Link % is replaced by string AboutCreditsSourcesContent. - - - Read the full credits - - - Contribute - - - Credits - - - License - - - Updates - - - The application is licensed under the % license, which meets the terms of the "open-source" definition specified by OSI. - - - Microsoft Reciprocal (MS-RL) - Can be left blank. - - - A lightweight, real-time, always on top thumbnail of a window of your choice. - - - About OnTopReplica - - - Translators: {0} - {0} translators (do not end with period) - - - Christian Olaechea M., Daniel Zeus.EX, Federico Lorenzo, Goran Brecelj, Jan Romanczyk, Marco Kraxner, Patrik (batupata), Raúl Morillo, René Mihula, Roberto Leiro, Rodrigo Lourenço, Thomas Amundsen, Eric Hoffmann. - Must not be localized. Leave blank in non-default languages. - - - Check now! - - - OnTopReplica automatically checks for updates at every start up. - - - Version {0} - - - OnTopReplica - Probably doesn't need localization. :) - - - Reset window completely? - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Created by: %. + Link % is replaced by string AboutAuthorContent. + + + + Must not be localized. Leave blank in non-default languages. + + + Abort update process. + + + Show details about OnTopReplica. + + + Reset all OnTopReplica settings. + + + Update OnTopReplica now. + + + Care to contribute to the project? You are welcome to improve available translations, start a new one for your native language or to check out the % from CodePlex. + + + source code + + + OnTopReplica is based upon the WindowsFormsAero library and some other libraries and code sources. %. + Link % is replaced by string AboutCreditsSourcesContent. + + + Read the full credits + + + Contribute + + + Credits + + + License + + + Updates + + + The application is licensed under the % license, which meets the terms of the "open-source" definition specified by OSI. + + + Microsoft Reciprocal (MS-RL) + Can be left blank. + + + A lightweight, real-time, always on top thumbnail of a window of your choice. + + + About OnTopReplica + + + Translators: {0} + {0} translators (do not end with period) + + + Christian Olaechea M., Daniel Zeus.EX, Federico Lorenzo, Goran Brecelj, Jan Romanczyk, Marco Kraxner, Patrik (batupata), Raúl Morillo, René Mihula, Roberto Leiro, Rodrigo Lourenço, Thomas Amundsen, Eric Hoffmann. + Must not be localized. Leave blank in non-default languages. + + + Check now! + + + OnTopReplica automatically checks for updates at every start up. + + + Version {0} + + + OnTopReplica + Probably doesn't need localization. :) + + + Reset window completely? + + &Reset -All settings will be lost. - - - Can be used to reset all settings if you lost control over the window or moved it beyond the screen boundary. - - - Reset - - - Reset settings? - - - This will erase all settings of OnTopReplica, returning it to the original state right after installation (all saved information, like stored regions, will be lost). - - - Reset settings - - - &Cancel - & marks the ALT+[] shortcut - - - Draw regions using mouse. - - - Details - - - Details on Windows Aero - - - Windows Aero is only available on Windows Vista Home Premium or higher. - - - 'Desktop Composition' is not enabled. - - +All settings will be lost. + + + Can be used to reset all settings if you lost control over the window or moved it beyond the screen boundary. + + + Reset + + + Reset settings? + + + This will erase all settings of OnTopReplica, returning it to the original state right after installation (all saved information, like stored regions, will be lost). + + + Reset settings + + + &Cancel + & marks the ALT+[] shortcut + + + Draw regions using mouse. + + + Details + + + Details on Windows Aero + + + Windows Aero is only available on Windows Vista Home Premium or higher. + + + 'Desktop Composition' is not enabled. + + You must enable desktop composition, by selecting 'Windows Aero' as the theme used by Windows. -To do so, right-click on the desktop and click on Personalize. - - - Error details - - - Error: - - - It appears that the selected window has been closed or is not valid anymore. - - - Error - - +To do so, right-click on the desktop and click on Personalize. + + + Error details + + + Error: + + + It appears that the selected window has been closed or is not valid anymore. + + + Error + + Desktop Composition' is not supported on your Operating System. -You must run this application on Windows Vista Home Premium or better. - - - Desktop Composition unsupported - - - No thumbnail loaded. - - - Unable to create thumbnail - - - Unable to fit window. - - - Unable to check for updates. - - - It appears that OnTopReplica wasn't installed using 'ClickOnce'. You'll have to update manually (visit <a href="http://ontopreplica.codeplex.com">OnTopReplica's homepage</a>). - - - OnTopReplica was unable to check whether an updated version is available. Make sure you are connected to the Internet. If you are, the website may be temporarily down. - - - Mode - - - Always on top - - - Forces OnTopReplica to stay always on top. - - - Click through - - - OnTopReplica will behave like a transparent overlay that lets your clicks through to the windows below. - - - Standard - - - Behaves like an ordinary window. You can bring other windows above OnTopReplica. - - - OnTopReplica fullscreen - - - Disable - - - Enable Group mode - - - Select multiple windows to enable. - - - Group switch mode is enabled. - - - Group switch mode: - - - Windows - Column Header of list, simply refers to available windows to be cloned - - - Homepage: www.codeplex.com/ontopreplica. - - - Do you want to enable "click forwarding"? - - +You must run this application on Windows Vista Home Premium or better. + + + Desktop Composition unsupported + + + No thumbnail loaded. + + + Unable to create thumbnail + + + Unable to fit window. + + + Unable to check for updates. + + + It appears that OnTopReplica wasn't installed using 'ClickOnce'. You'll have to update manually (visit <a href="http://ontopreplica.codeplex.com">OnTopReplica's homepage</a>). + + + OnTopReplica was unable to check whether an updated version is available. Make sure you are connected to the Internet. If you are, the website may be temporarily down. + + + Mode + + + Always on top + + + Forces OnTopReplica to stay always on top. + + + Click through + + + OnTopReplica will behave like a transparent overlay that lets your clicks through to the windows below. + + + Standard + + + Behaves like an ordinary window. You can bring other windows above OnTopReplica. + + + OnTopReplica fullscreen + + + Disable + + + Enable Group mode + + + Select multiple windows to enable. + + + Group switch mode is enabled. + + + Group switch mode: + + + Windows + Column Header of list, simply refers to available windows to be cloned + + + Homepage: www.codeplex.com/ontopreplica. + + + Do you want to enable "click forwarding"? + + If this mode is enabled, OnTopReplica will forward all left mouse clicks to the window that is being cloned (this will allow you to do basic mouse operations on the cloned window without having to activate it). -To exit this mode, push ESC. - - - Click forwarding - - - Enable Click-Through mode? - - - Click-through only works if it has been enabled in the Resize submenu and if the window is semi-transparent. - - +To exit this mode, push ESC. + + + Click forwarding + + + Enable Click-Through mode? + + + Click-through only works if it has been enabled in the Resize submenu and if the window is semi-transparent. + + In this mode the fullscreen window will behave as a partially transparent overlay, allowing you to click on the other windows behind it. -To return to normal mode anytime, activate OnTopReplica by clicking on the task bar (or the tray icon). - - +To return to normal mode anytime, activate OnTopReplica by clicking on the task bar (or the tray icon). + + No, thank you. -You can enable click-through later - - - Use Click-Through - - - Click-Through mode - - - OnTopReplica has been updated. - - - In order to use the updated version of OnTopReplica you'll have to restart the application. - - - Update successful - - - OnTopReplica is up to date. - - - No update available - - - Language - - - About... - - - Hides the main window and displays the "about" box. - - - Advanced - - - Show window border - - - Toggles the display of the window border. - - - Enable Click forwarding - - - Enable "click forwarding" to the cloned window. - - - Enable Click-Through - - - OnTopReplica will behave like a transparent overlay that lets your clicks through to the windows below. - - - Close - - - Closes OnTopReplica. - - - 2:1 Double - - - Fullscreen - - - 1:2 Half - - - 1:1 Fit to window - - - 1:4 Quarter - - - Group Switch mode - - - OnTopReplica will automatically clone a window from an user defined group, switching to the one least recently activated to the foreground. - - - 100% (opaque) - - - Sets OnTopReplica to be completely opaque. - - - 25% - - - Sets OnTopReplica to 25% opacity. - - - 50% - - - Sets OnTopReplica to 50% opacity. - - - 75% - - - Sets OnTopReplica to 75% opacity. - - - Opacity - - - Open - - - Displays OnTopReplica. - - - Bottom Left - - - Bottom Right - - - Center - - - Disabled - - - Position lock - - - Automatically position OnTopReplica on the current screen. - - - Top Left - - - Top Right - - - Quit fullscreen mode - - - Recall last position and size - - - Toggles whether OnTopReplica should store its last position and size and use them when it is restarted. - - - Minimize - - - Minimizes OnTopReplica to the task bar (or the tray). - - - Select region... - - - Switches to "region mode", that allows you to select a limited region of the source's window as thumbnail. - - - Reset window - - - Resets OnTopReplica settings and its main window. - - - Resize - - - Restore last cloned window - - - When enabled, OnTopReplica will attempt to restore the last cloned window on start up. - - - Settings... - - - Displays the settings panel. - - - Switch to window - - - Switches to the source window and hides OnTopReplica. - - - Select window - - - - none - - - - Displays a list of window you can select as thumbnail source. - - - - whole - - - - Current region: - - - Delete - - - Done - - - Height - - - Reset - - - Save - - - Stored regions - - - Regions: - - - Width - - - Right-click here to start... - - - Clone current window - - - These system-wide shortcuts can also be used when OnTopReplica is not in focus. - - - Show/Hide - - - Hot keys: - - - Language: - - - Requires a restart. - - - Settings - - +You can enable click-through later + + + Use Click-Through + + + Click-Through mode + + + OnTopReplica has been updated. + + + In order to use the updated version of OnTopReplica you'll have to restart the application. + + + Update successful + + + OnTopReplica is up to date. + + + No update available + + + Language + + + About... + + + Hides the main window and displays the "about" box. + + + Advanced + + + Show window border + + + Toggles the display of the window border. + + + Enable Click forwarding + + + Enable "click forwarding" to the cloned window. + + + Enable Click-Through + + + OnTopReplica will behave like a transparent overlay that lets your clicks through to the windows below. + + + Close + + + Closes OnTopReplica. + + + 2:1 Double + + + Fullscreen + + + 1:2 Half + + + 1:1 Fit to window + + + 1:4 Quarter + + + Group Switch mode + + + OnTopReplica will automatically clone a window from an user defined group, switching to the one least recently activated to the foreground. + + + 100% (opaque) + + + Sets OnTopReplica to be completely opaque. + + + 25% + + + Sets OnTopReplica to 25% opacity. + + + 50% + + + Sets OnTopReplica to 50% opacity. + + + 75% + + + Sets OnTopReplica to 75% opacity. + + + Opacity + + + Open + + + Displays OnTopReplica. + + + Bottom Left + + + Bottom Right + + + Center + + + Disabled + + + Position lock + + + Automatically position OnTopReplica on the current screen. + + + Top Left + + + Top Right + + + Quit fullscreen mode + + + Recall last position and size + + + Toggles whether OnTopReplica should store its last position and size and use them when it is restarted. + + + Minimize + + + Minimizes OnTopReplica to the task bar (or the tray). + + + Select region... + + + Switches to "region mode", that allows you to select a limited region of the source's window as thumbnail. + + + Reset window + + + Resets OnTopReplica settings and its main window. + + + Resize + + + Restore last cloned window + + + When enabled, OnTopReplica will attempt to restore the last cloned window on start up. + + + Settings... + + + Displays the settings panel. + + + Switch to window + + + Switches to the source window and hides OnTopReplica. + + + Select window + + + - none - + + + Displays a list of window you can select as thumbnail source. + + + - whole - + + + Current region: + + + Delete + + + Done + + + Height + + + Reset + + + Save + + + Stored regions + + + Regions: + + + Width + + + Right-click here to start... + + + Clone current window + + + These system-wide shortcuts can also be used when OnTopReplica is not in focus. + + + Show/Hide + + + Hot keys: + + + Language: + + + Requires a restart. + + + Settings + + Cancel update -OnTopReplica will prompt you the next time it is started. - - +OnTopReplica will prompt you the next time it is started. + + Download -Install OnTopReplica {0}. - - - The new version can be downloaded and installed from the official website. - - +Install OnTopReplica {0}. + + + The new version can be downloaded and installed from the official website. + + Installed version: {0} -Available version: {1} - - - Version {0} available - - - {0}/{1} bytes downloaded. +Available version: {1} + + + Version {0} available + + + {0}/{1} bytes downloaded. {0} downloaded bytes {1} total bytes {0} bytes geladen von {1} bytes gesamt {0} downloaded bytes {1} total bytes {0} downloaded bytes {1} total bytes -{0} downloaded bytes {1} total bytes - - - Downloading... - - +{0} downloaded bytes {1} total bytes + + + Downloading... + + The latest version of OnTopReplica is already installed. The program automatically checks for updates at every start. -You can keep up to date about OnTopReplica's development, suggest improvements and new features by <a href="website">visiting the official website</a>. - The website link should be enclosed in <a href="website"></a> tags. - - - Latest stable version released on {0}. - {0} last version release date - - - OnTopReplica is up to date - - +You can keep up to date about OnTopReplica's development, suggest improvements and new features by <a href="website">visiting the official website</a>. + The website link should be enclosed in <a href="website"></a> tags. + + + Latest stable version released on {0}. + {0} last version release date + + + OnTopReplica is up to date + + Install -OnTopReplica will be closed and the update installed. - - - OnTopReplica version {0} is ready to be installed on your computer. - - - Update ready - - - OnTopReplica updates - +OnTopReplica will be closed and the update installed. + + + OnTopReplica version {0} is ready to be installed on your computer. + + + Update ready + + + OnTopReplica updates + \ No newline at end of file diff --git a/OnTopReplica/Strings.pt.Designer.cs b/src/OnTopReplica/Strings.pt.Designer.cs similarity index 100% rename from OnTopReplica/Strings.pt.Designer.cs rename to src/OnTopReplica/Strings.pt.Designer.cs diff --git a/OnTopReplica/Strings.pt.resx b/src/OnTopReplica/Strings.pt.resx similarity index 97% rename from OnTopReplica/Strings.pt.resx rename to src/OnTopReplica/Strings.pt.resx index 018dc88..eaf51d3 100644 --- a/OnTopReplica/Strings.pt.resx +++ b/src/OnTopReplica/Strings.pt.resx @@ -1,655 +1,655 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 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 - - - Created by: %. - Link % is replaced by string AboutAuthorContent. - - - - Must not be localized. Leave blank in non-default languages. - - - Abort update process. - - - Show details about OnTopReplica. - - - Reset all OnTopReplica settings. - - - Update OnTopReplica now. - - - Care to contribute to the project? You are welcome to improve available translations, start a new one for your native language or to check out the % from CodePlex. - - - source code - - - OnTopReplica is based upon the WindowsFormsAero library and some other libraries and code sources. %. - Link % is replaced by string AboutCreditsSourcesContent. - - - Read the full credits - - - Contribute - - - Credits - - - License - - - Updates - - - The application is licensed under the % license, which meets the terms of the "open-source" definition specified by OSI. - - - Microsoft Reciprocal (MS-RL) - Can be left blank. - - - A lightweight, real-time, always on top thumbnail of a window of your choice. - - - About OnTopReplica - - - Translators: {0} - {0} translators (do not end with period) - - - - Must not be localized. Leave blank in non-default languages. - - - Check now! - - - OnTopReplica automatically checks for updates at every start up. - - - Version {0} - - - - Probably doesn't need localization. :) - - - Reset window completely? - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Created by: %. + Link % is replaced by string AboutAuthorContent. + + + + Must not be localized. Leave blank in non-default languages. + + + Abort update process. + + + Show details about OnTopReplica. + + + Reset all OnTopReplica settings. + + + Update OnTopReplica now. + + + Care to contribute to the project? You are welcome to improve available translations, start a new one for your native language or to check out the % from CodePlex. + + + source code + + + OnTopReplica is based upon the WindowsFormsAero library and some other libraries and code sources. %. + Link % is replaced by string AboutCreditsSourcesContent. + + + Read the full credits + + + Contribute + + + Credits + + + License + + + Updates + + + The application is licensed under the % license, which meets the terms of the "open-source" definition specified by OSI. + + + Microsoft Reciprocal (MS-RL) + Can be left blank. + + + A lightweight, real-time, always on top thumbnail of a window of your choice. + + + About OnTopReplica + + + Translators: {0} + {0} translators (do not end with period) + + + + Must not be localized. Leave blank in non-default languages. + + + Check now! + + + OnTopReplica automatically checks for updates at every start up. + + + Version {0} + + + + Probably doesn't need localization. :) + + + Reset window completely? + + &Reset -All settings will be lost. - - - Can be used to reset all settings if you lost control over the window or moved it beyond the screen boundary. - - - Reset - - - Reset settings? - - - This will erase all settings of OnTopReplica, returning it to the original state right after installation (all saved information, like stored regions, will be lost). - - - Reset settings - - - &Cancel - & marks the ALT+[] shortcut - - - Draw regions using mouse. - - - Details - - - Details on Windows Aero - - - Windows Aero is only available on Windows Vista Home Premium or higher. - - - 'Desktop Composition' is not enabled. - - +All settings will be lost. + + + Can be used to reset all settings if you lost control over the window or moved it beyond the screen boundary. + + + Reset + + + Reset settings? + + + This will erase all settings of OnTopReplica, returning it to the original state right after installation (all saved information, like stored regions, will be lost). + + + Reset settings + + + &Cancel + & marks the ALT+[] shortcut + + + Draw regions using mouse. + + + Details + + + Details on Windows Aero + + + Windows Aero is only available on Windows Vista Home Premium or higher. + + + 'Desktop Composition' is not enabled. + + You must enable desktop composition, by selecting 'Windows Aero' as the theme used by Windows. -To do so, right-click on the desktop and click on Personalize. - - - Error details - - - Error: - - - It appears that the selected window has been closed or is not valid anymore. - - - Error - - +To do so, right-click on the desktop and click on Personalize. + + + Error details + + + Error: + + + It appears that the selected window has been closed or is not valid anymore. + + + Error + + Desktop Composition' is not supported on your Operating System. -You must run this application on Windows Vista Home Premium or better. - - - Desktop Composition unsupported - - - No thumbnail loaded. - - - Unable to create thumbnail - - - Unable to fit window. - - - Unable to check for updates. - - - It appears that OnTopReplica wasn't installed using 'ClickOnce'. You'll have to update manually (visit <a href="http://ontopreplica.codeplex.com">OnTopReplica's homepage</a>). - - - OnTopReplica was unable to check whether an updated version is available. Make sure you are connected to the Internet. If you are, the website may be temporarily down. - - - Mode - - - Always on top - - - Forces OnTopReplica to stay always on top. - - - Click through - - - OnTopReplica will behave like a transparent overlay that lets your clicks through to the windows below. - - - Standard - - - Behaves like an ordinary window. You can bring other windows above OnTopReplica. - - - OnTopReplica fullscreen - - - Disable - - - Enable Group mode - - - Select multiple windows to enable. - - - Group switch mode is enabled. - - - Group switch mode: - - - Windows - Column Header of list, simply refers to available windows to be cloned - - - Homepage: www.codeplex.com/ontopreplica. - - - Do you want to enable "click forwarding"? - - +You must run this application on Windows Vista Home Premium or better. + + + Desktop Composition unsupported + + + No thumbnail loaded. + + + Unable to create thumbnail + + + Unable to fit window. + + + Unable to check for updates. + + + It appears that OnTopReplica wasn't installed using 'ClickOnce'. You'll have to update manually (visit <a href="http://ontopreplica.codeplex.com">OnTopReplica's homepage</a>). + + + OnTopReplica was unable to check whether an updated version is available. Make sure you are connected to the Internet. If you are, the website may be temporarily down. + + + Mode + + + Always on top + + + Forces OnTopReplica to stay always on top. + + + Click through + + + OnTopReplica will behave like a transparent overlay that lets your clicks through to the windows below. + + + Standard + + + Behaves like an ordinary window. You can bring other windows above OnTopReplica. + + + OnTopReplica fullscreen + + + Disable + + + Enable Group mode + + + Select multiple windows to enable. + + + Group switch mode is enabled. + + + Group switch mode: + + + Windows + Column Header of list, simply refers to available windows to be cloned + + + Homepage: www.codeplex.com/ontopreplica. + + + Do you want to enable "click forwarding"? + + If this mode is enabled, OnTopReplica will forward all left mouse clicks to the window that is being cloned (this will allow you to do basic mouse operations on the cloned window without having to activate it). -To exit this mode, push ESC. - - - Click forwarding - - - Enable Click-Through mode? - - - Click-through only works if it has been enabled in the Resize submenu and if the window is semi-transparent. - - +To exit this mode, push ESC. + + + Click forwarding + + + Enable Click-Through mode? + + + Click-through only works if it has been enabled in the Resize submenu and if the window is semi-transparent. + + In this mode the fullscreen window will behave as a partially transparent overlay, allowing you to click on the other windows behind it. -To return to normal mode anytime, activate OnTopReplica by clicking on the task bar (or the tray icon). - - +To return to normal mode anytime, activate OnTopReplica by clicking on the task bar (or the tray icon). + + No, thank you. -You can enable click-through later - - - Use Click-Through - - - Click-Through mode - - - OnTopReplica has been updated. - - - In order to use the updated version of OnTopReplica you'll have to restart the application. - - - Update successful - - - OnTopReplica is up to date. - - - No update available - - - Language - - - About... - - - Hides the main window and displays the "about" box. - - - Advanced - - - Show window border - - - Toggles the display of the window border. - - - Enable Click forwarding - - - Enable "click forwarding" to the cloned window. - - - Enable Click-Through - - - OnTopReplica will behave like a transparent overlay that lets your clicks through to the windows below. - - - Close - - - Closes OnTopReplica. - - - 2:1 Double - - - Fullscreen - - - 1:2 Half - - - 1:1 Fit to window - - - 1:4 Quarter - - - Group Switch mode - - - OnTopReplica will automatically clone a window from an user defined group, switching to the one least recently activated to the foreground. - - - 100% (opaque) - - - Sets OnTopReplica to be completely opaque. - - - 25% - - - Sets OnTopReplica to 25% opacity. - - - 50% - - - Sets OnTopReplica to 50% opacity. - - - 75% - - - Sets OnTopReplica to 75% opacity. - - - Opacity - - - Open - - - Displays OnTopReplica. - - - Bottom Left - - - Bottom Right - - - Center - - - Disabled - - - Position lock - - - Automatically position OnTopReplica on the current screen. - - - Top Left - - - Top Right - - - Quit fullscreen mode - - - Recall last position and size - - - Toggles whether OnTopReplica should store its last position and size and use them when it is restarted. - - - Minimize - - - Minimizes OnTopReplica to the task bar (or the tray). - - - Select region... - - - Switches to "region mode", that allows you to select a limited region of the source's window as thumbnail. - - - Reset window - - - Resets OnTopReplica settings and its main window. - - - Resize - - - Restore last cloned window - - - When enabled, OnTopReplica will attempt to restore the last cloned window on start up. - - - Settings... - - - Displays the settings panel. - - - Switch to window - - - Switches to the source window and hides OnTopReplica. - - - Select window - - - - none - - - - Displays a list of window you can select as thumbnail source. - - - - whole - - - - Current region: - - - Delete - - - Done - - - Height - - - Reset - - - Save - - - Stored regions - - - Regions: - - - Width - - - Right-click here to start... - - - Clone current window - - - These system-wide shortcuts can also be used when OnTopReplica is not in focus. - - - Show/Hide - - - Hot keys: - - - Language: - - - Requires a restart. - - - Settings - - +You can enable click-through later + + + Use Click-Through + + + Click-Through mode + + + OnTopReplica has been updated. + + + In order to use the updated version of OnTopReplica you'll have to restart the application. + + + Update successful + + + OnTopReplica is up to date. + + + No update available + + + Language + + + About... + + + Hides the main window and displays the "about" box. + + + Advanced + + + Show window border + + + Toggles the display of the window border. + + + Enable Click forwarding + + + Enable "click forwarding" to the cloned window. + + + Enable Click-Through + + + OnTopReplica will behave like a transparent overlay that lets your clicks through to the windows below. + + + Close + + + Closes OnTopReplica. + + + 2:1 Double + + + Fullscreen + + + 1:2 Half + + + 1:1 Fit to window + + + 1:4 Quarter + + + Group Switch mode + + + OnTopReplica will automatically clone a window from an user defined group, switching to the one least recently activated to the foreground. + + + 100% (opaque) + + + Sets OnTopReplica to be completely opaque. + + + 25% + + + Sets OnTopReplica to 25% opacity. + + + 50% + + + Sets OnTopReplica to 50% opacity. + + + 75% + + + Sets OnTopReplica to 75% opacity. + + + Opacity + + + Open + + + Displays OnTopReplica. + + + Bottom Left + + + Bottom Right + + + Center + + + Disabled + + + Position lock + + + Automatically position OnTopReplica on the current screen. + + + Top Left + + + Top Right + + + Quit fullscreen mode + + + Recall last position and size + + + Toggles whether OnTopReplica should store its last position and size and use them when it is restarted. + + + Minimize + + + Minimizes OnTopReplica to the task bar (or the tray). + + + Select region... + + + Switches to "region mode", that allows you to select a limited region of the source's window as thumbnail. + + + Reset window + + + Resets OnTopReplica settings and its main window. + + + Resize + + + Restore last cloned window + + + When enabled, OnTopReplica will attempt to restore the last cloned window on start up. + + + Settings... + + + Displays the settings panel. + + + Switch to window + + + Switches to the source window and hides OnTopReplica. + + + Select window + + + - none - + + + Displays a list of window you can select as thumbnail source. + + + - whole - + + + Current region: + + + Delete + + + Done + + + Height + + + Reset + + + Save + + + Stored regions + + + Regions: + + + Width + + + Right-click here to start... + + + Clone current window + + + These system-wide shortcuts can also be used when OnTopReplica is not in focus. + + + Show/Hide + + + Hot keys: + + + Language: + + + Requires a restart. + + + Settings + + Cancel update -OnTopReplica will prompt you the next time it is started. - - +OnTopReplica will prompt you the next time it is started. + + Download -Install OnTopReplica {0}. - - - The new version can be downloaded and installed from the official website. - - +Install OnTopReplica {0}. + + + The new version can be downloaded and installed from the official website. + + Installed version: {0} -Available version: {1} - - - Version {0} available - - - {0}/{1} bytes downloaded. +Available version: {1} + + + Version {0} available + + + {0}/{1} bytes downloaded. {0} downloaded bytes {1} total bytes {0} bytes geladen von {1} bytes gesamt {0} downloaded bytes {1} total bytes {0} downloaded bytes {1} total bytes -{0} downloaded bytes {1} total bytes - - - Downloading... - - +{0} downloaded bytes {1} total bytes + + + Downloading... + + The latest version of OnTopReplica is already installed. The program automatically checks for updates at every start. -You can keep up to date about OnTopReplica's development, suggest improvements and new features by <a href="website">visiting the official website</a>. - The website link should be enclosed in <a href="website"></a> tags. - - - Latest stable version released on {0}. - {0} last version release date - - - OnTopReplica is up to date - - +You can keep up to date about OnTopReplica's development, suggest improvements and new features by <a href="website">visiting the official website</a>. + The website link should be enclosed in <a href="website"></a> tags. + + + Latest stable version released on {0}. + {0} last version release date + + + OnTopReplica is up to date + + Install -OnTopReplica will be closed and the update installed. - - - OnTopReplica version {0} is ready to be installed on your computer. - - - Update ready - - - OnTopReplica updates - +OnTopReplica will be closed and the update installed. + + + OnTopReplica version {0} is ready to be installed on your computer. + + + Update ready + + + OnTopReplica updates + \ No newline at end of file diff --git a/OnTopReplica/Strings.resx b/src/OnTopReplica/Strings.resx similarity index 97% rename from OnTopReplica/Strings.resx rename to src/OnTopReplica/Strings.resx index d778409..129d71a 100644 --- a/OnTopReplica/Strings.resx +++ b/src/OnTopReplica/Strings.resx @@ -1,673 +1,673 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 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 - - - Created by: %. - Link % is replaced by string AboutAuthorContent. - - - Lorenz Cuno Klopfenstein - Must not be localized. Leave blank in non-default languages. - - - Abort update process. - - - Show details about OnTopReplica. - - - Reset all OnTopReplica settings. - - - Update OnTopReplica now. - - - Care to contribute to the project? You are welcome to improve available translations, start a new one for your native language or to check out the % from CodePlex. - - - source code - - - OnTopReplica is based upon the WindowsFormsAero library and some other libraries and code sources. %. - Link % is replaced by string AboutCreditsSourcesContent. - - - Read the full credits - - - Contribute - - - Credits - - - License - - - Updates - - - The application is licensed under the % license, which meets the terms of the "open-source" definition specified by OSI. - - - Microsoft Reciprocal (MS-RL) - Can be left blank. - - - A lightweight, real-time, always on top thumbnail of a window of your choice. - - - About OnTopReplica - - - Translators: {0} - {0} translators (do not end with period) - - - Christian Olaechea M., Daniel Zeus.EX, Federico Lorenzo, Goran Brecelj, Jan Romanczyk, Marco Kraxner, Patrik (batupata), Raúl Morillo, René Mihula, Roberto Leiro, Rodrigo Lourenço, Thomas Amundsen, Eric Hoffmann. - Must not be localized. Leave blank in non-default languages. - - - Check now! - - - OnTopReplica automatically checks for updates at every start up. - - - Version {0} - - - OnTopReplica - Probably doesn't need localization. :) - - - Reset window completely? - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Created by: %. + Link % is replaced by string AboutAuthorContent. + + + Lorenz Cuno Klopfenstein + Must not be localized. Leave blank in non-default languages. + + + Abort update process. + + + Show details about OnTopReplica. + + + Reset all OnTopReplica settings. + + + Update OnTopReplica now. + + + Care to contribute to the project? You are welcome to improve available translations, start a new one for your native language or to check out the % from CodePlex. + + + source code + + + OnTopReplica is based upon the WindowsFormsAero library and some other libraries and code sources. %. + Link % is replaced by string AboutCreditsSourcesContent. + + + Read the full credits + + + Contribute + + + Credits + + + License + + + Updates + + + The application is licensed under the % license, which meets the terms of the "open-source" definition specified by OSI. + + + Microsoft Reciprocal (MS-RL) + Can be left blank. + + + A lightweight, real-time, always on top thumbnail of a window of your choice. + + + About OnTopReplica + + + Translators: {0} + {0} translators (do not end with period) + + + Christian Olaechea M., Daniel Zeus.EX, Federico Lorenzo, Goran Brecelj, Jan Romanczyk, Marco Kraxner, Patrik (batupata), Raúl Morillo, René Mihula, Roberto Leiro, Rodrigo Lourenço, Thomas Amundsen, Eric Hoffmann. + Must not be localized. Leave blank in non-default languages. + + + Check now! + + + OnTopReplica automatically checks for updates at every start up. + + + Version {0} + + + OnTopReplica + Probably doesn't need localization. :) + + + Reset window completely? + + &Reset -All settings will be lost. - - - Can be used to reset all settings if you lost control over the window or moved it beyond the screen boundary. - - - Reset - - - Reset settings? - - - This will erase all settings of OnTopReplica, returning it to the original state right after installation (all saved information, like stored regions, will be lost). - - - Reset settings - - - &Cancel - & marks the ALT+[] shortcut - - - Draw regions using mouse. - - - Details - - - Details on Windows Aero - - - Windows Aero is only available on Windows Vista Home Premium or higher. - - - 'Desktop Composition' is not enabled. - - +All settings will be lost. + + + Can be used to reset all settings if you lost control over the window or moved it beyond the screen boundary. + + + Reset + + + Reset settings? + + + This will erase all settings of OnTopReplica, returning it to the original state right after installation (all saved information, like stored regions, will be lost). + + + Reset settings + + + &Cancel + & marks the ALT+[] shortcut + + + Draw regions using mouse. + + + Details + + + Details on Windows Aero + + + Windows Aero is only available on Windows Vista Home Premium or higher. + + + 'Desktop Composition' is not enabled. + + You must enable desktop composition, by selecting 'Windows Aero' as the theme used by Windows. -To do so, right-click on the desktop and click on Personalize. - - - Error details - - - Error: - - - It appears that the selected window has been closed or is not valid anymore. - - - Error - - +To do so, right-click on the desktop and click on Personalize. + + + Error details + + + Error: + + + It appears that the selected window has been closed or is not valid anymore. + + + Error + + Desktop Composition' is not supported on your Operating System. -You must run this application on Windows Vista Home Premium or better. - - - Desktop Composition unsupported - - - No thumbnail loaded. - - - Unable to create thumbnail - - - Unable to fit window. - - - Unable to check for updates. - - - It appears that OnTopReplica wasn't installed using 'ClickOnce'. You'll have to update manually (visit <a href="http://ontopreplica.codeplex.com">OnTopReplica's homepage</a>). - - - OnTopReplica was unable to check whether an updated version is available. Make sure you are connected to the Internet. If you are, the website may be temporarily down. - - - Mode - - - Always on top - - - Forces OnTopReplica to stay always on top. - - - Click through - - - OnTopReplica will behave like a transparent overlay that lets your clicks through to the windows below. - - - Standard - - - Behaves like an ordinary window. You can bring other windows above OnTopReplica. - - - OnTopReplica fullscreen - - - Disable - - - Enable Group mode - - - Select multiple windows to enable. - - - Group switch mode is enabled. - - - Group switch mode: - - - Windows - Column Header of list, simply refers to available windows to be cloned - - - Homepage: www.codeplex.com/ontopreplica. - - - Do you want to enable "click forwarding"? - - +You must run this application on Windows Vista Home Premium or better. + + + Desktop Composition unsupported + + + No thumbnail loaded. + + + Unable to create thumbnail + + + Unable to fit window. + + + Unable to check for updates. + + + It appears that OnTopReplica wasn't installed using 'ClickOnce'. You'll have to update manually (visit <a href="http://ontopreplica.codeplex.com">OnTopReplica's homepage</a>). + + + OnTopReplica was unable to check whether an updated version is available. Make sure you are connected to the Internet. If you are, the website may be temporarily down. + + + Mode + + + Always on top + + + Forces OnTopReplica to stay always on top. + + + Click through + + + OnTopReplica will behave like a transparent overlay that lets your clicks through to the windows below. + + + Standard + + + Behaves like an ordinary window. You can bring other windows above OnTopReplica. + + + OnTopReplica fullscreen + + + Disable + + + Enable Group mode + + + Select multiple windows to enable. + + + Group switch mode is enabled. + + + Group switch mode: + + + Windows + Column Header of list, simply refers to available windows to be cloned + + + Homepage: www.codeplex.com/ontopreplica. + + + Do you want to enable "click forwarding"? + + If this mode is enabled, OnTopReplica will forward all left mouse clicks to the window that is being cloned (this will allow you to do basic mouse operations on the cloned window without having to activate it). -To exit this mode, push ESC. - - - Click forwarding - - - Enable Click-Through mode? - - - Click-through only works if it has been enabled in the Resize submenu and if the window is semi-transparent. - - +To exit this mode, push ESC. + + + Click forwarding + + + Enable Click-Through mode? + + + Click-through only works if it has been enabled in the Resize submenu and if the window is semi-transparent. + + In this mode the fullscreen window will behave as a partially transparent overlay, allowing you to click on the other windows behind it. -To return to normal mode anytime, activate OnTopReplica by clicking on the task bar (or the tray icon). - - +To return to normal mode anytime, activate OnTopReplica by clicking on the task bar (or the tray icon). + + No, thank you. -You can enable click-through later - - - Use Click-Through - - - Click-Through mode - - - OnTopReplica has been updated. - - - In order to use the updated version of OnTopReplica you'll have to restart the application. - - - Update successful - - - OnTopReplica is up to date. - - - No update available - - - Language - - - About... - - - Hides the main window and displays the "about" box. - - - Advanced - - - Show window border - - - Toggles the display of the window border. - - - Enable Click forwarding - - - Enable "click forwarding" to the cloned window. - - - Enable Click-Through - - - OnTopReplica will behave like a transparent overlay that lets your clicks through to the windows below. - - - Close - - - Closes OnTopReplica. - - - 2:1 Double - - - Fullscreen - - - 1:2 Half - - - 1:1 Fit to window - - - 1:4 Quarter - - - Group Switch mode - - - OnTopReplica will automatically clone a window from an user defined group, switching to the one least recently activated to the foreground. - - - 100% (opaque) - - - Sets OnTopReplica to be completely opaque. - - - 25% - - - Sets OnTopReplica to 25% opacity. - - - 50% - - - Sets OnTopReplica to 50% opacity. - - - 75% - - - Sets OnTopReplica to 75% opacity. - - - Opacity - - - Open - - - Displays OnTopReplica. - - - Bottom Left - - - Bottom Right - - - Center - - - Disabled - - - Position lock - - - Automatically position OnTopReplica on the current screen. - - - Top Left - - - Top Right - - - Quit fullscreen mode - - - Recall last position and size - - - Toggles whether OnTopReplica should store its last position and size and use them when it is restarted. - - - Minimize - - - Minimizes OnTopReplica to the task bar (or the tray). - - - Select region... - - - Switches to "region mode", that allows you to select a limited region of the source's window as thumbnail. - - - Reset window - - - Resets OnTopReplica settings and its main window. - - - Resize - - - Restore last cloned window - - - When enabled, OnTopReplica will attempt to restore the last cloned window on start up. - - - Settings... - - - Displays the settings panel. - - - Switch to window - - - Switches to the source window and hides OnTopReplica. - - - Select window - - - - none - - - - Displays a list of window you can select as thumbnail source. - - - - whole - - - - Current region: - - - Delete - - - Done - - - Height - - - Reset - - - Save - - - Stored regions - - - Regions: - - - Width - - - Right-click here to start... - - - Clone current window - - - These system-wide shortcuts can also be used when OnTopReplica is not in focus. - - - Show/Hide - - - Hot keys: - - - Language: - - - Requires a restart. - - - Settings - - +You can enable click-through later + + + Use Click-Through + + + Click-Through mode + + + OnTopReplica has been updated. + + + In order to use the updated version of OnTopReplica you'll have to restart the application. + + + Update successful + + + OnTopReplica is up to date. + + + No update available + + + Language + + + About... + + + Hides the main window and displays the "about" box. + + + Advanced + + + Show window border + + + Toggles the display of the window border. + + + Enable Click forwarding + + + Enable "click forwarding" to the cloned window. + + + Enable Click-Through + + + OnTopReplica will behave like a transparent overlay that lets your clicks through to the windows below. + + + Close + + + Closes OnTopReplica. + + + 2:1 Double + + + Fullscreen + + + 1:2 Half + + + 1:1 Fit to window + + + 1:4 Quarter + + + Group Switch mode + + + OnTopReplica will automatically clone a window from an user defined group, switching to the one least recently activated to the foreground. + + + 100% (opaque) + + + Sets OnTopReplica to be completely opaque. + + + 25% + + + Sets OnTopReplica to 25% opacity. + + + 50% + + + Sets OnTopReplica to 50% opacity. + + + 75% + + + Sets OnTopReplica to 75% opacity. + + + Opacity + + + Open + + + Displays OnTopReplica. + + + Bottom Left + + + Bottom Right + + + Center + + + Disabled + + + Position lock + + + Automatically position OnTopReplica on the current screen. + + + Top Left + + + Top Right + + + Quit fullscreen mode + + + Recall last position and size + + + Toggles whether OnTopReplica should store its last position and size and use them when it is restarted. + + + Minimize + + + Minimizes OnTopReplica to the task bar (or the tray). + + + Select region... + + + Switches to "region mode", that allows you to select a limited region of the source's window as thumbnail. + + + Reset window + + + Resets OnTopReplica settings and its main window. + + + Resize + + + Restore last cloned window + + + When enabled, OnTopReplica will attempt to restore the last cloned window on start up. + + + Settings... + + + Displays the settings panel. + + + Switch to window + + + Switches to the source window and hides OnTopReplica. + + + Select window + + + - none - + + + Displays a list of window you can select as thumbnail source. + + + - whole - + + + Current region: + + + Delete + + + Done + + + Height + + + Reset + + + Save + + + Stored regions + + + Regions: + + + Width + + + Right-click here to start... + + + Clone current window + + + These system-wide shortcuts can also be used when OnTopReplica is not in focus. + + + Show/Hide + + + Hot keys: + + + Language: + + + Requires a restart. + + + Settings + + Cancel update -OnTopReplica will prompt you the next time it is started. - - +OnTopReplica will prompt you the next time it is started. + + Download -Install OnTopReplica {0}. - - - The new version can be downloaded and installed from the official website. - - +Install OnTopReplica {0}. + + + The new version can be downloaded and installed from the official website. + + Installed version: {0} -Available version: {1} - - - Version {0} available - - - {0}/{1} bytes downloaded. +Available version: {1} + + + Version {0} available + + + {0}/{1} bytes downloaded. {0} downloaded bytes {1} total bytes {0} bytes geladen von {1} bytes gesamt {0} downloaded bytes {1} total bytes {0} downloaded bytes {1} total bytes -{0} downloaded bytes {1} total bytes - - - Downloading... - - +{0} downloaded bytes {1} total bytes + + + Downloading... + + The latest version of OnTopReplica is already installed. The program automatically checks for updates at every start. -You can keep up to date about OnTopReplica's development, suggest improvements and new features by <a href="website">visiting the official website</a>. - The website link should be enclosed in <a href="website"></a> tags. - - - Latest stable version released on {0}. - {0} last version release date - - - OnTopReplica is up to date - - +You can keep up to date about OnTopReplica's development, suggest improvements and new features by <a href="website">visiting the official website</a>. + The website link should be enclosed in <a href="website"></a> tags. + + + Latest stable version released on {0}. + {0} last version release date + + + OnTopReplica is up to date + + Install -OnTopReplica will be closed and the update installed. - - - OnTopReplica version {0} is ready to be installed on your computer. - - - Update ready - - - OnTopReplica updates - - - Bottom - - - Left - - - Right - - - Top - - - X - - - Y - +OnTopReplica will be closed and the update installed. + + + OnTopReplica version {0} is ready to be installed on your computer. + + + Update ready + + + OnTopReplica updates + + + Bottom + + + Left + + + Right + + + Top + + + X + + + Y + \ No newline at end of file diff --git a/OnTopReplica/Strings.ru.Designer.cs b/src/OnTopReplica/Strings.ru.Designer.cs similarity index 100% rename from OnTopReplica/Strings.ru.Designer.cs rename to src/OnTopReplica/Strings.ru.Designer.cs diff --git a/OnTopReplica/Strings.ru.resx b/src/OnTopReplica/Strings.ru.resx similarity index 98% rename from OnTopReplica/Strings.ru.resx rename to src/OnTopReplica/Strings.ru.resx index bb3d36d..ad2bec1 100644 --- a/OnTopReplica/Strings.ru.resx +++ b/src/OnTopReplica/Strings.ru.resx @@ -1,647 +1,647 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 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 - - - Автор: %. - Link % is replaced by string AboutAuthorContent. - - - - Must not be localized. Leave blank in non-default languages. - - - Остановить обновление - - - О программе - - - Установить настройки по умолчанию - - - Обновить программу - - - Хотите поддержать проект? Примите участие в улучшении готовых переводов, создайте свой на вашем родном языке или помогите улучшить % на «CodePlex». - - - источниках кода - - - Программа основана на библиотеке «WindowsFormsAero» и некоторых других библиотеках и источниках кода. %. - Link % is replaced by string AboutCreditsSourcesContent. - - - Прочитайте полные сведения об источниках - - - Принять участие в разработке - - - Сведения об источниках - - - Соглашение - - - Обновление - - - Программа выпущена в соответствии с лицензией %, которая подходит под определение программы с открытым исходом кодом в представлении OSI. - - - - Can be left blank. - - - Просмотр части выбранного вами окна — просто и легко, в реальном времени, всегда поверх остальных окон. - - - О программе - - - Переводчики: {0} - {0} translators (do not end with period) - - - - Must not be localized. Leave blank in non-default languages. - - - Обновить сейчас - - - Программа автоматически проверяет наличие обновлений при запуске - - - Версия {0} - - - - Probably doesn't need localization. :) - - - Сбросить окно? - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Автор: %. + Link % is replaced by string AboutAuthorContent. + + + + Must not be localized. Leave blank in non-default languages. + + + Остановить обновление + + + О программе + + + Установить настройки по умолчанию + + + Обновить программу + + + Хотите поддержать проект? Примите участие в улучшении готовых переводов, создайте свой на вашем родном языке или помогите улучшить % на «CodePlex». + + + источниках кода + + + Программа основана на библиотеке «WindowsFormsAero» и некоторых других библиотеках и источниках кода. %. + Link % is replaced by string AboutCreditsSourcesContent. + + + Прочитайте полные сведения об источниках + + + Принять участие в разработке + + + Сведения об источниках + + + Соглашение + + + Обновление + + + Программа выпущена в соответствии с лицензией %, которая подходит под определение программы с открытым исходом кодом в представлении OSI. + + + + Can be left blank. + + + Просмотр части выбранного вами окна — просто и легко, в реальном времени, всегда поверх остальных окон. + + + О программе + + + Переводчики: {0} + {0} translators (do not end with period) + + + + Must not be localized. Leave blank in non-default languages. + + + Обновить сейчас + + + Программа автоматически проверяет наличие обновлений при запуске + + + Версия {0} + + + + Probably doesn't need localization. :) + + + Сбросить окно? + + &Сброс -Все настройки будут удалены. - - - Можно использовать для сброса всех настроек, если Вы утратили контроль над окном либо поместили его за пределы экрана. - - - Сброс - - - Сбросить настройки? - - - по умолчанию (вся сохраненная после установки информация вроде сохраненных областей будет утрачена). - - - Сбросить настройки - - - &Отмена - & marks the ALT+[] shortcut - - - Выберите области мышью - - - Подробности - - - Подробности о «Windows Aero» - - - Функция «Windows Aero» доступна только на системах «Windows», начиная с «Vista Home Premium», кроме версий «Starter» и «Home Basic» (по умолчанию). - - - Композиция слоев рабочего стола недоступна. - - - Для включения правой кнопкой мыши по рабочему столу и выберите «Персонализацию». - - - Описание ошибки - - - Ошибка: - - - Вероятно, выбранное окно было закрыто или больше не отвечает. - - - Ошибка - - - Для запуска программы требуется «Windows Vista Home Premium» или другие версии «Windows» с поддержкой «Aero». - - - Композиция слоев рабочего стола не поддерживается. - - - Окно просмотра не загружено. - - - Невозможно создать окно просмотра. - - - Невозможно уместить в окне. - - - Невозможно проверить обновления. - - - Вероятно, программа была установлена с использованием функции «ClickOnce». Вам необходимо обновить ее самостоятельно. (Посетите <a href="http://ontopreplica.codeplex.com"> домашнюю страницу программы</a>). - - - Программе не удалось проверить доступность новой версии. Удостоверьтесь, что подключение к Интернету присутствует. Если присутствует, сайт может временно не работать. - - - Режим - - - Всегда поверх других окон - - - Всегда удерживать программу поверх других окон. - - - Пропускать щелчки мышью - - - Программа будет работать, как прозрачный слой, позволяющий щелкать мышью по нижележащим окнам. - - - Обычный - - - Программа будет работать, как обычное окно. Вы сможете помещать другие окна поверх окна программы. - - - Полноэкранный режим - - - Отключить - - - Включить групповой режим - - - Для включения выберите несколько окон. - - - Групповой режим включен. - - - Групповой режим: - - - Окна - Column Header of list, simply refers to available windows to be cloned - - - Домашняя страница: www.codeplex.com/ontopreplica. - - - Хотите включить передачу щелчков мышью главному окну? - - - Нажать Esc для выхода из этого режима. - There appears to be a missing part. - - - Передача щелчков мышью главному окну. - This appears to be wrong. - - - Включить режим сквозных щелчков мышью? - - - Режим сквозных щелчков мышью работает, только когда он включен в подменю «Изменить размер» и окно полупрозрачно. - - - Для возвращения в обычный режим в любое время, разверните программу щелчком по ней в панели задач (или лотке). - - +Все настройки будут удалены. + + + Можно использовать для сброса всех настроек, если Вы утратили контроль над окном либо поместили его за пределы экрана. + + + Сброс + + + Сбросить настройки? + + + по умолчанию (вся сохраненная после установки информация вроде сохраненных областей будет утрачена). + + + Сбросить настройки + + + &Отмена + & marks the ALT+[] shortcut + + + Выберите области мышью + + + Подробности + + + Подробности о «Windows Aero» + + + Функция «Windows Aero» доступна только на системах «Windows», начиная с «Vista Home Premium», кроме версий «Starter» и «Home Basic» (по умолчанию). + + + Композиция слоев рабочего стола недоступна. + + + Для включения правой кнопкой мыши по рабочему столу и выберите «Персонализацию». + + + Описание ошибки + + + Ошибка: + + + Вероятно, выбранное окно было закрыто или больше не отвечает. + + + Ошибка + + + Для запуска программы требуется «Windows Vista Home Premium» или другие версии «Windows» с поддержкой «Aero». + + + Композиция слоев рабочего стола не поддерживается. + + + Окно просмотра не загружено. + + + Невозможно создать окно просмотра. + + + Невозможно уместить в окне. + + + Невозможно проверить обновления. + + + Вероятно, программа была установлена с использованием функции «ClickOnce». Вам необходимо обновить ее самостоятельно. (Посетите <a href="http://ontopreplica.codeplex.com"> домашнюю страницу программы</a>). + + + Программе не удалось проверить доступность новой версии. Удостоверьтесь, что подключение к Интернету присутствует. Если присутствует, сайт может временно не работать. + + + Режим + + + Всегда поверх других окон + + + Всегда удерживать программу поверх других окон. + + + Пропускать щелчки мышью + + + Программа будет работать, как прозрачный слой, позволяющий щелкать мышью по нижележащим окнам. + + + Обычный + + + Программа будет работать, как обычное окно. Вы сможете помещать другие окна поверх окна программы. + + + Полноэкранный режим + + + Отключить + + + Включить групповой режим + + + Для включения выберите несколько окон. + + + Групповой режим включен. + + + Групповой режим: + + + Окна + Column Header of list, simply refers to available windows to be cloned + + + Домашняя страница: www.codeplex.com/ontopreplica. + + + Хотите включить передачу щелчков мышью главному окну? + + + Нажать Esc для выхода из этого режима. + There appears to be a missing part. + + + Передача щелчков мышью главному окну. + This appears to be wrong. + + + Включить режим сквозных щелчков мышью? + + + Режим сквозных щелчков мышью работает, только когда он включен в подменю «Изменить размер» и окно полупрозрачно. + + + Для возвращения в обычный режим в любое время, разверните программу щелчком по ней в панели задач (или лотке). + + Нет, спасибо -Вы можете включить сквозные щелчки мышью в другой раз. - - - Использовать сквозные щелчки мышью - - - Режим сквозных щелчков мышью - - - Программа обновлена. - - - Для использования обновленной версии программы ее необходимо перезапустить. - - - Обновление успешно - - - Используется последняя версия программы. - - - Обновлений нет - - - Язык - - - О программе... - - - Сворачивает главное окно и показывает окно «О программе». - - - Дополнительно - - - Показывать границу окна - - - Изменяет видимость границы окна. - - - Включить передачу щелчков мышью главному окну - - - Включить передачу щелчков мышью скопированному окну. - - - Включить сквозные щелчки мышью - - - Программа будет работать, как прозрачный слой, позволяющий щелкать мышью по нижележащим окнам. - - - Закрыть - - - Закрыть программу. - - - 2:1 Двойной - - - Полноэкранный режим - - - 1:2 Половина - - - 1:1 По размерам окна - - - 1:4 Четверть - - - Групповой режим - - - Программа автоматически скопирует окно из группы, определенной пользователем, переключаясь на то, которое побывало на переднем плане первым из всех. - Fixed - - - 100% (непрозрачный) - - - Делает программу полностью непрозрачной. - - - 25% - - - Делает программу прозрачной на 25%. - - - 50% - - - Делает программу прозрачной на 50%. - - - 75% - - - Делает программу прозрачной на 75%. - - - Прозрачность - - - Открыть - - - Показывает программу. - - - Снизу слева - - - Снизу справа - - - В центре - - - Отключено - - - Закрепить положение - - - Автоматически разместить программу на текущем экране. - - - Сверху слева - - - Сверху справа - - - Выйти из полноэкранного режима - - - Использовать последнее положение и размер - - - Сохранение программой своего последнего положения и размера с их использованием при запуске. - - - Свернуть - - - Сворачивает программу в панель задач (или лоток). - - - Выбрать область... - - - Переключается в «режим области», позволяющий выбирать для показа ограниченную область исходного окна. - - - Сбросить окно - - - Сбрасывает настройки программы и ее главное окно. - - - Изменить размер - - - Восстанавливать последнее копированное окно - - - Если включено, программа попытается при запуске восстановить окно, скопированное последним. - - - Настройки... - - - Показывает панель настроек. - - - Переключиться на окно - - - Переключается на исходное окно и скрывает программу. - - - Выбрать окно - - - - пусто - - - - Показывает список окон, которые можно выбрать в качестве источников для копирования. - - - - полностью - - - - Выбранная область: - - - Удалить - - - Готово - - - Высота - - - Сбросить - - - Сохранить - - - Сохраненные области - - - Области: - - - Ширина - - - Для начала щелкните тут правой кнопкой мыши... - - - Скопировать текущее окно - - - Эти глобальные сочетания клавиш можно использовать также когда программа на заднем плане. - - - Показать/Скрыть - - - Сочетания клавиш: - - - Язык: - - - Требуется перезапуск. - - - Настройки - - +Вы можете включить сквозные щелчки мышью в другой раз. + + + Использовать сквозные щелчки мышью + + + Режим сквозных щелчков мышью + + + Программа обновлена. + + + Для использования обновленной версии программы ее необходимо перезапустить. + + + Обновление успешно + + + Используется последняя версия программы. + + + Обновлений нет + + + Язык + + + О программе... + + + Сворачивает главное окно и показывает окно «О программе». + + + Дополнительно + + + Показывать границу окна + + + Изменяет видимость границы окна. + + + Включить передачу щелчков мышью главному окну + + + Включить передачу щелчков мышью скопированному окну. + + + Включить сквозные щелчки мышью + + + Программа будет работать, как прозрачный слой, позволяющий щелкать мышью по нижележащим окнам. + + + Закрыть + + + Закрыть программу. + + + 2:1 Двойной + + + Полноэкранный режим + + + 1:2 Половина + + + 1:1 По размерам окна + + + 1:4 Четверть + + + Групповой режим + + + Программа автоматически скопирует окно из группы, определенной пользователем, переключаясь на то, которое побывало на переднем плане первым из всех. + Fixed + + + 100% (непрозрачный) + + + Делает программу полностью непрозрачной. + + + 25% + + + Делает программу прозрачной на 25%. + + + 50% + + + Делает программу прозрачной на 50%. + + + 75% + + + Делает программу прозрачной на 75%. + + + Прозрачность + + + Открыть + + + Показывает программу. + + + Снизу слева + + + Снизу справа + + + В центре + + + Отключено + + + Закрепить положение + + + Автоматически разместить программу на текущем экране. + + + Сверху слева + + + Сверху справа + + + Выйти из полноэкранного режима + + + Использовать последнее положение и размер + + + Сохранение программой своего последнего положения и размера с их использованием при запуске. + + + Свернуть + + + Сворачивает программу в панель задач (или лоток). + + + Выбрать область... + + + Переключается в «режим области», позволяющий выбирать для показа ограниченную область исходного окна. + + + Сбросить окно + + + Сбрасывает настройки программы и ее главное окно. + + + Изменить размер + + + Восстанавливать последнее копированное окно + + + Если включено, программа попытается при запуске восстановить окно, скопированное последним. + + + Настройки... + + + Показывает панель настроек. + + + Переключиться на окно + + + Переключается на исходное окно и скрывает программу. + + + Выбрать окно + + + - пусто - + + + Показывает список окон, которые можно выбрать в качестве источников для копирования. + + + - полностью - + + + Выбранная область: + + + Удалить + + + Готово + + + Высота + + + Сбросить + + + Сохранить + + + Сохраненные области + + + Области: + + + Ширина + + + Для начала щелкните тут правой кнопкой мыши... + + + Скопировать текущее окно + + + Эти глобальные сочетания клавиш можно использовать также когда программа на заднем плане. + + + Показать/Скрыть + + + Сочетания клавиш: + + + Язык: + + + Требуется перезапуск. + + + Настройки + + Отменить обновление -Программа уведомит Вас об обновлении при следующем запуске. - - +Программа уведомит Вас об обновлении при следующем запуске. + + Скачать -Установить программу «OnTopReplica» {0}. - - - Новую версию можно скачать и установить с официального сайта. - - +Установить программу «OnTopReplica» {0}. + + + Новую версию можно скачать и установить с официального сайта. + + Установленная версия: {0}. -Доступная версия: {0}. - - - Доступна версия {0} - - - Скачано {0} из {1} - {0} downloaded bytes {1} total bytes - - - Загрузка... - - +Доступная версия: {0}. + + + Доступна версия {0} + + + Скачано {0} из {1} + {0} downloaded bytes {1} total bytes + + + Загрузка... + + Установлена последняя версия программы «OnTopReplica». Программа автоматически проверяет обновления при каждом запуске. -Вы можете следить за обновлениями программы, предлагать улучшения и новые функции на <a href="website">сайте программы </a>. - The website link should be enclosed in <a href="website"></a> tags. - - - Последняя стабильная версия выпущена {0}. - {0} last version release date - - - Вы пользуетесь последней версией программы - - +Вы можете следить за обновлениями программы, предлагать улучшения и новые функции на <a href="website">сайте программы </a>. + The website link should be enclosed in <a href="website"></a> tags. + + + Последняя стабильная версия выпущена {0}. + {0} last version release date + + + Вы пользуетесь последней версией программы + + Установить -Программа будет закрыта для установки обновления. - - - «OnTopReplica» (версия {0}) готова к установке на вашем компьютере. - - - Обновление готово - - - Программа обновляется - +Программа будет закрыта для установки обновления. + + + «OnTopReplica» (версия {0}) готова к установке на вашем компьютере. + + + Обновление готово + + + Программа обновляется + \ No newline at end of file diff --git a/OnTopReplica/Strings.tr.resx b/src/OnTopReplica/Strings.tr.resx similarity index 97% rename from OnTopReplica/Strings.tr.resx rename to src/OnTopReplica/Strings.tr.resx index aad4cfb..986e5b9 100644 --- a/OnTopReplica/Strings.tr.resx +++ b/src/OnTopReplica/Strings.tr.resx @@ -1,652 +1,652 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 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 - - - Yazar Hakkında: %. - Link % is replaced by string AboutAuthorContent. - - - - Must not be localized. Leave blank in non-default languages. - - - Güncellemeyi iptal et. - - - OnTopRelica hakkında ayrıntıları görüntüle. - - - Bütün OnTopRelica ayarlarını sıfırla. - - - OnTopRelica'yı güncelle. - - - Programa katkıda bulunmak ister misiniz? Mevcut çevirileri geliştirmenizi memnuniyetle karşılarız, programı kendi dilinize çevirin veya %'e CodePlex'ten bir göz atın. - - - kaynak kod - - - OnTopReplica'nın temelinde WindowsFormsAero kütüphanesi ve bazı diğer kütüphaneler ile kaynak kodları vardır. %. - Link % is replaced by string AboutCreditsSourcesContent. - - - Tüm Yapımcıları Gör - - - Katkı - - - Yapımcılar - - - Lisans - - - Güncellemeler - - - Bu uygulama OSI tarafından belirtilmiş "açık-kaynak" tanımının koşullarını yerine getiren % lisansı tarafından lisanslanmıştır. - - - - Can be left blank. - - - Seçtiğiniz pencerenin hafif, gerçek zamanlı ve her zaman en üstteki küçük resmi. - - - OnTopReplica hakkında - - - Çevirmenler: {0} - {0} translators (do not end with period) - - - - Must not be localized. Leave blank in non-default languages. - - - Kontrol Et! - - - OnTopReplica her başlangıçta güncellemeleri otomatik olarak kontrol eder. - - - Versiyon {0} - - - OnTopReplica - Probably doesn't need localization. :) - - - Pencereyi tamamen yeniden ayarla? - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Yazar Hakkında: %. + Link % is replaced by string AboutAuthorContent. + + + + Must not be localized. Leave blank in non-default languages. + + + Güncellemeyi iptal et. + + + OnTopRelica hakkında ayrıntıları görüntüle. + + + Bütün OnTopRelica ayarlarını sıfırla. + + + OnTopRelica'yı güncelle. + + + Programa katkıda bulunmak ister misiniz? Mevcut çevirileri geliştirmenizi memnuniyetle karşılarız, programı kendi dilinize çevirin veya %'e CodePlex'ten bir göz atın. + + + kaynak kod + + + OnTopReplica'nın temelinde WindowsFormsAero kütüphanesi ve bazı diğer kütüphaneler ile kaynak kodları vardır. %. + Link % is replaced by string AboutCreditsSourcesContent. + + + Tüm Yapımcıları Gör + + + Katkı + + + Yapımcılar + + + Lisans + + + Güncellemeler + + + Bu uygulama OSI tarafından belirtilmiş "açık-kaynak" tanımının koşullarını yerine getiren % lisansı tarafından lisanslanmıştır. + + + + Can be left blank. + + + Seçtiğiniz pencerenin hafif, gerçek zamanlı ve her zaman en üstteki küçük resmi. + + + OnTopReplica hakkında + + + Çevirmenler: {0} + {0} translators (do not end with period) + + + + Must not be localized. Leave blank in non-default languages. + + + Kontrol Et! + + + OnTopReplica her başlangıçta güncellemeleri otomatik olarak kontrol eder. + + + Versiyon {0} + + + OnTopReplica + Probably doesn't need localization. :) + + + Pencereyi tamamen yeniden ayarla? + + &Reset -Bütün ayarlar kaybolacak. - - - Eğer pencere üzerindeki denetimizi kaybettiyseniz veya pencere ekran sınırları dışına çıktı ise kullanılabilir. - - - Sıfırla - - - Ayarları sıfırla? - - - Bu OnTopReplica'nın bütün ayarlarını silip, yüklemeden hemen sonraki haline geri döndürecektir (bütün kaydedilen bilgi, saklı bölgeler kaybolacaktır). - - - Ayarları sıfırla - - - &Vazgeç - & marks the ALT+[] shortcut - - - Farenizi kullarak bölgeler çizin. - - - Ayrıntılar - - - Windows Aero'da ki ayrıntılar - - - Windows Aero sadece Windows Vista Home Premium veya daha yüksek sürümlerde bulunmaktadır. - - - Masaüstü bileşimi aktif değil. - - +Bütün ayarlar kaybolacak. + + + Eğer pencere üzerindeki denetimizi kaybettiyseniz veya pencere ekran sınırları dışına çıktı ise kullanılabilir. + + + Sıfırla + + + Ayarları sıfırla? + + + Bu OnTopReplica'nın bütün ayarlarını silip, yüklemeden hemen sonraki haline geri döndürecektir (bütün kaydedilen bilgi, saklı bölgeler kaybolacaktır). + + + Ayarları sıfırla + + + &Vazgeç + & marks the ALT+[] shortcut + + + Farenizi kullarak bölgeler çizin. + + + Ayrıntılar + + + Windows Aero'da ki ayrıntılar + + + Windows Aero sadece Windows Vista Home Premium veya daha yüksek sürümlerde bulunmaktadır. + + + Masaüstü bileşimi aktif değil. + + Windows tarafından kullanılan 'Windows Aero'yu tema olarak seçerek masaüstü bileşimini aktif etmelisiniz. -Bunu yapmak için, masaüstüne sağ tıklayın ve Kişiselleştir'e tıklayın. - - - Hata detayları - - - Hata: - - - Seçtiğiniz pencere kapatılmış veya artık geçerli değil gibi görünüyor. - - - Hata - - +Bunu yapmak için, masaüstüne sağ tıklayın ve Kişiselleştir'e tıklayın. + + + Hata detayları + + + Hata: + + + Seçtiğiniz pencere kapatılmış veya artık geçerli değil gibi görünüyor. + + + Hata + + Masaüstü bileşimi İşletim Sisteminiz tarafından desteklenmiyor. -Bu programı Windows Vista Home Premium veya daha iyisinde çalıştırmalısınız. - - - Masaüstü Bileşimi Desteklenmiyor - - - Hiçbir küçükresim yüklenmedi. - - - Küçükresim yaratılamıyor - - - Pencereye oturtulamıyor. - - - Güncellemeler kontrol edilemiyor. - - - OnTopReplica 'ClickOnce' kullanılara yüklenmemiş gözüküyor. Elle güncellemeniz gerek (<a href="http://ontopreplica.codeplex.com">OnTopReplica's homepage</a>'i ziyaret edin). - - - OnTopReplica güncellenmiş bir versiyonun mevcut olup olmadığını denetleyemiyor. İnternete bağlı olduğunuzdan emin olun. Eğer bağlı iseniz websitesi geçici olarak servis dışı olabilir. - - - Mod - - - Her zaman üstte - - - OnTopReplica'nın her zaman en üstte kalması için zorlar. - - - Tıkla - - - OnTopReplica arkadaki pencerelere direkt tıklamanıza izin veren transparan bir kaplama gibi davranır. - - - Standart - - - Normal bir pencere gibi davranır. Diğer pencereleri OnTopReplica'nın üstüne getirebilirsiniz. - - - OnTopReplica tam ekran - - - Etkisizleştir - - - Grup modu etkinleştir - - - Etkinleştirilecek çoklu pencereleri seçiniz. - - - Grup değiştirme modu etkin. - - - Grup değiştirme modu: - - - Pencereler - Column Header of list, simply refers to available windows to be cloned - - - Anasayfa: www.codeplex.com/ontopreplica. - - - "tıkla yönlendir"'i etkinleştirmek ister misiniz? - Should be capitalized? - - +Bu programı Windows Vista Home Premium veya daha iyisinde çalıştırmalısınız. + + + Masaüstü Bileşimi Desteklenmiyor + + + Hiçbir küçükresim yüklenmedi. + + + Küçükresim yaratılamıyor + + + Pencereye oturtulamıyor. + + + Güncellemeler kontrol edilemiyor. + + + OnTopReplica 'ClickOnce' kullanılara yüklenmemiş gözüküyor. Elle güncellemeniz gerek (<a href="http://ontopreplica.codeplex.com">OnTopReplica's homepage</a>'i ziyaret edin). + + + OnTopReplica güncellenmiş bir versiyonun mevcut olup olmadığını denetleyemiyor. İnternete bağlı olduğunuzdan emin olun. Eğer bağlı iseniz websitesi geçici olarak servis dışı olabilir. + + + Mod + + + Her zaman üstte + + + OnTopReplica'nın her zaman en üstte kalması için zorlar. + + + Tıkla + + + OnTopReplica arkadaki pencerelere direkt tıklamanıza izin veren transparan bir kaplama gibi davranır. + + + Standart + + + Normal bir pencere gibi davranır. Diğer pencereleri OnTopReplica'nın üstüne getirebilirsiniz. + + + OnTopReplica tam ekran + + + Etkisizleştir + + + Grup modu etkinleştir + + + Etkinleştirilecek çoklu pencereleri seçiniz. + + + Grup değiştirme modu etkin. + + + Grup değiştirme modu: + + + Pencereler + Column Header of list, simply refers to available windows to be cloned + + + Anasayfa: www.codeplex.com/ontopreplica. + + + "tıkla yönlendir"'i etkinleştirmek ister misiniz? + Should be capitalized? + + Eğer bu mod etkinleştirilmiş ise, OnTopReplica bütün sol fare tıklamalarını klonlanmış pencereye iletecektir(bu size klonlanmış pencere üzerinde onu aktifleştirmeden temel fare işlemlerinizi yapabilmenize izin verir). -Bu moddan çıkmak için, ESC'ye basınız. - - - Tıkla yönlendir - - - Direkt-Tıkla modunu etkinleştir? - - - Direk-tıkla sadece Yeniden boyutlandır altmenüsünde etkinleştirildiyse ve pencere yarı-transparan ise çalışır. - - +Bu moddan çıkmak için, ESC'ye basınız. + + + Tıkla yönlendir + + + Direkt-Tıkla modunu etkinleştir? + + + Direk-tıkla sadece Yeniden boyutlandır altmenüsünde etkinleştirildiyse ve pencere yarı-transparan ise çalışır. + + Bu modda tamekran pencere kısmen transparan kaplama gibi davranır, arkasındaki pencerelere tıklamanıza izin verir. -Herhangi bir zamanda normal moda dönmek için, OnTopReplica görev çubuğuna (veya sistem simgesine) tıklayarak aktifleştirin. - - +Herhangi bir zamanda normal moda dönmek için, OnTopReplica görev çubuğuna (veya sistem simgesine) tıklayarak aktifleştirin. + + Hayır, teşekkür ederim -direkt-tıklayı daha sonra etkinleştirebilirsiniz. - Second sentence capitalized? - - - Direkt-Tıkla kullan - - - Direkt-Tıkla modu - - - OnTopReplica güncellendi. - - - OnTopReplica'nın güncellenmiş versiyonunu kullanmak için uygulamayı yeniden başlatmalısınız. - - - Güncelleme başarılı - - - OnTopReplica güncel. - - - Güncelleme mevcut değil - - - Dil - - - Hakkında... - - - Ana pencereyi gizler ve "hakkında" kutusunu gösterir. - - - Gelişmiş - - - Pencere kenarlığı göster - - - Pencere kenarlığı gösterimini değiştirir. - - - Tıkla yönlendir'i etkinleştir - - - Klonlanmış pencerede "tıkla yönlendir"'i etkinleştir. - - - Direkt-Tıkla'yı etkinleştir - - - OnTopReplica arkadaki pencerelere direkt tıklamanıza izin veren transparan bir kaplama gibi davranır. - - - Kapat - - - OnTopReplica'yı kapatır. - - - 2:1 Çift - - - Tamekran - - - 1:2 Yarım - - - 1:1 pencereye sığdır - - - 1:4 Çeyrek - - - Grup Değiştirme modu - - - OnTopReplica kullanıcı tanımlı gruptan bir pencereyi kopyalayıp, arkaplanda en son aktifleştirilen biri ile değiştirecektir. - - - 100% (opak) - - - OnTopReplica'yı tamamen opak olarak ayarlar. - - - 25% - - - OnTopReplica'yı 25% opaklığına ayarlar. - - - 50% - - - OnTopReplica'yı 50% opaklığına ayarlar. - - - 75% - - - OnTopReplica'yı 75% opaklığına ayarlar. - - - Opaklık - - - - - - OnTopReplica'yı görüntüler. - - - Sol Alt - - - Sağ Alt - - - Merkez - - - Devredışı - - - Konum kilidi - - - OnTopReplica'yı otomatik olarak şu anki ekrana konumlandırır. - - - Sol Üst - - - Sağ Üst - - - Tamekran modundan çık - - - Son pozisyona dön ve boyutlandır - - - OnTopReplica'nın son konumunu kaydedip kaydetmeyeceğini değiştirir ve boyutlandırıp bunu yeniden başladığında kullanır. - - - Küçült - - - OnTopReplica'yı görev çubuğuna (veya sistem kısayollarına) küçültür. - - - Bölge seçiniz... - - - "bölge modu"na geçer, bu size kaynak penceresinin küçük resminin kısıtlı bir bölgesini seçmenize izin verir. - - - Pencereyi sıfırla - - - OnTopReplica'nın ayarlarını ve ana penceresini sıfırlar. - - - Yeniden boyutlandır - - - Son klonlanan pencereyi geri yükle - - - Etkinleştirildiği zaman, OnTopReplica son klonlanan pencereyi başlangıçta yeniden yüklemeye çalışır. - - - Ayarlar... - - - Ayarlar panelini görüntüler. - - - Pencereye geç - - - Kaynak pencereye geçer ve OnTopReplica'yı gizler. - - - Pencere seç - - - - yok - - - - Küçük resim kaynağı halinde seçebileceğiniz pencere listesini görüntüler. - - - - tamamen - - - - Şu anki bölge: - - - Sil - - - Tamamlandı - - - Yükseklik - - - Sıfırla - - - Kaydet - - - Kayıtlı bölgeler - - - Bölgeler: - - - Genişlik - - - Başlamak için buraya sağ tıklayın... - - - Şu anki pencereyi klonla - - - Bu sistem genelinde kısayollar ayrıca OnTopReplica üstte olmadığı zaman kullanılabilir. - - - Göster/Gizle - - - Kısayollar: - - - Dil: - - - Yeniden başlatma gerektirir. - - - Ayarlar - - +direkt-tıklayı daha sonra etkinleştirebilirsiniz. + Second sentence capitalized? + + + Direkt-Tıkla kullan + + + Direkt-Tıkla modu + + + OnTopReplica güncellendi. + + + OnTopReplica'nın güncellenmiş versiyonunu kullanmak için uygulamayı yeniden başlatmalısınız. + + + Güncelleme başarılı + + + OnTopReplica güncel. + + + Güncelleme mevcut değil + + + Dil + + + Hakkında... + + + Ana pencereyi gizler ve "hakkında" kutusunu gösterir. + + + Gelişmiş + + + Pencere kenarlığı göster + + + Pencere kenarlığı gösterimini değiştirir. + + + Tıkla yönlendir'i etkinleştir + + + Klonlanmış pencerede "tıkla yönlendir"'i etkinleştir. + + + Direkt-Tıkla'yı etkinleştir + + + OnTopReplica arkadaki pencerelere direkt tıklamanıza izin veren transparan bir kaplama gibi davranır. + + + Kapat + + + OnTopReplica'yı kapatır. + + + 2:1 Çift + + + Tamekran + + + 1:2 Yarım + + + 1:1 pencereye sığdır + + + 1:4 Çeyrek + + + Grup Değiştirme modu + + + OnTopReplica kullanıcı tanımlı gruptan bir pencereyi kopyalayıp, arkaplanda en son aktifleştirilen biri ile değiştirecektir. + + + 100% (opak) + + + OnTopReplica'yı tamamen opak olarak ayarlar. + + + 25% + + + OnTopReplica'yı 25% opaklığına ayarlar. + + + 50% + + + OnTopReplica'yı 50% opaklığına ayarlar. + + + 75% + + + OnTopReplica'yı 75% opaklığına ayarlar. + + + Opaklık + + + + + + OnTopReplica'yı görüntüler. + + + Sol Alt + + + Sağ Alt + + + Merkez + + + Devredışı + + + Konum kilidi + + + OnTopReplica'yı otomatik olarak şu anki ekrana konumlandırır. + + + Sol Üst + + + Sağ Üst + + + Tamekran modundan çık + + + Son pozisyona dön ve boyutlandır + + + OnTopReplica'nın son konumunu kaydedip kaydetmeyeceğini değiştirir ve boyutlandırıp bunu yeniden başladığında kullanır. + + + Küçült + + + OnTopReplica'yı görev çubuğuna (veya sistem kısayollarına) küçültür. + + + Bölge seçiniz... + + + "bölge modu"na geçer, bu size kaynak penceresinin küçük resminin kısıtlı bir bölgesini seçmenize izin verir. + + + Pencereyi sıfırla + + + OnTopReplica'nın ayarlarını ve ana penceresini sıfırlar. + + + Yeniden boyutlandır + + + Son klonlanan pencereyi geri yükle + + + Etkinleştirildiği zaman, OnTopReplica son klonlanan pencereyi başlangıçta yeniden yüklemeye çalışır. + + + Ayarlar... + + + Ayarlar panelini görüntüler. + + + Pencereye geç + + + Kaynak pencereye geçer ve OnTopReplica'yı gizler. + + + Pencere seç + + + - yok - + + + Küçük resim kaynağı halinde seçebileceğiniz pencere listesini görüntüler. + + + - tamamen - + + + Şu anki bölge: + + + Sil + + + Tamamlandı + + + Yükseklik + + + Sıfırla + + + Kaydet + + + Kayıtlı bölgeler + + + Bölgeler: + + + Genişlik + + + Başlamak için buraya sağ tıklayın... + + + Şu anki pencereyi klonla + + + Bu sistem genelinde kısayollar ayrıca OnTopReplica üstte olmadığı zaman kullanılabilir. + + + Göster/Gizle + + + Kısayollar: + + + Dil: + + + Yeniden başlatma gerektirir. + + + Ayarlar + + Güncellemeden vazgeç -OnTopReplica sizi yeniden başlatıldığında uyaracaktır. - - +OnTopReplica sizi yeniden başlatıldığında uyaracaktır. + + İndir -OnTopReplica {0} Yükle. - - - Yeni versiyon resmi siteden indirilebilir ve yüklenebilir. - - +OnTopReplica {0} Yükle. + + + Yeni versiyon resmi siteden indirilebilir ve yüklenebilir. + + Yüklü versiyon: {0}. -Kullanılabilir versiyon: {1}. - - - Versiyon {0} mevcut - - - {0}/{1} byte indirildi. - - - İndiriliyor... - - +Kullanılabilir versiyon: {1}. + + + Versiyon {0} mevcut + + + {0}/{1} byte indirildi. + + + İndiriliyor... + + OnTopReplica'nın en son sürümü zaten yüklenmiş. Program her başlangıçta güncellemeleri otomatik olarak denetler. -OnTopReplica'nın geliştirilmesi, yeni özellik ve geliştirme önerileri hakkında by <a href="website">resmi internet sitesini ziyaret ederek</a> güncel kalabilirsiniz. - The website link should be enclosed in <a href="website"></a> tags. - - - En son kararlı versiyon {0} tarihinde yayınlandı. - {0} last version release date - - - OnTopReplica güncel - - +OnTopReplica'nın geliştirilmesi, yeni özellik ve geliştirme önerileri hakkında by <a href="website">resmi internet sitesini ziyaret ederek</a> güncel kalabilirsiniz. + The website link should be enclosed in <a href="website"></a> tags. + + + En son kararlı versiyon {0} tarihinde yayınlandı. + {0} last version release date + + + OnTopReplica güncel + + Yükle -OnTopReplica kapatılınca güncelleme yüklenmiş olacaktır. - - - OnTopReplica versiyon {0} bilgisayarınızda yüklenmeye hazır. - - - Güncelleme hazır - - - OnTopReplica güncellemeleri - +OnTopReplica kapatılınca güncelleme yüklenmiş olacaktır. + + + OnTopReplica versiyon {0} bilgisayarınızda yüklenmeye hazır. + + + Güncelleme hazır + + + OnTopReplica güncellemeleri + \ No newline at end of file diff --git a/OnTopReplica/Strings.zh-Hans.resx b/src/OnTopReplica/Strings.zh-Hans.resx similarity index 97% rename from OnTopReplica/Strings.zh-Hans.resx rename to src/OnTopReplica/Strings.zh-Hans.resx index b68ff04..fe0a86c 100644 --- a/OnTopReplica/Strings.zh-Hans.resx +++ b/src/OnTopReplica/Strings.zh-Hans.resx @@ -1,655 +1,655 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 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 - - - 作者 % - Link % is replaced by string AboutAuthorContent. - - - - Must not be localized. Leave blank in non-default languages. - - - 终止更新过程 - - - 展开关于OnTopReplica的详细内容 - - - 重置OnTopReplica的所有设定 - - - 现在更新OnTopReplica - - - 想为本项目出一份力吗?欢迎你参与到翻译工作中来,抑或检视从CodePlex处取得的 % - - - 源代码 - - - OnTopReplica基于WindowsFormsAero库和其他库及代码。% - Link % is replaced by string AboutCreditsSourcesContent. - - - 了解全部 - - - 贡献 - - - 制作 - - - 授权 - - - 更新 - - - 应用程序根据%许可获得授权,即指遵循OSI界定的“开源”条款 - - - 微软互惠授权(MS-RL) - Can be left blank. - - - 一个轻量级、实时、窗口缩略图置顶工具 - - - 关于OnTopReplica - - - 译者:{0} - {0} translators (do not end with period) - - - - Must not be localized. Leave blank in non-default languages. - - - 检查更新! - - - OnTopReplica自动在每次开启时检查更新 - - - 版本{0} - - - - Probably doesn't need localization. :) - - - 完全重置窗口吗? - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + 作者 % + Link % is replaced by string AboutAuthorContent. + + + + Must not be localized. Leave blank in non-default languages. + + + 终止更新过程 + + + 展开关于OnTopReplica的详细内容 + + + 重置OnTopReplica的所有设定 + + + 现在更新OnTopReplica + + + 想为本项目出一份力吗?欢迎你参与到翻译工作中来,抑或检视从CodePlex处取得的 % + + + 源代码 + + + OnTopReplica基于WindowsFormsAero库和其他库及代码。% + Link % is replaced by string AboutCreditsSourcesContent. + + + 了解全部 + + + 贡献 + + + 制作 + + + 授权 + + + 更新 + + + 应用程序根据%许可获得授权,即指遵循OSI界定的“开源”条款 + + + 微软互惠授权(MS-RL) + Can be left blank. + + + 一个轻量级、实时、窗口缩略图置顶工具 + + + 关于OnTopReplica + + + 译者:{0} + {0} translators (do not end with period) + + + + Must not be localized. Leave blank in non-default languages. + + + 检查更新! + + + OnTopReplica自动在每次开启时检查更新 + + + 版本{0} + + + + Probably doesn't need localization. :) + + + 完全重置窗口吗? + + &重置 -所有设定均会丢失 - - - 可以在没辙的时候用来重置所有设定 - - - 重置 - - - 重置设定吗? - - - 这将清除所有OnTopReplica的设定,并回到刚安装完的状态(所有保存的信息、保存的选区,均会丢失) - - - 重置设定 - - - &取消 - & marks the ALT+[] shortcut - - - 使用鼠标划出区域 - - - 详细信息 - - - Windows Aero的详细信息 - - - 为什么Windows Aero特效只在Windows Vista Home Premium或更高级版本中出现 - - - 未启用桌面组合 - - +所有设定均会丢失 + + + 可以在没辙的时候用来重置所有设定 + + + 重置 + + + 重置设定吗? + + + 这将清除所有OnTopReplica的设定,并回到刚安装完的状态(所有保存的信息、保存的选区,均会丢失) + + + 重置设定 + + + &取消 + & marks the ALT+[] shortcut + + + 使用鼠标划出区域 + + + 详细信息 + + + Windows Aero的详细信息 + + + 为什么Windows Aero特效只在Windows Vista Home Premium或更高级版本中出现 + + + 未启用桌面组合 + + 程序需要系统的Aero主题配合 -桌面右击,个性化,选择主题 - - - 详细错误 - - - 错误: - - - 选中的窗口似乎已经关闭或已失效 - - - 错误 - - +桌面右击,个性化,选择主题 + + + 详细错误 + + + 错误: + + + 选中的窗口似乎已经关闭或已失效 + + + 错误 + + 您的操作系统不支持桌面组合 -请在Windows Vista Home Premium或更高版本中运行 - - - 不支持桌面组合 - - - 无缩略图可加载 - - - 无法创建缩略图 - - - 无法适应窗口 - - - 无法检查更新 - - - OnTopReplica不是用“ClickOnce”方式安装的。您不得不手动更新了(访问 <a href="http://ontopreplica.codeplex.com">OnTopReplica的主页</a>) - - - OnTopReplica无法检测更新,请确保已连接到互联网。当然,也有可能是网站暂时关闭 - - - 模式 - - - 总是置顶 - - - 强制OnTopReplica置顶 - - - 点击穿过 - - - OnTopReplica会像一个透明的覆盖层并允许您点击其后面的窗口 - - - 标准模式 - - - 变回普通窗口,OnTopReplica会被其他窗口阻挡 - - - OnTopReplica全屏幕 - - - 取消 - - - 激活组模式 - - - 选择多个窗口以启用 - - - 自切换组模式已激活 - - - 自切换组模式: - - - 窗口 - Column Header of list, simply refers to available windows to be cloned - - - 主页:www.codeplex.com/ontopreplica - - - 您想启用“点击转发”吗? - - +请在Windows Vista Home Premium或更高版本中运行 + + + 不支持桌面组合 + + + 无缩略图可加载 + + + 无法创建缩略图 + + + 无法适应窗口 + + + 无法检查更新 + + + OnTopReplica不是用“ClickOnce”方式安装的。您不得不手动更新了(访问 <a href="http://ontopreplica.codeplex.com">OnTopReplica的主页</a>) + + + OnTopReplica无法检测更新,请确保已连接到互联网。当然,也有可能是网站暂时关闭 + + + 模式 + + + 总是置顶 + + + 强制OnTopReplica置顶 + + + 点击穿过 + + + OnTopReplica会像一个透明的覆盖层并允许您点击其后面的窗口 + + + 标准模式 + + + 变回普通窗口,OnTopReplica会被其他窗口阻挡 + + + OnTopReplica全屏幕 + + + 取消 + + + 激活组模式 + + + 选择多个窗口以启用 + + + 自切换组模式已激活 + + + 自切换组模式: + + + 窗口 + Column Header of list, simply refers to available windows to be cloned + + + 主页:www.codeplex.com/ontopreplica + + + 您想启用“点击转发”吗? + + 如果启用此模式,OnTopReplica会将所有鼠标点击转发到被克隆的窗口上(这将允许您绕过窗口激活直接对被克隆的窗口做一些基本的鼠标操作) -想退出此模式,按ESC - - - 点击转发 - - - 启用点击穿过模式吗? - - - 点击穿过功能仅在缩放启用或窗口半透明的状态下方能工作 - - +想退出此模式,按ESC + + + 点击转发 + + + 启用点击穿过模式吗? + + + 点击穿过功能仅在缩放启用或窗口半透明的状态下方能工作 + + In this mode the fullscreen window will behave as a partially transparent overlay, allowing you to click on the other windows behind it. -To return to normal mode anytime, activate OnTopReplica by clicking on the task bar (or the tray icon). - - +To return to normal mode anytime, activate OnTopReplica by clicking on the task bar (or the tray icon). + + 不了,谢谢 -等下再启用点击穿过 - - - 使用点击穿过 - - - 点击穿过模式 - - - OnTopReplica已更新 - - - 为能使用新版OnTopReplica,您必须重新启动本程序 - - - 更新成功 - - - OnTopReplica是最新的 - - - 没有可用的更新 - - - 语言 - - - 关于... - - - 隐藏著窗口,并显示“关于”对话框 - - - 高级 - - - 显示窗口边框 - - - 切换显示窗口边框 - - - 启用点击转发 - - - 对被克隆的窗口启用“点击转发” - - - 启用点击穿过 - - - OnTopReplica会像一个透明的覆盖层并允许您点击其后面的窗口 - - - 退出 - - - 关闭OnTopReplica - - - 200% - - - 全屏 - - - 50% - - - 100% - - - 25% - - - 自切换组模式 - - - OnTopReplica会自动定位到自切换组中最不活跃的那个程序,并克隆其窗口 - - - 100% - - - 把OnTopReplica设为完全不透明状态 - - - 25% - - - 把OnTopReplica的不透明度设为25% - - - 50% - - - 把OnTopReplica的不透明度设为50% - - - 75% - - - 把OnTopReplica的不透明度设为75% - - - 不透明度 - - - 打开 - - - 显示OnTopReplica - - - 左下 - - - 右下 - - - 中央 - - - 取消 - - - 锁定位置 - - - 自动在当前屏幕定位OnTopReplica - - - 左上 - - - 右上 - - - 退出全屏模式 - - - 记忆窗口大小和位置 - - - 选择是否记忆窗口大小和位置,并在下次运行时恢复 - - - 最小化 - - - 最小化到任务栏上 - - - 选择区域... - - - 截取部分窗口内容 - - - 重置窗口 - - - 重置OnTopReplica的设定及其主窗口 - - - 缩放 - - - 恢复上次克隆的窗口 - - - 激活此项,程序开启时将尝试恢复最后克隆的窗口 - - - 设置... - - - 显示设置面板 - - - 切换到窗口 - - - 切换到源窗口并隐藏OnTopReplica - - - 选取窗口 - - - - 无 - - - - 显示窗口列表以选择缩略图来源 - - - - 全部 - - - - 当前选区: - - - 删除 - - - 完成 - - - 高度 - - - 重来 - - - 保存 - - - 保存选区 - - - 选区: - - - 宽度 - - - 点击右键以开始... - - - 克隆当前窗口 - - - 全局快捷键,前后台运行均会响应 - - - 显示/隐藏 - - - 快捷键: - - - 语言: - - - 需要重启本程序 - - - 设置 - - +等下再启用点击穿过 + + + 使用点击穿过 + + + 点击穿过模式 + + + OnTopReplica已更新 + + + 为能使用新版OnTopReplica,您必须重新启动本程序 + + + 更新成功 + + + OnTopReplica是最新的 + + + 没有可用的更新 + + + 语言 + + + 关于... + + + 隐藏著窗口,并显示“关于”对话框 + + + 高级 + + + 显示窗口边框 + + + 切换显示窗口边框 + + + 启用点击转发 + + + 对被克隆的窗口启用“点击转发” + + + 启用点击穿过 + + + OnTopReplica会像一个透明的覆盖层并允许您点击其后面的窗口 + + + 退出 + + + 关闭OnTopReplica + + + 200% + + + 全屏 + + + 50% + + + 100% + + + 25% + + + 自切换组模式 + + + OnTopReplica会自动定位到自切换组中最不活跃的那个程序,并克隆其窗口 + + + 100% + + + 把OnTopReplica设为完全不透明状态 + + + 25% + + + 把OnTopReplica的不透明度设为25% + + + 50% + + + 把OnTopReplica的不透明度设为50% + + + 75% + + + 把OnTopReplica的不透明度设为75% + + + 不透明度 + + + 打开 + + + 显示OnTopReplica + + + 左下 + + + 右下 + + + 中央 + + + 取消 + + + 锁定位置 + + + 自动在当前屏幕定位OnTopReplica + + + 左上 + + + 右上 + + + 退出全屏模式 + + + 记忆窗口大小和位置 + + + 选择是否记忆窗口大小和位置,并在下次运行时恢复 + + + 最小化 + + + 最小化到任务栏上 + + + 选择区域... + + + 截取部分窗口内容 + + + 重置窗口 + + + 重置OnTopReplica的设定及其主窗口 + + + 缩放 + + + 恢复上次克隆的窗口 + + + 激活此项,程序开启时将尝试恢复最后克隆的窗口 + + + 设置... + + + 显示设置面板 + + + 切换到窗口 + + + 切换到源窗口并隐藏OnTopReplica + + + 选取窗口 + + + - 无 - + + + 显示窗口列表以选择缩略图来源 + + + - 全部 - + + + 当前选区: + + + 删除 + + + 完成 + + + 高度 + + + 重来 + + + 保存 + + + 保存选区 + + + 选区: + + + 宽度 + + + 点击右键以开始... + + + 克隆当前窗口 + + + 全局快捷键,前后台运行均会响应 + + + 显示/隐藏 + + + 快捷键: + + + 语言: + + + 需要重启本程序 + + + 设置 + + 取消更新 -OnTopReplica会在下次开启的时候提示更新 - - +OnTopReplica会在下次开启的时候提示更新 + + 下载 -安装OnTopReplica{0} - - - 可以从官网上下载和安装程序的最新版 - - +安装OnTopReplica{0} + + + 可以从官网上下载和安装程序的最新版 + + 安装的版本:{0} -可用的版本:{1} - - - 版本{0}可用 - - - 下载了{0}/{1}字节 +可用的版本:{1} + + + 版本{0}可用 + + + 下载了{0}/{1}字节 {0} downloaded bytes {1} total bytes {0} bytes geladen von {1} bytes gesamt {0} downloaded bytes {1} total bytes {0} downloaded bytes {1} total bytes -{0} downloaded bytes {1} total bytes - - - 下载中... - - +{0} downloaded bytes {1} total bytes + + + 下载中... + + 已安装最新版的OnTopReplica,程序每次开启都会自动检查更新。 -你可以<a href="website">访问官网</a>来了解OnTopReplica的最新进展并提出自己的建议 - The website link should be enclosed in <a href="website"></a> tags. - - - 最新稳定版于{0}释出 - {0} last version release date - - - OnTopReplica是最新的 - - +你可以<a href="website">访问官网</a>来了解OnTopReplica的最新进展并提出自己的建议 + The website link should be enclosed in <a href="website"></a> tags. + + + 最新稳定版于{0}释出 + {0} last version release date + + + OnTopReplica是最新的 + + 安装 -OnTopReplica将被关闭以安装更新 - - - 版本{0}的OnTopReplica已经准备在你电脑上安装 - - - 准备更新 - - - OnTopReplica更新 - +OnTopReplica将被关闭以安装更新 + + + 版本{0}的OnTopReplica已经准备在你电脑上安装 + + + 准备更新 + + + OnTopReplica更新 + \ No newline at end of file diff --git a/OnTopReplica/Strings.zh-TW.Designer.cs b/src/OnTopReplica/Strings.zh-TW.Designer.cs similarity index 100% rename from OnTopReplica/Strings.zh-TW.Designer.cs rename to src/OnTopReplica/Strings.zh-TW.Designer.cs diff --git a/OnTopReplica/Strings.zh-TW.resx b/src/OnTopReplica/Strings.zh-TW.resx similarity index 100% rename from OnTopReplica/Strings.zh-TW.resx rename to src/OnTopReplica/Strings.zh-TW.resx diff --git a/OnTopReplica/Strings.zh.Designer.cs b/src/OnTopReplica/Strings.zh.Designer.cs similarity index 100% rename from OnTopReplica/Strings.zh.Designer.cs rename to src/OnTopReplica/Strings.zh.Designer.cs diff --git a/OnTopReplica/Strings.zh.resx b/src/OnTopReplica/Strings.zh.resx similarity index 100% rename from OnTopReplica/Strings.zh.resx rename to src/OnTopReplica/Strings.zh.resx diff --git a/OnTopReplica/ThumbnailPanel.cs b/src/OnTopReplica/ThumbnailPanel.cs similarity index 97% rename from OnTopReplica/ThumbnailPanel.cs rename to src/OnTopReplica/ThumbnailPanel.cs index c30d79f..c7ecfcb 100644 --- a/OnTopReplica/ThumbnailPanel.cs +++ b/src/OnTopReplica/ThumbnailPanel.cs @@ -1,498 +1,498 @@ -using System; -using System.Collections.Generic; -using System.Text; -using System.Windows.Forms; -using WindowsFormsAero.Dwm; -using System.Drawing; -using System.Windows.Forms.VisualStyles; -using OnTopReplica.Native; - -namespace OnTopReplica { - - class ThumbnailPanel : Panel { - - //DWM Thumbnail stuff - Thumbnail _thumbnail = null; - - //Labels - WindowsFormsAero.ThemeLabel _labelGlass; - - public ThumbnailPanel() { - InitFormComponents(); - } - - private void InitFormComponents() { - BackColor = Color.Black; - - //Themed Label - _labelGlass = new WindowsFormsAero.ThemeLabel { - Dock = DockStyle.Fill, - ForeColor = SystemColors.ControlText, - Location = Point.Empty, - Size = ClientSize, - Name = "labelGlass", - Text = Strings.RightClick, - TextAlign = HorizontalAlignment.Center, - TextAlignVertical = VerticalAlignment.Center - }; - this.Controls.Add(_labelGlass); - } - - #region Properties and settings - - ThumbnailRegion _currentRegion; - - /// - /// Gets or sets the region that is currently shown on the thumbnail. When set, also enables region constrain. - /// - public ThumbnailRegion SelectedRegion { - get { - return _currentRegion; - } - set { - _currentRegion = value; - _regionEnabled = (value != null); - UpdateThubmnail(); - } - } - - bool _regionEnabled = false; - - /// - /// Gets or sets whether the thumbnail is constrained to a region or not. - /// - public bool ConstrainToRegion { - get { - return _regionEnabled; - } - set { - if (_regionEnabled != value) { - _regionEnabled = value; - UpdateThubmnail(); - } - } - } - - /// - /// Enables mouse regions drawing, simulating one first click on the panel at the current cursor's position. - /// - public void EnableMouseRegionsDrawingWithMouseDown() { - if (DrawMouseRegions) - return; - - var localCursor = this.PointToClient(Cursor.Position); - - DrawMouseRegions = true; - OnMouseDown(new MouseEventArgs(System.Windows.Forms.MouseButtons.Left, 1, localCursor.X, localCursor.Y, 0)); - } - - bool _drawMouseRegions = false; - - /// - /// Gets or sets whether the control is is "region drawing" mode and reports them via events. - /// - public bool DrawMouseRegions { - get { - return _drawMouseRegions; - } - set { - //Set mode and reset region - _drawMouseRegions = value; - _drawingRegion = false; - - //Cursor change - Cursor = (value) ? Cursors.Cross : Cursors.Default; - - //Refresh gui - UpdateThubmnail(); - _labelGlass.Visible = !value; - this.Invalidate(); - } - } - - /// - /// Gets the target opacity of the thumbnail, depending on the control's state. - /// - protected byte ThumbnailOpacity { - get { - return (_drawMouseRegions) ? (byte)130 : (byte)255; - } - } - - /// - /// Gets or sets whether the control should report clicks made on the cloned thumbnail. - /// - public bool ReportThumbnailClicks { - get; - set; - } - - /// - /// Gets the thumbnail's size (in effectively thumbnailed pixels). - /// - /// - /// This size varies if the thumbnail has been cropped to a region. - /// - public Size ThumbnailPixelSize { - get { - if (_thumbnail != null && !_thumbnail.IsInvalid) { - if (_regionEnabled) { - return _currentRegion.ComputeRegionSize(_thumbnail.GetSourceSize()); - } - else { - //Thumbnail is not cropped, return full thumbnail source size - return _thumbnail.GetSourceSize(); - } - } - else { -#if DEBUG - throw new InvalidOperationException(Strings.ErrorNoThumbnail); -#else - return Size.Empty; -#endif - } - } - } - - /// - /// Gets the thumbnailed window's original size. - /// - /// - /// This size is not influenced by the region cropping applied to the thumbnail. - /// - public Size ThumbnailOriginalSize { - get { - if (_thumbnail != null && !_thumbnail.IsInvalid) { - return _thumbnail.GetSourceSize(); - } - else { -#if DEBUG - throw new InvalidOperationException(Strings.ErrorNoThumbnail); -#else - return Size.Empty; -#endif - } - } - } - - #endregion - - #region GUI event handling - - protected override void OnResize(EventArgs eventargs) { - base.OnResize(eventargs); - UpdateThubmnail(); - } - - protected override void WndProc(ref Message m) { - base.WndProc(ref m); - - //Check whether this is a hit-test on "client" surface - if (m.Msg == WM.NCHITTEST && m.Result.ToInt32() == HT.CLIENT) { - //Check whether clicks must be reported - if(!DrawMouseRegions && !ReportThumbnailClicks){ - m.Result = new IntPtr(HT.TRANSPARENT); - } - } - } - - #endregion - - #region Thumbnail interface - - /// - /// Creates a new thumbnail of a certain window. - /// - /// Handle of the window to clone. - /// Optional region. - public void SetThumbnailHandle(WindowHandle handle, ThumbnailRegion region) { - Log.WriteDetails("Setting new thumbnail", - "HWND {0}, region {1}", handle, region - ); - - if (_thumbnail != null && !_thumbnail.IsInvalid) { - _thumbnail.Close(); - _thumbnail = null; - } - - //Attempt to get top level Form from Control - Form owner = this.TopLevelControl as Form; - if (owner == null) - throw new Exception("Internal error: ThumbnailPanel.TopLevelControl is not a Form."); - - _labelGlass.Visible = false; - - //Register new thumbnail, update regioning directly and refresh thumbnail - _thumbnail = DwmManager.Register(owner, handle.Handle); - _currentRegion = region; - _regionEnabled = (region != null); - UpdateThubmnail(); - } - - /// - /// Disposes current thumbnail and enters stand-by mode. - /// - public void UnsetThumbnail() { - Log.Write("Unsetting thumbnail"); - - if (_thumbnail != null && !_thumbnail.IsInvalid) { - _thumbnail.Close(); - } - - _thumbnail = null; - _labelGlass.Visible = true; - } - - /// - /// Gets whether the control is currently displaying a thumbnail. - /// - public bool IsShowingThumbnail { - get { - return (_thumbnail != null && !_thumbnail.IsInvalid); - } - } - - int _padWidth = 0; - int _padHeight = 0; - Size _thumbnailSize; - - /// - /// Updates the thumbnail options and the right-click label. - /// - private void UpdateThubmnail() { - if (_thumbnail != null && !_thumbnail.IsInvalid){ - try { - //Get thumbnail size and attempt to fit to control, with padding - Size sourceSize = ThumbnailPixelSize; - _thumbnailSize = sourceSize.Fit(Size); - _padWidth = (Size.Width - _thumbnailSize.Width) / 2; - _padHeight = (Size.Height - _thumbnailSize.Height) / 2; - - System.Diagnostics.Debug.WriteLine("Fitting {0} inside {1} as {2}. Padding {3},{4}.", sourceSize, Size, _thumbnailSize, _padWidth, _padHeight); - - var target = new Rectangle(_padWidth, _padHeight, _thumbnailSize.Width, _thumbnailSize.Height); - Rectangle source = (_regionEnabled) ? _currentRegion.ComputeRegionRectangle(_thumbnail.GetSourceSize()) : new Rectangle(Point.Empty, _thumbnail.GetSourceSize()); - - _thumbnail.Update(target, source, ThumbnailOpacity, true, true); - } - catch { - //Any error updating the thumbnail forces to unset (handle may not be valid anymore) - UnsetThumbnail(); - return; - } - } - } - - #endregion - - #region Region drawing - - const int MinimumRegionSize = 1; - - //Set if currently drawing a window (first click/drag was initiated) - bool _drawingRegion = false; - //Set if drawing was suspended because the mouse left the control - bool _drawingSuspended = false; - Point _regionStartPoint; - Point _regionLastPoint; - - public delegate void RegionDrawnHandler(object sender, ThumbnailRegion region); - - public event RegionDrawnHandler RegionDrawn; - - protected virtual void OnRegionDrawn(Rectangle region) { - //Fix region if necessary (bug report by Gunter, via comment) - if (region.Width < MinimumRegionSize) - region.Width = MinimumRegionSize; - if (region.Height < MinimumRegionSize) - region.Height = MinimumRegionSize; - - var evt = RegionDrawn; - if (evt != null) - evt(this, new ThumbnailRegion(region)); - } - - /// - /// Raises a RegionDrawn event, given a starting and an ending point of the drawn region. - /// - protected void RaiseRegionDrawn(Point start, Point end) { - if (_thumbnailSize.Width < 1 || _thumbnailSize.Height < 1) //causes DivBy0 - return; - - //Compute bounds and clip to boundaries - int left = Math.Min(start.X, end.X); - int right = Math.Max(start.X, end.X); - int top = Math.Min(start.Y, end.Y); - int bottom = Math.Max(start.Y, end.Y); - - //Clip to boundaries - left = Math.Max(0, left); - right = Math.Min(_thumbnailSize.Width, right); - top = Math.Max(0, top); - bottom = Math.Min(_thumbnailSize.Height, bottom); - - //Compute region rectangle in thumbnail coordinates - var startPoint = ClientToThumbnail(new Point(left, top)); - var endPoint = ClientToThumbnail(new Point(right, bottom)); - var final = new Rectangle( - startPoint.X, - startPoint.Y, - endPoint.X - startPoint.X, - endPoint.Y - startPoint.Y - ); - - //System.Diagnostics.Trace.WriteLine(string.Format("Drawn from {0} to {1}, as region {2}.", start, end, final)); - - //Signal - OnRegionDrawn(final); - } - - protected override void OnMouseDown(MouseEventArgs e) { - if (DrawMouseRegions && e.Button == MouseButtons.Left) { - //Start new region drawing - _drawingRegion = true; - _drawingSuspended = false; - _regionStartPoint = _regionLastPoint = e.Location; - - this.Invalidate(); - } - - base.OnMouseDown(e); - } - - protected override void OnMouseUp(MouseEventArgs e) { - if (DrawMouseRegions && e.Button == MouseButtons.Left) { - //Region completed - _drawingRegion = false; - _drawingSuspended = false; - RaiseRegionDrawn(_regionStartPoint, _regionLastPoint); - - this.Invalidate(); - } - - base.OnMouseUp(e); - } - - protected override void OnMouseLeave(EventArgs e) { - _drawingSuspended = true; - - this.Invalidate(); - - base.OnMouseLeave(e); - } - - protected override void OnMouseEnter(EventArgs e) { - _drawingSuspended = false; - - this.Invalidate(); - - base.OnMouseEnter(e); - } - - protected override void OnMouseMove(MouseEventArgs e) { - if (_drawingRegion && e.Button == MouseButtons.Left) { - //Continue drawing - _regionLastPoint = e.Location; - - this.Invalidate(); - } - else if(DrawMouseRegions && !_drawingRegion){ - //Keep track of region start point - _regionLastPoint = e.Location; - - this.Invalidate(); - } - - base.OnMouseMove(e); - } - - readonly static Pen RedPen = new Pen(Color.FromArgb(255, Color.Red), 1.5f); //TODO: check width - - protected override void OnPaint(PaintEventArgs e) { - if (_drawingRegion) { - //Is currently drawing, show rectangle - int left = Math.Min(_regionStartPoint.X, _regionLastPoint.X); - int right = Math.Max(_regionStartPoint.X, _regionLastPoint.X); - int top = Math.Min(_regionStartPoint.Y, _regionLastPoint.Y); - int bottom = Math.Max(_regionStartPoint.Y, _regionLastPoint.Y); - - e.Graphics.DrawRectangle(RedPen, left, top, right - left, bottom - top); - } - else if (DrawMouseRegions && ! _drawingSuspended) { - //Show cursor coordinates - e.Graphics.DrawLine(RedPen, new Point(0, _regionLastPoint.Y), new Point(ClientSize.Width, _regionLastPoint.Y)); - e.Graphics.DrawLine(RedPen, new Point(_regionLastPoint.X, 0), new Point(_regionLastPoint.X, ClientSize.Height)); - } - - base.OnPaint(e); - } - - #endregion - - #region Thumbnail clone click - - protected override void OnMouseClick(MouseEventArgs e) { - base.OnMouseClick(e); - - if (_thumbnail == null) - return; - - //Raise clicking event to allow click forwarding - if (ReportThumbnailClicks) { - OnCloneClick(ClientToThumbnail(e.Location), e.Button, false); - } - } - - protected override void OnMouseDoubleClick(MouseEventArgs e) { - base.OnMouseDoubleClick(e); - - if (_thumbnail == null) - return; - - //Raise double clicking event to allow click forwarding - if (ReportThumbnailClicks) { - OnCloneClick(ClientToThumbnail(e.Location), e.Button, true); - } - } - - /// - /// Is raised when the thumbnail clone is clicked. - /// - public event EventHandler CloneClick; - - protected virtual void OnCloneClick(Point location, MouseButtons buttons, bool doubleClick){ - var evt = CloneClick; - if(evt != null) - evt(this, new CloneClickEventArgs(location, buttons, doubleClick)); - } - - #endregion - - /// - /// Convert a point in client coordinates to a point expressed in terms of a cloned thumbnail window. - /// - /// Point in client coordinates. - protected Point ClientToThumbnail(Point position) { - //Compensate padding - position.X -= _padWidth; - position.Y -= _padHeight; - - //Determine position in fractional terms (on the size of the thumbnail control) - PointF proportionalPosition = new PointF( - (float)position.X / _thumbnailSize.Width, - (float)position.Y / _thumbnailSize.Height - ); - - //Get real pixel region info - Size source = ThumbnailPixelSize; - Point offset = (_regionEnabled) ? SelectedRegion.Offset : Point.Empty; - - return new Point( - (int)((proportionalPosition.X * source.Width) + offset.X), - (int)((proportionalPosition.Y * source.Height) + offset.Y) - ); - } - - } - -} +using System; +using System.Collections.Generic; +using System.Text; +using System.Windows.Forms; +using WindowsFormsAero.Dwm; +using System.Drawing; +using System.Windows.Forms.VisualStyles; +using OnTopReplica.Native; + +namespace OnTopReplica { + + class ThumbnailPanel : Panel { + + //DWM Thumbnail stuff + Thumbnail _thumbnail = null; + + //Labels + WindowsFormsAero.ThemeLabel _labelGlass; + + public ThumbnailPanel() { + InitFormComponents(); + } + + private void InitFormComponents() { + BackColor = Color.Black; + + //Themed Label + _labelGlass = new WindowsFormsAero.ThemeLabel { + Dock = DockStyle.Fill, + ForeColor = SystemColors.ControlText, + Location = Point.Empty, + Size = ClientSize, + Name = "labelGlass", + Text = Strings.RightClick, + TextAlign = HorizontalAlignment.Center, + TextAlignVertical = VerticalAlignment.Center + }; + this.Controls.Add(_labelGlass); + } + + #region Properties and settings + + ThumbnailRegion _currentRegion; + + /// + /// Gets or sets the region that is currently shown on the thumbnail. When set, also enables region constrain. + /// + public ThumbnailRegion SelectedRegion { + get { + return _currentRegion; + } + set { + _currentRegion = value; + _regionEnabled = (value != null); + UpdateThubmnail(); + } + } + + bool _regionEnabled = false; + + /// + /// Gets or sets whether the thumbnail is constrained to a region or not. + /// + public bool ConstrainToRegion { + get { + return _regionEnabled; + } + set { + if (_regionEnabled != value) { + _regionEnabled = value; + UpdateThubmnail(); + } + } + } + + /// + /// Enables mouse regions drawing, simulating one first click on the panel at the current cursor's position. + /// + public void EnableMouseRegionsDrawingWithMouseDown() { + if (DrawMouseRegions) + return; + + var localCursor = this.PointToClient(Cursor.Position); + + DrawMouseRegions = true; + OnMouseDown(new MouseEventArgs(System.Windows.Forms.MouseButtons.Left, 1, localCursor.X, localCursor.Y, 0)); + } + + bool _drawMouseRegions = false; + + /// + /// Gets or sets whether the control is is "region drawing" mode and reports them via events. + /// + public bool DrawMouseRegions { + get { + return _drawMouseRegions; + } + set { + //Set mode and reset region + _drawMouseRegions = value; + _drawingRegion = false; + + //Cursor change + Cursor = (value) ? Cursors.Cross : Cursors.Default; + + //Refresh gui + UpdateThubmnail(); + _labelGlass.Visible = !value; + this.Invalidate(); + } + } + + /// + /// Gets the target opacity of the thumbnail, depending on the control's state. + /// + protected byte ThumbnailOpacity { + get { + return (_drawMouseRegions) ? (byte)130 : (byte)255; + } + } + + /// + /// Gets or sets whether the control should report clicks made on the cloned thumbnail. + /// + public bool ReportThumbnailClicks { + get; + set; + } + + /// + /// Gets the thumbnail's size (in effectively thumbnailed pixels). + /// + /// + /// This size varies if the thumbnail has been cropped to a region. + /// + public Size ThumbnailPixelSize { + get { + if (_thumbnail != null && !_thumbnail.IsInvalid) { + if (_regionEnabled) { + return _currentRegion.ComputeRegionSize(_thumbnail.GetSourceSize()); + } + else { + //Thumbnail is not cropped, return full thumbnail source size + return _thumbnail.GetSourceSize(); + } + } + else { +#if DEBUG + throw new InvalidOperationException(Strings.ErrorNoThumbnail); +#else + return Size.Empty; +#endif + } + } + } + + /// + /// Gets the thumbnailed window's original size. + /// + /// + /// This size is not influenced by the region cropping applied to the thumbnail. + /// + public Size ThumbnailOriginalSize { + get { + if (_thumbnail != null && !_thumbnail.IsInvalid) { + return _thumbnail.GetSourceSize(); + } + else { +#if DEBUG + throw new InvalidOperationException(Strings.ErrorNoThumbnail); +#else + return Size.Empty; +#endif + } + } + } + + #endregion + + #region GUI event handling + + protected override void OnResize(EventArgs eventargs) { + base.OnResize(eventargs); + UpdateThubmnail(); + } + + protected override void WndProc(ref Message m) { + base.WndProc(ref m); + + //Check whether this is a hit-test on "client" surface + if (m.Msg == WM.NCHITTEST && m.Result.ToInt32() == HT.CLIENT) { + //Check whether clicks must be reported + if(!DrawMouseRegions && !ReportThumbnailClicks){ + m.Result = new IntPtr(HT.TRANSPARENT); + } + } + } + + #endregion + + #region Thumbnail interface + + /// + /// Creates a new thumbnail of a certain window. + /// + /// Handle of the window to clone. + /// Optional region. + public void SetThumbnailHandle(WindowHandle handle, ThumbnailRegion region) { + Log.WriteDetails("Setting new thumbnail", + "HWND {0}, region {1}", handle, region + ); + + if (_thumbnail != null && !_thumbnail.IsInvalid) { + _thumbnail.Close(); + _thumbnail = null; + } + + //Attempt to get top level Form from Control + Form owner = this.TopLevelControl as Form; + if (owner == null) + throw new Exception("Internal error: ThumbnailPanel.TopLevelControl is not a Form."); + + _labelGlass.Visible = false; + + //Register new thumbnail, update regioning directly and refresh thumbnail + _thumbnail = DwmManager.Register(owner, handle.Handle); + _currentRegion = region; + _regionEnabled = (region != null); + UpdateThubmnail(); + } + + /// + /// Disposes current thumbnail and enters stand-by mode. + /// + public void UnsetThumbnail() { + Log.Write("Unsetting thumbnail"); + + if (_thumbnail != null && !_thumbnail.IsInvalid) { + _thumbnail.Close(); + } + + _thumbnail = null; + _labelGlass.Visible = true; + } + + /// + /// Gets whether the control is currently displaying a thumbnail. + /// + public bool IsShowingThumbnail { + get { + return (_thumbnail != null && !_thumbnail.IsInvalid); + } + } + + int _padWidth = 0; + int _padHeight = 0; + Size _thumbnailSize; + + /// + /// Updates the thumbnail options and the right-click label. + /// + private void UpdateThubmnail() { + if (_thumbnail != null && !_thumbnail.IsInvalid){ + try { + //Get thumbnail size and attempt to fit to control, with padding + Size sourceSize = ThumbnailPixelSize; + _thumbnailSize = sourceSize.Fit(Size); + _padWidth = (Size.Width - _thumbnailSize.Width) / 2; + _padHeight = (Size.Height - _thumbnailSize.Height) / 2; + + System.Diagnostics.Debug.WriteLine("Fitting {0} inside {1} as {2}. Padding {3},{4}.", sourceSize, Size, _thumbnailSize, _padWidth, _padHeight); + + var target = new Rectangle(_padWidth, _padHeight, _thumbnailSize.Width, _thumbnailSize.Height); + Rectangle source = (_regionEnabled) ? _currentRegion.ComputeRegionRectangle(_thumbnail.GetSourceSize()) : new Rectangle(Point.Empty, _thumbnail.GetSourceSize()); + + _thumbnail.Update(target, source, ThumbnailOpacity, true, true); + } + catch { + //Any error updating the thumbnail forces to unset (handle may not be valid anymore) + UnsetThumbnail(); + return; + } + } + } + + #endregion + + #region Region drawing + + const int MinimumRegionSize = 1; + + //Set if currently drawing a window (first click/drag was initiated) + bool _drawingRegion = false; + //Set if drawing was suspended because the mouse left the control + bool _drawingSuspended = false; + Point _regionStartPoint; + Point _regionLastPoint; + + public delegate void RegionDrawnHandler(object sender, ThumbnailRegion region); + + public event RegionDrawnHandler RegionDrawn; + + protected virtual void OnRegionDrawn(Rectangle region) { + //Fix region if necessary (bug report by Gunter, via comment) + if (region.Width < MinimumRegionSize) + region.Width = MinimumRegionSize; + if (region.Height < MinimumRegionSize) + region.Height = MinimumRegionSize; + + var evt = RegionDrawn; + if (evt != null) + evt(this, new ThumbnailRegion(region)); + } + + /// + /// Raises a RegionDrawn event, given a starting and an ending point of the drawn region. + /// + protected void RaiseRegionDrawn(Point start, Point end) { + if (_thumbnailSize.Width < 1 || _thumbnailSize.Height < 1) //causes DivBy0 + return; + + //Compute bounds and clip to boundaries + int left = Math.Min(start.X, end.X); + int right = Math.Max(start.X, end.X); + int top = Math.Min(start.Y, end.Y); + int bottom = Math.Max(start.Y, end.Y); + + //Clip to boundaries + left = Math.Max(0, left); + right = Math.Min(_thumbnailSize.Width, right); + top = Math.Max(0, top); + bottom = Math.Min(_thumbnailSize.Height, bottom); + + //Compute region rectangle in thumbnail coordinates + var startPoint = ClientToThumbnail(new Point(left, top)); + var endPoint = ClientToThumbnail(new Point(right, bottom)); + var final = new Rectangle( + startPoint.X, + startPoint.Y, + endPoint.X - startPoint.X, + endPoint.Y - startPoint.Y + ); + + //System.Diagnostics.Trace.WriteLine(string.Format("Drawn from {0} to {1}, as region {2}.", start, end, final)); + + //Signal + OnRegionDrawn(final); + } + + protected override void OnMouseDown(MouseEventArgs e) { + if (DrawMouseRegions && e.Button == MouseButtons.Left) { + //Start new region drawing + _drawingRegion = true; + _drawingSuspended = false; + _regionStartPoint = _regionLastPoint = e.Location; + + this.Invalidate(); + } + + base.OnMouseDown(e); + } + + protected override void OnMouseUp(MouseEventArgs e) { + if (DrawMouseRegions && e.Button == MouseButtons.Left) { + //Region completed + _drawingRegion = false; + _drawingSuspended = false; + RaiseRegionDrawn(_regionStartPoint, _regionLastPoint); + + this.Invalidate(); + } + + base.OnMouseUp(e); + } + + protected override void OnMouseLeave(EventArgs e) { + _drawingSuspended = true; + + this.Invalidate(); + + base.OnMouseLeave(e); + } + + protected override void OnMouseEnter(EventArgs e) { + _drawingSuspended = false; + + this.Invalidate(); + + base.OnMouseEnter(e); + } + + protected override void OnMouseMove(MouseEventArgs e) { + if (_drawingRegion && e.Button == MouseButtons.Left) { + //Continue drawing + _regionLastPoint = e.Location; + + this.Invalidate(); + } + else if(DrawMouseRegions && !_drawingRegion){ + //Keep track of region start point + _regionLastPoint = e.Location; + + this.Invalidate(); + } + + base.OnMouseMove(e); + } + + readonly static Pen RedPen = new Pen(Color.FromArgb(255, Color.Red), 1.5f); //TODO: check width + + protected override void OnPaint(PaintEventArgs e) { + if (_drawingRegion) { + //Is currently drawing, show rectangle + int left = Math.Min(_regionStartPoint.X, _regionLastPoint.X); + int right = Math.Max(_regionStartPoint.X, _regionLastPoint.X); + int top = Math.Min(_regionStartPoint.Y, _regionLastPoint.Y); + int bottom = Math.Max(_regionStartPoint.Y, _regionLastPoint.Y); + + e.Graphics.DrawRectangle(RedPen, left, top, right - left, bottom - top); + } + else if (DrawMouseRegions && ! _drawingSuspended) { + //Show cursor coordinates + e.Graphics.DrawLine(RedPen, new Point(0, _regionLastPoint.Y), new Point(ClientSize.Width, _regionLastPoint.Y)); + e.Graphics.DrawLine(RedPen, new Point(_regionLastPoint.X, 0), new Point(_regionLastPoint.X, ClientSize.Height)); + } + + base.OnPaint(e); + } + + #endregion + + #region Thumbnail clone click + + protected override void OnMouseClick(MouseEventArgs e) { + base.OnMouseClick(e); + + if (_thumbnail == null) + return; + + //Raise clicking event to allow click forwarding + if (ReportThumbnailClicks) { + OnCloneClick(ClientToThumbnail(e.Location), e.Button, false); + } + } + + protected override void OnMouseDoubleClick(MouseEventArgs e) { + base.OnMouseDoubleClick(e); + + if (_thumbnail == null) + return; + + //Raise double clicking event to allow click forwarding + if (ReportThumbnailClicks) { + OnCloneClick(ClientToThumbnail(e.Location), e.Button, true); + } + } + + /// + /// Is raised when the thumbnail clone is clicked. + /// + public event EventHandler CloneClick; + + protected virtual void OnCloneClick(Point location, MouseButtons buttons, bool doubleClick){ + var evt = CloneClick; + if(evt != null) + evt(this, new CloneClickEventArgs(location, buttons, doubleClick)); + } + + #endregion + + /// + /// Convert a point in client coordinates to a point expressed in terms of a cloned thumbnail window. + /// + /// Point in client coordinates. + protected Point ClientToThumbnail(Point position) { + //Compensate padding + position.X -= _padWidth; + position.Y -= _padHeight; + + //Determine position in fractional terms (on the size of the thumbnail control) + PointF proportionalPosition = new PointF( + (float)position.X / _thumbnailSize.Width, + (float)position.Y / _thumbnailSize.Height + ); + + //Get real pixel region info + Size source = ThumbnailPixelSize; + Point offset = (_regionEnabled) ? SelectedRegion.Offset : Point.Empty; + + return new Point( + (int)((proportionalPosition.X * source.Width) + offset.X), + (int)((proportionalPosition.Y * source.Height) + offset.Y) + ); + } + + } + +} diff --git a/OnTopReplica/ThumbnailRegion.cs b/src/OnTopReplica/ThumbnailRegion.cs similarity index 97% rename from OnTopReplica/ThumbnailRegion.cs rename to src/OnTopReplica/ThumbnailRegion.cs index 20cfcf9..4716e90 100644 --- a/OnTopReplica/ThumbnailRegion.cs +++ b/src/OnTopReplica/ThumbnailRegion.cs @@ -1,222 +1,222 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Drawing; -using System.Windows.Forms; - -namespace OnTopReplica { - - /// - /// Represents a thumbnail region. - /// - /// - /// A ThumbnailRegion can work in absolute or in relative mode. - /// In absolute mode, the region is expressed in absolute pixel values, as expressed by the value of the - /// property. - /// In relative mode, the region is expressed in padding pixels from the borders of the source. Internally this - /// is still represented by the property. Properties of the Rectangle value are mapped as follows: - /// Rectangle.X = Padding.Left - /// Rectangle.Y = Padding.Top - /// Rectangle.Width = Padding.Right - /// Rectangle.Height = Padding.Bottom - /// - public class ThumbnailRegion { - - /// - /// Creates a ThumbnailRegion from a padding value relative to the thumbnail borders. - /// - public ThumbnailRegion(Padding padding) { - _bounds = new Rectangle { - X = padding.Left, - Y = padding.Top, - Width = padding.Right, - Height = padding.Bottom - }; - Relative = true; - } - - /// - /// Creates a ThumbnailRegion from a bounds rectangle (in absolute terms). - /// - public ThumbnailRegion(Rectangle rectangle) { - _bounds = rectangle; - Relative = false; - } - - /// - /// Creates a ThumbnailRegion from a rectangle, either expressing values in relative or in absolute terms. - /// - public ThumbnailRegion(Rectangle paddingOrBounds, bool relative) { - _bounds = paddingOrBounds; - Relative = relative; - } - - private Rectangle _bounds; - - /// - /// Gets or sets the bounds of the thumbnail region. - /// - public Rectangle Bounds { - get { -#if DEBUG - if (Relative) - throw new InvalidOperationException("Not allowed to use ThumbnailRegion Bounds as Rectangle value (in relative mode)."); -#endif - - return _bounds; - } - set { - _bounds = value; - Relative = false; - } - } - - /// - /// Gets or sets whether the bounds are expressed relative to the thumbnail borders. - /// - public bool Relative { - get; - set; - } - - /// - /// Sets the relative bounds of the region. Switches to relative mode. - /// - /// Padding in relative terms from the borders. - public void SetRelativeBounds(Padding padding) { - Bounds = new Rectangle { - X = padding.Left, - Y = padding.Top, - Width = padding.Right, - Height = padding.Bottom - }; - Relative = true; - } - - /// - /// Gets the bounds of the thumbnail region as relative padding from the thumbnail borders. - /// - /// Makes sense only in relative mode. - public Padding BoundsAsPadding { - get { -#if DEBUG - if (!Relative) - throw new InvalidOperationException("Not allowed to use ThumbnailRegion Bounds as Padding value (not in relative mode)."); -#endif - - return new Padding { - Left = _bounds.X, - Top = _bounds.Y, - Right = _bounds.Width, - Bottom = _bounds.Height - }; - } - } - - /// - /// Gets the offset of the region. - /// - /// - /// The offset is expressed as a point of displacement from the up-right corner (0,0) of the original source. - /// - public Point Offset { - get { - //This is equal in both absolute and relative mode - return _bounds.Location; - } - } - - const int MinimumRegionSize = 8; - - /// - /// Computes the effective region representing the bounds inside a source thumbnail of a certain size. - /// - /// Size of the full thumbnail source. - /// Bounds inside the thumbnail. - protected Rectangle ComputeRegion(Size sourceSize) { - Rectangle ret; - - //Compute - if (Relative) { - ret = new Rectangle { - X = _bounds.X, - Y = _bounds.Y, - Width = sourceSize.Width - _bounds.X - _bounds.Width, - Height = sourceSize.Height - _bounds.Y - _bounds.Height - }; - } - else { - ret = _bounds; - } - - //Constrain to bounds - if (ret.X + ret.Width > sourceSize.Width) - ret.Width = sourceSize.Width - ret.X; - if (ret.Y + ret.Height > sourceSize.Height) - ret.Height = sourceSize.Height - ret.Y; - - return ret; - } - - /// - /// Computes a rectangle representing the bounds of the region inside a source thumbnail of a certain size. - /// - /// Size of the full thumbnail source. - /// Bounds inside the thumbnail. - public Rectangle ComputeRegionRectangle(Size sourceSize) { - return ComputeRegion(sourceSize); - } - - /// - /// Computes a value representing the size of the region inside a source thumbnail of a certain size. - /// - /// Size of the full thumbnail source. - /// Size of the bounds inside the thumbnail. - public Size ComputeRegionSize(Size sourceSize) { - return ComputeRegion(sourceSize).Size; - } - - /// - /// Switches the region to relative mode, according to a source thumbnail of a given size. - /// - /// Size of the full thumbnail source. - public void SwitchToRelative(Size sourceSize) { - if (Relative) - return; - - var relativeBounds = new Padding { - Left = _bounds.X, - Top = _bounds.Y, - Right = sourceSize.Width - (_bounds.X + _bounds.Width), - Bottom = sourceSize.Height - (_bounds.Y + _bounds.Height) - }; - - this.SetRelativeBounds(relativeBounds); - } - - /// - /// Switches the region to absolute mode, according to a source thumbnail of a given size. - /// - /// Size of the full thumbnail source. - public void SwitchToAbsolute(Size sourceSize) { - if (!Relative) - return; - - var absoluteBounds = new Rectangle { - X = _bounds.X, - Y = _bounds.Y, - Width = (sourceSize.Width - _bounds.Width) - _bounds.X, - Height = (sourceSize.Height - _bounds.Height) - _bounds.Y - }; - - Bounds = absoluteBounds; - } - - public override string ToString() { - return string.Format("({0}, {1})", _bounds, (Relative) ? "relative" : "absolute"); - } - - } - -} +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Drawing; +using System.Windows.Forms; + +namespace OnTopReplica { + + /// + /// Represents a thumbnail region. + /// + /// + /// A ThumbnailRegion can work in absolute or in relative mode. + /// In absolute mode, the region is expressed in absolute pixel values, as expressed by the value of the + /// property. + /// In relative mode, the region is expressed in padding pixels from the borders of the source. Internally this + /// is still represented by the property. Properties of the Rectangle value are mapped as follows: + /// Rectangle.X = Padding.Left + /// Rectangle.Y = Padding.Top + /// Rectangle.Width = Padding.Right + /// Rectangle.Height = Padding.Bottom + /// + public class ThumbnailRegion { + + /// + /// Creates a ThumbnailRegion from a padding value relative to the thumbnail borders. + /// + public ThumbnailRegion(Padding padding) { + _bounds = new Rectangle { + X = padding.Left, + Y = padding.Top, + Width = padding.Right, + Height = padding.Bottom + }; + Relative = true; + } + + /// + /// Creates a ThumbnailRegion from a bounds rectangle (in absolute terms). + /// + public ThumbnailRegion(Rectangle rectangle) { + _bounds = rectangle; + Relative = false; + } + + /// + /// Creates a ThumbnailRegion from a rectangle, either expressing values in relative or in absolute terms. + /// + public ThumbnailRegion(Rectangle paddingOrBounds, bool relative) { + _bounds = paddingOrBounds; + Relative = relative; + } + + private Rectangle _bounds; + + /// + /// Gets or sets the bounds of the thumbnail region. + /// + public Rectangle Bounds { + get { +#if DEBUG + if (Relative) + throw new InvalidOperationException("Not allowed to use ThumbnailRegion Bounds as Rectangle value (in relative mode)."); +#endif + + return _bounds; + } + set { + _bounds = value; + Relative = false; + } + } + + /// + /// Gets or sets whether the bounds are expressed relative to the thumbnail borders. + /// + public bool Relative { + get; + set; + } + + /// + /// Sets the relative bounds of the region. Switches to relative mode. + /// + /// Padding in relative terms from the borders. + public void SetRelativeBounds(Padding padding) { + Bounds = new Rectangle { + X = padding.Left, + Y = padding.Top, + Width = padding.Right, + Height = padding.Bottom + }; + Relative = true; + } + + /// + /// Gets the bounds of the thumbnail region as relative padding from the thumbnail borders. + /// + /// Makes sense only in relative mode. + public Padding BoundsAsPadding { + get { +#if DEBUG + if (!Relative) + throw new InvalidOperationException("Not allowed to use ThumbnailRegion Bounds as Padding value (not in relative mode)."); +#endif + + return new Padding { + Left = _bounds.X, + Top = _bounds.Y, + Right = _bounds.Width, + Bottom = _bounds.Height + }; + } + } + + /// + /// Gets the offset of the region. + /// + /// + /// The offset is expressed as a point of displacement from the up-right corner (0,0) of the original source. + /// + public Point Offset { + get { + //This is equal in both absolute and relative mode + return _bounds.Location; + } + } + + const int MinimumRegionSize = 8; + + /// + /// Computes the effective region representing the bounds inside a source thumbnail of a certain size. + /// + /// Size of the full thumbnail source. + /// Bounds inside the thumbnail. + protected Rectangle ComputeRegion(Size sourceSize) { + Rectangle ret; + + //Compute + if (Relative) { + ret = new Rectangle { + X = _bounds.X, + Y = _bounds.Y, + Width = sourceSize.Width - _bounds.X - _bounds.Width, + Height = sourceSize.Height - _bounds.Y - _bounds.Height + }; + } + else { + ret = _bounds; + } + + //Constrain to bounds + if (ret.X + ret.Width > sourceSize.Width) + ret.Width = sourceSize.Width - ret.X; + if (ret.Y + ret.Height > sourceSize.Height) + ret.Height = sourceSize.Height - ret.Y; + + return ret; + } + + /// + /// Computes a rectangle representing the bounds of the region inside a source thumbnail of a certain size. + /// + /// Size of the full thumbnail source. + /// Bounds inside the thumbnail. + public Rectangle ComputeRegionRectangle(Size sourceSize) { + return ComputeRegion(sourceSize); + } + + /// + /// Computes a value representing the size of the region inside a source thumbnail of a certain size. + /// + /// Size of the full thumbnail source. + /// Size of the bounds inside the thumbnail. + public Size ComputeRegionSize(Size sourceSize) { + return ComputeRegion(sourceSize).Size; + } + + /// + /// Switches the region to relative mode, according to a source thumbnail of a given size. + /// + /// Size of the full thumbnail source. + public void SwitchToRelative(Size sourceSize) { + if (Relative) + return; + + var relativeBounds = new Padding { + Left = _bounds.X, + Top = _bounds.Y, + Right = sourceSize.Width - (_bounds.X + _bounds.Width), + Bottom = sourceSize.Height - (_bounds.Y + _bounds.Height) + }; + + this.SetRelativeBounds(relativeBounds); + } + + /// + /// Switches the region to absolute mode, according to a source thumbnail of a given size. + /// + /// Size of the full thumbnail source. + public void SwitchToAbsolute(Size sourceSize) { + if (!Relative) + return; + + var absoluteBounds = new Rectangle { + X = _bounds.X, + Y = _bounds.Y, + Width = (sourceSize.Width - _bounds.Width) - _bounds.X, + Height = (sourceSize.Height - _bounds.Height) - _bounds.Y + }; + + Bounds = absoluteBounds; + } + + public override string ToString() { + return string.Format("({0}, {1})", _bounds, (Relative) ? "relative" : "absolute"); + } + + } + +} diff --git a/OnTopReplica/Update/UpdateCheckCompletedEventArgs.cs b/src/OnTopReplica/Update/UpdateCheckCompletedEventArgs.cs similarity index 95% rename from OnTopReplica/Update/UpdateCheckCompletedEventArgs.cs rename to src/OnTopReplica/Update/UpdateCheckCompletedEventArgs.cs index 6482835..ade953d 100644 --- a/OnTopReplica/Update/UpdateCheckCompletedEventArgs.cs +++ b/src/OnTopReplica/Update/UpdateCheckCompletedEventArgs.cs @@ -1,15 +1,15 @@ -using System; -using System.Collections.Generic; -using System.Text; - -namespace OnTopReplica.Update { - class UpdateCheckCompletedEventArgs : EventArgs { - - public UpdateInformation Information { get; set; } - - public bool Success { get; set; } - - public Exception Error { get; set; } - - } -} +using System; +using System.Collections.Generic; +using System.Text; + +namespace OnTopReplica.Update { + class UpdateCheckCompletedEventArgs : EventArgs { + + public UpdateInformation Information { get; set; } + + public bool Success { get; set; } + + public Exception Error { get; set; } + + } +} diff --git a/OnTopReplica/Update/UpdateInformation.cs b/src/OnTopReplica/Update/UpdateInformation.cs similarity index 97% rename from OnTopReplica/Update/UpdateInformation.cs rename to src/OnTopReplica/Update/UpdateInformation.cs index 5ab3165..a51d111 100644 --- a/OnTopReplica/Update/UpdateInformation.cs +++ b/src/OnTopReplica/Update/UpdateInformation.cs @@ -1,71 +1,71 @@ -using System; -using System.Globalization; -using System.Reflection; - -namespace OnTopReplica.Update { - - /// - /// Contains information about the latest OnTopReplica update available. - /// - public class UpdateInformation { - - /// - /// Construct update information from raw data. - /// - /// Latest available version. - /// Direct link to the download page (has URL form). - /// Publication date of latest version, in standard RTF/RSS format. - public UpdateInformation(Version latestVersion, string downloadLink, string publicationDate) { - LatestVersion = latestVersion; - DownloadPage = downloadLink; - - //RSS date formatted as in: Thu, 29 Nov 2012 12:55:04 GMT - DateTime parsedPublicationDate; - if (DateTime.TryParseExact(publicationDate, "R", CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal, out parsedPublicationDate)) { - LatestVersionRelease = parsedPublicationDate; - } - } - - /// - /// Gets or sets the latest available version of the software. - /// - public Version LatestVersion { get; private set; } - - /// - /// Returns whether this update information instance represents data about - /// a new available version. - /// - public bool IsNewVersionAvailable { - get { - return (LatestVersion > CurrentVersion); - } - } - - private Version _currentVersion = null; - - /// - /// Gets the currently installed version. - /// - public Version CurrentVersion { - get { - if (_currentVersion == null) { - _currentVersion = Assembly.GetExecutingAssembly().GetName().Version; - } - - return _currentVersion; - } - } - - /// - /// Indicates when the latest version was released. - /// - public DateTime LatestVersionRelease { get; private set; } - - /// - /// Gets the URL of the page that allows the user to download the updated installer. - /// - public string DownloadPage { get; private set; } - - } - -} +using System; +using System.Globalization; +using System.Reflection; + +namespace OnTopReplica.Update { + + /// + /// Contains information about the latest OnTopReplica update available. + /// + public class UpdateInformation { + + /// + /// Construct update information from raw data. + /// + /// Latest available version. + /// Direct link to the download page (has URL form). + /// Publication date of latest version, in standard RTF/RSS format. + public UpdateInformation(Version latestVersion, string downloadLink, string publicationDate) { + LatestVersion = latestVersion; + DownloadPage = downloadLink; + + //RSS date formatted as in: Thu, 29 Nov 2012 12:55:04 GMT + DateTime parsedPublicationDate; + if (DateTime.TryParseExact(publicationDate, "R", CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal, out parsedPublicationDate)) { + LatestVersionRelease = parsedPublicationDate; + } + } + + /// + /// Gets or sets the latest available version of the software. + /// + public Version LatestVersion { get; private set; } + + /// + /// Returns whether this update information instance represents data about + /// a new available version. + /// + public bool IsNewVersionAvailable { + get { + return (LatestVersion > CurrentVersion); + } + } + + private Version _currentVersion = null; + + /// + /// Gets the currently installed version. + /// + public Version CurrentVersion { + get { + if (_currentVersion == null) { + _currentVersion = Assembly.GetExecutingAssembly().GetName().Version; + } + + return _currentVersion; + } + } + + /// + /// Indicates when the latest version was released. + /// + public DateTime LatestVersionRelease { get; private set; } + + /// + /// Gets the URL of the page that allows the user to download the updated installer. + /// + public string DownloadPage { get; private set; } + + } + +} diff --git a/OnTopReplica/Update/UpdateManager.cs b/src/OnTopReplica/Update/UpdateManager.cs similarity index 97% rename from OnTopReplica/Update/UpdateManager.cs rename to src/OnTopReplica/Update/UpdateManager.cs index 8d9e215..abc6137 100644 --- a/OnTopReplica/Update/UpdateManager.cs +++ b/src/OnTopReplica/Update/UpdateManager.cs @@ -1,194 +1,194 @@ -using System; -using System.Diagnostics; -using System.IO; -using System.Linq; -using System.Net; -using System.Net.Cache; -using System.Text.RegularExpressions; -using System.Windows.Forms; -using System.Xml.Linq; -using WindowsFormsAero.TaskDialog; - -namespace OnTopReplica.Update { - - /// - /// Handles update checking and information display. - /// - class UpdateManager { - - /// - /// Constructs a new update manager with an attached form. - /// - /// Form through which all GUI calls are made. Closing this form should terminate the application. - public UpdateManager(Form attachedForm) { - if (attachedForm == null) - throw new ArgumentNullException(); - - AttachedForm = attachedForm; - } - - /// - /// Gets or sets the attached form (through which all GUI calls are made). - /// - protected Form AttachedForm { get; private set; } - - #region Checking - - /// - /// Gets the latest update information available. - /// - public UpdateInformation LastInformation { get; private set; } - - HttpWebRequest _checkRequest; - - /// - /// Checks for update asynchronously, updating update information. - /// When check is completed, raises update events. - /// - public void CheckForUpdate() { - if (_checkRequest != null) { - _checkRequest.Abort(); - } - - //Build web request - _checkRequest = (HttpWebRequest)HttpWebRequest.Create(AppStrings.UpdateFeed); - _checkRequest.AllowAutoRedirect = true; - _checkRequest.AutomaticDecompression = DecompressionMethods.Deflate | DecompressionMethods.GZip; - _checkRequest.CachePolicy = new RequestCachePolicy(RequestCacheLevel.BypassCache); - - _checkRequest.BeginGetResponse(CheckForUpdateCallback, null); - } - - /// - /// Asynchronous callback that handles the update check request. - /// - private void CheckForUpdateCallback(IAsyncResult result) { - if (_checkRequest == null) - return; - - try { - var response = _checkRequest.EndGetResponse(result); - LastInformation = ParseUpdateCheckResponse(response.GetResponseStream()); - - OnUpdateCheckSuccess(LastInformation); - } - catch (Exception ex) { - OnUpdateCheckError(ex); - } - - _checkRequest = null; - } - - private Regex _versionExtractor = new Regex(@"^Released: Release (?([0-9]\.){0,3}[0-9]?)", RegexOptions.Compiled | RegexOptions.Singleline); - - private UpdateInformation ParseUpdateCheckResponse(Stream stream) { - var xdoc = XDocument.Load(stream); - - var releases = from item in xdoc.Descendants("item") - let title = item.Element("title").Value - let match = _versionExtractor.Match(title) - where match.Success - let versionNumber = new Version(match.Groups["version"].Value) - orderby versionNumber descending - select new { Version = versionNumber, Link = item.Element("link").Value, Date = item.Element("pubDate").Value }; - - var lastRelease = releases.FirstOrDefault(); - - return new UpdateInformation(lastRelease.Version, lastRelease.Link, lastRelease.Date); - } - - #endregion - - #region Eventing - - public event EventHandler UpdateCheckCompleted; - - protected virtual void OnUpdateCheckError(Exception ex) { - var evt = UpdateCheckCompleted; - if (evt != null) { - evt(this, new UpdateCheckCompletedEventArgs { - Success = false, - Error = ex - }); - } - } - - protected virtual void OnUpdateCheckSuccess(UpdateInformation information) { - var evt = UpdateCheckCompleted; - if (evt != null) { - evt(this, new UpdateCheckCompletedEventArgs { - Success = true, - Information = information - }); - } - } - - #endregion - - #region Updating - - /// - /// Asks confirmation for an update and installs the update (if available). - /// - public void ConfirmAndInstall() { - if (LastInformation == null || !LastInformation.IsNewVersionAvailable) - return; - - AttachedForm.SafeInvoke(new Action(ConfirmAndInstallCore)); - } - - /// - /// Core delegate that asks for update confirmation and installs. Must be called from GUI thread. - /// - private void ConfirmAndInstallCore() { - var updateDialog = new TaskDialog { - Title = Strings.UpdateTitle, - Instruction = string.Format(Strings.UpdateAvailableInstruction, LastInformation.LatestVersion), - Content = Strings.UpdateAvailableContent, - CustomButtons = new CustomButton[] { - new CustomButton(CommonButtonResult.OK, string.Format(Strings.UpdateAvailableCommandOk, LastInformation.LatestVersion)), - new CustomButton(CommonButtonResult.Cancel, Strings.UpdateAvailableCommandCancel) - }, - UseCommandLinks = true, - CommonIcon = CommonIcon.Information, - ExpandedInformation = string.Format(Strings.UpdateAvailableExpanded, LastInformation.CurrentVersion, LastInformation.LatestVersion), - }; - if (updateDialog.Show(AttachedForm).CommonButton == CommonButtonResult.OK) { - Shell.Execute(LastInformation.DownloadPage); - } - } - - /// - /// Displays some information about the current installation and available updates. - /// - public void DisplayInfo() { - AttachedForm.SafeInvoke(new Action(DisplayInfoCore)); - } - - /// - /// Displays info. Called from GUI thread. - /// - private void DisplayInfoCore() { - //No updates, but need to inform the user - var dlg = new TaskDialog { - Title = Strings.UpdateTitle, - Instruction = Strings.UpdateInfoInstruction, - Content = Strings.UpdateInfoContent, - EnableHyperlinks = true, - CommonButtons = CommonButton.Close, - AllowDialogCancellation = true, - CommonIcon = CommonIcon.Information, - Footer = string.Format(Strings.UpdateInfoFooter, LastInformation.LatestVersionRelease.ToLongDateString()) - }; - dlg.HyperlinkClick += delegate(object sender, HyperlinkEventArgs args) { - Shell.Execute(AppStrings.ApplicationWebsite); - }; - - dlg.Show(AttachedForm); - } - - #endregion - - } - -} +using System; +using System.Diagnostics; +using System.IO; +using System.Linq; +using System.Net; +using System.Net.Cache; +using System.Text.RegularExpressions; +using System.Windows.Forms; +using System.Xml.Linq; +using WindowsFormsAero.TaskDialog; + +namespace OnTopReplica.Update { + + /// + /// Handles update checking and information display. + /// + class UpdateManager { + + /// + /// Constructs a new update manager with an attached form. + /// + /// Form through which all GUI calls are made. Closing this form should terminate the application. + public UpdateManager(Form attachedForm) { + if (attachedForm == null) + throw new ArgumentNullException(); + + AttachedForm = attachedForm; + } + + /// + /// Gets or sets the attached form (through which all GUI calls are made). + /// + protected Form AttachedForm { get; private set; } + + #region Checking + + /// + /// Gets the latest update information available. + /// + public UpdateInformation LastInformation { get; private set; } + + HttpWebRequest _checkRequest; + + /// + /// Checks for update asynchronously, updating update information. + /// When check is completed, raises update events. + /// + public void CheckForUpdate() { + if (_checkRequest != null) { + _checkRequest.Abort(); + } + + //Build web request + _checkRequest = (HttpWebRequest)HttpWebRequest.Create(AppStrings.UpdateFeed); + _checkRequest.AllowAutoRedirect = true; + _checkRequest.AutomaticDecompression = DecompressionMethods.Deflate | DecompressionMethods.GZip; + _checkRequest.CachePolicy = new RequestCachePolicy(RequestCacheLevel.BypassCache); + + _checkRequest.BeginGetResponse(CheckForUpdateCallback, null); + } + + /// + /// Asynchronous callback that handles the update check request. + /// + private void CheckForUpdateCallback(IAsyncResult result) { + if (_checkRequest == null) + return; + + try { + var response = _checkRequest.EndGetResponse(result); + LastInformation = ParseUpdateCheckResponse(response.GetResponseStream()); + + OnUpdateCheckSuccess(LastInformation); + } + catch (Exception ex) { + OnUpdateCheckError(ex); + } + + _checkRequest = null; + } + + private Regex _versionExtractor = new Regex(@"^Released: Release (?([0-9]\.){0,3}[0-9]?)", RegexOptions.Compiled | RegexOptions.Singleline); + + private UpdateInformation ParseUpdateCheckResponse(Stream stream) { + var xdoc = XDocument.Load(stream); + + var releases = from item in xdoc.Descendants("item") + let title = item.Element("title").Value + let match = _versionExtractor.Match(title) + where match.Success + let versionNumber = new Version(match.Groups["version"].Value) + orderby versionNumber descending + select new { Version = versionNumber, Link = item.Element("link").Value, Date = item.Element("pubDate").Value }; + + var lastRelease = releases.FirstOrDefault(); + + return new UpdateInformation(lastRelease.Version, lastRelease.Link, lastRelease.Date); + } + + #endregion + + #region Eventing + + public event EventHandler UpdateCheckCompleted; + + protected virtual void OnUpdateCheckError(Exception ex) { + var evt = UpdateCheckCompleted; + if (evt != null) { + evt(this, new UpdateCheckCompletedEventArgs { + Success = false, + Error = ex + }); + } + } + + protected virtual void OnUpdateCheckSuccess(UpdateInformation information) { + var evt = UpdateCheckCompleted; + if (evt != null) { + evt(this, new UpdateCheckCompletedEventArgs { + Success = true, + Information = information + }); + } + } + + #endregion + + #region Updating + + /// + /// Asks confirmation for an update and installs the update (if available). + /// + public void ConfirmAndInstall() { + if (LastInformation == null || !LastInformation.IsNewVersionAvailable) + return; + + AttachedForm.SafeInvoke(new Action(ConfirmAndInstallCore)); + } + + /// + /// Core delegate that asks for update confirmation and installs. Must be called from GUI thread. + /// + private void ConfirmAndInstallCore() { + var updateDialog = new TaskDialog { + Title = Strings.UpdateTitle, + Instruction = string.Format(Strings.UpdateAvailableInstruction, LastInformation.LatestVersion), + Content = Strings.UpdateAvailableContent, + CustomButtons = new CustomButton[] { + new CustomButton(CommonButtonResult.OK, string.Format(Strings.UpdateAvailableCommandOk, LastInformation.LatestVersion)), + new CustomButton(CommonButtonResult.Cancel, Strings.UpdateAvailableCommandCancel) + }, + UseCommandLinks = true, + CommonIcon = CommonIcon.Information, + ExpandedInformation = string.Format(Strings.UpdateAvailableExpanded, LastInformation.CurrentVersion, LastInformation.LatestVersion), + }; + if (updateDialog.Show(AttachedForm).CommonButton == CommonButtonResult.OK) { + Shell.Execute(LastInformation.DownloadPage); + } + } + + /// + /// Displays some information about the current installation and available updates. + /// + public void DisplayInfo() { + AttachedForm.SafeInvoke(new Action(DisplayInfoCore)); + } + + /// + /// Displays info. Called from GUI thread. + /// + private void DisplayInfoCore() { + //No updates, but need to inform the user + var dlg = new TaskDialog { + Title = Strings.UpdateTitle, + Instruction = Strings.UpdateInfoInstruction, + Content = Strings.UpdateInfoContent, + EnableHyperlinks = true, + CommonButtons = CommonButton.Close, + AllowDialogCancellation = true, + CommonIcon = CommonIcon.Information, + Footer = string.Format(Strings.UpdateInfoFooter, LastInformation.LatestVersionRelease.ToLongDateString()) + }; + dlg.HyperlinkClick += delegate(object sender, HyperlinkEventArgs args) { + Shell.Execute(AppStrings.ApplicationWebsite); + }; + + dlg.Show(AttachedForm); + } + + #endregion + + } + +} diff --git a/OnTopReplica/Win32Helper.cs b/src/OnTopReplica/Win32Helper.cs similarity index 97% rename from OnTopReplica/Win32Helper.cs rename to src/OnTopReplica/Win32Helper.cs index 618c69e..bdcd763 100644 --- a/OnTopReplica/Win32Helper.cs +++ b/src/OnTopReplica/Win32Helper.cs @@ -1,126 +1,126 @@ -using System; -using System.Collections.Generic; -using System.Text; -using OnTopReplica.Native; -using System.Drawing; -using System.Windows.Forms; - -namespace OnTopReplica { - public static class Win32Helper { - - #region Injection - - /// Inject a fake left mouse click on a target window, on a location expressed in client coordinates. - /// Target window to click on. - /// Location of the mouse click expressed in client coordiantes of the target window. - /// True if a double click should be injected. - public static void InjectFakeMouseClick(IntPtr window, CloneClickEventArgs clickArgs) { - NPoint clientClickLocation = NPoint.FromPoint(clickArgs.ClientClickLocation); - NPoint scrClickLocation = WindowManagerMethods.ClientToScreen(window, clientClickLocation); - - //HACK (?) - //If target window has a Menu (which appears on the thumbnail) move the clicked location down - //in order to adjust (the menu isn't part of the window's client rect). - IntPtr hMenu = WindowMethods.GetMenu(window); - if (hMenu != IntPtr.Zero) - scrClickLocation.Y -= SystemInformation.MenuHeight; - - IntPtr hChild = GetRealChildControlFromPoint(window, scrClickLocation); - NPoint clntClickLocation = WindowManagerMethods.ScreenToClient(hChild, scrClickLocation); - - if (clickArgs.Buttons == MouseButtons.Left) { - if(clickArgs.IsDoubleClick) - InjectDoubleLeftMouseClick(hChild, clntClickLocation); - else - InjectLeftMouseClick(hChild, clntClickLocation); - } - else if (clickArgs.Buttons == MouseButtons.Right) { - if(clickArgs.IsDoubleClick) - InjectDoubleRightMouseClick(hChild, clntClickLocation); - else - InjectRightMouseClick(hChild, clntClickLocation); - } - } - - private static void InjectLeftMouseClick(IntPtr child, NPoint clientLocation) { - IntPtr lParamClickLocation = MessagingMethods.MakeLParam(clientLocation.X, clientLocation.Y); - - MessagingMethods.PostMessage(child, WM.LBUTTONDOWN, new IntPtr(MK.LBUTTON), lParamClickLocation); - MessagingMethods.PostMessage(child, WM.LBUTTONUP, new IntPtr(MK.LBUTTON), lParamClickLocation); - -#if DEBUG - System.Diagnostics.Debug.WriteLine("Left click on window #" + child.ToString() + " at " + clientLocation.ToString()); -#endif - } - - private static void InjectRightMouseClick(IntPtr child, NPoint clientLocation) { - IntPtr lParamClickLocation = MessagingMethods.MakeLParam(clientLocation.X, clientLocation.Y); - - MessagingMethods.PostMessage(child, WM.RBUTTONDOWN, new IntPtr(MK.RBUTTON), lParamClickLocation); - MessagingMethods.PostMessage(child, WM.RBUTTONUP, new IntPtr(MK.RBUTTON), lParamClickLocation); - -#if DEBUG - System.Diagnostics.Debug.WriteLine("Right click on window #" + child.ToString() + " at " + clientLocation.ToString()); -#endif - } - - private static void InjectDoubleLeftMouseClick(IntPtr child, NPoint clientLocation) { - IntPtr lParamClickLocation = MessagingMethods.MakeLParam(clientLocation.X, clientLocation.Y); - - MessagingMethods.PostMessage(child, WM.LBUTTONDBLCLK, new IntPtr(MK.LBUTTON), lParamClickLocation); - -#if DEBUG - System.Diagnostics.Debug.WriteLine("Double left click on window #" + child.ToString() + " at " + clientLocation.ToString()); -#endif - } - - private static void InjectDoubleRightMouseClick(IntPtr child, NPoint clientLocation) { - IntPtr lParamClickLocation = MessagingMethods.MakeLParam(clientLocation.X, clientLocation.Y); - - MessagingMethods.PostMessage(child, WM.RBUTTONDBLCLK, new IntPtr(MK.RBUTTON), lParamClickLocation); - -#if DEBUG - System.Diagnostics.Debug.WriteLine("Double right click on window #" + child.ToString() + " at " + clientLocation.ToString()); -#endif - } - - #endregion - - /// Returns the child control of a window corresponding to a screen location. - /// Parent window to explore. - /// Child control location in screen coordinates. - private static IntPtr GetRealChildControlFromPoint(IntPtr parent, NPoint scrClickLocation) { - IntPtr curr = parent, child = IntPtr.Zero; - do { - child = WindowManagerMethods.RealChildWindowFromPoint(curr, - WindowManagerMethods.ScreenToClient(curr, scrClickLocation)); - - if (child == IntPtr.Zero || child == curr) - break; - - //Update for next loop - curr = child; - } - while (true); - - //Safety check, shouldn't happen - if (curr == IntPtr.Zero) - curr = parent; - - return curr; - } - - /// - /// Gets a handle to the window that currently is in the foreground. - /// - /// May return null if call fails or no valid window selected. - public static WindowHandle GetCurrentForegroundWindow() { - IntPtr handle = WindowManagerMethods.GetForegroundWindow(); - if (handle == IntPtr.Zero) - return null; - - return new WindowHandle(handle); - } - - } -} +using System; +using System.Collections.Generic; +using System.Text; +using OnTopReplica.Native; +using System.Drawing; +using System.Windows.Forms; + +namespace OnTopReplica { + public static class Win32Helper { + + #region Injection + + /// Inject a fake left mouse click on a target window, on a location expressed in client coordinates. + /// Target window to click on. + /// Location of the mouse click expressed in client coordiantes of the target window. + /// True if a double click should be injected. + public static void InjectFakeMouseClick(IntPtr window, CloneClickEventArgs clickArgs) { + NPoint clientClickLocation = NPoint.FromPoint(clickArgs.ClientClickLocation); + NPoint scrClickLocation = WindowManagerMethods.ClientToScreen(window, clientClickLocation); + + //HACK (?) + //If target window has a Menu (which appears on the thumbnail) move the clicked location down + //in order to adjust (the menu isn't part of the window's client rect). + IntPtr hMenu = WindowMethods.GetMenu(window); + if (hMenu != IntPtr.Zero) + scrClickLocation.Y -= SystemInformation.MenuHeight; + + IntPtr hChild = GetRealChildControlFromPoint(window, scrClickLocation); + NPoint clntClickLocation = WindowManagerMethods.ScreenToClient(hChild, scrClickLocation); + + if (clickArgs.Buttons == MouseButtons.Left) { + if(clickArgs.IsDoubleClick) + InjectDoubleLeftMouseClick(hChild, clntClickLocation); + else + InjectLeftMouseClick(hChild, clntClickLocation); + } + else if (clickArgs.Buttons == MouseButtons.Right) { + if(clickArgs.IsDoubleClick) + InjectDoubleRightMouseClick(hChild, clntClickLocation); + else + InjectRightMouseClick(hChild, clntClickLocation); + } + } + + private static void InjectLeftMouseClick(IntPtr child, NPoint clientLocation) { + IntPtr lParamClickLocation = MessagingMethods.MakeLParam(clientLocation.X, clientLocation.Y); + + MessagingMethods.PostMessage(child, WM.LBUTTONDOWN, new IntPtr(MK.LBUTTON), lParamClickLocation); + MessagingMethods.PostMessage(child, WM.LBUTTONUP, new IntPtr(MK.LBUTTON), lParamClickLocation); + +#if DEBUG + System.Diagnostics.Debug.WriteLine("Left click on window #" + child.ToString() + " at " + clientLocation.ToString()); +#endif + } + + private static void InjectRightMouseClick(IntPtr child, NPoint clientLocation) { + IntPtr lParamClickLocation = MessagingMethods.MakeLParam(clientLocation.X, clientLocation.Y); + + MessagingMethods.PostMessage(child, WM.RBUTTONDOWN, new IntPtr(MK.RBUTTON), lParamClickLocation); + MessagingMethods.PostMessage(child, WM.RBUTTONUP, new IntPtr(MK.RBUTTON), lParamClickLocation); + +#if DEBUG + System.Diagnostics.Debug.WriteLine("Right click on window #" + child.ToString() + " at " + clientLocation.ToString()); +#endif + } + + private static void InjectDoubleLeftMouseClick(IntPtr child, NPoint clientLocation) { + IntPtr lParamClickLocation = MessagingMethods.MakeLParam(clientLocation.X, clientLocation.Y); + + MessagingMethods.PostMessage(child, WM.LBUTTONDBLCLK, new IntPtr(MK.LBUTTON), lParamClickLocation); + +#if DEBUG + System.Diagnostics.Debug.WriteLine("Double left click on window #" + child.ToString() + " at " + clientLocation.ToString()); +#endif + } + + private static void InjectDoubleRightMouseClick(IntPtr child, NPoint clientLocation) { + IntPtr lParamClickLocation = MessagingMethods.MakeLParam(clientLocation.X, clientLocation.Y); + + MessagingMethods.PostMessage(child, WM.RBUTTONDBLCLK, new IntPtr(MK.RBUTTON), lParamClickLocation); + +#if DEBUG + System.Diagnostics.Debug.WriteLine("Double right click on window #" + child.ToString() + " at " + clientLocation.ToString()); +#endif + } + + #endregion + + /// Returns the child control of a window corresponding to a screen location. + /// Parent window to explore. + /// Child control location in screen coordinates. + private static IntPtr GetRealChildControlFromPoint(IntPtr parent, NPoint scrClickLocation) { + IntPtr curr = parent, child = IntPtr.Zero; + do { + child = WindowManagerMethods.RealChildWindowFromPoint(curr, + WindowManagerMethods.ScreenToClient(curr, scrClickLocation)); + + if (child == IntPtr.Zero || child == curr) + break; + + //Update for next loop + curr = child; + } + while (true); + + //Safety check, shouldn't happen + if (curr == IntPtr.Zero) + curr = parent; + + return curr; + } + + /// + /// Gets a handle to the window that currently is in the foreground. + /// + /// May return null if call fails or no valid window selected. + public static WindowHandle GetCurrentForegroundWindow() { + IntPtr handle = WindowManagerMethods.GetForegroundWindow(); + if (handle == IntPtr.Zero) + return null; + + return new WindowHandle(handle); + } + + } +} diff --git a/OnTopReplica/WindowHandle.cs b/src/OnTopReplica/WindowHandle.cs similarity index 96% rename from OnTopReplica/WindowHandle.cs rename to src/OnTopReplica/WindowHandle.cs index 34720b3..a6951a0 100644 --- a/OnTopReplica/WindowHandle.cs +++ b/src/OnTopReplica/WindowHandle.cs @@ -1,152 +1,152 @@ -using System; -using System.Collections.Generic; -using System.Text; -using System.Drawing; -using OnTopReplica.Native; - -namespace OnTopReplica { - - /// - /// Helper class that keeps a window handle (HWND), - /// the title of the window and can load its icon. - /// - public class WindowHandle : System.Windows.Forms.IWin32Window { - - IntPtr _handle; - string _title; - - /// - /// Creates a new WindowHandle instance. The handle pointer must be valid, the title - /// may be null or empty and will be updated as requested. - /// - public WindowHandle(IntPtr p, string title) { - _handle = p; - _title = title; - } - - /// - /// Creates a new WindowHandle instance. Additional features of the handle will be queried as needed. - /// - /// - public WindowHandle(IntPtr p) { - _handle = p; - _title = null; - } - - public string Title { - get { - if (_title == null) { - _title = WindowMethods.GetWindowText(_handle) ?? string.Empty; - } - - return _title; - } - } - - Icon _icon = null; - bool _iconFetched = false; - public Icon Icon { - get { - if (!_iconFetched) { - //Fetch icon from window - IntPtr hIcon; - - if (MessagingMethods.SendMessageTimeout(_handle, WM.GETICON, new IntPtr(2), new IntPtr(0), - MessagingMethods.SendMessageTimeoutFlags.AbortIfHung | MessagingMethods.SendMessageTimeoutFlags.Block, 500, out hIcon) == IntPtr.Zero) { - hIcon = IntPtr.Zero; - } - - if (hIcon != IntPtr.Zero) { - _icon = Icon.FromHandle(hIcon); - } - else { - //Fetch icon from window class - hIcon = (IntPtr)WindowMethods.GetClassLong(_handle, WindowMethods.ClassLong.IconSmall); - - if (hIcon.ToInt64() != 0) { - _icon = Icon.FromHandle(hIcon); - } - } - } - - _iconFetched = true; - - return _icon; - } - } - - string _class = null; - - /// - /// Gets the window's class name. - /// - /// - /// This value is cached and is never null. - /// - public string Class { - get { - if (_class == null) { - _class = Native.WindowMethods.GetWindowClass(Handle) ?? string.Empty; - } - return _class; - } - } - - #region Object override - - public override string ToString() { - var sb = new StringBuilder(); - sb.AppendFormat("#{0}", _handle); - - if (!string.IsNullOrWhiteSpace(_title) || !string.IsNullOrWhiteSpace(_class)) { - sb.Append(" ("); - if (!string.IsNullOrWhiteSpace(_title)) { - sb.AppendFormat("title '{0}'", _title); - if (!string.IsNullOrWhiteSpace(_class)) { - sb.Append(", "); - } - } - if (!string.IsNullOrWhiteSpace(_class)) { - sb.AppendFormat("class {0}", _class); - } - sb.Append(")"); - } - - return sb.ToString(); - } - - public override bool Equals(object obj) { - if (ReferenceEquals(obj, this)) - return true; - - System.Windows.Forms.IWin32Window win = obj as System.Windows.Forms.IWin32Window; - if (win == null) - return false; - - return (_handle.Equals(win.Handle)); - } - - public override int GetHashCode() { - return _handle.GetHashCode(); - } - - #endregion - - #region IWin32Window Members - - public IntPtr Handle { - get { return _handle; } - } - - #endregion - - /// - /// Creates a new windowHandle instance from a given IntPtr handle. - /// - /// Handle value. - public static WindowHandle FromHandle(IntPtr handle) { - return new WindowHandle(handle, null); - } - - } -} +using System; +using System.Collections.Generic; +using System.Text; +using System.Drawing; +using OnTopReplica.Native; + +namespace OnTopReplica { + + /// + /// Helper class that keeps a window handle (HWND), + /// the title of the window and can load its icon. + /// + public class WindowHandle : System.Windows.Forms.IWin32Window { + + IntPtr _handle; + string _title; + + /// + /// Creates a new WindowHandle instance. The handle pointer must be valid, the title + /// may be null or empty and will be updated as requested. + /// + public WindowHandle(IntPtr p, string title) { + _handle = p; + _title = title; + } + + /// + /// Creates a new WindowHandle instance. Additional features of the handle will be queried as needed. + /// + /// + public WindowHandle(IntPtr p) { + _handle = p; + _title = null; + } + + public string Title { + get { + if (_title == null) { + _title = WindowMethods.GetWindowText(_handle) ?? string.Empty; + } + + return _title; + } + } + + Icon _icon = null; + bool _iconFetched = false; + public Icon Icon { + get { + if (!_iconFetched) { + //Fetch icon from window + IntPtr hIcon; + + if (MessagingMethods.SendMessageTimeout(_handle, WM.GETICON, new IntPtr(2), new IntPtr(0), + MessagingMethods.SendMessageTimeoutFlags.AbortIfHung | MessagingMethods.SendMessageTimeoutFlags.Block, 500, out hIcon) == IntPtr.Zero) { + hIcon = IntPtr.Zero; + } + + if (hIcon != IntPtr.Zero) { + _icon = Icon.FromHandle(hIcon); + } + else { + //Fetch icon from window class + hIcon = (IntPtr)WindowMethods.GetClassLong(_handle, WindowMethods.ClassLong.IconSmall); + + if (hIcon.ToInt64() != 0) { + _icon = Icon.FromHandle(hIcon); + } + } + } + + _iconFetched = true; + + return _icon; + } + } + + string _class = null; + + /// + /// Gets the window's class name. + /// + /// + /// This value is cached and is never null. + /// + public string Class { + get { + if (_class == null) { + _class = Native.WindowMethods.GetWindowClass(Handle) ?? string.Empty; + } + return _class; + } + } + + #region Object override + + public override string ToString() { + var sb = new StringBuilder(); + sb.AppendFormat("#{0}", _handle); + + if (!string.IsNullOrWhiteSpace(_title) || !string.IsNullOrWhiteSpace(_class)) { + sb.Append(" ("); + if (!string.IsNullOrWhiteSpace(_title)) { + sb.AppendFormat("title '{0}'", _title); + if (!string.IsNullOrWhiteSpace(_class)) { + sb.Append(", "); + } + } + if (!string.IsNullOrWhiteSpace(_class)) { + sb.AppendFormat("class {0}", _class); + } + sb.Append(")"); + } + + return sb.ToString(); + } + + public override bool Equals(object obj) { + if (ReferenceEquals(obj, this)) + return true; + + System.Windows.Forms.IWin32Window win = obj as System.Windows.Forms.IWin32Window; + if (win == null) + return false; + + return (_handle.Equals(win.Handle)); + } + + public override int GetHashCode() { + return _handle.GetHashCode(); + } + + #endregion + + #region IWin32Window Members + + public IntPtr Handle { + get { return _handle; } + } + + #endregion + + /// + /// Creates a new windowHandle instance from a given IntPtr handle. + /// + /// Handle value. + public static WindowHandle FromHandle(IntPtr handle) { + return new WindowHandle(handle, null); + } + + } +} diff --git a/OnTopReplica/WindowListMenuManager.cs b/src/OnTopReplica/WindowListMenuManager.cs similarity index 97% rename from OnTopReplica/WindowListMenuManager.cs rename to src/OnTopReplica/WindowListMenuManager.cs index a79fa74..464b202 100644 --- a/OnTopReplica/WindowListMenuManager.cs +++ b/src/OnTopReplica/WindowListMenuManager.cs @@ -1,202 +1,202 @@ -using System; -using System.Collections.Generic; -using System.Text; -using System.Windows.Forms; -using OnTopReplica.WindowSeekers; -using OnTopReplica.Properties; - -namespace OnTopReplica { - /// - /// Manages the window list displayed when allowing the user to select a window to clone. - /// - class WindowListMenuManager { - - const int MaxWindowTitleLength = 55; - - readonly MainForm _owner; - readonly ContextMenuStrip _windowsMenu; - - public WindowListMenuManager(MainForm owner, ContextMenuStrip windowsMenu) { - _owner = owner; - _windowsMenu = windowsMenu; - - WindowSeeker = new TaskWindowSeeker() { - OwnerHandle = owner.Handle, - SkipNotVisibleWindows = true - }; - - //Bind events - windowsMenu.Opening += new System.ComponentModel.CancelEventHandler(WindowsMenu_opening); - } - - void WindowsMenu_opening(object sender, System.ComponentModel.CancelEventArgs e) { - WindowSeeker.Refresh(); - PopulateMenu(_owner.CurrentThumbnailWindowHandle); - } - - /// - /// Populates the menu with windows from the window seeker instance. - /// - /// Handle of the currently selected window or null if none selected. - private void PopulateMenu(WindowHandle currentSelection) { - var regions = GetStoredRegions(); - - _windowsMenu.Items.Clear(); - - //"None" selection - var nullTsi = new ToolStripMenuItem(Strings.MenuWindowsNone); - nullTsi.Tag = null; - nullTsi.Click += MenuWindowClickHandler; - nullTsi.Checked = (currentSelection == null); - _windowsMenu.Items.Add(nullTsi); - - //Add an item for each window - foreach (WindowHandle h in WindowSeeker.Windows) { - var tsi = new ToolStripMenuItem(); - - //Window title - if (h.Title.Length > MaxWindowTitleLength) { - tsi.Text = h.Title.Substring(0, MaxWindowTitleLength) + "..."; - tsi.ToolTipText = h.Title; - } - else - tsi.Text = h.Title; - - //Icon - if (h.Icon != null) { - try { - tsi.Image = h.Icon.ToBitmap(); - } - catch (Exception) { - tsi.Image = null; - } - } - - //Check if this is the currently displayed window - tsi.Checked = h.Equals(currentSelection); - - //Click handler - tsi.Tag = h; - tsi.Click += MenuWindowClickHandler; - - PopulateRegionsDropdown(tsi, h, regions); - - _windowsMenu.Items.Add(tsi); - } - } - - private void PopulateRegionsDropdown(ToolStripMenuItem parent, WindowHandle parentHandle, StoredRegion[] regions) { - parent.DropDownItems.Clear(); - - //No region - var nullRegionItem = new ToolStripMenuItem(Strings.MenuWindowsWholeRegion); - nullRegionItem.Tag = parentHandle; - nullRegionItem.Image = Resources.regions; - nullRegionItem.Click += MenuWindowClickHandler; - parent.DropDownItems.Add(nullRegionItem); - - //Video detector - /*var detectorItem = new ToolStripMenuItem("Autodetect plugin"); - detectorItem.Tag = parentHandle; - detectorItem.Click += MenuVideoCropperClickHandler; - parent.DropDownItems.Add(detectorItem);*/ - - //Regions (if any) - if (regions == null || regions.Length == 0) - return; - - parent.DropDownItems.Add(new ToolStripSeparator()); - - foreach (StoredRegion region in regions) { - var regionItem = new ToolStripMenuItem(region.Name); - regionItem.Tag = new Tuple(parentHandle, region); - regionItem.Click += MenuRegionWindowClickHandler; - - parent.DropDownItems.Add(regionItem); - } - } - - private void MenuWindowClickHandler(object sender, EventArgs args) { - CommonClickHandler(); - - var tsi = (ToolStripMenuItem)sender; - if (tsi.Tag == null) { - _owner.UnsetThumbnail(); - } - else { - var handle = (WindowHandle)tsi.Tag; - _owner.SetThumbnail(handle, null); - } - } - - private void MenuRegionWindowClickHandler(object sender, EventArgs args) { - CommonClickHandler(); - - var tsi = (ToolStripMenuItem)sender; - var tuple = (Tuple)tsi.Tag; - _owner.SetThumbnail(tuple.Item1, - (tuple.Item2 != null) ? (ThumbnailRegion)tuple.Item2.Region : null); - } - - /*PluginRegionLocator _pluginRegionLocator = null; - - private void MenuVideoCropperClickHandler(object sender, EventArgs args){ - CommonClickHandler(); - - var tsi = (ToolStripMenuItem)sender; - var handle = (WindowHandle)tsi.Tag; - - if (_pluginRegionLocator == null) - _pluginRegionLocator = new PluginRegionLocator(); - - var detectedRegion = _pluginRegionLocator.LocatePluginRegion(handle); - _owner.SetThumbnail(handle, detectedRegion); - }*/ - - private void CommonClickHandler() { - _windowsMenu.Close(); - foreach (ContextMenuStrip menu in _parentMenus) - menu.Close(); - } - - /// - /// Gets an array of stored regions. - /// - private StoredRegion[] GetStoredRegions() { - if (Settings.Default.SavedRegions == null || Settings.Default.SavedRegions.Count == 0) - return null; - - StoredRegion[] ret = new StoredRegion[Settings.Default.SavedRegions.Count]; - Settings.Default.SavedRegions.CopyTo(ret); - - Array.Sort(ret, (a, b) => { - return a.Name.CompareTo(b.Name); - }); - - return ret; - } - - /// - /// Gets or sets the window seeker instance used to list windows. - /// - public BaseWindowSeeker WindowSeeker { get; set; } - - ContextMenuStrip[] _parentMenus = new ContextMenuStrip[0]; - - /// - /// Gets the parent menus which are bound to the context menu handled by this manager. - /// - public ContextMenuStrip[] ParentMenus { - get { - return (ContextMenuStrip[])_parentMenus.Clone(); - } - set { - if(value == null) - _parentMenus = new ContextMenuStrip[0]; - else - _parentMenus = (ContextMenuStrip[])value.Clone(); - } - } - - } -} +using System; +using System.Collections.Generic; +using System.Text; +using System.Windows.Forms; +using OnTopReplica.WindowSeekers; +using OnTopReplica.Properties; + +namespace OnTopReplica { + /// + /// Manages the window list displayed when allowing the user to select a window to clone. + /// + class WindowListMenuManager { + + const int MaxWindowTitleLength = 55; + + readonly MainForm _owner; + readonly ContextMenuStrip _windowsMenu; + + public WindowListMenuManager(MainForm owner, ContextMenuStrip windowsMenu) { + _owner = owner; + _windowsMenu = windowsMenu; + + WindowSeeker = new TaskWindowSeeker() { + OwnerHandle = owner.Handle, + SkipNotVisibleWindows = true + }; + + //Bind events + windowsMenu.Opening += new System.ComponentModel.CancelEventHandler(WindowsMenu_opening); + } + + void WindowsMenu_opening(object sender, System.ComponentModel.CancelEventArgs e) { + WindowSeeker.Refresh(); + PopulateMenu(_owner.CurrentThumbnailWindowHandle); + } + + /// + /// Populates the menu with windows from the window seeker instance. + /// + /// Handle of the currently selected window or null if none selected. + private void PopulateMenu(WindowHandle currentSelection) { + var regions = GetStoredRegions(); + + _windowsMenu.Items.Clear(); + + //"None" selection + var nullTsi = new ToolStripMenuItem(Strings.MenuWindowsNone); + nullTsi.Tag = null; + nullTsi.Click += MenuWindowClickHandler; + nullTsi.Checked = (currentSelection == null); + _windowsMenu.Items.Add(nullTsi); + + //Add an item for each window + foreach (WindowHandle h in WindowSeeker.Windows) { + var tsi = new ToolStripMenuItem(); + + //Window title + if (h.Title.Length > MaxWindowTitleLength) { + tsi.Text = h.Title.Substring(0, MaxWindowTitleLength) + "..."; + tsi.ToolTipText = h.Title; + } + else + tsi.Text = h.Title; + + //Icon + if (h.Icon != null) { + try { + tsi.Image = h.Icon.ToBitmap(); + } + catch (Exception) { + tsi.Image = null; + } + } + + //Check if this is the currently displayed window + tsi.Checked = h.Equals(currentSelection); + + //Click handler + tsi.Tag = h; + tsi.Click += MenuWindowClickHandler; + + PopulateRegionsDropdown(tsi, h, regions); + + _windowsMenu.Items.Add(tsi); + } + } + + private void PopulateRegionsDropdown(ToolStripMenuItem parent, WindowHandle parentHandle, StoredRegion[] regions) { + parent.DropDownItems.Clear(); + + //No region + var nullRegionItem = new ToolStripMenuItem(Strings.MenuWindowsWholeRegion); + nullRegionItem.Tag = parentHandle; + nullRegionItem.Image = Resources.regions; + nullRegionItem.Click += MenuWindowClickHandler; + parent.DropDownItems.Add(nullRegionItem); + + //Video detector + /*var detectorItem = new ToolStripMenuItem("Autodetect plugin"); + detectorItem.Tag = parentHandle; + detectorItem.Click += MenuVideoCropperClickHandler; + parent.DropDownItems.Add(detectorItem);*/ + + //Regions (if any) + if (regions == null || regions.Length == 0) + return; + + parent.DropDownItems.Add(new ToolStripSeparator()); + + foreach (StoredRegion region in regions) { + var regionItem = new ToolStripMenuItem(region.Name); + regionItem.Tag = new Tuple(parentHandle, region); + regionItem.Click += MenuRegionWindowClickHandler; + + parent.DropDownItems.Add(regionItem); + } + } + + private void MenuWindowClickHandler(object sender, EventArgs args) { + CommonClickHandler(); + + var tsi = (ToolStripMenuItem)sender; + if (tsi.Tag == null) { + _owner.UnsetThumbnail(); + } + else { + var handle = (WindowHandle)tsi.Tag; + _owner.SetThumbnail(handle, null); + } + } + + private void MenuRegionWindowClickHandler(object sender, EventArgs args) { + CommonClickHandler(); + + var tsi = (ToolStripMenuItem)sender; + var tuple = (Tuple)tsi.Tag; + _owner.SetThumbnail(tuple.Item1, + (tuple.Item2 != null) ? (ThumbnailRegion)tuple.Item2.Region : null); + } + + /*PluginRegionLocator _pluginRegionLocator = null; + + private void MenuVideoCropperClickHandler(object sender, EventArgs args){ + CommonClickHandler(); + + var tsi = (ToolStripMenuItem)sender; + var handle = (WindowHandle)tsi.Tag; + + if (_pluginRegionLocator == null) + _pluginRegionLocator = new PluginRegionLocator(); + + var detectedRegion = _pluginRegionLocator.LocatePluginRegion(handle); + _owner.SetThumbnail(handle, detectedRegion); + }*/ + + private void CommonClickHandler() { + _windowsMenu.Close(); + foreach (ContextMenuStrip menu in _parentMenus) + menu.Close(); + } + + /// + /// Gets an array of stored regions. + /// + private StoredRegion[] GetStoredRegions() { + if (Settings.Default.SavedRegions == null || Settings.Default.SavedRegions.Count == 0) + return null; + + StoredRegion[] ret = new StoredRegion[Settings.Default.SavedRegions.Count]; + Settings.Default.SavedRegions.CopyTo(ret); + + Array.Sort(ret, (a, b) => { + return a.Name.CompareTo(b.Name); + }); + + return ret; + } + + /// + /// Gets or sets the window seeker instance used to list windows. + /// + public BaseWindowSeeker WindowSeeker { get; set; } + + ContextMenuStrip[] _parentMenus = new ContextMenuStrip[0]; + + /// + /// Gets the parent menus which are bound to the context menu handled by this manager. + /// + public ContextMenuStrip[] ParentMenus { + get { + return (ContextMenuStrip[])_parentMenus.Clone(); + } + set { + if(value == null) + _parentMenus = new ContextMenuStrip[0]; + else + _parentMenus = (ContextMenuStrip[])value.Clone(); + } + } + + } +} diff --git a/OnTopReplica/WindowSeekers/BaseWindowSeeker.cs b/src/OnTopReplica/WindowSeekers/BaseWindowSeeker.cs similarity index 96% rename from OnTopReplica/WindowSeekers/BaseWindowSeeker.cs rename to src/OnTopReplica/WindowSeekers/BaseWindowSeeker.cs index 6a00ed5..83538c7 100644 --- a/OnTopReplica/WindowSeekers/BaseWindowSeeker.cs +++ b/src/OnTopReplica/WindowSeekers/BaseWindowSeeker.cs @@ -1,68 +1,68 @@ -using System; -using System.Collections.Generic; -using System.Text; -using OnTopReplica.Native; - -namespace OnTopReplica.WindowSeekers { - - /// - /// Base class for window seekers that can populate a list of window handles based on some criteria and with basic filtering. - /// - abstract class BaseWindowSeeker : IWindowSeeker { - - #region IWindowSeeker - - /// - /// Get the matching windows from the last refresh. - /// - public abstract IList Windows { - get; - } - - /// - /// Forces a window list refresh. - /// - public virtual void Refresh() { - WindowManagerMethods.EnumWindows(RefreshCallback, IntPtr.Zero); - } - - #endregion - - private bool RefreshCallback(IntPtr hwnd, IntPtr lParam) { - //Skip owner - if (hwnd == OwnerHandle) - return true; - - if (SkipNotVisibleWindows && !WindowManagerMethods.IsWindowVisible(hwnd)) - return true; - - //Extract basic properties - string title = WindowMethods.GetWindowText(hwnd); - var handle = new WindowHandle(hwnd, title); - - return InspectWindow(handle); - } - - /// - /// Inspects a window and return whether inspection should continue. - /// - /// Handle of the window. - /// True if inspection should continue. False stops current refresh operation. - protected abstract bool InspectWindow(WindowHandle handle); - - /// - /// Gets or sets the window handle of the owner. - /// - /// - /// Windows with this handle will be automatically skipped. - /// - public IntPtr OwnerHandle { get; set; } - - /// - /// Gets or sets whether not visible windows should be skipped. - /// - public bool SkipNotVisibleWindows { get; set; } - - } - -} +using System; +using System.Collections.Generic; +using System.Text; +using OnTopReplica.Native; + +namespace OnTopReplica.WindowSeekers { + + /// + /// Base class for window seekers that can populate a list of window handles based on some criteria and with basic filtering. + /// + abstract class BaseWindowSeeker : IWindowSeeker { + + #region IWindowSeeker + + /// + /// Get the matching windows from the last refresh. + /// + public abstract IList Windows { + get; + } + + /// + /// Forces a window list refresh. + /// + public virtual void Refresh() { + WindowManagerMethods.EnumWindows(RefreshCallback, IntPtr.Zero); + } + + #endregion + + private bool RefreshCallback(IntPtr hwnd, IntPtr lParam) { + //Skip owner + if (hwnd == OwnerHandle) + return true; + + if (SkipNotVisibleWindows && !WindowManagerMethods.IsWindowVisible(hwnd)) + return true; + + //Extract basic properties + string title = WindowMethods.GetWindowText(hwnd); + var handle = new WindowHandle(hwnd, title); + + return InspectWindow(handle); + } + + /// + /// Inspects a window and return whether inspection should continue. + /// + /// Handle of the window. + /// True if inspection should continue. False stops current refresh operation. + protected abstract bool InspectWindow(WindowHandle handle); + + /// + /// Gets or sets the window handle of the owner. + /// + /// + /// Windows with this handle will be automatically skipped. + /// + public IntPtr OwnerHandle { get; set; } + + /// + /// Gets or sets whether not visible windows should be skipped. + /// + public bool SkipNotVisibleWindows { get; set; } + + } + +} diff --git a/OnTopReplica/WindowSeekers/ByClassWindowSeeker.cs b/src/OnTopReplica/WindowSeekers/ByClassWindowSeeker.cs similarity index 96% rename from OnTopReplica/WindowSeekers/ByClassWindowSeeker.cs rename to src/OnTopReplica/WindowSeekers/ByClassWindowSeeker.cs index e6e73dc..1d1bd8b 100644 --- a/OnTopReplica/WindowSeekers/ByClassWindowSeeker.cs +++ b/src/OnTopReplica/WindowSeekers/ByClassWindowSeeker.cs @@ -1,41 +1,41 @@ -using System; -using System.Collections.Generic; -using System.Text; -using OnTopReplica.Native; - -namespace OnTopReplica.WindowSeekers { - /// - /// Seeks a single window by matching its window class. - /// - /// - /// Class matching is case-sensitive and prefers perfect matches, also accepting - /// partial matches (when the class matches the beginning of the target class name). - /// - class ByClassWindowSeeker : PointBasedWindowSeeker { - - public ByClassWindowSeeker(string className) { - if (className == null) - throw new ArgumentNullException(); - - ClassName = className; - } - - public string ClassName { get; private set; } - - protected override int EvaluatePoints(WindowHandle handle) { - if(string.IsNullOrEmpty(handle.Class)) - return -1; - - int points = 0; - - //Partial match - if (handle.Class.StartsWith(ClassName, StringComparison.InvariantCulture)) - points += 10; - - if (handle.Class.Equals(ClassName, StringComparison.InvariantCulture)) - points += 10; - - return points; - } - } -} +using System; +using System.Collections.Generic; +using System.Text; +using OnTopReplica.Native; + +namespace OnTopReplica.WindowSeekers { + /// + /// Seeks a single window by matching its window class. + /// + /// + /// Class matching is case-sensitive and prefers perfect matches, also accepting + /// partial matches (when the class matches the beginning of the target class name). + /// + class ByClassWindowSeeker : PointBasedWindowSeeker { + + public ByClassWindowSeeker(string className) { + if (className == null) + throw new ArgumentNullException(); + + ClassName = className; + } + + public string ClassName { get; private set; } + + protected override int EvaluatePoints(WindowHandle handle) { + if(string.IsNullOrEmpty(handle.Class)) + return -1; + + int points = 0; + + //Partial match + if (handle.Class.StartsWith(ClassName, StringComparison.InvariantCulture)) + points += 10; + + if (handle.Class.Equals(ClassName, StringComparison.InvariantCulture)) + points += 10; + + return points; + } + } +} diff --git a/OnTopReplica/WindowSeekers/ByTitleWindowSeeker.cs b/src/OnTopReplica/WindowSeekers/ByTitleWindowSeeker.cs similarity index 96% rename from OnTopReplica/WindowSeekers/ByTitleWindowSeeker.cs rename to src/OnTopReplica/WindowSeekers/ByTitleWindowSeeker.cs index 5850335..107dfcd 100644 --- a/OnTopReplica/WindowSeekers/ByTitleWindowSeeker.cs +++ b/src/OnTopReplica/WindowSeekers/ByTitleWindowSeeker.cs @@ -1,50 +1,50 @@ -using System; -using System.Collections.Generic; -using System.Text; -using OnTopReplica.Native; - -namespace OnTopReplica.WindowSeekers { - /// - /// Seeks a single window by approximately matching its title. - /// - /// - /// Title search is case-insensitive and matches only the beginning of the windows' titles. - /// - class ByTitleWindowSeeker : PointBasedWindowSeeker { - - public ByTitleWindowSeeker(string titleSeekString) { - if (titleSeekString == null) - throw new ArgumentNullException(); - - TitleMatch = titleSeekString.Trim().ToLowerInvariant(); - } - - public string TitleMatch { get; private set; } - - protected override int EvaluatePoints(WindowHandle handle) { - //Skip empty titles - if (string.IsNullOrEmpty(handle.Title)) - return -1; - - //Skip non top-level windows - if (!WindowManagerMethods.IsTopLevel(handle.Handle)) - return -1; - - string handleTitle = handle.Title.ToLowerInvariant(); - int points = 0; - - //Give points for partial match - if (handleTitle.Equals(TitleMatch)) { - points += 20; - } - else if (handleTitle.StartsWith(TitleMatch)) { - points += 15; - } - else if (handleTitle.Contains(TitleMatch)) { - points += 10; - } - - return points; - } - } -} +using System; +using System.Collections.Generic; +using System.Text; +using OnTopReplica.Native; + +namespace OnTopReplica.WindowSeekers { + /// + /// Seeks a single window by approximately matching its title. + /// + /// + /// Title search is case-insensitive and matches only the beginning of the windows' titles. + /// + class ByTitleWindowSeeker : PointBasedWindowSeeker { + + public ByTitleWindowSeeker(string titleSeekString) { + if (titleSeekString == null) + throw new ArgumentNullException(); + + TitleMatch = titleSeekString.Trim().ToLowerInvariant(); + } + + public string TitleMatch { get; private set; } + + protected override int EvaluatePoints(WindowHandle handle) { + //Skip empty titles + if (string.IsNullOrEmpty(handle.Title)) + return -1; + + //Skip non top-level windows + if (!WindowManagerMethods.IsTopLevel(handle.Handle)) + return -1; + + string handleTitle = handle.Title.ToLowerInvariant(); + int points = 0; + + //Give points for partial match + if (handleTitle.Equals(TitleMatch)) { + points += 20; + } + else if (handleTitle.StartsWith(TitleMatch)) { + points += 15; + } + else if (handleTitle.Contains(TitleMatch)) { + points += 10; + } + + return points; + } + } +} diff --git a/OnTopReplica/WindowSeekers/IWindowSeeker.cs b/src/OnTopReplica/WindowSeekers/IWindowSeeker.cs similarity index 95% rename from OnTopReplica/WindowSeekers/IWindowSeeker.cs rename to src/OnTopReplica/WindowSeekers/IWindowSeeker.cs index 42e4024..e5fb63c 100644 --- a/OnTopReplica/WindowSeekers/IWindowSeeker.cs +++ b/src/OnTopReplica/WindowSeekers/IWindowSeeker.cs @@ -1,23 +1,23 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace OnTopReplica.WindowSeekers { - /// - /// Interface for window seekers. - /// - interface IWindowSeeker { - - /// - /// Get the list of matching windows, ordered by priority (optionally). - /// - IList Windows { get; } - - /// - /// Refreshes the list of windows. - /// - void Refresh(); - - } -} +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace OnTopReplica.WindowSeekers { + /// + /// Interface for window seekers. + /// + interface IWindowSeeker { + + /// + /// Get the list of matching windows, ordered by priority (optionally). + /// + IList Windows { get; } + + /// + /// Refreshes the list of windows. + /// + void Refresh(); + + } +} diff --git a/OnTopReplica/WindowSeekers/PointBasedWindowSeeker.cs b/src/OnTopReplica/WindowSeekers/PointBasedWindowSeeker.cs similarity index 96% rename from OnTopReplica/WindowSeekers/PointBasedWindowSeeker.cs rename to src/OnTopReplica/WindowSeekers/PointBasedWindowSeeker.cs index 2c798dc..43ca70c 100644 --- a/OnTopReplica/WindowSeekers/PointBasedWindowSeeker.cs +++ b/src/OnTopReplica/WindowSeekers/PointBasedWindowSeeker.cs @@ -1,56 +1,56 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace OnTopReplica.WindowSeekers { - /// - /// Window seeker that uses a point system to get a list of matching windows listed by optimality. - /// - abstract class PointBasedWindowSeeker : BaseWindowSeeker { - - IList _currentWindowList = new List(); - - public override IList Windows { - get { - return _currentWindowList; - } - } - - List> _sortingList = null; - - public override void Refresh() { - _sortingList = new List>(); - - base.Refresh(); - - //Sort and store - _currentWindowList = (from t in _sortingList - where t.Item1 > 0 - orderby t.Item1 descending - select t.Item2).ToList(); - - _sortingList = null; - } - - protected override bool InspectWindow(WindowHandle handle) { - int points = EvaluatePoints(handle); - if(points >= 0){ - _sortingList.Add(new Tuple(points, handle)); - } - - return true; - } - - /// - /// Evalutes the points for a window handle. - /// - /// Handle to the window. - /// - /// Number of points. Higher points identify better suited windows. - /// Windows with negative points are discarded altogether. - /// - protected abstract int EvaluatePoints(WindowHandle handle); - - } -} +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace OnTopReplica.WindowSeekers { + /// + /// Window seeker that uses a point system to get a list of matching windows listed by optimality. + /// + abstract class PointBasedWindowSeeker : BaseWindowSeeker { + + IList _currentWindowList = new List(); + + public override IList Windows { + get { + return _currentWindowList; + } + } + + List> _sortingList = null; + + public override void Refresh() { + _sortingList = new List>(); + + base.Refresh(); + + //Sort and store + _currentWindowList = (from t in _sortingList + where t.Item1 > 0 + orderby t.Item1 descending + select t.Item2).ToList(); + + _sortingList = null; + } + + protected override bool InspectWindow(WindowHandle handle) { + int points = EvaluatePoints(handle); + if(points >= 0){ + _sortingList.Add(new Tuple(points, handle)); + } + + return true; + } + + /// + /// Evalutes the points for a window handle. + /// + /// Handle to the window. + /// + /// Number of points. Higher points identify better suited windows. + /// Windows with negative points are discarded altogether. + /// + protected abstract int EvaluatePoints(WindowHandle handle); + + } +} diff --git a/OnTopReplica/WindowSeekers/RestoreWindowSeeker.cs b/src/OnTopReplica/WindowSeekers/RestoreWindowSeeker.cs similarity index 96% rename from OnTopReplica/WindowSeekers/RestoreWindowSeeker.cs rename to src/OnTopReplica/WindowSeekers/RestoreWindowSeeker.cs index ce4cbf8..dd3131a 100644 --- a/OnTopReplica/WindowSeekers/RestoreWindowSeeker.cs +++ b/src/OnTopReplica/WindowSeekers/RestoreWindowSeeker.cs @@ -1,61 +1,61 @@ -using System; -using System.Collections.Generic; -using System.Text; -using OnTopReplica.Native; - -namespace OnTopReplica.WindowSeekers { - - /// - /// Window seeker that attempts to locate a window to restore (by class, title and ID). - /// - class RestoreWindowSeeker : PointBasedWindowSeeker { - - public RestoreWindowSeeker(IntPtr handle, string title, string className){ - Handle = handle; - Title = title; - Class = className; - } - - public IntPtr Handle { get; private set; } - - public string Title { get; private set; } - - public string Class { get; private set; } - - protected override int EvaluatePoints(WindowHandle handle) { - if (!WindowManagerMethods.IsTopLevel(handle.Handle)) { - return -1; - } - - int points = 0; - - //Class exact match - if (!string.IsNullOrEmpty(Class)) { - string wndClass = handle.Class; - if (wndClass.Equals(Class, StringComparison.InvariantCulture)){ - points += 10; - } - } - - //Title match (may not be exact, but let's try) - if (!string.IsNullOrEmpty(Title) && !string.IsNullOrEmpty(handle.Title)) { - if (handle.Title.StartsWith(Title, StringComparison.InvariantCultureIgnoreCase)) { - points += 5; - } - if (handle.Title.Equals(Title, StringComparison.InvariantCultureIgnoreCase)) { - points += 10; - } - } - - //Handle match (will probably not work, but anyhow) - if (Handle != IntPtr.Zero) { - if (Handle == handle.Handle) { - points += 10; - } - } - - return points; - } - } - -} +using System; +using System.Collections.Generic; +using System.Text; +using OnTopReplica.Native; + +namespace OnTopReplica.WindowSeekers { + + /// + /// Window seeker that attempts to locate a window to restore (by class, title and ID). + /// + class RestoreWindowSeeker : PointBasedWindowSeeker { + + public RestoreWindowSeeker(IntPtr handle, string title, string className){ + Handle = handle; + Title = title; + Class = className; + } + + public IntPtr Handle { get; private set; } + + public string Title { get; private set; } + + public string Class { get; private set; } + + protected override int EvaluatePoints(WindowHandle handle) { + if (!WindowManagerMethods.IsTopLevel(handle.Handle)) { + return -1; + } + + int points = 0; + + //Class exact match + if (!string.IsNullOrEmpty(Class)) { + string wndClass = handle.Class; + if (wndClass.Equals(Class, StringComparison.InvariantCulture)){ + points += 10; + } + } + + //Title match (may not be exact, but let's try) + if (!string.IsNullOrEmpty(Title) && !string.IsNullOrEmpty(handle.Title)) { + if (handle.Title.StartsWith(Title, StringComparison.InvariantCultureIgnoreCase)) { + points += 5; + } + if (handle.Title.Equals(Title, StringComparison.InvariantCultureIgnoreCase)) { + points += 10; + } + } + + //Handle match (will probably not work, but anyhow) + if (Handle != IntPtr.Zero) { + if (Handle == handle.Handle) { + points += 10; + } + } + + return points; + } + } + +} diff --git a/OnTopReplica/WindowSeekers/TaskWindowSeeker.cs b/src/OnTopReplica/WindowSeekers/TaskWindowSeeker.cs similarity index 97% rename from OnTopReplica/WindowSeekers/TaskWindowSeeker.cs rename to src/OnTopReplica/WindowSeekers/TaskWindowSeeker.cs index c074da9..e7ed80e 100644 --- a/OnTopReplica/WindowSeekers/TaskWindowSeeker.cs +++ b/src/OnTopReplica/WindowSeekers/TaskWindowSeeker.cs @@ -1,52 +1,52 @@ -using System; -using System.Collections.Generic; -using System.Text; -using OnTopReplica.Native; - -namespace OnTopReplica.WindowSeekers { - /// - /// Window seeker that attempts to mimic ALT+TAB behavior in filtering windows to show. - /// - class TaskWindowSeeker : BaseWindowSeeker { - - List _list = new List(); - - public override IList Windows { - get { - return _list; - } - } - - public override void Refresh() { - _list.Clear(); - - base.Refresh(); - } - - protected override bool InspectWindow(WindowHandle handle) { - //Code taken from: http://www.thescarms.com/VBasic/alttab.aspx - - //Reject empty titles - if (string.IsNullOrEmpty(handle.Title)) - return true; - - //Accept windows that - // - are visible - // - do not have a parent - // - have no owner and are not Tool windows OR - // - have an owner and are App windows - if ((long)WindowManagerMethods.GetParent(handle.Handle) == 0) { - bool hasOwner = (long)WindowManagerMethods.GetWindow(handle.Handle, WindowManagerMethods.GetWindowMode.GW_OWNER) != 0; - WindowMethods.WindowExStyles exStyle = (WindowMethods.WindowExStyles)WindowMethods.GetWindowLong(handle.Handle, WindowMethods.WindowLong.ExStyle); - - if (((exStyle & WindowMethods.WindowExStyles.ToolWindow) == 0 && !hasOwner) || //unowned non-tool window - ((exStyle & WindowMethods.WindowExStyles.AppWindow) == WindowMethods.WindowExStyles.AppWindow && hasOwner)) { //owned application window - - _list.Add(handle); - } - } - - return true; - } - } -} +using System; +using System.Collections.Generic; +using System.Text; +using OnTopReplica.Native; + +namespace OnTopReplica.WindowSeekers { + /// + /// Window seeker that attempts to mimic ALT+TAB behavior in filtering windows to show. + /// + class TaskWindowSeeker : BaseWindowSeeker { + + List _list = new List(); + + public override IList Windows { + get { + return _list; + } + } + + public override void Refresh() { + _list.Clear(); + + base.Refresh(); + } + + protected override bool InspectWindow(WindowHandle handle) { + //Code taken from: http://www.thescarms.com/VBasic/alttab.aspx + + //Reject empty titles + if (string.IsNullOrEmpty(handle.Title)) + return true; + + //Accept windows that + // - are visible + // - do not have a parent + // - have no owner and are not Tool windows OR + // - have an owner and are App windows + if ((long)WindowManagerMethods.GetParent(handle.Handle) == 0) { + bool hasOwner = (long)WindowManagerMethods.GetWindow(handle.Handle, WindowManagerMethods.GetWindowMode.GW_OWNER) != 0; + WindowMethods.WindowExStyles exStyle = (WindowMethods.WindowExStyles)WindowMethods.GetWindowLong(handle.Handle, WindowMethods.WindowLong.ExStyle); + + if (((exStyle & WindowMethods.WindowExStyles.ToolWindow) == 0 && !hasOwner) || //unowned non-tool window + ((exStyle & WindowMethods.WindowExStyles.AppWindow) == WindowMethods.WindowExStyles.AppWindow && hasOwner)) { //owned application window + + _list.Add(handle); + } + } + + return true; + } + } +} diff --git a/OnTopReplica/WindowsFormsExtensions.cs b/src/OnTopReplica/WindowsFormsExtensions.cs similarity index 97% rename from OnTopReplica/WindowsFormsExtensions.cs rename to src/OnTopReplica/WindowsFormsExtensions.cs index a33e99c..96c2c9c 100644 --- a/OnTopReplica/WindowsFormsExtensions.cs +++ b/src/OnTopReplica/WindowsFormsExtensions.cs @@ -1,83 +1,83 @@ -using System; -using System.Collections.Generic; -using System.Drawing; -using System.Text; -using System.Windows.Forms; - -namespace OnTopReplica { - - /// - /// Extension methods for windows forms. - /// - static class WindowsFormsExtensions { - - /// - /// Internationalizes the text of a LinkLabel instance. - /// - /// Main text without link. Contains a '%' character which will be replaced by the link. - /// Linked text. - public static void Internationalize(this LinkLabel label, string text, string linkText) { - int linkIndex = text.IndexOf('%'); - if (linkIndex == -1) { - //Shouldn't happen, but try to fail with meaningful text - label.Text = text; - return; - } - - label.Text = text.Substring(0, linkIndex) + linkText + text.Substring(linkIndex + 1); - label.LinkArea = new LinkArea(linkIndex, linkText.Length); - } - - /// - /// Makes a safe GUI invoke on a form's GUI thread. - /// - /// The action to be executed on the GUI's thread. - /// - /// If the form is invalid or disposed, the action is not performed. - /// - public static void SafeInvoke(this Form form, Action action) { - if (form == null || form.IsDisposed) - return; - - if (form.InvokeRequired) { - form.Invoke(action); - } - else { - action(); - } - } - - /// - /// Checks whether a control contains a mouse pointer position in screen coordinates. - /// - /// Mouse pointer position in screen coordinates. - public static bool ContainsMousePointer(this Control ctrl, System.Drawing.Point screenCoordinates) { - var bb = new System.Drawing.Rectangle(ctrl.Location, ctrl.Size); - - return bb.Contains(screenCoordinates); - } - - /// - /// Fixes the Windows Forms default font for a control and its nested controls. - /// - /// - /// Since Windows Forms defaults to Tahoma as the system font, this method is used - /// to fix the default font for a control and all its children controls, setting it - /// to the system message box font (Segoe on recent Windows releases). - /// - public static void FixDefaultFont(this Control ctrl) { - ctrl.Font = SystemFonts.MessageBoxFont; - if (ctrl.Controls == null || ctrl.Controls.Count == 0) - return; - - foreach (Control subCtrl in ctrl.Controls) { - subCtrl.Font = SystemFonts.MessageBoxFont; - - if (subCtrl is GroupBox) { - subCtrl.FixDefaultFont(); - } - } - } - - } -} +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +namespace OnTopReplica { + + /// + /// Extension methods for windows forms. + /// + static class WindowsFormsExtensions { + + /// + /// Internationalizes the text of a LinkLabel instance. + /// + /// Main text without link. Contains a '%' character which will be replaced by the link. + /// Linked text. + public static void Internationalize(this LinkLabel label, string text, string linkText) { + int linkIndex = text.IndexOf('%'); + if (linkIndex == -1) { + //Shouldn't happen, but try to fail with meaningful text + label.Text = text; + return; + } + + label.Text = text.Substring(0, linkIndex) + linkText + text.Substring(linkIndex + 1); + label.LinkArea = new LinkArea(linkIndex, linkText.Length); + } + + /// + /// Makes a safe GUI invoke on a form's GUI thread. + /// + /// The action to be executed on the GUI's thread. + /// + /// If the form is invalid or disposed, the action is not performed. + /// + public static void SafeInvoke(this Form form, Action action) { + if (form == null || form.IsDisposed) + return; + + if (form.InvokeRequired) { + form.Invoke(action); + } + else { + action(); + } + } + + /// + /// Checks whether a control contains a mouse pointer position in screen coordinates. + /// + /// Mouse pointer position in screen coordinates. + public static bool ContainsMousePointer(this Control ctrl, System.Drawing.Point screenCoordinates) { + var bb = new System.Drawing.Rectangle(ctrl.Location, ctrl.Size); + + return bb.Contains(screenCoordinates); + } + + /// + /// Fixes the Windows Forms default font for a control and its nested controls. + /// + /// + /// Since Windows Forms defaults to Tahoma as the system font, this method is used + /// to fix the default font for a control and all its children controls, setting it + /// to the system message box font (Segoe on recent Windows releases). + /// + public static void FixDefaultFont(this Control ctrl) { + ctrl.Font = SystemFonts.MessageBoxFont; + if (ctrl.Controls == null || ctrl.Controls.Count == 0) + return; + + foreach (Control subCtrl in ctrl.Controls) { + subCtrl.Font = SystemFonts.MessageBoxFont; + + if (subCtrl is GroupBox) { + subCtrl.FixDefaultFont(); + } + } + } + + } +} diff --git a/OnTopReplica/app.config b/src/OnTopReplica/app.config similarity index 97% rename from OnTopReplica/app.config rename to src/OnTopReplica/app.config index c09a4d3..c46d772 100644 --- a/OnTopReplica/app.config +++ b/src/OnTopReplica/app.config @@ -1,78 +1,78 @@ - - - - -
- - - - - - - 255 - - - (Default) - - - True - - - True - - - True - - - True - - - False - - - False - - - 0, 0 - - - 0, 0 - - - False - - - - - - - - - 0 - - - [CTRL]+[SHIFT]+C - - - [CTRL]+[SHIFT]+O - - - Standard - - - True - - - - - - - - - - - - - - - + + + + +
+ + + + + + + 255 + + + (Default) + + + True + + + True + + + True + + + True + + + False + + + False + + + 0, 0 + + + 0, 0 + + + False + + + + + + + + + 0 + + + [CTRL]+[SHIFT]+C + + + [CTRL]+[SHIFT]+O + + + Standard + + + True + + + + + + + + + + + + + + + diff --git a/OnTopReplica/new-flat-icon.ico b/src/OnTopReplica/new-flat-icon.ico similarity index 100% rename from OnTopReplica/new-flat-icon.ico rename to src/OnTopReplica/new-flat-icon.ico diff --git a/OnTopReplica/packages.config b/src/OnTopReplica/packages.config similarity index 100% rename from OnTopReplica/packages.config rename to src/OnTopReplica/packages.config From 462b534c3871c5373c2ecac89951dab7d912646d Mon Sep 17 00:00:00 2001 From: Lorenz Cuno Klopfenstein Date: Tue, 10 Apr 2018 19:39:59 +0200 Subject: [PATCH 2/5] Update installer to use official MSI framework Co-authored-by: Andrew Metzger --- .gitignore | 1 + OriginalAssets/MSI-Banner.jpg | Bin 0 -> 22902 bytes OriginalAssets/MSI-Banner.psd | Bin 0 -> 1137348 bytes src/Installer/Installer.vdproj | 1079 ++++++++++++++++++++++++++++++++ src/Installer/License.rtf | 280 +++++++++ src/OnTopReplica.sln | 2 + 6 files changed, 1362 insertions(+) create mode 100644 OriginalAssets/MSI-Banner.jpg create mode 100644 OriginalAssets/MSI-Banner.psd create mode 100644 src/Installer/Installer.vdproj create mode 100644 src/Installer/License.rtf diff --git a/.gitignore b/.gitignore index 1ae0732..3a93508 100644 --- a/.gitignore +++ b/.gitignore @@ -3,6 +3,7 @@ **/obj/* **/publish/* Installer/OnTopReplica-Setup.exe +src/Installer/output/* *.user *.suo src/packages/* diff --git a/OriginalAssets/MSI-Banner.jpg b/OriginalAssets/MSI-Banner.jpg new file mode 100644 index 0000000000000000000000000000000000000000..61b3583918e326b3a8a901c03b5761d9f2f5ea15 GIT binary patch literal 22902 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 Axc~qF literal 0 HcmV?d00001 diff --git a/OriginalAssets/MSI-Banner.psd b/OriginalAssets/MSI-Banner.psd new file mode 100644 index 0000000000000000000000000000000000000000..65a83abb0e50d16b813533499a7d484e6d6c4a4a GIT binary patch literal 1137348 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 literal 0 HcmV?d00001 diff --git a/src/Installer/Installer.vdproj b/src/Installer/Installer.vdproj new file mode 100644 index 0000000..a82130d --- /dev/null +++ b/src/Installer/Installer.vdproj @@ -0,0 +1,1079 @@ +"DeployProject" +{ +"VSVersion" = "3:800" +"ProjectType" = "8:{978C614F-708E-4E1A-B201-565925725DBA}" +"IsWebType" = "8:FALSE" +"ProjectName" = "8:Installer" +"LanguageId" = "3:1033" +"CodePage" = "3:1252" +"UILanguageId" = "3:1033" +"SccProjectName" = "8:" +"SccLocalPath" = "8:" +"SccAuxPath" = "8:" +"SccProvider" = "8:" + "Hierarchy" + { + "Entry" + { + "MsmKey" = "8:_319A20BB77E042C79CBF244A8AC9008B" + "OwnerKey" = "8:_UNDEFINED" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_BB607179F88446409C91AC786E95410C" + "OwnerKey" = "8:_UNDEFINED" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_D3C25180BCEE4473B1A11D89CDBC502A" + "OwnerKey" = "8:_UNDEFINED" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_FD08D480081E2A6C3D1A5EA9C82FC43F" + "OwnerKey" = "8:_FD2FE03164614192A11D674CB6FD870E" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_FD2FE03164614192A11D674CB6FD870E" + "OwnerKey" = "8:_UNDEFINED" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_UNDEFINED" + "OwnerKey" = "8:_FD2FE03164614192A11D674CB6FD870E" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_UNDEFINED" + "OwnerKey" = "8:_FD08D480081E2A6C3D1A5EA9C82FC43F" + "MsmSig" = "8:_UNDEFINED" + } + } + "Configurations" + { + "Debug" + { + "DisplayName" = "8:Debug" + "IsDebugOnly" = "11:TRUE" + "IsReleaseOnly" = "11:FALSE" + "OutputFilename" = "8:output\\Debug\\OnTopReplica.msi" + "PackageFilesAs" = "3:2" + "PackageFileSize" = "3:-2147483648" + "CabType" = "3:1" + "Compression" = "3:1" + "SignOutput" = "11:FALSE" + "CertificateFile" = "8:" + "PrivateKeyFile" = "8:" + "TimeStampServer" = "8:" + "InstallerBootstrapper" = "3:2" + "BootstrapperCfg:{63ACBE69-63AA-4F98-B2B6-99F9E24495F2}" + { + "Enabled" = "11:TRUE" + "PromptEnabled" = "11:TRUE" + "PrerequisitesLocation" = "2:1" + "Url" = "8:" + "ComponentsUrl" = "8:" + "Items" + { + "{EDC2488A-8267-493A-A98E-7D9C3B36CDF3}:.NETFramework,Version=v4.6.1" + { + "Name" = "8:Microsoft .NET Framework 4.6.1 (x86 and x64)" + "ProductCode" = "8:.NETFramework,Version=v4.6.1" + } + } + } + } + "Release" + { + "DisplayName" = "8:Release" + "IsDebugOnly" = "11:FALSE" + "IsReleaseOnly" = "11:TRUE" + "OutputFilename" = "8:output\\OnTopReplica.msi" + "PackageFilesAs" = "3:2" + "PackageFileSize" = "3:-2147483648" + "CabType" = "3:1" + "Compression" = "3:3" + "SignOutput" = "11:FALSE" + "CertificateFile" = "8:" + "PrivateKeyFile" = "8:" + "TimeStampServer" = "8:" + "InstallerBootstrapper" = "3:2" + "BootstrapperCfg:{63ACBE69-63AA-4F98-B2B6-99F9E24495F2}" + { + "Enabled" = "11:TRUE" + "PromptEnabled" = "11:TRUE" + "PrerequisitesLocation" = "2:1" + "Url" = "8:" + "ComponentsUrl" = "8:" + "Items" + { + "{EDC2488A-8267-493A-A98E-7D9C3B36CDF3}:.NETFramework,Version=v4.6.1" + { + "Name" = "8:Microsoft .NET Framework 4.6.1 (x86 and x64)" + "ProductCode" = "8:.NETFramework,Version=v4.6.1" + } + } + } + } + } + "Deployable" + { + "CustomAction" + { + } + "DefaultFeature" + { + "Name" = "8:DefaultFeature" + "Title" = "8:" + "Description" = "8:" + } + "ExternalPersistence" + { + "LaunchCondition" + { + "{A06ECF26-33A3-4562-8140-9B0E340D4F24}:_6287D695928B4C80A2CB1745DB1A7AB6" + { + "Name" = "8:.NET Framework" + "Message" = "8:[VSDNETMSG]" + "FrameworkVersion" = "8:.NETFramework,Version=v4.7" + "AllowLaterVersions" = "11:FALSE" + "InstallUrl" = "8:http://go.microsoft.com/fwlink/?LinkId=671728" + } + } + } + "File" + { + "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_319A20BB77E042C79CBF244A8AC9008B" + { + "SourcePath" = "8:..\\..\\OriginalAssets\\MSI-Banner.jpg" + "TargetName" = "8:Banner.jpg" + "Tag" = "8:" + "Folder" = "8:_92458F5B5377456CB04EFACB28735CC9" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:TRUE" + "IsDependency" = "11:FALSE" + "IsolateTo" = "8:" + } + "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_BB607179F88446409C91AC786E95410C" + { + "SourcePath" = "8:..\\..\\OriginalAssets\\new-flat-icon.ico" + "TargetName" = "8:OnTopReplica.ico" + "Tag" = "8:" + "Folder" = "8:_92458F5B5377456CB04EFACB28735CC9" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:FALSE" + "IsDependency" = "11:FALSE" + "IsolateTo" = "8:" + } + "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_D3C25180BCEE4473B1A11D89CDBC502A" + { + "SourcePath" = "8:License.rtf" + "TargetName" = "8:License.rtf" + "Tag" = "8:" + "Folder" = "8:_92458F5B5377456CB04EFACB28735CC9" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:FALSE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:FALSE" + "IsDependency" = "11:FALSE" + "IsolateTo" = "8:" + } + "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_FD08D480081E2A6C3D1A5EA9C82FC43F" + { + "AssemblyRegister" = "3:1" + "AssemblyIsInGAC" = "11:FALSE" + "AssemblyAsmDisplayName" = "8:WindowsFormsAero, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL" + "ScatterAssemblies" + { + "_FD08D480081E2A6C3D1A5EA9C82FC43F" + { + "Name" = "8:WindowsFormsAero.dll" + "Attributes" = "3:512" + } + } + "SourcePath" = "8:WindowsFormsAero.dll" + "TargetName" = "8:" + "Tag" = "8:" + "Folder" = "8:_92458F5B5377456CB04EFACB28735CC9" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:FALSE" + "IsDependency" = "11:TRUE" + "IsolateTo" = "8:" + } + } + "FileType" + { + } + "Folder" + { + "{1525181F-901A-416C-8A58-119130FE478E}:_39F91DA891324B10BB3097F6C6192D17" + { + "Name" = "8:#1916" + "AlwaysCreate" = "11:FALSE" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Property" = "8:DesktopFolder" + "Folders" + { + } + } + "{3C67513D-01DD-4637-8A68-80971EB9504F}:_92458F5B5377456CB04EFACB28735CC9" + { + "DefaultLocation" = "8:[ProgramFilesFolder][Manufacturer]\\[ProductName]" + "Name" = "8:#1925" + "AlwaysCreate" = "11:FALSE" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Property" = "8:TARGETDIR" + "Folders" + { + } + } + "{1525181F-901A-416C-8A58-119130FE478E}:_D7945C5E68734EF188D34AAA8A31C6A7" + { + "Name" = "8:#1919" + "AlwaysCreate" = "11:FALSE" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Property" = "8:ProgramMenuFolder" + "Folders" + { + "{9EF0B969-E518-4E46-987F-47570745A589}:_EA7A7A42B4AB4CABAB8BC207D3B32817" + { + "Name" = "8:OnTopReplica" + "AlwaysCreate" = "11:FALSE" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Property" = "8:_38347EA89D4741678885DE56D7E00BCE" + "Folders" + { + } + } + } + } + } + "LaunchCondition" + { + } + "Locator" + { + } + "MsiBootstrapper" + { + "LangId" = "3:1033" + "RequiresElevation" = "11:FALSE" + } + "Product" + { + "Name" = "8:Microsoft Visual Studio" + "ProductName" = "8:OnTopReplica" + "ProductCode" = "8:{524E0F6C-A2D8-434C-A32D-3BCBF17FC5C6}" + "PackageCode" = "8:{CA4567E0-2134-40DD-AB06-06E910C7A253}" + "UpgradeCode" = "8:{6EBB4E0A-1F0C-4302-AC60-45E05F641909}" + "AspNetVersion" = "8:2.0.50727.0" + "RestartWWWService" = "11:FALSE" + "RemovePreviousVersions" = "11:FALSE" + "DetectNewerInstalledVersion" = "11:TRUE" + "InstallAllUsers" = "11:FALSE" + "ProductVersion" = "8:3.6.0" + "Manufacturer" = "8:OnTopReplica" + "ARPHELPTELEPHONE" = "8:" + "ARPHELPLINK" = "8:https://github.com/LorenzCK/OnTopReplica/issues" + "Title" = "8:OnTopReplica" + "Subject" = "8:" + "ARPCONTACT" = "8:OnTopReplica" + "Keywords" = "8:" + "ARPCOMMENTS" = "8:A real-time always-on-top \"replica\" of a window of your choice." + "ARPURLINFOABOUT" = "8:https://github.com/LorenzCK/OnTopReplica" + "ARPPRODUCTICON" = "8:_FD2FE03164614192A11D674CB6FD870E" + "ARPIconIndex" = "3:32512" + "SearchPath" = "8:" + "UseSystemSearchPath" = "11:TRUE" + "TargetPlatform" = "3:0" + "PreBuildEvent" = "8:" + "PostBuildEvent" = "8:" + "RunPostBuildEvent" = "3:0" + } + "Registry" + { + "HKLM" + { + "Keys" + { + "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_75ACA2F29356477081EF42E65D9750BB" + { + "Name" = "8:Software" + "Condition" = "8:" + "AlwaysCreate" = "11:FALSE" + "DeleteAtUninstall" = "11:FALSE" + "Transitive" = "11:FALSE" + "Keys" + { + "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_83CD92CF40EC4A53AC86B621BACFD757" + { + "Name" = "8:[Manufacturer]" + "Condition" = "8:" + "AlwaysCreate" = "11:FALSE" + "DeleteAtUninstall" = "11:FALSE" + "Transitive" = "11:FALSE" + "Keys" + { + } + "Values" + { + } + } + } + "Values" + { + } + } + } + } + "HKCU" + { + "Keys" + { + "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_6446453E7DC84933AED548CDEA576D48" + { + "Name" = "8:Software" + "Condition" = "8:" + "AlwaysCreate" = "11:FALSE" + "DeleteAtUninstall" = "11:FALSE" + "Transitive" = "11:FALSE" + "Keys" + { + "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_BD1A2D496DF148E2BEFC9AD2C98F8611" + { + "Name" = "8:[Manufacturer]" + "Condition" = "8:" + "AlwaysCreate" = "11:FALSE" + "DeleteAtUninstall" = "11:FALSE" + "Transitive" = "11:FALSE" + "Keys" + { + } + "Values" + { + } + } + } + "Values" + { + } + } + } + } + "HKCR" + { + "Keys" + { + } + } + "HKU" + { + "Keys" + { + } + } + "HKPU" + { + "Keys" + { + } + } + } + "Sequences" + { + } + "Shortcut" + { + "{970C0BB2-C7D0-45D7-ABFA-7EC378858BC0}:_381FA0AB74B2445CBE3694F9CF6878E7" + { + "Name" = "8:OnTopReplica" + "Arguments" = "8:" + "Description" = "8:" + "ShowCmd" = "3:1" + "IconIndex" = "3:0" + "Transitive" = "11:FALSE" + "Target" = "8:_FD2FE03164614192A11D674CB6FD870E" + "Folder" = "8:_EA7A7A42B4AB4CABAB8BC207D3B32817" + "WorkingFolder" = "8:_92458F5B5377456CB04EFACB28735CC9" + "Icon" = "8:_BB607179F88446409C91AC786E95410C" + "Feature" = "8:" + } + "{970C0BB2-C7D0-45D7-ABFA-7EC378858BC0}:_91FD25A1D4E9441B9BADF46738B5D411" + { + "Name" = "8:OnTopReplica" + "Arguments" = "8:" + "Description" = "8:" + "ShowCmd" = "3:1" + "IconIndex" = "3:0" + "Transitive" = "11:FALSE" + "Target" = "8:_FD2FE03164614192A11D674CB6FD870E" + "Folder" = "8:_39F91DA891324B10BB3097F6C6192D17" + "WorkingFolder" = "8:_92458F5B5377456CB04EFACB28735CC9" + "Icon" = "8:_BB607179F88446409C91AC786E95410C" + "Feature" = "8:" + } + } + "UserInterface" + { + "{DF760B10-853B-4699-99F2-AFF7185B4A62}:_04062E4A5F884A9A88BE725AA4858FD5" + { + "Name" = "8:#1901" + "Sequence" = "3:1" + "Attributes" = "3:2" + "Dialogs" + { + "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_F2036274E6D3481784F9B496B7B0F101" + { + "Sequence" = "3:100" + "DisplayName" = "8:Progress" + "UseDynamicProperties" = "11:TRUE" + "IsDependency" = "11:FALSE" + "SourcePath" = "8:\\VsdProgressDlg.wid" + "Properties" + { + "BannerBitmap" + { + "Name" = "8:BannerBitmap" + "DisplayName" = "8:#1001" + "Description" = "8:#1101" + "Type" = "3:8" + "ContextData" = "8:Bitmap" + "Attributes" = "3:4" + "Setting" = "3:2" + "Value" = "8:_319A20BB77E042C79CBF244A8AC9008B" + "UsePlugInResources" = "11:TRUE" + } + "ShowProgress" + { + "Name" = "8:ShowProgress" + "DisplayName" = "8:#1009" + "Description" = "8:#1109" + "Type" = "3:5" + "ContextData" = "8:1;True=1;False=0" + "Attributes" = "3:0" + "Setting" = "3:0" + "Value" = "3:0" + "DefaultValue" = "3:1" + "UsePlugInResources" = "11:TRUE" + } + } + } + } + } + "{DF760B10-853B-4699-99F2-AFF7185B4A62}:_1359813225EA4FD080A0F2636C1F1244" + { + "Name" = "8:#1901" + "Sequence" = "3:2" + "Attributes" = "3:2" + "Dialogs" + { + "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_2BFE10B595934538ACBFBBE56C2FA80E" + { + "Sequence" = "3:100" + "DisplayName" = "8:Progress" + "UseDynamicProperties" = "11:TRUE" + "IsDependency" = "11:FALSE" + "SourcePath" = "8:\\VsdAdminProgressDlg.wid" + "Properties" + { + "BannerBitmap" + { + "Name" = "8:BannerBitmap" + "DisplayName" = "8:#1001" + "Description" = "8:#1101" + "Type" = "3:8" + "ContextData" = "8:Bitmap" + "Attributes" = "3:4" + "Setting" = "3:2" + "Value" = "8:_319A20BB77E042C79CBF244A8AC9008B" + "UsePlugInResources" = "11:TRUE" + } + "ShowProgress" + { + "Name" = "8:ShowProgress" + "DisplayName" = "8:#1009" + "Description" = "8:#1109" + "Type" = "3:5" + "ContextData" = "8:1;True=1;False=0" + "Attributes" = "3:0" + "Setting" = "3:0" + "Value" = "3:0" + "DefaultValue" = "3:1" + "UsePlugInResources" = "11:TRUE" + } + } + } + } + } + "{2479F3F5-0309-486D-8047-8187E2CE5BA0}:_1E7B1612E20349FCA2500AB06AE3CFF4" + { + "UseDynamicProperties" = "11:FALSE" + "IsDependency" = "11:FALSE" + "SourcePath" = "8:\\VsdBasicDialogs.wim" + } + "{2479F3F5-0309-486D-8047-8187E2CE5BA0}:_8614ABEB62734D3C8596DA17EA40CBB3" + { + "UseDynamicProperties" = "11:FALSE" + "IsDependency" = "11:FALSE" + "SourcePath" = "8:\\VsdUserInterface.wim" + } + "{DF760B10-853B-4699-99F2-AFF7185B4A62}:_A06981061BC74B049198244D6B78281D" + { + "Name" = "8:#1902" + "Sequence" = "3:1" + "Attributes" = "3:3" + "Dialogs" + { + "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_B4F64DBEAE8340FDA4A19665DEF1AFC4" + { + "Sequence" = "3:100" + "DisplayName" = "8:Finished" + "UseDynamicProperties" = "11:TRUE" + "IsDependency" = "11:FALSE" + "SourcePath" = "8:\\VsdFinishedDlg.wid" + "Properties" + { + "BannerBitmap" + { + "Name" = "8:BannerBitmap" + "DisplayName" = "8:#1001" + "Description" = "8:#1101" + "Type" = "3:8" + "ContextData" = "8:Bitmap" + "Attributes" = "3:4" + "Setting" = "3:2" + "Value" = "8:_319A20BB77E042C79CBF244A8AC9008B" + "UsePlugInResources" = "11:TRUE" + } + "UpdateText" + { + "Name" = "8:UpdateText" + "DisplayName" = "8:#1058" + "Description" = "8:#1158" + "Type" = "3:15" + "ContextData" = "8:" + "Attributes" = "3:0" + "Setting" = "3:1" + "Value" = "8:#1258" + "DefaultValue" = "8:#1258" + "UsePlugInResources" = "11:TRUE" + } + } + } + } + } + "{DF760B10-853B-4699-99F2-AFF7185B4A62}:_BB55DEF2BBCF433B80AA6D8554496547" + { + "Name" = "8:#1902" + "Sequence" = "3:2" + "Attributes" = "3:3" + "Dialogs" + { + "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_B69C1D98FF134F1FA79F152CAC0A5668" + { + "Sequence" = "3:100" + "DisplayName" = "8:Finished" + "UseDynamicProperties" = "11:TRUE" + "IsDependency" = "11:FALSE" + "SourcePath" = "8:\\VsdAdminFinishedDlg.wid" + "Properties" + { + "BannerBitmap" + { + "Name" = "8:BannerBitmap" + "DisplayName" = "8:#1001" + "Description" = "8:#1101" + "Type" = "3:8" + "ContextData" = "8:Bitmap" + "Attributes" = "3:4" + "Setting" = "3:2" + "Value" = "8:_319A20BB77E042C79CBF244A8AC9008B" + "UsePlugInResources" = "11:TRUE" + } + } + } + } + } + "{DF760B10-853B-4699-99F2-AFF7185B4A62}:_D994258687FF4FAFB4609E876AC88759" + { + "Name" = "8:#1900" + "Sequence" = "3:1" + "Attributes" = "3:1" + "Dialogs" + { + "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_365EC6F1B89A4972A297288F4D40851F" + { + "Sequence" = "3:110" + "DisplayName" = "8:License Agreement" + "UseDynamicProperties" = "11:TRUE" + "IsDependency" = "11:FALSE" + "SourcePath" = "8:\\VsdLicenseDlg.wid" + "Properties" + { + "BannerBitmap" + { + "Name" = "8:BannerBitmap" + "DisplayName" = "8:#1001" + "Description" = "8:#1101" + "Type" = "3:8" + "ContextData" = "8:Bitmap" + "Attributes" = "3:4" + "Setting" = "3:2" + "Value" = "8:_319A20BB77E042C79CBF244A8AC9008B" + "UsePlugInResources" = "11:TRUE" + } + "EulaText" + { + "Name" = "8:EulaText" + "DisplayName" = "8:#1008" + "Description" = "8:#1108" + "Type" = "3:6" + "ContextData" = "8:" + "Attributes" = "3:0" + "Setting" = "3:2" + "Value" = "8:_D3C25180BCEE4473B1A11D89CDBC502A" + "UsePlugInResources" = "11:TRUE" + } + "Sunken" + { + "Name" = "8:Sunken" + "DisplayName" = "8:#1007" + "Description" = "8:#1107" + "Type" = "3:5" + "ContextData" = "8:4;True=4;False=0" + "Attributes" = "3:0" + "Setting" = "3:0" + "Value" = "3:4" + "DefaultValue" = "3:4" + "UsePlugInResources" = "11:TRUE" + } + } + } + "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_66AD7A587A7F4A96A2FFCFD403C2452E" + { + "Sequence" = "3:100" + "DisplayName" = "8:Welcome" + "UseDynamicProperties" = "11:TRUE" + "IsDependency" = "11:FALSE" + "SourcePath" = "8:\\VsdWelcomeDlg.wid" + "Properties" + { + "BannerBitmap" + { + "Name" = "8:BannerBitmap" + "DisplayName" = "8:#1001" + "Description" = "8:#1101" + "Type" = "3:8" + "ContextData" = "8:Bitmap" + "Attributes" = "3:4" + "Setting" = "3:2" + "Value" = "8:_319A20BB77E042C79CBF244A8AC9008B" + "UsePlugInResources" = "11:TRUE" + } + "CopyrightWarning" + { + "Name" = "8:CopyrightWarning" + "DisplayName" = "8:#1002" + "Description" = "8:#1102" + "Type" = "3:3" + "ContextData" = "8:" + "Attributes" = "3:0" + "Setting" = "3:2" + "Value" = "8:" + "DefaultValue" = "8:#1202" + "UsePlugInResources" = "11:TRUE" + } + "Welcome" + { + "Name" = "8:Welcome" + "DisplayName" = "8:#1003" + "Description" = "8:#1103" + "Type" = "3:3" + "ContextData" = "8:" + "Attributes" = "3:0" + "Setting" = "3:1" + "Value" = "8:#1203" + "DefaultValue" = "8:#1203" + "UsePlugInResources" = "11:TRUE" + } + } + } + "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_96232CE9027B407AB1E65F1BDF5B4163" + { + "Sequence" = "3:200" + "DisplayName" = "8:Installation Folder" + "UseDynamicProperties" = "11:TRUE" + "IsDependency" = "11:FALSE" + "SourcePath" = "8:\\VsdFolderDlg.wid" + "Properties" + { + "BannerBitmap" + { + "Name" = "8:BannerBitmap" + "DisplayName" = "8:#1001" + "Description" = "8:#1101" + "Type" = "3:8" + "ContextData" = "8:Bitmap" + "Attributes" = "3:4" + "Setting" = "3:2" + "Value" = "8:_319A20BB77E042C79CBF244A8AC9008B" + "UsePlugInResources" = "11:TRUE" + } + "InstallAllUsersVisible" + { + "Name" = "8:InstallAllUsersVisible" + "DisplayName" = "8:#1059" + "Description" = "8:#1159" + "Type" = "3:5" + "ContextData" = "8:1;True=1;False=0" + "Attributes" = "3:0" + "Setting" = "3:0" + "Value" = "3:1" + "DefaultValue" = "3:1" + "UsePlugInResources" = "11:TRUE" + } + } + } + "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_CB0FAE20A33240CBB403017452096114" + { + "Sequence" = "3:300" + "DisplayName" = "8:Confirm Installation" + "UseDynamicProperties" = "11:TRUE" + "IsDependency" = "11:FALSE" + "SourcePath" = "8:\\VsdConfirmDlg.wid" + "Properties" + { + "BannerBitmap" + { + "Name" = "8:BannerBitmap" + "DisplayName" = "8:#1001" + "Description" = "8:#1101" + "Type" = "3:8" + "ContextData" = "8:Bitmap" + "Attributes" = "3:4" + "Setting" = "3:2" + "Value" = "8:_319A20BB77E042C79CBF244A8AC9008B" + "UsePlugInResources" = "11:TRUE" + } + } + } + } + } + "{DF760B10-853B-4699-99F2-AFF7185B4A62}:_EE33306A772245E6B0421F69E1B7DA54" + { + "Name" = "8:#1900" + "Sequence" = "3:2" + "Attributes" = "3:1" + "Dialogs" + { + "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_0F96AC886F3147FDAABE791733F0EF56" + { + "Sequence" = "3:210" + "DisplayName" = "8:License Agreement" + "UseDynamicProperties" = "11:TRUE" + "IsDependency" = "11:FALSE" + "SourcePath" = "8:\\VsdAdminLicenseDlg.wid" + "Properties" + { + "BannerBitmap" + { + "Name" = "8:BannerBitmap" + "DisplayName" = "8:#1001" + "Description" = "8:#1101" + "Type" = "3:8" + "ContextData" = "8:Bitmap" + "Attributes" = "3:4" + "Setting" = "3:2" + "Value" = "8:_319A20BB77E042C79CBF244A8AC9008B" + "UsePlugInResources" = "11:TRUE" + } + "EulaText" + { + "Name" = "8:EulaText" + "DisplayName" = "8:#1008" + "Description" = "8:#1108" + "Type" = "3:6" + "ContextData" = "8:" + "Attributes" = "3:0" + "Setting" = "3:2" + "Value" = "8:_D3C25180BCEE4473B1A11D89CDBC502A" + "UsePlugInResources" = "11:TRUE" + } + "Sunken" + { + "Name" = "8:Sunken" + "DisplayName" = "8:#1007" + "Description" = "8:#1107" + "Type" = "3:5" + "ContextData" = "8:4;True=4;False=0" + "Attributes" = "3:0" + "Setting" = "3:0" + "Value" = "3:4" + "DefaultValue" = "3:4" + "UsePlugInResources" = "11:TRUE" + } + } + } + "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_7D5E947D3BC24B6FA3BA8B6540F423C8" + { + "Sequence" = "3:300" + "DisplayName" = "8:Confirm Installation" + "UseDynamicProperties" = "11:TRUE" + "IsDependency" = "11:FALSE" + "SourcePath" = "8:\\VsdAdminConfirmDlg.wid" + "Properties" + { + "BannerBitmap" + { + "Name" = "8:BannerBitmap" + "DisplayName" = "8:#1001" + "Description" = "8:#1101" + "Type" = "3:8" + "ContextData" = "8:Bitmap" + "Attributes" = "3:4" + "Setting" = "3:2" + "Value" = "8:_319A20BB77E042C79CBF244A8AC9008B" + "UsePlugInResources" = "11:TRUE" + } + } + } + "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_85F402CAAD1C473A8EE7D68271577C9E" + { + "Sequence" = "3:220" + "DisplayName" = "8:Installation Folder" + "UseDynamicProperties" = "11:TRUE" + "IsDependency" = "11:FALSE" + "SourcePath" = "8:\\VsdAdminFolderDlg.wid" + "Properties" + { + "BannerBitmap" + { + "Name" = "8:BannerBitmap" + "DisplayName" = "8:#1001" + "Description" = "8:#1101" + "Type" = "3:8" + "ContextData" = "8:Bitmap" + "Attributes" = "3:4" + "Setting" = "3:2" + "Value" = "8:_319A20BB77E042C79CBF244A8AC9008B" + "UsePlugInResources" = "11:TRUE" + } + } + } + "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_B65A6A257B8840AFAA250ADDB5B3840B" + { + "Sequence" = "3:100" + "DisplayName" = "8:Welcome" + "UseDynamicProperties" = "11:TRUE" + "IsDependency" = "11:FALSE" + "SourcePath" = "8:\\VsdAdminWelcomeDlg.wid" + "Properties" + { + "BannerBitmap" + { + "Name" = "8:BannerBitmap" + "DisplayName" = "8:#1001" + "Description" = "8:#1101" + "Type" = "3:8" + "ContextData" = "8:Bitmap" + "Attributes" = "3:4" + "Setting" = "3:2" + "Value" = "8:_319A20BB77E042C79CBF244A8AC9008B" + "UsePlugInResources" = "11:TRUE" + } + "CopyrightWarning" + { + "Name" = "8:CopyrightWarning" + "DisplayName" = "8:#1002" + "Description" = "8:#1102" + "Type" = "3:3" + "ContextData" = "8:" + "Attributes" = "3:0" + "Setting" = "3:2" + "Value" = "8:" + "DefaultValue" = "8:#1202" + "UsePlugInResources" = "11:TRUE" + } + "Welcome" + { + "Name" = "8:Welcome" + "DisplayName" = "8:#1003" + "Description" = "8:#1103" + "Type" = "3:3" + "ContextData" = "8:" + "Attributes" = "3:0" + "Setting" = "3:1" + "Value" = "8:#1203" + "DefaultValue" = "8:#1203" + "UsePlugInResources" = "11:TRUE" + } + } + } + } + } + } + "MergeModule" + { + } + "ProjectOutput" + { + "{5259A561-127C-4D43-A0A1-72F10C7B3BF8}:_864534FF38F740E88938F02A5C2D01F3" + { + "SourcePath" = "8:" + "TargetName" = "8:" + "Tag" = "8:" + "Folder" = "8:_92458F5B5377456CB04EFACB28735CC9" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:FALSE" + "IsDependency" = "11:FALSE" + "IsolateTo" = "8:" + "ProjectOutputGroupRegister" = "3:1" + "OutputConfiguration" = "8:" + "OutputGroupCanonicalName" = "8:LocalizedResourceDlls" + "OutputProjectGuid" = "8:{E626BD6E-BF38-4EB7-A128-5CA6F40EF557}" + "ShowKeyOutput" = "11:TRUE" + "ExcludeFilters" + { + } + } + "{5259A561-127C-4D43-A0A1-72F10C7B3BF8}:_AADBDF08E1AE45F9982EBCF2EC495AD4" + { + "SourcePath" = "8:" + "TargetName" = "8:" + "Tag" = "8:" + "Folder" = "8:_92458F5B5377456CB04EFACB28735CC9" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:FALSE" + "IsDependency" = "11:FALSE" + "IsolateTo" = "8:" + "ProjectOutputGroupRegister" = "3:1" + "OutputConfiguration" = "8:" + "OutputGroupCanonicalName" = "8:RuntimeImplementation" + "OutputProjectGuid" = "8:{E626BD6E-BF38-4EB7-A128-5CA6F40EF557}" + "ShowKeyOutput" = "11:TRUE" + "ExcludeFilters" + { + } + } + "{5259A561-127C-4D43-A0A1-72F10C7B3BF8}:_BEC858EFB2E549A09A5F4EA938205698" + { + "SourcePath" = "8:" + "TargetName" = "8:" + "Tag" = "8:" + "Folder" = "8:_92458F5B5377456CB04EFACB28735CC9" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:FALSE" + "IsDependency" = "11:FALSE" + "IsolateTo" = "8:" + "ProjectOutputGroupRegister" = "3:1" + "OutputConfiguration" = "8:" + "OutputGroupCanonicalName" = "8:Documentation" + "OutputProjectGuid" = "8:{E626BD6E-BF38-4EB7-A128-5CA6F40EF557}" + "ShowKeyOutput" = "11:TRUE" + "ExcludeFilters" + { + } + } + "{5259A561-127C-4D43-A0A1-72F10C7B3BF8}:_FD2FE03164614192A11D674CB6FD870E" + { + "SourcePath" = "8:..\\OnTopReplica\\obj\\Release\\OnTopReplica.exe" + "TargetName" = "8:" + "Tag" = "8:" + "Folder" = "8:_92458F5B5377456CB04EFACB28735CC9" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:FALSE" + "IsDependency" = "11:FALSE" + "IsolateTo" = "8:" + "ProjectOutputGroupRegister" = "3:1" + "OutputConfiguration" = "8:" + "OutputGroupCanonicalName" = "8:Built" + "OutputProjectGuid" = "8:{E626BD6E-BF38-4EB7-A128-5CA6F40EF557}" + "ShowKeyOutput" = "11:TRUE" + "ExcludeFilters" + { + } + } + } + } +} diff --git a/src/Installer/License.rtf b/src/Installer/License.rtf new file mode 100644 index 0000000..334ec41 --- /dev/null +++ b/src/Installer/License.rtf @@ -0,0 +1,280 @@ +{\rtf1\adeflang1025\ansi\ansicpg1252\uc1\adeff0\deff0\stshfdbch31505\stshfloch31506\stshfhich31506\stshfbi0\deflang1033\deflangfe1033\themelang1033\themelangfe0\themelangcs0{\fonttbl{\f0\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\f34\fbidi \froman\fcharset0\fprq2{\*\panose 02040503050406030204}Cambria Math;} +{\f37\fbidi \fswiss\fcharset0\fprq2{\*\panose 020f0502020204030204}Calibri;}{\flomajor\f31500\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;} +{\fdbmajor\f31501\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\fhimajor\f31502\fbidi \fswiss\fcharset0\fprq2{\*\panose 020f0302020204030204}Calibri Light;} +{\fbimajor\f31503\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\flominor\f31504\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;} +{\fdbminor\f31505\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\fhiminor\f31506\fbidi \fswiss\fcharset0\fprq2{\*\panose 020f0502020204030204}Calibri;} +{\fbiminor\f31507\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\f40\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\f41\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;} +{\f43\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\f44\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\f45\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\f46\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);} +{\f47\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\f48\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\f380\fbidi \froman\fcharset238\fprq2 Cambria Math CE;}{\f381\fbidi \froman\fcharset204\fprq2 Cambria Math Cyr;} +{\f383\fbidi \froman\fcharset161\fprq2 Cambria Math Greek;}{\f384\fbidi \froman\fcharset162\fprq2 Cambria Math Tur;}{\f387\fbidi \froman\fcharset186\fprq2 Cambria Math Baltic;}{\f388\fbidi \froman\fcharset163\fprq2 Cambria Math (Vietnamese);} +{\f410\fbidi \fswiss\fcharset238\fprq2 Calibri CE;}{\f411\fbidi \fswiss\fcharset204\fprq2 Calibri Cyr;}{\f413\fbidi \fswiss\fcharset161\fprq2 Calibri Greek;}{\f414\fbidi \fswiss\fcharset162\fprq2 Calibri Tur;} +{\f415\fbidi \fswiss\fcharset177\fprq2 Calibri (Hebrew);}{\f416\fbidi \fswiss\fcharset178\fprq2 Calibri (Arabic);}{\f417\fbidi \fswiss\fcharset186\fprq2 Calibri Baltic;}{\f418\fbidi \fswiss\fcharset163\fprq2 Calibri (Vietnamese);} +{\flomajor\f31508\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\flomajor\f31509\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\flomajor\f31511\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;} +{\flomajor\f31512\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\flomajor\f31513\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\flomajor\f31514\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);} +{\flomajor\f31515\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\flomajor\f31516\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\fdbmajor\f31518\fbidi \froman\fcharset238\fprq2 Times New Roman CE;} +{\fdbmajor\f31519\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\fdbmajor\f31521\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\fdbmajor\f31522\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;} +{\fdbmajor\f31523\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\fdbmajor\f31524\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\fdbmajor\f31525\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;} +{\fdbmajor\f31526\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\fhimajor\f31528\fbidi \fswiss\fcharset238\fprq2 Calibri Light CE;}{\fhimajor\f31529\fbidi \fswiss\fcharset204\fprq2 Calibri Light Cyr;} +{\fhimajor\f31531\fbidi \fswiss\fcharset161\fprq2 Calibri Light Greek;}{\fhimajor\f31532\fbidi \fswiss\fcharset162\fprq2 Calibri Light Tur;}{\fhimajor\f31533\fbidi \fswiss\fcharset177\fprq2 Calibri Light (Hebrew);} +{\fhimajor\f31534\fbidi \fswiss\fcharset178\fprq2 Calibri Light (Arabic);}{\fhimajor\f31535\fbidi \fswiss\fcharset186\fprq2 Calibri Light Baltic;}{\fhimajor\f31536\fbidi \fswiss\fcharset163\fprq2 Calibri Light (Vietnamese);} +{\fbimajor\f31538\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\fbimajor\f31539\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\fbimajor\f31541\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;} +{\fbimajor\f31542\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\fbimajor\f31543\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\fbimajor\f31544\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);} +{\fbimajor\f31545\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\fbimajor\f31546\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\flominor\f31548\fbidi \froman\fcharset238\fprq2 Times New Roman CE;} +{\flominor\f31549\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\flominor\f31551\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\flominor\f31552\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;} +{\flominor\f31553\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\flominor\f31554\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\flominor\f31555\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;} +{\flominor\f31556\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\fdbminor\f31558\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\fdbminor\f31559\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;} +{\fdbminor\f31561\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\fdbminor\f31562\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\fdbminor\f31563\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);} +{\fdbminor\f31564\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\fdbminor\f31565\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\fdbminor\f31566\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);} +{\fhiminor\f31568\fbidi \fswiss\fcharset238\fprq2 Calibri CE;}{\fhiminor\f31569\fbidi \fswiss\fcharset204\fprq2 Calibri Cyr;}{\fhiminor\f31571\fbidi \fswiss\fcharset161\fprq2 Calibri Greek;}{\fhiminor\f31572\fbidi \fswiss\fcharset162\fprq2 Calibri Tur;} +{\fhiminor\f31573\fbidi \fswiss\fcharset177\fprq2 Calibri (Hebrew);}{\fhiminor\f31574\fbidi \fswiss\fcharset178\fprq2 Calibri (Arabic);}{\fhiminor\f31575\fbidi \fswiss\fcharset186\fprq2 Calibri Baltic;} +{\fhiminor\f31576\fbidi \fswiss\fcharset163\fprq2 Calibri (Vietnamese);}{\fbiminor\f31578\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\fbiminor\f31579\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;} +{\fbiminor\f31581\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\fbiminor\f31582\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\fbiminor\f31583\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);} +{\fbiminor\f31584\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\fbiminor\f31585\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\fbiminor\f31586\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}} +{\colortbl;\red0\green0\blue0;\red0\green0\blue255;\red0\green255\blue255;\red0\green255\blue0;\red255\green0\blue255;\red255\green0\blue0;\red255\green255\blue0;\red255\green255\blue255;\red0\green0\blue128;\red0\green128\blue128;\red0\green128\blue0; +\red128\green0\blue128;\red128\green0\blue0;\red128\green128\blue0;\red128\green128\blue128;\red192\green192\blue192;}{\*\defchp \fs22\loch\af31506\hich\af31506\dbch\af31505 }{\*\defpap \ql \li0\ri0\sa160\sl259\slmult1 +\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 }\noqfpromote {\stylesheet{\ql \li0\ri0\sa160\sl259\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 +\fs22\lang1033\langfe1033\loch\f31506\hich\af31506\dbch\af31505\cgrid\langnp1033\langfenp1033 \snext0 \sqformat \spriority0 Normal;}{\s1\ql \li0\ri0\sb240\sa60\sl259\slmult1 +\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel0\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af0\afs32\alang1025 \ltrch\fcs0 \b\fs32\lang1033\langfe1033\kerning32\loch\f31502\hich\af31502\dbch\af31501\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext0 \slink15 \sqformat \spriority9 \styrsid12543645 heading 1;}{\*\cs10 \additive \sunhideused \spriority1 Default Paragraph Font;}{\* +\ts11\tsrowd\trftsWidthB3\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\trcbpat1\trcfpat1\tblind0\tblindtype3\tsvertalt\tsbrdrt\tsbrdrl\tsbrdrb\tsbrdrr\tsbrdrdgl\tsbrdrdgr\tsbrdrh\tsbrdrv \ql \li0\ri0\sa160\sl259\slmult1 +\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \fs22\lang1033\langfe1033\loch\f31506\hich\af31506\dbch\af31505\cgrid\langnp1033\langfenp1033 \snext11 \ssemihidden \sunhideused +Normal Table;}{\*\cs15 \additive \rtlch\fcs1 \ab\af0\afs32 \ltrch\fcs0 \b\fs32\kerning32\loch\f31502\hich\af31502\dbch\af31501 \sbasedon10 \slink1 \slocked \spriority9 \styrsid12543645 Heading 1 Char;}{\s16\ql \li0\ri0\sa160\sl259\slmult1\widctlpar +\tqc\tx4680\tqr\tx9360\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \fs22\lang1033\langfe1033\loch\f31506\hich\af31506\dbch\af31505\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext16 \slink17 \sunhideused \styrsid3805024 header;}{\*\cs17 \additive \rtlch\fcs1 \af0 \ltrch\fcs0 \sbasedon10 \slink16 \slocked \styrsid3805024 Header Char;}{\s18\ql \li0\ri0\sa160\sl259\slmult1\widctlpar +\tqc\tx4680\tqr\tx9360\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \fs22\lang1033\langfe1033\loch\f31506\hich\af31506\dbch\af31505\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext18 \slink19 \sunhideused \styrsid3805024 footer;}{\*\cs19 \additive \rtlch\fcs1 \af0 \ltrch\fcs0 \sbasedon10 \slink18 \slocked \styrsid3805024 Footer Char;}}{\*\listtable{\list\listtemplateid-620591136\listhybrid{\listlevel\levelnfc0 +\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67698703\'02\'00.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fbias0 \fi-360\li720\lin720 }{\listlevel\levelnfc3\levelnfcn3\leveljc0 +\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid1300900046\'03(\'01);}{\levelnumbers\'02;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fbias0 \fi-360\li1440\lin1440 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2 +\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698715\'02\'02.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-180\li2160\lin2160 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0 +\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698703\'02\'03.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li2880\lin2880 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698713\'02\'04.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li3600\lin3600 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\lvltentative +\levelspace0\levelindent0{\leveltext\leveltemplateid67698715\'02\'05.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-180\li4320\lin4320 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0 +\levelindent0{\leveltext\leveltemplateid67698703\'02\'06.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li5040\lin5040 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0 +{\leveltext\leveltemplateid67698713\'02\'07.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li5760\lin5760 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext +\leveltemplateid67698715\'02\'08.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-180\li6480\lin6480 }{\listname ;}\listid537085589}}{\*\listoverridetable{\listoverride\listid537085589\listoverridecount0\ls1}}{\*\pgptbl {\pgp\ipgp0\itap0\li0\ri0\sb0 +\sa0}{\pgp\ipgp0\itap0\li0\ri0\sb0\sa0}}{\*\rsidtbl \rsid3504841\rsid3559829\rsid3805024\rsid3959765\rsid10841800\rsid12543645}{\mmathPr\mmathFont34\mbrkBin0\mbrkBinSub0\msmallFrac0\mdispDef1\mlMargin0\mrMargin0\mdefJc1\mwrapIndent1440\mintLim0\mnaryLim1} +{\info{\creatim\yr2018\mo4\dy1\hr15\min39}{\revtim\yr2018\mo4\dy1\hr15\min40}{\version1}{\edmins0}{\nofpages2}{\nofwords441}{\nofchars2520}{\nofcharsws2956}{\vern57443}}{\*\xmlnstbl {\xmlns1 http://schemas.microsoft.com/office/word/2003/wordml}} +\paperw12240\paperh15840\margl1440\margr1440\margt1440\margb1440\gutter0\ltrsect +\widowctrl\ftnbj\aenddoc\trackmoves0\trackformatting1\donotembedsysfont0\relyonvml0\donotembedlingdata1\grfdocevents0\validatexml0\showplaceholdtext0\ignoremixedcontent0\saveinvalidxml0\showxmlerrors0\horzdoc\dghspace120\dgvspace120\dghorigin1701 +\dgvorigin1984\dghshow0\dgvshow3\jcompress\viewkind1\viewscale100\rempersonalinfo\rsidroot12543645\remdttm \fet0{\*\wgrffmtfilter 2450}\ilfomacatclnup0{\*\ftnsep \ltrpar \pard\plain \ltrpar +\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid3805024 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \fs22\lang1033\langfe1033\loch\af31506\hich\af31506\dbch\af31505\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 +\af0 \ltrch\fcs0 \insrsid3504841 \chftnsep +\par }}{\*\ftnsepc \ltrpar \pard\plain \ltrpar\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid3805024 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 +\fs22\lang1033\langfe1033\loch\af31506\hich\af31506\dbch\af31505\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid3504841 \chftnsepc +\par }}{\*\aftnsep \ltrpar \pard\plain \ltrpar\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid3805024 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 +\fs22\lang1033\langfe1033\loch\af31506\hich\af31506\dbch\af31505\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid3504841 \chftnsep +\par }}{\*\aftnsepc \ltrpar \pard\plain \ltrpar\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid3805024 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 +\fs22\lang1033\langfe1033\loch\af31506\hich\af31506\dbch\af31505\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid3504841 \chftnsepc +\par }}\ltrpar \sectd \ltrsect\linex0\sectdefaultcl\sftnbj {\headerl \ltrpar \pard\plain \ltrpar\s16\ql \li0\ri0\sa160\sl259\slmult1\widctlpar\tqc\tx4680\tqr\tx9360\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 +\af0\afs22\alang1025 \ltrch\fcs0 \fs22\lang1033\langfe1033\loch\af31506\hich\af31506\dbch\af31505\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid3805024 +\par }}{\headerr \ltrpar \pard\plain \ltrpar\s16\ql \li0\ri0\sa160\sl259\slmult1\widctlpar\tqc\tx4680\tqr\tx9360\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 +\fs22\lang1033\langfe1033\loch\af31506\hich\af31506\dbch\af31505\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid3805024 +\par }}{\footerl \ltrpar \pard\plain \ltrpar\s18\ql \li0\ri0\sa160\sl259\slmult1\widctlpar\tqc\tx4680\tqr\tx9360\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 +\fs22\lang1033\langfe1033\loch\af31506\hich\af31506\dbch\af31505\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid3805024 +\par }}{\footerr \ltrpar \pard\plain \ltrpar\s18\ql \li0\ri0\sa160\sl259\slmult1\widctlpar\tqc\tx4680\tqr\tx9360\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 +\fs22\lang1033\langfe1033\loch\af31506\hich\af31506\dbch\af31505\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid3805024 +\par }}{\headerf \ltrpar \pard\plain \ltrpar\s16\ql \li0\ri0\sa160\sl259\slmult1\widctlpar\tqc\tx4680\tqr\tx9360\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 +\fs22\lang1033\langfe1033\loch\af31506\hich\af31506\dbch\af31505\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid3805024 +\par }}{\footerf \ltrpar \pard\plain \ltrpar\s18\ql \li0\ri0\sa160\sl259\slmult1\widctlpar\tqc\tx4680\tqr\tx9360\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 +\fs22\lang1033\langfe1033\loch\af31506\hich\af31506\dbch\af31505\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid3805024 +\par }}{\*\pnseclvl1\pnucrm\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl2\pnucltr\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl3\pndec\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl4\pnlcltr\pnstart1\pnindent720\pnhang {\pntxta )}} +{\*\pnseclvl5\pndec\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl6\pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl7\pnlcrm\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl8 +\pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl9\pnlcrm\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}\pard\plain \ltrpar\qc \li0\ri0\sa160\sl259\slmult1 +\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid12543645 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \fs22\lang1033\langfe1033\loch\af31506\hich\af31506\dbch\af31505\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af37 +\ltrch\fcs0 \insrsid12543645\charrsid12543645 \hich\af31506\dbch\af31505\loch\f31506 Microsoft Reciprocal License (M}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid3559829 \hich\af31506\dbch\af31505\loch\f31506 s}{\rtlch\fcs1 \af37 \ltrch\fcs0 +\insrsid12543645\charrsid12543645 \hich\af31506\dbch\af31505\loch\f31506 -RL)}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid10841800\charrsid12543645 +\par }\pard \ltrpar\ql \li0\ri0\sa160\sl259\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid12543645 {\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid12543645\charrsid12543645 \hich\af31506\dbch\af31505\loch\f31506 +This license governs use of the accompanying software. If you use the software, you accept this license. If you do not accept the license, do not use the software.}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid3959765\charrsid12543645 +\par {\listtext\pard\plain\ltrpar \rtlch\fcs1 \af0\afs22 \ltrch\fcs0 \f31506\fs22\insrsid12543645\charrsid12543645 \hich\af31506\dbch\af31505\loch\f31506 1.\tab}}\pard \ltrpar\ql \fi-360\li720\ri0\sa160\sl259\slmult1 +\widctlpar\wrapdefault\aspalpha\aspnum\faauto\ls1\adjustright\rin0\lin720\itap0\pararsid3959765 {\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid12543645\charrsid12543645 \hich\af31506\dbch\af31505\loch\f31506 Definitions}{\rtlch\fcs1 \af37 \ltrch\fcs0 +\insrsid3959765 +\par }\pard \ltrpar\ql \li720\ri0\sa160\sl259\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin720\itap0\pararsid3959765 {\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid12543645\charrsid12543645 \hich\af31506\dbch\af31505\loch\f31506 +The terms "reproduce," "reproduction," "derivative works," and "distribution"\hich\af31506\dbch\af31505\loch\f31506 have the same meaning he}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid3959765 \hich\af31506\dbch\af31505\loch\f31506 +re as under U.S. copyright law. +\par }{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid12543645\charrsid12543645 \hich\af31506\dbch\af31505\loch\f31506 A "contribution" is the original software, or any additions or changes to the software.}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid3959765 +\par }{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid12543645\charrsid12543645 \hich\af31506\dbch\af31505\loch\f31506 A "contributor" is any person that distributes its contribution under this license.}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid3959765 +\par }{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid12543645\charrsid12543645 \hich\af31506\dbch\af31505\loch\f31506 "Licensed patents" are a c\hich\af31506\dbch\af31505\loch\f31506 ontributor's patent claims that read directly on its contribution.}{\rtlch\fcs1 +\af37 \ltrch\fcs0 \insrsid3959765\charrsid12543645 +\par {\listtext\pard\plain\ltrpar \rtlch\fcs1 \af0\afs22 \ltrch\fcs0 \f31506\fs22\insrsid12543645\charrsid12543645 \hich\af31506\dbch\af31505\loch\f31506 2.\tab}}\pard \ltrpar\ql \fi-360\li720\ri0\sa160\sl259\slmult1 +\widctlpar\wrapdefault\aspalpha\aspnum\faauto\ls1\adjustright\rin0\lin720\itap0\pararsid3959765 {\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid12543645\charrsid12543645 \hich\af31506\dbch\af31505\loch\f31506 Grant of Rights}{\rtlch\fcs1 \af37 \ltrch\fcs0 +\insrsid3959765 +\par {\listtext\pard\plain\ltrpar \rtlch\fcs1 \af0\afs22 \ltrch\fcs0 \f31506\fs22\insrsid12543645\charrsid3959765 \hich\af31506\dbch\af31505\loch\f31506 (A)\tab}}\pard \ltrpar\ql \fi-360\li1080\ri0\sa160\sl259\slmult1 +\widctlpar\wrapdefault\aspalpha\aspnum\faauto\ls1\ilvl1\adjustright\rin0\lin1080\itap0\pararsid3959765 {\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid12543645\charrsid3959765 \hich\af31506\dbch\af31505\loch\f31506 +Copyright Grant- Subject to the terms of this license, including the license conditions and limitations in section 3, each contributor grants you a non-exclusive, wor\hich\af31506\dbch\af31505\loch\f31506 +ldwide, royalty-free copyright license to reproduce its contribution, prepare derivative works of its contribution, and distribute its contribution or any de}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid3959765\charrsid3959765 +\hich\af31506\dbch\af31505\loch\f31506 rivative works that you create.}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid3959765 +\par {\listtext\pard\plain\ltrpar \rtlch\fcs1 \af0\afs22 \ltrch\fcs0 \f31506\fs22\insrsid12543645\charrsid3959765 \hich\af31506\dbch\af31505\loch\f31506 (B)\tab}}\pard \ltrpar\ql \fi-360\li1440\ri0\sa160\sl259\slmult1 +\widctlpar\wrapdefault\aspalpha\aspnum\faauto\ls1\ilvl1\adjustright\rin0\lin1440\itap0\pararsid3959765 {\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid12543645\charrsid3959765 \hich\af31506\dbch\af31505\loch\f31506 +Patent Grant- Subject to the terms of this license, including t\hich\af31506\dbch\af31505\loch\f31506 +he license conditions and limitations in section 3, each contributor grants you a non-exclusive, worldwide, royalty-free license under its licensed patents to make, have made, use, sell, offer for sale, import, and/or otherwise dispose of its contribution +\hich\af31506\dbch\af31505\loch\f31506 \hich\af31506\dbch\af31505\loch\f31506 in the software or derivative works of the contribution in the software.}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid3959765\charrsid3959765 +\par {\listtext\pard\plain\ltrpar \rtlch\fcs1 \af0\afs22 \ltrch\fcs0 \f31506\fs22\insrsid3959765 \hich\af31506\dbch\af31505\loch\f31506 3.\tab}}\pard \ltrpar\ql \fi-360\li720\ri0\sa160\sl259\slmult1 +\widctlpar\wrapdefault\aspalpha\aspnum\faauto\ls1\adjustright\rin0\lin720\itap0\pararsid3959765 {\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid3959765 \hich\af31506\dbch\af31505\loch\f31506 C}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid12543645\charrsid12543645 +\hich\af31506\dbch\af31505\loch\f31506 onditions and Limitations}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid3959765 +\par {\listtext\pard\plain\ltrpar \rtlch\fcs1 \af0\afs22 \ltrch\fcs0 \f31506\fs22\insrsid12543645\charrsid12543645 \hich\af31506\dbch\af31505\loch\f31506 (A)\tab}}\pard \ltrpar\ql \fi-360\li1440\ri0\sa160\sl259\slmult1 +\widctlpar\wrapdefault\aspalpha\aspnum\faauto\ls1\ilvl1\adjustright\rin0\lin1440\itap0\pararsid3959765 {\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid12543645\charrsid12543645 \hich\af31506\dbch\af31505\loch\f31506 +Reciprocal Grants- For any file you distribute that contains code from the software (in source code or binary format), you must provide recipients th\hich\af31506\dbch\af31505\loch\f31506 +e source code to that file along with a copy of this license, which license will govern that file. You may license other files that are entirely your own work and do not contain code from the softw}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid3959765 +\hich\af31506\dbch\af31505\loch\f31506 are under any terms you choose. +\par {\listtext\pard\plain\ltrpar \rtlch\fcs1 \af0\afs22 \ltrch\fcs0 \f31506\fs22\insrsid12543645\charrsid12543645 \hich\af31506\dbch\af31505\loch\f31506 (B)\tab}}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid12543645\charrsid12543645 +\hich\af31506\dbch\af31505\loch\f31506 No Trademark License- T\hich\af31506\dbch\af31505\loch\f31506 his license does not grant you rights to use any contribut}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid3959765 \hich\af31506\dbch\af31505\loch\f31506 +ors' name, logo, or trademarks. +\par {\listtext\pard\plain\ltrpar \rtlch\fcs1 \af0\afs22 \ltrch\fcs0 \f31506\fs22\insrsid12543645\charrsid12543645 \hich\af31506\dbch\af31505\loch\f31506 (C)\tab}}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid12543645\charrsid12543645 +\hich\af31506\dbch\af31505\loch\f31506 If you bring a patent claim against any contributor over patents that you claim are infringed by the software, your patent license from such contributor to the so\hich\af31506\dbch\af31505\loch\f31506 f}{\rtlch\fcs1 +\af37 \ltrch\fcs0 \insrsid3959765 \hich\af31506\dbch\af31505\loch\f31506 tware ends automatically. +\par {\listtext\pard\plain\ltrpar \rtlch\fcs1 \af0\afs22 \ltrch\fcs0 \f31506\fs22\insrsid12543645\charrsid12543645 \hich\af31506\dbch\af31505\loch\f31506 (D)\tab}}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid12543645\charrsid12543645 +\hich\af31506\dbch\af31505\loch\f31506 If you distribute any portion of the software, you must retain all copyright, patent, trademark, and attribution notices th}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid3959765 \hich\af31506\dbch\af31505\loch\f31506 +at are present in the software. +\par {\listtext\pard\plain\ltrpar \rtlch\fcs1 \af0\afs22 \ltrch\fcs0 \f31506\fs22\insrsid12543645\charrsid12543645 \hich\af31506\dbch\af31505\loch\f31506 (E)\tab}}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid12543645\charrsid12543645 +\hich\af31506\dbch\af31505\loch\f31506 If you distribute any portion of the software in source code form,\hich\af31506\dbch\af31505\loch\f31506 + you may do so only under this license by including a complete copy of this license with your distribution. If you distribute any portion of the software in compiled or object code form, you may only do so under a license that complies with this license.} +{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid3959765 +\par {\listtext\pard\plain\ltrpar \rtlch\fcs1 \af0\afs22 \ltrch\fcs0 \f31506\fs22\insrsid12543645\charrsid12543645 \hich\af31506\dbch\af31505\loch\f31506 (F)\tab}}\pard \ltrpar\ql \fi-360\li1440\ri0\sa160\sl259\slmult1 +\widctlpar\wrapdefault\aspalpha\aspnum\faauto\ls1\ilvl1\adjustright\rin0\lin1440\itap0\pararsid12543645 {\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid12543645\charrsid12543645 \hich\af31506\dbch\af31505\loch\f31506 +The software is licensed "as-is." You bear the risk of using it. The contributors give no express warranties, guarantees or conditions. You may have additional consumer rights under your local laws which this license cannot change. To the extent permitt +\hich\af31506\dbch\af31505\loch\f31506 ed under your local laws, the contributors exclude the implied warranties of merchantability, fitness for a particular purpose and non-infringement.}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid12543645\charrsid3959765 + +\par }{\*\themedata 504b030414000600080000002100e9de0fbfff0000001c020000130000005b436f6e74656e745f54797065735d2e786d6cac91cb4ec3301045f748fc83e52d4a +9cb2400825e982c78ec7a27cc0c8992416c9d8b2a755fbf74cd25442a820166c2cd933f79e3be372bd1f07b5c3989ca74aaff2422b24eb1b475da5df374fd9ad +5689811a183c61a50f98f4babebc2837878049899a52a57be670674cb23d8e90721f90a4d2fa3802cb35762680fd800ecd7551dc18eb899138e3c943d7e503b6 +b01d583deee5f99824e290b4ba3f364eac4a430883b3c092d4eca8f946c916422ecab927f52ea42b89a1cd59c254f919b0e85e6535d135a8de20f20b8c12c3b0 +0c895fcf6720192de6bf3b9e89ecdbd6596cbcdd8eb28e7c365ecc4ec1ff1460f53fe813d3cc7f5b7f020000ffff0300504b030414000600080000002100a5d6 +a7e7c0000000360100000b0000005f72656c732f2e72656c73848fcf6ac3300c87ef85bd83d17d51d2c31825762fa590432fa37d00e1287f68221bdb1bebdb4f +c7060abb0884a4eff7a93dfeae8bf9e194e720169aaa06c3e2433fcb68e1763dbf7f82c985a4a725085b787086a37bdbb55fbc50d1a33ccd311ba548b6309512 +0f88d94fbc52ae4264d1c910d24a45db3462247fa791715fd71f989e19e0364cd3f51652d73760ae8fa8c9ffb3c330cc9e4fc17faf2ce545046e37944c69e462 +a1a82fe353bd90a865aad41ed0b5b8f9d6fd010000ffff0300504b0304140006000800000021006b799616830000008a0000001c0000007468656d652f746865 +6d652f7468656d654d616e616765722e786d6c0ccc4d0ac3201040e17da17790d93763bb284562b2cbaebbf600439c1a41c7a0d29fdbd7e5e38337cedf14d59b +4b0d592c9c070d8a65cd2e88b7f07c2ca71ba8da481cc52c6ce1c715e6e97818c9b48d13df49c873517d23d59085adb5dd20d6b52bd521ef2cdd5eb9246a3d8b +4757e8d3f729e245eb2b260a0238fd010000ffff0300504b030414000600080000002100aa5225dfc60600008b1a0000160000007468656d652f7468656d652f +7468656d65312e786d6cec595d8bdb46147d2ff43f08bd3bfe92fcb1c41b6cd9ceb6d94d42eca4e4716c8fadc98e344633de8d0981923c160aa569e943037deb +43691b48a02fe9afd936a54d217fa17746b63c638fbb9b2585a5640d8b343af7ce997bafce1d4997afdc8fa87384134e58dc708b970aae83e3211b9178d2706f +f7bbb99aeb7081e211a22cc60d778eb97b65f7c30f2ea31d11e2083b601ff31dd4704321a63bf93c1fc230e297d814c7706dcc920809384d26f951828ec16f44 +f3a542a1928f10895d274611b8bd311e932176fad2a5bbbb74dea1701a0b2e078634e949d7d8b050d8d1615122f89c0734718e106db830cf881df7f17de13a14 +7101171a6e41fdb9f9ddcb79b4b330a2628bad66d7557f0bbb85c1e8b0a4e64c26836c52cff3bd4a33f3af00546ce23ad54ea553c9fc29001a0e61a52917dda7 +dfaab7dafe02ab81d2438bef76b55d2e1a78cd7f798373d3973f03af40a97f6f03dfed06104503af4029dedfc07b5eb51478065e81527c65035f2d34db5ed5c0 +2b5048497cb8812ef89572b05c6d061933ba6785d77daf5b2d2d9caf50500d5975c929c62c16db6a2d42f758d2058004522448ec88f9148fd110aa3840940c12 +e2ec93490885374531e3305c2815ba8532fc973f4f1da988a01d8c346bc90b98f08d21c9c7e1c3844c45c3fd18bcba1ae4cdcb1fdfbc7cee9c3c7a71f2e89793 +c78f4f1efd9c3a32acf6503cd1ad5e7fffc5df4f3f75fe7afeddeb275fd9f15cc7fffed367bffdfaa51d082b5d85e0d5d7cffe78f1ecd5379ffff9c3130bbc99 +a0810eef930873e73a3e766eb10816a6426032c783e4ed2cfa2122ba45339e701423398bc57f478406fafa1c5164c1b5b019c13b09488c0d787576cf20dc0b93 +9920168fd7c2c8001e30465b2cb146e19a9c4b0b737f164fec9327331d770ba123dbdc018a8dfc766653d05662731984d8a07993a258a0098eb170e4357688b1 +6575770931e27a408609e36c2c9cbbc46921620d499f0c8c6a5a19ed9108f232b711847c1bb139b8e3b418b5adba8d8f4c24dc15885ac8f73135c27815cd048a +6c2efb28a27ac0f791086d247bf364a8e33a5c40a6279832a733c29cdb6c6e24b05e2de9d7405eec693fa0f3c84426821cda7cee23c674649b1d06218aa6366c +8fc4a18efd881f428922e7261336f80133ef10790e7940f1d674df21d848f7e96a701b9455a7b42a107965965872791533a37e7b733a4658490d08bfa1e71189 +4f15f73559f7ff5b5907217df5ed53cbaa2eaaa0371362bda3f6d6647c1b6e5dbc03968cc8c5d7ee369ac53731dc2e9b0decbd74bf976ef77f2fdddbeee7772f +d82b8d06f9965bc574abae36eed1d67dfb9850da13738af7b9daba73e84ca32e0c4a3bf5cc8ab3e7b8690887f24e86090cdc2441cac64998f88488b017a229ec +ef8bae7432e10bd713ee4c19876dbf1ab6fa96783a8b0ed8287d5c2d16e5a3692a1e1c89d578c1cfc6e15143a4e84a75f50896b9576c27ea51794940dabe0d09 +6d329344d942a2ba1c9441520fe610340b09b5b277c2a26e615193ee97a9da6001d4b2acc0d6c9810d57c3f53d30012378a242148f649ed2542fb3ab92f92e33 +bd2d984605c03e625901ab4cd725d7adcb93ab4b4bed0c99364868e566925091513d8c87688417d52947cf42e36d735d5fa5d4a02743a1e683d25ad1a8d6fe8d +c579730d76ebda40635d2968ec1c37dc4ad9879219a269c31dc3633f1c4653a81d2eb7bc884ee0ddd95024e90d7f1e6599265cb4110fd3802bd149d520220227 +0e2551c395cbcfd24063a5218a5bb104827061c9d541562e1a3948ba99643c1ee3a1d0d3ae8dc848a7a7a0f0a95658af2af3f383a5259b41ba7be1e8d819d059 +720b4189f9d5a20ce0887078fb534ca33922f03a3313b255fdad35a685eceaef13550da5e3884e43b4e828ba98a77025e5191d7596c5403b5bac1902aa8564d1 +080713d960f5a01add34eb1a2987ad5df7742319394d34573dd35015d935ed2a66ccb06c036bb13c5f93d7582d430c9aa677f854bad725b7bed4bab57d42d625 +20e059fc2c5df70c0d41a3b69acca026196fcab0d4ecc5a8d93b960b3c85da599a84a6fa95a5dbb5b8653dc23a1d0c9eabf383dd7ad5c2d078b9af549156df3d +f44f136c700fc4a30d2f81675470954af8f09020d810f5d49e24950db845ee8bc5ad0147ce2c210df741c16f7a41c90f72859adfc97965af90abf9cd72aee9fb +e562c72f16daadd243682c228c8a7efacda50bafa2e87cf1e5458d6f7c7d89966fdb2e0d599467eaeb4a5e11575f5f8aa5ed5f5f1c02a2f3a052ead6cbf55625 +572f37bb39afddaae5ea41a5956b57826abbdb0efc5abdfbd0758e14d86b9603afd2a9e52ac520c8799582a45fabe7aa5ea9d4f4aacd5ac76b3e5c6c6360e5a9 +7c2c6201e155bc76ff010000ffff0300504b0304140006000800000021000dd1909fb60000001b010000270000007468656d652f7468656d652f5f72656c732f +7468656d654d616e616765722e786d6c2e72656c73848f4d0ac2301484f78277086f6fd3ba109126dd88d0add40384e4350d363f2451eced0dae2c082e8761be +9969bb979dc9136332de3168aa1a083ae995719ac16db8ec8e4052164e89d93b64b060828e6f37ed1567914b284d262452282e3198720e274a939cd08a54f980 +ae38a38f56e422a3a641c8bbd048f7757da0f19b017cc524bd62107bd5001996509affb3fd381a89672f1f165dfe514173d9850528a2c6cce0239baa4c04ca5b +babac4df000000ffff0300504b01022d0014000600080000002100e9de0fbfff0000001c0200001300000000000000000000000000000000005b436f6e74656e +745f54797065735d2e786d6c504b01022d0014000600080000002100a5d6a7e7c0000000360100000b00000000000000000000000000300100005f72656c732f +2e72656c73504b01022d00140006000800000021006b799616830000008a0000001c00000000000000000000000000190200007468656d652f7468656d652f74 +68656d654d616e616765722e786d6c504b01022d0014000600080000002100aa5225dfc60600008b1a00001600000000000000000000000000d6020000746865 +6d652f7468656d652f7468656d65312e786d6c504b01022d00140006000800000021000dd1909fb60000001b0100002700000000000000000000000000d00900007468656d652f7468656d652f5f72656c732f7468656d654d616e616765722e786d6c2e72656c73504b050600000000050005005d010000cb0a00000000} +{\*\colorschememapping 3c3f786d6c2076657273696f6e3d22312e302220656e636f64696e673d225554462d3822207374616e64616c6f6e653d22796573223f3e0d0a3c613a636c724d +617020786d6c6e733a613d22687474703a2f2f736368656d61732e6f70656e786d6c666f726d6174732e6f72672f64726177696e676d6c2f323030362f6d6169 +6e22206267313d226c743122207478313d22646b3122206267323d226c743222207478323d22646b322220616363656e74313d22616363656e74312220616363 +656e74323d22616363656e74322220616363656e74333d22616363656e74332220616363656e74343d22616363656e74342220616363656e74353d22616363656e74352220616363656e74363d22616363656e74362220686c696e6b3d22686c696e6b2220666f6c486c696e6b3d22666f6c486c696e6b222f3e} +{\*\latentstyles\lsdstimax371\lsdlockeddef0\lsdsemihiddendef0\lsdunhideuseddef0\lsdqformatdef0\lsdprioritydef99{\lsdlockedexcept \lsdqformat1 \lsdpriority0 \lsdlocked0 Normal;\lsdqformat1 \lsdpriority9 \lsdlocked0 heading 1; +\lsdsemihidden1 \lsdunhideused1 \lsdqformat1 \lsdpriority9 \lsdlocked0 heading 2;\lsdsemihidden1 \lsdunhideused1 \lsdqformat1 \lsdpriority9 \lsdlocked0 heading 3;\lsdsemihidden1 \lsdunhideused1 \lsdqformat1 \lsdpriority9 \lsdlocked0 heading 4; +\lsdsemihidden1 \lsdunhideused1 \lsdqformat1 \lsdpriority9 \lsdlocked0 heading 5;\lsdsemihidden1 \lsdunhideused1 \lsdqformat1 \lsdpriority9 \lsdlocked0 heading 6;\lsdsemihidden1 \lsdunhideused1 \lsdqformat1 \lsdpriority9 \lsdlocked0 heading 7; +\lsdsemihidden1 \lsdunhideused1 \lsdqformat1 \lsdpriority9 \lsdlocked0 heading 8;\lsdsemihidden1 \lsdunhideused1 \lsdqformat1 \lsdpriority9 \lsdlocked0 heading 9;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 index 1; +\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 index 2;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 index 3;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 index 4;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 index 5; +\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 index 6;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 index 7;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 index 8;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 index 9; +\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 1;\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 2;\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 3; +\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 4;\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 5;\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 6; +\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 7;\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 8;\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 9;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Normal Indent; +\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 footnote text;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 annotation text;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 header;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 footer; +\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 index heading;\lsdsemihidden1 \lsdunhideused1 \lsdqformat1 \lsdpriority35 \lsdlocked0 caption;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 table of figures; +\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 envelope address;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 envelope return;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 footnote reference;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 annotation reference; +\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 line number;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 page number;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 endnote reference;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 endnote text; +\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 table of authorities;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 macro;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 toa heading;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List; +\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List Bullet;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List Number;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List 2;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List 3; +\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List 4;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List 5;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List Bullet 2;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List Bullet 3; +\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List Bullet 4;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List Bullet 5;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List Number 2;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List Number 3; +\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List Number 4;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List Number 5;\lsdqformat1 \lsdpriority10 \lsdlocked0 Title;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Closing; +\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Signature;\lsdsemihidden1 \lsdunhideused1 \lsdpriority1 \lsdlocked0 Default Paragraph Font;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Body Text;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Body Text Indent; +\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List Continue;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List Continue 2;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List Continue 3;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List Continue 4; +\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List Continue 5;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Message Header;\lsdqformat1 \lsdpriority11 \lsdlocked0 Subtitle;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Salutation; +\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Date;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Body Text First Indent;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Body Text First Indent 2;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Note Heading; +\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Body Text 2;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Body Text 3;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Body Text Indent 2;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Body Text Indent 3; +\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Block Text;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Hyperlink;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 FollowedHyperlink;\lsdqformat1 \lsdpriority22 \lsdlocked0 Strong; +\lsdqformat1 \lsdpriority20 \lsdlocked0 Emphasis;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Document Map;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Plain Text;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 E-mail Signature; +\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 HTML Top of Form;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 HTML Bottom of Form;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Normal (Web);\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 HTML Acronym; +\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 HTML Address;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 HTML Cite;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 HTML Code;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 HTML Definition; +\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 HTML Keyboard;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 HTML Preformatted;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 HTML Sample;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 HTML Typewriter; +\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 HTML Variable;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 annotation subject;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 No List;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Outline List 1; +\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Outline List 2;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Outline List 3;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Balloon Text;\lsdpriority39 \lsdlocked0 Table Grid; +\lsdsemihidden1 \lsdlocked0 Placeholder Text;\lsdqformat1 \lsdpriority1 \lsdlocked0 No Spacing;\lsdpriority60 \lsdlocked0 Light Shading;\lsdpriority61 \lsdlocked0 Light List;\lsdpriority62 \lsdlocked0 Light Grid; +\lsdpriority63 \lsdlocked0 Medium Shading 1;\lsdpriority64 \lsdlocked0 Medium Shading 2;\lsdpriority65 \lsdlocked0 Medium List 1;\lsdpriority66 \lsdlocked0 Medium List 2;\lsdpriority67 \lsdlocked0 Medium Grid 1;\lsdpriority68 \lsdlocked0 Medium Grid 2; +\lsdpriority69 \lsdlocked0 Medium Grid 3;\lsdpriority70 \lsdlocked0 Dark List;\lsdpriority71 \lsdlocked0 Colorful Shading;\lsdpriority72 \lsdlocked0 Colorful List;\lsdpriority73 \lsdlocked0 Colorful Grid;\lsdpriority60 \lsdlocked0 Light Shading Accent 1; +\lsdpriority61 \lsdlocked0 Light List Accent 1;\lsdpriority62 \lsdlocked0 Light Grid Accent 1;\lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 1;\lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 1;\lsdpriority65 \lsdlocked0 Medium List 1 Accent 1; +\lsdsemihidden1 \lsdlocked0 Revision;\lsdqformat1 \lsdpriority34 \lsdlocked0 List Paragraph;\lsdqformat1 \lsdpriority29 \lsdlocked0 Quote;\lsdqformat1 \lsdpriority30 \lsdlocked0 Intense Quote;\lsdpriority66 \lsdlocked0 Medium List 2 Accent 1; +\lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 1;\lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 1;\lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 1;\lsdpriority70 \lsdlocked0 Dark List Accent 1;\lsdpriority71 \lsdlocked0 Colorful Shading Accent 1; +\lsdpriority72 \lsdlocked0 Colorful List Accent 1;\lsdpriority73 \lsdlocked0 Colorful Grid Accent 1;\lsdpriority60 \lsdlocked0 Light Shading Accent 2;\lsdpriority61 \lsdlocked0 Light List Accent 2;\lsdpriority62 \lsdlocked0 Light Grid Accent 2; +\lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 2;\lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 2;\lsdpriority65 \lsdlocked0 Medium List 1 Accent 2;\lsdpriority66 \lsdlocked0 Medium List 2 Accent 2; +\lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 2;\lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 2;\lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 2;\lsdpriority70 \lsdlocked0 Dark List Accent 2;\lsdpriority71 \lsdlocked0 Colorful Shading Accent 2; +\lsdpriority72 \lsdlocked0 Colorful List Accent 2;\lsdpriority73 \lsdlocked0 Colorful Grid Accent 2;\lsdpriority60 \lsdlocked0 Light Shading Accent 3;\lsdpriority61 \lsdlocked0 Light List Accent 3;\lsdpriority62 \lsdlocked0 Light Grid Accent 3; +\lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 3;\lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 3;\lsdpriority65 \lsdlocked0 Medium List 1 Accent 3;\lsdpriority66 \lsdlocked0 Medium List 2 Accent 3; +\lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 3;\lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 3;\lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 3;\lsdpriority70 \lsdlocked0 Dark List Accent 3;\lsdpriority71 \lsdlocked0 Colorful Shading Accent 3; +\lsdpriority72 \lsdlocked0 Colorful List Accent 3;\lsdpriority73 \lsdlocked0 Colorful Grid Accent 3;\lsdpriority60 \lsdlocked0 Light Shading Accent 4;\lsdpriority61 \lsdlocked0 Light List Accent 4;\lsdpriority62 \lsdlocked0 Light Grid Accent 4; +\lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 4;\lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 4;\lsdpriority65 \lsdlocked0 Medium List 1 Accent 4;\lsdpriority66 \lsdlocked0 Medium List 2 Accent 4; +\lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 4;\lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 4;\lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 4;\lsdpriority70 \lsdlocked0 Dark List Accent 4;\lsdpriority71 \lsdlocked0 Colorful Shading Accent 4; +\lsdpriority72 \lsdlocked0 Colorful List Accent 4;\lsdpriority73 \lsdlocked0 Colorful Grid Accent 4;\lsdpriority60 \lsdlocked0 Light Shading Accent 5;\lsdpriority61 \lsdlocked0 Light List Accent 5;\lsdpriority62 \lsdlocked0 Light Grid Accent 5; +\lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 5;\lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 5;\lsdpriority65 \lsdlocked0 Medium List 1 Accent 5;\lsdpriority66 \lsdlocked0 Medium List 2 Accent 5; +\lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 5;\lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 5;\lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 5;\lsdpriority70 \lsdlocked0 Dark List Accent 5;\lsdpriority71 \lsdlocked0 Colorful Shading Accent 5; +\lsdpriority72 \lsdlocked0 Colorful List Accent 5;\lsdpriority73 \lsdlocked0 Colorful Grid Accent 5;\lsdpriority60 \lsdlocked0 Light Shading Accent 6;\lsdpriority61 \lsdlocked0 Light List Accent 6;\lsdpriority62 \lsdlocked0 Light Grid Accent 6; +\lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 6;\lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 6;\lsdpriority65 \lsdlocked0 Medium List 1 Accent 6;\lsdpriority66 \lsdlocked0 Medium List 2 Accent 6; +\lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 6;\lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 6;\lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 6;\lsdpriority70 \lsdlocked0 Dark List Accent 6;\lsdpriority71 \lsdlocked0 Colorful Shading Accent 6; +\lsdpriority72 \lsdlocked0 Colorful List Accent 6;\lsdpriority73 \lsdlocked0 Colorful Grid Accent 6;\lsdqformat1 \lsdpriority19 \lsdlocked0 Subtle Emphasis;\lsdqformat1 \lsdpriority21 \lsdlocked0 Intense Emphasis; +\lsdqformat1 \lsdpriority31 \lsdlocked0 Subtle Reference;\lsdqformat1 \lsdpriority32 \lsdlocked0 Intense Reference;\lsdqformat1 \lsdpriority33 \lsdlocked0 Book Title;\lsdsemihidden1 \lsdunhideused1 \lsdpriority37 \lsdlocked0 Bibliography; +\lsdsemihidden1 \lsdunhideused1 \lsdqformat1 \lsdpriority39 \lsdlocked0 TOC Heading;\lsdpriority41 \lsdlocked0 Plain Table 1;\lsdpriority42 \lsdlocked0 Plain Table 2;\lsdpriority43 \lsdlocked0 Plain Table 3;\lsdpriority44 \lsdlocked0 Plain Table 4; +\lsdpriority45 \lsdlocked0 Plain Table 5;\lsdpriority40 \lsdlocked0 Grid Table Light;\lsdpriority46 \lsdlocked0 Grid Table 1 Light;\lsdpriority47 \lsdlocked0 Grid Table 2;\lsdpriority48 \lsdlocked0 Grid Table 3;\lsdpriority49 \lsdlocked0 Grid Table 4; +\lsdpriority50 \lsdlocked0 Grid Table 5 Dark;\lsdpriority51 \lsdlocked0 Grid Table 6 Colorful;\lsdpriority52 \lsdlocked0 Grid Table 7 Colorful;\lsdpriority46 \lsdlocked0 Grid Table 1 Light Accent 1;\lsdpriority47 \lsdlocked0 Grid Table 2 Accent 1; +\lsdpriority48 \lsdlocked0 Grid Table 3 Accent 1;\lsdpriority49 \lsdlocked0 Grid Table 4 Accent 1;\lsdpriority50 \lsdlocked0 Grid Table 5 Dark Accent 1;\lsdpriority51 \lsdlocked0 Grid Table 6 Colorful Accent 1; +\lsdpriority52 \lsdlocked0 Grid Table 7 Colorful Accent 1;\lsdpriority46 \lsdlocked0 Grid Table 1 Light Accent 2;\lsdpriority47 \lsdlocked0 Grid Table 2 Accent 2;\lsdpriority48 \lsdlocked0 Grid Table 3 Accent 2; +\lsdpriority49 \lsdlocked0 Grid Table 4 Accent 2;\lsdpriority50 \lsdlocked0 Grid Table 5 Dark Accent 2;\lsdpriority51 \lsdlocked0 Grid Table 6 Colorful Accent 2;\lsdpriority52 \lsdlocked0 Grid Table 7 Colorful Accent 2; +\lsdpriority46 \lsdlocked0 Grid Table 1 Light Accent 3;\lsdpriority47 \lsdlocked0 Grid Table 2 Accent 3;\lsdpriority48 \lsdlocked0 Grid Table 3 Accent 3;\lsdpriority49 \lsdlocked0 Grid Table 4 Accent 3; +\lsdpriority50 \lsdlocked0 Grid Table 5 Dark Accent 3;\lsdpriority51 \lsdlocked0 Grid Table 6 Colorful Accent 3;\lsdpriority52 \lsdlocked0 Grid Table 7 Colorful Accent 3;\lsdpriority46 \lsdlocked0 Grid Table 1 Light Accent 4; +\lsdpriority47 \lsdlocked0 Grid Table 2 Accent 4;\lsdpriority48 \lsdlocked0 Grid Table 3 Accent 4;\lsdpriority49 \lsdlocked0 Grid Table 4 Accent 4;\lsdpriority50 \lsdlocked0 Grid Table 5 Dark Accent 4; +\lsdpriority51 \lsdlocked0 Grid Table 6 Colorful Accent 4;\lsdpriority52 \lsdlocked0 Grid Table 7 Colorful Accent 4;\lsdpriority46 \lsdlocked0 Grid Table 1 Light Accent 5;\lsdpriority47 \lsdlocked0 Grid Table 2 Accent 5; +\lsdpriority48 \lsdlocked0 Grid Table 3 Accent 5;\lsdpriority49 \lsdlocked0 Grid Table 4 Accent 5;\lsdpriority50 \lsdlocked0 Grid Table 5 Dark Accent 5;\lsdpriority51 \lsdlocked0 Grid Table 6 Colorful Accent 5; +\lsdpriority52 \lsdlocked0 Grid Table 7 Colorful Accent 5;\lsdpriority46 \lsdlocked0 Grid Table 1 Light Accent 6;\lsdpriority47 \lsdlocked0 Grid Table 2 Accent 6;\lsdpriority48 \lsdlocked0 Grid Table 3 Accent 6; +\lsdpriority49 \lsdlocked0 Grid Table 4 Accent 6;\lsdpriority50 \lsdlocked0 Grid Table 5 Dark Accent 6;\lsdpriority51 \lsdlocked0 Grid Table 6 Colorful Accent 6;\lsdpriority52 \lsdlocked0 Grid Table 7 Colorful Accent 6; +\lsdpriority46 \lsdlocked0 List Table 1 Light;\lsdpriority47 \lsdlocked0 List Table 2;\lsdpriority48 \lsdlocked0 List Table 3;\lsdpriority49 \lsdlocked0 List Table 4;\lsdpriority50 \lsdlocked0 List Table 5 Dark; +\lsdpriority51 \lsdlocked0 List Table 6 Colorful;\lsdpriority52 \lsdlocked0 List Table 7 Colorful;\lsdpriority46 \lsdlocked0 List Table 1 Light Accent 1;\lsdpriority47 \lsdlocked0 List Table 2 Accent 1;\lsdpriority48 \lsdlocked0 List Table 3 Accent 1; +\lsdpriority49 \lsdlocked0 List Table 4 Accent 1;\lsdpriority50 \lsdlocked0 List Table 5 Dark Accent 1;\lsdpriority51 \lsdlocked0 List Table 6 Colorful Accent 1;\lsdpriority52 \lsdlocked0 List Table 7 Colorful Accent 1; +\lsdpriority46 \lsdlocked0 List Table 1 Light Accent 2;\lsdpriority47 \lsdlocked0 List Table 2 Accent 2;\lsdpriority48 \lsdlocked0 List Table 3 Accent 2;\lsdpriority49 \lsdlocked0 List Table 4 Accent 2; +\lsdpriority50 \lsdlocked0 List Table 5 Dark Accent 2;\lsdpriority51 \lsdlocked0 List Table 6 Colorful Accent 2;\lsdpriority52 \lsdlocked0 List Table 7 Colorful Accent 2;\lsdpriority46 \lsdlocked0 List Table 1 Light Accent 3; +\lsdpriority47 \lsdlocked0 List Table 2 Accent 3;\lsdpriority48 \lsdlocked0 List Table 3 Accent 3;\lsdpriority49 \lsdlocked0 List Table 4 Accent 3;\lsdpriority50 \lsdlocked0 List Table 5 Dark Accent 3; +\lsdpriority51 \lsdlocked0 List Table 6 Colorful Accent 3;\lsdpriority52 \lsdlocked0 List Table 7 Colorful Accent 3;\lsdpriority46 \lsdlocked0 List Table 1 Light Accent 4;\lsdpriority47 \lsdlocked0 List Table 2 Accent 4; +\lsdpriority48 \lsdlocked0 List Table 3 Accent 4;\lsdpriority49 \lsdlocked0 List Table 4 Accent 4;\lsdpriority50 \lsdlocked0 List Table 5 Dark Accent 4;\lsdpriority51 \lsdlocked0 List Table 6 Colorful Accent 4; +\lsdpriority52 \lsdlocked0 List Table 7 Colorful Accent 4;\lsdpriority46 \lsdlocked0 List Table 1 Light Accent 5;\lsdpriority47 \lsdlocked0 List Table 2 Accent 5;\lsdpriority48 \lsdlocked0 List Table 3 Accent 5; +\lsdpriority49 \lsdlocked0 List Table 4 Accent 5;\lsdpriority50 \lsdlocked0 List Table 5 Dark Accent 5;\lsdpriority51 \lsdlocked0 List Table 6 Colorful Accent 5;\lsdpriority52 \lsdlocked0 List Table 7 Colorful Accent 5; +\lsdpriority46 \lsdlocked0 List Table 1 Light Accent 6;\lsdpriority47 \lsdlocked0 List Table 2 Accent 6;\lsdpriority48 \lsdlocked0 List Table 3 Accent 6;\lsdpriority49 \lsdlocked0 List Table 4 Accent 6; +\lsdpriority50 \lsdlocked0 List Table 5 Dark Accent 6;\lsdpriority51 \lsdlocked0 List Table 6 Colorful Accent 6;\lsdpriority52 \lsdlocked0 List Table 7 Colorful Accent 6;}}{\*\datastore 010500000200000018000000 +4d73786d6c322e534158584d4c5265616465722e362e3000000000000000000000060000 +d0cf11e0a1b11ae1000000000000000000000000000000003e000300feff090006000000000000000000000001000000010000000000000000100000feffffff00000000feffffff0000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffdfffffffeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff52006f006f007400200045006e00740072007900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000500ffffffffffffffffffffffff0c6ad98892f1d411a65f0040963251e5000000000000000000000000609c +cc3cf1c9d301feffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000105000000000000}} \ No newline at end of file diff --git a/src/OnTopReplica.sln b/src/OnTopReplica.sln index 16c995c..fb99208 100644 --- a/src/OnTopReplica.sln +++ b/src/OnTopReplica.sln @@ -5,6 +5,8 @@ VisualStudioVersion = 15.0.27004.2008 MinimumVisualStudioVersion = 10.0.40219.1 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OnTopReplica", "OnTopReplica\OnTopReplica.csproj", "{E626BD6E-BF38-4EB7-A128-5CA6F40EF557}" EndProject +Project("{54435603-DBB4-11D2-8724-00A0C9A8B90C}") = "Installer", "Installer\Installer.vdproj", "{EA7C9C89-0CCF-41E3-A379-D593AAF7A941}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU From 10d0d660d06336a42243e13415e16921e7710faa Mon Sep 17 00:00:00 2001 From: Andrew Metzger Date: Tue, 10 Apr 2018 19:51:50 +0200 Subject: [PATCH 3/5] Change download link to latest release Change the download link to the latest release, and also remove version number from README so we don't need to edit it with every version bump. Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 7fa23ae..8256c64 100644 --- a/README.md +++ b/README.md @@ -28,7 +28,7 @@ Very useful for monitoring background processes, wrangling with complex multi-wi ## Installation -Get the [latest version (v.3.5.1)](https://github.com/paulodeleo/OnTopReplica/releases/tag/v3.5.1) from the releases section, both as installer and as a standalone portable executable. +Get the [latest version](/releases/) from the releases section. ## Contributions From 8e2e9a45e5faff852525ff5148bdebb7dccd3776 Mon Sep 17 00:00:00 2001 From: Lorenz Cuno Klopfenstein Date: Tue, 10 Apr 2018 23:34:54 +0200 Subject: [PATCH 4/5] Add post installation script for shortcut setup --- src/Installer/Installer.vdproj | 87 +++++++++++++------- src/OnTopReplica.sln | 14 ++++ src/PostInstaller/App.config | 6 ++ src/PostInstaller/IPersistFile.cs | 51 ++++++++++++ src/PostInstaller/IPropertyStore.cs | 28 +++++++ src/PostInstaller/IShellItem.cs | 14 ++++ src/PostInstaller/IShellLink.cs | 64 ++++++++++++++ src/PostInstaller/IUnknown.cs | 22 +++++ src/PostInstaller/PostInstaller.csproj | 72 ++++++++++++++++ src/PostInstaller/Program.cs | 70 ++++++++++++++++ src/PostInstaller/Properties/AssemblyInfo.cs | 36 ++++++++ src/PostInstaller/PropertyKey.cs | 20 +++++ src/PostInstaller/Win32Shell.cs | 27 ++++++ 13 files changed, 482 insertions(+), 29 deletions(-) create mode 100644 src/PostInstaller/App.config create mode 100644 src/PostInstaller/IPersistFile.cs create mode 100644 src/PostInstaller/IPropertyStore.cs create mode 100644 src/PostInstaller/IShellItem.cs create mode 100644 src/PostInstaller/IShellLink.cs create mode 100644 src/PostInstaller/IUnknown.cs create mode 100644 src/PostInstaller/PostInstaller.csproj create mode 100644 src/PostInstaller/Program.cs create mode 100644 src/PostInstaller/Properties/AssemblyInfo.cs create mode 100644 src/PostInstaller/PropertyKey.cs create mode 100644 src/PostInstaller/Win32Shell.cs diff --git a/src/Installer/Installer.vdproj b/src/Installer/Installer.vdproj index a82130d..e6160c7 100644 --- a/src/Installer/Installer.vdproj +++ b/src/Installer/Installer.vdproj @@ -33,6 +33,12 @@ } "Entry" { + "MsmKey" = "8:_E544DEE7648C4E86937A8A746067D64C" + "OwnerKey" = "8:_UNDEFINED" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { "MsmKey" = "8:_FD08D480081E2A6C3D1A5EA9C82FC43F" "OwnerKey" = "8:_FD2FE03164614192A11D674CB6FD870E" "MsmSig" = "8:_UNDEFINED" @@ -52,6 +58,12 @@ "Entry" { "MsmKey" = "8:_UNDEFINED" + "OwnerKey" = "8:_E544DEE7648C4E86937A8A746067D64C" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_UNDEFINED" "OwnerKey" = "8:_FD08D480081E2A6C3D1A5EA9C82FC43F" "MsmSig" = "8:_UNDEFINED" } @@ -127,6 +139,20 @@ { "CustomAction" { + "{4AA51A2D-7D85-4A59-BA75-B0809FC8B380}:_70B50EF584624E8CA01EA1C853DE2D27" + { + "Name" = "8:Primary output from PostInstaller (Active)" + "Condition" = "8:" + "Object" = "8:_E544DEE7648C4E86937A8A746067D64C" + "FileType" = "3:2" + "InstallAction" = "3:1" + "Arguments" = "8:\"[ProgramMenuFolder]OnTopReplica\\OnTopReplica.lnk\" \"LorenzCunoKlopfenstein.OnTopReplica.MainForm\"" + "EntryPoint" = "8:" + "Sequence" = "3:1" + "Identifier" = "8:_FD81C6C3_6535_47C7_AD92_C0871E83103C" + "InstallerClass" = "11:FALSE" + "CustomActionData" = "8:" + } } "DefaultFeature" { @@ -247,17 +273,6 @@ } "Folder" { - "{1525181F-901A-416C-8A58-119130FE478E}:_39F91DA891324B10BB3097F6C6192D17" - { - "Name" = "8:#1916" - "AlwaysCreate" = "11:FALSE" - "Condition" = "8:" - "Transitive" = "11:FALSE" - "Property" = "8:DesktopFolder" - "Folders" - { - } - } "{3C67513D-01DD-4637-8A68-80971EB9504F}:_92458F5B5377456CB04EFACB28735CC9" { "DefaultLocation" = "8:[ProgramFilesFolder][Manufacturer]\\[ProductName]" @@ -309,11 +324,11 @@ "Name" = "8:Microsoft Visual Studio" "ProductName" = "8:OnTopReplica" "ProductCode" = "8:{524E0F6C-A2D8-434C-A32D-3BCBF17FC5C6}" - "PackageCode" = "8:{CA4567E0-2134-40DD-AB06-06E910C7A253}" + "PackageCode" = "8:{4380D7A0-0222-4D27-964F-43FBFB59ACE6}" "UpgradeCode" = "8:{6EBB4E0A-1F0C-4302-AC60-45E05F641909}" "AspNetVersion" = "8:2.0.50727.0" "RestartWWWService" = "11:FALSE" - "RemovePreviousVersions" = "11:FALSE" + "RemovePreviousVersions" = "11:TRUE" "DetectNewerInstalledVersion" = "11:TRUE" "InstallAllUsers" = "11:FALSE" "ProductVersion" = "8:3.6.0" @@ -443,20 +458,6 @@ "Icon" = "8:_BB607179F88446409C91AC786E95410C" "Feature" = "8:" } - "{970C0BB2-C7D0-45D7-ABFA-7EC378858BC0}:_91FD25A1D4E9441B9BADF46738B5D411" - { - "Name" = "8:OnTopReplica" - "Arguments" = "8:" - "Description" = "8:" - "ShowCmd" = "3:1" - "IconIndex" = "3:0" - "Transitive" = "11:FALSE" - "Target" = "8:_FD2FE03164614192A11D674CB6FD870E" - "Folder" = "8:_39F91DA891324B10BB3097F6C6192D17" - "WorkingFolder" = "8:_92458F5B5377456CB04EFACB28735CC9" - "Icon" = "8:_BB607179F88446409C91AC786E95410C" - "Feature" = "8:" - } } "UserInterface" { @@ -1026,7 +1027,7 @@ "Folder" = "8:_92458F5B5377456CB04EFACB28735CC9" "Condition" = "8:" "Transitive" = "11:FALSE" - "Vital" = "11:TRUE" + "Vital" = "11:FALSE" "ReadOnly" = "11:FALSE" "Hidden" = "11:FALSE" "System" = "11:FALSE" @@ -1046,9 +1047,37 @@ { } } + "{5259A561-127C-4D43-A0A1-72F10C7B3BF8}:_E544DEE7648C4E86937A8A746067D64C" + { + "SourcePath" = "8:..\\PostInstaller\\obj\\Debug\\PostInstaller.exe" + "TargetName" = "8:" + "Tag" = "8:" + "Folder" = "8:_92458F5B5377456CB04EFACB28735CC9" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:FALSE" + "IsDependency" = "11:FALSE" + "IsolateTo" = "8:" + "ProjectOutputGroupRegister" = "3:1" + "OutputConfiguration" = "8:" + "OutputGroupCanonicalName" = "8:Built" + "OutputProjectGuid" = "8:{05F8E270-8B47-449B-8755-4599B3B3A565}" + "ShowKeyOutput" = "11:TRUE" + "ExcludeFilters" + { + } + } "{5259A561-127C-4D43-A0A1-72F10C7B3BF8}:_FD2FE03164614192A11D674CB6FD870E" { - "SourcePath" = "8:..\\OnTopReplica\\obj\\Release\\OnTopReplica.exe" + "SourcePath" = "8:..\\OnTopReplica\\obj\\Debug\\OnTopReplica.exe" "TargetName" = "8:" "Tag" = "8:" "Folder" = "8:_92458F5B5377456CB04EFACB28735CC9" diff --git a/src/OnTopReplica.sln b/src/OnTopReplica.sln index fb99208..4603e4e 100644 --- a/src/OnTopReplica.sln +++ b/src/OnTopReplica.sln @@ -7,6 +7,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OnTopReplica", "OnTopReplic EndProject Project("{54435603-DBB4-11D2-8724-00A0C9A8B90C}") = "Installer", "Installer\Installer.vdproj", "{EA7C9C89-0CCF-41E3-A379-D593AAF7A941}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PostInstaller", "PostInstaller\PostInstaller.csproj", "{05F8E270-8B47-449B-8755-4599B3B3A565}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -41,6 +43,18 @@ Global {EA7C9C89-0CCF-41E3-A379-D593AAF7A941}.Release|x64.Build.0 = Release {EA7C9C89-0CCF-41E3-A379-D593AAF7A941}.Release|x86.ActiveCfg = Release {EA7C9C89-0CCF-41E3-A379-D593AAF7A941}.Release|x86.Build.0 = Release + {05F8E270-8B47-449B-8755-4599B3B3A565}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {05F8E270-8B47-449B-8755-4599B3B3A565}.Debug|Any CPU.Build.0 = Debug|Any CPU + {05F8E270-8B47-449B-8755-4599B3B3A565}.Debug|x64.ActiveCfg = Debug|Any CPU + {05F8E270-8B47-449B-8755-4599B3B3A565}.Debug|x64.Build.0 = Debug|Any CPU + {05F8E270-8B47-449B-8755-4599B3B3A565}.Debug|x86.ActiveCfg = Debug|Any CPU + {05F8E270-8B47-449B-8755-4599B3B3A565}.Debug|x86.Build.0 = Debug|Any CPU + {05F8E270-8B47-449B-8755-4599B3B3A565}.Release|Any CPU.ActiveCfg = Release|Any CPU + {05F8E270-8B47-449B-8755-4599B3B3A565}.Release|Any CPU.Build.0 = Release|Any CPU + {05F8E270-8B47-449B-8755-4599B3B3A565}.Release|x64.ActiveCfg = Release|Any CPU + {05F8E270-8B47-449B-8755-4599B3B3A565}.Release|x64.Build.0 = Release|Any CPU + {05F8E270-8B47-449B-8755-4599B3B3A565}.Release|x86.ActiveCfg = Release|Any CPU + {05F8E270-8B47-449B-8755-4599B3B3A565}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/src/PostInstaller/App.config b/src/PostInstaller/App.config new file mode 100644 index 0000000..b9acc38 --- /dev/null +++ b/src/PostInstaller/App.config @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/PostInstaller/IPersistFile.cs b/src/PostInstaller/IPersistFile.cs new file mode 100644 index 0000000..e869ce8 --- /dev/null +++ b/src/PostInstaller/IPersistFile.cs @@ -0,0 +1,51 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Runtime.InteropServices; +using System.Text; + +namespace PostInstaller { + + [ComImportAttribute] + [GuidAttribute("0000010B-0000-0000-C000-000000000046")] + [InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)] + public interface IPersistFile { + + // can't get this to go if I extend IPersist, + // so put it here: + [PreserveSig] + int GetClassID(out Guid pClassID); + + //[helpstring("Checks for changes since + // last file write")] + [PreserveSig] + int IsDirty(); + + //[helpstring("Opens the specified file and + // initializes the object from its contents")] + int Load( + [MarshalAs(UnmanagedType.LPWStr)] string pszFileName, + ulong dwMode); + + //[helpstring("Saves the object into + // the specified file")] + void Save( + [MarshalAs(UnmanagedType.LPWStr)] + string pszFileName, + [MarshalAs(UnmanagedType.Bool)] + bool fRemember); + + //[helpstring("Notifies the object that save + // is completed")] + void SaveCompleted( + [MarshalAs(UnmanagedType.LPWStr)] + string pszFileName); + + //[helpstring("Gets the current name of the + // file associated with the object")] + void GetCurFile( + [MarshalAs(UnmanagedType.LPWStr)] + out string ppszFileName); + + } +} diff --git a/src/PostInstaller/IPropertyStore.cs b/src/PostInstaller/IPropertyStore.cs new file mode 100644 index 0000000..f6e705d --- /dev/null +++ b/src/PostInstaller/IPropertyStore.cs @@ -0,0 +1,28 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Text; + +namespace PostInstaller { + [ComImport] + [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] + [Guid("886D8EEB-8CF2-4446-8D02-CDBA1DBDCF99")] + public interface IPropertyStore { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + void GetCount([Out] out uint cProps); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + void GetAt([In] uint iProp, out PropertyKey pkey); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + void GetValue([In] ref PropertyKey key, out object pv); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + void SetValue([In] ref PropertyKey key, [In] ref object pv); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + void Commit(); + } +} diff --git a/src/PostInstaller/IShellItem.cs b/src/PostInstaller/IShellItem.cs new file mode 100644 index 0000000..0ba3a6d --- /dev/null +++ b/src/PostInstaller/IShellItem.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Runtime.InteropServices; +using System.Text; + +namespace PostInstaller { + [ComImport] + [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] + [Guid("43826d1e-e718-42ee-bc55-a1e261c37bfe")] + public interface IShellItem { + + } +} diff --git a/src/PostInstaller/IShellLink.cs b/src/PostInstaller/IShellLink.cs new file mode 100644 index 0000000..c0efade --- /dev/null +++ b/src/PostInstaller/IShellLink.cs @@ -0,0 +1,64 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Runtime.InteropServices; +using System.Text; + +namespace PostInstaller { + + [ComImport] + [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] + [Guid("000214F9-0000-0000-C000-000000000046")] + public interface IShellLink { + + /// Retrieves the path and file name of a Shell link object + void GetPath([Out(), MarshalAs(UnmanagedType.LPWStr)] StringBuilder pszFile, int cchMaxPath, IntPtr pfd, int fFlags); + + /// Retrieves the list of item identifiers for a Shell link object + void GetIDList(out IntPtr ppidl); + /// Sets the pointer to an item identifier list (PIDL) for a Shell link object. + void SetIDList(IntPtr pidl); + /// Retrieves the description string for a Shell link object + void GetDescription([Out(), MarshalAs(UnmanagedType.LPWStr)] StringBuilder pszName, int cchMaxName); + /// Sets the description for a Shell link object. The description can be any application-defined string + void SetDescription([MarshalAs(UnmanagedType.LPWStr)] string pszName); + /// Retrieves the name of the working directory for a Shell link object + void GetWorkingDirectory([Out(), MarshalAs(UnmanagedType.LPWStr)] StringBuilder pszDir, int cchMaxPath); + /// Sets the name of the working directory for a Shell link object + void SetWorkingDirectory([MarshalAs(UnmanagedType.LPWStr)] string pszDir); + /// Retrieves the command-line arguments associated with a Shell link object + void GetArguments([Out(), MarshalAs(UnmanagedType.LPWStr)] StringBuilder pszArgs, int cchMaxPath); + /// Sets the command-line arguments for a Shell link object + void SetArguments([MarshalAs(UnmanagedType.LPWStr)] string pszArgs); + /// Retrieves the hot key for a Shell link object + void GetHotkey(out short pwHotkey); + /// Sets a hot key for a Shell link object + void SetHotkey(short wHotkey); + /// Retrieves the show command for a Shell link object + void GetShowCmd(out int piShowCmd); + /// Sets the show command for a Shell link object. The show command sets the initial show state of the window. + void SetShowCmd(int iShowCmd); + /// Retrieves the location (path and index) of the icon for a Shell link object + void GetIconLocation([Out(), MarshalAs(UnmanagedType.LPWStr)] StringBuilder pszIconPath, + int cchIconPath, out int piIcon); + /// Sets the location (path and index) of the icon for a Shell link object + void SetIconLocation([MarshalAs(UnmanagedType.LPWStr)] string pszIconPath, int iIcon); + /// Sets the relative path to the Shell link object + void SetRelativePath([MarshalAs(UnmanagedType.LPWStr)] string pszPathRel, int dwReserved); + + /// Attempts to find the target of a Shell link, even if it has been moved or renamed + void Resolve(IntPtr hwnd, int fFlags); + + /// Sets the path and file name of a Shell link object + void SetPath([MarshalAs(UnmanagedType.LPWStr)] string pszFile); + + } + + [GuidAttribute("00021401-0000-0000-C000-000000000046")] + [ClassInterfaceAttribute(ClassInterfaceType.None)] + [ComImportAttribute()] + public class CShellLink { + + } + +} diff --git a/src/PostInstaller/IUnknown.cs b/src/PostInstaller/IUnknown.cs new file mode 100644 index 0000000..cb2b03c --- /dev/null +++ b/src/PostInstaller/IUnknown.cs @@ -0,0 +1,22 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Runtime.InteropServices; +using System.Text; + +namespace PostInstaller { + [ComImport] + //[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] + [Guid("00000000-0000-0000-C000-000000000046")] + public interface IUnknown { + + IntPtr QueryInterface(ref Guid riid); + + [PreserveSig] + ulong AddRef(); + + [PreserveSig] + ulong Release(); + + } +} diff --git a/src/PostInstaller/PostInstaller.csproj b/src/PostInstaller/PostInstaller.csproj new file mode 100644 index 0000000..6edc8af --- /dev/null +++ b/src/PostInstaller/PostInstaller.csproj @@ -0,0 +1,72 @@ + + + + + Debug + AnyCPU + {05F8E270-8B47-449B-8755-4599B3B3A565} + Exe + Properties + PostInstaller + PostInstaller + v4.7 + 512 + + + + + AnyCPU + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + false + + + AnyCPU + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + false + + + PostInstaller.Program + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/PostInstaller/Program.cs b/src/PostInstaller/Program.cs new file mode 100644 index 0000000..294e2cc --- /dev/null +++ b/src/PostInstaller/Program.cs @@ -0,0 +1,70 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Runtime.InteropServices; +using System.Text; +using System.Threading.Tasks; + +namespace PostInstaller { + class Program { + static int Main(string[] args) { +#if DEBUG + foreach(var a in args) { + Console.Write(a); + Console.Write(" "); + } + Console.WriteLine(); +#endif + + var success = Run(args); + +#if DEBUG + Console.Read(); +#endif + + return success ? 0 : 1; + } + + private static bool Run(string[] args) { +#if DEBUG + Console.WriteLine("Attempting to create IShellItem for file {0}...", args[0]); +#endif + IShellLink link = (IShellLink)new CShellLink(); + + //Win32Shell.SHCreateItemFromParsingName(args[0], IntPtr.Zero, Win32Shell.IShellLinkId, out link); + IPersistFile persistFileLink = (IPersistFile)link; + if (persistFileLink.Load(args[0], 0x00000002L) != 0) { + Console.WriteLine("Failed to load via IPersistFile."); + return false; + } + + link.Resolve(IntPtr.Zero, 0); + +#if DEBUG + Console.WriteLine("Querying for IPropertyStore interface..."); +#endif + IPropertyStore propStore = (IPropertyStore)link; + + try { +#if DEBUG + Console.WriteLine("Attempting to set property 'System.AppUserModel.ID' to {0}...", args[1]); +#endif + + PropertyKey appUserModelKey = new PropertyKey(new Guid("9F4C2855-9F79-4B39-A8D0-E1D42DE1D5F3"), 5); + propStore.SetValue(ref appUserModelKey, new BStrWrapper(args[1])); + propStore.Commit(); + + //Store + ((IPersistFile)link).Save(args[0], false); + } + catch (Exception ex) { + Console.WriteLine("Unable to set value of AppUserModel.ID property."); + Console.WriteLine(ex); + + return false; + } + + return true; + } + } +} diff --git a/src/PostInstaller/Properties/AssemblyInfo.cs b/src/PostInstaller/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..2f734b9 --- /dev/null +++ b/src/PostInstaller/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("PostInstaller")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("PostInstaller")] +[assembly: AssemblyCopyright("Copyright © 2013")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("ef62555b-7bd2-40aa-8704-874f8ce12268")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/src/PostInstaller/PropertyKey.cs b/src/PostInstaller/PropertyKey.cs new file mode 100644 index 0000000..d9b75b9 --- /dev/null +++ b/src/PostInstaller/PropertyKey.cs @@ -0,0 +1,20 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Runtime.InteropServices; +using System.Text; + +namespace PostInstaller { + [StructLayout(LayoutKind.Sequential)] + public struct PropertyKey { + + public PropertyKey(Guid formatId, uint propertyId) { + fmtid = formatId; + pid = propertyId; + } + + public Guid fmtid; + public uint pid; + + } +} diff --git a/src/PostInstaller/Win32Shell.cs b/src/PostInstaller/Win32Shell.cs new file mode 100644 index 0000000..824d1b9 --- /dev/null +++ b/src/PostInstaller/Win32Shell.cs @@ -0,0 +1,27 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Runtime.InteropServices; +using System.Text; + +namespace PostInstaller { + public static class Win32Shell { + + public readonly static Guid IShellItemId = new Guid("43826d1e-e718-42ee-bc55-a1e261c37bfe"); + + public readonly static Guid IShellLinkId = new Guid("000214F9-0000-0000-C000-000000000046"); + + public readonly static Guid IUnknownId = new Guid("00000000-0000-0000-C000-000000000046"); + + public readonly static Guid IPropertyStoreId = new Guid("886D8EEB-8CF2-4446-8D02-CDBA1DBDCF99"); + + [DllImport("shell32.dll", CharSet = CharSet.Unicode, PreserveSig = false)] + public static extern void SHCreateItemFromParsingName( + [In][MarshalAs(UnmanagedType.LPWStr)] string pszPath, + [In] IntPtr pbc, + [In][MarshalAs(UnmanagedType.LPStruct)] Guid iIdIShellItem, + [Out][MarshalAs(UnmanagedType.Interface, IidParameterIndex = 2)] out IShellLink iShellItem + ); + + } +} From ecaca270732a9285fa3d5b0643232945ae31c1b6 Mon Sep 17 00:00:00 2001 From: Lorenz Cuno Klopfenstein Date: Tue, 10 Apr 2018 23:38:58 +0200 Subject: [PATCH 5/5] Update installer metadata --- src/Installer/Installer.vdproj | 19 +++++++------------ 1 file changed, 7 insertions(+), 12 deletions(-) diff --git a/src/Installer/Installer.vdproj b/src/Installer/Installer.vdproj index e6160c7..73d4329 100644 --- a/src/Installer/Installer.vdproj +++ b/src/Installer/Installer.vdproj @@ -58,13 +58,13 @@ "Entry" { "MsmKey" = "8:_UNDEFINED" - "OwnerKey" = "8:_E544DEE7648C4E86937A8A746067D64C" + "OwnerKey" = "8:_FD08D480081E2A6C3D1A5EA9C82FC43F" "MsmSig" = "8:_UNDEFINED" } "Entry" { "MsmKey" = "8:_UNDEFINED" - "OwnerKey" = "8:_FD08D480081E2A6C3D1A5EA9C82FC43F" + "OwnerKey" = "8:_E544DEE7648C4E86937A8A746067D64C" "MsmSig" = "8:_UNDEFINED" } } @@ -243,11 +243,6 @@ "AssemblyAsmDisplayName" = "8:WindowsFormsAero, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL" "ScatterAssemblies" { - "_FD08D480081E2A6C3D1A5EA9C82FC43F" - { - "Name" = "8:WindowsFormsAero.dll" - "Attributes" = "3:512" - } } "SourcePath" = "8:WindowsFormsAero.dll" "TargetName" = "8:" @@ -323,15 +318,15 @@ { "Name" = "8:Microsoft Visual Studio" "ProductName" = "8:OnTopReplica" - "ProductCode" = "8:{524E0F6C-A2D8-434C-A32D-3BCBF17FC5C6}" - "PackageCode" = "8:{4380D7A0-0222-4D27-964F-43FBFB59ACE6}" + "ProductCode" = "8:{F149C020-D121-45B2-A630-5DB052413244}" + "PackageCode" = "8:{26DD2132-FA97-4154-B46C-D92B25F16FED}" "UpgradeCode" = "8:{6EBB4E0A-1F0C-4302-AC60-45E05F641909}" "AspNetVersion" = "8:2.0.50727.0" "RestartWWWService" = "11:FALSE" "RemovePreviousVersions" = "11:TRUE" "DetectNewerInstalledVersion" = "11:TRUE" "InstallAllUsers" = "11:FALSE" - "ProductVersion" = "8:3.6.0" + "ProductVersion" = "8:3.5.1" "Manufacturer" = "8:OnTopReplica" "ARPHELPTELEPHONE" = "8:" "ARPHELPLINK" = "8:https://github.com/LorenzCK/OnTopReplica/issues" @@ -1049,7 +1044,7 @@ } "{5259A561-127C-4D43-A0A1-72F10C7B3BF8}:_E544DEE7648C4E86937A8A746067D64C" { - "SourcePath" = "8:..\\PostInstaller\\obj\\Debug\\PostInstaller.exe" + "SourcePath" = "8:..\\PostInstaller\\obj\\Release\\PostInstaller.exe" "TargetName" = "8:" "Tag" = "8:" "Folder" = "8:_92458F5B5377456CB04EFACB28735CC9" @@ -1077,7 +1072,7 @@ } "{5259A561-127C-4D43-A0A1-72F10C7B3BF8}:_FD2FE03164614192A11D674CB6FD870E" { - "SourcePath" = "8:..\\OnTopReplica\\obj\\Debug\\OnTopReplica.exe" + "SourcePath" = "8:..\\OnTopReplica\\obj\\Release\\OnTopReplica.exe" "TargetName" = "8:" "Tag" = "8:" "Folder" = "8:_92458F5B5377456CB04EFACB28735CC9"