From ad4c1aba8f6d801f417e565ab1e91ad87024fd86 Mon Sep 17 00:00:00 2001 From: hukang hwx963878 Date: Tue, 8 Dec 2020 10:35:03 +0800 Subject: [PATCH] scene detection demo init --- .../official/lite/scene_detection/.gitignore | 83 ++ .../lite/scene_detection/app/.gitignore | 1 + .../lite/scene_detection/app/CMakeLists.txt | 82 ++ .../lite/scene_detection/app/build.gradle | 75 ++ .../lite/scene_detection/app/download.gradle | 82 ++ .../scene_detection/app/proguard-rules.pro | 21 + .../app/src/main/AndroidManifest.xml | 32 + .../app/src/main/cpp/MSNetWork.cpp | 63 ++ .../app/src/main/cpp/MSNetWork.h | 58 ++ .../app/src/main/cpp/MindSporeNetnative.cpp | 472 ++++++++++ .../app/src/main/cpp/MindSporeNetnative.h | 21 + .../gallery/classify/CompareSizesByArea.java | 34 + .../classify/RecognitionObjectBean.java | 45 + .../gallery/classify/TrackingMobile.java | 126 +++ .../scene/widget/AutoFitTextureView.java | 73 ++ .../scene/widget/CameraActivity.java | 184 ++++ .../scene/widget/CameraFragment.java | 823 ++++++++++++++++++ .../mindspore/scene/widget/HorTextView.java | 62 ++ .../drawable-v24/ic_launcher_foreground.xml | 30 + .../res/drawable/ic_launcher_background.xml | 170 ++++ .../app/src/main/res/drawable/rectangle.xml | 13 + .../src/main/res/drawable/switch_thumb.xml | 8 + .../src/main/res/drawable/switch_track.xml | 8 + .../src/main/res/layout/activity_camera.xml | 43 + .../app/src/main/res/layout/activity_test.xml | 12 + .../src/main/res/layout/fragment_camera.xml | 13 + .../main/res/layout/layout_hor_text_view.xml | 40 + .../res/mipmap-anydpi-v26/ic_launcher.xml | 5 + .../mipmap-anydpi-v26/ic_launcher_round.xml | 5 + .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 2527 bytes .../mipmap-hdpi/ic_launcher_foreground.png | Bin 0 -> 4378 bytes .../res/mipmap-hdpi/ic_launcher_round.png | Bin 0 -> 4637 bytes .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 1520 bytes .../mipmap-mdpi/ic_launcher_foreground.png | Bin 0 -> 2676 bytes .../res/mipmap-mdpi/ic_launcher_round.png | Bin 0 -> 2766 bytes .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 3680 bytes .../mipmap-xhdpi/ic_launcher_foreground.png | Bin 0 -> 6146 bytes .../res/mipmap-xhdpi/ic_launcher_round.png | Bin 0 -> 6850 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 6071 bytes .../mipmap-xxhdpi/ic_launcher_foreground.png | Bin 0 -> 10191 bytes .../res/mipmap-xxhdpi/ic_launcher_round.png | Bin 0 -> 10977 bytes .../app/src/main/res/mipmap-xxhdpi/logo.png | Bin 0 -> 9405 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 8641 bytes .../mipmap-xxxhdpi/ic_launcher_foreground.png | Bin 0 -> 14983 bytes .../res/mipmap-xxxhdpi/ic_launcher_round.png | Bin 0 -> 15849 bytes .../app/src/main/res/values/colors.xml | 18 + .../app/src/main/res/values/dimens.xml | 9 + .../res/values/ic_launcher_background.xml | 4 + .../app/src/main/res/values/strings.xml | 30 + .../app/src/main/res/values/styles.xml | 10 + .../lite/scene_detection/build.gradle | 24 + .../lite/scene_detection/gradle.properties | 20 + .../gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 54329 bytes .../gradle/wrapper/gradle-wrapper.properties | 6 + .../official/lite/scene_detection/gradlew | 172 ++++ .../official/lite/scene_detection/gradlew.bat | 84 ++ .../lite/scene_detection/settings.gradle | 2 + 57 files changed, 3063 insertions(+) create mode 100644 model_zoo/official/lite/scene_detection/.gitignore create mode 100644 model_zoo/official/lite/scene_detection/app/.gitignore create mode 100644 model_zoo/official/lite/scene_detection/app/CMakeLists.txt create mode 100644 model_zoo/official/lite/scene_detection/app/build.gradle create mode 100644 model_zoo/official/lite/scene_detection/app/download.gradle create mode 100644 model_zoo/official/lite/scene_detection/app/proguard-rules.pro create mode 100644 model_zoo/official/lite/scene_detection/app/src/main/AndroidManifest.xml create mode 100644 model_zoo/official/lite/scene_detection/app/src/main/cpp/MSNetWork.cpp create mode 100644 model_zoo/official/lite/scene_detection/app/src/main/cpp/MSNetWork.h create mode 100644 model_zoo/official/lite/scene_detection/app/src/main/cpp/MindSporeNetnative.cpp create mode 100644 model_zoo/official/lite/scene_detection/app/src/main/cpp/MindSporeNetnative.h create mode 100644 model_zoo/official/lite/scene_detection/app/src/main/java/com/mindspore/scene/gallery/classify/CompareSizesByArea.java create mode 100644 model_zoo/official/lite/scene_detection/app/src/main/java/com/mindspore/scene/gallery/classify/RecognitionObjectBean.java create mode 100644 model_zoo/official/lite/scene_detection/app/src/main/java/com/mindspore/scene/gallery/classify/TrackingMobile.java create mode 100644 model_zoo/official/lite/scene_detection/app/src/main/java/com/mindspore/scene/widget/AutoFitTextureView.java create mode 100644 model_zoo/official/lite/scene_detection/app/src/main/java/com/mindspore/scene/widget/CameraActivity.java create mode 100644 model_zoo/official/lite/scene_detection/app/src/main/java/com/mindspore/scene/widget/CameraFragment.java create mode 100644 model_zoo/official/lite/scene_detection/app/src/main/java/com/mindspore/scene/widget/HorTextView.java create mode 100644 model_zoo/official/lite/scene_detection/app/src/main/res/drawable-v24/ic_launcher_foreground.xml create mode 100644 model_zoo/official/lite/scene_detection/app/src/main/res/drawable/ic_launcher_background.xml create mode 100644 model_zoo/official/lite/scene_detection/app/src/main/res/drawable/rectangle.xml create mode 100644 model_zoo/official/lite/scene_detection/app/src/main/res/drawable/switch_thumb.xml create mode 100644 model_zoo/official/lite/scene_detection/app/src/main/res/drawable/switch_track.xml create mode 100644 model_zoo/official/lite/scene_detection/app/src/main/res/layout/activity_camera.xml create mode 100644 model_zoo/official/lite/scene_detection/app/src/main/res/layout/activity_test.xml create mode 100644 model_zoo/official/lite/scene_detection/app/src/main/res/layout/fragment_camera.xml create mode 100644 model_zoo/official/lite/scene_detection/app/src/main/res/layout/layout_hor_text_view.xml create mode 100644 model_zoo/official/lite/scene_detection/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml create mode 100644 model_zoo/official/lite/scene_detection/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml create mode 100644 model_zoo/official/lite/scene_detection/app/src/main/res/mipmap-hdpi/ic_launcher.png create mode 100644 model_zoo/official/lite/scene_detection/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png create mode 100644 model_zoo/official/lite/scene_detection/app/src/main/res/mipmap-hdpi/ic_launcher_round.png create mode 100644 model_zoo/official/lite/scene_detection/app/src/main/res/mipmap-mdpi/ic_launcher.png create mode 100644 model_zoo/official/lite/scene_detection/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png create mode 100644 model_zoo/official/lite/scene_detection/app/src/main/res/mipmap-mdpi/ic_launcher_round.png create mode 100644 model_zoo/official/lite/scene_detection/app/src/main/res/mipmap-xhdpi/ic_launcher.png create mode 100644 model_zoo/official/lite/scene_detection/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png create mode 100644 model_zoo/official/lite/scene_detection/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png create mode 100644 model_zoo/official/lite/scene_detection/app/src/main/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 model_zoo/official/lite/scene_detection/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png create mode 100644 model_zoo/official/lite/scene_detection/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png create mode 100644 model_zoo/official/lite/scene_detection/app/src/main/res/mipmap-xxhdpi/logo.png create mode 100644 model_zoo/official/lite/scene_detection/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 model_zoo/official/lite/scene_detection/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png create mode 100644 model_zoo/official/lite/scene_detection/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png create mode 100644 model_zoo/official/lite/scene_detection/app/src/main/res/values/colors.xml create mode 100644 model_zoo/official/lite/scene_detection/app/src/main/res/values/dimens.xml create mode 100644 model_zoo/official/lite/scene_detection/app/src/main/res/values/ic_launcher_background.xml create mode 100644 model_zoo/official/lite/scene_detection/app/src/main/res/values/strings.xml create mode 100644 model_zoo/official/lite/scene_detection/app/src/main/res/values/styles.xml create mode 100644 model_zoo/official/lite/scene_detection/build.gradle create mode 100644 model_zoo/official/lite/scene_detection/gradle.properties create mode 100644 model_zoo/official/lite/scene_detection/gradle/wrapper/gradle-wrapper.jar create mode 100644 model_zoo/official/lite/scene_detection/gradle/wrapper/gradle-wrapper.properties create mode 100644 model_zoo/official/lite/scene_detection/gradlew create mode 100644 model_zoo/official/lite/scene_detection/gradlew.bat create mode 100644 model_zoo/official/lite/scene_detection/settings.gradle diff --git a/model_zoo/official/lite/scene_detection/.gitignore b/model_zoo/official/lite/scene_detection/.gitignore new file mode 100644 index 0000000000..836b944df6 --- /dev/null +++ b/model_zoo/official/lite/scene_detection/.gitignore @@ -0,0 +1,83 @@ +# MindSpore +build/ +mindspore/lib +app/src/main/assets/model/ +app/src/main/cpp/mindspore-lite-* +output +*.ir +mindspore/ccsrc/schema/inner/* + +# Cmake files +CMakeFiles/ +cmake_install.cmake +CMakeCache.txt +Makefile +cmake-build-debug + +# Dynamic libraries +*.so +*.so.* +*.dylib + +# Static libraries +*.la +*.lai +*.a +*.lib + +# Protocol buffers +*_pb2.py +*.pb.h +*.pb.cc + +# Object files +*.o + +# Editor +.vscode +.idea/ + +# Cquery +.cquery_cached_index/ +compile_commands.json + +# Ctags and cscope +tags +TAGS +CTAGS +GTAGS +GRTAGS +GSYMS +GPATH +cscope.* + +# Python files +*__pycache__* +.pytest_cache + +# Mac files +*.DS_Store + +# Test results +test_temp_summary_event_file/ +*.dot +*.dat +*.svg +*.perf +*.info +*.ckpt +*.shp +*.pkl +.clangd +mindspore/version.py +mindspore/default_config.py +mindspore/.commit_id +onnx.proto +mindspore/ccsrc/onnx.proto + +# Android +local.properties +.gradle +sdk/build +sdk/.cxx +app/.cxx diff --git a/model_zoo/official/lite/scene_detection/app/.gitignore b/model_zoo/official/lite/scene_detection/app/.gitignore new file mode 100644 index 0000000000..796b96d1c4 --- /dev/null +++ b/model_zoo/official/lite/scene_detection/app/.gitignore @@ -0,0 +1 @@ +/build diff --git a/model_zoo/official/lite/scene_detection/app/CMakeLists.txt b/model_zoo/official/lite/scene_detection/app/CMakeLists.txt new file mode 100644 index 0000000000..c15b2a65ff --- /dev/null +++ b/model_zoo/official/lite/scene_detection/app/CMakeLists.txt @@ -0,0 +1,82 @@ +# For more information about using CMake with Android Studio, read the +# documentation: https://d.android.com/studio/projects/add-native-code.html + +# Sets the minimum version of CMake required to build the native library. + +cmake_minimum_required(VERSION 3.4.1) + +set(CMAKE_VERBOSE_MAKEFILE on) +set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR}/libs/${ANDROID_ABI}) + +set(MINDSPORELITE_VERSION mindspore-lite-1.0.1-runtime-arm64-cpu) + +# ============== Set MindSpore Dependencies. ============= +include_directories(${CMAKE_SOURCE_DIR}/src/main/cpp) +include_directories(${CMAKE_SOURCE_DIR}/src/main/cpp/${MINDSPORELITE_VERSION}/third_party/flatbuffers/include) +include_directories(${CMAKE_SOURCE_DIR}/src/main/cpp/${MINDSPORELITE_VERSION}) +include_directories(${CMAKE_SOURCE_DIR}/src/main/cpp/${MINDSPORELITE_VERSION}/include) +include_directories(${CMAKE_SOURCE_DIR}/src/main/cpp/${MINDSPORELITE_VERSION}/include/ir/dtype) +include_directories(${CMAKE_SOURCE_DIR}/src/main/cpp/${MINDSPORELITE_VERSION}/include/schema) +include_directories(${CMAKE_SOURCE_DIR}/src/main/cpp/${MINDSPORELITE_VERSION}/minddata/include) + +add_library(mindspore-lite SHARED IMPORTED) +add_library(minddata-lite SHARED IMPORTED) + +set_target_properties(mindspore-lite PROPERTIES IMPORTED_LOCATION + ${CMAKE_SOURCE_DIR}/src/main/cpp/${MINDSPORELITE_VERSION}/lib/libmindspore-lite.so) +set_target_properties(minddata-lite PROPERTIES IMPORTED_LOCATION + ${CMAKE_SOURCE_DIR}/src/main/cpp/${MINDSPORELITE_VERSION}/minddata/lib/libminddata-lite.so) +# --------------- MindSpore Lite set End. -------------------- + + +# Creates and names a library, sets it as either STATIC +# or SHARED, and provides the relative paths to its source code. +# You can define multiple libraries, and CMake builds them for you. +# Gradle automatically packages shared libraries with your APK. + +file(GLOB_RECURSE cpp_src "src/main/cpp/*.cpp" "src/main/cpp/*.h") + +add_library( # Sets the name of the library. + mlkit-label-MS + + # Sets the library as a shared library. + SHARED + + # Provides a relative path to your source file(s). + ${cpp_src}) + + +# Searches for a specified prebuilt library and stores the path as a +# variable. Because CMake includes system libraries in the search path by +# default, you only need to specify the name of the public NDK library +# you want to add. CMake verifies that the library exists before +# completing its build. + +find_library( # Sets the name of the path variable. + log-lib + + # Specifies the name of the NDK library that + # you want CMake to locate. + log) + + +find_library(jnigraphics-lib jnig·raphics) + +# Specifies libraries CMake should link to your target library. You +# can link multiple libraries, such as libraries you define in this +# build script, prebuilt third-party libraries, or system libraries. +add_definitions(-DMNN_USE_LOGCAT) +target_link_libraries( # Specifies the target library. + mlkit-label-MS + + # --- mindspore --- + minddata-lite + mindspore-lite + + # --- other dependencies.--- + -ljnigraphics + android + + # Links the target library to the log library + ${log-lib} + ) \ No newline at end of file diff --git a/model_zoo/official/lite/scene_detection/app/build.gradle b/model_zoo/official/lite/scene_detection/app/build.gradle new file mode 100644 index 0000000000..8d23aa9740 --- /dev/null +++ b/model_zoo/official/lite/scene_detection/app/build.gradle @@ -0,0 +1,75 @@ +apply plugin: 'com.android.application' + +android { + compileSdkVersion 30 + buildToolsVersion "30.0.1" + + defaultConfig { + applicationId "com.mindspore.scene" + minSdkVersion 21 + targetSdkVersion 30 + versionCode 1 + versionName "1.0.0" + + testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" + externalNativeBuild { + cmake { + arguments "-DANDROID_STL=c++_shared" + cppFlags "" + } + } + ndk { + abiFilters 'arm64-v8a' + } + } + aaptOptions { + noCompress '.so', 'ms' + } + + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' + } + + customDebugType { + debuggable true + } + } + externalNativeBuild { + cmake { + path file('CMakeLists.txt') + } + } + ndkVersion '21.3.6528147' + + sourceSets { + main { + jniLibs.srcDirs = ['libs'] + } + } + packagingOptions { + pickFirst 'lib/arm64-v8a/libmlkit-label-MS.so' + } + +} + + +// Before gradle build. +// To download some necessary libraries. +apply from: 'download.gradle' + + +dependencies { + implementation fileTree(dir: "libs", include: ["*.jar"]) + implementation 'androidx.appcompat:appcompat:1.1.0' + implementation 'androidx.constraintlayout:constraintlayout:1.1.3' + + testImplementation 'junit:junit:4.12' + androidTestImplementation 'androidx.test.ext:junit:1.1.1' + androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0' + + implementation 'com.google.android.material:material:1.0.0' + androidTestImplementation 'com.android.support.test:rules:1.0.2' + androidTestImplementation 'com.google.truth:truth:1.0.1' +} diff --git a/model_zoo/official/lite/scene_detection/app/download.gradle b/model_zoo/official/lite/scene_detection/app/download.gradle new file mode 100644 index 0000000000..423ab8d6fc --- /dev/null +++ b/model_zoo/official/lite/scene_detection/app/download.gradle @@ -0,0 +1,82 @@ +/** + * To download necessary library from HuaWei server. + * Including mindspore-lite .so file, minddata-lite .so file and model file. + * The libraries can be downloaded manually. + */ +def targetMindSporeInclude = "src/main/cpp/" +def mindsporeLite_Version = "mindspore-lite-1.0.1-runtime-arm64-cpu" + +def targetModelFile = "src/main/assets/model/mobilenetv2.ms" +def mindSporeLibrary_arm64 = "src/main/cpp/${mindsporeLite_Version}.tar.gz" + +def modelDownloadUrl = "https://download.mindspore.cn/model_zoo/official/lite/mobilenetv2_openimage_lite/mobilenetv2.ms" +def mindsporeLiteDownloadUrl = "https://ms-release.obs.cn-north-4.myhuaweicloud.com/1.0.1/lite/android_aarch64/${mindsporeLite_Version}.tar.gz" + +def cleantargetMindSporeInclude = "src/main/cpp" + +task cleanCmakeCache(type: Delete) { + delete '.cxx/cmake/debug' + delete '.cxx/cmake/release' +} + +task downloadModelFile(type: DownloadUrlTask) { + doFirst { + println "Downloading ${modelDownloadUrl}" + } + sourceUrl = "${modelDownloadUrl}" + target = file("${targetModelFile}") +} + +task downloadMindSporeLibrary(type: DownloadUrlTask) { + doFirst { + println "Downloading ${mindsporeLiteDownloadUrl}" + } + sourceUrl = "${mindsporeLiteDownloadUrl}" + target = file("${mindSporeLibrary_arm64}") +} + +task unzipMindSporeInclude(type: Copy, dependsOn: 'downloadMindSporeLibrary') { + doFirst { + println "Unzipping ${mindSporeLibrary_arm64}" + } + from tarTree(resources.gzip("${mindSporeLibrary_arm64}")) + into "${targetMindSporeInclude}" +} + +task cleanUnusedmindsporeFiles(type: Delete, dependsOn: ['unzipMindSporeInclude']) { + delete fileTree("${cleantargetMindSporeInclude}").matching { + include "*.tar.gz" + } +} +/* + * Using preBuild to download mindspore library and model file. + * Run before gradle build. + */ +if (file("src/main/cpp/${mindsporeLite_Version}/lib/libmindspore-lite.so").exists()) { + downloadMindSporeLibrary.enabled = false + unzipMindSporeInclude.enabled = false + cleanUnusedmindsporeFiles.enabled = false +} + +if (file("src/main/assets/model/mobilenetv2.ms").exists()) { + downloadModelFile.enabled = false +} + +preBuild.dependsOn cleanCmakeCache +preBuild.dependsOn downloadModelFile +preBuild.dependsOn downloadMindSporeLibrary +preBuild.dependsOn unzipMindSporeInclude +preBuild.dependsOn cleanUnusedmindsporeFiles + +class DownloadUrlTask extends DefaultTask { + @Input + String sourceUrl + + @OutputFile + File target + + @TaskAction + void download() { + ant.get(src: sourceUrl, dest: target) + } +} diff --git a/model_zoo/official/lite/scene_detection/app/proguard-rules.pro b/model_zoo/official/lite/scene_detection/app/proguard-rules.pro new file mode 100644 index 0000000000..481bb43481 --- /dev/null +++ b/model_zoo/official/lite/scene_detection/app/proguard-rules.pro @@ -0,0 +1,21 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile \ No newline at end of file diff --git a/model_zoo/official/lite/scene_detection/app/src/main/AndroidManifest.xml b/model_zoo/official/lite/scene_detection/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000000..9b2c97b26a --- /dev/null +++ b/model_zoo/official/lite/scene_detection/app/src/main/AndroidManifest.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/model_zoo/official/lite/scene_detection/app/src/main/cpp/MSNetWork.cpp b/model_zoo/official/lite/scene_detection/app/src/main/cpp/MSNetWork.cpp new file mode 100644 index 0000000000..ad02a1c59a --- /dev/null +++ b/model_zoo/official/lite/scene_detection/app/src/main/cpp/MSNetWork.cpp @@ -0,0 +1,63 @@ +/** + * Copyright 2020 Huawei Technologies Co., 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 "MSNetWork.h" +#include +#include +#include +#include "include/errorcode.h" + +#define MS_PRINT(format, ...) __android_log_print(ANDROID_LOG_INFO, "MSJNI", format, ##__VA_ARGS__) + +MSNetWork::MSNetWork(void) : session_(nullptr), model_(nullptr) {} + +MSNetWork::~MSNetWork(void) {} + +void +MSNetWork::CreateSessionMS(char *modelBuffer, size_t bufferLen, mindspore::lite::Context *ctx) { + session_ = mindspore::session::LiteSession::CreateSession(ctx); + if (session_ == nullptr) { + MS_PRINT("Create Session failed."); + return; + } + + // Compile model. + model_ = mindspore::lite::Model::Import(modelBuffer, bufferLen); + if (model_ == nullptr) { + ReleaseNets(); + MS_PRINT("Import model failed."); + return; + } + + int ret = session_->CompileGraph(model_); + if (ret != mindspore::lite::RET_OK) { + ReleaseNets(); + MS_PRINT("CompileGraph failed."); + return; + } +} + +void MSNetWork::ReleaseNets(void) { + if (model_ != nullptr) { + model_->Free(); + delete model_; + model_ = nullptr; + } + if (session_ != nullptr) { + delete session_; + session_ = nullptr; + } +} diff --git a/model_zoo/official/lite/scene_detection/app/src/main/cpp/MSNetWork.h b/model_zoo/official/lite/scene_detection/app/src/main/cpp/MSNetWork.h new file mode 100644 index 0000000000..ee164459be --- /dev/null +++ b/model_zoo/official/lite/scene_detection/app/src/main/cpp/MSNetWork.h @@ -0,0 +1,58 @@ +/** + * Copyright 2020 Huawei Technologies Co., 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. + */ + +#ifndef MSNETWORK_H +#define MSNETWORK_H + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +struct ImgDims { + int channel = 0; + int width = 0; + int height = 0; +}; + +class MSNetWork { + public: + MSNetWork(); + + ~MSNetWork(); + + void CreateSessionMS(char *modelBuffer, size_t bufferLen, mindspore::lite::Context *ctx); + + void ReleaseNets(void); + + mindspore::session::LiteSession *session() const { return session_; } + + private: + mindspore::session::LiteSession *session_; + mindspore::lite::Model *model_; +}; + +#endif diff --git a/model_zoo/official/lite/scene_detection/app/src/main/cpp/MindSporeNetnative.cpp b/model_zoo/official/lite/scene_detection/app/src/main/cpp/MindSporeNetnative.cpp new file mode 100644 index 0000000000..463d171a83 --- /dev/null +++ b/model_zoo/official/lite/scene_detection/app/src/main/cpp/MindSporeNetnative.cpp @@ -0,0 +1,472 @@ +/** + * Copyright 2020 Huawei Technologies Co., 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 +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "include/errorcode.h" +#include "include/ms_tensor.h" +#include "MindSporeNetnative.h" +#include "MSNetWork.h" +#include "lite_cv/lite_mat.h" +#include "lite_cv/image_process.h" + +using mindspore::dataset::LiteMat; +using mindspore::dataset::LPixelType; +using mindspore::dataset::LDataType; +#define MS_PRINT(format, ...) __android_log_print(ANDROID_LOG_INFO, "MSJNI", format, ##__VA_ARGS__) + + +static const int RET_CATEGORY_SUM = 365; +static const char *labels_name_map[RET_CATEGORY_SUM] = {"airfield", "airplane_cabin", + "airport_terminal", "alcove", "alley", + "amphitheater", "amusement_arcade", + "amusement_park", + "apartment_building/outdoor", "aquarium", + "aqueduct", "arcade", "arch", + "archaelogical_excavation", "archive", + "arena/hockey", "arena/performance", + "arena/rodeo", "army_base", "art_gallery", + "art_school", "art_studio", "artists_loft", + "assembly_line", "athletic_field/outdoor", + "atrium/public", "attic", "auditorium", + "auto_factory", "auto_showroom", + "badlands", "bakery/shop", + "balcony/exterior", "balcony/interior", + "ball_pit", + "ballroom", "bamboo_forest", "bank_vault", + "banquet_hall", "bar", + "barn", "barndoor", "baseball_field", + "basement", "basketball_court/indoor", + "bathroom", "bazaar/indoor", + "bazaar/outdoor", "beach", "beach_house", + "beauty_salon", "bedchamber", "bedroom", + "beer_garden", "beer_hall", + "berth", "biology_laboratory", "boardwalk", + "boat_deck", "boathouse", + "bookstore", "booth/indoor", + "botanical_garden", "bow_window/indoor", + "bowling_alley", + "boxing_ring", "bridge", "building_facade", + "bullring", "burial_chamber", + "bus_interior", "bus_station/indoor", + "butchers_shop", "butte", "cabin/outdoor", + "cafeteria", "campsite", "campus", + "canal/natural", "canal/urban", + "candy_store", "canyon", "car_interior", + "carrousel", "castle", + "catacomb", "cemetery", "chalet", + "chemistry_lab", "childs_room", + "church/indoor", "church/outdoor", + "classroom", "clean_room", "cliff", + "closet", "clothing_store", "coast", + "cockpit", "coffee_shop", + "computer_room", "conference_center", + "conference_room", "construction_site", + "corn_field", + "corral", "corridor", "cottage", + "courthouse", "courtyard", + "creek", "crevasse", "crosswalk", "dam", + "delicatessen", + "department_store", "desert/sand", + "desert/vegetation", "desert_road", + "diner/outdoor", + "dining_hall", "dining_room", "discotheque", + "doorway/outdoor", "dorm_room", + "downtown", "dressing_room", "driveway", + "drugstore", "elevator/door", + "elevator_lobby", "elevator_shaft", + "embassy", "engine_room", "entrance_hall", + "escalator/indoor", "excavation", + "fabric_store", "farm", + "fastfood_restaurant", + "field/cultivated", "field/wild", + "field_road", "fire_escape", "fire_station", + "fishpond", "flea_market/indoor", + "florist_shop/indoor", "food_court", + "football_field", + "forest/broadleaf", "forest_path", + "forest_road", "formal_garden", "fountain", + "galley", "garage/indoor", "garage/outdoor", + "gas_station", "gazebo/exterior", + "general_store/indoor", + "general_store/outdoor", "gift_shop", + "glacier", "golf_course", + "greenhouse/indoor", "greenhouse/outdoor", + "grotto", "gymnasium/indoor", + "hangar/indoor", + "hangar/outdoor", "harbor", + "hardware_store", "hayfield", "heliport", + "highway", "home_office", "home_theater", + "hospital", "hospital_room", + "hot_spring", "hotel/outdoor", "hotel_room", + "house", "hunting_lodge/outdoor", + "ice_cream_parlor", "ice_floe", "ice_shelf", + "ice_skating_rink/indoor", + "ice_skating_rink/outdoor", + "iceberg", "igloo", "industrial_area", + "inn/outdoor", "islet", + "jacuzzi/indoor", "jail_cell", + "japanese_garden", "jewelry_shop", + "junkyard", + "kasbah", "kennel/outdoor", + "kindergarden_classroom", "kitchen", + "lagoon", + "lake/natural", "landfill", "landing_deck", + "laundromat", "lawn", + "lecture_room", "legislative_chamber", + "library/indoor", "library/outdoor", + "lighthouse", + "living_room", "loading_dock", "lobby", + "lock_chamber", "locker_room", + "mansion", "manufactured_home", + "market/indoor", "market/outdoor", "marsh", + "martial_arts_gym", "mausoleum", "medina", + "mezzanine", "moat/water", + "mosque/outdoor", "motel", "mountain", + "mountain_path", "mountain_snowy", + "movie_theater/indoor", "museum/indoor", + "museum/outdoor", "music_studio", + "natural_history_museum", + "nursery", "nursing_home", "oast_house", + "ocean", "office", + "office_building", "office_cubicles", + "oilrig", "operating_room", "orchard", + "orchestra_pit", "pagoda", "palace", + "pantry", "park", + "parking_garage/indoor", + "parking_garage/outdoor", "parking_lot", + "pasture", "patio", + "pavilion", "pet_shop", "pharmacy", + "phone_booth", "physics_laboratory", + "picnic_area", "pier", "pizzeria", + "playground", "playroom", + "plaza", "pond", "porch", "promenade", + "pub/indoor", + "racecourse", "raceway", "raft", + "railroad_track", "rainforest", + "reception", "recreation_room", + "repair_shop", "residential_neighborhood", + "restaurant", + "restaurant_kitchen", "restaurant_patio", + "rice_paddy", "river", "rock_arch", + "roof_garden", "rope_bridge", "ruin", + "runway", "sandbox", + "sauna", "schoolhouse", "science_museum", + "server_room", "shed", + "shoe_shop", "shopfront", + "shopping_mall/indoor", "shower", + "ski_resort", + "ski_slope", "sky", "skyscraper", "slum", + "snowfield", + "soccer_field", "stable", + "stadium/baseball", "stadium/football", + "stadium/soccer", + "stage/indoor", "stage/outdoor", + "staircase", "storage_room", "street", + "subway_station/platform", "supermarket", + "sushi_bar", "swamp", "swimming_hole", + "swimming_pool/indoor", + "swimming_pool/outdoor", + "synagogue/outdoor", "television_room", + "television_studio", + "temple/asia", "throne_room", + "ticket_booth", "topiary_garden", "tower", + "toyshop", "train_interior", + "train_station/platform", "tree_farm", + "tree_house", + "trench", "tundra", "underwater/ocean_deep", + "utility_room", "valley", + "vegetable_garden", "veterinarians_office", + "viaduct", "village", "vineyard", + "volcano", "volleyball_court/outdoor", + "waiting_room", "water_park", "water_tower", + "waterfall", "watering_hole", "wave", + "wet_bar", "wheat_field", + "wind_farm", "windmill", "yard", + "youth_hostel", "zen_garden"}; + + +char *CreateLocalModelBuffer(JNIEnv *env, jobject modelBuffer) { + jbyte *modelAddr = static_cast(env->GetDirectBufferAddress(modelBuffer)); + int modelLen = static_cast(env->GetDirectBufferCapacity(modelBuffer)); + char *buffer(new char[modelLen]); + memcpy(buffer, modelAddr, modelLen); + return buffer; +} + +/** + * To process the result of mindspore inference. + * @param msOutputs + * @return + */ +std::string ProcessRunnetResult(const int RET_CATEGORY_SUM, const char *const labels_name_map[], + std::unordered_map msOutputs) { + // Get the branch of the model output. + // Use iterators to get map elements. + std::unordered_map::iterator iter; + iter = msOutputs.begin(); + + // The mobilenetv2.ms model output just one branch. + auto outputTensor = iter->second; + + int tensorNum = outputTensor->ElementsNum(); + MS_PRINT("Number of tensor elements:%d", tensorNum); + + // Get a pointer to the first score. + float *temp_scores = static_cast(outputTensor->MutableData()); + + // float scores[RET_CATEGORY_SUM]; + float scores = temp_scores[0]; + int cat_loc = 0; + for (int i = 0; i < RET_CATEGORY_SUM; ++i) { + if (scores < temp_scores[i]) { + scores = temp_scores[i]; + cat_loc = i; + } + if (temp_scores[i] > 0.5) { + MS_PRINT("MindSpore scores[%d] : [%f]", i, temp_scores[i]); + } + } + + // Score for each category. + // Converted to text information that needs to be displayed in the APP. + std::string categoryScore = ""; + categoryScore += labels_name_map[cat_loc]; + categoryScore += ":"; + std::string score_str = std::to_string(scores); + categoryScore += score_str; + return categoryScore; +} + +bool BitmapToLiteMat(JNIEnv *env, const jobject &srcBitmap, LiteMat *lite_mat) { + bool ret = false; + AndroidBitmapInfo info; + void *pixels = nullptr; + LiteMat &lite_mat_bgr = *lite_mat; + AndroidBitmap_getInfo(env, srcBitmap, &info); + if (info.format != ANDROID_BITMAP_FORMAT_RGBA_8888) { + MS_PRINT("Image Err, Request RGBA"); + return false; + } + AndroidBitmap_lockPixels(env, srcBitmap, &pixels); + if (info.stride == info.width * 4) { + ret = InitFromPixel(reinterpret_cast(pixels), + LPixelType::RGBA2RGB, LDataType::UINT8, + info.width, info.height, lite_mat_bgr); + if (!ret) { + MS_PRINT("Init From RGBA error"); + } + } else { + unsigned char *pixels_ptr = new unsigned char[info.width * info.height * 4]; + unsigned char *ptr = pixels_ptr; + unsigned char *data = reinterpret_cast(pixels); + for (int i = 0; i < info.height; i++) { + memcpy(ptr, data, info.width * 4); + ptr += info.width * 4; + data += info.stride; + } + ret = InitFromPixel(reinterpret_cast(pixels_ptr), + LPixelType::RGBA2RGB, LDataType::UINT8, + info.width, info.height, lite_mat_bgr); + if (!ret) { + MS_PRINT("Init From RGBA error"); + } + delete[] (pixels_ptr); + } + AndroidBitmap_unlockPixels(env, srcBitmap); + return ret; +} + +bool PreProcessImageData(const LiteMat &lite_mat_bgr, LiteMat *lite_norm_mat_ptr) { + bool ret = false; + LiteMat lite_mat_resize; + LiteMat &lite_norm_mat_cut = *lite_norm_mat_ptr; + ret = ResizeBilinear(lite_mat_bgr, lite_mat_resize, 256, 256); + if (!ret) { + MS_PRINT("ResizeBilinear error"); + return false; + } + LiteMat lite_mat_convert_float; + ret = ConvertTo(lite_mat_resize, lite_mat_convert_float, 1.0 / 255.0); + if (!ret) { + MS_PRINT("ConvertTo error"); + return false; + } + LiteMat lite_mat_cut; + ret = Crop(lite_mat_convert_float, lite_mat_cut, 16, 16, 224, 224); + if (!ret) { + MS_PRINT("Crop error"); + return false; + } + std::vector means = {0.485, 0.456, 0.406}; + std::vector stds = {0.229, 0.224, 0.225}; + SubStractMeanNormalize(lite_mat_cut, lite_norm_mat_cut, means, stds); + return true; +} + + +/** + * The Java layer reads the model into MappedByteBuffer or ByteBuffer to load the model. + */ +extern "C" +JNIEXPORT jlong JNICALL +Java_com_mindspore_scene_gallery_classify_TrackingMobile_loadModel(JNIEnv *env, + jobject thiz, + jobject model_buffer, + jint num_thread) { + if (nullptr == model_buffer) { + MS_PRINT("error, buffer is nullptr!"); + return (jlong) nullptr; + } + jlong bufferLen = env->GetDirectBufferCapacity(model_buffer); + if (0 == bufferLen) { + MS_PRINT("error, bufferLen is 0!"); + return (jlong) nullptr; + } + + char *modelBuffer = CreateLocalModelBuffer(env, model_buffer); + if (modelBuffer == nullptr) { + MS_PRINT("modelBuffer create failed!"); + return (jlong) nullptr; + } + + // To create a mindspore network inference environment. + void **labelEnv = new void *; + MSNetWork *labelNet = new MSNetWork; + *labelEnv = labelNet; + + mindspore::lite::Context *context = new mindspore::lite::Context; + context->thread_num_ = num_thread; + context->device_list_[0].device_info_.cpu_device_info_.cpu_bind_mode_ = mindspore::lite::NO_BIND; + context->device_list_[0].device_info_.cpu_device_info_.enable_float16_ = false; + context->device_list_[0].device_type_ = mindspore::lite::DT_CPU; + + labelNet->CreateSessionMS(modelBuffer, bufferLen, context); + delete context; + + if (labelNet->session() == nullptr) { + MS_PRINT("MindSpore create session failed!."); + delete labelNet; + delete labelEnv; + return (jlong) nullptr; + } + + if (model_buffer != nullptr) { + env->DeleteLocalRef(model_buffer); + } + + return (jlong) labelEnv; +} + +/** + * After the inference environment is successfully created, + * sending a picture to the model and run inference. + */ +extern "C" JNIEXPORT jstring JNICALL +Java_com_mindspore_scene_gallery_classify_TrackingMobile_runNet(JNIEnv *env, jclass type, + jlong netEnv, + jobject srcBitmap) { + LiteMat lite_mat_bgr, lite_norm_mat_cut; + + if (!BitmapToLiteMat(env, srcBitmap, &lite_mat_bgr)) { + MS_PRINT("BitmapToLiteMat error"); + return NULL; + } + if (!PreProcessImageData(lite_mat_bgr, &lite_norm_mat_cut)) { + MS_PRINT("PreProcessImageData error"); + return NULL; + } + + ImgDims inputDims; + inputDims.channel = lite_norm_mat_cut.channel_; + inputDims.width = lite_norm_mat_cut.width_; + inputDims.height = lite_norm_mat_cut.height_; + + // Get the mindsore inference environment which created in loadModel(). + void **labelEnv = reinterpret_cast(netEnv); + if (labelEnv == nullptr) { + MS_PRINT("MindSpore error, labelEnv is a nullptr."); + return NULL; + } + MSNetWork *labelNet = static_cast(*labelEnv); + + auto mSession = labelNet->session(); + if (mSession == nullptr) { + MS_PRINT("MindSpore error, Session is a nullptr."); + return NULL; + } + MS_PRINT("MindSpore get session."); + + auto msInputs = mSession->GetInputs(); + if (msInputs.size() == 0) { + MS_PRINT("MindSpore error, msInputs.size() equals 0."); + return NULL; + } + auto inTensor = msInputs.front(); + + float *dataHWC = reinterpret_cast(lite_norm_mat_cut.data_ptr_); + // Copy dataHWC to the model input tensor. + memcpy(inTensor->MutableData(), dataHWC, + inputDims.channel * inputDims.width * inputDims.height * sizeof(float)); + + // After the model and image tensor data is loaded, run inference. + auto status = mSession->RunGraph(); + + if (status != mindspore::lite::RET_OK) { + MS_PRINT("MindSpore run net error."); + return NULL; + } + + /** + * Get the mindspore inference results. + * Return the map of output node name and MindSpore Lite MSTensor. + */ + auto names = mSession->GetOutputTensorNames(); + std::unordered_map msOutputs; + for (const auto &name : names) { + auto temp_dat = mSession->GetOutputByTensorName(name); + msOutputs.insert(std::pair{name, temp_dat}); + } + + std::string resultStr = ProcessRunnetResult(::RET_CATEGORY_SUM, + ::labels_name_map, msOutputs); + + const char *resultCharData = resultStr.c_str(); + return (env)->NewStringUTF(resultCharData); +} + +extern "C" JNIEXPORT jboolean JNICALL +Java_com_mindspore_scene_gallery_classify_TrackingMobile_unloadModel(JNIEnv *env, + jclass type, + jlong netEnv) { + MS_PRINT("MindSpore release net."); + void **labelEnv = reinterpret_cast(netEnv); + if (labelEnv == nullptr) { + MS_PRINT("MindSpore error, labelEnv is a nullptr."); + } + MSNetWork *labelNet = static_cast(*labelEnv); + + labelNet->ReleaseNets(); + + return (jboolean) true; +} diff --git a/model_zoo/official/lite/scene_detection/app/src/main/cpp/MindSporeNetnative.h b/model_zoo/official/lite/scene_detection/app/src/main/cpp/MindSporeNetnative.h new file mode 100644 index 0000000000..b28dc37234 --- /dev/null +++ b/model_zoo/official/lite/scene_detection/app/src/main/cpp/MindSporeNetnative.h @@ -0,0 +1,21 @@ +/** + * Copyright 2020 Huawei Technologies Co., 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. + */ + +#ifndef MINDSPORE_JNI_HMS_DEBUG_MINDSPORENETNATIVE_H +#define MINDSPORE_JNI_HMS_DEBUG_MINDSPORENETNATIVE_H + + +#endif // MINDSPORE_JNI_HMS_DEBUG_MINDSPORENETNATIVE_H diff --git a/model_zoo/official/lite/scene_detection/app/src/main/java/com/mindspore/scene/gallery/classify/CompareSizesByArea.java b/model_zoo/official/lite/scene_detection/app/src/main/java/com/mindspore/scene/gallery/classify/CompareSizesByArea.java new file mode 100644 index 0000000000..f73845f8f0 --- /dev/null +++ b/model_zoo/official/lite/scene_detection/app/src/main/java/com/mindspore/scene/gallery/classify/CompareSizesByArea.java @@ -0,0 +1,34 @@ +/** + * Copyright 2020 Huawei Technologies Co., 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. + */ +package com.mindspore.scene.gallery.classify; + +import android.util.Size; + +import java.util.Comparator; + +/** + * Data comparator. + */ + +public class CompareSizesByArea implements Comparator { + + @Override + public int compare(Size lhs, Size rhs) { + // We cast here to ensure the multiplications won't overflow + return Long.signum((long) lhs.getWidth() * lhs.getHeight() - (long) rhs.getWidth() * rhs.getHeight()); + } + +} \ No newline at end of file diff --git a/model_zoo/official/lite/scene_detection/app/src/main/java/com/mindspore/scene/gallery/classify/RecognitionObjectBean.java b/model_zoo/official/lite/scene_detection/app/src/main/java/com/mindspore/scene/gallery/classify/RecognitionObjectBean.java new file mode 100644 index 0000000000..3eec2773cd --- /dev/null +++ b/model_zoo/official/lite/scene_detection/app/src/main/java/com/mindspore/scene/gallery/classify/RecognitionObjectBean.java @@ -0,0 +1,45 @@ +/** + * Copyright 2020 Huawei Technologies Co., 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. + */ +package com.mindspore.scene.gallery.classify; + +public class RecognitionObjectBean { + + private String name; + private float score; + + public RecognitionObjectBean(String name, float score) { + this.name = name; + this.score = score; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public float getScore() { + return score; + } + + public void setScore(float score) { + this.score = score; + } + + +} diff --git a/model_zoo/official/lite/scene_detection/app/src/main/java/com/mindspore/scene/gallery/classify/TrackingMobile.java b/model_zoo/official/lite/scene_detection/app/src/main/java/com/mindspore/scene/gallery/classify/TrackingMobile.java new file mode 100644 index 0000000000..2c4f92305d --- /dev/null +++ b/model_zoo/official/lite/scene_detection/app/src/main/java/com/mindspore/scene/gallery/classify/TrackingMobile.java @@ -0,0 +1,126 @@ +/** + * Copyright 2020 Huawei Technologies Co., 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. + */ +package com.mindspore.scene.gallery.classify; + +import android.content.Context; +import android.graphics.Bitmap; +import android.util.Log; + +import java.io.InputStream; +import java.nio.ByteBuffer; + +/** + * Call the MindSpore interface API in the Java layer. + */ +public class TrackingMobile { + private final static String TAG = "TrackingMobile"; + + static { + try { + System.loadLibrary("mlkit-label-MS"); + Log.i(TAG, "load libiMindSpore.so successfully."); + } catch (UnsatisfiedLinkError e) { + Log.e(TAG, "UnsatisfiedLinkError " + e.getMessage()); + } + } + + // The address of the running inference environment. + private long netEnv = 0; + + private final Context mActivity; + + public TrackingMobile(Context activity) { + this.mActivity = activity; + } + + /** + * JNI load model and also create model inference environment. + * + * @param modelBuffer Model buffer. + * @param numThread The num of thread. + * @return MindSpore Inference environment address. + */ + public native long loadModel(ByteBuffer modelBuffer, int numThread); + + /** + * Running model. + * + * @param netEnv Inference environment address. + * @param img A picture to be inferred. + * @return Inference result + */ + public native String runNet(long netEnv, Bitmap img); + + /** + * Unbind model data. + * + * @param netEnv Inference environment address. + * @return Unbound state. + */ + public native boolean unloadModel(long netEnv); + + /** + * The C++ side is encapsulated into a method of the MSNetWorks class + * + * @param modelPath Model file location + * @return Load model file status + */ + public boolean loadModelFromBuf(String modelPath) { + ByteBuffer buffer = loadModelFile(modelPath); + netEnv = loadModel(buffer, 2); //numThread's default setting is 2. + if (netEnv == 0) { // Loading model failed. + return false; + } + + return true; + } + + /** + * Run MindSpore inference. + */ + public String MindSpore_runnet(Bitmap img) { + String ret_str = runNet(netEnv, img); + return ret_str; + } + + /** + * Unload model. + * @return true + */ + public boolean unloadModel() { + unloadModel(netEnv); + return true; + } + + /** + * Load model file stream. + * @param modelPath Model file path. + * @return Model ByteBuffer. + */ + public ByteBuffer loadModelFile(String modelPath) { + InputStream is = null; + try { + is = mActivity.getAssets().open(modelPath); + byte[] bytes = new byte[is.available()]; + is.read(bytes); + return ByteBuffer.allocateDirect(bytes.length).put(bytes); + } catch (Exception e) { + Log.d("loadModelFile", " Exception occur. "); + Log.e(TAG, Log.getStackTraceString(e)); + } + return null; + } +} diff --git a/model_zoo/official/lite/scene_detection/app/src/main/java/com/mindspore/scene/widget/AutoFitTextureView.java b/model_zoo/official/lite/scene_detection/app/src/main/java/com/mindspore/scene/widget/AutoFitTextureView.java new file mode 100644 index 0000000000..44006488f6 --- /dev/null +++ b/model_zoo/official/lite/scene_detection/app/src/main/java/com/mindspore/scene/widget/AutoFitTextureView.java @@ -0,0 +1,73 @@ +/** + * Copyright 2020 Huawei Technologies Co., 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. + */ +package com.mindspore.scene.widget; + +import android.content.Context; +import android.util.AttributeSet; +import android.view.TextureView; + +public class AutoFitTextureView extends TextureView { + + private int mRatioWidth = 0; + private int mRatioHeight = 0; + + public AutoFitTextureView(Context context) { + this(context, null); + } + + public AutoFitTextureView(Context context, AttributeSet attrs) { + this(context, attrs, 0); + } + + public AutoFitTextureView(Context context, AttributeSet attrs, int defStyle) { + super(context, attrs, defStyle); + } + + /** + * Sets the aspect ratio for this view. The size of the view will be measured based on the ratio + * calculated from the parameters. Note that the actual sizes of parameters don't matter, that + * is, calling setAspectRatio(2, 3) and setAspectRatio(4, 6) make the same result. + * + * @param width Relative horizontal size + * @param height Relative vertical size + */ + public void setAspectRatio(int width, int height) { + if (width < 0 || height < 0) { + throw new IllegalArgumentException("Size cannot be negative."); + } + mRatioWidth = width; + mRatioHeight = height; + requestLayout(); + } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + super.onMeasure(widthMeasureSpec, heightMeasureSpec); + int width = MeasureSpec.getSize(widthMeasureSpec); + int height = MeasureSpec.getSize(heightMeasureSpec); + + if (0 == mRatioWidth || 0 == mRatioHeight) { + setMeasuredDimension(width, height); + } else { + if (width > height * mRatioWidth / mRatioHeight) { + setMeasuredDimension(width, width * mRatioHeight / mRatioWidth); + } else { + setMeasuredDimension(height * mRatioWidth / mRatioHeight, height); + } + } + } + +} diff --git a/model_zoo/official/lite/scene_detection/app/src/main/java/com/mindspore/scene/widget/CameraActivity.java b/model_zoo/official/lite/scene_detection/app/src/main/java/com/mindspore/scene/widget/CameraActivity.java new file mode 100644 index 0000000000..f82dd419c8 --- /dev/null +++ b/model_zoo/official/lite/scene_detection/app/src/main/java/com/mindspore/scene/widget/CameraActivity.java @@ -0,0 +1,184 @@ +/** + * Copyright 2020 Huawei Technologies Co., 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. + */ +package com.mindspore.scene.widget; + +import android.Manifest; +import android.content.pm.PackageManager; +import android.graphics.Color; +import android.os.Build; +import android.os.Bundle; +import android.util.Log; +import android.view.Gravity; +import android.view.View; +import android.view.ViewGroup; +import android.view.WindowManager; +import android.widget.LinearLayout; +import android.widget.TextView; +import android.widget.Toast; + +import androidx.annotation.UiThread; +import androidx.appcompat.app.AppCompatActivity; + +import com.mindspore.scene.R; +import com.mindspore.scene.gallery.classify.RecognitionObjectBean; + +/** + * The main interface of camera preview. + * Using Camera 2 API. + */ +public class CameraActivity extends AppCompatActivity { + private static final String TAG = "CameraActivity"; + + private static final String BUNDLE_FRAGMENTS_KEY = "android:support:fragments"; + + private static final int PERMISSIONS_REQUEST = 1; + + private static final String PERMISSION_CAMERA = Manifest.permission.CAMERA; + + private LinearLayout bottomLayout; + + private RecognitionObjectBean recognitionObjectBean; + + @Override + protected void onCreate(final Bundle savedInstanceState) { + Log.d(TAG, "onCreate"); + + if (savedInstanceState != null && this.clearFragmentsTag()) { + // Clear the state of the fragment when rebuilding. + savedInstanceState.remove(BUNDLE_FRAGMENTS_KEY); + } + + super.onCreate(null); + getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); + + setContentView(R.layout.activity_camera); + + if (hasPermission()) { + setFragment(); + } else { + requestPermission(); + } + + bottomLayout = findViewById(R.id.layout_bottom_content); + } + + @Override + public void onRequestPermissionsResult(final int requestCode, final String[] permissions, + final int[] grantResults) { + super.onRequestPermissionsResult(requestCode, permissions, grantResults); + if (requestCode == PERMISSIONS_REQUEST) { + if (allPermissionsGranted(grantResults)) { + setFragment(); + } else { + requestPermission(); + } + } + } + + private static boolean allPermissionsGranted(final int[] grantResults) { + for (int result : grantResults) { + if (result != PackageManager.PERMISSION_GRANTED) { + return false; + } + } + return true; + } + + private boolean hasPermission() { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + return checkSelfPermission(PERMISSION_CAMERA) == PackageManager.PERMISSION_GRANTED; + } else { + return true; + } + } + + private void requestPermission() { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + if (shouldShowRequestPermissionRationale(PERMISSION_CAMERA)) { + Toast.makeText(CameraActivity.this, "Camera permission is required for this demo", Toast.LENGTH_LONG) + .show(); + } + requestPermissions(new String[]{PERMISSION_CAMERA}, PERMISSIONS_REQUEST); + } + } + + + protected void setFragment() { + CameraFragment cameraFragment = CameraFragment.newInstance(new CameraFragment.RecognitionDataCallBack() { + @Override + public void onRecognitionDataCallBack(String result, final String time) { + dealRecognitionData(result, time); + } + }); + + getSupportFragmentManager().beginTransaction() + .replace(R.id.container, cameraFragment) + .commitAllowingStateLoss(); + } + + + private void dealRecognitionData(String result, final String time) { + if (!result.equals("") && result.contains(":")) { + String[] resultArray = result.split(":"); + recognitionObjectBean = new RecognitionObjectBean(resultArray[0], Float.valueOf(resultArray[1])); + } + + runOnUiThread(new Runnable() { + @Override + public void run() { + showResultsInBottomSheet(time); + } + }); + } + + @UiThread + protected void showResultsInBottomSheet(String time) { + bottomLayout.removeAllViews(); + if (recognitionObjectBean != null) { + HorTextView horTextView = new HorTextView(this); + horTextView.setLeftTitle(recognitionObjectBean.getName() + ":"); + horTextView.setRightContent(String.format("%.2f", (100 * recognitionObjectBean.getScore())) + "%"); + horTextView.setBottomLineVisible(View.VISIBLE); + bottomLayout.addView(horTextView); + + HorTextView horTimeView = new HorTextView(this); + horTimeView.setLeftTitle("Inference Time:"); + horTimeView.setRightContent(time); + horTimeView.setBottomLineVisible(View.INVISIBLE); + bottomLayout.addView(horTimeView); + } else { + TextView textView = new TextView(this); + textView.setLayoutParams(new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)); + textView.setText("Keep moving."); + textView.setGravity(Gravity.CENTER); + textView.setTextColor(Color.BLACK); + textView.setTextSize(30); + bottomLayout.addView(textView); + } + } + + @Override + protected void onSaveInstanceState(Bundle outState) { + super.onSaveInstanceState(outState); + if (outState != null && this.clearFragmentsTag()) { + outState.remove(BUNDLE_FRAGMENTS_KEY); + } + } + + protected boolean clearFragmentsTag() { + return true; + } +} diff --git a/model_zoo/official/lite/scene_detection/app/src/main/java/com/mindspore/scene/widget/CameraFragment.java b/model_zoo/official/lite/scene_detection/app/src/main/java/com/mindspore/scene/widget/CameraFragment.java new file mode 100644 index 0000000000..f2263a6dc0 --- /dev/null +++ b/model_zoo/official/lite/scene_detection/app/src/main/java/com/mindspore/scene/widget/CameraFragment.java @@ -0,0 +1,823 @@ +/** + * Copyright 2020 Huawei Technologies Co., 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. + */ +package com.mindspore.scene.widget; + +import android.annotation.SuppressLint; +import android.app.Activity; +import android.content.Context; +import android.content.res.Configuration; +import android.graphics.Bitmap; +import android.graphics.ImageFormat; +import android.graphics.Matrix; +import android.graphics.Point; +import android.graphics.RectF; +import android.graphics.SurfaceTexture; +import android.hardware.camera2.CameraAccessException; +import android.hardware.camera2.CameraCaptureSession; +import android.hardware.camera2.CameraCharacteristics; +import android.hardware.camera2.CameraDevice; +import android.hardware.camera2.CameraManager; +import android.hardware.camera2.CameraMetadata; +import android.hardware.camera2.CaptureRequest; +import android.hardware.camera2.CaptureResult; +import android.hardware.camera2.TotalCaptureResult; +import android.hardware.camera2.params.StreamConfigurationMap; +import android.media.Image; +import android.media.ImageReader; +import android.os.Bundle; +import android.os.Handler; +import android.os.HandlerThread; +import android.util.Log; +import android.util.Size; +import android.util.SparseIntArray; +import android.view.LayoutInflater; +import android.view.Surface; +import android.view.TextureView; +import android.view.View; +import android.view.ViewGroup; +import android.widget.Toast; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.fragment.app.Fragment; + +import com.mindspore.scene.R; +import com.mindspore.scene.gallery.classify.CompareSizesByArea; +import com.mindspore.scene.gallery.classify.TrackingMobile; + +import java.io.File; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; +import java.util.concurrent.Semaphore; +import java.util.concurrent.TimeUnit; + +public class CameraFragment extends Fragment { + + private static final String TAG = "CameraFragment"; + + private static final SparseIntArray ORIENTATIONS = new SparseIntArray(); + + static { + ORIENTATIONS.append(Surface.ROTATION_0, 90); + ORIENTATIONS.append(Surface.ROTATION_90, 0); + ORIENTATIONS.append(Surface.ROTATION_180, 270); + ORIENTATIONS.append(Surface.ROTATION_270, 180); + } + + private static final int MAX_PREVIEW_WIDTH = 1920; + + private static final int MAX_PREVIEW_HEIGHT = 1280; + + private Semaphore mCameraOpenCloseLock = new Semaphore(1); + + private int mState = STATE_PREVIEW; + + private static final int STATE_PREVIEW = 0; + + private static final int STATE_WAITING_LOCK = 1; + + private static final int STATE_WAITING_PRECAPTURE = 2; + + private static final int STATE_WAITING_NON_PRECAPTURE = 3; + + private static final int STATE_PICTURE_TAKEN = 4; + + /** + * Data interface returned after identification. + */ + private RecognitionDataCallBack recognitionDataCallBack; + + + private AutoFitTextureView mTextureView; + + private TrackingMobile mTrackingMobile; + + private boolean mFlashSupported; + + private boolean isPreBackgroundThreadPause; + + + /** + * HandlerThread and Handler of camera and algorithm. + */ + private HandlerThread mCameraHandlerThread, mMindsporeHandlerThread; + + private Handler mCameraHandler, mMindsporeHandler; + + private CameraManager mCameraManager; + + private CameraCaptureSession mCaptureSession; + + private CameraDevice mCameraDevice; + + private String mCameraId; + + private ImageReader mImageReader; + + private CaptureRequest.Builder mPreviewRequestBuilder; + + private CaptureRequest mPreviewRequest; + + private File mFile; + + private Size mPreviewSize; + + private int mSensorOrientation; + + private CameraDevice.StateCallback mCameraDeviceStateCallback; + + + private CameraFragment(RecognitionDataCallBack recognitionDataCallBack) { + this.recognitionDataCallBack = recognitionDataCallBack; + } + + /** + * Singleton. + * + * @param recognitionDataCallBack Identify data return interface. + * @return Construction method. + */ + public static CameraFragment newInstance(RecognitionDataCallBack recognitionDataCallBack) { + return new CameraFragment(recognitionDataCallBack); + } + + /** + * Data interface returned after identification. + */ + public interface RecognitionDataCallBack { + /** + * Data interface returned after identification. + * + * @param result Recognition result + * @param time Response time + */ + void onRecognitionDataCallBack(String result, String time); + } + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + return inflater.inflate(R.layout.fragment_camera, container, false); + } + + @Override + public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { + mTextureView = (AutoFitTextureView) view.findViewById(R.id.texture); + } + + @Override + public void onActivityCreated(@Nullable Bundle savedInstanceState) { + super.onActivityCreated(savedInstanceState); + mTrackingMobile = new TrackingMobile(getActivity()); + + String modelPath = "model/mobilenetv2.ms"; + boolean ret = mTrackingMobile.loadModelFromBuf(modelPath); + Log.d(TAG, "Loading model return value: " + ret); + } + + + @Override + public void onResume() { + super.onResume(); + initChildThread(); + initCameraManager(); + initSelectCamera(); + initHandlerMatchingSize(); + initImageReader(); + initTextureViewListener(); + } + + @Override + public void onDetach() { + super.onDetach(); + if (mTrackingMobile != null) { + boolean ret = mTrackingMobile.unloadModel(); + Log.d(TAG, "Unload model return value: " + ret); + } + } + + @Override + public void onPause() { + closeCamera(); + stopBackgroundThread(); + super.onPause(); + } + + private void initChildThread() { + mCameraHandlerThread = new HandlerThread("CAMERA2"); + mCameraHandlerThread.start(); + mCameraHandler = new Handler(mCameraHandlerThread.getLooper()); + + mMindsporeHandlerThread = new HandlerThread("MINDSPORE"); + mMindsporeHandlerThread.start(); + mMindsporeHandler = new Handler(mMindsporeHandlerThread.getLooper()); + mMindsporeHandler.postDelayed(classifyRunnable, 500); + } + + + /** + * Detect time-consuming threads + */ + private Runnable classifyRunnable = new Runnable() { + public void run() { + synchronized (CameraFragment.this) { + Bitmap bitmap = mTextureView.getBitmap(); + if (bitmap != null) { + long startTime = System.currentTimeMillis(); + // The current bitmap performs the sending request identification operation + String ret = mTrackingMobile.MindSpore_runnet(bitmap); + long endTime = System.currentTimeMillis(); + if (recognitionDataCallBack != null) { + // Interface returns data。 + recognitionDataCallBack.onRecognitionDataCallBack(ret, (endTime - startTime) + "ms "); + } + if (!bitmap.isRecycled()) { + bitmap.recycle(); + } + } + if (mMindsporeHandler != null && !isPreBackgroundThreadPause) { + mMindsporeHandler.postDelayed(classifyRunnable, 500); + } + } + } + }; + + private void initCameraManager() { + mCameraManager = (CameraManager) getActivity().getSystemService(Context.CAMERA_SERVICE); + } + + private void initSelectCamera() { + try { + String[] cameraIdArray = mCameraManager.getCameraIdList(); + for (String itemId : cameraIdArray) { + CameraCharacteristics itemCharacteristics = mCameraManager.getCameraCharacteristics(itemId); + mSensorOrientation = itemCharacteristics.get(CameraCharacteristics.SENSOR_ORIENTATION); + Integer facing = itemCharacteristics.get(CameraCharacteristics.LENS_FACING); + if (facing == CameraCharacteristics.LENS_FACING_BACK) { + mCameraId = itemId; + break; + } + + } + } catch (CameraAccessException e) { + e.printStackTrace(); + } + if (mCameraId == null) { + Toast.makeText(getActivity(), getString(R.string.camera_error), Toast.LENGTH_SHORT).show(); + } + } + + private StreamConfigurationMap streamConfigurationMap; + private Size largest; + + /** + * Calculate the camera resolution suitable for the current screen resolution. + */ + private void initHandlerMatchingSize() { + try { + CameraCharacteristics cameraCharacteristics = mCameraManager.getCameraCharacteristics(mCameraId); + streamConfigurationMap = cameraCharacteristics.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP); + + Size[] sizes = streamConfigurationMap.getOutputSizes(ImageFormat.JPEG); + largest = Collections.max(Arrays.asList(sizes), new CompareSizesByArea()); + + Boolean available = cameraCharacteristics.get(CameraCharacteristics.FLASH_INFO_AVAILABLE); + mFlashSupported = available == null ? false : available; + } catch (CameraAccessException e) { + e.printStackTrace(); + } + } + + /** + * Initialize the picture. + */ + private void initImageReader() { + final int W = 640; + final int H = 480; + + mImageReader = ImageReader.newInstance(W, H, ImageFormat.JPEG, 30); + mImageReader.setOnImageAvailableListener(new ImageReader.OnImageAvailableListener() { + @Override + public void onImageAvailable(ImageReader reader) { + mFile = new File(getActivity().getExternalFilesDir(null), System.currentTimeMillis() + ".jpg"); + // Get the data frame and start the algorithm processing. + try { + // Get the next image from the ImageReader queue. + Image image = reader.acquireNextImage(); + image.close(); + } catch (Exception e) { + Log.e(TAG, "onImageAvailable: " + e.toString()); + } + } + }, mCameraHandler); + } + + /** + * TextureView.SurfaceTextureListener + */ + private void initTextureViewListener() { + if (mTextureView.isAvailable()) { + openCamera(mTextureView.getWidth(), mTextureView.getHeight()); + Log.d(TAG, "isAvailable: " + mTextureView.getWidth() + "--" + mTextureView.getHeight()); + } else { + mTextureView.setSurfaceTextureListener(new TextureView.SurfaceTextureListener() { + @Override + public void onSurfaceTextureAvailable(SurfaceTexture texture, int width, int height) { + openCamera(width, height); + } + + @Override + public void onSurfaceTextureSizeChanged(SurfaceTexture texture, int width, int height) { + configureTransform(width, height); + } + + @Override + public boolean onSurfaceTextureDestroyed(@NonNull SurfaceTexture surfaceTexture) { + return true; + } + + @Override + public void onSurfaceTextureUpdated(@NonNull SurfaceTexture surfaceTexture) { + + } + }); + } + } + + + @SuppressLint("MissingPermission") + private void openCamera(int width, int height) { + setPreviewSize(width, height, streamConfigurationMap, largest); + configureTransform(width, height); + + mCameraDeviceStateCallback = new CameraDevice.StateCallback() { + @Override + public void onOpened(@NonNull CameraDevice cameraDevice) { + if (cameraDevice != null) { + mCameraOpenCloseLock.release(); + mCameraDevice = cameraDevice; + createCameraPreviewSession(); + } + } + + @Override + public void onDisconnected(@NonNull CameraDevice cameraDevice) { + if (cameraDevice != null) { + mCameraOpenCloseLock.release(); + cameraDevice.close(); + mCameraDevice = null; + } + } + + @Override + public void onError(@NonNull CameraDevice cameraDevice, int i) { + if (cameraDevice != null) { + mCameraOpenCloseLock.release(); + cameraDevice.close(); + mCameraDevice = null; + if (null != getActivity()) { + getActivity().finish(); + } + } + } + }; + + + try { + if (!mCameraOpenCloseLock.tryAcquire(2500, TimeUnit.MILLISECONDS)) { + throw new RuntimeException("Time out waiting to lock ic_launcher opening."); + } + mCameraManager.openCamera(mCameraId, mCameraDeviceStateCallback, mCameraHandler); + } catch (CameraAccessException e) { + e.printStackTrace(); + } catch (InterruptedException e) { + throw new RuntimeException("Interrupted while trying to lock ic_launcher opening.", e); + } + + + } + + + /** + * Open camera preview. + */ + private void createCameraPreviewSession() { + try { + SurfaceTexture texture = mTextureView.getSurfaceTexture(); + // Set preview size. + texture.setDefaultBufferSize(mPreviewSize.getWidth(), mPreviewSize.getHeight()); + // This is the output Surface we need to start preview. + Surface surface = new Surface(texture); + + mPreviewRequestBuilder = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW); + mPreviewRequestBuilder.addTarget(surface); + // Here, we create a CameraCaptureSession for ic_launcher preview. + mCameraDevice.createCaptureSession(Arrays.asList(surface, mImageReader.getSurface()), + new CameraCaptureSession.StateCallback() { + + @Override + public void onConfigured(@NonNull CameraCaptureSession cameraCaptureSession) { + // The ic_launcher is already closed + if (null == mCameraDevice) { + return; + } + + // When the session is ready, we start displaying the preview. + mCaptureSession = cameraCaptureSession; + try { + // Auto focus should be continuous for ic_launcher preview. + mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AF_MODE, + CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE); + // Flash is automatically enabled when necessary. + setAutoFlash(mPreviewRequestBuilder); + // Finally, we start displaying the ic_launcher preview. + mPreviewRequest = mPreviewRequestBuilder.build(); + mCaptureSession.setRepeatingRequest(mPreviewRequest, mCaptureCallback, mCameraHandler); + } catch (CameraAccessException e) { + e.printStackTrace(); + } + } + + @Override + public void onConfigureFailed(@NonNull CameraCaptureSession cameraCaptureSession) { + Toast.makeText(getActivity(), "Failed", Toast.LENGTH_LONG).show(); + } + }, null); + } catch (CameraAccessException e) { + e.printStackTrace(); + } + } + + + private CameraCaptureSession.CaptureCallback mCaptureCallback = new CameraCaptureSession.CaptureCallback() { + + private void process(CaptureResult result) { + switch (mState) { + case STATE_PREVIEW: { + // We have nothing to do when the ic_launcher preview is working normally. + break; + } + case STATE_WAITING_LOCK: { + Integer afState = result.get(CaptureResult.CONTROL_AF_STATE); + if (afState == null) { + captureStillPicture(); + } else if (CaptureResult.CONTROL_AF_STATE_FOCUSED_LOCKED == afState + || CaptureResult.CONTROL_AF_STATE_NOT_FOCUSED_LOCKED == afState) { + // CONTROL_AE_STATE can be null on some devices + Integer aeState = result.get(CaptureResult.CONTROL_AE_STATE); + if (aeState == null || aeState == CaptureResult.CONTROL_AE_STATE_CONVERGED) { + mState = STATE_PICTURE_TAKEN; + captureStillPicture(); + } else { + runPrecaptureSequence(); + } + } + break; + } + case STATE_WAITING_PRECAPTURE: { + // CONTROL_AE_STATE can be null on some devices + Integer aeState = result.get(CaptureResult.CONTROL_AE_STATE); + if (aeState == null || aeState == CaptureResult.CONTROL_AE_STATE_PRECAPTURE + || aeState == CaptureRequest.CONTROL_AE_STATE_FLASH_REQUIRED) { + mState = STATE_WAITING_NON_PRECAPTURE; + } + break; + } + case STATE_WAITING_NON_PRECAPTURE: { + // CONTROL_AE_STATE can be null on some devices + Integer aeState = result.get(CaptureResult.CONTROL_AE_STATE); + if (aeState == null || aeState != CaptureResult.CONTROL_AE_STATE_PRECAPTURE) { + mState = STATE_PICTURE_TAKEN; + captureStillPicture(); + } + break; + } + } + } + + @Override + public void onCaptureProgressed(@NonNull CameraCaptureSession session, @NonNull CaptureRequest request, + @NonNull CaptureResult partialResult) { + process(partialResult); + } + + @Override + public void onCaptureCompleted(@NonNull CameraCaptureSession session, @NonNull CaptureRequest request, + @NonNull TotalCaptureResult result) { + process(result); + } + }; + + + /** + * Run the precapture sequence for capturing a still image. This method should be called when + * we get a response in. + */ + private void runPrecaptureSequence() { + try { + // This is how to tell the ic_launcher to trigger. + mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AE_PRECAPTURE_TRIGGER, + CaptureRequest.CONTROL_AE_PRECAPTURE_TRIGGER_START); + // Tell #mCaptureCallback to wait for the precapture sequence to be set. + mState = STATE_WAITING_PRECAPTURE; + mCaptureSession.capture(mPreviewRequestBuilder.build(), mCaptureCallback, mCameraHandler); + } catch (CameraAccessException e) { + e.printStackTrace(); + } + } + + /** + * Capture a still picture. This method should be called when we get a response in + * {@link #mCaptureCallback} from both + */ + private void captureStillPicture() { + try { + final Activity activity = getActivity(); + if (null == activity || null == mCameraDevice) { + return; + } + // This is the CaptureRequest.Builder that we use to take a picture. + final CaptureRequest.Builder captureBuilder = + mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_STILL_CAPTURE); + captureBuilder.addTarget(mImageReader.getSurface()); + + // Use the same AE and AF modes as the preview. + captureBuilder.set(CaptureRequest.CONTROL_AF_MODE, CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE); + setAutoFlash(captureBuilder); + + // Orientation + int rotation = activity.getWindowManager().getDefaultDisplay().getRotation(); + captureBuilder.set(CaptureRequest.JPEG_ORIENTATION, getOrientation(rotation)); + + CameraCaptureSession.CaptureCallback CaptureCallback = new CameraCaptureSession.CaptureCallback() { + + @Override + public void onCaptureCompleted(@NonNull CameraCaptureSession session, @NonNull CaptureRequest request, + @NonNull TotalCaptureResult result) { + showToast("Saved: " + mFile); + Log.d(TAG, mFile.toString()); + unlockFocus(); + } + }; + + mCaptureSession.stopRepeating(); + mCaptureSession.abortCaptures(); + mCaptureSession.capture(captureBuilder.build(), CaptureCallback, null); + } catch (CameraAccessException e) { + e.printStackTrace(); + } + } + + /** + * Retrieves the JPEG orientation from the specified screen rotation. + * + * @param rotation The screen rotation. + * @return The JPEG orientation (one of 0, 90, 270, and 360) + */ + private int getOrientation(int rotation) { + return (ORIENTATIONS.get(rotation) + mSensorOrientation + 270) % 360; + } + + /** + * Unlock the focus. This method should be called when still image capture sequence is + * finished. + */ + private void unlockFocus() { + try { + // Reset the auto-focus trigger + mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AF_TRIGGER, CameraMetadata.CONTROL_AF_TRIGGER_CANCEL); + setAutoFlash(mPreviewRequestBuilder); + mCaptureSession.capture(mPreviewRequestBuilder.build(), mCaptureCallback, mCameraHandler); + // After this, the ic_launcher will go back to the normal state of preview. + mState = STATE_PREVIEW; + mCaptureSession.setRepeatingRequest(mPreviewRequest, mCaptureCallback, mCameraHandler); + } catch (CameraAccessException e) { + e.printStackTrace(); + } + } + + private void setAutoFlash(CaptureRequest.Builder requestBuilder) { + if (mFlashSupported) { + requestBuilder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_ON_AUTO_FLASH); + } + } + + protected void showToast(final String text) { + final Activity activity = getActivity(); + if (activity != null) { + activity.runOnUiThread(new Runnable() { + @Override + public void run() { + Toast.makeText(activity, text, Toast.LENGTH_SHORT).show(); + } + }); + } + } + + /** + * Configures the necessary {@link Matrix} transformation to `mTextureView`. + * This method should be called after the ic_launcher preview size is determined in + * setUpCameraOutputs and also the size of `mTextureView` is fixed. + * + * @param viewWidth The width of `mTextureView` + * @param viewHeight The height of `mTextureView` + */ + protected void configureTransform(int viewWidth, int viewHeight) { + Activity activity = getActivity(); + if (null == mTextureView || null == mPreviewSize || null == activity) { + return; + } + int rotation = activity.getWindowManager().getDefaultDisplay().getRotation(); + Matrix matrix = new Matrix(); + RectF viewRect = new RectF(0, 0, viewWidth, viewHeight); + RectF bufferRect = new RectF(0, 0, mPreviewSize.getHeight(), mPreviewSize.getWidth()); + float centerX = viewRect.centerX(); + float centerY = viewRect.centerY(); + if (Surface.ROTATION_90 == rotation || Surface.ROTATION_270 == rotation) { + bufferRect.offset(centerX - bufferRect.centerX(), centerY - bufferRect.centerY()); + matrix.setRectToRect(viewRect, bufferRect, Matrix.ScaleToFit.FILL); + float scale = + Math.max((float) viewHeight / mPreviewSize.getHeight(), (float) viewWidth / mPreviewSize.getWidth()); + matrix.postScale(scale, scale, centerX, centerY); + matrix.postRotate(90 * (rotation - 2), centerX, centerY); + } else if (Surface.ROTATION_180 == rotation) { + matrix.postRotate(180, centerX, centerY); + } + mTextureView.setTransform(matrix); + } + + + /** + * Set preview image size and positioning. + * + * @param width + * @param height + * @param map StreamConfigurationMap, the manager of all output formats and sizes supported by the camera. + * @param largest The max size + */ + private void setPreviewSize(int width, int height, StreamConfigurationMap map, Size largest) { + // Find out if we need to swap dimension to get the preview size relative to sensor coordinate. + int displayRotation = getActivity().getWindowManager().getDefaultDisplay().getRotation(); + Log.d(TAG, "displayRotation: " + displayRotation); + + boolean swappedDimensions = false; + switch (displayRotation) { + case Surface.ROTATION_0: + case Surface.ROTATION_180: + if (mSensorOrientation == 90 || mSensorOrientation == 270) { + swappedDimensions = true; + } + break; + case Surface.ROTATION_90: + case Surface.ROTATION_270: + if (mSensorOrientation == 0 || mSensorOrientation == 180) { + swappedDimensions = true; + } + break; + default: + Log.e(TAG, "Display rotation is invalid: " + displayRotation); + } + + Point displaySize = new Point(); + getActivity().getWindowManager().getDefaultDisplay().getSize(displaySize); + int rotatedPreviewWidth = width; + int rotatedPreviewHeight = height; + int maxPreviewWidth = displaySize.x; + int maxPreviewHeight = displaySize.y; + + if (swappedDimensions) { + rotatedPreviewWidth = height; + rotatedPreviewHeight = width; + maxPreviewWidth = displaySize.y; + maxPreviewHeight = displaySize.x; + } + + if (maxPreviewWidth > MAX_PREVIEW_WIDTH) { + maxPreviewWidth = MAX_PREVIEW_WIDTH; + } + + if (maxPreviewHeight > MAX_PREVIEW_HEIGHT) { + maxPreviewHeight = MAX_PREVIEW_HEIGHT; + } + + // Danger, W.R.! Attempting to use too large a preview size could exceed the ic_launcher + // bus' bandwidth limitation, resulting in gorgeous previews but the storage of + // garbage capture data. + mPreviewSize = chooseOptimalSize(map.getOutputSizes(SurfaceTexture.class), rotatedPreviewWidth, + rotatedPreviewHeight, maxPreviewWidth, maxPreviewHeight, largest); + + // We fit the aspect ratio of TextureView to the size of preview we picked. + int orientation = getResources().getConfiguration().orientation;// manifest中方向已经写死 + if (orientation == Configuration.ORIENTATION_LANDSCAPE) { + mTextureView.setAspectRatio(mPreviewSize.getWidth(), mPreviewSize.getHeight()); + } else { + mTextureView.setAspectRatio(mPreviewSize.getHeight(), mPreviewSize.getWidth()); + } + } + + /** + * Given {@code choices} of {@code Size}s supported by a ic_launcher, choose the smallest one that + * is at least as large as the respective texture view size, and that is at most as large as the + * respective max size, and whose aspect ratio matches with the specified value. If such size + * doesn't exist, choose the largest one that is at most as large as the respective max size, + * and whose aspect ratio matches with the specified value. + * + * @param choices The list of sizes that the ic_launcher supports for the intended output + * class + * @param textureViewWidth The width of the texture view relative to sensor coordinate + * @param textureViewHeight The height of the texture view relative to sensor coordinate + * @param maxWidth The maximum width that can be chosen + * @param maxHeight The maximum height that can be chosen + * @param aspectRatio The aspect ratio + * @return The optimal {@code Size}, or an arbitrary one if none were big enough + */ + protected Size chooseOptimalSize(Size[] choices, int textureViewWidth, int textureViewHeight, int maxWidth, + int maxHeight, Size aspectRatio) { + + // Collect the supported resolutions that are at least as big as the preview Surface + List bigEnough = new ArrayList<>(); + // Collect the supported resolutions that are smaller than the preview Surface + List notBigEnough = new ArrayList<>(); + int w = aspectRatio.getWidth(); + int h = aspectRatio.getHeight(); + for (Size option : choices) { + if (option.getWidth() <= maxWidth && option.getHeight() <= maxHeight + && option.getHeight() == option.getWidth() * h / w) { + // if (option.getWidth() <= maxWidth && option.getHeight() <= maxHeight) { + if (option.getWidth() >= textureViewWidth && option.getHeight() >= textureViewHeight) { + bigEnough.add(option); + } else { + notBigEnough.add(option); + } + } + } + + if (bigEnough.size() > 0) { + return Collections.min(bigEnough, new CompareSizesByArea()); + } else if (notBigEnough.size() > 0) { + return Collections.max(notBigEnough, new CompareSizesByArea()); + } else { + Log.e(TAG, "Couldn't find any suitable preview size"); + return choices[0]; + } + } + + + /** + * Closes the current {@link CameraDevice}. + */ + private void closeCamera() { + try { + mCameraOpenCloseLock.acquire(); + if (null != mCaptureSession) { + mCaptureSession.close(); + mCaptureSession = null; + } + if (null != mCameraDevice) { + mCameraDevice.close(); + mCameraDevice = null; + } + if (null != mImageReader) { + mImageReader.close(); + mImageReader = null; + } + } catch (InterruptedException e) { + throw new RuntimeException("Interrupted while trying to lock ic_launcher closing.", e); + } finally { + mCameraOpenCloseLock.release(); + } + } + + private void stopBackgroundThread() { + isPreBackgroundThreadPause = true; + mCameraHandlerThread.quitSafely(); + mMindsporeHandlerThread.quitSafely(); + try { + mCameraHandlerThread.join(); + mCameraHandlerThread = null; + mCameraHandler.removeCallbacksAndMessages(null); + mCameraHandler = null; + + mMindsporeHandlerThread.join(); + mMindsporeHandlerThread = null; + mMindsporeHandler.removeCallbacksAndMessages(null); + mMindsporeHandler = null; + } catch (InterruptedException e) { + e.printStackTrace(); + } + } +} diff --git a/model_zoo/official/lite/scene_detection/app/src/main/java/com/mindspore/scene/widget/HorTextView.java b/model_zoo/official/lite/scene_detection/app/src/main/java/com/mindspore/scene/widget/HorTextView.java new file mode 100644 index 0000000000..fe504dbf25 --- /dev/null +++ b/model_zoo/official/lite/scene_detection/app/src/main/java/com/mindspore/scene/widget/HorTextView.java @@ -0,0 +1,62 @@ +/** + * Copyright 2020 Huawei Technologies Co., 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. + */ +package com.mindspore.scene.widget; + +import android.content.Context; +import android.util.AttributeSet; +import android.view.LayoutInflater; +import android.view.View; +import android.widget.LinearLayout; +import android.widget.TextView; + +import androidx.annotation.Nullable; + +import com.mindspore.scene.R; + +public class HorTextView extends LinearLayout { + private TextView tvLeftTitle, tvRightContent; + private View viewBottomLine; + + public HorTextView(Context context) { + this(context, null); + } + + public HorTextView(Context context, @Nullable AttributeSet attrs) { + this(context, attrs, 0); + } + + public HorTextView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + LayoutInflater.from(context).inflate(R.layout.layout_hor_text_view, this); + tvLeftTitle = findViewById(R.id.tv_left_title); + tvRightContent = findViewById(R.id.tv_right_content); + viewBottomLine = findViewById(R.id.view_bottom_line); + } + + + public void setLeftTitle(String title) { + tvLeftTitle.setText(title); + } + + public void setRightContent(String content) { + tvRightContent.setText(content); + } + + public void setBottomLineVisible(int isVisible) { + viewBottomLine.setVisibility(isVisible); + } + +} diff --git a/model_zoo/official/lite/scene_detection/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/model_zoo/official/lite/scene_detection/app/src/main/res/drawable-v24/ic_launcher_foreground.xml new file mode 100644 index 0000000000..2b068d1146 --- /dev/null +++ b/model_zoo/official/lite/scene_detection/app/src/main/res/drawable-v24/ic_launcher_foreground.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/model_zoo/official/lite/scene_detection/app/src/main/res/drawable/ic_launcher_background.xml b/model_zoo/official/lite/scene_detection/app/src/main/res/drawable/ic_launcher_background.xml new file mode 100644 index 0000000000..d5fccc538c --- /dev/null +++ b/model_zoo/official/lite/scene_detection/app/src/main/res/drawable/ic_launcher_background.xml @@ -0,0 +1,170 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/model_zoo/official/lite/scene_detection/app/src/main/res/drawable/rectangle.xml b/model_zoo/official/lite/scene_detection/app/src/main/res/drawable/rectangle.xml new file mode 100644 index 0000000000..b8f5d3559c --- /dev/null +++ b/model_zoo/official/lite/scene_detection/app/src/main/res/drawable/rectangle.xml @@ -0,0 +1,13 @@ + + + + + + \ No newline at end of file diff --git a/model_zoo/official/lite/scene_detection/app/src/main/res/drawable/switch_thumb.xml b/model_zoo/official/lite/scene_detection/app/src/main/res/drawable/switch_thumb.xml new file mode 100644 index 0000000000..ef6cfd2339 --- /dev/null +++ b/model_zoo/official/lite/scene_detection/app/src/main/res/drawable/switch_thumb.xml @@ -0,0 +1,8 @@ + + + + + + \ No newline at end of file diff --git a/model_zoo/official/lite/scene_detection/app/src/main/res/drawable/switch_track.xml b/model_zoo/official/lite/scene_detection/app/src/main/res/drawable/switch_track.xml new file mode 100644 index 0000000000..304fbfe8b9 --- /dev/null +++ b/model_zoo/official/lite/scene_detection/app/src/main/res/drawable/switch_track.xml @@ -0,0 +1,8 @@ + + + + + + \ No newline at end of file diff --git a/model_zoo/official/lite/scene_detection/app/src/main/res/layout/activity_camera.xml b/model_zoo/official/lite/scene_detection/app/src/main/res/layout/activity_camera.xml new file mode 100644 index 0000000000..c167db7938 --- /dev/null +++ b/model_zoo/official/lite/scene_detection/app/src/main/res/layout/activity_camera.xml @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + diff --git a/model_zoo/official/lite/scene_detection/app/src/main/res/layout/activity_test.xml b/model_zoo/official/lite/scene_detection/app/src/main/res/layout/activity_test.xml new file mode 100644 index 0000000000..8507a6c7ae --- /dev/null +++ b/model_zoo/official/lite/scene_detection/app/src/main/res/layout/activity_test.xml @@ -0,0 +1,12 @@ + + + + + \ No newline at end of file diff --git a/model_zoo/official/lite/scene_detection/app/src/main/res/layout/fragment_camera.xml b/model_zoo/official/lite/scene_detection/app/src/main/res/layout/fragment_camera.xml new file mode 100644 index 0000000000..8dcd998284 --- /dev/null +++ b/model_zoo/official/lite/scene_detection/app/src/main/res/layout/fragment_camera.xml @@ -0,0 +1,13 @@ + + + + + + diff --git a/model_zoo/official/lite/scene_detection/app/src/main/res/layout/layout_hor_text_view.xml b/model_zoo/official/lite/scene_detection/app/src/main/res/layout/layout_hor_text_view.xml new file mode 100644 index 0000000000..c0aafc9d13 --- /dev/null +++ b/model_zoo/official/lite/scene_detection/app/src/main/res/layout/layout_hor_text_view.xml @@ -0,0 +1,40 @@ + + + + + + + + + \ No newline at end of file diff --git a/model_zoo/official/lite/scene_detection/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/model_zoo/official/lite/scene_detection/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml new file mode 100644 index 0000000000..c9ad5f98f1 --- /dev/null +++ b/model_zoo/official/lite/scene_detection/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/model_zoo/official/lite/scene_detection/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/model_zoo/official/lite/scene_detection/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml new file mode 100644 index 0000000000..c9ad5f98f1 --- /dev/null +++ b/model_zoo/official/lite/scene_detection/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/model_zoo/official/lite/scene_detection/app/src/main/res/mipmap-hdpi/ic_launcher.png b/model_zoo/official/lite/scene_detection/app/src/main/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..ad551dcf1cbe832e9801f25e147679b728a79246 GIT binary patch literal 2527 zcmV<52_W`~P)PbEtD2a3-K@uo*29I z;e)q^H2Fr>D``b9U%rGiA%w@QCb>wE!Sdi%1OR z0;kdhv<+&zj`faU0slCGl170iM)e{t8X${9Ae=x#Cv8X|m`>atUKl`aW~zg#_~MGd zo*04MQ3AWZ6-c``F`hvJOA^=_#6DrXUU4n(26PbY7VB_D$qV@vSARzcE_B6@*WH9%N6*VQ|QZdJJK3o z%-Q$UbwW5xKqYdFd~byc#g7Wx#rhkn%RJyNfaX{&x~Qn*t&9r~2#8mGXK630&7*S$ z;gecAmM!oVPYgK8iDPs`bFoZ+GdWKXal_1Kk`@DB*-KxOTZn$YfkeXd@h|=Wvz46$b0X z)&T|3=3G4@YAs5ihkXA&sh$j`1o;BFEi(QX@gV_iOX^0eY0RaQ$CxpH8sO%DLQKq_ zyIljavi(x4s-8p4QBs)W=!fk1ywHHnIeP3aFyh&O9Z5Cn)Y>bz4UYuM^`qF5L_k-l zwzw|T8*Q!uU3GInW&#Lib{xcf!)Tk`KE!Dk$rbEyrNF`a0y)prX%|sv!N=Kpe4M36 zOx+Ot@>KQwH&fk=Huu=DHMt8P#u~9PwhMQkj(R8{0to8j2C~yNpgtZ8VeWINoPfAr zD(X~^H<_*Y`z-@D-O%H+8~v};lUA#?cRaUa8v$*&Y{Z63M%-$C;lY5Yo--Y;0rhb2 zbduBOU>S}3rOIygxJ(lL@0qYU(||8BZCus`{*$5Z))lZL4(zzrjSVqI{5jf)q{<=B z1tirI*iPrHv)lE|qK`8693Y$n+zvdnyl&HVzQFb@6aJmy#9nRl{@#o6;sTWE+Ec@5qEPQ?}38@yk1bR=aAB8GEOm z!ExxH)B46?8hV{j%6-Qqt64S!_D!m&&ayCoOkCyS@@89gtM6+c z-}hoZKt4b|Ky&=o@2!6;sF+s*>gnl4WaN2Rtv1LHyKo^IZEeqR|9%Df`kv1@xXQ{Z zbad!ZRaK4f@Uw`Bh{VH(E#3#{>C-ms*s&9tnOV^3O0ae7Hq_SEqrAKV7K;V&8 z?R*7!h4zyC?p)YKw4I21)i zI$XUPuK<^yQBzZ+d`@fYW5mYBAu%zT^;P8pxh){+fV_gey(XllrcVPD92}-7NA`LA z_=)12-EPPE^A{CorCLTtMwF>4Axc0A3CW6bLPIr*FJqtveA8GP;v3ySFh!CXm9V}bh}Gny|{TZM*&n^tWy*uos-i_qdChM)Pa(cQUnA9 zAt)$BQH_Lg=+F@bY-wp31_uWf2vT9P{n@j2R9Dxiw^Hiq^-FOvq&RUTs zkI4Z{?IUZcAbEW9n0y>Sn(`f5$vtIC+U?`7R!7-)vVG=?H}$>mL>^?b*_7$!OB8*X z^t%J-;yVCn{?BSK+4EWjO+F6Q)YLS81#zj?c>4o&<>lp3^9EE_R<>>OWQ(++TqyM@ zk7N!H4>KE2+#`LhuC8A3rVsW0i1sV)k!qzB)!-?z^~oO7bSF2^o?kiJNtq;G51tog~? z{PTsSt5>i7DeGU-eoK3w_B#)^_a}V$#i~`SekOf<>;G{e8pFM#aBF{{12Nyy90Aq?G*q3002ovPDHLkV1f>_;N$=R literal 0 HcmV?d00001 diff --git a/model_zoo/official/lite/scene_detection/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png b/model_zoo/official/lite/scene_detection/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png new file mode 100644 index 0000000000000000000000000000000000000000..cea70b6899274f284773af7238c7a0708cc61894 GIT binary patch literal 4378 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 A9RL6T literal 0 HcmV?d00001 diff --git a/model_zoo/official/lite/scene_detection/app/src/main/res/mipmap-hdpi/ic_launcher_round.png b/model_zoo/official/lite/scene_detection/app/src/main/res/mipmap-hdpi/ic_launcher_round.png new file mode 100644 index 0000000000000000000000000000000000000000..12602e9e7b70a988c28e122846fcf6881d6477ac GIT binary patch literal 4637 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 Tbj3@f00000NkvXXu0mjfC6n+Q literal 0 HcmV?d00001 diff --git a/model_zoo/official/lite/scene_detection/app/src/main/res/mipmap-mdpi/ic_launcher.png b/model_zoo/official/lite/scene_detection/app/src/main/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..534bc3b190c0ed1b85b242743357fc1259410075 GIT binary patch literal 1520 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 GM*Ii3(JZ(C literal 0 HcmV?d00001 diff --git a/model_zoo/official/lite/scene_detection/app/src/main/res/mipmap-mdpi/ic_launcher_round.png b/model_zoo/official/lite/scene_detection/app/src/main/res/mipmap-mdpi/ic_launcher_round.png new file mode 100644 index 0000000000000000000000000000000000000000..13d25d7dcb9b0be595242856b5feed76ccab935b GIT binary patch literal 2766 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 U#t$QGO8@`>07*qoM6N<$g1AghY5)KL literal 0 HcmV?d00001 diff --git a/model_zoo/official/lite/scene_detection/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/model_zoo/official/lite/scene_detection/app/src/main/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..ce4d40a73968ac2ecd2c3bb242f5440b184b867f GIT binary patch literal 3680 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 DP{6pe literal 0 HcmV?d00001 diff --git a/model_zoo/official/lite/scene_detection/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png b/model_zoo/official/lite/scene_detection/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png new file mode 100644 index 0000000000000000000000000000000000000000..674ae88e4d54c6b6eab8eece581c4fb5c228e32b GIT binary patch literal 6850 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 literal 0 HcmV?d00001 diff --git a/model_zoo/official/lite/scene_detection/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/model_zoo/official/lite/scene_detection/app/src/main/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..7c87876ea0630a0ca13e0246defa735809249bc4 GIT binary patch literal 6071 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

