Compare commits
110 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| b055ff4ed4 | |||
| 6a20421948 | |||
|
|
edc278dcd1 | ||
| 152942018a | |||
|
|
722889789e | ||
|
|
b695522a68 | ||
|
|
205f60fd7d | ||
|
|
b00c5b8264 | ||
| d93e5e49c9 | |||
| 4eabd95506 | |||
| 194ccc33a4 | |||
| f2c6280bf3 | |||
|
|
662ae41f68 | ||
|
|
441be217d9 | ||
| 8bb54cb56c | |||
|
|
ced8a5cc64 | ||
| a2cd5280bd | |||
|
|
a2375700b1 | ||
| af243cc4d8 | |||
| 9f4120c2d1 | |||
| 6aab774795 | |||
| 973ca4a31d | |||
| 8cf98ea2d9 | |||
| bd1bcd4e71 | |||
| ac66951d76 | |||
| cf92ae0483 | |||
| cba4008a06 | |||
| b6fb178827 | |||
| eaf5f0673a | |||
| b026bbe0d4 | |||
| 31cf125c2f | |||
| 0e81d14566 | |||
| bffbd0fe81 | |||
| 8c3e636d27 | |||
| 762437a908 | |||
| 908430fd24 | |||
| 8533ff4c34 | |||
| 7022db1e5c | |||
| 535c025276 | |||
| e12ca8b62e | |||
| 2a8947f378 | |||
| 96d63effa5 | |||
| 8bb2aef5cc | |||
| ba6e0178ec | |||
| df4f4cf659 | |||
| 9f907f8649 | |||
| 3009a90b76 | |||
| f49da62379 | |||
| d6795e4723 | |||
| f53256f5b1 | |||
| 874ca7e806 | |||
| a5431175d9 | |||
| 2066925844 | |||
| 6bcf8a60ba | |||
| d65776ff98 | |||
| 33f67c14f1 | |||
| 747734a763 | |||
| c57b94786f | |||
| b6892ae43b | |||
| 1e68e2b47e | |||
| 6e75e403fa | |||
| 1e4e7fdcaa | |||
| 43a3bc793c | |||
| 0728582be0 | |||
| 15325eb43a | |||
| e2f7ca88c1 | |||
| deb7938ff8 | |||
| 588f921a73 | |||
| bb4cb9cfa3 | |||
| b0c02e208f | |||
| 1f5fce7ca0 | |||
| 24344ccbd5 | |||
| 0274898db4 | |||
| ecbf185896 | |||
| 80200d7054 | |||
| 120cf894ed | |||
| 86b268f13f | |||
| 1611f0ea68 | |||
| bb37110a4f | |||
| 53a58eadcb | |||
| 22e2ebff94 | |||
| 83cb8bf5a5 | |||
| 9d8e84b80f | |||
| a69ec4feb7 | |||
| aeb24d659d | |||
| b3109e4ac7 | |||
| adfd058fa1 | |||
| 7a909d1ee5 | |||
| 5e834b582f | |||
| e9b571aa81 | |||
| 179026d4ca | |||
| 0da66544f0 | |||
| eaf5668528 | |||
| 5b74577347 | |||
| b13b59beed | |||
|
|
2c5def54ca | ||
| 889457a8d3 | |||
|
|
472300c1d8 | ||
| 28de2cc6c9 | |||
| 86aa07e89f | |||
| 194b5129b8 | |||
| b412559483 | |||
| 037390a9c7 | |||
|
|
f9e21667a7 | ||
| ef12d4f7a9 | |||
| 842118cbea | |||
| 93fe4a94b2 | |||
| 7466e33599 | |||
|
|
07e082e967 | ||
| bcd58e9631 |
@@ -1,423 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<!DOCTYPE QtCreatorProject>
|
|
||||||
<!-- Written by QtCreator 4.11.1, 2025-04-10T12:35:59. -->
|
|
||||||
<qtcreator>
|
|
||||||
<data>
|
|
||||||
<variable>EnvironmentId</variable>
|
|
||||||
<value type="QByteArray">{08851f69-ba1e-4324-82d1-68caa9ee1f99}</value>
|
|
||||||
</data>
|
|
||||||
<data>
|
|
||||||
<variable>ProjectExplorer.Project.ActiveTarget</variable>
|
|
||||||
<value type="int">0</value>
|
|
||||||
</data>
|
|
||||||
<data>
|
|
||||||
<variable>ProjectExplorer.Project.EditorSettings</variable>
|
|
||||||
<valuemap type="QVariantMap">
|
|
||||||
<value type="bool" key="EditorConfiguration.AutoIndent">true</value>
|
|
||||||
<value type="bool" key="EditorConfiguration.AutoSpacesForTabs">false</value>
|
|
||||||
<value type="bool" key="EditorConfiguration.CamelCaseNavigation">true</value>
|
|
||||||
<valuemap type="QVariantMap" key="EditorConfiguration.CodeStyle.0">
|
|
||||||
<value type="QString" key="language">Cpp</value>
|
|
||||||
<valuemap type="QVariantMap" key="value">
|
|
||||||
<value type="QByteArray" key="CurrentPreferences">CppGlobal</value>
|
|
||||||
</valuemap>
|
|
||||||
</valuemap>
|
|
||||||
<valuemap type="QVariantMap" key="EditorConfiguration.CodeStyle.1">
|
|
||||||
<value type="QString" key="language">QmlJS</value>
|
|
||||||
<valuemap type="QVariantMap" key="value">
|
|
||||||
<value type="QByteArray" key="CurrentPreferences">QmlJSGlobal</value>
|
|
||||||
</valuemap>
|
|
||||||
</valuemap>
|
|
||||||
<value type="int" key="EditorConfiguration.CodeStyle.Count">2</value>
|
|
||||||
<value type="QByteArray" key="EditorConfiguration.Codec">UTF-8</value>
|
|
||||||
<value type="bool" key="EditorConfiguration.ConstrainTooltips">false</value>
|
|
||||||
<value type="int" key="EditorConfiguration.IndentSize">4</value>
|
|
||||||
<value type="bool" key="EditorConfiguration.KeyboardTooltips">false</value>
|
|
||||||
<value type="int" key="EditorConfiguration.MarginColumn">80</value>
|
|
||||||
<value type="bool" key="EditorConfiguration.MouseHiding">true</value>
|
|
||||||
<value type="bool" key="EditorConfiguration.MouseNavigation">true</value>
|
|
||||||
<value type="int" key="EditorConfiguration.PaddingMode">1</value>
|
|
||||||
<value type="bool" key="EditorConfiguration.ScrollWheelZooming">true</value>
|
|
||||||
<value type="bool" key="EditorConfiguration.ShowMargin">false</value>
|
|
||||||
<value type="int" key="EditorConfiguration.SmartBackspaceBehavior">0</value>
|
|
||||||
<value type="bool" key="EditorConfiguration.SmartSelectionChanging">true</value>
|
|
||||||
<value type="bool" key="EditorConfiguration.SpacesForTabs">true</value>
|
|
||||||
<value type="int" key="EditorConfiguration.TabKeyBehavior">0</value>
|
|
||||||
<value type="int" key="EditorConfiguration.TabSize">8</value>
|
|
||||||
<value type="bool" key="EditorConfiguration.UseGlobal">true</value>
|
|
||||||
<value type="int" key="EditorConfiguration.Utf8BomBehavior">1</value>
|
|
||||||
<value type="bool" key="EditorConfiguration.addFinalNewLine">true</value>
|
|
||||||
<value type="bool" key="EditorConfiguration.cleanIndentation">true</value>
|
|
||||||
<value type="bool" key="EditorConfiguration.cleanWhitespace">true</value>
|
|
||||||
<value type="bool" key="EditorConfiguration.inEntireDocument">false</value>
|
|
||||||
</valuemap>
|
|
||||||
</data>
|
|
||||||
<data>
|
|
||||||
<variable>ProjectExplorer.Project.PluginSettings</variable>
|
|
||||||
<valuemap type="QVariantMap">
|
|
||||||
<valuelist type="QVariantList" key="ClangCodeModel.CustomCommandLineKey">
|
|
||||||
<value type="QString">-fno-delayed-template-parsing</value>
|
|
||||||
</valuelist>
|
|
||||||
<value type="bool" key="ClangCodeModel.UseGlobalConfig">true</value>
|
|
||||||
</valuemap>
|
|
||||||
</data>
|
|
||||||
<data>
|
|
||||||
<variable>ProjectExplorer.Project.Target.0</variable>
|
|
||||||
<valuemap type="QVariantMap">
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Desktop Qt 5.14.2 MinGW 64-bit</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Desktop Qt 5.14.2 MinGW 64-bit</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">qt.qt5.5142.win64_mingw73_kit</value>
|
|
||||||
<value type="int" key="ProjectExplorer.Target.ActiveBuildConfiguration">0</value>
|
|
||||||
<value type="int" key="ProjectExplorer.Target.ActiveDeployConfiguration">0</value>
|
|
||||||
<value type="int" key="ProjectExplorer.Target.ActiveRunConfiguration">1</value>
|
|
||||||
<valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.0">
|
|
||||||
<valuelist type="QVariantList" key="CMake.Configuration">
|
|
||||||
<value type="QString">CMAKE_BUILD_TYPE:STRING=Debug</value>
|
|
||||||
<value type="QString">CMAKE_CXX_COMPILER:STRING=%{Compiler:Executable:Cxx}</value>
|
|
||||||
<value type="QString">CMAKE_C_COMPILER:STRING=%{Compiler:Executable:C}</value>
|
|
||||||
<value type="QString">CMAKE_PREFIX_PATH:STRING=%{Qt:QT_INSTALL_PREFIX}</value>
|
|
||||||
<value type="QString">QT_QMAKE_EXECUTABLE:STRING=%{Qt:qmakeExecutable}</value>
|
|
||||||
</valuelist>
|
|
||||||
<value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">D:/LOCAL_REP_RRJ_SERVER/RRJServer/BUILDS/Debug64</value>
|
|
||||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
|
|
||||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
|
|
||||||
<value type="QString" key="CMakeProjectManager.MakeStep.AdditionalArguments"></value>
|
|
||||||
<valuelist type="QVariantList" key="CMakeProjectManager.MakeStep.BuildTargets">
|
|
||||||
<value type="QString">all</value>
|
|
||||||
</valuelist>
|
|
||||||
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">CMakeProjectManager.MakeStep</value>
|
|
||||||
</valuemap>
|
|
||||||
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Сборка</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Сборка</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value>
|
|
||||||
</valuemap>
|
|
||||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.1">
|
|
||||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
|
|
||||||
<value type="QString" key="CMakeProjectManager.MakeStep.AdditionalArguments"></value>
|
|
||||||
<valuelist type="QVariantList" key="CMakeProjectManager.MakeStep.BuildTargets">
|
|
||||||
<value type="QString">clean</value>
|
|
||||||
</valuelist>
|
|
||||||
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">CMakeProjectManager.MakeStep</value>
|
|
||||||
</valuemap>
|
|
||||||
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Очистка</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Очистка</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value>
|
|
||||||
</valuemap>
|
|
||||||
<value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value>
|
|
||||||
<value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value>
|
|
||||||
<valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Отладка</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">CMakeProjectManager.CMakeBuildConfiguration</value>
|
|
||||||
</valuemap>
|
|
||||||
<valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.1">
|
|
||||||
<valuelist type="QVariantList" key="CMake.Configuration">
|
|
||||||
<value type="QString">CMAKE_BUILD_TYPE:STRING=Release</value>
|
|
||||||
<value type="QString">CMAKE_CXX_COMPILER:STRING=%{Compiler:Executable:Cxx}</value>
|
|
||||||
<value type="QString">CMAKE_C_COMPILER:STRING=%{Compiler:Executable:C}</value>
|
|
||||||
<value type="QString">CMAKE_PREFIX_PATH:STRING=%{Qt:QT_INSTALL_PREFIX}</value>
|
|
||||||
<value type="QString">QT_QMAKE_EXECUTABLE:STRING=%{Qt:qmakeExecutable}</value>
|
|
||||||
</valuelist>
|
|
||||||
<value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">D:/LOCAL_REP_RRJ_SERVER/RRJServer/BUILDS/Release64</value>
|
|
||||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
|
|
||||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
|
|
||||||
<value type="QString" key="CMakeProjectManager.MakeStep.AdditionalArguments"></value>
|
|
||||||
<valuelist type="QVariantList" key="CMakeProjectManager.MakeStep.BuildTargets">
|
|
||||||
<value type="QString">all</value>
|
|
||||||
</valuelist>
|
|
||||||
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">CMakeProjectManager.MakeStep</value>
|
|
||||||
</valuemap>
|
|
||||||
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Сборка</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Сборка</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value>
|
|
||||||
</valuemap>
|
|
||||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.1">
|
|
||||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
|
|
||||||
<value type="QString" key="CMakeProjectManager.MakeStep.AdditionalArguments"></value>
|
|
||||||
<valuelist type="QVariantList" key="CMakeProjectManager.MakeStep.BuildTargets">
|
|
||||||
<value type="QString">clean</value>
|
|
||||||
</valuelist>
|
|
||||||
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">CMakeProjectManager.MakeStep</value>
|
|
||||||
</valuemap>
|
|
||||||
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Очистка</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Очистка</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value>
|
|
||||||
</valuemap>
|
|
||||||
<value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value>
|
|
||||||
<value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value>
|
|
||||||
<valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Выпуск</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">CMakeProjectManager.CMakeBuildConfiguration</value>
|
|
||||||
</valuemap>
|
|
||||||
<valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.2">
|
|
||||||
<valuelist type="QVariantList" key="CMake.Configuration">
|
|
||||||
<value type="QString">CMAKE_BUILD_TYPE:STRING=RelWithDebInfo</value>
|
|
||||||
<value type="QString">CMAKE_CXX_COMPILER:STRING=%{Compiler:Executable:Cxx}</value>
|
|
||||||
<value type="QString">CMAKE_C_COMPILER:STRING=%{Compiler:Executable:C}</value>
|
|
||||||
<value type="QString">CMAKE_PREFIX_PATH:STRING=%{Qt:QT_INSTALL_PREFIX}</value>
|
|
||||||
<value type="QString">QT_QMAKE_EXECUTABLE:STRING=%{Qt:qmakeExecutable}</value>
|
|
||||||
</valuelist>
|
|
||||||
<value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">D:/LOCAL_REP_RRJ_SERVER/build-RRJServer-Desktop_Qt_5_14_2_MinGW_64_bit-RelWithDebInfo</value>
|
|
||||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
|
|
||||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
|
|
||||||
<value type="QString" key="CMakeProjectManager.MakeStep.AdditionalArguments"></value>
|
|
||||||
<valuelist type="QVariantList" key="CMakeProjectManager.MakeStep.BuildTargets">
|
|
||||||
<value type="QString">all</value>
|
|
||||||
</valuelist>
|
|
||||||
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">CMakeProjectManager.MakeStep</value>
|
|
||||||
</valuemap>
|
|
||||||
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Сборка</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Сборка</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value>
|
|
||||||
</valuemap>
|
|
||||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.1">
|
|
||||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
|
|
||||||
<value type="QString" key="CMakeProjectManager.MakeStep.AdditionalArguments"></value>
|
|
||||||
<valuelist type="QVariantList" key="CMakeProjectManager.MakeStep.BuildTargets">
|
|
||||||
<value type="QString">clean</value>
|
|
||||||
</valuelist>
|
|
||||||
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">CMakeProjectManager.MakeStep</value>
|
|
||||||
</valuemap>
|
|
||||||
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Очистка</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Очистка</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value>
|
|
||||||
</valuemap>
|
|
||||||
<value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value>
|
|
||||||
<value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value>
|
|
||||||
<valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Выпуск с отладочной информацией</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">CMakeProjectManager.CMakeBuildConfiguration</value>
|
|
||||||
</valuemap>
|
|
||||||
<valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.3">
|
|
||||||
<valuelist type="QVariantList" key="CMake.Configuration">
|
|
||||||
<value type="QString">CMAKE_BUILD_TYPE:STRING=MinSizeRel</value>
|
|
||||||
<value type="QString">CMAKE_CXX_COMPILER:STRING=%{Compiler:Executable:Cxx}</value>
|
|
||||||
<value type="QString">CMAKE_C_COMPILER:STRING=%{Compiler:Executable:C}</value>
|
|
||||||
<value type="QString">CMAKE_PREFIX_PATH:STRING=%{Qt:QT_INSTALL_PREFIX}</value>
|
|
||||||
<value type="QString">QT_QMAKE_EXECUTABLE:STRING=%{Qt:qmakeExecutable}</value>
|
|
||||||
</valuelist>
|
|
||||||
<value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">D:/LOCAL_REP_RRJ_SERVER/build-RRJServer-Desktop_Qt_5_14_2_MinGW_64_bit-MinSizeRel</value>
|
|
||||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
|
|
||||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
|
|
||||||
<value type="QString" key="CMakeProjectManager.MakeStep.AdditionalArguments"></value>
|
|
||||||
<valuelist type="QVariantList" key="CMakeProjectManager.MakeStep.BuildTargets">
|
|
||||||
<value type="QString">all</value>
|
|
||||||
</valuelist>
|
|
||||||
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">CMakeProjectManager.MakeStep</value>
|
|
||||||
</valuemap>
|
|
||||||
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Сборка</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Сборка</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value>
|
|
||||||
</valuemap>
|
|
||||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.1">
|
|
||||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
|
|
||||||
<value type="QString" key="CMakeProjectManager.MakeStep.AdditionalArguments"></value>
|
|
||||||
<valuelist type="QVariantList" key="CMakeProjectManager.MakeStep.BuildTargets">
|
|
||||||
<value type="QString">clean</value>
|
|
||||||
</valuelist>
|
|
||||||
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">CMakeProjectManager.MakeStep</value>
|
|
||||||
</valuemap>
|
|
||||||
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Очистка</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Очистка</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value>
|
|
||||||
</valuemap>
|
|
||||||
<value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value>
|
|
||||||
<value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value>
|
|
||||||
<valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Выпуск минимального размера</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">CMakeProjectManager.CMakeBuildConfiguration</value>
|
|
||||||
</valuemap>
|
|
||||||
<value type="int" key="ProjectExplorer.Target.BuildConfigurationCount">4</value>
|
|
||||||
<valuemap type="QVariantMap" key="ProjectExplorer.Target.DeployConfiguration.0">
|
|
||||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
|
|
||||||
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">0</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Развёртывание</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Развёртывание</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Deploy</value>
|
|
||||||
</valuemap>
|
|
||||||
<value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">1</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.DefaultDeployConfiguration</value>
|
|
||||||
</valuemap>
|
|
||||||
<value type="int" key="ProjectExplorer.Target.DeployConfigurationCount">1</value>
|
|
||||||
<valuemap type="QVariantMap" key="ProjectExplorer.Target.PluginSettings"/>
|
|
||||||
<valuemap type="QVariantMap" key="ProjectExplorer.Target.RunConfiguration.0">
|
|
||||||
<value type="QString" key="Analyzer.Perf.CallgraphMode">dwarf</value>
|
|
||||||
<valuelist type="QVariantList" key="Analyzer.Perf.Events">
|
|
||||||
<value type="QString">cpu-cycles</value>
|
|
||||||
</valuelist>
|
|
||||||
<valuelist type="QVariantList" key="Analyzer.Perf.ExtraArguments"/>
|
|
||||||
<value type="int" key="Analyzer.Perf.Frequency">250</value>
|
|
||||||
<valuelist type="QVariantList" key="Analyzer.Perf.RecordArguments">
|
|
||||||
<value type="QString">-e</value>
|
|
||||||
<value type="QString">cpu-cycles</value>
|
|
||||||
<value type="QString">--call-graph</value>
|
|
||||||
<value type="QString">dwarf,4096</value>
|
|
||||||
<value type="QString">-F</value>
|
|
||||||
<value type="QString">250</value>
|
|
||||||
</valuelist>
|
|
||||||
<value type="QString" key="Analyzer.Perf.SampleMode">-F</value>
|
|
||||||
<value type="bool" key="Analyzer.Perf.Settings.UseGlobalSettings">true</value>
|
|
||||||
<value type="int" key="Analyzer.Perf.StackSize">4096</value>
|
|
||||||
<value type="bool" key="Analyzer.QmlProfiler.AggregateTraces">false</value>
|
|
||||||
<value type="bool" key="Analyzer.QmlProfiler.FlushEnabled">false</value>
|
|
||||||
<value type="uint" key="Analyzer.QmlProfiler.FlushInterval">1000</value>
|
|
||||||
<value type="QString" key="Analyzer.QmlProfiler.LastTraceFile"></value>
|
|
||||||
<value type="bool" key="Analyzer.QmlProfiler.Settings.UseGlobalSettings">true</value>
|
|
||||||
<valuelist type="QVariantList" key="Analyzer.Valgrind.AddedSuppressionFiles"/>
|
|
||||||
<value type="bool" key="Analyzer.Valgrind.Callgrind.CollectBusEvents">false</value>
|
|
||||||
<value type="bool" key="Analyzer.Valgrind.Callgrind.CollectSystime">false</value>
|
|
||||||
<value type="bool" key="Analyzer.Valgrind.Callgrind.EnableBranchSim">false</value>
|
|
||||||
<value type="bool" key="Analyzer.Valgrind.Callgrind.EnableCacheSim">false</value>
|
|
||||||
<value type="bool" key="Analyzer.Valgrind.Callgrind.EnableEventToolTips">true</value>
|
|
||||||
<value type="double" key="Analyzer.Valgrind.Callgrind.MinimumCostRatio">0.01</value>
|
|
||||||
<value type="double" key="Analyzer.Valgrind.Callgrind.VisualisationMinimumCostRatio">10</value>
|
|
||||||
<value type="bool" key="Analyzer.Valgrind.FilterExternalIssues">true</value>
|
|
||||||
<value type="QString" key="Analyzer.Valgrind.KCachegrindExecutable">kcachegrind</value>
|
|
||||||
<value type="int" key="Analyzer.Valgrind.LeakCheckOnFinish">1</value>
|
|
||||||
<value type="int" key="Analyzer.Valgrind.NumCallers">25</value>
|
|
||||||
<valuelist type="QVariantList" key="Analyzer.Valgrind.RemovedSuppressionFiles"/>
|
|
||||||
<value type="int" key="Analyzer.Valgrind.SelfModifyingCodeDetection">1</value>
|
|
||||||
<value type="bool" key="Analyzer.Valgrind.Settings.UseGlobalSettings">true</value>
|
|
||||||
<value type="bool" key="Analyzer.Valgrind.ShowReachable">false</value>
|
|
||||||
<value type="bool" key="Analyzer.Valgrind.TrackOrigins">true</value>
|
|
||||||
<value type="QString" key="Analyzer.Valgrind.ValgrindExecutable">valgrind</value>
|
|
||||||
<valuelist type="QVariantList" key="Analyzer.Valgrind.VisibleErrorKinds">
|
|
||||||
<value type="int">0</value>
|
|
||||||
<value type="int">1</value>
|
|
||||||
<value type="int">2</value>
|
|
||||||
<value type="int">3</value>
|
|
||||||
<value type="int">4</value>
|
|
||||||
<value type="int">5</value>
|
|
||||||
<value type="int">6</value>
|
|
||||||
<value type="int">7</value>
|
|
||||||
<value type="int">8</value>
|
|
||||||
<value type="int">9</value>
|
|
||||||
<value type="int">10</value>
|
|
||||||
<value type="int">11</value>
|
|
||||||
<value type="int">12</value>
|
|
||||||
<value type="int">13</value>
|
|
||||||
<value type="int">14</value>
|
|
||||||
</valuelist>
|
|
||||||
<value type="int" key="PE.EnvironmentAspect.Base">2</value>
|
|
||||||
<valuelist type="QVariantList" key="PE.EnvironmentAspect.Changes"/>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">GUIdataBaseLMS</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">CMakeProjectManager.CMakeRunConfiguration.GUIdataBaseLMS</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.RunConfiguration.BuildKey">GUIdataBaseLMS</value>
|
|
||||||
<value type="QString" key="RunConfiguration.Arguments"></value>
|
|
||||||
<value type="bool" key="RunConfiguration.Arguments.multi">false</value>
|
|
||||||
<value type="QString" key="RunConfiguration.OverrideDebuggerStartup"></value>
|
|
||||||
<value type="bool" key="RunConfiguration.UseCppDebugger">false</value>
|
|
||||||
<value type="bool" key="RunConfiguration.UseCppDebuggerAuto">true</value>
|
|
||||||
<value type="bool" key="RunConfiguration.UseLibrarySearchPath">true</value>
|
|
||||||
<value type="bool" key="RunConfiguration.UseMultiProcess">false</value>
|
|
||||||
<value type="bool" key="RunConfiguration.UseQmlDebugger">false</value>
|
|
||||||
<value type="bool" key="RunConfiguration.UseQmlDebuggerAuto">true</value>
|
|
||||||
<value type="QString" key="RunConfiguration.WorkingDirectory"></value>
|
|
||||||
<value type="QString" key="RunConfiguration.WorkingDirectory.default">D:/LOCAL_REP_RRJ_SERVER/RRJServer/BUILDS/Debug64/GUIdataBaseLMS</value>
|
|
||||||
</valuemap>
|
|
||||||
<valuemap type="QVariantMap" key="ProjectExplorer.Target.RunConfiguration.1">
|
|
||||||
<value type="QString" key="Analyzer.Perf.CallgraphMode">dwarf</value>
|
|
||||||
<valuelist type="QVariantList" key="Analyzer.Perf.Events">
|
|
||||||
<value type="QString">cpu-cycles</value>
|
|
||||||
</valuelist>
|
|
||||||
<valuelist type="QVariantList" key="Analyzer.Perf.ExtraArguments"/>
|
|
||||||
<value type="int" key="Analyzer.Perf.Frequency">250</value>
|
|
||||||
<valuelist type="QVariantList" key="Analyzer.Perf.RecordArguments">
|
|
||||||
<value type="QString">-e</value>
|
|
||||||
<value type="QString">cpu-cycles</value>
|
|
||||||
<value type="QString">--call-graph</value>
|
|
||||||
<value type="QString">dwarf,4096</value>
|
|
||||||
<value type="QString">-F</value>
|
|
||||||
<value type="QString">250</value>
|
|
||||||
</valuelist>
|
|
||||||
<value type="QString" key="Analyzer.Perf.SampleMode">-F</value>
|
|
||||||
<value type="bool" key="Analyzer.Perf.Settings.UseGlobalSettings">true</value>
|
|
||||||
<value type="int" key="Analyzer.Perf.StackSize">4096</value>
|
|
||||||
<value type="bool" key="Analyzer.QmlProfiler.AggregateTraces">false</value>
|
|
||||||
<value type="bool" key="Analyzer.QmlProfiler.FlushEnabled">false</value>
|
|
||||||
<value type="uint" key="Analyzer.QmlProfiler.FlushInterval">1000</value>
|
|
||||||
<value type="QString" key="Analyzer.QmlProfiler.LastTraceFile"></value>
|
|
||||||
<value type="bool" key="Analyzer.QmlProfiler.Settings.UseGlobalSettings">true</value>
|
|
||||||
<valuelist type="QVariantList" key="Analyzer.Valgrind.AddedSuppressionFiles"/>
|
|
||||||
<value type="bool" key="Analyzer.Valgrind.Callgrind.CollectBusEvents">false</value>
|
|
||||||
<value type="bool" key="Analyzer.Valgrind.Callgrind.CollectSystime">false</value>
|
|
||||||
<value type="bool" key="Analyzer.Valgrind.Callgrind.EnableBranchSim">false</value>
|
|
||||||
<value type="bool" key="Analyzer.Valgrind.Callgrind.EnableCacheSim">false</value>
|
|
||||||
<value type="bool" key="Analyzer.Valgrind.Callgrind.EnableEventToolTips">true</value>
|
|
||||||
<value type="double" key="Analyzer.Valgrind.Callgrind.MinimumCostRatio">0.01</value>
|
|
||||||
<value type="double" key="Analyzer.Valgrind.Callgrind.VisualisationMinimumCostRatio">10</value>
|
|
||||||
<value type="bool" key="Analyzer.Valgrind.FilterExternalIssues">true</value>
|
|
||||||
<value type="QString" key="Analyzer.Valgrind.KCachegrindExecutable">kcachegrind</value>
|
|
||||||
<value type="int" key="Analyzer.Valgrind.LeakCheckOnFinish">1</value>
|
|
||||||
<value type="int" key="Analyzer.Valgrind.NumCallers">25</value>
|
|
||||||
<valuelist type="QVariantList" key="Analyzer.Valgrind.RemovedSuppressionFiles"/>
|
|
||||||
<value type="int" key="Analyzer.Valgrind.SelfModifyingCodeDetection">1</value>
|
|
||||||
<value type="bool" key="Analyzer.Valgrind.Settings.UseGlobalSettings">true</value>
|
|
||||||
<value type="bool" key="Analyzer.Valgrind.ShowReachable">false</value>
|
|
||||||
<value type="bool" key="Analyzer.Valgrind.TrackOrigins">true</value>
|
|
||||||
<value type="QString" key="Analyzer.Valgrind.ValgrindExecutable">valgrind</value>
|
|
||||||
<valuelist type="QVariantList" key="Analyzer.Valgrind.VisibleErrorKinds">
|
|
||||||
<value type="int">0</value>
|
|
||||||
<value type="int">1</value>
|
|
||||||
<value type="int">2</value>
|
|
||||||
<value type="int">3</value>
|
|
||||||
<value type="int">4</value>
|
|
||||||
<value type="int">5</value>
|
|
||||||
<value type="int">6</value>
|
|
||||||
<value type="int">7</value>
|
|
||||||
<value type="int">8</value>
|
|
||||||
<value type="int">9</value>
|
|
||||||
<value type="int">10</value>
|
|
||||||
<value type="int">11</value>
|
|
||||||
<value type="int">12</value>
|
|
||||||
<value type="int">13</value>
|
|
||||||
<value type="int">14</value>
|
|
||||||
</valuelist>
|
|
||||||
<value type="int" key="PE.EnvironmentAspect.Base">2</value>
|
|
||||||
<valuelist type="QVariantList" key="PE.EnvironmentAspect.Changes"/>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">TestServerLMS</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">CMakeProjectManager.CMakeRunConfiguration.TestServerLMS</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.RunConfiguration.BuildKey">TestServerLMS</value>
|
|
||||||
<value type="QString" key="RunConfiguration.Arguments"></value>
|
|
||||||
<value type="bool" key="RunConfiguration.Arguments.multi">false</value>
|
|
||||||
<value type="QString" key="RunConfiguration.OverrideDebuggerStartup"></value>
|
|
||||||
<value type="bool" key="RunConfiguration.UseCppDebugger">false</value>
|
|
||||||
<value type="bool" key="RunConfiguration.UseCppDebuggerAuto">true</value>
|
|
||||||
<value type="bool" key="RunConfiguration.UseLibrarySearchPath">true</value>
|
|
||||||
<value type="bool" key="RunConfiguration.UseMultiProcess">false</value>
|
|
||||||
<value type="bool" key="RunConfiguration.UseQmlDebugger">false</value>
|
|
||||||
<value type="bool" key="RunConfiguration.UseQmlDebuggerAuto">true</value>
|
|
||||||
<value type="QString" key="RunConfiguration.WorkingDirectory"></value>
|
|
||||||
<value type="QString" key="RunConfiguration.WorkingDirectory.default">D:/LOCAL_REP_RRJ_SERVER/RRJServer/BUILDS/Debug64/TestServerLMS</value>
|
|
||||||
</valuemap>
|
|
||||||
<value type="int" key="ProjectExplorer.Target.RunConfigurationCount">2</value>
|
|
||||||
</valuemap>
|
|
||||||
</data>
|
|
||||||
<data>
|
|
||||||
<variable>ProjectExplorer.Project.TargetCount</variable>
|
|
||||||
<value type="int">1</value>
|
|
||||||
</data>
|
|
||||||
<data>
|
|
||||||
<variable>ProjectExplorer.Project.Updater.FileVersion</variable>
|
|
||||||
<value type="int">22</value>
|
|
||||||
</data>
|
|
||||||
<data>
|
|
||||||
<variable>Version</variable>
|
|
||||||
<value type="int">22</value>
|
|
||||||
</data>
|
|
||||||
</qtcreator>
|
|
||||||
@@ -75,12 +75,12 @@ ServerLMS ^EJX4eIpX
|
|||||||
|
|
||||||
Mainthread:
|
Mainthread:
|
||||||
*serverLMS
|
*serverLMS
|
||||||
*processingSystem
|
|
||||||
*dataParser
|
*dataParser
|
||||||
*MultiThreadServer
|
*MultiThreadServer
|
||||||
|
*processingSystem
|
||||||
*commonClientHandler
|
*commonClientHandler
|
||||||
|
*chatSystem
|
||||||
^ite9vjus
|
*processParser ^ite9vjus
|
||||||
|
|
||||||
|
|
||||||
ClientHandler: Thread
|
ClientHandler: Thread
|
||||||
@@ -93,15 +93,16 @@ LoggerThread:
|
|||||||
|
|
||||||
UpdateThread:
|
UpdateThread:
|
||||||
*updateController
|
*updateController
|
||||||
*assetsManager ^ZvWgIkFz
|
*assetsManager
|
||||||
|
|
||||||
|
^ZvWgIkFz
|
||||||
|
|
||||||
Client QT ^sWMT4y6l
|
Client QT ^sWMT4y6l
|
||||||
|
|
||||||
MainThread:
|
MainThread:
|
||||||
*MainWindow
|
*MainWindow
|
||||||
*UpdateNotifyWidget
|
|
||||||
*screenChecker
|
*screenChecker
|
||||||
*extrnalExecuter
|
*externalExecuter
|
||||||
*allWidgets
|
*allWidgets
|
||||||
^NEUKUPV3
|
^NEUKUPV3
|
||||||
|
|
||||||
@@ -113,6 +114,8 @@ WorkerThread:
|
|||||||
*socket
|
*socket
|
||||||
*dataParser
|
*dataParser
|
||||||
*hashComparer
|
*hashComparer
|
||||||
|
*postProcessorSystem
|
||||||
|
*dataParserOut
|
||||||
|
|
||||||
^8BGt5wjC
|
^8BGt5wjC
|
||||||
|
|
||||||
@@ -146,9 +149,9 @@ Server ^57kJSOBv
|
|||||||
|
|
||||||
Клиент ^Iao6ua8K
|
Клиент ^Iao6ua8K
|
||||||
|
|
||||||
Login/Pass ^FgztXDxQ
|
sendClientAutorization ^FgztXDxQ
|
||||||
|
|
||||||
XML Authorization ^FAEhzlqj
|
Server Authorization ^FAEhzlqj
|
||||||
|
|
||||||
Send version ^Wsgy80Do
|
Send version ^Wsgy80Do
|
||||||
|
|
||||||
@@ -173,10 +176,6 @@ ConnectionThread:
|
|||||||
*TaskPreparation
|
*TaskPreparation
|
||||||
*FIMTaskWidget ^O3pqGffr
|
*FIMTaskWidget ^O3pqGffr
|
||||||
|
|
||||||
*chatSystem ^b7EqD2zH
|
|
||||||
|
|
||||||
*processParser ^QEHpQT3C
|
|
||||||
|
|
||||||
Порядок приема! ^IhrFmEwa
|
Порядок приема! ^IhrFmEwa
|
||||||
|
|
||||||
ClientHandler ^hA67NX92
|
ClientHandler ^hA67NX92
|
||||||
@@ -267,13 +266,11 @@ TYPE_COMMAND ^Qljc4T07
|
|||||||
|
|
||||||
TYPE_DISABLE ^IIrBIFHt
|
TYPE_DISABLE ^IIrBIFHt
|
||||||
|
|
||||||
USER
|
VersionData ^W7PN2rtW
|
||||||
|
|
||||||
ID ^s0uHSEUi
|
sendCheckHash ^N9XDpZcf
|
||||||
|
|
||||||
TRAINEES ^VdRzKKcg
|
TYPE_CHECK_VERSION ^Ze62Cipy
|
||||||
|
|
||||||
INSTRUCTOR ^dbneSLbj
|
|
||||||
|
|
||||||
%%
|
%%
|
||||||
## Drawing
|
## Drawing
|
||||||
@@ -428,374 +425,362 @@ LSW0htMuLW1ytKuKlCEw7SyTCtIxO2TYlw1O3Wcc2TAI9i64mOV9j/YwOJbj5/EOPbjO4qOJ7i+4hvwH
|
|||||||
|
|
||||||
KofkDQNwRUqOJdwnT8KiCqo/1X/JQOKOhbsgbDd2AiZJK0Djg2RJTHIwELSMy6iJFL8UN4OXZNSPjHAy2M300Ikr12BMI/BIkAkudoFwByiZcABB6AXACmAZvUgBmBS0ezAOBsE5ByrsLOBiNwhzEpgS9x+gLPReBJACHTwYGlC9GYAjAL3CBBCAOACgB4gN4XYgHIwAV8SMI0SAsT0AT4HTBiI3jwdx5TDdgqALJIECgUXca3F3R71cCBSTSVNJ
|
KofkDQNwRUqOJdwnT8KiCqo/1X/JQOKOhbsgbDd2AiZJK0Djg2RJTHIwELSMy6iJFL8UN4OXZNSPjHAy2M300Ikr12BMI/BIkAkudoFwByiZcABB6AXACmAZvUgBmBS0ezAOBsE5ByrsLOBiNwhzEpgS9x+gLPReBJACHTwYGlC9GYAjAL3CBBCAOACgB4gN4XYgHIwAV8SMI0SAsT0AT4HTBiI3jwdx5TDdgqALJIECgUXca3F3R71cCBSTSVNJ
|
||||||
|
|
||||||
JAh/E/IgdwHgNdmXB9AC9HaAgQcogoApgT4GaIhAZVUdBbgHpRoj43OiIgAGIpiMzN4fWEN5NE/AhzwTKQqLh3h9QexhThWIcjF+oDRJ2zdixIiQDeAmARoAdwAQDVQNc2g9YD2TSAA5KOSt49aS5NqfHSIPjBg9MOGCSJc5MuTjktn2ssrImBNmCP5HGPkDRkq4UNRXIjpF+Nxof5HecAaNvmxs9A6QL8iIAQJOCTQkm3FwYIkqJJiS4khJKSSK
|
JAh/E/IgdwHgNdmXB9AC9HaAgQcogoApgT4GaIhAZVUdBbgHpRoj43OiIgAGIpiMzN4fWEN5NE/AhzwTKQqLh3h9QexhThWIcjF+oDRJ2zdixIiQDeAmARoAdwAQDVQNc2g9YD2TSAA5KOSt49aS5NqfHSIPjBg9MOGCSJc5MuTjktn2ssrImBNmCP5HGPkDRkq4RD9UEksxCCT8a0necAaNvmxs9A6QL8iIAQJOCTQkm3FwYIkqJJiS4khJKSSK
|
||||||
|
|
||||||
EuxzZjqE/oloTHA7UxNVHglm2eCKFM+ANAyoRODWTsoovlGAuIWSE+x6CKSE1gFYsRKVjUOFWKkS+bOINmjrBWbG8hknEWRrAq8SGEUVeIMKB1jZFX/EhgnkCyF0Tsgs2PD8kIjShGjUHMaNQjH3OXRtjX3KDlIgjQXKAdiFop2M11ZOZLyQcpHOUU2jCE4hNITyE5B3tZDorsDzA/kemgkV4EU0GtIAVZQFuiG2avAoEfIGUHwtfvL5jeiAYj6P
|
EuxzZjqE/oloTHA7UxNVHglm2eCKFM+ANAyoRODWTsoovlGAuIWSE+x6CKSE1gFYsRKVjUOFWKkScOAuDGADkTGFhh67P7xFktIOODehJIBTFmj7ldWyjNLwJ4RmSWwbILNjw/JCI0oRo1BzGjUIx9zl0bY193NJvIEBzDgi8fi0dif3eLz10WOdaIcxNowhOITSE8hOQd7WQ6K7A8wP5HpoJFeBFNBwU5B2UBbohtmrwKBHyBlB8LX7y+Y3ogGI
|
||||||
|
|
||||||
hAvo8h2aEWOdaIcxNotQAQAHgegC3Qjo3CAOijoxFm08mIN2AHgKNIiHTSfUu6J5MkgSaDEwPvYwQgt002EDDScVFEi+jMVNLxocI0ozmBi7rQlRYdwYor0hjTErhwc4EYRD2tBeU7WH5T+CEJytgRUzrlYhDfCJHc41qVr2kdsY2RzjdFg7cx68/5avGBSZIAmMbA4zCFMS4hAXyIMdE05NNTTPE6HSW9bgqhPBdjwnFMJTpPYlMWM+YxF2r0k4
|
+j4QL6PIdmhS1Oe5NotQAQAHgegC3Qjo3CAOijoxFm08mIN2AHgKNIiHTTfUu6J5MkgSaDEwPvYwQgt002EHDScVFEi+jMVNLxodI0ozmBi7rQlRYdwYor0hjTErhwc4EYRDxDhDQPlP0FhbUdIDhRU0fjChWILJG1h9hQNFa9pHbGNkc43RYO3MevP+V6jXIjeHr1OgR9i0CrmIQF8iDHRNOTTU0zxOh0lvW4KoTwXY8JxTCU6T2JTFjPmMRdq9
|
||||||
|
|
||||||
JaC9MhbRvSFUJYpiGMg9YeUkYUBCWYDZTwQiJ2VjJEj0wTxiYJaEyivxY8ENI7PIM1eo3POfQSR8+ToHgilUnEO5cjEgkOj9ZhMxIySAkoJMIAQksJJRTIk6JNiT4kxJOGTqkm3XGSzCTMz1SqPU0BrAjU793mT7bWp2pCtk2s3dj1gAEF551AR0WIA7QjgAAAqMIAuSmAQ5LeAQ5CTOLRnwZkByY3gGADtB0gBTLcxcAGND4xpMhTIBAxwEemaJ
|
LSUkYhbOsH4IsNBhSeAFQbxwURPPKaFmA2U8EIidlYyRI9ME8YmCWhMor8WPBDSOzyDNXqNzzn0EkfPk6B4I5VJxDuXIxIJDo/WYTMSMkgJKCTCAEJLCSUUyJOiTYk+JMSThk6pJt1xkswkzN9Us8Q1hypfBx40KQ+21qdqQrZNrN3Y9YABBeedQEdFiAO0I4AAAKjCALkpgEOS3gEOUky3MXABjQ+MGTMUyAQMcBHpmiSQDEzXkpgEUzi0Z8GZA
|
||||||
|
|
||||||
JAUTNeSmABTL0BI0TgC7MHMb4GsBiAYIDzjN4p/TNEhMv8FMyumcTKkz9k2TKOSFMpTLEAZwVTPUyTgfQC0z9wHTL0yLMyTMMz8AYzM8ymmczOcyJMqzP0AbM+cygB7MlYCczIEx137NNIqI2/1941MInMMAjOzczhMxLLEyFM6TLeSAsrECCzWAeDDUyNM8LMkztM3TJYAYsiTLiyEsszN8yUstLIyzuzLIGyzHMmLIHCPkiNy+TznGN3sjvEth
|
cmN4BgA7QdIEUy9ASNE4AuzBzG+BrAYgGCA84qTIPR9wMzIsz9AQzKxAxAGcFUyWABrXNCzRYTL/BdMrpgkzpM/ZLkyjkxTOUz/M9TKkzNM/AG0ywsppn0yXMyTKMzfM1gHgwPMk4C8zXMywlsz5zKAAcyVgZzKszJAdzPMz8s7zOMy/MtTMCyXbNaU0iojb/X3jUwicwwCM7YLJEzUs8TMUyZMt5Niz9wFTMayMspLJSy9MqLIyysskzNyyasyz
|
||||||
|
|
||||||
yQS9aa0FcjS4BmlPd27bYCl9YUgxysSbEuxIcSnEx0BcS3EjIA8TWYrBTxToRdb3ij7gxKN5jSU/mPLwZIdYisZSsPHRERfqAjCbxSCQpU5hEhFUH/EHfK8Vndyo+dy/CzPVWKi444UjBL5WIFYQwzGo3CR3cnlImSojJgAM2lTeQOgmZYngR9j0T3Gc2JVTfGJazBMvo0Lxj9po7i2mTDefi0dif3eLz11Y057mtSiEkhNuAyE/aMdTM00UFshD
|
MKybMjgDsysgMrKcyDM1zKqyQ6RbIKzMsnzOZB4sprO8lLIs51XNRw+yO8S2HJBL1prQVyNLgGaU93bttgKX1hSDHKxJsS7EhxKcTHQFxLcSMgDxNZisFPFOhF1veKPuDEo3mNJT+Y8vBkh1iKxlKw8dERF+oCMJvFIJClTmESEVQf8Qd8rxWd3Kj53L8LM9VYqLjjhSMEvlYgVhTDMajcJHdyeUiZKiMmAAzWRT5EpGImCeBH2PRPcZzY1VN8Yl
|
||||||
|
|
||||||
UBJEUxWIEfl7ZIAItJgwFQXi2tA0YbERJEAVGtPeiGcKNKS8VolLyf4m0xXJ+420/Lwg88vYlQBTivck1K8B0hlD2NYcwHOrhMIUVFFzTSVHNw1pKS0C0g1+UGwXSsYs/gWyLhNdKN5dzTzFci2aFlFLh2FLQKuYO2aFLqN9Agx0kBlwcolPJmANPTG9sU27NxSb0mhLvSCFB9LL0SU3GTJSgLZUHRhbITYlfg93KZgljaYAxG4QFFLUAcRpoEDP
|
rMEy+jQvGP2mjuLaZMN4TUhaKdjNdWTmS8kHKRzlEbUohJITbgMhP2inUzNNFBbIQ1ASRFMGdJsYAVItJgwFQXi2tA0YbERJEAVGtPeiGcaNKS8VolLyf4m0m3J+420/Lwg88vYlQBTivck1K8B0hlD2Nyc7HOrhMIUVF7ZKCenNw1pKS0C0g1+UG0XSsYs/iuyLhddKN5dzTzFci2aFlFLh2FA9KgYO2aFLqN9Agx0kBlwcolPJmANPTG9sU8HN
|
||||||
|
|
||||||
ByIQzlIgzmdWWwXh302322UfA/2GRyDDQPz4MMIUuEwywfAxPllkI1i3wzOHONzhTskhAFyTxgfJMwBCk4pNKTykypK8TcBHxJAhGIpjJKDuLHNIM95ozjIm8Fk9P14yazLH08N1gEOVsyxshzKcy0AEzNEzastplaywshTMCA9AHunPpn8zTMkzBAELDb5a6M0UvzMs8bNvzUAe/K6ZH8lYC/z2siTLfy2AD/PDpoC2rJso2+V1jWlCsqn2KzOe
|
xTb0mhPvSCFR9LL0SU3GTJSgLZUHRhbITYlfg93KZgljaYAxG4QFFLUAcRpoUDMJyIQzlMgzmdWWwXglobmFAUro/2FpyDDQPz4MMIUuCwywfAxPllkI1iwIzOHONzhTskhAFyTxgfJMwBCk4pNKTykypK8TcBHxJAhGI5jJKDuLHNIM95o793mSeM9Pz4yazLH08N1gEOTWzSsxzOcy0AHTLEzBstpjyylsyTMCA9AHunPo4C/bMEAQsNvlrozR
|
||||||
|
|
||||||
B5L0ih8wyMAKOAK/Kyyb8pgDvzqsyAuIAkCyTLgKECkYlCzv8qTJQLJAjn0yMbIn5KyUPcvJSWz10n3OAzUE8oEgip4dSHbsDcXQPDzdszJPxtsAfoGMlTyebzYBWgXBhGAvcGYADxHAAPBeBnALNwuDOYq7JTz8UtPOR0YXHmKzye3clIFgq8dlGmBZIE8zpS9aDOAyQrQAvllArQYHJBD7vMqOd8IciRKhzuUllxpoawPFjJioOR9iI1p0w0Gx
|
EApKyNsiAtQAoCrphgKVgVAsUzECtgGQLw6Ugqkz0C3EDb5XWFrJ3i2s7SI6yxzf/XQCDIk+OALVs3AvAKmASAv6ziC4gGoKEChACQK2Aqgr2zBsmyjb45eT5POyZAuAzHDcYxyNuzeAEDOBTzBadLsh1IduwNxdAovPezMk/G2wB+gYyVPJ5vNgFaBcGEYC9wZgAPEcAA8F4GcAs3C4M5iQc+vPxTG85HRhceY1vJ7dyUgWCrx2UaYFkgTzOlL1
|
||||||
|
|
||||||
E+dL0ycLJDWfXRh7TYuAJzFUwfKXkQTMnLvcNU1axMTJo5iNj8d87CD3z8HHjUZykVc1Ny8fowDz+iX+DLyBj6HTtPN0wY4j3pJe0ign7SekMWGwgAiosDshgiuDQMJXxSIpeRZIGIoxjlmN3P6lOCzk0UDeQTyP684iYxF4hMo9u1EEqYlcIm8mBcol3RcGQgADw4Aa3HPSXoy9IwUm3CERsdb0pPPvTuYuF2Zts857KlAXne+kEjLfYiAVtKrM
|
oM4DJCtAC+WUCtBcckEPu8yo53yJyJEknO5SWXGmhrA8WMmKg5H2IjVYhXxbET50vTGIskNZ9dGHtNi4LnKVSd8peRBMBcu901TVrExMmjmI2P3fzsIT/M4zKnM1KRU5c3Lx+jAPP6Jf4MvIGPodO083TBjiPekl7SKCftJ6QxYbCCyKiwOyFyK4NAwiKKboF5FkgyijGOWZE8/qWTzV1brzTzu2TyP684iYxF4hMo9u1EEqYlcIm8mBcol3RcGQ
|
||||||
|
|
||||||
IURw8yVCDthpoOsFryvC+vIfFG8mW10YxgCIUFTuIeDKxzkQisVmKvjQ/FKwB4JC0JyV9ZVLUpcM8aOalinW2K9Nd8sLnpzjUikO4zj8ixT4yz8l23WAHceAuUAmAcAqaZvMykuUBqSymLlZ5I9AAZKmS2kpqzJM9koa0yfDSJ3iis7SJKyxzf/XQCDIk+IpKqSmkuqz6SqUuZK5eT5LOdVzUcMmKu0vXg3V7hacLD0m7B4REQQ09G3PMNyHbPlV
|
gADw4Aa3AvSXoq9IwUm3CERsc702vIfTuYuF2Zs282HKlAXne+kEjLfYiAVtKrMIURw8yVCDthpoOsAnyUiqfIfEZ8mW10YxgCIW8gsRBDJZzkQisQuKvjQ/FKwB4JC25yV9FVLUo8M8aOalinW2K9MP8sLklzv8ibwWS/8ixX4zACl23WAHcCguUAmAQgqaYIskUuUAxSymLlZ5I9AGlLZSiUoGypMpUpOzbnRgo2ld4pANYLUA9gv0jpRQyLNF
|
||||||
|
|
||||||
8iX4AaVjQF3AvR9ABpS3QvcZoi9xyiWomeZCAeIABARPHQqvTk8s4tTyLi9PKuLdfOT2YSBYz62ZYo6fiBWhY6b7OQSaaKRj3ctQTFhON3C1Cwe9jPbwvAzfCyDOkTrQOOBIhb7HYnxFEM1WmIg8LZZEhhU4Y8DRCjBXMH1AB8/RNSKb3dIqC9uVB9wmiwvanJxKCivEutsD8iPMRVloih3KKAPUxSA8603EzqKQYsh0g920posNzXrPtIQ8KqbM
|
1Skt36ypS0Uo1K5CiNy+TznGN2OLnLG7I3S3LZXRnC2gB4RERQ09G3PMNyN7PlV8iX4AaVjQF3AvR9ABpS3QvcZoi9xyiWomeZCAeIABARPNwuvS68wEobzgSpvNBLdfOT2YSBYz62ZYo6fiBWhY6VHOQSaaKRj3ctQTFhONEi1Cwe9jPVIogz0iqDOkTrQOOBIhb7HYnxEkM1WmIg8LZZEhhU4Y8DRCjBXMH1Bt8/RPqKb3RoqC9uVB9wmiwvUX
|
||||||
|
|
||||||
o0gHEQDOzhI1YoGLLTo0soyQ/8UYra8CPSu09zuvb3KUD2FGcOrAtYadI6jtg8dlkgj0yQq+05vW4GxAXgI0sTzLgtU3E8OYz0suL6E88NcCmElKODKtYw2EVodIU4n1oGFWxDPF8NR3P+DEyzhQ8LRE0DPET0yp8R/DcJR4ASBeEz1LpRFEzJXGghWKxglTiCWsqJzUSqCRHzCnMfKJC8ijsrdgOM5HxNSLFaoMdtT8hoLdZLyV2k5LvMt7mdAs
|
PZKuizkuttuS4vMRVloih0GKAPUxSA8603EwmKQYsh0g920mYp9zXrPtIQ8KqNso0gHERhVHz6ZXmESBTogcoyQ/8fYra8CPSuxTzTi/XkIxTvM4rUc9xaBxUc9gUU1khj04wq+05vW4GxAXgX0przLgtU3E8OYlMpBL6E88NcCmElKLzKywWRHplfrbOCB8GFWxDPF8NGPP+CayzhSSLREsDPESmyp8R/DcJR4ASBeEr1LpRFE+z31jVMKxl4gt
|
||||||
|
|
||||||
gLEHhAesoMWyAhMkXiZKBnLiqiYeKhTL4rg6QStyzJMkSuYAxK6IF5KXbdAoFLMCoUuwLSssUulF8C+s24qZS2Stdp+K+0CEqUs5StUqJKqBKgM5slUr+SEEr3P15X2LUqJi4iCiAIsAIvyxPB7ypgTjyAQZohmAYAYx0uyrg67NwVdCv0r/KTCp9KeyX0qUBeRcWUsC1BMnbaEktm9F6hKsdPbmDuhaYBRT+LUygErQ0l3Cz2xdDUWk0LLp9Wxi
|
QMYAnKechkqgl98wp0PyiQvVLqsNIHtjeceiioJ5Lf8oSM2SAChoLdZLyV2hVKIst7mdAsgLEHhAtsyTKDFsgYTJF5ZSyBJOS4lDSqiYtKxTJ0rg6fSoqypM4yuYBTK6IC2yBwsnw0imCqn3azOeB5L0jd840vrNNK80rsrXaXSvtADKjLJcq3K8ys3ioEqAztLLsv5IQTU8/8olVt09mnVRLtbYPHYTwKCqYFK8gEGaIZgGAGMdgcq4NBzcFdws
|
||||||
|
|
||||||
JxJgfDjIqUS7DKGiqKqHxor0kqpKYFbgTQAaU57C9GxBnACgEwBbgBBQaVCAR0FPJvgGAGIBcGOjMWyakjfL8SiM/IgQAN2bEC9xiGZQEvJmiLBhjRS0UgFqIVwF3DgBtCjJPmqGMjfImTt8hWxPNkMoosqdCStHx4ySS9irpCiC1AFqJZVVzJIl3qz6uuSMC1njuThS1ANFL9IgyolKJAX6q+rBwqQNYLX5WBN+Tl08cJnKnI7kTKhgUoqlJJS4
|
zLMKvwufSYc19KlAXkXFlLAtQTJ22hJLZvReoSrHT25g7oWmAUVMShsuxK0NJdws9sXQ1FpMey6fVsYicSYHw4hK+kpwyhosSqh8JK9JKqSmBW4E0AGlOewvRsQZwAoBMAW4AQUGlQgEdBTyb4BgBiAXBnozrsmpOfy/E4jPyIEADdmxAvcYhmUBLyZoiwYY0UtFIBaiFcBdw4AVwoyTHqxjOfyJkt/IVsTzFDPkryQn/LR9eM/ktUq6Q0AtQBai
|
||||||
|
|
||||||
LRzwNzQfyvyJuq3qoQB+qwauGrRq8asmrpq2ao9Lji2wIclvy2mtPDjC64r18c8jwLDheIBlKLBT4dVH1KCMBTHpUpYIGFPEQgoqoltXfDMqbyA1OlQmByzHiCwgIIlIIRyFQJ2AbAdiJ4GYQmZWfTLT8sJIMarcnZqotjWqtVPBNNU1sqpy3ac21Lg1a/vP3ymKkov7KY0gFTjSsgTaMCrgq0KoTyHU58F5zmo4XNGob4WWpmgvaMXN9TnA6HVr
|
WVSf0zRTGuxrrk1rN8qWC/ys6yOCo0q4KJAfGpxrBwqQMyMbIn5KyUHSrtL14N1KWjVs3SwjA8dFFIBz8tzQQqvyJdq/aoQBDq46tOrzqy6uurbq+6uTK/i2wIck0KuWtPDfCsEr1928jwLDheIBlKLBT4dVC9KCMBTHpUpYIGFPEQgkaoltXfZstnyA1LT1WSSoP6A7hlA3WL1BjIKaDFQdiJ4GYQhWMtPywkg5atydVqi2PWr1U8Ey1SFykXLd
|
||||||
|
|
||||||
SjdSNMyLWhFXIocWcq1PyJ+gZcEvJd0S8hjQgQdoG5yfarsGcA8wAjhlj9UstOjNRcm6OLSJgLiGPB1QQRIlUnlatNejNc5egbSRyqOtbTxy6csS89cgkwNye0o3LesHdTzlaL4IGWvqRTwGUEgiUE1WD/CpoMVHVraZPkgOFXck4SXSOvEZMQSeClYLuq5iucgESnYU7wNLbyrOuNKz1JOpTq06jOqPr3y6Ks/LVvCF0uCjC5wP/LGE59N29y8I
|
pqCdUFpRuIB2Kly+irctjSAVK1KyBNo4qtKryq6vMdTnwTXOaiZ00ahvgJgZiHljDcv1OcDodWtKN0o05otaF7cihzjTFc/In6BlwS8l3RLyGNCBB2gdXJzquwZwDzACOGWNIgQEc+DChC0suvEYuIY8HVBBEiVSeVq016Jdzl6BtP3Kq61tKPKzyxL09yCTb3J7Tfct6wd1POeYogFXUyGHtqkIR2oVIpCV2qdgGwD2tpkXEePKWYvy5dI68Rkx
|
||||||
|
|
||||||
BDMYtYAnR5tsKUvIGRMWENXUTb7NwsQrkyzwuKqwMhvMlrgS6RKug2RLqANJO83WJkxVslDLGB8NL0jTpkSg2qHzzDK2Paq6k5avWBCavqoGqhqkasvIxqiaqmqZquarXzUky6q3zsS62u+LGK5P2Yqqgl2JPz6nDisEzeeGStizeefEBWBemBTKkqM0QYBHoKgGADfRqSqAFqzsAaoEIL0wELBSyHqUgFXllwN6MOju1BTIIB8AGRuDEps1oLiV
|
BOdKVgtCFcjOac+pw1c8iCq7q/Ss9SbqW6tuo7rAGpCtqqUK1bwhdLgnwucCsKxhJfTdvcvCAQzGLWAJ0ebbCgHyBkTFhDV1E2+wSKaKusuSLRq8DOnyravEtbLDYQbyBwCKGNRSCwFIVjGB8NL0jTo6SgOt3zzDK2M2q6k16vWAhag6qOqTqs6svILqq6puq7qh6sfzUk6GtfzBXKOsChuIOwzFckaxSpRq+SitQFK1KoTN55bKxLN558QFYF6Z
|
||||||
|
|
||||||
3MjgH4beswRtHQRGyTLEaTgCRsIApGgxrkaf8hRsrAlGhABUaFMtRo0atG4+mEr4QJxuYAjG92M0qNpXeKQDgauI1wKPXCrJIlTG8xtMahG4gGsaJM2xunyF2BxukaSAWRvkbFGx0GUbcQVRo7p1GggE0aPGvxqsqAm7JsMazQiYMVLoEhytkCxw3GMcjls3gHKllg4BSAdGRYqJvK0iBJHxr1gVavWrNq7at2r9qw6uXBjq06o6J9wn8oir9Cm7
|
Bs7AGqBVs9MBCwMsh6iYBV5ZcDejDo7tUUyCAfADfQxS7IE8rWguJRCyOAfRskyfGoxuIATGmgrMbKwCxrELcQaxo7pbGggHsaxC4+kMqXGtxuDFPG92K1Lbkvyt/02CunyCrKa9AB8a/GgJtHRgm6TNCbMgR0EsbImxTJsbSAOxocaEmmKvhBkmjxrNCJg+QugTkq2QOUL/k1Qo/qiQDjMuKI6IB0ZFiovKrSIEkAWvWB3qz6u+rfq/6sBrga5c
|
||||||
|
|
||||||
PvqvzR+rir4XF+qDLy8cHDjhboGHASQQpMRgFqfffLEwhcpSetGUREsHP+KIGwEqgaLlJ4F4j/KE0BgE90pBtFUEIcpEUh3YQ2jSC2gbY0lTcXfWu+VictEuNrGy0aObKZRbIrbLLasFGYafvVhq6lbbdJkdr0VBOo2i+7T4CCqQqsKurSc6qUH8QzxBmnEUkIVnTpMy678wjrG6pNGVzUVIcrV0W6morbqsvYlVBj6i6D1t0+6+cthi+0h5vWyn
|
FBrwajon3D0Kqqs8KwcuBq/MEGhqvhdkG3MvLxwcOOFugYcBJBCkxGQ2p998sTCFykUEkqNBC6KyfPIacSyhouU/0x7P8oTQGATjNacyEjicUUBsFIRDaNILaBtjadNxd/a75V5zGS4OpnLRoucplFWixcrdpzbUuFvqt8r/OR9pcpaNlyHc+XKOFG6lEE+ASqsqoqrq0nuqlB/EM8QZpxFJCFZ06TG6OLTw8l6Mrqxi/ADtzUVXcrV0V69lvSYw
|
||||||
|
|
||||||
mwJ39yA4c1k+b1Qb5vAs9yxdPdynKtepcqNS+mGBSJmbxw2hfK8hmPqbzfInGByidjxGAKALdEdBwqm+rsC766Kofrt7B7NML9fChUIs4gvimERZmOwtwkroYJFahSoEWDVsH7UBuQq68m5tKrsLKaFkQcKqaDwrqqv8RI1Z9PiJVAJUoFrUUKKuqVaqCgrVJNsNrdsuYb8CRFt6l2G2oKeriSitVJKeGiQE+A3QQpvMawgKAvoKYCuSoEqXQRSt
|
PSYs3rpi6D1t096q8thi+0j5tVAvmwJyzyA4c1nKRFId2BBbPypdKTzUqt+vSq2akuG3SdIUxB2J4mPPLQhJmiQHGByidjxGAKALdEdBKq6BrsDYG2qvgbt7KHP8L9fChUIs4gvimERZmCItwkroYJFahSoEWDVsH7EhqeasSl5vGrsLVLAOJNIUhCo8Go52pv0yoIVj4iVQfiqha1FESrql1qgoO1STbDaw1Zy+P2EeBAkOOvXKjC3kuUq6g0SL
|
||||||
|
|
||||||
gKPG+ArYDECitoUzmiR0BjQiC5Ar/yIsqIC6z9MyTMkBQgSQAjQp8ZzOCaWS05MLbi26UtEzvMstsoLm2yTKraLK2tpoLG2ugrayW2tto7af8lAu7aos7rJSyB25gCHaDAEdryy+SgrK0rAarAt/0RSunzwKIarJKnaS3Eyp/yn8hdokyl2hSp6zV2z/I/bW29tsyzO23EGcaJMzrOizD2wduHa6WUdtqbvJSyKVKZAuA2ab/k1po3q/iNCFcig/
|
v0skt0Eia/GsIBIKpCqTPsq9Kl0CcrRC8QpQLW2yTOaJHQGNFALpCjApGyogY7Iyyqs5gEkAI0KfFmy2AO0CzR6swQFIARCuLPGzTyY+gsqgskiU+AG28UrCqaC2Ar7b22qKq7byCygpGI+2gdqHaSskdroKx2sbICzJ20IBnaDAOdsMyF2qACXbsst0DXbRsids3aoAbduazvK7UuYK940muya0w7rIzDd2/drNKxMiLObbhCk9oiqHKztsMqL2
|
||||||
|
|
||||||
aDQ1hfK+tzEKe7SU3WAp8mfLnyF8uABKTrcMpIqTDW1e1vrzi5ZqcDzWhhMezbixKr4YZIHd3Z0dIHSHgtkbXKPzrLICoz+hohMWqe9Kou5sw1c+RxFWFlymsHU83m34z8F9UxSC2VXm7HLaBClMYEFh4mLBuBa42wxLBbV88nJjqWyzEph9Jk0oNpyM237iza+ys1NVyLUo4UTqCE9nLtTs6p1OOiGZMaHmA+IXKTCDvUsOvc8/BToHvCvPWmnr
|
iQqvbPMxTJvbh2mgpkLH2idsUyp2t9v0AP2qTJ/BF2w7JnA/2vtvXbn2oDpA7Ts9pqSqLsrpuZrzypyO5Ev6zQurAAI3fHbEIK+twMKe7SU3WBT88/Mvzr8uABKTrcMpIqTbW1exgagS7ZqcDnWhhOhyIS5qr4YZIHd3Z0dIPVo2MMSiWNaoPPKhSWRszGUHNqnvSqLebMNXPkcRVhO8prB1PJNt+M/BIesUgtlX5s6jeQQpT5SsYTNtyDcMuFof
|
||||||
|
|
||||||
rI6pltpaEvdFvjT8iKPJjy48z4C9qjWTzqzTAkUiFKx5Ibmu06FSCls/REgbdKtyGaS0FYTIu6ls+jTO8wiqL0vQGOZawPdlrZaoPHupKAXrQZm5aB6mlRappO0mFk7cym+D8gvYMiD4NEcmKklbxisLFVKUatpqSJXIvKtJgXVcmKPVfgd8nVbe7CkqaS6Y1pPaTOk7pN6T+kwZPj0aawZRXsqbY1oY7TWlZuY6n61jrMLc87igSBU4U8AUQgSL
|
zBcmuvnKWSmH0mTSg8XPLbsWhOrxb665OvjT8iW1JVy1ciludTjohmTGh5gPiFykwg0uuZathToHvCvPWmnnq2WwGI5bou76ItT0uolokBS88vMrzPgLOqNY8urNMCRSIUrHkgdakdLHri03wRkh2RHHL3VWE2rsXqk0ZepGL0verv5b8VDetBjBWnepKAXrQZnFaD6mlRapnO0mFc6Oym+D8gvYMiD4NqcmKlVbDisLG46RWq4SSJXIgatJgXVc
|
||||||
|
|
||||||
F1sgfkS8GuQsKP+ju8vWq5vAbUKyBvQrocm/Xxhs4J5SNAc+U8z+8ZJGZGU7ZoiszkJ77YqRPBDkRsEOYhdUHzrK6NYaPBb1UyFspysSuiq8RgcO2rYaHahzvjrna1nPyIbUjnK5y8W9Lr5yTzTGFygcKqEtDry65KlezpgdDPPhxqKlvDSlc6rujTSHYctq7m03FXbqdcjtJa60Os6lg8KTE3PK86IcHomxcyuYGh7iqW3LzARu1lGecfTCbuXr
|
mKPVfgd8iAabzBpKaS6Y1pPaTOk7pN6T+kwZPj1ZawZRXsqbe1vU7HWnZq07EGnToCKO87igSBU4U8AUQgSLF1sgfkS8GuQsKP+ju8w2gnIjaGKihqYrScm/Xxhs4J5SNAc+U82FSKxGZG87ZoiszkJ77YqRPBDkRsEOYhdUH0nK6NYaPhaNUxFuFzWSjoq9NEurFuT8cWoh1S6k6taIy6CE5XPtTu63rq1yTzTGFyh2K0ksgAjc90oVB4c6YAwz
|
||||||
|
|
||||||
pWpGtxj16k8rNYhEk8ruEO4WGAc9fKg1vW6iOiQHoBIdbEDgAjAfAHGBaO87vpqTW+ZrNaZPACo2agKrZt4ouIXCtSq5gMKEObDfSPoXhQOULpQh4mT1sd8Uy8Wok6Qevwv/lK4dDBw6/rFINJhV3eRNRQSSTRL5siYL8Xw0Y23IJwyE2vBuhaLa/jl4piILUG5rH2fEp7KJCo/PjIyoTzzKlduV2P4ydk+VyroI5UOS9lY5YZ2W1C6G1wrpPWPO
|
z4cagrq5uz6Ma6Y00hz3LFu5tNxV1693I7SoPTbv6YoYik39zyvOiGp6JsDsrmB6e4qlNId3C7tZRnnH0xu6ThF+p/KTigXzctuqwZr+I9YTDBciIUidF+AbW77t7t1gegEh1sQOACMB8AcYBU7oehWodb1mp1pk9sKg5twqjm3ii4gOK9qrmBR6iWMUV1EfQVA5KulCHiZQ2x33rKLahzop6Mi/+Urh0MaDXIwV8pNtJhV3eRNRQSSTRL5sOc5h
|
||||||
|
|
||||||
3bk05T6ucA/q76rdZLZQugn6p+mORn6htOfq1dF+n22X6Pq6t3X78spOwBrO2IGt0q72tMPKyMw0uW37J+2uWn6k5Wfvn7j+w/zdkV+8/uhrpsocPsrlSppum6FAq4Qxh5utdwUQ5cryP6aWY53tqV6AR0EIBbcJNKmBdgk7tz06a+gzGUrupjuD7n6hKtfqkqllCg0TQERn1pH2fmrdgVE07AEh9UrYOETQQ71uuage25uz7MymDFkQsISCLgtc
|
HHK+epNWErA6vnPxDmS9Mzi64fGWKCQdax9i5Lku5GuEtDzUeDKhPPMqV25XYgTJ2T5XKugjlQ5L2VjlhnZbULobXCuk9Y87duTTlsa5wAJrca0uULpH+5/pjlX+obXf6tXL/p9sf+rGurcABx137Mia1njuS9SuI0CqPXHrKAGQB2uRf6k5N/o/7oBw/zdlf++AZpqPkm0oUKZg+0o1a10v8u1bDeTmpThyBGrENaIKlmMz7JOiQHoBHQQgFtwk
|
||||||
|
|
||||||
pFII9bipClBtUv62vsQjQW22kb6k2nIsmSZYkiEDyE/FXTmTD8okqEjNk16ux9dkwbIGdks/6qvab+m9t2k9KsGtlZDKt1j0G7Kzn2sj4a9gvmDrnKuwt7XK6PQ3q1HAsFU7MeuAYnRfgZcEGbk9N6OtxT0doE0BfesF29KDC30qD7H09ZuIHNm1YjrBqFU7jR6ZIIDUOb4gmWnDNzoEWEmBcBy5qM9M+hd0k6hFeSHzBUsElts9BB35s4ts4Pev
|
0qYF2CIe3PXlr6DMZTh7NOyvqQamqlBpaqWUKDRNARGfWkfYDat2BUTTsASCHqtg4RMeaSeshrJ7XmwfpbKYMWRCwhIIuC1ykUgkNuKkKUG1UwbQuxCNhbbaHhuRaI6/jl4pfrHPIT8VdOZPUbT+qkLRr6nHRt2SZsgZ3SzCanypQHMm3aTJrDS2VmCq3WcIcSrOfayNflYE35JXTxwhR1j6Vgm4SJim7AsF87eeryPGblwE1vQB+gN6OtxT0doE
|
||||||
|
|
||||||
EGQWyiqkHjEmQZhaW++QerzZamzvV1VBnNvUG6g0SLv10AcSLz8k5GOw36JI4YezpRhy/vgCwmwUr3i7+kGvvaYmp/rdYhht2RGHmCqYJsGRw0AZlb6M9Uu5MoSm3pu0e2BmA0h4mYPM0BfgSg0QG8bQgCEA6IW4EwBbcF4H/jlwW3EIBfgKaooAGlDUE+dZmo4tO6Ti9mID7Gau7LPC1mm4vu6PA2EKPsVy3ByxFfurKt4BhESRhPNg6wSKYHkL
|
0Bi+sFzTKvCjMor6n0/ZpkHDm1Yi/SGU9GC56ZIIDUub4gmWnDNzoEWEmAxBkRL0H++hd0c6hFeSHzBUsOlts8rB0Fs4ts4J2HYbaigXrX1nB4xPza2iyZL36x8ouqS6Ze7jI0bq26S1pDsfBSLz8k5GO0AG3WcSNuHs6e4cQGk7ZAc7ZUBqDv1KcmzAbg7Hh54deGKBocI47FChy26baI3prOKIHQmIwMm7HtgZgNINgbwNfgSg04HalQgCEA6I
|
||||||
|
|
||||||
PIYiDfW64wwqyuriDeMWUFkxSDnYRr02JavDTsIx2keTHb66hgzuHzVU/HtNqsi5oY66J82Vu684Uh4DgAOAAEDgAXgIFzGSGGpZjkGGYH6hQb7qioIm9f3RzsHKyiyovVz/o0ctA98VDuua6O61rv6YoY5XvaLTcwkf77yoZk0Qa4Ickd3VKR/YUDQl6n3VN7V61dOPLXKvkCw6uLPdQUhfKgPD8H0AXkf5HBR4UawHqDI1v97LuwPuu7CBu7qt
|
W4EwBbcF4H/jlwW3EIBfgG6ooAGlDUE+dVm34sh7/i9mLL6laiHLPC9m8EuR6PA2EKPt7y3ByxFCenqt4BhESRhPMZoLZX2Q7OiqOmGjB62v/JLQalDeMWUFkxSDnYRr02JavVnN5B2keTAEqHBmFtEq1U4XtDqWivYcvLj8zVu684Uh4DgAOAAEDgAXgIFzGS5GpZgOGGYH6nuzperqVtsVuoYtlZrekpl5blumXOFb1ul3qhHtuwjN26yvR3QW
|
||||||
|
|
||||||
agLEkj16Vy34I0wsNNIZGhua/DX5Fg21PpBz9lVgcB6OUjgfdMpaiz1RZduROARCFO2Hp0MhWIiAmhAWrHqTVyKw2pJz8QjEvTMLOuH3kHJRxHxUHeyo/N6HpLWkK0HwjTgCZBsAf/NZLDLDgCHHUC+iX7MFncJrWko0YgAmyTBhNIeGRgJ4ZeG3hj4a+GYAH4b+H/QcwZuBBxjxrb4FSmbMQ6Zg+bL2Hzqg4ZQN5Y/gpgxohe2F+L90yBi+GvRi
|
hpRriFlH5geUcyhFR3dWVH50x+s84DiyPvVbMh3GPfroR2Clcjvm0xE6o+agPHKGIAc0ctHrR20eEHqDO1tL7Ye8vvh6pBpHrdagLEkjzBvsPuFgj6ZREr5GRoHWvw1+RYDO768c/ZXDb9BjlMMH3TSUYOZtuJz2SE2RDzsZ6hKawdUwiICaEhaV+2a3X6nBjfXwzXB8XrNs9+50cR9fBjcqrbHbdGuuHwjTgCZBsATAoVLDLDgBvH6C+iX7MFnH
|
||||||
|
|
||||||
AHGAhAS8i9wAQC9FwZcAaPPqJ9ACoH6BaiHEBmBnAN8oBHrAsEa9Kvy0EaBH23WKpZrAysPqSr/KfClyxffSAYljP0jIbg0uuMfjE6Kowoc4H8x0YCQhvrQRIUHTR6Esel1sjQyZUGozqIOZd0mUCpSGR+sckHSc4zoyLCewkI6qeJicM6r8iGogqBnh74FtxD0xjLFHWxiUa+7Sx2ZOKK8EuUYHLJyulsVGJe5UeqL6ulFvVHZehovZbtRxXt1H
|
UrWko0YgE2zYhhNKxGRgHEbxGCRokZJGYAMkYpH/QBIZuBrxsQtkKzsjps46lC+7td6cxqWmnCw9Ju1RLY8pKD5qbmdEbxtxgIQEvIvcAEAvRcGXADLz6ifQAqB+gWohxAZgZwEQqqR6wIZHUy1CvpGaR9t3qrVanMpr6Wq/ynwpcsX3wxhLm1lCGG4NLrjH5RRxsvJ7JxqhtGAkIb60ESSIRDJSCEIR7I0MmVRNtVG1cRsGNAqUrUezbDEiLvkD
|
||||||
|
|
||||||
jc/UfK8+uyid6sEMhFF4iGJxGON7bRiYsvGjygXx9zCYjAybsPvY8zhxfKydluH9g0SfEnJJ0IebcLun0sY6iUzPPiq2OkgaKsNMSPupdSwdCi9TkR11XSj9BT7zsgtYoibTLgevMegaTmDDBFY2UP7KpHaJ6RSqHOoEjHpprevTtjbOJhoY308MpvuJ6zbNsfknrervvtquMnobYruGukOU186UOWLZFQ0OXbkdtE5LiVBp4ae9ZRp8aeuSZxuY
|
9R9Bz3Gj88xKrt36uFJqIKgXEe+BbcI9KYyHR3fqdG8ehcdmSuMvBN/d8WncoGLhip3P+iDy0D1W6neqYo27gx2Dw97FihlCO7FJ3qxUn7kXiI0nEYiPp90Mx1+roGchvWO/qPvY8zhw+aydjwn9g2yfsnHJ+oebcYe9Mo06iUlvMardO2QaKsNMevupdSwdCm9TDxMISN9ioFLD6GtYqSbGrrjZivfTBI8jVJhdJlUbJKlxlYc6gSMemiETFU02
|
||||||
|
|
||||||
Yib1geccXH7+srPfHPx78d/H/xx0peAgJkCbAmIJvccfaIAaaZGmxp5OQmnAB2GumC2Ci8bN7UO7gst7NO63vPLCMN6AwpCK58Y2BfgamoI6aY/IgBAHgfQGUARgZVUwYWPXdEGNHQR0EaVJAF4EwGr6+ZqDHcBglJir7sljsta2a1KOxFnYF5yeEeWMB1SnDSBPpOgMYERhSmLmlgYB6ChyHNImCpvWnzyjR11XmBSR5HPNGGaS0aqG/UI/FgiO
|
LqLBe3NpcHDRtwaPAPB+ltIIFpo/tOGT+6oPPGghukOU186UOWLZFQ0OXbkdtSyrNFTp86e9ZLp66euS3xiDt1L1gT8e/HoOrrIgACJoiZImyJiiZeAqJmibomGJiCbyaIAe6Yumrp5ORungRumumCGamgczGemp0pQnhFb+regMKcaD5qZa8Tppj8iAEAeB9AZQBGBlVTBhY9d0QY0dBHQRpUkAXgIQcgb1mmsbEGCUuqshztO11vVrUo7EWdgX
|
||||||
|
|
||||||
JnBobLBJiFuXSzO5sYMhzExwbXS4UnAFwZd0PpRjyRR4LyuriQtsYKrbx6UfJDlJpnI0mjOMXpKZGWnSdNTGizupNmjJ9roIzOusr0d0FoQ0eJG2ZmicMhOZ5z2a8HJ9r0PLV1R0Y1LboDGvQgHSTDp+mrhlfNWLvnE0vWBZZ+WZmBFZgMfGM6OsKYiGIpjPIeDop6EdxmzoA4leh7ELEUdak4P9P0FasEKGHccpkqvxHQevmEUVd8byAH6jhojS
|
nJ4R5YwHXkb51qUdvo1hO+jqZ0HaKyYfs7xR2SYuUoxi/vKhmTCfsXHVaBMYZokxlYb9Qj8WCIMmtxnUf5zIupotF7CQrapNmJw7avyIcAXBl3Q+lcvLtHgvGGuJDDxoapLrEa01O8nzU/ya9G66joQCnuhe3tdzHe4lUDGN65CZDGj8+Dwlaj6pWZjGPjSQj0EGvRMZc9kx7wifq1Wo4toGrJrVu5Nbob+sNQ13U4j5r78h4u+d/S9YFtn7ZmYE
|
||||||
|
|
||||||
EG50CxnSRsJk2KxCBoxkdwamh82tanLatWZER2FLqYp6ep4S2lcuG2V37GIAQAGwQCum8MfbAZ0nnp57OgWnnXWcdHlVp5EHWn0A/GxBmwZiGaMAoZmGbhmGlBGaRmNnWJrdY55measG4anYeQ6wBoyadH1O1wZu0sKRWibm+m7wZt4AZvBKYF6YrXtPIt0XAADxMAZYG+ApgQgHoBSAZcA4AA8H3pjmXzMIbgmQxmCd/LMZ27uxm7ioqwUUuIEW
|
dmqx8Y1U6qppoZqnm8h4PqnWR3mbOgDiV6HsQsRX1qThXa/QVqwQoYdwGnI2oacp6+YRRV3xvIS/tJKpAf7zc8LGdJGEmNx3z0Nmc2nYd3H1p/cdRa3ZkRHYU9pt0cWiqgl2P/zjpy8YgBAAbBAK6bwx9sBnG+bvns6F6edd3x0eU+nkQb6fQD8bEmbJmKZowCpmaZumYaUGZpmY2csBt1kfn755Ifpq0hxmvmDrnSGtZruTSSDyG4RvtCwpFaVe
|
||||||
|
|
||||||
C8rQOaSEObouNEdppEhTJ2Lm8RqEJz6LJnq1+trJ5HIQh6Jm5UYn7ldWznQY6BsAP0WwZIpx619ZkeFmCe0Wahb2Ry2c5GHRlnjhSHcaQsvJHQS9VmrpJzzlyK2phmD4MRGToeRbTUiotlZ9ZtXO6EperXJl7WWtSbNmFei2fHz4PHltaLKFn62om6TMSDoWGVTQ0xY3Zg8oWCpZr2e5Nemx+fD1cXeSHnILh0U1+BaBfybEWJFqRYOB/pqCfRnU
|
ZKG0+m3gJm8EpgXpj/e08i3RcAAPEwBlgb4CmBCAegFIBlwDgADwi++uZfMGhtibrGWJjCs5nEe7mchKirBRS4gRYCiHXh2dUss/RouAUdppEhTJzHmDBqNuYq4pnq08G1ZqaZyN1Jm5U0npUo91SDsMEKHiYOG6FsMm983UctmEWldJi7t+gyEsnfylnjhSHcUwsvJHQS9XurnJ1McdHiIPgxEYTh4+dl6MQfot8mTyrlt9meWu3ot7xirLzDmA
|
||||||
|
|
||||||
ZjXyQWMZiEeQnLw61pWh/wrXrGghvJhf5qTwPOeeRbYU5h/qSommfyHxOkifymLlKRjjhA8vKpyG0PN5rrm0nORC0lapzhbrHBZyP2kHO5lsdVnFFxII7GlJ7oaHmqQl6v6mx55TVDlmA2acun1h1AGx5MeVTVztMeAZ2GXRlwujmmrpyZemXZlxeZ6Dkw/s1XnO7Q+Lp6A8X+f/nAF4BdAXwFyBegWTp0+fWAFli6fGnVlmZar9Nh2bJAGb55ya
|
l4Vsjmopv3JinyvBRZ+tlJ5RZ9Rkp9RdSm1qBPPTHs51GbSr6B7k1GaP6tR1xd5IecmRGPu2gWKnbF+xccWDgfGaYn2Z1mY18OFjmaZHuJy8PdaVof8P96xoIb2lSDak8EHnnkW2FOZsGh5plmjPKYeJyJRuSZkwRYMVL4N9aYGy4rpp2xiO68dcvgNmuGxBzzbw63efcG9+jxbRsj53qR8XhIw6Zv7BSwTIkBlNUOWYDHp2GbdlunbHkx5VNXO0
|
||||||
|
|
||||||
4KIYtps2JXIod1pQj8XyqxScEtYt7KmBDdkxA4AAEAPYhAF3GIBsQbEHGBbgfoHAnw0VoEgmxBaCYQnDwxZqirQxggeiGoRyMZhGPfWyBkh0YGuDmBcOnCYSI0RqlNZFBvXIfyXcR9gb9aCR5mftmPjUNtwkGvC0Zc8mFo93uE1iBIaSLTYlItx6jO+QNZH0HFqfHzJZlyboymBCoG+AEZz4ExtDwWRZ1SFF0M0DhcwFRcWiiHKno6E1J9RYZbJe
|
x4BnG5buXC6J6bhnUAZ5deWq/F+Z6Dkw/sw/nO7Q+My6A8YhdIXyFyheoXaF+hcYWIZiBfWBPlmGeum/ll5beXJAjn1gWRwrjpzmZGiGLULNiVyKHdaUI/D5qsUnBMeKNypgQ3ZMQOAABAD2IQBdxiAbEGxBxgW4H6B6J8NFaBGJsQWYmOJw8M2aaq+sckHWhlkebG2Rj31sgZIdGBrg5gDWEuaEiAUapTWRQb3GHdBiZblmplhWcW4u85WddVYx
|
||||||
|
|
||||||
yrtqKWWnLwMXDJoxaV7TJ0CEQ87ZpkxJHHZsSGdmmvH7HnSlmfcpXqPZqYquEt6jxc8qMlm+BmSD6/pq7FAlgxwVWlVlVZCnTihBfCn8ByKeTmYhmKbiHkWK1nBhNYMuB2JSSQ5oHQaaUgnPBTsKmeYGkK2mcKX6Z4pboZsygqvLM1DJ4UN5a5yqZz41SYWAFn6ylpY7nzO2io1WAhWmU6nuy7qd6XWK4frJKBMiQDmk3ZF2XTkJh/OjmWxhidan
|
5RYXmZJTWec9mvIVhw0sNGnJNisQgaMMWGikxZF6zFpFp3mLJiGusX6MpgQqBvgBmc+BMbQ8BcXdUg8dfhByxsGNS1y4/om8fJ7coCXPR4JcCnRiv0dxaAxyJYin0ZqOehj0sWOaOhDVhObjGFoC1aa8fsDJcznbus3CQnsx/8oRqE+sRYmAb4BVKNauxSpYMc/VgNaDWKpgErYXqpiQdqm25toYamOh5FitZwYTWDLgdiUkhVWhUPsfJltjYbiJ
|
||||||
|
|
||||||
WZ19YcmH516Ye6Du1XoJXmSANacWGH+wxzBWIVg4ChWYVuFYRWkVx0BRXLllYfWBJ16ddLpZ1tdZumWCu6dsGHp+0avHpi/+y+ltSvtBThDSLizTpLh34D0kI1yQovQ2AW3GIAZgQgGtxEwEHU5z6AMOFqIAQAPFwYpgWNZBHEFjFfBHmagMviWoxy0ANB9DTXFt9UQnCfRh5QPYWjo2aNkXpXH7JTGwBkgD8JzHmV0HodXjRp1fwqgzLla5meVy
|
7e+0hsmW0i6ZY/s2yoavLM1DJ4UN4iNZcd/wc+NUmFhNlqcsj81p3ZZ37XZp0c9qhVV0ZOWzh/wdRqtGi8aAKJAOaTdkXZdOUBH3lh4fWAP1r9dLof1oFe7Veg9+ZIAvpn4Zg7DHRleZWDgVlfZXOV7ld5XHQfleRX/h/9c/Xv1x5ZeHf12mtxWkZuBZRnMppBcUC9Yr6XQm+0FOENIuLNOiNa9JNteMKL0NgFtxiAGYEIBrcRMBB1Vc+gDDhaiA
|
||||||
|
|
||||||
qfWzfg9hbqm6+lqp4XxVinP4mCGqpJcXRFgxy3RxgGAFXHHgArjVWd9DVdgiMYGUB1W7OlSYNWNFuOv03jVrSbq6W03SZNnNR/SY5bmirltaKFy1Xo43WZ9lYBRXV7mccXvV5xdlWClGHoDW5yQSNlrIYXypBkwNpgQU2lN+4AeAP58JbTzIlm4OiWohqKZTXU54Mr+kqN1FHawvPagaJAAhQ0DFRFIQ31KxGrRjeY3FY1qx8KGZj+zCgkgTz0WR
|
EADxcGKYG7W6R9heFXGRlWuzL2llsctADQfQ01xbfVEJb6eh+vqBaQGHvlGXRlOKSUxsAZIA/DxxuRcp745pkzlHTVojRLXtZ5hrUMNQA/UWmHV7DK2WAvPUaFzzZvhqqTc500YMct0cYBgB/xx4AK4Q1nfTDXQzQSNs77137lOW41gOb9nAl/xdt7k1pbpbSVu9NZi2olyKfd7Yl0CEQ9jNlWdM26TMSAs205lrwrWslu7sJWY+sjdgpYRxGznJ
|
||||||
|
|
||||||
SYZWxSDYS5hd/xWZn9kyrlFRpaarml9ErNru19Ve7nX4dQIncdNx6r6XnqvNs0Hz85n2rDdNYtlzpf+kOVjxsxeDAOKACon2m3DQ71jm205RbadF5vDZc3WtlpOx2Wlx/Igg2oNmDbg3CABDbgAkN34BQ20NjDeTEb1qbYG1G/Wbd/7UAHbYDE9ty+dfXr5hyxQ7aIhXtcqN3VyLahiSP5cDnfgaBRC38ibwC3QHGqYDjQA8TGwvRaib4EIAGlTQ
|
BIoushg+akGUY2mBbzd837gB4DwX6lxvMaWbg5pZaG6podY7m8yv6XlAZQVnXPgZsFQaJAAhQ0DFRFIQ31KxGrHTb03FY1qzXX9VyETCgkgTz0WRSYZWxSCKSmVN/xjVn9nj69ezYbX7HNpkrDrYuySuC3YIjGDC3PZ+OoOmz5wIdldL54n0b9i2XOhIGQ5WPGzF4Mb4qwKifasN00ftkgdQAAdp0Xm8QNjUpYlohiADBWfx/ImY3WN9jc43CAbj
|
||||||
|
|
||||||
EdAHcfoAQHkZ6Jdi3YonFaTWLWlOYJXcZviAZTvF0+wedUpgQjJmk+ymfTGky9PrAa6Z8rarXvBRzZNHuN1Wlc3+N2xj4HyNFRzFyOt7Bo7W8e3hYlWxZooIEn/k9esnzNAbEBgADga3BmA0FNTdNt+t4iBZE0e4be1nSi+UcNX6WinBNXhe3RfNXGHS1fl7np4xehj0sMxaOhWVx1YdnrFvQV42XZ91cXrPVqVqcnHp5ytcXevbzzvHP0SEkEgf
|
bgBeN34H43BN4TeTEMN5nzB3DQ71l+205aHYDFYdmBcI38VxCfK3HS4lb6bP0DkXrX1C9pFwxxYnBcgZfgaBWa38ibwC3RCACoCmA40APExsL0Wom+BCABpU0BHQB3H6AOB5meaWet2KPFWB1l1vbnpV3mb4gGUkpdPsHnEWYEJVNk6AxgRGKWeQsJhnVbFG9Vjq0VmC1kzZNXlljWZTmtZordsZzB8jTAq7Ni92Wnth42ZMmXN3hqIz3N71eSSm
|
||||||
|
|
||||||
JqHfeSLcXBPWLDyZXdV31dyXwJ2cN2Cfo6E1knaTmydpLYp2UtrrnBh/O1kXtM1bfmru1ctrJf2a9kejf+6Cl4icrWOrEpdccuYLqHtRtYhrfDaWFxSE9oGl4Va4WIfBvq7XxZvrdaGGYPXfg1yepFt1Xs20bdzbp9/NrpDifRvwDlrZa0XjlvDFTQ4ANtAZ0X3dNZfer8rRNfbtEt9uAI3X1K69p0qJAY7fXn6fCAHh3Ed5HdR30dzHex3cd/HZ
|
BT4E0BsQGAAOBrcGYDQVAt02z3mGYFkS56vFh9e9m/F+NZi3E1inBCWI0h3vCWcvDNaDGs1mJf3rwxw+vzWZRp3cTmAUQrea80p9r2j7OTSrYAqi8TmpioJUgWDo2IK95ItxcEp4sPJo92Pfj3JfFXfE3WJtTr7WNd1ua13BtnXeG2uucGBK7WRe0zVsDau7Vm2hl85r2QtV8ZYiDx5qEKH7MWIaw1AebbDAUQDtkjWKltYaOp8wFp/RazaN5oya
|
||||||
|
|
||||||
Pnnt9AB33UAPfdX2p5o/crinls8funHKgPZGTgd+VvYzQ9j6bn1hWIDb8WABmPaBWJCpgU+BSAb4HoAHcegG1b+gYCchBfgSQAaURgIEA4BLyZPei3fSonYZrU95BdiX8N5KKx0ILKFAFZYQ2+yJgQOaGHL38+avLPhgGrvAZWWNsrbQqudmJwomqFqxY5XbFtQ0ZVEYoXexqtaBVN72mlyXbFXOvGXYEW2liWbOqvNwhsLb6AGNA4AY0A4CCSlZ
|
3mt+ooNDWU94iDT34NcLfV0/B85fPmPtt9fQAvt3TQDlrZa0XjlvDFTQ4ANtAZ3APUASA+r8rRGA7tEEDuAO6DQNkFaTtkdr+fp8IAIXZF2xdtgAl3byaXdl35dxXeV3wF4nbAPSdlA+gPb5jA8ricVqYNSH6d8EaQmoRjKprAsZufWFY+9lEfIHB92laMLI90gG+B6AB3HoBzW/oGonIQX4EkAGlEYCBAOAS8gn2utjMrV3Faqfc4XWlqTeSisd
|
||||||
|
|
||||||
nwhVnwveQe2MgYA3dlGdZ43YM31Juw+M3tF01Ya69J/RfsPDFu3ZtX+662cHqOCUQ8sXC++5FsmGF+yY9W5Fr1btGfVoSbaaORbepxzJ3TzzPtQ17wZPVYd4jr0ODDow6XDLHGLbjngxjPfi2wxvFdZr0F1DBT64Qod0+8SoXm0/Q1DAtZTHtjYbj+62drMY52hDhvcloeDAiFYymFptYn5TsOrbVsRNiQcanGxnraH31NnXfy3BDaw67G1BvqdH
|
CCyhQBWWENvsiYEDmhgd9/PjHyz4Ihq7xtVo/dkWJ5ofoSWlJv61UnUlxlURjPd0uDmAseteexCrt4yc69TJ8xaKCLZ/5OsmDHT4HoAY0DgBjQDgIJKdmfCF2fC89+7YyBgM9iLZS6897/n9mbepNaDnQlteuL3GHUvYjn0tuYpjm9u+zg8OEp5JbEg1JhlU0NMWZve/KFgjzeynqwUPXyG+0MYZ98rWPmpPUBdqToSOkjlI6XDLHbrcbnax2fb6
|
||||||
|
|
||||||
nJtz/fW2seXOhmXllt2QJ5t91Y8x51jiuk2Ptjk/YkBFp7SvmHL9ndbXm91jadQP0DzA+wPcDioHwPCD4g9IPr155LdYv9tY42Pxlo45hqX17YZgN316I4KMmQL9Z+CbhDyr7Q+E0kk2FfKl7U/m499YGIBbgHgG+BFfBJFCTsgW3AqAXccgGtwYANQsw3Iqhg0TWs9rGfJ2cZlLfJXCoN+EydVUWo9wlWINJDFRyZJo5LXsRrhQqAdIbAH5BGV1
|
2GxyVbVreF1DC764Qod0+8SoXm0/Q1DGmh2mBxxdbGXiem3ekmJx+3cloeDAiATbpU/dZWGjiCyCncNhpaa2GIfVad2HL1u7e/35twQ1yOAD08aUqjpkA6FKSdgbUb8seXOleWflt2QJ5ED0nchPoTh5bhOsDiQFeniayDokB8DqDZ+nPgKQ5kO5DgPAUOVVCoGUPVD9Q80P0N55LdYkDxE4roYTlE/w2OD75OI3W96NkKNAUtBZq3eQPhNJJNhP
|
||||||
|
|
||||||
jdLmc+kRguQKRwXdoWQj6Q+ZVbGCvgRHba5uYvcRV7he4mJN6rqJ72l8w9H3RrSA81mGcw3dRb/3XWbN2TNnRbHKrd3XIs3pRe3b1G7V8rHz2iMPjea9MqehclOHF8I+8JQDkRfBOQ9zppOHjUNvE8G35l8eO7ET4FYy54ga3FUAQqmBZT3sBzFfCGlmsk/9KLw+g90EaNkmT57uO1nTzXy5/QSAaK+WAepmGN7aCY3+TwQ7ynOjyEWRhZgPgetq
|
mpe18F4ffWBiAW4B4BvgRXwSRQk7IFtwKgF3HIBrcGAAcKRN6qoYN+1+fa5ntdnmeG2lVwqDfhMnVVF2PcJViDSQxUeddOxLdnvs9BRd8YGwB+QFw4M23D4wdgpS4N3ctXJps1fLs1F3w+ZVbGCvi5HMW+1b923j3EOMWg9xrrF6r1zI9T3Rrfg//33RmXIKPWmIo59GC94Kcy8BW48tS3BW0TmzXoprLfKwV9ojHd2rVwgm9P2j9ObZNGdq2bUL
|
||||||
|
|
||||||
gj6pZ5n3LIKFF2OFxQ863lDxoeanBF9U403Bt7TYn3M2kbZHWR5vseWP6QmUJ9sm6CyyUs5IidvQAAAic4UsNLY4+3jZhs4+Wnb264/0qzB06fnPd6dS0stn1rYe+TgTzzc9nXJlYMhOPJvzbajyIQ3mA37UxA9DmT69YFqJbgZgB0zTyOUGJOsV0k8z2kzkPtiHUJvhl+Nc+bWGWRoNDUHObvgmKjiBvIMFEbAei8FLyWy12vdyncxis4TwHmrD
|
vPATvuFjUNvGKGxmtPvB6hTulYy54ga3FUAyqphcn2RBkVcaGtm9U6zKLw4w90Fo6JkTHzI1l3WwXOp3gEw8xJwhor5Lck48d9lth07W3GKjbd0ZkYWYHMH0Wrw9pyD1v4ncsgoH3ef2wutavf2btixa/39l8NdC3D56Nf2nADt7ZfWL50A/pCZQn2yboLLJSzkjTkiQAADfzhSw0tUT7ePA6MT96ayacT8mviHIZkC93p1LSywRmCNzg5gNWT7o
|
||||||
|
|
||||||
V12UsOsBrxKhoit9My+TBvF39OhqfjaOzpsaKDh9o8Hpkz4aLiEj+5yfbs7uxxY5HPySiQBeAL0R0AQOZzuJS4ueL/QdXPz984+MHr9h9quXOL7i94uLI+puAGkOgHdvmnBjUqEj3ppUG8XboCiF8qajEM+QP8iUmGxBcGdgXKJtsmM8DH8jtGcMLijxLfxWqT6vR8RK6qvtbx6ow5tOaDiQwVO4gcyQwzHENdnYrXOdjC4s8sKxSDb7BIahb99V
|
/D3JwmTC5PG7WrbajyIQ3iNaHUsQ4rngG9YFqJbgZgBUzTyOUBVPRVtU7n3RzqvvaHeJvhl+Nc+OdOZz4SzUDMFP0YuAOI/2UgjWL/kJdfxyzjwaZP3nT/+W7gTBYWxJgPW5YdTbfTMvheP7N/3feObzg0a+P7zzaeVRydO6GPGvJt85cNgDq4a/OXgC9EdBRDwC7iVrL2y4iGoLqIZJrYL9AYNLcmlFYkBHLuy4sj2OlIZZOUqnJZNHejzRsKWT
|
||||||
|
|
||||||
bKoe8mKBHvZbmsMrrYH3OzjQ5ovcKOi5w7T4OY576Fj0dYLb0ASwcmmzRfK4var+gwZYkjB5OxwLQaiS4/2IAIq7qbTxhppeXFLt5d9XJw3+mBTGqceH46od8U3SOJAW4FwA2AX4CEBcAcYGDnDi9FdjPr0+M+xWij3FZsvSj9jtQxMIB5vphWUCSxrBGT7ZVxZxoULqcLyNUhaZXBTrgc06SkDF3KH1hAi5Qz0E3DBrKax2a3IvDOyi4mPqLqY9
|
eJUBKXboCiD5qajds4kP8iUmGxBcGdgXKJXs/s+rH5jtme8LljgbalXtT6vR8RJ6jnNbx6oy5tubhL/d1O4ccyQ2HHENFdd1X1ty46EVWKxSHcXBIJRZUul5/6DLhT1laZ0uzJj1e+P9lk/F3xT4f44TOLFIA/e3LL0E/QAkh26ZeTQhiC5uSwNmnwIOvL+g4gBFrtC+ZPOmhnZCusp9vYWnOa9ywlnTQMzp52NgX4HFNxjiQFuBcANgF+AhAXAH
|
||||||
|
|
||||||
aGT8XXerLMrhFVYucrukLWGNhhdcGHZ1oS9uTyrlAKiaqr5YY+PxhldamHDz55YUu7Ilq7VLwTjWfiO2gMmQKrFMXysvNdLsOYkBbcL3CEB2gCgAvRbca3DeAHcF4CBAeAW4DPJcAC9FuAHcPybMvY5v3ssvIh6y+TXbLso8+sKB9y4jg7IP6DXc0h/PLgukIBC+ylgQkBtaPy1uvYCv37dKU6Li4dpEluEhsLlrnwYDKsYQVoEILI84Sg5k1BAo
|
GAy5n4qFWBzm9KHOxVpY4lX8r1Y707UMTCD/T6YVlAksawI0+2VcWcaEq6Yi8jRkXHTmS6nH3SkpAxdFh9YW6uAul6nZ1cMZfqDP+ey7bPXrt3S9u39L3CnplWE9GAZ7PJ3ote3zL2a9razRJ4Zw2gRrxpZvAR5y4ya3LmIc2u/h6k4kiub2nYwuy7Q65I2iV7tLUKnt9nc1BSYYH2EOPuy8wSvK5iQFtwvcIQHaAKAC9FtxrcN4AdwXgIEB4Bbg
|
||||||
|
|
||||||
aNvuvfPR66ZHlT1Q8k38GwjJk3tD4SfWAXgZQCMAoAW3AOBMAEGS12U27uaSnBElcu+uUTWw9Un7Do1aNPnDi3dNPGuico8OrVrw5MmfDlXptm4IEqG081hPuCw0XBwyCDgLoh6DLLZgOWlWofdiI792pulG4Udzzvm2BSfLTDxr6odkIb6v0AZ29dv3bz2+/OZr387mvSdik5z27L1Y2G6QEBC5vgSjHCeDNp0jBIA52FtPtBzULkufIWTrmkfx
|
M8lwAL0W4AdwipzK4bmS+nK+aG8rwdYKu1jz60UHhLiOB0K64DQpFn9kKq/Pq+h8aaRutzmSZau3iZYuLh2kc+q/SwufdfBguqxhBWgQgsj0pKDmfi+N7Az5RQu2Vq0I7DPwj4PfMnLFr1Yq2I9/IheBlAIwCgBbcA4EwAQZJPcLbI6kkiNigoNOmOW8jrPcTrij9lRTPHc0o8L2Q5io49y0t8vYy3K9z3ojG4IEqG081hPuFtWzesSCDgLoh6EH
|
||||||
|
|
||||||
hQ4AQjH4qlssaEoalwVTZFUY3TtIv6phK+eu2R5K7evaL5VBThHgAO/7PbOwc84aBlpY44u2S+AuWAFAXTKmIgbiAAZLn71+4OK0Cp102Xl57ZcuPdlx5PQAibkm7JuKbqm5pu6bhm6ZuWb947HUzRT+5sBv7wA8aukbuBMB2wD56dcrvTjG5pHERpJzvO/FgK0buIAezPvJLybAEwBsQB4AOARgcojYA63BAG1gYAXABWKJriJYsuol6g5iW8N5
|
LZgOWlWoDhTJfSnsliW6LvcL1AHnmzrnDBPAOUEi4gq6h+6/QBS78u8rvq7xi9+vmL/6813NTxfcKvuDRsERxFbYbz5YLTFvuDNCijBIA5bNq05HHZZ23eav37K477LJ3Rao0XZqv8T9O2RVGL0XM7zhpJuPj7eb0ugt+u6o9EyUX0muT52oPOHgTua6uWQKNplAKL0MtiF4jAfcHbQ/16kFIeSs8h6npKH6h/CJVr9E9cvMT9AGxOPL34fWB1bz
|
||||||
|
|
||||||
M8AqsdABFb0wLqDk/trWQ5qWRK6sjBMQgpLEenvMx+W7Qu2NnPoEg3g3dLjUngcRRSCO9tJ2koKBqUfa3WziXdFXxN629VOpNu294W8YnQ6buL0ZcEkAver3CzdvbgV3MO/bvFnH2dTgkr1P9V8Xr1nDN/x/DvqHFw/M2mum3a1HrVhO6tmk7vw8uhlEjKornA87R666mIyI/92P1h27ab0aqA7Whra8Dl8qsbWPdDOnb+x8cf8AZx/bv41hOcTO
|
W+1vdb/W8Nvjb02/NvLbqk7HUzRFDrIeKHsOhYfWmtjsoH4JsEbsjqznjtrPqtgi5TBx4ZhAa3U+3nYCsz7iAAcz7yS8mwBMAbEAeADgEYHKI2AOtwQBtYGAFwB7iz64aXsrppf0OWlyTbHOcKrHS+oASYElzIdYESefh79jWBMQgpbQat3nD/TaDuLjsB89NlErqunmc88RRSDb9udFbFvvENX6uA9pjhDq874a+iPclmxYMdrL5cEkAC+r3Czd
|
||||||
|
|
||||||
kJug8EfdBNjJdTyMPMjMgzBMIRbhPr6so655Hny+p0/LhW46Olb2WwtAcyiYHI5+uLESuvmJzG4AQ7w3e+MeyLg+6amqL7VJPvUrs++kpKPQO6LNsr4c/6GzRDOIdxUAC9GPpJANeiMB9wdtHfujnk57OeLnq5/CJlzgc3/ulpucaAeTt9YAoeKAKh5oe6Hhh6YehBVh/YeEH5I1AfM4u5/UAHnkeief/jo88abXlj08/XAUs8t/XRgV+A6ptTwM
|
a7gVz1SG73fD+P4zvB83L5eju8KPYtnPZKPqHMo+S2czqo7CmHui8p275i68vK8BIN4N0m41J4HSe9upiOfqMptk+yH29s7aAqbtc3JlAsKRW/yqsbIfY7P1gCp6qf8AGp5vve15uZHOuJow78fdBU0ClaaFOVM1qRJluB/2In5UCieD90483PTPddauOEkQ0AvgTzR7a0mVFuatQyAMu8MQfXj4m4Gudxj/Z1SMH/jnL591MaHTu6bhSsBOCHi5
|
||||||
|
|
||||||
9+n/hx85hSCb/yP0BTyB3G2K0D8YD9xLyKAB4AFTTAFWB/nKp/T2anv87qeBH0PqEeIkbTwo1AkVaHwXbEEdJvsZkXg5Qs5b2e7IWuUhe4UH1H45ESfNrlIKPsawCRVioZQZUFrwiKkNT3cxgdtdMerb+NzUO1TzQ/tuzzuVcPJmAZQBgBpgA4F2DXHqaN9ueWfdW4gdnyTj02gn7/kCeDZ83dVHMvaO41GInqzfNnvDmJ7Mnk77LBGgZX3O+ORK
|
eCGFrmbNQBGHyQDXoqHkelYelrxIbxeCXol4Ue4duUoR3ebpHYg3P5uC8IPTHigHMfLH6x9sf7HoQSceXHyR+SNcX2TNIB8X4+kJfmHkl8Uf/L5R9BHqB4K63umdqW5Z3X2Dy0o2cOHmyeRpUo1spHyLmFNVv/I/QFPIHcN4qkPxgP3EvIoAHgAVNMAVYH+cznmfYueWLq598fq+/x7Pd+3aMyEX+KwVhb7YzBIHMhmcoKEj1A7n553P/yZSamfj
|
||||||
|
|
||||||
ZQyHleXkKShcKVXo0ndOS7ybrNwlLuVu5MtLqA8bPoUJheA3kwMh8+BTX816mBLXhl/jmEz5l5QXIRxa9inv2WuH5yknAwwI4hDHCYA5ctv285ppgUdhaOZ70s9M8Kt6teMhSWvdywhKl6Z+pGVoIDXpoFDuK8VP+9w+8lWuzntdteU4Gwv9XlBnpfmPepv67Hm9klYFQBJyd+93fiAfd4FVnn045Ev1z9ACv3Nzm/dIAiXkl8IAyXil6peaXul5
|
kFJ6hvGGpIBrAJFWKi2fVhGaenSluYgjyftLwPdzuIz1zdD2XVvGP4aJAT4GYBlAGAGmADgXYLqepozB5RfvIfjue2K2hFSi2On5M66fotnp+dze7w8v7vne6o6HvajmGPqOECcN6jeF745EplDII+zjf02u+w8ijSDOdTHFnze+WeFAx7v6P0FwLp6t+IHZ/GbkwYx6LeS3st7AXBV9x9tvPH767oSuF5kaBvGp79jg0VEznPeeF4bJEuaiSy7w
|
||||||
|
|
||||||
K339mG+0G93g97hfEb88ZAPMn95e7TPl8jZ9Pw9MKE0uLBR9mA3s9Mh49x90U8jeBWgOK0wAbE3dGaIY0HgBqJaiDdnGvcjig+4e4t3h4S2eb6t7TXlrzD0QgFMfyk8woyz9FjoDiEaw6AzwToFPBDrgU/nuyJ6sD4cxCB4z52IHa6ExQfAgHwJ0YD2K4VO+93ELMfdXm26lWDX6x8V2DHfQHwBcGNXZmBsQK9Gtf5F5d5SxboTvsHWB5mw6N2Q7
|
PhZ5pUCHHay5ddHHV17c5Du6DCYEQgFFYJHPAPJz05WXUMphAvAzwXRKQeDF1/aMW4X288/3EXgy7an8CL01wfTls8exe6QvZJWBUASclofcXwj+I+3huO1fm3pj8cZfwVx5P1fDX41++BTX74HNfLX+gGteRiFbboPBbkIbI+BVEW6CuCVo69I2ClaPQiuBTdUD2EKoPmuz1jHj3H3RTyN4FaA4rTABsTd0ZohjQeAGolqIN2D69mOdDjx962vH
|
||||||
|
|
||||||
gJ4cOTP4J41zI7tUYtPY723Y+WdRlotMWuu+ziMgePk6FdIkQ4oAxRMUHosqhi7tAVLuU38u/AG2r3gA8s0X7kX8lshrF72A/FmZrxfxCgl4gBlP1T/V2NP0t4KOmXru/JPUFyk75vTQP+CI5KNI/GFvDmk/ASBSVnT1ezxfbt8UfRXo684/GZ3CVRYVX9UAUhZGKZ+RzN72CjJhdYZXRGP6hii5WeXrtZ+133rnljFiOTpi4HPB5oc7vv2L8dfQ
|
/rcdvr3kdZBvwI/RmtYZQbmDnPvgvWcbZ3F/6XlIu9b98kvvny2t+fvBaYE4JXSJEIg/VaDFExQ1il0ZxupaAnUEOn9+D5f3s7zN/jcIj91a+OSn0K59WMufAFwY49mYGxAr0St/aKi2kkj+lxsKNdUavZ2NZ9m4tozm9Hu73p87eQplLaq/TyoZ+iXh7sMdHvq92qD4cxCB43y3gvkL58DOjqPuwvt73jt4AVXgY7+J/JUYbjPrrzQF+AVmnV8M
|
||||||
|
|
||||||
AGYkOkGyDgSLIdx9gEcdnPmBHcmSy1vqIA2+7QfbbP3DBi/avePn8S/yJ4P7AEQ/kPhpVQ/NijD6w+6iXD9BemfJb92/Vv9b82+0H+S//fdhpF7ob7Pl6fc8f1qE5TA+DarCJYodsg4S/CO2pX6BvgfYqgADgYtA5A/eNgFqIeAIwDgBvgGNFwZTL8g4/LCP4ney//zogdTWgL79ip2V3+sAUHZUvNb/DfTLSDzvFQd0dq/fLto/8uhnsqtnCwkY
|
K9XpHYy+svnL7tem54c8dfL3tpfHOKFPWDbHyoJIgUxBYHx1Z3rYJIMEhHsvFmBDiGn9+AfzjwzdP3UWZUD4MFIWRixFsb7SdfYyYXWGV1LzxwaNnN+lD4Rfk90a55YxYy3ZbuATytqBO8Py+YZiQ6GbIOBRsh3H2A7xoC/QBEf9LJR+ogNH7tAaX9a7wPaPlHfWAFP7ACU+VPhpTU+XizT+0+6iPT/5emfLH53Icf1H/R/2D20oQnuD9R+GfRvt
|
||||||
|
|
||||||
uEcQBf/eoGskgBV6ja77DyP1jSOfFh09p3iT6UPtXpjhNrZPxd/l3A9uTckKhALdHiAHcYbwEwtPuQaSna4LSUde4vYz6M32VN160WQnqz69e3Di1ds/In+O8c+YY5z4QJJXsN7DfI3sSGjfFXiX/jeWvX3eTe7KVN6D3BfUPXB+ouEiHkhJIJC2A24O5cKfONW9YC1+dfvX4y/ObxOfJ+Ixvu+Au3L2Mx/Y1klzzzXZgCr+rKukdKhDWFHzn6Ue
|
BFynakdKlxmDHm660PFviTtqV+gb4C+KoAA4GLQOQP3jYBaiHgCMA4Ab4BjRcGDK+0PkKoz/V377jU+4WtT527dg0kEviGOSYAuYHybD55BARx4AVjc+7vjz7ieQ3gD9nCwkYuEcRPfwCoGtY3l5Cko4i1754qjMPFiuRvvdN9DP4vlB0S/Izgu7D2Rv5ByYEhALdHiAHcYbwEw8vljMaf1IOt8/cTxowqbf/3IJfz2Et4Oa7fMztbsGevcmo7Fa
|
||||||
|
|
||||||
578V64/4iP4Kr68NGrz6P/vNzzDg9kaSAWeZ3yT/r7532XdG+fb8b9osELLsrFctZ4ddvvxtwZdHOj31AHszj23QbaYF/wduO/mSsq7O/kvi75vfNoxH+R/UfzPUZvGHrH5x+8fgn7e+4lef8X+83396AO31gD5BOQv1Gt4B3Kq85OYNQWrE1eod4+bh/AZpih1+/QHy4y4Cd6bNzgWoU0y+5bzJ+LLwAulPyx0YCgkg82FrOPkB8cn6F1gjH1pk
|
xnvNcugRoEd5Hfx3sSEnf/fhN9nfithd6zmytkT5wvRvu1fZ2rvQ+6QsjWyV8LzJfvG2T/U/9P42+Fjh14N/WL6QeHWOL295QgkgarD9g5bBVINr9jpIPw52qzpGDevP0N6PA/gjnLw0avO48XnwvsOD2RpIKF80uQz8LsGvIj0H7rvwf2iwQtVy0r5e2zL6VwsuzN2WuhHwcy07TCGbTFQAoAN3eFH2wO8O3jY9L24eqzgwGTzBl+doHl+mejNu
|
||||||
|
|
||||||
xcCCc1exFevbwlq/byEUBghMEWXX2Qa93KmNVWuuYKSkYd13lO2PQV+Sp3GOR91626z04sZ9xtYN0FN+zsRcM+z22SAwwgAy4Gtw1uA4EAzgEBQgJh2660TCwl1O+olwqunzyeSiDxIkogOEBv20BOZdkRegHz/QKvHBOeyGBSjKT+QOQ18qPkTg+nQHwAzgGxADuFtwzRGPYDwFwAPABVU7QH6A7QCgAASzABlNngWjLygBxH25u2e15uS13gg4
|
djxV+avw1+WvyZ+cSgI+xAEgBr7U5+VA2Rmcr2Xe+b1G+V13Z2JSwGwIL29K+VSPe5c11elF0jAqf36A+XGXAGfWtuLC0qm8/y2+i/ydebFxX+WOg0Ck9VNAtsEVso7B9eoqUsY7338oAiFu+Th0P2LvxP+bvzVw+MGmgX4k1WaHiTaJ5wN41rEEW0X2heWdxQer/yS+5NzQ+uFGReovlrezdxfO3i0fWM1w/OIJ2IeEAGXA1uGtwHAgGcngO8B/
|
||||||
|
|
||||||
cCSA74mVAmjjnClpmfgdejZ+SoGxgzZ2r+/Ty5+gz3LOwzwDU1Jg50bunIBn6AZMRI1d2zmxQyF4DVAD8xbOvf3oBc7x1eKDj1e1sRYB2Dj0Ba0E4Bai1N2rrzM+Fv1rIHr1bqYTxjupnxs+RnCtOtqzco5WBSBfHw2EmQJZmvO0D+LuQ9OTAlwYW6AoAuAFPI+AHKIXuHhAzgAOAnwA4AmgHaAzgH0AJ2RcB/yS0BugjN43cDpWuZntQdH1Qwo8
|
OxgBiYRcunw0R2KAR4eMHU4K3l3QAfgJ8BgnwOuPPz7+tYhV47ez2Q39UZSfyDGGfNR8i8n06A+AGcA2IAdwtuGaIx7AeAuAB4AKqnaA/QHaAUAAqWvAMpsrC3teggJM+DtwX2Tt2Bu8EHDgG/1ZYZMGt8az12Mz8Dr0ioFag2MB92gDwauv7yau/70SeAampMHOjd0oL0/QDJmjGdeyLW330bWRGHQwEfxf+Ufyl02bwkqFN1WG3FneeXtzz+pl
|
||||||
|
|
||||||
F4gReRQQnqUfYFyio2LugVoMQgkO85Gq2/EF+MXlSYWyW1iBTphQqHH3r+nDzyOHNx4eU1zoSlbziWZt2xCQ+WA2zJTSK0uy+ifKyHS4EUyihvFcqSF3we0sX7QsfXxuL8n1eKV3iIZ4EWKn9jGwtQN7qc5Ts2Tu0ygtwOpcuwiYmm2CeB3HS2Uu6W921oyWYjaRVGrQLqBhpwaBYd2Nm4T0d+VmxpaewyYEDuGXAQIGaIUwDxOCJwV2XuXLw6FA
|
w3Khf3N0SZy6kvoyS2/owGe2ZyzORnDzOmWzco5WFmBPXw2ESwKNWqszneVZyOuTAlwYW6AoAuAFPI+AHKIXuHhAzgAOAnwA4AmgHaAzgH0Af2VqB/yWSBugjN43cE1WuZntQoi1Qw5/TqsctwBgXqUfYFylG2LugVoMQhgeXNRJQRnS2UE02lSQ2zGB1OkauIDymBe4WpG57w8Kt93EG230MOzr3O2pgOQeeTCNacpWdW4Z0RaWi2tAntRuQ3Oz
|
||||||
|
|
||||||
eicOFjUbqRi+EAHmIssBNAuZkWKbsHiYH9ibwctFmi8Fjgu/Hz/EBG0LONezwBWfXym+H2J+AIKI+QIJoO/D1gBA30ZGwGxW2iDm04wg3DMMjzf+f8mV0700vAo/GRs4sUBWSf0k42IMqB6hnxBrKH1K032vueCT4BAeEvItwHtEAgKBAAgIGccYITBbwCTBKYK4Bw83m+Bz3Uil7SkBm/xkBEN1Wc0TSGCCgLdYaYMTB1uGTB4gIRu9/3+2yN3G
|
UK4l2WCdwmli/aGb6NKwoup+lj+BwLx6apBmQJ+BUaSficBeCWeBI9ziWY91ogpIOpcuwhBeipGpB8cFpBQi0rOZhEbSQU1XqHo25and1bezbzl6DXzdBDX3siTAgdwy4CBAzRCmA8p0FOMR1Ty5eHQoD0ThwsandSM33nORGHBgJoFzMNxTdg8TA/sTeDloUqVmwqwIWBqQWk2Wm1ieq21d+0tgM+uv1Pexnw5B3j12au30Juq/TMBQoIgqwO22
|
||||||
|
|
||||||
B+RBIOUwCEAUwG+AcAAvQzRG+AxABMyIwGwALwBxOTSVQKQP2A+qUVMQaSFugJiGFMqWF5eFrDLApMAiQSQwwqv6UNAdW1osq0HR6cr0+QiT0IgvR0iIHwL6eXwJ9aDX1+BFoOvqJPyoONoL4eqzVBBtANrGbZzyYwG3/yQsxVOkLT5WIUAHQEcHxiEf3f+L1Bli5vAuGxTwkKIYLG+R4DxBRYAtA5AnH+SfmYuErm6BidyDecTx+gDzUcQIKBi4
|
WxuhsG4ZjIwluwyqaEwm+uFFH4yNhlBLAKW+L8nVB1gPiIZ4BuKQtlNg2HwlcdbWYEl5FuA9ok8BQIE8BAzgDwc4IXB1uCXBAQOmu753weIkW2SDBTA6PN04eydgCqnlwFuUjxIkq4PnBbwEXBy4LiB3PzUe/wPyIGhymAQgCmA3wDgAF6GaI3wGIAOmRGA2ABeAspyaS9BUluHbAjBhvhOao1H7gHOQEuY3y0BM6UcQESFO4kRGH0f6UcQIKBi4
|
||||||
|
|
||||||
hFEF6jKF3BwElNAB4NGKLIO0mZm3ZBjh0t+jQJdeS0Xt+1u15B+uQV66TzLuzYOjY+AGIALuDeAQIEvIAIA4Au6GIAtuHiADw00au6U7syLwoU592dg3FCYgHKGTIea3lAx4AK+Hvk+w7CmH0WngjestS+6jCl+oA1jVggvz+gesHeBue0+BTvmzGZZ3Qu0tgvBKMyvB8ExvBJHx8BOMgdBFt2A2h6QbGXYGV+1XT5WBj1OaHJxB2YP3/Br7G8WW
|
hFGju78gOQEb0Igtx0iIDIPquTIImBLIODuJYLWaquz1+eh0rBpn1aBOMgB+2oxbOvO0wK05RdWiXy0Wuizx6moHxia725OL1Bli5vENa+zyMKw4LB+R4DHBRYAtA5Ah/+eoMz2E3kNBbX2NBHXx+gaEL22tFlWg3PRiQeSGAkdzxiEEZAXSSzEdBKa1uBuLSuBXnC7u5f1CmESweBvb2Z2aYw3uvf0ymTAnhAxABdwbwCBAl5ABAHAF3QxAFtw8
|
||||||
|
|
||||||
c2g+IEIRUYEOH+EELVIr0BnqA6wn+upwm8iEMDeNp3K8UMFF+tVC6gCRHUCykG0hF0V0hYakIhhsxIhVEK5BrTCt+Ud2oh5pzjuwPwYhQXyYhEgCMAAeH6ArQH0AZ4DW65vSlBUoHgsU4NGo/cCr67TzB6l9k46dkCNA31EiIJSxsggPlMQ6MHq2XXzToR4NZ2PbwEOfb3NBczUJ2lkOw21kO8BPdxuK9kIhBfi0J+Q30YB1I1LARhE1AVwlTAmb
|
QCxG9jV0mndlE+FCmYGzsG4oTEA5QyZBVW8oGPAkgI98n2HYUw+i08Y7yLqePUYUv1AGsasC9+f0D1g9IKX2jIKdM9FWRuXKWPecx3LB+v2aBANzM+7Lhi+V5yM4RrSPSG/S7AhT0a6Wi0UGVOTCKj3Qo23YNfYJS17m+6REhCKjEhH/wkhWoKTgnninBBoIr2SkILO5Xihgfvw1oFfH96mm12AMVGHSA6FFQYan2KxkMS2Re3buRf0q+/T0eB3o
|
||||||
|
|
||||||
zSqDMlxwYGxChbjw1YkELUgPliLwUYK6GvZT4BkYUjC8TRlK6AHfub0NQAH0JnaX0K4i0/zn2E2w0q/JULB8bC3+JYIGCZYPkBYLwgAP0L+hXmQBh9YPQe/33UBJ2gVU2IDJs8QGwAMwFIeLUOPKb9XfE+YCFMAWzSWowCbwhvm2MOGk7+hvEb2VviHQJUHChSISkA78m7yKZw5+cQNr+YryBK5kOWhVoNJ+XgPmupH3Zce91E2RnGA2HbHbmraV
|
MzW9kMXeTkJO0TAiMARJ1aA+gDPAX3SzG4YKlA8FjSQt0BMQwplSwPXFjgXWDsgRoG+oKEKuONkEB8BYw3gAX3uO+YOlmXzzUBA/VkmpYKga1EPYmtEJaBj93BKjEMMWRrW1+m82Q+t/3x0sjCuEqYHrO/MnmwuOEY2o0PqeGrEkhakB8sJXzkhrdwm8M4MjCkYQKa5pXQAJHwgAzMNQArMKQ67MK4iO4OEi2jVWuHwzpex4LCBSALPBQwQvBbrC
|
||||||
|
|
||||||
n0PgX64S4Iu0l50RsbHFhCAbWUCgYPxeWIIqB4ENwod0Oxg+uyvuz0IkKfAP4qE42aA5jQA627R8y5bQ3a1BXratBSoKEmWmBagAE89hEeeHACcaAzlNhR43Nhr7QkylsKA6b7RthL+Tth7+TXajsOdhndDYC+gHdhnsOzB/Sxn+99xCaYMLBukMN0iUN3LBcMO9hw419hM7U3agHVGyoHTnajsN/aTbVthTsPnoUcLdhMLw9h1TWPGCHVRhwBwB
|
5hPMPCyfML2uXP1UecCQhGBjniA2IDJs8QGwAMwCMez0NOKqDXfE+YCFM9Wz6WowCbwhvm2MOGjv+hvAuUQwKWgQ6BKgWoIhhOEKQsREPc+QDykux+zKhl6S+uWV0qhNEOoMdELRhDEPqhgP2YhN1w7Y3DSBis+h8C/XHluF2nwuA7DiIpzVOiz7xVuQ4OtiI4M1BNxWxg6exaepyxnBulSfGzQD8aBHTvaR7RbaeHSky2HV7aVcMkywILUAAnns
|
||||||
|
|
||||||
+9oyYEp5E48XuADwFQCqAbdCyeE4JGsJMNzAyr3OGWWz1oLeROwwUFI2kFwwqE8ALyfBj74ZU1ZhwqRQmJGmPBRkPaOiQL3CgIxvBlBysh1BhshG0LshYsNGO2LyuGohTGOKERme/8mly78GOhoX2EUW6UeATyh0BmINP010Jte/HD1hkqRye3j276CKj4BFjWWASTRSaF6ABAQVVCA2ICcaLbXARbOFjA7sIUyLwFuAYCOYAECLrhAzgARtcOEa
|
ICj2aaAziLhMExLhh7X7ag7UI6kWUrhtWWrhYhQoKOHREKDcM7obAX0ALcJIA7jWvQcP0AB+4JfG7w0iGIQPpe4sIGCyAKeS0sPWA7cNvGncKQ6+HR7h5cL7hqHTrhNcMkKdcLHhTcMnhEr1bh94OVhGQ2ch+RFPInHi9wAeAqAVQDbo/fw8CJGDqg+dRpu9LR648+ROwwUAU2F+2YqE8G7yfBj74HpwKKRMJueElw9hnnzhhHVgRhLMyRhYmxRh
|
||||||
|
|
||||||
FAAUyICKQRKCOIAOTUkypgWQRMCL4wcCMkyCCNwRccMBh3ANzBvAKnGJV3BhbPDThlVyWGmcPe+EAHQRQCKwRkmRwRRCLwRBCP9h0CMCAsCJrh8CMQRfCKoRKML++TcPRhCwSYEmgHiAy4APY2PxuYLrF7hwZVegJVjdavHSdgIDB6hcKAq+aqBbsnmDgEOfTHg6sFk6UEP+kgrCmhRoNLWJoPmh+AMWhW8PMuAsOvBe8PWhuXxTWW0KXkwG1RWT
|
NUPohdUIFBCH13yRrX0KQPxQi4XzCg2YNBuBSn8CxMLagTylSB6cLVBmcPEhuFGphkEVjG00MZhZon8ahjWKaFAEUyF6ABAJVVCA2IGaa+HUERbOFjACj0UyLwFuAAiOYAQiOnhO5AGcnCOWAgTRKafCJkRciOIA7jRERsiLERfGAkRUmSkR6iNvh/MMZurgKIempUPBRPzQGEsN4em8IFeEACURHABURPCKkyaiNMCsiOERUmXcR2IF0R5AAlek
|
||||||
|
|
||||||
12G+l8O6ec+nfgfqyRBEX3/kpzScKD2hDmmsNfh2sNChuFD1SVfQ1wfcwM+8EJjBZolSyA7RDoFbTQRB6H3A0BWvQez1oRI/V/uBYNThxYPThrCNhh7COyRhSLyRKgOPOj/zkR+RFqIy4E7Bn1XaAoAMlBhMO4MWkmbwyOEiQAMHZ+yIzqshoGeQlkBuQgW1B6r2QVALnmecDaxZh/Rw5hyFwcRpWwWhHVj5hvDx3hq0I8RwsNshosMWe+918Rop
|
iOkR3iOMRisLIBRGwoBCwR2qumWBmy4GBBn8IT+qUR8CLLHWGiFhKW3NAlieggAIVeEj0htCK6yUMw0PEXccXRVDUDAKI00CBC+9kAKWogOP+yCIoh7IL9hDQM2+f12qhD9yN+Q6wxhiHzzy20BmMpNzWBdv0SI433ucXpU5qdenPgyqzoRknAphVbyRe92hvqrBDYRG5RnBlsmAGT/Vrk8mkeWVmgAAhAM4lkTgMIBusjMeFsjnYsWIp+kMhTkY
|
||||||
|
|
||||||
hTgMxm62QSJy6TyH1KuD1Rekf3eau+DLSlAiChWsJoqOINc4NrCo8LyEeh6SJm+E3n/hgWWZAvbRO+q2zdYimUaywKIg6xSK3ePALKR9CJmGlSMvesgMu+bCLiUEKOUyM4BBR8pQbh0iIf+zcIxhBNVMy+02XA0wJ7hRr10EPgRZYe9UQs3i25oEsT0EABCrwkekNovnSUhmGh4i7jgKKoampB6QMlignyzg7izgB7HxMhKjzRWXDzcRu8Jck+8K
|
JF4fl5UkBsvDRYTBc+bsy8trrx97+ssivZGsjHZAcjSASo9ZXsJ9H4esAvcKeQRgLbgA8BQBlAOqoAQMuBbgNbg2BBuxlAA8AEKmUMXWLgJEClEANxC8EvOnts1IOTIduJaZ8dIaAS4IxASwKzRmKidxh+NpB4golMk2pKDCSuDx4SlDCYnqoCiweoDakb7Cbbg0iBAU0jMES0ir3jgin/jC8fuJ0juPjjCCnsL0FsAUIJQUNVfgvqBE4ZN9dWms
|
||||||
|
|
||||||
8Rm0KPhg31i+eBm2gFyMSuQrBAQDnjn0EA1uRESLr058ApWGsMS+byLk+HyKO8xzVYIRIIfuEAC36O/Vrk8mnWGVmgAAhAM5rUa/0D+vajMeE6j44aPDBkEMgToIbwNBrP9QYRUit1jT5UUbUi4lC6ivZHajHZB6jfvtYNmkQSjWkesAvcKeQRgLbgA8BQBlAOqoAQMuBbgNbg2BBuxlAA8BXyr4M1EbWI38lEANxC8ElOnVs1IOTIduJaZ8dIaA
|
Z5MPPMJ/hK5Y/il9jrsXd1gDhEFIP0Bg+MkBakrm99ggqYYwOxtg+LugjANbhSAOMBeNkCAHcBUAjAJeRnANI08lLI1nZvI09UjMjHao2J84S3sIkfkR1UYkktUXEi29i8EKzNrkehk7AO4GtCIALsZ+ZLiw8UXykTBP2CZliVIj7JKDRsPNRY6sec06G7CnfogjYYfLMUEZRCvHrodkYYHDUYa0j0YaHCmIeBU8DAvBukag8xZKRB7TJjB8Yr1D
|
||||||
|
|
||||||
S4IxASwKzQMKidxh+NpB4gjQs3mkOkwSuDwXinYjOTihdTQUUstkUtCdkStDCjkLDu7rKjD4ccjxYX5YlQCqjpPig4FsAUI4QQVVfgvqAlYbuYlBu9MXjNYVOOldDLHnI51fsa91gDhEFIP0Bg+MkBaklY99ggqYYwDBtg+LugjANbhSAOMAkNkCAHcBUAjAJeRnALQ0gPvRFRRnItmMvdpZgLTRGxIbDbbPZEmBNejEknejyUa1cgLDyt+cpRtd
|
13vPgsNNVg6ziqDWAfQj9gVnCjvFO5aaPc1TgfTd2ESRJQCngUNSiDs3WGOi+CnKVcPvPDb+geDXxlR9oLjR8vxky9wgT9M/kQCigUSCi3gGCiIUVCiYUXCj8AXjVeCuVkrSnBMZXuQDvkddD8iN8AF2peRXojGhxgHABHQMoACbLFZIdMCjONv6iWav6AIwanBhLj94PvAOgzviDcZsLiiJ3DTBy+GFwLlFhx/fKhBroJigM0YVDiIcVDnmq4cU
|
||||||
|
|
||||||
EXrATgfBA5GAqAW0dp0TBAGCF7uYiK5qNh5qA69bEasjjQbgDHEWaCJ0S4j2bu4Cy3rNdZ0Tl8q3kciigU+CfuJcMF4KujAkeO8BHIwo3nC/9vpmB8SlNhcT3Kej3kaGCoOFO5oMXYZooT48AUWaIiCiAVQUaOM1MSQVmSr9c4UWOtbnOT4DtgA8jtjv9IbjUj0ACmi00Rmis0W8Ac0XmiC0UWiS0Zf9VMcAVtMXGir5kCcWkdc4mBN8A2AMwBLy
|
bm48Koayi7bi3Ml/jp12kfgjRTA2Aa0TncEvl9EJQSigtIHsIpUTJgtHknC+0BNhohIvlyYTm85HKU80vtn0KAG8A/APCs0juvwMjkW0ZkQRx0IPMijCopC6/oO8XgRRokMVnAu/sGg9oWX8QpuZCmusX87gadDOnoPcLoT38q1rQMmBPQAeMXxiaFr+iVnoGiwbiWAOypV0rDukj/pDONQ4Cyl5IMSCurJKgZsA9A8oWmj9AShjtTkVCnfGON4n
|
||||||
|
|
||||||
K9EY0OMA4AI6BlAATZYrJDpM0XBsUMajcXgqnB3Lj94PvAOhUActcZsM2iJ3DTBy+GFwLlFhx/fKhABUZnBpoQZDV4Rn1ufhvCM/oCD9kXOiOMVq8eMWciUrFxMlfiyNYQbPoUUCz8FqG01clvg80EPJBx6vvUw8vD8Rvi0UZVhSjbHgwAKAG8A/AKcsTDuvwzDhqw5MSPxAQr8ilMb/CX5HFDSQW78egRRoCsY5BRgcGgiIaZtpeub9KIbHUKIU
|
k99yoYZ9/YUWiXJEHDS0SHDcEbF8l5J0jyGC1DcVBUU5wnjo4Ijvd7Pus9iYgN1YYGAxhoRnCe0Ywi3IiJjpoCn163jGsFkXdN3+qjwpNENpEtO5oPlhViqsS7IasezddwS4DdwULDAgeEZl0Rw9bkQy810XR8N4egB70cwBH0ZgBn0a+j30WIVyiF+jlAD+iido8ioZvVjPbI1iTQs1ipXiCNArvEDHwT8iJAPqi4AIaiHgMajTUeai1DlaibUX
|
||||||
|
|
||||||
djvXnyDfXnRDnppVCQ/gKD8iPQAJsVNiwFjFiK7v6BpQWuCI9rmVQumwcGUf9JtuHTBTmLi5k3GYjY4DTBmIA9BsoZrd2/g09OYSeC2Bj8DeYZOjt4dOisvmxjs/lnkfEc+CzkWq1GsRfDx3iz9PrnBFQvq/NfNkAwSAXLZpMcajZMZBiCOKcwLUYt8zpnP1UeFJohtIlp3NPMtmcaziXZOzj4bhw0aEYnCFvgZi/7kZi3ntusFxlcczMfutfMf5
|
aiEUQ6j7Iag1J3LHdVoJRpzcjiD4IPQQ/XrXhi2tMAfdh/ZlEg5ALBuSj1ZkSAP0gpdPvPQQhFrSjfMX31JgeRC2Qcyi+AT2tGgeyji0Vgjg4dyjgzryi5ZJ0jfgGRidgctZ2oTYMc+CtBdCjvdwSmdcKBJjknahL9FUexjjRiqiC3iBR2gGZJlAJ8BcAJKBM/iU468IooNcDjJoflNcturNCpMVXt9usSgvsfZAfsc0cDEK9B0WkDjB8hMBdoTc
|
||||||
|
|
||||||
jAscFjQseFjyiJFjlANFintp+90AHaiWcZ7YecSaE+cfB05LvGiEXs1dqoegBn0XABX0Q8B30Z+jv0UQc/0QBigMWWjnLM9M36pO5tbqtBKNDLkcMTmkeBrXhy+B0hmzh/ZlEg5B+Br2j17s8ZJGG2iSoNeEf7MOjDIaViEgaZDN4ZNdXEcxjIAaxi1oQciD4Zxj5ftxi5ZLxjfgPximsTCC3IcIMc+CtBhCqF84jmTiouHiwK+OOkDUYNimAeLM
|
CDoe09VogrkNovkQt0YCjgUaCjwUZCi3gNCjYUTeo1eprk+6ic0bNo6RcMOi0/2MVQmWt+ZzenV9Leoi1qvlZCvQVpjzoYq8HIZ6jrnEVU6cTKVGcYQjOMWiCcMIhAMWNDBX7o9iSYbG0TsCYIILPJBmKioYYYGdBHEBNNknKrZvMfzEwccyDHvk6cfYSe9cMWe8EcZyiawRncosQ1C/LCRBQwYKjiEWsDXYJGtSoAxiDmK5EI4DpBAKgqi8EpMj
|
||||||
|
|
||||||
1flyMNfgFV2gGZJlAJ8BcAJKADfiU5Y6OpdBUjQDP3J2MJCutinPr4duusSgg8fZAQ8c6sDEK9B8nsWB6CF5VcoS0CmWrpNYujT0XOhIBLMemjM0dmjc0fmi3gIWji0TeoPOrzk86js1P/o6RcMNbU/2MVQCusx0hep69o6pC1NFiVDOgeRDPDhVDAvndiTcQ+gO8YyVu8WfCL0XsCcMIhAMWNDBGwHNFkRrhjaopXMblNlF5IBhUVDDDAzoI4gG
|
8vpHURMXbBBKh6i8EjODWAD3QCAAM4e8avJZ4Vi950ZcsLEUujgVm/NQViT9+blXN6AAai+BgdiTUWaiLUadjbUSeiSJAPi+8XfCvkeLdb0Y2hzMsuAL0BegGJv0AgQJIBLyA8AAQBuwDgBuwXigHhcJrjEkUeTQ0QSxAgMco1BEschsUYIkskTEUOypO4bYZhoawH5QZqqpNV4AxA93JNANYO/BQcWhi/MX+9IcXP88MZc8dvtc988Tyj6wXyiS
|
||||||
|
|
||||||
QUKlyxtRj7EbRiNkU4iGMcnimMRADM/rU8QQfU8jHlxiTHnVilUb8AJQXtD8cYbcXqEWBGwLoj3Jl6DwkQ8iI4OBUg8q8j4kTJidYW5FacXbBv/j/Ch1i9CzRKwAe6AQABnNITV5DCiZ9j2MRInQj8wfM4l5mLjAHhLjgHjDDTcfQAX0agNLcR+iv0T+i7cYBjnMSRJ5CbISmkUbimwS3D8iFI1mAMuAL0BegIJv0AgQJIBLyA8AAQBuwDgBuxNi
|
MaMZ4sRLoXViKjmGsWBvsHWA6MbvcGMXcIYqCEEYru2Icsd2j87sqiejlxiJAMoBkGNbhcAC8At0LQIWcQo17tLapFkOJiroV6j1gMwTy2GwSOCaZiV3hQoqFEggNAk+94LN2MnscfABdJsRlGhSg8kZCIgCTJVNQEO569umiYCe7DxgQ99pLt7DsMcFis8RWCc8Yb8uUVsDZWJ0i+zkQiEsXOgy0ilgeDFcI5gHmN4isdwOouTim8QwixoTYCeC
|
||||||
|
|
||||||
gHhVEbjEK0eTQ9gSxAEsRCVBEschG0YIlmUdEjyOB/AO0SKlePlVUlaqvAGIHu5JoBrBQkbgSR0esj2UqKjjrheliCeAC41h4D08VVj2MfeCqCTniaCXnizkaMZnIatF5AhuihWFBDvsHhc/VhwTG7Gxwx6qqh9UX/88Evq8W8Z6dkkkwJlAMgxrcLgAXgFuhaBH3jBXHJjbVIshTfvBj8iBMTy2NMTZia9jn/h4EqFEggNAgvAJmGJjDxPt5mIC
|
fIDuikOiMXkYUZwWfDcOvlkBnOETUCkPin1uFdBYa+tQOuPicDpPjifn1jSfqOQD8UfiT8WfiL8Vfib8XfiH8Tx8t4RIBoiXtkPkVeiwkTejBCRIA+dj4BxgBUBbgMoBL1PgAjADAAKgNiB+CIQBJ7OIS0hv+iWqqMNbsX1Mh0AM1vgi7diZOzAFaGdhcMMNMgUDoVpRqbBEsGrYCirqcKkYahQoMWBCIahj9CSRDDCV7DcSqgiqISFiMERYSCMa
|
||||||
|
|
||||||
VY6YDrd1LgpMmvscgxnpqAh3DkD6zrHiSsQM9lHkUS/gQR9JUXsjpUZ4iasWCDW5g5CzkdGdz4bipipGWkUsDwYrhHMAsOq4VjuNeVYkYaiBCdTihCZ8i3kJYxbYAzjR+nKx7YeHDGkQVcSJKXD12mFlFCXN9BcXmC/FOoTXnmud3ntoS5AZUB1Ms4TXCUYB3CZ4TvCb4T/CbuhAiRYS3WISSikTYSmrnYTCUesBodj4BxgBUBbgMoBL1PgAjADA
|
3kiMTFiSMUCJtxkKj2IZRjccWygILIBUMqkhZOav1wHEE8AeRt4SJvM3iWMgESYrrn90Xmo0NypJi6jvzj7ODu5+EAsSpKB0BI1GoRViWJcRlp94DISmNFMbLi+7odDLga6CNMZX9bIUM95uvpj8iG8BTqrURJABQBhjBUBnABuwOAFQs7QHCDaiAHhlbv8kn8Sij3WnQQZaGChT6oIkdjFCUhvD/i4NJ1BjekSiNIBEIVhIEIsbrTlmoBUj3OjR
|
||||||
|
|
||||||
AKgNiB+CIQBJ7NsT4au9ikqtkM3cSkNt0sbBG0bBF0sQrQzsLhgMKju5+EGV1TYIlg1bGEUaTvZAlwXshMps8TZoXV8x0fXszIcjiU8aQTKsT8TM8fOjs8XQDc8aJxeMUCI8cc0TzHh+DS8WygILPvUnRkhZ3pv1wHEE8AkRoMSJvG/DtPvxxFiRrAh7piTx8a79J8fZxjScLdTSVJRmPiyorSYhcclplM18cadQnqRDzPpyD6gVRCv8Q0DOgasS
|
jZNmFxM0SoCYYQyiakVDjM8fwCkCTyCfHiICLiQ2Cq0WJ17CbgT5AvgS3PD+wuqAIQrhJUiu9gkQc+HKDviRuUlUW5s83rEdjCpoAAFtiAgksoAa7vaNXFqzjXUZsSofo4D5IUs8aiZAw3SR6SmtnrC2+Ec1P3gcQCwHpM8dEadPrOm1DevLQhRrgRmKo2tm8Aa02WL9jcwWrYFSShZ7vp7DMMcYTDiQWj0EYsdmkZYS88fyD0CYKDMCXqSS8W/t
|
||||||
|
|
||||||
zksNVaiJIAKAMMYKgM4AN2BwAQFnaA1gbUQA8Hjd/kiESq0da06CDLQwULKlBEjsZ7ikN44iXBpOoHz0O0RpAIhCsJAhJddkcs1BrSfJ0WfkRswuDNDZbnNCCCfRiXSYxjSiVhsZ0RnjqsdUSxdoujj4Yqij1JehC8S5D8eq0S3PD+wuqAIQrhEKjD0WlD7GC8ikDsFCz0cItZNpeiJ0LvNsQEEllAF7cwMSaiFsVkSbCisT7sWkRIKdBTgtgTC2
|
cYWsC90naChkdq0uwS2i7GKyhyMH/tO0YODaCcNcNQX2jZgP6TdQfn8EVDODmiC7gY0MuAGlAgMd2m6wZyXOSFyX5c50UzcF4epFkiXAC2eAgDp8fciiSSSSySRSSqSTSSpgHST2gAySmScfEogRAAVyfOTFyW01pXhtiHwSrDfQW9VCAJeQ6Yh9VybBdiA0ZIS5IEBidiNb5spNiiDUpBjq8IFAhRrMTjIE+9AhERg7QZSD8ydsSs0QYTiyaVCD
|
||||||
|
|
||||||
+Fs0ogQcQCwMaAR0tcTdjCq8ipvLRg6rgRVwSKlWxKYI2WKHi+UWrZDyXwdR0XRjx0WeSSiW4D3SdaDKiRjjopljjaCU+SL0AwSAkftDmCe55Y/hWZtUem9PQT0TnIqyhyMF49Eyb2VkyRBjq6ohSpvn8jowSpiSJM0QXcDGhlwA0oL+uaEzRNpTdKfpSZLrpjSkfpjykZSTRcdSTxcbuspcRtM3gK2T2yZ2Tuyb2SpgP2T2gIOThycfFJLugBjK
|
ifmjKwYWiTiWFiS0VYTgjo6sOkSRinoQaTcTLPpjwE4honv+UUsfKCbtGsVYIl6VG8T8TfCZTDW8dPUZsKc1+CS/IZwapkMCs0Q7qBzD+KXQVBKQ2gjkQADNyQujF4fAFggTci+ghkTYOvNiRKTuQxKZ3ZrSuti8VphdwkW7i3qhQBsQFXcviqKd6APdDbgCnA2ACMAhALgw9AL0SWSUsRdBKQg2EvTIXPFrQeSfp1aLJBTo6CnBiCLBjMNCKSqv
|
||||||
|
|
||||||
XpSDKfVcgBobiBSZg9myRIAMwJeQ6YmtVybI7iYjqlEl8AlidiNb5spI2jvIIkB2YNXhAoMHUjSZXBDiYEIiMG8COVvRTisQ6Sa/vV9EcVA1tkSjiviVeSuKTACKfrxT6iUqjmoSCStcrPpjwE4gsRs4Mi8D6CeirBF9SgNiJXEpT+8bTiDjN0sHqpkiSJLpk/8s0Q7qO/dZqSB15qQ2gvUbPthIvPsJASuckUX0E6SeKU/KRAAlqTuQVqZ3YTxi
|
DZ4JSZP0+EIxSb4Oc1NQPKTUKYqSiyUgjc0Uyi1SbDjGkXfcqyWcT6pjqSGyUep4gDwDyKeqljSeF9k4AakSSITCBkfxCuah55MYF4SBwZP8ybhYt6CV/D9gvgB4KuKcqgHeAuCS6jp6nsInyp3ihvrpTo2E1Ta3KQA6PJGT+iUVZvqOrAg2n9IzQFNt3Ked134DfAsMGMih+qc1JGFawpqYiEXdmC94EWudnfsqS4qaqScMeqTs8fhTEcRFjkcU
|
||||||
|
|
||||||
FSPMWoDjcfYShmhQBsQB7d9iiid6AA1DbgCnA2ACMAhALgw9AMqTRyUsRKUQPAIiRdFNaLOSOOrRZ0sXHRafgUCLlANw1ydV4KhluS+EANTh7pzB9SgxThXseSCiZsjWKRKjU8WQSK3rQdWXneTqCUs9TkUqiekYwTgyfG53yZfDk4BlSSSCdDwvg8ic0q2JLfIDJ+CcGCQKSNjUMcg4mBPgAXymicqgHeB5ibqlIMXsJ6ZMhSACbzSXgPzTSAHR
|
TcMCWjiSMbQdS8Q4SjML9Z7GNA4rhJPp6zo30dPNQTxDiNC2KVMijwFBwp3HCgbMSVjXzmViSJA+SGlJeR+gLcAZyQM5QaeDTIafFdtwaYi2sYkS0mk64J8dR9wNukSZ8RIAEAPpTDKcwBjKaZTzKZZTrKcwDl5HeSYaRDSoadvjr0bviQyRABQoM7gEAA7gXAACAT0O0AB2r9phMjMB4aZCN0ZrX0wYBrhb7HwkmIImSsMIkB2YFBTfPh7NZLq5
|
||||||
|
|
||||||
5MKaqSirN9R1YG60/pGaAR4RR9huu/Ab4FhgBiQ39dmpIwrWKrTEQgaDUgvaSjyY6TmKc6Sk8djSOKYLDryVUTKCYTTaicTTscUqi39uTSOqXOhfrPYxoHH6s3phEjo+lV8qcYu94KSLS4UL9jxCYZ9JCVpSdKXpTLyP0BbgNpSBnAFSGlHHSE6TpcWKkDCNqSDDk4dOMNCbZStCfZTSwRnDIqbdT7qcwBHqc9TXqe9TPqb/8TpAdTk6anTE6fyS
|
xCSjYJe8l+kMnnoS0KbsSMKQFj08SYSywWYSqoRyjqyagTaySjiLqaJxOkfCibia1DnNjjjSOPlhGwP/gxPt/Uw8URh/OnaTRIV9SW8dMiOqTqDZIZOSX5KCSB3uCSECLLTduPLTPiYrT5ng6D0SVZDVMXbj6vvcDGvlvUCvFCNLoXpinwesBnAG8BcGI6A4AM0QHgMQAGlGwAY0BUAekm8AyeG8B2gEQlbKTBNn8R0sJGIrYx8vCVzctijkyTIx
|
||||||
|
|
||||||
MHojVrqRIBQoM7gEAA7gXAACAT0O0BW2r9ohMjMB06UDtncUlU0YDeEVysKYOsIydPrFzQwadWdpgLlTQeq5wwSjYILgSGsiNMvCRUZjSraf8CcaR6SkdL8TbyYUCnaSciXaU+TS0UGSJdMXjQyaRx8sAhcCgU6MuCb5DObJVUREEHTj7iiTTUQ6QxsLBDR8QiosyY7tNsUMxV6UWMBCPGSEhhFQmIgdiTTmqNCoadiEGRiAzTnL0nfr/jg/mEAI
|
lCePoRfqftRUuUigyCkF58mcihkF8EqkQgj0KbFS7dvFSDqYlS2UclTdaalS2keWjMYSRjixjgSCWvG48qb0juEIm92FP+V2oNukEMiFBc8jQSJkZTirFvEi4UtgAN2I0kHcPoBfgMWM2qcJjp6hRw1lN1Tgyb1S0TmfSOtpfSF6cNSHKQ6QuIBLMTsGEVAOI3THVIJFJaZ0g0wcoY8kJ54EkOPAeDJ5i/sbA89vttTs0btSR6ftTTCYdTzCcdTc
|
||||||
|
|
||||||
qegBnAG8BcGI6A4AM0QHgMQAGlGwAY0BUAekm8AyeG8B2gEQlvqUeNQiQksJGIrZq8i8UZco2io2lgtZUqeB1LscSG/jawdsVigIrhWIW8r6jfUV8FhUXDi14WVjE8RVjOKZ6SbyQ7TT6b6S6if6SzkZ6MmiTfSWiS1jvjNwhlXiJi2mu1AwdvBkQoHwSgKUajVftJsFPtLMDHNgAN2I0kHcPoBfgJ6MhafNjIMRRw1lLBiUfFgyx5HYzIto4z1G
|
8frTfdudT6yZdSq0UUSbqa7lZ9K9AooYzBOTq5FSrkakZAQOTqqUNd0HvljXODMj76ZQjAafqCR0VOiSsm3CuGRJSAhmYigAX4p5nF1iV4ceDEAevDJYRIA06RnSs6TnS86QXSi6SXSy6WRcTpHeTQChUTXyffCmaoST1gNMBFfP0BJAJgBp7A4hbcOUQKgJoAvcBwApgHAAY0OL8RknZT10RrV14EMTMKLc0aGfOdPrHOEskWJgxwTpA4wajccL
|
||||||
|
|
||||||
XLTKUQ6QuIBrBl8V6ZwzG8UKPo6pBItlSl6ejcG/sWUffP1wurlR5ocZFdTaYxT8id8DCiY18aqW6SyiSxjO7ujjGqax1mqaoylUUET2qbiZZ9K9BJIYzBAUnuiB2GgkZsGHBhTJ/TmAd/SFse4z/Ap4y7OibDMsl7CBmWtTlCZtTirnHY86Re8aSYXToYcXTsGbgz8GYQziGaQzyGc0RKGasyaGQ+c66TVciCu5i/tp5jE0d5jNWlMBFfP0BJAJ
|
OlF/BIFSYEe/IpSaFTbmpzAvSgWTrdsPTQHqgytaegydaacThAcv90qfgzMqVbccqcKj7iXoYgoKdhxPhjMk7ulim7Gqh/2OfU2MSHsOMal9VUWiceAJkBLAEUCBMS/kXJtwTp6p+8yYY/Sl3nTTdNvUy+Bn5cGCQ5TJnpb4RWPJAeem5SQblAyUyZRpMkEypwEYhii4MesLUBtT4GVtSCwfSj2UurSsMWWScKRWSF/ilSUmYRjZ6SRSq0XUsiGR
|
||||||
|
|
||||||
gBp7A4hbcOUQKgJoAvcBwApgHAAY0LD8Rkj9TJcezV14BqTMKFEiUsZ9Y5wsyixMHiCdIIqCoaauSqvDZ5NyW81tyYjTTmsjSDyWVSzaRVSnSYrc96Z8SD6XIyj6V6S/iQ+CHrttClUazcqmWqkqaYJigoKdgXBiD9OoMCk1UP+xJbu0zm8ZYzekW3j8iExtMgJYBLATNjN8jJMFiZBiogZdDeme7Mk0ScceACyzUBjJcwKZSi1Hpb5ipgkhx4I2
|
RS3aOIZPamJ9O9qq9bjItVd8JoF96adRfib6S2mcqAOmWwygyaESzRKDSrqvwiveNdT7Lj8zZyfOS/mSRMldrETWsQkTPzkkShGWjSV0RjTINhujv5rozqJgYyjGT7xTGeYzLGdYzbGWTTtrr8zTyP8yIWdTSqibTTn6Qtd8AEhA2APEB+BqUDSAIp1skjABNAD9UYAKbTmSZXTWSUBZSEBhh/odHU77FwkoSkKNIKfucpabaT/GQNxRSdV4lhpK
|
||||||
|
|
||||||
jpWfhjAnEBpwKtb0Slvlii4K2sLUMbTSqVSc48a8S6/kjjzyexSCmWniimXbTuKd4j5UY6CzkWEt3adUy3aOIYNagUpiceJi5yPVVd8JoE2aadRRqVyzq6jyzJ9HyzpqW6xk6RNVQEV7w3aXxcjKTHSGlMGyfxnjsSSZnSA0UnDhcbnSqSZMy7KW8yZmeZj3xsczgJmcyLmT7xrmbcz7mY8znmcvJ66ZGzo2aGzdmaoCEahwUUKbsl8AEhA2APEA
|
SQqZBYwqZEzIqT5jYCeDiyIQk94mYjDjiZWSp6QczziUcziMVWiPrqKDOvCvTk7mC179uI4SqXH1E4Wo4lQITBS2tliPqbli6CY6SwwZ5tjCrgBaiCswA+BUBoFDfTW8WqRZ5pStOmQISKWcXgvWZoAfWVuCfce60kIJfZCCX7A8NCUZbMWoE/BLi4sKLRY1Cbucg4LRYPHH4ddCQgy1mUqSNmcWCNWWgitWXsydWSgS+QTgy6wXgzjaSRjOtmcz
|
||||||
|
|
||||||
0BjYDSAFR1skjABNAFtUYAFfSRyfQyxyUBZSEBhgBoeqBO3t45G0cHUF6SOlOkCiCG/tDSwWRuSF4URooWZBYkafuSMmWjTzaSeSWKSizLQWizbaQ1SKCQTSlGY+CVGdKJeMeNdoQVoyS8d8Z+XvLQGab15KMc6yPMITBH4WAwPWas9hsVodRsY7c36LUQVmAHwKgNAoXGW7QjBEBxzsHTl1KUbDGIW3S22P+zNAIBy6wWATrWkhBL7Mvi/YHhoR
|
tOC8pxUrTIN6WzVLPGStmBqyh+yc7TPqXli/CQVjA2dJB40VzjWntOSQWWDTkjl+D2WRzcQaVOz26gcBZ2ZCyBYSpUYWSjSdybS94AaIyDycizCDm8AqWfEAaWXSy+MIyzJAMyzWWXOyVGQSzF2TOzmiNey1sYjNRbukMtGSnTTWjABnAGwB2gP5CWPMRBrcNgAL0NY9fgF7h9bmMdH8Zyz7KWyTxulxYSSNJC3CbZiukJBTwIv/TKkRcoy0hEJ9
|
||||||
|
|
||||||
7nAStJHr134NOl9BPJTdafsRaLB44ZDlRjYcWsj8CRjTCCVjT96TbT3EfIz7aceyymeeyzkVFsbWa6DPaW9BxngmT0OrM9vlufdWUIRzE/nEj2aYITEkcIS1SFXNIdhHSMkZpTA2ZGz06gcBuwb2zjGhGyTKUpyVOXGyBccDDA0TnTrKSd8iwcijr3g5SN5m8AG2fEAm2S2y+MO2zJAJ2zu2apytmeriIAA3TDDlpzm6WjCrqUKSJAIptnAGwB2g
|
+mODDkJSDsXMCghluVZDeNEzCwSWzGUWWyjidrSA4Zgy9aTWy0mQ2yq0ciCzmblScmXdSg/ph4bmSgsviRJ8m7D/sjjJDA96U6yhycl9XWTGzrZusBAQbtUDgG8AIyk0yhMRxTqNohYz7D4MzgV0yw2RJzNAFJyZOf+Sazgki34AcRohG94Y8u6jeRvmVUKALoLGFs8hUhKy+HG2jNiZZsC2aszoYTFSc0SgzECUdSkdARSaybWzNxgazMqdStm2
|
||||||
|
|
||||||
HxCWPMRBrcNgAL0HQ9fgF7gqbmkdgif2zfqeOTfBBrh1DBRw5II2iukGDTwIjYVOiaD0y0hEIgkFljDkBytsXMCgsluVZDeKjScRhbTkWbIyD2YxyzWXKj7yQqiUjpAxXSi+SKaeujtGUZh2oKsJMPH1T5WrxzjhuB8BIOhBhOcNShiRzTv2VzT9gpMDuqgcA3gLaV2WXNjQOZBjeogKxxabByIANNzNALNz5ufFS3sX9SsKpM83vI7kYMdhzYQn
|
S2DSOBmym+h2z85sVjaARBxZke9TVQQfTB2exT3aQpzKig4Df/g29eKcCzVyY6BvgNwDd0JuC3gLcBTyP5ygWQuyMuVlzHQDlzPAXlyCuauzEadCy3AWPi4WSkT0aVPjMaYeSdGZ+zv2b+yIIgBygOQcAQOWBz18cuSp2Zlzsublz8uYVyn2ehchPuSzV0oQtPgKiot0NYlbgBCCK3MWAQyuUQ/eAUCK6beMq6dyz3sbdjRmVBxSENiifbs3TTmL
|
||||||
|
|
||||||
4I+KAfADkCuTZQTYJPMGKcnibkSdWfEC3ibkzXSSQSjWbjToAUez7QRazASUqiAVhxzjdMVJPHGKhf0hAMXIpm8IOKrUdaSJzESWJzkSRJzUSf+tELMkcnoaotRzkGzvgCADd0LWC3gLcBTyADzw2dHSTKY6AseY6AceQIC8eQTztOTmCySaoSKSeMyU2dIDjOaZii6ZmzfOf5zAuRBEQuWFyDgBFyoudyT1gJjzsebjz8eYTzZLg1c8UY2DwqXW
|
i555uhz/KUEzxSSEyZJGEz5WREy5ScrToqTtTSOSqS3ORgyPOSdTCKbWCfOZcSq0a2szaQriTWSxzBVHQ1oHNXjcKHxDtHrcZdcp44+2VVSKcZUyqcQMyacRABLyL8AZvKXdTyIntvSSOTfqS4z1AjxS7KB+SZzJjzHQNjy8WajzuWX9BJ6hrRAfLk9bMWftcpFDdImWpBwEVrV4ihXwZWV5jnuYWTXuSVDNmaWTsKfUjEmVRyvuVgzaOfqz/uZl
|
||||||
|
|
||||||
z0AMuBPgKiot0NYlbgAsCK3MWBLSuUQ/eOYC6GcOMGGYOzO3m7jesVBxSEI2j9kJwyjjPIojhiCz0ov4JwWUuz35CuzblDCz12Y9yXic9y9WdVS3uReSSTngM8aXaCmqb9zcWU+Tw1tfSnOpTSOuYKogcJHojhk6N6Uc+zbjILlPHCNyP2UNjbNpzSEqXClLyL8AZvM7dTyJrs4KTTjq6qWAN4AiYoOXBjZeRAAs+TnzlAHnzlSRb1sKRRN+Xvah
|
SGNkDziGXOgFVuqM5KiSshDPWcJLLbA3GYjyfCXFzvqf4Tp6uygNcMTzJOJOzVyRnEs4v0A3gJ8A7wWS91gKDTzeV7wreTbyEaZJT+GVuTBGZR94Wd1jV0UiybEdBtlwHNzyiAtzcAEtz8ACtzXcH7wNuU2yb2fNj7eVPFLedbzo2Uo9NKXTttKdUSw2QWg3yEHzcGBwB6AJoAXgGux34WwBHQMxtTWNpzSiZByHGbpyRSRrhohNGYVeWMTTojtA
|
||||||
|
|
||||||
aqIY9vgp9ZMWMb4gNPagMWMqBp4ZzVXChXw4aQ9yKOTRj0adkzd6dVyGORiyFGcxzA+STSnyaBtQ+ZxyjMKStaRvoy+OeIxGmbb1yjLbAu3g3iRqQkiboUtyi+eStGLmXyp9liTk6Uc8veG8BPgFmD8SQpyTKdfz+gLfz7+RnSdOVnS9OUmyDORv8IYTICTOWzz91vLzFecrzVeRUB1eX7wteexynORWCheZGzn+a/ykOfrjJeaFSW6bWyACQWg3
|
XkGyJmcgphhSYEzrPDdzr/ndy5WbcpHuRFS+eTEyXOXEyPuUkzqOdPSy0QXiw4ZWjMqRGSsmXgTQebhQAhIRYG+ShMHPGkDeorGjKBE8z4XnMUj6QBSxORIBsQLcALkpeRPgO0Br6Xjze0QTyiSowpjeRsxtGcfzT+fQBz+ZfzeidmNoybYg++AOh0MI9ioCRhhHtrRjZsM5jIRCu4tiBaBzeDzy4GXmDC2U5yBeRhjMKZQ1tmaLzx6RqShAdWzt
|
||||||
|
|
||||||
yOUQt0LgwOAPQBNAC8A12F3C2AI6AINqaxduf5FYuemyUtlzBJydEJozOvylQfcU2aMyjxsGsZKjNlzQWbbzF2W38ZJI7zdyfs1NQHCztWW7zuYWeD9WWxSzuvuyp+cXoZ+T9yGuZaylURhSCWW+SI+bhQAhIRZGBSDsIefHzTeL1FCMYBSgwZ6zxuYa9JuXClsQLcALkpeRPgO0BnGQXzOmZBjBUowo1ud5z0ABYKrBTYKAmQyz5aeUdDiSrUlk
|
SdLzdSZlSk+Uh9gfuF8P7rg5Zno91B/txy5yOaA+hsQgKmfnd8eTMi7+f3Tx2QXD0ufOTyiLcAA8ObzoaVOy2BRwLM4tVzXeUjSN2fVzPeY1yEWc1zfeeIzbEegBM+eURs+bnz8+YXz7WCXy2AGXy+JOTTuBewLOBaSyuDlti98RIBaiBrDnAP0B4gL9oXcFqBTyAcBmiLSzNABQB2gP6CtuciioObtziZBrgU4ORpYPmBjPrFhQskbQpJAfXhKe
|
||||||
|
|
||||||
G95i4I2jd0fKyaYGwsCqkaSV3FsQLQObwh+WHiKASPy8CWPzTwVVSGZnkz3uZeS0caaySmZji5+RfTx2OGdWuR7T+OGqB91D1TvZkjldBfzJ/pLrBDBaJzjBeJyj+amTHBanBxGWjyL+XwDk6eURbgAHgjnknTI2d0LehZnEaeQnDdOYmyrKYzybKamyC6dQK9lin9BxOURsBbgL8BYQKKAMQLSBWwByBXxIy2SZTBhX0KPOTIivOQKz0ALUQsYc
|
pKyAqd3zKQfdz++bKTB+XAK6UcWzBeaWyx+eLzi9JLysBdPyK0YwC0iEehMcbcSjSUvz7hANxdhJDySpM2jSqYHBeor/yaBcU8ROdUy0eaeQnrrgxPgOUQeANsB/WQlykggNwvaSpzQ2TNyn4TUK6hQ0KP+S9DRqZ8giSlmYYbrBCvBYhjQtqeJgoJ3BKeseZ/0s4SRGP1VkKUnjEXCnjSIWnitmSLyWUWLzQsRLyaOUkK6yXgiZeeOx4gH5co4a
|
||||||
|
|
||||||
4B+gPEBftC7gtQKeQDgM0Rm2ZoAKAO0AhQTrzK0XFz9ecTJEuY/C3Wlwl7ilhRWBS8gCvvXhOBTbzrPDwKOVvwK12UIKN2RVzt2ZbTJ+VKjp+Uxz5BUTTz6XxSChdHshKa+TeFkSyRKZJABuLsJuiTLh2YVUKHSBWY3vLSy5dvSzkOb+z0AKeRBrrgxPgOUQeANsAQOc0Lq6sYhZ2eu8pqR5tDmesB6RWwBGRcyLdoa3ifBXRA/kO5dtjK1AXVD1
|
2lKKWqQ7PnyBHut4NhkcVZeSGUKGGUOymGdPVjEOKzlOcOjgaYNzVyS8BDXgcBnefOzvhfOTfhQ7h/hXgKNyW7zpKduSGubuSvhlic92X7yfpgYKt0EYKTBb8AzBb8ALBVYLbcDYK7BY+zIJhIBQaSCKwReoytKWLcEgdtjBsc0Qi3kCAt0Nbg4AOUR9AKYyL0DABvgCqpWgPkCbyXYzK+Z3YjmrBEOSW4LYScVBsUUJcZGKmST8NE9LuZ3yxSVf
|
||||||
|
|
||||||
DPrALVBIvqTgoJ3BZkRRNJrAhZOkBCz4hYaDXeeVSuYZVScmeeCveYazMhZ4Dshd9yA+QoK/uU+SZLtLC0QmqRuYKjYIBgeidUcVZeSJSKh/k0KjwAtjORf/SN3sbD1OXpSXgMS8DgG/y1OcTzAxcGLQxdPtSSWMKhcRMLT9r/ymEf/zWeRmz91qcKt0OcLLhb8Brhb8BbhfcLbcI8LnhY5zS2TVdk6UGKHcCGKkBRLzzqXszLqYKTjheQ9miAW8
|
8QhX3yZSeFSomVFT+eUgy3uXtS4hTsKEhXsLUmdgKMqccLwOQvyshZbTf8IHBOcpVT1+WF9aAZEhKNJKjHhbds6qcfSvNjugeAL+yCDE0KfqfQKtjHTDvaSTyn+egAt0M6LXRX0L9YS1UblG45WRGTEBIvITtnsb5vKTvhlUFmzWykfZ6oqFBdhNhDE8UPySOTEKyORqK8KbsLJ+ZFiDhdFicBccKmyfgKy8Waz3PMkJT3LcLtWim16ziaAskPhw
|
||||||
|
|
||||||
gQFuhrcHAByiPoBrmRegYAN8AVVK0AzAT5SXmVQLO7Fs1dSV8LyNCx9ZRTBdOGaRST8FiNreTDS7ebwKKxJCLnedCKdRQiy9RUiyefgiLviUiK6uQujURUujA5vEBouSoKcRWoL7hE2cp4ODyfIcrDeQJEhivkNSU+U3iqRY+iaRdzT8iFugd0DwBAuQQY2RV6LHBVsZlsXBD/kVEcGxd+LJAL+L4gECBNmaMSUOS0h5aM8hYNLwymBRx02UMb4V
|
BOTFznma7S/ia8KvRQ/y6QkSKLbsuA8uRuxH2ZOi7eVOypEf6CBxY+yIRYIK6uYuiYRduy9ybuyWufuzNot8BqRcwBaRfSLGRcyLWReyLORQNyRxT8K+xROLSRanzyRboK6afdDCAJIBEkgREN2CMBmANzSpgBUBLUbgweAJnSHBTtzHGS4LiYIJAWRPHDbMTJVPKWmS03gEKruV3zZRSkFQhQqLFWZmL1mdmL3ucwt6gdsK8xVqKCxWdS62YcKS
|
||||||
|
|
||||||
3jvhlUOyjZbJxAS4AX9Jnk+ytRSbSNxZkyqOePyaObuzLwXVSshYez8aSiKz6ceKvBs1zBKZbdhKU1sWJhrBT3M6L03t/D8HiaAskPhxTGUYLP2bIMxqRyLgJZiTOhZGyEEUKC8eRuxixWCi4BSZS5JcuAFJcWLzKXTz4UWoTJhYZy/+SzzaSWGj0AN8AmxcwAWxW2KOxV2KexX2KBxYLyJAGWLmbupLbgIpKq2QmjZEXyL26VGhJAIkkCIhuwRg
|
xWkK2zoaKQecaK1RuXxiCVxyLRdDzGMRA4i4I6QimSxT7SYfTC7ofzE/vkRsQEYBWgJIBdwEIAuxO6L9eW4Ls8t6L2hcnTKRRAAmJSxK2JYDy3WVGTQxYhjdcnyxlJkV0v8f89zOfNSMcmnQN1jvAiMBYda3sszYBY5yohc5zkGaPzEJVD1KOZqKoXIkKdRckK56VWjlGeWLbqUAx7TJKiEeevy6KezsJwRhQO0f2znWcOSb+fQKeJd2LL5r2L7B
|
||||||
|
|
||||||
MwBh6VMAKgL+jcGDwB8Ga8K9ee8zPhcTBBICyIFYX9iNIK+IS4NHQIaSuTQReuTW/hCKEaauy1xSjT4WeRLkhQjiDRRILraR9zD6bILkRRaKjxQ+SmuRsB4gMGdzxdey76b/gIccxBy+Pcj7nDoL8HnsTHSAbdYeY3iF3hocRiWKyxsdiAjAK0BJALuAhAF2IAJUkjHBQHkQJQAyqoetzxpZNLppSHzvBeKz8sYLk+WAoNfOjESEkOdyYhZO4NHk
|
RzD/JZOK54VJTR8bOKRBbCLEdmIyHxhIz0AJeLrxf0BbxfeLHxc+KjXm+KlwgSL0AEFKTxS+z4FvAkDHLURnAMcF0+jwAHcGa03gA8AgdO0ALKc4BKmKczuRdtyuWV+KEIMLFg2gT1PBVFDu4HTA0CJ/YkIB3ypWcEye+RWIoJQqynuZELVhXsSSyVhS6kVsK0Be5zUJbqy0qbqL0mccKeac2TMhXhLxQS8odiDnxQufc5cwPbTtjFNBWWHaLaqR
|
||||||
|
|
||||||
aTtIURgWDvqCSqUViRBbqL4ccZCJ+bAtjRT7z0ZjKisWTUTlGc7T0RWkRm2UULbWYfg32bujhOSDsnWfg9P0hhQ8HgiTBpYP9k2p6L5pRyLFpdJKAxQ0o1Jf0LVJU5KRhWNtYxeSTDMfpKkxYZLpmWONZmRAAGoYQAfJf0A/JQFKgpSFKSXuFKlwvuMHJbJLMZQcL8UR5KV0kwJaiM4Bjgr8BHQDwAHcFq03gA8AgdO0A3qc4BKmNayhxbryB2dF
|
ULqcUfz0AAcAY0LugpgLbh2gPoAArJxKCsYkFlkGQKPhSESOhc/QmBNdLbpfdLHpcGLxJaNSLQD/TAHIBlKdOkiooQhAWeX3ByOC6phpr+wfvKL5d1s7CMxeNKVWanijCdNLocUhK5pZ9yFpZgKzJUWLC8aL9NAPEA7rvLzzmb/gy4MQR6YDcKOOd2SMkG1MAjoDJd+SD8C2vFyPRa9K7tIf1AyQzCvhQeLgRdytbgG8BCGUVygRQ0opERDTRZfw
|
||||||
|
|
||||||
KEIMLF3Wj90fmZJDu4HTA0CJ/YkIOlLFxeCKi+jlKneXuT1xYkK8iRRKUhSVLPeQaypBfRzERZVKDxT6TT2d9KWqU+SR6ViK2ua2xcRZxKWXGlU6kBANtVpm8rcp6lWWO6Kv2aYKM+QY4DgDGhd0FMBbcO0B9AAFY5pcITEgsshKhSPi/RTBzXBRAAw5RHKo5THK6+a1CFaaM9d0p6lQupToGUZJCPmmHB4iZUtfqB/Zf2D95RfEsjNWbdL+Yk9y
|
K+GdOLzEeFLYAfOK4RVw8ERZILoNoVLipY6BSpeVLKpcQBqpSMBapZr99xYSLRxcLKZZdoK0+dNzvpajt6AP0BLqqQBcGEIA2AC8Bd0KeQXgMexCIvJ1PgEmUIOY1KnBY4zWqLjgzBiigd/si4QEJBjZWsQRJ3PIs1YBUi/UFWUdaikERoN18QCejKdiehjSekgLpligLZpaJttWckzCZYczzJcczMqVyLrJYaTNpW6stFtvhFQN5THusqA8xmb5
|
||||||
|
|
||||||
xBakLnEZILgRq9KrLpiyT6SxzZWLxjerkvygeapgy4MQQFWiTj+JdXjX2PJ0FbEoNRuUmTD+e/DAJQnK7tPp8VsRIT/ReGLUZQitbgG8BKmWGLH+YGLt5bvKsZetSE2XGKEUQmKQ0SZijJbv82kdzLmiLzL+ZYLLhZcQBRZSMBxZfj97Jf5TmZfHTj5azLpea3S05Reh6AP0BxqqQBcGEIA2AC8Bd0KeQXgMexCIhR1PgO6UYudLL3he8zWqLjhe
|
4ijvzBObFyXWbqjROQxK1UQcAHgLgx8AM3UAttfzGGaOSQFNcKQ2fxK9BegBJAL3L+5YPLAZSNT1jlaAWpQDAc8kd9KkZGiBIsb4jiEOhY8rTcE0dhgbjsFAbNuywvvuxcSNBjK1hVjLkBZsKYcfnLK2YXLeQfsLDafWzpRJ0jT7pTKW2XOgOqkWBX4FayZcAZ1v6pzASMF1VTpah8R5QTyx5bxLPhd8zR0d8AveEHgGlMuzmiBegGlKNyquRzDM
|
||||||
|
|
||||||
BiigQ1rsZbkOljBWsQRJ3ASM1YNaS/UPGVuaikERoCkTOdIbLm5fqKnpa4CLZeVL0WdbKchTxS8hT9KJ0PEBBxexLsRc1L+Fnytt8IqAV3t7KpKU0yQeGb5XCnUK4eQ0K5PiNLe4XClJAAcAHgLgx8AMnVVNvYLEeT/SQFM6N/WbyKOZQl1lFaor1FTnK+kUVYrQHLKAYIHlyoCb8S5QJFO+WwLMcl9dsucX18IcFBP/uywx3oBcV4fdKpGQnixU
|
uQgr5ycgrUFegrxuVOLauQrKZKUrKrER9M1ZTFKpBRAAL0HbKHZU7KXZW7KPZbgAvZUCAfZSbL0AFgr+gIgrcFWgqKuWNycpVNyKRVPKkdoMYrRiaihAM0QDgPL8YAH0kHgNIARgP0AFvg1LHBVXzhtl1Q38RdFNaMHj4LD/jbfLJt2eaBLpRdKygqTAKRpQPylRcqyM5XASIceqzcxQXKJ+YtKZ6SXLfOccLdYbhLl6dkKVlOaQ97tq1hZuztX7
|
||||||
|
|
||||||
cUSypSaKKibVy2FeazLRUHyChQ3dB5UDEXlP5IA2nvzZujHyIkWyiSMBlVA5eJLvWSu9MororZOWBKN5W6xSeV7wg8A0plOc0QL0A0pRedTz37kUr+gCUqylRUqqleLytJTjL6eXjLExbf0LjjfLTOTftgFaAqTshAqoFTAq4FbgAEFUCAkFV/KIALUr6ld2DGlZTyxeW5LbCTLyACfoBBjAKMP0UIBmiAcBUfjAA+kg8BpACMB+gPF8pZW8LqBd
|
jzZpRmAr0IudLqed3LDAmTYA8NgAHcDMAfIs9KXhd5TBDDzoJ5b6L32egBd0JErolbEqF5YMym8MIgjYsIhonpGiLBCmTTiPEUffL9RPsdtwY1AzIr9u9LIYenKVaZnL/MbEKDJbSNVTtyCMBU/KiZS/LMJXqK0hVC4ekZWLOpfeV7TDcLGBrcz/5PKskoE5LteaxTdeW7SuZd5Sx0rtM+ZTD8pyXjVTyDGgXcLwq9bvwrMFVsqdlfgrZZc+t5ZQ
|
||||||
|
|
||||||
hTiyorZsMORYvcfBY4ibb4iNmpBNZQuyspTrKWoHrLBBflK7pZuKHpevCZGc9KmFcEqTWfRL/eaUyOFQ7KChfjCmpZ143ZXysVlOaRklem9iZvg8YCTzYyuhkqSQeny9uWNjd0GTYA8NgAHcDMAfInHKkefeE68JNSZRuBLPJegAcVa0A8VQSqjAYEyUOU3hhEEbFhEFiNcFRYJ5WacRXCj74q5XQx9iEpgIcfTI29uRy2XjvSqJbuL6qaErzRaC
|
IzyfKILveYizVFRCsPpqIr8+tbgJFVIq4ADIrWjPIrFFewqIAFdVtlbsrKueNyNKc+zBFeeKw2coAeALUQ4AP0YxAOuRNAPoAaScZJlAP7wtAB+Kmpbpyg5cwNFBo5T5CVPBsNC8hCqM85YGf4zf5S1BWxBpKQhYThYYKmiGAcRy4JYgKhedjKEqffKmgVWzulcXLiZTPzUhROhkFBkLzaYvz8JYsCJ4GCg9pX/JGILlNf5fDl3hdRKXacjyD+Tp
|
||||||
|
|
||||||
qIlfPyChVC5LkeO8ebCuV7TE6KX6feLf6CSskoGDLoZQfzGhYvKEZSu9hbAGdFJjyKo6YUrTyDGgXcJUr5ldUqH+esAJqtarbVZTcFlcMy2LrjKRcfjLOled9ulYAKNpqsqKgOsrrcJsrtlXABdla0YDlUcrJlU6qbVU0rFlWFTAFQ2LlADwBaiHAB+jGIB1yJoB9AL2TjJMoB/eFoBIpTLLUomRs3cTDA91Lyi0JYLEeiqwLCqM85iJQ38iwECg
|
y4UtbhfgPgxWgDgBWqcPLnhaPL5yIdsmBa7jOhWT8FVaQAlVS+AclWyTWKpjA/eofdpqYLFILGmyzsH+wE4GAyGRLhw9ZkC1S1kNLIPtpKJpWrTWlXUDDJchL7FfmLHFVPy2VSkLOkZYFyKV/Lf8GTJlktMLRvgrBnuvqBS2m95glRzK9eS9LvKRqroFZ9K0uSRJ/hf6CH2UgqvwXgq+FRgrbeRIAc1cuA81TwrjlbwzTlUQrzlajTLlSIyesdFL
|
||||||
|
|
||||||
eitXNjaa4rCICeYtNpWryufwc4RVVz/lR3Kfzr7yvuQxLqpUxLapbxjO7FezoVZeKN4MuVfghAMxCd1izoKtAavvvyxubbdz0aKKxiVd8/pqQBWgDgBBaZor4ZfHKV3vORGtu0LYvN4zrcHuqD1S+BTFVhSkqm/B5kW18pct1K2+Tl1jIALozsH+wE4JqCOUQQhjTGws3VsuKN7o3LEXHQrtxeViB1TgMKpVC45BWOqvpWiLwVb9LLAlUzl+Vb1s
|
blUwSwVRCqPqNCrYVf7gLCoiqP5cUT7EWWqK1QWrflfsqmTkrCd8UIq6aQgBnAF7g4AJ8BSSdYVXxVGV2gC7hNALugTbikdkVQHLdOX+E9tsMTzcuMz4IHFM/YFoT6aNJRKlYtwDpZKT8IEHSBCCHTY1LBLohbSqvVTr9NWUZKUJSZLtRayrelcWL+lZyq5PpTLmOXyrjTqwMksPjEuyUULTmNXhiCUmra/jKqzMWjybRhuxHQDMAfwLU9VVZzKu
|
||||||
|
|
||||||
iZZ5GmUSBTEfg9sYI/CKRS/D4ecHTC+WeqRWEtKU5S/I+ASGKhQc0Q9KQ0qXVVTzxecpKJALRrlwPRrSlbMqmNW6rqEbTzWlTpKGeZfLDtr3QABamKNpimq01RmqWHkYBs1bmq5CgWrolR+9YBWxrlwHRqGNdxr41f/L9mezLn6EwIEAM4AvcHABPgG2TFCmFL7Su0AXcJoBd0PTcjDkWq0FSWrRrBqSspkOh1YScTBYhZM/YPcT6aNJQ+VdzsfZ
|
JTJUTsG0KYFV9K8bEhqUNWhqjVTTy2yoshHtpKD4gpaZUYtvLvGQH9JRXQxlihOtxoJBFHsGfKB6Ygyh6SPzWQXYqH5Q4qi5XqznFUcK0hUoqK5VTKCJTTBUUPkLI8fWcSIHUgXwrBqUWs0KiqKKxfJV+dQaQcARZX7wApSWqspVOzNNW8BtNcFLh8aFK1KhcrIpfuSlxYiLv5tOrZ1fOrJAIuqeAMurV1eur10ONzMpfeT9NVpryiDpqQkZ8iaa
|
||||||
|
|
||||||
ZCz8IOAyElR95FQT2qmKX2qdxTBq4ztU9TRcCq7wYoze5RLCzkbB9Q+YSzLxQuRIkElh8YmIq1HKcxq8Flz11fPLN1aBSFFQY4hRhuxHQDMAfwC49j1YarT1UlKTsL6LzVRk805RVqqtTVqH1WKKLothpjYBzQbBEuqP1RdFO+QCzY3vOK6GJ0Us1mCkEijYjh+WKrJGfHiXuYaLzZYOqO7sOrimTKrchXKr8hb9LjlbwrQScPLyjHBoYeU6MH2Z
|
ZOqw2diA3gHdLlwDwAt0N8UwlQkiqUgylkhOtBZaBaqPGa1RVknVZ8XGOCMyQnidDI+rdJWqLXOW0rRBvNLP1WhLrCY1CSMUNSw1YFzD8EcgTwJQKLSf/LgFF698OK3LWxXvz9hr6TA2aPk/FUCSyvgLKJAHTxdNRAB+tS7y5ZbWr3eek0yFe5drNXEMjOB5qhtc+SU+blKsLmGyZgJiAWBDMBBxfuhiAJoAyMlABrcAvA11eVreaVdiWqne9ISB
|
||||||
|
|
||||||
qqfgieBZagvARJfUKxJS0Ml5U8g36c1qKVQUqVJQxqd5X7wXhe/dk6QcAPteUQvtXxrRhZ/zxhRfKTjhMzmeVMzZhSA8MAIZrjNaZrcGOZqvcJZrrNbZrxeYzLv5SZTftW8BPtcWKzqbdNq2XYN4EgY5sQG8BI5cuAeAFugf7uoitmlSkGUskJ1oLLQ1ab8zWqKsk6rPi48QRRSvFRIzKOUVLHpRKrotdNdYtSEr9xWEr6uTVLGubxjZaehqh5Yf
|
RoQ0UETG+Sw1EwaQgVZrW8iWJT0Slg1gICaBxZot4d6EJzYxhnoCXXtUj1RflrBzuc8mVY/KtST0rcGX0qVpWkLuuutKeVWKDq5dGotpvXKd7ghz6KSKoKkbXB95ZKqB2bQKvJW0yf9gSqPpcCSJMbziwSe18BcRxAPEIQT4cq9rpaRNQPtfOsFEgpiS/j3d0zmEtMSZvVVMW7kbIXHTtMc7ik6akqBJcQBSYNbgKgOUQXcJSSXgMQAjAC8BfgLu
|
||||||
|
|
||||||
gjkCeBzQESLRgGdrpKYsk41PhxpFTDL1Dh0ytFWByyIOlRkZSRI6eA6qJAEbr3+fxrgdefLdJYxJGET6qUUbfK0UWaJTdcFT8de5KjhVSqIADMBMQCwIZgIpL90MQBNAKRkoANbgF4NZqpdaPTgfuH1lEpCQKNJhjCiu5rPrGg1wYJtcksDIwAnKuCPEMvjXsqBxZokrV/4JzZKlizDwtVkyTZQwqifjRLpBVbL4NVVLZVeLrFBU+TUus7LNGSGS
|
E3gBwA4AM4A+1bRF7GbyK+Jl3lyNOaBFbANVfWp9Zy+I2whbNlI/2ImLhpK45b1cdKohPjqiNDxE6dWB9Z+tlqEBVnK6VTfKZpXfKOlezNwsT9y0CT+qSZbN94gHizjWR4rgNWblz6m7UGZX/J3hZzUrQGXw1kopqNpv4SR2TdBeZSlzSsapydVRIBiAK0AXgA4UyANjDKhdyyRGOfsYPuxkHJbsYtJP4g4cEMCLIEmCACZCJEMe38F4OqATiHus
|
||||||
|
|
||||||
BFdGpW+nXBldTLhoSbk8eirXAfNgNL9VQjyT1SSquqJ188lRpTeykAyEYGSDHOHEEToJkTs9fEySqPQh89cDYE3jAy8oedi/HgacyIdyD2gd/jyoeOCxiib1WtQ2LiAKTBrcBUByiC7guyS8BiAEYAXgL8Bdwm8AOAHABnAEpraIq8yRxWhNxbj3x9QKrVyjBOzV4DEKUKHVsVWqD0O+cFqi8mhlKFclRCICvqFEsIKm5aIL6FfzrGFatqhdUCrp
|
b/j9rB6arTYmTxr/tT9dAdfDj+NSyrBNUGqLJZlTJXmcKhWCrN+CCIhCYRMq+oT2xKinsIWxV2j25Z5KIFcwy5gAL8UlSbyzRIQCYiRzDt9eUTq1fET12TOKSFUECjwT1i14ZQqIgRTU7yXvrPMgIrNse+S/RVtEvcHLsTABwByiFlyYAPQBalsoBHQFugAwUCA5SqFDuWVNSUYAEJ+KihRRha6phsG1Ah3DHkjiBmSKdebwqFAAL4mAUV/4J9ql
|
||||||
|
|
||||||
VaOqa9eOqJdWciS2dOrw+Tezf8NzU1aiPwGmVh0p4MS12xC+Khpdrqh9XqCJUqhBp0i4LT9a0AXgGoUyACKL4JYOyRGENYPFfTrhOURS1Ao2wk4F6Yh2XTC6GPliY3qyI2vmdAudUXrjZcVLS9eKi6OcwqauSLrNtewrttZwrmuQn9bRShljRvwQP6ZXiNVSrq/IfEU9hDdqZFXdrm+g9q77O5ZIOWvLI6a9qv3vO02ssv9g4ekAT5SMzs6d/zEU
|
lssLdvB6qO9QgSu9dPskqZ0r9mQJqlpUJqsJZyrSaQHro/tkKi6o3rdpRaSINTDz/5KKgoGeaLMdR5KnhZhrU1Zk5uIWpqeca18+caTr7OE9rwCVTrUDZlQbdV9qQbPO80SWmdnQYmdsSS28OdaHMS9niTq/ujM+dWEBSeRIAlTnBUp6K8ADgAJsXgGIBlACElpTBwBSaVXYVdYvK6IIhZJ6tiJOco7VsUXKB5QLcpMkAEcQ1MpKrjnhRoUKSifA
|
||||||
|
|
||||||
VfLImv6qtzkZx0dbVd32h4btNXWLlletzrcF7gsdiYAOAOUQseTAB6AKEtlAI6At0MKCgQMyURIYOzVaSjAAhBKkUKFOK8otDArGHupOqJIahFBnrzeFQpsifEzF4eXZl9WycFEuBrdvJBrKuVFq0DbBqWFVXqbZbViUNVwra6ftqm9TJ9iDTjk+DL7AQZRqUCzpPLWGdKz4Sf3qN1YPr6tSSrSViRhMyQG8NsTmSECN4sGsPPqGjSHUOIHnrWja
|
v3lgqddBp6i6rsDbmVcDdxr8Dd6r2lUxdiDcyqQdd+qwdb+qIdZyrsgYBrsmcBqfEFs9VoK4TTrpMrUbKFBSpLHrQxijz6qXClTyE8A+krgxaiGUN4laOSgfOygH+Tob0ABUaCJoQkajSRqNapZ4celho+KDbTPBS85ZEHDgnhGMNvXktS/0k31BHEsL7daqL4JX9rojQVr8ZUVqA1YWLvdeyrOkSKDmwdHDZUjAJZlRjM8jX1CfKYEgG8WzKaqe
|
||||||
|
|
||||||
6h/PhZ9WQRvjqyU0CioWdjLdhdj3Dh0CD9R2xbsZgyK+YSdnylPRXgAcBUNi8AxAMoAQktKYOACMaq7J/rutYhZK6tiJ8ch3BHWiGVRLJtdAOEO5CXOAa8KNChu0T4ES8pCycpcEgc+Pdz5tTzqt2dRzTydRKLIbRK4tVgaQVVtra9VaKChQyqoVUQaWpRA4sRBNDLtNk8/aQ8jUbKFBSpOiqORpiqdifsFTyE8A+krgx2kQtzGGsLTq6kD52UKw
|
Aq1VQTygfDIx+De4DrKhmhIqo5UJ0feM7jScAHjZh1Z0SFLIRWFKT9Z1iveY2qfeTcr6PhGiA8PoaXQC8AjDU4VTDeYblgKTSPNS8bqMB21oqvfq3yQ/DhFVVlnANgB10BQAjAF10HgIQBTQBQAAoUqA3gPPyjtc7ja+ldA1iERYbBIOjG+cnADiFFDwLOzBaTQmia4IMgzkf3T0DVIasDTMauNXpLO9QsaAdXDjJ6cDrqwdgy6OW/KSMU2CnNnc
|
||||||
|
|
||||||
b3dUKaPxoQkxTRQKbHrwbwhD4hzSFpsUhqlzS4AkA4cE8IchrNqSMVhciqY6dRVd4rxVSSbJVXRLKTQlrZ+Toahjc1yoQS6CZdTBhGqDPVeudyYemboLiCOtBuYNYbNdV6zJTf3A8Lherz+X0yzRGk1zKt+0oQaONIzfJUa2id8WlRbrPVcmyphRDq02ToSSZZ8bsQN8aXgL8aNCgCagTcsARjWEa4zdW1LKgmq0BfYMDFVejRldgB10BQAjACl0
|
Sg9QKQ16a4Tp9d2TyYMaZjYu5KhOfaLQlWUaDHK0B8aXTF8AL8A9pHUbLjXjoadQTqetUTrBDSTrlIWTq2Tb3S5MJfVkqIRBMDQzqZcfIa+Woob1McoalDZ6DY6WdCy9jpjK1vzrhFbqbiAPqbDTZ0aEkZddDQGKpq8BQTLRXSa/4HZ8u+r4y+dFHjhsHQRDuRjk4BLzzGlS9zZjc+qcxQQbOQT3qRTX3qEjQPq1jcGqSMaxDz1tsbAJPxyqFD4r
|
||||||
|
|
||||||
HgIQBTQBQB+IUqA3gMoLw9Yfrw+ldA1iERYbBFBcq1e3yjfGJg0EGV05wSvSRGaIy5MI2tDtC0bzwG0aYRb2riTTuyrTRSbNDdgbqTbga69QULnQQF5msRMb1BchBdGVCSzDeIqHbHdpMkKzSzGUiSLGe+Lt1WNjWgOXS6YvgBfgHtJiVT/TR2ULYtjdE8djbE8p8RxAZzbObC5ZlRFzQXq19WYRYGVWSCoXWTEGfBbkGY8aHfs8a7Pofq3jRswK
|
uTAcbGZZrVU4O3zxkW2KFlR2LwUIacbjXf0H0BPQt8QNrN8VDqzlmuya2mNr61RZrFxRILL9T9N0TZiaDgNibcTfiatbkSaeACSbPlWObkTZoyEFmnr0ABuwXQJeQ3gDdKEADwBJAGytaiBQBcGHN9TyIrqlwsAaNanXLYMprqAONJCBjWNgGTeWY8UCYgMyT3T7TV6lm9YupuTQzreTe3rIjbYrizRs0uQe7rPOeKblpfRzMqbnqxNW1CtpdRYZ
|
||||||
|
|
||||||
+S+biAG+aPzV1rKUaaBgNGKpq8DFQ5gJEz2+X/AHRSn0gWXzpUCcNg6CMbzSptgSwNSuaItWub4RQLq09oUz1tWaLtzdoaaTZErfpa+DO1jLCWFpDB2sQiqUDBybX6RzVU4ApheTV3N2ReCgGTgbq3WFYSG9eO04lOpafDR6q2lV6qOleVcxNcTLM2QO1nAPWaDgI2bmza2bSbh2aeAF2bJldpaojTWzqzXpr8iBuwXQJeQ3gOHKEADwBJANCtai
|
0p+khVbuZklSjqm7HrAehiDiuza1qjRvBqJCZdKIADiLlwCxLrErl8MNSmqElfv9BvAObfabmtpMUMw7TUBa3apIbnTfTrXUGvcjIRHSVMT6aLIe6C5cQ7iW3jzqO2FobH+WkqqLZoAaLZREzbpGbhtqaB1jGedouNHQlOaXrQbgkA4cKTBEyMzlvDd4Jo8ZmbTSfHj2NdSqn1Y7qX1UFiEmXjLx+f6rSDU4rB9aXLjhZHCtjecLVMOPA/UNHU7a
|
||||||
|
|
||||||
BQBcGFcNTyG/qlwnkb2asIqYMuaB2kHqafmf9J0ogoox6n9J/1UIoQLaBbxGWEVTjUuayAdzrR+USbKJZabOLXoU1tW9Lj6YlqwVeUynydwbCDWUDLxUcZy/n6bAUh3q1HHrBKNl5UFLdKsJuSHLJCgWLlwJNLrEpp86tSmT7DQIRBvH+aXfsAzdjSaQa4D6ixGQqQTjRBbV9XtjLjcRDN9Ugzvoohb7Og2S7jT/j0LX/j3jQATerf1bGbvhbrWm
|
cTD+xkItWZW3LuzdjqV9a8L3mfWLPmfzLYFW6xdzRzCErSYiBBaNqoRR7zSFbgde6M2qgTceb8AKebzzZebrzbeb7zY+adzcObxzQCrJuQ/rUTXTTd0L8AKgLugKgC8BvIaeQ4AJZS+dnuhL1C7hTyErqRklCMKTeoguaIEdeLKud3GXvg2dHDg/8CigL1UIo8OToUQULiqLICBaKxDxML5VYrVWesLheS7rcZYyre9c5b+9WQa3LS4q0hQKtodc
|
||||||
|
|
||||||
xl+3CHBouNHRkjkRSVrrqaSwEDkgWQHMc+mgSGLZ+SsCQoaCpZuzEWV0boNT0aYteUTMDVuaqTfxbdzbSbfpVLDnTbErVMOPA/UKOzHWZSzyZF5VbzaJLU+fdqjVYIg8qpRqWtX/CpCRPRrCcbqQKPjaNLUmaz5Smaf+YEaVpimLjLfut3LfgBPLd5bfLf5bArcFbQrQ5bibZWbPOfWL3dbuhfgBUBd0BUAXgFxDTyHAB3qdDs90JeoXcKeR39dg
|
DyKMXKa5bgTFFqWoUCmZzV80k8obrXMqaJT2bXmW4KtCVeqYresqfacTq/acIaA6XNb3vgRzqNpfVqVExElMX09PTcdDOniobu3uFMAzbzrdMcGa6acDNJAF8AgQLcB/wc4B3cBUAhAOMAXgOEBfgACBAWTc4bDQ5TZae9jOkM856CNijP7Prqdav5Jq9USiV3CvMtYvttactbqgHGI5QHD4EILc0r4CdBbBTd3rhTXEbRTQj1PdQbSkjT7rw4Zo
|
||||||
|
|
||||||
8I9ePT+zVzQ5gCK45jSOa98Gzo4cH/gUUH5rl3M2r2viVz/1vOaZJNvSFtbqyeYWbL25b0aNDawqtDeEqBLfKrfpf4jRjWHzarcebG/mdBi+YrqZMFvyTePmknlDDy55YpSF5cNaMbfGT2oNjaXtYAztjRPjALfZxfQY8gQUC8gDbdAzoLRvqHjVvrzdOtbtck8b99WhbXjftbMLQAT9ppIAvgECBbgAODnAO7gKgEIBxgC8BwgP4sw2Tc5wTZSj
|
BpgNyrzrSg5TWUdtBVG8hQzA9olXvjricTHjPatFzF9WFbl9Rcb6BdhAuYE0an9dbg2AMuBSAFMAmJZFr6qXmVRfINapiZRqWTaXqRaTdrOxT7A1+ehyXykRA+WKDccwYF9Nqa3rONZBb+TVEbX1eWz31X6qCZQdbXLVWah9eOwrQPLaFecds7Pi6o1+bRTSJbazf5Thg3Jc9apVeFbDbYkFByl1rzTX/9etegB8uQM4q7QfqLhnuC0reNrMrd8N
|
||||||
|
|
||||||
V6Z29OkM856CMEK+HDELuav5JVQdUaYQiu5G5lrFJoW80eIqI5WUKA5hPmRLvrVuLfrX8r/rYLrAbTxb4tTd0PpY7SkNcxKT4dMB/pelrXbUotQzDEiQfg2qBuU3YJZPwQnch1al3kpbozMCRFMaBLx9Sfr3ddbg2AMuBSAMcyTAKdaoxqKwoTYOb6CFOK1wbcpJJT7BGBVDSiukRA+WCtd2ZnNrzTSbb3eWba0hUaKAVZ3Kubt3LyrfabKreOwr
|
lxeeD7ETXax1aEidBY/r5LbgAXcFuh2BRuwN2P0B+gH3L+7ebsKAKtlmiFYbQIbYbVitho7oF0gnMcmyTOajZ0ooybBDCKx7VQGpUKN9jDzrmTA7bmVrLTlq5jXlqhbYQaJ6aLbyzWKapeeQa/1ZAx0YMnal6TQbgNe+JMKFIxwNZQzloK3ZRicuEWtezK2ta0yhuMKYteWXbUuafo2LQjB6/o5whqCLj8tmDbw6e6bU1nL0o6ZZCY6ZpipLU7iZ
|
||||||
|
|
||||||
QP9KMNXqAHRTKLOpeH9fZhPB6ZO+y7zSRqv6Trr7tCtAe2E4b77dBzqNWaJ8eQM4mHe6rt3mMzrdTtSUwsZL9qTVcWHXf9G4WzK3dTWa36C7gt0D0KN2Bux+gP0AVFWI6KZhQBCCs0RQTWOCO2OH0RoNHqukDH8sOfHrUbAlafYIIYRWClaA1KhRg8bWdaKU0ahKMbbCTT9bItX9ay9WSaK9XuLrbXxbbbWDbBLROh0YDvajzUybf6GHbeajhqZM
|
LUjbtDU/rSAKeRMAACBsQIiCAQKRB2VjMB+gNiBsALRdHJqJLldTyLZ7Xj0HDQkQRXKNbG+W1xIBQzaq9TkgAhb4aIzIwofAmZtQmWEbcKhEaw7YLaI7RRzfVXxr9rRWbDrfHb3LWkQTQI/agNRha0nIzaS+P/K/iEwayJaQIobiYJHWX/azjSErO5XnrwlegAEAM0Q2BC9d4gLUaGLYsquJT2wxwbhrM1cjaw2RY6rHUIAbHapajmt/i91JHpIx
|
||||||
|
|
||||||
LlqKPMtBW7B00FKaBCg7cpShuMKZElWaqI7Wtio7dmSY7XsbjHbPjTHc6tqVOvr18UbM4LRyC7jZna9Fihac7Wgy9rRgyC7etzSAKeRMAACBsQJsCAQKRAYVjMB+gNiBsAO+dJJptKP9cOKITQra1iEk4qWY2i2uN3a2fhZA+7R2i0TRGZGFB3k21e0agyp0abHfPa7HfzCHHVKrgbbabGJRvaJ1aKYTQJ46Lxa7bWmcD5eJTeNAneHptVUD5Gtg
|
WjZXbYZ0K9V6YeWTXqA1FrUuLNg8pGE1grLcqLh+WI7AsRnix6btayzTI7r7c/KpbesbRTLKBH7eGqIHOoE5UhQigFac1dij/aODRqa7zjjqhuGOUczcETCdRsqSJGmxlgAWgBnM07RwJ3ZCFUfriFdCKIpcrKopRQqW1f5F8HYQ7iHaQ7sQOQ7KHdQ72JZ8r2na07LZWeLu7QJKPeFMBsAG8BHQM4BXZcQBaiA0oolW8BPwc4AKmt7i+rXzSTtZ
|
||||||
|
|
||||||
HbwnSVr+TSqbPxUM1miGwJhroojxTZyygzT2w8Qc9rJ/pSrhHegAEAHc63gA87ixaNLB2bES3RtYIeSHFbhcqIae7cM6ckCvTOalxZEyM8imsJ9avlYVL8rSXrUDQs6p0eSbhdU46QbS471nXga8DLKBsHS6aouOoFfQQUo/wedri4HKBhiqE69VSsbSNQ4LEgtWU8NbE6Pna4aBxlkBlgAWgBnGmweXZ3ZSbX0M9LambvVYZbqbXMKJABU6qnTU
|
HQ1iIbRi6kpgv8Z8gOHZXqeWYga4gidAXtRIbacqtbftafaJHeWSK2UDqr7eLavORKabCTk64sekbZTao70gnLYzsHVrv6rTQIkL/LijVGdb6dgYuYBOS+JeA7frexb/aSaRRDc87xDZKivaPNDDIamMIbdbjWdfLisSV6bfTeg7a6vHTWHIGbStpPK6adhEAQKQADgMQwSkrbhmAPfit0DYzlgIQAUUlurVFUc0ntZCQI4LGYNjF/ip+hw6RXLx
|
||||||
|
|
||||||
7HQHU6iGdiBGnc07WnTNLJlfy7RwKdTcUagKubTEa05R7wpgNgA3gI6BnANAriALUQGlHiq3gF2DnAPk1QCbLbezePTI6GsRDaG1K4+do7VapC6hnUOz09bPrM9fUbd0fEwt6axbi9coaMXaobUWZbLHHf0bRdYeLXHfbb3HbjiGTS7bvHbLhVaoIkPTSgZDTZPLmPhKlpcqQ7Uba+KPRWsbTUYwouYHfblpafpJ9T0hp9ZthajYcaA3cnbmQana
|
ZfKQyIWbVAJQ0YBxG5deq+bdYq1WUk7NaW+qpHb870nf87ELbfaUjffaMcYvSVHXDrHCWk91Rq4T6tTdouRoQS87b/a9baRbRnuRaqAWY74UhUAttc0RyiJjZZOc6ikXRyggEAiY1lbbZmjR66vXT678FFFr7bcxA4oeNNCqG3YAJaWB6bTK6FaMzaZaGpKxKKSq4nZYqmleq7NrfSqUnW7rcrt9yAXUhbJTXgYtIGWLR9ahkyIKWB8hYULmDZ1w
|
||||||
|
|
||||||
SoetaP8dZ8eQahbinXnbSnd4zsIgCBSAAcBiGCUlbcMwBAiVugnmcsBCACil7NWcq0Jn/BISBHBYzBsYYicX1u7SK5eLNljMNIPaoBLojAOL3ytydM6gKrM72Lf2qF7VxbjWcvabTavae5RVbWOUS6C8Roznba7LLxRKl4itpAoSc1abtAiNl8VDLljcVq5FdSKnzbSL4UhUB/dc0RyiJjYnneBiJJUNwVCH3rL1fyz3dV7hQPZoBwPZB7lTfXzV
|
YiidgDHU67/7UpqllSi5xfBvrTqDOD27UuSBGrQ6WsZObLhnWqt2RNrVZVZr1ZT9NmXay72XQCiuXd8AeXQGJ+Xb7L+1cz8IAAO75tYCrqrW+yBJRnTqfkYBNAA7ggwA9DT8YJIGlGYb1DqhbnzVGbznSRhSrqL5EtUk47jAZaccr4ygYUIo4ETAL3nW3r+bTYrNXbnLXdbEb4LaW6DXUdbhNROh1QMo6LaeC6oeWKgfYPkKVXfha+0BVSKNc1r2
|
||||||
|
|
||||||
iGcTdTVzQnkG3ZEpaWBIXeu6FaKM6ZaJdKxKNdLkXUgbfFYtqPeQg6VtZbaZBdG6bbWLq43Ttr3HfQSSXdDbWpe30TtbMbgUh1QBsPOFL7SHSulljB3nTFCLVUQ12nUTy3WHw6zdUDqybSK6KbSJqqbX6rxNRvM+3QO6h3WmjR3d8Bx3QGIp3cgrlNXDD5Pc7qATq7rubV86NuY6B7vrJqHcEGBGoe4TBJA0pATcQduDeFaS1XiwoTS67y+G66P1
|
3UY79+XRLZVWrCjAFugN2P3aVtX66Wme1ShuIWAhIlqqZoVaa/rTaaRDT+6bTeDbhLRmdyXezrRLW09JLTS7pLf6BZLWG74gAR6iPbcASPeXyKLS+avYDBFYqN80ilci5p0vpbLMUZaQHe80MzXwQ48UItMtW6rg7UWzj7YWaEJWfaSzSLawPaZLEjRhLkjchbE7XYSAufWaIHMO4GkA2IYXe1RCCerbHXYOSl9VwbGLX2iMkPBYTLnhqs1fFbyr
|
||||||
|
|
||||||
fdhIXaTBEyJjkKKblijbcG6lDXzrCrWe7irRgbL3Ss7r3Wg67bex7IGOqBtne+CW9W7Q8XD7BPba/9gUpjBe+NO5iNbIqHzVuqeDTc6JAPEAjAFugN2GI7PdVB7RPUNxCwGfznDXJyJ9Qk7JrUk7pradDJ8Zk7Kybb8zVvqcM7Ztas7YU7GyS8b/QBhbvGdV7avfV7RwT+yIrV7AYIrFRnmuyrkXJKl7rfWAQvTE6mvq9a+CJgSvKsxaKppF7edb
|
f3iAvbXbCHuO65xZO7esfOahnRABD3ZgBj3ae7lAOe6gQJe7r3bnyyrb3iKrZeiNGROrgVYeat3TwBrKc4AKgP8I7CsoAFuVU8KgMoBbgJmASbdYb6HeTaRoJCRW8IHAuuNRqK+Cm7eLLK6ZrdBleHUwh+HajE/fL3zgjasl7Oe6rL5ZNLs5fDDb5Ttbi3fbdwPTfbIPRQb77dcT3FYrbaDVZi1iHda2asZz/FcCQP4I8zQrc66Sja67nSUwJiIA
|
||||||
|
|
||||||
8qAlR8S92ZG7lnbi7VnYhq7ZchqMHWkRJgFx7RLUZh0qKEzIyRqVpLdS6J4O0TD7ec7gKQarg7aeqMkPBZyVRy7cbZYSObe/dHLYDrsZcmblPXpKDLVv8jLZK70AHgy7PZoAHPcoAnPUCAXPW568BezaZCRpa8dRZ6llUmr3daidPqc4AKgP8IVCsoAleY48KgMoBbgJmAG7WCbOnc3a1HWRaXdOQI5TvHq6mUR7eLBu7tbTA0u+EwgJnajEhGUJ
|
7h2jBegNQKR6fSYA64EAqtTbfJazvRd6rvaJ63XQki59G45LPG/bQzFir7TIIwrkEeY1oMbq9jt3BEKaWdczaN71rZjL9ic7qcZT6rHLfELljS5bA1fI7jrdB79SVZ7vLUZgtYI2KJgJo6ouDa6RVFDcJVJRoEXSNcu3VJB7vb266QvCa3jUiaOYbT6MOvT7krSNrunaF6+neF7srQNi8vQV6ivbgwSvWV6jABV6qvcoASbXCb0OoibnMnubsvUs
|
||||||
|
|
||||||
QV2biaQNYe6fFd8q/FUtrSpWobAVQl7bvUl67TSl7dDRsBNQBl6Z1a7bIesnBlRS/8TucirgSB/B3WWQ7SvcNLAPRV79gsRAHcO0YL0BqBGvWRq4EKStZTdZ7nfa773fRh7c5eUc59G45LPJhQMnORbJIX7UrkEeY1oLhLdGMab3xKaboHblakhWi7Q3TF7MXbVSlndabEveGMdzQS69zc978OtLruPbOE5aOJaO9RA5P3SKpNrhKpKNCJ7PfVJB
|
7hFe0B4QA8BaiPEBLRruEt0JgBLyAcB8ADGgt0HujbcGtKGMmBCTtbMBVDIykbkIfdqNbfZ3bW4KhqggbHtYx6D7bhUj7Q7qWlUWb9PbBbSzZfa9XY2NKzVk7qzZW6yKUxy4Pea7jtthhOaM8S2amTjyBWawELG952Dacb6GZqaTHRdL3XZiLbcPl7MRRn87Hb2bUFjZtg3cnqgaZab+3pi7/rdi7GPYS7USUzravizryjmzq/JtDa01n6bHcQja
|
||||||
|
|
||||||
vfXoqpPe2YzKvGaKze/cyzcu1EzSUjtJZZTQdeEZwdUZzIdZmbM2dT7sALT76fTMBGfe0Bmfaz72fZMqe/dGbObYcKrPa5b1gO0B4QA8BaiPEB+RruEt0JgBLyAcB8ADGgt0LZjbcE7L9ht1rZaKoZGUjchLtZaYtaHmBAHSnBmUkcQwvTo9Tven7oveuairQs0SrV3KENTgbC/eDb3HW1SbWa5CU3cycLosqAvvdyY3Ndm7GRN7SljYD7zGfb7H
|
sHUGacHfJbU/en7TyCBD4kcNsDOrG9IkLW91AsHit5fXiPbYEhwnf+QzLap7xpup6c3cnixvZ6rXfV86dmT869rTHbZHXHbffQnbFHdlTMfeNZAjq900bC8SsZgIQSwE7T87VjqDbdwaElagsVCMlz6Yd9bT9N3igvaOaX/cNqa1Wz7pzRO6m7fCLp3Qubv5vL78AIr7lfQCBVfer7Nfdr7dffr6PNUla/NZUSu7TVaw2Q0o9AKyL4gHKcUNWwBn
|
||||||
|
|
||||||
zY764UrmLbcDwBcGLmL9fkNbInfiLP/qXy2vfkrI7f+bo7chCgLR0hG3XIsYLYN7XDq27ioe2699RN7c7VN787d4zcA/gHCA5/b2apx1RfpEg4LuoEvcfYreCe/7sbsCKXrfRaDvaTAPrWabU/UbKzvdIyLvekLveUOrSrag6dfWx69fZoBxgGTTG9QDKiQErbFumjYoyQJ7RrYCENdQPqmXZQ63kKlTQPsnKcbQw7ofST65CTD74fafLhXYJr2l
|
ABeheooyTWNqGq6Hf7KhXXxNcLBpL9kKEU71iZz2aOsYmVK1NjuGhyfDV3xevckiLogN7hpXKzgkDaTwfVp74BQWbbLUv77Ldq6EfcZKtfCsb0JX9zFvRsBxgCTbqDa2wlbVosPvLg5O8hQiyCZFcLYeRo23a579bcJyk/VFq4UhehuAeURJAJIAfwdd66BW8g/6qV0vraG6n9foHHQIYHjA1G67bT47/nu5Z5INPV5MC+7XbsmbDLR1QlPYxrQf
|
||||||
|
|
||||||
ZTaulUTL0fRABt/fgBd/fv6AQIf7j/af7z/Zf7r/WEa4fVIjtXev7dXQ2KGlHoAexfEBcTlVq2AM4AL0L1EhyVBs0NR07UFbO6MFrhZ9QaQCskNb1cFcaYk9UBxfOsdwhUfTCu0VL6LojL7VaHL7q6gr6f/dY6T3d0as/fkyNfToGQAwX6HvZvbHyZg6G7TVbn3XvbA8sbAtBfK0pUpPLJwV1BdVX+7A7Zc6urVirgPfY9HQOURJAJIBewR77mXW
|
e+IuA3mThHWta83Rtbr5TnKpvfD7UnZ771/Rk7QdaZ7pbbPzE7UOKvLbzp6YARYI9WzUaKZMr6aFA8pPmT6zA21F79pYH6nRabGnepUJfWe0njZj90eVUHHjR8aTNV8azNTOb+nZZrIvUCbkA2wBUA+gGZgJgHsAxMBcA2uhPlYz7JfReiArmSLX2QeabZesAYAJgB8+r8AoAPgAVPjMBuyEqBPWSj8GlDGhHA5djyTWc6/sBk5GVFhRqNTGSxMK
|
||||||
|
|
||||||
1ER0gF0x9fQ7/8etz9g4cHjg/gpAXezUviijB5ddXV5MEzr2aL9A4cMF7MXsNCJtd3ATTfbz0mdPbYRQMHbHeG6rveoamPVr4Y3bbKcWfG60vUpKobW96cwPTACLFyLXKuULGaYJwgWVyL0A/eaKHQwbFiThp5OqpaZzB37yzU5lJKpSHe/Tpj+/QJrB/VbqwdUzzR/Rma6SRAAMg2wAsgzkGZgHkGCgxMAig2uhl/bSHV/U5bCdVg9JCjABMAJ7
|
6o5GP5IMtfBiZJH+6Q7QB6NXRrTgPdN7QPSW7jPT77Eg9k7K3WiNQXbDrRUcVIv0uc1Ajoqa0gQch/JBjr4/W/8cPfH96JfsFiADAA3gINTR7O6BjTTwSgQpziQ3a08IHT0goHZtgy/a8DBLcS6WPWS6UHeJaMSdZC1DdzrMHbx7sHXJaBdfCHEQ39lvHSdqNYP371lhkhkde4zXOHnUAfRcGlNkP0p/bHiZ/Uk45/SsKF/XgbxHQIHI7Tq61/Uj
|
||||||
|
|
||||||
1fgFAB8AMh8ZgN2QlQLgBaiGt8GlDGhHg8o7b/UdKRWEvTTScDTBYjhSxMK6o5GP5Iv/cjlLHXlb+gwVb//bF7AA/F7Rg9XrxgwiHUvfr6bhmlqvHVl60nN0Vo6DMbEAxea1HL3xxDX3qCQ+Q7u1vIrFvfsFiADAA3gDLTR7O6AvzSSHbYDjIEPXgkq3dw5uvaAzevYBb+vRHdX8SwHNrW267fttbTsbtbu3cfrU5afrYw/GGTsoIGvPRrARA3jp
|
7Y7Sj6t/Qo7oPR/SKtdZ69QIN4JZFkGUFioHw9Hup/2PKiIQ5YCqnRFaiLkTJUXb56n/dI83/YCKUQFaGR3TVzP/Q3bWg5z7BnUCa5gwsGlgysG1gzwANg7gAtg/goYA7aGJuftcUTfu7hFc0RlAM0QVfiiKAQPEBvgPKd4gBfj3eBUAYADwBH2bV7CA6rq+FmZzUShhlCiomTXODeqFFANUhvOvBwET17UIH16WA5BL2AyEaRvdwGdJc76BbUB6
|
||||||
|
|
||||||
0IEaBn/eGZBGDH6zQy4GEmfIGMCYoGjvVR6INcgaoNfM7IQ+Xrrvbn6tffn7QbWAG3HWl6vBYDyy/XqBBvBLJMQ/K0iRWo491P+wjhmGG7ffQbi3cmGiZOW6qNafo+AUkH95SiBvAwp6EfUp7/A/pbAg76rgg9DrpQ7KH5Q4qHlQzwBVQ+qHNQ8T6FCeKGTzu7rmiMoBmiFj8MxQCB4gN8A8TqeKHgO7wpGjwAAXbgIm7QktUKHBdq4LRZ2rSXKb
|
ogzEa4La8Gv1e8HxA3fbJA2LK0LRkb4PeoU9PPKkw9S6VtQxhNGEAnKF9ZoHDvZ6toQ3h7oKigojAFMBH0ZQYUQ+YHbYOiH8/ewyn6bl6N2IuHlw2RkmQ3wsvYO5Zk+qcwddZqDycib5RWIJFgfbwAJjWD7buVlq8zSqK+Tblr9JW77cKdHbZQxv75Qx8G/fUeouVnk7KtcNJzsElAOydyYcgzPq8fTra9jRU63PVYDjQ+5ZTxBmqGnX56ZzPUH3
|
||||||
|
|
||||||
lAcQFFBUtxLV1i+GWM7JfTSiOg68qHID0HuZn0HZ7XM6NA4g70DUvanQwMb/ifFdEQ/r695SYHd7Sm6PxNRbf3ffMNwzdpAEAXdA8pfbIw2YKDHBuwUFEYApgAFjKDEmGqHUCFUw2GbEPdZ7xI0CBJI9JH6wyltmTq8HMMBby4TV91W9IxMIIlkT+pZVtAQ0n7gQzgTaFcOG57TRGGPQDbuLQxG4Q4Manve478WYuHUQzJhzsElAJKSgZsQ6/SeO
|
jQM5Rg9UHGg3ES67e1jLkWF6f/VO6Og9z7ww5GHwtYCBYw/GHEw2gGUw/iLIZjhGGg9L6AtTl6ZgxIAY0FebYQSW8RYAHgXeF7hyoKV7PgLxB13WSbDfUVZJUVVc+UsbboCZDKh0O7bAOEO4zclcGlaS+GEne+GBTcv7UBTEGjPR2G5HQqG0fffb6pX2GwXcH6eTkE4xyXsb/ymaazrgTo4zd4N4I1oHE/VUzk/fsEKIPQAzGcoBi0KYHqnXUg59
|
||||||
|
|
||||||
U7kNg7uHbDYpaHte5ZTxOHbIfe4HOKqKGEzTGbtviv64ozpa2HUGiVPcZjRNRK7odUBGQIxTrAQBBGoI14TYIzAB4IyKGomFGako/+GvMdZ6Y0H5bVgWa8RYAHgXeF7hyoIz7PgLxBjPT2aVHUlUQhXBdtOthBzIF7ih0A0HMkHIdpchaG3mlaG0/TaH0XZn6xw/Y6Jw5uapwyUd4Q+bc5w/r7JZU7boA96GcckE4oMRsHXKo0afQQToSLbPLaDb
|
M460I+i7aPcX76PQHS8Q/A6hLYg7TIcg6OPdHTWPVx6xLTx72VDSGw3R5GvIz5HXvZ/yWqpAKDiDKAI4J1R0qNRqgpFeGPDcpGFUsp7yctP7szRp7pFCEGPnR+HtI3nKZvfhjRAyVq/LO9dgI6qHd7ksg44Thbu2GOG+0HVYBKulqSLR2649amr7GOBxVlVuGvmRUGbQ+l7AvYtHgvRcjYWRz6SIxF7ATdz6uIy7geI4CJ7CgJGhIz0pRI2l7B8Q
|
||||||
|
|
||||||
DK0+TsGBTXCkKIPQAbmcoBi0KcHHA21FUUHHr2XZJ6x8Z16p9SAy+0vQHUninasnflC9VqwH7jZ/iO3UU6/XvRCeAxXybo3dGHo4H6zFeUcYhRgCI4J1R9dSXKgpLDlblF1w5gGNGy5r2HGLUoGU/Yoa1A/4r3iZoGXpdoHgA86GZwxMGNnUS7L2SiGJ+Esh5YQQ63LHxHMDNGYz3M+LbfSFHuzsfy2okDklIK37OXQ+grwxeHqQGLHoxfGy/A0y
|
s6pg/lLjCrcBbcDABYrOjBLyG+DvgKGhPgDGhvgPwihAElZBXZmH1jkkFY7trYhhRQHOQ/ZB3bcvL3LNQLKenbC/DZWHAjaYqaw8N6PdupGsxbp75jU1GQPW2HZvW8GDI/+Ht/dB7o+aZGjRQOHOaJR5XDfj6GzmSsJ3CxAJVQaGHSToHtTcYVD2enT9AAbcVVU6iyPQG6taPDkHvQJKGY7gwmYy8BDtaY6EkZ0g/XhPBEyOYNio66dkzfc6kwcN
|
||||||
|
|
||||||
GhNSyG0zWyGZheP791jVGXcHVHARKoUmoy1GelO1HfwwTbkgxdTnLUTrJCrcBbcDABYrOjBLyO2DvgKGhPgDGhvgKAihAElYZ3V/q4pp0VrWD5qsILUHkXPZBhoxYr3LMQhp4YRHmDcRGsTSRLug6skKI6CHVzbaGOLfaHdkTd7mPc47WPbOGWI4YHoBZtHVBcb7ggffAljffMa/fMUJ3CxB8Q2dGtdXSysA08H9guZzcGfoBqbkerlZhKbXGU4G
|
MHw4EGnw5p7z5Q1GtI5KHJHUIGP1SIHkfasbDI1B777YxyzrSnbSLAzJgMvkKQHcTiL9kD5Dtk5GZw+T6HHRzHLtaA6U9fNH2zJhHmfYO6XY1Ew6fVL6VoyPiWg9/7UiVlaXQ9z7ro7dHyiPdHHo89HXo+9HPo3NiSifApXY97GO7f5qyWYFrcvfQAR8JjyKgA+ZaiMoB2lMuB2AD7xHQPLqB9ic7jtZJHjxGsR1llzQAaZyHhWWcGACJRp8LBmS
|
||||||
|
|
||||||
XoxJ7lMZ87N/fWya43XGNI1s1OkBV8J4ImQ+Bs/7FMFt6vXaqCjSYn7BHDdLKIz8r1A2THaI4x7K9bCGWPbG7U426HDA9sD3I4H55aLhU8vbt6fQSihY1EBxG/WcG6kHPpW46tjTwxGbYo137CbZXyb49SHWHXpiOKgEHVPUEGodboSIAKbHzY+URLY9bHbY/bHHY87G1cSpr4FA/GTvmT74Xomr0Betz6ACPhs+RUAHzLUQa+bbhlwOwAfeI6AX
|
CSmBFKPJBEWTVya+LbbqAvk77eAy769PajHng+jHWo1rGxA+vMjI5IHxuTIHscQOH5yHXgFwjvdWHcUyhmvxzAkJh7pw+NG9ll26KULvhWLRi7IHRxa+0kcZCSnj6IImJgCXRxAMDfxaZDcx7oo3LiSQ7DaK/viSq/tvVE6alGn9Q8BfAEIB+gLgxahUCBbcN8A3gMoAHcEIA3gM4B8AHW5bbbWIybe61ozENZMkKc1YqFiraqPTbkcjYI7w5jBH
|
||||||
|
|
||||||
9ZiKb/ZSi88lCbmw1zRw6YL7J2SaGACJRp8LKuDQSmBFKPBPVA3Qua4DWcbC9V9awQ7HHT3UMGMhcg6s/k5GmI7O8XI2l6WNW+Dm9ZuiXlA0h/1hm6N0kc7mmeJbAkHYHGXUSGDw1Q6KULvhxrbZsaAwlDg3moQqEztxxnhBExMMcbYDQhZGE1Bam3QDG1rUWG2AyWGwY5wGu3dwGe3RXyHgL4AhAP0AEdZ8BYJd8A3gMoAHcEIA3gM4B8AHW4qd
|
kAONoNHG9k5U6aELNfHXYfE6kY3wGB46rHvnVHbpHXEH9XfN7UfbrHJA8O78Y1XK/gyuMgoGNMRwzLgHXWdd8RHGTontbHN47OGnSeuk4UvQAhAAXz6AO7wqlGuGiqMaArflYGUfGG7RE+InJE0eGfo9bAicJGCvTKMLIkFoCmVEItT6qpqZhVthk0UVRU0emLnw5D6wg9D6ppbD6GVS1HkCXKHtY9jHFQ/fa5eSqGsfVOFG9TdB8hUJEmBkaAUO
|
||||||
|
|
||||||
eWiufda1ozENZMkLs1YqJH7aqJC7PsjYJ4/TA0cpcshQLJ/9OgxA4DE1kNILYr6LTXaH2E1oGgAyg6xgzTHXQwYHxgDJ7M4zs6YA7LRVQGyhxE7uYeIykr8RHhSsRsFG0bXybLo9c79gvQAhAIQL6AO7wqlLJG0ScaAfZsLGqw+7rOk90nekz3Gkqh1hVIElLspEhSS5daxMYz/ZZUqKxzpXkgh0uRi+KMfaVkVZGaPabbxBebaglZwnyCcnHV47
|
SFbDHQn6jQ0XaZE1s9Ao+UH0I2icz0ZtkRQfeNsADEnE4+/7D9VObHQ/7GmuWkSyI7FLSxl/Gf43/GAE0AmQE2AmIE5ElZnYknxgy+TJg3lLVYcYUjAO0BHQF8U3ZcwBMAA+Q90bTABxAHhJALcBmoX7KVFd9G7DVttKbZCRRrFZyI0VCUpGImDhXDZsovEP1RfANLghapM61krH/3fm6Ig5N7trdEH7E5qT4gyZ6uw0a7JA3gLp4zsw5A7jj42v
|
||||||
|
|
||||||
THCXUepxgIvzS/R5HTeIpAgpHx7uTKpcIkYcgdE2gHS44Gam40VRBkxfH15VD63WNgBXMTlkNMdt9AU4XD1MfSHYURZSX4/eG344+GP4yTKHE0IAnEy4m3Ex4mvEz4m/E5Ek1XUCmJsjiiDcYbGJQ94yjAN0j9ijArmAJgAHyLZjaYAOIA8JIBbgE5CUFacrXY8H6qtq3bISKNZ67No7SlmTEGTJ/8ovDn1RfFrKXlbQs13sTHf/ed7543ZHF7Q5
|
fsGxINGeToNUg2uvG6GZCG4Nbh6ENZRbbTk5lsTcoBhNjqjXIztVsQOUQhADAAL0MKAfhE0QRdioKL0HTEt0LnrxI75GIrTEU66ahHIk647cvS8n8AG8nCdp/TYEyIZI1ucG5EMdzPkMKYGTNMnvBh/YBkGNgfLOHiffCKGcDWKGoLc2GNk62GPfXpHitURSHNvQnZbSXGxNfk7qwPTJcMMRL/ygqluE+zoSw7raN49h6AHe1TYU/qcBzXxS6Osw
|
||||||
|
|
||||||
GqY4xHsWatG04+MAqxbMHteDCrS8aQg+Ug2J2Y03YjQMyhuYwW66DeXHyvZXG4UuMBsAI5lGzcoAMNg+jyvV1VsQOUQhADAAL0MKAfhE0QHGpsKL0HTEt0CKLOo49HiQ2sZIemdgffR3H0AOanLU0YBrU5Mm4piIY2CaaG5EKbzPkNPT7tJtclBtXK2dBtAj4+BwMrTDiCTdaGqI+CHRw4Er1fccm/eXd7QA+cmi/e47sEwYbL4aqDyjOTIfyYGG
|
AJ2gM4f2kdlxsicqUk2O6v/cRGA4+Qq//VF66kw0nmAE0mWk1uaAQO0mEAJ0nuk58qFUw1ln2qxGU4+xG8bHBVfk/8nAU9p8zAPawjAGCnlwBCneif1bViLUh4E9S5ELN81juW2Uzg63gRrPZBwEV7BU5U1hw0URp6II88KOHZBI3mq7wgzD7Ig3SnFjU5bqE976sY3snzPYo6DRYH6zIywnf8D4hVPPvL/yu888xlICpvoUGb+WH11UIyk94yFG
|
||||||
|
|
||||||
btOgkhvE0mPkxE6JJU4UWGZFH3o/8n1gFmhMUcwBsUQM5B001kR00/HoU2e8R/QZKx/RyGSU46AyU7HlKU3ZaAQDSmEAHSmGU5Mqx01CiD2mv7BHRv68bM+VHU86nXU1h8zAPawjAF6nlwD6nlSQr1kKLUhQk9S5ELM81TedmUTQ63gRrPZBp4V7BqFedB8I+Y6ugwqBfQWV0UbI4gZ4yr66PW3Kjk5TH8k9TH8XZWnwA2l6zxVAGvQ8Im9DKRhW
|
D41i6hmF50o0+dA1oZyR0ddKMUbI4g3TaX9IbWZDmuor1WuugAdU40mK8gam2kwdiTU10mek9nV1egbjUSum19aEalmEAUs9euPUoULOc2bQuQZYtdFrcqS6GurbjLIQ3UlcesBsQN8Bamt0HMAOfjcGMqpfgEIitcWwA83GXNagkunvTBVBcoHLQ3oKGiCXRbjy6qy0yjpRjVDZUd1Da/HNDe/H5LVemb03MH704+nn08ea3019HbDd45RttXGx
|
||||||
|
|
||||||
8Hl6xrVAcUsEraNcCfGdddhg2kDDBe023GPo9QHEnbQH7OEp0/02S12IPRAQMxRwspo4gKyfmG2QTk7HOnF1XavkQF00umKU1Sm105biN0/SnGU97VmelfivilG19aK0zmEO4suekSA8OGsklka31rogrlmAzF1mctviMWusBsQN8B1GtyHMAJ4TcGMqpfgBAiT8WwA83MHNaghJnvTBVBcoHLQ3oLoiQ6k/jS6upmCw7CCCnTRDO3RDGbsVDGAC
|
4EphD1SKxCw1qCxVPdov3TCFI6J3ToNKpMTkYRAgXvlD6oysmU0zYm003D76U4Z72w0ynfuePHWU+MBq3WxCCY+ZHbjD7B4irlUlXjchM8mjBgSGBqxo6KmyLY8mxPfsFmALURsuO7w9op8mqcd8mHUwCn8AECmXU6CnwU5CnS41DVouipn8iFuggQACBNACiL8APoBWgKuwt0DMAbHq0BdPhqB6pVCmUQ8esh3E9bHYwX78NbJn5M5IBFM936YQ
|
||||||
|
|
||||||
XpmDM9KHjM6ZnzM+5arMy7GxRcq18EwrrzxIaH2+cxBsI+FCxVPdp/gwyJI6D58ioHQmRZO2rYYBRju1cwmY4zNHsk3NHFnQtGcXUnG8XSnHEM2tHDA2xLVUzsx1U8PKfYK4U2TRvybkH7kJ6bBFQwx2ntg8HLdg5V6QKLURsuO7w9oranhFvamT0y6n8AG6mL056nvU76n7XaBjTOhNmvxUCAAQJoAMxfgB9AK0BV2FugZgPQ9WgDh8NQJLK/U7
|
/baFYDj0/kHukVZgMa7nvJ7/2LZ9uKOAj6vKW0CwK/ccMOYnFYxxrtPY2HAPY8GWwxmnEfZrHHE2PGQjhxmgQFxm6zR4mXqEtbNYqTHlQbQD+UuBZx5bQykeYXbr/Ud4JU1C7qfZfMLUzlkQUfvqBtR1nTMt1nkkwRHkacIKMrRqnf/VkmqFbBnLDfBnLyA+n+gE+nelMhmA8B9cPNb1mFsnfrzo9Umw3cZnTM+ZnLM9ZnbM2MAHM/8IvU6c7OLv
|
||||||
|
|
||||||
JHW1kO4YeWmH9FaGmH0MNnJAKNmFvZNzgykLAPun8hWPsaM4rfhD7rf+xx6txRp4fV5H4QWAYCThg0mZZG801NGC06wnBg6VmsXTn7Fo5Vny0y6HFU+vHxgECB6s4zHrrvKlNYlX7VJFul9BOBZclWE6gfasaQfaiTu03SdyQxIAd08FkWsniTDKTNTIUbTms0fTn+cebrbw7LHX4+lG1PU+HP44FmQTcFnLyCZn+gGZnelOFmA8ONcwjTTnmsiz
|
xdJ7lrRs4NZig0xNbplXRYiozMLUWPwhg0osLlie/Jbg2lm+402HMs+mmhTUQbGU21HmU1pc809B6cJYWnfg0KxBDOpbNvSgtaxTPqWNf45AYxf7ODYhGLjfWmOcRLkMQ6cssQ9w4S/UMxHto8gXs+sI4SfiGiXXIbB08emXQXLlz09alGJdemps3emZs4hmFs6+mls3riXUmKkZ3vft5wv9C8zD6lt04VAIkMIh7IxWYzesBnj05y1H4+SHwM5S
|
||||||
|
|
||||||
nIjfw6peTpqhHbdmt0OtnNs74mds3tmDs2MBjs/8I702PTgLsbc07lrRs4D9i30+rbtVXRY0Y6DiCRMdw+eusILSe/JJo6oGJU3PHXudKnz3Z9yNtacmVo+CClU41LUM7fTto2rhSEBPT/HT4JJE2xwYBkGlric0nC3XDKDw8Rn0QxsHrsx17KM117qMwgQtNo8gg0rlVY6AwH9sc274GVpm1orT1dM/pmBc0Zmhc6Fmxc5ZmJcxfjnUmUsJfiOl
|
Hm/dSHW/bSHhFeURLyKeQYALcA00C7gmiFa0DBUkceMCAsC08orPxalE3YC1KL4GskE4PdpjuUATIBfKRP3pALwEXMtns8b0TFbmDrfHJjM4KUHlk3cHVk6mn1k4xnss8IHOJqPH2o6TKfeLB7eVYTG1AuZaOE4F0s7TdoACOpBGqGT6HRTCG4UrcBlwH5D8ALcBaiGOIXM/xVXoEsmPM9uHU9RxHK7RnnbcFnmc86om9BIaR8wBzli4PnwEzWMn
|
||||||
|
|
||||||
5wgNC8zMg5xcp+hCoBEhhEMdGKzIL0XolF16uppncnXqtSw15wpyr5n0GZWGVpWnLyiJeRTyDABbgGmgXcE0Q9WqcKDDjxhD5ihmTlVFLUom7A5ZRfBlM9jmpxT+xRDfKQogTELp4SLBs83bmLI6Yx1iJlmeir9RxU9NGM/SVni0xG7oQ0vHEJivGfcwCTasz7xDfYyag8x9NYqHwQak92x31SfaSzKL46YDuHeswB6K42VqTY8uBeIfgBbgLUQx
|
9OkA5/vWAoUsA/SlqRmDczKiVtCfJhKU+EbqU4k6fs/7m/sxfaAc8Hmgc8/8gXZW7bcMVmhlcrb58JQKCdDDmUDNKlice/iwZbWmV9YGyC8/Cny7XFbt4eUnhXtwzuzOtkZ0QrDT5vaHUk98benSNmMk4HGtU0Cblc6rn1c6ystc1ugdc4kdmAPrnPldOjz0SfmNs0trcvY6BLyAgBxgJgBUFFTynA9wZW8JPVAQnCYqFLTb9QD+b4gr/V4ZZT0V
|
||||||
|
|
||||||
xOdmJUpoiyM5fGDretzbgKgXbcOgXMC9GnqfqhRMcurM9PqYhE0+ogcI555a1kaTtQbmYvig8T5MIOGOjdZHqI1KmLbfZGL3Y5Hf885G73ZcnbcBjmRLULsFdQToyWciC7xeYbA4HChAHPm7btS0nQo/NKpObgWqc+gAtMcCnSAMjDxY9oXcU05l9C1LGP+RzmYU6K6UfcmL1PTTaNpnPmF80vmoVqvmt0Ovn9DswAt8zGqjC0wATC9WKXdRT6YE
|
QBsQJcfhxs3Q5z6w6I7NI+HbyEyv7KE7q6s0ysd8s8RSJ47LaKZe4nPdtb45UuaLa1o26dHVLRgkLMwpw3cnDQ+cams1BwWs5qqsc9ODpHm0x+8aIWfY6ZrhYdcid2efrdIrFLIgdtcUOtamEA6GG6aes7rqjIA7CvgApgAiqA8CLAGlKeRLUc0RvgxyyMw7PaksDj1tlI2LszIlqxYtQp3alxZouDXHrOUYrBpXKLiVdBKxpZYn8zW+GT7Y1GSC
|
||||||
|
|
||||||
2nLHQJeQEAOMBMAKgoS2ZXGNEa3hK6rYG9dUgHVbdkSks/EFJbgjkxfeYIDQAPz1IK2rp49HG2LdDmIQx/moQyMG5U9wmFU77nUcwPKbk0LtrfL6C84xqVnrcirgkLMx/TfYH5E2TmjvBTng08MnooyiA2mHIS+i5OmB/RYWGEZw7Q0fbrw0VISBi/LmUgwem0g+7qjXZNUZACoV8AFMB81QHgRYA0pTyL+jmiB6G+2WUGWU2r1cLKdwFYBPBo/p
|
zpGtk10rfw04nc0xW7AI+XKjk59Rshdkga4POEk3IT6m7NtDzsHBHqY7RK5w08n3XV6yt0NrCgwaMZlM/UkPpvgBaiFABjHJGHCAOCj2ANURGFgirfhPaiFXvREs/e1rGEClhI/UXm5o4y6w2dkXcixpBq85NaAXsItNhGLFLTAKrvrCyhGFJlEt7dIl5mfdB/UJpKUKbm6fC6HaiCxKHknWgz1Y9+HcsyEWqCyymJA7LberRymQI3hc7/orAClO
|
||||||
|
|
||||||
aYxYtQpZ6lxZouEQm52VwKwRSKnsTW8qBBbCyIM7R74HdBmS07BmuE0IWeE338+5Zs6eFQ1nPqJeLskDXBhPXfC6i4zTRUKNRBJcJGHfaamDHP+yt0LjDRQaMZxs/UkVpvgBaiFABjHCBHCALmj2ANURoFvmrfhMBincQtUG4887XGXyxGC/EWU84/brPciXUSxpByC3RBGIIaBWaGPBGRPXj49RPAM4HJAteghYA8V0dVWfdB/UA3K3i/snW5UQ
|
H6Z9feUqFOm1t84ba+WLi5Lc21n1NUNyiWeCzpA/eNCWcSySbV06b837H1Uw/nNU+NnoNuoXvgJoWZgNoXdC/oXDCw7hjC58qPi68XlC1bLU46XmVviUWyi7UQKi1V62ANUW+PPUL/M3+iJzszkhrO1gdauGZRhaJj8wIwggOBf0+c7JdFFPX0epk8he5t4clGueBKujcgc0smnrExN680b9nhbf9mWM4Dm2MwVm9i7adw8xDmTSZrrfqSQSeIfW
|
||||||
|
|
||||||
SYM3kmfi97nhCwCWiXTLanbTg7cJPi5LWGHm91LoCrQFQoo2oRmA07SWsKM2cGS/2mmZSTzTyCGzY2d9ry2VaWY2Q3ahXb2Nybcj6Hw9v8bCyEGFi98AlizMAVi2sWNi1sWHcDsXJlUGz7S5WzKowczrPcp8cS3iXaiASW2fWwBiS3x5mRU9nYsRQov00NZ2sKQaU+ucXpoPmBGEEBx++m3mSMdmVwSX8gnhOXLc9SbdzwKF0bkDmkpS3A6Dk/R6
|
dQzNNA/2DcW+C+jnNjE2mi/S2m8c32k6S04S/kPKll7Tig/XuedFBolhhFAtgK/bWQ742SGEvDTnU6kSSJGqCXwS+a1IS0YWTCz119cXmAfrChR8o+1B+RGOlRuuYJDQDZsfIAnBE01vSrcgvUJc1b0z0y10L04W9sAPQANwhZIxANepHQH8ISi4OAOmABrF07nULWHiwCXIPlhbPUhzcfr0b9Bv9k4JcXFkOWZZuhGXxQWBmB7lSGUowrmw3Z8A
|
||||||
|
|
||||||
+CzKmBCyUXfi2UX/80qnIVQHnMvehmjMIE4MCWuG3FlS75C98gUhs28itVsHSc8xlE84Klk84pH0w59Hq3d9HWioopI+sVA5bP+stHbRBfoHz0ayzQ7hFAtgxgYwHC83b8t8SXmd8XlcqGj6W/S9q0Ay9sXdi2l1L8XmAfrChQ2Ju1B+RCarC0kF1MqZ/8fIAnAspoYz5cg3UNM6L1iodxmoAJtFPgNgB6ABuELJGIBr1I6A/hDiXBwB0xUteJnf
|
4ywmW4AEmWjACmXxgGmX9ABmXUMxOdgYzJUqbYnBzRbsYxYokA/UKQgInlR55Fp9bTFTeqnPHeq5bg+rEYzSrSEyjGAi81GXgxjH9I5v7nEzQXxgIMqwjoHrCY8hAebK/ALtK2aihZ1gKjFwWGs+ULaY46Kro6fy2BS8AQS00yXqpRb9AMUXSi4JJ0S5UWsSwcAai7iX6i3+jjTYkJi4Cdg8/Q/7rA/JbbgM+XbgK+W8S5kXddsm6gNEd91DKKgR
|
||||||
|
|
||||||
ahaw8WAS4y8sLZ6kI/iO8zfpAgcnAVyhksyZG5nQKx5m3IV5myoVwH2VP5n1uTBW4K0YAEKzuQjAMhXxgKhX9AOhXIs6mdfY0lK27YnAljbsYxYokA/UKQhuJVR4CRgFrw40FqnPBAzNQIHlMk7A6W5abLmy3KXHQ+2XFS38XigXwn9fYqqVDsAX+y0eAFbB0h+uVGSfvfIXOsBUYWi3ImIwwiXkC11VLBd0KXgN6X2WUtVgPdGXcS4JI4y4SXEy
|
i4Bi1SPKRasA6YZhUxrXvixqqimMaYBQsX5/VD6r5b7meS6Pm+S+PmBS5PmhS9QWOM53Ya3SQiuaKbAf7RlUQnA2KyYPS1tvcjnKnbwWPPQzI/+ZBWpUywKkFd5rfNdaHTZauSDNUZrlU4NmhBYrK0TsIz5Kdcr+sdknmy/GWjAImWdyB2XUy1EAey0LxYS15rDNT5rH2ZVbgw/ubLo3e6UJvb7uE7osOqmUtE7Xiz+E/sELRqeQwadbgWjBQAvc
|
||||||
|
|
||||||
wcASSymXyS6jckw4kIsAconuizcG05bcAXK7cA3K6mWBs5TtCPYqzNYKL5ZA3yX4sWqR5SLVgHTLMjJtSq9ptT2ws3YBmEhRDnnc6/m//XHGckxTH5Sycmqs2cmikw6b9fVOrMc5fDRWDGpDSXfDeS5PK2vsIr+ZIaWE83BpkhJFWrg+jzLUT9q/tQDqGcwfLSlVNXNJQyHEfXeHLC26W0fdDrmK/BW4AIhWOKyhWogDxWheCGXI2VjqcdfumAFQ
|
PoBNAJoAp7JgBvgO0B6AJ8BlQxuW0YwymGK3lnaUUVcRSbTCKNHJq5E/OctJEMalVgxBlY8QX/GUMzqijM8FVqwGhKJk8uojnkCOLFcp86jjI/htKLrWbNpVdJm3vSfl4gDGgzCjJx49GBWsHuZA+pY8XYo5S6xLapiSXdX6TobiTZc3ZDncTjmFiuX6ydflXpngoG5nvziFntBn5XjpyUJswXJleIRUSkvG88uMBx/gaHI9i1W2q1AAwc2sWHLb
|
||||||
|
|
||||||
EWGxS8Beabv757ICbHQFMBNABclwQG9EHcDGgxM6UHmU2KK88uog9E7hhAnPu64CepckgL+lwhShBmTh2j9SmEU2XSoHj3fkWi05d7xw1/mo3cvGdK52XmI6jmSg+xGs4ym7ykN95B4fjEdUyDwBbMO5ZE/+6yvaVqow3ClmAG2D3EynVs9BiWxpZoAfE0CBTyCQKYAMoBcGC8Aewa0BHQAcB/tF7ha6WdnFqiMSmBNiBkFKAqdKemAO7DGh6AHK
|
pG4q9sWEq6sYSUEWARrLi5xpt4MDam1NG2FlWToDlXViwmiKULGTIIiSqA7Q0rwvnjdY3fdgQ8/QWBE7bG3Io09uq8+dZo7FaEVN8XVU2lb1gJDou2Lj9Ii/eNka4rhUa4T8No1z7sk15WfK35WAq0FWQq2FWIq1FWY+XHGCiP2wsa0AWdKaul7KxlVeU/kaoZSPkOo2kb6swQt8iA0pbgECBvgFkwmIC8AY0DuFiSXL5yiBwAN2HAAxI6dXBA+d
|
||||||
|
|
||||||
HNAK0A4aBmKQq8R4wq/2GiYGrUQ03jYqa0IAaawFi2SyqhsyK84gWYIZfhXwxmEG8E+DIsVQa0MmhTpDATovwRlkuZHjvQcwVK1Y6oc8Vnqq7Dns/eVmgbUtGFrn/m0a8UmQpa96J+GskpFRAXhpBHmcwFsYtYB1bROLOX+w0RhW+dyK4nVfH6zBmDrcH/5bgDMHYzenXM646XFq+YXp06yHZ0+yHjJRABLq7Q9aiDdWXgHdWHq2YAPbl3TXq8v7
|
Xty6xn6w3DlNIJBCOC74c8LelWzeEkBb6iAhTcUpzCC34WVY/4zfPsATOdEm0+vshim85xDI1ec1H/nQnYXrVXn7fVWO5a5HdAwY4R7ZXc4ABuxMTdCmLjYV8MIKatqPeV9s9m283QYNWiQzX7pc3WW5c7MVa/tabpq/ZwjIF18ToP59evu7nHIAN9y1t39Gy7z83vShMOapMqg2pkgiMB1G5Sh5W4Um7X5fp7X8A9LWpQxsWqEz+Gdkzwt2gc6a
|
||||||
|
|
||||||
c61KEs66dXFc4en9ghwAHcG8AnyICbiGYOCA8CrjQ6LcAnhQ0oOozvni1RojqXFgsjIxj0FdbKLSA0DWLa7WAxUpu7ZbBPLSq/dFEDUOG9k42WZS7RzP88UW4M/KnPpTVmlU7f8k3XMGYAxvBiLSgTuq82nBuQ4x+EvCWsAyLXGa84Bma6zX2a5zXvgNzXeawcB+a0rWOWvTX+s1dGDHECBiANbgjABUlsALkwVa6QRB7lFC6HeXyACZA3oG7A3c
|
FQJhRFMLUhmzg590qEtAkRk8oBCG0W9a8jHPnbSWeIhOtMKDhgSkS3rhlaChDUEN4Qa3v6wa/jzfaxf026WUGD83DXPjWcr3eSiBSHpU0oAWIXQwLvWSAWw91KzIWATVpWqFdzXea/zXYUULWRZZgBRa+LXJazuad6xE0967TX0+fTWZ7QUo5oqh6eTk5j+RPukcnd8VS6wY5nAKVV5vB0TdTZoBA+HYLnAMoAoANiBmFQLGtXTXXZayPH4q5ELF
|
||||||
|
|
||||||
XkB6PArujqFDGp9aD4t/q4L7BEObWxWqvWwayvSLletljUJWqdk+VWYa+7W2E57Xhg6WmR1Q1X/a7wmRC5g7JAOIWlVSJShBePA1AidDRy5eaWCaSHeKLHXpRPHXEGx3BkGxW7JOJ0LrcEzdk6upKk6Uo2EVkuxsE06WVCctW0o5oTr5bzmSZd3Xe612zb9RkGODcPXCAKPX2gOPWQy+o2VG9gnIE3+9Ug5T7rPbJraXtiBtKcwBd0LiBd0J704A
|
axIwsYARpPiTfUZ1qbnAQkbit0rRmuS07rvPgngjax2nUZRWIza/JiLa7PoeLu0hWGV7qdY3bWYdVm9Ha/eXna3TH6VggBzQLwMXld7W+C4V8VoPucBzRcD2Pf1XzCBaX7cY36MHVHWRniUbY66TmVIXBAqG0nWPgbQhU6w5B06wSG0BMtXKATWs2ah3jf69WA5GG4K+QzLbxgFCl9q/kQ9wwI24kq48ng5smty+g3Lq5g2X7iKSksIypRLknKW+
|
||||||
|
|
||||||
BCBxgJ8B+gBpbOffsXPqx3BZ66Kx566ykS5VPBl62Q2PPBQ2c+hI3aFkKiX827W38x7XCiwjXj6wqX2G0qXktUS6MK72WjfSm67YKStcHHDZI62EJSINlFX63an8iKLXp8oQAJawgApazLWoAHLWFaw7i2k+vkVs1c7FPpIV/dUyAqbptn/Uwnn+wwLpGBWaWZ86frNAKM2HcOM34Y4+qOOmXkuIPcTzgYAhRUM/7loKQ2Qa2vWjSS0grWMiaCXE
|
gN1cUWZQknBeBHfksX7gwW6ZhjCEUC/Ld2oNtCJ62jLCBTZs5wlxY56wbGNqo1mRK6I3hrNDXoK6094a/Xbb8xLLhuWVyR1cWr3Y3pqSudlyym+NzVK78aG1RpXxBVtHsk2A2ZgBA3sQFA2YGw7g4Gwg2kG2ZWqm6U2q1UnH4A4iXbU/sE2Al7gHpfg67pUCA6IJoAGWcwAYAOGhMANq9Dcyiq8KozAF8kkFtIKQQcMzLF9ddhhDUPKt5Fsol0Wj
|
||||||
|
|
||||||
kEna9qLdk8r73i02XPi0fXWG17mCm7pW/SVw3nvYQBeG6qiUMm1AuqOfcoSVZXRG6gA6m8nB+4JI3ZWNI38NBlS0kRQGH7eaX0AAis3gM0RrcJItmiMoC74/C3EW8i3UW9eHfA86WkfcJruc+/HlYxtN3GzCsvGz42IrP43Am8E2NLWEb0W0i2eLli3zPVAmqzcbH360zWWa3DMf61zWea3zWlHSBjPq61AomyXwNcLE2AayShYuAc3kmwvc91JR
|
rA34LfArBgVAFMCXwFqSKMVyzZb+42cZ34dgAHgK83eNeQX66zQnMnXuWOMwunwc8wmx9RN1R+No6zWGSsoOEcgUPeqaEI9v1ROCxl6027VBCzDXH/W36X8tVBi8HAA92FEATgArjoAOmAMgOydfiPUAGAN2ZTJALaPQO/DKW/gGx5CIB+MLuF0gA6IrE3RUaWx0xrUvllyiOS2Xm283lvYOpaW2y30gC8AsswUAWW3S38soy2xeSK3+W/oBxW7E
|
||||||
|
|
||||||
MBEH7A1aikm0AewoMm7PHSY27mWyx7m4NcjWnm6jXOG8qXLk3trgS02UQC+fGp3PUgClPS7oC0SB9mtuWSa9OWuznHX+8dhggYLI2VEySC1E70DVejK2gEHK3DGDUEo3g4g2Mzb8Cw5vji85akdM5xcrq1XXJALdX7q49WG6y9W3q0HRbM/hiq8trYUeUE5nokRXH8e5nW6sPmuM9pn4uusBjG33WzG4PXLG9Y3bG0z0sK4b4eVi6odEsWXlFEF0
|
HEZJK3U6vllzbVgj5W1AB6Wwa888Sq21W4zMEa4KVNW/lltW/hHOUHq30gEGxG7cK3Doqy2FWwy3ay1bRjW/oB6FrS78S+a2+W1a3Wkrrw1KesBh8NCAH0GY1O2gQZuRE8pV9sQQToPoI0DD63HKlZJWdlgX5yJrAxytspiW0YA2AAYBgeQwACAK06s0gRnuoCuk7W0q3IfHvlvW8GASAGn5Zy4qki2ycBi0gghS24lYgdAgB6FrgBNAMEBKglW2
|
||||||
|
|
||||||
c21RW82zRWUGQZN6K17o7EwFmxa602ao+03M0J03umzirem09M5bWs3j4NchomyK2iG23yxoAk3JW9bWF7hIxQ1OzAiZCgC5XjmGYHa7XVW6r7Dk18W6q2WntfWs7z66jmw9ZjXA8yZXbjLhh7ibjmaRt7bw9C5wvusoWbDaoW5ZOC2kiCig3WxyMPW9Sp7OKu2tNuu3++sbE4IEE4g25Z8Q2zca0WoW2eM07co29XXa6/G3nq03Xq2w3nq8LGYM
|
KKM/Q7HvgB8iKQBlAMxgAABR74Dfx9tuxhXgLXIjAAACU/oFPoygHTQY+E7bPbdOi/bbgifIwFAw7bHbfnBVbMrdatErzLxL+1PoOuCF4CvVrq9bcbbycYSTcSWTjIvAJblROEASwcKMUBlXbdgC3QME2YAcutuiAIBrbdbYbbhDmLwu8MYAU9pdAKbarsYQGCAu8NJe8YhIiU9H0AHrbRdknEf4F6G/bFjqTbS9nrS6R1kcPxUuozHEYilaCAAA
|
||||||
|
|
||||||
qjGoKoJG8n8S23B8y2l829T1LyxG30ACS3PGy7hvG743KWxwAgmyE368wS0TokD56qkXAmVDrSFM+1cQKwR2Reh+DaK6gzJ8yU7p89FWGxTGhWgEW146TGhE3R+KWEnlFp28K2/q7KKJsIu3La4c3YXQqBduDsI2JrQ3c0zu3803u2oM7KXD21pWT66UWz601X9K4YGsG2qXSXR9MFdREhN684M/csO5mRHZWBHWqdHWwsTnWzmlVuVFWFG2aIBn
|
|
||||||
|
|
||||||
MlHn4889r+orH7kntTwagdT269EbXG7dnJAKgxlABQApaQEnnsy9k8qkK3fqwvXdm9mUJWyp2pWw381YMYb+o0RLtOyCGrm6i7Kq5Kn1W5pX6I9pWdW2Z2Uc8UmNLbWnqRljAe+EL5Qvo/X5irUhEsSjaYUnDV3O1I2nW/2GiEK16UGx0L/O+/dAu1OmtqTck3S1DDbCyEaQE3DCou0bHJQ0wIOQOEGQFmwAPPdTq/hf2afqzE252yOapIEV1ga7
|
|
||||||
|
|
||||||
l3l2/l2MMBp2ohFp3QNSd7ciyG6qq0w2cm/NHEa4nHtW0jnCkw13mq4YGCDW1XqRrbAJ3EEh8YhjU0qtkgAM+c7+u9D4PO7qlnWwYZVUFoWIAAF3Bi4yHhiwEa4U3bqeldVdnOSt2iUxXyN2JnFWgFBt4q3rWyBnJ2Mu6K3iG8jAcu+Q2LuzcTjmxWl3LKjZ+o5wWZndwXC07ZGNW3F6auyZ2Oy/V3yi8Un9Df928RSn1irBo4fyXIWAW2fGXilc
|
|
||||||
|
|
||||||
gdslD2x8jD35sXD2bu78mXDbC2v4y/yMWwy2VU6OM6W5i2qxdo3RmalH0ewS2xLuMXH+s5y9e9r3ce++twANVBi8HAA92FEATgM0ToAOmAMgNGw1ePUAGAN2ZTJL8qPQF3DA+yUGx5CIB+MLuF0gA6Jrm2CEQ+x0x40mFlyiJV3xXjH2w+2FkXgAvGCgMn24+xH2rwZn3XamFlI+z7XEZLn2oK2Fln7Qcji++H2iXtUSK+6n2ZYwgga++kBEZlCn
|
|
||||||
|
|
||||||
B1KH2s+/oAg2KE1PmA339AIiAO2y0Ju+5Asu6gV5Wmt32xhCdT1gMPhoQA+gFGjW0CDDJg1jOl3DuyRRp+wpUrJC9RkPNH8XnEk3l2xAAjAGwADAMGSGAAQBeXVmlY3N32y+5D5h8lP3gwCQA0/LJWOFrf2TgMWl6+zf3ErEDoEAJAtcAJoBggJUEH+2Wdn6Iw8WIRP3lAMxgAABR74DfwQDuxhXgPnIjAAACU/oFPoygHTQY+FIAIA9wA4A7giK
|
|
||||||
|
|
||||||
IwFA2A438r/oQHfnGL7BfcHE8SWaA+OPqmp9B1wQvCdqRUK/7P/YEdYKeLScNRF4HvbxRwgHlDhRigMhA7sAW6CPGzAGf1t0QBA7/c/73/cIcxeBzhjAEUdLoEP7VdjCAwQBzhsL3jEJESno7fe14Kdck4j/AvQEg5+d+/aXs9aVMOsjkOKl1GY4jEUrQQAA
|
|
||||||
```
|
```
|
||||||
%%
|
%%
|
||||||
|
Before Width: | Height: | Size: 35 KiB |
|
Before Width: | Height: | Size: 31 KiB |
@@ -6,24 +6,16 @@ kanban-plugin: board
|
|||||||
|
|
||||||
## backLog
|
## backLog
|
||||||
|
|
||||||
- [ ] увеличить размер текста в окне обновлений
|
|
||||||
- [ ] Нужен ли дополнительный выбор для загрузки с мат моделью или нет?
|
|
||||||
- [ ] Делить по группам траэйнисы и инструкторы
|
|
||||||
- [ ] Проверить Максимальный объем пересылаемых позже сообщений
|
|
||||||
|
|
||||||
|
|
||||||
## bugs
|
## bugs
|
||||||
|
|
||||||
- [ ] QT client: sig fault если не выбрана версия
|
- [ ] Перезаполнять имя на offline, если клиент отключился
|
||||||
- [ ] QT client: после удаления версии сбрасывать текст в описании
|
|
||||||
- [ ] Сервер: Неправильный порядок отправки оффлайн сообщений
|
|
||||||
- [ ] Unity client: после отправки сообщения выделять Input field
|
|
||||||
- [ ] UnityCient: У схем Viewer отрегулировать прокрутку на Scroll
|
|
||||||
|
|
||||||
|
|
||||||
## feature client Unity
|
## feature client Unity
|
||||||
|
|
||||||
- [ ] Протестировать и обновить версию на testPC СХЕМЫ
|
- [ ] перетащить наименования хинтов в XML и забирать из оттуда при старте
|
||||||
|
|
||||||
|
|
||||||
## feature client QT
|
## feature client QT
|
||||||
@@ -32,7 +24,6 @@ kanban-plugin: board
|
|||||||
|
|
||||||
## feature server
|
## feature server
|
||||||
|
|
||||||
- [ ] убрать clientMap из serverLMS Widget в мультитред сервер
|
|
||||||
|
|
||||||
|
|
||||||
## NOW
|
## NOW
|
||||||
@@ -41,6 +32,21 @@ kanban-plugin: board
|
|||||||
|
|
||||||
## Complete
|
## Complete
|
||||||
|
|
||||||
|
- [ ] увеличить размер текста в окне обновлений
|
||||||
|
- [ ] Делить по группам траэйнисы и инструкторы
|
||||||
|
- [ ] Проверить Максимальный объем пересылаемых позже сообщений 4 тысячи знаков
|
||||||
|
- [ ] Unity client: после отправки сообщения выделять Input field
|
||||||
|
- [ ] UnityCient: У схем Viewer отрегулировать прокрутку на Scroll
|
||||||
|
- [ ] QT client: после удаления версии сбрасывать текст в описании
|
||||||
|
- [ ] Нужен ли дополнительный выбор для загрузки с мат моделью или нет?
|
||||||
|
- [ ] QT client: sig fault если не выбрана версия
|
||||||
|
- [ ] добавить цифры при инициализации
|
||||||
|
- [ ] QT клиент не отключается updateFrame при отмене изменений
|
||||||
|
- [ ] не включается кнопка запуска при обнвление завершено
|
||||||
|
- [ ] Unity: Восстановление файлов
|
||||||
|
- [ ] Unity: Отправка файлов
|
||||||
|
- [ ] Сервер: Неправильный порядок отправки оффлайн сообщений
|
||||||
|
- [ ] убрать clientMap из serverLMS Widget в мультитред сервер
|
||||||
- [ ] Различать, загружен клиент из Unity или нет, для возможности отправлять сообщения только Unity
|
- [ ] Различать, загружен клиент из Unity или нет, для возможности отправлять сообщения только Unity
|
||||||
- [ ] в ГУИ научится определять тип клиента при приеме сообщения
|
- [ ] в ГУИ научится определять тип клиента при приеме сообщения
|
||||||
- [ ] Если клиент не isUnity отправлять сообщение на позднюю отправку
|
- [ ] Если клиент не isUnity отправлять сообщение на позднюю отправку
|
||||||
@@ -344,6 +350,7 @@ kanban-plugin: board
|
|||||||
|
|
||||||
## Cancel
|
## Cancel
|
||||||
|
|
||||||
|
- [ ] Протестировать и обновить версию на testPC СХЕМЫ
|
||||||
- [ ] Делить по группам номер группы
|
- [ ] Делить по группам номер группы
|
||||||
- [ ] Добавить обновление инструктора, если он перелогинился
|
- [ ] Добавить обновление инструктора, если он перелогинился
|
||||||
- [ ] добавить в settings адрес и булку мат модели
|
- [ ] добавить в settings адрес и булку мат модели
|
||||||
@@ -367,6 +374,6 @@ kanban-plugin: board
|
|||||||
|
|
||||||
%% kanban:settings
|
%% kanban:settings
|
||||||
```
|
```
|
||||||
{"kanban-plugin":"board","list-collapse":[false,false,false,false,false,false,false,false,false],"lane-width":200}
|
{"kanban-plugin":"board","list-collapse":[false,false,false,false,false,false,false,false,false],"lane-width":200,"date-colors":[]}
|
||||||
```
|
```
|
||||||
%%
|
%%
|
||||||
@@ -216,11 +216,6 @@ dataParser->Reader->ClientAuth
|
|||||||
|
|
||||||
dataParser->Answer-> ^vSQuWpXz
|
dataParser->Answer-> ^vSQuWpXz
|
||||||
|
|
||||||
## Embedded Files
|
|
||||||
05ef07a816f9ec699b87fb198591290fa361b552: [[Pasted Image 20250807152445_155.png]]
|
|
||||||
|
|
||||||
2a95ba7d8af8e78f4250366c65d7324680129bb2: [[Pasted Image 20250807152527_050.png]]
|
|
||||||
|
|
||||||
%%
|
%%
|
||||||
## Drawing
|
## Drawing
|
||||||
```compressed-json
|
```compressed-json
|
||||||
@@ -236,372 +231,372 @@ dS6ajkIcDELgh5dsG8T3EOBzbOctQ/KiRAcGyub5vgAlsNKR5oCe+BhAU0HFLBpRseggHAaB4G6m+5SH
|
|||||||
|
|
||||||
qxiGsQPoJDECsqJ6FkuBFkwOYSPQVR1I0rTtN0/SDCM4y6sz/gEFzek87TWQM0zpAs2zk4pQLABK4SS9wLJCNDeO2008VYsGSS1PJNxKfBEBIShaGYdhuH4YRxGkai2l7VRbBUAZDw8PsCTRa8fZWT2nFPfWTkuWS2ibG8vG1IDd32ecvclP5gWoPc2j7BFva1DdFJL+FsUZ1T667FCA7mfZJz3PESslKl9LpSUmUctlKroEK+VioV0pzQqd86ZV
|
qxiGsQPoJDECsqJ6FkuBFkwOYSPQVR1I0rTtN0/SDCM4y6sz/gEFzek87TWQM0zpAs2zk4pQLABK4SS9wLJCNDeO2008VYsGSS1PJNxKfBEBIShaGYdhuH4YRxGkai2l7VRbBUAZDw8PsCTRa8fZWT2nFPfWTkuWS2ibG8vG1IDd32ecvclP5gWoPc2j7BFva1DdFJL+FsUZ1T667FCA7mfZJz3PESslKl9LpSUmUctlKroEK+VioV0pzQqd86ZV
|
||||||
|
|
||||||
1XanVy0GsappBo8h9BdF0doHROlAR1Aa5Qhq+hGpIE641RxhilFNaMV9IBzQTEmPIS0SgrTWiJTacFiyGXQLgZI8CjpILQLBciswkqtnbFdD4tkT6DmnpAF67M0D3Fup9OcnAfp/VQAOAcJ8wqYNKHuA8V0yYp3rBeI68M7zZDyDBF8DD3yUzIspcoXRRhNFtLdPskEnwtjosjJiLErpLz4hSE4tRvKHCOAJIsBNUBEzxhJDkpMoaojgGwIs6i0C
|
1XanVy0GsappBo8h9BdF0doHROlAR1Aa5Qhq+hGpIE641RxhilFNaMV9IBzQTEmPIS0SgrTWiJTacFiyGXQLgZI8CjpILQLBciswkqtnbFdD4tkT6DmnpAF67M0D3HXJ9OcnAfp/VQPiHY7xfigwPFdMmKd6wXiOvDO82Q8gwRfAw98lMyLKXKF0UYTRbS3T7JBJ8LY6LIyYixK6S9zK/BhN5cyJwBJFgJqgImeMJIclJlDVEcA2BFlUWgR8UwQl
|
||||||
|
|
||||||
PimOEqYmDijPBfPg4okTigLyXhvPsa8PjxE3lo3eZl96n1XqFE+OcnypisXjUIUBuT6FNjITsAFgk6kJqJZ0WooAYW2kWZQ3B6EYFvLVe26BHY1AaM0NonRegDGGGMCYgJIA9AkkIZMzwXg8E2E4k4zxfiuXBESeEsyIDKFwBBYM+z9SYDqQ0qmZ1mGjkyMQdpCpOnEPOhlKIpAoB03rhQOKuB1rNNuQqT51EfkqQgFqaiuoggXgoPIqGucCj51B
|
TEwcUZ4L58HFDCcUBeS8N59jXh8eIm8NG7zMvvU+q9Qonxzk+VMFi8ahCgNyfQpsZCdgAgEnUhNRLOi1FADC20izKG4PQjAt5ar23QI7GoDRmhtE6L0AYwwxgTEBJAHoEkhDJmeC8HgmwTihWeL8Vy4IiTwimRAZQuAILBh2fqTA1TalUzOsw0cmRiAtIVG04h50MpRFIFAOm9cKBxVwOtBpVyFRvOop8lSEAtTUV1EEC8FBZFQ1zgUfOQL9GGOM
|
||||||
|
|
||||||
YY4xpjahaQoqqbmTcjIn2WZZA449ng8BhOSM+kB+7gkSEOd4p8TJ/BxH5CBGCXj7DCgOC4d0ilbwxJnXgZKwVLDSn1W+ZV74QEfnlXUkpX4lQ/hVdUmof66gagAj0QDLTCs6ky3gmqYHmmAW1UcfpEFjROSgyasBprSOwQtPBGYswIAGd40hO1yFgvuIdKspqvH/Iyh2FSOJNibH+GPaRPDJzBgBM9L6wjlxS3uKSfh9wwqgzkf42SiiSjKOvH0+
|
bULSFFVTcybkZE+CzLIHHHs8HgMJyRn0gP3cEiQhzvFPiZP4OI/IQIwS8fYYUBwXDuvkreGJM68GJcCpYaU+q3zKvfCAj88q6klK/EqH8Krqk1D/XUDUAEeiAZaAVnV6W8DVTA80wC2qjj9IgsahyUGTVgNNTBuy5Q4KRvVLMCBekeNITtchwL7iHSrEa9xPyModhUjiTYmx/hjwtTwycwYATPS+sI5cUt7ikn4fcMK0jwZQtkvIkoijrzdPvHgy
|
||||||
|
|
||||||
8dqGI2LRqgJeGMcTmURJSdxQlnnEz8ZDDNNduYSDgKyMQNYnm+k5k29ALaJKBg7fVMWEsjBS2kfM2W8t8CK0bXpQ26tyha0PPyQR+sCBzuNqbYg5sCqjitlEW2pABmF2QqhdCJwsI4QQHhAiRESI+3Dn7fAAcqYQF7W21gSxdS4FjvHEdidSDJyrQgdOPKd7Z3hYpLaoKACaQw6a4AANJ03Ni0eg9B1aYD6H0GOmBcA9HoOixh6B5iLDpLqchzhW
|
xqMbEcSHDiJxU8qT1nxg84m3jIZpprtzCQcBWRiBrPc30nN63oEbRJQMrb6piwlkYKWFqZmy3lvgRWda9KG3VuULWh5+SCP1gQadxtTbEHNgVUcVsoi21IL0wuyFULoROFhHCCA8IESIiRH24c/b4ADlTCAXbm2sCWLqXAsd46DsTqQZOLiAzp05TvbOMLFJbSBQATSGHTXAABpOm5sWj0HoOrTAfQ+gx0wLgHo9AUWMPQPMRYdJdTkOcEyhZbxv
|
||||||
|
|
||||||
XLLeN5IkJEg3xHBFwiA/dHi1CSMfG6rK4TDnJMx2ePVeDeSSISQ4lKSSHH5XFUD2JcT4kJMSUkfGqT1gvtwaRN8uSityk/HdSiipv1KsqT+Cqao6gzP/PVXoDVWjAVq7qkDXnQMAbAmz1DRo1mQfWVBEZLUYNjHKHBSN6oOqdb6n8ZDSybE9cdb1PTa7zxuX6uxybvLOPxCpko4aNaWTcdGoRi443dlODiI+2NU3g1hQ20c2a4a5tCSmTRT5tE6S
|
JEhIgG+I4IuEQH7o8WoSRj43SZXCYc5IGOzx6rwbySRCSHDJSSQ4PK4pAexLifEhJiSkm42W8+fLL5qulQ/PKz9RwSuKrDNT0Av5ytqgq/+2qvS6qtGA9V3VIFPOgYA2B5nqGjRrMg+sqCIxmowbGK1C1c22tWva75JCfxkNLJsd1x1PWdNrvPS5PqbGJscdjfFgjXrdiRKl76MbuynBxEfbGyaEBo1QHImGSjs1BJTOop8midLoo0boiQNyKBXk
|
||||||
|
|
||||||
xVo/REh7kUCvJUNgnJNDmKmApKY9DIAFyaFeHoe5lDYAQ/cSgbAry/VqPgc4owACyV49EJbBV8wbxRLFTHiRAFGtiVIlq4p8ckYV4hVs8c6kovISb1rkgdvOUHyhdZ631gbNcMXoF0di5yG88Twg+GcTlbwPqOQeES7QUISImXhHCaKp9GUOaSiSF40ISKd08qFaH9ZpMJTBPytTaANN2blQ/PKz8asGdldp+VVVFW1WVZZlz+qNVQNdF1OemWBB
|
qGwTkmhTFTAUlMehkAC5NCvD0PcyhsCwfuJQNgV5fq1HwOcUYABZK8OiYvAveV14o5ipgxIgCjaxKkl4Y24uSMK8R/1uMdSUXkJMa1yU23ncD5Rmutfa51muqL0DaIxc5DeeJ4QfDOGyt4H1HIPHxdoKEJETLwjhNFU+dLrNJRJC8aEJFO6eVCiD+sEmEpgh5RfbgFqb5ciFblJ+m6FFFTfqVZUn9ZU1R1BmEz9mdWqqga6Lqc9FMCEs6Zlqjn9U
|
||||||
|
|
||||||
2asy1NzRqEG0OLRNNBfni0zXrDa3BYTjuEMdX8khEXXWljRdQr1nmmnq4EP6sE3wCXrkJ1lmNOWhyCNeiI+kwNiUJvuObsbsjKvpvJko2GqjEb5vrKdotF3MbBtCjCO7NafHPekgEim3aIC81qvuUOgtI5cE7RQZ9Qc+ZZCTwLcOQsRaDqyMO0dMsoBy1NlO7g/KVZq2NounWK7zBrrr+UTd27dR7ptgGQ9MG4OIeQ/gVD6GOCYew7h/D96MRFn9
|
INoagEMJq0GeZFzNes2DfPBJ24QwLlatqhb2si6hHqXP1OCwIX1YJvi4vXFjkooaNY4sy9G369JgYErjfcI3/W9wyJ8bWrTsNlGIz8/WPbxXDtcU+CdmE52lflq8am8mysO0QF5rVfcodBaRy4G2igD6g58yyLHgW4chYiz7VkAdQ6ZZQDlqbcd3AeUqzVsbOdOtF3mGXZX8oa6N26m3TbAMe7IPQbgwh/ASGUMcDQxhrDOGb0YiLP7SP0f08IDj
|
||||||
|
|
||||||
nHhPOeEDJ/z6nr9P7WB/rQEnTNkBBLAe3t2cDb2EUfYkBNqbu4ZtzYW0t7AK21ubcI++cFDdyMbFhPDniRwjivFS2SPLfcNg+xNgh5j5YRbJbpOIKQBcIABN1NuUSdoxEhWVoRcszgx5DgUpBVL5NVqdxVac9Ms0GdYZcC1QWczNf4CEOc1VXNucnNedtVoDNNhc4Exc/ATU9dJdzVpcnJbprVAtbUld7VVpVcI8XVdoKFzgYsJd4t/seAktr4jc
|
1nhP77P2sG/WgJO6bICCQQIB3HWc+ygefHBIFg3hu7lG+Nyb03sCzfm0tvD74QUNxIxsWEEOeJHCOK8RLZIjiolJXxIex9YRbJbpOIKRucIBeNCcOVt9JdEgmVoRLJTgfh+EwCCc0AidLM9NRV8pxUqcpVScZUqpDNGd6pmdlUHM2dbMOcNUwDic+c4FBc/BDVNcRcJpxcnJboLUZdcE5cMw7UHVvUQtnVSxzgIthdosPseA4tr5dc0BxFtgewwC
|
||||||
|
|
||||||
0AMttgexoDsswRHgbdvois0AoQ7JGNex/8fw3cEAi0FEYYVF6sHwmsnwGwiMPxA5ZkxtQVbR7g+YuhSAeg6Z9swBDtihjsA87FT4fgy0XFiVw99cXlHtfEqtPcSggkQlrCnxEkwBolUi4lZkUi0jbokD94bokQ0D+E5CSkyl6x8AKkqkalWJ6kQlRDr43k2kOlP06EXxekEYsgj1YN4MkMUM0MMMsMcM8MCNTkFklkXhXhvgW4QjHpfgg1ncuEsE
|
TcwQ41zdFxss0ADhR5E1PhCtitStXdysEYc1glqsnwGx8MPxA4pl+sgVbR7g+YuhSAeg6YNswAttigdtvcC07ETI6MclnFU4hJg8rtQ9ndw8Sh/FAkHwXw4kwAIk4jokplYj4jbpYD94bokQzgx5Dholily1SlylKlWIalAlgiecmlblHA306EXwukjCoB90oMYN4NENkNUN0NMNsNcMjlZl5kXhXhvgW4fgkReJvhooLgdk9kDkRdBMCRvIPJwR
|
||||||
|
|
||||||
jkD8dkiUR5V5wQiiyU5lCBzliAajGkfVDR5DIA7kHlHBmjDiojBdWkgUG4QU6iTjAUvl7i64IVUQoUG5YiEAINnw4IXC3CEAPCvDH9WtHDRwKNDhEgnFsZOJv9opj5j5UQKV/htBk0T5kReIrINl+NtVeCWU2UR5IcpN98koycsC4CecRVjMJAJV8opUiCjoSCv5WdzN6oqDmoWC6DwEMcdVKS3ROdrNaCShjUJcQwuDfMeC5cSgFdgtlpQs1crj
|
kDiVplCATliASi6kvVDQpDIBrlKj7ktdHlr5nlXl3lAUyiMA/kziQggV79G4rl8AIUw8EA984Vyg7CHCnCXD3sLCvtRxSNDhEgVlsZOJ39opj5j4f8NgW4F5E0T5kReIrITgiQEc54ODGVmUR4gdxNt48cUplNID2dBVacJAsDNNKdJVdN8DPsDMGdf4CFSDmp6DKDwFEdNUiS3QWczMKCSgDVhdRc3NTV2CpcSguCbVlo+Cgsjj+sVcKF4hRDPV
|
||||||
|
|
||||||
ShIs9p4gpDvUHtDcroEQ4RsYiU1DLduwo16xss7duA4RNlHpsZmNCATCzCY8vdLD2iGs0xrFUYgjS0nEv89hpF8YHiIAns61o9qtlY4831+1P109M9m1W1wyuky8S9jcy8K8FZq8Z0PlW8JAG9l18tV18B1028zYLZd0xZu87ZQUz9ptZt5sKBFtltVsNsttQwH0Z8n1QyYz20IzRxv0mY45196Qt8gMQMEDi1D9fD3s/jyg+gMITgFwAArCgTQf
|
LsdcroEQ4RksdhVDuwI16wTcRF6Q4Q1lHpsYGNCBHcU0wi18IBM04YKtxSSgvCDtC1BwVk389gLUK1Diq1njJ1H1n0e030k8U8G0m1/T2lC9889dC9i8FYy8fSV1Z1aoa9I0Xk698B4yJAm8LYt0xY287ZD8hsRsxsJsKApsZs5tFtltQxb1x971I8/SW0AzRwP0mY44l96RV9/1N9cSd8Ck3CHsD9yg+gMITgFwAArCgTQfACDOmWDfYNkUYUcq
|
||||||
|
|
||||||
AaDOmBDfYNkUYWcqoAAVVGCfRBIkBIzUyB1XhALHiuHxHySJRdxY2bnYwRBPlWSJAJFXhxJ5J2ESBWLEwmM2PgN5RxDxEJCJAgLJCgMwLIwpxwKZxp103pJlWIKgugGZPIPZ0agFJFyFMFw6j50E0YKFzQs5OFPF29TFO8wtUlL4PjAEJTGV3lL9O2nELBWrlYN11rFaIS2bCGxYXO3xDmIOA2S0IjWLWcQEsK1+npGPkgMBl7Aq1MK+IsJzSdKS
|
oAAVVGHvVvzmAQAWAJ2+1Xn/zHiuHxByXxXt0Y2bhYwRBPiWSJAJFXh42oIE02T+B2AGKWKgK5RxDxEJCJGALJFAPxOIzQNU2pJFQ0wpwzVwKpJJJpPp3lSZ0ai5P5x5J5w6k5z4xoN5wQuZN5KF09QFJKHc3QUl04J824JTHl0lIuO2l2goWrgYI11rFqJi2bG6xYQO3xADRPnI01ODFqEUKjTUMt1XDjV4kBl7F0O9IMKzXqOiKfD63MK0Xqxq
|
||||||
|
|
||||||
JG3ax20B3awLnoFqFwEqHW26CQFoiO1dLOynAxgJQRy+AiMuNrS+J+MRXKE0u0t0q6AIJa0xTBPrHIUenh02WDS/xhBDx7CRNhziAR0Y14M8gJCMKBFxOHFRLhEenyRPlujOF/KpmSi7PJIgr5NwNpLp30zgsZIQtIO/jZws1QuoK5xAS5Ps3511XwtF3rBFOIqlwlKtQC0osV2oqEKIUiMLGVIoRODVI4I1JakUN4G+G2His+BEu7Gt3y1tx0KE
|
0az6VqFwEqAW26CQFom2zzX2ynCO3+Ehy+CD09M8Ru2kmhXu1hUewdlUvUs0vXLRSsP+O4EeghzWUDTfxhEDS/yhMxXB0hzow4M8gJG/1HAgPYgWRPjCiHHMk4ruhPJxy5WSibIJMAo5MwNApwMpKOj0zVEILpOM3grINZxARZKsy5y1UwoF3rD5NwtYI82FOIvjFlzIt4IC34O11KFlOBROAVOYKVJahkN4DGO8jCh0OTLS2DCHFUL1O7FCk+Hf
|
||||||
|
|
||||||
rXDsgJH4q2ltLkpq29ysL9xKECPOw4ku2TWPgstTmrV6sj0DNQHMNj0DgkA6D6z6GzygHW0DGiBcogHIAzzjwes5CetqleprHeuVSHQTkxyTMnWnVuvTKNgXVqkbxzObzzIzPQHbyLPrC7wPSPSnJnPnMXOXNXPXM3MqB3L3KbOnw4FnzuvQF+v+qyEBuYGBujh7N/X7IA2339LThJJHL7FspP3QEQkqCaAwg6COAAgAHktz6hqhqhxb6BqgmgEN
|
zugtVNLBiKwkoUTd1tM93tKsR9ydNxSMvdNcQuOu2rQspdwj0DgkA6Haz6DTygAW0DGiDAsgHIGT0j1us5HutqieprBeoVX7QTiRyjLHQnQpk/HTM1kTIXWTKXTTIbwzLNizPrFb13X3SHJHPHMnOnNnPnMXMqBXLXKrLHw4An2uvQC+p+qyD+uYABujhbK/XbN/UtI3y3y5Vbl3ysrAwHIkEQkqCaAwg6COAAgAHklz6hqhqhRb6BqgmhYNRyjA
|
||||||
|
|
||||||
ZyjA2RtcKZ/tds3jwSpxlk1k+IoRPhHoQj+UKUx5tAYQ7oTJkQ/hPJXy55pFideUcjF48jUCfgiiwKhVsqELcqPrpVip4LqSAckKlUyrVUOSGr6isKGC6qKrBSqrCK2DRSWr0FZcKL5pOqXSQthCwsDclTNc9pvCddYsOCZCiNiij9ksA1PIYQeBk0w0DTgwl4RLTTSScjfKZK7Tgys1trFKNEnxRs7CdE2tmsOt0BiAhhbQ4B6Bv1SIDL/CjLA9
|
2Q1cKYPs1tQVvsl4Fllk+IoRFrLgKQeVf8F4YRlq38qVu47y2SLUkqd5XhF50iECsjkD/z+UMrgKyTXqrSILcrgL8rv4jM4KlUmSarjiULqCqqSruSyrsLGD+SGrCKODvMWrSK0x2qiFTKnVqLgVvi6LItmDxD8NJCWKLphqkQSI6NE0Q1+Luwl5Zr1DuVUjPLxKLSyspKVEZLesGtVs/ilKC5iAhhbQ4B6AP1SJtKPDdL9qDLE1j5jLAiLsBD19
|
||||||
|
|
||||||
DrMZjrncfSPE/SAzNr6wEi80wkXwsinDYkSlMitFsjXgXaUCCj3bDg4lSjHsKiDAqiLlaiLrXlWkzink36ShTimiulv7rj3lbjvkQgFT3injgVQHKItb6wPiYUPdvjK7fifxQUJ6p6Z6hAmLlYNa1KPLuxwQh57JzJvgewl4GUYcjIW44hYQ7oewSQiU1woqYDcSCR8TThCTQDiSZNSTPbsDvag68CYKX4A7CqBHiqWSKDtjyqI6MKWo7NsLHMo7
|
QjbtLTIjjCqsnxkjrColCkkiNEUj7a4DxrMikCcjCk8irsCiDAijTlSjM7jiKjWlqitjpTLibkn72l77yiXl/kG5ziv637f6PkbjKINaHiniLTXibL0AB6h6R6hBaLlY1be61huxwQh57JzJvgewl5aVQcjIW44hYQ7oewSR8U1wwr6wIqiKMTTgsSACcTJMkp8c0qGQgKoKQLydsqdNfaOH/aiD6SVjiqQ6kKWpLNUKbMw7+pqrRG6rmC8LIACK
|
||||||
|
|
||||||
+p6rZGmqOCSKSgfNU7eD2qM7ZSCFaKAH86GLcAMIhrTpwtNTzsvT6UCRmN1Dgx7HLdW6hKEQra1q4INqEH5K6s+7BCC03SDqPSrJvgpSd8N6jGt7vHobygwyOy4yjUu1qbX12yP0EnlpQaN9xqIbK8oaQzZ0UaIAszdYmBcz8yJA0aPrMae8j1BbhbRaJapaZa5aFalaVa1bvNmzKbWzkm4m0nV8Wa+z/1AMzq99uGebikxzj8JyJAhBiAtzahnA
|
Jck7ZoSK7TpkKKAGqKXVcAMJ+rTpF6hqbFXSaUCQGMlDpr67BKeKEQTJTgVqzT1rW7JKbTpKdrIAHT9Ki1ERAYvhjqgiAGzqNrXw6yQyGywz9V20Kan0wnX0Inlogbl8RrQaS9warrXlEbobtZYadSmB4aoaTZkava0b2991+bBbhaxaJapaZa5aFalaVa3Nqyybazon6y4mF9Ga2yf0/1AiuymGZiua+zrLeb0AhBiAlzahnA2BqhmBbRqhlaoB
|
||||||
|
|
||||||
2BqhmBbRqhVaoBsATg2AOxqhzgtz9ziMEAFgjzta+FsZTyLhHp+EiQ0cKHnJHhgpId1x7JAZvJnd0d+dhNPydhvzJNUrZMAKFNgLlNeGKTqqcr8DYKRH34iqQ7Sq2TpH1UE7ML6C3zY6ZGUXPqiL1GU6ZcdHZp+DM6aKc6wGtp+qwVORzHuk2L/sOKkGrGzTSRoSiQZrMdbt5rtCxLuA1k+L+Fpr1qwZZLomHSFK1ElLINR7VKR7bCC4Y42BNgKA
|
sATg2AOxqhzglzHKCNNyiMUbUG+FsY9yLhHp+EiR4d8HnJHhgogd1x7JAZvI7dUS0KHyhNnzhxXzRxbapNPzZMfyFNXaVN3aOHPbuHqc8raTYKSDhGVUY7kKqC2T0K7Mo7ELYWIA5HkwFGIAlGmrk75pU7yKOqpTCweqQJ9GOlGKPtmLubpCroOJQpeKUTJreERqzsmWLdRFlkDhj5DcW6V627XGO61FZLu7kHFKzCC4Y42BNgKAmg+hsBEJXD3C
|
||||||
|
|
||||||
mg+hsBEIfC/CwAAjC13SjrzL17zqrLLqbKkG7KJB5XFXlXVXDmHDJGIByESIF4iRzIrs9TV5ET7nnBAYF44RcUv8/hsYnEjSZ5cTPgXhQp4RDhLhLhbJrzHa0qyTwKGRIKBHfboXDMmTTNQ7EXw7kXDVqqFHeo+TmDI7IA1HkwNHIAtH8WwmDkiX9G5lDHDWxC3VcBdxqWjHLpzs67+WOJArOXBK679SCsXHkD8Q9gtxO7t6e7HTxXdrIB9qTLdW
|
wBPC9qC1p6jqTKX6vTIHqW3iJBJXpXZX5WtnLDBGIByESIF4iRzJ/d8VklISLnnBAYF44QsU38nzi1tSZ4NVDcXhQp4RDhLhLhbJEruzuUAXCTyrMquGX4eH34/aIXA6oXg6YW9VyqJHeoOS6DQ63qcL5GE7lGRSsE1H3G9RNGtXlchC9pdwyWAHLoDseA411wOIexuLeBHgrHRE4D8Q9gtxeWLrwiJQtq3GeCGJVXHT1XZ7/GF6uqgnnH0nygAB
|
||||||
|
|
||||||
Tr9X7tLH/SYiRXXw48ABFZOUgGAB63cMxyMndvdg9tgI9kG4vMG7JovcvSG1M6G8pzWeG7M400ppG59k2QsqpksrG0FOZhZpZlZtZjZrZnZhAPZg58mx9KM9AXdpgc9y95mtgXsm9gc0Zocp20c4bU19AaDcWv8W0fACgHgACc4BALcnkSkWc4gP8Wc5QNVv7ew5/RuM51AINdjMtR4FeIlEyckIKyh5xEKBEbGMkHYcEL/T5wTB27m525AsKN29
|
FZOUgGAW63cPRwMyPZdpgNdtgDdwGvPYG5J3PIvMG2MiGqdTJiAavHJ43PJ1MgpzM4pnM9GoFcZyZ6Z2Z+ZxZ5Z1ZhAdZzZkmu9IM9AHd1d9dzdpsxfY9jsvp9m4DIZnrPV9ACDUWv8W0fACgHgACc4BAJcnkSkUc4gP8Uc5QBVn4u/dbb7ANFjT1glPsfFEyckPy5yPsIh3i/7MkHYcEN/J5yNkoL56MNI+Ak+7IlA1h9AjqaNsVWNsFhNmCpNv
|
||||||
|
|
||||||
A6A8nJN/h8qaCyVYR9NuFzNhFv+JFmgrFzTAt3k6q4t1RnF8tvF8i3RoLOdvURtka+iltxs5iku1i2whLCuqZqu43CeINOuhugrHWluxayydYk+d4SdzdiUXu2d/egelSnBmVmZgHIQBcXcSwGAO4eezVxenVlevVyykaqJl7Dm3e50g+s+o+jI6r5rc+3Iq+04G+nzzV++nfR+6pNQaoy5P05kD+v+v03+x5C4kagboB54qBoxu5YBl4ihPbd4/
|
+aF8g1F4nDN9k8q7N2RvNjFgtnF1RlO9RstwlyiklysvOsQilounYoxlSTZMKANRt6uoRU3YcTt+kSyVeRtkeE0xxvQ3xFx93deuJOSnusV0Z6AIQBcXcSwGAO4ce5VyetVv3Geu3ad065egd1es5Tu2Jfe7exImIgrjJQ+x2sT5A3InSkpZkQotQYos5C45kR+u5Z+wavYj+prk4oB/+it+sa5HrkBuuMB/rx4huZ4qByLqAaL2LwgeLk1lByAC
|
||||||
|
|
||||||
AaFY13z5B5wnSDLrLwgHL613BtYbgZNLj15uEMkCRFKj1luVuXie8ikalM4TQ0cWA5lP4AkjlThgFnhjKxNynDqSFoR+nAq2FsR+F1kgznNozvNpR7k2qotlRrFstrzTRsitqwljq+txz0luiil3AJj9ziXcbsa8yYeZl7YNl4tE4ML7ltAHU7/cEARQVtNcrnxn3PerqgJ4y9GIcHEA4Ih/lX0yJjd5nmJ6MvteJjmb63p1JgdDJ69rJ6WO95Mq
|
1lZPEO5uEMkAcRNE80ldcPETj0kKeN4M4Dt8Kn1gkWhllfEBht8qmFK+sVAthoF8qdTGNrTH2+NvhxN4g5TlN1TtNqR1kyqrNmR1F9F1zfCoU81XF61UthXTq1+7R0sCjyzxUwx+tsvPiOls4Pi1z7sAI3J1zuajQh6Jj26ftkrQLzawwwV0dr3cdrx50g4TBnlD0vrkI8yiny6kJtp2J3tWqqJ303nxshJo9pJ6WU96M0vNAcvSG69293WB9g2a
|
||||||
|
|
||||||
vNAGvT8L94ppvA2QpypzvP9mpmDQj4j0j8jyj6jngWj+jxjqfWDtssX/plDtDrJjDsorm8Z1uXmk1/miABcfATkbAACJoNkUgZwJocWwGegQCTQPoI4cWoYa1w88k482ybHPiQLpeZ8wTh5i555nsUNd56857oTD80TX54cH80cONwF+TOxkF0C77r2iFn2qF7TxnEHvTsHygwzyqqH1FmHnCjF3Nw6Dzaz8U7RmtmUhzlXXOxUlz0seodt1AMup
|
959lvV90pyDdDzD7D3D/DwjngYj0j8j0fED0J7tcJzptgVs2DlmzshD7sEDXV6BiABcfATkbAACJoNkUgZwJoUWwGegQCTQPoI4UWoYE1wjbcly6X2yFHPiJzrWtZVjp1w5m5nsYNB5k86hnYRIR84TF8sTG775mTMxv5v81KgCx7qNj2rKuTvAz7xT77hklT0q/7uFwHtCyOkR0H3T8HxRyHrzQzvF4zuHolyt7O3AeoWt1AQupsWz9HpHYcI7z
|
||||||
|
|
||||||
sY40arUiYt4ZapxkLpKQcKn0RBNeyJeRjaAm0oVruuIuLmd33RL5SqVlL9y2V0FOAK8eMfYCgNFKCWZQejShDUgI0XcIQEYGeB9ARAf4OAFuQ4BdBngV4IwJIGwDbYNarHdVh1xOzasgmS7NeiVzXZlcgyr2Nbnh1fQv9GIb/Dpq+Hv62tyElIXEHzx/xf5k0zdD1l60hC+tv8kbQNtJ0NJcd4q9kI2n2EySfc+UYLLKo3xTbN9AeMLIzBp0Qrt9
|
4cxmupKQcDz7gONeyJeOjMA1ap3PloL7akw4VpS8L5yvuoFOAK8eMfYCgZFKCKZOSguegWDUgI0XcIQIwZ4PoEQP8OAJchwC6DPArwRgSQNgBWxq07iirC+h43p7oxUuGreeplw55yJJuP4K/jf0Yh39Gmr4UVhf32ZiIEQ2gZnh/jfzaFWWfcMHC6wAJ2MPWKyL1kCB9akg8QcIV0o9G2B7BKGgnMNndyUwV8pOWUavq9wpJxsacz3fTA3zNaKp
|
||||||
|
|
||||||
bWKqCzsZ3kYx04ecddCgjys5I9K2KPfzGjz0aT8nOa7WfntCaAL9CeV0HgZkg2R9t322/eeOVn7aiVREJaU+DsjsGeMz+U7S/mK2v7s9/caAxdkV2XZYC86OA66vaS3bJN58L1N6soA+pfU4O8eYOFEKBoxCr24sG9gr1l73tcmj7fJjDXnSZlX2JTd5J+214/tde1sf9uUB95+8A+QfEPmH2eAR8AIUfGPnHxg4tl4hkQhmkzS7Jr50O7NQcnJx
|
tOancRhHWB7IssKubOOvVTFyNUoeg/GHrTwITltBqiPPaE0Cn6DV5+10VeGkmRKts2WGsK5hv3RinxNkBWLaP52CZDtqeHuHQXAPzQTtEBU7TVoNTnaH8F2EgKfI9WerKAva71UDlHmDhhD/qEQw9uLGPbi8ReZ7VJhe3SYFN5eteJXkbEbxFNVe1sN9uUBd5u8PeXvH3n72eAB8AIQfEPmH2A41lohoQ2mvTWg5dNrevTctGnDDac1eyyHJ3q/3
|
||||||
|
|
||||||
w7jkUG9lX/v/0AHADQB4AyAdANgHwDmOT+Rbux14yoljqG4MeEiBJCZ8B47GdcATnrqPRlqHArOESCHD8IaGnkNjHcyJxydQ2/wBNMGmHghpg0QbGkJlTU4iCpBqbFvoHSkHiNkKYdeQT3zkbR10WygzFiCMR5mpSK3BVHvLjrZ6CseRjQwRQjaH484stLcuiv07bcA14k1R4eT3dbWCFq1PYtKlgyxvAmGp/JnrgI5q1ZWeVXJLnf3sL7c0ueoP
|
f6f9v+v/UgP/0AHADQB4Ak1tAO+xcZtAcaPWvklBIkgk+fYFjOuExxV1Hoa4TPj6xeCHd+ExDTyMxnObY5ehnwReLbkDTDwg0gaRgbygEHsMJBILWvpBQkH8NCqQdWQa3zEbh0EWnfVNodGcx6d1BidItpaiM6w89BhjAwRQgaEo8C61nKWHP2GprxtgHER5tYNXAnldSDdcjPZFsZWC4ILg+dhmmHY08N6XdM/vgMEYYDygPQP8Gh3OBXh9A8pR
|
||||||
|
|
||||||
8AR3OBXh9AqpPLlq0CZTgHEoRA4OETOqrtghQvOkYEkuQSswAh9M+nV2SJaJKMLwKeL20uEJo+BWxMAGbkXhO4nhBKPiP8DvqGVykzISoj1xfoHFxuDRT+hcR6RpA1ER6aof70D7B9Q+4fSPtH1j7fg9QoxDYMshJB61TuwaSyESB2CU9WihyY5COQ4SDgewXwXsBJnSq2Ezk1oq5KJBX4jdzi/9JtvURuJTdfkw3CBncWm4LcYGP9Zbp8QQZ812
|
Liq28FTgfCDifwv4MMaBDsufiXLkK1CQlcasO9arpvQ0RkZDhQ4Y4cOFOF9hzhT4X1v8DjS3DcUfEf4FVwno1cyk19errfU2ImCTi+xZ+p0jSAqJ90pQ93p7296+9/egfYPqH2/B6heiGwBZCSB1rrdA0lkIkDsHx7S59k9vDhIOB7BfBewomPgQyTWIbFzkokWzh11a6f02e39U4gCiG7pjAG1xL5KAwfyohwU43HVsMx5oMiJATIlkWyPlKUc6
|
||||||
|
|
||||||
RPQTkeLW5G8i9uqXO1tiF+CQheIBtDhGcCjEAFKGt0MyGsneYlo/g0UAviwyDGsp2G73LlBX25qpjz4Hw37llCb4A98qEgjNmQSzbg9gRtmMEbD3M7w8oR6gmEcjzhHaCER6PJET1XzFjYceowEwWu1xGRpWU3PdEuT3+B796Q74+TMmhBiM93cwvUVr4wS4+C9qfgrnoOAHCMZgiQQxUiEJuq5DYm0vTso1SSYvo+mMvAhJk1LyK8H2KvNMur0K
|
sBApbtiF+CQheIywzcMsnWG3QzIyyB5odj+DjF+ODKP4JiVZTXdPmvAlhs8Ke7Co3hb3HKh90+FfdpBjJYEWqg06ItpGSgnNmix77GpBSbBTQdLhLaeCTOGdHMfCOBSjBjBaPYav8CZRFp4Sbbf4HYJFyIgZMiaEGM4LWoBcuebg9uh4LapjtuRCAxnn4T4gCjZ2WXTnoO1NblB2mfPXkgLzglC94mBCRJgXgl7ntpecZOXjDQV4plchM6JGuuj2
|
||||||
|
|
||||||
Ga8W8sNCpmUMth68yyYwv/gAKAEgDSAYAiAVAJgFwDreHQ23u+hwk0g+hTvAYZhyGEe98BXvK8DwE5C7hTguAJ8YsNBIUDsQWOJjD8CJSHA/gMURgb2BeAjjj4f+M4ZOJ5KqFUS+8IlM7nnG3DxmS494T92TbfCxBm4nTm3x3H6dO+EPbvgeLRZHjoe/JFQQRVLZnjOCsI1qleOlKIj/GcpZEfeOMYtsEMz4vOq+OLT4hAYw4NhOT2HA/jjcpKIl
|
aQASmeZcoEMI/5f8f+f/AAUAJAFgCIBjQlptEPgnC9z4MHJJnB26EAZehDvMsfvgrHoArwPATkLuFOC4ArxdYpyma3IT4gF49GH4PikOB/AYojrNHC8B7HHwv8RIS4IOJFy9hFh+8fFHbnZTjiBmsYp4W7Sr7Asa+c4sQeCykFFVfuLfCzACKB5acQefwsHnuIh4HiB+R46ESeJH5mcq2FCWDNeK6qmCAxgMYcGwjbbudrBRPEakSnxQ3QHG341w
|
||||||
|
|
||||||
DdGkQ0jgJ0oralfzZ5Z1fBgo6CWZUCHijN6Uo0Id3WmBx5AALCCAAGEEAC8IC1MADSIIAFYQVAIAD4QQAEIgqAQAFwggAbhBAAHCCdSWpfUpqRL3iHNS2pXU3qQNJGnjTJp00+MukLHRiwleeTcIXkONjBAegtrPWCUIokA4ww5Q/dPrz9K+wuJyTOaR1O6n9ShpY0iaVNIGaodWawzDmrviw5gYRJuHL3sAjYDQYjAygIuurVZFtj7W7+H/J8Ae
|
VaUpEAS06QEvSiBMOp+DkBgTKCfoWCHoBAALCCAAGEEAC8IHVMADSIIAFYQVAIAD4QQAEIgqAQAFwggAbhBAAHCDNS6pHUmqRzA+rRNapDUlqe1K6l9TBpw00aeGWSHDoxYkvNJtzwyZ5CJAwQHoGaz1iPtr2TMCCJbDV4USAGvsJoZHkmlNTWpnUnqQNKGkjSLeVvbiTb3g78SkO/ZYSViyIBsAIMRgZQLnSQa/EIu5rTfs/g/yfBjurwKyNwJJ
|
||||||
|
|
||||||
6vArITDVjFpO+DwhdJdDKeAZLnhXYkgyBVZGDlPj8CFxlkhNg328n/ctO4gxyf8NB6yD2Sg/TVKZ1wrOZfJJbbFknWaqj9q26dezuFIMaRTnOOPPoHFMVIJTrs4IVZPXXJ4aSSRXLffkiAxhpIYuIE6dl4OKkCjOexaZehVMwFVTBeUeWqRfxtblBAATCCoBAAjCBNTAA7CCABhEFQD3T2pgAURAZpceM2ZbNtn2zWpHU52etPl6bSJ02QoiU+0K
|
QPAjJ3weEDpNIZTx9hbJf3EkDgJLJ/sp8NJIX2YYRt0qtk14fZNEHyd6+BVSFj91+HuT4WnkgHpyS3E6dVB+bcEYW2apD8YRpnLRiSz6BRTX6MU0KOCCWRV0226kgnq9BSmgkMYyScnhVIpHuCQuXIwqSLgOqGUSpvEmdq/SFHQTLS2iCQIACYQVAIAEYQGqYAHYQQAMIgqAa6Y1MACiIGNOiHGyzZVsm2fVKakOylpYvFaaOnSHYTL2m0oiegB2
|
||||||
|
|
||||||
YHSjpH7LXqdOgDnTqJFQq6UYxundN4hbs62XbIdk+zehgzfoSMxd4BhfpyxSZgDPZEtArwFASoDwCEB/ghArYh/pAAoxfBgoYOL/KfFtq58dhRSBIG83fFwTAY/KQvkZOOobI66qOLhsOSskCobJ6nMVD8Kpmt8aZMglCm5PjogiTOSg48azMs4czcWXM2zjoN5kQSG2AsgwTjwXAiyuKU4Y/muB2Bb9XoYIVZBlODB8Q7ol81eMrIKmgTGRGPBd
|
l7TFe9eLaZ9jDCFCd06vC4hdNYmR5nZFs62bbM9ntDLeTNHpqzR6EDM+h6AmwuUBaBXgKAlQHgEID/BCAFuoM0jF8GCj/Zzaq8TiGnyT75IEg9ze8X4UBg8pqGChYyVCFMlw5GG0BKyQ90EHElSZIg8CvOPEHCovh1Mpvq5Ojp/D1OCgryczO76sywR+4jQYFNFLHjAJEpHmeeJJYLgBZrFKcLvzXA7AV+uPJKEshfHkgvgetOWV+IP7Cij+I7A+
|
||||||
|
|
||||||
uVKxg4x+eETKKUhLCH1S7pXshaU9OWmvS1piTSXi+gdmPSlpL01aakITLg0CJgc1AKrwKaRzQ5RQspoUyZgQQY5l02ifHK6ZU1YFoC+Bc9JWlvSHen0zfIJJzljNhy7vAuSMI24SAjAs5fYPUApCEBoOEM4ejXPbFGQyGoOb/JaTOBhiBOmk1uBv2dzeRew64IlHbUEz9yTJQ88ySUEr5fdVMK42yVPPsmEEgekgsVACN3GuT9xjM1ed5KsWsFh+
|
btWAlqyDKPEPiCzxOplTUBlPDaeUFtm3TZpD0haY7Kunuzppd0uaY9MWmnsIyINTCX7NQAy8r2EciACHPwn5NDpUck6UUNjnnTmm5NR9BApmn3T5pT0hmhnO6Yr43pvE/ptATzmO9IuRgUcvsHqAUhCAQHVWiDIbFgyjIuDP7O/iNJnB/RLHDSTdDbiz1vIvYdcPiitpokjJM9ZEo20HkEzw25fGyYzJk7YF3hvDRcc5J+HeS6Z7fSRm3yZld8fJ
|
||||||
|
|
||||||
GgiAFWx3nXjdBfMg+XeMFkF0KEAEU+RdDGr/Au4CIM3F+NOD3zZcCIXjhdzcG0jDZ9I+Lt4JKmQSypWs0yldlDwcsc5EoxCTVOQm7TygcCxadQsgUuyQF80qhRAqQW+z8JmQ7aTkN2lfscFZE5GpHIIUXTSyvea6WQp6YULylRSypbQozkfShmDC7OY9ld4sLhh0zUYRIBaC2gOgtQACAuG3akDXKAOKGRsDXjw5dJLcQGGsn+DQFWMqyeHB8Csj
|
u4lguzIM5BSuZIU2EV1QvG4AAIZ80ugli7gIgeWOI4MKcAfnkMV4CVeWaAr/ECs8pKsqen7h8qnYIJOs8qdEtgkSBqFiC6BfQsibjSqF8CyBbQuQWJC0FJ7VIWtIyEbSCm+CnIeHKDnQBiF2ZUhWdJzHxzKF4CwpTQqQUwKGFL05ml0Kuw5z2FAkgYZFxaC2gOgtQACAuEXa4Dasskx/EZDXgQ4dJMJJGf8DAJMYlkEOD4FZGHjIkHEYBLPn/i+A
|
||||||
|
|
||||||
DwNktdaAoXyAJDwSQ9kVHH8CXjQEdFqASkKiUOBFIj4yaC4EIM+Hkz1xlMhybPLMW0yF5di/NjYt74+TIRQ/dgiPyClj8eZVFJJR4pEIoiceMcPxX52jD7x4QPwa8g4yWrhKkqRKCyNeTynCsVZngsCYko1lL00lq9U6lkuqkGy8lwCl9F0HWx9AAIWoMIG+2FKYSDEXKnlSwARqZCUFHHagWsg2REhkQfGJhuOiyEpkg5uQxpQgEOm4KTp+Qs6Y
|
kQ+IWKZtmASE5EDFhhwfJEfC24MZR5LwmcWTKnmOSFOVMpTgvNplrjV5jMv5QwVBG98sW/fIitD1ar5TD5Z4/QSSxji+L4sB2O6PvCWTgTglIuUKC+Pip9gglpIrKeSJiXBdKs0K7+arN9yYw0uc9LWSgPOp6yfSeiBbH0AAhagwgd7N6khIkBdAmVLKlgEmVSFlLlkJA5ZMiSJDIhuMcMj0b7JjL+zMh17WpXDQOm4Kjp0c3Mh3jjkULWmj6blc
|
||||||
|
|
||||||
QuLKxySFUUhOeQqFXcreVYq8+PxLZpjLwmuc4SWwumUcL0AXQTAEYCNDxA/wLQD6tK2EWeVTIY8MKJcHhDmRzIj3AcQ8zhB4hrstkDJU4l4gnCtZyyPIsfB7C2RBwFIAQWPNU6riqSdkjccYq3G6dnJHfKRovNUHLzFB4IteTCvcxwrHFzi+EaFJvHuLMenio+d4rBRGgsVChK6AmhUXrgPGFuGweSDeFjhh2i1DYluEjHUivGVKiAAyJ2rNqv5q
|
ytZX8rOJHQ16YMvXzDKOaoyr6QXK5WYAjARoeIH+BaBe1z+ck1yqZDHgxUexdiMeFsoeBwg8QAeH4KdhWS8QDJWtVZcyn4Rv5h4iJXRSPMk6vKycsnByRTLMXfLG+QjReSi2XnyDARig+xSCKYJbz/JO8iFVoKhUEtYVcIklkaERU0sVIcaVReuGRJPix4L4xYluCDGSr9+5pIIYrP/HKzkuPgylUgJpXAK6VCs6YHAqmmtTupxS4aZbNgUTSulM
|
||||||
|
|
||||||
SjAUyvGUGtSuuSoBcbIkCFLBpxSyaTbNKW9KHpQ0/dX1MPXVLEyaC5VRguIkhz1VYc4oRHO1VRzdVGNGiZ0tIUU1jVO6yhaeoGUXqhljvK1d9ImXYd/p7CsehACWacgEAV4PoFAE0BGg6YjHGOOLR6C1BMAu4aoPcEqDx9jmpGdGgd3+iXBxivEO6FQ0xmZLbgzcD8iOLp6gEV48a98iJgJBfky+/zYmcOX/LV8gKJIECpWnr58MvhhivNRKAZLA
|
6npR1PnVeyMJFSrCVgpwm4KFVBPQhcqqaWo1Tp6q8haTQ6WZKl1s61dc9MznMLjVeC01Yh36EWrlKEAaZpyAQBXg+gUATQEaDpjkcY4otHoLUEwC7hqg9wSoOHx2aR96w5CDgf0VGIBtjSw8FuQ+R7Hv4LyaSKyVnxeYEg8+7zAvhZOgIfli+35EkL+UpBEzK+hi4QYmvJl18U1AdNNXqBXF/crFFVDvrmtXHAqC1oK7FoeL3nBSv5GjI+XCvCnA
|
||||||
|
|
||||||
855RaumV3yXkeS++ijKFeCsToOLzxmgy8WnTs7IqSWravOqiLBQdAF+S/Q7jiICWIg5ixophoSpubhKdgyaKeDlNflxKWeC6xrMyK87kC9EBcQgNBiOC2gjQkgBscgLNGlTNZQeHWauptXZLrKtYz3uyJ81+aAtQWuSW5QUm6FWUCQJ1mdwfJvAK2N5HFBCD7HeRGM2wK8lPHjX7DIQUIbGITJuhjyXlma/RZPJ0yAr811MkFfPKBEnj5NNVfvhC
|
oOgU/GfpvzRE2JEQHFHUZKosbzwyeyUhujsETRTwMpUS38TlKVkkrTCwMhSg2O+mEAIMRwW0EaEkBMiYB0oslQkqHWayhlATHMbrLQGcKzNFmqzTZr/BVyRF5CNcG5GtYbdLybwTFkxghBnAYcdGbYMeSnghryQkIKENjDxk3QrJNy2NVOJJlvLJ5Eod7jPLpyprlxzfJeRxvXFAj2NTmPjX5L74BSS1ri7QSJtPGK5eZEm3AIItqqwxhcJg28Ui
|
||||||
|
|
||||||
IZn2La1ampxVoM027ztN3VNFVFP024ABFjVWGATxfEBKkQ9cwNsFxvl8JPI4SvYM6wOUn8Z1b81WTSvVkFd0BAQ3Wcyv1lXU2V266mIkKXDCwegdwE9hEPu1sBHtz2u9hKoyG4SA5N6zBXtLhrax+V3CcOeRJfU68iFHSo9DBrg0IakNKGxCGhow1YacNeG9oYnLnxvaPt704DV9MGFu8plkrGZegDphzKCI9wIYLgGrlpbrobwPEBxB44XBj+Lc
|
FrkMCXOU1eeJ5BfF7AbWmyvfmSJ7VErj+zWzxkVI1npcUl2rGbRkupixClwwsHoHcC3bRNQhW2wgDttKXLSUmMq7dQHKyF4S6lCNXBSrxIUxzWl769rF+p/V/qANiEIDSBrA0QaoNLEi9RtoeqHbjtfSu9agB4kua2FZqz6SM2+l0wJlBEe4EMFwD+bnV/0N4KwLjQEoLgu/FuC3LSTdjkZ8md/GjJDUaKTJ2i8yRcMsmTiDFtioxeSQ+XJrZ5S4
|
||||||
|
|
||||||
NuZkmHFoylM3+TGRVq0kDzTJw8jNaTOE3/LRBYmudRJtMUmZpNYK7rdYsrW2K5dg25OtvIbVYIwp+8ltVNq8UmM/wXaxlroWNG/B/KX47yOEuQLRROILcade4Ni5zqElJ2jnvSpXUrsWV12rdbol/V9LwFiCwZRhJgUFK/1PumhVAvFUbScm/2u9dgofWarn1xsNpVDsqFfqbeZSk9cHpKV0KRlqAZ3muuYXgb7VxOx1RAE2BCBZynIZgMoHiAdA
|
lyUCvTYArbF7O2OiCtq1gr6tKjRrWWvTqtbj57WvzernzoGNopw1FZD5V8J4jV+IubyA/KhDRROILcTtdNvflU8+1JK+JSlyc3LbSpbmtJXpoNnVSul2SuhSgv575LOlU67pTktt1oTReG613WkPO3YLA5xsPdfewIn1LjYKqh7Wqvh7/atVDum6U7pt23qmF4OlhZDrt49l85b6zYEIFHKchmAygeIB0HAEYQFszAfQJLQXBDBF2EGWsUIqo4jd
|
||||||
|
|
||||||
4BGEdbMwH0DS0FwQwbdtBlVIpaKxL+IHOynhzJpbIRtJxBuB2GdxCGJEPiLzytrUboqhktUecKP4mQtRO2gQXqIeHO5PgRo14b8uzVaYxdrW8TSYu3ElVi1eoemZDx61MyB+p+mtSroRXcytNxLSbdPz6rtrcAtoIzViKlimbWEPGUUay3sFmkCVzjRas4l+ARcbdsSm7fOr8Zubb+HmyGTXJJ0tQegcAFoNBk5CSBhZ/I07f4Ii2u6rtHg19LKP
|
CBLKCHImlsgcCVkG4dYRSAwbnK7hkiwPKdwxnyiW2JwrHeNt0XqibhnwbUQ8Oo1jyScdkvLd7WnlOTitbOyxf8pzVry811W+Os4sE3FthNpK0TRWs8UktbQ0mlEWCDk1+pOMBwejIlMV2E8G6vFX4F5y10Eq1t1pYlXlyEnGb6x9Iy1V6B6BwAWgEGTkJIH5mciB1DPYqcbpHWm6QFemteoZplGSjCuu9YrjVjlF6S+9SogfaqKmDD7NRo++4bqP
|
||||||
|
|
||||||
7oRIauiok+vVyfCqizhGo4cFcO1FOFl9BotfS8JNElEQtD9C0U/StF7E+uHbO0UNxm4Kh7ReY20YWMgbFiBDxAObuWM1qd7bk1Y+BuVzrEIHmASBlA2geFnt7jZXe45fZrPIkgrdW2y7uuHhwpJPIYUVZOuEuAVbWGr3WcfiA+5cbeUjWieSJpa10lfhojKTYfpk2lq/JoIzyX1qrUDb5tm8+FReOCljbXFe8lFVrsf3ktn9XQfXavxUhmTh4vwI
|
Pr2b18V9CpMaPWKNc625ozrgAxTFVE0xZoppIN3zG0GriWYlgxQmo7gMSxK9FPQXGYB/6ADQB/mTJM+zVzVwOyrTfuRJAa7RtjrFuK3DXBM969SydcPpO71olzuw4uhqOKp08CadE++NaSXeX5a59Xy5jSVozXKD/h9Mrjavp41dbN5/G8FYLqE1uLmtoUtrePy6A1rlSda8YlSnxkYq666m6xpLlhkqj0V+Kt+fSo/lUjd9u2eAb/O8YrIKQHYk
|
||||||
|
|
||||||
mbLMEoMDMjDg38XRhXjwSgJlKw7dSo/kOcl1QeHEE4gpBrIEJMW2dZ7p7RoT0mAqgPaLx4noTftaQv2RHuV63rg5kcjXojTj0Fkt0RGyANUwNXF7S95eyvdXuwC1769je5va3s4mY6pedvXiWCktX46hJhOiDQ6qg1XhcAmQfAFeFqCv7NDbIkRc5BHiLx1+HEfGaSrbnf5zafYcMWuH432QKtJ8S+rpLXBSUCcQuzfQYrcN5U2twK6Xd4dl3ryF
|
3QELN0wSLdMTM3h0z22C88jCE6ZOhMjIYKvdO6hpdkMVWETV0BQkPcUIkBp6M9WenPXnoL1F7qgJesvRXqabnqI9wZIoxxJpBcSBl2cvibnPNWw6f9EAK8LgEyD4ArwtQI/aIdgnfZnAI8ReAMVhCPBlk+KI2gjIWQrwAxa4CjfZBDUnwHakOBaqJUxwxradgLHLQmuMVJrGNLO8xcm2522KKt3Gqrbxo33byIRnMprQkc8Ni7x+o5Xw3ZwvnDg9
|
||||||
|
|
||||||
Bh4wI4rthOnjQjda0bQSyiMTbs6ummfjj1nJJGxZkUTZDBPW28IOOI6k0uFyPhPlBw+223bOsgPgSYjFR7Wf8GK56yAFm6uqbdogB9Sepw0wADIgg0nqagEADiIH1ImnjSj15QXkwKaFOinxTLUyU5etQW1LCJ/R1Vfeo1XNKv2CevVcQs/WGrul8QmU4KeFNimJTnU3HfQuz2MLc9ecrOAccL1QbCAhAI0NUG3a2gQZ+wPMtu3WznBZItoeoOtn
|
gOIIbcy2igPyj415QcFNuf067e1sS/tQVMc0QHqVLm7WatsxMTromHUtqb1MAAyIN1LamoBAA4iAdShpg0hdY+nJNUmaT9Jxk3VOZPrqyjm6zBd7pqUIBdpBCpVQ0uD3NLHtp6tpZquiFsnqTtJhk0yeamx7Oh4xqHc+r4NApCAhAI0NUEXa2h/p+wNMouwWznBZItoeoAtnwAS7K9G5LcgSXWPbBNgCQDiLCEuDwgu5DGfuHsYSC3RgCnlG6Imh
|
||||||
|
|
||||||
wB67NDCfMjEDi2DHLYQHCQNUF3TUes1k1GW6BAV8o3Rk0FW9/EF1y1PkeeArCycOV8hCbwWou74TwB6AnAEAQaNNpCZpKaByzPATQL9mzbKaoV5+/rZfuV2cyb9LixtW4s11T8yWzbcoJoGeDoiQjLFGlrAeX6cV/FrCLyN/j/zk9aM5uwNDGZtpOaIDDupkTAewZwHJGCBngFOnqDxBSAxAYwZgad2FcDgY7ZlnUaNaxbRJ7Io8zABPNnnjBVxj
|
DXP5nO4W68jiG4i6LfI+ix47RuBY8AegJwBAAGlBZvHBQmgRMzwE0BvZPjS+jkj8fsN/HHDvOpxYCY5mQr8WIusPWPxdSaBngiIxw/RXJZmEmKZ+7EF5Hfy+UMVVGB+f6h2N/An9MR8dfpr13v6wudInRAXB4Djp6g8QUgMQCMGgHcThuzQmslJDBiTVrmzIzAbuyCSUOEAGczADnMLmjBqxxbqIuci3DFhdkO3IWmjHDhtuGwOyCxgOB/AfRPYI
|
||||||
|
|
||||||
ZUZCeGok7IzuQ6smOHDXl+4dkdjAcD+DBiU1rJirRSDiphRDCnGgs04eF0lmoVOVcs5WerMeHJNHWmXV1qRNn7IV/hjkK2fZmqbAp4RxFXfox6Dnse7a0c7JIxHDUltPa1gXCAHWg6bBqySfaOtJGOC3mfELUbSfANbqGTtKrA9/NvOhR7zZRTk0bMaMJDnqRoJgLOHqBblxzrRzoYkOUukBVL6l5BeHuvV9GAdJE4HbHvB0boqJep6HaChdNumP
|
M5ufAI+tW90VN/ASiI3U7h5DxgTvTo9qJnkzqZkxQuPeML6LF68rNR5LsOAr8zJZmrWWaLVAnKzw/DxQjx6r1npJSI6XYLOGpQ4l4/cttkskoH+6pZBI+5hcseDonhz6S1/XNoSMLbkjmMHthuZW1mUx16SnI6EKNBMBZw9QJco2cQn26QhsQkS6QDEsSWTt3ss7VLwu1yrcF1R/dWKbqMkSX2LS6U6UF1P6nDTRgY03TFNPmm5mVpm08b0un7bZ
|
||||||
|
|
||||||
TXpn036YDNBmQzaxn9XdqUsqWmAaljS3xMzkCTrVnNW1fsYL3rcoNmwTkPUGFhdAOgiETYHTD6DOA6YGEDgJyHiAtAMI9QYSGGYI2nM8G35ghu8EllrxVJ/Ymjd+a+BJBQLGMWuvofjUwhUStkS4KSD4jAwR5vKIs3opcOlnDFA4fYNgCoQzy/hU83ALUGIBHAegPQGE9Wr5LtmgjnZkI+Rby31qQp6uptQOf0F6aKWo52KcXWkLv6TNs57FYlJ9
|
LolpgOJcksjHDVYx23h9JfXTHU9nIeoMLC6AdBEImwOmH0GcB0wMIHATkPEBaAYR6gwkVYxH0dNR8rz6Dd4KLLXgqTvzPpr4EkBfMYwHEMhgyTCEWG2RLgpIPiMDCHlcoYz93ONdONygDh9g2AKhK8Y+EzjcAtQYgEcB6A9BF9iF8rZzpsMcgvjO4pw3zoE27zt97h0E3heJYSb6zkUyXVZ1bOUt2z01V1l8ARA37htTKHlPiLCPeQCU15bYLppg
|
||||||
|
|
||||||
ZfAEQABodU4ls0GEnyZPIo+f3iVFSdzhesgfua82gpSAnQfQNBltB9ADml50Lc7sxhSXyrUWt3at0LkIGvrHQH639bm1vWhFtO4yAvABOnBXmy1EdSBdJDVXXmQ4OqwmnjV8Qkg7F0NAwwRDkMkL8bEE81ppLcYBrQ1oFSNahMSMZrwR7yfNcROzWlrQ2ii+poiPom+z0RnTdrrbUMVRzGhpixY3iljUzloBMHF+MpuDq+Lv4ykCQ3RLWkDtzmwq
|
lsXP5oXEVsIu/1vrSAnQfQBBltB9BNmy5unj/IpVrmx4WKjI4KKyMvFPNMxu6x0AetPXOteA660sqvPI41wJEMKG6s+CPCfTLApZHcyHAFWVCGhvjH/jGqDbyGCIPBsBeSqgXiZ8Z0mY1eatpm2rRWiw31bX0FnBrtBNCzzowuYsJrDWtwyCfLWi7xN2desyIeItNcy6duAAv9ifEE3aLWWMI5ZHBAPC0kfnDE7Ed13Yn9dYBxbTxe+tQGdzAl83
|
||||||
|
|
||||||
WrOdJ0rrz4YseNJfZMbrWVHurHc9SlMSBIhBlno0ZZ2nsrTLS6cyy0oh1WX31+qg08XqisxW4rCVpKylbSsZWsrOVlBEaYtsuT/LwyrOaBpCuTLHT4VguNgE5ALgjARgAYJUBOAxwWgFAXAEBAoALhs7f4Py0PTmB5XE+7HSjGcDVG3RJqbGu6IBLDVbBj42ykhvihvp5a+5WZ5KcGlzP9XY23NLq8uJ6toWfaGFqs9FmwtS66zDZps2zcWsc2iL
|
ZPliEsnU8Pyko27r5Me7Klsq6pbhOyainaj+Q3S6qsaPoBNgvl/y4FeCuhXwrkV6K7FfisoJZTuth6qqaNXqmk9gzLy+WJmPYBOQC4IwEYAGCVATgMcFoBQG8XSsFwidv8C5fkr2ndmXtAEmcEOG3RMR+Gu6J+KoFGRlkC8fuf6IpTZFMWPc0M3FMDQRnGrobAZjVf4F06hrU+14ZBZTPhYYLhW0kpmZ6DZnczNMpm98YZsYV+r6+tQeWZcUc3hd
|
||||||
|
|
||||||
TBJXTzev2UXb942+/VidFvbX6LzwTtftcxHTmjrDLZI92F+COINby5xjObs47fBPIrg4wnSZKP27nrcowet6oPNF7MAHpgPleD/BqtAbySsLSyfxCnAEQMl6ImbYzRKHv7v9ibAA5p2v5RFnkPEKSA+CkhBwjy7IxVech2RTIUINu9SnQKd3cSsFyRF/mJSIXtFi4lC8IN6uChx7WF4a54dwvQn8L3NxewrqU0r2VNvNla2ifH4a6YjtF9FXvcM2
|
/mfffhfmvPBq1S1qLCfr4RrXMVayHEPCRvnDbDrD82jt8E8hODoj3akk6OeVvjmrrJmm6wXEwAGmPeV4P8Aq1esObVzAY04AiD4sh5dz/1/c07xfu2g37H91HZDbIyeQ8QB3INIOD+DNsk+dkUyFXbUNvBa7Iav82wN7Dpaqrt3YmzRvAsJmkzfdym6Yrgs02ELdNjnSvtQsz3/jc9rCxWdLVVnl73NytWvak2b2BqN4mxPcrta3Qj7zLHGQ/MWL
|
||||||
|
|
||||||
H3mLMtuxB8r1K3Rr5pJ/Gebo2KtWLgwl/KdrffmuamTUE5dSDaRwQOTb2AuSxzQUuRCdLelku3EIjvF5vLX1/S8qdvaqn0FJlwpkMesF4LI5kO6y0ns1gp207GdrOznbzuKtC7LQYu+5Z6VZ5aoFjnyw46A3Wmc9NqvPX9LCsEDYMbITYNBn2AwBJA27XcJUDgCbZ9gMAyoM4BrL4aTmFdgq8DlOAhQlMBIY4LqRNobA5iZkYlNGsmLwhNkDVxIP
|
lWLgzF6+4raxNv7S2nFj67/eRkAP2e2t7I/7dqhyWFLmdqIZo7zyOW7ril3k+gv5MVHLtlt+dNbcD223m8DRshZrCjsx247CdpOynYoBp2WgGd2ywnPssPVtHTl4x+nP6VZyPLkxmHeHbfVQY2QmwCDPsBgCSBF2u4SoHACWz7BQBlQZwCWWg0OniM6xnsG5C+scFjgyWA4+XeihmQCUtkX4NsHhCJ9MbrlRIDRjKvmRjm2BtEG3aIeT7Mq5Nlqw
|
||||||
|
|
||||||
RhavE92rAgoe9ZLJmj3RB/VwazWeZs0kxrE1qa/Pfcny6vJPDgi1fu7Pr3ez61/syI62s4m97CN/yTQiPt7mZzp9sWWQ0vnzEvxA4c3bdEAt10wDGjrc2/aIOvW1lWh9Sp9dtD17t24kmiBYhQHMm0lYDtGZA53wmPYHUG0gD8/0B/OeAbHU5/JOQfA4OIImSw8PAuBnBuIOw6KH6o6cqTtg3T3udqmJveQoQZN0TvdGBPFn6H4zuyZM8ZsQmZnw
|
xqpukkOrXVnq7TYcOMzCzDD2h8zYBMsOF7U1zm9WdH5Z06zzwMGyoObM1EVr+GKloJL8O11nS9yiYsEYHAPzboD5xtkOZkcjnzr8RozeDcftTmgUpAW0IXsXaiSaIZiWAYkfevqz8Qf9786zy1sTcAbt1l5/oDec8B7in+xZfk44iCY1Dw8C4GcCjOOtoorqqp8pNqfghu5GqbG3CFxsIh8b35zLV06MPqZenFD2C9TYEajPiz4zqe0iymcqDSzr
|
||||||
|
|
||||||
dTrS2d4dtml7eFNZ12a3k9m1dtbDa7s8Pm73xbzwUM1Lf64BL+ElIL/OSEusbatZeWik2SPMN2R/g5KrWy891ufzdH4W8MeA7BvBXotD5hozY9tbWPXtltxxz9rmRbS1TrjwY6ROGMWXRjHeRPXHPw5DBMn2T3J/k8KfFPSn5TtgJE60vWuEnWepJ8FZSf5yoXBcCgH+BjgIYEA9QBAPcCKfPBlA+wDgBQHWzKBRg4tHgPP1ytVOIz7HVBwmOHja
|
Nlw5CLFLcyV7c13m88FtNNmpdgthLNLbfyPynxBwF8WFBRv/ATyXapxi/tyk4m3r5K359Dn/s/XIJQDhlTJYDsFGDbLGkdEkOUvlHVLgpyx/qu4RhzbtDS+7ZKdD2d4YncThJ0k5SdpOMnWTtgD44B0xCdXwTsHRDq3Man7eETj/W+ooB/gY4sGBAPUAQD3BUnzwZQPsA4AUAFsygUYKLR4CT8ErMGpK3BtcousPgw8VUhCVXiSrsrC8YkJuE+D3
|
||||||
|
|
||||||
kESq8JGa0+iiRrXgcIT4MAfvK9OmrFwaKIM+RDDO6Hfy+l31YOBTOp7OVOZ5NemscP2bnL7h8RehVTuyL/DmzgK4n7NrRH02na88FDsTmPOU5pF3wk/3WNfgU8Z3NEuVuKOa2Kr0RJSjBw7B8zT9kS1ybEvFSbCe79ZfAaL1sh6giEBAH8HDjBaF6V5s7TeeOoHBwX67aB3gKhsfuv3P7/YH+8/M+qrU7ykiKoXMjeRh4db78yREbebgW3fYNt09
|
6LyRVpp6VeiitPKr0Z0l/VeMMUuB7mBIZ91d6s0Oxnk9+h1zonujWWX+nLfVCOmtc2azyz8oPWZ9v8vlr0L2LCXSRU5ZfgU8YW9tdEeQj9roiMlP9h2ATUr7crm+zc7yl3OFlYh0zTMbZD1BEICAP4OHDs36ilXeJyyDPXFfqvUlQDrU+UBvd3uH3hAKB5rXO4JoboK8Xim8CCNl2rzJEP1a8DhBVv2ODrKhri5dM43g0eN+6PccMOtvyXBwCmx2
|
||||||
|
|
||||||
1JfAFyXa28m9S8cPU3aX/b2d5C0ZfTPWHLNwEey55cQqZ3y9lj3w7Xv82qLm9mi3s6f1iv8A+JgJa8GDSZI8XX4xu2e9jRkiSsonSyJrefuaOjtZRxdXq9Acge8tAvDkxB9MfmurbnlyO/6Ll41KujdSlVQ0rcfOuPHWqyy2Md/ae2j0CbpNym7TcZus3ObvNwW6Lehv9PmemOwTvjtpOve4tZgJoAQAIZiA+gIt5gCNC2hzgHABDH0CyfxA6YiR
|
/MM0ve3dL/twzMHeMP0LMzurcWtcPzOl7MKzhwfrXv4AoTMU14IGjSRouxXm79lvSFyyEvLI8tli3ptPeKvv7g6zQu+8xaAvfrmrgOXq7NZ6O/HhtqVYa/d1G3PdJryo1Xmu01GbHxEux7a4dvgFw3kb6N7G4WzxvE3yb1N+m8ze+3+jzQvW6Drj3+vH1ExkZcG4POi1mAmgBALBmID6AM3mAI0LaHOAcBYMfQWJ/EDpg+Gs3uT0iZeeYwkCNhFK
|
||||||
|
|
||||||
kt4Ro+r2s+wbx8yNSgmowgrIuLn4IQwyVKL+7I6wvo1f6ddu2rPbij4dz7db6cqP7pNAdBHc+0prWzLZos7k3LOETqzzh0c+WtLu1rgrnZyLbiPDmJAo5nIJI886vv6Wa3A3eNT4EGGh2iryJebtFGXACUuUrV6Je3Pv3ku71pwlBvlYdBOQQgeoEYBDdAP526nkF78AAlgfAFMDuLQgYu9XebvIbhD7TtJDAEciMqsAhZFeDFfdaR8GEOV+4iVf
|
MYjCCsgoOfgGDUKDCGUUt3Hh1DYq804bcVXkQzbnD08dJL3uE0B0Qj8Cx6vLNlmtLtycvvI9d2RrvkzCzR+wtsPcLYmrhzy5yC8OGKWz2fsu9rV64VRshnHsfaTShGu2l+y4LikykiezrCr+AzSPG9f7Hn5QSVh0E5BCB6gRgD11/a8HKuDKoxD8ao6XrfuQXErNgId+O+negPyV0kC6dSKirACFkV4Nl+1pHx8vLcQrwZMBgkC4Cg4EnZcEDEEO
|
||||||
|
|
||||||
tUgMc2sgUHDc7LgEYjq5R+6tjOaPPtVr/8Ha8sOcLjHixSWtIsry2P3Lobwu648jaNNgt7Z8LYf1DmNcYri1wtvVIsWVIp8AcPfZfl/6ko3x+wS43ePOt0bm5w7687U8pL9X5Gl70Y8lG6e0y5QZDtAviFK+w9dt5x5HoGMvr3Hg6zx27fs/tLfHEAUL+F8i/Rf6gsX+L4l+S+t60vvn5Jqr4tUBWQNgX/PXG9BT6Amg5kACPUAXD1nKg+gSoCDL
|
8SsZsC13cwK1e7xlLwe9BXgt5nKP9Lgd516HfdfWXAu9l/vJmuDfmPPLpT91tR4y7aWoUR8/ZGU1K6CUe1/iilNxU2tTglz497I9m0XWDdknrziSBOefviT3P9bRAAPa6uJAEv1BaduNfrTSTPuhMlbZu1Pt6jxnhxxAF8/+fAvwX+oKF/C+Rfov5euL564GPoBpf93UY6E/enhOw7IbguPoCaDmQAI9QBcJmcqD6BKg/0tkC0GqAxxKgbIUWjk5
|
||||||
|
|
||||||
ZAtBqgMcSoGyHFqVPMvKL2tx/jOErbCvhy1p8JzVv3RFOPFQm4R55LVfmrtXq5jcJofjMRn48zH5plo9DumXe+gtSmzHcLPJ3C96dys9nekXoRfN6nwLaEdCvJvjPh8fRduhv7j7+74692vOzrhAY5IR58ucMc5GR2mSSKupM1dKftXx2l6+t0RvIuzv8b8yPQGqiAPAXbBh75L9Ad3dOIr3yFx96L3v9agu/zUHj1fefOanY7EAhP6oadu7oxXq
|
zuQ2S3L+PSf1sy/ery7vFPEOCHujH1vgGNlD2yRK/1vJHTb4jdVZbfVe8PTVvp0zvTODPOr3b1r2Vva8oWKPTL4dyzdHeTXx3Czjh1O8EK83box+nbzvcm97Pgw64QGOSAudUW1XksyW0t6Wrv5pXp1y0mJ62/h37nu36wqG/Mj0Bqon9z58Qe+eXe/ciJKyAxlk8av1HwDsZd9Pv61Bl/moZHou7WPJWe2/+Pv4QwuBPzsv5KePziET/q6DJeLq
|
||||||
|
|
||||||
lOCHT/5FvgWf+sIXxkupNuPBUuStpAANaTXqCZ02dHh15OS7Dsx4U+pPs37seFPm34CONPl34TeDPnRbi264MJ52I2MIor1yy5tsIC+4XC3D2GWDop4PuRsk+562Elno43mp/sxjaeptu7pcmZjokIGeilkZ6Kq32v7JKqxllHra+1nrr62ebruMZFMH6keie+3vr77++gfsH6h+4fpH72+L6Dbb+egVrHYxuDpsF7siMAE0AdAPQPoALg5wDHDb
|
EBh8JdYes/hDqr6TZvK7bq1aUO1Lt8KY+1fivI4+jNlj7Mutfpvr1+HLu4qk+q9q371eAtnWy3i2MEoq1yVFmsKLennC3BXciDsJ5XOrFpt7Gcijr84UgO/rd54Kf1lq6A6qnsp6PooQkpYaeanmbZqWFthpZ6eWljbaGeSXuRIGWjvs76u+7vp77e+vvv76B+pvs54+ulvm5bW+rCiHYcKIDpFwwATQB0A9A+gAuDnAMcIuz1AGEJoGSAlQBwD6
|
||||||
|
|
||||||
s9QBhAGBkgJUAcA+gAhhXgxAIi4b+B5OXZluNTo9DBQsIMSg/AqajUbJ+lVtQK8Y+KlRhEu7bjV6qOQzg158IkAbTY04MAfj7T2D8HX4TuCAfO5IBA3i34culPhs7ceG9hiZb2EUtiYCebqJoA9gg/ot4HuxuEGgN2E4suZxqZAWSLggDiLdDE8ovo+5Hebzuv4fObIggZ9AKtJUBHARgfPz3eqAsf5Pej0FJyy+OSrp7u+k5AMFDBPQMW6CKm/u
|
AsGFeDEAULnP4SAiVnk7JWj0MFCwg2OqvDDwaRtH5XmQqqbRVugaMiS1OtbiVYP+GfhV5/+m/Dn6ABDVvh4F+php8rAsXbiM4kebXvTbQB09tX74+dfuzb0e7Dox7N+MpPNY9g7fou47OPWN34jUAaCXYDiPZsGoEBeuAAq3QrTpP78s8jifzbel/otzfSfQErSVARwNoGT853hv6vuvEI9B8cwvvxbAu6gZ0HdBvQT0AOe7QeIb/QsDsxhMou8H
|
||||||
|
|
||||||
W6oObGKyi7wzuNFB5aIFkGjm0wQcaIbIYQdn5zwQARS4gBaMmAFogJMjTauG0AZX70eBPszjwBe4tkEZBimlkEcew3ou6q6Y3iu6bWIrvs64Bg1PN5SudiBcAJomSNJS8+vABmaNB+/ES6BoKaA9b4GdAbq7jBl2LxCTBTDKwHGO8viLyGeR+pa7qBXATa4CB5nuqaWeTrmZbampQgb4euUxgYFGBJgWYEWBVgU0A2BdgQ4FOBagdE5H63ZNHZaB
|
bjRQEWs+YBoJAlxg/AfgYMTfm1DJ/4EuyMuLaQAJLgAEkOZNtEGo+8+tQ4QBfbl3YTOVfg8EZBCAVkEN+DHroIoB3LnWZMobHreIXAcaGkhiUPZsGa1BfCLU7+oC3ke4/iG3gZqUBSRko7DBSIJKp7+X7gf6MB3rswGcqTAfq6lGpjqbZbqprrwHK++nla46WRnser6W+6JoHaBugfoGGBxgU0CmB5gZYHWBcgfo5mszZIwpqmYTl552+B5sQCi0
|
||||||
|
|
||||||
rvqk5zBnWOLRNA9wH+CcgtQOgbShjAEMBsAW5M8AYQfQHABp4Kwa4GlukgRCTHA5tIBZ3Kx7jdA7CaHgkDFaU8FjAhKpwWord2onvI67IOLtEHzwsQfcEPwTDpPaJBOVPWY9AjZs2ZvB3wbO6c2g3vO5oBo3pEZC2mJkUE72wIaUE8KFQS4GJYI/it6QkI8JxD3WORmCA32CIarawgBOKJ7tBtAZ0E387zqXapaH1uUDnAC4EIDnAiEGyB0wcfKM
|
TQPcB/gnILUDAGYoYwBDAbAEuTPAGEH0BwAieHaZ2B2bg4G5uYiscAkCD5iSBOBJEBsFGQ5kEQzeQnCFjB4q3rBjIN2HHsI5bIKLoTZUw7djSB1WufiKi920FiAFUuQ9lmY5mZfpmoDWqQYy4vBjigT60eRPjvqTuSzi36/BcwbHQbO0/NvZLu1LGUGAkI8JxAnWPZnRh9msIJjgceTQXEZnup/B36XuT9kCjnAC4EIDnAiEGyB0wYfAMFUBV3g4
|
||||||
|
|
||||||
HAuWIbXQfA5/rMGX+UGpWHVhtYfWFIOkZocA9gQ8HdzBohAf6otORkGPpmhsIBaEqEd7lPrYy5DtwJUO9WrQ53BDDjSTuhTwUkHSCeFmkGN+gYVy4syqAQFLoBnfkiqFB/MsUHxGuAR+aSuHbAEquIvEMvDLmdkLZoEgXwNsDfKBYU9Y6u5Ro97NhjGK2HTB9Ri/acBXlrpZxOVjoKrW22lnY6+WttqZ52uf2kIFa+9eKIGcWevnZ7uuPjp64QAx
|
gfAdAe5qWUkwTMZlhFYVWE1hb3hqE/YmukPA0BgaNgFuqZTs5CY8CQCaFTwZoYe4WhaJDg5hQeDkBb6GIFhcGI+EFmQ7uh/TqAEEEdwePawBjwQy6bi6QcGGZBdHh8E5BXwVy61mM7vsBnmGATmIxShwI9B7AG8FRZ2QragSBfA2wFtx5hSti0HzaiIb86NhMnkArQGGIQp7auWjoY7OW+tpBEGO8loE6Z2BrmUopChIQKY6eSvlY4q+yvGr5UhU
|
||||||
|
|
||||||
ABKFShMoXKGcgCoUqEqhaoRqGdM36lE4wR4EZY5WmkbrabJO9phMxih6AOLSoGnKhQDpuPAAuCbAygPcjVAbAEAI8Af4IQDR++VsRrA4OwMAR7A7tDQy6SQaCaFw4VpMgRkgmyMGLhBefpEH1eVNo15rhA7rlAJBTNgx6zO41uO69eZaoRZk+R4SGEnhYYbT7je9PtvZTeTPrGFWOrPqXSHWw/uc4PhDwrlrpSsIc7hWagBk0GW02wC+TfhLmlAa
|
pvuhChIoWKEShfQFKH2osofKGKhyoX0Ym8KnvBE6Ogdu5Y2+/IT+4SAotIAbcqFALG48AC4JsDKANyNUBsA3/DwB/ggHgl4h++ThIhmQmDhwhsocfEnzrISQFOFf+DQT6KBBpXiEHtONyo6HWScZpcFAB1wQ16vCCQT273BpHgeEBhR4UGFjWPXvzqhhwJp8F76THqgG/BujpT7IiRYSUHnyPfhqLhaSUsP5ho88O+HghI1P4HJIpAVz7XOFAWKK
|
||||||
|
|
||||||
JIH9p5pb+oKEH6YAAEOgYxw8Ao2H/hmMNxD4gWnv/JsBkNpBoFwSUSlHYYCwpqFvuyNmpKmQcjniqPC+SLi4DgSQBaEUurQZpHWh1eMR7ABjTlcFGuEAQZFY+Ezo8GwBXhqzYN+SznNaHhyjAGGhhfweGF0+kYZeHRhJQSOb7AjFtu6La0judg3YnkD8A7A0sntHZhxWJZBJmWyFFE62q/hiEgOaStlF/AbYewHyWfnsr6PRavohHGeggQ7Y2sTt
|
z+F7lf6X85QF76YAAEMAYxwEAnWGARBlNxD4gIEduZyeB/qxHoASUSlEYYzEiqHFh0DqpKmQQjvCDq67gaOFbAA4EpEA4TemshqRDTtLxoe+Lt/4nBxLhOKrhxOD06GRHoWj6SCGPnuGQB2ah14wBx4TZEhhfXkLoXhTkXkHdUBQURbzuVPqRbya+Xnbi8Uc3syxMWyJpZB7G6yL+FyO7Fnz7gGiSKyi5RRJuMGEqYvmwGS+uIdIL4h5SmhHmO6l
|
||||||
|
|
||||||
uaoYR4gZRIMhOEVMYcRnIFxE8RfEQJEYQQkSJFiRfIbRFGegoXjqjK2gSxGsKbERADxA1QEW4AQHAIgAIYHQNBgxwzwFuRdAbAPsAIYmSG2wZekkbXIbAYmFwL9qFGiVpQguLsJwD6+RPyxDgRKFpGduOkYX7gBg9i6HrhD8D0AmQ2AASBbhOVFNbHMUIJZF+GHwYWwLW40ava5BHfjx4FBfHkCHLRM3qTHxhaykt7DYyYYwxpYHdLCF9gRrpe70
|
lUZ8B/ugerWuuESUDCB+6OxGcgnEdxG8R/ERhCCRwkaJEchdEVyFW+96sHaeWhURADxA1QBm4AQHAIgCwYHQBBgxwqzl0BsA+wLBhpINbOJGwahAmRg7AdHAcDkYMODjJZWz5rH5N6GRPwg4oKWB1HXQdbsEGNuoQfaHhBA0RgQe0PQCZDYABIDcEixPQJuRQgvodYZQB00WkHWRI7m8FnhSAR4azW14RICaAJMUUG2BiYbs7QmwYBQyOIzdD2Ya
|
||||||
|
|
||||||
gmSKsjEMnMaiF266IV0FxRp3l84GIzwErSSAAEEYBmMGUZiEg2LYblHrq+IfdGIMT5ggZQCbsR7HHs5UY/5SRlGJJzjEXpDVokMwFvW5Qkf+JZDsxw4FcqkucQJshQgHMb3bKYaPqTj9R5fp14ixYscNFsOo0XuGKxXDsgHk+dkSibDaq1nNFORC0aiquRffrgGS260Wz6bRxuP2AW0HzCbFKRh0Y4zOIbdnOEyIy/mL6/hEvldEAR2MP7Emuslg
|
2Etnx7cA2Gj8C/AnMTCHZS0/vfa0iENgv4FwwAgrSSAAEEYB6MGUT84NhdGE2FjBgDgVEPe8KM8Cex3sVBzzBAWhsBVR/RK6Spa2DE+blOQJF/hvuGDvbGzhWNnEBrIUIEODYMfwKASw+hMvD4k2+kYKCixRwOLHlgRkVQ7EeZkckF0OisYGHmRrwfPZju6sST5Xh07trH7A/NhtF8O1PvZxtRp2O1EBRGsEsi8eAlF2y8QMtuuAzhDuArZRR8IQ
|
||||||
|
|
||||||
SEoSEgBAJTQL2i+ibxlqOSG9GH0bXg0hztnSFeO7tiUCTGXtujGYx2MRF54xBMUTEkxZMUcAUxYdtRHxCu8Z9qqYOxojEihsbh2EFwu4AuBXgnIMdAtAQaFuRbMOEHTCL4FAEIBCAv3lHHhmOoTTF2aLwDGx2MEVD4FtyUICTaYwa4AmImQqiniJ9O2kd268xNwYWYCxhkTSQ4+/COLGdePQN16ghNcX14TRNkVNHHhTce34txjkQCHCuV4dN7oA
|
o6ZRW/sBHNhDARBHoAgAlNDPREAHvFmoJju9GaeXAcSHfRpIfwEGe6ADa54RdruUDoxmMdjEBeeMQTFLkRMSTFkxcMY+hHxu2r65ueCegG6qBUxpE4Fwu4AuBXgnIMdAtAAaEuTLMOEHTAz4FAEIBCAHrhTE5uVMcJhWsIbGYwhU2Oi3JQgSQJFArBEYiZBqKfGGn68x5XlpFhsOkS8q4eIqMj78IksY149AzXn1RJB5fikEtxVkW3EnhqsWGETu
|
||||||
|
|
||||||
ZQetg6xpYYmG+RKWEGjHw9dsubf4xKiPDEoTiEv40BP4RdEOxJ3kjblhEgBQBHAowHTAwAmdl0jexC8b7GARy8RDaPmUHlBq6J+iYYknALRj0FfmwOKyjAEdPLcyAwMquOEPM1dsVp8UZDPc7EJfCMsg3QUIEj76SqPjS4Y+IujQkPwdCXj4mRzway67h/oYgEVq9cbZH7hM0fy7/Bwjj344BsYSfJgh94VqRXYmMJZAbeijnNSz+i1JSBr6XPtQ
|
izmFKt+C2HrEXuXkX4oHYawcfDF2VFu/jYqI8AShy6Z0Tz63OhYTHElh5QBQBHAowHTAwA8du0h+xm/txabxwcWo4TBR/jMa6J+iYYknAqEnFEXmAJEygummGmcyAwoqg1FbcxCZjBKGxII9Cg+RxhD5IgekrXIZa/UWXHEOa4cCzMJ6AVuGeh6PruG/KQ7grGV+uPvuHtxszp3HE+EYaIm/Bp8qN6Cu9nP7iYw0tlRYzUIUZSCj6A4IywOxD0U7
|
||||||
|
|
||||||
HPOs8eonzxwNjeZ+xd0fgYKWjvqWzQR6AD0lvR/AQfH1KjtlZ60hLrq7ZYRkgZfFHoQCSAlgJECVAmL4sCfAmIJVESnovoAyfDGJOTEdG7IxROonafWV4B0D3AzABQAYQJdp/YouzgBsjsYjwESD7KlKKlg7C/wI1Z6SOyOP43Y8ajUFmQwREjiRBvUdzRvKRRJ8qFIE7FR7NeAKu4aehhaq8GWK7wekmZBKAY3Ejes0XwnCOrRKm6bAzELgDOAb
|
Frx/sRvGBxt0bSrZSORhb5SW0Ql0maeKET7Jae8vqaxXaV8b9HaWtjkIEnq+6BAlQJMCXAkIJM+MgmoJ6CY560Rj6L0nAoiMfHoPqbNCjFhxcwFeAdA9wMwAUAGEJnZOq0DsiQsYjwESDLIqkhxDbIjrP8DFWukpsi9+ySlzEVB0kXxDQ4Gfn1EDMlIHco+cuSBCRHOtVtlqRBxhjPraYzOmAHzy6aiNZpJNihkmzRKsR3GIBxPrUTRumwMxC4Az
|
||||||
|
|
||||||
IMnZQAxADHBf4s5AhiIQ4tEaAjBh/rEa9+0UitELgywb3FSOosmNQbEh/HXQcWvFqSZUC4Sp8Z4qQXGdFaOMUS+4IGSGF9bMQPAH0D0AEsJ+4cAowM4Di0McHRwsJLIksIQoJiW0nOIiIGPAjqeIXL5BxCvhICcqfQIhAGgCALuAsQedmarcBxqaanBAFqVEAiqYQAhE8sUqoQ6yqp8PKrDJFnqMnR6WphMk6m0cgDEGmI1Eao0RTqlyp2p5qZal
|
gGyCR2UAMQAxwb+KOSwYiEKLRGg/Qev5gmPNgUkxh6zgK6YBKpLqHccYshiqUg35ju70gpxrVHOcaibfb/hl1glESA8GHdbMQPAH0D0AEsDe4cAowM4Ci0McCRycJD9gWIfO3WF871hXEJxwiUjwmiEi+I5jkY6qiEAaAIAu4CxDeKeqrBHoAxqaanmpUQLyphA7AdwDeBIqngmnwEqipZDJFeLurCmocgHrkhOkEeqAxUyZGGKMfttEy2pwQPam
|
||||||
|
|
||||||
OpH1NsmMRQVj9J2qqMWKn1AEqVKkyp9QHKkKpSqX+AqpCYTIbOB1MUZBloi8D2AfA4nCHigeHrAcrLInEImJRQqMt8DMaawlqIyudKMvRFxShKZBTwDmrximGFCVmpQBmnNCmJJ24eYq8BJ+rXFN+SKQ3FZJ9kWimYB0RpilVmOKXikEpRKSSlkpFKVSkAeUYZ3F0pWsQuASuTKQt4JhPnPrFn2mOMOqDyKIRmG6E0UObp/AZIHMScpFKo9bRRjJ
|
WpfKoxHKBienslthb6mKn1AEqVKkyp9QHKkKpSqX+Aqpl/nMLJWzgMWiLwPYB8DccPlB+7QeZGDcmLCbCMPDpcexujJc4iwrbiNsv9h/ixUuikiB4gU8MDBIOTPO04MJLobOIJJo0XPKqeMgqklTR6STNHKx8AeinvBXcVikpmuKfimEpxKaSnkplKdSnPul4c5E/BN4QuB8usYUynxhRYcXRJhRsalJuq4Sm2zHcYSuSCfA4JGt5kBontFEniWq
|
||||||
|
|
||||||
vrZAemwj2C78wEaa4v2lXHKIKiDXEqLEGzWC5CtpjwO2nf4naU4RIgeIL2kW064LzynwponunsGlSJwa1I3Bq/RRSE3I0SjceYo6L1YR6KQDHJpyecl+WdrtgCLI6mNpIEg9GN2xhipwHOGLEsYm4mo4iIFxhkgpINGqnIOxBmLPI2YoIb8GBGQ0RSG4hlFKzcRYqChICS3CtxWJhUZ9b0A27DbBrIjoH97XJPGfDgBRCVMGiBqLyZGI96UbJErd
|
dmFNymXlvHye9YHAbv6W9PvRFcCBk+AuQraVjr8Ifzp2nYGxQD2l9p/ac2w9gp8HqJJcBonVxVIFBnfQPh1BqmItmo3PUT7opAIcnHJpyS5YlG2AHMiE4WkgSA0YjbHbi3MewpMShiaAG4lw4iIOxhkgpINU5HIqxCaKJi2xF35v0FogwZo83XHmJhpuYuwa3EXBqNwQMvBvsl2B9AIuw2wyyI6DnmCwc5CcZEOH5GPQ4Wh6ZJ8wmLiDHwQbAiBL
|
||||||
|
|
||||||
RsPjyRtW5tHnHrEKYl2moAg6U1quhgjLvoS6++rCnVxqSekGIpnwcinzp3CaeGqxEYZnQrp2KbgC4p+KZyCEpxKUcCkp5KZSn7Y+SWI64BPvPgEpGu8N5BXy5PPiAKOMno4ItwY8LqSPQgqSp7aO36dgZapvEP/5rqK8VA4GphIRACAAIiA9SgAAIggADwgo0q1k2ynUgNKAAgiCAA/CCjSfWT1J7qTWU1KAAnCDDSPUmbJCmvJq1ntSE2agADZr
|
UNblzEVWJAvnHecMYiXGoAQ6c6GQpL3PRqF+AzkkkNxE0Q8FIpmbEWZNx0zsw69erDotHv6EANilrpBKZyBEpJKUcBkpFKVSkbYeSV4YFJrHkUnMpdarvCHWl9pbEaw+ICI5WxwYC3BeqfzhFGwhU/h+kARzSdmH42Y8HqmgRQLg9E5GgACIgbUoAACIIAA8IP1JtZlss1JdSgAIIggAPwg/Uv1ltSM6s1k1SgAJwgvUm1LGyNJuSZtZjUpNmoAg
|
||||||
|
|
||||||
WaNKOyPUg1KjSA0unqrS1AAAA6HAIAD4IMKajSDUp1LdSDUnyaAAbCATSy2a1k9SfWbyaoAJsj1JWyJsq1lNSgAJIgTUn1L8mqAINnDZo2agDjZU2TNkHZ3AS1kdZXWT1n9ZQ2SNljZk2dNmzZ/Um1mLZd2WtkbZW2f0q+6TUvtlHZJ2WdkXZ12bdkrZD2U9kvZb2R9nfZv2f9lw5QOSDlI54OfvH22IyZ9Gamj6phE6QQaR7b6mB6WGnxCkOZ1n
|
2W1n9Sdsm1JVS/Ul1LW6yCtQAAAOhwCAA+CC0m/UlVLNSrUlVIUmgAGwgQ0itltZbUv1nkmqAIbJtS5sobJtZNUoACSIDVIdSlJqgBDZI2WNmoAE2dNmzZh2dakQArWZ1ndZvWQNnDZo2eNlTZM2XNmdS7WUtn3Z62ZtnbZ0entmHZJ2agBnZF2TbI3Zd2atmPZz2a9nvZn2T9l/ZAOQjnA5oOSjkQ5J8ahFnxRIRhHbSfqdY6BpqoMGlkSoaRqp
|
||||||
|
|
||||||
dZvWbTmA5COaDnI582WjkrZGOZtnbZCCiHp45x2agCnZ52fbLE5LUndlk5wphTnvZX2T9l/ZAOfDnA5iOWDmURTvkKEu+exkF6oxmgJyDPA9SIm75pTiYh5GQmSO7yWQ7dMdSFeLyYFwI+uccfDEo3wAmYABuJHzoaKZkhQl9REKcOmuZo6cy6mRySXCnE+CKfCZ+Zc6dOk5BfLps7LuGKbYRYpa6VFkxZW6Qlm7p+XC5G0p+mmUFR+xSQRkBK3+
|
OekeNDldZPWX1n05QOUjlg5qOQtkY5q2VjlbZO2VAo26B2cdmnZ52Zdmk5dUvdkU5tJlTkfZ32b9n/ZgOYjkg5yOeDnURBqjyFB2fIdDoChTvJoCcgzwDUjhu+afrHxRVMWkic0lkE3Qz0v6U8lOc4PnnHHwR1sMRk6cQJooDyehmcGRJ4KZ3aDRdGi8ZjptwV5kpJ+4b5mackzvOnUedkQtGL2qdCuk4puAHilRZMWVukJZu6ehm5BUmReI6xQf
|
||||||
|
|
||||||
MlKkMCrtylg+Y8bwAvMoFpnGlZpRuVkMB4WlVk6pnSXboKWhSjtl+6mlo1JB6CuRnpfahlhr4oRGpn6kc5v0TqqG+nrqGnh2qemArT5VShG4Be1uW74AJoKJk50wf4PcBGgzwKkEP+1xhRgJiHcn+abC4njg7koNMStSZa2wFcJncr4e1GRoTXP8b/AJkECZOhzhmX5U4UKeCbV+7WoT6TpsmlZH9e6eZkmZ52STnm5JQrmFmF5G6bFnxZO6UlnY
|
ulkPht4u/hxSODNPHYgf3iFEKGDem6TSOkUeQGrxn6evE1ZiIHVl/p4EZVIQAWSirklKB8dPnXqLun0my+Zjtp4WOvqSKbYRh6sdLq+rSoNTtKZvlPlW6M+b0oAJvIcxH25qMTE50wf4PcBGgzwKZFaJ0DhGJtyt5mPBo2nHkZl2QFGIMSnCG3MFEp+aJJcZH0G5v8AmQdxmEGlx8eXpExJE8m5mxBsKTuFp5CKdOnIWyKXOn8Jc0aeFCJIJkXmR
|
||||||
|
|
||||||
BKWbGGEc6WfgyXALcG8AZG0nhrAgG5uiRCEyCsk87FGynj3kxRFWeVID5NWeDZ4Gw+XHgmmcpuaaKmlptvHSmfJqabymFpi6kqmZng67CB+0jHqnxL6rqY85Nll0rvx3BcIW8FCpkqZ75woQfmihR+eUCEAICfgDPANYHdBsAtoAhhdA+gPaD1AqBpsCXGSCW4EoJoiqSo96j0PsLquGBDWknwwUES5kguYbt4cQXMQM51eUefzElxYBYNEM2DCb
|
ZG6bFnxZO6UlkiJKWTeHoc/wTYjYw8hJB4M+t8lgp/AD8hXRwmnkJz7lZzQRdGq2XFg4Kj5yfoSbtJTWZHjymHJkqbcmKpgfFCFiplyY8mMvka4r53qbLzr5/qX9FB6/OTeyC5Z6msnlAEhZybKm8aUjF25mpkpnoAhAFAn4AzwDWB3QbALaCwYXQPoD2g9QIAabAKxuVFosaoUl4Ak+xnXqPQWwnZC7wRmSfDBQtTmSDZhK3hxDqR6fnzG0JnTk
|
||||||
|
|
||||||
X7mR9fqwlwF7CRkmcJKKb8E5JrcfwnoFEWeunRZm6XFnbpiWSgJruOurGG+KtecZo+Ry3lenkiaYY9B6k5PFxjhKQaM1aUgPyrbH0mRYdAYlhVyQlHlALQKhx0w9QCcBDAA2BqnXmbBbql5RgcQVGHGBcH0UxwAxUMV+hBaTfk0xq1E1aUgU8FlndsuwTTFJUQ8AiB+Fp8AEWWZZwZ1EXB3URTaAptwTHlxBeBMZEJ5SSTuHJ5x+rAWyxvmfLFc2
|
LHSc1fMAEp5HtCZFyx24pnkbiw1nj4CJi6WrGYpZhBFkl566dFmbpcWdumJZXzrSlDevwT4qN5Mmp35XpMUsJR2Q4iPtGBR7GC+IBopVpSBgpP4Nrqi+jSa0GxRWdjC4NYBcC0CW8dMPUAnAQwJ1gmJeJjqlj5FiXd6hxyaSMVjFExVMU9hWCQSC4gJEJSClou/E2z+FBwEPAIgwRafChFRXqh7EJX/uPA/+pwR04rhUSd05xFw0QkWUyyScgUZ5
|
||||||
|
|
||||||
KRVT68JS6ciqZFkWZgUl5OBYUX8e14bGHbsRBWgAcox0XxBpS/PjUlkilIHZprIKiU0kdB4vprpNhuYRTaD5AGavENZ68USEWufSTwFH6fAXPmSFLjtIVA6J8QGn0h2EYoVG+BhTTDGFzAKYXmFlhdYW2F9hesm3SpIeG7fxzvrsZMK+yQnYECDQDABnmmABwASOUcSsVGQEOGZDBq5IEfxUCzGE5BqOaoqQXJSCaIcBGuhfDQa4y6oitQF+DmWi
|
M6WgVKxGBWinZJGKTvq4F+RWXlFFhBaUU0pmsb3HoAOsYuwUFKkDdEG07eRoTnGVSTxwbuAqX0VVZpidwW6p4+R0mchkOU9EyFHAQa7nxnOVkxYRZIar5229jk9omFNMOYXMAlhdYW2F9hY4XOFNEXZasBLnqfm255+YYXLFQKA0AwAC5pgAcAPDi4XOJGwIDhmQdiE+num+NqxxSOhwi3AcQH+MgQHBGqEqJYyh3F/ltODmXC5fkKGUtS+FMRUI
|
||||||
|
|
||||||
6AUf6d/j32eWkOm3F08mOkH6XmfCkBhcsWZyfFAWailpF6KWgW2EFANBhwAaadgDxAW5B0AAQs5EID9YlQEYDYA+APQBHAwkCCUaxYJStFLFRzpOYlJ52K8DdOJuM3mCU/GY0U6pnkLSjd5r9nPGYlmUX8nBEFiZwVmuyTJgD6AeZFVAwopANUDdkkgCnjCwUcE9F1lDZXTBNlTAK2WMw7Zcvidl5uUhHdG9ICeRfAbGlshfA9GFJ7jllIY64vqT
|
LT6cBbPpxBTGkgWsapWn6EV+3xa3EBZcAbnls22RYCVmEFABBhwAaadgDxAS5B0AAQo5EIAdYlQEYDYA+APQBHAwkGUWQlUYTeFj2p6T1r8OyKmqSfhpdrlnhBtBXRZhGSBJaxUoGJZVkcWw+afBfAZZW0mjq+JdEyYA+gGmRVQkKKQDVAzZJIDx4wsFHB5K0QrWX1lJyUwDNljMK2Vz47ZVblL5STLuR+MRcceS6hiLl6lVKCvkKYb5VJUQrb59
|
||||||
|
|
||||||
SnSWtK3ORfHSBtKfzlx49ZY2VnJA5W2UdlheIKWW5wpXabJpehRICkp5wABAAQRwF0ClFcpc4nOAgatnAyuglmuBWCuDhFGokExGSCXAnwBlgkuhkr8anABtFg59g9dMxjR50SahYDRuam5n+0UBS8FOlKeS6XvFbpcGEelqRSgXpFeeQAH+lgZcGWhl4ZZGXRlsZfGW4FFeQUkrRZUaenghKkG6wRsd0LmUawBHgiWiIJ1IOD0C+3jPHolZZTo4
|
8Q7Z75EaY+jdldMA2V9lLZW2U54igTblMRKgUmnWJb6mSnnAAEABBHAXQFUWSlWmcWlCqfYNBkXKa4CSK3ALqX2CLCAxGSCXAy/PsYXGiQKcB60iDs+XIkDGOcGPFZLpwyWlMKUX6eZ4Ad5nmRqRZVoulNfm6VsuDkYXlelPpX6UBlQZSGVhlEZVGUxlxBU3615BFk1ZwlZeMBUtwkSj2bIeuWSlKz0g4NoSvp/ee+mD5WJbMXllOoniUCFZJhSY
|
||||||
|
|
||||||
+xlZcaJD5tZS+g8FwplbJNScOfybcBklagDSVsleIVOOlJZr6L5K5bIVrl8hRuUTGW5coUbJQhbKZSVMlcNlyVmgVbkill5SHFF6owC/pDAHQEJGkALQL6YIYQgF0BrY4CZsDMAe1g4XahWXhsBBqhDEHmIgAPkrL3MwaHJg/4tyfc6ZmH5D3b2heZgPbF+1CQhVTym4ZXGCg3ob6EyxbMq6XMyyRThXfFgjueFyiMBERXEAQZSGVhlEZZoBRlMZ
|
KmqAObI1SCOZSaQ52haJXiVzqQSHs56EWvkNKfuha4BpBTBKarlDjuuXC5gleya0m0lSNkSVrnmfknltvqjGjAuALaBDAHQIJGkALQKaawYQgF0DzYsCZsDMAi1i4X2B7hdKVfldkEdY+MfEC/LQefgZ+QPJayGc4hmOfI3Y2hkZovH3F2fmaXjyM4m6H92I0ZgTD2o9skWiMKFb8ZoVWScFlzO54WFnelvpcQD+lgZcGWhlmgOGWRl0ZbGUQl3w
|
||||||
|
|
||||||
XGUJl1KUUVi2sYcibpli/N5ESJlRRc6AVZ5FPGEqdkGxUuM6DhjCHwJZfbHFh3QeInRx7ImyCXAtQEaAwAowPyCjFP6V8BVlYlXSKox81T8BLVK1X2GV2a4OxhEmiOBZCPAWYWGrbAwBBeT106kUwx9yi4fBbLhDmSAUxJaVYw4VmE9tEUjRTHt5n7h+VRfpIFC6V6W/FoWb6UVVVVaRW1V9VZRVNVmGR3GV5O1hAXsyHVaYIqQvYJLK+UlSYJQc
|
VrHQl+wA4o0IW9p5G72CLuSCMZSJagB2Q08dLIUgGMIfBFlXFcKlFhnuZFxsgBtEaAwAowPyAzFq5j8kVl/FYpmClv7tNWzV7KoMUVR6xmuAsYayBxBdmvfifYXMzpiFVV0ZICZDYOwUP+aLhESQYZQVjCQKDJVrCTaWIV6eZNGoFfmdnm/FC6f8VLpORVQy4VpVfhUVVRFTVWkVcZQ1VQlVpIzqMpKZcPGuUEiIxkghE8S6n4gD8gAqFudSd0XL
|
||||||
|
|
||||||
o5ug4hVuv+jEpolhYRiVCVpiSJXBoW1YwXcm5jnBHxO/umG4xO9NSXbkl6vmpUL51ISIHjJNniMZ/RDJZuWOeoKHZW2gDlU5UuV62G5UeVowF5U+VMMUSWxO9jiXbxp++VZWhWqMbgCSAQwIhD6ARoC0BdAV4BRye+6lhQAIYWQM4BfxBacgkBVbuVVbYwN0HCRMZTypnyRVAFIzpwk/CEQxBJdOh27BFppb27hFf3E3z3FkBbWbJBsRVfnOlaSW
|
xA+WOZNJ2JUtV8VCxfQH/pYCnBHiw0EUE5268gVBEIRRjkhFvRbOZwEc5ilbp6jJKlcoUTJelvhFAo5lZZXWVfIHZULYDlU5WjALlW5U/xingE6M1ehdsnIxplUYXAokgEMCIQ+gEaAtAXQFeB4cjvhJYUAsGFkDOA/8Zf6eVudk/g5W2MGB7fAdGUvCeBwVYeRb8SfmnwUg4RdQn6llXo9UjpHGPn6vV7ViX6JBjcdwnNxs6T8W5VmRf9Uel01r
|
||||||
|
|
||||||
nkfF2FcDWBZDkWDVlVfpQGWVVJFTVXkVDVVRWJlgiW5ErRkdWmU7uLREP7dVl6WLJuM3cMWWwh3pOEppqSaJaQTVHRbFGaJqwaPQFwPAGhi4A9wBhDEA5YGtWVZG1aJV4l9WdMVOm7dZ3Xd1vdYdU1OzgIxjes5IPjiHAcxIYZXVxyrdWI4OwV7VE2ZxaR6gBVxaPKpVpcZEXDuMKXAFoVLxb4Z5VmFQVUkW2QcgV5BWzm3Hg1hFanVQ1GdXVUUV
|
UTFVeFeVWEVVVcRW1VZFTXn5JN4Q/nJlbVcUEdVxIp5CFlGKm6Qvig4NkQ7FfeWwX5hIXOe7bVE1d9I8AyGLgD3AGEMQDlgC1ZJ7E1gaCtXZcqMXXUj0jdc3UbFjYkZCV0fpo3IVpaLojaflLpo7VQ46wZgwUJZeF1HXFcxL1HYeXtS5kgU8Re5nbhCFfCl2lVhikVfF31c8G/VGFYT5YVRVcDVlVBFZVXVVJFXVV7py0RRUFBjiaNZxhvWldADg
|
||||||
|
|
||||||
jVdRX7pSNf36OJqNUXV15V0AOC10ewOVrV1o8ZxW/in4RBYSebRS/aTV5ZcJWPym1cPUQua8fkqwxxISSUaBs+ezWLlUhahE0l30aOqc5/NdMn6Ve0FrU61etQbVG1TQCbVm1UABbXy1pJbawq12hWrU25V5egBExMcCcCcgPQJ6bT1McQiQk2VAuuDpxuWpnwfA13AXEbgzLDIqh5PJPP5twaBLKrMsMskX7Dk5paJhQ+74caE3FLmfaUPF46aC
|
DiHCYFZGsPJEhRWMH35J+rBY7HFll0UVLt1lZWBHVl3JQoHdJBJazkDJZJezWYR5rmOCqVOETSU75BlrgCq16tZrXa1utU0D61htVADG10tZTXy17nrslK1a1RIAfxMcCcCcgPQIaYD1l5s4AQkxCZykLxVkOFqscHwK3B/lSDifAgFOLmyRpIFGMsjKS5dHkiSqNyoaVCY+Xp+E3QCVd3a5asFQVqp571R8WfVthk6V8J4dZgWCJ59TFGQAUGIF
|
||||||
|
|
||||||
pjRbCax5JFt9dNEg1eFd6U7OrRLBhxWMcBhDxA62PQDLVHQOYBHAUABfibAMANBjf1i0QelV5+wFpl3hQDSpD08o4WsghRNgl8DKuoUVe7yOVzNzqN1ZNSwWMBKDUPWXaOngSWYN6AHuV9lB5S2U7QocMOURwo5dwHFN/ZWU2L4Q5ceVdlL0dXimQ05c+lXkdypi7epVIb6maV/qbzWuuqoLpVSBQtQZV8l5QLU2lN1QOU2NNI5SeUW5CMTaaJpY
|
YxwGEPEALY9ALNUdA5gEcBQAJ+JsAwAEGCnX7pK0XXn7AGmfeHv1I8YGx9gyyDmWImDBV3nCOxzCTojVBNUPnVZZZa8Ak1mtvlHQN5QFuU7lTZTtChwg5RHDDlkOSk29laTTPgDl+5R2UCqx7OOVCY6yGcq2QmZfJWfRPAUpXc5m+eKaqFQMVJn75XZXWXbleTdUDpNhTUOUHl1uSE76F/JUG4O5kXJyAcAo5F0CLsaZJMj3lscUZAreumVtwbgc
|
||||||
|
|
||||||
GroU2VUGpyAcAs5F0DbseZDMjPlruc5C7eemd8obgmSJSDeJckfqG1uehCWhh4P+eSKJA4FQQnAV0FVEnD2oBUHU768eaHUsuTxefVyCqeQEYIFhVfHWel9jUnVdBEAM41I6bjR41eNPjX43KAATUE051S0cmVax4kbXno12IHxiloONRrAXVdzpYIUuPPsTUMFK/qp5INFNTk1U1aDeB4FN7KkZUiFSlWZXyVahSZXKVzOfPmHxavOzku2gaW+q
|
tlZKKwGOuwLAVnHhXSAVNmSBXiIt6RBVx5HdtAWJ5Fpcnlb1iSWNHvFe9YimH1WecfUGNfxflU5JnpfWBmNn2pY3WNtjfY2ONygM42uNUNT3EJlfcWJE+NqZdiDcYGMFRoYqjwDRYqVuZV2zkYcBMNWvyb6XCFRN3FYtW8VHdaTUthOtjpXCV+lf1mGVnZYIVCVHJsS2ktJTbIUfRq+V9G+6DTUuVb59tppWGMbTeS26VIlWJUGVlDUAkeegbsnr
|
||||||
|
|
||||||
C1vOduWb5ElRy2KVplX1nmVWhZZUXl6tTw0mwFAPQAdA8QFlwUclgeuCcgbIEMB10HAEMAH2flTH6RmeKiJj8Z5kAFGkBYao4iLwlpB07KK4nnFVJACVX3aOhekTEGB1a4imwZVp9d8LZVc9hY0JFVjbOmIFljZx7KxPxaVVQtMLa43uNnjaMDeN2AL43+NgTcE2I1tFVrF4mZRV1V6xZ8jTzHUbCN+WcWirkuZt5uWM6xWQZLfe4k1aiVS3N1qq
|
K1+gBQD0AHQPECxceHEYHrgnIGyBDAjbBwBDAG9h5VuF5tUZC1RgmDxnmQfkfgHQeFILiBlpxwOxivAtkBFVJAUVc3Z2hy4fFVr1FcaSQvVdcRmbehSZdo0+Z9zWkV2KOeUFl55IWQXlhZHzRY1WNNjaMB2N2AA41ONLjW42P1adX3GQm1RQmFSJK7hoQz0bCO+UItzLN2YTxKUggQ2sVkKvCRNd9iY0TmrscMVAoRwBhBLkSCYhCnJT7tXkSe4B
|
||||||
|
|
||||||
a3WP85QEcAYQW5DAmIQ5yf+7l5QNmMWD1dLXk35RymTMWgoLbW20IAHbZHHX5L5QCYJA7uTUa/ArwM/n5aGCvTrlpxwFxivAtkDBbBQFDghYrh1xXBV0uH1RuFfVzDg6WeZf1VHU+ZMdVhVfBXCeC0P1ueT6X1gMbXC3xtibcm3ItqbWi2hNyNVu6J0aNez6KSzVndCwlsISiXEqfwM27KKGTYJVZN/eX23Vl+TV0nmuitfBGCFWDeLAs1Klba5v
|
hA2d1esqjHltlbQgDVt0cR7lSl6rf8CumKSMpKvAIRnq0Y6hrVU4qKXHtdWLCuDoBb3VDxVAUI+ZzT3YbhKVa8VvVu9VOmfFX1Q80opXrWzJZF2BVCq1EAbV83BtobeG3/NkbUC0HpjVbDVzumdUPFbRfqCZCjiURlmVsZZwNip/ACHiooFtQqWA1cFjbXi3bxk+cJbU1ujjiFYh9EYhGyVp8azUKVDLSg1bV+0gIG3xAMQLnUhQKCK1itErUYBS
|
||||||
|
|
||||||
RS5dSUFCPNWIF81qNOfF6VYzRUzKtqreq0puGEFq06terQa2sNdNRBFK1DEarXyt3Des0Fw9wKQDKAzgEMBQA+AAuA+VpgVAALgUABSlCAyVkYASR1TjHEcQBDl/ixqCaNiSWQmfDa3lpZDKkZWGDzbn7cx5CQ5kl+tpcY302J9ee0xF8zgXUX1JPtfVA1YbT8HFVGAVG1TV0LQ5WwtcbQi1JtSLSi1ptNKRm3CJ3pmInsUVQexChQoUHPo5ZzaW
|
tGEDK1ytCrUq3kNL0bLUwRRlXyUmVLEcrX3ApAMoDOAQwFAD4AC4G5V6BUAAuBQAlKUIBhWRgMH6Uxg9c5CHVEOG/hBqSwt+TemZeB+RlpuDGZIP+btS040JDmfQnOZdrXn4EeqVYkUB1Gda63IV7rahXB1gWXu2R1B7dhXvNVlZ81BtPzWG1/NALVG0taHjZRVpZ94TUUGxpQdem2IKyEob+Rb7WIjfAjBcvUBNv7exZV1FyW7FAoGEPoCaAtoI
|
||||||
|
|
||||||
W2XBQBLB0tJnRdNXdFzsRIAYQ+gJoC2gjsHhBdt8HdrK0tSHYO2KGirWl0ZdWXdTraZkZsfxDwPcMopdwvYDxaKwq7W4U8VE4rp3KNpxSTbnFZHtcGwVHze9VH1DLkNG+tVcZe3oV0dcC2x1d7V8URtJVdRbRt7nbG3wtCbYi0ptqLc1WglQiXOr7A+zQxUZlJlEAQgB5PHsDxNKtsVgAVgBTCHktH6edF1tuXaZT5d1NTdpgRRniSH8hsgnhJXq
|
7B4Qtbf+0fWgHQk37+Via+oFwEXVF0xdKOppnzNgnU8DRQU4cI4RqKuhcx7An3t4WsV4xOoYAFWNovXHBRLqvXzt5cTAUGRvtY62IFWjbc0oFujUfU7tJ9d63ulJnf63mdgbd80htvzRG2At9VcC35BrfrM2DxJFt5G/yATTcVtsXAsia/lYBajW4163hVmjV8XQdSJdfBVWUCVMDdiHSWL0TB0s1pJWzUIdEgJpZjJKHYUyYNGlU9q0d9HYx3Md
|
||||||
|
|
||||||
PLazlHx3NbSWDNkyRIEOeIreUC8d/HYJ3CdonecDidknUaDSddMLJ0Y6Hlmw3sdnDZx2H53HaCg4gedjwDhw6wBV3scnwMASrU8rqSpHCFCf3Ao+5tFczPVsZg9UMEF9C1xaiXpDRjPK3NFpIo+aapFUVorOkY2CxceSjXIVYdeKhdeJwD16BtbxTe031c7kVUzdznXN2ruG3XnVaxIOgA0bRLKcA0jikso/bFtpJlW069+WVLAjiL6YJpXdaIU3
|
rHecDsdnHUaDcddMLx3h6dNSxrchgzQrUGFIzajE4g3ijwDhw6wNl1o6IuFsFbFj8vsa7C7Tv3DQ+wqpkQAWHCBlhcxZKDZnq6VTqV0akEBddBxA0PsXV+Bb4njq2tzXc8Zw1VpQgUPwTXicAteXCQ6U8Jodc6UGdrpf12YVOFpy7XtMNTrFbVJUAjWPtuIvCCiyOWem2BR+bV3keqy/GXUgNe3ZwVKOZwL2DFdSXeiFJNEgCIXSFtNZHiG9YhcS
|
||||||
|
|
||||||
V3dl2GcCY1PFnqkzBjLdyZ8FmhYzVx4jvQIV4N9uMFC7wHwN2yhQjGLc4s5PqWzlL5ArfgojNMyaK0qFyTK70o9crcxHWV1iQXBbkJwDYXEA9QCYEiNxaadZrCmcRAQYOSPpnzwgBwfxxxN3cOP7Mag4QcVXczbtVqs94zOz0bVOMKOx1JnrTmqiaSFZLoSxTCaL3O5NnUC0Kak3f5lgtuFY+2oFWATRX4FK0XN6RNOLUlDj+N0IOCBR96bwCRaX
|
XYgwULvAfADGbT6qks5ebbzl8qky3XxvOZHIrlIaRh1C5mhQb1SFZvYeVg9VDU+qQ9ytUuQnADhcQD1Augaw3kIOKK2nDgdFU3IBFpbhIbbBzHIE3dwvfgZL9hJxQoYIeKWtcphsRklT04w3bNUkqNDOl7RwVHmSKhs9HPUHVc9IdXo3pFmSRHUvNAJcInkVMbU1Uje4LYjVJQvfjdCDg3nfL2TxBJiP3ZtsNsczQgQXbz4a9B3Ti2QNjWWto5Gg
|
||||||
|
|
||||||
KQb2GkLXAUR3p1bRS3NJt3X3l5diHY93m2yTIADoIFK0ytzvaf3n9KlVPBlpS8T70Dg2pD03LlMhQM3EdQzavmMhIaWuw7lV/Vy2yt55XH0KtGPZORqh9wPgDKADlRn03GNycSgcYmyI8DoeQaFPFOQVIvcZDgyarsrOIWcYZKuQ9xmAQSKhSKEXjMujWxr6N1pS33b6iFT83uZNfr9VE+vfRhWS99nUG3ht2eSP34Vz7SUC7gHQMwArYHQAhh+l
|
AOggPLSS2Q5a/TJUnxU8KWnYw9yhuZ0YQvnIVzlwyU72LlLvWpXNN6hTKbaVj6Fv28tFHceWJpNDWeUFw6GHAD3A+AMoBWV0fd5WmQtjF6rzEAaLFVOQbwKZDCOrrIcBBoZPdV1oMRCakTAhYBWOICxybf0T4aijefaYsw6evWjplzeOms6nPfLF6dOVXz3oVAvWfVC9/RZAC7gHQMwCzYHQLBjelhAAtj1AkgPsCVA9QJyAAQHQBhDsqNIH+CKh
|
||||||
|
|
||||||
hAOtj1AkgPsCVA9QJyAAQHQBhAg6NIH+BqhRwDHBsgGEEaAxwZgMQDYwTQABDrYkgLgCDUP7b/W4BzAIykAdgDTP0ccfGb2BJm5PJNSNFgXCQzgNpvXbHm9+/fd2H99LW94PRPZfuXNl1QJEIIc+7IewQxT1MyBDAVUEnALAfIFP2X9L6FM1+DAQ2ezBD1QKENQA4Q9aBCAUQywAqVU5aJizlXTQuV4dhDRpWv9y+SR2vqa+Qaob5kfXEO9ldTf4
|
RwDHBsgGEEaAxwZgMQDYwTQABALYkgLgB9UV7Q50FBzAAymv1Z6b40up3Gb2B7GbbJiJtFTnNgwJaaLRxUYthbdE1E1C/U22GpkeLk2Nl1QKELgce7BuzVA91MyBDAVUEnALAfID33G9NZR02pNDg7EJODkHK4OmkDRJ4O/o3gywAwdZTfhoVN05dU1wdtTY72KFPOVf3u96HXzVe9XJck0BDXTY4Mrszg1DFuDEQ9aBCA0Q74MDNfrvy3UN1HbQ
|
||||||
|
|
||||||
OJCgQ0hwhDNpGkMRDAGFkMxDizTskrNcduj0J9oKNXpC08QLOTKW0AxRhWQDcnK4rwzLFt73MBwK3BKYQ4G7R6EPxk837wZDKSpvNwBYfURF1AwL0d9F7QwOAtTAxN23tg/Q51Z5YRhwMONy6bYQ8DfA0+iCD0GMIOiD4g5IPSDsg36K4ACg3ABKDKg2oMaDWgzoN6DBg+t1Jlm3WUHMAJ6WYNq9ebddDOIdWuWnSyZIObphJC/UiXxde/YB4D1r
|
2U0pgU0DxAo5CJZ/9CzZxDCdYHs+XCy0IR+UaEu3PJhDgTtCKrNpfGBuB7N/ifsZV0RzQ9WNd0SYu1qNFzfAXwV1zbaUbtOjdYo9d6BU81/VbfQDVvNJQLQP0D96EwMQYLA2wMcDXAzwN8D7orgCCDcAMIOiD4g5IPSDsg/IOKDU3SL0gt3fSenw1m0Yt1Ei6WmWniyZIKroDgQ/ZSCq9DSaA1z9R2Id1bmd0SHH696AFJXr91LXA2EtlLeiOXdi
|
||||||
|
|
||||||
wLk21ZlieJXMtcpqy3St7LcZWSt//S00SFBDVSVENEgKuX/dgrZUPf9edL/3itFI6SMX93QwmlIx8fSpnlAZ+el34APCpgAIY27F0BsgMAGwALghALaDogTCXJ3uBojSiSkFvYOcJ2asIJnzDgXHBPGtBtbmiROt2Zr3a5Z/dgHW89sSeKg+tFnX62z2qZYwPjd/fecMZ5lw/fUqx+QSFllVDw/wPPDrw2IMSDUgzINyDYKL8P/Dqg+oMkAwI7oP
|
DTd11NjLRf0PdN8Y0qZDahZ70aFuQxIBoj2/byXP9wCaeWpdQKDfmRd+ALwqYAsGIuxdAbIDABsAC4IQC2g6IOwl8dmCQJ3sNvbaqW9gCoppqwgrHLCZ7c4IA0ElucJGa1hmTdvlkt2ntfMNPFpDlBYrt+A2lXOtmVXIJbtHrV16t9PrQVXLpZhMcMMDZwxcPsDnA9wO8D/A8CgPDTw2IMSDJAG8NyDCg3Z3lFZPr8HMATnfN0EZ+sYm1Te/0Gjb
|
||||||
|
|
||||||
6DfnS1WiusYcwBCe2bSXW5tc5hjX42qxANWN0GCumEUFI7NgNXcoUHxWqJn6YkoipLuV/bQuDHDm4mpiRv3WsFHgwO1TFQ7WPWfW1YxQC1j4w4FVw4OpABJgO0FvMNDiN3BBaHwZhicVqKT1ZQ51ar1bsNfNZZqe0ehNoyN3HDU6ZcOA1HZkP1OdZ4fL2JdEAN6NPDQgyIP+jHw0GPfDoY8oPhjQI+cDaD0Y2CMI1/nRP1axLPsc7Mp8IyqVIgKp
|
4oVrSP0L1zRTPGece0QoarIM/RoltBXbRFzfSpAGRxJufQIhA+GrdQ21WDQHfd4NDaLLmMUA+Y/F5zNiPew3g4apB+J/OhlHKNdic8e+aHwnkIxVMCGMvOEAW+Dg10nNC7cLG6j5Dm1071k6WxpoV2Vf5lkDeVZaOvN0dTaN0Ddo8wOsDjo9cMujdw+6MiDno68PnAMg76OfDD9fZ1P1rfhT6tVD7Yt1PpSIE+mAwq3Wm1oNiLZ5wZSmDqLYmD5d
|
||||||
|
|
||||||
YDBHdRbav25GR0aJ6hQ2vdPEljN3b3k4jDY3iP9tBIzWWgRqHdh0YdCtfBPu9n3RzW8tWCr90kNx0uUPeOjJbhFCji5KKPijko9KOyj8o4QCKjiPeGlsNaHQzU8jHHUANcdAw+UC2gN/gU7xA4tLOSkARwHTB0w27Mm4AQjsLORDAePUa1UxMA370HB5zdxBoy34vMMmQCPqX0wgSVEBHtdgmPp1+1UQe63OhlAy14SY9CZlU0kIvWL3xFEvWcNS
|
X+EcFK5m3UljuvQamCWnIWR001mI6d1QdctQg3293AakOXxlJZf0YNlIR73ZD/4PcCsj7I5yPcjvI/yOCjR2mVGclvjmBNU1DNeR10jCaQyOv9TI+8Sn+yTvECi0o5KQBHAdMOZaRuAEI7CjkQwPD0qtiXmq25duIDCBy23EMjLPiFzNqXsYnkChmcUQcXAPo6QQQp0e15Pcp0QpqnUwmiYLCeOM197Cez3u5OndOMkDs4w32GdhavsNR1OBWYT3
|
||||||
|
|
||||||
9rfnY03DkLa50/DigxeOAjkY9eMgjMY4YMBdW3VAAwjhdQdYpjoXYlJSKnpOQX69GsEGjDV46ncoI4xKI0k79AlQl31tJdbNUIGFqWyCcgygOYFts9Y9k2Nj0E8h0tjhyYr64AyU6lP5OXY27l/AuSCGocI6WNOCDjC8FxieQf6cpOkOPJPD6hJA4FsKYykSTsM6T2PnpMJJpjY6WjdDo9e1mTLA34ZujkbTuOJIIY3ZMAjEY5oNOTt47GOK9Xcb
|
DQg7uMvD3owePvDfo0oNnjvwVAB/D6gwu7hjHVf6g60+XnoMBoH4bDah5gSR+Nq9mLWNWP5YXeUDmpbIJyDKABgTWxFj4DX+NHdUDaWJv9QKBFNRTMU+0OCdfwFkhxUHCLxRDgTMQMMm0tzBGpumvuUEng+UIJD5hJMPoONOhSkwz01eqk/EkGjRHh10bDbraaP6dBk/z1Gdxk4N0mNboxZPPDXo1IM2TR4/6PxlM3b8GVyjeZoM8UcLZsjD9T44
|
||||||
|
|
||||||
GFVy2LUB0PyF1TsiL9FBTyz8I5ujwJUCEVFiNgTPbetWQTBXc2NEjEgAMmvdN05O1dGQyQH29NQfRhMq9WEx/3fs/0bhNTGLE/QBsTHE1xM8TfEwgACTcAEJMiTvJesabJD01HZLNUbkmnADTExIDrYulvoD7AHQEH4lTzkKa3BKEBCjhHFDXSQnsYbKJAQXkiTd7WWGC8PjYScmJPu06NjrHo3z+FAxaPHtI6QcMeZZ9YNMnDjo71ogtNjfe3D9
|
ib8I63VIohUaY3Epwj2qQlOIj/Bcv2R4GySwHhTnbaOUklq0viMwTHNXBPEjrvU92ITWQw/ESAtoNROVAtE/ROMTzEwgCsTcAOxOcT+E164bJoPTUM7JQfUK3ljC2PJb6A+wB0Be+mU+w07KgSsASw4ZxfC2nk6OixjhqiJBx40oiWlZCsC2vdjDFxuivI0YD4jVgPl9SeUz1V929WsPtTU42QMzjP1bsOn19kVQPUiJQHWX7Qo5FeAQYVkDBjw6
|
||||||
|
|
||||||
7o4/UZFthA2X7Qs5FeDQYVkPBhk69QOMCVAZ5oQDperRLOQwAW5JgDgCV4DIC8QtoEYBCA0GBhBCA1QMgbGJ4I7nUrTI5tjCQl10EpO5YQE4NUUJ5sd2DviFpCEwnTzBW4NcQD3Z4MmOhqUU11D0zYkOIcyQ6kP1AgWF0O9JbRgHO+DA5cHNBDF7C0PMg4c/GCRzgyTey5DM5Z03zl15Iqr4d9I+gCMj7/QD3DNQreR3A9yehM0SA8Q3HONDSQ4n
|
9QOMCVAC5oQA1jZhKOQwAS5JgAACV4DIC8QtoEYBCAEGBhBCA1QP/rGJXw8oO822MNRWLBLbEiBy9K04FHuBpzoiCGkVkOxWfj50bP0/jxY3E24t/4/dGHT/gz2X2DhQ7uyhDpQ/UBWoVQxyrnd5rPkMezwQ0UPez4Q77Pxg/s2p5lKcQ5OVXkNGEkPXd8HQSPlAylWg3c1fOWSMtNOQwRN5D7s32WezEHPuwlDEc37N8tYM554X5ytSLQnAHQAu
|
||||||
|
|
||||||
MpDrQynOMQacxw2x9eyfyPDtzbQBAnAHQAuCjAiEKsozV8pUc2PA8OE3KPyUBNImZ8Zhs63XVYnsTxTBqk4aTrDEFa83Yk7zaM79dew2300DgvX80TpZJauOsDM6fzPS9m47L3bjvHlC3iz+wJLPSz9wLLPtACs0rMqzthGrMazWszrMXG+s4bPGzps0tMQjSvcIneQNszJPNuJvbtN8I/vVA3V49zslL0F13UKlfpXs7mFZTHBTlPXT6AApVcj5
|
CjAiEPMrV13bc5BWQcQAuGxNoBAGiFT10Imjmtzppx6tOowdJMi4lxsBVTDYFTjWx5cw0ONNdiw4z2V9GjW1PrtjMz1MWRvCc32opewwuPt9pk/WDcz+wLzP8z9wILPtAIs2LMSz9YFLMyzcswrPLGys6rPqzms5NPQ1Pw1aTeQ+s6gBCTCHjC1o1fCMf1MVd+mc5xSwDTCPq99s/FOOzi/Yk0ndWhRS16VOI+IUIL3LbSM0tF09Kr0tqc1zlEjX
|
||||||
|
|
||||||
Iyy3X93LahPfdfLcH1yF8emH2UNhpjUPEjnLWy0WVgAx3NIzAoxICdg+wC0BPaEo5UAxwQwE0CGIHptuxGgRoJyBV+M1dbU6Zd0LjJmGK8H2CIjM8wmhmQzuKvB7K+Dlu0PNR/M612hrrVPEvKxnc5l89AoNaP9TPtP632jPM8NNOj5k3fWWTws0+2ONYs+UR3zUszLO4Acsy/OOAb8/WAfzms1uTazUALrO/zRsybMtAZs/eNxjMYVbNYMsIyc4
|
NeMlZzrLbvnstG5fAtctVLRXOK19QylPlAnYPsAtAO2lyOVAMcEMBNA+iAaaLsRoEaCcgMQdXVm1lyXdBYyXYyvAbCBKKxynCZkLtEhU7RZGqqjFrRqOxjcVQ6ERByk89XLtftU60j2PoUQMH1XU6QPrz84wN3GN1AybD4APM3zMCzuAELMXzjgFfMlAN87LNLk8s1ACKzj82rMazLQFrMnjAYy5EzuBKBInbVEY2UEIe9zN5SrdI80At5l7cEiT
|
||||||
|
|
||||||
JhqYydbNubzCbrV1S83mOLUcxHRhnA6jtFOk1gleWPDzqXAgbrYZcucA9AnEzkAZTCHRdNH973iAMozRSyUvZD+PTPXo2kIJcWuI+KgEHXQ2HmeRKLBXl/hYyE4zu1Lh045vOl+283OPpVC4z9XLjMBZfWyM64wrGuj1ixNPXzrnbfP3zzi64uB+r836JeLX834s/zBs4EsALrk4+MgLPfSVBwjaY2CCQk+DvCAEt1eG10pLZIpsFqOY+ogtm9mT
|
ph9SfK6jVIXZOZhTEgAtily5wD0D0TOQHFMAde0x55IjliclOUTyS6kvpLMQwj3QOHPpCBEuT4bsGeBLBRIs/AUi6g6mtXMdxhTtC4TO0OZWWgnkjjS7XqPqL7XavP2lxA7ov6T1hgYuC9/XoNOHzx8xYtWLnvpfPui9i3fPOLD8yrNuLL8/ZNd9H89pMuTAI9IlgggJKg4y9q3VV0RLXbHsKUgmPGAtxLwU/t3wjOS/qkuzN9kJYOWxEyBMBzwP
|
||||||
|
|
||||||
aguU1l0/qkodVrszWsd6Hd2X8lAK/RGELtI+pVc1aEUR0/R2E2R2jNFc+gCsL7CzACcL3C7wujA/C4IvCLzHbBGArtE3DM9DfI0wtdzB5GwBNAs5H0CwY6oUaD4A1QEcAcAV4C0DQCX+FSyUx8nZn2z1OXlD54uU8IiB0Yci8FCBoH4cyxpqIFXPDqT+fppPaNnVrONet3wvElTLgoEZM99ZiwDV2dG44ssJ1i6S527juyz4vfzes4cv/zwS4AsW
|
URMMRkE3L6n9PqbBOoNyHSSN3xSE89PoAtC/QswAjC8wusLowOwucL3CyR2QdXy9B1P9ZEwK0gJ3nk7ysgTQKOR9AUGEqFGg+ANUBHAHAFeAtAIAm/icgIo+qFe5X5fl5ouU8BbNZeFzJ5DBQHk0n60+o8PJ1le8k6gPzwyi41MPwcSf0us9mk3X1IVukyMsszc4xaOGLHM3EgQASy44v3zSs2svPzHi6/PTdq0brNAy97WN7Z1wmex52QxdcGh6
|
||||||
|
|
||||||
zh6SAvgyu3Z1U+TSYVUW12hXiGokmuNZynOzkaF6wdOWja7j8V2S7FO5LyXW3Wgo8QBQC2gJgYI3U65Swf2VLvs+2E1L6AMGuhrC4OGvYzr5Y1GhQxIFqmHwM/rg7gEoODUFdubU+ZDxqLU4j7tTKPhc0jLJnfouKrBk0nkAtx86ZMWLo02zLjTs3Sst6r6s94u+L/i8atBLIS920hNRg6UE8AsM6r19x6vedj8ZVIrmNBTPLFqNltYnEHkTEHsy
|
DTav/X1qjwOQLXLJ7sWUJLJbSKnoA8QBQC2gugUw0o6WSwl0PLDWbAurV1CxIAurbqwuAerCM5GZZIxIJxyHwQ/v0PXQgaH9gVBDbgODcrXMWD43QVU6EloytU+T1dLpzT0sziIq+pMTp+rmvPDL3Xdu07Dsq4Y37tRi5zOQAyq04suL6q+4ueLdbdG2kF2sTwBnTuy1eP7L4aOYJ9VCYy6myj/9cTNHWAxFtPieF3jxXQL1g4BPRMx0xB0bJyEc
|
||||||
|
|
||||||
gvgTmU9GtNjvy1wUO+o63dP9Jo62zWvRec8UNQrxDe9Ng6Jc6R3fTwrUoVkrFK1StDANK3SsMrTKyytHAbK2/GGV90zH0MLiM4xPMLCEPAn6As5PUDbs9FcsXTtGWkWOTBLFW1OZ8KZsFDRqIBkcI/Ask8vPBg4IET0bIGS7jjDLToaQM20zM+q7dT3zRzN0D0y0fOvFV9cwOarJ81cOomcve2tTTzgIhA8i8QFeCjAnIFeDOAlQEIAxwmwB0DOA
|
vl0t8hTgoArSHZa7Ulj0+SPITBGGwC4r+K0MCErxK6SvkrlK0cDUrQPUdPdrIM4AmVzgraHaoxys0ID6Ao5PUCLseE5mM5d4o7iCrIIwQGwl2EndGCWQwqlgxlpWRMJOjzqki6bLU2PGjgDj5PWTODmFM6aX09C81CnqNZhm8XrDpazovlrZoxkXVrxnbWuKrzgIhA1iV4KMCcgV4M4CVAQgDHCbAHQM4D0LQwN7A7IC2KMDQYkgB0AdAlwNLROE
|
||||||
|
|
||||||
7C0MDew+yOtijAcGJIAdAHQJcCy0nhPcCchHQLgDVAUAB/zmz6LZCMSSNsxvDuM4KUv3OIoU88u7KMG8PHOD7RZ8trrFS6g2brdvX8u1Dscy2XxzzQ43PMgHQOQC2w4QDU2BzCQ3XMhzDc6kNubpZJ5uOOmcx02PkOc8/0Edhc1pVMjofWXMIrt61QtfrMcyU0+bz1E0OhzrQ4Fsebrcz/HLNxK/+ukrPaOYXPAnIOtgtAkhI0sxxsrkkBekmwSv
|
9wMyEdAuANUBQAD/NrMOTvi9eu99UvexCd6auj/Vl498qOvPJmRNiKxLdqxAsvu2LbOuljE+RTXoAdg4XOhzXsyXNhDzIB0DkAtsOEA5Nwc6ZsPUIQxZulD1m7mR2bJ8XHPkgU5YnMnkycykNn9aQ400qF2czf1aV3vcZsObTZUXPFDlm1ABubtm9HP3rxlS/1ULhS52jWFzwJyALYLQCIRlL6xpSAADrpCsErw9PqxxhQ3osiQz1+SHDa7NE87g
|
||||||
|
|
||||||
A8CBfa8aW0G9UUhhQ4q2opgVGw5BX+qRNTKvo+fXfBUDdu82RsoVda9zMNr1GyNO0bY00sttrasVC0sbbGxxtcbPG3xsCbQmz0AibO3fWDibkm9Juyb4tPJuKbym6ptmrGm8AtzqPAK/HWrFg7nzyRqyPctQlkDU8uOCCsl8D8rUU0gtlZns5ZtRr1m9lOFdsE8kw4LBC8Cs0LlI3QvITNI0UN0jJQ+UBFzsK59MKFN6747VDyWzyYStuC/Qu/xO
|
zTD4FXVO6Rw47EXnNNM8vO4bDM0MsEbWwxWth1Va8827zBw0uP1gFG1Rs0bdGwxtMbLG2xscbtRFxs8bfGwJui0QmyJtibEm1qvfD0074vkxcm9eP2QSBLFpDrbGT5P/15dE/L5Zk6yraQL2S/pvOzyI3AvUjKC+QvILZC0gvm9clckNYL102nPO9d0xkOEL0puFtUjqIy9sfb/vaDOUL1c+WP1AygKLRWBcAB0BsgPViSDOA+gKFZ++1QC0A7Lq
|
||||||
|
|
||||||
hf/FxrEAPUDKA4tI4FwAHQGyBTWJIM4D6ASVmH7VALQD307YYiya0QgacVZDokpwGf73M3evXR8suyCh5GjLraaNut/W/pGszw259WYWi40YspsJi7lVzLGqwst0bra4xsLbrnUtu8iK29xu8b/G4JvCbom60R7bdMFJsybmwHJs9ACm1Junbam6EvLTFq1dtuc1q+UWl1b4xzHsprq9mOVtB0+7R7KXq8BM1tpY8+7uaU7e+6dhMAPMjbscAHk4
|
2Hwu7VEIOnFWQ8JKcCcQ5WxjpV0XLIDAH2yjS0tWh4ZvIuxV2kYKuYbD8A60adwLOlVaL9fWWt9bRGy30kb/U2Ru1E42+yLUbtG/RuMbzG6xs9A7G3N31gi23TC8b/G5sCCbPQMJu8bG25JteLU0zqt1mPABZyhjmzoat1FfWkqLccFq//NiIOkdyk5Y+ZUA3XbzseNUdB7YTAAzIi7HACJOcXTtPZhPq3lHJdBS95YFw5wG7tsAHu17v5bRaYgQ
|
||||||
|
|
||||||
5dXyz7M2bIEXEqox5wOHtsAke9HtVbnKy1zY4+fEASncBfRGq87rKIDA4gAu2ouTje7TOMkb841LtKrqFRNtUbCuzRtK7s29qug1uq8xusbmu5xva7623rtbbBu7YRG7Ju4dvHbVuyps27A6+m2nLV2/f5RLr41cuIElkKAQHRS/bI2326ZjcxTx76R8twdse+gvGuhI8DsgrtjvitQR0c9RNIT1I6pUQrnNX03Qrf3cXNfsOE6ju4RROyTvEAZO
|
o4GfAE3rc5O9sXIkVO1sj6hk7bdUdLzWzgMqL7O6u31x3W/vVZVekzKv6LcqxMuhZg06LvxA4u1NtS7s27LvzbZhIrvK7K22tua74m9rttrp41suZmF/vqvFJ00JoQAEsAz538Np9kGanMsVbK42z6idtO3b3q/duJTS/c8tATYHYSWvL3y59uwd/mz9uBbm6+kMITkyRSPoAcOwjvEASOyjuix9wOjuY7McNjs7LHLfDHATmdsluUdqWzDsBr6A
|
||||||
|
|
||||||
xTvCx9wNTu07McPTs997I2900TytXlsIzqzfjvIzAtNBj6AkhjwBkAzABH67kmwBJ2aA27KMCaDSo04W3GLcIvCWxJIKdzYuHS7BJKlPlBGJN5+pdqiSrPMUZ1yrrfYKA1rw3cqtd9xk/9WZ58y+6UXz7AzYuj9dw7tsSbxuwdtm7R2xbsnb4++du/t9Fj57JjlQXasJS8VJn6BTv49XgnwtdcmLBqevf7tZLtbdo7+r8USl3oAs5BwAwHqrcnYx
|
IhAQY+gMQB0wPAGQDMAAfquSbAHHZoCLsowFIM0rXlUPUtwi8Nhokg63Mi6eBEI7KUeUgYm3malqfjzFyTmfvyuKT3S21uvChaxzuvCtfTssdTundKuPNg2zvPyrky8YtN7y26rurb6u+tvt7W2zrP67agxL1Z1bk0avDUbAuxSPiBdSfBF10Yp6q2rvRfauaJP69okSAo5BwDf74rZHbe7c+/P0L7+08d3+r6W0quKH+gMoeyboU0Wk4gcQKcDm
|
||||||
|
|
||||||
7f2+4MbrgO1dPbVirUYcmH8QGYcZ7MAziBxApwKvBAWLcPCCqH3O1pLEMj8nUk3QtRg80lrYSWWv1y9M8hZV7U8owdLj0BZRuzLcJtNvN7La3Nuq7no1C1D7Qh+buW7Sm+IcnL67lIe3ht2xtOJSbKeTNHdd8mW0/AnCAoorr4lhYfez++7b0J7T3XHi3TJJQMmHrKEzftoTgOoR0P7SO5etfTAteXOJbEAIhAwHcBwgdIH+ACgeIa6B5geUTKvq
|
CgxEyg+c5W0ZJYMPydUk3Q6RqPNprISVD7hJnSyzv5rgoMQe57cKZOM9bhe1Qe9drMxQPsz9B3WsQAjByrtq7Gu6JvsHmyx2vQlPAHeFG7TeTYiUguoYeQ9VvFP1UEiPwJwh240IzcvmDWLb+MaHuSwdPL7C692snTUvt2srrtLTU077/yzdOAr26wfu81YKxABf7P+3/sAHQB/gAgHv6uAeQHN61UcULEPRDMf7WLJoBXgiCKMBO2CM4cpJAwFV
|
||||||
|
|
||||||
Ottzv6xAe6BqMXYBXgiCKMCRWKaxcq1becWOwdwYomGr7CqNn2JG29NpQe4DewHPPtbSmFARmljM2QNEbhjYe3UeEu3Tbi6+84nn/N9e4kflqTe5wdarD7TwecDdi/LiaAzgJyDBLmgAuDi0xALaB8bvgKPhO46Oq0RdABhfQAIJ+gBRn3ANMEMBXgWbkaD3ACGPUB4mBR8UVWzHkS+PS2E6wPGP9sak9s5jZsck1SwS9Qu00Y9R47pnTuIwDsYL
|
PBtRu/Mn09+Y8Kso608mI1aYHaJCqIDzcNvJgkzyG1awKNaG7Tvaj0FXgMrD1fcWuWGdzYEeVrJe4LvDbJk4e1mEygJoDOAnIB4uaAC4KLTEAtoIxu+AA+Lbh/atRF0AmF9AGgn6AJGfcA0wQwFeAJuRoPcCwY9QJCbxH4JvrtuRl4wt19rI1Lb1BqJ21gqOHZy1LCHAA7ZRiO7hNTOvLVBmyiNBzBc9Ftmbxcy4OlD5SHACMw44PZssnQQ05thz
|
||||||
|
|
||||||
QOzTUKWNc45u+bCc0ewub2GfoBwAjMOOBebDmw0Ppb9c1KepDVSHKdLoac90cq8bTXkPZzqarnP2ucO6esMjMW4/txbLI3zlitkzd5u1zKp35tqnrQxqfynDSwAO47XDf0MAbRTIQCjA5hVD1BNzhxMOWQ48wmJBKV3PBuoZzrWFD3JUPse5rDNmWvNbDG811Pi7O82CZ+0hw1zMrjDe0kdNrM26ket7ELe3vRiMJ3CfKACJ0iconMcGieYAGJ36
|
Lm+ENcnPJ6Uub7XmwkO+bUExfGEjShfgtu9QOytEP7m5VFsCntUM5scnIpwYDcn86EltbJgfVXMClUxxGCjA1hd92uNke72HFpYG6dh7KyBAoascC8ZFVhQNyfl7rudW/vANbU87MNztc8wsOeHWG8sPM9qww8fGjSFoRvdTYy6XuUDYR4qvfHvx/8eAnwJ6CfygmABCfui0J1eCwnBgAidInKJ/sBonGJ1idSb3ezwDrRfexlkupZzLm2knOOm0
|
||||||
|
|
||||||
LYnV4LicGABJ0Sckn+wGScUnVJ+puSH4tjwBrRc+wyfwj9cvkgVJtg9Umvb9IDVbYwxAfA001iDeTWapzR5MVbrWC5jucjYO7EMQ72O9DvX7sO5Ct37CO+adDHzI1/3Wn1CxICg7VI3ROo9DE16dFbMBIhBHAlQJsBDAGMTsfi08QH4tQAowDwA5ulQAOcfOzO5Xac7uMoBEaRh/Mksv5TdMYaPy6fE4iMYucYLuaLwu9othFaZ+MuS731bWvioc
|
V3MVBdPOlAPRSvG3LPu7E0MnD2/kuuzrJuDtoLoE6QtEtEOx7r9JMp+SV4K/23guPd6laCtrlxC3f1Dn2IwOeuWR5eit1D7+zocUAiEEcCVAmwEMAYxsx6LTxAzi1ACjAPAEm6VAFZ3FH47Ue8fBYygcW1Hb84S/DI+RrcD8la0KyHRh5xsi9aGWtTO3QkeHhB0lVqL6kwKBc7LrZ12btkZ3ovRnbx3Qfl7xiwmd/H3x8mcgnMcGCfpncaJCdmEW
|
||||||
|
|
||||||
u+L1Tb+Zykcby4J8stq7u4xWewn8J4ifInqJ/KB1nCaJie2EjZ82f4nV4ISf4AxJ6SfknlJxIdDrVs75VO7Obb5PHBPcjiDOrGsNiHr7o+mbiZL320wWMmeh07GBr5QAhgYQu4PcAwAbIH0CrVB/veNYl3y1UuQe3p6pfqXml9pcprlDpCCl99GKVodLkjcFBwXw4AhfNBtxwuGDLz1XhtaTb1UNvpnJ7TXs4Xh8z4a2dIJ3HVgnQs6RcZHrnRRf
|
ZzmfwnV4Iif4AyJ6ifonmJxwfSbna+5UpHLnYEvXp/gV6aW7I+4r1ZtuRywUWQMS9t3otu3cFMOrDzkkvoAsGBhC7g9wDABsgfQPNVr+J41+mdn8TYvt+rXdcrVCXIl2JcSXCMwBaQgGfTRhxangdw3diX7XdB7A2LvsfjDfY3dXuHVM6OObhrU11uDLBeyaMwXoy9uLjLsZ4hfhHyF0mdAn6F5hcZnOyHhdwneZ8RcFnRZ+RfYndKb4sDxlZ6kf
|
||||||
|
|
||||||
lnlZzRc1ndF/Wf7IzF3ietnHF+2ednPF9SetVVsz3GDnjFWCCIgG/Oh45Zpm5Oc8sRJuDjvLLgxZv8nEE4KcH7MEyKdwTp+9wEsdYK7ue4dx6yaeHnAx5hMXrT+/Cvh95QBQBPnL52+c8AH51+dQ9v5/+eAXTijaeYdIBz+senaPWs1QHGAFACbA9QOflCAlQBYDMAHdecAEAPc10B/gRSaJMcr4kxIswgHEKtQyLJWpGehsVRjX2IXmNUEVSruk
|
2ciIEdzzEbbPsptFB1QDiSHbZ8UcllMTQiPlHWh5UeETT+2vv+Oq+z8sn9DvbvstHW6+g13aaHXuudH257uf7nh55IDHnp5+eeXn151iwkLlNfldorQzVR2bnQe0ChFYmwPUC35QgJUAWAzAHXXnABAABAnAXQH+CFJXExJFFpw4HxMDmd0BsKxaTp76yv++fd+fa9PK5pFKdQF+aVEHzU6KsaTHCeGf+hm85619dfU+8cDTxi/5e5nhF/mekXxZ
|
||||||
|
|
||||||
aLsetGF/KsxHvU7XtCxLB6quTbje8kegnyu2kdXzZF1NPJXLZ2xdtnXF12e8Xbk/WaiJMhzEu+Th07yt5ZlBfiBPphPUBS/AvJ2v6OxWiT0UOwJwPoDYAetSEDmHtV+uv1XLR4BmJ7irfQCU31N56rldBzcjYfjuSGshDgzrPrSPXcmLirvkknCvvBszUyEmlryPhEeV7P1/Qe0J/1wFfmNJkwRd8zA/S6MQ3RZ1ZMlnTFzicpX8N2leI3mVz2d8
|
xRdln4ifG3tV/B1dD0+ZVk4EnLCJoVmS4z6d+RSIgU+Au8XMh04lZjMxvQAnA+gNgCa1IQKoe6bpR12fyXAe9ocDXlEsjeo3Dqll21j0DreNZIyyLFS/k5J6+ci4jan9ioqh1iZDD7PY3PDOHGa64fZr/K7mutbp1wWvnXRa4QM87vW5xpN9d18EcPXCF362DTL1wRdEXJF4WdkXJZzrtvzO252uLXKR/NPfzjwBXRmxVu5jzImQxOJxlZQU+ld3
|
||||||
|
|
||||||
XM3rxFgLMGf5Q/jhKmPoHTUxMpxfbO+7FMW9aC1YdCnNh01c7r3AV0cfdMO11cHnr0/ft9XT6p9PP7Yx0b6mEW1ztd7XJgIdfHXJwKdfnXUM0j1bJYB7sl/r9562OTNQwIQCVAtoJUDnAIIgGuiNF9ITctcwRODjwbniQzpwgOIEdNjwFWmlhDhq8K0H+1+G68eEbVpcRsK3VAyNuZnnM/QMzLwV2DehX2tyRfzbkV7uPvaMcIUulb8QNBjEA9wG
|
Lu02UePLj272enTkOcuvM1eIynO/bd3T9HTnwK9Vc5zEgENcjXf3eNcmAU1zNdzXC10ivAzBp7UPgzz68rWYAQwIQCVAtoJUDnAfwqF1FpSewXarwyLhVZMoTp54msCcIDiCcpdzCGqOIA4avANBfK9a1UwKG8aVKN2Ayp1CrMFcGe0zVzWGfaLAR45fF7cF0NtS32QWFlsAUADHApLWW/EAQYxAPcBsg+wIhCEQFAJyD4pfw5ABDAEGPQDEAXQX
|
||||||
|
|
||||||
yD7AiEIRAUAnIHimeTkAEMDQY9AMQD9BzuEcjVAGGql7PALQII04ayN9Pv1mNedP2lHqhD5SwkON4pLkmHJ3iJ10lwCtTO31V7vuNH7t4zcrntm9uv2bqW/ae1QGW/5vOn5RDWCsgBgGnN7rdrHafinDp5KdJzlSLA/MA8D/oDan/txgp6nWc+FuGnkWwXP+kx56Q0r5FQ2ecR9GO2KfKnkD6qcYPNMKEDYPbAAg/LX+W3/GbHirTACcg27BwBbk
|
bj7I1QCBqxezwC0BMNEGl9cJHH8w3n7bhJwoQeUoJMpuyEurRSdI1aYV/km3MN2bcdnWV1bc9nuV/nOdNIc4KfmbWp7VymLNYKyAGA0czUeRb/JzFvhzP96EDMA/9/oDRz9R/SCSnPm1U1+bl007dlXf27gsZzCp6SNKnrTZ1fAP7945sanQp9/dlIv95A9sAAD+MfDNkxzocwAnIIuwcAS5EaDReYa0lqnwnpptzFoITdB6AkHc8cC+FfQ6zfjD
|
||||||
|
|
||||||
RoMl4prFaSFDeHEiGWi3R9zJCQhUxwOq5b984Z1urzLzcmd9bfMQe2DbR7d8fszg9+RvxHQV330a3zo6G0T34V1PfzRz9ZoxQAc95UAL3S9yvdr3G91vdsgO9xAB73B90ffAQcAKfd7AdMBfdX3HqFlfxjVs0+UlH/cdGD4oupBLezrKvKyi32dmrxCRsxN5dFLnHtw1eYLR+9uebnE+SDtY7OT+OVPTX3YH0/dpQyH3rl8W0NeVz0M9k/XnhK7y
|
4816egVhzZnt13rOw3cdbOG2u1+H9lxGd87UZ85cxnoR25eKrfdwPeVAQ9yPdj3E91Pcz3bIHPcQAC90vcr3wEHADr3ewHTBb3O926hhXFRb4t3lmtxC2gbQ4OqSknG3KfaaavEIGy0nFg/SdyXmh0lM23z2+9srnaLBB00jj/ZvtXdyDwFvNHaD/Kczn1/Ufsg7ec6E/Dn4Ty/v0jGK4yP43EgDAD6A9ABBgBIdMJUD0AWW00CLszgBwt9AMAEY
|
||||||
|
|
||||||
PcPrEbw/6A9ANBjBIdMJUD0ApW00DbszgAIt9AMAEYC2gRaaIuOFNtc5BsZ4835RokbGJh7FoNWkkB10f6R4ky+6G1rLxVKFw6FoXKVdEdYXZ7TLu2jPoQG1q3oN4Rfg3Le5PfpHlj2VWz389+lYOPq9+vclyLj248ePh90YDH3Pj2ff+Pl9z0DX3wT+EsW3EJeje6xvk8AZ96g8mlIM8sCzBdc+Uir/fmbOS8HsQboewXB/gW5MQD0A6gHY903w
|
C2gNgTeeqt5S2uBdD5AsfDMYGx8rpDgSQO2mm0Cojd507kVX+eM7rdtAT4Hea8BeCgOezZevCEF9deOl2wwNuvHXd2XvS3xixo+D3UVjo/j3k98XIGPRjyY/L3RgKvcWPG99Y/b3PQLvf2PgY74uwlv1ybuGxpgvfoN6WiolJqarF1LaNqq1wGh33RR0Kl8X8/qW3lAf4EuTEA9AOoBaPGN/W1QL2N0E9L7zbcrVgvEL1C+1xpN+sYiuZkPsp8Q7
|
||||||
|
|
||||||
Dmk9APAcaue2HBO+i+Yv2L+WBBnmyjdBmQZynxDf4x1cSK4Osj4s+e1KUozowLkt25dwWU49Q4aPB9bs9+X2F0wd17OZ0CfWR1jefNhXW48FnXPULbc92P9z8vePPzj9vd+ibz148n33zwE9/PQT2bco3PAJirrTET4lJiYMZ4UOEqSIDjeC+PlGA0ziKT3+HINy54S8gPa521eQRrV3ivtXV+51fGnQd6U9nr5T/r6jHCW0b4wALT20+EAHT10+
|
+HtXdjGM8rp0YfT6VMeJQzzBtmXGezmsnXiVTM+gXJB3nt2XTx+3fUHqz7QfrPPd4NNbPWjzs+j3ez/o+z37osc9mPa9xc82P1z3Y+ln+95mYIqc0y48i41veZknwPVSMQfhAChGICPLZ3jWcV7Z2of3Llt76u43r911dFXZLY/umv6CybaNH664r4u3nNRg+PdIK09MmehT8U+lP5T5U/VPtT/U+NPSK6B1vLz+2HePrmK6M3fSJIGQB1PGMRBg
|
||||||
|
|
||||||
cgPT30/CPgz8M+4rdEe6847XD3js8PBOySBkAAzxjHQYgm4QDVAhAIhAcAnplAAKgWB+M+z18k9Gy1Rz3vsLwbtGE1bjwNdLe7e11B4Z3mjnx5CkpssRwc9TyKq/Lt5nxj5Yu2NOtxCe3DfxbYTqvHz94++P5978//Per7fc8AhrYJe2rkiedgd2Hyid3cpnhTC+vKqWM0Gol2h4Hsk3LdWWHk36AM8BqAoCYQDbsLQLi9H+NLU691Z6DUHGox17
|
sbhANUCEAiEBwCGmUAAqBQHPExsYmQeIHZC1RpIKJiyK3D1RglW48CwUHu89TJMaRkRcdeWXZ13V4XXAoGQeLP3PWLfmj8Fxy+FVg08K+nP5j5Y+b3Vzzc9SvOJ74vKtNFwm0dVp9KsFBNgUdb0viSJM+SvtS8Tt3sFF1kC9DFTqxADPAagNAmEAi7C0Awv063pvwv2V8E+KX5Y+u9lIjgNu9hr7+HWmtiwG2O1Onxd5ayhUaOEQEVT6a8muc3ly
|
||||||
|
|
||||||
5UiOA976I+vGPcEWNtT9rQ2+nwTb5FS44FAcWvS3YR7LedTXl3Qf93DB8rfCv426K+j3Zz+PcXP5j1c9P1ZVdO+fPc7z8+BPN94Ud9nspeE+MnD8mJwRUrRfptMxZbRaF7KpbWZsINrgwA8GXMa/b3dJu650cHr+Dz6/IRfR19HnrYd8McR3Ib7hFZvpADm88Aeb84AFvRbyW/QYZbyCJAH366m/gHfQ2tfen5wGyBGgAEBhA7XFl7gn7KiMmnGU
|
+I8NTkjwKDeHcz4y9yPzL4o+wXyjy2+uXGz+EcdvZz92+XPtj3vcDvnaxKXOPffZirEzUi+fdYKUIH2YfAvjJm1cXpgzxcP3erxbcHvz94sVMni64HP23xtl9vb7NryMm3Tbt/dNOvNVyZ7hvpAJG88A0b84Cxv8b4m8QYyb38Iqnttz1fg9VD5Hflj5wGyBGgAEBhCjX6l0Ql3JsMunEAWTpyANKRDyfl1TxLKzBv/AN1cPDfA6d+whRF0BFXeY
|
||||||
|
|
||||||
O8G8gNNRHEA9wtFkIRVqBKv5kBZus7CMQMMz4xG8c93Hx1o9fHvl7o8A3AJ6h9GPQYVN0y93BxFeyvrnVeAPlJwEYBNAvvD0AeN6gyGXxA27LF7QYqZZAAnAzAIGqSAs5OLTwgu4HADmBT6NpR9AQk8R80nFt4c5jr8+ydb2X9Aj3A5Zmh26vt5MGRPEIvLHzVd4vvbek9M3+JXZu2nSp05uZbrm6EBsgiDySX0Pw39A+jfzAON85DhD2FtzlJD8
|
D6G9cdPVJhiGf3HQt5KtMzRe6y+d37L+B+cvxi1eA3lJwEYBNArvD0DWNEg4GXxAi7KF4QYLrZAAnAzAB6aSAo5KLTwgu4HAAGB96GpR9A7E/B/hXna2s49rBJ0m103b7jDbGDVu8MGtqmyl5DNnU+6bd/tj937t5L5H09t4PgQ6A/CnVm6EBsggDxB0mbrJ5/fsnpc81/MArX7EOmQE5d5sJziD+OfINOC0k8kjs5869stXVMJ8SAHX+qdZAmpz
|
||||||
|
|
||||||
9Mv9R52/0nnlpzQ/jNNT9XMoPDD1kBQPTp7N/zf6n5ncbHTTwTuaAfRaQAAQMADwDAv3N9clgOtrQ9A3XhV04NMvH4WZBiYfvT3LHwlM11tJnUFSmdwfAr358q3bLmwdrjiu+c+Fnlz1DfT3U01F9dAMX3F+CNiX/QDJfqX0aDpffoll85feXwV9FfuzUpuVAZXw2FLvJH8OueTNX0OcL7suHxnbT4l9XiXVZVw/IIy3pF+NznlLadPdf50wS+vv
|
1/xbLX/qdKBvV2/vGnOh5oCjFpAABAwAPAA88Yvxhxm8FOVTpuBFoIG0j2E7wmEf1dypmZ6f7NjW82eQVln97XQpnW7I8lr/hw5fAfTlyzJrPrn22/ufnn95++f/n/QCBfwX0aChf7ohF9RfMX3F8Jf0zaJuVAKX7WH9v6X4kfOTPB72s5fDQZsoEgy0yppGXmNTDJuk949DcAv345jcOzpH4a969dXxABRPG/W9uZP0T5a+0fcT00cKF9Teg9Ar
|
||||||
|
|
||||||
DLQN+Xn+T3U+fUJJVedQ73rxSEnrPV9FsbflD+UMo7kd+vk/9C19gti/0vzeftzWd1p8Pnl+TKNXghAAsrxARgOthHA6QLAInAetUYDOAFb9cl9LQ8D2CB5B8GFCPpMj73oI+S8UvD7wWoshc5mqF8lVUJ4P1aOTLOFwKB4XJz0O/BfFw2Y/SvHoxF+7jKP2j/xfmP9j9pfGXxAAE/mmUT/XbJPyV/k/5XwC+axICzyV5XxdbIcbvxWF5AcQ8VGl
|
909N+sfs36/TzfYO2E9c/1Qw+vQ7O3/k/oA9+XyNXghAFMrxARgAthHA6QGAInAmtUYDOAqb+Usx8nlKHkHwjnBPXhoYUOD779FFpDgncMG/TvqjtoQBfRFGG4Gds79Lz4dehmi5BcUHUqyy9BHNB2zP55bn+EcefXQF58+fTDVD8w/IX2F8QAiP+pnI/PAPF+Jf6P5j9pfDj52sclUV7RcdVGOA8xsCiUjp9X3C/IARW9fj3WvFt/FyC93dDE/E
|
||||||
|
|
||||||
JFebeZShgEXvfa9TVpN423si2AFxPxACrABBUska5YeC/h+yzcE73fzCB9/H6yHvI2Sk9sqkgdyn/iTwFn1jh1asjexYSUOA1y+7tL1ZWt6LlowYvh/yHwF8j3QX5NECz03WF8WPOH1C0p/sX2n/0ASX6q04/eP/sg5/JwLl/5f+f8V9k/FPxV/ZXFtx4svJuOt4Rk8lpEg3VYQtZ8DppPA6kkTcefrv0+fk+98XviNPbkS9vbsfssOi1cEJhftM
|
BSsAENSter6h4z/+7zP3jdgJQKNgD1/jf4YeyH5S3C7XGrKZ+au1FzJ8DI46Wvw34unT8cq/mN1dO1Ib3NzS+qNdL30uC3HxvZ/rzzM05+gfwP6o8Qfiq+H+R/kP/QABf4rbD/w/OyIn8nA0X7F8p/qP0l8Y/qX7c8+Lna7YtZf/ewvyyJRpIlJghXz12xXSKWhvNpX8MrpYMDXu38AJgS08rha9Bzia8A3riMxvrd0KSq0dKrv9FnunOcNfEr9I
|
||||||
|
|
||||||
AR1dZft1dg7gG8yFoD0rTqChDfsAkTfnsBzfpb99ANb9bfvb9ljs1cvXjr91jpp9IDt6cqzKdceAHAAaYH0B6gHABRgLp8EMCcAOAJIA6VmskramM9rkqsJN2hIg0SHcpl/q3BH+pbozcPS8OtiQlfah9dXPrKtQ/gKBe3r81/jgKAB3vhdTnsO9m1sRcsPoj8k/lNM3/h/9ift/9SvsX8qfpV8QFoGdIms7tYlqP5uwN05bIJbRWTlPB+UC19uM
|
Eqr89gBr8tfvoAdfnr8DfqMcYAQgDRPoacn1moEpjimZ5rjwA4ADTA+gPUA4AKMBpPrBgTgBwBJAMSsVkqbUWnusYFhCa1NuHCRdQmp9spgOBRZOzEv8ishDrhW8tRv6cdRtW8UfGBd63q3d/vqLdlnrz02XsH9fWqH9FVjf87/ij80/sl8X/tj8s/okdLTs50R3v9cDsHU5bIMtRSTlPBmfLfopbEID3WBLJ8PtPtBUsF04bi3MEbqG4P+DABbQ
|
||||||
|
|
||||||
AfwG8lVdEXn6tkXhWNtEugAKAP/wYALaAlQnd5dLpPsxgs+9evsA9WjnChFWjEDdwHECEgaI9GMF2IUfK9xxxOqVuwPXI9MpLJ+WCtRrrCEcoPm1MYPhWtUzl29Y8roCkPnEcRXif9Thuh8QvlwdrhuO9rJruMbAXn9CvvYCi/pT9bdkAtLZhbcH3ka8KPo5lHhKsgo2E18CWoL4ZLjzxPvt6sQJsgsGjvTcrNsgCMnsKc2jj7csAX7cTPD0d9zr
|
LKEzvFJdO9jJcn7kz8oAXuYpjhQAAgUECCOGGtiXnndofMOJ+xDd8J/nXJYtE2xFqIZdX3i4capp+9qXlW9+bjW8N/uNEPqp1MA/i8dnPtoCrRoDUSgPoDk/qn80fsYCsfirdtVnXkeADu85Xih8sRM6Yg2AldeKMV8sYJGYCvh4CKvnT9YXnds2/jV8yaoZsFfCJ8zXusk6jg7ckAdgsUARVdM5qh0MATN8ntLQC/wPQDGAcwDWAUaB2AZwDuAS
|
||||||
|
|
||||||
fsCAb1dhPmQ0r1sG8qnkitNgJwDuAfgBeAfwDBAcIDRAUJFWGunchSitc7zvr8c7hUx9gMwA6YFuRGMOIDIgf2E6nFbECZliQssnM93aIvAdJA5oY2GuAibGS4F6umZh4HTMBBARtLSgY0bSnv82Zvz09HmNtj/gkc0PqYCCzuYCE/iLMCKiUBoMLgAFwM4BKAPXoY4H+B9gH4tZTguBiALORNAEcAAbE4D//iAt7RhctgAQz8S0N04AfK/c4nkk
|
Hc71kG85fsH1yxjDNmAHTAlyHRgeAQP98nKcBcrL2wo1Ilg6MN08kCIvBtJNpoQ2GuAP/NjZyQCK47zIiQC+gMwzPpcda7t+93flI8l5jI8APr995Hjdceevo0g/iEcQ/qD9wjhBhcAAuBnAJQBC9DHA/wPsBnFvoA4AAuBiAKORNAEcAXrKYC7np2tILvj9svpGNf5HU4PvBh8LINO8thKPoWLuMD77pV9iPr7sIAbMD8Who43Zvg8myhkB4hJE
|
||||||
|
|
||||||
0x1IiV9hGvpNDtvs/7q7c99mkDnXhkCOAruV9vhkBkhLEJJvnqDohB9QdTgQ9blEQ9lvt01VvlFtyHor8PpsMcVfuJ8qhur8Lzilt6hvqDGaCkIzvr0MdApd91ri0BCAJ8ArwEMAhALPsoQQT04cJshR4LyxfAicErqiGdTms4IKQOmtxxivNEzqo8Qfuo9KElEc+7hTI95lmdh7pSDT/hwlz/qF8+geF9r/q50mQSyC2QfoAOQVyDzgDyC+QQKC
|
J2vmqdZQXTQEhJ5tBvuU0EHjOVflqVcEnhN999iy1aSsDsFzhFtmTtKDqgEqC2hJDtZfhMcJPlMcWgIQBPgFeAhgEIBe9vDccusYg/WKPBOWA0sAgqdUwNss0HBIbQfGM99J5mI8igW79pnkGdpHtaUUQY8cuugD8O7nv8XPgf9dAUe0CQUSCKACSCyQRSCqQTSC6QQyD2gdts9dr4tv1v8MCfuyDtgI2xg0FDcrdg24xtHCQ2Uqld8akR96fnC9
|
||||||
|
|
||||||
hQRMDzVlXkeAOBsgAbV9PAVCU7NKGhYAUv0u3Nto0SOJw/dqqCwgdiNdgf9t9gX18R6qA9antr8o5saYtfmSNwVhcDBPvy0iAaXMSATt8kelL91we6c03p6dAQXlMJADwAugMoBCTs4AOgJgAKAPgBIoNlYhAAAJXyh6h2VsqNOVgvAX0k24l4CEQUfBy9oLhxxYLuyh3wq1Y9gDxYqvKQkDOiEVaDjoCzOiIs/jo8UBQCkFB3sCcx7j0CpXpfMZ
|
Anoe9EXjYMsRogtwnkA9Wfv2dpfudMrXt9t6Puf1JvsL8Unvus0nl642fhiNVzgH1w7kadbgVMceAF0BlAIidnAB0BMABQB8AJFA4rEIBP+MWk3UBglaVmKMF4GSByyhFBhiND5AFrTd/RFkg3gJ+FyrHsB0ZsV5sDrytcDhXdBYuGC+blEFWugy9BQEkVVAQo91Af1tNATUDsQToDcQYqt8QYSDiQfoBSQeSDzgJSDqQbSD6QZn8mQYkcWqnGE8
|
||||||
|
|
||||||
XlWDdxjWDWQRQB2QZyDuQXABeQfyDBQX/8Qnhbd2qoA13Ab5MzcHJExLrKDXlNC92fmIg/CvnEOvvOcm6opcybgYc7WMq0/wKQB9wAP8kgW7d2PvHtmbgohUYveCI+MJCuQNjMUSHcp7aimYiiLywXaiGdfetOVavBBDt6p11d6j1Fd/iPYSQUKAQ6rQNyQYFc0IeK8Q2qC0sIZf9sPqLMX2syCCIURDGwc2DyIW2DkgWEtS/ldtYhJ5F6fidZ6e
|
/tYDa6HkckXM2cVNMSAJXMEUC4l0V53txdF3umMBisndV3luCA+KQB9wM39QgebdRQTMCKjki9yxvRC/wIxCuQJlNe2rqErav6ZkCJywlSmBtafH4wyvM+CP/LV0eovV0wwR99cBj7V1Ol78JxqiCgPiBD+dtvNagYuN95iUAYIemDMwYhDkIbmC0Ia/9D0p2tIhO5E2QWUFFRp+ZPKNyDmlgACeUhGJfgAUdQAaxDZLk7Mcbh39jXhd0D4kSVuf
|
||||||
|
|
||||||
CmpfKMxDV4IZsuKgmJnvDOstDnJdSyuqC2PnHtrDqgCjgegCPXgKVHphSVejsQt0JiHcbgVQ8xPg8CIAJeDrwVvc7wQ+CnwWyAXwdJ0rIEm84YhndfQaKU9AggY6YLicYALUB9AGyBqgABAEMAH4eAJthOQbgB4gE0BTBkBdJAdCDTIJaQkqNIlCsku0NSsYZOMFWVSeqVclHufINFoH8tnsH9tAXmCx7If92gQ/Ao/tD86NhwcMPvD8LAThDHIY
|
lvtefiOCSQox8HXu7cdgaL8ntCuC1wTPdNwduDdwWyB9wdx0rIH68eSpaCUtuRM0tgr8IAHTBYTjABagPoA2QNUAAILBgPfDwAlsGSDcAPEAmgGoM8dnwCi0p+YSBJSBOKD3NiskO1Y1neC2MBWU0eppts4hfJzWqM9nfuM8bWopDs9p79/3hosMqkBD0QU29iNvv8cQdaN3mmmC4IQhDswShC8wehC3/okdtOp/9jdnwdTdjYh0pM+VOEKt0wRv
|
||||||
|
|
||||||
yDnIXWCGwSRCyIa2DKIYC8QFtZ1xQV5F13j1URPMSgoKpwgjuqiMy2pz4g0L2lZLi7c62rxDO/ggY2QAuAmgJoBdwLq056GJCNQcP9GrtJDFWhDCoYTDDiUCmsQcNFBA0IOwLIBsDl2oZlXCotC0kMtDmGIZJy9jv8mgd59u3tXshXntCKQYY8ugdSCiLmoIx3pWCLoZAB8IddDiIU2DSIS2CKISX8MWiAt/6i9CAoX2Di0EvsBwc19sxrIsy2v1
|
/U2Hn89S0KADl3jtVa/ugA2QAuAmgJoBdwPK0x6CxCqvmKCOIR5pyxk9CXoW9C/FlacsEgTp8ughtcVEJ4xIXXImCk3ZkkP1DBHvNQF/u0sl/p+DICvICbjrM87jnTMW7sLc27vGDd/kD8kwUtD6gaY1VoRmD4IVmCkITmDUIfmDO9t4sLIYkcX6qyCv/nTcTDpWCBQXGNpeKIt/6o1ZnwmQwPIV9D2ITldRfC8tCruQClgTLVYAYOCefpgtQoXv
|
||||||
|
|
||||||
YZiPQw2/tS0kAVBMUAS68snotdL9rk90AUtcNwYHdLgf69rgYG8pkkD1xji1ChAG1COoV1CeodF5+ofsBBocNDaoSfsmAfU96JowtCtkCD0AE0AydBwAzfohB/6qXdM+htUlSmQUF2mt5T3EBCAYebQNIgmho2G8xvartEXgD5AkxBsReXjmCqYPiDyBr3dmgXaUjFPoDHipZDjATH8z/pK94/thDE/rhCppiu8/wL08ugNBhsAJsBxaNwCegMoA
|
tgtjzVsHuUB8oUIBCocVDSoeVDgvFVD9gDVC6oelCxYRvtMoa/tsof1cu/uUAmgPDoOAOr9EIC/VaIYQJyyrKVIPHbEZvB+1TqhcASBG1EGivglS3r1VY/Bx50uNGIPmPysYQSaUrjujCrPl99kQb4d1IXGDNIUo9CYTpC95p8d6wDwAjQH+Bqnl0AIMNgBNgKLQGAT0BlAPao2QLBg/wJUBV/AWDODr4tvGsh95NvPBsNGwhXYfrczts5C8eDeQ
|
||||||
|
|
||||||
PVGyAEMH+BKgPv52wRdspgSAsImuR94RuiQl4i1wjui9sgpiOwvEuWlIFpsCA9qBNftjOCh/nOD0gVJDj+mA96hlEA5voqdwHi2VN4f+1CnhnNFvuSADTtaDini9NDYQr8yhsjsKFhR0ktlXN3QdM094Zw8NPn6CUYrw9EIOAMFBgPNsZqVhzaKHhuLL3YiGBpCgxNKoxMMdE4mgmdnmpsMswTBVVwttDSNmSCheoXDo/uhDugXH9MPnSDbFnwcS
|
y0n/NBQbT87Zi2DpgW2CyPnMCmTot8ogH18+TqaCh4Xe1pYVgo1QfEMNQUnMQoX8t+fnKc9QU01Qtqk8jQaDsTQYEMx4ZQ8+rvL8zYQU9EIF/1BBo3NMpnlgSBHl5qLE3ZMGGJDvRCKphMMdFAmsGDvTqGDl/sUDF5hdccYVv9ednHCQPgnCIIXUDDhpABU4enDnAJnDs4bnCmGgXCWgEXCS4WXC6YbrtOgWC1q4deNxtAxx24ZzDeqmMDx+gSIO
|
||||||
|
|
||||||
gNXDa4fXDG4c3DW4S0B24Z3Du4V5C7dp2CsWg/djXuSBnBOqNWTtFwy2rwQPgFW4uIbz8F4fz8BTsvCtQavCdQXk8NzuL8kHoeDuRgfD8GpuDsof0dL4cbCucpU9KFujt74eud8FuL81jv8D3YdndzwegAeAGwAPCPgAFQFuReIFYUTgKQB1sBQAKAF0AYYSXcNaMBcanIUgjjqyhTYkXtv8ldVNkO+UFGsoky+np1oIRpNPrny8toTnDTOmZCkI
|
CAW5A4gLCRQV5CYFka8RYZy1Ofuz8JYRk9lzgOCY5qutrXvPCN1ovCFYQQsDQcqdcHn2CpfuQijYTk8NzrvD7fECgeAGwBHCPgAFQEuReIHYUTgKQAFsBQAKAF0A3oUnc1aLedewnkhljkFo+wEFo7cL8C1kNnAE0A8kdRNBsBoWW8Iiop05AfVMCDj+C23C8UpocX5hnHtC/fg59njis9wIZLdW3stCSgEAiM4VnCc4XnDIEdAjS4dtCGYR/M42
|
||||||
|
|
||||||
duEUIRHUrIfAVNbqY8MEeXD6QVwNIALgjnAHXCG4U3DBGkQiSEV3CHoT5D6zFm03AUJc5DvXl6eMnC/AarDfxiNVDMp8lQgZ18kXruYUXpWMC4LUBEIEEg5mPsAo/IP8mjpqChfl4Ng4utd6kY0jiAM0if4ddcQ8BrZ3cj4cEwcsgoKm4jjRGhtOXoJhzggZDLikZDPmr9cjIkN16YcgjDoY2tmYXD9aQdEisEZO96wPEjEkQQiUkW3CO4ekjBYZ
|
pYC/rkdCDsNGIl4OMQHAd5CsEWEZGMvw169LdCfAXbDIuLUBEIP4hxmPsAg/C399XkLCj3pxCpjqkj0kcQBMkSfCBFkAQx4AJMgzOjMnIE3ZtERuBE0HoiLimyQjgnJDf/C/DvwbS8LEX+DVIfTMmXrHCngoH8tAX/DdIcnC3EWnCPEWAjvEYXDi4X4jzITe1MzOPD9odFcy8HEjsiBO88snm9S/rd907oCRrZhMCu4VMD59rkiOwfOtCJgVdJ0q
|
||||||
|
|
||||||
pt94XT98rirxV9NVlbbp7slGmxDPgBaRL5DtNZ4Se954autF4W0jEYZk80AW900obwE+PngC/XiQs3ptIjyGqbCjfFoidEXoiDEbaAjESYizERYinYew16oQVt1EQQIOgDAB4gPhEfzmpYtyODNjCpQB6AC0BMXuX9Rof5UUXMHCIcOjYLhMShjbM4j2MATh9lBGJsYf+k1nuotjRolUzRk6FdFsZCdHmH9/Lkf9I/naMwkYkUbIWWDegQxtLAZX
|
sCtQdBNUHna9woUL8d1oft91oeZBEaQBhERMwxEbaAJEVIiZEXIj9Yap5snuucI7tQCdDh0AYAPEAhQmedxLEuQ/puYVKAPQAWgBC8c/s09uJpDYHYYDgOfMcImfL3MvgCxhMcHclAxPl11+MM8hoQzsRoSYiWtvPMEQaot1/v+DvfjNDcYWoCBkdUDEwYnCRtnpDAEeMiQEZ4jwEfnDpkTAj/EfMiZzP4s2zLhCF+MWhPIJxd0EbeQDBoE19QjK
|
||||||
|
|
||||||
DWiIcj8EckiW4acjSERkihYVdskxjki3oWXVWUgjJPSHUcklla9UlmACUPMe9YoQudQYRe9+IaflJACl9agKnZH3ikCVYT8t1YaP91rraj7UY6jKXlCVBwj3ALqsgN6MN4le7Hzc2US0VS0Nu1uXhXtFkWMtlkYK99nvnCzGlD8r2uqsQrphCy4fZC5URzCioUaAa4QkilUYQjVUecjhQVRCQFjtsewWLDkwtdhVOmo4juo3993se4XkfjYlYYuc
|
5Wzk2DAXkkjElg9C8oX+BJAEF9agNHZd3oMF93r3DIgU8t8kTodr8hqi5lNqjgYQJ1PKNe84WiAMaMKOFakXijTjJ0VoWmntF/kuEZ5n6dTEVM9zER78aUT0iP4RUDKDlUDHESyjhkUnDTOmMjgEaAivERAi+UbMjGQTtCP5vLtSwTZD3OidglhFI4Tlo8JbdrIQu4LXIoPB3DtNrq9u4Ucj9UZADDUZ2CyAYbC4AaR0pYTQiGjsOD6Eba8NgUvC
|
||||||
|
|
||||||
evn8jDgWvDgDlrCVwYwCU3rgDSHvDsjYTuC7gRQ1b4RAAcUXijxaASityESjZyCSjlWuSj6AJSj5rm6DsAS7DtjH8CTwatc2AQ+dQyvsA2APcAWgH/xsZk78SeBh41OkOAOliFMlSiQVPSPYYwGt8lEQGg4JMM+QvlFoCM4V3cCQSzN/Efos84eZCkEarcNkerdY/lrcokZmjzoQyD52PndD0MoBOQB0ByiDHBSIYSc+gMQANAMi11UZpsxytci9
|
KQo8jOjqCjwUaLRIUUuRoUaORYUaK0EUfQAkUR1dFzvADq0XOCodtaDgUblCgyvsA2APcAWgO/xMppGoh4FFALBOJ1Mwm7CXTOZBLgCcVHoIZciUaPNKbnA5RMDeRHlCZ8uUCHCa7q/DIwUiDowdHDYwdBd8YYMinEUZNHrsLszCEIBY7nuhlAJyAOgKYsY4FSDETn0BiABoB/mgKjRehecv5o/JK6Myh1kTRUuUiz56LGkgANnO8tXgu8K6jdsS
|
||||||
|
|
||||||
ug/Iq3L3pFHsoddTuycFQfxZMkNBswOsx9uIV19EAW2juER0i/Zo1l6HhwB3tORNLaj2ifBjvDqgMxicdCFsj4fkMItjaCyHojslftfDZEbfD5Ebt8H4X4NuMaxjn4ed9WARm91rsOAKAEMBmAABBdwFQjp/ii5UMmBZm5JFMAYdCEXagz11JPxw+IJLJIEd1t15tmDeulvMfLphcfju30h7hRtGYbzMQMZEjToZgjeDvsi9qNBihgLBj4MbgBEM
|
0a38y0eKDgOkZsN4V00OAH3cjtCbUa0URj7BiRjttORiJ4fA8RvpqCSrtcidQcHIpzhFDxwSvDJwWvD0nvV9iMaRiQdKRMtvibDeEQeZhwBQAhgMwAAILuBEEa8DkrM2xXzKfA8HJcAcdC+dCXg7Dx/KJRH5KLJH4aI8Zhl+8zEZ0jXMo3dvvjGCG3o30NAZiChkc4iQfq4iPGD+ihgH+iAMbgAgMQuAQMWBi/AOFg5kVBiXgSmiWYVvxhhoFUfO
|
||||||
|
|
||||||
QuBkMahi/ANFgLkZdt6zJCDsMVE1DuCRBlhuFV9Nh/4m/qhlSGLjgW0eJDEoWrDtQd4MORkojlwRL9z9sIicOqCiDYeCiynsOjqHsGlzzhjtisT6DMUWeCCBPcBdwDxNSIcIMcAB6o2AMrQoAJkN9AJIARnkzsxoZGDYqM0F3xHrRZYc4jGZj7sncJhtcYGs923rBDO3tTCWgQhD/PiEirOhKjg2mfMLJmzCr/tmihAL5j/MQhikMX9RQsehiIsX
|
v2BhgUzxnkoUci0c2DDkbhjoke2CFLiQiuwagtqEb2CZwYgCrkbKdEnq2ig0pxiwVlOCD8iliKAQuCqAaAk+EeUB7gLuAmJlSCWBjgB7VGwBFaNNxsAPoBJAE09eFo1DewqkQFkNi57xDrReKJojzjvmU20mMRRGnPAqEjgd+YqjCBVrei1Ojwsm7qNEBQIBCGUcBCmUSGjf4dZjkwVBDaiN+jRZg5j/0YBjgMd9R3MRBivMe/NMzGSNmYQdDJEr
|
||||||
|
|
||||||
3CrtvFtRYbu4MbnkiroH8kajiVlYQitpbNJW1lhqxCPkRaieIREC8lqi9QUPQAegC0A+gB0Bo+KJChsEC4KylliDgV7dkYQTtAccDjQce+tFIUQkQoFWVg8K3lnEdVFg8k7gtRBNQ1ASrwd6pS5DIVTDbMdo9fPncVVkX28DHpti64lKjS4WBiKwXtjIMSdhDsXBjjscFjTsWhjwsSWjHoVdtGLhX9YsRhtSCgDD8YRa9pYSRjfxL703mIajKMew
|
vZYmnkcApoV8nIVsiQSBSA6YnsihQd4CMxq6C5Dn0gegC0A+gB0Bg+MxCNUuv5wgdV8foa2EpjvQAvsT9i/sfxDyEiFAKypjByykqUM3p+E6sgNjaODJCrinV02keNiebpSiIwVNj34XZ9A0f78X0cyiVse+ju7utiv0fZjHMbtjXMftjwMZ5iE0QEj3fDBiD3MDg+0oMD1kdm1afPcx3ITT8IscKCcMTki8MSDjoAYp5zkXiEaPsFDZYU2iGPqg
|
||||||
|
|
||||||
jvkZwi6rnRiR/ilDAUVgDcGjL8B0aacX2DCsRMaJ9BrpQsIAM1jWsbKN1sB1i+it1jesf1i0UXJiGoZ3NPYcXp7IF0Ai3NUBKgCU4ugB08hOmSAqOEaBskQ/5rEVJEnfpPBB5L8wYQBHCCYVjhFFk3JCQJGJw8V3YNnutCkqktiycT597MW6FdodTiZ7Ec9TFiDdi4aWCGcR5jdkV5irHlBjFZn5j2cYFiTsShjucRhjIsTj1gunSx6IZhtg8huY
|
CtgQ9N20SZ4ysRVj+RgthqsaMU6sRUNGsc1iJfsitt4dt8lwTocXzF0AM3NUBKgOk4ugGU8mOmSACOEaAgkbwCUUd9hV0ZPAtFM+QYQA3CuocjhJFqbQ5iK5AxhoNC1RtFVNRgpMV/pgRMYTZ86ZuBcjRrNClnqBDLMW+jnDDZiSYbthqcTtjnMXtjQMQzjIMcdjYesKjVrKKjldDbVlJI+MiIVZIc0Y5k/ygW5J9gqidXulc7oTXUZjEMAFsMnA
|
||||||
|
|
||||||
XsWPIWvoOAykU8IW0VaiKolED3Huthk4CJ11sOlF4YQlCX3irjMgQTshgIPjsIMwAR8SeinELVttitsEQGkZjTIFHiLaI05XIP0tz7O5ceXpEcBtiniaYRMsRUWsjAMSmj2DrD8ToTsjwMRXD9sWziAsUFiQsTXiLsfbt6zIg9/ITcjbBMPAgYGLjPdla02IedZjoidQMsQjDlcUjDO0ZrCcAVudoCeuizQfx93ohIihPpCiR0dCjcIqBZncdLQ3
|
WOgth0op9CCEREDy0dbdj3lMdm8a3jmAO3iV0StwGOE2xZEgWjbwRm8fccOA/cWrpXUcjD3UYos4fOND67tSixxrSi1IU+jNht/DAfhvJFoZBDbManitsTTiM8XTis8R5ic8WrdEjoA9rIX5jqLEDBMESbM8spfcYkRywVJB6Z4YRhjKIVhiEQpldgccLDK0ZLDxYX4Mq0aisYno7d4ngvDEOpljBAh0cTPCbizcRbirwFbjKgDbj9gHbiHcfhQ2
|
||||||
|
|
||||||
cVeAPcZUAvcfsAfcX7jNGBr810X2jTyvDN5Ma/CDkgQIY4Js1ceF0BKgGxi/scjYW7PigVFL/j9aOPDl2r70mrEQk9SKbFfoWs9AIishJgjdxI8i8d3Pt3dCQfBDfjoWDnMbTjT5hEjbIRmimcQ5CWcZRwFNn+BUODG8eAOLRt2GakOgFuRmANrNPIcllqflbNnxoB1jXs29D4KTC7brh0WvhLIdok4hixnPDtgXydFcQzcICf8jVcXt8lTnRkqI
|
Ef68J0ZslNvmJ8d4UbjcoTHBxmrgACxpUBaMb4Df1vecOYlQVYTJI0U4ph863OQk7WGoiLoaPNA4osgRgnPEzJJejK7ucdyZqHC4QQZjV/neiCcZv8icfYjg0WBDQ0atjiYQAiMAEuRhNn+BLeJyAmgDwBRaIuxTUh0AlyMwB5ZrTDksgh9EjheM36vK8i3ofAv8WT8WahXiRZBKiVkM9jO4fEZPId3j8MeTUFgQt81TlRkqILVA/wDXQD4ot9vC
|
||||||
|
|
||||||
LVA/wAaQsAfQ9AiT/AQiSFxeMRaClvgUMjTgJ9kCduDtKuQsxMYisJMUj1wiSIBIiaETjwS/DGoajFGIAU59QKQAyPjUjtMWFB9REVlHmPXcqGBp18QHiA1vGHjRPHXRmNPJNpVO98KbD4j04cXF4EfsNEEQfML8WN1zFlsib8azCEfhBjYkRgAtyFoSdCU0A9CQYTggEYSTCVAAzCXgULCRbc1ptQi5gcaIxPBvBbBkODnkQY10HBRjt+t9jqMc
|
T/A/CbjxVQUPB1QQxjZ4TLjtQdATdQUwjFTiwicHmOjeMfYMgib4T/CYJjCCYbjqHrlDGIMk59QKQAkPrJi2sVb8g0DrdUtIiBCGKxwKQAshLlodUDSJRgmkVzgM3iKp+JicExsR6iibJNjEQRITygTpNpCSTjlsfviiYYfiU8fhwVCWoSNCVoSdCXoSDCVfiiwZ2tZpkfccvjqJOPK+EMVMpIwlOfYDuOhjyvi9iDkXu8sbiLjACacilzt2CDKi
|
||||||
|
|
||||||
6jaMcUj5wW+8Rfpr8BEWZVnsibkpsngsSRuf0niQzkSsVrj5fnaCr4Y6Cb4ekTXQbVi1wX9kzZJ8T6sY0834QTt6gP/t8AJIB6gOLQjAJyBk+uXojQC/xmANuwEAOtgwnhIDqUSa13eEvE7oNiFxEHM9y0HiBV4PQw0sHbN3rjQdk8aMs7MXGj4glTjE0aO5QkUXDUEaMT00YzjZUZMSoTj/QZiU0BtCXQT5ifoTDCcYTTCbXjLsfWZhiNqiq/u9
|
9lzctNlJKv2CSWpcSmcqlimMeli4icy1l4UrDKRjxj2EWQj/ssbIHiQVjg3nk894cftb9vgBJAPUBRaEYBOQGH1M9EaAb+MwBF2AgAFsE48PcooiqYm09r5LdBR8nQxNXorBQoHtwW8jGNzBGtMuYiNj3wR0Tl8Xwgw8c8VukVYiH4PNjP4SLclsbISycUni1sUfjxiU0BVCaQSpidoTggLoT9CVABDCSQVjCR/NuiMEinnm51TBGzEboqDc8stW
|
||||||
|
|
||||||
CzBOnFoSiz8lCIcSJ4eOo2pijhw8ZODKkeEDqkRGDlLrMoObkIAtyEcAhPK0jAHj4SO0dUsAwUaSTSVqitMZV0bqnX8WrPVNIqEa5FYKRpsQpSTm5L2w9ISR5icQsjScfSTycWnjKcVEVIfiklL8TD800egjC8XfiYkXySTiAKShSboTRSUsTxSasTJSe/iEXDbNMHIOxbrjlkqjg2iICEphChtqSqMf/cfkRaTriSvD+vouDMOkCiySiCjviVcC
|
D7scmtYcJ7iKIQR8qIQWE3sdQSPsRAAWgETchAEuQjgKx5skSR9jiXkjfobaDdSfqSQxsUSvclPU3TEDdTmNDhqiZcB8SWQxHEDCBiSaPMWkTcUV6gpDw4d7VN6ljDm7oTj+idv9HPq+i5CeTiXEWMTlCZyTJiZoTeSQgB+SXMSjsdfiP5s1izscsjKSZXQHmLKTsQKptm4bIRgCPJgkhnsSnCbPshccaSYsX3CJQfrJ4GhQj/IRAS1gc7cW0fET
|
||||||
|
|
||||||
dcYMc9cQNdr1qr8pjDCTqgHCSESUiSUScwA0SWwAMSViScSZWxSCRrjmAaoi9fjuiHcfWUuFrgAawppjyiZGYa6GZBUZCD4dkB78w1EmhFntIkJxGbhcssxpb+kEdSehYJYPl9dXlHEAQUs3IwUjR9lsbnC5CU5iaceyTrIdtirFrtj1CVMTNAHoNqgPQBdWiBsMIFHwjANBhzEc4AGxDAAvwG/jOwZDNBcRYNb0nOUsxjYJsNrXUm+r/iwCePj2
|
FcfASNfPUAQSWCSISVCSuBswBYSWwB4SYiTkSeGlkifrj/iTcCciUCSg5kwtcAJWEZMe9jylrB4anBCMiRI+DWOAmg+nj3NxiIbgrtgT1d+g4c0ehujCgfytAUsgQHlHkg+2B0ixCUZiowSz1ekYB9+kYeEt5ru1IycnjFCZoB5BtUB6APK0P1hhAg+EYAIMLIjnAEyIYAF+AUyQsTEjgDMorlrctFIDh+ED1VkSEhjnAaIguWG+IDPvgiKyWxCT
|
||||||
|
|
||||||
kZPi+ERyouVDvCbUgRS6mipU1kFT13Uu1YvUoJjB0VIjKsU6CHgRkSqJsalCKRCT03v6DvTnd8YvoNCL8BZcG3DW8CiIj4bYmGpVkBvjHjPI5UsHQICcbwB38FGp1IjRg/0vLcf0fv8/0UEiBpoF8mYW5iVCdyTm4szjfyf+TAKebxLAqBTwKbuBIKX+BoKVmTOwcwSbsThiOOFxgrSMxDLYgdMZEimDLumcTgYQgDLiQL9LSbDioCegAzZFzBZT
|
SScixcVyomVNKDIcjqpCKSfFXUv3IxVB6kKQJKo6PrLjRwbASEiVg1WEWOTiKak0DccJjiCdOTDvl58aoSfh1LhU5g2JxkgtLUlPAijYp2o8BCug9AMcFn1n8AHhLqpRgUMhZdryRX1eiTc07EaGSHEcyThiayiPjhGiJQF+SfyfrwjAgBSgKbuAQKX+AwKfMTOgVQSMyVrdfCoGwn8SppsNMiY5EobQtuiqTPAZiUwAQE8qyQaje8fFjH0MbIuY
|
||||||
|
|
||||||
lGlnsq9k9cgNJk5BNkppOnJYCf5TUAIFS4AMFTdch9lwqRbJJslFSvidRTtcb8TUCVVifpqyNFSKp9YqfFTEqaFTkqU8TLZJFSmpNFSZyVuiAQfOSNERAAjQDORzgNojdwIa8nvpV0DgGqICDk04x4NVNhKSiQ5Iu5Ai9khtd8b/kMwdAjetrAjNHsfiVsS+T9Hh0DiwRpSS4TtiJiffiWcX+TlNgZTgKcZSIKVBSYKbzjMkTwAEetsS3xiJTgDB
|
JSCTUsEAXsm9lDcl1Ik5JNkRpGnJQCeUBAqekA4ACFSEAGFTqcr9lLiWbJoqTVJYqaOdaEY2iYiQwiMsa2SRfp7db+saCEqcFTTUqlSIqRlSpsjFS2Kbk8KJrlCjQCORzgIIjdwLK9TvtadMYIcIEDiU4Kkb3MYSNJFh4OFo2MLbEA8eGggKiI8DmnpjfSV6jeboZieiWUDVKfhs8YbviEwSyTxrFGSPyfpTfyUZSugiZSzKRZSIKZ0DAessT2QV
|
||||||
|
|
||||||
GIcsmEoF1oZl/vhUiKyfFCqyRJCkoW6i/CfcT8sUeCYqYoi3ieL8ECaVitwaQsUiTIi9wdU8DwSCTbcQ1j6qbQTsAIIAffMwBijmuSjqhcwMYOygvICkgiZnz4HLvWl/KElIj4N8lYLKbE01I0CtJqqTgyanjGSaSC1sUYCUER+TlCdKi7IWoSs0RtT9KUBSjKf0ETKWZSLKbBSdrIDBtNq4SnWFaFV9kodAgS8w5bOaiPKRwiaMd5SayTwi6yWu
|
SciRGu4HAaEpR1oGgrZnl5MKVFjhcT5Se8S/d/KWcTEsZwiKMfljGyWliJzunN7kcuV3iWVT14b9SuEYCjFwVOSSsfqxsAIIAXfMwBkjtaSxRv9g60pxgG3KqVOobTcCUMFA38ihlWUOcoTLloNgoGoji6ieTxsfKT5qbjifUUtTN8ZdctJmZjsfLddm3gfj/4aNsM0LtTDKf+SDqcBTQKeBSmcfMjAYDBiHCdaxzQugi0bKc4y0uiV+cVIcdNs9
|
||||||
|
|
||||||
cbZIqYTZJ1JWsn1kmpAKYOpEtkhTC1JHst1lBpPNl7ZMNJAAPIgi0iVpvJjNkZsmNSTOXB2EgAVpo0iVpKtLVp/Jg1pQ0h6k2tL6kutP1pDUiNpJtN6yM2SeJltKwxf1JbJF8OypdFIBJiW0Yp8Qltp9tNVp6tLRyWtJ1pNsj1pbWQNpxtP6kptL9pFtK5UVtIoJRK0hJNBK94RKPFoZuKNAi1RTWc5QUWMxDs0LiD/8LyTRI6xVpQ2MK4gCcPkm
|
TKyUQjfIR9SJAJbJuTIbJmpG1l+sjVIqTE1JlsjSY6pE9kest1IFsjbJepIAB5EBmk6tPJMxsmNkOqhZy9ZIgAqtP6k6tM1p2tMpMutJ6kbUgNpHUiNpJtKqk5tMtpfWVmylxLtpI5XrRGC0GStFKC2rxJC2INNyx0QidpLtK1pOtIxy+tMNplsmNp7WVNpFtM6kVtODpttKZU9tIhpQmMapOUOnJ0KNFo6uKNAtQCHeyNLYaZygkWz4U003kELs
|
||||||
|
|
||||||
ZknAIaHiigm0IzhO7XQ8TbnSQFkFkJjmIWpgN2YSihIPC+eNWpZ0PWp3fnWJzgLnU+k1OpkoOHARNL921mmEoTf2OqNJh/G5ZPlxOwK8J/eVywEFkMuenmSYccF+QxVLNS3ATPpxAAvpkgTNBHwBrsN7nw8E8SNc+sIBp/TT+Jp52qxtDwUR19NvpcaQxR+dLFKXvD42KEEMCRYGxmjUQ++vBHn+Azl9yPY11KSOCkURJIasxhmxC/lAsgvPCYYL
|
Fvx+wcJBKssVCT8h3CPRBiN6q0+LRcPlAg8awVJmN1XmI8HhSQPIKUp1M3vR95Lre4q3IOq1MZRz5PFuWIPkJoxPDCwpJx+VpDUm51OTCi/ERI7gPQRXkFbUe1TRMj41LJAuMmBhxIbaCBHfMc6zwp6ADjgXyCCpSVNNSkOWfpxAFfpyVJg6HwALs+7nY4DLG/MNFIKpzaMnOgvzaO+oMYpSRONBn9O/p79InJ06OKxB5kY2KEC0CRYEymTUViux
|
||||||
|
|
||||||
ykHAqJF7pLfxTB64EHpBYNfJhkyBuY9OOhXJLjJjNN5JzkR/qKNwTQNszsg/Vk9SypPng11P3e4/iHkPrDcJnyI8J9AQSh9iK/ux9P9mRTECAtiCiJr0FSGlhQc23AW7+IQEPAkjPnA0jJQeN/VbgQFCfprbmSxZ8LW+Zp3tB/Vy2+39P3BVE3kZEjMtwKjNkZrFNPBUNK949wAthtoAY4mAEuS+hxnqOSHyQzVhq0iAyIZNaXTW2OAtoXhx4EBG
|
IAo0tyR0i/cAn+RDCbY0OGkUd0B9h7GHxJ3lAsgTPFkaYbEHAiwnHp5f0NoAiGnp7W1npqw3npV11jxjbwsxL5Puub5LZJuSS3pZgJ3pR4L3p16SzeEUEuq4slupBZLpuOtwOU1Py02stOLR8tOzClh0bYu/l8p71KAJdfxCAh4BCJr0FKGthRZOkOR7++jIQAhjPnAxjKi2v9Nbg35AAZ1bjugTZJuRrGIgZaANjpiRNzmXrnMZ1iCsZnABsZpj
|
||||||
|
|
||||||
ML4XkDRx7uTVcXhwEEVkG0krVgU839yFufRIHuVNPIZ75PCRJjy0p1DJ5J09LH69DNvuzuG02rKBfINy3qK790lxU4EYYGriEp7lLVB04P3peXSocFtBEZjWUAAuCCAAVBBUAE0zAAAggqAEAAOCAtMwACEIIAAiEBaZ3AVaZ7TK6ZvTMGZwzJC2utGCirwl1KFIHhCOjNtBwmIdBX9LypNWIURozM6ZPTP6ZQzIhpQDKahRel3AV4CaAPwElmU/
|
MQZ4nxnR05PuAqsNtAZHGjuCM0yQOSFKsqWiYsLDOrSJ2GuYY8WB89Pk1e1DC8gsOO9ykrnkI/yRI0VrDK8QnmUxutG6Jtx0jxVzU4ZDNO4Z5mPjxfDIluAjIUJHfVTq0rztwMGN2s3hXiuGKjkMcjIosODHS44WJUZkWJvp4DUAsptAfpkoMfQgAFwQQACoIKgBpmYAAEEFQAgABwQWZmAAQhBAAEQgszMhyczIWZyzLWZWzJ2Znm21oGiIeETb
|
||||||
|
|
||||||
0RpNTjEUyVAYwHCBDwIeVwcscWT47hxCYZ3FrpDzUpAySAdqqajpmDmTqc5hmjBNzUsEzGCrWylPmp5IMMByTJppqTJHegs08xkJzoZg6wYZQ8xspQuPYht6LXxsITo++7wB+nEDOAW+wO8MUxqZUtMqyNzCkUjTMJKLUFwAjACUZnAAeoUaW4CjNBpZluHpZl9MccXVPa2C1RcQ9iOmRWUJKe5WPW+n9MMZ6zJ/pkmKpZzLIKwrLMkCKiNqpaiM
|
EGqwDLnhoDIXKY4MB2XjI+JXrj2ZSzNWZGzO2ZDVJ4RHFJhp5vivATQB+AvM37+i5M1o9DMxJtGA4QQ9Ju+1MRj4Zhwep5GCRMXMVahi8DA8VTUhBDmXeBkrn3sJbn7klkHKZ1nxmxmBBUBC2LmhvDNXpVmKaZG9JaZ7jUou0JVJAX8yDUtTk/q96WQpz4yEoO/jOANeO1eZg0FxajNPgpzGkUkzNrJ0TDpojAH8Z4pTYAP9IPiwrMsZ/FFuoErM
|
||||||
|
|
||||||
axXvB6AiECaAFHC6AJoFZBxAEVYezCaA9AD6AJwGcAWGMGxeJMrsKSGowVkC8OVvRJAMT2XaNyVv6upXru0iRGR9nwcuGyBqJOpAvstfWHIJXiRK2pHHYygPxhoLJMhKlPkJzB1HpKTMlRn5NHea1ITJiLKn2GxOESnEAbxRGA8ByYR4EcTXZQNznxqEOB8g7yJihEtIVxJLK54ttFsgEiGgINxOF+uUwIECGB6AO0FwAgTQnJLBOuSVDAIc/rHp
|
32RxThsBtBbplh30RdCJuZdFOKpE4Jyx3GK9cUrNFZsrIQZmRMoBIb1RiPQEQgTQDw4XQBNARIOIA0rHWYTQHoAfQBOAzgDDpDUKdxTULfMCQHbmcBC/yh0UdYb4lbSFFmUxn9VVZP5gxk4kKq2qWjVIvwCGB5PRy8UI1VInwKbYT+Kz2a+LxZJmMriC9MZpZHgxBDTLXp5LLZpjflaZIpM0AnEHzx2znz+bgRHET4mZZI/iTGgOB8gy00vpwzO5
|
||||||
|
|
||||||
RXhxL8/cDX07Tisg/iTqm1wAeaMkXJJEVARw4hO4JLyjIpAMDr+/CD0IjuGIZo2yF6kLNDZ0LPDZdNILxt+JoZWTJjZD4zjZ89N3WX+NspmwRHgemygWYiHEuLjHo0cGWzBO9PgBwqV+xBcBdUXQBaAu4FY2MpRCADiVtATcO0uGTgQELHD2wn/FyWBcAk6V4ApSHAGeA+ADSiC4AcZMcGrZoXmeAF7G/ZaqRfwf7NvZoKAoAJpNTc1QEE6iED4m
|
ZozOSMbK1sgm3DAI1ZL+sqMVgwPQB2guABcaI5M1J0DkIYaDifIGKOB8+DLjiw8EqcPDRK2tzGuABPR2UwwU8SpmV4oI9LjZfEx84wjR9ZNuFxZkcIfRpJEJZDJLWpTJITxEZNZJzTKLZVLO72jdWFpESP9QGHyYub+PpAGGnfw8UkSRGpOfsRgC6ALQF3AlG3FKIQAcStoFzhEl2ickAgsI0Akf4VdQLgHHSvAlKQ4AzwHwAaUQXAkTJjgA7N88
|
||||||
|
|
||||||
+rSFoqbm3YGEFkg8HOgYiHLHxPyJjY4FXTWFLMKae4xjSZqhV6SDwdSVqVFUKvTNByaD/h6Nna24XR4gwdIFZejKFZFTxBpd8LFZjHNjSKvRlZ+RPtxDVPvZj7OfZXMH0GygHfZcAE/Z3rmtYCmUrsb/ias6a30MpBW8SNyWu4t1z8K+MnmIUlLUkBwW7EMgPsRiICX0wnGDyBm3xkH4zOOT5NM64LPnZ1NKAxJgM0p9NNUJmTOjZ7cS3Zc9M0Ah
|
zwH3YUHKr0D+Fg5PgILgFAH1J0bmqAjHUQgi7ENqQwAFo0bkXYGEFkgeHLVSOqK1SIbGAqoUC0Zb1Nq+IT3N8FqUdSqDV7BMaX45W1Vgem/D4mRnzhs9LB4gLjJYx4DLuZwNIeZoNM+JQnL1UW1QBRJdM+Z0NIPM1qn/ZgHOmwXMAUGygDA5cAAg5QwEWRq2ELS1p3v8JVg45MhlVKDUTaeCojCqsWlnoNQRg26DEy8qyAsElh0RAQ+j9htsSWQO
|
||||||
|
|
||||||
J0TZH+nuxB1HdZhsWlkO7zX6iBHUk0JCBh1TM8pTYTRBaaieR2WN4RRsmAyXQVAyT4GPoh/nlEKolM5jqw2QFgks5CxF1ENnJ+AdnP5udWiOAGGWSBsDxlOz9DwyNohfEfBmIyt2JOIZGVBQVbJrZdbL9E8yDoyYxCoEBAwgsafibu0YiWIShBWQnpGJQjxmkUFbG2IuxH2ImYiOIdqxzEX9AkyohjLE0mRGosmTEM8mWWEsDHkMo9Qap5wFIAXQ
|
MlvG3MNXxP73TZUcJPZWbNqZTNNzZpLMTxW1PfJlLPbWJbMRO5bNREheNsQayECUblOfxm/C5xBIgGIhlD2iT1LbZvuCBBxdU2RCLzixI5kAyJjWAykolAy4olQMqkm2CN7285JwWsI/fi0kRoWdMnGSfCaGR2wv90NEZBiwyCYi64LXHoMYY12IFWH3Q/bMHZw7PdEMyCoyfRE5SgBHH8gYkMujAiwQrGTEQiyBdIBKA4gqhgXifGXjElBhfoyY
|
||||||
|
|
||||||
FhAwz2IJ+pJjiX92u4HKWSkKOFKBNPAIcLrNvRrJn7UbRLkUfPG1Ih/Dr4JNMWGp8AuEv4LMM15ADZQqJMaLJMYSi7Pc5eeIlek9PhZE7wvCsbIC5zWJtm6Rk52UxFsGJTNO6OKjOU7h3upu9M8JBbOXUMbBjMgaCo5TLXumLFOtp+6xp5V+2DQ9xi2GFoTIKQFR45OUMFZOVPopciKBJCiKPY9PJqpEnJJWDuMA5wHNA54HMg50HLZKcHM0ManN
|
gVAomXG5P9EkyFxAG4t3OG4hYm4MkKED205POApAC6AsIEaeWBKBZRaU0ZAjUbYciXbEN3wJ0/cjTCgSm0IWdwJ62U1QxRoU/qlGihB0BEHgKwi1omMC7GJ5FTZYXKPZc9NPZUhPUpMhMvZm1NsiFOK7iRhO3ppbL22SCMJOvwAsE4lJ6q8LL6ZZDI0RLpBK5uqJ8EIbB2M/qAFZmIQ3YJFIdpvPNYppFNbgxTjfyqSDuE5EPypzGNiJbjPk5UDJ
|
||||||
|
|
||||||
cZbUz/ho4wYYG4A6WenIZ0PcieUayEUWkEO1Q/5FcgVdx05HDOvJhPVq29L052y1G7gs7IGJBgLc5UZKOh1+KoZa7J85eyOR5/nJFB89Md2guOd2F6TOpaJD5R+mxx5cslHQVGDDO8XKnBiXP/CyXKSeLAVrJC4NnUmXKmq2XKiQ4GQSQWiD15YSTashvLBsxQBN5HTgngCJCuwnkDq5x2Aa5lolwyy3P64bXNzEHXLaIzom651bJCAfXJGIg3MD
|
e6hoLm+bCIF5eTQ+ZQKOQZTvAQ5SHJQ5aHIw5WHKZKuHNWMlnKwSyazPhnY3IYG4E8C4o0x0znJxku0RfBGqA/IrkDLK1SUUxBTI5oWwSqcE8AhI/uF6ZfpKUh2PI4ZuPJDJX8IvZebLJZ17IpZt7OS55PPuAhu1z+CYUvSzzywCcJBDx+t2zRyGIOsqQIjEaCO/xqpN/xdJxS45XJ8enHLcJ8wKfQoomoG9XKfAUogfqYAFiIjvKqmFVns5sjLV
|
||||||
|
|
||||||
EfxkvISi3n8C9X2QMYmxA03PWISkwsMuWEEyS3J4MlxFEy9yHEyIhkm4+3JLEkhjkyxHJGecDBO54pXOA9AFQgU6AHhlzNu5qkjWEf/kICw1OTiL3KTh6WF7sGSlaJ/bOpe/GkUU9yXL4JNMSAbdwqSITDsgMkSt5STJh5dvM2RnnNXZ4xKnpvnNd53kI1RgXPDBMWIsGL5B8B4AKX6jkRa+ehHJ5pMKvZRLIj5mIU6co4z/kstLj5GsKJKAvPYx
|
EHvPdY4aj2E3cAG5AkFIMN9GwyponEyE3IOI56UIyNoiBQc3JCAC3J6Iy3K9EVxgPgMbLzq4/g5h23OmI1zH3RB3N2MahjhkKxFO5OGQuQwmToMw/MYMN3Jkyd3LYMf9GzE6tCe58mR4MfeJ0OFIHoAqEHHQVcLrppGBFkrcHrU0UGwC7kFAG1sWqiDgkEaeXkroWfXkUFGiUUNySDhFNMSApd2lsVs18q+ZL95Ki3C5x7LFWXDKJZceK0hr5Ij5
|
||||||
|
|
||||||
6AKwF6cyyYFwDVEWvNgao+jz2mVJ+JKzIMZAnO2+oNKomkQlwF4nKoJBRKyBaHMg4mHOw5QwFw5CAHw5hHNl5h3JjiLv3YwbMQuAZuA0iqvMka2kiUSKUlx8lIB15b5C/w3vzasMqh4gPFheUpnIP4brHoYf/n9ZxIIh5QbNIZI9O76FDId5sZKd5OlJ/J2TKRZuTJGhMWO95wl3Hg/8NsGp7MWoMqj5Wj5K+xebL3pJPIuwUfIAqlPIIMiRCy5J
|
hbMciXezaZLoKWRWt1vIdgN/+wRm3cGfNEQauk55X+ObZaV1bZbPK8Y1TjWQJbkAUXHP7hLP1CEfPLiplNS4FuVKSY7sNuSciVbp4UGkB/1PG+MvPopWD0U58dM5CvAsnRVoJCZ6vMi4JHKOAZHIo5VHMVatHIQA9HMY5hvLkyWCTMO4Pn2U/DRxRWcVpuZGF24P+VqSOH2ls9vIRYb+Gt+FVlFUPEHRmNyha5W/HTuZDG7pzygkeVKOQFOPKi56
|
||||||
|
|
||||||
BjAyZBmVEzWA6cCgqxc74Rq09BgIY6gtOAmgqbpxfIEgXXCa5FfN4Mg3Ha5lfyrETpCPQPXMb50GAnJtGXoyRkGWQj8iHk9kHQ8qGWexthB75/0H2Kx7nRInuRAaWxGP0I/Pwy1yDW5YmUyFm3On523NpSe3L6FC/MhQx3IrZXvHMCqXjJOJb0xhEXTxAUPnOaq+mkee5NxAyOE+h7L3ioY1KEwyyG54HKXUkywyguPRJp4ItykUV3GEFUUFf5Ef
|
Ap4Z9TLi5V7IS5gjM3pnfTaZ3Bzvx52O2qifMlJsunHg58L0GspOYqZjGfZrPNY5Pcwq5JfNFxMElq5lfIlE1fMa5+XBqwVTkcFBEMGIlSRqw7gvOU9jHHg+XXOA3fIwyRolG5Z3OP5zSBoMI/JKA1oh6Q4/IHZk/IgwI5Moy1GSMgCyB+S2iiJE4Wg3gXCBX5rlGOK67nhIvuXh5J3IEyDyAu579HwyVBiYMD3JzE93NP5j3OaxxYhe5nf2+ZEA
|
||||||
|
|
||||||
1t5wxNTRGEJMFP/MR5AwIESvcPfxCm202c5X40CnhRGaI3VExbPFpCXMlpXlMXYaIIngRZJepOWJPpL6GvpJDSQekIpY5+DyiZnPhDUOICX2NBXZ5kiNDpQNN3B1AqE5SPRhF+zLYpUJIDBQSBgAJg0IAjOxcZt3NDQeDPiFC1Q/yLtSeA2UR2QAMD7ElM27gemR6Wm7TThLymT4eI0fIXP0t0TDHB5FOMh5/6L+aC7MMFYbK2xK7IR5ReIRZfnI
|
AMCsXjROibxiZC1FW4aSDlsjGS4esa37mDMV7AWIgHAjnCz66DCLQgPLUkww1UxcjWkwaunkIy/EOwGPN8FeONppPSOqZEqzx5IfJXpLNJGJOAqWieApS5SNN8xVZ2DAZygo0kMNhaTgJZZxsUO4nbPlRnLMI+9AuyFexjyZ3PJ3iFwpuIAnIg6n9NQaonNkILrHpYb+TXANO3RmIDKl5hVJeJ8Ezl5mAKIWivLHJTIrU51wKQZWK3GU/iBgAqg0
|
||||||
|
|
||||||
AFkI0p0rwty0Tgii5OWEc5apLJEzgh02Sh3gFvq2JZAIsLZOMFRknKTLZnSNEZqMCY5fKmcAAAD5+eXU0bRWHMI5twELRaJybRXaLSmg6Km5k6LHHEOAmoq9wrYjILnhKiK1VPoyRPmsyX9i6C2RqQSXRXRy3RRhAd4Z6Lk5t6K8iYwLJOQQI+gGoNfcT0BoMALibuZysoKiTNe9OOxjuoASgIRSA8UIQ5ailiR+EBsLUmi0seMu+jZqKZBj4R4V
|
IAuOxVRVnODQDDPsYiJRC5XUKeA2UU2QAMGi0PsJKmumUbkJPxRhnRKpgMfDiaV5Cp+6uklUmPL8FAfOr6sIsXpf30WxiIoWhyIpGRqIvphgtLxOZhJQ+o+n9EbpgQxRWXy5YRgcEG8BNaWQvXiz4S/ClFkZOLP1RgsaTZUzgAAAfMrzGysmKfZuXMD4vGLhOcmLUxUwB0xWXMo5r/Sc+DlFaoqARIPJiweRc8SJBZqzssfOcRRcaDsxapzcxRhB
|
||||||
|
|
||||||
65AlQQWToKhRXoLh6cL0oWbDyOSV/zpRfGSXeerEOwTzSBLghTH7qcoa6DmzCVHQxttFaQdotUKqmeHz/hUlzUNpvsjXKaKGMZSyYxcxybRTCKbRXQKhyjnTtYZ9haOfuLrRYeLrRceL1AKeLREfbgPyDlE8VFARWecGLkibFsqBUYyaBfEI9xVaKrxaAwmAEeLEhBU17xRuizyrOSLvgSLvTtKld2FPQugCdSHSepy+qZGoUkM8JDCHNjcHKWka
|
pQQWLmQJHNGIBt81zhpy1eVKLOguIN7cT0AIMDhdX+dCQvrHXo4bOtxxGm3SaiVcZWCUiQEKSGpbkpUtOMvwT0sBAManOxha5PpkfBfCCoRRUz8WVLE0BWezl6ZZEw+fFziedtSkuWiKY+dRcYKfK9fcuXQJmcEZFEiFF8phdsbsYWiW2dfSGBQgJqnHeJhxDSLJ8k2K+VN7wkxWKLkxZwKBykXSKMaBLExRBL6ReBLoJeoBYJRPDenslhLDsMR5
|
||||||
|
|
||||||
Cs4gNXA7VFhTMizSHXR2nN5ALQgco6tAIJuRc4IvgHyKD+OcLRUZcKhptcK0EaBiMmWYKmaTPTx+tuzAuWjdF6XV9EcJfJEsceyLDMo4l9txAVQYSy9RYgKF4tGoqHE6w/BQpY/xUBLrRQmLrRc6KLxf+LVJTf0nxf6KQiOh5q0ksyhMRQ9VmcKyIxflSGAckwlJcHwVJfaK1JVYzt0YpjvThQBxaH0ABQUMBEwIINdWVuRnAFKl4aTdB7RjthCA
|
iFWk11lHSBfrLy3idIKdWQfl4JfmLEJV8hyJShLJAGhL8CT2KsiexStOYMIjQMuwh6F0AzqUYclRZcZp/vgY8HLjBoPCWkmCjCRfCuP4DJMPU9oqaFNlOlpdFGaKHBDij3mFaLD2dhsUBfTS4RcHzGSS6KBdqzT3RQN4OgQRZ7gD9dxGfUU8XsJgOYblykoDFiK8dAMYqg0sIxc0lqnIBZrWMBLCMWRLwJW2KkxZDlXJcmL3JcWKlIsOI0VJSAKx
|
||||||
|
|
||||||
PoAehK4yCUAzo6kt/csYP1THmWxhgCN4EigYGoKeWotn0sM5w8YKLQyesjM8QYLWDh/zgMStSvyVGyRxbeInhVXl7gCndJxTQi0jAAVsYRmy28uqJ+ECAYw+TqSqWiNRmTMKJsXI/1cDL4St1ANwescmBX0HcgtjA1AptBABNkOqpXgLgB8iF9VsAFUYBQfEAegGUF2tpfINkCeB60poA0PFaB3APSBEkAtz9gCgJu/udJIiKjFnEH0A2QEhAtyB
|
TJzpeXJzJBSVSwtiRLohF5KkxT5LgmUQSmJcoLRaH0A6QUMBEwEwMnWUuRnAFKlEaTdBILqthCAPoALQSDDe2r8L74VjBpwBpIAmq6YmzoIKueS0si4tGZlSRSiAzlCKA0YGTZsUHyoLjvjQ+aEKiefNFI+bgLPRaL17gBrcHxb6L3AqAV8ungEwlNDIZ6KSKYjO55PKft1eRHSwRqc5LyiNNxkwE+hrkMUY7SqLo13rUBhTK8BcABkQyHNgBX/H
|
||||||
|
|
||||||
SkEMJgAwwHFZNAH0j7gJIAA4RrQgpSFL+BdxB8SPUzjummEh9PVNcZPiyDCP6oQRStCm6FaydFvWinOXz1MpVDyU2IxK1VlfiYyaxLTBTwldKRYKUee7zAuffdB4ZKCpEGuA0ZH4CnBc8siXF/dHjErDWpep52pbhLOMH4LepcUKe0INLOjFIwRpTwB9BrUBJQHiijgHhhLfpkgegBFESQFPAZpeNY5uVsI9Sk2YRFswAtpV0FdpftLWQLGIOhb4
|
SD4gD0AdYnDYr5MiQTwE3JNAEaErQO4B6QHEgFGGAB9gF84e/lHJDiKjFeKH0A2QEhAlyJSlYMJgAwwIFZNAMUj7gJIBbYWrQCpUVKxRtdEMSOMyuBGmF1hOJMsZOyyfgW6oEBQjCe/CzcKSfPAS/lTSWpTTS2pZUyOpYELTxc6Lzxb1KtKWGi2UYNL4EfpLD7lTzCfhVtVEY8lCvpiwrJcxxMNBhSZaYtLYRmocVpZxBUjOtKxGCxAxhZ2gdpcM
|
||||||
|
|
||||||
RwAEtAwUHAA4ACaBbELu5oAHFAMgAjsZMDcAGAHzBzksGyyGVNY4ihfFsif0hDwLrUuxXmoimGbKOiBbKMIIbLspfmkbZUES7ZekA7UmK9dZRETzZekATQCCcXZT/BBOr7LEZQnQA5T7L6wXY0w5W7L9AE3D0jlHK0hhbLEIL69OavHKg5foAk5WcCJCqnKLZc+gQxRQRs5cHKtuSAwdueFgC5foAlsHPyZ+a8RZDKbLXZQnL0gMAwcUfYQSoKsA
|
Y9pfugeAAoNagJKBwUUcBsMFr80kD0BOBCSAp4OdLOrIdzjmE+QTgDmYeFswBXpSY0PpV9L1/D9LpiPvy3COAAloMCg4AHAATQNYgCMtAA4oBkA05pJgbgAwA+YKckM2ZFyerIHVAYiIAf4Ix10gCaADxe8ob2OHKekIeB9ABhAg5agKamQUA45T4SsgJHL9ACFS0QX7K0iVnLE5dHL27hnKI5UXKhif9xS5QnL0gJKwSNlXLC5ekBc4eB965Q0R
|
||||||
|
|
||||||
WoAdLDQIkZ0YLiAl9iX1KxWboCgG3LWQIaAgmnwgaTPULPUtGpqNIXB2HhMAshQwACAMnAGMk+FLWT8Qy5fKx6TnMBYYK3LZQCQAinurpd5YeBYxGfBa2CQB1sGwAdoEthcAIuQp2CfKkgkpAMIDyBPrBWdcAAAAKUgrUAdvK3YT+Ufy0oUAASl1AccGUA+YC1AcwGflb8q/GcIUZAkCp/lZkH/lq8u9lxeDswTcNHKYsK10ccGLA4cAdEAKCvlw
|
E5YhBrmdwEW5dnL25VLjUIl3LE5Q+hbmasB+5VHKJMocK2eCPL9ANNhf9nsKr+TYFJ5UAxQURYQSoMPLzZayBDQD4YNCFsd8jm4CFJMuzr4D9LDQK41JqWg5hggh40jLCY/Zad4DAGGMGAAQBk4DRlbYuFA98JPLa5XGF1BsPLZQCQAxzunKv5cQATQAgBpiGfBLUCQAFsGwAdoNNhcAJORgmCAq0fEpAMIDyAnnN8dcAAAAKVUrUAXgB10TBVnY
|
||||||
|
|
||||||
QBUgUbhjKhAFjEUbkpoWstURwgCE6tsC+kq8rsAs5AI0w5MpoRTnPlcGkpo18s3YYKAWAhAEYAD1B5At2JmqYQGCAHCuaapsuZABgCbl9ICtJRsga5dMA4VXCvYeQniOlB2HAACkBeKnmzoQliBbAQAA
|
BkBmQAACUuoDjgygHzAWoDmAyCrQV943bYjICoVGComFBCpflBcvFglmFzhw5TZBLWjjgxYHDglol+QUCuCAKkHc8kZUIA0xHc8ZNG9lJdOEATHVtgWchfldgFHIOzH7JZNFSc4Cq/UZNGgV5ImBQCwEIAjAFuoPIFvlq2DCAwQE0VxTTDlzIAMAS8vpAuFJgkQ3Lpgmiu0V5D1Y8f0s2w4AAUge0trA5iBbAQAA
|
||||||
```
|
```
|
||||||
%%
|
%%
|
||||||
334
DOCS/Алексей/QTClientScheme.md
Normal file
@@ -0,0 +1,334 @@
|
|||||||
|
---
|
||||||
|
|
||||||
|
excalidraw-plugin: parsed
|
||||||
|
tags: [excalidraw]
|
||||||
|
|
||||||
|
---
|
||||||
|
==⚠ Switch to EXCALIDRAW VIEW in the MORE OPTIONS menu of this document. ⚠== You can decompress Drawing data with the command palette: 'Decompress current Excalidraw file'. For more info check in plugin settings under 'Saving'
|
||||||
|
|
||||||
|
|
||||||
|
# Excalidraw Data
|
||||||
|
|
||||||
|
## Text Elements
|
||||||
|
Update controller ^TkcEsz23
|
||||||
|
|
||||||
|
DataParserOutput ^3J2mDJ91
|
||||||
|
|
||||||
|
PostProcessorSystem ^NNczxNF5
|
||||||
|
|
||||||
|
recognize ^yew7MTmR
|
||||||
|
|
||||||
|
DataParser ^VWkzR3Wc
|
||||||
|
|
||||||
|
пришли данные ^eF0Z1Xcp
|
||||||
|
|
||||||
|
реакция на распарсенные данные ^MRRTeYWw
|
||||||
|
|
||||||
|
дернули обновление ^zzKU1XHF
|
||||||
|
|
||||||
|
сформировали ответ ^c6svrUeo
|
||||||
|
|
||||||
|
PostProcessorSystem ^S6RhnjVy
|
||||||
|
|
||||||
|
отправили ответ ^f3xD8T9a
|
||||||
|
|
||||||
|
MainWindow ^vw7nwX7p
|
||||||
|
|
||||||
|
CommonButtonGroup ^xErMGE5L
|
||||||
|
|
||||||
|
InstructorButtonGroupWidget ^VJREKykS
|
||||||
|
|
||||||
|
EntryWidget ^mUcqMn0E
|
||||||
|
|
||||||
|
NewVersionWidget ^FMG4Ciab
|
||||||
|
|
||||||
|
UpdateNotifyWidget ^4m1cnqbo
|
||||||
|
|
||||||
|
VersionSelectWidget ^xicMVgid
|
||||||
|
|
||||||
|
waitAnimationWidget ^AnK1YT4P
|
||||||
|
|
||||||
|
Bootstrap ^eJObHGxm
|
||||||
|
|
||||||
|
create ^lW9myAl1
|
||||||
|
|
||||||
|
initialize ^TNfkDi6r
|
||||||
|
|
||||||
|
CoreManager ^UzTcomzR
|
||||||
|
|
||||||
|
create ^QervTCHL
|
||||||
|
|
||||||
|
Initialize ^aLopQwm7
|
||||||
|
|
||||||
|
dataParser ^5EgEO03J
|
||||||
|
|
||||||
|
hashComparer ^sga2k5zL
|
||||||
|
|
||||||
|
etc. Systems ^zMBWYwMi
|
||||||
|
|
||||||
|
Provider ^OYxiJKhY
|
||||||
|
|
||||||
|
Processing ^09kzGeqK
|
||||||
|
|
||||||
|
ClientHadler ^5HyYmLEU
|
||||||
|
|
||||||
|
UpdateThread ^FO3pAbhx
|
||||||
|
|
||||||
|
ClientThread ^fMIEFNBp
|
||||||
|
|
||||||
|
bootstrap ^dZUaLzRd
|
||||||
|
|
||||||
|
coreManager ^nqGr6J9W
|
||||||
|
|
||||||
|
widgetManager ^VuHO7U8Z
|
||||||
|
|
||||||
|
connect core and widget ^USOSDOWi
|
||||||
|
|
||||||
|
%%
|
||||||
|
## Drawing
|
||||||
|
```compressed-json
|
||||||
|
N4KAkARALgngDgUwgLgAQQQDwMYEMA2AlgCYBOuA7hADTgQBuCpAzoQPYB2KqATLZMzYBXUtiRoIACyhQ4zZAHoFAc0JRJQgEYA6bGwC2CgF7N6hbEcK4OCtptbErHALRY8RMpWdx8Q1TdIEfARcZgRmBShcZQUebQB2bR4aOiCEfQQOKGZuAG1wMFAwYogSbghNHmYAaQApADYECgAFZp4AQXqACQANeOqAcQB1AEYAFRTiyFhEcsDsKI5lYMmS
|
||||||
|
|
||||||
|
zG5nAA44gGZ4gAZNkb2AViOTgBYdnf4SmA2eE52R7X2d/ZGLi+23+oBOE63SAUEjqbg8HYXbQ7P6w+rXeKbP77eqPIFSBCEZTSbjxOLxWF/TbxAk8P71YmAgqQazLcSofbo5hQUhsADWCAAwmx8GxSOUAMQjBDC4WrSCaXDYNnKVlCDjEbm8/kSFnWZhwXCBLLiiAAM0I+HwAGVYCsJIIPLrmayOUNQZJwUyWeyEKaYOb0Jayui5diOOEcmgRui2
|
||||||
|
|
||||||
|
JrsGp7sH9ozqRBZcI4ABJYhB1C5AC66L15AyKe4HCERvRhAVWHKuAAarq5QqA8w00UptB4PSdtSAL5MhAIYjg45/EYA7Y3OOMFjsLhoC4x9Hj1icABynDE3Hq/3qJ32fwuJeYABE0lBe9w9QQwujNMIFQBRYIZLJp/JTQrUkozenQLBQcUlMoSMY2WwG9mCMCEIDfLs3ybZt/y9ABVAB5HohAAJUkMYTgAK2cYhmlqNhOWYABFE5VF/aZWwrUhWS
|
||||||
|
|
||||||
|
oSDqSzOMhDgYhcGPPtg3iE5uMOeJ/nJep0SIDg2QLIt8CEthpRPNAz3wMICig4oYNKDj0EA4DQPA9EP3KY9MB/dF1jQZwt20Yl9kRHYeBnE4+L4OMo1QZxHks7Rjg+Lc/ghTZNipZsQWIMFOJeGFYX2CEri49FJExbEfzQNE41pT1Y2bG1XSVPlBVFEUkEvKUZVrRUeWy1VyA4DUtUyQy4wNI13U9CBvT7Z1bQQe0gsdRK2tdRrPxamthH9QNuBD
|
||||||
|
|
||||||
|
OMwylSMxtnOME2YlMn0Y5sc1wPM1MLYs41LYhywkXAhiG+ViHrNNNokuMwhk3g3ghN59m4ucmAXKdUEhTYnonJcV3pId6niay/gOBzYIPI9rrki84yvY673SGqlvRZjWPYsauJ44l+PXITS1EtBzsk6S1MhhAdO/cp4JYtiEFQPQslZI0mBrSgxnJiRKZRmm6ZdRn+WzTgoGNQgjHpHg0pKPUBYAMTWw0nP899v3aIhlFeiAxCyJnPqgcwCGVrE1
|
||||||
|
|
||||||
|
f0EhiBWdFudwUsmHzCRKhqBomlaDpuj6QZRgmUNSCxUsCFZgyKap49aYFhngj55KhCgNhUPCYX6RZIRSbjYSEC6OKcWDJITkU24VLgiAOB6IZ8AAR30noemcUgk3qUgbOaAAhDhjV1XSJHmRY6V1YznJ4EY4guf4Lnib4d2REZh/RJyXOefueCRcfXIeuz0UC4KbpeE5CXRvy/lOGK04S1B6heeoYxjY+3hOEYTlRBWaSWVLeo5LKVXQIU8rFArp
|
||||||
|
|
||||||
|
XmhUX70iqqralqitQ0JozQDR5D6S6Lo7QOidNA9q/VyiDV9MNSQp0xqhnDNNaM4tIDzWTKmPIy0Ja5gQNbVABNtplm7hAXAPQjp1lGmgGClFZhoHbFMJSJQrpqV7nPOe89xrNnnJOMayJPovWXBwVcwYKQjGPnPHYH1tpg2CKjWS55E7Nhhree8CM8jQTfGwz8+lgEvlUuUHYtQeD6H3LUQcEEXzcOUsYyxFokIoXQphHCeECJEVIuRIE74qL7Ro
|
||||||
|
|
||||||
|
mwOizjgmsMgHnegABNeoi4jB6h7GwE44RiDKDGJWPUtRMCkBGBRFs7D0Balok4rhDEkYB2uuPbiW5MZwkEknXGYktrNl5ETU8Wjs4FFzmpCA1jbH2McTpUJ6AzFdweBFbQAIdxDh2CcMk25HqOQeGSKEfd54XCHNsIkK84HBm2NoOyRJ6gXC3EOJ4fd95YnTrwO+dCH70jwc1GBXJSqvwgO/XKupJTf2Kn/cq6pNRAN1PVMBHoIFWifh1I5vA4VI
|
||||||
|
|
||||||
|
ItJA1qcY/ToOYagYRJRJoRlgDNN5BDFrEOzGQihVDYI0IrPExhJ0sWUp4T2NSIxty7wHqfeIkixGcRUSI56k5pGyNQJvGclyCR8r/GohAGjUAk0vNeYgcMHzZFJUxWpLL0aNL4s0nGIl2kXU6VJDkxMtFkz9hIfcbFcDNC1GEUgiEI5wAjszCgvtD4QCtVEW1LAmCOtkC6/mWQhYi3BG8yWWQZZG3wPLc1UB9aq3KBrY8Yd+WkB1u4BNhtjamzjO
|
||||||
|
|
||||||
|
bS2VdBkFyLqXLA5dK7V1rhcBuTddR8i9hwH2bN0BeptXav1TrA3h0jtHVgoa0Dx20SUZOqd7mHxeI8PprjYKDOYJ4tCGFsK4XwoREiZFCAtwmXQ8JVAjLcH2K8PEMIKSkh4Kiayx9J4PEuScdynwHrH02JCC4IMSir26kfKEew2XbgpM8d4u44yxTHWNGcCRr4AwJNciKlx0QpVeXC4Fb9cqf2hoVH+JVlT/1BdVHU2ZQHIq9Ki60HzOpr1fQID5
|
||||||
|
|
||||||
|
hHmrEdQX4TFDZMETWwQS3B6JiVELQJmMla1yEbXEiWal+0ABadKMEsLfCU0WnZuzXU3jGGEyycWQFEZwbg3wnmqY4EK36ll73/AOHuQ86iIZmuhoq5VBiuNGJfCYvS5NgmxMGdgeophSDwQQGwSpxQOzVPVZzTVDTeIHAXnqvGlCBNJ2NaZ+SQ7IBwDYKWVV1mXzPhfHg4o+w3wkOKGlqYzgLnQgOOFckT6PKAds/e8Ddk9iDgBDBi42W/OdNCFA
|
||||||
|
|
||||||
|
bk+gjYyF7M0RLOp8aRfSlEdN9cdqlmUNwVhGB9FZAoRUKodRGgtDaJ0Xo/RhjjF/PqKSQg0wHr7gPa+/0/Lj0OMoirzZlC4DgNwHYd6L6HCuMOIGd9IAGkwN13rh9zoybjJkYgI2FRjYm5JtIKrZvFpLmXCuVca510bs3YJW3sA7f3UkI4T7vJ8Q3IOGyiPLvXYzuSHcHwPjKKfXiZekm3sfaSwan7g2tTxp3bFXA/GOklD++0ZnIRBnlIibqIIV
|
||||||
|
|
||||||
|
4KAxYUj5nO21nOufoO5zzm7Slfj9nujhYHWXkh2Bc7YnwzhXpMiOOZPA55PCRJfCkhyuriKhL3IkO4ZyDgJFyoDB9wRPPg/uxDXycof3ymhwFiqkPQAAWCmqEKCPgOQbRhBroyMfoo+8xBYeUWwvRWg8T2KsFTVY9i2aF25SEMRnVclbPDV/iE2U4T1Y6NMMY/19nAhmVhpjPsvT3K1OJVHGmqRP1QNXCfafZ4Rnwamtiwq2G03kvphyxAZG1NAt
|
||||||
|
|
||||||
|
biO6y4efwwsGsJianpw+4xTIkIAQRBAAiIIAPhBAACIIAHhBAAcIIf/fgAmEEAAwggBuEFP6gffgAhEEv4AVhAn+uvdeUPfR+z8X5v/fo/i/u/hCgLCGqLOGtLLLDGtwE8mYlmkmjVFrGOEwBmnrCrNmsQCbN7s2PmgGIWsgvOt4kun4quoEhuh7A2k2haugD/ifuflfnfg/s/m/h/nBhHFHDHP2qgIOnqinE7hnJOmLv0hLuUM0AgMXMwBQDwKh
|
||||||
|
|
||||||
|
AMFAMXJWAMCcDeJoNLjeBwPUFhHLp+O3K7krqgLsrehchFI9nZFxEDDrj3FfH8OZCMKrt5JsPxNcGbuRsstCB8EDDCK5Lsl8HcvFGuG8q7mgG8hlM/B7hIL8nlP8uhkCuEZMoHrhuYq9qHtCuHknoNu1NHvAhkX1AnkRukSUBiqnsphAHijglnkSrniSlxpPqtOtCvtQrtLQrgLgGJlipNq3G9PTkynUu8CiEFu3iUFprAQ9C3tpl3mgCSOrr3I4
|
||||||
|
|
||||||
|
bHoQNKrKvKuZqPvDI+IYi+DElJvZorm4nnIuIuBYJgIuFLCcN5mAC4q+LZu4ugAAPqfD6AjCoR/CoRdCqHwTFyLjETYCODECYTFKdHboVKQTRK7GDI3E3FdCbCEBSxwCSDMA8DVDMA3hsh6icgjBJhwCITVD/Fbp86RJVJTCT7T6yr1IYw6oCTL417F6QBdJr6aKxZTqXF/iDL7GHHHGnHjLy5TL6FXBQhHDHB2HfDriOEO7NhTyuS7B2FspzxOG
|
||||||
|
|
||||||
|
DHAgIq9y3bzJPq+T/QjCUh+EPJJTNhBEMju5YYREoY4ElAApFR+5xEB44bgr4YNR5E0YFGUaZEKlIp2koLJ70bFHp74pOSsqVGJjVET48b1FUmCZNEViaBtHV4Ra17NT15oCXAAwXA7gQhjHqY8CilDECrfQyL0jLJHA2QqkD4mZD5Qw6IWZj757NjEl1Jaq8RYwtKdJtIhlRbdL0mlmKw0EQA9bMjNCshiANh8jGgwDMjpCf7NpdlsA9l9mBiDn
|
||||||
|
|
||||||
|
DnHj6CgHBqxxhpBpQBRpyywFxoIESDJrIFppoH4DbnoBGxYG5q4ECwWz4GzbiGSHSGyHyGKHKGqGkDqGaF1qez+DUEerdlQC9lSQzmkBDkjkLnsE9pcFxykAJx8Gjr+GCFZzCHTrMnlB3EXAPFPEvFvEfFfE/F/Gcmfh4nTLTjbivDXw3zqkKJkiOGWEuRJl8kxiPB27fqXIuEx5XwJD7KIibjvDDySqQDAawXYrQhiz3QvqPDKLsou4vJu6R5hE
|
||||||
|
|
||||||
|
GnIZe7RG+7HT+5qiVRB54Z1QpFNRuk5GwLm49QyVuiukR7NhFFYolFlGZ6+nsZVGcaBkF68YUoDYl5hn7TYCRmNiSadE8DdF17XSzFXwKLwipnTj/BjE6Y3YKJvDeRnpFkyoi5xYVDlmrHj55ZMnNgAncmgnlBGBGDVDwQjA9BdBSxnG+aEk1IBZoxBbEghZ4iUnRnUkQC0kJXogJZJZPhvhpVgAZbdXZbBJdUuRsWIhkicVPCWTfCObOChTCUAY
|
||||||
|
|
||||||
|
G5G4SVNblVJytbtadbsQ9a07NkM7DajZLDA4WKg41TXkSFSEyFyEKFKEqFqEaFaGI6SzI67buQzieSN6QhTG+GSb45rjaCogDya4+HHysq8XJHvZ4SfZ05cLoh/YA6OB7VbU8JDZM60Qs5F5Q0Khc7I087UQVJQ34BC4JWMkDI5V5UFVFUlV4XbFJEQDdybh8nCl2GbBJmUVykQBTzso/VnoLIPQKLnbyn6XYoAjuQSp+SOEvp2S8UYggaJSSWdz
|
||||||
|
|
||||||
|
BH6llTyV/JfxmnKUWmqWALB42lQraUmUI1On82x6hFGWpGJ5QKmUp7mVenlHWVzS2WVmkKOWo2NF7RlLYAV7ulV5nTOV+UsqGEoiCIlHDFt7hUTGoBAxDwzhixL6qLGbxUlmJW6JKoVlqpVkapVVz6IgL5bj1WMo0nRbx1xrlCAAsIK/ofoALwggAwiCAH76ACMIGXVfrfq/mXafq/mOZ2SXeXVXcwXXQ3U3S3YuYLMuYlJAZGtAbGpvkrBgYgZr
|
||||||
|
|
||||||
|
KmpmemrrIeVPRICedgbqHgVbGCfcY8c8a8fQO8Z8d8SQLhRNB+d7PgF/hIB3ZXdXT3Zfo3c3a3aBZwX2hBVBa0gGDBQ8hOvBeceLjOuUPQPXEmCMAADJsg8D1zCa4ADDFzFzEQDDtAwB/AuRJjaFzAIALB6Fxg03winIAgDwPQHBHZPLim9wHqXB2HCk3yoh8QsVoz1A/V2FkjeRXzXD7ATWO5S0GGbA/VnCPAQYkj/SxXJRSVy2GX+6RGoY6IxH
|
||||||
|
|
||||||
|
mlyWWlqWJEh62km35Fm161R7OmGXUY6WFEW1RkWUsY+nZ4lAcb22vaF4NFUquVlJorm3HSp4dETKcIIU9FqT8RHDsos1B1vTeQh05ncC95nCDgS3zGx2LFmZlkrEqodUbFuKZUObZUSAwBNDxAACyYw+gqEpVIJVxecmgIw8ExogQ+AmAwm1QzgbINxJwqEBV8SxAqE9AOJ8uBF9ES1qdlVnE1V5J2M794WudTV+d6+ouv9Ih/9STKT6TmTaDqoC
|
||||||
|
|
||||||
|
TzY3cBwiQrKgpyyg43Efk1FVuPD8Qfc7DrK/0w8H1AUCKSIeDsIlFqyBw/enDAl2pJQupIRHyEjRpilKtv8atCR1pmlyjOtDpceGjBtLpKj9pajkAZl+jVtVlxj+CdtKdDtwZDVoZLtdCxpoLiqqe/TvCuImyAMyIXjWZr01kvNDA+LEVwYMInwCy6pcV4TG+kTeiKVZjU+adnTZJ9ZOd3tAzrZcqETHZHq8wbAqsy5voLM45/Lgroaq54BK5dUU
|
||||||
|
|
||||||
|
B0a49GVk9Bs09Kauo44B5R5EAK9Z5JQ69BBEggDwDYDEDUDMDcDCDSDKD75VB59orGDArHAQr3az9Q9PBkFiVI6AhglQhIziFTm5Q+ThTxTpT5TlT1TtT9TjTFNYSON2DuIm4SQpIGOEIRDRLpD187kZ6NkD0Y8iIdDkxt2xwz18ylwdkse/FX9syCikIyI6Z6ZUULN9z8t3ykjKLFQMjqtcj6t6lVNkK2jutjp/z5GgLPzILEAYLaYBjGeRjfpC
|
||||||
|
|
||||||
|
0dl3GDl8L/TO0SLuAeoHl+1GVEyPlkNl0cZ2KYslyqIQ4gd+LkVbyWmpLIqol8IlwDZUqYTLVyx9L0T6xUwmx8TOxuTgyCAUs+wwmhV2A12rTxQRJzL2KtZNVHwdVvTljw6gzbZiVbVaxKWUwXVPVWWL4OWYAA1AM7kkIMYxb4qFGxQU1lb8ISZEUeIw8ewzjIHzWw6K1Bga1NOfWCL0CjOMNQOEmB1Y+s2BroD4DkD0DsD8DiDyDPAqDd122j11
|
||||||
|
|
||||||
|
kEIBuL6J6g4MIxIeOV26mpyfklkNHSyW4uyd7EshAoNG1rH32O7zY0Nu1428NlGjOGNESKNsHkAnO3OrO2N/OuN+N8dhNohEgP7f7AH12UbkyszawY0fccQhwW4hwquRuseU8Bwt6ewA8yyMI1k180dRz/N18LwdWyI64FFquRL5bh8tz98step4jFpLbLzGGKlHzmtXz2tMKo7RtWRBlulxtI7tjujHpltzGU7hKNl/pc7tRFj1npQpedCeo7td
|
||||||
|
|
||||||
|
jntjnsZdSO4fEw8qyIVAtfjwqzwBIBHm81Lj7dLSdDLsLkA1Zs+KImdlk2dMH43zVBdE9nZgA/CCH6n6AASIIAUXdfmXWXYANIgr+6Awrbq45T3r373n3P3f3A9Urw9q565MB8ZW5S96Au5s9KmqBC9GrWrrburs2AbRTQQwbFTVTNTIwdTDTVrn5Nrj3z3b3D+H3X3v3/3TrvaLrvB79/BXD393nYz6AxEi4Aw9APAzQQwi4HAOwXQxA+4mA1Q+
|
||||||
|
|
||||||
|
4xcAwFAT60z6AuhUl+hZwt6N88nWnO4mwEUGzyiiQp8dk3E4XgVeb68pzz2avu80U1zDyx8P1Z8KIrKSyh2pXzy5XDz7UTzClyttX7zVpDXIC3zzX3XA7elQ7Wjxlvz47TGzYll07Q3s7jLdRfG83y7zR42le9KUZjjpStHLiC3akSyZ6ZwvkJ7X0r06Z57JLod6Xlw24T6byoTg+QzCdyVL7KHvrISXJIX3PEAlYQwbIRgqEOwQw7lwJNmFiec4
|
||||||
|
|
||||||
|
JkJ0JsJ8JiJyJqJ6JmJ2JjmWx0b/OwHYAoHHT4HXTbL13bHRqXLJMXPSFEgA/Q/I/Y/ivCuVNNNZICQyy6Z6uRIA8A8ev/w7hRvYsCzTwZvOwrditzIgBIBIE9E8mK7O44MojCrh1295K0fcrzTDArXkYa0NKQfJrmkRa6kZNGHXPttHz0YTsIWCfW2sN2T5jdj+LlFdo6Cz7osOWmLDhESBsgAwyQa3GyLHgvah1Vm/wWrCEwWL7cTS7fKzPZXa
|
||||||
|
|
||||||
|
Yz5062qQ/o2X1Q3d4O3LWlry3KCtofU9qNuh6mUHtoUeW2JctwTFgw8x6m5e7vGkR7qwkCWgtVujxMGY816F5AtLNl5789BewvUXuL0l7S9Ze8vHYOTzPoX0W01qFQXuTuYcFme3BVntIPZ4CVOeLjImhIBn5QkYScJBEkiRRJokMSWJO/gRX0L/QbCx8I3ozW4jfBrIevQcKcgihHAdOw8SnJlzXg685km8Rmv8A8JM0JaUAtAIViN4PQyQTwdX
|
||||||
|
|
||||||
|
JCBKKNtKucjarr71iKdt6uGAgzsH2wGh8/m4fGPMOxD5HQRo4Lfrt6UG5kCk+x3fUJQKXaTcLY67bjpu1KTbsXGPtNcNcHOE68MyqPCvmmTxYV9L2lwJMn5DxBzEBBd3A7pZmQ7phJ+hw0xL3wv7oBUmqEVCKzHiRDB8SPmejidzA6kltUtVWPMJD6YctburfVqp9hiaodjE6HPqp1WMRbAD0ypAeGPFHhzxJq7QriJ0IBDXByOIwRaiByEiMcOs
|
||||||
|
|
||||||
|
agdauDXG7MgOOlnDdhzl46DIHBAvIXiLzF4S8peMvOXgryk4PVUcZ6HoXPG27wgXhSyVTgTjejmQgYD0RmtWwHjvBccVOQzixy+ziRfKGABUJxzhqoBJsh1GbIMhvKnV7yF1J8tdTfISiUcJkA9IcCRC95FEazTmvp3wRqcOECQa4HJ0EYLxtgPTCxNTjBqbUGqRo9kemjs4UAHO43ZzpjVc6b9d0v2PGhEgJrRCfOgI4EaCPBF38sqczQlLdj+q
|
||||||
|
|
||||||
|
bwlkY8PZNRUpDaBxU58A4IcHYYS130YaGwoSEZrDw+4quZRJqUPhXcdSsAz3plCq7PNhhsjVAV20UZa0CBOA/WhH3wFR9R2MfYMCQLWE55yBmwlPk5RjLp8Kwt1D2tny9oxlGBFRcoU+ivhrdfGKBe4bX1RCbhOabAmOi3wQ4j5n2Ig+dmIJJLoxzuRwS7iUURHzcURb4oweUEPyv5r8gALhBAAYiCn5AA8iCoAy61+AADocBD81+bfA92vyH5t8
|
||||||
|
|
||||||
|
TdcHqgDp7g81B4EyCbBIQlITr8qADCVhJwl4T6ef3Iib90h4us9BMrUenK0MEKsDIGrZHqqzR6ZorBOaLHrYKvJgkIS8Q+fkkKX6pDV+3gxtJTw9QQToJcExCchOomYTsJuE/CQzyYmP0me4FbgGEOHSWxP646TOOfz9YSAeAwmeCJwHoBwABgtQeuBcA4BYQegtcVCMQD+A9B9gd/ZXp3H0LOBcOO3K+EmWeBvBP+6yEyL3GHgJA/0jwIRo8LN6
|
||||||
|
|
||||||
|
PBdgHhHFt4U+BFdPWp8GAR7ybae5EB0jJSm81GEB9xhyRSYabWmGtc8B6jDkHOOmGri08Kw62lC3jAwsaiQZVPuN33H7RRIdA9ol5Scaxi92nwGqiLSRBrcb41fO8f42DAKdBwp8FEHt3eFCComn4n4d3z+Gfsp+gyY0PUHQhuTKw9wCfrEy/YANEkySVJJ5gyTMAskOSPJAUiKTr8ASLTZxFCKZZ79YRdZXVEf36YgT5BwzbhDEPQAHSjpWEE6c
|
||||||
|
|
||||||
|
WN77U0NgTwcyGdgxwXJx4FyWhtFJ7gQYkgCUm+BTkOZvoFSxwOoUSDJxqkNStvErjLUfgDDUBQwpAX7zKkKNPmmAxqSRgXFzDI+QLHRqi167LC4+hjDcSY06miC4WPUqgbEl2H4B9hYswvupmd74cjga3QoRt1FjbIj0VwJvm8NRFPtDuHfYWdCO+kQdum+nJqk2WlmAyli3E78pOV/LTkBygFOcqOQB6+CJyU5f8nbKArzkWJugkemuQMHw8jBv
|
||||||
|
|
||||||
|
EswfxPnqCSlWy9YSTYKyCXkN65QGyXZI4AOSnJLktyR5JkLeTfJ8kr8mIWtl/l+ygge2cBV1C4BghhkgdG62gqesohPrdKtcQYBXSUkaSO6Q9NyT5JCkGQndIRWchLNXg+zCKOqTngA0NmNkW9KVhMIxg9mbvNsWSxy5cRdkzwx4aVn7G4g9scIYmYbnVIcMhx+U6mc23HF0yRhU4sYT2y0oLC4UbXRFBzK66LCGMxA1qZCxnZ55tx2wjln1LKQg
|
||||||
|
|
||||||
|
UjxDjYaUcNGmLd2GQ8LwuXxeg3YJ4t4zvPNOxSnxyQMpcMfe1fFAy2+G0r4WlXfZboSxe08oHqB2CYB9wmwMYH8FaLb9d+4gllnCKg4IjTZAMuQRbJKBIdUquI2zNiMw79VjEApOZLPPVJG8vgi84xAcHciryn068xmpsDpE78GRzIVasyP1Hzc4xUAU0VZ3NEg4eR5QCHKWkwDloYcVaGtAjipzSdUcOncjt5FXkXpfR8Yf0QYXMinxfI2zS5EP
|
||||||
|
|
||||||
|
HMLKYQaUiqkkaIs6A4zRFopRdZNsn2THJzk1ye5M8npy/Jzox6kOEqEikwofcELEqNj4gIjOrImMWZwRq2cXOTtczujRSVucMx5nLMcLi865i++mC7BbgvwXQzdpkAbuDpyEq1sj0T6AeMIzFIbBNwbo96H7UhCDxABdkcyJvG8hXAea/tSAZ6zd79D4BY4n3vvMnHfJpxTMiYVgOqmszB27MpcZzP7ZjsiBMSyAPHwFnQstxXUhdqLJ2HWNnkUs
|
||||||
|
|
||||||
|
jFnuzPQ69AabwdgbNLAXCo/+3kdUsSAy6wLiyWsj4cnV2XfiayPEefABPZYxlzZPLaYOOWfxPdr8l+U/NXWAJsF0UIrTsiCowngrIVrBL2RAX0GcT/ZlswOTPWDnqshJp5ESVHLsGDIEkSSBubdMyTZIW5z0zOYpPKDwqwVEK5glCqLklyX6Rk8uWzzMljQLJ+SgERAGLjCYYAlYG8D0CMBCABg+gMppIEIDCYxgnIfAMQCTA3F/JGDDuNq3KWNL
|
||||||
|
|
||||||
|
cGt7TNr3BnCozqKG829I4TVzq4n0ewC5ClIJBJAIQpFZEJFwAxLy2hiQOrJ8FPjMMaORLYZfVM+SDC95xU5AXV3KnHyqpqjGqbgIBaXzT57pJYbfL5kDc2M6wx+R8pFm7jGqr8uhF5kGk58v5bYH+WpCJB5lKxVw4ljcOnCwZQFgqWvl2K6GDgNZD7NaRKGEFIKtpdmGZmUr5X0AKA8QDgBQD6BAcPpbTEoKdwkG/SKS/05EVQt6S8qrJ6ATtd2t
|
||||||
|
|
||||||
|
7XxBAum+VBTDO7imRahPNZGYzRfTsMSGGwfuVCF2TnwUQFIGcGjOqEfomG9Y7pdl0BrWQFZ5M6ASI23kjLfVYy/1fTMPlBqlGsy0NfMtmHZFvVLMujDGvWWlF+ZCazcRsOTXmNHaafXYWwBm49c5ubIsaf8GODbAuIgCnlG9F24VrsywqPuN0reDbN+B9a15etI/FIKiFP4g/n9OkFIj/lk6hQUCs7KpNLy9oBUO5xhWA82NHGnaNxpWhgFWJPs2
|
||||||
|
|
||||||
|
HvK15ZYqVW2sSwWHOPIRyzYokmORIAFVCqRVYqiVVKplVyqFVSqmlc7PY2lhONxAQTUELApsqy5b9cIVyrgqWTa5IEY0O5KGAwAnNbIJMC+TYCSB9gRAOADeE5AqrMGKvWNiZHXC3YvRQ8FgeTgNVYaEgpIIMVbnFqWqC2ItWeYe0N6OqRUiQREFZHNVvUspeUqma+ppl+qTS7bUqV+sZmB8ZlwGwyufMNpUZlxTUtZWuLvmkCoNSavWVsLg29Td
|
||||||
|
|
||||||
|
hxcKWbn1zWJLThaAckCYXvXYbW8b0XKfhvGLgKz1S0yyHWrgXULG1iCuhedIsQfskifKzADeFICpMBgN4E4CA1KqfTh1JC0dTAppIUKJ1p/KddXNBnU1dt+2w7cdqC739O5BWOeHhwBCl9NwmGkolPHHhLJoQfkZ4ORwigG4UpsyCENbkcJHBjCqIdLUMuHEFTDS76krSVJQGTKj5P66rR11q3zCph18z0i1q2UdSdlHWncakuoHNEtBxUegaeL3
|
||||||
|
|
||||||
|
YLJM2yyYtd4zPTXLK14Cs4Isl6FEtm+Ly0CW8qO4wavpxC/fqy3o0mSZBZs5je2VY0epVqnAeuBHEjgcABgueEiRICV0cAVdMgTgBrsTAorpWQmjiRuQxUSaTBfE6TaHMTThz8VkcqIESvKD2bHNzmmAK5vc2ebvNvmvTeOR11661dhu5iCyrM0s8OVVmyuTyvu15iIAPAYiGyE5AgMhAiEP4EmHaCvF6gUsegEmD+CpNMSHJZdfLgCnqrYZwWzp
|
||||||
|
|
||||||
|
TCC4h7ArFFIC1ejKmql8SKjSJ4EDGlFEsp5vAXDhwspBfBqGoxR9W0MCIo6d5hUqIhOI7blb0Bwa39cCzDVszANYfTrlGrsagbmtca1YZBsFkU6vxKa6neLMOWhA+tOam7HmrGiPL6sWGxWVRWm2XsyQyiEagchfGC74F74nWZtPW2/DKaxSPOJWFqCoQbw1QD3c3EIUVVxdP0ppGOoY3AS5dCAWzT/r/0AGgDpSh/o0qHjuFLkFFQwjzQNVnBbs
|
||||||
|
|
||||||
|
L1UHa3vI4pS3CnYtLt0LFgs1WhIqIfS+u9UICx94yifdju/WziGt/6+FBGqWVXyQNN8sDZss33bLoNlO5+XuN2FU16dDKBgWNMuSQgYQL6O4UAunDpllZ6mL4McBb1kaltgKpKqtsZZnaJdkgqXVdpl2ULbtLG97RICTCVR44CwPkIHoN2557QaErJDKi13oArDNoIQLYdID2H1djhkgMoFcOSsRNaK83SKgR6ybTB2Km3egUiPWCFNhKsSbHIT1
|
||||||
|
|
||||||
|
J6U9aejPZoCz05689Bev3Z2Q8M2HI4Ph1XQ4cTCdRAjVNYuWHtCER7pdEQr+tHpBmx7mgshPUMRGqCSBqgcARcIhHiTYBagzgRCDcX0CaBi4qTfzWqtbZrqdmJ8SyGei4jbd1ce6kyFKTdG9x/gqUqto/ovXghGacybLllLxCOFjZVBxEKqKgW3Qh4+2J5WVwK10HRlRUjHQGv94VaKp+oE+UTrPl1TF9eOnrqvpanr62pD8gMjvtg2LsX5uwoQE
|
||||||
|
|
||||||
|
fo20jTBtMstoSlyii7w1uSyTnQRvpBIhteve/nZrKF2Ua39zaj/dtK/3r884CAWoIhE0BdABgmABcmdLfaJN0A8e4gF8H3DOBlAUAIQM4CljGhjQGSCpoQEXA5BXpuJDufSa74zrqaJwIYJIClg8Axg6SEBvBGIjEAbiQgYuHqGYD4B4IA0uJqKaBJRIW1tcpMMRHrjEBEIe9SsHADgBYRUIhAJMAgEuCch64anEU80zFOGmiTkp/AD0DwW1BjQF
|
||||||
|
|
||||||
|
AQIF0HaDS9sA9AeoGyGqBWBXtep90waYJL0j/MYBw2VIOl2MbGqAKhktOtrnknKT1J2k8gY+12FWUCQMkPIk3CWLde9ehfHgdI0jhN4SiY2R3ud7uRulCnTmjcjLaDLKZCGEfWjseMShStWO7DK8en2/HF9BOyNZ8ejW8G19uKCDRUUT7tbQTnW8E6IYP2RsP5khxnYt2r2wgb4NxktYoexSby56Ny36EsfuhbhXh5GvEytqo2pUaNXyyXZAbTPQ
|
||||||
|
|
||||||
|
GzD8uiw+gHrhsA2A2QNUEutMqwqPUP5v8zaFdPsTB63s0I3D3CMByrdQcmI4vTiPya80imvVugBaMDA2jHRroz0b6MDGhjIxsY3kZAu/n/z5AQC6ZudY1HLNdR6zV6x/pNG++JwfAC4B6D4B4kXQfcPBAuA9B9wAwLCMsAoByn4gExrBqWJWM2RVRLwghiiB3B4aGlJkQxRp0TIvoKckXFKWegRnnpLIeIXeNsBaGetcOO6woVuFJAhb8tvZwrbv
|
||||||
|
|
||||||
|
PR2DnMdga0c7jrYNfHODQGlyzOZJ2An75S5kE6Ny63Sz01lAaE5/o4Sn7htZwPENuGYrTbwQ0HDvFzsI0AgbIB2Klk/rjoUb7zBJtbQyauKbbv9gyZQsoBvCIQ3gtQE7YOv1nJm6Nr54w+mdXw5iY9LFm8MVdKvWJCzQU9cNCBhAogxUPwZgdRWRCJcSQrKfhn5AwOADiK2zErOuHAFkzmwVB5HbQcX30GpGTxz9cwacusHllvzWqW5Z+MeWV9s5
|
||||||
|
|
||||||
|
gE/OfjWLnE1fl7qamsRbNEKASG7mShullnjycBQwxWt3S4qH4y1kSKRDtWmZWdDD5vQzCJTNGGTZJhm7XSRf1gSJAKMNtL6jp3AXygsNgIVoIjRQXUVkFsTVxMt2RHrdt43FShYd0JGndSRiQKxfYucXuLvF/i4JeEuiXSLSN/wZoND00XX67rUyVHu9bMW+V9cCgMJjYD1xNAIIeuD0FQgjAoAyEegNgAKo3EvBb2kvVMf3UQg5kqzGaoUPqS1i
|
||||||
|
|
||||||
|
rg5kZNjR0uBAxWxCpXuNCFLaA18uZ2EoqcfLEHtLxlkbyJZefV3GVrDxhgx+oPmbWp9zlna/OIWUL6ZhS+6c0da8unWN951trZdb2XXXnazRdYFms8owm8+4V9eAmQuQWFYriUXyJ9exRyGdez1Y2QLoyt3mAb2VjERKY37Bd21kp5gJdh4BsgTgRgY7SAaTO0aXzl2sG/VZbKQ2z+2ZvOFXdwA1267MZ0K+XZQMmQrVFIAeRcitxTFDzU8Dxow2
|
||||||
|
|
||||||
|
rYzSlmUUnY2S3xARK5D7DEakjp7PSUbLo+ta/ZeeMMyPb217gzVu+N+3xzqynmbGuDtAnfLI3K63vom4H7MA916+49ZOV1Id4YsfuQoZw2hYb9tfV/sOD+uF3E6nwx86AebuGHarbd9853e0Nb50AkgUIJIHaxB4EbvGj1Kg+YDoODAmD43dD0xt+y4LmKhC9Efxsya7dcmom2hcSNKbvzfNgW0LcIAi2xbEtnoFLZlty2T61rZ2bg/wf6BCHT9E
|
||||||
|
|
||||||
|
IWzYrkc9Gjf9Ple0A4DxJKYgp7AFLA80gNNgUACgM4CGAXBsAiELQQCQVtFmDc9Y/6Bpk5SHBd4cXDYFxDiDyJ+5A4J4VpYPRnpjg64YJpxXJDpazjmJ1EJce2Y2RDzXqp22+oHNtsHLLxk+41yvt7XFx7lr241pvt8GFzNtMO4/YjvP2gr9wWO1yNbVdE4TZ4xUtZBvhJkUT/ehK+ibGgp3aq2x55QXahvC7dZyC2MztK22SmjAqTeuEMHiQUBU
|
||||||
|
|
||||||
|
mG6Ru58tnywPW7QE2QR+dgPd3BkbTjp1056cdWgtzkOKXCD4gKZZDOvSx6PceCBjjg01ka7smLXNmNnzwWEAI3Gk95t7Vl3e/ceCcu31rbtkcxE+ZmHXvVk5rg8vr+PHXJ2Id5J1vqEMrmqd8Gg/UYGOVSG5M5IeQ98DZ2ntOIELuacKmJDq5J77wMB3U/xOQOgbBsmq0M+u1MbRnhdXzlAGwDaBUAHs9IMKZ43OyZUBLolw7P0CkvTd6Nk3RLFl
|
||||||
|
|
||||||
|
ZhG4CirGh1Eak1UPbdmBVesTejkYWIAsj+R3AEUfKPJAqj9R5o+0e6OGbeLyl8S5pcs2xH7Kui8YfqPmSub0jyU0MHqCSBGACAfcMoB4CaB8A1QHgFLA1D4BiIzQY0KJnluqqJLoXcvTw3ClnomaW4F/gauFIkVs2Ri9Mk2YVJd7ktjwvvQMq4aXBSz3weQySCuCQgd7YjPe/2eueH2Nrdz7tp7bPv46L7RtK+81I+f32LrqTlaCIbTWTdNAEUEK
|
||||||
|
|
||||||
|
8SbCt5OxpEUTcMTP+iKznxZTmbYRq3UFkVp6Vmlp+YgfvLvhXpsu+9tJODJ9A8EbAGMY4D7AbwFVxM/05HUQHMX4N7F4g6zNNW+VI7sd6kwndTu3taCjVSZB51zJVnAig86t2rNcUnqRwLLecqBqACxYrZo52Q2t6hubmcbuAZc6K12XQnR9yfWm9PuvOJzWb+rXE+J19dvLrW758uf8trmS3hyst7w9m7HjpFY0qBYzUIaaZIXuG6F+eZmi6cCQ
|
||||||
|
|
||||||
|
4dJF8tqLuovNh+h8A0bL+UZmYDuL9AOoRZDOaAjQRsl+OVo+kB6PLhntsJugskP0VZDnG2y7xv7lqH3L0vdj0GTavdXPYA10a5NdmuLXVrm1zK5o/0w2PFRxV6XNdYquwbar7lRq9GZ8qjAlYY0PBFQi1BiIDQZgPUHaA3h2gQpxcFABvAjByaRenQva8C2SXnItNO9PRQhDcRH0AO/dUmUSB6Yfg3wfhimTjAd7X+7kIN73vXClOSgVBqbVvMdt
|
||||||
|
|
||||||
|
+3VrrbU0im5BRbXInjzgD/tcvu5fr7/xvNz5YLcUCArBypFmW8L0IfP58dgbScPhNZ3wpgjYKmnZFTjxM7u8a4Cw0HE1Ou3CCwG6+1Lv5Wh35QKWPtouCcgrAEZPp0OuBsYvjZwz2XaM7gODIJvAwKbzN9mfueCsbwQ9CFmL5/pDgBqoeDYTsj9yWxYXlms2e2Z3oC1JIXyJFx3BnOHb1l997ZZCcZfbnWX+51VsK/RPFlsTjN286DsbKkn7U0xk
|
||||||
|
|
||||||
|
/Iq8QnYPKIIFzuc1TrgDz8Icba9EjeZ2sptbJZJoef2Eee3IujraR5BtwPlvph5d5+eQcQBFwTQSsPi3KOMegL2D8oDT7uv0+GPHHnQRjbpdY2LdCuyTYEOuEE22X8R+hyTcYcQADPRnkz2Z9cyWfrPtn+z458U/U/af7P9j2p/M0af2bH9Tm0xc1c5nUIlYVJnqCEDglcA+4NkPEhgAnB4IYwZQKkx2DCYLg4ltz4648/cQkghDcKYYt7yneSzV
|
||||||
|
|
||||||
|
yL4GLA15wPIvgbyK8G7i/Pu7eNBlL0bTS81cfv8RFgzl+A+uWYnB1tP55dA933SvKT8r9B5uv+t9g7QCtzk/z6yY1IZyVGfCH/sTbuIWHxK79GJA80s2ed3E8i6yvEfO+6VSt8PYKvlBUKIwbABwGLhXhp3oipu8+cGdLesXlH1b+M8H8PER/Y/zNc55JNzOCs48Y23W0OC8CXhBq1Lq8A+BB+H0ZZ/11lyBj1iJUuB9/nvAH2PJzn8bj7/vfS9D
|
||||||
|
|
||||||
|
nHLf3yqTPq5l+3nnwP/90V7vO64gIbk6PzlB77KsPlV77A9cAj6NUZ4vtiM0frs4TteJbJj4PixfHdAEe2hgT4NOT5gM4Xas/ou7z+FPolRU+HMNTDLgOsHqAqejPoUSI27MLUiUBhANQEM+nPvS7EOPPqQ4suPEhQ4cugnly7lAovueQMO/LggBG+Jvmb43EFvlb42+dvg75O+LvpQQU8zsuQHHgTASwEc+mvuHqaeHrJI66evrLXIwA9cMoBDA
|
||||||
|
|
||||||
|
+wJgCcg+gG06i22ANsyLgcAFcDLIrvoFKb+m4IkCV636PswhY/nisaAw9YkswKIjNOqTDwseGH5JaEfrF5paD/kl53Mw+gm6K0Sbl+6Zeyftl4POWfpm75e2boV65uwAaHYQe4dkW4w+65lAFOetXkNL1eJ+tW7XQ36D562400k+hdeRIEiCB+WAeYY4B7+rlblBbai061ymAOYCpMlYKoB9gc3lVYwOBARR4NWeSqu6SmvQdgD9BgwTt7u+W/gb
|
||||||
|
|
||||||
|
w2Q70HiA3sAAtWbPAOXP4GnqQQS+iACu8D9TKczwJcBlm81gl7dmT/m+5BOH7l97v+4Tr+6p+IPnl4Z+BXmkGg+OfuD5nWXzoIaQeT9v85QBAwLAGV+ATGcDrgXwMgHNusBB45AO4CmLBIgewEEG4+tTvj5NqUDlP74B87oQHt2J/CQHUe/fPizGgaQAsCsBbhgSEV8RIcEAkhmgcEZcenATx7cBxgrjaIWnLrEYi+qFsIHi+/LkYEmBZgRYFWBq
|
||||||
|
|
||||||
|
EDYEjAdgQ4HJASgT4LjkdPhSHEhUAKSGiO6nsZKquDFlXLc2kppsDFwxVouDGgnILgDtAV8JWCVgFANyAgMN4MJjYApfna4Bazgbt4p27FEDAKInwI8Bi0BqgWTQgDytY6EsveolrRe4QalrxefFDlKx+73jcGfeCQd94TKqbjOJPBAAYD6+2mQe8HcyxXjkE/BoAX8FpOAIbQhlua/FubZqnQbk6Ne8AQ4QAwAGGj5rgCiJj7W8h7EFQtB3bmiE
|
||||||
|
|
||||||
|
l2vfjk6DujJgK4cA1QCTxjA1aBP54Bc7uR7jqS7o1aqhtcrI5th8SB2HNACwXu4eefcPWLwu3kOrgn+Q4C6HvAthFYopcKVjFYr2AtM64So6ZE947wfYg/5LWcfo8zO2B9okFJ+aAo8GpBzwb/6Ae8eAmGABYPuBrfBkPkLK/OxbkX42w+wIPbIaiHqhpyYfrgEHFO7XlxQVhXYlcBV8NYYN7F2JHgt4t22IQg6CCCuuUAUAFsPGgOs+gGxCTgco
|
||||||
|
|
||||||
|
Ux6dkqEWoCyOhAJhE6wnADhF0uUPDdAwW4mvz68BgviWrC+wngSpchs2OqGah2obqH6hhocaGmh5oSr74R6EURFYRpETSEGSWvoqFaeyoVI56ekpjAB6gUsPUDxIothwBDAQgO0CYAfwBQC56yJJsBzod/MnAfategmwQhJ2GcjX6Sll3Ki0XSkQyfAh2NY5m8NhLMS1YyiKiBiwjwNH6Hw/0EqQIgxxkeyeRVwSOKyUtwWGH3Bx9leH/eD4bGHt
|
||||||
|
|
||||||
|
c//gHYfBvMrn7gevwfkG76GYcX7jGWTgcJ9+xwtXJDavANsg5218OwJDwmdkshHokSotp4+2AXWGwR6LvBHjBHdkhEQAtCvWFocjmBhyVW2HMYgOR56ASDORBuDBgvYYAJ5FzI3keuC+RAMCIqT4+AIyLMcUYiZwMCiNHIrzcLirDTyKGLIjQJiSYtLIpi9nFjROKi/tZIqmrJuyacm3Jryb8mbIIKa0uffoCQmak4VNQ7M0XjG4Fky0h27mR90f
|
||||||
|
|
||||||
|
t7vAyIDOAaislmbwvofJEmR7MRGnCDuRqhkF5AwfEBRzjwTDA2yxBL/om5nh4YUwaRh0yl/5RO4aq8HxhN4dkGk6IAVD6i6fzt1pw+i4GX5l2WUQXxni2zNmz9y6HqWq8AiorCGEaotA2Z2Q5USiGVRuhsN4NhA7ru58q+AEMB/A+gDADKwRSMMFi6owZByAOUBiM54hcYE1FcxLUViI4iqWMYj/R5kIDFO8DFOSADRzgF8DgxgjFDHbMfcLRw78
|
||||||
|
|
||||||
|
n0lNHiKTHJIqzRBoqeILRnIhlFOcHiphatG7Rp0bdGvRv0aDGwxqMZpROipKKuipyBrj/A2wF8CUg2wMRymKyosAJwuhQn1Fhi41HdR6i1sRDSNey0VxxPW60RkrJi6SqmK84Hch5zZikwYOF5w/MYLHCx+AC9Lr+XQR9pEipyEPCWQwcZ4RFR6MhCBKk7CgpiUg2uBF4IoqIEkBhQm8NszZCEAq97JewYal6nhb/mE6hRUYdeExhGMUD6Z+2MU1
|
||||||
|
|
||||||
|
onWXwZ86vh2+uAGR2VjFAGIQwIbux1IyXDrwPopYcNqZ2BzM44AgJRPnYDer+t35E+cEfJYCIOvIBJz+Ewf9ZU+2AIEDUwZIZ/EhAx4EQ6UR3Hsy4RG/HiyH8BbIYxGO6fLrNjMmR0RyZcmPJnyYIAApkKYq+v8d/HyhYkbUZKhevmt7lAmANKaym8poqbKmqpuqaam2prqZD2N0VkqLBvpEarG4R6gOAXeBqt3J9yGxkpjwg1TnzRrwEUqcgUMF
|
||||||
|
|
||||||
|
HBlLARC1p6x6cpyM7zmEc8Hpjlqo8Rc4hhr/on4Rhv3mFFoxAPvPFxhQHkvEJOc5qvH5u+ftD6F+UdsX7jh6UQop5h5MSCHxkhlkcCPY7AkUKMxEBORTHqN5loatBVUT34oKPfBXa1yYwIuB6gbIPuCEANcF2HQO0/sFhQcLNGT4Q2DUfLE9+isQwrKxmIrZh8JBQhSxa8/jpNRiJV8CRoNmlwtfCNYmHGbHTRVscZw2xcAXbGuK8iu4opU15C7G
|
||||||
|
|
||||||
|
4W7sQRZexxFr7ERiuisER4cXwJZD8kGBqLQAw0SjokOKycXtGpxJovbEZxySrnFLROcTtFpiZSPnGZinnK3x4JAEH4kBJQSXo4rqZSmXrOQL6C8DZsKVpe6PiL3i3FsUvnpcgDyfELgYX+a8FarcQZzH3AXIGuHjIBhXDEeFjx8fhPGKJyMcokzx4UTeGRRF8i84xRiYUAG4xuQYlGFuyUUTFQBxEHvHpQY0vFrq2h5t4zHAmPvbiIBc1FBG3xvb
|
||||||
|
|
||||||
|
iubE+3yrvDqixydLEressZbLlApYGoBWARABKy4RHqBSk6wBAI6zkRIRkAmwWjIQL7mCAkhAmCBHITqzoWs2AQkymcpgqZHapCWqYamWpjqYq+9KVSlMp1Fkq4WaOvtp42a+0egAcWqEPEjtOWQDAAPQIDD0B6gWwJWAgMnTtmHUJ+kUFLwuSQEWG4eUXCzSA6FkN1bHwzAoSyA0gApbjio88BWZionXlEFPoCQFApJkXFMoiXKb3nInjxVzojEh
|
||||||
|
|
||||||
|
RP7r8mqJEUeolRRi8QAE4xYHmTr4xwhoUEweUAVkymJ/WuCCJ2L6OBFJktMceaZsmPturkcawVinayd8bilwRM/nVG4hMSeiIKxWIq1GJJuWCwrup4tEtJFOuzFcLFAf6P6m/U2sdcA68JsRmBFJFsUyJdYQyeMk7UlSVMn/YYyWtETJMyc/bbRiYrtEJKUwbXJAMbIPEDMAMAD0A8A+4GMDNAg4FhD7AwrqhCbAWEF0BOBpemuquB5kN0l9wz2O
|
||||||
|
|
||||||
|
cIGqMYLegCIo8LsgYaubN3EG0eIBYrO8HhLwLcQlBp6xHArwIODXwR8RCGuO/kajrxBkaVPHRpqMe8Yhqs+uwZ/+iacCmPhnwc+FrxwJpClgmEAUUGZh+wNoqlBuYUPYV++8b7QDg7/D6lQhHCFUJnmTfmNDpkWGvrYuJFUW4mcxHiU04b+F0uzBGAYwHoCWBWTOKbcxecCaZmmFpvBBWmNpnaYOmTpi6ZUW1Ce9KDasmYMg+mfpgGZBmIZvuBhm
|
||||||
|
|
||||||
|
EZlGa4AP4VpkemOmZsR5w9QKkzVAiEKhAcAiDPCQDAeDnqDxIUABwD4AtQJoD7gTTPhTWZJwrpmCBFwMRCkANxI2hYQ8ECKrwQnIDACIQxEIZ5wA1QPdbXR2mZCKVW4sWElYhDaXBwL+O6XnDwQ4mZJnD8E4dsnrqcQMbh8MotKygbhdwBsAQxfcZBjsM24AohEp+MllxGO5+scBsMXSbciHhr7gFE+qQUahnfu7tiomYZ3/isoApdWveFaJSYWC
|
||||||
|
|
||||||
|
kphaae+EZpn4egBlu7sDmEnicAacqM04dFqJrcAGc24PCn0XqrL2/Xg1FtB1GqEmYhvYcSnk+DUVT7cggQOxqNogRlg7Oyr2QgDvZ0QHRFo2FEWxL0hwCfBbMhlDuAnIW7IXQ6ch0CYMh7pB6UeknpZ6RelXphADel3pKvj9l/Zn2VoG0WSqZJH6BNcnJmmm5ppabWmtpvaaOmU3hpntyMbLt6DgfJIiGnqfeI+ifpewIeguROqOCGQgKUkmTQga
|
||||||
|
|
||||||
|
uP449ihisWpUGvkNarv8dSniBXArdoE7hpY2ZPETZKMZVqxp/yfGmAp0UXMo8GT4fwbgpqYUlFkZW8TTrF+8EKTHeUidnsjzh/0P6FHmOGgbho+t+mygeQezFWn1O7QSN6bJ3QXnDEQTAPQByqXQA3YDqM7vN41RpCkDr5ZedDi5yxzaXEmtpSsUwr0KL4P44C58IELlW4W9sYji5BuJLk0MKweuATRYim1iWxM6aUnSKFSStHZOU2DUnWidSW7H
|
||||||
|
|
||||||
|
4WnsURY+xm2PdQuizkAejvAQjDPAqkZOGlYWIX1BnDjW7/BchnA7omcqJxcStGKmcIyUukLpDsVXlg48OUmD7ph6cemnp56SMCXp16ben3pwShsAHo1jnPhhS/CM/EvYkcbiD8JaonNQogOnBsERiScaXnDJ2Ue8irpm6bMn9MG6ZtE0JAuDkoDhBvt7m+5/uZZk8xq6hsAu8+uPCCXwxWPraWEOMuZBRW6ZPVgzw7ej3FxAMOvMiDxc1jbwiJry
|
||||||
|
|
||||||
|
cNnIZPyMVrJuF4VMoq502ejHz6CaW8GLZoKSml4xb4ZvHpOpbvsDv2EhlGRf2bjPbkEgB5teKZ2wfibgfWnbtdnuJ98TVHyWHKMPIR5nLKSmKCO5F/H/xTsuOToJchZBZA5omlwEgJasAJ5z0DETykw5fKSIGzY8mWTlKZFOapnU5zphBZx8p9ApLOyiha2xVGrNsq4E5uCaqlNUvpn8D+mgZinDGZpmZGbRmdObdGVZqzD9T3KNyE7wJcn6SFLW
|
||||||
|
|
||||||
|
E96DryPKIQQqQ3wthP4ExF8ol2ZcMexnUrXAPeLsgDynqnDHyJCMYrlJBl4TGmkFaieQUa5eGVrnZ+cUbol5+eQaRmrm5GZmmUZh0DmnH6iUInbW5jyj2JXKjfuU7D0lwiHFdxoMLead+RHjilGmo3s2EWZYYMRAUA+gGJZixeKWSS1UkSa/H1RDao1Ex5fbkknpYbaQnkqxtmIlKJFHwOqR7+ewMRxgA6ReegrO2RduoF5y1FOkzRD+XOmyKYyd
|
||||||
|
|
||||||
|
UkL5YhLXl4WHsYRbexJFrvkBx6Gu8CXuR8YsjPJfosqJ7JjvDCXjyWzuPmOK26U/lpxbioorV55QAjkr5yOevmb56OdvnN5bSW3lJASZLlybgazEPCXAcpJCXcqsJbSU3wwNO8YT5c0UaCximcZMnZxxABtFbpX+QXG5KSyS4UzFcAHMULFFWWurzhCQI9h+uWWnqrLGIqMuEfAjwKLS96i4YBk1C6vHh5uRiIduAHh2BS+5IZfZihmFFRBTjp/u
|
||||||
|
|
||||||
|
+GXNmE6VRYHaEZuuStl0F/wdCmUZDCKYlsFcVvIj+0dfq9CopDieIjw6/DCzTXxghYJnCF1VnPhLcrMeQpEBb8YXZU+VhpSmMpNKUz7OysZQynUprbIDkspIOWynqFyrHREWCAgfbo8uYvnDnlA+me4WGZXhaGbhmvhRZkq+yZbKkJl8qQqHYJEkc4VFZgyPZmOZzma5k8A7mZICeZ3mb5n+Z/hbQl3Rwac/zzGD0IiEoyqbE1n28nFAIqnYtboe
|
||||||
|
|
||||||
|
aReRthRRcQ9NOdyDZupVqQ7+B2QsyjwxILHhy5HyRGlGlSickGf+pRXGnlF82bkQPhyafFGppdpemEOlxfrShtF5iYnaIg24F0kwg7AqSLel0YHUqqk3CaUAd+qIUGW1poeeEnh5fYcQFNp7VC2kMK+xe1FdU9ue5A0M1DP+JqklxbsB5kgXrbZPCeIA8UtYTxSUnxKK6fOkV5c+ZaJQAs2JiVI5a+ajlb5mOYCUMgrwG0qfAJIOHTXwMxDfD9J5
|
||||||
|
|
||||||
|
ivMadJN8O9AxgBIAiWzpU+ciWjJs+a8Vclb+Rywf53JZkILJhcfyVtl5QJyD2gYwIeTxImAIhA8gpAMQBOSshnADi8ekZbBFmA8OrHcQNkEOAmEunINZnGN6PJgNmG4Nckx4KtnBnLI1DEODJk6Wnwn/oeXD1bJkWBTEHLW8uaGHjZRRcQVvGvbGUU+2FBVjFJpy8SV4JR+uQ0WExgVowXuUH5UPYWJDGaBjHoToW7zs6VZqdmh0XhCY5PAOJqMU
|
||||||
|
|
||||||
|
QVQ3qLrLF9aXBVRlYxbEk7FHachXx5qFXiJxARzmryJSTqf5XGIgVQODX5oAupY/0dHNlnmxRedOksik+fNEcisle/kyV1FXJVZxW0dMmv5ReMsnoA+APEBCAnIBQDwQmwEIBsAioBabCYc6DsADAPAJkAPpitjFI94T1DDoKcapMbLikvpMY435IJY957OCKHIYq2Nqp0k94dbOlqUMvDGcXO8F3tlz6lcQfgWfuSMWVqTZJRfFXXliVRUWUFKV
|
||||||
|
|
||||||
|
dokrxRGXon1FBfk0UbZFQPsDxOj1rmlVuBYXuzDwp6k7lXKDucA4rIl8bCCu5KLhMX9uUxaJnoAvRr0G1AHRrSgyZtmYMiJIfwEIDNAQgPuCSAS+bgAIAvcD0BRwIwNLiAubpkFnxmWWcHkjBz5u6Ln6YVC1UbF6lcXGDIvNYQD81kgO+VVx/fkFIG40GX5BHsF6NFwzlMUg9BQg8orTTbcc4WbwnIuyPuYw6jwJnSpFepaGnP++RYaVfJKNcrlx
|
||||||
|
|
||||||
|
VHxpaVPOd4XeVUFOuRD4kZRNUbn76UAa2wsFu2ZYlh0NkOuB9RfRZ6WM0aKcfAXwR2QIWbFN2eiGzuLLDrXBBrKBIWZmlPuOR/kZgLtBfZzdayCt1AOZx7c+jLmbpZlYOaAkQ5WhUJ46FhZbDnO6EgAdVHVJ1WdUXVnIFdU3Vd1Q9Xih1hR3VsAXdVoL2FCqdr4SOkQlJEGBecLCQ9A7QKBCIQPAJWCLgmgHqA9lUsGyCbA+AJyDOA5VpaGTGH2n
|
||||||
|
|
||||||
|
nn7GiIKlbbAspS5CuQpQnNR+Ox2GbxhQcyBRwpckUk8BhVLyZELEUw8rIYXI6svh7B11wZFUKJ4+hHU/JGGejVq5N5RaV/q2udaVJ1D9inUMFcPmux5VffvRnwp/lKwLbMuBsdlomLbhibO531v6XgVHMQ1UdV3MVzXoKEgNuBD8AwBITYkQtc2FjAPAJLVWeNxFACbA8SJyAigIwEYD6A6kaQAgMQIarWZK2TEaZ5wnwHADxAkgAMYUAxEGoGoQ
|
||||||
|
|
||||||
|
JwHqCbAMADsDxI8SLQLCZ6YiEkYh6dHXwUsiLvrWNpRcX/mDIAjUYBCNxcKanXRu7pVk21NhKTiv8vkA4716ccUVjDgY1OsGTWWyGFC/l6Gnqojx4VceFe8nyRg3DmWDSQU4Nc8Xg1TmMdSCmJ1L4cnUGJxNUYlfhmfDtlIedSOPAHAvSrfkcZE2vUrNNzDQEyuuZyiGkjFribWGQV3YSyzON4Um8hRJ/YZsVU+ucoGBA48hZ2STNDYNM3KFGZX3
|
||||||
|
|
||||||
|
W+yDIdmU7kYCSPX5ltDuPV6FzEYMjH1p9UYDn1l9dfW3199Y/XP1KvnM2sAe1JgnaBThXoH6+0kT4kSN+4FI0yNcjQo1KNKjWo3Dl79W8AvAxuEiAnoiiHakPAx7HAVLOPOi/yTyCKPkk2Vj4iOCeQJxlHoNYV8C9YQx9JfDXwxYdVk0f+U2Xk1ml6ubeUNSWQalXJh68WAH2l2VXD4UENTXPnm5lQSyigunQi7yKyHpZezq4tuHzps1XfjikDNB
|
||||||
|
|
||||||
|
hnWSl8axZGUG1hdu1VpU8SeljtpHUZVjhu+Qoi13Qh2I5h7JToei2nAmLRSAkVDHGRUl5FFUtVUV6cR8VHU+zZIAn1Z9RfVX1N9QMB31D9U/Uv1fsa3lui4WpvDBxhlgGkRx/eSKgHewLQZaeR70BJUvFUlQXwolq0Qa1I0a6YunyVecfTnciiyQhx7VEAIhCLgxcGyCoQ+wKabKAIDCAzNAkgFZ5/ApAFhA3E1QBsnF6rntaF0JxIFCCwgvJCRp
|
||||||
|
|
||||||
|
QY5YZE3/1gMBzpKIQYh5U3Y1wAmy8CmbAoiRWENQ9Ac0zwL0raiMhkeV5FaDQUXh12TReUEt0dQQ3n2GQZok41S2TQV65q2fQUpRX4YeI0ZcdnRkW5VxlqLdNbTbiAS0XAuArjwSnHbUPqPTfxl9NXDY055WnuQP5k2XQDADxI+gCaGm5ojdzUQAujfo2GNxjQgCLgpjeY2WN1jbY2PtcZlvxB5k/tXUS6OtQCDbMxaqM3wVHjc815wJwK+3vtn7
|
||||||
|
|
||||||
|
aKX7qlya2a4GhbCwJgtMUmQwkUfEFYp2OgAoTLdKjOTxAB1oMdLTYtodYjV3BaGajXYNc7dhnp+C8djX4ZD5bUXpV67dS2VelGVQm/hDOntl1IyyApiGKxaThp9e1wth7TgvXiOCHmAZRXVCFUFSGXuiUGP9EN1VHtDboA8qoQA1QXQKzihwZISZ1mdFnd3Vc+DLq9hMuA9eQ7g5fAZs3cpBZSJ78pxtSm1ptGbcYHZtubfm2FtxbVoL1oygf7pE
|
||||||
|
|
||||||
|
ANndgRb1rKvc171DRkTkPaUsIhA7AcAO0CaAkgDHaW1TYbt7Z5PDFfApWI1LG6vRjWaR2C0XCvkJV8tbG6kvAj2LWq+QIpA8qpNtxu8knhp5VO34taNVx0/+5pYU3ztVpTUX41dRRCmkNm7ZtleacKa4y4gPYpcxNNSnThqGYgFRAomO8yAzE3t7MQJn3tAraSQ61d0OrgGdUeWSkMBnMGMCSAX8U1L0B6AKoEIAZ3Rd0AJwOcs28+vHjRGRGwQH
|
||||||
|
|
||||||
|
qBU0eZR52TIYYFAmT10suF0ShnZDd13dWNHc345CXeq5PNh9YMh6gqTEmA3gUsIuD1wmmcAVbJ0xtG71i7/D9oUMSyE7U9wd+gLnG4LAnW6bgt7tW03qV8HepzwFtpcEoNI2Qn54tDwd11YZvXcS34N3HdUW32gnU+UbxInZAGUZXAM6XAuLKL1aOEm8FeLteTbm02Xseqn3LW8vLeMWE+2nc3Y611yKbhuNBWVIXIR2ulF1ZAoPa5wzNiunr1QA
|
||||||
|
|
||||||
|
BvdMLpldIU91qFg9WrDvdn3VylQ5asJHCo9onvNyA9a9Z2TWd+ved1g9okfF2cqrZUbXlAoteLWS10tWyCy18tYrXK1fzdbXzGEpYEGIBpwCpyRN9TachkM26qC4yJXWWvB1dSnAqWyGAMAEGeODDGh5kgQQf9Dzd7vOk2jiHXUz3TxnHaz2zZ7Pf12c9g3dz3DdQnc+UFBhidvGUZa/ju2V5jLdTVyYXov9oomxsme2EaBuOJRzyfGZt13tMEY1
|
||||||
|
|
||||||
|
V1pQrb5ARlOIVr0IVhJrsVTAjCj1WVYWPc7mRQNHMX08Kpfb/xuOlfeOmTpc1c8X6ttsctXrVq1TPnrVxrVaIllh1cdWnV51ZdX0A11fBC3V91UL2OtaYM4B7Yd0NY7dtNiS44CV9ioyWIlwbc6Av5m0c/3RtmjbyW/56HbyJjAcAH8DGgxED0CbAOYMoCeBDpurrxArRTl1BA3mmEDv11wLegvoLDMQwUg9QZE2XcKtvrZWQjSMQbgYsIDvBOp+
|
||||||
|
|
||||||
|
mIHVakiQMlx7IdSpyjEyzHRO24tjBpg0ztLPTNm7WLfUClFNBGUN02llLWmE99FTX33F+qPZnVD9W7F+UlRfleszteOpTL2h0eIBvLeQHwIr2V1aLjp2+Qu8HsGHdJAYm1/tBjc4BGNJjWY0WNVjTY2x9m/kiGHoeltkVY4kvW9EG4ytrNY9i31kc7ttC0jwwbGiIE8A+e24MoYP+QYWGknlCuZ13M9jfYoPe2AGklVLt/HeS3LZmgwbmNFqdS/Z
|
||||||
|
|
||||||
|
QBvWpQ05OBVTQ1V+xOEep9J7XsImWD57fmTnAdSvYNadO3SmbCtbg1v05WnVXsXdVmtbK0vgU1N8DBFu4WkOommOChXTVmtU1TFJerYtUP9hraiU8c6JRIDJtqbem2ZtgXXm03gBbUW0ltBJf7HsVRaVrjOD8yJ4FUlZ+QGINxMbovhV65LCYqRiQbYaJwmobZXm0Vs2Ac0WtJzda22tFzQ62tJtw2AOlCLfnh7zhXLXYSwDTjqy0y50xMewRxvw
|
||||||
|
|
||||||
|
/f34ArJcgNbpqA5tU8lqlXyUJtLhWMD1AV2MRCSA8QD7mcgRgCyaLgpAM0DEQIwFqBiWb2tQOEAcgE9U9wpqsSUKchLFXrZ9kAOKTsDW8MSA22BtgbS3o01gWrkgx7HqpCDJXCIObgOzHNSoydkfT14FtMq7bnlxRYUNkFmNSS3+2qgwJ2d9vPVS0vlNLVAF06aLGUH5VnReqTW85hNNKcCNfOe1f1j2EbEDD/TXdnp07oktJHGow2h0w9LPmyAw
|
||||||
|
|
||||||
|
AAxvgCpM+gM4DEQQwMJjJ69QE5LxIPAPQAkxr9Q653R1uf6lsogQejB7A1FO8Cdt58OrbHsfeCA1mQDfuww/aPwL3CMdWeDwwtitkBSB2QQ8HXqyJIddIOsdwUex2R1Y5glUlDWNclXlDuNWlVWjWg1Cm2jlGVdEPWf4WYl7tTLeCBKIkGM3GsZvAMimejm3F9GogCyH6P3tkxU+1jeMNrZIWZw/EMGemHQX3xrkIwHACkAygPEBJglYLgCYAYwF
|
||||||
|
|
||||||
|
xY3EfwOaFCAIDDAEaN9jd+18N6AFhCbASYAUhuszQKa4wAxEMJhDkAwHADxIzxIFmaNSxXBHpcgNGNShjhtZ41I2Z4yAwXjuHfu5fApyJ6E4s5wmshRDRzvWLhxqzvZDi99kc2NhQFJduCXJiOkNlSDuQ1FVnl3yfINGjQ4xwaYxZQ+aMVDq7baV89No6J3F+4hg6OsFIvWfoogvSeF4bjved0OtuBZPQ3bMB40v3BlzdnXw9ekIW+Yyxz2eORXg
|
||||||
|
|
||||||
|
YFgBZkhpkxRYWFyzSoVUR2Nq91D1bnUL6j1nnUxHFlEgIuCRj0Y7GPxjiY8mOpj6Y5mN8OEXZ2SWT4Fqj3b1TZToEc2jzYm34AFAHlTJtYwKhBQAzgPoBdA2EN05CAxoH2WScOXQY5BSNVGjiom1kQpwbMAiuImjRpql+lKTOfR+iom/CQ011jrkQVEP+QNK8CRuD6M8IdjuRRFWcT6DbIPTtho7k09dzfQU0qDA3bFEd9Gg2U0ExH4ZU0TdUJo0
|
||||||
|
|
||||||
|
Nl21DdN3DahzqfAkla3Br0VV57W3raxbXht03x1aRzXXjATf8KSmo/hrr1ADiIdCATN41LB3jD40+Mvjb4x+Nfj7QD+N/jdjXMnq12UaFkSA7QBoDKAi4MoANwzgLgDPjV9coBYQqTPsBCAwmHlOQdatdB0JmsHSHkhlWxhSDtZWE+SMaVEgFdOkAN038CUD1CYE1rq9kHwrhSSIP/KdjZXT3DbcwNQQzk448EXWqll6ne61YSnP1kB1LXdX1tdG
|
||||||
|
|
||||||
|
TXX2DTXXXxMY1w46aM5uIk4+W0F4k9oO1D6amW6bmg/f+FV+apJ5C1TC3RNpk9y3cwx+VzjlpM1pQw8bw+O/JKKPwORk+M0KFfIL9nWA/2e3WdkegG9m2zuObSG91jnf3XUR9/Byk4qLk9s1ed+hXpkJTjmYuDJTqU+lOZTqTNlO5TaCdbM45dEZFNYJ0U7r6xTLhVhAXAaipWBjAiEDAAwAUsJWBsgqTM0AnAiEDeDxAtQPBCZO+U+W2PpGwOcl
|
||||||
|
|
||||||
|
WpWwS46GEf5ZE1lYboWP0hVKfZuHORpyEX1diIpA0IQ1JZlwrfALjpcmCIHE+115D9fehkjTTfUoPjTmuZNPFNRDaU0kN5TfLOMFI5R/YLjlNfmFP58AZhrHGquIw2Y+6s8V0Gzp0x7leJXuYMiVgQgF0CIQ8QKdWiY903yogTYEzRAJwkEzwDQTsEzADwTiE9mk/TX+a/OSmQM34Cgz4M5DMnNMM3DMIzSM3mEgLMHUbNU9x6P8DsZdVohFhjxO
|
||||||
|
|
||||||
|
bfP3zj88/OETzkGwyBijyW+liUCIRsyIgBXZe1XwtlUehup5YvUINCDgQmR8zx5ZPNcT+Qw32zzRQ3PomjHPT/4WjM02vNzT62QtOk12XcrNPWaGt9G+eJICiaM1Xo1SL5C24BfPK9KCxRTvDyJpr2R52vV+YQAgUBUZxz9sx6iGLMqMYsPdqhas029OZZykhy33Zqy8pkAK70SAacxnNZzOc3nMFzRcyXNlzFc3xEc+Fi+D3iOAfSnP4z6AOAsg
|
||||||
|
|
||||||
|
zYM/XAQzUM5oCwL8M4jNBDu3uKgwZMnXcki0Fg2KMPAj3u5ARQ7DJPbqk9iZuH/QvDKTgCQ3wLuootrydF4G4t8MHHWQbSrDF9THCwNP6jPE8NNR1c88UMCTvHaOPCT44xS2zT6ab33G5X4SrX0ti45lEW55lpXpEia3DrxdeVYg3xsTR04GXbdAY+dqYwIwzouSFYw81Fx5CSQcU79JHKUtNKA4OCE52/Fb1W1LLOg0uRQ8INq00kmwwtXMl5SY
|
||||||
|
|
||||||
|
/1GtaJZ8WuL6cz0CZz2c7nP5zhc8XOlz5c5XMwjreXCN6YToV6lOh58C8NetdFFHRgujA1YqBtuI84prVny/sPfL+1UHNJTKU2lMZTWEFlM5TeoAguMusI+AO3+3UcdgUssA4e7FmM/cTLG8cAziPbDeI3k5slkbRyVoD9jRgPYLD2reP3jj48+Ovj7410Cfj347+PJLiwaWw/UyXEPAXio6RsxzhdQpcLUcvQpkObhlyMNGWKnBZFB8QvOQ/61C
|
||||||
|
|
||||||
|
PeS3pBUe/r1M19gUZwvTzHHTwvGj4swIsrKQi8Q1le682Q1VerKGblGDy48GDtuo1ifEGEii8KiIdnSVktgVdVZw3aTKvblmXJvkCK0b9ui/stIVkw0cv79sw7qu7w+q8lZvURBpnnt5ZfOatxeotE8sbDura8tlJSA7sNVJXyya0RjUY84AxjcYwmNJjQgCmO1AaYxmM3DTrdao80o6VfB+OiI7APorHK5isv92K9koHDeK4lMhzhK+HMkrkc2S
|
||||||
|
|
||||||
|
sUrjnbcNOOHAkfELGtbKlKetZinYSvAaQ/ULq4WGtA2DJfwyyVcrBIwpUxkSlbMkkj2SvG3wKibe/PgTX81BMwTcEwhNITb2ipW7eb/OZDsMwMDrx5k8i5E33KHUyYQR0avMgX80zwAqtSJawYlJEgKkzA0PIfENE0ujNuH1mdZrXTkOtLk7XasDj6bvk38LrfYItSzPPTLPWjcs56uZhdhD6vfyfq29DeEhlvJ0TaEa1P30gx8GDrRuai7gGbLg
|
||||||
|
|
||||||
|
rdssJruM21XbFkrYcvStxyxMNTAcG5PaXCdy8hvA0YAOhu1YmG2oY9eBSYSQ39EilsNvL1a28WyVb/XRUskXk02s+Tra/5OdrgUz2ugD5DFrjq49lfXwz9vNNSUBiduAIoQCavC8Psrby+OuLRNFU7EQAbi38seLgK94sgrfi+CtCaVK33E9TXhEbwJSsA7djPoDhFApHs5yaOu+bl6/GKbVRI+yW/TARYLhqVeM0H3L04WZFnRZsWT0DxZiWcln
|
||||||
|
|
||||||
|
GgqWe/ZvS8ybt7LIWyE2K1shvBBnUUlM1FCYm84ZcCsDJS2A3CkkMdQzUiENW4T/aAiLuq7wN4l2OoN/UwRvCzBQw6v8TuGXx0DLK7dLNrt3fdOOSTNsMcAMb0mExvFmRzspzvW2q6pMQEX0a637B5df9YOD1USGVh5HQ49nRJmxRK2J5u/asPoz0m6cvDbILalrjbeIrxXa2QDQeyVi3kGWuzVOm5Wtl5Hy2aLP9/m1MuOx06xAAMVq+Sjkb5aO
|
||||||
|
|
||||||
|
Rjk75IA6jh7+AQWryHrf/HANetPDHbZGrifeY6ldBnEyVlJ+Izlv5beWzysFbW80VtkjT6y4WFMiEMaD7giEPaCELBWNZAkTTeOyhdJM9lY6e+gMVtx+Odtk8iReHORoZOhchp2ZsL47YtsyD7S3IOdLg42LO9LGiQtnLt1BdttiT1G3tsC9/rJ8BTdOUUDo4yYsJP0YelDJnY2KAkAzR8bn4igvNVb22M3vxVsxwABgCwEHCBAqANYDEAqAGYvi
|
||||||
|
|
||||||
|
GV3erCcAge1ADB7NMGHsR7IkcymW97sys2g5LnWy529Ps1s3QAv3by7/d/TO71ZyO5LHuqqCe6HsKgyexr7BLjhZD06eTFuADLQdCNaamg38QcLQAsUBkAllIGLcAMApnRQAum/YxER6gY++PurA6sCIBAISYPOSmggs1PMFAU+zRBHU85MPtK5OTeMLL7M+/ORSwo0wUTb7q++kDz7pGzqzT7R+/oAn7pLe8GH7M2POSoQUs7ft0V85IhBurZ+y
|
||||||
|
|
||||||
|
vt376QMo4ez2Nk/uz7X+z3UMuf+/OTuoGrDnv97yOB/vP7x+9ys7VsHMAfpA6hJyXEjv684vn7n+/oAJiYwFujFQk+8wCfxPID6awEyiMltBUhLOdnnYzUAQdGgtKNOD7Y7hOL0lhqUv3tGAv5guQZRDAAQAJwqONfCMkCB5kwyTaYNvOT7soCQC2TS+6IfEApoAgDKiCsB1IkAqTBdUIA6hLgDGuggvIfTtKkD+YKqcwMoCSgAABSxS1ALlFcoJ
|
||||||
|
|
||||||
|
h8YfkMAAJS6g0cMoBFgWoLocGHmAfTGMgzh+YenIVh3weQHQCFfsIAr+yRGVQ8BynzRwZYJ7B7DHOI2hqHakOJHYA3mvXtxgjaD3uKpoYBHD6RiqXwd2AWEKqrMAxoI2hwAih7tAqHkRxRp0ICwIQCMACpjyBciA7mEBUh/h2vQ7YkcPoDYHpSE9mbFs1e0ClH5R7+aSywyWVRKQmGeEATYvmB2BAAA=
|
||||||
|
```
|
||||||
|
%%
|
||||||
@@ -32,11 +32,14 @@
|
|||||||
8. Проверка с перезапуском клиента
|
8. Проверка с перезапуском клиента
|
||||||
|
|
||||||
Работа с версиями
|
Работа с версиями
|
||||||
1. QT клиент: Копирование версии
|
1. QT клиент GUI: Копирование версии
|
||||||
2. QT клиент: Копирование версии с указанием существующего имени -> ошибка
|
2. QT клиент GUI: Копирование версии с указанием существующего имени -> ошибка
|
||||||
3. QT клиент: Удаление версии
|
3. QT клиент GUI: Удаление версии
|
||||||
4. QT клиент: Удаление базовой версии -> ошибка
|
4. QT клиент GUI: Удаление базовой версии -> ошибка
|
||||||
5. QT клиент: Удаление версии которая выбрана -> ошибка
|
5. QT клиент GUI: Удаление версии которая выбрана -> ошибка
|
||||||
6. QT клиент: переключении версии
|
6. QT клиент GUI: переключении версии
|
||||||
7. Unity: отправка в базовую версию
|
7. Unity: отправка в базовую версию
|
||||||
8.
|
|
||||||
|
Сервер:
|
||||||
|
1. Выключение сервера -> рассылка все клиентам DISABLE. Клиенты должны отключится от сети
|
||||||
|
2.
|
||||||
1
DOCS/Андрей/.obsidian/app.json
vendored
Normal file
@@ -0,0 +1 @@
|
|||||||
|
{}
|
||||||
1
DOCS/Андрей/.obsidian/appearance.json
vendored
Normal file
@@ -0,0 +1 @@
|
|||||||
|
{}
|
||||||
33
DOCS/Андрей/.obsidian/core-plugins.json
vendored
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
{
|
||||||
|
"file-explorer": true,
|
||||||
|
"global-search": true,
|
||||||
|
"switcher": true,
|
||||||
|
"graph": true,
|
||||||
|
"backlink": true,
|
||||||
|
"canvas": true,
|
||||||
|
"outgoing-link": true,
|
||||||
|
"tag-pane": true,
|
||||||
|
"footnotes": false,
|
||||||
|
"properties": false,
|
||||||
|
"page-preview": true,
|
||||||
|
"daily-notes": true,
|
||||||
|
"templates": true,
|
||||||
|
"note-composer": true,
|
||||||
|
"command-palette": true,
|
||||||
|
"slash-command": false,
|
||||||
|
"editor-status": true,
|
||||||
|
"bookmarks": true,
|
||||||
|
"markdown-importer": false,
|
||||||
|
"zk-prefixer": false,
|
||||||
|
"random-note": false,
|
||||||
|
"outline": true,
|
||||||
|
"word-count": true,
|
||||||
|
"slides": false,
|
||||||
|
"audio-recorder": false,
|
||||||
|
"workspaces": false,
|
||||||
|
"file-recovery": true,
|
||||||
|
"publish": false,
|
||||||
|
"sync": true,
|
||||||
|
"bases": true,
|
||||||
|
"webviewer": false
|
||||||
|
}
|
||||||
167
DOCS/Андрей/.obsidian/workspace.json
vendored
Normal file
@@ -0,0 +1,167 @@
|
|||||||
|
{
|
||||||
|
"main": {
|
||||||
|
"id": "8d0c52b76b567b03",
|
||||||
|
"type": "split",
|
||||||
|
"children": [
|
||||||
|
{
|
||||||
|
"id": "94de23b03ba8feab",
|
||||||
|
"type": "tabs",
|
||||||
|
"children": [
|
||||||
|
{
|
||||||
|
"id": "a426c8e70b3b0594",
|
||||||
|
"type": "leaf",
|
||||||
|
"state": {
|
||||||
|
"type": "empty",
|
||||||
|
"state": {},
|
||||||
|
"icon": "lucide-file",
|
||||||
|
"title": "Новая вкладка"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"direction": "vertical"
|
||||||
|
},
|
||||||
|
"left": {
|
||||||
|
"id": "7ab439ef0cbf43ad",
|
||||||
|
"type": "split",
|
||||||
|
"children": [
|
||||||
|
{
|
||||||
|
"id": "87c7b6e79db73e25",
|
||||||
|
"type": "tabs",
|
||||||
|
"children": [
|
||||||
|
{
|
||||||
|
"id": "90cbfc4e2d07abe2",
|
||||||
|
"type": "leaf",
|
||||||
|
"state": {
|
||||||
|
"type": "file-explorer",
|
||||||
|
"state": {
|
||||||
|
"sortOrder": "alphabetical",
|
||||||
|
"autoReveal": false
|
||||||
|
},
|
||||||
|
"icon": "lucide-folder-closed",
|
||||||
|
"title": "Файловый менеджер"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "1cd85305f47515c6",
|
||||||
|
"type": "leaf",
|
||||||
|
"state": {
|
||||||
|
"type": "search",
|
||||||
|
"state": {
|
||||||
|
"query": "",
|
||||||
|
"matchingCase": false,
|
||||||
|
"explainSearch": false,
|
||||||
|
"collapseAll": false,
|
||||||
|
"extraContext": false,
|
||||||
|
"sortOrder": "alphabetical"
|
||||||
|
},
|
||||||
|
"icon": "lucide-search",
|
||||||
|
"title": "Поиск"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "5945ff7a53a2fcd5",
|
||||||
|
"type": "leaf",
|
||||||
|
"state": {
|
||||||
|
"type": "bookmarks",
|
||||||
|
"state": {},
|
||||||
|
"icon": "lucide-bookmark",
|
||||||
|
"title": "Закладки"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"direction": "horizontal",
|
||||||
|
"width": 300
|
||||||
|
},
|
||||||
|
"right": {
|
||||||
|
"id": "f29104e843747e16",
|
||||||
|
"type": "split",
|
||||||
|
"children": [
|
||||||
|
{
|
||||||
|
"id": "b3ff3a3e0d768afc",
|
||||||
|
"type": "tabs",
|
||||||
|
"children": [
|
||||||
|
{
|
||||||
|
"id": "ff893448d70eb626",
|
||||||
|
"type": "leaf",
|
||||||
|
"state": {
|
||||||
|
"type": "backlink",
|
||||||
|
"state": {
|
||||||
|
"collapseAll": false,
|
||||||
|
"extraContext": false,
|
||||||
|
"sortOrder": "alphabetical",
|
||||||
|
"showSearch": false,
|
||||||
|
"searchQuery": "",
|
||||||
|
"backlinkCollapsed": false,
|
||||||
|
"unlinkedCollapsed": true
|
||||||
|
},
|
||||||
|
"icon": "links-coming-in",
|
||||||
|
"title": "Обратные ссылки"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "2a427c576e6ea0ef",
|
||||||
|
"type": "leaf",
|
||||||
|
"state": {
|
||||||
|
"type": "outgoing-link",
|
||||||
|
"state": {
|
||||||
|
"linksCollapsed": false,
|
||||||
|
"unlinkedCollapsed": true
|
||||||
|
},
|
||||||
|
"icon": "links-going-out",
|
||||||
|
"title": "Исходящие ссылки"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "a753b701468fb8f1",
|
||||||
|
"type": "leaf",
|
||||||
|
"state": {
|
||||||
|
"type": "tag",
|
||||||
|
"state": {
|
||||||
|
"sortOrder": "frequency",
|
||||||
|
"useHierarchy": true,
|
||||||
|
"showSearch": false,
|
||||||
|
"searchQuery": ""
|
||||||
|
},
|
||||||
|
"icon": "lucide-tags",
|
||||||
|
"title": "Теги"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "ff03277f03b14f53",
|
||||||
|
"type": "leaf",
|
||||||
|
"state": {
|
||||||
|
"type": "outline",
|
||||||
|
"state": {
|
||||||
|
"followCursor": false,
|
||||||
|
"showSearch": false,
|
||||||
|
"searchQuery": ""
|
||||||
|
},
|
||||||
|
"icon": "lucide-list",
|
||||||
|
"title": "Структура"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"direction": "horizontal",
|
||||||
|
"width": 300,
|
||||||
|
"collapsed": true
|
||||||
|
},
|
||||||
|
"left-ribbon": {
|
||||||
|
"hiddenItems": {
|
||||||
|
"switcher:Меню быстрого перехода": false,
|
||||||
|
"graph:Граф": false,
|
||||||
|
"canvas:Создать новый холст": false,
|
||||||
|
"daily-notes:Сегодняшняя заметка": false,
|
||||||
|
"templates:Вставить шаблон": false,
|
||||||
|
"command-palette:Открыть палитру команд": false,
|
||||||
|
"bases:Создать новую базу": false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"active": "a426c8e70b3b0594",
|
||||||
|
"lastOpenFiles": []
|
||||||
|
}
|
||||||
@@ -4,20 +4,9 @@ kanban-plugin: board
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## bugs
|
## backlog
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## feature
|
|
||||||
|
|
||||||
- [ ] Сервер при сворачивании превращается в трей
|
|
||||||
- [ ] Вывод информации о таймингах обучаемого
|
|
||||||
- [ ] добавление окна чата инструктора (GUI)
|
|
||||||
- [ ] добавить таблицу users в БД
|
|
||||||
|
|
||||||
|
|
||||||
## now
|
|
||||||
|
|
||||||
|
- [ ] /RUS/Scens/tasksFIM.xml возможно изменится структура
|
||||||
|
|
||||||
|
|
||||||
## Complete
|
## Complete
|
||||||
@@ -31,17 +20,75 @@ kanban-plugin: board
|
|||||||
- [ ] Убрать ошибки QObject::moveToThread: Cannot move objects with a parent
|
- [ ] Убрать ошибки QObject::moveToThread: Cannot move objects with a parent
|
||||||
- [ ] /RRJ-95NEW-100/tasksAMM.xml заменить получение на docs
|
- [ ] /RRJ-95NEW-100/tasksAMM.xml заменить получение на docs
|
||||||
- [ ] отправка таски поштучно, при обновления статуса (проверка и тд)
|
- [ ] отправка таски поштучно, при обновления статуса (проверка и тд)
|
||||||
|
- [ ] Проверка валидности логина в двух местах. Только в эдиторе оставил
|
||||||
|
- [ ] DataBaseLMS::transactionBegin()
|
||||||
|
DataBaseLMS::transactionEnd()
|
||||||
|
Разобраться. Удалено
|
||||||
|
- [ ] Как работает Мьютекс в DataBaseLMS. Убрал его оттуда.
|
||||||
|
- [ ] добавить таблицу users в БД. Добавлено.
|
||||||
|
- [ ] Вывод информации о таймингах обучаемого
|
||||||
|
- [ ] добавление окна чата инструктора (GUI)
|
||||||
|
- [ ] Убрать автоподстановку логина и пароля Админа при Авторизации
|
||||||
|
- [ ] Добавить время сообщений
|
||||||
|
- [ ] Уточнить назначение аватарок для remote и local клиентов
|
||||||
|
- [ ] Убрать кнопку Справка (?) из диалогов
|
||||||
|
- [ ] Убрать "DM-код" для узлов PM (AMM)
|
||||||
|
- [ ] Уменьшить размер диалога "Проверка задачи" (AMM)
|
||||||
|
- [ ] Учет ширины скрола на деревьях (появляется если дерево больше окна)
|
||||||
|
|
||||||
|
|
||||||
## backlog
|
## feature
|
||||||
|
|
||||||
- [ ] /RUS/Scens/tasksFIM.xml возможно изменится структура
|
- [ ] Сервер при сворачивании превращается в трей
|
||||||
|
- [ ] Отходить от идентификации по Логину в пользу ID юзера везде, где это возможно.
|
||||||
|
(Так как сейчас может вызвать проблемы при смене логина юзера!!!)
|
||||||
|
|
||||||
|
|
||||||
|
## DataBaseLMS
|
||||||
|
|
||||||
|
- [ ] Оптимизировать
|
||||||
|
DataBaseLMS::deleteTrainee(int id_trainee)
|
||||||
|
- [ ] ProviderDBLMS::deAuthorizationAll()
|
||||||
|
|
||||||
|
|
||||||
|
## Messenger
|
||||||
|
|
||||||
|
- [ ] Не влазиют слишком большие сообщения
|
||||||
|
- [ ] Сделать отправку сообщения на Enter
|
||||||
|
|
||||||
|
|
||||||
|
## ConnectorToServer
|
||||||
|
|
||||||
|
- [ ] MutexAccess
|
||||||
|
- [ ] Запрос AMM и FIM xml продумать
|
||||||
|
|
||||||
|
|
||||||
|
## Интерфейс
|
||||||
|
|
||||||
|
- [ ] Унифицировать терминологию
|
||||||
|
|
||||||
|
|
||||||
|
## GUI общие
|
||||||
|
|
||||||
|
- [ ] Задержка после авторизации из-за запроса AMM, FIM
|
||||||
|
- [ ] При обновлении деревьев слетает назначенная колонка сортировки
|
||||||
|
- [ ] Введение логина только латиницей
|
||||||
|
- [ ] Блокировка авторизации не работает при входе в редакторы И/О
|
||||||
|
- [ ] Добавить текущий статус задачи в "Проверке задачи" (AMM, FIM)
|
||||||
|
- [ ] Универсальный пересчет ширин колонок деревьев
|
||||||
|
|
||||||
|
|
||||||
|
## Замечания Кирилл
|
||||||
|
|
||||||
|
- [ ] Создание БД из кода (если нет или слетела)
|
||||||
|
- [ ] Кнопка открытия Персональной карты обучаемого
|
||||||
|
- [ ] Смена пароля админом. Старый никому не виден (парольная политика)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
%% kanban:settings
|
%% kanban:settings
|
||||||
```
|
```
|
||||||
{"kanban-plugin":"board","list-collapse":[false,false,false,false,false]}
|
{"kanban-plugin":"board","list-collapse":[false,false,false,false,false,false,false,false,false]}
|
||||||
```
|
```
|
||||||
%%
|
%%
|
||||||
@@ -1 +0,0 @@
|
|||||||
МАКСИМ ЧИТЕР
|
|
||||||
16
DOCS/Андрей/Термины UI.md
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
|
||||||
|
| ENG | RUS |
|
||||||
|
| -------------------------------- | --- |
|
||||||
|
| Learning management system (LMS) | |
|
||||||
|
| Instructor | |
|
||||||
|
| | |
|
||||||
|
| authorization | |
|
||||||
|
| deauthorization | |
|
||||||
|
| | |
|
||||||
|
| | |
|
||||||
|
| | |
|
||||||
|
| | |
|
||||||
|
| | |
|
||||||
|
| | |
|
||||||
|
| | |
|
||||||
|
| | |
|
||||||
1
DOCS/ВАЖНО!!!!.md
Normal file
@@ -0,0 +1 @@
|
|||||||
|
Длина отправки тестового сообщения 4к знаков
|
||||||
@@ -1,36 +0,0 @@
|
|||||||
```
|
|
||||||
void SendSystem::sendMessageBlock(QString message)
|
|
||||||
{
|
|
||||||
QDataStream stream(socket);
|
|
||||||
stream.setVersion(QDataStream::Qt_DefaultCompiledVersion);
|
|
||||||
QByteArray result = sendMessage(message);
|
|
||||||
stream << PacketType::TYPE_XMLANSWER;
|
|
||||||
stream << sendMessage(message);
|
|
||||||
socket->waitForBytesWritten();
|
|
||||||
socket->flush();
|
|
||||||
}
|
|
||||||
|
|
||||||
или файлом
|
|
||||||
|
|
||||||
void ServerLMSWidget::sendQDataStream(QTcpSocket *socket,QByteArray data)
|
|
||||||
{
|
|
||||||
QDataStream stream(socket);
|
|
||||||
stream.setVersion(QDataStream::Qt_DefaultCompiledVersion);
|
|
||||||
stream << PacketType::TYPE_XMLANSWER;
|
|
||||||
stream << data;
|
|
||||||
socket->waitForBytesWritten();
|
|
||||||
socket->flush();
|
|
||||||
}
|
|
||||||
|
|
||||||
```
|
|
||||||
|
|
||||||
Типы сообщений QT->Unity:
|
|
||||||
TYPE_XMLANSWER
|
|
||||||
Остальные QT->QT
|
|
||||||
|
|
||||||
Сообщение порядок приема данных QDataStream:
|
|
||||||
1. размер сообщения(отсылается неявно)
|
|
||||||
2. само сообщение в бинарном формате(в нашем случае XML)
|
|
||||||
|
|
||||||
UNITY: при переходе на новую систему общения пакетами нужно:
|
|
||||||
отправлять пакет о типе XML ответа при каждой отправке
|
|
||||||
@@ -1,8 +1,13 @@
|
|||||||
|
|
||||||
Сервер -> Принимаем
|
ServerLMS
|
||||||
- XML файлы с поиском по тегу (DataParser::xmlParser)
|
|
||||||
|
**ServerLMSWidget** - entry point, кнопки на первичном окне, обновление списка клиентов, хранит общий Mutex
|
||||||
|
**ProviderDBLMS** - связь с БД
|
||||||
|
**MultiThreadServer** - управление клиентами (подключение, удаление)
|
||||||
|
|
||||||
|
|
||||||
Участники
|
Участники
|
||||||
RecognizeSystem - система распознавания типа пакета, экземпляр у каждого клиента
|
RecognizeSystem - система распознавания типа пакета, экземпляр у каждого клиента
|
||||||
ProcessingSystem - система активации процессов (создает результат после распознания действия) 1 штука на всех
|
ProcessingSystem - система активации процессов (создает результат после распознания действия) 1 штука на всех
|
||||||
|
|
||||||
|
|
||||||
75
DOCS/Отправка.md
Normal file
@@ -0,0 +1,75 @@
|
|||||||
|
Отправка сообщений QT сервер:
|
||||||
|
Отправка маленьких XML пакетов без информации о размере. TYPE_XMLANSWER
|
||||||
|
|
||||||
|
```
|
||||||
|
void SendSystem::sendXmlAnswer(QByteArray array, PacketType packetType)
|
||||||
|
{
|
||||||
|
qDebug() << "SendSystemThread: " << QThread::currentThreadId();
|
||||||
|
Logger::instance().log("C: " + client->getLogin() + " send pack " + enumToString(packetType) +
|
||||||
|
" " + QString::fromUtf8(array),LogLevel::DEBUG);
|
||||||
|
if (client->getClientType() == TypeClientAutorization::TYPE_QT_CLIENT ||
|
||||||
|
client->getClientType() == TypeClientAutorization::TYPE_GUI)
|
||||||
|
|
||||||
|
{
|
||||||
|
// для QT
|
||||||
|
QDataStream stream(socket);
|
||||||
|
stream.setVersion(QDataStream::Qt_DefaultCompiledVersion);
|
||||||
|
stream << packetType;
|
||||||
|
stream << array;
|
||||||
|
socket->waitForBytesWritten();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{ // для Unity
|
||||||
|
sendPacketType(packetType);
|
||||||
|
QByteArray message;
|
||||||
|
int size = array.length();
|
||||||
|
message.append(reinterpret_cast<char*>(&size), sizeof(int));
|
||||||
|
socket->write(message);
|
||||||
|
socket->write(array);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
Отправка пакета без вложения:
|
||||||
|
`void SendSystem::sendPacketType(PacketType packetType){
|
||||||
|
if (client->getClientType() == TypeClientAutorization::TYPE_QT_CLIENT ||
|
||||||
|
client->getClientType() == TypeClientAutorization::TYPE_GUI)
|
||||||
|
{
|
||||||
|
//Для QT
|
||||||
|
QDataStream stream(socket);
|
||||||
|
stream.setVersion(QDataStream::Qt_DefaultCompiledVersion);
|
||||||
|
stream << packetType;
|
||||||
|
socket->waitForReadyRead(100);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
//для Unity
|
||||||
|
QByteArray message;
|
||||||
|
int type = (int)packetType;
|
||||||
|
message.append(reinterpret_cast<char*>(&type), sizeof(int));
|
||||||
|
socket->write(message);
|
||||||
|
}
|
||||||
|
}`
|
||||||
|
Не подходит для последнего сообщения (например при отключении клиента)
|
||||||
|
|
||||||
|
Отправка сервисного сообщения (тип ServerNotify)
|
||||||
|
`void SendSystem::sendNotify(QString notify)
|
||||||
|
{
|
||||||
|
qDebug() << "SendNotify thread: " << QThread::currentThreadId();
|
||||||
|
auto answer = emit sigSendNotify(notify);
|
||||||
|
sendXmlAnswer(answer);
|
||||||
|
}`
|
||||||
|
|
||||||
|
|
||||||
|
Типы сообщений QT->Unity:
|
||||||
|
TYPE_XMLANSWER
|
||||||
|
Остальные QT->QT
|
||||||
|
|
||||||
|
Сообщение порядок приема данных QDataStream:
|
||||||
|
1. размер сообщения(отсылается неявно)
|
||||||
|
2. само сообщение в бинарном формате(в нашем случае XML)
|
||||||
|
|
||||||
|
UNITY: при переходе на новую систему общения пакетами нужно:
|
||||||
|
отправлять пакет о типе XML ответа при каждой отправке
|
||||||
|
|
||||||
@@ -5,6 +5,11 @@ common_info_for_project(DataBaseLMS)
|
|||||||
add_library(DataBaseLMS SHARED
|
add_library(DataBaseLMS SHARED
|
||||||
DataBaseLMS_global.h
|
DataBaseLMS_global.h
|
||||||
databaselms.cpp
|
databaselms.cpp
|
||||||
|
databaselms_tasks.cpp
|
||||||
|
databaselms_groups.cpp
|
||||||
|
databaselms_users.cpp
|
||||||
|
databaselms_instructors.cpp
|
||||||
|
databaselms_trainees.cpp
|
||||||
databaselms.h
|
databaselms.h
|
||||||
interfacedatabaselms.cpp
|
interfacedatabaselms.cpp
|
||||||
interfacedatabaselms.h
|
interfacedatabaselms.h
|
||||||
@@ -28,6 +33,7 @@ add_library(DataBaseLMS SHARED
|
|||||||
timingoftrainee.cpp
|
timingoftrainee.cpp
|
||||||
timingoftrainee.h
|
timingoftrainee.h
|
||||||
contactModel.h
|
contactModel.h
|
||||||
|
resources.qrc
|
||||||
)
|
)
|
||||||
|
|
||||||
target_link_libraries(DataBaseLMS PRIVATE Qt5::Widgets)
|
target_link_libraries(DataBaseLMS PRIVATE Qt5::Widgets)
|
||||||
|
|||||||
@@ -3,6 +3,8 @@
|
|||||||
|
|
||||||
#include <QSqlDatabase>
|
#include <QSqlDatabase>
|
||||||
#include <QMutex>
|
#include <QMutex>
|
||||||
|
#include <QWidget>
|
||||||
|
#include <QTranslator>
|
||||||
|
|
||||||
#include "instructor.h"
|
#include "instructor.h"
|
||||||
#include "trainee.h"
|
#include "trainee.h"
|
||||||
@@ -13,59 +15,78 @@
|
|||||||
class DataBaseSettings
|
class DataBaseSettings
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
QString dbName = "DataBaseLMS";
|
QString dbName = "";
|
||||||
QString dbType = "QPSQL";
|
QString dbType = "";
|
||||||
QString connectionName = "Connection";
|
QString connectionName = "";
|
||||||
QString dbUserName = "postgres";
|
QString dbUserName = "";
|
||||||
QString dbPassword = "12345678";
|
QString dbPassword = "";
|
||||||
QString dbHostName = "";
|
QString dbHostName = "";
|
||||||
int dbPort = 5432;
|
int dbPort = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
class DataBaseLMS
|
class DataBaseLMS : public QObject
|
||||||
{
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
public:
|
public:
|
||||||
DataBaseLMS();
|
DataBaseLMS(QWidget *ownerWidget, QObject *parent = nullptr);
|
||||||
~DataBaseLMS();
|
~DataBaseLMS();
|
||||||
|
|
||||||
|
public Q_SLOTS:
|
||||||
|
void slot_LanguageChanged(QString language);
|
||||||
|
|
||||||
|
public:
|
||||||
|
static const QString TypeUserDBInstructor;
|
||||||
|
static const QString TypeUserDBTrainee;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
//Подключение
|
//Подключение
|
||||||
bool createConnection();
|
bool createConnection();
|
||||||
void deleteConnection();
|
void deleteConnection();
|
||||||
bool isConnected();
|
bool isConnected();
|
||||||
|
|
||||||
//Транзакции
|
//Юзер
|
||||||
bool transactionBegin();
|
int selectUserID(QString type, QString login, QString password = QStringLiteral(""));
|
||||||
bool transactionEnd();
|
QString selectUserNameByLogin(QString type, QString login);
|
||||||
|
bool selectUserLoggedIn(QString type, int id_user);
|
||||||
//Списки
|
bool selectUserArchived(QString type, int id_user);
|
||||||
QList<Instructor> selectAllInstructors();
|
int updateUserLoggedIn(QString type, int id_user, bool loggedIn);
|
||||||
QList<Trainee> selectAllTrainees();
|
bool updateAllUsersLoggedIn(QString type, bool loggedIn);
|
||||||
QList<Group> selectAllGroups();
|
int updateUserArchived(QString type, int id_user, bool archived);
|
||||||
|
|
||||||
//Инструктор
|
//Инструктор
|
||||||
|
QList<Instructor> selectAllInstructors();
|
||||||
Instructor selectInstructor(int id_instructor);
|
Instructor selectInstructor(int id_instructor);
|
||||||
int selectInstructorID(QString login, QString password = QStringLiteral(""));
|
|
||||||
QString selectInstructorNameByLogin(QString login);
|
|
||||||
bool selectInstructorIsAdmin(int id_instructor);
|
bool selectInstructorIsAdmin(int id_instructor);
|
||||||
bool selectInstructorLoggedIn(int id_instructor);
|
|
||||||
bool selectInstructorArchived(int id_instructor);
|
|
||||||
int updateInstructorLoggedIn(int id_instructor, bool loggedIn);
|
|
||||||
bool updateAllInstructorsLoggedIn(bool loggedIn);
|
|
||||||
int updateInstructorArchived(int id_instructor, bool archived);
|
|
||||||
|
|
||||||
int insertInstructor();
|
int insertInstructor();
|
||||||
int insertInstructor(Instructor instructor);
|
int insertInstructor(Instructor instructor);
|
||||||
int deleteInstructor(int id_instructor);
|
int deleteInstructor(int id_instructor);
|
||||||
int updateInstructor(Instructor instructor);
|
int updateInstructor(Instructor instructor);
|
||||||
|
|
||||||
//Группа
|
//Группа
|
||||||
|
QList<Group> selectAllGroups();
|
||||||
Group selectGroup(int id_group);
|
Group selectGroup(int id_group);
|
||||||
int insertGroup();
|
int insertGroup();
|
||||||
int insertGroup(Group group);
|
int insertGroup(Group group);
|
||||||
int deleteGroup(int id_group);
|
int deleteGroup(int id_group);
|
||||||
int updateGroup(Group group);
|
int updateGroup(Group group);
|
||||||
|
|
||||||
|
//Обучаемый
|
||||||
|
QList<Trainee> selectAllTrainees();
|
||||||
|
Trainee selectTrainee(int id_trainee);
|
||||||
|
QList<Trainee> selectAllTraineesInGroup(int id_group);
|
||||||
|
QString selectTraineeNameOnComputer(QString computer_name);
|
||||||
|
Trainee selectTraineeOnComputer(QString computer_name);
|
||||||
|
int insertTrainee(int id_group);
|
||||||
|
int insertTrainee(Trainee trainee);
|
||||||
|
int deleteTrainee(int id_trainee);
|
||||||
|
int updateTrainee(Trainee trainee);
|
||||||
|
|
||||||
|
//Тайминг
|
||||||
|
int insertTimingTrainee(int id_trainee);
|
||||||
|
int updateTimingTrainee(int id_trainee, TimingOfTrainee timing);
|
||||||
|
TimingOfTrainee selectTimingTrainee(int id_trainee);
|
||||||
|
|
||||||
//Задача AMM
|
//Задача AMM
|
||||||
int insertTaskAMM(TaskAmmFim task, int id_trainee);
|
int insertTaskAMM(TaskAmmFim task, int id_trainee);
|
||||||
int updateTaskAMM(TaskAmmFim task);
|
int updateTaskAMM(TaskAmmFim task);
|
||||||
@@ -80,32 +101,9 @@ protected:
|
|||||||
int deleteTaskFIM(int id_task);
|
int deleteTaskFIM(int id_task);
|
||||||
QList<TaskAmmFim> selectTasksFIMofTrainee(int id_trainee);
|
QList<TaskAmmFim> selectTasksFIMofTrainee(int id_trainee);
|
||||||
TaskAmmFim selectTaskFIMbyID(int id_task);
|
TaskAmmFim selectTaskFIMbyID(int id_task);
|
||||||
|
//int deleteReportFIMforTask(int task_id);
|
||||||
int deleteReportFIM(int task_id);
|
//int insertReportFIMforTask(TaskAmmFim task);
|
||||||
int insertReportFIM(TaskAmmFim task);
|
int updateReportFIMforTask(TaskAmmFim task);
|
||||||
|
|
||||||
//Обучаемый
|
|
||||||
Trainee selectTrainee(int id_trainee);
|
|
||||||
QList<Trainee> selectAllTraineesInGroup(int id_group);
|
|
||||||
int selectTraineeID(QString login, QString password = QStringLiteral(""));
|
|
||||||
QString selectTraineeNameByLogin(QString login);
|
|
||||||
QString selectTraineeNameOnComputer(QString computer_name);
|
|
||||||
Trainee selectTraineeOnComputer(QString computer_name);
|
|
||||||
bool selectTraineeArchived(int id_trainee);
|
|
||||||
bool selectTraineeLoggedIn(int id_trainee);
|
|
||||||
int updateTraineeLoggedIn(int id_trainee, bool loggedIn);
|
|
||||||
bool updateAllTraineesLoggedIn(bool loggedIn);
|
|
||||||
int updateTraineeArchived(int id_trainee, bool archived);
|
|
||||||
|
|
||||||
int insertTrainee(int id_group);
|
|
||||||
int insertTrainee(Trainee trainee);
|
|
||||||
int deleteTrainee(int id_trainee);
|
|
||||||
int updateTrainee(Trainee trainee);
|
|
||||||
|
|
||||||
//Тайминг
|
|
||||||
int insertTimingTrainee(int id_trainee);
|
|
||||||
int updateTimingTrainee(int id_trainee, TimingOfTrainee timing);
|
|
||||||
TimingOfTrainee selectTimingTrainee(int id_trainee);
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
DataBaseSettings getDataBaseSettings();
|
DataBaseSettings getDataBaseSettings();
|
||||||
@@ -118,10 +116,10 @@ private:
|
|||||||
protected:
|
protected:
|
||||||
QSqlDatabase* db;
|
QSqlDatabase* db;
|
||||||
DataBaseSettings dbSettings;
|
DataBaseSettings dbSettings;
|
||||||
|
QTranslator qtLanguageTranslator;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
bool transactionBegined;
|
QWidget* ownerWidget;
|
||||||
QMutex mtxAccess;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // DATABASELMS_H
|
#endif // DATABASELMS_H
|
||||||
|
|||||||
95
DataBaseLMS/databaselms_groups.cpp
Normal file
@@ -0,0 +1,95 @@
|
|||||||
|
#include "databaselms.h"
|
||||||
|
|
||||||
|
#include <QtSql>
|
||||||
|
#include <QSqlDatabase>
|
||||||
|
#include <QSqlDriver>
|
||||||
|
#include <QMessageBox>
|
||||||
|
|
||||||
|
|
||||||
|
QList<Group> DataBaseLMS::selectAllGroups()
|
||||||
|
{
|
||||||
|
QList<Group> listGroups;
|
||||||
|
|
||||||
|
QString queryStr = QString("SELECT group_id, name "
|
||||||
|
"FROM public.groups "
|
||||||
|
"ORDER BY group_id ASC");
|
||||||
|
|
||||||
|
QSqlQuery query = QSqlQuery(*db);
|
||||||
|
|
||||||
|
if(queryExec(queryStr, &query))
|
||||||
|
{
|
||||||
|
while (query.next())
|
||||||
|
{//Группа
|
||||||
|
Group group;
|
||||||
|
group.setID(query.value(0).toInt());
|
||||||
|
group.setName(query.value(1).toString());
|
||||||
|
|
||||||
|
listGroups.append(group);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return listGroups;
|
||||||
|
}
|
||||||
|
|
||||||
|
Group DataBaseLMS::selectGroup(int id_group)
|
||||||
|
{
|
||||||
|
Group group;
|
||||||
|
|
||||||
|
QString queryStr = QString("SELECT group_id, name "
|
||||||
|
"FROM public.groups "
|
||||||
|
"WHERE groups.group_id = %1 ").arg(
|
||||||
|
id_group);
|
||||||
|
|
||||||
|
QSqlQuery query = QSqlQuery(*db);
|
||||||
|
|
||||||
|
if(queryExec(queryStr, &query))
|
||||||
|
{
|
||||||
|
if (query.first())
|
||||||
|
{//Инструктор
|
||||||
|
group.setID(query.value(0).toInt());
|
||||||
|
group.setName(query.value(1).toString());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return group;
|
||||||
|
}
|
||||||
|
|
||||||
|
int DataBaseLMS::insertGroup()
|
||||||
|
{
|
||||||
|
QString queryStr = QString("INSERT INTO public.groups "
|
||||||
|
"DEFAULT VALUES "
|
||||||
|
"RETURNING group_id");
|
||||||
|
|
||||||
|
return queryExecInt(queryStr);
|
||||||
|
}
|
||||||
|
|
||||||
|
int DataBaseLMS::insertGroup(Group group)
|
||||||
|
{
|
||||||
|
QString queryStr = QString("INSERT INTO public.groups (name) "
|
||||||
|
"VALUES ('%1') "
|
||||||
|
"RETURNING groups.group_id").arg(
|
||||||
|
group.getName());
|
||||||
|
|
||||||
|
return queryExecInt(queryStr);
|
||||||
|
}
|
||||||
|
|
||||||
|
int DataBaseLMS::deleteGroup(int id_group)
|
||||||
|
{
|
||||||
|
QString queryStr = QString("DELETE FROM public.groups "
|
||||||
|
"WHERE group_id = %1 "
|
||||||
|
"RETURNING groups.group_id").arg(
|
||||||
|
QString::number(id_group));
|
||||||
|
|
||||||
|
return queryExecInt(queryStr);
|
||||||
|
}
|
||||||
|
|
||||||
|
int DataBaseLMS::updateGroup(Group group)
|
||||||
|
{
|
||||||
|
QString queryStr = QString("UPDATE public.groups SET name = '%1' "
|
||||||
|
"WHERE group_id = %2 "
|
||||||
|
"RETURNING groups.group_id").arg(
|
||||||
|
group.getName(),
|
||||||
|
QString::number(group.getID()) );
|
||||||
|
|
||||||
|
return queryExecInt(queryStr);
|
||||||
|
}
|
||||||
134
DataBaseLMS/databaselms_instructors.cpp
Normal file
@@ -0,0 +1,134 @@
|
|||||||
|
#include "databaselms.h"
|
||||||
|
|
||||||
|
#include <QtSql>
|
||||||
|
#include <QSqlDatabase>
|
||||||
|
#include <QSqlDriver>
|
||||||
|
#include <QMessageBox>
|
||||||
|
|
||||||
|
|
||||||
|
QList<Instructor> DataBaseLMS::selectAllInstructors()
|
||||||
|
{
|
||||||
|
QList<Instructor> listInstructors;
|
||||||
|
|
||||||
|
QString queryStr = QString("SELECT user_id, name, login, password, is_admin, archived, logged_in "
|
||||||
|
"FROM public.users "
|
||||||
|
"WHERE users.type = '%1' "
|
||||||
|
"ORDER BY user_id ASC").arg(
|
||||||
|
TypeUserDBInstructor);
|
||||||
|
|
||||||
|
QSqlQuery query = QSqlQuery(*db);
|
||||||
|
|
||||||
|
if(queryExec(queryStr, &query))
|
||||||
|
{
|
||||||
|
while (query.next())
|
||||||
|
{//Инструктор
|
||||||
|
Instructor instructor;
|
||||||
|
instructor.setID(query.value(0).toInt());
|
||||||
|
instructor.setName(query.value(1).toString());
|
||||||
|
instructor.setLogin(query.value(2).toString());
|
||||||
|
instructor.setPassword(query.value(3).toString());
|
||||||
|
instructor.setIsAdmin(query.value(4).toBool());
|
||||||
|
instructor.setArchived(query.value(5).toBool());
|
||||||
|
instructor.setLoggedIn(query.value(6).toBool());
|
||||||
|
|
||||||
|
listInstructors.append(instructor);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return listInstructors;
|
||||||
|
}
|
||||||
|
|
||||||
|
Instructor DataBaseLMS::selectInstructor(int id_instructor)
|
||||||
|
{
|
||||||
|
Instructor instructor;
|
||||||
|
|
||||||
|
QString queryStr = QString("SELECT user_id, name, login, password, is_admin, archived, logged_in "
|
||||||
|
"FROM public.users "
|
||||||
|
"WHERE users.user_id = %1 AND users.type = '%2' ").arg(
|
||||||
|
QString::number(id_instructor),
|
||||||
|
TypeUserDBInstructor);
|
||||||
|
|
||||||
|
QSqlQuery query = QSqlQuery(*db);
|
||||||
|
|
||||||
|
if(queryExec(queryStr, &query))
|
||||||
|
{
|
||||||
|
if (query.first())
|
||||||
|
{//Инструктор
|
||||||
|
instructor.setID(query.value(0).toInt());
|
||||||
|
instructor.setName(query.value(1).toString());
|
||||||
|
instructor.setLogin(query.value(2).toString());
|
||||||
|
instructor.setPassword(query.value(3).toString());
|
||||||
|
instructor.setIsAdmin(query.value(4).toBool());
|
||||||
|
instructor.setArchived(query.value(5).toBool());
|
||||||
|
instructor.setLoggedIn(query.value(6).toBool());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return instructor;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool DataBaseLMS::selectInstructorIsAdmin(int id_instructor)
|
||||||
|
{
|
||||||
|
QString queryStr = QString("SELECT users.is_admin "
|
||||||
|
"FROM public.users "
|
||||||
|
"WHERE user_id = %1 AND users.type = '%2' ").arg(
|
||||||
|
QString::number(id_instructor),
|
||||||
|
TypeUserDBInstructor );
|
||||||
|
|
||||||
|
return queryExecBool(queryStr);
|
||||||
|
}
|
||||||
|
|
||||||
|
int DataBaseLMS::insertInstructor()
|
||||||
|
{
|
||||||
|
QString queryStr = QString("INSERT INTO public.users (type, name, login, password, is_admin, archived, logged_in)"
|
||||||
|
"VALUES ('%1', DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT)"
|
||||||
|
"RETURNING user_id").arg(
|
||||||
|
TypeUserDBInstructor);
|
||||||
|
|
||||||
|
return queryExecInt(queryStr);
|
||||||
|
}
|
||||||
|
|
||||||
|
int DataBaseLMS::insertInstructor(Instructor instructor)
|
||||||
|
{
|
||||||
|
QString queryStr = QString("INSERT INTO public.users (type, name, login, password, is_admin, archived, logged_in) "
|
||||||
|
"VALUES ('%1', '%2', '%3', '%4', %5, %6, %7) "
|
||||||
|
"RETURNING user_id").arg(
|
||||||
|
TypeUserDBInstructor,
|
||||||
|
instructor.getName(),
|
||||||
|
instructor.getLogin(),
|
||||||
|
instructor.getPassword(),
|
||||||
|
instructor.getIsAdmin() ? "true" : "false",
|
||||||
|
instructor.getArchived() ? "true" : "false",
|
||||||
|
instructor.getLoggedIn() ? "true" : "false");
|
||||||
|
|
||||||
|
return queryExecInt(queryStr);
|
||||||
|
}
|
||||||
|
|
||||||
|
int DataBaseLMS::deleteInstructor(int id_instructor)
|
||||||
|
{
|
||||||
|
QString queryStr = QString("DELETE FROM public.users "
|
||||||
|
"WHERE user_id = %1 AND users.type = '%2' "
|
||||||
|
"RETURNING users.user_id").arg(
|
||||||
|
QString::number(id_instructor),
|
||||||
|
TypeUserDBInstructor);
|
||||||
|
|
||||||
|
return queryExecInt(queryStr);
|
||||||
|
}
|
||||||
|
|
||||||
|
int DataBaseLMS::updateInstructor(Instructor instructor)
|
||||||
|
{
|
||||||
|
QString queryStr = QString("UPDATE public.users "
|
||||||
|
"SET name = '%1', login = '%2', password = '%3', is_admin = %4, archived = %5, logged_in = %6 "
|
||||||
|
"WHERE user_id = %7 AND users.type = '%8' "
|
||||||
|
"RETURNING users.user_id").arg(
|
||||||
|
instructor.getName(),
|
||||||
|
instructor.getLogin(),
|
||||||
|
instructor.getPassword(),
|
||||||
|
instructor.getIsAdmin() ? "true" : "false",
|
||||||
|
instructor.getArchived() ? "true" : "false",
|
||||||
|
instructor.getLoggedIn() ? "true" : "false",
|
||||||
|
QString::number(instructor.getID()),
|
||||||
|
TypeUserDBInstructor);
|
||||||
|
|
||||||
|
return queryExecInt(queryStr);
|
||||||
|
}
|
||||||
847
DataBaseLMS/databaselms_tasks.cpp
Normal file
@@ -0,0 +1,847 @@
|
|||||||
|
#include "databaselms.h"
|
||||||
|
|
||||||
|
#include <QtSql>
|
||||||
|
#include <QSqlDatabase>
|
||||||
|
#include <QSqlDriver>
|
||||||
|
#include <QMessageBox>
|
||||||
|
|
||||||
|
int DataBaseLMS::insertTaskAMM(TaskAmmFim task, int id_trainee)
|
||||||
|
{
|
||||||
|
task.ammProcedure.title = task.ammProcedure.title.replace("'", "''"); //Задваиваем одинарные кавычки
|
||||||
|
|
||||||
|
QString queryStr = QString("INSERT INTO public.tasks_amm (title, dm_code, fk_trainee_id) "
|
||||||
|
"VALUES ('%1', '%2', %3) "
|
||||||
|
"RETURNING tasks_amm.task_id").arg(
|
||||||
|
task.ammProcedure.title,
|
||||||
|
task.ammProcedure.dmCode,
|
||||||
|
QString::number(id_trainee));
|
||||||
|
|
||||||
|
return queryExecInt(queryStr);
|
||||||
|
}
|
||||||
|
|
||||||
|
int DataBaseLMS::updateTaskAMM(TaskAmmFim task)
|
||||||
|
{
|
||||||
|
task.ammProcedure.title = task.ammProcedure.title.replace("'", "''"); //Задваиваем одинарные кавычки
|
||||||
|
|
||||||
|
QString queryStr = QString("UPDATE public.tasks_amm SET title = '%1', dm_code = '%2', status = '%3' "
|
||||||
|
"WHERE task_id = %4 "
|
||||||
|
"RETURNING tasks_amm.task_id").arg(
|
||||||
|
task.ammProcedure.title,
|
||||||
|
task.ammProcedure.dmCode,
|
||||||
|
task.status,
|
||||||
|
QString::number(task.getID()) );
|
||||||
|
|
||||||
|
return queryExecInt(queryStr);
|
||||||
|
}
|
||||||
|
|
||||||
|
int DataBaseLMS::updateStatusTaskAMM(int task_id, QString status)
|
||||||
|
{
|
||||||
|
QString queryStr;
|
||||||
|
bool resBool = false;
|
||||||
|
int id_trainee = 0;
|
||||||
|
|
||||||
|
resBool = db->transaction();
|
||||||
|
|
||||||
|
queryStr = QString("SELECT users.user_id "
|
||||||
|
"FROM public.users JOIN public.tasks_amm ON users.user_id = tasks_amm.fk_trainee_id "
|
||||||
|
"WHERE tasks_amm.task_id = %1 "
|
||||||
|
"ORDER BY users.user_id ASC").arg(
|
||||||
|
QString::number(task_id));
|
||||||
|
|
||||||
|
QSqlQuery query = QSqlQuery(*db);
|
||||||
|
|
||||||
|
if(queryExec(queryStr, &query))
|
||||||
|
{
|
||||||
|
if (query.first())
|
||||||
|
{//Обучаемый
|
||||||
|
id_trainee = query.value(0).toInt();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(!id_trainee)
|
||||||
|
{
|
||||||
|
resBool = db->rollback();
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
queryStr = QString("UPDATE public.tasks_amm SET status = '%1' "
|
||||||
|
"WHERE task_id = %2 "
|
||||||
|
"RETURNING tasks_amm.task_id").arg(
|
||||||
|
status,
|
||||||
|
QString::number(task_id) );
|
||||||
|
|
||||||
|
|
||||||
|
if(!queryExecInt(queryStr))
|
||||||
|
{
|
||||||
|
resBool = db->rollback();
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
resBool = db->commit();
|
||||||
|
return id_trainee;
|
||||||
|
}
|
||||||
|
|
||||||
|
int DataBaseLMS::deleteTaskAMM(int id_task)
|
||||||
|
{
|
||||||
|
QString queryStr;
|
||||||
|
bool resBool = false;
|
||||||
|
int id_trainee = 0;
|
||||||
|
|
||||||
|
resBool = db->transaction();
|
||||||
|
|
||||||
|
queryStr = QString("SELECT users.user_id "
|
||||||
|
"FROM public.users JOIN public.tasks_amm ON users.user_id = tasks_amm.fk_trainee_id "
|
||||||
|
"WHERE tasks_amm.task_id = %1 "
|
||||||
|
"ORDER BY users.user_id ASC").arg(
|
||||||
|
QString::number(id_task));
|
||||||
|
|
||||||
|
QSqlQuery query = QSqlQuery(*db);
|
||||||
|
|
||||||
|
if(queryExec(queryStr, &query))
|
||||||
|
{
|
||||||
|
if (query.first())
|
||||||
|
{//Обучаемый
|
||||||
|
id_trainee = query.value(0).toInt();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(!id_trainee)
|
||||||
|
{
|
||||||
|
resBool = db->rollback();
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
queryStr = QString("DELETE FROM public.tasks_amm "
|
||||||
|
"WHERE task_id = %1 "
|
||||||
|
"RETURNING tasks_amm.task_id").arg(
|
||||||
|
QString::number(id_task));
|
||||||
|
|
||||||
|
if(!queryExecInt(queryStr))
|
||||||
|
{
|
||||||
|
resBool = db->rollback();
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
resBool = db->commit();
|
||||||
|
return id_trainee;
|
||||||
|
}
|
||||||
|
|
||||||
|
QList<TaskAmmFim> DataBaseLMS::selectTasksAMMofTrainee(int id_trainee)
|
||||||
|
{
|
||||||
|
QList<TaskAmmFim> listTasks;
|
||||||
|
|
||||||
|
QString queryStr = QString("SELECT tasks_amm.task_id, tasks_amm.title, tasks_amm.dm_code, tasks_amm.status, "
|
||||||
|
"users.user_id "
|
||||||
|
"FROM public.tasks_amm JOIN public.users ON users.user_id = tasks_amm.fk_trainee_id "
|
||||||
|
"WHERE tasks_amm.fk_trainee_id = %1 "
|
||||||
|
"ORDER BY tasks_amm.task_id ASC").arg(
|
||||||
|
id_trainee);
|
||||||
|
|
||||||
|
QSqlQuery query = QSqlQuery(*db);
|
||||||
|
|
||||||
|
if(queryExec(queryStr, &query))
|
||||||
|
{
|
||||||
|
while (query.next())
|
||||||
|
{//Задача
|
||||||
|
TaskAmmFim task;
|
||||||
|
|
||||||
|
task.setID(query.value(0).toInt());
|
||||||
|
task.ammProcedure.title = query.value(1).toString();
|
||||||
|
task.ammProcedure.dmCode = query.value(2).toString();
|
||||||
|
task.status = query.value(3).toString();
|
||||||
|
|
||||||
|
listTasks.append(task);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return listTasks;
|
||||||
|
}
|
||||||
|
|
||||||
|
TaskAmmFim DataBaseLMS::selectTaskAMMbyID(int id_task)
|
||||||
|
{
|
||||||
|
TaskAmmFim task;
|
||||||
|
|
||||||
|
QString queryStr = QString("SELECT tasks_amm.task_id, tasks_amm.title, tasks_amm.dm_code, tasks_amm.status "
|
||||||
|
"FROM public.tasks_amm "
|
||||||
|
"WHERE tasks_amm.task_id = %1 "
|
||||||
|
"ORDER BY tasks_amm.task_id ASC").arg(
|
||||||
|
id_task);
|
||||||
|
|
||||||
|
QSqlQuery query = QSqlQuery(*db);
|
||||||
|
|
||||||
|
if(queryExec(queryStr, &query))
|
||||||
|
{
|
||||||
|
if (query.first())
|
||||||
|
{//Задача
|
||||||
|
task.setID(query.value(0).toInt());
|
||||||
|
task.ammProcedure.title = query.value(1).toString();
|
||||||
|
task.ammProcedure.dmCode = query.value(2).toString();
|
||||||
|
task.status = query.value(3).toString();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return task;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int DataBaseLMS::insertTaskFIM(TaskAmmFim task, int id_trainee)
|
||||||
|
{
|
||||||
|
QString queryStr;
|
||||||
|
bool resBool = false;
|
||||||
|
|
||||||
|
resBool = db->transaction();
|
||||||
|
|
||||||
|
task.title = task.title.replace("'", "''"); //Задваиваем одинарные кавычки
|
||||||
|
|
||||||
|
queryStr = QString("INSERT INTO public.tasks_fim (title, fk_trainee_id) "
|
||||||
|
"VALUES ('%1', %2) "
|
||||||
|
"RETURNING tasks_fim.task_id").arg(
|
||||||
|
task.title,
|
||||||
|
QString::number(id_trainee));
|
||||||
|
|
||||||
|
int task_id = queryExecInt(queryStr);
|
||||||
|
if(!task_id)
|
||||||
|
{
|
||||||
|
resBool = db->rollback();
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
for(Malfunction malfanction : task.malfunctionList)
|
||||||
|
{
|
||||||
|
malfanction.description = malfanction.description.replace("'", "''"); //Задваиваем одинарные кавычки
|
||||||
|
|
||||||
|
queryStr = QString("INSERT INTO public.malfunctions (num, dm_code, description, fk_task_fim_id) "
|
||||||
|
"VALUES ('%1', '%2', '%3', %4) "
|
||||||
|
"RETURNING malfunctions.malfunction_id").arg(
|
||||||
|
malfanction.num,
|
||||||
|
malfanction.dmCode,
|
||||||
|
malfanction.description,
|
||||||
|
QString::number(task_id));
|
||||||
|
|
||||||
|
int malfunction_id = queryExecInt(queryStr);
|
||||||
|
if(!malfunction_id)
|
||||||
|
{
|
||||||
|
resBool = db->rollback();
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
//Sign
|
||||||
|
for(MalfunctionSign sign : malfanction.malfunctionSigns)
|
||||||
|
{
|
||||||
|
sign.description = sign.description.replace("'", "''"); //Задваиваем одинарные кавычки
|
||||||
|
|
||||||
|
queryStr = QString("INSERT INTO public.malf_signs (type, description, fk_malfunction_id) "
|
||||||
|
"VALUES ('%1', '%2', %3) "
|
||||||
|
"RETURNING malf_signs.sign_id").arg(
|
||||||
|
QString::number(sign.type),
|
||||||
|
sign.description,
|
||||||
|
QString::number(malfunction_id));
|
||||||
|
|
||||||
|
if(!queryExecInt(queryStr))
|
||||||
|
{
|
||||||
|
resBool = db->rollback();
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
resBool = db->commit();
|
||||||
|
return task_id;
|
||||||
|
}
|
||||||
|
|
||||||
|
int DataBaseLMS::updateTaskFIM(TaskAmmFim task)
|
||||||
|
{
|
||||||
|
task.title = task.title.replace("'", "''"); //Задваиваем одинарные кавычки
|
||||||
|
|
||||||
|
QString queryStr = QString("UPDATE public.tasks_fim SET title = '%1', status = '%2' "
|
||||||
|
"WHERE task_id = %3 "
|
||||||
|
"RETURNING tasks_fim.task_id").arg(
|
||||||
|
task.title,
|
||||||
|
task.status,
|
||||||
|
QString::number(task.getID()) );
|
||||||
|
|
||||||
|
return queryExecInt(queryStr);
|
||||||
|
}
|
||||||
|
|
||||||
|
int DataBaseLMS::updateStatusTaskFIM(int task_id, QString status)
|
||||||
|
{
|
||||||
|
QString queryStr;
|
||||||
|
bool resBool = false;
|
||||||
|
int id_trainee = 0;
|
||||||
|
|
||||||
|
resBool = db->transaction();
|
||||||
|
|
||||||
|
queryStr = QString("SELECT users.user_id "
|
||||||
|
"FROM public.users JOIN public.tasks_fim ON users.user_id = tasks_fim.fk_trainee_id "
|
||||||
|
"WHERE tasks_fim.task_id = %1 "
|
||||||
|
"ORDER BY users.user_id ASC").arg(
|
||||||
|
QString::number(task_id));
|
||||||
|
|
||||||
|
QSqlQuery query = QSqlQuery(*db);
|
||||||
|
|
||||||
|
if(queryExec(queryStr, &query))
|
||||||
|
{
|
||||||
|
if (query.first())
|
||||||
|
{//Обучаемый
|
||||||
|
id_trainee = query.value(0).toInt();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(!id_trainee)
|
||||||
|
{
|
||||||
|
resBool = db->rollback();
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
queryStr = QString("UPDATE public.tasks_fim SET status = '%1' "
|
||||||
|
"WHERE task_id = %2 "
|
||||||
|
"RETURNING tasks_fim.task_id").arg(
|
||||||
|
status,
|
||||||
|
QString::number(task_id) );
|
||||||
|
|
||||||
|
QSqlQuery query1 = QSqlQuery(*db);
|
||||||
|
if(!queryExec(queryStr, &query1))
|
||||||
|
{
|
||||||
|
resBool = db->rollback();
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
resBool = db->commit();
|
||||||
|
return id_trainee;
|
||||||
|
}
|
||||||
|
|
||||||
|
int DataBaseLMS::deleteTaskFIM(int id_task)
|
||||||
|
{
|
||||||
|
QString queryStr;
|
||||||
|
bool resBool = false;
|
||||||
|
int id_trainee = 0;
|
||||||
|
|
||||||
|
resBool = db->transaction();
|
||||||
|
|
||||||
|
queryStr = QString("SELECT users.user_id "
|
||||||
|
"FROM public.users JOIN public.tasks_fim ON users.user_id = tasks_fim.fk_trainee_id "
|
||||||
|
"WHERE tasks_fim.task_id = %1 "
|
||||||
|
"ORDER BY users.user_id ASC").arg(
|
||||||
|
QString::number(id_task));
|
||||||
|
|
||||||
|
QSqlQuery queryUserSEL = QSqlQuery(*db);
|
||||||
|
|
||||||
|
if(queryExec(queryStr, &queryUserSEL))
|
||||||
|
{
|
||||||
|
if (queryUserSEL.first())
|
||||||
|
{//Обучаемый
|
||||||
|
id_trainee = queryUserSEL.value(0).toInt();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(!id_trainee)
|
||||||
|
{
|
||||||
|
resBool = db->rollback();
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
//Выгребаем все malfunction для этой задачи
|
||||||
|
queryStr = QString("SELECT malfunctions.malfunction_id "
|
||||||
|
"FROM public.malfunctions JOIN public.tasks_fim ON tasks_fim.task_id = malfunctions.fk_task_fim_id "
|
||||||
|
"WHERE malfunctions.fk_task_fim_id = %1 "
|
||||||
|
"ORDER BY malfunctions.malfunction_id ASC").arg(
|
||||||
|
id_task);
|
||||||
|
QSqlQuery queryMalfSEL = QSqlQuery(*db);
|
||||||
|
|
||||||
|
if(queryExec(queryStr, &queryMalfSEL))
|
||||||
|
{
|
||||||
|
while (queryMalfSEL.next())
|
||||||
|
{//Неисправность
|
||||||
|
int malfunction_id = 0;
|
||||||
|
|
||||||
|
malfunction_id = queryMalfSEL.value(0).toString().toInt();
|
||||||
|
|
||||||
|
if(malfunction_id)
|
||||||
|
{
|
||||||
|
queryStr = QString("DELETE FROM public.malf_signs "
|
||||||
|
"WHERE fk_malfunction_id = %1 ").arg(
|
||||||
|
malfunction_id);
|
||||||
|
|
||||||
|
QSqlQuery querySignDEL = QSqlQuery(*db);
|
||||||
|
if(!queryExec(queryStr, &querySignDEL))
|
||||||
|
{
|
||||||
|
resBool = db->rollback();
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
resBool = db->rollback();
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
queryStr = QString("DELETE FROM public.malfunctions "
|
||||||
|
"WHERE fk_task_fim_id = %1 ").arg(
|
||||||
|
QString::number(id_task));
|
||||||
|
|
||||||
|
QSqlQuery queryMulfDEL = QSqlQuery(*db);
|
||||||
|
if(!queryExec(queryStr, &queryMulfDEL))
|
||||||
|
{
|
||||||
|
resBool = db->rollback();
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
queryStr = QString("SELECT reports.report_id "
|
||||||
|
"FROM public.reports "
|
||||||
|
"WHERE fk_task_fim_id = %1 "
|
||||||
|
"ORDER BY reports.report_id ASC").arg(
|
||||||
|
QString::number(id_task));
|
||||||
|
|
||||||
|
int report_id = 0;
|
||||||
|
|
||||||
|
QSqlQuery queryReportsSEL = QSqlQuery(*db);
|
||||||
|
if(queryExec(queryStr, &queryReportsSEL))
|
||||||
|
{
|
||||||
|
if (queryReportsSEL.first())
|
||||||
|
{//Отчет
|
||||||
|
report_id = queryReportsSEL.value(0).toInt();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
resBool = db->rollback();
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
queryStr = QString("DELETE FROM public.report_items "
|
||||||
|
"WHERE fk_report_id = %1 ").arg(
|
||||||
|
QString::number(report_id));
|
||||||
|
|
||||||
|
QSqlQuery queryItemsDEL = QSqlQuery(*db);
|
||||||
|
if(!queryExec(queryStr, &queryItemsDEL))
|
||||||
|
{
|
||||||
|
resBool = db->rollback();
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
queryStr = QString("DELETE FROM public.reports "
|
||||||
|
"WHERE report_id = %1 ").arg(
|
||||||
|
QString::number(report_id));
|
||||||
|
|
||||||
|
QSqlQuery queryReportsDEL = QSqlQuery(*db);
|
||||||
|
if(!queryExec(queryStr, &queryReportsDEL))
|
||||||
|
{
|
||||||
|
resBool = db->rollback();
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
queryStr = QString("DELETE FROM public.tasks_fim "
|
||||||
|
"WHERE task_id = %1 "
|
||||||
|
"RETURNING tasks_fim.task_id").arg(
|
||||||
|
QString::number(id_task));
|
||||||
|
|
||||||
|
if(!queryExecInt(queryStr))
|
||||||
|
{
|
||||||
|
resBool = db->rollback();
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
resBool = db->commit();
|
||||||
|
return id_trainee;
|
||||||
|
}
|
||||||
|
|
||||||
|
QList<TaskAmmFim> DataBaseLMS::selectTasksFIMofTrainee(int id_trainee)
|
||||||
|
{
|
||||||
|
QList<TaskAmmFim> listTasks;
|
||||||
|
QString queryStr;
|
||||||
|
bool resBool = false;
|
||||||
|
|
||||||
|
resBool = db->transaction();
|
||||||
|
|
||||||
|
queryStr = QString("SELECT tasks_fim.task_id, tasks_fim.title, tasks_fim.status, "
|
||||||
|
"users.user_id "
|
||||||
|
"FROM public.tasks_fim JOIN public.users ON users.user_id = tasks_fim.fk_trainee_id "
|
||||||
|
"WHERE tasks_fim.fk_trainee_id = %1 "
|
||||||
|
"ORDER BY tasks_fim.task_id ASC").arg(
|
||||||
|
id_trainee);
|
||||||
|
|
||||||
|
QSqlQuery query = QSqlQuery(*db);
|
||||||
|
|
||||||
|
if(queryExec(queryStr, &query))
|
||||||
|
{
|
||||||
|
while (query.next())
|
||||||
|
{//Задача
|
||||||
|
TaskAmmFim task;
|
||||||
|
|
||||||
|
task.setID(query.value(0).toInt());
|
||||||
|
task.title = query.value(1).toString();
|
||||||
|
task.status = query.value(2).toString();
|
||||||
|
|
||||||
|
//Выгребаем все malfunction для этой задачи
|
||||||
|
queryStr = QString("SELECT malfunctions.malfunction_id, malfunctions.num, malfunctions.dm_code, malfunctions.description, "
|
||||||
|
"tasks_fim.task_id "
|
||||||
|
"FROM public.malfunctions JOIN public.tasks_fim ON tasks_fim.task_id = malfunctions.fk_task_fim_id "
|
||||||
|
"WHERE malfunctions.fk_task_fim_id = %1 "
|
||||||
|
"ORDER BY malfunctions.num ASC").arg(
|
||||||
|
task.getID());
|
||||||
|
|
||||||
|
QSqlQuery queryMalf = QSqlQuery(*db);
|
||||||
|
|
||||||
|
if(queryExec(queryStr, &queryMalf))
|
||||||
|
{
|
||||||
|
while (queryMalf.next())
|
||||||
|
{//Неисправность
|
||||||
|
Malfunction malfanction;
|
||||||
|
int malfunction_id = 0;
|
||||||
|
|
||||||
|
malfunction_id = queryMalf.value(0).toString().toInt();
|
||||||
|
malfanction.num = queryMalf.value(1).toString();
|
||||||
|
malfanction.dmCode = queryMalf.value(2).toString();
|
||||||
|
malfanction.description = queryMalf.value(3).toString();
|
||||||
|
|
||||||
|
//Выгребаем сигналы для этой неисправности
|
||||||
|
queryStr = QString("SELECT malf_signs.sign_id, malf_signs.type, malf_signs.description "
|
||||||
|
"FROM public.malf_signs "
|
||||||
|
"WHERE fk_malfunction_id = %1 "
|
||||||
|
"ORDER BY malf_signs.sign_id ASC").arg(
|
||||||
|
QString::number(malfunction_id));
|
||||||
|
|
||||||
|
QSqlQuery querySign = QSqlQuery(*db);
|
||||||
|
if(queryExec(queryStr, &querySign))
|
||||||
|
{
|
||||||
|
while (querySign.next())
|
||||||
|
{//Сигналы
|
||||||
|
MalfunctionSign sign;
|
||||||
|
sign.type = querySign.value(1).toString().toInt();
|
||||||
|
sign.description = querySign.value(2).toString();
|
||||||
|
|
||||||
|
malfanction.malfunctionSigns.append(sign);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
task.addMalfunction(malfanction);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
resBool = db->rollback();
|
||||||
|
return QList<TaskAmmFim>();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//Выгребаем отчет для этой задачи
|
||||||
|
int report_id = 0;
|
||||||
|
queryStr = QString("SELECT reports.report_id "
|
||||||
|
"FROM public.reports "
|
||||||
|
"WHERE fk_task_fim_id = %1 "
|
||||||
|
"ORDER BY reports.report_id ASC").arg(
|
||||||
|
QString::number(task.getID()));
|
||||||
|
|
||||||
|
QSqlQuery queryReport = QSqlQuery(*db);
|
||||||
|
|
||||||
|
if(queryExec(queryStr, &queryReport))
|
||||||
|
{
|
||||||
|
if (queryReport.first())
|
||||||
|
{//Отчет
|
||||||
|
report_id = queryReport.value(0).toInt();
|
||||||
|
task.report.id = report_id;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
resBool = db->rollback();
|
||||||
|
return QList<TaskAmmFim>();
|
||||||
|
}
|
||||||
|
|
||||||
|
if(report_id)
|
||||||
|
{//Отчет есть
|
||||||
|
//Выгребаем все item отчета
|
||||||
|
|
||||||
|
queryStr = QString("SELECT report_items.item_id, report_items.text, report_items.doc, report_items.dm_code, report_items.title, report_items.result, report_items.fk_report_id, report_items.number "
|
||||||
|
"FROM public.report_items "
|
||||||
|
"WHERE fk_report_id = %1 "
|
||||||
|
"ORDER BY report_items.number ASC").arg(
|
||||||
|
QString::number(report_id));
|
||||||
|
|
||||||
|
QSqlQuery queryItems = QSqlQuery(*db);
|
||||||
|
|
||||||
|
if(queryExec(queryStr, &queryItems))
|
||||||
|
{
|
||||||
|
while (queryItems.next())
|
||||||
|
{//report_item
|
||||||
|
FIMReportItem reportItem;
|
||||||
|
reportItem.id = queryItems.value(0).toInt();
|
||||||
|
reportItem.text = queryItems.value(1).toString();
|
||||||
|
reportItem.procedure.doc = queryItems.value(2).toString();
|
||||||
|
reportItem.procedure.dmCode = queryItems.value(3).toString();
|
||||||
|
reportItem.procedure.title = queryItems.value(4).toString();
|
||||||
|
reportItem.procedure.result = queryItems.value(5).toString();
|
||||||
|
//item_report
|
||||||
|
//number
|
||||||
|
|
||||||
|
task.report.itemList.append(reportItem);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
resBool = db->rollback();
|
||||||
|
return QList<TaskAmmFim>();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
listTasks.append(task);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
resBool = db->rollback();
|
||||||
|
return QList<TaskAmmFim>();
|
||||||
|
}
|
||||||
|
|
||||||
|
resBool = db->commit();
|
||||||
|
return listTasks;
|
||||||
|
}
|
||||||
|
|
||||||
|
TaskAmmFim DataBaseLMS::selectTaskFIMbyID(int id_task)
|
||||||
|
{
|
||||||
|
TaskAmmFim task;
|
||||||
|
|
||||||
|
QString queryStr;
|
||||||
|
bool resBool = false;
|
||||||
|
|
||||||
|
resBool = db->transaction();
|
||||||
|
|
||||||
|
queryStr = QString("SELECT tasks_fim.task_id, tasks_fim.title, tasks_fim.status "
|
||||||
|
"FROM public.tasks_fim "
|
||||||
|
"WHERE tasks_fim.task_id = %1 "
|
||||||
|
"ORDER BY tasks_fim.task_id ASC").arg(
|
||||||
|
id_task);
|
||||||
|
|
||||||
|
QSqlQuery query = QSqlQuery(*db);
|
||||||
|
|
||||||
|
if(queryExec(queryStr, &query))
|
||||||
|
{
|
||||||
|
if(query.first())
|
||||||
|
{//Задача
|
||||||
|
|
||||||
|
task.setID(query.value(0).toInt());
|
||||||
|
task.title = query.value(1).toString();
|
||||||
|
task.status = query.value(2).toString();
|
||||||
|
|
||||||
|
//Выгребаем все malfunction для этой задачи
|
||||||
|
queryStr = QString("SELECT malfunctions.malfunction_id, malfunctions.num, malfunctions.dm_code, malfunctions.description, "
|
||||||
|
"tasks_fim.task_id "
|
||||||
|
"FROM public.malfunctions JOIN public.tasks_fim ON tasks_fim.task_id = malfunctions.fk_task_fim_id "
|
||||||
|
"WHERE malfunctions.fk_task_fim_id = %1 "
|
||||||
|
"ORDER BY malfunctions.num ASC").arg(
|
||||||
|
task.getID());
|
||||||
|
|
||||||
|
QSqlQuery queryMalf = QSqlQuery(*db);
|
||||||
|
|
||||||
|
if(queryExec(queryStr, &queryMalf))
|
||||||
|
{
|
||||||
|
while (queryMalf.next())
|
||||||
|
{//Неисправность
|
||||||
|
Malfunction malfanction;
|
||||||
|
int malfunction_id = 0;
|
||||||
|
|
||||||
|
malfunction_id = queryMalf.value(0).toString().toInt();
|
||||||
|
malfanction.num = queryMalf.value(1).toString();
|
||||||
|
malfanction.dmCode = queryMalf.value(2).toString();
|
||||||
|
malfanction.description = queryMalf.value(3).toString();
|
||||||
|
|
||||||
|
//Выгребаем сигналы для этой неисправности
|
||||||
|
queryStr = QString("SELECT malf_signs.sign_id, malf_signs.type, malf_signs.description "
|
||||||
|
"FROM public.malf_signs "
|
||||||
|
"WHERE fk_malfunction_id = %1 "
|
||||||
|
"ORDER BY malf_signs.sign_id ASC").arg(
|
||||||
|
QString::number(malfunction_id));
|
||||||
|
|
||||||
|
QSqlQuery querySign = QSqlQuery(*db);
|
||||||
|
if(queryExec(queryStr, &querySign))
|
||||||
|
{
|
||||||
|
while (querySign.next())
|
||||||
|
{//Сигналы
|
||||||
|
MalfunctionSign sign;
|
||||||
|
sign.type = querySign.value(1).toString().toInt();
|
||||||
|
sign.description = querySign.value(2).toString();
|
||||||
|
|
||||||
|
malfanction.malfunctionSigns.append(sign);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
task.addMalfunction(malfanction);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
resBool = db->rollback();
|
||||||
|
return task;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//Выгребаем отчет для этой задачи
|
||||||
|
int report_id = 0;
|
||||||
|
queryStr = QString("SELECT reports.report_id "
|
||||||
|
"FROM public.reports "
|
||||||
|
"WHERE fk_task_fim_id = %1 "
|
||||||
|
"ORDER BY reports.report_id ASC").arg(
|
||||||
|
QString::number(task.getID()));
|
||||||
|
|
||||||
|
QSqlQuery queryReport = QSqlQuery(*db);
|
||||||
|
|
||||||
|
if(queryExec(queryStr, &queryReport))
|
||||||
|
{
|
||||||
|
if (queryReport.first())
|
||||||
|
{//Отчет
|
||||||
|
report_id = queryReport.value(0).toInt();
|
||||||
|
task.report.id = report_id;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
resBool = db->rollback();
|
||||||
|
return task;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(report_id)
|
||||||
|
{//Отчет есть
|
||||||
|
//Выгребаем все item отчета
|
||||||
|
|
||||||
|
queryStr = QString("SELECT report_items.item_id, report_items.text, report_items.doc, report_items.dm_code, report_items.title, report_items.result, report_items.fk_report_id, report_items.number "
|
||||||
|
"FROM public.report_items "
|
||||||
|
"WHERE fk_report_id = %1 "
|
||||||
|
"ORDER BY report_items.number ASC").arg(
|
||||||
|
QString::number(report_id));
|
||||||
|
|
||||||
|
QSqlQuery queryItems = QSqlQuery(*db);
|
||||||
|
|
||||||
|
if(queryExec(queryStr, &queryItems))
|
||||||
|
{
|
||||||
|
while (queryItems.next())
|
||||||
|
{//report_item
|
||||||
|
FIMReportItem reportItem;
|
||||||
|
reportItem.id = queryItems.value(0).toInt();
|
||||||
|
reportItem.text = queryItems.value(1).toString();
|
||||||
|
reportItem.procedure.doc = queryItems.value(2).toString();
|
||||||
|
reportItem.procedure.dmCode = queryItems.value(3).toString();
|
||||||
|
reportItem.procedure.title = queryItems.value(4).toString();
|
||||||
|
reportItem.procedure.result = queryItems.value(5).toString();
|
||||||
|
//item_report
|
||||||
|
//number
|
||||||
|
|
||||||
|
task.report.itemList.append(reportItem);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
resBool = db->rollback();
|
||||||
|
return task;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
resBool = db->rollback();
|
||||||
|
return task;
|
||||||
|
}
|
||||||
|
|
||||||
|
resBool = db->commit();
|
||||||
|
return task;
|
||||||
|
}
|
||||||
|
|
||||||
|
int DataBaseLMS::updateReportFIMforTask(TaskAmmFim task)
|
||||||
|
{
|
||||||
|
QString queryStr;
|
||||||
|
bool resBool = false;
|
||||||
|
int report_id = 0;
|
||||||
|
int task_id = task.getID();
|
||||||
|
|
||||||
|
resBool = db->transaction();
|
||||||
|
|
||||||
|
queryStr = QString("SELECT reports.report_id "
|
||||||
|
"FROM public.reports "
|
||||||
|
"WHERE fk_task_fim_id = %1 "
|
||||||
|
"ORDER BY reports.report_id ASC").arg(
|
||||||
|
QString::number(task_id));
|
||||||
|
|
||||||
|
QSqlQuery queryReportsSEL = QSqlQuery(*db);
|
||||||
|
|
||||||
|
if(queryExec(queryStr, &queryReportsSEL))
|
||||||
|
{
|
||||||
|
if (queryReportsSEL.first())
|
||||||
|
{//Отчет
|
||||||
|
report_id = queryReportsSEL.value(0).toInt();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
resBool = db->rollback();
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!report_id)
|
||||||
|
{
|
||||||
|
queryStr = QString("INSERT INTO public.reports (fk_task_fim_id) "
|
||||||
|
"VALUES (%1) "
|
||||||
|
"RETURNING reports.report_id").arg(
|
||||||
|
task.getID());
|
||||||
|
|
||||||
|
report_id = queryExecInt(queryStr);
|
||||||
|
if(!report_id)
|
||||||
|
{
|
||||||
|
resBool = db->rollback();
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
queryStr = QString("DELETE FROM public.report_items "
|
||||||
|
"WHERE fk_report_id = %1 ").arg(
|
||||||
|
QString::number(report_id));
|
||||||
|
|
||||||
|
QSqlQuery queryItemsDEL = QSqlQuery(*db);
|
||||||
|
if(!queryExec(queryStr, &queryItemsDEL))
|
||||||
|
{
|
||||||
|
resBool = db->rollback();
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int number = 0;
|
||||||
|
for(FIMReportItem reportItem : task.report.itemList)
|
||||||
|
{
|
||||||
|
queryStr = QString("INSERT INTO public.report_items (text, doc, dm_code, title, result, fk_report_id, number) "
|
||||||
|
"VALUES ('%1', '%2', '%3', '%4', '%5', %6, %7) "
|
||||||
|
"RETURNING report_items.item_id").arg(
|
||||||
|
reportItem.text,
|
||||||
|
reportItem.procedure.doc,
|
||||||
|
reportItem.procedure.dmCode,
|
||||||
|
reportItem.procedure.title,
|
||||||
|
reportItem.procedure.result,
|
||||||
|
QString::number(report_id),
|
||||||
|
QString::number(++number));
|
||||||
|
|
||||||
|
if(!queryExecInt(queryStr))
|
||||||
|
{
|
||||||
|
resBool = db->rollback();
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
queryStr = QString("UPDATE public.tasks_fim SET status = '%1' "
|
||||||
|
"WHERE task_id = %2 ").arg(
|
||||||
|
"checkup",
|
||||||
|
QString::number(task_id) );
|
||||||
|
|
||||||
|
QSqlQuery queryTaskUPD = QSqlQuery(*db);
|
||||||
|
if(!queryExec(queryStr, &queryTaskUPD))
|
||||||
|
{
|
||||||
|
resBool = db->rollback();
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
resBool = db->commit();
|
||||||
|
return report_id;
|
||||||
|
}
|
||||||
505
DataBaseLMS/databaselms_trainees.cpp
Normal file
@@ -0,0 +1,505 @@
|
|||||||
|
#include "databaselms.h"
|
||||||
|
|
||||||
|
#include <QtSql>
|
||||||
|
#include <QSqlDatabase>
|
||||||
|
#include <QSqlDriver>
|
||||||
|
#include <QMessageBox>
|
||||||
|
|
||||||
|
|
||||||
|
QList<Trainee> DataBaseLMS::selectAllTrainees()
|
||||||
|
{
|
||||||
|
bool resBool = false;
|
||||||
|
|
||||||
|
QList<Trainee> listTrainees;
|
||||||
|
|
||||||
|
resBool = db->transaction();
|
||||||
|
|
||||||
|
QString queryStr = QString("SELECT users.user_id, users.name, users.login, users.password, users.archived, users.logged_in, "
|
||||||
|
"groups.group_id, groups.name, "
|
||||||
|
"computers.computer_id, computers.name, computers.ip_address, "
|
||||||
|
"classrooms.classroom_id, classrooms.name "
|
||||||
|
"FROM public.users JOIN public.groups ON groups.group_id = users.fk_group_id "
|
||||||
|
"LEFT OUTER JOIN public.computers ON computers.computer_id = users.fk_computer_id "
|
||||||
|
"LEFT OUTER JOIN public.classrooms ON classrooms.classroom_id = computers.fk_classroom_id "
|
||||||
|
"WHERE users.type = '%1' "
|
||||||
|
"ORDER BY groups.name, users.name ASC").arg(
|
||||||
|
TypeUserDBTrainee);
|
||||||
|
|
||||||
|
QSqlQuery query = QSqlQuery(*db);
|
||||||
|
|
||||||
|
if(queryExec(queryStr, &query))
|
||||||
|
{
|
||||||
|
while (query.next())
|
||||||
|
{//Обучаемый
|
||||||
|
Trainee trainee;
|
||||||
|
|
||||||
|
trainee.setID(query.value(0).toInt());
|
||||||
|
trainee.setName(query.value(1).toString());
|
||||||
|
trainee.setLogin(query.value(2).toString());
|
||||||
|
trainee.setPassword(query.value(3).toString());
|
||||||
|
trainee.setArchived(query.value(4).toBool());
|
||||||
|
trainee.setLoggedIn(query.value(5).toBool());
|
||||||
|
|
||||||
|
Group group = Group(query.value(6).toInt(), query.value(7).toString());
|
||||||
|
trainee.setGroup(group);
|
||||||
|
|
||||||
|
Classroom classroom = Classroom(query.value(11).toInt(), query.value(12).toString());
|
||||||
|
Computer computer = Computer(query.value(8).toInt(), query.value(9).toString(), query.value(10).toString(), classroom);
|
||||||
|
trainee.setComputer(computer);
|
||||||
|
|
||||||
|
//Тайминг
|
||||||
|
TimingOfTrainee timing(trainee.getID());
|
||||||
|
|
||||||
|
QString queryStrSELtiming = QString("SELECT timings.timing_id, timings.entry_time, timings.exit_time, timings.operating_time, timings.fk_trainee_id "
|
||||||
|
"FROM public.timings "
|
||||||
|
"WHERE fk_trainee_id = '%1'").arg(trainee.getID());
|
||||||
|
|
||||||
|
QSqlQuery querySelTiming = QSqlQuery(*db);
|
||||||
|
|
||||||
|
if(queryExec(queryStrSELtiming, &querySelTiming))
|
||||||
|
{
|
||||||
|
if (querySelTiming.first())
|
||||||
|
{//Тайминг
|
||||||
|
timing.setID(querySelTiming.value(0).toInt());
|
||||||
|
timing.setEntryTime(querySelTiming.value(1).toDateTime());
|
||||||
|
timing.setExitTime(querySelTiming.value(2).toDateTime());
|
||||||
|
timing.setOperatingTime(querySelTiming.value(3).toTime());
|
||||||
|
timing.setTraineeID(querySelTiming.value(4).toInt());
|
||||||
|
}
|
||||||
|
|
||||||
|
trainee.setTiming(timing);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
resBool = db->rollback();
|
||||||
|
return QList<Trainee>();
|
||||||
|
}
|
||||||
|
|
||||||
|
listTrainees.append(trainee);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
resBool = db->rollback();
|
||||||
|
return QList<Trainee>();
|
||||||
|
}
|
||||||
|
|
||||||
|
return listTrainees;
|
||||||
|
}
|
||||||
|
|
||||||
|
Trainee DataBaseLMS::selectTrainee(int id_trainee)
|
||||||
|
{
|
||||||
|
Trainee trainee;
|
||||||
|
|
||||||
|
QString queryStr = QString("SELECT users.user_id, users.name, users.login, users.password, users.archived, users.logged_in, "
|
||||||
|
"groups.group_id, groups.name, "
|
||||||
|
"computers.computer_id, computers.name, computers.ip_address, "
|
||||||
|
"classrooms.classroom_id, classrooms.name "
|
||||||
|
"FROM public.users JOIN public.groups ON groups.group_id = users.fk_group_id "
|
||||||
|
"LEFT OUTER JOIN public.computers ON computers.computer_id = users.fk_computer_id "
|
||||||
|
"LEFT OUTER JOIN public.classrooms ON classrooms.classroom_id = computers.fk_classroom_id "
|
||||||
|
"WHERE users.user_id = %1 AND users.type = '%2' "
|
||||||
|
"ORDER BY groups.name, users.name ASC").arg(
|
||||||
|
QString::number(id_trainee),
|
||||||
|
TypeUserDBTrainee);
|
||||||
|
|
||||||
|
QSqlQuery query = QSqlQuery(*db);
|
||||||
|
|
||||||
|
if(queryExec(queryStr, &query))
|
||||||
|
{
|
||||||
|
if (query.first())
|
||||||
|
{//Обучаемый
|
||||||
|
trainee.setID(query.value(0).toInt());
|
||||||
|
trainee.setName(query.value(1).toString());
|
||||||
|
trainee.setLogin(query.value(2).toString());
|
||||||
|
trainee.setPassword(query.value(3).toString());
|
||||||
|
trainee.setArchived(query.value(4).toBool());
|
||||||
|
trainee.setLoggedIn(query.value(5).toBool());
|
||||||
|
|
||||||
|
Group group = Group(query.value(6).toInt(), query.value(7).toString());
|
||||||
|
trainee.setGroup(group);
|
||||||
|
|
||||||
|
Classroom classroom = Classroom(query.value(11).toInt(), query.value(12).toString());
|
||||||
|
Computer computer = Computer(query.value(8).toInt(), query.value(9).toString(), query.value(10).toString(), classroom);
|
||||||
|
trainee.setComputer(computer);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return trainee;
|
||||||
|
}
|
||||||
|
|
||||||
|
QList<Trainee> DataBaseLMS::selectAllTraineesInGroup(int id_group)
|
||||||
|
{
|
||||||
|
QList<Trainee> listTrainees;
|
||||||
|
|
||||||
|
QString queryStr = QString("SELECT users.user_id, users.name, users.login, users.password, users.archived, users.logged_in, "
|
||||||
|
"groups.group_id, groups.name, "
|
||||||
|
"computers.computer_id, computers.name, computers.ip_address, "
|
||||||
|
"classrooms.classroom_id, classrooms.name "
|
||||||
|
"FROM public.users JOIN public.groups ON groups.group_id = users.fk_group_id "
|
||||||
|
"LEFT OUTER JOIN public.computers ON computers.computer_id = users.fk_computer_id "
|
||||||
|
"LEFT OUTER JOIN public.classrooms ON classrooms.classroom_id = computers.fk_classroom_id "
|
||||||
|
"WHERE users.fk_group_id = %1 AND users.type = '%2' "
|
||||||
|
"ORDER BY groups.name, users.name ASC").arg(
|
||||||
|
QString::number(id_group),
|
||||||
|
TypeUserDBTrainee);
|
||||||
|
|
||||||
|
QSqlQuery query = QSqlQuery(*db);
|
||||||
|
|
||||||
|
if(queryExec(queryStr, &query))
|
||||||
|
{
|
||||||
|
while (query.next())
|
||||||
|
{//Обучаемый
|
||||||
|
Trainee trainee;
|
||||||
|
|
||||||
|
trainee.setID(query.value(0).toInt());
|
||||||
|
trainee.setName(query.value(1).toString());
|
||||||
|
trainee.setLogin(query.value(2).toString());
|
||||||
|
trainee.setPassword(query.value(3).toString());
|
||||||
|
trainee.setArchived(query.value(4).toBool());
|
||||||
|
trainee.setLoggedIn(query.value(5).toBool());
|
||||||
|
|
||||||
|
Group group = Group(query.value(6).toInt(), query.value(7).toString());
|
||||||
|
trainee.setGroup(group);
|
||||||
|
|
||||||
|
Classroom classroom = Classroom(query.value(11).toInt(), query.value(12).toString());
|
||||||
|
Computer computer = Computer(query.value(8).toInt(), query.value(9).toString(), query.value(10).toString(), classroom);
|
||||||
|
trainee.setComputer(computer);
|
||||||
|
|
||||||
|
listTrainees.append(trainee);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return listTrainees;
|
||||||
|
}
|
||||||
|
|
||||||
|
QString DataBaseLMS::selectTraineeNameOnComputer(QString computer_name)
|
||||||
|
{
|
||||||
|
QString queryStr = QString("SELECT users.name "
|
||||||
|
"FROM public.users JOIN public.computers ON computers.computer_id = users.fk_computer_id "
|
||||||
|
"WHERE computers.name = '%1' AND users.type = '%2' ").arg(
|
||||||
|
computer_name,
|
||||||
|
TypeUserDBTrainee);
|
||||||
|
|
||||||
|
return queryExecString(queryStr);
|
||||||
|
}
|
||||||
|
|
||||||
|
Trainee DataBaseLMS::selectTraineeOnComputer(QString computer_name)
|
||||||
|
{
|
||||||
|
Trainee trainee;
|
||||||
|
|
||||||
|
QString queryStr = QString("SELECT users.trainee_id, users.name, users.login, users.password, users.archived, users.logged_in, "
|
||||||
|
"groups.group_id, groups.name, "
|
||||||
|
"computers.computer_id, computers.name, computers.ip_address, "
|
||||||
|
"classrooms.classroom_id, classrooms.name "
|
||||||
|
"FROM public.users JOIN public.groups ON groups.group_id = users.fk_group_id "
|
||||||
|
"LEFT OUTER JOIN public.computers ON computers.computer_id = users.fk_computer_id "
|
||||||
|
"LEFT OUTER JOIN public.classrooms ON classrooms.classroom_id = computers.fk_classroom_id "
|
||||||
|
"WHERE computers.name = '%1' AND users.type = '%2' ").arg(
|
||||||
|
computer_name,
|
||||||
|
TypeUserDBTrainee);
|
||||||
|
|
||||||
|
QSqlQuery query = QSqlQuery(*db);
|
||||||
|
|
||||||
|
if(queryExec(queryStr, &query))
|
||||||
|
{
|
||||||
|
if (query.first())
|
||||||
|
{//Обучаемый
|
||||||
|
trainee.setID(query.value(0).toInt());
|
||||||
|
trainee.setName(query.value(1).toString());
|
||||||
|
trainee.setLogin(query.value(2).toString());
|
||||||
|
trainee.setPassword(query.value(3).toString());
|
||||||
|
trainee.setArchived(query.value(4).toBool());
|
||||||
|
trainee.setLoggedIn(query.value(5).toBool());
|
||||||
|
|
||||||
|
Group group = Group(query.value(6).toInt(), query.value(7).toString());
|
||||||
|
trainee.setGroup(group);
|
||||||
|
|
||||||
|
Classroom classroom = Classroom(query.value(11).toInt(), query.value(12).toString());
|
||||||
|
Computer computer = Computer(query.value(8).toInt(), query.value(9).toString(), query.value(10).toString(), classroom);
|
||||||
|
trainee.setComputer(computer);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return trainee;
|
||||||
|
}
|
||||||
|
|
||||||
|
int DataBaseLMS::insertTrainee(int id_group)
|
||||||
|
{
|
||||||
|
QString queryStr = QString("INSERT INTO public.users (type, name, login, password, archived, logged_in, fk_group_id) "
|
||||||
|
"VALUES ('%1', DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, %2) "
|
||||||
|
"RETURNING users.user_id").arg(
|
||||||
|
TypeUserDBTrainee,
|
||||||
|
QString::number(id_group));
|
||||||
|
|
||||||
|
return queryExecInt(queryStr);
|
||||||
|
}
|
||||||
|
|
||||||
|
int DataBaseLMS::insertTrainee(Trainee trainee)
|
||||||
|
{
|
||||||
|
QString queryStr = QString("INSERT INTO public.users (type, name, login, password, archived, logged_in, fk_group_id) "
|
||||||
|
"VALUES ('%1', '%2', '%3', '%4', %5, %6, %7) "
|
||||||
|
"RETURNING users.user_id").arg(
|
||||||
|
TypeUserDBTrainee,
|
||||||
|
trainee.getName(),
|
||||||
|
trainee.getLogin(),
|
||||||
|
trainee.getPassword(),
|
||||||
|
trainee.getArchived() ? "true" : "false",
|
||||||
|
trainee.getLoggedIn() ? "true" : "false",
|
||||||
|
QString::number(trainee.getGroup().getID()));
|
||||||
|
|
||||||
|
return queryExecInt(queryStr);
|
||||||
|
}
|
||||||
|
|
||||||
|
int DataBaseLMS::deleteTrainee(int id_trainee)
|
||||||
|
{
|
||||||
|
QString queryStr;
|
||||||
|
int res = 0;
|
||||||
|
bool resBool = false;
|
||||||
|
|
||||||
|
resBool = db->transaction();
|
||||||
|
|
||||||
|
|
||||||
|
//Удаление задач AMM
|
||||||
|
queryStr = QString("DELETE FROM public.tasks_amm "
|
||||||
|
"WHERE fk_trainee_id = %1 ").arg(
|
||||||
|
QString::number(id_trainee));
|
||||||
|
|
||||||
|
QSqlQuery queryTasksAMMDEL = QSqlQuery(*db);
|
||||||
|
if(!queryExec(queryStr, &queryTasksAMMDEL))
|
||||||
|
{
|
||||||
|
resBool = db->rollback();
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//Удаление задач FIM
|
||||||
|
|
||||||
|
/*Выборка задач FIM для этого обучаемого*/
|
||||||
|
queryStr = QString("SELECT tasks_fim.task_id "
|
||||||
|
"FROM public.tasks_fim "
|
||||||
|
"WHERE tasks_fim.fk_trainee_id = %1 "
|
||||||
|
"ORDER BY tasks_fim.task_id ASC").arg(
|
||||||
|
id_trainee);
|
||||||
|
|
||||||
|
QSqlQuery queryTasksFIMSEL = QSqlQuery(*db);
|
||||||
|
if(queryExec(queryStr, &queryTasksFIMSEL))
|
||||||
|
{
|
||||||
|
while (queryTasksFIMSEL.next())
|
||||||
|
{//Задача
|
||||||
|
int task_id = queryTasksFIMSEL.value(0).toInt();
|
||||||
|
|
||||||
|
/*Выборка неисправностей для этой задачи*/
|
||||||
|
queryStr = QString("SELECT malfunctions.malfunction_id "
|
||||||
|
"FROM public.malfunctions "
|
||||||
|
"WHERE malfunctions.fk_task_fim_id = %1 "
|
||||||
|
"ORDER BY malfunctions.malfunction_id ASC").arg(
|
||||||
|
task_id);
|
||||||
|
|
||||||
|
QSqlQuery queryMulfSEL = QSqlQuery(*db);
|
||||||
|
if(queryExec(queryStr, &queryMulfSEL))
|
||||||
|
{
|
||||||
|
while (queryMulfSEL.next())
|
||||||
|
{//Неисправность
|
||||||
|
int mulf_id = queryMulfSEL.value(0).toInt();
|
||||||
|
|
||||||
|
/*Удаление сигналов для этой неисправности*/
|
||||||
|
queryStr = QString("DELETE FROM public.malf_signs "
|
||||||
|
"WHERE malf_signs.fk_malfunction_id = %1 ").arg(
|
||||||
|
mulf_id);
|
||||||
|
QSqlQuery querySign = QSqlQuery(*db);
|
||||||
|
if(!queryExec(queryStr, &querySign))
|
||||||
|
{
|
||||||
|
resBool = db->rollback();
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
resBool = db->rollback();
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*Удаление неисправностей*/
|
||||||
|
queryStr = QString("DELETE FROM public.malfunctions "
|
||||||
|
"WHERE malfunctions.fk_task_fim_id = %1 ").arg(
|
||||||
|
task_id);
|
||||||
|
QSqlQuery queryMulfDEL = QSqlQuery(*db);
|
||||||
|
if(!queryExec(queryStr, &queryMulfDEL))
|
||||||
|
{
|
||||||
|
resBool = db->rollback();
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*Удаление отчетов для задачи*/
|
||||||
|
/*Выборка отчетов для этой задачи*/
|
||||||
|
queryStr = QString("SELECT reports.report_id "
|
||||||
|
"FROM public.reports "
|
||||||
|
"WHERE reports.fk_task_fim_id = %1 "
|
||||||
|
"ORDER BY reports.report_id ASC").arg(
|
||||||
|
task_id);
|
||||||
|
QSqlQuery queryReportsSEL = QSqlQuery(*db);
|
||||||
|
if(queryExec(queryStr, &queryReportsSEL))
|
||||||
|
{
|
||||||
|
while (queryReportsSEL.next())
|
||||||
|
{//отчет
|
||||||
|
int report_id = queryReportsSEL.value(0).toInt();
|
||||||
|
|
||||||
|
/*Удаление items для этого отчета*/
|
||||||
|
queryStr = QString("DELETE FROM public.report_items "
|
||||||
|
"WHERE report_items.fk_report_id = %1 ").arg(
|
||||||
|
report_id);
|
||||||
|
QSqlQuery queryReportDEL = QSqlQuery(*db);
|
||||||
|
if(!queryExec(queryStr, &queryReportDEL))
|
||||||
|
{
|
||||||
|
resBool = db->rollback();
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
resBool = db->rollback();
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*Удаление отчетов*/
|
||||||
|
queryStr = QString("DELETE FROM public.reports "
|
||||||
|
"WHERE reports.fk_task_fim_id = %1 ").arg(
|
||||||
|
task_id);
|
||||||
|
QSqlQuery queryReportsDEL = QSqlQuery(*db);
|
||||||
|
if(!queryExec(queryStr, &queryReportsDEL))
|
||||||
|
{
|
||||||
|
resBool = db->rollback();
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
// ////////////////////////////
|
||||||
|
};
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
resBool = db->rollback();
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*Удаление непосредственно задач FIM*/
|
||||||
|
queryStr = QString("DELETE FROM public.tasks_fim "
|
||||||
|
"WHERE fk_trainee_id = %1 ").arg(
|
||||||
|
QString::number(id_trainee));
|
||||||
|
|
||||||
|
QSqlQuery queryTasksFIMDEL = QSqlQuery(*db);
|
||||||
|
if(!queryExec(queryStr, &queryTasksFIMDEL))
|
||||||
|
{
|
||||||
|
resBool = db->rollback();
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*Удаление таймингов для обучаемого*/
|
||||||
|
queryStr = QString("DELETE FROM public.timings "
|
||||||
|
"WHERE fk_trainee_id = %1 ").arg(
|
||||||
|
QString::number(id_trainee));
|
||||||
|
|
||||||
|
QSqlQuery queryTimingsDEL = QSqlQuery(*db);
|
||||||
|
if(!queryExec(queryStr, &queryTimingsDEL))
|
||||||
|
{
|
||||||
|
resBool = db->rollback();
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
// ////////////////////////////
|
||||||
|
|
||||||
|
|
||||||
|
//Удаление обучаемого
|
||||||
|
queryStr = QString("DELETE FROM public.users "
|
||||||
|
"WHERE user_id = %1 AND users.type = '%2' "
|
||||||
|
"RETURNING users.user_id").arg(
|
||||||
|
QString::number(id_trainee),
|
||||||
|
TypeUserDBTrainee);
|
||||||
|
|
||||||
|
res = queryExecInt(queryStr);
|
||||||
|
if(res)
|
||||||
|
{
|
||||||
|
resBool = db->commit();
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
resBool = db->rollback();
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int DataBaseLMS::updateTrainee(Trainee trainee)
|
||||||
|
{
|
||||||
|
QString computer_id = (trainee.getComputer().getID() == 0 ? QStringLiteral("null") : QString::number(trainee.getComputer().getID()));
|
||||||
|
|
||||||
|
QString queryStr = QString("UPDATE public.users "
|
||||||
|
"SET name = '%1', login = '%2', password = '%3', archived = %4, logged_in = %5, "
|
||||||
|
"fk_group_id = %6, "
|
||||||
|
"fk_computer_id = %7 "
|
||||||
|
"WHERE user_id = %8 AND users.type = '%9' "
|
||||||
|
"RETURNING users.user_id").arg(
|
||||||
|
trainee.getName(),
|
||||||
|
trainee.getLogin(),
|
||||||
|
trainee.getPassword(),
|
||||||
|
trainee.getArchived() ? "true" : "false",
|
||||||
|
trainee.getLoggedIn() ? "true" : "false",
|
||||||
|
QString::number(trainee.getGroup().getID()),
|
||||||
|
computer_id,
|
||||||
|
QString::number(trainee.getID()),
|
||||||
|
TypeUserDBTrainee);
|
||||||
|
|
||||||
|
return queryExecInt(queryStr);
|
||||||
|
}
|
||||||
|
|
||||||
|
int DataBaseLMS::insertTimingTrainee(int id_trainee)
|
||||||
|
{
|
||||||
|
QString queryStr = QString("INSERT INTO public.timings (entry_time, exit_time, operating_time, fk_trainee_id) "
|
||||||
|
"VALUES (DEFAULT, DEFAULT, DEFAULT, %1) "
|
||||||
|
"RETURNING timings.timing_id").arg(
|
||||||
|
QString::number(id_trainee));
|
||||||
|
|
||||||
|
return queryExecInt(queryStr);
|
||||||
|
}
|
||||||
|
|
||||||
|
int DataBaseLMS::updateTimingTrainee(int id_trainee, TimingOfTrainee timing)
|
||||||
|
{
|
||||||
|
QString queryStr = QString("UPDATE public.timings "
|
||||||
|
"SET entry_time = '%1', exit_time = '%2', operating_time = '%3', fk_trainee_id = %4 "
|
||||||
|
"WHERE timing_id = %5 "
|
||||||
|
"RETURNING timings.timing_id").arg(
|
||||||
|
timing.getEntryTimeS(),
|
||||||
|
timing.getExitTimeS(),
|
||||||
|
timing.getOperatingTimeS(),
|
||||||
|
QString::number(id_trainee),
|
||||||
|
QString::number(timing.getID()) );
|
||||||
|
|
||||||
|
return queryExecInt(queryStr);
|
||||||
|
}
|
||||||
|
|
||||||
|
TimingOfTrainee DataBaseLMS::selectTimingTrainee(int id_trainee)
|
||||||
|
{
|
||||||
|
TimingOfTrainee timing(id_trainee);
|
||||||
|
|
||||||
|
QString queryStr = QString("SELECT timings.timing_id, timings.entry_time, timings.exit_time, timings.operating_time, timings.fk_trainee_id "
|
||||||
|
"FROM public.timings "
|
||||||
|
"WHERE fk_trainee_id = '%1'").arg(id_trainee);
|
||||||
|
|
||||||
|
QSqlQuery querySel = QSqlQuery(*db);
|
||||||
|
|
||||||
|
if(queryExec(queryStr, &querySel))
|
||||||
|
{
|
||||||
|
if (querySel.first())
|
||||||
|
{//Тайминг
|
||||||
|
timing.setID(querySel.value(0).toInt());
|
||||||
|
timing.setEntryTime(querySel.value(1).toDateTime());
|
||||||
|
timing.setExitTime(querySel.value(2).toDateTime());
|
||||||
|
timing.setOperatingTime(querySel.value(3).toTime());
|
||||||
|
timing.setTraineeID(querySel.value(4).toInt());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return timing;
|
||||||
|
}
|
||||||
101
DataBaseLMS/databaselms_users.cpp
Normal file
@@ -0,0 +1,101 @@
|
|||||||
|
#include "databaselms.h"
|
||||||
|
|
||||||
|
#include <QtSql>
|
||||||
|
#include <QSqlDatabase>
|
||||||
|
#include <QSqlDriver>
|
||||||
|
#include <QMessageBox>
|
||||||
|
|
||||||
|
int DataBaseLMS::selectUserID(QString type, QString login, QString password)
|
||||||
|
{
|
||||||
|
QString queryStr;
|
||||||
|
|
||||||
|
if(password != QStringLiteral(""))
|
||||||
|
{
|
||||||
|
queryStr = QString("SELECT users.user_id "
|
||||||
|
"FROM public.users "
|
||||||
|
"WHERE login = '%1' AND password = '%2' AND users.type = '%3' ").arg(
|
||||||
|
login,
|
||||||
|
password,
|
||||||
|
type);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
queryStr = QString("SELECT users.user_id "
|
||||||
|
"FROM public.users "
|
||||||
|
"WHERE login = '%1' AND users.type = '%2' ").arg(
|
||||||
|
login,
|
||||||
|
type);
|
||||||
|
}
|
||||||
|
|
||||||
|
return queryExecInt(queryStr);
|
||||||
|
}
|
||||||
|
|
||||||
|
QString DataBaseLMS::selectUserNameByLogin(QString type, QString login)
|
||||||
|
{
|
||||||
|
QString queryStr = QString("SELECT users.name "
|
||||||
|
"FROM public.users "
|
||||||
|
"WHERE users.login = '%1' AND users.type = '%2' ").arg(
|
||||||
|
login,
|
||||||
|
type );
|
||||||
|
|
||||||
|
return queryExecString(queryStr);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool DataBaseLMS::selectUserLoggedIn(QString type, int id_user)
|
||||||
|
{
|
||||||
|
QString queryStr = QString("SELECT users.logged_in "
|
||||||
|
"FROM public.users "
|
||||||
|
"WHERE user_id = %1 AND users.type = '%2' ").arg(
|
||||||
|
QString::number(id_user),
|
||||||
|
type );
|
||||||
|
|
||||||
|
return queryExecBool(queryStr);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool DataBaseLMS::selectUserArchived(QString type, int id_user)
|
||||||
|
{
|
||||||
|
QString queryStr = QString("SELECT users.archived "
|
||||||
|
"FROM public.users "
|
||||||
|
"WHERE user_id = %1 AND users.type = '%2' ").arg(
|
||||||
|
QString::number(id_user),
|
||||||
|
type );
|
||||||
|
|
||||||
|
return queryExecBool(queryStr);
|
||||||
|
}
|
||||||
|
|
||||||
|
int DataBaseLMS::updateUserLoggedIn(QString type, int id_user, bool loggedIn)
|
||||||
|
{
|
||||||
|
QString queryStr = QString("UPDATE public.users "
|
||||||
|
"SET logged_in = %1 "
|
||||||
|
"WHERE user_id = %2 AND users.type = '%3' "
|
||||||
|
"RETURNING users.user_id").arg(
|
||||||
|
loggedIn ? "true" : "false",
|
||||||
|
QString::number(id_user),
|
||||||
|
type);
|
||||||
|
|
||||||
|
return queryExecInt(queryStr);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool DataBaseLMS::updateAllUsersLoggedIn(QString type, bool loggedIn)
|
||||||
|
{
|
||||||
|
QString queryStr = QString("UPDATE public.users "
|
||||||
|
"SET logged_in = %1 "
|
||||||
|
"WHERE users.type = '%2' ").arg(
|
||||||
|
loggedIn ? "true" : "false",
|
||||||
|
type);
|
||||||
|
|
||||||
|
return queryExecBool(queryStr);
|
||||||
|
}
|
||||||
|
|
||||||
|
int DataBaseLMS::updateUserArchived(QString type, int id_user, bool archived)
|
||||||
|
{
|
||||||
|
QString queryStr = QString("UPDATE public.users "
|
||||||
|
"SET archived = %1 "
|
||||||
|
"WHERE user_id = %2 AND users.type = '%3' "
|
||||||
|
"RETURNING users.user_id").arg(
|
||||||
|
archived ? "true" : "false",
|
||||||
|
QString::number(id_user),
|
||||||
|
type);
|
||||||
|
|
||||||
|
return queryExecInt(queryStr);
|
||||||
|
}
|
||||||
@@ -1,8 +1,8 @@
|
|||||||
#include "instructor.h"
|
#include "instructor.h"
|
||||||
|
|
||||||
Instructor::Instructor():
|
Instructor::Instructor():
|
||||||
User(),
|
User()//,
|
||||||
isAdmin()
|
//isAdmin()
|
||||||
{
|
{
|
||||||
|
TypeUserDB = User::TypeUserDBInstructor;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ public:
|
|||||||
bool getIsAdmin(){return isAdmin;}
|
bool getIsAdmin(){return isAdmin;}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
bool isAdmin;
|
//bool isAdmin;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // INSTRUCTOR_H
|
#endif // INSTRUCTOR_H
|
||||||
|
|||||||
@@ -5,37 +5,31 @@
|
|||||||
#include <QTime>
|
#include <QTime>
|
||||||
#include "interfacedatabaselms.h"
|
#include "interfacedatabaselms.h"
|
||||||
|
|
||||||
InterfaceDataBaseLMS::InterfaceDataBaseLMS(QWidget* parent):
|
InterfaceDataBaseLMS::InterfaceDataBaseLMS(QWidget *ownerWidget, QObject *parent):
|
||||||
QWidget(parent),
|
DataBaseLMS(ownerWidget, parent),
|
||||||
DataBaseLMS()
|
ownerWidget(ownerWidget)
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void InterfaceDataBaseLMS::slot_LanguageChanged(QString language)
|
bool InterfaceDataBaseLMS::connectionToDB()
|
||||||
{
|
|
||||||
qtLanguageTranslator.load(QString(QStringLiteral("translations/DataBaseLMS_")) + language, QStringLiteral("."));
|
|
||||||
QCoreApplication::installTranslator(&qtLanguageTranslator);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool InterfaceDataBaseLMS::ConnectionToDB()
|
|
||||||
{
|
{
|
||||||
if(!createConnection())
|
if(!createConnection())
|
||||||
{
|
{
|
||||||
QMessageBox::critical(nullptr, dbSettings.dbName, tr("Connection error: ") + db->lastError().text());
|
QMessageBox::critical(ownerWidget, dbSettings.dbName, tr("Connection error") /*+ db->lastError().text()*/);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
//QMessageBox::information(nullptr, dbName, tr("Connection is successful!"));
|
//QMessageBox::information(ownerWidget, dbName, tr("Connection is successful!"));
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool InterfaceDataBaseLMS::DisConnectionFromDB()
|
bool InterfaceDataBaseLMS::disConnectionFromDB()
|
||||||
{
|
{
|
||||||
deleteConnection();
|
deleteConnection();
|
||||||
//QMessageBox::information(nullptr, dbName, tr("Disconnection is successful!"));
|
//QMessageBox::information(ownerWidget, dbName, tr("Disconnection is successful!"));
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -47,54 +41,42 @@ bool InterfaceDataBaseLMS::DBisConnected()
|
|||||||
|
|
||||||
//Инструкторы
|
//Инструкторы
|
||||||
|
|
||||||
bool InterfaceDataBaseLMS::AuthorizationInstructor(QString login, QString password)
|
bool InterfaceDataBaseLMS::authorizationInstructor(QString login, QString password)
|
||||||
{
|
{
|
||||||
if(! transactionBegin())
|
if(int id = selectUserID(DataBaseLMS::TypeUserDBInstructor, login, password))
|
||||||
return false;
|
|
||||||
|
|
||||||
if(int id = selectInstructorID(login, password))
|
|
||||||
{
|
{
|
||||||
if(isArchivedInstructor(id) || isLoggedInInstructor(id))
|
if(selectUserArchived(DataBaseLMS::TypeUserDBInstructor, id) || selectUserLoggedIn(DataBaseLMS::TypeUserDBInstructor, id))
|
||||||
{
|
|
||||||
transactionEnd();
|
|
||||||
return false;
|
return false;
|
||||||
}
|
|
||||||
if(updateInstructorLoggedIn(id, true))
|
|
||||||
return transactionEnd();
|
|
||||||
}
|
|
||||||
|
|
||||||
transactionEnd();
|
if(updateUserLoggedIn(DataBaseLMS::TypeUserDBInstructor, id, true))
|
||||||
|
return true;
|
||||||
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool InterfaceDataBaseLMS::deAuthorizationInstructor(QString login)
|
bool InterfaceDataBaseLMS::deAuthorizationInstructor(QString login)
|
||||||
{
|
{
|
||||||
if(! transactionBegin())
|
if(int id = selectUserID(DataBaseLMS::TypeUserDBInstructor, login))
|
||||||
return false;
|
|
||||||
|
|
||||||
if(int id = selectInstructorID(login))
|
|
||||||
{
|
{
|
||||||
if(updateInstructorLoggedIn(id, false))
|
if(updateUserLoggedIn(DataBaseLMS::TypeUserDBInstructor, id, false))
|
||||||
return transactionEnd();
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
transactionEnd();
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool InterfaceDataBaseLMS::deAuthorizationAllInstructors()
|
bool InterfaceDataBaseLMS::deAuthorizationAllInstructors()
|
||||||
{
|
{
|
||||||
return updateAllInstructorsLoggedIn(false);
|
return updateAllUsersLoggedIn(DataBaseLMS::TypeUserDBInstructor, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
QString InterfaceDataBaseLMS::getNameInstructorByLogin(QString login)
|
QString InterfaceDataBaseLMS::getNameInstructorByLogin(QString login)
|
||||||
{
|
{
|
||||||
return selectInstructorNameByLogin(login);
|
return selectUserNameByLogin(DataBaseLMS::TypeUserDBInstructor, login);
|
||||||
}
|
}
|
||||||
|
|
||||||
int InterfaceDataBaseLMS::getIdInstructorByLogin(QString login)
|
int InterfaceDataBaseLMS::getIdInstructorByLogin(QString login)
|
||||||
{
|
{
|
||||||
return selectInstructorID(login);
|
return selectUserID(DataBaseLMS::TypeUserDBInstructor, login);
|
||||||
}
|
}
|
||||||
|
|
||||||
QList<Instructor> InterfaceDataBaseLMS::getListInstructors()
|
QList<Instructor> InterfaceDataBaseLMS::getListInstructors()
|
||||||
@@ -119,46 +101,6 @@ int InterfaceDataBaseLMS::delInstructor(int id)
|
|||||||
|
|
||||||
int InterfaceDataBaseLMS::editInstructor(Instructor instructor)
|
int InterfaceDataBaseLMS::editInstructor(Instructor instructor)
|
||||||
{
|
{
|
||||||
//Проверка корректности логина, имени, пароля
|
|
||||||
QList<Instructor> listInstructors = selectAllInstructors();
|
|
||||||
for(Instructor exist_instructor : listInstructors)
|
|
||||||
{
|
|
||||||
if(instructor.getName() == QStringLiteral("<instructor>"))
|
|
||||||
{//Имя не корректно!
|
|
||||||
QMessageBox::critical(nullptr, tr("Editing error!"),
|
|
||||||
tr("Unacceptable instructor name has been entered.\nThe changes will not be accepted."));
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(instructor.getLogin() == QStringLiteral("<login>"))
|
|
||||||
{//Логин не корректен!
|
|
||||||
QMessageBox::critical(nullptr, tr("Editing error!"),
|
|
||||||
tr("Unacceptable instructor login has been entered.\nThe changes will not be accepted."));
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(instructor.getPassword() == QStringLiteral("<password>"))
|
|
||||||
{//Пароль не корректный!
|
|
||||||
QMessageBox::critical(nullptr, tr("Editing error!"),
|
|
||||||
tr("Unacceptable instructor password has been entered.\nThe changes will not be accepted."));
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(instructor.getName() == exist_instructor.getName() && instructor.getID() != exist_instructor.getID())
|
|
||||||
{//Имя уже существует
|
|
||||||
QMessageBox::critical(nullptr, tr("Editing error!"),
|
|
||||||
tr("An existing instructor name has been entered."));
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(instructor.getLogin() == exist_instructor.getLogin() && instructor.getID() != exist_instructor.getID())
|
|
||||||
{//Логин уже существует!
|
|
||||||
QMessageBox::critical(nullptr, tr("Editing error!"),
|
|
||||||
tr("An existing instructor login has been entered.\nThe changes will not be accepted."));
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return updateInstructor(instructor);
|
return updateInstructor(instructor);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -169,55 +111,43 @@ bool InterfaceDataBaseLMS::isAdminInstructor(int id)
|
|||||||
|
|
||||||
bool InterfaceDataBaseLMS::isArchivedInstructor(int id)
|
bool InterfaceDataBaseLMS::isArchivedInstructor(int id)
|
||||||
{
|
{
|
||||||
return selectInstructorArchived(id);
|
return selectUserArchived(DataBaseLMS::TypeUserDBInstructor, id);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool InterfaceDataBaseLMS::isLoggedInInstructor(int id)
|
bool InterfaceDataBaseLMS::isLoggedInInstructor(int id)
|
||||||
{
|
{
|
||||||
return selectInstructorLoggedIn(id);
|
return selectUserLoggedIn(DataBaseLMS::TypeUserDBInstructor, id);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
//Инструкторы
|
//Инструкторы
|
||||||
|
|
||||||
bool InterfaceDataBaseLMS::AuthorizationTrainee(QString login, QString password, QString classroom_name, QString computer_name)
|
bool InterfaceDataBaseLMS::authorizationTrainee(QString login, QString password, QString classroom_name, QString computer_name)
|
||||||
{
|
{
|
||||||
if(! transactionBegin())
|
if(int id = selectUserID(DataBaseLMS::TypeUserDBTrainee, login, password))
|
||||||
return false;
|
|
||||||
|
|
||||||
if(int id = selectTraineeID(login, password))
|
|
||||||
{
|
{
|
||||||
if(isArchivedTrainee(id) || isLoggedInTrainee(id))
|
if(selectUserArchived(DataBaseLMS::TypeUserDBTrainee, id) || selectUserLoggedIn(DataBaseLMS::TypeUserDBTrainee, id))
|
||||||
{
|
|
||||||
transactionEnd();
|
|
||||||
return false;
|
return false;
|
||||||
}
|
|
||||||
if(updateTraineeLoggedIn(id, true))
|
|
||||||
return transactionEnd();
|
|
||||||
}
|
|
||||||
|
|
||||||
transactionEnd();
|
if(updateUserLoggedIn(DataBaseLMS::TypeUserDBTrainee, id, true))
|
||||||
|
return true;
|
||||||
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool InterfaceDataBaseLMS::deAuthorizationTrainee(QString login)
|
bool InterfaceDataBaseLMS::deAuthorizationTrainee(QString login)
|
||||||
{
|
{
|
||||||
if(! transactionBegin())
|
if(int id = selectUserID(DataBaseLMS::TypeUserDBTrainee, login))
|
||||||
return false;
|
|
||||||
|
|
||||||
if(int id = selectTraineeID(login))
|
|
||||||
{
|
{
|
||||||
if(updateTraineeLoggedIn(id, false))
|
if(updateUserLoggedIn(DataBaseLMS::TypeUserDBTrainee, id, false))
|
||||||
return transactionEnd();
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
transactionEnd();
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool InterfaceDataBaseLMS::deAuthorizationAllTrainees()
|
bool InterfaceDataBaseLMS::deAuthorizationAllTrainees()
|
||||||
{
|
{
|
||||||
return updateAllTraineesLoggedIn(false);
|
return updateAllUsersLoggedIn(DataBaseLMS::TypeUserDBTrainee, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
int InterfaceDataBaseLMS::entryTraineeOnSimulator(int id_trainee)
|
int InterfaceDataBaseLMS::entryTraineeOnSimulator(int id_trainee)
|
||||||
@@ -272,12 +202,12 @@ Trainee InterfaceDataBaseLMS::getTraineeOnComputer(QString computer_name)
|
|||||||
|
|
||||||
QString InterfaceDataBaseLMS::getNameTraineeByLogin(QString login)
|
QString InterfaceDataBaseLMS::getNameTraineeByLogin(QString login)
|
||||||
{
|
{
|
||||||
return selectTraineeNameByLogin(login);
|
return selectUserNameByLogin(DataBaseLMS::TypeUserDBTrainee, login);
|
||||||
}
|
}
|
||||||
|
|
||||||
int InterfaceDataBaseLMS::getIdTraineeByLogin(QString login)
|
int InterfaceDataBaseLMS::getIdTraineeByLogin(QString login)
|
||||||
{
|
{
|
||||||
return selectTraineeID(login);
|
return selectUserID(DataBaseLMS::TypeUserDBTrainee, login);
|
||||||
}
|
}
|
||||||
|
|
||||||
QList<Trainee> InterfaceDataBaseLMS::getListTraineesInGroup(int id)
|
QList<Trainee> InterfaceDataBaseLMS::getListTraineesInGroup(int id)
|
||||||
@@ -317,25 +247,6 @@ int InterfaceDataBaseLMS::delGroup(int id)
|
|||||||
|
|
||||||
int InterfaceDataBaseLMS::editGroup(Group group)
|
int InterfaceDataBaseLMS::editGroup(Group group)
|
||||||
{
|
{
|
||||||
//Проверка корректности имени
|
|
||||||
QList<Group> listGroups = selectAllGroups();
|
|
||||||
for(Group exist_group : listGroups)
|
|
||||||
{
|
|
||||||
if(group.getName() == QStringLiteral("<group>"))
|
|
||||||
{//Имя не корректно!
|
|
||||||
QMessageBox::critical(nullptr, tr("Editing error!"),
|
|
||||||
tr("Unacceptable group name has been entered.\nThe changes will not be accepted."));
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(group.getName() == exist_group.getName() && group.getID() != exist_group.getID())
|
|
||||||
{//Имя уже существует
|
|
||||||
QMessageBox::critical(nullptr, tr("Editing error!"),
|
|
||||||
tr("An existing group name has been entered.\nThe changes will not be accepted."));
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return updateGroup(group);
|
return updateGroup(group);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -381,7 +292,6 @@ int InterfaceDataBaseLMS::newTaskFIM(TaskAmmFim task, int id_trainee)
|
|||||||
|
|
||||||
int InterfaceDataBaseLMS::delTaskFIM(int id)
|
int InterfaceDataBaseLMS::delTaskFIM(int id)
|
||||||
{
|
{
|
||||||
deleteReportFIM(id);
|
|
||||||
return deleteTaskFIM(id);
|
return deleteTaskFIM(id);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -392,15 +302,7 @@ int InterfaceDataBaseLMS::editTaskFIM(TaskAmmFim task)
|
|||||||
|
|
||||||
int InterfaceDataBaseLMS::replaceReportFIM(TaskAmmFim task)
|
int InterfaceDataBaseLMS::replaceReportFIM(TaskAmmFim task)
|
||||||
{
|
{
|
||||||
deleteReportFIM(task.getID());
|
return updateReportFIMforTask(task);
|
||||||
|
|
||||||
if(int report_id = insertReportFIM(task))
|
|
||||||
{
|
|
||||||
updateStatusTaskFIM(task.getID(), "checkup");
|
|
||||||
return report_id;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int InterfaceDataBaseLMS::changeStatusTaskFIM(int id_task, QString status)
|
int InterfaceDataBaseLMS::changeStatusTaskFIM(int id_task, QString status)
|
||||||
@@ -425,55 +327,15 @@ int InterfaceDataBaseLMS::delTrainee(int id)
|
|||||||
|
|
||||||
int InterfaceDataBaseLMS::editTrainee(Trainee trainee)
|
int InterfaceDataBaseLMS::editTrainee(Trainee trainee)
|
||||||
{
|
{
|
||||||
//Проверка корректности логина, имени, пароля
|
|
||||||
QList<Trainee> listTrainees = selectAllTrainees();
|
|
||||||
for(Trainee exist_trainee : listTrainees)
|
|
||||||
{
|
|
||||||
if(trainee.getName() == QStringLiteral("<trainee>"))
|
|
||||||
{//Имя не корректно!
|
|
||||||
QMessageBox::critical(nullptr, tr("Editing error!"),
|
|
||||||
tr("Unacceptable trainee name has been entered.\nThe changes will not be accepted."));
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(trainee.getLogin() == QStringLiteral("<login>"))
|
|
||||||
{//Логин не корректен!
|
|
||||||
QMessageBox::critical(nullptr, tr("Editing error!"),
|
|
||||||
tr("Unacceptable trainee login has been entered.\nThe changes will not be accepted."));
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(trainee.getPassword() == QStringLiteral("<password>"))
|
|
||||||
{//Пароль не корректный!
|
|
||||||
QMessageBox::critical(nullptr, tr("Editing error!"),
|
|
||||||
tr("Unacceptable trainee password has been entered.\nThe changes will not be accepted."));
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(trainee.getName() == exist_trainee.getName() && trainee.getID() != exist_trainee.getID())
|
|
||||||
{//Имя уже существует
|
|
||||||
QMessageBox::critical(nullptr, tr("Editing error!"),
|
|
||||||
tr("An existing trainee name has been entered."));
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(trainee.getLogin() == exist_trainee.getLogin() && trainee.getID() != exist_trainee.getID())
|
|
||||||
{//Логин уже существует!
|
|
||||||
QMessageBox::critical(nullptr, tr("Editing error!"),
|
|
||||||
tr("An existing trainee login has been entered.\nThe changes will not be accepted."));
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return updateTrainee(trainee);
|
return updateTrainee(trainee);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool InterfaceDataBaseLMS::isArchivedTrainee(int id)
|
bool InterfaceDataBaseLMS::isArchivedTrainee(int id)
|
||||||
{
|
{
|
||||||
return selectTraineeArchived(id);
|
return selectUserArchived(DataBaseLMS::TypeUserDBTrainee, id);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool InterfaceDataBaseLMS::isLoggedInTrainee(int id)
|
bool InterfaceDataBaseLMS::isLoggedInTrainee(int id)
|
||||||
{
|
{
|
||||||
return selectTraineeLoggedIn(id);
|
return selectUserLoggedIn(DataBaseLMS::TypeUserDBTrainee, id);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8,25 +8,21 @@
|
|||||||
#include "DataBaseLMS_global.h"
|
#include "DataBaseLMS_global.h"
|
||||||
#include "databaselms.h"
|
#include "databaselms.h"
|
||||||
|
|
||||||
class DATABASELMS_EXPORT InterfaceDataBaseLMS : public /*QObject*/QWidget, DataBaseLMS
|
class DATABASELMS_EXPORT InterfaceDataBaseLMS : public DataBaseLMS
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
InterfaceDataBaseLMS(QWidget* parent = nullptr);
|
InterfaceDataBaseLMS(QWidget *ownerWidget, QObject *parent = nullptr);
|
||||||
|
|
||||||
public Q_SLOTS:
|
|
||||||
void slot_LanguageChanged(QString language);
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
//Соединение
|
//Соединение
|
||||||
bool ConnectionToDB();
|
bool connectionToDB();
|
||||||
bool DisConnectionFromDB();
|
bool disConnectionFromDB();
|
||||||
bool DBisConnected();
|
bool DBisConnected();
|
||||||
|
|
||||||
|
|
||||||
//Инструкторы
|
//Инструкторы
|
||||||
|
|
||||||
bool AuthorizationInstructor(QString login, QString password);
|
bool authorizationInstructor(QString login, QString password);
|
||||||
bool deAuthorizationInstructor(QString login);
|
bool deAuthorizationInstructor(QString login);
|
||||||
bool deAuthorizationAllInstructors();
|
bool deAuthorizationAllInstructors();
|
||||||
|
|
||||||
@@ -47,16 +43,9 @@ public:
|
|||||||
|
|
||||||
//Обучаемые
|
//Обучаемые
|
||||||
|
|
||||||
bool AuthorizationTrainee(QString login, QString password, QString classroom_name, QString computer_name);
|
bool authorizationTrainee(QString login, QString password, QString classroom_name, QString computer_name);
|
||||||
bool deAuthorizationTrainee(QString login);
|
bool deAuthorizationTrainee(QString login);
|
||||||
bool deAuthorizationAllTrainees();
|
bool deAuthorizationAllTrainees();
|
||||||
|
|
||||||
//Регистрация тайминга Обучаемого
|
|
||||||
int entryTraineeOnSimulator(int id_trainee);
|
|
||||||
int exitTraineeFromSimulator(int id_trainee);
|
|
||||||
|
|
||||||
|
|
||||||
//void setTasks(QString login, QStringList tasks);
|
|
||||||
|
|
||||||
QString getNameTraineeOnComputer(QString computer_name);
|
QString getNameTraineeOnComputer(QString computer_name);
|
||||||
Trainee getTraineeOnComputer(QString computer_name);
|
Trainee getTraineeOnComputer(QString computer_name);
|
||||||
@@ -67,14 +56,30 @@ public:
|
|||||||
QList<Trainee> getListTraineesInGroup(int id);
|
QList<Trainee> getListTraineesInGroup(int id);
|
||||||
QList<Group> getListGroups();
|
QList<Group> getListGroups();
|
||||||
QList<Trainee> getListTrainees();
|
QList<Trainee> getListTrainees();
|
||||||
|
|
||||||
Trainee getTrainee(int id);
|
Trainee getTrainee(int id);
|
||||||
Group getGroup(int group_id);
|
|
||||||
|
|
||||||
|
int newTrainee(int id_group);
|
||||||
|
int delTrainee(int id);
|
||||||
|
int editTrainee(Trainee trainee);
|
||||||
|
|
||||||
|
bool isArchivedTrainee(int id);
|
||||||
|
bool isLoggedInTrainee(int id);
|
||||||
|
|
||||||
|
//Регистрация тайминга Обучаемого
|
||||||
|
int entryTraineeOnSimulator(int id_trainee);
|
||||||
|
int exitTraineeFromSimulator(int id_trainee);
|
||||||
|
|
||||||
|
|
||||||
|
//Группы
|
||||||
|
|
||||||
|
Group getGroup(int group_id);
|
||||||
int newGroup();
|
int newGroup();
|
||||||
int delGroup(int id);
|
int delGroup(int id);
|
||||||
int editGroup(Group group);
|
int editGroup(Group group);
|
||||||
|
|
||||||
|
|
||||||
|
//Задачи
|
||||||
|
|
||||||
int newTaskAMM(TaskAmmFim task, int id_trainee);
|
int newTaskAMM(TaskAmmFim task, int id_trainee);
|
||||||
int delTaskAMM(int id);
|
int delTaskAMM(int id);
|
||||||
int editTaskAMM(TaskAmmFim task);
|
int editTaskAMM(TaskAmmFim task);
|
||||||
@@ -92,15 +97,8 @@ public:
|
|||||||
int changeStatusTaskFIM(int id_task, QString status);
|
int changeStatusTaskFIM(int id_task, QString status);
|
||||||
int changeStatusTaskAMM(int id_task, QString status);
|
int changeStatusTaskAMM(int id_task, QString status);
|
||||||
|
|
||||||
int newTrainee(int id_group);
|
private:
|
||||||
int delTrainee(int id);
|
QWidget* ownerWidget;
|
||||||
int editTrainee(Trainee trainee);
|
|
||||||
|
|
||||||
bool isArchivedTrainee(int id);
|
|
||||||
bool isLoggedInTrainee(int id);
|
|
||||||
|
|
||||||
private:
|
|
||||||
QTranslator qtLanguageTranslator;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // INTERFACEDATABASELMS_H
|
#endif // INTERFACEDATABASELMS_H
|
||||||
|
|||||||
5
DataBaseLMS/resources.qrc
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
<RCC>
|
||||||
|
<qresource prefix="/">
|
||||||
|
<file>resources/blankXML/ErrorDB.xml</file>
|
||||||
|
</qresource>
|
||||||
|
</RCC>
|
||||||
3
DataBaseLMS/resources/blankXML/ErrorDB.xml
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
<?xml version='1.0' encoding='utf-8'?>
|
||||||
|
<ErrorDB>
|
||||||
|
</ErrorDB>
|
||||||
@@ -5,8 +5,8 @@ TimingOfTrainee::TimingOfTrainee(int trainee_id):
|
|||||||
trainee_id(trainee_id)
|
trainee_id(trainee_id)
|
||||||
{
|
{
|
||||||
//QDateTime dataTimeCurr = QDateTime::currentDateTime();
|
//QDateTime dataTimeCurr = QDateTime::currentDateTime();
|
||||||
dataTimeNull = QDateTime::fromString("2000-01-01 00:00:00.000", "yyyy-MM-dd hh:mm:ss.zzz");
|
dataTimeNull = QDateTime::fromString("2000-01-01 00:00", "yyyy-MM-dd hh:mm");
|
||||||
setOperatingTime(QTime::fromString("00:00:00"));
|
setOperatingTime(QTime::fromString("00:00", "hh:mm"));
|
||||||
setEntryTime(dataTimeNull);
|
setEntryTime(dataTimeNull);
|
||||||
setExitTime(dataTimeNull);
|
setExitTime(dataTimeNull);
|
||||||
}
|
}
|
||||||
@@ -21,7 +21,7 @@ void TimingOfTrainee::setEntryTimeS(QString entry_time)
|
|||||||
void TimingOfTrainee::setEntryTime(QDateTime entry_time)
|
void TimingOfTrainee::setEntryTime(QDateTime entry_time)
|
||||||
{
|
{
|
||||||
entryTime = entry_time;
|
entryTime = entry_time;
|
||||||
entryTime_str = entry_time.toString("yyyy-MM-dd hh:mm:ss.zzz");
|
entryTime_str = entry_time.toString("yyyy-MM-dd hh:mm");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -34,7 +34,7 @@ void TimingOfTrainee::setExitTimeS(QString exit_time)
|
|||||||
void TimingOfTrainee::setExitTime(QDateTime exit_time)
|
void TimingOfTrainee::setExitTime(QDateTime exit_time)
|
||||||
{
|
{
|
||||||
exitTime = exit_time;
|
exitTime = exit_time;
|
||||||
exitTime_str = exit_time.toString("yyyy-MM-dd hh:mm:ss.zzz");
|
exitTime_str = exit_time.toString("yyyy-MM-dd hh:mm");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -47,7 +47,7 @@ void TimingOfTrainee::setOperatingTimeS(QString operating_time)
|
|||||||
void TimingOfTrainee::setOperatingTime(QTime operating_time)
|
void TimingOfTrainee::setOperatingTime(QTime operating_time)
|
||||||
{
|
{
|
||||||
operatingTime = operating_time;
|
operatingTime = operating_time;
|
||||||
operatingTime_str = operating_time.toString();
|
operatingTime_str = operating_time.toString("hh:mm");
|
||||||
}
|
}
|
||||||
|
|
||||||
void TimingOfTrainee::fixEntry()
|
void TimingOfTrainee::fixEntry()
|
||||||
|
|||||||
@@ -3,8 +3,9 @@
|
|||||||
|
|
||||||
#include <QString>
|
#include <QString>
|
||||||
#include <QDateTime>
|
#include <QDateTime>
|
||||||
|
#include "DataBaseLMS_global.h"
|
||||||
|
|
||||||
class TimingOfTrainee
|
class DATABASELMS_EXPORT TimingOfTrainee
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
TimingOfTrainee(int trainee_id);
|
TimingOfTrainee(int trainee_id);
|
||||||
|
|||||||
@@ -3,7 +3,13 @@
|
|||||||
Trainee::Trainee():
|
Trainee::Trainee():
|
||||||
User(),
|
User(),
|
||||||
group(),
|
group(),
|
||||||
computer()
|
computer(),
|
||||||
|
timing(0)
|
||||||
{
|
{
|
||||||
|
TypeUserDB = User::TypeUserDBTrainee;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Trainee::setTiming(TimingOfTrainee timing)
|
||||||
|
{
|
||||||
|
this->timing = timing;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,6 +6,7 @@
|
|||||||
#include "user.h"
|
#include "user.h"
|
||||||
#include "group.h"
|
#include "group.h"
|
||||||
#include "computer.h"
|
#include "computer.h"
|
||||||
|
#include "timingoftrainee.h"
|
||||||
|
|
||||||
class DATABASELMS_EXPORT Trainee: public User
|
class DATABASELMS_EXPORT Trainee: public User
|
||||||
{
|
{
|
||||||
@@ -18,9 +19,13 @@ public:
|
|||||||
void setComputer(Computer computer){this->computer = computer;}
|
void setComputer(Computer computer){this->computer = computer;}
|
||||||
Computer getComputer(){return computer;}
|
Computer getComputer(){return computer;}
|
||||||
|
|
||||||
|
TimingOfTrainee getTiming(){return timing;}
|
||||||
|
void setTiming(TimingOfTrainee timing);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Group group;
|
Group group;
|
||||||
Computer computer;
|
Computer computer;
|
||||||
|
TimingOfTrainee timing;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // TRAINEE_H
|
#endif // TRAINEE_H
|
||||||
|
|||||||
@@ -1,108 +1,25 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<!DOCTYPE TS>
|
<!DOCTYPE TS>
|
||||||
<TS version="2.1" language="ru_RU">
|
<TS version="2.1" language="ru_RU">
|
||||||
|
<context>
|
||||||
|
<name>DataBaseLMS</name>
|
||||||
|
<message>
|
||||||
|
<location filename="../databaselms.cpp" line="93"/>
|
||||||
|
<source>Attention!</source>
|
||||||
|
<translation>Внимание!</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../databaselms.cpp" line="93"/>
|
||||||
|
<source>The file could not be opened:</source>
|
||||||
|
<translation>Файл не может быть открыт:</translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
<context>
|
<context>
|
||||||
<name>InterfaceDataBaseLMS</name>
|
<name>InterfaceDataBaseLMS</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../interfacedatabaselms.cpp" line="23"/>
|
<location filename="../interfacedatabaselms.cpp" line="19"/>
|
||||||
<source>Connection error: </source>
|
<source>Connection error</source>
|
||||||
<translation>Ошибка соединения: </translation>
|
<translation>Ошибка подключения</translation>
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="../interfacedatabaselms.cpp" line="121"/>
|
|
||||||
<location filename="../interfacedatabaselms.cpp" line="128"/>
|
|
||||||
<location filename="../interfacedatabaselms.cpp" line="135"/>
|
|
||||||
<location filename="../interfacedatabaselms.cpp" line="142"/>
|
|
||||||
<location filename="../interfacedatabaselms.cpp" line="149"/>
|
|
||||||
<location filename="../interfacedatabaselms.cpp" line="279"/>
|
|
||||||
<location filename="../interfacedatabaselms.cpp" line="286"/>
|
|
||||||
<location filename="../interfacedatabaselms.cpp" line="377"/>
|
|
||||||
<location filename="../interfacedatabaselms.cpp" line="384"/>
|
|
||||||
<location filename="../interfacedatabaselms.cpp" line="391"/>
|
|
||||||
<location filename="../interfacedatabaselms.cpp" line="398"/>
|
|
||||||
<location filename="../interfacedatabaselms.cpp" line="405"/>
|
|
||||||
<source>Editing error!</source>
|
|
||||||
<translation>Ошибка редактирования!</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="../interfacedatabaselms.cpp" line="122"/>
|
|
||||||
<source>Unacceptable instructor name has been entered.
|
|
||||||
The changes will not be accepted.</source>
|
|
||||||
<translation>Введено недопустимое имя инструктора.
|
|
||||||
Изменения не будут приняты.</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="../interfacedatabaselms.cpp" line="129"/>
|
|
||||||
<source>Unacceptable instructor login has been entered.
|
|
||||||
The changes will not be accepted.</source>
|
|
||||||
<translation>Введен недопустимый логин инструктора.
|
|
||||||
Изменения не будут приняты.</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="../interfacedatabaselms.cpp" line="136"/>
|
|
||||||
<source>Unacceptable instructor password has been entered.
|
|
||||||
The changes will not be accepted.</source>
|
|
||||||
<translation>Введен недопустимый пароль инструктора.
|
|
||||||
Изменения не будут приняты.</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="../interfacedatabaselms.cpp" line="143"/>
|
|
||||||
<source>An existing instructor name has been entered.</source>
|
|
||||||
<translation>Введено существующее имя инструктора.</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="../interfacedatabaselms.cpp" line="150"/>
|
|
||||||
<source>An existing instructor login has been entered.
|
|
||||||
The changes will not be accepted.</source>
|
|
||||||
<translation>Введен существующий логин инструктора.
|
|
||||||
Изменения не будут приняты.</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="../interfacedatabaselms.cpp" line="280"/>
|
|
||||||
<source>Unacceptable group name has been entered.
|
|
||||||
The changes will not be accepted.</source>
|
|
||||||
<translation>Введено недопустимое имя группы.
|
|
||||||
Изменения не будут приняты.</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="../interfacedatabaselms.cpp" line="287"/>
|
|
||||||
<source>An existing group name has been entered.
|
|
||||||
The changes will not be accepted.</source>
|
|
||||||
<translation>Введено существующее имя группы.
|
|
||||||
Изменения не будут приняты.</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="../interfacedatabaselms.cpp" line="378"/>
|
|
||||||
<source>Unacceptable trainee name has been entered.
|
|
||||||
The changes will not be accepted.</source>
|
|
||||||
<translation>Введено недопустимое имя обучаемого.
|
|
||||||
Изменения не будут приняты.</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="../interfacedatabaselms.cpp" line="385"/>
|
|
||||||
<source>Unacceptable trainee login has been entered.
|
|
||||||
The changes will not be accepted.</source>
|
|
||||||
<translation>Введен недопустимый логин обучаемого.
|
|
||||||
Изменения не будут приняты.</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="../interfacedatabaselms.cpp" line="392"/>
|
|
||||||
<source>Unacceptable trainee password has been entered.
|
|
||||||
The changes will not be accepted.</source>
|
|
||||||
<translation>Введен недопустимый пароль обучаемого.
|
|
||||||
Изменения не будут приняты.</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="../interfacedatabaselms.cpp" line="399"/>
|
|
||||||
<source>An existing trainee name has been entered.</source>
|
|
||||||
<translation>Введено существующее имя обучаемого.</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="../interfacedatabaselms.cpp" line="406"/>
|
|
||||||
<source>An existing trainee login has been entered.
|
|
||||||
The changes will not be accepted.</source>
|
|
||||||
<translation>Введен существующий логин обучаемого.
|
|
||||||
Изменения не будут приняты.</translation>
|
|
||||||
</message>
|
</message>
|
||||||
</context>
|
</context>
|
||||||
</TS>
|
</TS>
|
||||||
|
|||||||
@@ -1,11 +1,16 @@
|
|||||||
#include "user.h"
|
#include "user.h"
|
||||||
|
|
||||||
|
const QString User::TypeUserDBInstructor = "instructor";
|
||||||
|
const QString User::TypeUserDBTrainee = "trainee";
|
||||||
|
|
||||||
User::User():
|
User::User():
|
||||||
BasicEntity(),
|
BasicEntity(),
|
||||||
login(),
|
login(),
|
||||||
password(),
|
password(),
|
||||||
archived(),
|
archived(),
|
||||||
loggedIn()
|
loggedIn(),
|
||||||
|
TypeUserDB(),
|
||||||
|
isAdmin(false)
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,8 +3,11 @@
|
|||||||
|
|
||||||
#include "basicentity.h"
|
#include "basicentity.h"
|
||||||
|
|
||||||
class User: public BasicEntity
|
class DATABASELMS_EXPORT User: public BasicEntity
|
||||||
{
|
{
|
||||||
|
public:
|
||||||
|
static const QString TypeUserDBInstructor;
|
||||||
|
static const QString TypeUserDBTrainee;
|
||||||
public:
|
public:
|
||||||
User();
|
User();
|
||||||
|
|
||||||
@@ -20,11 +23,17 @@ public:
|
|||||||
void setLoggedIn(bool loggedIn){this->loggedIn = loggedIn;}
|
void setLoggedIn(bool loggedIn){this->loggedIn = loggedIn;}
|
||||||
bool getLoggedIn(){return loggedIn;}
|
bool getLoggedIn(){return loggedIn;}
|
||||||
|
|
||||||
|
QString getTypeUserDB(){return TypeUserDB;}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
QString login;
|
QString login;
|
||||||
QString password;
|
QString password;
|
||||||
bool archived;
|
bool archived;
|
||||||
bool loggedIn;
|
bool loggedIn;
|
||||||
|
protected:
|
||||||
|
QString TypeUserDB;
|
||||||
|
|
||||||
|
bool isAdmin;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // USER_H
|
#endif // USER_H
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ main.cpp
|
|||||||
mainwindow.cpp
|
mainwindow.cpp
|
||||||
mainwindow.h
|
mainwindow.h
|
||||||
mainwindow.ui
|
mainwindow.ui
|
||||||
testDBpgSQL.qrc
|
GUIdataBaseLMS.qrc
|
||||||
)
|
)
|
||||||
|
|
||||||
target_link_libraries(GUIdataBaseLMS PRIVATE Qt5::Widgets)
|
target_link_libraries(GUIdataBaseLMS PRIVATE Qt5::Widgets)
|
||||||
|
|||||||
@@ -1,2 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<AuthData Login="admin" Password="admin" InstructorName="Администратор" ClientName="Администратор" AccessType="instructor"/>
|
|
||||||
@@ -1,4 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<ServerSettingsContainer>
|
|
||||||
<ServerSettings Address="192.168.100.87" Port="6000" Language="RUS" AutoStart="0"/>
|
|
||||||
</ServerSettingsContainer>
|
|
||||||
@@ -1,2 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<ClientDeAutorization Login="admin"/>
|
|
||||||
@@ -8,35 +8,27 @@
|
|||||||
MainWindow::MainWindow(QWidget *parent)
|
MainWindow::MainWindow(QWidget *parent)
|
||||||
: QMainWindow(parent),
|
: QMainWindow(parent),
|
||||||
ui(new Ui::MainWindow),
|
ui(new Ui::MainWindow),
|
||||||
m_instructorsAndTraineesWidget(nullptr)
|
instructorsAndTraineesWidget(nullptr)
|
||||||
{
|
{
|
||||||
ui->setupUi(this);
|
ui->setupUi(this);
|
||||||
|
|
||||||
m_instructorsAndTraineesWidget = new InstructorsAndTraineesWidget(this);
|
instructorsAndTraineesWidget = new InstructorsAndTraineesWidget(this);
|
||||||
|
|
||||||
connect(m_instructorsAndTraineesWidget,&InstructorsAndTraineesWidget::signal_LanguageChanged,this,&MainWindow::slot_LanguageChanged);
|
connect(instructorsAndTraineesWidget, &InstructorsAndTraineesWidget::signal_LanguageChanged, this, &MainWindow::slot_LanguageChanged);
|
||||||
|
|
||||||
ui->horizontalLayout->addWidget(m_instructorsAndTraineesWidget);
|
ui->horizontalLayout->addWidget(instructorsAndTraineesWidget);
|
||||||
|
|
||||||
//this->move(0, 0);
|
this->move(0, 0);
|
||||||
//this->showNormal();
|
//this->showNormal();
|
||||||
this->showMaximized();
|
this->showMaximized();
|
||||||
|
|
||||||
if(m_instructorsAndTraineesWidget->getLanguage() == "ENG")
|
qtLanguageTranslator.load(QString("translations/GUIdataBaseLMS_") + instructorsAndTraineesWidget->getLanguage(), ".");
|
||||||
{
|
qApp->installTranslator(&qtLanguageTranslator);
|
||||||
qtLanguageTranslator.load(QString("translations/GUIdataBaseLMS_") + "en_EN", ".");
|
|
||||||
qApp->installTranslator(&qtLanguageTranslator);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
qtLanguageTranslator.load(QString("translations/GUIdataBaseLMS_") + "ru_RU", ".");
|
|
||||||
qApp->installTranslator(&qtLanguageTranslator);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
MainWindow::~MainWindow()
|
MainWindow::~MainWindow()
|
||||||
{
|
{
|
||||||
delete m_instructorsAndTraineesWidget;
|
delete instructorsAndTraineesWidget;
|
||||||
delete ui;
|
delete ui;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -30,6 +30,6 @@ private:
|
|||||||
Ui::MainWindow *ui;
|
Ui::MainWindow *ui;
|
||||||
QTranslator qtLanguageTranslator;
|
QTranslator qtLanguageTranslator;
|
||||||
|
|
||||||
InstructorsAndTraineesWidget* m_instructorsAndTraineesWidget;
|
InstructorsAndTraineesWidget* instructorsAndTraineesWidget;
|
||||||
};
|
};
|
||||||
#endif // MAINWINDOW_H
|
#endif // MAINWINDOW_H
|
||||||
|
|||||||
@@ -10,11 +10,16 @@
|
|||||||
<height>600</height>
|
<height>600</height>
|
||||||
</rect>
|
</rect>
|
||||||
</property>
|
</property>
|
||||||
|
<property name="font">
|
||||||
|
<font>
|
||||||
|
<family>Tahoma</family>
|
||||||
|
</font>
|
||||||
|
</property>
|
||||||
<property name="windowTitle">
|
<property name="windowTitle">
|
||||||
<string>Learning management system (LMS)</string>
|
<string>Learning management system (LMS)</string>
|
||||||
</property>
|
</property>
|
||||||
<property name="windowIcon">
|
<property name="windowIcon">
|
||||||
<iconset resource="testDBpgSQL.qrc">
|
<iconset resource="GUIdataBaseLMS.qrc">
|
||||||
<normaloff>:/resources/lms.png</normaloff>:/resources/lms.png</iconset>
|
<normaloff>:/resources/lms.png</normaloff>:/resources/lms.png</iconset>
|
||||||
</property>
|
</property>
|
||||||
<property name="toolButtonStyle">
|
<property name="toolButtonStyle">
|
||||||
@@ -42,7 +47,7 @@
|
|||||||
</widget>
|
</widget>
|
||||||
</widget>
|
</widget>
|
||||||
<resources>
|
<resources>
|
||||||
<include location="testDBpgSQL.qrc"/>
|
<include location="GUIdataBaseLMS.qrc"/>
|
||||||
</resources>
|
</resources>
|
||||||
<connections/>
|
<connections/>
|
||||||
</ui>
|
</ui>
|
||||||
|
|||||||
@@ -4,7 +4,7 @@
|
|||||||
<context>
|
<context>
|
||||||
<name>MainWindow</name>
|
<name>MainWindow</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../mainwindow.ui" line="14"/>
|
<location filename="../mainwindow.ui" line="19"/>
|
||||||
<source>Learning management system (LMS)</source>
|
<source>Learning management system (LMS)</source>
|
||||||
<translation>Система управления обучением (СУО)</translation>
|
<translation>Система управления обучением (СУО)</translation>
|
||||||
</message>
|
</message>
|
||||||
|
|||||||
@@ -3,15 +3,24 @@ project(InstructorsAndTrainees LANGUAGES CXX)
|
|||||||
common_info_for_project(InstructorsAndTrainees)
|
common_info_for_project(InstructorsAndTrainees)
|
||||||
|
|
||||||
add_library(InstructorsAndTrainees SHARED
|
add_library(InstructorsAndTrainees SHARED
|
||||||
|
metatypes.h
|
||||||
|
metatypes.cpp
|
||||||
|
|
||||||
instructorsAndTrainees_global.h
|
instructorsAndTrainees_global.h
|
||||||
instructorsandtraineeswidget.cpp
|
instructorsandtraineeswidget.cpp
|
||||||
instructorsandtraineeswidget.h
|
instructorsandtraineeswidget.h
|
||||||
instructorsandtraineeswidget.ui
|
instructorsandtraineeswidget.ui
|
||||||
|
|
||||||
dialogsettings.cpp
|
dialogsettings.cpp
|
||||||
dialogsettings.h
|
dialogsettings.h
|
||||||
dialogsettings.ui
|
dialogsettings.ui
|
||||||
|
|
||||||
commonview.cpp
|
commonview.cpp
|
||||||
commonview.h
|
commonview.h
|
||||||
|
|
||||||
|
specialmessagebox.cpp
|
||||||
|
specialmessagebox.h
|
||||||
|
specialmessagebox.ui
|
||||||
|
|
||||||
trainees/editortrainees.cpp
|
trainees/editortrainees.cpp
|
||||||
trainees/editortrainees.h
|
trainees/editortrainees.h
|
||||||
@@ -28,7 +37,14 @@ add_library(InstructorsAndTrainees SHARED
|
|||||||
trainees/viewertrainees.h
|
trainees/viewertrainees.h
|
||||||
trainees/viewertrainees.ui
|
trainees/viewertrainees.ui
|
||||||
trainees/traineesview.cpp
|
trainees/traineesview.cpp
|
||||||
trainees/traineesview.h
|
trainees/traineesview.h
|
||||||
|
trainees/personalcardtrainee.cpp
|
||||||
|
trainees/personalcardtrainee.h
|
||||||
|
trainees/personalcardtrainee.ui
|
||||||
|
trainees/dialogcardtrainee.cpp
|
||||||
|
trainees/dialogcardtrainee.h
|
||||||
|
trainees/dialogredactortrainees.cpp
|
||||||
|
trainees/dialogredactortrainees.h
|
||||||
|
|
||||||
instructors/viewerinstructors.cpp
|
instructors/viewerinstructors.cpp
|
||||||
instructors/viewerinstructors.h
|
instructors/viewerinstructors.h
|
||||||
@@ -44,6 +60,8 @@ add_library(InstructorsAndTrainees SHARED
|
|||||||
instructors/dialogauthorizationinstructor.ui
|
instructors/dialogauthorizationinstructor.ui
|
||||||
instructors/instructorsview.cpp
|
instructors/instructorsview.cpp
|
||||||
instructors/instructorsview.h
|
instructors/instructorsview.h
|
||||||
|
instructors/dialogredactorinstructors.cpp
|
||||||
|
instructors/dialogredactorinstructors.h
|
||||||
|
|
||||||
connectorToServer/connectortoserver.cpp
|
connectorToServer/connectortoserver.cpp
|
||||||
connectorToServer/connectortoserver.h
|
connectorToServer/connectortoserver.h
|
||||||
@@ -64,6 +82,7 @@ add_library(InstructorsAndTrainees SHARED
|
|||||||
connectorToServer/Core/versioncontainer.h
|
connectorToServer/Core/versioncontainer.h
|
||||||
connectorToServer/Datas.h
|
connectorToServer/Datas.h
|
||||||
connectorToServer/streamingversiondata.h
|
connectorToServer/streamingversiondata.h
|
||||||
|
|
||||||
messanger/messangerwidget.cpp
|
messanger/messangerwidget.cpp
|
||||||
messanger/messangerwidget.h
|
messanger/messangerwidget.h
|
||||||
messanger/messangerwidget.ui
|
messanger/messangerwidget.ui
|
||||||
@@ -72,6 +91,8 @@ add_library(InstructorsAndTrainees SHARED
|
|||||||
messanger/msgwidget.ui
|
messanger/msgwidget.ui
|
||||||
messanger/tabdialogmessenger.cpp
|
messanger/tabdialogmessenger.cpp
|
||||||
messanger/tabdialogmessenger.h
|
messanger/tabdialogmessenger.h
|
||||||
|
messanger/messangercontroller.cpp
|
||||||
|
messanger/messangercontroller.h
|
||||||
|
|
||||||
tasks/ammtaskswidget.cpp
|
tasks/ammtaskswidget.cpp
|
||||||
tasks/ammtaskswidget.h
|
tasks/ammtaskswidget.h
|
||||||
@@ -83,12 +104,13 @@ add_library(InstructorsAndTrainees SHARED
|
|||||||
tasks/fimtaskswidget.ui
|
tasks/fimtaskswidget.ui
|
||||||
tasks/tasktreepreparation.cpp
|
tasks/tasktreepreparation.cpp
|
||||||
tasks/tasktreepreparation.h
|
tasks/tasktreepreparation.h
|
||||||
tasks/dialogchecktask.cpp
|
tasks/checkertask.cpp
|
||||||
tasks/dialogchecktask.h
|
tasks/checkertask.h
|
||||||
tasks/dialogchecktask.ui
|
tasks/checkertask.ui
|
||||||
#tasks/tasksAmmFim.cpp
|
tasks/dialogchekertask.cpp
|
||||||
#tasks/tasksAmmFim.h
|
tasks/dialogchekertask.h
|
||||||
widgets/newversionwidget.cpp
|
|
||||||
|
widgets/newversionwidget.cpp
|
||||||
widgets/newversionwidget.h
|
widgets/newversionwidget.h
|
||||||
widgets/newversionwidget.ui
|
widgets/newversionwidget.ui
|
||||||
widgets/versionselectwidget.cpp
|
widgets/versionselectwidget.cpp
|
||||||
|
|||||||
@@ -1,12 +1,15 @@
|
|||||||
#include "commonview.h"
|
#include "commonview.h"
|
||||||
#include <QFile>
|
#include <QFile>
|
||||||
#include <QMessageBox>
|
#include <QMessageBox>
|
||||||
|
#include <QScrollBar>
|
||||||
|
#include <QResizeEvent>
|
||||||
|
|
||||||
|
|
||||||
CommonView::CommonView(ConnectorToServer* connectorToServer, TypeView type, QWidget *parent):
|
CommonView::CommonView(ConnectorToServer* connectorToServer, TypeView type, QWidget *parent):
|
||||||
QWidget(parent),
|
QWidget(parent),
|
||||||
connectorToServer(connectorToServer),
|
connectorToServer(connectorToServer),
|
||||||
treeWidget(nullptr),
|
treeWidget(nullptr),
|
||||||
|
TypeUserDB(User::TypeUserDBInstructor),
|
||||||
typeView(type),
|
typeView(type),
|
||||||
archiveVisible(false),
|
archiveVisible(false),
|
||||||
notLoggedInVisible(true),
|
notLoggedInVisible(true),
|
||||||
@@ -19,6 +22,8 @@ CommonView::CommonView(ConnectorToServer* connectorToServer, TypeView type, QWid
|
|||||||
treeWidget = new QTreeWidget();
|
treeWidget = new QTreeWidget();
|
||||||
treeWidget->setFocusPolicy(Qt::FocusPolicy::NoFocus);
|
treeWidget->setFocusPolicy(Qt::FocusPolicy::NoFocus);
|
||||||
|
|
||||||
|
treeWidget->setEnabled(false);
|
||||||
|
|
||||||
waitAnimationWidget = new WaitAnimationWidget;
|
waitAnimationWidget = new WaitAnimationWidget;
|
||||||
QMovie *movie = new QMovie(":/resources/icons/762.gif");
|
QMovie *movie = new QMovie(":/resources/icons/762.gif");
|
||||||
//waitAnimationWidget->setParent(this);
|
//waitAnimationWidget->setParent(this);
|
||||||
@@ -46,3 +51,115 @@ void CommonView::setItemColor(QTreeWidgetItem *item, QColor color)
|
|||||||
for (int i = 0; i < item->columnCount(); i++)
|
for (int i = 0; i < item->columnCount(); i++)
|
||||||
item->setBackground(i, color);
|
item->setBackground(i, color);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int CommonView::calculateWidth_0Column()
|
||||||
|
{
|
||||||
|
int widthHeader = treeWidget->width() - 10;
|
||||||
|
int width0Column = 0;
|
||||||
|
int widthSB = 0;
|
||||||
|
if(treeWidget->verticalScrollBar()->isVisible())
|
||||||
|
widthSB = treeWidget->verticalScrollBar()->size().width();
|
||||||
|
int cntColumns = treeWidget->columnCount();
|
||||||
|
int widthRightColumns = 0;
|
||||||
|
for (int i = 1; i < cntColumns; i++)
|
||||||
|
{
|
||||||
|
if(! treeWidget->isColumnHidden(i))
|
||||||
|
{//Колонка не скрыта
|
||||||
|
int w = listWidthColumn.at(i);
|
||||||
|
widthRightColumns += w;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
width0Column = widthHeader - widthRightColumns - widthSB;
|
||||||
|
|
||||||
|
return width0Column;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CommonView::setWidthColumnsTree()
|
||||||
|
{
|
||||||
|
listWidthColumn.clear();
|
||||||
|
|
||||||
|
treeWidget->setColumnWidth(ColumnsTreeUsers::clmn_Name, 100);
|
||||||
|
listWidthColumn.append(100);
|
||||||
|
treeWidget->setColumnWidth(ColumnsTreeUsers::clmn_Login, 100);
|
||||||
|
listWidthColumn.append(100);
|
||||||
|
treeWidget->setColumnWidth(ColumnsTreeUsers::clmn_Password, 100);
|
||||||
|
listWidthColumn.append(100);
|
||||||
|
|
||||||
|
treeWidget->setColumnWidth(ColumnsTreeUsers::clmn_Class, 100);
|
||||||
|
listWidthColumn.append(100);
|
||||||
|
treeWidget->setColumnWidth(ColumnsTreeUsers::clmn_Computer, 100);
|
||||||
|
listWidthColumn.append(100);
|
||||||
|
treeWidget->setColumnWidth(ColumnsTreeUsers::clmn_IP_address, 100);
|
||||||
|
listWidthColumn.append(100);
|
||||||
|
|
||||||
|
treeWidget->setColumnWidth(ColumnsTreeUsers::clmn_Administrator, 140);
|
||||||
|
listWidthColumn.append(140);
|
||||||
|
treeWidget->setColumnWidth(ColumnsTreeUsers::clmn_Archived, 100);
|
||||||
|
listWidthColumn.append(100);
|
||||||
|
treeWidget->setColumnWidth(ColumnsTreeUsers::clmn_Logged, 120);
|
||||||
|
listWidthColumn.append(120);
|
||||||
|
treeWidget->setColumnWidth(ColumnsTreeUsers::clmn_ID, 100);
|
||||||
|
listWidthColumn.append(100);
|
||||||
|
|
||||||
|
treeWidget->setColumnWidth(ColumnsTreeUsers::clmn_Name, calculateWidth_0Column());
|
||||||
|
}
|
||||||
|
|
||||||
|
void CommonView::reSetHeadTreeWidget()
|
||||||
|
{
|
||||||
|
QStringList listHeaders = {tr("Name"), tr("Login"), tr("Password"), tr("Class"), tr("Computer"), tr("IP address"), tr("Administrator"), tr("Archived"), tr("Logged"), tr("ID")};
|
||||||
|
treeWidget->setHeaderLabels(listHeaders);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CommonView::preparationTreeWidget()
|
||||||
|
{
|
||||||
|
mtxTreeWidget.lock();
|
||||||
|
|
||||||
|
treeWidget->setColumnCount(clmn_count);
|
||||||
|
|
||||||
|
reSetHeadTreeWidget();
|
||||||
|
|
||||||
|
if(typeView == TypeView::onlyView)
|
||||||
|
{//onlyView
|
||||||
|
archiveVisible = false;
|
||||||
|
|
||||||
|
treeWidget->setColumnHidden(ColumnsTreeUsers::clmn_ID, true);
|
||||||
|
treeWidget->setColumnHidden(ColumnsTreeUsers::clmn_Password, true);
|
||||||
|
treeWidget->setColumnHidden(ColumnsTreeUsers::clmn_Archived, true);
|
||||||
|
treeWidget->setColumnHidden(ColumnsTreeUsers::clmn_Administrator, true);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{//control
|
||||||
|
archiveVisible = true;
|
||||||
|
|
||||||
|
if(adminMode)
|
||||||
|
{
|
||||||
|
#ifdef PROJECT_TYPE_DEBUG
|
||||||
|
treeWidget->setColumnHidden(ColumnsTreeUsers::clmn_ID, false);
|
||||||
|
#else
|
||||||
|
treeWidget->setColumnHidden(ColumnsTreeUsers::clmn_ID, true);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
treeWidget->setColumnHidden(ColumnsTreeUsers::clmn_ID, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
treeWidget->setColumnHidden(ColumnsTreeUsers::clmn_Class, true);
|
||||||
|
treeWidget->setColumnHidden(ColumnsTreeUsers::clmn_Computer, true);
|
||||||
|
treeWidget->setColumnHidden(ColumnsTreeUsers::clmn_IP_address, true);
|
||||||
|
if(TypeUserDB == User::TypeUserDBTrainee)
|
||||||
|
treeWidget->setColumnHidden(ColumnsTreeUsers::clmn_Administrator, true);
|
||||||
|
|
||||||
|
treeWidget->setSortingEnabled(true);
|
||||||
|
treeWidget->sortItems(ColumnsTreeUsers::clmn_Name, Qt::SortOrder::AscendingOrder);
|
||||||
|
|
||||||
|
mtxTreeWidget.unlock();
|
||||||
|
}
|
||||||
|
|
||||||
|
void CommonView::resizeEvent(QResizeEvent *event)
|
||||||
|
{
|
||||||
|
setWidthColumnsTree();
|
||||||
|
|
||||||
|
QSize size = event->size();
|
||||||
|
waitAnimationWidget->resize(size);
|
||||||
|
}
|
||||||
|
|||||||
@@ -27,18 +27,45 @@ public:
|
|||||||
objGroup
|
objGroup
|
||||||
};
|
};
|
||||||
|
|
||||||
|
protected:
|
||||||
|
enum ColumnsTreeUsers{
|
||||||
|
clmn_Name = 0,
|
||||||
|
clmn_Login,
|
||||||
|
clmn_Password,
|
||||||
|
clmn_Class,
|
||||||
|
clmn_Computer,
|
||||||
|
clmn_IP_address,
|
||||||
|
clmn_Administrator,
|
||||||
|
clmn_Archived,
|
||||||
|
clmn_Logged,
|
||||||
|
clmn_ID,
|
||||||
|
clmn_count
|
||||||
|
};
|
||||||
|
|
||||||
public:
|
public:
|
||||||
CommonView(ConnectorToServer* connectorToServer, TypeView type, QWidget *parent = nullptr);
|
CommonView(ConnectorToServer* connectorToServer, TypeView type, QWidget *parent = nullptr);
|
||||||
~CommonView();
|
~CommonView();
|
||||||
|
|
||||||
|
void resizeEvent(QResizeEvent *event) override;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
void setAdminMode(bool adminMode)
|
void setAdminMode(bool adminMode)
|
||||||
{
|
{
|
||||||
this->adminMode = adminMode;
|
this->adminMode = adminMode;
|
||||||
}
|
}
|
||||||
|
void activate()
|
||||||
|
{
|
||||||
|
treeWidget->setEnabled(true);
|
||||||
|
}
|
||||||
void deactivate()
|
void deactivate()
|
||||||
{
|
{
|
||||||
treeWidget->clear();
|
treeWidget->clear();
|
||||||
|
treeWidget->setEnabled(false);
|
||||||
|
lastCurrentID = 0;
|
||||||
|
}
|
||||||
|
void clearSelection()
|
||||||
|
{
|
||||||
|
treeWidget->clearSelection();
|
||||||
lastCurrentID = 0;
|
lastCurrentID = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -57,9 +84,20 @@ protected:
|
|||||||
|
|
||||||
void setItemColor(QTreeWidgetItem* item, QColor color);
|
void setItemColor(QTreeWidgetItem* item, QColor color);
|
||||||
|
|
||||||
|
void preparationTreeWidget();
|
||||||
|
|
||||||
|
private:
|
||||||
|
int calculateWidth_0Column();
|
||||||
|
void setWidthColumnsTree();
|
||||||
|
|
||||||
|
protected:
|
||||||
|
void reSetHeadTreeWidget();
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
ConnectorToServer* connectorToServer;
|
ConnectorToServer* connectorToServer;
|
||||||
QTreeWidget* treeWidget;
|
QTreeWidget* treeWidget;
|
||||||
|
QList<int> listWidthColumn;
|
||||||
|
QString TypeUserDB;
|
||||||
QMutex mtxTreeWidget;
|
QMutex mtxTreeWidget;
|
||||||
TypeView typeView;
|
TypeView typeView;
|
||||||
bool archiveVisible;
|
bool archiveVisible;
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
#include "notifycontroller.h"
|
#include "notifycontroller.h"
|
||||||
|
#include "specialmessagebox.h"
|
||||||
|
|
||||||
NotifyController::NotifyController(QObject *parent) : QObject(parent)
|
NotifyController::NotifyController(QObject *parent) : QObject(parent)
|
||||||
{
|
{
|
||||||
@@ -7,10 +8,5 @@ NotifyController::NotifyController(QObject *parent) : QObject(parent)
|
|||||||
|
|
||||||
void NotifyController::showWarning(QString text)
|
void NotifyController::showWarning(QString text)
|
||||||
{
|
{
|
||||||
QMessageBox warning;
|
SpecialMessageBox(nullptr, SpecialMessageBox::TypeSpecMsgBox::warningClose, text).exec();
|
||||||
warning.setText(text);
|
|
||||||
|
|
||||||
warning.setIcon(QMessageBox::Warning);
|
|
||||||
warning.setWindowTitle(tr("Error"));
|
|
||||||
warning.exec();
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,6 +5,8 @@
|
|||||||
#include <QMessageBox>
|
#include <QMessageBox>
|
||||||
#include "instructor.h"
|
#include "instructor.h"
|
||||||
#include "tasksAmmFim.h"
|
#include "tasksAmmFim.h"
|
||||||
|
#include "timingoftrainee.h"
|
||||||
|
#include "specialmessagebox.h"
|
||||||
|
|
||||||
|
|
||||||
RecognizeSystem::RecognizeSystem(QObject *parent):
|
RecognizeSystem::RecognizeSystem(QObject *parent):
|
||||||
@@ -391,7 +393,7 @@ void RecognizeSystem::recognize(QTcpSocket *socket)
|
|||||||
QFile xmlInFile(xmlFileName);
|
QFile xmlInFile(xmlFileName);
|
||||||
if (!xmlInFile.open(QFile::ReadOnly | QFile::Text))
|
if (!xmlInFile.open(QFile::ReadOnly | QFile::Text))
|
||||||
{
|
{
|
||||||
QMessageBox::critical(nullptr, tr("Attention!"), tr("The file could not be opened ") + xmlFileName);
|
SpecialMessageBox(nullptr, SpecialMessageBox::TypeSpecMsgBox::critical, tr("The file could not be opened ") + xmlFileName).exec();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -699,6 +701,18 @@ void RecognizeSystem::xmlParserQueryToDB(PacketType packetType, QByteArray array
|
|||||||
//trainee.setComputer()
|
//trainee.setComputer()
|
||||||
//trainee.setTasks()
|
//trainee.setTasks()
|
||||||
|
|
||||||
|
|
||||||
|
//Тайминг
|
||||||
|
QDomNode timingNode = traineeNode.firstChildElement("timing");
|
||||||
|
|
||||||
|
TimingOfTrainee timing(trainee.getID());
|
||||||
|
timing.setEntryTimeS(timingNode.toElement().attribute("entryTime"));
|
||||||
|
timing.setExitTimeS(timingNode.toElement().attribute("exitTime"));
|
||||||
|
timing.setOperatingTimeS(timingNode.toElement().attribute("operatingTime"));
|
||||||
|
|
||||||
|
trainee.setTiming(timing);
|
||||||
|
|
||||||
|
|
||||||
listTrainees.append(trainee);
|
listTrainees.append(trainee);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -31,16 +31,16 @@ void SendSystem::sendDisable()
|
|||||||
socket->waitForBytesWritten();
|
socket->waitForBytesWritten();
|
||||||
}
|
}
|
||||||
|
|
||||||
void SendSystem::sendXMLmsgGUItoServer(QByteArray array)
|
//void SendSystem::sendXMLmsgGUItoServer(QByteArray array)
|
||||||
{
|
//{
|
||||||
qDebug() << "SendSystem" << QThread::currentThreadId();
|
// qDebug() << "SendSystem" << QThread::currentThreadId();
|
||||||
QDataStream stream(socket);
|
// QDataStream stream(socket);
|
||||||
stream.setVersion(QDataStream::Qt_DefaultCompiledVersion);
|
// stream.setVersion(QDataStream::Qt_DefaultCompiledVersion);
|
||||||
|
|
||||||
stream << PacketType::TYPE_XMLANSWER;
|
// stream << PacketType::TYPE_XMLANSWER;
|
||||||
stream << array;
|
// stream << array;
|
||||||
socket->waitForBytesWritten(6000);
|
// socket->waitForBytesWritten(6000);
|
||||||
}
|
//}
|
||||||
|
|
||||||
void SendSystem::sendFileBlock(QString path)
|
void SendSystem::sendFileBlock(QString path)
|
||||||
{
|
{
|
||||||
@@ -139,14 +139,6 @@ void SendSystem::sendChangeVersion(StreamingVersionData *streamingVersion)
|
|||||||
socket->waitForReadyRead(100);
|
socket->waitForReadyRead(100);
|
||||||
}
|
}
|
||||||
|
|
||||||
void SendSystem::sendOldMessages()
|
|
||||||
{
|
|
||||||
QDataStream stream(socket);
|
|
||||||
stream.setVersion(QDataStream::Qt_DefaultCompiledVersion);
|
|
||||||
stream << PacketType::TYPE_GET_OLD_MESSAGES;
|
|
||||||
socket->waitForReadyRead(100);
|
|
||||||
}
|
|
||||||
|
|
||||||
void SendSystem::sendDeleteVersion(StreamingVersionData *streamingVersion)
|
void SendSystem::sendDeleteVersion(StreamingVersionData *streamingVersion)
|
||||||
{
|
{
|
||||||
QDataStream stream(socket);
|
QDataStream stream(socket);
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ class SendSystem :public QObject
|
|||||||
public:
|
public:
|
||||||
explicit SendSystem(QObject* parent = nullptr);
|
explicit SendSystem(QObject* parent = nullptr);
|
||||||
void setSocket(QTcpSocket *socket);
|
void setSocket(QTcpSocket *socket);
|
||||||
void sendXMLmsgGUItoServer(QByteArray array);
|
//void sendXMLmsgGUItoServer(QByteArray array);
|
||||||
void sendDisable();
|
void sendDisable();
|
||||||
void sendFileBlock(QString path);
|
void sendFileBlock(QString path);
|
||||||
void sendFolderBlock(QString path);
|
void sendFolderBlock(QString path);
|
||||||
@@ -26,8 +26,6 @@ public:
|
|||||||
void sendDeleteVersion(StreamingVersionData *streamingVersion);
|
void sendDeleteVersion(StreamingVersionData *streamingVersion);
|
||||||
void sendCopyVersion(QString versionName);
|
void sendCopyVersion(QString versionName);
|
||||||
void sendPacketType(PacketType packetType);
|
void sendPacketType(PacketType packetType);
|
||||||
|
|
||||||
void sendOldMessages();
|
|
||||||
signals:
|
signals:
|
||||||
void sigSend();
|
void sigSend();
|
||||||
QByteArray sigGetXmlAnswer(QString);
|
QByteArray sigGetXmlAnswer(QString);
|
||||||
|
|||||||
@@ -21,6 +21,7 @@ static QString streamingHashFilename = staticDataFolderName + "/streamingHash.xm
|
|||||||
static QString serverHash = staticDataFolderName + "/serverHash.xml";
|
static QString serverHash = staticDataFolderName + "/serverHash.xml";
|
||||||
|
|
||||||
static QString cmd_CheckVersionList = "CHECKVERSIONLIST";
|
static QString cmd_CheckVersionList = "CHECKVERSIONLIST";
|
||||||
|
static QString cmd_GetOfflineMessages = "GETOFFLINEMESSAGE";
|
||||||
|
|
||||||
enum PacketType{
|
enum PacketType{
|
||||||
TYPE_NONE = 0,
|
TYPE_NONE = 0,
|
||||||
@@ -61,7 +62,7 @@ enum PacketType{
|
|||||||
FREE = 155
|
FREE = 155
|
||||||
};
|
};
|
||||||
|
|
||||||
Q_DECLARE_METATYPE(PacketType)
|
//Q_DECLARE_METATYPE(PacketType)
|
||||||
|
|
||||||
class Tools {
|
class Tools {
|
||||||
public:
|
public:
|
||||||
|
|||||||
@@ -77,15 +77,17 @@ public:
|
|||||||
QString fromId;//формат id-typeId
|
QString fromId;//формат id-typeId
|
||||||
QString toId;//формат id-typeId
|
QString toId;//формат id-typeId
|
||||||
QString Text;
|
QString Text;
|
||||||
|
QString timeStr;
|
||||||
|
|
||||||
//TypeId
|
//TypeId
|
||||||
//0 - инструктор, 1 - обучаемый
|
//0 - инструктор, 1 - обучаемый
|
||||||
ClientMessage(){}
|
ClientMessage(){}
|
||||||
ClientMessage(QString fromId, QString toId, QString text)
|
ClientMessage(QString fromId, QString toId, QString text, QString timeStr = "")
|
||||||
{
|
{
|
||||||
this->fromId = fromId;
|
this->fromId = fromId;
|
||||||
this->toId = toId;
|
this->toId = toId;
|
||||||
this->Text = text;
|
this->Text = text;
|
||||||
|
this->timeStr = timeStr;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -11,7 +11,8 @@ ConnectorToServer::ConnectorToServer(QWidget* parentWidget, QObject *parent) :
|
|||||||
recognizeSystem(nullptr),
|
recognizeSystem(nullptr),
|
||||||
versionSelectWidget(nullptr),
|
versionSelectWidget(nullptr),
|
||||||
versionContainer(nullptr),
|
versionContainer(nullptr),
|
||||||
notifyController(nullptr)
|
notifyController(nullptr),
|
||||||
|
fl_GetedOfflineMessages(false)
|
||||||
{
|
{
|
||||||
initialize();
|
initialize();
|
||||||
}
|
}
|
||||||
@@ -44,7 +45,7 @@ bool ConnectorToServer::authorizationInstructorLocal(QString login, QString pass
|
|||||||
autorization->TypeClient = TypeClientAutorization::TYPE_GUI;
|
autorization->TypeClient = TypeClientAutorization::TYPE_GUI;
|
||||||
|
|
||||||
QByteArray array = dataParser->createAuthMessage(autorization);
|
QByteArray array = dataParser->createAuthMessage(autorization);
|
||||||
emit signal_sendXMLmsgGUItoServer(array);
|
emit sigSendAnswerToServer(array);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -60,7 +61,7 @@ bool ConnectorToServer::deAuthorizationInstructorLocal(QString login)
|
|||||||
deAutorization->Login = login;
|
deAutorization->Login = login;
|
||||||
|
|
||||||
QByteArray array = dataParser->createDeAuthMessage(deAutorization);
|
QByteArray array = dataParser->createDeAuthMessage(deAutorization);
|
||||||
emit signal_sendXMLmsgGUItoServer(array);
|
emit sigSendAnswerToServer(array);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -76,7 +77,7 @@ bool ConnectorToServer::sendQueryToDB(TypeQueryToDB typeQuery, int id, void* dat
|
|||||||
queryToDB->typeQuery = typeQuery;
|
queryToDB->typeQuery = typeQuery;
|
||||||
|
|
||||||
QByteArray array = dataParser->createQueryToDBMessage(queryToDB, id, data);
|
QByteArray array = dataParser->createQueryToDBMessage(queryToDB, id, data);
|
||||||
emit signal_sendXMLmsgGUItoServer(array);
|
emit sigSendAnswerToServer(array);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -88,11 +89,17 @@ bool ConnectorToServer::sendMessage(ClientMessage clientMessage)
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
QByteArray array = dataParser->createMessage(clientMessage);
|
QByteArray array = dataParser->createMessage(clientMessage);
|
||||||
emit signal_sendXMLmsgGUItoServer(array);
|
emit sigSendAnswerToServer(array);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool ConnectorToServer::sendClientNotify(QString command)
|
||||||
|
{
|
||||||
|
QByteArray answer = dataParser->xmlAnswer_notify(command);
|
||||||
|
emit sigSendAnswerToServer(answer);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
bool ConnectorToServer::sendQueryTasksXML(QString type)
|
bool ConnectorToServer::sendQueryTasksXML(QString type)
|
||||||
{
|
{
|
||||||
if (!client->getIsConnected())
|
if (!client->getIsConnected())
|
||||||
@@ -101,7 +108,7 @@ bool ConnectorToServer::sendQueryTasksXML(QString type)
|
|||||||
}
|
}
|
||||||
|
|
||||||
QByteArray array = dataParser->createQueryTasksXMLMessage(type);
|
QByteArray array = dataParser->createQueryTasksXMLMessage(type);
|
||||||
emit signal_sendXMLmsgGUItoServer(array);
|
emit sigSendAnswerToServer(array);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -184,6 +191,22 @@ QList<TaskAmmFim> ConnectorToServer::getListTasksFIMforTrainee(int trainee_id)
|
|||||||
return QList<TaskAmmFim>();
|
return QList<TaskAmmFim>();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int ConnectorToServer::getCountTasksAMMforTrainee(int trainee_id)
|
||||||
|
{
|
||||||
|
if(mapTasksAMM.contains(trainee_id))
|
||||||
|
return mapTasksAMM.value(trainee_id).count();
|
||||||
|
else
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int ConnectorToServer::getCountTasksFIMforTrainee(int trainee_id)
|
||||||
|
{
|
||||||
|
if(mapTasksFIM.contains(trainee_id))
|
||||||
|
return mapTasksFIM.value(trainee_id).count();
|
||||||
|
else
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
bool ConnectorToServer::isArchivedInstructor(int id)
|
bool ConnectorToServer::isArchivedInstructor(int id)
|
||||||
{
|
{
|
||||||
for(Instructor instructor : listInstructors)
|
for(Instructor instructor : listInstructors)
|
||||||
@@ -295,6 +318,16 @@ int ConnectorToServer::getIdTraineeByLogin(QString login)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int ConnectorToServer::getIdInstructorByLogin(QString login)
|
||||||
|
{
|
||||||
|
for(Instructor instructor : listInstructors)
|
||||||
|
{
|
||||||
|
if(instructor.getLogin() == login)
|
||||||
|
return instructor.getID();
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
void ConnectorToServer::showVersionSelect()
|
void ConnectorToServer::showVersionSelect()
|
||||||
{
|
{
|
||||||
QByteArray answer = dataParser->xmlAnswer_notify(cmd_CheckVersionList);
|
QByteArray answer = dataParser->xmlAnswer_notify(cmd_CheckVersionList);
|
||||||
@@ -305,6 +338,13 @@ void ConnectorToServer::slot_AnswerQueryToDB_ListInstructors(QList<Instructor> l
|
|||||||
{
|
{
|
||||||
this->listInstructors = listInstructors;
|
this->listInstructors = listInstructors;
|
||||||
emit signal_UpdateDB(true, false);
|
emit signal_UpdateDB(true, false);
|
||||||
|
|
||||||
|
QList<User> listUsers;
|
||||||
|
for(Instructor instructor : listInstructors)
|
||||||
|
{
|
||||||
|
listUsers.append(instructor);
|
||||||
|
}
|
||||||
|
emit signal_reInitMessangerByUsers(listUsers);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ConnectorToServer::slot_AnswerQueryToDB_ListGroups(QList<Group> listGroups)
|
void ConnectorToServer::slot_AnswerQueryToDB_ListGroups(QList<Group> listGroups)
|
||||||
@@ -317,7 +357,13 @@ void ConnectorToServer::slot_AnswerQueryToDB_ListTrainees(QList<Trainee> listTra
|
|||||||
{
|
{
|
||||||
this->listTrainees = listTrainees;
|
this->listTrainees = listTrainees;
|
||||||
emit signal_UpdateDB(false, true);
|
emit signal_UpdateDB(false, true);
|
||||||
emit signal_InitMessanger(listTrainees);
|
|
||||||
|
QList<User> listUsers;
|
||||||
|
for(Trainee trainee : listTrainees)
|
||||||
|
{
|
||||||
|
listUsers.append(trainee);
|
||||||
|
}
|
||||||
|
emit signal_reInitMessangerByUsers(listUsers);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ConnectorToServer::slot_AnswerQueryToDB_ListComputers(QList<Computer> listComputers)
|
void ConnectorToServer::slot_AnswerQueryToDB_ListComputers(QList<Computer> listComputers)
|
||||||
@@ -364,6 +410,13 @@ void ConnectorToServer::slot_AnswerQueryTasksXML_AMM(QByteArray array)
|
|||||||
{
|
{
|
||||||
this->listTaskAmmArray = array;
|
this->listTaskAmmArray = array;
|
||||||
emit signal_UpdateTasksAMM();
|
emit signal_UpdateTasksAMM();
|
||||||
|
|
||||||
|
//Запрос старых оффлайн-сообщений
|
||||||
|
if(!fl_GetedOfflineMessages)
|
||||||
|
{
|
||||||
|
sendClientNotify(cmd_GetOfflineMessages);
|
||||||
|
fl_GetedOfflineMessages = true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void ConnectorToServer::slot_sendMessage(ClientMessage clientMessage)
|
void ConnectorToServer::slot_sendMessage(ClientMessage clientMessage)
|
||||||
@@ -379,7 +432,13 @@ void ConnectorToServer::showServerList(QList<StreamingVersionData *> *serverList
|
|||||||
void ConnectorToServer::slot_HashReady()
|
void ConnectorToServer::slot_HashReady()
|
||||||
{
|
{
|
||||||
//sendQueryTasksXML("fim");
|
//sendQueryTasksXML("fim");
|
||||||
sendQueryTasksXML("amm");
|
//sendQueryTasksXML("amm");
|
||||||
|
}
|
||||||
|
|
||||||
|
void ConnectorToServer::slot_Auth(ServerAuthorization *serverAuth)
|
||||||
|
{
|
||||||
|
this->serverAuth = *serverAuth;
|
||||||
|
emit sigLoginResult(serverAuth);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ConnectorToServer::initialize()
|
void ConnectorToServer::initialize()
|
||||||
@@ -399,12 +458,12 @@ void ConnectorToServer::bindConnection()
|
|||||||
connect(this,&ConnectorToServer::sigSetConnect,client,&TCPClient::setConnect,Qt::AutoConnection);
|
connect(this,&ConnectorToServer::sigSetConnect,client,&TCPClient::setConnect,Qt::AutoConnection);
|
||||||
connect(this,&ConnectorToServer::sigStopConnect,client,&TCPClient::setDisconnect,Qt::AutoConnection);
|
connect(this,&ConnectorToServer::sigStopConnect,client,&TCPClient::setDisconnect,Qt::AutoConnection);
|
||||||
|
|
||||||
connect(this,&ConnectorToServer::signal_sendXMLmsgGUItoServer,sendSystem,&SendSystem::sendXMLmsgGUItoServer);
|
//Sconnect(this,&ConnectorToServer::signal_sendXMLmsgGUItoServer,sendSystem,&SendSystem::sendXMLmsgGUItoServer);
|
||||||
connect(this,&ConnectorToServer::sigSendAnswerToServer,sendSystem,&SendSystem::sendXMLAnswer,Qt::AutoConnection);
|
connect(this,&ConnectorToServer::sigSendAnswerToServer,sendSystem,&SendSystem::sendXMLAnswer,Qt::AutoConnection);
|
||||||
|
|
||||||
connect(recognizeSystem,&RecognizeSystem::sigAuth,this,&ConnectorToServer::sigLoginResult);
|
connect(recognizeSystem,&RecognizeSystem::sigAuth,this,&ConnectorToServer::slot_Auth); // ::sigLoginResult);
|
||||||
connect(recognizeSystem,&RecognizeSystem::sigDeAuth,this,&ConnectorToServer::sigDeLoginResult);
|
connect(recognizeSystem,&RecognizeSystem::sigDeAuth,this,&ConnectorToServer::sigDeLoginResult);
|
||||||
connect(recognizeSystem,&RecognizeSystem::signal_ReceiveMessage,this,&ConnectorToServer::signal_receiveMessage);
|
connect(recognizeSystem,&RecognizeSystem::signal_ReceiveMessage,this,&ConnectorToServer::signal_receiveMessage,Qt::AutoConnection);
|
||||||
connect(recognizeSystem,&RecognizeSystem::sigShowServerDataList,this,&ConnectorToServer::showServerList);
|
connect(recognizeSystem,&RecognizeSystem::sigShowServerDataList,this,&ConnectorToServer::showServerList);
|
||||||
connect (recognizeSystem,&RecognizeSystem::sigSetVersion,versionContainer,&VersionContainer::setServerVersionData);
|
connect (recognizeSystem,&RecognizeSystem::sigSetVersion,versionContainer,&VersionContainer::setServerVersionData);
|
||||||
//connect(recognizeSystem,&RecognizeSystem::sigAnswerQueryToDB,this,&ConnectorToServer::slot_AnswerQueryToDB);
|
//connect(recognizeSystem,&RecognizeSystem::sigAnswerQueryToDB,this,&ConnectorToServer::slot_AnswerQueryToDB);
|
||||||
|
|||||||
@@ -47,6 +47,8 @@ public:
|
|||||||
QList<Classroom> getListClassrooms();
|
QList<Classroom> getListClassrooms();
|
||||||
QList<TaskAmmFim> getListTasksAMMforTrainee(int trainee_id);
|
QList<TaskAmmFim> getListTasksAMMforTrainee(int trainee_id);
|
||||||
QList<TaskAmmFim> getListTasksFIMforTrainee(int trainee_id);
|
QList<TaskAmmFim> getListTasksFIMforTrainee(int trainee_id);
|
||||||
|
int getCountTasksAMMforTrainee(int trainee_id);
|
||||||
|
int getCountTasksFIMforTrainee(int trainee_id);
|
||||||
|
|
||||||
bool isArchivedInstructor(int id);
|
bool isArchivedInstructor(int id);
|
||||||
bool isAdminInstructor(int id);
|
bool isAdminInstructor(int id);
|
||||||
@@ -60,6 +62,7 @@ public:
|
|||||||
Group getGroup(int id);
|
Group getGroup(int id);
|
||||||
|
|
||||||
int getIdTraineeByLogin(QString login);
|
int getIdTraineeByLogin(QString login);
|
||||||
|
int getIdInstructorByLogin(QString login);
|
||||||
void showVersionSelect();
|
void showVersionSelect();
|
||||||
|
|
||||||
void setLoginName(QString name);
|
void setLoginName(QString name);
|
||||||
@@ -68,7 +71,9 @@ public:
|
|||||||
bool getIsConnected();
|
bool getIsConnected();
|
||||||
|
|
||||||
SendSystem *getSendSystem() const;
|
SendSystem *getSendSystem() const;
|
||||||
|
ServerAuthorization getServerAuth(){return serverAuth;}
|
||||||
|
|
||||||
|
bool sendClientNotify(QString command);
|
||||||
public slots:
|
public slots:
|
||||||
void slot_AnswerQueryToDB_ListInstructors(QList<Instructor> listInstructors);
|
void slot_AnswerQueryToDB_ListInstructors(QList<Instructor> listInstructors);
|
||||||
void slot_AnswerQueryToDB_ListGroups(QList<Group> listGroups);
|
void slot_AnswerQueryToDB_ListGroups(QList<Group> listGroups);
|
||||||
@@ -86,6 +91,8 @@ public slots:
|
|||||||
|
|
||||||
void slot_HashReady();
|
void slot_HashReady();
|
||||||
|
|
||||||
|
void slot_Auth(ServerAuthorization * serverAuth);
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
void sigSetConnect(ServerSettings* serverSettings,QThread *thread);
|
void sigSetConnect(ServerSettings* serverSettings,QThread *thread);
|
||||||
void sigStopConnect();
|
void sigStopConnect();
|
||||||
@@ -93,7 +100,7 @@ signals:
|
|||||||
SendSystem *sendSystem,
|
SendSystem *sendSystem,
|
||||||
QThread *thread);
|
QThread *thread);
|
||||||
|
|
||||||
void signal_sendXMLmsgGUItoServer(QByteArray array);
|
//void signal_sendXMLmsgGUItoServer(QByteArray array);
|
||||||
|
|
||||||
void sigLoginResult(ServerAuthorization * serverAuth);
|
void sigLoginResult(ServerAuthorization * serverAuth);
|
||||||
void sigDeLoginResult(ServerDeAuthorization * serverDeAuth);
|
void sigDeLoginResult(ServerDeAuthorization * serverDeAuth);
|
||||||
@@ -108,7 +115,7 @@ signals:
|
|||||||
|
|
||||||
void signal_ConnectedToServer(bool state);
|
void signal_ConnectedToServer(bool state);
|
||||||
|
|
||||||
void signal_InitMessanger(QList<Trainee> listTrainees);
|
void signal_reInitMessangerByUsers(QList<User> listUsers);
|
||||||
|
|
||||||
void signal_receiveMessage(ClientMessage clientMessage);
|
void signal_receiveMessage(ClientMessage clientMessage);
|
||||||
void sigSendAnswerToServer(QByteArray array);
|
void sigSendAnswerToServer(QByteArray array);
|
||||||
@@ -145,6 +152,9 @@ private:
|
|||||||
QByteArray listTaskAmmArray;
|
QByteArray listTaskAmmArray;
|
||||||
|
|
||||||
ServerSettings serverSettings;
|
ServerSettings serverSettings;
|
||||||
|
ServerAuthorization serverAuth;
|
||||||
|
|
||||||
|
bool fl_GetedOfflineMessages;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // CONNECTORTOSERVER_H
|
#endif // CONNECTORTOSERVER_H
|
||||||
|
|||||||
@@ -18,6 +18,10 @@ DialogSettings::DialogSettings(ConnectorToServer* connectorToServer, bool instru
|
|||||||
ui->btnSave->setObjectName("btnSave");
|
ui->btnSave->setObjectName("btnSave");
|
||||||
ui->checkAutoStart->setObjectName("checkAutoStart");
|
ui->checkAutoStart->setObjectName("checkAutoStart");
|
||||||
|
|
||||||
|
#ifndef PROJECT_TYPE_DEBUG
|
||||||
|
ui->btnUpdateStyle->setVisible(false);
|
||||||
|
#endif
|
||||||
|
|
||||||
this->connectorToServer = connectorToServer;
|
this->connectorToServer = connectorToServer;
|
||||||
|
|
||||||
/* Создаем строку для регулярного выражения */
|
/* Создаем строку для регулярного выражения */
|
||||||
@@ -58,12 +62,6 @@ DialogSettings::DialogSettings(ConnectorToServer* connectorToServer, bool instru
|
|||||||
if(connectorToServer)
|
if(connectorToServer)
|
||||||
if(connectorToServer->getIsConnected())
|
if(connectorToServer->getIsConnected())
|
||||||
{
|
{
|
||||||
/*
|
|
||||||
ui->editAddress->setEnabled(false);
|
|
||||||
ui->editPort->setEnabled(false);
|
|
||||||
ui->checkAutoStart->setEnabled(false);
|
|
||||||
*/
|
|
||||||
|
|
||||||
if(instructorIsLogged)
|
if(instructorIsLogged)
|
||||||
ui->btnSetVersion->setEnabled(true);
|
ui->btnSetVersion->setEnabled(true);
|
||||||
}
|
}
|
||||||
@@ -73,14 +71,6 @@ DialogSettings::DialogSettings(ConnectorToServer* connectorToServer, bool instru
|
|||||||
|
|
||||||
ui->btnSave->setEnabled(false);
|
ui->btnSave->setEnabled(false);
|
||||||
flSettingsServerChanged = false;
|
flSettingsServerChanged = false;
|
||||||
|
|
||||||
/*
|
|
||||||
if(settings->Language == "ENG")
|
|
||||||
qtLanguageTranslator.load(QString("translations/InstructorsAndTraineesWidget_") + "en_EN", ".");
|
|
||||||
else
|
|
||||||
qtLanguageTranslator.load(QString("translations/InstructorsAndTraineesWidget_") + "ru_RU", ".");
|
|
||||||
qApp->installTranslator(&qtLanguageTranslator);
|
|
||||||
*/
|
|
||||||
}
|
}
|
||||||
|
|
||||||
DialogSettings::~DialogSettings()
|
DialogSettings::~DialogSettings()
|
||||||
@@ -103,11 +93,6 @@ void DialogSettings::changeEvent(QEvent *event)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void DialogSettings::on_cmbLanguage_currentIndexChanged(const QString &arg1)
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
void DialogSettings::on_btnUpdateStyle_clicked()
|
void DialogSettings::on_btnUpdateStyle_clicked()
|
||||||
{
|
{
|
||||||
emit signal_UpdateStyleSheet();
|
emit signal_UpdateStyleSheet();
|
||||||
@@ -207,22 +192,9 @@ void DialogSettings::on_btnSave_clicked()
|
|||||||
|
|
||||||
saveSettings();
|
saveSettings();
|
||||||
|
|
||||||
/*
|
|
||||||
QString language;
|
|
||||||
|
|
||||||
if(settings->Language == "ENG")
|
|
||||||
language = QString("en_EN");
|
|
||||||
else
|
|
||||||
language = QString("ru_RU");
|
|
||||||
|
|
||||||
emit signal_LanguageChanged(language);
|
|
||||||
*/
|
|
||||||
|
|
||||||
this->accept();
|
this->accept();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void DialogSettings::on_btnSetVersion_clicked()
|
void DialogSettings::on_btnSetVersion_clicked()
|
||||||
{
|
{
|
||||||
if(connectorToServer)
|
if(connectorToServer)
|
||||||
@@ -247,11 +219,6 @@ void DialogSettings::on_editPort_textChanged(const QString &arg1)
|
|||||||
flSettingsServerChanged = true;
|
flSettingsServerChanged = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void DialogSettings::on_DialogSettings_rejected()
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
void DialogSettings::on_DialogSettings_accepted()
|
void DialogSettings::on_DialogSettings_accepted()
|
||||||
{
|
{
|
||||||
QString language;
|
QString language;
|
||||||
|
|||||||
@@ -35,21 +35,12 @@ signals:
|
|||||||
void signal_UpdateStyleSheet();
|
void signal_UpdateStyleSheet();
|
||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
void on_cmbLanguage_currentIndexChanged(const QString &arg1);
|
|
||||||
void on_btnUpdateStyle_clicked();
|
void on_btnUpdateStyle_clicked();
|
||||||
|
|
||||||
void on_btnSave_clicked();
|
void on_btnSave_clicked();
|
||||||
|
|
||||||
void on_DialogSettings_rejected();
|
|
||||||
|
|
||||||
void on_btnSetVersion_clicked();
|
void on_btnSetVersion_clicked();
|
||||||
|
|
||||||
void on_cmbLanguage_currentIndexChanged(int index);
|
void on_cmbLanguage_currentIndexChanged(int index);
|
||||||
|
|
||||||
void on_editAddress_textChanged(const QString &arg1);
|
void on_editAddress_textChanged(const QString &arg1);
|
||||||
|
|
||||||
void on_editPort_textChanged(const QString &arg1);
|
void on_editPort_textChanged(const QString &arg1);
|
||||||
|
|
||||||
void on_DialogSettings_accepted();
|
void on_DialogSettings_accepted();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|||||||
@@ -23,7 +23,7 @@
|
|||||||
</size>
|
</size>
|
||||||
</property>
|
</property>
|
||||||
<property name="windowTitle">
|
<property name="windowTitle">
|
||||||
<string>Learning management system - Settings</string>
|
<string>Settings</string>
|
||||||
</property>
|
</property>
|
||||||
<property name="windowIcon">
|
<property name="windowIcon">
|
||||||
<iconset resource="resources.qrc">
|
<iconset resource="resources.qrc">
|
||||||
@@ -37,6 +37,12 @@
|
|||||||
<layout class="QHBoxLayout" name="horizontalLayout_Main">
|
<layout class="QHBoxLayout" name="horizontalLayout_Main">
|
||||||
<item>
|
<item>
|
||||||
<widget class="QGroupBox" name="groupBox_Main">
|
<widget class="QGroupBox" name="groupBox_Main">
|
||||||
|
<property name="font">
|
||||||
|
<font>
|
||||||
|
<family>Tahoma</family>
|
||||||
|
<pointsize>10</pointsize>
|
||||||
|
</font>
|
||||||
|
</property>
|
||||||
<property name="title">
|
<property name="title">
|
||||||
<string>Main</string>
|
<string>Main</string>
|
||||||
</property>
|
</property>
|
||||||
@@ -46,7 +52,7 @@
|
|||||||
<item>
|
<item>
|
||||||
<layout class="QHBoxLayout" name="horizontalLayout_Language">
|
<layout class="QHBoxLayout" name="horizontalLayout_Language">
|
||||||
<item>
|
<item>
|
||||||
<widget class="QLabel" name="label">
|
<widget class="QLabel" name="label_Language">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Language</string>
|
<string>Language</string>
|
||||||
</property>
|
</property>
|
||||||
@@ -72,6 +78,12 @@
|
|||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<widget class="QGroupBox" name="groupBox_Server">
|
<widget class="QGroupBox" name="groupBox_Server">
|
||||||
|
<property name="font">
|
||||||
|
<font>
|
||||||
|
<family>Tahoma</family>
|
||||||
|
<pointsize>10</pointsize>
|
||||||
|
</font>
|
||||||
|
</property>
|
||||||
<property name="title">
|
<property name="title">
|
||||||
<string>Server</string>
|
<string>Server</string>
|
||||||
</property>
|
</property>
|
||||||
@@ -210,6 +222,12 @@
|
|||||||
<height>58</height>
|
<height>58</height>
|
||||||
</size>
|
</size>
|
||||||
</property>
|
</property>
|
||||||
|
<property name="font">
|
||||||
|
<font>
|
||||||
|
<family>Tahoma</family>
|
||||||
|
<pointsize>10</pointsize>
|
||||||
|
</font>
|
||||||
|
</property>
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Save</string>
|
<string>Save</string>
|
||||||
</property>
|
</property>
|
||||||
@@ -243,6 +261,12 @@
|
|||||||
<height>0</height>
|
<height>0</height>
|
||||||
</size>
|
</size>
|
||||||
</property>
|
</property>
|
||||||
|
<property name="font">
|
||||||
|
<font>
|
||||||
|
<family>Tahoma</family>
|
||||||
|
<pointsize>10</pointsize>
|
||||||
|
</font>
|
||||||
|
</property>
|
||||||
<property name="title">
|
<property name="title">
|
||||||
<string>Additional</string>
|
<string>Additional</string>
|
||||||
</property>
|
</property>
|
||||||
@@ -257,6 +281,12 @@
|
|||||||
<height>58</height>
|
<height>58</height>
|
||||||
</size>
|
</size>
|
||||||
</property>
|
</property>
|
||||||
|
<property name="font">
|
||||||
|
<font>
|
||||||
|
<family>Tahoma</family>
|
||||||
|
<pointsize>10</pointsize>
|
||||||
|
</font>
|
||||||
|
</property>
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Version</string>
|
<string>Version</string>
|
||||||
</property>
|
</property>
|
||||||
@@ -283,6 +313,12 @@
|
|||||||
<height>58</height>
|
<height>58</height>
|
||||||
</size>
|
</size>
|
||||||
</property>
|
</property>
|
||||||
|
<property name="font">
|
||||||
|
<font>
|
||||||
|
<family>Tahoma</family>
|
||||||
|
<pointsize>10</pointsize>
|
||||||
|
</font>
|
||||||
|
</property>
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Style</string>
|
<string>Style</string>
|
||||||
</property>
|
</property>
|
||||||
|
|||||||
@@ -11,9 +11,19 @@ DialogAuthorizationInstructor::DialogAuthorizationInstructor(QWidget *parent) :
|
|||||||
ui->editPassword->setProperty("mandatoryField", true);
|
ui->editPassword->setProperty("mandatoryField", true);
|
||||||
|
|
||||||
ui->editPassword->setEchoMode(QLineEdit::EchoMode::Password);
|
ui->editPassword->setEchoMode(QLineEdit::EchoMode::Password);
|
||||||
|
|
||||||
|
#ifdef PROJECT_TYPE_DEBUG
|
||||||
|
ui->editLogin->setText("admin");
|
||||||
|
ui->editPassword->setText("admin");
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
DialogAuthorizationInstructor::~DialogAuthorizationInstructor()
|
DialogAuthorizationInstructor::~DialogAuthorizationInstructor()
|
||||||
{
|
{
|
||||||
delete ui;
|
delete ui;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void DialogAuthorizationInstructor::on_btnLogIn_clicked()
|
||||||
|
{
|
||||||
|
this->accept();
|
||||||
|
}
|
||||||
|
|||||||
@@ -16,6 +16,7 @@ public:
|
|||||||
explicit DialogAuthorizationInstructor(QWidget *parent = nullptr);
|
explicit DialogAuthorizationInstructor(QWidget *parent = nullptr);
|
||||||
~DialogAuthorizationInstructor();
|
~DialogAuthorizationInstructor();
|
||||||
|
|
||||||
|
public:
|
||||||
QString getLogin()
|
QString getLogin()
|
||||||
{
|
{
|
||||||
return ui->editLogin->text();
|
return ui->editLogin->text();
|
||||||
@@ -26,6 +27,9 @@ public:
|
|||||||
return ui->editPassword->text();
|
return ui->editPassword->text();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private slots:
|
||||||
|
void on_btnLogIn_clicked();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Ui::DialogAuthorizationInstructor *ui;
|
Ui::DialogAuthorizationInstructor *ui;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -66,7 +66,7 @@
|
|||||||
</font>
|
</font>
|
||||||
</property>
|
</property>
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>admin</string>
|
<string/>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
@@ -78,7 +78,7 @@
|
|||||||
</font>
|
</font>
|
||||||
</property>
|
</property>
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>admin</string>
|
<string/>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
@@ -87,22 +87,34 @@
|
|||||||
</layout>
|
</layout>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<widget class="QDialogButtonBox" name="buttonBox">
|
<spacer name="verticalSpacer">
|
||||||
<property name="font">
|
|
||||||
<font>
|
|
||||||
<pointsize>10</pointsize>
|
|
||||||
</font>
|
|
||||||
</property>
|
|
||||||
<property name="locale">
|
|
||||||
<locale language="English" country="UnitedStates"/>
|
|
||||||
</property>
|
|
||||||
<property name="orientation">
|
<property name="orientation">
|
||||||
<enum>Qt::Horizontal</enum>
|
<enum>Qt::Vertical</enum>
|
||||||
</property>
|
</property>
|
||||||
<property name="standardButtons">
|
<property name="sizeHint" stdset="0">
|
||||||
<set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
|
<size>
|
||||||
|
<width>20</width>
|
||||||
|
<height>40</height>
|
||||||
|
</size>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</spacer>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<layout class="QHBoxLayout" name="horizontalLayout_2">
|
||||||
|
<item>
|
||||||
|
<widget class="QPushButton" name="btnLogIn">
|
||||||
|
<property name="sizePolicy">
|
||||||
|
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
|
||||||
|
<horstretch>0</horstretch>
|
||||||
|
<verstretch>0</verstretch>
|
||||||
|
</sizepolicy>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>Log in</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
</item>
|
</item>
|
||||||
</layout>
|
</layout>
|
||||||
</item>
|
</item>
|
||||||
@@ -111,38 +123,5 @@
|
|||||||
<resources>
|
<resources>
|
||||||
<include location="../resources.qrc"/>
|
<include location="../resources.qrc"/>
|
||||||
</resources>
|
</resources>
|
||||||
<connections>
|
<connections/>
|
||||||
<connection>
|
|
||||||
<sender>buttonBox</sender>
|
|
||||||
<signal>accepted()</signal>
|
|
||||||
<receiver>DialogAuthorizationInstructor</receiver>
|
|
||||||
<slot>accept()</slot>
|
|
||||||
<hints>
|
|
||||||
<hint type="sourcelabel">
|
|
||||||
<x>248</x>
|
|
||||||
<y>254</y>
|
|
||||||
</hint>
|
|
||||||
<hint type="destinationlabel">
|
|
||||||
<x>157</x>
|
|
||||||
<y>274</y>
|
|
||||||
</hint>
|
|
||||||
</hints>
|
|
||||||
</connection>
|
|
||||||
<connection>
|
|
||||||
<sender>buttonBox</sender>
|
|
||||||
<signal>rejected()</signal>
|
|
||||||
<receiver>DialogAuthorizationInstructor</receiver>
|
|
||||||
<slot>reject()</slot>
|
|
||||||
<hints>
|
|
||||||
<hint type="sourcelabel">
|
|
||||||
<x>316</x>
|
|
||||||
<y>260</y>
|
|
||||||
</hint>
|
|
||||||
<hint type="destinationlabel">
|
|
||||||
<x>286</x>
|
|
||||||
<y>274</y>
|
|
||||||
</hint>
|
|
||||||
</hints>
|
|
||||||
</connection>
|
|
||||||
</connections>
|
|
||||||
</ui>
|
</ui>
|
||||||
|
|||||||
@@ -13,6 +13,8 @@ DialogEditInstructor::DialogEditInstructor(QWidget *parent) :
|
|||||||
ui->editName->setProperty("mandatoryField", true);
|
ui->editName->setProperty("mandatoryField", true);
|
||||||
ui->editLogin->setProperty("mandatoryField", true);
|
ui->editLogin->setProperty("mandatoryField", true);
|
||||||
ui->editPassword->setProperty("mandatoryField", true);
|
ui->editPassword->setProperty("mandatoryField", true);
|
||||||
|
|
||||||
|
ui->btnOK->setEnabled(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
DialogEditInstructor::~DialogEditInstructor()
|
DialogEditInstructor::~DialogEditInstructor()
|
||||||
@@ -36,6 +38,8 @@ void DialogEditInstructor::setInstructor(Instructor instructor)
|
|||||||
ui->editName->setEnabled(false);
|
ui->editName->setEnabled(false);
|
||||||
else
|
else
|
||||||
ui->editName->setEnabled(true);
|
ui->editName->setEnabled(true);
|
||||||
|
|
||||||
|
ui->btnOK->setEnabled(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
Instructor DialogEditInstructor::getInstructor()
|
Instructor DialogEditInstructor::getInstructor()
|
||||||
@@ -73,7 +77,12 @@ void DialogEditInstructor::verify()
|
|||||||
if(ui->editName->text().trimmed() == QStringLiteral("") ||
|
if(ui->editName->text().trimmed() == QStringLiteral("") ||
|
||||||
ui->editLogin->text().trimmed() == QStringLiteral("") ||
|
ui->editLogin->text().trimmed() == QStringLiteral("") ||
|
||||||
ui->editPassword->text().trimmed() == QStringLiteral(""))
|
ui->editPassword->text().trimmed() == QStringLiteral(""))
|
||||||
ui->buttonBox->button(QDialogButtonBox::Ok)->setEnabled(false);
|
ui->btnOK->setEnabled(false);
|
||||||
else
|
else
|
||||||
ui->buttonBox->button(QDialogButtonBox::Ok)->setEnabled(true);
|
ui->btnOK->setEnabled(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
void DialogEditInstructor::on_btnOK_clicked()
|
||||||
|
{
|
||||||
|
this->accept();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -27,6 +27,8 @@ private slots:
|
|||||||
|
|
||||||
void on_editPassword_textChanged(const QString &arg1);
|
void on_editPassword_textChanged(const QString &arg1);
|
||||||
|
|
||||||
|
void on_btnOK_clicked();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void verify();
|
void verify();
|
||||||
|
|
||||||
|
|||||||
@@ -174,63 +174,42 @@
|
|||||||
</item>
|
</item>
|
||||||
</layout>
|
</layout>
|
||||||
</item>
|
</item>
|
||||||
|
<item>
|
||||||
|
<spacer name="verticalSpacer">
|
||||||
|
<property name="orientation">
|
||||||
|
<enum>Qt::Vertical</enum>
|
||||||
|
</property>
|
||||||
|
<property name="sizeHint" stdset="0">
|
||||||
|
<size>
|
||||||
|
<width>20</width>
|
||||||
|
<height>40</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
</spacer>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<layout class="QHBoxLayout" name="horizontalLayout_2">
|
||||||
|
<item>
|
||||||
|
<widget class="QPushButton" name="btnOK">
|
||||||
|
<property name="sizePolicy">
|
||||||
|
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
|
||||||
|
<horstretch>0</horstretch>
|
||||||
|
<verstretch>0</verstretch>
|
||||||
|
</sizepolicy>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>Save</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</item>
|
||||||
</layout>
|
</layout>
|
||||||
</item>
|
</item>
|
||||||
<item row="1" column="0">
|
|
||||||
<widget class="QDialogButtonBox" name="buttonBox">
|
|
||||||
<property name="font">
|
|
||||||
<font>
|
|
||||||
<pointsize>10</pointsize>
|
|
||||||
</font>
|
|
||||||
</property>
|
|
||||||
<property name="locale">
|
|
||||||
<locale language="English" country="UnitedStates"/>
|
|
||||||
</property>
|
|
||||||
<property name="orientation">
|
|
||||||
<enum>Qt::Horizontal</enum>
|
|
||||||
</property>
|
|
||||||
<property name="standardButtons">
|
|
||||||
<set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
</layout>
|
</layout>
|
||||||
</widget>
|
</widget>
|
||||||
<resources>
|
<resources>
|
||||||
<include location="../resources.qrc"/>
|
<include location="../resources.qrc"/>
|
||||||
</resources>
|
</resources>
|
||||||
<connections>
|
<connections/>
|
||||||
<connection>
|
|
||||||
<sender>buttonBox</sender>
|
|
||||||
<signal>accepted()</signal>
|
|
||||||
<receiver>DialogEditInstructor</receiver>
|
|
||||||
<slot>accept()</slot>
|
|
||||||
<hints>
|
|
||||||
<hint type="sourcelabel">
|
|
||||||
<x>248</x>
|
|
||||||
<y>254</y>
|
|
||||||
</hint>
|
|
||||||
<hint type="destinationlabel">
|
|
||||||
<x>157</x>
|
|
||||||
<y>274</y>
|
|
||||||
</hint>
|
|
||||||
</hints>
|
|
||||||
</connection>
|
|
||||||
<connection>
|
|
||||||
<sender>buttonBox</sender>
|
|
||||||
<signal>rejected()</signal>
|
|
||||||
<receiver>DialogEditInstructor</receiver>
|
|
||||||
<slot>reject()</slot>
|
|
||||||
<hints>
|
|
||||||
<hint type="sourcelabel">
|
|
||||||
<x>316</x>
|
|
||||||
<y>260</y>
|
|
||||||
</hint>
|
|
||||||
<hint type="destinationlabel">
|
|
||||||
<x>286</x>
|
|
||||||
<y>274</y>
|
|
||||||
</hint>
|
|
||||||
</hints>
|
|
||||||
</connection>
|
|
||||||
</connections>
|
|
||||||
</ui>
|
</ui>
|
||||||
|
|||||||
@@ -0,0 +1,33 @@
|
|||||||
|
#include <QHBoxLayout>
|
||||||
|
#include "dialogredactorinstructors.h"
|
||||||
|
|
||||||
|
DialogRedactorInstructors::DialogRedactorInstructors(ConnectorToServer* connectorToServer,
|
||||||
|
bool adminMode, QWidget *parent) :
|
||||||
|
QDialog(parent,
|
||||||
|
Qt::WindowSystemMenuHint
|
||||||
|
| Qt::WindowMaximizeButtonHint
|
||||||
|
| Qt::WindowMinimizeButtonHint
|
||||||
|
| Qt::WindowCloseButtonHint),
|
||||||
|
editorInstructors(nullptr)
|
||||||
|
{
|
||||||
|
editorInstructors = new EditorInstructors(connectorToServer, adminMode, this);
|
||||||
|
connect(connectorToServer, &ConnectorToServer::signal_UpdateDB, editorInstructors, &EditorInstructors::slot_NeedUpdateUI);
|
||||||
|
editorInstructors->activate();
|
||||||
|
|
||||||
|
QHBoxLayout *layout = new QHBoxLayout(this);
|
||||||
|
layout->addWidget(editorInstructors);
|
||||||
|
this->setWindowTitle(tr("Editor of instructors"));
|
||||||
|
this->setMinimumSize(1400, 700);
|
||||||
|
//this->setWindowState(Qt::WindowMaximized);
|
||||||
|
this->setModal(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
DialogRedactorInstructors::~DialogRedactorInstructors()
|
||||||
|
{
|
||||||
|
delete editorInstructors;
|
||||||
|
}
|
||||||
|
|
||||||
|
void DialogRedactorInstructors::closeEvent(QCloseEvent *event)
|
||||||
|
{
|
||||||
|
editorInstructors->close();
|
||||||
|
}
|
||||||
@@ -0,0 +1,22 @@
|
|||||||
|
#ifndef DIALOGREDACTORINSTRUCTORS_H
|
||||||
|
#define DIALOGREDACTORINSTRUCTORS_H
|
||||||
|
|
||||||
|
#include <QDialog>
|
||||||
|
#include <QObject>
|
||||||
|
#include "connectortoserver.h"
|
||||||
|
#include "editorinstructors.h"
|
||||||
|
|
||||||
|
class DialogRedactorInstructors : public QDialog
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
public:
|
||||||
|
DialogRedactorInstructors(ConnectorToServer* connectorToServer, bool adminMode, QWidget *parent = nullptr);
|
||||||
|
~DialogRedactorInstructors();
|
||||||
|
|
||||||
|
void closeEvent(QCloseEvent *event) override;
|
||||||
|
|
||||||
|
private:
|
||||||
|
EditorInstructors* editorInstructors;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // DIALOGREDACTORINSTRUCTORS_H
|
||||||
@@ -1,6 +1,7 @@
|
|||||||
#include <QMessageBox>
|
#include <QMessageBox>
|
||||||
#include "editorinstructors.h"
|
#include "editorinstructors.h"
|
||||||
#include "dialogeditinstructor.h"
|
#include "dialogeditinstructor.h"
|
||||||
|
#include "specialmessagebox.h"
|
||||||
#include "ui_editorinstructors.h"
|
#include "ui_editorinstructors.h"
|
||||||
|
|
||||||
EditorInstructors::EditorInstructors(ConnectorToServer* connectorToServer, bool adminMode, QWidget *parent) :
|
EditorInstructors::EditorInstructors(ConnectorToServer* connectorToServer, bool adminMode, QWidget *parent) :
|
||||||
@@ -9,7 +10,11 @@ EditorInstructors::EditorInstructors(ConnectorToServer* connectorToServer, bool
|
|||||||
{
|
{
|
||||||
ui->setupUi(this);
|
ui->setupUi(this);
|
||||||
|
|
||||||
connect(treeWidget, &QTreeWidget::currentItemChanged, this, &EditorInstructors::on_treeWidget_currentItemChanged);
|
ui->btnDeleteInstructor->setEnabled(false);
|
||||||
|
ui->btnToOrFromArchive->setEnabled(false);
|
||||||
|
ui->btnEdit->setEnabled(false);
|
||||||
|
|
||||||
|
connect(treeWidget, &QTreeWidget::currentItemChanged, this, &EditorInstructors::on_treeWidgetCurrentItemChanged);
|
||||||
|
|
||||||
ui->verticalLayout_1->addWidget(treeWidget);
|
ui->verticalLayout_1->addWidget(treeWidget);
|
||||||
|
|
||||||
@@ -23,6 +28,8 @@ EditorInstructors::EditorInstructors(ConnectorToServer* connectorToServer, bool
|
|||||||
ui->btnArchive->click();
|
ui->btnArchive->click();
|
||||||
|
|
||||||
waitAnimationWidget->setParent(this);
|
waitAnimationWidget->setParent(this);
|
||||||
|
|
||||||
|
authComplited = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
EditorInstructors::~EditorInstructors()
|
EditorInstructors::~EditorInstructors()
|
||||||
@@ -30,6 +37,11 @@ EditorInstructors::~EditorInstructors()
|
|||||||
delete ui;
|
delete ui;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void EditorInstructors::closeEvent(QCloseEvent *event)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
void EditorInstructors::on_btnNewInstructor_clicked()
|
void EditorInstructors::on_btnNewInstructor_clicked()
|
||||||
{
|
{
|
||||||
Instructor instructor;
|
Instructor instructor;
|
||||||
@@ -100,21 +112,21 @@ void EditorInstructors::on_btnDeleteInstructor_clicked()
|
|||||||
if(treeItemParent == nullptr)
|
if(treeItemParent == nullptr)
|
||||||
{//Выбран Инструктор
|
{//Выбран Инструктор
|
||||||
|
|
||||||
int id = treeItemCurrent->text(ColumnsTreeInsructors::clmn_ID).toInt();
|
int id = treeItemCurrent->text(ColumnsTreeUsers::clmn_ID).toInt();
|
||||||
|
|
||||||
if(connectorToServer->isAdminInstructor(id))
|
if(connectorToServer->isAdminInstructor(id))
|
||||||
{//Это Админ!
|
{//Это Админ!
|
||||||
QMessageBox::critical(this, tr("Error!"), tr("You cannot delete the Administrator."));
|
SpecialMessageBox(this, SpecialMessageBox::TypeSpecMsgBox::critical, tr("You cannot delete the Administrator.")).exec();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(connectorToServer->isLoggedInInstructor(id))
|
if(connectorToServer->isLoggedInInstructor(id))
|
||||||
{//Инструктор залогирован!
|
{//Инструктор залогирован!
|
||||||
QMessageBox::critical(this, tr("Error!"), tr("You cannot delete a logged-in instructor."));
|
SpecialMessageBox(this, SpecialMessageBox::TypeSpecMsgBox::critical, tr("You cannot delete a logged-in instructor.")).exec();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(QMessageBox::warning(this, tr("Attention!"), tr("The deletion will be irrevocable.\nDelete it anyway?"), QMessageBox::Ok, QMessageBox::Cancel) == QMessageBox::Ok)
|
if(SpecialMessageBox(this, SpecialMessageBox::TypeSpecMsgBox::warningYesNo, tr("The deletion will be irrevocable.\nDelete it anyway?")).exec() == QDialog::Accepted)
|
||||||
{
|
{
|
||||||
waitAnimationWidget->showWithPlay();
|
waitAnimationWidget->showWithPlay();
|
||||||
connectorToServer->sendQueryToDB(TypeQueryToDB::TYPE_QUERY_DEL_INSTRUCTOR, id);
|
connectorToServer->sendQueryToDB(TypeQueryToDB::TYPE_QUERY_DEL_INSTRUCTOR, id);
|
||||||
@@ -133,7 +145,7 @@ void EditorInstructors::on_btnToOrFromArchive_clicked()
|
|||||||
if(treeItemParent == nullptr)
|
if(treeItemParent == nullptr)
|
||||||
{//Выбран Инструктор
|
{//Выбран Инструктор
|
||||||
|
|
||||||
int id = treeItemCurrent->text(ColumnsTreeInsructors::clmn_ID).toInt();
|
int id = treeItemCurrent->text(ColumnsTreeUsers::clmn_ID).toInt();
|
||||||
|
|
||||||
Instructor instructor = connectorToServer->getInstructor(id);
|
Instructor instructor = connectorToServer->getInstructor(id);
|
||||||
if(instructor.getID() == 0)
|
if(instructor.getID() == 0)
|
||||||
@@ -149,7 +161,7 @@ void EditorInstructors::on_btnToOrFromArchive_clicked()
|
|||||||
{//Не Архивный
|
{//Не Архивный
|
||||||
if(connectorToServer->isLoggedInInstructor(id))
|
if(connectorToServer->isLoggedInInstructor(id))
|
||||||
{//Инструктор залогирован!
|
{//Инструктор залогирован!
|
||||||
QMessageBox::critical(this, tr("Error!"), tr("You cannot archive a logged-in instructor."));
|
SpecialMessageBox(this, SpecialMessageBox::TypeSpecMsgBox::critical, tr("You cannot archive a logged-in instructor.")).exec();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -182,11 +194,11 @@ void EditorInstructors::on_btnEdit_clicked()
|
|||||||
if(treeItemParent == nullptr)
|
if(treeItemParent == nullptr)
|
||||||
{//Выбран Инструктор
|
{//Выбран Инструктор
|
||||||
|
|
||||||
int id = treeItemCurrent->text(ColumnsTreeInsructors::clmn_ID).toInt();
|
int id = treeItemCurrent->text(ColumnsTreeUsers::clmn_ID).toInt();
|
||||||
|
|
||||||
if(connectorToServer->isLoggedInInstructor(id))
|
if(connectorToServer->isLoggedInInstructor(id))
|
||||||
{//Инструктор залогирован!
|
{//Инструктор залогирован!
|
||||||
QMessageBox::critical(this, tr("Error!"), tr("You cannot edit a logged-in instructor."));
|
SpecialMessageBox(this, SpecialMessageBox::TypeSpecMsgBox::critical, tr("You cannot edit a logged-in instructor.")).exec();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -210,23 +222,37 @@ void EditorInstructors::on_btnArchive_clicked()
|
|||||||
setArchiveVisible(state);
|
setArchiveVisible(state);
|
||||||
if(!state)
|
if(!state)
|
||||||
{
|
{
|
||||||
lastCurrentID = 0;
|
Instructor instructor = connectorToServer->getInstructor(lastCurrentID);
|
||||||
|
if(instructor.getID())
|
||||||
|
{
|
||||||
|
if(instructor.getArchived())
|
||||||
|
lastCurrentID = 0;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
lastCurrentID = 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
loadInstructorsFromDB();
|
loadInstructorsFromDB();
|
||||||
}
|
}
|
||||||
|
|
||||||
void EditorInstructors::on_treeWidget_currentItemChanged(QTreeWidgetItem *current, QTreeWidgetItem *previous)
|
void EditorInstructors::on_treeWidgetCurrentItemChanged(QTreeWidgetItem *current, QTreeWidgetItem *previous)
|
||||||
{
|
{
|
||||||
//Определяем доступность и функционал кнопок для выбранного элемента
|
//Определяем доступность и функционал кнопок для выбранного элемента
|
||||||
|
|
||||||
if(current == nullptr)
|
if(current == nullptr)
|
||||||
|
{
|
||||||
|
ui->btnDeleteInstructor->setEnabled(false);
|
||||||
|
ui->btnToOrFromArchive->setEnabled(false);
|
||||||
|
ui->btnEdit->setEnabled(false);
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
QTreeWidgetItem *treeItemParent = current->parent();
|
QTreeWidgetItem *treeItemParent = current->parent();
|
||||||
if(treeItemParent == nullptr)
|
if(treeItemParent == nullptr)
|
||||||
{//Выбран инструктор
|
{//Выбран инструктор
|
||||||
|
|
||||||
int id = current->text(ColumnsTreeInsructors::clmn_ID).toInt();
|
int id = current->text(ColumnsTreeUsers::clmn_ID).toInt();
|
||||||
|
|
||||||
lastCurrentID = id;
|
lastCurrentID = id;
|
||||||
|
|
||||||
@@ -264,51 +290,43 @@ void EditorInstructors::on_treeWidget_currentItemChanged(QTreeWidgetItem *curren
|
|||||||
//ui->btnEdit->setEnabled(true);
|
//ui->btnEdit->setEnabled(true);
|
||||||
ui->btnArchive->setEnabled(true);
|
ui->btnArchive->setEnabled(true);
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ui->btnDeleteInstructor->setEnabled(false);
|
||||||
|
ui->btnToOrFromArchive->setEnabled(false);
|
||||||
|
ui->btnEdit->setEnabled(false);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool EditorInstructors::verifyInstructor(Instructor instructor)
|
bool EditorInstructors::verifyInstructor(Instructor instructor)
|
||||||
{
|
{
|
||||||
//Проверка корректности логина, имени, пароля
|
//Проверка корректности логина, имени, пароля
|
||||||
|
|
||||||
if(instructor.getName() == QStringLiteral("<instructor>"))
|
if(instructor.getName() == QStringLiteral("<name>"))
|
||||||
{//Имя не корректно!
|
{//Имя не корректно!
|
||||||
QMessageBox::critical(this, tr("Editing error!"),
|
SpecialMessageBox(this, SpecialMessageBox::TypeSpecMsgBox::critical, tr("Unacceptable instructor name has been entered.\nThe changes will not be accepted.")).exec();
|
||||||
tr("Unacceptable instructor name has been entered.\nThe changes will not be accepted."));
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(instructor.getLogin() == QStringLiteral("<login>"))
|
if(instructor.getLogin() == QStringLiteral("<login>"))
|
||||||
{//Логин не корректен!
|
{//Логин не корректен!
|
||||||
QMessageBox::critical(this, tr("Editing error!"),
|
SpecialMessageBox(this, SpecialMessageBox::TypeSpecMsgBox::critical, tr("Unacceptable instructor login has been entered.\nThe changes will not be accepted.")).exec();
|
||||||
tr("Unacceptable instructor login has been entered.\nThe changes will not be accepted."));
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(instructor.getPassword() == QStringLiteral("<password>"))
|
if(instructor.getPassword() == QStringLiteral("<password>"))
|
||||||
{//Пароль не корректный!
|
{//Пароль не корректный!
|
||||||
QMessageBox::critical(this, tr("Editing error!"),
|
SpecialMessageBox(this, SpecialMessageBox::TypeSpecMsgBox::critical, tr("Unacceptable instructor password has been entered.\nThe changes will not be accepted.")).exec();
|
||||||
tr("Unacceptable instructor password has been entered.\nThe changes will not be accepted."));
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
QList<Instructor> listInstructors = connectorToServer->getListInstructors();
|
int user_I = connectorToServer->getIdInstructorByLogin(instructor.getLogin());
|
||||||
|
int user_T = connectorToServer->getIdTraineeByLogin(instructor.getLogin());
|
||||||
for(Instructor exist_instructor : listInstructors)
|
if((user_I && (user_I != instructor.getID())) || (user_T && (user_T != instructor.getID())))
|
||||||
{
|
{//Логин уже существует!
|
||||||
if(instructor.getName() == exist_instructor.getName() && instructor.getID() != exist_instructor.getID())
|
SpecialMessageBox(this, SpecialMessageBox::TypeSpecMsgBox::critical, tr("An existing instructor or trainee login has been entered.\nThe changes will not be accepted.")).exec();
|
||||||
{//Имя уже существует
|
return 0;
|
||||||
QMessageBox::critical(this, tr("Editing error!"),
|
|
||||||
tr("An existing instructor name has been entered."));
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(instructor.getLogin() == exist_instructor.getLogin() && instructor.getID() != exist_instructor.getID())
|
|
||||||
{//Логин уже существует!
|
|
||||||
QMessageBox::critical(this, tr("Editing error!"),
|
|
||||||
tr("An existing instructor login has been entered.\nThe changes will not be accepted."));
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
@@ -317,6 +335,7 @@ bool EditorInstructors::verifyInstructor(Instructor instructor)
|
|||||||
bool EditorInstructors::editInstructor(Instructor instructor, Instructor* instructor_edit)
|
bool EditorInstructors::editInstructor(Instructor instructor, Instructor* instructor_edit)
|
||||||
{
|
{
|
||||||
DialogEditInstructor dlg(this);
|
DialogEditInstructor dlg(this);
|
||||||
|
dlg.setWindowFlags(dlg.windowFlags() & ~Qt::WindowContextHelpButtonHint);
|
||||||
|
|
||||||
dlg.setInstructor(instructor);
|
dlg.setInstructor(instructor);
|
||||||
|
|
||||||
|
|||||||
@@ -19,13 +19,15 @@ public:
|
|||||||
explicit EditorInstructors(ConnectorToServer* connectorToServer, bool adminMode, QWidget *parent = nullptr);
|
explicit EditorInstructors(ConnectorToServer* connectorToServer, bool adminMode, QWidget *parent = nullptr);
|
||||||
~EditorInstructors();
|
~EditorInstructors();
|
||||||
|
|
||||||
|
void closeEvent(QCloseEvent *event) override;
|
||||||
|
|
||||||
private Q_SLOTS:
|
private Q_SLOTS:
|
||||||
void on_btnNewInstructor_clicked();
|
void on_btnNewInstructor_clicked();
|
||||||
void on_btnDeleteInstructor_clicked();
|
void on_btnDeleteInstructor_clicked();
|
||||||
void on_btnToOrFromArchive_clicked();
|
void on_btnToOrFromArchive_clicked();
|
||||||
void on_btnEdit_clicked();
|
void on_btnEdit_clicked();
|
||||||
void on_btnArchive_clicked();
|
void on_btnArchive_clicked();
|
||||||
void on_treeWidget_currentItemChanged(QTreeWidgetItem *current, QTreeWidgetItem *previous);
|
void on_treeWidgetCurrentItemChanged(QTreeWidgetItem *current, QTreeWidgetItem *previous);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
//void setCurrentInstructor(int id);
|
//void setCurrentInstructor(int id);
|
||||||
|
|||||||
@@ -1,92 +1,25 @@
|
|||||||
#include <QHeaderView>
|
#include <QHeaderView>
|
||||||
#include <QTranslator>
|
#include <QTranslator>
|
||||||
#include <QResizeEvent>
|
#include <QResizeEvent>
|
||||||
|
#include <QScrollBar>
|
||||||
#include "instructorsview.h"
|
#include "instructorsview.h"
|
||||||
|
|
||||||
InstructorsView::InstructorsView(ConnectorToServer* connectorToServer, TypeView type, QWidget *parent):
|
InstructorsView::InstructorsView(ConnectorToServer* connectorToServer, TypeView type, QWidget *parent):
|
||||||
CommonView(connectorToServer, type, parent)
|
CommonView(connectorToServer, type, parent)
|
||||||
{
|
{
|
||||||
typeObject = TypeObject::objInstructor;
|
typeObject = TypeObject::objInstructor;
|
||||||
}
|
TypeUserDB = User::TypeUserDBInstructor;
|
||||||
|
|
||||||
void InstructorsView::resizeEvent(QResizeEvent *event)
|
|
||||||
{
|
|
||||||
int width = treeWidget->width();
|
|
||||||
|
|
||||||
treeWidget->setColumnWidth(ColumnsTreeInsructors::clmn_ID, 50);
|
|
||||||
treeWidget->setColumnWidth(ColumnsTreeInsructors::clmn_Login, 100);
|
|
||||||
treeWidget->setColumnWidth(ColumnsTreeInsructors::clmn_Password, 100);
|
|
||||||
treeWidget->setColumnWidth(ColumnsTreeInsructors::clmn_Administrator, 120);
|
|
||||||
treeWidget->setColumnWidth(ColumnsTreeInsructors::clmn_Archived, 80);
|
|
||||||
treeWidget->setColumnWidth(ColumnsTreeInsructors::clmn_Logged, 100);
|
|
||||||
|
|
||||||
int widthInstructor;
|
|
||||||
|
|
||||||
if(typeView == TypeView::onlyView)
|
|
||||||
{//onlyView
|
|
||||||
widthInstructor = width - (300 + 10);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{//control
|
|
||||||
if(adminMode)
|
|
||||||
widthInstructor = width - (550 + 10);
|
|
||||||
else
|
|
||||||
widthInstructor = width - (420 + 10);
|
|
||||||
}
|
|
||||||
if(widthInstructor < 250)
|
|
||||||
widthInstructor = 250;
|
|
||||||
|
|
||||||
treeWidget->setColumnWidth(ColumnsTreeInsructors::clmn_Instructor, widthInstructor);
|
|
||||||
|
|
||||||
QSize size = event->size();
|
|
||||||
waitAnimationWidget->resize(size);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void InstructorsView::slot_NeedUpdateUI(bool treeInstructor, bool treeTrainee)
|
void InstructorsView::slot_NeedUpdateUI(bool treeInstructor, bool treeTrainee)
|
||||||
{
|
{
|
||||||
updateButtons();
|
updateButtons();
|
||||||
|
|
||||||
if(treeInstructor)
|
if(authComplited)
|
||||||
loadInstructorsFromDB();
|
{
|
||||||
}
|
if(treeInstructor)
|
||||||
|
loadInstructorsFromDB();
|
||||||
void InstructorsView::preparationTreeWidget()
|
|
||||||
{
|
|
||||||
mtxTreeWidget.lock();
|
|
||||||
|
|
||||||
treeWidget->setColumnCount(clmn_count);
|
|
||||||
|
|
||||||
reSetHeadTreeWidget();
|
|
||||||
|
|
||||||
if(typeView == TypeView::onlyView)
|
|
||||||
{//onlyView
|
|
||||||
archiveVisible = false;
|
|
||||||
|
|
||||||
treeWidget->setColumnHidden(ColumnsTreeInsructors::clmn_ID, true);
|
|
||||||
treeWidget->setColumnHidden(ColumnsTreeInsructors::clmn_Password, true);
|
|
||||||
treeWidget->setColumnHidden(ColumnsTreeInsructors::clmn_Archived, true);
|
|
||||||
treeWidget->setColumnHidden(ColumnsTreeInsructors::clmn_Administrator, true);
|
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{//control
|
|
||||||
archiveVisible = true;
|
|
||||||
|
|
||||||
if(adminMode)
|
|
||||||
{
|
|
||||||
treeWidget->setColumnHidden(ColumnsTreeInsructors::clmn_ID, false);
|
|
||||||
treeWidget->setColumnHidden(ColumnsTreeInsructors::clmn_Archived, false);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
treeWidget->setColumnHidden(ColumnsTreeInsructors::clmn_ID, true);
|
|
||||||
treeWidget->setColumnHidden(ColumnsTreeInsructors::clmn_Archived, true);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
treeWidget->setSortingEnabled(true);
|
|
||||||
treeWidget->sortItems(ColumnsTreeInsructors::clmn_Instructor, Qt::SortOrder::AscendingOrder);
|
|
||||||
|
|
||||||
mtxTreeWidget.unlock();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void InstructorsView::loadInstructorsFromDB()
|
void InstructorsView::loadInstructorsFromDB()
|
||||||
@@ -105,47 +38,46 @@ void InstructorsView::loadInstructorsFromDB()
|
|||||||
{
|
{
|
||||||
QTreeWidgetItem *ItemInstructor = new QTreeWidgetItem(treeWidget);
|
QTreeWidgetItem *ItemInstructor = new QTreeWidgetItem(treeWidget);
|
||||||
|
|
||||||
ItemInstructor->setText(ColumnsTreeInsructors::clmn_ID, QString::number(instructor.getID()));
|
ItemInstructor->setText(ColumnsTreeUsers::clmn_ID, QString::number(instructor.getID()));
|
||||||
ItemInstructor->setText(ColumnsTreeInsructors::clmn_Instructor, instructor.getName());
|
ItemInstructor->setText(ColumnsTreeUsers::clmn_Name, instructor.getName());
|
||||||
ItemInstructor->setText(ColumnsTreeInsructors::clmn_Login, instructor.getLogin());
|
ItemInstructor->setText(ColumnsTreeUsers::clmn_Login, instructor.getLogin());
|
||||||
ItemInstructor->setText(ColumnsTreeInsructors::clmn_Password, instructor.getPassword());
|
ItemInstructor->setText(ColumnsTreeUsers::clmn_Password, instructor.getPassword());
|
||||||
|
|
||||||
//Сокрытие пароля
|
//Сокрытие пароля
|
||||||
if(!adminMode)
|
ItemInstructor->setText(ColumnsTreeUsers::clmn_Password, QStringLiteral("******"));
|
||||||
ItemInstructor->setText(ColumnsTreeInsructors::clmn_Password, QStringLiteral("******"));
|
|
||||||
|
|
||||||
if(instructor.getArchived())
|
if(instructor.getArchived())
|
||||||
{//Архивный
|
{//Архивный
|
||||||
ItemInstructor->setText(ColumnsTreeInsructors::clmn_Archived, tr("yes"));
|
ItemInstructor->setText(ColumnsTreeUsers::clmn_Archived, tr("yes"));
|
||||||
ItemInstructor->setIcon(ColumnsTreeInsructors::clmn_Instructor, QIcon(QStringLiteral(":/resources/icons/archive.png")));
|
ItemInstructor->setIcon(ColumnsTreeUsers::clmn_Name, QIcon(QStringLiteral(":/resources/icons/archive.png")));
|
||||||
setItemColorArchive(ItemInstructor);
|
setItemColorArchive(ItemInstructor);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{//Не Архивный
|
{//Не Архивный
|
||||||
ItemInstructor->setText(ColumnsTreeInsructors::clmn_Archived, tr("no"));
|
ItemInstructor->setText(ColumnsTreeUsers::clmn_Archived, tr("no"));
|
||||||
ItemInstructor->setIcon(ColumnsTreeInsructors::clmn_Instructor, QIcon(QStringLiteral(":/resources/icons/instructor.png")));
|
ItemInstructor->setIcon(ColumnsTreeUsers::clmn_Name, QIcon(QStringLiteral(":/resources/icons/instructor.png")));
|
||||||
setItemColorNoArchive(ItemInstructor);
|
setItemColorNoArchive(ItemInstructor);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(instructor.getIsAdmin())
|
if(instructor.getIsAdmin())
|
||||||
{//Админ
|
{//Админ
|
||||||
ItemInstructor->setText(ColumnsTreeInsructors::clmn_Administrator, tr("yes"));
|
ItemInstructor->setText(ColumnsTreeUsers::clmn_Administrator, tr("yes"));
|
||||||
ItemInstructor->setIcon(ColumnsTreeInsructors::clmn_Instructor, QIcon(QStringLiteral(":/resources/icons/admin.png")));
|
ItemInstructor->setIcon(ColumnsTreeUsers::clmn_Name, QIcon(QStringLiteral(":/resources/icons/admin.png")));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{//Не Админ
|
{//Не Админ
|
||||||
ItemInstructor->setText(ColumnsTreeInsructors::clmn_Administrator, tr("no"));
|
ItemInstructor->setText(ColumnsTreeUsers::clmn_Administrator, tr("no"));
|
||||||
}
|
}
|
||||||
|
|
||||||
if(instructor.getLoggedIn())
|
if(instructor.getLoggedIn())
|
||||||
{//Залогинен
|
{//Залогинен
|
||||||
ItemInstructor->setText(ColumnsTreeInsructors::clmn_Logged, tr("yes"));
|
//ItemInstructor->setText(ColumnsTreeUsers::clmn_Logged, tr("yes"));
|
||||||
ItemInstructor->setIcon(ColumnsTreeInsructors::clmn_Logged, QIcon(QStringLiteral(":/resources/icons/circleGreen.png")));
|
ItemInstructor->setIcon(ColumnsTreeUsers::clmn_Logged, QIcon(QStringLiteral(":/resources/icons/circleGreen.png")));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{//Не Залогинен
|
{//Не Залогинен
|
||||||
ItemInstructor->setText(ColumnsTreeInsructors::clmn_Logged, tr("no"));
|
//ItemInstructor->setText(ColumnsTreeUsers::clmn_Logged, tr("no"));
|
||||||
ItemInstructor->setIcon(ColumnsTreeInsructors::clmn_Logged, QIcon(QStringLiteral(":/resources/icons/circleGray.png")));
|
ItemInstructor->setIcon(ColumnsTreeUsers::clmn_Logged, QIcon(QStringLiteral(":/resources/icons/circleGray.png")));
|
||||||
}
|
}
|
||||||
|
|
||||||
//Скрываем архивных (при необходимости)
|
//Скрываем архивных (при необходимости)
|
||||||
@@ -171,34 +103,30 @@ void InstructorsView::loadInstructorsFromDB()
|
|||||||
|
|
||||||
setCurrentInstructor(lastCurrentID);
|
setCurrentInstructor(lastCurrentID);
|
||||||
|
|
||||||
treeWidget->sortItems(ColumnsTreeInsructors::clmn_Instructor, Qt::SortOrder::AscendingOrder);
|
treeWidget->sortItems(ColumnsTreeUsers::clmn_Name, Qt::SortOrder::AscendingOrder);
|
||||||
|
|
||||||
mtxTreeWidget.unlock();
|
mtxTreeWidget.unlock();
|
||||||
|
|
||||||
waitAnimationWidget->hideWithStop();
|
waitAnimationWidget->hideWithStop();
|
||||||
}
|
}
|
||||||
|
|
||||||
void InstructorsView::reSetHeadTreeWidget()
|
|
||||||
{
|
|
||||||
QStringList listHeaders = {tr("Instructor"), tr("Login"), tr("Password"), tr("Administrator"), tr("Archived"), tr("Logged"), tr("ID")};
|
|
||||||
treeWidget->setHeaderLabels(listHeaders);
|
|
||||||
}
|
|
||||||
|
|
||||||
void InstructorsView::setCurrentInstructor(int id)
|
void InstructorsView::setCurrentInstructor(int id)
|
||||||
{
|
{
|
||||||
for(int i = 0; i < treeWidget->topLevelItemCount(); i++)
|
for(int i = 0; i < treeWidget->topLevelItemCount(); i++)
|
||||||
{
|
{
|
||||||
QTreeWidgetItem * item = treeWidget->topLevelItem(i);
|
QTreeWidgetItem * item = treeWidget->topLevelItem(i);
|
||||||
if(item != nullptr)
|
if(item != nullptr)
|
||||||
if(item->text(ColumnsTreeInsructors::clmn_ID).toInt() == id)
|
if(item->text(ColumnsTreeUsers::clmn_ID).toInt() == id)
|
||||||
{
|
{
|
||||||
treeWidget->setCurrentItem(item);
|
treeWidget->setCurrentItem(item);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
QTreeWidgetItem * item = treeWidget->topLevelItem(0);
|
QTreeWidgetItem * item = treeWidget->topLevelItem(0);
|
||||||
if(item != nullptr)
|
if(item != nullptr)
|
||||||
treeWidget->setCurrentItem(item);
|
treeWidget->setCurrentItem(item);
|
||||||
|
*/
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -13,32 +13,13 @@ class InstructorsView: public CommonView
|
|||||||
public:
|
public:
|
||||||
InstructorsView(ConnectorToServer* connectorToServer, TypeView type, QWidget *parent = nullptr);
|
InstructorsView(ConnectorToServer* connectorToServer, TypeView type, QWidget *parent = nullptr);
|
||||||
|
|
||||||
protected:
|
|
||||||
enum ColumnsTreeInsructors{
|
|
||||||
clmn_Instructor = 0,
|
|
||||||
clmn_Login,
|
|
||||||
clmn_Password,
|
|
||||||
clmn_Administrator,
|
|
||||||
clmn_Archived,
|
|
||||||
clmn_Logged,
|
|
||||||
clmn_ID,
|
|
||||||
clmn_count
|
|
||||||
};
|
|
||||||
|
|
||||||
public:
|
|
||||||
void resizeEvent(QResizeEvent *event) override;
|
|
||||||
|
|
||||||
public Q_SLOTS:
|
public Q_SLOTS:
|
||||||
//Слот обработки сигнала необходимости обновления интерфейса
|
//Слот обработки сигнала необходимости обновления интерфейса
|
||||||
void slot_NeedUpdateUI(bool treeInstructor, bool treeTrainee);
|
void slot_NeedUpdateUI(bool treeInstructor, bool treeTrainee);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual void updateButtons(){};
|
virtual void updateButtons(){};
|
||||||
void preparationTreeWidget();
|
|
||||||
void loadInstructorsFromDB();
|
void loadInstructorsFromDB();
|
||||||
|
|
||||||
void reSetHeadTreeWidget();
|
|
||||||
|
|
||||||
void setCurrentInstructor(int id);
|
void setCurrentInstructor(int id);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -5,13 +5,16 @@
|
|||||||
|
|
||||||
ViewerInstructors::ViewerInstructors(ConnectorToServer* connectorToServer, QWidget *parent) :
|
ViewerInstructors::ViewerInstructors(ConnectorToServer* connectorToServer, QWidget *parent) :
|
||||||
InstructorsView(connectorToServer, CommonView::TypeView::onlyView, parent),
|
InstructorsView(connectorToServer, CommonView::TypeView::onlyView, parent),
|
||||||
|
dlgRedactor(nullptr),
|
||||||
ui(new Ui::ViewerInstructors)
|
ui(new Ui::ViewerInstructors)
|
||||||
{
|
{
|
||||||
ui->setupUi(this);
|
ui->setupUi(this);
|
||||||
|
|
||||||
|
connect(treeWidget, &QTreeWidget::itemClicked, this, &ViewerInstructors::on_treeWidgetItemClicked);
|
||||||
|
|
||||||
ui->horizontalLayout_1->addWidget(treeWidget);
|
ui->horizontalLayout_1->addWidget(treeWidget);
|
||||||
|
|
||||||
treeWidget->setSelectionMode(QAbstractItemView::NoSelection);
|
//treeWidget->setSelectionMode(QAbstractItemView::NoSelection);
|
||||||
|
|
||||||
preparationTreeWidget();
|
preparationTreeWidget();
|
||||||
setNotLoggedInVisible(true);
|
setNotLoggedInVisible(true);
|
||||||
@@ -21,6 +24,8 @@ ViewerInstructors::ViewerInstructors(ConnectorToServer* connectorToServer, QWidg
|
|||||||
|
|
||||||
ViewerInstructors::~ViewerInstructors()
|
ViewerInstructors::~ViewerInstructors()
|
||||||
{
|
{
|
||||||
|
if(dlgRedactor)
|
||||||
|
dlgRedactor->close();
|
||||||
delete ui;
|
delete ui;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -32,6 +37,9 @@ void ViewerInstructors::setAuthComplited(bool authComplited)
|
|||||||
|
|
||||||
void ViewerInstructors::deactivate()
|
void ViewerInstructors::deactivate()
|
||||||
{
|
{
|
||||||
|
if(dlgRedactor)
|
||||||
|
dlgRedactor->close();
|
||||||
|
|
||||||
CommonView::deactivate();
|
CommonView::deactivate();
|
||||||
updateButtons();
|
updateButtons();
|
||||||
}
|
}
|
||||||
@@ -44,7 +52,6 @@ void ViewerInstructors::changeEvent(QEvent *event)
|
|||||||
ui->retranslateUi(this);
|
ui->retranslateUi(this);
|
||||||
|
|
||||||
reSetHeadTreeWidget();
|
reSetHeadTreeWidget();
|
||||||
//loadInstructorsFromDB();
|
|
||||||
slot_NeedUpdateUI(true, false);
|
slot_NeedUpdateUI(true, false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -53,22 +60,43 @@ void ViewerInstructors::on_btnEditorInstructors_clicked()
|
|||||||
{
|
{
|
||||||
Q_EMIT signal_BlockAutorization(true);
|
Q_EMIT signal_BlockAutorization(true);
|
||||||
|
|
||||||
EditorInstructors editorInstructors(connectorToServer, adminMode);
|
dlgRedactor = new DialogRedactorInstructors(connectorToServer, adminMode, this);
|
||||||
connect(connectorToServer, &ConnectorToServer::signal_UpdateDB, &editorInstructors, &EditorInstructors::slot_NeedUpdateUI);
|
dlgRedactor->exec();
|
||||||
|
|
||||||
QDialog* dialog = new QDialog(this);
|
if(dlgRedactor)
|
||||||
QHBoxLayout *layout = new QHBoxLayout(dialog);
|
{
|
||||||
layout->addWidget(&editorInstructors);
|
delete dlgRedactor;
|
||||||
dialog->setWindowTitle(tr("Editor of instructors"));
|
dlgRedactor = nullptr;
|
||||||
dialog->setMinimumSize(1600, 800);
|
}
|
||||||
dialog->setStyleSheet(this->styleSheet());
|
|
||||||
dialog->exec();
|
|
||||||
|
|
||||||
loadInstructorsFromDB();
|
if(authComplited)
|
||||||
|
loadInstructorsFromDB();
|
||||||
|
|
||||||
Q_EMIT signal_BlockAutorization(false);
|
Q_EMIT signal_BlockAutorization(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ViewerInstructors::on_treeWidgetItemClicked(QTreeWidgetItem *item, int column)
|
||||||
|
{
|
||||||
|
if(item == nullptr)
|
||||||
|
return;
|
||||||
|
|
||||||
|
//if(current->childCount() == 0)
|
||||||
|
{//Выбран обучаемый
|
||||||
|
QString login = item->text(ColumnsTreeUsers::clmn_Login);
|
||||||
|
//if(login != "")
|
||||||
|
{
|
||||||
|
int newCurrentID = connectorToServer->getIdInstructorByLogin(login);
|
||||||
|
|
||||||
|
//if(newCurrentID == lastCurrentID)
|
||||||
|
//return;
|
||||||
|
|
||||||
|
lastCurrentID = newCurrentID;
|
||||||
|
|
||||||
|
Q_EMIT signal_instructorSelected(newCurrentID);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void ViewerInstructors::updateButtons()
|
void ViewerInstructors::updateButtons()
|
||||||
{
|
{
|
||||||
if(adminMode && authComplited)
|
if(adminMode && authComplited)
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
#define INSTRUCTORSWIDGET_H
|
#define INSTRUCTORSWIDGET_H
|
||||||
|
|
||||||
#include "instructorsview.h"
|
#include "instructorsview.h"
|
||||||
|
#include "dialogredactorinstructors.h"
|
||||||
|
|
||||||
namespace Ui {
|
namespace Ui {
|
||||||
class ViewerInstructors;
|
class ViewerInstructors;
|
||||||
@@ -32,9 +33,19 @@ Q_SIGNALS:
|
|||||||
public Q_SLOTS:
|
public Q_SLOTS:
|
||||||
void on_btnEditorInstructors_clicked();
|
void on_btnEditorInstructors_clicked();
|
||||||
|
|
||||||
|
public slots:
|
||||||
|
void on_treeWidgetItemClicked(QTreeWidgetItem *item, int column);
|
||||||
|
|
||||||
|
Q_SIGNALS:
|
||||||
|
//сигнал о выборе инструктора
|
||||||
|
void signal_instructorSelected(int id_instructor);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void updateButtons() override;
|
void updateButtons() override;
|
||||||
|
|
||||||
|
private:
|
||||||
|
DialogRedactorInstructors* dlgRedactor;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Ui::ViewerInstructors *ui;
|
Ui::ViewerInstructors *ui;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -4,43 +4,33 @@
|
|||||||
#include "ui_instructorsandtraineeswidget.h"
|
#include "ui_instructorsandtraineeswidget.h"
|
||||||
#include "dialogauthorizationinstructor.h"
|
#include "dialogauthorizationinstructor.h"
|
||||||
#include "dialogsettings.h"
|
#include "dialogsettings.h"
|
||||||
|
#include "specialmessagebox.h"
|
||||||
|
|
||||||
|
|
||||||
|
const QString InstructorsAndTraineesWidget::languageENG = "en_EN";
|
||||||
|
const QString InstructorsAndTraineesWidget::languageRUS = "ru_RU";
|
||||||
|
|
||||||
|
|
||||||
InstructorsAndTraineesWidget::InstructorsAndTraineesWidget(QWidget *parent) :
|
InstructorsAndTraineesWidget::InstructorsAndTraineesWidget(QWidget *parent) :
|
||||||
QWidget(parent),
|
QWidget(parent),
|
||||||
ui(new Ui::InstructorsAndTraineesWidget),
|
|
||||||
connectorToServer(nullptr),
|
connectorToServer(nullptr),
|
||||||
viewerTrainees(nullptr),
|
viewerTrainees(nullptr),
|
||||||
viewerInstructors(nullptr),
|
viewerInstructors(nullptr),
|
||||||
messangerWidget(nullptr),
|
messangerWidget(nullptr),
|
||||||
ammTasksWidget(nullptr),
|
messangerController(nullptr),
|
||||||
fimTasksWidget(nullptr),
|
|
||||||
adminMode(false),
|
adminMode(false),
|
||||||
loginInstructorLoggedInLocal(QStringLiteral("")),
|
loginInstructorLoggedInLocal(QStringLiteral("")),
|
||||||
nameInstructorLoggedInLocal(QStringLiteral("")),
|
nameInstructorLoggedInLocal(QStringLiteral("")),
|
||||||
language("ENG")
|
idInstructorLoggedInLocal("0"),
|
||||||
|
language(languageENG),
|
||||||
|
flSettingsServerIsChanged(false),
|
||||||
|
ui(new Ui::InstructorsAndTraineesWidget)
|
||||||
{
|
{
|
||||||
ui->setupUi(this);
|
ui->setupUi(this);
|
||||||
|
|
||||||
ui->btnSettings->setObjectName("btnSettings");
|
ui->widget_Control->setObjectName("widgetControl");
|
||||||
ui->tabWidget_Tasks->setObjectName("tabWidgetTasks");
|
|
||||||
ui->widget_Top->setObjectName("widgetTop");
|
|
||||||
|
|
||||||
ui->groupBox_Trainees->setObjectName("groupBox_Trainees");
|
registerMetaType();
|
||||||
|
|
||||||
#ifndef PROJECT_TYPE_DEBUG
|
|
||||||
//ui->btnUpdateStyleSheet->setVisible(false);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
qRegisterMetaType<PacketType>("PacketType");
|
|
||||||
qRegisterMetaType<QList<Instructor>>("QList<Instructor>");
|
|
||||||
qRegisterMetaType<QList<Trainee>>("QList<Trainee>");
|
|
||||||
qRegisterMetaType<QList<Group>>("QList<Group>");
|
|
||||||
qRegisterMetaType<QList<Computer>>("QList<Computer>");
|
|
||||||
qRegisterMetaType<QList<Classroom>>("QList<Classroom>");
|
|
||||||
qRegisterMetaType<QList<Module*>>("QList<Module*>");
|
|
||||||
qRegisterMetaType<QList<QTreeWidgetItem*>>("QList<QTreeWidgetItem*>");
|
|
||||||
qRegisterMetaType<QList<TaskAmmFim>>("QList<TaskAmmFim>");
|
|
||||||
qRegisterMetaType<ClientMessage>("ClientMessage");
|
|
||||||
|
|
||||||
qDebug() << "InstructorsAndTraineesWidget init thread ID " << QThread::currentThreadId();
|
qDebug() << "InstructorsAndTraineesWidget init thread ID " << QThread::currentThreadId();
|
||||||
|
|
||||||
@@ -49,71 +39,48 @@ InstructorsAndTraineesWidget::InstructorsAndTraineesWidget(QWidget *parent) :
|
|||||||
setLanguageInterfase();
|
setLanguageInterfase();
|
||||||
|
|
||||||
connectorToServer = new ConnectorToServer(this);
|
connectorToServer = new ConnectorToServer(this);
|
||||||
connect(connectorToServer,&ConnectorToServer::sigLoginResult,this,&InstructorsAndTraineesWidget::checkLoginResult);
|
connect(connectorToServer, &ConnectorToServer::sigLoginResult, this, &InstructorsAndTraineesWidget::slot_checkLoginResult);
|
||||||
connect(connectorToServer,&ConnectorToServer::sigDeLoginResult,this,&InstructorsAndTraineesWidget::checkDeLoginResult);
|
connect(connectorToServer, &ConnectorToServer::sigDeLoginResult, this, &InstructorsAndTraineesWidget::slot_checkDeLoginResult);
|
||||||
|
|
||||||
viewerTrainees = new ViewerTrainees(connectorToServer, this);
|
messangerController = new MessangerController(connectorToServer, this);
|
||||||
|
|
||||||
|
viewerTrainees = new ViewerTrainees(connectorToServer, messangerController, this);
|
||||||
viewerInstructors = new ViewerInstructors(connectorToServer, this);
|
viewerInstructors = new ViewerInstructors(connectorToServer, this);
|
||||||
connect(this, &InstructorsAndTraineesWidget::signal_NeedUpdateUI, viewerTrainees, &ViewerTrainees::slot_NeedUpdateUI);
|
connect(this, &InstructorsAndTraineesWidget::signal_NeedUpdateUI, viewerTrainees, &ViewerTrainees::slot_NeedUpdateUI);
|
||||||
connect(this, &InstructorsAndTraineesWidget::signal_NeedUpdateUI, viewerInstructors, &ViewerInstructors::slot_NeedUpdateUI);
|
connect(this, &InstructorsAndTraineesWidget::signal_NeedUpdateUI, viewerInstructors, &ViewerInstructors::slot_NeedUpdateUI);
|
||||||
connect(viewerInstructors, &ViewerInstructors::signal_BlockAutorization, this, &InstructorsAndTraineesWidget::signal_BlockAutorization);
|
connect(viewerInstructors, &ViewerInstructors::signal_BlockAutorization, this, &InstructorsAndTraineesWidget::signal_BlockAutorization);
|
||||||
connect(viewerTrainees, &ViewerTrainees::signal_BlockAutorization, this, &InstructorsAndTraineesWidget::signal_BlockAutorization);
|
connect(viewerTrainees, &ViewerTrainees::signal_BlockAutorization, this, &InstructorsAndTraineesWidget::signal_BlockAutorization);
|
||||||
|
|
||||||
//connect(connectorToServer,&ConnectorToServer::signal_UpdateDB,viewerInstructors,&ViewerInstructors::slot_NeedUpdateUI);
|
connect(connectorToServer, &ConnectorToServer::signal_ConnectedToServer, this, &InstructorsAndTraineesWidget::slot_ConnectedToServer);
|
||||||
//connect(connectorToServer,&ConnectorToServer::signal_UpdateDB,viewerTrainees,&ViewerTrainees::slot_NeedUpdateUI);
|
|
||||||
|
|
||||||
connect(connectorToServer,&ConnectorToServer::signal_ConnectedToServer,this,&InstructorsAndTraineesWidget::slot_ConnectedToServer);
|
connect(viewerTrainees, &ViewerTrainees::signal_traineeSelected, this, &InstructorsAndTraineesWidget::slot_traineeSelected);
|
||||||
|
connect(viewerInstructors, &ViewerInstructors::signal_instructorSelected, this, &InstructorsAndTraineesWidget::slot_instructorSelected);
|
||||||
ammTasksWidget = new AMMtasksWidget(connectorToServer, TypeListTreeAMMFIM::listCommon, this);
|
|
||||||
fimTasksWidget = new FIMtasksWidget(connectorToServer, TypeListTreeAMMFIM::listCommon, this);
|
|
||||||
|
|
||||||
connect(connectorToServer, &ConnectorToServer::signal_UpdateTasksFIM, fimTasksWidget, &FIMtasksWidget::slot_NeedUpdateUI);
|
|
||||||
connect(connectorToServer, &ConnectorToServer::signal_UpdateTasksAMM, ammTasksWidget, &AMMtasksWidget::slot_NeedUpdateUI);
|
|
||||||
connect(viewerTrainees, &ViewerTrainees::signal_traineeSelected, fimTasksWidget, &FIMtasksWidget::slot_traineeSelected);
|
|
||||||
connect(viewerTrainees, &ViewerTrainees::signal_traineeSelected, ammTasksWidget, &AMMtasksWidget::slot_traineeSelected);
|
|
||||||
|
|
||||||
messangerWidget = new MessangerWidget(this);
|
|
||||||
//connect(connectorToServer,&ConnectorToServer::signal_InitMessanger,messangerWidget,&MessangerWidget::slot_InitMessanger);
|
|
||||||
connect(viewerTrainees, &ViewerTrainees::signal_traineeSelected, messangerWidget, &MessangerWidget::slot_traineeSelected);
|
|
||||||
connect(messangerWidget, &MessangerWidget::signal_tabMessengerChanged, viewerTrainees, &ViewerTrainees::slot_tabMessengerChanged);
|
|
||||||
connect(messangerWidget, &MessangerWidget::signal_sendMessage, connectorToServer, &ConnectorToServer::slot_sendMessage);
|
|
||||||
connect(connectorToServer,&ConnectorToServer::signal_receiveMessage,messangerWidget,&MessangerWidget::slot_showMessage);
|
|
||||||
|
|
||||||
connect(fimTasksWidget, &FIMtasksWidget::signal_AssignedTask, viewerTrainees, &ViewerTrainees::slot_waitAnimationWidgetShowWithPlayFIM);
|
|
||||||
connect(ammTasksWidget, &AMMtasksWidget::signal_AssignedTask, viewerTrainees, &ViewerTrainees::slot_waitAnimationWidgetShowWithPlayAMM);
|
|
||||||
|
|
||||||
|
viewerTrainees->clearSelection();
|
||||||
|
viewerInstructors->clearSelection();
|
||||||
|
|
||||||
//Размещение
|
//Размещение
|
||||||
ui->verticalLayout_Trainees->addWidget(viewerTrainees);
|
ui->verticalLayout_Trainees->addWidget(viewerTrainees);
|
||||||
|
|
||||||
ui->verticalLayout_AMM->addWidget(ammTasksWidget);
|
|
||||||
ui->verticalLayout_FIM->addWidget(fimTasksWidget);
|
|
||||||
|
|
||||||
ui->verticalLayout_Messenger->addWidget(messangerWidget);
|
|
||||||
|
|
||||||
ui->verticalLayout_Instructors->addWidget(viewerInstructors);
|
ui->verticalLayout_Instructors->addWidget(viewerInstructors);
|
||||||
|
|
||||||
|
ui->groupBox_Messenger->setMinimumHeight(600);
|
||||||
|
|
||||||
ui->groupBox_Messenger->setMaximumWidth(500);
|
ui->groupBox_Messenger->setMaximumWidth(500);
|
||||||
ui->groupBox_Instructors->setMaximumWidth(500);
|
ui->groupBox_Messenger->setMinimumWidth(500);
|
||||||
|
|
||||||
ui->groupBox_Messenger->setMinimumWidth(490);
|
ui->groupBox_Instructors->setMinimumHeight(200);
|
||||||
ui->groupBox_Instructors->setMinimumWidth(490);
|
|
||||||
|
|
||||||
ui->groupBox_Messenger->setMinimumHeight(500);
|
|
||||||
ui->groupBox_Instructors->setMinimumHeight(300);
|
|
||||||
ui->groupBox_Instructors->setMaximumHeight(300);
|
ui->groupBox_Instructors->setMaximumHeight(300);
|
||||||
|
|
||||||
ui->groupBox_Trainees->setMinimumWidth(700);
|
ui->groupBox_Trainees->setMinimumHeight(400);
|
||||||
ui->groupBox_Tasks->setMinimumWidth(600);
|
|
||||||
|
ui->groupBox_Trainees->setMinimumWidth(600);
|
||||||
|
ui->groupBox_Instructors->setMinimumWidth(600);
|
||||||
|
|
||||||
|
|
||||||
|
//Доступность кнопок
|
||||||
ui->btnAuthorizationInstructor->setEnabled(false);
|
ui->btnAuthorizationInstructor->setEnabled(false);
|
||||||
|
|
||||||
ui->btnEditorTrainees->setEnabled(false);
|
ui->btnEditorTrainees->setEnabled(false);
|
||||||
ui->btnEditorInstructors->setEnabled(false);
|
ui->btnEditorInstructors->setEnabled(false);
|
||||||
|
|
||||||
ui->btnSetVersion->hide();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
InstructorsAndTraineesWidget::~InstructorsAndTraineesWidget()
|
InstructorsAndTraineesWidget::~InstructorsAndTraineesWidget()
|
||||||
@@ -121,15 +88,18 @@ InstructorsAndTraineesWidget::~InstructorsAndTraineesWidget()
|
|||||||
if(authorizationIsCompleted())
|
if(authorizationIsCompleted())
|
||||||
deAuthorizationInstructor(loginInstructorLoggedInLocal);
|
deAuthorizationInstructor(loginInstructorLoggedInLocal);
|
||||||
|
|
||||||
delete ammTasksWidget;
|
delete messangerController;
|
||||||
delete fimTasksWidget;
|
|
||||||
delete messangerWidget;
|
|
||||||
delete viewerInstructors;
|
delete viewerInstructors;
|
||||||
delete viewerTrainees;
|
delete viewerTrainees;
|
||||||
delete connectorToServer;
|
delete connectorToServer;
|
||||||
delete ui;
|
delete ui;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QString InstructorsAndTraineesWidget::getLanguage()
|
||||||
|
{
|
||||||
|
return language;
|
||||||
|
}
|
||||||
|
|
||||||
void InstructorsAndTraineesWidget::changeEvent(QEvent *event)
|
void InstructorsAndTraineesWidget::changeEvent(QEvent *event)
|
||||||
{
|
{
|
||||||
// В случае получения события изменения языка приложения
|
// В случае получения события изменения языка приложения
|
||||||
@@ -150,19 +120,13 @@ void InstructorsAndTraineesWidget::updateMyStyleSheet()
|
|||||||
this->setStyleSheet(styleSheet);
|
this->setStyleSheet(styleSheet);
|
||||||
}
|
}
|
||||||
|
|
||||||
QString InstructorsAndTraineesWidget::getLanguage()
|
|
||||||
{
|
|
||||||
return language;
|
|
||||||
}
|
|
||||||
|
|
||||||
QString InstructorsAndTraineesWidget::loadStyleSheet()
|
QString InstructorsAndTraineesWidget::loadStyleSheet()
|
||||||
{
|
{
|
||||||
//QString fileName = ":/resources/css/styleSheetMain.css";
|
|
||||||
QString fileName = "./resources/css/styleSheetMain.css";
|
QString fileName = "./resources/css/styleSheetMain.css";
|
||||||
QFile styleSheetFile(fileName);
|
QFile styleSheetFile(fileName);
|
||||||
if (!styleSheetFile.open(QFile::ReadOnly | QFile::Text))
|
if (!styleSheetFile.open(QFile::ReadOnly | QFile::Text))
|
||||||
{
|
{
|
||||||
QMessageBox::critical(this, tr("Attention!"), tr("The file could not be opened ") + fileName);
|
SpecialMessageBox(this, SpecialMessageBox::TypeSpecMsgBox::critical, tr("The file could not be opened ") + fileName).exec();
|
||||||
return QStringLiteral("");
|
return QStringLiteral("");
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -188,7 +152,7 @@ void InstructorsAndTraineesWidget::slot_UpdateStyleSheet()
|
|||||||
updateMyStyleSheet();
|
updateMyStyleSheet();
|
||||||
}
|
}
|
||||||
|
|
||||||
void InstructorsAndTraineesWidget::checkLoginResult(ServerAuthorization *serverAuth)
|
void InstructorsAndTraineesWidget::slot_checkLoginResult(ServerAuthorization *serverAuth)
|
||||||
{
|
{
|
||||||
if (serverAuth->Result)
|
if (serverAuth->Result)
|
||||||
{
|
{
|
||||||
@@ -210,26 +174,27 @@ void InstructorsAndTraineesWidget::checkLoginResult(ServerAuthorization *serverA
|
|||||||
if(adminMode)
|
if(adminMode)
|
||||||
ui->btnEditorInstructors->setEnabled(true);
|
ui->btnEditorInstructors->setEnabled(true);
|
||||||
|
|
||||||
Q_EMIT signal_NeedUpdateUI(true, true);
|
emit signal_NeedUpdateUI(true, true);
|
||||||
//ui->btnSetVersion->show();
|
|
||||||
//ui->btnAuthorizationInstructor->setText(tr("Deauthorization Instructor"));
|
|
||||||
|
|
||||||
updateLabelLoggedInInstructor(serverAuth->Login, serverAuth->ClientName);
|
updateLabelLoggedInInstructor(serverAuth->Login, serverAuth->ClientName);
|
||||||
connectorToServer->setLoginName(nameInstructorLoggedInLocal);
|
connectorToServer->setLoginName(nameInstructorLoggedInLocal);
|
||||||
|
|
||||||
|
messangerController->setUserLocalGUI_ID(serverAuth->Id.toInt());
|
||||||
|
|
||||||
connectorToServer->sendQueryTasksXML("fim");
|
connectorToServer->sendQueryTasksXML("fim");
|
||||||
connectorToServer->sendQueryTasksXML("amm");
|
connectorToServer->sendQueryTasksXML("amm");
|
||||||
messangerWidget->initialize(serverAuth->Id);
|
|
||||||
//QMessageBox::information(this, tr("Instructor authorization"), tr("Successfully!"));
|
viewerTrainees->activate();
|
||||||
|
viewerInstructors->activate();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
ui->btnAuthorizationInstructor->setChecked(false);
|
ui->btnAuthorizationInstructor->setChecked(false);
|
||||||
QMessageBox::warning(this, tr("Instructor authorization"), tr("Invalid login or password!"));
|
SpecialMessageBox(this, SpecialMessageBox::TypeSpecMsgBox::critical, tr("Instructor authorization.") + "\n" + tr("Invalid login or password!")).exec();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void InstructorsAndTraineesWidget::checkDeLoginResult(ServerDeAuthorization *serverDeAuth)
|
void InstructorsAndTraineesWidget::slot_checkDeLoginResult(ServerDeAuthorization *serverDeAuth)
|
||||||
{
|
{
|
||||||
if (serverDeAuth->Result)
|
if (serverDeAuth->Result)
|
||||||
{
|
{
|
||||||
@@ -245,17 +210,12 @@ void InstructorsAndTraineesWidget::checkDeLoginResult(ServerDeAuthorization *ser
|
|||||||
ui->btnEditorTrainees->setEnabled(false);
|
ui->btnEditorTrainees->setEnabled(false);
|
||||||
ui->btnEditorInstructors->setEnabled(false);
|
ui->btnEditorInstructors->setEnabled(false);
|
||||||
|
|
||||||
//Q_EMIT signal_NeedUpdateUI(true, false);
|
|
||||||
|
|
||||||
//ui->btnAuthorizationInstructor->setText(tr("Authorization Instructor"));
|
|
||||||
updateLabelLoggedInInstructor("","");
|
updateLabelLoggedInInstructor("","");
|
||||||
|
|
||||||
//QMessageBox::information(this, tr("Instructor deauthorization"), tr("Successfully!"));
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
ui->btnAuthorizationInstructor->setChecked(true);
|
ui->btnAuthorizationInstructor->setChecked(true);
|
||||||
QMessageBox::warning(this, tr("Instructor deauthorization"), tr("Error!"));
|
SpecialMessageBox(this, SpecialMessageBox::TypeSpecMsgBox::critical, tr("Instructor deauthorization") + "\n" + tr("Error!")).exec();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -268,9 +228,6 @@ void InstructorsAndTraineesWidget::slot_ConnectedToServer(bool state)
|
|||||||
|
|
||||||
ui->lblDBisConnected->setPixmap(QPixmap(QStringLiteral(":/resources/icons/circleGreen.png")));
|
ui->lblDBisConnected->setPixmap(QPixmap(QStringLiteral(":/resources/icons/circleGreen.png")));
|
||||||
|
|
||||||
//ServerSettings serverSettings = connectorToServer->getServerSettings();
|
|
||||||
//ui->lblServer->setText(serverSettings.Address + ":" +serverSettings.Port);
|
|
||||||
|
|
||||||
updateLabelLoggedInInstructor(loginInstructorLoggedInLocal, nameInstructorLoggedInLocal);
|
updateLabelLoggedInInstructor(loginInstructorLoggedInLocal, nameInstructorLoggedInLocal);
|
||||||
updateLabelServer();
|
updateLabelServer();
|
||||||
}
|
}
|
||||||
@@ -278,11 +235,8 @@ void InstructorsAndTraineesWidget::slot_ConnectedToServer(bool state)
|
|||||||
{//Сервер отключен
|
{//Сервер отключен
|
||||||
ui->btnConnectionToServer->setEnabled(true);
|
ui->btnConnectionToServer->setEnabled(true);
|
||||||
ui->btnAuthorizationInstructor->setEnabled(false);
|
ui->btnAuthorizationInstructor->setEnabled(false);
|
||||||
//ui->btnAuthorizationInstructor->setText(tr("Authorization Instructor"));
|
|
||||||
ui->btnAuthorizationInstructor->setChecked(false);
|
ui->btnAuthorizationInstructor->setChecked(false);
|
||||||
//ui->btnSetVersion->hide();
|
|
||||||
ui->lblDBisConnected->setPixmap(QPixmap(QStringLiteral(":/resources/icons/circleGray.png")));
|
ui->lblDBisConnected->setPixmap(QPixmap(QStringLiteral(":/resources/icons/circleGray.png")));
|
||||||
//ui->lblServer->setText(tr("none"));
|
|
||||||
|
|
||||||
viewerInstructors->setAuthComplited(false);
|
viewerInstructors->setAuthComplited(false);
|
||||||
viewerTrainees->setAuthComplited(false);
|
viewerTrainees->setAuthComplited(false);
|
||||||
@@ -293,10 +247,7 @@ void InstructorsAndTraineesWidget::slot_ConnectedToServer(bool state)
|
|||||||
viewerTrainees->deactivate();
|
viewerTrainees->deactivate();
|
||||||
viewerInstructors->deactivate();
|
viewerInstructors->deactivate();
|
||||||
|
|
||||||
ammTasksWidget->deactivate();
|
messangerController->deleteAllWidgets();
|
||||||
fimTasksWidget->deactivate();
|
|
||||||
|
|
||||||
messangerWidget->clear();
|
|
||||||
|
|
||||||
loginInstructorLoggedInLocal = "";
|
loginInstructorLoggedInLocal = "";
|
||||||
nameInstructorLoggedInLocal = "";
|
nameInstructorLoggedInLocal = "";
|
||||||
@@ -304,14 +255,47 @@ void InstructorsAndTraineesWidget::slot_ConnectedToServer(bool state)
|
|||||||
updateLabelLoggedInInstructor(loginInstructorLoggedInLocal, nameInstructorLoggedInLocal);
|
updateLabelLoggedInInstructor(loginInstructorLoggedInLocal, nameInstructorLoggedInLocal);
|
||||||
updateLabelServer();
|
updateLabelServer();
|
||||||
|
|
||||||
QMessageBox::warning(this, tr("Warning!"), tr("The server is disabled"));
|
if(!flSettingsServerIsChanged)
|
||||||
}
|
SpecialMessageBox(this, SpecialMessageBox::TypeSpecMsgBox::warningClose, tr("The server is not available!")).exec();
|
||||||
|
else
|
||||||
|
flSettingsServerIsChanged = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void InstructorsAndTraineesWidget::slot_traineeSelected(int id_trainee)
|
||||||
|
{
|
||||||
|
viewerInstructors->clearSelection();
|
||||||
|
|
||||||
|
/*Messanger*/
|
||||||
|
messangerController->deleteWidget(messangerWidget);
|
||||||
|
if(id_trainee)
|
||||||
|
{
|
||||||
|
Trainee trainee = connectorToServer->getTrainee(id_trainee);
|
||||||
|
if(trainee.getID())
|
||||||
|
messangerWidget = messangerController->newWidget(this, &trainee, ui->verticalLayout_Messenger);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void InstructorsAndTraineesWidget::slot_instructorSelected(int id_instructor)
|
||||||
|
{
|
||||||
|
viewerTrainees->clearSelection();
|
||||||
|
|
||||||
|
/*Messanger*/
|
||||||
|
messangerController->deleteWidget(messangerWidget);
|
||||||
|
if(id_instructor && id_instructor != idInstructorLoggedInLocal.toInt())
|
||||||
|
{
|
||||||
|
Instructor instructor = connectorToServer->getInstructor(id_instructor);
|
||||||
|
if(instructor.getID())
|
||||||
|
messangerWidget = messangerController->newWidget(this, &instructor, ui->verticalLayout_Messenger);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool InstructorsAndTraineesWidget::authorizationInstructorDialog(QWidget* parent)
|
bool InstructorsAndTraineesWidget::authorizationInstructorDialog(QWidget* parent)
|
||||||
{
|
{
|
||||||
DialogAuthorizationInstructor dlg(parent);
|
DialogAuthorizationInstructor dlg(parent);
|
||||||
dlg.setWindowTitle(tr("Instructor authorization"));
|
dlg.setWindowTitle(tr("Instructor authorization"));
|
||||||
|
dlg.setWindowFlags(dlg.windowFlags() & ~Qt::WindowContextHelpButtonHint);
|
||||||
|
dlg.setStyleSheet(this->styleSheet());
|
||||||
|
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
@@ -366,7 +350,7 @@ void InstructorsAndTraineesWidget::on_btnAuthorizationInstructor_clicked()
|
|||||||
{
|
{
|
||||||
connect(connectorToServer,&ConnectorToServer::signal_UpdateDB,viewerInstructors,&ViewerInstructors::slot_NeedUpdateUI);
|
connect(connectorToServer,&ConnectorToServer::signal_UpdateDB,viewerInstructors,&ViewerInstructors::slot_NeedUpdateUI);
|
||||||
connect(connectorToServer,&ConnectorToServer::signal_UpdateDB,viewerTrainees,&ViewerTrainees::slot_NeedUpdateUI);
|
connect(connectorToServer,&ConnectorToServer::signal_UpdateDB,viewerTrainees,&ViewerTrainees::slot_NeedUpdateUI);
|
||||||
connect(connectorToServer,&ConnectorToServer::signal_InitMessanger,messangerWidget,&MessangerWidget::slot_InitMessanger);
|
connect(connectorToServer,&ConnectorToServer::signal_reInitMessangerByUsers,messangerController,&MessangerController::slot_reinitMessangers);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
ui->btnAuthorizationInstructor->setChecked(false);
|
ui->btnAuthorizationInstructor->setChecked(false);
|
||||||
@@ -379,15 +363,12 @@ void InstructorsAndTraineesWidget::on_btnAuthorizationInstructor_clicked()
|
|||||||
{
|
{
|
||||||
disconnect(connectorToServer,&ConnectorToServer::signal_UpdateDB,viewerInstructors,&ViewerInstructors::slot_NeedUpdateUI);
|
disconnect(connectorToServer,&ConnectorToServer::signal_UpdateDB,viewerInstructors,&ViewerInstructors::slot_NeedUpdateUI);
|
||||||
disconnect(connectorToServer,&ConnectorToServer::signal_UpdateDB,viewerTrainees,&ViewerTrainees::slot_NeedUpdateUI);
|
disconnect(connectorToServer,&ConnectorToServer::signal_UpdateDB,viewerTrainees,&ViewerTrainees::slot_NeedUpdateUI);
|
||||||
disconnect(connectorToServer,&ConnectorToServer::signal_InitMessanger,messangerWidget,&MessangerWidget::slot_InitMessanger);
|
disconnect(connectorToServer,&ConnectorToServer::signal_reInitMessangerByUsers,messangerController,&MessangerController::slot_reinitMessangers);
|
||||||
|
|
||||||
viewerTrainees->deactivate();
|
viewerTrainees->deactivate();
|
||||||
viewerInstructors->deactivate();
|
viewerInstructors->deactivate();
|
||||||
|
|
||||||
ammTasksWidget->deactivate();
|
messangerController->deleteAllWidgets();
|
||||||
fimTasksWidget->deactivate();
|
|
||||||
|
|
||||||
messangerWidget->clear();
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
ui->btnAuthorizationInstructor->setChecked(true);
|
ui->btnAuthorizationInstructor->setChecked(true);
|
||||||
@@ -433,20 +414,25 @@ void InstructorsAndTraineesWidget::setLanguageInterfase()
|
|||||||
DialogSettings::loadSettings(&settings);
|
DialogSettings::loadSettings(&settings);
|
||||||
|
|
||||||
if(settings.Language == "ENG")
|
if(settings.Language == "ENG")
|
||||||
qtLanguageTranslator.load(QString("translations/InstructorsAndTraineesWidget_") + "en_EN", ".");
|
{
|
||||||
|
qtLanguageTranslator.load(QString("translations/InstructorsAndTraineesWidget_") + languageENG, ".");
|
||||||
|
language = languageENG;
|
||||||
|
}
|
||||||
else
|
else
|
||||||
qtLanguageTranslator.load(QString("translations/InstructorsAndTraineesWidget_") + "ru_RU", ".");
|
{
|
||||||
qApp->installTranslator(&qtLanguageTranslator);
|
qtLanguageTranslator.load(QString("translations/InstructorsAndTraineesWidget_") + languageRUS, ".");
|
||||||
}
|
language = languageRUS;
|
||||||
|
}
|
||||||
|
|
||||||
void InstructorsAndTraineesWidget::on_btnSetVersion_clicked()
|
qApp->installTranslator(&qtLanguageTranslator);
|
||||||
{
|
|
||||||
connectorToServer->showVersionSelect();
|
emit signal_LanguageChanged(language);
|
||||||
}
|
}
|
||||||
|
|
||||||
void InstructorsAndTraineesWidget::on_btnSettings_clicked()
|
void InstructorsAndTraineesWidget::on_btnSettings_clicked()
|
||||||
{
|
{
|
||||||
DialogSettings dlg(connectorToServer, (loginInstructorLoggedInLocal != ""), this);
|
DialogSettings dlg(connectorToServer, (loginInstructorLoggedInLocal != ""), this);
|
||||||
|
dlg.setWindowFlags(dlg.windowFlags() & ~Qt::WindowContextHelpButtonHint);
|
||||||
|
|
||||||
connect(&dlg, &DialogSettings::signal_LanguageChanged, this, &InstructorsAndTraineesWidget::slot_LanguageChanged);
|
connect(&dlg, &DialogSettings::signal_LanguageChanged, this, &InstructorsAndTraineesWidget::slot_LanguageChanged);
|
||||||
connect(&dlg, &DialogSettings::signal_UpdateStyleSheet, this, &InstructorsAndTraineesWidget::slot_UpdateStyleSheet);
|
connect(&dlg, &DialogSettings::signal_UpdateStyleSheet, this, &InstructorsAndTraineesWidget::slot_UpdateStyleSheet);
|
||||||
@@ -460,7 +446,9 @@ void InstructorsAndTraineesWidget::on_btnSettings_clicked()
|
|||||||
|
|
||||||
if(dlg.settingsServerIsChanged())
|
if(dlg.settingsServerIsChanged())
|
||||||
{
|
{
|
||||||
QMessageBox::warning(this, tr("Attention!"), tr("Server settings have been changed. Please reconnect to the server."));
|
SpecialMessageBox(this, SpecialMessageBox::TypeSpecMsgBox::warningClose, tr("Server settings have been changed. Please reconnect to the server.")).exec();
|
||||||
|
|
||||||
|
flSettingsServerIsChanged = true;
|
||||||
|
|
||||||
if(authorizationIsCompleted())
|
if(authorizationIsCompleted())
|
||||||
deAuthorizationInstructor(loginInstructorLoggedInLocal);
|
deAuthorizationInstructor(loginInstructorLoggedInLocal);
|
||||||
|
|||||||
@@ -7,19 +7,9 @@
|
|||||||
#include "viewertrainees.h"
|
#include "viewertrainees.h"
|
||||||
#include "viewerinstructors.h"
|
#include "viewerinstructors.h"
|
||||||
#include "messangerwidget.h"
|
#include "messangerwidget.h"
|
||||||
#include "ammtaskswidget.h"
|
#include "messangercontroller.h"
|
||||||
#include "fimtaskswidget.h"
|
|
||||||
#include "connectortoserver.h"
|
#include "connectortoserver.h"
|
||||||
#include "tasksAmmFim.h"
|
#include "metatypes.h"
|
||||||
|
|
||||||
Q_DECLARE_METATYPE(QList<Instructor>)
|
|
||||||
Q_DECLARE_METATYPE(QList<Trainee>)
|
|
||||||
Q_DECLARE_METATYPE(QList<Group>)
|
|
||||||
Q_DECLARE_METATYPE(QList<Computer>)
|
|
||||||
Q_DECLARE_METATYPE(QList<Classroom>)
|
|
||||||
Q_DECLARE_METATYPE(QList<Module*>)
|
|
||||||
Q_DECLARE_METATYPE(QList<QTreeWidgetItem*>)
|
|
||||||
Q_DECLARE_METATYPE(QList<TaskAmmFim>)
|
|
||||||
|
|
||||||
|
|
||||||
namespace Ui {
|
namespace Ui {
|
||||||
@@ -34,13 +24,18 @@ public:
|
|||||||
explicit InstructorsAndTraineesWidget(QWidget *parent = nullptr);
|
explicit InstructorsAndTraineesWidget(QWidget *parent = nullptr);
|
||||||
~InstructorsAndTraineesWidget();
|
~InstructorsAndTraineesWidget();
|
||||||
|
|
||||||
|
public:
|
||||||
|
static const QString languageENG;
|
||||||
|
static const QString languageRUS;
|
||||||
|
|
||||||
|
public:
|
||||||
|
QString getLanguage();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void changeEvent(QEvent * event) override;
|
void changeEvent(QEvent * event) override;
|
||||||
|
|
||||||
public:
|
|
||||||
void updateMyStyleSheet();
|
|
||||||
QString getLanguage();
|
|
||||||
private:
|
private:
|
||||||
|
void updateMyStyleSheet();
|
||||||
QString loadStyleSheet();
|
QString loadStyleSheet();
|
||||||
|
|
||||||
public Q_SLOTS:
|
public Q_SLOTS:
|
||||||
@@ -49,16 +44,18 @@ public Q_SLOTS:
|
|||||||
//Слот обработки смены стиля
|
//Слот обработки смены стиля
|
||||||
void slot_UpdateStyleSheet();
|
void slot_UpdateStyleSheet();
|
||||||
|
|
||||||
|
|
||||||
//Слот обработки результата авторизации
|
//Слот обработки результата авторизации
|
||||||
void checkLoginResult(ServerAuthorization * serverAuth);
|
void slot_checkLoginResult(ServerAuthorization * serverAuth);
|
||||||
//Слот обработки результата деавторизации
|
//Слот обработки результата деавторизации
|
||||||
void checkDeLoginResult(ServerDeAuthorization * serverDeAuth);
|
void slot_checkDeLoginResult(ServerDeAuthorization * serverDeAuth);
|
||||||
|
//Слот обработки результата подключения к серверу
|
||||||
void slot_ConnectedToServer(bool state);
|
void slot_ConnectedToServer(bool state);
|
||||||
|
|
||||||
|
void slot_traineeSelected(int id_trainee);
|
||||||
|
void slot_instructorSelected(int id_instructor);
|
||||||
|
|
||||||
Q_SIGNALS:
|
Q_SIGNALS:
|
||||||
//Слот смены языка
|
//сигнал смены языка
|
||||||
void signal_LanguageChanged(QString language);
|
void signal_LanguageChanged(QString language);
|
||||||
//сигнал о необходимости обновления интерфейса
|
//сигнал о необходимости обновления интерфейса
|
||||||
void signal_NeedUpdateUI(bool treeInstructor, bool treeTrainee);
|
void signal_NeedUpdateUI(bool treeInstructor, bool treeTrainee);
|
||||||
@@ -68,17 +65,12 @@ Q_SIGNALS:
|
|||||||
private Q_SLOTS:
|
private Q_SLOTS:
|
||||||
void on_btnConnectionToServer_clicked();
|
void on_btnConnectionToServer_clicked();
|
||||||
void on_btnAuthorizationInstructor_clicked();
|
void on_btnAuthorizationInstructor_clicked();
|
||||||
|
|
||||||
void on_btnSetVersion_clicked();
|
|
||||||
|
|
||||||
void on_btnSettings_clicked();
|
void on_btnSettings_clicked();
|
||||||
|
|
||||||
void on_btnEditorTrainees_clicked();
|
void on_btnEditorTrainees_clicked();
|
||||||
|
|
||||||
void on_btnEditorInstructors_clicked();
|
void on_btnEditorInstructors_clicked();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
//Авторизация инструктора локальная
|
//Авторизация инструктора локальная (на ГУИ)
|
||||||
bool authorizationInstructorDialog(QWidget* parent = nullptr);
|
bool authorizationInstructorDialog(QWidget* parent = nullptr);
|
||||||
bool deAuthorizationInstructor(QString login);
|
bool deAuthorizationInstructor(QString login);
|
||||||
bool authorizationIsCompleted();
|
bool authorizationIsCompleted();
|
||||||
@@ -88,15 +80,12 @@ private:
|
|||||||
void setLanguageInterfase();
|
void setLanguageInterfase();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Ui::InstructorsAndTraineesWidget *ui;
|
|
||||||
|
|
||||||
ConnectorToServer* connectorToServer;
|
ConnectorToServer* connectorToServer;
|
||||||
|
|
||||||
ViewerTrainees* viewerTrainees;
|
ViewerTrainees* viewerTrainees;
|
||||||
ViewerInstructors* viewerInstructors;
|
ViewerInstructors* viewerInstructors;
|
||||||
MessangerWidget* messangerWidget;
|
MessangerWidget* messangerWidget;
|
||||||
AMMtasksWidget* ammTasksWidget;
|
MessangerController* messangerController;
|
||||||
FIMtasksWidget* fimTasksWidget;
|
|
||||||
|
|
||||||
bool adminMode;
|
bool adminMode;
|
||||||
QString loginInstructorLoggedInLocal;
|
QString loginInstructorLoggedInLocal;
|
||||||
@@ -105,6 +94,10 @@ private:
|
|||||||
|
|
||||||
QTranslator qtLanguageTranslator;
|
QTranslator qtLanguageTranslator;
|
||||||
QString language;
|
QString language;
|
||||||
|
|
||||||
|
bool flSettingsServerIsChanged;
|
||||||
|
|
||||||
|
Ui::InstructorsAndTraineesWidget *ui;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // INSTRUCTORSANDTRAINEESWIDGET_H
|
#endif // INSTRUCTORSANDTRAINEESWIDGET_H
|
||||||
|
|||||||
@@ -29,358 +29,165 @@
|
|||||||
<item row="0" column="0">
|
<item row="0" column="0">
|
||||||
<layout class="QVBoxLayout" name="verticalLayout_Main">
|
<layout class="QVBoxLayout" name="verticalLayout_Main">
|
||||||
<item>
|
<item>
|
||||||
<widget class="QWidget" name="widget_Top" native="true">
|
<layout class="QHBoxLayout" name="horizontalLayout_Main">
|
||||||
<property name="sizePolicy">
|
|
||||||
<sizepolicy hsizetype="Expanding" vsizetype="Preferred">
|
|
||||||
<horstretch>0</horstretch>
|
|
||||||
<verstretch>0</verstretch>
|
|
||||||
</sizepolicy>
|
|
||||||
</property>
|
|
||||||
<layout class="QGridLayout" name="gridLayout_6">
|
|
||||||
<item row="0" column="0">
|
|
||||||
<layout class="QHBoxLayout" name="horizontalLayout_Top">
|
|
||||||
<item>
|
|
||||||
<widget class="QToolButton" name="btnConnectionToServer">
|
|
||||||
<property name="minimumSize">
|
|
||||||
<size>
|
|
||||||
<width>130</width>
|
|
||||||
<height>58</height>
|
|
||||||
</size>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>Connection</string>
|
|
||||||
</property>
|
|
||||||
<property name="icon">
|
|
||||||
<iconset resource="resources.qrc">
|
|
||||||
<normaloff>:/resources/icons/connectDB.png</normaloff>:/resources/icons/connectDB.png</iconset>
|
|
||||||
</property>
|
|
||||||
<property name="iconSize">
|
|
||||||
<size>
|
|
||||||
<width>32</width>
|
|
||||||
<height>32</height>
|
|
||||||
</size>
|
|
||||||
</property>
|
|
||||||
<property name="checkable">
|
|
||||||
<bool>false</bool>
|
|
||||||
</property>
|
|
||||||
<property name="toolButtonStyle">
|
|
||||||
<enum>Qt::ToolButtonTextUnderIcon</enum>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<widget class="QToolButton" name="btnAuthorizationInstructor">
|
|
||||||
<property name="minimumSize">
|
|
||||||
<size>
|
|
||||||
<width>130</width>
|
|
||||||
<height>58</height>
|
|
||||||
</size>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>Authorization</string>
|
|
||||||
</property>
|
|
||||||
<property name="icon">
|
|
||||||
<iconset resource="resources.qrc">
|
|
||||||
<normaloff>:/resources/icons/login-user.png</normaloff>:/resources/icons/login-user.png</iconset>
|
|
||||||
</property>
|
|
||||||
<property name="iconSize">
|
|
||||||
<size>
|
|
||||||
<width>32</width>
|
|
||||||
<height>32</height>
|
|
||||||
</size>
|
|
||||||
</property>
|
|
||||||
<property name="checkable">
|
|
||||||
<bool>true</bool>
|
|
||||||
</property>
|
|
||||||
<property name="toolButtonStyle">
|
|
||||||
<enum>Qt::ToolButtonTextUnderIcon</enum>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<widget class="QLabel" name="lblDBisConnected">
|
|
||||||
<property name="minimumSize">
|
|
||||||
<size>
|
|
||||||
<width>32</width>
|
|
||||||
<height>32</height>
|
|
||||||
</size>
|
|
||||||
</property>
|
|
||||||
<property name="maximumSize">
|
|
||||||
<size>
|
|
||||||
<width>32</width>
|
|
||||||
<height>32</height>
|
|
||||||
</size>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string/>
|
|
||||||
</property>
|
|
||||||
<property name="pixmap">
|
|
||||||
<pixmap resource="resources.qrc">:/resources/icons/circleGray.png</pixmap>
|
|
||||||
</property>
|
|
||||||
<property name="scaledContents">
|
|
||||||
<bool>true</bool>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<widget class="QLabel" name="lblServerPrefix">
|
|
||||||
<property name="text">
|
|
||||||
<string>Server: </string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<widget class="QLabel" name="lblServer">
|
|
||||||
<property name="text">
|
|
||||||
<string>none</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<widget class="QLabel" name="lblLoggedIn">
|
|
||||||
<property name="minimumSize">
|
|
||||||
<size>
|
|
||||||
<width>32</width>
|
|
||||||
<height>32</height>
|
|
||||||
</size>
|
|
||||||
</property>
|
|
||||||
<property name="maximumSize">
|
|
||||||
<size>
|
|
||||||
<width>32</width>
|
|
||||||
<height>32</height>
|
|
||||||
</size>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string/>
|
|
||||||
</property>
|
|
||||||
<property name="pixmap">
|
|
||||||
<pixmap resource="resources.qrc">:/resources/icons/circleGray.png</pixmap>
|
|
||||||
</property>
|
|
||||||
<property name="scaledContents">
|
|
||||||
<bool>true</bool>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<widget class="QLabel" name="lblLoggedInPrefix">
|
|
||||||
<property name="maximumSize">
|
|
||||||
<size>
|
|
||||||
<width>16777215</width>
|
|
||||||
<height>40</height>
|
|
||||||
</size>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>Logged in Instructor: </string>
|
|
||||||
</property>
|
|
||||||
<property name="textFormat">
|
|
||||||
<enum>Qt::AutoText</enum>
|
|
||||||
</property>
|
|
||||||
<property name="scaledContents">
|
|
||||||
<bool>false</bool>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<widget class="QLabel" name="lblLoggedInInstructor">
|
|
||||||
<property name="maximumSize">
|
|
||||||
<size>
|
|
||||||
<width>16777215</width>
|
|
||||||
<height>40</height>
|
|
||||||
</size>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>none</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<spacer name="horizontalSpacer">
|
|
||||||
<property name="orientation">
|
|
||||||
<enum>Qt::Horizontal</enum>
|
|
||||||
</property>
|
|
||||||
<property name="sizeHint" stdset="0">
|
|
||||||
<size>
|
|
||||||
<width>40</width>
|
|
||||||
<height>20</height>
|
|
||||||
</size>
|
|
||||||
</property>
|
|
||||||
</spacer>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<widget class="QToolButton" name="btnSetVersion">
|
|
||||||
<property name="minimumSize">
|
|
||||||
<size>
|
|
||||||
<width>58</width>
|
|
||||||
<height>58</height>
|
|
||||||
</size>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>ChangeVersion</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<widget class="QToolButton" name="btnEditorTrainees">
|
|
||||||
<property name="minimumSize">
|
|
||||||
<size>
|
|
||||||
<width>58</width>
|
|
||||||
<height>58</height>
|
|
||||||
</size>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>Editor Trainees</string>
|
|
||||||
</property>
|
|
||||||
<property name="icon">
|
|
||||||
<iconset resource="resources.qrc">
|
|
||||||
<normaloff>:/resources/icons/DB-trainees.png</normaloff>:/resources/icons/DB-trainees.png</iconset>
|
|
||||||
</property>
|
|
||||||
<property name="iconSize">
|
|
||||||
<size>
|
|
||||||
<width>32</width>
|
|
||||||
<height>32</height>
|
|
||||||
</size>
|
|
||||||
</property>
|
|
||||||
<property name="toolButtonStyle">
|
|
||||||
<enum>Qt::ToolButtonTextUnderIcon</enum>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<widget class="QToolButton" name="btnEditorInstructors">
|
|
||||||
<property name="minimumSize">
|
|
||||||
<size>
|
|
||||||
<width>58</width>
|
|
||||||
<height>58</height>
|
|
||||||
</size>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>Editor Instructors</string>
|
|
||||||
</property>
|
|
||||||
<property name="icon">
|
|
||||||
<iconset resource="resources.qrc">
|
|
||||||
<normaloff>:/resources/icons/DB-instructors.png</normaloff>:/resources/icons/DB-instructors.png</iconset>
|
|
||||||
</property>
|
|
||||||
<property name="iconSize">
|
|
||||||
<size>
|
|
||||||
<width>32</width>
|
|
||||||
<height>32</height>
|
|
||||||
</size>
|
|
||||||
</property>
|
|
||||||
<property name="toolButtonStyle">
|
|
||||||
<enum>Qt::ToolButtonTextUnderIcon</enum>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<widget class="QToolButton" name="btnSettings">
|
|
||||||
<property name="minimumSize">
|
|
||||||
<size>
|
|
||||||
<width>58</width>
|
|
||||||
<height>58</height>
|
|
||||||
</size>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>Settings</string>
|
|
||||||
</property>
|
|
||||||
<property name="icon">
|
|
||||||
<iconset resource="resources.qrc">
|
|
||||||
<normaloff>:/resources/icons/settings.png</normaloff>:/resources/icons/settings.png</iconset>
|
|
||||||
</property>
|
|
||||||
<property name="iconSize">
|
|
||||||
<size>
|
|
||||||
<width>32</width>
|
|
||||||
<height>32</height>
|
|
||||||
</size>
|
|
||||||
</property>
|
|
||||||
<property name="toolButtonStyle">
|
|
||||||
<enum>Qt::ToolButtonTextUnderIcon</enum>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
</layout>
|
|
||||||
</item>
|
|
||||||
</layout>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<layout class="QHBoxLayout" name="horizontalLayout_Bottom">
|
|
||||||
<item>
|
<item>
|
||||||
<layout class="QVBoxLayout" name="verticalLayout_L">
|
<widget class="QWidget" name="widget_Control" native="true">
|
||||||
<item>
|
|
||||||
<layout class="QHBoxLayout" name="horizontalLayout_L">
|
|
||||||
<item>
|
|
||||||
<widget class="QGroupBox" name="groupBox_Trainees">
|
|
||||||
<property name="sizePolicy">
|
|
||||||
<sizepolicy hsizetype="Expanding" vsizetype="Expanding">
|
|
||||||
<horstretch>0</horstretch>
|
|
||||||
<verstretch>0</verstretch>
|
|
||||||
</sizepolicy>
|
|
||||||
</property>
|
|
||||||
<property name="title">
|
|
||||||
<string>Trainees</string>
|
|
||||||
</property>
|
|
||||||
<layout class="QGridLayout" name="gridLayout_2">
|
|
||||||
<item row="0" column="0">
|
|
||||||
<layout class="QVBoxLayout" name="verticalLayout_Trainees"/>
|
|
||||||
</item>
|
|
||||||
</layout>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
</layout>
|
|
||||||
</item>
|
|
||||||
</layout>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<widget class="QGroupBox" name="groupBox_Tasks">
|
|
||||||
<property name="sizePolicy">
|
<property name="sizePolicy">
|
||||||
<sizepolicy hsizetype="Expanding" vsizetype="Expanding">
|
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
|
||||||
<horstretch>0</horstretch>
|
<horstretch>0</horstretch>
|
||||||
<verstretch>0</verstretch>
|
<verstretch>0</verstretch>
|
||||||
</sizepolicy>
|
</sizepolicy>
|
||||||
</property>
|
</property>
|
||||||
<property name="title">
|
<layout class="QGridLayout" name="gridLayout_6">
|
||||||
<string>Tasks</string>
|
<item row="1" column="0">
|
||||||
</property>
|
<layout class="QVBoxLayout" name="verticalLayout_Control">
|
||||||
<layout class="QGridLayout" name="gridLayout_3">
|
|
||||||
<item row="0" column="0">
|
|
||||||
<layout class="QHBoxLayout" name="horizontalLayout_Tasks">
|
|
||||||
<item>
|
<item>
|
||||||
<widget class="QTabWidget" name="tabWidget_Tasks">
|
<widget class="QToolButton" name="btnConnectionToServer">
|
||||||
<property name="currentIndex">
|
<property name="minimumSize">
|
||||||
<number>1</number>
|
<size>
|
||||||
|
<width>130</width>
|
||||||
|
<height>58</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>Connection</string>
|
||||||
|
</property>
|
||||||
|
<property name="icon">
|
||||||
|
<iconset resource="resources.qrc">
|
||||||
|
<normaloff>:/resources/icons/connectDB.png</normaloff>:/resources/icons/connectDB.png</iconset>
|
||||||
|
</property>
|
||||||
|
<property name="iconSize">
|
||||||
|
<size>
|
||||||
|
<width>32</width>
|
||||||
|
<height>32</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
<property name="checkable">
|
||||||
|
<bool>false</bool>
|
||||||
|
</property>
|
||||||
|
<property name="toolButtonStyle">
|
||||||
|
<enum>Qt::ToolButtonTextUnderIcon</enum>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QToolButton" name="btnAuthorizationInstructor">
|
||||||
|
<property name="minimumSize">
|
||||||
|
<size>
|
||||||
|
<width>130</width>
|
||||||
|
<height>58</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>Authorization</string>
|
||||||
|
</property>
|
||||||
|
<property name="icon">
|
||||||
|
<iconset resource="resources.qrc">
|
||||||
|
<normaloff>:/resources/icons/login-user.png</normaloff>:/resources/icons/login-user.png</iconset>
|
||||||
|
</property>
|
||||||
|
<property name="iconSize">
|
||||||
|
<size>
|
||||||
|
<width>32</width>
|
||||||
|
<height>32</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
<property name="checkable">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
<property name="toolButtonStyle">
|
||||||
|
<enum>Qt::ToolButtonTextUnderIcon</enum>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QToolButton" name="btnEditorTrainees">
|
||||||
|
<property name="minimumSize">
|
||||||
|
<size>
|
||||||
|
<width>130</width>
|
||||||
|
<height>58</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>Trainee editor</string>
|
||||||
|
</property>
|
||||||
|
<property name="icon">
|
||||||
|
<iconset resource="resources.qrc">
|
||||||
|
<normaloff>:/resources/icons/DB-trainees.png</normaloff>:/resources/icons/DB-trainees.png</iconset>
|
||||||
|
</property>
|
||||||
|
<property name="iconSize">
|
||||||
|
<size>
|
||||||
|
<width>32</width>
|
||||||
|
<height>32</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
<property name="toolButtonStyle">
|
||||||
|
<enum>Qt::ToolButtonTextUnderIcon</enum>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QToolButton" name="btnEditorInstructors">
|
||||||
|
<property name="minimumSize">
|
||||||
|
<size>
|
||||||
|
<width>130</width>
|
||||||
|
<height>58</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>Instructor editor</string>
|
||||||
|
</property>
|
||||||
|
<property name="icon">
|
||||||
|
<iconset resource="resources.qrc">
|
||||||
|
<normaloff>:/resources/icons/DB-instructors.png</normaloff>:/resources/icons/DB-instructors.png</iconset>
|
||||||
|
</property>
|
||||||
|
<property name="iconSize">
|
||||||
|
<size>
|
||||||
|
<width>32</width>
|
||||||
|
<height>32</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
<property name="toolButtonStyle">
|
||||||
|
<enum>Qt::ToolButtonTextUnderIcon</enum>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<spacer name="verticalSpacer">
|
||||||
|
<property name="orientation">
|
||||||
|
<enum>Qt::Vertical</enum>
|
||||||
|
</property>
|
||||||
|
<property name="sizeHint" stdset="0">
|
||||||
|
<size>
|
||||||
|
<width>20</width>
|
||||||
|
<height>40</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
</spacer>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QToolButton" name="btnSettings">
|
||||||
|
<property name="minimumSize">
|
||||||
|
<size>
|
||||||
|
<width>130</width>
|
||||||
|
<height>58</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>Settings</string>
|
||||||
|
</property>
|
||||||
|
<property name="icon">
|
||||||
|
<iconset resource="resources.qrc">
|
||||||
|
<normaloff>:/resources/icons/settings.png</normaloff>:/resources/icons/settings.png</iconset>
|
||||||
|
</property>
|
||||||
|
<property name="iconSize">
|
||||||
|
<size>
|
||||||
|
<width>32</width>
|
||||||
|
<height>32</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
<property name="toolButtonStyle">
|
||||||
|
<enum>Qt::ToolButtonTextUnderIcon</enum>
|
||||||
</property>
|
</property>
|
||||||
<widget class="QWidget" name="tab_AMM">
|
|
||||||
<property name="sizePolicy">
|
|
||||||
<sizepolicy hsizetype="Expanding" vsizetype="Expanding">
|
|
||||||
<horstretch>0</horstretch>
|
|
||||||
<verstretch>0</verstretch>
|
|
||||||
</sizepolicy>
|
|
||||||
</property>
|
|
||||||
<attribute name="title">
|
|
||||||
<string>AMM</string>
|
|
||||||
</attribute>
|
|
||||||
<layout class="QGridLayout" name="gridLayout_4">
|
|
||||||
<item row="0" column="0">
|
|
||||||
<layout class="QVBoxLayout" name="verticalLayout_AMM"/>
|
|
||||||
</item>
|
|
||||||
</layout>
|
|
||||||
</widget>
|
|
||||||
<widget class="QWidget" name="tab_FIM">
|
|
||||||
<property name="sizePolicy">
|
|
||||||
<sizepolicy hsizetype="Expanding" vsizetype="Expanding">
|
|
||||||
<horstretch>0</horstretch>
|
|
||||||
<verstretch>0</verstretch>
|
|
||||||
</sizepolicy>
|
|
||||||
</property>
|
|
||||||
<attribute name="title">
|
|
||||||
<string>FIM</string>
|
|
||||||
</attribute>
|
|
||||||
<layout class="QGridLayout" name="gridLayout_5">
|
|
||||||
<item row="0" column="0">
|
|
||||||
<layout class="QVBoxLayout" name="verticalLayout_FIM"/>
|
|
||||||
</item>
|
|
||||||
</layout>
|
|
||||||
</widget>
|
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
</layout>
|
</layout>
|
||||||
@@ -389,41 +196,200 @@
|
|||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<layout class="QVBoxLayout" name="verticalLayout_R">
|
<layout class="QVBoxLayout" name="verticalLayout_Work">
|
||||||
<item>
|
<item>
|
||||||
<widget class="QGroupBox" name="groupBox_Messenger">
|
<layout class="QHBoxLayout" name="horizontalLayout_Work">
|
||||||
<property name="sizePolicy">
|
<item>
|
||||||
<sizepolicy hsizetype="Expanding" vsizetype="Expanding">
|
<layout class="QVBoxLayout" name="verticalLayout_L">
|
||||||
<horstretch>0</horstretch>
|
<item>
|
||||||
<verstretch>0</verstretch>
|
<layout class="QHBoxLayout" name="horizontalLayout_L">
|
||||||
</sizepolicy>
|
<item>
|
||||||
|
<layout class="QVBoxLayout" name="verticalLayout_TI">
|
||||||
|
<item>
|
||||||
|
<widget class="QGroupBox" name="groupBox_Trainees">
|
||||||
|
<property name="sizePolicy">
|
||||||
|
<sizepolicy hsizetype="Expanding" vsizetype="Expanding">
|
||||||
|
<horstretch>0</horstretch>
|
||||||
|
<verstretch>0</verstretch>
|
||||||
|
</sizepolicy>
|
||||||
|
</property>
|
||||||
|
<property name="title">
|
||||||
|
<string>Trainees</string>
|
||||||
|
</property>
|
||||||
|
<layout class="QGridLayout" name="gridLayout_2">
|
||||||
|
<item row="0" column="0">
|
||||||
|
<layout class="QVBoxLayout" name="verticalLayout_Trainees"/>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QGroupBox" name="groupBox_Instructors">
|
||||||
|
<property name="sizePolicy">
|
||||||
|
<sizepolicy hsizetype="Expanding" vsizetype="Expanding">
|
||||||
|
<horstretch>0</horstretch>
|
||||||
|
<verstretch>0</verstretch>
|
||||||
|
</sizepolicy>
|
||||||
|
</property>
|
||||||
|
<property name="title">
|
||||||
|
<string>Instructors</string>
|
||||||
|
</property>
|
||||||
|
<layout class="QGridLayout" name="gridLayout_8">
|
||||||
|
<item row="0" column="0">
|
||||||
|
<layout class="QVBoxLayout" name="verticalLayout_Instructors"/>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<layout class="QVBoxLayout" name="verticalLayout_R">
|
||||||
|
<item>
|
||||||
|
<widget class="QGroupBox" name="groupBox_Messenger">
|
||||||
|
<property name="sizePolicy">
|
||||||
|
<sizepolicy hsizetype="Expanding" vsizetype="Expanding">
|
||||||
|
<horstretch>0</horstretch>
|
||||||
|
<verstretch>0</verstretch>
|
||||||
|
</sizepolicy>
|
||||||
|
</property>
|
||||||
|
<property name="title">
|
||||||
|
<string>Chat</string>
|
||||||
|
</property>
|
||||||
|
<layout class="QGridLayout" name="gridLayout_7">
|
||||||
|
<item row="0" column="0">
|
||||||
|
<layout class="QVBoxLayout" name="verticalLayout_Messenger"/>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<layout class="QHBoxLayout" name="horizontalLayout_FootNote">
|
||||||
|
<item>
|
||||||
|
<layout class="QHBoxLayout" name="horizontalLayout_ConnectedServer">
|
||||||
|
<item>
|
||||||
|
<widget class="QLabel" name="lblDBisConnected">
|
||||||
|
<property name="minimumSize">
|
||||||
|
<size>
|
||||||
|
<width>32</width>
|
||||||
|
<height>32</height>
|
||||||
|
</size>
|
||||||
</property>
|
</property>
|
||||||
<property name="title">
|
<property name="maximumSize">
|
||||||
<string>Messenger</string>
|
<size>
|
||||||
|
<width>32</width>
|
||||||
|
<height>32</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string/>
|
||||||
|
</property>
|
||||||
|
<property name="pixmap">
|
||||||
|
<pixmap resource="resources.qrc">:/resources/icons/circleGray.png</pixmap>
|
||||||
|
</property>
|
||||||
|
<property name="scaledContents">
|
||||||
|
<bool>true</bool>
|
||||||
</property>
|
</property>
|
||||||
<layout class="QGridLayout" name="gridLayout_7">
|
|
||||||
<item row="0" column="0">
|
|
||||||
<layout class="QVBoxLayout" name="verticalLayout_Messenger"/>
|
|
||||||
</item>
|
|
||||||
</layout>
|
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<widget class="QGroupBox" name="groupBox_Instructors">
|
<widget class="QLabel" name="lblServerPrefix">
|
||||||
<property name="sizePolicy">
|
<property name="text">
|
||||||
<sizepolicy hsizetype="Expanding" vsizetype="Expanding">
|
<string>Server: </string>
|
||||||
<horstretch>0</horstretch>
|
|
||||||
<verstretch>0</verstretch>
|
|
||||||
</sizepolicy>
|
|
||||||
</property>
|
</property>
|
||||||
<property name="title">
|
</widget>
|
||||||
<string>Instructors</string>
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QLabel" name="lblServer">
|
||||||
|
<property name="text">
|
||||||
|
<string>none</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<spacer name="horizontalSpacer">
|
||||||
|
<property name="orientation">
|
||||||
|
<enum>Qt::Horizontal</enum>
|
||||||
|
</property>
|
||||||
|
<property name="sizeHint" stdset="0">
|
||||||
|
<size>
|
||||||
|
<width>40</width>
|
||||||
|
<height>20</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
</spacer>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<layout class="QHBoxLayout" name="horizontalLayout_LoggedInInstructor">
|
||||||
|
<item>
|
||||||
|
<widget class="QLabel" name="lblLoggedIn">
|
||||||
|
<property name="minimumSize">
|
||||||
|
<size>
|
||||||
|
<width>32</width>
|
||||||
|
<height>32</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
<property name="maximumSize">
|
||||||
|
<size>
|
||||||
|
<width>32</width>
|
||||||
|
<height>32</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string/>
|
||||||
|
</property>
|
||||||
|
<property name="pixmap">
|
||||||
|
<pixmap resource="resources.qrc">:/resources/icons/circleGray.png</pixmap>
|
||||||
|
</property>
|
||||||
|
<property name="scaledContents">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QLabel" name="lblLoggedInPrefix">
|
||||||
|
<property name="maximumSize">
|
||||||
|
<size>
|
||||||
|
<width>16777215</width>
|
||||||
|
<height>40</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string> Instructor: </string>
|
||||||
|
</property>
|
||||||
|
<property name="textFormat">
|
||||||
|
<enum>Qt::AutoText</enum>
|
||||||
|
</property>
|
||||||
|
<property name="scaledContents">
|
||||||
|
<bool>false</bool>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QLabel" name="lblLoggedInInstructor">
|
||||||
|
<property name="maximumSize">
|
||||||
|
<size>
|
||||||
|
<width>16777215</width>
|
||||||
|
<height>40</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>none</string>
|
||||||
</property>
|
</property>
|
||||||
<layout class="QGridLayout" name="gridLayout_8">
|
|
||||||
<item row="0" column="0">
|
|
||||||
<layout class="QVBoxLayout" name="verticalLayout_Instructors"/>
|
|
||||||
</item>
|
|
||||||
</layout>
|
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
</layout>
|
</layout>
|
||||||
|
|||||||
154
InstructorsAndTrainees/messanger/messangercontroller.cpp
Normal file
@@ -0,0 +1,154 @@
|
|||||||
|
#include "messangercontroller.h"
|
||||||
|
|
||||||
|
MessangerController::MessangerController(ConnectorToServer* connectorToServer, QObject *parent) :
|
||||||
|
QObject(parent),
|
||||||
|
connectorToServer(connectorToServer),
|
||||||
|
userLocalGUI_ID(0)
|
||||||
|
{
|
||||||
|
connect(connectorToServer, &ConnectorToServer::signal_receiveMessage, this, &MessangerController::slot_receiveMessage);
|
||||||
|
}
|
||||||
|
|
||||||
|
MessangerController::~MessangerController()
|
||||||
|
{
|
||||||
|
deleteAllWidgets();
|
||||||
|
}
|
||||||
|
|
||||||
|
MessangerWidget *MessangerController::newWidget(QWidget *parent, User* user, QVBoxLayout* boxLayout)
|
||||||
|
{
|
||||||
|
MessangerWidget *msgWdgt = new MessangerWidget(parent);
|
||||||
|
|
||||||
|
if(boxLayout)
|
||||||
|
boxLayout->addWidget(msgWdgt);
|
||||||
|
|
||||||
|
connect(msgWdgt, &MessangerWidget::signal_sendMessage, this, &MessangerController::slot_sendMessage);
|
||||||
|
|
||||||
|
msgWdgt->initUserLocalGUI(connectorToServer->getInstructor(userLocalGUI_ID));
|
||||||
|
|
||||||
|
if(user)
|
||||||
|
{
|
||||||
|
msgWdgt->initUserRemote(*user);
|
||||||
|
|
||||||
|
//Заполнение предыстории
|
||||||
|
int id_user = user->getID();
|
||||||
|
QList<MessageOfMessanger>* list = nullptr;
|
||||||
|
if(mapAlldialogsWithClients.contains(id_user))
|
||||||
|
{//Уже есть
|
||||||
|
list = mapAlldialogsWithClients.value(id_user);
|
||||||
|
|
||||||
|
for(MessageOfMessanger msg : *list)
|
||||||
|
{
|
||||||
|
if(msg.flLocal)
|
||||||
|
msgWdgt->showSendedMessage(ClientMessage(QString::number(userLocalGUI_ID), QString::number(id_user), msg.text, msg.time.toString("hh:mm")));
|
||||||
|
else
|
||||||
|
msgWdgt->showReceivedMessage(ClientMessage(QString::number(id_user), QString::number(userLocalGUI_ID), msg.text, msg.time.toString("hh:mm")));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
listWidgets.append(msgWdgt);
|
||||||
|
|
||||||
|
return msgWdgt;
|
||||||
|
}
|
||||||
|
|
||||||
|
void MessangerController::deleteWidget(MessangerWidget *msgWdgt)
|
||||||
|
{
|
||||||
|
for(int i = 0; i < listWidgets.count(); i++)
|
||||||
|
{
|
||||||
|
if(listWidgets.at(i) == msgWdgt)
|
||||||
|
{
|
||||||
|
delete msgWdgt;
|
||||||
|
listWidgets.removeAt(i);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void MessangerController::deleteAllWidgets()
|
||||||
|
{
|
||||||
|
for(MessangerWidget* widget : listWidgets)
|
||||||
|
delete widget;
|
||||||
|
listWidgets.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
void MessangerController::setUserLocalGUI_ID(int id)
|
||||||
|
{
|
||||||
|
userLocalGUI_ID = id;
|
||||||
|
|
||||||
|
for(MessangerWidget* widget : listWidgets)
|
||||||
|
{
|
||||||
|
widget->initUserLocalGUI(connectorToServer->getInstructor(userLocalGUI_ID));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void MessangerController::slot_sendMessage(ClientMessage clientMessage)
|
||||||
|
{
|
||||||
|
connectorToServer->slot_sendMessage(clientMessage);
|
||||||
|
|
||||||
|
showMessageInAllWidgets(clientMessage);
|
||||||
|
}
|
||||||
|
|
||||||
|
void MessangerController::slot_receiveMessage(ClientMessage clientMessage)
|
||||||
|
{
|
||||||
|
showMessageInAllWidgets(clientMessage);
|
||||||
|
}
|
||||||
|
|
||||||
|
void MessangerController::slot_reinitMessangers(QList<User> listUsers)
|
||||||
|
{
|
||||||
|
for(MessangerWidget* widget : listWidgets)
|
||||||
|
{
|
||||||
|
for(User user : listUsers)
|
||||||
|
{
|
||||||
|
if(user.getID() == widget->getIDuserRemote())
|
||||||
|
{
|
||||||
|
widget->reinitMessangerWidget(user);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void MessangerController::showMessageInAllWidgets(ClientMessage clientMessage)
|
||||||
|
{
|
||||||
|
int id_user = 0;
|
||||||
|
MessageOfMessanger msg;
|
||||||
|
|
||||||
|
if(clientMessage.fromId == QString::number(userLocalGUI_ID))
|
||||||
|
{//Send
|
||||||
|
id_user = clientMessage.toId.toInt();
|
||||||
|
msg.flLocal = true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{//Receive
|
||||||
|
id_user = clientMessage.fromId.toInt();
|
||||||
|
msg.flLocal = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
QList<MessageOfMessanger>* list = nullptr;
|
||||||
|
if(mapAlldialogsWithClients.contains(id_user))
|
||||||
|
{//Уже есть
|
||||||
|
list = mapAlldialogsWithClients.value(id_user);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{//Новый
|
||||||
|
list = new QList<MessageOfMessanger>();
|
||||||
|
mapAlldialogsWithClients.insert(id_user, list);
|
||||||
|
}
|
||||||
|
|
||||||
|
msg.text = clientMessage.Text;
|
||||||
|
msg.time = QTime::currentTime();
|
||||||
|
list->append(msg);
|
||||||
|
|
||||||
|
clientMessage.timeStr = msg.time.toString("hh:mm");
|
||||||
|
|
||||||
|
for(MessangerWidget* widget : listWidgets)
|
||||||
|
{
|
||||||
|
if(widget->getIDuserRemote() == id_user)
|
||||||
|
{
|
||||||
|
if(msg.flLocal)
|
||||||
|
widget->showSendedMessage(clientMessage);
|
||||||
|
else
|
||||||
|
widget->showReceivedMessage(clientMessage);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
48
InstructorsAndTrainees/messanger/messangercontroller.h
Normal file
@@ -0,0 +1,48 @@
|
|||||||
|
#ifndef MESSANGERCONTROLLER_H
|
||||||
|
#define MESSANGERCONTROLLER_H
|
||||||
|
|
||||||
|
#include <QObject>
|
||||||
|
#include <QVBoxLayout>
|
||||||
|
#include "messangerwidget.h"
|
||||||
|
#include "connectortoserver.h"
|
||||||
|
|
||||||
|
struct MessageOfMessanger
|
||||||
|
{
|
||||||
|
QString text;
|
||||||
|
bool flLocal;
|
||||||
|
QTime time;
|
||||||
|
};
|
||||||
|
|
||||||
|
class MessangerController : public QObject
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
public:
|
||||||
|
explicit MessangerController(ConnectorToServer* connectorToServer, QObject *parent = nullptr);
|
||||||
|
~MessangerController();
|
||||||
|
|
||||||
|
public:
|
||||||
|
MessangerWidget* newWidget(QWidget *parent, User* user, QVBoxLayout* boxLayout);
|
||||||
|
void deleteWidget(MessangerWidget* msgWdgt);
|
||||||
|
void deleteAllWidgets();
|
||||||
|
|
||||||
|
void setUserLocalGUI_ID(int id);
|
||||||
|
|
||||||
|
public slots:
|
||||||
|
void slot_sendMessage(ClientMessage clientMessage);
|
||||||
|
void slot_receiveMessage(ClientMessage clientMessage);
|
||||||
|
|
||||||
|
void slot_reinitMessangers(QList<User> listUsers);
|
||||||
|
|
||||||
|
private:
|
||||||
|
void showMessageInAllWidgets(ClientMessage clientMessage);
|
||||||
|
|
||||||
|
private:
|
||||||
|
ConnectorToServer* connectorToServer;
|
||||||
|
QList <MessangerWidget*> listWidgets;
|
||||||
|
|
||||||
|
int userLocalGUI_ID;
|
||||||
|
|
||||||
|
QMap <int, QList<MessageOfMessanger>*> mapAlldialogsWithClients;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // MESSANGERCONTROLLER_H
|
||||||
@@ -1,250 +1,144 @@
|
|||||||
#include <QListWidget>
|
#include <QListWidget>
|
||||||
#include <QBrush>
|
|
||||||
#include <QKeyEvent>
|
#include <QKeyEvent>
|
||||||
#include <QAbstractScrollArea>
|
#include <QAbstractScrollArea>
|
||||||
#include <QMessageBox>
|
#include <QMessageBox>
|
||||||
#include <QLabel>
|
#include <QLabel>
|
||||||
|
#include "instructor.h"
|
||||||
#include "messangerwidget.h"
|
#include "messangerwidget.h"
|
||||||
#include "ui_messangerwidget.h"
|
#include "ui_messangerwidget.h"
|
||||||
|
|
||||||
|
|
||||||
MessangerWidget::MessangerWidget(QWidget *parent) :
|
MessangerWidget::MessangerWidget(QWidget *parent) :
|
||||||
QWidget(parent),
|
QWidget(parent),
|
||||||
ui(new Ui::MessangerWidget),
|
oneDialogMessenger(nullptr),
|
||||||
selectedUserLogin(""),
|
ui(new Ui::MessangerWidget)
|
||||||
selectedUserId("")
|
|
||||||
{
|
{
|
||||||
ui->setupUi(this);
|
ui->setupUi(this);
|
||||||
|
|
||||||
ui->tabWidget->removeTab(1);
|
|
||||||
ui->tabWidget->removeTab(0);
|
|
||||||
|
|
||||||
ui->btnSend->setObjectName("btnSend");
|
ui->btnSend->setObjectName("btnSend");
|
||||||
ui->btnSend->setEnabled(false);
|
ui->editMsg->setObjectName("editMsg");
|
||||||
ui->editMsg->setEnabled(false);
|
|
||||||
|
ui->lblUser->setObjectName("MessangerWidgetLblUser");
|
||||||
|
ui->lblAvatar->setObjectName("MessangerWidgetLblAvatar");
|
||||||
|
ui->lblLoggedIn->setObjectName("MessangerWidgetLblLoggedIn");
|
||||||
}
|
}
|
||||||
|
|
||||||
MessangerWidget::~MessangerWidget()
|
MessangerWidget::~MessangerWidget()
|
||||||
{
|
{
|
||||||
|
delete oneDialogMessenger;
|
||||||
delete ui;
|
delete ui;
|
||||||
}
|
}
|
||||||
|
|
||||||
void MessangerWidget::addMsgFromClient(Trainee trainee, QString text)
|
void MessangerWidget::initUserRemote(User user)
|
||||||
{
|
{
|
||||||
//Пробуем добавить вкладку диалога с клиентом (если вдруг еще нет)
|
userRemote = user;
|
||||||
addTabDialogMessenger(trainee);
|
|
||||||
|
|
||||||
//Ищем нужный диалог
|
addTabDialogMessenger(userRemote);
|
||||||
QString login = trainee.getLogin();
|
|
||||||
foreach(TabDialogMessenger* tabDialog, listTabDialogMessenger)
|
|
||||||
{//Есть такой
|
|
||||||
if(tabDialog->getUserLogin() == trainee.getLogin())
|
|
||||||
{
|
|
||||||
//Добавляем в существующую вкладку
|
|
||||||
ui->tabWidget->setCurrentIndex(getIndexTab(login));
|
|
||||||
tabDialog->addMsgWidgetRemote(text);
|
|
||||||
//Делаем ее текущей
|
|
||||||
ui->tabWidget->setCurrentIndex(getIndexTab(login));
|
|
||||||
|
|
||||||
selectedUserLogin = login;
|
|
||||||
selectedUserId = QString::number(trainee.getID());
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void MessangerWidget::initialize(QString id)
|
void MessangerWidget::reinitMessangerWidget(User user)
|
||||||
{
|
{
|
||||||
currClientId = id;
|
if(userRemote.getID() == user.getID())
|
||||||
}
|
|
||||||
|
|
||||||
void MessangerWidget::addTabDialogMessenger(Trainee trainee)
|
|
||||||
{
|
|
||||||
if(listTabDialogMessenger.count() == 0)
|
|
||||||
{//Самая первая вкладка, делаем ее активной
|
|
||||||
selectedUserLogin = trainee.getLogin();
|
|
||||||
selectedUserId = QString::number(trainee.getID());
|
|
||||||
emit signal_tabMessengerChanged(selectedUserLogin);
|
|
||||||
ui->btnSend->setEnabled(true);
|
|
||||||
ui->editMsg->setEnabled(true);
|
|
||||||
}
|
|
||||||
|
|
||||||
//Проверяем наличие диалога с этим клиентом
|
|
||||||
foreach(TabDialogMessenger* dialogMsg, listTabDialogMessenger)
|
|
||||||
{
|
{
|
||||||
if(dialogMsg->getUserLogin() == trainee.getLogin())
|
userRemote = user;
|
||||||
{//Диалог для этого клиента уже существует
|
|
||||||
//Обновляем статус залогинивания
|
|
||||||
if(trainee.getLoggedIn())
|
|
||||||
ui->tabWidget->setTabIcon(getIndexTab(trainee.getLogin()), QIcon(":/resources/icons/circleGreen.png"));
|
|
||||||
else
|
|
||||||
ui->tabWidget->setTabIcon(getIndexTab(trainee.getLogin()), QIcon(":/resources/icons/circleGray.png"));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//Диалога для этого клиента еще не существует
|
//Обновляем заголовок
|
||||||
|
updateHeader(userRemote);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
//Помещаем новый диалог в список диалогов
|
void MessangerWidget::initUserLocalGUI(User user)
|
||||||
TabDialogMessenger* tabDialog = new TabDialogMessenger(trainee.getLogin(),QString::number(trainee.getID()), this);
|
{
|
||||||
listTabDialogMessenger.append(tabDialog);
|
userLocalGUI = user;
|
||||||
|
}
|
||||||
|
|
||||||
//Добавляем новую вкладку диалога
|
int MessangerWidget::getIDuserRemote()
|
||||||
int index = ui->tabWidget->addTab(tabDialog, /*login + ": " +*/ trainee.getName());
|
{
|
||||||
|
return userRemote.getID();
|
||||||
|
}
|
||||||
|
|
||||||
//Обновляем статус залогинивания
|
void MessangerWidget::showSendedMessage(ClientMessage clientMessage)
|
||||||
if(trainee.getLoggedIn())
|
{
|
||||||
ui->tabWidget->setTabIcon(index, QIcon(":/resources/icons/circleGreen.png"));
|
if(userLocalGUI.getID() == clientMessage.fromId.toInt())
|
||||||
|
oneDialogMessenger->addMsgWidgetLocal(clientMessage.Text, clientMessage.timeStr, userLocalGUI.getName());
|
||||||
|
}
|
||||||
|
|
||||||
|
void MessangerWidget::showReceivedMessage(ClientMessage clientMessage)
|
||||||
|
{
|
||||||
|
if(userRemote.getID() == clientMessage.fromId.toInt())
|
||||||
|
oneDialogMessenger->addMsgWidgetRemote(clientMessage.Text, clientMessage.timeStr, userRemote.getName());
|
||||||
|
}
|
||||||
|
|
||||||
|
void MessangerWidget::addTabDialogMessenger(User user)
|
||||||
|
{
|
||||||
|
if(!oneDialogMessenger)
|
||||||
|
{//Диалога еще не существует
|
||||||
|
|
||||||
|
oneDialogMessenger = new OneDialogMessenger(userLocalGUI, userRemote, this);
|
||||||
|
|
||||||
|
ui->verticalLayout_ListMsg->addWidget(oneDialogMessenger);
|
||||||
|
|
||||||
|
//Обновляем заголовок
|
||||||
|
updateHeader(user);
|
||||||
|
}
|
||||||
else
|
else
|
||||||
ui->tabWidget->setTabIcon(index, QIcon(":/resources/icons/circleGray.png"));
|
{//Диалог уже существует
|
||||||
}
|
|
||||||
|
|
||||||
void MessangerWidget::actualizationTabsDialogMessenger()
|
//Проверяем наличие диалога именно с этим клиентом
|
||||||
{
|
if(oneDialogMessenger->getUserRemoteId() == user.getID())
|
||||||
foreach(TabDialogMessenger* tabDialog, listTabDialogMessenger)
|
|
||||||
{
|
|
||||||
QString login = tabDialog->getUserLogin();
|
|
||||||
bool exist = false;
|
|
||||||
|
|
||||||
for(Trainee trainee : listTrainees)
|
|
||||||
{
|
{
|
||||||
if(trainee.getLogin() == login)
|
//Обновляем заголовок
|
||||||
{
|
updateHeader(user);
|
||||||
if(trainee.getArchived())
|
|
||||||
{//Стал архивным
|
|
||||||
//Удаляем диалог с клиентом
|
|
||||||
ui->tabWidget->removeTab(getIndexTab(login));
|
|
||||||
listTabDialogMessenger.removeOne(tabDialog);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
exist = true;
|
|
||||||
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if(!exist)
|
|
||||||
{//Нет такого логина
|
|
||||||
//Удаляем диалог с клиентом
|
|
||||||
ui->tabWidget->removeTab(getIndexTab(login));
|
|
||||||
listTabDialogMessenger.removeOne(tabDialog);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int MessangerWidget::getIndexTab(QString login)
|
void MessangerWidget::updateHeader(User user)
|
||||||
{
|
{
|
||||||
for(int index = 0; index < ui->tabWidget->count(); index++)
|
//Обновляем статус залогинивания
|
||||||
|
if(user.getLoggedIn())
|
||||||
|
ui->lblLoggedIn->setPixmap(QPixmap(QStringLiteral(":/resources/icons/circleGreen.png")));
|
||||||
|
else
|
||||||
|
ui->lblLoggedIn->setPixmap(QPixmap(QStringLiteral(":/resources/icons/circleGray.png")));
|
||||||
|
|
||||||
|
|
||||||
|
QString typeUserStr = "";
|
||||||
|
|
||||||
|
if(user.getTypeUserDB() == User::TypeUserDBTrainee)
|
||||||
{
|
{
|
||||||
TabDialogMessenger* tabDialogMessenger = static_cast<TabDialogMessenger*>(ui->tabWidget->widget(index));
|
ui->lblAvatar->setPixmap(QPixmap(QStringLiteral(":/resources/icons/trainee.png")));
|
||||||
if(tabDialogMessenger->getUserLogin() == login)
|
|
||||||
return index;
|
|
||||||
}
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
void MessangerWidget::clear()
|
typeUserStr = tr("Trainee");
|
||||||
{
|
}
|
||||||
ui->btnSend->setEnabled(false);
|
else
|
||||||
ui->editMsg->setEnabled(false);
|
{
|
||||||
listTrainees.clear();
|
if(static_cast<Instructor*>(&user)->getIsAdmin())
|
||||||
actualizationTabsDialogMessenger();
|
ui->lblAvatar->setPixmap(QPixmap(QStringLiteral(":/resources/icons/admin.png")));
|
||||||
|
else
|
||||||
|
ui->lblAvatar->setPixmap(QPixmap(QStringLiteral(":/resources/icons/instructor.png")));
|
||||||
|
|
||||||
|
typeUserStr = tr("Instructor");
|
||||||
|
}
|
||||||
|
|
||||||
|
QString fullName = typeUserStr + ": " + user.getName() + " (" + user.getLogin() + ")";
|
||||||
|
ui->lblUser->setText(fullName);
|
||||||
}
|
}
|
||||||
|
|
||||||
void MessangerWidget::on_btnSend_clicked()
|
void MessangerWidget::on_btnSend_clicked()
|
||||||
{
|
{
|
||||||
QString text = ui->editMsg->toPlainText();
|
QString text = ui->editMsg->toPlainText();
|
||||||
QString from = currClientId + "-" + QString::number(0);// временный костыль, так как чаты только с обучаемыми
|
QString from = QString::number(userLocalGUI.getID());
|
||||||
QString to = selectedUserId + "-" + QString::number(1);// временный костыль, так как чаты только с обучаемыми
|
QString to = QString::number(userRemote.getID());
|
||||||
|
|
||||||
ClientMessage message = ClientMessage(from,to,text);
|
ClientMessage message = ClientMessage(from, to, text);
|
||||||
emit signal_sendMessage(message);
|
emit signal_sendMessage(message);
|
||||||
|
|
||||||
ui->editMsg->clear();
|
ui->editMsg->clear();
|
||||||
|
|
||||||
//Ищем нужный диалог
|
|
||||||
foreach(TabDialogMessenger* tabDialog, listTabDialogMessenger)
|
|
||||||
{
|
|
||||||
if(tabDialog->getUserLogin() == selectedUserLogin)
|
|
||||||
{
|
|
||||||
//Добавляем в существующую вкладку
|
|
||||||
tabDialog->addMsgWidgetLocal(text);
|
|
||||||
//Делаем ее активной
|
|
||||||
ui->tabWidget->setCurrentIndex(getIndexTab(selectedUserLogin));
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void MessangerWidget::on_tabWidget_currentChanged(int index)
|
|
||||||
{
|
|
||||||
//Ищем нужный диалог
|
|
||||||
foreach(TabDialogMessenger* tabDialog, listTabDialogMessenger)
|
|
||||||
{
|
|
||||||
|
|
||||||
if(getIndexTab(tabDialog->getUserLogin()) == index)
|
|
||||||
{
|
|
||||||
selectedUserLogin = tabDialog->getUserLogin();
|
|
||||||
selectedUserId = tabDialog->getUserId();
|
|
||||||
emit signal_tabMessengerChanged(selectedUserLogin);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void MessangerWidget::slot_traineeSelected(QString login)
|
|
||||||
{
|
|
||||||
//Ищем нужный диалог
|
|
||||||
foreach(TabDialogMessenger* tabDialog, listTabDialogMessenger)
|
|
||||||
{
|
|
||||||
if(tabDialog->getUserLogin() == login)
|
|
||||||
{
|
|
||||||
//Активируем нужную вкладку
|
|
||||||
ui->tabWidget->setCurrentIndex(getIndexTab(login));
|
|
||||||
ui->btnSend->setEnabled(true);
|
|
||||||
ui->editMsg->setEnabled(true);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
ui->btnSend->setEnabled(false);
|
|
||||||
ui->editMsg->setEnabled(false);
|
|
||||||
}
|
|
||||||
|
|
||||||
void MessangerWidget::slot_LanguageChanged(QString language)
|
|
||||||
{
|
|
||||||
qtLanguageTranslator.load(QString("translationsMy/ServerLMS_") + language, ".");
|
|
||||||
qApp->installTranslator(&qtLanguageTranslator);
|
|
||||||
}
|
|
||||||
|
|
||||||
void MessangerWidget::slot_InitMessanger(QList<Trainee> listTrainees)
|
|
||||||
{
|
|
||||||
this->listTrainees = listTrainees;
|
|
||||||
|
|
||||||
actualizationTabsDialogMessenger();
|
|
||||||
|
|
||||||
for(Trainee trainee: listTrainees)
|
|
||||||
{
|
|
||||||
if(! trainee.getArchived())
|
|
||||||
addTabDialogMessenger(trainee);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void MessangerWidget::slot_showMessage(ClientMessage clientMessage)
|
|
||||||
{
|
|
||||||
auto result = clientMessage.fromId.split("-");
|
|
||||||
for(Trainee trainee: listTrainees)
|
|
||||||
{
|
|
||||||
if(QString::number(trainee.getID()) == result[0])
|
|
||||||
{
|
|
||||||
addMsgFromClient(trainee, clientMessage.Text);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void MessangerWidget::keyPressEvent(QKeyEvent *event)
|
void MessangerWidget::keyPressEvent(QKeyEvent *event)
|
||||||
{
|
{
|
||||||
if (event->key() == Qt::Key_Enter || event->key() == Qt::Key_Return)
|
if (event->key() == Qt::Key_Return)
|
||||||
{
|
{
|
||||||
ui->btnSend->click();
|
ui->btnSend->click();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
|
|
||||||
#include <QWidget>
|
#include <QWidget>
|
||||||
#include <QTranslator>
|
#include <QTranslator>
|
||||||
#include <trainee.h>
|
#include <user.h>
|
||||||
#include "Datas.h"
|
#include "Datas.h"
|
||||||
#include "tabdialogmessenger.h"
|
#include "tabdialogmessenger.h"
|
||||||
|
|
||||||
@@ -12,8 +12,6 @@ namespace Ui {
|
|||||||
class MessangerWidget;
|
class MessangerWidget;
|
||||||
}
|
}
|
||||||
|
|
||||||
//Главный виджет мессенджера
|
|
||||||
|
|
||||||
class MessangerWidget : public QWidget
|
class MessangerWidget : public QWidget
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
@@ -22,55 +20,41 @@ public:
|
|||||||
explicit MessangerWidget(QWidget *parent = nullptr);
|
explicit MessangerWidget(QWidget *parent = nullptr);
|
||||||
~MessangerWidget();
|
~MessangerWidget();
|
||||||
|
|
||||||
protected:
|
|
||||||
// Метод получения событий
|
|
||||||
// В нём будет производиться проверка события смены перевода приложения
|
|
||||||
void changeEvent(QEvent * event) override;
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
enum ETypeMsg{fromClient, toClient};
|
void initUserRemote(User user);
|
||||||
|
void reinitMessangerWidget(User user);
|
||||||
|
void initUserLocalGUI(User user);
|
||||||
|
int getIDuserRemote();
|
||||||
|
|
||||||
void addMsgFromClient(Trainee trainee, QString text);
|
void showSendedMessage(ClientMessage clientMessage);
|
||||||
void initialize(QString id);
|
void showReceivedMessage(ClientMessage clientMessage);
|
||||||
|
|
||||||
void addTabDialogMessenger(Trainee trainee);
|
private:
|
||||||
void actualizationTabsDialogMessenger();
|
void addTabDialogMessenger(User user);
|
||||||
|
void updateHeader(User user);
|
||||||
int getIndexTab(QString login);
|
|
||||||
|
|
||||||
void clear();
|
|
||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
void on_btnSend_clicked();
|
void on_btnSend_clicked();
|
||||||
void on_tabWidget_currentChanged(int index);
|
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
//сигнал о готовности нового сообщения на отправку клиенту
|
//сигнал о готовности нового сообщения на отправку клиенту
|
||||||
void signal_sendMessage(ClientMessage clientMessage);
|
void signal_sendMessage(ClientMessage clientMessage);
|
||||||
//сигнал об изменении вкладки диалога с клиентом (TabDialogMessenger)
|
|
||||||
void signal_tabMessengerChanged(QString login);
|
|
||||||
|
|
||||||
public slots:
|
|
||||||
//слот обработки сигнала о смене языка
|
|
||||||
void slot_LanguageChanged(QString language);
|
|
||||||
//слот обработки сигнала об инициализации мессенджера
|
|
||||||
void slot_InitMessanger(QList<Trainee> listTrainees);
|
|
||||||
//слот обработки сигнала о выборе обучаемого
|
|
||||||
void slot_traineeSelected(QString login);
|
|
||||||
//слот о приходе нового сообщения от клиента
|
|
||||||
void slot_showMessage(ClientMessage clientMessage);
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
virtual void keyPressEvent(QKeyEvent *event) override;
|
virtual void keyPressEvent(QKeyEvent *event) override;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
void changeEvent(QEvent * event) override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Ui::MessangerWidget *ui;
|
OneDialogMessenger* oneDialogMessenger;
|
||||||
QList <TabDialogMessenger*> listTabDialogMessenger;
|
User userLocalGUI;
|
||||||
QList<Trainee> listTrainees;
|
User userRemote;
|
||||||
QString selectedUserLogin; //Логин клиента текущего диалога
|
|
||||||
QString selectedUserId; //id клиента текущего диалога
|
|
||||||
QString currClientId; //id этого клиента
|
|
||||||
QTranslator qtLanguageTranslator;
|
QTranslator qtLanguageTranslator;
|
||||||
|
|
||||||
|
private:
|
||||||
|
Ui::MessangerWidget *ui;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // MESSANGERWIDGET_H
|
#endif // MESSANGERWIDGET_H
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
<rect>
|
<rect>
|
||||||
<x>0</x>
|
<x>0</x>
|
||||||
<y>0</y>
|
<y>0</y>
|
||||||
<width>500</width>
|
<width>344</width>
|
||||||
<height>300</height>
|
<height>300</height>
|
||||||
</rect>
|
</rect>
|
||||||
</property>
|
</property>
|
||||||
@@ -23,37 +23,81 @@
|
|||||||
<item row="0" column="0">
|
<item row="0" column="0">
|
||||||
<layout class="QVBoxLayout" name="verticalLayout_Main">
|
<layout class="QVBoxLayout" name="verticalLayout_Main">
|
||||||
<item>
|
<item>
|
||||||
<layout class="QVBoxLayout" name="verticalLayout_1" stretch="0">
|
<layout class="QVBoxLayout" name="verticalLayout_Dialog" stretch="0,0">
|
||||||
<property name="sizeConstraint">
|
<property name="sizeConstraint">
|
||||||
<enum>QLayout::SetDefaultConstraint</enum>
|
<enum>QLayout::SetDefaultConstraint</enum>
|
||||||
</property>
|
</property>
|
||||||
<item>
|
<item>
|
||||||
<widget class="QTabWidget" name="tabWidget">
|
<layout class="QHBoxLayout" name="horizontalLayout_User">
|
||||||
<property name="sizePolicy">
|
<item>
|
||||||
<sizepolicy hsizetype="Expanding" vsizetype="Expanding">
|
<widget class="QLabel" name="lblAvatar">
|
||||||
<horstretch>0</horstretch>
|
<property name="sizePolicy">
|
||||||
<verstretch>0</verstretch>
|
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
|
||||||
</sizepolicy>
|
<horstretch>0</horstretch>
|
||||||
</property>
|
<verstretch>0</verstretch>
|
||||||
<property name="currentIndex">
|
</sizepolicy>
|
||||||
<number>0</number>
|
</property>
|
||||||
</property>
|
<property name="minimumSize">
|
||||||
<widget class="QWidget" name="tab_1">
|
<size>
|
||||||
<attribute name="title">
|
<width>32</width>
|
||||||
<string>Tab 1</string>
|
<height>32</height>
|
||||||
</attribute>
|
</size>
|
||||||
</widget>
|
</property>
|
||||||
<widget class="QWidget" name="tab_2">
|
<property name="maximumSize">
|
||||||
<attribute name="title">
|
<size>
|
||||||
<string>Tab 2</string>
|
<width>32</width>
|
||||||
</attribute>
|
<height>32</height>
|
||||||
</widget>
|
</size>
|
||||||
</widget>
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>TextLabel</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QLabel" name="lblUser">
|
||||||
|
<property name="text">
|
||||||
|
<string>TextLabel</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QLabel" name="lblLoggedIn">
|
||||||
|
<property name="sizePolicy">
|
||||||
|
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
|
||||||
|
<horstretch>0</horstretch>
|
||||||
|
<verstretch>0</verstretch>
|
||||||
|
</sizepolicy>
|
||||||
|
</property>
|
||||||
|
<property name="minimumSize">
|
||||||
|
<size>
|
||||||
|
<width>32</width>
|
||||||
|
<height>32</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
<property name="maximumSize">
|
||||||
|
<size>
|
||||||
|
<width>32</width>
|
||||||
|
<height>32</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string/>
|
||||||
|
</property>
|
||||||
|
<property name="pixmap">
|
||||||
|
<pixmap resource="../resources.qrc">:/resources/icons/circleGray.png</pixmap>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<layout class="QVBoxLayout" name="verticalLayout_ListMsg"/>
|
||||||
</item>
|
</item>
|
||||||
</layout>
|
</layout>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<layout class="QHBoxLayout" name="horizontalLayout">
|
<layout class="QHBoxLayout" name="horizontalLayout_Input">
|
||||||
<property name="sizeConstraint">
|
<property name="sizeConstraint">
|
||||||
<enum>QLayout::SetDefaultConstraint</enum>
|
<enum>QLayout::SetDefaultConstraint</enum>
|
||||||
</property>
|
</property>
|
||||||
@@ -68,58 +112,54 @@
|
|||||||
<property name="minimumSize">
|
<property name="minimumSize">
|
||||||
<size>
|
<size>
|
||||||
<width>0</width>
|
<width>0</width>
|
||||||
<height>50</height>
|
<height>0</height>
|
||||||
</size>
|
</size>
|
||||||
</property>
|
</property>
|
||||||
<property name="maximumSize">
|
<property name="maximumSize">
|
||||||
<size>
|
<size>
|
||||||
<width>16777215</width>
|
<width>16777215</width>
|
||||||
<height>1000</height>
|
<height>16777215</height>
|
||||||
</size>
|
</size>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<layout class="QVBoxLayout" name="verticalLayout_2">
|
<widget class="QToolButton" name="btnSend">
|
||||||
<item>
|
<property name="sizePolicy">
|
||||||
<widget class="QToolButton" name="btnSend">
|
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
|
||||||
<property name="sizePolicy">
|
<horstretch>0</horstretch>
|
||||||
<sizepolicy hsizetype="Ignored" vsizetype="Preferred">
|
<verstretch>0</verstretch>
|
||||||
<horstretch>0</horstretch>
|
</sizepolicy>
|
||||||
<verstretch>0</verstretch>
|
</property>
|
||||||
</sizepolicy>
|
<property name="minimumSize">
|
||||||
</property>
|
<size>
|
||||||
<property name="minimumSize">
|
<width>65</width>
|
||||||
<size>
|
<height>54</height>
|
||||||
<width>65</width>
|
</size>
|
||||||
<height>58</height>
|
</property>
|
||||||
</size>
|
<property name="maximumSize">
|
||||||
</property>
|
<size>
|
||||||
<property name="maximumSize">
|
<width>1000</width>
|
||||||
<size>
|
<height>1000</height>
|
||||||
<width>1000</width>
|
</size>
|
||||||
<height>1000</height>
|
</property>
|
||||||
</size>
|
<property name="text">
|
||||||
</property>
|
<string>Send</string>
|
||||||
<property name="text">
|
</property>
|
||||||
<string>Send</string>
|
<property name="icon">
|
||||||
</property>
|
<iconset resource="../resources.qrc">
|
||||||
<property name="icon">
|
<normaloff>:/resources/icons/sendMsg.png</normaloff>:/resources/icons/sendMsg.png</iconset>
|
||||||
<iconset resource="../resources.qrc">
|
</property>
|
||||||
<normaloff>:/resources/icons/sendMsg.png</normaloff>:/resources/icons/sendMsg.png</iconset>
|
<property name="iconSize">
|
||||||
</property>
|
<size>
|
||||||
<property name="iconSize">
|
<width>32</width>
|
||||||
<size>
|
<height>32</height>
|
||||||
<width>32</width>
|
</size>
|
||||||
<height>32</height>
|
</property>
|
||||||
</size>
|
<property name="toolButtonStyle">
|
||||||
</property>
|
<enum>Qt::ToolButtonTextUnderIcon</enum>
|
||||||
<property name="toolButtonStyle">
|
</property>
|
||||||
<enum>Qt::ToolButtonTextUnderIcon</enum>
|
</widget>
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
</layout>
|
|
||||||
</item>
|
</item>
|
||||||
</layout>
|
</layout>
|
||||||
</item>
|
</item>
|
||||||
|
|||||||
@@ -16,6 +16,8 @@ MsgWidget::MsgWidget(QString avatar, AligneAvatar aligneAvatar, int width, QWidg
|
|||||||
setAligneAvatarRight();
|
setAligneAvatarRight();
|
||||||
|
|
||||||
setWidth(width);
|
setWidth(width);
|
||||||
|
|
||||||
|
ui->lblAvatar->setObjectName("MsgWidgetLblAvatar");
|
||||||
}
|
}
|
||||||
|
|
||||||
MsgWidget::~MsgWidget()
|
MsgWidget::~MsgWidget()
|
||||||
@@ -25,35 +27,57 @@ MsgWidget::~MsgWidget()
|
|||||||
|
|
||||||
void MsgWidget::setAligneAvatarLeft()
|
void MsgWidget::setAligneAvatarLeft()
|
||||||
{
|
{
|
||||||
ui->horizontalLayout->removeWidget(ui->textEdit);
|
ui->horizontalLayout_Main->removeItem(ui->verticalLayout_Avatar);
|
||||||
ui->horizontalLayout->removeItem(ui->verticalLayout);
|
ui->horizontalLayout_Main->removeItem(ui->verticalLayout_Text);
|
||||||
ui->horizontalLayout->removeItem(ui->horizontalLayout_2);
|
ui->horizontalLayout_Main->removeItem(ui->horizontalLayout_Add);
|
||||||
|
ui->horizontalLayout_EditText->removeItem(ui->horizontalSpacer_EditText);
|
||||||
|
ui->horizontalLayout_EditText->removeWidget(ui->editText);
|
||||||
|
|
||||||
ui->horizontalLayout->addLayout(ui->verticalLayout);
|
ui->horizontalLayout_Main->addLayout(ui->verticalLayout_Avatar);
|
||||||
ui->horizontalLayout->addWidget(ui->textEdit);
|
ui->horizontalLayout_Main->addLayout(ui->verticalLayout_Text);
|
||||||
ui->horizontalLayout->addLayout(ui->horizontalLayout_2);
|
ui->horizontalLayout_Main->addLayout(ui->horizontalLayout_Add);
|
||||||
|
|
||||||
ui->textEdit->setObjectName("MsgWidgetLocal");
|
ui->horizontalLayout_EditText->addWidget(ui->editText);
|
||||||
|
ui->horizontalLayout_EditText->addItem(ui->horizontalSpacer_EditText);
|
||||||
|
|
||||||
|
ui->editText->setObjectName("MsgWidgetEditTextRemote");
|
||||||
|
ui->lblTime->setObjectName("MsgWidgetLblTimeRemote");
|
||||||
|
ui->lblName->setObjectName("MsgWidgetLblNameRemote");
|
||||||
|
|
||||||
|
ui->lblTime->setAlignment(Qt::AlignLeft);
|
||||||
|
ui->lblName->setAlignment(Qt::AlignLeft | Qt::AlignBottom);
|
||||||
|
//ui->editText->setAlignment(Qt::AlignLeft);
|
||||||
}
|
}
|
||||||
|
|
||||||
void MsgWidget::setAligneAvatarRight()
|
void MsgWidget::setAligneAvatarRight()
|
||||||
{
|
{
|
||||||
ui->horizontalLayout->removeWidget(ui->textEdit);
|
ui->horizontalLayout_Main->removeItem(ui->verticalLayout_Avatar);
|
||||||
ui->horizontalLayout->removeItem(ui->verticalLayout);
|
ui->horizontalLayout_Main->removeItem(ui->verticalLayout_Text);
|
||||||
ui->horizontalLayout->removeItem(ui->horizontalLayout_2);
|
ui->horizontalLayout_Main->removeItem(ui->horizontalLayout_Add);
|
||||||
|
ui->horizontalLayout_EditText->removeItem(ui->horizontalSpacer_EditText);
|
||||||
|
ui->horizontalLayout_EditText->removeWidget(ui->editText);
|
||||||
|
|
||||||
ui->horizontalLayout->addLayout(ui->horizontalLayout_2);
|
ui->horizontalLayout_Main->addLayout(ui->horizontalLayout_Add);
|
||||||
ui->horizontalLayout->addWidget(ui->textEdit);
|
ui->horizontalLayout_Main->addLayout(ui->verticalLayout_Text);
|
||||||
ui->horizontalLayout->addLayout(ui->verticalLayout);
|
ui->horizontalLayout_Main->addLayout(ui->verticalLayout_Avatar);
|
||||||
|
|
||||||
ui->textEdit->setObjectName("MsgWidgetRemote");
|
ui->horizontalLayout_EditText->addItem(ui->horizontalSpacer_EditText);
|
||||||
|
ui->horizontalLayout_EditText->addWidget(ui->editText);
|
||||||
|
|
||||||
|
ui->editText->setObjectName("MsgWidgetEditTextLocal");
|
||||||
|
ui->lblTime->setObjectName("MsgWidgetLblTimeLocal");
|
||||||
|
ui->lblName->setObjectName("MsgWidgetLblNameLocal");
|
||||||
|
|
||||||
|
ui->lblTime->setAlignment(Qt::AlignRight);
|
||||||
|
ui->lblName->setAlignment(Qt::AlignRight | Qt::AlignBottom);
|
||||||
|
//ui->editText->setAlignment(Qt::AlignRight);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void MsgWidget::setAvatar(QString avatar)
|
void MsgWidget::setAvatar(QString avatar)
|
||||||
{
|
{
|
||||||
QPixmap pix(avatar);
|
QPixmap pix(avatar);
|
||||||
ui->label->setPixmap( pix.scaled(32,32) );
|
ui->lblAvatar->setPixmap( pix.scaled(32,32) );
|
||||||
}
|
}
|
||||||
|
|
||||||
void MsgWidget::setWidth(int width)
|
void MsgWidget::setWidth(int width)
|
||||||
@@ -64,13 +88,23 @@ void MsgWidget::setWidth(int width)
|
|||||||
|
|
||||||
void MsgWidget::setText(QString text)
|
void MsgWidget::setText(QString text)
|
||||||
{
|
{
|
||||||
ui->textEdit->setText(text);
|
ui->editText->setText(text);
|
||||||
}
|
}
|
||||||
|
|
||||||
void MsgWidget::on_textEdit_textChanged()
|
void MsgWidget::setTime(QString timeStr)
|
||||||
{
|
{
|
||||||
QString text = ui->textEdit->toPlainText();
|
ui->lblTime->setText(timeStr);
|
||||||
QFontMetrics metricsFont(ui->textEdit->font()); //метрики шрифта
|
}
|
||||||
|
|
||||||
|
void MsgWidget::setName(QString name)
|
||||||
|
{
|
||||||
|
ui->lblName->setText(name);
|
||||||
|
}
|
||||||
|
|
||||||
|
void MsgWidget::on_editText_textChanged()
|
||||||
|
{
|
||||||
|
QString text = ui->editText->toPlainText();
|
||||||
|
QFontMetrics metricsFont(ui->editText->font()); //метрики шрифта
|
||||||
|
|
||||||
//геометрические параметры текста (высота/ширина в пикселях). В одну строку
|
//геометрические параметры текста (высота/ширина в пикселях). В одну строку
|
||||||
QRect textRect = metricsFont.boundingRect(QRect(0, 0, 0, 0), 0, text);
|
QRect textRect = metricsFont.boundingRect(QRect(0, 0, 0, 0), 0, text);
|
||||||
@@ -79,14 +113,31 @@ void MsgWidget::on_textEdit_textChanged()
|
|||||||
|
|
||||||
if(textRect.width() > widthEdit)
|
if(textRect.width() > widthEdit)
|
||||||
{//Не помещается в одну строку
|
{//Не помещается в одну строку
|
||||||
textRect = metricsFont.boundingRect(QRect(0, 0, widthEdit, 10), Qt::TextWordWrap, text);
|
|
||||||
ui->textEdit->setFixedHeight(textRect.height() + X);
|
textRect = metricsFont.boundingRect(QRect(0, 0, widthEdit, 1000), Qt::TextWordWrap, text);
|
||||||
this->setFixedHeight(textRect.height() + X + 20);
|
|
||||||
|
if(textRect.width() > widthEdit)
|
||||||
|
{
|
||||||
|
QRect textRect1str = metricsFont.boundingRect(QRect(0, 0, widthEdit, 1000), 0, "string");
|
||||||
|
int ost = textRect.width() % widthEdit;
|
||||||
|
int cnt = textRect.width() / widthEdit;
|
||||||
|
//if(ost > 0)
|
||||||
|
cnt += 1;
|
||||||
|
|
||||||
|
this->setFixedHeight(textRect1str.height() * cnt + (ost? textRect1str.height() : 0) + X + 20 + 30 + 30);
|
||||||
|
ui->editText->setFixedHeight(textRect1str.height() * cnt + (ost? textRect1str.height() : 0) + X);
|
||||||
|
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
this->setFixedHeight(textRect.height() + X + 20 + 30 + 30);
|
||||||
|
ui->editText->setFixedHeight(textRect.height() + X);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{//В одну строку
|
{//В одну строку
|
||||||
ui->textEdit->setFixedWidth(textRect.width() + X);
|
this->setFixedHeight(textRect.height() + X + 20 + 30 + 30);
|
||||||
ui->textEdit->setFixedHeight(textRect.height() + X);
|
ui->editText->setFixedWidth(textRect.width() + X);
|
||||||
this->setFixedHeight(textRect.height() + X + 20);
|
ui->editText->setFixedHeight(textRect.height() + X);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -13,6 +13,11 @@ class MsgWidget : public QWidget
|
|||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
public:
|
public:
|
||||||
|
enum DirectionMsg
|
||||||
|
{
|
||||||
|
Incoming, //Входящее
|
||||||
|
Outgoing //Исходящее
|
||||||
|
};
|
||||||
enum AligneAvatar
|
enum AligneAvatar
|
||||||
{
|
{
|
||||||
Left,
|
Left,
|
||||||
@@ -23,15 +28,18 @@ public:
|
|||||||
explicit MsgWidget(QString avatar, AligneAvatar aligneAvatar, int width, QWidget *parent = nullptr);
|
explicit MsgWidget(QString avatar, AligneAvatar aligneAvatar, int width, QWidget *parent = nullptr);
|
||||||
~MsgWidget();
|
~MsgWidget();
|
||||||
|
|
||||||
|
void setText(QString text);
|
||||||
|
void setTime(QString timeStr);
|
||||||
|
void setName(QString name);
|
||||||
|
|
||||||
|
private:
|
||||||
void setAligneAvatarLeft();
|
void setAligneAvatarLeft();
|
||||||
void setAligneAvatarRight();
|
void setAligneAvatarRight();
|
||||||
void setAvatar(QString avatar);
|
void setAvatar(QString avatar);
|
||||||
void setWidth(int width);
|
void setWidth(int width);
|
||||||
|
|
||||||
void setText(QString text);
|
|
||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
void on_textEdit_textChanged();
|
void on_editText_textChanged();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Ui::MsgWidget *ui;
|
Ui::MsgWidget *ui;
|
||||||
|
|||||||
@@ -7,7 +7,7 @@
|
|||||||
<x>0</x>
|
<x>0</x>
|
||||||
<y>0</y>
|
<y>0</y>
|
||||||
<width>400</width>
|
<width>400</width>
|
||||||
<height>91</height>
|
<height>255</height>
|
||||||
</rect>
|
</rect>
|
||||||
</property>
|
</property>
|
||||||
<property name="sizePolicy">
|
<property name="sizePolicy">
|
||||||
@@ -21,11 +21,11 @@
|
|||||||
</property>
|
</property>
|
||||||
<layout class="QGridLayout" name="gridLayout">
|
<layout class="QGridLayout" name="gridLayout">
|
||||||
<item row="1" column="0">
|
<item row="1" column="0">
|
||||||
<layout class="QHBoxLayout" name="horizontalLayout">
|
<layout class="QHBoxLayout" name="horizontalLayout_Main">
|
||||||
<item>
|
<item>
|
||||||
<layout class="QVBoxLayout" name="verticalLayout">
|
<layout class="QVBoxLayout" name="verticalLayout_Avatar">
|
||||||
<item>
|
<item>
|
||||||
<widget class="QLabel" name="label">
|
<widget class="QLabel" name="lblAvatar">
|
||||||
<property name="minimumSize">
|
<property name="minimumSize">
|
||||||
<size>
|
<size>
|
||||||
<width>32</width>
|
<width>32</width>
|
||||||
@@ -38,13 +38,19 @@
|
|||||||
<height>32</height>
|
<height>32</height>
|
||||||
</size>
|
</size>
|
||||||
</property>
|
</property>
|
||||||
|
<property name="font">
|
||||||
|
<font>
|
||||||
|
<family>Tahoma</family>
|
||||||
|
<pointsize>10</pointsize>
|
||||||
|
</font>
|
||||||
|
</property>
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>TextLabel</string>
|
<string>TextLabel</string>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<spacer name="verticalSpacer">
|
<spacer name="verticalSpacer_Avatar">
|
||||||
<property name="orientation">
|
<property name="orientation">
|
||||||
<enum>Qt::Vertical</enum>
|
<enum>Qt::Vertical</enum>
|
||||||
</property>
|
</property>
|
||||||
@@ -59,28 +65,78 @@
|
|||||||
</layout>
|
</layout>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<widget class="QTextEdit" name="textEdit">
|
<layout class="QVBoxLayout" name="verticalLayout_Text">
|
||||||
<property name="sizePolicy">
|
<item>
|
||||||
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
|
<widget class="QLabel" name="lblName">
|
||||||
<horstretch>0</horstretch>
|
<property name="text">
|
||||||
<verstretch>0</verstretch>
|
<string>Name</string>
|
||||||
</sizepolicy>
|
</property>
|
||||||
</property>
|
</widget>
|
||||||
<property name="verticalScrollBarPolicy">
|
</item>
|
||||||
<enum>Qt::ScrollBarAlwaysOff</enum>
|
<item>
|
||||||
</property>
|
<layout class="QHBoxLayout" name="horizontalLayout_EditText">
|
||||||
<property name="horizontalScrollBarPolicy">
|
<item>
|
||||||
<enum>Qt::ScrollBarAlwaysOff</enum>
|
<spacer name="horizontalSpacer_EditText">
|
||||||
</property>
|
<property name="orientation">
|
||||||
<property name="sizeAdjustPolicy">
|
<enum>Qt::Horizontal</enum>
|
||||||
<enum>QAbstractScrollArea::AdjustIgnored</enum>
|
</property>
|
||||||
</property>
|
<property name="sizeHint" stdset="0">
|
||||||
</widget>
|
<size>
|
||||||
|
<width>40</width>
|
||||||
|
<height>20</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
</spacer>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QTextEdit" name="editText">
|
||||||
|
<property name="sizePolicy">
|
||||||
|
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
|
||||||
|
<horstretch>0</horstretch>
|
||||||
|
<verstretch>0</verstretch>
|
||||||
|
</sizepolicy>
|
||||||
|
</property>
|
||||||
|
<property name="font">
|
||||||
|
<font>
|
||||||
|
<family>Tahoma</family>
|
||||||
|
<pointsize>10</pointsize>
|
||||||
|
</font>
|
||||||
|
</property>
|
||||||
|
<property name="verticalScrollBarPolicy">
|
||||||
|
<enum>Qt::ScrollBarAlwaysOff</enum>
|
||||||
|
</property>
|
||||||
|
<property name="horizontalScrollBarPolicy">
|
||||||
|
<enum>Qt::ScrollBarAlwaysOff</enum>
|
||||||
|
</property>
|
||||||
|
<property name="sizeAdjustPolicy">
|
||||||
|
<enum>QAbstractScrollArea::AdjustIgnored</enum>
|
||||||
|
</property>
|
||||||
|
<property name="readOnly">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QLabel" name="lblTime">
|
||||||
|
<property name="font">
|
||||||
|
<font>
|
||||||
|
<family>Tahoma</family>
|
||||||
|
<pointsize>10</pointsize>
|
||||||
|
</font>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>--:--</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<layout class="QHBoxLayout" name="horizontalLayout_2">
|
<layout class="QHBoxLayout" name="horizontalLayout_Add">
|
||||||
<item>
|
<item>
|
||||||
<spacer name="horizontalSpacer">
|
<spacer name="horizontalSpacer_Add">
|
||||||
<property name="orientation">
|
<property name="orientation">
|
||||||
<enum>Qt::Horizontal</enum>
|
<enum>Qt::Horizontal</enum>
|
||||||
</property>
|
</property>
|
||||||
|
|||||||
@@ -1,54 +1,80 @@
|
|||||||
#include <QScrollBar>
|
#include <QScrollBar>
|
||||||
#include "tabdialogmessenger.h"
|
#include "tabdialogmessenger.h"
|
||||||
#include "msgwidget.h"
|
#include "msgwidget.h"
|
||||||
|
#include "user.h"
|
||||||
|
#include "instructor.h"
|
||||||
|
|
||||||
|
|
||||||
TabDialogMessenger::TabDialogMessenger(QString login , QString userId, QWidget *parent):
|
OneDialogMessenger::OneDialogMessenger(User userLocalGUI, User userRemote, QWidget *parent):
|
||||||
QListWidget(parent),
|
QListWidget(parent)
|
||||||
login(""),
|
|
||||||
userId("")
|
|
||||||
{
|
{
|
||||||
this->userId = userId;
|
this->userLocalGUI = userLocalGUI;
|
||||||
this->login = login;
|
this->userRemote = userRemote;
|
||||||
|
|
||||||
setWordWrap(true);
|
setWordWrap(true);
|
||||||
setVerticalScrollBarPolicy(Qt::ScrollBarPolicy::ScrollBarAlwaysOn);
|
setVerticalScrollBarPolicy(Qt::ScrollBarPolicy::ScrollBarAlwaysOn);
|
||||||
}
|
}
|
||||||
|
|
||||||
TabDialogMessenger::~TabDialogMessenger()
|
OneDialogMessenger::~OneDialogMessenger()
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void TabDialogMessenger::addMsgWidgetLocal(QString text)
|
void OneDialogMessenger::addMsgWidgetLocal(QString text, QString timeStr, QString name)
|
||||||
|
{
|
||||||
|
addMsgWidget(text, timeStr, MsgWidget::DirectionMsg::Outgoing, name);
|
||||||
|
}
|
||||||
|
|
||||||
|
void OneDialogMessenger::addMsgWidgetRemote(QString text, QString timeStr, QString name)
|
||||||
|
{
|
||||||
|
addMsgWidget(text, timeStr, MsgWidget::DirectionMsg::Incoming, name);
|
||||||
|
}
|
||||||
|
|
||||||
|
void OneDialogMessenger::addMsgWidget(QString text, QString timeStr, MsgWidget::DirectionMsg direction, QString name)
|
||||||
{
|
{
|
||||||
QListWidgetItem *listWidgetItem = new QListWidgetItem();
|
QListWidgetItem *listWidgetItem = new QListWidgetItem();
|
||||||
QString avatar = ":/resources/icons/instructor.png";
|
|
||||||
MsgWidget *msgWidget = new MsgWidget(avatar, MsgWidget::AligneAvatar::Left,
|
QString avatar = "";
|
||||||
width() - verticalScrollBar()->size().width());
|
MsgWidget::AligneAvatar aligneAvatar = MsgWidget::AligneAvatar::Left;
|
||||||
|
|
||||||
addItem(listWidgetItem);
|
if(direction == MsgWidget::DirectionMsg::Outgoing)
|
||||||
setItemWidget(listWidgetItem, msgWidget);
|
{//Исходящее
|
||||||
|
if(static_cast<Instructor*>(&userLocalGUI)->getIsAdmin())
|
||||||
msgWidget->setText(text);
|
avatar = ":/resources/icons/admin.png";
|
||||||
|
else
|
||||||
//Корректировка высоты item
|
avatar = ":/resources/icons/instructor.png";
|
||||||
listWidgetItem->setSizeHint (QSize(10, msgWidget->height()));
|
|
||||||
|
aligneAvatar = MsgWidget::AligneAvatar::Right;
|
||||||
scrollToItem(listWidgetItem);
|
}
|
||||||
}
|
else
|
||||||
|
{//Входящее
|
||||||
void TabDialogMessenger::addMsgWidgetRemote(QString text)
|
if(userRemote.getTypeUserDB() == User::TypeUserDBTrainee)
|
||||||
{
|
avatar = ":/resources/icons/trainee.png";
|
||||||
QListWidgetItem *listWidgetItem = new QListWidgetItem();
|
else
|
||||||
QString avatar = ":/resources/icons/trainee.png";
|
{
|
||||||
MsgWidget *msgWidget = new MsgWidget(avatar, MsgWidget::AligneAvatar::Right,
|
if(static_cast<Instructor*>(&userRemote)->getIsAdmin())
|
||||||
width() - verticalScrollBar()->size().width());
|
avatar = ":/resources/icons/admin.png";
|
||||||
|
else
|
||||||
|
avatar = ":/resources/icons/instructor.png";
|
||||||
|
}
|
||||||
|
|
||||||
|
aligneAvatar = MsgWidget::AligneAvatar::Left;
|
||||||
|
}
|
||||||
|
|
||||||
|
int widthW = width();
|
||||||
|
int widthSB = verticalScrollBar()->size().width();
|
||||||
|
//TODO Времянка
|
||||||
|
widthW = 450;
|
||||||
|
widthSB = 17;
|
||||||
|
|
||||||
|
MsgWidget *msgWidget = new MsgWidget(avatar, aligneAvatar, widthW - widthSB);
|
||||||
|
|
||||||
addItem(listWidgetItem);
|
addItem(listWidgetItem);
|
||||||
setItemWidget(listWidgetItem, msgWidget);
|
setItemWidget(listWidgetItem, msgWidget);
|
||||||
|
|
||||||
msgWidget->setText(text);
|
msgWidget->setText(text);
|
||||||
|
msgWidget->setTime(timeStr);
|
||||||
|
msgWidget->setName(name);
|
||||||
|
|
||||||
//Корректировка высоты item
|
//Корректировка высоты item
|
||||||
listWidgetItem->setSizeHint (QSize(10, msgWidget->height()));
|
listWidgetItem->setSizeHint (QSize(10, msgWidget->height()));
|
||||||
|
|||||||
@@ -2,28 +2,28 @@
|
|||||||
#define TABDIALOGMESSENGER_H
|
#define TABDIALOGMESSENGER_H
|
||||||
|
|
||||||
#include <QListWidget>
|
#include <QListWidget>
|
||||||
|
#include "msgwidget.h"
|
||||||
|
#include "user.h"
|
||||||
|
|
||||||
//Закладка ведения диалога с одним клиентом
|
class OneDialogMessenger : public QListWidget
|
||||||
|
|
||||||
//TODO сделать идентификацию по ID
|
|
||||||
|
|
||||||
class TabDialogMessenger : public QListWidget
|
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
||||||
public:
|
public:
|
||||||
TabDialogMessenger(QString userLogin, QString userId, QWidget *parent = nullptr);
|
OneDialogMessenger(User userLocalGUI, User userRemote, QWidget *parent = nullptr);
|
||||||
~TabDialogMessenger();
|
~OneDialogMessenger();
|
||||||
|
|
||||||
QString getUserLogin() {return login;};
|
int getUserRemoteId() {return userRemote.getID();}
|
||||||
QString getUserId() {return userId;}
|
|
||||||
|
|
||||||
void addMsgWidgetLocal(QString text);
|
void addMsgWidgetLocal(QString text, QString timeStr = "", QString name = "");
|
||||||
void addMsgWidgetRemote(QString text);
|
void addMsgWidgetRemote(QString text, QString timeStr = "", QString name = "");
|
||||||
|
|
||||||
private:
|
private:
|
||||||
QString login;
|
void addMsgWidget(QString text, QString timeStr, MsgWidget::DirectionMsg direction, QString name = "");
|
||||||
QString userId;
|
|
||||||
|
private:
|
||||||
|
User userLocalGUI;
|
||||||
|
User userRemote;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // TABDIALOGMESSENGER_H
|
#endif // TABDIALOGMESSENGER_H
|
||||||
|
|||||||
15
InstructorsAndTrainees/metatypes.cpp
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
#include "metatypes.h"
|
||||||
|
|
||||||
|
void registerMetaType()
|
||||||
|
{
|
||||||
|
qRegisterMetaType<QList<Instructor>>("QList<Instructor>");
|
||||||
|
qRegisterMetaType<QList<Trainee>>("QList<Trainee>");
|
||||||
|
qRegisterMetaType<QList<Group>>("QList<Group>");
|
||||||
|
qRegisterMetaType<QList<Computer>>("QList<Computer>");
|
||||||
|
qRegisterMetaType<QList<Classroom>>("QList<Classroom>");
|
||||||
|
qRegisterMetaType<QList<Module*>>("QList<Module*>");
|
||||||
|
qRegisterMetaType<QList<TaskAmmFim>>("QList<TaskAmmFim>");
|
||||||
|
qRegisterMetaType<PacketType>("PacketType");
|
||||||
|
qRegisterMetaType<ClientMessage>("ClientMessage");
|
||||||
|
qRegisterMetaType<QList<QTreeWidgetItem*>>("QList<QTreeWidgetItem*>");
|
||||||
|
}
|
||||||
29
InstructorsAndTrainees/metatypes.h
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
#ifndef METATYPES_H
|
||||||
|
#define METATYPES_H
|
||||||
|
|
||||||
|
#include <QTreeWidgetItem>
|
||||||
|
|
||||||
|
#include "instructor.h"
|
||||||
|
#include "trainee.h"
|
||||||
|
#include "group.h"
|
||||||
|
#include "computer.h"
|
||||||
|
#include "classroom.h"
|
||||||
|
#include "module.h"
|
||||||
|
#include "tasksAmmFim.h"
|
||||||
|
#include "tools.h"
|
||||||
|
#include "Datas.h"
|
||||||
|
|
||||||
|
void registerMetaType();
|
||||||
|
|
||||||
|
Q_DECLARE_METATYPE(QList<Instructor>)
|
||||||
|
Q_DECLARE_METATYPE(QList<Trainee>)
|
||||||
|
Q_DECLARE_METATYPE(QList<Group>)
|
||||||
|
Q_DECLARE_METATYPE(QList<Computer>)
|
||||||
|
Q_DECLARE_METATYPE(QList<Classroom>)
|
||||||
|
Q_DECLARE_METATYPE(QList<Module*>)
|
||||||
|
Q_DECLARE_METATYPE(QList<TaskAmmFim>)
|
||||||
|
Q_DECLARE_METATYPE(PacketType)
|
||||||
|
Q_DECLARE_METATYPE(ClientMessage)
|
||||||
|
Q_DECLARE_METATYPE(QList<QTreeWidgetItem*>)
|
||||||
|
|
||||||
|
#endif // METATYPES_H
|
||||||
@@ -1,6 +1,5 @@
|
|||||||
<RCC>
|
<RCC>
|
||||||
<qresource prefix="/">
|
<qresource prefix="/">
|
||||||
<file>resources/css/styleSheetMain.css</file>
|
|
||||||
<file>resources/icons/addInstructor.png</file>
|
<file>resources/icons/addInstructor.png</file>
|
||||||
<file>resources/icons/addTrainee.png</file>
|
<file>resources/icons/addTrainee.png</file>
|
||||||
<file>resources/icons/admin.png</file>
|
<file>resources/icons/admin.png</file>
|
||||||
@@ -27,7 +26,6 @@
|
|||||||
<file>resources/icons/instructorArchive.png</file>
|
<file>resources/icons/instructorArchive.png</file>
|
||||||
<file>resources/icons/instructorFromArchive.png</file>
|
<file>resources/icons/instructorFromArchive.png</file>
|
||||||
<file>resources/icons/login-user.png</file>
|
<file>resources/icons/login-user.png</file>
|
||||||
<file>resources/icons/messengerPrint.png</file>
|
|
||||||
<file>resources/icons/newGroup.png</file>
|
<file>resources/icons/newGroup.png</file>
|
||||||
<file>resources/icons/rectGray.png</file>
|
<file>resources/icons/rectGray.png</file>
|
||||||
<file>resources/icons/rectGreen.png</file>
|
<file>resources/icons/rectGreen.png</file>
|
||||||
@@ -37,7 +35,6 @@
|
|||||||
<file>resources/icons/traineeFromArchive.png</file>
|
<file>resources/icons/traineeFromArchive.png</file>
|
||||||
<file>resources/icons/vline.png</file>
|
<file>resources/icons/vline.png</file>
|
||||||
<file>resources/icons/sign.png</file>
|
<file>resources/icons/sign.png</file>
|
||||||
<file>resources/icons/task.png</file>
|
|
||||||
<file>resources/icons/procedure.png</file>
|
<file>resources/icons/procedure.png</file>
|
||||||
<file>resources/icons/malfunction.png</file>
|
<file>resources/icons/malfunction.png</file>
|
||||||
<file>resources/icons/762.gif</file>
|
<file>resources/icons/762.gif</file>
|
||||||
@@ -52,5 +49,8 @@
|
|||||||
<file>resources/icons/updateVersion.png</file>
|
<file>resources/icons/updateVersion.png</file>
|
||||||
<file>resources/icons/editorDB.png</file>
|
<file>resources/icons/editorDB.png</file>
|
||||||
<file>resources/icons/lms.png</file>
|
<file>resources/icons/lms.png</file>
|
||||||
|
<file>resources/icons/critical.png</file>
|
||||||
|
<file>resources/icons/warning.png</file>
|
||||||
|
<file>resources/icons/info.png</file>
|
||||||
</qresource>
|
</qresource>
|
||||||
</RCC>
|
</RCC>
|
||||||
|
|||||||
@@ -1,22 +1,33 @@
|
|||||||
/*Обязательные поля*/
|
/*Обязательные поля*/
|
||||||
*[mandatoryField="true"] {
|
*[mandatoryField="true"] {
|
||||||
background-color: #fff2fb
|
background-color: #fffdfd
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*Общие настройки виджетов*/
|
/*Общие настройки виджетов*/
|
||||||
QWidget {
|
QWidget {
|
||||||
font-family: Tahoma;
|
font-family: Tahoma;
|
||||||
font-size: 14pt;
|
font-size: 12pt;
|
||||||
icon-size: 24px;
|
icon-size: 24px;
|
||||||
|
/*background-color: green;*/
|
||||||
|
}
|
||||||
|
|
||||||
|
QWidget#widgetControl {
|
||||||
|
/*border: 1px solid gray;*/
|
||||||
|
background: #E0E0E0;
|
||||||
|
}
|
||||||
|
|
||||||
|
QWidget#viewerTrainees
|
||||||
|
{
|
||||||
|
padding-left: 20px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
QLineEdit, QTextEdit {
|
QLineEdit, QTextEdit, QComboBox {
|
||||||
border: 1px solid gray;
|
border: 1px solid gray;
|
||||||
border-radius: 4px;
|
border-radius: 2px;
|
||||||
padding: 0px 8px;
|
padding: 0px 8px;
|
||||||
background: white;
|
background: #fafafafa;
|
||||||
selection-background-color: darkgray;
|
selection-background-color: darkgray;
|
||||||
}
|
}
|
||||||
QLineEdit[echoMode="2"] {
|
QLineEdit[echoMode="2"] {
|
||||||
@@ -30,46 +41,57 @@ QLineEdit:read-only {
|
|||||||
QGroupBox {
|
QGroupBox {
|
||||||
background: #E0E0E0;
|
background: #E0E0E0;
|
||||||
border: 1px solid gray;
|
border: 1px solid gray;
|
||||||
border-radius: 5px;
|
border-radius: 3px;
|
||||||
margin-top: 5ex; /* leave space at the top for the title */
|
margin-top: 5ex; /* leave space at the top for the title */
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
QGroupBox::title {
|
QGroupBox::title {
|
||||||
border: 1px solid gray;
|
border: 1px solid gray;
|
||||||
border-bottom: none;
|
border-bottom: none;
|
||||||
border-radius: 5px;
|
border-radius: 4px;
|
||||||
subcontrol-origin: margin;
|
subcontrol-origin: margin;
|
||||||
subcontrol-position: top left;
|
subcontrol-position: top left;
|
||||||
padding-left: 10px;
|
padding-left: 10px;
|
||||||
padding-right: 10px;
|
padding-right: 10px;
|
||||||
background-color: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1,
|
background-color: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1,
|
||||||
stop: 0 #A0CECE, stop: 1 #FFFFFF);
|
stop: 0 #A0CECE, stop: 1 #FFFFFF);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
QPushButton, QToolButton {
|
QPushButton, QToolButton {
|
||||||
border: 2px solid #8f8f91;
|
border: 2px solid #8f8f91;
|
||||||
border-style: outset;
|
border-style: outset;
|
||||||
border-radius: 5px;
|
border-radius: 5px;
|
||||||
background-color: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1,
|
background-color: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1,
|
||||||
stop: 0 #f6f7fa, stop: 1 #dadbde);
|
stop: 0 #f6f7fa, stop: 1 #dadbde);
|
||||||
min-width: 80px;
|
min-width: 75px;
|
||||||
height: 60px;
|
height: 50px;
|
||||||
padding: 1px;
|
padding: 1px;
|
||||||
|
|
||||||
|
qproperty-iconSize: 32px;
|
||||||
}
|
}
|
||||||
|
|
||||||
QPushButton {
|
QPushButton {
|
||||||
height: 25px;
|
height: 25px;
|
||||||
|
width: 100px;
|
||||||
}
|
}
|
||||||
QToolButton {
|
QToolButton {
|
||||||
width: 200px;
|
width: 180px;
|
||||||
|
height: 55px;
|
||||||
}
|
}
|
||||||
QToolButton#btnSend { /*Кнопка Send Мессенджера*/
|
|
||||||
width: 60px;
|
QToolButton#btnSend, QToolButton#btnDelete, QToolButton#btnCheck, QToolButton#btnOnlyActive,
|
||||||
|
QToolButton#btnSave, QToolButton#btnUpdateStyle, QToolButton#btnSetVersion,
|
||||||
|
QToolButton#btnAssignTask {
|
||||||
|
width: 80px;
|
||||||
|
height: 55px;
|
||||||
}
|
}
|
||||||
QPushButton:flat, QToolButton:flat {
|
QPushButton:flat, QToolButton:flat {
|
||||||
border: none; /* no border for a flat push button */
|
border: none; /* no border for a flat push button */
|
||||||
}
|
}
|
||||||
QPushButton:default, QToolButton:default {
|
QPushButton:default, QToolButton:default {
|
||||||
border-color: navy; /* make the default button prominent */
|
border-color: darkblue; /*make the default button prominent */
|
||||||
}
|
}
|
||||||
QPushButton:hover , QToolButton:hover {
|
QPushButton:hover , QToolButton:hover {
|
||||||
background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1,
|
background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1,
|
||||||
@@ -86,11 +108,24 @@ QPushButton:checked, QToolButton:checked {
|
|||||||
stop: 0 #dadbde, stop: 1 #f6f7fa);
|
stop: 0 #dadbde, stop: 1 #f6f7fa);
|
||||||
border-style: inset;
|
border-style: inset;
|
||||||
}
|
}
|
||||||
|
/*
|
||||||
|
QDialogButtonBox {
|
||||||
|
border: 2px solid #8f8f91;
|
||||||
|
border-style: outset;
|
||||||
|
border-radius: 5px;
|
||||||
|
background-color: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1,
|
||||||
|
stop: 0 #f6f7fa, stop: 1 #dadbde);
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
QCheckBox {
|
QCheckBox {
|
||||||
spacing: 20px;
|
spacing: 20px;
|
||||||
}
|
}
|
||||||
|
QCheckBox#checkAutoStart {
|
||||||
|
spacing: 0px;
|
||||||
|
}
|
||||||
|
|
||||||
QCheckBox::indicator:checked {
|
QCheckBox::indicator:checked {
|
||||||
width: 24px;
|
width: 24px;
|
||||||
height: 24px;
|
height: 24px;
|
||||||
@@ -104,12 +139,12 @@ QCheckBox::indicator:!checked {
|
|||||||
|
|
||||||
|
|
||||||
QTreeWidget {
|
QTreeWidget {
|
||||||
font-size: 12pt;
|
font-size: 13pt;
|
||||||
font-family: Tahoma;
|
font-family: Tahoma;
|
||||||
icon-size: 24px;
|
icon-size: 32px;
|
||||||
}
|
}
|
||||||
QTreeWidget::item {
|
QTreeWidget::item {
|
||||||
height: 30px;
|
height: 34px;
|
||||||
}
|
}
|
||||||
/*Бранчи*/
|
/*Бранчи*/
|
||||||
QTreeWidget::branch:has-siblings:!adjoins-item {
|
QTreeWidget::branch:has-siblings:!adjoins-item {
|
||||||
@@ -140,29 +175,45 @@ QTreeWidget::branch:hover {
|
|||||||
}
|
}
|
||||||
|
|
||||||
QTreeWidget::item:selected {
|
QTreeWidget::item:selected {
|
||||||
background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #6ea1f1, stop: 1 #567dbc);
|
/*background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #6ea1f1, stop: 1 #567dbc);*/
|
||||||
color: #ffff00;
|
background: #6ea1f1;
|
||||||
|
color: #ffffff;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
QHeaderView::section {
|
QHeaderView::section {
|
||||||
|
/*
|
||||||
background-color: qlineargradient(x1:0, y1:0, x2:0, y2:1,
|
background-color: qlineargradient(x1:0, y1:0, x2:0, y2:1,
|
||||||
stop:0 #c1c1c1, stop: 0.5 #505050,
|
stop:0 #c1c1c1, stop: 0.5 #505050,
|
||||||
stop: 0.6 #434343, stop:1 #656565);
|
stop: 0.6 #434343, stop:1 #656565);*/
|
||||||
color: white;
|
background-color: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1,
|
||||||
|
stop: 0 #A0CECE, stop: 1 #FFFFFF);
|
||||||
|
color: black;
|
||||||
padding-left: 4px;
|
padding-left: 4px;
|
||||||
border: 1px solid #6c6c6c;
|
border: 1px solid #6c6c6c;
|
||||||
|
|
||||||
|
font-size: 13pt;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
QTabWidget::pane { /* The tab widget frame */
|
QTabWidget::pane { /* The tab widget frame */
|
||||||
border-top: 1px solid #C2C7CB;
|
border-top: 1px solid #C2C7CB;
|
||||||
background-image: url(:/resources/icons/messengerPrint.png);
|
/*background-image: url(:/resources/icons/messengerPrint.png);*/
|
||||||
|
}
|
||||||
|
QTabWidget::pane#tabWidgetTasks { /* The tab widget frame */
|
||||||
|
border-top: 1px solid #C2C7CB;
|
||||||
|
/*background-image: url(:/resources/icons/messengerPrint.png);*/
|
||||||
|
/*
|
||||||
|
padding-left: -18px;
|
||||||
|
padding-right: -18px;
|
||||||
|
padding-top: -8px;
|
||||||
|
padding-bottom: -8px;
|
||||||
|
*/
|
||||||
}
|
}
|
||||||
QTabWidget::tab-bar {
|
QTabWidget::tab-bar {
|
||||||
left: 0px; /* move to the right by 0px */
|
left: 0px; /* move to the right by 0px */
|
||||||
}
|
}
|
||||||
|
|
||||||
QTabBar::tab {
|
QTabBar::tab {
|
||||||
background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1,
|
background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1,
|
||||||
stop: 0 #E1E1E1, stop: 0.4 #DDDDDD,
|
stop: 0 #E1E1E1, stop: 0.4 #DDDDDD,
|
||||||
@@ -171,26 +222,31 @@ QTabBar::tab {
|
|||||||
border-bottom-color: #C2C7CB; /* same as the pane color */
|
border-bottom-color: #C2C7CB; /* same as the pane color */
|
||||||
border-top-left-radius: 4px;
|
border-top-left-radius: 4px;
|
||||||
border-top-right-radius: 4px;
|
border-top-right-radius: 4px;
|
||||||
min-width: 8ex;
|
min-width: 40ex;
|
||||||
padding: 2px;
|
padding: 2px;
|
||||||
|
|
||||||
|
font-size: 12pt;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
QTabBar::tab:selected {
|
QTabBar::tab:selected {
|
||||||
border-color: #9B9B9B;
|
border-color: #9B9B9B;
|
||||||
border-bottom-color: #C2C7CB; /* same as pane color */
|
border-bottom-color: #C2C7CB;
|
||||||
/* expand/overlap to the left and right by 4px */
|
|
||||||
margin-left: -4px;
|
|
||||||
margin-right: -4px;
|
|
||||||
background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #6ea1f1, stop: 1 #567dbc);
|
background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #6ea1f1, stop: 1 #567dbc);
|
||||||
color: #ffffff;
|
color: #ffffff;
|
||||||
}
|
}
|
||||||
QTabBar::tab:!selected {
|
*/
|
||||||
margin-top: 5px; /* make non-selected tabs look smaller */
|
QTabBar::tab:selected {
|
||||||
background: #ffffff;
|
background: #ffffff;
|
||||||
}
|
}
|
||||||
|
QTabBar::tab:!selected {
|
||||||
|
margin-top: 5px; /* make non-selected tabs look smaller */
|
||||||
|
/*background: #ffffff;*/
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
QTabBar::tab:hover {
|
QTabBar::tab:hover {
|
||||||
background: #aee1ff;
|
background: #aee1ff;
|
||||||
}
|
}
|
||||||
@@ -202,15 +258,17 @@ QTabBar QToolButton { /* the scroll buttons are tool buttons */
|
|||||||
min-width: 30px;
|
min-width: 30px;
|
||||||
width: 30px;
|
width: 30px;
|
||||||
padding: 0px;
|
padding: 0px;
|
||||||
|
margin-top: 5px;
|
||||||
}
|
}
|
||||||
|
|
||||||
QListWidget::item {
|
QListWidget::item {
|
||||||
padding: -5px;
|
/*padding: -5px;*/
|
||||||
}
|
}
|
||||||
QListWidget {
|
QListWidget {
|
||||||
/*background: pink;*/
|
/*background: pink;*/
|
||||||
background: transparent;
|
background: transparent;
|
||||||
background: #f0ffff;
|
/*background: #ffffff;*/
|
||||||
|
background: #ddeeff;
|
||||||
}
|
}
|
||||||
|
|
||||||
QTextEdit {
|
QTextEdit {
|
||||||
@@ -218,13 +276,66 @@ QTextEdit {
|
|||||||
font-size: 12pt;
|
font-size: 12pt;
|
||||||
|
|
||||||
}
|
}
|
||||||
QTextEdit#MsgWidgetLocal {
|
QTextEdit#editMsg {
|
||||||
background: lightgreen;
|
height: 65px; /**/
|
||||||
|
background: #ddeeff;
|
||||||
}
|
}
|
||||||
QTextEdit#MsgWidgetRemote {
|
QTextEdit#MsgWidgetEditTextLocal {
|
||||||
background: lightblue;
|
/*background: tlightgreen;*/
|
||||||
|
background: #ddffdd;
|
||||||
|
border-radius: 8px;
|
||||||
|
}
|
||||||
|
QTextEdit#MsgWidgetEditTextRemote {
|
||||||
|
/*background: lightblue;*/
|
||||||
|
/*background: #ddeeff;*/
|
||||||
|
background: #ffffff;
|
||||||
|
border-radius: 8px;
|
||||||
|
}
|
||||||
|
QLabel#MsgWidgetLblTimeLocal {
|
||||||
|
font-size: 9pt;
|
||||||
|
/*background: yellow;*/
|
||||||
|
}
|
||||||
|
QLabel#MsgWidgetLblTimeRemote {
|
||||||
|
font-size: 9pt;
|
||||||
|
/*background: yellow;*/
|
||||||
|
}
|
||||||
|
|
||||||
|
QLabel#MsgWidgetLblNameLocal {
|
||||||
|
font-size: 9pt;
|
||||||
|
/*background: yellow;*/
|
||||||
|
}
|
||||||
|
QLabel#MsgWidgetLblNameRemote {
|
||||||
|
font-size: 9pt;
|
||||||
|
/*background: yellow;*/
|
||||||
|
}
|
||||||
|
|
||||||
|
QLabel#MsgWidgetLblAvatar {
|
||||||
|
/*background: pink;*/
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
QLabel#MessangerWidgetLblUser {
|
||||||
|
background: #ddeeff;
|
||||||
|
padding-left: 4px;
|
||||||
|
border-radius: 8px;
|
||||||
|
}
|
||||||
|
QLabel#MessangerWidgetLblAvatar {
|
||||||
|
|
||||||
|
}
|
||||||
|
QLabel#MessangerWidgetLblLoggedIn {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
QWidget {
|
QWidget {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QPlainTextEdit#plainText{ /*Репорт*/
|
||||||
|
margin-left: 50pt;
|
||||||
|
margin-right: 100pt;
|
||||||
|
}
|
||||||
|
/**/
|
||||||
|
QComboBox {
|
||||||
|
/*background: #ffffff;
|
||||||
|
border-radius: 5px;*/
|
||||||
|
}
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 4.3 KiB After Width: | Height: | Size: 3.6 KiB |
|
Before Width: | Height: | Size: 4.4 KiB After Width: | Height: | Size: 3.6 KiB |
BIN
InstructorsAndTrainees/resources/icons/PNG/DB-instructors.png
Normal file
|
After Width: | Height: | Size: 4.3 KiB |