From 06c823aa671ca01161d1eb9b9742d805e7b4b8b5 Mon Sep 17 00:00:00 2001 From: miruka Date: Tue, 2 Jul 2019 13:59:52 -0400 Subject: [PATCH] Build system, messages support and more --- .gitignore | 10 +- .gitmodules | 3 + .pylintrc | 362 ++++++ Makefile | 1098 ++++++++++++++++- README.md | 16 + harmonyqml | Bin 0 -> 416776 bytes harmonyqml.pro | 68 + live_reload.sh | 10 + run.sh | 3 - run_live_reload.sh | 8 - src/events/rooms_timeline.py | 8 - src/main.cpp | 23 + src/matrix_client.py | 124 -- src/{ => python}/__about__.py | 0 src/{ => python}/__init__.py | 0 src/{ => python}/app.py | 37 +- src/{ => python}/backend.py | 19 +- src/{ => python}/events/__init__.py | 0 src/{ => python}/events/app.py | 0 src/{ => python}/events/event.py | 0 src/{ => python}/events/rooms.py | 0 src/python/events/rooms_timeline.py | 32 + src/{ => python}/events/users.py | 0 src/python/html_filter.py | 153 +++ src/python/matrix_client.py | 182 +++ src/qml/Base/HAvatar.qml | 11 +- src/qml/Base/HButton.qml | 5 - src/qml/Base/HListModel.qml | 93 +- src/qml/Chat/Banners/InviteBanner.qml | 1 + src/qml/Chat/Chat.qml | 146 +-- src/qml/Chat/RoomEventList/Daybreak.qml | 2 +- src/qml/Chat/RoomEventList/EventContent.qml | 2 +- src/qml/Chat/RoomEventList/MessageContent.qml | 17 +- .../Chat/RoomEventList/RoomEventDelegate.qml | 30 +- src/qml/Chat/RoomEventList/RoomEventList.qml | 16 +- src/qml/Chat/RoomHeader.qml | 4 +- src/qml/Chat/RoomSidePane/MemberDelegate.qml | 2 +- src/qml/Chat/SendBox.qml | 2 +- src/qml/EventHandlers/rooms.js | 37 +- src/qml/EventHandlers/rooms_timeline.js | 12 + src/qml/EventHandlers/users.js | 7 +- src/qml/Models.qml | 14 +- src/qml/Pages/RememberAccount.qml | 9 +- src/qml/Pages/SignIn.qml | 16 +- src/qml/Python.qml | 15 +- src/qml/SidePane/AccountDelegate.qml | 2 +- src/qml/SidePane/PaneToolBar.qml | 4 +- src/qml/SidePane/RoomCategoriesList.qml | 11 +- src/qml/SidePane/RoomDelegate.qml | 38 +- src/qml/SidePane/RoomList.qml | 36 +- src/qml/SidePane/SidePane.qml | 12 +- src/qml/UI.qml | 9 +- submodules/SortFilterProxyModel | 1 + 53 files changed, 2264 insertions(+), 446 deletions(-) create mode 100644 .gitmodules create mode 100644 .pylintrc create mode 100755 harmonyqml create mode 100644 harmonyqml.pro create mode 100755 live_reload.sh delete mode 100755 run.sh delete mode 100755 run_live_reload.sh delete mode 100644 src/events/rooms_timeline.py create mode 100644 src/main.cpp delete mode 100644 src/matrix_client.py rename src/{ => python}/__about__.py (100%) rename src/{ => python}/__init__.py (100%) rename src/{ => python}/app.py (75%) rename src/{ => python}/backend.py (90%) rename src/{ => python}/events/__init__.py (100%) rename src/{ => python}/events/app.py (100%) rename src/{ => python}/events/event.py (100%) rename src/{ => python}/events/rooms.py (100%) create mode 100644 src/python/events/rooms_timeline.py rename src/{ => python}/events/users.py (100%) create mode 100644 src/python/html_filter.py create mode 100644 src/python/matrix_client.py create mode 160000 submodules/SortFilterProxyModel diff --git a/.gitignore b/.gitignore index b8d40a74..71e0f755 100644 --- a/.gitignore +++ b/.gitignore @@ -1,12 +1,14 @@ __pycache__ .mypy_cache -build -dist *.egg-info *.pyc + *.qmlc *.jsc -.pylintrc - tmp-* + +build +dist +.qmake.stash +Makefile diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 00000000..be99fc84 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "submodules/SortFilterProxyModel"] + path = submodules/SortFilterProxyModel + url = https://github.com/oKcerG/SortFilterProxyModel diff --git a/.pylintrc b/.pylintrc new file mode 100644 index 00000000..e5ae7c5d --- /dev/null +++ b/.pylintrc @@ -0,0 +1,362 @@ +[MASTER] + +# A comma-separated list of package or module names from where C extensions may +# be loaded. Extensions are loading into the active Python interpreter and may +# run arbitrary code +extension-pkg-whitelist=lxml.etree + +# Add files or directories to the blacklist. They should be base names, not +# paths. +ignore=.git + +# Add files or directories matching the regex patterns to the blacklist. The +# regex matches against base names, not paths. +ignore-patterns= + +# Python code to execute, usually for sys.path manipulation such as +# pygtk.require(). +#init-hook= + +# Use multiple processes to speed up Pylint. +jobs=6 + +# List of plugins (as comma separated values of python modules names) to load, +# usually to register additional checkers. +load-plugins= + +# Pickle collected data for later comparisons. +persistent=yes + +# Specify a configuration file. +#rcfile= + +# When enabled, pylint would attempt to guess common misconfiguration and emit +# user-friendly hints instead of false-positive error messages +suggestion-mode=yes + +# Allow loading of arbitrary C extensions. Extensions are imported into the +# active Python interpreter and may run arbitrary code. +unsafe-load-any-extension=no + + +[MESSAGES CONTROL] + +# Only show warnings with the listed confidence levels. Leave empty to show +# all. Valid levels: HIGH, INFERENCE, INFERENCE_FAILURE, UNDEFINED +confidence= + +# Disable the message, report, category or checker with the given id(s). You +# can either give multiple identifiers separated by comma (,) or put this +# option multiple times (only on the command line, not in the configuration +# file where it should appear only once).You can also use "--disable=all" to +# disable everything first and then reenable specific checks. For example, if +# you want to run only the similarities checker, you can use "--disable=all +# --enable=similarities". If you want to run only the classes checker, but have +# no Warning level messages displayed, use"--disable=all --enable=classes +# --disable=W" +# +# C0111: Allow lack of literal """docstring""" (e.g. if assigning __doc__) +# C0326: Allow aligning things like variable assignements +# C0412: Remove annoying "imports are not grouped" because of :Isort with from +# W0123: Allow eval() +disable=C0111,C0326,C0412,W0123 + +# (useful for modules/projects where namespaces are manipulated during runtime +# and thus existing member attributes cannot be deduced by static analysis. It +# supports qualified module names, as well as Unix pattern matching. +ignored-modules=pyotherside + +# Show a hint with possible names when a member name was not found. The aspect +# of finding the hint is based on edit distance. +missing-member-hint=yes + +# The minimum edit distance a name should have in order to be considered a +# similar match for a missing member name. +missing-member-hint-distance=1 + +# The total number of similar names that should be taken in consideration when +# showing a hint for a missing member. +missing-member-max-choices=1 + + +[SPELLING] + +# Limits count of emitted suggestions for spelling mistakes +max-spelling-suggestions=4 + +# Spelling dictionary name. Available dictionaries: none. To make it working +# install pyenchant package. +spelling-dict= + +# List of comma separated words that should not be checked. +spelling-ignore-words= + +# A path to a file that contains private dictionary; one word per line. +spelling-private-dict-file= + +# Tells whether to store unknown words to indicated private dictionary in +# --spelling-private-dict-file option instead of raising a message. +spelling-store-unknown-words=no + + +[SIMILARITIES] + +# Ignore comments when computing similarities. +ignore-comments=yes + +# Ignore docstrings when computing similarities. +ignore-docstrings=yes + +# Ignore imports when computing similarities. +ignore-imports=no + +# Minimum lines number of a similarity. +min-similarity-lines=4 + + +[MISCELLANEOUS] + +# List of note tags to take in consideration, separated by a comma. +notes= + + +[LOGGING] + +# Logging modules to check that the string format arguments are in logging +# function parameter format +logging-modules=logging + + +[FORMAT] + +# Expected format of line ending, e.g. empty (any line ending), LF or CRLF. +expected-line-ending-format= + +# Regexp for a line that is allowed to be longer than the limit. +ignore-long-lines=^\s*(# )??$ + +# Number of spaces of indent required inside a hanging or continued line. +indent-after-paren=4 + +# String used as indentation unit. This is usually " " (4 spaces) or "\t" (1 +# tab). +indent-string=' ' + +# Maximum number of characters on a single line. +max-line-length=79 + +# Maximum number of lines in a module +max-module-lines=1000 + +# List of optional constructs for which whitespace checking is disabled. `dict- +# separator` is used to allow tabulation in dicts, etc.: {1 : 1,\n222: 2}. +# `trailing-comma` allows a space between comma and closing bracket: (a, ). +# `empty-line` allows space-only lines. +no-space-check=trailing-comma, + dict-separator + +# Allow the body of a class to be on the same line as the declaration if body +# contains single statement. +single-line-class-stmt=no + +# Allow the body of an if to be on the same line as the test if there is no +# else. +single-line-if-stmt=no + + +[BASIC] + +# Naming style matching correct argument names +argument-naming-style=snake_case + +# Regular expression matching correct argument names. Overrides argument- +# naming-style +argument-rgx=[a-z0-9_]{2,65}$ + +# Naming style matching correct attribute names +attr-naming-style=snake_case + +# Regular expression matching correct attribute names. Overrides attr-naming- +# style +attr-rgx=[a-z0-9_]{2,65}$ + +# Bad variable names which should always be refused, separated by a comma +bad-names= + +# Naming style matching correct class attribute names +class-attribute-naming-style=snake_case + +# Regular expression matching correct class attribute names. Overrides class- +# attribute-naming-style +class-attribute-rgx=[a-z0-9_]{2,65}$ + +# Naming style matching correct class names +class-naming-style=PascalCase + +# Regular expression matching correct class names. Overrides class-naming-style +#class-rgx= + +# Naming style matching correct constant names +const-naming-style=UPPER_CASE + +# Regular expression matching correct constant names. Overrides const-naming- +# style +const-rgx=(__[a-zA-Z0-9_]{2,65}__|[A-Z0-9_]{2,65})$ + +# Minimum line length for functions/classes that require docstrings, shorter +# ones are exempt. +docstring-min-length=-1 + +# Naming style matching correct function names +function-naming-style=snake_case + +# Regular expression matching correct function names. Overrides function- +# naming-style +function-rgx=[a-z0-9_]{2,65}$ + +# Good variable names which should always be accepted, separated by a comma +good-names= _, a, b, i, j, k, v, w, h, x, y, z + +# Include a hint for the correct naming format with invalid-name +include-naming-hint=no + +# Naming style matching correct inline iteration names +inlinevar-naming-style=any + +# Regular expression matching correct inline iteration names. Overrides +# inlinevar-naming-style +#inlinevar-rgx= + +# Naming style matching correct method names +method-naming-style=snake_case + +# Regular expression matching correct method names. Overrides method-naming- +# style +method-rgx=([a-z0-9_]{2,65}|on[A-Z][a-zA-Z0-9]{1,65})$ + +# Naming style matching correct module names +module-naming-style=snake_case + +# Regular expression matching correct module names. Overrides module-naming- +# style +module-rgx=[a-z0-9_]{2,65}$ + +# Colon-delimited sets of names that determine each other's naming style when +# the name regexes allow several styles. +name-group= + +# Regular expression which should only match function or class names that do +# not require a docstring. +no-docstring-rgx=^ + +# List of decorators that produce properties, such as abc.abstractproperty. Add +# to this list to register other decorators that produce valid properties. +property-classes=abc.abstractproperty + +# Naming style matching correct variable names +variable-naming-style=snake_case + +# Regular expression matching correct variable names. Overrides variable- +# naming-style +variable-rgx=[a-z0-9_]{2,65}$ + + +[IMPORTS] + +# Allow wildcard imports from modules that define __all__. +allow-wildcard-with-all=no + +# Analyse import fallback blocks. This can be used to support both Python 2 and +# 3 compatible code, which means that the block might have code that exists +# only in one or another interpreter, leading to false positives when analysed. +analyse-fallback-blocks=no + +# Deprecated modules which should not be used, separated by a comma +deprecated-modules=optparse,tkinter.tix + +# Create a graph of external dependencies in the given file (report RP0402 must +# not be disabled) +ext-import-graph= + +# Create a graph of every (i.e. internal and external) dependencies in the +# given file (report RP0402 must not be disabled) +import-graph= + +# Create a graph of internal dependencies in the given file (report RP0402 must +# not be disabled) +int-import-graph= + +# Force import order to recognize a module as part of the standard +# compatibility libraries. +known-standard-library= + +# Force import order to recognize a module as part of a third party library. +known-third-party=enchant + + +[DESIGN] + +# Maximum number of arguments for function / method +max-args=99 + +# Maximum number of attributes for a class (see R0902). +max-attributes=99 + +# Maximum number of boolean expressions in a if statement +max-bool-expr=99 + +# Maximum number of branch for function / method body +max-branches=99 + +# Maximum number of locals for function / method body +max-locals=99 + +# Maximum number of parents for a class (see R0901). +max-parents=99 + +# Maximum number of public methods for a class (see R0904). +max-public-methods=99 + +# Maximum number of return / yield for function / method body +max-returns=99 + +# Maximum number of statements in function / method body +max-statements=999 + +# Minimum number of public methods for a class (see R0903). +min-public-methods=0 + + +[CLASSES] + +# List of method names used to declare (i.e. assign) instance attributes. +defining-attr-methods=__init__, + __new__, + setUp + +# List of member names, which should be excluded from the protected access +# warning. +exclude-protected=_asdict, + _fields, + _replace, + _source, + _make + +# List of valid names for the first argument in a class method. +valid-classmethod-first-arg=cls + +# List of valid names for the first argument in a metaclass class method. +valid-metaclass-classmethod-first-arg=mcs + + +[EXCEPTIONS] + +# Exceptions that will emit a warning when being caught. Defaults to +# "Exception" +# Catching this is safe enough in Python 3. +#overgeneral-exceptions=Exception +overgeneral-exceptions= + + +[TYPECHECK] +generated-members=sh diff --git a/Makefile b/Makefile index 70614f63..8f137c2c 100644 --- a/Makefile +++ b/Makefile @@ -1,53 +1,1057 @@ -PKG_DIR = src +############################################################################# +# Makefile for building: harmonyqml +# Generated by qmake (3.1) (Qt 5.11.3) +# Project: harmonyqml.pro +# Template: app +# Command: /usr/lib/qt5/bin/qmake -o Makefile harmonyqml.pro CONFIG+=no_embedded +############################################################################# -PYTHON = python3 -PYLINT = pylint -MYPY = mypy -VULTURE = vulture -BANDIT = bandit -PYCYLE = pycycle -CLOC = cloc +MAKEFILE = Makefile -PYLINT_FLAGS = --output-format colorized -MYPY_FLAGS = --ignore-missing-imports -VULTURE_FLAGS = --min-confidence 70 -BANDIT_FLAGS = -PYCYLE_FLAGS = -CLOC_FLAGS = --ignore-whitespace +####### Compiler, tools and options -LINE = "\033[35m―――――――――――――――――――――――――――――――――――――――――――――――――――――――\033[0m" +CC = gcc +CXX = g++ +DEFINES = -DQT_DEPRECATED_WARNINGS -DQT_NO_DEBUG -DQT_QUICK_LIB -DQT_GUI_LIB -DQT_QML_LIB -DQT_NETWORK_LIB -DQT_CORE_LIB +CFLAGS = -pipe -O2 -w -D_REENTRANT -fPIC $(DEFINES) +CXXFLAGS = -pipe -O2 -std=gnu++11 -w -D_REENTRANT -fPIC $(DEFINES) +INCPATH = -I. -Isubmodules/SortFilterProxyModel -I /usr/include/qt5 -I /usr/include/qt5/QtQuick -I /usr/include/qt5/QtGui -I /usr/include/qt5/QtQml -I /usr/include/qt5/QtNetwork -I /usr/include/qt5/QtCore -Ibuild/moc -I /usr/include/libdrm -I/usr/lib/qt5/mkspecs/linux-g++ +QMAKE = /usr/lib/qt5/bin/qmake +DEL_FILE = rm -rf +CHK_DIR_EXISTS= test -d +MKDIR = mkdir -p +COPY = cp -f +COPY_FILE = cp -f +COPY_DIR = cp -f -R +INSTALL_FILE = install -m 644 -p +INSTALL_PROGRAM = install -m 755 -p +INSTALL_DIR = cp -f -R +QINSTALL = /usr/lib/qt5/bin/qmake -install qinstall +QINSTALL_PROGRAM = /usr/lib/qt5/bin/qmake -install qinstall -exe +DEL_FILE = rm -rf +SYMLINK = ln -f -s +DEL_DIR = rmdir +MOVE = mv -f +TAR = tar -cf +COMPRESS = gzip -9f +DISTNAME = harmonyqml1.0.0 +DISTDIR = /home/kana/prog/python/harmonyqml/build/obj/harmonyqml1.0.0 +LINK = g++ +LFLAGS = -Wl,-O1 -Wl,-rpath,/usr/lib +LIBS = $(SUBLIBS) -lQt5Quick -lQt5Gui -lQt5Qml -lQt5Network -lQt5Core -lGL -lpthread +AR = ar cqs +RANLIB = +SED = sed +STRIP = strip -.PHONY: clean test +####### Output directory -clean: - find . -name '__pycache__' -exec rm -Rfv {} + - find . -name '*.pyc' -exec rm -Rfv {} + - find . -name '*.qmlc' -exec rm -Rfv {} + - find . -name '*.jsc' -exec rm -Rfv {} + - find . -name '*.egg-info' -exec rm -Rfv {} + +OBJECTS_DIR = build/obj/ + +####### Files + +SOURCES = src/main.cpp \ + submodules/SortFilterProxyModel/qqmlsortfilterproxymodel.cpp \ + submodules/SortFilterProxyModel/filters/filter.cpp \ + submodules/SortFilterProxyModel/filters/filtercontainer.cpp \ + submodules/SortFilterProxyModel/filters/rolefilter.cpp \ + submodules/SortFilterProxyModel/filters/valuefilter.cpp \ + submodules/SortFilterProxyModel/filters/indexfilter.cpp \ + submodules/SortFilterProxyModel/filters/regexpfilter.cpp \ + submodules/SortFilterProxyModel/filters/rangefilter.cpp \ + submodules/SortFilterProxyModel/filters/expressionfilter.cpp \ + submodules/SortFilterProxyModel/filters/filtercontainerfilter.cpp \ + submodules/SortFilterProxyModel/filters/anyoffilter.cpp \ + submodules/SortFilterProxyModel/filters/alloffilter.cpp \ + submodules/SortFilterProxyModel/filters/filtersqmltypes.cpp \ + submodules/SortFilterProxyModel/sorters/sorter.cpp \ + submodules/SortFilterProxyModel/sorters/sortercontainer.cpp \ + submodules/SortFilterProxyModel/sorters/rolesorter.cpp \ + submodules/SortFilterProxyModel/sorters/stringsorter.cpp \ + submodules/SortFilterProxyModel/sorters/expressionsorter.cpp \ + submodules/SortFilterProxyModel/sorters/sortersqmltypes.cpp \ + submodules/SortFilterProxyModel/proxyroles/proxyrole.cpp \ + submodules/SortFilterProxyModel/proxyroles/proxyrolecontainer.cpp \ + submodules/SortFilterProxyModel/proxyroles/joinrole.cpp \ + submodules/SortFilterProxyModel/proxyroles/switchrole.cpp \ + submodules/SortFilterProxyModel/proxyroles/expressionrole.cpp \ + submodules/SortFilterProxyModel/proxyroles/proxyrolesqmltypes.cpp \ + submodules/SortFilterProxyModel/proxyroles/singlerole.cpp \ + submodules/SortFilterProxyModel/proxyroles/regexprole.cpp \ + submodules/SortFilterProxyModel/sorters/filtersorter.cpp \ + submodules/SortFilterProxyModel/proxyroles/filterrole.cpp build/moc/moc_qqmlsortfilterproxymodel.cpp \ + build/moc/moc_filter.cpp \ + build/moc/moc_rolefilter.cpp \ + build/moc/moc_valuefilter.cpp \ + build/moc/moc_indexfilter.cpp \ + build/moc/moc_regexpfilter.cpp \ + build/moc/moc_rangefilter.cpp \ + build/moc/moc_expressionfilter.cpp \ + build/moc/moc_filtercontainerfilter.cpp \ + build/moc/moc_anyoffilter.cpp \ + build/moc/moc_alloffilter.cpp \ + build/moc/moc_sorter.cpp \ + build/moc/moc_rolesorter.cpp \ + build/moc/moc_stringsorter.cpp \ + build/moc/moc_expressionsorter.cpp \ + build/moc/moc_proxyrole.cpp \ + build/moc/moc_joinrole.cpp \ + build/moc/moc_switchrole.cpp \ + build/moc/moc_expressionrole.cpp \ + build/moc/moc_singlerole.cpp \ + build/moc/moc_regexprole.cpp \ + build/moc/moc_filtersorter.cpp \ + build/moc/moc_filterrole.cpp +OBJECTS = build/obj/main.o \ + build/obj/qqmlsortfilterproxymodel.o \ + build/obj/filter.o \ + build/obj/filtercontainer.o \ + build/obj/rolefilter.o \ + build/obj/valuefilter.o \ + build/obj/indexfilter.o \ + build/obj/regexpfilter.o \ + build/obj/rangefilter.o \ + build/obj/expressionfilter.o \ + build/obj/filtercontainerfilter.o \ + build/obj/anyoffilter.o \ + build/obj/alloffilter.o \ + build/obj/filtersqmltypes.o \ + build/obj/sorter.o \ + build/obj/sortercontainer.o \ + build/obj/rolesorter.o \ + build/obj/stringsorter.o \ + build/obj/expressionsorter.o \ + build/obj/sortersqmltypes.o \ + build/obj/proxyrole.o \ + build/obj/proxyrolecontainer.o \ + build/obj/joinrole.o \ + build/obj/switchrole.o \ + build/obj/expressionrole.o \ + build/obj/proxyrolesqmltypes.o \ + build/obj/singlerole.o \ + build/obj/regexprole.o \ + build/obj/filtersorter.o \ + build/obj/filterrole.o \ + build/obj/moc_qqmlsortfilterproxymodel.o \ + build/obj/moc_filter.o \ + build/obj/moc_rolefilter.o \ + build/obj/moc_valuefilter.o \ + build/obj/moc_indexfilter.o \ + build/obj/moc_regexpfilter.o \ + build/obj/moc_rangefilter.o \ + build/obj/moc_expressionfilter.o \ + build/obj/moc_filtercontainerfilter.o \ + build/obj/moc_anyoffilter.o \ + build/obj/moc_alloffilter.o \ + build/obj/moc_sorter.o \ + build/obj/moc_rolesorter.o \ + build/obj/moc_stringsorter.o \ + build/obj/moc_expressionsorter.o \ + build/obj/moc_proxyrole.o \ + build/obj/moc_joinrole.o \ + build/obj/moc_switchrole.o \ + build/obj/moc_expressionrole.o \ + build/obj/moc_singlerole.o \ + build/obj/moc_regexprole.o \ + build/obj/moc_filtersorter.o \ + build/obj/moc_filterrole.o +DIST = /usr/lib/qt5/mkspecs/features/spec_pre.prf \ + /usr/lib/qt5/mkspecs/common/unix.conf \ + /usr/lib/qt5/mkspecs/common/linux.conf \ + /usr/lib/qt5/mkspecs/common/sanitize.conf \ + /usr/lib/qt5/mkspecs/common/gcc-base.conf \ + /usr/lib/qt5/mkspecs/common/gcc-base-unix.conf \ + /usr/lib/qt5/mkspecs/common/g++-base.conf \ + /usr/lib/qt5/mkspecs/common/g++-unix.conf \ + /usr/lib/qt5/mkspecs/qconfig.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_accessibility_support_private.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_bootstrap_private.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_concurrent.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_concurrent_private.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_core.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_core_private.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_dbus.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_dbus_private.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_devicediscovery_support_private.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_edid_support_private.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_egl_support_private.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_eglfs_kms_support_private.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_eglfsdeviceintegration_private.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_eventdispatcher_support_private.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_fb_support_private.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_fontdatabase_support_private.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_glx_support_private.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_gui.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_gui_private.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_input_support_private.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_kms_support_private.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_linuxaccessibility_support_private.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_multimedia.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_multimedia_private.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_multimediagsttools_private.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_multimediawidgets.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_multimediawidgets_private.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_network.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_network_private.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_opengl.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_opengl_private.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_openglextensions.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_openglextensions_private.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_packetprotocol_private.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_platformcompositor_support_private.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_printsupport.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_printsupport_private.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_qml.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_qml_private.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_qmldebug_private.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_qmldevtools_private.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_qmltest.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_qmltest_private.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_qtmultimediaquicktools_private.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_quick.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_quick_private.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_quickcontrols2.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_quickcontrols2_private.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_quickparticles_private.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_quicktemplates2_private.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_quickwidgets.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_quickwidgets_private.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_service_support_private.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_sql.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_sql_private.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_svg.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_svg_private.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_testlib.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_testlib_private.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_theme_support_private.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_vulkan_support_private.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_webengine.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_webengine_private.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_webenginecore.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_webenginecore_private.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_webenginecoreheaders_private.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_webenginewidgets.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_webenginewidgets_private.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_widgets.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_widgets_private.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_x11extras.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_x11extras_private.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_xcb_qpa_lib_private.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_xml.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_xml_private.pri \ + /usr/lib/qt5/mkspecs/features/qt_functions.prf \ + /usr/lib/qt5/mkspecs/features/qt_config.prf \ + /usr/lib/qt5/mkspecs/linux-g++/qmake.conf \ + /usr/lib/qt5/mkspecs/features/spec_post.prf \ + .qmake.stash \ + /usr/lib/qt5/mkspecs/features/exclusive_builds.prf \ + /usr/lib/qt5/mkspecs/features/toolchain.prf \ + /usr/lib/qt5/mkspecs/features/default_pre.prf \ + submodules/SortFilterProxyModel/SortFilterProxyModel.pri \ + /usr/lib/qt5/mkspecs/features/resolve_config.prf \ + /usr/lib/qt5/mkspecs/features/default_post.prf \ + /usr/lib/qt5/mkspecs/features/warn_off.prf \ + /usr/lib/qt5/mkspecs/features/qt.prf \ + /usr/lib/qt5/mkspecs/features/resources.prf \ + /usr/lib/qt5/mkspecs/features/moc.prf \ + /usr/lib/qt5/mkspecs/features/unix/opengl.prf \ + /usr/lib/qt5/mkspecs/features/unix/thread.prf \ + /usr/lib/qt5/mkspecs/features/qmake_use.prf \ + /usr/lib/qt5/mkspecs/features/file_copies.prf \ + /usr/lib/qt5/mkspecs/features/testcase_targets.prf \ + /usr/lib/qt5/mkspecs/features/exceptions.prf \ + /usr/lib/qt5/mkspecs/features/yacc.prf \ + /usr/lib/qt5/mkspecs/features/lex.prf \ + harmonyqml.pro submodules/SortFilterProxyModel/qqmlsortfilterproxymodel.h \ + submodules/SortFilterProxyModel/filters/filter.h \ + submodules/SortFilterProxyModel/filters/filtercontainer.h \ + submodules/SortFilterProxyModel/filters/rolefilter.h \ + submodules/SortFilterProxyModel/filters/valuefilter.h \ + submodules/SortFilterProxyModel/filters/indexfilter.h \ + submodules/SortFilterProxyModel/filters/regexpfilter.h \ + submodules/SortFilterProxyModel/filters/rangefilter.h \ + submodules/SortFilterProxyModel/filters/expressionfilter.h \ + submodules/SortFilterProxyModel/filters/filtercontainerfilter.h \ + submodules/SortFilterProxyModel/filters/anyoffilter.h \ + submodules/SortFilterProxyModel/filters/alloffilter.h \ + submodules/SortFilterProxyModel/sorters/sorter.h \ + submodules/SortFilterProxyModel/sorters/sortercontainer.h \ + submodules/SortFilterProxyModel/sorters/rolesorter.h \ + submodules/SortFilterProxyModel/sorters/stringsorter.h \ + submodules/SortFilterProxyModel/sorters/expressionsorter.h \ + submodules/SortFilterProxyModel/proxyroles/proxyrole.h \ + submodules/SortFilterProxyModel/proxyroles/proxyrolecontainer.h \ + submodules/SortFilterProxyModel/proxyroles/joinrole.h \ + submodules/SortFilterProxyModel/proxyroles/switchrole.h \ + submodules/SortFilterProxyModel/proxyroles/expressionrole.h \ + submodules/SortFilterProxyModel/proxyroles/singlerole.h \ + submodules/SortFilterProxyModel/proxyroles/regexprole.h \ + submodules/SortFilterProxyModel/sorters/filtersorter.h \ + submodules/SortFilterProxyModel/proxyroles/filterrole.h src/main.cpp \ + submodules/SortFilterProxyModel/qqmlsortfilterproxymodel.cpp \ + submodules/SortFilterProxyModel/filters/filter.cpp \ + submodules/SortFilterProxyModel/filters/filtercontainer.cpp \ + submodules/SortFilterProxyModel/filters/rolefilter.cpp \ + submodules/SortFilterProxyModel/filters/valuefilter.cpp \ + submodules/SortFilterProxyModel/filters/indexfilter.cpp \ + submodules/SortFilterProxyModel/filters/regexpfilter.cpp \ + submodules/SortFilterProxyModel/filters/rangefilter.cpp \ + submodules/SortFilterProxyModel/filters/expressionfilter.cpp \ + submodules/SortFilterProxyModel/filters/filtercontainerfilter.cpp \ + submodules/SortFilterProxyModel/filters/anyoffilter.cpp \ + submodules/SortFilterProxyModel/filters/alloffilter.cpp \ + submodules/SortFilterProxyModel/filters/filtersqmltypes.cpp \ + submodules/SortFilterProxyModel/sorters/sorter.cpp \ + submodules/SortFilterProxyModel/sorters/sortercontainer.cpp \ + submodules/SortFilterProxyModel/sorters/rolesorter.cpp \ + submodules/SortFilterProxyModel/sorters/stringsorter.cpp \ + submodules/SortFilterProxyModel/sorters/expressionsorter.cpp \ + submodules/SortFilterProxyModel/sorters/sortersqmltypes.cpp \ + submodules/SortFilterProxyModel/proxyroles/proxyrole.cpp \ + submodules/SortFilterProxyModel/proxyroles/proxyrolecontainer.cpp \ + submodules/SortFilterProxyModel/proxyroles/joinrole.cpp \ + submodules/SortFilterProxyModel/proxyroles/switchrole.cpp \ + submodules/SortFilterProxyModel/proxyroles/expressionrole.cpp \ + submodules/SortFilterProxyModel/proxyroles/proxyrolesqmltypes.cpp \ + submodules/SortFilterProxyModel/proxyroles/singlerole.cpp \ + submodules/SortFilterProxyModel/proxyroles/regexprole.cpp \ + submodules/SortFilterProxyModel/sorters/filtersorter.cpp \ + submodules/SortFilterProxyModel/proxyroles/filterrole.cpp +QMAKE_TARGET = harmonyqml +DESTDIR = +TARGET = harmonyqml + + +first: all +####### Build rules + +$(TARGET): $(OBJECTS) + $(LINK) $(LFLAGS) -o $(TARGET) $(OBJECTS) $(OBJCOMP) $(LIBS) + +Makefile: harmonyqml.pro /usr/lib/qt5/mkspecs/linux-g++/qmake.conf /usr/lib/qt5/mkspecs/features/spec_pre.prf \ + /usr/lib/qt5/mkspecs/common/unix.conf \ + /usr/lib/qt5/mkspecs/common/linux.conf \ + /usr/lib/qt5/mkspecs/common/sanitize.conf \ + /usr/lib/qt5/mkspecs/common/gcc-base.conf \ + /usr/lib/qt5/mkspecs/common/gcc-base-unix.conf \ + /usr/lib/qt5/mkspecs/common/g++-base.conf \ + /usr/lib/qt5/mkspecs/common/g++-unix.conf \ + /usr/lib/qt5/mkspecs/qconfig.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_accessibility_support_private.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_bootstrap_private.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_concurrent.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_concurrent_private.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_core.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_core_private.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_dbus.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_dbus_private.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_devicediscovery_support_private.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_edid_support_private.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_egl_support_private.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_eglfs_kms_support_private.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_eglfsdeviceintegration_private.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_eventdispatcher_support_private.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_fb_support_private.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_fontdatabase_support_private.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_glx_support_private.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_gui.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_gui_private.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_input_support_private.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_kms_support_private.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_linuxaccessibility_support_private.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_multimedia.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_multimedia_private.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_multimediagsttools_private.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_multimediawidgets.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_multimediawidgets_private.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_network.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_network_private.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_opengl.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_opengl_private.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_openglextensions.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_openglextensions_private.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_packetprotocol_private.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_platformcompositor_support_private.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_printsupport.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_printsupport_private.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_qml.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_qml_private.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_qmldebug_private.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_qmldevtools_private.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_qmltest.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_qmltest_private.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_qtmultimediaquicktools_private.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_quick.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_quick_private.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_quickcontrols2.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_quickcontrols2_private.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_quickparticles_private.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_quicktemplates2_private.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_quickwidgets.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_quickwidgets_private.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_service_support_private.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_sql.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_sql_private.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_svg.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_svg_private.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_testlib.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_testlib_private.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_theme_support_private.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_vulkan_support_private.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_webengine.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_webengine_private.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_webenginecore.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_webenginecore_private.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_webenginecoreheaders_private.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_webenginewidgets.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_webenginewidgets_private.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_widgets.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_widgets_private.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_x11extras.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_x11extras_private.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_xcb_qpa_lib_private.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_xml.pri \ + /usr/lib/qt5/mkspecs/modules/qt_lib_xml_private.pri \ + /usr/lib/qt5/mkspecs/features/qt_functions.prf \ + /usr/lib/qt5/mkspecs/features/qt_config.prf \ + /usr/lib/qt5/mkspecs/linux-g++/qmake.conf \ + /usr/lib/qt5/mkspecs/features/spec_post.prf \ + .qmake.stash \ + /usr/lib/qt5/mkspecs/features/exclusive_builds.prf \ + /usr/lib/qt5/mkspecs/features/toolchain.prf \ + /usr/lib/qt5/mkspecs/features/default_pre.prf \ + submodules/SortFilterProxyModel/SortFilterProxyModel.pri \ + /usr/lib/qt5/mkspecs/features/resolve_config.prf \ + /usr/lib/qt5/mkspecs/features/default_post.prf \ + /usr/lib/qt5/mkspecs/features/warn_off.prf \ + /usr/lib/qt5/mkspecs/features/qt.prf \ + /usr/lib/qt5/mkspecs/features/resources.prf \ + /usr/lib/qt5/mkspecs/features/moc.prf \ + /usr/lib/qt5/mkspecs/features/unix/opengl.prf \ + /usr/lib/qt5/mkspecs/features/unix/thread.prf \ + /usr/lib/qt5/mkspecs/features/qmake_use.prf \ + /usr/lib/qt5/mkspecs/features/file_copies.prf \ + /usr/lib/qt5/mkspecs/features/testcase_targets.prf \ + /usr/lib/qt5/mkspecs/features/exceptions.prf \ + /usr/lib/qt5/mkspecs/features/yacc.prf \ + /usr/lib/qt5/mkspecs/features/lex.prf \ + harmonyqml.pro \ + /usr/lib64/libQt5Quick.prl \ + /usr/lib64/libQt5Gui.prl \ + /usr/lib64/libQt5Qml.prl \ + /usr/lib64/libQt5Network.prl \ + /usr/lib64/libQt5Core.prl + $(QMAKE) -o Makefile harmonyqml.pro CONFIG+=no_embedded +/usr/lib/qt5/mkspecs/features/spec_pre.prf: +/usr/lib/qt5/mkspecs/common/unix.conf: +/usr/lib/qt5/mkspecs/common/linux.conf: +/usr/lib/qt5/mkspecs/common/sanitize.conf: +/usr/lib/qt5/mkspecs/common/gcc-base.conf: +/usr/lib/qt5/mkspecs/common/gcc-base-unix.conf: +/usr/lib/qt5/mkspecs/common/g++-base.conf: +/usr/lib/qt5/mkspecs/common/g++-unix.conf: +/usr/lib/qt5/mkspecs/qconfig.pri: +/usr/lib/qt5/mkspecs/modules/qt_lib_accessibility_support_private.pri: +/usr/lib/qt5/mkspecs/modules/qt_lib_bootstrap_private.pri: +/usr/lib/qt5/mkspecs/modules/qt_lib_concurrent.pri: +/usr/lib/qt5/mkspecs/modules/qt_lib_concurrent_private.pri: +/usr/lib/qt5/mkspecs/modules/qt_lib_core.pri: +/usr/lib/qt5/mkspecs/modules/qt_lib_core_private.pri: +/usr/lib/qt5/mkspecs/modules/qt_lib_dbus.pri: +/usr/lib/qt5/mkspecs/modules/qt_lib_dbus_private.pri: +/usr/lib/qt5/mkspecs/modules/qt_lib_devicediscovery_support_private.pri: +/usr/lib/qt5/mkspecs/modules/qt_lib_edid_support_private.pri: +/usr/lib/qt5/mkspecs/modules/qt_lib_egl_support_private.pri: +/usr/lib/qt5/mkspecs/modules/qt_lib_eglfs_kms_support_private.pri: +/usr/lib/qt5/mkspecs/modules/qt_lib_eglfsdeviceintegration_private.pri: +/usr/lib/qt5/mkspecs/modules/qt_lib_eventdispatcher_support_private.pri: +/usr/lib/qt5/mkspecs/modules/qt_lib_fb_support_private.pri: +/usr/lib/qt5/mkspecs/modules/qt_lib_fontdatabase_support_private.pri: +/usr/lib/qt5/mkspecs/modules/qt_lib_glx_support_private.pri: +/usr/lib/qt5/mkspecs/modules/qt_lib_gui.pri: +/usr/lib/qt5/mkspecs/modules/qt_lib_gui_private.pri: +/usr/lib/qt5/mkspecs/modules/qt_lib_input_support_private.pri: +/usr/lib/qt5/mkspecs/modules/qt_lib_kms_support_private.pri: +/usr/lib/qt5/mkspecs/modules/qt_lib_linuxaccessibility_support_private.pri: +/usr/lib/qt5/mkspecs/modules/qt_lib_multimedia.pri: +/usr/lib/qt5/mkspecs/modules/qt_lib_multimedia_private.pri: +/usr/lib/qt5/mkspecs/modules/qt_lib_multimediagsttools_private.pri: +/usr/lib/qt5/mkspecs/modules/qt_lib_multimediawidgets.pri: +/usr/lib/qt5/mkspecs/modules/qt_lib_multimediawidgets_private.pri: +/usr/lib/qt5/mkspecs/modules/qt_lib_network.pri: +/usr/lib/qt5/mkspecs/modules/qt_lib_network_private.pri: +/usr/lib/qt5/mkspecs/modules/qt_lib_opengl.pri: +/usr/lib/qt5/mkspecs/modules/qt_lib_opengl_private.pri: +/usr/lib/qt5/mkspecs/modules/qt_lib_openglextensions.pri: +/usr/lib/qt5/mkspecs/modules/qt_lib_openglextensions_private.pri: +/usr/lib/qt5/mkspecs/modules/qt_lib_packetprotocol_private.pri: +/usr/lib/qt5/mkspecs/modules/qt_lib_platformcompositor_support_private.pri: +/usr/lib/qt5/mkspecs/modules/qt_lib_printsupport.pri: +/usr/lib/qt5/mkspecs/modules/qt_lib_printsupport_private.pri: +/usr/lib/qt5/mkspecs/modules/qt_lib_qml.pri: +/usr/lib/qt5/mkspecs/modules/qt_lib_qml_private.pri: +/usr/lib/qt5/mkspecs/modules/qt_lib_qmldebug_private.pri: +/usr/lib/qt5/mkspecs/modules/qt_lib_qmldevtools_private.pri: +/usr/lib/qt5/mkspecs/modules/qt_lib_qmltest.pri: +/usr/lib/qt5/mkspecs/modules/qt_lib_qmltest_private.pri: +/usr/lib/qt5/mkspecs/modules/qt_lib_qtmultimediaquicktools_private.pri: +/usr/lib/qt5/mkspecs/modules/qt_lib_quick.pri: +/usr/lib/qt5/mkspecs/modules/qt_lib_quick_private.pri: +/usr/lib/qt5/mkspecs/modules/qt_lib_quickcontrols2.pri: +/usr/lib/qt5/mkspecs/modules/qt_lib_quickcontrols2_private.pri: +/usr/lib/qt5/mkspecs/modules/qt_lib_quickparticles_private.pri: +/usr/lib/qt5/mkspecs/modules/qt_lib_quicktemplates2_private.pri: +/usr/lib/qt5/mkspecs/modules/qt_lib_quickwidgets.pri: +/usr/lib/qt5/mkspecs/modules/qt_lib_quickwidgets_private.pri: +/usr/lib/qt5/mkspecs/modules/qt_lib_service_support_private.pri: +/usr/lib/qt5/mkspecs/modules/qt_lib_sql.pri: +/usr/lib/qt5/mkspecs/modules/qt_lib_sql_private.pri: +/usr/lib/qt5/mkspecs/modules/qt_lib_svg.pri: +/usr/lib/qt5/mkspecs/modules/qt_lib_svg_private.pri: +/usr/lib/qt5/mkspecs/modules/qt_lib_testlib.pri: +/usr/lib/qt5/mkspecs/modules/qt_lib_testlib_private.pri: +/usr/lib/qt5/mkspecs/modules/qt_lib_theme_support_private.pri: +/usr/lib/qt5/mkspecs/modules/qt_lib_vulkan_support_private.pri: +/usr/lib/qt5/mkspecs/modules/qt_lib_webengine.pri: +/usr/lib/qt5/mkspecs/modules/qt_lib_webengine_private.pri: +/usr/lib/qt5/mkspecs/modules/qt_lib_webenginecore.pri: +/usr/lib/qt5/mkspecs/modules/qt_lib_webenginecore_private.pri: +/usr/lib/qt5/mkspecs/modules/qt_lib_webenginecoreheaders_private.pri: +/usr/lib/qt5/mkspecs/modules/qt_lib_webenginewidgets.pri: +/usr/lib/qt5/mkspecs/modules/qt_lib_webenginewidgets_private.pri: +/usr/lib/qt5/mkspecs/modules/qt_lib_widgets.pri: +/usr/lib/qt5/mkspecs/modules/qt_lib_widgets_private.pri: +/usr/lib/qt5/mkspecs/modules/qt_lib_x11extras.pri: +/usr/lib/qt5/mkspecs/modules/qt_lib_x11extras_private.pri: +/usr/lib/qt5/mkspecs/modules/qt_lib_xcb_qpa_lib_private.pri: +/usr/lib/qt5/mkspecs/modules/qt_lib_xml.pri: +/usr/lib/qt5/mkspecs/modules/qt_lib_xml_private.pri: +/usr/lib/qt5/mkspecs/features/qt_functions.prf: +/usr/lib/qt5/mkspecs/features/qt_config.prf: +/usr/lib/qt5/mkspecs/linux-g++/qmake.conf: +/usr/lib/qt5/mkspecs/features/spec_post.prf: +.qmake.stash: +/usr/lib/qt5/mkspecs/features/exclusive_builds.prf: +/usr/lib/qt5/mkspecs/features/toolchain.prf: +/usr/lib/qt5/mkspecs/features/default_pre.prf: +submodules/SortFilterProxyModel/SortFilterProxyModel.pri: +/usr/lib/qt5/mkspecs/features/resolve_config.prf: +/usr/lib/qt5/mkspecs/features/default_post.prf: +/usr/lib/qt5/mkspecs/features/warn_off.prf: +/usr/lib/qt5/mkspecs/features/qt.prf: +/usr/lib/qt5/mkspecs/features/resources.prf: +/usr/lib/qt5/mkspecs/features/moc.prf: +/usr/lib/qt5/mkspecs/features/unix/opengl.prf: +/usr/lib/qt5/mkspecs/features/unix/thread.prf: +/usr/lib/qt5/mkspecs/features/qmake_use.prf: +/usr/lib/qt5/mkspecs/features/file_copies.prf: +/usr/lib/qt5/mkspecs/features/testcase_targets.prf: +/usr/lib/qt5/mkspecs/features/exceptions.prf: +/usr/lib/qt5/mkspecs/features/yacc.prf: +/usr/lib/qt5/mkspecs/features/lex.prf: +harmonyqml.pro: +/usr/lib64/libQt5Quick.prl: +/usr/lib64/libQt5Gui.prl: +/usr/lib64/libQt5Qml.prl: +/usr/lib64/libQt5Network.prl: +/usr/lib64/libQt5Core.prl: +qmake: FORCE + @$(QMAKE) -o Makefile harmonyqml.pro CONFIG+=no_embedded + +qmake_all: FORCE + + +all: Makefile $(TARGET) + +dist: distdir FORCE + (cd `dirname $(DISTDIR)` && $(TAR) $(DISTNAME).tar $(DISTNAME) && $(COMPRESS) $(DISTNAME).tar) && $(MOVE) `dirname $(DISTDIR)`/$(DISTNAME).tar.gz . && $(DEL_FILE) -r $(DISTDIR) + +distdir: FORCE + @test -d $(DISTDIR) || mkdir -p $(DISTDIR) + $(COPY_FILE) --parents $(DIST) $(DISTDIR)/ + $(COPY_FILE) --parents /usr/lib/qt5/mkspecs/features/data/dummy.cpp $(DISTDIR)/ + $(COPY_FILE) --parents submodules/SortFilterProxyModel/qqmlsortfilterproxymodel.h submodules/SortFilterProxyModel/filters/filter.h submodules/SortFilterProxyModel/filters/filtercontainer.h submodules/SortFilterProxyModel/filters/rolefilter.h submodules/SortFilterProxyModel/filters/valuefilter.h submodules/SortFilterProxyModel/filters/indexfilter.h submodules/SortFilterProxyModel/filters/regexpfilter.h submodules/SortFilterProxyModel/filters/rangefilter.h submodules/SortFilterProxyModel/filters/expressionfilter.h submodules/SortFilterProxyModel/filters/filtercontainerfilter.h submodules/SortFilterProxyModel/filters/anyoffilter.h submodules/SortFilterProxyModel/filters/alloffilter.h submodules/SortFilterProxyModel/sorters/sorter.h submodules/SortFilterProxyModel/sorters/sortercontainer.h submodules/SortFilterProxyModel/sorters/rolesorter.h submodules/SortFilterProxyModel/sorters/stringsorter.h submodules/SortFilterProxyModel/sorters/expressionsorter.h submodules/SortFilterProxyModel/proxyroles/proxyrole.h submodules/SortFilterProxyModel/proxyroles/proxyrolecontainer.h submodules/SortFilterProxyModel/proxyroles/joinrole.h submodules/SortFilterProxyModel/proxyroles/switchrole.h submodules/SortFilterProxyModel/proxyroles/expressionrole.h submodules/SortFilterProxyModel/proxyroles/singlerole.h submodules/SortFilterProxyModel/proxyroles/regexprole.h submodules/SortFilterProxyModel/sorters/filtersorter.h submodules/SortFilterProxyModel/proxyroles/filterrole.h $(DISTDIR)/ + $(COPY_FILE) --parents src/main.cpp submodules/SortFilterProxyModel/qqmlsortfilterproxymodel.cpp submodules/SortFilterProxyModel/filters/filter.cpp submodules/SortFilterProxyModel/filters/filtercontainer.cpp submodules/SortFilterProxyModel/filters/rolefilter.cpp submodules/SortFilterProxyModel/filters/valuefilter.cpp submodules/SortFilterProxyModel/filters/indexfilter.cpp submodules/SortFilterProxyModel/filters/regexpfilter.cpp submodules/SortFilterProxyModel/filters/rangefilter.cpp submodules/SortFilterProxyModel/filters/expressionfilter.cpp submodules/SortFilterProxyModel/filters/filtercontainerfilter.cpp submodules/SortFilterProxyModel/filters/anyoffilter.cpp submodules/SortFilterProxyModel/filters/alloffilter.cpp submodules/SortFilterProxyModel/filters/filtersqmltypes.cpp submodules/SortFilterProxyModel/sorters/sorter.cpp submodules/SortFilterProxyModel/sorters/sortercontainer.cpp submodules/SortFilterProxyModel/sorters/rolesorter.cpp submodules/SortFilterProxyModel/sorters/stringsorter.cpp submodules/SortFilterProxyModel/sorters/expressionsorter.cpp submodules/SortFilterProxyModel/sorters/sortersqmltypes.cpp submodules/SortFilterProxyModel/proxyroles/proxyrole.cpp submodules/SortFilterProxyModel/proxyroles/proxyrolecontainer.cpp submodules/SortFilterProxyModel/proxyroles/joinrole.cpp submodules/SortFilterProxyModel/proxyroles/switchrole.cpp submodules/SortFilterProxyModel/proxyroles/expressionrole.cpp submodules/SortFilterProxyModel/proxyroles/proxyrolesqmltypes.cpp submodules/SortFilterProxyModel/proxyroles/singlerole.cpp submodules/SortFilterProxyModel/proxyroles/regexprole.cpp submodules/SortFilterProxyModel/sorters/filtersorter.cpp submodules/SortFilterProxyModel/proxyroles/filterrole.cpp $(DISTDIR)/ + + +clean: compiler_clean + -$(DEL_FILE) $(OBJECTS) + -$(DEL_FILE) build/moc build/obj build/rcc src/python/__pycache__ src/python/events/__pycache__ build/resources.qrc build Makefile .qmake.stash src/python/__pycache__/__about__.cpython-36.pyc src/python/__pycache__/__init__.cpython-36.pyc src/python/__pycache__/app.cpython-36.pyc src/python/__pycache__/backend.cpython-36.pyc src/python/__pycache__/html_filter.cpython-36.pyc src/python/__pycache__/matrix_client.cpython-36.pyc src/python/events/__pycache__/__init__.cpython-36.pyc src/python/events/__pycache__/app.cpython-36.pyc src/python/events/__pycache__/event.cpython-36.pyc src/python/events/__pycache__/rooms.cpython-36.pyc src/python/events/__pycache__/rooms_timeline.cpython-36.pyc src/python/events/__pycache__/users.cpython-36.pyc + -$(DEL_FILE) *~ core *.core + + +distclean: clean + -$(DEL_FILE) $(TARGET) + -$(DEL_FILE) .qmake.stash + -$(DEL_FILE) Makefile + + +####### Sub-libraries + +mocclean: compiler_moc_header_clean compiler_moc_objc_header_clean compiler_moc_source_clean + +mocables: compiler_moc_header_make_all compiler_moc_objc_header_make_all compiler_moc_source_make_all + +check: first + +benchmark: first + +compiler_rcc_make_all: +compiler_rcc_clean: +compiler_moc_predefs_make_all: build/moc/moc_predefs.h +compiler_moc_predefs_clean: + -$(DEL_FILE) build/moc/moc_predefs.h +build/moc/moc_predefs.h: /usr/lib/qt5/mkspecs/features/data/dummy.cpp + g++ -pipe -O2 -std=gnu++11 -w -dM -E -o build/moc/moc_predefs.h /usr/lib/qt5/mkspecs/features/data/dummy.cpp + +compiler_moc_header_make_all: build/moc/moc_qqmlsortfilterproxymodel.cpp build/moc/moc_filter.cpp build/moc/moc_rolefilter.cpp build/moc/moc_valuefilter.cpp build/moc/moc_indexfilter.cpp build/moc/moc_regexpfilter.cpp build/moc/moc_rangefilter.cpp build/moc/moc_expressionfilter.cpp build/moc/moc_filtercontainerfilter.cpp build/moc/moc_anyoffilter.cpp build/moc/moc_alloffilter.cpp build/moc/moc_sorter.cpp build/moc/moc_rolesorter.cpp build/moc/moc_stringsorter.cpp build/moc/moc_expressionsorter.cpp build/moc/moc_proxyrole.cpp build/moc/moc_joinrole.cpp build/moc/moc_switchrole.cpp build/moc/moc_expressionrole.cpp build/moc/moc_singlerole.cpp build/moc/moc_regexprole.cpp build/moc/moc_filtersorter.cpp build/moc/moc_filterrole.cpp +compiler_moc_header_clean: + -$(DEL_FILE) build/moc/moc_qqmlsortfilterproxymodel.cpp build/moc/moc_filter.cpp build/moc/moc_rolefilter.cpp build/moc/moc_valuefilter.cpp build/moc/moc_indexfilter.cpp build/moc/moc_regexpfilter.cpp build/moc/moc_rangefilter.cpp build/moc/moc_expressionfilter.cpp build/moc/moc_filtercontainerfilter.cpp build/moc/moc_anyoffilter.cpp build/moc/moc_alloffilter.cpp build/moc/moc_sorter.cpp build/moc/moc_rolesorter.cpp build/moc/moc_stringsorter.cpp build/moc/moc_expressionsorter.cpp build/moc/moc_proxyrole.cpp build/moc/moc_joinrole.cpp build/moc/moc_switchrole.cpp build/moc/moc_expressionrole.cpp build/moc/moc_singlerole.cpp build/moc/moc_regexprole.cpp build/moc/moc_filtersorter.cpp build/moc/moc_filterrole.cpp +build/moc/moc_qqmlsortfilterproxymodel.cpp: submodules/SortFilterProxyModel/filters/filtercontainer.h \ + submodules/SortFilterProxyModel/sorters/sortercontainer.h \ + submodules/SortFilterProxyModel/proxyroles/proxyrolecontainer.h \ + submodules/SortFilterProxyModel/qqmlsortfilterproxymodel.h \ + build/moc/moc_predefs.h \ + /usr/lib/qt5/bin/moc + /usr/lib/qt5/bin/moc $(DEFINES) --include /home/kana/prog/python/harmonyqml/build/moc/moc_predefs.h -I/usr/lib/qt5/mkspecs/linux-g++ -I/home/kana/prog/python/harmonyqml -I/home/kana/prog/python/harmonyqml/submodules/SortFilterProxyModel -I/usr/include/qt5 -I/usr/include/qt5/QtQuick -I/usr/include/qt5/QtGui -I/usr/include/qt5/QtQml -I/usr/include/qt5/QtNetwork -I/usr/include/qt5/QtCore -I/usr/include/c++/9.1.0 -I/usr/include/c++/9.1.0/x86_64-unknown-linux-gnu -I/usr/include/c++/9.1.0/backward -I/usr/lib/gcc/x86_64-unknown-linux-gnu/9.1.0/include -I/usr/local/include -I/usr/lib/gcc/x86_64-unknown-linux-gnu/9.1.0/include-fixed -I/usr/include submodules/SortFilterProxyModel/qqmlsortfilterproxymodel.h -o build/moc/moc_qqmlsortfilterproxymodel.cpp + +build/moc/moc_filter.cpp: submodules/SortFilterProxyModel/filters/filter.h \ + build/moc/moc_predefs.h \ + /usr/lib/qt5/bin/moc + /usr/lib/qt5/bin/moc $(DEFINES) --include /home/kana/prog/python/harmonyqml/build/moc/moc_predefs.h -I/usr/lib/qt5/mkspecs/linux-g++ -I/home/kana/prog/python/harmonyqml -I/home/kana/prog/python/harmonyqml/submodules/SortFilterProxyModel -I/usr/include/qt5 -I/usr/include/qt5/QtQuick -I/usr/include/qt5/QtGui -I/usr/include/qt5/QtQml -I/usr/include/qt5/QtNetwork -I/usr/include/qt5/QtCore -I/usr/include/c++/9.1.0 -I/usr/include/c++/9.1.0/x86_64-unknown-linux-gnu -I/usr/include/c++/9.1.0/backward -I/usr/lib/gcc/x86_64-unknown-linux-gnu/9.1.0/include -I/usr/local/include -I/usr/lib/gcc/x86_64-unknown-linux-gnu/9.1.0/include-fixed -I/usr/include submodules/SortFilterProxyModel/filters/filter.h -o build/moc/moc_filter.cpp + +build/moc/moc_rolefilter.cpp: submodules/SortFilterProxyModel/filters/filter.h \ + submodules/SortFilterProxyModel/filters/rolefilter.h \ + build/moc/moc_predefs.h \ + /usr/lib/qt5/bin/moc + /usr/lib/qt5/bin/moc $(DEFINES) --include /home/kana/prog/python/harmonyqml/build/moc/moc_predefs.h -I/usr/lib/qt5/mkspecs/linux-g++ -I/home/kana/prog/python/harmonyqml -I/home/kana/prog/python/harmonyqml/submodules/SortFilterProxyModel -I/usr/include/qt5 -I/usr/include/qt5/QtQuick -I/usr/include/qt5/QtGui -I/usr/include/qt5/QtQml -I/usr/include/qt5/QtNetwork -I/usr/include/qt5/QtCore -I/usr/include/c++/9.1.0 -I/usr/include/c++/9.1.0/x86_64-unknown-linux-gnu -I/usr/include/c++/9.1.0/backward -I/usr/lib/gcc/x86_64-unknown-linux-gnu/9.1.0/include -I/usr/local/include -I/usr/lib/gcc/x86_64-unknown-linux-gnu/9.1.0/include-fixed -I/usr/include submodules/SortFilterProxyModel/filters/rolefilter.h -o build/moc/moc_rolefilter.cpp + +build/moc/moc_valuefilter.cpp: submodules/SortFilterProxyModel/filters/rolefilter.h \ + submodules/SortFilterProxyModel/filters/filter.h \ + submodules/SortFilterProxyModel/filters/valuefilter.h \ + build/moc/moc_predefs.h \ + /usr/lib/qt5/bin/moc + /usr/lib/qt5/bin/moc $(DEFINES) --include /home/kana/prog/python/harmonyqml/build/moc/moc_predefs.h -I/usr/lib/qt5/mkspecs/linux-g++ -I/home/kana/prog/python/harmonyqml -I/home/kana/prog/python/harmonyqml/submodules/SortFilterProxyModel -I/usr/include/qt5 -I/usr/include/qt5/QtQuick -I/usr/include/qt5/QtGui -I/usr/include/qt5/QtQml -I/usr/include/qt5/QtNetwork -I/usr/include/qt5/QtCore -I/usr/include/c++/9.1.0 -I/usr/include/c++/9.1.0/x86_64-unknown-linux-gnu -I/usr/include/c++/9.1.0/backward -I/usr/lib/gcc/x86_64-unknown-linux-gnu/9.1.0/include -I/usr/local/include -I/usr/lib/gcc/x86_64-unknown-linux-gnu/9.1.0/include-fixed -I/usr/include submodules/SortFilterProxyModel/filters/valuefilter.h -o build/moc/moc_valuefilter.cpp + +build/moc/moc_indexfilter.cpp: submodules/SortFilterProxyModel/filters/filter.h \ + submodules/SortFilterProxyModel/filters/indexfilter.h \ + build/moc/moc_predefs.h \ + /usr/lib/qt5/bin/moc + /usr/lib/qt5/bin/moc $(DEFINES) --include /home/kana/prog/python/harmonyqml/build/moc/moc_predefs.h -I/usr/lib/qt5/mkspecs/linux-g++ -I/home/kana/prog/python/harmonyqml -I/home/kana/prog/python/harmonyqml/submodules/SortFilterProxyModel -I/usr/include/qt5 -I/usr/include/qt5/QtQuick -I/usr/include/qt5/QtGui -I/usr/include/qt5/QtQml -I/usr/include/qt5/QtNetwork -I/usr/include/qt5/QtCore -I/usr/include/c++/9.1.0 -I/usr/include/c++/9.1.0/x86_64-unknown-linux-gnu -I/usr/include/c++/9.1.0/backward -I/usr/lib/gcc/x86_64-unknown-linux-gnu/9.1.0/include -I/usr/local/include -I/usr/lib/gcc/x86_64-unknown-linux-gnu/9.1.0/include-fixed -I/usr/include submodules/SortFilterProxyModel/filters/indexfilter.h -o build/moc/moc_indexfilter.cpp + +build/moc/moc_regexpfilter.cpp: submodules/SortFilterProxyModel/filters/rolefilter.h \ + submodules/SortFilterProxyModel/filters/filter.h \ + submodules/SortFilterProxyModel/filters/regexpfilter.h \ + build/moc/moc_predefs.h \ + /usr/lib/qt5/bin/moc + /usr/lib/qt5/bin/moc $(DEFINES) --include /home/kana/prog/python/harmonyqml/build/moc/moc_predefs.h -I/usr/lib/qt5/mkspecs/linux-g++ -I/home/kana/prog/python/harmonyqml -I/home/kana/prog/python/harmonyqml/submodules/SortFilterProxyModel -I/usr/include/qt5 -I/usr/include/qt5/QtQuick -I/usr/include/qt5/QtGui -I/usr/include/qt5/QtQml -I/usr/include/qt5/QtNetwork -I/usr/include/qt5/QtCore -I/usr/include/c++/9.1.0 -I/usr/include/c++/9.1.0/x86_64-unknown-linux-gnu -I/usr/include/c++/9.1.0/backward -I/usr/lib/gcc/x86_64-unknown-linux-gnu/9.1.0/include -I/usr/local/include -I/usr/lib/gcc/x86_64-unknown-linux-gnu/9.1.0/include-fixed -I/usr/include submodules/SortFilterProxyModel/filters/regexpfilter.h -o build/moc/moc_regexpfilter.cpp + +build/moc/moc_rangefilter.cpp: submodules/SortFilterProxyModel/filters/rolefilter.h \ + submodules/SortFilterProxyModel/filters/filter.h \ + submodules/SortFilterProxyModel/filters/rangefilter.h \ + build/moc/moc_predefs.h \ + /usr/lib/qt5/bin/moc + /usr/lib/qt5/bin/moc $(DEFINES) --include /home/kana/prog/python/harmonyqml/build/moc/moc_predefs.h -I/usr/lib/qt5/mkspecs/linux-g++ -I/home/kana/prog/python/harmonyqml -I/home/kana/prog/python/harmonyqml/submodules/SortFilterProxyModel -I/usr/include/qt5 -I/usr/include/qt5/QtQuick -I/usr/include/qt5/QtGui -I/usr/include/qt5/QtQml -I/usr/include/qt5/QtNetwork -I/usr/include/qt5/QtCore -I/usr/include/c++/9.1.0 -I/usr/include/c++/9.1.0/x86_64-unknown-linux-gnu -I/usr/include/c++/9.1.0/backward -I/usr/lib/gcc/x86_64-unknown-linux-gnu/9.1.0/include -I/usr/local/include -I/usr/lib/gcc/x86_64-unknown-linux-gnu/9.1.0/include-fixed -I/usr/include submodules/SortFilterProxyModel/filters/rangefilter.h -o build/moc/moc_rangefilter.cpp + +build/moc/moc_expressionfilter.cpp: submodules/SortFilterProxyModel/filters/filter.h \ + submodules/SortFilterProxyModel/filters/expressionfilter.h \ + build/moc/moc_predefs.h \ + /usr/lib/qt5/bin/moc + /usr/lib/qt5/bin/moc $(DEFINES) --include /home/kana/prog/python/harmonyqml/build/moc/moc_predefs.h -I/usr/lib/qt5/mkspecs/linux-g++ -I/home/kana/prog/python/harmonyqml -I/home/kana/prog/python/harmonyqml/submodules/SortFilterProxyModel -I/usr/include/qt5 -I/usr/include/qt5/QtQuick -I/usr/include/qt5/QtGui -I/usr/include/qt5/QtQml -I/usr/include/qt5/QtNetwork -I/usr/include/qt5/QtCore -I/usr/include/c++/9.1.0 -I/usr/include/c++/9.1.0/x86_64-unknown-linux-gnu -I/usr/include/c++/9.1.0/backward -I/usr/lib/gcc/x86_64-unknown-linux-gnu/9.1.0/include -I/usr/local/include -I/usr/lib/gcc/x86_64-unknown-linux-gnu/9.1.0/include-fixed -I/usr/include submodules/SortFilterProxyModel/filters/expressionfilter.h -o build/moc/moc_expressionfilter.cpp + +build/moc/moc_filtercontainerfilter.cpp: submodules/SortFilterProxyModel/filters/filter.h \ + submodules/SortFilterProxyModel/filters/filtercontainer.h \ + submodules/SortFilterProxyModel/filters/filtercontainerfilter.h \ + build/moc/moc_predefs.h \ + /usr/lib/qt5/bin/moc + /usr/lib/qt5/bin/moc $(DEFINES) --include /home/kana/prog/python/harmonyqml/build/moc/moc_predefs.h -I/usr/lib/qt5/mkspecs/linux-g++ -I/home/kana/prog/python/harmonyqml -I/home/kana/prog/python/harmonyqml/submodules/SortFilterProxyModel -I/usr/include/qt5 -I/usr/include/qt5/QtQuick -I/usr/include/qt5/QtGui -I/usr/include/qt5/QtQml -I/usr/include/qt5/QtNetwork -I/usr/include/qt5/QtCore -I/usr/include/c++/9.1.0 -I/usr/include/c++/9.1.0/x86_64-unknown-linux-gnu -I/usr/include/c++/9.1.0/backward -I/usr/lib/gcc/x86_64-unknown-linux-gnu/9.1.0/include -I/usr/local/include -I/usr/lib/gcc/x86_64-unknown-linux-gnu/9.1.0/include-fixed -I/usr/include submodules/SortFilterProxyModel/filters/filtercontainerfilter.h -o build/moc/moc_filtercontainerfilter.cpp + +build/moc/moc_anyoffilter.cpp: submodules/SortFilterProxyModel/filters/filtercontainerfilter.h \ + submodules/SortFilterProxyModel/filters/filter.h \ + submodules/SortFilterProxyModel/filters/filtercontainer.h \ + submodules/SortFilterProxyModel/filters/anyoffilter.h \ + build/moc/moc_predefs.h \ + /usr/lib/qt5/bin/moc + /usr/lib/qt5/bin/moc $(DEFINES) --include /home/kana/prog/python/harmonyqml/build/moc/moc_predefs.h -I/usr/lib/qt5/mkspecs/linux-g++ -I/home/kana/prog/python/harmonyqml -I/home/kana/prog/python/harmonyqml/submodules/SortFilterProxyModel -I/usr/include/qt5 -I/usr/include/qt5/QtQuick -I/usr/include/qt5/QtGui -I/usr/include/qt5/QtQml -I/usr/include/qt5/QtNetwork -I/usr/include/qt5/QtCore -I/usr/include/c++/9.1.0 -I/usr/include/c++/9.1.0/x86_64-unknown-linux-gnu -I/usr/include/c++/9.1.0/backward -I/usr/lib/gcc/x86_64-unknown-linux-gnu/9.1.0/include -I/usr/local/include -I/usr/lib/gcc/x86_64-unknown-linux-gnu/9.1.0/include-fixed -I/usr/include submodules/SortFilterProxyModel/filters/anyoffilter.h -o build/moc/moc_anyoffilter.cpp + +build/moc/moc_alloffilter.cpp: submodules/SortFilterProxyModel/filters/filtercontainerfilter.h \ + submodules/SortFilterProxyModel/filters/filter.h \ + submodules/SortFilterProxyModel/filters/filtercontainer.h \ + submodules/SortFilterProxyModel/filters/alloffilter.h \ + build/moc/moc_predefs.h \ + /usr/lib/qt5/bin/moc + /usr/lib/qt5/bin/moc $(DEFINES) --include /home/kana/prog/python/harmonyqml/build/moc/moc_predefs.h -I/usr/lib/qt5/mkspecs/linux-g++ -I/home/kana/prog/python/harmonyqml -I/home/kana/prog/python/harmonyqml/submodules/SortFilterProxyModel -I/usr/include/qt5 -I/usr/include/qt5/QtQuick -I/usr/include/qt5/QtGui -I/usr/include/qt5/QtQml -I/usr/include/qt5/QtNetwork -I/usr/include/qt5/QtCore -I/usr/include/c++/9.1.0 -I/usr/include/c++/9.1.0/x86_64-unknown-linux-gnu -I/usr/include/c++/9.1.0/backward -I/usr/lib/gcc/x86_64-unknown-linux-gnu/9.1.0/include -I/usr/local/include -I/usr/lib/gcc/x86_64-unknown-linux-gnu/9.1.0/include-fixed -I/usr/include submodules/SortFilterProxyModel/filters/alloffilter.h -o build/moc/moc_alloffilter.cpp + +build/moc/moc_sorter.cpp: submodules/SortFilterProxyModel/sorters/sorter.h \ + build/moc/moc_predefs.h \ + /usr/lib/qt5/bin/moc + /usr/lib/qt5/bin/moc $(DEFINES) --include /home/kana/prog/python/harmonyqml/build/moc/moc_predefs.h -I/usr/lib/qt5/mkspecs/linux-g++ -I/home/kana/prog/python/harmonyqml -I/home/kana/prog/python/harmonyqml/submodules/SortFilterProxyModel -I/usr/include/qt5 -I/usr/include/qt5/QtQuick -I/usr/include/qt5/QtGui -I/usr/include/qt5/QtQml -I/usr/include/qt5/QtNetwork -I/usr/include/qt5/QtCore -I/usr/include/c++/9.1.0 -I/usr/include/c++/9.1.0/x86_64-unknown-linux-gnu -I/usr/include/c++/9.1.0/backward -I/usr/lib/gcc/x86_64-unknown-linux-gnu/9.1.0/include -I/usr/local/include -I/usr/lib/gcc/x86_64-unknown-linux-gnu/9.1.0/include-fixed -I/usr/include submodules/SortFilterProxyModel/sorters/sorter.h -o build/moc/moc_sorter.cpp + +build/moc/moc_rolesorter.cpp: submodules/SortFilterProxyModel/sorters/sorter.h \ + submodules/SortFilterProxyModel/sorters/rolesorter.h \ + build/moc/moc_predefs.h \ + /usr/lib/qt5/bin/moc + /usr/lib/qt5/bin/moc $(DEFINES) --include /home/kana/prog/python/harmonyqml/build/moc/moc_predefs.h -I/usr/lib/qt5/mkspecs/linux-g++ -I/home/kana/prog/python/harmonyqml -I/home/kana/prog/python/harmonyqml/submodules/SortFilterProxyModel -I/usr/include/qt5 -I/usr/include/qt5/QtQuick -I/usr/include/qt5/QtGui -I/usr/include/qt5/QtQml -I/usr/include/qt5/QtNetwork -I/usr/include/qt5/QtCore -I/usr/include/c++/9.1.0 -I/usr/include/c++/9.1.0/x86_64-unknown-linux-gnu -I/usr/include/c++/9.1.0/backward -I/usr/lib/gcc/x86_64-unknown-linux-gnu/9.1.0/include -I/usr/local/include -I/usr/lib/gcc/x86_64-unknown-linux-gnu/9.1.0/include-fixed -I/usr/include submodules/SortFilterProxyModel/sorters/rolesorter.h -o build/moc/moc_rolesorter.cpp + +build/moc/moc_stringsorter.cpp: submodules/SortFilterProxyModel/sorters/rolesorter.h \ + submodules/SortFilterProxyModel/sorters/sorter.h \ + submodules/SortFilterProxyModel/sorters/stringsorter.h \ + build/moc/moc_predefs.h \ + /usr/lib/qt5/bin/moc + /usr/lib/qt5/bin/moc $(DEFINES) --include /home/kana/prog/python/harmonyqml/build/moc/moc_predefs.h -I/usr/lib/qt5/mkspecs/linux-g++ -I/home/kana/prog/python/harmonyqml -I/home/kana/prog/python/harmonyqml/submodules/SortFilterProxyModel -I/usr/include/qt5 -I/usr/include/qt5/QtQuick -I/usr/include/qt5/QtGui -I/usr/include/qt5/QtQml -I/usr/include/qt5/QtNetwork -I/usr/include/qt5/QtCore -I/usr/include/c++/9.1.0 -I/usr/include/c++/9.1.0/x86_64-unknown-linux-gnu -I/usr/include/c++/9.1.0/backward -I/usr/lib/gcc/x86_64-unknown-linux-gnu/9.1.0/include -I/usr/local/include -I/usr/lib/gcc/x86_64-unknown-linux-gnu/9.1.0/include-fixed -I/usr/include submodules/SortFilterProxyModel/sorters/stringsorter.h -o build/moc/moc_stringsorter.cpp + +build/moc/moc_expressionsorter.cpp: submodules/SortFilterProxyModel/sorters/sorter.h \ + submodules/SortFilterProxyModel/sorters/expressionsorter.h \ + build/moc/moc_predefs.h \ + /usr/lib/qt5/bin/moc + /usr/lib/qt5/bin/moc $(DEFINES) --include /home/kana/prog/python/harmonyqml/build/moc/moc_predefs.h -I/usr/lib/qt5/mkspecs/linux-g++ -I/home/kana/prog/python/harmonyqml -I/home/kana/prog/python/harmonyqml/submodules/SortFilterProxyModel -I/usr/include/qt5 -I/usr/include/qt5/QtQuick -I/usr/include/qt5/QtGui -I/usr/include/qt5/QtQml -I/usr/include/qt5/QtNetwork -I/usr/include/qt5/QtCore -I/usr/include/c++/9.1.0 -I/usr/include/c++/9.1.0/x86_64-unknown-linux-gnu -I/usr/include/c++/9.1.0/backward -I/usr/lib/gcc/x86_64-unknown-linux-gnu/9.1.0/include -I/usr/local/include -I/usr/lib/gcc/x86_64-unknown-linux-gnu/9.1.0/include-fixed -I/usr/include submodules/SortFilterProxyModel/sorters/expressionsorter.h -o build/moc/moc_expressionsorter.cpp + +build/moc/moc_proxyrole.cpp: submodules/SortFilterProxyModel/proxyroles/proxyrole.h \ + build/moc/moc_predefs.h \ + /usr/lib/qt5/bin/moc + /usr/lib/qt5/bin/moc $(DEFINES) --include /home/kana/prog/python/harmonyqml/build/moc/moc_predefs.h -I/usr/lib/qt5/mkspecs/linux-g++ -I/home/kana/prog/python/harmonyqml -I/home/kana/prog/python/harmonyqml/submodules/SortFilterProxyModel -I/usr/include/qt5 -I/usr/include/qt5/QtQuick -I/usr/include/qt5/QtGui -I/usr/include/qt5/QtQml -I/usr/include/qt5/QtNetwork -I/usr/include/qt5/QtCore -I/usr/include/c++/9.1.0 -I/usr/include/c++/9.1.0/x86_64-unknown-linux-gnu -I/usr/include/c++/9.1.0/backward -I/usr/lib/gcc/x86_64-unknown-linux-gnu/9.1.0/include -I/usr/local/include -I/usr/lib/gcc/x86_64-unknown-linux-gnu/9.1.0/include-fixed -I/usr/include submodules/SortFilterProxyModel/proxyroles/proxyrole.h -o build/moc/moc_proxyrole.cpp + +build/moc/moc_joinrole.cpp: submodules/SortFilterProxyModel/proxyroles/singlerole.h \ + submodules/SortFilterProxyModel/proxyroles/proxyrole.h \ + submodules/SortFilterProxyModel/proxyroles/joinrole.h \ + build/moc/moc_predefs.h \ + /usr/lib/qt5/bin/moc + /usr/lib/qt5/bin/moc $(DEFINES) --include /home/kana/prog/python/harmonyqml/build/moc/moc_predefs.h -I/usr/lib/qt5/mkspecs/linux-g++ -I/home/kana/prog/python/harmonyqml -I/home/kana/prog/python/harmonyqml/submodules/SortFilterProxyModel -I/usr/include/qt5 -I/usr/include/qt5/QtQuick -I/usr/include/qt5/QtGui -I/usr/include/qt5/QtQml -I/usr/include/qt5/QtNetwork -I/usr/include/qt5/QtCore -I/usr/include/c++/9.1.0 -I/usr/include/c++/9.1.0/x86_64-unknown-linux-gnu -I/usr/include/c++/9.1.0/backward -I/usr/lib/gcc/x86_64-unknown-linux-gnu/9.1.0/include -I/usr/local/include -I/usr/lib/gcc/x86_64-unknown-linux-gnu/9.1.0/include-fixed -I/usr/include submodules/SortFilterProxyModel/proxyroles/joinrole.h -o build/moc/moc_joinrole.cpp + +build/moc/moc_switchrole.cpp: submodules/SortFilterProxyModel/proxyroles/singlerole.h \ + submodules/SortFilterProxyModel/proxyroles/proxyrole.h \ + submodules/SortFilterProxyModel/filters/filtercontainer.h \ + submodules/SortFilterProxyModel/proxyroles/switchrole.h \ + build/moc/moc_predefs.h \ + /usr/lib/qt5/bin/moc + /usr/lib/qt5/bin/moc $(DEFINES) --include /home/kana/prog/python/harmonyqml/build/moc/moc_predefs.h -I/usr/lib/qt5/mkspecs/linux-g++ -I/home/kana/prog/python/harmonyqml -I/home/kana/prog/python/harmonyqml/submodules/SortFilterProxyModel -I/usr/include/qt5 -I/usr/include/qt5/QtQuick -I/usr/include/qt5/QtGui -I/usr/include/qt5/QtQml -I/usr/include/qt5/QtNetwork -I/usr/include/qt5/QtCore -I/usr/include/c++/9.1.0 -I/usr/include/c++/9.1.0/x86_64-unknown-linux-gnu -I/usr/include/c++/9.1.0/backward -I/usr/lib/gcc/x86_64-unknown-linux-gnu/9.1.0/include -I/usr/local/include -I/usr/lib/gcc/x86_64-unknown-linux-gnu/9.1.0/include-fixed -I/usr/include submodules/SortFilterProxyModel/proxyroles/switchrole.h -o build/moc/moc_switchrole.cpp + +build/moc/moc_expressionrole.cpp: submodules/SortFilterProxyModel/proxyroles/singlerole.h \ + submodules/SortFilterProxyModel/proxyroles/proxyrole.h \ + submodules/SortFilterProxyModel/proxyroles/expressionrole.h \ + build/moc/moc_predefs.h \ + /usr/lib/qt5/bin/moc + /usr/lib/qt5/bin/moc $(DEFINES) --include /home/kana/prog/python/harmonyqml/build/moc/moc_predefs.h -I/usr/lib/qt5/mkspecs/linux-g++ -I/home/kana/prog/python/harmonyqml -I/home/kana/prog/python/harmonyqml/submodules/SortFilterProxyModel -I/usr/include/qt5 -I/usr/include/qt5/QtQuick -I/usr/include/qt5/QtGui -I/usr/include/qt5/QtQml -I/usr/include/qt5/QtNetwork -I/usr/include/qt5/QtCore -I/usr/include/c++/9.1.0 -I/usr/include/c++/9.1.0/x86_64-unknown-linux-gnu -I/usr/include/c++/9.1.0/backward -I/usr/lib/gcc/x86_64-unknown-linux-gnu/9.1.0/include -I/usr/local/include -I/usr/lib/gcc/x86_64-unknown-linux-gnu/9.1.0/include-fixed -I/usr/include submodules/SortFilterProxyModel/proxyroles/expressionrole.h -o build/moc/moc_expressionrole.cpp + +build/moc/moc_singlerole.cpp: submodules/SortFilterProxyModel/proxyroles/proxyrole.h \ + submodules/SortFilterProxyModel/proxyroles/singlerole.h \ + build/moc/moc_predefs.h \ + /usr/lib/qt5/bin/moc + /usr/lib/qt5/bin/moc $(DEFINES) --include /home/kana/prog/python/harmonyqml/build/moc/moc_predefs.h -I/usr/lib/qt5/mkspecs/linux-g++ -I/home/kana/prog/python/harmonyqml -I/home/kana/prog/python/harmonyqml/submodules/SortFilterProxyModel -I/usr/include/qt5 -I/usr/include/qt5/QtQuick -I/usr/include/qt5/QtGui -I/usr/include/qt5/QtQml -I/usr/include/qt5/QtNetwork -I/usr/include/qt5/QtCore -I/usr/include/c++/9.1.0 -I/usr/include/c++/9.1.0/x86_64-unknown-linux-gnu -I/usr/include/c++/9.1.0/backward -I/usr/lib/gcc/x86_64-unknown-linux-gnu/9.1.0/include -I/usr/local/include -I/usr/lib/gcc/x86_64-unknown-linux-gnu/9.1.0/include-fixed -I/usr/include submodules/SortFilterProxyModel/proxyroles/singlerole.h -o build/moc/moc_singlerole.cpp + +build/moc/moc_regexprole.cpp: submodules/SortFilterProxyModel/proxyroles/proxyrole.h \ + submodules/SortFilterProxyModel/proxyroles/regexprole.h \ + build/moc/moc_predefs.h \ + /usr/lib/qt5/bin/moc + /usr/lib/qt5/bin/moc $(DEFINES) --include /home/kana/prog/python/harmonyqml/build/moc/moc_predefs.h -I/usr/lib/qt5/mkspecs/linux-g++ -I/home/kana/prog/python/harmonyqml -I/home/kana/prog/python/harmonyqml/submodules/SortFilterProxyModel -I/usr/include/qt5 -I/usr/include/qt5/QtQuick -I/usr/include/qt5/QtGui -I/usr/include/qt5/QtQml -I/usr/include/qt5/QtNetwork -I/usr/include/qt5/QtCore -I/usr/include/c++/9.1.0 -I/usr/include/c++/9.1.0/x86_64-unknown-linux-gnu -I/usr/include/c++/9.1.0/backward -I/usr/lib/gcc/x86_64-unknown-linux-gnu/9.1.0/include -I/usr/local/include -I/usr/lib/gcc/x86_64-unknown-linux-gnu/9.1.0/include-fixed -I/usr/include submodules/SortFilterProxyModel/proxyroles/regexprole.h -o build/moc/moc_regexprole.cpp + +build/moc/moc_filtersorter.cpp: submodules/SortFilterProxyModel/sorters/sorter.h \ + submodules/SortFilterProxyModel/filters/filtercontainer.h \ + submodules/SortFilterProxyModel/sorters/filtersorter.h \ + build/moc/moc_predefs.h \ + /usr/lib/qt5/bin/moc + /usr/lib/qt5/bin/moc $(DEFINES) --include /home/kana/prog/python/harmonyqml/build/moc/moc_predefs.h -I/usr/lib/qt5/mkspecs/linux-g++ -I/home/kana/prog/python/harmonyqml -I/home/kana/prog/python/harmonyqml/submodules/SortFilterProxyModel -I/usr/include/qt5 -I/usr/include/qt5/QtQuick -I/usr/include/qt5/QtGui -I/usr/include/qt5/QtQml -I/usr/include/qt5/QtNetwork -I/usr/include/qt5/QtCore -I/usr/include/c++/9.1.0 -I/usr/include/c++/9.1.0/x86_64-unknown-linux-gnu -I/usr/include/c++/9.1.0/backward -I/usr/lib/gcc/x86_64-unknown-linux-gnu/9.1.0/include -I/usr/local/include -I/usr/lib/gcc/x86_64-unknown-linux-gnu/9.1.0/include-fixed -I/usr/include submodules/SortFilterProxyModel/sorters/filtersorter.h -o build/moc/moc_filtersorter.cpp + +build/moc/moc_filterrole.cpp: submodules/SortFilterProxyModel/proxyroles/singlerole.h \ + submodules/SortFilterProxyModel/proxyroles/proxyrole.h \ + submodules/SortFilterProxyModel/filters/filtercontainer.h \ + submodules/SortFilterProxyModel/proxyroles/filterrole.h \ + build/moc/moc_predefs.h \ + /usr/lib/qt5/bin/moc + /usr/lib/qt5/bin/moc $(DEFINES) --include /home/kana/prog/python/harmonyqml/build/moc/moc_predefs.h -I/usr/lib/qt5/mkspecs/linux-g++ -I/home/kana/prog/python/harmonyqml -I/home/kana/prog/python/harmonyqml/submodules/SortFilterProxyModel -I/usr/include/qt5 -I/usr/include/qt5/QtQuick -I/usr/include/qt5/QtGui -I/usr/include/qt5/QtQml -I/usr/include/qt5/QtNetwork -I/usr/include/qt5/QtCore -I/usr/include/c++/9.1.0 -I/usr/include/c++/9.1.0/x86_64-unknown-linux-gnu -I/usr/include/c++/9.1.0/backward -I/usr/lib/gcc/x86_64-unknown-linux-gnu/9.1.0/include -I/usr/local/include -I/usr/lib/gcc/x86_64-unknown-linux-gnu/9.1.0/include-fixed -I/usr/include submodules/SortFilterProxyModel/proxyroles/filterrole.h -o build/moc/moc_filterrole.cpp + +compiler_moc_objc_header_make_all: +compiler_moc_objc_header_clean: +compiler_moc_source_make_all: +compiler_moc_source_clean: +compiler_yacc_decl_make_all: +compiler_yacc_decl_clean: +compiler_yacc_impl_make_all: +compiler_yacc_impl_clean: +compiler_lex_make_all: +compiler_lex_clean: +compiler_clean: compiler_moc_predefs_clean compiler_moc_header_clean + +####### Compile + +build/obj/main.o: src/main.cpp + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/main.o src/main.cpp + +build/obj/qqmlsortfilterproxymodel.o: submodules/SortFilterProxyModel/qqmlsortfilterproxymodel.cpp submodules/SortFilterProxyModel/qqmlsortfilterproxymodel.h \ + submodules/SortFilterProxyModel/filters/filtercontainer.h \ + submodules/SortFilterProxyModel/sorters/sortercontainer.h \ + submodules/SortFilterProxyModel/proxyroles/proxyrolecontainer.h \ + submodules/SortFilterProxyModel/filters/filter.h \ + submodules/SortFilterProxyModel/sorters/sorter.h \ + submodules/SortFilterProxyModel/proxyroles/proxyrole.h + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/qqmlsortfilterproxymodel.o submodules/SortFilterProxyModel/qqmlsortfilterproxymodel.cpp + +build/obj/filter.o: submodules/SortFilterProxyModel/filters/filter.cpp submodules/SortFilterProxyModel/filters/filter.h \ + submodules/SortFilterProxyModel/qqmlsortfilterproxymodel.h \ + submodules/SortFilterProxyModel/filters/filtercontainer.h \ + submodules/SortFilterProxyModel/sorters/sortercontainer.h \ + submodules/SortFilterProxyModel/proxyroles/proxyrolecontainer.h + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/filter.o submodules/SortFilterProxyModel/filters/filter.cpp + +build/obj/filtercontainer.o: submodules/SortFilterProxyModel/filters/filtercontainer.cpp submodules/SortFilterProxyModel/filters/filtercontainer.h + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/filtercontainer.o submodules/SortFilterProxyModel/filters/filtercontainer.cpp + +build/obj/rolefilter.o: submodules/SortFilterProxyModel/filters/rolefilter.cpp submodules/SortFilterProxyModel/filters/rolefilter.h \ + submodules/SortFilterProxyModel/filters/filter.h \ + submodules/SortFilterProxyModel/qqmlsortfilterproxymodel.h \ + submodules/SortFilterProxyModel/filters/filtercontainer.h \ + submodules/SortFilterProxyModel/sorters/sortercontainer.h \ + submodules/SortFilterProxyModel/proxyroles/proxyrolecontainer.h + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/rolefilter.o submodules/SortFilterProxyModel/filters/rolefilter.cpp + +build/obj/valuefilter.o: submodules/SortFilterProxyModel/filters/valuefilter.cpp submodules/SortFilterProxyModel/filters/valuefilter.h \ + submodules/SortFilterProxyModel/filters/rolefilter.h \ + submodules/SortFilterProxyModel/filters/filter.h + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/valuefilter.o submodules/SortFilterProxyModel/filters/valuefilter.cpp + +build/obj/indexfilter.o: submodules/SortFilterProxyModel/filters/indexfilter.cpp submodules/SortFilterProxyModel/filters/indexfilter.h \ + submodules/SortFilterProxyModel/filters/filter.h \ + submodules/SortFilterProxyModel/qqmlsortfilterproxymodel.h \ + submodules/SortFilterProxyModel/filters/filtercontainer.h \ + submodules/SortFilterProxyModel/sorters/sortercontainer.h \ + submodules/SortFilterProxyModel/proxyroles/proxyrolecontainer.h + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/indexfilter.o submodules/SortFilterProxyModel/filters/indexfilter.cpp + +build/obj/regexpfilter.o: submodules/SortFilterProxyModel/filters/regexpfilter.cpp submodules/SortFilterProxyModel/filters/regexpfilter.h \ + submodules/SortFilterProxyModel/filters/rolefilter.h \ + submodules/SortFilterProxyModel/filters/filter.h + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/regexpfilter.o submodules/SortFilterProxyModel/filters/regexpfilter.cpp + +build/obj/rangefilter.o: submodules/SortFilterProxyModel/filters/rangefilter.cpp submodules/SortFilterProxyModel/filters/rangefilter.h \ + submodules/SortFilterProxyModel/filters/rolefilter.h \ + submodules/SortFilterProxyModel/filters/filter.h + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/rangefilter.o submodules/SortFilterProxyModel/filters/rangefilter.cpp + +build/obj/expressionfilter.o: submodules/SortFilterProxyModel/filters/expressionfilter.cpp submodules/SortFilterProxyModel/filters/expressionfilter.h \ + submodules/SortFilterProxyModel/filters/filter.h \ + submodules/SortFilterProxyModel/qqmlsortfilterproxymodel.h \ + submodules/SortFilterProxyModel/filters/filtercontainer.h \ + submodules/SortFilterProxyModel/sorters/sortercontainer.h \ + submodules/SortFilterProxyModel/proxyroles/proxyrolecontainer.h + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/expressionfilter.o submodules/SortFilterProxyModel/filters/expressionfilter.cpp + +build/obj/filtercontainerfilter.o: submodules/SortFilterProxyModel/filters/filtercontainerfilter.cpp submodules/SortFilterProxyModel/filters/filtercontainerfilter.h \ + submodules/SortFilterProxyModel/filters/filter.h \ + submodules/SortFilterProxyModel/filters/filtercontainer.h + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/filtercontainerfilter.o submodules/SortFilterProxyModel/filters/filtercontainerfilter.cpp + +build/obj/anyoffilter.o: submodules/SortFilterProxyModel/filters/anyoffilter.cpp submodules/SortFilterProxyModel/filters/anyoffilter.h \ + submodules/SortFilterProxyModel/filters/filtercontainerfilter.h \ + submodules/SortFilterProxyModel/filters/filter.h \ + submodules/SortFilterProxyModel/filters/filtercontainer.h + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/anyoffilter.o submodules/SortFilterProxyModel/filters/anyoffilter.cpp + +build/obj/alloffilter.o: submodules/SortFilterProxyModel/filters/alloffilter.cpp submodules/SortFilterProxyModel/filters/alloffilter.h \ + submodules/SortFilterProxyModel/filters/filtercontainerfilter.h \ + submodules/SortFilterProxyModel/filters/filter.h \ + submodules/SortFilterProxyModel/filters/filtercontainer.h + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/alloffilter.o submodules/SortFilterProxyModel/filters/alloffilter.cpp + +build/obj/filtersqmltypes.o: submodules/SortFilterProxyModel/filters/filtersqmltypes.cpp submodules/SortFilterProxyModel/filters/filter.h \ + submodules/SortFilterProxyModel/filters/valuefilter.h \ + submodules/SortFilterProxyModel/filters/rolefilter.h \ + submodules/SortFilterProxyModel/filters/indexfilter.h \ + submodules/SortFilterProxyModel/filters/regexpfilter.h \ + submodules/SortFilterProxyModel/filters/rangefilter.h \ + submodules/SortFilterProxyModel/filters/expressionfilter.h \ + submodules/SortFilterProxyModel/filters/anyoffilter.h \ + submodules/SortFilterProxyModel/filters/filtercontainerfilter.h \ + submodules/SortFilterProxyModel/filters/filtercontainer.h \ + submodules/SortFilterProxyModel/filters/alloffilter.h + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/filtersqmltypes.o submodules/SortFilterProxyModel/filters/filtersqmltypes.cpp + +build/obj/sorter.o: submodules/SortFilterProxyModel/sorters/sorter.cpp submodules/SortFilterProxyModel/sorters/sorter.h \ + submodules/SortFilterProxyModel/qqmlsortfilterproxymodel.h \ + submodules/SortFilterProxyModel/filters/filtercontainer.h \ + submodules/SortFilterProxyModel/sorters/sortercontainer.h \ + submodules/SortFilterProxyModel/proxyroles/proxyrolecontainer.h + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/sorter.o submodules/SortFilterProxyModel/sorters/sorter.cpp + +build/obj/sortercontainer.o: submodules/SortFilterProxyModel/sorters/sortercontainer.cpp submodules/SortFilterProxyModel/sorters/sortercontainer.h + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/sortercontainer.o submodules/SortFilterProxyModel/sorters/sortercontainer.cpp + +build/obj/rolesorter.o: submodules/SortFilterProxyModel/sorters/rolesorter.cpp submodules/SortFilterProxyModel/sorters/rolesorter.h \ + submodules/SortFilterProxyModel/sorters/sorter.h \ + submodules/SortFilterProxyModel/qqmlsortfilterproxymodel.h \ + submodules/SortFilterProxyModel/filters/filtercontainer.h \ + submodules/SortFilterProxyModel/sorters/sortercontainer.h \ + submodules/SortFilterProxyModel/proxyroles/proxyrolecontainer.h + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/rolesorter.o submodules/SortFilterProxyModel/sorters/rolesorter.cpp + +build/obj/stringsorter.o: submodules/SortFilterProxyModel/sorters/stringsorter.cpp submodules/SortFilterProxyModel/sorters/stringsorter.h \ + submodules/SortFilterProxyModel/sorters/rolesorter.h \ + submodules/SortFilterProxyModel/sorters/sorter.h + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/stringsorter.o submodules/SortFilterProxyModel/sorters/stringsorter.cpp + +build/obj/expressionsorter.o: submodules/SortFilterProxyModel/sorters/expressionsorter.cpp submodules/SortFilterProxyModel/sorters/expressionsorter.h \ + submodules/SortFilterProxyModel/sorters/sorter.h \ + submodules/SortFilterProxyModel/qqmlsortfilterproxymodel.h \ + submodules/SortFilterProxyModel/filters/filtercontainer.h \ + submodules/SortFilterProxyModel/sorters/sortercontainer.h \ + submodules/SortFilterProxyModel/proxyroles/proxyrolecontainer.h + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/expressionsorter.o submodules/SortFilterProxyModel/sorters/expressionsorter.cpp + +build/obj/sortersqmltypes.o: submodules/SortFilterProxyModel/sorters/sortersqmltypes.cpp submodules/SortFilterProxyModel/sorters/sorter.h \ + submodules/SortFilterProxyModel/sorters/rolesorter.h \ + submodules/SortFilterProxyModel/sorters/stringsorter.h \ + submodules/SortFilterProxyModel/sorters/filtersorter.h \ + submodules/SortFilterProxyModel/filters/filtercontainer.h \ + submodules/SortFilterProxyModel/sorters/expressionsorter.h + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/sortersqmltypes.o submodules/SortFilterProxyModel/sorters/sortersqmltypes.cpp + +build/obj/proxyrole.o: submodules/SortFilterProxyModel/proxyroles/proxyrole.cpp submodules/SortFilterProxyModel/proxyroles/proxyrole.h \ + submodules/SortFilterProxyModel/filters/filter.h \ + submodules/SortFilterProxyModel/qqmlsortfilterproxymodel.h \ + submodules/SortFilterProxyModel/filters/filtercontainer.h \ + submodules/SortFilterProxyModel/sorters/sortercontainer.h \ + submodules/SortFilterProxyModel/proxyroles/proxyrolecontainer.h + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/proxyrole.o submodules/SortFilterProxyModel/proxyroles/proxyrole.cpp + +build/obj/proxyrolecontainer.o: submodules/SortFilterProxyModel/proxyroles/proxyrolecontainer.cpp submodules/SortFilterProxyModel/proxyroles/proxyrolecontainer.h + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/proxyrolecontainer.o submodules/SortFilterProxyModel/proxyroles/proxyrolecontainer.cpp + +build/obj/joinrole.o: submodules/SortFilterProxyModel/proxyroles/joinrole.cpp submodules/SortFilterProxyModel/proxyroles/joinrole.h \ + submodules/SortFilterProxyModel/proxyroles/singlerole.h \ + submodules/SortFilterProxyModel/proxyroles/proxyrole.h \ + submodules/SortFilterProxyModel/qqmlsortfilterproxymodel.h \ + submodules/SortFilterProxyModel/filters/filtercontainer.h \ + submodules/SortFilterProxyModel/sorters/sortercontainer.h \ + submodules/SortFilterProxyModel/proxyroles/proxyrolecontainer.h + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/joinrole.o submodules/SortFilterProxyModel/proxyroles/joinrole.cpp + +build/obj/switchrole.o: submodules/SortFilterProxyModel/proxyroles/switchrole.cpp submodules/SortFilterProxyModel/proxyroles/switchrole.h \ + submodules/SortFilterProxyModel/proxyroles/singlerole.h \ + submodules/SortFilterProxyModel/proxyroles/proxyrole.h \ + submodules/SortFilterProxyModel/filters/filtercontainer.h \ + submodules/SortFilterProxyModel/qqmlsortfilterproxymodel.h \ + submodules/SortFilterProxyModel/sorters/sortercontainer.h \ + submodules/SortFilterProxyModel/proxyroles/proxyrolecontainer.h \ + submodules/SortFilterProxyModel/filters/filter.h + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/switchrole.o submodules/SortFilterProxyModel/proxyroles/switchrole.cpp + +build/obj/expressionrole.o: submodules/SortFilterProxyModel/proxyroles/expressionrole.cpp submodules/SortFilterProxyModel/proxyroles/expressionrole.h \ + submodules/SortFilterProxyModel/proxyroles/singlerole.h \ + submodules/SortFilterProxyModel/proxyroles/proxyrole.h \ + submodules/SortFilterProxyModel/qqmlsortfilterproxymodel.h \ + submodules/SortFilterProxyModel/filters/filtercontainer.h \ + submodules/SortFilterProxyModel/sorters/sortercontainer.h \ + submodules/SortFilterProxyModel/proxyroles/proxyrolecontainer.h + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/expressionrole.o submodules/SortFilterProxyModel/proxyroles/expressionrole.cpp + +build/obj/proxyrolesqmltypes.o: submodules/SortFilterProxyModel/proxyroles/proxyrolesqmltypes.cpp submodules/SortFilterProxyModel/proxyroles/proxyrole.h \ + submodules/SortFilterProxyModel/proxyroles/joinrole.h \ + submodules/SortFilterProxyModel/proxyroles/singlerole.h \ + submodules/SortFilterProxyModel/proxyroles/switchrole.h \ + submodules/SortFilterProxyModel/filters/filtercontainer.h \ + submodules/SortFilterProxyModel/proxyroles/expressionrole.h \ + submodules/SortFilterProxyModel/proxyroles/regexprole.h \ + submodules/SortFilterProxyModel/proxyroles/filterrole.h + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/proxyrolesqmltypes.o submodules/SortFilterProxyModel/proxyroles/proxyrolesqmltypes.cpp + +build/obj/singlerole.o: submodules/SortFilterProxyModel/proxyroles/singlerole.cpp submodules/SortFilterProxyModel/proxyroles/singlerole.h \ + submodules/SortFilterProxyModel/proxyroles/proxyrole.h + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/singlerole.o submodules/SortFilterProxyModel/proxyroles/singlerole.cpp + +build/obj/regexprole.o: submodules/SortFilterProxyModel/proxyroles/regexprole.cpp submodules/SortFilterProxyModel/proxyroles/regexprole.h \ + submodules/SortFilterProxyModel/proxyroles/proxyrole.h \ + submodules/SortFilterProxyModel/qqmlsortfilterproxymodel.h \ + submodules/SortFilterProxyModel/filters/filtercontainer.h \ + submodules/SortFilterProxyModel/sorters/sortercontainer.h \ + submodules/SortFilterProxyModel/proxyroles/proxyrolecontainer.h + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/regexprole.o submodules/SortFilterProxyModel/proxyroles/regexprole.cpp + +build/obj/filtersorter.o: submodules/SortFilterProxyModel/sorters/filtersorter.cpp submodules/SortFilterProxyModel/sorters/filtersorter.h \ + submodules/SortFilterProxyModel/sorters/sorter.h \ + submodules/SortFilterProxyModel/filters/filtercontainer.h \ + submodules/SortFilterProxyModel/filters/filter.h + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/filtersorter.o submodules/SortFilterProxyModel/sorters/filtersorter.cpp + +build/obj/filterrole.o: submodules/SortFilterProxyModel/proxyroles/filterrole.cpp submodules/SortFilterProxyModel/proxyroles/filterrole.h \ + submodules/SortFilterProxyModel/proxyroles/singlerole.h \ + submodules/SortFilterProxyModel/proxyroles/proxyrole.h \ + submodules/SortFilterProxyModel/filters/filtercontainer.h \ + submodules/SortFilterProxyModel/filters/filter.h + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/filterrole.o submodules/SortFilterProxyModel/proxyroles/filterrole.cpp + +build/obj/moc_qqmlsortfilterproxymodel.o: build/moc/moc_qqmlsortfilterproxymodel.cpp + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/moc_qqmlsortfilterproxymodel.o build/moc/moc_qqmlsortfilterproxymodel.cpp + +build/obj/moc_filter.o: build/moc/moc_filter.cpp + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/moc_filter.o build/moc/moc_filter.cpp + +build/obj/moc_rolefilter.o: build/moc/moc_rolefilter.cpp + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/moc_rolefilter.o build/moc/moc_rolefilter.cpp + +build/obj/moc_valuefilter.o: build/moc/moc_valuefilter.cpp + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/moc_valuefilter.o build/moc/moc_valuefilter.cpp + +build/obj/moc_indexfilter.o: build/moc/moc_indexfilter.cpp + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/moc_indexfilter.o build/moc/moc_indexfilter.cpp + +build/obj/moc_regexpfilter.o: build/moc/moc_regexpfilter.cpp + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/moc_regexpfilter.o build/moc/moc_regexpfilter.cpp + +build/obj/moc_rangefilter.o: build/moc/moc_rangefilter.cpp + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/moc_rangefilter.o build/moc/moc_rangefilter.cpp + +build/obj/moc_expressionfilter.o: build/moc/moc_expressionfilter.cpp + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/moc_expressionfilter.o build/moc/moc_expressionfilter.cpp + +build/obj/moc_filtercontainerfilter.o: build/moc/moc_filtercontainerfilter.cpp + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/moc_filtercontainerfilter.o build/moc/moc_filtercontainerfilter.cpp + +build/obj/moc_anyoffilter.o: build/moc/moc_anyoffilter.cpp + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/moc_anyoffilter.o build/moc/moc_anyoffilter.cpp + +build/obj/moc_alloffilter.o: build/moc/moc_alloffilter.cpp + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/moc_alloffilter.o build/moc/moc_alloffilter.cpp + +build/obj/moc_sorter.o: build/moc/moc_sorter.cpp + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/moc_sorter.o build/moc/moc_sorter.cpp + +build/obj/moc_rolesorter.o: build/moc/moc_rolesorter.cpp + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/moc_rolesorter.o build/moc/moc_rolesorter.cpp + +build/obj/moc_stringsorter.o: build/moc/moc_stringsorter.cpp + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/moc_stringsorter.o build/moc/moc_stringsorter.cpp + +build/obj/moc_expressionsorter.o: build/moc/moc_expressionsorter.cpp + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/moc_expressionsorter.o build/moc/moc_expressionsorter.cpp + +build/obj/moc_proxyrole.o: build/moc/moc_proxyrole.cpp + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/moc_proxyrole.o build/moc/moc_proxyrole.cpp + +build/obj/moc_joinrole.o: build/moc/moc_joinrole.cpp + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/moc_joinrole.o build/moc/moc_joinrole.cpp + +build/obj/moc_switchrole.o: build/moc/moc_switchrole.cpp + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/moc_switchrole.o build/moc/moc_switchrole.cpp + +build/obj/moc_expressionrole.o: build/moc/moc_expressionrole.cpp + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/moc_expressionrole.o build/moc/moc_expressionrole.cpp + +build/obj/moc_singlerole.o: build/moc/moc_singlerole.cpp + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/moc_singlerole.o build/moc/moc_singlerole.cpp + +build/obj/moc_regexprole.o: build/moc/moc_regexprole.cpp + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/moc_regexprole.o build/moc/moc_regexprole.cpp + +build/obj/moc_filtersorter.o: build/moc/moc_filtersorter.cpp + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/moc_filtersorter.o build/moc/moc_filtersorter.cpp + +build/obj/moc_filterrole.o: build/moc/moc_filterrole.cpp + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o build/obj/moc_filterrole.o build/moc/moc_filterrole.cpp + +####### Install + +install: FORCE + +uninstall: FORCE + +FORCE: -test: - @echo - @echo pycycle ${LINE} - @echo - - ${PYCYLE} --source ${PKG_DIR} ${PYCYLE_FLAGS} - @echo - @echo mypy ${LINE} - @echo - - ${MYPY} ${PKG_DIR} ${MYPY_FLAGS} - @echo - @echo vulture ${LINE} - @echo - - ${VULTURE} ${PKG_DIR} ${VULTURE_FLAGS} - @echo - @echo bandit ${LINE} - @echo - - ${BANDIT} ${PKG_DIR} --recursive ${BANDIT_FLAGS} - @echo - @echo pylint ${LINE} - @echo - - ${PYLINT} ${PYLINT_FLAGS} ${PKG_DIR} - @echo - @echo cloc ${LINE} - @echo - - ${CLOC} ${CLOC_FLAGS} ${PKG_DIR} diff --git a/README.md b/README.md index e69de29b..bdcd9386 100644 --- a/README.md +++ b/README.md @@ -0,0 +1,16 @@ +# harmonyqml + +## Dependencies setup + +### [pyotherside](https://github.com/thp/pyotherside) + + git clone https://github.com/thp/pyotherside + cd pyotherside + qmake + make + sudo make install + +After this, verify the permissions of the installed plugin files. + + sudo chmod 644 /usr/lib/qt5/qml/io/thp/pyotherside/* + sudo chmod 755 /usr/lib/qt5/qml/io/thp/pyotherside/*.so diff --git a/harmonyqml b/harmonyqml new file mode 100755 index 0000000000000000000000000000000000000000..91eee64648580606be3d4fe99d55e5dcec2ca3da GIT binary patch literal 416776 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ᆔ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%0Asu%krVSCDg1 z)6Fk%6#@%=9Q}b{)a2*DgFR=gJ4}4eaLOYpXGrIPViythkfs3AkWT_?6#Igs7$tp4 zp!g75&e)cVY6(itmz4yr9dWBK5=I=DZ;@j?(R3AP+k z2q5(b{<5IB`V}}~fU*+E)e>NP!5Sg4$Mxc9CMbv?LSQ@CUu?<*^#?pblT_fID|})| zazA)d8!|)Ev-AJ|mpac8^Aw1m#29>gOH?=@vsf>uJOzao*uNDLDD&Fj z`4_<*|NpeQ|ReNExUt-|eH~@X`uwRRxM^pkeDxFl8^RLF*(jOoQa!7u`^05}+if z@bW%*<1f0~Ag#X_@ldspHs8yMptarI=r$|7uz)Fhc?rDY6zYwepT!{IoSiEEh@5Ds6 z4^o!CDBTKi8>ET*vK_oKA4Ba6KbVm(e_@SNsLkpyWuP#&c$p2_?|~)U7+}g?o&&oL z-KWqPySW7#ARyBeUV=6Tqb5O6O(5}N6HM955b(xlbkiVi0~N~>FWR;sdlzJ`#mifu zMe`V833Wp#%y5ueg_qi38!*F152{SzeymB zA@_K!P&9yQLW`H%z&=8c0jLd}C>ma>g3A>Q-@kaY3FIS?d#ymbMp1kOibdqvmu*nB zkcctQ zNQ3;q@#4=$`XvqmVQ~-y$s!+91b1k1@iwopb^koCYZxF*l zF=+9!3!E}=*l-xC0cyiUtTrIW_9PSyAR8QBvVp@9J?%lu#KaAdsDYM=q2RI|-8IlK zH-#Dw?)E#ptN<-U!%Rh>z?68w304bk5xJ-+yxfk}Txk5Qp7 zDgONb{}+$fLe_fy*a@NULForj`W2Wy{_@LC(27#T`t)%4Vyxyj6&{^7DjuDn1*@GQ zpv8qq`*$#v@k2CcsWFTLumQE>pRqEbMtqH=((qS_{bxr#~-zKV(mG>?sC9TjM~ zY5;gS6KL5KVjYzOf6GMhSPAGL3TaRy2D}Layr}9wcxMCF6;+C$DVR>siYiIOdPt;o zRiMRMkabn=ATzsVR6s?KhflXMXps%r9c`eMN!>9j0I?UoJ&)e)fm`0GIFKLixB@U>Kx z(6v+wFZ@AMC6+lV4*ae8sB5XFg61-~_nvYbV zETRI3W9PM(rT_l_p8)YJxcwfu=Kuef@zC{C5P#dP1{D#?prvcDrBf;%oyQ=Og5ddT z@X{%tZe^6!Q=kZKJy4Pe@;(Q2)s(MCw~UHU=XbDXpHAZ!g5Wlp@=I>eqD9z#1Ms@3 z)rj>`p5S$A|6Zi5`~Uyte1teC(tNrVJVA-YqxCj_ixz0Urn?$C3lxhwpW+6R?5$RK zaTi=2WpntpzU6Om;07%gtc7aXgsNq_C@9I)D!f>=5mdIjf>%|6`iT53H$a`(ZrGZr zZWk2;90O#fs7pwakd}~u3q=D^v8(Z-7g~pC zfZF^9;NlTw2?@9gG=R8VF&ffS2iGA6APpKQL&s2MzoH;rS%?ZOL&qMd3o%TQ7Ggks z_#Iqc!+eM`%mlS$Dw-uo17sR6D!`JUP=^g2^MQ*)*r<&s>Y4;I@MIlifK1~>HP~*j zX7E@IXh;DzRb_!XXRQhi7OWee%Wp@b1`mqM_kktBmV<}(N+Lk*EXbOunW*aw z+Q91!V6Hw2E{DJxA>%JxFNzRmK?YoSUc^TtmBZjZHrN*a782$|I9|M54oTD;utd%A z!VPLY2aZH74O*0fNYoslMJdpL(*PxEju$Lo6QB)K4IGJj8)^_N2G^#CaG)e=4Tv(;2uQ3!RA5Qe z(?JC~!iO!O0v*+dN}vWuH_V49i5hCjfpAnykdg++i^X6`u&1DrhB_be1a)b`Mev#e zP}sPraJ*Qy1{P(QqrRr7E?2^Ic?MWFK9{qB9S2SJ@PS6~d z188jb0P#gT$BV~HV2*>1Qggg;K)4rNbf7PHl}3#s4saBK1_eQ>v=cNk_zzrPz(N{F zE;xZYoxD{D_AIGQCW1(g+85)|sN)-wl65!(ogXG9R^f#VsLt!%+|gEeCm z1|q0&!-yF-{}+Q|7oW@L`k@97ipv|ol3>fhO{9__L=jtx>S|D8MKoXA!S;eR!ircE zgjtaM$M!;1>QCw{T zb2TjealLrx12+p2ZLBZOfrX$U3MyYgfd?@?4s}l48$2got?=UZLQrskgAr7|!h*0E zRe1tfIVf9zf^a!l4>(=HCR{_nHbaEKg(B+16vdV3!ie3g@|060xG)UNvs{L54^AdybcXHiM>Mg{&i3_0WOZ=Nz8Krp(OU) z3r`X|X<#MK~l3 z)nsR|$<+!k-p>QYCoG9A1Z##QF^(6LJwXjVM0*c(ej}_=fUmu$Jp;35@Yr@+pK1&lUW4@$t?@W2R|qhKLOz&Ifs z!i$<}f5Bqt+Fay-=>Thn1PtqoDi3%wiN9qp19Gkt0{IKkRQeBUB7<^W`&@WXlpxvu z7S;A!;5<{U@FD`mb}kg#|G2|#FL8#&2Y*WpD5)WA_5>9MAe(u?Hp3ce``y8=1s5W0 zFE+X}Fib#M|KS4~Qhy;i7rg!h!s(g*|NqORSD>{X;BjH-xa!Li_>Qw|&JaKM^GF37#K9>7i7D#P5M;jZtdWM3DGQ@Ju(P z>PD`1T|km1n1<B@JS~Pk zC8hD=G)&pc72stB=u=W0FIIw8fTqH$z@9=^0UZr$0xJXi%tuAzyD9(wzjOpI!axyM1BrvKM*^i#q$uJ8iN6G^$Kk3slOdtN0ctI1yqpgX zF-%t-g(-V^8N74`Q^jJqifHfw(Kzg@fhmL7cLwZ7Ow&SP%D|V3fZ8YsUwMFsR*b+AoKf7IH0l5Um+yW-vJ=9$FT6nF^TCUEP}CcN#Fye& zo*@dh4&-jlpCA*F-Hp^%d^Zsk3gCu~=L571AVQOD?f^#a0D_KCUvp_zzc$tB9fd|KnR;XHzm!H9D z6Wym!x5dGffzpr0ORv}e|G(hsg)C_3nF*mw(C9ia|M<)HnV|KYpkt*$XQp{}{&NiV z?X44V3;`Ye>jCQWcY-f*K{{B*^@QPp7q@yr&5!>tjKFrYI;o0eC;o0ft;c@&x!ekc)kK?T`{{8+Iv&=en>7k78dl-iIStf8^5|>@-Sg>jy!8jv4KG$q{Quwc z_z}pV&If%!2XcLb9CQjg#?+^G?F!J0e(zL}KA+A64v+3ukb`}CAynsk$g!tj13`zL z{x@}7#SA_J`i1T!P++|W9b@<6Be;xZm0HCN2`G=_tsMWM!O%GubXloKXDjHAQjg=U z5>Sa3JQM%_hqwiP0QEw+P!o3j$?I?v-r4WvM4)wXIt-Qv;N3c6v{r*kd%WVYk27Ep;7 z=@ZZ#>CxQ_vI*)?kaC~itvev02sWd)6(s1PHG z_C8SHCU8KLlt*u910;=kbh}RQ>0JuC_|~V_b%IYfIKe;;7#8s8cAWvq90==u`#~l> z2S<}2#QI;$5Y~eZ0Albs?g~0MoWY~hb%Dq60~gkT&b4;k@WQYUErxtLKYAQLP@w3@ z;L#hpz^B)BgHPu-pWdZ6{((*b0-d%F5&<1{406j3ge#7N{R44DcmMzY`#=Q*=s2@= z-Jr7D^#pubO)0-eZ|aR`*!=^shhN-o2N{0kloIc`P~s)R}eF03SQo8*@PbBFzt#wn0eq`1Gb+5b&{lTq2KHU**wl z?a_Rg!=v+^M>qTbfCNv=JEgBZx?L@NdQ&YRM!{?3?9Ajr-=ynBLy&NjT{h>KmfRVptI%qpocQYtEd-U!GQHCc$$2Hcd7<314G(P(O z|9}0927S2bHl7#r% zb;0g)hNhhyXfEJyR|Sdp`lwWRBnR+#bmpj7`1Ec8pA8D?l{t9y`lu9uSPCA!E*Atq z+!Ro>f!Bj-cvv3gZ;@sOk8^>R8(Dw`8yq~k4ZtVam8fw156A$CSAf$oe|rLG;HldM zY#9eQvq2?5_Z@*90Ja2l=(?xn5&qVnj0_AfXEQ;~&ry-E^cUgpWdbFrZr0>Q%nbWL z=R*5{0uqu=Uf6-!R^6ct9^F0QWZ=?S!Qs&<&>f6tfE!cdBvH2GxfBPh` zIl&dMB;nEN%HYwPA<*n3!U&l{Y=EXOY0$(hOc{SmCJT7*7`DI0mBFKX3N*+<89X{6 z2dRS24d-u3V}g%OYcTS+goBz%;I(VrA)s)DDD~)^0=|j?cE&1yJ3DAV50W;!-N6UI zwda7fhJdCG-h<9?O?Yug4>V}o3`)5k-4-65M}2zh1$-=z^S8VJtA!fg4Kdualijo1 zox`&;oCD-UPzr@OaWNx`6Q_V0mfhVTd5`2mmhM1~ZpPj^Mo0<REt0s{`g-4U$$Am z-x3E}<=K3M!^bj3MS#Brbo;1hw}=Yp=-C29urPq_Dp67J>HOa8qLRS)VqP<-{-_2O z2q3q$>oGDgbeE_kxOCU6cy|8i_E&H;{0=(TZ13Oy|6MwN7+(7R(WBd)1AP2D=w=Md zZz`HCgJS<&QJosB*fCp+o7aOK&gTe+#M|CidoA>)Lg$LkT>ch2Xxu`NAXEn>rcQ9F`qCck5OB)z=saP0yh-+R|Q=J&ks4L9L)a?HVfok2AA#{m6UFG z1xt4k{$78Oech}c^OzZYI*)@(2an^Bq5<5Q>4cny_(HrB;HdHdH7lcd_J=WIK6{qmV3)miTX#);&pU$^1+q(W?wao`)TOMdxb%;vBYcXj2A=wuM z(g(?3VEddv>!m+5GcvwR{RIjuP%txq`5oY}0Q0*GSRh$$GN>{IRVFVF{RAf-NdAS( z7wa=HyzB!F|3Ge01)c3*U;qFA%TUms8i?47Jdl7UL;!pqb1X>U>G%Ktq0K|ta0Z5# zhkwBNyx@g&&K@t1|M>sE`NV(l9pW#{Ye8N4!!I>K&DqYwFS(%f*DjFw(U)>i{(mt4 z@Jj_KU#T0^mPIr+`Q;fvE!h{}n?U;B$G+_QhJM~GNZzCQjR8`d%SA=Q@W6}9ZJPd-#QG4Jd8MJ1~Gw+Wmv=nEn?|Ak#pV9lXFR z1)sL>)A_(L=I{$cLC@&+0?%xtoJlMOI+GZ3lLhq71BU+>UY~qXUyTv|j-j2O3{Qg2 z)DD3LHRg3y-Rz#7Pr;WL`E{{J6z5Mt|r3c2nO6_wUY6=ELEH7W)SyFd*{04Y**E0BklE}9ghrudK`#mk+ zJMvFC`f@F}%xCcFd=7Go!Hdt0;E@c^&f^~43_jfrpc)!9^TF}rW)(>0A86|fsJQ7o z=+pVi@&5(S-Wrt%kgFvtz@g^T`Mu>pDgO&AP!aDBHr<7R;e|GcJL@0Fh+iI>uRIR^ zVg^}g(fo^vzXfDT^DpL-OsEhef2$~H^rstiIy2bq-(GNm9nRnS=kNdjFYUnFdqDSC zH6P`GdF2tfxdKT~9?eGuVB)7h4aw%C5-|QQ&~4nkC7`onk<16JuLK49W01woM?}2r)9W94G-@iUq!??Hgz}7P~MbL+gQ(%LiY`zZQU$V~*Xf433s;{BsUK zt~G>>_`vR?dC^=B-fPCszs=Afz;QbghlB~aN1DS{49fOalG zZ778o`DLIU1}MdpmVjDZE({DP*GppIdvyNrX#G~g=Fu(Y(J6j-0+H%jy2U!hLHCk) z96w+n2WoH_c^r3wv`0Ff6g-X}I3VxH;BnkZzz7tyolY8{V3T)bIPN6D4iPc%IDS9? zq^Q%$!sGaX4G^XSNFCTfC(!go0Yo&w(s3sNP?yOA;+_d|=W6@q?^IRl8JxHfx{l%;@wU>+D;sxD$9j|!LjoKIOuP&b>0B|FF@NWKHz7wW(QG7O^Lqnq7>8FZQ<8|3~Tk8W{~WG5DnUX~^gW+wrU zPBs)189chpJUV}Lii0gK=Qs>1cPG->2 z@6AUzK=+t}%a71tkIv5^bspX95IvxQsNS3l0xvd#Gi;R&u8NoWdF>c?@U@&C$KApAae5qg2Tufg9CruJ0Wut(0L{-Dgxw1b zpW|5FRbKY;ZoyWJ!_EFC%cryTHTy~ID|5a)&0#}GB% z1f2GLEi8ElxYZpl;BlM{ z6#t!W9Nq3b9-UzVoo+ncusfW%k&-NEJOzn60is_5MSrIo59mrxk4{iDxCy|`VLqHT z0bM_+d=Y591X*#7?LK1Ay-Y9N^1)qp7tjc%yM$vmsC6I-s%Y6iI5ulAmT(@1txxmm zc1Kz^=F@rnB^O99e80a>x4QrV{Q{7&FHqSJ(tj!sdA%IC4b-jQ?Fw>&D8vcPxeSaY zY@iwwl>hZTl0$hsdO`PWfbNbA23hJ^N2D3|9{vFeRpjI#E?*gA)yR#Q$o>A303gubTxnsYoBF6S=+n|RK0fB z79b7dA*le(dl-Nk@7=W-NGeVt%mAqngQ$RBa&jCY3EFxCK0mm(*5k#2Vo*&`>i}`a zAyieXLC)x{HF%Nb$;jXVT6>wu1!f4mSOHqW+4=s(1W>cK`3MK}*3H7Q|NlY#lL|=u zf)dt?w>e-dkUZ0B4C+xr$9w8>!O}=RX*GjLgGYbjA<__Uv|9fE{~uyBs15L9QqKSX zFHJy=O?hy=TI&FcezAaRfG+Je^|p!%XVA1*at-) zG<^gh#Xgb>Q0zm~2e<|S-?7Kvf<1j$;7cDGFPcEbUw5?vL>0F5(OWI>LdTVn0hCZw z*ud%I!;5TCX6>zh@FJ)PIenNEfr@8v`iOwU5jcIU%>X9=B=4Z454%jTG?HIX(uX`m z8sZW3^bwSSmOd0f=>TFkIDHs`6dS&=uK7zFdoB)u#gOWbv(!tV5enCke{~@{|9zjnZMrmm2!vHOP2!a$KrH=$?`iMYFA0Ei* z1KQ#MH$cE^`9KK(nkqnz1W1I2qb}m}=nOaT=yZ2@(FbxcEKTeM%|Akt1-PjJF$LVz zfS3}BZc3ax<_g;fYQYlaJ{k@G^c|U@u2xzP#X+7-og*AIBG%DyO8TS`CFbK z>IG2Y0&1yvfSM-YQ~p8o#!&4bJ3ym%9=){@FWkZ9c5MJCg_fj(RIq`j^h<&~dTSkC z{B!^%iCTjf9~i+5g%{=ypfph{@Io#RG?4Z__9bf`sJH+XCEeg)KuQu-DgXb!1XUv7 z{;WrLZ2(%lMW+1!|9UFCzfzllCT|HcAOu`-fYMuS1xOxN<(vUYN`WOoVa4Fl4GuH- zc$f#YWwQjN4m81lXj*{XL%sGzQwmb^ll=C@bwmV$;s}&aL3JTgB0y3Bief8pB0y}CxxE*>OA`S6St3GNwgDdI(|Cd_e6ah|;80`$u81PGwCU81}v@_uSC6DfE zi`UZ;iNvG3TI2OX1fPoil|Ya$V1)+-{gu0j*ak%vs2~Bgu8~pm;JP?D)tc(L&> zD5ca2y!c@anh1OU;z1^8R^j=J6QGob=(kiRfIGji@q=3A{)=t`DBU1;##)sj2?N|d z-3O6I?!Tx(q`~QCK13SgtyWNigOpQD3=9k}F2(=<|562!ZZP^U8$k*{njq@oynI1!hp@(h(n&Rv zx4_X2s|}_>q>=p8id?>wL!==dLN8xd#iErj=J-r}x0C1!iq&@(S^aAMy;7BhTFE)XSM|gh*dwLOg5n};qriT24 zCX?CbV8(+NO{w6v$%`xy4NosJG4S+)+^@MB4Nfme-a<()X)$1FBtM~~7k7v>#6#%m zr79XNy`cANB0&m}(hI0xgPdMG(9(+qa(bbx{dx}MZCIHCZn%-%enl((A^l!(TMVfp zLTkT@gKCm)l=kZzL@fd;e6E6O5l~eHZojTaNP?;u@cJ@P`?VcZGK>LI0OHO)p8$%}1j(a4Bv3M|- z33wcQ#Ps3-INLCH2e5z^0Cfhiz>Rlc_|VM2=+Vvgx)U0n-2oiP7D3kAzPJ~TuuibS zgS+8%_X{mhx!3K=@VeoJJdF7S-XDOh_i6oB!uLY(KdAWuT5JV6pSGLTuoSeco*lBj z2R6PAn*Zw!5CG42mk2?VmKI|PcuEfxp2wm04A{SPjQIb5f@3Js!U53aq?dw6w-ZO} z$&%9Mmy8~rzdbv@c=Y<5;CRgk?tehmr=I}b8>Qi4`KsjoYf*@J=ld59ks#k4^{`|v zvGC}w74YmfQSnF)XR!`rDZLL4Mdo^e7gACG|F<3}J=g8Z0|`ISQUUn<0B9WnlJEpP z>E-2vkpKTd>jNNZp!p4lN4I>pb?c>4FOSX}9^JA6CCm&SmWN9;z^Q^8bYz0$hh`1N zQen_?3#6>l9tLuFECZ6ou<&&3{L)>_;n8`c@fm2%zvZ=3&gTD&{B5Ato=5T}q@=_I zHsmmP>C{e0F~H!`natt=n!ZVPXYuGY5qGhCQ0wZ`tJCDk_}8PmTEJ8Ds|VwKpUzh= zQldakI1Wl!E|v)_HRk-=Jh=I{1#>q)Y-oN|&v~jNm>b#&0OvQ)G#we)H%RY4%_a7Vyyg^T25|6gncWrfb8FKWT``xmTX zuyUyLhex-)OSij%YwLkhNsrb`B`MwhD#m=BTrfdCP<{l9d9+?CecpM(@RH;A50GWt zEEhbw1w1UTm)y4W;wTYHo8SSO9~T0NNLqSvlzwpO_Tq7|G7q-S1T>%g z8#MObSg1_lPFV=M+*y{?R))zcu=9y5-y zFfqLN16r8W-J0kml%pY=^369ae+&ojsZ%H9$c0e(RSpYA`$I=iud#j>lNo?L44{9%Ip903GGM1-$dSF$dYc>$b8Up_h*LxeL8bg96;+&!E^hdeL5DP^Qn)!sAPaAgI!cW zyKz{KyQqLx`2O#7QSku@fKOfy@Yn$gXV7X>kj8=+&fsXSQL%9BJOVlKsT0&X`Srhq z8#HzXT0mq`QVB{Mps4leoucvqlyWSum$1HI2NiAId%!UQlGy;4c^e7}K1lk5uTbJ| zH3j*k@dzmKx^zAO&Afuv={m+AhMu1ds^nh?2LAv5ayfY69?E`(p8@~>zbpnfEnwnc z^$$VfccAKBI{$&9Pd4cP|CcskF;IyN>4J6mgB+zRm#SKTzDR2Ulpv_i2Ip+fASV#FLsp z8shvwOB0WKbiVh1Cdy8W7o6Y!|9_bUUNh*x&>hOre1Hkk9I(8=-(L3r|NjPG?gp?k zUbny4;|I#YhhMXLbRK@~=FwZDV)5bys0RtnP@w&Gkcc^6!ulc)l>Ffl)1m^27?4Z| zNT&1tiyTnW>wN#B<=g-NuXlkAJr5$dKm;#{SO#);+BcA&zrTnBshWZqJxZH^RJXFj zH!8k321@jxm7Aa~R)}40KD{j9U2Z;>hf0NC8-d%6&4)NZYYKfV50xl_+EtxK-F(dl z8JmAHmOcK^%*N<}P*8dwlmSa*psf~t#u7njNsMq2MBwGuTxfj*o+^PJV_ss0(5dbL z>YdAhlPByzrwgDe4RW4b>FH?b`WMvG<7)l>|9^c1Vci5sc?>R$o8L%ybVFAbD1&Tb z{{UWDAmY({L;@*|L)t^#`X1e}kfZBfg3b(tx{<$yNdRTK{xwJvK_?T{sDO`$ERh1)rUJ^QrE;F#H7XJa2SQpg-~pk7zMzw)YE%?nsE7Rj@7tZD z0y(yQB{Rq@*s<-mLFXAl_CSLABqv}e^L`En=_%##1udxD2im{YTPN`%Hx*=Nox+PN zVCgyzUr-SXniKNut_M4gzhyP5hh~6pf~{A0u`n2PLW4W#AWG25aj?_Col#GIH2|Od z3OYj%bogp6C}DwC{d&NU36%oZIN1_@R?<-FF>nwJ-h3{hdyz>*aOX%zTIU4V6PtrpI}u7_1kvT&{_fxtvZDl zM}t5v00&2j6T$^5s4ftMxnNolC@5eq@c0YnfnC7*!s;)`D6s7%o}S$>n?It4>OF9% z)+xO31{+le^~~QtAfxKQM)ACO58jgmZXf!>&ShQ=j>=kz7mJcXQCX|-f)ng^XiS6p zy$DNxfXvg%`^ML9T*%HxledNPx4x@csib z3gTTSgw4B919~|upku&B!Mw`{HVWch))x$5qoAk7LgEdU%H2^tVgmL^t-=dlut> z2gMsKuvJiP7lhe<1Ix+09*td0%u!j5y0QV4Z4975j7vc=ih=dyHx&4%n zppbK6K%C2mnhwHI1Hc6q0IXo&fCB(I9jrn1{7jhVula#|19L*hPcRQ0d8{w0eu8|1 zkq$gjjWPopRjcr#8*CIT9oT}6f~5m}uy4@P0jO;P+WR2!;z2wp2ZQ3=%@1TJEY1&r zBM=tnpqqI?^#ydktQ>qsX|2KwA+R0{FH54jlMU?7I)xXHLA6OY%*#`MAbYv}2grJe zm)$@|nt|$V{+4a1fxQ?O*fYRJ!MyARHVWcp&KEX6KoJN!M;n&zLGwZ2N)BS^70{8C zi1c^>d>$q!44iyHj(~&#C=Ox%|Hg$mgMzMevZV$lWR+^cpz*(fEopB!A8|7yl?^=1xuh`z~>x7iUsZ$&%VOK zA6^flmJ8ERgRL1B0&l%QZUBb>C{4lYha6NlM8e##&kN)om>UX^+`#%G=_|-6NG9<_ zWD-tPqrQRDbFIRQVz5!LOri=l3X(i|UWk7MWfGj_!ii{Dxu6GjJ}lBv%Y`U5lzidN z2CCa@6<+-E1i2H#%NJ482xy=S9O0)uk-c0CzKRbL?5r>HzkrN_cp0f&$U`+MngeQc z1K22-myN(iLA=cQLgfp{%XrEKR#fkN1fS>&O88n}|3Jb36o;^KArQ47v4aKtFAtE1 zV6Is68O#IcW7Ze*K7%}jrCd0KYWq5HV1jI412zp_F2sV3gO>|_pJC||ey;Uy(3t_y za)G}k7J5VlG-o=2jz9r*4njSUihu*4%-ma}BJtu}BrN7lJU}jm_?o}v7)p(B26V0} zBJb`52UV@Y3kI+rjF^{4%^N)6yiup{;-Wh!XkdxG`4gB24XDyjAnPG9?}JF}Q&Ej- z0vlDU@S+WD6fDdwz(zr0p8ti`C*<|qzTJ?}=Wju)7w)5m)M@Yuub>#vatApD5)#Pq ze*iVg)`Fu9l>Xg79)Y=K%||c~>aBSnL1sZ*fKo5`p?b^;>@kq-Yrv)<;vZ}rBK|*O z#y@DN1hk%o2{aV}it9`_q__snBO(>|pm8On%6$o_jR-F8P24~(#q{-W)VO~Ei+dKZ zJ7K=w203I8>gyFBKxRRG?T2LhG*rWyz=nZ*z0DOAYH(ktgN=jwn)gM-2T)#yj?X~) z-~270@)%V0L2CIQpo3KqN%Sdb!8|A|VqM{30qW_&Tf=ivUD646i4Lku?!JdO4C=FU z;M+XGH8S)(Xz)Cp9I9#Dpp#@kw%>OF4J5&a4<>>&SA&h>c+vbG2kq+}e#(BV;cK`ps{0Vg^mV2UK+W!ClQXSlCs!_ore-b4B z0bJ0aoa4I@B(4BH>=k4u#D1jlf{7scd613>w)2AvLGn+)4I8ZI3kQPa*J9dh2@+oj zY1ks|^?0EO5-$W-Y&9y#5*#22b#Pk%#RDH~{{MfO3ify%vich!@j9@>Pz~A-lK2L; z8AZc#khlvtQPv|H)DIF50Eaw^`f`vsGdSy_I4B+@z6Dd<9VEU491Jgqt)-+!`F7DE2ag#6N+>QOtjB`TzgR zey})-`pY13Yb+7A3nT$LaRpQjBL&bRkT?ToQt1MTr-40yVnGo|+!0ddA!nK>kT~c> z8Z`5rK;o;wxfnGCX@Vr;z!sx~kRV9>JUE6?HT;~E~v4@YcsVL+NTb5W5nJkZVDdZ0uTbn=2kiia@|_yi9A zRz*;)+Qj878Pj8Nj0H{aL-~*X$xMK$z?+2Za@xsv<fNYx>-jiQ$D2 zoO>I@RR(d7ANl~9%z7Z>$l%-g&~b+dXfg{lGwaj&{>6RM|NlFgK~p&bpeddbiRNGb z`CCB8n1H&PU~&Fd&@?e5S%79$I$czFUbLHok1OGM`Sl+-=v){W9KjP6!ib3q&_*an z&`br`3okuDyUh8`KrTKCvRdUHi244-A9Li^TN>*4IVcW7u*88&x3X*NlM-#v>=h^$ zSfH^`3~B~6AJIUaLjsSl?*|WguY))MJm>xi6lI;qUs##_|KEAgvGYjt0d9|OQSJ~> z^n|EzbQ?AQW8`l$W@KQnbYkImc47hfgaZ~Cy#(OgkZUUOveE(v# zHOOPf_t}8vfa+|)9GA{V9-Z%AOtAj{f1e!#11K(E1Y3a5H{ji;02K(bMUr&|X*_-? z!3sP}_&^CdO9;A_27E#mC!QXlj zJm-ZnKX%ac|Noaeq2eCLk0yX8MN1i6TfdcLxO9GV>3sg;uNladrSmU;h2~|Njefkb^pp zf+pdPzUBbUGrHaeO_05RVS5{t0N%e4H3hZ)To@QaL1l}C$MM6U&_*d+I1CSTYq!2F z(S7mb&;S3O?>djah&Km$6#0lA{?W8*NXH$ZP<-*q5M-#0O6O5<*n!R~D*<;OJ-TgFO87gqUsi+T5V`#a%K0xQ z8vp;_sr@n*l#^YJApVNI_5c5i3>%Q=AnL(0U)}5;oxee|f8awNUz`AYL)fG9D0tue z!3WG9y){e%K9v&%m*FmZKsQ<0|NqxV;p@A6K*xNXf02she3;uk7(cuOof?D~90Z*w zhFI*z-p$bbgRx8&T!QTbtxkGz?%)6a-NKy$kXcgDx|nXc7cWggaVr58^XNSOqFw+0 z{}-P?6=vtr7rVgp`xj0|p!3NcLp-`!@B4uc_WlzZ>;XCze=}hv`Fp>I45#| zT-?nn=f}(da%v|#bTL~7$hDoHAuHK6kN9X^yVwL8Xj;AF+2%6abq87y%IRdcfJQLW_pnd3byWG2~g5Txler!Xru=; z0sy+t-QFD3+htMl=&t7Q=se`ne1g%V`O&{`%#0rVE{8lp=fk!BFYy7@T`i#a=&ly< z=oawobW!1Ge#Gp<`3Q8HN9+F*8<2`5unMrO074eL?co6^3p>Vw(wFCP7Znb04g(q1 z`oHuDNCdR>1iYFK8pU9>;PFe)`2sJ!K}L5TfAL=jGJGZRg4O;1{}%~npd+D=zR)m( z6t)j^K=d)CQZ^a)7^8`v3p`;G!Rz&pbM7R5)JD164-dH7Xpiz%!@(swQ{UDEYg4>fN9T%cq2fBO!)UNaFeEJe}l)?^9Nc-v+D1PL%z`+Ev z*W?n2`Thlu4r=@agHFl*{X!IUWf$`42cRv+kPW86h;6FD=o?If4LmxX9iox?Td@2M z%H7ynS)d*qsFmgJar`hSIY6SHzhxN%0|O*4zS0Hd4&?JA`CDIs;<)*U0;C*sj6$=Yb>tWoUqG0IeYeXFvWHbM(c10{kt?j0_B&+NiE69$<;^i8?3| zet+>$4-{q4M7YHO%mJV0`0m9qJ$N$v{-RSGB@upq(P4ljTW#?FKRCI=6XEw4<-g#G zuto*aX^{t~!m59;V{>a%IQUz$!HslqJpiutK+B96UT|vu|Njzp?lF@1M-6cM^du;q z!uOY;r`O;A{{IK1S5Uu$<0a>RSi1n0Zb8THzDQU9|Nk}9YhF-IQhoma{}*kBpql0T zi@fvy|G)l-XkevHz}DWq0V*B3sn_1E(E0x#+%876cSY4;?cESis|&Tg9YJOLe`sUa zKUEcv{Wn0xGBy2=X}>7Ue#rS_;0604pluwmeG8!d6`=M8v^?q;wvAQ4glyzc5z;6#&*R z{8j${e=!Rzc=SaQn127_l^Svh32LhT0UeTsxt}A`8I-@-QTKCz8i6m^K{@yMffdtS z7(AK}2zYcdgHOIo>vR@~K8$p^1HU{2|2B7l!xIoG+QFh+phOC^iqoN^T;N6SMbP%M z_pvXhTx4Vbwc8I*z|b#KfkO7h_5Yy4^nL8hJQW=0J1cl} zhjU=GPPzf(&bU0O~D)k|wB^)Lp>xLPs5>2T~e%^p;!@0C&=zIKZ8I&?p78 zdmn_{y$79R4LZUQ+%E(jX87_dygUvAw>UjI{|0+>^Lr#$@^m|LIClPY)I8|gda_Q_ zr`J)yBl&_yuggUa&t97!ulXS5i$}MdhowY`0%X6`@zVFMhEJkhIv>CeEQX~Y&t8!W zphJ8Q{$Td#JPc~LUvum{;`sfF;g10Q^E^!+RP7*pcT)h6G1J&B>DgUU$;X-hw%8!6L1kZ z2*+n$tAPB-0w160mcuqaa}>$>6pqh;5+rN!Zc3mUC@30jW{OOGIvK6rGV^X&ZN+3O(zDi%2vYud^tvlxxK{yW3*5b)a**~WHuug26#<>^UrarZd4zz@3yq?`rRt_0mnad-k~ ze8HzT-vA{%cdFtJPg_uU_SPzZhOq;oX?5l$q_p}5^~Q$@-R?TbEw%}kG;&2tR# zfaL*58o+Wl1-Oq4+U^H#6Q2TIeG3}Je*PjK>h|TJkm#*eFg$5^2^2ENLE_M1B}e|L zN5B&mrl1-HK1jt;f*!wWpsOjMqcxz)4wC*M{X_8N-$kka|6iYa(IpA;;L(>C)FB!2 zl{#{SJBD~PA5#Fef0UF!2^O?{8oB)gEj8JK#|v4gzL&7|m{{D4o?b9YVb9JdpeX>*lA!O--~zcMqM_P= z!K1fW!Kd>%e@i=PZgrCU|NjSH$afz7?hLvf(!SIl)IR}fjFA8Tzw<@&2S(Ic`qBhY zDGtj1NaIC@Z=u>tjy6<#fUL0a>3m)y@xoXhG@j2t{{ZLF*Q*fu>4miX|Nq}F9DE_q zdGz(9vqgD5&9QAlEWbv zP+7h%m3VCpY5##Xn?sJv751>a3rgJ1KR{>8f_k>4k371qAqg4OsC&U7@&CVv<=xWT z(a@7n*~LKT{6pGt81)HwgaXUO9Ujf~8Vvj`A3*(u&fgy0^$MVave`U9*BmPB2aU+T z&DBiRc3L4`Ibe=C5>bZ}7)D)Yhn zN(DgMalxG?7Zu1+)txRX3NNmLN}1je6#>xoDV;Y_&cO%WwRrr1!FkXgUeML89N>Z+ zato=8iUH_a$^WJ?CeU;6vq5fbKB53>$>@V}TX(erWSl4v6inUVBx88#MX)F+dpv(( z4OWA4IS4n>0r@YoMIprks|qMgCxG)iT6+mkefd@llmOnpXa%(eI^Vz0y^fUc1wQ`& z57{5++4&V5Esbx$XX98(Xk)L3XSXW@^umK)7nJ~* zW)~HS7Yjl`x0KbWAe}1IA|nM^1;MTp9qW(8dC9q-?7Qx zuCKrV8fM`ErG^N|4T7NFs)yxa$dzxP{?l<674UXt=q}|3k8bPka25~ddV$tU{4ICo zL0fcx7=C*#3e6|S7(JQ~Fj{`%Z%JfgU}&&lD1GxHTn-cvE-Dco-7G3Tp!-DLd30B3 zyyyp~fE*Q2=LUQ~To@DR#OYcASHo||Me3R;QM zoulI6!oST$g~O-wCnW!Z=IKB^ucM%XqB}$-0=(NeKmvBAHh;S{*vNVXP(3&wluNp6 zR3Ha>wSca}0ab$Vjph;jEjf&!rznq>#k9e0LT3cwLk_2 z(2VbYQ1N(D=KueFkO>Fd4k0Fn7ZRW>(FqH_-W<@iDUW!C(}_MKXe~+ve+!2k*ljOPfNEUOPIPds?*odNP-%o4xIk{0A_K~v zAX|Mp|AP{0#EXldyoB)mB3Vou`eY$Cq=9X)QF*}&YFvQA9Xwvj-_k1%(If!gdg}p_ z;cuxB2RYqEr2=WX$4s4p!K3jAC_92`2vCpNG5&DcgwAU(=Rz*0gVcYJXau(>8ioG< zf7t*YqIO_-Q7i~56LVBNJUfqhbVC-WD|&Pud*Ss6Bq8A0>&F4M-?P&VG(YOWc?xth zC8)E^-%v&~ZZ*5};_~c#)+E@-JxrZEuCbi!-2< z1KFVK0NUBh-%V>G*c)NGP=j!ixm(_!&qZl(r9vKnzj9ky>|yYFb2UT>+|8p&_CHN)rk%8o(y_ zfb4To(ZG>fcgdjmZMh60wL(%AC@m_yFcE>IK=25$1}L=}prlqv1_31kg%>CGLDU+6 zl!3E~0!nJtfGAtI59C2;gehQ2t;bOl%NB5Afy6n~hx3FXM!;N!lv<&d*q~X06z2*r zt_W)W3SA#8wq*jF&IbeIi8eyqb5@8l3 zwQ|2;+Y9TDfXW&U4_NTjA(h1(FE)U?-LR5d2x>A&HKgQTfRehKpsFDy_Y-jS2X+TI z^!Qs)%i^UHC_z6-0wV+$flVNgx|L94kY5se>JAfxq*z!w@=-CsnYv%?hNvZwx)1M0 zjXsRBxEVG77GUPz0|F2uV6MVU-EnA^prjE;up~H$!D)oQg&!q#Cy1g1v9Bm7h+*l( z1#CB1GdO;b%i?U*A|pZuq!A@`vw?NP;s&J_f#%C4yC8nUn!4M;l3>fhE-#5hl*Rv0 z6UJ+B!hpHDj~`?zSR*WTTO-VZq;B398oNMcF{FJ4PTxM=4g%nc98?~A_Et!M$~=x2 z7Ze~d&EW|ukB#_YJXl);l44=mZYJuvBW=)gM?gk_n-Cl?KJYHOohZ`+rN1yN;ekSA5--SP9~BOdZbwl0 z14^;5xY0#TG*a+H14^Qx<%ussz`8+Y8R&{j*y%73mxIESkz>8Wi-|l)ZR{G9l9~S&{i`j-FrY= z%?dAWfckgf2n4CNf~v;V4mmG`QjF{of<+1_Np||ED7^T=4e=wS9K+ELaRS9HB5~;p zV=t-Ka6^&^#4Jz)19wU7unnS?KuImR4dOglQ3Q!Vq*n7<)SNvFoU=g@2=}2FiVv}s zcU!iiS^|k#aI0D2#dNSFIB9`19W33$lJ5u5@iB<7xeGqh30CIK;sTir){Ie7=c2ki z3e)8=VBMf>&<*kpa(f?AguM8*1!O*~^neu{P?z5YOM)#2yBxV4at<{{cY|{)%+*gg zL8gK=LJA447ZVX?LGl*&i@GhabPq14;q4IQ^vdx<1Ki&QrDsrj?Sh)j0WV-7^Ma5ptxKYEQxSAa(WFzwcHtOIn322 zV0*zDVd?eZMz}{{>Gj-3SbBw*(~yG$>Lp$@NkGf#muyJoH1c=_$BQ`d03^s3P)a_) z2DbnlQs`}DP0-Ogh|m(_#R#oBunDlx!cp=*LQO8`!H0^0{EeEDjo2Wm6P9LtRB)%{ zV;dl938dut8$cdJL={HKD~;+j4$PE1hZSN3%vG2v*$T}Pl=L7AmIMVjEG46kS1jR1 zsoW+)My{YKO#y5-STi_&KrIefDPxWrH!7HM^N59z%Ny21R6vRXl#-X@MKV|tY&oRl zMH;V=L9H)1k?ISM7g=C?!5U#HSsY;&BqejcU|A1pBZJOIfwni8A>+&vFLr?@JV0Z5 ziY!R!7_`9w(NcU2I*|pDGB0p|QYI)#feL_^%ph-p9e@#R>rh=j8|-pORSPYgSA%uK zk~Fpgz;hkQd_<~3iEtgTB-nCDumvJq&5vsNACzLt7;GnUiz82pgSJ>UjywZsc6(6|fe^o)g!ph5XbqX&e!CEkmsJeivd@opey~2xE4B&7AM;q&lIjg}uX!7Y>4RSH$h$^JR3v*G8 ziUJ!|r|@Dv*eKYEIe}oKU}q&cgN=fmnBxW7N)K8T!QY~bdP-Deeb<$sfP%!n6C(CQP>pf~8&#|DA`EO4EX+B;M!~}T*9wqP&@c}`I<4mn z7mD9^fIFn1Fy{c91`qR{D?l!ThB^O>RV$F!&%nd|GTVS?pgA49z zXz_J-8OZsNGmCg$oL>eiD4_F&Naq%rgY%adm;~s&G zfSo%4o;URbi9dM=5jXty()Iy3(?ZH4c%3oX2r@|<@N(CEu$v^1jAjEFu^Y>|H*dfE z`~NZoeC`eE86j6d5{BU8U{Ovj*#i>4^b=$Q<{2ULzd$NAj+cDjv8hmaQ43X}@N(iS zP_jZfup|Lw_6r<3o#8qe!ACAtBKZ&0ZH2Z;WuVG9KwV9Rmr5V8x&zWT{qPx-kihL1 z7Zrt4l(aq&}aq=_BS3W8nFZ@uC%~LgOXx6OamY zTcBeNaZqKDj`B;Lry#ZH_Hn#0hbrTExfHAaI9`atRrr1ZnSpK}G_>A*0(lJ_0zN7V zFF{8sfyV6+DF+m?P`4d|s)f2u;w?6Fp=zh0s&#sfO)X@4?L`(;Ex4~_@UrV6C|w}? z85CI-AcsITSfXeE4c1z`oQ+i%@}wLyR2RhgAYBG8XTQN_7qYIiA0YvRtZO$oj?qID z>bN;j4N%|Adx*{F&`>IXs)ZQ-QUPnqfX0*yR4p`JZvY>ZgdR%BE*FMsfEW((ukvGT zu7TR{=mW&7P#apn2M3|#{R1EV{eOAx8y+*}p_@m5_m+a+tE0v$38w1Rhf7 zcoFacC4WwMfz3397n)Gh6kdMD8Z*$)W`ZdLl?)m$t+3{HsM>4qAz=Xtyq76h^P$3v z^)O{GmBA$gdYXWm)&WxnvAGJL%`vEIkAWA%pogHw3sa~vjhDp_K%s(eGc+~w!IXh) zHh6goTr;4X#_{6$JBW8VUS0*4t>`MCUC#qxWw5U2%UxJ=HOGsYFl8@Aal}|TSOuuO zOa}W8-Sv=g1Lb>;7vArX69LE{8ZTdi;{#n6G#yJp4Tq-VGvK4okbML)7kSw67hH2A6Kgx*#ccFHG&rN8pgc;f852Wnd#;T7r*jLpBZF4XG#^K)F@p<=R)+ zVipoMFHE2speeKloU@T_fVh_zs*L01ey|%*EBW_t{{4S>1$-78s>C&rgg*FCG?W^8 zA4vQ>7L%5OB>KP_P>vMq1&Lq7JkhTdB+d>wkrt^Ue-R53|N05!ag>AmTtVXhzG8^$ zg2Yp>9Ev6alBfnd2&D}B^ZMWamttUXR4+dUNt^*op!nc4NW2g11C*fH3=-D{i=$XD z8zjCQ9HuDdG=s!lKL7v!!t&L>{~n!(Uw-)kp`SqMH$VRU_v}3KlKCe@oEwccg7Pmz z)O&!|7rtZw3m$*T1f~zaeDUMof8_P|FLz%7t;>b)M}VxS1)cc=+Hu!;*`x8z5AcfS z5)}!L&JY#k#pRG&hzt*a_S}H>p@44Jd2#x~zyF{EE`&i{l5W;3?92?HTT}`>KwIQ$ zAS=8wJi3{oYi2v&zmNo_!Oml#n^iy;3mIO5nkDeUA6!R;s1$(Ck^$d}#^3T9w735y zBjh9*z6l61EbccX^ zbKj%81hn`kM}^}>3O}f-uTc>|S}gkkw4kOFv{)82Xai|aHzU@|Ze)h7msJNf6npnT zu7BwU^<6q|d2~XqgYoJ7_aYqR!|oiFjBZy3@VeP~%pk{tyPy0m|Ct#W4Bx(%0~`hw>3r)5UUCgxH+$5xw^jmV4yZn9IZ$%jv)dK4%mc)V_zIj}J*-_+3iw+==l8s} zoZ#4b1a{LD(rVE&D&Wjed)!HbZO|KN*mg`YDryjcA4 z-+v$6aRAB<886Pg{`Viu^60$f(+S>Xwps(!FM@ak;>Uxa6!znP37Q{QfjZ!w_g{E{ z>W|KMAn)FPk8s44XN(Ll}g3&pS}0pL_}m^!G0&zW(>$vGWKh^X-#lU;w8ekbLDU zaH4261TU3f{rHp-bYPyx@fL9Q0Cgcj>=U3Z*r1$#yhQ~xFbm>>((nz?-jHu^!B%vF zR<+-H0}ALZDxhwxPv<+w&Lf}$+OB|F61^=dpas7^o!_8YnB#@db5L4?h(ngQw_TKE zVBp^uzzyx1avXdm54!g$2<%meO3>|(E}$59>3rzXc^`C^Qm?7wQ$_~E124E<{QLj1 z^vl2h;QRtf*&t86aD4Xf|I7W*^}|Twnjmo}sCehKm%e|H`o~D>7(wdHz)N}^7+!pS z0&;kcN(Ly0Ag@0@1)hu+@a**kuRqT4>~uw2e_WCU8n;8NJQUUysqW`hEn!J`+FC3!%;&p?R#beBTz%`p)N ztuwBJjt?zGT~jduB-vZ1@S^uMXt2c%yp_ZNy#DkwXvzk(k`ufZqZG6d1Tpj$1zHHw z?V@4;ULPC)PQ@S|XoXLwi;4r-1kicr;7J1Z)&nIXAg{}TN{3Pj(D=0jNCqj8=YWG1 zq!l!S_wN-bkU>08hVf-MKTyd(^i5FzW> zFQ8h!7i>Aq)!ATs!5U%nSP}@cAk%+bFIXpohTFjNJ&@E3S+BefCH3w@T>`NhX#t_b z3udT24meV8IB2H;BK5k6fkrnWaq9s}N)9g$f{Ruk6$fwv!jXDeP?yVnlt83jNCE(* zUWXT@&mpN7ViqX%2B4%~NOA(DUWXT)lOU-#0Hh3@+#OI-uLnfgqlu8{fvCWedX-U~ zCIGIUP<(j*86*wBT!l1w4Yi~e%@U+E;P4^=EQuUHd?=~+66)%o{ovIWx68UK3Qy6~UIn zT)p-wD8#@TVW~F?VHPCy^1N`L07|`(dIem%cRL7xA`Ma_;4RM$Kn_7F&(GY0SO}>h z^q|%o!1tS=mgnbC*TU@vuZ4rT{Uf|;z`p&Y7B#xEz|n=0Ue<$6fQ34a95D~I%<9IG zBa)vGpCi8a5tSn@^r1#M#&VA9sMXyOaCL{`!?TY;!42~vwse(^W(i8V@&ikPlLt6m zp_k`ws7um}k(Q)6ya)u_4c3gABT(b!0A}0>gLUI``Nm$<;6ZWu6tE=Nam#fK=V7i!7cZd6N<(tyE>31CS``x6pBsO9+^(83Kwm3b3sNr=IV$qzuG3)YO0 zdN-rS%>vB02?gth#SJ!>f9}HL@@rs8u;q}{i&UO7q2{^w;9!HKUV|5R@55aUOTAqP zvmmLL=S6uJDD{HNbND@)!k}4m_-&T8s1w_1;EC-zg%`E=(fb3tLF-6B4LoeEdGyl% z+zpuXK&^QLgkz!Wrcv8NBB*P=7{P14AU<_?@fli?;A#&QqiRk7YlfsQNMe4m5o`ji zgu#)2Y*3?G6KOFYa(gKC9wh&O6FWF#;BF87?11DS0_~wo9gqZqvprObTD&BIix(6h zp1%tUZkP{IQXwSszsNZmysl-oU^tzxJT`B8j`l73<3e=DjbNU6Z!#RRYzcr}wlZg^PlW&1S z7pxg0{Z2-$I2yne2TI(8f_1~<2Aj)2x8QO4HLxVua*Xu*1vN$=BCV=4cyae8+|{u3 z+l4R-mVV1y;OQ4p{)4XMf|ma!{Gd@8N${wQFxtI6+?W6T2W@J9QFIep6@Z3e)}nM| zH?pCu@}0*9O1q#$=b~cp!V2L;aKNIk!WKb|6-IEZpakv@a4iB0TpS4>v=$3#*QOr0 z1_QYPHQ}$hL43k@XeKJ*OE#m%EJm}v3N>q|gGSU)6TTRV53wbmElsGFpd|e1U`a&s zLEry!7jzpQqHH+@y6P0V|JvZitn2V31dbo%RoFV9HMaKegAx#0VU!K*^~Tckk? zU7_iozvVva`olBe$&EUN7p>Qj5`kbNeLhNJ_eD4hBQQ6kYFq%;h!U9mVBPov zb8Q2jz?=YDeP)WaQ9;teXYAagU{ zK`9+EKK%rI?_-_9i>+5c4uP%pOs@w`=0Vna^1XVk3FhBqA z|I5f1p!L*--(KoIK~fKzK)G=lJh1{|`d$G~guHOQ2ntcq`LMe$Kv)Ic?gAdY;R2x2 z6Lil2sKkXI@>2l4Z?W_J3+;N)ZG%t14wOiPp63sqzi2%B@BhoN7oeitfx)Af)#D84 ztfPCN$r;c*CP)ozLIyO!Spl76k?`m|3{rz_0_TP9Ih4s7&`gcjCD0rgWS+$bblBoO zs6iYr>Y={kc%ga$7}Q3;+JV1fBKmaU8Nfy#?f09q^g5;C_ckbA^Be zf2+!~|NmdwJp=gx65gPw1Dzv=G-NdM%)kFH>pml*T!LSo0ZG0RB;N*JJc7Pp!Q({? z$U)sMDjqLCKZk@Nl1_V&P8smEe&{+4UMN9z8oYGCx;)X~1p{1#DtHkSx)}~H?wtlj zwu_3xOJnfj3rrPz;3|}{E)g+!F$=1~;N^a-i<=x?R6tcYyu1ru>43h71kzD?5eQWV zZnp)zRKOZy4llHz${b$GV_jGT?Kv>Rlz~P8JYG(C35p+do1tp2pMnMhL~RM!mFQt% z@L~g0nZe6aaCoAd25s|o!jyqbb9ng-ydV+XG=~>SP-PA;)4^#6U4_952dD~zm#kP9 z-$3n?geimASN0C%Q*_fjUVJ(U@ubH~O>oGfyB-=Ar=iLqgDfwzz+sGTn!}4FFl8@S zV_gacbz3b|8F)*s!^_Lya6>oE;6)fr*-Mch*j#V$!UV3u9(+e3%32fglmGs|wEhLs ziS8??JHDQPcpmBw6L5~fq4p%I+TGv>V_lFu=x@>995tiAPxcf(&Ob} z@Zw+`HheyY;>#lNa!-8WcnC!U$cBKI3$f-cgBR1FY7Jh3?zcsqQh>yJ30%c{@FHB4 z^c#Nc-~X2^;FOQ;*66ME51s4J)C_AV$6v0Wax9 zH_hNh6I7YO%fI+a?`W7ZP?$Nq3<0Y}H_hXP2~?TKOGT{qIlK^ps&II@7wf`mXdJyh z3<(fuP7?vEMYqr3#Sy47gO?VdHGHLqK<%c(FaLmARGo)kz5&xmUmAlNU!6x^Dqn)E zjRLJ^dT9aSywrfu9$>+jU>%2Fo`TR2!Q)`g@t497l`qwxv>4df!!M^^1RML(4$9Al z^35*&`=170FVp;=u|&K1KU0ZV>;Dp_!xKRF1N`*p{QlDTFla>$gGaZZ;QzqFyD!a>}DuL&|!@}mWN6dJ-UrOI*q#dnh!EI|70wC{GpkR5lKPmeNZQ&LCHlg@FOI5)yv8zJNzJ`t64);M)(|z}ZaL2Yef0=W&nZ zA`YKkF9FY9o{v6^$2@ykK6+T5DDm^{eE3=z5)U5D2RS^O4|0ISm3_MzeL5K(yA7I; zF*g5WEPM39v6+DpNlEElk8Y^xP@{bqk9j0J@pv%4^Y3Lj;@K;c*G3*HQS|IKz#1-41<-KOL4=DU=#YG{XCPNA3PeM$R`lovUG@PA_ZP)0 z{{Me{V*==q>dzj{ZzNC-Tjel30E&3fV#hLD@NGq)(=zK{tOFmTDGWNOk*WCrBk1Y` zJJ5(L;-aup7Z2EFoREG6=mta)71(*6%$X3>!e=qLBt=JfBVJP zeW3hz{Dmx-e*S_r{r~?L4WK%(^XLl?F#Z0;g#-WogYR3+zstk`IZ_y88>ROx3V;p; zeFE}n=ld6H4uTv4x~>rWeT$&`!#t4hTeLp*??3#$#eJZ@Oy~O-Y6oEX7q&jvv-1ih z>vV!b-@>Qc-m#kpl_CG-H{BN9TRWxvZ)Xm61N(wG5CWS;5^fpU#*2K&wna zU1cLs5!fvZI=&NSf$1sG$U<)&_&`=ZP(E)yV&T*I0qK-bQ2GK5NrKMVlmUewh6+S{ zzwq7*8t|(HU8>>P4cU&Z06HdAxev6>*_Q+4LhvPvNUQW5!R0_8D7~|PaBS9REOGSd z%muBAe4%q3VjLm_`CIS)`~Tm!Hy^e_PY80!6{LR)N^dW9|APh+YZ-jI%OQ*LvOuTv zzz3mvK{I@aL5nJoBxv-6;RtBZ0uI^J&9|e!&X@C!v}E zayux)N`OtUhngS(GeH4t!b{LHQn)X~K&zk-zW)bW8UQ~$=`T2ufRDKWPZ=VQB3(gU zA9N7BJ_s_TrSakjRHFv$C@QWOg}I;(4fvEE*eFsQR0wvWB(m|rsKz@W8L#jn6>7W! z!gwKsSuo@O=Rj-(`5(N1MgoifjX_Hz5dN2j`X3U4e?iF`w9pkCf~^OT9q5C)P{k5y zah<}8BT$V<4lIPa1|$TYy=Q$92Ni-i5Y>1?RO984jF)(k3N>B=$^Qtm;Qr5s_#c#l z!2XBK%A=;B<)9f?g#Y_Nlk43sDv&hz_W-1I1u_A=C>2`>;z-4i5Znzl0pvwcCPEIu zI#A+83~y(Hl0S4@T;W9%R3j+3z`J$1Ug$&p0}_IUpbS(9WIV`s$i^$9F3}SZLrjZE zyikT3j}(FzvLL|)5`r4P7b*nuKT-&y=Ac=qA=rcxg1h%4hahSc&jTerg#WuiNe}9O zi5E>!jUd;+{10^vNC@gc8K@A%fvCox1?6mn@w<@LHwwH^h8iz`NI@4eA^rymL5<%F z6#|uFVE==nkiP}B6x#!uAw#5~C7>BHcsaNmRKtULpe4lcau78QzC<tOBPxaQs8<0hs_!K_FM6 zhhP(EdK_Uw7HE+Kyd3qREmH4q_a3JL=Y zf%mb456(n3elN)X2;*0Q{SPso<3%jgc+i2M(BS0)n+4wG3Yny3eepd7K3T=z5(_#q z2Hy5t37VHfm_7|832OVX>_Tt*p_X}1QT3e#Hw-}@0HwF%JK>?_fRx@)Q|vs{<1X4j z3r^tatrcnlC_#Wtz*g^8qMDEhH33rZIzvqW6-uD!1_dc>+Xf4$xJ4wXkD#OuO;QRk zxS$$A1spU;wK%}fW2q5hY6!3EWbg^E!Bjwl#gjsO^Lxs?CENTj}2TkK5(ylsa zbpX7~bB5XjG69@|K(0g&K^&4?zx4(nEycS5VNyL-52lh!;V@1x-Pv zi5MZ61Qh}q4{{rF2)2WA7sB`wB;y5MWI~Nc3PCZ1S+Edfh6;iF4^BZKFQEJX1ZoIw zKnX!cs6E)qJRgt)5kYSWb|9os5_oZ9E6D$l0uJW?1d#tBLeLbH1Qr4n8QmCV-f2{K z?Etw8ykZ4(f&fJpa)S5=(uhb9uaQ

