From 3e618cbf76f1477f85ea6966e349c9acb924c9b6 Mon Sep 17 00:00:00 2001 From: David Schulz Date: Mon, 28 May 2018 14:46:36 +0200 Subject: [PATCH 01/52] Editor: fix continuosly repainting partially visible annotations Task-number: QTCREATORBUG-20422 Change-Id: Id171d8cb3022dd6e345e55fdf029c445bc42c382 Reviewed-by: Christian Stenger --- src/plugins/texteditor/texteditor.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/texteditor/texteditor.cpp b/src/plugins/texteditor/texteditor.cpp index ab10ab7d0b1..9ef886f2972 100644 --- a/src/plugins/texteditor/texteditor.cpp +++ b/src/plugins/texteditor/texteditor.cpp @@ -4131,7 +4131,7 @@ void TextEditorWidgetPrivate::updateLineAnnotation(const PaintEventData &data, QRect updateRect(lineRect.toRect().topRight(), boundingRect.toRect().bottomRight()); updateRect.setLeft(qBound(0, updateRect.left(), q->viewport()->width() - 1)); updateRect.setRight(qBound(0, updateRect.right(), q->viewport()->width() - 1)); - if (!updateRect.isEmpty() && !data.eventRect.contains(updateRect)) + if (!updateRect.isEmpty() && !data.eventRect.contains(q->viewport()->rect() & updateRect)) q->viewport()->update(updateRect); } From 80dd54ec8bf732917f44ebb235d8083cec829ec6 Mon Sep 17 00:00:00 2001 From: Leena Miettinen Date: Mon, 28 May 2018 18:08:43 +0200 Subject: [PATCH 02/52] Doc: Describe the Cancel Build button Change-Id: I448cd01cd9d2741ff8a4dcb962ddbf3d839f0aa8 Reviewed-by: Eike Ziller --- doc/images/qtcreator-kit-selector.png | Bin 5237 -> 18882 bytes .../projects/creator-projects-building.qdoc | 4 ++++ 2 files changed, 4 insertions(+) diff --git a/doc/images/qtcreator-kit-selector.png b/doc/images/qtcreator-kit-selector.png index 072fcc98ea10663d007785eb1678fd24f7a6a342..ecab33391f70fc9554bb89e98f95a72b4a911822 100644 GIT binary patch literal 18882 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 diff --git a/doc/src/projects/creator-projects-building.qdoc b/doc/src/projects/creator-projects-building.qdoc index c737f8b8e88..c8ab421a01a 100644 --- a/doc/src/projects/creator-projects-building.qdoc +++ b/doc/src/projects/creator-projects-building.qdoc @@ -67,6 +67,10 @@ \endlist + While the application is being built, the \uicontrol Build button changes to + a \uicontrol {Cancel Build} button (3). To cancel the build, select the + button or press \key {Alt+Backspace}. + For more information on the options you have, see \l{Specifying Build Settings}. From 0d64011e4744b40b04d8f7999967700d87332c64 Mon Sep 17 00:00:00 2001 From: Ivan Donchevskii Date: Fri, 25 May 2018 14:28:15 +0200 Subject: [PATCH 03/52] ClangTools: Synchronize standalone tool diagnostic settings ...to the global diagnostic settings list. It was possible to add/remove some configurations without adding/removing them to the checks combobox. Change-Id: I31608fd3758c385aa2fb7ce06aceeb0b91403c50 Reviewed-by: Nikolai Kosjar --- .../clangtools/clangselectablefilesdialog.cpp | 21 ++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/src/plugins/clangtools/clangselectablefilesdialog.cpp b/src/plugins/clangtools/clangselectablefilesdialog.cpp index 4dab13a7268..91b5c8ea531 100644 --- a/src/plugins/clangtools/clangselectablefilesdialog.cpp +++ b/src/plugins/clangtools/clangselectablefilesdialog.cpp @@ -31,7 +31,9 @@ #include "clangtoolsutils.h" #include +#include #include +#include #include #include @@ -265,6 +267,13 @@ private: enum { GlobalSettings , CustomSettings }; +static Core::Id diagnosticConfiguration(ClangToolsProjectSettings *settings) +{ + if (settings->useGlobalSettings()) + return ClangToolsSettings::instance()->savedDiagnosticConfigId(); + return settings->diagnosticConfig(); +} + SelectableFilesDialog::SelectableFilesDialog(const ProjectInfo &projectInfo, const FileInfos &allFileInfos) : QDialog(nullptr) @@ -285,18 +294,15 @@ SelectableFilesDialog::SelectableFilesDialog(const ProjectInfo &projectInfo, ClangToolsProjectSettings *settings = ClangToolsProjectSettingsManager::getSettings(m_project); - Core::Id diagnosticConfig; if (settings->useGlobalSettings()) { m_ui->globalOrCustom->setCurrentIndex(GlobalSettings); m_ui->diagnosticConfigsSelectionWidget->setEnabled(false); - diagnosticConfig = ClangToolsSettings::instance()->savedDiagnosticConfigId(); } else { m_ui->globalOrCustom->setCurrentIndex(CustomSettings); m_ui->diagnosticConfigsSelectionWidget->setEnabled(true); - diagnosticConfig = settings->diagnosticConfig(); } - m_customDiagnosticConfig = diagnosticConfig; - m_ui->diagnosticConfigsSelectionWidget->refresh(diagnosticConfig); + m_customDiagnosticConfig = diagnosticConfiguration(settings); + m_ui->diagnosticConfigsSelectionWidget->refresh(m_customDiagnosticConfig); connect(m_ui->globalOrCustom, static_cast(&QComboBox::currentIndexChanged), @@ -326,6 +332,11 @@ SelectableFilesDialog::SelectableFilesDialog(const ProjectInfo &projectInfo, connect(m_filesModel.get(), &QAbstractItemModel::dataChanged, [this]() { m_analyzeButton->setEnabled(m_filesModel->hasCheckedFiles()); }); + + connect(CppTools::codeModelSettings().data(), &CppTools::CppCodeModelSettings::changed, + this, [=]() { + m_ui->diagnosticConfigsSelectionWidget->refresh(diagnosticConfiguration(settings)); + }); } SelectableFilesDialog::~SelectableFilesDialog() {} From bfb37643287b83325a7a63630ef19885dac78d7c Mon Sep 17 00:00:00 2001 From: Ulf Hermann Date: Mon, 28 May 2018 17:19:47 +0200 Subject: [PATCH 04/52] QmlProfiler: Set the feature on Qml types when loading from qzt Otherwise they are all invalid and nothing is loaded. Change-Id: I12c71b231c81ce961754c1de67766010f00dd8d5 Task-number: QTCREATORBUG-20508 Reviewed-by: Tobias Hunger --- src/plugins/qmlprofiler/qmleventtype.cpp | 41 ++++++++++--------- .../qmlprofiler/tests/qmleventtype_test.cpp | 1 + 2 files changed, 22 insertions(+), 20 deletions(-) diff --git a/src/plugins/qmlprofiler/qmleventtype.cpp b/src/plugins/qmlprofiler/qmleventtype.cpp index c8cb6d2ae77..9cb99c0081e 100644 --- a/src/plugins/qmlprofiler/qmleventtype.cpp +++ b/src/plugins/qmlprofiler/qmleventtype.cpp @@ -28,26 +28,6 @@ namespace QmlProfiler { -QDataStream &operator>>(QDataStream &stream, QmlEventType &type) -{ - quint8 message; - quint8 rangeType; - QString displayName; - stream >> displayName >> type.m_data >> type.m_location >> message >> rangeType - >> type.m_detailType; - type.setDisplayName(displayName); - type.m_message = static_cast(message); - type.m_rangeType = static_cast(rangeType); - return stream; -} - -QDataStream &operator<<(QDataStream &stream, const QmlEventType &type) -{ - return stream << type.displayName() << type.m_data << type.m_location - << static_cast(type.m_message) << static_cast(type.m_rangeType) - << type.m_detailType; -} - static ProfileFeature qmlFeatureFromType(Message message, RangeType rangeType, int detailType) { switch (message) { @@ -75,6 +55,27 @@ static ProfileFeature qmlFeatureFromType(Message message, RangeType rangeType, i } } +QDataStream &operator>>(QDataStream &stream, QmlEventType &type) +{ + quint8 message; + quint8 rangeType; + QString displayName; + stream >> displayName >> type.m_data >> type.m_location >> message >> rangeType + >> type.m_detailType; + type.setDisplayName(displayName); + type.m_message = static_cast(message); + type.m_rangeType = static_cast(rangeType); + type.setFeature(qmlFeatureFromType(type.m_message, type.m_rangeType, type.m_detailType)); + return stream; +} + +QDataStream &operator<<(QDataStream &stream, const QmlEventType &type) +{ + return stream << type.displayName() << type.m_data << type.m_location + << static_cast(type.m_message) << static_cast(type.m_rangeType) + << type.m_detailType; +} + QmlEventType::QmlEventType(Message message, RangeType rangeType, int detailType, const QmlEventLocation &location, const QString &data, const QString displayName) : diff --git a/src/plugins/qmlprofiler/tests/qmleventtype_test.cpp b/src/plugins/qmlprofiler/tests/qmleventtype_test.cpp index 8beebaa3f89..366298c6f4d 100644 --- a/src/plugins/qmlprofiler/tests/qmleventtype_test.cpp +++ b/src/plugins/qmlprofiler/tests/qmleventtype_test.cpp @@ -136,6 +136,7 @@ void QmlEventTypeTest::testStreamOps() rstream >> type2; + QCOMPARE(type.feature(), type2.feature()); QCOMPARE(type.message(), type2.message()); QCOMPARE(type.rangeType(), type2.rangeType()); QCOMPARE(type.detailType(), type2.detailType()); From 0f3409bf3fd89e194dfd732f188beaee46a129d4 Mon Sep 17 00:00:00 2001 From: Ulf Hermann Date: Mon, 28 May 2018 16:40:36 +0200 Subject: [PATCH 05/52] QmlProfiler: Set the future to finished after loading all events Change-Id: I9b23eb5a10558279a47b9bcc106430d5c2b802e0 Task-number: QTCREATORBUG-20508 Reviewed-by: Tobias Hunger --- src/libs/tracing/timelinetracefile.cpp | 5 +++++ src/libs/tracing/timelinetracefile.h | 2 ++ src/plugins/qmlprofiler/qmlprofilertracefile.cpp | 4 ++++ 3 files changed, 11 insertions(+) diff --git a/src/libs/tracing/timelinetracefile.cpp b/src/libs/tracing/timelinetracefile.cpp index 858cddbb9d8..52fc962360f 100644 --- a/src/libs/tracing/timelinetracefile.cpp +++ b/src/libs/tracing/timelinetracefile.cpp @@ -67,6 +67,11 @@ void TimelineTraceFile::fail(const QString &message) m_future.cancel(); } +void TimelineTraceFile::finish() +{ + m_future.reportFinished(); +} + bool TimelineTraceFile::isCanceled() const { return m_future.isCanceled(); diff --git a/src/libs/tracing/timelinetracefile.h b/src/libs/tracing/timelinetracefile.h index 4c1a255ba7c..6be162f28a4 100644 --- a/src/libs/tracing/timelinetracefile.h +++ b/src/libs/tracing/timelinetracefile.h @@ -64,7 +64,9 @@ public: virtual void save(QIODevice *device) = 0; virtual void load(QIODevice *device) = 0; + void fail(const QString &message); + void finish(); void setTraceStart(qint64 traceStart) { m_traceStart = traceStart; } qint64 traceStart() const { return m_traceStart; } diff --git a/src/plugins/qmlprofiler/qmlprofilertracefile.cpp b/src/plugins/qmlprofiler/qmlprofilertracefile.cpp index 0a69f1324c5..38ac383f363 100644 --- a/src/plugins/qmlprofiler/qmlprofilertracefile.cpp +++ b/src/plugins/qmlprofiler/qmlprofilertracefile.cpp @@ -191,6 +191,8 @@ void QmlProfilerTraceFile::loadQtd(QIODevice *device) if (stream.hasError()) fail(tr("Error while parsing trace data file: %1").arg(stream.errorString())); + else + finish(); } void QmlProfilerTraceFile::loadQzt(QIODevice *device) @@ -285,6 +287,8 @@ void QmlProfilerTraceFile::loadQzt(QIODevice *device) buffer.close(); setDeviceProgress(device); } + + finish(); } void QmlProfilerTraceFile::addEventsProgress(qint64 timestamp) From 019f3c0d6c08b4ac0b396b7a826ce36046d56a17 Mon Sep 17 00:00:00 2001 From: Leena Miettinen Date: Mon, 28 May 2018 12:46:44 +0200 Subject: [PATCH 06/52] Doc: Describe new filters in Issues pane ... for Clang Code Model and Python. Change-Id: I4a1844137874c5c2c4bd3f0348879cf4c40ceda0 Reviewed-by: Friedemann Kleint Reviewed-by: Cristian Maureira-Fredes Reviewed-by: Nikolai Kosjar --- doc/images/qtcreator-build-issues.png | Bin 17974 -> 5262 bytes doc/src/howto/creator-ui.qdoc | 6 ++++++ 2 files changed, 6 insertions(+) diff --git a/doc/images/qtcreator-build-issues.png b/doc/images/qtcreator-build-issues.png index 9404a88523a87277134bd7bc83acfa59c754fde7..230572237e91df4b3ecb3dc7fdad49096c5e3f25 100644 GIT binary patch literal 5262 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 diff --git a/doc/src/howto/creator-ui.qdoc b/doc/src/howto/creator-ui.qdoc index 15152256094..f436ae54eb7 100644 --- a/doc/src/howto/creator-ui.qdoc +++ b/doc/src/howto/creator-ui.qdoc @@ -403,6 +403,10 @@ \li \uicontrol {Build System} - Errors and warnings encountered during a build. + \li \uicontrol {Clang Code Model} - + \l {Parsing C++ Files with the Clang Code Model} + {Errors and warnings from the current editor}. + \li \uicontrol Compile - Selected output from the compiler. Open the \uicontrol {Compile Output} pane for more detailed information. @@ -422,6 +426,8 @@ by \l{Showing Task List Files in Issues Pane} {code scanning and analysis tools}. + \li \uicontrol Python - Runtime errors and exceptions of Python scripts. + \li \uicontrol QML - Errors in QML syntax. \li \uicontrol {QML Analysis} - Results of the JavaScript From a741b7300f1a3da8fd9b47fad64654669095b203 Mon Sep 17 00:00:00 2001 From: Nikolai Kosjar Date: Tue, 29 May 2018 08:43:14 +0200 Subject: [PATCH 07/52] Clang: Avoid diagnostics about unknown qdoc commands Task-number: QTCREATORBUG-20512 Change-Id: Icbdcf7871738c9900544516467154ef73c595e1b Reviewed-by: Ivan Donchevskii --- src/plugins/cpptools/clangdiagnosticconfigsmodel.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/plugins/cpptools/clangdiagnosticconfigsmodel.cpp b/src/plugins/cpptools/clangdiagnosticconfigsmodel.cpp index e1f65df4bee..ade2ab66269 100644 --- a/src/plugins/cpptools/clangdiagnosticconfigsmodel.cpp +++ b/src/plugins/cpptools/clangdiagnosticconfigsmodel.cpp @@ -170,7 +170,10 @@ QStringList ClangDiagnosticConfigsModel::globalDiagnosticOptions() return { // Avoid undesired warnings from e.g. Q_OBJECT QStringLiteral("-Wno-unknown-pragmas"), - QStringLiteral("-Wno-unknown-warning-option") + QStringLiteral("-Wno-unknown-warning-option"), + + // qdoc commands + QStringLiteral("-Wno-documentation-unknown-command") }; } From c908a52628e0f4abae258fd2aaa8bc92bcc59008 Mon Sep 17 00:00:00 2001 From: Robert Loehning Date: Tue, 29 May 2018 12:26:56 +0200 Subject: [PATCH 08/52] Squish: Update to re-uploaded text This should not expire after another year. Change-Id: I86ed49d491f619509e6bd32fc2624df2a1c24f5f Reviewed-by: Christian Stenger --- tests/system/suite_tools/tst_codepasting/test.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/system/suite_tools/tst_codepasting/test.py b/tests/system/suite_tools/tst_codepasting/test.py index ed9c405220b..023d7853127 100644 --- a/tests/system/suite_tools/tst_codepasting/test.py +++ b/tests/system/suite_tools/tst_codepasting/test.py @@ -155,7 +155,7 @@ def main(): skippedPasting = True description = "Paste from 2017-05-11" if protocol == NAME_KDE: - pasteId = "pyy2xvjh7" # valid for one year + pasteId = "pysjk6n2i" pastedText = readFile(os.path.join(os.getcwd(), "testdata", "main-prepasted.cpp")) elif skipPastingToPastebinCom and protocol == NAME_PBCOM: pasteId = "8XHP0ZgH" @@ -186,7 +186,7 @@ def main(): clickButton(waitForObject(":*Qt Creator.Clear_QToolButton")) continue test.compare(filenameCombo.currentText, "%s: %s" % (protocol, pasteId), "Verify title of editor") - if protocol == NAME_PBCOM and pastedText.endswith("\n"): + if protocol in (NAME_KDE, NAME_PBCOM) and pastedText.endswith("\n"): pastedText = pastedText[:-1] test.compare(editor.plainText, pastedText, "Verify that pasted and fetched texts are the same") invokeMenuItem("File", "Close All") From 6b9ff15ad5b0e1082dae2e6819b75448e08a6d60 Mon Sep 17 00:00:00 2001 From: Ulf Hermann Date: Mon, 28 May 2018 16:21:03 +0200 Subject: [PATCH 09/52] QmlProfiler: Move action registration out of QmlProfilerTool This enables us to have multiple QmlProfilerTool instances without conflicting action registrations. Ultimately there should be a way to unregister actions, or to add some extra description on which tool instance they refer to, but this is a minimal first step. The main problem this fixes for now is the warnings generated by the tests. Change-Id: I2193fc48a5a68c52f46e5567919f3035bc93df36 Reviewed-by: Tobias Hunger --- src/plugins/qmlprofiler/qmlprofiler.pro | 2 + src/plugins/qmlprofiler/qmlprofiler.qbs | 1 + .../qmlprofiler/qmlprofileractions.cpp | 113 ++++++++++++++++++ src/plugins/qmlprofiler/qmlprofileractions.h | 57 +++++++++ .../qmlprofiler/qmlprofilermodelmanager.cpp | 7 ++ .../qmlprofiler/qmlprofilermodelmanager.h | 3 + src/plugins/qmlprofiler/qmlprofilerplugin.cpp | 4 + src/plugins/qmlprofiler/qmlprofilertool.cpp | 81 ++++--------- src/plugins/qmlprofiler/qmlprofilertool.h | 12 +- 9 files changed, 216 insertions(+), 64 deletions(-) create mode 100644 src/plugins/qmlprofiler/qmlprofileractions.cpp create mode 100644 src/plugins/qmlprofiler/qmlprofileractions.h diff --git a/src/plugins/qmlprofiler/qmlprofiler.pro b/src/plugins/qmlprofiler/qmlprofiler.pro index a1edff0e2c2..884a63e24dd 100644 --- a/src/plugins/qmlprofiler/qmlprofiler.pro +++ b/src/plugins/qmlprofiler/qmlprofiler.pro @@ -15,6 +15,7 @@ SOURCES += \ qmleventlocation.cpp \ qmleventtype.cpp \ qmlnote.cpp \ + qmlprofileractions.cpp \ qmlprofileranimationsmodel.cpp \ qmlprofilerattachdialog.cpp \ qmlprofilerbindingloopsrenderpass.cpp \ @@ -55,6 +56,7 @@ HEADERS += \ qmleventtype.h \ qmlnote.h \ qmlprofiler_global.h \ + qmlprofileractions.h \ qmlprofileranimationsmodel.h \ qmlprofilerattachdialog.h \ qmlprofilerbindingloopsrenderpass.h \ diff --git a/src/plugins/qmlprofiler/qmlprofiler.qbs b/src/plugins/qmlprofiler/qmlprofiler.qbs index 74a2c7f8517..a3f0146319c 100644 --- a/src/plugins/qmlprofiler/qmlprofiler.qbs +++ b/src/plugins/qmlprofiler/qmlprofiler.qbs @@ -31,6 +31,7 @@ QtcPlugin { "qmleventtype.cpp", "qmleventtype.h", "qmlnote.cpp", "qmlnote.h", "qmlprofiler_global.h", + "qmlprofileractions.h", "qmlprofileractions.cpp" "qmlprofileranimationsmodel.h", "qmlprofileranimationsmodel.cpp", "qmlprofilerattachdialog.cpp", "qmlprofilerattachdialog.h", "qmlprofilerbindingloopsrenderpass.cpp","qmlprofilerbindingloopsrenderpass.h", diff --git a/src/plugins/qmlprofiler/qmlprofileractions.cpp b/src/plugins/qmlprofiler/qmlprofileractions.cpp new file mode 100644 index 00000000000..3fd754a4eb0 --- /dev/null +++ b/src/plugins/qmlprofiler/qmlprofileractions.cpp @@ -0,0 +1,113 @@ +/**************************************************************************** +** +** Copyright (C) 2018 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of Qt Creator. +** +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 as published by the Free Software +** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +****************************************************************************/ + +#include "qmlprofileractions.h" +#include "qmlprofilerconstants.h" +#include "qmlprofilertool.h" +#include "qmlprofilerstatemanager.h" +#include "qmlprofilermodelmanager.h" + +#include + +#include +#include + +#include + +namespace QmlProfiler { +namespace Internal { + +using namespace Core; +using namespace Debugger::Constants; + +QmlProfilerActions::QmlProfilerActions(QObject *parent) : QObject(parent) +{} + +void QmlProfilerActions::attachToTool(QmlProfilerTool *tool) +{ + const QString description = tr("The QML Profiler can be used to find performance " + "bottlenecks in applications using QML."); + + m_runAction = std::make_unique(tr("QML Profiler")); + m_runAction->setToolTip(description); + QObject::connect(m_runAction.get(), &QAction::triggered, + tool, &QmlProfilerTool::profileStartupProject); + + QAction *toolStartAction = tool->startAction(); + QObject::connect(toolStartAction, &QAction::changed, this, [this, toolStartAction] { + m_runAction->setEnabled(toolStartAction->isEnabled()); + }); + + m_attachAction = std::make_unique(tr("QML Profiler (Attach to Waiting Application)")); + m_attachAction->setToolTip(description); + QObject::connect(m_attachAction.get(), &QAction::triggered, + tool, &QmlProfilerTool::attachToWaitingApplication); + + m_loadQmlTrace = std::make_unique(tr("Load QML Trace")); + connect(m_loadQmlTrace.get(), &QAction::triggered, + tool, &QmlProfilerTool::showLoadDialog, Qt::QueuedConnection); + + m_saveQmlTrace = std::make_unique(tr("Save QML Trace")); + connect(m_saveQmlTrace.get(), &QAction::triggered, + tool, &QmlProfilerTool::showSaveDialog, Qt::QueuedConnection); + + QmlProfilerStateManager *stateManager = tool->stateManager(); + connect(stateManager, &QmlProfilerStateManager::serverRecordingChanged, + this, [this, stateManager](bool recording) { + m_loadQmlTrace->setEnabled(!recording); + }); + m_loadQmlTrace->setEnabled(!stateManager->serverRecording()); + + QmlProfilerModelManager *modelManager = tool->modelManager(); + connect(modelManager, &QmlProfilerModelManager::traceChanged, + this, [this, modelManager] { + m_saveQmlTrace->setEnabled(!modelManager->isEmpty()); + }); + m_saveQmlTrace->setEnabled(!modelManager->isEmpty()); +} + +void QmlProfilerActions::registerActions() +{ + m_options.reset(ActionManager::createMenu("Analyzer.Menu.QMLOptions")); + m_options->menu()->setTitle(tr("QML Profiler Options")); + m_options->menu()->setEnabled(true); + ActionContainer *menu = ActionManager::actionContainer(M_DEBUG_ANALYZER); + + menu->addAction(ActionManager::registerAction(m_runAction.get(), + "QmlProfiler.Internal"), + Debugger::Constants::G_ANALYZER_TOOLS); + menu->addAction(ActionManager::registerAction(m_attachAction.get(), + "QmlProfiler.AttachToWaitingApplication"), + Debugger::Constants::G_ANALYZER_REMOTE_TOOLS); + + menu->addMenu(m_options.get(), G_ANALYZER_OPTIONS); + m_options->addAction(ActionManager::registerAction(m_loadQmlTrace.get(), + Constants::QmlProfilerLoadActionId)); + m_options->addAction(ActionManager::registerAction(m_saveQmlTrace.get(), + Constants::QmlProfilerSaveActionId)); +} + +} // namespace Internal +} // namespace QmlProfiler diff --git a/src/plugins/qmlprofiler/qmlprofileractions.h b/src/plugins/qmlprofiler/qmlprofileractions.h new file mode 100644 index 00000000000..2a0b80eea35 --- /dev/null +++ b/src/plugins/qmlprofiler/qmlprofileractions.h @@ -0,0 +1,57 @@ +/**************************************************************************** +** +** Copyright (C) 2018 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of Qt Creator. +** +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 as published by the Free Software +** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +****************************************************************************/ + +#pragma once + +#include + +#include +#include + +#include + +namespace QmlProfiler { +namespace Internal { + +class QmlProfilerTool; +class QmlProfilerActions : public QObject +{ + Q_OBJECT +public: + explicit QmlProfilerActions(QObject *parent = nullptr); + + void attachToTool(QmlProfilerTool *tool); + void registerActions(); + +private: + std::unique_ptr m_options; + std::unique_ptr m_loadQmlTrace; + std::unique_ptr m_saveQmlTrace; + std::unique_ptr m_runAction; + std::unique_ptr m_attachAction; +}; + +} // namespace Internal +} // namespace QmlProfiler diff --git a/src/plugins/qmlprofiler/qmlprofilermodelmanager.cpp b/src/plugins/qmlprofiler/qmlprofilermodelmanager.cpp index 033a4b48332..824ac1540cd 100644 --- a/src/plugins/qmlprofiler/qmlprofilermodelmanager.cpp +++ b/src/plugins/qmlprofiler/qmlprofilermodelmanager.cpp @@ -202,6 +202,12 @@ void QmlProfilerModelManager::replayQmlEvents(QmlEventLoader loader, } } +void QmlProfilerModelManager::clearEventStorage() +{ + TimelineTraceManager::clearEventStorage(); + emit traceChanged(); +} + static QString getDisplayName(const QmlEventType &event) { if (event.location().filename().isEmpty()) { @@ -255,6 +261,7 @@ void QmlProfilerModelManager::finalize() // which happens on stateChanged(Done). TimelineTraceManager::finalize(); + emit traceChanged(); } void QmlProfilerModelManager::populateFileFinder(const ProjectExplorer::Target *target) diff --git a/src/plugins/qmlprofiler/qmlprofilermodelmanager.h b/src/plugins/qmlprofiler/qmlprofilermodelmanager.h index a14c37042ce..42a135916d7 100644 --- a/src/plugins/qmlprofiler/qmlprofilermodelmanager.h +++ b/src/plugins/qmlprofiler/qmlprofilermodelmanager.h @@ -83,6 +83,7 @@ public: QmlEventFilter rangeFilter(qint64 start, qint64 end) const; signals: + void traceChanged(); void typeDetailsChanged(int typeId); void typeDetailsFinished(); @@ -90,6 +91,8 @@ private: void detailsChanged(int typeId, const QString &newString); void restrictByFilter(QmlEventFilter filter); + void clearEventStorage() final; + Timeline::TimelineTraceFile *createTraceFile() override; void replayEvents(TraceEventLoader loader, Initializer initializer, Finalizer finalizer, ErrorHandler errorHandler, QFutureInterface &future) const override; diff --git a/src/plugins/qmlprofiler/qmlprofilerplugin.cpp b/src/plugins/qmlprofiler/qmlprofilerplugin.cpp index 25954d23a3b..62dcdc9f6b6 100644 --- a/src/plugins/qmlprofiler/qmlprofilerplugin.cpp +++ b/src/plugins/qmlprofiler/qmlprofilerplugin.cpp @@ -30,6 +30,7 @@ #include "qmlprofilersettings.h" #include "qmlprofilertool.h" #include "qmlprofilertimelinemodel.h" +#include "qmlprofileractions.h" #ifdef WITH_TESTS @@ -84,6 +85,7 @@ class QmlProfilerPluginPrivate public: QmlProfilerTool m_profilerTool; QmlProfilerOptionsPage m_profilerOptionsPage; + QmlProfilerActions m_actions; }; bool QmlProfilerPlugin::initialize(const QStringList &arguments, QString *errorString) @@ -99,6 +101,8 @@ bool QmlProfilerPlugin::initialize(const QStringList &arguments, QString *errorS void QmlProfilerPlugin::extensionsInitialized() { d = new QmlProfilerPluginPrivate; + d->m_actions.attachToTool(&d->m_profilerTool); + d->m_actions.registerActions(); RunConfiguration::registerAspect(); diff --git a/src/plugins/qmlprofiler/qmlprofilertool.cpp b/src/plugins/qmlprofiler/qmlprofilertool.cpp index 750eabc9f36..b00379d24d9 100644 --- a/src/plugins/qmlprofiler/qmlprofilertool.cpp +++ b/src/plugins/qmlprofiler/qmlprofilertool.cpp @@ -57,6 +57,8 @@ #include #include +#include +#include #include #include #include @@ -66,9 +68,6 @@ #include #include #include -#include -#include -#include #include @@ -117,10 +116,6 @@ public: QToolButton *m_displayFeaturesButton = nullptr; QMenu *m_displayFeaturesMenu = nullptr; - // save and load actions - QAction *m_saveQmlTrace = nullptr; - QAction *m_loadQmlTrace = nullptr; - // elapsed time display QLabel *m_timeLabel = nullptr; QTimer m_recordingTimer; @@ -163,24 +158,6 @@ QmlProfilerTool::QmlProfilerTool() this, &QmlProfilerTool::onLoadSaveFinished); d->m_profilerConnections->setModelManager(d->m_profilerModelManager); - Command *command = nullptr; - - ActionContainer *menu = ActionManager::actionContainer(M_DEBUG_ANALYZER); - ActionContainer *options = ActionManager::createMenu("Analyzer.Menu.QMLOptions"); - options->menu()->setTitle(tr("QML Profiler Options")); - menu->addMenu(options, G_ANALYZER_OPTIONS); - options->menu()->setEnabled(true); - - QAction *act = d->m_loadQmlTrace = new QAction(tr("Load QML Trace"), options); - command = ActionManager::registerAction(act, Constants::QmlProfilerLoadActionId); - connect(act, &QAction::triggered, this, &QmlProfilerTool::showLoadDialog, Qt::QueuedConnection); - options->addAction(command); - - act = d->m_saveQmlTrace = new QAction(tr("Save QML Trace"), options); - d->m_saveQmlTrace->setEnabled(false); - command = ActionManager::registerAction(act, Constants::QmlProfilerSaveActionId); - connect(act, &QAction::triggered, this, &QmlProfilerTool::showSaveDialog, Qt::QueuedConnection); - options->addAction(command); d->m_recordingTimer.setInterval(100); connect(&d->m_recordingTimer, &QTimer::timeout, this, &QmlProfilerTool::updateTimeDisplay); @@ -246,32 +223,10 @@ QmlProfilerTool::QmlProfilerTool() // is available, then we can populate the file finder d->m_profilerModelManager->populateFileFinder(); - QString description = tr("The QML Profiler can be used to find performance " - "bottlenecks in applications using QML."); - d->m_startAction = Debugger::createStartAction(); d->m_stopAction = Debugger::createStopAction(); - act = new QAction(tr("QML Profiler"), this); - act->setToolTip(description); - menu->addAction(ActionManager::registerAction(act, "QmlProfiler.Internal"), - Debugger::Constants::G_ANALYZER_TOOLS); - QObject::connect(act, &QAction::triggered, this, [this] { - if (!prepareTool()) - return; - Debugger::selectPerspective(Constants::QmlProfilerPerspectiveId); - ProjectExplorerPlugin::runStartupProject(ProjectExplorer::Constants::QML_PROFILER_RUN_MODE); - }); - QObject::connect(d->m_startAction, &QAction::triggered, act, &QAction::triggered); - QObject::connect(d->m_startAction, &QAction::changed, act, [act, this] { - act->setEnabled(d->m_startAction->isEnabled()); - }); - - act = new QAction(tr("QML Profiler (Attach to Waiting Application)"), this); - act->setToolTip(description); - menu->addAction(ActionManager::registerAction(act, "QmlProfiler.AttachToWaitingApplication"), - Debugger::Constants::G_ANALYZER_REMOTE_TOOLS); - QObject::connect(act, &QAction::triggered, this, &QmlProfilerTool::attachToWaitingApplication); + QObject::connect(d->m_startAction, &QAction::triggered, this, &QmlProfilerTool::profileStartupProject); Utils::ToolbarDescription toolbar; toolbar.addAction(d->m_startAction); @@ -618,16 +573,6 @@ void QmlProfilerTool::showErrorDialog(const QString &error) errorDialog->show(); } -void QmlProfilerTool::showLoadOption() -{ - d->m_loadQmlTrace->setEnabled(!d->m_profilerState->serverRecording()); -} - -void QmlProfilerTool::showSaveOption() -{ - d->m_saveQmlTrace->setEnabled(!d->m_profilerModelManager->isEmpty()); -} - void saveLastTraceFile(const QString &filename) { QmlProfilerSettings *settings = QmlProfilerPlugin::globalSettings(); @@ -681,6 +626,24 @@ void QmlProfilerTool::showLoadDialog() } } +void QmlProfilerTool::profileStartupProject() +{ + if (!prepareTool()) + return; + Debugger::selectPerspective(Constants::QmlProfilerPerspectiveId); + ProjectExplorerPlugin::runStartupProject(ProjectExplorer::Constants::QML_PROFILER_RUN_MODE); +} + +QAction *QmlProfilerTool::startAction() const +{ + return d->m_startAction; +} + +QAction *QmlProfilerTool::stopAction() const +{ + return d->m_stopAction; +} + void QmlProfilerTool::onLoadSaveFinished() { disconnect(d->m_profilerModelManager, &QmlProfilerModelManager::recordedFeaturesChanged, @@ -793,7 +756,6 @@ void QmlProfilerTool::initialize() void QmlProfilerTool::finalize() { - showSaveOption(); updateTimeDisplay(); createTextMarks(); setButtonsEnabled(true); @@ -878,7 +840,6 @@ void QmlProfilerTool::profilerStateChanged() void QmlProfilerTool::serverRecordingChanged() { - showLoadOption(); if (d->m_profilerState->currentState() == QmlProfilerStateManager::AppRunning) { // clear the old data each time we start a new profiling session if (d->m_profilerState->serverRecording()) { diff --git a/src/plugins/qmlprofiler/qmlprofilertool.h b/src/plugins/qmlprofiler/qmlprofilertool.h index 721184a1f27..4e6984f65e7 100644 --- a/src/plugins/qmlprofiler/qmlprofilertool.h +++ b/src/plugins/qmlprofiler/qmlprofilertool.h @@ -77,6 +77,14 @@ public: void gotoSourceLocation(const QString &fileUrl, int lineNumber, int columnNumber); + void showSaveDialog(); + void showLoadDialog(); + + void profileStartupProject(); + + QAction *startAction() const; + QAction *stopAction() const; + private: void clearEvents(); void clearData(); @@ -85,10 +93,6 @@ private: void updateTimeDisplay(); void showTimeLineSearch(); - void showSaveOption(); - void showLoadOption(); - void showSaveDialog(); - void showLoadDialog(); void onLoadSaveFinished(); void toggleRequestedFeature(QAction *action); From c6f12991b06c7a5d34c14252ce200f8c4c1b5dc5 Mon Sep 17 00:00:00 2001 From: Nikolai Kosjar Date: Tue, 29 May 2018 12:30:59 +0200 Subject: [PATCH 10/52] ClangTools: Avoid freezing UI for many items ...if new items are added to the model or if filter is used. When items were added, we have called ClangToolsDiagnosticModel::diagnostics() two times: * from DiagnosticFilterModel::filterAcceptsRow() * from ClangTidyClazyTool::handleStateUpdate() However, this does not scale since diagnostics() creates a temporary. Fix this by accessing the diagnostics or the count directly from the tree. Change-Id: I4c6a32e0076c1b4228ed1b1ff9222c9918f92c5c Reviewed-by: Ivan Donchevskii --- src/plugins/clangtools/clangtidyclazytool.cpp | 2 +- src/plugins/clangtools/clangtoolsdiagnosticmodel.cpp | 10 ++++++++-- src/plugins/clangtools/clangtoolsdiagnosticmodel.h | 4 +++- 3 files changed, 12 insertions(+), 4 deletions(-) diff --git a/src/plugins/clangtools/clangtidyclazytool.cpp b/src/plugins/clangtools/clangtidyclazytool.cpp index cf4a4ea5a46..575cd68dc5b 100644 --- a/src/plugins/clangtools/clangtidyclazytool.cpp +++ b/src/plugins/clangtools/clangtidyclazytool.cpp @@ -395,7 +395,7 @@ void ClangTidyClazyTool::handleStateUpdate() QTC_ASSERT(m_diagnosticModel, return); QTC_ASSERT(m_diagnosticFilterModel, return); - const int issuesFound = m_diagnosticModel->diagnostics().count(); + const int issuesFound = m_diagnosticModel->diagnosticsCount(); const int issuesVisible = m_diagnosticFilterModel->rowCount(); m_goBack->setEnabled(issuesVisible > 1); m_goNext->setEnabled(issuesVisible > 1); diff --git a/src/plugins/clangtools/clangtoolsdiagnosticmodel.cpp b/src/plugins/clangtools/clangtoolsdiagnosticmodel.cpp index db7ab4e14a2..690f48e584d 100644 --- a/src/plugins/clangtools/clangtoolsdiagnosticmodel.cpp +++ b/src/plugins/clangtools/clangtoolsdiagnosticmodel.cpp @@ -80,6 +80,11 @@ QList ClangToolsDiagnosticModel::diagnostics() const return diags; } +int ClangToolsDiagnosticModel::diagnosticsCount() const +{ + return rootItem()->childCount(); +} + static QString createDiagnosticToolTipString(const Diagnostic &diagnostic) { typedef QPair StringPair; @@ -431,8 +436,9 @@ bool DiagnosticFilterModel::filterAcceptsRow(int sourceRow, return true; // Is the diagnostic suppressed? - const Diagnostic diag = static_cast(sourceModel()) - ->diagnostics().at(sourceRow); + auto model = static_cast(sourceModel()); + auto item = static_cast(model->rootItem()->childAt(sourceRow)); + const Diagnostic &diag = item->diagnostic(); foreach (const SuppressedDiagnostic &d, m_suppressedDiagnostics) { if (d.description != diag.description) continue; diff --git a/src/plugins/clangtools/clangtoolsdiagnosticmodel.h b/src/plugins/clangtools/clangtoolsdiagnosticmodel.h index 4c6a7e191c2..6ced6bfe22d 100644 --- a/src/plugins/clangtools/clangtoolsdiagnosticmodel.h +++ b/src/plugins/clangtools/clangtoolsdiagnosticmodel.h @@ -59,7 +59,7 @@ public: DiagnosticItem(const Diagnostic &diag, const OnFixitStatusChanged &onFixitStatusChanged); ~DiagnosticItem() override; - Diagnostic diagnostic() const { return m_diagnostic; } + const Diagnostic &diagnostic() const { return m_diagnostic; } FixitStatus fixItStatus() const { return m_fixitStatus; } void setFixItStatus(const FixitStatus &status); @@ -90,6 +90,8 @@ public: virtual void addDiagnostics(const QList &diagnostics); virtual QList diagnostics() const; + int diagnosticsCount() const; + enum ItemRole { DiagnosticRole = Debugger::DetailedErrorView::FullTextRole + 1 }; From a5ec1097a0e1fe8c18a18ebe6f891329e276d81c Mon Sep 17 00:00:00 2001 From: Ulf Hermann Date: Fri, 25 May 2018 17:09:46 +0200 Subject: [PATCH 11/52] Debugger: Support nested properties in QML inspector There are various ways to generate nested arrays and objects in the QML engine debug service. We can easily show them. Task-number: QTBUG-68474 Change-Id: I3511a3f6f7631de4ab6a9d4b13ba9392ba4173dc Reviewed-by: hjk --- .../debugger/qml/qmlinspectoragent.cpp | 56 ++++++++++++++++--- 1 file changed, 49 insertions(+), 7 deletions(-) diff --git a/src/plugins/debugger/qml/qmlinspectoragent.cpp b/src/plugins/debugger/qml/qmlinspectoragent.cpp index 0f2d35c78a6..72f224db512 100644 --- a/src/plugins/debugger/qml/qmlinspectoragent.cpp +++ b/src/plugins/debugger/qml/qmlinspectoragent.cpp @@ -381,6 +381,51 @@ void QmlInspectorAgent::newObject(int engineId, int /*objectId*/, int /*parentId m_delayQueryTimer.start(); } +static void sortChildrenIfNecessary(WatchItem *propertiesWatch) +{ + if (boolSetting(SortStructMembers)) { + propertiesWatch->sortChildren([](const WatchItem *item1, const WatchItem *item2) { + return item1->name < item2->name; + }); + } +} + +static bool insertChildren(WatchItem *parent, const QVariant &value) +{ + switch (value.type()) { + case QVariant::Map: { + const QVariantMap map = value.toMap(); + for (auto it = map.begin(), end = map.end(); it != end; ++it) { + WatchItem *child = new WatchItem; + child->name = it.key(); + child->value = it.value().toString(); + child->type = QLatin1String(it.value().typeName()); + child->valueEditable = false; + child->wantsChildren = insertChildren(child, it.value()); + parent->appendChild(child); + } + sortChildrenIfNecessary(parent); + return true; + } + case QVariant::List: { + const QVariantList list = value.toList(); + for (int i = 0, end = list.size(); i != end; ++i) { + WatchItem *child = new WatchItem; + const QVariant &value = list.at(i); + child->arrayIndex = i; + child->value = value.toString(); + child->type = QLatin1String(value.typeName()); + child->valueEditable = false; + child->wantsChildren = insertChildren(child, value); + parent->appendChild(child); + } + return true; + } + default: + return false; + } +} + void QmlInspectorAgent::onValueChanged(int debugId, const QByteArray &propertyName, const QVariant &value) { @@ -392,6 +437,8 @@ void QmlInspectorAgent::onValueChanged(int debugId, const QByteArray &propertyNa << value.toString(); if (WatchItem *item = watchHandler->findItem(iname)) { item->value = value.toString(); + item->removeChildren(); + item->wantsChildren = insertChildren(item, value); item->update(); } } @@ -658,16 +705,11 @@ void QmlInspectorAgent::addWatchData(const ObjectReference &obj, propertyWatch->exp = propertyName; propertyWatch->type = property.valueTypeName(); propertyWatch->value = property.value().toString(); - propertyWatch->wantsChildren = false; + propertyWatch->wantsChildren = insertChildren(propertyWatch, property.value()); propertiesWatch->appendChild(propertyWatch); } - if (boolSetting(SortStructMembers)) { - propertiesWatch->sortChildren([](const WatchItem *item1, const WatchItem *item2) { - return item1->name < item2->name; - }); - } - + sortChildrenIfNecessary(propertiesWatch); m_qmlEngine->watchHandler()->insertItem(propertiesWatch); } From 8960075b426c3b9f167b8679039fe9aaeec149aa Mon Sep 17 00:00:00 2001 From: Nikolai Kosjar Date: Tue, 29 May 2018 15:10:56 +0200 Subject: [PATCH 12/52] QmlProfiler: Fix comma in qbs file Change-Id: I7ac4abf4b9a764c0d9ff2b7c3a8db299e92a2f7c Reviewed-by: Ulf Hermann --- src/plugins/qmlprofiler/qmlprofiler.qbs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/qmlprofiler/qmlprofiler.qbs b/src/plugins/qmlprofiler/qmlprofiler.qbs index a3f0146319c..44103450c11 100644 --- a/src/plugins/qmlprofiler/qmlprofiler.qbs +++ b/src/plugins/qmlprofiler/qmlprofiler.qbs @@ -31,7 +31,7 @@ QtcPlugin { "qmleventtype.cpp", "qmleventtype.h", "qmlnote.cpp", "qmlnote.h", "qmlprofiler_global.h", - "qmlprofileractions.h", "qmlprofileractions.cpp" + "qmlprofileractions.h", "qmlprofileractions.cpp", "qmlprofileranimationsmodel.h", "qmlprofileranimationsmodel.cpp", "qmlprofilerattachdialog.cpp", "qmlprofilerattachdialog.h", "qmlprofilerbindingloopsrenderpass.cpp","qmlprofilerbindingloopsrenderpass.h", From a5f83fb66eb10d20f47a56da74c67bd7b3dda8df Mon Sep 17 00:00:00 2001 From: Ulf Hermann Date: Mon, 28 May 2018 18:22:54 +0200 Subject: [PATCH 13/52] QmlProfiler: Suppress debug message in test The application is expected to fail after the transition to "Starting" there. Change-Id: I61e69df73ca9db82b9649727b69800927b1c16c5 Reviewed-by: Christian Kandeler --- src/plugins/qmlprofiler/tests/localqmlprofilerrunner_test.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/plugins/qmlprofiler/tests/localqmlprofilerrunner_test.cpp b/src/plugins/qmlprofiler/tests/localqmlprofilerrunner_test.cpp index 2181dfbd338..a4721bf4500 100644 --- a/src/plugins/qmlprofiler/tests/localqmlprofilerrunner_test.cpp +++ b/src/plugins/qmlprofiler/tests/localqmlprofilerrunner_test.cpp @@ -96,6 +96,9 @@ void LocalQmlProfilerRunnerTest::testRunner() connectRunner(); + QTest::ignoreMessage( + QtDebugMsg, "Invalid run control state transition from " + "\"RunControlState::Starting\" to \"RunControlState::Stopped\""); runControl->initiateStart(); QTRY_COMPARE_WITH_TIMEOUT(startCount, 1, 30000); From ac0db4dc3b595994f60a3026a00ec0b2f33395dc Mon Sep 17 00:00:00 2001 From: Alessandro Portale Date: Tue, 29 May 2018 13:27:19 +0200 Subject: [PATCH 14/52] Core: Fix icon size calculation in the mode bar (Icon + text mode) This amends 768f0a6209392e3d6ce248c5b92c12d2fe711976 . The order of setting a painter font and using the fontmetrics of the painter font got swapped, and therefore the size calculations were done with a wrong font. Task-number: QTCREATORBUG-20404 Change-Id: I98d1fbbbf467ded1dc0288784036595976b46e10 Reviewed-by: Eike Ziller --- src/plugins/coreplugin/fancytabwidget.cpp | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/plugins/coreplugin/fancytabwidget.cpp b/src/plugins/coreplugin/fancytabwidget.cpp index 0bd3920ed6a..a9050029217 100644 --- a/src/plugins/coreplugin/fancytabwidget.cpp +++ b/src/plugins/coreplugin/fancytabwidget.cpp @@ -293,6 +293,11 @@ static void paintIconAndText(QPainter *painter, const QRect &rect, const QIcon &icon, const QString &text, bool enabled, bool selected) { + QFont boldFont(painter->font()); + boldFont.setPointSizeF(StyleHelper::sidebarFontSize()); + boldFont.setBold(true); + painter->setFont(boldFont); + const bool drawIcon = rect.height() > 36; if (drawIcon) { const int textHeight = @@ -322,10 +327,6 @@ static void paintIconAndText(QPainter *painter, const QRect &rect, painter->translate(0, -1); QRect tabTextRect(rect); tabTextRect.translate(0, drawIcon ? -2 : 1); - QFont boldFont(painter->font()); - boldFont.setPointSizeF(StyleHelper::sidebarFontSize()); - boldFont.setBold(true); - painter->setFont(boldFont); const int textFlags = Qt::AlignCenter | (drawIcon ? Qt::AlignBottom : Qt::AlignVCenter) | Qt::TextWordWrap; painter->drawText(tabTextRect, textFlags, text); From fe09fc239c7a12b5bb7f929ec6ed24b6aab89669 Mon Sep 17 00:00:00 2001 From: Leena Miettinen Date: Fri, 25 May 2018 15:07:51 +0200 Subject: [PATCH 15/52] Doc: Add :sor[t][!] to the list of FakeVim CLI commands Change-Id: Ibe0b9724cdb242c869cdef662cc617d393cd4f4b Reviewed-by: hjk --- doc/src/editors/creator-editors.qdoc | 1 + 1 file changed, 1 insertion(+) diff --git a/doc/src/editors/creator-editors.qdoc b/doc/src/editors/creator-editors.qdoc index 1b841015b0b..21e5506f937 100644 --- a/doc/src/editors/creator-editors.qdoc +++ b/doc/src/editors/creator-editors.qdoc @@ -1268,6 +1268,7 @@ \li \c :substitute substitutes an expression in a range \li \c :'<,'>!cmd filters through an external command (for example, sorts the lines in a file with \c :%!sort) + \li \c :sor[t][!] \li \c :.!cmd inserts the standard output of an external command \li \c :read \li \c :yank, \c :delete, \c :change From 5e66f834e3a0ded8f6124f7b04aedbaf846cabd6 Mon Sep 17 00:00:00 2001 From: Ulf Hermann Date: Tue, 29 May 2018 18:04:07 +0200 Subject: [PATCH 16/52] QmlProfiler: Keep text marks when replaying events The text marks are conceptually part of the type storage, not the event storage. We need to hide them on initialize and show them again on finalize, though, so that they get updated. Task-number: QTCREATORBUG-20506 Change-Id: I5fe50110b99ea81b9a7585758a30fcad98bfcaa3 Reviewed-by: Christian Kandeler --- src/plugins/qmlprofiler/qmlprofilermodelmanager.cpp | 13 +++++++++++++ src/plugins/qmlprofiler/qmlprofilermodelmanager.h | 2 ++ src/plugins/qmlprofiler/qmlprofilertextmark.cpp | 12 ++++++++++++ src/plugins/qmlprofiler/qmlprofilertextmark.h | 3 +++ src/plugins/qmlprofiler/qmlprofilertool.cpp | 10 ++-------- src/plugins/qmlprofiler/qmlprofilertool.h | 3 +-- 6 files changed, 33 insertions(+), 10 deletions(-) diff --git a/src/plugins/qmlprofiler/qmlprofilermodelmanager.cpp b/src/plugins/qmlprofiler/qmlprofilermodelmanager.cpp index 824ac1540cd..3940710e5a8 100644 --- a/src/plugins/qmlprofiler/qmlprofilermodelmanager.cpp +++ b/src/plugins/qmlprofiler/qmlprofilermodelmanager.cpp @@ -202,12 +202,24 @@ void QmlProfilerModelManager::replayQmlEvents(QmlEventLoader loader, } } +void QmlProfilerModelManager::initialize() +{ + d->textMarkModel->hideTextMarks(); + TimelineTraceManager::initialize(); +} + void QmlProfilerModelManager::clearEventStorage() { TimelineTraceManager::clearEventStorage(); emit traceChanged(); } +void QmlProfilerModelManager::clearTypeStorage() +{ + d->textMarkModel->clear(); + TimelineTraceManager::clearTypeStorage(); +} + static QString getDisplayName(const QmlEventType &event) { if (event.location().filename().isEmpty()) { @@ -261,6 +273,7 @@ void QmlProfilerModelManager::finalize() // which happens on stateChanged(Done). TimelineTraceManager::finalize(); + d->textMarkModel->showTextMarks(); emit traceChanged(); } diff --git a/src/plugins/qmlprofiler/qmlprofilermodelmanager.h b/src/plugins/qmlprofiler/qmlprofilermodelmanager.h index 42a135916d7..6d73a08d516 100644 --- a/src/plugins/qmlprofiler/qmlprofilermodelmanager.h +++ b/src/plugins/qmlprofiler/qmlprofilermodelmanager.h @@ -66,6 +66,7 @@ public: void replayQmlEvents(QmlEventLoader loader, Initializer initializer, Finalizer finalizer, ErrorHandler errorHandler, QFutureInterface &future) const; + void initialize() override; void finalize() override; void populateFileFinder(const ProjectExplorer::Target *target = nullptr); @@ -92,6 +93,7 @@ private: void restrictByFilter(QmlEventFilter filter); void clearEventStorage() final; + void clearTypeStorage() final; Timeline::TimelineTraceFile *createTraceFile() override; void replayEvents(TraceEventLoader loader, Initializer initializer, Finalizer finalizer, diff --git a/src/plugins/qmlprofiler/qmlprofilertextmark.cpp b/src/plugins/qmlprofiler/qmlprofilertextmark.cpp index 2112bd172aa..21173734505 100644 --- a/src/plugins/qmlprofiler/qmlprofilertextmark.cpp +++ b/src/plugins/qmlprofiler/qmlprofilertextmark.cpp @@ -119,6 +119,18 @@ void QmlProfilerTextMarkModel::createMarks(QmlProfilerViewManager *viewManager, } } +void QmlProfilerTextMarkModel::showTextMarks() +{ + for (QmlProfilerTextMark *mark : qAsConst(m_marks)) + mark->setVisible(true); +} + +void QmlProfilerTextMarkModel::hideTextMarks() +{ + for (QmlProfilerTextMark *mark : qAsConst(m_marks)) + mark->setVisible(false); +} + bool QmlProfilerTextMark::addToolTipContent(QLayout *target) const { QGridLayout *layout = new QGridLayout; diff --git a/src/plugins/qmlprofiler/qmlprofilertextmark.h b/src/plugins/qmlprofiler/qmlprofilertextmark.h index 09beb9bf88a..8ed4576ea19 100644 --- a/src/plugins/qmlprofiler/qmlprofilertextmark.h +++ b/src/plugins/qmlprofiler/qmlprofilertextmark.h @@ -59,6 +59,9 @@ public: void addTextMarkId(int typeId, const QmlEventLocation &location); void createMarks(QmlProfilerViewManager *viewManager, const QString &fileName); + void showTextMarks(); + void hideTextMarks(); + private: struct TextMarkId { int typeId; diff --git a/src/plugins/qmlprofiler/qmlprofilertool.cpp b/src/plugins/qmlprofiler/qmlprofilertool.cpp index b00379d24d9..af0ae935a80 100644 --- a/src/plugins/qmlprofiler/qmlprofilertool.cpp +++ b/src/plugins/qmlprofiler/qmlprofilertool.cpp @@ -471,18 +471,13 @@ void QmlProfilerTool::setButtonsEnabled(bool enable) d->m_recordFeaturesMenu->setEnabled(enable); } -void QmlProfilerTool::createTextMarks() +void QmlProfilerTool::createInitialTextMarks() { QmlProfilerTextMarkModel *model = d->m_profilerModelManager->textMarkModel(); foreach (IDocument *document, DocumentModel::openedDocuments()) model->createMarks(d->m_viewContainer, document->filePath().toString()); } -void QmlProfilerTool::clearTextMarks() -{ - d->m_profilerModelManager->textMarkModel()->clear(); -} - bool QmlProfilerTool::prepareTool() { if (d->m_profilerState->clientRecording()) { @@ -757,14 +752,13 @@ void QmlProfilerTool::initialize() void QmlProfilerTool::finalize() { updateTimeDisplay(); - createTextMarks(); + createInitialTextMarks(); setButtonsEnabled(true); d->m_recordButton->setEnabled(true); } void QmlProfilerTool::clear() { - clearTextMarks(); clearDisplay(); setButtonsEnabled(true); d->m_recordButton->setEnabled(true); diff --git a/src/plugins/qmlprofiler/qmlprofilertool.h b/src/plugins/qmlprofiler/qmlprofilertool.h index 4e6984f65e7..c96a40587f3 100644 --- a/src/plugins/qmlprofiler/qmlprofilertool.h +++ b/src/plugins/qmlprofiler/qmlprofilertool.h @@ -105,8 +105,7 @@ private: bool checkForUnsavedNotes(); void restoreFeatureVisibility(); void setButtonsEnabled(bool enable); - void createTextMarks(); - void clearTextMarks(); + void createInitialTextMarks(); void initialize(); void finalize(); From 760a63293673271b74fdeac3d574f6113975078f Mon Sep 17 00:00:00 2001 From: David Schulz Date: Tue, 22 May 2018 13:33:27 +0200 Subject: [PATCH 17/52] Tools: Fix architecture detection for wininterrupt Previously, the detection relied on the variable CPU which is no longer set current versions of MSVC. Use newly introduced variable VSCMD_ARG_TGT_ARCH (MSVC 2017) or Platform (MSVC 2015) to detect 64bit. Change-Id: I705dbd7d3d7912c36e588a5ff399e65b4ca6f500 Reviewed-by: Christian Stenger Reviewed-by: Eike Ziller --- src/tools/wininterrupt/wininterrupt.pro | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/tools/wininterrupt/wininterrupt.pro b/src/tools/wininterrupt/wininterrupt.pro index d7ea748d2ac..5e4621cd5b3 100644 --- a/src/tools/wininterrupt/wininterrupt.pro +++ b/src/tools/wininterrupt/wininterrupt.pro @@ -25,11 +25,14 @@ build_all:!build_pass { CONFIG += release } -ENV_CPU=$$(CPU) +# Check for VSCMD_ARG_TGT_ARCH (VS 17) or Platform=X64 (VS 13, 15) +# For older versions, fall back to hacky check on LIBPATH +ENV_TARGET_ARCH=$$(VSCMD_ARG_TGT_ARCH) +isEmpty(ENV_TARGET_ARCH):ENV_TARGET_ARCH = $$(Platform) ENV_LIBPATH=$$(LIBPATH) -contains(ENV_CPU, ^AMD64$) { +contains(ENV_TARGET_ARCH, .*64$) { TARGET = win64interrupt -} else:isEmpty(ENV_CPU):contains(ENV_LIBPATH, ^.*amd64.*$) { +} else:isEmpty(ENV_TARGET_ARCH):contains(ENV_LIBPATH, ^.*amd64.*$) { TARGET = win64interrupt } else { TARGET = win32interrupt From b1ecfe5c5ddc416f6fac37d00feec3e3932d419e Mon Sep 17 00:00:00 2001 From: Nikolai Kosjar Date: Wed, 30 May 2018 09:46:20 +0200 Subject: [PATCH 18/52] Clang: Add "Outline of symbols" to implemented services in doc Change-Id: Ic1dd6f644b60c5bdcbbb2a75ca119311c5f827df Reviewed-by: Ivan Donchevskii Reviewed-by: Leena Miettinen --- doc/src/editors/creator-clang-codemodel.qdoc | 1 + 1 file changed, 1 insertion(+) diff --git a/doc/src/editors/creator-clang-codemodel.qdoc b/doc/src/editors/creator-clang-codemodel.qdoc index 001a7c8f565..92e786e518c 100644 --- a/doc/src/editors/creator-clang-codemodel.qdoc +++ b/doc/src/editors/creator-clang-codemodel.qdoc @@ -95,6 +95,7 @@ \li Diagnostics \li Clang-Tidy checks \li Clazy checks + \li Outline of symbols \li Tooltips \li Renaming of local symbols From 89c42161fa368cfd36f21c3afabec9d8312e3563 Mon Sep 17 00:00:00 2001 From: Nikolai Kosjar Date: Tue, 29 May 2018 15:53:40 +0200 Subject: [PATCH 19/52] Clang: Add "Clang Code Model" group box to code model settings page ...and move existing widgets (hints about enabled/disabled plugin, diagnostic config chooser). Change-Id: I3097fad30d5bbe578f0a822f6f5615e48c1595b1 Reviewed-by: Ivan Donchevskii --- .../cpptools/cppcodemodelsettingspage.ui | 35 ++++++++++++------- 1 file changed, 22 insertions(+), 13 deletions(-) diff --git a/src/plugins/cpptools/cppcodemodelsettingspage.ui b/src/plugins/cpptools/cppcodemodelsettingspage.ui index 4330ac268a8..fc81fc3609c 100644 --- a/src/plugins/cpptools/cppcodemodelsettingspage.ui +++ b/src/plugins/cpptools/cppcodemodelsettingspage.ui @@ -84,22 +84,31 @@ - - - <i>The Clang Code Model is enabled because the corresponding plugin is loaded.</i> + + + Clang Code Model + + + + + <i>The Clang Code Model is enabled because the corresponding plugin is loaded.</i> + + + + + + + <i>The Clang Code Model is disabled because the corresponding plugin is not loaded.</i> + + + + + + + - - - - <i>The Clang Code Model is disabled because the corresponding plugin is not loaded.</i> - - - - - - From 7a681963284b5600bfb7f81ffdebde7020f86360 Mon Sep 17 00:00:00 2001 From: Ulf Hermann Date: Wed, 30 May 2018 11:23:32 +0200 Subject: [PATCH 20/52] Tracing: Don't change visible features on clearing and replaying This used to be important for the mockup in the Timeline, but as the mockup looks just fine with all available features visible, we can drop it. As TimelineModel::clear() clears the "hidden" flag, we have to restore that one on initialize(), though. As a side effect the visibility settings are retained across profiling sessions now. Task-number: QTCREATORBUG-20503 Change-Id: I1512ab7e494ed79d20e2097d68f8494990cfecbb Reviewed-by: Christian Kandeler --- src/libs/tracing/timelinetracemanager.cpp | 2 -- .../qmlprofiler/qmlprofilertimelinemodel.cpp | 1 + src/plugins/qmlprofiler/qmlprofilertool.cpp | 13 ------------- src/plugins/qmlprofiler/qmlprofilertool.h | 1 - 4 files changed, 1 insertion(+), 16 deletions(-) diff --git a/src/libs/tracing/timelinetracemanager.cpp b/src/libs/tracing/timelinetracemanager.cpp index 61b9e6257fd..9504d7d60ad 100644 --- a/src/libs/tracing/timelinetracemanager.cpp +++ b/src/libs/tracing/timelinetracemanager.cpp @@ -357,7 +357,6 @@ void TimelineTraceManager::clearEventStorage() d->reset(); if (d->notesModel) d->notesModel->clear(); - setVisibleFeatures(0); setRecordedFeatures(0); d->eventStorage->clear(); } @@ -385,7 +384,6 @@ void TimelineTraceManager::restrictByFilter(TraceEventFilter filter) d->notesModel->stash(); d->reset(); - setVisibleFeatures(0); QFutureInterface future; replayEvents(filter(std::bind(&TimelineTraceManagerPrivate::dispatch, d, diff --git a/src/plugins/qmlprofiler/qmlprofilertimelinemodel.cpp b/src/plugins/qmlprofiler/qmlprofilertimelinemodel.cpp index 82b6ba563b8..675646ea4c5 100644 --- a/src/plugins/qmlprofiler/qmlprofilertimelinemodel.cpp +++ b/src/plugins/qmlprofiler/qmlprofilertimelinemodel.cpp @@ -105,6 +105,7 @@ QVariantMap QmlProfilerTimelineModel::locationFromTypeId(int index) const void QmlProfilerTimelineModel::initialize() { + setHidden(!(modelManager()->visibleFeatures() & (1ULL << m_mainFeature))); } void QmlProfilerTimelineModel::finalize() diff --git a/src/plugins/qmlprofiler/qmlprofilertool.cpp b/src/plugins/qmlprofiler/qmlprofilertool.cpp index af0ae935a80..94b74c1504e 100644 --- a/src/plugins/qmlprofiler/qmlprofilertool.cpp +++ b/src/plugins/qmlprofiler/qmlprofilertool.cpp @@ -662,18 +662,6 @@ bool QmlProfilerTool::checkForUnsavedNotes() QMessageBox::Yes, QMessageBox::No) == QMessageBox::Yes; } -void QmlProfilerTool::restoreFeatureVisibility() -{ - // Restore the shown/hidden state of features to what the user selected. When clearing data the - // the model manager sets its features to 0, and models get automatically shown, for the mockup. - quint64 features = 0; - foreach (const QAction *action, d->m_displayFeaturesMenu->actions()) { - if (action->isChecked()) - features |= (1ULL << action->data().toUInt()); - } - d->m_profilerModelManager->setVisibleFeatures(features); -} - void QmlProfilerTool::clientsDisconnected() { if (d->m_toolBusy) { @@ -745,7 +733,6 @@ void QmlProfilerTool::setRecordedFeatures(quint64 features) void QmlProfilerTool::initialize() { - restoreFeatureVisibility(); setButtonsEnabled(false); // Other buttons disabled } diff --git a/src/plugins/qmlprofiler/qmlprofilertool.h b/src/plugins/qmlprofiler/qmlprofilertool.h index c96a40587f3..180f1c090cf 100644 --- a/src/plugins/qmlprofiler/qmlprofilertool.h +++ b/src/plugins/qmlprofiler/qmlprofilertool.h @@ -103,7 +103,6 @@ private: template void updateFeatures(quint64 features); bool checkForUnsavedNotes(); - void restoreFeatureVisibility(); void setButtonsEnabled(bool enable); void createInitialTextMarks(); From cb70c38ca2ceb370e191fc5510c8faa59ed0007e Mon Sep 17 00:00:00 2001 From: Ulf Hermann Date: Wed, 30 May 2018 13:32:29 +0200 Subject: [PATCH 21/52] QmlProfiler: Actually update the details when rewriter tells us to Before, only the signal was sent. While we're at it, also disambiguate the method and signal names. Change-Id: Iafce9b06841d7faedfefdb0638d0fa1f60c061c1 Task-number: QTCREATORBUG-20500 Reviewed-by: Christian Kandeler --- src/plugins/qmlprofiler/qmlprofilermodelmanager.cpp | 9 +++++---- src/plugins/qmlprofiler/qmlprofilermodelmanager.h | 2 +- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/src/plugins/qmlprofiler/qmlprofilermodelmanager.cpp b/src/plugins/qmlprofiler/qmlprofilermodelmanager.cpp index 3940710e5a8..55a2cfea4b4 100644 --- a/src/plugins/qmlprofiler/qmlprofilermodelmanager.cpp +++ b/src/plugins/qmlprofiler/qmlprofilermodelmanager.cpp @@ -123,7 +123,7 @@ QmlProfilerModelManager::QmlProfilerModelManager(QObject *parent) : d->detailsRewriter = new Internal::QmlProfilerDetailsRewriter(this); connect(d->detailsRewriter, &Internal::QmlProfilerDetailsRewriter::rewriteDetailsString, - this, &QmlProfilerModelManager::typeDetailsChanged); + this, &QmlProfilerModelManager::setTypeDetails); connect(d->detailsRewriter, &Internal::QmlProfilerDetailsRewriter::eventDetailsChanged, this, &QmlProfilerModelManager::typeDetailsFinished); @@ -287,12 +287,13 @@ QString QmlProfilerModelManager::findLocalFile(const QString &remoteFile) return d->detailsRewriter->getLocalFile(remoteFile); } -void QmlProfilerModelManager::detailsChanged(int typeId, const QString &newString) +void QmlProfilerModelManager::setTypeDetails(int typeId, const QString &details) { QTC_ASSERT(typeId < numEventTypes(), return); QmlEventType type = eventType(typeId); - type.setData(newString); - setEventType(typeId, std::move(type)); + type.setData(details); + // Don't rewrite the details again, but directly push the type into the type storage. + Timeline::TimelineTraceManager::setEventType(typeId, std::move(type)); emit typeDetailsChanged(typeId); } diff --git a/src/plugins/qmlprofiler/qmlprofilermodelmanager.h b/src/plugins/qmlprofiler/qmlprofilermodelmanager.h index 6d73a08d516..3dd38c66e20 100644 --- a/src/plugins/qmlprofiler/qmlprofilermodelmanager.h +++ b/src/plugins/qmlprofiler/qmlprofilermodelmanager.h @@ -89,7 +89,7 @@ signals: void typeDetailsFinished(); private: - void detailsChanged(int typeId, const QString &newString); + void setTypeDetails(int typeId, const QString &details); void restrictByFilter(QmlEventFilter filter); void clearEventStorage() final; From 4b0a4c16600313afe209f1678579c2623b9f5fe3 Mon Sep 17 00:00:00 2001 From: Christian Stenger Date: Wed, 30 May 2018 12:41:05 +0200 Subject: [PATCH 22/52] AutoTest: Fix build key handling The build system targets no more contain the additional pipe character. This patch fixes some 'guessed config' warnings. The check for the build key can now also be done without restriction as it is unique nowadays not only for Qbs builds. Change-Id: Ic4e62d678c2188d0591c618cdcc156580b40b834 Reviewed-by: David Schulz --- src/plugins/autotest/testconfiguration.cpp | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/src/plugins/autotest/testconfiguration.cpp b/src/plugins/autotest/testconfiguration.cpp index 95e6fb73886..5217ece730c 100644 --- a/src/plugins/autotest/testconfiguration.cpp +++ b/src/plugins/autotest/testconfiguration.cpp @@ -193,15 +193,12 @@ void TestConfiguration::completeTestInformation(TestRunMode runMode) // not the best approach - but depending on the build system and whether the executables // are going to get installed or not we have to soften the condition... const QString currentExecutable = ensureExeEnding(runnable.executable); - const QString currentBST = runConfig->buildKey() + '|'; + const QString currentBST = runConfig->buildKey(); qCDebug(LOG) << " CurrentExecutable" << currentExecutable; qCDebug(LOG) << " BST of RunConfig" << currentBST; - const bool isQbs = runConfig->id().toString().startsWith("Qbs.RunConfiguration:"); // BAD! if ((localExecutable == currentExecutable) || (deployedExecutable == currentExecutable) - || (isQbs && Utils::anyOf(buildSystemTargets, [currentBST] (const QString &b) { - return b.startsWith(currentBST); - }))) { + || (buildSystemTargets.contains(currentBST))) { qCDebug(LOG) << " Using this RunConfig."; m_origRunConfig = runConfig; m_runnable = runnable; @@ -240,7 +237,7 @@ void TestConfiguration::completeTestInformation(TestRunMode runMode) } if (m_displayName.isEmpty()) // happens e.g. when guessing the TestConfiguration or error - m_displayName = (*buildSystemTargets.begin()).split('|').first(); + m_displayName = (*buildSystemTargets.begin()); } /** From aee9cde1602d8360685b0ea60bd69cce24f7e18a Mon Sep 17 00:00:00 2001 From: Ulf Hermann Date: Wed, 30 May 2018 12:49:47 +0200 Subject: [PATCH 23/52] QmlProfiler: In statistics view use source model for location lookup The sorted model's rows are not equivalent to typeIDs. Change-Id: I88868e192079f61bd1d336dac98142fd415d9a4a Task-number: QTCREATORBUG-20501 Reviewed-by: Christian Kandeler --- src/plugins/qmlprofiler/qmlprofilerstatisticsview.cpp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/plugins/qmlprofiler/qmlprofilerstatisticsview.cpp b/src/plugins/qmlprofiler/qmlprofilerstatisticsview.cpp index ffc92a37a01..91881d79d08 100644 --- a/src/plugins/qmlprofiler/qmlprofilerstatisticsview.cpp +++ b/src/plugins/qmlprofiler/qmlprofilerstatisticsview.cpp @@ -274,8 +274,14 @@ void QmlProfilerStatisticsMainView::jumpToItem(int typeIndex) { displayTypeIndex(typeIndex); + QSortFilterProxyModel *sortModel = qobject_cast(model()); + QTC_ASSERT(sortModel, return); + + QAbstractItemModel *sourceModel = sortModel->sourceModel(); + QTC_ASSERT(sourceModel, return); + // show in editor - getSourceLocation(model()->index(typeIndex, MainLocation), + getSourceLocation(sourceModel->index(typeIndex, MainLocation), [this](const QString &fileName, int line, int column) { emit gotoSourceLocation(fileName, line, column); }); From af986c40a3fe178e5379dc82d8bfb5c7e316d2e0 Mon Sep 17 00:00:00 2001 From: Ulf Hermann Date: Thu, 31 May 2018 11:14:15 +0200 Subject: [PATCH 24/52] Tracing: Fix layout of RangeDetails Only calculate the minimum width once all the children have been positioned, round up the label width, and disable elision on labels. Change-Id: Ia0ff6d5a08af2a5ceefd825fbe487a1d9969967d Task-number: QTCREATORBUG-20502 Reviewed-by: Tobias Hunger --- src/libs/tracing/qml/Detail.qml | 2 +- src/libs/tracing/qml/RangeDetails.qml | 10 ++++++---- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/src/libs/tracing/qml/Detail.qml b/src/libs/tracing/qml/Detail.qml index a1cbe86f10b..a8ba0244c85 100644 --- a/src/libs/tracing/qml/Detail.qml +++ b/src/libs/tracing/qml/Detail.qml @@ -30,6 +30,6 @@ TimelineText { property int valueWidth: 170 property int labelWidth: implicitWidth font.bold: isLabel - elide: Text.ElideRight + elide: isLabel ? Text.ElideNone : Text.ElideRight width: isLabel ? labelWidth : valueWidth } diff --git a/src/libs/tracing/qml/RangeDetails.qml b/src/libs/tracing/qml/RangeDetails.qml index 22d5811f489..ccb86a5c3ce 100644 --- a/src/libs/tracing/qml/RangeDetails.qml +++ b/src/libs/tracing/qml/RangeDetails.qml @@ -23,7 +23,7 @@ ** ****************************************************************************/ -import QtQuick 2.1 +import QtQuick 2.9 import TimelineTheme 1.0 Item { @@ -153,7 +153,9 @@ Item { spacing: innerMargin columns: 2 - property int minimumWidth: { + + property int minimumWidth: minimumInnerWidth + onPositioningComplete: { // max(width of longest label * 2, minimumInnerWidth) var result = minimumInnerWidth; for (var i = 0; i < children.length; ++i) { @@ -161,10 +163,10 @@ Item { result = Math.max(children[i].implicitWidth * 2 + innerMargin, result); } - return result + 2 * outerMargin; + minimumWidth = result + 2 * outerMargin; } - property int labelWidth: (minimumWidth - innerMargin) / 2 - outerMargin + property int labelWidth: Math.ceil((minimumWidth - innerMargin) / 2) - outerMargin property int valueWidth: dragHandle.x - labelWidth - innerMargin - outerMargin onMinimumWidthChanged: { From 27b153a5e400e74f15d9d5441a8f286f90da6ff8 Mon Sep 17 00:00:00 2001 From: Tim Jenssen Date: Thu, 31 May 2018 10:07:41 +0200 Subject: [PATCH 25/52] AndroidPlugin: show adb output in error case Change-Id: I3a9b1e3ca86ab2cfecefd187d9574cf64ef6b1f1 Reviewed-by: Ulf Hermann --- src/plugins/android/androidrunnerworker.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/android/androidrunnerworker.cpp b/src/plugins/android/androidrunnerworker.cpp index 62eedaa4c39..39ab1a25326 100644 --- a/src/plugins/android/androidrunnerworker.cpp +++ b/src/plugins/android/androidrunnerworker.cpp @@ -422,7 +422,7 @@ void AndroidRunnerWorker::asyncStartHelper() runAdb(removeForward); if (!runAdb({"forward", port, port})) { emit remoteProcessFinished(tr("Failed to forward QML debugging ports. Reason: %1.") - .arg(m_lastRunAdbError)); + .arg(m_lastRunAdbError) + "\n" + m_lastRunAdbRawOutput); return; } m_afterFinishAdbCommands.push_back(removeForward.join(' ')); From 7b08624ae71660aafed4b1827defcf00254b82e1 Mon Sep 17 00:00:00 2001 From: Ulf Hermann Date: Thu, 31 May 2018 12:28:03 +0200 Subject: [PATCH 26/52] QmlProfiler: Only consider data as lost if we are recording If the server stopped recording before breaking the connection, we're fine. Change-Id: Ic6d57cd4eb7c831cdd8aca1f305b44b9ecbd10dc Task-number: QTCREATORBUG-20530 Reviewed-by: Christian Stenger --- src/plugins/qmlprofiler/qmlprofilertool.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/qmlprofiler/qmlprofilertool.cpp b/src/plugins/qmlprofiler/qmlprofilertool.cpp index 94b74c1504e..5b44948d32e 100644 --- a/src/plugins/qmlprofiler/qmlprofilertool.cpp +++ b/src/plugins/qmlprofiler/qmlprofilertool.cpp @@ -667,7 +667,7 @@ void QmlProfilerTool::clientsDisconnected() if (d->m_toolBusy) { if (d->m_profilerModelManager->aggregateTraces()) { d->m_profilerModelManager->finalize(); - } else { + } else if (d->m_profilerState->serverRecording()) { // If the application stopped by itself, check if we have all the data if (d->m_profilerState->currentState() == QmlProfilerStateManager::AppDying || d->m_profilerState->currentState() == QmlProfilerStateManager::Idle) { From 0666b11c01a3fac69ba573c98187bd89848db1d8 Mon Sep 17 00:00:00 2001 From: Leena Miettinen Date: Wed, 30 May 2018 15:49:29 +0200 Subject: [PATCH 27/52] Doc: Describe new kit options Update the screen shot. Task-number: QTCREATORBUG-20511 Change-Id: Ic21761cae6ba2ac5e29653d3ba27b520256ca66f Reviewed-by: Tobias Hunger --- doc/images/qtcreator-desktopdevice-button.png | Bin 0 -> 463 bytes doc/images/qtcreator-kits.png | Bin 95845 -> 78121 bytes .../projects/creator-projects-targets.qdoc | 15 ++++++++++++++- 3 files changed, 14 insertions(+), 1 deletion(-) create mode 100644 doc/images/qtcreator-desktopdevice-button.png diff --git a/doc/images/qtcreator-desktopdevice-button.png b/doc/images/qtcreator-desktopdevice-button.png new file mode 100644 index 0000000000000000000000000000000000000000..a7ad611f7c3029befe70ea9da39527052d7643a1 GIT binary patch literal 463 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd7G?$phPQVgfdmW!d_r6q7#K7)H4P07y}Z1F zf`YQMvs+qPdU|@MOqnug&YY!7mu}sGcYi4fP}*n zi}Et_(isj&KWm3MEjYilC^?nk>;LB0FlEm9xw)x%B@ExrOxw@Ez`zF58j@L(lghB- z-6eGf28K9K7sn8enaMx+S$Q~)iHa+HU^VJ-YII;dQLwlA*_pd30*}AFyIbAl*mK#z zjbp~f?C((mhrgVgX`JrJGx^)8Z(PX=$rC3rES@BG;|Ysdhvsh!1#uPiGhJ((Shqv85j*dc)B=-RNQ(qmpvvV z{oD7O<#PEB*Gvjr*k-7#L1_ z=PqdDEvd1Z>sKw|plcYSRVrE49pkiJu>G*^f9stuwB-8#&y8_ySDk$F@#Dw*|H2j+ zE4@6EVDO{H?$1L828M{ZEaty6-QJ%6)6N*;UbOSh{gbzkmi_pBJ6uI*;q8vB$Sno) z)9V7h7hDYGYW=i2cJFrS=B`aQbG}^q=XSk>KixgNWtO=^E&~IDj{DZeDDJ%f*JtVr zbT5C>(ZVhN`RQTnXM21w)4E} zIF(AaCNcI`+xIQ}C2-g6N>6=zA+x#6Y@zPDvh_a>X?8|@Sn%q&YxqQiU8e=upS-(r zY4Y<=KTechT>p*VR`!Z*d)%$vp+C*zbiXWMaoQMB^LN>a?f;*I6;w8@jIS*#ab;m* zyu!x7a3FuB*$w4z<;SZpGHtcFb>oZCzjfPiZCIxo=pMRC@m$Lpmu|l=Bs@=P* z+c--$x+py;4mfSmeDtC2lvLx)6sc&1^=vzQv}P98ex949px5g&L*-)S|LCPv;#&_s zq9ns_|%lIP;3FFVtXqFjw9{Vw?UE{i$VuDM74g}eFY z@}^TWC;5Dw?!p_d@$g}`lXK874Vj4_9Is5=zr<|EC-w7cUl;zqao7EUPx7OQ#ShcH zZ+}SYd~yB9ckZm_(@!~Ef)k=c}u3-M%nC?+1Mr)x6r z%D!)flQ%_1#m`(nHC)+wTg8E&lAQq>^X5*TUmB$|CFZ`()wp@H1Fz`L+WqeA7LLC) z)6SfWzwfE@fJ=3A_i3Ro)w53Tb>G@pC){0dHS^f4Q`J|ll;vFK*?GreYf0~?;?Cvb z{-(;47uBaPzv%z^b@Y>S7p*qyFKzv4X+3w%1fAR|ehZ&*oNU^?IjO|8J33uu&+VUO z=35nK%o68qpZPv|cjok4_uh8RdUkYg&dDh*yS~Je-EStACi{;`{LD~o{W=Mf6iRFdqdhDGnEVHwQqY9 z6c~DMLCupZ66=nhKBT&~b7Mu=m!g>OiE(NV?k-b(A%3OJK}F0!>fFz_AwhRmFWcsN z+fw&t^4C>s6~lL3d@Qk+JaIgk8e!Y*@Ok3 zR4ET>`L|)ay7fxww$gI37i)i4t$sD}i`twJt;fD5?6St5@&c2zlzskmFJHzvbNQZ} z+_&eRZ58r#o<4b!Q*BMRb-~)B%X8QC?`mBhb}eRg&asax&nj-4HZ9EYYx0qY^R8X_ z!QpT1{rkWT#cwh@RnJ~LcI%Yproo6N1ErZhPHDLDZma)I+r{Z@v(x$bwrnjA zII&he=fch=>0>9A_nK~W+!wcR-pqfmIGxTJ2*PeQ1@ZWol+-X720w8=gWFr2TIwhu5zE=Kp2u_LvSX%Q~gZ z27@_rFLQEJW#?TzGx^TNtJW)c8&mq?pQW$LlWcZQ@@?zhY`EcLzumisX{mW>xyh3Q zuGp%IUQKOVkp4=jvh{%IpFPK4y~}d8G4|e3H#5_jK_2oKJ^f4TFYoAmZq>T2pUUu9Sxi~kaGulj_w+MU-aWy$RMQA#`5w;mMt z?{4>g+`F~O?b-9?tSeU5rG=SEWp22AK~L}4(~fQNDNXC2zPmf^-?!h_R^4#Y|0z&gL3B*J1<`QeL;4&K<4(~)1QmF<}bXou;WRJ zwytdZ3GVbYIXW^nwQu-d&SITcaP8iPs|s6}C_Y~@`BB*3;LhiV4xjJ!^*-`_iP?nJ zhy3)DcXNwAzI5|t=1r4*f4j~fOipwE(s!eM9{=XxJNa_+C2BuZi>^O1MfhIgS(CO1 zjUDV;8{^hW{z}z%Kfa)bv8}V>&&wiz4_D!8z>iDnh;J)hJ z(pgzi>M=G?-^e`?epGPdbC7pr%f6+plc!JL+PBIv!rr^!^i9WH1_p*d-?Ex-O-p(` z$@I?DrI`<}`5#tipL-%xX5GGmL&}?&O&$6lN9wLz_oQq=F}>G7Q9>+|Hlcb%A+7VTEQ?I*Qz{oQ@%F9f8Y_nUkmV7>CU=K-gG zi@comI8WF5e(`lKEumy58(W*ReQhO06Ut4)qQ9J-lN)pR>0>{y$IWy6RgXqS&YHot zOf2Nf1I<6yJhS#pzU8o3=l5x4-Y<(!e*T={(-L51@2h2a?Q7=qB#HI6vbyKZob3GI z=ChOQM3h%|=j1hS-nn{u`{wczWvlAvmiC8bv)IlpJb1jHosH#1?)`OZmabmExbQKxyS{B=-we;L;9qQF zcWG=hvs7Us3hsRl>o{+R(!bcC1;w)waCw>$$AOhfm-5=f3q~ z+0o+pHwE3_pHVB(=47nq-|g;pLtA>6jD2{(4U5jU?;qYT&2847HF=`mFRLB%*33Ef ztd%=!@p6q@$JQ@VJ^bwN^!vT5bF5yznjcr9`*un9v~`WQ`qoDAImWqpyQoJr4^>UyHKdS`okPMO|!Gp!+kb4 z9gH%6+i$i*%**wOhj(uOj9*6`rIJHGw(Fh`Tq5+#C7r$RUc5l*htFq!>B;R=RPTQ& zwRC&;GPaD?krVrZC<_Q z=9c5etNFh!+2H>1ZRm2|EBvV?9Y_C8zp(SpUfaKqv)ZF4oq2O9^9q-`vAKNw`3B<^ z&*q)7eOYqiz@1YsckExk-oIeO)^`ujn0-rneDNuV{PYi6lE>sFi&JV_w@@e?#?{6`J0$uAgAKCv~ADD{gvnHSQJ?-nQeUjwa2AP+e)@? zEah40bV>Qx)kiC4@BZhwdlKhKov*WIZ=K$LcA|0|tC7zn`RYTzD;6y6EA%tZ-x#j@ zcggnZkheU?q+h(3S}MGG4xjehExDrS?wq`8{dI}Y`H$YU{VSr6J-W!yY3a0R@y7BS zmiq4d&!mYRTWw!-;6qB)Pl1`YXUgq)Eqt{nkxgn=F@F~G%R@I`F4SK5+f3%1tn0k< z!MCI?3E%0NtG}7$aO8^M&YMyh?_WO7S-Dca@mQXTYPD3v&RsiMfBxJx>j%r$@6)1I z%AI;Eyoh_=?792aPJpBe>D9a|8_aCHq9rz}zgn%g|C-%7u|*Th7Oh)#+O;?K?9ZJm zS7w?julYT5@+JeXEow)@BQtO39bLP7YtC!+fTzl9`?lQNlY08(q=}hVW*(S-DDC6& z-kv?@uPAyt<#`y~+F87P)vq|`_1r5j`o*m*xsqWwq3%Vy?5ta}wlOYGI^^s>XMN83 zuc2}KtFKp0ZP?S*#4Y&GaO>yKdk(d9JPtIpQ;X7)VmCc|_mtJij1$lIZpqaNc`0-< z<7VX9Sm`NOua@Us=hI&Cde@uH&)G}#t~UHx&3aN$G5xjMExnu7DVJAV-KVF1sMhy- z%|1up+U>sbUN>b5nnN+={HT-)?TsTR!VnobdS*KVAqQfBgFSbJbqSe_pRc z`LZ&rj*DOZ8Eik_`V)5+bFYx;?d@fY7tNYAsc~n%?7YM3Ayt`gZ|-uB&E0?X=jrFV zq1*CrZ!TXxsV?QM!dAoM5vkpqe!ZK!icRt5*SXV~rd%oca>cxE&8xe&BVT5(SzGJz zyM4WxrAl~tO6A+Q?c6)Fp2>=q|8gmC5|+w~Edt$Fok>FBcEqGgK0J13-MMx55`{!t z`;&^EwnqGDyti)MJ5H_H$CEBe>{+RKufl#7yVbFW+!i`kz2_#0CtY~yBUYNUWB2N8 z2KR^DN6Wcb3b$8CXSB7sxE$pzDJ?7G=Lx=%^irh!Wz3=0;*FL$Y*SA?`LrX6?_JP_ zy%U{-yxe}CkMiS-NA9kB=V%kJ;&?gPQ}}OetnFhKsp-lx zxnAynt>xU<%YQGMyiz!Pk{{d7=+&|&oaAan}1suk_C} zJiSm*8$P$x)aTA3?sZ#xggKpSUwmqpjQKcag6YNk&GR(-&WUp7S8v>J!z|{zQC9lJ z%QtV{$f_?o#GQZo&^jBlUa$1x$}K1BO7hzZRoHqR7hk$@B3mpsspo`f!Ss3Op7d63 zT42V&z#zxB_2cJ+UhX6(3)|+j_HXk)+qb2aUFq5Qi}ia{2d`R;PK(&ZX|2v5#qB1w?~l4s{qg&&y~l-O zza)OF;XeNS@0XZEt^ZwKe5kp2#$@^CWqY>N`Lwy^E;}TVA++~ogJLCWvOMf zo%P{sdTS;sJP^K}T$7uVlj}csb<$bC?!4!#9Db~ham{*Mwl1z*ob}G6v&m1s>6pJ> zyiVP?aM8}lmxm0Wn*Tdyy!UUjlYe?(?j2307mrqN{jteI%trif#^MR~9F?>3 zgB#47pG-M3Z{Nb%*-s`;oVaMwqF1k8txDxA;@R0Qly$fNmcu75)&2%G1(2N;6Q0Cq zzLJ*MSLq!eAD^B5I*F@0mE%-zXmD`zo!$Oh4?g|)a3#of2bxu^w|@}Zdh!1K``4~* zn{(AIH&^$UIK)FX$Fi7Jb(R05Fi&(zHO%C`{o#kF(%gd!0y{LstyVz7VQZm%RI}6K z%b8cCtC*k8kjc`vuiseG;^DG0IJ4#7pD$}B?XnYU{o=lgH|uic+1hPeMP43~(mZRs zB&UI0p9SPro${@Y3YT6iPM`DjtL)?UOcSL^QX;b)RHWART)e{hPU&()jG)?!kJeQ> z1}mo>TPF0+VXNT`>3@eOpU<4HH~qx*wpz37IV%?)C+_Mu3lKAVY0dP+%M;=Zu!qN-DAzI!+&?{ zX4IWdxiHUJQ#Sa}#_Z*HV(;wnH=nR%221?xLe<|vYc?;Ae=V`{MNj+OX7`T|oPM+K zx4(D$>QU28Q#D%3LFt4+Zow^ufE#OmZJu|IapAmeQSQQ0JGcCLY}M8E`z+75+|Vr@ zI^N%JZTCESI<@-az}06<8QG&9A@FS zQy)z_{~%<=o-Z36AN*7?-x?Zi;y>@a*M`9O^~KW+{r9I7dYr#we!%U0Km}toSH2)9 z9BeeUIxZ-9dH3M7W%rir&*R<@a@{gAbn=3|=eJI`chB@L-%z&Q)bx|>^{&JgkMQro z;;%F7cighb5>P+3;ZlbA@hhK~Z_T-E74c=;qU2}oCR5E{SgZ5~W%cJ8t)73(AZ+46 ztK=sZ$21J@zq{l5ddr`zvt_!@%C)_J8D};{R&;}0@PKh8uTZaR-q{PcKOLNvTm3!n z=d;PVZOhNkw@WJEQlBfWW0RVYmY}mw&u$!hSAK7W z3}3Si#PZd=OcM_(h#j?*oWc5KQ(D^2xpr;4uGvj&WMls(5g~W!#=f&AYfKJ?r|zD$ zapg1f*H@d2qb2I!Xk2W(!{NSp^OV-qnsx72eK$+#+oXNoQv2Pl#fyqAd`&rKvGZc} z{^)j*$rHU|uB_MJv1)hu`BMcy8+TvJySqLA{=yARA7%Eqg52;S;g%VP$|IL>Z|B(8 z2CZI77diKuPVMcj{VV&_aJllNO`q0Z{c`z)bGY77*JE=}>aBYHQd)IVNBt9?8<8tr zbY{g(;wn~BjBhGhf2K=gvISGGweI9|=g#_Y9x?vJpZX|T%%I2lSbu;2E7eZ)Z1J=? zBE-tTz|e3!GuEd_qq6#a%;*9-Pw~_=Vzum zXV-7Wx|L@_LPKsG)&48+A5?ZRZ2efUidXX8mj0jHzG_YXb#wdg8B*mZ_7yw{PxDdy zm1kG5t?}pN!)i~4c@|0D!RrAi6+PFZXu*LX9f zGML@i`pRL&8|QyEob3Fe2ChmDd$5Le^q%~1^O^KnJ#$f+pIOb70p}QMjef3}HSzDvD=GG} zrl%(*&YR$S^kIRDRK1w;JmdS>k4o&650+j|_nK+pm%OKaTU%&D|JH@!0VN>~zou6+ zam|)EVzqxSyUrfwnBFh7tJHoKH}TJoP>=D_&COi7OJGO#)S!ew;mHB7yHEXCV8q5) z`nR<3+OA#qR?aMB-}m?2yO`rPd#->cWezVev$D1hoa-Am?ZV3v6$`l>oj^&uD;dWf z`=6ZYF=n4)b|YT#Orh7B?N(bBZ{zja_?U0HT#wxL{~q52v~HH9%sm>qu4efrfu|={ z*M@S&Wo2cB{X4p6<+0>riq4-Bg%D8Fm+O|jXzyC+V1;d|@%+Q744Z=^2j4%-zracMWR{m#RY z(`LV|n(*d@r%P(q&hAu;jbZJ5@iNDrMbw>|y*4>2VTuL=1H*?Ct9Y3NdA~R)YpoD5 zn%L47Hi5Ih=hliYvrW4$Y%FQh(pEoytMJ=ZgS%gMUkUyCJyWZi=bZ2K-S2<;oitcI zzgORW;XcpE*wB-PTPA&<%&9WzT}yKO{{^e+&m{a`cDV9!(7A|h2e;*FY2@!sKEse_ z;`I7+?zH7YXWSbFW;#*mA7Oq@2GbEd7`K zeiH{JLC*e`TN65VTsAh>`dHZ*q2hX1)JTxgyl?Sl)h5j?X8KPBI9b-EEYxkWFtl@= zv+L}{G>yr^6>QaB8WVM&teyWTKt14Il@N34zUiEr6-u>H>-?8#R&1$kIyKu(JBY8= zDb8iyt+-tQZoiTxWv1%CpZ)NH`f<;c#)K#{TjuvBprGYg#mm&`b?mw-+ncaEtG0xv zHh-Ep`C(prUrTxLixp|&T&+25tsYA@+|c3UU&|>W!c;fu$fHyCk2Ym!e6*1>ItMPu zR`l);{a^CTnncovJbm{95%fw$$8FdTKch-e@`-&9XpnGaVBr_W8IU6>CJa~ ze0_5D%>6!P)Sh%aCnhGQKKb;qOdcU<8N0P``a>xmH9hqcCy)Gk^Fw65QRniFk+n}h zrj;c=ckcPVI?|P8=L!j#Zo9|3KdiJsNX7B&#uQOf+uA5;W z6g_$3gSsQv&fj&qZMUSyJ$viLtM;#+q!j7ob)0;m*SB@Ury^&0R?!Qs!8Ux|UTXI) zALzaBmg}+f(!_}q=Zia77g@}S-hR&WXU)McXD8b}Th8kA@yve#kL)n5nL_@D|A5;> zSB|ZhQT19b=T8teKfD_uKw<%0HB2w;zkB!Y_BW~rrtexUV^ed)dNGswe#eyypXEJE+kJO;%8h`!hK&mwpIw|> zDgMG1=eM`#hlhr`o^p0}Uc7qs>*v)U z)j!So_B(wU`|mmDCUbl=tdo0gthei3X_o83?HRs;2k&LY=kuI-C8zTxes9p`CA;m9 zhP_`zr&%(8l%c8)v_M7`xl4>$X)9q?g&h{+5HN*{X}x(+xfN7j6{a-*_wH&cREU zgnF+!uROe71RQP|w8lZ6_D*T%WUlQYo)!`NI{B{!zKv zVJlXqshpZ>HsMk7D(U9OCDrl)etE~grtDY~n|}FT{5JoSyZYL^x0!r6y(0UhMdB(^ z#>b$RV8ij?T$?L*{P*x~IsD?qi&#FbWhO3`Zu}<$>?SRo(jjtXmC|A}7wcpFo~o*e z&#Fzg`1r(d?Q(Z}RkWz-^F%JCkfrnZH0K<9c1v%k=E@asH*fm3)qlnmU-9-?Z?9f3 zvwReE!`LclvT&_ZKd(NxYn%1B5Znr4U}(6-uoc|rTVMtW3s8^y3L7X5>j-Z>n6xpV zVfDULo>|jA%|7e-bMHi>(=LbQJ{KERTm>l!kT!QH{h73e|D>n?KBDWnicfxpM5WkoOlylbj2mSY&4{N-THmfBEOm7k$y^&yH5#x_Q&` z_i?j{PjVG)TPN0a9=&t>%KA4V+EexI@0ULE`mS5mcy;DmdAa-A^CPYAhu2*@dsI;N z!Z|yI{gcarL-o3@R=v!Rm*V%i8>hr8qRPJGxQR)6etqCW=htUkLk;}T#D4z1e>F=? zDv#>^pHH-xahe}5Pgjf9SpUyS)8v2EnMp?vb*79K~$X_N`j{SY&Ss4JzpmGeKi-Y1e zKf2;_w5DH8E>z>D?aTzG+pdt#j76^%SGqKWM4EnIq|Pc z@R{(IRr`LQ`?kk(C(jJ=%jzFlth&!WUR+XqW=3tkw$0z8KjVH)*>L~KVfA~r(&mQF zm_Bvh_0Inri{__>=KVe%e@$xMvCWoAmC;9d=AVD&{cJ-d=lsJn=gpK{d)n7W<3z93 zpD*{rm-n7Y;9kCh>;C`#>EZL=PE$Jh;LB6{>oa2`UY(w$&wKClx!ql@Dm!&%MQi;z z;vKJ2vRKzhh|k<}(Z{95#X@D%);_u~a?f94)}b^O7MnhYh22X&t)4OW+2)EvH!FR# z5r%OnV4bl4zwgSg({nNM zzf$>fZ|%9ldAt1ozU}Pae}D1wx`{=XSMUcu|9MsZ&vmtExxSve;fYJXd^8JP8v4KT zt@K*qr{PWE|6cp+*YAisYolR(@tbC={r?2H%eS2OEZv^^Xw%Kf{x&<)+CQ0V-wWhk zmAduVn#%uo8={J`dp@3;n&rCoYM6D{tG1`D@)ggg+Qz+I+uOHleqQ+9zXyx|*A#DF z{AZh2q1o$scb`qrjQg_O_TlI6_X~FzDdtDM)ZBXK>qn=D|Er6apIhmOv3 z?@aH%s1{v5@5c|#*7Sd$o69T09zMOCrl$7Wtp3|lKY>UUtJS~%dA*&$S+xA1d;ZHg zI@Un=JYs=>b7<1;NCmS!8oPGb#_Fz3eNSL>@YoC|@)a$WJoSI+%T>19t?u+5eFXfok?Kv(#w`g9_ z@{c!z@9T=y{Z3u`;L{t2rRx9xENWZ)dE#B|_#Yv} zw%32SjHr_}!w43rLX(|rAE_L)o1 zcYe+OnVa?L>7;blyKOiAJ_7ps;}==Rfc=;n@#)iPhE`+HAI^-9IjRi$pbe&4IE4DAz8UOHpnmoK|F?iDIIvyNr*cf0FrlTKy-tt{Jo za27w$BkPMr(M!H@``69Uc4|EvSO0bOjW;1nw~OpE>($cN)LXsdnn}y~&-XuV|NmzF zyalTAzyB?s>y|#rY2Ux=!R$?^X9xGpkK3r1U-W9z$5q#_$*x`R8@KsUYWL@<&(B=j z_h+Z+!(U6ella%hu9bCV-w0Zpwqpga)l&WAe>@6y|7kB@{3nM)tO1lpW13R_ZgMx?*3$(_HzHt@cWZC zYSqWZU75V?-~RfW3G>Tz57u23U#$~VwZYLuDEOiA-UYYx{+zw~`b)vHYuDpG>r6~9 z)-JsJvE>juW2E?6QTvLY?DA5p{r_{fs_!$@T${J+$=j^QveTxCt=;qSa(>Ra!u(eU zURtgFna;{u+V3&hclG{j_IGcV)P4OQ9I^EI%j6Ay4`;5O8M@PY{{P!yyC+|ZzE@km z+;zs~ed(fhJRZH*|2^7SU;9#F|IfF71 z>9=#d)y%sxOpG2XhD#gYaZ7t?T(mXtkAL1}vBdj&cVr3)4a z-D_c+73bSuP+rQ_>wWU9Pr;_mu0PbK{x#7%nN$DKHNKo*+`YPb|7YP9QsVwg+$wfh zS>CX;n0sc$vPZWL{aL(z+t##WZK~5A{%m>0VIR&O9nGG8{j=#~iTW=s&wj_h`KYX8 zy7SBfud=`44;?~oH=TZ(xbHf*dg#gM2sJI^y>n%r)csH|?c1uhYtD{KO>)w!4USbO zZt8J%h_T9LI~;zrde?5N8#gU0=dO@f-=1>x$MNv9=Za1TAHMihreAxWgvN!xpFDZ* zXKB{NGcqv9DQ`WPz#}g8HpFJZ_V=sHxBqzlC3(|A2IsG5t9jqbzImI&^f>7c|LuA6 zXJ}Yf-B`bGyW*j{hfiL-cHx@7?m~mEo%D%ebi|0eAV^r=O24=_RRmd=X0MKe{@;JvTr4*2{ikbLeNR)@c!Q} z@vo14+_7a*LACGZhFg7H^0ixKt;;p#HrURdRA8f1p0dQ~#(SUQ{NkXLlC(kokXUKXi zcGPjH0Ow?l4{bGCT$PFQIA;|%g*4Pm;+&}^|EAMUX>sM+C#{|8Pg*V2KOIt0lIvHW zpz-OYCbzqS{@YHz&l+buXU?DRelo4Yp4n1&;(_%gAak!ATi>f%6E3Ays_?(XS_gQriL?RR{x{G&7ao3|J4d+Zfd zllb1IMjw=NnYT7hTC+%MZ&_rM%<0poof8jETYu}ssZ&9LfsXsc?zu!pMwXOpS+(lb z`PC6+*Hew}?tS&@6?=}~7o&?;xbyxkJ?$%OpJt+Lx^&i?ps?U@^HN*$%F7)AD;vTh z3oN%MM8qxoIcH(luC8VA!ta-9>K5-%+3lRAmGw{4_mXt!j-HuMsy&QfaDCsGRr=83 zoM7ma?ylOLwK-|K><;?6hMqlQJ5{SZC+>jEIh)xRt+b9UE4;XF*Na8p-Ur{z6ufYJ z*UyyChZ;92vxi>kjgek=JaoS7iSNc`-S75H+Y^6XZ8`s=ECvP!n@3sBI%22Y<8+cI zT$yk(<#cTBl`B_7?zm)TYG&R3vGbMyzv#?NDYx)1J^lU5t6yi|T)y$;+-=pNzIPwp zRu^wBJ8wRpx75gY*@7pTIqSYGi;|A7D|#!Qoh!5}eVO~>w>(DC$GVl)ZaJ(yO=$6% z5|y15?y0=npS+YS)sPa3-|v2R@(r-L+dPC)}7gHN?!MarM{hc2a_(l20CAzhwL7 zdC8IeEgfI{D|`N(>c4u~+VaMpDUQc_AFD|T@13&sY_)~`F5APec(#>wte1D4`9y5e zro_ot({psU<=hi*YwF!{OzNhasK4WHP!3mKYbKX9t@YN4GiUDXF3(R+PJZbdv%5@J zPmgcqg!$8^UR7hW*zq*>x?l0$eQpb{uB}`aU4LU~;?&DKXQ-y`Q`gNnpB2j9e_-|F zNAut5t@W@IopI&d;<(Q@s-;w?it|6aC4EGH>+b^nnU$(y3!)9DraUj+my%PMo!+(i z-pe$fTS<#{oOj9JzvvXBwl?>b4MLG&)0665P9MAJa^6zW^3cI6+oD@G&OR@@?W{zm z@0QC~Y_qbfjkbQOx+RqJX-oU$`Q7y$-$S=tnk4d0IAUXg=#SucjW55NTkUEQzx(B{ z9^YLZIgV6A_OiUKCB?iw=NFt$>e=Sq$T@TGV%~dw8y6epEc?9X+((gTCN<`aph@_K zTRT?Y`th(`UN3f+h`jv#Ns}f`n>KC6j2ROqJb3nO*@_iEE^i7}O>h45=vLmAu$EOn zw+8+`-|8m%)#vXG2?d3#VljRk#RgY--_74uS?(Db^kUJi4|k+{vnoDD?3{jUxV_lB0d<|oBtYFlEUgo=uODJ$E%A-%5Y`h3j9B96fbviLqne(u}>Xl@l%@S_nUtN{9Y-yGBOcwRny)SnE-rSpY>(%UgwZFY* zf0mV4f9r-?R*N}zydMJtLxA)Gvv(&xd@zt&zhKRpo?~6>A~rrcsXqVDzu)h_zq#4m z*5T&j@@LDNKN*fY<}Lew<4}HmVE7}!$rf7mN@tE~@2xy}-m=r-z+`=&@}2MOujxGK zFYVj3e0}(_-kF9EX9~~Qan=2_?AH{I+eu$@F1r^0nRqVn-I^5#ZrUxAxXU$f{@%|= zt8P8gTl@U&8NF}Gi`cAZ8>ig!m~wyRrgI-(oq5r4Vo@R2(x9qG;S*+?8H>KD2&5{OR#Rtct^`%}^UYoRh!$lt1`zos>b_Ic# zXf)jVA^PR(SKHrjHgj=tX@s7T<@OZ}a$fUYdZx97)yx;tORg!NRnY!u78-K-bVl?G z&zYiE=9b^8zHu%n`lQtoSA}(^zfP(2Yvj8x*s|o!{Y~Fq``(Jo{kt?>mzV#xY>1si zfd7G(tL^)YG}F#~cE1$U!!K)mDQGjld{VspImb1f7cX=!`WPjv)#5b47aJd5THD|Dl;in>-JIYxD_4%KKXCdqw`q>T!H+l7 z=lAyZ-rabIXYne9ngF$LY9`sK=&IZ8saHW;0j zekGCUdpbM$U4?g^-@B=E&WOpByLo7P`=8Z$Gx2-WnWFYvfs&P`_Hn^eX4UQN|Bzg^ zE%IW-hSq)2Y0mc*Je7nOM|{>fDAMkxbYW&PZ>ol2t>ftvhd6j{rkt0Uy7`8e;@h=a zF7i{i_64Z7pX&M?VDFJtc5?sL^2cJ) zE@?YNl=3)@f^}5Br!8M5cCG)9hSrif6BC)buO!soFjywUt_x}x^l!W6V7P77s#Q|c z46k0jD#Q0&F+e&-Z~9&aE?q0zzuu4KX2$+g%ld5+^ZLZ5`?n3N(z`m7FD!V_c$YJ3 z*5sA9gr3PgU%6f1EWG^MZKW*{4EMbm7#iGTbH9B1w&*~};>C-dPYYdf3kVEseD=bQ z1-d@y$kkQ1UA|}K=esBBa-0?t$zkqXm@4jFQpP9!IO%XsPD^j^M}sbr#i#O;Cnr@l z3Z8qLJ7ssm9BZ*3yu5QWT0TE`^J}T@&AZ*U9>))WKwbXf&JAA{?fUoc_sPjk^XJ5P z9C4d< z@ye?QUv^20O$n2p6gT^>n;UD?3jS*vpX#Gm^8eYhf1>T4dCiTDjg5-0A0>HKmNGMM z50!SYX*~1nW2KLl*UhdejFZnMUq1OmHP=z;QPu6)uVz)LpFDEAo0F;Y=u>X-1mhK- za@N}mYP+bVZrW#}`>UkH^|nN($Dhb+=7(-LREPTBwwQP->EcP3Lq*}zu_bGIyLh=b zzG&L^Kj+fjq$eBW?tg8|H7NM+bTw)D%6NPJ*9%TBJ$d%p(L(`Sd{gGWP}aJ3a*BTW z9gPiJQZMeBVSjVG@Y~b>HWsiazqIg(s!bflbX zGFW)=rEF_rRGT34WLZhgpK}+poN8JV`7SHjrG+(a)t#Cf#%mMboo z=;BFbzrK3a7I3{*=v?h~WG%PqZU$#l;M6b0Q4>BTB<($ObM@XOi}a#|qf!&@+T=`VzuNcVb?0UcsjR;ovOnkC zchiu664Ki}@x)%&f-eOd&16=u;0?cUE@#OpeKF1{+dTcQ&REf}xx3)j%hhL}ZG1b4 z@!s31T%d(-Hx92hJ7L0?{G;oad3@d0#|6BBKAByA)1J2P%8Q&l<>InmyLKHb6UsDs zy=D1Sf4yG!7dfvF26r^a>Xw%B-fe!YagwX?$bzrw+4;A#AIo`Qs3+d+XLETThjq-kzS`$DAxSvovo`5zou0T()Gq^_bDrMHEW={3%ZrxYaCI0EcPjn@1 zmG`cSxBq(O`m&YIpKJe`-nOs(wYPTTRiB+x8ufK0BqVMqFEv}Cb1UJWA+vU|@ZSgC zXCoD*yrkIt4jz@g{)o5aYe~q|w@H^KEq2=Dq%YoL`PTHauGY!#wriHxXY6l`tvIXD z>6RSuYtz}Dn)SRFQ!oE{_U3_e`{CDFpZD-QP3@Vp==CnGzS{pUZ_C#$PL!1qf3;xk z;>F9>$Oi^Uyn85Hy3_f{OPi+;AHRK?_HtgxtatyO&X%uRo;B&7!MP=qt9i+tLm&2r&--y%{hB39PQU@z#0%y%|GEzS|0@u2);)=7WiO-PwAynI zZ`Rj7j@Lix?;r2sXY!T9F6(7R#^j1`MduQw-Ic$GEMchPT=Kwy-#J@cdB3r`(4{wb zYbNj7;Ao|5@nOm7)`fLkCr=-DzJA5;{?nMC(*aSUxiwqBknNx$`wO_EZ_H+8(d;-rvz~i|LZRfBW~>q|Ur|;&4@72OHZp zcSWgxA3mLay|&x(#*&bG)kY^4$eG{#cIChA(hvK>lFZwVZ_xg@Eq~vhmnq-hoHb(Q z;o;$Vb1^{r%DohfCoPTY4a@7gj{iQ7jQ~Ju{J_eX>H@I+POK4o$ z+2gaB^{P2-r8{V&fUxRRCV^&c3l_Dc>d(gqmm(7)ZCcA|KpWL z?mh3a)5G@s^Isb5oRMeLrLpS6^#3wF(^m7EG^Kbbe7yGS#s9sV^w#*Ao%#Rq@9PIi zcYP(bh}y%1ovW5UJ9J#ze#?$CvJVbT z7XwAKV2E^@+rR6#wC;X?x2gZs>74@aUI@KNP0M**t)_d=Id}ff_4_ZMGmZZC>*#|O zf7Q?OWks>Y`FNlAIG_JcRxxPi_1k7_nL#rbeD#_!wQ=#*mD|o;eEi8svURU=?aYgI z-;RHFx7L$fEg@q+UGQn|KwTEm17?g`a1irUv)I{wsZTM z7$Chc^6UE?bAu0-iyzA+OHIisd^D-?e5CC68?x>-7YZ)UcJI6wAbo$wb)8kc<@c)+ z-*$d7=3}219^khmS>w6(E6>dIq}VMt)r4%VbwBN`*Q$9NaZh>bc9xQb>%+?Q1&Joe}FPpHscg8+O z&TG0yqSmXftME$P8k*S75qrY-u13uoL;F8Z!{^c^qi`R}%H-uQ8>i}#s2 z-|G5hA1;-LJ+HdOdcz_38Tjc}~4?8~a=4NAK`qB2R?Aw;?^y=x9FHPGT3yr4k zG{|#4E7p74gJaVb3yIiEVFj0bqAxqfscp_kNHWm9a`KLL`hus6p5?uL@#Ty#UzGKi zyM8z1t{Q%|l777}clE5L-Oc-4-x#brS2lam$B#3PF*3EfM7+yl_T8-^|72GC5{ZhV z8CLV_zIltbUf=gK?)uFW`f>MdpOwUUpZC4XxI#UZ;p>u|`qwx4-*_#JNL=&wbA9d2 zS6YgPYOYV_x}E&t)5B>ib}uY%nh|m__~cQx>eJWvt=MqvomWs%%gdA6Pepo89mvkD z2z|JBais{))>%EDpZnj=4f*l9-0^GhVWpjGBp;r2xsg{}yEvFpRGCZC?9}RcKTa6# zUtIcqd41jSH9NMgd~|!d=(Szu{aqWUOp&PV?d7VEOPq98*E;>uRZ5Fzqa$m5wC6c3iqpf7cn0`b;-#- z^5eO1>#Z`v)wh;N@LjKuDF6N{_m%Xu`oA~*cCV>h`267ie}AJ-U+JqW_nrFvUe(i+ z;r4g4gr-<)c9m@S@#*sR`8Ds>o-cppdd2_irl*@jy!6=je*U7>USwDr_hixDk5}K< zaPPJ@y|({T>)ornuFZNYZ@>CUxvteI_sHWBrRTS;=bv{<`DB&4m5E*DD|!8QJZl8| zJkz?358eA+aP@ojm3_AoAD3G_xcq#6)u&ee>u;~#T$&~qV^pSiC$Y6=%8TmTx|d$H zL}cY$n3f-I`}2(U`*k-T2Ab5ZHTk+ZeE$D)Pot#$@2$S1eWY#qy4xIHKeT3_@A>-o z)#I=6>mzr%o!{Tmu`o|ctZi=T{m)OtpWU?Jv3QLd42lLF7}V4c~0X<;EALc`~)0eSASfDyT|!I!du0! z)&xzG=9v3t=dQr0MDBGp6$f#1 z?UkG5Rf|Yz*D&it>kfNovuTFUI{x|giBgryex6w`ZyB80Wu}u8D{;EBt@8?h@aNgb zxvOsQ9(g${vG0$_TH)|noEnW$^40IM%r|bBe5>OKi}Y&gC88w(TI@5I%Kqru_)=}p zhb;Ncom%_V=kg?0xj81p+?up>{#uptPa9{&IXPM{?W?g}=fDr%? z@7F)<+^Uxn zmQ&>2)zef@Y&>+x$!hMtH$?{)9mz3HfB^fgH!Ih?xwY0ZAw4~P`80E(&Xl^ke|A^f z95kBF><3N7d{EdK7F*wat764ZR`52g*(!^k@fv`^2KKa_KbOYtW$y33rLjAz*ict` zYXPWC1r@6X*7cg*E(`7Spd&lz8^g9TLM0F@*g*C%K-aM`tbpvPf~{tQuD(S##Ua;5 zYRk55&z?UQ2Q7c=mweG*A02)Btm&aUckX=nP>`RWe}Dag-Mgjxk2l|9s1x0|apTvo zU+;pJ+b6rl#>U3P+&OF7*TKr} zTPs$rQWEO4ka>5cQ#j53@Rchj8X6fjH8Pq)SDrIvF-OE@IiE-@Se`ch_SW;=J5T6V zurn|)Y%Sb;Ye9g<+_`hL!`GP@7#J8C8O1Q^%K!WSW^ZaqbmXiJ*7fhs=dazF{p_Bp z{l4E9=lrEc(`~;X!+7Z+l19O${L?Kv+YFA=`&|?j-NSm=8TH>rWvZIjhu7t z*FI61x@3WN?A1=;{pVLrwX)LrnepCT`rh?Zucq(+^Yq7$9T7VJCgdhZACaH8Om2mp z@H;l|B^E8mpQdl%T`IJ?YN@yB)6~?|P~kbTIfp;0<<8yyy;pIL=gZ5zTSHS*pE7@* zGdbLUlltV`JUN^CuOVlq?Ay~kDQt0iQl#nnAJOmLmsGD?%^16-c3S7%mZqywfnnD- ze)7G4{^B;54b6I9^K+cbD2z>tA~A?I=G?HMy>{CKnZ{HfEYwY9WP&2OHzdey26RVEJ}GjH#m_-$VNpY_tA z-j_ZX7tUE;A1A)0`w!2yjnx%JhoqP9m?dTX@MA@CFMFA;_o?F4{hMq5+&X8zEIcWD z*~bf)E*~~tU-?e@wDoOy-S4}r?=Gv8`WtwTeOkeD|wYJ52b`ZGC!UX7s~S)80kLEHaeSHQc}N%gcDEG->g~E{&4!F6!O(HGk$8 zI-i>ES7;GFe_?*g!=^KwdT$-TqP&Xa(T+6WlbUG$-ds3{KKO5Ox+ju^3%U}PK$TILjIgWI1OJtF^T5oM~s&an`qF z3ulM^`A>$`52js?luHzw75l>5#OP3aYvsLv-GLW1vRA6zn;gWt?PFK&l(4z)&$v{! zUGqCN&$hnDuPgD{tR06Bp4ng9x%u~+%a1Y)&b~kRm)%@m>UrshxVcA^d=|Qd^>WPn z8=J1pVRv=+`R$&&lyWD}I)9#3Fm0J)=G0D>#mAo zCXU4q8s~mKnl$@`x~=I)xhESYma=`GnK?(^)7`mqqQ4eblh3CKS8{Ys*+qAka5jf(jlek|w7%{jRF ztL(PGpvpQI-*V+;<_7crCO*^VG&{QKZy^77o^RWq9W%;$)aj?WDE!*SN43hYmd!iK zmA{7Lefa-J7K!dVyxo5P)YLy`zN)pyeo&3>uTtHv7eC+W5N&pk`o z{y*tD_UFvJj~{Qn+0n7+s(8A6=%r0_ZM>?lsebXRziXn>9bG(CCELgPLil1+b+c6k z50lQH-DnX!IpEmp?`P((`gHBA+qYtqc>hDJru^Zp6Kp+L?o6-$bI4%H-v=*et3j@Oev$z{MG1#r^Z^EBECn8-EaUzY4ilXgAYzTADyEe+W@_4l=+73TD8H|)t1 znfJEGYW3~uXAS3X&CSu>zQx4fAY!ZHyt+c&Gh3%66m_1m^xK~5T*3XkW!1{J$~kAA zWw@@e)0?Ol8pmT`JL~k-GLNZmjTd<+uD$$vZDn9$W$>J%MdsIEY}?pb`YdNn=eA^z zt)Jd3xE%ggZDYqei zUph@D&-n7+yD`nLQ+6L$XWydXeE7q%pV#j_5X?8aadAsZ%g&hj&yuE|sNEJN^H}nt zqjRqQ+jUbO2rBa20hi-5a|p9(M*v2;a8OSa$4VNa%^f?&WpAU*E43 zUpb5GoL`kt0sk7#W|^xVy~`J!;s`(M9<}S+zRk1!rxtHzJd$+A>|B|((VZ(-ue^Wx z@Yamy>C&=#YEtD_-%Y$EHQ!Wxj*-(BozKUn-}YX;?8Tpz=U$!in>EF9M*PKFQ)E{x zUYh>I@8xp&IrHr2>iG1Xl|6jt*~$erM;K#IAJR|F+H&>Nzw7*8c;&J)T}^y1w|~-+ z%dj=#n;&#`+QO|z?XLucU$2;8dStTRRn`EZ%==eWmF8-1tY7gp;Qr#-A8Tw*N^Un< zof1{#l)WUPT8-21fg?0{H-w%@F%mh={qsouPyPR_H;>u>du+dGq4Wuxe?RB{|2hBP z%lSdU!GXdYM{YCRJ7Tu4bNj-a9`%>fmaR)ny6X4E|334tW%jYW+B41Dzs~D>{(6%w z$N3LSQr5n$`(F3yrO@2t+jbTQRq!w{Fx;*AjAHUUOxW_Z&?$p7eBM+pTnyEq$l_ z_8<3R$yWXxQ^Cf-uw&LAhbN!70|Ej=Lgj7Pb+tvfOk6@%Fey!E&SyAv%FM`U(}y`r zL#4V8C+4ov*ZotYv(CWG>{_^(_&u@JCTz1m^O$vS{AHV;mf3qO<w6MhpxGLYYPXt>CIysu(r3Q117{AIc3q zpCK*P1ZgnckPD_5wt-rp3=9n03ST-F&$-|sFEN{!fuZ2)jM=lDLm6(ceK2#lJU`%` zEL3>KiWMi$oME}maF0!6*Y(TG{T~)HFfi=Mnloq49mf;3A0>3e*47tGVXTGzV|PS!k4Mf6q#_>Gg>+;|FxUx zt81?cs{iVA-x7Y~s>b&0Z1Ibg-?rQBTsHmcPK~IyydRy^Po%$nr_=W}t*z2EO`Na9 z-0fE-Z;>8bpxowg@z>o&hiW+QZDjp3`SaPEQug{KK1U3El@iX{dv@{lbG?<2_5Q9r zy{G#EBe$+)MsvDCfLT!xqQT$?KUXj518p~&-E$kt@$+ndWnI~sd=)C zauZ}{&6b>bbGJo|MAGVf;af%#^1p6e)HbS#l})X|EqRAG*6cU0U*e?i$%E zyZU4QEK$GsZT0MFOGB6HrB%gk-Lm}9$15u~1f)B^y>Mrf#HYpWKO*9r^|#szhg}0;hENQ)A?gZ zN4I}RclY+od%m9#N$)hSS|Mt(x!2TH=Cu1>(=)Y7T)U-@i9WABdyw(t%htksd3TK> zcW$1$w>YQPTfR8Ec!8Sn!luGw>-YU#y?;h@^epL@J0~5gXJP=?-QTduA(jVe;2qF?D5w=VEb$H((32mH0!4+-hRkuQCq6MFLjBs`7!G% z54}~JuYFu17b~OH@tH4MV)@r_wboSs&g8sJHXHF*HKmVqw3*4mv$$Y?%UV?E8M4sOaGYLn@>@1^6nU$m=^M#P0wGr zPc(B!qn}aMvkI?%6Y~pZ28M)2R5sCh-zyfUnMMCUeE9L?<;jbTvt+7&eaXmw?@@Yc^W($KwO30bw-hwY zdFFBMR>FqXNq6@un@s%n;DzS4&;LH&ym|7T-n9##O6rBJRhxD1+uGUN-nx0udS{KS z7Px3kkWP@c=b!ZR*u0xpg)4UKJ8kyu+qVahQtr*WcTKqr`JHp-$b3=10XqC-orI2< zwz;`@4s(UHiJ2LwOAjiQ!h81Y*|Th!+6KsY00WeUxF!aB5y&UP3|w z$gmwr3l7!S)yaVj`||bc!sWeQOV@#dFPtsp&EiA*_wSbnN%8RVUd%Ajn|>N3wT@@S z4fodnA3hk|VEZsFC%Lv(*0%DEJY)CShukerjQwYmKpP1fzKelO0BN7S%`vr@_0!t7 zvZ6&B89sNtud=AT)4Q|t;>6BWzWLp64~u%FCdsky+s44aFr80COXTV%q0T2;zh?9X zXt3P=p?F04i-5mTqr->ZlZmqbF3hWL`nhb|&*uF_`Uu_MB6Gc5X zZQZzS+cwYqSz=wPGHWE6wg(ir0&ex}NR! z(Yw{I9$;FPAZrw3_y17TWAt5H_=8K!8 zavoQ|%$-@a;CXOVl+?45^E0NLJsh;_UC~S*G5@wrtKa3nm0xw~?EH7KCoE4hCzovb zR1kb7#pq|y6qA2GryRTY{Js2qx%KUJeaE7!r+!@eY3|$H(7J2O+qqgleelqHXgD+H z=e?sZ%PdxTCmdh+XPxzKcmMNtDz_Kp7X192YIS|9&7vUV#dF@@zvz<@bAQU`>C29{ zwYiC{^jR3O#c{5zq+D#|+>_lO)ZDjriN5)H^y}2dGwoU1e#$72vH?%SGTUuOU z^X%29M^8>%IPpYha=TS5=tPfl2BGeG^W?a>xkEA+y%Kxb8lmHM@szHv?!^ZIjSdXk zKJG0kzjUZ5Eo9LK!Nc7_wvJ5 z=g6QnfJE;=3iIs^q`N4H`&^)!xM8w%}z~{ ze}DRSSCfwHWw+nid(QNnJ+md}Z?T&@`{B3p_pATBSh#L(`Gk6xtlH8UyX6$usT_W6 z|Nr;;eMZV6&yGgk-COwkmg(gOf9}1DX`cOE-hNm4+y42x(s(|qFl9VoU|^_FSJ>;2 z)c9r5nl(I26P;Hjrly)&S#?S;LE2H!+oW` z_Vu|+=gc;`xy|nL>e0&8;paPbs-vJ=bM65trE_AP^}AL+clo9w@#kH+8S^FOtDbzj zyB{@gp0IDuwzQU?%g^a-srWhN>T)Y<_p1iy&u^c6R_9HJ%Uk<9&eIFbc6}9JEAo?b zz2*L-w)zhbZ?;XXba>9>tTbJRKkP@ATRiuX=)3pQF_vn_%j{=vsm_p?7=QiNHB*y4t17OE z7G0PpDmcTkeVRz}RKmJvcPvz|W8$m~!)CNgzu_>}E^XM49@pXx3=Cztom-zLuO_Iv+X zC?)%D(T>$HH13Q_=?i{y_wsFt=gYMl`+al3%us!XYafk;9vHP>#eO<+pE8C-r8`VI(6%~)#SNnJrz|muCF`!b#J<} zdEfHS$|dp^*Zqsnou8`uWA^tst0q>YR9INEKb$VG5jEYM> zcdpa!xNctJJ8R~vl6~tOPn`5QApJ^uQt+XUSz#?()^ODN-hQ%2r%U&o!HOArLQOdg z3=DgOFGRRb(@J2J+Vb&H{4%bL+dmXtc&a9_3-%vpSH0>Pnw{dk_TLNBc@qMRn{UbT z?I_;rdN{-7gx+Xs$|o_s3<{ zQ)i!y<@4v~FSU}sSDVv%{C5bC61U}aeUsmb(-qXN>d%}1NqSS)@`~T`*XD?*&6+&P zQ}I^BVmaIIkM5~X%n3d;%ja{k^ZK7+xD&VYV6;&yj$mfj;YF@lb`Wg zCx6YE`+YK3j4db1zeq}bI_18V@omxax8?D(Z{D;LHePnYM|8$?CI*HA&K)zReJVQ5 ze&d*RLjB%*`WMPw`g&R?i%q++v8E#QajwQvr_c|2=RTW87cF$qxPNS#xoXC})e$;R z3U?ejyViHhVuxK@H!l_V#A?L4?eI1ylc3oz9tG=JTHXpib%7zUgNY4f2jlGu^Eq;F z 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�WU41Ja_xpx?y(`3gb>AMj*xd)7Ir7MsZm_v{cO}m> zhl0N|tF*Gt&Q7`$G4<`-^(Jo)?ajTqH91PH!= zo4xypor~*|d{>JTzpwj;RGe@PSCgY*w?cJi=dH+_GOE48UEH-RSN?O_<9+SuJT+{NhenIX6Ny#Ub zU)%CdJ^m)4e{_xFsl3{jJ?W|LjZ57vJzVrJ~{X8tbbs zSr)h+&lLV0Y}ZzK+G*!;SJ~;W+WNL#tKp8E{K7)sHv98T-k7f48!O%Ne=}!WeqQly z(*oo8n|x=?US!T*#w*O4&D$0w_1#;miT6uxvh*b8)Viv?e$v-!kT{(G2C)r!0tz0MI!M}=$8z=d=onF!Z z&a(H*GxfUdZ{BS$IC>~)`RQ}~$HJu+Us?0!`u1&y-uAvNw))I0Qo5)3*|h1mtY3RO z`+V(rZ+b;VGiG9SK;Vl1d+W|Q>}|i*+i~a@54ZH~56{vq53baH>zDqo-(D(p-6THC z+iT6XzgzZo-N6Yt=ErOFUthBQ=ka@Xx82jt4^|%+{B-RWw{32X+5s)!=-%ytAw_=D z(Gis|)+Y*2x_W)W%A!!?w0} zdq%8gq{w=kFZ#DLS@oKc zn%rOiq9=KGy7cmSH|`g?-+F(|2iyGM4HxDwTaXkKIDK{TH@||s*ahpi#h%-;4Hm2JA_5y2<7?O65U-P!l=${!tN(v)XjIZ2NFR>rJ5`FTCl z_G|oKvHI$xCRg6JgU7GDs!6}>6?@w3!YAMPccji-Fu5juH*x!u=)dRxe}4Vuo9aKo z`Yjink69GWZSh&gs`RelqV4trDQ_l9+?II%NZO*b;nwQF1wTA$?p(gyyr$T(=1C?4 z$DP}^x!3&i{QU9Dp;Pyt_RKvzDVO>2+a{qL=6C-;Z~OV}-M#*w5;;fD9K3Xby)-$- zbJpg0pJqH+^QC9c9A24)J5`KV*RsaF|DJp0z0}MdJ4JI6)Gr6gnVf&9@bhL;@uY=q zZA{r#xMAtn`G?*#Fwsf_T=C-mRg(u1Gr`DLhTUEU* z_d>?ztv@3pbE^Z)zp&iUezBuXN8Z;rc=~|_Ti)&b*!AL1o94EL%h4inS2pgl4V*nA zc*E}P;d7@?yx+d?eXm=@in~{@Z0THgGftkX+~mTwBEB;oFXZ3$Z#2Dd<;sN*r*AG5 z*tKc%=Pb1qOnQq#4R1Id^Q-JB54gzStr3&y%ipPeWWvt}b|)6(iT#w!z8O_*1-2HjL zo7r;h+^f5|*0K7_PK^xt6XWUR@!YC>spe7BWuF{2{I|IBaa~(s)b(2vC;YNFb?wOF zNhKNyp6kR4GY*EQt?!C}1F}Sd!I$VF# zhWW}%LR48@Lw$`TFBkrrB^9Q)cXr7{f$thx7HiY8%J-Vz__D68t!-iO1BM?rHXgWB zTVXJD^{S^PJC2G6rwhmU==Si)IDMYornZXvkW^adj)R{TtO;Ay@Jr>Kr?daz6Do@q z*FOrZ^ol!gb>!CMuwPDVOx|TxZ_WQ`wtMrV)3au<&zNHnz2e}p`}>pMy3d|uc&*ww z$JF#}tkR=L?a!ALJ8f?N{^HHvi&qZp(R}6S?&ekb`qsUmXs@(aOpzV(+QnbGqz)Fb z>{+|%#0B=VpM5x%B^4gM^3}yWcmAo;2r2z+r?>rZ~p)H{QvLyUKNK9`hQ6_ znA!AsJ;O)mX)~fLJ^D<3aKC1dF}UZnMtj1|g(dNxc0cYk&YotHCjPGJqP2))2v6@} z=RKPqYVQ!ZDdEDf-FwochJR;8J(!9Q-fZumBkH(%_m!7xMRF6y6?lw-dqi>Fp8X zXM_6Z-AXt(RW^zB$eg7N$*PsUm(LuFY$spR12$V)pfmXrd`Cb#2&th8F42hPFuZ8>L^z-{T-)6 z6nm+(gm0rj(t#Z|DoMUVGBtNjUWieXW}0pJ!0hbw8rH2kX3HX9zn1n`ke?Q9t$b7Z zkHAS6ezDRHZ}&5w1e#SJDSvHANy z?Ao{Ta-IJLezC_ceC_IcEPrlA&H60fnlmXEF0L`LpTCGJEc@n`yC3&0e0rDpSM_;q zwu7-MN@cmM{(mzsmY7wj@tI$>TZLoI?HTgY(YIK&*;$~GCf0;AzO|NIU-BM^NpOK^R+3LM$s`H}F%AK1f-v7OR zQoJeYO!a+UCg}tHLQD4dbFnxX*nL>iD$n)vg>pC3QFbPk%Qx=c{mUu;-|WN5x9_i9 zyOouinVG8kGdWXIQczKp88rJ5u;9nZe}2nDTR^H1vVRu<^|^L&rKl8!&$`DBYj-*4Mp`}K;g_5bakp)#8~UuQ?p ziJzy>xuTlID*Q|Lb=i+I*j>K@78Cks!Ms3EbaAr_FmfV@jFo5NJ`nHr>3iLzt8;W z@1ee*e|=bQvwi=S?&YfJS|1Q1jk)Pc;9}l0*88;^z{YZ)pOiH?Uf-ilk z?b##NWm6T^`0cN3=E%MMeBpXs5sf}hfQ zh1r7ocA26N?)}O6tfW|Kc<1ODJDX#n?)MB=O+BZuls!w*%EflY?3#0#)pyg_%y_*Y zH2bXc+hTN~u)nK|>vKs*{=ql>*CkeHTd}*l{+wm0Vk@^sd(Y}sFGWQ~GxFaHNBh^G z`)Pf17FYc~wc8)2)KpeKZoH+oZsE7CP0zl5w!g|z-mWFH4Il?cTpZ00vi;D91%8dTErv5IL z4LvMGNy9>Hq(vfAZwXO`A5YfBkgr!gj|x#(VcB`hIpg7}mZ2v#jn>>+N6Pu<`$B zU(@RmEt&e0JHF=WKA)H#&VrC@Mm=k1$*k-Rm^yWLc4>XvvA4S4PD!hAcD$9lmGx=* z|DSUk@9zo`UwYo+&X3Fc>x)e{*43=Ej{ZLF6Yu5+u2R)o%`S(<-94b2=Cf#BzKv(V z_O8fegQ8@aOJ3Z2Vr@3HPpdA9sagE#`0LM4*GY!=>pqq|ue+t?TlKk%A2-}?PT1+= zczH+d_m>Agbh@5PTPCP`T*W=6d+UxjLEFlFS}GQW%op8Y;Q#2f^yyQ3ns}_|-|Jra z#bWU+KK5KYuXj6>?O(|%T3&m$s8GtuFXi&6Bz|Ie$Ie zb=|!B&z3t@Zt6{ELVO;r3NPbZvdbWMiHKaM=nJEq)$suZ_vKzyHZUE{pWpB3+vK6H zncnHg?C|XA)2G1)j&pHw&6_u`{`c+sdNDgDOl6H+nZLKK|7Y*_v&PRdg}={r@=jm5 z`Dm9{m+xcl?=o9$<<9llmR#=5TlUT*@>IKC((kiVMQWwXBeX+r{Zd=ITKZ|+wJ^v2 z%}H03q}=3xOSMirpZj&`Yzyo2vagT->5>qBJEcx9`NGFlSto5)s$V>!uyc*_MMqD~ zg3e=tUN?M>+&RU$`FddRwf(_V{2 zdT}mV$dgj-{NVZ2AotYI2Ae$gT=;8XXntxx}J;UPPg=0q?!XM6xD>(V@W7yF{FAo(+vfiDsB;jaw`sMbS=cj%? zs%5!M%cfv*b!oU$)%ErYUi( zXv?avlh?`V%cfqQqiI%r($)Qc-0MpzGw09beKMWzlIO~t&P`uE-`|r5* z*s$YrpJL+FVx2E%TbYi&Z|P6`8}Y-RP4;(Q*JLfVn{q3wb@pQ4lbs(g-V>XCuJ&P+$-&C3gGYVsy!^SQ{6B3T=r7>b z&Z2NU{l{*`w)8o2Yn6}RaZRs2J>}ZbMFLBg98A}(h+^65`fN_x%~!#%Y?FFTQ;xFE zj{W7dR`mZLuXj#McNU%DK7HlSuY$)t_jFx+-=Di`Xy)tlZQ|c+>vDJ8Ja&9*VfWsk zg7ZfgZ`*p!S#aZ@VBxJfucNI0+_4Qh9+C8HLSJvFvBtq}{yDj^myF)sUb1xg3rp4Q z!AGx{xw9XhH~m__ap=EK^7q*sHeLT#pxduDYsOxwtR)hYC+EF*WXY5EX`_g@ZNAI4 zy=MP6ERYkJZU0)L3%rL<-_DLvVYe`Qr=Y7wOJ5D{^mg?lSVddnvY7=KZ&d-cCFb#ROCZl-&cC|-$ zuAeiWkr&MTdJpTri*?Ie88ebhCoWr-ml>*P*kiXPdRv(#5>~PMPy5 zI!){S=@qj=N_hFqo~wtN*!7f7zxp*xLMEp^V#e&--xjAPzUtV#)=S^fX8zOV&!P^t z?Je7w?VVex_N=j)ebL%o8qXVi4t+FwchP0%?nknxUtR3{#=dRUv4fvo5+{C7oxDR` zx}vS6%W`h(O;cHC-%P*jKFwhpKmXg7cCz+&l45as=~hki6IV9RsPZ^t64bTwW~1zc zU!QB&)g%U(?LSzv%f}}8QOaavF80f*e$RC;O{>0~Uz-_nJ32ojKW?YbTwiX3t?Q$t zPw!WKA7CD_=KEYP*X;J$Q$s7BH~uKlK6T}W;?6w^hfZDFy~FB!wC>V9x|c%k+pV=a z{{EWm*?WJ*XXzyPTvz?!cI;>ME!NPUYsX(^R4wcADf#hA!@lCu^w-bCCPdAX&dPf? zlYg_>uY$()`|WS6<~NtN-P`=TV8vc3)~@^9@}KYXJm^29oGjff9BeF~@>J}bo*YNN z%lSDW4YOU(KU&tuf8ctn`qwJQ7mgh=j+fkiaGkua)3T@D|LhE=f3r_1h|FWMYcu_M z-v0lc!-o%_JbCiw&6^i5ew>}ZZ=%}Wf1J-=37y{6x3_zl)a4@Y?k?@qojUg%atmLc z*cY*7?$cH23Axe|0ltgYi9VbDHD7tvrFRbNmd@K3obt3W!segFwyHKQJBcqFwi%gi z;m};ACX;SzCzF5D_q{_{L8iBV%om<7O&E2^^ZY zro+f}lDU=0_rqE1Ht4Dgcs|c~8D#BTd$BskB}PZrD|S(b`Rn2)qbk;UOZAvwsoAw-4(DyFnKe0z!hYLGC2qQQ`_I~kLCmW+%<(-|_;SieCtl(E zya7KePiux9yC#>H=y-MYY~!C#k4~=mmggVqc$4MD>$RL>zphPtx32SZcJ_tl-tLsn zefM7{uU!6I#LQp#J>T>r+jY7niy!8h{rV;LFOqe)e$^5Aho2@1?=DdKS5}?m^^Z;P zzk$RqFZ&%896v*I$|`5RmfYcXPU*5(o%5E>)kd58>_Q|`UI#n7-;dS^_>=cTqEM@r z`9PIyb@{qA8s$>Q@6NB96dbVqwD4z*83)((?OUj-)!%ym(78VTvVNbWZQIh?ceO7! z)H$*2wB?L<@83v7E-(`$nHZ^oczj>V_J0r6FsE^|O?`}pMEC-I~ zPu~A4`I8}E`)?nng2z_n?_^~Dyx#v$`^%^NM}k7SsqCvHTm1v=E(lxI*&8lm{2kP@ zK0!U``L4Fs=(9)e{mv6uYZt=1hWq{9?5wRH=Pf-MT;bxocjomcS>Cf&mY?DB^^sd^ zuz@T0=Ho@+evNt!kL1Fol5+KeHU|}p)Aub}Q&2YFea368`YZd+FYGm+GWDv7*wUq2 zea?Rif2xu?b&7q>gc*UiZe5u%Kh~g8U1!^L(J9yLbadCemv~t*W9ogI^AB^wQ=j+i zmvl(eD5D)$e7mhD}rZb#DIVw0pDc z)ApKX@2!5mcjxvw;+c+JlJ_Y0Z1_kVu7`Ec|7KhMnD z`DB}>#ccTS^Z9(|i}xo^_E1miF$}L?wzn~J^Y!qlx4#}0)8`Aiz599ClJ$R$w@z|B z_G8PJ(%%sV_E#?cYnjKmFU9@vy90M7_~-?4FN&Cz?z8@pDYxT=S_*u+S4f0tjrZjQ`jUUN6wstFS(&lZr4cb+|Q)zzY(yB|IF?RfcXikHn>0T#yz zbAL!Ii@I^~!*#FTjJl2~lkZs{T@;pLeyKvKF8bXTo}e`@FSwyeiOpVh8k^*X3kU+TJL z^G&e@m&(n5N;nFzIF>z1u8`rjYpa}p#F}B*<=AxINkv9%l?Df%h4`jBz=qkw!1I^7E$cRS{a})7#I}Z*=3&)Kt0t{hQPxq8}Cge64g*D8F&P)--R{V&TQg z!8tRyVzs7nOso8S$5rvn9lhX=Fbm6d-v>Fkbi0Q zexsj{0y1M?KYAAIy>?N5lxOr0>3K<9&wsbIO-rpXQ{re^&|g2P|KK7eB`49tLL8x9 zKSFh;o!~vN=*WktlpoUzmWQxS674!-l(AoTdMEGdgR>tL9X{5P`bgGt;@J%!&0i;L zFq&-Jv}KD)ow9!OWtq(T(QKY(&rEmWIs3~v zJk~~EIQ^p}!_NC9>9@J_Ty3NUSsX7M_pjyAKUgeK-c`;lFn9m9pDG8A8_ZDk>G^TdT|PBEeg7Nn z*_kJHm0!Jl_B)&5k=8}_mwwK2FF5elZQZ>4mEy;K7uY z5#GMx*mKxR{v2qdB)! z8*+P@yY|Y-%Uc#bne1=Z+1F<#RaY&4eVGl1?|Pjb4})!tqQzt<2MbBpzppaw@m-VU z^>yEalwbGQ?RZXpQ7(UdAZA8h{=NU7wtfiEw{*{yiso6%P8OOqX7=(_ZG1aDy!xkdp!s2K z_61wbo?qO$VHI0e(2j5$!`&By&hT#Ea&BIQ_4}SQxA=!&*E1W1yRU-Uzt+x7tMdBW zqpv?2F1d2`s^iqZtL<}EDXA$auszGr*!Agdx!=mHy=JP9PEGwZ@!jv^{1)~dec%4R z+OKzMTKoIoapxBv$nYxOZquw)opyWEy0`YFhF_+g7Zjen>J+py>QHJJ~Z( z@ZrrR*JcTJX4Tdtv~1tg6v ztLlW56xMcCHvtw$`TYs2V_QCM{671$VUq$!(;i0o!$x1^;$mW+?EmVZn8?$gJGI9S zq_S*dfA73SmtWelRo&0)X=QonB)#SN6sX+l{@&izj>iPb-%b1Eym9vI*@+U_a+paTQUCFuNd%xG(#_e0A9!87aniuotq_S|^$X7$ZH?g=S532t{3Z1(Sx>hfJ0 z1dgKB`-d4_IGrx{5kck%Z5*GCvtztxUHLg^y`Cf zuNE2nw^0;y*A_j+tB|%VK;uO+i=)63*)N8FSg&ew%xw~%S{r##{{QFW|GwIu{`2xi zas40h?g^Un8setceZRMN#~QK5xOuNP+b_upGVt}(TOr=ja`&m>_jh;Czn;mwUW;S# zIrq7n_y5@ut0it`x8dIV9~n_gr~3paIls3(vtp*i`tAP?%lq6_s1WAi$DK3 zdYk_+bIg0uvM<+DE#{Z+cvb#v^?JQ;x+}Lz72L1sSsNWtB>r(u<=j^lM^^9Ht^IOd z_vYK8-O28`PI5bHKCayP+F5J1dDK){p%;H1Rv&*SzV-g+U)dR#KNX!_yMI?|@F}Lb z`7G)&+kZW>oh)ssYctVjX}}2{hek-kx%Z*4X2avwH_sluzAwkAw0)`EcMhos`jdk5 zZqAth^T%HMozK6U#Qc7?|L^Vf>s7uVE-U)`{r|7Ui?4+(yDx7OZoJZLNB@V9TV1#e z6_&I-tNjz?leXih`v1Zshi-j2kU0Oy7lZ2lHRnS2Mny=zuDy5ZOY{GqsSZi56&EhP z_!jDTda-jjm*&wrz3=bLCkg4_KBjlrZHm##kT!6xyO%2OT(3Ukk3ad@En`O4Z$%E0xzD^eFxiNqhJ7eeU5`uP2?CyBBY>^pbYy={?70yXz)L zPh*|(!e6(>-6C00{rnGmy}j=~f886#sD1ylbbrZ*jmaJ!sa`XF-}IPqEkJ*|6X#O4 z9?>`Or22xlh5e9__mZf!9YXb&Z<$R@Ke6Af)Bc6zo%{C-&%ZoyQ26K zd}LQ`ww+ntH)lss(9FVjH>Rtfi-?MfTa~80t5a$HADXQuYUEzpH`}R_PziAwc~5&`h6cY zU+H`;-zDp)K0UJj*K}n&%`>7Kozz678B`a8>a_{w*N!J>Ph|X2-gN)7W@_20SVw6NECvrdw1XF=h- zi>|rZnVGV);=(dR1J3HiKE81KG|yx*L+j!^P*g=!H4JO#wyn|dVE?^0SU*sUpEG5h}bfU9Sz9UoqlN2g%3`O z(*>2LILoIlnz}hgY1#=9qfUu?O>Q@X9*G(zuF?WLN46rjEej( zB7Zr_|knsrC@z};pCg^IjSk7a*KC}n>rjE|4E2Pyq? zsieHTxpw<4t~=XaFRFRV{imVd{GtL!lfsGH2fGhGwLZ{Sv&I?JzTVFEcJ~Rt$Djfc z)EeRd=>}&I0hZbxkOr`;aY;RyZlMCw^5M}1dHci+pD%`=g!|dg9NW5O%aNx=l^jh9 z)eEs!^46sH*X*K z8lX1Wu|`R#vnQ!(KQ}k`ginj-y>7g?d)KbA)>{{j=U+eAa3VrO3X^x{eRSjqi_Qw(15QCfm-6d>-#*;V|Nj2|{|^o}*Z(*y|L5=D z?P(1Ys`!6IeBbi&*1N33-^}EBW~5gix4X7#s#b3qyDx8P)KssXri=a5BBI1JOzgk& z+=~*O^5N@Q;dN8GRJqRXE?GOV!}XKwn+a}fgI1P@I4%#=zG{Cs@#=}|N3{+&IVnv_ z7H4=e{rkpK3_5rAR9?P#apU&w+m|k7m9sqT9UXo9EKk7uz2-G*gpAr=ERNBPc^57w zQS7bsXra2-*RMY#HXM+c^y=_AE-fYLO#<$z*KKlgxopYjse}ma^8Og`F+pVL{Ni5}Bu`YKZ&j!}6TywSA zO7R98&%b$ka8t&%{j*Now>f5%6SMbHEc^QGU2L7@Umx96d-V3!zn|&vb4nInOuVtL z%A51K^{cGenU7z+{d+#MYmTOEzF#OW9Il%9yYv2^`udICA}_u!HQ)c) zNi8y&WWpd-oO7}{W}v|!=+U_Up!nYeEjUU+GL??Kbj7=T<)BHm+z*P zb@Xh@c+dG$U*A4_cHI#(`?Ci36RIBQyPw}(8M7nu;{PWaYy4Pt&Yo{w{^s@L@TeWq zldgH)JlY?#|JSjVNg*4K9#am_c_Wk^Y0Z&lD*DeZu3Tz+t-sanz>wIp^-3pt8uFRE zm&YC7D`IST;O5PvS6}@QpI=kjsCd!zm_^&P4G*>4{r1X<++6GusIY%dzv8PWT-2Y}vikR&;GyBqoITfsnp5ME}UiOVoZu_Mh zQL)jx{2k(!`?UvtHM0xTExS|ndB+R+8Ta-q3qSMp=#JgDt>76?$_;bmZ9n#`{bBnlpPj>BlT6OK*_HO>?Oy>GW4qv?Y%kk(6w|&$8 ze^|7*dF}V!N1;a-+_#g?o-Vxn9DBgc>@|I}*4W$<{(I)gZ}#iHE5FP-xnsc+#l<^! zti2Z&{v!L;yEC`@`o2xG6a0IJw|4c9zl!I~dKVb8K5snyJg(AM+HrHr*8N&eW z=WiyloR4E=n>=^Ft#q2l6!+aSJAGH}EdOTz@A3KgnA(W+KTTgIr?%(Fo;p6CQ*`;~ zyZ_&a@N=(xem?fJ#El)Fr+khM)~o;1Ynu5c)7v&Me2#a3K=Y1yYr>ART3g)M$znT8 zAd}sjxwdxiTEDqHc?#bOw`m?b_vlFa{@+i$WJ(v9AAP)NcYeS%o#}H0Q>uPV34XZ3 z$L#v7uz)@5uJca6XKrr%`@`PxW1rMu} zuiX9iWm)oK=O^NyKK}S&p>vwo;nZB~@-=JL*!_O9dH?U-`+t93U;j3%;m2L62KN)y zhmUKg+5PBKAS<^J^_Ump%EWnOviy?oKDIWzOSxBWYFXSK!ehvxEig3&j{ zwCg~L?3lZ-7;xv{@;_0zg$;{$*ozJFFP;#sRj{%{AN**|}EwTy2TI$@Pl+2Nqv-xwGrb$@%vCLM6S$dinR;?YZBq8C{c+EgI$(!nrC;YL4Fyb6uhM=A>PkCKu*0Nr_!@eqS-opkxKt z6Y-CR41w#n$`i9wM7{B$2 zlgsZ;dhn7#{l}B3zwWL3-56IMb^U9TS^4wHvPOF+&3ja-WutiSaafvL)8g}Yn=1D% zyZ`>t%2VoFXDGMUwZC(gFnRNJYqh9NZJMaeE}@V)f-kH8UA%n2>!g1FzKr5;lTM%X z|K56?FQua5uBzjwfK7A1A6``&HhueY)!y~*Jw9yjTzziuudmb9=R8~y$9qOjVm05! z?c4Uh*!}*%_0H0-2aoHUcYj^~!Kw?j{pRPTKI@$$pjlG5_L z7q0rR`~M$LFJHBMd&u4IR+d%Id%Dd2-kJR6#l5>l7k13DF1Y=DP5bKO3(xnni1CQE z&c3rM{*wPhzF3ciSL`-?{@T1ZZ+G!uw}{%hWz%!H3Rh38`MKU)+OcQycE0MP>g~Vo z?3yM2`^HH-_I<||&1TOF@v*-=DPhsc`{#~be17Pk{=ZrN(mb}MhSdV!>Yv?8Ja2Ta z$Uo=7)dg-drwG2N+*DIysV}kb!tUvZ7fHDMSe>=+Y0~eE#q(lJZ_7xf++{Omdvx%E z^>psz7mlCMf0o=)wUkXk)xtueCMG5(Cne z|H#(3C2>0af8zgt>R&fCc4=N(+{3lWyotwsay%?G%hdWKs-CS~@Bh5#)y$vk!oENH zbt<`Eruc1Km`+jpvgJRXtkI5$|GTKa)u^{>)rli_lq{@FRh6$jtDb$L#pOJ=x^&tD zrFXS9TXMHtdcVN?iOl9#SKPOyZh0pVf4w2AFV65yZn4dtv<;@Gu0L|BbDT7_JgqQw z!{ojG-xN%5|2gvT)J%2$?9F<0f)Oka6K|Y6yq&wPdegcY>@B8G?aQnS(?2_{i(dY7 zR?Qp(h0GnvzkEFk^CvZD2S~Y0-4fyb-P+a0ZT0Nanp)AZ@`WFLQlfL0%xtZn=CL-- zxIOCf9^L+X60uTWZ9ce`q)z>B_dMoUNalu}$KPJ*YA=6#_tU&>b0(d0mHoH>-(Q!2 z<9mXZKT@%d{+Yf-@cC7hm!IG3m3>k_q{DZ!eY>Qy&r2rLBhR>a<)X4wDzE#=?47fB zgIe0vdqv+l6oS2U_Zgmk_e7`Yxb!M+kN*65KhACK+PP!Ljrr4qP7CJMCam=>|8KM` zdbOnXH=eHf(_WWmZS}IKK7LtgNlMiATOU7Mdb>|u@J&|rmG8fGi`%DNlid2ePv&e2 zm$mX4+5D8EYfFwPZEUZeJv*Z&?tkm$-%Q;zdp;T5{~^{Jw>)sw5#goJ&+VT0yyfrB zhuarRAGO+Au%_a0CR|?beCm1T%jJFd^t5(9fAc;% zer8tvfu*gM(nat7u0CoUt)ITw(!76m%UO=yG5de(O!nGcdc$%hds)$=Pv&|*jdO~2 zoL{=yG+X=cbQ%5-zt_*L-u-*^|IhmB%(DSLKRq65c5^>j+5434T`S9~>9!r<4BGc%2!K7IQ0=g*}}m&V1#U8p#6Atp09VB+3~kH79? zeSs%vk8WG;H%r$3y{PELu=ra04FZoI`>cO(EYf!O(}!oL7%lY* zs{8+FqO&{yteqkkrft|)Wi9{RBebY2_{-cMNsn6#7Cp&3v3NyChjgut?qaQL_N)C@ zKd~({wahAebLHcNi8njf{OCB+$7+%HVaoMqCk`H7&aAom)Wu7$ziYFFdf(k=wwzDS z#PWIh-uIr97oTj)IR8X#(aCczH(Qn4zs;`RdZsh%rD`JMP5<>9qf+DZ9vobpE;CoQ z#{1=&RU10CL~VHJ66ulRcl*_!1B*E(tZNGsDP3IPqd9j^e)$KEJ9Dd!_-%BP`#nS6 z^3{_^O`-{w8HjP+;f`1AK>-21d6)VHqYVNQTuptM2Yv-iSx(sTIN ziHWsa$l2DPx^zf+bxq0QqKHF%A51E*_*{9fbzNfNz4ZQBGh}QF-nbdLuDsLPrG*~j}qOq=i%lXXE+LzmX`eaJ{ zvnOVJEiV0j*6+^z+Ew{qD|S!t^k78ciN`xqC$3OB^YQoL<>znAJNsg~ zU9_cv=)0l^E0$hv<(7MLa;4Ay_Rz-y%Qg$|QI6W--OO6JvGcCd!<3vGPx&%Dj^`I` zDbbN?4EDb%CoLm!f78tybA{d~$~r3gd0fg>pMR&6r+;Gnx#JfCymJ_WoSdEi|9k)c zU;O{C@eBWdTwnKfb^V{?^)_X1ZhZJ)FxRhrqssz$kuCq5QvdF@lRGi_)w6W@Fx%U0 zQQM!&@6FrXHfu-z#l+gL-t*+wKkEO$y5+KIr`T`(D+YDz^q2ozm~AohZ_TQtck|ef zyqq4KmuiQ87hORwGc;$@_j z=22szpG#|aoJ$(}UD*^=)zqH7=b2+y`)mHcm-7=CYj{Gh)f+MNPoC+c#y^H^XFi|9u8-HI$w)_jiN5bV@1r5l|2F$WZzo)sE%oyAqWPJx|E&Bt^(~w9 z#IxU@rY;FBJHPi|L%_-GRrzxT_da`Qs>1E8nyERv#CLz&5 zDt`%W{1#(y&-9nXPfhmZ(o)erraN~ITADX0aBNa<ja1SmM`+z?T-EP<7j%5nh@vuI9_6HRlkO0?VmDPo*mjI=eBn!a5PQ5Dlq@R0{Lne zpY_*|OD_&pw*Q$>Qd%nMZ^z;&kn;M+)fbQDC%oUhVoB1>pv6C5>fOJ6ac5n!9cK?{ z;QPXH>-)J|Cpc#7>T5P_+@o#%%e}2CBKV2J=hwb5o&QeG5jrpV{p1~?*_{59ORcUx zQki^IG;6+}{l?NwUDMClZ%lpEm0q;3WNZ3n==|{RTgP1tv@-PY>MEF+F$h^5wTT9?m{l`A}}z@jG%oI;(naPtoU3yyfL|Lt3! zZ*6^j{ZcktN?SzOek&N)M_M3PR$d%a<*$ zw&+|cUN+b2%fC$X|Jm2qsZI^%lB=HY`|9%fsWMx3p1IxVpzq?0iW4HcRKo zi{;C9L><|BzI>_0?At$g&i_5PH9gR^ZU0N%HosY~{^i>E>SyuW*J!WZuJPl-@%V}# z>~Z_c)~}h|`t>S!Awl_}F zxpv{iiVF`Oe|>27iDR?bpEvUTw~WHR_tRE zUb<^#xBmRuM->h)TXHJ%rX2L(EVmGIy=c5?zfEm+(Edr8$(6d>PQOUL81j?#^I~6_ z+Tty}kwMwNZG~4~_%w4`%lR{FHg`|j%lCse8;!-3xb5#AG>&T)y-co zHmkY&@Xfw|`c;tBzTmGu&AWR$SH8T-zBBg2%qd3>d=}rFQf0eZ_vf91lb4^56zw~0 zu{KbhUvB5DtLI-UN6wV9s{8Wc?3884R{eOeDe!L1=J$7H`uuK))Y&gCib*cmGv%^m z^>erXUF-J$IoR7(D7yOI$DW^++}W=`Oeyp7bxL?OB`8GjU8vPE!7oo^x>ko|O?j(X zr_MK9#`et=@0rV<-7V=o@GFbOQQ*tR-53A=@SMMN`ThHw-_9x3H)#!9f3bOQj@JSLxV7Qawu{n2=J-k;66zq8k@2Q5aBe_tdoz39pFY4ex7nDc zUz_3(`C{4A6L%)IiGsP_OoLC-GdDucU}N3DREP9ag_gm zX8y|Sk1cNAt~1=bcdyb!j`|jkCIyDMe(v(h`_CMlF=NJz`SXvf-~glN5e|9-lM z%8TSDzRaR840dq&7+$-6-F;zzl_03X2+)qnQr0tFcaZBpo?_Iy zcGrdDCuZA8C?w0w=XMl0a^lAii!ED^{X2d_zra9(hiy(xf$@ral2V5!ESM$x^iHB1 zi{pgtOnVbMR31-geepQ_`nq>pLVvlr-Q^cgW#4)4V>6@rdHfNPCn|*Ds%2iwY*@v(7-Lsn8VQpu0IPB#-vlX}R zT$t8#et*UE+BMf!q&Dqbxl(naOrB_biE59mk$<+9#_P6QGH@m5H?0b~b~?@Tf~}_euDdf|8y-6A z_U^VxP5rm0*4JZeE*~#Y(h~9NjoWT@O;EbXw*T10j4duxjaN+lu{x~D?&^g2v#(a2 zRM^VRbHCYfW>&9Zzu$6!4{dC}#8|ZECVHLPxa`ZGXNpUsxL;?oZg$mt*l*l*+KbD` z__W&&r{?9Iw{i}@`Y`b@v^D$Fi;wINTlw%w{O*L>cRm4L&Vf-A;?vak zxS!l1Ic>s>Ni(hVFZWHoYguyP$Qiw~uygDCc`fow|2^uR<7z7S{*@?q{~Wtt+y8$} z|NS}r?_;57Q>wnY_?Co(BnGZ|?8?79x&7|rsM4ylKGmCU@BA#**Z8(rOVRfBWz{(g zYs&kkTs*#d_3DDAQ=(dXtM+c+xoy#uDdG22173@>z2ffnn8{gq^hx4Ix6NkG`scbT zMWp6MUE00LCMd??lxirCZ}IQhMZ(FGUuA55oh_3U&7JML^GwcZAFo=GGWE@^jEB^w z>@k`-fBx<52^BV%r%aE!r#8uZ=H0E5nvtqouPk&ds;uqzSR5;nu`)L+W8M4630X&i zr+k^xa^#GcTKQDtE0bozKU$>pPA`nJbCK|qaeY$UmI5DFL=NF{r~66T?Yi-u3GW&+A_PuoNEVS z^{+2__i@{q7ukxUPy2K2P59+!Y7|;M@Ly_fb$edPhrLzbCi9<Q=yv;5u~$_^ zuZrsdIbW z3{kr{A==8>S9guf!r&qy;co5KNlMCH+1Z;WeV)0ewQp0?rDM1DJbCnS>CatjS~l@L z`!uT{b)UYq(aIGIwLUs}FivH)mym2yIN{Hf)PMBo(O0it9XfPq(j=iD+{GResW~;` zwR@7~-+#_~usWe|;kS>H>vs!I*V%8MATCm)t+FX0rK{}ys^AN``&Yl@{cPJhFFfYc zrAabp~U%G zvpm83?3w(2aW!)!68HW0_Y2Rv%f)#zTP}3(;;&a9BwJ<#uYJ^S?s}K^>AznsU1Pa}b2Tf^GR>{qVrRO%b>a2y6FV)h z_U5XpE?Jl7mFFeuzkYts*>l-aQ%>^Q#U(wPylMBc&UWVP$7dy7Mep{e1`3`O_5FI4 z_pOiI{`E%7H>}yUYFA>fRD+C{l1qIU3*T=x3z3zY7!Vd69ew|X{n2oVIx|qJ zWRxgmTypwh!KziO9FCbtos}?m-gWW#h5MYfdxYi9Z`LG8-Z!)}jVb>5W#Vn#$!`tc zvA>loxORP475nwDX|p`1|NHv?N3q-UMHM>Nubo}CYwMkN#gkY3`uH+3FMQYhlY;*b zsvbPz^8Un(BQG9bl$oBqu95lk=_=mCA76jxvuO3+@@rbe@n&u} zh{~$DTdfQY&!qTW^1Qc>|Nh=zSuZ&BCu>g$atsfRa&r9qf@5w>^o*HzF9gk=d)H#g zGv1|3MK8^KENba_HFk0B)SDkwxMts!nH_jKJnNa2w{THbx_Wg{=Z_u6_WGOCb2g|b z?o93RRdZc_mB-^LS4PU(2mVi%s9*VVZjFvl$P(4iOA>1~K0C6b$?%?3zpxb176*!vy@HUhu z1~^&Gtr1;Bi(~CY$d3kd4MA5$&TEdsl>fD`BeCf)Uj^E5} z0jm>4EO*7dkG}Xi(pPZfL}Q_=5jUA9FJ30rS6E!+_tDm0I5=4N`02AgOE>#D&xTVE&)N8B zwfN$Ddw*p~%<{;`!+3n+z7E$JC`jhM6kW*rCquf~Vj*XdFo87;QfBVgE z1?9`K)@)AybWZKct(aJwdD)fU2UOjt#V+k@>GfGs!1DNvR1rPT-E(>YKY$CE>~&G-meai&d!;@eXVUy(8`-Kj(Ehszr;iU9yySs8t3McNfas1dRGQs57aqDM0 z?T+X#*>l7GN2+b-cD0jY>ecC%7gE`S7C4o*?A>O1fAj77>wIiKB%;g@RBGN~oGo0w zf5x8XIg7-F=X+K@b&LCSk)ugrJ#UAPf!)8>i@B03vi*HMb7k~}+XC7@=gWfHWXuye ze@Xm2%E#toXl8HU4_b-D2wJOiApVQtr(@b|B~}^!7FJePHa0e03LKlZH)=n;az&&^ zvgxy~(*B-FQ`-dB7l_!hIDWGzP;C)3`QFiU@p%5qNrEhn6U1--Sp;bnI?BJ_`y--X zfurfg*V|>Y?#AwJu)BBkyZZ&!y0Wq|DX=@5GY$nmS?krNt+K>HT|**f^Z&PPc?@mO z?(Gb{csxHmh3D`6g|-hreKI<;YX@jNB)l<3rgPW@K?A?c00v5b#-7aTf z_@`CU=)hX*8m>OOy4_956F%O$B^4H=$k8Ox?$Ok^3$$v z-!6z*ueasf@i%kBHcyQ2RX8Di%%bJPvmY@>Od1w1UXT)TL-%R>$GHpM{d)d=W8U)q zHKo6FnG=-O+ej3A;$&ee==WM0ls~hhx#I6HgPe%v_x|~AjZzgq+#<}iG;6oak%w0@ z&5X1Xiqt2@cl!ht`uh}zb*k=-J0_{Cr_`&T$y0PaW9y}h%hs&xHTzAo$4L-_~E_2=FNU2gf}`T5K9=LsRYd|}tZ&UDXj zJGpCZu+gh;*Omy{zeujA^XYJ2KIi?~nhN`UOLiG)nyt*O^7Idx<#Zv9hkt5|-2>Hy zf?I=j8qVnrtoB;^QQrB$Dx-Y?lEwo1B1}b}?pm)*-R!hBF85B)tCw9-d;M%er%brM zS)t)@azx-ym)}_$D*c}FvmUPG*?LasTS8pkvlEM?-q|gbi?FyocVeiKb`w{21apqw z8;zdzi#~2S($9V?aYe$^sT13ltP!hlS{JHq&b{a3ORlA}E+{Nk*qM{jG;i*7=h?!I zFBK!#i+#N=^2Dqsv)6HR(9WIn9!`C9@?PeauGU32+54#j(Pi7^&bk}E4FJBDLC$J?#{whTUP()?S6TVxQnk_eI5V*jjt~?>oizY^f;X_ zk-_GVQWA%5;o2anE{7PK2SV99iX3NgJ>uMf{SP0 z@3+s&`ds05YIWzg%{KMt{zg4p6&3&Y#4XdAJ)yVUPQm+M}ox4_T znk1y;{64L(@aC3ntFC-`^Q!OS(wzqn^~`8lb0~3L)7ASo%+3UQNA#-h{MawoqV~jB zXJtv&4#Nv)g1U>MB?7jt4((dLLiA%NC%^Oiu>Lixr!Rl)RV;MbL)KY&?$VXl*SCvo z+A~+hm$|sMxgQfhe=5-}FE872WwP6v>jKU*l{h}_Vt9N=_}a8-)A*QEj3lG% zbNQxm=G9$1ZlG+Wv%jQUU`kgt^FHhBw-4v~&0o0e&h`y9Z)TaVo1a%uyveHg(~rB4 z_|ocgH~joLdAV<2wB3veD=Vh(h+AuKPJW*JN|MXc-1b7*|A)@(em70dzMgV<>%X$+ z=jLqj%aRDoD6#+co&O_)kKh-#nmw0Z{hJ&9)#jt`+5qD>x{J7qZT)6NvR2;u^X+u7 z;`ViN_O-=f77x=)ElpoGc27@^tv;=4ym?8VrCfdOjyDHaHmlb%)!5bk=QoUf{dT6^ zzn!rWnYmvKO}@1MHr*O^?$z49-jjJtzg`KSele{z$?fsuGsi^V1_f8KRc373tYW!y zijm!w2~zXzclym>T9wNF`f{-LE^&1$<4avHlmFiQ*e~^a`HIw)FG~+|&5hD)X5YQ) zA@!|JE2pk4nUom}O^slCK!?Z%HrbY_V)7X>gsZEc9WF8UwiR5L&dwN(Jc#hSU>pD z`g><&xlZmnl?hJkZtqTO5Dd>2QnEQ~|F3sxct7FyYe{H`D)4K*ysIr*5$wBUNpbxS!XGDEj<6LVTm0Z>&lQKv9(%ON}BrCX6tr{ zH=I{#bQ~5ISm${ca?D}i7b<*9L^PP{(GY!cq&a1nt5U)5xGp_}N2H5Ucmk^qk`qkHGO8OLDzb})yxY@*0s@5{ate(tWmHp|n^|GU@ znJYK87JL2u6;NALS)1)z7b+dhW`5d8^F@U69PLi-evfmfd^q}jR?kl1ow{V&Igc;S zTQfz!JY2VE&MUpXv|6q83o<4cUJjV!GJv?Fn<(6{EL(*Dk3kJj@vlJqJ^cZBLL~^f0&f z&!w}PCBMG<&3BGVz590i-WcUi)ti;(#%!)`(`r69bLZUx^WXaI2QKxv-+Qi12XO zc2e%feN~r_dwY8ySs3OuBlqdcC4MX8uEcq2E$!3q-(u6J%4@LuvhpIS_L)ETd%?-I=$Eg02YqPGU z-tzRcH71ISmSs0ZO`8c6&Gzh9_GO_@uU_gt)tou? zZ?kVwpVVAF$kZ&{ zX|q1HM)XiJXOqHu=>VfG)lH3d36d#$X7Vw<=(cOq^M9~&dY<>X%iOnO?YH{9oD(C& zeWb>3%l?_ZY&&0_GT#=+d-vtOddt_-rc1m^Da!WIsCe-!(j(dZ%}3@&%h;*q=VUg0 zI^WM{l~uKM-ReuH|5RVP;IieY;PeZ#jxKFXdnK?|<<4cjijqK)+OsA*vVyKm%c#=J zkw{Ws`6V^A@i(VL(4*(y4Hc4Is&37gHFNgt$fMW#1fnl(2&$1$c(~*FVa|nNCv}Ry z@4CwGTmCG1v2gOUC9^tTxi3>cqcc}Hf-CN*^Zm(b&z7xYykcn@7(ciD>s4vHwp-FW zHcmQu7khIXe`WR5yxA&h%IhPxdhxd0v`%XW zJ#WvGuV%(I-(T*u$L!kGOD^+6S3KoDb8b(|kuOO`;hU`dGT*(JEqLn5hR<9#f2Hv6 z+~GBfjXm)R;Wp0!nPy5|v&rav+s^CNiQ z?4HT7zgFNww;kL0y*18WQxhx>+OHCO^=iSz4JA8u9@nKDo>H^p!=9g#?$+u3OaAoj zI<%wuXR(uGXwJ%^uyJ5X4$NYhuaWW3TQ!{Qu``dZlpI(U7UnR|+p% zrZ%r|>R(??bG_DneXhyQvU1n_IafyVi6^;tuDtBM^a&Opy-iniklNxADI=DRQq^&evMF#-o%3+PH=2< zd!x2-Qb?K(+s0gt-49PI>=R2W=h>Zc$9bmW#g3F@{T|n8lJh<|$R}Mq=GSe0nkQau zW9`a^(KmNFK4zOYr9I=n?&F^DC(o|->1yyEbrX1!&a}??{L+Rc@jd4iFH?}|__NyC2)OnNe0qBi`^)s>65mo7ZrkypA- z{ok(s*?$YAueY2u&8YDGvQx=wfmTY8rOEcNgQA?j8V|4~var6`uUYw2?x5-m-=7u6 z0oV3U`1I_b=EofA6v>UGw8#@2szT zv54WjaQ>C!C$i=BCm(-&@M8S^R*q}eJ0s$>1ckcavo)3OxY=e=CF?lBoYzI|{7(t3 z)$Q%=itqkZ*1cm|=&|UEKzMS;?El~19{kJF^RCnG-del1V;?W9W6WE_0$Lvef#WoI7z+vxs6%1{a0CrNuS-lS_$^KhW8lylsKB+kD#p=mR5;$A%8t*#a8^ecU9SyR#)sGIOUhENvCwz8(JFOa5@js|(q@ z+A9TE9Jj>@nJbGWh)V|n&r2+(S#$y{NBBoTXk=B->R z`Oq?2C7=ho5+O9S0SL5K9ZxqUUWveumT_F0+GeKkQv)sS_K z&>rVM-Yc#>@R<>GF`?k`ewS5-^B-<4oLCY5F_?kV>GJ0J_m5A=-}?2>{64h{(-H!A zT#zh$TqMkMNppeg{aqJt1wBtrFM4ud=Z{~V?-qGK*Ezd4FYSW+t95cV8~(5G{&-=M zo1zYX>HY2h8=PH4%NPAQBLDwseSMNtxM9$Qgx4bXH>GQ@2k#$W|ILtL-sJr<0xM#U ztUA?^FBkjF_;!);?26NuO;wj%`Euu*qFD6`OH)Ooy-O-*ZTDEICl?pu8|b}y_cN6@ zjhBv@J^PX1niiCl6(k+35ht-)&&U6S%EaF{v)-<@`&8Ma{+ngO}pCV($CG= z^KnH&P3vsoht-zz&Mj4q=Q@9K*Pi#2_5bdUSp9j;%QFr7-{QTZh0nFmx31_lu?rK~ zaNc^0=Ksd6OY`4rC?B}`B&yJR)${M$yVX>RLY>?0pFK3sHafl6&P{-&vbA5)qD?LK z!On0VNnWRE-Qrrp@-|)m=g)YYTJGHqk^Kz+Oovf!;d%2{&aa#aTk}7lKj!>n^UWLgZy%2CglG7 z-p;oES<%k?Wwz5F-VQozYx8$rY6$D{-B-@vw!iQ@NUL|d&9zzI44$mIz4c66XH$o8 z-A|sq^D5u2-rO3XmAAC>_0|{F;d(ot9=hdPZj<}?^yNSOM}t*nvopM24NgFxjO3f2 zFVSaj(Gfipmb&~xh0ELA*u0ut;hha3X1i8R^WA>@Y1q0IU%73MvOd+_a_`)tKYzBp z`zPlW8dX*3e%)fev18t<)hpJ$e!2ANa<`=-*S2mqE9LWB)3NYVlwNc0Y0>B!om$g? zRNl1*?|amKtqIQZbNzln;^n!U-V;r&wyHdQl)nE~z4ro#pY>~>irqZ&sGD0p$||AO z^p}LAz!O!wd9!CTpZAR8^9WX&q3PM9@p{g@*)LA`om_Ug$|&gb3!BceOcQg>#g!B8 zO_(2b=U7C_*W)q!LoeDNmeTvo-}N%_gV?dE-;zC#TG)4%%J%+TdDEA<`}1aD;o!;4 zxssN=+*)>)_IopD*k6vG8tfG()HHkPdJRsC-@QL10`#A-#8~7eCcYCk+{7XsH1*!5 z@7?*Wx;@vA+?YMz_I>H@Vn5T6LjAcmtiD@CwC^g4J$q(mZWUqhZ|1C7Rj1F~`IE&Z zxy>|KIydB=2@T~3VO#5_B8rFsZ@KRq^c`qGx`sa#3QUd{qMr;RoS`2103eJp(S z+9P=_mXOH(n)3Ofo5NN|J@?(bY-yIvJ?`Vrodj4aZEei$re8e%!17@p!>Tn459HrE z?!P!yCiQjxXTvjDOy!}F0{=zHuUD^D)p^&eUy!cIt2JjZ+_v#RmCXJs^IsBfa_zhA z|7Z!YI4T@z`Kh8Hb?=KIPdRJxeaZy&2@4S6fqv)ShDo-UEvKi4!RLFQdcd4E6;yc|^E$y?UiKYjACERGZIo}MQq z%T@bFFT6@$U*9?Uh$l#pEoS$Emts7BH)vKYgp=CEyqqW#Aqr;}@p6&|U@KnR{L|0fE9|MPg ziyA|d2g^iHCKiV#P8JTK1P10JHa#PQ-%KLDuBSbPmVS=j)-n5>t@+&lH=n;LHhbi_ z;wA4n9{bq-wPCMcB^IRq)D|r&mr|bIcR0tWkf-imTJcTeHG34NpIwstFhOVL&${Dx zzV{^`wb{3AN7m14M?d{c;7C05y3Bn;jNbRlZC^$6cFmg_Bl2lx#D(Ylszt3edfg5R z*R%p=DcZW(1Q_bEOL)lnGa>Q+9!l>&MIKn_7bs3pXroRh!3m_~_bmr%%1V z!@EDMe(_8miO)ZC3hvlE`=oyAI8zN710*xBQoCseRa&EjCW zl)U74hy2RL1>gT($uHmc;oH2;>E~-c{F@h*{NwqHk6(A@8MOvo)5@|e-?%DWOk31J zz_>ytS0^;gJm$kE$^N#3FW!_l%t^bvGDWEQ>dX+Kq{)t-OL8)cjy&sVmU~{ja)bM+ zoC*ExigQcU!aaWfO5JkJOps$;#DR-9{?xT^T-vEH<&@~1ZDns~oL;wBD7qqO=Zd+? z0WX{_FZ^~=G&!1;D;?wEpcEmLG}CdyX0Nyp78y@BKejybVe3ql7ANien0*o(TDWJ# z9=5A}mbCmP?{=O|6VJ2y)>K8a_g}f8@HW2TwQTsuT|D1H_Dwmv;AEdbNBgWZT4C$k z7jgdTpD3p+cjjlH8MD_6bRr!6SGzU=AbS?lN8M_#pkGH2t8S)95uf$J|Pif+4l#eB;* zOXa%d3sB_c-GaMU^_?hbn|`~i*mL_Nx3up*)876n zQ8BoGHZ$$3&-Cp}4>`v39L{DJT-~Jh=A-(9Sxn7$mDo1UJTdL;j>C)h&UrS?Y~KoZ z-erpt;weiPo;A`Kji89TD2{$=-i3* z$zLkcdqSex4;!yf-Mp(;I9cnK=`JmS{wz!1oV9oDSE_9-k?cu|T7JfAMWW%+%l912 zcQ3sCNdKA91&^HIOHwmtMF`E7ysTaFO!BwE;+>JX-=B9U*oqqkvaeq0m)k$BC{t&u zp8L0Bn_Bm5_E&f%*|ntmg4DZWzSXT;PA^}z#927YPdU;`%KryTOLxrOFB@6{uCDs< z^Vp2uIR_)BA6*delIK~S>*uZ6vPQnyhnHH_)obugeNkifYEpod##}AK#s9Qo#k|Cd z6}8(n=kgsn-DbwrSRv79#JJ4!#j96Y`T5U3R>bIuA2J9zvSX9zOT$NvwmjQke952x zv*ORL-@#_(cimsA{|rC8W3S3Iy(hxXL6>%ZHVxr=_~z)Yy4z0v>Vb*f31y;rmI?}^F_)q83r$&)|x*w-5u zwFNTU7w-&8O58KoORSvRBfPV#u`pHK+2o04q8;b%o!14+zZReT^f4%B(&amL2FAvB z)Te5N9^S^e*lX<@A+ylh@WXGpj~HYm_%GdT_&sF5-_5Y{c^W3p`etABo8_$k8tzGz zYjm(# z=f7uWRW;r-T9PL0a`>jxp&OnHIZPJY%DU`IyP%Qt)O$@D>(0)L<|Zy{ck4)g6Elin zdbR$brrgp#Rq1*0CD|6ed+J^<@r!Uy;q~>gW;5Y>e4~JW`NS)E^JZ+6_CcHTe%PdFRu%Zd>oaT4ElrYkK?cEy@o=?p#w}c1goz*9{}n=NrDP zW|uvgWA<)t@JEj&VgFtP9eOVl@|EBHaHFE>e2=68t5#*>g(lM)-m}Q;Q|eA;a+7X# z%3RFtCa!cdC&x!QM|tuI-M4P->a)9hzIJH32sIviyXY!ObfdlV>AD= z^wJuu=7Wz{>rB3Um^rHX?&RLz>{Y4B#Sf1b&P}?|+4{UHb?@YT1~0PqI4L!{{z=<= z%H(PHIsQ)9S35JRj;Sm&*{`7!-gx8dmyKP?DXHlZjJv10OFA|^JsPsh$dB{VdYMT+ zsxnr53%6c=$JpMNb9AlHwj_yl*DrojoY3u+wrHaZSG?@*iJ$B?h^F+$fJrR$?zLnbc*{ykC`knfB=akuq zeLQpioZgS5P8X3zhc%H0V%)wNJ_@{${Gz8(-0IT>rZoL6zJIMGdz?OtpDwSeQ1l zF&efl*l3V`B3Xz@^5w_HIwv*kc$gX^F5Bdt+vCwMpX%wRAkeXu`%*FsQ=@}|fJeXJ z{yUdlL1L%Zsu|gByf};LrD4{}V;_Ik2-ubgH99C&lGEC6pVN$DUby zP>JJ66kC^3!2PK|cRq-hm=bgGvFXJBU2^=qym!TI_brUx`$Kq&h3F?8J(kTLPW3Zq zS8bL{51**NJo-dxKKmZa%nWHRXPt+4a=)FJDj#0S%u?^+-n7p{>F?jZo$qCjJ1{4@ z7GC|dw)^Slr=Mr;s7_RzbLMH@{H5|r<)6Qz1N?boT&$fEutfxKC!go)uea{%a z=kBQ>LqqEe7wuPMT2;RIn|7Y}SMZ;E>(~8xpR9hYGG6?l^^Vn{E*q_bqYBk@?rn@+ zSaJDT^cM@}YZ-SQ8}LUvue4b=L;LIY_gi(>ByVCoqHa`cJ1Tt1g$6m#;QicGQFI)1z{p)lW9%Ri1w$WMU#(ds+F^ zx^;R>&+U^q`TU{A54TUB)#N($W^#%b23ybHKW}<;){L81CD+FA)>-cCslQ@k^SXQb zdiHA~n-|`UTk2zIF!Rh)+c4AKrE|Jd9VQyD2ys@B%gg)msD7E8bLOOPnO3)6+|u0h zSJ&p~q6=5d^8ZzRj4+c-SpMgf)3;x1l&4O9t~GmI{^|9%zD#&k7^z~AdG=uG`uBTk zet!B``@Zh>UXJ5VH4P!#7VY~P!`AGveTSe-Z=z+)+J^=aoEvKo^!T6U{p8p$z5i!I z`DFh4ZLZ22Ll)*ZPyM86^DdrE=;U+x)n#cr`1eg)zisc1ug#~Y>(}k5uU{*evi^zO z>!&8!N~hzhc0Arvy`}x~n!Wqj_WS<4ee?LsRHN3QvKSAm@|9lJlUrsbSuua)78VHH zC}X?v&!YryEvwiY?;F_L+zorwjc&$B@gJLUM!b9D(v=rE)n6FyS$OinqL!Nq^8C{- zpA-+eXO}5GRqyJGt450c*`I%_{r2>A>5N$`Xt2XJdGoe=VN8(<;iVrd=W@kra973a zw5ZJ#xphG)Oe^hSiog`j&f_&_9!MTO&$m$S^3(_YGjpW+Ic93+uZ{5$(=*EqHuRsn z_lD(*w&-bWmgiV`Vscd#Nr!2pM>2C zS(UR&)i!Sal9z|S*4Mt<`hA_>5u?8?<@fJw`}$P-S5k99FuXzss8WDy{}S!E_seZp;{)+-GyE(M z$D5ZYijI9csp=Z-UHv}fX3BY&X70Oh(#qcZR7P6~aUD_cD%>Zs?NsKXxO$;a(gx+- zl1tQ>f?vgO@n%Q%x@g5;Su8ZcLquw2r%KRC$zD^DiJBd;`3)zJtM^Dv&WzAXI_b7h zZ@PDC_e|B~zo|xZOwF_uHauPEqxtw!u=SOB8B+Tei7+)*XfPga6?CllJTquz(8>if zd5>{~9^u&*_UO@_CC4AEXEZ zZ2tZ&?}}ID+&S<+t^XAmnMIfXc)R?%{r4xo zuB&ctePZ!_v23(i-i?aTghNF~&-CxHGMKV#`SSWw+qSz*r{4ej^2&Yj$EQw4h8O<4 znx<=eZt1oDa+y814qN=c^Ln|8*uUlfe=RR}XTJ8{OirbX=gRu+cHbj+XS@Bm7%jhP zX6X95YR8E3XP=eV+HP94{NImf&*R_z{9ga3Sa|Z@%)j2@Chv0eG}i3$3HP_Ro4o8{ zzVzF}_Idjs?7nwlelh>nu=&>8UawtV|NB^H@pBF(?}Wk~Yk%Ewf4?s>^70kKhNsV7 zJlE%LuhssZsrt_l+|O}KwOM-dsl-!5*3A!FnyO~rd>kPmaK*67=JMaQCI@@+S57}X zO;Y_>$QP|PwJANBH+$#Axu006I&sNgHp9KaW_dxzk(YKlc$~|7v+c*iwaVdVZcW+3 zwv6pjo3(q@?k#TZxgGcJtl9SabLwkL;X(uH*Hkj!-<0GYU}>vkBfFrZL<~FeCk^CR|$r>yNkP)23`5^^K|>V4U+fwZTxuH?cC1% zd$+yWTzR^(_gViq_Wu9Nx6VqpZifHg5}hagzv{I7zNx#sZ$|!_df9s3Z+ZW>wx`wO zZfxCNc*(e+=5c(cb8+u`o81rh`hVN|Y5o8AvyaPMh=@Gky`f~M?E07me;pn&ZSDQN z@c07JmkXz<|JxD#Ci+@(_3`Puzt3&pnZ3Sl-+N`btuNo|vl_qrw=3N~`;3^_>TR-$ zT)#BJ_y3r{ylm3X)3N#HLa(;hl!u1YKl_nrw72ekew^I}myFEp=e@64X7|gzop8Da}SJW15SRSrC zT_8*E%EvE`8+Ls3SCRhi$1i32<=1-;r(&JxQ*6gA7aad5agV9bK|wBT!G@-p-3MIQ zJlh)lHgI@_-DEk$bM3?0Djuuy<4-Of4RZN^@qQmi&n|9tySyj7TVreM<Gv!u_Pko%Zx;Jnf9jm) zWqVJ(du{t?dHS~6x_J(Hie0^p8JmKpIXw7w1_4;eN}6>{{1XFdw)`2!Fl`Y33=U_dVliXA9X4F_D6g7>m9W{+3j&Z z*F<_)e0w&H+w0%cuj=PM>B-xFiJQD`^}n6hzjL2Wb`IJYcKXhTckB49=OlbQ_3doD zUE15LOMe{ce5;@Hvu#0`_Q_Cj&BZ5+s!bpN*f#st>X*mEw}#8tmtNlbZuaffj{P66 ztIqY+i+qvN6p=nZzF@`el|Jj5&gZ~7w6^xSO6HS)`_z7UWd-WcCV@M&msA!_s`T1C z%RMRUtXraXe3Eonpj4*RWrn5SCRN-BKas$>Vt<>A>=moFl!COpxRY5AzTTE$E7WZ? zOqjXlyY_D0WaV0$jQ?g)%i2n#Qr91xerDO`)&)ywS=yr5wW2TG zcd?}8{jbq{_%35@(2YZUx@#RRrf^5E3|)I{smD{Mh02oqgJ*h}Pgjxpwj{0ElVzRl zluov3V(RTIA+rwcY7q6_=*jz}UbAKChEL_qprqkYE-o(an4z8a^ickHEudQ ze>Wp+RRmY|_kVTKo6iZJO`7@O(pLZY`+nET=0|M*X%byi`hI`Tt@9aHyMHg8d@bY0 zqkHyqUR@J5+gGu~@6NB6r_blwpUbxSd+GE0VC(4n^-m?2rOw*$`sv#FTl#uR3wQDS z?V0?3Pg%|pS?ls2FO%vuh_{@qo3b5dIR?E{-%mc6|yaNN2vk#YLc@YV4> z4_`MMAHEegcVD=vm2}s+-V@dChhMhD-giw8n7L+MVf*P!)2#M60qeVeKR0DEYE|1% zF{$yTVsD{}6ldR;l1V3Z=0zBpNqZ%7{_s2SRBKm?=*AZzT2s#nMT#xH8B?<-+-Lcu zXw5y0%hjiM_r6||tE;PfhHvp*-oBIvPunZk@)WHuRO70PV7|+w)~)*DO4RZ+w==cN zJoDAwnZFhh3s1RtZN1#AV@i5+ot}SaeYmzi+(TtUNBxNfvL!zjeO8XWBo}UCYpk$v z(yfrRbe=m##e&Tft}T@8UwY|!zoUWxzj8p&l>IMVjy_qV6ULCs#<(xE-|_jo88J$8 zJ8#@NH#tN&FQe~dZ?ad}b}oHalNm6dA#tz&kYLxB2AJ?P{AJ4Mh7JmH0O{3%sZanMrmHN)xi~BG8ux@6Flz6Z~ zexZ2QoujL49w{(SQ`r;y;3iLTPSd5P`$jzGZMKg+_xMWe6I!!}ODBY9QnxPito=sI zIIbP;@@l#%^TQx6{>X8|14&9zb~-b?e77twE%yN@!l z-kQsQs6G2h;tkhLF;9*@l9V_*#qZD^uIsW+n^&6jTt4F@$gyu}WR1jy@6Dynmv?0! z=i9Tr_VB#^+cAO~TI=Oos}CGFaKUDZhQU=wxh@%-gE2z-N$)wXsK1*p_ur#vV#9Ue zV;6elzo*yfU3lDH9v5}tTSh`&+A-mtqxCO2w>{q2QGU^M|C4@Ip$xVJmZY~#&pxgF zX86MJ#@ziu8$~{yVBwc3TeN)T!UHzQebYA?%-2HJIr)ZgfUn;cUfsv_-r*V~>pRL;+ zd)v0}oM{^)qoTN4ogBdfCM|~(1L6aoirTgvJf${SGvL`n{&y@t+qqaSC99ltT@ljP z*Vi=Frq4k^AX`8nSs+0och95C-1{AuCw!VPZ)-!?>Z>nH0!kgKdQ^7Ka0iW+obg?p zt<{~a;c|8D^oB1#K2A*m*|Xb*>FBL~shH+35}?tQ4tAbPkKO;gR1)Aga%<@ii`F}? zRev53+RqJMR>DS}SQ?#EHbFeUdeB8K* z=SxLuo!*k;9qf;rN++9N^S}J~jqJ%#HT~8AzMY>ci*~-zKUK6!(B3Ct?y0|*Rw@g0 z9B0%xJ3&raZboc$htH+x6GhTTex2?8#@Rk?+OZa;#kLWCRHi$!@-uyuD4rbI^F`w2N9T_QMSj=v z|6jiU_vz!b_wjM9szTJ#7AF*zBh8GjI7Wc6s~nbhEUnZJ+h;r*$r9C`?J!$iO$`*DXAXP# zaq<7J{QPXa-=<$OUxL@iT$tgie%^Dc+oh-e*Ya`nJu@Y4w`=OZIpD zGt>fR9O_hEU+mzP_4FHG)ZUFgf_`O>%{v_wK^M2G zo{EC1ob3C*pGE3zf0`xx@=Ry%)m{IlpiCiGw8Fyms8=%StzJ7gBdY!_g)Hjh8`v)VFeVVcA8u+^rA$~q6( z-EvpmW?geJF3vbM^}KlT%NRqmtKKRGZg&HJq>1&&nufS4Y*ffpEq(2y<21P@<(5ju zs>k1|nZ(MHch?qn1&3?T=ka}AImfTEe@F8|sVm(pS4~{G@7uLsVrkZEe|ZTXzoWfc zv0(1R5;pVwpKm^xvn~3-yD9yC)xkGS+8h+*)E&wd`zFWe<>%)=pUTJ>XE2q^`JlS*U;hQ!0_D`49+^P4jW}3+i z-Md@=OMJ2DY+h>Y`F@S>)svzgSNZ%!ywe@~t0Qz)UbM5ldB5l-m+Qh!5~4j}tUX#Y zLN;|QS}0QTL(EH0c>axhqNg6D&%9(L?J8iZll?%rbyJ+#_S%wT`Qe{mWK}EKoy&aY zr{lxb@%EaFX2Qfvw^*eD*`tkDOx}`NdYCCISvWk=jKAkb`f}c&r0RT${JU*wnmW5O z!aXWtI?IyI&2L)vMun-dVo$>%E+vJ=)H6?u6y;=fnuNm58VwHb@CB7IpACejZ8NVc zzY?RhvoikA-}-;QC*Nv(wtc(s%SY?`-uzuueCL?e=1k+0@w4oH{@TAi!t2;F-Sf4D z$G>G=cLPja)`NkFbSzG#@7j=9o(|H@bJ#a^D@XIONAKyy9KS6ZeOhK`kch(vf zM$JC*Y^RNh-16dyGa0=?bKTb$CZ!c7MmQ@NRI`hg2raHp*sykOX~L!4i5ER%lP{j| zh&D~GsoS)8rEAg~al_e_LW|?>+|x48_;EJq@soxbm(El+ZP?te!cJ#cslgY>dSe>(Z0*I`GsCD znYUMG{v6{A5yuo~ubF&3^=pOul#*SVaXcqhnljH@6dYPVZ|y$s>e4?}ADq-DRopH$ zdMIZYIjv?MXY&6Axr$Sdrnzr1`kJBAyHjWH8nIOyjtd>!;8Gd1K1J)TRN&^@9y%-Y zG-u3^oU(OWP>AxniWA8%u3L*U>vadF&+K+fb1){U4*~u{5Yi7?P>pR zhCz1wGUu5W)&w0{7;r-A?S(T-LbGM~)i+M4KbEuM*TQuTjgd0zeU5{g?dDqd?N;b( zd_0xJsBN&m{M*9s=ke`gIU)aVkuyKHz;Pvga>98htq19{-b;#GOBkZoS{~k4 zv2up@gV_sAtvKgi*Sv76Lg>$d#67|#0?u0*YK|st%urS5G?}Z;)VPCr!G#lcZfh#7 zcP~1A@wdB<6ldk#c@7prpqYwzCWBcMYkMk0zDU?8YrQXdVkda?_N;feZwhc6S?O(vkIT<`f zqMnkZ``}~61UY2^4wgrOn|l)7vfB?cK3;I`$eud}`)`~%({uXiF84&&svZYW9iJ$3 z{`~pFTewaev)g}hQ2SeFAMx3vUw(f0mM;_Rw!Xfct1Q5AL_cUz!`hu2HZa&1*|!y0 zG$h%T?`QP;9C3sqqKvSBVn6-_B3MHA9TveEo6wWsctTz3Uz3z3-NL9IT@6 zc_Mtj)j!q`xr>j?k5)Z5F)fG=tNTHjpOXIKY4CHKHXgkYYtA< zzEb;P_xT^2HyDW?dLN!Rb??uNI-|kc29{1o>Rduzx%|y<^$M4kRBlai$J#C#Wx~O>l8{5~6%$+~4y2sDk zS@7+#-*1c5_*S?I!rx)tx@7?)sHx|`Fx>V6$HzWeUQq#qxC zrC8*W$o-F{y5|0~A+^0|h~y)K`1=X-Z+ z)5E8WTUf6@xhXt5uIAm;ul_dWQ9SttbH3i}+n*Ql|95@m#I#OU-Al>4&2#HYFI!$) zk=?Q@`Ed7oo3ClTccSv1ozT|L`@8@DyZ!ci-_NN_+4JkgF7bK4Pd9oC$*=op@$u)s zZuWaO{~fz;HgDRI=~egdZYzBpectxtp?!I)>o+Zaw|05_jSVkvUhkje?02*8?(uzg zpTADmty(dwGpoPu*aih@NpM87IXn+4XDhjK@${0U3l9|hn)!A5mf%JDaTUK5WQ$MSx2XuplCs(V_q+a{&mZrJ*MI+Q>w6|UfBz>* zZHq&-5AVjl?K+o#|Na$LtvOLiLF-ScDP`9#3y$f}eOrCs;`sB)>#qp-$=7e*b^egu zk5`7DDy}&FeSPe%R`|_XXVoL(_w4)GBa@$a;_TeI@4dBa*;fB}bX$7gTHu7e2o(nnkRE;~%F zekN;DH2Iw5+2hZDt2|n^>N9U_t#Yi1(D4lx#xAPc`FzixycPAO_+%yXbPef}R~4nE zXKVQ0o@vc`>%!o5uY~Jx&`Ohk?1%p^*|3|r_l~!>_jlL+zpI*G`^{MYU6gNoU3E(S zYJ2HDKOR~=3Mg9f^~14P_WgS*3M;PF{#?w3Fx&D! zdlq~ea~f!R_C8?pI?}AXL9wnuWt1h7U$%?G<-g{H2s+HW7GFFAKvV;58>w%Fwa{X zrtW3=SUO)mXS@5U*iVh#>~-~Cf&XG>*;anJ@bg~f{?0ECmuY*Y-d9;T6-k15XyhMxr_}gUXPv2fC zN1MgJlQ=;y4q_21s8 z?0CFRc=x}c<=5x_ey#Q_C8qM*(!bY3Ze||s-uPunYgVmaR$>mN&XBRd!K((m35f0&B4Md@ki46-N#eU9lbZ}uKrw6FTH=I zm&3L0mDm4$zI~?G$7=R%f@d2~PFrvOeu-bd@w~r(Z-1RT6^}l+`mWO1X_)={_Ws(f%Wf}7pI2M@T+!_1leVw!M>lW$G8E+yRUuAkFWk$+q>uQ&+UB~ zkCv|Z^(z1W>;HREYddb;EDcShXoH}2I_^DKJHB@LI&msOWv3s7at zW#1W@HA{NhRdb^=$@zOIgOW$=}nWyuV`EJdmgHKn;O|68d@V}4Uiv?vI={1JJ&%ZSOz5jBJaLzH)m8N^H-CkX|y!1TB=0Kx< zYlpL&^x|J{Q}b5ke|?1g_qX})X7=e?J0JG-sfrMPa7{i*!$+%d`6a=gbKgF%oaJ!w ze%+%N?eVptrLK==Z2atc=ipM818b6s+l`iPX)AekAw+BR$b$M*86 znG%;K+25=G@F8>3)%me<$L8^Ote3f0zvtXDfBubj_qV@i-d6ZyU)}VXw($fu`FHM&6WuhKK1I_F8R3haIyB?r~mHfg{F1=d3kZ~?)x|X zX1?~(sa^i~{ilNN?Y2LA9;~%ZZ{P6LFvIrh@_xDZyFMDW-k2}D?}U*^*i+W2IvgyI z!Y?Pw6im?L4?C3_bdrT_?%tCTHhgWRMuP0&uTDj%zp(Ru^!Gr8cZt_PT;`otrWGvre@g3Op_M*t-VIllZ_c!^e#6gs{QbQ4-z$!HY<0EUXpp!yBIlmV zx9K&fB6TFX4t2*zHXZbPSn%oCzlT02r27&pQv{R+I^tdW9iK1S&$Kb)$aa(G1wLo> zemLx@uWP!H!Yk=k)wAR6=6|AREXymzHJAlp4&+pJ0snuV3=0CBYSz;lRy{M(d$Eij= zMSgwgX^A5ee;%I>-jL+U!qiw1v(o1fYuu>-IX(ZV2%SS-0?8Wc*IhU{XSUq*KA7n~AJTy^F=tDw|1FV09w175Xj%-0?(ah3d@ z{6!+pZpKyCy65kDKlSQ8d!Ks#)8ie-Lr!--E8eg1^XbXmUHd((zE9d&^HJPFRwa05 zvCjAG3HoeUxtc=S*6ssFVXlWj~MG%fhJ`@Ef9 z*_#`lH(iz_@vIj~chvs;SDjxf__SM5p=C&5;nhdE%64mSZPVHm`0-;0SIJ_zbccY= z6J3-0%Pvh{A+fq*%Oobbc0I_hX;>x z>=FKPJ2QB~%Ts|daYa96#5VG4C>EIdD@f1deAGD8Xy#MqhjGVc=T!Y_u->*t>1kJ- zYw&6Hb5BoyR62Dt!Y+1UO_q)Sb>kUppOo!PnyCHsa+vM@ebbl}PZ{jF*73e&`PMzs z^9tDfZQ?!H+rHW!HeTrTGwW3J^vUO^*l#}2(&Q$-V^XTHUA*P>PpaY@8d58cyzG8{ z+Wd01*!ALHk2c89vsl-Ck8|&i$@djsypfJ?cp8(jZTarW=O33#uh|%*DP8#0)4IZ@ zF({ui)j`R4!G+BITYH@@_USq;o4&q!XH%f%@9&mpLf6?w@0*fixj%Bpl|z3z{PO2@ zP1hG%uPT~+&CYWD-qX7TPO46u^0s8^&8dvmcC#Iy>OU%6{AuHzl(2s`w&$K-R_xxm zygY~Ti;DE@_gB9}J#+eTd}h4f_I>*Ergd+*^J&?ePeD69qGRu@{k2Zs$@Unl(TY2t zW~bZj@XE{mRdzgjc2o(YO-StlV{3DHe{rS0KIii_3Wa()KPOcb&To1UE@|*t=%h-V zp4g^)KX3kYjpsQ${ga`+%+rtVA6k>H+1p!hf6=_ie7>LB;eVCe<&|PoAD#61xADT` z01Xy?qq*lqyjqtkhW?!?ymnV)h4ZBdB{}Zjwf`ih9rOO>V`_)Bu{pKR)ry8hl?_4^27Ps3+f#iaFE|xKpM^u_WB=3x|68cj4w=qMe+1z|; z&#yi694y!pPdg+gZ#XI5l0Mh(;lg=MjS6z}bf%wg5w~8k^^l_ex{og{=4ddTH)j8M z+Ms5A088_9+qvh&yl(i!|J}No_l@J4kP}N3_C@N5d|+Md`DaqG7n@RNiJ9p4%DsXYewI{R%9_pX^i_3o2g@3%IN@+{=ET<7k!Q~Gt@22T%HMx7 z<3h*NXAA0g&AxRVWzlow8UJm$&T7@L}ooRT=7W6yE9R7?&57vy_Sa9 zJo;W$)5vkBZilA9{ThuI{YO52Snl{^qDSMycc0yZDz+;1PCl6Jq`15>=I`CDYBTxw ze=yl|h+8>HD|p3|&95{6v{tNqu)W|%kh=n_=?@doq|bd@3tLCQ;KBy2<3%28a#(ZO z^qlPi&56PVJ>Evg2%Yz*||DAXj8-4#qX-T>;w0Zx}&%1@vOX?b`3Qn)fUB9== z_r0WwY)$Fk;%NUXkz3~M|67?KuJAcS`lP6Bo92m!2bW)pG&uWfm#R_gjKhJI#!Dq- zmv_2kt=#MM=0dB{%cFt3tpTNPcb`_-cXE41PF{wBam(Sb-ILri)~rlD?S3aOeR@a! zch%=?EWTfttnyBe3Kibb_ngb}zsPJ?`GSXm6U2L&l)~Tfv$s#FDe{({syCP0%6c}( z*(u9rRc*TWY?fR=(a~oCRSRcdO^Z9_Iw#A^c;&uVPQ}X&#Xi4kxw7k3+v?KZ+H)zV z?5~_m2;_8Gc+n^`$TZaa!VaT!3q~c8+3(i>dUyJBsLbgt#R2D5Wv$43nDuvJ!@|j- z;n$D6H)CD!i_>(QlG!?;?p;%v`0|w|`S0?162;US7k~GHour@ovfeFXPFJ69F6H^z zlfG;5y1om?3?p*bH0LSIyf6M~hlta}o1!sWzHc+Tay4#e$oY%Mxf42`bDgXd?9`B& z6Q4PujJIS`l(qP&i3^G|bB<}`DS6sVO-uRV@c6^cXWlpFY}lKepv923uKbe9v!Gd0 zok4%6lwZ3Nbos`ymsegtopMafD>_!URbSlT^*X`Ou<&^h{N)tW8+;qggfBgzt z2HKQbv|5h2;EHT8%WhpmU6pM{txa;LzhtbRbo1I7V?B}DZGMdHcP^ZGEjzDxhQ!sc zEL;osbw2M%SK^!8;I4i};0SYHN=@L=yq#g;(Xs9l-<~92X4C7w8FXJsdW(9|Px;@i zPX7}3T>g78`D(Jf z-Y)z0HTHJRmZ*tyFX!6T%($ugH|_VebxS8r-0}Xa)mxFrFJ>>l<$dvEb9KL&$JFKJ zfBxlL_rI-uS-$`N-4knW?Rn^7oEKl+#=$E)x%19m{xxyCt9S~%Pi@^3lT^5+`SeyD z){v4(=cdjI3X&7F4&LeWOw{+gfwMx&(^l*DFHBDyKE4FVuVY9AXm{rjxVs>18 zTj}?gJ7i{M=B#P;Pi>`F*m5lf2PuKdjlj-N5Ro5CS~#(c4QVT<#xch9m-b?pAX zdg`sTH}Hy6fMqf_^IV^WH4ZmjpG!AoPVaCs@zdA39kt~$=lc~?u4zhN)tn)-)Lbxp zll0WG?+V+uwHC=z9u`(yS-zz=6bsBiG8DXHpC`x`gK9qcRq`zU)6Xe zA8I`71($Rf1Lu(qCF=xczI*V=T}`}KXw`)`o#!*8vStQdzYm%N=K=dNUP>FSkx;s>RhxL+Qf zIE}68plDyknxMS)YbHqo!JTh^73`bhyL^G=sY|W*@3|QATOM3}=!1Ij3BBGTtE1Oc zb@F%q$GP*HkMHbDW@|FDQqCtWUEmsY|HOPwpUtaQ?@|}yZY!G=U~75l{L}JP zrN{hEJzc$|jB)M5H!suXUY>kV`s(J-hlN&Hb6Vt1*E9KU!F)6*&E?WP+ZPR8Rb0*r za{3EaG|O2{^}2fR-nqvgt*opZI<=B`q8~c%@$5fn(e}`JL2tCKlbPb`>n z;mBK4ZB?Fib=yLC`ZK1kdA2$|x+0l5_6XZN;|J5XUiEToUOMIWf@win=fjOtnr(%u z+7;)-h-???HO>>=x@}?aaithLZ;^^5%RQd_%}l(X*z2eLzsGvw|D{WpYB%@WUwe>T z>@{uM`ukRavDF!;Pe<>6Iiaj{_1S54w>F0FZww4?K2p2>YT5VLyI%??uX|#eXJ50T z_4=oapXWC*|H!!A9^Ik!_UH9}lUH6#m-hG9RBfGG_N2Am_Syx-mtlN7)~wU-{aduo z`tRzNx3v{tCH_2q=-9k-hk@44A8&8E1-*Xy{+z+pbDXl1S8f#jYi70hvWd}&Ws}!7 zHr>DDn)^P!AfwYKR3m=ViH=+@=@~IuQocIZiz?65CCjgk+`*!}a!N>B5=&IV0$#Pp zvr`N+mqqSbwb?>p$%mtAsqVSDo9|~yZnYGD?)KAVooXCcZ~4}bEr0JOEju7{`W$z( zCUcqe`iX`@dTqH}(>(6nzv}s3!fSevlwM%&_S2kSLmJtb*85n^asI@&?0|@_=z{Z% z_u_TlOxq-N^;<@TOVH^TjQg85t`nQ*wmxy&=`)*GCW(0`T@aBgl6ZB#KH52BrDgp( z&js_#XS@*Exm)CNVf2%aoXyUCg29mmBt2I*ZmzxdLTs8sctcl6}VUrU-S-5>IyM`J~9 zRDNQdQ-*Q%rpd&LIr#HL4L*}K$CVyt*i3ABci6+E@Va;N zpTjTK{Jv7Z=d1Z^yETh9YdpVKSu9*?k@2wZ>zVHNpHnYM&04U3cja;W_11T<{rabU zKK6pe+AaL^sy;j1HUItZ_U73xY%SvjZn*U{SNRzXkMKJNch*Z<{X#`kEy2T@f*K%%=*+jh;)3%siHU1SdxoehKr~2IDevOV4xAm(g-?@}1 zV`_9O%4c#}Cik8oH@k;Sfkr*v$}>*f^OSlRH9NvQ=fZ{AC#8Nj<%jvN$_Vt`Zcg~>pIhAWzOP7jxEJ9+ZKc&}{m}2b|5&-{cHUnu7|_A=^h(F95brmyUM`>f zYKpLTGFMgd>WZ2gkIVK6uTmyO?mZZ!$7<^wp(Pn3vL){Irk0@Yv?^oQE6Y;^PO`n8 z(sb$8!ueiJpG$>KFLQDeoO|cqW(h96sHzofLzb?Z?Idvixznp{Q7;!)KS{q@F-dUowpN9*=|%4xJ&hf=&6xQt)ckd<=JILR&IG$( z+7Vy9?vi|*R#jW-5wX_&B5#z!KmUrou-@L(a@Dj8Hx4nzFN*Lu@BLC{ZYd*kdjkv8 zM+>HF20v^Y*$(zkjeBzHSM=A4vNExfcYT?OGjl4MB7Lt}-Szyzw%F0M|HPZwGbT*( zXxdlD`BtgZ_=0+_vS-Z22=l#eR?jXNbF9g0?z$avSxvHa+M#1%uJgNYUCAi<$x|aV zajBgA_3wPQ-W>Bw63#y+KmEeGkG-Ei8s6Mm_0L3P<;mT#*Z*EfzO&!T_Was^-(EaC z+|DN}9?6u-Y_@ETHTUWE^#*T03$K|xU*59jMa5hm^M%RZRt3k;v8emz)qY6!E7YaQyV-_<%-zkg-0Jc9$s+LAZ7k>CcWl^Z@7*#7mI1mKPh;E zt!;U2o^?qu+oR49Bg4!I29hz4r>Kj?7|rJS+?aA8F(bXaLq%wEEo0oo3a0Pj5-+E2 zxS6B2{BlCH&%@g77hg`CS7z0$8{%{3T>saTwDnp-lvC{K20Au|2~x$o9&7&T^>bquEB=4NhoMIDGw1ym4-Q;- z@uA`5D}OgN_TM_|G7cFp75KCx#_@ee=}BYzCC2C5CqL-fXmIaziow*w>q@Rz=Sa=? z(&prSP0wt#v(9VDBDVs2ixVzNQ~PfIei~!eefD8i+j8NTH8q)wqE93mNNoD|F+fYc z__nC54qNl>yV;zN)}?UjNXx%Z3vBs&vBb{6SVyp+HR$Jo8!g#Yr&6}CU5-e&mSu8_ z$@6^1{EIJ}d1m!4p8ViW+w4OdKSc@`-aoVBU1F6d1kVA>tEM*^scgd zEE^nr^UzF%DbA;lgVy?pPG48?r)@pMwF7@*%wHOQF%Mt%ZkO#x6|qQ}chWP8nqP-; z#W=oM%(nUP^iQ``oA^3imdR~AYq=(E@>TI(zZunQKTkYyXTpT*niI=juMK|i#B`15 zrkB3c_pO$XV9A^x#{E-A&D$;`eum`bue0thys^SDwX7n!SZwOGH-0MbK0S2$2O5Cw zwcmHRV6o=;DdxNbp#mymGP548?KqZH@txB`zKP@L zL0`k>_nf@zpFRvqE$o^4y~}xZ>CwCL-%WJpGgtX)Gk0%DNvh1|vzLiVOIQ$?>LOIK z%8!3#g^rhSYv!B}N1D6$CRxq&TF6~plX&4u$}*cih3TFLrw4deKGi;0J@Mn|&WC+L z27Fq)@gXwbZ~Lif?S5G4@z71_o|Xvn&m+GlT-u>-{4S8M^Wm?EbKz=J56v|&etBx* zbzz@ruG?!~KAqjnKc`{p#rOL|c=k{F^XXhcYQ^oaR6*_d7e&7UY&*k?=6R?#@#(E~ zy<Py1MOvTe8L)zuXroz#sBAp z{E7d6FFl^`r}t=X^X0R@KQ4RWr1osq+*w8Ejs_n+UgNaBORl-zCPZj4zq-M;)~|C->jebCF@Rn-BEBjN8#wDa8-$MDPFN@^Cc+}N=;Ns%9jVHcgQ`EncOB5EW0rq8yWQar&w?CDdHMaBdxTF& zzxcTR>(>8^Qlnh^<^TM-+A)9G@u}_Xde`hgBZGwQg_YaY zxI9njPI;biLD@F0x?#IiNuooC`U;_2prueB*}M*&%8AjQx90=1Pl~|Ht&{3sG`0LX zVq2x8Y+Lt2MUpkzMM0or>V($qZ{Ni@|J?sQ(b1z{5VY8;LSvT>WJnyg3ag_!S$Eqm zW$@ChBa71n}-D-!}he)V-fC;-9VicVqdkUrSyDJFf|} zZIfL1&^=F=VG>X9^gG*s8r84ZS zw|8C+jGTYII*n(uxlZm%rSnsV;`%aofBzWn&%lC<^G za;CE5OZe^2-WBe*WIHaVJhQq=H}~c0KCKU@A@y7pFf^UbTx=j~Wg`l-*h zv?*`zOR=^4R^L3z7ru}p{qot#SDyFD{hqS! zX;^;sZpE6{ondR`G1SvxqxcsI`vqdefHd82zh# zZX4fx>YjN#beGK1l{rZd7QRZ@xM}5{39;KGv;*H1P0gLkTJzdA&~Af}$$A-S{pro7 z6L^lW?~o$z_7W6OBnq z9v&LcFBEg%PM!YND)f8EPMK@@Jw=_mZ`aCByH{ZQF;1Z%bF7s=Vqo^Q|ZM`E~p56|CNT&^5Vhx$G3D zE!%hQ^Rqqh%Yk)1v-nY)2?tJgRyc{(W|vRboTlw~H^gXOz^W@NpZ1(BJ*CI}OHcF) z_d|niD|9+PT^CM%@o>tPLlhBM_ue2-nN^ZI%Xz*xlvT6 zE=!VcxxnV@=~3@v?4vh+@adnLw6Eptf}D#MT($A5r^)2$_psizn(TKYlXsuU-Cc`= zJ74zH{=9rmd%8EDg^pBhee#wsx5WSd>&%vNUwZihd(PUo^2be z?|vP9!TV#;-=ih>Cs^+E(`tBs>&6nf11DEJ>2m%iXCrIbuaw;I`HS7*1Mv<%W%no?i9`0(>3sZY-w4BWh=ctNYi%-d6P#g<+8 za`fT4$Xl1wetu}1E#3Lor+=!=wR69IvE}mT?Q_$bP&8wAiCDD8q~gfvXrFaXdW&)c zBVyLrz7qMe>dprpn=&6o;afMq*@Z8ep7~F&Rp8mPiv3-8!rv9^Zfy0sY1a^Z^xn<; zOL8vURC*K0B~ifZ(-_iiX~ZWH&^q_zqtjPEd~V2^5My{JgEQj(><=3rcxt-JScpow zuY4Giw)Ba4(nn<@yE65cIrHjzRFZSnPyczBt0O~Ui>OuPvI#3^`>d1seb=KhTI3Yp zX9jC#QTcaw#JJgVq&Pz+rv*GbCd>7JA*we<>%qaxQ!Z~edl2+Q>PL{K&EHt9;57lt zD;@TD+8*;dRmYyOp~)?aYoGA#&BuZ?D-Iu>ST47H17B*;2M5C$>^2jbypB7)Rnwcj z_4w2iQv>3^PB@%o5D~LaA~=w>WU9_Jx!L+nue!8WzL?;eE+ca&n(Jpj+m-K;u3d}8 z-MRjzeUbRx`MyW2{g}#eR@)UvK2E(N$NxGxTyN$atNfVVIstNeKX1=9GPV4<+`i)6 z#pgu)f*qaY}_CFedcqy-tA9$ zFJAXe+Pz=8K6v*XJr>_r)s{hx`y&I+yG-uyTt&A$4hQ~ZwS zd2tq(ZrPDjT|Qyc?DyZ!9+f`#yl-yDn>!agEoUAyQ=6_|^JTjCOy=yntm}^Z&;E7% z8gE(ZEvXm-i$de_KCAm*6qGi59$C6<*NnO5`@Vel@4udBvw4x2Q;+Vt+c6eDj~;!p zO?PHXm`KIrH3zTy+u2X^T~h8gL(R0md|A~^dmTX=)1z!f@BY5Mefr(Q$k$BwTpD** zI^1D=5xIN6Yr(EC_49k5irwFE?B1JV1KZN4e>Up-*)KWNkf8MaTeDwlk==<0ze=MI zZ(hDW)OXF~>>xdP`?nHP_H1xE_o=wNVCx2cod*F`>toFJq!s?0efr&wnQ!~n1gyU# zDOqlC;?F~qo#)kUmTy(mGk6dewBYsofBXCO?w(%o?(NlQcY38QE@)0Ovaz|Nqd)V< z^$pwA_ug4IV~(*+=_QTQ8H=X`1kXLI7r*<%$M@^MP3mwzYqTwIO2p?A5B}`j9G>$^ zJ@RoWzs;$17wcaCSxbM;ReiWQT185Ouefyc?viWF?(wI}i*3puX8EMWZCSp1=f{`% zz3X=TWZyX>&TL!#4!w(6FNOPS?r_xHeOR@+`Qyy&>HB^i`DEyRXsuU?@y?2um+j~G zWW-6X{qW<*mYI`3W_E8Vvr0BP^>x<9i=pQ)NUfU^Eb;u+tEAGiwo@J6R2MvMnYecL z=H|xA0PQ~vZEwNsbQa*W(*xUP#mo;w|2b#ID zUDvDmx$`bZ{H7q8)Rdx^xBLIUnRtb_PV?~oxn{)%yHbRG6EAc-%kcQ}uK#Tl^T0E0 z^CF$QF+Dna+SJsOnbyxW-?qJY%jP|jo}sVOwB>iXndLvsikT~uFA*tH=Iej$cwN<} zNyQ$gl>Ap-Rg#wc*!D$&VQ#fuSLE7hxxU}R#l_5pJSHTWTnU(W{mSm+57!D;pFVy1 zGxw@zH+njEZE9My=**NgVuxmh9Gic1>y+tJMMTVUJ(kRwId4zXp)*r?I-p|Q>6SdtE#N*?e{NOprEgxpOy9ML|$7}?fyM-$wfN(y+-}= ziGItg?|Z&}u45W+yxV9`VZgrw|H95aN!hu(^wSJK&o71?s%!fz+v&>ar_vYE1bMJGU+b5Y_X|o_P{CIo^|F@6bx^Yo2 zb{3zkZ|J@1oyPaXDpIU;+s}D+r4QHb-@mxMI7Qd5tM_ebb<6Sjf45&gdfJAsd;dj= zs)wtE-_47gU;C@K{#Nq$&(C^yTYb%2`!m)4(WinPQcoA-BqyU857HCei5?yRY=iucbuapVt|bLzr-W%WNF zZ@<_p%m2pz*uxg-t9j{4+1soa=`vkPz0~~VfOTQ+lUeNMXOh|;atN9of9!U&>txSr zbKzB=?lvbCMRiS<1ObFT(1B3ru)L5xDUmTPB-n@v-k9G4_^M*^FP8)e^vL&<=@8J#c2M; z@3igh4I(rBLY~x^uiRj5eot*l@4CqK-K!YIm>j zWv}P=b+?u^Pqmu*u=G#9+Ppe*`=4)8Ql01S>?~gIU?=rnXlB5?=>kt?n5#bj_A7>G z&YYZ0A3D~q?%nxb-t5ZtS9Q8G8!N>)4EeUJ8>DZY6d)}3AmM}k|HG*X+dePb==zmu zvHi2Y+<@CI^>=vZv+eAgmGJ0huk@E)d174iiX}g`t<1f;t6;I+jgzKk`r2m0{%AR+Pt=J z+NIrz;(6sg+pMGSOF!)Pyvgr$SW4YW=&aA-a?w>z^^31G9n!vE^DN$8S#;ye%f8d= z%MX3r_kQaB|Hn*?PXBJZ+5FCSho#)Lu$w!!uF`nF=HR>wpP#S0_i5A4FUwEo6;A#5 zZ@F!^%8CH3N4(!AB*?sf_pa%j=YHlb0lPe3tjatr{83i)>DkAZl~YUKnk<~Nd-sLt z_{lS-T=7xq4|%qIQpA~?=l-lZ$J{w-t6$DqT~8k`=^1L!!o*5@LA5wbyeRZZ7yzIpz9>t=;98U$1Z2G%wL6 zF|l&D;kR4OO@dF?TS>Ns3QPO^{FB|^sa|~KlJmqzoyzmBCQ8pRIDMI`^Jw_n{IKwF ziaP5F zZr<4sXK(Hkzr=CnT}Sb9{TaX5OdPrIs&2h{^}7Gsb>>T0ZY{H&`7h;rtF^0Lo1pOK zyZ2-A<)82VedNiu3I zfV#=vW9(w{Z`r(gd;DQ%@s^LTRxq+o``*nnSG;`jRqWn7 zZsFx@(yw3NK7LL7Rjqz}b;y0uoUf%Jwb{3P|G!auQ+Fh8Z?xHV+hEb^|9OWSE6gvw zF8VqrXW5r?chgQ3-|*h>*NFWc!`h##^4*+2%7*V(k@z;%z3NA(PxXF z&+$6GU0khtQf=-X=F`%f-<*&Co+Bk8Cp&Y7q&9cKCRxVq+o#PFdzSh7fk1%Yq_tb; znOn$*-swI5IL+M5d-9#P-JTyr+_IeJ7AIq1%x}%9zrC2#E~e^xO2pSQw+@APHcg+Ie#7DJ`Ts_dnX{w%D^d0Lq9|DY)@!-?;7rJ)7e(ts=hXz^D67r9V=hX zn)FBUPC;tr=QbB-^{pnQ{b&11(o(JoT@Rmr-7G_Ao=3q6ajzo}UfDhIK9a=PU#=nI zxg_Z1>IpBGN}UskYc`Yr%Y8F){|>ps$2CeF(_uk=~J8JZp^rSMK?3- z^qYMqdm>}Po;^<~GGFb#?0)~wI})EaY*0AxWJd8bmUWMQJzafr>e-)9x85zCc`p9< zm)GfEHSU)GKmY&tnvaPBgXh^ zhlaLxFMt2)*~jd6l&ErU-+%X;hRI5SUr(HqR=wmsy=cyq)64zuuFvQywu#)c;P#5I zzpS=&+Q!x$J)&Z2`0LKf(-+SgtA4z8jdim@o>u3+w0CnSJj;APctg^PV#HfPfu$pXry4BgYPvZTgMN0KOW+?kzD@zotbK@&#zy7UC?!Hk8 z&uNZLKi}MLS-O>L`iD2VGpeWhRn=vS&6xkR^lwc{oPYTx=IHBL1()vVm{Zd`e~xyrsj)Rd(4vRXWch_V1D3mKd0G0jq!(i z%cigI5qh09*S}6A;@*UW8tr||Y&_Nr)8B4ZyQap~JV)01J4O;;ne}{n}^7m->3`$SpXgxg>Fu z?$a;#-&{I<$XEZC>9%j;B1_VbRLnKr`c9drb=LgvHFs`B&1G54&z^p|MNwzL;{v7E zZ}$ITUcKjKH`0CsI#8YO8p;Sr;}pbaZ}ML z{2RA=eTd@@Yu~IjD_m^ZtL{&`-Ikr&BzL`6xZS(^m)H)UqVz)N+n;0>Ds9h6DB7Z6 zx-`8ib%E0IJ;^IptF2y?omF1E%VhV8^d1X4ORN3+E=JF}WmI}#&fB_}I|Up3U+bM& zJ@dwdRiZ*4S641OqBN1?A4_YUa23yG*V&8b{+;~V-S4VyP_lP<`gsTQ=p`|VU$#wF z^ozPMSMJGo1ugaJhSSTxmwpvm$@F7G#bW(i_x~s6>HD0_?Fsv)`?=)O**8Br8h#5_ z%KrU5Y4K9Kjf>x%-O~E&=g*()OQt;h`RVVqH#dI&`%wNxfVKPTBfV04F8-$d%$siW zKk=V*`01XdixmF?_1#)7R;iilfRsubz;SnLy~{*KI0d$ z@8aM(wL(T^%^KgYSM)Y*-E;NesYH&tYiF*cv>tqWHfPSwTk&&Vy_s>Fx%WEP_EYk| zezQ+&EGZD%z1v;vY8LA{qht5=Z8k4TnYnuZ^AGcz?#18StQN50+3p9%1^(*M#()1F zp48oyHsjFNg|9aH&U{y}(O_xHGl#O0{o%)|XRDPxym~LEIwip)!=u3I8iUQvukYqC z{BQWPEpkGH#m+}782)#-^YVUXcC8Dn?7i_>xZhg-_pejB>koWcX1lYjUh4YI-8#pQ zDL4$1Nj3t_N1FiEc9K-SLg*1+$7gNtvk{!qPU>od7SpDtz8+s{)L z{rANrNwEXJ#^HK{Wxs_{ey_0@E%&0&7rC{gQcsb`)^3OM%h)i@` zx9oU*_CyBpP4_~j-o2Nf8D_fcVCux#hnwF0{>lDr&1n<%)2tU68yyYLevbI?Gb_G| z!KCTHpN~stE_}BwS5fTKnuJMSUZ<|_h;VD4WHs#vLtbdY-4CA*mDC^C@vbx|cwY6W z%cq%FOLfb%Edut-wd;R2pX~@ykIL$+cpxt{)y`&Tt%LfqHnyL?e=g_Edwr#P>rFw% z#)GM{5g+y>EEN7d^=JDRU)}HgWx^{X?uN~s5)~fOb^FolaPt|yT`iwK>AzQAe@;N^ zxY?GBR}vr7zE)IMOP>jN2%4!^?B3*|l>fniIaDnn&u7B)15=hxDD>@>ZEiVvR8}iB zt*ZB&{era(YGe=1YEz*>{}(8Lz$f zmzq+gkKLYfx8%>+*B!N+HT}H9??34#v%=>-x_#kU+?lhN{%gmbtr59spkH^kw|1J* z>e{EGw)3ZdS|u{;eeK3??0w5>A6jO{*RGDA?8N*m)i)_A^1ao!Z3#*@Y>Hxj917ej zbvC=Wqt0SC$8J}a_ZJTJI$!nfeJUS+r91xj;j^DgSNh)nuNCExw`(K3H$*Tx;#7FnHGI=;PTE^`RQ900HufW5t6S7jqyR|7qMbcvH!(2lT z^BSIN?_~jrnE_lC;Tw$Zg@*@5MBFsmeQ=`3!^shc7~ZIh9&Vgsw4qehNcD+dLbc|T z2YcJrSKR(0@$p%JX2KyRqgnSpo(?#~)9ti0o}HyAb-~Kjb^B~2TSFE!lpNlEG-R@O zYedlEetNLZpIMx&A!Z@!hxI@i~jVxD%s_ z^~Dt-YO}RPI$N6N3l~Hl=2W(=JAYxH_-eh3`O!9CpYL0={SBY({w*)1qs^UvXQc}U zB_H{{`1pi3ET6s^zcN(eX+AEkR^7iPV!r(!mTq`fpK?X{QZnek?>*jO zpLQSZ_jiQsLE<EDO`pBVP@3U&Xv`u@X@j?+(_7!+BU z)+h*Y9BJqJ(wLo{9kAm=we6FK4;3eR$jHjdR=;kX+~VEvO5CIW{>h079fm2_Wv6mE zDhPD&OP;tN8x_^mx^bQk|MII&LHbinTh^$*%Z+P2^8@z^UipQ)%?F9{bCP-6a_l?*(Pk6{#9bzf$s80e;(Q_v{ISrQzu-t=I^~z zpZ}lvR1>wu=C81A+f6~!ZI>*MmA5i%xiL+7ZLpp5*E@?kHvIW{dF}aan)8{De1DlZ zFE21V#OU6wPp9PKm;KB8KD{yasmw32$=YpV-@3McRpi$CE0}mQg>CAtcW)t38ve;k~WDYJ!Qe!*OPTEL-+FRbEh!VKo1@ev{k4@=e9fv8FZ%_{}GSvmF>l33G=H*8+GZsEq2J9kds;WS@TCs%ICr;V4x z6a+fHv!3}-!B_kKJIjyHskUte;T0cm9bUO$4))+2-?wecp$DEDijFe9WAtBBb^ohG zR*TMg#_{~_F-JRU(sIe-^Cm2f|iFlEMWP=vZOuRw{>dD zHlbsEdupvhn3H5VM7=CUR3C4eS;E$>KhgR0RBsj?v8B6}Ru|9Gob2&)j_t8~j8|l> zQ;Zj=aEVNvwrTsb@N(6xtv)C2-=DQoZ=FQUz3Vcyylf%X!o?9cK3dio{!x8ae6w2T z+QEe#=MTrdk@q@cW7S)yF{$h4ALofKD_c%wD7}-*&CSe9tjt`XroA;SVBuvQzHQ%p z)_Ffv3S7X=^f8WM5$i&K1JC99vsbL&t|DSrE&fYB;QsWl607(9vpQfhML_odm*w~8 z?_}R~Hk0qi`~5%5yZ>0u?J>8vHr~CVN}=gf_af$7?>=2R^o!4bX=vw--NjF4?p&%n zkEMtI>%)K7bSleIyVWKfdJ(^8tH-?91s{%h8Ti+|x_Z#^@T05y_sAXokh1U1lj&x% z5id(*r%!lapuEWF{Qvv)pN|{+DJomvn9+1eC@tyT?!_1Urn}tb%Za(YhIh-przKY{ zmeds}{C@Z|Io;;)A{-msK*{51b|` zIr)yot`pM}{8BFJDXJT8FK%*4{B-cc5xMY9o@7v7c{HC1L?!_CvTrL@<}Kh-w8T$#CL@49U!+RM|X9#kp4lJ@+`vnOdGrDr-s z7VSKDs^?GBl_Njyg+BXKP+V3N7W@9jE189xEUb0+FG!zsDpGcB#%vLf@9a`u-bI&_ zgg<}C{{3q4`h)wTSBe;`vsta`-t>9(t?-O1_aL)AY)~r9KYxFQ&ElPUb8;MkBRp(ZoMu$D@4Ue4M zI3-GBt8U%8<>uzrcZBC2>**({wrwFA6@PCjH#LV@h*q6EsH|hMTl9X^gon?Ht}d?f z+-_U)zVEhgbAH~^u*q#+Z|y8gf9`sC{r;{;-&EeL%({O&FKzibR*}bi5!@TMsXgz} zm;L=IMcMVJr1pnR^zz-)_0T zQ^LaZZr(c~Tm8DAnAo$DrTfx?Z+dI>7JEs?YH#`fWXja@Z(qm%ec2Z8cS3jd?WYA( zoVM%R7oD`dB2%>OnC+c+OU+GxSk76$C?jI+!)4pG*roEM@A*wEIMFxlTdT3puP*`5 z4=f7#eNS&j;gaJ5r}WvkPT}P2{i%BQv)7umJtdh7HZD!h>bnqnar=sEnJGb<9CN3f zSLo#_HJhIPH1zD75B+oY?(t1ZjZ5<^jlK2QeXR;xMfw60^NvM6J8nk?8f;T-HQFiA z%75Qse%^YCn1<~kT$1U<%eHRS(zRRG?V@NRa=mZO``rFe5%Y7plTMws`X2J><+Mlp zmgW|PrxsrBaXb5ZwNBRjRL+;dPgSo@R&HLJ+aj8jovH1pnDqVH^)F2|a<#l{S8S%e zJtJt9#q~&NQ+t|6uWF@5SBUz}HRsOC-4!~w{i#TaPKL$jrJ=b`ZZ7=v=~(5duyWV4 zGSOV;Cf!|m@6#?hu^y!mDc0OoJ1RR)9`5S(7UVdxoBxHL#PJ0OdwY9*eSH@kS4i0K z@kQ*0dGXhh8LD<&mlLd6)71IhGa)XjfSO0V|6V9vS0Yx@I8n#c7n{Em#5_4b@sVQ=O3~Q)4e{=GB42gs86C>{3p}PSJrN= zQeM6z^y);$?!V361shAheknY;>~-1UeHKsu?U-obs&ro8#Es={?+ezY4+GNLqKe+W zJ-aFE_22hw_Um*xOAKViUQc;EGfb@Yt*_m?lUsKkPW2a`zh|ZG-!G4=->j=!bUa`Y z_on_(u9HRnsZl=_uCbN0|G4$3?9QV{8QGEljn2rQ{_-NM zkMo(U#V3~O3RV{f86P{aTH#3%KWorVFU{01A)EgnFtIiodN(e1AkJNr%dNt&muECV7qk&ZmoR+5Q@;sS-_1t8)(_E*1 zc^+AJYg1;M+rj8uU2V0^TfF}sz`=WC0LM{ErfwAY4TsLj57EM(6x@>KJS@g2|)7Lrns`kIX>$A|qC9+O@ zQk$pgcHcbrt5e-?-}%7fSN)(`dFF!4Z&mIXtyS&$F=xk%xlzVut`aJ1i*NkaIX2Hh zCvo$NYMX^mCO9vB%Ux%{FQv!ZCBMJ%XL3MFqVu1%++lI5qN#l5>szntzq;}F*nO!V z=~r?KuDY)bH!6A-zW;wcue@%9`+l=u&yGqvZrz&Nxpb@PzIlHCa=qr3DA*gRSzrHk z$6V6%X*Tn>KCJsbd$np1k*F*2LUX5p{7F6T-c#ywctmSLuXjeiy6y)TQmtzS~GX zz1+WN`;=#W@3o$?dzV&5P7ZmR<6idjL)#>)sdK}(t4(;~X=`xY+P zQ_nxULG1Juu3IVYrPo>9S4`*< zuNTcd~nLs>seW&sBHIb-z-*YBBpJ zTe{2b`Bsl5?gfARaZ2;?iY*c|)YnF)nf#h99c8;>rMK_87l)^_%$Qd)GmXRf&HqP1 z8#Uha{5vha&xPY@<-3;s>^JD1$7`k(jvtEXywtrzN=bXacLd4s7l z{3TT)9p7u|&$=}+@zt6|rblcz`1tDX_(e#|OH18uJD>Alm6Nm6}2mK&E@;cGo~uvnEN8{-MqaPO%pA72O`w#|Jjn;Uyr+oX@>(9$CUE?X~0#$B;J9&%cB%FBP# z&i%V+$kcl7&Ybv&yLX>&+Wss}{DzZda^;$>J6FrMN8f%N5H2PbwzB3!+2@(T&a%F- zJ9M|X9Eq4cXEDdrrmvndXa0YAwA_3qd(uXa748Zm-mbqlFaB$L_wJ9AOMCCWow{?T zY@bWbiI_QxZ;MpEgkJjdY+lP|Yun8yo_M!bPw5O4`Wm1yRc@V+@H36-AWoMVCqoX+ z?b|i0F>_UjUTskZ3)9Da40Gk4eHPyP;c=U;!h!pjlQrsitiJzZ_Dub=c3xN6C9`NY z#t5Z%M*@Ox^EjVXIM&vBOnr$sU!T5jf0=oo5$m7Md7CDdGS;tES28eC)ZAM)>BP;& z+n=`HD>VN3`@No7&=sqPL5?94=FhLMdTo)KxMJO!-08{^87H&VFSBaz*z;(f>_!)@ zs@!&#Hc^h((x>d}gv9+acV$+5>dHRx=HTa>p7+mdUE4S1(UMA6RqwUmc5a{l=l@aL zt?zg5|Fu%idCS58o#qWmlBrAVOl?<}mUOBg3u+0Oq41Jf@MutNn?OsBr^9!Zq8Z^w zTVnc_@@uHvXm2q%$$0P-(?p47ou*l59`i@7=}$aziz}HmJmS^{pZ1>gvw_D9I^=tp zQ-n5hNb@_a+3LU~m;3jV+=j(2ZF}2mcX~9r7ALzm%k!F4uMAK))O2Kna0vIdWm;Zb zpSZcWxj%3Itlf4(;A(HGq(hC8#My+K-Yx}f1%)@bH@s9}rJnTw& zba?B+Z(Z+B)@ru6E!xN3_(Orgw(h3gKlZ9M?=2Nhu)U7i5EsM}oF;WbXrjjarG_Ur zEKyVaqBG&_5*Ev;^~+t@MPlZ(@BP}VUFUgM#!zL7#=Lh+8zSx3`Z53IU$bLD<2u1^ znc(ET4`2H~J^Sk8W#ik+3 zRI$sLO+WrWl3)A5XTAuXXM#Lx-L(gPFZZ8w{%JviQjE&4%J&RRjTP05r=LvyX87Wc z{-;_e#U}|t=9*K^%Jv2DH2w4c)?+ZQ;&RoR%B;(aj2i#%k#jas>^@o**uODM>C*4Q zx=ywqr)9$H5BdL$-1p$+1@T6Q8iy*L%}39_HvF@5!v==Wr}lT)u6v)|&*kW0V87_W ze4Bgg6Xcca+-#R!e)&P+K`v; zVpq$n)Ega4XZ&cbu$f^L2|C`CU;2Zeu|&_}eIFy$Id3b*SN@4*@KTuUp<*zlK1IOj z(&OzHy+Egu9?{Mg+f)4f|6}7O*cmZl63HI@_uYAH{duizxQm~Ig{g4M zIps^qN7i5dk>JYb;ix9S;q2^un1hAsGAg0i9Y`R&T+D9UNucS<*XneZ?WJ=aB#4V9RJIY z`cEdiW>@~baCpXy88`0UZ8cr{17t-avvy-oUtiN{sh1!7uU$*$`pv&o>>1;d>dQMK zr@3@4niludAmODXc+r00lH(heuw8mAuYSzSEp$rz=FOk){$aEXlS($*zNvp{)v}Z8 zy?WD1Z_5_HUeH}{Q2VR3cK-jzf48lJjDTHwJb&5o2$5a0Vr%Z7vb5Q~eY^RY<7ZY^ zv{=vldObf+tWT$CY1P4ylRNe_uf4i+sqVBH`}do8-+Q>SWRK(a%illLv{vL#J|(1m z=KS_2LwL3SYVK{G%{A}*ntm@`&#SZN@$45%x`gYuzJ8!_@AUEJFQDV+C&>Lb zv2E)wWP9X4=D^Ay&7wyZg zepr70o~CZ!zLx^~YM*R*wq~2z1PS1pZos@hWjWPyXB+9#;zVbb-YQJ;;@=Fd*M!AEo8{^`wT+An=iHD1Y?Y>ki`{uK%yYX?Yoe?_0tM1=! zhn&wlLGJ$&Q1hhv-HD~~Hobl1oD z9?b0vuab-@)zQ)Qt%%v{u*PJ6!8Kc@y=&&4P@P)W_~$AI`266PAGsA{txkGWPCC2& z|F5Ot8+o|v#3rxWlr-tnvxo?*$zl8Y<)tE@a?B_WRu0~6boJhofcxL%ve(q|yh*tC z$ssY<+uQNc;Tb=s?X3M6v-Rf9{y9vGK1*}_x{-Y_Ak!%%B*g2fgiD_BvFK!Zx253^ zZ~mTg?bkusC+k5)#ggM5{rl%P?75p({&dPj?-OqhcC%`4z3-h=byvRXr)oI6n|n^? zymxDB7yf#>T4>RP{Zfq%3KQg%ZRtOGa(Ww(Z@!Hbm><1&Kz7ng=IRHZ5JM%CWI-Q_kWr?wuztU%tE{grj6q*LLZp z^IBV5Z{EBqA8#S}@?&(0%;Aav4Ut958ypk_?!Oj#7(XGMtM!x5y!)SKCR_NQSk(6C z>UO{W`fXE}Z+)LD@F(zb^FsMO|NMQnzId-ctHMn|;63MptoxTAE32D@Reg_ra8t-X z->HA=`jev7mbpB6+V$ym4O>>$#2%RW?YQdPgYUQ=zWH)P=C7@fko~3Pf)fr~4ozJD zc<1d!wpA+w6VJU-Ke}M5Kci__M@IDQkUkD3*(vKE?!J4vA*g4Q$P1x+8%r2xGz}dQA&FH^Cwd+ENmyfdmm%s)_(T)WYI=DMvGaG zDl22x@K`+zQ>b!`nHOv&C#(!4$E-Rd=KR;+vo}+r4w|HxJvTjc|B21pAACJs#q)68heuo6n>V>B_*|@GWL5?)xpb@lRJY#0Uw!6WIraYD<^5kLGp63YdGqJduMz8)?>V&lS@=7ZM+G~k zJ=$_&3d?H$f2TXE{|1QcG(P?C{=e`2-qVge`g?Ze#*Hg?@-B4SepRCK-g>?)$3U_0 zom{;Q8_oPA;_nJ3J>qenBD-#q`|j1rz59PyY~pgCahuIDE&qIfzyId1o7Rb5R_A=2 z{X1#yB*};Q!WUhGx%tap7A*Ph+pjoJU~}}GGX3go|Ztqvo zLNB)5p6Yo~(=ykmb(Z`6sQCK} zlYb?yC2Ifm)q^>TcHgI8Pu|e0+50U0&hKyYdF1&#pUT-?XMV5to#)%tFxQ*&KIcV> z25??IxZT$GTnwM?>}6k;+~v?axIO(w)zSVl{-SL=tan(&?SJWQ6_DIjW1{x(fwSzH z-#2fZt_^D5{4!PfvGKf#XMb1sFvagKe%7{Z8~?IrnimuMK05oP&AdPV{P7F-7SDX5 zY}>Ys^V7;Ouj%ZsyI*nsI^ncN;HlQSRU7ssW^`=WV{z}^)ri<@=O=hhEBLTVW9x#- z_Fc9&F5R$qlzW?%AvgDalwAI*_1b68<;%?!)w;?x(?@G^v)bkBC->f!eXQ;CL($>Q zq7bd%6)szz&fK@|UZ?6TncoUbjShPh9SXN^+csYoR@dqW|dg!?jH{I`q77l%{o;l|7D#f zUz?ke`Rgj@Zo6GS5_bLj7rQ=tx!=zx-`)nME9v&?$L}wCbE9)tscNyp<;w?e9{aGU zKF&IRVeqN?TUQ%v`NO|=zc!r4a!tPc&Xad{gxRpDWY8}g~CvDAs zy2j`D93P(Dxxb#u`{qse;a~Fa-Ti+lFQQ$-Ux#VGumAXRW^|t4{Q7U6Lhl~j+$;9} z+r8~OZ}}blviHZnz0O*J%OklqnECm7?|C9{{`$*XP3!LWpXBHJ+VgJl$+Bm=+NU3R zf6)Xq&VFjLOw36m#f6INcT~%@%Yw+_-Q1Ury0TYu%O4ltYV?yU!)?JHsn&wxyfth0*3Q_Y zIz9O((}Gi4TRV)5uid<3>2*(J)s!MlNMvkr$m3*jN={A=4i;Wv_{nqioU)1N${zsFqUlgkPIVn8v^<#_h?Lr*|%R=pUyf1kAx!&-5o__!SO3MPz z1OBDJ=JdH>9*IdZ;2-eJFs@4nmhaQe(r&%ofO zvm(ad`vRR>);|7ws_)i}=x^H-JtqBr`*XF}KgHxNhgXWc-yE)_CU)@a2EW^rZMb>s z{rW9$GWM-oDs3gJeCe)+merX9=G@!*jzqJ#q_MEw?|Zc@OC)HY!=kG9f39wj>)@HA z$92*xzBDUSK3smff*`kNY-*|U>7JjSG86agGzts9=pH#!M{9+8{^Zxi-0tbq+oM() z7jb2`pA7n#7hLAYTsQCBqP%zSI9r4=B$Wi`pPrt0ndiwe_oH{&ofv1IefE*1W?{(t z-i)(n-X^Tr!nKm6(Lv#!#DaYbcHG#L?tS{%Gc^gW^ZQw^eK=hO8Ur|-S^B5&e)m0H zl_1Z=u-6BQjxLUV7n*F#d0p1&bbGh+z9QZnjmnz$XpB`~7`&_pWG`@Ax^-l$EGj<<7{UzqH znAvH&`x8=!F znq9aa5faiLFQ_3JWC+R+mI*ugH%v;L$ETBA@$pae2lW;2zkiVkn$Vv%H=fr*xUyoq ze%`ab+~mOMM|-C*7|%{RRI=)+>vHyu?~d)?{%z&i?$UiiJI_3~EwYxo>Yev#lfm~s z&MiM)^%OsG$X)hwyEu~^Tdd{h(zB=P(sz7yeQbTxQgCAH+#Qdq-PC0~OB^4ZwYQk6 z%XLfn|A(39MRrK2PP#sqyGLCi`d9Cf@MPnCmp;zg^5e&kD|-^zW*gaA9uj)pT(#Av zNWac|g=pS`;!8rCS6PcK)9`r}bpMK(#kNl0(#O)jt%Y?xKYr}2-1_>CdTIT`_@xv4 zj_|(W+FG@Dy5AOY6}2=U!;oJqUNtUhIWlWv>6;$U9hS=?oD{cxIk&(5->biWYbz#P zU~zQ)sdFl#KHc5@{}--a&*;cy7g~}!U9{{H@^p0rb|gK#X0lJ(-bqQ%V1~}AS4OGt z1CHFDCpABHQ)F>+bL`yM47XD8?5_g3kQ5LRZ z6N`NH_ve`!p&%n5Z0GOt%l#w2l>t7S`lFtNzJnEl(=V2wk> z{eXWTR|`#ukNERAH2;4<>1pw4zb@=ES{}LlYS#Vhw`SbGoZRT3FzLhwk8F;u(;ZJw zIk{BmZ`wi+omNS)4AvkWzbMYnhZS}v1bHW}(QNY+{}H_C!uyp+?9>i?6YNUi(pk^& ztmCK?;|r@A9~~j*8P_lOZV&|(3S$3^t9b6t4Onz-<-t7{%4?Kr*``D&RL-hj9h5Y8 zUKpqCJg2qI8sQV)?Ea#Dj!o~_)nlg)S!g6rP@m}N{@diIC*xd0m-yz3OxW+ zf73l@dN`!agZKrh|^_1&t9o)v5#>Pp{&MR#Q_`$dJ6Y_g3BOg+VI=db#u% zUw+(uJTODb#&yDzQcwqK17p47nftb{rTay=m8L1iSH6m6XyXgW5nS^}Ub3v`%a7bG zlR&2@d^|PdZuz@E^)-9~kOe>r_qdXIUV`$m!o8&{_m*>j$6OjK?0Y?y?#sAqeefbD z^k9YGYR5J#`tan*lNT>u+_=p<=i!MH94Z-(*MuPk?XhooFV3an%qF-*ZS_6YgqO|{ zds)`9H-XMp_HYMvM=(t#6FR( zu)T`Ef0XV_TCX9p@Ty$i*%JRX+V?yxmzD4O{qx`z>o8g-(dxT1|ICDl z!Oa{;_vMwht>}9GyX$Dz0sUBRmtF6t*In9o%BXSe`RV0Vy&QXXwTOf*PR?7PP#m%B zeSCc7k?o=DHwI66J6Y&X{(;!iPkwVAX2w}W|5ZKV7Hq%0>wchpz3T7Mi+N#T*RGl8 zx0&i_c(mTP_~mE3zkKrie~N1CGiA@uzV>IvJsDwZ!@U}JthUG$@0{@3YxZvOZOgQB z?j&_oNBEvO_($OOhpcsweqr?vmKthX3g3) zbKk4$b6!*4zjv1X!P*e-BR8jx%-3u1blDRQ*~fn7q60`}U}hclE=6&+mTT7O%PH z_0R6t8~07NJ@I*0+N=3o-c6<9Y3}xZ8~(l7Kkvia%P(DIZ}#o~yMF!@y>8bvTQ445 zDEP=Ie(mk79-H^^%P)I|o#4)C{Z&w2C~@qK$iL0!*tCoG*qU4P%vZ_pSRftr>A8Db z8)wSGD0S-v7q2~U|M>WJwa{LrkIx>gE!^a>SlIFI{hu#a9=%&DmYP%{;2-fwYs!+C z_xkobL!FmtY_WQG?1ezziKBcP%iaZ_czne4)<4GF=|?B;>z%eSNBPjL19t0@l9Kiq zSugC+2`tpGkjb06?tQlDrnfUEPJ41&{f&I`-RBRVy}0n<2v?|DTxG&9Pao-4r!)I2 z%`z73KXOGq$8*JHE{WtFil4T9SW#(sLfF~)$I{fAC4Zkrb@83KP^lGNdScE2{(hhQ zj?nd%s^7Nky}19+_T;!|FUQsUy$fP~d-xvN|8IK#<4$X?lYWz4?*A8lSmM^gl4{z_aO+QERi>d!&!_UVgYxPBw7UtK`2Y|9}3O+vVo|R{!6# z?f+-H%0+75n=dCVBR6x&=a4xo7tL<-EScN3&0=ryii;mIA0Kvp+i8*2G82q3RSee6$@Vq|F}c(kx=l@Me}mXU1Q95T{N?s_$H@V z`&Z$NrRjJ7FqUT*Rup99BnGdWH09pz9~+ZxGSfcXySl$3?Ezon28E@M+6z9LyxCBr zmt8s0#yM_LQReB*Dnf!E1Z@9(T-+SS_;gySe!MYVVDvyl*RV{Fem2f1vGcH0#6XPvO}!GqUrl z7Ab#So!{ehx+;B|rU8TP5`p#tVV#G8(T^s5Jlt~Ac5dJF?9ADBHmwZ)DDGD1oP3#G zq2K7*lMf$Wyjd2oYxwl52YBjzpVI&C8zCb_;#dIwrO<;~dw= z%`XgJ%=z=R;SSfdEFHbrp7km|Jm1AqmOfG0eg89WzRawMn~yTKtZIJy^WMFC4==Vl zw|<&%^wu18UcSDyK?|R*o-&E~Q^5TLA8uTF*BG@tRd?dAU+iLLH@$kj6#t*h`0`r* z|EH=omrq`Qy?*{ji4=QDcJ5``HZ^CO-`l==@pk3Ps*Li3yDMECX0PD=`q9X;)^J6~ zj*FAalviXdusnNBy)Y$DN&m#%lXp*^IaNJr?ID}0sJTh~6~|9rId|v7_xX`#Yv1U9 zTfXZ?h1IM$u9tTt&Tg=*zWC+V(%|QJ9!uCTxp#SUXQIpfkhT3!PbRxLTH0=2 z^6f^oo!Ihozm}SWxkvs#{@*H1GTPSi!i%iRSI?%N-Y(Ssz3i7xkKdfVVgZIXq$^+E zxqE2l_O-zV{mXZ!*4;m=pp)Ca@%l9BH*d2F|NY55^v`YG)@;A%{B6sN za}M6P6f(Pg_1^7U7djVM|37g{RG+Q#ektdk*>~^Vj)@meDpy?5w**OYXEw6;h5MY9wW--;w!eDEjq+69IGv6pTFDu-L`d` zr{C(Xsl9VWg-`B?VyPt^_9l!Y|d-I3fiFxY|yy7==j5%67ZDGY`6Z4Pj+H(`i z+C3I8{N^%y&Yw#Mjy%$4p6$q1zEk(hEzi%|Y-yf{y>IU=R9o&RA(5QVYq+$X`|7=O z+iTXGi#S&HVd|^32Xo@fk1t@4Y+n6mderKFik#|i=Kh&&ZkT@IU{v?!r^_c{7LV3)JKU1rViUqAOtx1Ztuar^MpxN~KF*M0URRsD=IU8r;9=w(|q)%3pZ zHz`N#mmUugl#Dwa*DZ5o$@`0Ey%j^x*K{07THn3gUpmh0&#PI-ugsfc74)q1`0)=% zt}nDz-dng`UuJ(o!NZ=$+&kwM)@(X;`^TErmnZG#a=aC~)F!<5ZS32%dY0{d8&j;N z#%TS{bg21y?bS*2X_TRo=_FLC?-0r`QWPL$N%SoQwvps9Abg%yRbMQ+~ z|8TYcTvX)^>6*ezy8EsEE{m;M-)ETf>d_rLJGrb+%Qs(}S2o>$&SyW5k2@>%XD%oY zI)9|~uBrXscJ4mUmUn9Uzmql;NHv|mqt$k@O>+9=cfNbCJ_~;vUAAFm`_hdYkKT1& z`|a(lD~F<@cb+$#&GPMX+LplL+gGePLzWykd{Td_ndOTps~)AWQ+oH;M$A9;|JiE& z+}JsK|Gsj6Z~0Tuo}b6IWQh&me&JsmcIw=nssW=8m86H zzdBDi%g*-y)BZl`F#pY^U8TD}?=L(%Gk|LbkLEST?5lhF<~V$qX1`+oMY*4|A|J0S zxBaxM&~+t$@}Ansm#o>lCu~Q=j8u+nm<3?U;o)` z+5dOt_j%>tZM`<-<;Rom)8FPt&-?wm@cm3>Xa79~|G(WmGVNc$ZsR)3yI1?y)^@9J zu?ou#nz8t%xxD1AlJfA`f1cgnx9?v8C(qimv$T)@D?5Dg?1OIooJq4!C$D=hXgcd< zOf!4u+npaB=N;X9cB1_MuZ!BJzr8MBEBn*p=d18~|F@~0H@_Sfk3GOsv+Lk-`I(WC zv*SLlnxXUc+||Op%}aK@JigpksCsqN`kgL+|G(Xv9+G@= zn%<8(pZ$^9|IVC=+Pv%jtnYE_Uw)69{c2xr{@rM^%|2mO?vM644Zd4BJ?O0cN6)f_MFzjhhh-O}v0 z>$dao%uQh`3-0*-{ph95`~kOIHZQ%tf1~`~n5QfHes6m7=Fo%($=rvyCw6sxth&JP z#jfUMvWsk)h3D^1PwTwyty_=YnAK5kDsg$n(&D*!EJv1FsVyrBN#8l!p~oorLGqm7 ziOGo*FP?9GXK~-B^w+HuNA&e-GyXsF+2AUZanP->$13>)f`tc-|Md{U*JSW-Dd{ZuSM2~_1>BAA|XM*PslqWnZVm_1^dTrZ)_Wt2cj|S6x*eTj3FMuO%H`9(8kMWO+MIlW@Asw8*MCIt*p;>1`?{8C=G`BGzvfA% z&W!WBRpdSKb3wo_+yN;ZEk-on%CbwT8sS?TQKI=&?(xyzis zNeD_vY$tMKTeYt( zGIp-!ugtw!N28|HW$35fxcqNn_)U}MjlRjb-Hw4We-e_*CM@^Pw4bJK)qYdrnEu1$ z1I6m$&MU)uQ>1H?=U431u(y8l?YXt0P&R*s^u2$1u7`y!^}Z)(i{E;ryXBJhu0_m? zE~%AoKmNB?ca|D^^SfLAo>$)7lX%>;>YKoCbumwF6RVj!4n8cJxrO)LK9?iu0oy8q zUMeQnHg8sETk?C_tOnhb2~wYI-^e%5d{x5o^1sJ@BTY?BF2TtY#NWS2vpl&s#%;1v zUUcc1$Hh!<)-oTu)ALT+a=LF>YIeK1utB7mSl(1o%RYYICgV-YL6g|T=dZePXJwD{ z_pQN;1@GT4&4^iMrZ($UG;3;l+Hc9Yu^`W`MQ1AI?Wq56;JEGZx3InKD+qrnls6@YkL1mtz2TJ>;8RV z?uXzn7p%Ac3H-r-HjdYHRnmIBiw`?zW(Nf&O{iDev{;f+tgJ51Ep1;d%Q=Nh-}deE z@44Juzx~AX&jo>P{A&(fHg2Ar%{IHar*8f8nNviP(=(?V+ztMC!#bhEWJf~}^de7SEqPO?yoH?IY#h(kdd*&N$ z5fwH`?@GIH|NnRYjkIOvx~Sc>2{2b+F{h#0C^nG=v|LZpGWos6# z-Lh5S%+3;+8(@^z=TW!9J+ zIeSOj;?%$P-QPAkcRwzSXT0o}pWk$LZO=yMtqkHRX)h&SW+%S5W$*3iw)>`1*-IPG1_E8r`U6x}g7|J1vKbt~3;UV3rP%lOg8b*^D~c@;st{yQ#) zzIgsj-u}Gp-YY%lJFfnEcCESR^76+be*}A^Bz9lRT65sb${JBaqA3%N4`8VcJw@+tm%mkRUXypX=k0>?Q!?*Y3Qe5$PI$7l*}diq|7-+xRi;_j zWzE}LZu0ua(X&V5ZtZ;Z=gF&84Z0};x_{&TtX>%D-uK$&*^?(zuATYBzis+7@iPAq zsp+?rh0^*o13e{+r=IxJ#rNgcDYN;z4L33^d%*2f|6QoIf3wYu`Lk!o-`!cdWRJ<` zl~b!1o3ehqw`~5MZBl8guPncFsV@xD=ZyOsNbcUmeSTEUH% z-w1D=eEur9;;kZ`e)=er8}i+j@7&sYjQ-Nvbfe zGJg2%$ERI?zNDmzOu1~d$H2|rW`W;%Lzk?pb}M(wZ&nvQUoQIe*^_If>pk@P!|m;3 z4kl^Vyj;4b;Dm&X^BTLv@@opGPg$#JSe!FswsvLwduGOKX@yTuY-(~H^YY@p%JlBv zYqj&-^!c1Cgom;y=&QZv$FGkk+Dl#zaGB)VDgl{9tJAh+WcLu~7KYDVdr2wv1DcZ5GuM%&h6F9e_KFE-uzb49AylfTPv+|JNB z;cTYM%+CAkj#BgH?K^KoPnaHldmmG!tK1q>h0jHwy3|hmx$GQO?CE&iB(u3;uF9r( zDe?1v9`kR1X3iIKz`7`L@_H*lpYyt(7fd|y!r_^?sZWFH)+sxU_~wPmJTi>9F#o~x ziw9=vny;^&Q*`3~fsK9-ggFxaxc-osQ^8vC?#J2*^R@eK?)Y?O%atuX%UqAW`*p@- zTFsX8^JmSBc;5B>y5Y{5JHNiQePR0Q+M_p2dA}WY*xH(&x@CX&;P>S!$E5H7asRtS zPIbdK9<$UXOH;$j0wZ+ZWSl?sO|U+9m-OZ;m1jQR`PN-%y(GNy$*U}ew~_*{e_PG> zE)89EO1pXDJrT=KIrr{I_Hb_5zI{W_>Uopq?0vaUn|XSjlG4+c$?Na_PCPZ|RoAzm zePTgHsVwKR&+ij?|7DrRrtQ8{!nbUEr6ssy(I5Hfn6GS+f%|5!*(2su8fxwF`*gPY z#yiiy*8Ehhw@P05>FKok&W8nPx^G=9% z74LLWVwFDsNw_oQU(TJA{{9CA6`vb*hAazc^5|ULc}qfCTAF$Jij}$tHE-zDsoh_$ zZY1!oT+MpgDNzNXS3e|lzJ{h7Xm*lltY4J)$0%{vldk&@ zT3Cdod;Wi@;i>TZv)ZAgWCQ=FP#GD|hI`!m{vCRBKEq|aZ*O?7+7qwmBmW?e zwZJeO)utxsT&#MLr2O1ceL2WF%`TTwhm~vPj zb-a+bIq)#XLWWP{i-G*%21aJKp8Ha&%=4J1^!%1+IGV(`nyK`+?As`qWPj%*d%Zos z)r8L+hZ@Je@k+x_2{s-HgM=EBfLa?E=TF*6i6vrozdaa~=G~tgnrPR?$jrtgANOL8zkV7Lu(vL4$1mng z5sCUl$I$;ryMBF$6Id}jMz2Kg@6q!IpZ?a+JEwn7zoBl=?%luV{rIu!@Qe8ATmfsD zUnPD2^6O@_%(*x(;RSWKbG1HJcqhgvWxalKe#V^;{rM}_|4LxLIy*XaX^p00^DACW zv2|I8&8Pi-c84dwI-t~bQD6DVS0D8{HR4une>J!H&y;ZUSwUZeR~m<`Pp=KI7eDpZ zGbM>{l19LuWTw9D9e2;Ydh>+E^;_6}@2mPhXPTc|`rx`q(WRW{OtB>|KkwXb*gEs5 z_muoK$Nc}>Jqb8G&)@UxyJH{k*X&vQYL$)X`uaZ`XNTlZOZvL|`n$VEr}nH~@NdhK zee=%07Uz1k`sg1U$Ggf~)R%~#&GoLE$P&Bk^P;mo{<@u_`&TVkRj2pT{`q6?>Fc&X zdUW(x=Z@L0qwh>EK5*i_=z??aJNp;L?48u>)UtEt%$ZY*{~Y)evTJvyBAZv%ZsXv0 zZy#8mvZ~&={lwSA`@5!kubWkEx@oI%Y;GFUDdW;JZ>DLi^LeNo<77EIddbsk;^9xu zZafznuEtRHSYqPiS<=$%4pJ$Z<ONq5>gFbc`BTIuyo@XL(RUZ^YYdw{DR{3Q z;b7z7;M;v?|9-vaRIIFg|4N|HzLh&x{$_}pveGYdMu2v(Z|GX#S;xh#xJ~#a+?6ga zl7F5$HK~5F#U-{sVHs|R1Ii~(o;kB~BeC959+j2+wREE*h?#(^RdUt$1cy8IUb5{eD z=lGgUo7R&Xd#-%d;j0|gr#mL4-CFqTPsg0Myi=1hb#=-{ya;6 z?zWi1dEd%<{slwBb;qX9l?XO1{CBA9k?WzVxgqmZ+aGOR*8JU~^5w0a8s~q%{xEO( z&y(S+=H%`TzS(6yec6qfeT7?^cHLHPuKAO7YvuCGFBmPY&)mA9SmOLCd28H^P`!?~ zm1PT7`sfB{xwF3(s;%u(_!v~=y+ASl$6?U((jY*EHWnW>Kyv0C4 zsXS-Nxw|)9E;Hz<9-ghgCT@X}+3^YMF8nayJNa5rD^4h6YtCki8>}(L8~LPDPlzTJ zEt3!FZ1|%%!7=!t)9#zq;b*xQu*_1fbj!WKfogtVlvxs zR>;k*)r(H@X{n{$m=#~*b^SrgoDb^OvsJ82!WKgv#loEREUcGPy&X7Vb{=k`^@ind0qw@`czHk(PN0*)O)| zFbjR$t-t(3%f5oF<~csTv9F&whMzkA+IynJE-&SktGL}Z?wsqN_f{*uuFm7sw@VzW zoUf?7|MT|bg}6wzxyEVT(FVy^@A1iP{PKCbD(B?9UUz%pD>rVv>=tMJ`qkuBzQC2o z7yk%-dG&C&|F-EhXC4+Dc)s1rlv&9}{F2zL)!D1FU;R$^STb|juXmQbzcm`tzwLaK z`BkK0yXg7XYZ~V539woHFYXAMu!re#*u+WG z^J?GL|Ccl5iQ2jT$j{0D|AgwgR-K8JmY0#59cgP3o?otF!;!}vS<%_8&GhpqBeT7Y z$(}uhA8fYYwcL5|MWnCW`~HMuhGdi2wie!(^H$2L%nbUQJl9Wh=DSyBZCz{^ zf6woYU`~m0&tG8^*;V)E>RsIVuDvnq)Wi4hO{$`A{SJHh{C4iV2$Az2LZ2&1C3`Cg zmmjanWDm^`D2O!;oy;S~X)pSCNjZCA^es{dH zz-7~;|3B~lnVhFKcXPP-`=sC|Yn5<`R}t6x8q8&1v{;kB;J@Z1}n)Xket66XQRXzJSb-|Q_ug)xzT==WSxYzCc#L5W`TxQq9 zHVQxXwtlpCYT_3e(O=IOPVkPIDKC3Cz_qJe_7TU#rjz|&KCfh#DR+pMkdldfB)9r} zzvP~;M>`{p{3}i@D{5K3dvavkH8E$G3nn^z*~0sK?3wN|2yI^1D0B6B$)hVDKK!tf zuWH>~`%0p!fWupmizVmTy_uhUP9$%TIJ|BD{>L*f?mBooRqz>G`-L042K6Vi7rp!S zth~S1ufbhYw{hM=)`T~*MIR0~AMOsxkdP}_!PDrX8{fZa@9UYDc;hy!>hD~$cmAT2 z%k~^UkSso3^Na0@_b+BkHx+-qSktlHlRtKH)=by?&tx^{os>#n74dvps4N@L({Hcb zQd+*6*Z+!IT^PFXUiSXq{rinKtYci9SG_3q{rmq1cP--F!nWM{f|5?}mK*tRa{@aT zo)LAIkV;?M$d<5)wSAI!`0C#`*!H@!wbp7^?R%ZYBEOdcP(q{)%$YD#L~M|K?wRTfO0R<-Ga7!_VrM zFP$Ozqc8aRpMCo#UpQ<%=ltJes?+o?tqA+V*RHPM#K%1QG>;vV z3ar$zUr}Oqy?oU}8U3HN-^~B7nZJAQ=5XQHS@HX7j=kT!FFoi6>%D}PD;H;$RDBn9 z44trQev6X(YoW!Lf~R@37_1LC)Ayz*aQQ9iucarFGg(Y8JDxXUlzRC$G*Y$rx5CaJ zA_7-Tdl$$Vbv~K8^CIW7gBO2&`Cu`T^VqM4a?^L%m>ZcfvWTuYrp!I1^_jr>10@@d z*xid{6*Agixgc!rh8sOgcfP!u`%bU>)NN}~pA?B(5sN(SxwMw(oT&J*HFrXHLHi~P z8ylx3&bwMZ&FGetl$oVgP-!EU{ohCPeyVYK#c9R+@!NSF1tosJmss(8PXEF!o#D(c zjs@v$TeU}K^PwjfGP^em2S1jTm32NX!dCvBL*wM5Sg}r*sO6iEDC9qW_>ZsKZ()PE z72EW4DT{KsBx4?P9OZiYlX1FZoa$y)_fOs2KhLupMD7>2WBYtKZSzIj_nm*2bMv0` z+N*xZM$2Mzb;5$3h9@6R%)h>CMt5%a*YCzVJ}WG#X|#$-kPEZBGcQ|yg01rmUCz?- zk41(i-{%O&WL&%cJXzDt>|*bE@su|=tJrO2lP|aD39h{}mvwsfb|2fb`L%y{?2wOs z`Tel`zrTI?d66oIR?JkooAK@H^+Lm)Upq77KD%Tt+8_V#N@e=J>|;+`B$M?sDJi75yAvPt0AGz-?Pv`bJJF!t8P8j;@a5^}Es& z))f1jbJQ=WIX`pRf{7+m*RK`b`f-h5nOpGNJu<;bpMSAc2Ta}g?K`ttOBUxoEgR`p zudb78R95Rt9OQ_tjeWo4m1joVy)5%TkDd2V`SRsUkDbl`ol}~%lZqC<r&L zeM|j}UT@1Q3pVA`*1OuZE^Ik9o#k~IF7+iodu zGJgCJ2><%z@^Qxn%U)JazWwH1!uu;;S~LDGdi&;+I-khx-1{~=F1k*b9zmuTO;zjxLWyGXB3mwCUOdi6?r^{K88 zZoZ}I(UH%5_Zh5}^$8JEvvYQRy{X4KE&1V#=LwRLA-AF?$XxZWuX}ybr7JJx<-^vf zZDHvjF4TYA+4_7&YuDE67tOC-{I=$JvGwG-A7R(eJ-SvJEB#(Tee&&HiY!*!?XEq$ zyt{2$Sd`gA<|`j-CZCzqIA_L$18VCg%zF3w(d+!RsgvEK-c5@d z$6m=TJQ(rX+C?X0=A)B0A6jJVy4-OIF>&%EtpveZ0K=h+=d8toEb==DNB( zOUXbr|2@Z_8%+FluCh30Ym%|vh0P-DZ&-qsyiI<*;M{VpolZfrxmmNU|E^hj&MK)y zhWXOOrM=F%S3NoM&F613-nxlha?0HcA`d2Ss#qeHG-++md&!Dp=7QfBYOXZ%Yh zJj=3`Z`r<2W5weYP0yR6ZnjM?bX$9NuE4ixfk#g~+p}cG!ne=2&s%#{vNC1k`Kv}n zz4!hyy!qTEV|;pXZmDV0EtdyLr{2`ppFZ^VqMnFhERS7LpTgIDe*Kq^B_GQ#n>tUpo;LUE``YXmtx~hk8UMbcoSrKmpT6Yl zUVD`ls+TuAUz`@jxZ>x-IRfol{O)}#VLNp6?AcpaG>ek!x7$bjUwxeK-A2*3uAP2- zSF5w~=BO$!74LlWa+jGviujqAEdl0#^Xt~KA&&B<3{}c zI^FcD|C26gzu8~zf52vT`O>Qk`TATJ*j*9mcE9S}{Et8Pc*?7rDa{WyE&TcGP{)LO z#$WT4oc0UZiY!1NZYkO#5TC0nbuTf1oQ%P>&CaB*>*%Fy_vTF^}%GyUwYvqo=3mC>;Oj@!oq&^z&WU?oT8PQ@8`{wg~zqm z=0`7TtKRGU=k@aE!C(G;t(GlbynENfuPHNU&0Lrqyu0XNRbxN@v{fZ`m-`t_b=S>E ze#hf_yY}zVT4m?r`=>7cHQwrV>bRc%+a}rmWViUxRl6HamDV^i{N1-g@#gh?8Dftf zf6ec>#vNMkT=1JQ>zdB3| zmi_!&c)jOv=6SQkbDSE^(&=4Mz4|<5Usjy*zvOI^*O@+fz2vbuEBHU1{gc)9{M4ek zGTI%lCjZpX4i70^=o)s>AulGSAUQwwzl@vNVJb@c2rzH@(D2F%ns^vBA3 z)BcFOCB@cC%v*fU%DjEy(^0#8wYds5{<*yWUdQ_b;jZ=^S;?#VkG(lFY1L|` zMU%SPvM$yCKVLp~&zpU}FV8PZ~_UFi>f{{>CJRllG$_oLQH|c(;qv%AKx9{D@g8Hb=K_XXZIz%_#asM%>VhT7ZGP{Zu1C~sMeM0Hx_EH=wA9S z?q5d9{`IlvPDHd`&3&y^vOc||o_$(l$=@g4zmF~R&trX(+#hm=$M*It(Vr)~YtFnZ z|8;pU!wR$1=Iol7ov**1uQ#}4T73RZ(&+_nRo|Stq$iNMGhxlf1LvJ#1; z)jncwZpz%+75F4OH>vYQ++zO)pXPICMH=%7U5QgzA$w%!yM`TG<~>W=u>L{gp@I*# zod@?V-5hd3%X;s{cuDt5^D@nzYp1ep%S%|fdyf2zN5R4IFLLLYElx10`+gujcI}IA zMcQj5G&oAjRz?PUFFULg%iezL3^Vtx*M|=!ZMt~2vi{HUXumi<`UW!te^LK%C+ec z(XA6qnbY@b-o3Z3D*o*G@|rtaj^>sX>bt)Gqf>3Vq-S$P!}FAIr@Dm`e71{RUv&MP z{y9cXrgr6HIohjg-HJ}+uXaCssW0XC?8UinRV!brHXFN?6ertzs@%z0xB6({%DGsZ zPi$kgUq5(oQCHFI`ul~BMl;W*ZjQ7$c=D;;-I{e*V`pzU{nPcF>Jp`#JF6N*3KzYR zpZ1lv<+W?FXxB-d(>K~4YKFKqJz4JP z)32#VTin0Mb!A@M=l?4FKUa;;JpJF_cAcGYEMVC_i#fR+MV)>u)22@A3i>2x_iN*Q zp1Bf9KfYey{^iTo{6D9+zw7>SG@-tK&ArA&38!bBbXMJbJyiYohpoB=89Vn~%>2;n z_ju`}a=m-jBI~a#XFYaY@s14piU+W0~6C6BcsLjcW#ndb4}vz#jJ&K>$bXn zDO~ccob9dDzXJ>ZyqVK=a<#4AuA3#AcDtA4Pd9og_9VJ_=82*mvu`!32h5n2nYjGG ziJi61XJ7J{dT8vsQ!c6>Vl6e@*1Wxh&FXjC)R5F8JKDB5eGT`h{3H8uqfZeJ=ZvDo zci$azKKt%@e@)G%TTk9(L|nTk^fu$BUyH{+YwaVu>zr$MNhB_|KM^XxRr3GC&E)@8 zhmsawU%bF7qwkJPx$)m+8Hv>@%6A@0CKa{!&(jS&=JnWUmGy*|`!weUtL}T}t3BuF ztqzBj=NpAGn%{n3FMWNp-uCHz9JVvl&b>>Rvo_pihlMit<}*U24`qHk?HRc7cf5QT=rRtZG&%WIqEcYvZx&; z^A*)~UsxS`&&mth3Wt;w=9J~Sd(O(wx*jrdyZh}|d@J>DtM28L_$u;x?e_IEO*WbG zF0(pRzI67kipF2-6%X6oIkkFq)7#aY4HEKJ&kL{qF3o$F8rodxDflt@cb4I;+lRK* zFSu*8L*PSUMTlE<=9}Fp<%_uR5(-yY;Ly{SsUPTVJDx65(w`a6|rZnppQ z=SPV(O@Gg~=~|)2l1~*r>l!Xjt~_iLrEK_W>n;oL+sA^x`fa*-_*bdbsZ)ZMyMABx zt6Bfi@WIZ>s~OE2H6L&NS?a8GcGD*p9R;5)TX-M2RPQ;rZJFdJt6dv&GCDiuSFLwB z|DfHv>XG5A# zGk=Y#U1c}s+;!$uxV!xd%ZxRZHuu)QKhGMtqGplNkBNPrK0ZDj;UP|SO_O(DRe8V3 z&~sw>8f&qz&&{$rHB2&J-%IYE=3kbc?Y?Eg^3OSE=4c1}JlFrFMmUJ+@uOd+Vh$c> z%EBMX@XGIQJAQ;kxryu7?aw*AYi#!Tys_;v%b2WZUbF1{Id|bwXRY7Iy@hOJR+aZ} zSB`xjw$@m@oew(8gm!topt8CG6$R2eOp-Toz1KfADgUw;jMp3 zPs8I2AG3N-@=ttnx_YPZvpm04XXlmQ_@lPX>szz7^O5|&+xEAX=&s{yt^fa*m*vI7 z8JF%Y+hYB{>bC5v%$ln=a@MX7b`hJg=g8WZ|F%8UeX?|yw13_<;cuK@FP>Ytaiin5 z1XbVm6VF#@-8yO_ZDi+NF!kEGFmI!+9XDiC-UNgNulxV^z5Pb*MaBjX)A)BC=xV(F z_iFvm==QFwpYP5Lxa=O*@#9HE%eHxS>al#588+odSmb19ZF_z;W*o933> zWqK>)Jng`~S8jKkJ+9c9bf0ST66pVO)^Y0J*k&z*$*c>nT{|cD%&Kpv^6RgiyiCw#%aW|4t5? ztZZD}{ z-tU_{Nm%*vrw!fR2ajzp-LoiZ)o~4BUNQ51g}mSPen0x$w8HGvJ%`h(`<8CLaXLz0 z=fL}OXLnD`UA=YT{MvN67x{l~tV_sPb?>~gNxrQ8n?;`w7^|6@ab5J^|AOOBocSv5 zlJfjnz1!rj7_XD-ICDi{{gX`_H@dmY-+y)LkjL&Vo<9B!ec4yFX6&1;%=E@8V?s_D zON7-AXX}Gmy~P&|lXU{zkIM-P3qKGIoFV`IpT#b|`kgLw^n1z*v`_V#aIcPJSp2%h z@I`Kmh9leUR+Ww`S~+n`_IekE27WOAzfP9tq+8T=q3^1S&ve;t+ixuC?d$wd)UBub zZhuMPLOYM|8&h3;dbW3$|7F>>`bhZsE6;)gvY%Tldg?WK_Qffut1Xk$)}7;>e8lF+ z**Q18mpXYK7PJkxc+v4XpmOQ!eyXsae zH+#NF$h(xCThqU(xnG$2a>a7N5Sbg-?#maJo?YgcmUYu%;{D`W?%oA$3y!IOZeF`4 zR>4tM=JpHCG82s>t2{&R&r-`>{XM{JTdU}cu8Q{eJ~jg1{13!2h=>0^VY`|4>2t{$ zZi-2JzP{h-vh>(dcII++>Fo1aOfOOj*S&jxx9Hlp0#S#6*!i4URT(9Y?8{WS9>!kU zZ`f|Kd#(JeSuGxC=FUC(Z1EIg$4S-sC-QQ(u|?<;}h)$rC~(AdBYw{QSRVGWVvgIQFmc-o0;(UwC$H z+?f8);Xqd2ig{|ex@FTsxAbpW_{ocH`Ly4&qu5V6$t~TuZPEdeGh3&NT>ZM`y2#XT zkIN)KiynQtx3<=|HaT0QCOY$-z{>{Hs}n*^i!^TKoH+YB{;uWJ`EjwrnitO9=a#oG zeQ6c{cKx-8sba0}Ifu0J_&<5DI0w1RjC|yARejCUUs@@#_gQ*R+`7B)tk6N3l?sd5 z!)CBsuU>p&Qc_Ct|7{*W7u&wd*t={E%Z(`ZlMeerTzrg$BAsm-WNM}_@A%Di^xd;Z zQr-G@?!~BX@H@X$CyouBV0Yfd)s6=tfQ z9(82SI*r^Hl2V60w{Bu~i;u0emD=qUbCc<{r{(IsYnIe7@S99gwyKJQ%S;>8g-v57g-euO*h%vev%q_P@ZpP&mlQtcd3-I%l&vSnq zx}|sS!VVMJ^;Uw9IDX_dHtaGwE*8&rT_eIf*_5|b_Qlq_wyy$$OEp9Gn%%L=T(g^z z^XBS_ce}ICYz;lNjG^j(^09*NEWO)pcUx#r&{SRXbk?LtlQ!K-{Wmjh)AY^PIK88* zCp>iwEUrjZQoopO@NBFB?>7q?MroNAj(|)f$ zed^cp6SHd!r(1-?21Z3)JUWSSZr>iKrfCe;O9B;iQ%mRibWYlDw%Oxh*0HS_i*^cC z`I_`~%$;}DA~x?~Th*@LVw?d_Gd~+|&bB#Lvvc!S)*E?2ogJG0?4}l~ zx5p{-?wxD%8m#sov)Wbi&3-}tgYc6_SZ%8PlQjapGFER^F_PTxHqoiOhHqJUO6#UO zq1~4}3PlUdZdW@>9GvtfY5EA{iC11xq{wW&Td&SBz_MD&D$~u_l_6%shQ+2|9Rf}+O8!>iZYs3O@$4C?)NQ+$ z%KVDCW4344*%-y#4T{ZMn(S}c@A6uDR`1-$r&&MsmdajPwS{YQX^rLzA1=A=Th|L- zd7EnEr_nsCwNF;UfxrC9^=sRDgDl^a{&~cgB5$)e;o@l?jcd-8J8tsz{=4+7@#W#q z+AO8Dto_Y@{QI{xTo)1u>HSpM)N95gf8)-?x!EjRcQZ+CIQ!Y**3{kFr5-7#Z%Apx zI~>(*k{8;zY`WRf1(PcNm`#q7$SAt2wPwvSUXE2!XXdD0sPGY*=fe7(TT?=z%R@o2 zMzOB-gwR}O$GcHS1hySXPtsfV*xgZ9F6Po2=WA^04Vi(i^Iz-g>S^Z7w^}9jhj2bw z!>K&MD!`hbxY}?=I!6?F{fnueu~-MyLXQ*>gC7i zLM3b4d&zn}NyiL=S&qF^?DtFk;Ns36z2)p&+l?9N#aT&JGac?cc=KWV_H8qEySMK) zd8HOm|9$3>iw_r`TJ+`A!mGxtA2g5oGyRX#=~Tayx@Ns0>mp{p-aRLUx?8uHe)t-o zG>FpA)nFW>uWM@S|_x%=P=)K5cyzvi|PRX$9A{mGtUfZRitE^;tTF ze`$2qP32`Xy0l$?rgqkUd%Iw%fwK7K&s7aSX5V_!8u7_|@9Ebc{q()w`Lpg=bzj2q zUyD|>gx9&*&IXv);Nal_YIi3o@3Q7 zrf{i(`*${XmwcJr^s6Z0pJTFP)xRYVN>^3|*Gzep+q5cZpQqV>8OPf0y}x3AMCjN} z^GKcb*uFtrEMTU;f2#U%AdHa=5On_=g}~6yyx{}%Yy4t z&z3Gu66uQnfAGFi$aMAJe>gxcB`zbcvz6nd|@YN6AyY{zlLHQCE4`ru)}_{kz{WVuNE`GINLps1-$s+ z&cr(9!lT$o(PzmLpw*Wj3mL4o|M^f*Ts+xn;hOpn3{zRwJ!qJk2sLiM=2;1uO&hmv zWlhcfB~eh>z$sG?bJZ!s0CPvS!~Lzx7sSl3uC71&d1pwz)y{~o-uIq=O*V+Xp&Y*d zu;*p_y(|Cy>fD~M&m#x1@!w0{IcpjDZZ;Hk{gsLF`}iQ?Y4>+-2Qh`HUwc1pe5GpF zvck)4p0sStL%XLAn!T74mZ zpGZEv;Q40G(t9sDHs~>V1T0qJ-*hspYzpJ>-m$I$*&&RGF|y;`*EY%#zjlaZ{9V}4_IVr9rpQA`qz!?+#-YhXFp82 z^_2bpwVM;CopTeKdSSvPh9ZCCbg8bklUi3rJ?F>yX*#_>d1e3fJ+(6(S*xDp?74IM z#Elyl%-9aIy}Y_j>HW9-btV$yp4()8%hoAa3;#PAw5?&G&>yEK=RW8?RK zKjx+%Qu@y1)wXB5>Am>(*@cP?I6-&MYB+NbNkcI`H>Sofpg&a-m!yG2%Q z(Lw)8J_lBDS7qj9vbx&~aB@_4yk?V_LN)sq4hk&D#pOgD*dpm3_+`AvE=cKkeW5!i8zxmUBWKBC9^vUK2~4xnXay#{L~YjGN{* zoc#6ogW;B(1&cl>Pw0Ib7`XKA?W~;(6s}!7bS3Qd?c4iGRXEenUHmd}b@xN_c$U)s zFqXF8B56PCf7{y`^Xi`LFW;gy|Ech+m@Qv(dB3cg6nJ~h&Ib1X-wv34cxWE)&VTu; zl2={UiuF(L9=})k;+&WHW}9nIo1XT_6vSIEYF_s9kcXjJX6zyH8xmPFXUuqM%cCa~ zF>jS&#fKZm4=e2JESXs!=<}Mha7$d^D*yB%-mjZxzuuE~=Lg%wj#uyXzg;ojboFxa zsa13HdVl^ZpD)3xv^i<6?d{)Dwl<%vJ+}Phvro6?uddC$Z?*81(Pee}<37>%b*r2g zr_FzRIcxFVw||;^zN|gH`_vixpI`cN9U_)|e_#K9XRc34T0lgQ&+UxhGy7{-KTli# zb!wf>=a_AQVr#Q=l7BtuS6g^u;yRzpt z5IJ3|X6>q7y9CV|Q&qNB9X@z(<$}eQ2i*4euZ~-}<+7J#kVcCv=fic&zW;m8y!zFp zn*7&I%WHJvHvGP4k^1S9)!z75KP6ft&ulX|Ei+wX`>WbNd$o<5{w;aG`+(2})=S>q zM>NGB|9bnsJo`KB z>Zyw2xUjwZPn;1{0E_e8AXV1Kbzvl3{C(G?m9zP)c=lb*H1sC7?&-nl0 z_-uaOuUppFuM@p`ea@2yf;9`mzAvlXF*Uh*bBXP%6Vyy{b8#)#G-;h(B}bDp6^V?C9qwOTV2vmo?|F>E4!g#l2qI zi98BEa?=v8W$J7Q33#miR@OL*!8iPt)KQboSG1b8?sX50F70W5yT-vb=*i1VSMEN0 z93FH}^3A&3c$2;R>vwEEEHW=^&h90k2dw#>dHk-HaYoA9PYF2*8S8evG zGvB(y@Nt>lmp;b#9y*-;Jh?COeT@BOLsxyA7}c@zXreXu{DaD0|5eB+sbtSRdn@rw zYeZe*Jkv!jvHL-l(c`(GlJMkJhS>*R3zz=f%ItojXYC}pw`&rjZm|_EvW-iRzRc5U z6w~kWc&AH=vuc%;{gsQx+X@vHY};=3z^rp_>etsvU+wA^)zwM;b&BKxMe75W+fIUc5IsGQ|Z-r8>h8RuKAkKx41O7x_NPO+2c=6&VOWc zC*OGS;Y3SP)1OPO{Q)v>-%H9pOw5)DHa++F!C_vxnZJ&-xU*mF7g!bB^X_(AY5%re zGi-`F{m*=JcVWB!^~#Y<_wVs5rZer|EdA_5^xv;r*VNda-M5)bOJc>DExer@_kMM* zxV?x8(kQGj2Y0QWH+rmV`|{+=lZ5OYJNN8aw|x8R)obfh#O~g>VO+0}u-)X!nF%kv z?>>F1>#QqUxzzdc>A$|Y%_)lgmm+LwndXIw)BH?3a1dS7)) zZ&SYZNl6vi4a=mAR=e@J&gQkO{M#}&_~-2`rW>HiU-s&)UHf^2-*>i5(xSc#vBjw`CuEyMznG%Ntr+xH!aAC=^-m;LZ zTY|q&&AQ6S+An-6gk9&6(Bpu$7B1zc+qZo4587sNyW|qr<0qM4CVFjF?a|~j|No`! z-GMd_rRf*Lk4a~(%D#2Hvca_V$*)zXZXM&ick=Rr$HkoUo8s?Hbv*BUF*t{*@t9rv znzvl10=z?g`JGv^v|H4~7qRKHmPwrA+H)`s1`^ zYRl3)Zy#Db_pR=;z85bV9G8Fmel*E0H!qFPKWg#EA53D+2k(i>a=nb+vRC<~-DHb4 zxm7x+R!GI!2A?Q5>ogXgG4ttG*@Y84?=qOneR%OYT4rNK|Gtd}Z`m>}`MoV`&YV5` zc41oaTpMd`+g|wo4~{K8{Mp$e?pLwvgALDqCl)W7ylq|P)jc1&Bo-~_`Ce4>rF-G| z^?!H0S~@>;pWKHpm-dI~@89}L_oV)O^Q&I&+cxi=JG19n8Cl@yLA3ZM5BL9Et?x&L)?DaCMsupO<6ob1l z^>*^i^MwCe31kvpZoj_2@=uAMKa^u!4}dn;u^&3#aL=KtZT^-1 zdQO%6?T-It8cLbx_%pGAHpuZ{hlh5q`WK_(nH`rn?DPnpw*=jkH`1_lOC LS3j3^P6 Date: Thu, 31 May 2018 13:55:30 +0200 Subject: [PATCH 28/52] Git: Fix handling Esc in "Create Local Branch" dialog Change-Id: I8415e7ffcdbeb648b28273aa5791144e95f63de9 Reviewed-by: Orgad Shaneh --- src/plugins/git/gitclient.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/git/gitclient.cpp b/src/plugins/git/gitclient.cpp index 3f03428594d..08e1cdb88dd 100644 --- a/src/plugins/git/gitclient.cpp +++ b/src/plugins/git/gitclient.cpp @@ -1137,7 +1137,7 @@ QStringList GitClient::setupCheckoutArguments(const QString &workingDirectory, ICore::settings(), "Git.CreateLocalBranchOnCheckout" /*setting*/, QDialogButtonBox::Yes | QDialogButtonBox::No /*buttons*/, QDialogButtonBox::No /*default button*/, - QDialogButtonBox::No /*button to save*/) == QDialogButtonBox::No) { + QDialogButtonBox::No /*button to save*/) != QDialogButtonBox::Yes) { return arguments; } From 2defef3d6f8048dacc8072b1f23ba72d6388b5c1 Mon Sep 17 00:00:00 2001 From: Ulf Hermann Date: Thu, 31 May 2018 14:26:26 +0200 Subject: [PATCH 29/52] Debugger: Add tracpointoverlay.png to debugger.qrc We're using it in debuggericons.cpp. Change-Id: I397ee1afb02594d14089fe31bc4dfaee1901ee71 Task-number: QTCREATORBUG-20426 Reviewed-by: hjk --- src/plugins/debugger/debugger.qrc | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/plugins/debugger/debugger.qrc b/src/plugins/debugger/debugger.qrc index 33577e6d237..4dbc903b591 100644 --- a/src/plugins/debugger/debugger.qrc +++ b/src/plugins/debugger/debugger.qrc @@ -45,5 +45,7 @@ images/recordfill@2x.png images/recordoutline.png images/recordoutline@2x.png + images/tracepointoverlay.png + images/tracepointoverlay@2x.png From 95aa52707d16f238119657c5237eeebb6833bc78 Mon Sep 17 00:00:00 2001 From: Ivan Donchevskii Date: Tue, 29 May 2018 14:38:57 +0200 Subject: [PATCH 30/52] Clang: Add links to web pages in Clang-Tidy configuration Each Clang-Tidy check get the separate link except clang-analyzer which has only a whole group page. Change-Id: I0b63cce8475109812280d9d44ac2d36aaa66e03b Reviewed-by: Nikolai Kosjar --- .../clangdiagnostictooltipwidget.cpp | 12 ++-- .../cpptools/clangdiagnosticconfigswidget.cpp | 68 ++++++++++++++++--- .../cpptools/clangdiagnosticconfigswidget.h | 1 + src/plugins/cpptools/cpptoolsconstants.h | 8 +++ 4 files changed, 72 insertions(+), 17 deletions(-) diff --git a/src/plugins/clangcodemodel/clangdiagnostictooltipwidget.cpp b/src/plugins/clangcodemodel/clangdiagnostictooltipwidget.cpp index 5f254f96868..24b9506fc28 100644 --- a/src/plugins/clangcodemodel/clangdiagnostictooltipwidget.cpp +++ b/src/plugins/clangcodemodel/clangdiagnostictooltipwidget.cpp @@ -28,6 +28,8 @@ #include +#include + #include #include @@ -46,14 +48,8 @@ namespace { // CLANG-UPGRADE-CHECK: Checks/update URLs. // -// For tidy, upgrade the version in the URL. Note that we cannot use the macro -// CLANG_VERSION here because it might denote a version that was not yet -// released (e.g. 6.0.1, but only 6.0.0 was released). -// -// For clazy, once it gets dedicated documentation pages for released versions, +// Once it gets dedicated documentation pages for released versions, // use them instead of pointing to master, as checks might vanish. -const char TIDY_DOCUMENTATION_URL_TEMPLATE[] - = "https://releases.llvm.org/6.0.0/tools/clang/tools/extra/docs/clang-tidy/checks/%1.html"; const char CLAZY_DOCUMENTATION_URL_TEMPLATE[] = "https://github.com/KDE/clazy/blob/master/docs/checks/README-%1.md"; @@ -283,7 +279,7 @@ private: return QString(); // Clang-Tidy - return QString::fromUtf8(TIDY_DOCUMENTATION_URL_TEMPLATE).arg(option); + return QString::fromUtf8(CppTools::Constants::TIDY_DOCUMENTATION_URL_TEMPLATE).arg(option); } static QString maybeClickableOption(const Utf8String &option) diff --git a/src/plugins/cpptools/clangdiagnosticconfigswidget.cpp b/src/plugins/cpptools/clangdiagnosticconfigswidget.cpp index 22b2950e5aa..6b5e0d73343 100644 --- a/src/plugins/cpptools/clangdiagnosticconfigswidget.cpp +++ b/src/plugins/cpptools/clangdiagnosticconfigswidget.cpp @@ -27,6 +27,7 @@ #include "cppcodemodelsettings.h" #include "cpptools_clangtidychecks.h" +#include "cpptoolsconstants.h" #include "cpptoolsreuse.h" #include "ui_clangdiagnosticconfigswidget.h" #include "ui_clangbasechecks.h" @@ -40,6 +41,7 @@ #include #include +#include #include #include #include @@ -47,6 +49,9 @@ namespace CppTools { +static constexpr const char CLANG_STATIC_ANALYZER_URL[] + = "https://clang-analyzer.llvm.org/available_checks.html"; + static void buildTree(ProjectExplorer::Tree *parent, ProjectExplorer::Tree *current, const Constants::TidyNode &node) @@ -64,6 +69,12 @@ static void buildTree(ProjectExplorer::Tree *parent, buildTree(current, new ProjectExplorer::Tree, nodeChild); } +static bool needsLink(ProjectExplorer::Tree *node) { + if (node->name == "clang-analyzer-") + return true; + return !node->isDir && !node->fullPath.toString().startsWith("clang-analyzer-"); +} + class TidyChecksTreeModel final : public ProjectExplorer::SelectableFilesModel { Q_OBJECT @@ -108,14 +119,45 @@ public: } } - QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const final + int columnCount(const QModelIndex &/*parent*/) const override { - if (!index.isValid() || role == Qt::DecorationRole) + return 2; + } + + QVariant data(const QModelIndex &fullIndex, int role = Qt::DisplayRole) const final + { + if (!fullIndex.isValid() || role == Qt::DecorationRole) + return QVariant(); + QModelIndex index = this->index(fullIndex.row(), 0, fullIndex.parent()); + auto *node = static_cast(index.internalPointer()); + + if (fullIndex.column() == 1) { + if (!needsLink(node)) + return QVariant(); + switch (role) { + case Qt::DisplayRole: + return tr("Web Page"); + case Qt::FontRole: { + QFont font = QApplication::font(); + font.setUnderline(true); + return font; + } + case Qt::ForegroundRole: + return QApplication::palette().link().color(); + case Qt::UserRole: { + // 'clang-analyzer-' group + if (node->isDir) + return QString::fromUtf8(CLANG_STATIC_ANALYZER_URL); + return QString::fromUtf8(Constants::TIDY_DOCUMENTATION_URL_TEMPLATE) + .arg(node->fullPath.toString()); + } + } return QVariant(); - if (role == Qt::DisplayRole) { - auto *node = static_cast(index.internalPointer()); - return node->isDir ? (node->name + "*") : node->name; } + + if (role == Qt::DisplayRole) + return node->isDir ? (node->name + "*") : node->name; + return ProjectExplorer::SelectableFilesModel::data(index, role); } @@ -160,10 +202,7 @@ private: return false; } - if (!check.startsWith(nodeName)) - return false; - - return true; + return check.startsWith(nodeName); }); return result; } @@ -203,6 +242,15 @@ ClangDiagnosticConfigsWidget::ClangDiagnosticConfigsWidget(const Core::Id &confi this, &ClangDiagnosticConfigsWidget::onRemoveButtonClicked); connectDiagnosticOptionsChanged(); + connect(m_tidyChecks->checksPrefixesTree, &QTreeView::clicked, + [this](const QModelIndex &index) { + const QString link = m_tidyTreeModel->data(index, Qt::UserRole).toString(); + if (link.isEmpty()) + return; + + QDesktopServices::openUrl(QUrl(link)); + }); + syncWidgetsToModel(configToSelect); } @@ -599,6 +647,8 @@ void ClangDiagnosticConfigsWidget::setupTabs() m_tidyChecks->setupUi(m_tidyChecksWidget); m_tidyChecks->checksPrefixesTree->setModel(m_tidyTreeModel.get()); m_tidyChecks->checksPrefixesTree->expandToDepth(0); + m_tidyChecks->checksPrefixesTree->header()->setStretchLastSection(false); + m_tidyChecks->checksPrefixesTree->header()->setSectionResizeMode(0, QHeaderView::Stretch); connect(m_tidyChecks->plainTextEditButton, &QPushButton::clicked, this, [this]() { QDialog dialog; dialog.setWindowTitle(tr("Checks")); diff --git a/src/plugins/cpptools/clangdiagnosticconfigswidget.h b/src/plugins/cpptools/clangdiagnosticconfigswidget.h index 53075932208..39753a74c66 100644 --- a/src/plugins/cpptools/clangdiagnosticconfigswidget.h +++ b/src/plugins/cpptools/clangdiagnosticconfigswidget.h @@ -73,6 +73,7 @@ private: void onRemoveButtonClicked(); void onClangTidyModeChanged(int index); void onClangTidyTreeChanged(); + void onClangTidyTreeItemClicked(const QModelIndex &index); void onClazyRadioButtonChanged(bool checked); void onDiagnosticOptionsEdited(); diff --git a/src/plugins/cpptools/cpptoolsconstants.h b/src/plugins/cpptools/cpptoolsconstants.h index 51ece3d025b..47fcd2568d9 100644 --- a/src/plugins/cpptools/cpptoolsconstants.h +++ b/src/plugins/cpptools/cpptoolsconstants.h @@ -93,5 +93,13 @@ const char LOCATOR_FILTER_DISPLAY_NAME[] = QT_TRANSLATE_NOOP("CppTools", "C++ Cl const char SYMBOLS_FIND_FILTER_ID[] = "Symbols"; const char SYMBOLS_FIND_FILTER_DISPLAY_NAME[] = QT_TRANSLATE_NOOP("CppTools", "C++ Symbols"); +// CLANG-UPGRADE-CHECK: Checks/update URLs. +// +// Upgrade the version in the URL. Note that we cannot use the macro +// CLANG_VERSION here because it might denote a version that was not yet +// released (e.g. 6.0.1, but only 6.0.0 was released). +constexpr const char TIDY_DOCUMENTATION_URL_TEMPLATE[] + = "https://releases.llvm.org/6.0.0/tools/clang/tools/extra/docs/clang-tidy/checks/%1.html"; + } // namespace Constants } // namespace CppTools From 0988442e58ae73cb5571c01a7e49c29b5e9b4b34 Mon Sep 17 00:00:00 2001 From: Christian Stenger Date: Thu, 31 May 2018 14:41:59 +0200 Subject: [PATCH 31/52] Android: Fix history completer key This patch gets rid of soft asserts regarding empty history key and a warning when trying to store these into the settings. Change-Id: I64440ebe7ae1fca660a1dc66a1646da5d17798bf Reviewed-by: hjk --- src/plugins/android/androidrunconfiguration.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/plugins/android/androidrunconfiguration.cpp b/src/plugins/android/androidrunconfiguration.cpp index ac1a6858bec..65505992fa6 100644 --- a/src/plugins/android/androidrunconfiguration.cpp +++ b/src/plugins/android/androidrunconfiguration.cpp @@ -115,6 +115,7 @@ AndroidRunConfiguration::AndroidRunConfiguration(Target *target, Core::Id id) amStartArgsAspect->setSettingsKey("Android.AmStartArgsKey"); amStartArgsAspect->setLabelText(tr("Activity manager start options:")); amStartArgsAspect->setDisplayStyle(BaseStringAspect::LineEditDisplay); + amStartArgsAspect->setHistoryCompleter("Android.AmStartArgs.History"); addExtraAspect(amStartArgsAspect); auto preStartShellCmdAspect = new BaseStringListAspect(this); From cf960e478844ce7414093c0f1b71a70d7f46e9ce Mon Sep 17 00:00:00 2001 From: Orgad Shaneh Date: Thu, 31 May 2018 20:11:40 +0300 Subject: [PATCH 32/52] Gerrit: Fix some clang-tidy warnings MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Change-Id: Idaccca0bd6d7682feeac8a0964ce2abb788f3e99 Reviewed-by: André Hartmann --- src/plugins/git/gerrit/gerritmodel.cpp | 6 +++--- src/plugins/git/gerrit/gerritplugin.cpp | 1 - src/plugins/git/gerrit/gerritplugin.h | 4 ++-- src/plugins/git/gerrit/gerritpushdialog.cpp | 2 +- 4 files changed, 6 insertions(+), 7 deletions(-) diff --git a/src/plugins/git/gerrit/gerritmodel.cpp b/src/plugins/git/gerrit/gerritmodel.cpp index 980ffa3d0c4..549f33196d7 100644 --- a/src/plugins/git/gerrit/gerritmodel.cpp +++ b/src/plugins/git/gerrit/gerritmodel.cpp @@ -480,19 +480,19 @@ static QStandardItem *numberSearchRecursion(QStandardItem *item, int number) if (QStandardItem *i = numberSearchRecursion(item->child(r, 0), number)) return i; } - return 0; + return nullptr; } QStandardItem *GerritModel::itemForNumber(int number) const { if (!number) - return 0; + return nullptr; const int numRows = rowCount(); for (int r = 0; r < numRows; ++r) { if (QStandardItem *i = numberSearchRecursion(item(r, 0), number)) return i; } - return 0; + return nullptr; } void GerritModel::refresh(const QSharedPointer &server, const QString &query) diff --git a/src/plugins/git/gerrit/gerritplugin.cpp b/src/plugins/git/gerrit/gerritplugin.cpp index 5e078d3c8e6..9ce2a082d60 100644 --- a/src/plugins/git/gerrit/gerritplugin.cpp +++ b/src/plugins/git/gerrit/gerritplugin.cpp @@ -267,7 +267,6 @@ GerritPlugin::GerritPlugin(QObject *parent) : QObject(parent) , m_parameters(new GerritParameters) , m_server(new GerritServer) - , m_gerritCommand(0), m_pushToGerritCommand(0) { } diff --git a/src/plugins/git/gerrit/gerritplugin.h b/src/plugins/git/gerrit/gerritplugin.h index 404a2c9f255..bd9d554bfba 100644 --- a/src/plugins/git/gerrit/gerritplugin.h +++ b/src/plugins/git/gerrit/gerritplugin.h @@ -78,8 +78,8 @@ private: QSharedPointer m_parameters; QSharedPointer m_server; QPointer m_dialog; - Core::Command *m_gerritCommand; - Core::Command *m_pushToGerritCommand; + Core::Command *m_gerritCommand = nullptr; + Core::Command *m_pushToGerritCommand = nullptr; QString m_reviewers; }; diff --git a/src/plugins/git/gerrit/gerritpushdialog.cpp b/src/plugins/git/gerrit/gerritpushdialog.cpp index 622da381793..c7e726a4ead 100644 --- a/src/plugins/git/gerrit/gerritpushdialog.cpp +++ b/src/plugins/git/gerrit/gerritpushdialog.cpp @@ -115,7 +115,7 @@ void GerritPushDialog::initRemoteBranches() continue; const QString ref = entries.at(0).mid(remotesPrefix.size()); int refBranchIndex = ref.indexOf('/'); - int timeT = entries.at(1).leftRef(entries.at(1).indexOf(' ')).toInt(); + unsigned int timeT = entries.at(1).leftRef(entries.at(1).indexOf(' ')).toUInt(); BranchDate bd(ref.mid(refBranchIndex + 1), QDateTime::fromTime_t(timeT).date()); m_remoteBranches.insertMulti(ref.left(refBranchIndex), bd); } From 234980699d2c5563baf9ae6d868a9f197f400f7b Mon Sep 17 00:00:00 2001 From: Nikolai Kosjar Date: Thu, 31 May 2018 14:22:17 +0200 Subject: [PATCH 33/52] Clang: Fix running UpdateExtraDocumentAnnotations job on outdated document Prior to this change, the UpdateExtraDocumentAnnotations job (e.g. providing the symbol outline information) was running concurrently to UpdateDocumentAnnotations job on the outdated translation unit. Now it runs on the same translation unit after the document was updated. Change-Id: I4d84102423592d8a1310c1ac0ebbce9bd76a3714 Reviewed-by: Ivan Donchevskii --- src/tools/clangbackend/source/clangjobrequest.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/tools/clangbackend/source/clangjobrequest.cpp b/src/tools/clangbackend/source/clangjobrequest.cpp index 2a37f8bfb2c..b3ec4ac07ff 100644 --- a/src/tools/clangbackend/source/clangjobrequest.cpp +++ b/src/tools/clangbackend/source/clangjobrequest.cpp @@ -157,7 +157,7 @@ static JobRequest::RunConditions conditionsForType(JobRequest::Type type) | Conditions(Condition::DocumentVisible); if (type == Type::RequestReferences || type == Type::FollowSymbol - || type == Type::RequestToolTip) { + || type == Type::RequestToolTip || type == Type::UpdateExtraDocumentAnnotations) { conditions |= Condition::CurrentDocumentRevision; } From 2a3bfea8a9034791148f9639966b47760f883bf8 Mon Sep 17 00:00:00 2001 From: Robert Loehning Date: Thu, 31 May 2018 17:28:49 +0200 Subject: [PATCH 34/52] Squish: Update for changed Options dialog Change-Id: I823e88e80a00079dbf0a2cbdfd72973d44001063 Reviewed-by: Christian Stenger --- tests/system/shared/utils.py | 6 +++--- tests/system/suite_general/tst_default_settings/test.py | 8 ++++---- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/tests/system/shared/utils.py b/tests/system/shared/utils.py index 0b8fb5818fa..e89e969a7e0 100644 --- a/tests/system/shared/utils.py +++ b/tests/system/shared/utils.py @@ -433,8 +433,8 @@ def iterateQtVersions(keepOptionsOpen=False, alreadyOnOptionsDialog=False, additionalResult = [] if not alreadyOnOptionsDialog: invokeMenuItem("Tools", "Options...") - waitForObjectItem(":Options_QListView", "Build & Run") - clickItem(":Options_QListView", "Build & Run", 14, 15, 0, Qt.LeftButton) + waitForObjectItem(":Options_QListView", "Kits") + clickItem(":Options_QListView", "Kits", 14, 15, 0, Qt.LeftButton) clickOnTab(":Options.qt_tabwidget_tabbar_QTabBar", "Qt Versions") pattern = re.compile("Qt version (?P.*?) for (?P.*)") treeView = waitForObject(":qtdirList_QTreeView") @@ -495,7 +495,7 @@ def iterateKits(keepOptionsOpen=False, alreadyOnOptionsDialog=False, if not alreadyOnOptionsDialog: invokeMenuItem("Tools", "Options...") waitForObjectItem(":Options_QListView", "Build & Run") - clickItem(":Options_QListView", "Build & Run", 14, 15, 0, Qt.LeftButton) + clickItem(":Options_QListView", "Kits", 14, 15, 0, Qt.LeftButton) clickOnTab(":Options.qt_tabwidget_tabbar_QTabBar", "Kits") treeView = waitForObject(":BuildAndRun_QTreeView") model = treeView.model() diff --git a/tests/system/suite_general/tst_default_settings/test.py b/tests/system/suite_general/tst_default_settings/test.py index 088d7246f6c..72ff89c7e38 100644 --- a/tests/system/suite_general/tst_default_settings/test.py +++ b/tests/system/suite_general/tst_default_settings/test.py @@ -40,7 +40,7 @@ def main(): if not startedWithoutPluginError(): return invokeMenuItem("Tools", "Options...") - __checkBuildAndRun__() + __checkKits__() clickButton(waitForObject(":Options.Cancel_QPushButton")) invokeMenuItem("File", "Exit") __checkCreatedSettings__(emptySettings) @@ -53,9 +53,9 @@ def __createMinimumIni__(emptyParent): iniFile.write("OverrideLanguage=C\n") iniFile.close() -def __checkBuildAndRun__(): - waitForObjectItem(":Options_QListView", "Build & Run") - clickItem(":Options_QListView", "Build & Run", 14, 15, 0, Qt.LeftButton) +def __checkKits__(): + waitForObjectItem(":Options_QListView", "Kits") + clickItem(":Options_QListView", "Kits", 14, 15, 0, Qt.LeftButton) # check compilers expectedCompilers = __getExpectedCompilers__() foundCompilers = [] From d7b8dcc684f8808e573aabd890caf6eea307d7c8 Mon Sep 17 00:00:00 2001 From: Orgad Shaneh Date: Thu, 31 May 2018 22:15:57 +0300 Subject: [PATCH 35/52] Gerrit: Do not refresh dialog on update remotes when hidden Change-Id: Ie9b00c1a117b1b2a3823dcb9249ed563b3dbd4a7 Reviewed-by: Tobias Hunger --- src/plugins/git/gerrit/gerritdialog.cpp | 3 ++- src/plugins/git/gerrit/gerritplugin.cpp | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/plugins/git/gerrit/gerritdialog.cpp b/src/plugins/git/gerrit/gerritdialog.cpp index 8f3dea6b23e..d38d60cf151 100644 --- a/src/plugins/git/gerrit/gerritdialog.cpp +++ b/src/plugins/git/gerrit/gerritdialog.cpp @@ -224,7 +224,8 @@ void GerritDialog::remoteChanged() return; } *m_server = server; - refresh(); + if (isVisible()) + refresh(); } void GerritDialog::updateRemotes(bool forceReload) diff --git a/src/plugins/git/gerrit/gerritplugin.cpp b/src/plugins/git/gerrit/gerritplugin.cpp index 9ce2a082d60..57e8fd269e4 100644 --- a/src/plugins/git/gerrit/gerritplugin.cpp +++ b/src/plugins/git/gerrit/gerritplugin.cpp @@ -358,8 +358,8 @@ void GerritPlugin::openView() m_dialog = gd; } else { m_dialog->setCurrentPath(currentRepository()); - m_dialog->refresh(); } + m_dialog->refresh(); const Qt::WindowStates state = m_dialog->windowState(); if (state & Qt::WindowMinimized) m_dialog->setWindowState(state & ~Qt::WindowMinimized); From 1ddfb443b686ef04cc0e28363308ce70d01f0d73 Mon Sep 17 00:00:00 2001 From: Oswald Buddenhagen Date: Thu, 24 May 2018 20:50:32 +0200 Subject: [PATCH 36/52] qmake: fix file id mapping lifetime management, take 2 turns out that ref-counting the vfs class is insufficient, as now the ProFile cache (which expires after a timeout) could outlive all VFS instances and thus refer to ids which were discarded and later re-used. to avoid this, we let the cache instance hold a reference to the vfs class. amends d03fb3506. Task-number: QTCREATORBUG-20524 Change-Id: Idd4478ffc1c2405b3b83df32fba45b1f687f6a18 Reviewed-by: Robert Loehning Reviewed-by: Tobias Hunger --- src/shared/proparser/qmakeparser.cpp | 6 ++++++ src/shared/proparser/qmakeparser.h | 2 +- src/shared/proparser/qmakevfs.cpp | 13 +++++++++++-- src/shared/proparser/qmakevfs.h | 3 +++ 4 files changed, 21 insertions(+), 3 deletions(-) diff --git a/src/shared/proparser/qmakeparser.cpp b/src/shared/proparser/qmakeparser.cpp index 6b0ae22e83d..8d6ef622fd0 100644 --- a/src/shared/proparser/qmakeparser.cpp +++ b/src/shared/proparser/qmakeparser.cpp @@ -42,11 +42,17 @@ QT_BEGIN_NAMESPACE // /////////////////////////////////////////////////////////////////////// +ProFileCache::ProFileCache() +{ + QMakeVfs::ref(); +} + ProFileCache::~ProFileCache() { foreach (const Entry &ent, parsed_files) if (ent.pro) ent.pro->deref(); + QMakeVfs::deref(); } void ProFileCache::discardFile(const QString &fileName, QMakeVfs *vfs) diff --git a/src/shared/proparser/qmakeparser.h b/src/shared/proparser/qmakeparser.h index 0612b922620..a0c1ca17f18 100644 --- a/src/shared/proparser/qmakeparser.h +++ b/src/shared/proparser/qmakeparser.h @@ -197,7 +197,7 @@ Q_DECLARE_OPERATORS_FOR_FLAGS(QMakeParser::ParseFlags) class QMAKE_EXPORT ProFileCache { public: - ProFileCache() {} + ProFileCache(); ~ProFileCache(); void discardFile(int id); diff --git a/src/shared/proparser/qmakevfs.cpp b/src/shared/proparser/qmakevfs.cpp index c5c5b75c749..f438978badc 100644 --- a/src/shared/proparser/qmakevfs.cpp +++ b/src/shared/proparser/qmakevfs.cpp @@ -49,13 +49,23 @@ QMakeVfs::QMakeVfs() #ifndef QT_NO_TEXTCODEC m_textCodec = 0; #endif + ref(); +} + +QMakeVfs::~QMakeVfs() +{ + deref(); +} + +void QMakeVfs::ref() +{ #ifdef PROEVALUATOR_THREAD_SAFE QMutexLocker locker(&s_mutex); #endif ++s_refCount; } -QMakeVfs::~QMakeVfs() +void QMakeVfs::deref() { #ifdef PROEVALUATOR_THREAD_SAFE QMutexLocker locker(&s_mutex); @@ -67,7 +77,6 @@ QMakeVfs::~QMakeVfs() } } - #ifdef PROPARSER_THREAD_SAFE QMutex QMakeVfs::s_mutex; #endif diff --git a/src/shared/proparser/qmakevfs.h b/src/shared/proparser/qmakevfs.h index 34dd96fd7b7..00547cf7fce 100644 --- a/src/shared/proparser/qmakevfs.h +++ b/src/shared/proparser/qmakevfs.h @@ -74,6 +74,9 @@ public: QMakeVfs(); ~QMakeVfs(); + static void ref(); + static void deref(); + int idForFileName(const QString &fn, VfsFlags flags); QString fileNameForId(int id); bool writeFile(int id, QIODevice::OpenMode mode, VfsFlags flags, const QString &contents, QString *errStr); From 6c9343c2bb830d1dbb306bd98c441919f0ed0c77 Mon Sep 17 00:00:00 2001 From: Leena Miettinen Date: Thu, 31 May 2018 16:34:59 +0200 Subject: [PATCH 37/52] Doc: Describe "Auto-create build directories" CMake option Change-Id: I36bda5ae451af8cebfb0c8435c017c7773875211 Reviewed-by: Tobias Hunger --- doc/images/qtcreator-cmakeexecutable.png | Bin 9854 -> 28996 bytes doc/src/cmake/creator-projects-cmake.qdoc | 7 +++++-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/doc/images/qtcreator-cmakeexecutable.png b/doc/images/qtcreator-cmakeexecutable.png index d7d1b7fd85bd8b8cf4735984f4dd62e1fab223ea..8b328b0fb974e6c6861126971d90ec31f8a1557b 100644 GIT binary patch literal 28996 zcmeAS@N?(olHy`uVBq!ia0y~yV7$t}z}U>e#K6GtiAUCpfuWGw)5S5Q;?~>0U+a~R z&->8*UjIA)kA3s5@BO}Y`n=t{&)?fzU3T8Cy~xjE=7A40-WnPkZ`M711`HG;)lTwk zQuW@X;=M`7;LG-?Zw_iRQ`Bar*qnSm_guuQb?erxdsnx5*REZ!sewYJ2!Oq?%me;9m@mv9<-BY*YU@N_XS?Cy?yW?AwQqL_Q5{x1-0(tqC&@| z&$O7&wwYo!<r7v9guthuGih(BF*zSntiK58TK!_vVXdejnNd zI$eC!itFp;YX$az3<)KgBsZ-2fXV&ZjQxqXQfIdUUEEZ+8e z@#LzKk}q1Gp(#9G^InL4WHj_z^`AA30aeR9 z-ah@g(&K=2lCgx&KW+DaUjL?k-fm`QX13jO`SWxqz37VCWw9Qte9dsQPrmEOop>6=m|mS%HuK=o>$ZXg*QRMq30?NX<;=ZhK_|M~nKpX-$Z0$+@>Ab)9)$kUzO`Is=gfQ8FI)(?^wsm+*)P?9;=lj>w&X{C zaNl#~(C17iiyOZmFVdas#quEj0o%`TgU?u1kE*wh-OcUOSR~|WRxT3D;{hOd=9&B7nySVz_w@0kGp}*zH z?)SR;j_+R-tl1v)>qUP2OzYj&FKSmNy|Le??QE{CVK+tRO^iW+)KiHoDo4(#cAasG z4idT7`e^kZ3){WFKC7&r_jHDmZP${ndET!y|H;OGnPfft{pa-#8kT}RQ{6LOyr`_K zl+38feH3bA8j|&V%I5N}JVBL;pd;axjY0aq%EI8TW@eJ+2FobL5sm-qjDYJ7IerDH1j%%!2K zuP>}}UisuU-@my3^X9~ESbfJ=m+7_thtH8_6W*o1jJLig@Z)&>uk+Dta<(D=B+DvI z;vV^MDCfVwn!=*;?ak*Cyn4Ub*mi}fG8Z@dip~pD`}XeRrYR8Z|$qsX64$Bul7RZHJ$d-nCWTGi0Q8Ak0#iR-YOSc`5FWg{DrujJ z;+<;_u|E&W?tby<;l_uj4*BGtKhY=oDxz}Dyon1J=3Y4>wNyjz+Q|rYg{{eXD^581 zf4-P|`OdzjmyJ6gZ2hA>P3Fwhn-)(ue_UeN-Sqa(<8}+{!!F*;%FKVKv|U{I%%pd> zRMjl4{x3}J;m?a6eRdDunQl|$l_Qv$yVUaD(|gWO*~_msX{T9iakCaxUF!b*{S3F@ zZ{@#>oWAz*_|6edH-A>Fq$JZ@;=Jkivg%DeTTSKfZPt>Hww^klEAIGyk2iC^^8LPD z)hePmFXG;g{?6c#qB)(@CU*9H`ny|A^z)j-FWJ(Kd8hu4N=#k6sCeav(!bhsK3@DH z^<<9i&vU1^dcA$TdyDwEI+c#Nu_vc5!#<1@>&EC>pe{7RJH7Pq8WwA$} zzOz+ENlEEUNsqFY#)J3=Z-0iLdaL`X>izz|t9O-O71Z*)5UqPwDJ}EyLchG1yv%0{ z{p9~1-I149xnXT8v*^UQ)qk|7BrpX{SR8-zz_dSaLUg8HI>~D%<+*uwZ&;PxSz{Bv zcm<1z$!h|`zdv|1Yuy}yVkTWZO zey(@P2Od8^zKtQpOUKe_T?>2nuf1nG z{YV^N_nYF^+Pcr1Hcq^_u+wu}h*FL3epsX#4zfPY@oe9{XUl#~nK;8GbGo!)SMYR^2O^V%a+k}_ zu-mfxMndk(=@TWEeZQD|ze6B7RJ2&VzIbi*zMGHT&u|{!f7gg(g_OL6%*?sAlRV;1 z?_V)xui>QR#ObFec)A{cas2y=i~4u&-|})kzPY$^x$?ch(~255LSC=S%J_fgjzj$Y z#t@~d-2Z*MUa(uh9j1){0}b#n@g&_;!*q2&LZ&0YUdfhzxr}f)xQLrIy^gfe%z?|&@%Xi z*A3-TH8%DN>-Hzlo(pj#E_AUkS={^VeObz^`({S`9eJ}-lBZuW=zp+i+PO;|8TI1x zFI@1_@-I-Tk^L_>KW2{M>O;0RP0_9|F7}0V#m@7)a^%(z^ToMquP&c)-`G%HrB_!k ze5s3C=oy{9X}_ujZ2l(g)>siYF+O9(+T15k#6_G{+>W>Iy8GAZw!KP+Lx+z3$+E9K zuM{>L_!tCEmVWf?@l)9_`+a&7I#}1gkI&xSqx)rXt7n?jroU@#&h(V>ys-%^b8Smc zPj#s{{%!G+bK*y4t)4OK$5Gx(E;nB0bWGkqy?buu8-^&8%Tt6OJXn=0ZscHp{K=Dm z{s}J>j^B=d#oi{w+4ADlCmr?eGY*End#YN#LZ$h|v&V16uUc)_t*H!(e|G=w&LHov z4nqImIMp>~#ed$*SvPMU-;t~kxo7^O(zYK~%C71D{^@g(g2=WBJ0@MeuJ=D_kC%1r zggd`7it@zJv4Y{;irU^QUkgjO*Um=NIO=tv8jYb>Ebn%*WFsZrNVCXz7#H zQ4q5Cy}`MuUi+7Be!sR}pyPZ>_tS-|e!b(Jd}Zy|c>&62Kg{ygTzvo4w#;t|oo5fv z&RiH|RIl`R^ZvgFmrrb*>+?G+OVwO&;pcxd_J;~ReLvTtqVeOhwkYdk&$OE7_+AYu zxvOM!>F}DXKC9iryPe;zah{ON?9KjiMvmQqYsPl_msBRyEm89N%DmP}%Kg{c`91H~ z*IP_HExB0r*ZftjSNj7puWWntX%$y}a_Z?_oLPPo*2Y%!toP2iekLZdBq8MBi=6yz ztBV&*Z;yBTd*oKg)UBLavxN8VZL+C36dc@HR`qUgc8u8M;zJTe#@|=YOp4){E*)LH z?AfoqQ{P*=UEg$0Z(r>E&wKw(HG1AvYEonMe42*v)wo@1KMx1LEVDWo>HNF>jk4V4 z^%^%0Xq8s>iagJLK5v3t&I^I-23v1T{t|FkOU>+rk9|gm+gd-RDpqv?9i3)wws23= zzHLX&d|{Aw-v2Q7o#JPY4cBw?A6?&f!t(Li>s!B^JyW*x&hFO}?;W(Y7UzsRyq_r~ zzh=v&|OUq`lo``&lXS8Yay)D87quZ`kb z7I9C1&TiQ&khioZ+}HQ*!foY2Rc=XDeydNYBYM%kNwcPHY+GfhXl`$- zlk226gU8_7`4w3{ zQ{80s*w;R$=7B~0otx?wEKAOqbj{82`jiKz^Y<_04y@9W(B-}w^6%IFy8rCo_jvwE z?EJAq_gu)$Gdr_qs=GgxJ9zS>q3UJZ%98IMZE}gdVl%Z@F33LBHX|}LH0qLzrS;^1 zTbFs|R=u8eYijBDsZXc$>aFVyZ_(6VnJM8qIr2(Z&!Tyi&u+e~%Jj<&j-EMv)~s#w z^fs>OFV+#;7xyzfFjHyrMJwYkrcOT z>*@PlsrO3gl-bXdzr0wyUM_Qmeyv^p*PI@>4asZ+0Bz1s7*OZ#)t zDfelS>6`wpN>CRq&8_YKka+82`CY%7`Sllt4gaOhpT5rOlx(PJ_n~`FCwF_l3z|H8 zo7E}3*zZriJu!#B?V3fak`rG!XxzSWFXJ@VrVR#rKYzS$`k3uV z_FO-+X=Ya2|IgQ#IktWKuFHF-h6JdHX^Mv4jGSsLeaHA_*~IO=tJ=0r%>Q$RE&fyN zd87UN|2BK*2){dfY{zT6AD{B~|38wzGxZ<;uQ^wygj~IH<*kr->zavs5_m;*W25`q zGIu?R_Aig$`gdl}{{Fas3*UcU`dr*-=AS>0vc5gt>7%s!h@PqpTkZP?0=DdSlRZ^~ zEcYEVl)q~qbBg6hS2fSR2)=);_a@b^k6PRH@%V#^m+wPXF??UcVY__VsSA@!R`Sem zofq-H;~Rf?m;Ka5?J9qENr;=42Jio|%5>frA3f(l`^>1*$4zyoYu?(-_2KOzZ`UUK zR`JK2&ZQzds@6>^T$Lf%Xm2xpfnZ4+O{99supKUM!I=a{X>c0_SE z&ikN!?a=pN9Y@c@!R=BvYrk*Xzy7cOyM&oBWunaUOn>yKXCD3hT10oMhS(w(tv-b) zC0qOb0*0AO3)js%SH|Y{uJUuw+=nsw<^KH1&YN3q%}p+`coH7jH>u0qVrQ1=!V@kg zb30h>PrfpJ`+wI=;rVluo8B6h?`0S3Tlcg%+h|Xi`yvao3h$oPn|Wo=Jl~w$px{UYJXpu_`Wq_-`2Iu7g#qPp6dGQ zp5pr_E-HT*<2rsWeJ>p6`F8i@?|TjR>0A!TW>HMf-?Dejnmv2AmV4GH-e3GBbo$h( zq1)EK`|NkITc$~Ve#n>Nf1l=r) zC!ex;^f>x)VZ?e-%U3Z>k{@(`eP1tqDhua_YvsBMNli6q)GvnTsBbH9Qn=2;p8yx&{>pEY1 z_c7red-nYC{UN^BX!g|bu*(<1u3uriJbPA_^sQA{vlZnNnqHPJf3<7clrv0n|D}_s zF4$hS-tFkU-4hqIEc~vcr>7Tpdw&K;vP%38_lnIiaWM`LpY?BCOmTeJP&SD0cXS@lr*6C*>M_!ZS)PgmLQ zzrE9sE?c%NEIj<;?g#AVQx`5=IDPLr&VQ``nGWoJd;jUv)GIenypw*i>)C^w+vf}2 zeDFZwhxi|Eh6nfG7rbSB<(@fz-|o+MbgW)=zsYQ={>}c|{^)`HWBZpM*J1OoiWMwY zv$S(cUT{$JqwwGA!lqw;Y;1pD+!*WC|K04RljRd_hJSwxS?|78{dC5rG<*KO@}+TN z#hW+lnCdLeea}(aaU$iyF6Td!t2|z_vwzwCB0h3+|G)kF*W0hJC@I-<^VP~Hwz^Hh zkJNunpPQXE_u7_kw{F=!UfUCVBj` z=zp>M%i+b3xqk+_=XGo?w~TE$CS@^MuH?4l&nx~HBzpdCe-U4}xc%_q@Ad_!W;(~a zNb~l^Tly>fk6ZNor@lz@`u&Sk@6Y(Vw%|d$iAjFjxo@t-i z=Gd8J-LtJ%{3IUs*L3R?mIm{8@obZAZwoB@<8k=Hp*5*be@xkZbDnfo(vtG$lcUoF zbJ?w%U9^pr-&WWExwJ30uKQ=%-{|)*Wu(F!zHD1DTQp9lY{#8a^^+T>J~QAp4(5IB zacbh1ge6924qm@|E#UHvm5X*>yc_U!TbJwKt}jB9&s|?OW7f>s(MQk9%>R4r{6g_R zvr`kMh3x;eB&_}R+*dyxLf=lD=6LlDXOVjS+QZ(@1*HzJouV@BO<$Y!45_T>rQdw` zRjvR0{{PKier5~*Iv>&9$Io%-`EQSoHM!uB%P*T0?f*oadupa**g31J{ygc5ez`dZ zmvT4M?~nasYqR9(uZk(#%vmiXUCky;-<4dl|5BIkDz35(B|Rs63PQ}wd{&*|4ht&J zpBYS|>hFAxO_vF)oF&P!MRt=F@4wH&(n%|p|Fb>3$MVDb(|>kfp1z{~cwN)UW!Kzi zMziQ|G;{uHGO0Qc_gI_zI%WIpr zDgK_$?7bqHKP;-Nat)3>+Pj{4`}gaQc)!X79Y6Q*7VCli`UM3?qSjpg^=V%5hW-DR z%S%-N~!k6(*OzFe_P=(?qK`1D7a!7cMHtPOYHJ^Q)$2mZjgZLHjzpML-UcwT)> zOifZ1_fLjDzkUDDTE6{VT)4#XoneceUqBORDugtV@2YRo8RUa@WV^h(H{;lTfzy0zzOV{eA%#d!m*5@1Q z7X5nJ!g6MDZf2d*OBb4Vwf(^M_i1~W$tu?<1&)>_|%e0;Ce?QSyJ=@Oz)wxRC zOp-nS^8QPmhvv-sHg$D+)|Foo(f4(J9sLQ~rhn@G&?>Y5HYfm=rveHQZa>vLj^@in6Gq>pQ z^C#?PEwMPxa{I2`EUT(2HdF4JXElpAFPyipHX$xjT70*RpXt?&{PN4rn!7#K<=Dvm zE@j11yDs&e6T7@Fcz<G<`%C~*z<13pce&VyYw)AZ45C4v?zqFr$VUO(pNBj>2{O_$ma^q%Ca*;X^!b3W)ZFfjc1zU)`HR*HdZ{(|Hq+&@oVRD6H-dugTS zV?)a%%P#@U3=i(d&#vzmmVLMK=ac$$@u@`@?J7Hp{$#y+9GD#|_jA(zpInUj*)wgn zfBswcJXiPZ#CIiF&f2;mzFPwV&#;zTfmZmxN?F^ROOVi|U z_HmtC&r_o}{p9)m(Z@0bvsd1Fx$gN@?HKWNqnna)MJ6Zj-Z7Y4SXUT3W$MZKw()yh z8dK7rKR?|0Zkk%;nfF}HO(#-|TW+V7YCni)sA&J&9VPDL?>{+DtGKvWgzM>>H*cnY zdH>Xd%W(6??ORPWt>*XaTfgmzi?H+&iES67CP+-3`C`>?`+wi-|K3q8^;c1v&T3n; z;E#u==H~XFHI?6j^d!!G+xb7>=8=PEUN}BD_0+O_)vd_;S3=Hj&)RYH@8ti#rq}=4 zoEWv=rzAl7U1Cz!8_Amo><%BD>nyKntpbg*AsTwK#!=*m`aclYD^xBrE2 z5|S4*Kj?a~{I`&Bd7$}0S4T6p$QAB#UXBwcm!7lPdiLeE%N-6nQ95S(Qtxa&p4{^! z@|C6UM$2Z=nI}(5{uN=X-h0XGXkybjWzn5Awa2Gx#VObP>s%%~F=O!`jcq%08y{p$ zJt}tk#Ls#0dzSkt{K|ScW65{lrI9v$dC@MsIsPh>7OLo5ua4=9Fq{7P-_iS~0TRBk zo3Gq^=V9A?Df8Y#pKpi1hh$$%d?5#pgSY~RxAl@dY=7OF;^O`-yxL!Zf@fEI(J)?+`DHXdv;xa{?(v>J9m+}Z@A@CiM7gi{rE3r zEZn&3)8j*jldaQU&Ng;E$GA4*d&uA_?>X&rSR8Bt-AlB_8yk)U32ec(I9#=@mN8s8A!ETK>wPC9SMmhaKe@Mm)7Gt<^+nz< zwOnO={My1_3+5_oO11`a&$we1rNbQ({z+y@UhZ4D4wughUwvoxTCVrYn) z{9|pnKcl|9>>D3nKdY0BTz2y=m&lmAe?4p8+>!a;HS??MMCR)2_s^MG9XegDe`L)o z7V%nU=jitnUUg*}s%3XwxcvRpqWN(b+CTMt{lcr$d|XoBrfIToXxr--FRPEMK09*7 z_`>(Ke&x2YwY9a^AFZ7HcP9tCZFi3#k8s(N9}kOjIcs+py-88?5nPrqM>%ziO4fx$hu>G!(rS$`IN!9flHtMjC->*h{d-thEZ4%YNy0@% z?fRCm<*k{nyGXOjY4@Y5kd$AaYnM9yPiJ6gsE@zDznbTp+{&x3H}0CX zR$H+nA@{AA%&TV-A;$$ielxp%{n~bsx&DuA{qokV&&_!&vw%-i^2^%Zty{PD+PbPw z1(kaT_S+xYUn2H?f$E);M+_UaCU~n(daPUIIca}!glwut@b_;0eZN99*DPDUUh{fX zc)a`9cgw%aiTAu;`+d6QtE^WUnLjmlVvpHG5g+1A#ZGUmOmnm*pzYe~}?1^!m4l>)k6SkH7p_|JVO- z*GtnYR}FrMGcbI3pZ!am_xG__&+?6*IC7Kb%qi&KacJ?|Uu!(f!~MN?U&zz?KF9b; zk@xKzM~`aniq){sIobK~(+AUQS2h%=ySTU=Ju=mI-9j!dD~M^Yui3wmEwDJPyE02& z`}eb}B_(BP?rs8|=lWWfa7dfpZkW_&A|IOF-yt9$y+7;SOUK-#1+@-2JLdMKr<}cU z3?q zPAcim?`OA5`r8q9$bRde?qk}YKY#xHdH(-DFPG1c)0A*^R}s26r{DhHjtv_GdS8C{ z)8+kDvg-f+`j-|@KpdB`tsVLe4AQJj6t%8wskre5QmRe$K=C;n~fYRkgD zU0i)?hR=c2%`7XrWmYzvPVCm(&|UjVg=^0tx4&*3r*hUP6{R2C4+_7R|Ng30GJoaI zI5B6zf(7<}U;59l|5sU9SXfc;85>m+aZ|=eG8_>BlP~SOs(TT9pOJ9!X4V z2+x?%umA4;=X){b;^~L0s{+3W2X0<|@^7`98k^VqyBp;nc7?A}ip}Agm@VGr6#F(X zp|X72>h8@4YyU?4I$7A;%=<%};lO_VALT_wpH}^E|2zBC?8<*_B0X9%_p0CT<+uC6 z@VEQap%tILTPv$hcdNK1_U-G@_9p?~mIXI$*51Ya=x)xZz=h?Dw;wop^Tp)<{wq6= z<`rDL`t7aL`V*;AGu*bFJ0Es*N5rFlu{wN(+fKR5U#t2wXAZCZ&$(XQ&o`XADF*KT z=KtQld2{iLWlhJ@-2TpAIMKO&RlT6nL=H`fQ0oPg-k*N5`a}MX*|`t*HOzauU~SIJ z>st#q1j)b8jNf2zGa*~ZdXt67hZ~FD7VJNG)o@#aVC(wgZT@TK&0N=0P^#k?zmoNz zncvZF;ji1$J}&NV{ueb(c22XE`UibbN%KWtE2?N`%spN}lTOLyfW~T_TMzW56jxk56qML7*Yn$*n5~;8C1#aP`F4DkZ~GT7ZQ=h* zGQZTUyK$vq#`XhoYqwqsQaYv@Ve`Y~@Vbh`WnP{qEljP0em_3GcFx}-Zsm%9Yzzg|l$G_}nX?vL zm@r3wyV~*R*MF=~N?NvA#mtP)^mOzr=eca&%T|3j5W6>d&F9N+PZpli+G5Yl@Ik-F zo&`L%@}G&}gY?3Ml7D`yS=b)l*0)iX(Z}E*%Vllf-AZe=tZP16b#cGAxcKwu&&AD! zrfisQTT?yz-&5}mADMHy7=?Wd4u0{vtiyhK^{WRP_CJg_Igpy4|Net7tEr>&+xm+g zZ_H2cKOU4btMja^mYUc$jRRr+A3L=UJewiW+8@{|@ls%RYLW_{oAtqIeIL$We>mUA zTPbJW*GFfTUtXgmC-QujM07>oSJ#C}(HXI3X1`SoesbLZV#6LSX773OWBJj_j|Xx)w^?nE?#GV?DrR= zJ^sCvRe^WY^KGqtTLtXv)8^l<-NM~%Z#Mbk)t^5ae@FIT%&(kff9TWd_%H8|9AS}4 zljzKOz3kHU>*bGs*;l`c|6}wZ(RF4WzbUVL*30O0pUEx}$*Hr#zkN{QUi`t})3vVI z{DyfG{2$jlN2{pWTJG3a=Ui6WSX&(>5O;0LvQ?Qp%*>R?%;_t-8-2hBQsqs-{w60xkRgG%Mr`-J>_)^Qhx*l-(Q*` z`1BYP|Lb}4d^MwHSRUKn_au6z`0B22PKP!3lupH*$Tc+N=b(``2_sid9-QBk@YxRsv_he%x{xEdb|VUxURi7J2p_e!=YW{Zm({+5WJoBiw9rmSn8hvX-pd{L8~_rmv#YHTi3 z$<=@RR-EiOWy@9g>BH(dFQY6YCnZG}+1S2dQj>j{ zYE^Rep*+itWewh6I7?1M&5V%w{#|}SLPVTbLmAghwLfiV#rrE1>z2hwx{8$bJ~y3W z@zb1tli?NLnELp|Yja&}wf-&?lAoORXX?7jR|%PcOk9zByTqSoE|>6a_@A@jfV5E0 zB8?*pC;eWgWZOOGb;=sA4We>+>v)g;(au%ezkbex$_}OD;S)8vp82>&mevRU-?lNf zDm?SN%U_%NqTma@mTx52)h?NQsk9@||D(q>(IUsfMdvkmuZy$&%8XIkSzRe?{Vh|- z#`y%(8;2s9XK!+4uFZ%QSoK^W%+$ZMyi{Sz6Xl?>~sJBaceWnC#OS8jw>7% zZrH^1)-^o+qjU2dMZs;VhsAFCe+%#WHr;tcQOBFd3u5DhJ%W-J`zSvvyKvxo_^)N% zR%+$$kw4!<2>@$(z<$wfN8ublU2XUW!IvmU7zfBWz&tz#KSe;;>LxvOGT33JQ7IN5#ajfqvV z|Nou(UH@a|pWOvbrPr6%e>}0Lp)J?*!(~CyicIfhHaoklSz(5gFLnN_S=zsKiq4u( z*EgI^4lK)B(_G(^pA`RI(CqH)V*4$nDO2UdXHW2+=A(C>o#ogLw`bP_0~Npjsw)WW zkxhz7t7*urIDW;jPTThMp%v*8!9{Np^W_7!w`Or(V7+r=(pw>8_o+#$Gg*4CEY1Cr zBXHR3QBv-n*%y8*PF~^}FH#&+`P|6b_TW?g`jAg+Z!AfQ$cxe0ZLn=?THl{@VU35y5dMmd|>( z)%wOW&2^_+7oQFkTA5OjnU<<+qNkJ@7WmQV@}d;UxGkN9{h7Di91GvBe*5I#lR0fK zu5Deove5s($M+@c>dfA?ep|=Kcub##% z!AX+G-+tcGbjs@dibKy#9Sif8dAoSt7K=+#{b+cqV(q5-#QTD6w{kA`>D^La_Bvdj zT`KwNWA(t7Tes~wqiN6=VP$yoU{%%Yxqp-w&$_;RVpiZ%#_+J9X^-aav^t+GCf3JW z5D-~vvw6*_3$`YCLW|FpSpGQrqsrZ;>{Ain`L!`Nw-27Xw5WK|s_oOvp4TJ`6^mc& zf063C=Jay6hp|3i7I!~CX7hfMNm%jqV}~!CFs**OXtBzl)!*eZ*;}@6*f4eP-5DJo z#~XHBIJDDK@mh$~vPrvK;^y&nomsg&x%Thfb&VV2GJR{=BfJYII6r;I^y}fBWOmoc z)jLvIS{Dkv()@K$ZpLig`P0u_yw=?w{<-K;O!DkoFK%$99#A&hTfrJ_=M-e8fBJ0U zhwh$Li@yb5&vrYp@Sx$xzwFG959>94lysIUVQD}9YwsWBxt%j-Hn*GbnQPoRzV>g) zn&nsQ*XH}Qgg$v#p@IE zZ)=~{FHkz-epTOZ(??;^oZrv>>~3z`Yq9Iqfu7^GDHjgz=lZ`$X==bEIpI7>3zuoJ z-JME@+MF0CFP*eu z)wErnW~y^n{8bOVy(2BF(6wjRyyo(nC)4NOQ1_p^EnIC@^>Y4`8)qFU(Ek65kL&1p z>qSXD#A((&t+){gYd2|NpY=Zk?pOO*?ljR8_p_aQ)1l z88Kl}>z2KLBQ5{!r+b=baQfR+yZT>utJxlwPQ0nv=Jw1l&@-#w=kDk2;$|e zscK}nHCy-M_k;0r7CYE?)hw|A+tlqhCpQ+(Vhx12lN{XuL?;byU z*x2&?nNxO4HtDNwJaEkD!r8;GY@L%HHt}4YceeQ3;#eo0InBAgA$IE9%&&<^Ssz<| z&Ez$k>n=<8TQ}Nw?2O!(E)ujyCH`S!?)@3{FWJxN25nxxZ`rI}yJjtm{mJq50Yhlm zo6Qy$J~bB}H#=Wh(R4P^h;IT{WKV6%n_9IzSF`So?N4eu`hPBy*fOv2*!?@{F}g{Y z?w9_*#PVp#3y#|_W~y4oG4JTe>s=ZVoVu^NAoBE~2k!r0|6eL)d+SDg=A*0TR<|qe zD{h%XllD-TLpT{Qp;XclPJKs5-^;|Nj4vKb@U}-=0_|Hj86@eM<6* zZ`Q_y{irR-FQ~#n{;IA;!Wq7W{YN| z$eNdSy^`FvKwfH#kIU;TNHKW?k2rA5G$44Bb**M-^E1u zf6J+-kN3>k)1dQ;uT0RBi zhO256s!{?k>czjc-nB6{<#hY?esTYlnJ-xvTBek!-<~4=>tX$$ufeKMtJ4^-N~_n- zJ-TZ9pIH$RrG*>3epoOc{Y8c)u8 zdAIJ=jHy8}#`E80O9b0kJWu@gfq%a3HG|U6EALB1%Nf*Vyt=<_x6+~2b^+`7dd#G5 zOy!kJ%nn+!SM9<7zxVThel?Ol)wye%q3hnwM;bD+%lDs`J@iRzgK|&qYMCkSk^S8# zJ9QSXPrlSLf|Rko;dVXy-)}}v*qW9_y7ORi~1vz|DWfyqSW8h^W|1aMn$Le^~!m) zYbNXEr5{#Tl;_jQTJ z{q5Sh?^pS$OW1Nr-AXTg*>mh!!L<{I zO|OQ&W#(q@x!QTq@|M`858p1mxO3~CUTNNfRf|^btWKK!(Ti)}&aeC{j$99%Sr&hC zf0DfO-mTluzVXc~2-E6w$PpB++9WQzOb!dH^0Z~&CP}Sw`WG|ep-6{{HFHj z<*$}sH0?jT<#~3b%R=e;kd@}9_Y)@j z=*1*?HFME1p4rRU=dn2!)~Y`_`ReyN!xxSI&YM0j-`1)8TE|*H{QkewXIGy3KDBhQ zyG!ocO24B#uioug8RliY>eJ%{*Oe^m%g%j%I!pCrYOULi*tavLDd)Ur%AR@e{mdx6 zEJ@e$vn#ANtzURTdv9KlMt{lI?Ojr{t)}@HZ!lF1nJJ~TzpzJ`&qyXX@OUl58S`GRKm(?sc!O;Z9V>5*Q_$z*wwV-_`}P$ zCw1>Ih<=^*O>Oqu{QnkJkAy^jUhlJPe5YvFIy+lJuY2LWq~-~RpKf*d)|CIh(K2zV z>xl_6p{o|jxc%I7GS2+6=?BgGu3M)~QC^e3<($SA@z6+*L6cyiL)`3lE9N*R%gNt*Rg)UEZTCjQ zg;~#%lQPBPj^7jcv`41o>}kmrM&esV9qluVSN{%FwA;BlBHDLP;1ixzVW&6?uW`?s z7yHumW41(e{MJJ5{x?$%`?tsZ6?#z2L96dya@byDcBF zY`gJ>&TSP-4|H(~hE09*P-8V>%KK)zGOtu+Tzmb^~J?B;Z_r<^ar{3GY z`hCvgFE7K(JQoX}-8ZZJ{i>|`wK=h7mJ&-BPrb2KX~Fj!FRG_syRL3^W2RMP*6Um8 z+XDF_*{k2LtN$3qB&KeA@c*<)eY+k$w&uHew|LEi0{`t{c2&39q(s*iuq^ajHc@%g z&#!`C*T1v9vUShbnalkD9{dv0of%LfJM(G&)7RHezmQ+E@AuDieqJA*$!*Ibe_Wol zbnfAV^xl3`-uGIoD^miKYOnGn9Zx@@l6?1fIS)_%>KU%r-k;(Apls#((u^y|sdSdI zZs-4R57)9sxt;1a-DmW{U)I9qe00?8&-?$q`RvZ7rWU#R%GS*2B)5k)+v>I?u3lgG zdf~z8<)*&Q*3VUzcP8@5*R1_};eyxUQ|q4!WS=Vd)$AB^*5UZy@9$Pu$lraoe+)+{@DCh9S{U|L$NA*1i5^=ubC%5& zzEe_33txFZx&Ln?+v5)xr}nzKd&{qXc6Qeu3GSpgufRvkE>6FZEksam)es zc*&ZDITE-0)~;Lq(dVu6S-A_w8kY(>Jxgkj>uuY#U-U`x=b4)pcCG7jEBJrr&YV_z z!^}@Pz8~+DPTTb&F?;g%Hs1azH9xmoYb`U|ZfEW><6xUq@>gN$U&lS3EnE1q`_ZdO zGyLuMtxw8$8RX~cdvL|?HA|j6I3O2Uulms5{(8XGz(BL^b$1VB1b>aUG2{1Hy@99e zT;!o?%Vx_uDSepFE@*aldityj#=DMl@^1O{W8S<%kKn?{EsiCBmvCrz6&0VBjJBA3 zTsSy*)^wxIobolx3jOc@XjI!cu~YO|<;}Zx1m$7P5$1+(5+l&XGJJW z)V~T+kGio$V&%P`F_&Fb7wlNFC+4!wzKov=w{9NWUubpY?vKOPRjZ~c&JE48B7*ylyeD&KE@=QX@P{QOY9{fx|6`I=9Svyu-^ zdy(;9_M85!3zMs+?MO^mwxV{~#6!;KkGqB4T>NGEQih)&jPi5-3z;9fQdD@q=(tk( zq&l;mXXRraFJzZm{JQ&D;v+uykRxdwb!t0$5vZo(an2a#tNUuvNd0b=bu*ewBW4@sW9yso_VlC~qFe-1jE8zE4ZNc&2en{Y=w? z2W~%E`)1vbW!p_AwLZRWWAc30wWdnDJx=bfrBiaae(%XnS+^p2TP<_6{qYPR$MEv4 zr<{e)-}>wN@1(%nf>#3TC1>1C3IBd3&orZl#O}jyU1;8&t=D1 zETL@=ddt46I%lWz^xv2gThw}U4-5GZze`RLh*Ex0O+E(unW&cF3?5gG3YGt>7 z-;Rwr{CRpnve2H3M-Q>xRNlEa`zzDdtFa4;wRQ*mJ72cO>$$|HgQ4$Qlx#IxH?vPV znEFp;7l-9@TjwQ<7M}el`c6e_@;Z6G+Qf6|`OJUq0i;8NT|4WAnncw5hB=w_|w; z@1>1DW5Ytfm;8KjkiklEyZ^;ShEn+z-hPi_c-GHdaGmi)#k@09{0xs>>kCZl3woLS zdj;FeEmLbO8b1}Z$6huLzOwhuUQOA>hV5nN0{>n*a*54Kz1zL4O7pkwXQq(ncKh~S z-(36Aq~QEB$yVM~wVR*bKm7EckF4+dS8Y6tqknBYdphafgsaY9FZ}s-@@3>Jrjp{kgg0t-eV4j$vR3qP=$y^rYqME@Xl0aMk<0$4HDi&WT^*}jTt1WJlBIji z(!H9bX2z)|dlvlNcPzAF^^A+%%(Ah2Plg6BcK@-fB6JhO{==%p>*9qDhKJP54c_wf zka^>)1*ta+Cz_Z#ymY-t|%}W!HycqGe%DMge=k<^3x9Pebx}dkBiiCuA zN4{`~*&Ete*7C)~+~WMx{Ythf*ETbMG&#%NRUZA}zVWn2Gqs*qy|j7lxy{D5scY3Y z%V$roUYjnm^y}+8j~~xpZyyKmzu27Iwc6RHzI00eI{OLz>&*97Ox@nq^3eNc z*NmOld2g@xvp1Psv(@8c-SMk0+n?zatiRpxIPzD_gXPDimWiu<>R(s?!t0`8-(uPB zZ|vS7_MxA2SD*T7eDP8d4sK3FRlBD2mY3W5I?w8QrQcS_EiYfUTc<^0 z%B1_d&swI)y*bDKb^BJoHwAo_YyQ6U+tMK*A`*Mk`1`tF;=N}yZQEb+`b;u@^Jr&} zYrLX=!mm)jO~q@rZG8OU>+$<8zQ=ClsNHMHDW854)MQ;`mVPIhQEKKRiQ0qgmiO*2 zUTna#CsykBEAH@(Q(WEq?l?YH-E5)3_UE%)@J0^ZCkEd?roLZP&&a?KxBLIe_fr2W zQd3#)*|RY){HXj{_W$+c$B$QVn_M}2_Lwhg>3Oz)tPBsrU&LSeDfucP=gG3BU-Mn| z2JFi@V+LBt_I^YC`W<@?)|`LWP|wIv@%-=aJ|@r-@;}@llHq?7$QlS4_bUF%me)Ui zL=-d&cDm?SbFqU=mi_kr&>^S#`v1Op^=y4KLf*`SAVUSKZvS1U%O|Xqtay0B|E3D7K(3fsVF>}F1SE^?(>sRrt9px zb>L2@3uwJao%g@FGaYL`o;maA)9l%dKQN z5=k{lWqp4Zt(X{nysE1>D0ox%E_cuSUCDhm=9ll^i@1KryxZ>V8IU)Bto_` z=`r`CVpqz7r-?0Zza9Me(Q0dV4R7!6j-^XeKY3Kv`9&uG|MN*GRc>mc=M>hOlY5+& zuDD`tdSix^^y~>!=19m-4!>$?YTo}Sq$ScJ^a zcCN5lV_;gDnYeE8E`#lBl8e@?-LWOLtnlHf2Vmd*{Wn)8$EUBy_q49mjAdW0EfY8# z^!gTCTa{FIcemH+*Y0XJj|J{!{Pe!UKi4hn z=?j_4vL(9uwp;g<&M`8Ni4Tkl3Atx!V`+SEo}8H2+*#rGFWtNr5Eu~=6MEmy&h*~Z zd$v}V-m@g%zI?N0y^h|xy!UI)cXRaWuE~|1JI9%e4K&UD`ulsA_~f{_!pOovPtVB0 zL_fc}z}(jlZX{$!dV1DXd6lKc=4KXVMy3{))rFS3*Cr3ab*%6E zwbZ8}{gXVnyPq^pd)3tRY1XGjcm5=asHv{rQ@+90TvO3>`R=tuI}bN z3-#{xPUQP-j^4;ofXI>-6yP(oRZPfbx&SeloUQ{M3#B30|k z-rl#obcm^P!P<2i#@eQ;nueCP+RCbS3m4QEtys5a%f9NGi8evulcrCc*7i!PsLN}@ zvTC<<@nyTaiza^O?q0oHt!?%vE~)f@zsy%ap)~trer#IV*B@sxynQcUIHI8SR!scq zvL&LtXLNhZLsC+-SZ2mgi48F`xD-5PTG(Y%$H<6)E3A*d?ti>@Yow*=WNwc+&Z3q# zQ@`@EN=lZ7Cu&SNy7OUIQ`4?*jq7gxxiY8f(xn>j$UHws$Fj7<=SOT(*O(gH?&kQp zeO30F{bsg%lX{H!LBV4F`2N4PId@)7j5MlJ&g(RZ3XTd2y&pAk{gnoc zzL0sDd(Qu)R^~cgUtbSTU*EGQ)=SQrqj>(jKkpTF*P|*+mn~bmOe}P}--MIRzDGR^ zD`uQIw5#*w!&#Fa?dqG@d2rjDDL=NH+0vpSvS#g8Eqg^vOJ!wC&9w^_E!weUS#?^~ z3Iju>l^d!unDSj2L5>Q47r$qTrLC!1--nE9NRyG~yU&_x5GZ9r=cs$Ghkk8^{xm_HA z4mPLu{d;(^@XzZrM-uAe|6lm<=@87z$YsU@-P}0c${N5V0CWzsKK4@tf1EffWkRSyN4fT+s5kxXPhzAwN5Rw7B zmjy~P{A2yk1lrdFBGI%kFhC8*Y6Vi+ePBPRw1JTLv@n6z41(MPv1kBY)h;u9{RXO9 zA?W}@qExexNP>{~q6#H;!P~vaNI)oBz`Ml|ZllyykX8f4BM_2k@1P`B&}w_o-Yz2Y z1B!P*JKrD~39=~;;vNVIaSwzz-zv4&lQ`V8CjXyu5&K`(EjxFbmipBv3s3u{~k6t$Rg~MU;gTytdz{m zDPF1jIYD_BvLO%TM1~Kie~4dYI?ceqaL??7>wew;T}L0)GB7mEW;D8#e{}!z=g%|R zmj-FxQDb2EaLv*6L31fM_ZWlTjU?_ zKaXdAh)|d|Z@=XKb!#;2;@+&&opdtg6rXpQ)}qUjhm4QDDducHD{xAG{@UW5(KF`Q zZ#eUJUdDO99oZrx;$J^}`FV4?`|OY{ovK#fh1M}MF#O-={BQ1?H$NW7%kf`4Dsjw1 z(IuqU=zdRqxcLU}e;IKvoOyX;WAC=RF_wldtpD48UU_z*zPw*b&7XgJe@&hIJS>X0 zOzn!##`wJWiy^9kv7zT3obTE#>@5FxWgm0huU}Qa*tUO-`5jhSpbFY6GWX;A11I{P zGMBF2v+gr@T2_L~+Y8TfikmiX-aI@0nbdsqySHUtr@o#)hDYbFDqYrJhgQC^PQnz`_o#FoB3?K zp)Fe|DA?y_we4r9XV@`6J42T2(A3{c?s!yBUNWogMnHD)`VJ2NRMqG2o;H6h;TJxh z^pE>rZr<(X=lNCL*;IIJPX9Xjs^P<#H42ON&yTMN*&wgDwf#_HKva^lQV#D|8Sd;& zO-+ZGlACQORfjDP`ucVbv$E12U%8j+d2{S0zw(ORGI3Sy)dSzm`yRgZTC#E7j<{tlY(tMkSn1M8h*~hD!pBHF?5=89B{Pf#J2~zh8@>gE^RKDN1!;ipWg2qyEK>CME-8N6*({3>f731?a$8s zjg{MZ>p}74RjSis^z3KM%h6N6^~?OU;kgR!ndNTYJRKcMRgzIllqc$4b&c2|=zKWn z@}b>hTf6#x$xF`i%&d&(Z=CkrdX@dgVAI|($@txcZJn9IlV6|d_Kxgc zpXl+C1-!8NeNVl6o7p7qw2SS=-&(q-hF|2+ydEFx>*{*^&Mbk+v**pT-?PK`X4H(x z-6!s4^n1Ltz4f*rI5;RMFwl^9zP(UQ`CsO$e{Rw4o)K$$gQ`lzTleOAt;p2q@O)P} z>ASUMp=BF|i)_|Day~-1(0a(uHgort43N*LXHJKH>g1{jaP3N|tFod6;-~ z(`oNFk0MW;UcFT>r6NS>=(cm~laA~8`4{xg;}X&4@}Ix1Sa14=oiXzsta|nE(VI6` zdm=i{+qEtNt%$y_`~RPe!vA&a*B|!eWY{m**4B0aRM>6Zx|Nxk`8NZ@AF~y!R!K=q zGlR;@NghiUEn1|-z)&YGA};>^-Mgmx{1#B}8&XRllMEl;ufM!MY2ysPioDz>#}pK3Vq*$kg&XLEjb z3vJu6!@}I0{oh{Af4O;iZ6Dhi9=JDXy^GWMANNx{_VjLZp(zGjtxdE3G=rM8A8vno ze^2i3Dw(b@mjC;@|LwJz?(OgIe_k(6%we0wrJGhezRvo$_g(#SCq2iB-t+ro56QjI zkYD)t@6(t$CqFFxG+(z}@7#y8^XGY~82!9CbBgoI6%tQQ)KyI3Iaf0`zU1Au4@YkV zggifg&CWeOHU0SAorW8~a#w_1I<9T?YyLN;dbQ9uyOUbQ&3^W-Pp|F`mA&%*l}+3} z|%A zy>8KW@7!DX{_?^7?`PDDyQ{yyyKC{9H7QRf?9{1wn3WRtEac4P%EhUH|6V@1{#id) zRJGAAX3_Tu$->(f8P6Vc#y{z~V(@*#wZog=R^9dA@8o^eglX5!{C_KAKB?Uek-rmu zNI2o?gn-NUuZPY~%$>hW@1J6({Q5S_m(^3w+y0+iq8WGggGpdm-IC|CyhKkwZF*}W zf4TkCsfoE)YJ=8JTUdO%jVHPEwRKDX<%?Czqh)8lde#3Scelzn^P{yNrv~b>zF#-b za^mW>+1BT(&duKxY3}XB9{NL8^JeCyGOs(2YE=N%r(?_AN%$Fy?=t)d-bk;eB7URcW?Rcg^k6pWug@<9)0Y;d8YQ) zKSg=lox(+u8CRm8a2&Jyb@-vd_pCq9=<}R$Ww0Sm}8~ zt#up2e(he?e{TQz{jYcbzO*(kI`weVOxco*%)QK?t9O^2`f)+!mGR%CrCO$Ht4hkY z9lN*oi;K>(ZA)g|TjtL%@{Ya3ePc$=(*0JJmOEFaGe!n%xi@{*lo=tH4%a+d^mScI>|YfzHHnq0;~kWn z;x@J2{`Knep~FJ218sJ?^iNpD8dSNV`q+tJPCm64)#84NZ^L$4Og$&VC7yLAMCWzb zjEwu?zpGZQKJ@?N7cev3hlG|KGdQw;Y}GQpdq^ZoH||q%{JzkJ4Y(yeh~( zF5|2gqwCh`y*5gG(Up&0bMHi@rD+)n@2OD|5}qXGZoV|=+nXbIKHWO!5*`{=la%?~ z#EY$X%cK_~)eV!B?yd6d>i74{n!Su?o2iKCvoja2MHK~EiQl}jG-Z#a_|e!1b49UW zrkKgoB9C`7>)sWa*0MdOK`iA;ZSaZZm(RMMJgK=h*gAcB``)X*uUE9_-h7!Q@i2MP zPO+N6(?`^Lc7C7sr}{v;p33jtznAfx^3MpY)06Am+PwGf&(6T9wcWd=7oT)wYDjL%0rww#;mR#rvau{>@PzmD9(gvhy;RzSs9nJ^I6Sn_c?L&DR*5Q!mRrxpMldms5;KZSY$D zg>Fhy{X$(VZ?f%*UcLI|j_KRa@rzYT*p&5s+IaPo|NNyqM_;VE$>#bq^7YJ07uJZC zD_`ykE7j}nn_l#|gT>sLcmJ1Xw^Fw1^EBNtwGZCd{l#o|@&oGz{^vby&)%5+`Lk`? z%GRYzm&OM~d<-Zyy?AJ<1BZd>=d~GGeHSio<>>#qk^9}s-8oD|{v z7bi-I#771^NPQM%f5RYHZ$z{;Bk3PMP!4lziaF6Z*OHvj?KPhJ^ZR_R`QxDragaTO|Iw~e>SSEVLB{rb-DN5%eJlh{;D_F zkFZ*3+g|wg;gj-_xBwcmOnp|)|db3dDbCY;ScAYx^XS8y`-*pUbQLt;?1Yue{ApF zXnuRDl;9Mr&%G*hIarlC7jb{@oigFZnJE*h>wgM_@~^n1wyr?z@tr%TKTMLbzH@H# zw5F~NdopaJ)&12!H$?3b*>gieM#A~S$CdLAW?TMTUAwR>EbW-o|I*t=il)cRH~n`q zN==@2VA|Vb6|Gm!J@T`$f3fM>_f@ZCC%&YZ35=ik@o$us2v_q6_h!0k(CLf&7r z{Tgv)@syOky)WcN1wBq=9DZG|Ei*TF&R>p=FAW{zIKNhB_+_RPI6XG=N~m;-iHX^= z*!|np6*b;pKgMlbylHV9_v@ICN23~wuYBOzs;qqE#+fG%#lO!@GX7(-|JUL9XR8Be z{#^0%;Cs6(TTP6w)&1}=e|pmM@cHr!KYvf3^(@V8yZyyelFruKQ~&?`|84!Un=jb6 z9CCgCK0Yf}_tcyFjQRUy|I6v63(xV1nY8QIYUMpm$xfVYY5x|NaJC1nS^m=cu;t^4 z-CN#OJxe+2dQ|OcOQofotD5>Tw)832-70PV95UIPH^U?>v-JIG|Mx3jzt;Hw_x!G( z&ZlD(=NDIO*u3|2%I2Hl@)keZr-%AB)YnJ-+@5^XexbXH)j{{2B0Ldxn_e$U7T?`l zwJh*<(^i(_3&bwnb4jj>;5&8y^twAYKHQPitS`=)aOU^EU+vR!kBQYPxc}exe2c@! z1zGj)0}fb4sQRCaz0U5l)Y^K7Wb|+ILRTeDxvObQ%2SLbr|z9$7&h(Z-xc$k}BUZyyrJod*Od- z|G95VyDK=Ow#?3`d2K(n#;oQvwyrTa-_XI}{XX%J%PrMak>5EDPWmjX z%VCy#F1flTLrl`m=ME$QgbWg-8U7&0!tdv^6R7q8Awon72T8w=Jt z{k%V0@`aR)@0Wg6ff$?asL1HIVYA+)9K0+o`mN-;iSs#)FI%}zNYqDh>Luz5ZL#~) zU1k!krt@_(*O@sjv)Z@6iGSwAbx?m3%hliAr~cUb^yd294NfnQ*u5m_Z+qC?XrW^n zr<&bc4nF*p5HFj1z3bhjLk7jEPM=?xbZ**WHaTO(>eaam7N?8E+nuy}v?=g*^08wD z!NJ+`GY{UB%gx&N??T73GjHYO-Za+NxBX(z%D6VU@Ac9%HulQ8!Nt|tXV-s8`hL#; zm{9ChQ~8%x!b#lE3jaSldUVQ}&1pgJ>*_&$w{5#RV~e7d-|i0!G&eJ=Tk_cWwABko z_WLI7%Q=*1b^Ug6zkFo-=U-C$V!A)^<2Sb9+c8j$>-mu9ZDIr~;rS3fF?0faVks}8tT-aZ-!*FWCvX!Z8R=%BX(Zls5*^@1f zb#Yf4-=%Xg+Yii|*=MkN{gtg3_hm=2J$dH(`}jAz%0C{QpFP)PuK8+InUa|IFXH+M zWtDjn)4XrpUCDKE6Zg6GT;&0wM$RigpMMt~viJnMx9`8>>aY6W*_oMLGVRn_u2bgr z%hlDz<>}V=IbHVQrVzt!0)QD_#ZJz5cK<^zS{+;(bSc zO-8i94@uvx8#P}>DyOnb{0`MWKmC?{kg-d*%;Mu^{s(5~ul$#|RpG!3{rC4x zuY?7fDoxv#emlagH~&pB-*m5bUoK9L`}D1*YvRP6^|Jqyj04Xfuvsv#e&fUii__o5 z?^U+C#r}U^;s1GaPFU*{g}J^GO-mUZ4CN?rz5h>-yt#Dpfvq>I(hyeti6upI-CM;jY}Xc=2Lqv$(yLKFc4Slu~{#&&|J5<;%oP zr>kfE9wWWf~$};VVm~{Cm82>cxo@kIr3v>E%zp%AAy*Caza&W_sx| zFP|p*@9L{)=BMwzwXSfRX4Kl$@3Yp}@515Kcfy{rUY0rgeDu=S`7c_^J)6gF`uViS z&h7I)@?X2ofBu|Hw{XVE6FR+xQ)Q+1E;YN=vW|1glbL@Xd+%YD=YD%iP^ytXe@$b3 zz@3no3y*#OzFIa-^Kr&?x0Sow-D_SRo!N0zC?>|k;!W~TNv*e!1NHNa`ghuF3EZ-8 zj(7b1l=&xFe?%!OFDd<|s+PR?w&+n_rs`zI`|T%P*}fN)=Q7&|o~sCvVpeV1?08Vz zS7(Du(T8WzAKt%{%lfq2%KqZDI{~r5_9m{$MrO~_#LddeUjFWBzB_eY+pS;A7Jl8^ z%>3-!qbqNWa(^e3mnK!!m6qoh7p_{naND|_$#tJ69KR>|I&0n9l`C^)V{YDBG|BTx zYv`|o=RV!J^I5(u{?ZQKKh?tb_b<4ZVK0%hb$jB^AMJXvmg`l|3OWJS?zN|J^##^o%7beeb{tt z`lg#azuuj@_fIieaN5x&i`{a0*d90ZX;sg!O?V_$Ggo$7eQQw^#H(d`i^Wdj9^MNA^^;R7A?}z09;{b535~wCU6L zKZw6_oOhDqU$-WqwqNxO|L-aMUvyd3)^;xoL&J3yW8=+>7e8kGzsU0R>C@bx0hJJL zQ(IeJ(3s27(_7Qiix?Q<=8Nm8UfHVmDmEuAE$!PfBTLJlTFv?3VgGwlpaFmM`3&#h z;-vxIa!LEVbgiqH8g9)xV95d+gFO4AJR!j$G<2$mi~j0=4Bx(eTeogq0Usj+!@pYN zf4RB2uFmWBojP_QY|q}k4`rA@XF;U>=|0xy=j&TLwKq36_veovP@|@Q)~}jb!QcDY zeR(rz$m;*UqJMASzyJT?Fn@P<_e`H<^XK2^_SQdle&6o?S*K5TchA3N`(|lOPuxC{ zIdkG3?3Fq(KljC_H?t4>&+{uc-QM@^&`(~_2}=F-6Kn3*|F2b7SAXId!cw>JPxZms z+jdr4?JR(HUnd9W_=Fid$2ll^TQeSCv@8?hRQ=3*?-_39L&KG(_WR#^^rXcl^n`MCcKy=de`m3t-kP`kDYyQ-O@7ribvKKd-;8csR=vU%;qLzYXVZt!lh=5zVPBby;;GBor>MnvTFA2NuPZG;*_k_x$h>)JWffR92qH{{{QOrV^2$UXBHlL zkaH#RZe?;5&qRr&MJ4wwl~k|#fA0&{i@o^v`@e*VlPis0zg)IsG2^_8o`DYw11moY z>fLJ;e7SYYUf`M|LUYk?alcf9gEjR{`j#?z^@84 zLLc*g(LSZXlj0}8f8YP#Hmkd=u&~i|%`P$daOE)}f>^pU4 zg_8;2)l`4Sq#D7QdvD4}bia~Mn{!s_!^XlVll8u@z0+*t{5e2kjkUSjDv4g>`irqs zBxMDkJ`;3y-D~H0JU92zG|}X^oG)oNtU^xByFG1s{>?)nb5GU({~!6BZ@WmU%5=Xq z{ZlPp%$oJ`&c8DqGsK_&`2GL0?RvKwn|U5<*|$&mde-Ob{$EEnO+3~<865n3|1nOS zJ^T0c{eO<0KK=UI+Gvk`;aBAdwhC)U2a-x>e`P#o!>8sF?o{0CZ)``ny37u zzMAp#t{hqErxHhFFPCvFeYfFk%xyyrEu)1sl9}5LjT8)+e~N4OfBDAM|4mIK=OMHF zcgx$$*KmEb5)iDt@RNJ4&7`Cy@^%{Q0f-Q+(q5`TzC*f6~v(%ky6?8}}$a zOz+^{1@-&wuI4d#b?W#8!CqLi2@B64bDyYWv{cGEOe=Rm; z?^vv&yH29qq%80hU&d=r*Paw-zizjHteofha~9PZOYAOP zWAxVv<4HRo5p~DmaQ3{nI_D;8-1cbM6#Q`Gi>y1}xy9_J?>YLQyVXf9zNGEeK!)eelO$yr3{lRhx^`ZH#9BWZu|gT0C(?Q`LR7<^}Vg(3zjcGe(|E_tKx=ukQc|@w*h{f~thMpVs%>44ZV{{b{ZBh7M2Jc@@QT9lE}^wTrplH=TFq zXI=Z=+*8ZG?7n7oQ}WH*vt69Mx=UluCzjp1y)<^U{+WU%1%yj6sLmz4<4)=6cPq`~S~cEsI(r(ee3>jDAGioW+Wk=U2|< ztePgd`}p!5Y&&(nUEIz!<5MtScj=MGp63j2a?V$`2o-VdkI><}H&ODJ&XY|640d+$ zy8^QpI7{4pxR}>t9(VKa?+Z?!G@QBTc#6Dc+pYubEJr6d1~qc+p1fGO^5a8J(G`~y zeJYOJQlB1ub6KwEykFsUN78yj)OQJY9bbN8xBH~xonL00K5SZ}nYehZe7yLaR3-yFiN>wh3#OWv^KN>A~jq!dzwD z)XJN^*&b_RRV!CYvRdwRJ-P9sUVT??lzo;Y#q-0Kg1y(@_8S=rj!nVRr@TSUo?r_0x^TC_+gBx3%x% z|9?Vr@v{9IF@L?M{+>TGbX@?uSFq2P5++W=m##;7owxMf3vw^!F0Q?ODDc-opV_Nt z&T5-9D?MvD%Q}0|;;35Ve^b{U-RZve)Aq@+wq3u(c6kXq7hRZ;C!QM_7|6Pr{dDNN z7PHPNPgbVgaIm$H)e1B3ic8HgPhn+e5p-_a`$yU9#`EdZr{7LIwyII}^z`YAbp9Ui zFOm84C+Gfu{a!Av>F%$&K7KY1{QW8L&5NZ8H?CT?SC&o4U9ot{^B2$4KYzE+5IOtc z@!?pxlBkut`wH~@J$_cbGTZksk@KmxMj>zJN5#a8E=e&tF-b{jtJ*i_{{Hn-b@lC= zhRLr(CYB%8RJ+w8d-CbE1WrQ(D-|6>%{#8QHB!RsPRgAO`t|+yyMJ|JS>Lz36`rg# zck`_k;?pg-=gyobSiAg@pnK})eSf|Gg>2i%Yk2JViCH(w>NHn-^>q6BZ~gyeVe9<) z>*xLo*OI$9FD<@a)Zn;ap3Vf;g1?Lp;y=8X{0=E3}5RPWwDWU;|nOQxhyM{MzdZO6VT-t00+ zE>X0zyYsVd`s#GSIA&d`!rjU5BqXLpwdZdzHMTR+veVHqw6ilbv$}M1`xl9`Prq4O zEXmdSv-`%pcS4u??cVT-v9h?hyQrugaTlKCc45xha}i6~`IcVY%Ihmzyg7H?x{1xV zuYZ;0UaJ{*QTWEmhP}CB`z|i7dw%;_-@}VPb5{iYSfXWVXr^}O#m3a4OyAtv%MXrx z`o_0&^}ddT9Qiqy)Z1P|a$rmSQC`JgeTl78mOj1u(8n}(`i}_#(z8EInUZ^yMI3GUtqB0YO-Y9{KCQu zX&){qEnm4*<=SPnol7(gFI}?RwRG*BnCR=4I#w6-l~gQL)V3>Kz1A0SBWQZc=Y>@t zmLH4KcDbS})i(WPV?wWjE*$?4ZFvu7?b{K+hNZCf1Y zSzTS>kYiQl8xJ}k|8?`*h2vTOR_dy{xX*5R)AM1%46ZM?m9@G!de3Ql78rEuNH}Sq z&ktt5b-Fvt%4n}n?ww2D7qCfy%d3`p%i6Vjz1hQ+MLz%jEG>3DZ1rTDH*ek?zO?$7 zhKB8>z7Y2HJ=^}iy%~{iZN2-2=dsUE?LT^C>dcZB5S|xpy|3)*AMbs!B9A)LZm~WK zo;l|q6Mwb!?gdNkESqP#XGfHO3722w&D*PbJ{&sC@?=d+?_0Hd8hoF(g|FG#IIqjI zoJ(o$8yQ*U&9jcVAFrxzXaD_s`LzC)?6n#l{v|PvUwc06`a3gcou=ejm1Sb(-+R7& z=jZ4Dx|RRJIw3>Mf-t8jm=jt3YeU>%MC5r zV`6C1^nO#1$qjqg$8#^WH+?95dq|sY+ObzPZ{N)QtK7D2;V*G;NCf<42G{J%_tp2b z&8?r>`?10Xv~=siee-Ac-@VJz)m^(~%a$+lN(u@G?%k7v*TWerDnnQ=e&I4PG11Z0 zJqYe;i8ued&d2~VmJw82gZgNY*?b0&iO^+j@Re$y`Wv$T39<&Wq5i(@|9SK0FWx)V zYiYq1Muv*l3xpJnCdKIe_x&MWSXI?kRw2*8@PJK0?EfmZ#-EJ;mCl_zm%_lnkT3mY zQG8_QzxKb}44?)H*meexx5UBi4Vd6P&i`_FVdQ&MBb@0I$d`&Hw-a literal 9854 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Ⓢ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 diff --git a/doc/src/cmake/creator-projects-cmake.qdoc b/doc/src/cmake/creator-projects-cmake.qdoc index 85b28cb0950..2a590df8c32 100644 --- a/doc/src/cmake/creator-projects-cmake.qdoc +++ b/doc/src/cmake/creator-projects-cmake.qdoc @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2017 The Qt Company Ltd. +** Copyright (C) 2018 The Qt Company Ltd. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of the Qt Creator documentation. @@ -72,6 +72,9 @@ \li In the \uicontrol Path field, specify the path to the CMake executable. + \li Select the \uicontrol {Auto-create build directories} check box to + automatically create build directories for CMake projects. + \li Select \uicontrol Apply to save your changes. \endlist @@ -83,7 +86,7 @@ is. Select the \uicontrol Kits tab to add the CMake tool to a build and run kit. - The kit also specifies the CMake Generator that is used for producing + The kit also specifies the CMake generator that is used for producing project files for \QC and the configuration variables that are used: \image qtcreator-kits.png From fd710f15c90e60202c8b7c56fddf47fbb5ca13d0 Mon Sep 17 00:00:00 2001 From: Christian Kandeler Date: Fri, 1 Jun 2018 13:08:48 +0200 Subject: [PATCH 38/52] Update qbs submodule To HEAD of 1.12 branch. Change-Id: If93ae9f977882a1f0663c93e2aff21511322395f Reviewed-by: Joerg Bornemann --- src/plugins/qbsprojectmanager/qbsprofilessettingspage.cpp | 2 +- src/plugins/qbsprojectmanager/qbsprojectmanager.cpp | 5 +++-- src/shared/qbs | 2 +- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/plugins/qbsprojectmanager/qbsprofilessettingspage.cpp b/src/plugins/qbsprojectmanager/qbsprofilessettingspage.cpp index c2eb6b45d5e..4b7387039f8 100644 --- a/src/plugins/qbsprojectmanager/qbsprofilessettingspage.cpp +++ b/src/plugins/qbsprojectmanager/qbsprofilessettingspage.cpp @@ -100,7 +100,7 @@ void QbsProfilesSettingsPage::finish() QbsProfilesSettingsWidget::QbsProfilesSettingsWidget(QWidget *parent) : QWidget(parent) - , m_model(QbsProjectManagerSettings::qbsSettingsBaseDir()) + , m_model(QbsProjectManagerSettings::qbsSettingsBaseDir(), qbs::Settings::UserScope) { m_model.setEditable(false); m_ui.setupUi(this); diff --git a/src/plugins/qbsprojectmanager/qbsprojectmanager.cpp b/src/plugins/qbsprojectmanager/qbsprojectmanager.cpp index bb9bf44ce72..978ca571484 100644 --- a/src/plugins/qbsprojectmanager/qbsprojectmanager.cpp +++ b/src/plugins/qbsprojectmanager/qbsprojectmanager.cpp @@ -118,7 +118,8 @@ QString QbsManager::profileForKit(const ProjectExplorer::Kit *k) if (!k) return QString(); m_instance->updateProfileIfNecessary(k); - return settings()->value(qtcProfilePrefix() + k->id().toString()).toString(); + return settings()->value(qtcProfilePrefix() + k->id().toString(), qbs::Settings::UserScope) + .toString(); } void QbsManager::setProfileForKit(const QString &name, const ProjectExplorer::Kit *k) @@ -236,7 +237,7 @@ void QbsManager::handleKitRemoval(ProjectExplorer::Kit *kit) { m_kitsToBeSetupForQbs.removeOne(kit); const QString key = qtcProfilePrefix() + kit->id().toString(); - const QString profileName = settings()->value(key).toString(); + const QString profileName = settings()->value(key, qbs::Settings::UserScope).toString(); settings()->remove(key); qbs::Profile(profileName, settings()).removeProfile(); } diff --git a/src/shared/qbs b/src/shared/qbs index 49aec667b6f..40746dae364 160000 --- a/src/shared/qbs +++ b/src/shared/qbs @@ -1 +1 @@ -Subproject commit 49aec667b6f91b45a14b35cad42cb3b2dbcfbe33 +Subproject commit 40746dae36452398649481fecad9cdc5f25cc80f From 071a09f312661f0258c54b4d9762f0789a9932d4 Mon Sep 17 00:00:00 2001 From: Leena Miettinen Date: Thu, 31 May 2018 15:33:03 +0200 Subject: [PATCH 39/52] Doc: Update screenshots of Kit options This is now a top-level category, so the tab order is different from before. Task-number: QTCREATORBUG-20511 Change-Id: I0978dd12f1ea55cb4cb97f2635b9c1ef7b623c5f Reviewed-by: Robert Loehning Reviewed-by: hjk --- .../qtcreator-options-build-run-debuggers.png | Bin 26339 -> 91581 bytes doc/images/qtcreator-options-qbs.png | Bin 37688 -> 43851 bytes doc/images/qtcreator-qt4-qtversions-add.png | Bin 16129 -> 42241 bytes doc/images/qtcreator-toolchains.png | Bin 13634 -> 38070 bytes 4 files changed, 0 insertions(+), 0 deletions(-) diff --git a/doc/images/qtcreator-options-build-run-debuggers.png b/doc/images/qtcreator-options-build-run-debuggers.png index 6520f53768ce3619b2a600e054ac7388931ca7b0..b249ddbbeeb093077f61c1fb0155b2a7e198fbba 100644 GIT binary patch literal 91581 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 diff --git a/doc/images/qtcreator-options-qbs.png b/doc/images/qtcreator-options-qbs.png index 40149a37e0e4808a6a10bcb13df77e294538333f..6641902f1c00eb5b4ff06ad190e799264f56c105 100644 GIT binary patch literal 43851 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

Click to activate:

" + def kitIsActivated(kit): + return not (str(kit.toolTip).startswith("

Click to activate:

") + or str(kit.toolTip).startswith("

Kit is unsuited for Project

")) + try: treeView = waitForObject(":Projects.ProjectNavigationTreeView") except LookupError: @@ -92,12 +95,12 @@ def switchToBuildOrRunSettingsFor(targetCount, currentTarget, projectSettings): targetIndices = dumpIndices(treeView.model(), waitForObject(bAndRIndex)) targets = map(lambda t: str(t.data(0)), - filter(lambda x: not str(x.toolTip).startswith(clickToActivate), targetIndices)) + filter(kitIsActivated, targetIndices)) if not test.compare(targetCount, len(targets), "Check whether all chosen targets are listed."): return False # we assume the targets are still ordered the same way currentTargetIndex = getQModelIndexStr("text='%s'" % targets[currentTarget], bAndRIndex) - if not test.verify(not str(findObject(currentTargetIndex).toolTip).startswith(clickToActivate), + if not test.verify(kitIsActivated(findObject(currentTargetIndex)), "Verifying target '%s' is enabled." % targets[currentTarget]): return False index = waitForObject(currentTargetIndex) From 2fb270c77f6c7bef6b9f56d49ee8353cca78fdb1 Mon Sep 17 00:00:00 2001 From: Robert Loehning Date: Fri, 1 Jun 2018 17:30:27 +0200 Subject: [PATCH 52/52] Squish: Update tst_simple_analyze Change-Id: I2cbe39a225760f53d70487e105e2b45fd4e16d33 Reviewed-by: Christian Stenger --- tests/system/suite_debugger/tst_simple_analyze/test.py | 6 +++--- .../tst_simple_analyze/testdata/events_qt5.10.1.tsv | 2 +- .../tst_simple_analyze/testdata/events_qt5.6.1.tsv | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/tests/system/suite_debugger/tst_simple_analyze/test.py b/tests/system/suite_debugger/tst_simple_analyze/test.py index c1578ee55d9..8b73e7aa722 100644 --- a/tests/system/suite_debugger/tst_simple_analyze/test.py +++ b/tests/system/suite_debugger/tst_simple_analyze/test.py @@ -102,7 +102,7 @@ def performTest(workingDir, projectName, targetCount, availableConfigs): model = waitForObject(":Events.QmlProfilerEventsTable_QmlProfiler::" "Internal::QmlProfilerStatisticsMainView").model() compareEventsTab(model, "events_qt%s.tsv" % qtVersion) - test.compare(dumpItems(model, column=colPercent)[0], '100.00 %') + test.compare(dumpItems(model, column=colPercent)[0], '100 %') # cannot run following test on colShortest (unstable) for i in [colTotal, colMean, colMedian, colLongest]: for item in dumpItems(model, column=i)[2:5]: @@ -122,8 +122,8 @@ def performTest(workingDir, projectName, targetCount, availableConfigs): test.compare(model.index(row, colMean).data(), model.index(row, col).data(), "For just one call, no differences in execution time may be shown.") elif str(model.index(row, colCalls).data()) == "2": - test.compare(model.index(row, colMedian).data(), model.index(row, colLongest).data(), - "For two calls, median and longest time must be the same.") + test.compare(model.index(row, colMedian).data(), model.index(row, colMean).data(), + "For two calls, median and mean time must be the same.") progressBarWait(15000, False) # wait for "Build" progressbar to disappear clickButton(waitForObject(":Analyzer Toolbar.Clear_QToolButton")) test.verify(waitFor("model.rowCount() == 0", 3000), "Analyzer results cleared.") diff --git a/tests/system/suite_debugger/tst_simple_analyze/testdata/events_qt5.10.1.tsv b/tests/system/suite_debugger/tst_simple_analyze/testdata/events_qt5.10.1.tsv index 4038c164c97..8f40828cd41 100644 --- a/tests/system/suite_debugger/tst_simple_analyze/testdata/events_qt5.10.1.tsv +++ b/tests/system/suite_debugger/tst_simple_analyze/testdata/events_qt5.10.1.tsv @@ -1,5 +1,5 @@ "0" "1" "6" "11" -"" "" "1" "Main Program" +"" "" "1" "Main program" "main.qml:15" "Handling Signal" "2" "onTriggered: { runCount += 1; var i; for (i = 1; i < 2500; ++i) { var j = i * i; console.log(j); } }" "main.qml:15" "JavaScript" "2" "onTriggered" "main.qml:4" "Creating" "2" "QtQuick.Window/Window" diff --git a/tests/system/suite_debugger/tst_simple_analyze/testdata/events_qt5.6.1.tsv b/tests/system/suite_debugger/tst_simple_analyze/testdata/events_qt5.6.1.tsv index cd25a9eb10b..a5228fad419 100644 --- a/tests/system/suite_debugger/tst_simple_analyze/testdata/events_qt5.6.1.tsv +++ b/tests/system/suite_debugger/tst_simple_analyze/testdata/events_qt5.6.1.tsv @@ -1,5 +1,5 @@ "0" "1" "6" "11" -"" "" "1" "Main Program" +"" "" "1" "Main program" "main.qml:15" "Handling Signal" "2" "onTriggered: { runCount += 1; var i; for (i = 1; i < 2500; ++i) { var j = i * i; console.log(j); } }" "main.qml:15" "JavaScript" "2" "onTriggered" "main.qml:4" "Creating" "2" "QtQuick.Window/Window"

GH4t-dMZf^@Dbq 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%0D48U1=hu&n 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 uc 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 Zgjp4Z%ilB}+X!0T?&<31vd$@?2>>ibY0m%v literal 16129 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 diff --git a/doc/images/qtcreator-toolchains.png b/doc/images/qtcreator-toolchains.png index 0b573f034a7da14faf0817de61a3a4ac9dfa7a5f..91a6dbc7d7205287498dfd30c710b0e961e44f2e 100644 GIT binary patch literal 38070 zcmeAS@N?(olHy`uVBq!ia0y~yU}9%rU@YTcVqjn>4P7&pfniFmr;B4q#jUr0SqtVw z?t8&`uj6h<@7x)8J9>L>-q>mV{@l6S-`~Bx{b!d{*TGb_M%9~>bkfq&(l*TiQPYCv zG^L~^8g+b2S@yPQ=c<^pt*cLc_`mhm)JnS(pD+HbZU6sNqJr(>?S=r27Hw9B1Lu$I zxB075^WM_RDrsZH8S{C~&CF}18{%0#OdGx*ie)4>KVU1NWdei-uci+#s zkz*DlE_7pdz1{s+fA=$#d{TVKaIa8%!FBmBJ%Jh`QoU~VYbTsc(VFU2@2xP=!$$7? zqqA(Po-RrsdF>~^ShU#t|L3>zcUQbf+WYPH*QfbHQ^K3KFjpL3+iYV`4=_w+Lhc!W0{%GNv?_hi&SKmCbN!?lr!{x) zUj4ZApkV2r&)4%=zn+}5dfvLvYgxiHCUI2W&VFs7<*)Kj_0lH!?M=U&wB?U~{S%^R zsgReS^Tw!E=%RPrUir;TzZg%xeEhjaZ~98#nq^Z~U3Y&dF0M86$H{Fk%)fKq;MJL@ zJET&bNSTBLoc@mI#w<>Hsty39ZDXI<=8gDdGiDi@bD_}g))-U?Qmp5-?wZS`{X zfXy7WVe56KE-Ka&TWOzpUEm*!wv4RzlyvvqhcEtnr7b_@zUCBpv*qpWPka`BiCTDb zdBB>R`+qt8SJCzmNk9H%RZqfK{+5&;-E&ix9GTwp$UlV3aDL3}`8PH>Ok6$XMc5?m z5OJ=k!jgiJi)$V|;<+n%Nc^5k0_%gn+nPKI732E9ajcVyov*>Uzx@8*qLQMLX-Dp^ z+FgEoX;sqe2Nm_5Tfw9rRymIlwhZ0Ufjx1we}TULB|C4c#b zYa%PNrS>}{%gUYf^S_b$Pwymex44(rqW1Wc7uLBPiaeYUw*7>=kmCI9{^|+aIdvww zG~AAej6HsFWwdj1x6Q_qe$R-=IK_+KmtIolo9%uxHZJb&0~rsIP03PqwW+C7kK7Wk zRo`35sjczrknGh(sNBrB zYx_HIFWbcLa){ZiyS!zV#GB8NI*lQUiIcZYzu0B{#CBmw(V3&`lESW;d7iP|8RT(% z<#)%lx16rWWyFO0?=JY<&tGvQlqaqEgpJL=dEEb#v^!F?1QYMvKX%4=>6Wcq58ZY- zuD^7fn!T>cPRZ{3$AWhRwFYhRk9QZ(ovmUaQny|rE`fDxAfM*axMyzfIKS%ZRu)={ z_BZYS_u9Q&CdqRZ_qUKk_5bAMUBYx0$}Vt@h*Q^6`O>xI#FA5~tzH{8dyAjyI~kpE zQmeOIV_L^SE{2GQk=iHpk66!~$hc0dZ{NPi?CRxvratSKvh8Nyi~aw$+sAJGdfLxp z({__9yK^K0%_?fv3GMF^ZAsc0Veqv6__8d|1)i_Jy?X4FylMAqp`L%g^Zz9Z#(O?G zJtbZI$~lS8Yu5ce`|ZP)o|mz1@lh>HCoi74wEpywh_?0J2jA|Vcyn#-)s@TCzL)6F zJZ|g5;h%jc<}HWezS_^%bZw`fsr)nH{a*GkvtQ-<{|_scR}?R}__MKZ;k&=J@!sZrXO=?%TT`J3A>|n!M(H z6`#P2DUI#N%-7ys6nrV@Qj%QQl_RXu_e;C``LFLz5|fm#^FO{NwO3nZ%ZtD7r%$fF zzTvR)?)LWeS*^l9TqEn*;Kluy-pI)4$n6N_?RnC=>t)RD#r40l zWuGsZH}Thj30mudJm;?b)Vbn*^)LKUXb0H`V`Z(<;u@ zhYS6_`T3>EZJe5X*woDG*R*T*zQ#Jw{1?V1re@B=lx|tQ>AlFFJr}qZP2RkC;-3Ka z=|XQir%l-XN4NQL^54>Z`-znt#`(-LE`reg4-J?mg;rl%X!z=<6Lj{ zX6@W#82?>n(Tu2!b;Y6TsjbIu99{P@AnpIuH41@p4{yuJ8gHnX7@}jhQ^5aO>Je6R z-8I*Kw3x}p&hfbNEI>}!IyR=*TB~^Tr|vZM)%kz7>(6QWv-ZonSCZAct?fNlxVtK? zX_+1VK0+jCbH(h#{CAlr1s|HTN6C7Mdb{Pnb@Ln-hN+d=9x;Aews@&~$gKTe#phS_ zOxoG3 zTp0K%Sn_*l@@^Y(mcRO7^FASv)*t zp6_lyTYqKO&+ElA{;s>0c|%!n`i?vIBVHvZ2!@($S{|}5D$Y?w{QY^hdmDA;UR`$R z&MJ@pKNihAd(uh#e;TLOKR44mP7@>cT$fEMwKv$bjo*FVnLV|Km#)jt$VideeoOq( z{2O-X16KAGyymXm$~w=D?_=i2e~F!eij163rB{60WqIQIwPSZJH%%&8V{xdwV#iYd zCJcN@_xQveR-c;T;|eB zJI1ZYCtVHLp2E`_Fngxd{24D^PPXjVnt8iOX7Axc$-$F^gqj|Cui9M0#(*vr57JNR+4z4|CF|9jA6*h> ztaY~YF19#sefHnAM!}7Rk-R59K9^05`_}mMwD#$@J3n4)>)Xnm(&_XIlr(%46@8}N zc*Sx~KEwN0$egQM?%R`;l25WnZ+QnF*3Q&QB1X7{MC4(XmRm}ftD((>ST{GE-O zZzp+fKYXUAHh48#TibCr!;pUmi&-NQSQ%c4UR!L#eERszre3LNXWRV~614lJ4nB1I zz+3x&&XFTe*0ldz>Ud49u9G+C=*#kKx%xG6jyBSKVt)I7D-*M|KuBAnLPrWUdm+*fR&+&1sU3u>z?x^TlR$|k4G0$aQeOyxf)7?#L zuAEtv6tDfdK_T4x{+@5EII?YT_pAvC&hGy+Eh+r>l-}B-7yULb_APL%EGw$Y+_b%S zue(}Yjgs)*RiXl`UVaMrTmAi=wiw|tGYWwl`(zU`rTW%{tP_4$Hz~PyUfJJdSmAsiI>{zX9}#8K9vxx zD?ejabla3K@|ynjPJ0gpBp%p$TdrSAJGe=v#>xBIN$$dB<;<6)qh>{=8z_6`g)Ngi zId!I>n%%{y1Ev5WYw*kKQs8*vIh}GI@Z$zy&o$(Exv5~_D#_0Xn9r3yF1>?Em~J1 zxw<~%nb725iImqbCPm!75_8+s^Qn9%xD^te`rql;kpmYFnSFl}vhQZ_v|k&RtgQbV zQMl>qeA$W9V!}eio<0|!5wyccyguLis(f~{iseMv^IPq{Y`p%n-~LY4?Wr*f*w(k- zxwmM+g*#!d=I!zjHx+v_!Q4$M&C+Wo(_ZFtCaphy{rJ%`Z5ux?zyBKHpG8M6Iwd#G zpCA9>@T<~4-xA*c**C*JaPq^~uV-KHuoQT-+j^Nq`y=IRY4HH@1zi|B}uy;H#1+j+3AzNz#~98Niun@`YC=^ zmM12B=f6y2XaDi@$FVKCm(HJms(p87hG$G(ruYACe+0g3Xq%lm`-VS$<~5y-H)kxH z;7~8U*WdnIww2}6ZBLJ^@~;dzc;Sr8{R^k|`IH@rtrrn{@LWFP#{RZj^_}~U|Ip8C zE>Q`a(|N+!(lF25?&s<}hvqkrnv5=sNIrT0SUBR&?xj}G%hHeh`uS5mjDHjV)BCsi zULMVz5b)aUsh!+bM<>DWy=Ud)kMVpzd*OS3Ah%YlOT$cwnQ;r(^QQg&{maExC*$Re zITF${@21FZe&%hYb%i|^R^NKoR6%*|{B)68AlN6BF#JaqV5u z-F-33tb!LvEO>uOUH@Xb*3zJ*Q!?wq>lWosuTz_RD&RSn;Hth0$6kxnPMbGJ!{ydG z9<5fNk306nsS4McA6kExYxyT;uBq#Psjm4DQ{Ni=wbPN;;c0*W_dhNR18np5)~}k7 z;dkq?s`x9Bon{A4UORZ_jQZ-yMSHGKeVLG*ot!2Uve|F)>3QGOEyEXu&AGKsMd{_u z$#!ao-oO6!)#$HiOHgS}<>}nMUDv<*IH^VUE7z~vchF^(`t-;@f6K4+Z}kbC-={ut zk45;2Cof)Quj;)hwxWY`tLIc3+vpYid`^nO+()~L&&GavGQt1i?8C+T8NwLuiEA&2 zma)~l)%Y;(al`o)>lvhu`zi?R$=LoX?Ss)p#%>pt3pbe_X7?V@ZdB@A^ee2VqEV^y z+}qbyZx-9~wRRjA)@)*)=%e=NLMIDTqt9c{K<=jbRcc%HCH42rHTf%l%qDH^B?8|vybmz;Lg3Y?S-Us^16lL)yG~lzvbmsZDaHL zeev$58?V%R52qQ{*#@XwY{+{tv;OnihI6m7_XPR8z4^T8X3kf;$Xog`-~9ivifo_0 zckYZ^@y@b}aX-T^{HtF(o26IzXVrWWhKgc`@89+-7%%XzuC6w^68d9n)4k%PM$2B8*=}{tE%$e|MR&#L!H!%z0c#fEdBrDG%EuG!-u+N zqhI}N8@d`EmM}0dG>9GmjaV^6FfuSOFld8_1dy@^r4fu<|3%-w7CD7w*6M zb?uat*g57ud*|1m&YpdHcg56KPii+F`lh#V!;-3^D#m{g-nai_Ydh|KZ23c*1NVRb zG`F&wJ2Cc*_#6A_8}#(`*Y91qX5G4^jW;e|zC1sv_3YZaCtp^c2x8P{@SVk_&R8*j zWp>W=RRA+^PI85 z-jTWV+Li4^l}+i))2B@*;L{@Y}9Ebi>&+`z;T#?WAXg-b&*t&r8d{ddl>%PI2@E)d)(9qq#9 zYn&$A+j0Be9kmPdqaK~z&{R>HlTh^CR+I ztFlKAE$7HHtoiVGCX*if_6y;GclY_FZMgE%uKDE6+sa?6EnBvqefz264zu0X-4^GR z7fmcYk-l$B=7k@p9;q)Vkvl8j%oM*~)T6Hc$JzX^cgkE}>Cf22Q9U__?~X`9Yx)|8 zIXeCQyqAAJes8xkOL%&`w?*4!<_6KaFIVT*?(kpNv-QvV|G)Ylt<05^Iy&!gqQOm_ zoZXXC18y@F=J%gYeq)y2Zry%m{}R!FUFRQvT(oFWPj9cT$({Z6`v2D*DuSs(bM6%qA*EXG-^KR-&+6=&TB}lVau3rcr||IW|Nq$kKmUKx!|(h5+jfc0I`iaf6yyA? zCy`e#%RPK$;AMMk`|@h*DQ{!v@QGLN+&%lQfq$yEiml?eUsinUj+N)lxaq!3<@Ss_ zKOgM6tr4%5qHAALURYTEkwYuuZoA2YyW5&}9K36}lS})?+H&r`NN4YF$D5s*wSUdp zyMIUW>xaoDf0KV7DSX(PvexSE#Y<=J-mxs7v%sQNm~+qku!Mr2Yj$4yv*E*~P@lCM z3%?j8D<1k#=5dgvbo1fMsye0zKQ}J?uhMttkHHbuH4mS9PY`%dX`Sx9Rc~lk!aH?IpSCf)_@u~COC+lAJu8p1Lz_MJh!hY?6l;V{)>hk}d|63H@ zZZ%se)|Z!g^5i#fYl5YJYaP;md1FcXF)N9x>-^u^BJN(}UXd!#9k+6)w%4PH`~jJl zf>rm#X}@u)DO_KY$6p&1WWE1a{h#^&-$m@(duh$$Bk5>ubOhUaVV+uYjZtPMA&u5vNA{k!|yzKgAwlsG&VD}1xbXCM@6#)qz8u-oB%6C%g>$2svZbP; z;_`ISSF;+vZ(;Gg%oVEeVBxnFFLLJ{eaOiY^X2`)hYt__J9tp8|7gm`Z{PU&`S`wl z|6yY`*R44&=RkCNtGa*pjCNVg&)g?&SOq+1`DT{=*6#bg#?Pz`qIJ0kxDKpOW>w5o zIdp1Q&AY;7j%VUldF3ux^`M3E{XWrvx9_Cw_=F-De~7MOV0gb-l#PvT*|KG7_dO;E z1sqm6%HLDQ6UOi_vaheN?!{7OhI_Tz8X{Lqbj7~@aK=r8iqeQ9!rC! za&fgae4lc8^5nK>=bk?cuUO3psuuqQmwe&bWNEVjG@Y|x+1~00wObC|yctUD6*bPz%v#Pr_RX0pVtjq`v0C0#Zl*uCE-C%odY)NRbb^@s^~4B&28IJ%>l0cp zew6%@n3D43Fu(nt%FoaK{4u|5vH0P%3k+-Pe_fs*@I7Qn@AGYl$yV6op-?!e@6xUjP{2G5l}TH-nsV(de$FQ~?fvfk z8zaO8Mdpf3ov`PCYxlWUn|J>v?)tmPUR$%z1Ig4A1Qo zW>m~BPs>}UYHD+0Fp)WjbwJWZ~ z@Ls%T^J|;WvNdgW|CaiCn9l33``)vw(P_G+`>Q>tJ11;4Ft)uE`CzsDZssrsh6h`t z5|fjYD=I2p`KCHG2d(_Ge9eNZ4ZXd*ml_r>Ow7(+y?L|oDb*LRUM-ro^L}`Z%h^v| zhu&;_E&S-U+64`ZRaN5cEt5>ASeaMvKAt+g<<6fk<@Fr9pBytie!*;F$6cX!$!}jieJdJzB{1pF?EgP*i>I|-_W2aD zcKg)k>6?9BjS$d{MlK=#%{hYlV3^~=gDPBUL6M60x< zq`G{~hsJ&T?5uvgzq`I<>kYdd9ePvWU2BH6xg=fD5{{bbwbfP2cZ|4;Yl->lj#QU6Bbc4T}`xqi!sA7A5xUcZ=h{j96+ ztI2uw|4zzU>rekZ-{QF0)%5BeqKkEyH(MWj;AbKCiHm_@Pnh-sLH%vpw+HGc9h2tt z`VgOfKkbR+l;j_W<^MGlah|_sXrtcxOyKhU|9`o+^xZq_|L?Z^nholY%=}+3k@{L) zxplH{(C<$*r9}F|` z_31i$;*(@lLQcv^NLUyfe|CQE;rZIoc>9{j+wS|df@Q*f-2L=UVWPEj$@|-?&yU3Y zKkP2}*5Xsa!iVZrC+|jlyQ8cwJNd+u6#e4 z@SfLQnLW?H9S8-2Aqtr)Sl@sqf!}Y_tfNJ9YMT<4qg3db!^}dgbS$ z_L-71e==Kql+53_L}Pcha4M^cFz?ctl9H0V8TXEN2j5Gxj9R`R=lKh#le2X7s&4Eq zZ84KwuOGPnvW=?!?gu$v($mvSc+ao#%{}aLiGktIt1yR|%y&GNPF>kJ@uKbO6>lbe z321MS`t|YPJSoQZ*0N)dK3%Z5{X%;F(FKZ~A52g0$a%IpO*7$42m?cd`7JJ;e~g7& zj{I5W=#hE(!G#3RprD$je)kmX_%pL!!%Vw6~!w`=*@glVe0sIx+tQhveA2nK(`Q%nC8n-U5&Iq5H4EIq%HJS5V@~qD zqNe8Tkdsp!R1z*ovj09a?~=&<1svkszq>rwHQmczoBZ}|?(YMp)7MYp7ddu=y=`~Q z&Z46yE?tcJUcP^4_}-4kg*WrtMK7HAU1KMoCk3iY^ferASuZnjvzU21?Xinjt5cmz z-1?KnL1W#Jlp5n$OEx&mf8or<4k}_N%b9ke`(&LMguN>+) z{rGc43ET4r609;GFY;W-(UWrQa|_*`=qhj0eI=Wl|9gP1@mt-j=9VK3Y8-1t<7(TNiw>Z~0&6%WMDd33Kp@h>cylZr!>yYg{5%O`bgYeJpSM^TOkI zq&KhsskAt7hkC($MurdHq8_e&mcE5a=;EnUUQ^jZdVA9T|2!D_bj~xKbW~;oG1*q+#y~jNaG)$n~Aj-hNaIak3Lq+JIG>_CgKHqoEUBz{*+6(+jcJJP8 z|K&CV1H=0zq5;}}8XFm}{3`zB%i3%8(RuRnzdd0$?%&VP%5usL3cP%GdSraz8nYYw z0vOFD85r`niUv5>d~rJSwCHBOiVPon=fm(9N7bgEzIf+c#+vR~v!qN^PH-3Vc>M|K zojcQ8D{AkLaCr28KPa!xA>k+p}l?sfOkGJ4N+OYHtPzO24|-b7aHDjUQ`e#VdAR z3!7Q{NyaOC(GTs zsFqQlRgTjlV?)lndx}vyHbMq3bq+q1n|{>caQ8FYH{Q}06?yF{#mo6rCMv~%a`?6)@Jp+P-U)o;(d_xBHT zsmEOz;XD@xhI?t+1>28ton0Gj{q{F_w9!)Jau?#1iJ(i5Zh z9(+(Nk-tGSU~#NTfx@g(c1=d!`@fu5%bs0wf8XL@6DLR0$4Az7igqp2|6;e$aB<+5 zH&xX?j-636ywl9Uu;*{sjhPzT47z1*9?&gKyJzelDVh^rS#fKDq}5;DULEHkrP%c~ zse;c|{@=d3>?7m0>AHurq&LaryRNh! zo7=BE4hDt;(V47z^G$+_{`S}Jt$8}R{{QC8w^rWAM{dT8`#X~4rJlYQ zzU~{dx;kN|-vWPD>)$_rSMPA$qOJeraHid{FxAbMEw61XJ)HVdQq)wJ^GV3GD8rIFuL7o3Y5K+{w0t{oIp>#=tUS0T z-@irlf`!M5K-Jg1EMJ%XD?R2|m3i*Rk*}(I%C0@*o?6ns>F|^j->xs8K0_&^fQ8|} z?ex~0HzQ3Fv}VN=ef4GSo%u^G+A%1z`1SpN73q2Ye_b~OJ}ClEG<0Q55Hh+;9H{c%}n z73yWlGtHy3%Ctj*=h{M^5JrXr(z&hMXPF=5I%H+uzh%#~CjzTyovf8ydpTM?E7 z;aB;`pMNRY_xz>8lRki62 zO(&neD>!_^*V6FgtXli&!S7d;pI+xydaD20&-TDeZ;o1;M_o5rC(91idxMLQGj(=` zRogcvad&g|>$_J*dj*}!ea@)2`sCfWiOhmmJQk3jrTfie^O&j2%5Q!Br@ig6^gA0@_2n}1lrw_-6TbD(iyu6{ zF5JKWfBODEPgk$s_v-E2+Fd27sjO$W{JDMq-?jw{9=v(;X6D-?SHr6Q|E}M8XZ!aX z+*dBP{QnyN&)?7V#(cTUms9`uzrUWSTENZ3z!3K1>u0VER)7EV_J3dcPuGukbKbB> zz(i@m!i5jz|9xN&4!->L>(~5z^}MfTyMJFT{U5ZZYKC>|f^{bz*8lld=J@zr=M?L! zq1P{5*?KB?fec4=GW%|mu-g|loe@|ly3^V^#H{O>WqNx1x$rq&H-u#~p1vz>{PZZt z_)}Z#>pqb@M^LMC|2|PYlgS3ZfBg9K^L+ij!pCfS6QELe)yk%u?DaZ%ay9hkiV-`B1*TFdyHm^ zKZ>$mJwr)FB6R0c*P5r_Iwyq8mV1_&`{TgczH+CI{j8waS@Ypo1Y_eX{+ila`yUUQ z_y7OF?q_ zqHOLKtvVKEoV@pv`^_VI@vA#{EiM1{)mrn38a;fJZ}nwU#oBvfo~0>UYWGd8%=#Nr zoHgbBVa{uLv-^F&EbEz3a$0N+11R;J-NeLnR$}h7X>HF|{d;(qD_bUK5m#8i?Zq{} zclZ6w;9tJAuS_y^v+!EY?IpT*W8U_>Z_U*@*%^NJwRvD%qV}KcZm~<6*%sffz1=OB z_%8nc%hf&GwsszCiLMG;cg}2?+QbM}!*^Y-m&HJ-f5Rc^wASelLL8KgEM9S??0n#{ z%;Bu(`9O|h|H6e<5pr*GcRg2IZ5 z8~5(TMMrxpO?NXeQkpPS8Hx=?h1{SJ9kQkn$@KL%g6R&1VN2D5mFbW}0=SI4$j&`_u)`LQG=i>z<#s zuBxh9R>!}c-~XWu%h*@grunN{xHR(yjj| zT~jcUY6XqBFs%8&7s;sli%#Bv;ixZIF2fE|Bu4i*DiJ<&E84_I7>!-_?D6=iKFMmxLbr zzP6)#YkyA6BYR<`Soth3zR!j~ZYgM~r{_Fp=$*UKuES{$ub#BqYUghc+*m+CJT3C! zN{N8LOXBf0ADO)zI$rJZIdm$0{>khPaqClu_sHbcm)$nE+gC1Y>9F%kpxCpQ1;0Pv zuKW10_O;CpK}H4!?LD<&4qv{1UwpCm!VYo$7Y}vf^^LFWlnFKLJ(#fUn6KoZa@R z`E*wR+%&?Gix@z00IshX)_hP~Af$WdYd&{fiju!wUT)>gReu_nK6m=$5Nsd$V@u(b zIR?htoyF}opOP%wU}vnXti3;R^5-3$Z|=Fp$GN$=l^s?K|7DS~S6{sKiAloF^CpXJ zh4uCPatf~4*PXh*;+#{q2ygD5bHCfRTVB1pU#sq;SNfrgv)1&Sx%JleZOD!1Q_jwu z8GCShxYg42I(ctC?7Qssre}+xZFl{$!w(Lo)un}H{_pZxd1Jk0$-fD*yfE-errq@_9YyF89xWD_U<872V?Z`tT~pX-_^@?Rcmq zGAYpPz%)Bf$yHZcc#2ZeCsZ(kn=I}>)@j%O3l6wC2}E)dml&OJOO ze@(%h^aA^ZdB0DFKlLh}wRUB6Qc+PyZ~VstMqE+ZeuZ0$yS@GV{5rJc4=z;6TC4gq z)8pugZb4_xre*q*m#r)_G285QV{o4KyNwmwZq@ppsb1;7 zNjbgCS%=Fo>t^K~gOf`>{p~G_zg)d`x4(0W*4tOhAAQR?|7GIgZsVj~U(Zh2cl_n! zonA^8Gn^Ggx>Po$U)I=Z)_pXN2zM*LfJtg3qT zi;y)&e)=MB8P^5QoP2-Vp_gIdI}XMke<5_{v9Qtfw-T|v*CzI+S3UVM=k0qI*JEFV z_9d%I?$**avC>jnvmo?y+Ipd4RvW9lyuz73kIbBNck0jHpH9}-d%99*x|~rLHs4^f z#pjgz+4E=D3P#?VtSX)z|2}oMck$_##uKykWOv`1Z>|1S&H85B8=IFGDyo*Ld|P61 z?q5C}J|f%=qW1!|H8@|!8NO~`)3xHpHrEh|MJtNUcCJiL z{`%nC{k)&&0Z3)c7^x3-~F?1 zv8|+E!S2snTibgd`Z`Z;IAY>|x>~*_^P->dremLK*Km6*3f;+4ujRQCadk zVg5X+r0)lADK1)3UA^YV`|y%Ex@*@UV~ALTq=<$u24tLf3I zwt4mzij_LY%xCMVEv-7Pzk053*Z!*5Bz1)qvp0shb@ws2_ z%|DtEv??#2{kW%@-ot6PC2G~ro?MwFH`TRJDgVA-hI&?g>SoK!S9gal)#J|Ew)fA( z;*#Gr^)r{}zuwFjk?&RfHTUaDV%HPw%*}1YlZQ$3Md2gP^ z$BieHxx{7v*DNn_t|{#5-&lWPyG3Stm3?_jbJ*i=>UA$8yY4N&$$W9y#7xUT$F-k- zbhf=YamUhd`P*yz|DL>Z`1H*Wn_Ry-)bEHd`X^Gk^z7ABr>=dz$d{{YeQAF(r+v_5 z$!`UZLVkDYE}Q-%BF?P5!0^{8i-nv=)0Om$wkQ7EdHDD?w;gGHr$r`Ri?BY=R>J4e z7=N$lo%`|5(w~gCb$ymclnwgxBNI{*4in!Pq$_*U}*^NYqh zshPDZ0rpkB`=6BGPktEjR_XTn_okVjE5sLV`|)8#O~|t4Q7=zl`u$gZrtD|gnVg2L zr|)lb$|$*Lq!Pgp@o?_;rXA;we<+u)TiU+t>&|ce|Nn`rA6mKL;7!xzGkc5#xAy6& z>IR=>?Ob`aV#}+TwtoMJ*YC>88xn22X1#oSlE0_uYX0n|pDhf(3$5%tj~CC`G3|k* zokzg*kSDWdEZg>ItNr15t2g{RmF*Z@=&04r&6Aftp>0nOPt=M2ZpSA@NB?DQp1m+p z`)T1nN4@HprX@CW`i(n|&s!MyuT02SUp?zmhUp3x&yt4N8MC8@5c`=e4;-?(6U0InUD7`i{-7sS3XTpnLznfA;%7y?b%S z_}7tLf}2~FFMU&Wf6Mr8Bfon8x6IF%FB^BW9E#a_aryjvm-heu$-e*p+2?YTMH(AU zUO(dPb}MdWmm&WO3CsN!uX+0PGH?F~TX{xP_tmxI_4`V^{lnj%O5gwchC%WBIWw0% zzOb+Nj-%JL!k4!r&hqf&A6s!gv2|`})bCSCu~iG)ZM*&@>{uRsWW%q9=iJJZgr0}H zH}fWi&)jVH?WEM&Jhr&4IrlEko4fhxBoFV&Ja2<!{BQLZ&@ zRe`Rd*tLDqm(&%7G#r@@aJ^q7DzfC-?=-WsH)=a0bfy+@-_39B*Sm5v;@Gr>XBxJ= z*q7;bTCY;=`iHK>GlzLz>;KP_y47}gn?*d|9Y;^8T8%3X*G&~o58YI?Di5pJC-h;W zt9-o0?7Y&i>+;?5UR?kG@B0k1OOsjp?h8H7d?7Gn)~r`KS<}KgyUNcUm$R&2n=IPg zG-Dah{y!ExYj%$K zb>LOPzV1LZ$33sU9$da{qNL`%V`cZ=%CIh9y--8>#H};>xifdfzI*g)@`Q}Ev^zZy z=W0wfI$0O)IHmm34yQI>gNufrPoFri|MIrtma1ERz-oMINpQs(zXEyWy!F$d;&uVF!>aG8e_s8cSu+=b}`K}>9eD~)NgxVzI^%fEcb8oRc1yrmr829NW9DTyl_|V z)wY!D`E{3#zLsn=Joo+K6ffcPf6pdI;dZdKWNS~t6!Pq&K) z`2=%D)#n87wXEKDOZ~mDeV9?&sFu>es~gO?;gEGy)0eUZ zkMfVGs`5QhS-)@P0z-?;o`MgPvQJ0e^^?DOUbFt@;mMyrKb9$C^C(!z$gqZCkIjA; z%Wo?suFtyaFy-&1<7I5EUl=~L^v!eJaAH1cgfA%8d0c*A@u~)OLcGxgRJeNmsc1QW-t4nQw9zMZf$2y8NA4<@B};@DbDdNK<{c5yRSAs9DX9@* z`sW_#-f%QfUNZJ`@sD`vl6Myv7oS*dpT);Mx2oiphRc_Dt6rx+^E`w+OqTspu#ge! zb#hYgbW?kDAysYR>oW?11-mN_@yA6lR4^+{_6*&6Hla2CG*^WbceL>9TZo^WARaq^Ls*6MB8r+wB(op66;^(pJ`I|CSY_guTygtEq<@&|i z2cqWNPP%9s%yU=}=ouW!X;ozv_Rv*(w}zwg1PzflHSQaB&YRbl7xh`j=wd+R48dCy zgO6OWO3hthWVxoGuOp;cebR{=E01~1|1nRr$!cfyta}qPzC4waw@&_iVUw@XPs!LC zbzRj7FMLjUgf3dTZr{9hnK?HVCiMc6B-v!vU^@*8J$k1NWjk_kaER|6jhm_?gEuQ@Cb(zdN<{_x``9|33*a zXt^6PH#*{QcKicNo5qIo3nplUJSx~Yf8xIC#OV6uz`$dNH#JWCApK5qc8Xl)tB243 ze`LQtX{Yirzq%D0lmBtd_FHDa%5D0P?;YRQ<`wSOFY$3|w)rePS9;BS+mnK|#sgv!;HWqChkU(1-uZud@+zht%eY{@&e zZD;cyd!{V=rNLrj*4%Mlb<#>7x#`DKGgCa41eV{rl>4P8rdztLYIc`*)~sb=7ro7_ zs-&hm)&25Xck=0i3Gqtmjt=j?TydQJ|FQZ0y*bzR9!{H}Ve>C++2QB^r`P}dzx2!c z+$1rvunj6w%(1d^{rV3ISELyAZVD4kE4{C@DKBA#lI7+do3>e<_tjt2dH(sC@ST5; z*T#IV{QK4( z-FdW@d$Mz^?Bf|zU(S2vE}0ov=V%z)?eeQ?`suB&U)Ij9Ie72j!-sP7o8xne3_riV zyR0vLx5Ui|%bzBK5|bxZl}-J8TO)GmrklyGioe41e;s+szjo4$7rt?Gx4jd3`A1mO zQvbkZ^@Vc}B?qkNnR)8KZO5Y__bxiM{=YlnQEt<+nihvg@4O>UPd)Z)Ve)MYqs}^o z$EC+vSdWU7o2FadFY`O)#mm+C{^*2^9Y^oAZ9Dg@NBaN$`u~>>tjp0!=_&e@v_Z}oh+apX|rQ(djOeX{E}>?>McG3(58 z1IbrT;-#6qQyt@8$V<$Oa=CQjiF5#mr>xQ5FDg%-Z)Iw=k@<7=srGi?#YM+wy4PGP zm^yd$x##=bO0Q zg^L^cPQ)L2`((%Kv|hg_tgXvc(~kUbDebW{+U7OmuG)l77opZIW|t?=m+5aSu1=V0 z<)5_Rh+HUtg4JeuiMvKzr={bS7Z@oR^;*t&oijPYcR}Ix+d}(3oxA76r4YO_ntSI# z{&mvUD%;O4C{NUCZjR3Qw9V+``>6O=UBBP#|8rQ);Lgnlnk z%Bo6kKej-B+cGIh6`c!#`x+K_PUQS?cW&$l9DOER>>dM92oyy8NPalojH&ODb z_bmOE`8T;zlIkzWb}u-PAm2a1RcyPe?G1CKJFojX`!~7 z!Acg7I))8Q5f7`^PN=zWqP5vf|D?UqT08YaTAS+)PM^_PwPm&9#p5S6s|ytV-%~eZ z=22Xye)fg-`*SO!RI-?(E{`xxIns()c#^o4u^AX0H}@eRu5R zRF_!^YfXR6ir3r3RK(S}!`l8@`26V!-wrIRn&>twn|qsim&W^Kj)=)qCzjh6%Rbeb zaancUwePFjcG>RRkaaKC%iO?svFkGO6MLspTj!eJFPW$?Z$m}k*uN@>&l)! zZeAGP%dM{VIY-B7)9qVwzwTb`zBjeIEy(7qZqTjS#_}%~Ff#spvUXyHbnM>hlh#+x zPRYohzagRhN7fmKrST~N9n z*%x&#p6Rts)0+<;-nWlww)eWjCI5=tyN-sxtF`tHyuSXHdilqYNply`)IXzgpQS* zdlKh1uNYk!o70-^KTIZDUvvCwGj)gZse8tn+qdeRd{uUVWoolm)0MBcq90HEZfDT5 zO1-e}d*toz;$ZI8D-6$vr8;=T_?@-NN?EG+^U&m%H@N;U*m37psg&e@NKbykE4W|%=H+8HrCgU& zzd!6<@hntxR)p@|>vs(DlKU@D6fb*u|Nq^!DIG`S_=*jF+}?k8MTARhb-+sSJ}di# zR*~e#4Oi^uC0L)kbHaH2?Ajh*(>j5_D|Q>6JbzR*Jz>F#cU`{)rf$D8F{|=uZNrv! zdA)LjJ++VbJ^ZR2zuV>7TcgUJt$CCC>&ordHS5~V(*649?0o&HzHb+mt$5W`A(psB z?QBf^^V9lvUr$QhzURjJ_xmYp_Mp9I^Y35YxiC5I+HT9M64n2``zOBb4dQ>T|5g9> zY?iO*1T{m9dR=C$>2S{NE6J;SC2?zuRm7jG;`Kj&ExQ+M8@s({)xTX^cK`o*vG;e? zbi3bHn?#!L=N0_Av#G8(;%(()|M~a*^5&*r&N#uY1D9(*^+ zBjwMxUw2MjI``P9oM~c9eEf_T8M$v?$lp{lKJnx1(wnY2dDV4W)^A<9H9u*dL;8b_ z+T6u6VpAH|{_MN z#?!&UwYIr$YctN5T++Ms`H))Qrrm~@FW3ZhVGrm3#mG?=8#o5^`HX4lJYW_Ue?c29!3CS5{>91PH zps@0G@1i`vTLM!SWzYH{d{V@h>F1Nf>#BsWbaIt0UNrGaZt0cNCo&{&oz#1!?7C>x z<&rzW7s^b&o(ehJFL1>=aQe-FtBL*JeU!3;;DZ1YgU>G0|P_8fC!i5nh&oFs;X8oF)&mdwy?C!eEX)^Fqn~nq2c&} zKV0_Cb_{3bex@v2^ZE1U%aemm+?PCwSYpxY_y;_ZSROWED{FLJn#d`ezy0;7ynRuya?_F*51q>&S08kZ4ZgcH?b!F6N3Sg=v@(FE zLHVK=-a7d+@$@Y(_f6>`zxC=ABJ9(G`}%(#TGW1c<<_0wzP~oq=C(Bpx4XcZe>37; z)rY5l*A!ZTRx&n--b>WBPzie*Gl$#g@!e#3we~ySN3}dOx6ftYu|} zi;JH!;{JTY{YE!8>o0-t8LaTNKPrDcJEz{Y$ko2msT0mTUFH_&?px-Sb@2w1ro~)! z-nS#*tGZgq*T4yK7usLhF+rUgs*TtLo4^WM<^d`QK(psz;MHQ#{ju1j7@*Uw*wzf; zSx!WMDX>RIUCRhc+0=-v_d7(*wii5}TwHLKk%6JE`nBhp1dy(N`4IQMPW&afq~&q ziuRm&^X7q)p#6cLKY#vCVtvAFHrrQ0paV3?|J_k(Vu;q&-$|@nI5Zh`C!I_QVqjo+ z@Y}-Lx;lPMK|z7T^2<}bmU1vKF#KS=r>rd_C#R%+;%U*2R}2gc*pe}x6i$@XA!#nF zOoKK9km(N$j~_pt5vHWZ!0_HY!^&&}lY-M`eP4h7^wiX=3=ALk1;xh3Mo0hFJ6p{k z_T%M(?all4?fd!jCpTzm15?8q0|Nt41U;zT&J^|eq&j$2Uc>hrTuuuGu5Oz@XGMz8 z#sHOR+E0vDMyRl8?{Ph0AUrwy$z%EG?w}bD-b+t!7e8do#E{S`zwOY;mz-%U&fl;q zn!DU8IB3;puPU(&f2owYCsl-Y29>V+SFtK&W%iS)K}&dEp4^$X(W`HbQt+Z$jU!GE zt&>_09=sZQ=AqZsT;}tPO}|*=)|glQWZBNgU(P4IuU7B8YKvlgbS*P;^KZLMV{c*A zpUoP%VS#Li?oPh$A}+3!QyC%q^v}mr*}N~0Z7;oeN^$33|H&UNKVJHS{TLft+xJD< z6_+lnTZbh{J$m;_I-+8FP-y@5{Q-unn`6K5@_dbbe7!R0TF6D)SY~JE$&21Kp1JU% z>!j`5D5YC9v8P|X)Lgl0$@Jg8(p{H-zVT51KIPoRn}@~kSU>mrl<+XtS;U?B@{M1M zh2QoTtaEzL)s=obxyGD@p`rXJm$%IW=0W{`an0|2ZsV?ACJV@#5rUzIY`k;K5grr!Xsl+z34+&e9?Jm@_d7teo;mNsIxkoE~+tU2D!kPo2RB)`Mbm3pZ;C=bng`B(o=d5&+h*Fc+$-H zhiacI=I^=^5pTb%rOw+?^}@6^>+}sWYbz^~ck;j6wLNdrijY?czQ%q!7g|zc_@L@;_s27?bvaajzYxIgeZ9w&ZN2uHFSq{k+^rclC33=TZow{voO!|sji{G(!h>lWnC{W5co zbM>-t*~l%i(Qz@7^RFLU!rS7qZLNLenpgc_b`&1f(J(9z{qR=&%j30=J{5hos?Q|%_v%TfpgOJX8-*r8@~FU?)hZ2@A-qL`6-e&_FBrUs6Kqe zY(bjD`ja9u*Q+Yi%W~?TPYdL;^Xk<-WFx#tLc_OLJF=~vm*JkTcFDHnMcnC~#+HJC zo`Mrs_9{!iW?p*Etn7PUUFC6Wy>s?kGKckxLoDLHrOXzLEkOFzEJUT>8B_UOdoHII&UU7Oc=uJPEVU!Qtf=J6i8Y^?uO zxNY}sdAA*vze5V=?NtdnRuS!6KD#+b+P4!=6Q?^M{|9#u@ zVaBX;rf0ov7T&O3l9#c}!e&jz7Y^0?JFoezV^qB7$-HWE?~MyVvp&6S+jD8kox(#G z!~A#EAF}vmH&y!OE1@^fWbIB@@8VOvX}Ke9)_0#Xe$!V?_T??H|NDS{|L@b`Y~ORG zw$GT&`%>e{(et#fs6;=#^?>#kiqD%_NO@#DjdE=6aQa@Hnmx(mJBo!a_o!4=J! z2}bv}Ptm-8lEc&M^a&p?AO3#58Os+xsnS-oS-n&3`p-HJw!J6k8*OTC`o!+hbob_u z)z_8WrtwS6X_T7J{_iWxy~%r8KK%$-74V!VEc(ye$sApK=Z0=_S<5x8tT(Ry?viz- z-}D+!O`qtlrBv%3_@E|tOZu@X+bZ05p0~ZUx|5yQ``Jfue_2d z=4RL5`&*B9$MLI&H=PYjXXp0U*O&I5ugJ4j``Nku|8A?FYy79^sd!C||DA+ImF4Z5 zOG3{1UH!#ka?0PLRm{9(kJ59=TOqTji3$aqpSM@yWs!Ojxw}d#g6(?_k4r_$8m@gO z1LhPM7>fO}`X(0_7nhc&$+9v`K;5}ND4A=%u71!$p(QsaiB{ZTcp$r_DMTyL;Kywi zv0qE3$h~`1c5)8$p`>cx(9r8Y4xKYgEN4IdfMbTpAHB}q=a=UsNS+FQc&fnNw=}f$ zvq5M5fn)hP>nHNvpSkDIfdh{o?RnGTo+x9t)*vB3(nqZOU_xN#n`FyLtu1azGOI5~ zpZpY2?d|>gz@BG&|HSwlcs%p?t3@?-g}Ln~>dPv0?dol>L&Ws{Z-CEM$XIEZW(Ru z^6GjbqU8N)OYh`q$xT(ub#<9%``7<^GvV}-VwdyNbXGd=P=bUKQ&xc1WX~yFD|bC_ zis)iv3i43BW!CdVmjQ_OdXWPx2H$Q&-cyf9|Ru-4)qy*Ln zh4rlyCkmdZVm=Uk_TWLs!orXL{{0KqUhu5-#l>R}3si(Ue+VrodzHZY;AMw+_l38t z4EM4Ee)69(v`KI6?Bp~l=kSu2)Mwn{^Y`R}iFzttCQn-5%$NGi)Vr-wtu{E5?cR^8 zYZ+>1Gd{>=-}|zDy{Lu=m)FOa`Uk7?SWUz(U2Zf!|8!Eg$4u2vle;G$_C2H3xUoGg z`L}1##Cdb(&eiJUn4SH4w@&Aq>vNVrJifM|?vP^sgzr<=7dY~1MyuR9Jv~6nHRp}k z=bQ2tX-VZbkLSO5tM=@TQ0Jt{-L-6;4)#?CyQ;VFGR1SP6#c*!)!4??`h3AjMiUwN zk2hXT_oihZUB(-;F#H4fhhrHMuyEN$3QKgL`YQY+zUad}Q!TZlHuC&;y zsCD(^O0RQwX1>o|$@h(Kt%TaVm^pJ-Y!6zHRd?3P%Vg(zv(D)rSL3h#4pDfyVD72V zS@I6QLpn2S-#Vw5Z8cQ3S>!NRX1>;i_gzPXB!BsST%W zq`B8OYJ~;J|J-3|y_+rc{DRaU`-DW~Cflo3)~%l0`^`yzOI*Sy5$8(98U6+C+PhNt zh4gm_`z023%Uq1eO!7H7+0y!GOW(Gcd-JEBns+|zSCnm&r){J81uh=5_SU&8zHZxO zVs5^@kpE3|>idtD%a^}jEjmFcrRS%Hu=4MgN%!vEd$Z!pJ<~ZM+qQ4B*uTef`l+Ke zcI^9iHmL^v%z1U})~|aTBMv+l+8*}o`E-vtdu`PUGZz_KDeNkowQj;jLyeN&0u@p2 zir*o3jy*Gb8er=_yFkA8VDJ5?S@99-7nX26mCI#cx`$h0jYCb2@o%DJ0Ka=(Bj59M@XX$L;?Y2<6`qRrv4#LZsl%6x(kA733yQ97?FE2A( zWpSE?Yng7|+McgwPkzPidK7f|w)NhlmiE(ywwrJNSd+U*@5v=arwRq0FE*JNbLwuhDbi@o!n0&kW^5UmER3IjEa}9a&EMm8_wa{_4#pCy8r$UT|Z~O~JQ zkJ~@xW~}t<|FA0K&6k30r)MSAzg}i}FLSNV3dz}dK3p8V`6}zK9Dla$`?sk(UjOtd znsHSzgRSrC!e@V0d^z{lSEpBfr^W5)Id`9QPB~<2mX|&GM2L0Y=1W2krkuZOv*AnZ z8@00O$L#AaeepNC7!-Q7yZ)KFs_@xR)4xZazl#%`zia1C&rtqHwWpRFySy?y?f;`h zZ_>7i2C>AIHi{}82UbTp9$3sjrR|O($4lAQzP#Hu_vR=W%vPdv+CDdAn?!?S-!^2II1E_waC zezhJybg|Xz7k6}GL22?+hRg4=rN5i_T3Ls#4QIQ%OV-yp{zbB;;XUWsrysiQyWGD# z!D3Zchi2wX9qwH}ciYEvt(3d@LVNSSD+`ybtaT6mU_3ut@b=cVej8ryt#jm^6>})C ze$(Tv(Z{yyMT)%R;w#LRt15qYcWnfXSf=U(F^li+F zjr1+qV0w9H)$u!a2Tr?&-`|l_vPxs`1{3{*kJfc=p8N5-`TOv^jVEF^mhaz}UGx6f zQuc$ctT$(}O5CezY>qtkt#gU(rh?x+cV9hBdpqZbkxcz=t{wr!uP8b&V?)&U%uq$!ACdtT)P%}^X1BKVW-MIy?P#J5Y;U7I;u+h(%1E` zqNSwcOh3Jko_)?=PvcaVq4|#Y8JVB9u1i&pt5LjpmUp}4gU<5R%0hwakl{gwf9=3VuvG~2$>KkD4~&t;{hWna$5rU`Ssecw9eF@M=CCL1Aj z!_!M0_hn3M&cCL_eS~4pEYTk}$1*~v^z}s-M%Fd7r&qY9u9<6^*Zy^06yw~z*H%^T zKf=g5E5=PDXx`jQ&$@JYoI6%=*SIfg^-Wl?yS&nTneE-%R?D)h*WJ3PZFA$O?rLV+ zbxl0U!pYU=4|Ghq@ng%JEgEz0$8P%mee1RTi;|x_eVR5gV*AQ@zg=~l^^1EA74>=$pQn#9YSUp~Fx(DS)`?$VZJeYt_ZHpRSAx)pfPx3p=0{Kqql$vgLE zPSKn4f70fk8PAh$$IQO{@yWFLtC{vCcr_^gJe>q}35?$69hQu9^p(-(7Q zx~fj@F5Y^P|M`{GZ}P7%Q)^+5xN*Zy#Y>-0jQj3mtBE`<*1B?bQ`=wt%!_*4%fz{g z`(x6^slg#ZGpe0#idCum7nbw)d3T@JJNvgN^pf>nm8AcDsp=7{s9A2Qev5uPAC1=Q>^^lyTid^KhLBamwma+eygp?A zKDV}b*Np&)m%^8C>|C=_#^Ruj7f;uFxBTB)LD?QLah^^Y1 znb@Q&&o_Kd-0^=gZ;8IiGgaF)>-aW(n&A-1c5}^ocg9%F_}nvv#hZ5iyV))uXH@iw zLvqoF4Z4*YPj02l*L~SKadLWqd06!<|2Cn!_Wys(o4@}1*?xW2DY++DZzLQ(9sX9i zyq{0~@*eyDE_+}6a-aUE+i-#!)A|h7XBDAGmioW@)%wHw#;+$fT3>4uc62Y@yS}pZ z^XH#!deNIhCYc%Qi?98*EOPhMg(^M?QPKXu}tjJ_@RM4m~D3QfJX zyGbsja_j2eovqagDN!*oURgB@CQdAWedNuXKU%rzI!Xo`Q>QJn3htOFD)MGmyXVWV zyI*a8w#b8>IompV|D0o;8+S#-ZWa;B*Sw`$CgJ_6ddj?z##3|orHqpwcc(v1-?X^d z`QiG2^$nl6PVc$O=H4uE=jCLknpT$3&c&-la@(?28rdq|yZ?FxsC#+PaFHbE!H_?DOwDaT3 zj~{1BzFc`SH9O<>%W3YOjg80NWm>=b{%7us37f7i-FPc2{`-Y*3*W8lVwnBoBJaYG zg}pPAww=1KI(JP)%fWD2KLz6#PgR)jw8`h_?Snkuw!7`Pb>r8wZ~T3WB@eLfKCPj0=jyR@_WSEIdK3h> zzxSu8AAg$}H|^d}TkY3rD;E#;^Fu>U{)|Lg05l$DJ>TUI2L6&BVex0kCln+R5z zY8R}mecEZ)sXXh}R;Tvc)5;n(T@HP$&SKpdv-H85qcdMf?`Rhn6>t5iX2L7dK2vJP zQIX#f(XCfQRDZdd^sFrrIo6Wa|9G0#-aAT%Yv<m(HIwjJtRV0-xgy2yaQK(1Rxix=A6IA^tN#Wt0L|CIN7 zG);(ml<-pE!RvRz5}_Sxj@B!B`1>^H9{zeX{`Z}~*EJlaA`YyHoAdef-LqfjG*TG^3(V9NUMI%Z&06YSP?%X6*VH_{p7T`hCibrP@rLVX-n#k1 z=W~aiR?n8rrK=XqU#)(9ji=f9*x)(B(z!C+tRB*fu8J7PZojc8gI)Xmx0z3uX`HT} z_fs-ZO)jwauj#^nCq=iiN>=tix|7>HDSCq5ImyWzAIASVxS^%C;e2<;O4++J-)ivi z_Hy(3`gHK}pA1@^u|>z!Wc5bFOQ-EjmM<~zxvtWw^lTfe%5Q{Ox~&3*+6&*7Hb zX{BwXwO!-JF|CzJofh-nN=}ar5qbW4!i~%Kr^>z)m_IK+^KHN;ogZPohSjR-b_!cp zXxzJPxVIu_vHrX7|9^$QKeNbvs_AEu(r=kd5B*?vHV*#Wv1pM`^!$!r52sn&pYh_w zhaEvnR$t!Meo^q}D?J6HoaBI}wXbdc-yeB2=?#PJ=a5A{(W{GY&7D3YWb5agYfH4v z4VQ{7|Jl>O=iv{I!%98Rt?n0}UA=mBw#=Qx!1hl`lY*n9f|_cCZ$EF_6w`b6^VRNO z<&_sMaaJ6yVzo>D5qM$x{MpM>msdsXVo6cmeUtUw8<{=J!yJ5_RZj(5RxdSB)iE(K zv02|*wnQX>J?XI1qRUo0gZ>@*@kLB>?~Zf6`oR@v?*8nYm*E~9%iVwC#guuhuk7m6 zlTwOmlBON7O33|kboF<^;ESearl#GhpO+e~^hj>qCh~oKepLJMBU4Ot7m8cn@hEhO z$VhVZEH-yjuzr~P&Bmwq#46dSI|*7M$7g>IE`D92m$z(XUWeM0(?|B#NUM};UTB?k zHENQ8u(0s#>kdNmygj*N?|S!l_oUnqIKD)ZseGrl{*|xq=G$$Ky*4lN>A?Wkq`LD) z(>qS~cXxJr&rHwcKIbn!t9Xy{ucb++o_y*178-Uc=1f;_r+04p>iEM?FZ1p++*o** z`;D+@c4F%E4Oga%Nza}TzIE~1T^6_XIX;)}|hDceA+vcWtIkY@y%WnNjzgJojW|B~>}cYF2m2u5k_YuDsIZ zbbjXN%vsKFZid)1oVnR|;d@mkl7hK4VnzSXEN=y`kE!`ru~ zzq`|4`kt+m^r!1trTW%KRTjyro19(9bLHP9leE;-O40T(`{j9Sb>3%~EMByvLOtZl zmE}iWTW;U|xA?8|zsIk*RV#~AQ@`JA3x72sbdK4RjE&hjlUx06|BUiy?Q-*RI?0n) zy=rHo^xqvE;nBu*6$|gYxvJBpKSx#8c^1c>pwl5@vv=;kFjq$C#pAcabFaBQdiQ19 zmv?Wy?}uw=?4EFP-Zmv0_mvw$D!)D198y}(msraGvIlx2l${Z*P6K6Mgk|nMLidY^^Pm zLVo^e75tjy9KGUsquXTn(}7d`>L14C>fh~to1tdhKjdd>W(bm?%*Y6nKvA@{nbV1Z`$v>T^y5}xMu&pwQJ|TtzGZl{pGT;$G(R6`&_sFaXFn0kUW&kIQiV8_aD!n z_rIU4y(ek^=EaK_KMwa<-QR!p_8w8?xG#&Xo=%+_Zu5M(k%{|p>CYAmPIx^1Us5t* z=KKW#bN8R)n0MOL+O~ZP_m41@W9_504QznT71bd7d71o`ioYs)Kphz-+Ra|yLID6LlYA@FQt|G zj1i0#Hh*?GC>%)ID9ymI=j@vG>nERlk{{<|n!ib7eM8*u3;Q42vqib9O>PuzIGz;1 z!0_SQ=er?%sp5R`vn~g(2nU@-v%GStq*Q{Q8E86E`T*Af|C)si3=ihAtYN5G+!C%; z!vf;G5@j&;S}NpwzEf(;!IT#aAMOPO1~&e(>bTO}-XwajI)MA>zI}FAGew&=b%MQfG(tV;~K*Z9^JFPpS?A7fWb#<%C< ze_nXMW9fbRrQ*Y~;Gh0|x4rwDSr`~T^hGi9Ca6!gpX>A^W}E*knd1iE`sVXxH3~(T zyu15yB~$1Tt*1dk%ZyDm7v@e=n4}eVT0ktLFI{oIf#t?Sb|PMNuS(`PZTu5*N;c<| zzwcS88EPH%uN+o`=56nlYioqAdVAE>y|~!ec=LfPb$ssU&eqz3^G-^ndc{l#G?t^(RAanuC^o;QMzjT7suVw7vu`os!ww9QPq~i(d6=79RJCRS#LtO0B%-wyf$; zXxp8}vb8t8^u)ZMaP53{d*!2#{vILEy=vUo{jHT2Z?Aqf?`y`M*Pn&Yausn#^|{s5 zZc-PCotf5Y^(<+N!|!O2R}OI9DiJu#arvT2>Z2KErgx{m5SN)X>y7Y?W<{g2Ftv8~ zW7Eu5oGLcS4L@OecY&cyo{IjDQ}<=8IG9><>T9biN|JK@HE!L%t^7VGLCnB~PkQ@4 zll?7;MKexc4t9CBF+}OA$|Cm>uyTP&0ef_ z`Tp&r&*sGzsL!;YlJQ4=|L-%p+UEBzz1Y70|EVkXR=PLB{x9piDEfE9wS)5>owyzU zy5&fUjSv5|y-Sj_KC~_@o-zB~^QwovJ`=tAPAzYlvP>n~Hdb5P{QtFgZ4aug%HQAJ zoh)j3HuZdp#r+*QNtq>2C$n>Udkgd1+S=@iSu^)>TiM6tnXg>MGR~EMUZQ%&Wg2_b zlbpvBZ&}}YvnD;^ZAMz%=fl50%Gz{V%`WnIxBcIP^Y#Bf^{wk%Tm43%+d$&o^Ovc) z2~+R5EL-!;>dxNE^HJ|lT{qjvYg;+-``NYc;y3HaL>(|`iTigcKeVP$i50XeA?!lb z!$&zwYF{ko&yR?dlD0U`f5z;0Wm@irnUhT;=jm;mZnyVI=-yLzGd}QTySlo4xykju zL+g*Oc;Ud3FATrW|6BO{<^W@`7`SB_8{6|0w`m`}WT#!GZrB-PUhU zugK|`yfyvaqifgr=K0B;-~Ur#V#_NTzGX^(A161<=GJgs=`LG&vEZUz+;z;=#ztFIx92 zn(El(7o~4Iac%Xy({HwJ?}$y2T^XXT^sQ#oWm)h4TejS3y7tP1UH0*VjsoZ6@4v22 zWeZ>Z`(9^Z-FJKA-j}b>l_RK4@C&-au=dfVmL)gD_` zY$(k6FmZ0I*0%uFTbWz7_}qGsz1Bg$kI!$_jA%){FQ3l)br+QKd1(85|MRJ@IMmyB zMQ3Y$*0TL`TfHN^%G{Dlg1RQ}tSmcyCZ_bpRQ=k8ESwCGJD5%`VX?{1Yt?aks*$v^ zqTj@H>&c`?yH8DeEIjFSw0qdboYo+d>$B!X-re4Od)~~ucGKpc_z^9-l9Th~)!ln) zKYjc3N9xu>f$h6??C^YUxIuXHj>F8Kp8PO+&2Y9w%kgcEME2pAogY8G{Q3Hg@|ytP zBqt}|^KF0r{OPcmI!k1JXxwGvJ-UHh;lEd3jQZHgI@!9(`I1LYNy&nzXYFr2eWRJ0 zT|3KFQ&qX!+jz6|p5&Ds?eg;R4`mjfO6rW+)PGcG%^QQ8Q@&<~-0qb>=j-QjQa|fm z?9JQvqvh9j@N%2%EWWxULBRaloGB9~gk3!XenS$J?qYxsztf# zzjlbv4pOVOTKP_L);{sC0++wUTD$%|;O{RoOD?%TeQNk3$tKZN!m3g3Ewj2;O`uUJgIYy-XKeW|^?O+Ki6eem2B=~B}){X;Z<-RCLO5Ek%K@>!#E zX01%n@teo}o6ZOJvvuzBmOG_hbNM;%8U}^~zw=tnr!8h?+2uRWno~5c*rY#F{)|TaYdE?HTaz5;rjjicZE$IJ43_w8F%l-nyj;nV7!o~qf*4caIZQ+ zB^TTTN@(+YaFSz_(aba%dj^Jk!CN#Lo`^E!zUP&k>Lm+0_>|4mMMg%(MK|OCR|Cgh z;{RFclQ*z>RxKaZ1FddW1D5^`)94)@fYoJNp-1THDrulKD6sU z`%FfT^C0Mw5c|cV6NJ9qIP3*;64dheWP z@fPJRYFX1u>)MW;n*8{f{7zPrMYF{3Ikn#1dcpMP(Vbq_cka#%Qghv8VQugH*;IR~ zmhZgBOupZ1y1uP;V!qHhh3lnT{l4A)Y0>{rXnl0pdv@lsz0-3{&zLSL6FPghxba!M zTk@Ng+g+2NEj)SqinYsTx7ES*Ci|ZsZQWq6Xkf4>wQkj!tNX(?bC*uuXuL#tW5hbA z$In)lcO3gN`PA0Kujej|>2z6UV;$`2;-m;ZU90IuXxfXMY-i(=yoIj8KR1>=dzTle zy86adcg}U&%&x^<6iu1A#Q4;M{ePb+AK%h$cx>1Iuls8jJfD2=e*EL#2Tq(gu)KWs z7PG6oebp+mAj?|9xt*a!qLo zuk!B?E%!u}KhKa9D%_*=ZeQuEA4To^-<>@%>Ey&q1(O?|>?!!1UCu0C_HpaQzVB;= zv@g%KyUL%tx@&jl)E%d$&zXP9{Nj}vj1wIXZtQ%hcYVE0#;ll?-UZt^yt_HSd@SYa z=Fyz1mEpVl|I4bSvzKq5o*t4C7F1Lc zWa$=rqQz^%kxksH%O55tl|9x<+;_=-Pt6X^(!_v%(y_0xP?MEeqRS_CT8Ub#kP7HDsr6RQ>E54X zeVThq+3DGf&P|{F+I>B@t2J|F*}Sbxnrbfo_RIUdBu*HWarpG~cARjXEpNKa-A&Zz z?YXHIzsx>G)cRfH^j?!}5_-O>e&YJ@2#*Y(oRE&}jKv=wr7RAY6%v^i7VzVO?TO9V ztE`{wb3H5LzcL_h&Zg{1hm<}opDM0ZdXs-sQ&Z$biD@BryX_*My_bHO_;kW$fBQuK zn~@er)m$THA75MWUG4Ryy?-zLHh8UaDXHZhZ~v5MTW4Nd5df~xDqOYa%+osNw!J7j zZRv8Z&JfK+-{s4%`7chn^=jI@eSBVDx~;Z7aq`-AR{Z;+uI0zAF3WwBnWufyxpG-} z{{3A!p*uI2U5pF7u%W1`$|fc{=F%>wxc44a7Agc@`PkU=0zwa!g;(%fi6?eY{Bf&*eBgRX5;v%k9JdD6?3 zb8ZJmhTPoS7oBxhXWopreug{OW~UV1zhhjUDsCSjkeHWT{QGo2?<2XZ%YWUuX1MFQ zoL%E>UIw-lva?bPVT|Dm&+uAkn3e+yXbN{nMc=i`*mGdnN>T-mxnDeexn|k^p zU%$ZdSO0|1pWV8c_hR1CK89Be3+D-Zaj84;s!~Kw@J)X5GZ}lg9RVl%FAAN_nq}*K z^n#HnsPUxzJy)!I-rHoIu=>Dq_h}hc^4a2eD8w&k?y}A&i-$+`E-7T z*^`-P<=zK;dJ}d3*1w-CJX4FVEY4eFX>F~(d{5#thO@VHeyRm6djIa}QujR#l2(ii z75mqIxYk$Q8&dS?#|A&sxzcfmUsTlA)@Ib%*)TA?H)LUQTpH9U${=W^n~}Ef*RQG> zyTlmoeXg9n-~2C&_JK9l3=DgggDHjs<_CD@9{7H>XTR-%R%V6`Oc4*CYq?liSlqaO z-@Zcn!m;2LFAwTguXe~iI!|6E{Ibu_+$XVCVpmrE-u>P)|GHw$cU8|-Gv_`HWz=R+ z%01L|_+h}~E1jL4AGb4#_>0^=d)Bwa@uKMRJ+=z-ZGV4RbiT%J{-?60qq(HnyK%7+bwv!L1l&_4QjrQum`Chz+mbzOCKe zms(X-RZ&q2Bv>5{H))-=EL6Oi+F3a*DSDoZZGoVaahG45&OD=nL2Nc&nDIV zuDmj@|NA|zq>~rrrf;wBF;TFxdvHOsLZ;7Q+2Z##V$E*LFTJ?4`1^vtkNG1RH5*SV ztk>1mTbq!n(V0~EL*~}8PnRB@Vw>pozcE~Zt+(g?twVwPf2VA^x%=~4PR-J2jh)q< z-^H)oowcx!@$=2=xmPsjyC^N>*Wbd_d^YjX#?{^4Gh~%SUpAh88c-nZ-Q68w^E3Ty z!~zTZ*$kPf4MMU;GkfF?hi_!+QmstSZg*H#_xyoH&8wQcth)1W_-3E}^>dP9iOwyN z=a~vtEK|Z3eG)4P$e$>><)xjM{QO=CE3p#gg|}ax-Okjd*k#kD(skzY?(o&=CA|TE zKlDd9)|v-xyO6xQ<)BdJ3)cP(dmAHTVs5KWzV>^PkoI*Ap0m4oME7sr+^xRB-3=RJG7%Z59uU-!k;JrDZsJpKR2<@;~9m~ApWyJd>e#(*F1 zq8!`^XzH)gdf%J86DvvuS<6vUlKg?j_t~zqcJ+>+kK+a z3a&C=T$CnPEu$u!+h~^le&N|jAF1AjwLAf{CmcC)WXl$lX>28>-@kneSi4~Pa`mbP zR;Gj7*EY;KY-?fnXrp9_*#8KnMQ2Q_?(Hvrer)M(y_3c!jK#~Y-g|MZG~KDqVyT-|vQiOnY;aeZUa&_68r z=IzIuK4R}X`q%2Mk&083@4lk^sLRz!j(cw2xyFdn!Yu*`@1rkm-q-&uJ!t=hHybY` zt~O6D+B$o2xr3ef)l?4Cm(25<{obrj)efkva&vR5so4{jlTj>EKjlkBMFr?g)urd7 z9IFld*EZa9+4(|GsO!Ry!_`f;B`d#QSbOM^T&B|Q^UmJKYIr;Pv9-Qpe*>kNUMLE|g~G=DI4L;Pqd-z;@d5u!NQOHGj0v z`W;$QbHeR?m(IP7X{sgrFJ*3tKfv|k&-%4%ckbM|u&n%rR>o!yja!kCksCK|e9_8W z`|lW+|E^Cq8<|9}My&m^RJyL}@wv0wR{JWSyuIjgdw2Z(U0=V(?w&J8M0@v^walEe zoZ^lgFTWOI_HC`*yu^Qhw=}s_D&ASO-DIo5&hqu`%aVLWEq`8Jc&q$Uz_q^{_zcUB z+*Qn+s2e8t#zZvi{KRka;wF19huyHYnUk00bvirsUGZ}1(_CHM&TC|%J|4ew@=kP^ zr19USdfV#eTH8GQXxF|{@4kFYMcLDj zsx4&smU+^&h{0?2h2X|2^#w;x96PpbPfiG)?mT*qtnYi7(C@Hwz%<|6JiI*OI z;<4YpqABj>#jpvJqrI*kSRC;Cz^0qbJD+*}v+V8Rt8d=F#)G#m zO==MkH{ZYFq3=OO=3oKI7f)0Ed|#gvE%x#C;iq|edjAZ+R)}p|yO4YHX4{*0?p)gK zabPW9Y47^=-;VsK+_BSjt6zR`<(hC?u@Lrm&!4y7=>e558h5vB-n@F%Dkt_&Ih>PR zmN^_>G{t*r|Jn_k&a3u**_P(=qg8e3wymZvKPybmT>QD?=9&zD^YH)fwVM~8{V6;7 z_8!}${J^Ido;Z02w(Opr?NcZ}^K9Bbo1^X;FMB#W9g`d+WlMB4=B-<|?&iG=^R zmRGVG&XN?D?RHvLk<+@vq{yZ2C3U|jFvpQ%|} zF4*3`c(L(a{gp4=o_u%xG(MdWej#|ljt_Ld=H98dRx4KKuxd>`yI@W4_HS!Hf1f#d z;V!+i!p_afo0mLpZoI-^oy;72y1}4cyu5$M#II{R_s!e)ap&gE-_6%I+}rVFGV8{l zUu9J_;~GO>SI>SL{{O?mf3=IHr}GLOix8ia=s#VAC%o{`3)A1n=Qc_5Rdw92)c(NV zdSl_K-|&Em;XHXw10ie)!y>u)iob4s_!cQ>TCOGSz&d_pIets zy}IJC@b27}i=9H-qo+Gp8}eqp477XK7dP?Ww(aX)>=a8m_TtV~pR5)AX8SVbr_7ei zN`EphZ2H@}`0JXwiV^2e*{)xB;&t4q9~BEfug$LWywQ*RC!hH5Ilm3=3kK z)~?l+I>5cPCaqhKE~E*|-Pz8sr|0{L&olq1&em3``#UQipSI@nJZv1>SO5QS zYOV8J>tB|!(K33!pI1-XI#WWW?b4;7B`jYg7T0erycU&Moc%mRE8}dz)$7;$SInEX z($7#spxfH&h>K*k=#`RbmGx`ISQ}p{)UPq(v>InVFJj^-N<$`}&UR zuC9$Q+tz#ch|YTNZyP<$+N{|6-lc`x?SC%+HnYZDLHqpmkGuMulY*kc3PXc8&d!T? z{x5Iy%--yzf(_@Mmn#<+B_F!{?BeX7=Y#jPPx33_oFL)k>^zZSi}}=TwHGG~Es31^ zDrL9%X@~gxI%_7BRCp~HNPjNo;=W}T$83GQo6kg3BjffaP7nHa;qKjgXYFsCebN_s zh^O&jqGA0^Cl!_EbLae2(xxP9XlOWuIkWb^5ZJ=Ib)x8vJ++p}n#Ww@|F0{3E5j|C zpW!{>!fWaOFEXlEocOjaFvab?-t_(Z%QY+yO?7E&Z>^G!+bce4nt0~g^cR9sZ{CZ~ zY+v@THvcnM(ACxy>r2P3XzLkYdpd7k6k|M&m9xQMgOU8&;J<_Zf7Oplp0`<1M~ydKSbw|TG4o=dOH_4OnqpKX&9e41)`u#ofU&CGr48a=1@9EnB7T zl=R`#r(Namc(=I)EW-QyMG(qedd|3Cl#X>$$`7x8!1F-h@LXI1`pTu{ib{y*z6x9BpROE2o&{w_Z8V#}gS7W&^?*1YNYv1Hc0 zUjpI6&ik8gUF%fUnR_~E&##Rc+Cogs%)Gq37bomGQF*H`*8dZiH&^Q%@7u1&H@PNx ziJtPE5*`sJ{@FaJwpQNkOy5;?D;9HM^VxH4gimdD^3AtiB5KNaKIg&qDrOz#&zG5) zFLSB2W#{Hgwl57Y`Qr0#)66sT)jeH9Ic{}5ZE0b#wY8nHDyw_ag{75I>l=P)zuD;V zBH~)PrqjwM4;2M%j_;nKo{e^$f7QiTt-MokI(z&6KaZZh{jJ8|^L5=_E{P+nyI6&ml$o)z#y3wRYuC^1nU%L#bc%L(fq5-D{VYazFXLh^6za zQ|gK<2U{BS^=lsr-Q2e~@cV zQrDb$R^0sH)U}&x`oi1S?3p&t%|5-}{{Mn2t6XPt%oY<7k`hhJmohvrxYqpm-EuCT z?^`~2z7c-6{`c(J$8Dr$W)=Lnqp)UM?z4%X_x}2o)A+#Qx61oBZx*yOs`_Z;DJv_# zFm!9Q54nBj-s6eKqHVwI|MMm9f=!<8)q5w*Yk5QugjepYU}>q2uqX{`Ve)A{touBU zYx@7qk&H(r?{;Xc^5D@(dJ)RUnzh<${>t1ik5sOuL37X6N8LX2P=2D@fHKsYN<@wk>9V^=PX_ou=AvL>clOkGjDknl>}(4 zUsij!uIk@>O~*-#lO0(v_j^yc5*Fe8jsMIl+1KlRzjS2WJrrUY;l4#bp{!Fo^Lxox zU7-!X|D2n$`u}77X-{*#qjz^p*z8k2_x4r0SgZ_MMqnI8A$PPLMh4qPzD@7XS9!$JqGMHTnH|QNQz{%Cd_eO3s~i?yh^N zW8FTxdE4!GuSw5XP<(f7Rq0;y%P;x&|6ZLNVjgdh^LL@&!{32TTl7Wxr={PVslINV zZ@Xlan;GBM)EzOu-h6xOy}h|u?L^N{ll;Bf*Vn(E*;1w(92jUSoa*=eW;bsk|GTy` z#w>eRzDxV)D?MYG!upO6A5N^f<$BW4Oj}87`?BqNhn_uNZB@>jCtWpF$A7xzy&W}g zKTZE7Cz)e41<%j9!i-Cy$em}>J4_sJpm&POzTF*%o0dRYD4 z=0^RznWvs{+*ndKU-}sTafvw(_v|hUG`>CAvoX+cqu{>4(lg2bN|Kj_m)vy<{&ZD; z-!;=6|E|XV|F*HQ=Kb&aG1q>+T9x}#>g|L(uM6+0)XzFAQ?Vjl+}i(m%B~r4J9C$0 zzx%O5`tYLyN&Bx67jC+(UwVG-fBBr|EqnAH<)^f|KQZ;;F9vFXv5=j;FY#DD)a_xHoQDUU)Hp5NNP{?)4&cfOyEUTSdjO#F)VXD**! zxOVX+Gx-Z_`&RG@O>K*6<*_UIcl-MGy!$_nm@boU&)ole`Tz6s`*)OnUpH^+_QO}} zV|GDG1c+<_ouJrZD389aI{&%xln(oI%#~yvR>4_HS zY^OU%-#+MAqkK_t`pGc!$rb!w69Tj=?y!{=w|CeHY&SPA3rM#6bm_~HBVU9#RrlK1 z<(AhLB^6b6pLkXz(f{7ts@3I4zHq>6Ga<(9t;-EERPN|yJ?d7Uu)>F}w;}FwfZnuS z#>SS0+c$08?fvkB#g4B>PoB(tqbIsoW>P21pT4SMCC2unfpO0?tM{>Vo?J4i{CfB` zjU2}Iw)nVvNgphBXLAb+PhRm;w!MEI_p4WLo;*3j)q42v)~fEm74@uaqW$MMtQLnH zI%YO;U7q^dd2-zC>I)6HIyZDLF1T^!>CcrXceb9@Rmy5Uw_wHjS2k(WkEX7^9-e=0 zN${1~#y5BlJ^OU!$q|#Z=2K7h+}nOj{Cjx7_Sz#4J5{*4jQRYR1$tUAb#B>hX>Mw0 z*{*2xv%TkSQ$q0UEq3=NHaH&BU7S2)&cR7DWuC3SApP-Zn1Jkr(~oV=+$mZXE*@^) z5o0(1^rCeOlpW6>d1N)ytzP(-|GpimT3pM8wxtD3QBN;>DPz{VWnyy$ildW5hKHK2IVl&U9a((o&MV)<1{kdAVDBEgXnWse3zUM%vtdToQ>zGb(Bj|Sa6@Ao-AbdqJSB zh0NE}Yj*WdQ9Jj_yLsP6OB>&qtL|R6UaqaTXnOkL=B(FC`&8$D){d1fk(!@7^Vb^D zXV0E}XZ^Br-?wXxTlYR@-uLZWqFtXsR`BoFcYV*t_sMT!(rOO1mznk3rFN33f5)?v z7vz|xpT1nx}v&7ia#K_S)@WXoURZ$K` z&MRLPhdC5F>&vJZu|B;w<5taW=^D#`qqob~HZTRw6|g!m{SN<`+dMU=xn3M}IH~=s z{A(_QW@1hbkLt1)h7O*(RZEuNXA79l{e{8a+D!ddPuooAhnMrEHO^@~J1@)a)o|}v zvg1noT`T8pWwH{RGHF5eo3$PGQd0b>+!v((UzXJ0QmZm?+f~)r^_%1+j72Lh`Gjj- z{dOR#vfAPOsuz>IO+D@jU0EBm&$zDZN$#_q$&T*d^<+=~uFO8T#`=J{xqueqg#ES) qZY)xF{K41n%*3#t?fneVfBzK}He6Z46SnIC%8aw;!*+{D1xC&85rN zo__p)^VR<=&;MV%bm`59&*#ry*sy8G(VOqLoPU4&#n+3^{$G0h_1Et|H*ej#apU^i zw{P#>z5C+Di~H~XuiLQg^5rY{??2qRbLZh>C-&?+boJ`B&0Dw5nl@ z%E^-_EKE!vJ%04@;XxZ4`~UxcPMkRL+rR(+|9v>QuIt&o3vr2k$4;NCuB>?R`SbP1 zufBYG?(OaM;m`j$n=j64Z!I!UYhQBu{qx&fXIKCG{(9lwtDEO{KY0IX!@706}Xxx8b-k;N?sUj0uD@Hu+n_M4lVa_W{=HMO69@p{eC>yOT^&PnZDKB3CX zD`C&2$2TvZpSbSi-6M1Ji%KR{CUnf%`0nDOC6l^0?mhSG!@S4oCMDzl|0f3@Jox(lUROs~o_lGuX`cdE!(eM z-?Mb`rDr#n?mDz^!KAdb+T7@KU_Fo3^O8AF|NnpZaPN*id-EE$9o)Jh zvAp)s%)*9*#3(1Lb07XMTy^B?u|4yb?VPxF!=|lES|%6rElMw%7Mis4+>wOt4Rr;%rZQS3wt@N1HivJYS-fHLmIj~B#S5S9>xg%2 zK7QoN-ea3r-h9#?S$<_j(fQlQidWx_P&8?sSl>8v`ihEu0tB11yyFQXjsqH#G_rESi9=~+q|BG4rY_LJ^sJ- z|GRJh`|z|p=l6ZtrYzR}7t&cxysMrX9IH^DmB09Bw{yU}rD6q4t|pH6KQSJ5m;7!j zF!}f0lMyx>pXu{C>OP;@KWoZN<*P+OX*07s7PfKC%s#SbO5nE0`RheJI~Jbx>|hiz zTHZU2(|6hz!BxJ&6(+ouF2=1qnNo@KjCPq_=KZ&M*01xX)0;`UCdMp!&cZ+RUaB1#(rgqhZ zDK7b&QUoRzziRC}6!gB;OPZne#0h7u1E;20>70E0Ik|bWcV5euU{o)dbDceuW>Qq)e-ZWp*b@H>#B3vI+_XPAcE=h>waK-cWba>Cs5`};VU}XN_ap)5>d6Ak;T^rj53}~H zJ$+uUkaOPhOG3fREKf9v`iZO<#mEg8 z&zJ5yezI%VtG18C*9k3;%MhE#PI9t1XUtq}6+&f1eY}{8{fmbo~x)b*j6% z^t`ps%Rd&Csk0yU2DCc4JP_RXi*wuIYu4=k_UFqyzr5-F|N2|C_YuL>`r9Or-L z{;zxG<%HIlyq3o0zaO?GE{Z+-^31ib`cfX};`S+r)ZVEfw=Z-w#$PGS z|5#+Cp?N$@x~Tk>;D^~dZ#z9?CcgWZ6P^C()s0zC*6%r)^?8b>amv9>XC&6$+Z_G= zP3-dJ$D?Qd|2p^m$Gualu3t@&P*dAh)C>$dOQ|Fk$P+~yxqT)uPmj@+NyN|}}1=ijh;{`zi}W%r`phK&a1?{7Bk zUb&~h=ET_}%~>Drln3uT_n@`tE5{Dalmd-B(|a=>@7>zAv;14~g1>JQ1Mf;)o29aq(tOq>%w)4O#xS6RqiOHab&Z}5ih7LeCg?DPigTaeQhMy@ zo=|x?#r14lg1;Yiu4bC3L)BmhX>~cc*Z*F6S0L*T5Wk>D~m1&fkLf*SG5Xg=)Cu@QOU@j6H13 zv{Q9w<-XLJ2ZI+)cW;^cByE}>CqHM!%+uWV@Ae)xGLHS{)aZ0%iu&2JkL&K$*gXFg zy>q5yMeuCnbD}MUo()b>lUpQi&1#WwP}K83w$9BbphoEMsacJd2a}X6u6J}!d;ac; z;D*_+&USjpoSE2l%4+G2Wp-;+C#+%Pn)qAG>(GW(rKhd5lq>hlnddPt-ZYGD(}ZIA zu&EN0Tdp2UVQPJ6mXvz_BZml=Vt2Prx^3rw>%E1GZvQ!IQ@H8r=kA@$gzu_Fvd!{K zseCiTL^e>vC1>ttd7Hb%rN1|x+I=-5_003$h$Etzy4UK|7*_99IvQPchs#8xf~%iF z!^O>2cI%D%4hC_a@Awl|KixU^sjjR<*hAgbrVLz}plCAXT)4w2O+|)J!jUn6#l zcF6klWi0IXJ@^7nc*%*Us=YX`Y##Q;H*iw0nZD%#S8sr=GV33%r*nSmCCa8> zVQ4jRoNui2$h5lreMekz&AcwF1p?_N46R$#ITuFFYDwXe>=(Pd?AOFFHm<@RQ|I8; z9#bX_lT}~OG&)VFZZwh1Vl{CQe#NW!-`uxDk*V}F{CC;3SVUiicXY1e58==%@o%+BYx=yhXx{7<^PJAVtL3@* zXS%(S-2u@qE&&dfc%{da|1nF(clMqOz4@tl|D53Y4_3D<^HLNR(_Xbc`=D|A=7`75 zoF!tXj~w}a;IZ18kDPy5RtiLOPCs%?|E8S0XOVOF8sp&k0qbJ^@hi+fo3EKP-lVkXPX&`LBectKjdb-OESEA_K{eIK}N1pYP7Wo+e(46 zah*bmK}V%8eW`u>{97*9i&^>WeIDBX=Q!A6JI9Ir)vbFLbDkz%jH%k99}y*~oO|}4 zn%kzk9iE;629LNbTXbrTKZeC`u=vi)wY{vO^+%PL$E4R>?__wiGnv(W8YWkKnPR9H zbBY6?S?|6-f4D|N@LEyH#ap327JvR7<#_tAkCxMP?I&f%MrEcMx_gt&@7*d~ zET9$MVJ&d)Y820JS&I`q^aG?eqSZkBPf2amu{5Y}>0OE9>}Hry8>arGFAeep^_XXJ;|r zZtzVw9oE#9D{FM)(OY$qq@_P^tnBUG+jUNkZP_xmWho171SA4-B)9?{k8b0;{7d+M z;q=WPe;NL_aFgFD|G@mK0E-sO#k$scdy|@0Bz=z0o|stJQ(Eq%u7E7h7v=r*$wXj#JWF|KqLwvRX@|1-Nb&WWGvHFweRF(voT7i8dRh(j|Uc z`*ngf-WOc^x%QvO`{|Efh4;(d*zogquIG#eZ@#&gJdy9p|-uk7Yl{O8&jk-#!z#s&c~ ziH|FJgp)csR|H)-m27axe?|#QkfK$z!#M@=Tcd_lWSio z7P!mY)UAyX61K@@XB2JX3E(gde-sd7sB!e<(}Od0FLm608eX?|?vlWfbJkewJVuc3YK=YwDxzUv6eD?fJVx)TuY~@9FI==3!#`4hmBm zLrz@F5sgemGLt4UgY+h((GhWXWxpA9ysX*_K7c`iA5-{q3($^V{qAH6#DqaTO&HikMu zH^zkT)f^!li{t_nJEk#;HvKW@I=d}kzNbbAhf??nqq8@>V$bZkq?WO0!tpnemltM; zH2o==<-dGozuWyQ>_<6UCw@@QWbb8R{o8R4(Tj%ZECDs_gCCasTmh6|{ zjDX~)!5gPbC4bBRJ|S%Xuiw3Uxa*&Ku3o+D?srdz{Y&5P3$_<+3}E}KXdcj^b(w$t ziI+R~+9_SWy8f@v&0k+iFUIbjo*b?6QhgEoJ)eUii_24rlUo%NKitpcGTidJc1lA0 z?{kwHe6y#Su>an*?`m85{_?fOv6WF#JJWo7%-_`U2d))ZFMt19^rdUo_m6+Bc$9EI zY=OYM)-_hE%DOLK|HziaFWR)irg`x?lM6alk7G>3wmm<(>(X{1tHm3y%?+FM9;=0~YX5Lg z`!L7lZhJsS^7GWSW|?tn${HrKoqgh8?>3UWdFSH0eje3V41cycf4``%W?b=VvAcU) zXh&x6*@@a$40t0iZa8s2Ic&j1>GKu$uI#+S`k?W=Q|pQY%`dl}_#)K#giH5Se~ix0 z#EJD&He4`XwM_AWMBPijn`^8?I=E~kTKBlLa<#sjA{W&We=YP%t>vn>iubSgGqt8{ zzP->X-yE_ zbZm84=&ks>@1#i8uEmNQA6z@0Ag1NQD!0R_*pgdjr(f}O$(<4BX1_aD%G58eW7T^y z@<;9Jcg+4wO%AOJuNXy}G9&{O!O78T{epBeLjrr;CH)QPFt8inXq<4Ai)Oa=0kTA1z(( z__MY=_o22+r$fnX!@v_(_V?ZW>mu9UPCj_`eWKVRzT|&>XBO^>3bDCa_}E3@v8u~; z$>P=tobEH!I9jX@^ouD5D0Wmiv?~1HRIcXW8ObiBRj@IoHl@kk)uzx5 zGEcX3UEV%BY3Z$OtH+a4_E&zs@%>wBrMKO`oNsU6%}x{G5)|MP{9~TuyReD1V4iP9 zt?7m|i{0frb5366Y=~{z>?BiPGViR&>#&Z!CZ4RfDqEa(XrxHKZwS;lu)6EerShBw zOfMh3>DE0kOW@TLgXb?;G?&Ib{%OAd^CgRp>G>0W+&tNCb&l&`V0gC^tMlnz@6$@| z=F(Lu%;{^jH8_7}bvu<-`-_LpF^|{a`h0!K9CIPAyVEs7WLq@1{1e&}9QDhy@5|)2 zT=q3@FLYvR9b6pj+dz{`#=(Bb# zf5CEg)(@p_C#z&e!Pa;EPB(03GkrX|A#J^^-R^n^r#c6>*jZg`ycHi5Je+V^vj1(J z;_huC&&pVzma}dwt4b9N{Ace%_!q4JXiVFIP&+?pKltD>Zxad z#Twh?D-Qg!XMFRrYud}@0*zB0HCz(zauqIeG0?9#R4B%INBCh)j@Y?f&t)0gx0k&- zoN^;O-uZfEUdg`KaZ2ZoS)N??{YU9}%Y82kj~|==!R@un4Y#I^-&joyM8E0eKfL_e zbwS>=7yZ45jn*t#dO^qco{!sZ3D@M^=RM=Ne=DUhe7k3P@LHWqx-3`j-gO_@=Iq=2 z`gQ2{ur)ii-f6Qjux5q`T-y2WgUH1jjqe>;BdYYw85x5G+KYG2EGZCwbaiK}nt`WR z#af)W$$8#;3j+?$laox?ef8ACB+XI=+3e1rC%@{oYON1wSUQu{Z@yC9 zy&IxhYrcd>iCD3iTkYbX7xm>^3h%Qg<)@i8opi`h|NiFD+5msWlE>-yzuxWoRx&-u zIe%LG=jFw{^9p9R>9NG=K918hW-N1fe(U`eMPbq1F(#Kf=S=9FV>dn8X2pdkK6BrE z^16Ofro+AM;;I?Wdg>B+p54m#K4=ARsrz9Tn^JQ3*Q_P`J zc2wk*{7FIiJxUR?LOKh6`4~p|@7>$8(T};cX8%c>llyr@gW_M6w7O|Ns%<{&016HgL!Wym$#W+(Mmp*V%Xf4 z73uM|w{p>eH>^c-WxA7gsm*7|bAR!&a?62$B~RL!r(HCxf7;-tp5X26e3Dsedy?XP z{u{hIw710FuRp^e8g#Fxtl_AF$*M0a&6lOGcNWjnR=Ki&(|zj{rR{sJbhs|uIB_w% zVXKaDDc9+rlk^3>`Mh5)yPte<#hu*!%G0Fmax(SzwrPI(W~?url_J)9WUpTM!wE6J zJ-kmO@U5EgAOQ9z&dA538Dr;HT zy!KGg_{|*~!sRFE{$4hRBBGXN%TmJP}-TN3HAEst;1TCUA?s(pr|7 zA1mEsZ}Yr$ZnZc6@A;Z5rCuErVPcl%JO5|WnSWM?MHzJ3V@I@Y;(*XCtMC&m@X;8q}~3oW3|%;W|lC%)=!f2 zxHLUk!uY>R?BlZC7sXq>vD!6aZ&%C5SK^bBr-X@SUeo-v*jO`SqLY+Pp46>HZFuj}6sN^Irc~ zuh34}v2LmI`gzu?f3)^3u-Rqs`-GPL|H31>O}~Dv&pNVq*XBu$3W1xGx1SJ5IoRo9 z+|&_Qm9w+#@x>duho?)O}0nQi@(j6)D6t@<4wOul)`!_R(U%=b<%t&pC5x;{^yv@lgZ ztcgCHAP|*x_u3&F%cL&e-qQtDx)uIw=QKX(@YsLjjLW6dJ$q6v>VJM5qCaKU435ix z-!7Ocl$*DmX=83d_zCmPGsJGko5UnX2~QMBw7Pra(yWyw&+5KB-p;h+OpUFXruWH| zF0p0*o*Xgxaf)Xjm)hl>8#u4Mz3IZ)AF<7G!}G)O>*p;nDs)-$-bSPN|GaFQy>D-Q zT@`z4qhsV1>Gvzn%}na=iP-36UVHEaH^ zDn4r=$)r8^#Fpt{=YuCKv^SV|vO7)OY}*GbmMtI7u6jGyxmo_8m(9tmvk$ZWOWP}{ z6>|GpKuKl5w+H84y8?5U8U1a$)|qqJhq+bcmzpo@DuMXJ53<|#g*~Be{ttTwBUEKa(O3iJ%%@z0~bY&&euWz-vdoD#g`uQ1iPY>O?mCsHk za@o=k()Z7M8ChGZehx10(Z4Z$?kb*skF%5cdHKF)t@IPHlH)w&ZSr~D9~ReNhZap( zWV1T+W}4*U@YPv!wU5ubkZbmEoq)36(Gvj&ZT!T1mL5K`+UG;y#mRp|zWnsEnk!eM z;^^xiCseM&80$S#cI~3elhY5Y75AyA1T_20ehgIA58NxGyZAAOGILoU)8{9uiG>B} z3HKA9zxZMqV#O+!BduN|8gy7L!ur~N_W%4=`?w5Ou!QmNW0pDJmBDhYZ}HujH;x9K zzOio{6SxJ0vxOpNIu#`OwmqL*Ry28DZNYxgto7SAsm~DfF>lq&+198&L-4`MfIscm zzWQV~WiA&m+xSdb#Ua7?fx*UQ;Vy;?C-62NJ~GQVO<;TcO`#(zU74H|oBp#c6gX(o z9MI7a(DA_h+dEm-L=B!pD-=Cy5^`52C@Rf()O5N$H}9Z4li!Z#YaXsn&r)%b;8av3 zojN4^>&=U^Ntd50DAuVdUh?QTDs*dG=e{k8H(R2l-F6ktp62_)i0?~kjTZ;!NB_s6 zP97ahoDMhv+2JUmUz^I` z1^P}al&Md1nd!d8&naO^nU0ROkeP&mWR7w|%%-1cFHTP z>+4q1l+@~Yq`OQ-VfvI1Ju!)iC5*nSFK^~$YP4E+*y{bOzi({$_wRjk*Z%jM=iB%G zwtMflG_hr_OOKSny0cGSGaNgbYIcjEsn&dE(pSc~8#`5Ax*KiyaiivVnGJ)d<4He; z6Ys4iKAgWOWnbRToj-rs)iT`Lrk;C@S>%ZJmEg1!r^^nmU`*Cpd*DFt?btU=3Qn)n zBHy1}^XucPzk95VZWKTN(%@&1fp>tav(vM@G!`;+S+ zqo(NlJx@)qdUVTw)4A>5tN;97U3h)N{cY#EozC6iVVoWiC8cY+^PQqnbL+=5+<(9G z99z%0B4G3GzCEco)xzE}rRn}z-lb8I@GYcr{y(SOhdTxQWA2^YwQP6jF9z0+TzC0j zpL%B@dPeGI>_IIaY0F)L=cFBfeO?@Ja_wfL6$06Z-@Xg#T3h^}_|fIP=~jpBTXa{a zYOq)_pE-5dPeWu??!(i+r8bAlM|@%DTgqAOCbjW}&Jsbcqmgzh2FYH|M{e@g9W8tG zB7L!$@bi@uEv>O{rk5? zvM%bsdU3g2T6i&6W|vd0`R>Wg>piA$o!s|S|DIKT@0rYpm$y&ldMf{L%A7C8U%uw# zp5DvHkWu~ZtW=ppo$cHp!)@hn((gaHd@YmV!wu1cekO+=bu~`XHf(ZBJayiRf%PR< zY{@}`OUBKXjiTb#cILL99iIhwR2~0gvgwxh2j0!m&v%v1P1){eba>X}b(g=b;of?J zfx$udQA}KKYqjMZlUM0&V!GFAj6}414j-#1u#i4$dHYZ6?2lhKoEw@-TIHBEpSK1C zv`*P9;NZx0OKRnXMXpvF9**I{qL&W6c=bxpA)jMsX66E?03}@>u0 z)i2Pe5_@{4(b~3Fb@d4o=St}4KCt+^GC;YqsO7*Ej*1@J@^6J2d*d(re(T$<&vvmxkp#L+|OjW@lP8vo&SU00Muj-9zQIpBU-pX)=@ zUvfR)JRj9{D|Sk6tC)0ap?lGKHTPAE(|ztN4BIZ1AMu7s>ZngE zN8z4t+6QfqZd6(Sd+$+4yXkS8RGx}NRc+!))7;`Um+LQs`m`k<&-R8kvZE?{2>vQJ(!u6jyIu9@07y9nZ7xj>iTl)1^b!^_8?BQ@+ zTyxcJp>cG2m9KsO=HvbL7uvWC`Cgmz7QH=vzAUwOseHuxqf?gF6;C)@IFOGkDsy z&Kxh!Y#j~jNLbANY9t_W3(DwA2(F+0&zWnM_f zbmsJhH#}l_@|_fOzJ%(F-%@zo{=2C4PH0BT#d{BeVz^oJuT81bJJ>TX^-jM1-a4(1 zu5nM-sl2QEsdMG?rwTc9k?3nvp9S8OXTY;kk@duIN;tx{5dP1~K; z$MBl;aJGi62@%@xyO}{Oq{A)ZeD9ZzXY#kcN$r1h=kQ`X?Qk_d5v}c0g(X%7FARNX z5yNICE`D;w=2yD+Ue<_z4}Itt8SAX4=N_gWo*@x_z)tDt+^70`ck17EyAl28Nbeib z%?v{8{>t7s!JxlBCTr5>_}k&X5~6DFES~j6Z~>dD!KIU8a#wekCoX0E*5i;?I<>Lv zc0k!5zkJ7#xo1{}JuvAq{&{zs{leV#ebE)BF=sjs-we*YdWuypH)c-C{}r5k*SXyG zuR4~>QN2FkgSzIAZ7Jy$A~hUq8k3f=Ej?%#aiM0j=xcHI?ttDotzm0ICt2nMU3eq& z7t46Lpg-ePN}A{+8$GSP%U8 zwCUlQsGU+B{%o5!yzplZW|_er&%SwMhM~Fn{v9knkIc4Z|1yp->(;Hiy`1IB zwpn_Mofl<4FZysl(P`n-(;?}ttKH_!jq8eAlofZ;Fihjgt{Ww5Pt9=4d{Uk=!&T#R z*CzWHd;edPn%a45<-~AH=Rp4K>wlSjOpWwgnk)i9wN*d}Qz!>(X2vY1j6ZUYYij(2 zMV%gh=QzaCdw=mC`SouawOUjHS_3AmzOc;v-iD1Lf}$&{lh-nwuVtIDzll%YOj_4! zUBjYQt(Jl-D=s9SJm{GIqD^V{jF8XekqW0z>=Y5IdnDYV)lzY#>S%aQSA>iD#vA*d z7Ygo|`J6QAlfCW1yBn3w)xs9>7hi4nFzgJP7Q9E9)BJ`)>c+%_o2HA;ObqH|Ja+AI zo+IDV&LdvJZIc((&hohX&b1~sL~+SNw^k0-bD>Fr$0d*Ftu`>bqf`CouyUL8Y5wVR zPA^Cm$d%2Ph`h@s8dCc8N3~0jsrXyDnL0-<{_|~i(apJOUM8~IbW7Q+>t4Grh0G7G z{(V_|A(tZWRblKpIC$an^vlXit|u5Solvp;VMh5H4Z9b)%Rl)G zU2to2xUwQZHpJsV{-L+ZM=qYf{r*cK$NG2s?n|q;1lGti%70rK6XSFAC(|}&akUQ* zZ!eW8*E^RI5O?Cok;yemZZ}@nWqtOYqr%z~57A}>WRR29fxAbx^Fl&yIh<0YP1Q44lV zWjraRz^wXchOyRchgP3!scJ?UNAh$63RYj_IkM9GOi5m0aobFtSCcBsb)`i$t(Pn@ zJ-^&@=fA4^-{w6jK3}ZQ-^%5_S>v% zpDtF*xqr_V4$)7ld)7=iD!@AD1-tC|=BX!ItXirL|6S&mwcWYhq4f`kzE;Te$a#o}J9h7S5ZUK3ny;G;OVKPiS43G0CUbYm!08$wNyx zLQYKo_-e}L>76?-|K9R!etW&<{_2f;Zrr(PWDqsee%FoQ$RAl#Y<^!@x67~i^qqB+ zohO$@2e&^@o z7vFmBJ*BZ?g8t*HjXok;dTMo#_8ne&!SZP9!l#|<{aSYwcRcSqrSs8nZbrp>x#>>L z`76GaE)o8`bouuECEv;|Cj7LxH_!TR$>tsJez41Dn%=Zr8hrHD&AqEdtEy8rR<8QD zb*DQQ>&))e`|MWczL1ppwONQSWnZ7TXw)eNhReLt$)=Jw<`@NO%{I(Rn&#x|-I=Ai ztcNRL_4FG-pJrZNKgY1mbDBr!it^t*AK7;1ZYVyGc4fl@hi8v}yjgm*wl&k0t0L$< z`;RqF^E{GlSU-yX`79?XB*pqs)XDj8pkjkV4afcvjz`%JtqK8(9J&jf4((XW%sS!! ze5Z$;PT#^5eI7J3aC!+R@+|0BIClyQ1DD{$CH(9biI;i3${4tQ`A$9ZW3kiOJ!_>k zB^5atdL1OTFr4vh@%lWoAx=neL5M+%e$oYX!#OWaJen@}bp22a5fZ(Szsg=~$^oZs zd=vN&NtST(EEiFlw1u-=>j+;;4ue{|m-nK~d;{y0!_sf&bFt>gE^#`@!=@m2x}j9Q zafSCnhwWRh_Zv6Ga=A{@zEt<7K(pn7pL-Bjpl|8%;=T#z?M1zM;@B`glXR=%F5~$lUVnva1VMOgJ0b;hHq-MVUwB z(!0MWN9gIya(RB}of2!e-m+VH?WZQ)o%^*b`sYR`Bh&avj0XFP-r8Q~j93~l{oL1i zbykn>e=iW9C&DBrr*a@x@q5qnCtj^7e`{1PhKOuVH)!z4QZl>i9KCn-gdbnJKNy2}{ofmTuYd^xXmF)(uPDxn$EWsu*rPcJaf{cZ-}CPd_nzk&nHfJWF~^7p^no2>b42v~su8>X|B&7ft25*x=rF*!&W=>m<*G(fU(X2};eZxgzGT zB{FG>)!dC`!8`ATa%B4ae|2hRR`f=%8imCV_U6uBF`?u8e9cd0iO`-Mb8OZ{{L>Mf zn8F^+b+T1(VT;pYPE+Qck&7n({8r}srDvg8<)05x@jVO9o;}v!5VVkiTT4~s)gkuD z%bkCHK0cpSZug>w9nYTqc;FDEI5|o~Rn#fs#tbILX*)k2d?NIydiV1GTMu3g3EsOp z;MLb}(}Y8x-Ubgi!2s)`pmtzX@I4<}u0eawCQc9h8vm*Y!6?+h`l-KeoBu=?Adv+wh+h)gdy z-S$Q%FYh(WWTpR!hCkIOzG{7P&0y}Gw2~*0hu0j*+o@*wOdOvsN>YdKcv%bBK-!olZP24SgWm3i2kmJ1BMZXw7Rtw91&pLBFFMf5t zke>L?)MwxSd&!AMedd)pce3i~$=9=LWz^kX-CQZ4v~C(-_M+eF$N5eloAkrXnkusQL7k4tnv4GNoqrdI&p*H7 zs?Fkn+f97cFa9|--Q`=pd)~xTddJy4Z&+Cj*tmrDgn}#pd_*3q5UYCv%=URRGo7uJ~_u?HfrH`-wDWAi|dsp#} zGgt-wmkkjv|F@wH-7K+iWB-E0n*tPdLv?9X+tLGso68<8NO&< za=`h@YA#>x1Jn80#J7shzbB)0^GT!6gjmDR&1%*Qu;-IVtfbzfG+H$mISKcwGc&9ie{jTI*xMEHe{9@{dn_!MWc|LP!x87p5~ z=4-ro`EsV{8kIIHu~+qR=ltg!H07G98}|I6Px{wV#T?C3ize&4dZlK)G_c#5^6L21 zz@kMfrrazzy!gncbh|JP_FuM`(*~VmtaufV)q-@%e<$=e=6L z95EM??({$Q_;Zj?`f)l9b&B>iv_qYE)vKTaZ-#DQR;QlaOrkJ(sVuQeloZ1d+p-L ztel0Z>u=3;58ZoA>{g$2vE{bFRtLp@%Me=U=zXa@z&T$&Zo!>@+07T~7#J8BJYD@< J);T3K0RSaKC~^P* From af1bd287a85b96d5d9b04c0c8d2d91d24f428e3f Mon Sep 17 00:00:00 2001 From: Leena Miettinen Date: Fri, 1 Jun 2018 10:20:29 +0200 Subject: [PATCH 40/52] Doc: Update the FAQ The Welcome mode is no longer implemented using Qt Quick 2, so the problem arises later, when opening Qt Quick Designer or QML Profiler. Change-Id: Ifbe50bdb9cfc1709842413d271d96378549eb673 Reviewed-by: hjk --- doc/src/howto/qtcreator-faq.qdoc | 128 +++++++++++++++---------------- 1 file changed, 61 insertions(+), 67 deletions(-) diff --git a/doc/src/howto/qtcreator-faq.qdoc b/doc/src/howto/qtcreator-faq.qdoc index 6d04e7a8c3c..b6347c41fea 100644 --- a/doc/src/howto/qtcreator-faq.qdoc +++ b/doc/src/howto/qtcreator-faq.qdoc @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2016 The Qt Company Ltd. +** Copyright (C) 2018 The Qt Company Ltd. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of the Qt Creator documentation. @@ -39,72 +39,6 @@ \section1 General Questions - \b {\QC only shows a blank window, a dialog complaining about missing OpenGL support, or crashes on startup. What's going wrong?} - - Some parts of \QC use Qt Quick 2, which relies on OpenGL API for - drawing. The most prominent use of Qt Quick 2 is in the Welcome mode, but it's - also used for the \QMLD, and the QML Profiler. - - Unfortunately the use of OpenGL can cause problems, especially in remote setups - and with outdated drivers. You can quickly check whether this is your problem by: - - \list - - \li Launching \QC with Welcome mode disabled ( \c{-noload Welcome} on - command line). - - \li Checking the console or the Windows debugger log for OpenGL-related error messages. - - \endlist - - The fixes and workarounds differ, depending on your setup. As a last resort you - can disable the affected plugins. - - \e{Virtual Machines} - - Try to enable \e{3D acceleration} in your virtual machine's settings. For VirtualBox, - also make sure you have installed the Guest Addons, including experimental - \e{Direct3D support}. - - \e{Windows} - - Check whether \QC has been compiled with OpenGL/Desktop, or ANGLE as - a backend. The official binaries are always built with ANGLE (a library that - maps OpenGL ES API to DirectX). - - \list - - \li ANGLE backend: This requires a Windows version newer than Windows XP. If you - have problems, try updating your graphics drivers or update your - DirectX version. Run \c dxdiag.exe to check whether \e{Direct3D Acceleration} - is indeed enabled. - - \li OpenGL backend: Make sure your graphics driver supports OpenGL 2.1 or newer. - Try to update your graphics driver. - - \endlist - - \e{Unix} - - Run \c glxgears for a quick check whether OpenGL works in general. Check output of - \c glxinfo to get more details like the OpenGL driver and renderer (search for 'OpenGL' - in the application's output). - - If you are using the Mesa driver, you can force OpenGL to be rendered in software - by setting the \c LIBGL_ALWAYS_SOFTWARE environment variable. - - \e{Disabling plugins} - - You can disable the \QC plugins, at the expense of losing functionality: - - \list - - \li Launch \QC from command line, with - \c {-noload Welcome -noload QmlProfiler -noload QuickDesigner} arguments. - - \li Disable the plugins permanently by selecting \uicontrol Help > \uicontrol{About Plugins}. - - \endlist \b {How do I reset all \QC settings?} @@ -143,6 +77,66 @@ \include widgets/creator-faq-qtdesigner.qdocinc qt designer faq + \section1 QML and Qt Quick Questions + + \b {What should I do when \QC complains about missing OpenGL support?} + + Some parts of \QC, such as \QMLD and QML Profiler, use Qt Quick 2, which + relies on OpenGL API for drawing. Unfortunately, the use of OpenGL can cause + problems, especially in remote setups and with outdated drivers. In these + cases, \QC displays OpenGL-related error messages on the console or records + them in the Windows debugger log. + + The fixes and workarounds differ, depending on your setup. As a last resort, + you can disable the affected plugins. + + \e{Virtual Machines} + + Try to enable \e{3D acceleration} in your virtual machine's settings. For + VirtualBox, also make sure you have installed the Guest Addons, including + experimental \e{Direct3D support}. + + \e{Windows} + + Check whether \QC has been compiled with OpenGL/Desktop, or ANGLE as + a backend. The official binaries are always built with ANGLE (a library that + maps OpenGL ES API to DirectX). + + \list + + \li ANGLE backend: This requires a Windows version newer than Windows XP. + If you have problems, try updating your graphics drivers or update + your DirectX version. Run \c dxdiag.exe to check whether + \e{Direct3D Acceleration} is indeed enabled. + + \li OpenGL backend: Make sure your graphics driver supports OpenGL 2.1 or + newer. Try to update your graphics driver. + + \endlist + + \e{Unix} + + Run \c glxgears for a quick check whether OpenGL works in general. Check the + output of \c glxinfo to get more details like the OpenGL driver and renderer + (search for \e OpenGL in the application's output). + + If you are using the Mesa driver, you can force OpenGL to be rendered in + software by setting the \c LIBGL_ALWAYS_SOFTWARE environment variable. + + \e{Disabling plugins} + + You can disable the \QC plugins, at the expense of losing functionality: + + \list + + \li Launch \QC from command line, with the + \c {-noload QmlProfiler -noload QuickDesigner} arguments. + + \li Disable the plugins permanently by selecting \uicontrol Help > + \uicontrol{About Plugins}. + + \endlist + \section1 Help Questions \b {The Qt API Reference Documentation is missing and context help does From fff6065a691061a8a61db79327a272dd49184b09 Mon Sep 17 00:00:00 2001 From: Leena Miettinen Date: Fri, 1 Jun 2018 10:50:37 +0200 Subject: [PATCH 41/52] Doc: Add a question to FAQ about QML imports not being found This results in error messages and missing functionality. Change-Id: I041ea8e61f3b4cd113964d2c5dfc609e6581c2f7 Reviewed-by: Thomas Hartmann Reviewed-by: Marco Benelli --- doc/src/howto/qtcreator-faq.qdoc | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/doc/src/howto/qtcreator-faq.qdoc b/doc/src/howto/qtcreator-faq.qdoc index b6347c41fea..3bd14807ad4 100644 --- a/doc/src/howto/qtcreator-faq.qdoc +++ b/doc/src/howto/qtcreator-faq.qdoc @@ -79,6 +79,29 @@ \section1 QML and Qt Quick Questions + \b {Why is there a red line below my QML import, even though I have the module?} + + By default, \QC looks in the QML import path of Qt for QML modules. + Sometimes, it does not get it right and you need to tell it where the + modules are by specifying the \c{QML_IMPORT_PATH} in the \c{.pro} file of + your application. + + This also enables code completion of QML code and removes error messages. + + The following example illustrates how to specify the import path so that + it works when switching between build and run kits for different target + platforms: + + \code + TEMPNAME = $${QMAKE_QMAKE} + MY_QTPATH = $$dirname(TEMPNAME) + QML_IMPORT_PATH += $$MY_QTPATH/../qml + message("my QML Import Path: "$$QML_IMPORT_PATH) + \endcode + + For more information about how to set the import path when using CMake, see + \l {Importing QML Modules}. + \b {What should I do when \QC complains about missing OpenGL support?} Some parts of \QC, such as \QMLD and QML Profiler, use Qt Quick 2, which From 4539acce04f9c9403382c2bf3677895d748a8b10 Mon Sep 17 00:00:00 2001 From: Tobias Hunger Date: Wed, 30 May 2018 16:34:55 +0200 Subject: [PATCH 42/52] ProjectExplorer: Fix possible crash in Projects mode Change-Id: Ic57dac0487d03d88e0d9d37f67c55ae36e84af4d Reviewed-by: Tim Jenssen Reviewed-by: hjk --- src/plugins/projectexplorer/targetsettingspanel.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/plugins/projectexplorer/targetsettingspanel.cpp b/src/plugins/projectexplorer/targetsettingspanel.cpp index 9bc55384c4f..7248b475b43 100644 --- a/src/plugins/projectexplorer/targetsettingspanel.cpp +++ b/src/plugins/projectexplorer/targetsettingspanel.cpp @@ -335,10 +335,11 @@ public: case Qt::FontRole: { QFont font = parent()->data(column, role).value(); - if (TargetItem *targetItem = parent()->currentTargetItem()) - if (targetItem->target()->id() == m_kitId - && m_project == SessionManager::startupProject()) + if (TargetItem *targetItem = parent()->currentTargetItem()) { + Target *t = targetItem->target(); + if (t && t->id() == m_kitId && m_project == SessionManager::startupProject()) font.setBold(true); + } return font; } From f1881ac2fc2671be4ce11c381abfcea852feb8e7 Mon Sep 17 00:00:00 2001 From: Christian Stenger Date: Fri, 1 Jun 2018 10:30:15 +0200 Subject: [PATCH 43/52] Tests: Fix defining path to sdktool Replace backslashes with normal slashes as Qt handles them inside paths correctly itself. Otherwise we might end up using unknown escape sequences which leads to not executing anything and a passing test. Escaping the blanks is not necessary as they are handled correctly automatically. Change-Id: Ib1a81949c54d41b7864e30a1371de2e148f96bb8 Reviewed-by: Tobias Hunger --- tests/auto/sdktool/sdktool.pro | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/tests/auto/sdktool/sdktool.pro b/tests/auto/sdktool/sdktool.pro index b83c78847f9..fe78c49f277 100644 --- a/tests/auto/sdktool/sdktool.pro +++ b/tests/auto/sdktool/sdktool.pro @@ -1,5 +1,8 @@ include(../qttest.pri) -DEFINES += "SDKTOOL_DIR=\\\"$$replace(IDE_LIBEXEC_PATH, " ", "\\ ")\\\"" +TMP_ILP = $$IDE_LIBEXEC_PATH +win32: TMP_ILP = $$replace(TMP_ILP, \\\\, /) + +DEFINES += SDKTOOL_DIR=\\\"$$TMP_ILP\\\" SOURCES += tst_sdktool.cpp From 92530fd05dfe596810e90b499d399f1859bdfd56 Mon Sep 17 00:00:00 2001 From: Ulf Hermann Date: Thu, 31 May 2018 14:11:10 +0200 Subject: [PATCH 44/52] QmlProfiler: stop trying to connect when the application quits Change-Id: I3b33ced218320a19fd4e4e834093c0f3b67a8cba Task-number: QTCREATORBUG-20499 Reviewed-by: Christian Kandeler --- src/libs/qmldebug/qmldebugconnectionmanager.cpp | 5 +++++ src/libs/qmldebug/qmldebugconnectionmanager.h | 1 + src/plugins/qmlprofiler/qmlprofilertool.cpp | 7 +++++++ 3 files changed, 13 insertions(+) diff --git a/src/libs/qmldebug/qmldebugconnectionmanager.cpp b/src/libs/qmldebug/qmldebugconnectionmanager.cpp index a13cb0f3ccc..2901e21d9d0 100644 --- a/src/libs/qmldebug/qmldebugconnectionmanager.cpp +++ b/src/libs/qmldebug/qmldebugconnectionmanager.cpp @@ -71,6 +71,11 @@ void QmlDebugConnectionManager::disconnectFromServer() stopConnectionTimer(); } +bool QmlDebugConnectionManager::isConnecting() const +{ + return m_connectionTimer.isActive(); +} + static quint16 port16(const QUrl &url) { const int port32 = url.port(); diff --git a/src/libs/qmldebug/qmldebugconnectionmanager.h b/src/libs/qmldebug/qmldebugconnectionmanager.h index b1b731c4bc6..2bab6b082c0 100644 --- a/src/libs/qmldebug/qmldebugconnectionmanager.h +++ b/src/libs/qmldebug/qmldebugconnectionmanager.h @@ -44,6 +44,7 @@ public: void connectToServer(const QUrl &server); void disconnectFromServer(); + bool isConnecting() const; bool isConnected() const; void setRetryParams(int interval, int maxAttempts); diff --git a/src/plugins/qmlprofiler/qmlprofilertool.cpp b/src/plugins/qmlprofiler/qmlprofilertool.cpp index 5b44948d32e..dd8605a2d2c 100644 --- a/src/plugins/qmlprofiler/qmlprofilertool.cpp +++ b/src/plugins/qmlprofiler/qmlprofilertool.cpp @@ -316,6 +316,13 @@ void QmlProfilerTool::finalizeRunControl(QmlProfilerRunner *runWorker) d->m_toolBusy = false; updateRunActions(); disconnect(d->m_stopAction, &QAction::triggered, runControl, &RunControl::initiateStop); + + // If we're still trying to connect, stop now. + if (d->m_profilerConnections->isConnecting()) { + showNonmodalWarning(tr("The application finished before a connection could be " + "established. No data was loaded.")); + d->m_profilerConnections->disconnectFromServer(); + } }; connect(runControl, &RunControl::stopped, this, handleStop); From b0c01193457ef931577a7b4d850c22826c91ac01 Mon Sep 17 00:00:00 2001 From: Ivan Donchevskii Date: Fri, 1 Jun 2018 09:18:45 +0200 Subject: [PATCH 45/52] CppTools: Use cursor range for better outline navigation Clang provides cursor range for each declaration in symbol outline. Use that information to search for more accurate correspondence between a cursor position in editor and an entry in symbol outline. For example skip indexes with not matching ranges to prevent pure declarations from automatically become parents of everything coming after them. Change-Id: I0ef95c26772050cd6655e830288c46118aba38bb Reviewed-by: Nikolai Kosjar --- src/libs/utils/linecolumn.h | 5 +++++ .../clangcodemodel/clangoverviewmodel.cpp | 18 ++++++++++++++---- .../clangcodemodel/clangoverviewmodel.h | 1 + src/plugins/cpptools/abstractoverviewmodel.h | 5 +++++ src/plugins/cpptools/cppeditoroutline.cpp | 17 ++++++++++++++++- src/plugins/cpptools/cppoverviewmodel.cpp | 6 ++++++ src/plugins/cpptools/cppoverviewmodel.h | 1 + 7 files changed, 48 insertions(+), 5 deletions(-) diff --git a/src/libs/utils/linecolumn.h b/src/libs/utils/linecolumn.h index 003ba3ef342..1be72c281de 100644 --- a/src/libs/utils/linecolumn.h +++ b/src/libs/utils/linecolumn.h @@ -51,6 +51,11 @@ public: return first.isValid() && first.line == second.line && first.column == second.column; } + friend bool operator!=(LineColumn first, LineColumn second) + { + return !(first == second); + } + public: int line = -1; int column = -1; diff --git a/src/plugins/clangcodemodel/clangoverviewmodel.cpp b/src/plugins/clangcodemodel/clangoverviewmodel.cpp index 655005bc2c4..22a2576b716 100644 --- a/src/plugins/clangcodemodel/clangoverviewmodel.cpp +++ b/src/plugins/clangcodemodel/clangoverviewmodel.cpp @@ -213,10 +213,20 @@ bool OverviewModel::isGenerated(const QModelIndex &) const TokenTreeItem *item = static_cast(itemForIndex(sourceIndex)); if (!item) return {}; - ::Utils::LineColumn lineColumn; - lineColumn.line = static_cast(item->token.line); - lineColumn.column = static_cast(item->token.column); - return lineColumn; + return ::Utils::LineColumn(static_cast(item->token.line), + static_cast(item->token.column)); +} + +OverviewModel::Range OverviewModel::rangeFromIndex(const QModelIndex &sourceIndex) const +{ + TokenTreeItem *item = static_cast(itemForIndex(sourceIndex)); + if (!item) + return {}; + const ClangBackEnd::SourceRangeContainer &range = item->token.extraInfo.cursorRange; + return std::make_pair(::Utils::LineColumn(static_cast(range.start.line), + static_cast(range.start.column)), + ::Utils::LineColumn(static_cast(range.end.line), + static_cast(range.end.column))); } } // namespace Internal diff --git a/src/plugins/clangcodemodel/clangoverviewmodel.h b/src/plugins/clangcodemodel/clangoverviewmodel.h index 7ea3bc8206f..306b529c25a 100644 --- a/src/plugins/clangcodemodel/clangoverviewmodel.h +++ b/src/plugins/clangcodemodel/clangoverviewmodel.h @@ -61,6 +61,7 @@ public: bool isGenerated(const QModelIndex &sourceIndex) const override; ::Utils::Link linkFromIndex(const QModelIndex &sourceIndex) const override; ::Utils::LineColumn lineColumnFromIndex(const QModelIndex &sourceIndex) const override; + Range rangeFromIndex(const QModelIndex &sourceIndex) const override; private: QString m_filePath; }; diff --git a/src/plugins/cpptools/abstractoverviewmodel.h b/src/plugins/cpptools/abstractoverviewmodel.h index 6a9bbebb991..444d19e5482 100644 --- a/src/plugins/cpptools/abstractoverviewmodel.h +++ b/src/plugins/cpptools/abstractoverviewmodel.h @@ -32,6 +32,8 @@ #include +#include + namespace CPlusPlus { class Document; } namespace Utils { @@ -91,6 +93,9 @@ public: virtual Utils::Link linkFromIndex(const QModelIndex &) const = 0; virtual Utils::LineColumn lineColumnFromIndex(const QModelIndex &) const = 0; + using Range = std::pair; + virtual Range rangeFromIndex(const QModelIndex &) const = 0; + signals: void needsUpdate(); }; diff --git a/src/plugins/cpptools/cppeditoroutline.cpp b/src/plugins/cpptools/cppeditoroutline.cpp index a71e027cdc3..d7840016d59 100644 --- a/src/plugins/cpptools/cppeditoroutline.cpp +++ b/src/plugins/cpptools/cppeditoroutline.cpp @@ -263,6 +263,17 @@ void CppEditorOutline::gotoSymbolInEditor() emit m_editorWidget->activateEditor(); } +static bool contains(const AbstractOverviewModel::Range &range, int line, int column) +{ + if (line < range.first.line || line > range.second.line) + return false; + if (line == range.first.line && column < range.first.column) + return false; + if (line == range.second.line && column > range.second.column) + return false; + return true; +} + QModelIndex CppEditorOutline::indexForPosition(int line, int column, const QModelIndex &rootIndex) const { @@ -270,8 +281,12 @@ QModelIndex CppEditorOutline::indexForPosition(int line, int column, const int rowCount = m_model->rowCount(rootIndex); for (int row = 0; row < rowCount; ++row) { const QModelIndex index = m_model->index(row, 0, rootIndex); - if (m_model->lineColumnFromIndex(index).line > line) + const AbstractOverviewModel::Range range = m_model->rangeFromIndex(index); + if (range.first.line > line) break; + // Skip ranges that do not include current line and column. + if (range.second != range.first && !contains(range, line, column)) + continue; lastIndex = index; } diff --git a/src/plugins/cpptools/cppoverviewmodel.cpp b/src/plugins/cpptools/cppoverviewmodel.cpp index 590f2b6847b..8c720b75ca7 100644 --- a/src/plugins/cpptools/cppoverviewmodel.cpp +++ b/src/plugins/cpptools/cppoverviewmodel.cpp @@ -190,6 +190,12 @@ Utils::LineColumn OverviewModel::lineColumnFromIndex(const QModelIndex &sourceIn return lineColumn; } +OverviewModel::Range OverviewModel::rangeFromIndex(const QModelIndex &sourceIndex) const +{ + Utils::LineColumn lineColumn = lineColumnFromIndex(sourceIndex); + return std::make_pair(lineColumn, lineColumn); +} + void OverviewModel::buildTree(SymbolItem *root, bool isRoot) { if (!root) diff --git a/src/plugins/cpptools/cppoverviewmodel.h b/src/plugins/cpptools/cppoverviewmodel.h index 6582ca083f0..0a7870ed288 100644 --- a/src/plugins/cpptools/cppoverviewmodel.h +++ b/src/plugins/cpptools/cppoverviewmodel.h @@ -54,6 +54,7 @@ public: bool isGenerated(const QModelIndex &sourceIndex) const override; Utils::Link linkFromIndex(const QModelIndex &sourceIndex) const override; Utils::LineColumn lineColumnFromIndex(const QModelIndex &sourceIndex) const override; + Range rangeFromIndex(const QModelIndex &sourceIndex) const override; private: CPlusPlus::Symbol *symbolFromIndex(const QModelIndex &index) const; From 52bd5173fbf00428698368d4cf19bb2bf4b0332a Mon Sep 17 00:00:00 2001 From: Ivan Donchevskii Date: Fri, 1 Jun 2018 09:22:03 +0200 Subject: [PATCH 46/52] Clang: Remove extern and static declarations from symbol outline... ... in case they appear within the function body. Task-number: QTCREATORBUG-20434 Change-Id: I6d12ab857cca5fe8479ac3fb426329ae7d732567 Reviewed-by: Orgad Shaneh Reviewed-by: Nikolai Kosjar --- src/plugins/clangcodemodel/clangoverviewmodel.cpp | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/plugins/clangcodemodel/clangoverviewmodel.cpp b/src/plugins/clangcodemodel/clangoverviewmodel.cpp index 22a2576b716..e7e5671d4b5 100644 --- a/src/plugins/clangcodemodel/clangoverviewmodel.cpp +++ b/src/plugins/clangcodemodel/clangoverviewmodel.cpp @@ -80,6 +80,17 @@ void buildTree(const TokenContainers &containers, if (lexicalParentIndex >= 0 && treeItemCache[lexicalParentIndex]) parent = treeItemCache[lexicalParentIndex]; + if (parent != root + && (container.extraInfo.storageClass == ClangBackEnd::StorageClass::Extern + || container.extraInfo.storageClass == ClangBackEnd::StorageClass::Static)) { + ClangBackEnd::HighlightingType parentType = parent->token.types.mainHighlightingType; + if (parentType == ClangBackEnd::HighlightingType::VirtualFunction + || parentType == ClangBackEnd::HighlightingType::Function) { + // Treat static and extern variables inside a function scope as local variables. + continue; + } + } + parent->appendChild(item.release()); } From 4e4bd4909af55dbb716fae061244eae5577b4054 Mon Sep 17 00:00:00 2001 From: Ivan Donchevskii Date: Fri, 1 Jun 2018 10:46:20 +0200 Subject: [PATCH 47/52] Clang: Use follow symbol result from clang when global fails When built-in code model fails to follow symbol under cursor fall back to the clang result even if it only follows to the decalration. Change-Id: I22d8c5fee6ab7594b1d1b7ce8104414db28383c7 Reviewed-by: Nikolai Kosjar --- src/libs/clangsupport/followsymbolmessage.cpp | 13 ++++- src/libs/clangsupport/followsymbolmessage.h | 51 ++++++++++++++++--- .../clangcodemodel/clangbackendreceiver.cpp | 6 ++- .../clangcodemodel/clangfollowsymbol.cpp | 17 ++++++- src/plugins/cpptools/cppsymbolinfo.h | 1 + .../clangbackend/source/clangfollowsymbol.cpp | 20 +++++--- .../clangbackend/source/clangfollowsymbol.h | 13 ++--- .../source/clangfollowsymboljob.h | 5 +- .../source/clangtranslationunit.cpp | 2 +- .../source/clangtranslationunit.h | 3 +- .../unittest/clangcodemodelserver-test.cpp | 8 ++- .../unit/unittest/clangfollowsymbol-test.cpp | 6 ++- .../unit/unittest/gtest-creator-printing.cpp | 12 ++++- tests/unit/unittest/gtest-creator-printing.h | 2 + 14 files changed, 122 insertions(+), 37 deletions(-) diff --git a/src/libs/clangsupport/followsymbolmessage.cpp b/src/libs/clangsupport/followsymbolmessage.cpp index 93a37b16a0a..22e77ee6d41 100644 --- a/src/libs/clangsupport/followsymbolmessage.cpp +++ b/src/libs/clangsupport/followsymbolmessage.cpp @@ -29,12 +29,23 @@ namespace ClangBackEnd { +QDebug operator<<(QDebug debug, const FollowSymbolResult &result) +{ + debug.nospace() << "FollowSymbolResult(" + << result.range + << ", " << result.isPureDeclarationForUsage; + + debug.nospace() << ")"; + + return debug; +} + QDebug operator<<(QDebug debug, const FollowSymbolMessage &message) { debug.nospace() << "FollowSymbolMessage(" << message.fileContainer << ", " << message.ticketNumber - << ", " << message.sourceRange; + << ", " << message.result; debug.nospace() << ")"; diff --git a/src/libs/clangsupport/followsymbolmessage.h b/src/libs/clangsupport/followsymbolmessage.h index 80b62628fb3..ec113825aeb 100644 --- a/src/libs/clangsupport/followsymbolmessage.h +++ b/src/libs/clangsupport/followsymbolmessage.h @@ -33,15 +33,53 @@ namespace ClangBackEnd { +class FollowSymbolResult +{ +public: + FollowSymbolResult() = default; + FollowSymbolResult(SourceRangeContainer range) + : range(std::move(range)) + {} + FollowSymbolResult(SourceRangeContainer range, bool isPureDeclarationForUsage) + : range(std::move(range)) + , isPureDeclarationForUsage(isPureDeclarationForUsage) + {} + + friend QDataStream &operator<<(QDataStream &out, const FollowSymbolResult &container) + { + out << container.range; + out << container.isPureDeclarationForUsage; + + return out; + } + + friend QDataStream &operator>>(QDataStream &in, FollowSymbolResult &container) + { + in >> container.range; + in >> container.isPureDeclarationForUsage; + + return in; + } + + friend bool operator==(const FollowSymbolResult &first, const FollowSymbolResult &second) + { + return first.range == second.range + && first.isPureDeclarationForUsage == second.isPureDeclarationForUsage; + } + + SourceRangeContainer range; + bool isPureDeclarationForUsage = false; +}; + class FollowSymbolMessage { public: FollowSymbolMessage() = default; FollowSymbolMessage(const FileContainer &fileContainer, - const SourceRangeContainer &range, + const FollowSymbolResult &result, quint64 ticketNumber) : fileContainer(fileContainer) - , sourceRange(range) + , result(result) , ticketNumber(ticketNumber) { } @@ -49,7 +87,7 @@ public: friend QDataStream &operator<<(QDataStream &out, const FollowSymbolMessage &message) { out << message.fileContainer; - out << message.sourceRange; + out << message.result; out << message.ticketNumber; return out; } @@ -57,7 +95,7 @@ public: friend QDataStream &operator>>(QDataStream &in, FollowSymbolMessage &message) { in >> message.fileContainer; - in >> message.sourceRange; + in >> message.result; in >> message.ticketNumber; return in; } @@ -66,15 +104,16 @@ public: { return first.ticketNumber == second.ticketNumber && first.fileContainer == second.fileContainer - && first.sourceRange == second.sourceRange; + && first.result == second.result; } public: FileContainer fileContainer; - SourceRangeContainer sourceRange; + FollowSymbolResult result; quint64 ticketNumber = 0; }; +CLANGSUPPORT_EXPORT QDebug operator<<(QDebug debug, const FollowSymbolResult &result); CLANGSUPPORT_EXPORT QDebug operator<<(QDebug debug, const FollowSymbolMessage &message); DECLARE_MESSAGE(FollowSymbolMessage); diff --git a/src/plugins/clangcodemodel/clangbackendreceiver.cpp b/src/plugins/clangcodemodel/clangbackendreceiver.cpp index 6cb6bafea12..b957ff1b08e 100644 --- a/src/plugins/clangcodemodel/clangbackendreceiver.cpp +++ b/src/plugins/clangcodemodel/clangbackendreceiver.cpp @@ -255,7 +255,7 @@ static CppTools::SymbolInfo toSymbolInfo(const FollowSymbolMessage &message) { CppTools::SymbolInfo result; - const SourceRangeContainer &range = message.sourceRange; + const SourceRangeContainer &range = message.result.range; const SourceLocationContainer &start = range.start; const SourceLocationContainer &end = range.end; @@ -265,6 +265,8 @@ CppTools::SymbolInfo toSymbolInfo(const FollowSymbolMessage &message) result.endColumn = static_cast(end.column); result.fileName = start.filePath; + result.isPureDeclarationForUsage = message.result.isPureDeclarationForUsage; + return result; } @@ -354,7 +356,7 @@ void BackendReceiver::tooltip(const ToolTipMessage &message) void BackendReceiver::followSymbol(const ClangBackEnd::FollowSymbolMessage &message) { qCDebugIpc() << "FollowSymbolMessage with" - << message.sourceRange << "range"; + << message.result; const quint64 ticket = message.ticketNumber; QFutureInterface futureInterface = m_followTable.take(ticket); diff --git a/src/plugins/clangcodemodel/clangfollowsymbol.cpp b/src/plugins/clangcodemodel/clangfollowsymbol.cpp index 2876055706e..e1f33bdf854 100644 --- a/src/plugins/clangcodemodel/clangfollowsymbol.cpp +++ b/src/plugins/clangcodemodel/clangfollowsymbol.cpp @@ -140,6 +140,19 @@ static Utils::Link linkAtCursor(const QTextCursor &cursor, return Link(); } +static ::Utils::ProcessLinkCallback extendedCallback(::Utils::ProcessLinkCallback &&callback, + const CppTools::SymbolInfo &result) +{ + // If globalFollowSymbol finds nothing follow to the declaration. + return [original_callback = std::move(callback), result](const ::Utils::Link &link) { + if (!link.hasValidTarget() && result.isPureDeclarationForUsage) { + return original_callback(::Utils::Link(result.fileName, result.startLine, + result.startColumn - 1)); + } + return original_callback(link); + }; +} + void ClangFollowSymbol::findLink(const CppTools::CursorInEditor &data, ::Utils::ProcessLinkCallback &&processLinkCallback, bool resolveTarget, @@ -185,11 +198,11 @@ void ClangFollowSymbol::findLink(const CppTools::CursorInEditor &data, return callback(Utils::Link()); CppTools::SymbolInfo result = m_watcher->result(); // We did not fail but the result is empty - if (result.fileName.isEmpty()) { + if (result.fileName.isEmpty() || result.isPureDeclarationForUsage) { const CppTools::RefactoringEngineInterface &refactoringEngine = *CppTools::CppModelManager::instance(); refactoringEngine.globalFollowSymbol(data, - std::move(callback), + extendedCallback(std::move(callback), result), snapshot, documentFromSemanticInfo, symbolFinder, diff --git a/src/plugins/cpptools/cppsymbolinfo.h b/src/plugins/cpptools/cppsymbolinfo.h index dcd00dd3c21..38edec11b3c 100644 --- a/src/plugins/cpptools/cppsymbolinfo.h +++ b/src/plugins/cpptools/cppsymbolinfo.h @@ -39,6 +39,7 @@ public: int endLine = 0; int endColumn = 0; QString fileName; + bool isPureDeclarationForUsage = false; }; } // namespace CppTools diff --git a/src/tools/clangbackend/source/clangfollowsymbol.cpp b/src/tools/clangbackend/source/clangfollowsymbol.cpp index 2d8b7004ebe..a0a25182f16 100644 --- a/src/tools/clangbackend/source/clangfollowsymbol.cpp +++ b/src/tools/clangbackend/source/clangfollowsymbol.cpp @@ -146,10 +146,10 @@ static int getTokenIndex(CXTranslationUnit tu, const Tokens &tokens, uint line, return tokenIndex; } -SourceRangeContainer FollowSymbol::followSymbol(CXTranslationUnit tu, - const Cursor &fullCursor, - uint line, - uint column) +FollowSymbolResult FollowSymbol::followSymbol(CXTranslationUnit tu, + const Cursor &fullCursor, + uint line, + uint column) { std::unique_ptr tokens(new Tokens(fullCursor)); @@ -175,7 +175,7 @@ SourceRangeContainer FollowSymbol::followSymbol(CXTranslationUnit tu, CXFile file = clang_getIncludedFile(cursors[tokenIndex]); const ClangString filename(clang_getFileName(file)); const SourceLocation loc(tu, filename, 1, 1); - return SourceRange(loc, loc); + return SourceRangeContainer(SourceRange(loc, loc)); } // For definitions we can always find a declaration in current TU @@ -185,12 +185,16 @@ SourceRangeContainer FollowSymbol::followSymbol(CXTranslationUnit tu, if (!cursor.isDeclaration()) { // This is the symbol usage // We want to return definition + FollowSymbolResult result; cursor = cursor.referenced(); - if (cursor.isNull() || !cursor.isDefinition()) { - // We can't find definition in this TU + if (cursor.isNull()) return SourceRangeContainer(); + if (!cursor.isDefinition()) { + // We can't find definition in this TU + result.isPureDeclarationForUsage = true; } - return extractMatchingTokenRange(cursor, tokenSpelling); + result.range = extractMatchingTokenRange(cursor, tokenSpelling); + return result; } cursor = cursor.definition(); diff --git a/src/tools/clangbackend/source/clangfollowsymbol.h b/src/tools/clangbackend/source/clangfollowsymbol.h index 07db59a836f..7c5469ef665 100644 --- a/src/tools/clangbackend/source/clangfollowsymbol.h +++ b/src/tools/clangbackend/source/clangfollowsymbol.h @@ -33,17 +33,18 @@ class Utf8String; namespace ClangBackEnd { -class Cursor; -class SourceRangeContainer; class CommandLineArguments; +class Cursor; +class FollowSymbolResult; +class SourceRangeContainer; class FollowSymbol { public: - static SourceRangeContainer followSymbol(CXTranslationUnit tu, - const Cursor &fullCursor, - uint line, - uint column); + static FollowSymbolResult followSymbol(CXTranslationUnit tu, + const Cursor &fullCursor, + uint line, + uint column); }; } // namespace ClangBackEnd diff --git a/src/tools/clangbackend/source/clangfollowsymboljob.h b/src/tools/clangbackend/source/clangfollowsymboljob.h index 3a8741db1c6..5e625f97d49 100644 --- a/src/tools/clangbackend/source/clangfollowsymboljob.h +++ b/src/tools/clangbackend/source/clangfollowsymboljob.h @@ -27,14 +27,15 @@ #include "clangdocumentjob.h" +#include #include namespace ClangBackEnd { -class FollowSymbolJob : public DocumentJob +class FollowSymbolJob : public DocumentJob { public: - using AsyncResult = SourceRangeContainer; + using AsyncResult = FollowSymbolResult; AsyncPrepareResult prepareAsyncRun() override; void finalizeAsyncRun() override; diff --git a/src/tools/clangbackend/source/clangtranslationunit.cpp b/src/tools/clangbackend/source/clangtranslationunit.cpp index f0bbc789347..4720f657918 100644 --- a/src/tools/clangbackend/source/clangtranslationunit.cpp +++ b/src/tools/clangbackend/source/clangtranslationunit.cpp @@ -269,7 +269,7 @@ void TranslationUnit::extractDiagnostics(DiagnosticContainer &firstHeaderErrorDi } } -SourceRangeContainer TranslationUnit::followSymbol(uint line, uint column) const +FollowSymbolResult TranslationUnit::followSymbol(uint line, uint column) const { return FollowSymbol::followSymbol(m_cxTranslationUnit, cursorAt(line, column), line, column); } diff --git a/src/tools/clangbackend/source/clangtranslationunit.h b/src/tools/clangbackend/source/clangtranslationunit.h index 70df60f5050..175ba2eb584 100644 --- a/src/tools/clangbackend/source/clangtranslationunit.h +++ b/src/tools/clangbackend/source/clangtranslationunit.h @@ -37,6 +37,7 @@ namespace ClangBackEnd { class Cursor; class DiagnosticContainer; class DiagnosticSet; +class FollowSymbolResult; class ReferencesResult; class SkippedSourceRanges; class SourceLocation; @@ -108,7 +109,7 @@ public: TokenProcessor fullTokenInfosInRange(const SourceRange &range) const; SkippedSourceRanges skippedSourceRanges() const; - SourceRangeContainer followSymbol(uint line, uint column) const; + FollowSymbolResult followSymbol(uint line, uint column) const; private: const Utf8String m_id; diff --git a/tests/unit/unittest/clangcodemodelserver-test.cpp b/tests/unit/unittest/clangcodemodelserver-test.cpp index ebcb5dd3d3e..7f88681f320 100644 --- a/tests/unit/unittest/clangcodemodelserver-test.cpp +++ b/tests/unit/unittest/clangcodemodelserver-test.cpp @@ -630,14 +630,12 @@ void ClangCodeModelServer::expectReferences() void ClangCodeModelServer::expectFollowSymbol() { - const ClangBackEnd::SourceRangeContainer classDefinition{ - {filePathC, 40, 7}, - {filePathC, 40, 10} - }; + const ClangBackEnd::FollowSymbolResult classDefinition + = ClangBackEnd::SourceRangeContainer({filePathC, 40, 7}, {filePathC, 40, 10}); EXPECT_CALL(mockClangCodeModelClient, followSymbol( - Field(&FollowSymbolMessage::sourceRange, + Field(&FollowSymbolMessage::result, Eq(classDefinition)))) .Times(1); } diff --git a/tests/unit/unittest/clangfollowsymbol-test.cpp b/tests/unit/unittest/clangfollowsymbol-test.cpp index f42e8e63993..9df7349306c 100644 --- a/tests/unit/unittest/clangfollowsymbol-test.cpp +++ b/tests/unit/unittest/clangfollowsymbol-test.cpp @@ -32,6 +32,7 @@ #include #include #include +#include #include #include #include @@ -55,6 +56,7 @@ using ::ClangBackEnd::Document; using ::ClangBackEnd::UnsavedFiles; using ::ClangBackEnd::ReferencesResult; using ::ClangBackEnd::SourceRangeContainer; +using ::ClangBackEnd::FollowSymbolResult; namespace { const Utf8String sourceFilePath = Utf8StringLiteral(TESTDATA_DIR"/followsymbol_main.cpp"); @@ -131,12 +133,12 @@ public: class FollowSymbol : public ::testing::Test { protected: - SourceRangeContainer followSymbol(uint line, uint column) + FollowSymbolResult followSymbol(uint line, uint column) { return document.translationUnit().followSymbol(line, column); } - SourceRangeContainer followHeaderSymbol(uint line, uint column) + FollowSymbolResult followHeaderSymbol(uint line, uint column) { return headerDocument.translationUnit().followSymbol(line, column); } diff --git a/tests/unit/unittest/gtest-creator-printing.cpp b/tests/unit/unittest/gtest-creator-printing.cpp index c3e02240fe4..3b1a761a80c 100644 --- a/tests/unit/unittest/gtest-creator-printing.cpp +++ b/tests/unit/unittest/gtest-creator-printing.cpp @@ -237,12 +237,22 @@ std::ostream &operator<<(std::ostream &os, const RegisterProjectPartsForEditorMe return os; } +std::ostream &operator<<(std::ostream &os, const FollowSymbolResult &result) +{ + os << "(" + << result.range + << ", " << result.isPureDeclarationForUsage + << ")"; + + return os; +} + std::ostream &operator<<(std::ostream &os, const FollowSymbolMessage &message) { os << "(" << message.fileContainer << ", " << message.ticketNumber << ", " - << message.sourceRange << ", " + << message.result << ", " << ")"; return os; diff --git a/tests/unit/unittest/gtest-creator-printing.h b/tests/unit/unittest/gtest-creator-printing.h index 6404764544b..d809b18b6e6 100644 --- a/tests/unit/unittest/gtest-creator-printing.h +++ b/tests/unit/unittest/gtest-creator-printing.h @@ -105,6 +105,7 @@ class EchoMessage; class DocumentAnnotationsChangedMessage; class ReferencesMessage; class ToolTipMessage; +class FollowSymbolResult; class FollowSymbolMessage; class CompleteCodeMessage; class EndMessage; @@ -177,6 +178,7 @@ std::ostream &operator<<(std::ostream &out, const EchoMessage &message); std::ostream &operator<<(std::ostream &out, const DocumentAnnotationsChangedMessage &message); std::ostream &operator<<(std::ostream &out, const ReferencesMessage &message); std::ostream &operator<<(std::ostream &out, const ToolTipMessage &message); +std::ostream &operator<<(std::ostream &out, const FollowSymbolResult &result); std::ostream &operator<<(std::ostream &out, const FollowSymbolMessage &message); std::ostream &operator<<(std::ostream &out, const CompleteCodeMessage &message); std::ostream &operator<<(std::ostream &out, const EndMessage &message); From f01fbcb789d86116fac5b9d6ef2ed42862e2c944 Mon Sep 17 00:00:00 2001 From: Nikolai Kosjar Date: Thu, 31 May 2018 15:21:53 +0200 Subject: [PATCH 48/52] Clang: Clean up some IPC names This is long overdue since some names were simply wrong and/or misleading. Also, some of the old names were long enough to almost get crazy. The renaming starts from ClangCodeModelServerInterface and ClangCodeModelClientInterface and affects usages and related functions. For the ClangCodeModelServerInterface, categorize the messages in - messages that require a response (request*) - notification messages (the remaining ones) Change-Id: I5342ed8e0d87404ee72f3c3766fd8ef7505defb1 Reviewed-by: Christian Stenger Reviewed-by: Ivan Donchevskii --- .../{cmbalivemessage.cpp => alivemessage.cpp} | 4 +- .../{cmbalivemessage.h => alivemessage.h} | 0 ...ngedmessage.cpp => annotationsmessage.cpp} | 6 +- ...schangedmessage.h => annotationsmessage.h} | 37 +-- .../clangcodemodelclientinterface.cpp | 8 +- .../clangcodemodelclientinterface.h | 32 +- .../clangcodemodelclientmessages.h | 8 +- .../clangcodemodelclientproxy.cpp | 4 +- .../clangsupport/clangcodemodelclientproxy.h | 4 +- .../clangcodemodelserverinterface.cpp | 42 +-- .../clangcodemodelserverinterface.h | 24 +- .../clangcodemodelservermessages.h | 30 +- .../clangcodemodelserverproxy.cpp | 24 +- .../clangsupport/clangcodemodelserverproxy.h | 24 +- .../clangrefactoringclientmessages.h | 2 +- .../clangrefactoringservermessages.h | 2 +- src/libs/clangsupport/clangsupport-lib.pri | 60 ++-- src/libs/clangsupport/clangsupport_global.h | 25 +- ...etedmessage.cpp => completionsmessage.cpp} | 6 +- ...ompletedmessage.h => completionsmessage.h} | 26 +- ...essage.cpp => documentschangedmessage.cpp} | 6 +- ...tormessage.h => documentschangedmessage.h} | 17 +- ...message.cpp => documentsclosedmessage.cpp} | 6 +- ...itormessage.h => documentsclosedmessage.h} | 18 +- ...message.cpp => documentsopenedmessage.cpp} | 6 +- ...itormessage.h => documentsopenedmessage.h} | 26 +- ...p => documentvisibilitychangedmessage.cpp} | 6 +- ...e.h => documentvisibilitychangedmessage.h} | 23 +- .../{cmbechomessage.cpp => echomessage.cpp} | 2 +- .../{cmbechomessage.h => echomessage.h} | 0 .../{cmbendmessage.cpp => endmessage.cpp} | 4 +- .../{cmbendmessage.h => endmessage.h} | 0 src/libs/clangsupport/messageenvelop.cpp | 50 +-- .../clangsupport/pchmanagerclientproxy.cpp | 2 +- .../clangsupport/pchmanagerserverproxy.cpp | 2 +- ...age.cpp => projectpartsremovedmessage.cpp} | 6 +- ...message.h => projectpartsremovedmessage.h} | 17 +- ...age.cpp => projectpartsupdatedmessage.cpp} | 6 +- ...message.h => projectpartsupdatedmessage.h} | 17 +- .../clangsupport/refactoringclientproxy.cpp | 2 +- ...ions.cpp => requestannotationsmessage.cpp} | 6 +- ...otations.h => requestannotationsmessage.h} | 17 +- ...sage.cpp => requestcompletionsmessage.cpp} | 8 +- ...emessage.h => requestcompletionsmessage.h} | 41 +-- ...age.cpp => unsavedfilesremovedmessage.cpp} | 6 +- ...message.h => unsavedfilesremovedmessage.h} | 17 +- ...age.cpp => unsavedfilesupdatedmessage.cpp} | 6 +- ...message.h => unsavedfilesupdatedmessage.h} | 19 +- .../clangbackendcommunicator.cpp | 215 ++++++------ .../clangcodemodel/clangbackendcommunicator.h | 72 ++-- .../clangcodemodel/clangbackendreceiver.cpp | 12 +- .../clangcodemodel/clangbackendreceiver.h | 8 +- .../clangcodemodel/clangbackendsender.cpp | 40 +-- .../clangcodemodel/clangbackendsender.h | 24 +- .../clangcompletionassistprocessor.cpp | 20 +- .../clangeditordocumentprocessor.cpp | 33 +- .../clangeditordocumentprocessor.h | 12 +- .../clangmodelmanagersupport.cpp | 34 +- .../clangcodemodel/clangmodelmanagersupport.h | 2 +- .../source/clangbackendclangipc-source.pri | 12 +- .../source/clangcodemodelserver.cpp | 117 ++++--- .../source/clangcodemodelserver.h | 30 +- .../source/clangcompletecodejob.cpp | 12 +- .../source/clangfollowsymboljob.cpp | 2 +- .../clangbackend/source/clangjobrequest.cpp | 84 +++-- .../clangbackend/source/clangjobrequest.h | 10 +- ...job.cpp => clangrequestannotationsjob.cpp} | 33 +- ...ionsjob.h => clangrequestannotationsjob.h} | 6 +- .../source/clangresumedocumentjob.cpp | 4 +- .../source/clangresumedocumentjob.h | 4 +- .../source/clangtranslationunit.cpp | 2 +- .../source/clangtranslationunit.h | 8 +- ...sjob.cpp => clangupdateannotationsjob.cpp} | 37 +-- ...tionsjob.h => clangupdateannotationsjob.h} | 6 +- ...cpp => clangupdateextraannotationsjob.cpp} | 13 +- ...job.h => clangupdateextraannotationsjob.h} | 4 +- .../echoserver/echoclangcodemodelserver.cpp | 20 +- .../echoserver/echoclangcodemodelserver.h | 24 +- .../unittest/clangcodemodelserver-test.cpp | 307 +++++++++--------- .../unittest/clangcompletecodejob-test.cpp | 10 +- .../unittest/clangdocumentprocessor-test.cpp | 2 +- .../unittest/clangdocumentprocessors-test.cpp | 2 +- tests/unit/unittest/clangjobqueue-test.cpp | 82 ++--- tests/unit/unittest/clangjobs-test.cpp | 10 +- ...pp => clangrequestannotationsjob-test.cpp} | 20 +- .../unittest/clangresumedocumentjob-test.cpp | 2 +- ...cpp => clangupdateannotationsjob-test.cpp} | 28 +- .../unittest/clientserverinprocess-test.cpp | 111 +++---- .../clientserveroutsideprocess-test.cpp | 40 +-- tests/unit/unittest/dummyclangipcclient.h | 4 +- .../unit/unittest/gtest-creator-printing.cpp | 30 +- tests/unit/unittest/gtest-creator-printing.h | 48 +-- .../unit/unittest/mockclangcodemodelclient.h | 8 +- .../unit/unittest/mockclangcodemodelserver.h | 45 +-- .../readandwritemessageblock-test.cpp | 66 ++-- tests/unit/unittest/unittest.pro | 4 +- 96 files changed, 1229 insertions(+), 1194 deletions(-) rename src/libs/clangsupport/{cmbalivemessage.cpp => alivemessage.cpp} (96%) rename src/libs/clangsupport/{cmbalivemessage.h => alivemessage.h} (100%) rename src/libs/clangsupport/{documentannotationschangedmessage.cpp => annotationsmessage.cpp} (89%) rename src/libs/clangsupport/{documentannotationschangedmessage.h => annotationsmessage.h} (68%) rename src/libs/clangsupport/{cmbcodecompletedmessage.cpp => completionsmessage.cpp} (92%) rename src/libs/clangsupport/{cmbcodecompletedmessage.h => completionsmessage.h} (73%) rename src/libs/clangsupport/{registerunsavedfilesforeditormessage.cpp => documentschangedmessage.cpp} (87%) rename src/libs/clangsupport/{registerunsavedfilesforeditormessage.h => documentschangedmessage.h} (70%) rename src/libs/clangsupport/{cmbunregistertranslationunitsforeditormessage.cpp => documentsclosedmessage.cpp} (86%) rename src/libs/clangsupport/{updatetranslationunitsforeditormessage.h => documentsclosedmessage.h} (70%) rename src/libs/clangsupport/{cmbregistertranslationunitsforeditormessage.cpp => documentsopenedmessage.cpp} (88%) rename src/libs/clangsupport/{cmbregistertranslationunitsforeditormessage.h => documentsopenedmessage.h} (66%) rename src/libs/clangsupport/{updatevisibletranslationunitsmessage.cpp => documentvisibilitychangedmessage.cpp} (88%) rename src/libs/clangsupport/{updatevisibletranslationunitsmessage.h => documentvisibilitychangedmessage.h} (68%) rename src/libs/clangsupport/{cmbechomessage.cpp => echomessage.cpp} (98%) rename src/libs/clangsupport/{cmbechomessage.h => echomessage.h} (100%) rename src/libs/clangsupport/{cmbendmessage.cpp => endmessage.cpp} (96%) rename src/libs/clangsupport/{cmbendmessage.h => endmessage.h} (100%) rename src/libs/clangsupport/{cmbunregisterprojectsforeditormessage.cpp => projectpartsremovedmessage.cpp} (87%) rename src/libs/clangsupport/{cmbunregisterprojectsforeditormessage.h => projectpartsremovedmessage.h} (70%) rename src/libs/clangsupport/{cmbregisterprojectsforeditormessage.cpp => projectpartsupdatedmessage.cpp} (88%) rename src/libs/clangsupport/{cmbregisterprojectsforeditormessage.h => projectpartsupdatedmessage.h} (71%) rename src/libs/clangsupport/{requestdocumentannotations.cpp => requestannotationsmessage.cpp} (88%) rename src/libs/clangsupport/{requestdocumentannotations.h => requestannotationsmessage.h} (77%) rename src/libs/clangsupport/{cmbcompletecodemessage.cpp => requestcompletionsmessage.cpp} (88%) rename src/libs/clangsupport/{cmbcompletecodemessage.h => requestcompletionsmessage.h} (70%) rename src/libs/clangsupport/{updatetranslationunitsforeditormessage.cpp => unsavedfilesremovedmessage.cpp} (87%) rename src/libs/clangsupport/{unregisterunsavedfilesforeditormessage.h => unsavedfilesremovedmessage.h} (70%) rename src/libs/clangsupport/{unregisterunsavedfilesforeditormessage.cpp => unsavedfilesupdatedmessage.cpp} (87%) rename src/libs/clangsupport/{cmbunregistertranslationunitsforeditormessage.h => unsavedfilesupdatedmessage.h} (68%) rename src/tools/clangbackend/source/{clangrequestdocumentannotationsjob.cpp => clangrequestannotationsjob.cpp} (60%) rename src/tools/clangbackend/source/{clangrequestdocumentannotationsjob.h => clangrequestannotationsjob.h} (89%) rename src/tools/clangbackend/source/{clangupdatedocumentannotationsjob.cpp => clangupdateannotationsjob.cpp} (62%) rename src/tools/clangbackend/source/{clangupdatedocumentannotationsjob.h => clangupdateannotationsjob.h} (91%) rename src/tools/clangbackend/source/{clangupdateextradocumentannotationsjob.cpp => clangupdateextraannotationsjob.cpp} (79%) rename src/tools/clangbackend/source/{clangupdateextradocumentannotationsjob.h => clangupdateextraannotationsjob.h} (88%) rename tests/unit/unittest/{clangrequestdocumentannotationsjob-test.cpp => clangrequestannotationsjob-test.cpp} (74%) rename tests/unit/unittest/{clangupdatedocumentannotationsjob-test.cpp => clangupdateannotationsjob-test.cpp} (73%) diff --git a/src/libs/clangsupport/cmbalivemessage.cpp b/src/libs/clangsupport/alivemessage.cpp similarity index 96% rename from src/libs/clangsupport/cmbalivemessage.cpp rename to src/libs/clangsupport/alivemessage.cpp index 72a4d37bea6..99392fc0fde 100644 --- a/src/libs/clangsupport/cmbalivemessage.cpp +++ b/src/libs/clangsupport/alivemessage.cpp @@ -23,7 +23,7 @@ ** ****************************************************************************/ -#include "cmbalivemessage.h" +#include "alivemessage.h" #include @@ -34,4 +34,4 @@ QDebug operator<<(QDebug debug, const AliveMessage &/*message*/) return debug.nospace() << "AliveMessage()"; } -} +} // namespace ClangBackEnd diff --git a/src/libs/clangsupport/cmbalivemessage.h b/src/libs/clangsupport/alivemessage.h similarity index 100% rename from src/libs/clangsupport/cmbalivemessage.h rename to src/libs/clangsupport/alivemessage.h diff --git a/src/libs/clangsupport/documentannotationschangedmessage.cpp b/src/libs/clangsupport/annotationsmessage.cpp similarity index 89% rename from src/libs/clangsupport/documentannotationschangedmessage.cpp rename to src/libs/clangsupport/annotationsmessage.cpp index 90344e24435..65349f6801e 100644 --- a/src/libs/clangsupport/documentannotationschangedmessage.cpp +++ b/src/libs/clangsupport/annotationsmessage.cpp @@ -23,15 +23,15 @@ ** ****************************************************************************/ -#include "documentannotationschangedmessage.h" +#include "annotationsmessage.h" #include namespace ClangBackEnd { -QDebug operator<<(QDebug debug, const DocumentAnnotationsChangedMessage &message) +QDebug operator<<(QDebug debug, const AnnotationsMessage &message) { - debug.nospace() << "DocumentAnnotationsChangedMessage(" + debug.nospace() << "AnnotationsMessage(" << message.fileContainer << ", " << message.diagnostics.size() << ", " << !message.firstHeaderErrorDiagnostic.text.isEmpty() diff --git a/src/libs/clangsupport/documentannotationschangedmessage.h b/src/libs/clangsupport/annotationsmessage.h similarity index 68% rename from src/libs/clangsupport/documentannotationschangedmessage.h rename to src/libs/clangsupport/annotationsmessage.h index b5006cb2267..c3a19a82b4f 100644 --- a/src/libs/clangsupport/documentannotationschangedmessage.h +++ b/src/libs/clangsupport/annotationsmessage.h @@ -35,32 +35,32 @@ namespace ClangBackEnd { -class CLANGSUPPORT_EXPORT DocumentAnnotationsChangedMessage +class CLANGSUPPORT_EXPORT AnnotationsMessage { public: - DocumentAnnotationsChangedMessage() = default; + AnnotationsMessage() = default; // For pure token infos update - DocumentAnnotationsChangedMessage(const FileContainer &fileContainer, + AnnotationsMessage(const FileContainer &fileContainer, const QVector &tokenInfos) : fileContainer(fileContainer), tokenInfos(tokenInfos), onlyTokenInfos(true) { } - DocumentAnnotationsChangedMessage(const FileContainer &fileContainer, - const QVector &diagnostics, - const DiagnosticContainer &firstHeaderErrorDiagnostic, - const QVector &tokenInfos, - const QVector &skippedPreprocessorRanges) - : fileContainer(fileContainer), - tokenInfos(tokenInfos), - diagnostics(diagnostics), - firstHeaderErrorDiagnostic(firstHeaderErrorDiagnostic), - skippedPreprocessorRanges(skippedPreprocessorRanges) + AnnotationsMessage(const FileContainer &fileContainer, + const QVector &diagnostics, + const DiagnosticContainer &firstHeaderErrorDiagnostic, + const QVector &tokenInfos, + const QVector &skippedPreprocessorRanges) + : fileContainer(fileContainer) + , tokenInfos(tokenInfos) + , diagnostics(diagnostics) + , firstHeaderErrorDiagnostic(firstHeaderErrorDiagnostic) + , skippedPreprocessorRanges(skippedPreprocessorRanges) { } - friend QDataStream &operator<<(QDataStream &out, const DocumentAnnotationsChangedMessage &message) + friend QDataStream &operator<<(QDataStream &out, const AnnotationsMessage &message) { out << message.onlyTokenInfos; out << message.fileContainer; @@ -74,7 +74,7 @@ public: return out; } - friend QDataStream &operator>>(QDataStream &in, DocumentAnnotationsChangedMessage &message) + friend QDataStream &operator>>(QDataStream &in, AnnotationsMessage &message) { in >> message.onlyTokenInfos; in >> message.fileContainer; @@ -88,8 +88,7 @@ public: return in; } - friend bool operator==(const DocumentAnnotationsChangedMessage &first, - const DocumentAnnotationsChangedMessage &second) + friend bool operator==(const AnnotationsMessage &first, const AnnotationsMessage &second) { return first.fileContainer == second.fileContainer && first.diagnostics == second.diagnostics @@ -107,7 +106,7 @@ public: bool onlyTokenInfos = false; }; -CLANGSUPPORT_EXPORT QDebug operator<<(QDebug debug, const DocumentAnnotationsChangedMessage &message); +CLANGSUPPORT_EXPORT QDebug operator<<(QDebug debug, const AnnotationsMessage &message); -DECLARE_MESSAGE(DocumentAnnotationsChangedMessage) +DECLARE_MESSAGE(AnnotationsMessage) } // namespace ClangBackEnd diff --git a/src/libs/clangsupport/clangcodemodelclientinterface.cpp b/src/libs/clangsupport/clangcodemodelclientinterface.cpp index 492ea7896fe..5093308fa20 100644 --- a/src/libs/clangsupport/clangcodemodelclientinterface.cpp +++ b/src/libs/clangsupport/clangcodemodelclientinterface.cpp @@ -41,11 +41,11 @@ void ClangCodeModelClientInterface::dispatch(const MessageEnvelop &messageEnvelo case MessageType::EchoMessage: echo(messageEnvelop.message()); break; - case MessageType::CodeCompletedMessage: - codeCompleted(messageEnvelop.message()); + case MessageType::CompletionsMessage: + completions(messageEnvelop.message()); break; - case MessageType::DocumentAnnotationsChangedMessage: - documentAnnotationsChanged(messageEnvelop.message()); + case MessageType::AnnotationsMessage: + annotations(messageEnvelop.message()); break; case MessageType::ReferencesMessage: references(messageEnvelop.message()); diff --git a/src/libs/clangsupport/clangcodemodelclientinterface.h b/src/libs/clangsupport/clangcodemodelclientinterface.h index 915bc8bf1fe..04b68ce0f50 100644 --- a/src/libs/clangsupport/clangcodemodelclientinterface.h +++ b/src/libs/clangsupport/clangcodemodelclientinterface.h @@ -31,25 +31,25 @@ namespace ClangBackEnd { class ClangCodeModelServerInterface; -class CodeCompletedMessage; -class CompleteCodeMessage; -class DocumentAnnotationsChangedMessage; +class AnnotationsMessage; +class CompletionsMessage; +class DocumentVisibilityChangedMessage; +class DocumentsChangedMessage; +class DocumentsClosedMessage; +class DocumentsOpenedMessage; class EchoMessage; -class ReferencesMessage; class FollowSymbolMessage; -class RegisterProjectPartsForEditorMessage; -class RegisterTranslationUnitForEditorMessage; -class RegisterUnsavedFilesForEditorMessage; -class RequestDocumentAnnotationsMessage; -class RequestReferencesMessage; +class ProjectPartsRemovedMessage; +class ProjectPartsUpdatedMessage; +class ReferencesMessage; +class RequestAnnotationsMessage; +class RequestCompletionsMessage; class RequestFollowSymbolMessage; +class RequestReferencesMessage; class RequestToolTipMessage; class ToolTipMessage; -class UnregisterProjectPartsForEditorMessage; -class UnregisterTranslationUnitsForEditorMessage; -class UnregisterUnsavedFilesForEditorMessage; -class UpdateTranslationUnitsForEditorMessage; -class UpdateVisibleTranslationUnitsMessage; +class UnsavedFilesRemovedMessage; +class UnsavedFilesUpdatedMessage; class CLANGSUPPORT_EXPORT ClangCodeModelClientInterface : public IpcClientInterface { @@ -58,8 +58,8 @@ public: virtual void alive() = 0; virtual void echo(const EchoMessage &message) = 0; - virtual void codeCompleted(const CodeCompletedMessage &message) = 0; - virtual void documentAnnotationsChanged(const DocumentAnnotationsChangedMessage &message) = 0; + virtual void completions(const CompletionsMessage &message) = 0; + virtual void annotations(const AnnotationsMessage &message) = 0; virtual void references(const ReferencesMessage &message) = 0; virtual void followSymbol(const FollowSymbolMessage &message) = 0; virtual void tooltip(const ToolTipMessage &message) = 0; diff --git a/src/libs/clangsupport/clangcodemodelclientmessages.h b/src/libs/clangsupport/clangcodemodelclientmessages.h index 2903cda2079..e73f4b99af1 100644 --- a/src/libs/clangsupport/clangcodemodelclientmessages.h +++ b/src/libs/clangsupport/clangcodemodelclientmessages.h @@ -25,10 +25,10 @@ #pragma once -#include "cmbalivemessage.h" -#include "cmbcodecompletedmessage.h" -#include "cmbechomessage.h" -#include "documentannotationschangedmessage.h" +#include "alivemessage.h" +#include "completionsmessage.h" +#include "echomessage.h" +#include "annotationsmessage.h" #include "referencesmessage.h" #include "followsymbolmessage.h" #include "tooltipmessage.h" diff --git a/src/libs/clangsupport/clangcodemodelclientproxy.cpp b/src/libs/clangsupport/clangcodemodelclientproxy.cpp index fc75a226ed5..538677e6c1c 100644 --- a/src/libs/clangsupport/clangcodemodelclientproxy.cpp +++ b/src/libs/clangsupport/clangcodemodelclientproxy.cpp @@ -75,12 +75,12 @@ void ClangCodeModelClientProxy::echo(const EchoMessage &message) m_writeMessageBlock.write(message); } -void ClangCodeModelClientProxy::codeCompleted(const CodeCompletedMessage &message) +void ClangCodeModelClientProxy::completions(const CompletionsMessage &message) { m_writeMessageBlock.write(message); } -void ClangCodeModelClientProxy::documentAnnotationsChanged(const DocumentAnnotationsChangedMessage &message) +void ClangCodeModelClientProxy::annotations(const AnnotationsMessage &message) { m_writeMessageBlock.write(message); } diff --git a/src/libs/clangsupport/clangcodemodelclientproxy.h b/src/libs/clangsupport/clangcodemodelclientproxy.h index 58b87a05d8b..480cbe646e1 100644 --- a/src/libs/clangsupport/clangcodemodelclientproxy.h +++ b/src/libs/clangsupport/clangcodemodelclientproxy.h @@ -53,8 +53,8 @@ public: void alive() override; void echo(const EchoMessage &message) override; - void codeCompleted(const CodeCompletedMessage &message) override; - void documentAnnotationsChanged(const DocumentAnnotationsChangedMessage &message) override; + void completions(const CompletionsMessage &message) override; + void annotations(const AnnotationsMessage &message) override; void references(const ReferencesMessage &message) override; void followSymbol(const FollowSymbolMessage &message) override; void tooltip(const ToolTipMessage &message) override; diff --git a/src/libs/clangsupport/clangcodemodelserverinterface.cpp b/src/libs/clangsupport/clangcodemodelserverinterface.cpp index d50e97367d5..364cec41325 100644 --- a/src/libs/clangsupport/clangcodemodelserverinterface.cpp +++ b/src/libs/clangsupport/clangcodemodelserverinterface.cpp @@ -38,32 +38,35 @@ void ClangCodeModelServerInterface::dispatch(const MessageEnvelop &messageEnvelo case MessageType::EndMessage: end(); break; - case MessageType::RegisterTranslationUnitForEditorMessage: - registerTranslationUnitsForEditor(messageEnvelop.message()); + case MessageType::DocumentsOpenedMessage: + documentsOpened(messageEnvelop.message()); break; - case MessageType::UpdateTranslationUnitsForEditorMessage: - updateTranslationUnitsForEditor(messageEnvelop.message()); + case MessageType::DocumentsChangedMessage: + documentsChanged(messageEnvelop.message()); break; - case MessageType::UnregisterTranslationUnitsForEditorMessage: - unregisterTranslationUnitsForEditor(messageEnvelop.message()); + case MessageType::DocumentsClosedMessage: + documentsClosed(messageEnvelop.message()); break; - case MessageType::RegisterProjectPartsForEditorMessage: - registerProjectPartsForEditor(messageEnvelop.message()); + case MessageType::DocumentVisibilityChangedMessage: + documentVisibilityChanged(messageEnvelop.message()); break; - case MessageType::UnregisterProjectPartsForEditorMessage: - unregisterProjectPartsForEditor(messageEnvelop.message()); + case MessageType::ProjectPartsUpdatedMessage: + projectPartsUpdated(messageEnvelop.message()); break; - case MessageType::RegisterUnsavedFilesForEditorMessage: - registerUnsavedFilesForEditor(messageEnvelop.message()); + case MessageType::ProjectPartsRemovedMessage: + projectPartsRemoved(messageEnvelop.message()); break; - case MessageType::UnregisterUnsavedFilesForEditorMessage: - unregisterUnsavedFilesForEditor(messageEnvelop.message()); + case MessageType::UnsavedFilesUpdatedMessage: + unsavedFilesUpdated(messageEnvelop.message()); break; - case MessageType::CompleteCodeMessage: - completeCode(messageEnvelop.message()); + case MessageType::UnsavedFilesRemovedMessage: + unsavedFilesRemoved(messageEnvelop.message()); break; - case MessageType::RequestDocumentAnnotationsMessage: - requestDocumentAnnotations(messageEnvelop.message()); + case MessageType::RequestCompletionsMessage: + requestCompletions(messageEnvelop.message()); + break; + case MessageType::RequestAnnotationsMessage: + requestAnnotations(messageEnvelop.message()); break; case MessageType::RequestReferencesMessage: requestReferences(messageEnvelop.message()); @@ -74,9 +77,6 @@ void ClangCodeModelServerInterface::dispatch(const MessageEnvelop &messageEnvelo case MessageType::RequestToolTipMessage: requestToolTip(messageEnvelop.message()); break; - case MessageType::UpdateVisibleTranslationUnitsMessage: - updateVisibleTranslationUnits(messageEnvelop.message()); - break; default: qWarning() << "Unknown ClangCodeModelServerMessage"; } diff --git a/src/libs/clangsupport/clangcodemodelserverinterface.h b/src/libs/clangsupport/clangcodemodelserverinterface.h index ffbeffaeb38..6cac4aea5fb 100644 --- a/src/libs/clangsupport/clangcodemodelserverinterface.h +++ b/src/libs/clangsupport/clangcodemodelserverinterface.h @@ -41,19 +41,23 @@ public: void dispatch(const MessageEnvelop &messageEnvelop) override; virtual void end() = 0; - virtual void registerTranslationUnitsForEditor(const RegisterTranslationUnitForEditorMessage &message) = 0; - virtual void updateTranslationUnitsForEditor(const UpdateTranslationUnitsForEditorMessage &message) = 0; - virtual void unregisterTranslationUnitsForEditor(const UnregisterTranslationUnitsForEditorMessage &message) = 0; - virtual void registerProjectPartsForEditor(const RegisterProjectPartsForEditorMessage &message) = 0; - virtual void unregisterProjectPartsForEditor(const UnregisterProjectPartsForEditorMessage &message) = 0; - virtual void registerUnsavedFilesForEditor(const RegisterUnsavedFilesForEditorMessage &message) = 0; - virtual void unregisterUnsavedFilesForEditor(const UnregisterUnsavedFilesForEditorMessage &message) = 0; - virtual void completeCode(const CompleteCodeMessage &message) = 0; - virtual void requestDocumentAnnotations(const RequestDocumentAnnotationsMessage &message) = 0; + + virtual void documentsOpened(const DocumentsOpenedMessage &message) = 0; + virtual void documentsChanged(const DocumentsChangedMessage &message) = 0; + virtual void documentsClosed(const DocumentsClosedMessage &message) = 0; + virtual void documentVisibilityChanged(const DocumentVisibilityChangedMessage &message) = 0; + + virtual void projectPartsUpdated(const ProjectPartsUpdatedMessage &message) = 0; + virtual void projectPartsRemoved(const ProjectPartsRemovedMessage &message) = 0; + + virtual void unsavedFilesUpdated(const UnsavedFilesUpdatedMessage &message) = 0; + virtual void unsavedFilesRemoved(const UnsavedFilesRemovedMessage &message) = 0; + + virtual void requestCompletions(const RequestCompletionsMessage &message) = 0; + virtual void requestAnnotations(const RequestAnnotationsMessage &message) = 0; virtual void requestReferences(const RequestReferencesMessage &message) = 0; virtual void requestFollowSymbol(const RequestFollowSymbolMessage &message) = 0; virtual void requestToolTip(const RequestToolTipMessage &message) = 0; - virtual void updateVisibleTranslationUnits(const UpdateVisibleTranslationUnitsMessage &message) = 0; }; } // namespace ClangBackEnd diff --git a/src/libs/clangsupport/clangcodemodelservermessages.h b/src/libs/clangsupport/clangcodemodelservermessages.h index 0e577b08ddd..ab3b5c4b4f4 100644 --- a/src/libs/clangsupport/clangcodemodelservermessages.h +++ b/src/libs/clangsupport/clangcodemodelservermessages.h @@ -25,18 +25,22 @@ #pragma once -#include "cmbechomessage.h" -#include "cmbcompletecodemessage.h" -#include "cmbendmessage.h" -#include "cmbregisterprojectsforeditormessage.h" -#include "cmbregistertranslationunitsforeditormessage.h" -#include "cmbunregisterprojectsforeditormessage.h" -#include "cmbunregistertranslationunitsforeditormessage.h" -#include "registerunsavedfilesforeditormessage.h" -#include "requestdocumentannotations.h" -#include "requestreferencesmessage.h" +#include "echomessage.h" +#include "endmessage.h" + +#include "documentsopenedmessage.h" +#include "documentsclosedmessage.h" +#include "documentschangedmessage.h" +#include "documentvisibilitychangedmessage.h" + +#include "projectpartsupdatedmessage.h" +#include "projectpartsremovedmessage.h" + +#include "unsavedfilesupdatedmessage.h" +#include "unsavedfilesremovedmessage.h" + +#include "requestannotationsmessage.h" +#include "requestcompletionsmessage.h" #include "requestfollowsymbolmessage.h" +#include "requestreferencesmessage.h" #include "requesttooltipmessage.h" -#include "unregisterunsavedfilesforeditormessage.h" -#include "updatetranslationunitsforeditormessage.h" -#include "updatevisibletranslationunitsmessage.h" diff --git a/src/libs/clangsupport/clangcodemodelserverproxy.cpp b/src/libs/clangsupport/clangcodemodelserverproxy.cpp index 23a80284802..b5d309d346c 100644 --- a/src/libs/clangsupport/clangcodemodelserverproxy.cpp +++ b/src/libs/clangsupport/clangcodemodelserverproxy.cpp @@ -31,7 +31,8 @@ namespace ClangBackEnd { -ClangCodeModelServerProxy::ClangCodeModelServerProxy(ClangCodeModelClientInterface *client, QIODevice *ioDevice) +ClangCodeModelServerProxy::ClangCodeModelServerProxy(ClangCodeModelClientInterface *client, + QIODevice *ioDevice) : BaseServerProxy(client, ioDevice) { } @@ -41,47 +42,47 @@ void ClangCodeModelServerProxy::end() m_writeMessageBlock.write(EndMessage()); } -void ClangCodeModelServerProxy::registerTranslationUnitsForEditor(const RegisterTranslationUnitForEditorMessage &message) +void ClangCodeModelServerProxy::documentsOpened(const DocumentsOpenedMessage &message) { m_writeMessageBlock.write(message); } -void ClangCodeModelServerProxy::updateTranslationUnitsForEditor(const ClangBackEnd::UpdateTranslationUnitsForEditorMessage &message) +void ClangCodeModelServerProxy::documentsChanged(const DocumentsChangedMessage &message) { m_writeMessageBlock.write(message); } -void ClangCodeModelServerProxy::unregisterTranslationUnitsForEditor(const UnregisterTranslationUnitsForEditorMessage &message) +void ClangCodeModelServerProxy::documentsClosed(const DocumentsClosedMessage &message) { m_writeMessageBlock.write(message); } -void ClangCodeModelServerProxy::registerProjectPartsForEditor(const RegisterProjectPartsForEditorMessage &message) +void ClangCodeModelServerProxy::projectPartsUpdated(const ProjectPartsUpdatedMessage &message) { m_writeMessageBlock.write(message); } -void ClangCodeModelServerProxy::unregisterProjectPartsForEditor(const UnregisterProjectPartsForEditorMessage &message) +void ClangCodeModelServerProxy::projectPartsRemoved(const ProjectPartsRemovedMessage &message) { m_writeMessageBlock.write(message); } -void ClangBackEnd::ClangCodeModelServerProxy::registerUnsavedFilesForEditor(const ClangBackEnd::RegisterUnsavedFilesForEditorMessage &message) +void ClangCodeModelServerProxy::unsavedFilesUpdated(const UnsavedFilesUpdatedMessage &message) { m_writeMessageBlock.write(message); } -void ClangBackEnd::ClangCodeModelServerProxy::unregisterUnsavedFilesForEditor(const ClangBackEnd::UnregisterUnsavedFilesForEditorMessage &message) +void ClangCodeModelServerProxy::unsavedFilesRemoved(const UnsavedFilesRemovedMessage &message) { m_writeMessageBlock.write(message); } -void ClangCodeModelServerProxy::completeCode(const CompleteCodeMessage &message) +void ClangCodeModelServerProxy::requestCompletions(const RequestCompletionsMessage &message) { m_writeMessageBlock.write(message); } -void ClangCodeModelServerProxy::requestDocumentAnnotations(const RequestDocumentAnnotationsMessage &message) +void ClangCodeModelServerProxy::requestAnnotations(const RequestAnnotationsMessage &message) { m_writeMessageBlock.write(message); } @@ -101,7 +102,8 @@ void ClangCodeModelServerProxy::requestToolTip(const RequestToolTipMessage &mess m_writeMessageBlock.write(message); } -void ClangCodeModelServerProxy::updateVisibleTranslationUnits(const UpdateVisibleTranslationUnitsMessage &message) +void ClangCodeModelServerProxy::documentVisibilityChanged( + const DocumentVisibilityChangedMessage &message) { m_writeMessageBlock.write(message); } diff --git a/src/libs/clangsupport/clangcodemodelserverproxy.h b/src/libs/clangsupport/clangcodemodelserverproxy.h index 62ea90eebe2..fe574fccd75 100644 --- a/src/libs/clangsupport/clangcodemodelserverproxy.h +++ b/src/libs/clangsupport/clangcodemodelserverproxy.h @@ -49,19 +49,23 @@ public: ClangCodeModelServerProxy(ClangCodeModelClientInterface *client, QIODevice *ioDevice); void end() override; - void registerTranslationUnitsForEditor(const RegisterTranslationUnitForEditorMessage &message) override; - void updateTranslationUnitsForEditor(const UpdateTranslationUnitsForEditorMessage &message) override; - void unregisterTranslationUnitsForEditor(const UnregisterTranslationUnitsForEditorMessage &message) override; - void registerProjectPartsForEditor(const RegisterProjectPartsForEditorMessage &message) override; - void unregisterProjectPartsForEditor(const UnregisterProjectPartsForEditorMessage &message) override; - void registerUnsavedFilesForEditor(const RegisterUnsavedFilesForEditorMessage &message) override; - void unregisterUnsavedFilesForEditor(const UnregisterUnsavedFilesForEditorMessage &message) override; - void completeCode(const CompleteCodeMessage &message) override; - void requestDocumentAnnotations(const RequestDocumentAnnotationsMessage &message) override; + + void documentsOpened(const DocumentsOpenedMessage &message) override; + void documentsChanged(const DocumentsChangedMessage &message) override; + void documentsClosed(const DocumentsClosedMessage &message) override; + void documentVisibilityChanged(const DocumentVisibilityChangedMessage &message) override; + + void projectPartsUpdated(const ProjectPartsUpdatedMessage &message) override; + void projectPartsRemoved(const ProjectPartsRemovedMessage &message) override; + + void unsavedFilesUpdated(const UnsavedFilesUpdatedMessage &message) override; + void unsavedFilesRemoved(const UnsavedFilesRemovedMessage &message) override; + + void requestCompletions(const RequestCompletionsMessage &message) override; + void requestAnnotations(const RequestAnnotationsMessage &message) override; void requestReferences(const RequestReferencesMessage &message) override; void requestFollowSymbol(const RequestFollowSymbolMessage &message) override; void requestToolTip(const RequestToolTipMessage &message) override; - void updateVisibleTranslationUnits(const UpdateVisibleTranslationUnitsMessage &message) override; }; } // namespace ClangBackEnd diff --git a/src/libs/clangsupport/clangrefactoringclientmessages.h b/src/libs/clangsupport/clangrefactoringclientmessages.h index 7b90453540a..18c070695a9 100644 --- a/src/libs/clangsupport/clangrefactoringclientmessages.h +++ b/src/libs/clangsupport/clangrefactoringclientmessages.h @@ -28,4 +28,4 @@ #include "sourcelocationsforrenamingmessage.h" #include "sourcerangesanddiagnosticsforquerymessage.h" #include "sourcerangesforquerymessage.h" -#include "cmbalivemessage.h" +#include "alivemessage.h" diff --git a/src/libs/clangsupport/clangrefactoringservermessages.h b/src/libs/clangsupport/clangrefactoringservermessages.h index 1f7866444b1..cdcc309c2d8 100644 --- a/src/libs/clangsupport/clangrefactoringservermessages.h +++ b/src/libs/clangsupport/clangrefactoringservermessages.h @@ -26,7 +26,7 @@ #pragma once #include "cancelmessage.h" -#include "cmbendmessage.h" +#include "endmessage.h" #include "requestsourcelocationforrenamingmessage.h" #include "requestsourcerangesanddiagnosticsforquerymessage.h" #include "requestsourcerangesforquerymessage.h" diff --git a/src/libs/clangsupport/clangsupport-lib.pri b/src/libs/clangsupport/clangsupport-lib.pri index 501e9fbfb94..857bc39ddd0 100644 --- a/src/libs/clangsupport/clangsupport-lib.pri +++ b/src/libs/clangsupport/clangsupport-lib.pri @@ -16,21 +16,21 @@ SOURCES += \ $$PWD/clangcodemodelconnectionclient.cpp \ $$PWD/clangcodemodelserverinterface.cpp \ $$PWD/clangcodemodelserverproxy.cpp \ - $$PWD/cmbalivemessage.cpp \ - $$PWD/cmbcodecompletedmessage.cpp \ - $$PWD/cmbcompletecodemessage.cpp \ - $$PWD/cmbechomessage.cpp \ - $$PWD/cmbendmessage.cpp \ - $$PWD/cmbregisterprojectsforeditormessage.cpp \ - $$PWD/cmbregistertranslationunitsforeditormessage.cpp \ - $$PWD/cmbunregisterprojectsforeditormessage.cpp \ - $$PWD/cmbunregistertranslationunitsforeditormessage.cpp \ + $$PWD/alivemessage.cpp \ + $$PWD/completionsmessage.cpp \ + $$PWD/requestcompletionsmessage.cpp \ + $$PWD/echomessage.cpp \ + $$PWD/endmessage.cpp \ + $$PWD/projectpartsupdatedmessage.cpp \ + $$PWD/documentsopenedmessage.cpp \ + $$PWD/projectpartsremovedmessage.cpp \ + $$PWD/documentsclosedmessage.cpp \ $$PWD/codecompletionchunk.cpp \ $$PWD/codecompletion.cpp \ $$PWD/connectionclient.cpp \ $$PWD/connectionserver.cpp \ $$PWD/diagnosticcontainer.cpp \ - $$PWD/documentannotationschangedmessage.cpp \ + $$PWD/annotationsmessage.cpp \ $$PWD/dynamicastmatcherdiagnosticcontainer.cpp \ $$PWD/dynamicastmatcherdiagnosticcontextcontainer.cpp \ $$PWD/dynamicastmatcherdiagnosticmessagecontainer.cpp \ @@ -55,9 +55,9 @@ SOURCES += \ $$PWD/refactoringserverinterface.cpp \ $$PWD/refactoringserverproxy.cpp \ $$PWD/referencesmessage.cpp \ - $$PWD/registerunsavedfilesforeditormessage.cpp \ + $$PWD/unsavedfilesupdatedmessage.cpp \ $$PWD/removeprojectpartsmessage.cpp \ - $$PWD/requestdocumentannotations.cpp \ + $$PWD/requestannotationsmessage.cpp \ $$PWD/requestfollowsymbolmessage.cpp \ $$PWD/requestreferencesmessage.cpp \ $$PWD/requestsourcelocationforrenamingmessage.cpp \ @@ -80,10 +80,10 @@ SOURCES += \ $$PWD/tokeninfocontainer.cpp \ $$PWD/tooltipmessage.cpp \ $$PWD/tooltipinfo.cpp \ - $$PWD/unregisterunsavedfilesforeditormessage.cpp \ + $$PWD/unsavedfilesremovedmessage.cpp \ $$PWD/updateprojectpartsmessage.cpp \ - $$PWD/updatetranslationunitsforeditormessage.cpp \ - $$PWD/updatevisibletranslationunitsmessage.cpp \ + $$PWD/documentschangedmessage.cpp \ + $$PWD/documentvisibilitychangedmessage.cpp \ $$PWD/writemessageblock.cpp \ $$PWD/filepathcaching.cpp \ $$PWD/filepathid.cpp \ @@ -106,21 +106,21 @@ HEADERS += \ $$PWD/clangrefactoringclientmessages.h \ $$PWD/clangrefactoringmessages.h \ $$PWD/clangrefactoringservermessages.h \ - $$PWD/cmbalivemessage.h \ - $$PWD/cmbcodecompletedmessage.h \ - $$PWD/cmbcompletecodemessage.h \ - $$PWD/cmbechomessage.h \ - $$PWD/cmbendmessage.h \ - $$PWD/cmbregisterprojectsforeditormessage.h \ - $$PWD/cmbregistertranslationunitsforeditormessage.h \ - $$PWD/cmbunregisterprojectsforeditormessage.h \ - $$PWD/cmbunregistertranslationunitsforeditormessage.h \ + $$PWD/alivemessage.h \ + $$PWD/completionsmessage.h \ + $$PWD/requestcompletionsmessage.h \ + $$PWD/echomessage.h \ + $$PWD/endmessage.h \ + $$PWD/projectpartsupdatedmessage.h \ + $$PWD/documentsopenedmessage.h \ + $$PWD/projectpartsremovedmessage.h \ + $$PWD/documentsclosedmessage.h \ $$PWD/codecompletionchunk.h \ $$PWD/codecompletion.h \ $$PWD/connectionclient.h \ $$PWD/connectionserver.h \ $$PWD/diagnosticcontainer.h \ - $$PWD/documentannotationschangedmessage.h \ + $$PWD/annotationsmessage.h \ $$PWD/dynamicastmatcherdiagnosticcontainer.h \ $$PWD/dynamicastmatcherdiagnosticcontextcontainer.h \ $$PWD/dynamicastmatcherdiagnosticmessagecontainer.h \ @@ -149,9 +149,9 @@ HEADERS += \ $$PWD/refactoringserverinterface.h \ $$PWD/refactoringserverproxy.h \ $$PWD/referencesmessage.h \ - $$PWD/registerunsavedfilesforeditormessage.h \ + $$PWD/unsavedfilesupdatedmessage.h \ $$PWD/removeprojectpartsmessage.h \ - $$PWD/requestdocumentannotations.h \ + $$PWD/requestannotationsmessage.h \ $$PWD/requestfollowsymbolmessage.h \ $$PWD/requestreferencesmessage.h \ $$PWD/requestsourcelocationforrenamingmessage.h \ @@ -177,10 +177,10 @@ HEADERS += \ $$PWD/tokeninfocontainer.h \ $$PWD/tooltipmessage.h \ $$PWD/tooltipinfo.h \ - $$PWD/unregisterunsavedfilesforeditormessage.h \ + $$PWD/unsavedfilesremovedmessage.h \ $$PWD/updateprojectpartsmessage.h \ - $$PWD/updatetranslationunitsforeditormessage.h \ - $$PWD/updatevisibletranslationunitsmessage.h \ + $$PWD/documentschangedmessage.h \ + $$PWD/documentvisibilitychangedmessage.h \ $$PWD/writemessageblock.h \ $$PWD/ipcclientprovider.h \ $$PWD/requestsourcerangesforquerymessage.h \ diff --git a/src/libs/clangsupport/clangsupport_global.h b/src/libs/clangsupport/clangsupport_global.h index 8c5b5f57b80..def7cea41c0 100644 --- a/src/libs/clangsupport/clangsupport_global.h +++ b/src/libs/clangsupport/clangsupport_global.h @@ -138,18 +138,19 @@ enum class MessageType : quint8 { EchoMessage, EndMessage, - RegisterTranslationUnitForEditorMessage, - UpdateTranslationUnitsForEditorMessage, - UnregisterTranslationUnitsForEditorMessage, + DocumentsOpenedMessage, + DocumentsChangedMessage, + DocumentsClosedMessage, + DocumentVisibilityChangedMessage, - RegisterUnsavedFilesForEditorMessage, - UnregisterUnsavedFilesForEditorMessage, + UnsavedFilesUpdatedMessage, + UnsavedFilesRemovedMessage, - RegisterProjectPartsForEditorMessage, - UnregisterProjectPartsForEditorMessage, + ProjectPartsUpdatedMessage, + ProjectPartsRemovedMessage, - RequestDocumentAnnotationsMessage, - DocumentAnnotationsChangedMessage, + RequestAnnotationsMessage, + AnnotationsMessage, RequestReferencesMessage, ReferencesMessage, @@ -160,10 +161,8 @@ enum class MessageType : quint8 { RequestToolTipMessage, ToolTipMessage, - UpdateVisibleTranslationUnitsMessage, - - CompleteCodeMessage, - CodeCompletedMessage, + RequestCompletionsMessage, + CompletionsMessage, SourceLocationsForRenamingMessage, RequestSourceLocationsForRenamingMessage, diff --git a/src/libs/clangsupport/cmbcodecompletedmessage.cpp b/src/libs/clangsupport/completionsmessage.cpp similarity index 92% rename from src/libs/clangsupport/cmbcodecompletedmessage.cpp rename to src/libs/clangsupport/completionsmessage.cpp index ca10cf15f1a..b6324f6a647 100644 --- a/src/libs/clangsupport/cmbcodecompletedmessage.cpp +++ b/src/libs/clangsupport/completionsmessage.cpp @@ -23,7 +23,7 @@ ** ****************************************************************************/ -#include "cmbcodecompletedmessage.h" +#include "completionsmessage.h" #include @@ -40,9 +40,9 @@ static const char *completionCorrectionToText(CompletionCorrection correction) } #undef RETURN_TEXT_FOR_CASE -QDebug operator<<(QDebug debug, const CodeCompletedMessage &message) +QDebug operator<<(QDebug debug, const CompletionsMessage &message) { - debug.nospace() << "CodeCompletedMessage("; + debug.nospace() << "CompletionsMessage("; debug.nospace() << message.codeCompletions << ", " << completionCorrectionToText(message.neededCorrection) << ", " diff --git a/src/libs/clangsupport/cmbcodecompletedmessage.h b/src/libs/clangsupport/completionsmessage.h similarity index 73% rename from src/libs/clangsupport/cmbcodecompletedmessage.h rename to src/libs/clangsupport/completionsmessage.h index e3b74e9d798..b77710a93b0 100644 --- a/src/libs/clangsupport/cmbcodecompletedmessage.h +++ b/src/libs/clangsupport/completionsmessage.h @@ -33,20 +33,20 @@ namespace ClangBackEnd { -class CodeCompletedMessage +class CompletionsMessage { public: - CodeCompletedMessage() = default; - CodeCompletedMessage(const CodeCompletions &codeCompletions, - CompletionCorrection neededCorrection, - quint64 ticketNumber) - : codeCompletions(codeCompletions), - ticketNumber(ticketNumber), - neededCorrection(neededCorrection) + CompletionsMessage() = default; + CompletionsMessage(const CodeCompletions &codeCompletions, + CompletionCorrection neededCorrection, + quint64 ticketNumber) + : codeCompletions(codeCompletions) + , ticketNumber(ticketNumber) + , neededCorrection(neededCorrection) { } - friend QDataStream &operator<<(QDataStream &out, const CodeCompletedMessage &message) + friend QDataStream &operator<<(QDataStream &out, const CompletionsMessage &message) { out << message.codeCompletions; out << static_cast(message.neededCorrection); @@ -55,7 +55,7 @@ public: return out; } - friend QDataStream &operator>>(QDataStream &in, CodeCompletedMessage &message) + friend QDataStream &operator>>(QDataStream &in, CompletionsMessage &message) { quint32 neededCorrection; @@ -68,7 +68,7 @@ public: return in; } - friend bool operator==(const CodeCompletedMessage &first, const CodeCompletedMessage &second) + friend bool operator==(const CompletionsMessage &first, const CompletionsMessage &second) { return first.ticketNumber == second.ticketNumber && first.neededCorrection == second.neededCorrection @@ -81,7 +81,7 @@ public: CompletionCorrection neededCorrection = CompletionCorrection::NoCorrection; }; -CLANGSUPPORT_EXPORT QDebug operator<<(QDebug debug, const CodeCompletedMessage &message); +CLANGSUPPORT_EXPORT QDebug operator<<(QDebug debug, const CompletionsMessage &message); -DECLARE_MESSAGE(CodeCompletedMessage) +DECLARE_MESSAGE(CompletionsMessage) } // namespace ClangBackEnd diff --git a/src/libs/clangsupport/registerunsavedfilesforeditormessage.cpp b/src/libs/clangsupport/documentschangedmessage.cpp similarity index 87% rename from src/libs/clangsupport/registerunsavedfilesforeditormessage.cpp rename to src/libs/clangsupport/documentschangedmessage.cpp index 1daa1812864..41512d8081a 100644 --- a/src/libs/clangsupport/registerunsavedfilesforeditormessage.cpp +++ b/src/libs/clangsupport/documentschangedmessage.cpp @@ -23,15 +23,15 @@ ** ****************************************************************************/ -#include "registerunsavedfilesforeditormessage.h" +#include "documentschangedmessage.h" #include namespace ClangBackEnd { -QDebug operator<<(QDebug debug, const RegisterUnsavedFilesForEditorMessage &message) +QDebug operator<<(QDebug debug, const DocumentsChangedMessage &message) { - debug.nospace() << "RegisterUnsavedFilesForEditorMessage("; + debug.nospace() << "DocumentsChangedMessage("; for (const FileContainer &fileContainer : message.fileContainers) debug.nospace() << fileContainer<< ", "; diff --git a/src/libs/clangsupport/registerunsavedfilesforeditormessage.h b/src/libs/clangsupport/documentschangedmessage.h similarity index 70% rename from src/libs/clangsupport/registerunsavedfilesforeditormessage.h rename to src/libs/clangsupport/documentschangedmessage.h index b3a5e8ee08d..3d3f6138e8c 100644 --- a/src/libs/clangsupport/registerunsavedfilesforeditormessage.h +++ b/src/libs/clangsupport/documentschangedmessage.h @@ -31,30 +31,31 @@ namespace ClangBackEnd { -class RegisterUnsavedFilesForEditorMessage +class DocumentsChangedMessage { public: - RegisterUnsavedFilesForEditorMessage() = default; - RegisterUnsavedFilesForEditorMessage(const QVector &fileContainers) + DocumentsChangedMessage() = default; + DocumentsChangedMessage(const QVector &fileContainers) : fileContainers(fileContainers) { } - friend QDataStream &operator<<(QDataStream &out, const RegisterUnsavedFilesForEditorMessage &message) + friend QDataStream &operator<<(QDataStream &out, const DocumentsChangedMessage &message) { out << message.fileContainers; return out; } - friend QDataStream &operator>>(QDataStream &in, RegisterUnsavedFilesForEditorMessage &message) + friend QDataStream &operator>>(QDataStream &in, DocumentsChangedMessage &message) { in >> message.fileContainers; return in; } - friend bool operator==(const RegisterUnsavedFilesForEditorMessage &first, const RegisterUnsavedFilesForEditorMessage &second) + friend bool operator==(const DocumentsChangedMessage &first, + const DocumentsChangedMessage &second) { return first.fileContainers == second.fileContainers; } @@ -63,7 +64,7 @@ public: QVector fileContainers; }; -CLANGSUPPORT_EXPORT QDebug operator<<(QDebug debug, const RegisterUnsavedFilesForEditorMessage &message); +CLANGSUPPORT_EXPORT QDebug operator<<(QDebug debug, const DocumentsChangedMessage &message); -DECLARE_MESSAGE(RegisterUnsavedFilesForEditorMessage); +DECLARE_MESSAGE(DocumentsChangedMessage) } // namespace ClangBackEnd diff --git a/src/libs/clangsupport/cmbunregistertranslationunitsforeditormessage.cpp b/src/libs/clangsupport/documentsclosedmessage.cpp similarity index 86% rename from src/libs/clangsupport/cmbunregistertranslationunitsforeditormessage.cpp rename to src/libs/clangsupport/documentsclosedmessage.cpp index 42b6fa35244..7c23586b836 100644 --- a/src/libs/clangsupport/cmbunregistertranslationunitsforeditormessage.cpp +++ b/src/libs/clangsupport/documentsclosedmessage.cpp @@ -23,15 +23,15 @@ ** ****************************************************************************/ -#include "cmbunregistertranslationunitsforeditormessage.h" +#include "documentsclosedmessage.h" #include namespace ClangBackEnd { -QDebug operator<<(QDebug debug, const UnregisterTranslationUnitsForEditorMessage &message) +QDebug operator<<(QDebug debug, const DocumentsClosedMessage &message) { - debug.nospace() << "UnregisterTranslationUnitsForEditorMessage("; + debug.nospace() << "DocumentsClosedMessage("; for (const FileContainer &fileContainer : message.fileContainers) debug.nospace() << fileContainer << ", "; diff --git a/src/libs/clangsupport/updatetranslationunitsforeditormessage.h b/src/libs/clangsupport/documentsclosedmessage.h similarity index 70% rename from src/libs/clangsupport/updatetranslationunitsforeditormessage.h rename to src/libs/clangsupport/documentsclosedmessage.h index 72ce67622f9..458a78fa8c9 100644 --- a/src/libs/clangsupport/updatetranslationunitsforeditormessage.h +++ b/src/libs/clangsupport/documentsclosedmessage.h @@ -25,36 +25,38 @@ #pragma once +#include "clangsupport_global.h" + #include "filecontainer.h" #include namespace ClangBackEnd { -class UpdateTranslationUnitsForEditorMessage +class DocumentsClosedMessage { public: - UpdateTranslationUnitsForEditorMessage() = default; - UpdateTranslationUnitsForEditorMessage(const QVector &fileContainers) + DocumentsClosedMessage() = default; + DocumentsClosedMessage(const QVector &fileContainers) : fileContainers(fileContainers) { } - friend QDataStream &operator<<(QDataStream &out, const UpdateTranslationUnitsForEditorMessage &message) + friend QDataStream &operator<<(QDataStream &out, const DocumentsClosedMessage &message) { out << message.fileContainers; return out; } - friend QDataStream &operator>>(QDataStream &in, UpdateTranslationUnitsForEditorMessage &message) + friend QDataStream &operator>>(QDataStream &in, DocumentsClosedMessage &message) { in >> message.fileContainers; return in; } - friend bool operator==(const UpdateTranslationUnitsForEditorMessage &first, const UpdateTranslationUnitsForEditorMessage &second) + friend bool operator==(const DocumentsClosedMessage &first, const DocumentsClosedMessage &second) { return first.fileContainers == second.fileContainers; } @@ -63,7 +65,7 @@ public: QVector fileContainers; }; -CLANGSUPPORT_EXPORT QDebug operator<<(QDebug debug, const UpdateTranslationUnitsForEditorMessage &message); +CLANGSUPPORT_EXPORT QDebug operator<<(QDebug debug, const DocumentsClosedMessage &message); -DECLARE_MESSAGE(UpdateTranslationUnitsForEditorMessage) +DECLARE_MESSAGE(DocumentsClosedMessage); } // namespace ClangBackEnd diff --git a/src/libs/clangsupport/cmbregistertranslationunitsforeditormessage.cpp b/src/libs/clangsupport/documentsopenedmessage.cpp similarity index 88% rename from src/libs/clangsupport/cmbregistertranslationunitsforeditormessage.cpp rename to src/libs/clangsupport/documentsopenedmessage.cpp index e0fa5d43d74..647899b3fe1 100644 --- a/src/libs/clangsupport/cmbregistertranslationunitsforeditormessage.cpp +++ b/src/libs/clangsupport/documentsopenedmessage.cpp @@ -23,15 +23,15 @@ ** ****************************************************************************/ -#include "cmbregistertranslationunitsforeditormessage.h" +#include "documentsopenedmessage.h" #include namespace ClangBackEnd { -QDebug operator<<(QDebug debug, const RegisterTranslationUnitForEditorMessage &message) +QDebug operator<<(QDebug debug, const DocumentsOpenedMessage &message) { - debug.nospace() << "RegisterTranslationUnitForEditorMessage("; + debug.nospace() << "DocumentsOpenedMessage("; for (const FileContainer &fileContainer : message.fileContainers) debug.nospace() << fileContainer<< ", "; diff --git a/src/libs/clangsupport/cmbregistertranslationunitsforeditormessage.h b/src/libs/clangsupport/documentsopenedmessage.h similarity index 66% rename from src/libs/clangsupport/cmbregistertranslationunitsforeditormessage.h rename to src/libs/clangsupport/documentsopenedmessage.h index 6ec1ebcd9fd..d56596ef7b8 100644 --- a/src/libs/clangsupport/cmbregistertranslationunitsforeditormessage.h +++ b/src/libs/clangsupport/documentsopenedmessage.h @@ -32,20 +32,20 @@ namespace ClangBackEnd { -class RegisterTranslationUnitForEditorMessage +class DocumentsOpenedMessage { public: - RegisterTranslationUnitForEditorMessage() = default; - RegisterTranslationUnitForEditorMessage(const QVector &fileContainers, - const Utf8String ¤tEditorFilePath, - const Utf8StringVector &visibleEditorFilePaths) - : fileContainers(fileContainers), - currentEditorFilePath(currentEditorFilePath), - visibleEditorFilePaths(visibleEditorFilePaths) + DocumentsOpenedMessage() = default; + DocumentsOpenedMessage(const QVector &fileContainers, + const Utf8String ¤tEditorFilePath, + const Utf8StringVector &visibleEditorFilePaths) + : fileContainers(fileContainers) + , currentEditorFilePath(currentEditorFilePath) + , visibleEditorFilePaths(visibleEditorFilePaths) { } - friend QDataStream &operator<<(QDataStream &out, const RegisterTranslationUnitForEditorMessage &message) + friend QDataStream &operator<<(QDataStream &out, const DocumentsOpenedMessage &message) { out << message.fileContainers; out << message.currentEditorFilePath; @@ -53,7 +53,7 @@ public: return out; } - friend QDataStream &operator>>(QDataStream &in, RegisterTranslationUnitForEditorMessage &message) + friend QDataStream &operator>>(QDataStream &in, DocumentsOpenedMessage &message) { in >> message.fileContainers; in >> message.currentEditorFilePath; @@ -62,7 +62,7 @@ public: return in; } - friend bool operator==(const RegisterTranslationUnitForEditorMessage &first, const RegisterTranslationUnitForEditorMessage &second) + friend bool operator==(const DocumentsOpenedMessage &first, const DocumentsOpenedMessage &second) { return first.fileContainers == second.fileContainers && first.currentEditorFilePath == second.currentEditorFilePath @@ -75,7 +75,7 @@ public: Utf8StringVector visibleEditorFilePaths; }; -CLANGSUPPORT_EXPORT QDebug operator<<(QDebug debug, const RegisterTranslationUnitForEditorMessage &message); +CLANGSUPPORT_EXPORT QDebug operator<<(QDebug debug, const DocumentsOpenedMessage &message); -DECLARE_MESSAGE(RegisterTranslationUnitForEditorMessage); +DECLARE_MESSAGE(DocumentsOpenedMessage); } // namespace ClangBackEnd diff --git a/src/libs/clangsupport/updatevisibletranslationunitsmessage.cpp b/src/libs/clangsupport/documentvisibilitychangedmessage.cpp similarity index 88% rename from src/libs/clangsupport/updatevisibletranslationunitsmessage.cpp rename to src/libs/clangsupport/documentvisibilitychangedmessage.cpp index e0826a756be..f82efe65818 100644 --- a/src/libs/clangsupport/updatevisibletranslationunitsmessage.cpp +++ b/src/libs/clangsupport/documentvisibilitychangedmessage.cpp @@ -23,15 +23,15 @@ ** ****************************************************************************/ -#include "updatevisibletranslationunitsmessage.h" +#include "documentvisibilitychangedmessage.h" #include namespace ClangBackEnd { -QDebug operator<<(QDebug debug, const UpdateVisibleTranslationUnitsMessage &message) +QDebug operator<<(QDebug debug, const DocumentVisibilityChangedMessage &message) { - debug.nospace() << "UpdateVisibleTranslationUnitsMessage("; + debug.nospace() << "DocumentVisibilityChangedMessage("; debug.nospace() << message.currentEditorFilePath << ", "; diff --git a/src/libs/clangsupport/updatevisibletranslationunitsmessage.h b/src/libs/clangsupport/documentvisibilitychangedmessage.h similarity index 68% rename from src/libs/clangsupport/updatevisibletranslationunitsmessage.h rename to src/libs/clangsupport/documentvisibilitychangedmessage.h index e51706276d2..cb8b0f2679e 100644 --- a/src/libs/clangsupport/updatevisibletranslationunitsmessage.h +++ b/src/libs/clangsupport/documentvisibilitychangedmessage.h @@ -33,18 +33,18 @@ namespace ClangBackEnd { -class UpdateVisibleTranslationUnitsMessage +class DocumentVisibilityChangedMessage { public: - UpdateVisibleTranslationUnitsMessage() = default; - UpdateVisibleTranslationUnitsMessage(const Utf8String ¤tEditorFilePath, - const Utf8StringVector &visibleEditorFilePaths) - : currentEditorFilePath(currentEditorFilePath), - visibleEditorFilePaths(visibleEditorFilePaths) + DocumentVisibilityChangedMessage() = default; + DocumentVisibilityChangedMessage(const Utf8String ¤tEditorFilePath, + const Utf8StringVector &visibleEditorFilePaths) + : currentEditorFilePath(currentEditorFilePath) + , visibleEditorFilePaths(visibleEditorFilePaths) { } - friend QDataStream &operator<<(QDataStream &out, const UpdateVisibleTranslationUnitsMessage &message) + friend QDataStream &operator<<(QDataStream &out, const DocumentVisibilityChangedMessage &message) { out << message.currentEditorFilePath; out << message.visibleEditorFilePaths; @@ -52,7 +52,7 @@ public: return out; } - friend QDataStream &operator>>(QDataStream &in, UpdateVisibleTranslationUnitsMessage &message) + friend QDataStream &operator>>(QDataStream &in, DocumentVisibilityChangedMessage &message) { in >> message.currentEditorFilePath; in >> message.visibleEditorFilePaths; @@ -60,7 +60,8 @@ public: return in; } - friend bool operator==(const UpdateVisibleTranslationUnitsMessage &first, const UpdateVisibleTranslationUnitsMessage &second) + friend bool operator==(const DocumentVisibilityChangedMessage &first, + const DocumentVisibilityChangedMessage &second) { return first.currentEditorFilePath == second.currentEditorFilePath && first.visibleEditorFilePaths == second.visibleEditorFilePaths; @@ -71,7 +72,7 @@ public: Utf8StringVector visibleEditorFilePaths; }; -CLANGSUPPORT_EXPORT QDebug operator<<(QDebug debug, const UpdateVisibleTranslationUnitsMessage &message); +CLANGSUPPORT_EXPORT QDebug operator<<(QDebug debug, const DocumentVisibilityChangedMessage &message); -DECLARE_MESSAGE(UpdateVisibleTranslationUnitsMessage) +DECLARE_MESSAGE(DocumentVisibilityChangedMessage) } // namespace ClangBackEnd diff --git a/src/libs/clangsupport/cmbechomessage.cpp b/src/libs/clangsupport/echomessage.cpp similarity index 98% rename from src/libs/clangsupport/cmbechomessage.cpp rename to src/libs/clangsupport/echomessage.cpp index 4d221737ea8..a8842b537b5 100644 --- a/src/libs/clangsupport/cmbechomessage.cpp +++ b/src/libs/clangsupport/echomessage.cpp @@ -23,7 +23,7 @@ ** ****************************************************************************/ -#include "cmbechomessage.h" +#include "echomessage.h" #include diff --git a/src/libs/clangsupport/cmbechomessage.h b/src/libs/clangsupport/echomessage.h similarity index 100% rename from src/libs/clangsupport/cmbechomessage.h rename to src/libs/clangsupport/echomessage.h diff --git a/src/libs/clangsupport/cmbendmessage.cpp b/src/libs/clangsupport/endmessage.cpp similarity index 96% rename from src/libs/clangsupport/cmbendmessage.cpp rename to src/libs/clangsupport/endmessage.cpp index 7dbc49e41ed..23132d456a4 100644 --- a/src/libs/clangsupport/cmbendmessage.cpp +++ b/src/libs/clangsupport/endmessage.cpp @@ -23,7 +23,7 @@ ** ****************************************************************************/ -#include "cmbendmessage.h" +#include "endmessage.h" #include @@ -34,4 +34,4 @@ QDebug operator<<(QDebug debug, const EndMessage &/*message*/) return debug.nospace() << "EndMessage()"; } -} +} // namespace ClangBackEnd diff --git a/src/libs/clangsupport/cmbendmessage.h b/src/libs/clangsupport/endmessage.h similarity index 100% rename from src/libs/clangsupport/cmbendmessage.h rename to src/libs/clangsupport/endmessage.h diff --git a/src/libs/clangsupport/messageenvelop.cpp b/src/libs/clangsupport/messageenvelop.cpp index 134616a5b93..b4da3d87587 100644 --- a/src/libs/clangsupport/messageenvelop.cpp +++ b/src/libs/clangsupport/messageenvelop.cpp @@ -38,32 +38,35 @@ QDebug operator<<(QDebug debug, const MessageEnvelop &messageEnvelop) case MessageType::EndMessage: qDebug() << "EndMessage()"; break; - case MessageType::RegisterTranslationUnitForEditorMessage: - qDebug() << messageEnvelop.message(); + case MessageType::DocumentsOpenedMessage: + qDebug() << messageEnvelop.message(); break; - case MessageType::UpdateTranslationUnitsForEditorMessage: - qDebug() << messageEnvelop.message(); + case MessageType::DocumentsChangedMessage: + qDebug() << messageEnvelop.message(); break; - case MessageType::UnregisterTranslationUnitsForEditorMessage: - qDebug() << messageEnvelop.message(); + case MessageType::DocumentsClosedMessage: + qDebug() << messageEnvelop.message(); break; - case MessageType::RegisterProjectPartsForEditorMessage: - qDebug() << messageEnvelop.message(); + case MessageType::DocumentVisibilityChangedMessage: + qDebug() << messageEnvelop.message(); break; - case MessageType::UnregisterProjectPartsForEditorMessage: - qDebug() << messageEnvelop.message(); + case MessageType::ProjectPartsUpdatedMessage: + qDebug() << messageEnvelop.message(); break; - case MessageType::RegisterUnsavedFilesForEditorMessage: - qDebug() << messageEnvelop.message(); + case MessageType::ProjectPartsRemovedMessage: + qDebug() << messageEnvelop.message(); break; - case MessageType::UnregisterUnsavedFilesForEditorMessage: - qDebug() << messageEnvelop.message(); + case MessageType::UnsavedFilesUpdatedMessage: + qDebug() << messageEnvelop.message(); break; - case MessageType::CompleteCodeMessage: - qDebug() << messageEnvelop.message(); + case MessageType::UnsavedFilesRemovedMessage: + qDebug() << messageEnvelop.message(); break; - case MessageType::RequestDocumentAnnotationsMessage: - qDebug() << messageEnvelop.message(); + case MessageType::RequestCompletionsMessage: + qDebug() << messageEnvelop.message(); + break; + case MessageType::RequestAnnotationsMessage: + qDebug() << messageEnvelop.message(); break; case MessageType::RequestReferencesMessage: qDebug() << messageEnvelop.message(); @@ -71,17 +74,14 @@ QDebug operator<<(QDebug debug, const MessageEnvelop &messageEnvelop) case MessageType::RequestToolTipMessage: qDebug() << messageEnvelop.message(); break; - case MessageType::UpdateVisibleTranslationUnitsMessage: - qDebug() << messageEnvelop.message(); - break; case MessageType::AliveMessage: qDebug() << "AliveMessage()"; break; case MessageType::EchoMessage: qDebug() << messageEnvelop.message(); break; - case MessageType::CodeCompletedMessage: - qDebug() << messageEnvelop.message(); + case MessageType::CompletionsMessage: + qDebug() << messageEnvelop.message(); break; case MessageType::ReferencesMessage: qDebug() << messageEnvelop.message(); @@ -89,8 +89,8 @@ QDebug operator<<(QDebug debug, const MessageEnvelop &messageEnvelop) case MessageType::ToolTipMessage: qDebug() << messageEnvelop.message(); break; - case MessageType::DocumentAnnotationsChangedMessage: - qDebug() << messageEnvelop.message(); + case MessageType::AnnotationsMessage: + qDebug() << messageEnvelop.message(); break; default: qWarning() << "Unknown Message"; diff --git a/src/libs/clangsupport/pchmanagerclientproxy.cpp b/src/libs/clangsupport/pchmanagerclientproxy.cpp index ad583113bba..6a216ef6361 100644 --- a/src/libs/clangsupport/pchmanagerclientproxy.cpp +++ b/src/libs/clangsupport/pchmanagerclientproxy.cpp @@ -25,7 +25,7 @@ #include "pchmanagerclientproxy.h" -#include "cmbalivemessage.h" +#include "alivemessage.h" #include "messageenvelop.h" #include "pchmanagerserverinterface.h" #include "precompiledheadersupdatedmessage.h" diff --git a/src/libs/clangsupport/pchmanagerserverproxy.cpp b/src/libs/clangsupport/pchmanagerserverproxy.cpp index 079c8890d94..fbf4866542a 100644 --- a/src/libs/clangsupport/pchmanagerserverproxy.cpp +++ b/src/libs/clangsupport/pchmanagerserverproxy.cpp @@ -25,7 +25,7 @@ #include "pchmanagerserverproxy.h" -#include "cmbendmessage.h" +#include "endmessage.h" #include "messageenvelop.h" #include "pchmanagerclientinterface.h" #include "removeprojectpartsmessage.h" diff --git a/src/libs/clangsupport/cmbunregisterprojectsforeditormessage.cpp b/src/libs/clangsupport/projectpartsremovedmessage.cpp similarity index 87% rename from src/libs/clangsupport/cmbunregisterprojectsforeditormessage.cpp rename to src/libs/clangsupport/projectpartsremovedmessage.cpp index 8d109051d6e..8c727fbc4bd 100644 --- a/src/libs/clangsupport/cmbunregisterprojectsforeditormessage.cpp +++ b/src/libs/clangsupport/projectpartsremovedmessage.cpp @@ -23,15 +23,15 @@ ** ****************************************************************************/ -#include "cmbunregisterprojectsforeditormessage.h" +#include "projectpartsremovedmessage.h" #include namespace ClangBackEnd { -QDebug operator<<(QDebug debug, const UnregisterProjectPartsForEditorMessage &message) +QDebug operator<<(QDebug debug, const ProjectPartsRemovedMessage &message) { - debug.nospace() << "UnregisterProjectPartsForEditorMessage("; + debug.nospace() << "ProjectPartsRemovedMessage("; for (const Utf8String &fileNames_ : message.projectPartIds) debug.nospace() << fileNames_ << ", "; diff --git a/src/libs/clangsupport/cmbunregisterprojectsforeditormessage.h b/src/libs/clangsupport/projectpartsremovedmessage.h similarity index 70% rename from src/libs/clangsupport/cmbunregisterprojectsforeditormessage.h rename to src/libs/clangsupport/projectpartsremovedmessage.h index eaace726b84..754298aa0d8 100644 --- a/src/libs/clangsupport/cmbunregisterprojectsforeditormessage.h +++ b/src/libs/clangsupport/projectpartsremovedmessage.h @@ -33,30 +33,31 @@ namespace ClangBackEnd { -class CLANGSUPPORT_EXPORT UnregisterProjectPartsForEditorMessage +class CLANGSUPPORT_EXPORT ProjectPartsRemovedMessage { public: - UnregisterProjectPartsForEditorMessage() = default; - UnregisterProjectPartsForEditorMessage(const Utf8StringVector &projectPartIds) + ProjectPartsRemovedMessage() = default; + ProjectPartsRemovedMessage(const Utf8StringVector &projectPartIds) : projectPartIds(projectPartIds) { } - friend QDataStream &operator<<(QDataStream &out, const UnregisterProjectPartsForEditorMessage &message) + friend QDataStream &operator<<(QDataStream &out, const ProjectPartsRemovedMessage &message) { out << message.projectPartIds; return out; } - friend QDataStream &operator>>(QDataStream &in, UnregisterProjectPartsForEditorMessage &message) + friend QDataStream &operator>>(QDataStream &in, ProjectPartsRemovedMessage &message) { in >> message.projectPartIds; return in; } - friend bool operator==(const UnregisterProjectPartsForEditorMessage &first, const UnregisterProjectPartsForEditorMessage &second) + friend bool operator==(const ProjectPartsRemovedMessage &first, + const ProjectPartsRemovedMessage &second) { return first.projectPartIds == second.projectPartIds; } @@ -65,7 +66,7 @@ public: Utf8StringVector projectPartIds; }; -CLANGSUPPORT_EXPORT QDebug operator<<(QDebug debug, const UnregisterProjectPartsForEditorMessage &message); +CLANGSUPPORT_EXPORT QDebug operator<<(QDebug debug, const ProjectPartsRemovedMessage &message); -DECLARE_MESSAGE(UnregisterProjectPartsForEditorMessage); +DECLARE_MESSAGE(ProjectPartsRemovedMessage); } // namespace ClangBackEnd diff --git a/src/libs/clangsupport/cmbregisterprojectsforeditormessage.cpp b/src/libs/clangsupport/projectpartsupdatedmessage.cpp similarity index 88% rename from src/libs/clangsupport/cmbregisterprojectsforeditormessage.cpp rename to src/libs/clangsupport/projectpartsupdatedmessage.cpp index 8a57c6e8d7b..7550ea81546 100644 --- a/src/libs/clangsupport/cmbregisterprojectsforeditormessage.cpp +++ b/src/libs/clangsupport/projectpartsupdatedmessage.cpp @@ -23,15 +23,15 @@ ** ****************************************************************************/ -#include "cmbregisterprojectsforeditormessage.h" +#include "projectpartsupdatedmessage.h" #include namespace ClangBackEnd { -QDebug operator<<(QDebug debug, const RegisterProjectPartsForEditorMessage &message) +QDebug operator<<(QDebug debug, const ProjectPartsUpdatedMessage &message) { - debug.nospace() << "RegisterProjectPartsForEditorMessage("; + debug.nospace() << "ProjectPartsUpdatedMessage("; for (const ProjectPartContainer &projectContainer : message.projectContainers) debug.nospace() << projectContainer<< ", "; diff --git a/src/libs/clangsupport/cmbregisterprojectsforeditormessage.h b/src/libs/clangsupport/projectpartsupdatedmessage.h similarity index 71% rename from src/libs/clangsupport/cmbregisterprojectsforeditormessage.h rename to src/libs/clangsupport/projectpartsupdatedmessage.h index fe22127c446..07981a6eb62 100644 --- a/src/libs/clangsupport/cmbregisterprojectsforeditormessage.h +++ b/src/libs/clangsupport/projectpartsupdatedmessage.h @@ -32,30 +32,31 @@ namespace ClangBackEnd { -class RegisterProjectPartsForEditorMessage +class ProjectPartsUpdatedMessage { public: - RegisterProjectPartsForEditorMessage() = default; - RegisterProjectPartsForEditorMessage(const QVector &projectContainers) + ProjectPartsUpdatedMessage() = default; + ProjectPartsUpdatedMessage(const QVector &projectContainers) : projectContainers(projectContainers) { } - friend QDataStream &operator<<(QDataStream &out, const RegisterProjectPartsForEditorMessage &message) + friend QDataStream &operator<<(QDataStream &out, const ProjectPartsUpdatedMessage &message) { out << message.projectContainers; return out; } - friend QDataStream &operator>>(QDataStream &in, RegisterProjectPartsForEditorMessage &message) + friend QDataStream &operator>>(QDataStream &in, ProjectPartsUpdatedMessage &message) { in >> message.projectContainers; return in; } - friend bool operator==(const RegisterProjectPartsForEditorMessage &first, const RegisterProjectPartsForEditorMessage &second) + friend bool operator==(const ProjectPartsUpdatedMessage &first, + const ProjectPartsUpdatedMessage &second) { return first.projectContainers == second.projectContainers; } @@ -64,7 +65,7 @@ public: QVector projectContainers; }; -CLANGSUPPORT_EXPORT QDebug operator<<(QDebug debug, const RegisterProjectPartsForEditorMessage &message); +CLANGSUPPORT_EXPORT QDebug operator<<(QDebug debug, const ProjectPartsUpdatedMessage &message); -DECLARE_MESSAGE(RegisterProjectPartsForEditorMessage); +DECLARE_MESSAGE(ProjectPartsUpdatedMessage); } // namespace ClangBackEnd diff --git a/src/libs/clangsupport/refactoringclientproxy.cpp b/src/libs/clangsupport/refactoringclientproxy.cpp index 576489aa250..28195122bcb 100644 --- a/src/libs/clangsupport/refactoringclientproxy.cpp +++ b/src/libs/clangsupport/refactoringclientproxy.cpp @@ -25,7 +25,7 @@ #include "refactoringclientproxy.h" -#include "cmbalivemessage.h" +#include "alivemessage.h" #include "messageenvelop.h" #include "refactoringserverinterface.h" #include "clangrefactoringclientmessages.h" diff --git a/src/libs/clangsupport/requestdocumentannotations.cpp b/src/libs/clangsupport/requestannotationsmessage.cpp similarity index 88% rename from src/libs/clangsupport/requestdocumentannotations.cpp rename to src/libs/clangsupport/requestannotationsmessage.cpp index 83265a8fcc0..45392f92677 100644 --- a/src/libs/clangsupport/requestdocumentannotations.cpp +++ b/src/libs/clangsupport/requestannotationsmessage.cpp @@ -23,15 +23,15 @@ ** ****************************************************************************/ -#include "requestdocumentannotations.h" +#include "requestannotationsmessage.h" #include namespace ClangBackEnd { -QDebug operator<<(QDebug debug, const RequestDocumentAnnotationsMessage &message) +QDebug operator<<(QDebug debug, const RequestAnnotationsMessage &message) { - debug.nospace() << "RequestDocumentAnnotationsMessage(" + debug.nospace() << "RequestAnnotationsMessage(" << message.fileContainer << ")"; diff --git a/src/libs/clangsupport/requestdocumentannotations.h b/src/libs/clangsupport/requestannotationsmessage.h similarity index 77% rename from src/libs/clangsupport/requestdocumentannotations.h rename to src/libs/clangsupport/requestannotationsmessage.h index 395f66ae4af..24be10d1245 100644 --- a/src/libs/clangsupport/requestdocumentannotations.h +++ b/src/libs/clangsupport/requestannotationsmessage.h @@ -29,30 +29,31 @@ namespace ClangBackEnd { -class RequestDocumentAnnotationsMessage +class RequestAnnotationsMessage { public: - RequestDocumentAnnotationsMessage() = default; - RequestDocumentAnnotationsMessage(const FileContainer &fileContainer) + RequestAnnotationsMessage() = default; + RequestAnnotationsMessage(const FileContainer &fileContainer) : fileContainer(fileContainer) { } - friend QDataStream &operator<<(QDataStream &out, const RequestDocumentAnnotationsMessage &message) + friend QDataStream &operator<<(QDataStream &out, const RequestAnnotationsMessage &message) { out << message.fileContainer; return out; } - friend QDataStream &operator>>(QDataStream &in, RequestDocumentAnnotationsMessage &message) + friend QDataStream &operator>>(QDataStream &in, RequestAnnotationsMessage &message) { in >> message.fileContainer; return in; } - friend bool operator==(const RequestDocumentAnnotationsMessage &first, const RequestDocumentAnnotationsMessage &second) + friend bool operator==(const RequestAnnotationsMessage &first, + const RequestAnnotationsMessage &second) { return first.fileContainer == second.fileContainer; } @@ -61,7 +62,7 @@ public: FileContainer fileContainer; }; -CLANGSUPPORT_EXPORT QDebug operator<<(QDebug debug, const RequestDocumentAnnotationsMessage &message); +CLANGSUPPORT_EXPORT QDebug operator<<(QDebug debug, const RequestAnnotationsMessage &message); -DECLARE_MESSAGE(RequestDocumentAnnotationsMessage); +DECLARE_MESSAGE(RequestAnnotationsMessage); } // namespace ClangBackEnd diff --git a/src/libs/clangsupport/cmbcompletecodemessage.cpp b/src/libs/clangsupport/requestcompletionsmessage.cpp similarity index 88% rename from src/libs/clangsupport/cmbcompletecodemessage.cpp rename to src/libs/clangsupport/requestcompletionsmessage.cpp index a99c6d64bdf..bb2fdcb9825 100644 --- a/src/libs/clangsupport/cmbcompletecodemessage.cpp +++ b/src/libs/clangsupport/requestcompletionsmessage.cpp @@ -23,17 +23,17 @@ ** ****************************************************************************/ -#include "cmbcompletecodemessage.h" +#include "requestcompletionsmessage.h" #include namespace ClangBackEnd { -quint64 CompleteCodeMessage::ticketCounter = 0; +quint64 RequestCompletionsMessage::ticketCounter = 0; -QDebug operator<<(QDebug debug, const CompleteCodeMessage &message) +QDebug operator<<(QDebug debug, const RequestCompletionsMessage &message) { - debug.nospace() << "CompleteCodeMessage("; + debug.nospace() << "RequestCompletionsMessage("; debug.nospace() << message.filePath << ", "; debug.nospace() << message.line << ", "; diff --git a/src/libs/clangsupport/cmbcompletecodemessage.h b/src/libs/clangsupport/requestcompletionsmessage.h similarity index 70% rename from src/libs/clangsupport/cmbcompletecodemessage.h rename to src/libs/clangsupport/requestcompletionsmessage.h index d32287fa934..ff87d920a81 100644 --- a/src/libs/clangsupport/cmbcompletecodemessage.h +++ b/src/libs/clangsupport/requestcompletionsmessage.h @@ -33,27 +33,27 @@ namespace ClangBackEnd { -class CompleteCodeMessage +class RequestCompletionsMessage { public: - CompleteCodeMessage() = default; - CompleteCodeMessage(const Utf8String &filePath, - quint32 line, - quint32 column, - const Utf8String &projectPartId, - qint32 funcNameStartLine = -1, - qint32 funcNameStartColumn = -1) - : filePath(filePath), - projectPartId(projectPartId), - ticketNumber(++ticketCounter), - line(line), - column(column), - funcNameStartLine(funcNameStartLine), - funcNameStartColumn(funcNameStartColumn) + RequestCompletionsMessage() = default; + RequestCompletionsMessage(const Utf8String &filePath, + quint32 line, + quint32 column, + const Utf8String &projectPartId, + qint32 funcNameStartLine = -1, + qint32 funcNameStartColumn = -1) + : filePath(filePath) + , projectPartId(projectPartId) + , ticketNumber(++ticketCounter) + , line(line) + , column(column) + , funcNameStartLine(funcNameStartLine) + , funcNameStartColumn(funcNameStartColumn) { } - friend QDataStream &operator<<(QDataStream &out, const CompleteCodeMessage &message) + friend QDataStream &operator<<(QDataStream &out, const RequestCompletionsMessage &message) { out << message.filePath; out << message.projectPartId; @@ -66,7 +66,7 @@ public: return out; } - friend QDataStream &operator>>(QDataStream &in, CompleteCodeMessage &message) + friend QDataStream &operator>>(QDataStream &in, RequestCompletionsMessage &message) { in >> message.filePath; in >> message.projectPartId; @@ -79,7 +79,8 @@ public: return in; } - friend bool operator==(const CompleteCodeMessage &first, const CompleteCodeMessage &second) + friend bool operator==(const RequestCompletionsMessage &first, + const RequestCompletionsMessage &second) { return first.ticketNumber == second.ticketNumber && first.filePath == second.filePath @@ -101,7 +102,7 @@ public: qint32 funcNameStartColumn = -1; }; -CLANGSUPPORT_EXPORT QDebug operator<<(QDebug debug, const CompleteCodeMessage &message); +CLANGSUPPORT_EXPORT QDebug operator<<(QDebug debug, const RequestCompletionsMessage &message); -DECLARE_MESSAGE(CompleteCodeMessage); +DECLARE_MESSAGE(RequestCompletionsMessage); } // namespace ClangBackEnd diff --git a/src/libs/clangsupport/updatetranslationunitsforeditormessage.cpp b/src/libs/clangsupport/unsavedfilesremovedmessage.cpp similarity index 87% rename from src/libs/clangsupport/updatetranslationunitsforeditormessage.cpp rename to src/libs/clangsupport/unsavedfilesremovedmessage.cpp index 9c05cb43e7e..8da5ca1c1b9 100644 --- a/src/libs/clangsupport/updatetranslationunitsforeditormessage.cpp +++ b/src/libs/clangsupport/unsavedfilesremovedmessage.cpp @@ -23,15 +23,15 @@ ** ****************************************************************************/ -#include "updatetranslationunitsforeditormessage.h" +#include "unsavedfilesremovedmessage.h" #include namespace ClangBackEnd { -QDebug operator<<(QDebug debug, const UpdateTranslationUnitsForEditorMessage &message) +QDebug operator<<(QDebug debug, const UnsavedFilesRemovedMessage &message) { - debug.nospace() << "UpdateTranslationUnitsForEditorMessage("; + debug.nospace() << "UnsavedFilesRemovedMessage("; for (const FileContainer &fileContainer : message.fileContainers) debug.nospace() << fileContainer<< ", "; diff --git a/src/libs/clangsupport/unregisterunsavedfilesforeditormessage.h b/src/libs/clangsupport/unsavedfilesremovedmessage.h similarity index 70% rename from src/libs/clangsupport/unregisterunsavedfilesforeditormessage.h rename to src/libs/clangsupport/unsavedfilesremovedmessage.h index 92b6c13bf10..58714b407f2 100644 --- a/src/libs/clangsupport/unregisterunsavedfilesforeditormessage.h +++ b/src/libs/clangsupport/unsavedfilesremovedmessage.h @@ -31,30 +31,31 @@ namespace ClangBackEnd { -class UnregisterUnsavedFilesForEditorMessage +class UnsavedFilesRemovedMessage { public: - UnregisterUnsavedFilesForEditorMessage() = default; - UnregisterUnsavedFilesForEditorMessage(const QVector &fileContainers) + UnsavedFilesRemovedMessage() = default; + UnsavedFilesRemovedMessage(const QVector &fileContainers) : fileContainers(fileContainers) { } - friend QDataStream &operator<<(QDataStream &out, const UnregisterUnsavedFilesForEditorMessage &message) + friend QDataStream &operator<<(QDataStream &out, const UnsavedFilesRemovedMessage &message) { out << message.fileContainers; return out; } - friend QDataStream &operator>>(QDataStream &in, UnregisterUnsavedFilesForEditorMessage &message) + friend QDataStream &operator>>(QDataStream &in, UnsavedFilesRemovedMessage &message) { in >> message.fileContainers; return in; } - friend bool operator==(const UnregisterUnsavedFilesForEditorMessage &first, const UnregisterUnsavedFilesForEditorMessage &second) + friend bool operator==(const UnsavedFilesRemovedMessage &first, + const UnsavedFilesRemovedMessage &second) { return first.fileContainers == second.fileContainers; } @@ -63,7 +64,7 @@ public: QVector fileContainers; }; -CLANGSUPPORT_EXPORT QDebug operator<<(QDebug debug, const UnregisterUnsavedFilesForEditorMessage &message); +CLANGSUPPORT_EXPORT QDebug operator<<(QDebug debug, const UnsavedFilesRemovedMessage &message); -DECLARE_MESSAGE(UnregisterUnsavedFilesForEditorMessage) +DECLARE_MESSAGE(UnsavedFilesRemovedMessage) } // namespace ClangBackEnd diff --git a/src/libs/clangsupport/unregisterunsavedfilesforeditormessage.cpp b/src/libs/clangsupport/unsavedfilesupdatedmessage.cpp similarity index 87% rename from src/libs/clangsupport/unregisterunsavedfilesforeditormessage.cpp rename to src/libs/clangsupport/unsavedfilesupdatedmessage.cpp index cb1d3ed3b97..80000a65664 100644 --- a/src/libs/clangsupport/unregisterunsavedfilesforeditormessage.cpp +++ b/src/libs/clangsupport/unsavedfilesupdatedmessage.cpp @@ -23,15 +23,15 @@ ** ****************************************************************************/ -#include "unregisterunsavedfilesforeditormessage.h" +#include "unsavedfilesupdatedmessage.h" #include namespace ClangBackEnd { -QDebug operator<<(QDebug debug, const UnregisterUnsavedFilesForEditorMessage &message) +QDebug operator<<(QDebug debug, const UnsavedFilesUpdatedMessage &message) { - debug.nospace() << "UnregisterUnsavedFilesForEditorMessage("; + debug.nospace() << "UnsavedFilesUpdatedMessage("; for (const FileContainer &fileContainer : message.fileContainers) debug.nospace() << fileContainer<< ", "; diff --git a/src/libs/clangsupport/cmbunregistertranslationunitsforeditormessage.h b/src/libs/clangsupport/unsavedfilesupdatedmessage.h similarity index 68% rename from src/libs/clangsupport/cmbunregistertranslationunitsforeditormessage.h rename to src/libs/clangsupport/unsavedfilesupdatedmessage.h index bdf91dac4e6..5d796f7ae00 100644 --- a/src/libs/clangsupport/cmbunregistertranslationunitsforeditormessage.h +++ b/src/libs/clangsupport/unsavedfilesupdatedmessage.h @@ -25,38 +25,37 @@ #pragma once -#include "clangsupport_global.h" - #include "filecontainer.h" #include namespace ClangBackEnd { -class UnregisterTranslationUnitsForEditorMessage +class UnsavedFilesUpdatedMessage { public: - UnregisterTranslationUnitsForEditorMessage() = default; - UnregisterTranslationUnitsForEditorMessage(const QVector &fileContainers) + UnsavedFilesUpdatedMessage() = default; + UnsavedFilesUpdatedMessage(const QVector &fileContainers) : fileContainers(fileContainers) { } - friend QDataStream &operator<<(QDataStream &out, const UnregisterTranslationUnitsForEditorMessage &message) + friend QDataStream &operator<<(QDataStream &out, const UnsavedFilesUpdatedMessage &message) { out << message.fileContainers; return out; } - friend QDataStream &operator>>(QDataStream &in, UnregisterTranslationUnitsForEditorMessage &message) + friend QDataStream &operator>>(QDataStream &in, UnsavedFilesUpdatedMessage &message) { in >> message.fileContainers; return in; } - friend bool operator==(const UnregisterTranslationUnitsForEditorMessage &first, const UnregisterTranslationUnitsForEditorMessage &second) + friend bool operator==(const UnsavedFilesUpdatedMessage &first, + const UnsavedFilesUpdatedMessage &second) { return first.fileContainers == second.fileContainers; } @@ -65,7 +64,7 @@ public: QVector fileContainers; }; -CLANGSUPPORT_EXPORT QDebug operator<<(QDebug debug, const UnregisterTranslationUnitsForEditorMessage &message); +CLANGSUPPORT_EXPORT QDebug operator<<(QDebug debug, const UnsavedFilesUpdatedMessage &message); -DECLARE_MESSAGE(UnregisterTranslationUnitsForEditorMessage); +DECLARE_MESSAGE(UnsavedFilesUpdatedMessage); } // namespace ClangBackEnd diff --git a/src/plugins/clangcodemodel/clangbackendcommunicator.cpp b/src/plugins/clangcodemodel/clangbackendcommunicator.cpp index f0beb302b7d..8bdea6917fc 100644 --- a/src/plugins/clangcodemodel/clangbackendcommunicator.cpp +++ b/src/plugins/clangcodemodel/clangbackendcommunicator.cpp @@ -74,19 +74,23 @@ class DummyBackendSender : public ClangBackEnd::ClangCodeModelServerInterface { public: void end() override {} - void registerTranslationUnitsForEditor(const RegisterTranslationUnitForEditorMessage &) override {} - void updateTranslationUnitsForEditor(const UpdateTranslationUnitsForEditorMessage &) override {} - void unregisterTranslationUnitsForEditor(const UnregisterTranslationUnitsForEditorMessage &) override {} - void registerProjectPartsForEditor(const RegisterProjectPartsForEditorMessage &) override {} - void unregisterProjectPartsForEditor(const UnregisterProjectPartsForEditorMessage &) override {} - void registerUnsavedFilesForEditor(const RegisterUnsavedFilesForEditorMessage &) override {} - void unregisterUnsavedFilesForEditor(const UnregisterUnsavedFilesForEditorMessage &) override {} - void completeCode(const CompleteCodeMessage &) override {} - void requestDocumentAnnotations(const RequestDocumentAnnotationsMessage &) override {} + + void documentsOpened(const DocumentsOpenedMessage &) override {} + void documentsChanged(const DocumentsChangedMessage &) override {} + void documentsClosed(const DocumentsClosedMessage &) override {} + void documentVisibilityChanged(const DocumentVisibilityChangedMessage &) override {} + + void projectPartsUpdated(const ProjectPartsUpdatedMessage &) override {} + void projectPartsRemoved(const ProjectPartsRemovedMessage &) override {} + + void unsavedFilesUpdated(const UnsavedFilesUpdatedMessage &) override {} + void unsavedFilesRemoved(const UnsavedFilesRemovedMessage &) override {} + + void requestCompletions(const RequestCompletionsMessage &) override {} + void requestAnnotations(const RequestAnnotationsMessage &) override {} void requestReferences(const RequestReferencesMessage &) override {} void requestFollowSymbol(const RequestFollowSymbolMessage &) override {} void requestToolTip(const RequestToolTipMessage &) override {} - void updateVisibleTranslationUnits(const UpdateVisibleTranslationUnitsMessage &) override {} }; BackendCommunicator::BackendCommunicator() @@ -161,12 +165,12 @@ static QVector toProjectPartContainers( return projectPartContainers; } -void BackendCommunicator::registerFallbackProjectPart() +void BackendCommunicator::projectPartsUpdatedForFallback() { const auto projectPart = CppTools::CppModelManager::instance()->fallbackProjectPart(); const auto projectPartContainer = toProjectPartContainer(projectPart); - registerProjectPartsForEditor({projectPartContainer}); + projectPartsUpdated({projectPartContainer}); } namespace { @@ -232,36 +236,36 @@ Utf8StringVector visibleCppEditorDocumentsFilePaths() } -void BackendCommunicator::updateTranslationUnitVisiblity() +void BackendCommunicator::documentVisibilityChanged() { - updateTranslationUnitVisiblity(currentCppEditorDocumentFilePath(), visibleCppEditorDocumentsFilePaths()); + documentVisibilityChanged(currentCppEditorDocumentFilePath(), visibleCppEditorDocumentsFilePaths()); } bool BackendCommunicator::isNotWaitingForCompletion() const { - return !m_receiver.isExpectingCodeCompletedMessage(); + return !m_receiver.isExpectingCompletionsMessage(); } -void BackendCommunicator::updateTranslationUnitVisiblity(const Utf8String ¤tEditorFilePath, - const Utf8StringVector &visibleEditorsFilePaths) +void BackendCommunicator::documentVisibilityChanged(const Utf8String ¤tEditorFilePath, + const Utf8StringVector &visibleEditorsFilePaths) { - const UpdateVisibleTranslationUnitsMessage message(currentEditorFilePath, visibleEditorsFilePaths); - m_sender->updateVisibleTranslationUnits(message); + const DocumentVisibilityChangedMessage message(currentEditorFilePath, visibleEditorsFilePaths); + m_sender->documentVisibilityChanged(message); } -void BackendCommunicator::registerCurrentProjectParts() +void BackendCommunicator::projectPartsUpdatedForCurrentProjects() { using namespace CppTools; const QList projectInfos = CppModelManager::instance()->projectInfos(); foreach (const ProjectInfo &projectInfo, projectInfos) - registerProjectsParts(projectInfo.projectParts()); + projectPartsUpdated(projectInfo.projectParts()); } void BackendCommunicator::restoreCppEditorDocuments() { resetCppEditorDocumentProcessors(); - registerVisibleCppEditorDocumentAndMarkInvisibleDirty(); + CppTools::CppModelManager::instance()->updateCppEditorDocuments(); } void BackendCommunicator::resetCppEditorDocumentProcessors() @@ -273,12 +277,7 @@ void BackendCommunicator::resetCppEditorDocumentProcessors() cppEditorDocument->resetProcessor(); } -void BackendCommunicator::registerVisibleCppEditorDocumentAndMarkInvisibleDirty() -{ - CppTools::CppModelManager::instance()->updateCppEditorDocuments(); -} - -void BackendCommunicator::registerCurrentCodeModelUiHeaders() +void BackendCommunicator::unsavedFilesUpdatedForUiHeaders() { using namespace CppTools; @@ -286,53 +285,55 @@ void BackendCommunicator::registerCurrentCodeModelUiHeaders() foreach (const AbstractEditorSupport *es, editorSupports) { const QString mappedPath = ModelManagerSupportClang::instance()->dummyUiHeaderOnDiskPath(es->fileName()); - updateUnsavedFile(mappedPath, es->contents(), es->revision()); + unsavedFilesUpdated(mappedPath, es->contents(), es->revision()); } } -void BackendCommunicator::registerProjectsParts(const QVector projectParts) +void BackendCommunicator::projectPartsUpdated(const QVector projectParts) { const auto projectPartContainers = toProjectPartContainers(projectParts); - registerProjectPartsForEditor(projectPartContainers); + projectPartsUpdated(projectPartContainers); } -void BackendCommunicator::updateTranslationUnitFromCppEditorDocument(const QString &filePath) +void BackendCommunicator::documentsChangedFromCppEditorDocument(const QString &filePath) { const CppTools::CppEditorDocumentHandle *document = ClangCodeModel::Utils::cppDocument(filePath); - updateTranslationUnit(filePath, document->contents(), document->revision()); + documentsChanged(filePath, document->contents(), document->revision()); } -void BackendCommunicator::updateUnsavedFileFromCppEditorDocument(const QString &filePath) +void BackendCommunicator::unsavedFielsUpdatedFromCppEditorDocument(const QString &filePath) { const CppTools::CppEditorDocumentHandle *document = ClangCodeModel::Utils::cppDocument(filePath); - updateUnsavedFile(filePath, document->contents(), document->revision()); + unsavedFilesUpdated(filePath, document->contents(), document->revision()); } -void BackendCommunicator::updateTranslationUnit(const QString &filePath, - const QByteArray &contents, - uint documentRevision) +void BackendCommunicator::documentsChanged(const QString &filePath, + const QByteArray &contents, + uint documentRevision) { const bool hasUnsavedContent = true; - updateTranslationUnitsForEditor({{filePath, - Utf8String(), - Utf8String::fromByteArray(contents), - hasUnsavedContent, - documentRevision}}); + documentsChanged({{filePath, + Utf8String(), + Utf8String::fromByteArray(contents), + hasUnsavedContent, + documentRevision}}); } -void BackendCommunicator::updateUnsavedFile(const QString &filePath, const QByteArray &contents, uint documentRevision) +void BackendCommunicator::unsavedFilesUpdated(const QString &filePath, + const QByteArray &contents, + uint documentRevision) { const bool hasUnsavedContent = true; // TODO: Send new only if changed - registerUnsavedFilesForEditor({{filePath, - Utf8String(), - Utf8String::fromByteArray(contents), - hasUnsavedContent, - documentRevision}}); + unsavedFilesUpdated({{filePath, + Utf8String(), + Utf8String::fromByteArray(contents), + hasUnsavedContent, + documentRevision}}); } static bool documentHasChanged(const QString &filePath, uint revision) @@ -349,19 +350,19 @@ static void setLastSentDocumentRevision(const QString &filePath, uint revision) document->sendTracker().setLastSentRevision(int(revision)); } -void BackendCommunicator::updateTranslationUnitWithRevisionCheck(const FileContainer &fileContainer) +void BackendCommunicator::documentsChangedWithRevisionCheck(const FileContainer &fileContainer) { if (documentHasChanged(fileContainer.filePath, fileContainer.documentRevision)) { - updateTranslationUnitsForEditor({fileContainer}); + documentsChanged({fileContainer}); setLastSentDocumentRevision(fileContainer.filePath, fileContainer.documentRevision); } } -void BackendCommunicator::requestDocumentAnnotations(const FileContainer &fileContainer) +void BackendCommunicator::requestAnnotations(const FileContainer &fileContainer) { - const RequestDocumentAnnotationsMessage message(fileContainer); - m_sender->requestDocumentAnnotations(message); + const RequestAnnotationsMessage message(fileContainer); + m_sender->requestAnnotations(message); } QFuture BackendCommunicator::requestReferences( @@ -401,24 +402,22 @@ QFuture BackendCommunicator::requestFollowSymbol( quint32 line, quint32 column) { - const RequestFollowSymbolMessage message(curFileContainer, - line, - column); + const RequestFollowSymbolMessage message(curFileContainer, line, column); m_sender->requestFollowSymbol(message); return m_receiver.addExpectedRequestFollowSymbolMessage(message.ticketNumber); } -void BackendCommunicator::updateTranslationUnitWithRevisionCheck(Core::IDocument *document) +void BackendCommunicator::documentsChangedWithRevisionCheck(Core::IDocument *document) { const auto textDocument = qobject_cast(document); const auto filePath = textDocument->filePath().toString(); const QString projectPartId = CppTools::CppToolsBridge::projectPartIdForFile(filePath); - updateTranslationUnitWithRevisionCheck(FileContainer(filePath, - projectPartId, - Utf8StringVector(), - textDocument->document()->revision())); + documentsChangedWithRevisionCheck(FileContainer(filePath, + projectPartId, + Utf8StringVector(), + textDocument->document()->revision())); } void BackendCommunicator::updateChangeContentStartPosition(const QString &filePath, int position) @@ -427,23 +426,23 @@ void BackendCommunicator::updateChangeContentStartPosition(const QString &filePa document->sendTracker().applyContentChange(position); } -void BackendCommunicator::updateTranslationUnitIfNotCurrentDocument(Core::IDocument *document) +void BackendCommunicator::documentsChangedIfNotCurrentDocument(Core::IDocument *document) { QTC_ASSERT(document, return); if (Core::EditorManager::currentDocument() != document) - updateTranslationUnit(document); + documentsChanged(document); } -void BackendCommunicator::updateTranslationUnit(Core::IDocument *document) +void BackendCommunicator::documentsChanged(Core::IDocument *document) { - updateTranslationUnitFromCppEditorDocument(document->filePath().toString()); + documentsChangedFromCppEditorDocument(document->filePath().toString()); } -void BackendCommunicator::updateUnsavedFile(Core::IDocument *document) +void BackendCommunicator::unsavedFilesUpdated(Core::IDocument *document) { QTC_ASSERT(document, return); - updateUnsavedFileFromCppEditorDocument(document->filePath().toString()); + unsavedFielsUpdatedFromCppEditorDocument(document->filePath().toString()); } void BackendCommunicator::onConnectedToBackend() @@ -511,70 +510,74 @@ void BackendCommunicator::logError(const QString &text) void BackendCommunicator::initializeBackendWithCurrentData() { - registerFallbackProjectPart(); - registerCurrentProjectParts(); - registerCurrentCodeModelUiHeaders(); + projectPartsUpdatedForFallback(); + projectPartsUpdatedForCurrentProjects(); + unsavedFilesUpdatedForUiHeaders(); restoreCppEditorDocuments(); - updateTranslationUnitVisiblity(); + documentVisibilityChanged(); } -void BackendCommunicator::registerTranslationUnitsForEditor(const FileContainers &fileContainers) +void BackendCommunicator::documentsOpened(const FileContainers &fileContainers) { - const RegisterTranslationUnitForEditorMessage message(fileContainers, - currentCppEditorDocumentFilePath(), - visibleCppEditorDocumentsFilePaths()); - m_sender->registerTranslationUnitsForEditor(message); + const DocumentsOpenedMessage message(fileContainers, + currentCppEditorDocumentFilePath(), + visibleCppEditorDocumentsFilePaths()); + m_sender->documentsOpened(message); } -void BackendCommunicator::updateTranslationUnitsForEditor(const FileContainers &fileContainers) +void BackendCommunicator::documentsChanged(const FileContainers &fileContainers) { - const UpdateTranslationUnitsForEditorMessage message(fileContainers); - m_sender->updateTranslationUnitsForEditor(message); + const DocumentsChangedMessage message(fileContainers); + m_sender->documentsChanged(message); } -void BackendCommunicator::unregisterTranslationUnitsForEditor(const FileContainers &fileContainers) +void BackendCommunicator::documentsClosed(const FileContainers &fileContainers) { - const UnregisterTranslationUnitsForEditorMessage message(fileContainers); - m_sender->unregisterTranslationUnitsForEditor(message); + const DocumentsClosedMessage message(fileContainers); + m_sender->documentsClosed(message); } -void BackendCommunicator::registerProjectPartsForEditor( +void BackendCommunicator::projectPartsUpdated( const ProjectPartContainers &projectPartContainers) { - const RegisterProjectPartsForEditorMessage message(projectPartContainers); - m_sender->registerProjectPartsForEditor(message); + const ProjectPartsUpdatedMessage message(projectPartContainers); + m_sender->projectPartsUpdated(message); } -void BackendCommunicator::unregisterProjectPartsForEditor(const QStringList &projectPartIds) +void BackendCommunicator::projectPartsRemoved(const QStringList &projectPartIds) { - const UnregisterProjectPartsForEditorMessage message((Utf8StringVector(projectPartIds))); - m_sender->unregisterProjectPartsForEditor(message); + const ProjectPartsRemovedMessage message((Utf8StringVector(projectPartIds))); + m_sender->projectPartsRemoved(message); } -void BackendCommunicator::registerUnsavedFilesForEditor(const FileContainers &fileContainers) +void BackendCommunicator::unsavedFilesUpdated(const FileContainers &fileContainers) { - const RegisterUnsavedFilesForEditorMessage message(fileContainers); - m_sender->registerUnsavedFilesForEditor(message); + const UnsavedFilesUpdatedMessage message(fileContainers); + m_sender->unsavedFilesUpdated(message); } -void BackendCommunicator::unregisterUnsavedFilesForEditor(const FileContainers &fileContainers) +void BackendCommunicator::unsavedFilesRemoved(const FileContainers &fileContainers) { - const UnregisterUnsavedFilesForEditorMessage message(fileContainers); - m_sender->unregisterUnsavedFilesForEditor(message); + const UnsavedFilesRemovedMessage message(fileContainers); + m_sender->unsavedFilesRemoved(message); } -void BackendCommunicator::completeCode(ClangCompletionAssistProcessor *assistProcessor, - const QString &filePath, - quint32 line, - quint32 column, - const QString &projectFilePath, - qint32 funcNameStartLine, - qint32 funcNameStartColumn) +void BackendCommunicator::requestCompletions(ClangCompletionAssistProcessor *assistProcessor, + const QString &filePath, + quint32 line, + quint32 column, + const QString &projectFilePath, + qint32 funcNameStartLine, + qint32 funcNameStartColumn) { - const CompleteCodeMessage message(filePath, line, column, projectFilePath, funcNameStartLine, - funcNameStartColumn); - m_sender->completeCode(message); - m_receiver.addExpectedCodeCompletedMessage(message.ticketNumber, assistProcessor); + const RequestCompletionsMessage message(filePath, + line, + column, + projectFilePath, + funcNameStartLine, + funcNameStartColumn); + m_sender->requestCompletions(message); + m_receiver.addExpectedCompletionsMessage(message.ticketNumber, assistProcessor); } } // namespace Internal diff --git a/src/plugins/clangcodemodel/clangbackendcommunicator.h b/src/plugins/clangcodemodel/clangbackendcommunicator.h index 941126c7c71..568a68f0979 100644 --- a/src/plugins/clangcodemodel/clangbackendcommunicator.h +++ b/src/plugins/clangcodemodel/clangbackendcommunicator.h @@ -63,14 +63,40 @@ public: BackendCommunicator(); ~BackendCommunicator(); - void registerTranslationUnitsForEditor(const FileContainers &fileContainers); - void updateTranslationUnitsForEditor(const FileContainers &fileContainers); - void unregisterTranslationUnitsForEditor(const FileContainers &fileContainers); - void registerProjectPartsForEditor(const ProjectPartContainers &projectPartContainers); - void unregisterProjectPartsForEditor(const QStringList &projectPartIds); - void registerUnsavedFilesForEditor(const FileContainers &fileContainers); - void unregisterUnsavedFilesForEditor(const FileContainers &fileContainers); - void requestDocumentAnnotations(const ClangBackEnd::FileContainer &fileContainer); + void documentsOpened(const FileContainers &fileContainers); + void documentsChanged(Core::IDocument *document); + void documentsChanged(const QString &filePath, + const QByteArray &contents, + uint documentRevision); + void documentsChanged(const FileContainers &fileContainers); + void documentsChangedFromCppEditorDocument(const QString &filePath); + void documentsChangedIfNotCurrentDocument(Core::IDocument *document); + void documentsChangedWithRevisionCheck(const ClangBackEnd::FileContainer &fileContainer); + void documentsChangedWithRevisionCheck(Core::IDocument *document); + void documentsClosed(const FileContainers &fileContainers); + void documentVisibilityChanged(); + + void projectPartsUpdated(const QVector projectParts); + void projectPartsUpdated(const ProjectPartContainers &projectPartContainers); + void projectPartsUpdatedForFallback(); + void projectPartsRemoved(const QStringList &projectPartIds); + + void unsavedFilesUpdated(Core::IDocument *document); + void unsavedFilesUpdated(const QString &filePath, + const QByteArray &contents, + uint documentRevision); + void unsavedFilesUpdated(const FileContainers &fileContainers); + void unsavedFielsUpdatedFromCppEditorDocument(const QString &filePath); + void unsavedFilesRemoved(const FileContainers &fileContainers); + + void requestCompletions(ClangCompletionAssistProcessor *assistProcessor, + const QString &filePath, + quint32 line, + quint32 column, + const QString &projectFilePath, + qint32 funcNameStartLine = -1, + qint32 funcNameStartColumn = -1); + void requestAnnotations(const ClangBackEnd::FileContainer &fileContainer); QFuture requestReferences( const FileContainer &fileContainer, quint32 line, @@ -86,39 +112,17 @@ public: QFuture requestFollowSymbol(const FileContainer &curFileContainer, quint32 line, quint32 column); - void completeCode(ClangCompletionAssistProcessor *assistProcessor, const QString &filePath, - quint32 line, - quint32 column, - const QString &projectFilePath, - qint32 funcNameStartLine = -1, - qint32 funcNameStartColumn = -1); - void registerProjectsParts(const QVector projectParts); - - void updateTranslationUnitIfNotCurrentDocument(Core::IDocument *document); - void updateTranslationUnit(Core::IDocument *document); - void updateUnsavedFile(Core::IDocument *document); - void updateTranslationUnitFromCppEditorDocument(const QString &filePath); - void updateUnsavedFileFromCppEditorDocument(const QString &filePath); - void updateTranslationUnit(const QString &filePath, const QByteArray &contents, uint documentRevision); - void updateUnsavedFile(const QString &filePath, const QByteArray &contents, uint documentRevision); - void updateTranslationUnitWithRevisionCheck(const ClangBackEnd::FileContainer &fileContainer); - void updateTranslationUnitWithRevisionCheck(Core::IDocument *document); void updateChangeContentStartPosition(const QString &filePath, int position); - - void registerFallbackProjectPart(); - void updateTranslationUnitVisiblity(); - bool isNotWaitingForCompletion() const; private: void initializeBackend(); void initializeBackendWithCurrentData(); - void registerCurrentProjectParts(); + void projectPartsUpdatedForCurrentProjects(); void restoreCppEditorDocuments(); void resetCppEditorDocumentProcessors(); - void registerVisibleCppEditorDocumentAndMarkInvisibleDirty(); - void registerCurrentCodeModelUiHeaders(); + void unsavedFilesUpdatedForUiHeaders(); void setupDummySender(); @@ -131,8 +135,8 @@ private: void logStartTimeOut(); void logError(const QString &text); - void updateTranslationUnitVisiblity(const Utf8String ¤tEditorFilePath, - const Utf8StringVector &visibleEditorsFilePaths); + void documentVisibilityChanged(const Utf8String ¤tEditorFilePath, + const Utf8StringVector &visibleEditorsFilePaths); private: BackendReceiver m_receiver; diff --git a/src/plugins/clangcodemodel/clangbackendreceiver.cpp b/src/plugins/clangcodemodel/clangbackendreceiver.cpp index b957ff1b08e..2a2792b921d 100644 --- a/src/plugins/clangcodemodel/clangbackendreceiver.cpp +++ b/src/plugins/clangcodemodel/clangbackendreceiver.cpp @@ -77,7 +77,7 @@ void BackendReceiver::setAliveHandler(const BackendReceiver::AliveHandler &handl m_aliveHandler = handler; } -void BackendReceiver::addExpectedCodeCompletedMessage( +void BackendReceiver::addExpectedCompletionsMessage( quint64 ticket, ClangCompletionAssistProcessor *processor) { @@ -138,7 +138,7 @@ QFuture BackendReceiver::addExpectedToolTipMessage(quint6 return futureInterface.future(); } -bool BackendReceiver::isExpectingCodeCompletedMessage() const +bool BackendReceiver::isExpectingCompletionsMessage() const { return !m_assistProcessorsTable.isEmpty(); } @@ -180,9 +180,9 @@ void BackendReceiver::echo(const EchoMessage &message) qCDebugIpc() << message; } -void BackendReceiver::codeCompleted(const CodeCompletedMessage &message) +void BackendReceiver::completions(const CompletionsMessage &message) { - qCDebugIpc() << "CodeCompletedMessage with" << message.codeCompletions.size() + qCDebugIpc() << "CompletionsMessage with" << message.codeCompletions.size() << "items"; const quint64 ticket = message.ticketNumber; @@ -193,9 +193,9 @@ void BackendReceiver::codeCompleted(const CodeCompletedMessage &message) } } -void BackendReceiver::documentAnnotationsChanged(const DocumentAnnotationsChangedMessage &message) +void BackendReceiver::annotations(const AnnotationsMessage &message) { - qCDebugIpc() << "DocumentAnnotationsChangedMessage with" + qCDebugIpc() << "AnnotationsMessage with" << message.diagnostics.size() << "diagnostics" << message.tokenInfos.size() << "highlighting marks" << message.skippedPreprocessorRanges.size() << "skipped preprocessor ranges"; diff --git a/src/plugins/clangcodemodel/clangbackendreceiver.h b/src/plugins/clangcodemodel/clangbackendreceiver.h index c3d6fb3bbf3..f02541d3119 100644 --- a/src/plugins/clangcodemodel/clangbackendreceiver.h +++ b/src/plugins/clangcodemodel/clangbackendreceiver.h @@ -51,7 +51,7 @@ public: using AliveHandler = std::function; void setAliveHandler(const AliveHandler &handler); - void addExpectedCodeCompletedMessage(quint64 ticket, ClangCompletionAssistProcessor *processor); + void addExpectedCompletionsMessage(quint64 ticket, ClangCompletionAssistProcessor *processor); void deleteProcessorsOfEditorWidget(TextEditor::TextEditorWidget *textEditorWidget); QFuture @@ -60,16 +60,16 @@ public: = CppTools::SemanticInfo::LocalUseMap()); QFuture addExpectedRequestFollowSymbolMessage(quint64 ticket); QFuture addExpectedToolTipMessage(quint64 ticket); - bool isExpectingCodeCompletedMessage() const; + bool isExpectingCompletionsMessage() const; void reset(); private: void alive() override; void echo(const ClangBackEnd::EchoMessage &message) override; - void codeCompleted(const ClangBackEnd::CodeCompletedMessage &message) override; + void completions(const ClangBackEnd::CompletionsMessage &message) override; - void documentAnnotationsChanged(const ClangBackEnd::DocumentAnnotationsChangedMessage &message) override; + void annotations(const ClangBackEnd::AnnotationsMessage &message) override; void references(const ClangBackEnd::ReferencesMessage &message) override; void tooltip(const ClangBackEnd::ToolTipMessage &message) override; void followSymbol(const ClangBackEnd::FollowSymbolMessage &message) override; diff --git a/src/plugins/clangcodemodel/clangbackendsender.cpp b/src/plugins/clangcodemodel/clangbackendsender.cpp index 4dee88e576d..a99852bfc43 100644 --- a/src/plugins/clangcodemodel/clangbackendsender.cpp +++ b/src/plugins/clangcodemodel/clangbackendsender.cpp @@ -50,67 +50,67 @@ void BackendSender::end() m_connection->sendEndMessage(); } -void BackendSender::registerTranslationUnitsForEditor(const RegisterTranslationUnitForEditorMessage &message) +void BackendSender::documentsOpened(const DocumentsOpenedMessage &message) { QTC_CHECK(m_connection->isConnected()); qCDebugIpc() << message; - m_connection->serverProxy().registerTranslationUnitsForEditor(message); + m_connection->serverProxy().documentsOpened(message); } -void BackendSender::updateTranslationUnitsForEditor(const UpdateTranslationUnitsForEditorMessage &message) +void BackendSender::documentsChanged(const DocumentsChangedMessage &message) { QTC_CHECK(m_connection->isConnected()); qCDebugIpc() << message; - m_connection->serverProxy().updateTranslationUnitsForEditor(message); + m_connection->serverProxy().documentsChanged(message); } -void BackendSender::unregisterTranslationUnitsForEditor(const UnregisterTranslationUnitsForEditorMessage &message) +void BackendSender::documentsClosed(const DocumentsClosedMessage &message) { QTC_CHECK(m_connection->isConnected()); qCDebugIpc() << message; - m_connection->serverProxy().unregisterTranslationUnitsForEditor(message); + m_connection->serverProxy().documentsClosed(message); } -void BackendSender::registerProjectPartsForEditor(const RegisterProjectPartsForEditorMessage &message) +void BackendSender::projectPartsUpdated(const ProjectPartsUpdatedMessage &message) { QTC_CHECK(m_connection->isConnected()); qCDebugIpc() << message; - m_connection->serverProxy().registerProjectPartsForEditor(message); + m_connection->serverProxy().projectPartsUpdated(message); } -void BackendSender::unregisterProjectPartsForEditor(const UnregisterProjectPartsForEditorMessage &message) +void BackendSender::projectPartsRemoved(const ProjectPartsRemovedMessage &message) { QTC_CHECK(m_connection->isConnected()); qCDebugIpc() << message; - m_connection->serverProxy().unregisterProjectPartsForEditor(message); + m_connection->serverProxy().projectPartsRemoved(message); } -void BackendSender::registerUnsavedFilesForEditor(const RegisterUnsavedFilesForEditorMessage &message) +void BackendSender::unsavedFilesUpdated(const UnsavedFilesUpdatedMessage &message) { QTC_CHECK(m_connection->isConnected()); qCDebugIpc() << message; - m_connection->serverProxy().registerUnsavedFilesForEditor(message); + m_connection->serverProxy().unsavedFilesUpdated(message); } -void BackendSender::unregisterUnsavedFilesForEditor(const UnregisterUnsavedFilesForEditorMessage &message) +void BackendSender::unsavedFilesRemoved(const UnsavedFilesRemovedMessage &message) { QTC_CHECK(m_connection->isConnected()); qCDebugIpc() << message; - m_connection->serverProxy().unregisterUnsavedFilesForEditor(message); + m_connection->serverProxy().unsavedFilesRemoved(message); } -void BackendSender::completeCode(const CompleteCodeMessage &message) +void BackendSender::requestCompletions(const RequestCompletionsMessage &message) { QTC_CHECK(m_connection->isConnected()); qCDebugIpc() << message; - m_connection->serverProxy().completeCode(message); + m_connection->serverProxy().requestCompletions(message); } -void BackendSender::requestDocumentAnnotations(const RequestDocumentAnnotationsMessage &message) +void BackendSender::requestAnnotations(const RequestAnnotationsMessage &message) { QTC_CHECK(m_connection->isConnected()); qCDebugIpc() << message; - m_connection->serverProxy().requestDocumentAnnotations(message); + m_connection->serverProxy().requestAnnotations(message); } void BackendSender::requestReferences(const RequestReferencesMessage &message) @@ -134,11 +134,11 @@ void BackendSender::requestFollowSymbol(const RequestFollowSymbolMessage &messag m_connection->serverProxy().requestFollowSymbol(message); } -void BackendSender::updateVisibleTranslationUnits(const UpdateVisibleTranslationUnitsMessage &message) +void BackendSender::documentVisibilityChanged(const DocumentVisibilityChangedMessage &message) { QTC_CHECK(m_connection->isConnected()); qCDebugIpc() << message; - m_connection->serverProxy().updateVisibleTranslationUnits(message); + m_connection->serverProxy().documentVisibilityChanged(message); } } // namespace Internal diff --git a/src/plugins/clangcodemodel/clangbackendsender.h b/src/plugins/clangcodemodel/clangbackendsender.h index 16776f7f105..86cd7d20b5e 100644 --- a/src/plugins/clangcodemodel/clangbackendsender.h +++ b/src/plugins/clangcodemodel/clangbackendsender.h @@ -38,19 +38,23 @@ public: BackendSender(ClangBackEnd::ClangCodeModelConnectionClient *connectionClient); void end() override; - void registerTranslationUnitsForEditor(const ClangBackEnd::RegisterTranslationUnitForEditorMessage &message) override; - void updateTranslationUnitsForEditor(const ClangBackEnd::UpdateTranslationUnitsForEditorMessage &message) override; - void unregisterTranslationUnitsForEditor(const ClangBackEnd::UnregisterTranslationUnitsForEditorMessage &message) override; - void registerProjectPartsForEditor(const ClangBackEnd::RegisterProjectPartsForEditorMessage &message) override; - void unregisterProjectPartsForEditor(const ClangBackEnd::UnregisterProjectPartsForEditorMessage &message) override; - void registerUnsavedFilesForEditor(const ClangBackEnd::RegisterUnsavedFilesForEditorMessage &message) override; - void unregisterUnsavedFilesForEditor(const ClangBackEnd::UnregisterUnsavedFilesForEditorMessage &message) override; - void completeCode(const ClangBackEnd::CompleteCodeMessage &message) override; - void requestDocumentAnnotations(const ClangBackEnd::RequestDocumentAnnotationsMessage &message) override; + + void documentsOpened(const ClangBackEnd::DocumentsOpenedMessage &message) override; + void documentsChanged(const ClangBackEnd::DocumentsChangedMessage &message) override; + void documentsClosed(const ClangBackEnd::DocumentsClosedMessage &message) override; + void documentVisibilityChanged(const ClangBackEnd::DocumentVisibilityChangedMessage &message) override; + + void projectPartsUpdated(const ClangBackEnd::ProjectPartsUpdatedMessage &message) override; + void projectPartsRemoved(const ClangBackEnd::ProjectPartsRemovedMessage &message) override; + + void unsavedFilesUpdated(const ClangBackEnd::UnsavedFilesUpdatedMessage &message) override; + void unsavedFilesRemoved(const ClangBackEnd::UnsavedFilesRemovedMessage &message) override; + + void requestCompletions(const ClangBackEnd::RequestCompletionsMessage &message) override; + void requestAnnotations(const ClangBackEnd::RequestAnnotationsMessage &message) override; void requestReferences(const ClangBackEnd::RequestReferencesMessage &message) override; void requestToolTip(const ClangBackEnd::RequestToolTipMessage &message) override; void requestFollowSymbol(const ClangBackEnd::RequestFollowSymbolMessage &message) override; - void updateVisibleTranslationUnits(const ClangBackEnd::UpdateVisibleTranslationUnitsMessage &message) override; private: ClangBackEnd::ClangCodeModelConnectionClient *m_connection = nullptr; diff --git a/src/plugins/clangcodemodel/clangcompletionassistprocessor.cpp b/src/plugins/clangcodemodel/clangcompletionassistprocessor.cpp index 4cae74725cc..974b2d3e86a 100644 --- a/src/plugins/clangcodemodel/clangcompletionassistprocessor.cpp +++ b/src/plugins/clangcodemodel/clangcompletionassistprocessor.cpp @@ -494,11 +494,11 @@ void ClangCompletionAssistProcessor::sendFileContent(const QByteArray &customFil const UnsavedFileContentInfo info = unsavedFileContent(customFileContent); BackendCommunicator &communicator = m_interface->communicator(); - communicator.updateTranslationUnitsForEditor({{m_interface->fileName(), - Utf8String(), - Utf8String::fromByteArray(info.unsavedContent), - info.isDocumentModified, - uint(m_interface->textDocument()->revision())}}); + communicator.documentsChanged({{m_interface->fileName(), + Utf8String(), + Utf8String::fromByteArray(info.unsavedContent), + info.isDocumentModified, + uint(m_interface->textDocument()->revision())}}); } namespace { bool shouldSendDocumentForCompletion(const QString &filePath, @@ -577,9 +577,13 @@ bool ClangCompletionAssistProcessor::sendCompletionRequest(int position, const Position cursorPosition = extractLineColumn(position); const Position functionNameStart = extractLineColumn(functionNameStartPosition); const QString projectPartId = CppTools::CppToolsBridge::projectPartIdForFile(filePath); - communicator.completeCode(this, filePath, uint(cursorPosition.line), - uint(cursorPosition.column), projectPartId, - functionNameStart.line, functionNameStart.column); + communicator.requestCompletions(this, + filePath, + uint(cursorPosition.line), + uint(cursorPosition.column), + projectPartId, + functionNameStart.line, + functionNameStart.column); setLastCompletionPosition(filePath, position); return true; } diff --git a/src/plugins/clangcodemodel/clangeditordocumentprocessor.cpp b/src/plugins/clangcodemodel/clangeditordocumentprocessor.cpp index 91bbbc5f0f6..a9f421d9d59 100644 --- a/src/plugins/clangcodemodel/clangeditordocumentprocessor.cpp +++ b/src/plugins/clangcodemodel/clangeditordocumentprocessor.cpp @@ -88,7 +88,7 @@ ClangEditorDocumentProcessor::ClangEditorDocumentProcessor( m_updateTranslationUnitTimer.setSingleShot(true); m_updateTranslationUnitTimer.setInterval(350); connect(&m_updateTranslationUnitTimer, &QTimer::timeout, - this, &ClangEditorDocumentProcessor::updateTranslationUnitIfProjectPartExists); + this, &ClangEditorDocumentProcessor::updateBackendDocumentIfProjectPartExists); connect(m_parser.data(), &ClangEditorDocumentParser::projectPartInfoUpdated, this, &BaseEditorDocumentProcessor::projectPartInfoUpdated); @@ -109,7 +109,7 @@ ClangEditorDocumentProcessor::~ClangEditorDocumentProcessor() m_parserWatcher.waitForFinished(); if (m_projectPart) - unregisterTranslationUnitForEditor(); + closeBackendDocument(); } void ClangEditorDocumentProcessor::runImpl( @@ -143,7 +143,7 @@ void ClangEditorDocumentProcessor::semanticRehighlight() m_semanticHighlighter.updateFormatMapFromFontSettings(); if (m_projectPart) - requestDocumentAnnotations(m_projectPart->id()); + requestAnnotationsFromBackend(m_projectPart->id()); } CppTools::SemanticInfo ClangEditorDocumentProcessor::recalculateSemanticInfo() @@ -427,12 +427,12 @@ static bool isProjectPartLoadedOrIsFallback(CppTools::ProjectPart::Ptr projectPa && (projectPart->id().isEmpty() || ClangCodeModel::Utils::isProjectPartLoaded(projectPart)); } -void ClangEditorDocumentProcessor::updateProjectPartAndTranslationUnitForEditor() +void ClangEditorDocumentProcessor::updateBackendProjectPartAndDocument() { const CppTools::ProjectPart::Ptr projectPart = m_parser->projectPartInfo().projectPart; if (isProjectPartLoadedOrIsFallback(projectPart)) { - registerTranslationUnitForEditor(*projectPart.data()); + updateBackendDocument(*projectPart.data()); m_projectPart = projectPart; m_isProjectFile = m_parser->projectPartInfo().hints @@ -445,7 +445,7 @@ void ClangEditorDocumentProcessor::onParserFinished() if (revision() != m_parserRevision) return; - updateProjectPartAndTranslationUnitForEditor(); + updateBackendProjectPartAndDocument(); } namespace { @@ -592,7 +592,7 @@ private: }; } // namespace -void ClangEditorDocumentProcessor::registerTranslationUnitForEditor( +void ClangEditorDocumentProcessor::updateBackendDocument( CppTools::ProjectPart &projectPart) { // On registration we send the document content immediately as an unsaved @@ -611,32 +611,31 @@ void ClangEditorDocumentProcessor::registerTranslationUnitForEditor( const FileOptionsBuilder fileOptions(filePath(), projectPart); m_diagnosticConfigId = fileOptions.diagnosticConfigId(); - m_communicator.registerTranslationUnitsForEditor( + m_communicator.documentsOpened( {fileContainerWithOptionsAndDocumentContent(projectPart, fileOptions.options())}); ClangCodeModel::Utils::setLastSentDocumentRevision(filePath(), revision()); } -void ClangEditorDocumentProcessor::unregisterTranslationUnitForEditor() +void ClangEditorDocumentProcessor::closeBackendDocument() { QTC_ASSERT(m_projectPart, return); - m_communicator.unregisterTranslationUnitsForEditor( - {ClangBackEnd::FileContainer(filePath(), m_projectPart->id())}); + m_communicator.documentsClosed({ClangBackEnd::FileContainer(filePath(), m_projectPart->id())}); } -void ClangEditorDocumentProcessor::updateTranslationUnitIfProjectPartExists() +void ClangEditorDocumentProcessor::updateBackendDocumentIfProjectPartExists() { if (m_projectPart) { - const ClangBackEnd::FileContainer fileContainer = fileContainerWithDocumentContent(m_projectPart->id()); - - m_communicator.updateTranslationUnitWithRevisionCheck(fileContainer); + const ClangBackEnd::FileContainer fileContainer = fileContainerWithDocumentContent( + m_projectPart->id()); + m_communicator.documentsChangedWithRevisionCheck(fileContainer); } } -void ClangEditorDocumentProcessor::requestDocumentAnnotations(const QString &projectpartId) +void ClangEditorDocumentProcessor::requestAnnotationsFromBackend(const QString &projectpartId) { const auto fileContainer = fileContainerWithDocumentContent(projectpartId); - m_communicator.requestDocumentAnnotations(fileContainer); + m_communicator.requestAnnotations(fileContainer); } CppTools::BaseEditorDocumentProcessor::HeaderErrorDiagnosticWidgetCreator diff --git a/src/plugins/clangcodemodel/clangeditordocumentprocessor.h b/src/plugins/clangcodemodel/clangeditordocumentprocessor.h index cf4f1e51ed2..5514305a3a3 100644 --- a/src/plugins/clangcodemodel/clangeditordocumentprocessor.h +++ b/src/plugins/clangcodemodel/clangeditordocumentprocessor.h @@ -97,7 +97,7 @@ public: int line, int column) override; - void unregisterTranslationUnitForEditor(); + void closeBackendDocument(); void clearDiagnosticsWithFixIts(); @@ -114,10 +114,12 @@ signals: private: void onParserFinished(); - void updateProjectPartAndTranslationUnitForEditor(); - void registerTranslationUnitForEditor(CppTools::ProjectPart &projectPart); - void updateTranslationUnitIfProjectPartExists(); - void requestDocumentAnnotations(const QString &projectpartId); + + void updateBackendProjectPartAndDocument(); + void updateBackendDocument(CppTools::ProjectPart &projectPart); + void updateBackendDocumentIfProjectPartExists(); + void requestAnnotationsFromBackend(const QString &projectpartId); + HeaderErrorDiagnosticWidgetCreator creatorForHeaderErrorDiagnosticWidget( const ClangBackEnd::DiagnosticContainer &firstHeaderErrorDiagnostic); ClangBackEnd::FileContainer simpleFileContainer(const QByteArray &codecName = QByteArray()) const; diff --git a/src/plugins/clangcodemodel/clangmodelmanagersupport.cpp b/src/plugins/clangcodemodel/clangmodelmanagersupport.cpp index d396d0f94a7..46527706ee7 100644 --- a/src/plugins/clangcodemodel/clangmodelmanagersupport.cpp +++ b/src/plugins/clangcodemodel/clangmodelmanagersupport.cpp @@ -49,9 +49,9 @@ #include #include -#include #include #include +#include #include #include @@ -108,7 +108,7 @@ ModelManagerSupportClang::ModelManagerSupportClang() connect(settings, &CppTools::CppCodeModelSettings::clangDiagnosticConfigsInvalidated, this, &ModelManagerSupportClang::onDiagnosticConfigsInvalidated); - m_communicator.registerFallbackProjectPart(); + m_communicator.projectPartsUpdatedForFallback(); } ModelManagerSupportClang::~ModelManagerSupportClang() @@ -150,7 +150,7 @@ CppTools::BaseEditorDocumentProcessor *ModelManagerSupportClang::createEditorDoc void ModelManagerSupportClang::onCurrentEditorChanged(Core::IEditor *editor) { - m_communicator.updateTranslationUnitVisiblity(); + m_communicator.documentVisibilityChanged(); // Update task hub issues for current CppEditorDocument ClangEditorDocumentProcessor::clearTaskHubIssues(); @@ -232,7 +232,7 @@ void ModelManagerSupportClang::onEditorOpened(Core::IEditor *editor) void ModelManagerSupportClang::onEditorClosed(const QList &) { - m_communicator.updateTranslationUnitVisiblity(); + m_communicator.documentVisibilityChanged(); } void ModelManagerSupportClang::onCppDocumentAboutToReloadOnTranslationUnit() @@ -247,7 +247,7 @@ void ModelManagerSupportClang::onCppDocumentReloadFinishedOnTranslationUnit(bool if (success) { TextEditor::TextDocument *textDocument = qobject_cast(sender()); connectToTextDocumentContentsChangedForTranslationUnit(textDocument); - m_communicator.updateTranslationUnitWithRevisionCheck(textDocument); + m_communicator.documentsChangedWithRevisionCheck(textDocument); } } @@ -268,7 +268,7 @@ void ModelManagerSupportClang::onCppDocumentContentsChangedOnTranslationUnit(int m_communicator.updateChangeContentStartPosition(document->filePath().toString(), position); - m_communicator.updateTranslationUnitIfNotCurrentDocument(document); + m_communicator.documentsChangedIfNotCurrentDocument(document); clearDiagnosticFixIts(document->filePath().toString()); } @@ -285,14 +285,14 @@ void ModelManagerSupportClang::onCppDocumentReloadFinishedOnUnsavedFile(bool suc if (success) { TextEditor::TextDocument *textDocument = qobject_cast(sender()); connectToTextDocumentContentsChangedForUnsavedFile(textDocument); - m_communicator.updateUnsavedFile(textDocument); + m_communicator.unsavedFilesUpdated(textDocument); } } void ModelManagerSupportClang::onCppDocumentContentsChangedOnUnsavedFile() { Core::IDocument *document = qobject_cast(sender()); - m_communicator.updateUnsavedFile(document); + m_communicator.unsavedFilesUpdated(document); } void ModelManagerSupportClang::onAbstractEditorSupportContentsUpdated(const QString &filePath, @@ -301,7 +301,7 @@ void ModelManagerSupportClang::onAbstractEditorSupportContentsUpdated(const QStr QTC_ASSERT(!filePath.isEmpty(), return); const QString mappedPath = m_uiHeaderOnDiskManager.createIfNeeded(filePath); - m_communicator.updateUnsavedFile(mappedPath, content, 0); + m_communicator.unsavedFilesUpdated(mappedPath, content, 0); } void ModelManagerSupportClang::onAbstractEditorSupportRemoved(const QString &filePath) @@ -311,7 +311,7 @@ void ModelManagerSupportClang::onAbstractEditorSupportRemoved(const QString &fil if (!cppModelManager()->cppEditorDocument(filePath)) { const QString mappedPath = m_uiHeaderOnDiskManager.remove(filePath); const QString projectPartId = Utils::projectPartIdForFile(filePath); - m_communicator.unregisterUnsavedFilesForEditor({{mappedPath, projectPartId}}); + m_communicator.unsavedFilesRemoved({{mappedPath, projectPartId}}); } } @@ -411,16 +411,16 @@ void ModelManagerSupportClang::onProjectPartsUpdated(ProjectExplorer::Project *p const CppTools::ProjectInfo projectInfo = cppModelManager()->projectInfo(project); QTC_ASSERT(projectInfo.isValid(), return); - m_communicator.registerProjectsParts(projectInfo.projectParts()); - m_communicator.registerFallbackProjectPart(); + m_communicator.projectPartsUpdated(projectInfo.projectParts()); + m_communicator.projectPartsUpdatedForFallback(); } void ModelManagerSupportClang::onProjectPartsRemoved(const QStringList &projectPartIds) { if (!projectPartIds.isEmpty()) { - unregisterTranslationUnitsWithProjectParts(projectPartIds); - m_communicator.unregisterProjectPartsForEditor(projectPartIds); - m_communicator.registerFallbackProjectPart(); + closeBackendDocumentsWithProjectParts(projectPartIds); + m_communicator.projectPartsRemoved(projectPartIds); + m_communicator.projectPartsUpdatedForFallback(); } } @@ -445,12 +445,12 @@ clangProcessorsWithProjectParts(const QStringList &projectPartIds) }); } -void ModelManagerSupportClang::unregisterTranslationUnitsWithProjectParts( +void ModelManagerSupportClang::closeBackendDocumentsWithProjectParts( const QStringList &projectPartIds) { const auto processors = clangProcessorsWithProjectParts(projectPartIds); foreach (ClangEditorDocumentProcessor *processor, processors) { - processor->unregisterTranslationUnitForEditor(); + processor->closeBackendDocument(); processor->clearProjectPart(); processor->run(); } diff --git a/src/plugins/clangcodemodel/clangmodelmanagersupport.h b/src/plugins/clangcodemodel/clangmodelmanagersupport.h index 3b62aae108f..db4e87bfcc2 100644 --- a/src/plugins/clangcodemodel/clangmodelmanagersupport.h +++ b/src/plugins/clangcodemodel/clangmodelmanagersupport.h @@ -109,7 +109,7 @@ private: void onDiagnosticConfigsInvalidated(const QVector &configIds); - void unregisterTranslationUnitsWithProjectParts(const QStringList &projectPartIds); + void closeBackendDocumentsWithProjectParts(const QStringList &projectPartIds); void connectTextDocumentToTranslationUnit(TextEditor::TextDocument *textDocument); void connectTextDocumentToUnsavedFiles(TextEditor::TextDocument *textDocument); diff --git a/src/tools/clangbackend/source/clangbackendclangipc-source.pri b/src/tools/clangbackend/source/clangbackendclangipc-source.pri index aad93688374..b3b88e7ac40 100644 --- a/src/tools/clangbackend/source/clangbackendclangipc-source.pri +++ b/src/tools/clangbackend/source/clangbackendclangipc-source.pri @@ -25,7 +25,7 @@ HEADERS += \ $$PWD/clangjobs.h \ $$PWD/clangparsesupportivetranslationunitjob.h \ $$PWD/clangreferencescollector.h \ - $$PWD/clangrequestdocumentannotationsjob.h \ + $$PWD/clangrequestannotationsjob.h \ $$PWD/clangrequestreferencesjob.h \ $$PWD/clangrequesttooltipjob.h \ $$PWD/clangresumedocumentjob.h \ @@ -38,8 +38,8 @@ HEADERS += \ $$PWD/clangtranslationunitupdater.h \ $$PWD/clangtype.h \ $$PWD/clangunsavedfilesshallowarguments.h \ - $$PWD/clangupdatedocumentannotationsjob.h \ - $$PWD/clangupdateextradocumentannotationsjob.h \ + $$PWD/clangupdateannotationsjob.h \ + $$PWD/clangupdateextraannotationsjob.h \ $$PWD/codecompleter.h \ $$PWD/codecompletionchunkconverter.h \ $$PWD/codecompletionsextractor.h \ @@ -84,7 +84,7 @@ SOURCES += \ $$PWD/clangparsesupportivetranslationunitjob.cpp \ $$PWD/clangresumedocumentjob.cpp \ $$PWD/clangreferencescollector.cpp \ - $$PWD/clangrequestdocumentannotationsjob.cpp \ + $$PWD/clangrequestannotationsjob.cpp \ $$PWD/clangrequestreferencesjob.cpp \ $$PWD/clangrequesttooltipjob.cpp \ $$PWD/clangsuspenddocumentjob.cpp \ @@ -95,8 +95,8 @@ SOURCES += \ $$PWD/clangtranslationunitupdater.cpp \ $$PWD/clangtype.cpp \ $$PWD/clangunsavedfilesshallowarguments.cpp \ - $$PWD/clangupdatedocumentannotationsjob.cpp \ - $$PWD/clangupdateextradocumentannotationsjob.cpp \ + $$PWD/clangupdateannotationsjob.cpp \ + $$PWD/clangupdateextraannotationsjob.cpp \ $$PWD/codecompleter.cpp \ $$PWD/codecompletionchunkconverter.cpp \ $$PWD/codecompletionsextractor.cpp \ diff --git a/src/tools/clangbackend/source/clangcodemodelserver.cpp b/src/tools/clangbackend/source/clangcodemodelserver.cpp index 34847139e3c..a9932ddb9a3 100644 --- a/src/tools/clangbackend/source/clangcodemodelserver.cpp +++ b/src/tools/clangbackend/source/clangcodemodelserver.cpp @@ -57,8 +57,8 @@ namespace ClangBackEnd { ClangCodeModelServer::ClangCodeModelServer() : documents(projects, unsavedFiles) { - updateDocumentAnnotationsTimer.setSingleShot(true); - QObject::connect(&updateDocumentAnnotationsTimer, + updateAnnotationsTimer.setSingleShot(true); + QObject::connect(&updateAnnotationsTimer, &QTimer::timeout, [this]() { processJobsForDirtyAndVisibleDocuments(); @@ -75,7 +75,7 @@ ClangCodeModelServer::ClangCodeModelServer() &ClangFileSystemWatcher::fileChanged, [this](const Utf8String &filePath) { if (!documents.hasDocumentWithFilePath(filePath)) - updateDocumentAnnotationsTimer.start(0); + updateAnnotationsTimer.start(0); }); } @@ -92,11 +92,10 @@ static std::vector operator+(const std::vector &a, return result; } -// TODO: Rename to createOrUpdate... -void ClangCodeModelServer::registerTranslationUnitsForEditor(const ClangBackEnd::RegisterTranslationUnitForEditorMessage &message) +void ClangCodeModelServer::documentsOpened(const ClangBackEnd::DocumentsOpenedMessage &message) { - qCDebug(serverLog) << "########## registerTranslationUnitsForEditor"; - TIME_SCOPE_DURATION("ClangCodeModelServer::registerTranslationUnitsForEditor"); + qCDebug(serverLog) << "########## documentsOpened"; + TIME_SCOPE_DURATION("ClangCodeModelServer::documentsOpened"); try { DocumentResetInfos toReset; @@ -115,14 +114,14 @@ void ClangCodeModelServer::registerTranslationUnitsForEditor(const ClangBackEnd: processSuspendResumeJobs(documents.documents()); processInitialJobsForDocuments(createdDocuments + resetDocuments_); } catch (const std::exception &exception) { - qWarning() << "Error in ClangCodeModelServer::registerTranslationUnitsForEditor:" << exception.what(); + qWarning() << "Error in ClangCodeModelServer::documentsOpened:" << exception.what(); } } -void ClangCodeModelServer::updateTranslationUnitsForEditor(const UpdateTranslationUnitsForEditorMessage &message) +void ClangCodeModelServer::documentsChanged(const DocumentsChangedMessage &message) { - qCDebug(serverLog) << "########## updateTranslationUnitsForEditor"; - TIME_SCOPE_DURATION("ClangCodeModelServer::updateTranslationUnitsForEditor"); + qCDebug(serverLog) << "########## documentsChanged"; + TIME_SCOPE_DURATION("ClangCodeModelServer::documentsChanged"); try { const auto newerFileContainers = documents.newerFileContainers(message.fileContainers); @@ -138,17 +137,17 @@ void ClangCodeModelServer::updateTranslationUnitsForEditor(const UpdateTranslati // Start the jobs on the next event loop iteration since otherwise // we might block the translation unit for a completion request // that comes right after this message. - updateDocumentAnnotationsTimer.start(0); + updateAnnotationsTimer.start(0); } } catch (const std::exception &exception) { - qWarning() << "Error in ClangCodeModelServer::updateTranslationUnitsForEditor:" << exception.what(); + qWarning() << "Error in ClangCodeModelServer::documentsChanged:" << exception.what(); } } -void ClangCodeModelServer::unregisterTranslationUnitsForEditor(const ClangBackEnd::UnregisterTranslationUnitsForEditorMessage &message) +void ClangCodeModelServer::documentsClosed(const ClangBackEnd::DocumentsClosedMessage &message) { - qCDebug(serverLog) << "########## unregisterTranslationUnitsForEditor"; - TIME_SCOPE_DURATION("ClangCodeModelServer::unregisterTranslationUnitsForEditor"); + qCDebug(serverLog) << "########## documentsClosed"; + TIME_SCOPE_DURATION("ClangCodeModelServer::documentsClosed"); try { for (const auto &fileContainer : message.fileContainers) { @@ -158,7 +157,7 @@ void ClangCodeModelServer::unregisterTranslationUnitsForEditor(const ClangBackEn documents.remove(message.fileContainers); unsavedFiles.remove(message.fileContainers); } catch (const std::exception &exception) { - qWarning() << "Error in ClangCodeModelServer::unregisterTranslationUnitsForEditor:" << exception.what(); + qWarning() << "Error in ClangCodeModelServer::documentsClosed:" << exception.what(); } } @@ -170,10 +169,10 @@ static DocumentResetInfos toDocumentResetInfos(const std::vector &docu return infos; } -void ClangCodeModelServer::registerProjectPartsForEditor(const RegisterProjectPartsForEditorMessage &message) +void ClangCodeModelServer::projectPartsUpdated(const ProjectPartsUpdatedMessage &message) { - qCDebug(serverLog) << "########## registerProjectPartsForEditor"; - TIME_SCOPE_DURATION("ClangCodeModelServer::registerProjectPartsForEditor"); + qCDebug(serverLog) << "########## projectPartsUpdated"; + TIME_SCOPE_DURATION("ClangCodeModelServer::projectPartsUpdated"); try { projects.createOrUpdate(message.projectContainers); @@ -183,60 +182,60 @@ void ClangCodeModelServer::registerProjectPartsForEditor(const RegisterProjectPa processJobsForDirtyAndVisibleDocuments(); } catch (const std::exception &exception) { - qWarning() << "Error in ClangCodeModelServer::registerProjectPartsForEditor:" << exception.what(); + qWarning() << "Error in ClangCodeModelServer::projectPartsUpdated:" << exception.what(); } } -void ClangCodeModelServer::unregisterProjectPartsForEditor(const UnregisterProjectPartsForEditorMessage &message) +void ClangCodeModelServer::projectPartsRemoved(const ProjectPartsRemovedMessage &message) { - qCDebug(serverLog) << "########## unregisterProjectPartsForEditor"; - TIME_SCOPE_DURATION("ClangCodeModelServer::unregisterProjectPartsForEditor"); + qCDebug(serverLog) << "########## projectPartsRemoved"; + TIME_SCOPE_DURATION("ClangCodeModelServer::projectPartsRemoved"); try { projects.remove(message.projectPartIds); } catch (const std::exception &exception) { - qWarning() << "Error in ClangCodeModelServer::unregisterProjectPartsForEditor:" << exception.what(); + qWarning() << "Error in ClangCodeModelServer::projectPartsRemoved:" << exception.what(); } } -void ClangCodeModelServer::registerUnsavedFilesForEditor(const RegisterUnsavedFilesForEditorMessage &message) +void ClangCodeModelServer::unsavedFilesUpdated(const UnsavedFilesUpdatedMessage &message) { - qCDebug(serverLog) << "########## registerUnsavedFilesForEditor"; - TIME_SCOPE_DURATION("ClangCodeModelServer::registerUnsavedFilesForEditor"); + qCDebug(serverLog) << "########## unsavedFilesUpdated"; + TIME_SCOPE_DURATION("ClangCodeModelServer::unsavedFilesUpdated"); try { unsavedFiles.createOrUpdate(message.fileContainers); documents.updateDocumentsWithChangedDependencies(message.fileContainers); - updateDocumentAnnotationsTimer.start(updateDocumentAnnotationsTimeOutInMs); + updateAnnotationsTimer.start(updateAnnotationsTimeOutInMs); } catch (const std::exception &exception) { - qWarning() << "Error in ClangCodeModelServer::registerUnsavedFilesForEditor:" << exception.what(); + qWarning() << "Error in ClangCodeModelServer::unsavedFilesUpdated:" << exception.what(); } } -void ClangCodeModelServer::unregisterUnsavedFilesForEditor(const UnregisterUnsavedFilesForEditorMessage &message) +void ClangCodeModelServer::unsavedFilesRemoved(const UnsavedFilesRemovedMessage &message) { - qCDebug(serverLog) << "########## registerUnsavedFilesForEditor"; - TIME_SCOPE_DURATION("ClangCodeModelServer::unregisterUnsavedFilesForEditor"); + qCDebug(serverLog) << "########## unsavedFilesRemoved"; + TIME_SCOPE_DURATION("ClangCodeModelServer::unsavedFilesRemoved"); try { unsavedFiles.remove(message.fileContainers); documents.updateDocumentsWithChangedDependencies(message.fileContainers); } catch (const std::exception &exception) { - qWarning() << "Error in ClangCodeModelServer::unregisterUnsavedFilesForEditor:" << exception.what(); + qWarning() << "Error in ClangCodeModelServer::unsavedFilesRemoved:" << exception.what(); } } -void ClangCodeModelServer::completeCode(const ClangBackEnd::CompleteCodeMessage &message) +void ClangCodeModelServer::requestCompletions(const ClangBackEnd::RequestCompletionsMessage &message) { - qCDebug(serverLog) << "########## completeCode"; - TIME_SCOPE_DURATION("ClangCodeModelServer::completeCode"); + qCDebug(serverLog) << "########## requestCompletions"; + TIME_SCOPE_DURATION("ClangCodeModelServer::requestCompletions"); try { Document document = documents.document(message.filePath, message.projectPartId); DocumentProcessor processor = documentProcessors().processor(document); - JobRequest jobRequest = processor.createJobRequest(JobRequest::Type::CompleteCode); + JobRequest jobRequest = processor.createJobRequest(JobRequest::Type::RequestCompletions); jobRequest.line = message.line; jobRequest.column = message.column; jobRequest.funcNameStartLine = message.funcNameStartLine; @@ -246,25 +245,25 @@ void ClangCodeModelServer::completeCode(const ClangBackEnd::CompleteCodeMessage processor.addJob(jobRequest); processor.process(); } catch (const std::exception &exception) { - qWarning() << "Error in ClangCodeModelServer::completeCode:" << exception.what(); + qWarning() << "Error in ClangCodeModelServer::requestCompletions:" << exception.what(); } } -void ClangCodeModelServer::requestDocumentAnnotations(const RequestDocumentAnnotationsMessage &message) +void ClangCodeModelServer::requestAnnotations(const RequestAnnotationsMessage &message) { - qCDebug(serverLog) << "########## requestDocumentAnnotations"; - TIME_SCOPE_DURATION("ClangCodeModelServer::requestDocumentAnnotations"); + qCDebug(serverLog) << "########## requestAnnotations"; + TIME_SCOPE_DURATION("ClangCodeModelServer::requestAnnotations"); try { auto document = documents.document(message.fileContainer.filePath, message.fileContainer.projectPartId); DocumentProcessor processor = documentProcessors().processor(document); - processor.addJob(JobRequest::Type::RequestDocumentAnnotations); - processor.addJob(JobRequest::Type::UpdateExtraDocumentAnnotations); + processor.addJob(JobRequest::Type::RequestAnnotations); + processor.addJob(JobRequest::Type::UpdateExtraAnnotations); processor.process(); } catch (const std::exception &exception) { - qWarning() << "Error in ClangCodeModelServer::requestDocumentAnnotations:" << exception.what(); + qWarning() << "Error in ClangCodeModelServer::requestAnnotations:" << exception.what(); } } @@ -310,7 +309,7 @@ void ClangCodeModelServer::requestFollowSymbol(const RequestFollowSymbolMessage Document document = documents.document(message.fileContainer.filePath, projectPartId); DocumentProcessor processor = documentProcessors().processor(document); - JobRequest jobRequest = processor.createJobRequest(JobRequest::Type::FollowSymbol); + JobRequest jobRequest = processor.createJobRequest(JobRequest::Type::RequestFollowSymbol); fillJobRequest(jobRequest, message); processor.addJob(jobRequest); processor.process(); @@ -338,19 +337,19 @@ void ClangCodeModelServer::requestToolTip(const RequestToolTipMessage &message) } } -void ClangCodeModelServer::updateVisibleTranslationUnits(const UpdateVisibleTranslationUnitsMessage &message) +void ClangCodeModelServer::documentVisibilityChanged(const DocumentVisibilityChangedMessage &message) { - qCDebug(serverLog) << "########## updateVisibleTranslationUnits"; - TIME_SCOPE_DURATION("ClangCodeModelServer::updateVisibleTranslationUnits"); + qCDebug(serverLog) << "########## documentVisibilityChanged"; + TIME_SCOPE_DURATION("ClangCodeModelServer::documentVisibilityChanged"); try { documents.setUsedByCurrentEditor(message.currentEditorFilePath); documents.setVisibleInEditors(message.visibleEditorFilePaths); processSuspendResumeJobs(documents.documents()); - updateDocumentAnnotationsTimer.start(0); + updateAnnotationsTimer.start(0); } catch (const std::exception &exception) { - qWarning() << "Error in ClangCodeModelServer::updateVisibleTranslationUnits:" << exception.what(); + qWarning() << "Error in ClangCodeModelServer::documentVisibilityChanged:" << exception.what(); } } @@ -371,7 +370,7 @@ int ClangCodeModelServer::queueSizeForTestsOnly() bool ClangCodeModelServer::isTimerRunningForTestOnly() const { - return updateDocumentAnnotationsTimer.isActive(); + return updateAnnotationsTimer.isActive(); } void ClangCodeModelServer::processJobsForDirtyAndVisibleDocuments() @@ -396,9 +395,9 @@ void ClangCodeModelServer::addAndRunUpdateJobs(std::vector documents) DocumentProcessor processor = documentProcessors().processor(document); // Run the regular edit-reparse-job - processor.addJob(JobRequest::Type::UpdateDocumentAnnotations, + processor.addJob(JobRequest::Type::UpdateAnnotations, PreferredTranslationUnit::PreviouslyParsed); - processor.addJob(JobRequest::Type::UpdateExtraDocumentAnnotations, + processor.addJob(JobRequest::Type::UpdateExtraAnnotations, PreferredTranslationUnit::RecentlyParsed); processor.process(); @@ -429,7 +428,7 @@ void ClangCodeModelServer::processSuspendResumeJobs(const std::vector DocumentProcessor processor = documentProcessors().processor(entry.document); processor.addJob(entry.jobRequestType, entry.preferredTranslationUnit); if (entry.jobRequestType == JobRequest::Type::ResumeDocument) { - processor.addJob(JobRequest::Type::UpdateExtraDocumentAnnotations, + processor.addJob(JobRequest::Type::UpdateExtraAnnotations, PreferredTranslationUnit::RecentlyParsed); } processor.process(); @@ -479,15 +478,15 @@ void ClangCodeModelServer::processInitialJobsForDocuments(const std::vector runningJobsForTestsOnly(); int queueSizeForTestsOnly(); bool isTimerRunningForTestOnly() const; - void setUpdateDocumentAnnotationsTimeOutInMsForTestsOnly(int value); + void setUpdateAnnotationsTimeOutInMsForTestsOnly(int value); void setUpdateVisibleButNotCurrentDocumentsTimeOutInMsForTestsOnly(int value); DocumentProcessors &documentProcessors(); @@ -99,8 +103,8 @@ private: QScopedPointer documentProcessors_; // Delayed initialization - QTimer updateDocumentAnnotationsTimer; - int updateDocumentAnnotationsTimeOutInMs = 1500; + QTimer updateAnnotationsTimer; + int updateAnnotationsTimeOutInMs = 1500; QTimer updateVisibleButNotCurrentDocumentsTimer; int updateVisibleButNotCurrentDocumentsTimeOutInMs = 2000; diff --git a/src/tools/clangbackend/source/clangcompletecodejob.cpp b/src/tools/clangbackend/source/clangcompletecodejob.cpp index 9970d59269b..50635a6f0dd 100644 --- a/src/tools/clangbackend/source/clangcompletecodejob.cpp +++ b/src/tools/clangbackend/source/clangcompletecodejob.cpp @@ -27,7 +27,7 @@ #include #include -#include +#include #include @@ -36,7 +36,7 @@ namespace ClangBackEnd { IAsyncJob::AsyncPrepareResult CompleteCodeJob::prepareAsyncRun() { const JobRequest jobRequest = context().jobRequest; - QTC_ASSERT(jobRequest.type == JobRequest::Type::CompleteCode, return AsyncPrepareResult()); + QTC_ASSERT(jobRequest.type == JobRequest::Type::RequestCompletions, return AsyncPrepareResult()); QTC_ASSERT(acquireDocument(), return AsyncPrepareResult()); const TranslationUnit translationUnit = *m_translationUnit; @@ -69,10 +69,10 @@ void CompleteCodeJob::finalizeAsyncRun() if (context().isDocumentOpen()) { const AsyncResult result = asyncResult(); - const CodeCompletedMessage message(result.completions, - result.correction, - context().jobRequest.ticketNumber); - context().client->codeCompleted(message); + const CompletionsMessage message(result.completions, + result.correction, + context().jobRequest.ticketNumber); + context().client->completions(message); } } diff --git a/src/tools/clangbackend/source/clangfollowsymboljob.cpp b/src/tools/clangbackend/source/clangfollowsymboljob.cpp index 20836fddeac..c7ac629f800 100644 --- a/src/tools/clangbackend/source/clangfollowsymboljob.cpp +++ b/src/tools/clangbackend/source/clangfollowsymboljob.cpp @@ -36,7 +36,7 @@ namespace ClangBackEnd { IAsyncJob::AsyncPrepareResult FollowSymbolJob::prepareAsyncRun() { const JobRequest jobRequest = context().jobRequest; - QTC_ASSERT(jobRequest.type == JobRequest::Type::FollowSymbol, + QTC_ASSERT(jobRequest.type == JobRequest::Type::RequestFollowSymbol, return AsyncPrepareResult()); QTC_ASSERT(acquireDocument(), return AsyncPrepareResult()); diff --git a/src/tools/clangbackend/source/clangjobrequest.cpp b/src/tools/clangbackend/source/clangjobrequest.cpp index b3ec4ac07ff..6d73e829968 100644 --- a/src/tools/clangbackend/source/clangjobrequest.cpp +++ b/src/tools/clangbackend/source/clangjobrequest.cpp @@ -28,16 +28,16 @@ #include "clangcompletecodejob.h" #include "clangfollowsymboljob.h" #include "clangparsesupportivetranslationunitjob.h" -#include "clangrequestdocumentannotationsjob.h" +#include "clangrequestannotationsjob.h" #include "clangrequestreferencesjob.h" #include "clangrequesttooltipjob.h" #include "clangresumedocumentjob.h" #include "clangsuspenddocumentjob.h" -#include "clangupdatedocumentannotationsjob.h" -#include "clangupdateextradocumentannotationsjob.h" +#include "clangupdateannotationsjob.h" +#include "clangupdateextraannotationsjob.h" #include -#include +#include #include #include #include @@ -55,13 +55,13 @@ static const char *JobRequestTypeToText(JobRequest::Type type) { switch (type) { RETURN_TEXT_FOR_CASE(Invalid); - RETURN_TEXT_FOR_CASE(UpdateDocumentAnnotations); - RETURN_TEXT_FOR_CASE(UpdateExtraDocumentAnnotations); + RETURN_TEXT_FOR_CASE(UpdateAnnotations); + RETURN_TEXT_FOR_CASE(UpdateExtraAnnotations); RETURN_TEXT_FOR_CASE(ParseSupportiveTranslationUnit); - RETURN_TEXT_FOR_CASE(CompleteCode); - RETURN_TEXT_FOR_CASE(RequestDocumentAnnotations); + RETURN_TEXT_FOR_CASE(RequestCompletions); + RETURN_TEXT_FOR_CASE(RequestAnnotations); RETURN_TEXT_FOR_CASE(RequestReferences); - RETURN_TEXT_FOR_CASE(FollowSymbol); + RETURN_TEXT_FOR_CASE(RequestFollowSymbol); RETURN_TEXT_FOR_CASE(RequestToolTip); RETURN_TEXT_FOR_CASE(SuspendDocument); RETURN_TEXT_FOR_CASE(ResumeDocument); @@ -123,13 +123,13 @@ static JobRequest::ExpirationConditions expirationConditionsForType(JobRequest:: using Conditions = JobRequest::ExpirationConditions; switch (type) { - case Type::UpdateDocumentAnnotations: - case Type::UpdateExtraDocumentAnnotations: + case Type::UpdateAnnotations: + case Type::UpdateExtraAnnotations: return Conditions(Condition::AnythingChanged); case Type::RequestReferences: - case Type::RequestDocumentAnnotations: + case Type::RequestAnnotations: case Type::RequestToolTip: - case Type::FollowSymbol: + case Type::RequestFollowSymbol: return Conditions(Condition::DocumentClosed) | Conditions(Condition::DocumentRevisionChanged); default: @@ -156,12 +156,12 @@ static JobRequest::RunConditions conditionsForType(JobRequest::Type type) Conditions conditions = Conditions(Condition::DocumentUnsuspended) | Conditions(Condition::DocumentVisible); - if (type == Type::RequestReferences || type == Type::FollowSymbol - || type == Type::RequestToolTip || type == Type::UpdateExtraDocumentAnnotations) { + if (type == Type::RequestReferences || type == Type::RequestFollowSymbol + || type == Type::RequestToolTip || type == Type::UpdateExtraAnnotations) { conditions |= Condition::CurrentDocumentRevision; } - if (type != Type::UpdateDocumentAnnotations && type != Type::ParseSupportiveTranslationUnit) + if (type != Type::UpdateAnnotations && type != Type::ParseSupportiveTranslationUnit) conditions |= Condition::DocumentParsed; return conditions; @@ -174,14 +174,14 @@ bool JobRequest::isTakeOverable() const switch (type) { // Never discard these as the client side might wait for a response. - case Type::CompleteCode: + case Type::RequestCompletions: case Type::RequestReferences: - case Type::FollowSymbol: + case Type::RequestFollowSymbol: case Type::RequestToolTip: return true; - // Discard this one as UpdateDocumentAnnotations will have the same effect. - case Type::RequestDocumentAnnotations: + // Discard this one as UpdateAnnotations will have the same effect. + case Type::RequestAnnotations: // Discard Suspend because the document will be cleared anyway. // Discard Resume because a (re)parse will happen on demand. @@ -190,8 +190,8 @@ bool JobRequest::isTakeOverable() const // Discard these as they are initial jobs that will be recreated on demand // anyway. - case Type::UpdateDocumentAnnotations: - case Type::UpdateExtraDocumentAnnotations: + case Type::UpdateAnnotations: + case Type::UpdateExtraAnnotations: // Discard these as they only make sense in a row. Avoid splitting them up. case Type::ParseSupportiveTranslationUnit: @@ -219,21 +219,21 @@ IAsyncJob *JobRequest::createJob() const case JobRequest::Type::Invalid: QTC_CHECK(false && "Cannot create job for invalid job request."); break; - case JobRequest::Type::UpdateDocumentAnnotations: - return new UpdateDocumentAnnotationsJob(); - case JobRequest::Type::UpdateExtraDocumentAnnotations: - return new UpdateExtraDocumentAnnotationsJob(); + case JobRequest::Type::UpdateAnnotations: + return new UpdateAnnotationsJob(); + case JobRequest::Type::UpdateExtraAnnotations: + return new UpdateExtraAnnotationsJob(); case JobRequest::Type::ParseSupportiveTranslationUnit: return new ParseSupportiveTranslationUnitJob(); - case JobRequest::Type::CompleteCode: + case JobRequest::Type::RequestCompletions: return new CompleteCodeJob(); - case JobRequest::Type::RequestDocumentAnnotations: - return new RequestDocumentAnnotationsJob(); + case JobRequest::Type::RequestAnnotations: + return new RequestAnnotationsJob(); case JobRequest::Type::RequestReferences: return new RequestReferencesJob(); case JobRequest::Type::RequestToolTip: return new RequestToolTipJob(); - case JobRequest::Type::FollowSymbol: + case JobRequest::Type::RequestFollowSymbol: return new FollowSymbolJob(); case JobRequest::Type::SuspendDocument: return new SuspendDocumentJob(); @@ -251,10 +251,10 @@ void JobRequest::cancelJob(ClangCodeModelClientInterface &client) const switch (type) { case JobRequest::Type::Invalid: - case JobRequest::Type::UpdateDocumentAnnotations: - case JobRequest::Type::UpdateExtraDocumentAnnotations: + case JobRequest::Type::UpdateAnnotations: + case JobRequest::Type::UpdateExtraAnnotations: case JobRequest::Type::ParseSupportiveTranslationUnit: - case JobRequest::Type::RequestDocumentAnnotations: + case JobRequest::Type::RequestAnnotations: case JobRequest::Type::SuspendDocument: case JobRequest::Type::ResumeDocument: break; @@ -265,19 +265,15 @@ void JobRequest::cancelJob(ClangCodeModelClientInterface &client) const ticketNumber)); break; case JobRequest::Type::RequestToolTip: - client.tooltip(ToolTipMessage(FileContainer(), - ToolTipInfo(), - ticketNumber)); + client.tooltip(ToolTipMessage(FileContainer(), ToolTipInfo(), ticketNumber)); break; - case JobRequest::Type::CompleteCode: - client.codeCompleted(CodeCompletedMessage(CodeCompletions(), - CompletionCorrection::NoCorrection, - ticketNumber)); + case JobRequest::Type::RequestCompletions: + client.completions( + CompletionsMessage(CodeCompletions(), CompletionCorrection::NoCorrection, ticketNumber)); break; - case JobRequest::Type::FollowSymbol: - client.followSymbol(FollowSymbolMessage(FileContainer(), - SourceRangeContainer(), - ticketNumber)); + case JobRequest::Type::RequestFollowSymbol: + client.followSymbol( + FollowSymbolMessage(FileContainer(), SourceRangeContainer(), ticketNumber)); break; } } diff --git a/src/tools/clangbackend/source/clangjobrequest.h b/src/tools/clangbackend/source/clangjobrequest.h index 6c534dba8a9..920f8f316ee 100644 --- a/src/tools/clangbackend/source/clangjobrequest.h +++ b/src/tools/clangbackend/source/clangjobrequest.h @@ -49,15 +49,15 @@ public: enum class Type { Invalid, - UpdateDocumentAnnotations, - UpdateExtraDocumentAnnotations, + UpdateAnnotations, + UpdateExtraAnnotations, ParseSupportiveTranslationUnit, - CompleteCode, - RequestDocumentAnnotations, + RequestCompletions, + RequestAnnotations, RequestReferences, - FollowSymbol, + RequestFollowSymbol, RequestToolTip, SuspendDocument, diff --git a/src/tools/clangbackend/source/clangrequestdocumentannotationsjob.cpp b/src/tools/clangbackend/source/clangrequestannotationsjob.cpp similarity index 60% rename from src/tools/clangbackend/source/clangrequestdocumentannotationsjob.cpp rename to src/tools/clangbackend/source/clangrequestannotationsjob.cpp index 3cb1479b766..2ffec0157c9 100644 --- a/src/tools/clangbackend/source/clangrequestdocumentannotationsjob.cpp +++ b/src/tools/clangbackend/source/clangrequestannotationsjob.cpp @@ -23,48 +23,47 @@ ** ****************************************************************************/ -#include "clangrequestdocumentannotationsjob.h" +#include "clangrequestannotationsjob.h" +#include #include -#include #include #include namespace ClangBackEnd { -IAsyncJob::AsyncPrepareResult RequestDocumentAnnotationsJob::prepareAsyncRun() +IAsyncJob::AsyncPrepareResult RequestAnnotationsJob::prepareAsyncRun() { const JobRequest jobRequest = context().jobRequest; - QTC_ASSERT(jobRequest.type == JobRequest::Type::RequestDocumentAnnotations, + QTC_ASSERT(jobRequest.type == JobRequest::Type::RequestAnnotations, return AsyncPrepareResult()); QTC_ASSERT(acquireDocument(), return AsyncPrepareResult()); const TranslationUnit translationUnit = *m_translationUnit; setRunner([translationUnit]() { - TIME_SCOPE_DURATION("RequestDocumentAnnotationsJobRunner"); + TIME_SCOPE_DURATION("RequestAnnotationsJobRunner"); - RequestDocumentAnnotationsJob::AsyncResult asyncResult; - translationUnit.extractDocumentAnnotations(asyncResult.firstHeaderErrorDiagnostic, - asyncResult.diagnostics, - asyncResult.tokenInfos, - asyncResult.skippedSourceRanges); + RequestAnnotationsJob::AsyncResult asyncResult; + translationUnit.extractAnnotations(asyncResult.firstHeaderErrorDiagnostic, + asyncResult.diagnostics, + asyncResult.tokenInfos, + asyncResult.skippedSourceRanges); return asyncResult; }); return AsyncPrepareResult{translationUnit.id()}; } -void RequestDocumentAnnotationsJob::finalizeAsyncRun() +void RequestAnnotationsJob::finalizeAsyncRun() { if (context().isDocumentOpen()) { const AsyncResult result = asyncResult(); - context().client->documentAnnotationsChanged( - DocumentAnnotationsChangedMessage(m_pinnedFileContainer, - result.diagnostics, - result.firstHeaderErrorDiagnostic, - result.tokenInfos, - result.skippedSourceRanges)); + context().client->annotations(AnnotationsMessage(m_pinnedFileContainer, + result.diagnostics, + result.firstHeaderErrorDiagnostic, + result.tokenInfos, + result.skippedSourceRanges)); } } diff --git a/src/tools/clangbackend/source/clangrequestdocumentannotationsjob.h b/src/tools/clangbackend/source/clangrequestannotationsjob.h similarity index 89% rename from src/tools/clangbackend/source/clangrequestdocumentannotationsjob.h rename to src/tools/clangbackend/source/clangrequestannotationsjob.h index fe8da149adf..c0693eb26e1 100644 --- a/src/tools/clangbackend/source/clangrequestdocumentannotationsjob.h +++ b/src/tools/clangbackend/source/clangrequestannotationsjob.h @@ -33,7 +33,7 @@ namespace ClangBackEnd { -struct RequestDocumentAnnotationsJobResult +struct RequestAnnotationsJobResult { ClangBackEnd::DiagnosticContainer firstHeaderErrorDiagnostic; QVector diagnostics; @@ -41,10 +41,10 @@ struct RequestDocumentAnnotationsJobResult QVector skippedSourceRanges; }; -class RequestDocumentAnnotationsJob : public DocumentJob +class RequestAnnotationsJob : public DocumentJob { public: - using AsyncResult = RequestDocumentAnnotationsJobResult; + using AsyncResult = RequestAnnotationsJobResult; AsyncPrepareResult prepareAsyncRun() override; void finalizeAsyncRun() override; diff --git a/src/tools/clangbackend/source/clangresumedocumentjob.cpp b/src/tools/clangbackend/source/clangresumedocumentjob.cpp index c628d4444ac..537472d66ab 100644 --- a/src/tools/clangbackend/source/clangresumedocumentjob.cpp +++ b/src/tools/clangbackend/source/clangresumedocumentjob.cpp @@ -36,7 +36,7 @@ void ResumeDocumentJob::finalizeAsyncRun() m_pinnedDocument.setIsSuspended(false); } - UpdateDocumentAnnotationsJob::finalizeAsyncRun(); + UpdateAnnotationsJob::finalizeAsyncRun(); } bool ResumeDocumentJob::isExpectedJobRequestType(const JobRequest &jobRequest) const @@ -46,7 +46,7 @@ bool ResumeDocumentJob::isExpectedJobRequestType(const JobRequest &jobRequest) c TranslationUnitUpdateInput ResumeDocumentJob::createUpdateInput(const Document &document) const { - TranslationUnitUpdateInput input = UpdateDocumentAnnotationsJob::createUpdateInput(document); + TranslationUnitUpdateInput input = UpdateAnnotationsJob::createUpdateInput(document); input.reparseNeeded = true; return input; } diff --git a/src/tools/clangbackend/source/clangresumedocumentjob.h b/src/tools/clangbackend/source/clangresumedocumentjob.h index aff8e780f76..2d9c764e523 100644 --- a/src/tools/clangbackend/source/clangresumedocumentjob.h +++ b/src/tools/clangbackend/source/clangresumedocumentjob.h @@ -27,11 +27,11 @@ #include "clangasyncjob.h" #include "clangdocument.h" -#include "clangupdatedocumentannotationsjob.h" +#include "clangupdateannotationsjob.h" namespace ClangBackEnd { -class ResumeDocumentJob : public UpdateDocumentAnnotationsJob +class ResumeDocumentJob : public UpdateAnnotationsJob { public: void finalizeAsyncRun() override; diff --git a/src/tools/clangbackend/source/clangtranslationunit.cpp b/src/tools/clangbackend/source/clangtranslationunit.cpp index 4720f657918..aa36dea8750 100644 --- a/src/tools/clangbackend/source/clangtranslationunit.cpp +++ b/src/tools/clangbackend/source/clangtranslationunit.cpp @@ -128,7 +128,7 @@ TranslationUnit::CodeCompletionResult TranslationUnit::complete( return CodeCompletionResult{completions, correction}; } -void TranslationUnit::extractDocumentAnnotations( +void TranslationUnit::extractAnnotations( DiagnosticContainer &firstHeaderErrorDiagnostic, QVector &mainFileDiagnostics, QVector &tokenInfos, diff --git a/src/tools/clangbackend/source/clangtranslationunit.h b/src/tools/clangbackend/source/clangtranslationunit.h index 175ba2eb584..ae8741a9890 100644 --- a/src/tools/clangbackend/source/clangtranslationunit.h +++ b/src/tools/clangbackend/source/clangtranslationunit.h @@ -82,10 +82,10 @@ public: void extractDiagnostics(DiagnosticContainer &firstHeaderErrorDiagnostic, QVector &mainFileDiagnostics) const; - void extractDocumentAnnotations(DiagnosticContainer &firstHeaderErrorDiagnostic, - QVector &mainFileDiagnostics, - QVector &tokenInfos, - QVector &skippedSourceRanges) const; + void extractAnnotations(DiagnosticContainer &firstHeaderErrorDiagnostic, + QVector &mainFileDiagnostics, + QVector &tokenInfos, + QVector &skippedSourceRanges) const; ReferencesResult references(uint line, uint column, bool localReferences = false) const; ToolTipInfo tooltip(UnsavedFiles &unsavedFiles, diff --git a/src/tools/clangbackend/source/clangupdatedocumentannotationsjob.cpp b/src/tools/clangbackend/source/clangupdateannotationsjob.cpp similarity index 62% rename from src/tools/clangbackend/source/clangupdatedocumentannotationsjob.cpp rename to src/tools/clangbackend/source/clangupdateannotationsjob.cpp index 7d68653c590..6d836633d74 100644 --- a/src/tools/clangbackend/source/clangupdatedocumentannotationsjob.cpp +++ b/src/tools/clangbackend/source/clangupdateannotationsjob.cpp @@ -23,17 +23,17 @@ ** ****************************************************************************/ -#include "clangupdatedocumentannotationsjob.h" +#include "clangupdateannotationsjob.h" +#include #include #include -#include #include namespace ClangBackEnd { -IAsyncJob::AsyncPrepareResult UpdateDocumentAnnotationsJob::prepareAsyncRun() +IAsyncJob::AsyncPrepareResult UpdateAnnotationsJob::prepareAsyncRun() { const JobRequest jobRequest = context().jobRequest; QTC_ASSERT(isExpectedJobRequestType(jobRequest), return AsyncPrepareResult()); @@ -42,17 +42,17 @@ IAsyncJob::AsyncPrepareResult UpdateDocumentAnnotationsJob::prepareAsyncRun() const TranslationUnit translationUnit = *m_translationUnit; const TranslationUnitUpdateInput updateInput = createUpdateInput(m_pinnedDocument); setRunner([translationUnit, updateInput]() { - TIME_SCOPE_DURATION("UpdateDocumentAnnotationsJobRunner"); + TIME_SCOPE_DURATION("UpdateAnnotationsJobRunner"); // Update - UpdateDocumentAnnotationsJob::AsyncResult asyncResult; + UpdateAnnotationsJob::AsyncResult asyncResult; asyncResult.updateResult = translationUnit.update(updateInput); // Collect - translationUnit.extractDocumentAnnotations(asyncResult.firstHeaderErrorDiagnostic, - asyncResult.diagnostics, - asyncResult.tokenInfos, - asyncResult.skippedSourceRanges); + translationUnit.extractAnnotations(asyncResult.firstHeaderErrorDiagnostic, + asyncResult.diagnostics, + asyncResult.tokenInfos, + asyncResult.skippedSourceRanges); return asyncResult; }); @@ -60,28 +60,27 @@ IAsyncJob::AsyncPrepareResult UpdateDocumentAnnotationsJob::prepareAsyncRun() return AsyncPrepareResult{translationUnit.id()}; } -void UpdateDocumentAnnotationsJob::finalizeAsyncRun() +void UpdateAnnotationsJob::finalizeAsyncRun() { if (!context().isOutdated()) { const AsyncResult result = asyncResult(); m_pinnedDocument.incorporateUpdaterResult(result.updateResult); - context().client->documentAnnotationsChanged( - DocumentAnnotationsChangedMessage(m_pinnedFileContainer, - result.diagnostics, - result.firstHeaderErrorDiagnostic, - result.tokenInfos, - result.skippedSourceRanges)); + context().client->annotations(AnnotationsMessage(m_pinnedFileContainer, + result.diagnostics, + result.firstHeaderErrorDiagnostic, + result.tokenInfos, + result.skippedSourceRanges)); } } -bool UpdateDocumentAnnotationsJob::isExpectedJobRequestType(const JobRequest &jobRequest) const +bool UpdateAnnotationsJob::isExpectedJobRequestType(const JobRequest &jobRequest) const { - return jobRequest.type == JobRequest::Type::UpdateDocumentAnnotations; + return jobRequest.type == JobRequest::Type::UpdateAnnotations; } TranslationUnitUpdateInput -UpdateDocumentAnnotationsJob::createUpdateInput(const Document &document) const +UpdateAnnotationsJob::createUpdateInput(const Document &document) const { return document.createUpdateInput(); } diff --git a/src/tools/clangbackend/source/clangupdatedocumentannotationsjob.h b/src/tools/clangbackend/source/clangupdateannotationsjob.h similarity index 91% rename from src/tools/clangbackend/source/clangupdatedocumentannotationsjob.h rename to src/tools/clangbackend/source/clangupdateannotationsjob.h index 89ec61dc618..8c0f89f430f 100644 --- a/src/tools/clangbackend/source/clangupdatedocumentannotationsjob.h +++ b/src/tools/clangbackend/source/clangupdateannotationsjob.h @@ -33,7 +33,7 @@ namespace ClangBackEnd { -struct UpdateDocumentAnnotationsJobResult +struct UpdateAnnotationsJobResult { TranslationUnitUpdateResult updateResult; @@ -43,10 +43,10 @@ struct UpdateDocumentAnnotationsJobResult QVector skippedSourceRanges; }; -class UpdateDocumentAnnotationsJob : public DocumentJob +class UpdateAnnotationsJob : public DocumentJob { public: - using AsyncResult = UpdateDocumentAnnotationsJobResult; + using AsyncResult = UpdateAnnotationsJobResult; AsyncPrepareResult prepareAsyncRun() override; void finalizeAsyncRun() override; diff --git a/src/tools/clangbackend/source/clangupdateextradocumentannotationsjob.cpp b/src/tools/clangbackend/source/clangupdateextraannotationsjob.cpp similarity index 79% rename from src/tools/clangbackend/source/clangupdateextradocumentannotationsjob.cpp rename to src/tools/clangbackend/source/clangupdateextraannotationsjob.cpp index d7713db748b..7363a28758d 100644 --- a/src/tools/clangbackend/source/clangupdateextradocumentannotationsjob.cpp +++ b/src/tools/clangbackend/source/clangupdateextraannotationsjob.cpp @@ -23,37 +23,36 @@ ** ****************************************************************************/ -#include "clangupdateextradocumentannotationsjob.h" +#include "clangupdateextraannotationsjob.h" +#include #include #include -#include #include namespace ClangBackEnd { -IAsyncJob::AsyncPrepareResult UpdateExtraDocumentAnnotationsJob::prepareAsyncRun() +IAsyncJob::AsyncPrepareResult UpdateExtraAnnotationsJob::prepareAsyncRun() { const JobRequest jobRequest = context().jobRequest; QTC_ASSERT(acquireDocument(), return AsyncPrepareResult()); const TranslationUnit translationUnit = *m_translationUnit; setRunner([translationUnit]() { - TIME_SCOPE_DURATION("UpdateExtraDocumentAnnotationsJobRunner"); + TIME_SCOPE_DURATION("UpdateExtraAnnotationsJobRunner"); return translationUnit.fullTokenInfos().toTokenInfoContainers(); }); return AsyncPrepareResult{translationUnit.id()}; } -void UpdateExtraDocumentAnnotationsJob::finalizeAsyncRun() +void UpdateExtraAnnotationsJob::finalizeAsyncRun() { if (context().isOutdated()) return; - context().client->documentAnnotationsChanged( - DocumentAnnotationsChangedMessage(m_pinnedFileContainer, asyncResult())); + context().client->annotations(AnnotationsMessage(m_pinnedFileContainer, asyncResult())); } } // namespace ClangBackEnd diff --git a/src/tools/clangbackend/source/clangupdateextradocumentannotationsjob.h b/src/tools/clangbackend/source/clangupdateextraannotationsjob.h similarity index 88% rename from src/tools/clangbackend/source/clangupdateextradocumentannotationsjob.h rename to src/tools/clangbackend/source/clangupdateextraannotationsjob.h index 6ceb5470c2b..2a0e0db84e4 100644 --- a/src/tools/clangbackend/source/clangupdateextradocumentannotationsjob.h +++ b/src/tools/clangbackend/source/clangupdateextraannotationsjob.h @@ -31,9 +31,9 @@ namespace ClangBackEnd { -using UpdateExtraDocumentAnnotationsJobResult = QVector; +using UpdateExtraAnnotationsJobResult = QVector; -class UpdateExtraDocumentAnnotationsJob : public DocumentJob +class UpdateExtraAnnotationsJob : public DocumentJob { public: AsyncPrepareResult prepareAsyncRun() override; diff --git a/tests/unit/echoserver/echoclangcodemodelserver.cpp b/tests/unit/echoserver/echoclangcodemodelserver.cpp index 38d2d395444..70612953ac0 100644 --- a/tests/unit/echoserver/echoclangcodemodelserver.cpp +++ b/tests/unit/echoserver/echoclangcodemodelserver.cpp @@ -43,47 +43,47 @@ void EchoClangCodeModelServer::end() QCoreApplication::quit(); } -void EchoClangCodeModelServer::registerTranslationUnitsForEditor(const RegisterTranslationUnitForEditorMessage &message) +void EchoClangCodeModelServer::documentsOpened(const DocumentsOpenedMessage &message) { echoMessage(message); } -void EchoClangCodeModelServer::updateTranslationUnitsForEditor(const UpdateTranslationUnitsForEditorMessage &message) +void EchoClangCodeModelServer::documentsChanged(const DocumentsChangedMessage &message) { echoMessage(message); } -void EchoClangCodeModelServer::unregisterTranslationUnitsForEditor(const UnregisterTranslationUnitsForEditorMessage &message) +void EchoClangCodeModelServer::documentsClosed(const DocumentsClosedMessage &message) { echoMessage(message); } -void EchoClangCodeModelServer::registerProjectPartsForEditor(const RegisterProjectPartsForEditorMessage &message) +void EchoClangCodeModelServer::projectPartsUpdated(const ProjectPartsUpdatedMessage &message) { echoMessage(message); } -void EchoClangCodeModelServer::unregisterProjectPartsForEditor(const UnregisterProjectPartsForEditorMessage &message) +void EchoClangCodeModelServer::projectPartsRemoved(const ProjectPartsRemovedMessage &message) { echoMessage(message); } -void EchoClangCodeModelServer::registerUnsavedFilesForEditor(const RegisterUnsavedFilesForEditorMessage &message) +void EchoClangCodeModelServer::unsavedFilesUpdated(const UnsavedFilesUpdatedMessage &message) { echoMessage(message); } -void EchoClangCodeModelServer::unregisterUnsavedFilesForEditor(const UnregisterUnsavedFilesForEditorMessage &message) +void EchoClangCodeModelServer::unsavedFilesRemoved(const UnsavedFilesRemovedMessage &message) { echoMessage(message); } -void EchoClangCodeModelServer::completeCode(const CompleteCodeMessage &message) +void EchoClangCodeModelServer::requestCompletions(const RequestCompletionsMessage &message) { echoMessage(message); } -void EchoClangCodeModelServer::requestDocumentAnnotations(const RequestDocumentAnnotationsMessage &message) +void EchoClangCodeModelServer::requestAnnotations(const RequestAnnotationsMessage &message) { echoMessage(message); } @@ -103,7 +103,7 @@ void EchoClangCodeModelServer::requestToolTip(const RequestToolTipMessage &messa echoMessage(message); } -void EchoClangCodeModelServer::updateVisibleTranslationUnits(const UpdateVisibleTranslationUnitsMessage &message) +void EchoClangCodeModelServer::documentVisibilityChanged(const DocumentVisibilityChangedMessage &message) { echoMessage(message); } diff --git a/tests/unit/echoserver/echoclangcodemodelserver.h b/tests/unit/echoserver/echoclangcodemodelserver.h index d3452d2d321..261b690deee 100644 --- a/tests/unit/echoserver/echoclangcodemodelserver.h +++ b/tests/unit/echoserver/echoclangcodemodelserver.h @@ -36,19 +36,23 @@ class EchoClangCodeModelServer : public ClangCodeModelServerInterface, public: void dispatch(const MessageEnvelop &message) override; void end() override; - void registerTranslationUnitsForEditor(const RegisterTranslationUnitForEditorMessage &message) override; - void updateTranslationUnitsForEditor(const UpdateTranslationUnitsForEditorMessage &message) override; - void unregisterTranslationUnitsForEditor(const UnregisterTranslationUnitsForEditorMessage &message) override; - void registerProjectPartsForEditor(const RegisterProjectPartsForEditorMessage &message) override; - void unregisterProjectPartsForEditor(const UnregisterProjectPartsForEditorMessage &message) override; - void registerUnsavedFilesForEditor(const RegisterUnsavedFilesForEditorMessage &message) override; - void unregisterUnsavedFilesForEditor(const UnregisterUnsavedFilesForEditorMessage &message) override; - void completeCode(const CompleteCodeMessage &message) override; - void requestDocumentAnnotations(const RequestDocumentAnnotationsMessage &message) override; + + void documentsOpened(const DocumentsOpenedMessage &message) override; + void documentsChanged(const DocumentsChangedMessage &message) override; + void documentsClosed(const DocumentsClosedMessage &message) override; + void documentVisibilityChanged(const DocumentVisibilityChangedMessage &message) override; + + void projectPartsUpdated(const ProjectPartsUpdatedMessage &message) override; + void projectPartsRemoved(const ProjectPartsRemovedMessage &message) override; + + void unsavedFilesUpdated(const UnsavedFilesUpdatedMessage &message) override; + void unsavedFilesRemoved(const UnsavedFilesRemovedMessage &message) override; + + void requestCompletions(const RequestCompletionsMessage &message) override; + void requestAnnotations(const RequestAnnotationsMessage &message) override; void requestReferences(const RequestReferencesMessage &message) override; void requestFollowSymbol(const RequestFollowSymbolMessage &message) override; void requestToolTip(const RequestToolTipMessage &message) override; - void updateVisibleTranslationUnits(const UpdateVisibleTranslationUnitsMessage &message) override; private: void echoMessage(const MessageEnvelop &message); diff --git a/tests/unit/unittest/clangcodemodelserver-test.cpp b/tests/unit/unittest/clangcodemodelserver-test.cpp index 7f88681f320..ea4238975e3 100644 --- a/tests/unit/unittest/clangcodemodelserver-test.cpp +++ b/tests/unit/unittest/clangcodemodelserver-test.cpp @@ -114,46 +114,48 @@ protected: protected: bool waitUntilAllJobsFinished(int timeOutInMs = 10000); - void registerProjectPart(); - void registerProjectPart(const Utf8String &projectPartId); - void changeProjectPartArguments(); + void updateProjectPart(); + void updateProjectPart(const Utf8String &projectPartId); + void updateProjectPartWithArguments(); - void registerProjectAndFile(const Utf8String &filePath, - int expectedDocumentAnnotationsChangedMessages = AnnotationJobsMultiplier); - void registerProjectAndFileAndWaitForFinished(const Utf8String &filePath, - int expectedDocumentAnnotationsChangedMessages = AnnotationJobsMultiplier); - void registerProjectAndFilesAndWaitForFinished(int expectedDocumentAnnotationsChangedMessages = 2 * AnnotationJobsMultiplier); - void registerFile(const Utf8String &filePath, - int expectedDocumentAnnotationsChangedMessages = AnnotationJobsMultiplier); - void registerFile(const Utf8String &filePath, const Utf8String &projectPartId, - int expectedDocumentAnnotationsChangedMessages = AnnotationJobsMultiplier); - void registerFiles(int expectedDocumentAnnotationsChangedMessages); - void registerFileWithUnsavedContent(const Utf8String &filePath, const Utf8String &content); + void updateProjectAndOpenDocument(const Utf8String &filePath, + int expectedAnnotationsMessages = AnnotationJobsMultiplier); + void updateProjectAndOpenDocumentAndWaitForFinished( + const Utf8String &filePath, int expectedAnnotationsMessages = AnnotationJobsMultiplier); + void updateProjectAndOpenDocumentsAndWaitForFinished( + int expectedAnnotationsdMessages = 2 * AnnotationJobsMultiplier); + + void openDocument(const Utf8String &filePath, + int expectedAnnotationsMessages = AnnotationJobsMultiplier); + void openDocument(const Utf8String &filePath, + const Utf8String &projectPartId, + int expectedAnnotationsMessages = AnnotationJobsMultiplier); + void openDocuments(int expectedAnnotationsMessages); + void openDocumentWithUnsavedContent(const Utf8String &filePath, const Utf8String &content); + void closeDocument(const Utf8String &filePath); void updateUnsavedContent(const Utf8String &filePath, const Utf8String &fileContent, quint32 revisionNumber); - - void unregisterFile(const Utf8String &filePath); - void removeUnsavedFile(const Utf8String &filePath); void updateVisibilty(const Utf8String ¤tEditor, const Utf8String &additionalVisibleEditor); - void requestDocumentAnnotations(const Utf8String &filePath); + void requestAnnotations(const Utf8String &filePath); void requestReferences(quint32 documentRevision = 0); void requestFollowSymbol(quint32 documentRevision = 0); - - void completeCode(const Utf8String &filePath, uint line = 1, uint column = 1, - const Utf8String &projectPartId = Utf8String()); - void completeCodeInFileA(); - void completeCodeInFileB(); + void requestCompletions(const Utf8String &filePath, + uint line = 1, + uint column = 1, + const Utf8String &projectPartId = Utf8String()); + void requestCompletionsInFileA(); + void requestCompletionsInFileB(); bool isSupportiveTranslationUnitInitialized(const Utf8String &filePath); DocumentProcessor documentProcessorForFile(const Utf8String &filePath); - void expectDocumentAnnotationsChanged(int count); + void expectAnnotations(int count); void expectCompletion(const CodeCompletion &completion); void expectCompletionFromFileA(); void expectCompletionFromFileBEnabledByMacro(); @@ -162,7 +164,7 @@ protected: void expectNoCompletionWithUnsavedMethod(); void expectReferences(); void expectFollowSymbol(); - void expectDocumentAnnotationsChangedForFileBWithSpecificHighlightingMark(); + void expectAnnotationsForFileBWithSpecificHighlightingMark(); static const Utf8String unsavedContent(const QString &unsavedFilePath); @@ -192,23 +194,23 @@ using ClangCodeModelServerSlowTest = ClangCodeModelServer; TEST_F(ClangCodeModelServerSlowTest, GetCodeCompletion) { - registerProjectAndFile(filePathA); + updateProjectAndOpenDocument(filePathA); expectCompletionFromFileA(); - completeCodeInFileA(); + requestCompletionsInFileA(); } -TEST_F(ClangCodeModelServerSlowTest, RequestDocumentAnnotations) +TEST_F(ClangCodeModelServerSlowTest, RequestAnnotations) { - registerProjectAndFileAndWaitForFinished(filePathB); + updateProjectAndOpenDocumentAndWaitForFinished(filePathB); - expectDocumentAnnotationsChangedForFileBWithSpecificHighlightingMark(); - requestDocumentAnnotations(filePathB); + expectAnnotationsForFileBWithSpecificHighlightingMark(); + requestAnnotations(filePathB); } TEST_F(ClangCodeModelServerSlowTest, RequestReferencesForCurrentDocumentRevision) { - registerProjectAndFileAndWaitForFinished(filePathC); + updateProjectAndOpenDocumentAndWaitForFinished(filePathC); expectReferences(); requestReferences(); @@ -216,7 +218,7 @@ TEST_F(ClangCodeModelServerSlowTest, RequestReferencesForCurrentDocumentRevision TEST_F(ClangCodeModelServerSlowTest, RequestReferencesTakesRevisionFromMessage) { - registerProjectAndFileAndWaitForFinished(filePathC); + updateProjectAndOpenDocumentAndWaitForFinished(filePathC); requestReferences(/*documentRevision=*/ 99); @@ -229,7 +231,7 @@ TEST_F(ClangCodeModelServerSlowTest, RequestReferencesTakesRevisionFromMessage) TEST_F(ClangCodeModelServerSlowTest, RequestFollowSymbolForCurrentDocumentRevision) { - registerProjectAndFileAndWaitForFinished(filePathC); + updateProjectAndOpenDocumentAndWaitForFinished(filePathC); expectFollowSymbol(); requestFollowSymbol(); @@ -237,7 +239,7 @@ TEST_F(ClangCodeModelServerSlowTest, RequestFollowSymbolForCurrentDocumentRevisi TEST_F(ClangCodeModelServerSlowTest, RequestFollowSymbolTakesRevisionFromMessage) { - registerProjectAndFileAndWaitForFinished(filePathC); + updateProjectAndOpenDocumentAndWaitForFinished(filePathC); requestFollowSymbol(/*documentRevision=*/ 99); @@ -248,90 +250,90 @@ TEST_F(ClangCodeModelServerSlowTest, RequestFollowSymbolTakesRevisionFromMessage queue.clear(); // Avoid blocking } -TEST_F(ClangCodeModelServerSlowTest, NoInitialDocumentAnnotationsForClosedDocument) +TEST_F(ClangCodeModelServerSlowTest, NoInitialAnnotationsForClosedDocument) { - const int expectedDocumentAnnotationsChangedCount = 0; - registerProjectAndFile(filePathA, expectedDocumentAnnotationsChangedCount); + const int expectedAnnotationsCount = 0; + updateProjectAndOpenDocument(filePathA, expectedAnnotationsCount); - unregisterFile(filePathA); + closeDocument(filePathA); } -TEST_F(ClangCodeModelServerSlowTest, NoDocumentAnnotationsForClosedDocument) +TEST_F(ClangCodeModelServerSlowTest, NoAnnotationsForClosedDocument) { - const int expectedDocumentAnnotationsChangedCount = AnnotationJobsMultiplier; // Only for registration. - registerProjectAndFileAndWaitForFinished(filePathA, expectedDocumentAnnotationsChangedCount); + const int expectedAnnotationsCount = AnnotationJobsMultiplier; // Only for registration. + updateProjectAndOpenDocumentAndWaitForFinished(filePathA, expectedAnnotationsCount); updateUnsavedContent(filePathA, Utf8String(), 1); - unregisterFile(filePathA); + closeDocument(filePathA); } -TEST_F(ClangCodeModelServerSlowTest, NoInitialDocumentAnnotationsForOutdatedDocumentRevision) +TEST_F(ClangCodeModelServerSlowTest, NoInitialAnnotationsForOutdatedDocumentRevision) { - const int expectedDocumentAnnotationsChangedCount = AnnotationJobsMultiplier; // Only for registration. - registerProjectAndFile(filePathA, expectedDocumentAnnotationsChangedCount); + const int expectedAnnotationsCount = AnnotationJobsMultiplier; // Only for registration. + updateProjectAndOpenDocument(filePathA, expectedAnnotationsCount); updateUnsavedContent(filePathA, Utf8String(), 1); } TEST_F(ClangCodeModelServerSlowTest, NoCompletionsForClosedDocument) { - const int expectedDocumentAnnotationsChangedCount = AnnotationJobsMultiplier; // Only for registration. - registerProjectAndFileAndWaitForFinished(filePathA, expectedDocumentAnnotationsChangedCount); - completeCodeInFileA(); + const int expectedAnnotationsCount = AnnotationJobsMultiplier; // Only for registration. + updateProjectAndOpenDocumentAndWaitForFinished(filePathA, expectedAnnotationsCount); + requestCompletionsInFileA(); - unregisterFile(filePathA); + closeDocument(filePathA); } TEST_F(ClangCodeModelServerSlowTest, CodeCompletionDependingOnProject) { - const int expectedDocumentAnnotationsChangedCount = 2 * AnnotationJobsMultiplier; // For registration and due to project change. - registerProjectAndFileAndWaitForFinished(filePathB, expectedDocumentAnnotationsChangedCount); + const int expectedAnnotationsCount = 2 * AnnotationJobsMultiplier; // For registration and due to project change. + updateProjectAndOpenDocumentAndWaitForFinished(filePathB, expectedAnnotationsCount); expectCompletionFromFileBEnabledByMacro(); - changeProjectPartArguments(); - completeCodeInFileB(); + updateProjectPartWithArguments(); + requestCompletionsInFileB(); } TEST_F(ClangCodeModelServerSlowTest, GetCodeCompletionForUnsavedFile) { - registerProjectPart(); - expectDocumentAnnotationsChanged(AnnotationJobsMultiplier); - registerFileWithUnsavedContent(filePathA, unsavedContent(filePathAUnsavedVersion1)); + updateProjectPart(); + expectAnnotations(AnnotationJobsMultiplier); + openDocumentWithUnsavedContent(filePathA, unsavedContent(filePathAUnsavedVersion1)); expectCompletionFromFileAUnsavedMethodVersion1(); - completeCodeInFileA(); + requestCompletionsInFileA(); } TEST_F(ClangCodeModelServerSlowTest, GetNoCodeCompletionAfterRemovingUnsavedFile) { - const int expectedDocumentAnnotationsChangedCount = 2 * AnnotationJobsMultiplier; // For registration and update/removal. - registerProjectAndFileAndWaitForFinished(filePathA, expectedDocumentAnnotationsChangedCount); + const int expectedAnnotationsCount = 2 * AnnotationJobsMultiplier; // For registration and update/removal. + updateProjectAndOpenDocumentAndWaitForFinished(filePathA, expectedAnnotationsCount); removeUnsavedFile(filePathA); expectNoCompletionWithUnsavedMethod(); - completeCodeInFileA(); + requestCompletionsInFileA(); } TEST_F(ClangCodeModelServerSlowTest, GetNewCodeCompletionAfterUpdatingUnsavedFile) { - const int expectedDocumentAnnotationsChangedCount = 2 * AnnotationJobsMultiplier; // For registration and update/removal. - registerProjectAndFileAndWaitForFinished(filePathA, expectedDocumentAnnotationsChangedCount); + const int expectedAnnotationsCount = 2 * AnnotationJobsMultiplier; // For registration and update/removal. + updateProjectAndOpenDocumentAndWaitForFinished(filePathA, expectedAnnotationsCount); updateUnsavedContent(filePathA, unsavedContent(filePathAUnsavedVersion2), 1); expectCompletionFromFileAUnsavedMethodVersion2(); - completeCodeInFileA(); + requestCompletionsInFileA(); } TEST_F(ClangCodeModelServerSlowTest, TranslationUnitAfterCreationIsNotDirty) { - registerProjectAndFile(filePathA, AnnotationJobsMultiplier); + updateProjectAndOpenDocument(filePathA, AnnotationJobsMultiplier); ASSERT_THAT(clangServer, HasDirtyDocument(filePathA, projectPartId, 0U, false, false)); } TEST_F(ClangCodeModelServerSlowTest, SetCurrentAndVisibleEditor) { - registerProjectAndFilesAndWaitForFinished(); + updateProjectAndOpenDocumentsAndWaitForFinished(); auto functionDocument = documents.document(filePathA, projectPartId); auto variableDocument = documents.document(filePathB, projectPartId); @@ -344,21 +346,21 @@ TEST_F(ClangCodeModelServerSlowTest, SetCurrentAndVisibleEditor) TEST_F(ClangCodeModelServerSlowTest, StartCompletionJobFirstOnEditThatTriggersCompletion) { - registerProjectAndFile(filePathA, 2 * AnnotationJobsMultiplier); + updateProjectAndOpenDocument(filePathA, 2 * AnnotationJobsMultiplier); ASSERT_TRUE(waitUntilAllJobsFinished()); expectCompletionFromFileA(); updateUnsavedContent(filePathA, unsavedContent(filePathAUnsavedVersion2), 1); - completeCodeInFileA(); + requestCompletionsInFileA(); const QList jobs = clangServer.runningJobsForTestsOnly(); ASSERT_THAT(jobs.size(), Eq(1)); - ASSERT_THAT(jobs.first().jobRequest.type, Eq(JobRequest::Type::CompleteCode)); + ASSERT_THAT(jobs.first().jobRequest.type, Eq(JobRequest::Type::RequestCompletions)); } TEST_F(ClangCodeModelServerSlowTest, SupportiveTranslationUnitNotInitializedAfterRegister) { - registerProjectAndFile(filePathA, AnnotationJobsMultiplier); + updateProjectAndOpenDocument(filePathA, AnnotationJobsMultiplier); ASSERT_TRUE(waitUntilAllJobsFinished()); ASSERT_FALSE(isSupportiveTranslationUnitInitialized(filePathA)); @@ -366,7 +368,7 @@ TEST_F(ClangCodeModelServerSlowTest, SupportiveTranslationUnitNotInitializedAfte TEST_F(ClangCodeModelServerSlowTest, SupportiveTranslationUnitIsSetupAfterFirstEdit) { - registerProjectAndFile(filePathA, 2 * AnnotationJobsMultiplier); + updateProjectAndOpenDocument(filePathA, 2 * AnnotationJobsMultiplier); ASSERT_TRUE(waitUntilAllJobsFinished()); updateUnsavedContent(filePathA, unsavedContent(filePathAUnsavedVersion2), 1); @@ -377,7 +379,7 @@ TEST_F(ClangCodeModelServerSlowTest, SupportiveTranslationUnitIsSetupAfterFirstE TEST_F(ClangCodeModelServerSlowTest, DoNotRunDuplicateJobs) { - registerProjectAndFile(filePathA, 3 * AnnotationJobsMultiplier); + updateProjectAndOpenDocument(filePathA, 3 * AnnotationJobsMultiplier); ASSERT_TRUE(waitUntilAllJobsFinished()); updateUnsavedContent(filePathA, unsavedContent(filePathAUnsavedVersion2), 1); ASSERT_TRUE(waitUntilAllJobsFinished()); @@ -391,7 +393,7 @@ TEST_F(ClangCodeModelServerSlowTest, DoNotRunDuplicateJobs) TEST_F(ClangCodeModelServerSlowTest, OpenDocumentAndEdit) { - registerProjectAndFile(filePathA, 4 * AnnotationJobsMultiplier); + updateProjectAndOpenDocument(filePathA, 4 * AnnotationJobsMultiplier); ASSERT_TRUE(waitUntilAllJobsFinished()); for (unsigned revision = 1; revision <= 3; ++revision) { @@ -402,7 +404,7 @@ TEST_F(ClangCodeModelServerSlowTest, OpenDocumentAndEdit) TEST_F(ClangCodeModelServerSlowTest, IsNotCurrentCurrentAndVisibleEditorAnymore) { - registerProjectAndFilesAndWaitForFinished(); + updateProjectAndOpenDocumentsAndWaitForFinished(); auto functionDocument = documents.document(filePathA, projectPartId); auto variableDocument = documents.document(filePathB, projectPartId); updateVisibilty(filePathB, filePathA); @@ -417,7 +419,7 @@ TEST_F(ClangCodeModelServerSlowTest, IsNotCurrentCurrentAndVisibleEditorAnymore) TEST_F(ClangCodeModelServerSlowTest, TranslationUnitAfterUpdateNeedsReparse) { - registerProjectAndFileAndWaitForFinished(filePathA, 2 * AnnotationJobsMultiplier); + updateProjectAndOpenDocumentAndWaitForFinished(filePathA, 2 * AnnotationJobsMultiplier); updateUnsavedContent(filePathA, unsavedContent(filePathAUnsavedVersion1), 1U); ASSERT_THAT(clangServer, HasDirtyDocument(filePathA, projectPartId, 1U, true, true)); @@ -425,32 +427,32 @@ TEST_F(ClangCodeModelServerSlowTest, TranslationUnitAfterUpdateNeedsReparse) TEST_F(ClangCodeModelServerSlowTest, TakeOverJobsOnProjectPartChange) { - registerProjectAndFileAndWaitForFinished(filePathC, 2 * AnnotationJobsMultiplier); + updateProjectAndOpenDocumentAndWaitForFinished(filePathC, 2 * AnnotationJobsMultiplier); updateVisibilty(filePathB, filePathB); // Disable processing jobs requestReferences(); expectReferences(); - changeProjectPartArguments(); // Here we do not want to loose the RequestReferences job + updateProjectPartWithArguments(); // Here we do not want to loose the RequestReferences job updateVisibilty(filePathC, filePathC); // Enable processing jobs } TEST_F(ClangCodeModelServerSlowTest, TakeOverJobsOnProjectPartIdChange) { - registerProjectPart(projectPartId); - registerProjectPart(projectPartId2); - registerFile(filePathC, projectPartId, 0); + updateProjectPart(projectPartId); + updateProjectPart(projectPartId2); + openDocument(filePathC, projectPartId, 0); requestReferences(); expectReferences(); - registerFile(filePathC, projectPartId2); // Here we do not want to loose the RequestReferences job + openDocument(filePathC, projectPartId2); // Here we do not want to loose the RequestReferences job } void ClangCodeModelServer::SetUp() { clangServer.setClient(&mockClangCodeModelClient); - clangServer.setUpdateDocumentAnnotationsTimeOutInMsForTestsOnly(0); + clangServer.setUpdateAnnotationsTimeOutInMsForTestsOnly(0); clangServer.setUpdateVisibleButNotCurrentDocumentsTimeOutInMsForTestsOnly(0); } @@ -470,83 +472,81 @@ bool ClangCodeModelServer::waitUntilAllJobsFinished(int timeOutInMs) return ProcessEventUtilities::processEventsUntilTrue(noJobsRunningAnymore, timeOutInMs); } -void ClangCodeModelServer::registerProjectAndFilesAndWaitForFinished( - int expectedDocumentAnnotationsChangedMessages) +void ClangCodeModelServer::updateProjectAndOpenDocumentsAndWaitForFinished(int expectedAnnotationsdMessages) { - registerProjectPart(); - registerFiles(expectedDocumentAnnotationsChangedMessages); + updateProjectPart(); + openDocuments(expectedAnnotationsdMessages); ASSERT_TRUE(waitUntilAllJobsFinished()); } -void ClangCodeModelServer::registerFile(const Utf8String &filePath, - int expectedDocumentAnnotationsChangedMessages) +void ClangCodeModelServer::openDocument(const Utf8String &filePath, + int expectedAnnotationsMessages) { - registerFile(filePath, projectPartId, expectedDocumentAnnotationsChangedMessages); + openDocument(filePath, projectPartId, expectedAnnotationsMessages); } -void ClangCodeModelServer::registerFile(const Utf8String &filePath, +void ClangCodeModelServer::openDocument(const Utf8String &filePath, const Utf8String &projectPartId, - int expectedDocumentAnnotationsChangedMessages) + int expectedAnnotationsMessages) { const FileContainer fileContainer(filePath, projectPartId); - const RegisterTranslationUnitForEditorMessage message({fileContainer}, filePath, {filePath}); + const DocumentsOpenedMessage message({fileContainer}, filePath, {filePath}); - expectDocumentAnnotationsChanged(expectedDocumentAnnotationsChangedMessages); + expectAnnotations(expectedAnnotationsMessages); - clangServer.registerTranslationUnitsForEditor(message); + clangServer.documentsOpened(message); } -void ClangCodeModelServer::registerFiles(int expectedDocumentAnnotationsChangedMessages) +void ClangCodeModelServer::openDocuments(int expectedAnnotationsMessages) { const FileContainer fileContainerA(filePathA, projectPartId); const FileContainer fileContainerB(filePathB, projectPartId); - const RegisterTranslationUnitForEditorMessage message({fileContainerA, - fileContainerB}, - filePathA, - {filePathA, filePathB}); + const DocumentsOpenedMessage message({fileContainerA, fileContainerB}, + filePathA, + {filePathA, filePathB}); - expectDocumentAnnotationsChanged(expectedDocumentAnnotationsChangedMessages); + expectAnnotations(expectedAnnotationsMessages); - clangServer.registerTranslationUnitsForEditor(message); + clangServer.documentsOpened(message); } -void ClangCodeModelServer::expectDocumentAnnotationsChanged(int count) +void ClangCodeModelServer::expectAnnotations(int count) { - EXPECT_CALL(mockClangCodeModelClient, documentAnnotationsChanged(_)).Times(count); + EXPECT_CALL(mockClangCodeModelClient, annotations(_)).Times(count); } -void ClangCodeModelServer::registerFileWithUnsavedContent(const Utf8String &filePath, - const Utf8String &unsavedContent) +void ClangCodeModelServer::openDocumentWithUnsavedContent(const Utf8String &filePath, + const Utf8String &unsavedContent) { const FileContainer fileContainer(filePath, projectPartId, unsavedContent, true); - const RegisterTranslationUnitForEditorMessage message({fileContainer}, filePath, {filePath}); + const DocumentsOpenedMessage message({fileContainer}, filePath, {filePath}); - clangServer.registerTranslationUnitsForEditor(message); + clangServer.documentsOpened(message); } -void ClangCodeModelServer::completeCode(const Utf8String &filePath, - uint line, - uint column, - const Utf8String &projectPartId) +void ClangCodeModelServer::requestCompletions(const Utf8String &filePath, + uint line, + uint column, + const Utf8String &projectPartId) { Utf8String theProjectPartId = projectPartId; if (theProjectPartId.isEmpty()) theProjectPartId = this->projectPartId; - const CompleteCodeMessage message(filePath, line, column, theProjectPartId); + const RequestCompletionsMessage message(filePath, line, column, theProjectPartId); - clangServer.completeCode(message); + clangServer.requestCompletions(message); } -void ClangCodeModelServer::completeCodeInFileA() +void ClangCodeModelServer::requestCompletionsInFileA() { - completeCode(filePathA, 20, 1); + requestCompletions(filePathA, 20, 1); } -void ClangCodeModelServer::completeCodeInFileB() +void ClangCodeModelServer::requestCompletionsInFileB() { - completeCode(filePathB, 35, 1); + requestCompletions(filePathB, 35, 1); } bool ClangCodeModelServer::isSupportiveTranslationUnitInitialized(const Utf8String &filePath) @@ -570,7 +570,7 @@ DocumentProcessor ClangCodeModelServer::documentProcessorForFile(const Utf8Strin void ClangCodeModelServer::expectCompletion(const CodeCompletion &completion) { EXPECT_CALL(mockClangCodeModelClient, - codeCompleted(Field(&CodeCompletedMessage::codeCompletions, + completions(Field(&CompletionsMessage::codeCompletions, Contains(completion)))) .Times(1); } @@ -609,7 +609,7 @@ void ClangCodeModelServer::expectNoCompletionWithUnsavedMethod() CodeCompletion::FunctionCompletionKind); EXPECT_CALL(mockClangCodeModelClient, - codeCompleted(Field(&CodeCompletedMessage::codeCompletions, + completions(Field(&CompletionsMessage::codeCompletions, Not(Contains(completion))))) .Times(1); } @@ -649,11 +649,11 @@ void ClangCodeModelServer::expectCompletionFromFileA() expectCompletion(completion); } -void ClangCodeModelServer::requestDocumentAnnotations(const Utf8String &filePath) +void ClangCodeModelServer::requestAnnotations(const Utf8String &filePath) { - const RequestDocumentAnnotationsMessage message({filePath, projectPartId}); + const RequestAnnotationsMessage message({filePath, projectPartId}); - clangServer.requestDocumentAnnotations(message); + clangServer.requestAnnotations(message); } void ClangCodeModelServer::requestReferences(quint32 documentRevision) @@ -674,7 +674,7 @@ void ClangCodeModelServer::requestFollowSymbol(quint32 documentRevision) clangServer.requestFollowSymbol(message); } -void ClangCodeModelServer::expectDocumentAnnotationsChangedForFileBWithSpecificHighlightingMark() +void ClangCodeModelServer::expectAnnotationsForFileBWithSpecificHighlightingMark() { HighlightingTypes types; types.mainHighlightingType = ClangBackEnd::HighlightingType::Function; @@ -682,80 +682,79 @@ void ClangCodeModelServer::expectDocumentAnnotationsChangedForFileBWithSpecificH types.mixinHighlightingTypes.push_back(ClangBackEnd::HighlightingType::FunctionDefinition); const TokenInfoContainer tokenInfo(1, 6, 8, types); EXPECT_CALL(mockClangCodeModelClient, - documentAnnotationsChanged( - Field(&DocumentAnnotationsChangedMessage::tokenInfos, + annotations( + Field(&AnnotationsMessage::tokenInfos, PartlyContains(tokenInfo)))).Times(AnnotationJobsMultiplier); } void ClangCodeModelServer::updateUnsavedContent(const Utf8String &filePath, - const Utf8String &fileContent, - quint32 revisionNumber) + const Utf8String &fileContent, + quint32 revisionNumber) { const FileContainer fileContainer(filePath, projectPartId, fileContent, true, revisionNumber); - const UpdateTranslationUnitsForEditorMessage message({fileContainer}); + const DocumentsChangedMessage message({fileContainer}); - clangServer.updateTranslationUnitsForEditor(message); + clangServer.documentsChanged(message); } void ClangCodeModelServer::removeUnsavedFile(const Utf8String &filePath) { const FileContainer fileContainer(filePath, projectPartId, Utf8StringVector(), 74); - const UpdateTranslationUnitsForEditorMessage message({fileContainer}); + const DocumentsChangedMessage message({fileContainer}); - clangServer.updateTranslationUnitsForEditor(message); + clangServer.documentsChanged(message); } -void ClangCodeModelServer::unregisterFile(const Utf8String &filePath) +void ClangCodeModelServer::closeDocument(const Utf8String &filePath) { const QVector fileContainers = {FileContainer(filePath, projectPartId)}; - const UnregisterTranslationUnitsForEditorMessage message(fileContainers); + const DocumentsClosedMessage message(fileContainers); - clangServer.unregisterTranslationUnitsForEditor(message); + clangServer.documentsClosed(message); } -void ClangCodeModelServer::registerProjectPart() +void ClangCodeModelServer::updateProjectPart() { - registerProjectPart(projectPartId); + updateProjectPart(projectPartId); } -void ClangCodeModelServer::registerProjectPart(const Utf8String &projectPartId) +void ClangCodeModelServer::updateProjectPart(const Utf8String &projectPartId) { - RegisterProjectPartsForEditorMessage message({ProjectPartContainer(projectPartId)}); + ProjectPartsUpdatedMessage message({ProjectPartContainer(projectPartId)}); - clangServer.registerProjectPartsForEditor(message); + clangServer.projectPartsUpdated(message); } -void ClangCodeModelServer::registerProjectAndFile(const Utf8String &filePath, - int expectedDocumentAnnotationsChangedMessages) +void ClangCodeModelServer::updateProjectAndOpenDocument(const Utf8String &filePath, + int expectedAnnotationsMessages) { - registerProjectPart(); - registerFile(filePath, expectedDocumentAnnotationsChangedMessages); + updateProjectPart(); + openDocument(filePath, expectedAnnotationsMessages); } -void ClangCodeModelServer::registerProjectAndFileAndWaitForFinished( - const Utf8String &filePath, - int expectedDocumentAnnotationsChangedMessages) +void ClangCodeModelServer::updateProjectAndOpenDocumentAndWaitForFinished( + const Utf8String &filePath, int expectedAnnotationsMessages) { - registerProjectAndFile(filePath, expectedDocumentAnnotationsChangedMessages); + updateProjectAndOpenDocument(filePath, expectedAnnotationsMessages); ASSERT_TRUE(waitUntilAllJobsFinished()); } -void ClangCodeModelServer::changeProjectPartArguments() +void ClangCodeModelServer::updateProjectPartWithArguments() { const ProjectPartContainer projectPartContainer(projectPartId, {Utf8StringLiteral("-DArgumentDefinition")}); - const RegisterProjectPartsForEditorMessage message({projectPartContainer}); + const ProjectPartsUpdatedMessage message({projectPartContainer}); - clangServer.registerProjectPartsForEditor(message); + clangServer.projectPartsUpdated(message); } void ClangCodeModelServer::updateVisibilty(const Utf8String ¤tEditor, - const Utf8String &additionalVisibleEditor) + const Utf8String &additionalVisibleEditor) { - const UpdateVisibleTranslationUnitsMessage message(currentEditor, - {currentEditor, additionalVisibleEditor}); + const DocumentVisibilityChangedMessage message(currentEditor, + {currentEditor, additionalVisibleEditor}); - clangServer.updateVisibleTranslationUnits(message); + clangServer.documentVisibilityChanged(message); } const Utf8String ClangCodeModelServer::unsavedContent(const QString &unsavedFilePath) diff --git a/tests/unit/unittest/clangcompletecodejob-test.cpp b/tests/unit/unittest/clangcompletecodejob-test.cpp index fd7113a2eb5..2b23dfc09d5 100644 --- a/tests/unit/unittest/clangcompletecodejob-test.cpp +++ b/tests/unit/unittest/clangcompletecodejob-test.cpp @@ -38,7 +38,7 @@ namespace { class CompleteCodeJob : public ClangAsyncJobTest { protected: - void SetUp() override { BaseSetUp(JobRequest::Type::CompleteCode, job); } + void SetUp() override { BaseSetUp(JobRequest::Type::RequestCompletions, job); } protected: ClangBackEnd::CompleteCodeJob job; @@ -65,7 +65,7 @@ TEST_F(CompleteCodeJob, SendAnnotations) { job.setContext(jobContextWithMockClient); job.prepareAsyncRun(); - EXPECT_CALL(mockIpcClient, codeCompleted(_)).Times(1); + EXPECT_CALL(mockIpcClient, completions(_)).Times(1); job.runAsync(); @@ -79,8 +79,8 @@ TEST_F(CompleteCodeJob, ForwardTicketNumber) job.setContext(jobContextWithMockClient); job.prepareAsyncRun(); EXPECT_CALL(mockIpcClient, - codeCompleted(Field(&CodeCompletedMessage::ticketNumber, - Eq(jobRequest.ticketNumber)))) + completions(Field(&CompletionsMessage::ticketNumber, + Eq(jobRequest.ticketNumber)))) .Times(1); job.runAsync(); @@ -92,7 +92,7 @@ TEST_F(CompleteCodeJob, DontSendCompletionsIfDocumentWasClosed) { job.setContext(jobContextWithMockClient); job.prepareAsyncRun(); - EXPECT_CALL(mockIpcClient, codeCompleted(_)).Times(0); + EXPECT_CALL(mockIpcClient, completions(_)).Times(0); job.runAsync(); documents.remove({FileContainer{filePath, projectPartId}}); diff --git a/tests/unit/unittest/clangdocumentprocessor-test.cpp b/tests/unit/unittest/clangdocumentprocessor-test.cpp index d18803eb4bb..d441688c752 100644 --- a/tests/unit/unittest/clangdocumentprocessor-test.cpp +++ b/tests/unit/unittest/clangdocumentprocessor-test.cpp @@ -72,7 +72,7 @@ TEST_F(DocumentProcessor, ProcessEmpty) TEST_F(DocumentProcessorSlowTest, ProcessSingleJob) { const JobRequest jobRequest - = documentProcessor->createJobRequest(JobRequest::Type::UpdateDocumentAnnotations); + = documentProcessor->createJobRequest(JobRequest::Type::UpdateAnnotations); documentProcessor->addJob(jobRequest); const JobRequests jobsStarted = documentProcessor->process(); diff --git a/tests/unit/unittest/clangdocumentprocessors-test.cpp b/tests/unit/unittest/clangdocumentprocessors-test.cpp index 0e16ab1f4e0..8142d9d408a 100644 --- a/tests/unit/unittest/clangdocumentprocessors-test.cpp +++ b/tests/unit/unittest/clangdocumentprocessors-test.cpp @@ -157,7 +157,7 @@ TEST_F(DocumentProcessors, ProcessEmpty) TEST_F(DocumentProcessorsSlowTest, ProcessSingle) { DocumentProcessor documentProcessor = documentProcessors.create(document); - documentProcessor.addJob(JobRequest::Type::UpdateDocumentAnnotations); + documentProcessor.addJob(JobRequest::Type::UpdateAnnotations); const JobRequests jobsStarted = documentProcessors.process(); diff --git a/tests/unit/unittest/clangjobqueue-test.cpp b/tests/unit/unittest/clangjobqueue-test.cpp index de0161c713c..b5758dc25b9 100644 --- a/tests/unit/unittest/clangjobqueue-test.cpp +++ b/tests/unit/unittest/clangjobqueue-test.cpp @@ -90,7 +90,7 @@ protected: TEST_F(JobQueue, AddJob) { const JobRequest jobRequest = createJobRequest(filePath1, - JobRequest::Type::UpdateDocumentAnnotations); + JobRequest::Type::UpdateAnnotations); jobQueue.add(jobRequest); @@ -100,7 +100,7 @@ TEST_F(JobQueue, AddJob) TEST_F(JobQueue, DoNotAddDuplicate) { const JobRequest request = createJobRequest(filePath1, - JobRequest::Type::UpdateDocumentAnnotations); + JobRequest::Type::UpdateAnnotations); jobQueue.add(request); const bool added = jobQueue.add(request); @@ -115,7 +115,7 @@ TEST_F(JobQueue, DoNotAddDuplicateForWhichAJobIsAlreadyRunning) }); const bool added = jobQueue.add(createJobRequest(filePath1, - JobRequest::Type::UpdateDocumentAnnotations)); + JobRequest::Type::UpdateAnnotations)); ASSERT_FALSE(added); } @@ -127,7 +127,7 @@ TEST_F(JobQueue, DoNotAddForNotExistingDocument) }); const bool added = jobQueue.add(createJobRequest(Utf8StringLiteral("notExistingDocument.cpp"), - JobRequest::Type::UpdateDocumentAnnotations)); + JobRequest::Type::UpdateAnnotations)); ASSERT_FALSE(added); } @@ -136,7 +136,7 @@ TEST_F(JobQueue, DoNotAddForNotIntactDocument) { document.setHasParseOrReparseFailed(true); const bool added = jobQueue.add(createJobRequest(filePath1, - JobRequest::Type::UpdateDocumentAnnotations)); + JobRequest::Type::UpdateAnnotations)); ASSERT_FALSE(added); } @@ -150,7 +150,7 @@ TEST_F(JobQueue, CancelDuringAddForNotIntactDocument) }); - jobQueue.add(createJobRequest(filePath1, JobRequest::Type::UpdateDocumentAnnotations)); + jobQueue.add(createJobRequest(filePath1, JobRequest::Type::UpdateAnnotations)); ASSERT_TRUE(canceled); } @@ -164,7 +164,7 @@ TEST_F(JobQueue, ProcessEmpty) TEST_F(JobQueue, ProcessSingleJob) { - jobQueue.add(createJobRequest(filePath1, JobRequest::Type::UpdateDocumentAnnotations)); + jobQueue.add(createJobRequest(filePath1, JobRequest::Type::UpdateAnnotations)); const JobRequests jobsToRun = jobQueue.processQueue(); @@ -174,7 +174,7 @@ TEST_F(JobQueue, ProcessSingleJob) TEST_F(JobQueue, ProcessUntilEmpty) { - jobQueue.add(createJobRequest(filePath1, JobRequest::Type::UpdateDocumentAnnotations)); + jobQueue.add(createJobRequest(filePath1, JobRequest::Type::UpdateAnnotations)); jobQueue.add(createJobRequest(filePath1, JobRequest::Type::ParseSupportiveTranslationUnit)); JobRequests jobsToRun; @@ -191,7 +191,7 @@ TEST_F(JobQueue, ProcessUntilEmpty) TEST_F(JobQueue, RemoveRequestsForClosedDocuments) { - jobQueue.add(createJobRequest(filePath1, JobRequest::Type::UpdateDocumentAnnotations)); + jobQueue.add(createJobRequest(filePath1, JobRequest::Type::UpdateAnnotations)); removeDocument(); const JobRequests jobsToRun = jobQueue.processQueue(); @@ -202,7 +202,7 @@ TEST_F(JobQueue, RemoveRequestsForClosedDocuments) TEST_F(JobQueue, RemoveRequestsForClosedProject) { - jobQueue.add(createJobRequest(filePath1, JobRequest::Type::UpdateDocumentAnnotations)); + jobQueue.add(createJobRequest(filePath1, JobRequest::Type::UpdateAnnotations)); removeProject(); const JobRequests jobsToRun = jobQueue.processQueue(); @@ -213,7 +213,7 @@ TEST_F(JobQueue, RemoveRequestsForClosedProject) TEST_F(JobQueue, RemoveRequestsForOudatedUnsavedFiles) { - jobQueue.add(createJobRequest(filePath1, JobRequest::Type::UpdateDocumentAnnotations)); + jobQueue.add(createJobRequest(filePath1, JobRequest::Type::UpdateAnnotations)); updateUnsavedFiles(); const JobRequests jobsToRun = jobQueue.processQueue(); @@ -224,7 +224,7 @@ TEST_F(JobQueue, RemoveRequestsForOudatedUnsavedFiles) TEST_F(JobQueue, RemoveRequestsForChangedDocumentRevision) { - jobQueue.add(createJobRequest(filePath1, JobRequest::Type::UpdateDocumentAnnotations)); + jobQueue.add(createJobRequest(filePath1, JobRequest::Type::UpdateAnnotations)); updateDocumentRevision(); const JobRequests jobsToRun = jobQueue.processQueue(); @@ -235,7 +235,7 @@ TEST_F(JobQueue, RemoveRequestsForChangedDocumentRevision) TEST_F(JobQueue, RemoveRequestsForOudatedProject) { - jobQueue.add(createJobRequest(filePath1, JobRequest::Type::UpdateDocumentAnnotations)); + jobQueue.add(createJobRequest(filePath1, JobRequest::Type::UpdateAnnotations)); updateProject(); const JobRequests jobsToRun = jobQueue.processQueue(); @@ -247,7 +247,7 @@ TEST_F(JobQueue, RemoveRequestsForOudatedProject) TEST_F(JobQueue, RemoveRequestsForNotIntactDocuments) { const Utf8String filePath = createTranslationUnitForDeletedFile(); - jobQueue.add(createJobRequest(filePath, JobRequest::Type::UpdateDocumentAnnotations)); + jobQueue.add(createJobRequest(filePath, JobRequest::Type::UpdateAnnotations)); const JobRequests jobsToRun = jobQueue.processQueue(); @@ -257,7 +257,7 @@ TEST_F(JobQueue, RemoveRequestsForNotIntactDocuments) TEST_F(JobQueue, CancelRequestsForNotIntactDocuments) { - jobQueue.add(createJobRequest(filePath1, JobRequest::Type::UpdateDocumentAnnotations)); + jobQueue.add(createJobRequest(filePath1, JobRequest::Type::UpdateAnnotations)); document.setHasParseOrReparseFailed(true); bool canceled = false; jobQueue.setCancelJobRequest([&canceled](const JobRequest &) { @@ -272,8 +272,8 @@ TEST_F(JobQueue, CancelRequestsForNotIntactDocuments) TEST_F(JobQueue, PrioritizeCurrentDocumentOverNotCurrent) { resetVisibilityAndCurrentEditor(); - jobQueue.add(createJobRequest(filePath1, JobRequest::Type::UpdateDocumentAnnotations)); - jobQueue.add(createJobRequest(filePath2, JobRequest::Type::UpdateDocumentAnnotations)); + jobQueue.add(createJobRequest(filePath1, JobRequest::Type::UpdateAnnotations)); + jobQueue.add(createJobRequest(filePath2, JobRequest::Type::UpdateAnnotations)); documents.setUsedByCurrentEditor(filePath2); jobQueue.prioritizeRequests(); @@ -284,8 +284,8 @@ TEST_F(JobQueue, PrioritizeCurrentDocumentOverNotCurrent) TEST_F(JobQueue, PrioritizeVisibleDocumentsOverNotVisible) { resetVisibilityAndCurrentEditor(); - jobQueue.add(createJobRequest(filePath1, JobRequest::Type::UpdateDocumentAnnotations)); - jobQueue.add(createJobRequest(filePath2, JobRequest::Type::UpdateDocumentAnnotations)); + jobQueue.add(createJobRequest(filePath1, JobRequest::Type::UpdateAnnotations)); + jobQueue.add(createJobRequest(filePath2, JobRequest::Type::UpdateAnnotations)); documents.setVisibleInEditors({filePath2}); jobQueue.prioritizeRequests(); @@ -296,8 +296,8 @@ TEST_F(JobQueue, PrioritizeVisibleDocumentsOverNotVisible) TEST_F(JobQueue, PrioritizeCurrentDocumentOverVisible) { resetVisibilityAndCurrentEditor(); - jobQueue.add(createJobRequest(filePath1, JobRequest::Type::UpdateDocumentAnnotations)); - jobQueue.add(createJobRequest(filePath2, JobRequest::Type::UpdateDocumentAnnotations)); + jobQueue.add(createJobRequest(filePath1, JobRequest::Type::UpdateAnnotations)); + jobQueue.add(createJobRequest(filePath2, JobRequest::Type::UpdateAnnotations)); documents.setVisibleInEditors({filePath1, filePath2}); documents.setUsedByCurrentEditor(filePath2); @@ -308,7 +308,7 @@ TEST_F(JobQueue, PrioritizeCurrentDocumentOverVisible) TEST_F(JobQueue, RunNothingForNotCurrentOrVisibleDocument) { - jobQueue.add(createJobRequest(filePath1, JobRequest::Type::UpdateDocumentAnnotations)); + jobQueue.add(createJobRequest(filePath1, JobRequest::Type::UpdateAnnotations)); documents.setVisibleInEditors({}); documents.setUsedByCurrentEditor(Utf8StringLiteral("aNonExistingFilePath")); @@ -319,8 +319,8 @@ TEST_F(JobQueue, RunNothingForNotCurrentOrVisibleDocument) TEST_F(JobQueue, RunOnlyOneJobPerTranslationUnitIfMultipleAreInQueue) { - jobQueue.add(createJobRequest(filePath1, JobRequest::Type::UpdateDocumentAnnotations)); - jobQueue.add(createJobRequest(filePath1, JobRequest::Type::RequestDocumentAnnotations)); + jobQueue.add(createJobRequest(filePath1, JobRequest::Type::UpdateAnnotations)); + jobQueue.add(createJobRequest(filePath1, JobRequest::Type::RequestAnnotations)); const JobRequests jobsToRun = jobQueue.processQueue(); @@ -335,10 +335,10 @@ TEST_F(JobQueue, RunJobsForDistinctTranslationUnits) const TranslationUnit alternativeTu = document.translationUnits().createAndAppend(); document.translationUnits().updateParseTimePoint(alternativeTu.id(), Clock::now()); jobQueue.add(createJobRequest(filePath1, - JobRequest::Type::UpdateDocumentAnnotations, + JobRequest::Type::UpdateAnnotations, PreferredTranslationUnit::RecentlyParsed)); jobQueue.add(createJobRequest(filePath1, - JobRequest::Type::UpdateDocumentAnnotations, + JobRequest::Type::UpdateAnnotations, PreferredTranslationUnit::PreviouslyParsed)); const JobRequests jobsToRun = jobQueue.processQueue(); @@ -348,7 +348,7 @@ TEST_F(JobQueue, RunJobsForDistinctTranslationUnits) } TEST_F(JobQueue, DoNotRunJobForTranslationUnittThatIsBeingProcessed) { - jobQueue.add(createJobRequest(filePath1, JobRequest::Type::UpdateDocumentAnnotations)); + jobQueue.add(createJobRequest(filePath1, JobRequest::Type::UpdateAnnotations)); JobRequests jobsToRun = jobQueue.processQueue(); jobQueue.setIsJobRunningForTranslationUnitHandler([](const Utf8String &) { return true; @@ -359,9 +359,9 @@ TEST_F(JobQueue, DoNotRunJobForTranslationUnittThatIsBeingProcessed) ASSERT_THAT(jobsToRun.size(), Eq(0)); } -TEST_F(JobQueue, RequestUpdateDocumentAnnotationsOutdatableByUnsavedFileChange) +TEST_F(JobQueue, RequestUpdateAnnotationsOutdatableByUnsavedFileChange) { - jobQueue.add(createJobRequest(filePath1, JobRequest::Type::UpdateDocumentAnnotations)); + jobQueue.add(createJobRequest(filePath1, JobRequest::Type::UpdateAnnotations)); updateUnsavedFiles(); const JobRequests jobsToStart = jobQueue.processQueue(); @@ -369,9 +369,9 @@ TEST_F(JobQueue, RequestUpdateDocumentAnnotationsOutdatableByUnsavedFileChange) ASSERT_THAT(jobsToStart.size(), Eq(0)); } -TEST_F(JobQueue, RequestUpdateDocumentAnnotationsOutdatableByProjectRemoval) +TEST_F(JobQueue, RequestUpdateAnnotationsOutdatableByProjectRemoval) { - jobQueue.add(createJobRequest(filePath1, JobRequest::Type::UpdateDocumentAnnotations)); + jobQueue.add(createJobRequest(filePath1, JobRequest::Type::UpdateAnnotations)); removeProject(); const JobRequests jobsToStart = jobQueue.processQueue(); @@ -379,9 +379,9 @@ TEST_F(JobQueue, RequestUpdateDocumentAnnotationsOutdatableByProjectRemoval) ASSERT_THAT(jobsToStart.size(), Eq(0)); } -TEST_F(JobQueue, RequestUpdateDocumentAnnotationsOutdatableByProjectChange) +TEST_F(JobQueue, RequestUpdateAnnotationsOutdatableByProjectChange) { - jobQueue.add(createJobRequest(filePath1, JobRequest::Type::UpdateDocumentAnnotations)); + jobQueue.add(createJobRequest(filePath1, JobRequest::Type::UpdateAnnotations)); updateProject(); const JobRequests jobsToStart = jobQueue.processQueue(); @@ -389,9 +389,9 @@ TEST_F(JobQueue, RequestUpdateDocumentAnnotationsOutdatableByProjectChange) ASSERT_THAT(jobsToStart.size(), Eq(0)); } -TEST_F(JobQueue, RequestUpdateDocumentAnnotationsOutdatableByDocumentClose) +TEST_F(JobQueue, RequestUpdateAnnotationsOutdatableByDocumentClose) { - jobQueue.add(createJobRequest(filePath1, JobRequest::Type::UpdateDocumentAnnotations)); + jobQueue.add(createJobRequest(filePath1, JobRequest::Type::UpdateAnnotations)); removeDocument(); const JobRequests jobsToStart = jobQueue.processQueue(); @@ -399,9 +399,9 @@ TEST_F(JobQueue, RequestUpdateDocumentAnnotationsOutdatableByDocumentClose) ASSERT_THAT(jobsToStart.size(), Eq(0)); } -TEST_F(JobQueue, RequestUpdateDocumentAnnotationsOutdatableByNotIntactDocument) +TEST_F(JobQueue, RequestUpdateAnnotationsOutdatableByNotIntactDocument) { - jobQueue.add(createJobRequest(filePath1, JobRequest::Type::UpdateDocumentAnnotations)); + jobQueue.add(createJobRequest(filePath1, JobRequest::Type::UpdateAnnotations)); document.setHasParseOrReparseFailed(true); const JobRequests jobsToStart = jobQueue.processQueue(); @@ -411,7 +411,7 @@ TEST_F(JobQueue, RequestUpdateDocumentAnnotationsOutdatableByNotIntactDocument) TEST_F(JobQueue, RequestCompleteCodeOutdatableByDocumentClose) { - jobQueue.add(createJobRequest(filePath1, JobRequest::Type::CompleteCode)); + jobQueue.add(createJobRequest(filePath1, JobRequest::Type::RequestCompletions)); removeDocument(); const JobRequests jobsToStart = jobQueue.processQueue(); @@ -422,7 +422,7 @@ TEST_F(JobQueue, RequestCompleteCodeOutdatableByDocumentClose) TEST_F(JobQueue, RequestCompleteCodeNotOutdatableByUnsavedFilesChange) { pretendParsedTranslationUnit(); - jobQueue.add(createJobRequest(filePath1, JobRequest::Type::CompleteCode)); + jobQueue.add(createJobRequest(filePath1, JobRequest::Type::RequestCompletions)); updateUnsavedFiles(); const JobRequests jobsToStart = jobQueue.processQueue(); @@ -433,7 +433,7 @@ TEST_F(JobQueue, RequestCompleteCodeNotOutdatableByUnsavedFilesChange) TEST_F(JobQueue, RequestCompleteCodeNotOutdatableByDocumentRevisionChange) { pretendParsedTranslationUnit(); - jobQueue.add(createJobRequest(filePath1, JobRequest::Type::CompleteCode)); + jobQueue.add(createJobRequest(filePath1, JobRequest::Type::RequestCompletions)); updateDocumentRevision(); const JobRequests jobsToStart = jobQueue.processQueue(); @@ -443,7 +443,7 @@ TEST_F(JobQueue, RequestCompleteCodeNotOutdatableByDocumentRevisionChange) TEST_F(JobQueue, RequestCompleteCodeOutdatableByDocumentRevisionChange) { - jobQueue.add(createJobRequest(filePath1, JobRequest::Type::RequestDocumentAnnotations)); + jobQueue.add(createJobRequest(filePath1, JobRequest::Type::RequestAnnotations)); updateDocumentRevision(); const JobRequests jobsToStart = jobQueue.processQueue(); diff --git a/tests/unit/unittest/clangjobs-test.cpp b/tests/unit/unittest/clangjobs-test.cpp index cf3507d1087..3288b216d42 100644 --- a/tests/unit/unittest/clangjobs-test.cpp +++ b/tests/unit/unittest/clangjobs-test.cpp @@ -83,7 +83,7 @@ TEST_F(Jobs, ProcessEmptyQueue) TEST_F(JobsSlowTest, ProcessQueueWithSingleJob) { - jobs.add(document, JobRequest::Type::UpdateDocumentAnnotations); + jobs.add(document, JobRequest::Type::UpdateAnnotations); const JobRequests jobsStarted = jobs.process(); @@ -93,9 +93,9 @@ TEST_F(JobsSlowTest, ProcessQueueWithSingleJob) TEST_F(JobsSlowTest, ProcessQueueUntilEmpty) { - jobs.add(document, JobRequest::Type::UpdateDocumentAnnotations); - jobs.add(document, JobRequest::Type::UpdateDocumentAnnotations); - jobs.add(document, JobRequest::Type::UpdateDocumentAnnotations); + jobs.add(document, JobRequest::Type::UpdateAnnotations); + jobs.add(document, JobRequest::Type::UpdateAnnotations); + jobs.add(document, JobRequest::Type::UpdateAnnotations); jobs.process(); @@ -104,7 +104,7 @@ TEST_F(JobsSlowTest, ProcessQueueUntilEmpty) TEST_F(JobsSlowTest, IsJobRunning) { - jobs.add(document, JobRequest::Type::UpdateDocumentAnnotations); + jobs.add(document, JobRequest::Type::UpdateAnnotations); jobs.process(); const bool isJobRunning = jobs.isJobRunningForTranslationUnit(document.translationUnit().id()); diff --git a/tests/unit/unittest/clangrequestdocumentannotationsjob-test.cpp b/tests/unit/unittest/clangrequestannotationsjob-test.cpp similarity index 74% rename from tests/unit/unittest/clangrequestdocumentannotationsjob-test.cpp rename to tests/unit/unittest/clangrequestannotationsjob-test.cpp index 5e2d77fee41..76740d041a2 100644 --- a/tests/unit/unittest/clangrequestdocumentannotationsjob-test.cpp +++ b/tests/unit/unittest/clangrequestannotationsjob-test.cpp @@ -25,7 +25,7 @@ #include "clangasyncjob-base.h" -#include +#include using namespace ClangBackEnd; @@ -33,23 +33,23 @@ using testing::_; namespace { -class RequestDocumentAnnotationsJob : public ClangAsyncJobTest +class RequestAnnotationsJob : public ClangAsyncJobTest { protected: - void SetUp() override { BaseSetUp(JobRequest::Type::RequestDocumentAnnotations, job); } + void SetUp() override { BaseSetUp(JobRequest::Type::RequestAnnotations, job); } protected: - ClangBackEnd::RequestDocumentAnnotationsJob job; + ClangBackEnd::RequestAnnotationsJob job; }; -TEST_F(RequestDocumentAnnotationsJob, PrepareAsyncRun) +TEST_F(RequestAnnotationsJob, PrepareAsyncRun) { job.setContext(jobContext); ASSERT_TRUE(job.prepareAsyncRun()); } -TEST_F(RequestDocumentAnnotationsJob, RunAsync) +TEST_F(RequestAnnotationsJob, RunAsync) { job.setContext(jobContext); job.prepareAsyncRun(); @@ -59,22 +59,22 @@ TEST_F(RequestDocumentAnnotationsJob, RunAsync) ASSERT_TRUE(waitUntilJobFinished(job)); } -TEST_F(RequestDocumentAnnotationsJob, SendAnnotations) +TEST_F(RequestAnnotationsJob, SendAnnotations) { job.setContext(jobContextWithMockClient); job.prepareAsyncRun(); - EXPECT_CALL(mockIpcClient, documentAnnotationsChanged(_)).Times(1); + EXPECT_CALL(mockIpcClient, annotations(_)).Times(1); job.runAsync(); ASSERT_TRUE(waitUntilJobFinished(job)); } -TEST_F(RequestDocumentAnnotationsJob, DontSendAnnotationsIfDocumentWasClosed) +TEST_F(RequestAnnotationsJob, DontSendAnnotationsIfDocumentWasClosed) { job.setContext(jobContextWithMockClient); job.prepareAsyncRun(); - EXPECT_CALL(mockIpcClient, documentAnnotationsChanged(_)).Times(0); + EXPECT_CALL(mockIpcClient, annotations(_)).Times(0); job.runAsync(); documents.remove({FileContainer{filePath, projectPartId}}); diff --git a/tests/unit/unittest/clangresumedocumentjob-test.cpp b/tests/unit/unittest/clangresumedocumentjob-test.cpp index 11a9e49072f..9582b0c0d1f 100644 --- a/tests/unit/unittest/clangresumedocumentjob-test.cpp +++ b/tests/unit/unittest/clangresumedocumentjob-test.cpp @@ -83,7 +83,7 @@ TEST_F(ResumeDocumentJob, SendsAnnotationsAfterResume) suspendDocument(); job.setContext(jobContextWithMockClient); job.prepareAsyncRun(); - EXPECT_CALL(mockIpcClient, documentAnnotationsChanged(_)).Times(1); + EXPECT_CALL(mockIpcClient, annotations(_)).Times(1); job.runAsync(); ASSERT_TRUE(waitUntilJobFinished(job)); diff --git a/tests/unit/unittest/clangupdatedocumentannotationsjob-test.cpp b/tests/unit/unittest/clangupdateannotationsjob-test.cpp similarity index 73% rename from tests/unit/unittest/clangupdatedocumentannotationsjob-test.cpp rename to tests/unit/unittest/clangupdateannotationsjob-test.cpp index 1378cce878f..8c6ee421fde 100644 --- a/tests/unit/unittest/clangupdatedocumentannotationsjob-test.cpp +++ b/tests/unit/unittest/clangupdateannotationsjob-test.cpp @@ -25,7 +25,7 @@ #include "clangasyncjob-base.h" -#include +#include using namespace ClangBackEnd; @@ -34,25 +34,25 @@ using testing::_; namespace { -class UpdateDocumentAnnotationsJob : public ClangAsyncJobTest +class UpdateAnnotationsJob : public ClangAsyncJobTest { protected: - void SetUp() override { BaseSetUp(JobRequest::Type::UpdateDocumentAnnotations, job); } + void SetUp() override { BaseSetUp(JobRequest::Type::UpdateAnnotations, job); } protected: - ClangBackEnd::UpdateDocumentAnnotationsJob job; + ClangBackEnd::UpdateAnnotationsJob job; }; -using UpdateDocumentAnnotationsJobSlowTest = UpdateDocumentAnnotationsJob; +using UpdateAnnotationsJobSlowTest = UpdateAnnotationsJob; -TEST_F(UpdateDocumentAnnotationsJob, PrepareAsyncRun) +TEST_F(UpdateAnnotationsJob, PrepareAsyncRun) { job.setContext(jobContext); ASSERT_TRUE(job.prepareAsyncRun()); } -TEST_F(UpdateDocumentAnnotationsJobSlowTest, RunAsync) +TEST_F(UpdateAnnotationsJobSlowTest, RunAsync) { job.setContext(jobContext); job.prepareAsyncRun(); @@ -62,22 +62,22 @@ TEST_F(UpdateDocumentAnnotationsJobSlowTest, RunAsync) ASSERT_TRUE(waitUntilJobFinished(job)); } -TEST_F(UpdateDocumentAnnotationsJobSlowTest, SendAnnotations) +TEST_F(UpdateAnnotationsJobSlowTest, SendAnnotations) { job.setContext(jobContextWithMockClient); job.prepareAsyncRun(); - EXPECT_CALL(mockIpcClient, documentAnnotationsChanged(_)).Times(1); + EXPECT_CALL(mockIpcClient, annotations(_)).Times(1); job.runAsync(); ASSERT_TRUE(waitUntilJobFinished(job)); } -TEST_F(UpdateDocumentAnnotationsJobSlowTest, DontSendAnnotationsIfDocumentWasClosed) +TEST_F(UpdateAnnotationsJobSlowTest, DontSendAnnotationsIfDocumentWasClosed) { job.setContext(jobContextWithMockClient); job.prepareAsyncRun(); - EXPECT_CALL(mockIpcClient, documentAnnotationsChanged(_)).Times(0); + EXPECT_CALL(mockIpcClient, annotations(_)).Times(0); job.runAsync(); documents.remove({FileContainer{filePath, projectPartId}}); @@ -85,11 +85,11 @@ TEST_F(UpdateDocumentAnnotationsJobSlowTest, DontSendAnnotationsIfDocumentWasClo ASSERT_TRUE(waitUntilJobFinished(job)); } -TEST_F(UpdateDocumentAnnotationsJobSlowTest, DontSendAnnotationsIfDocumentRevisionChanged) +TEST_F(UpdateAnnotationsJobSlowTest, DontSendAnnotationsIfDocumentRevisionChanged) { job.setContext(jobContextWithMockClient); job.prepareAsyncRun(); - EXPECT_CALL(mockIpcClient, documentAnnotationsChanged(_)).Times(0); + EXPECT_CALL(mockIpcClient, annotations(_)).Times(0); job.runAsync(); documents.update({FileContainer(filePath, projectPartId, Utf8String(), true, 99)}); @@ -97,7 +97,7 @@ TEST_F(UpdateDocumentAnnotationsJobSlowTest, DontSendAnnotationsIfDocumentRevisi ASSERT_TRUE(waitUntilJobFinished(job)); } -TEST_F(UpdateDocumentAnnotationsJobSlowTest, UpdatesTranslationUnit) +TEST_F(UpdateAnnotationsJobSlowTest, UpdatesTranslationUnit) { const TimePoint timePointBefore = document.lastProjectPartChangeTimePoint(); const QSet dependendOnFilesBefore = document.dependedFilePaths(); diff --git a/tests/unit/unittest/clientserverinprocess-test.cpp b/tests/unit/unittest/clientserverinprocess-test.cpp index 1b0743c558d..68dd598e593 100644 --- a/tests/unit/unittest/clientserverinprocess-test.cpp +++ b/tests/unit/unittest/clientserverinprocess-test.cpp @@ -95,137 +95,136 @@ TEST_F(ClientServerInProcess, SendAliveMessage) scheduleClientMessages(); } -TEST_F(ClientServerInProcess, SendRegisterTranslationUnitForEditorMessage) +TEST_F(ClientServerInProcess, SendDocumentsOpenedMessage) { - ClangBackEnd::RegisterTranslationUnitForEditorMessage message({fileContainer}, - filePath, - {filePath}); + ClangBackEnd::DocumentsOpenedMessage message({fileContainer}, filePath, {filePath}); - EXPECT_CALL(mockClangCodeModelServer, registerTranslationUnitsForEditor(message)) + EXPECT_CALL(mockClangCodeModelServer, documentsOpened(message)) .Times(1); - serverProxy.registerTranslationUnitsForEditor(message); + serverProxy.documentsOpened(message); scheduleServerMessages(); } TEST_F(ClientServerInProcess, SendUpdateTranslationUnitsForEditorMessage) { - ClangBackEnd::UpdateTranslationUnitsForEditorMessage message({fileContainer}); + ClangBackEnd::DocumentsChangedMessage message({fileContainer}); - EXPECT_CALL(mockClangCodeModelServer, updateTranslationUnitsForEditor(message)) + EXPECT_CALL(mockClangCodeModelServer, documentsChanged(message)) .Times(1); - serverProxy.updateTranslationUnitsForEditor(message); + serverProxy.documentsChanged(message); scheduleServerMessages(); } -TEST_F(ClientServerInProcess, SendUnregisterTranslationUnitsForEditorMessage) +TEST_F(ClientServerInProcess, SendDocumentsClosedMessage) { - ClangBackEnd::UnregisterTranslationUnitsForEditorMessage message({fileContainer}); + ClangBackEnd::DocumentsClosedMessage message({fileContainer}); - EXPECT_CALL(mockClangCodeModelServer, unregisterTranslationUnitsForEditor(message)) + EXPECT_CALL(mockClangCodeModelServer, documentsClosed(message)) .Times(1); - serverProxy.unregisterTranslationUnitsForEditor(message); + serverProxy.documentsClosed(message); scheduleServerMessages(); } TEST_F(ClientServerInProcess, SendRegisterUnsavedFilesForEditorMessage) { - ClangBackEnd::RegisterUnsavedFilesForEditorMessage message({fileContainer}); + ClangBackEnd::UnsavedFilesUpdatedMessage message({fileContainer}); - EXPECT_CALL(mockClangCodeModelServer, registerUnsavedFilesForEditor(message)) + EXPECT_CALL(mockClangCodeModelServer, unsavedFilesUpdated(message)) .Times(1); - serverProxy.registerUnsavedFilesForEditor(message); + serverProxy.unsavedFilesUpdated(message); scheduleServerMessages(); } TEST_F(ClientServerInProcess, SendUnregisterUnsavedFilesForEditorMessage) { - ClangBackEnd::UnregisterUnsavedFilesForEditorMessage message({fileContainer}); + ClangBackEnd::UnsavedFilesRemovedMessage message({fileContainer}); - EXPECT_CALL(mockClangCodeModelServer, unregisterUnsavedFilesForEditor(message)) + EXPECT_CALL(mockClangCodeModelServer, unsavedFilesRemoved(message)) .Times(1); - serverProxy.unregisterUnsavedFilesForEditor(message); + serverProxy.unsavedFilesRemoved(message); scheduleServerMessages(); } TEST_F(ClientServerInProcess, SendCompleteCodeMessage) { - ClangBackEnd::CompleteCodeMessage message(Utf8StringLiteral("foo.cpp"), 24, 33, Utf8StringLiteral("do what I want")); + ClangBackEnd::RequestCompletionsMessage message(Utf8StringLiteral("foo.cpp"), 24, 33, Utf8StringLiteral("do what I want")); - EXPECT_CALL(mockClangCodeModelServer, completeCode(message)) + EXPECT_CALL(mockClangCodeModelServer, requestCompletions(message)) .Times(1); - serverProxy.completeCode(message); + serverProxy.requestCompletions(message); scheduleServerMessages(); } -TEST_F(ClientServerInProcess, SendRequestDocumentAnnotationsMessage) +TEST_F(ClientServerInProcess, SendRequestAnnotationsMessage) { - ClangBackEnd::RequestDocumentAnnotationsMessage message({Utf8StringLiteral("foo.cpp"), - Utf8StringLiteral("projectId")}); + ClangBackEnd::RequestAnnotationsMessage message( + {Utf8StringLiteral("foo.cpp"), Utf8StringLiteral("projectId")}); - EXPECT_CALL(mockClangCodeModelServer, requestDocumentAnnotations(message)) + EXPECT_CALL(mockClangCodeModelServer, requestAnnotations(message)) .Times(1); - serverProxy.requestDocumentAnnotations(message); + serverProxy.requestAnnotations(message); scheduleServerMessages(); } -TEST_F(ClientServerInProcess, SendCodeCompletedMessage) +TEST_F(ClientServerInProcess, SendCompletionsMessage) { ClangBackEnd::CodeCompletions codeCompletions({Utf8StringLiteral("newFunction()")}); - ClangBackEnd::CodeCompletedMessage message(codeCompletions, - ClangBackEnd::CompletionCorrection::NoCorrection, - 1); + ClangBackEnd::CompletionsMessage message(codeCompletions, + ClangBackEnd::CompletionCorrection::NoCorrection, + 1); - EXPECT_CALL(mockClangCodeModelClient, codeCompleted(message)) + EXPECT_CALL(mockClangCodeModelClient, completions(message)) .Times(1); - clientProxy.codeCompleted(message); + clientProxy.completions(message); scheduleClientMessages(); } -TEST_F(ClientServerInProcess, SendRegisterProjectPartsForEditorMessage) +TEST_F(ClientServerInProcess, SendProjectPartsUpdatedMessage) { ClangBackEnd::ProjectPartContainer projectContainer(Utf8StringLiteral(TESTDATA_DIR"/complete.pro")); - ClangBackEnd::RegisterProjectPartsForEditorMessage message({projectContainer}); + ClangBackEnd::ProjectPartsUpdatedMessage message({projectContainer}); - EXPECT_CALL(mockClangCodeModelServer, registerProjectPartsForEditor(message)) + EXPECT_CALL(mockClangCodeModelServer, projectPartsUpdated(message)) .Times(1); - serverProxy.registerProjectPartsForEditor(message); + serverProxy.projectPartsUpdated(message); scheduleServerMessages(); } -TEST_F(ClientServerInProcess, SendUnregisterProjectPartsForEditorMessage) +TEST_F(ClientServerInProcess, SendProjectPartsRemovedMessage) { - ClangBackEnd::UnregisterProjectPartsForEditorMessage message({Utf8StringLiteral(TESTDATA_DIR"/complete.pro")}); + ClangBackEnd::ProjectPartsRemovedMessage message({Utf8StringLiteral(TESTDATA_DIR"/complete.pro")}); - EXPECT_CALL(mockClangCodeModelServer, unregisterProjectPartsForEditor(message)) + EXPECT_CALL(mockClangCodeModelServer, projectPartsRemoved(message)) .Times(1); - serverProxy.unregisterProjectPartsForEditor(message); + serverProxy.projectPartsRemoved(message); scheduleServerMessages(); } -TEST_F(ClientServerInProcess, UpdateVisibleTranslationUnitsMessage) +TEST_F(ClientServerInProcess, DocumentVisibilityChangedMessage) { - ClangBackEnd::UpdateVisibleTranslationUnitsMessage message(Utf8StringLiteral(TESTDATA_DIR"/fileone.cpp"), - {Utf8StringLiteral(TESTDATA_DIR"/fileone.cpp"), - Utf8StringLiteral(TESTDATA_DIR"/filetwo.cpp")}); + ClangBackEnd::DocumentVisibilityChangedMessage + message(Utf8StringLiteral(TESTDATA_DIR "/fileone.cpp"), + {Utf8StringLiteral(TESTDATA_DIR "/fileone.cpp"), + Utf8StringLiteral(TESTDATA_DIR "/filetwo.cpp")}); - EXPECT_CALL(mockClangCodeModelServer, updateVisibleTranslationUnits(message)) + EXPECT_CALL(mockClangCodeModelServer, documentVisibilityChanged(message)) .Times(1); - serverProxy.updateVisibleTranslationUnits(message); + serverProxy.documentVisibilityChanged(message); scheduleServerMessages(); } -TEST_F(ClientServerInProcess, SendDocumentAnnotationsChangedMessage) +TEST_F(ClientServerInProcess, SendAnnotationsMessage) { ClangBackEnd::HighlightingTypes types; types.mainHighlightingType = ClangBackEnd::HighlightingType::Keyword; @@ -239,18 +238,16 @@ TEST_F(ClientServerInProcess, SendDocumentAnnotationsChangedMessage) {}, {}); - ClangBackEnd::DocumentAnnotationsChangedMessage message(fileContainer, - {diagnostic}, - {}, - {tokenInfo}, - QVector()); + ClangBackEnd::AnnotationsMessage message(fileContainer, + {diagnostic}, + {}, + {tokenInfo}, + QVector()); - - - EXPECT_CALL(mockClangCodeModelClient, documentAnnotationsChanged(message)) + EXPECT_CALL(mockClangCodeModelClient, annotations(message)) .Times(1); - clientProxy.documentAnnotationsChanged(message); + clientProxy.annotations(message); scheduleClientMessages(); } diff --git a/tests/unit/unittest/clientserveroutsideprocess-test.cpp b/tests/unit/unittest/clientserveroutsideprocess-test.cpp index 3f10186ae06..2dfe6a281bb 100644 --- a/tests/unit/unittest/clientserveroutsideprocess-test.cpp +++ b/tests/unit/unittest/clientserveroutsideprocess-test.cpp @@ -92,64 +92,64 @@ TEST_F(ClientServerOutsideProcessSlowTest, RestartProcessAfterTermination) ASSERT_THAT(clientSpy, SizeIs(1)); } -TEST_F(ClientServerOutsideProcess, SendRegisterTranslationUnitForEditorMessage) +TEST_F(ClientServerOutsideProcess, SendDocumentsOpenedMessage) { auto filePath = Utf8StringLiteral("foo.cpp"); ClangBackEnd::FileContainer fileContainer(filePath, Utf8StringLiteral("projectId")); - ClangBackEnd::RegisterTranslationUnitForEditorMessage registerTranslationUnitForEditorMessage({fileContainer}, - filePath, - {filePath}); - EchoMessage echoMessage(registerTranslationUnitForEditorMessage); + ClangBackEnd::DocumentsOpenedMessage documentsOpenedMessage({fileContainer}, + filePath, + {filePath}); + EchoMessage echoMessage(documentsOpenedMessage); EXPECT_CALL(mockClangCodeModelClient, echo(echoMessage)); - client.serverProxy().registerTranslationUnitsForEditor(registerTranslationUnitForEditorMessage); + client.serverProxy().documentsOpened(documentsOpenedMessage); ASSERT_TRUE(client.waitForEcho()); } -TEST_F(ClientServerOutsideProcess, SendUnregisterTranslationUnitsForEditorMessage) +TEST_F(ClientServerOutsideProcess, SendDocumentsClosedMessage) { FileContainer fileContainer(Utf8StringLiteral("foo.cpp"), Utf8StringLiteral("projectId")); - ClangBackEnd::UnregisterTranslationUnitsForEditorMessage unregisterTranslationUnitsForEditorMessage ({fileContainer}); - EchoMessage echoMessage(unregisterTranslationUnitsForEditorMessage); + ClangBackEnd::DocumentsClosedMessage documentsClosedMessage({fileContainer}); + EchoMessage echoMessage(documentsClosedMessage); EXPECT_CALL(mockClangCodeModelClient, echo(echoMessage)); - client.serverProxy().unregisterTranslationUnitsForEditor(unregisterTranslationUnitsForEditorMessage); + client.serverProxy().documentsClosed(documentsClosedMessage); ASSERT_TRUE(client.waitForEcho()); } TEST_F(ClientServerOutsideProcess, SendCompleteCodeMessage) { - CompleteCodeMessage codeCompleteMessage(Utf8StringLiteral("foo.cpp"), 24, 33, Utf8StringLiteral("do what I want")); + RequestCompletionsMessage codeCompleteMessage(Utf8StringLiteral("foo.cpp"), 24, 33, Utf8StringLiteral("do what I want")); EchoMessage echoMessage(codeCompleteMessage); EXPECT_CALL(mockClangCodeModelClient, echo(echoMessage)); - client.serverProxy().completeCode(codeCompleteMessage); + client.serverProxy().requestCompletions(codeCompleteMessage); ASSERT_TRUE(client.waitForEcho()); } -TEST_F(ClientServerOutsideProcess, SendRegisterProjectPartsForEditorMessage) +TEST_F(ClientServerOutsideProcess, SendProjectPartsUpdatedMessage) { ClangBackEnd::ProjectPartContainer projectContainer(Utf8StringLiteral(TESTDATA_DIR"/complete.pro")); - ClangBackEnd::RegisterProjectPartsForEditorMessage registerProjectPartsForEditorMessage({projectContainer}); - EchoMessage echoMessage(registerProjectPartsForEditorMessage); + ClangBackEnd::ProjectPartsUpdatedMessage projectPartsUpdatedMessage({projectContainer}); + EchoMessage echoMessage(projectPartsUpdatedMessage); EXPECT_CALL(mockClangCodeModelClient, echo(echoMessage)); - client.serverProxy().registerProjectPartsForEditor(registerProjectPartsForEditorMessage); + client.serverProxy().projectPartsUpdated(projectPartsUpdatedMessage); ASSERT_TRUE(client.waitForEcho()); } -TEST_F(ClientServerOutsideProcess, SendUnregisterProjectPartsForEditorMessage) +TEST_F(ClientServerOutsideProcess, SendProjectPartsRemovedMessage) { - ClangBackEnd::UnregisterProjectPartsForEditorMessage unregisterProjectPartsForEditorMessage({Utf8StringLiteral(TESTDATA_DIR"/complete.pro")}); - EchoMessage echoMessage(unregisterProjectPartsForEditorMessage); + ClangBackEnd::ProjectPartsRemovedMessage projectPartsRemovedMessage({Utf8StringLiteral(TESTDATA_DIR"/complete.pro")}); + EchoMessage echoMessage(projectPartsRemovedMessage); EXPECT_CALL(mockClangCodeModelClient, echo(echoMessage)); - client.serverProxy().unregisterProjectPartsForEditor(unregisterProjectPartsForEditorMessage); + client.serverProxy().projectPartsRemoved(projectPartsRemovedMessage); ASSERT_TRUE(client.waitForEcho()); } diff --git a/tests/unit/unittest/dummyclangipcclient.h b/tests/unit/unittest/dummyclangipcclient.h index e840b0a6c7a..b58fd912842 100644 --- a/tests/unit/unittest/dummyclangipcclient.h +++ b/tests/unit/unittest/dummyclangipcclient.h @@ -34,8 +34,8 @@ public: void alive() override {} void echo(const ClangBackEnd::EchoMessage &) override {} - void codeCompleted(const ClangBackEnd::CodeCompletedMessage &) override {} - void documentAnnotationsChanged(const ClangBackEnd::DocumentAnnotationsChangedMessage &) override {} + void completions(const ClangBackEnd::CompletionsMessage &) override {} + void annotations(const ClangBackEnd::AnnotationsMessage &) override {} void references(const ClangBackEnd::ReferencesMessage &) override {} void followSymbol(const ClangBackEnd::FollowSymbolMessage &) override {} void tooltip(const ClangBackEnd::ToolTipMessage &) override {} diff --git a/tests/unit/unittest/gtest-creator-printing.cpp b/tests/unit/unittest/gtest-creator-printing.cpp index 3b1a761a80c..a6d6118bccc 100644 --- a/tests/unit/unittest/gtest-creator-printing.cpp +++ b/tests/unit/unittest/gtest-creator-printing.cpp @@ -228,7 +228,7 @@ std::ostream &operator<<(std::ostream &os, const SourceLocationsContainer &conta return os; } -std::ostream &operator<<(std::ostream &os, const RegisterProjectPartsForEditorMessage &message) +std::ostream &operator<<(std::ostream &os, const ProjectPartsUpdatedMessage &message) { os << "(" << message.projectContainers @@ -258,7 +258,7 @@ std::ostream &operator<<(std::ostream &os, const FollowSymbolMessage &message) return os; } -std::ostream &operator<<(std::ostream &os, const CompleteCodeMessage &message) +std::ostream &operator<<(std::ostream &os, const RequestCompletionsMessage &message) { os << "(" << message.filePath << ", " @@ -274,9 +274,9 @@ std::ostream &operator<<(std::ostream &os, const CompleteCodeMessage &message) return os; } -std::ostream &operator<<(std::ostream &os, const RegisterTranslationUnitForEditorMessage &message) +std::ostream &operator<<(std::ostream &os, const DocumentsOpenedMessage &message) { - os << "RegisterTranslationUnitForEditorMessage(" + os << "DocumentsOpenedMessage(" << message.fileContainers << ", " << message.currentEditorFilePath << ", " << message.visibleEditorFilePaths << ")"; @@ -311,7 +311,7 @@ static const char *completionCorrectionToText(CompletionCorrection correction) } #undef RETURN_TEXT_FOR_CASE -std::ostream &operator<<(std::ostream &os, const CodeCompletedMessage &message) +std::ostream &operator<<(std::ostream &os, const CompletionsMessage &message) { os << "(" << message.codeCompletions << ", " @@ -323,9 +323,9 @@ std::ostream &operator<<(std::ostream &os, const CodeCompletedMessage &message) return os; } -std::ostream &operator<<(std::ostream &os, const DocumentAnnotationsChangedMessage &message) +std::ostream &operator<<(std::ostream &os, const AnnotationsMessage &message) { - os << "DocumentAnnotationsChangedMessage(" + os << "AnnotationsMessage(" << message.fileContainer << "," << message.diagnostics.size() << "," << !message.firstHeaderErrorDiagnostic.text.isEmpty() @@ -364,7 +364,7 @@ std::ostream &operator<<(std::ostream &os, const EchoMessage &/*message*/) return os << "()"; } -std::ostream &operator<<(std::ostream &os, const UnregisterProjectPartsForEditorMessage &message) +std::ostream &operator<<(std::ostream &os, const ProjectPartsRemovedMessage &message) { os << "(" << message.projectPartIds @@ -373,7 +373,7 @@ std::ostream &operator<<(std::ostream &os, const UnregisterProjectPartsForEditor return os; } -std::ostream &operator<<(std::ostream &os, const UnregisterTranslationUnitsForEditorMessage &message) +std::ostream &operator<<(std::ostream &os, const DocumentsClosedMessage &message) { os << "(" << message.fileContainers @@ -627,7 +627,7 @@ std::ostream &operator<<(std::ostream &out, const ProjectPartPch &projectPartPch return out; } -std::ostream &operator<<(std::ostream &os, const RegisterUnsavedFilesForEditorMessage &message) +std::ostream &operator<<(std::ostream &os, const UnsavedFilesUpdatedMessage &message) { os << "(" << message.fileContainers @@ -636,7 +636,7 @@ std::ostream &operator<<(std::ostream &os, const RegisterUnsavedFilesForEditorMe return os; } -std::ostream &operator<<(std::ostream &os, const RequestDocumentAnnotationsMessage &message) +std::ostream &operator<<(std::ostream &os, const RequestAnnotationsMessage &message) { os << "(" << message.fileContainer.filePath << "," @@ -811,7 +811,7 @@ std::ostream &operator<<(std::ostream &os, const SourceRangeWithTextContainer &c return os; } -std::ostream &operator<<(std::ostream &os, const UnregisterUnsavedFilesForEditorMessage &message) +std::ostream &operator<<(std::ostream &os, const UnsavedFilesRemovedMessage &message) { os << "(" << message.fileContainers @@ -827,16 +827,16 @@ std::ostream &operator<<(std::ostream &out, const UpdateProjectPartsMessage &mes << ")"; } -std::ostream &operator<<(std::ostream &os, const UpdateTranslationUnitsForEditorMessage &message) +std::ostream &operator<<(std::ostream &os, const DocumentsChangedMessage &message) { - os << "UpdateTranslationUnitsForEditorMessage(" + os << "DocumentsChangedMessage(" << message.fileContainers << ")"; return os; } -std::ostream &operator<<(std::ostream &os, const UpdateVisibleTranslationUnitsMessage &message) +std::ostream &operator<<(std::ostream &os, const DocumentVisibilityChangedMessage &message) { os << "(" << message.currentEditorFilePath << ", " diff --git a/tests/unit/unittest/gtest-creator-printing.h b/tests/unit/unittest/gtest-creator-printing.h index d809b18b6e6..a7c200daad5 100644 --- a/tests/unit/unittest/gtest-creator-printing.h +++ b/tests/unit/unittest/gtest-creator-printing.h @@ -97,21 +97,21 @@ class FilePathId; class FilePath; class WatcherEntry; class SourceLocationsContainer; -class RegisterProjectPartsForEditorMessage; +class ProjectPartsUpdatedMessage; class CancelMessage; class AliveMessage; -class CodeCompletedMessage; +class CompletionsMessage; class EchoMessage; -class DocumentAnnotationsChangedMessage; +class AnnotationsMessage; class ReferencesMessage; class ToolTipMessage; class FollowSymbolResult; class FollowSymbolMessage; -class CompleteCodeMessage; +class RequestCompletionsMessage; class EndMessage; -class RegisterTranslationUnitForEditorMessage; -class UnregisterProjectPartsForEditorMessage; -class UnregisterTranslationUnitsForEditorMessage; +class DocumentsOpenedMessage; +class ProjectPartsRemovedMessage; +class DocumentsClosedMessage; class CodeCompletion; class CodeCompletionChunk; class DiagnosticContainer; @@ -126,9 +126,9 @@ class NativeFilePath; class PrecompiledHeadersUpdatedMessage; class ProjectPartContainer; class ProjectPartPch; -class RegisterUnsavedFilesForEditorMessage; +class UnsavedFilesUpdatedMessage; class RemoveProjectPartsMessage; -class RequestDocumentAnnotationsMessage; +class RequestAnnotationsMessage; class RequestFollowSymbolMessage; class RequestReferencesMessage; class RequestToolTipMessage; @@ -145,10 +145,10 @@ class SourceRangeWithTextContainer; class TokenInfo; template class TokenProcessor; -class UnregisterUnsavedFilesForEditorMessage; +class UnsavedFilesRemovedMessage; class UpdateProjectPartsMessage; -class UpdateTranslationUnitsForEditorMessage; -class UpdateVisibleTranslationUnitsMessage; +class DocumentsChangedMessage; +class DocumentVisibilityChangedMessage; class FilePath; template class AbstractFilePathView; @@ -170,21 +170,21 @@ std::ostream &operator<<(std::ostream &out, const SourceLocationEntry &entry); std::ostream &operator<<(std::ostream &out, const IdPaths &idPaths); std::ostream &operator<<(std::ostream &out, const WatcherEntry &entry); std::ostream &operator<<(std::ostream &out, const SourceLocationsContainer &container); -std::ostream &operator<<(std::ostream &out, const RegisterProjectPartsForEditorMessage &message); +std::ostream &operator<<(std::ostream &out, const ProjectPartsUpdatedMessage &message); std::ostream &operator<<(std::ostream &out, const CancelMessage &message); std::ostream &operator<<(std::ostream &out, const AliveMessage &message); -std::ostream &operator<<(std::ostream &out, const CodeCompletedMessage &message); +std::ostream &operator<<(std::ostream &out, const CompletionsMessage &message); std::ostream &operator<<(std::ostream &out, const EchoMessage &message); -std::ostream &operator<<(std::ostream &out, const DocumentAnnotationsChangedMessage &message); +std::ostream &operator<<(std::ostream &out, const AnnotationsMessage &message); std::ostream &operator<<(std::ostream &out, const ReferencesMessage &message); std::ostream &operator<<(std::ostream &out, const ToolTipMessage &message); std::ostream &operator<<(std::ostream &out, const FollowSymbolResult &result); std::ostream &operator<<(std::ostream &out, const FollowSymbolMessage &message); -std::ostream &operator<<(std::ostream &out, const CompleteCodeMessage &message); +std::ostream &operator<<(std::ostream &out, const RequestCompletionsMessage &message); std::ostream &operator<<(std::ostream &out, const EndMessage &message); -std::ostream &operator<<(std::ostream &out, const RegisterTranslationUnitForEditorMessage &message); -std::ostream &operator<<(std::ostream &out, const UnregisterProjectPartsForEditorMessage &message); -std::ostream &operator<<(std::ostream &out, const UnregisterTranslationUnitsForEditorMessage &message); +std::ostream &operator<<(std::ostream &out, const DocumentsOpenedMessage &message); +std::ostream &operator<<(std::ostream &out, const ProjectPartsRemovedMessage &message); +std::ostream &operator<<(std::ostream &out, const DocumentsClosedMessage &message); std::ostream &operator<<(std::ostream &out, const CodeCompletion &message); std::ostream &operator<<(std::ostream &out, const CodeCompletionChunk &chunk); std::ostream &operator<<(std::ostream &out, const DiagnosticContainer &container); @@ -200,9 +200,9 @@ std::ostream &operator<<(std::ostream &out, const NativeFilePath &filePath); std::ostream &operator<<(std::ostream &out, const PrecompiledHeadersUpdatedMessage &message); std::ostream &operator<<(std::ostream &out, const ProjectPartContainer &container); std::ostream &operator<<(std::ostream &out, const ProjectPartPch &projectPartPch); -std::ostream &operator<<(std::ostream &out, const RegisterUnsavedFilesForEditorMessage &message); +std::ostream &operator<<(std::ostream &out, const UnsavedFilesUpdatedMessage &message); std::ostream &operator<<(std::ostream &out, const RemoveProjectPartsMessage &message); -std::ostream &operator<<(std::ostream &out, const RequestDocumentAnnotationsMessage &message); +std::ostream &operator<<(std::ostream &out, const RequestAnnotationsMessage &message); std::ostream &operator<<(std::ostream &out, const RequestFollowSymbolMessage &message); std::ostream &operator<<(std::ostream &out, const RequestReferencesMessage &message); std::ostream &operator<<(std::ostream &out, const RequestToolTipMessage &message); @@ -217,10 +217,10 @@ std::ostream &operator<<(std::ostream &out, const SourceRangesAndDiagnosticsForQ std::ostream &operator<<(std::ostream &out, const SourceRangesContainer &container); std::ostream &operator<<(std::ostream &out, const SourceRangesForQueryMessage &message); std::ostream &operator<<(std::ostream &out, const SourceRangeWithTextContainer &container); -std::ostream &operator<<(std::ostream &out, const UnregisterUnsavedFilesForEditorMessage &message); +std::ostream &operator<<(std::ostream &out, const UnsavedFilesRemovedMessage &message); std::ostream &operator<<(std::ostream &out, const UpdateProjectPartsMessage &message); -std::ostream &operator<<(std::ostream &out, const UpdateTranslationUnitsForEditorMessage &message); -std::ostream &operator<<(std::ostream &out, const UpdateVisibleTranslationUnitsMessage &message); +std::ostream &operator<<(std::ostream &out, const DocumentsChangedMessage &message); +std::ostream &operator<<(std::ostream &out, const DocumentVisibilityChangedMessage &message); std::ostream &operator<<(std::ostream &out, const FilePath &filePath); std::ostream &operator<<(std::ostream &out, const FilePathId &filePathId); std::ostream &operator<<(std::ostream &out, const TokenInfo& tokenInfo); diff --git a/tests/unit/unittest/mockclangcodemodelclient.h b/tests/unit/unittest/mockclangcodemodelclient.h index 3b5a3cfbf5a..9244e05eb8b 100644 --- a/tests/unit/unittest/mockclangcodemodelclient.h +++ b/tests/unit/unittest/mockclangcodemodelclient.h @@ -37,10 +37,10 @@ public: void()); MOCK_METHOD1(echo, void(const ClangBackEnd::EchoMessage &message)); - MOCK_METHOD1(codeCompleted, - void(const ClangBackEnd::CodeCompletedMessage &message)); - MOCK_METHOD1(documentAnnotationsChanged, - void(const ClangBackEnd::DocumentAnnotationsChangedMessage &message)); + MOCK_METHOD1(completions, + void(const ClangBackEnd::CompletionsMessage &message)); + MOCK_METHOD1(annotations, + void(const ClangBackEnd::AnnotationsMessage &message)); MOCK_METHOD1(references, void(const ClangBackEnd::ReferencesMessage &message)); MOCK_METHOD1(followSymbol, diff --git a/tests/unit/unittest/mockclangcodemodelserver.h b/tests/unit/unittest/mockclangcodemodelserver.h index 468f683bf53..56d48fac580 100644 --- a/tests/unit/unittest/mockclangcodemodelserver.h +++ b/tests/unit/unittest/mockclangcodemodelserver.h @@ -33,30 +33,35 @@ class MockClangCodeModelServer : public ClangBackEnd::ClangCodeModelServerInterf public: MOCK_METHOD0(end, void()); - MOCK_METHOD1(registerTranslationUnitsForEditor, - void(const ClangBackEnd::RegisterTranslationUnitForEditorMessage &message)); - MOCK_METHOD1(updateTranslationUnitsForEditor, - void(const ClangBackEnd::UpdateTranslationUnitsForEditorMessage &message)); - MOCK_METHOD1(unregisterTranslationUnitsForEditor, - void(const ClangBackEnd::UnregisterTranslationUnitsForEditorMessage &message)); - MOCK_METHOD1(registerProjectPartsForEditor, - void(const ClangBackEnd::RegisterProjectPartsForEditorMessage &message)); - MOCK_METHOD1(unregisterProjectPartsForEditor, - void(const ClangBackEnd::UnregisterProjectPartsForEditorMessage &message)); - MOCK_METHOD1(registerUnsavedFilesForEditor, - void(const ClangBackEnd::RegisterUnsavedFilesForEditorMessage &message)); - MOCK_METHOD1(unregisterUnsavedFilesForEditor, - void(const ClangBackEnd::UnregisterUnsavedFilesForEditorMessage &message)); - MOCK_METHOD1(completeCode, - void(const ClangBackEnd::CompleteCodeMessage &message)); - MOCK_METHOD1(requestDocumentAnnotations, - void(const ClangBackEnd::RequestDocumentAnnotationsMessage &message)); + + MOCK_METHOD1(documentsOpened, + void(const ClangBackEnd::DocumentsOpenedMessage &message)); + MOCK_METHOD1(documentsChanged, + void(const ClangBackEnd::DocumentsChangedMessage &message)); + MOCK_METHOD1(documentsClosed, + void(const ClangBackEnd::DocumentsClosedMessage &message)); + MOCK_METHOD1(documentVisibilityChanged, + void(const ClangBackEnd::DocumentVisibilityChangedMessage &message)); + + MOCK_METHOD1(projectPartsUpdated, + void(const ClangBackEnd::ProjectPartsUpdatedMessage &message)); + MOCK_METHOD1(projectPartsRemoved, + void(const ClangBackEnd::ProjectPartsRemovedMessage &message)); + + MOCK_METHOD1(unsavedFilesUpdated, + void(const ClangBackEnd::UnsavedFilesUpdatedMessage &message)); + MOCK_METHOD1(unsavedFilesRemoved, + void(const ClangBackEnd::UnsavedFilesRemovedMessage &message)); + + MOCK_METHOD1(requestCompletions, + void(const ClangBackEnd::RequestCompletionsMessage &message)); + MOCK_METHOD1(requestAnnotations, + void(const ClangBackEnd::RequestAnnotationsMessage &message)); MOCK_METHOD1(requestReferences, void(const ClangBackEnd::RequestReferencesMessage &message)); MOCK_METHOD1(requestFollowSymbol, void(const ClangBackEnd::RequestFollowSymbolMessage &message)); MOCK_METHOD1(requestToolTip, void(const ClangBackEnd::RequestToolTipMessage &message)); - MOCK_METHOD1(updateVisibleTranslationUnits, - void(const ClangBackEnd::UpdateVisibleTranslationUnitsMessage &message)); + }; diff --git a/tests/unit/unittest/readandwritemessageblock-test.cpp b/tests/unit/unittest/readandwritemessageblock-test.cpp index 9a1bebb0788..bceeab7038e 100644 --- a/tests/unit/unittest/readandwritemessageblock-test.cpp +++ b/tests/unit/unittest/readandwritemessageblock-test.cpp @@ -54,7 +54,7 @@ protected: template void CompareMessage(const Type &message); - ClangBackEnd::MessageEnvelop writeCodeCompletedMessage(); + ClangBackEnd::MessageEnvelop writeCompletionsMessage(); void popLastCharacterFromBuffer(); void pushLastCharacterToBuffer(); void readPartialMessage(); @@ -190,38 +190,36 @@ TEST_F(ReadAndWriteMessageBlock, CompareAliveMessage) CompareMessage(ClangBackEnd::AliveMessage()); } -TEST_F(ReadAndWriteMessageBlock, CompareRegisterTranslationUnitForEditorMessage) +TEST_F(ReadAndWriteMessageBlock, CompareDocumentsOpenedMessage) { - CompareMessage(ClangBackEnd::RegisterTranslationUnitForEditorMessage({fileContainer}, filePath, {filePath})); + CompareMessage(ClangBackEnd::DocumentsOpenedMessage({fileContainer}, filePath, {filePath})); } -TEST_F(ReadAndWriteMessageBlock, CompareUpdateTranslationUnitForEditorMessage) +TEST_F(ReadAndWriteMessageBlock, CompareDocumentsChangedMessage) { - CompareMessage(ClangBackEnd::UpdateTranslationUnitsForEditorMessage({fileContainer})); + CompareMessage(ClangBackEnd::DocumentsChangedMessage({fileContainer})); } -TEST_F(ReadAndWriteMessageBlock, CompareUnregisterFileForEditorMessage) +TEST_F(ReadAndWriteMessageBlock, CompareDocumentsClosedMessage) { - CompareMessage(ClangBackEnd::UnregisterTranslationUnitsForEditorMessage({fileContainer})); + CompareMessage(ClangBackEnd::DocumentsClosedMessage({fileContainer})); } -TEST_F(ReadAndWriteMessageBlock, CompareCompleteCodeMessage) +TEST_F(ReadAndWriteMessageBlock, CompareRequestCompletionsMessage) { - CompareMessage(ClangBackEnd::CompleteCodeMessage(Utf8StringLiteral("foo.cpp"), 24, 33, Utf8StringLiteral("do what I want"))); + CompareMessage(ClangBackEnd::RequestCompletionsMessage(Utf8StringLiteral("foo.cpp"), 24, 33, Utf8StringLiteral("do what I want"))); } -TEST_F(ReadAndWriteMessageBlock, CompareCodeCompletedMessage) +TEST_F(ReadAndWriteMessageBlock, CompareCompletionsMessage) { ClangBackEnd::CodeCompletions codeCompletions({Utf8StringLiteral("newFunction()")}); - CompareMessage( - ClangBackEnd::CodeCompletedMessage(codeCompletions, - ClangBackEnd::CompletionCorrection::NoCorrection, - 1) - ); + CompareMessage(ClangBackEnd::CompletionsMessage(codeCompletions, + ClangBackEnd::CompletionCorrection::NoCorrection, + 1)); } -TEST_F(ReadAndWriteMessageBlock, CompareDocumentAnnotationsChangedMessage) +TEST_F(ReadAndWriteMessageBlock, CompareAnnotationsMessage) { ClangBackEnd::DiagnosticContainer diagnostic(Utf8StringLiteral("don't do that"), Utf8StringLiteral("warning"), @@ -236,39 +234,39 @@ TEST_F(ReadAndWriteMessageBlock, CompareDocumentAnnotationsChangedMessage) types.mainHighlightingType = ClangBackEnd::HighlightingType::Keyword; ClangBackEnd::TokenInfoContainer tokenInfo(1, 1, 1, types); - CompareMessage(ClangBackEnd::DocumentAnnotationsChangedMessage(fileContainer, - {diagnostic}, - {}, - {tokenInfo}, - QVector())); + CompareMessage(ClangBackEnd::AnnotationsMessage(fileContainer, + {diagnostic}, + {}, + {tokenInfo}, + QVector())); } -TEST_F(ReadAndWriteMessageBlock, CompareRegisterUnsavedFilesForEditorMessage) +TEST_F(ReadAndWriteMessageBlock, CompareUnsavedFilesUpdatedMessage) { - CompareMessage(ClangBackEnd::RegisterUnsavedFilesForEditorMessage({fileContainer})); + CompareMessage(ClangBackEnd::UnsavedFilesUpdatedMessage({fileContainer})); } -TEST_F(ReadAndWriteMessageBlock, CompareUnregisterUnsavedFilesForEditorMessage) +TEST_F(ReadAndWriteMessageBlock, CompareUnsavedFilesRemovedMessage) { - CompareMessage(ClangBackEnd::UnregisterUnsavedFilesForEditorMessage({fileContainer})); + CompareMessage(ClangBackEnd::UnsavedFilesRemovedMessage({fileContainer})); } -TEST_F(ReadAndWriteMessageBlock, CompareRequestDocumentAnnotations) +TEST_F(ReadAndWriteMessageBlock, CompareRequestAnnotationsMessage) { - CompareMessage(ClangBackEnd::RequestDocumentAnnotationsMessage(fileContainer)); + CompareMessage(ClangBackEnd::RequestAnnotationsMessage(fileContainer)); } -TEST_F(ReadAndWriteMessageBlock, CompareRequestReferences) +TEST_F(ReadAndWriteMessageBlock, CompareRequestReferencesMessage) { CompareMessage(ClangBackEnd::RequestReferencesMessage{fileContainer, 13, 37}); } -TEST_F(ReadAndWriteMessageBlock, CompareRequestFollowSymbol) +TEST_F(ReadAndWriteMessageBlock, CompareRequestFollowSymbolMessage) { CompareMessage(ClangBackEnd::RequestFollowSymbolMessage{fileContainer, 13, 37}); } -TEST_F(ReadAndWriteMessageBlock, CompareReferences) +TEST_F(ReadAndWriteMessageBlock, CompareReferencesMessage) { const QVector references{ true, @@ -280,7 +278,7 @@ TEST_F(ReadAndWriteMessageBlock, CompareReferences) TEST_F(ReadAndWriteMessageBlock, GetInvalidMessageForAPartialBuffer) { - writeCodeCompletedMessage(); + writeCompletionsMessage(); popLastCharacterFromBuffer(); buffer.seek(0); @@ -289,7 +287,7 @@ TEST_F(ReadAndWriteMessageBlock, GetInvalidMessageForAPartialBuffer) TEST_F(ReadAndWriteMessageBlock, ReadMessageAfterInterruption) { - const auto writeMessage = writeCodeCompletedMessage(); + const auto writeMessage = writeCompletionsMessage(); popLastCharacterFromBuffer(); buffer.seek(0); readPartialMessage(); @@ -298,9 +296,9 @@ TEST_F(ReadAndWriteMessageBlock, ReadMessageAfterInterruption) ASSERT_EQ(readMessageBlock.read(), writeMessage); } -ClangBackEnd::MessageEnvelop ReadAndWriteMessageBlock::writeCodeCompletedMessage() +ClangBackEnd::MessageEnvelop ReadAndWriteMessageBlock::writeCompletionsMessage() { - ClangBackEnd::CodeCompletedMessage message( + ClangBackEnd::CompletionsMessage message( ClangBackEnd::CodeCompletions({Utf8StringLiteral("newFunction()")}), ClangBackEnd::CompletionCorrection::NoCorrection, 1); diff --git a/tests/unit/unittest/unittest.pro b/tests/unit/unittest/unittest.pro index 622b9e00cde..88d56062506 100644 --- a/tests/unit/unittest/unittest.pro +++ b/tests/unit/unittest/unittest.pro @@ -117,7 +117,7 @@ SOURCES += \ clangjobs-test.cpp \ clangparsesupportivetranslationunitjob-test.cpp \ clangreferencescollector-test.cpp \ - clangrequestdocumentannotationsjob-test.cpp \ + clangrequestannotationsjob-test.cpp \ clangrequestreferencesjob-test.cpp \ clangresumedocumentjob-test.cpp \ clangstring-test.cpp \ @@ -126,7 +126,7 @@ SOURCES += \ clangtooltipinfo-test.cpp \ clangtranslationunits-test.cpp \ clangtranslationunit-test.cpp \ - clangupdatedocumentannotationsjob-test.cpp \ + clangupdateannotationsjob-test.cpp \ codecompleter-test.cpp \ codecompletionsextractor-test.cpp \ completionchunkstotextconverter-test.cpp \ From c9a3d2bea1743f3f589a2604262b925806348cea Mon Sep 17 00:00:00 2001 From: Nikolai Kosjar Date: Fri, 1 Jun 2018 15:58:34 +0200 Subject: [PATCH 49/52] RunExtensions: Support specifying thread stack size ...with runAsync(). The stack size cannot be changed after starting a thread, so specifying the stack size with a pool does not make sense. However, starting with Qt 5.10 a stack size can be specified for the whole thread pool, if needed. Change-Id: I09eded606321388c779f762b77de6223081609fe Reviewed-by: Eike Ziller --- src/libs/utils/runextensions.h | 92 ++++++++++++++++--- .../auto/runextensions/tst_runextensions.cpp | 15 +++ 2 files changed, 93 insertions(+), 14 deletions(-) diff --git a/src/libs/utils/runextensions.h b/src/libs/utils/runextensions.h index 49752234630..14cf5e49223 100644 --- a/src/libs/utils/runextensions.h +++ b/src/libs/utils/runextensions.h @@ -26,6 +26,7 @@ #pragma once #include "functiontraits.h" +#include "optional.h" #include "utils_global.h" #include @@ -57,6 +58,9 @@ struct hasCallOperator }; namespace Utils { + +using StackSizeInBytes = Utils::optional; + namespace Internal { /* @@ -388,6 +392,34 @@ private: QRunnable *m_runnable; }; +template::type> +QFuture runAsync_internal(QThreadPool *pool, + StackSizeInBytes stackSize, + QThread::Priority priority, + Function &&function, + Args &&... args) +{ + Q_ASSERT(!(pool && stackSize)); // stack size cannot be changed once a thread is started + auto job = new Internal::AsyncJob + (std::forward(function), std::forward(args)...); + job->setThreadPriority(priority); + QFuture future = job->future(); + if (pool) { + job->setThreadPool(pool); + pool->start(job); + } else { + auto thread = new Internal::RunnableThread(job); + if (stackSize) + thread->setStackSize(stackSize.value()); + thread->moveToThread(qApp->thread()); // make sure thread gets deleteLater on main thread + QObject::connect(thread, &QThread::finished, thread, &QObject::deleteLater); + thread->start(priority); + } + return future; +} + } // Internal /*! @@ -418,20 +450,11 @@ template runAsync(QThreadPool *pool, QThread::Priority priority, Function &&function, Args&&... args) { - auto job = new Internal::AsyncJob - (std::forward(function), std::forward(args)...); - job->setThreadPriority(priority); - QFuture future = job->future(); - if (pool) { - job->setThreadPool(pool); - pool->start(job); - } else { - auto thread = new Internal::RunnableThread(job); - thread->moveToThread(qApp->thread()); // make sure thread gets deleteLater on main thread - QObject::connect(thread, &QThread::finished, thread, &QObject::deleteLater); - thread->start(priority); - } - return future; + return Internal::runAsync_internal(pool, + StackSizeInBytes(), + priority, + std::forward(function), + std::forward(args)...); } /*! @@ -448,6 +471,47 @@ runAsync(QThread::Priority priority, Function &&function, Args&&... args) std::forward(function), std::forward(args)...); } +/*! + Runs \a function with \a args in a new thread with given thread \a stackSize and + thread priority QThread::InheritPriority . + \sa runAsync(QThreadPool*,QThread::Priority,Function&&,Args&&...) + \sa QThread::Priority + \sa QThread::setStackSize +*/ +template::type> +QFuture runAsync(Utils::StackSizeInBytes stackSize, Function &&function, Args &&... args) +{ + return Internal::runAsync_internal(static_cast(nullptr), + stackSize, + QThread::InheritPriority, + std::forward(function), + std::forward(args)...); +} + +/*! + Runs \a function with \a args in a new thread with given thread \a stackSize and + given thread \a priority. + \sa runAsync(QThreadPool*,QThread::Priority,Function&&,Args&&...) + \sa QThread::Priority + \sa QThread::setStackSize +*/ +template::type> +QFuture runAsync(Utils::StackSizeInBytes stackSize, + QThread::Priority priority, + Function &&function, + Args &&... args) +{ + return Internal::runAsync_internal(static_cast(nullptr), + stackSize, + priority, + std::forward(function), + std::forward(args)...); +} + /*! Runs \a function with \a args in a new thread with thread priority QThread::InheritPriority. \sa runAsync(QThreadPool*,QThread::Priority,Function&&,Args&&...) diff --git a/tests/auto/runextensions/tst_runextensions.cpp b/tests/auto/runextensions/tst_runextensions.cpp index acad21b15d2..fd0c6609d8b 100644 --- a/tests/auto/runextensions/tst_runextensions.cpp +++ b/tests/auto/runextensions/tst_runextensions.cpp @@ -42,6 +42,8 @@ private slots: void moveOnlyType(); #endif void threadPriority(); + void threadSize(); + void threadSizeAndPriority(); void runAsyncNoFutureInterface(); void crefFunction(); void onResultReady(); @@ -399,6 +401,19 @@ void tst_RunExtensions::threadPriority() QList({0, 2, 1})); } +void tst_RunExtensions::threadSize() +{ + QCOMPARE(Utils::runAsync(Utils::StackSizeInBytes(1024 * 1024), report3).results(), + QList({0, 2, 1})); +} + +void tst_RunExtensions::threadSizeAndPriority() +{ + QCOMPARE(Utils::runAsync(Utils::StackSizeInBytes(1024 * 1024), QThread::LowestPriority, report3) + .results(), + QList({0, 2, 1})); +} + void tst_RunExtensions::runAsyncNoFutureInterface() { // free function pointer From a926909010153bd914432fab240a5e225151237a Mon Sep 17 00:00:00 2001 From: Christian Stenger Date: Mon, 4 Jun 2018 11:37:35 +0200 Subject: [PATCH 50/52] Tests: Fix compile on macOS Change-Id: Ic987e41c79cae531aa94ded8fa9fa87bce55c936 Reviewed-by: Tobias Hunger --- tests/auto/sdktool/sdktool.pro | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/auto/sdktool/sdktool.pro b/tests/auto/sdktool/sdktool.pro index fe78c49f277..8cdcc8c6530 100644 --- a/tests/auto/sdktool/sdktool.pro +++ b/tests/auto/sdktool/sdktool.pro @@ -3,6 +3,6 @@ include(../qttest.pri) TMP_ILP = $$IDE_LIBEXEC_PATH win32: TMP_ILP = $$replace(TMP_ILP, \\\\, /) -DEFINES += SDKTOOL_DIR=\\\"$$TMP_ILP\\\" +DEFINES += $$shell_quote(SDKTOOL_DIR=\"$$TMP_ILP\") SOURCES += tst_sdktool.cpp From 149a77a01d96aa0943c950685189719e73313378 Mon Sep 17 00:00:00 2001 From: Robert Loehning Date: Fri, 1 Jun 2018 16:56:05 +0200 Subject: [PATCH 51/52] Squish: Handle third kit state Change-Id: I3442cf7676b7f316a60344b9c7dfc2d777529785 Reviewed-by: Christian Stenger --- tests/system/shared/project_explorer.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/tests/system/shared/project_explorer.py b/tests/system/shared/project_explorer.py index dc18935e317..a26ae845d74 100644 --- a/tests/system/shared/project_explorer.py +++ b/tests/system/shared/project_explorer.py @@ -83,7 +83,10 @@ def prepareBuildSettings(targetCount, currentTarget, setReleaseBuild=True, disab # param targetCount specifies the number of targets currently defined (must be correct!) # param projectSettings specifies where to switch to (must be one of ProjectSettings.BUILD or ProjectSettings.RUN) def switchToBuildOrRunSettingsFor(targetCount, currentTarget, projectSettings): - clickToActivate = "