summaryrefslogtreecommitdiffstats
path: root/app
diff options
context:
space:
mode:
authorzheng_wenlong <wenlong_zheng@nexty-ele.com>2018-11-07 11:09:54 +0900
committerzheng_wenlong <wenlong_zheng@nexty-ele.com>2018-11-07 11:09:54 +0900
commit31e4ddecb2e704ab81303568102f786ea727d0cf (patch)
treed64b09220e072946f022901bb121cab35ac78716 /app
parentca756b3f04bb2cb89e0f1f19e197dfa6a809be8d (diff)
add warehouse source
Diffstat (limited to 'app')
-rw-r--r--app/CameraControl.qml133
-rw-r--r--app/app.pri20
-rw-r--r--app/app.pro25
-rw-r--r--app/camera.cpp139
-rw-r--r--app/camera.h70
-rw-r--r--app/config.tests/libhomescreen/libhomescreen.cpp8
-rw-r--r--app/config.tests/libhomescreen/libhomescreen.pro5
-rw-r--r--app/config.tests/qlibwindowmanager/qlibwindowmanager.cpp8
-rw-r--r--app/config.tests/qlibwindowmanager/qlibwindowmanager.pro5
-rw-r--r--app/images/Back.svg51
-rw-r--r--app/images/DividingLine.svg58
-rw-r--r--app/images/Top.svg54
-rw-r--r--app/images/camera/camera_bg.svg484
-rw-r--r--app/images/camera/camerainfo_bg.svg93
-rw-r--r--app/images/homescreen/homebg_bottom.svg1397
-rw-r--r--app/images/images.qrc8
-rw-r--r--app/main.cpp138
-rw-r--r--app/main.qml151
-rw-r--r--app/main.qrc6
-rw-r--r--app/pages/DetailPage.qml111
-rw-r--r--app/pages/DownloadBar.qml43
-rw-r--r--app/pages/ListPage.qml186
-rw-r--r--app/pages/ManagementPage.qml156
-rw-r--r--app/pages/SearchPage.qml24
-rw-r--r--app/resources.qrc10
-rw-r--r--app/src/appinfo.cpp200
-rw-r--r--app/src/appinfo.h94
-rw-r--r--app/src/config.h46
-rw-r--r--app/src/hmi-debug.h89
-rw-r--r--app/src/httpclient.cpp267
-rw-r--r--app/src/httpclient.h48
-rw-r--r--app/src/main.cpp139
-rw-r--r--app/src/nativeappmodel.cpp157
-rw-r--r--app/src/nativeappmodel.h63
-rw-r--r--app/src/serverappmodel.cpp286
-rw-r--r--app/src/serverappmodel.h78
-rw-r--r--app/src/src.pri17
37 files changed, 2284 insertions, 2583 deletions
diff --git a/app/CameraControl.qml b/app/CameraControl.qml
deleted file mode 100644
index 4e0b94d..0000000
--- a/app/CameraControl.qml
+++ /dev/null
@@ -1,133 +0,0 @@
-/*
- * Copyright (c) 2017 TOYOTA MOTOR CORPORATION
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-import QtQuick 2.6
-import QtQuick.Layouts 1.3
-import QtQuick.Controls 2.0
-
-RowLayout {
- property var device
- property var listWH
- property var number: []
- property var fps: ["10", "20", "30", "40", "50", "60"]
- property var resolution: listWH ? ["320*240", "640*480", "1280*720", "1920*1080"] : ["320*240"]
- property var models: [number, fps, resolution]
- property real back: 1
- property bool switchstatus: true
- property bool switchChecked: false
-
- Repeater {
- id: info
- model: ["No.:", "FPS:", "W*H:"]
- delegate: RowLayout{
- Label {
- id: label
- text: model.modelData
- color: "#59FF7F"
- }
- ComboBox {
- id: camerainfo
- implicitWidth: index != 2 ? 100 : 245
- font: label.font
- model: models[index]
- contentItem: Text {
- text: camerainfo.displayText
- font: camerainfo.font
- color: camerainfo.pressed ? "#17a81a" : "white"
- horizontalAlignment: Text.AlignLeft
- verticalAlignment: Text.AlignVCenter
- elide: Text.ElideRight
- }
- indicator: Canvas {
- id: canvas
- x: camerainfo.width - width - camerainfo.rightPadding
- y: camerainfo.topPadding + (camerainfo.availableHeight - height) / 2
- width: 20
- height: 12
- contextType: "2d"
-
- Connections {
- target: camerainfo
- onPressedChanged: canvas.requestPaint()
- }
-
- onPaint: {
- context.reset();
- context.moveTo(0, 0);
- context.lineTo(width, 0);
- context.lineTo(width / 2, height);
- context.closePath();
- context.fillStyle = camerainfo.pressed ? "#17a81a" : "white";
- context.fill();
- }
- }
- popup: Popup {
- id: popup
- y: camerainfo.height - 1
- implicitWidth: camerainfo.width
- implicitHeight: listview.count > 6 ? (listview.contentHeight/3.3) : listview.contentHeight
- padding: 0
-
- contentItem: ListView {
- id: listview
- clip: true
- model: camerainfo.visible ? camerainfo.delegateModel : null
- currentIndex: camerainfo.highlightedIndex
- ScrollIndicator.vertical: ScrollIndicator { }
- }
- background: Image { source: "images/camera/camerainfo_bg.svg" }
- }
- delegate: ItemDelegate {
- id: popupdelegate
- width: camerainfo.width
- contentItem: Item {
- implicitHeight: 30
- Text {
- text: modelData
- color: popupdelegate.pressed || highlighted ? "#21be2b" : "white"
- font: camerainfo.font
- elide: Text.ElideRight
- verticalAlignment: Text.AlignVCenter
- }
- }
- highlighted: camerainfo.highlightedIndex == index
- }
-
- background: Image { source: "images/camera/camerainfo_bg.svg" }
- }
- }
- }
- Switch {
- id: cameraswitch
- enabled: switchstatus
- checked: switchChecked
- onCheckedChanged: {
- if (checked && device){
- device.start(info.itemAt(0).children[1].currentText, info.itemAt(1).children[1].currentText, info.itemAt(2).children[1].currentText)
- }else if (!checked && device){
- device.stop()
- }
- }
- }
-
- Component.onCompleted: {
- device.enumerateCameras();
- number = device.camranum();
-
- if (device.cameraCnt() === 0)
- switchstatus = false;
- }
-}
diff --git a/app/app.pri b/app/app.pri
deleted file mode 100644
index 590c154..0000000
--- a/app/app.pri
+++ /dev/null
@@ -1,20 +0,0 @@
-TEMPLATE = app
-
-load(configure)
-
-qtCompileTest(libhomescreen)
-qtCompileTest(qlibwindowmanager)
-
-config_libhomescreen {
- CONFIG += link_pkgconfig
- PKGCONFIG += libhomescreen
- DEFINES += HAVE_LIBHOMESCREEN
-}
-
-config_qlibwindowmanager {
- CONFIG += link_pkgconfig
- PKGCONFIG += qlibwindowmanager
- DEFINES += HAVE_QLIBWINDOWMANAGER
-}
-
-DESTDIR = $${OUT_PWD}/../package/root/bin
diff --git a/app/app.pro b/app/app.pro
index b9d7bc5..78b861a 100644
--- a/app/app.pro
+++ b/app/app.pro
@@ -1,21 +1,18 @@
-TARGET = camapp
-QT = quickcontrols2
+TEMPLATE = app
+TARGET = warehouse
+QT += quickcontrols2 dbus websockets
-equals(QT_ARCH, "arm") {
- QMAKE_CXXFLAGS += -mfp16-format=ieee
-}
+DESTDIR = $${OUT_PWD}/../package/root/bin
-HEADERS += \
- camera.h
+CONFIG += c++11 link_pkgconfig
+PKGCONFIG += qlibhomescreen qlibwindowmanager
-SOURCES += \
- main.cpp \
- camera.cpp
+include(../interfaces/interfaces.pri)
+include(src/src.pri)
-LIBS += -lopencv_core -lopencv_videoio
+OTHER_FILES += \
+ main.qml
RESOURCES += \
- main.qrc \
+ resources.qrc \
images/images.qrc
-
-include(app.pri)
diff --git a/app/camera.cpp b/app/camera.cpp
deleted file mode 100644
index 8ee99c9..0000000
--- a/app/camera.cpp
+++ /dev/null
@@ -1,139 +0,0 @@
-/*
- * Copyright (c) 2017 TOYOTA MOTOR CORPORATION
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "camera.h"
-#include <QPainter>
-#include <opencv2/imgproc.hpp>
-
-#include <linux/videodev2.h>
-#include <fcntl.h>
-#include <unistd.h>
-#include <sys/ioctl.h>
-
-using namespace cv;
-
-Camera::Camera() {
- running = false;
- timer = new QTimer(this);
- capture = new VideoCapture();
-
- connect(timer, SIGNAL(timeout()), this, SLOT(grab()));
-}
-
-Camera::~Camera() {
- if (timer->isActive())
- timer->stop();
- if (capture && capture->isOpened())
- capture->release();
- delete timer;
- delete capture;
-}
-
-void Camera::paint(QPainter *painter) {
- painter->drawImage(0, 0, image);
-}
-
-void Camera::enumerateCameras() {
- int maxID = 20;
- for (int idx = 2; idx <maxID; idx++){
- std::stringstream no;
- no << "/dev/video" << idx;
- qDebug() << idx;
- int fd = open(no.str().c_str(), O_RDWR);
- if (fd != -1){
- struct v4l2_capability cap;
-
- if (ioctl(fd,VIDIOC_QUERYCAP,&cap) != -1){
- if ((cap.capabilities & (V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_STREAMING)) == (V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_STREAMING)){
- qDebug()<< (char*)(cap.driver) << ">" << (char*)(cap.card) << ">" << (char*)(cap.bus_info);// << (cap.version>>16)&0xFF << (cap.version>>8)&0XFF << cap.version&0xFF;
- cam_arr.push_back(idx); // vector of all available cameras
- }
- }
- close(fd);
- }
- }
-
- camcnt = cam_arr.length();
- cam_arr_bak = cam_arr;
-}
-
-void Camera::start(int no, int fps, QString res) {
- try{
- for (QVariantList::iterator iter = cam_arr_bak.begin(); iter != cam_arr_bak.end(); ++iter){
- if (*iter == no){
- cam_arr_bak.erase(iter);
- break;
- }
- }
-
- if (capture && capture->open(no)){
- capture->set(CAP_PROP_FRAME_WIDTH, res.section("*", 0, 0).toInt());
- capture->set(CAP_PROP_FRAME_HEIGHT, res.section("*", 1, 1).toInt());
-
- if (fps > 0){
- timer->start(1000/fps);
- running = true;
- emit isrunningChanged(running);
-
- emit camraCntChanged(cam_arr_bak);
- }
- camnumbackup = no;
- }
- }
- catch(cv::Exception & e) {
- qDebug() << "als-meter-demo open device error: " << e.msg.c_str();
- }
-}
-
-void Camera::stop() {
- cam_arr_bak.push_back(camnumbackup);
-
- if (timer->isActive())
- timer->stop();
- if (capture && capture->isOpened())
- capture->release();
- image = QImage();
- update();
- running = false;
- emit isrunningChanged(running);
-
- emit camraCntChanged(cam_arr_bak);
-}
-
-QVariantList Camera::camranum() const{
- return cam_arr_bak;
-}
-
-int Camera::cameraCnt() {
- return camcnt;
-}
-
-bool Camera::isrunning() const{
- return running;
-}
-
-void Camera::grab() {
- if (capture && capture->isOpened()){
- Mat frame;
- capture->read(frame);
-
- if (!frame.empty()){
- image = QImage((const uchar*)(frame.data), frame.cols, frame.rows, frame.step, QImage::Format_RGB888).rgbSwapped();
- image = image.scaled(this->width(), this->height(), Qt::IgnoreAspectRatio, Qt::SmoothTransformation);
- update();
- }
- }
-} \ No newline at end of file
diff --git a/app/camera.h b/app/camera.h
deleted file mode 100644
index 1b85d27..0000000
--- a/app/camera.h
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * Copyright (c) 2017 TOYOTA MOTOR CORPORATION
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef CAMERA_H
-#define CAMERA_H
-
-#include <QSize>
-#include <QTimer>
-#include <QImage>
-#include <QQuickPaintedItem>
-#include <opencv2/videoio.hpp>
-#include <iostream>
-#include <opencv2/core.hpp>
-#include <opencv2/imgcodecs.hpp>
-#include <opencv2/highgui.hpp>
-
-using namespace std;
-
-static QVariantList cam_arr_bak;
-
-class Camera : public QQuickPaintedItem
-{
- Q_OBJECT
- Q_PROPERTY(bool isrunning READ isrunning NOTIFY isrunningChanged)
-public:
- Camera();
- ~Camera();
- void paint(QPainter *painter);
- bool isrunning() const;
- Q_INVOKABLE QVariantList camranum() const;
-
- Q_INVOKABLE void start(int no, int fps, QString res);
- Q_INVOKABLE void stop();
-
- Q_INVOKABLE void enumerateCameras();
- Q_INVOKABLE int cameraCnt();
-
-signals:
- void isrunningChanged(const bool& isrunning);
- void camraCntChanged(const QVariantList& camcnt);
-
-public slots:
- void grab();
-
-private:
- bool running;
- QImage image;
- QTimer* timer;
- cv::VideoCapture* capture;
-
- QVariantList cam_arr;
-
- int camnumbackup;
- int camcnt;
-};
-
-#endif // CAMERA_H
diff --git a/app/config.tests/libhomescreen/libhomescreen.cpp b/app/config.tests/libhomescreen/libhomescreen.cpp
deleted file mode 100644
index d698b05..0000000
--- a/app/config.tests/libhomescreen/libhomescreen.cpp
+++ /dev/null
@@ -1,8 +0,0 @@
-#include <libhomescreen.hpp>
-
-int main(int argc,char **argv)
-{
- LibHomeScreen libHomeScreen;
- return 0;
-}
-
diff --git a/app/config.tests/libhomescreen/libhomescreen.pro b/app/config.tests/libhomescreen/libhomescreen.pro
deleted file mode 100644
index 7d43112..0000000
--- a/app/config.tests/libhomescreen/libhomescreen.pro
+++ /dev/null
@@ -1,5 +0,0 @@
-SOURCES = libhomescreen.cpp
-
-CONFIG -= qt
-CONFIG += link_pkgconfig
-PKGCONFIG += libhomescreen
diff --git a/app/config.tests/qlibwindowmanager/qlibwindowmanager.cpp b/app/config.tests/qlibwindowmanager/qlibwindowmanager.cpp
deleted file mode 100644
index bb95c93..0000000
--- a/app/config.tests/qlibwindowmanager/qlibwindowmanager.cpp
+++ /dev/null
@@ -1,8 +0,0 @@
-#include <qlibwindowmanager.h>
-
-int main(int argc,char **argv)
-{
- QLibWindowmanager qwm;
- return 0;
-}
-
diff --git a/app/config.tests/qlibwindowmanager/qlibwindowmanager.pro b/app/config.tests/qlibwindowmanager/qlibwindowmanager.pro
deleted file mode 100644
index cb51d98..0000000
--- a/app/config.tests/qlibwindowmanager/qlibwindowmanager.pro
+++ /dev/null
@@ -1,5 +0,0 @@
-SOURCES = qlibwindowmanager.cpp
-
-CONFIG += qt
-CONFIG += link_pkgconfig
-PKGCONFIG += qlibwindowmanager
diff --git a/app/images/Back.svg b/app/images/Back.svg
new file mode 100644
index 0000000..d91ac10
--- /dev/null
+++ b/app/images/Back.svg
@@ -0,0 +1,51 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Svg Vector Icons : http://www.sfont.cn -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ version="1.1"
+ x="0px"
+ y="0px"
+ viewBox="0 0 1000 1000"
+ enable-background="new 0 0 1000 1000"
+ xml:space="preserve"
+ id="svg8"
+ sodipodi:docname="Back.svg"
+ inkscape:version="0.92.3 (unknown)"><defs
+ id="defs12" /><sodipodi:namedview
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1"
+ objecttolerance="10"
+ gridtolerance="10"
+ guidetolerance="10"
+ inkscape:pageopacity="0"
+ inkscape:pageshadow="2"
+ inkscape:window-width="1855"
+ inkscape:window-height="1056"
+ id="namedview10"
+ showgrid="false"
+ inkscape:zoom="0.62286164"
+ inkscape:cx="213.58606"
+ inkscape:cy="465.41879"
+ inkscape:window-x="65"
+ inkscape:window-y="24"
+ inkscape:window-maximized="1"
+ inkscape:current-layer="svg8" />
+<metadata
+ id="metadata2"> Svg Vector Icons : http://www.sfont.cn <rdf:RDF><cc:Work
+ rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" /></cc:Work></rdf:RDF></metadata>
+<g
+ id="g6"
+ style="fill:#38d5ee;fill-opacity:0.39215687;stroke:#0df9ff;stroke-opacity:1;stroke-width:20;stroke-miterlimit:4;stroke-dasharray:none"><path
+ d="M10,500L500,10v306.3h490v367.5H500V990L10,500z"
+ id="path4"
+ style="fill:#38d5ee;fill-opacity:0.39215687;stroke:#0df9ff;stroke-opacity:1;stroke-width:20;stroke-miterlimit:4;stroke-dasharray:none" /></g>
+</svg> \ No newline at end of file
diff --git a/app/images/DividingLine.svg b/app/images/DividingLine.svg
new file mode 100644
index 0000000..d63589c
--- /dev/null
+++ b/app/images/DividingLine.svg
@@ -0,0 +1,58 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Generator: Adobe Illustrator 21.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+
+<svg
+ xmlns:i="&amp;ns_ai;"
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ version="1.1"
+ id="Layer_1"
+ x="0px"
+ y="0px"
+ viewBox="0 0 932.8 1"
+ style="enable-background:new 0 0 932.8 1;"
+ xml:space="preserve"
+ inkscape:version="0.91 r13725"
+ sodipodi:docname="HMI_Settings_DividingLine.svg"><metadata
+ id="metadata18"><rdf:RDF><cc:Work
+ rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" /></cc:Work></rdf:RDF></metadata><defs
+ id="defs16" /><sodipodi:namedview
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1"
+ objecttolerance="10"
+ gridtolerance="10"
+ guidetolerance="10"
+ inkscape:pageopacity="0"
+ inkscape:pageshadow="2"
+ inkscape:window-width="2560"
+ inkscape:window-height="1464"
+ id="namedview14"
+ showgrid="false"
+ inkscape:zoom="0.72041167"
+ inkscape:cx="-116.6"
+ inkscape:cy="0.5"
+ inkscape:window-x="0"
+ inkscape:window-y="0"
+ inkscape:window-maximized="1"
+ inkscape:current-layer="Layer_1" /><style
+ type="text/css"
+ id="style3">
+ .st0{opacity:0.302;}
+ .st1{fill-rule:evenodd;clip-rule:evenodd;fill:#A8A8A8;}
+</style><switch
+ id="switch5"><g
+ i:extraneous="self"
+ id="g7"><g
+ id="Divider_2_"
+ class="st0"><g
+ id="g10"><polygon
+ class="st1"
+ points="719.7,0 0,0 0,1 932.8,1 "
+ id="polygon12" /></g></g></g></switch></svg> \ No newline at end of file
diff --git a/app/images/Top.svg b/app/images/Top.svg
new file mode 100644
index 0000000..0fffbe8
--- /dev/null
+++ b/app/images/Top.svg
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Svg Vector Icons : http://www.sfont.cn -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ version="1.1"
+ x="0px"
+ y="0px"
+ viewBox="0 0 1000 1000"
+ enable-background="new 0 0 1000 1000"
+ xml:space="preserve"
+ id="svg10"
+ sodipodi:docname="Top.svg"
+ inkscape:version="0.92.3 (unknown)"><defs
+ id="defs14" /><sodipodi:namedview
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1"
+ objecttolerance="10"
+ gridtolerance="10"
+ guidetolerance="10"
+ inkscape:pageopacity="0"
+ inkscape:pageshadow="2"
+ inkscape:window-width="1855"
+ inkscape:window-height="1056"
+ id="namedview12"
+ showgrid="false"
+ inkscape:zoom="0.83153125"
+ inkscape:cx="500"
+ inkscape:cy="500"
+ inkscape:window-x="65"
+ inkscape:window-y="24"
+ inkscape:window-maximized="1"
+ inkscape:current-layer="svg10" />
+<metadata
+ id="metadata2"> Svg Vector Icons : http://www.sfont.cn <rdf:RDF><cc:Work
+ rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" /></cc:Work></rdf:RDF></metadata>
+<g
+ id="g8"
+ style="fill:#38d5ee;fill-opacity:0.39215687;stroke:#0df9ff;stroke-opacity:1;stroke-width:20;stroke-miterlimit:4;stroke-dasharray:none"><path
+ d="M135.1,578.8l368-431l361.8,431H667.1V990H325.8V578.8H135.1z"
+ id="path4"
+ style="fill:#38d5ee;fill-opacity:0.39215687;stroke:#0df9ff;stroke-opacity:1;stroke-width:20;stroke-miterlimit:4;stroke-dasharray:none" /><path
+ d="M168.3,10h673.8v105H168.3V10z"
+ id="path6"
+ style="fill:#38d5ee;fill-opacity:0.39215687;stroke:#0df9ff;stroke-opacity:1;stroke-width:20;stroke-miterlimit:4;stroke-dasharray:none" /></g>
+</svg> \ No newline at end of file
diff --git a/app/images/camera/camera_bg.svg b/app/images/camera/camera_bg.svg
deleted file mode 100644
index 458f81c..0000000
--- a/app/images/camera/camera_bg.svg
+++ /dev/null
@@ -1,484 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-
-<svg
- xmlns:dc="http://purl.org/dc/elements/1.1/"
- xmlns:cc="http://creativecommons.org/ns#"
- xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
- xmlns:svg="http://www.w3.org/2000/svg"
- xmlns="http://www.w3.org/2000/svg"
- xmlns:xlink="http://www.w3.org/1999/xlink"
- version="1.1"
- width="392"
- height="391"
- id="svg2">
- <metadata
- id="metadata8">
- <rdf:RDF>
- <cc:Work
- rdf:about="">
- <dc:format>image/svg+xml</dc:format>
- <dc:type
- rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
- </cc:Work>
- </rdf:RDF>
- </metadata>
- <defs
- id="defs6" />
- <image
- xlink:href="data:image/png;base64,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
-6/8BH94fg7v0ITsAAAAASUVORK5CYII=
-"
- x="0"
- y="0"
- width="392"
- height="391"
- id="image10" />
-</svg>
diff --git a/app/images/camera/camerainfo_bg.svg b/app/images/camera/camerainfo_bg.svg
deleted file mode 100644
index 4251412..0000000
--- a/app/images/camera/camerainfo_bg.svg
+++ /dev/null
@@ -1,93 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Generator: Adobe Illustrator 21.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-
-<svg
- xmlns:i="&amp;#38;ns_ai;"
- xmlns:dc="http://purl.org/dc/elements/1.1/"
- xmlns:cc="http://creativecommons.org/ns#"
- xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
- xmlns:svg="http://www.w3.org/2000/svg"
- xmlns="http://www.w3.org/2000/svg"
- xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
- xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
- version="1.1"
- id="Layer_1"
- x="0px"
- y="0px"
- viewBox="0 0 151 51"
- style="enable-background:new 0 0 151 51;"
- xml:space="preserve"
- inkscape:version="0.91 r13725"
- sodipodi:docname="HMI_Settings_TimeDate_Button_Cancel.svg"><metadata
- id="metadata33"><rdf:RDF><cc:Work
- rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
- rdf:resource="http://purl.org/dc/dcmitype/StillImage" /></cc:Work></rdf:RDF></metadata><defs
- id="defs31" /><sodipodi:namedview
- pagecolor="#ffffff"
- bordercolor="#666666"
- borderopacity="1"
- objecttolerance="10"
- gridtolerance="10"
- guidetolerance="10"
- inkscape:pageopacity="0"
- inkscape:pageshadow="2"
- inkscape:window-width="2560"
- inkscape:window-height="1464"
- id="namedview29"
- showgrid="false"
- inkscape:zoom="4.4503311"
- inkscape:cx="-69.095982"
- inkscape:cy="25.5"
- inkscape:window-x="0"
- inkscape:window-y="0"
- inkscape:window-maximized="1"
- inkscape:current-layer="Layer_1" /><style
- type="text/css"
- id="style3">
- .st0{fill:none;stroke:url(#SVGID_1_);stroke-miterlimit:10;}
- .st1{opacity:0.3;fill:url(#SVGID_2_);}
- .st2{fill:#FFFFFF;}
- .st3{font-family:'Roboto-Regular';}
- .st4{font-size:20px;}
- .st5{letter-spacing:3;}
-</style><switch
- id="switch5"><g
- i:extraneous="self"
- id="g7"><g
- id="g9"><linearGradient
- id="SVGID_1_"
- gradientUnits="userSpaceOnUse"
- x1="24.7258"
- y1="75.9063"
- x2="126.2742"
- y2="-24.9063"><stop
- offset="0"
- style="stop-color:#59FF7F"
- id="stop12" /><stop
- offset="1"
- style="stop-color:#6BFBFF"
- id="stop14" /></linearGradient><rect
- x="0.5"
- y="0.5"
- class="st0"
- width="150"
- height="50"
- id="rect16" /><linearGradient
- id="SVGID_2_"
- gradientUnits="userSpaceOnUse"
- x1="-25.8746"
- y1="126.14"
- x2="190.2191"
- y2="-88.3878"><stop
- offset="0"
- style="stop-color:#59FF7F"
- id="stop19" /><stop
- offset="1"
- style="stop-color:#6BFBFF"
- id="stop21" /></linearGradient><rect
- x="0.5"
- y="0.5"
- class="st1"
- width="150"
- height="50"
- id="rect23" /></g></g></switch></svg> \ No newline at end of file
diff --git a/app/images/homescreen/homebg_bottom.svg b/app/images/homescreen/homebg_bottom.svg
deleted file mode 100644
index 78bf678..0000000
--- a/app/images/homescreen/homebg_bottom.svg
+++ /dev/null
@@ -1,1397 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-
-<svg
- xmlns:dc="http://purl.org/dc/elements/1.1/"
- xmlns:cc="http://creativecommons.org/ns#"
- xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
- xmlns:svg="http://www.w3.org/2000/svg"
- xmlns="http://www.w3.org/2000/svg"
- xmlns:xlink="http://www.w3.org/1999/xlink"
- version="1.1"
- width="1920"
- height="480"
- id="svg2">
- <metadata
- id="metadata8">
- <rdf:RDF>
- <cc:Work
- rdf:about="">
- <dc:format>image/svg+xml</dc:format>
- <dc:type
- rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
- </cc:Work>
- </rdf:RDF>
- </metadata>
- <defs
- id="defs6" />
- <image
- xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAB4AAAAHgCAYAAABEhnCmAAAABHNCSVQICAgIfAhkiAAAIABJREFU
-eJzsvemSI0uPnhmsL79FvYzUko3WHu3T0mhsFs3931pXzo9TPOXlheUF3IMMsp7H7NjJjIADcDgc
-jiArydsf/vCHzwMAAAAAAAAAAAAAAAAAAF6eL892AAAAAAAAAAAAAAAAAAAA9sAbwAAAAAAAAAAA
-AAAAAAAAbwJvAAMAAAAAAAAAAAAAAAAAvAm8AQwAAAAAAAAAAAAAAAAA8CbwBjAAAAAAAAAAAAAA
-AAAAwJvAG8AAAAAAAAAAAAAAAAAAAG8CbwADAAAAAAAAAAAAAAAAALwJvAEMAAAAAAAAAAAAAAAA
-APAm8AYwAAAAAAAAAAAAAAAAAMCbwBvAAAAAAAAAAAAAAAAAAABvAm8AAwAAAAAAAAAAAAAAAAC8
-CbwBDAAAAAAAAAAAAAAAAADwJvAGMAAAAAAAAAAAAAAAAADAm8AbwAAAAAAAAAAAAAAAAAAAbwJv
-AAMAAAAAAAAAAAAAAAAAvAm8AQwAAAAAAAAAAAAAAAAA8CbwBjAAAAAAAAAAAAAAAAAAwJvAG8AA
-AAAAAAAAAAAAAAAAAG8CbwADAAAAAAAAAAAAAAAAALwJvAEMAAAAAAAAAAAAAAAAAPAm8AYwAAAA
-AAAAAAAAAAAAAMCbwBvAAAAAAAAAAAAAAAAAAABvAm8AAwAAAAAAAAAAAAAAAAC8CR/HcTMufw4/
-36brN0fGGuPJRzKzvdkHBdV/Re/st0Xmvyc/yswx9GSVWGU/ezYi/7N1ifLBsxXpVv2McswaO6LO
-17tfiUPFzizn5UCEklcV39T9Ptuwrlv6Rzrr6+nP/Jx9yPbgTFb3PHnPrrJnI59Xaqnnw3i/u4+U
-sZV6Gfnp+RD5Ztnr5HP1HLR8nMnyXt2/lTpf3e/KudPpJTz9GdVaMepV+hbPhrKvIz3ddYnqRlaL
-ItSz2RrT3Zudum3pj+qf4ttI5EP3jF89O7zfPZvR/ol0V+aink1HcL2y3spZXunPs/yIfFDq/2y3
-WnOqRHU42yfqHsxildXJ6jmbjbdkZlmlNlj+KD2VEiM1v6qxs2QU+9Fc1N5FOSsjXUq/0tkn1b5k
-1qec897Y+/Vu7avW09U+aWVfVf2p5EQltyrySn20dIxk+ZnVzuxnz9ZsQ9njiv7ZR9WuZyvSa92f
-9Vio55OXU5WeLYqbUk+6PZMSWyVPqv5bPll6RlmlB6jGUK27ls75njU2Wy/1rFHqZKVGqTnvXVfq
-hudDpCPS4+mK1nR3nJV+MaoPlf1yll1LRo1hZN/SP17P6sk4PtLZ7U+i2mLJVFF9OCY5y2603tHY
-qO55KHXVsmvds3zzrlf1VM76UaZ6zno+qDqtseq5lp0jkc6qrar/HvFZcPvDHz6UbAYAAAAAAAAA
-AAAAAAAAgIvjfwT07ej/Y4sqFVu347G+7eYsv3fFxNOzK+5n+HlmPtycn6/ATn+6MbxKTF65JqxS
-3Zu79vEOmWx8RcfuHDg7n7r7LRpX1bkyR29sVDMt/x+xb5+dS7PuK+kZ9UVn/7N4tP1nz7fD7PPO
-s2Cl13pWLK+4hmf36LvsdHNph21P31m5rcifkUuvso9Uruafuke6PpNbj+VqPkb+vMprVDv8rNbl
-M8+t3Xquihrzs+Nw1eeFVa7mf/W1ncr1K6C8RrDbXvd55mye4c/Vn+131JnO2bT7tbadPKu2nzFW
-Wd+uP6sxunKcN9i9/eHjQX8BvPLX+5auY6O+qs7Vv+q39FSpfhLHIdp6lP+7fFi1s8NG5xMrlE/K
-sOQ9/WfPRR27y4durq74v4LyCTs761913bt7StEfzX1HfdtZJ1dqy64YKp8qsmJ3R/18xD6qxkHV
-d2dXTp6xRo/UX/Wh2gPc8eqwpSv7NJ1HN8Ur/qzUhZlVO8+KX9W294lmI896wN65lx+5HjtrqNp/
-Hsb13bbP0Hn2mfrIen01zszDs1F6CEue/Hocq75dJbce5cOV13IXld4ok+va3/1ajKdfuX4WKzlc
-ib/y6ZjK+Gc956vr9Yy9efaz/dVf64/s3Mletz0r57t2qzFf3V+eni7eJ91GfZXymsWOurGyLqu2
-lHmd+Z5N5/XlXa+HXOm9pZ0188yaVszVx70BDAAAAAAAAAAAAAAAAAAAp+J/BDQAAAAAAAAAAAAA
-AAAAALwUvAEMAAAAAAAAAAAAAAAAAPAm8AYwAAAAAAAAAAAAAAAAAMCbwBvAAAAAAAAAAAAAAAAA
-AABvAm8AAwAAAAAAAAAAAAAAAAC8CbwBDAAAAAAAAAAAAAAAAADwJvAGMAAAAAAAAAAAAAAAAADA
-m8AbwAAAAAAAAAAAAAAAAAAAbwJvAAMAAAAAAAAAAAAAAAAAvAm8AQwAAAAAAAAAAAAAAAAA8Cbw
-BjAAAAAAAAAAAAAAAAAAwJvAG8AAAAAAAAAAAAAAAAAAAG8CbwADAAAAAAAAAAAAAAAAALwJvAEM
-AAAAAAAAAAAAAAAAAPAm8AYwAAAAAAAAAAAAAAAAAMCbwBvAAAAAAAAAAAAAAAAAAABvgvsG8O3b
-fxGjjPfzKFvVv4OOjdux17+qnkfEZYetR/qpsLLWO2xbenbnUmQ/u36GD2fEfGdO3oz/drFr7s/a
-g2f5n8X6WXvhyjqfWbvOsHtl3zr6snr1yDqfnTXq9TPI+sBHsRKLqt/PnOcOztozzyQ7fzpn1sq8
-1LFn9qOd3Fdr3ypn58wVclLl7Np15jmxquPZPlRyf4e9Z/Cq+fXs3Fgdr/RGjzhjdo7tnIvds9Qb
-5z1HqXu3Ylu9vsvubj1n1amVvv+q9VPN0yv0QI+K4SPyp2q3O/Z26GtcsVvRF9WrZ+yLR9aTlbqt
-6LTuRWeHJ7PKSm5X7ayO3zn3nXvq7LFd5vqR1YROHTtzXrePj4/PzSqP4/icfj+Ma58F+Uj/o4js
-ZnOM5Mel7cbkKlTj8Eid3Rg+Mt+sXOiMj2Jl5V70s2JzR3zUnF/ZC9V53fFiUt3jqs/P3u8799dK
-Lj0jD1W71pH8yPXy5luNQ7XmKPrPqPlXHtup291a743zeqpsLTo1cUdN3lXjrlRbX7nme6h5+qz1
-PMOHZ9mIdCvPRZ2x8zn26HN/ljvr2afrj3UtklFsRHY743fnpDJf1f4Zvs1+ZfrPWK9MvypbyTfV
-RmS3o2PnGirzrdg+07eVGnZM17o+zNdVnWfvO6W/7D6/PfM1vjtnne9nPzupfhzHz3vwjNdxOuMP
-UYfyOrKqS6H6+lqmJ5Or+PXofjQb96g8X32dLtN7dm/wrFo386jnT3W+V30efgSVGnKV9Xplzj73
-r8LPOXP7+PjjO88YAAAAAAAAAAAAAAAAAOCXge8ABgAAAAAAAAAAAAAAAAB4E3gDGAAAAAAAAAAA
-AAAAAADgTeANYAAAAAAAAAAAAAAAAACAN4E3gAEAAAAAAAAAAAAAAAAA3oSPz9tvP9w+64OzsZ+3
-+J5q9y6b2cpkVojmoo4/jp91VOM/zvPOGfMdbak+K3Ppznc19tb4lTV9dD4o16094O2LVf8z31Zj
-XsmlESU+q35Wa022RsrYWd5ba0tmnnumU92/Z+z3bOzse/UcWdnvo90uVR+eWaMqOs+uhyNqPis2
-u3OJ9lo0purjjrFVPWfPJeIZMar0l16+dOxW7HeZfRvzdld/Ho3p5NJZuXUmz+hrVd1n+VbpTaoo
-z5YVG1HfkvXNFTsq8z7M9Kvy1f6sSmWPKz5Xc606PsqT3c/k0TPG7MOcX2et0e6evpq3VdTapfjc
-eY2poiOrQarOag53z9lZ5+r5MPqkclbe76h7nb6/4tvo0yOfAys2juMxzxiKjjPWYh5/HOv1fxfK
-61PPej56ZCyy3mtlD1b71N3PSCo7133WO7PyGoqn/wo1RNE/MsdhvF7ReUbds87rmV3PYNWc93LV
-s62+BqHIP+N5R5Xv+rZSb6uxvf3hj3/8PI7juB3H8azXW8Z8/hSuV3VbOiN9lkwUH8tPZ48en869
-WffoQ+bz6Fs1Zt681Hyo+GmNi+QV31b0RDqzPIzkPf2Wn1XfVLK4rO736h7p6pyv78ix+fruvPXG
-eLZW1jeK1W5W4jbrqdR5db9X13FHzKtzqVKdb3Veu87Hjv7qGXcMMrvn3jk3R6p2u2MVvZW9Octl
-MezWnewMzdidl9F4S0dV9y5fzpxvpOPMcyTCysfZj24/4Ok7Y0xFRzTHkdVzJrOj+rbig0q27lU/
-np3Pqu3oudGSe0Sdip5vo32q6Jnve89Xme7IZnTGZ/P4FXNrlH1GflX2fqTH82Pl/PB0Rr9Htqrn
-gqW362O3x+g8M1TGrj5TreToSny656HaB6/s9909cZTb1fzckUsrelTfIrlVW6MeT9dZr1mczY4a
-O47fudZZfLxYnfGsGI3Jngc6KHO3bFVjosYzOzctvfO1szmjP1diHvnRrRWds1jhrP4qkpnldjyP
-VPWr+6LaUyk5V82333/++PYGMAAAAAAAAAAAAAAAAAAAvDZ8BzAAAAAAAAAAAAAAAAAAwJvAG8AA
-AAAAAAAAAAAAAAAAAG8CbwADAAAAAAAAAAAAAAAAALwJH/nXDc9fW5x9LbI3dpSPvuY7Q9GpXq+M
-9b5eeb5Xiadl0/Kt8hXq1j1V/yyfrcvK13OP1ztfPd/9Ku0onzOiHLBkvLzyiL7uO/s6b3VfePpH
-ncpaKNeVrybPYjjLW7ai8ZWvoY/23ai78hXw1vhMZ/a171FenbHflT0137d0dMeOcsoaRSixysYp
-9pTcUNex+rNlV6mrSp4cR56Hyt6Zx1X3iOW/6ud835KpnFlHIhvJ7LI164vqapT36pm4e+6VulTp
-zyI/K+fcjBXLM2uakquVnlbx3/q9cgapdqPfI93zPUvPjLK/sr5lptPfRvG37lv2lDVW/anIeLaO
-6VqkM/LTo9vTRmN2xFmRtfyIck7dD5bs/VqnvihztXyYfZlR4hzpqfSg8/iKr0re7Mit6L6SA5Yf
-s0ylF+ycl1kPqvp/Zm5Z+rI1jeq1paPT580y3Xpq6VbWUtWj7LvM56wfjWzNfmZniYJ63mTy6vWK
-n8rYTvxV+9aYEeWsGXVkZ7zaN1fnUMmlUUaJoarzSK57dmf9I5W9UM3b2Q9lz1o6Ff2V/WfZVftU
-a2xVZyW3o94s2zsR1X1UrTPj9dmmNz6TqdKt8yv5ptQxBa9u75pLtL6KrcORmXVYvnX7z1km81+R
-qe53T07tAZS6rex9z5dq3R5lq3H7Wdft449/UqoPAAAAAAAAAAAAAAAAAABcHD4CGgAAAAAAAAAA
-AAAAAADgTeANYAAAAAAAAAAAAAAAAACAN4E3gAEAAAAAAAAAAAAAAAAA3gTeAAYAAAAAAAAAAAAA
-AAAAeBN4AxgAAAAAAAAAAAAAAAAA4E3gDWAAAAAAAAAAAAAAAAAAgDfh47gZVz+P4/frn8P12/S7
-xSjjyY82O/qtseqYcezN+Tkb6+kZx3fioPgzjvVsVXwbx1jX5rEeXpyUucw+WD97/nk+K3kVrVG2
-FtW9YN2LUHJyjs841vIhyhNLPvIzi6dnY1fMz8hhRY+Sn9XYquvo3RtRcsbyR6mrURw8Gc+HrCZ7
-15Wa4F2P9Mz2Zqr1NvJT0amuwXy9Eg/L54rN2a5SJ7OYR+eX5YMyx/meR/es9PTsOtMzH63rlb0w
-yig5m9m28NajknvR2JV5zT5Yvyu51Y2554dKpeZH96tnaBbnyLblh6c/uqbMoWtrlh/p1IfOfBQZ
-Zf95vsx01jHaL+r67IxzprcaN7Xv8WLn2c3ORbXHqu5/5Uzq1oLqmWfZqu4hzz+LSn5XfI/0V3LL
-shvtd9Wuev4q/sw6revVsUqfp9QXi6hfj3yy9GSo+aX0zZF+Va66X5TeXe31PVuV3rHaB6syFf+r
-9d8jyp+VWlo9OzP/lH5apbqvR5nKOaKeTZFfsy2Pzlk8Uj1/s7WozkX1v1LvIqq55M0xk1djlf2s
-6B91Rj57soqtSLcq793r1BZln3o+WPKej7OfFX88P5R4Kmdu9TyK+q5K7mU+RXar55Tng9IbzHKe
-HuXcz/RFVGpI9Xyc8fSv9FeKD0ouJTG/ffzpT53wAgAAAAAAAAAAAAAAAADAxeAjoAEAAAAAAAAA
-AAAAAAAA3oSP7z9W/tY8Qv3siBWyz77YaUf9jJ1nonx+yBn2os83UHSc6WdHZ/YZF6v6PVvdXKp+
-Xk3HxhXYEatI967POVE+Z2aFM2tOtc5HeqqfodT9vKZVrrwuu/Onc5Zd6Yyb6X7+1dms9AyrYw9D
-pvpZXs+K2SNsr+T5ikzlM7hUW1VWdO70Z1cts3ScnUeR/leulWfrv0psss/m8+6t1AtP9wqrebjS
-W1XGPnO/VOJ/Vh+ofrbdjvx6RG4p90eZTG5l7LNrjhr/R/m5y59ZdsdrKB2efWbNsmes367XfXb3
-Q6t7sNIHV316dg9xFjufV5/9/LDr2WYlJsqendn9nPzo1989u9W+t2JrJ2e+prPz9frK9ZFqfa6+
-dpPpiu6rerKxZzyTP/K1vGe9brhKL863jz/92auGAAAAAAAAAAAAAAAAAADwQvAR0AAAAAAAAAAA
-AAAAAAAAb8KH/5Gb6scXZdcrfyLv4X2koeLzON772APvz76juXjx8WQqH0ehxN9D+fgNxZ/qWo/3
-1FzKcqBqy9Ov5o8lM8pVc6yTJ5k/0Rpa95ScVz4Gz7s/yig+W+Mj+ciWN19l7pk/sy3Pz13x7Oaq
-56c3Rq0Ps3/R/Vm2WtMqdTWzfafykSTVsyySU3y05qvOMfOnWqvHe6o/lbHV3I7sZDW2E89Kbit6
-Rl1R/zPLWvLKfsx6GMuGNXa+F/lQ/bijamw7Y3fUZLXf6PZUHqvzVXQp8cnyIbKb3VN9U6jMcaZa
-Y8cxSl5Z4yJ96tlj2c3mW+39lF6r47Png/e7EtNqHRuJcqAia9nKZKOzQe1XLZlRzpqDcnZ2fVCI
-1qRSC9R93an7lVraya1IZyZfycPK+bcjtyx9u3xQqPS+St2e6dT4+73u3JUeQ+mhI72W/si3HbYi
-uyt0+7OV/F/x3ztH1fPY86HbG0V56OV/tfetPCN59dbyY5b3ZDy5SH9F5+rzg+WPt9+9sZ6tao84
-3lP7P0+vZzfrSSLU+jhf92Ko7qlRproWK1RqmifT2eOWPk8uiq1S66oyij+Z/tnP+Vpmp5ur0Z7K
-bHXOoOpziqV/NU88PZW9rNRGVXflGWO1XnlUeq2V/LfuH8ft409/2dmFAQAAAAAAAAAAAAAAAADA
-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
-Xt9/V/rVkbkv8n7f4WPW+1XrjOdzpHPX/s18UWWjcdH6RWOr/8RY9Xc8eIACAAAgAElEQVSUz3Iv
-82fHflF8OGvvd/aFkq+K7cj+jvO+o9OTz3J4xc4uvOfDw7i+w+dH5NZ4zbv+yvlVPbeemVujXbU3
-U3pT77rSE2dylm+Vs2dEmWO1B519X8nLld69eqY+Kw9n+7MPZ53fWawqulR2Pfvdf599jMaOnL3G
-ynPgrr6na7fjQ6bT82ek06tUOTOHPVs7n8N3cXZNOyPPu3ZXzinvnvdsrJ5llm7PH4WoH7bsrfYV
-s21rrCe70qdWdEZzvNPJT+VZ3bKp9l1xDt8+/vqfRSv849hcEkauFLc5v67ASnwqY5W5q/Gp1sXq
-2BW7V8KL5xXzMOMVfT4D4rCHZ+/lXev4zHzIerGzbK7Y2rXuj8ifqo1n5zTA2Tyj5ng+vMs+O2M+
-u3VeIebP9OEK878SO+Nxhdg+24dn2weN7jpV++ZdffaxqGcX3vvyj/QtW7tHrtGv9jrCo/N/F69W
-l68St0dxdl69azx3zuvsPXKF56Mz3rd4tdryptw+/kZ4AxgAAAAAAAAAAAAAAAAAAC7Px49vxVf/
-XHuWvctnfwqvXlf++UDlozjUPy9X/pTfQvlTfm9e0T9LqXwkycrHfox6ozX15JWP6LDklXXx5thZ
-0+rHLVh65jHKx1SMKB9vMMpWPvJhvBfFTYmnspez2HrjPf+VvWONs3R6KD5445R/TmvJez549jpj
-lRiOKHmo7LXd+8jTpeZndq5F+pXzRdHv+VnxuVPPd+hU6/8ok+lSZGa57hmqrnm2XtY9y7fsDLVs
-Z/51c2Ye69ns5nZ0bqpn63xPrS3V3iOyqch6Pik6K2dMJuv54sXR+93SGa2BWkOq56nSJyh65vuR
-nig2q3HO/MjqQydHqjVK0VPtDz0bFVsRO3u7qnxn/2Z2V/rpVdueLzNqLameB9bvnk8rudHJ10oM
-H51fK76t7u2qfWvMSLVvU+ptJU7q2qn9qLpWlVqvnCHZver8qzlW7WUrdhT9lTpn2VX71MiuksPR
-2EqPFeW5t9dGuv1x5zmhQqcH6ub8KKP2slnfZvk3o6x75K+ypxSd3Zrnye06o5Wx43i1/ih2u/Kd
-fM9qTicfLFb2UTS2WyczG+rYaC8o57WnZ6SSV5G8NTbyobJ/1bpnjY188653106pk9lenFFyL5Oz
-xlVyafanIu+NVXqhnXX+N5nbx9/8nRJ1AAAAAAAAAAAAAAAAAAC4OF9SiejN5Ftyv0NFpyfX8cmy
-++i5Z/qt3z05dS67YhXJZj97+nf6rDDa7K5vdY6PRI3nzfjPGlPNg0w2y9sz4rWqs7JPO3ZXctJa
-R8W3qv7ofmWs4sc8j2ecQUpOnpFXqszute7MN/NtFSsHOmeKdb3q31k16lm9kOeDV0us+HXXfuWc
-OLOWPcJOlIc74qbQ2QtKn3BFduZtR/+j49LZsys2OvJn5lLUB+2yodqsxn+1PnX7gWfu38qZvqvX
-WaHSh+y2F+3tzG61z1D0Xz23MvtebJWxO/3YaSuaS8XWI/qkFVbO667OKI9U291YVffvbv2ra7xD
-/0pf5e3tlT2/q55GPmR90q496MVW9bljL6vNleuqzcyfzlhLj9rTVHRGelZyaZT1flZ6D+tnxe5s
-I5vvCjvP8+ieGvNorGXrmWduhWo+nLWvq3qeEVv1XKvso/HSx9/e/wL4dmgfd+Fprvzpf/UjT87S
-4+HN3bo+x62ix0P9eJVsvSI71Y+0yT4qYx6fyURzsnxaibMS/+rHwHhUc8+LsxL/0R/1Y2MqH9VQ
-zduI6kdfVD4uJfp4DIsonhUUf2aUj/PxbFU+jkXdy8peUPR79yy8uFV03PVU9ktkV6ldln/V+Htj
-VvK2WsOVmqyem9m+y87wmer5pfig+qPUYc+X7n5R9rty3ZKLbKix9eTVfI7WZr5XiWHkWzQmshnF
-VTn7qr2lWgey3m6lBlr61bVe6VssfZ5fkb9Zb6OMVX2MakLVtmJvHj/fq9YUywelN4h6rUofqdT8
-WU7xR7VZ3fORXc83y06l/lZrnJLHyhqN91ZqYnSmenIVfywbmU7PTndfrqx7prNqw7KzM7c8nyLf
-svs76+AV86tyxng9d7WPX32eGanqr8xxtuPVkOy6F5/Z7krvnp09kfw8zrsfySk5vRLbqH9Se/KO
-b5G8+lxhyVT61Agln7vxUftjJc87Pdk81vIxs+XJeLor/Z/Sj85js3qr1AeFalyjfKzUk0hnlldq
-DansfTXmXZ/H8UqvP96r6hzp9LrdM3HWXakP1d5v5TyN9mB17SrnrHrduq/oz+pKpmNl/ys2PJ2Z
-fK0m3z7+9p9XKiAAAAAAAAAAAAAAAAAAAFyU/COgAQAAAAAAAAAAAAAAAADgJfj44bfbtz8T/pz+
-KPhm/Any56cvP47z7nnynv7Mlmp3ttH1TbG1gxX989hsfTtr2s0Nz66HGgNP5338bMfS6/lSzUPP
-n2r+KOvozcvTH+Wzp6cib92738/WpbO/VvI2i5WnR91fls3IbmUuaj3r1j1Pz2oN7J4dXvyV/FRr
-UWZrlu/W1eo6VveCZS+77t3Pcto7r0dd0XyzsZFdbx47eg/VByUOlv4oZ6o+j9c7e0DxoeufhaK/
-Wht30smxzP/MRiWHrxCrLEbVvZPprMh4NiOZSFc0PvNH8b/iT7Wvy/RG8lG/puRt5VywdGe+e2th
-kdWc7rqv+KvKV86M6Bkm80ep/5FeC+vsz2pb1DeoPu/qez2dI5V+Xe37VvrXiEr9zPa65V+3v+nk
-l9KLK/LPyC3lvFf65nGsWhfVWm75tmtfRf5buitrp8aqEttZTvHTIjq/d9Qpr35mY45jfa+tPCMo
-Oaasu3J2Zb1LdAYpa5flSVW/N585VxVbloyl29LZ7ZeiPm/lOWKl9lb7zpVzrdu7R3VpJFvf6lkT
-6fLku3oUnSvykUy1d4ps3MnyqrPfM7vRmeXJd22p46tz7+qP5Ff6ulF390z38Pa12scqdpP43D7+
-l3+x6akIAAAAAAAAAAAAAAAAAACeCR8BDQAAAAAAAAAAAAAAAADwJvz4EdA/vB/8tajqPnYe5+m0
-5Of3oz15z5bnj2frq/HzLqo6PX9UPUpMlLE7YrvCPF/L1mxvJfeysZ7dSPfuXIrw/g2H5YPnWxTz
-bKznSxTPbHxkt5tvu/b7yn5UY7gS58wHb3w1B2Ydlfl6tixfLbz9m+VGFNtdNa3imxqHbi7NflVq
-ZjUOyhp657uSS4rts+TncfNYte5Ztfqss2KeY2ctrbVYjV01Zzu2duk5s88Z9at6s7VQ8tCzpa5z
-5xnhzP0ZyUbPGNWzo2q7Kl9ZS2/sLBv1rUovpJ5Hke9VW1H+Vft/lexcWtnzVzvLKs8Lma1OLbD0
-VGwpzxVWn7qaGztyYNbzaN9eKbdmfTt9zs6FSPaMnqCqs+J/Ni6Sm9llb+VZscqZfZua12f6Hz3X
-detzxa/ZVqfHVvqDFR/UMyLTk/nRee6tPlvPOizZTL+SM+rrArtfR7B8vVPtU6uyq89js46R6v71
-xlR66Ejnyr6L/KnU9ll+V13dkZNqLmQ6o/X19EfPbdYYZd0je7vx5ri7d1o9W0c9d9S8zXRV59s5
-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
-GdH2o+2bJzPbq9TJ48jX9xjqg5ozo24lb1fmqNit9AYeat9ROcuUGM7y1vXq2F05pvRRs85a7bOZ
-59T1IcrPap+j3Kv2A8p5sdIDWDpmOme3tz6WHu9eZy5WPlh+zbLVnz2blZ8tXRaK3UhO1WNh6VbO
-NqUGRnY82/fflTO3IhP1LEp9t2woea361KmTUR2JYtPZA5YOz56yxpFOS0+VHb1glJfdepWNXc2t
-UUZdS49ObmR9Q3XuUb2vnJ27cyvyrZI/9/uVOI9UZBU9kT8zSo/u2cpiEtmp9NbKXNQ+z8KLW0XH
-XU+l547sVvd7Jf6Kzup8PX3Kuiu5VI2PEj8lZ7778+MbGbm8Vp/UdVbiY41X+2DLbmftLJ9n+9W6
-cabP4/iobntnVkXnSGc/VtbUsxHt2cq+U9Zr9qES24huPsz3FJnKmVw9Y6t2o3pSOV+U3FPjFs/Z
-r5lRXmX1JOoZqr2EhWo3sx/JVPuZzIfZVvVc/vbTn/7tf/48juP4DHLt9m2sIjMyyt8+4/EVRluW
-TsXWKDP/HOmO/FmZ38/ftZHr7Mp48VHXKFvrDtW5dGMerbunS8kJL87euB05HFGNz255JZ6rY7s+
-V8Y8CmVeFf9X93jko+pDZLeydp25VPXfGeM/jl+NW6dOzf6s1LrMTqZ/x3qpPnjny24fdvYkkY3j
-8Pfyao2vzrHbD3RqctQnnBmXzDfVbvfc71xX2FETOjzSVhU1ztH6RmPP6KM68VR6pvt95efd+qOx
-s45RdmWf2Gv6+e3a7SfZ7Hkvs9dl17PKqKOSoyt98jyu01et9iC7+nalJlTGW9c9G3eukl9Z/kS5
-t2r70WNXnsNX/KnUsFX7VXvqs/ezXuupjFX71FnHXU91DVb6Qk9Pxb6qv0o3N1afx86O5yOfG8/s
-0dU47apjal8xy3j7K3rm/PF7NGO7sw8r/nn3d/Y3O+R3nhMVf6o1IdLRsaWe3ZnMzh7jGT3PSh9Z
-jf8oV60nK/WnM1bpY+909vguzti/lv5qzbz98d/9Z2MbAQAAAAAAAAAAAAAAAADAqzF8BLT1bcDW
-PU8mY9b/Jfl5tPFFsBfJjPqr8plviq3xuuVH5pun07Pr6bTsR2NX5pL5MOJ9cnw1x0Y6+WDZjXzO
-bCk+jLq+OD9HVPPKk+3u59W8zXR2ZCpjO2tn6Rz1RuuY5flKDD271foZ+bwrz8drO2qsso6R3chO
-JFORi2RXzzhLZs41JR8qdViNZ/VbQXbUw+r5pdZ/Jf+V/eLZquhRZbwxK3V2V21Xzy/r99X+4K5v
-pa+r2FLHV+de7Zl39LHZHvd8V3RF96PYqGvUqftq7bXGKT5F+jr7tDtW0dfdy/O97nONR6cWZWeB
-pTd7JujUxmivz7pWZGZ/V9dS9cOSt+5H53HlmcaiWot2nK3ZOmT9wSy7cu7uzqWVPd6tFaq8dS/y
-S9G/s1/qnhXVWmH5kNnNnq+iZypLPpKrkvnW0VPRqcThcK4r+TOPzXo+pYYrc1TWUY1zdS8pZ4Sy
-r5ReIToPZ7uzfs++Mpdu/nf6zjPjGf2c+VftN3adg9V9GtlS1nElzz27nh2lRlk6j0Am0++h2FXz
-p1vnq/2AJ1M9u6r7W8nJyIYlq8R8HKPmScevaEynN6icKdVzaqWXrozfwYoPP8/39sd/91/5C+C3
-Imp+AAAA4Geyh0EAAAAAAAAAAACA1+Hj9sDPwb4Sn5/H8Z5zf40Xr3fFP9Lz7Wsllu1kej6Hf0Lx
-njl1HrvWyNP9Cuuh+Hn1uVjreHWfFc7Mzyszrt0j1vEacf757HyHvXmn4+e4LtdYozU6c7DOd6/e
-3a+pdnbH9NP455yvvF53zsq9s3P6EXvmiv3n1WvF1f2zuJLPV/IF9nCVNb2KH+9Odm6c3deq+nfk
-g3JG/grPOY943Q2u+dy40ie+23Ngxq8wx4yd+fmoeK6eKSuvY1Z0dvRUeeSz7TP2i7cuq69z7ZA/
-q7ZX7Wbytz/9/f0vgG/HcTzjj4FHzxT7XlTnsbfi9cxeJK/MYZeeUfbT+LnKrGe0b/kz26rGcx6X
-jbX0V+eu+KzGUBnryRzG9chOJaaefDU+VT/HMWfJr5DVAc+PXfmp+raip+JbJLtjPTr507XxyPNq
-tcbe8dZ6hU5NVvJ/R/3xbCp2d+W/Z0sZW61p0Rhlv2c6qr49uq9TeoZRTu2Xdu2ZR9QOL8+V/I/0
-nbEXrJycWeljLB+i83alj8r2V2Qzy7fd+2i1Z+rUyZU82hnbFbI8UfI806fYVOw+o0+xOOOZuVOf
-1Z67shZq3cjw8lXJ47NzK/o90382am6NstW5RmM9X3atxa4+xHrGXq3DVbmVfLRkurrUHtHS5+V/
-5fnZe16yfPX8iOxG47rPBiqV2qXGYcdrE+oz6kps72QxjuTOeh1k5RxZ8W13nKv+dGQq+3E1D3fL
-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
-AAB4DTijAQDeE+o7wGNhz8GjiXPuo/IZ3cdR+yzr1c/BrrLjexBGOt+xoviw+3slqp+RHn1+ePuz
-xIv+7/xc9ztnfK5+pFf57pLsM9vn8dXvCIh0WPe88ZlsNs7y4YzvScl8Wv2ejup3puxm5XP+le+8
-2Lmvle+LGe+f8b0qO9ZCibO6pyq2Vr8LpvvdFrPOkZXvNOl+l5Di28r3m8ys+LNyzlbkV/uxHT2G
-khu76nxkP6stnoyiR7k/y2R53vnuoZ1nSlS/Zh9Xfu/W4ug7g7xrma3Ks8aOfHiUD57+qq+Pkh/H
-VMfNY2eU/nnW1c1nZQ951yO7Ht11Ucdk+bTSD0dyFX/VOa32BRGd9VLO8vF+1l+qzx6dZ8VuflXX
-V/Gzcl3tBVZzqypbobruo0y1v6/GdqXvn6/dr3dz1bLTHav0rNX+r+uDVRPuOr2ecpTZTfX5JNJz
-J8orZY5Kfu541prve3lc8a36DKnmQ9Xnaq3IWNETzbfaN1f2hXqeKnaUvKrWuu567VrTzMboV2a3
-mqvVsXeqZ9aZfaJK5L91Pbs3y3T6qxVb1rjxXrSXu2eox2q/Ue0Jd+9NpYaP16tnsTLm9uf/+N+N
-srqfr8fn8eXEfwFxtv7M9nEcT7N/NXatxTPXNOPKvl0d9guscGb+sK/fB+oMnMEV8qrqwxV83ok1
-H2+O8/V3i8UzIZa/Lqw9nMlqfr1ifn4dvi/O8vtXfz55xTUFAMj41Wv7r0b3LKvmyc684vx9Lx72
-BjAAAAAAAAAAAAAAAAAAAJzLl2c7AAAAAAAAAAAAAAAAAAAAe/i4//B5+/4n3bfP738U/Hm7/f77
-KDPKVa9b9yKZ2+enK58xj/V8y8aqPnhzrMx9jrn1szqHzM9Zp+d7xVY1bmq+VexmNrKxlg8rcfB0
-qterManM15tXdN3C89Nb33lsJr+S//N8M9vqGnky1ThYa9GpP5Ytz29lv1Rj7sU52kdV/aNsZZ8q
-tdlDqSujnDonxf9uHYjWItuDZ7Or5o+6do3t9BtK37Jyro26V3oMT3+1J1FsqvOd5Xb1OBUfKr5V
-11TZv1U91vVovNIPWKi2OvPK5pydQdWeXI2/OpcsN7w5KmeGd291v3f3WvUMOjPOXdnMv+r6VmNp
-ncfK2ntjo/HVOqD4lp0BlT2u6MzWdOdaR3YjP1Wbq79b/nj2KjWn4otnO/NvZa0rZ8R8vZvPit2O
-bGfNMz1qfO5U4zjez2papEepb+N1pS/v9sFqv1u9XunDVtYrilXVh2pPmZ091f5n9nkkyyv1LMt+
-nv2t5Pls26PTq0X+VKnuHXVO3X1XzZnMD4vKvDq5UfXTo7JnVZmRlXlV8lbJ1eq+q47t7Musvx9R
-16e7j1b7z0pvMMt3UXOzG9tRXj2nun4qKGfjeE+V98ZWz/FS7v3pP/0fvhcAAAAAAAAAAAAgsevN
-AgAAAACAFb789MMJBr4YP1+Bq/nzbH7lWFTnvhorJfeekZ877Z3tf1d/NKaqc2WO3thM54r/Z+fT
-r1xDzuIZ+2jFnjf2lXKjEvOzz45nxO2qvdEj/NphY6XvPWOOHX92+X32fOAclF7iVdZhV5+22rfv
-iterxL3Ll+nns+O5wlVya9WXM/RckUrMd8Xh83Yz3/x95Jn5SK7me6WXf7X12P38ptp8lK0qu/y5
-2rxG1P79DLuPeo1pdc9WZZ7NI183ueLrvGe8ljreX+EV8kfhHeYAv1HtYy1uf/lP/+PbXwArfwh8
-G+S8n2f5EU9Gte3pyOStsYpdxf+ObwqZzijm8zxn5nG34J7ljzLfLObquldY1ankSTeXxrEjP477
-+u3/X6R1HMd7a6j4H13/Wc/XYy4oVm5EuuZxM9WcV2woOtU9VfWtur+Usd16OI7x1nSW9fK26nPm
-W+cMqthRbKn7JdOvjunuRxVvbx7G9dVarZwRlRpryWX6M52KHY9qLR3vVeO5Uos8+WrPE61dtwfw
-9IyoPkZ1YGVfRbni6Vd9iOxX6+Cqniz/V3ruTP+Outfxv7b+3/ux2d6oI8sNxS/vXjWvvOvanvXn
-q9SQak56vp3xPDXau7Pat6i2+uuRr/VMLdd/XO/Mrkdnvbp7pFNTOvo766/41tWt2rL640p+Rbll
-2cr0q3ZX5Srjus8tqz5X1mOmclZ0ejL1foT6nFvpfat9sPd8OPuU++q/FuORPV95PkTPYBYr9cOL
-rfoM1rFn6aleV+ys9Cjd58lsTCazwo4+Sd1fat240/cp70k8/SvPzCvP1R0qPbyix9MV9Zk7ZNQ6
-3F2X2YeK/nlsZS7VfK6uXWfu1fVSdM7XjuneGbX0Oz+/l5Dp6eRStaeKeq37uJVzxLK/elZ4vYcl
-8/36728Af07jb4YPnsx8fbw/3hvlLf2jrvl+dr1j1/Pb0uPpnH2xbHk/W+Nn3ZHPVvxX4qaSxVOJ
-/3zfGuvFaSSKZwXFn5ksl6J1zmIS2ankc+S/p9+7Z6H6kFHdL956efai2qXkpOWnpdezb/mjzMuS
-j3Imm0vk34/z/bkRinzzfNixFh5RfCr6qzUzyg3Ft8o6zvardeNMn8fxUd2u9ADRuisxiWQVG8r4
-WY9XY5X6P/uzUgMt/VFeVewq56zaB872LJkot6Oxqo8/zuvz28+3lm3F3jx+vqdc93RHNSGLldrf
-evpmlL0f+RPZzPxY2bM7euyZ7Jz15KO9pvY5nfgoudqpdZ4/kR3F38g3tV6q+ySStewpZ4zqy6xf
-nWNko3o9q3uVdVb2i9rfWD78fE/rZa0YVM4Yr+eu9vHKGaPmV1V/ZY6Znex6xX4lH9Qao8rP47z7
-kZza31tENVfpnyrPCVXfInmvrnvjqudx9bz37mfxmamsqeeDF59KTzaP9XyJbHkynu6VGq7kQ1Zv
-Iz/VfmG2X+21ojpfqU0ra6SeNZZMFdWHkWoOZ2Oj+pb53esffu4ZZt8yny25ivyu54RIxw66c1Hl
-Kzkf+VaRUepe9fyKznFFz3hfyZNRR6U3iHP4+77I9oLlh2XXXpvP4773ovnurkVqP6D0h8q6KzW5
-cobOvqXn7J//8/8www/QZaXZAIB12IMAAADwK1F9QR8AAODKcK6dB7EFAIBXY+W1/o+9rgDQRAE8
-G/YgAAAA/ErQ+wAAwDvBuXYexBYAAF6NlbPrY/6IA4D3wf4YD4A675JL3z9aAwAA3oFXPJ8yn19x
-Tjv51ecPAPBqvGLdfkWfAQAghtq+Bq+Zwnvy+/cvR+8if97s++N1T2aWzd6tznR64yP91r3xmmUj
-06POZweezd32d+mK4trVFf3sjfutaGtGq/mvzqW7Rko+r/g574VMXvWhamtHDu+Or02eS916UkXV
-b8vXDWb1M/JhR73q5MnZtbESc8WP3b5W6oNSN6pjz4z/WbV3Vy3aHRelhnvXO3GL/FD8t2pFRX9m
-a3WdvFrm6e7MO7Kh+lXh83Y77t9hvMOm6otSB/14fj9TbT3Z/bpv1b6lKx/ZVWM2xsfzv7LXOmfx
-GXX8jHVU9/AOOjnR1dOdy5yHVT3VmKv+7zxjd+r07Hg/n2n/zNqbyXRyq6NHkVd9ifzqsK7z57pt
-2ejEeRU/zrnPo7z1c6Tfk4987OR3VM+y69Wxig8ra7dz7BxT61zYvXese6s2PB1RHlbyJLORjety
-xvl119vRre7Brt3OXtthd0WPmg9q3ar4qeSzL/Nbbd9VS89gl61OP5TVw/m5WrHlyazUpa7+Tkwq
-8tFe3lXzLZ2eP5Zc1V62v1bsVOTVXqJbb29/+i//5+dx/PZO8NdvF78MAl9/GmLLfBl+HmWy8ePY
-kVmPZ8vzNbse6fH8GHV41zM/o3h8TX7O7M3XK/Gw/PS+F8ObSzbfeS7eumexUph1K7HN/LH0qX6o
-86rsvSjOqo5ZLsrtlfVQ9GR7sOPzLGtdr6yvsjeVHFP2SDRf1dfZ1owy1roe+ZPh1W0lb6u+rcor
-+/eMvFX8t+wrNdnzQdnjK3VA6RlmuRFlT1V8mHXO17Lxlj+3z+O4Py8o+06pUZ4txZ9ZLrteGRvZ
-93Rm+WONnfUrfs1jLaL61eltIhuW3I75eDGfr3lx7faW1lhVZ5RHnb6qKquOjfLn7POiOq9qn5np
-9PxSf6/mcuX5xfPLI6ollZ680sNXbCo9X6Sr0oepeVU5F9Vz3dPv2ermt+K/es6ouWXpOCu3RpnO
-eXk4Mpn/lVh47DiH1HNEiVWUh8o5lZ278zVFtqMnYiXHuufZ7LOyz5QYVvZr1H9bvnrnbseuNTai
-28vuOvsVP5U+fqVnymTnex1/FB+Ueqf0uJ1cycZmKHlY7b12XvdY6R1HxjGV16+V3sMbUzmv79fU
-M8jyR/E5s2X5OOuZyfR4eqM9XrG10ot6+j290Ry9uYz5pvRK2ZrO9yL7lv5RvlurlTMxQqmrlXqu
-ku2FaNxq36bqV+Kg2qr2afd7t7/8l//r8/gJpZx4qscxalm1UNy3bFt6lC3j6a6mZ6VMKa205VN2
-v9pqVdoxxQdPZpZTyr9yPdMftXiVlt/zQY1htxxa9qyxlp5RrrJv7vKVfOsct5W96bES8059qPq8
-I587jzKKX7vnMtJpaSstqrq+mT+W3Ey1ja0e19HYTus7X9s1thO3n+9/Pb4eX0pzr9Yib6yXMzO7
-c0B5lFFlPFbqW3QmzntV8W2lZ6isiaUvy11lf6l1sftoNfuz0gtVc8aLx444RDor13+OyddvMl/C
-PMt076hvXj2p5HPUk0Xno0J09sx6oj5RqZnRGFVmXpfVPaifQ7lfmd1snbq6LZ3d+qv0XoqPSn53
-zqcMJT/8tfj67drPnlV6R2/cz/Z+prOfuzW6kruzH8oeVq5H+VXpTTv7MbJvEdXc6u+e7kxH9Uya
-72e+eetZ1e/1iErvUh076lD6+AxvLpEPu3q7bLwSZ+Xna3/srAAAIABJREFU2a5yZld6Di/m0bpU
-+ioFxQfr3t1OZ696+iyZ7lglhiPq2VE5mxSqZ4J3L8qTSp+jjK3q9/z0ff7x2STrTyKqPbGyHuP9
-lVgpYz0947VqPe/0DJl+ZZ+q+WfZ8nyax8z31TO6snaZjfu1ys+KLa3W2TPp1LfDuN6pz5VYRXTH
-qj3bel113gAGAAAAgD7KgxJcC9ZsDeIHAAAAr0j1jTEAAACA1+DD/Wxo5+MTzsCydfv8+fcz/Xnk
-fFeo+qnE9ldCmbuXe8dhj83uvxo7cgyuxTPWaLXOdH1esftue/kZePGfY3u1unFOvv38IlI1PyP5
-q8XwiswxyuP55WHxfPb6nWN//wunu/x8dLwr9p6dCzNnn4VXm++z6MThVfdDB6t+j7+Dz7Nj9Wz7
-Gd7rI/M1eD5j33b+c9prvPn7bq/lPWrvKc9UVT/ebS1203ntdb53HNeL8SPW/VlzH/fCndmH3bWY
-fQRX4ao1J6L0msOf/+v4F8DjiM/hmvdHwrdBdvz5Cnj+ZH5G870SVT9X5jWO9X5e0WndO6b7s/wZ
-+fYqubF77p15rfjwjFox17asPlj3ZplqbdnJM/J/px3FxtXOlEeizP1q67Vb/6rdZ+3Hqt3d9USp
-YY/gGXVy1r3LVhTTio2zc/JqNXPVnyvEa4cPV+gZPLvPzJlO/O/nwq59Nz8pq7XjinHbXe86++Ks
-868zt/l5tTpetRHp9c4OJSefVcd/lfyac6Ord7VX2x3PM3rAar19Zl08jp/32lV6oohH+Pns2nIG
-StxWXzO9Qq+WXa++rrqLna9H75jv6uvLHmc8L3TlK2MsHWc+fx8b9T/jdfld58irnDvHse85V6nD
-I4/qmZR6/szXps/sue153f78X//vV8lOAHhbxodogBXIJQAAgD1Ybywo934ViAEAwGvBsyIAAACs
-8Hq9xId3Q/m67Oxrn2d91a8W93RlOmeZ0V/l67gzu6NeT2fVVvb17ZFM9WvhozlW/bBQvw49W69I
-/yhf1VPJKwX1K8erOebZmnWrOjtfC1/1rfvV9F/FwlnNq8pcOuuifN169jX1o55ofayaU623EZ7+
-7CxQ/LHGqP7M5PPKc0ndRyt55a1pvhf6ROddJSc7Z/2uPWihrImKcl4r8cnW8Ti0/aLIe75X/BzH
-e2sXnaVVPd11V3ywcli1182xzAdlX3j6qj9b+qs9YfVM8exVbUU2qj1zp1ar6+j52ak/UZy7Z4ky
-tpI/870fr99c2S/f7kXxtfR7flq/R1R7Ea/+z3az2Fnxme9FZ7/noxKLlXgprDwD3FHiFt3bMbdK
-LO/XlXrh+dOtX9U9E/lUfTaw7Cgylh8qnXHqmTxTWesKlX1pXVPzu9pXRzlY6eW8e0rfE8l0+/co
-J6s6v/tzk3rx6l5XYpL55umc9WY6FH+qc4n87PpziNdXeqGdfXDXrjU2QumzFbKzyZNdtVOpFUpt
-8WypPfyO9dqVG5HdleeCTH4c04m5lzNKrlb3stJDWnZmPdb1iKhPq/jTydHZ7ijf6cGqtjz9lfyZ
-ZcZrK7U68y1aa8XnWdaSt65/OW7lWlo569U+pDLH21/+4be/AL4Nkp+D5O3r99/nn0f5++/jz6Mu
-Zawi7+H5PI6f/czkZ38snz+nqHpx9O57cRtlPr9d/3LY8Zn1zuNnGS/mnh5lvtF1L+aZfS8+Vlwt
-371Ydf30dCq5qswxk4t8HouGEh91z1r2PR86eHtE2TuePxbqGlXmpdYcy09rfGbDIsrPyNcIJf8j
-f7I1VXR24qnotGSq51q07sr1iv7If0vPfD3zJ6J6Vma+eXP8/Hoct4X6mV1XyWyrfYsiU+k3xutV
-OueX0jNkfll7Sj0jrVyN9oa6buPvX7/9/kXUrdQiz9bsj8VK72HJRH4q/bbSe6u9aKU38lDrv7Xm
-yhqouV3NZWWs6vOu2ujp3HG2RnrVXI3GVveVN7a6lzJ9EZEtVYen0/Lrfj87v1fmPspU9pdSAzOf
-PfuVeSlrUalLd/mo16nEuJIXap9aQT0zxt/vr1PcFuee2fHGdHMrspXtKWte6lp0e5ysbnbydr4W
-6VHPoW7dV+uVci5me8Gz5ckpthR7at1Qz5bZljLfyLeu/5GeUZ/aT0djldru+a9c9+IfrYtSoyrr
-6+lX4m/Zz/y05JXaoqy1ui4VHzy7HmruKftIGdvt2aN4Zj5EuWHZn/Ur9dmb40ruVdZ3JT6Zf5YP
-HsrZlK3paEM9Qz0/K/XWGm/NK5ON6J7d3tiZin9KX6GMne0ra62cKZ5+T055X9DS9YNf9zeAj/Cv
-prKPt7I+V1tl/v4U6+fI3kgmH33ni+J39v0qs37r58hPz2ZlXqN+77PEI/1ZrDwfPDsruRFR0Vv9
-biZFprNfvDXy4u/prOj3fBtZ3ftKXmW+KHsz+mz8XbldqQ+eb50aOI6t6lrJN0+fkpNnsvpxGl2f
-V/M5+ojMuz9V386Yy+iPJ79yvuw6c0cqe7ZDpTYqZ+ssr5zjGVGPlH0X0sq5nNmac0L5qNjo98xn
-y7ZnR70++5LFq1sno7lVx1p5VVlvJeer30mzq25HvnX2fGfP7rLZeXZS8mTHWdLdL9U+aryujFFz
-WxlfieVMVK9W+r/Mvrp/s3pqXVNk7te89e7m3kj1LO/EXNkzlWcPJQ7dfsnT2a09v8nfvv42/vuL
-P5WzQZ1jNQ7ePlqtbbM9S6bTn0R2s5xcWU81zt1ePzrfM52zvGXLG6/mUqX+KHvW8j3ybb7vxaRy
-xlfrScRKjzHKrJxrZ5wRj+jtZtnVWKk17a5/x17wxlf7tmoNieicV7MPWT82y1d9qO7ZWWenx82o
-9tPjfaUuVefl5duIevZ546KxCt4clT0S2VPWd6TST876qnO2fFFqyCy3grLHV/qcqry3LpaMsr+8
-Gu75Ue1PFNSzuLJPhyt/+Yf/J4sanEr3oAQAAABQod+wIS6vCevWh9gBAADAK0IPAwAAUMX9DmB4
-FDQuAAAAcDb0GzbE5TVh3foQOwAAAHhF6GEAAACq/PBp0Z+32/F5O+9APVt/hbP8eNYcPbtXXtNd
-vp05x6vkq8d97qOfu3y++tyvgBX/XTofjWX3nXPgGXG+WjxVf650dv8qPDrmZ5zlj5zDK+To6OOq
-v9n4K8dDPTev3L8+iyvE7d15ZvyutL5VO+Td9blKfpFbPa4Wt13PwK++vmf4/8g6/448+vkJHsMZ
-r7ldmVevjV2U17V/xbjA9ans2U4O73gt6fbn//b/8hHQAABwGrfPz5dr1F7RZ4BX5fb5WyvKngP4
-taEWAKyxaw+xFwEAAH4deP0L4L35/S+A/zBc/IMheL8+/pfJV4nsKv7Mfs1jlZ89/d49xZYno9iK
-fPZ8y2x5tjvXMx8q9med0fVo/G52zbcytrN2in5Pfscco33o+VDVb/3syah2z8ydiOp6Vcfuplo/
-R7xGsrpeiq2Vuj3yZfBZtVu5rlCtbco54l336qpiL7K10jPsOl8Uuyvz3XEW71yjnWf0Sj2P1n0e
-8+V2+2HPqfZHmTPzSsnhlZpe0bGif0XP2f1PJZdWfMjmtaMHOptH2lJsqr4o43f9xUO21uq6766z
-qp1Kru7I38r4M+pY9Xyt1KgoPqv73fq96lvV58yneQ916979XO7keeZjV2b3eql2unWg6q/nY8dP
-ZU8pe9n6uUq1XkRrpcQksqPOdwXFVmS3kzdd+TnPuvu9m1eevBrDSqx3n1sVPdWzbBcrNdP62dOv
-yO+o3Tt86NaBqv+PrJmqzmys9Sy+ale1vYJXf86o+d09u1rnr8DZZ1PVlxVbK+fLrnxW8rPbS3g+
-3/7qon8B/I/H620IgEfwj9/+z/7oQW2BV4L9Dr8i5D0AgAb1EgAAYA/POFNf5fWpV/ETAAB+5uM4
-xn/lMb4XfAuuWder7yN7+n/7/Q+hvYrOjkxlrDd3NSbWHG/Oz7P8PC6SV31RfKiMHX04HJlIvzd2
-vHYzfh7lPZ3VdYzsRnYimYrcb7Lfm67qHuys40h1veZxkWwUz+wvQSL5n23/WFuinFFqY+azWosU
-nV09oy4vlupeGOUr+8jTtat2zf5ZqGsdjb/LKnsk80HJ88/pISurpaOMWg/Hcd1/D1Y9q6Pxox6l
-xlbrvKe/e1Z6dkddlXPJGruyLpV+KDrvsrHetfm6kv+fRg84+9KtsR4r9dbyK9K7Oq+qP9GaqutY
-zU+11mb5FsWzosvK9ZmVXi7Sr9Rq7/fKmaiuUcVuNWci/yxfs96puh8sPapOZczhXK/2xFlNtNbA
-8ve3a39I+zNlT1s2LLo9c3RPOeOj3mvWrc5NibM15i5XPQe7feTKno9yobsPlV5BOQtnVnPLu5/1
-MJXzIcs9Rb/lW1YrLBsRlR7JsmXZVHvuys+jjeis0nrHn68d0/3KmVLdp5Gt6n7u5Lllt2LHk/Fs
-V/u/TK81Rll3T4da337m+7O3ukeUXI2JX/uu7Ge1dvb6qj/IcejaquaVqr+6LitrraxFVgOjOCh1
-MtvnStwUf1SqdWzFzg69an9VrYfVc9DSVV1f9Yyo1LGqfuVZwLNX3QuRnq4PHp2ecLxWPUOtsbW9
-efur//Y/f5f+Otj64uhQZDK+3n4c+9WIW2T/fk/Vc7++MifPVqTf0jtfq8TTm/vsm+eDZVeNs+Kz
-N99sjWZ5T7eSb9m8Ij8zu14cvHhGc83iMI6PbHl2v3z73qavw8d4qPHMcnL2vbKXo3hGNiI7lbyY
-x6xcj+a1Yy+rvo33tdz48XdrPpHfmU5Lt+VrNFa1O+vL7I7y2Xh1fZXzy1qXFflxTJQzkY0ZpSZF
-Y7wcqOR25IfqU2Q3kh91V+qYp0ut25Vzc6XfmOcy68n07q5Llo7Zpqo/81Xtj5R9FMl3fFX0WzYq
-fmb2lXhV80DJ1U5tqeqP8k3xI7OrxEG1ZY2prkW11insWGuLyP+shmf5q+Zytk5R32/Jz2NmHy2U
-Mz7TM/f9Ss+q2KjssazXV2LW2S8zyplW6UWU3jrSn+X5/Lu6JtY9zx+L6jlZzf9Kv66skbrPuz5a
-vlpUzrYsvzrrXukzlLFKza3u92rvUj2DLT3R2azENpuv52+nhijzqtb/UaayBz0/R5TrXswj22pf
-5fl916HsI8VPRae6BvP1SjwsnzObkd0sxyxdqg8KWQ85X1f8icZ1zrLM7yyvIn+s656dSNcor+St
-Yrdynqg1pHI982+WqZ4vylmgXPf4uT58fvvZDqha33bt30w+ik+29kq9nf0YWZljJc9nm5V+Y7al
-nAWWLdXPlXPKkvX8vP3lv/9PIQwAAAAAAAB9shccAAAA4PXhvIcVdudP9AYMvBbUFgCAOh/PdgAA
-AAAAAN4fXqwBAAB4fzjvYYXd+UM+vg+sJQBAHec7gK1r9+ufzs9VqmM9u9YfMEfXI90Vudtwzfo5
-s5HZqer3fFTi7K27khsVf6zx0fUo3yo/j/o9n9Xr2R/Me3ZVW55OS05ZX2UdPR88/VEMqrm6Un88
-Pcr1kUp8VBlFvpK3x2HHXc3zap5Y1+efMx8iPJ8tnd5aK3VbraWVNe3U/Eo9V+pAdV6zD+O1Sm5E
-66zkuXc9Ox+ra6fm40qtztauegZF/ij1wUPNJ0vfSt2Y7cy6Kr1Nd6zSdynxrOZwNOdZ3pP1fIhk
-PLq9upKPnlzF3ywWas/TmWfVVtYD3qnGYWV9FVZqSKTr/nv1PKrar657pZeLUOuS0q9k+R3ZU2qH
-p6NS33fVQ1X/jt5L1aHUESWXHpFbdx3VmrjSD0V2o/HVfIj82LEu1rVubqzkpzWuGtsqlV45q+OW
-X5FMt4+c8c4JpcYehoyqc3efNMtU+vX5nD6S67PtbqzUZxiPyr5We/dqn5HZjajU9qiXWvG/8twS
-5XnlfJl1dnvEap6P+r2xWR3LdHf3deSDZatqY6UmVJ8lqvtlRKlpqn7Px+q+s3xQZTJ/rPHR9egc
-qfw86lf3gnc96z+VPb6aJ5W8PWOPK+eUmhtKjin+VNd0pBKfXOb2l//+/30ex/hl9xr/6Izxrnd0
-/uPws3V9tuPJWzKRj4qeqk5P3hqrxHYlzlVmuyOeP9kaRdcr6x7JdmPozdHzM/rZ88fyW1nTlfmu
-6FF07pLPdN1R8s3yoeN/ZDOy26GbY/PY+Zqq85jkM/0rRGvRtbWaw904Z/Yi+ajmKLpXzlzL5tl7
-VjlTVm0qZ5NShytrd0bOjCjny//P3rs1ybLk1pmR+2yyOd2k3mck0+g2kkiRHFIX04Wa//+rTuU8
-nMqzvXzjshYcHhlZtT6ztq6KhANwOBwOjzq7KqpL0fnN+GaR1UPGRlSXvLyxdM82ve/nsYicZd/z
-w9Obgewd5FzrrlezDHNGov6vnkfsHKxnlTN+d6yr41b3OBLrI5BhdaKyzH0wyr1ZLvqe0WWxI287
-6cob9uysEq0XMxdk3cfns2zW30Tnd4f/kc/o56jMCux+ifR4Y5Hzo2qjsve71m7l7M/mwoLsX7Q/
-RvzpvqNG51a0T63nWQ6yc2fvIZ6eeWx2rxhtRD0Z26vN/mUyGWwf6c199APZC4h+dl5onJGx1nN2
-j7P7IvKHqXuZXGYLkbfsrOzreQxjd/ysUg89PUidX6kDiC9MTnp1cvQhszfLo31X5mflebVWo+c4
-MzaKsyWT+eqNfzxjzzhL36zz4/P7+/PbT7KZD131OXte0YnEdh5vyVsy3ue3P73/APje8R8eBtzu
-P2zchh9qz3Yfn1X8ifRG8pGsJTPOhfWtMu4sW5aOh55RZ0dM0LXy5LLnqC8r6zKSjZ/z35PP/KnE
-eWUvMPFB58j6tntsRw507QvPH08PW/M8/fPn3jpW7KH+dOlcyY3Rn841XfHFW/fO+p7pZHOyWt9Q
-GcsWWnMeeHPZcZYhtWKW78phVHb0r6rHknu7H8c3UOf8WbVWe/maPUP2BdKTWJ8jPjJEsYriZvnJ
-+GH5/fb+7FvTXMZnmW9o71K9H1hjdvSZHX37ih9e7kc+MTGt3vtW7mnjs+791sWOnmrU+4z7I6MT
-rdWsXlYXY2fF50h/dfzZekfdlV7pzDxfqQNn1202z3b4132PjWyztpi5R30b4hdzL4p0Ib5ZOqNe
-qON9DUrW71bWzvu8uu471oj1oaKvK2dmuQddPVm15nhyO94RoPd/JiaWjcw3hmpPjOqt1Pyudz07
-mevzyEpeRfYs/cy9dSU/2fNo9XxEbEXjorGVs69jX++CyY15HBNnxmZk94OeP/71f3ZeB63zzEUR
-QgghhBBCCCGE+Gqc8R+XCCGEEEIIIa7N9DeAWR4/O7Z1fLxs3F25XCc71veJY7TbrXu0MetE51vV
-P39eXRdEfhwz2+qe+665VPzo1v9snZXYVnPGyhFGD2trZz6gOX8Yz89gR/3Zvb8yu522PZ3s3hl1
-MDUZWQtWvgvWVrQXVnKmI99W59Itj47dUcNn3aj+s5jn7M0L9X/n2TryzBh2zbHa17H6K3m6UgMR
-u2feAc70oSPm87NIZ8d6oSC2OvMV1bWrR/L0Zut1Bs/I80hPd9/AxH5Ff6brZ3t9P/hF5/iMOwC7
-9xDZFT1ddbWLrp7Vu2+wcd19V0H65gP0oavPts7IVR+6e7tKD7Sj5ztrvrOuZ72/GMney6zcbc54
-rx35YvmT+YC+B8n0RGO733l596JZbjfVfD7zXRJq98y9mdWfVT861qXzPRTzXnLVFmMX0X/mO9Bn
-7YvZhwd1X25//Ov/Yr2pEkI8lSsUGSGEWEF1TAghhBBCCCGEEEIIIZ7B97fmd7Pf7sfRrbOLVd++
-vf+ofNf8PP3j890+IP58JpA5fhv+E4mdsfiYnz2GvJw/a06WPdYu4+ssy+bwSs5Xx45rFK3X+PwZ
-e3N3zlz57PCY89rzv5qHzJhOu33rgCnqstsRNzQPs3MZ0dOV8xWfkeerPlV1PrP3uELfc5YPTP+z
-mjOR/LNijtrtPPt27cGV/oPx51n3oF0+MLpmWa/uI/rOjPuz6/uV6/kV8nmHH17Nyp6/Wn49+7yO
-asKzfRvZfb+6sn72/rxy394Rh4rOq+Yhghf/4+i5U51x77paPR11Z+8EPdtd80XWE13HTI9Yp/KO
-MtJ1HOf195buFf8jvcexb17ZO6bozOp+v7a6Z888H6+ab536HyDrMn59+4u/0b8AFkIIIYQQQggh
-hBBCCCGEzRX+4/0r+CCEEK9C8DeAHz8XjioqInMW9+Nav29/xPNr/szSc7bvrL0VP701GnVW9aNz
-2WmrEk9Wp+ez9TzSaYHG7zZ8zYyvyHfIdOlfsVUB2S+Ijg6f0TzsIPIZyfOOPc7C+uzJZHJVOup2
-11g2J1djG+mtjt2BlQPzs648qa7LM2vgyI5ahOqZ5bKYeLF+PKva3QXaY5wd92fps3RbsP3niu0o
-9zrucqsxZPbIWXfPrP981nnA2u1eu2xfV+LSGcusfs7fd8gzvjyeZ/G6Wr/h0dmLZn1Gxdbu8wL1
-uSrv2Y18e5D1PWe+m3hFOu8ez5BfAT2DkXyuvpOK7DJU4vyg8l5gR83J1iKy94x3QD/o+8Fr5b1t
-tw+o3Y73Sp11uOPdSmZv1h/5U9XjyY9jds9911wqfnTrf7bOSmw76vOud6pnvV9Gc/4wntvc/vQ3
-/9V8g/Hr+///Egz+1XgWyY/jELkzQebbpafLFktmN1qXqs+rOkeZar5FdKwFks9dOT/qmXWycxnj
-6ems6qngrbWl04uD5z87Lza2K+uL2ELmhfpQzRO2tq/m0oNZx1l71hrzoHsvd9KRq6v7xXve5dtI
-x96p+HC1HqZK11p3yJ/ZGyG5+Ph8lrW+R/I804P4lfnKjmHHrdis6ursq5/VfyOwZy0q24m3L872
-B91jkewuOvL5WT54NSrSNY5lxyHr1R1Pr4eo1Jln7MPI5ln+dPlQzZNqvWfrw2puPcaeWRPYPrv7
-bvPqrLy3Wql7KNV3N7vvLd7co+cdPlf77+z5/PkunZHcKP+Mnmaee3fefvz8fvxC/vCk827wbLL3
-F6v7d0ccnn0P6bSd1a9KP8OcxWytO/M91Kpvn2mfWqzUZ7Tf6IjhaMv9AbAQQgghhBBCCCGEEEII
-IYQQQnxmXvmH0x7f785/bHN7/7Hw/fbx64zbHZNboeobMjby/xlxuA0/np/9HJ97cpauyC9ED0s2
-hyj+zNhOVvRnY5m1eshU/enMQ0vP+Nz7+vH9cfysY2X/Zr5FOjL5KO+8Oe70h9F1HGv60LVDxlrP
-kRgidsc1Qv3zmHU99FXzrZIDFjvq264z+qzzhc0xZGxm7zjWa1dVZzSXB9EeQfdtpKei05LfdS50
-UfFn1VdrHb08mOUs2WhsNc6WDaZuIz56ejJdCExMsnFnguaGNWblfjSP2XEvGPVmvYGVb6t5dvba
-7vBlNYevkt8r/f9Oe9nYrK4yts64c67WzDPsVqmcMdH4Dh920FXTd2CdPTvssrord7Zq/nfeMZBx
-Xfde9n7O6GfuILN8Vx6trMtIVz1ZefexIt+5prt76Gf3J6MPox8r78hWfDijfnfNi32XseOM2FG7
-mLv5im+d9SHTufJOZ4d+lt36j+M4vr3//3wkZHm++g5u596//fE//TfjiIt4iLPe3MExjH5UZzZ2
-1oP4YIXtNo3N9Kz4gMx99BHxB7EbyTBz9/REPnvylVy0fKvmtqe/Q9cZeLl3HP3+r+zZSOeDSs6w
-+bCSJ1Zsd8QE9YX1wcuNrr0z6tudJyt6nrF2kS32vOhYrx06GduMrTNrslV/dthldaM9Q8eadp7L
-3WM8HaOezj3OrFNWXxEdme7quoygfV1kE6lZma2KfMe53tHronSO7ciBlXuTp3elH2P1z59HsdnR
-1zzo0LnqH9Irr+iv+oI8Z/WOOlbqEiqLxha1hdCps7tH7KpFVT8sWzv6B/Zcq/rG3AdW6340L1Zm
-fFbtsVbPno6+Ft1rbK+wood5R7bS10bxr/YKUTzRPeWNR2ygIHPfleeIzt39KKKTyUNWzyy7ek4z
-ejL9I1FuI/HJ9rjHWe83LFtdebXj/RQrw+yjTM6ylY1FalpnDd+pMxszw57jyBi2T/PGn3mHR86O
-ei9U+AGweB1WDzUhhBBCiFfhzBfLQgghhBBC6L2b+Goo54UQ4pX4/mwHxE50IAshhBDiq6C+Rwgh
-hBBCnIn6T/HVUM4LIcQr8S0XEUIIIYQQQgghhBBCCCGEEEII8Qr8/i+Ab7cfPwu+39+O8fn8vSc3
-Px/HznpGHmPv9zdXvyXv4fmP+DDrGX1jffBkmLghMlHMsvXy4uHpQOeSgcbW8s+LDzoXK27zeCsn
-ka8RPbNNNv/n+Viy1vMobh15zuY8mjtZniN7PFrrTCaaE7J/LRvIenm2Ubsra5ftO+Rra/ysG611
-nl/VvI3I4onEf/4c2WsWUTwZ0ByeP4vGR+ucxYSxE8lUzg6PTN5bO0TGs43GP7M1yiNnXKWvi3yc
-54zYRXuY2RfLJrq/kL2HjJ8/Z3sk9LyedVgxQPdatg+ReaG1qNpfdu/ZUSbbZ0zeMDGMfIvGRDaR
-/K3459lH6/9qHbB0WfqYHn6eg1UjqjnIzjMbl43N1g2dYzQX1F6WE0itROtwVPsf36+cMUiskNq8
-erZ5Nq38QmLi6ezoR5HezpqL5atnKxuPPvf0r/TuTAzZPhiZI9JrIvUw0u/pZOKP9usjK/sEGVvt
-rVl/RhnmHM38iexEOj0baA5b/sw+MHvKs4fUk3Hsam6zdj1b1nMvPrNdpm5bn426GPl5nPd5JIfc
-E9h5eTV2tsvGreuO4e09bxxbM7McZc/D2TcmnpUahfT3K+to+Yb2gV37Be3HI9CzxtKJnO9oXzf7
-lOlE4mb56dlm+xnP/5W6N8tmvqE9qgfTI6E9HpM/tz/97X/X3wAW7TAXQyGEeBWQhkcIIcTro15W
-CCGEEAjqGdZRDIX42uhdmxD70N8AFltQ0RZCfEak9bjjAAAgAElEQVRU24QQ4mugei+EEEIIBPUM
-6yiGQnxtVAOE2Id2lxBCCCGEEEIIIYQQQgghhBBCfBIWfwB8e//fKlU9t+DrFd+ssZ4tT34FxP9O
-e5bt+esOPYiulbVD16VLfySHxjD7LPO/O8/nz7OvKzYzHyoxWaEjzmjeZjpX8sGrgWy9Wq2fVWa7
-O+rqTqo1pVKjWFu79lR3LV05W9HzhaEif2aN8mSjsawupqaxOjtq5plk68vWW3T/r65XZ152+NZ5
-5s7fP6M/2G1rVbabKM+rtQB5vpud9eiMXPVszXa971fsdZ8THTz7vJhB48TIW3K7c8vKf/bsq9pc
-kemkw16lN9ipp2rDkq3qX/GV1VHpYxiiNanoqo5bkbnqWbwrhlYOsXUNka+sS1fNYXyo2qjE+Qy7
-iA7ra08/G8/bgc19976r+lDxuaNntvR1n2vdZweaG17N2ZEDyBrttuXJPotqfUb0RM9XbCHEdm9/
-+tv/ob8B/IH7sT8RHyF/ZsKLz8d18up+O47b0yvLGXtZIFwjH2aes1/u7+auF4/Py2vG/Dr1vJ/P
-PLczUPzE2SjnhOjjq+ynrzJPISq8znuK692jVFvEqxHtd+WzOIdz38m+zhn3lfg+Huh3YH0eCRPJ
-ZjJj0kUyiD8r2H7uMfrRVq+NzrX7jFTyDcnhlTgiPjF62Lzq8j/Ske1/1H5dnp/gFfZIV2500OlL
-Nt7LSWRv1vKZG9CdG6v7b6Xm787zs/YRWtszmUh/ZUzFlqFpVcFvWprOMiuOlTz87etba/2fZc7O
-75U8GfUQo9kB4rjG+b5Ctgezs3LtPFgP2rPiP8cI8QGN1Rl31WfxzPWq2j3b55/PNvRMvJmyr16j
-fsaeiHLL17lSU57bs+L+oPe6B8g+Yd/jxH7f38f2B+Wjn7l+Ng6MH57eiM73Ymu5d15t8er81erJ
-qPtKdWDVVrbfn9mHWfnw+N6Q/jDO+vnD2XPxfGbu3pWxz2L3+33Wl2fZQtar5339njP0QVfv9CpU
-+hyzfv7x7/QvgIUQr8VXKPJCCCGEeB5XfpHxbBSb10NrJoQQQgghhBDXY/fPOb7vUy2EEHvQyysh
-hBBC7ES9ho9i83pozYQQQgghhBDieuy+q33/Zfin2b++//75X47bh6/nz63nmZ4R77klN+uffbB8
-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
-jjNgxe6Ouw9id0UPUutQvQ+q718831idFbr74671WoHNVfTd1soZe9a7iVHPqMvLN7SuduyX6Dya
-/c3GMudyZQ3nXpQdn9FdS705/ojP7Q//5m+evTOFEEIIIYQQQgghhBBCCCGEEEI08N16WPnbIiPM
-77ZGfv/2rLPrbyt4PmQ6O/8WyYNOnxE/md9l3/X3LKLfzZ75wNro+p3tkR3278hYMp4cGxPkd+DP
-+rv/dkVFZ5c/kV/ZOOZvELC2vPHoPsr2IPp3B5A9xe5l5u/mRHpGqjmw8reH5thm8Rmfd+V8Zf+i
-Plo6PRn2b8ogdOTVyLxG43NET7U/qfxtl2pPgupha8KD1X6D7YvY/gepeyNMD4nWHKROzr5Z36M1
-Fl3jrr9ZswoS55WerSqXyfoxur8/zw0g9Wd8ln0/66zsk8jPSj4g9QK1H+mJYoP6EMV19gM501Ff
-ff8fin8IIvnh2Z3HrOx5ZA7o88jfyP8VOuaF6ETyav6s2uuwvQViY5atrLslH/WsqO8eaF/lPdu1
-FjvOT5TIt65eM7OL+tbVK1fvGMyYeRwytnJGjzJerJCvR/1M3z+P9/xE6upZ9w0Wps/O5Nmx82cP
-2HPozHixPmS+sfkZ5Uy15kR6vPyv5vYKiP/R2Acf/bwfXq9p2R11RX12dBZaYy0q+8iTt+yyZ0fF
-LpuTo58d/qP3qOo9zZOpnOms3W4/o3HVfYf6iZyzrE5PlskBL/duf/Gv//rx5SA+zuI2fH+bPrNk
-PF2Ifk9nNHZ87slZ8iNeBYvkb8PX2dhZhokP4lO0Xp4c449lI9Pp2clyKfLH8mFeCza2TBXA9L+9
-f/XNmePb7595Niy/kOdefA7nOevD/PlsF91fTP5EexzRb8khMfTsRnGLbGa+ZfLe/rPGzDJIzUT2
-MbJnK/FB1tTzwYuPt6ZMvll6I1s/ZN6O+/Et1PvQg+6xWR49U1bqAwKyl7NcRGoUcv4gtQLxE6lv
-SE1A/M8+s6jl5M/zWDl/GT2VHskjimd+Dn08m3/+PNcZ9QCZfU8+ssn0cmj/y9YHpCawOeaNRXs5
-tE9izyNLV2aHmaOnf5SxYm6v3c/5zPZabJ574yo6LRnveZRXWU/u8YjfbTqro3tDFGfb9tv78482
-Mv2eDVSe7SuY7z3/KjC9OLq2aE55zxEfjun5zz7YZw3T32frv3Kuf/TVHr8ij55PaO8f9WGRL0x9
-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
-d5fjs5X7AJMniP5RV+edquseVe0Xu862tfXy7zSV3gixj+qMelnmvDjjTo7YsmRW9T9Y6VtWQOe4
-I84P0DpTPfcr+/2s8ww9j85898T1b2/te2T0YYbRubpPR5sr5z57nq70i2h/yPjDgvizns/IuzyP
-25/9y//HyzAhhPiy3N4r613/aZcQQgghhBBCCCGEEEIIIV6I7zfgx8fjD0A8+YfM7e3j14yOWQ/i
-FyLXwfxDIOuHQyu+nDmXFZA4jM9Rnauxs2xaOTnKzXZX1jLLW2SOkX1mX8zy3n704tDBis6Kb2x8
-GD1d9Qq1b+Wkl8ORD4hvO8aeCRKfURZ5nu2XyBfkfIzGV+widO33lf34rDPu7BpS5Zk9AHJ+Pdjp
-40o92k2nD5V4Pis2K/rRsbMcU0uZsaiuB101M/IXHc+Mieyzn1sy2R0vk0X8tXRlvmV7ZP5sdW1W
-8O4kmf1VHxG7bM48I247en1Utis+Z/bZyD5hfDj73HmGD6t0+BfFgX3X9oy98yzQ+x4z1pI7jrX3
-Pp08qw5Xamkmz9whvfvt7hyI+oqd79R25RUSc3atu941dL1T8Pof6w7Q2XeOOpn3Vghn3c/PpuPe
-dRy1ngfRz+6L6jtK1IeKzVmu0hPueDfB5PRKPV+tpeyd8yyQed3+/F+M/wK4+uuLVtj1K9GuzFmx
-vQJn/AqJ6q8W8Mawv4qA/dUau3N+96/3iPR36PxMNeEzzeWVQH4lGPsr+p6VnzvO5R17f8WXZ9fD
-Xb8CDdGB5NVX6hkszvrVTyt7beevRUR/tVJXrVj5FZpXhK31D3b86tROrubPs+n61W7orwjrsOXJ
-nb22VR9mmavm5NVq2tX88djtCxuHrnO5MpbpH1jbV1rzB1f0KWLl19Weea/bZetZvyZ3hI1/V2+G
-2GL0fGZebV+LnCu8G6qMe4ytvnNnbMw6r/J+Nupz5uefjR2/PnqnDDr2rHlV+M3u7c//xb/Tr4AW
-QgiS+/04bp/5XBZCCCGEEEIIIYT45Oj9jqhwf/+JinJHiDraR/v5/vhiPuzG4N+HHxFbMgijHk/H
-bMsby9jNfEJ9QPVV/Y/ibIGs16yDnZcVn1mv5bMnv7JuXgyj2I52GR/Q9XqAzpfJt1k/4n8mw+6j
-KJ6IPOKbtUaRDQZ2L1dqHZOH1riqz0guIeuF+ITQvXaefrZWszKr9f/BvGdX4lOtn8iZy+qpUK3D
-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
-ZIf+HWeSWudGfWc9B6rjd53pMx1ez1F5Bujoy7vWRV3r3fU8G9vd/XT3fCt5osp15vndzuZOv86q
-G6O+s9iVY1X5LHfuUc44s3bQcdas2v1Ufj/H58//+d9/ufJ6z3H8+unje5Gve9/fv3093v+d6e/5
-vXHs7H3P8XrWriVznO9s7qMvs3vKV3V7sYrsjjJWfKqMvkVzVOYyG6PqscaO96PPcSMdo8woZ/kf
-+WPN0bMT7S+PKB+yc8/6463jUYfip7Lult2oLo3jxzmMfq7sTWvsaEuZi2Jrpt/yO7uXvblbdmd6
-Zvc8u5bMeF3xT1nTTA08kt0XlTzJ+n+0Fek8ynk1pxpDZQ8q8bfGzmyMfs7uWeNmdiIf1PMrUyez
-+1ol8mGUqe4FtZfI+KrGJxo73s/0jt65pORq1o63p6I5Rqj7SemFlFq9Iqecj+p4dV5VHeP18d4R
-dT+ocbOuZ/I/27tkfM7oVGr4S95aK8+WmluebUW2emZnYqvsCdV3JZYzHZ6cskZK/L34VHrZTJ5k
-/ZnJRLZnujJ1P5s/Wb+y8pla4o0/ynaeAeNY1Td1XkrvMo6dofTHM3mLbM8R+Tezn5lvJefUdZxd
-z/pU7bMt/dkeWj0v1J4mkvd8H21ne/3Mue7JqzmW2QuWLmXuip5RTvEtG5MsVp50xTyqlTMbKtnc
-U+woe3A2ZmY3yqVsXbL6+FHvkeyzg6fD02OR3V9enih7LdtfRb5546pnZcU3S091fyl5qNa3qE+z
-/FLtZnvxmT2vV8vsX29sZi95tUVZ02pMfqPj6z/+O9naAAAAAAAAAAAAAAAAAADAHSn8G8Dfv/6n
-XJ/9bI3PyGSxdHbYuerz87PjlBn7PVyPxoyvu+S7yMZkJYbvQrQW6lyisWouKfKZ2pVltbaM+2cW
-26qfu3NvVX9mXpZcNk+Odr1zKpszu+vSLB8qfmZlvHHqeGXtdtOVh6rOnXZXqfYQHbUy01PstDEb
-c8ZazPZut92s3kqtWK0dK2M651Wx3dWLVtbIO7NWOOssUO1597ttKbKV2rXzDN4xtqt27qoV3b3X
-2efvzt4xk2ueD2fVs5UxO3VG+zcbZ+vcUuub5UNkW/VP0ZmRUcZWbCnxnMln8dakg67z+gx29huK
-rS6dKzmTzYeO+pnpH3ZQ9cHKjc45nJUnK3rG13diJeer9jp64JU1UsZ2rX9WvrPvqsa5a43O4oz8
-7MgZ5YzY3W/MeX79x/+7y2pCE89fV/S78HUgAAAvnt/UEQAAAAD4LTxvAgCcA8/kAFCBXg0AXnw9
-kx//vgqHNe77ad/bwbGQnWXXmuPq3KPYVvDWqduWZac7Vt7Yrnkpes6K4Qpd+/HMfZ3NGcW3s+uS
-58fjUfNlZ7558Ylirq7L7v1i6e+2OzbP1ficSfacVGvsLLZdNb/T5y6uyuGsjh3nn+rbnc7Frni+
-6K4tXpyt69beqvhxVs3cyV193eXXXef7eNw3n662/w5E57oyLmtnh3wXO+ptRU93be+iU/9Kv6Hq
-y+jd/ayl6O7uwSr7buV9ljP3bbZevfM5sMv/3TWt673aHX6e9d7K3XLvDv7cwYeXH4/HPXzZTSXn
-d/T2d4j5Vc8sO+pPVGPVvfZOvWMHd3nfbVV/1ofnz//+X7+KV34l5GgpGv9tyFjXszJn8Jrvc7j2
-nLxW9c3GKnHNx+T7V73Px/Mxn8vDud4t4/mfyausP5FP4/2V9VV9U3Ts3iPKej0mMqNdK4azsbsZ
-K6Hl0+z+qCfKATX+1TxUbK3Woplfqs6VeqLYquanNTa7Xp7OaE3VuVgnd9ZP63U01rOp6FT8X1kL
-i44au2K30/b3X/73mcr/0Z8X6npl6oZXVy351fh454q15zLyGZmOMRVGO9mfVb3jtcxZGfWZ6jnR
-0WutrOULqz9fPVur+RnZ6M7tjJ7suTOOG+WjOnNVr2nlajUuKz5XavFMLnoWPetsXekXZ+zKdc+H
-6hpkfdn9rF7Zw+pZrLI7Vpm+trJnqzo9vd31d9RRfQZTdGbGjLY6+shR/2ijQ2f2zBvHZHxbiYn3
-PoLFai3I+LAy95Xn4QyVPZKpJ8ocj2PU90GyYy37Uf4o52Z2rDJG3RdX9ZAzHyx7XetS0bvy3kHU
-13c9G1TeE8nYtcZ2nkcK2dqV7et21snRzjxnfvvegTX2xUq/avmTsTe7X803j461mO/NwwfA9vHw
-MK57j4vH+zMZpWRYdhV/LKIypM4lg/Jo4fmoPOJWWwFPT+TPUY/y1oblm4VX7jPj1XXMbG/Vt2pu
-W6i5obRB6hFnXXtdN+f7643ns15bPD8tquuu5oMin9kX8lwPiqJaqtTVo+1srbBQaoXngzKXmf4z
-6oyylxXfQn3DhKvtqtqylzn46dWxzH709oulJ6onaj5HOTazPdO3ow9ZqclZ32ZyXb1W1Z+ZziMr
-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
-MmMyzyRR/3FmHzfi+baz11R7DzWGkY2O/MyMGccpY6O97+nwYqW8PurP9PHH8V5sq88zynmwe9+o
-z2aW/Hhvdew4PtPHR3I7qeZ3pf5bepQ9mJWx+uNqbq+w8kxY7ZGqMpG80od4elbq9o5ap+hfobuH
-8WSy9Vx5tszGvHqme/Xc6s861svrB6rno2JvpX+r1BNlrR8TmdXalT1Tor5oNmamr6tPzpzv2R7P
-8vMxyFv2JzLPr7/702xJAQAAAAAAAAAAAAAAAADgzXC+Anr2kbJC9GtVM/mVz6Cz9nYT/UqmN06N
-16g/K+PZqvrv+XKHdelG+VWm2ZjHoy+2nVg5U60Du+ncU+9AV53cHY9PivmdOfucvUJPZy511Lds
-be/kLP07bag+jL8uGf2qo6Krm7ueiyso8T/LdvZ+xU7n/LJ1pMvunWy9C1aeP4brWT3R9eje2VRr
-6c45KL8Sf2dWzixV36rOLh/uQneevMv+Hcn0cGf0R3eMkccd31O4oi/f9R7W1XvnjPXteH92Vf5T
-6Y7bXT57+MT1Vd8TV3U9FnXM9HXq9GxlbFjy73iePh736F8Vruqnr33f7fn1d//4PbUd/Qm1JxOh
-/Fnzrj8rV3QqfwK+8mfiis4oDqoeRbZDZ3ZdLP1HrPdl1Pgo7+9EuWH5WZmrsncycfZy+2gnm0tR
-nC1/PD+P/li2xmujDyOZtV6JpyXvXc/mSbWuru67SM/KvLzzbSVnslh9aGZe6r5byYGIrrpUOUNf
-rNbeDKt1zNJ11JnxY9dZ36VnZw5UqPoWjVX2qmKr4yyP6pUql/Ure6YqZOeg1PYde+dI5xpa9xUZ
-NTe9cZ21QLWV7ZmrNTOrd2UP74htN6v7Qpn3iu3sM4B1f+Xc9WyNuiq942qd9VBi0lmzdvRbGf2r
-+z3yaUd9r2DtC6VfOWLt25Wz+8xz1/NDtWudQ5lz9yVjxbi7Jz67b1au77Af5ZL6DKzae+lX9kqX
-XYXMexaK/FGmuxeKOLMmXFV/FDJxrvTHO864K9bOs7fyXkyVai/2Gqs8/0S2V9Zod40a62e2X62+
-H7F6bnbsl5XcUGwpemdn1zhOjZViM6pFx3tGHXt+/e0/Wm4DAAAAAAAAAAAAAAAAAMAb8fV4/JIQ
-/+nxV/nj60/jp8m1Xw7XfxlkZ3FQ4rMisxJ/1e6Lip1ZrBQfuuKmkM1nLybRfK+kO2+z+s+uFdXc
-q9hZqZ8vduSSsn8718WqmVm7mbmrNUrRefX+VWJyRNnLVT9G/eP9HbastVTzOLqfyScvtllbmdrb
-Rbf+7N7YLT+OO7LSE2XGV2uKNW68Pvt5dU136FTsKLIvKmehGtOs7Dux6r9S1473rZ9XfKjYreqp
-jH2Nr+aQqifyQ+0TsjHL9nCRTk+ma+6zHmLH86oqm91HVXY/n6/Kz8Ye2b1eSt3YUfM7c75iQ5Xv
-nPtKTVZ6kSvev7BkjnKeD6PsTKb7fb0sK+9fdOmskK3VVz7TPy62r/Yiu/04w06Fu5zHM31nrcvj
-Ma9pd6tRu2r7ip4d7y2e2ZvtoDsmV9ZwxQevvxqvR/c6/JnZmss+v/72H/gLYAAAAAAAAAAAAAAA
-AACAD+Ar9b33Rznr3+BY/bdLZtejf19s1QfLhvK95Ucs3xQ573u8Z+NGWSWGXf/uTPbfdYr+fRZr
-vPXvPY33st/NHv1bAKvfJ5/5dyIsfxQ/vHU/EslYe1/9d3ZmerP/do+Sh+p6KfUiwhtX/XcxKv8O
-gpIzil9KLa3+2wlKHVb2oOVfdv8ex6z+mx0zu7N7M9+s65EetZZ25aH6b1dEOmdjlfyv1CJrbLae
-zMYqY7L/3komxt511TdlbObcr9SH7Bl3xMuTbO2zZJR4qb5YtlbiZuWz5ZMyNhMnb46ZOa3EeSZf
-rSeWjOWDmjuZPray3y0fK2uakVPXurIXZmtXya2Z3iPd61GpS9Z9y2fP1kveq4FRDLJ9cLVP8sZF
-+18982byK88Pnk8RyjOJmvNqzNV9PcpWa4eSu6v7OnvuZPowSz6rQ7Gf3Zvqmio9t0Wlrs30K+ug
-1Jnsc4IVL+XMjOStZ4+jLU+/JZs9m6KYKD2lEiu1d1FqpmLL8m20Z+mb+ZhZ03HcynOIEquZDmWP
-KGuknDWWbW+/ZPJqtT7M7imxqtT4zDPBSsytPFfm7pH1ORqnoOSI0kdVcjJTA9V6OPo0G5utjZbO
-2XVrvJcPip+W7kw/oK718boSK6XXypytRyoxsfRHZ5Zlt3IWW3os3x4TGc/nqJYe7j2//oa/AAYA
-AAAAAAAAAAAAAAAA+AS+tF8/AQAAAAAAAAAAAAAAAACAu/NTLAIAAAAAAAAAAAAAAAAAAO/A1+MX
-487xo+FfJtfHcdZHyb8c7it6jvcj+ayMNSePo87Z+KzO0R9Lz1lx9nRn52jFx/InO5fIz4o/j8T1
-ytiZj14OqHkZySv7K8JaIysnrbyN1nkml4mDZUOtFUptsWxZ88zkyeiPdb8rNyK7ylgvf5Q5KvVt
-ZY9YtjL10NJ5RD1rMj549S3aX5atUV9Wj4Iir5yn0Z7yzqmuPJnJWD54tU6pA0rdsGxl9Mz882TH
-Meq6VnUo8pnau3K2jj5EeeuNzZLVP9qa/ZyJ1ao/meszPyw7lRzzYqOuUaZeZ3pmpY5lqOzTzPOR
-Et/Z9Wpdte5VzpcZlVqUOY/G8Zb9Sm1U+gxLd2afjP6u1OXxvvqsoJyv3rqo67Tqw0yHWvdUuyvr
-HqHU3plPlg/quMi2p0upX9l1X4lnNg+zNWgcU3muyOzd6EyKattMPtPfV84PtdZV/MzUjBmZnsyz
-kc3/lf5PQakDK3lb9d8bO8M746NzxMvbaj90vF7ROcPa12o/mpmLUk/UHrRqayb7kq/2lJU6Wc2T
-yL+Iag1UdHp6LZR9atmsxqFrvmo+R7ay/qjnRab2HuWy++UxXI+o6F+pPzO7yt5Xe/vsuZk9E2dj
-VX+OBH4+v/7H302+A9r714MzKP/C8w6usvuy/bjQ/irv7n8W5V9u3xkLNVez6xLNa/f6nrkH1X9J
-/g45rcR/9xrdYY935fMnUsnVd4vPyhwfybF32Puf0JN051j3GXvFHni3fffpVNfDG9ehcyVPKmN3
-24tkduyLO++1Y31X/eyI4dkxufManMnOOKzq7q6BZz+PZOzdtbfZrbeTsQ+7e0w/jR3vNd3lvddP
-z4Gz47xS23e8p5Ct1Xd6TzAa/5joyPb0d8h/pc/s2LO79v5Mz9333R18PnKHPDxyN38U7upzPa+M
-D4ABAAAAAAAAAAAAAAAAAODdUL+4BAAAAAAAAAAAAAAAAAAAbs7X43v2DdDPx/S6JWO9zup8yT0e
-v5fNXrfsRno8XR0o/li+rIyt+ObJvfRbr2fyR7LrWPFzJq/mw8y3I2q+deDpzOyLcR7WPvXuj/5k
-a8XoW2bdVTp0qnstm0uj7IvM+s7y8SXj1Y7ZtWytztRbtRZ586n44NlRdFbPGkUmu7+UsZV6eNST
-OROtvM36rPqZqTOKHk/mRTa26poeyZ5H1lpk9ni0z6pnSXZPZeq/Z6dyjoxy3tluyaq9mjrW2zeZ
-3Miepyt5G/lUwYtZpSavnBORraxutYesnjHZszYjk6m9Ud7uypedZ/ZR5sjKXl71Qa3p1rjoXqWO
-ROe/5UMG5Rz1zrxMXs70RPmVOb89Pdnr2fPF86t7j2bO06qNl57uOav9R+RX5GfHeV/p3zJ1Pdtr
-7nyGyfpm+eDJWWOUOtcxl85nKiUmGZ89+aqtlR5GfU6Lnp0i2ypKnnt5W52j5092j1SecyxdM5ns
-s19H/+3Fs/PcU/V37ruZzEoMV31TcmblOaqj/qycBat97EpMsj1Admy1Hx3vKfKzcR5n7eVK/r/o
-qiGWDWW9hDP6+fXHv93kKQAAAAAAAAAAAAAAAAAAnAlfAQ0AAAAAAAAAAAAAAAAA8CF8/fXl9+Px
-eE5eH7Guz+Qev8oe/8DYGhvJjHYj/d5cLFuRntHubNx47yiT9T+DF+dMrEb58dqox3o96o98HmNm
-6Z/54+lU8tDywfLneM1a69GnmfxsDqOfFkpsj3YUuzPGfRTZGsceZbLzUl7PfFBqlzqvTB6qMc/k
-zPGeWnOiPajuo5l/3jpa8azGXNFvyWfXSPHNIpsn1tgsnfU5s6fU887yOap7Si062lDOkZk9j2z9
-sXRneg1P51FOXQslnqPemS3Pl9EfS4+nayY7kqm9li1F/1EuOt+jPWP5ovZd3vpl1m72c7duT049
-y5T6q8xtplc5v0Yboy9RzRjlR/8yZ7TnV7bWZXSO1zK96+hTpt87yqu5oa79zBelTiprNMYn44v3
-s3I2W7aUupSpj5n9OLuWWYPxfrQ23t7J5sxRd6ZPVXu+bH3r6kePdNQOZX1X6sDolxcT1bbaX1q+
-VdY3c1Zm83m1b/D88fzIrrXae87GWmTWT6mNqh9Kfc7s8aytivyRzP60+iTvuurjSyY61yy9lp6H
-cF3xz+t7ZnrUeFs9aPa87u4HlD5PXd/qHNU8H+1lZUdb2T2b9dOLSVZ/pibP7o/61Vo982Wm17Od
-3afqGq30VB05oOyXx+T+S6Z6Zin7y7qeHTsbnyE7VunZlDhn8lyZuxe3ak1Qrkd+jWNz/djz649/
-k+n+AQAAAAAAAAAAAAAAAADgpvAV0AAAAAAAAAAAAAAAAAAAH4LxFdCvn18oX4kxY0U++5UYkd5I
-Nvpz/FX9lq3oz81X554h+xUy2fU96rG+HmNXzBUfqqhfFZP5M33lq2gq+6A6T3VsV2yVr7TJfHXK
-qDv71T6ZuShf/6N8ZU6F7NdjKF/9kqkJ1v0jq7HNfG1MFyv6V+rDqs4Mu+ZYJTtH5at9lH0R+fTS
-k+krus6aUXdmjis6R73KuVb1rTKX7Fqs6rLGZMZ1n4+jHxl/OvvK0beuvI/6p+r+tXR655R6ds9i
-sVpnVJ1eLqyut9LLZnR7OeLZUuUr11fY/TyzcsYfx2Vi2+njjnOx6wxQ+9oVHRWdo7xXD2a6duS5
-QrVud5yPlt2oDq7kUia3vXWMbHnPmRYrZ56lrytuZ+HFoPs5LbI3u96B9yyk9A3Rmio9xxnrm83P
-Dp1ZuzuejS3Ofg456tg9x659twP1eaDLzqj7qvhbZ9BRrtILVevSeD3be3TthRne+yOZM3S1plXr
-W6Wm7d6Daq/+ut8VW0WP55dqd2VfW3n4+IvO59cf/6cnBQAAAAAAAAAAAAAAAAAAbwJfAQ0AAAAA
-AAAAAAAAAAAA8CHwATAAAAAAAAAAAAAAAAAAwIfw5X9PNAAAAAAAAAAAAAAAAAAAvAv8BTAAAAAA
-AAAAAAAAAAAAwIfAB8AAAAAAAAAAAAAAAAAAAB/C119ffj8ej+fjtz+/mF1/PuKvjz7KjDqexutI
-T4VoXooPqs6ZjDIv67Xiw2psVmJiyXeNtfTsuL47nl06u+UrZNbL8+c5uWaN9WqI5Ztlc0d8VuzO
-YnjUVfFZqXtZfV1xU+aYrSHdMl6Nr54Xam5k9O9YF2//dtQ0RY/aY7xYyYGxDq30P1EMV/aylYdH
-OnLB2w9jPY56GLX+e3pHmYjq2TDza8aKbzNfMjVqtF+Nc4Zdez7aC9m6nLHfNaeZ/qPezv1etT/T
-1dWberZWn3Eqto/X1LFdPigy1ZxWz7Bo3a2xURw9fdU9GdmK9CnPHo9ARqX7Wa5yFmVzI5sTK8/t
-4/2ZTPWcq/iWobPX9/TvOGtm/nbl2Mp5tlITVp4JI53K9VV29gFqrkbxz67jjvcLVvvSjK7VXFKe
-ja1x1Tgr53KWHXtBycnZvdGu6ltn3ow6vXPK2l9HMvlgnZWjnqgOVOx2ngmeTmu+43jLh469Y8lY
-eo6s6ozI9N6qrYp811pk5bNrlznjLP3e9ayfkf0VH5T9ovRL87HPrz/+cUf3AwAAAAAAAAAAAAAA
-AAAAJ/PT4/ux5xfgXtxZ//djPv54rUP/eK1LPhq7SlXnt/G6onN3/kS2rBxRxu4isrXix+ocLN+i
-616cu+arrGVmrTvXu0Pfmb/K866/NnTmPn0HzohFJube2ZEZe7S7Y44rfmZsRP3Azjkq3KXn6LS9
-o66P+bJyZqnnFKDesAAADoRJREFUV7ZvuXNtrMTwzvOJ6MiZDrlqv7Qa+86183RV7OzOvTvk9kpd
-iJ6jsmtx1T7eYbcrF3flbRdX9yUjZz2vddeaO3HVs3GWHWudsVs5L1fsVvV3sWpPidmK7ozMnffn
-yvOwdR6reqp5tSOenX1ht84urvLtLvV7p867rbXCnWtsFzvmuFIzVT0dz0dZKn5OeH79zF8AAwAA
-AAAAAAAAAAAAAAB8Aj9d7QAAAAAAAAAAAAAAAAAAAPTAB8AAAAAAAAAAAAAAAAAAAB8CHwADAAAA
-AAAAAAAAAAAAAHwIfAAMAAAAAAAAAAAAAAAAAPAh8AEwAAAAAAAAAAAAAAAAAMCHwAfAAAAAAAAA
-AAAAAAAAAAAfwtfj8f3ry+fh8vfh5/H14yA//jzKj8xsjXpHfapOa+woa83LGjOz48mqcqpdVXdk
-d7RlyR/XKHqtYNlUZKw5Kus7ykfzjfSOerw4WD5Yflavz3y07L+uZ/JTsTfGRJFXdVflrZqQyQel
-Hio+WfGpzDFbY6N96uVktrZn/Bz9qua8J5+pbyPWeTeztfJ6JFPDs7FVx2ZyVImPIn+8V6lJmb1c
-QaknythqP7BSc46s1rTRjqffkvfyQl278d7KXCJbnWNm42dYc1F6M8tGV/8w+qGQXd/RroVXQ7z8
-V22r/Uz22WC1DziinFUz3dU5Vte8ul+UPmRVtxpDz4dI9+y+FZtKvVR86KhZnbpe45X6oP4c6Zn5
-EN1X+ixLztOjnnHVvaf4FtmKfIzk1Dqj6NmRe971as6pdqKx2TM70xPsqPveM8/Mz1Gv12vM5Gfj
-LJmjXFcfPOqsPodUns0qPr58iPqQ4z3lmVAZ23VmH/HWPXpGqcx3Zsfzqdpfejlg+ZHtp7PPTl3P
-GFFNUPxX1lnx5zhefZZQ9qZVP6OcXNG58kwxsz2Oz9ZzteZb9rP5GaHoVOtVtvdTYjLTkz0LlPzy
-/InIxr9S8zN1Ro1PVadyFsz0evLZOqAS2ZrvwefXzz97FRQAAAAAAAAAAAAAAAAAAN4EvgIaAAAA
-AAAAAAAAAAAAAOBD4ANgAAAAAAAAAAAAAAAAAIAPgQ+AAQAAAAAAAAAAAAAAAAA+hK87/wPAs3+q
-elVf9M+VZ33w/knnKqrOlfhYYztirvi/IrMj5mfqX7W7c+0qds/S7/1T9tY/a5/d7x1U8kf5p+Z3
-+rBb/g5jd7Cy1qvziOpAh43IflSfO/Nqd9xmMh32qj4oOrpjsXN/Zc+tjv7sTHb0Y6vjs3qVfLDO
-2oydjA+e/h3PCEcie2qPke1tFB+/h5+VsZG811N5c5/prOzfqP5c3YOe6YvCmT7ssHXms8wsX6t1
-ccWHrJ7oOaeL7jnOdFVrVVePu2vdu/Se+Yzabd9aE2WtuvrO1Wf+O/Sc73iuVH2O+q07Unlf8syz
-s0t3tj7veI5T3tf7FHa/l3RGjVVr/ez+7jOx+z0X7/3oil5vrLJ2u/bFSo6dNVaRX4nhynuaWVsz
-uRfd6/v8+vq5Ref3r14+P7EyA5zEnffRnX3byffzx5zz4/HjzftH4/vQXbDW78un1Kix7qjz6qxX
-V9S+o8071947+3YlxKXGzrixJuezO+bvtKZn+XqHmNzBhzP8OLNfzs7Fkr/L2sw407c7x2EnK88G
-d36uuMq3rF1PXsnJu+btnXMD4CqO++KMPXK3+nA3f67mznWy7QNgAAAAAAAAAAAAAAAAAAC4Fv4N
-YAAAAAAAAAAAAAAAAACAD4EPgAEAAAAAAAAAAAAAAAAAPgQ+AAYAAAAAAAAAAAAAAAAA+BCGD4C/
-f/1v5Hjdkpnx/ZjLfzv3jjKKrm6+hdeKvCWT8UOJ0yjvXa+uYxfZvDm+zsSiEysPq7pm+hS7WZmM
-LRUlx8ZrGXnFfodvis5svmXr1a4cjmpup53IB0u+UgfGazvjF/nTWZMVf3avaYee1f2ryJxV01Z0
-ZsfuyqWZXm8PVmt4VqfKrjM/8lkd09FTrc6tMpdxXOZ8q9SsLEqed/m/a2wlVsfXs1zbdd6pZOvJ
-bjw/KvW0OpfVPK/mykyPN27ldbTf1L1QPcMsuvZgFivm3pqurnO3/Dh25/7dmQMr/lhnesUvRWcm
-L9RzKXN9Jqf4u1pbFN9WzsvxdVZnVd6yW9ERXVfrYPWcVtc9kw/q2KpOb16Veuv5trM+zmzOXqtj
-I5+VuI06qmfSSvyyuZTN4ZUapdZny5bif1WP50+HzCpnnvWW/cjujpp8fO2tZ2R3lei88OyqPUFm
-fVfWfaVGZfUr1++A7vPz6+vr+3j7LzeM4Q9DZjb2e3htjT3qmF33UHzO6uzy54WiQ4lPZEe1ZY0f
-x34L12cyVtzGfIjyx/NhhrJeqsyRag5Y4zwfrNhG8Tle78r5yv5VfZzptGSUeWXypCKvjI2uj/ei
-2jXqiGLn6VDmm/EnO87KJaWGqPmciYk6VzVHZ3oyZ5MXk2pNsGSUOuzlWjY3qrXI86daB1bHPiYy
-2TNlJR4rVOqQcr5E/cAoE/mXlbHyM5vnqyhxiMZGY7riGMlX+rHxXiXns/qzebZj3XfqVfWfNS/1
-GTHT53k952qvXo2L1/vO7HlxOsp292GZ/aKi1vBKv5WpG5lnDM8fpb+09CkykS/Vnj9Dpl/sOpOU
-dVvNT8//7M8d/mTpqtuZZwnVr0w/pPbN1f5PrfXKs0r1/Kg8i+7Yz5neyzv/lPqs9PcZVp/3LD2r
-tWLUafmp+p85+6yxyh5R83mldq3s2Ucgo9harS0ZW8frqq5MXnnyO+Yy3q/azdQKNWbKM0NHrCr5
-U+mxR/mVGqLWN8X/0S/VB4XVPb6zpp1dDz3ZUV45l3fVzMi33/j1h8MHwAAAAAAAAAAAAAAAAAAA
-8L7wbwADAAAAAAAAAAAAAAAAAHwIfAAMAAAAAAAAAAAAAAAAAPAh8AEwAAAAAAAAAAAAAAAAAMCH
-wAfAAAAAAAAAAAAAAAAAAAAfAh8AAwAAAAAAAAAAAAAAAAB8CHwADAAAAAAAAAAAAAAAAADwIfAB
-MAAAAAAAAAAAAAAAAADAh8AHwAAAAAAAAAAAAAAAAAAAHwIfAAMAAAAAAAAAAAAAAAAAfAh8AAwA
-AAAAAAAAAAAAAAAA8CHwATAAAAAAAAAAAAAAAAAAwIfAB8AAAAAAAAAAAAAAAAAAAB8CHwADAAAA
-AAAAAAAAAAAAAHwIfAAMAAAAAAAAAAAAAAAAAPAh8AEwAAAAAAAAAAAAAAAAAMCHwAfAAAAAAAAA
-AAAAAAAAAAAfwl8/AP4+XFVev34er3kc5bNjFd2K3TOJ7K74rIxdWa8r4nW0XbWfiZslp9iuyHxP
-/ns4rzO2sqzozORQJLtSQyJ/snPslL+q5ijs9m2ldnXbza7RbH/O5LNnmbX3O1DO6F3nRWY+q/s0
-8nM1plUdK+u6qwdYke+KpWp353l/FqMf0c9VvatyK7ZX+skVu1fq8XTcIfd2zLGjJ1P0ZGK7Ul+j
-WlSRGeVWY9YVc2XcqOMMu+PYTM5U82uVFbuV9c3MZ6VnU4nyY2VOZ+eepaNrXXbkrbJfsmTn0lVn
-1DGVM0ONZea6yu4cVuKxe2zV56t7oxmZM+iqvPp+1GO4ch7s2iOjL178V+NW9cnyp8uuup4d65XV
-o5Jdr4y8dV7smuPV9cnap7PeZMzPHWdWpdbtrvNjHYx6rI78VP1S9Fsy1ZqzId7PP/zh647HNHwK
-z8c9G8G78vz1/ysxWxkLsBPqAACswhkHAABXwRkEAHeE2gQAAAABX1c7AB8OjWiOs38DDuAMyE0A
-WIU6AgAAV8EZBAB3hNoEAAAAAcMHwK/u4Tm5pvKMRX6HYmPm0/hnZcdff7NeK3Y6uqjR35k/I8pc
-LFuzmHg+RGNVH2Zz8WRW8ikz1ovJTI8SK0//zEdFJvJDRZ2X5ZsSqyh/LNvR/YzOqh5lzyk21L0T
-jR2vW/pnfqprd8TKjWitRx0dPls+HMerNSebt0q9imx5VM8atUZFeq069jCuZ/O583xcObMeg5w6
-1vLhOH5Hz6DW0sfkuiUfjZn5YJGNYbWmzfzwavR4r1Jv1VirOpX6Y9lX1surod44S4/aD2fyL/tz
-pMeyOxunxDObtzOZmZ/qmio6LLvqPs70aZaODn9mOo+oNU71S5XLngcPRyZbmyw7yr7xcsjT4cmt
-rKW6pz39ar2Y6Vmpe7Pr6r3Ix5GOuER2q/t89cxYHavGUp1f5Ge1ls6uddXBF5k64Y335JU4V2rd
-KGM9P4wy2T61+oyRsVMdf9ZcIr2e/fEcUc5gtT9R7Y46u3syT1bp6S39RzvZOCs+Zp49lH29I79G
-H7Ixf6E8e6g1KnveKb1mlP/e3Ffydsf6Zc+p2djj+MpzRaTfiq2VP0cqdWOUtXRZcpFsJhZKXcrK
-jNdfWHvnMchYOpWx1Xqu+h/JW+NX8zOTq6OOrO1svfLu53n+4Q9/2H16AAAAAAAAAAAAAAAAAADA
-Cfx0tQMAAAAAAAAAAAAAAAAAANADHwADAAAAAAAAAAAAAAAAAHwIfAAMAAAAAAAAAAAAAAAAAPAh
-8AEwAAAAAAAAAAAAAAAAAMCHwAfAAAAAAAAAAAAAAAAAAAAfAh8AAwAAAAAAAAAAAAAAAAB8CHwA
-DAAAAAAAAAAAAAAAAADwIfABMAAAAAAAAAAAAAAAAADAh8AHwAAAAAAAAAAAAAAAAAAAHwIfAAMA
-AAAAAAAAAAAAAAAAfAh8AAwAAAAAAAAAAAAAAAAA8CHwATAAAAAAAAAAAAAAAAAAwIfAB8AAAAAA
-AAAAAAAAAAAAAB8CHwADAAAAAAAAAAAAAAAAAHwIfAAMAAAAAAAAAAAAAAAAAPAh8AEwAAAAAAAA
-AAAAAAAAAMCHwAfAAAAAAAAAAAAAAAAAAAAfAh8AAwAAAAAAAAAAAAAAAAB8CHwADAAAAAAAAAAA
-AAAAAADwIfABMAAAAAAAAAAAAAAAAADAh/D/ASSxzb6jN/+CAAAAAElFTkSuQmCC
-"
- x="0"
- y="0"
- width="1920"
- height="480"
- id="image10" />
-</svg>
diff --git a/app/images/images.qrc b/app/images/images.qrc
index 24782e3..867a055 100644
--- a/app/images/images.qrc
+++ b/app/images/images.qrc
@@ -1,7 +1,7 @@
<RCC>
<qresource prefix="/images">
- <file>homescreen/homebg_bottom.svg</file>
- <file>camera/camera_bg.svg</file>
- <file>camera/camerainfo_bg.svg</file>
+ <file>DividingLine.svg</file>
+ <file>Back.svg</file>
+ <file>Top.svg</file>
</qresource>
-</RCC>
+</RCC> \ No newline at end of file
diff --git a/app/main.cpp b/app/main.cpp
deleted file mode 100644
index 6fd928d..0000000
--- a/app/main.cpp
+++ /dev/null
@@ -1,138 +0,0 @@
-/*
- * Copyright (c) 2017 TOYOTA MOTOR CORPORATION
- * Copyright (C) 2016 The Qt Company Ltd.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include <QtCore/QDebug>
-#include <QtCore/QCommandLineParser>
-#include <QtCore/QUrlQuery>
-#include <QtCore/QFile>
-#include <QtGui/QGuiApplication>
-#include <QtQml/QQmlContext>
-#include <QtQml/QQmlApplicationEngine>
-#include <QtQuickControls2/QQuickStyle>
-#include <unistd.h>
-#include "camera.h"
-
-#include <QQuickWindow>
-
-#ifdef HAVE_LIBHOMESCREEN
-#include <libhomescreen.hpp>
-#endif
-#ifdef HAVE_QLIBWINDOWMANAGER
-#include <qlibwindowmanager.h>
-#endif
-
-int main(int argc, char *argv[])
-{
- QString myname = QString("camapp");
-
- QGuiApplication app(argc, argv);
- app.setApplicationName(myname);
- app.setApplicationVersion(QStringLiteral("0.1.0"));
- app.setOrganizationDomain(QStringLiteral("automotivelinux.org"));
- app.setOrganizationName(QStringLiteral("AutomotiveGradeLinux"));
-
- QQuickStyle::setStyle("AGL");
-
- QCommandLineParser parser;
- parser.addPositionalArgument("port", app.translate("main", "port for binding"));
- parser.addPositionalArgument("secret", app.translate("main", "secret for binding"));
- parser.addHelpOption();
- parser.addVersionOption();
- parser.process(app);
- QStringList positionalArguments = parser.positionalArguments();
-
- qmlRegisterType<Camera>("Camera", 1, 0, "Camera");
-
- QQmlApplicationEngine engine;
- QQmlContext *context = engine.rootContext();
- QUrl bindingAddress;
- int port = 0;
- QString secret;
- if (positionalArguments.length() == 2) {
- port = positionalArguments.takeFirst().toInt();
- secret = positionalArguments.takeFirst();
- bindingAddress.setScheme(QStringLiteral("ws"));
- bindingAddress.setHost(QStringLiteral("localhost"));
- bindingAddress.setPort(port);
- bindingAddress.setPath(QStringLiteral("/api"));
- QUrlQuery query;
- query.addQueryItem(QStringLiteral("token"), secret);
- bindingAddress.setQuery(query);
- context->setContextProperty(QStringLiteral("bindingAddress"), bindingAddress);
- } else {
- context->setContextProperty(QStringLiteral("bindingAddress"), bindingAddress);
- }
-
-#ifdef HAVE_QLIBWINDOWMANAGER
- // WindowManager
- QLibWindowmanager* qwm = new QLibWindowmanager();
- if(qwm->init(port,secret) != 0){
- exit(EXIT_FAILURE);
- }
- // Request a surface as described in layers.json windowmanager’s file
- if (qwm->requestSurface(myname) != 0) {
- exit(EXIT_FAILURE);
- }
- // Create an event callback against an event type. Here a lambda is called when SyncDraw event occurs
- qwm->set_event_handler(QLibWindowmanager::Event_SyncDraw, [qwm, myname](json_object *object) {
- fprintf(stderr, "Surface got syncDraw!\n");
- qwm->endDraw(myname);
- });
-#endif
-
-#ifdef HAVE_LIBHOMESCREEN
- // HomeScreen
- LibHomeScreen* hs = new LibHomeScreen();
- std::string token = secret.toStdString();
- hs->init(port, token.c_str());
- // Set the event handler for Event_TapShortcut which will activate the surface for windowmanager
- hs->set_event_handler(LibHomeScreen::Event_TapShortcut, [qwm, myname](json_object *object){
- json_object *appnameJ = nullptr;
- if(json_object_object_get_ex(object, "application_name", &appnameJ))
- {
- const char *appname = json_object_get_string(appnameJ);
- if(QString::compare(myname, appname, Qt::CaseInsensitive) == 0)
- {
- qDebug("Surface %s got tapShortcut\n", appname);
- qwm->activateSurface(myname);
- }
- }
- });
-#endif
- engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
-
- QObject *root = engine.rootObjects().first();
- QQuickWindow *window = qobject_cast<QQuickWindow *>(root);
-#ifdef HAVE_QLIBWINDOWMANAGER
- QObject::connect(window, SIGNAL(frameSwapped()), qwm, SLOT(slotActivateSurface()));
-
- qwm->set_event_handler(QLibWindowmanager::Event_Visible, [qwm, root](json_object *object) {
- fprintf(stderr, "Surface got Visible!\n");
- QMetaObject::invokeMethod(root, "changeVisible", Q_ARG(QVariant, true));
- });
-
- qwm->set_event_handler(QLibWindowmanager::Event_Invisible, [qwm, root](json_object *object) {
- fprintf(stderr, "Surface got Invisible!\n");
- QMetaObject::invokeMethod(root, "changeVisible", Q_ARG(QVariant, false));
- });
-#else
- window->resize(1280, 720);
- window->setVisible(true);
-#endif
-
- return app.exec();
-}
diff --git a/app/main.qml b/app/main.qml
index 9710c99..a481320 100644
--- a/app/main.qml
+++ b/app/main.qml
@@ -1,59 +1,92 @@
-/*
- * Copyright (c) 2017 TOYOTA MOTOR CORPORATION
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-import QtQuick 2.6
-import QtQuick.Layouts 1.3
-import QtQuick.Controls 2.0
-import QtQuick.Window 2.2
-import Camera 1.0
-import QtWebSockets 1.0
-
-ApplicationWindow {
- id: root
- width: 1920
- height: 720
-
- CameraControl {
- id:cameracontrol
- listWH: true
- device: camdev_device
- width: root.width
- height:80
- }
-
- Camera {
- id: camdev_device
- width: root.width
- height: root.height - cameracontrol.height
- anchors.top: cameracontrol.bottom
- onIsrunningChanged: {
- camerabg.visible = !isrunning
- }
-
- Image {
- id: camerabg
- anchors.centerIn: parent
- width: 200
- height: 200
- source: "images/camera/camera_bg.svg"
- }
- }
-
- function changeVisible(visible) {
- console.log("camapp visible is " + visible)
- cameracontrol.switchChecked = visible
- }
-}
+/*
+ * Copyright (C) 2018 The Qt Company Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+import QtQuick 2.6
+import QtQuick.Controls 2.0
+import AGL.Demo.Controls 1.0
+import NativeAppModel 1.0
+import ServerAppModel 1.0
+
+import 'pages'
+
+ApplicationWindow {
+ id: root
+
+ width: 1080 * screenInfo.scale_factor()
+ height: 1487 * screenInfo.scale_factor()
+
+ SwipeView {
+ id: stackLayout
+ anchors.fill: parent
+ currentIndex: tabBar.currentIndex
+
+ ListPage {
+ id: listPage
+
+ model: ServerAppModel {
+ id: listModel
+ }
+ }
+
+ SearchPage {
+ id: searchPage
+
+ title: 'SearchPage'
+ }
+
+ ManagementPage {
+ id: managementPage
+
+ model: NativeAppModel {
+ id: managementModel
+ }
+ }
+
+ Connections {
+ target: managementPage.model
+ onApplistChanged: {
+ listPage.model.setNativeApplist(applist)
+ }
+ }
+
+ Component.onCompleted: {
+ listPage.model.getNextPage(0)
+ managementPage.model.refresh()
+ }
+ }
+
+
+ footer: TabBar {
+ id: tabBar
+ height: 80
+ currentIndex: stackLayout.currentIndex
+
+ TabButton {
+ text: "List"
+ font.pixelSize: 20
+ height: parent.height
+ }
+ TabButton {
+ text: "Search"
+ font.pixelSize: 20
+ height: parent.height
+ }
+ TabButton {
+ text: "Management"
+ font.pixelSize: 20
+ height: parent.height
+ }
+ }
+}
diff --git a/app/main.qrc b/app/main.qrc
deleted file mode 100644
index 4a5aac9..0000000
--- a/app/main.qrc
+++ /dev/null
@@ -1,6 +0,0 @@
-<RCC>
- <qresource prefix="/">
- <file>main.qml</file>
- <file>CameraControl.qml</file>
- </qresource>
-</RCC>
diff --git a/app/pages/DetailPage.qml b/app/pages/DetailPage.qml
new file mode 100644
index 0000000..043714d
--- /dev/null
+++ b/app/pages/DetailPage.qml
@@ -0,0 +1,111 @@
+/*
+ * Copyright (C) 2018 The Qt Company Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import QtQuick 2.6
+import QtQuick.Layouts 1.1
+import QtQuick.Controls 2.0
+
+ Page {
+ id: detailpage
+ visible: true
+
+ property StackView stack: null
+ property var model
+
+ Item {
+ id: backItem
+ width: 80
+ height: 40
+
+ Image {
+ anchors.fill: parent
+ source: 'qrc:/images/Back.svg'
+ }
+
+ MouseArea {
+ anchors.fill: parent
+ onClicked: {
+ stack.pop(StackView.Immediate)
+ }
+ }
+ }
+
+ RowLayout {
+ id: infoLayout
+
+ height: parent.width / 3
+ width: parent.width
+ anchors.top: backItem.bottom
+ anchors.topMargin: 10
+
+ spacing: 20
+
+ Item {
+ Layout.preferredWidth: 200
+ Layout.preferredHeight: 200
+ Image {
+ anchors.fill: parent
+ source: model.icon
+ }
+ }
+
+ ColumnLayout {
+ spacing: 5
+ Label {
+ Layout.fillWidth: true
+ text: model.name.toUpperCase()
+ font.pixelSize: 32
+ color: '#00ADDC'
+ }
+ Label {
+ text: 'Author: ' + model.author
+ font.pixelSize: 24
+ }
+ Label {
+ text: 'Version: ' + model.version
+ font.pixelSize: 16
+ font.italic: true
+ }
+ Label {
+ text: 'Category: ' + model.category
+ font.pixelSize: 16
+ }
+ Label {
+ text: 'UpdateTime: ' + new Date(model.createdtime)
+ font.pixelSize: 16
+ }
+ }
+ }
+
+ Image {
+ id: dividingLine
+ width: parent.width
+ anchors.top: infoLayout.bottom
+ anchors.topMargin: 10
+ anchors.horizontalCenter: parent.horizontalCenter
+ source: 'qrc:/images/DividingLine.svg'
+ }
+
+ Label {
+ width: parent.width
+ anchors.top: dividingLine.bottom
+ anchors.topMargin: 20
+
+ text: model.description
+ wrapMode: Text.Wrap
+ font.pixelSize: 40
+ }
+ } \ No newline at end of file
diff --git a/app/pages/DownloadBar.qml b/app/pages/DownloadBar.qml
new file mode 100644
index 0000000..38139e6
--- /dev/null
+++ b/app/pages/DownloadBar.qml
@@ -0,0 +1,43 @@
+/*
+ * Copyright (C) 2018 The Qt Company Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import QtQuick 2.6
+import QtQuick.Controls 2.0
+
+ProgressBar {
+ property real progress: 0
+
+ id: progressbar
+ z: -1
+ value: (progress/100)
+
+ background: Rectangle {
+ anchors.fill: parent
+ color: "transparent"
+ opacity: 0
+ }
+
+ contentItem: Item {
+ anchors.fill: parent
+
+ Rectangle {
+ width: progressbar.value * parent.width
+ height: parent.height
+ opacity: 0.3
+ color: "#32d0eb"
+ }
+ }
+} \ No newline at end of file
diff --git a/app/pages/ListPage.qml b/app/pages/ListPage.qml
new file mode 100644
index 0000000..f4b78da
--- /dev/null
+++ b/app/pages/ListPage.qml
@@ -0,0 +1,186 @@
+/*
+ * Copyright (C) 2018 The Qt Company Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import QtQuick 2.6
+import QtQuick.Layouts 1.1
+import QtQuick.Controls 2.0
+
+Page {
+ id: root
+ property alias model: listView.model
+
+ property int appSize: 0
+ property int pageSize: 0
+ property int currentPageIndex: 0
+
+ property int nPullHeight: 100
+
+ BusyIndicator {
+ id: prevBusyIndicator
+ anchors.horizontalCenter: parent.horizontalCenter
+ implicitWidth: 60
+ implicitHeight: 60
+ running: false
+ }
+
+ StackView {
+ id: stack
+ initialItem: listView
+ anchors.fill: parent
+ anchors.margins: root.width * 0.075
+ }
+
+ ListView {
+ id: listView
+ //anchors.fill: parent
+ //anchors.margins: root.width * 0.075
+ clip: true
+
+ delegate: MouseArea {
+ id: delegate
+ width: listView.width
+ height: width / 6
+
+ RowLayout {
+ anchors.fill: parent
+
+ Item {
+ Layout.preferredWidth: 100
+ Layout.preferredHeight: 100
+
+ MouseArea{
+ anchors.fill: parent
+ z: 2
+ onClicked: {
+ stack.push("qrc:/pages/DetailPage.qml", {stack: stack, model: model}, StackView.Immediate)
+ }
+ }
+ Image {
+ anchors.fill: parent
+ source: model.icon
+ }
+ }
+ ColumnLayout {
+ Label {
+ Layout.fillWidth: true
+ text: model.name.toUpperCase()
+ color: '#00ADDC'
+ }
+ Label {
+ text: 'Version: ' + model.version
+ font.pixelSize: 16
+ font.italic: true
+ }
+ Label {
+ text: 'Description: ' + model.description
+ font.pixelSize: 16
+ wrapMode: Text.Wrap
+ elide: Text.ElideRight
+ Layout.preferredWidth: 400
+ Layout.preferredHeight: 40
+ }
+ }
+ ColumnLayout {
+ spacing: 5
+ Layout.alignment: Qt.AlignRight | Qt.AlignVCenter
+
+ Button {
+ x: x - 6
+ text: model.statetext
+ onClicked: {
+ if (model.statetext === 'Install' || model.statetext === 'Update') {
+ listView.model.install(model.index)
+ } else if (model.statetext === 'Launch') {
+ if (listView.model.launch(model.id) > 1) {
+ homescreenHandler.tapShortcut(model.name)
+ } else {
+ console.warn('app cannot be launched')
+ }
+ }
+ }
+ implicitWidth: 140
+ implicitHeight: 40
+ //Layout.rightMargin: 5
+ }
+ }
+
+ }
+ DownloadBar {
+ anchors.fill: parent
+ progress: model.progress
+ }
+ Image {
+ source: 'qrc:/images/DividingLine.svg'
+ anchors.horizontalCenter: parent.horizontalCenter
+ anchors.top: parent.top
+ visible: model.index > 0
+ }
+
+
+ }
+
+ states: [
+ State {
+ name: "prevPageState"; when: listView.contentY < -nPullHeight
+ StateChangeScript {
+ name: "prevPageScript"
+ script: getPrevPage()
+ }
+ }
+ ]
+ }
+
+ function getPrevPage() {
+ listView.y = nPullHeight;
+
+ currentPageIndex = currentPageIndex > 0 ? currentPageIndex-1 : 0;
+ prevBusyIndicator.running = true
+ prevPageTimer.start();
+ }
+
+ Timer {
+ id: prevPageTimer
+ interval: 1000
+ repeat: false
+ running: false
+ onTriggered: {
+ listView.model.getPrevPage(currentPageIndex)
+ prevPageAnimation.start();
+ }
+ }
+
+ NumberAnimation {
+ id: prevPageAnimation
+ target: listView
+ property: "y"
+ duration: 100
+ from: nPullHeight
+ to: 0
+ onStopped: {
+ prevBusyIndicator.running = false
+ listView.y = 0;
+ }
+ }
+
+ Connections {
+ target: listView.model
+ onRequestCompleted: {
+ appSize = appsize
+ pageSize = pagesize
+ console.log("request completed!", appSize, pageSize)
+ }
+ }
+}
diff --git a/app/pages/ManagementPage.qml b/app/pages/ManagementPage.qml
new file mode 100644
index 0000000..9a4cf31
--- /dev/null
+++ b/app/pages/ManagementPage.qml
@@ -0,0 +1,156 @@
+/*
+ * Copyright (C) 2018 The Qt Company Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import QtQuick 2.6
+import QtQuick.Layouts 1.1
+import QtQuick.Controls 2.0
+
+Page {
+ id: root
+ property alias model: listView.model
+
+ property int nPullHeight: 300
+
+ BusyIndicator {
+ id: busyIndicator
+ anchors.horizontalCenter: parent.horizontalCenter
+ implicitWidth: 60
+ implicitHeight: 60
+ running: false
+ }
+
+ ListView {
+ id: listView
+ anchors.fill: parent
+ anchors.margins: root.width * 0.075
+ clip: true
+
+ delegate: MouseArea {
+ id: delegate
+ width: listView.width
+ height: width / 6
+ RowLayout {
+ anchors.fill: parent
+ Item {
+ Layout.preferredWidth: 100
+ Layout.preferredHeight: 100
+ Image {
+ anchors.fill: parent
+ source: 'file://' + model.icon
+ }
+ }
+ ColumnLayout {
+ Label {
+ Layout.fillWidth: true
+ text: model.name.toUpperCase()
+ color: '#00ADDC'
+ }
+ Label {
+ text: 'Version: ' + model.version
+ font.pixelSize: 16
+ font.italic: true
+ }
+ Label {
+ text: 'Description: ' + model.description
+ font.pixelSize: 16
+ wrapMode: Text.Wrap
+ elide: Text.ElideRight
+ Layout.preferredWidth: 400
+ Layout.preferredHeight: 40
+ }
+ }
+ ColumnLayout {
+ spacing: 5
+ Layout.alignment: Qt.AlignRight | Qt.AlignVCenter
+
+ Button {
+ x: x - 6
+ text: 'Launch'
+ onClicked: {
+ if (listView.model.launch(model.id) > 1) {
+ homescreenHandler.tapShortcut(model.name)
+ } else {
+ console.warn('app cannot be launched')
+ }
+ }
+ implicitWidth: 140
+ implicitHeight: 40
+ }
+ Button {
+ x: x - 6
+ visible: model.name.toUpperCase() != "HOMESCREEN" && model.name.toUpperCase() != "LAUNCHER"
+ text: 'Uninstall'
+ onClicked: {
+ listView.model.uninstall(model.index)
+ }
+ implicitWidth: 140
+ implicitHeight: 40
+ }
+ }
+ }
+ Image {
+ source: 'qrc:/images/DividingLine.svg'
+ anchors.horizontalCenter: parent.horizontalCenter
+ anchors.top: parent.top
+ visible: model.index > 0
+ }
+
+ }
+
+ states: [
+ State {
+ name: "refreshState"; when: listView.contentY < -nPullHeight
+ StateChangeScript {
+ name: "refreshScript"
+ script: refreshModel()
+ }
+ }
+ ]
+ }
+
+ function refreshModel() {
+ listView.y = nPullHeight;
+
+ busyIndicator.running = true
+ refreshTimer.start();
+ }
+
+ Timer {
+ id: refreshTimer
+ interval: 1000
+ repeat: false
+ running: false
+ onTriggered: {
+ listView.model.refresh()
+ refreshAnimation.start();
+ }
+ }
+
+ NumberAnimation {
+ id: refreshAnimation
+ target: listView
+ property: "y"
+ duration: 100
+ from: nPullHeight
+ to: 0
+ onStopped: {
+ busyIndicator.running = false
+ listView.y = 0;
+ }
+ }
+
+}
+
diff --git a/app/pages/SearchPage.qml b/app/pages/SearchPage.qml
new file mode 100644
index 0000000..1d495b4
--- /dev/null
+++ b/app/pages/SearchPage.qml
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2018 The Qt Company Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import QtQuick 2.6
+import QtQuick.Controls 2.0
+
+Page {
+ id: root
+
+ title: 'SearchPage'
+}
diff --git a/app/resources.qrc b/app/resources.qrc
new file mode 100644
index 0000000..bcf707b
--- /dev/null
+++ b/app/resources.qrc
@@ -0,0 +1,10 @@
+<RCC>
+ <qresource prefix="/">
+ <file>main.qml</file>
+ <file>pages/ListPage.qml</file>
+ <file>pages/SearchPage.qml</file>
+ <file>pages/ManagementPage.qml</file>
+ <file>pages/DownloadBar.qml</file>
+ <file>pages/DetailPage.qml</file>
+ </qresource>
+</RCC> \ No newline at end of file
diff --git a/app/src/appinfo.cpp b/app/src/appinfo.cpp
new file mode 100644
index 0000000..b06dd2f
--- /dev/null
+++ b/app/src/appinfo.cpp
@@ -0,0 +1,200 @@
+/*
+ * Copyright (C) 2016, 2017 Mentor Graphics Development (Deutschland) GmbH
+ * Copyright (C) 2016 The Qt Company Ltd.
+ * Copyright (c) 2018 TOYOTA MOTOR CORPORATION
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "appinfo.h"
+#include "hmi-debug.h"
+
+class AppInfo::Private : public QSharedData {
+ public:
+ Private();
+ Private(const Private& other);
+
+ QString id;
+ QString version;
+ int width;
+ int height;
+ QString name;
+ QString description;
+ QString shortname;
+ QString author;
+ QString iconPath;
+ AppState state;
+ qreal progress;
+
+ QString serverid;
+ QString wgtpath;
+ QString filename;
+ QString categoryid;
+ QString categoryname;
+ QString deviceid;
+ QString devicename;
+ double createdtime;
+};
+
+AppInfo::Private::Private() : width(-1), height(-1) {}
+
+AppInfo::Private::Private(const Private& other)
+ : QSharedData(other),
+ id(other.id),
+ version(other.version),
+ width(other.width),
+ height(other.height),
+ name(other.name),
+ description(other.description),
+ shortname(other.shortname),
+ author(other.author),
+ iconPath(other.iconPath),
+ state(other.state),
+ progress(other.progress),
+ serverid(other.serverid),
+ wgtpath(other.wgtpath),
+ filename(other.filename),
+ categoryid(other.categoryid),
+ categoryname(other.categoryname),
+ deviceid(other.deviceid),
+ devicename(other.devicename),
+ createdtime(other.createdtime) {}
+
+AppInfo::AppInfo() : d(new Private) {}
+
+AppInfo::AppInfo(const QString& icon, const QString& name, const QString& id)
+ : d(new Private) {
+ d->iconPath = icon;
+ d->name = name;
+ d->id = id;
+}
+
+AppInfo::AppInfo(const AppInfo& other) : d(other.d) {}
+
+AppInfo::~AppInfo() {}
+
+AppInfo& AppInfo::operator=(const AppInfo& other) {
+ d = other.d;
+ return *this;
+}
+
+QString AppInfo::id() const {
+ return d->id;
+}
+
+QString AppInfo::version() const {
+ return d->version;
+}
+
+int AppInfo::width() const {
+ return d->width;
+}
+
+int AppInfo::height() const {
+ return d->height;
+}
+
+QString AppInfo::name() const {
+ return d->name;
+}
+
+QString AppInfo::description() const {
+ return d->description;
+}
+
+QString AppInfo::shortname() const {
+ return d->shortname;
+}
+
+QString AppInfo::author() const {
+ return d->author;
+}
+
+QString AppInfo::iconPath() const {
+ return d->iconPath;
+}
+
+AppInfo::AppState AppInfo::state() const {
+ return d->state;
+}
+
+qreal AppInfo::progress() const {
+ return d->progress;
+}
+
+QString AppInfo::serverId() const {
+ return d->serverid;
+}
+QString AppInfo::wgtPath() const {
+ return d->wgtpath;
+}
+QString AppInfo::fileName() const {
+ return d->filename;
+}
+
+QString AppInfo::categoryId() const {
+ return d->categoryid;
+}
+QString AppInfo::categoryName() const {
+ return d->categoryname;
+}
+QString AppInfo::deviceId() const {
+ return d->deviceid;
+}
+QString AppInfo::deviceName() const {
+ return d->devicename;
+}
+double AppInfo::createdTime() const {
+ return d->createdtime;
+}
+
+void AppInfo::setState(const AppState state) {
+ d->state = state;
+}
+
+void AppInfo::setProgress(const qreal progress) {
+ d->progress = progress;
+}
+
+void AppInfo::read(const QJsonObject& json) {
+ d->id = json["id"].toString();
+ d->version = json["version"].toString();
+ d->width = json["width"].toInt();
+ d->height = json["height"].toInt();
+ d->name = json["name"].toString();
+ d->description = json["description"].toString();
+ d->shortname = json["shortname"].toString();
+ d->author = json["author"].toString();
+ d->iconPath = json["icon"].toString();
+ d->state = Launch;
+}
+
+void AppInfo::readFromServer(const QJsonObject& json) {
+ d->name = json["appName"].toString();
+ d->description = json["appAbstract"].toString();
+ d->version = json["versionName"].toString();
+ d->id = json["appIdCustom"].toString() + "@" + d->version;
+ d->serverid = json["appId"].toString();
+ d->wgtpath = json["verFilePath"].toString();
+ d->filename = json["verFilePath"].toString().section('/', -1);
+ d->author = json["developerName"].toString();
+ d->categoryid = json["typeId"].toString();
+ d->categoryname = json["typeName"].toString();
+ d->deviceid = json["appDeviceTypeId"].toString();
+ d->devicename = json["appDeviceTypeName"].toString();
+ d->createdtime = json["updateDate"].toDouble();
+ // d->iconPath = json["icon"].toString();
+ d->iconPath = "file:///var/local/lib/afm/applications/launcher/0.1/icon.svg";
+ d->state = Install;
+ d->progress = 0.0;
+}
diff --git a/app/src/appinfo.h b/app/src/appinfo.h
new file mode 100644
index 0000000..052cbc9
--- /dev/null
+++ b/app/src/appinfo.h
@@ -0,0 +1,94 @@
+/*
+ * Copyright (C) 2016, 2017 Mentor Graphics Development (Deutschland) GmbH
+ * Copyright (C) 2016 The Qt Company Ltd.
+ * Copyright (c) 2018 TOYOTA MOTOR CORPORATION
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef APPINFO_H
+#define APPINFO_H
+
+#include <QtCore/QJsonObject>
+#include <QtCore/QObject>
+#include <QtCore/QSharedDataPointer>
+
+class AppInfo {
+ Q_GADGET
+ Q_PROPERTY(QString id READ id)
+ Q_PROPERTY(QString version READ version)
+ Q_PROPERTY(int width READ width)
+ Q_PROPERTY(int height READ height)
+ Q_PROPERTY(QString name READ name)
+ Q_PROPERTY(QString description READ description)
+ Q_PROPERTY(QString shortname READ shortname)
+ Q_PROPERTY(QString author READ author)
+ Q_PROPERTY(QString iconPath READ iconPath)
+ Q_PROPERTY(AppState state READ state WRITE setState)
+ Q_PROPERTY(qreal progress READ progress WRITE setProgress)
+ Q_PROPERTY(QString serverid READ serverId)
+ Q_PROPERTY(QString wgtpath READ wgtPath)
+ Q_PROPERTY(QString filename READ fileName)
+ Q_PROPERTY(QString categoryid READ categoryId)
+ Q_PROPERTY(QString categoryname READ categoryName)
+ Q_PROPERTY(QString deviceid READ deviceId)
+ Q_PROPERTY(QString devicename READ deviceName)
+ Q_PROPERTY(double createdtime READ createdTime)
+ public:
+ enum AppState { Install = 0, Update, Launch, Downloading, Installing };
+ Q_ENUM(AppState)
+
+ AppInfo();
+ AppInfo(const QString& icon, const QString& name, const QString& id);
+ AppInfo(const AppInfo& other);
+ virtual ~AppInfo();
+ AppInfo& operator=(const AppInfo& other);
+ void swap(AppInfo& other) { qSwap(d, other.d); }
+
+ QString id() const;
+ QString version() const;
+ int width() const;
+ int height() const;
+ QString name() const;
+ QString description() const;
+ QString shortname() const;
+ QString author() const;
+ QString iconPath() const;
+ AppState state() const;
+ qreal progress() const;
+
+ QString serverId() const;
+ QString wgtPath() const;
+ QString fileName() const;
+ QString categoryId() const;
+ QString categoryName() const;
+ QString deviceId() const;
+ QString deviceName() const;
+ double createdTime() const;
+
+ void setState(const AppState state);
+ void setProgress(const qreal progress);
+
+ void read(const QJsonObject& json);
+ void readFromServer(const QJsonObject& json);
+
+ private:
+ class Private;
+ QSharedDataPointer<Private> d;
+};
+
+Q_DECLARE_SHARED(AppInfo)
+Q_DECLARE_METATYPE(AppInfo)
+Q_DECLARE_METATYPE(QList<AppInfo>)
+
+#endif // APPINFO_H
diff --git a/app/src/config.h b/app/src/config.h
new file mode 100644
index 0000000..0f2d5ed
--- /dev/null
+++ b/app/src/config.h
@@ -0,0 +1,46 @@
+/*
+ * Copyright (C) 2016 The Qt Company Ltd.
+ * Copyright (c) 2018 TOYOTA MOTOR CORPORATION
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#ifndef CONFIG_H
+#define CONFIG_H
+
+// server url config
+//#define SERVER_DOMAIN "192.168.20.161/webservice"
+#define SERVER_DOMAIN "202.7.19.45/webservice"
+//#define SERVER_DOMAIN "warehouse.tmc-tokai.jp/webservice"
+#define SERVER_BASE_URL "/api/v1/app"
+#define SERVER_API_LIST "/collection"
+
+#define getURL(api) \
+ QString("http://%1%2%3").arg(SERVER_DOMAIN, SERVER_BASE_URL, api)
+#define getUrlWithPage(api, offset, limit) \
+ getURL(api).append( \
+ QString("?sort=updateDate&order=desc&offset=%1&limit=%2") \
+ .arg(QString::number(offset), QString::number(limit)))
+
+//#define getWgtUrl(path, typeId, appId) \
+// QString("http://%1%2/file/%3/%4/%5") \
+// .arg(SERVER_DOMAIN, SERVER_BASE_URL, path, typeId, appId)
+#define getWgtUrl(path) \
+ QString("http://%1%2/file?filePath=%3") \
+ .arg(SERVER_DOMAIN, SERVER_BASE_URL, path)
+
+// server app page config
+#define PAGE_SIZE 20
+
+#define getDownloadFilePath(filename) QString("/tmp/%1").arg(filename)
+
+#endif // !CONFIG_H
diff --git a/app/src/hmi-debug.h b/app/src/hmi-debug.h
new file mode 100644
index 0000000..96bbd1f
--- /dev/null
+++ b/app/src/hmi-debug.h
@@ -0,0 +1,89 @@
+/*
+ * Copyright (c) 2018 TOYOTA MOTOR CORPORATION
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __HMI_DEBUG_H__
+#define __HMI_DEBUG_H__
+
+#include <stdarg.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <time.h>
+
+enum LOG_LEVEL {
+ LOG_LEVEL_NONE = 0,
+ LOG_LEVEL_ERROR,
+ LOG_LEVEL_WARNING,
+ LOG_LEVEL_NOTICE,
+ LOG_LEVEL_INFO,
+ LOG_LEVEL_DEBUG,
+ LOG_LEVEL_MAX = LOG_LEVEL_DEBUG
+};
+
+#define __FILENAME__ \
+ (strrchr(__FILE__, '/') ? strrchr(__FILE__, '/') + 1 : __FILE__)
+
+#define HMI_ERROR(prefix, args, ...) \
+ _HMI_LOG(LOG_LEVEL_ERROR, __FILENAME__, __FUNCTION__, __LINE__, prefix, \
+ args, ##__VA_ARGS__)
+#define HMI_WARNING(prefix, args, ...) \
+ _HMI_LOG(LOG_LEVEL_WARNING, __FILENAME__, __FUNCTION__, __LINE__, prefix, \
+ args, ##__VA_ARGS__)
+#define HMI_NOTICE(prefix, args, ...) \
+ _HMI_LOG(LOG_LEVEL_NOTICE, __FILENAME__, __FUNCTION__, __LINE__, prefix, \
+ args, ##__VA_ARGS__)
+#define HMI_INFO(prefix, args, ...) \
+ _HMI_LOG(LOG_LEVEL_INFO, __FILENAME__, __FUNCTION__, __LINE__, prefix, args, \
+ ##__VA_ARGS__)
+#define HMI_DEBUG(prefix, args, ...) \
+ _HMI_LOG(LOG_LEVEL_DEBUG, __FILENAME__, __FUNCTION__, __LINE__, prefix, \
+ args, ##__VA_ARGS__)
+
+static char ERROR_FLAG[6][20] = {"NONE", "ERROR", "WARNING",
+ "NOTICE", "INFO", "DEBUG"};
+
+static void _HMI_LOG(enum LOG_LEVEL level,
+ const char* file,
+ const char* func,
+ const int line,
+ const char* prefix,
+ const char* log,
+ ...) {
+ const int log_level = (getenv("USE_HMI_DEBUG") == NULL)
+ ? LOG_LEVEL_ERROR
+ : atoi(getenv("USE_HMI_DEBUG"));
+ if (log_level < level) {
+ return;
+ }
+
+ char* message;
+ struct timespec tp;
+ unsigned int time;
+
+ clock_gettime(CLOCK_REALTIME, &tp);
+ time = (tp.tv_sec * 1000000L) + (tp.tv_nsec / 1000);
+
+ va_list args;
+ va_start(args, log);
+ if (log == NULL || vasprintf(&message, log, args) < 0)
+ message = NULL;
+ fprintf(stderr, "[%10.3f] [%s %s] [%s, %s(), Line:%d] >>> %s \n",
+ time / 1000.0, prefix, ERROR_FLAG[level], file, func, line, message);
+ va_end(args);
+ free(message);
+}
+
+#endif //__HMI_DEBUG_H__
diff --git a/app/src/httpclient.cpp b/app/src/httpclient.cpp
new file mode 100644
index 0000000..490fd79
--- /dev/null
+++ b/app/src/httpclient.cpp
@@ -0,0 +1,267 @@
+
+#include "httpclient.h"
+
+#include <QDebug>
+#include <QFile>
+#include <QHash>
+#include <QHttpMultiPart>
+#include <QHttpPart>
+#include <QNetworkAccessManager>
+#include <QNetworkReply>
+#include <QNetworkRequest>
+#include <QUrlQuery>
+
+class HttpClientPrivate {
+ public:
+ HttpClientPrivate(const QString& url);
+
+ QString url;
+ QUrlQuery params;
+ QHash<QString, QString> headers;
+ QNetworkAccessManager* manager;
+
+ bool debug;
+
+ enum HttpMethod { GET, POST, PUT, DELETE };
+
+ static QNetworkAccessManager* getManager(HttpClientPrivate* d,
+ bool* internal);
+
+ static QNetworkRequest createRequest(HttpClientPrivate* d, HttpMethod method);
+
+ static void get(HttpClientPrivate* d,
+ HttpMethod method,
+ std::function<void(const QString&)> successHandler,
+ std::function<void(const QString&)> errorHandler,
+ const char* encoding);
+
+ static QString readReply(QNetworkReply* reply,
+ const char* encoding = "UTF-8");
+
+ static void handleFinish(bool debug,
+ const QString& successMessage,
+ const QString& errorMessage,
+ std::function<void(const QString&)> successHandler,
+ std::function<void(const QString&)> errorHandler,
+ QNetworkReply* reply,
+ QNetworkAccessManager* manager);
+};
+
+HttpClientPrivate::HttpClientPrivate(const QString& url)
+ : url(url), manager(NULL), debug(false) {}
+
+HttpClient::HttpClient(const QString& url) : d(new HttpClientPrivate(url)) {}
+
+HttpClient::~HttpClient() {
+ delete d;
+}
+
+HttpClient& HttpClient::manager(QNetworkAccessManager* manager) {
+ d->manager = manager;
+ return *this;
+}
+
+HttpClient& HttpClient::debug(bool debug) {
+ d->debug = debug;
+ return *this;
+}
+
+HttpClient& HttpClient::param(const QString& name, const QString& value) {
+ d->params.addQueryItem(name, value);
+ return *this;
+}
+
+HttpClient& HttpClient::header(const QString& header, const QString& value) {
+ d->headers[header] = value;
+ return *this;
+}
+
+void HttpClient::get(std::function<void(const QString&)> successHandler,
+ std::function<void(const QString&)> errorHandler,
+ const char* encoding) {
+ HttpClientPrivate::get(d, HttpClientPrivate::GET, successHandler,
+ errorHandler, encoding);
+}
+
+void HttpClient::download(
+ const QString& savePath,
+ std::function<void(const QString&)> successHandler,
+ std::function<void(const QString&)> errorHandler,
+ std::function<void(const qint64, const qint64)> progressHandler) {
+ bool debug = d->debug;
+ QFile* file = new QFile(savePath);
+
+ if (file->open(QIODevice::WriteOnly)) {
+ download(
+ [=](const QByteArray& data) { file->write(data); },
+ [=](const QString&) {
+ file->flush();
+ file->close();
+ file->deleteLater();
+
+ if (debug) {
+ qDebug().noquote()
+ << QString("download finished, save to: %1").arg(savePath);
+ }
+
+ if (NULL != successHandler) {
+ successHandler(
+ QString("download finished, save to: %1").arg(savePath));
+ }
+ },
+ errorHandler, progressHandler);
+ } else {
+ if (debug) {
+ qDebug().noquote() << QString("open file error: %1").arg(savePath);
+ }
+
+ if (NULL != errorHandler) {
+ errorHandler(QString("open file error: %1").arg(savePath));
+ }
+ }
+}
+
+void HttpClient::download(
+ std::function<void(const QByteArray&)> readyRead,
+ std::function<void(const QString&)> successHandler,
+ std::function<void(const QString&)> errorHandler,
+ std::function<void(const qint64, const qint64)> progressHandler) {
+ bool debug = d->debug;
+ bool internal;
+
+ QNetworkAccessManager* manager = HttpClientPrivate::getManager(d, &internal);
+ QNetworkRequest request =
+ HttpClientPrivate::createRequest(d, HttpClientPrivate::GET);
+ QNetworkReply* reply = manager->get(request);
+
+ QObject::connect(reply, &QNetworkReply::readyRead,
+ [=] { readyRead(reply->readAll()); });
+
+ QObject::connect(reply, &QNetworkReply::finished, [=] {
+ QString successMessage = "download finished";
+ QString errorMessage = reply->errorString();
+ HttpClientPrivate::handleFinish(debug, successMessage, errorMessage,
+ successHandler, errorHandler, reply,
+ internal ? manager : NULL);
+ });
+
+ QObject::connect(reply, &QNetworkReply::downloadProgress,
+ [=](qint64 bytesReceived, qint64 bytesTotal) {
+ if (NULL != progressHandler) {
+ progressHandler(bytesReceived, bytesTotal);
+ }
+ });
+}
+
+void HttpClientPrivate::get(HttpClientPrivate* d,
+ HttpMethod method,
+ std::function<void(const QString&)> successHandler,
+ std::function<void(const QString&)> errorHandler,
+ const char* encoding) {
+ bool internal;
+
+ QNetworkAccessManager* manager = HttpClientPrivate::getManager(d, &internal);
+ QNetworkRequest request =
+ HttpClientPrivate::createRequest(d, HttpClientPrivate::GET);
+ QNetworkReply* reply = NULL;
+
+ switch (method) {
+ case HttpClientPrivate::GET:
+ reply = manager->get(request);
+ break;
+
+ default:
+ break;
+ }
+
+ QObject::connect(reply, &QNetworkReply::finished, [=] {
+ QString successMessage = HttpClientPrivate::readReply(reply, encoding);
+ QString errorMessage = reply->errorString();
+ HttpClientPrivate::handleFinish(d->debug, successMessage, errorMessage,
+ successHandler, errorHandler, reply,
+ internal ? manager : NULL);
+ });
+}
+
+QNetworkAccessManager* HttpClientPrivate::getManager(HttpClientPrivate* d,
+ bool* internal) {
+ *internal = d->manager == NULL;
+ return *internal ? new QNetworkAccessManager() : d->manager;
+}
+
+QNetworkRequest HttpClientPrivate::createRequest(HttpClientPrivate* d,
+ HttpMethod method) {
+ if (!d->params.isEmpty()) {
+ d->url += "?" + d->params.toString(QUrl::FullyEncoded);
+ }
+
+ if (d->debug) {
+ qDebug().noquote() << "url:" << d->url;
+
+ QList<QPair<QString, QString> > paramItems = d->params.queryItems();
+ for (int i = 0; i < paramItems.size(); ++i) {
+ QString name = paramItems.at(i).first;
+ QString value = paramItems.at(i).second;
+ if (0 == i) {
+ qDebug().noquote() << QString("params: %1=%2").arg(name).arg(value);
+ } else {
+ qDebug().noquote() << QString(" %1=%2").arg(name).arg(value);
+ }
+ }
+ }
+
+ QNetworkRequest request(QUrl(d->url));
+ QHashIterator<QString, QString> iter(d->headers);
+ while (iter.hasNext()) {
+ iter.next();
+ request.setRawHeader(iter.key().toUtf8(), iter.value().toUtf8());
+ }
+
+ return request;
+}
+
+QString HttpClientPrivate::readReply(QNetworkReply* reply,
+ const char* encoding) {
+ QTextStream in(reply);
+ QString result;
+ in.setCodec(encoding);
+
+ while (!in.atEnd()) {
+ result += in.readLine();
+ }
+
+ return result;
+}
+
+void HttpClientPrivate::handleFinish(
+ bool debug,
+ const QString& successMessage,
+ const QString& errorMessage,
+ std::function<void(const QString&)> successHandler,
+ std::function<void(const QString&)> errorHandler,
+ QNetworkReply* reply,
+ QNetworkAccessManager* manager) {
+ if (reply->error() == QNetworkReply::NoError) {
+ if (debug) {
+ qDebug().noquote()
+ << QString("request successed: %1").arg(successMessage);
+ }
+
+ if (NULL != successHandler) {
+ successHandler(successMessage);
+ }
+ } else {
+ if (debug) {
+ qDebug().noquote() << QString("request failed: %1").arg(errorMessage);
+ }
+
+ if (NULL != errorHandler) {
+ errorHandler(errorMessage);
+ }
+ }
+
+ reply->deleteLater();
+ if (NULL != manager) {
+ manager->deleteLater();
+ }
+}
diff --git a/app/src/httpclient.h b/app/src/httpclient.h
new file mode 100644
index 0000000..42f002c
--- /dev/null
+++ b/app/src/httpclient.h
@@ -0,0 +1,48 @@
+
+#ifndef HTTPCLIENT_H
+#define HTTPCLIENT_H
+
+#include <functional>
+#include <QtGlobal>
+
+class QString;
+class QByteArray;
+class QNetworkRequest;
+class QNetworkReply;
+class QNetworkAccessManager;
+class HttpClientPrivate;
+
+class HttpClient {
+ public:
+ HttpClient(const QString& url);
+ ~HttpClient();
+
+ HttpClient& manager(QNetworkAccessManager* manager);
+
+ HttpClient& debug(bool debug);
+
+ HttpClient& param(const QString& name, const QString& value);
+
+ HttpClient& header(const QString& header, const QString& value);
+
+ void get(std::function<void(const QString&)> successHandler,
+ std::function<void(const QString&)> errorHandler = NULL,
+ const char* encoding = "UTF-8");
+
+ void download(
+ const QString& savePath,
+ std::function<void(const QString&)> successHandler = NULL,
+ std::function<void(const QString&)> errorHandler = NULL,
+ std::function<void(const qint64, const qint64)> progressHandler = NULL);
+
+ void download(
+ std::function<void(const QByteArray&)> readyRead,
+ std::function<void(const QString&)> successHandler = NULL,
+ std::function<void(const QString&)> errorHandler = NULL,
+ std::function<void(const qint64, const qint64)> progressHandler = NULL);
+
+ private:
+ HttpClientPrivate* d;
+};
+
+#endif // !HTTPCLIENT_H
diff --git a/app/src/main.cpp b/app/src/main.cpp
new file mode 100644
index 0000000..6dc6822
--- /dev/null
+++ b/app/src/main.cpp
@@ -0,0 +1,139 @@
+/*
+ * Copyright (C) 2018 The Qt Company Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <QtQml/qqml.h>
+#include <qlibwindowmanager.h>
+#include <QQuickWindow>
+#include <QtCore/QCommandLineParser>
+#include <QtCore/QDebug>
+#include <QtCore/QDir>
+#include <QtCore/QStandardPaths>
+#include <QtCore/QUrlQuery>
+#include <QtGui/QGuiApplication>
+#include <QtQml/QQmlApplicationEngine>
+#include <QtQml/QQmlContext>
+#include <QtQuickControls2/QQuickStyle>
+#include "afm_user_daemon_proxy.h"
+#include "nativeappmodel.h"
+#include "qlibhomescreen.h"
+#include "serverappmodel.h"
+
+org::AGL::afm::user* afm_user_daemon_proxy;
+
+namespace {
+
+struct Cleanup {
+ static inline void cleanup(org::AGL::afm::user* p) {
+ delete p;
+ afm_user_daemon_proxy = Q_NULLPTR;
+ }
+};
+
+void noOutput(QtMsgType, const QMessageLogContext&, const QString&) {}
+
+} // namespace
+
+int main(int argc, char* argv[]) {
+ QString role = QString("warehouse");
+ QGuiApplication app(argc, argv);
+
+ // use launch process
+ QScopedPointer<org::AGL::afm::user, Cleanup> afm_user_daemon_proxy(
+ new org::AGL::afm::user("org.AGL.afm.user", "/org/AGL/afm/user",
+ QDBusConnection::sessionBus(), 0));
+ ::afm_user_daemon_proxy = afm_user_daemon_proxy.data();
+
+ app.setApplicationName("warehouse");
+
+ QQuickStyle::setStyle("AGL");
+
+ QQmlApplicationEngine engine;
+ QQmlContext* context = engine.rootContext();
+
+ QCommandLineParser parser;
+ parser.addPositionalArgument("port",
+ app.translate("main", "port for binding"));
+ parser.addPositionalArgument("secret",
+ app.translate("main", "secret for binding"));
+ parser.addHelpOption();
+ parser.addVersionOption();
+ parser.process(app);
+ QStringList positionalArguments = parser.positionalArguments();
+
+ if (positionalArguments.length() == 2) {
+ int port = positionalArguments.takeFirst().toInt();
+ QString secret = positionalArguments.takeFirst();
+ QUrl bindingAddress;
+ bindingAddress.setScheme(QStringLiteral("ws"));
+ bindingAddress.setHost(QStringLiteral("localhost"));
+ bindingAddress.setPort(port);
+ bindingAddress.setPath(QStringLiteral("/api"));
+ QUrlQuery query;
+ query.addQueryItem(QStringLiteral("token"), secret);
+ bindingAddress.setQuery(query);
+
+ std::string token = secret.toStdString();
+
+ // import C++ class to QML
+ qmlRegisterType<NativeAppModel>("NativeAppModel", 1, 0, "NativeAppModel");
+ qmlRegisterType<ServerAppModel>("ServerAppModel", 1, 0, "ServerAppModel");
+
+ QLibHomeScreen* homescreenHandler = new QLibHomeScreen();
+ QLibWindowmanager* qwm = new QLibWindowmanager();
+
+ // WindowManager
+ if (qwm->init(port, secret) != 0) {
+ exit(EXIT_FAILURE);
+ }
+
+ AGLScreenInfo screenInfo(qwm->get_scale_factor());
+
+ // Request a surface as described in layers.json windowmanager’s file
+ if (qwm->requestSurface(role) != 0) {
+ exit(EXIT_FAILURE);
+ }
+
+ // Create an event callback against an event type. Here a lambda is
+ // called when SyncDraw event occurs
+ qwm->set_event_handler(QLibWindowmanager::Event_SyncDraw,
+ [qwm, role](json_object* object) {
+ fprintf(stderr, "Surface got syncDraw!\n");
+
+ qwm->endDraw(role);
+ });
+
+ // HomeScreen
+ homescreenHandler->init(port, token.c_str());
+ // Set the event handler for Event_TapShortcut which will activate the
+ // surface for windowmanager
+ homescreenHandler->set_event_handler(
+ QLibHomeScreen::Event_TapShortcut, [qwm, role](json_object* object) {
+ qDebug("Surface warehouse got tapShortcut.\n");
+ qwm->activateWindow(role);
+ });
+
+ context->setContextProperty(QStringLiteral("homescreenHandler"),
+ homescreenHandler);
+ context->setContextProperty(QStringLiteral("screenInfo"), &screenInfo);
+ engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
+ QObject* root = engine.rootObjects().first();
+
+ QQuickWindow* window = qobject_cast<QQuickWindow*>(root);
+ QObject::connect(window, SIGNAL(frameSwapped()), qwm,
+ SLOT(slotActivateSurface()));
+ }
+ return app.exec();
+}
diff --git a/app/src/nativeappmodel.cpp b/app/src/nativeappmodel.cpp
new file mode 100644
index 0000000..a5fa42d
--- /dev/null
+++ b/app/src/nativeappmodel.cpp
@@ -0,0 +1,157 @@
+/*
+ * Copyright (C) 2016 The Qt Company Ltd.
+ * Copyright (C) 2016, 2017 Mentor Graphics Development (Deutschland) GmbH
+ * Copyright (c) 2018 TOYOTA MOTOR CORPORATION
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "nativeappmodel.h"
+#include <QtDBus/QDBusInterface>
+#include <QtDBus/QDBusReply>
+#include "afm_user_daemon_proxy.h"
+#include "httpclient.h"
+
+#include "hmi-debug.h"
+
+extern org::AGL::afm::user* afm_user_daemon_proxy;
+
+class NativeAppModel::Private {
+ public:
+ Private();
+
+ void getApps();
+
+ QList<AppInfo> data;
+};
+
+NativeAppModel::Private::Private() {
+ // this->getApps();
+}
+
+void NativeAppModel::Private::getApps() {
+ QString apps = afm_user_daemon_proxy->runnables(QStringLiteral(""));
+ QJsonDocument japps = QJsonDocument::fromJson(apps.toUtf8());
+ for (auto const& app : japps.array()) {
+ QJsonObject const& jso = app.toObject();
+
+ AppInfo appinfo;
+ appinfo.read(jso);
+
+ this->data.append(appinfo);
+ }
+}
+
+NativeAppModel::NativeAppModel(QObject* parent)
+ : QAbstractListModel(parent), d(new Private()) {
+ connect(afm_user_daemon_proxy, &org::AGL::afm::user::changed, this,
+ &NativeAppModel::appChanged);
+}
+
+NativeAppModel::~NativeAppModel() {
+ delete this->d;
+}
+
+int NativeAppModel::rowCount(const QModelIndex& parent) const {
+ if (parent.isValid())
+ return 0;
+
+ return this->d->data.count();
+}
+
+QVariant NativeAppModel::data(const QModelIndex& index, int role) const {
+ QVariant ret;
+ if (!index.isValid())
+ return ret;
+
+ switch (role) {
+ case IconRole:
+ ret = this->d->data[index.row()].iconPath();
+ break;
+ case NameRole:
+ ret = this->d->data[index.row()].name();
+ break;
+ case IdRole:
+ ret = this->d->data[index.row()].id();
+ break;
+ case VersionRole:
+ ret = this->d->data[index.row()].version();
+ break;
+ case DescriptionRole:
+ ret = this->d->data[index.row()].description();
+ break;
+ case ShortNameRole:
+ ret = this->d->data[index.row()].shortname();
+ break;
+ case AuthorRole:
+ ret = this->d->data[index.row()].author();
+ break;
+ default:
+ break;
+ }
+
+ return ret;
+}
+
+QHash<int, QByteArray> NativeAppModel::roleNames() const {
+ QHash<int, QByteArray> roles;
+ roles[IconRole] = "icon";
+ roles[NameRole] = "name";
+ roles[IdRole] = "id";
+ roles[VersionRole] = "version";
+ roles[DescriptionRole] = "description";
+ roles[ShortNameRole] = "shortname";
+ roles[AuthorRole] = "author";
+ return roles;
+}
+
+QString NativeAppModel::id(int i) const {
+ return data(index(i), IdRole).toString();
+}
+
+QString NativeAppModel::name(int i) const {
+ return data(index(i), NameRole).toString();
+}
+
+void NativeAppModel::appChanged(const QString& info) {
+ this->refresh();
+}
+
+int NativeAppModel::launch(const QString& application) {
+ int result = -1;
+ HMI_DEBUG("launch", "ApplicationLauncher launch %s.",
+ application.toStdString().c_str());
+
+ result = afm_user_daemon_proxy->start(application).value().toInt();
+ HMI_DEBUG("launch", "ApplicationLauncher pid: %d.", result);
+
+ return result;
+}
+
+void NativeAppModel::uninstall(int index) {
+ const QString& id = this->d->data[index].id();
+ QString result = afm_user_daemon_proxy->uninstall(id);
+ if (result == "null") {
+ beginRemoveRows(QModelIndex(), index, index);
+ this->d->data.removeAt(index);
+ endRemoveRows();
+ }
+}
+
+void NativeAppModel::refresh() {
+ beginResetModel();
+ this->d->data.clear();
+ this->d->getApps();
+ endResetModel();
+ emit applistChanged(this->d->data);
+}
diff --git a/app/src/nativeappmodel.h b/app/src/nativeappmodel.h
new file mode 100644
index 0000000..f49121a
--- /dev/null
+++ b/app/src/nativeappmodel.h
@@ -0,0 +1,63 @@
+/*
+ * Copyright (C) 2016 The Qt Company Ltd.
+ * Copyright (c) 2018 TOYOTA MOTOR CORPORATION
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef NATIVEAPPMODE_H
+#define NATIVEAPPMODE_H
+
+#include <QtCore/QAbstractListModel>
+#include "appinfo.h"
+
+class NativeAppModel : public QAbstractListModel {
+ Q_OBJECT
+
+ public:
+ enum ModelRole {
+ IconRole = Qt::DisplayRole,
+ NameRole = Qt::DecorationRole,
+ IdRole = Qt::UserRole,
+ VersionRole,
+ DescriptionRole,
+ ShortNameRole,
+ AuthorRole
+ };
+ Q_ENUM(ModelRole)
+
+ explicit NativeAppModel(QObject* parent = nullptr);
+ ~NativeAppModel();
+
+ int rowCount(const QModelIndex& parent = QModelIndex()) const override;
+
+ QVariant data(const QModelIndex& index,
+ int role = Qt::DisplayRole) const override;
+ QHash<int, QByteArray> roleNames() const override;
+ Q_INVOKABLE QString id(int index) const;
+ Q_INVOKABLE QString name(int index) const;
+ Q_INVOKABLE int launch(const QString& application);
+ Q_INVOKABLE void uninstall(int index);
+ Q_INVOKABLE void refresh();
+
+ void appChanged(const QString& info);
+
+ signals:
+ void applistChanged(const QList<AppInfo>& applist);
+
+ private:
+ class Private;
+ Private* d;
+};
+
+#endif // NATIVEAPPMODE_H
diff --git a/app/src/serverappmodel.cpp b/app/src/serverappmodel.cpp
new file mode 100644
index 0000000..ad79159
--- /dev/null
+++ b/app/src/serverappmodel.cpp
@@ -0,0 +1,286 @@
+/*
+ * Copyright (C) 2016 The Qt Company Ltd.
+ * Copyright (C) 2016, 2017 Mentor Graphics Development (Deutschland) GmbH
+ * Copyright (c) 2018 TOYOTA MOTOR CORPORATION
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "serverappmodel.h"
+#include <QtCore/QJsonArray>
+#include <QtCore/QJsonDocument>
+#include "afm_user_daemon_proxy.h"
+#include "httpclient.h"
+
+#include "hmi-debug.h"
+
+extern org::AGL::afm::user* afm_user_daemon_proxy;
+
+ServerAppModel::ServerAppModel(QObject* parent) : QAbstractListModel(parent) {
+ // this->getAppPage(0, PAGE_SIZE);
+ connect(afm_user_daemon_proxy, &org::AGL::afm::user::changed, this,
+ &ServerAppModel::appChanged);
+}
+
+ServerAppModel::~ServerAppModel() {}
+
+int ServerAppModel::rowCount(const QModelIndex& parent) const {
+ if (parent.isValid())
+ return 0;
+
+ return this->applist.count();
+}
+
+QVariant ServerAppModel::data(const QModelIndex& index, int role) const {
+ QVariant ret;
+ if (!index.isValid())
+ return ret;
+
+ switch (role) {
+ case IconRole:
+ ret = this->applist[index.row()].iconPath();
+ break;
+ case NameRole:
+ ret = this->applist[index.row()].name();
+ break;
+ case IdRole:
+ ret = this->applist[index.row()].id();
+ break;
+ case VersionRole:
+ ret = this->applist[index.row()].version();
+ break;
+ case DescriptionRole:
+ ret = this->applist[index.row()].description();
+ break;
+ case AuthorRole:
+ ret = this->applist[index.row()].author();
+ break;
+ case ServerIdRole:
+ ret = this->applist[index.row()].serverId();
+ break;
+ case CategoryNameRole:
+ ret = this->applist[index.row()].categoryName();
+ break;
+ case CreatedTimeRole:
+ ret = this->applist[index.row()].createdTime();
+ break;
+ case StateRole:
+ ret = this->applist[index.row()].state();
+ break;
+ case StateTextRole:
+ switch (this->applist[index.row()].state()) {
+ case AppInfo::Install:
+ ret = "Install";
+ break;
+ case AppInfo::Update:
+ ret = "Update";
+ break;
+ case AppInfo::Launch:
+ ret = "Launch";
+ break;
+ case AppInfo::Downloading:
+ ret = "Downloading";
+ break;
+ case AppInfo::Installing:
+ ret = "Installing";
+ break;
+ default:
+ break;
+ }
+ break;
+ case ProgressRole:
+ ret = this->applist[index.row()].progress();
+ break;
+ default:
+ break;
+ }
+
+ return ret;
+}
+
+QHash<int, QByteArray> ServerAppModel::roleNames() const {
+ QHash<int, QByteArray> roles;
+ roles[IconRole] = "icon";
+ roles[NameRole] = "name";
+ roles[IdRole] = "id";
+ roles[VersionRole] = "version";
+ roles[DescriptionRole] = "description";
+ roles[AuthorRole] = "author";
+ roles[ServerIdRole] = "appid";
+ roles[CategoryNameRole] = "category";
+ roles[CreatedTimeRole] = "createdtime";
+ roles[StateRole] = "state";
+ roles[StateTextRole] = "statetext";
+ roles[ProgressRole] = "progress";
+ return roles;
+}
+
+QString ServerAppModel::id(int i) const {
+ return data(index(i), IdRole).toString();
+}
+
+QString ServerAppModel::name(int i) const {
+ return data(index(i), NameRole).toString();
+}
+
+QString ServerAppModel::stateText(int i) const {
+ return data(index(i), StateTextRole).toString();
+}
+
+int ServerAppModel::launch(const QString& application) {
+ int result = -1;
+ HMI_DEBUG("launch", "ApplicationLauncher launch %s.",
+ application.toStdString().c_str());
+
+ result = afm_user_daemon_proxy->start(application).value().toInt();
+ HMI_DEBUG("launch", "ApplicationLauncher pid: %d.", result);
+
+ return result;
+}
+
+void ServerAppModel::appChanged(const QString& info) {
+ QJsonDocument japps = QJsonDocument::fromJson(info.toUtf8());
+ QJsonObject const& jso = japps.object();
+ QString operation = jso["operation"].toString();
+ QString id = jso["data"].toString();
+ if (operation == "uninstall") {
+ for (int i = 0; i < applist.size(); ++i) {
+ if (applist.at(i).id() == id) {
+ beginResetModel();
+ applist[i].setState(AppInfo::Install);
+ endResetModel();
+ break;
+ }
+ }
+ }
+}
+
+void ServerAppModel::install(int index) {
+ AppInfo& appinfo = applist[index];
+
+ beginResetModel();
+ appinfo.setState(AppInfo::Downloading);
+ endResetModel();
+
+ QString url =
+ getWgtUrl(appinfo.wgtPath());
+ HttpClient client(url);
+
+ client.download(
+ getDownloadFilePath(appinfo.fileName()),
+ [this, &appinfo](const QString& result) {
+ this->beginResetModel();
+ appinfo.setState(AppInfo::Installing);
+ this->endResetModel();
+
+ QTimer::singleShot(3000, this, [this, &appinfo] {
+ QString installResult = afm_user_daemon_proxy->install(
+ getDownloadFilePath(appinfo.fileName()));
+
+ this->beginResetModel();
+ appinfo.setState(installResult.isEmpty() ? AppInfo::Install
+ : AppInfo::Launch);
+ appinfo.setProgress(0.0);
+ this->endResetModel();
+ });
+ },
+ [this, &appinfo](const QString& error) {
+ HMI_ERROR("ERROR", "%s", error.toStdString().c_str());
+ this->beginResetModel();
+ appinfo.setState(AppInfo::Install);
+ appinfo.setProgress(0.0);
+ this->beginResetModel();
+ },
+ [this, &appinfo](const qint64 bytesReceived, const qint64 bytesTotal) {
+ qreal progressValue = ((qreal)bytesReceived / bytesTotal) * 100;
+ this->beginResetModel();
+ appinfo.setProgress(progressValue);
+ this->endResetModel();
+ });
+}
+
+void ServerAppModel::getPrevPage(int pageIndex) {
+ this->getAppPage(pageIndex, PAGE_SIZE, true);
+}
+
+void ServerAppModel::getNextPage(int pageIndex) {
+ this->getAppPage(pageIndex, PAGE_SIZE);
+}
+
+void ServerAppModel::setNativeApplist(const QList<AppInfo>& applist) {
+ nativeApplist.clear();
+ nativeApplist = applist;
+ checkAppState();
+}
+
+void ServerAppModel::checkAppState() {
+ if (applist.isEmpty() || nativeApplist.isEmpty()) {
+ return;
+ }
+
+ beginResetModel();
+
+ QList<AppInfo>::iterator it;
+ for (it = applist.begin(); it != applist.end(); ++it) {
+ QList<AppInfo>::iterator nit;
+ for (nit = nativeApplist.begin(); nit != nativeApplist.end(); ++nit) {
+ if ((*it).id() == (*nit).id()) {
+ (*it).setState((*it).version() != (*nit).version() ? AppInfo::Update
+ : AppInfo::Launch);
+ break;
+ }
+ }
+ }
+
+ endResetModel();
+}
+
+void ServerAppModel::getAppPage(int pageIndex, int pageSize, bool isPrev) {
+ // QString url = getUrlWithPage(SERVER_API_LIST, pageIndex, pageSize)
+ // .append(QString("&appDeviceTypeId=%1&appDeveloper=%2")
+ // .arg(QString::number(0), "zhang_xu"));
+ QString url =
+ getUrlWithPage(SERVER_API_LIST, pageIndex, pageSize)
+ .append(QString("&appDeviceTypeId=%1").arg(QString::number(0)));
+ HttpClient client(url);
+
+ client.get(
+ [=](const QString& result) {
+ QJsonDocument jresult = QJsonDocument::fromJson(result.toUtf8());
+ QJsonObject const& jro = jresult.object();
+ QJsonArray const& jappList = jro["pagination_data"].toArray();
+
+ QList<AppInfo> newList;
+ for (auto const& app : jappList) {
+ QJsonObject const& jso = app.toObject();
+
+ AppInfo appinfo;
+ appinfo.readFromServer(jso);
+ newList.append(appinfo);
+ }
+
+ beginResetModel();
+ if (isPrev || jappList.size() >= PAGE_SIZE) {
+ applist.clear();
+ }
+ applist += newList;
+ endResetModel();
+
+ checkAppState();
+
+ emit requestCompleted(jappList.size(), PAGE_SIZE);
+ },
+ [=](const QString& msg) {
+ HMI_ERROR("response", "response error: %s", msg.toStdString().c_str());
+ });
+}
diff --git a/app/src/serverappmodel.h b/app/src/serverappmodel.h
new file mode 100644
index 0000000..ea3608f
--- /dev/null
+++ b/app/src/serverappmodel.h
@@ -0,0 +1,78 @@
+/*
+ * Copyright (C) 2016 The Qt Company Ltd.
+ * Copyright (c) 2018 TOYOTA MOTOR CORPORATION
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef SERVERAPPMODEL_H
+#define SERVERAPPMODEL_H
+
+#include <QtCore/QAbstractListModel>
+#include "appinfo.h"
+#include "config.h"
+
+class ServerAppModel : public QAbstractListModel {
+ Q_OBJECT
+
+ public:
+ enum ModelRole {
+ IconRole = Qt::DisplayRole,
+ NameRole = Qt::DecorationRole,
+ IdRole = Qt::UserRole,
+ VersionRole,
+ DescriptionRole,
+ AuthorRole,
+ ServerIdRole,
+ CategoryNameRole,
+ CreatedTimeRole,
+ StateRole,
+ StateTextRole,
+ ProgressRole
+ };
+ Q_ENUM(ModelRole)
+
+ explicit ServerAppModel(QObject* parent = nullptr);
+ ~ServerAppModel();
+
+ int rowCount(const QModelIndex& parent = QModelIndex()) const override;
+
+ QVariant data(const QModelIndex& index,
+ int role = Qt::DisplayRole) const override;
+ QHash<int, QByteArray> roleNames() const override;
+ Q_INVOKABLE QString id(int index) const;
+ Q_INVOKABLE QString name(int index) const;
+ Q_INVOKABLE QString stateText(int index) const;
+ Q_INVOKABLE void install(int index);
+ Q_INVOKABLE int launch(const QString& application);
+
+ Q_INVOKABLE void getPrevPage(int pageIndex);
+ Q_INVOKABLE void getNextPage(int pageIndex);
+
+ Q_INVOKABLE void setNativeApplist(const QList<AppInfo>& applist);
+
+ void getAppPage(int pageIndex, int pageSize, bool isPrev = false);
+
+ void appChanged(const QString& info);
+
+ signals:
+ void requestCompleted(int appsize, int pagesize);
+
+ private:
+ void checkAppState();
+
+ QList<AppInfo> applist;
+ QList<AppInfo> nativeApplist;
+};
+
+#endif // SERVERAPPMODEL_H
diff --git a/app/src/src.pri b/app/src/src.pri
new file mode 100644
index 0000000..455ded3
--- /dev/null
+++ b/app/src/src.pri
@@ -0,0 +1,17 @@
+
+INCLUDEPATH += $$PWD
+
+HEADERS += \
+ $$PWD/nativeappmodel.h \
+ $$PWD/serverappmodel.h \
+ $$PWD/appinfo.h \
+ $$PWD/hmi-debug.h \
+ $$PWD/httpclient.h \
+ $$PWD/config.h
+
+SOURCES += \
+ $$PWD/main.cpp \
+ $$PWD/nativeappmodel.cpp \
+ $$PWD/serverappmodel.cpp \
+ $$PWD/appinfo.cpp \
+ $$PWD/httpclient.cpp