xgefKnJJy(NQP1>$u>R{8{jPQC#R9Pzj0fua); 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

7o(<+BFH9^97|f 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 literal 0 HcmV?d00001 diff --git a/harmonyqml.pro b/harmonyqml.pro new file mode 100644 index 00000000..8823695f --- /dev/null +++ b/harmonyqml.pro @@ -0,0 +1,68 @@ +TEMPLATE = app +QT = quick +DEFINES += QT_DEPRECATED_WARNINGS +CONFIG += release warn_off c++11 + +BUILD_DIR = build +MOC_DIR = $$BUILD_DIR/moc +OBJECTS_DIR = $$BUILD_DIR/obj +RCC_DIR = $$BUILD_DIR/rcc + +QRC_FILE = $$BUILD_DIR/resources.qrc +!no_embedded { + RESOURCES += $$QRC_FILE +} + +SOURCES += src/main.cpp +TARGET = harmonyqml + + +# Libraries includes + +include(submodules/SortFilterProxyModel/SortFilterProxyModel.pri) + + +# Custom functions + +defineReplace(glob_filenames) { + for(pattern, ARGS) { + results *= $$files(src/$${pattern}, true) + } + return($$results) +} + + +# Generate resource file + +RESOURCE_FILES *= $$glob_filenames(qmldir, *.qml, *.js, *.py) +RESOURCE_FILES *= $$glob_filenames( *.jpg, *.jpeg, *.png, *.svg) + +file_content += '' +file_content += '' +file_content += '' +file_content += '' + +for(file, RESOURCE_FILES) { + alias = $$replace(file, src/, '') + file_content += ' ../$$file' +} + +file_content += '' +file_content += '' + +write_file($$QRC_FILE, file_content) + + +# Add stuff to `make clean` + +# Allow cleaning folders instead of just files +win32:QMAKE_DEL_FILE = rmdir /q /s +unix:QMAKE_DEL_FILE = rm -rf + +for(file, $$list($$glob_filenames(*.py))) { + PYCACHE_DIRS *= $$dirname(file)/__pycache__ +} + +QMAKE_CLEAN *= $$MOC_DIR $$OBJECTS_DIR $$RCC_DIR $$PYCACHE_DIRS $$QRC_FILE +QMAKE_CLEAN *= $$BUILD_DIR Makefile .qmake.stash +QMAKE_CLEAN *= $$glob_filenames(*.pyc, *.qmlc, *.jsc, *.egg-info) diff --git a/live_reload.sh b/live_reload.sh new file mode 100755 index 00000000..56730238 --- /dev/null +++ b/live_reload.sh @@ -0,0 +1,10 @@ +#!/usr/bin/env sh + +# pdb won't be usable with entr, +# use https://pypi.org/project/remote-pdb/ instead + +# no_embedded (resources) is used to speed up the compilation + +find src harmonyqml.pro -type f | +entr -cdnr sh -c \ + 'qmake CONFIG+=no_embedded && make && ./harmonyqml --debug' diff --git a/run.sh b/run.sh deleted file mode 100755 index 8de67729..00000000 --- a/run.sh +++ /dev/null @@ -1,3 +0,0 @@ -#!/usr/bin/env sh - -qml src/qml/Window.qml diff --git a/run_live_reload.sh b/run_live_reload.sh deleted file mode 100755 index d75f65d4..00000000 --- a/run_live_reload.sh +++ /dev/null @@ -1,8 +0,0 @@ -#!/usr/bin/env sh - -while true; do - clear - qml src/qml/Window.qml -- --debug - exit_code="$?" - if [ "$exit_code" != 231 ]; then break; fi -done diff --git a/src/events/rooms_timeline.py b/src/events/rooms_timeline.py deleted file mode 100644 index f88c159a..00000000 --- a/src/events/rooms_timeline.py +++ /dev/null @@ -1,8 +0,0 @@ -from datetime import datetime -from typing import Dict, Optional - -from dataclasses import dataclass, field - -from .event import Event - - diff --git a/src/main.cpp b/src/main.cpp new file mode 100644 index 00000000..3c4f79fa --- /dev/null +++ b/src/main.cpp @@ -0,0 +1,23 @@ +#include +#include +#include +#include +#include +#include + + +int main(int argc, char *argv[]) { + QGuiApplication app(argc, argv); + + QQmlEngine engine; + QQmlContext *objectContext = new QQmlContext(engine.rootContext()); + + QQmlComponent component( + &engine, + QFileInfo::exists("qrc:/qml/Window.qml") ? + "qrc:/qml/Window.qml" : "src/qml/Window.qml" + ); + component.create(objectContext); + + return app.exec(); +} diff --git a/src/matrix_client.py b/src/matrix_client.py deleted file mode 100644 index 022b1a2f..00000000 --- a/src/matrix_client.py +++ /dev/null @@ -1,124 +0,0 @@ -import asyncio -import inspect -import platform -from contextlib import suppress -from typing import Optional - -import nio - -from . import __about__ -from .events import rooms, users - - -class MatrixClient(nio.AsyncClient): - def __init__(self, - user: str, - homeserver: str = "https://matrix.org", - device_id: Optional[str] = None) -> None: - - # TODO: ensure homeserver starts with a scheme:// - self.sync_task: Optional[asyncio.Task] = None - super().__init__(homeserver=homeserver, user=user, device_id=device_id) - - self.connect_callbacks() - - - def __repr__(self) -> str: - return "%s(user_id=%r, homeserver=%r, device_id=%r)" % ( - type(self).__name__, self.user_id, self.homeserver, self.device_id - ) - - - def connect_callbacks(self) -> None: - for name in dir(nio.responses): - if name.startswith("_"): - continue - - obj = getattr(nio.responses, name) - if inspect.isclass(obj) and issubclass(obj, nio.Response): - with suppress(AttributeError): - self.add_response_callback(getattr(self, f"on{name}"), obj) - - - async def start_syncing(self) -> None: - self.sync_task = asyncio.ensure_future( # type: ignore - self.sync_forever(timeout=10_000) - ) - - - @property - def default_device_name(self) -> str: - os_ = f" on {platform.system()}".rstrip() - os_ = f"{os_} {platform.release()}".rstrip() if os_ != " on" else "" - return f"{__about__.__pretty_name__}{os_}" - - - async def login(self, password: str) -> None: - response = await super().login(password, self.default_device_name) - - if isinstance(response, nio.LoginError): - print(response) - else: - await self.start_syncing() - - - async def resume(self, user_id: str, token: str, device_id: str) -> None: - self.receive_response(nio.LoginResponse(user_id, device_id, token)) - await self.start_syncing() - - - async def logout(self) -> None: - if self.sync_task: - self.sync_task.cancel() - with suppress(asyncio.CancelledError): - await self.sync_task - - await self.close() - - - async def request_user_update_event(self, user_id: str) -> None: - response = await self.get_profile(user_id) - - users.UserUpdated( - user_id = user_id, - display_name = response.displayname, - avatar_url = response.avatar_url, - status_message = None, # TODO - ) - - - # Callbacks for nio responses - - async def onSyncResponse(self, response: nio.SyncResponse) -> None: - for room_id in response.rooms.invite: - room: nio.rooms.MatrixRoom = self.invited_rooms[room_id] - - rooms.RoomUpdated( - user_id = self.user_id, - category = "Invites", - room_id = room_id, - display_name = room.display_name, - avatar_url = room.gen_avatar_url, - topic = room.topic, - inviter = room.inviter, - ) - - for room_id in response.rooms.join: - room = self.rooms[room_id] - - rooms.RoomUpdated( - user_id = self.user_id, - category = "Rooms", - room_id = room_id, - display_name = room.display_name, - avatar_url = room.gen_avatar_url, - topic = room.topic, - ) - - for room_id in response.rooms.left: - rooms.RoomUpdated( - user_id = self.user_id, - category = "Left", - room_id = room_id, - # left_event TODO - ) diff --git a/src/__about__.py b/src/python/__about__.py similarity index 100% rename from src/__about__.py rename to src/python/__about__.py diff --git a/src/__init__.py b/src/python/__init__.py similarity index 100% rename from src/__init__.py rename to src/python/__init__.py diff --git a/src/app.py b/src/python/app.py similarity index 75% rename from src/app.py rename to src/python/app.py index 2fed9cf3..6a34bbcd 100644 --- a/src/app.py +++ b/src/python/app.py @@ -1,4 +1,5 @@ import asyncio +import signal from concurrent.futures import Future from pathlib import Path from threading import Thread @@ -15,31 +16,16 @@ class App: def __init__(self) -> None: self.appdirs = AppDirs(appname=__about__.__pkg_name__, roaming=True) - self.backend = None + from .backend import Backend + self.backend = Backend(app=self) self.loop = asyncio.get_event_loop() self.loop_thread = Thread(target=self._loop_starter) self.loop_thread.start() - def start(self, cli_flags: Sequence[str] = ()) -> bool: - debug = False - - if "-d" in cli_flags or "--debug" in cli_flags: - self.run_in_loop(self._exit_on_app_file_change()) - debug = True - - from .backend import Backend - self.backend = Backend(app=self) # type: ignore - - return debug - - - async def _exit_on_app_file_change(self) -> None: - from watchgod import awatch - - async for _ in awatch(Path(__file__).resolve().parent): - ExitRequested(231) + def is_debug_on(self, cli_flags: Sequence[str] = ()) -> bool: + return "-d" in cli_flags or "--debug" in cli_flags def _loop_starter(self) -> None: @@ -74,7 +60,7 @@ class App: name: str, args: Optional[List[str]] = None, kwargs: Optional[Dict[str, Any]] = None) -> str: - client = self.backend.clients[account_id] # type: ignore + client = self.backend.clients[account_id] return self._call_coro( getattr(client, name)(*args or [], **kwargs or {}) ) @@ -85,14 +71,19 @@ class App: ad = additional_data rl = self.run_in_loop ba = self.backend - cl = self.backend.clients # type: ignore + cl = self.backend.clients tcl = lambda user: cl[f"@test_{user}:matrix.org"] import json jd = lambda obj: print(json.dumps(obj, indent=4, ensure_ascii=False)) - import pdb - pdb.set_trace() + print("\n=> Run `socat readline tcp:127.0.0.1:4444` in a terminal " + "to connect to pdb.") + import remote_pdb + remote_pdb.RemotePdb("127.0.0.1", 4444).set_trace() +# Make CTRL-C work again +signal.signal(signal.SIGINT, signal.SIG_DFL) + APP = App() diff --git a/src/backend.py b/src/python/backend.py similarity index 90% rename from src/backend.py rename to src/python/backend.py index ca2c75b6..f9fe3c4e 100644 --- a/src/backend.py +++ b/src/python/backend.py @@ -1,7 +1,7 @@ import asyncio import json from pathlib import Path -from typing import Any, Dict, Optional, Tuple +from typing import Dict, Optional, Tuple from atomicfile import AtomicFile @@ -29,13 +29,14 @@ class Backend: user: str, password: str, device_id: Optional[str] = None, - homeserver: str = "https://matrix.org") -> None: + homeserver: str = "https://matrix.org") -> str: client = MatrixClient( user=user, homeserver=homeserver, device_id=device_id ) await client.login(password) self.clients[client.user_id] = client users.AccountUpdated(client.user_id) + return client.user_id async def resume_client(self, @@ -98,13 +99,15 @@ class Backend: )) - async def save_account(self, client: MatrixClient) -> None: + async def save_account(self, user_id: str) -> None: + client = self.clients[user_id] + await self._write_config({ **self.saved_accounts, - client.userId: { - "hostname": client.nio.host, - "token": client.nio.access_token, - "device_id": client.nio.device_id, + client.user_id: { + "homeserver": client.homeserver, + "token": client.access_token, + "device_id": client.device_id, } }) @@ -119,7 +122,7 @@ class Backend: async def _write_config(self, accounts: SavedAccounts) -> None: js = json.dumps(accounts, indent=4, ensure_ascii=False, sort_keys=True) - with CONFIG_LOCK: + async with CONFIG_LOCK: self.saved_accounts_path.parent.mkdir(parents=True, exist_ok=True) with AtomicFile(self.saved_accounts_path, "w") as new: diff --git a/src/events/__init__.py b/src/python/events/__init__.py similarity index 100% rename from src/events/__init__.py rename to src/python/events/__init__.py diff --git a/src/events/app.py b/src/python/events/app.py similarity index 100% rename from src/events/app.py rename to src/python/events/app.py diff --git a/src/events/event.py b/src/python/events/event.py similarity index 100% rename from src/events/event.py rename to src/python/events/event.py diff --git a/src/events/rooms.py b/src/python/events/rooms.py similarity index 100% rename from src/events/rooms.py rename to src/python/events/rooms.py diff --git a/src/python/events/rooms_timeline.py b/src/python/events/rooms_timeline.py new file mode 100644 index 00000000..6679b647 --- /dev/null +++ b/src/python/events/rooms_timeline.py @@ -0,0 +1,32 @@ +from datetime import datetime +from enum import auto + +from dataclasses import dataclass, field + +from .event import AutoStrEnum, Event + + +class EventType(AutoStrEnum): + text = auto() + html = auto() + file = auto() + image = auto() + audio = auto() + video = auto() + location = auto() + notice = auto() + + +@dataclass +class TimelineEvent(Event): + type: EventType = field() + room_id: str = field() + event_id: str = field() + sender_id: str = field() + date: datetime = field() + is_local_echo: bool = field() + + +@dataclass +class HtmlMessageReceived(TimelineEvent): + content: str = field() diff --git a/src/events/users.py b/src/python/events/users.py similarity index 100% rename from src/events/users.py rename to src/python/events/users.py diff --git a/src/python/html_filter.py b/src/python/html_filter.py new file mode 100644 index 00000000..13c59f22 --- /dev/null +++ b/src/python/html_filter.py @@ -0,0 +1,153 @@ +# Copyright 2019 miruka +# This file is part of harmonyqml, licensed under GPLv3. + +import re + +import mistune +from lxml.html import HtmlElement, etree # nosec + +import html_sanitizer.sanitizer as sanitizer + + +class HtmlFilter: + link_regexes = [re.compile(r, re.IGNORECASE) for r in [ + (r"(?P.+://(?P[a-z0-9._-]+)(?:/[/\-_.,a-z0-9%&?;=~]*)?" + r"(?:\([/\-_.,a-z0-9%&?;=~]*\))?)"), + r"mailto:(?P[a-z0-9._-]+@(?P[a-z0-9_.-]+[a-z]))", + r"tel:(?P[0-9+-]+)(?P)", + r"(?Pmagnet:\?xt=urn:[a-z0-9]+:.+)(?P)", + ]] + + + def __init__(self) -> None: + self._sanitizer = sanitizer.Sanitizer(self.sanitizer_settings) + + # The whitespace remover doesn't take
 into account
+        sanitizer.normalize_overall_whitespace         = lambda html: html
+        sanitizer.normalize_whitespace_in_text_or_tail = lambda el: el
+
+        # hard_wrap: convert all \n to 
without required two spaces + self._markdown_to_html = mistune.Markdown(hard_wrap=True) + + + def from_markdown(self, text: str) -> str: + return self.filter(self._markdown_to_html(text)) + + + def filter(self, html: str) -> str: + html = self._sanitizer.sanitize(html) + tree = etree.fromstring(html, parser=etree.HTMLParser()) + + if tree is None: + return "" + + for el in tree.iter("img"): + el = self._wrap_img_in_a(el) + + for el in tree.iter("a"): + el = self._append_img_to_a(el) + + result = b"".join((etree.tostring(el, encoding="utf-8") + for el in tree[0].iterchildren())) + + return str(result, "utf-8") + + + @property + def sanitizer_settings(self) -> dict: + # https://matrix.org/docs/spec/client_server/latest.html#m-room-message-msgtypes + return { + "tags": { + # TODO: mx-reply, audio, video + "font", "h1", "h2", "h3", "h4", "h5", "h6", + "blockquote", "p", "a", "ul", "ol", "sup", "sub", "li", + "b", "i", "s", "u", "code", "hr", "br", + "table", "thead", "tbody", "tr", "th", "td", + "pre", "img", + }, + "attributes": { + # TODO: translate font attrs to qt html subset + "font": {"data-mx-bg-color", "data-mx-color"}, + "a": {"href"}, + "img": {"width", "height", "alt", "title", "src"}, + "ol": {"start"}, + "code": {"class"}, + }, + "empty": {"hr", "br", "img"}, + "separate": { + "a", "p", "li", "table", "tr", "th", "td", "br", "hr" + }, + "whitespace": {}, + "add_nofollow": False, + "autolink": { # FIXME: arg dict not working + "link_regexes": self.link_regexes, + "avoid_hosts": [], + }, + "sanitize_href": lambda href: href, + "element_preprocessors": [ + sanitizer.bold_span_to_strong, + sanitizer.italic_span_to_em, + sanitizer.tag_replacer("strong", "b"), + sanitizer.tag_replacer("em", "i"), + sanitizer.tag_replacer("strike", "s"), + sanitizer.tag_replacer("del", "s"), + sanitizer.tag_replacer("span", "font"), + self._remove_empty_font, + sanitizer.tag_replacer("form", "p"), + sanitizer.tag_replacer("div", "p"), + sanitizer.tag_replacer("caption", "p"), + sanitizer.target_blank_noopener, + ], + "element_postprocessors": [], + "is_mergeable": lambda e1, e2: e1.attrib == e2.attrib, + } + + + def _remove_empty_font(self, el: HtmlElement) -> HtmlElement: + if el.tag != "font": + return el + + if not self.sanitizer_settings["attributes"]["font"] & set(el.keys()): + el.clear() + + return el + + + def _wrap_img_in_a(self, el: HtmlElement) -> HtmlElement: + link = el.attrib.get("src", "") + width = el.attrib.get("width", "256") + height = el.attrib.get("height", "256") + + if el.getparent().tag == "a" or el.tag != "img" or \ + not self._is_image_path(link): + return el + + el.tag = "a" + el.attrib.clear() + el.attrib["href"] = link + el.append(etree.Element("img", src=link, width=width, height=height)) + return el + + + def _append_img_to_a(self, el: HtmlElement) -> HtmlElement: + link = el.attrib.get("href", "") + + if not (el.tag == "a" and self._is_image_path(link)): + return el + + for _ in el.iter("img"): # if the
already has an child + return el + + el.append(etree.Element("br")) + el.append(etree.Element("img", src=link, width="256", height="256")) + return el + + + @staticmethod + def _is_image_path(link: str) -> bool: + return bool(re.match( + r".+\.(jpg|jpeg|png|gif|bmp|webp|tiff|svg)$", link, re.IGNORECASE + )) + + +HTML_FILTER = HtmlFilter() diff --git a/src/python/matrix_client.py b/src/python/matrix_client.py new file mode 100644 index 00000000..63127afd --- /dev/null +++ b/src/python/matrix_client.py @@ -0,0 +1,182 @@ +import asyncio +import inspect +import logging as log +import platform +from contextlib import suppress +from datetime import datetime +from types import ModuleType +from typing import Dict, Optional, Type + +import nio + +from . import __about__ +from .events import rooms, users +from .events.rooms_timeline import EventType, HtmlMessageReceived +from .html_filter import HTML_FILTER + + +class MatrixClient(nio.AsyncClient): + def __init__(self, + user: str, + homeserver: str = "https://matrix.org", + device_id: Optional[str] = None) -> None: + + # TODO: ensure homeserver starts with a scheme:// + self.sync_task: Optional[asyncio.Future] = None + super().__init__(homeserver=homeserver, user=user, device_id=device_id) + + self.connect_callbacks() + + + def __repr__(self) -> str: + return "%s(user_id=%r, homeserver=%r, device_id=%r)" % ( + type(self).__name__, self.user_id, self.homeserver, self.device_id + ) + + + @staticmethod + def _classes_defined_in(module: ModuleType) -> Dict[str, Type]: + return { + m[0]: m[1] for m in inspect.getmembers(module, inspect.isclass) + if not m[0].startswith("_") and + m[1].__module__.startswith(module.__name__) + } + + + def connect_callbacks(self) -> None: + for name, class_ in self._classes_defined_in(nio.responses).items(): + with suppress(AttributeError): + self.add_response_callback(getattr(self, f"on{name}"), class_) + + # TODO: get this implemented in AsyncClient + # for name, class_ in self._classes_defined_in(nio.events).items(): + # with suppress(AttributeError): + # self.add_event_callback(getattr(self, f"on{name}"), class_) + + + async def start_syncing(self) -> None: + self.sync_task = asyncio.ensure_future( + self.sync_forever(timeout=10_000) + ) + + def callback(task): + raise task.exception() + + self.sync_task.add_done_callback(callback) + + + @property + def default_device_name(self) -> str: + os_ = f" on {platform.system()}".rstrip() + os_ = f"{os_} {platform.release()}".rstrip() if os_ != " on" else "" + return f"{__about__.__pretty_name__}{os_}" + + + async def login(self, password: str) -> None: + response = await super().login(password, self.default_device_name) + + if isinstance(response, nio.LoginError): + print(response) + else: + await self.start_syncing() + + + async def resume(self, user_id: str, token: str, device_id: str) -> None: + response = nio.LoginResponse(user_id, device_id, token) + await self.receive_response(response) + await self.start_syncing() + + + async def logout(self) -> None: + if self.sync_task: + self.sync_task.cancel() + with suppress(asyncio.CancelledError): + await self.sync_task + + await self.close() + + + async def request_user_update_event(self, user_id: str) -> None: + response = await self.get_profile(user_id) + + if isinstance(response, nio.ProfileGetError): + log.warning("Error getting profile for %r: %s", user_id, response) + + users.UserUpdated( + user_id = user_id, + display_name = getattr(response, "displayname", None), + avatar_url = getattr(response, "avatar_url", None), + status_message = None, # TODO + ) + + + # Callbacks for nio responses + + @staticmethod + def _get_room_name(room: nio.rooms.MatrixRoom) -> Optional[str]: + # FIXME: reimplanted because of nio's non-standard room.display_name + name = room.name or room.canonical_alias + if name: + return name + + name = room.group_name() + return None if name == "Empty room?" else name + + + async def onSyncResponse(self, resp: nio.SyncResponse) -> None: + for room_id, info in resp.rooms.invite.items(): + room: nio.rooms.MatrixRoom = self.invited_rooms[room_id] + + rooms.RoomUpdated( + user_id = self.user_id, + category = "Invites", + room_id = room_id, + display_name = self._get_room_name(room), + avatar_url = room.gen_avatar_url, + topic = room.topic, + inviter = room.inviter, + ) + + for room_id, info in resp.rooms.join.items(): + room = self.rooms[room_id] + + rooms.RoomUpdated( + user_id = self.user_id, + category = "Rooms", + room_id = room_id, + display_name = self._get_room_name(room), + avatar_url = room.gen_avatar_url, + topic = room.topic, + ) + + asyncio.gather(*( + getattr(self, f"on{type(ev).__name__}")(room_id, ev) + for ev in info.timeline.events + if hasattr(self, f"on{type(ev).__name__}") + )) + + for room_id, info in resp.rooms.leave.items(): + rooms.RoomUpdated( + user_id = self.user_id, + category = "Left", + room_id = room_id, + # left_event TODO + ) + + + # Callbacks for nio events + + async def onRoomMessageText(self, room_id: str, ev: nio.RoomMessageText + ) -> None: + is_html = ev.format == "org.matrix.custom.html" + filter_ = HTML_FILTER.filter + + HtmlMessageReceived( + type = EventType.html if is_html else EventType.text, + room_id = room_id, + event_id = ev.event_id, + sender_id = ev.sender, + date = datetime.fromtimestamp(ev.server_timestamp / 1000), + is_local_echo = False, + content = filter_(ev.formatted_body) if is_html else ev.body, + ) diff --git a/src/qml/Base/HAvatar.qml b/src/qml/Base/HAvatar.qml index be97d8cd..7c3205fc 100644 --- a/src/qml/Base/HAvatar.qml +++ b/src/qml/Base/HAvatar.qml @@ -7,7 +7,14 @@ Rectangle { property int dimension: HStyle.avatar.size property bool hidden: false - function hue_from_name(name) { + function stripUserId(user_id) { + return user_id.substring(1) // Remove leading @ + } + function stripRoomName(name) { + return name[0] == "#" ? name.substring(1) : name + } + + function hueFromName(name) { var hue = 0 for (var i = 0; i < name.length; i++) { hue += name.charCodeAt(i) * 99 @@ -24,7 +31,7 @@ Rectangle { color: name ? Qt.hsla( - hue_from_name(name), + hueFromName(name), HStyle.avatar.background.saturation, HStyle.avatar.background.lightness, HStyle.avatar.background.alpha diff --git a/src/qml/Base/HButton.qml b/src/qml/Base/HButton.qml index 755b7214..cbb00ad2 100644 --- a/src/qml/Base/HButton.qml +++ b/src/qml/Base/HButton.qml @@ -32,11 +32,6 @@ Button { signal pressed signal released - function loadingUntilFutureDone(future) { - loading = true - future.onGotResult.connect(function() { loading = false }) - } - id: button background: Rectangle { diff --git a/src/qml/Base/HListModel.qml b/src/qml/Base/HListModel.qml index 44536ea9..18384ece 100644 --- a/src/qml/Base/HListModel.qml +++ b/src/qml/Base/HListModel.qml @@ -1,85 +1,112 @@ import QtQuick 2.7 +import SortFilterProxyModel 0.2 -ListModel { +SortFilterProxyModel { // To initialize a HListModel with items, // use `Component.onCompleted: extend([{"foo": 1, "bar": 2}, ...])` - id: listModel + id: sortFilteredModel + + property var model: ListModel {} + sourceModel: model // Can't assign a "ListModel {}" directly here + + function append(dict) { return model.append(dict) } + function clear() { return model.clear() } + function insert(index, dict) { return model.inset(index, dict) } + function move(from, to, n) { return model.move(from, to, n) } + function remove(index, count) { return model.remove(index, count) } + function set(index, dict) { return model.set(index, dict) } + function sync() { return model.sync() } + function setProperty(index, prop, value) { + return model.setProperty(index, prop, value) + } function extend(new_items) { for (var i = 0; i < new_items.length; i++) { - listModel.append(new_items[i]) + model.append(new_items[i]) } } - function getIndices(where_role, is, max) { // max: undefined or int + function getIndices(where_roles_are, max_results, max_tries) { + // max arguments: unefined or int var results = [] - for (var i = 0; i < listModel.count; i++) { - if (listModel.get(i)[where_role] == is) { - results.push(i) + for (var i = 0; i < model.count; i++) { + var item = model.get(i) + var include = true - if (max && results.length >= max) { + for (var role in where_roles_are) { + if (item[role] != where_roles_are[role]) { + include = false break } } + + if (include) { + results.push(i) + if (max_results && results.length >= max_results) { + break + } + } + + if (max_tries && i >= max_tries) { + break + } } return results } - function getWhere(where_role, is, max) { - var indices = getIndices(where_role, is, max) - var results = [] + function getWhere(roles_are, max_results, max_tries) { + var indices = getIndices(roles_are, max_results, max_tries) + var items = [] for (var i = 0; i < indices.length; i++) { - results.push(listModel.get(indices[i])) + items.push(model.get(indices[i])) } - return results + return items } - function forEachWhere(where_role, is, max, func) { - var items = getWhere(where_role, is, max) + function forEachWhere(roles_are, func, max_results, max_tries) { + var items = getWhere(roles_are, max_results, max_tries) for (var i = 0; i < items.length; i++) { - func(item) + func(items[i]) } } - function upsert(where_role, is, new_item, update_if_exist) { - // new_item can contain only the keys we're interested in updating - - var indices = getIndices(where_role, is, 1) + function upsert(where_roles_are, new_item, update_if_exist, max_tries) { + var indices = getIndices(where_roles_are, 1, max_tries) if (indices.length == 0) { - listModel.append(new_item) - return listModel.get(listModel.count) + model.append(new_item) + return model.get(model.count) } if (update_if_exist != false) { - listModel.set(indices[0], new_item) + model.set(indices[0], new_item) } - return listModel.get(indices[0]) + return model.get(indices[0]) } function pop(index) { - var item = listModel.get(index) - listModel.remove(index) + var item = model.get(index) + model.remove(index) return item } - function popWhere(where_role, is, max) { - var indices = getIndices(where_role, is, max) - var results = [] + function popWhere(roles_are, max_results, max_tries) { + var indices = getIndices(roles_are, max_results, max_tries) + var items = [] for (var i = 0; i < indices.length; i++) { - results.push(listModel.get(indices[i])) - listModel.remove(indices[i]) + items.push(model.get(indices[i])) + model.remove(indices[i]) } - return results + return items } function toObject(item_list) { - item_list = item_list || listModel + item_list = item_list || sortFilteredModel var obj_list = [] for (var i = 0; i < item_list.count; i++) { diff --git a/src/qml/Chat/Banners/InviteBanner.qml b/src/qml/Chat/Banners/InviteBanner.qml index ba522031..37811ae4 100644 --- a/src/qml/Chat/Banners/InviteBanner.qml +++ b/src/qml/Chat/Banners/InviteBanner.qml @@ -6,6 +6,7 @@ Banner { color: HStyle.chat.inviteBanner.background + // TODO: get disp name from models.users, inviter = userid now avatar.name: inviter ? inviter.displayname : "" //avatar.imageUrl: inviter ? inviter.avatar_url : "" diff --git a/src/qml/Chat/Chat.qml b/src/qml/Chat/Chat.qml index 6bc5cdb0..ccaec67d 100644 --- a/src/qml/Chat/Chat.qml +++ b/src/qml/Chat/Chat.qml @@ -10,27 +10,27 @@ HColumnLayout { property string category: "" property string roomId: "" - readonly property var roomInfo: - Backend.accounts.get(userId) - .roomCategories.get(category) - .rooms.get(roomId) + readonly property var roomInfo: models.rooms.getWhere( + {"userId": userId, "roomId": roomId, "category": category}, 1 + )[0] - readonly property var sender: Backend.users.get(userId) + readonly property var sender: + models.users.getWhere({"userId": userId}, 1)[0] - readonly property bool hasUnknownDevices: - category == "Rooms" ? - Backend.clients.get(userId).roomHasUnknownDevices(roomId) : false + readonly property bool hasUnknownDevices: false + //category == "Rooms" ? + //Backend.clients.get(userId).roomHasUnknownDevices(roomId) : false id: chatPage onFocusChanged: sendBox.setFocus() - Component.onCompleted: Backend.signals.roomCategoryChanged.connect( - function(forUserId, forRoomId, previous, now) { - if (chatPage && forUserId == userId && forRoomId == roomId) { - chatPage.category = now - } - } - ) + //Component.onCompleted: Backend.signals.roomCategoryChanged.connect( + //function(forUserId, forRoomId, previous, now) { + //if (chatPage && forUserId == userId && forRoomId == roomId) { + //chatPage.category = now + //} + //} + //) RoomHeader { id: roomHeader @@ -77,72 +77,72 @@ HColumnLayout { } } - RoomSidePane { - id: roomSidePane +// RoomSidePane { + //id: roomSidePane - activeView: roomHeader.activeButton - property int oldWidth: width - onActiveViewChanged: - activeView ? restoreAnimation.start() : hideAnimation.start() + //activeView: roomHeader.activeButton + //property int oldWidth: width + //onActiveViewChanged: + //activeView ? restoreAnimation.start() : hideAnimation.start() - NumberAnimation { - id: hideAnimation - target: roomSidePane - properties: "width" - duration: HStyle.animationDuration - from: target.width - to: 0 + //NumberAnimation { + //id: hideAnimation + //target: roomSidePane + //properties: "width" + //duration: HStyle.animationDuration + //from: target.width + //to: 0 - onStarted: { - target.oldWidth = target.width - target.Layout.minimumWidth = 0 - } - } + //onStarted: { + //target.oldWidth = target.width + //target.Layout.minimumWidth = 0 + //} + //} - NumberAnimation { - id: restoreAnimation - target: roomSidePane - properties: "width" - duration: HStyle.animationDuration - from: 0 - to: target.oldWidth + //NumberAnimation { + //id: restoreAnimation + //target: roomSidePane + //properties: "width" + //duration: HStyle.animationDuration + //from: 0 + //to: target.oldWidth - onStopped: target.Layout.minimumWidth = Qt.binding( - function() { return HStyle.avatar.size } - ) - } + //onStopped: target.Layout.minimumWidth = Qt.binding( + //function() { return HStyle.avatar.size } + //) + //} - collapsed: width < HStyle.avatar.size + 8 + //collapsed: width < HStyle.avatar.size + 8 - property bool wasSnapped: false - property int referenceWidth: roomHeader.buttonsWidth - onReferenceWidthChanged: { - if (chatSplitView.canAutoSize || wasSnapped) { - if (wasSnapped) { chatSplitView.canAutoSize = true } - width = referenceWidth - } - } + //property bool wasSnapped: false + //property int referenceWidth: roomHeader.buttonsWidth + //onReferenceWidthChanged: { + //if (chatSplitView.canAutoSize || wasSnapped) { + //if (wasSnapped) { chatSplitView.canAutoSize = true } + //width = referenceWidth + //} + //} - property int currentWidth: width - onCurrentWidthChanged: { - if (referenceWidth != width && - referenceWidth - 15 < width && - width < referenceWidth + 15) - { - currentWidth = referenceWidth - width = referenceWidth - wasSnapped = true - currentWidth = Qt.binding( - function() { return roomSidePane.width } - ) - } else { - wasSnapped = false - } - } + //property int currentWidth: width + //onCurrentWidthChanged: { + //if (referenceWidth != width && + //referenceWidth - 15 < width && + //width < referenceWidth + 15) + //{ + //currentWidth = referenceWidth + //width = referenceWidth + //wasSnapped = true + //currentWidth = Qt.binding( + //function() { return roomSidePane.width } + //) + //} else { + //wasSnapped = false + //} + //} - width: referenceWidth // Initial width - Layout.minimumWidth: HStyle.avatar.size - Layout.maximumWidth: parent.width - } + //width: referenceWidth // Initial width + //Layout.minimumWidth: HStyle.avatar.size + //Layout.maximumWidth: parent.width + //} } } diff --git a/src/qml/Chat/RoomEventList/Daybreak.qml b/src/qml/Chat/RoomEventList/Daybreak.qml index fd1da83a..71319dbd 100644 --- a/src/qml/Chat/RoomEventList/Daybreak.qml +++ b/src/qml/Chat/RoomEventList/Daybreak.qml @@ -2,7 +2,7 @@ import QtQuick 2.7 import "../../Base" HNoticePage { - text: dateTime.toLocaleDateString() + text: model.date.toLocaleDateString() color: HStyle.chat.daybreak.foreground backgroundColor: HStyle.chat.daybreak.background radius: HStyle.chat.daybreak.radius diff --git a/src/qml/Chat/RoomEventList/EventContent.qml b/src/qml/Chat/RoomEventList/EventContent.qml index 5b3fdd6e..3ecb92a5 100644 --- a/src/qml/Chat/RoomEventList/EventContent.qml +++ b/src/qml/Chat/RoomEventList/EventContent.qml @@ -16,7 +16,7 @@ Row { HAvatar { id: avatar - name: sender.displayName.value + name: sender.displayName || stripUserId(sender.userId) hidden: combine dimension: 28 } diff --git a/src/qml/Chat/RoomEventList/MessageContent.qml b/src/qml/Chat/RoomEventList/MessageContent.qml index 41f3bd17..c03f3579 100644 --- a/src/qml/Chat/RoomEventList/MessageContent.qml +++ b/src/qml/Chat/RoomEventList/MessageContent.qml @@ -10,7 +10,7 @@ Row { HAvatar { id: avatar hidden: combine - name: sender.displayName.value + name: senderInfo.displayName || stripUserId(model.senderId) dimension: 48 } @@ -38,8 +38,8 @@ Row { visible: height > 0 id: nameLabel - text: sender.displayName.value - color: Qt.hsla(Backend.hueFromString(text), + text: senderInfo.displayName || model.senderId + color: Qt.hsla(avatar.hueFromName(avatar.name), HStyle.displayName.saturation, HStyle.displayName.lightness, 1) @@ -56,17 +56,16 @@ Row { width: parent.width id: contentLabel - text: (dict.formatted_body ? - Backend.htmlFilter.filter(dict.formatted_body) : - dict.body) + + text: model.content + "  " + - Qt.formatDateTime(dateTime, "hh:mm:ss") + + Qt.formatDateTime(model.date, "hh:mm:ss") + "" + - (isLocalEcho ? + (model.isLocalEcho ? " " : "") - textFormat: Text.RichText + textFormat: model.type == "text" ? + Text.PlainText : Text.RichText color: HStyle.chat.message.body wrapMode: Text.Wrap diff --git a/src/qml/Chat/RoomEventList/RoomEventDelegate.qml b/src/qml/Chat/RoomEventList/RoomEventDelegate.qml index 3fb19ade..b81d4556 100644 --- a/src/qml/Chat/RoomEventList/RoomEventDelegate.qml +++ b/src/qml/Chat/RoomEventList/RoomEventDelegate.qml @@ -1,7 +1,6 @@ import QtQuick 2.7 import QtQuick.Layouts 1.3 import "../../Base" -import "../utils.js" as ChatJS Column { id: roomEventDelegate @@ -10,46 +9,47 @@ Column { return Math.round((((date2 - date1) % 86400000) % 3600000) / 60000) } - function getIsMessage(type_) { return type_.startsWith("RoomMessage") } - function getPreviousItem() { return index < roomEventListView.model.count - 1 ? roomEventListView.model.get(index + 1) : null } + function getIsMessage(type) { + return true + } + property var previousItem: getPreviousItem() signal reloadPreviousItem() onReloadPreviousItem: previousItem = getPreviousItem() - readonly property bool isMessage: getIsMessage(type) + property var senderInfo: null + Component.onCompleted: + senderInfo = models.users.getUser(chatPage.userId, senderId) - readonly property bool isUndecryptableEvent: - type === "OlmEvent" || type === "MegolmEvent" + //readonly property bool isMessage: ! model.type.match(/^event.*/) + readonly property bool isMessage: getIsMessage(model.type) - readonly property var sender: Backend.users.get(dict.sender) + readonly property bool isOwn: chatPage.userId === senderId - readonly property bool isOwn: - chatPage.userId === dict.sender - - readonly property bool isFirstEvent: type == "RoomCreateEvent" + readonly property bool isFirstEvent: model.type == "eventCreate" readonly property bool combine: previousItem && ! talkBreak && ! dayBreak && getIsMessage(previousItem.type) === isMessage && - previousItem.dict.sender === dict.sender && - minsBetween(previousItem.dateTime, dateTime) <= 5 + previousItem.senderId === senderId && + minsBetween(previousItem.date, model.date) <= 5 readonly property bool dayBreak: isFirstEvent || previousItem && - dateTime.getDate() != previousItem.dateTime.getDate() + model.date.getDate() != previousItem.date.getDate() readonly property bool talkBreak: previousItem && ! dayBreak && - minsBetween(previousItem.dateTime, dateTime) >= 20 + minsBetween(previousItem.date, model.date) >= 20 property int standardSpacing: 16 diff --git a/src/qml/Chat/RoomEventList/RoomEventList.qml b/src/qml/Chat/RoomEventList/RoomEventList.qml index a467d0e8..a26eaafe 100644 --- a/src/qml/Chat/RoomEventList/RoomEventList.qml +++ b/src/qml/Chat/RoomEventList/RoomEventList.qml @@ -1,4 +1,5 @@ import QtQuick 2.7 +import SortFilterProxyModel 0.2 import "../../Base" HRectangle { @@ -8,10 +9,19 @@ HRectangle { HListView { id: roomEventListView - delegate: RoomEventDelegate {} - model: Backend.roomEvents.get(chatPage.roomId) clip: true + model: HListModel { + sourceModel: models.timelines + + filters: ValueFilter { + roleName: "roomId" + value: chatPage.roomId + } + } + + delegate: RoomEventDelegate {} + anchors.fill: parent anchors.leftMargin: space anchors.rightMargin: space @@ -29,7 +39,7 @@ HRectangle { onYPosChanged: { if (chatPage.category != "Invites" && yPos <= 0.1) { - Backend.loadPastEvents(chatPage.roomId) + //Backend.loadPastEvents(chatPage.roomId) } } } diff --git a/src/qml/Chat/RoomHeader.qml b/src/qml/Chat/RoomHeader.qml index 82265393..720570f7 100644 --- a/src/qml/Chat/RoomHeader.qml +++ b/src/qml/Chat/RoomHeader.qml @@ -3,7 +3,7 @@ import QtQuick.Layouts 1.3 import "../Base" HRectangle { - property string displayName: "" + property var displayName: "" property string topic: "" property alias buttonsImplicitWidth: viewButtons.implicitWidth @@ -22,7 +22,7 @@ HRectangle { HAvatar { id: avatar - name: displayName + name: stripRoomName(displayName) || qsTr("Empty room") dimension: roomHeader.height Layout.alignment: Qt.AlignTop } diff --git a/src/qml/Chat/RoomSidePane/MemberDelegate.qml b/src/qml/Chat/RoomSidePane/MemberDelegate.qml index 3803a525..bab34cb7 100644 --- a/src/qml/Chat/RoomSidePane/MemberDelegate.qml +++ b/src/qml/Chat/RoomSidePane/MemberDelegate.qml @@ -15,7 +15,7 @@ MouseArea { HAvatar { id: memberAvatar - name: member.displayName.value + name: member.displayName || stripUserId(member.userId) } HColumnLayout { diff --git a/src/qml/Chat/SendBox.qml b/src/qml/Chat/SendBox.qml index 0fadaede..3a70b92d 100644 --- a/src/qml/Chat/SendBox.qml +++ b/src/qml/Chat/SendBox.qml @@ -18,7 +18,7 @@ HRectangle { HAvatar { id: avatar - name: chatPage.sender.displayName.value + name: chatPage.sender.displayName || stripUserId(chatPage.userId) dimension: root.Layout.minimumHeight } diff --git a/src/qml/EventHandlers/rooms.js b/src/qml/EventHandlers/rooms.js index 5e137781..1d19410f 100644 --- a/src/qml/EventHandlers/rooms.js +++ b/src/qml/EventHandlers/rooms.js @@ -1,26 +1,28 @@ -function clientId(user_id, category, room_id) { - return user_id + " " + room_id + " " + category -} - - function onRoomUpdated(user_id, category, room_id, display_name, avatar_url, topic, last_event_date, inviter, left_event) { - var client_id = clientId(user_id, category, room_id) - var rooms = models.rooms + models.roomCategories.upsert({"userId": user_id, "name": category}, { + "userId": user_id, + "name": category + }) + + var rooms = models.rooms + + function roles(for_category) { + return {"userId": user_id, "roomId": room_id, "category": for_category} + } if (category == "Invites") { - rooms.popWhere("clientId", clientId(user_id, "Rooms", room_id)) - rooms.popWhere("clientId", clientId(user_id, "Left", room_id)) + rooms.popWhere(roles("Rooms"), 1) + rooms.popWhere(roles("Left"), 1) } else if (category == "Rooms") { - rooms.popWhere("clientId", clientId(user_id, "Invites", room_id)) - rooms.popWhere("clientId", clientId(user_id, "Left", room_id)) + rooms.popWhere(roles("Invites"), 1) + rooms.popWhere(roles("Left"), 1) } else if (category == "Left") { - var old_room = - rooms.popWhere("clientId", clientId(user_id, "Rooms", room_id)) || - rooms.popWhere("clientId", clientId(user_id, "Invites", room_id)) + var old_room = rooms.popWhere(roles("Invites"), 1)[0] || + rooms.popWhere(roles("Rooms"), 1)[0] if (old_room) { display_name = old_room.displayName @@ -30,8 +32,7 @@ function onRoomUpdated(user_id, category, room_id, display_name, avatar_url, } } - rooms.upsert("clientId", client_id , { - "clientId": client_id, + rooms.upsert(roles(category), { "userId": user_id, "category": category, "roomId": room_id, @@ -47,8 +48,8 @@ function onRoomUpdated(user_id, category, room_id, display_name, avatar_url, function onRoomDeleted(user_id, category, room_id) { - var client_id = clientId(user_id, category, room_id) - return models.rooms.popWhere("clientId", client_id, 1) + var roles = {"userId": user_id, "roomId": room_id, "category": category} + models.rooms.popWhere(roles, 1) } diff --git a/src/qml/EventHandlers/rooms_timeline.js b/src/qml/EventHandlers/rooms_timeline.js index e69de29b..f06889c7 100644 --- a/src/qml/EventHandlers/rooms_timeline.js +++ b/src/qml/EventHandlers/rooms_timeline.js @@ -0,0 +1,12 @@ +function onHtmlMessageReceived(type, room_id, event_id, sender_id, date, + is_local_echo, content) { + models.timelines.upsert({"eventId": event_id}, { + "type": type, + "roomId": room_id, + "eventId": event_id, + "senderId": sender_id, + "date": date, + "isLocalEcho": is_local_echo, + "content": content, + }, true, 1000) +} diff --git a/src/qml/EventHandlers/users.js b/src/qml/EventHandlers/users.js index 9322a97d..a0a6d658 100644 --- a/src/qml/EventHandlers/users.js +++ b/src/qml/EventHandlers/users.js @@ -2,18 +2,17 @@ function onAccountUpdated(user_id) { models.accounts.append({"userId": user_id}) } -function AccountDeleted(user_id) { - models.accounts.popWhere("userId", user_id, 1) +function onAccountDeleted(user_id) { + models.accounts.popWhere({"userId": user_id}, 1) } function onUserUpdated(user_id, display_name, avatar_url, status_message) { - models.users.upsert("userId", user_id, { + models.users.upsert({"userId": user_id}, { "userId": user_id, "displayName": display_name, "avatarUrl": avatar_url, "statusMessage": status_message }) - } function onDeviceUpdated(user_id, device_id, ed25519_key, trust, display_name, diff --git a/src/qml/Models.qml b/src/qml/Models.qml index 2aaac983..7fd22e4c 100644 --- a/src/qml/Models.qml +++ b/src/qml/Models.qml @@ -1,4 +1,5 @@ import QtQuick 2.7 +import SortFilterProxyModel 0.2 import "Base" QtObject { @@ -8,7 +9,7 @@ QtObject { function getUser(as_account_id, wanted_user_id) { wanted_user_id = wanted_user_id || as_account_id - var found = users.getWhere("userId", wanted_user_id, 1) + var found = users.getWhere({"userId": wanted_user_id}, 1) if (found.length > 0) { return found[0] } users.append({ @@ -22,13 +23,20 @@ QtObject { as_account_id, "request_user_update_event", [wanted_user_id] ) - return users.getWhere("userId", wanted_user_id, 1)[0] + return users.getWhere({"userId": wanted_user_id}, 1)[0] } } property HListModel devices: HListModel {} + property HListModel roomCategories: HListModel {} + property HListModel rooms: HListModel {} - property HListModel timelines: HListModel {} + property HListModel timelines: HListModel { + sorters: RoleSorter { + roleName: "date" + sortOrder: Qt.DescendingOrder + } + } } diff --git a/src/qml/Pages/RememberAccount.qml b/src/qml/Pages/RememberAccount.qml index a1a5f2ca..7542b0c8 100644 --- a/src/qml/Pages/RememberAccount.qml +++ b/src/qml/Pages/RememberAccount.qml @@ -4,7 +4,7 @@ import "../Base" Item { property string loginWith: "username" - property var client: null + property string userId: "" HInterfaceBox { id: rememberBox @@ -20,10 +20,13 @@ Item { buttonCallbacks: { "yes": function(button) { - Backend.clients.remember(client) + py.callCoro("save_account", [userId]) + pageStack.showPage("Default") + }, + "no": function(button) { + py.callCoro("forget_account", [userId]) pageStack.showPage("Default") }, - "no": function(button) { pageStack.showPage("Default") }, } HLabel { diff --git a/src/qml/Pages/SignIn.qml b/src/qml/Pages/SignIn.qml index f29fbafb..2a9e2347 100644 --- a/src/qml/Pages/SignIn.qml +++ b/src/qml/Pages/SignIn.qml @@ -4,7 +4,7 @@ import "../Base" Item { property string loginWith: "username" - onFocusChanged: identifierField.forceActiveFocus() + onFocusChanged: idField.forceActiveFocus() HInterfaceBox { id: signInBox @@ -23,15 +23,15 @@ Item { "register": function(button) {}, "login": function(button) { - var future = Backend.clients.new( - "matrix.org", identifierField.text, passwordField.text - ) - button.loadingUntilFutureDone(future) - future.onGotResult.connect(function(client) { + button.loading = true + var args = [idField.text, passwordField.text] + + py.callCoro("login_client", args, {}, function(user_id) { pageStack.showPage( "RememberAccount", - {"loginWith": loginWith, "client": client} + {"loginWith": loginWith, "userId": user_id} ) + button.loading = false }) }, @@ -58,7 +58,7 @@ Item { } HTextField { - id: identifierField + id: idField placeholderText: qsTr( loginWith === "email" ? "Email" : loginWith === "phone" ? "Phone" : diff --git a/src/qml/Python.qml b/src/qml/Python.qml index 2273f01e..c6810442 100644 --- a/src/qml/Python.qml +++ b/src/qml/Python.qml @@ -9,6 +9,7 @@ Python { property bool ready: false property var pendingCoroutines: ({}) + signal willLoadAccounts(bool will) property bool loadingAccounts: false function callCoro(name, args, kwargs, callback) { @@ -32,18 +33,20 @@ Python { } } - addImportPath("../..") - importNames("src", ["APP"], function() { - call("APP.start", [Qt.application.arguments], function(debug_on) { - window.debug = debug_on + addImportPath("src") + addImportPath("qrc:/") + importNames("python", ["APP"], function() { + call("APP.is_debug_on", [Qt.application.arguments], function(on) { + window.debug = on callCoro("has_saved_accounts", [], {}, function(has) { - loadingAccounts = has py.ready = true + willLoadAccounts(has) if (has) { + py.loadingAccounts = true py.callCoro("load_saved_accounts", [], {}, function() { - loadingAccounts = false + py.loadingAccounts = false }) } }) diff --git a/src/qml/SidePane/AccountDelegate.qml b/src/qml/SidePane/AccountDelegate.qml index 3a9ef467..8efa6bb2 100644 --- a/src/qml/SidePane/AccountDelegate.qml +++ b/src/qml/SidePane/AccountDelegate.qml @@ -20,7 +20,7 @@ Column { HAvatar { id: avatar - name: user.displayName + name: user.displayName || stripUserId(user.userId) } HColumnLayout { diff --git a/src/qml/SidePane/PaneToolBar.qml b/src/qml/SidePane/PaneToolBar.qml index 4cecb7f5..bdbb4ab2 100644 --- a/src/qml/SidePane/PaneToolBar.qml +++ b/src/qml/SidePane/PaneToolBar.qml @@ -4,6 +4,8 @@ import "../Base" HRowLayout { id: toolBar + property alias roomFilter: filterField.text + Layout.fillWidth: true Layout.preferredHeight: HStyle.bottomElementsHeight @@ -17,8 +19,6 @@ HRowLayout { placeholderText: qsTr("Filter rooms") backgroundColor: HStyle.sidePane.filterRooms.background - onTextChanged: Backend.setRoomFilter(text) - Layout.fillWidth: true Layout.preferredHeight: parent.height } diff --git a/src/qml/SidePane/RoomCategoriesList.qml b/src/qml/SidePane/RoomCategoriesList.qml index 0efd465c..35ad0755 100644 --- a/src/qml/SidePane/RoomCategoriesList.qml +++ b/src/qml/SidePane/RoomCategoriesList.qml @@ -1,11 +1,20 @@ import QtQuick 2.7 import QtQuick.Layouts 1.3 +import SortFilterProxyModel 0.2 import "../Base" HListView { property string userId: "" id: roomCategoriesList - model: Backend.accounts.get(userId).roomCategories + + model: SortFilterProxyModel { + sourceModel: models.roomCategories + filters: ValueFilter { + roleName: "userId" + value: userId + } + } + delegate: RoomCategoryDelegate {} } diff --git a/src/qml/SidePane/RoomDelegate.qml b/src/qml/SidePane/RoomDelegate.qml index 5d6dee7a..3cabce06 100644 --- a/src/qml/SidePane/RoomDelegate.qml +++ b/src/qml/SidePane/RoomDelegate.qml @@ -12,11 +12,11 @@ MouseArea { HRowLayout { width: parent.width - spacing: roomList.spacing + spacing: sidePane.normalSpacing HAvatar { id: roomAvatar - name: displayName + name: stripRoomName(displayName) || qsTr("Empty room") } HColumnLayout { @@ -35,27 +35,27 @@ MouseArea { Layout.maximumWidth: parent.width } - HLabel { - function getText() { - return SidePaneJS.getLastRoomEventText( - roomId, roomList.userId - ) - } + //HLabel { + //function getText() { + //return SidePaneJS.getLastRoomEventText( + //roomId, roomList.userId + //) + //} - property var lastEvTime: lastEventDateTime - onLastEvTimeChanged: subtitleLabel.text = getText() + //property var lastEvTime: lastEventDateTime + //onLastEvTimeChanged: subtitleLabel.text = getText() - id: subtitleLabel - visible: text !== "" - text: getText() - textFormat: Text.StyledText + //id: subtitleLabel + //visible: text !== "" + //text: getText() + //textFormat: Text.StyledText - font.pixelSize: HStyle.fontSize.small - elide: Text.ElideRight - maximumLineCount: 1 + //font.pixelSize: HStyle.fontSize.small + //elide: Text.ElideRight + //maximumLineCount: 1 - Layout.maximumWidth: parent.width - } + //Layout.maximumWidth: parent.width + //} } } } diff --git a/src/qml/SidePane/RoomList.qml b/src/qml/SidePane/RoomList.qml index 2e663933..cdfa6668 100644 --- a/src/qml/SidePane/RoomList.qml +++ b/src/qml/SidePane/RoomList.qml @@ -1,5 +1,6 @@ import QtQuick 2.7 import QtQuick.Layouts 1.3 +import SortFilterProxyModel 0.2 import "../Base" HListView { @@ -7,8 +8,37 @@ HListView { property string category: "" id: roomList - spacing: accountList.spacing - model: - Backend.accounts.get(userId).roomCategories.get(category).sortedRooms + spacing: sidePane.normalSpacing + + model: SortFilterProxyModel { + sourceModel: models.rooms + filters: AllOf { + ValueFilter { + roleName: "category" + value: category + } + + ValueFilter { + roleName: "userId" + value: userId + } + + ExpressionFilter { + expression: { + var filter = paneToolBar.roomFilter.toLowerCase() + var words = filter.split(" ") + var room_name = displayName.toLowerCase() + + for (var i = 0; i < words.length; i++) { + if (words[i] && room_name.indexOf(words[i]) == -1) { + return false + } + } + return true + } + } + } + } + delegate: RoomDelegate {} } diff --git a/src/qml/SidePane/SidePane.qml b/src/qml/SidePane/SidePane.qml index c6f9a20b..7ae95211 100644 --- a/src/qml/SidePane/SidePane.qml +++ b/src/qml/SidePane/SidePane.qml @@ -15,16 +15,18 @@ HRectangle { Layout.fillWidth: true Layout.fillHeight: true - spacing: collapsed ? 0 : normalSpacing - topMargin: spacing - bottomMargin: spacing - Layout.leftMargin: spacing + spacing: collapsed ? 0 : normalSpacing * 3 + topMargin: normalSpacing + bottomMargin: normalSpacing + Layout.leftMargin: normalSpacing Behavior on spacing { NumberAnimation { duration: HStyle.animationDuration } } } - PaneToolBar {} + PaneToolBar { + id: paneToolBar + } } } diff --git a/src/qml/UI.qml b/src/qml/UI.qml index fc07b5f9..f6288ed5 100644 --- a/src/qml/UI.qml +++ b/src/qml/UI.qml @@ -8,10 +8,15 @@ import "SidePane" Item { id: mainUI + Connections { + target: py + onWillLoadAccounts: function(will) { + pageStack.showPage(will ? "Default" : "SignIn") + } + } + property bool accountsPresent: models.accounts.count > 0 || py.loadingAccounts - onAccountsPresentChanged: - pageStack.showPage(accountsPresent ? "Default" : "SignIn") HImage { id: mainUIBackground diff --git a/submodules/SortFilterProxyModel b/submodules/SortFilterProxyModel new file mode 160000 index 00000000..770789ee --- /dev/null +++ b/submodules/SortFilterProxyModel @@ -0,0 +1 @@ +Subproject commit 770789ee484abf69c230cbf1b64f39823e79a181