!vn97J>{7 zO<#71+mwHN1D}t)r%@ctXkT*4!SL-ds?MLwuejD=P`*d`K@O>fkUpKQcQbWY3 zpdeD#`=NTo*%oU}&y_uQmw9#$DY0Y46G|Z=IC_iZCgBfMA$ zZ2G9ezO%%pBE-_vl;_B6W88i6lSBICqrgDo(TNH3_wA}Om@|rx7PX}E3g4Dm!ejFl zhyEUK-v`ixSwvJ+PbaIKW7WEsm3~QAa&p*62w6AK9{rh$EHxPbJ~QG?D}O~v9xg?) zx28#mm3uDHzLh}3pFFXM5N&`x0Y~A)+^4lbrta=+A!omlAkYUnQBignVo@S0D(aQ! z2STZ8WEw<7#2#_-9Ndwhct)pq`U480#-L}a*%vR5uRxk9LK4kt8%*c^s{?Eo7gvk> zgN?Kcy9Wm}Hn-G>Z+5q~LL1I{)c=H?Da{nP(?kVq{fIs+OgK=$spJXZ_E%po^@@_U z78$zQPLwJjf{$2X5{|fQOS|wP55maE*y%t#sa@UOG>;m1kUx0!3kJ%8HBE{ptKF=J zj~_N8@{!Yzt+F&^z_p~ZO^?_yj^HSZt~DDEkA>EuoZC&^&ak$&wwS*^e$79>e|2g( zS?eQRx&UZvYjd3tQ^+G9hXPyU6{4Zgl`9#cFx#dBZ>j^j2d~s1hT1n$~H1Az3`HzEMR*c zI#MvmkoXp^7GL;cTnzj~%eYE(#i_3oou^h{R$>I~%m;6`9&V)NyI&)fmPF20PT5m% zTRRVA(Z!{Y%CKu-;JH#*L{weOc)_J^g@^3AkGD4ibv*lh^{9+jHdIh38Ve`o@cJS^ zs$7^H=?e6I#`4sr@kCw!zCfQwTY-m(FIj(cxfGU{Lm(8hBJn}*#PNepf1RhR zOk0!)P5F|y=&F>zT32=`{|N)u7OtK``cS&XD3Hzwu>VV#ZbP5_*Pt~w>xD-A+7@IxuT$X;Q`2luJ{N;v}1P13qu5Wmhs z^rI=)R-Ur?DjC>)xNJ{BJtp%;YST0w@h>#`4-@@IlCGiA^_%)1NjfwE`7Sm+zt1U8 zO4_vx@(u{NDxL#cG7s>XBqSu4G)u!`$aqSWhlj`I#p(XShqsS2WGYr0S@Ai_k^Tjl zl&mu4*;ZwP#=t8X{+oQ!cBx58IlmVguQupLs1#4|j~MS&dDOJ>c}^J@k9FwsCH``} z8D)QCWn3$@t*x`uy3ORTS+uisJ@8|Bd5;_9`}gAXw1*9Hjm5EMiZ%kDQtYDB zJ|uht*3Zs1%8pxp>Wem)jZ(|{@x<4!M?&_0X%qGS z?HL&G80hPBYifS1Zen60R~OIT5%nu%-oWlCgSIv6$d_G{G1u;_5hcpsKFOjGd=vsb zESRtg-c;t}<6G6uQ;lmQ&mIFYD~6nOl{Nkin(P&Ayx{Ek;T}WTt`hd zB-GpeGny3oE$A@latfV|S?T7>z970*5PYjROr-+<7UjmTN+-zU_$?XczxiFMpEmdE zp+a14%bDSywSSI(kE{mhC>)Nme2l-<4%qLS$3)Yn7bKhb$;byNKjd2uE%c2iuSCCL zJ^z{;DpcQdQh&do4QIC}$fMf0CbVPn;0bYI!7Jlzl-&9IT*dzcuJoc+M0upg+=%2;3*FYXnS9$!f^nnfTe*k*e BMiu}7 literal 0 HcmV?d00001 diff --git a/model_zoo/official/lite/scene_detection/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png b/model_zoo/official/lite/scene_detection/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png new file mode 100644 index 0000000000000000000000000000000000000000..d4b8095ea91305149c7fa1fd9950f40d99cd8ee4 GIT binary patch literal 10191 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 literal 0 HcmV?d00001 diff --git a/model_zoo/official/lite/scene_detection/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png b/model_zoo/official/lite/scene_detection/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png new file mode 100644 index 0000000000000000000000000000000000000000..2528822d4dffc4c9a0b414f533197a5eb0734a0f GIT binary patch literal 10977 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 bch3}6_!Z^E0PU9}M+mZ#N)i>HjQsu&-oj&1 literal 0 HcmV?d00001 diff --git a/model_zoo/official/lite/scene_detection/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/model_zoo/official/lite/scene_detection/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..cae0e3a3260f2b98a9831633ff4cceba9fc54e93 GIT binary patch literal 8641 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 D6ni4f literal 0 HcmV?d00001 diff --git a/model_zoo/official/lite/scene_detection/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png b/model_zoo/official/lite/scene_detection/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png new file mode 100644 index 0000000000000000000000000000000000000000..c1229997eb0df6dc6e437fe38aa90840c6b4ee60 GIT binary patch literal 14983 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 literal 0 HcmV?d00001 diff --git a/model_zoo/official/lite/scene_detection/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png b/model_zoo/official/lite/scene_detection/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png new file mode 100644 index 0000000000000000000000000000000000000000..24849e26b4669ea0426232e3ec3ee0f3565ef28b GIT binary patch literal 15849 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 literal 0 HcmV?d00001 diff --git a/model_zoo/official/lite/scene_detection/app/src/main/res/values/colors.xml b/model_zoo/official/lite/scene_detection/app/src/main/res/values/colors.xml new file mode 100644 index 0000000000..73bd50bbb2 --- /dev/null +++ b/model_zoo/official/lite/scene_detection/app/src/main/res/values/colors.xml @@ -0,0 +1,18 @@ + + + #6200EE + #3700B3 + #03DAC5 + + + #00D4EF + #03A9F4 + #769DDA + + #66000000 + + #ffffff + #000000 + #A69D9D + + \ No newline at end of file diff --git a/model_zoo/official/lite/scene_detection/app/src/main/res/values/dimens.xml b/model_zoo/official/lite/scene_detection/app/src/main/res/values/dimens.xml new file mode 100644 index 0000000000..d039c7f2c7 --- /dev/null +++ b/model_zoo/official/lite/scene_detection/app/src/main/res/values/dimens.xml @@ -0,0 +1,9 @@ + + + 15dp + 8dp + + 15dp + 6dp + 20sp + \ No newline at end of file diff --git a/model_zoo/official/lite/scene_detection/app/src/main/res/values/ic_launcher_background.xml b/model_zoo/official/lite/scene_detection/app/src/main/res/values/ic_launcher_background.xml new file mode 100644 index 0000000000..c5d5899fdf --- /dev/null +++ b/model_zoo/official/lite/scene_detection/app/src/main/res/values/ic_launcher_background.xml @@ -0,0 +1,4 @@ + + + #FFFFFF + \ No newline at end of file diff --git a/model_zoo/official/lite/scene_detection/app/src/main/res/values/strings.xml b/model_zoo/official/lite/scene_detection/app/src/main/res/values/strings.xml new file mode 100644 index 0000000000..b829c5b310 --- /dev/null +++ b/model_zoo/official/lite/scene_detection/app/src/main/res/values/strings.xml @@ -0,0 +1,30 @@ + + SceneDetection + 设置 + + This sample needs camera permission. + This device doesn\'t support Camera2 API. + 使用的google的camera2demo. + EXAMPLE + Add widget + + + TFL Classify + This device doesn\'t support Camera2 API. + GPU does not yet supported quantized models. + Model: + + Quantized_EfficientNet + Float_EfficientNet + Quantized_MobileNet + Float_MobileNet + + + Device: + + CPU + GPU + NNAPI + + + \ No newline at end of file diff --git a/model_zoo/official/lite/scene_detection/app/src/main/res/values/styles.xml b/model_zoo/official/lite/scene_detection/app/src/main/res/values/styles.xml new file mode 100644 index 0000000000..13f74a4612 --- /dev/null +++ b/model_zoo/official/lite/scene_detection/app/src/main/res/values/styles.xml @@ -0,0 +1,10 @@ + + + + + \ No newline at end of file diff --git a/model_zoo/official/lite/scene_detection/build.gradle b/model_zoo/official/lite/scene_detection/build.gradle new file mode 100644 index 0000000000..6754c23d52 --- /dev/null +++ b/model_zoo/official/lite/scene_detection/build.gradle @@ -0,0 +1,24 @@ +// Top-level build file where you can add configuration options common to all sub-projects/modules. +buildscript { + repositories { + google() + jcenter() + } + dependencies { + classpath "com.android.tools.build:gradle:4.0.1" + + // NOTE: Do not place your application dependencies here; they belong + // in the individual module build.gradle files + } +} + +allprojects { + repositories { + google() + jcenter() + } +} + +task clean(type: Delete) { + delete rootProject.buildDir +} \ No newline at end of file diff --git a/model_zoo/official/lite/scene_detection/gradle.properties b/model_zoo/official/lite/scene_detection/gradle.properties new file mode 100644 index 0000000000..f5020a3b37 --- /dev/null +++ b/model_zoo/official/lite/scene_detection/gradle.properties @@ -0,0 +1,20 @@ +# Project-wide Gradle settings. +# IDE (e.g. Android Studio) users: +# Gradle settings configured through the IDE *will override* +# any settings specified in this file. +# For more details on how to configure your build environment visit +# http://www.gradle.org/docs/current/userguide/build_environment.html +# Specifies the JVM arguments used for the daemon process. +# The setting is particularly useful for tweaking memory settings. +org.gradle.jvmargs=-Xmx2048m +# When configured, Gradle will run in incubating parallel mode. +# This option should only be used with decoupled projects. More details, visit +# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects +# org.gradle.parallel=true +# AndroidX package structure to make it clearer which packages are bundled with the +# Android operating system, and which are packaged with your app"s APK +# https://developer.android.com/topic/libraries/support-library/androidx-rn +android.useAndroidX=true +# Automatically convert third-party libraries to use AndroidX +android.enableJetifier=true +android.injected.testOnly=false \ No newline at end of file diff --git a/model_zoo/official/lite/scene_detection/gradle/wrapper/gradle-wrapper.jar b/model_zoo/official/lite/scene_detection/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..f6b961fd5a86aa5fbfe90f707c3138408be7c718 GIT binary patch literal 54329 zcmagFV|ZrKvM!pAZQHhO+qP}9lTNj?q^^Y^VFp)SH8qbSJ)2BQ2giqr}t zFG7D6)c?v~^Z#E_K}1nTQbJ9gQ9<%vVRAxVj)8FwL5_iTdUB>&m3fhE=kRWl;g`&m z!W5kh{WsV%fO*%je&j+Lv4xxK~zsEYQls$Q-p&dwID|A)!7uWtJF-=Tm1{V@#x*+kUI$=%KUuf2ka zjiZ{oiL1MXE2EjciJM!jrjFNwCh`~hL>iemrqwqnX?T*MX;U>>8yRcZb{Oy+VKZos zLiFKYPw=LcaaQt8tj=eoo3-@bG_342HQ%?jpgAE?KCLEHC+DmjxAfJ%Og^$dpC8Xw zAcp-)tfJm}BPNq_+6m4gBgBm3+CvmL>4|$2N$^Bz7W(}fz1?U-u;nE`+9`KCLuqg} zwNstNM!J4Uw|78&Y9~9>MLf56to!@qGkJw5Thx%zkzj%Ek9Nn1QA@8NBXbwyWC>9H z#EPwjMNYPigE>*Ofz)HfTF&%PFj$U6mCe-AFw$U%-L?~-+nSXHHKkdgC5KJRTF}`G zE_HNdrE}S0zf4j{r_f-V2imSqW?}3w-4=f@o@-q+cZgaAbZ((hn))@|eWWhcT2pLpTpL!;_5*vM=sRL8 zqU##{U#lJKuyqW^X$ETU5ETeEVzhU|1m1750#f}38_5N9)B_2|v@1hUu=Kt7-@dhA zq_`OMgW01n`%1dB*}C)qxC8q;?zPeF_r;>}%JYmlER_1CUbKa07+=TV45~symC*g8 zW-8(gag#cAOuM0B1xG8eTp5HGVLE}+gYTmK=`XVVV*U!>H`~j4+ROIQ+NkN$LY>h4 zqpwdeE_@AX@PL};e5vTn`Ro(EjHVf$;^oiA%@IBQq>R7_D>m2D4OwwEepkg}R_k*M zM-o;+P27087eb+%*+6vWFCo9UEGw>t&WI17Pe7QVuoAoGHdJ(TEQNlJOqnjZ8adCb zI`}op16D@v7UOEo%8E-~m?c8FL1utPYlg@m$q@q7%mQ4?OK1h%ODjTjFvqd!C z-PI?8qX8{a@6d&Lb_X+hKxCImb*3GFemm?W_du5_&EqRq!+H?5#xiX#w$eLti-?E$;Dhu`{R(o>LzM4CjO>ICf z&DMfES#FW7npnbcuqREgjPQM#gs6h>`av_oEWwOJZ2i2|D|0~pYd#WazE2Bbsa}X@ zu;(9fi~%!VcjK6)?_wMAW-YXJAR{QHxrD5g(ou9mR6LPSA4BRG1QSZT6A?kelP_g- zH(JQjLc!`H4N=oLw=f3{+WmPA*s8QEeEUf6Vg}@!xwnsnR0bl~^2GSa5vb!Yl&4!> zWb|KQUsC$lT=3A|7vM9+d;mq=@L%uWKwXiO9}a~gP4s_4Yohc!fKEgV7WbVo>2ITbE*i`a|V!^p@~^<={#?Gz57 zyPWeM2@p>D*FW#W5Q`1`#5NW62XduP1XNO(bhg&cX`-LYZa|m-**bu|>}S;3)eP8_ zpNTnTfm8 ze+7wDH3KJ95p)5tlwk`S7mbD`SqHnYD*6`;gpp8VdHDz%RR_~I_Ar>5)vE-Pgu7^Y z|9Px+>pi3!DV%E%4N;ii0U3VBd2ZJNUY1YC^-e+{DYq+l@cGtmu(H#Oh%ibUBOd?C z{y5jW3v=0eV0r@qMLgv1JjZC|cZ9l9Q)k1lLgm))UR@#FrJd>w^`+iy$c9F@ic-|q zVHe@S2UAnc5VY_U4253QJxm&Ip!XKP8WNcnx9^cQ;KH6PlW8%pSihSH2(@{2m_o+m zr((MvBja2ctg0d0&U5XTD;5?d?h%JcRJp{_1BQW1xu&BrA3(a4Fh9hon-ly$pyeHq zG&;6q?m%NJ36K1Sq_=fdP(4f{Hop;_G_(i?sPzvB zDM}>*(uOsY0I1j^{$yn3#U(;B*g4cy$-1DTOkh3P!LQ;lJlP%jY8}Nya=h8$XD~%Y zbV&HJ%eCD9nui-0cw!+n`V~p6VCRqh5fRX z8`GbdZ@73r7~myQLBW%db;+BI?c-a>Y)m-FW~M=1^|<21_Sh9RT3iGbO{o-hpN%d6 z7%++#WekoBOP^d0$$|5npPe>u3PLvX_gjH2x(?{&z{jJ2tAOWTznPxv-pAv<*V7r$ z6&glt>7CAClWz6FEi3bToz-soY^{ScrjwVPV51=>n->c(NJngMj6TyHty`bfkF1hc zkJS%A@cL~QV0-aK4>Id!9dh7>0IV;1J9(myDO+gv76L3NLMUm9XyPauvNu$S<)-|F zZS}(kK_WnB)Cl`U?jsdYfAV4nrgzIF@+%1U8$poW&h^c6>kCx3;||fS1_7JvQT~CV zQ8Js+!p)3oW>Df(-}uqC`Tcd%E7GdJ0p}kYj5j8NKMp(KUs9u7?jQ94C)}0rba($~ zqyBx$(1ae^HEDG`Zc@-rXk1cqc7v0wibOR4qpgRDt#>-*8N3P;uKV0CgJE2SP>#8h z=+;i_CGlv+B^+$5a}SicVaSeaNn29K`C&=}`=#Nj&WJP9Xhz4mVa<+yP6hkrq1vo= z1rX4qg8dc4pmEvq%NAkpMK>mf2g?tg_1k2%v}<3`$6~Wlq@ItJ*PhHPoEh1Yi>v57 z4k0JMO)*=S`tKvR5gb-(VTEo>5Y>DZJZzgR+j6{Y`kd|jCVrg!>2hVjz({kZR z`dLlKhoqT!aI8=S+fVp(5*Dn6RrbpyO~0+?fy;bm$0jmTN|t5i6rxqr4=O}dY+ROd zo9Et|x}!u*xi~>-y>!M^+f&jc;IAsGiM_^}+4|pHRn{LThFFpD{bZ|TA*wcGm}XV^ zr*C6~@^5X-*R%FrHIgo-hJTBcyQ|3QEj+cSqp#>&t`ZzB?cXM6S(lRQw$I2?m5=wd z78ki`R?%;o%VUhXH?Z#(uwAn9$m`npJ=cA+lHGk@T7qq_M6Zoy1Lm9E0UUysN)I_x zW__OAqvku^>`J&CB=ie@yNWsaFmem}#L3T(x?a`oZ+$;3O-icj2(5z72Hnj=9Z0w% z<2#q-R=>hig*(t0^v)eGq2DHC%GymE-_j1WwBVGoU=GORGjtaqr0BNigOCqyt;O(S zKG+DoBsZU~okF<7ahjS}bzwXxbAxFfQAk&O@>LsZMsZ`?N?|CDWM(vOm%B3CBPC3o z%2t@%H$fwur}SSnckUm0-k)mOtht`?nwsDz=2#v=RBPGg39i#%odKq{K^;bTD!6A9 zskz$}t)sU^=a#jLZP@I=bPo?f-L}wpMs{Tc!m7-bi!Ldqj3EA~V;4(dltJmTXqH0r z%HAWKGutEc9vOo3P6Q;JdC^YTnby->VZ6&X8f{obffZ??1(cm&L2h7q)*w**+sE6dG*;(H|_Q!WxU{g)CeoT z(KY&bv!Usc|m+Fqfmk;h&RNF|LWuNZ!+DdX*L=s-=_iH=@i` z?Z+Okq^cFO4}_n|G*!)Wl_i%qiMBaH8(WuXtgI7EO=M>=i_+;MDjf3aY~6S9w0K zUuDO7O5Ta6+k40~xh~)D{=L&?Y0?c$s9cw*Ufe18)zzk%#ZY>Tr^|e%8KPb0ht`b( zuP@8#Ox@nQIqz9}AbW0RzE`Cf>39bOWz5N3qzS}ocxI=o$W|(nD~@EhW13Rj5nAp; zu2obEJa=kGC*#3=MkdkWy_%RKcN=?g$7!AZ8vBYKr$ePY(8aIQ&yRPlQ=mudv#q$q z4%WzAx=B{i)UdLFx4os?rZp6poShD7Vc&mSD@RdBJ=_m^&OlkEE1DFU@csgKcBifJ zz4N7+XEJhYzzO=86 z#%eBQZ$Nsf2+X0XPHUNmg#(sNt^NW1Y0|M(${e<0kW6f2q5M!2YE|hSEQ*X-%qo(V zHaFwyGZ0on=I{=fhe<=zo{=Og-_(to3?cvL4m6PymtNsdDINsBh8m>a%!5o3s(en) z=1I z6O+YNertC|OFNqd6P=$gMyvmfa`w~p9*gKDESFqNBy(~Zw3TFDYh}$iudn)9HxPBi zdokK@o~nu?%imcURr5Y~?6oo_JBe}t|pU5qjai|#JDyG=i^V~7+a{dEnO<(y>ahND#_X_fcEBNiZ)uc&%1HVtx8Ts z*H_Btvx^IhkfOB#{szN*n6;y05A>3eARDXslaE>tnLa>+`V&cgho?ED+&vv5KJszf zG4@G;7i;4_bVvZ>!mli3j7~tPgybF5|J6=Lt`u$D%X0l}#iY9nOXH@(%FFJLtzb%p zzHfABnSs;v-9(&nzbZytLiqqDIWzn>JQDk#JULcE5CyPq_m#4QV!}3421haQ+LcfO*>r;rg6K|r#5Sh|y@h1ao%Cl)t*u`4 zMTP!deC?aL7uTxm5^nUv#q2vS-5QbBKP|drbDXS%erB>fYM84Kpk^au99-BQBZR z7CDynflrIAi&ahza+kUryju5LR_}-Z27g)jqOc(!Lx9y)e z{cYc&_r947s9pteaa4}dc|!$$N9+M38sUr7h(%@Ehq`4HJtTpA>B8CLNO__@%(F5d z`SmX5jbux6i#qc}xOhumzbAELh*Mfr2SW99=WNOZRZgoCU4A2|4i|ZVFQt6qEhH#B zK_9G;&h*LO6tB`5dXRSBF0hq0tk{2q__aCKXYkP#9n^)@cq}`&Lo)1KM{W+>5mSed zKp~=}$p7>~nK@va`vN{mYzWN1(tE=u2BZhga5(VtPKk(*TvE&zmn5vSbjo zZLVobTl%;t@6;4SsZ>5+U-XEGUZGG;+~|V(pE&qqrp_f~{_1h@5ZrNETqe{bt9ioZ z#Qn~gWCH!t#Ha^n&fT2?{`}D@s4?9kXj;E;lWV9Zw8_4yM0Qg-6YSsKgvQ*fF{#Pq z{=(nyV>#*`RloBVCs;Lp*R1PBIQOY=EK4CQa*BD0MsYcg=opP?8;xYQDSAJBeJpw5 zPBc_Ft9?;<0?pBhCmOtWU*pN*;CkjJ_}qVic`}V@$TwFi15!mF1*m2wVX+>5p%(+R zQ~JUW*zWkalde{90@2v+oVlkxOZFihE&ZJ){c?hX3L2@R7jk*xjYtHi=}qb+4B(XJ z$gYcNudR~4Kz_WRq8eS((>ALWCO)&R-MXE+YxDn9V#X{_H@j616<|P(8h(7z?q*r+ zmpqR#7+g$cT@e&(%_|ipI&A%9+47%30TLY(yuf&*knx1wNx|%*H^;YB%ftt%5>QM= z^i;*6_KTSRzQm%qz*>cK&EISvF^ovbS4|R%)zKhTH_2K>jP3mBGn5{95&G9^a#4|K zv+!>fIsR8z{^x4)FIr*cYT@Q4Z{y}};rLHL+atCgHbfX*;+k&37DIgENn&=k(*lKD zG;uL-KAdLn*JQ?@r6Q!0V$xXP=J2i~;_+i3|F;_En;oAMG|I-RX#FwnmU&G}w`7R{ z788CrR-g1DW4h_`&$Z`ctN~{A)Hv_-Bl!%+pfif8wN32rMD zJDs$eVWBYQx1&2sCdB0!vU5~uf)=vy*{}t{2VBpcz<+~h0wb7F3?V^44*&83Z2#F` z32!rd4>uc63rQP$3lTH3zb-47IGR}f)8kZ4JvX#toIpXH`L%NnPDE~$QI1)0)|HS4 zVcITo$$oWWwCN@E-5h>N?Hua!N9CYb6f8vTFd>h3q5Jg-lCI6y%vu{Z_Uf z$MU{{^o~;nD_@m2|E{J)q;|BK7rx%`m``+OqZAqAVj-Dy+pD4-S3xK?($>wn5bi90CFAQ+ACd;&m6DQB8_o zjAq^=eUYc1o{#+p+ zn;K<)Pn*4u742P!;H^E3^Qu%2dM{2slouc$AN_3V^M7H_KY3H)#n7qd5_p~Za7zAj|s9{l)RdbV9e||_67`#Tu*c<8!I=zb@ z(MSvQ9;Wrkq6d)!9afh+G`!f$Ip!F<4ADdc*OY-y7BZMsau%y?EN6*hW4mOF%Q~bw z2==Z3^~?q<1GTeS>xGN-?CHZ7a#M4kDL zQxQr~1ZMzCSKFK5+32C%+C1kE#(2L=15AR!er7GKbp?Xd1qkkGipx5Q~FI-6zt< z*PTpeVI)Ngnnyaz5noIIgNZtb4bQdKG{Bs~&tf)?nM$a;7>r36djllw%hQxeCXeW^ z(i6@TEIuxD<2ulwLTt|&gZP%Ei+l!(%p5Yij6U(H#HMkqM8U$@OKB|5@vUiuY^d6X zW}fP3;Kps6051OEO(|JzmVU6SX(8q>*yf*x5QoxDK={PH^F?!VCzES_Qs>()_y|jg6LJlJWp;L zKM*g5DK7>W_*uv}{0WUB0>MHZ#oJZmO!b3MjEc}VhsLD~;E-qNNd?x7Q6~v zR=0$u>Zc2Xr}>x_5$-s#l!oz6I>W?lw;m9Ae{Tf9eMX;TI-Wf_mZ6sVrMnY#F}cDd z%CV*}fDsXUF7Vbw>PuDaGhu631+3|{xp<@Kl|%WxU+vuLlcrklMC!Aq+7n~I3cmQ! z`e3cA!XUEGdEPSu``&lZEKD1IKO(-VGvcnSc153m(i!8ohi`)N2n>U_BemYJ`uY>8B*Epj!oXRLV}XK}>D*^DHQ7?NY*&LJ9VSo`Ogi9J zGa;clWI8vIQqkngv2>xKd91K>?0`Sw;E&TMg&6dcd20|FcTsnUT7Yn{oI5V4@Ow~m zz#k~8TM!A9L7T!|colrC0P2WKZW7PNj_X4MfESbt<-soq*0LzShZ}fyUx!(xIIDwx zRHt^_GAWe0-Vm~bDZ(}XG%E+`XhKpPlMBo*5q_z$BGxYef8O!ToS8aT8pmjbPq)nV z%x*PF5ZuSHRJqJ!`5<4xC*xb2vC?7u1iljB_*iUGl6+yPyjn?F?GOF2_KW&gOkJ?w z3e^qc-te;zez`H$rsUCE0<@7PKGW?7sT1SPYWId|FJ8H`uEdNu4YJjre`8F*D}6Wh z|FQ`xf7yiphHIAkU&OYCn}w^ilY@o4larl?^M7&8YI;hzBIsX|i3UrLsx{QDKwCX< zy;a>yjfJ6!sz`NcVi+a!Fqk^VE^{6G53L?@Tif|j!3QZ0fk9QeUq8CWI;OmO-Hs+F zuZ4sHLA3{}LR2Qlyo+{d@?;`tpp6YB^BMoJt?&MHFY!JQwoa0nTSD+#Ku^4b{5SZVFwU9<~APYbaLO zu~Z)nS#dxI-5lmS-Bnw!(u15by(80LlC@|ynj{TzW)XcspC*}z0~8VRZq>#Z49G`I zgl|C#H&=}n-ajxfo{=pxPV(L*7g}gHET9b*s=cGV7VFa<;Htgjk>KyW@S!|z`lR1( zGSYkEl&@-bZ*d2WQ~hw3NpP=YNHF^XC{TMG$Gn+{b6pZn+5=<()>C!N^jncl0w6BJ zdHdnmSEGK5BlMeZD!v4t5m7ct7{k~$1Ie3GLFoHjAH*b?++s<|=yTF+^I&jT#zuMx z)MLhU+;LFk8bse|_{j+d*a=&cm2}M?*arjBPnfPgLwv)86D$6L zLJ0wPul7IenMvVAK$z^q5<^!)7aI|<&GGEbOr=E;UmGOIa}yO~EIr5xWU_(ol$&fa zR5E(2vB?S3EvJglTXdU#@qfDbCYs#82Yo^aZN6`{Ex#M)easBTe_J8utXu(fY1j|R z9o(sQbj$bKU{IjyhosYahY{63>}$9_+hWxB3j}VQkJ@2$D@vpeRSldU?&7I;qd2MF zSYmJ>zA(@N_iK}m*AMPIJG#Y&1KR)6`LJ83qg~`Do3v^B0>fU&wUx(qefuTgzFED{sJ65!iw{F2}1fQ3= ziFIP{kezQxmlx-!yo+sC4PEtG#K=5VM9YIN0z9~c4XTX?*4e@m;hFM!zVo>A`#566 z>f&3g94lJ{r)QJ5m7Xe3SLau_lOpL;A($wsjHR`;xTXgIiZ#o&vt~ zGR6KdU$FFbLfZCC3AEu$b`tj!9XgOGLSV=QPIYW zjI!hSP#?8pn0@ezuenOzoka8!8~jXTbiJ6+ZuItsWW03uzASFyn*zV2kIgPFR$Yzm zE<$cZlF>R8?Nr2_i?KiripBc+TGgJvG@vRTY2o?(_Di}D30!k&CT`>+7ry2!!iC*X z<@=U0_C#16=PN7bB39w+zPwDOHX}h20Ap);dx}kjXX0-QkRk=cr};GYsjSvyLZa-t zzHONWddi*)RDUH@RTAsGB_#&O+QJaaL+H<<9LLSE+nB@eGF1fALwjVOl8X_sdOYme z0lk!X=S(@25=TZHR7LlPp}fY~yNeThMIjD}pd9+q=j<_inh0$>mIzWVY+Z9p<{D^#0Xk+b_@eNSiR8;KzSZ#7lUsk~NGMcB8C2c=m2l5paHPq`q{S(kdA7Z1a zyfk2Y;w?^t`?@yC5Pz9&pzo}Hc#}mLgDmhKV|PJ3lKOY(Km@Fi2AV~CuET*YfUi}u zfInZnqDX(<#vaS<^fszuR=l)AbqG{}9{rnyx?PbZz3Pyu!eSJK`uwkJU!ORQXy4x83r!PNgOyD33}}L=>xX_93l6njNTuqL8J{l%*3FVn3MG4&Fv*`lBXZ z?=;kn6HTT^#SrPX-N)4EZiIZI!0ByXTWy;;J-Tht{jq1mjh`DSy7yGjHxIaY%*sTx zuy9#9CqE#qi>1misx=KRWm=qx4rk|}vd+LMY3M`ow8)}m$3Ggv&)Ri*ON+}<^P%T5 z_7JPVPfdM=Pv-oH<tecoE}(0O7|YZc*d8`Uv_M*3Rzv7$yZnJE6N_W=AQ3_BgU_TjA_T?a)U1csCmJ&YqMp-lJe`y6>N zt++Bi;ZMOD%%1c&-Q;bKsYg!SmS^#J@8UFY|G3!rtyaTFb!5@e(@l?1t(87ln8rG? z--$1)YC~vWnXiW3GXm`FNSyzu!m$qT=Eldf$sMl#PEfGmzQs^oUd=GIQfj(X=}dw+ zT*oa0*oS%@cLgvB&PKIQ=Ok?>x#c#dC#sQifgMwtAG^l3D9nIg(Zqi;D%807TtUUCL3_;kjyte#cAg?S%e4S2W>9^A(uy8Ss0Tc++ZTjJw1 z&Em2g!3lo@LlDyri(P^I8BPpn$RE7n*q9Q-c^>rfOMM6Pd5671I=ZBjAvpj8oIi$! zl0exNl(>NIiQpX~FRS9UgK|0l#s@#)p4?^?XAz}Gjb1?4Qe4?j&cL$C8u}n)?A@YC zfmbSM`Hl5pQFwv$CQBF=_$Sq zxsV?BHI5bGZTk?B6B&KLdIN-40S426X3j_|ceLla*M3}3gx3(_7MVY1++4mzhH#7# zD>2gTHy*%i$~}mqc#gK83288SKp@y3wz1L_e8fF$Rb}ex+`(h)j}%~Ld^3DUZkgez zOUNy^%>>HHE|-y$V@B}-M|_{h!vXpk01xaD%{l{oQ|~+^>rR*rv9iQen5t?{BHg|% zR`;S|KtUb!X<22RTBA4AAUM6#M?=w5VY-hEV)b`!y1^mPNEoy2K)a>OyA?Q~Q*&(O zRzQI~y_W=IPi?-OJX*&&8dvY0zWM2%yXdFI!D-n@6FsG)pEYdJbuA`g4yy;qrgR?G z8Mj7gv1oiWq)+_$GqqQ$(ZM@#|0j7})=#$S&hZwdoijFI4aCFLVI3tMH5fLreZ;KD zqA`)0l~D2tuIBYOy+LGw&hJ5OyE+@cnZ0L5+;yo2pIMdt@4$r^5Y!x7nHs{@>|W(MzJjATyWGNwZ^4j+EPU0RpAl-oTM@u{lx*i0^yyWPfHt6QwPvYpk9xFMWfBFt!+Gu6TlAmr zeQ#PX71vzN*_-xh&__N`IXv6`>CgV#eA_%e@7wjgkj8jlKzO~Ic6g$cT`^W{R{606 zCDP~+NVZ6DMO$jhL~#+!g*$T!XW63#(ngDn#Qwy71yj^gazS{e;3jGRM0HedGD@pt z?(ln3pCUA(ekqAvvnKy0G@?-|-dh=eS%4Civ&c}s%wF@0K5Bltaq^2Os1n6Z3%?-Q zAlC4goQ&vK6TpgtzkHVt*1!tBYt-`|5HLV1V7*#45Vb+GACuU+QB&hZ=N_flPy0TY zR^HIrdskB#<$aU;HY(K{a3(OQa$0<9qH(oa)lg@Uf>M5g2W0U5 zk!JSlhrw8quBx9A>RJ6}=;W&wt@2E$7J=9SVHsdC?K(L(KACb#z)@C$xXD8^!7|uv zZh$6fkq)aoD}^79VqdJ!Nz-8$IrU(_-&^cHBI;4 z^$B+1aPe|LG)C55LjP;jab{dTf$0~xbXS9!!QdcmDYLbL^jvxu2y*qnx2%jbL%rB z{aP85qBJe#(&O~Prk%IJARcdEypZ)vah%ZZ%;Zk{eW(U)Bx7VlzgOi8)x z`rh4l`@l_Ada7z&yUK>ZF;i6YLGwI*Sg#Fk#Qr0Jg&VLax(nNN$u-XJ5=MsP3|(lEdIOJ7|(x3iY;ea)5#BW*mDV%^=8qOeYO&gIdJVuLLN3cFaN=xZtFB=b zH{l)PZl_j^u+qx@89}gAQW7ofb+k)QwX=aegihossZq*+@PlCpb$rpp>Cbk9UJO<~ zDjlXQ_Ig#W0zdD3&*ei(FwlN#3b%FSR%&M^ywF@Fr>d~do@-kIS$e%wkIVfJ|Ohh=zc zF&Rnic^|>@R%v?@jO}a9;nY3Qrg_!xC=ZWUcYiA5R+|2nsM*$+c$TOs6pm!}Z}dfM zGeBhMGWw3$6KZXav^>YNA=r6Es>p<6HRYcZY)z{>yasbC81A*G-le8~QoV;rtKnkx z;+os8BvEe?0A6W*a#dOudsv3aWs?d% z0oNngyVMjavLjtjiG`!007#?62ClTqqU$@kIY`=x^$2e>iqIy1>o|@Tw@)P)B8_1$r#6>DB_5 zmaOaoE~^9TolgDgooKFuEFB#klSF%9-~d2~_|kQ0Y{Ek=HH5yq9s zDq#1S551c`kSiWPZbweN^A4kWiP#Qg6er1}HcKv{fxb1*BULboD0fwfaNM_<55>qM zETZ8TJDO4V)=aPp_eQjX%||Ud<>wkIzvDlpNjqW>I}W!-j7M^TNe5JIFh#-}zAV!$ICOju8Kx)N z0vLtzDdy*rQN!7r>Xz7rLw8J-(GzQlYYVH$WK#F`i_i^qVlzTNAh>gBWKV@XC$T-` z3|kj#iCquDhiO7NKum07i|<-NuVsX}Q}mIP$jBJDMfUiaWR3c|F_kWBMw0_Sr|6h4 zk`_r5=0&rCR^*tOy$A8K;@|NqwncjZ>Y-75vlpxq%Cl3EgH`}^^~=u zoll6xxY@a>0f%Ddpi;=cY}fyG!K2N-dEyXXmUP5u){4VnyS^T4?pjN@Ot4zjL(Puw z_U#wMH2Z#8Pts{olG5Dy0tZj;N@;fHheu>YKYQU=4Bk|wcD9MbA`3O4bj$hNRHwzb zSLcG0SLV%zywdbuwl(^E_!@&)TdXge4O{MRWk2RKOt@!8E{$BU-AH(@4{gxs=YAz9LIob|Hzto0}9cWoz6Tp2x0&xi#$ zHh$dwO&UCR1Ob2w00-2eG7d4=cN(Y>0R#$q8?||q@iTi+7-w-xR%uMr&StFIthC<# zvK(aPduwuNB}oJUV8+Zl)%cnfsHI%4`;x6XW^UF^e4s3Z@S<&EV8?56Wya;HNs0E> z`$0dgRdiUz9RO9Au3RmYq>K#G=X%*_dUbSJHP`lSfBaN8t-~@F>)BL1RT*9I851A3 z<-+Gb#_QRX>~av#Ni<#zLswtu-c6{jGHR>wflhKLzC4P@b%8&~u)fosoNjk4r#GvC zlU#UU9&0Hv;d%g72Wq?Ym<&&vtA3AB##L}=ZjiTR4hh7J)e>ei} zt*u+>h%MwN`%3}b4wYpV=QwbY!jwfIj#{me)TDOG`?tI!%l=AwL2G@9I~}?_dA5g6 zCKgK(;6Q0&P&K21Tx~k=o6jwV{dI_G+Ba*Zts|Tl6q1zeC?iYJTb{hel*x>^wb|2RkHkU$!+S4OU4ZOKPZjV>9OVsqNnv5jK8TRAE$A&^yRwK zj-MJ3Pl?)KA~fq#*K~W0l4$0=8GRx^9+?w z!QT8*-)w|S^B0)ZeY5gZPI2G(QtQf?DjuK(s^$rMA!C%P22vynZY4SuOE=wX2f8$R z)A}mzJi4WJnZ`!bHG1=$lwaxm!GOnRbR15F$nRC-M*H<*VfF|pQw(;tbSfp({>9^5 zw_M1-SJ9eGF~m(0dvp*P8uaA0Yw+EkP-SWqu zqal$hK8SmM7#Mrs0@OD+%_J%H*bMyZiWAZdsIBj#lkZ!l2c&IpLu(5^T0Ge5PHzR} zn;TXs$+IQ_&;O~u=Jz+XE0wbOy`=6>m9JVG} zJ~Kp1e5m?K3x@@>!D)piw^eMIHjD4RebtR`|IlckplP1;r21wTi8v((KqNqn%2CB< zifaQc&T}*M&0i|LW^LgdjIaX|o~I$`owHolRqeH_CFrqCUCleN130&vH}dK|^kC>) z-r2P~mApHotL4dRX$25lIcRh_*kJaxi^%ZN5-GAAMOxfB!6flLPY-p&QzL9TE%ho( zRwftE3sy5<*^)qYzKkL|rE>n@hyr;xPqncY6QJ8125!MWr`UCWuC~A#G1AqF1@V$kv>@NBvN&2ygy*{QvxolkRRb%Ui zsmKROR%{*g*WjUUod@@cS^4eF^}yQ1>;WlGwOli z+Y$(8I`0(^d|w>{eaf!_BBM;NpCoeem2>J}82*!em=}}ymoXk>QEfJ>G(3LNA2-46 z5PGvjr)Xh9>aSe>vEzM*>xp{tJyZox1ZRl}QjcvX2TEgNc^(_-hir@Es>NySoa1g^ zFow_twnHdx(j?Q_3q51t3XI7YlJ4_q&(0#)&a+RUy{IcBq?)eaWo*=H2UUVIqtp&lW9JTJiP&u zw8+4vo~_IJXZIJb_U^&=GI1nSD%e;P!c{kZALNCm5c%%oF+I3DrA63_@4)(v4(t~JiddILp7jmoy+>cD~ivwoctFfEL zP*#2Rx?_&bCpX26MBgp^4G>@h`Hxc(lnqyj!*t>9sOBcXN(hTwEDpn^X{x!!gPX?1 z*uM$}cYRwHXuf+gYTB}gDTcw{TXSOUU$S?8BeP&sc!Lc{{pEv}x#ELX>6*ipI1#>8 zKes$bHjiJ1OygZge_ak^Hz#k;=od1wZ=o71ba7oClBMq>Uk6hVq|ePPt)@FM5bW$I z;d2Or@wBjbTyZj|;+iHp%Bo!Vy(X3YM-}lasMItEV_QrP-Kk_J4C>)L&I3Xxj=E?| zsAF(IfVQ4w+dRRnJ>)}o^3_012YYgFWE)5TT=l2657*L8_u1KC>Y-R{7w^S&A^X^U}h20jpS zQsdeaA#WIE*<8KG*oXc~$izYilTc#z{5xhpXmdT-YUnGh9v4c#lrHG6X82F2-t35} zB`jo$HjKe~E*W$=g|j&P>70_cI`GnOQ;Jp*JK#CT zuEGCn{8A@bC)~0%wsEv?O^hSZF*iqjO~_h|>xv>PO+?525Nw2472(yqS>(#R)D7O( zg)Zrj9n9$}=~b00=Wjf?E418qP-@8%MQ%PBiCTX=$B)e5cHFDu$LnOeJ~NC;xmOk# z>z&TbsK>Qzk)!88lNI8fOE2$Uxso^j*1fz>6Ot49y@=po)j4hbTIcVR`ePHpuJSfp zxaD^Dn3X}Na3@<_Pc>a;-|^Pon(>|ytG_+U^8j_JxP=_d>L$Hj?|0lz>_qQ#a|$+( z(x=Lipuc8p4^}1EQhI|TubffZvB~lu$zz9ao%T?%ZLyV5S9}cLeT?c} z>yCN9<04NRi~1oR)CiBakoNhY9BPnv)kw%*iv8vdr&&VgLGIs(-FbJ?d_gfbL2={- zBk4lkdPk~7+jIxd4{M(-W1AC_WcN&Oza@jZoj zaE*9Y;g83#m(OhA!w~LNfUJNUuRz*H-=$s*z+q+;snKPRm9EptejugC-@7-a-}Tz0 z@KHra#Y@OXK+KsaSN9WiGf?&jlZ!V7L||%KHP;SLksMFfjkeIMf<1e~t?!G3{n)H8 zQAlFY#QwfKuj;l@<$YDATAk;%PtD%B(0<|8>rXU< zJ66rkAVW_~Dj!7JGdGGi4NFuE?7ZafdMxIh65Sz7yQoA7fBZCE@WwysB=+`kT^LFX zz8#FlSA5)6FG9(qL3~A24mpzL@@2D#>0J7mMS1T*9UJ zvOq!!a(%IYY69+h45CE?(&v9H4FCr>gK0>mK~F}5RdOuH2{4|}k@5XpsX7+LZo^Qa4sH5`eUj>iffoBVm+ zz4Mtf`h?NW$*q1yr|}E&eNl)J``SZvTf6Qr*&S%tVv_OBpbjnA0&Vz#(;QmGiq-k! zgS0br4I&+^2mgA15*~Cd00cXLYOLA#Ep}_)eED>m+K@JTPr_|lSN}(OzFXQSBc6fM z@f-%2;1@BzhZa*LFV z-LrLmkmB%<<&jEURBEW>soaZ*rSIJNwaV%-RSaCZi4X)qYy^PxZ=oL?6N-5OGOMD2 z;q_JK?zkwQ@b3~ln&sDtT5SpW9a0q+5Gm|fpVY2|zqlNYBR}E5+ahgdj!CvK$Tlk0 z9g$5N;aar=CqMsudQV>yb4l@hN(9Jcc=1(|OHsqH6|g=K-WBd8GxZ`AkT?OO z-z_Ued-??Z*R4~L7jwJ%-`s~FK|qNAJ;EmIVDVpk{Lr7T4l{}vL)|GuUuswe9c5F| zv*5%u01hlv08?00Vpwyk*Q&&fY8k6MjOfpZfKa@F-^6d=Zv|0@&4_544RP5(s|4VPVP-f>%u(J@23BHqo2=zJ#v9g=F!cP((h zpt0|(s++ej?|$;2PE%+kc6JMmJjDW)3BXvBK!h!E`8Y&*7hS{c_Z?4SFP&Y<3evqf z9-ke+bSj$%Pk{CJlJbWwlBg^mEC^@%Ou?o>*|O)rl&`KIbHrjcpqsc$Zqt0^^F-gU2O=BusO+(Op}!jNzLMc zT;0YT%$@ClS%V+6lMTfhuzzxomoat=1H?1$5Ei7&M|gxo`~{UiV5w64Np6xV zVK^nL$)#^tjhCpTQMspXI({TW^U5h&Wi1Jl8g?P1YCV4=%ZYyjSo#5$SX&`r&1PyC zzc;uzCd)VTIih|8eNqFNeBMe#j_FS6rq81b>5?aXg+E#&$m++Gz9<+2)h=K(xtn}F ziV{rmu+Y>A)qvF}ms}4X^Isy!M&1%$E!rTO~5(p+8{U6#hWu>(Ll1}eD64Xa>~73A*538wry?v$vW z>^O#FRdbj(k0Nr&)U`Tl(4PI*%IV~;ZcI2z&rmq=(k^}zGOYZF3b2~Klpzd2eZJl> zB=MOLwI1{$RxQ7Y4e30&yOx?BvAvDkTBvWPpl4V8B7o>4SJn*+h1Ms&fHso%XLN5j z-zEwT%dTefp~)J_C8;Q6i$t!dnlh-!%haR1X_NuYUuP-)`IGWjwzAvp!9@h`kPZhf zwLwFk{m3arCdx8rD~K2`42mIN4}m%OQ|f)4kf%pL?Af5Ul<3M2fv>;nlhEPR8b)u} zIV*2-wyyD%%) zl$G@KrC#cUwoL?YdQyf9WH)@gWB{jd5w4evI& zOFF)p_D8>;3-N1z6mES!OPe>B^<;9xsh)){Cw$Vs-ez5nXS95NOr3s$IU;>VZSzKn zBvub8_J~I%(DozZW@{)Vp37-zevxMRZ8$8iRfwHmYvyjOxIOAF2FUngKj289!(uxY zaClWm!%x&teKmr^ABrvZ(ikx{{I-lEzw5&4t3P0eX%M~>$wG0ZjA4Mb&op+0$#SO_ z--R`>X!aqFu^F|a!{Up-iF(K+alKB{MNMs>e(i@Tpy+7Z-dK%IEjQFO(G+2mOb@BO zP>WHlS#fSQm0et)bG8^ZDScGnh-qRKIFz zfUdnk=m){ej0i(VBd@RLtRq3Ep=>&2zZ2%&vvf?Iex01hx1X!8U+?>ER;yJlR-2q4 z;Y@hzhEC=d+Le%=esE>OQ!Q|E%6yG3V_2*uh&_nguPcZ{q?DNq8h_2ahaP6=pP-+x zK!(ve(yfoYC+n(_+chiJ6N(ZaN+XSZ{|H{TR1J_s8x4jpis-Z-rlRvRK#U%SMJ(`C z?T2 zF(NNfO_&W%2roEC2j#v*(nRgl1X)V-USp-H|CwFNs?n@&vpRcj@W@xCJwR6@T!jt377?XjZ06=`d*MFyTdyvW!`mQm~t3luzYzvh^F zM|V}rO>IlBjZc}9Z zd$&!tthvr>5)m;5;96LWiAV0?t)7suqdh0cZis`^Pyg@?t>Ms~7{nCU;z`Xl+raSr zXpp=W1oHB*98s!Tpw=R5C)O{{Inl>9l7M*kq%#w9a$6N~v?BY2GKOVRkXYCgg*d

<5G2M1WZP5 zzqSuO91lJod(SBDDw<*sX(+F6Uq~YAeYV#2A;XQu_p=N5X+#cmu19Qk>QAnV=k!?wbk5I;tDWgFc}0NkvC*G=V+Yh1cyeJVq~9czZiDXe+S=VfL2g`LWo8om z$Y~FQc6MFjV-t1Y`^D9XMwY*U_re2R?&(O~68T&D4S{X`6JYU-pz=}ew-)V0AOUT1 zVOkHAB-8uBcRjLvz<9HS#a@X*Kc@|W)nyiSgi|u5$Md|P()%2(?olGg@ypoJwp6>m z*dnfjjWC>?_1p;%1brqZyDRR;8EntVA92EJ3ByOxj6a+bhPl z;a?m4rQAV1@QU^#M1HX)0+}A<7TCO`ZR_RzF}X9-M>cRLyN4C+lCk2)kT^3gN^`IT zNP~fAm(wyIoR+l^lQDA(e1Yv}&$I!n?&*p6?lZcQ+vGLLd~fM)qt}wsbf3r=tmVYe zl)ntf#E!P7wlakP9MXS7m0nsAmqxZ*)#j;M&0De`oNmFgi$ov#!`6^4)iQyxg5Iuj zjLAhzQ)r`^hf7`*1`Rh`X;LVBtDSz@0T?kkT1o!ijeyTGt5vc^Cd*tmNgiNo^EaWvaC8$e+nb_{W01j3%=1Y&92YacjCi>eNbwk%-gPQ@H-+4xskQ}f_c=jg^S-# zYFBDf)2?@5cy@^@FHK5$YdAK9cI;!?Jgd}25lOW%xbCJ>By3=HiK@1EM+I46A)Lsd zeT|ZH;KlCml=@;5+hfYf>QNOr^XNH%J-lvev)$Omy8MZ`!{`j>(J5cG&ZXXgv)TaF zg;cz99i$4CX_@3MIb?GL0s*8J=3`#P(jXF(_(6DXZjc@(@h&=M&JG)9&Te1?(^XMW zjjC_70|b=9hB6pKQi`S^Ls7JyJw^@P>Ko^&q8F&?>6i;#CbxUiLz1ZH4lNyd@QACd zu>{!sqjB!2Dg}pbAXD>d!3jW}=5aN0b;rw*W>*PAxm7D)aw(c*RX2@bTGEI|RRp}vw7;NR2wa;rXN{L{Q#=Fa z$x@ms6pqb>!8AuV(prv>|aU8oWV={C&$c zMa=p=CDNOC2tISZcd8~18GN5oTbKY+Vrq;3_obJlfSKRMk;Hdp1`y`&LNSOqeauR_ z^j*Ojl3Ohzb5-a49A8s|UnM*NM8tg}BJXdci5%h&;$afbmRpN0&~9rCnBA`#lG!p zc{(9Y?A0Y9yo?wSYn>iigf~KP$0*@bGZ>*YM4&D;@{<%Gg5^uUJGRrV4 z(aZOGB&{_0f*O=Oi0k{@8vN^BU>s3jJRS&CJOl3o|BE{FAA&a#2YYiX3pZz@|Go-F z|Fly;7eX2OTs>R}<`4RwpHFs9nwh)B28*o5qK1Ge=_^w0m`uJOv!=&!tzt#Save(C zgKU=Bsgql|`ui(e1KVxR`?>Dx>(rD1$iWp&m`v)3A!j5(6vBm*z|aKm*T*)mo(W;R zNGo2`KM!^SS7+*9YxTm6YMm_oSrLceqN*nDOAtagULuZl5Q<7mOnB@Hq&P|#9y{5B z!2x+2s<%Cv2Aa0+u{bjZXS);#IFPk(Ph-K7K?3i|4ro> zRbqJoiOEYo(Im^((r}U4b8nvo_>4<`)ut`24?ILnglT;Pd&U}$lV3U$F9#PD(O=yV zgNNA=GW|(E=&m_1;uaNmipQe?pon4{T=zK!N!2_CJL0E*R^XXIKf*wi!>@l}3_P9Z zF~JyMbW!+n-+>!u=A1ESxzkJy$DRuG+$oioG7(@Et|xVbJ#BCt;J43Nvj@MKvTxzy zMmjNuc#LXBxFAwIGZJk~^!q$*`FME}yKE8d1f5Mp}KHNq(@=Z8YxV}0@;YS~|SpGg$_jG7>_8WWYcVx#4SxpzlV9N4aO>K{c z$P?a_fyDzGX$Of3@ykvedGd<@-R;M^Shlj*SswJLD+j@hi_&_>6WZ}#AYLR0iWMK|A zH_NBeu(tMyG=6VO-=Pb>-Q#$F*or}KmEGg*-n?vWQREURdB#+6AvOj*I%!R-4E_2$ zU5n9m>RWs|Wr;h2DaO&mFBdDb-Z{APGQx$(L`if?C|njd*fC=rTS%{o69U|meRvu?N;Z|Y zbT|ojL>j;q*?xXmnHH#3R4O-59NV1j=uapkK7}6@Wo*^Nd#(;$iuGsb;H315xh3pl zHaJ>h-_$hdNl{+|Zb%DZH%ES;*P*v0#}g|vrKm9;j-9e1M4qX@zkl&5OiwnCz=tb6 zz<6HXD+rGIVpGtkb{Q^LIgExOm zz?I|oO9)!BOLW#krLmWvX5(k!h{i>ots*EhpvAE;06K|u_c~y{#b|UxQ*O@Ks=bca z^_F0a@61j3I(Ziv{xLb8AXQj3;R{f_l6a#H5ukg5rxwF9A$?Qp-Mo54`N-SKc}fWp z0T)-L@V$$&my;l#Ha{O@!fK4-FSA)L&3<${Hcwa7ue`=f&YsXY(NgeDU#sRlT3+9J z6;(^(sjSK@3?oMo$%L-nqy*E;3pb0nZLx6 z;h5)T$y8GXK1DS-F@bGun8|J(v-9o=42&nLJy#}M5D0T^5VWBNn$RpC zZzG6Bt66VY4_?W=PX$DMpKAI!d`INr) zkMB{XPQ<52rvWVQqgI0OL_NWxoe`xxw&X8yVftdODPj5|t}S6*VMqN$-h9)1MBe0N zYq?g0+e8fJCoAksr0af1)FYtz?Me!Cxn`gUx&|T;)695GG6HF7!Kg1zzRf_{VWv^bo81v4$?F6u2g|wxHc6eJQAg&V z#%0DnWm2Rmu71rPJ8#xFUNFC*V{+N_qqFH@gYRLZ6C?GAcVRi>^n3zQxORPG)$-B~ z%_oB?-%Zf7d*Fe;cf%tQwcGv2S?rD$Z&>QC2X^vwYjnr5pa5u#38cHCt4G3|efuci z@3z=#A13`+ztmp;%zjXwPY_aq-;isu*hecWWX_=Z8paSqq7;XYnUjK*T>c4~PR4W7 z#C*%_H&tfGx`Y$w7`dXvVhmovDnT>btmy~SLf>>~84jkoQ%cv=MMb+a{JV&t0+1`I z32g_Y@yDhKe|K^PevP~MiiVl{Ou7^Mt9{lOnXEQ`xY^6L8D$705GON{!1?1&YJEl#fTf5Z)da=yiEQ zGgtC-soFGOEBEB~ZF_{7b(76En>d}mI~XIwNw{e>=Fv)sgcw@qOsykWr?+qAOZSVrQfg}TNI ztKNG)1SRrAt6#Q?(me%)>&A_^DM`pL>J{2xu>xa$3d@90xR61TQDl@fu%_85DuUUA za9tn64?At;{`BAW6oykwntxHeDpXsV#{tmt5RqdN7LtcF4vR~_kZNT|wqyR#z^Xcd zFdymVRZvyLfTpBT>w9<)Ozv@;Yk@dOSVWbbtm^y@@C>?flP^EgQPAwsy75bveo=}T zFxl(f)s)j(0#N_>Or(xEuV(n$M+`#;Pc$1@OjXEJZumkaekVqgP_i}p`oTx;terTx zZpT+0dpUya2hqlf`SpXN{}>PfhajNk_J0`H|2<5E;U5Vh4F8er z;RxLSFgpGhkU>W?IwdW~NZTyOBrQ84H7_?gviIf71l`EETodG9a1!8e{jW?DpwjL? zGEM&eCzwoZt^P*8KHZ$B<%{I}>46IT%jJ3AnnB5P%D2E2Z_ z1M!vr#8r}1|KTqWA4%67ZdbMW2YJ81b(KF&SQ2L1Qn(y-=J${p?xLMx3W7*MK;LFQ z6Z`aU;;mTL4XrrE;HY*Rkh6N%?qviUGNAKiCB~!P}Z->IpO6E(gGd7I#eDuT7j|?nZ zK}I(EJ>$Kb&@338M~O+em9(L!+=0zBR;JAQesx|3?Ok90)D1aS9P?yTh6Poh8Cr4X zk3zc=f2rE7jj+aP7nUsr@~?^EGP>Q>h#NHS?F{Cn`g-gD<8F&dqOh-0sa%pfL`b+1 zUsF*4a~)KGb4te&K0}bE>z3yb8% zibb5Q%Sfiv7feb1r0tfmiMv z@^4XYwg@KZI=;`wC)`1jUA9Kv{HKe2t$WmRcR4y8)VAFjRi zaz&O7Y2tDmc5+SX(bj6yGHYk$dBkWc96u3u&F)2yEE~*i0F%t9Kg^L6MJSb&?wrXi zGSc;_rln$!^ybwYBeacEFRsVGq-&4uC{F)*Y;<0y7~USXswMo>j4?~5%Zm!m@i@-> zXzi82sa-vpU{6MFRktJy+E0j#w`f`>Lbog{zP|9~hg(r{RCa!uGe>Yl536cn$;ouH za#@8XMvS-kddc1`!1LVq;h57~zV`7IYR}pp3u!JtE6Q67 zq3H9ZUcWPm2V4IukS}MCHSdF0qg2@~ufNx9+VMjQP&exiG_u9TZAeAEj*jw($G)zL zq9%#v{wVyOAC4A~AF=dPX|M}MZV)s(qI9@aIK?Pe+~ch|>QYb+78lDF*Nxz2-vpRbtQ*F4$0fDbvNM#CCatgQ@z1+EZWrt z2dZfywXkiW=no5jus-92>gXn5rFQ-COvKyegmL=4+NPzw6o@a?wGE-1Bt;pCHe;34K%Z z-FnOb%!nH;)gX+!a3nCk?5(f1HaWZBMmmC@lc({dUah+E;NOros{?ui1zPC-Q0);w zEbJmdE$oU$AVGQPdm{?xxI_0CKNG$LbY*i?YRQ$(&;NiA#h@DCxC(U@AJ$Yt}}^xt-EC_ z4!;QlLkjvSOhdx!bR~W|Ezmuf6A#@T`2tsjkr>TvW*lFCMY>Na_v8+{Y|=MCu1P8y z89vPiH5+CKcG-5lzk0oY>~aJC_0+4rS@c@ZVKLAp`G-sJB$$)^4*A!B zmcf}lIw|VxV9NSoJ8Ag3CwN&d7`|@>&B|l9G8tXT^BDHOUPrtC70NgwN4${$k~d_4 zJ@eo6%YQnOgq$th?0{h`KnqYa$Nz@vlHw<%!C5du6<*j1nwquk=uY}B8r7f|lY+v7 zm|JU$US08ugor8E$h3wH$c&i~;guC|3-tqJy#T;v(g( zBZtPMSyv%jzf->435yM(-UfyHq_D=6;ouL4!ZoD+xI5uCM5ay2m)RPmm$I}h>()hS zO!0gzMxc`BPkUZ)WXaXam%1;)gedA7SM8~8yIy@6TPg!hR0=T>4$Zxd)j&P-pXeSF z9W`lg6@~YDhd19B9ETv(%er^Xp8Yj@AuFVR_8t*KS;6VHkEDKI#!@l!l3v6`W1`1~ zP{C@keuV4Q`Rjc08lx?zmT$e$!3esc9&$XZf4nRL(Z*@keUbk!GZi(2Bmyq*saOD? z3Q$V<*P-X1p2}aQmuMw9nSMbOzuASsxten7DKd6A@ftZ=NhJ(0IM|Jr<91uAul4JR zADqY^AOVT3a(NIxg|U;fyc#ZnSzw2cr}#a5lZ38>nP{05D)7~ad7JPhw!LqOwATXtRhK!w0X4HgS1i<%AxbFmGJx9?sEURV+S{k~g zGYF$IWSlQonq6}e;B(X(sIH|;52+(LYW}v_gBcp|x%rEAVB`5LXg_d5{Q5tMDu0_2 z|LOm$@K2?lrLNF=mr%YP|U-t)~9bqd+wHb4KuPmNK<}PK6e@aosGZK57=Zt+kcszVOSbe;`E^dN! ze7`ha3WUUU7(nS0{?@!}{0+-VO4A{7+nL~UOPW9_P(6^GL0h${SLtqG!} zKl~Ng5#@Sy?65wk9z*3SA`Dpd4b4T^@C8Fhd8O)k_4%0RZL5?#b~jmgU+0|DB%0Z) zql-cPC>A9HPjdOTpPC` zQwvF}uB5kG$Xr4XnaH#ruSjM*xG?_hT7y3G+8Ox`flzU^QIgb_>2&-f+XB6MDr-na zSi#S+c!ToK84<&m6sCiGTd^8pNdXo+$3^l3FL_E`0 z>8it5YIDxtTp2Tm(?}FX^w{fbfgh7>^8mtvN>9fWgFN_*a1P`Gz*dyOZF{OV7BC#j zQV=FQM5m>47xXgapI$WbPM5V`V<7J9tD)oz@d~MDoM`R^Y6-Na(lO~uvZlpu?;zw6 zVO1faor3dg#JEb5Q*gz4<W8tgC3nE2BG2jeIQs1)<{In&7hJ39x=;ih;CJDy)>0S1at*7n?Wr0ahYCpFjZ|@u91Zl7( zv;CSBRC65-6f+*JPf4p1UZ)k=XivKTX6_bWT~7V#rq0Xjas6hMO!HJN8GdpBKg_$B zwDHJF6;z?h<;GXFZan8W{XFNPpOj!(&I1`&kWO86p?Xz`a$`7qV7Xqev|7nn_lQuX ziGpU1MMYt&5dE2A62iX3;*0WzNB9*nSTzI%62A+N?f?;S>N@8M=|ef3gtQTIA*=yq zQAAjOqa!CkHOQo4?TsqrrsJLclXcP?dlAVv?v`}YUjo1Htt;6djP@NPFH+&p1I+f_ z)Y279{7OWomY8baT(4TAOlz1OyD{4P?(DGv3XyJTA2IXe=kqD)^h(@*E3{I~w;ws8 z)ZWv7E)pbEM zd3MOXRH3mQhks9 zv6{s;k0y5vrcjXaVfw8^>YyPo=oIqd5IGI{)+TZq5Z5O&hXAw%ZlL}^6FugH;-%vP zAaKFtt3i^ag226=f0YjzdPn6|4(C2sC5wHFX{7QF!tG1E-JFA`>eZ`}$ymcRJK?0c zN363o{&ir)QySOFY0vcu6)kX#;l??|7o{HBDVJN+17rt|w3;(C_1b>d;g9Gp=8YVl zYTtA52@!7AUEkTm@P&h#eg+F*lR zQ7iotZTcMR1frJ0*V@Hw__~CL>_~2H2cCtuzYIUD24=Cv!1j6s{QS!v=PzwQ(a0HS zBKx04KA}-Ue+%9d`?PG*hIij@54RDSQpA7|>qYVIrK_G6%6;#ZkR}NjUgmGju)2F`>|WJoljo)DJgZr4eo1k1i1+o z1D{>^RlpIY8OUaOEf5EBu%a&~c5aWnqM zxBpJq98f=%M^{4mm~5`CWl%)nFR64U{(chmST&2jp+-r z3675V<;Qi-kJud%oWnCLdaU-)xTnMM%rx%Jw6v@=J|Ir=4n-1Z23r-EVf91CGMGNz zb~wyv4V{H-hkr3j3WbGnComiqmS0vn?n?5v2`Vi>{Ip3OZUEPN7N8XeUtF)Ry6>y> zvn0BTLCiqGroFu|m2zG-;Xb6;W`UyLw)@v}H&(M}XCEVXZQoWF=Ykr5lX3XWwyNyF z#jHv)A*L~2BZ4lX?AlN3X#axMwOC)PoVy^6lCGse9bkGjb=qz%kDa6}MOmSwK`cVO zt(e*MW-x}XtU?GY5}9{MKhRhYOlLhJE5=ca+-RmO04^ z66z{40J=s=ey9OCdc(RCzy zd7Zr1%!y3}MG(D=wM_ebhXnJ@MLi7cImDkhm0y{d-Vm81j`0mbi4lF=eirlr)oW~a zCd?26&j^m4AeXEsIUXiTal)+SPM4)HX%%YWF1?(FV47BaA`h9m67S9x>hWMVHx~Hg z1meUYoLL(p@b3?x|9DgWeI|AJ`Ia84*P{Mb%H$ZRROouR4wZhOPX15=KiBMHl!^JnCt$Az`KiH^_d>cev&f zaG2>cWf$=A@&GP~DubsgYb|L~o)cn5h%2`i^!2)bzOTw2UR!>q5^r&2Vy}JaWFUQE04v>2;Z@ZPwXr?y&G(B^@&y zsd6kC=hHdKV>!NDLIj+3rgZJ|dF`%N$DNd;B)9BbiT9Ju^Wt%%u}SvfM^=|q-nxDG zuWCQG9e#~Q5cyf8@y76#kkR^}{c<_KnZ0QsZcAT|YLRo~&tU|N@BjxOuy`#>`X~Q< z?R?-Gsk$$!oo(BveQLlUrcL#eirhgBLh`qHEMg`+sR1`A=1QX7)ZLMRT+GBy?&mM8 zQG^z-!Oa&J-k7I(3_2#Q6Bg=NX<|@X&+YMIOzfEO2$6Mnh}YV!m!e^__{W@-CTprr zbdh3f=BeCD$gHwCrmwgM3LAv3!Mh$wM)~KWzp^w)Cu6roO7uUG5z*}i0_0j47}pK; ztN530`ScGatLOL06~zO)Qmuv`h!gq5l#wx(EliKe&rz-5qH(hb1*fB#B+q`9=jLp@ zOa2)>JTl7ovxMbrif`Xe9;+fqB1K#l=Dv!iT;xF zdkCvS>C5q|O;}ns3AgoE({Ua-zNT-9_5|P0iANmC6O76Sq_(AN?UeEQJ>#b54fi3k zFmh+P%b1x3^)0M;QxXLP!BZ^h|AhOde*{9A=f3|Xq*JAs^Y{eViF|=EBfS6L%k4ip zk+7M$gEKI3?bQg?H3zaE@;cyv9kv;cqK$VxQbFEsy^iM{XXW0@2|DOu$!-k zSFl}Y=jt-VaT>Cx*KQnHTyXt}f9XswFB9ibYh+k2J!ofO+nD?1iw@mwtrqI4_i?nE zhLkPp41ED62me}J<`3RN80#vjW;wt`pP?%oQ!oqy7`miL>d-35a=qotK$p{IzeSk# ze_$CFYp_zIkrPFVaW^s#U4xT1lI^A0IBe~Y<4uS%zSV=wcuLr%gQT=&5$&K*bwqx| zWzCMiz>7t^Et@9CRUm9E+@hy~sBpm9fri$sE1zgLU((1?Yg{N1Sars=DiW&~Zw=3I zi7y)&oTC?UWD2w97xQ&5vx zRXEBGeJ(I?Y}eR0_O{$~)bMJRTsNUPIfR!xU9PE7A>AMNr_wbrFK>&vVw=Y;RH zO$mlpmMsQ}-FQ2cSj7s7GpC+~^Q~dC?y>M}%!-3kq(F3hGWo9B-Gn02AwUgJ>Z-pKOaj zysJBQx{1>Va=*e@sLb2z&RmQ7ira;aBijM-xQ&cpR>X3wP^foXM~u1>sv9xOjzZpX z0K;EGouSYD~oQ&lAafj3~EaXfFShC+>VsRlEMa9cg9i zFxhCKO}K0ax6g4@DEA?dg{mo>s+~RPI^ybb^u--^nTF>**0l5R9pocwB?_K)BG_)S zyLb&k%XZhBVr7U$wlhMqwL)_r&&n%*N$}~qijbkfM|dIWP{MyLx}X&}ES?}7i;9bW zmTVK@zR)7kE2+L42Q`n4m0VVg5l5(W`SC9HsfrLZ=v%lpef=Gj)W59VTLe+Z$8T8i z4V%5+T0t8LnM&H>Rsm5C%qpWBFqgTwL{=_4mE{S3EnBXknM&u8n}A^IIM4$s3m(Rd z>zq=CP-!9p9es2C*)_hoL@tDYABn+o#*l;6@7;knWIyDrt5EuakO99S$}n((Fj4y} zD!VvuRzghcE{!s;jC*<_H$y6!6QpePo2A3ZbX*ZzRnQq*b%KK^NF^z96CHaWmzU@f z#j;y?X=UP&+YS3kZx7;{ zDA{9(wfz7GF`1A6iB6fnXu0?&d|^p|6)%3$aG0Uor~8o? z*e}u#qz7Ri?8Uxp4m_u{a@%bztvz-BzewR6bh*1Xp+G=tQGpcy|4V_&*aOqu|32CM zz3r*E8o8SNea2hYJpLQ-_}R&M9^%@AMx&`1H8aDx4j%-gE+baf2+9zI*+Pmt+v{39 zDZ3Ix_vPYSc;Y;yn68kW4CG>PE5RoaV0n@#eVmk?p$u&Fy&KDTy!f^Hy6&^-H*)#u zdrSCTJPJw?(hLf56%2;_3n|ujUSJOU8VPOTlDULwt0jS@j^t1WS z!n7dZIoT+|O9hFUUMbID4Ec$!cc($DuQWkocVRcYSikFeM&RZ=?BW)mG4?fh#)KVG zcJ!<=-8{&MdE)+}?C8s{k@l49I|Zwswy^ZN3;E!FKyglY~Aq?4m74P-0)sMTGXqd5(S<-(DjjM z&7dL-Mr8jhUCAG$5^mI<|%`;JI5FVUnNj!VO2?Jiqa|c2;4^n!R z`5KK0hyB*F4w%cJ@Un6GC{mY&r%g`OX|1w2$B7wxu97%<@~9>NlXYd9RMF2UM>(z0 zouu4*+u+1*k;+nFPk%ly!nuMBgH4sL5Z`@Rok&?Ef=JrTmvBAS1h?C0)ty5+yEFRz zY$G=coQtNmT@1O5uk#_MQM1&bPPnspy5#>=_7%WcEL*n$;sSAZcXxMpcXxLe;_mLA z5F_paad+bGZV*oh@8h0(|D2P!q# zTHjmiphJ=AazSeKQPkGOR-D8``LjzToyx{lfK-1CDD6M7?pMZOdLKFtjZaZMPk4}k zW)97Fh(Z+_Fqv(Q_CMH-YYi?fR5fBnz7KOt0*t^cxmDoIokc=+`o# zrud|^h_?KW=Gv%byo~(Ln@({?3gnd?DUf-j2J}|$Mk>mOB+1{ZQ8HgY#SA8END(Zw z3T+W)a&;OO54~m}ffemh^oZ!Vv;!O&yhL0~hs(p^(Yv=(3c+PzPXlS5W79Er8B1o* z`c`NyS{Zj_mKChj+q=w)B}K za*zzPhs?c^`EQ;keH{-OXdXJet1EsQ)7;{3eF!-t^4_Srg4(Ot7M*E~91gwnfhqaM zNR7dFaWm7MlDYWS*m}CH${o?+YgHiPC|4?X?`vV+ws&Hf1ZO-w@OGG^o4|`b{bLZj z&9l=aA-Y(L11!EvRjc3Zpxk7lc@yH1e$a}8$_-r$)5++`_eUr1+dTb@ zU~2P1HM#W8qiNN3b*=f+FfG1!rFxnNlGx{15}BTIHgxO>Cq4 z;#9H9YjH%>Z2frJDJ8=xq>Z@H%GxXosS@Z>cY9ppF+)e~t_hWXYlrO6)0p7NBMa`+ z^L>-#GTh;k_XnE)Cgy|0Dw;(c0* zSzW14ZXozu)|I@5mRFF1eO%JM=f~R1dkNpZM+Jh(?&Zje3NgM{2ezg1N`AQg5%+3Y z64PZ0rPq6;_)Pj-hyIOgH_Gh`1$j1!jhml7ksHA1`CH3FDKiHLz+~=^u@kUM{ilI5 z^FPiJ7mSrzBs9{HXi2{sFhl5AyqwUnU{sPcUD{3+l-ZHAQ)C;c$=g1bdoxeG(5N01 zZy=t8i{*w9m?Y>V;uE&Uy~iY{pY4AV3_N;RL_jT_QtLFx^KjcUy~q9KcLE3$QJ{!)@$@En{UGG7&}lc*5Kuc^780;7Bj;)X?1CSy*^^ zPP^M)Pr5R>mvp3_hmCtS?5;W^e@5BjE>Cs<`lHDxj<|gtOK4De?Sf0YuK5GX9G93i zMYB{8X|hw|T6HqCf7Cv&r8A$S@AcgG1cF&iJ5=%+x;3yB`!lQ}2Hr(DE8=LuNb~Vs z=FO&2pdc16nD$1QL7j+!U^XWTI?2qQKt3H8=beVTdHHa9=MiJ&tM1RRQ-=+vy!~iz zj3O{pyRhCQ+b(>jC*H)J)%Wq}p>;?@W*Eut@P&?VU+Sdw^4kE8lvX|6czf{l*~L;J zFm*V~UC;3oQY(ytD|D*%*uVrBB}BbAfjK&%S;z;7$w68(8PV_whC~yvkZmX)xD^s6 z{$1Q}q;99W?*YkD2*;)tRCS{q2s@JzlO~<8x9}X<0?hCD5vpydvOw#Z$2;$@cZkYrp83J0PsS~!CFtY%BP=yxG?<@#{7%2sy zOc&^FJxsUYN36kSY)d7W=*1-{7ghPAQAXwT7z+NlESlkUH&8ODlpc8iC*iQ^MAe(B z?*xO4i{zFz^G=^G#9MsLKIN64rRJykiuIVX5~0#vAyDWc9-=6BDNT_aggS2G{B>dD ze-B%d3b6iCfc5{@yz$>=@1kdK^tX9qh0=ocv@9$ai``a_ofxT=>X7_Y0`X}a^M?d# z%EG)4@`^Ej_=%0_J-{ga!gFtji_byY&Vk@T1c|ucNAr(JNr@)nCWj?QnCyvXg&?FW;S-VOmNL6^km_dqiVjJuIASVGSFEos@EVF7St$WE&Z%)`Q##+0 zjaZ=JI1G@0!?l|^+-ZrNd$WrHBi)DA0-Eke>dp=_XpV<%CO_Wf5kQx}5e<90dt>8k zAi00d0rQ821nA>B4JHN7U8Zz=0;9&U6LOTKOaC1FC8GgO&kc=_wHIOGycL@c*$`ce703t%>S}mvxEnD-V!;6c`2(p74V7D0No1Xxt`urE66$0(ThaAZ1YVG#QP$ zy~NN%kB*zhZ2Y!kjn826pw4bh)75*e!dse+2Db(;bN34Uq7bLpr47XTX{8UEeC?2i z*{$`3dP}32${8pF$!$2Vq^gY|#w+VA_|o(oWmQX8^iw#n_crb(K3{69*iU?<%C-%H zuKi)3M1BhJ@3VW>JA`M>L~5*_bxH@Euy@niFrI$82C1}fwR$p2E&ZYnu?jlS}u7W9AyfdXh2pM>78bIt3 z)JBh&XE@zA!kyCDfvZ1qN^np20c1u#%P6;6tU&dx0phT1l=(mw7`u!-0e=PxEjDds z9E}{E!7f9>jaCQhw)&2TtG-qiD)lD(4jQ!q{`x|8l&nmtHkdul# zy+CIF8lKbp9_w{;oR+jSLtTfE+B@tOd6h=QePP>rh4@~!8c;Hlg9m%%&?e`*Z?qz5-zLEWfi>`ord5uHF-s{^bexKAoMEV@9nU z^5nA{f{dW&g$)BAGfkq@r5D)jr%!Ven~Q58c!Kr;*Li#`4Bu_?BU0`Y`nVQGhNZk@ z!>Yr$+nB=`z#o2nR0)V3M7-eVLuY`z@6CT#OTUXKnxZn$fNLPv7w1y7eGE=Qv@Hey`n;`U=xEl|q@CCV^#l)s0ZfT+mUf z^(j5r4)L5i2jnHW4+!6Si3q_LdOLQi<^fu?6WdohIkn79=jf%Fs3JkeXwF(?_tcF? z?z#j6iXEd(wJy4|p6v?xNk-)iIf2oX5^^Y3q3ziw16p9C6B;{COXul%)`>nuUoM*q zzmr|NJ5n)+sF$!yH5zwp=iM1#ZR`O%L83tyog-qh1I z0%dcj{NUs?{myT~33H^(%0QOM>-$hGFeP;U$puxoJ>>o-%Lk*8X^rx1>j|LtH$*)>1C!Pv&gd16%`qw5LdOIUbkNhaBBTo}5iuE%K&ZV^ zAr_)kkeNKNYJRgjsR%vexa~&8qMrQYY}+RbZ)egRg9_$vkoyV|Nc&MH@8L)`&rpqd zXnVaI@~A;Z^c3+{x=xgdhnocA&OP6^rr@rTvCnhG6^tMox$ulw2U7NgUtW%|-5VeH z_qyd47}1?IbuKtqNbNx$HR`*+9o=8`%vM8&SIKbkX9&%TS++x z5|&6P<%=F$C?owUI`%uvUq^yW0>`>yz!|WjzsoB9dT;2Dx8iSuK%%_XPgy0dTD4kd zDXF@&O_vBVVKQq(9YTClUPM30Sk7B!v7nOyV`XC!BA;BIVwphh+c)?5VJ^(C;GoQ$ zvBxr7_p*k$T%I1ke}`U&)$uf}I_T~#3XTi53OX)PoXVgxEcLJgZG^i47U&>LY(l%_ z;9vVDEtuMCyu2fqZeez|RbbIE7@)UtJvgAcVwVZNLccswxm+*L&w`&t=ttT=sv6Aq z!HouSc-24Y9;0q$>jX<1DnnGmAsP))- z^F~o99gHZw`S&Aw7e4id6Lg7kMk-e)B~=tZ!kE7sGTOJ)8@q}np@j7&7Sy{2`D^FH zI7aX%06vKsfJ168QnCM2=l|i>{I{%@gcr>ExM0Dw{PX6ozEuqFYEt z087%MKC;wVsMV}kIiuu9Zz9~H!21d!;Cu#b;hMDIP7nw3xSX~#?5#SSjyyg+Y@xh| z%(~fv3`0j#5CA2D8!M2TrG=8{%>YFr(j)I0DYlcz(2~92?G*?DeuoadkcjmZszH5& zKI@Lis%;RPJ8mNsbrxH@?J8Y2LaVjUIhRUiO-oqjy<&{2X~*f|)YxnUc6OU&5iac= z*^0qwD~L%FKiPmlzi&~a*9sk2$u<7Al=_`Ox^o2*kEv?p`#G(p(&i|ot8}T;8KLk- zPVf_4A9R`5^e`Om2LV*cK59EshYXse&IoByj}4WZaBomoHAPKqxRKbPcD`lMBI)g- zeMRY{gFaUuecSD6q!+b5(?vAnf>c`Z(8@RJy%Ulf?W~xB1dFAjw?CjSn$ph>st5bc zUac1aD_m6{l|$#g_v6;=32(mwpveQDWhmjR7{|B=$oBhz`7_g7qNp)n20|^^op3 zSfTdWV#Q>cb{CMKlWk91^;mHap{mk)o?udk$^Q^^u@&jd zfZ;)saW6{e*yoL6#0}oVPb2!}r{pAUYtn4{P~ES9tTfC5hXZnM{HrC8^=Pof{G4%Bh#8 ze~?C9m*|fd8MK;{L^!+wMy>=f^8b&y?yr6KnTq28$pFMBW9Oy7!oV5z|VM$s-cZ{I|Xf@}-)1=$V&x7e;9v81eiTi4O5-vs?^5pCKy2l>q);!MA zS!}M48l$scB~+Umz}7NbwyTn=rqt@`YtuwiQSMvCMFk2$83k50Q>OK5&fe*xCddIm)3D0I6vBU<+!3=6?(OhkO|b4fE_-j zimOzyfBB_*7*p8AmZi~X2bgVhyPy>KyGLAnOpou~sx9)S9%r)5dE%ADs4v%fFybDa_w*0?+>PsEHTbhKK^G=pFz z@IxLTCROWiKy*)cV3y%0FwrDvf53Ob_XuA1#tHbyn%Ko!1D#sdhBo`;VC*e1YlhrC z?*y3rp86m#qI|qeo8)_xH*G4q@70aXN|SP+6MQ!fJQqo1kwO_v7zqvUfU=Gwx`CR@ zRFb*O8+54%_8tS(ADh}-hUJzE`s*8wLI>1c4b@$al)l}^%GuIXjzBK!EWFO8W`>F^ ze7y#qPS0NI7*aU)g$_ziF(1ft;2<}6Hfz10cR8P}67FD=+}MfhrpOkF3hFhQu;Q1y zu%=jJHTr;0;oC94Hi@LAF5quAQ(rJG(uo%BiRQ@8U;nhX)j0i?0SL2g-A*YeAqF>RVCBOTrn{0R27vu}_S zS>tX4!#&U4W;ikTE!eFH+PKw%p+B(MR2I%n#+m0{#?qRP_tR@zpgCb=4rcrL!F=;A zh%EIF8m6%JG+qb&mEfuFTLHSxUAZEvC-+kvZKyX~SA3Umt`k}}c!5dy?-sLIM{h@> z!2=C)@nx>`;c9DdwZ&zeUc(7t<21D7qBj!|1^Mp1eZ6)PuvHx+poKSDCSBMFF{bKy z;9*&EyKitD99N}%mK8431rvbT+^%|O|HV23{;RhmS{$5tf!bIPoH9RKps`-EtoW5h zo6H_!s)Dl}2gCeGF6>aZtah9iLuGd19^z0*OryPNt{70RvJSM<#Ox9?HxGg04}b^f zrVEPceD%)#0)v5$YDE?f`73bQ6TA6wV;b^x*u2Ofe|S}+q{s5gr&m~4qGd!wOu|cZ||#h_u=k*fB;R6&k?FoM+c&J;ISg70h!J7*xGus)ta4veTdW)S^@sU@ z4$OBS=a~@F*V0ECic;ht4@?Jw<9kpjBgHfr2FDPykCCz|v2)`JxTH55?b3IM={@DU z!^|9nVO-R#s{`VHypWyH0%cs;0GO3E;It6W@0gX6wZ%W|Dzz&O%m17pa19db(er}C zUId1a4#I+Ou8E1MU$g=zo%g7K(=0Pn$)Rk z<4T2u<0rD)*j+tcy2XvY+0 z0d2pqm4)4lDewsAGThQi{2Kc3&C=|OQF!vOd#WB_`4gG3@inh-4>BoL!&#ij8bw7? zqjFRDaQz!J-YGitV4}$*$hg`vv%N)@#UdzHFI2E<&_@0Uw@h_ZHf}7)G;_NUD3@18 zH5;EtugNT0*RXVK*by>WS>jaDDfe!A61Da=VpIK?mcp^W?!1S2oah^wowRnrYjl~`lgP-mv$?yb6{{S55CCu{R z$9;`dyf0Y>uM1=XSl_$01Lc1Iy68IosWN8Q9Op=~I(F<0+_kKfgC*JggjxNgK6 z-3gQm6;sm?J&;bYe&(dx4BEjvq}b`OT^RqF$J4enP1YkeBK#>l1@-K`ajbn05`0J?0daOtnzh@l3^=BkedW1EahZlRp;`j*CaT;-21&f2wU z+Nh-gc4I36Cw+;3UAc<%ySb`#+c@5y ze~en&bYV|kn?Cn|@fqmGxgfz}U!98$=drjAkMi`43I4R%&H0GKEgx-=7PF}y`+j>r zg&JF`jomnu2G{%QV~Gf_-1gx<3Ky=Md9Q3VnK=;;u0lyTBCuf^aUi?+1+`4lLE6ZK zT#(Bf`5rmr(tgTbIt?yA@y`(Ar=f>-aZ}T~>G32EM%XyFvhn&@PWCm#-<&ApLDCXT zD#(9m|V(OOo7PmE@`vD4$S5;+9IQm19dd zvMEU`)E1_F+0o0-z>YCWqg0u8ciIknU#{q02{~YX)gc_u;8;i233D66pf(IkTDxeN zL=4z2)?S$TV9=ORVr&AkZMl<4tTh(v;Ix1{`pPVqI3n2ci&4Dg+W|N8TBUfZ*WeLF zqCH_1Q0W&f9T$lx3CFJ$o@Lz$99 zW!G&@zFHxTaP!o#z^~xgF|(vrHz8R_r9eo;TX9}2ZyjslrtH=%6O)?1?cL&BT(Amp zTGFU1%%#xl&6sH-UIJk_PGk_McFn7=%yd6tAjm|lnmr8bE2le3I~L{0(ffo}TQjyo zHZZI{-}{E4ohYTlZaS$blB!h$Jq^Rf#(ch}@S+Ww&$b);8+>g84IJcLU%B-W?+IY& zslcZIR>+U4v3O9RFEW;8NpCM0w1ROG84=WpKxQ^R`{=0MZCubg3st z48AyJNEvyxn-jCPTlTwp4EKvyEwD3e%kpdY?^BH0!3n6Eb57_L%J1=a*3>|k68A}v zaW`*4YitylfD}ua8V)vb79)N_Ixw_mpp}yJGbNu+5YYOP9K-7nf*jA1#<^rb4#AcS zKg%zCI)7cotx}L&J8Bqo8O1b0q;B1J#B5N5Z$Zq=wX~nQFgUfAE{@u0+EnmK{1hg> zC{vMfFLD;L8b4L+B51&LCm|scVLPe6h02rws@kGv@R+#IqE8>Xn8i|vRq_Z`V;x6F zNeot$1Zsu`lLS92QlLWF54za6vOEKGYQMdX($0JN*cjG7HP&qZ#3+bEN$8O_PfeAb z0R5;=zXac2IZ?fxu59?Nka;1lKm|;0)6|#RxkD05P5qz;*AL@ig!+f=lW5^Jbag%2 z%9@iM0ph$WFlxS!`p31t92z~TB}P-*CS+1Oo_g;7`6k(Jyj8m8U|Q3Sh7o-Icp4kV zK}%qri5>?%IPfamXIZ8pXbm-#{ytiam<{a5A+3dVP^xz!Pvirsq7Btv?*d7eYgx7q zWFxrzb3-%^lDgMc=Vl7^={=VDEKabTG?VWqOngE`Kt7hs236QKidsoeeUQ_^FzsXjprCDd@pW25rNx#6x&L6ZEpoX9Ffzv@olnH3rGOSW( zG-D|cV0Q~qJ>-L}NIyT?T-+x+wU%;+_GY{>t(l9dI%Ximm+Kmwhee;FK$%{dnF;C% zFjM2&$W68Sz#d*wtfX?*WIOXwT;P6NUw}IHdk|)fw*YnGa0rHx#paG!m=Y6GkS4VX zX`T$4eW9k1W!=q8!(#8A9h67fw))k_G)Q9~Q1e3f`aV@kbcSv7!priDUN}gX(iXTy zr$|kU0Vn%*ylmyDCO&G0Z3g>%JeEPFAW!5*H2Ydl>39w3W+gEUjL&vrRs(xGP{(ze zy7EMWF14@Qh>X>st8_029||TP0>7SG9on_xxeR2Iam3G~Em$}aGsNt$iES9zFa<3W zxtOF*!G@=PhfHO!=9pVPXMUVi30WmkPoy$02w}&6A7mF)G6-`~EVq5CwD2`9Zu`kd)52``#V zNSb`9dG~8(dooi1*-aSMf!fun7Sc`-C$-E(3BoSC$2kKrVcI!&yC*+ff2+C-@!AT_ zsvlAIV+%bRDfd{R*TMF><1&_a%@yZ0G0lg2K;F>7b+7A6pv3-S7qWIgx+Z?dt8}|S z>Qbb6x(+^aoV7FQ!Ph8|RUA6vXWQH*1$GJC+wXLXizNIc9p2yLzw9 z0=MdQ!{NnOwIICJc8!+Jp!zG}**r#E!<}&Te&}|B4q;U57$+pQI^}{qj669zMMe_I z&z0uUCqG%YwtUc8HVN7?0GHpu=bL7&{C>hcd5d(iFV{I5c~jpX&!(a{yS*4MEoYXh z*X4|Y@RVfn;piRm-C%b@{0R;aXrjBtvx^HO;6(>i*RnoG0Rtcd25BT6edxTNOgUAOjn zJ2)l{ipj8IP$KID2}*#F=M%^n&=bA0tY98@+2I+7~A&T-tw%W#3GV>GTmkHaqftl)#+E zMU*P(Rjo>8%P@_@#UNq(_L{}j(&-@1iY0TRizhiATJrnvwSH0v>lYfCI2ex^><3$q znzZgpW0JlQx?JB#0^^s-Js1}}wKh6f>(e%NrMwS`Q(FhazkZb|uyB@d%_9)_xb$6T zS*#-Bn)9gmobhAtvBmL+9H-+0_0US?g6^TOvE8f3v=z3o%NcPjOaf{5EMRnn(_z8- z$|m0D$FTU zDy;21v-#0i)9%_bZ7eo6B9@Q@&XprR&oKl4m>zIj-fiRy4Dqy@VVVs?rscG| zmzaDQ%>AQTi<^vYCmv#KOTd@l7#2VIpsj?nm_WfRZzJako`^uU%Nt3e;cU*y*|$7W zLm%fX#i_*HoUXu!NI$ey>BA<5HQB=|nRAwK!$L#n-Qz;~`zACig0PhAq#^5QS<8L2 zS3A+8%vbVMa7LOtTEM?55apt(DcWh#L}R^P2AY*c8B}Cx=6OFAdMPj1f>k3#^#+Hk z6uW1WJW&RlBRh*1DLb7mJ+KO>!t^t8hX1#_Wk`gjDio9)9IGbyCAGI4DJ~orK+YRv znjxRMtshZQHc$#Y-<-JOV6g^Cr@odj&Xw5B(FmI)*qJ9NHmIz_r{t)TxyB`L-%q5l ztzHgD;S6cw?7Atg*6E1!c6*gPRCb%t7D%z<(xm+K{%EJNiI2N0l8ud0Ch@_av_RW? zIr!nO4dL5466WslE6MsfMss7<)-S!e)2@r2o=7_W)OO`~CwklRWzHTfpB)_HYwgz=BzLhgZ9S<{nLBOwOIgJU=94uj6r!m>Xyn9>&xP+=5!zG_*yEoRgM0`aYts z^)&8(>z5C-QQ*o_s(8E4*?AX#S^0)aqB)OTyX>4BMy8h(cHjA8ji1PRlox@jB*1n? zDIfyDjzeg91Ao(;Q;KE@zei$}>EnrF6I}q&Xd=~&$WdDsyH0H7fJX|E+O~%LS*7^Q zYzZ4`pBdY{b7u72gZm6^5~O-57HwzwAz{)NvVaowo`X02tL3PpgLjwA`^i9F^vSpN zAqH3mRjG8VeJNHZ(1{%!XqC+)Z%D}58Qel{_weSEHoygT9pN@i zi=G;!Vj6XQk2tuJC>lza%ywz|`f7TIz*EN2Gdt!s199Dr4Tfd_%~fu8gXo~|ogt5Q zlEy_CXEe^BgsYM^o@L?s33WM14}7^T(kqohOX_iN@U?u;$l|rAvn{rwy>!yfZw13U zB@X9)qt&4;(C6dP?yRsoTMI!j-f1KC!<%~i1}u7yLXYn)(#a;Z6~r>hp~kfP));mi zcG%kdaB9H)z9M=H!f>kM->fTjRVOELNwh1amgKQT=I8J66kI)u_?0@$$~5f`u%;zl zC?pkr^p2Fe=J~WK%4ItSzKA+QHqJ@~m|Cduv=Q&-P8I5rQ-#G@bYH}YJr zUS(~(w|vKyU(T(*py}jTUp%I%{2!W!K(i$uvotcPjVddW z8_5HKY!oBCwGZcs-q`4Yt`Zk~>K?mcxg51wkZlX5e#B08I75F7#dgn5yf&Hrp`*%$ zQ;_Qg>TYRzBe$x=T(@WI9SC!ReSas9vDm(yslQjBJZde5z8GDU``r|N(MHcxNopGr z_}u39W_zwWDL*XYYt>#Xo!9kL#97|EAGyGBcRXtLTd59x%m=3i zL^9joWYA)HfL15l9%H?q`$mY27!<9$7GH(kxb%MV>`}hR4a?+*LH6aR{dzrX@?6X4 z3e`9L;cjqYb`cJmophbm(OX0b)!AFG?5`c#zLagzMW~o)?-!@e80lvk!p#&CD8u5_r&wp4O0zQ>y!k5U$h_K;rWGk=U)zX!#@Q%|9g*A zWx)qS1?fq6X<$mQTB$#3g;;5tHOYuAh;YKSBz%il3Ui6fPRv#v62SsrCdMRTav)Sg zTq1WOu&@v$Ey;@^+_!)cf|w_X<@RC>!=~+A1-65O0bOFYiH-)abINwZvFB;hJjL_$ z(9iScmUdMp2O$WW!520Hd0Q^Yj?DK%YgJD^ez$Z^?@9@Ab-=KgW@n8nC&88)TDC+E zlJM)L3r+ZJfZW_T$;Imq*#2<(j+FIk8ls7)WJ6CjUu#r5PoXxQs4b)mZza<8=v{o)VlLRM<9yw^0En#tXAj`Sylxvki{<1DPe^ zhjHwx^;c8tb?Vr$6ZB;$Ff$+3(*oinbwpN-#F)bTsXq@Sm?43MC#jQ~`F|twI=7oC zH4TJtu#;ngRA|Y~w5N=UfMZi?s0%ZmKUFTAye&6Y*y-%c1oD3yQ%IF2q2385Zl+=> zfz=o`Bedy|U;oxbyb^rB9ixG{Gb-{h$U0hVe`J;{ql!s_OJ_>>eoQn(G6h7+b^P48 zG<=Wg2;xGD-+d@UMZ!c;0>#3nws$9kIDkK13IfloGT@s14AY>&>>^#>`PT7GV$2Hp zN<{bN*ztlZu_%W=&3+=#3bE(mka6VoHEs~0BjZ$+=0`a@R$iaW)6>wp2w)=v2@|2d z%?34!+iOc5S@;AAC4hELWLH56RGxo4jw8MDMU0Wk2k_G}=Vo(>eRFo(g3@HjG|`H3 zm8b*dK=moM*oB<)*A$M9!!5o~4U``e)wxavm@O_R(`P|u%9^LGi(_%IF<6o;NLp*0 zKsfZ0#24GT8(G`i4UvoMh$^;kOhl?`0yNiyrC#HJH=tqOH^T_d<2Z+ zeN>Y9Zn!X4*DMCK^o75Zk2621bdmV7Rx@AX^alBG4%~;G_vUoxhfhFRlR&+3WwF^T zaL)8xPq|wCZoNT^>3J0K?e{J-kl+hu2rZI>CUv#-z&u@`hjeb+bBZ>bcciQVZ{SbW zez04s9oFEgc8Z+Kp{XFX`MVf-s&w9*dx7wLen(_@y34}Qz@&`$2+osqfxz4&d}{Ql z*g1ag00Gu+$C`0avds{Q65BfGsu9`_`dML*rX~hyWIe$T>CsPRoLIr%MTk3pJ^2zH1qub1MBzPG}PO;Wmav9w%F7?%l=xIf#LlP`! z_Nw;xBQY9anH5-c8A4mME}?{iewjz(Sq-29r{fV;Fc>fv%0!W@(+{={Xl-sJ6aMoc z)9Q+$bchoTGTyWU_oI19!)bD=IG&OImfy;VxNXoIO2hYEfO~MkE#IXTK(~?Z&!ae! zl8z{D&2PC$Q*OBC(rS~-*-GHNJ6AC$@eve>LB@Iq;jbBZj`wk4|LGogE||Ie=M5g= z9d`uYQ1^Sr_q2wmZE>w2WG)!F%^KiqyaDtIAct?}D~JP4shTJy5Bg+-(EA8aXaxbd~BKMtTf2iQ69jD1o* zZF9*S3!v-TdqwK$%&?91Sh2=e63;X0Lci@n7y3XOu2ofyL9^-I767eHESAq{m+@*r zbVDx!FQ|AjT;!bYsXv8ilQjy~Chiu&HNhFXt3R_6kMC8~ChEFqG@MWu#1Q1#=~#ix zrkHpJre_?#r=N0wv`-7cHHqU`phJX2M_^{H0~{VP79Dv{6YP)oA1&TSfKPEPZn2)G z9o{U1huZBLL;Tp_0OYw@+9z(jkrwIGdUrOhKJUbwy?WBt zlIK)*K0lQCY0qZ!$%1?3A#-S70F#YyUnmJF*`xx?aH5;gE5pe-15w)EB#nuf6B*c~ z8Z25NtY%6Wlb)bUA$w%HKs5$!Z*W?YKV-lE0@w^{4vw;J>=rn?u!rv$&eM+rpU6rc=j9>N2Op+C{D^mospMCjF2ZGhe4eADA#skp2EA26%p3Ex9wHW8l&Y@HX z$Qv)mHM}4*@M*#*ll5^hE9M^=q~eyWEai*P;4z<9ZYy!SlNE5nlc7gm;M&Q zKhKE4d*%A>^m0R?{N}y|i6i^k>^n4(wzKvlQeHq{l&JuFD~sTsdhs`(?lFK@Q{pU~ zb!M3c@*3IwN1RUOVjY5>uT+s-2QLWY z4T2>fiSn>>Fob+%B868-v9D@AfWr#M8eM6w#eAlhc#zk6jkLxGBGk`E3$!A@*am!R zy>29&ptYK6>cvP`b!syNp)Q$0UOW|-O@)8!?94GOYF_}+zlW%fCEl|Tep_zx05g6q z>tp47e-&R*hSNe{6{H!mL?+j$c^TXT{C&@T-xIaesNCl05 z9SLb@q&mSb)I{VXMaiWa3PWj=Ed!>*GwUe;^|uk=Pz$njNnfFY^MM>E?zqhf6^{}0 zx&~~dA5#}1ig~7HvOQ#;d9JZBeEQ+}-~v$at`m!(ai z$w(H&mWCC~;PQ1$%iuz3`>dWeb3_p}X>L2LK%2l59Tyc}4m0>9A!8rhoU3m>i2+hl zx?*qs*c^j}+WPs>&v1%1Ko8_ivAGIn@QK7A`hDz-Emkcgv2@wTbYhkiwX2l=xz*XG zaiNg+j4F-I>9v+LjosI-QECrtKjp&0T@xIMKVr+&)gyb4@b3y?2CA?=ooN zT#;rU86WLh(e@#mF*rk(NV-qSIZyr z$6!ZUmzD)%yO-ot`rw3rp6?*_l*@Z*IB0xn4|BGPWHNc-1ZUnNSMWmDh=EzWJRP`) zl%d%J613oXzh5;VY^XWJi{lB`f#u+ThvtP7 zq(HK<4>tw(=yzSBWtYO}XI`S1pMBe3!jFxBHIuwJ(@%zdQFi1Q_hU2eDuHqXte7Ki zOV55H2D6u#4oTfr7|u*3p75KF&jaLEDpxk!4*bhPc%mpfj)Us3XIG3 zIKMX^s^1wt8YK7Ky^UOG=w!o5e7W-<&c|fw2{;Q11vm@J{)@N3-p1U>!0~sKWHaL= zWV(0}1IIyt1p%=_-Fe5Kfzc71wg}`RDDntVZv;4!=&XXF-$48jS0Sc;eDy@Sg;+{A zFStc{dXT}kcIjMXb4F7MbX~2%i;UrBxm%qmLKb|2=?uPr00-$MEUIGR5+JG2l2Nq` zkM{{1RO_R)+8oQ6x&-^kCj)W8Z}TJjS*Wm4>hf+4#VJP)OBaDF%3pms7DclusBUw} z{ND#!*I6h85g6DzNvdAmnwWY{&+!KZM4DGzeHI?MR@+~|su0{y-5-nICz_MIT_#FE zm<5f3zlaKq!XyvY3H`9s&T};z!cK}G%;~!rpzk9-6L}4Rg7vXtKFsl}@sT#U#7)x- z7UWue5sa$R>N&b{J61&gvKcKlozH*;OjoDR+elkh|4bJ!_3AZNMOu?n9&|L>OTD78 z^i->ah_Mqc|Ev)KNDzfu1P3grBIM#%`QZqj5W{qu(HocQhjyS;UINoP`{J+DvV?|1 z_sw6Yr3z6%e7JKVDY<$P=M)dbk@~Yw9|2!Cw!io3%j92wTD!c^e9Vj+7VqXo3>u#= zv#M{HHJ=e$X5vQ>>ML?E8#UlmvJgTnb73{PSPTf*0)mcj6C z{KsfUbDK|F$E(k;ER%8HMdDi`=BfpZzP3cl5yJHu;v^o2FkHNk;cXc17tL8T!CsYI zfeZ6sw@;8ia|mY_AXjCS?kUfxdjDB28)~Tz1dGE|{VfBS9`0m2!m1yG?hR})er^pl4c@9Aq+|}ZlDaHL)K$O| z%9Jp-imI-Id0|(d5{v~w6mx)tUKfbuVD`xNt04Mry%M+jXzE>4(TBsx#&=@wT2Vh) z1yeEY&~17>0%P(eHP0HB^|7C+WJxQBTG$uyOWY@iDloRIb-Cf!p<{WQHR!422#F34 zG`v|#CJ^G}y9U*7jgTlD{D&y$Iv{6&PYG>{Ixg$pGk?lWrE#PJ8KunQC@}^6OP!|< zS;}p3to{S|uZz%kKe|;A0bL0XxPB&Q{J(9PyX`+Kr`k~r2}yP^ND{8!v7Q1&vtk& z2Y}l@J@{|2`oA%sxvM9i0V+8IXrZ4;tey)d;LZI70Kbim<4=WoTPZy=Yd|34v#$Kh zx|#YJ8s`J>W&jt#GcMpx84w2Z3ur-rK7gf-p5cE)=w1R2*|0mj12hvapuUWM0b~dG zMg9p8FmAZI@i{q~0@QuY44&mMUNXd7z>U58shA3o`p5eVLpq>+{(<3->DWuSFVZwC zxd50Uz(w~LxC4}bgag#q#NNokK@yNc+Q|Ap!u>Ddy+df>v;j@I12CDNN9do+0^n8p zMQs7X#+FVF0C5muGfN{r0|Nkql%BQT|K(DDNdR2pzM=_ea5+GO|J67`05AV92t@4l z0Qno0078PIHdaQGHZ~Scw!dzgqjK~3B7kf>BcP__&lLyU(cu3B^uLo%{j|Mb0NR)tkeT7Hcwp4O# z)yzu>cvG(d9~0a^)eZ;;%3ksk@F&1eEBje~ zW+-_s)&RgiweQc!otF>4%vbXKaOU41{!hw?|2`Ld3I8$&#WOsq>EG)1ANb!{N4z9@ zsU!bPG-~-bqCeIDzo^Q;gnucB{tRzm{ZH^Orphm2U+REA!*<*J6YQV83@&xoDl%#wnl5qcBqCcAF-vX5{30}(oJrnSH z{RY85hylK2dMOh2%oO1J8%)0?8TOL%rS8)+CsDv}aQ>4D)Jv+DLK)9gI^n-T^$)Tc zFPUD75qJm!Y-KBqj;JP4dV4 z`X{lGmn<)1IGz330}s}Jrjtf{(lnuuNHe5(ezA(pYa=1|Ff-LhPFK8 zyJh_b{yzu0yll6ZkpRzRjezyYivjyjW7QwO;@6X`m;2Apn2EK2!~7S}-*=;5*7K$B z`x(=!^?zgj(-`&ApZJXI09aDLXaT@<;CH=?fBOY5d|b~wBA@@p^K#nxr`)?i?SqTupI_PJ(A3cx`z~9mX_*)>L F{|7XC?P&l2 literal 0 HcmV?d00001 diff --git a/model_zoo/official/lite/scene_detection/gradle/wrapper/gradle-wrapper.properties b/model_zoo/official/lite/scene_detection/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000000..1d8635ad73 --- /dev/null +++ b/model_zoo/official/lite/scene_detection/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,6 @@ +#Tue Jul 28 10:28:05 CST 2020 +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-6.1.1-all.zip diff --git a/model_zoo/official/lite/scene_detection/gradlew b/model_zoo/official/lite/scene_detection/gradlew new file mode 100644 index 0000000000..cccdd3d517 --- /dev/null +++ b/model_zoo/official/lite/scene_detection/gradlew @@ -0,0 +1,172 @@ +#!/usr/bin/env sh + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS="" + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn () { + echo "$*" +} + +die () { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; + NONSTOP* ) + nonstop=true + ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin, switch paths to Windows format before running java +if $cygwin ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=$((i+1)) + done + case $i in + (0) set -- ;; + (1) set -- "$args0" ;; + (2) set -- "$args0" "$args1" ;; + (3) set -- "$args0" "$args1" "$args2" ;; + (4) set -- "$args0" "$args1" "$args2" "$args3" ;; + (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Escape application args +save () { + for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done + echo " " +} +APP_ARGS=$(save "$@") + +# Collect all arguments for the java command, following the shell quoting and substitution rules +eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" + +# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong +if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then + cd "$(dirname "$0")" +fi + +exec "$JAVACMD" "$@" diff --git a/model_zoo/official/lite/scene_detection/gradlew.bat b/model_zoo/official/lite/scene_detection/gradlew.bat new file mode 100644 index 0000000000..f9553162f1 --- /dev/null +++ b/model_zoo/official/lite/scene_detection/gradlew.bat @@ -0,0 +1,84 @@ +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS= + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto init + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto init + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:init +@rem Get command-line arguments, handling Windows variants + +if not "%OS%" == "Windows_NT" goto win9xME_args + +:win9xME_args +@rem Slurp the command line arguments. +set CMD_LINE_ARGS= +set _SKIP=2 + +:win9xME_args_slurp +if "x%~1" == "x" goto execute + +set CMD_LINE_ARGS=%* + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/model_zoo/official/lite/scene_detection/settings.gradle b/model_zoo/official/lite/scene_detection/settings.gradle new file mode 100644 index 0000000000..1e9becd467 --- /dev/null +++ b/model_zoo/official/lite/scene_detection/settings.gradle @@ -0,0 +1,2 @@ +include ':app' +rootProject.name = "Scene" \ No newline at end of file