ubuntu-settings-components-0.7+16.04.20160321.1/0000755000015600001650000000000012674023672021432 5ustar pbuserpbgroup00000000000000ubuntu-settings-components-0.7+16.04.20160321.1/cmake/0000755000015600001650000000000012674023672022512 5ustar pbuserpbgroup00000000000000ubuntu-settings-components-0.7+16.04.20160321.1/cmake/modules/0000755000015600001650000000000012674023672024162 5ustar pbuserpbgroup00000000000000ubuntu-settings-components-0.7+16.04.20160321.1/cmake/modules/EnableCoverageReport.cmake0000644000015600001650000001641412674023445031226 0ustar pbuserpbgroup00000000000000# - Creates a special coverage build type and target on GCC. # # Defines a function ENABLE_COVERAGE_REPORT which generates the coverage target # for selected targets. Optional arguments to this function are used to filter # unwanted results using globbing expressions. Moreover targets with tests for # the source code can be specified to trigger regenerating the report if the # test has changed # # ENABLE_COVERAGE_REPORT(TARGETS target... [FILTER filter...] [TESTS test targets...]) # # To generate a coverage report first build the project with # CMAKE_BUILD_TYPE=coverage, then call make test and afterwards make coverage. # # The coverage report is based on gcov. Depending on the availability of lcov # a HTML report will be generated and/or an XML report of gcovr is found. # The generated coverage target executes all found solutions. Special targets # exist to create e.g. only the xml report: coverage-xml. # # Copyright (C) 2010 by Johannes Wienke # # This program is free software; you can redistribute it # and/or modify it under the terms of the GNU General # Public License as published by the Free Software Foundation; # either version 2, or (at your option) # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # INCLUDE(ParseArguments) FIND_PACKAGE(Lcov) FIND_PACKAGE(gcovr) FUNCTION(ENABLE_COVERAGE_REPORT) # argument parsing PARSE_ARGUMENTS(ARG "FILTER;TARGETS;TESTS" "" ${ARGN}) SET(COVERAGE_RAW_FILE "${CMAKE_BINARY_DIR}/coverage.raw.info") SET(COVERAGE_FILTERED_FILE "${CMAKE_BINARY_DIR}/coverage.info") SET(COVERAGE_REPORT_DIR "${CMAKE_BINARY_DIR}/coveragereport") SET(COVERAGE_XML_FILE "${CMAKE_BINARY_DIR}/coverage.xml") SET(COVERAGE_XML_COMMAND_FILE "${CMAKE_BINARY_DIR}/coverage-xml.cmake") # decide if there is any tool to create coverage data SET(TOOL_FOUND FALSE) IF(LCOV_FOUND OR GCOVR_FOUND) SET(TOOL_FOUND TRUE) ENDIF() IF(NOT TOOL_FOUND) MESSAGE(STATUS "Cannot enable coverage targets because neither lcov nor gcovr are found.") ENDIF() STRING(TOLOWER "${CMAKE_BUILD_TYPE}" COVERAGE_BUILD_TYPE) IF(CMAKE_COMPILER_IS_GNUCXX AND TOOL_FOUND AND "${COVERAGE_BUILD_TYPE}" MATCHES "coverage") MESSAGE(STATUS "Coverage support enabled for targets: ${ARG_TARGETS}") # create coverage build type SET(CMAKE_CXX_FLAGS_COVERAGE ${CMAKE_CXX_FLAGS_DEBUG} PARENT_SCOPE) SET(CMAKE_C_FLAGS_COVERAGE ${CMAKE_C_FLAGS_DEBUG} PARENT_SCOPE) SET(CMAKE_CONFIGURATION_TYPES ${CMAKE_CONFIGURATION_TYPES} coverage PARENT_SCOPE) # instrument targets SET_TARGET_PROPERTIES(${ARG_TARGETS} PROPERTIES COMPILE_FLAGS --coverage LINK_FLAGS --coverage) # html report IF (LCOV_FOUND) MESSAGE(STATUS "Enabling HTML coverage report") # set up coverage target ADD_CUSTOM_COMMAND(OUTPUT ${COVERAGE_RAW_FILE} COMMAND ${LCOV_EXECUTABLE} -c -d ${CMAKE_BINARY_DIR} -o ${COVERAGE_RAW_FILE} WORKING_DIRECTORY ${CMAKE_BINARY_DIR} COMMENT "Collecting coverage data" DEPENDS ${ARG_TARGETS} ${ARG_TESTS} VERBATIM) # filter unwanted stuff LIST(LENGTH ARG_FILTER FILTER_LENGTH) IF(${FILTER_LENGTH} GREATER 0) SET(FILTER COMMAND ${LCOV_EXECUTABLE}) FOREACH(F ${ARG_FILTER}) SET(FILTER ${FILTER} -r ${COVERAGE_FILTERED_FILE} ${F}) ENDFOREACH() SET(FILTER ${FILTER} -o ${COVERAGE_FILTERED_FILE}) ELSE() SET(FILTER "") ENDIF() ADD_CUSTOM_COMMAND(OUTPUT ${COVERAGE_FILTERED_FILE} COMMAND ${LCOV_EXECUTABLE} -e ${COVERAGE_RAW_FILE} "${CMAKE_SOURCE_DIR}*" -o ${COVERAGE_FILTERED_FILE} ${FILTER} DEPENDS ${COVERAGE_RAW_FILE} COMMENT "Filtering recorded coverage data for project-relevant entries" VERBATIM) ADD_CUSTOM_COMMAND(OUTPUT ${COVERAGE_REPORT_DIR} COMMAND ${CMAKE_COMMAND} -E make_directory ${COVERAGE_REPORT_DIR} COMMAND ${GENHTML_EXECUTABLE} --legend --show-details -t "${PROJECT_NAME} test coverage" -o ${COVERAGE_REPORT_DIR} ${COVERAGE_FILTERED_FILE} DEPENDS ${COVERAGE_FILTERED_FILE} COMMENT "Generating HTML coverage report in ${COVERAGE_REPORT_DIR}" VERBATIM) ADD_CUSTOM_TARGET(coverage-html DEPENDS ${COVERAGE_REPORT_DIR}) ENDIF() # xml coverage report IF(GCOVR_FOUND) MESSAGE(STATUS "Enabling XML coverage report") # filter unwanted stuff SET(GCOV_FILTER "") LIST(LENGTH ARG_FILTER FILTER_LENGTH) IF(${FILTER_LENGTH} GREATER 0) FOREACH(F ${ARG_FILTER}) SET(GCOV_FILTER "${GCOV_FILTER} -e \"${F}\"") ENDFOREACH() ENDIF() # gcovr cannot write directly to a file so the execution needs to # be wrapped in a cmake file that generates the file output FILE(WRITE ${COVERAGE_XML_COMMAND_FILE} "SET(ENV{LANG} en)\n") FILE(APPEND ${COVERAGE_XML_COMMAND_FILE} "EXECUTE_PROCESS(COMMAND \"${GCOVR_EXECUTABLE}\" -x -r \"${CMAKE_SOURCE_DIR}\" ${GCOV_FILTER} OUTPUT_FILE \"${COVERAGE_XML_FILE}\" WORKING_DIRECTORY \"${CMAKE_BINARY_DIR}\")\n") ADD_CUSTOM_COMMAND(OUTPUT ${COVERAGE_XML_FILE} COMMAND ${CMAKE_COMMAND} ARGS -P ${COVERAGE_XML_COMMAND_FILE} COMMENT "Generating coverage XML report" VERBATIM) ADD_CUSTOM_TARGET(coverage-xml DEPENDS ${COVERAGE_XML_FILE}) ENDIF() # provide a global coverage target executing both steps if available SET(GLOBAL_DEPENDS "") IF(LCOV_FOUND) LIST(APPEND GLOBAL_DEPENDS ${COVERAGE_REPORT_DIR}) ENDIF() IF(GCOVR_FOUND) LIST(APPEND GLOBAL_DEPENDS ${COVERAGE_XML_FILE}) ENDIF() IF(LCOV_FOUND OR GCOVR_FOUND) ADD_CUSTOM_TARGET(coverage DEPENDS ${GLOBAL_DEPENDS}) ENDIF() ENDIF() # This gets rid of any stale .gcda files. Run this if a running a binary causes lots of messages about # about a "merge mismatch for summaries". ADD_CUSTOM_TARGET(clean-coverage COMMAND find ${CMAKE_BINARY_DIR} -name '*.gcda' | xargs rm -f) ENDFUNCTION() ubuntu-settings-components-0.7+16.04.20160321.1/cmake/modules/Findgcovr.cmake0000644000015600001650000000170212674023445027103 0ustar pbuserpbgroup00000000000000# - Find gcovr scrip # Will define: # # GCOVR_EXECUTABLE - the gcovr script # # Uses: # # GCOVR_ROOT - root to search for the script # # Copyright (C) 2011 by Johannes Wienke # # This program is free software; you can redistribute it # and/or modify it under the terms of the GNU General # Public License as published by the Free Software Foundation; # either version 2, or (at your option) # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # INCLUDE(FindPackageHandleStandardArgs) FIND_PROGRAM(GCOVR_EXECUTABLE gcovr HINTS ${GCOVR_ROOT} "${GCOVR_ROOT}/bin") FIND_PACKAGE_HANDLE_STANDARD_ARGS(gcovr DEFAULT_MSG GCOVR_EXECUTABLE) # only visible in advanced view MARK_AS_ADVANCED(GCOVR_EXECUTABLE) ubuntu-settings-components-0.7+16.04.20160321.1/cmake/modules/QmlTest.cmake0000644000015600001650000001167612674023445026566 0ustar pbuserpbgroup00000000000000# add_qml_test(path component_name [NO_ADD_TEST] [NO_TARGETS] # [TARGETS target1 [target2 [...]]] # [IMPORT_PATHS import_path1 [import_path2 [...]] # [PROPERTIES prop1 value1 [prop2 value2 [...]]]) # # NO_ADD_TEST will prevent adding the test to the "test" target # NO_TARGETS will prevent adding the test to any targets # TARGETS lists the targets the test should be added to # IMPORT_PATHS will pass those paths to qmltestrunner as "-import" arguments # PROPERTIES will be set on the target and test target. See CMake's set_target_properties() # # Two targets will be created: # - testComponentName - Runs the test with qmltestrunner # - tryComponentName - Runs the test with uqmlscene, for manual interaction # # To change/set a default value for the whole test suite, prior to calling add_qml_test, set: # qmltest_DEFAULT_NO_ADD_TEST (default: FALSE) # qmltest_DEFAULT_TARGETS # qmltest_DEFAULT_IMPORT_PATHS # qmltest_DEFAULT_PROPERTIES find_program(qmltestrunner_exe qmltestrunner) find_program(qmlscene_exe qmlscene) if(NOT qmltestrunner_exe) msg(FATAL_ERROR "Could not locate qmltestrunner.") endif() macro(add_manual_qml_test SUBPATH COMPONENT_NAME) set(options NO_ADD_TEST NO_TARGETS) set(multi_value_keywords IMPORT_PATHS TARGETS PROPERTIES ENVIRONMENT) cmake_parse_arguments(qmltest "${options}" "" "${multi_value_keywords}" ${ARGN}) set(qmlscene_TARGET try${COMPONENT_NAME}) set(qmltest_FILE ${SUBPATH}/tst_${COMPONENT_NAME}) set(qmlscene_imports "") if(NOT "${qmltest_IMPORT_PATHS}" STREQUAL "") foreach(IMPORT_PATH ${qmltest_IMPORT_PATHS}) list(APPEND qmlscene_imports "-I") list(APPEND qmlscene_imports ${IMPORT_PATH}) endforeach(IMPORT_PATH) elseif(NOT "${qmltest_DEFAULT_IMPORT_PATHS}" STREQUAL "") foreach(IMPORT_PATH ${qmltest_DEFAULT_IMPORT_PATHS}) list(APPEND qmlscene_imports "-I") list(APPEND qmlscene_imports ${IMPORT_PATH}) endforeach(IMPORT_PATH) endif() set(qmlscene_command env ${qmltest_ENVIRONMENT} ${qmlscene_exe} ${CMAKE_CURRENT_SOURCE_DIR}/${qmltest_FILE}.qml ${qmlscene_imports} ) add_custom_target(${qmlscene_TARGET} ${qmlscene_command}) endmacro(add_manual_qml_test) macro(add_qml_test SUBPATH COMPONENT_NAME) set(options NO_ADD_TEST NO_TARGETS) set(multi_value_keywords IMPORT_PATHS TARGETS PROPERTIES ENVIRONMENT) cmake_parse_arguments(qmltest "${options}" "" "${multi_value_keywords}" ${ARGN}) set(qmltest_TARGET test${COMPONENT_NAME}) set(qmltest_FILE ${SUBPATH}/tst_${COMPONENT_NAME}) set(qmltestrunner_imports "") if(NOT "${qmltest_IMPORT_PATHS}" STREQUAL "") foreach(IMPORT_PATH ${qmltest_IMPORT_PATHS}) list(APPEND qmltestrunner_imports "-import") list(APPEND qmltestrunner_imports ${IMPORT_PATH}) endforeach(IMPORT_PATH) elseif(NOT "${qmltest_DEFAULT_IMPORT_PATHS}" STREQUAL "") foreach(IMPORT_PATH ${qmltest_DEFAULT_IMPORT_PATHS}) list(APPEND qmltestrunner_imports "-import") list(APPEND qmltestrunner_imports ${IMPORT_PATH}) endforeach(IMPORT_PATH) endif() set(qmltest_command env ${qmltest_ENVIRONMENT} ${qmltestrunner_exe} -input ${CMAKE_CURRENT_SOURCE_DIR}/${qmltest_FILE}.qml ${qmltestrunner_imports} -o ${CMAKE_BINARY_DIR}/${qmltest_TARGET}.xml,xunitxml -o -,txt ) add_custom_target(${qmltest_TARGET} ${qmltest_command}) if(NOT "${qmltest_PROPERTIES}" STREQUAL "") set_target_properties(${qmltest_TARGET} PROPERTIES ${qmltest_PROPERTIES}) elseif(NOT "${qmltest_DEFAULT_PROPERTIES}" STREQUAL "") set_target_properties(${qmltest_TARGET} PROPERTIES ${qmltest_DEFAULT_PROPERTIES}) endif() if("${qmltest_NO_ADD_TEST}" STREQUAL FALSE AND NOT "${qmltest_DEFAULT_NO_ADD_TEST}" STREQUAL "TRUE") add_test(${qmltest_TARGET} ${qmltest_command}) if(NOT "${qmltest_UNPARSED_ARGUMENTS}" STREQUAL "") set_tests_properties(${qmltest_TARGET} PROPERTIES ${qmltest_PROPERTIES}) elseif(NOT "${qmltest_DEFAULT_PROPERTIES}" STREQUAL "") set_tests_properties(${qmltest_TARGET} PROPERTIES ${qmltest_DEFAULT_PROPERTIES}) endif() endif("${qmltest_NO_ADD_TEST}" STREQUAL FALSE AND NOT "${qmltest_DEFAULT_NO_ADD_TEST}" STREQUAL "TRUE") if("${qmltest_NO_TARGETS}" STREQUAL "FALSE") if(NOT "${qmltest_TARGETS}" STREQUAL "") foreach(TARGET ${qmltest_TARGETS}) add_dependencies(${TARGET} ${qmltest_TARGET}) endforeach(TARGET) elseif(NOT "${qmltest_DEFAULT_TARGETS}" STREQUAL "") foreach(TARGET ${qmltest_DEFAULT_TARGETS}) add_dependencies(${TARGET} ${qmltest_TARGET}) endforeach(TARGET) endif() endif("${qmltest_NO_TARGETS}" STREQUAL "FALSE") add_manual_qml_test(${SUBPATH} ${COMPONENT_NAME} ${ARGN}) endmacro(add_qml_test) ubuntu-settings-components-0.7+16.04.20160321.1/cmake/modules/ParseArguments.cmake0000644000015600001650000000340612674023445030125 0ustar pbuserpbgroup00000000000000# Parse arguments passed to a function into several lists separated by # upper-case identifiers and options that do not have an associated list e.g.: # # SET(arguments # hello OPTION3 world # LIST3 foo bar # OPTION2 # LIST1 fuz baz # ) # PARSE_ARGUMENTS(ARG "LIST1;LIST2;LIST3" "OPTION1;OPTION2;OPTION3" ${arguments}) # # results in 7 distinct variables: # * ARG_DEFAULT_ARGS: hello;world # * ARG_LIST1: fuz;baz # * ARG_LIST2: # * ARG_LIST3: foo;bar # * ARG_OPTION1: FALSE # * ARG_OPTION2: TRUE # * ARG_OPTION3: TRUE # # taken from http://www.cmake.org/Wiki/CMakeMacroParseArguments MACRO(PARSE_ARGUMENTS prefix arg_names option_names) SET(DEFAULT_ARGS) FOREACH(arg_name ${arg_names}) SET(${prefix}_${arg_name}) ENDFOREACH(arg_name) FOREACH(option ${option_names}) SET(${prefix}_${option} FALSE) ENDFOREACH(option) SET(current_arg_name DEFAULT_ARGS) SET(current_arg_list) FOREACH(arg ${ARGN}) SET(larg_names ${arg_names}) LIST(FIND larg_names "${arg}" is_arg_name) IF (is_arg_name GREATER -1) SET(${prefix}_${current_arg_name} ${current_arg_list}) SET(current_arg_name ${arg}) SET(current_arg_list) ELSE (is_arg_name GREATER -1) SET(loption_names ${option_names}) LIST(FIND loption_names "${arg}" is_option) IF (is_option GREATER -1) SET(${prefix}_${arg} TRUE) ELSE (is_option GREATER -1) SET(current_arg_list ${current_arg_list} ${arg}) ENDIF (is_option GREATER -1) ENDIF (is_arg_name GREATER -1) ENDFOREACH(arg) SET(${prefix}_${current_arg_name} ${current_arg_list}) ENDMACRO(PARSE_ARGUMENTS) ubuntu-settings-components-0.7+16.04.20160321.1/cmake/modules/FindLcov.cmake0000644000015600001650000000172012674023445026666 0ustar pbuserpbgroup00000000000000# - Find lcov # Will define: # # LCOV_EXECUTABLE - the lcov binary # GENHTML_EXECUTABLE - the genhtml executable # # Copyright (C) 2010 by Johannes Wienke # # This program is free software; you can redistribute it # and/or modify it under the terms of the GNU General # Public License as published by the Free Software Foundation; # either version 2, or (at your option) # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # INCLUDE(FindPackageHandleStandardArgs) FIND_PROGRAM(LCOV_EXECUTABLE lcov) FIND_PROGRAM(GENHTML_EXECUTABLE genhtml) FIND_PACKAGE_HANDLE_STANDARD_ARGS(Lcov DEFAULT_MSG LCOV_EXECUTABLE GENHTML_EXECUTABLE) # only visible in advanced view MARK_AS_ADVANCED(LCOV_EXECUTABLE GENHTML_EXECUTABLE) ubuntu-settings-components-0.7+16.04.20160321.1/cmake/modules/QmlPlugins.cmake0000644000015600001650000001265112674023445027262 0ustar pbuserpbgroup00000000000000# If you need to override the qmlplugindump binary, create the qmlplugin executable # target before loading this plugin. if(NOT TARGET qmlplugindump) find_program(qmlplugindump_exe qmlplugindump) if(NOT qmlplugindump_exe) msg(FATAL_ERROR "Could not locate qmlplugindump.") endif() add_executable(qmlplugindump IMPORTED) set_target_properties(qmlplugindump PROPERTIES IMPORTED_LOCATION ${qmlplugindump_exe}) endif() # # A custom target for building the qmltypes files manually. # if (NOT TARGET qmltypes) add_custom_target(qmltypes) endif() # Creates a target for copying resource files into build dir and optionally installing them. # # Files will be copied into ${BINARY_DIR}/${path} or ${CMAKE_CURRENT_BINARY_DIR} and installed # into ${DESTINATION}/${path}. # # Resource file names are matched against {*.{qml,js,jpg,png,sci,svg},qmldir}. # # export_qmlfiles(plugin path # [SEARCH_PATH path] # Path to search for resources in (defaults to ${CMAKE_CURRENT_SOURCE_DIR}) # [BINARY_DIR path] # [DESTINATION path] # [TARGET_PREFIX string] # Will be prefixed to the target name # ) # # Created target: # - ${TARGET_PREFIX}${plugin}-qmlfiles - Copies resources into the binary dir. macro(export_qmlfiles PLUGIN PATH) set(single SEARCH_PATH BINARY_DIR DESTINATION TARGET_PREFIX) cmake_parse_arguments(QMLFILES "" "${single}" "" ${ARGN}) if(NOT QMLFILES_SEARCH_PATH) set(QMLFILES_SEARCH_PATH ${CMAKE_CURRENT_SOURCE_DIR}) endif() if(QMLFILES_BINARY_DIR) set(qmlfiles_dir ${QMLFILES_BINARY_DIR}/${PATH}) else() set(qmlfiles_dir ${CMAKE_CURRENT_BINARY_DIR}) endif() file(GLOB QMLFILES ${QMLFILES_SEARCH_PATH}/*.qml ${QMLFILES_SEARCH_PATH}/*.js ${QMLFILES_SEARCH_PATH}/*.jpg ${QMLFILES_SEARCH_PATH}/*.png ${QMLFILES_SEARCH_PATH}/*.sci ${QMLFILES_SEARCH_PATH}/*.svg ${QMLFILES_SEARCH_PATH}/*.qmltypes ${QMLFILES_SEARCH_PATH}/qmldir ) execute_process(COMMAND ${CMAKE_COMMAND} -E make_directory ${qmlfiles_dir}) # copy the files add_custom_target(${QMLFILES_TARGET_PREFIX}${PLUGIN}-qmlfiles ALL COMMAND cp ${QMLFILES} ${qmlfiles_dir} DEPENDS ${QMLFILES} SOURCES ${QMLFILES} ) if(QMLFILES_DESTINATION) # install the qmlfiles file. install(FILES ${QMLFILES} DESTINATION ${QMLFILES_DESTINATION}/${PATH} ) endif() endmacro() # Creates a target for generating the typeinfo file for a QML plugin and/or installs the plugin # targets. # # Files will be copied into ${BINARY_DIR}/${path} or ${CMAKE_CURRENT_BINARY_DIR} and installed # into ${DESTINATION}/${path}. If you don't pass BINARY_DIR, it's assumed that current source # path ends with ${path}. # # The generated file will be named after the last segment of the plugin name, e.g. Foo.qmltypes. # # export_qmlplugin(plugin version path # [BINARY_DIR path] # [DESTINATION path] # [TARGET_PREFIX string] # Will be prefixed to the target name # [ENVIRONMENT string] # Will be added to qmlplugindump's env # [TARGETS target1 [target2 ...]] # Targets to depend on and install (e.g. the plugin shared object) # [NO_TYPES] # Do not create the qmltypes target # ) # # Created target: # - ${TARGET_PREFIX}${plugin}-qmltypes - Generates the qmltypes file in the source dir. # It will be made a dependency of the "qmltypes" target. macro(export_qmlplugin PLUGIN VERSION PATH) set(options NO_TYPES) set(single BINARY_DIR DESTINATION TARGET_PREFIX ENVIRONMENT) set(multi TARGETS) cmake_parse_arguments(QMLPLUGIN "${options}" "${single}" "${multi}" ${ARGN}) get_target_property(qmlplugindump_executable qmlplugindump LOCATION) if(QMLPLUGIN_BINARY_DIR) set(qmlplugin_dir ${QMLPLUGIN_BINARY_DIR}/${PATH}) else() # Find import path to point qmlplugindump at string(REGEX REPLACE "/${PATH}$" "" QMLPLUGIN_BINARY_DIR "${CMAKE_CURRENT_BINARY_DIR}") set(qmlplugin_dir ${CMAKE_CURRENT_BINARY_DIR}) endif() if(NOT QMLPLUGIN_NO_TYPES) # Relative path for the module string(REPLACE "${CMAKE_BINARY_DIR}/" "" QMLPLUGIN_MODULE_DIR "${QMLPLUGIN_BINARY_DIR}") # Find the last segment of the plugin name to use as qmltypes basename string(REGEX MATCH "[^.]+$" plugin_suffix ${PLUGIN}) set(target_prefix ${QMLPLUGIN_TARGET_PREFIX}${PLUGIN}) set(qmltypes_path ${CMAKE_CURRENT_SOURCE_DIR}/${plugin_suffix}.qmltypes) add_custom_target(${target_prefix}-qmltypes COMMAND env ${QMLPLUGIN_ENVIRONMENT} ${qmlplugindump_executable} -notrelocatable ${PLUGIN} ${VERSION} ${QMLPLUGIN_MODULE_DIR} > ${qmltypes_path} WORKING_DIRECTORY ${CMAKE_BINARY_DIR} ) add_dependencies(${target_prefix}-qmltypes ${target_prefix}-qmlfiles ${QMLPLUGIN_TARGETS}) add_dependencies(qmltypes ${target_prefix}-qmltypes) endif() set_target_properties(${QMLPLUGIN_TARGETS} PROPERTIES ARCHIVE_OUTPUT_DIRECTORY ${qmlplugin_dir} LIBRARY_OUTPUT_DIRECTORY ${qmlplugin_dir} RUNTIME_OUTPUT_DIRECTORY ${qmlplugin_dir} ) if (QMLPLUGIN_DESTINATION) # Install additional targets install(TARGETS ${QMLPLUGIN_TARGETS} DESTINATION ${QMLPLUGIN_DESTINATION}/${PATH} ) endif() endmacro() ubuntu-settings-components-0.7+16.04.20160321.1/plugins/0000755000015600001650000000000012674023672023113 5ustar pbuserpbgroup00000000000000ubuntu-settings-components-0.7+16.04.20160321.1/plugins/Ubuntu/0000755000015600001650000000000012674023672024375 5ustar pbuserpbgroup00000000000000ubuntu-settings-components-0.7+16.04.20160321.1/plugins/Ubuntu/Settings/0000755000015600001650000000000012674023672026175 5ustar pbuserpbgroup00000000000000ubuntu-settings-components-0.7+16.04.20160321.1/plugins/Ubuntu/Settings/Menus/0000755000015600001650000000000012674023672027264 5ustar pbuserpbgroup00000000000000ubuntu-settings-components-0.7+16.04.20160321.1/plugins/Ubuntu/Settings/Menus/CheckableMenu.qml0000644000015600001650000000470512674023445032471 0ustar pbuserpbgroup00000000000000/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Authors: * Nick Dedekind */ import QtQuick 2.4 import Ubuntu.Components 1.3 as Components import Ubuntu.Components.ListItems 1.3 as ListItem ListItem.Empty { id: menu property alias text: label.text property bool checked: false onClicked: menu.checked = !menu.checked Components.CheckBox { id: checkbox objectName: "checkbox" property bool enableCheckConnection: true anchors { left: parent.left leftMargin: menu.__contentsMargins verticalCenter: parent.verticalCenter } Component.onCompleted: { checked = menu.checked; } // FIXME : create a bi-directional feedback component onCheckedChanged: { if (!enableCheckConnection) { return; } var oldEnable = enableCheckConnection; enableCheckConnection = false; menu.checked = checked; menu.triggered(menu.checked); enableCheckConnection = oldEnable; } Connections { target: menu onCheckedChanged: { if (!checkbox.enableCheckConnection) { return; } var oldEnable = checkbox.enableCheckConnection; checkbox.enableCheckConnection = false; checkbox.checked = menu.checked; checkbox.enableCheckConnection = oldEnable; } } } Components.Label { id: label anchors { left: checkbox.right leftMargin: menu.__contentsMargins right: parent.right rightMargin: menu.__contentsMargins verticalCenter: parent.verticalCenter } elide: Text.ElideRight } } ubuntu-settings-components-0.7+16.04.20160321.1/plugins/Ubuntu/Settings/Menus/ModemInfoItem.qml0000644000015600001650000000736212674023445032501 0ustar pbuserpbgroup00000000000000/* * Copyright 2014,2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import QtQuick.Layouts 1.1 import Ubuntu.Components 1.3 import Ubuntu.Components.ListItems 1.3 as ListItem ListItem.Empty { id: menu implicitHeight: mainColumn.implicitHeight + mainColumn.anchors.topMargin + mainColumn.anchors.bottomMargin property alias statusIcon: statusIcon.name property alias statusText: labelStatus.text property alias connectivityIcon: iconConnectivity.name property alias simIdentifierText: labelSimIdentifier.text property bool locked : false property bool roaming: false signal unlock ColumnLayout { id: mainColumn anchors.fill: parent anchors.margins: menu.__contentsMargins spacing: units.gu(0.5) Label { id: labelSimIdentifier elide: Text.ElideRight visible: text !== "" font.bold: true opacity: menu.locked ? 0.6 : 1.0 } RowLayout { id: statusRow spacing: units.gu(1) height: labelStatus.height width: parent.width Label { id: labelStatus elide: Text.ElideRight opacity: 0.6 } RowLayout { spacing: 0.5 height: parent.height Icon { id: statusIcon color: theme.palette.normal.backgroundText Layout.preferredHeight: parent.height Layout.preferredWidth: Layout.preferredHeight visible: name !== "" } Icon { id: iconConnectivity color: theme.palette.normal.backgroundText Layout.preferredHeight: parent.height Layout.preferredWidth: Layout.preferredHeight visible: name !== "" } } Item { Layout.fillWidth: true Layout.fillHeight: true RowLayout { visible: menu.roaming anchors.fill: parent spacing: units.gu(0.5) Label { id: labelRoaming elide: Text.ElideRight fontSize: "x-small" text: i18n.tr("Roaming") opacity: 0.6 } Icon { id: iconRoaming color: theme.palette.normal.backgroundText Layout.preferredHeight: parent.height Layout.preferredWidth: Layout.preferredHeight name: "network-cellular-roaming" } } } } Button { id: buttonUnlock objectName: "buttonUnlockSim" visible: menu.locked text: i18n.tr("Unlock SIM") Layout.preferredWidth: implicitWidth + units.gu(5) onTriggered: menu.unlock() } } } ubuntu-settings-components-0.7+16.04.20160321.1/plugins/Ubuntu/Settings/Menus/SimpleMessageMenu.qml0000644000015600001650000000576712674023445033377 0ustar pbuserpbgroup00000000000000/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Authors: * Renato Araujo Oliveira Filho * Olivier Tilloy */ import QtQuick 2.4 import Ubuntu.Components 1.3 import Ubuntu.Components.ListItems 1.3 as ListItem import Ubuntu.Settings.Components 0.1 as USC import QtQuick.Layouts 1.1 ListItem.Empty { id: menu property alias title: messageHeader.title property alias time: messageHeader.time property alias body: messageHeader.body property url avatar property url icon signal iconActivated signal dismissed property alias footer: footerLoader.sourceComponent property real _animationDuration: UbuntuAnimation.FastDuration __height: layout.implicitHeight + units.gu(3) clip: heightAnimation.running ColumnLayout { id: layout anchors { left: parent.left right: parent.right leftMargin: units.gu(2) rightMargin: units.gu(2) top: parent.top topMargin: units.gu(1.5) } spacing: units.gu(1.5) USC.MessageHeader { id: messageHeader Layout.fillWidth: true Layout.alignment: Qt.AlignTop avatar: menu.avatar != "" ? menu.avatar : "image://theme/contact" icon: menu.icon != "" ? menu.icon : "image://theme/message" state: menu.state onIconClicked: { menu.iconActivated(); } } Loader { id: footerLoader visible: menu.state === "expanded" opacity: 0.0 asynchronous: false Layout.fillWidth: true Layout.fillHeight: true } } Behavior on height { NumberAnimation { id: heightAnimation duration: _animationDuration easing.type: Easing.OutQuad } } onTriggered: if (!footer || !selected) messageHeader.shakeIcon(); states: State { name: "expanded" when: selected && footerLoader.status == Loader.Ready PropertyChanges { target: footerLoader opacity: 1.0 } } transitions: Transition { ParallelAnimation { PropertyAnimation { target: footerLoader; property: "opacity"; duration: _animationDuration } } } onItemRemoved: { menu.dismissed(); } } ubuntu-settings-components-0.7+16.04.20160321.1/plugins/Ubuntu/Settings/Menus/Menus.qmltypes0000644000015600001650000000145412674023445032155 0ustar pbuserpbgroup00000000000000import QtQuick.tooling 1.1 // This file describes the plugin-supplied types contained in the library. // It is used for QML tooling purposes only. // // This file was auto-generated by: // 'qmlplugindump -notrelocatable Ubuntu.Settings.Menus 0.1 plugins' Module { Component { name: "TransferState" prototype: "QObject" exports: ["Ubuntu.Settings.Menus/TransferState 0.1"] isCreatable: false exportMetaObjectRevisions: [0] Enum { name: "TransferStates" values: { "Queued": 0, "Running": 1, "Paused": 2, "Canceled": 3, "Hashing": 4, "Processing": 5, "Finished": 6, "Error": 7 } } } } ubuntu-settings-components-0.7+16.04.20160321.1/plugins/Ubuntu/Settings/Menus/CalendarMenu.qml0000644000015600001650000000426412674023445032341 0ustar pbuserpbgroup00000000000000/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Authored by Andrea Cimitan */ import QtQuick 2.4 import Ubuntu.Components 1.3 import Ubuntu.Components.ListItems 1.3 as ListItem import Ubuntu.Settings.Components 0.1 ListItem.Empty { id: menu property alias collapsed: calendar.collapsed property alias currentDate: calendar.currentDate property alias firstDayOfWeek: calendar.firstDayOfWeek property alias maximumDate: calendar.maximumDate property alias minimumDate: calendar.minimumDate property alias selectedDate: calendar.selectedDate __height: column.height Column { id: column height: childrenRect.height + units.gu(1.5) anchors { top: parent.top left: parent.left right: parent.right topMargin: units.gu(1) leftMargin: menu.__contentsMargins rightMargin: menu.__contentsMargins } spacing: units.gu(1) Label { id: label anchors { left: parent.left right: parent.right } fontSize: "large" text: i18n.ctr("%1=month name, %2=4-digit year", "%1 %2") .arg(Qt.locale().standaloneMonthName(calendar.currentDate.getMonth(), Locale.LongFormat)) .arg(calendar.currentDate.getFullYear()) } Calendar { id: calendar objectName: "calendar" anchors { left: parent.left right: parent.right } } } } ubuntu-settings-components-0.7+16.04.20160321.1/plugins/Ubuntu/Settings/Menus/SeparatorMenu.qml0000644000015600001650000000143612674023445032566 0ustar pbuserpbgroup00000000000000/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * */ import QtQuick 2.4 import Ubuntu.Components.ListItems 1.3 as ListItem ListItem.Empty { __height: units.gu(1) highlightWhenPressed: false } ubuntu-settings-components-0.7+16.04.20160321.1/plugins/Ubuntu/Settings/Menus/EventMenu.qml0000644000015600001650000000403312674023445031703 0ustar pbuserpbgroup00000000000000/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Authored by Andrea Cimitan */ import QtQuick 2.4 import Ubuntu.Components 1.3 import Ubuntu.Components.ListItems 1.3 as ListItems ListItems.Empty { id: menu property alias iconSource: iconVisual.source property alias text: label.text property alias time: dateLabel.text property alias eventColor: iconVisual.color Icon { id: iconVisual source: "image://theme/calendar" visible: source != "" color: theme.palette.normal.backgroundText height: Math.min(units.gu(3), parent.height - units.gu(1)) width: height anchors { left: parent.left leftMargin: menu.__contentsMargins verticalCenter: parent.verticalCenter } } Label { id: label anchors { verticalCenter: parent.verticalCenter left: iconVisual.visible ? iconVisual.right : parent.left leftMargin: menu.__contentsMargins right: dateLabel.left rightMargin: menu.__contentsMargins } elide: Text.ElideRight maximumLineCount: 1 opacity: enabled ? 1.0 : 0.5 } Label { id: dateLabel anchors { verticalCenter: parent.verticalCenter right: parent.right rightMargin: menu.__contentsMargins } opacity: enabled ? 1.0 : 0.5 } } ubuntu-settings-components-0.7+16.04.20160321.1/plugins/Ubuntu/Settings/Menus/plugin.h0000644000015600001650000000175312674023445030737 0ustar pbuserpbgroup00000000000000/* * Copyright (C) 2014 Canonical, Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ #ifndef UBUNTUSETTINGSMENUS_PLUGIN_H #define UBUNTUSETTINGSMENUS_PLUGIN_H #include class UbuntuSettingsMenusPlugin : public QQmlExtensionPlugin { Q_OBJECT Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QQmlExtensionInterface") public: void registerTypes(const char *uri); }; #endif // UBUNTUSETTINGSMENUS_PLUGIN_H ubuntu-settings-components-0.7+16.04.20160321.1/plugins/Ubuntu/Settings/Menus/ProgressValueMenu.qml0000644000015600001650000000204712674023445033426 0ustar pbuserpbgroup00000000000000/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Authors: * Nick Dedekind */ import QtQuick 2.4 import Ubuntu.Components 1.3 StandardMenu { id: menuItem property int value : 0.0 component: Component { Label { id: progress objectName: "progress" text: menuItem.value + " %" fontSize: "medium" color: menuItem.foregroundColor } } } ubuntu-settings-components-0.7+16.04.20160321.1/plugins/Ubuntu/Settings/Menus/plugin.cpp0000644000015600001650000000161612674023445031270 0ustar pbuserpbgroup00000000000000/* * Copyright (C) 2014 Canonical, Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ // local #include "plugin.h" #include "types.h" // Qt #include void UbuntuSettingsMenusPlugin::registerTypes(const char *uri) { qmlRegisterUncreatableType(uri, 0, 1, "TransferState", "Can't create TransferState class"); } ubuntu-settings-components-0.7+16.04.20160321.1/plugins/Ubuntu/Settings/Menus/MediaPlayerMenu.qml0000644000015600001650000000712112674023445033017 0ustar pbuserpbgroup00000000000000/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Authored by Andrea Cimitan */ import QtQuick 2.4 import Ubuntu.Components 1.3 import Ubuntu.Components.ListItems 1.3 as ListItem import QtQuick.Layouts 1.1 ListItem.Empty { id: menu property bool showTrack: false property alias playerName: playerNameLabel.text property alias playerIcon: playerIcon.source property alias albumArt: albumArtImage.source property alias song: songLabel.text property alias artist: artistLabel.text property alias album: albumLabel.text __height: column.height + units.gu(2) Behavior on implicitHeight { UbuntuNumberAnimation {} } Column { id: column anchors { left: parent.left right: parent.right leftMargin: menu.__contentsMargins rightMargin: menu.__contentsMargins verticalCenter: parent.verticalCenter } RowLayout { objectName: "player" id: playerRow spacing: menu.__contentsMargins visible: !showTrack anchors { left: parent.left; right: parent.right } Image { id: playerIcon Layout.preferredHeight: units.gu(5) Layout.preferredWidth: units.gu(5) } Label { id: playerNameLabel Layout.fillWidth: true Layout.alignment: Qt.AlignVCenter elide: Text.ElideRight maximumLineCount: 1 } } RowLayout { objectName: "albumArt" id: trackRow spacing: units.gu(2) visible: showTrack anchors { left: parent.left; right: parent.right } UbuntuShape { Layout.preferredHeight: units.gu(8) Layout.preferredWidth: units.gu(8) image: Image { id: albumArtImage } } Column { Layout.alignment: Qt.AlignVCenter Layout.fillWidth: true spacing: units.gu(0.5) Label { id: songLabel elide: Text.ElideRight maximumLineCount: 1 visible: text !== "" anchors { left: parent.left; right: parent.right } } Label { id: artistLabel elide: Text.ElideRight maximumLineCount: 1 visible: text !== "" anchors { left: parent.left; right: parent.right } } Label { id: albumLabel elide: Text.ElideRight maximumLineCount: 1 fontSize: "small" visible: text !== "" anchors { left: parent.left; right: parent.right } } } } } } ubuntu-settings-components-0.7+16.04.20160321.1/plugins/Ubuntu/Settings/Menus/SwitchMenu.qml0000644000015600001650000000402512674023445032064 0ustar pbuserpbgroup00000000000000/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Authors: * Nick Dedekind */ import QtQuick 2.4 import Ubuntu.Components 1.3 StandardMenu { id: menu property bool checked: false onClicked: menu.checked = !menu.checked component: Component { Switch { id: switcher objectName: "switcher" property bool enableCheckConnection: true Component.onCompleted: { checked = menu.checked; } // FIXME : create a bi-directional feedback component onCheckedChanged: { if (!enableCheckConnection) { return; } var oldEnable = enableCheckConnection; enableCheckConnection = false; menu.checked = checked; menu.triggered(menu.checked); enableCheckConnection = oldEnable; } Connections { target: menu onCheckedChanged: { if (!switcher.enableCheckConnection) { return; } var oldEnable = switcher.enableCheckConnection; switcher.enableCheckConnection = false; switcher.checked = menu.checked; switcher.enableCheckConnection = oldEnable; } } } } } ubuntu-settings-components-0.7+16.04.20160321.1/plugins/Ubuntu/Settings/Menus/AccessPointMenu.qml0000644000015600001650000000552712674023445033046 0ustar pbuserpbgroup00000000000000/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Authors: * Renato Araujo Oliveira Filho */ import QtQuick 2.4 import Ubuntu.Components 1.3 import Ubuntu.Components.ListItems 1.3 as ListItem ListItem.Empty { id: menu __height: units.gu(5.5) property bool active: false property bool secure: false property bool adHoc: false property int signalStrength: 0 property alias text: label.text Icon { id: iconSignal objectName: "iconSignal" color: active ? theme.palette.normal.positive : theme.palette.normal.backgroundText width: height height: Math.min(units.gu(3), parent.height - units.gu(1)) anchors { left: parent.left leftMargin: menu.__contentsMargins verticalCenter: parent.verticalCenter } name: { var imageName = "nm-signal-100" if (adHoc) { imageName = "nm-adhoc"; } else if (signalStrength <= 0) { imageName = "nm-signal-00"; } else if (signalStrength <= 25) { imageName = "nm-signal-25"; } else if (signalStrength <= 50) { imageName = "nm-signal-50"; } else if (signalStrength <= 75) { imageName = "nm-signal-75"; } return imageName; } } Label { id: label anchors { left: iconSignal.right leftMargin: units.gu(1) verticalCenter: parent.verticalCenter right: iconSecure.visible ? iconSecure.left : parent.right rightMargin: menu.__contentsMargins } elide: Text.ElideRight color: active ? theme.palette.normal.positive : theme.palette.normal.backgroundText } Icon { id: iconSecure objectName: "iconSecure" visible: secure name: "network-secure" color: active ? theme.palette.normal.positive : theme.palette.normal.backgroundText width: height height: Math.min(units.gu(3), parent.height - units.gu(1)) anchors { right: parent.right rightMargin: menu.__contentsMargins verticalCenter: parent.verticalCenter } } } ubuntu-settings-components-0.7+16.04.20160321.1/plugins/Ubuntu/Settings/Menus/ProgressBarMenu.qml0000644000015600001650000000237012674023445033055 0ustar pbuserpbgroup00000000000000/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Authored by Andrea Cimitan */ import QtQuick 2.4 import Ubuntu.Components 1.3 import Ubuntu.Components.ListItems 1.3 as ListItem StandardMenu { id: menu property bool indeterminate: false property real minimumValue: 0.0 property real maximumValue: 1.0 property real value: 0.0 component: Component { ProgressBar { id: progressBar width: units.gu(20) indeterminate: menu.indeterminate minimumValue: menu.minimumValue maximumValue: menu.maximumValue value: menu.value } } } ubuntu-settings-components-0.7+16.04.20160321.1/plugins/Ubuntu/Settings/Menus/UserSessionMenu.qml0000644000015600001650000000321012674023445033100 0ustar pbuserpbgroup00000000000000/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Authored by Andrea Cimitan */ import QtQuick 2.4 import Ubuntu.Components 1.3 import Ubuntu.Components.ListItems 1.3 as ListItem StandardMenu { id: userSessionMenu property alias name: userSessionMenu.text property bool active: false component: Component { Rectangle { id: activeIcon objectName: "activeIcon" implicitWidth: checkMark.width + units.gu(1.5) implicitHeight: checkMark.height + units.gu(1.5) radius: width / 2 antialiasing: true color: theme.palette.normal.backgroundText visible: userSessionMenu.active Image { id: checkMark source: "image://theme/tick" height: units.gu(2) width: height anchors.centerIn: parent sourceSize { height: height width: width } } } } } ubuntu-settings-components-0.7+16.04.20160321.1/plugins/Ubuntu/Settings/Menus/pluginglobal.h0000644000015600001650000000152312674023445032113 0ustar pbuserpbgroup00000000000000/* * Copyright (C) 2014 Canonical, Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ #include #if defined(UBUNTUSETTINGSCOMPONENTS_LIBRARY) # define UBUNTUSETTINGSCOMPONENTS_EXPORT Q_DECL_EXPORT #else # define UBUNTUSETTINGSCOMPONENTS_EXPORT Q_DECL_IMPORT #endif ubuntu-settings-components-0.7+16.04.20160321.1/plugins/Ubuntu/Settings/Menus/TransferMenu.qml0000644000015600001650000000551012674023445032407 0ustar pbuserpbgroup00000000000000/* * Copyright 2014 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import QtQuick.Layouts 1.1 import Ubuntu.Components 1.3 import Ubuntu.Components.ListItems 1.3 as ListItem import Ubuntu.Settings.Components 0.1 ListItem.Empty { id: menu property alias iconSource: icon.source property alias text: label.text property alias stateText: stateLabel.text property alias progress: progressBar.value property bool active: false property alias maximum: progressBar.maximumValue __height: row.height + units.gu(2) RowLayout { id: row anchors { left: parent.left right: parent.right verticalCenter: parent.verticalCenter leftMargin: menu.__contentsMargins rightMargin: menu.__contentsMargins } spacing: units.gu(2) UbuntuShapeForItem { Layout.preferredWidth: units.gu(6) Layout.preferredHeight: units.gu(6) image: icon Icon { id: icon objectName: "icon" color: { if (String(source).match(/^image:\/\/theme/)) { return theme.palette.normal.backgroundText; } return Qt.rgba(0.0, 0.0, 0.0, 0.0); } } } ColumnLayout { spacing: units.gu(0.5) Label { id: label objectName: "text" Layout.fillWidth: true elide: Text.ElideRight maximumLineCount: 1 font.weight: Font.DemiBold } ProgressBar { id: progressBar objectName: "progress" visible: menu.active value: 0.0 showProgressPercentage: false Layout.preferredHeight: units.gu(1) Layout.fillWidth: true } Label { id: stateLabel objectName: "stateText" Layout.fillWidth: true visible: menu.active fontSize: "x-small" elide: Text.ElideRight maximumLineCount: 1 } } } } ubuntu-settings-components-0.7+16.04.20160321.1/plugins/Ubuntu/Settings/Menus/SectionMenu.qml0000644000015600001650000000237012674023445032230 0ustar pbuserpbgroup00000000000000/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Authors: * Renato Araujo Oliveira Filho */ import QtQuick 2.4 import Ubuntu.Components 1.3 import Ubuntu.Components.ListItems 1.3 as ListItem ListItem.Header { id: menuItem property alias busy: indicator.running __foregroundColor: theme.palette.normal.backgroundText ActivityIndicator { id: indicator objectName: "indicator" anchors { margins: units.gu(0.5) right: parent.right } height: parent.height - (anchors.margins * 2) width: height anchors.verticalCenter: parent.verticalCenter } } ubuntu-settings-components-0.7+16.04.20160321.1/plugins/Ubuntu/Settings/Menus/PlaybackItemMenu.qml0000644000015600001650000000626612674023445033201 0ustar pbuserpbgroup00000000000000/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Authored by Nick Dedekind */ import QtQuick 2.4 import Ubuntu.Components 1.3 import Ubuntu.Components.ListItems 1.3 as ListItem import QtQuick.Layouts 1.1 ListItem.Empty { id: menu property bool playing: false property bool canPlay: false property bool canGoNext: false property bool canGoPrevious: false signal next() signal play(bool play) signal previous() highlightWhenPressed: false implicitHeight: layout.implicitHeight + units.gu(2) RowLayout { id: layout anchors.centerIn: parent spacing: units.gu(3) Icon { objectName: "previousButton" Layout.preferredWidth: units.gu(5) Layout.preferredHeight: units.gu(5) source: "image://theme/media-skip-backward" color: { if (!enabled) return theme.palette.disabled.backgroundText; return prevMA.pressed ? theme.palette.highlighted.backgroundText : theme.palette.normal.backgroundText; } enabled: canGoPrevious MouseArea { id: prevMA anchors.fill: parent onClicked: menu.previous() } } Icon { objectName: "playButton" Layout.preferredWidth: units.gu(5) Layout.preferredHeight: units.gu(5) source: playing ? "image://theme/media-playback-pause" : "image://theme/media-playback-start" color: { if (!enabled) return theme.palette.disabled.backgroundText; return playMA.pressed ? theme.palette.highlighted.backgroundText : theme.palette.normal.backgroundText; } enabled: canPlay MouseArea { id: playMA anchors.fill: parent onClicked: menu.play(!playing) } } Icon { objectName: "nextButton" Layout.preferredWidth: units.gu(5) Layout.preferredHeight: units.gu(5) source: "image://theme/media-skip-forward" color: { if (!enabled) return theme.palette.disabled.backgroundText; return nextMA.pressed ? theme.palette.highlighted.backgroundText : theme.palette.normal.backgroundText; } enabled: canGoNext MouseArea { id: nextMA anchors.fill: parent onClicked: menu.next() } } } } ubuntu-settings-components-0.7+16.04.20160321.1/plugins/Ubuntu/Settings/Menus/TextMessageMenu.qml0000644000015600001650000000245412674023445033060 0ustar pbuserpbgroup00000000000000/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Authors: * Renato Araujo Oliveira Filho * Olivier Tilloy */ import QtQuick 2.4 import Ubuntu.Components 1.3 import Ubuntu.Settings.Components 0.1 as USC SimpleMessageMenu { id: menu property bool replyEnabled: true property string replyButtonText: i18n.dtr("ubuntu-settings-components", "Send") property string replyHintText signal replied(string value) footer: USC.ActionTextField { activateEnabled: menu.replyEnabled buttonText: menu.replyButtonText textHint: menu.replyHintText onActivated: { menu.replied(value); } } } ubuntu-settings-components-0.7+16.04.20160321.1/plugins/Ubuntu/Settings/Menus/GroupedMessageMenu.qml0000644000015600001650000000346112674023445033540 0ustar pbuserpbgroup00000000000000/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Authors: * Renato Araujo Oliveira Filho * Olivier Tilloy */ import QtQuick 2.4 import Ubuntu.Components 1.3 import Ubuntu.Components.ListItems 1.3 as ListItem StandardMenu { id: menu property string count: "0" signal dismissed() iconSource: Qt.resolvedUrl("image://theme/message") component: Component { UbuntuShape { implicitHeight: label.implicitHeight + units.gu(2) implicitWidth: label.implicitWidth + units.gu(2) color: theme.palette.normal.backgroundText radius: "medium" Label { id: label objectName: "messageCount" anchors { horizontalCenter: parent.horizontalCenter verticalCenter: parent.verticalCenter } horizontalAlignment: Text.AlignRight font.weight: Font.DemiBold fontSize: "medium" text: menu.count color: theme.palette.normal.foregroundText } } } onItemRemoved: { menu.dismissed(); } } ubuntu-settings-components-0.7+16.04.20160321.1/plugins/Ubuntu/Settings/Menus/TimeZoneMenu.qml0000644000015600001650000000204712674023445032357 0ustar pbuserpbgroup00000000000000/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Authored by Andrea Cimitan */ import QtQuick 2.4 import Ubuntu.Components 1.3 import Ubuntu.Components.ListItems 1.3 as ListItem StandardMenu { id: timeZoneMenu property alias city: timeZoneMenu.text property string time component: Component { Label { id: timeLabel objectName: "timeLabel" text: time } } } ubuntu-settings-components-0.7+16.04.20160321.1/plugins/Ubuntu/Settings/Menus/SliderMenu.qml0000644000015600001650000001412312674023445032045 0ustar pbuserpbgroup00000000000000/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Authored by Andrea Cimitan */ import QtQuick 2.4 import Ubuntu.Components 1.3 import Ubuntu.Components.ListItems 1.3 as ListItem ListItem.Empty { id: menu property alias minimumValue: slider.minimumValue property alias maximumValue: slider.maximumValue property alias live: slider.live property double value: 0.0 property alias minIcon: leftButton.source property alias maxIcon: rightButton.source signal updated(real value) property QtObject d: QtObject { property bool enableValueConnection: true property double originalValue: 0.0 property Connections connections: Connections { target: menu onValueChanged: { if (!d.enableValueConnection) return; d.originalValue = menu.value; d.checkValueMinMax(); } // need to re-assert the reported value to the requested value. onMinimumValueChanged: { if (menu.value !== d.originalValue) { menu.value = d.originalValue; } else { d.checkValueMinMax(); } } onMaximumValueChanged: { if (menu.value !== d.originalValue) { menu.value = d.originalValue; } else { d.checkValueMinMax(); } } } function lockValue() { if (!d.enableValueConnection) return false; d.enableValueConnection = false; return true; } function unlockValue(oldValue) { d.enableValueConnection = oldValue; } function checkValueMinMax() { var oldEnable = lockValue(); if (!oldEnable) return; // Can't rely on binding. Slider value is assigned by user slide. if (menu.value < minimumValue) { slider.value = minimumValue; menu.value = minimumValue; } else if (menu.value > maximumValue) { slider.value = maximumValue; menu.value = maximumValue; } else if (slider.value != menu.value) { slider.value = menu.value; } unlockValue(oldEnable); } } implicitHeight: column.height + units.gu(1.5) Column { id: column anchors { verticalCenter: parent.verticalCenter left: parent.left right: parent.right leftMargin: menu.__contentsMargins rightMargin: menu.__contentsMargins } height: childrenRect.height spacing: units.gu(0.5) Label { id: label text: menu.text anchors { left: parent.left right: parent.right } visible: text != "" } Item { id: row anchors { left: parent.left right: parent.right } height: slider.height Icon { id: leftButton objectName: "leftButton" visible: source != "" anchors.left: row.left anchors.verticalCenter: row.verticalCenter height: slider.height - units.gu(2) width: height color: theme.palette.normal.backgroundText MouseArea { anchors.fill: parent onClicked: slider.value = slider.minimumValue } } Slider { id: slider objectName: "slider" anchors { left: leftButton.visible ? leftButton.right : row.left right: rightButton.visible ? rightButton.left : row.right leftMargin: leftButton.visible ? units.gu(0.5) : 0 rightMargin: rightButton.visible ? units.gu(0.5) : 0 } live: true Component.onCompleted: { value = menu.value } minimumValue: 0 maximumValue: 100 // FIXME - to be deprecated in Ubuntu.Components. // Use this to disable the label, since there is not way to do it on the component. function formatValue(v) { return ""; } Connections { target: slider onValueChanged: { var oldEnable = d.lockValue(); if (!oldEnable) return; menu.value = slider.value; d.originalValue = menu.value; menu.updated(slider.value); d.unlockValue(oldEnable); } } } Icon { id: rightButton objectName: "rightButton" visible: source != "" anchors.right: row.right anchors.verticalCenter: row.verticalCenter height: slider.height - units.gu(2) width: height color: theme.palette.normal.backgroundText MouseArea { anchors.fill: parent onClicked: slider.value = slider.maximumValue } } } } } ubuntu-settings-components-0.7+16.04.20160321.1/plugins/Ubuntu/Settings/Menus/SnapDecisionMenu.qml0000644000015600001650000000554612674023445033213 0ustar pbuserpbgroup00000000000000/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Authors: * Renato Araujo Oliveira Filho * Olivier Tilloy */ import QtQuick 2.4 import Ubuntu.Components 1.3 import Ubuntu.Settings.Components 0.1 as USC import QtQuick.Layouts 1.1 SimpleMessageMenu { id: menu property bool actionEnabled: true property string actionButtonText: i18n.dtr("ubuntu-settings-components", "Call back") property bool replyEnabled: true property string replyButtonText: i18n.dtr("ubuntu-settings-components", "Send") property string replyHintText property bool replyExpanded: false signal actionActivated signal replied(string value) footer: Item { id: buttons implicitHeight: layout.implicitHeight ColumnLayout { id: layout anchors { left: parent.left right: parent.right } spacing: units.gu(1) RowLayout { spacing: units.gu(2) Button { objectName: "messageButton" text: i18n.dtr("ubuntu-settings-components", "Message") Layout.fillWidth: true onClicked: { menu.replyExpanded = !menu.replyExpanded; } } Button { id: actionButton objectName: "actionButton" enabled: menu.actionEnabled text: actionButtonText color: enabled ? theme.palette.normal.positive : theme.palette.disabled.positive Layout.fillWidth: true onClicked: { menu.actionActivated(); } } } USC.ActionTextField { id: reply Layout.fillWidth: true Layout.fillHeight: true visible: menu.replyExpanded activateEnabled: menu.replyEnabled buttonText: menu.replyButtonText textHint: menu.replyHintText onActivated: { menu.replied(value); } } } } } ubuntu-settings-components-0.7+16.04.20160321.1/plugins/Ubuntu/Settings/Menus/ButtonMenu.qml0000644000015600001650000000205312674023445032075 0ustar pbuserpbgroup00000000000000/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Authored by Andrea Cimitan */ import QtQuick 2.4 import Ubuntu.Components 1.3 StandardMenu { id: menu property string buttonText component: Component { Button { id: button objectName: "button" text: menu.buttonText width: Math.max(units.gu(5), implicitWidth) onClicked: menu.clicked() } } } ubuntu-settings-components-0.7+16.04.20160321.1/plugins/Ubuntu/Settings/Menus/qmldir0000644000015600001650000000160012674023445030472 0ustar pbuserpbgroup00000000000000module Ubuntu.Settings.Menus plugin UbuntuSettingsMenusQml typeinfo Menus.qmltypes AccessPointMenu 0.1 AccessPointMenu.qml ButtonMenu 0.1 ButtonMenu.qml CalendarMenu 0.1 CalendarMenu.qml CheckableMenu 0.1 CheckableMenu.qml EventMenu 0.1 EventMenu.qml GroupedMessageMenu 0.1 GroupedMessageMenu.qml MediaPlayerMenu 0.1 MediaPlayerMenu.qml ModemInfoItem 0.1 ModemInfoItem.qml PlaybackItemMenu 0.1 PlaybackItemMenu.qml ProgressBarMenu 0.1 ProgressBarMenu.qml ProgressValueMenu 0.1 ProgressValueMenu.qml SectionMenu 0.1 SectionMenu.qml SeparatorMenu 0.1 SeparatorMenu.qml SimpleMessageMenu 0.1 SimpleMessageMenu.qml SliderMenu 0.1 SliderMenu.qml SnapDecisionMenu 0.1 SnapDecisionMenu.qml StandardMenu 0.1 StandardMenu.qml SwitchMenu 0.1 SwitchMenu.qml TextMessageMenu 0.1 TextMessageMenu.qml TimeZoneMenu 0.1 TimeZoneMenu.qml TransferMenu 0.1 TransferMenu.qml UserSessionMenu 0.1 UserSessionMenu.qml ubuntu-settings-components-0.7+16.04.20160321.1/plugins/Ubuntu/Settings/Menus/types.h0000644000015600001650000000216312674023445030601 0ustar pbuserpbgroup00000000000000/* * Copyright (C) 2014 Canonical, Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef UBUNTUSETTINGSMENUSTYPES_H #define UBUNTUSETTINGSMENUSTYPES_H #include "pluginglobal.h" #include class UBUNTUSETTINGSCOMPONENTS_EXPORT TransferState : public QObject { Q_OBJECT Q_ENUMS(TransferStates) public: enum TransferStates { Queued, Running, Paused, Canceled, Hashing, Processing, Finished, Error }; TransferState(QObject* parent = 0): QObject(parent) {} }; #endif // UBUNTUSETTINGSMENUSTYPES_H ubuntu-settings-components-0.7+16.04.20160321.1/plugins/Ubuntu/Settings/Menus/StandardMenu.qml0000644000015600001650000000436712674023445032374 0ustar pbuserpbgroup00000000000000/* * Copyright 2014 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.3 import Ubuntu.Components.ListItems 1.3 as ListItems import QtQuick.Layouts 1.1 ListItems.Empty { id: menu property alias iconSource: iconVisual.source property alias text: label.text property alias iconColor: iconVisual.color property alias component: componentLoader.sourceComponent property alias foregroundColor: label.color property alias backColor: overlay.color Rectangle { id: overlay color: "transparent" visible: color !== "transparent" anchors { left: parent.left right: parent.right top: parent.top } height: menu.height - menu.divider.height } RowLayout { anchors { fill: parent leftMargin: menu.__contentsMargins rightMargin: menu.__contentsMargins } spacing: menu.__contentsMargins Icon { id: iconVisual visible: source != "" color: theme.palette.normal.backgroundText readonly property real size: Math.min(units.gu(3), parent.height - menu.__contentsMargins) Layout.preferredHeight: size Layout.preferredWidth: size Layout.alignment: Qt.AlignVCenter } Label { id: label Layout.fillWidth: true Layout.alignment: Qt.AlignVCenter elide: Text.ElideRight maximumLineCount: 1 } Loader { id: componentLoader asynchronous: false visible: status == Loader.Ready } } } ubuntu-settings-components-0.7+16.04.20160321.1/plugins/Ubuntu/Settings/Menus/CMakeLists.txt0000644000015600001650000000121112674023445032015 0ustar pbuserpbgroup00000000000000project(UbuntuSettingsMenusQml) find_package(Qt5Core REQUIRED) include_directories( ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR} ) set(UbuntuSettingsMenusQml_SOURCES plugin.cpp types.h ) add_definitions(-DUBUNTUSETTINGSCOMPONENTS_LIBRARY) add_library(UbuntuSettingsMenusQml MODULE ${UbuntuSettingsMenusQml_SOURCES} ) target_link_libraries(UbuntuSettingsMenusQml ${GLIB_LIBRARIES} ${GIO_LIBRARIES} ${QMENUMODEL_LDFLAGS} ${LIBUPSTART_LIBRARIES} ) qt5_use_modules(UbuntuSettingsMenusQml Core Qml Quick) add_usc_plugin(Ubuntu.Settings.Menus 0.1 Ubuntu/Settings/Menus TARGETS UbuntuSettingsMenusQml) ubuntu-settings-components-0.7+16.04.20160321.1/plugins/Ubuntu/Settings/Components/0000755000015600001650000000000012674023672030322 5ustar pbuserpbgroup00000000000000ubuntu-settings-components-0.7+16.04.20160321.1/plugins/Ubuntu/Settings/Components/Calendar.qml0000644000015600001650000002236212674023445032551 0ustar pbuserpbgroup00000000000000/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.3 import "dateExt.js" as DateExt ListView { id: monthView property bool collapsed: false property var currentDate: selectedDate.monthStart().addDays(15) property var firstDayOfWeek: Qt.locale(i18n.language).firstDayOfWeek property var maximumDate property var minimumDate property var selectedDate: priv.today Component.onCompleted: { priv.__populateModel() timer.start() } onCurrentIndexChanged: { if (!priv.ready) return currentDate = currentItem.monthStart } onCurrentDateChanged: { if (!priv.ready) return priv.__populateModel(); } onMaximumDateChanged: { if (!priv.ready) return priv.__populateModel() } onMinimumDateChanged: { if (!priv.ready) return priv.__populateModel() } ListModel { id: calendarModel } QtObject { id: priv property bool ready: false property int squareUnit: monthView.width / 7 property int verticalMargin: units.gu(1) property var today: (new Date()).midnight() function __withinLowerMonthBound(date) { return minimumDate == undefined || date.monthStart() >= minimumDate.monthStart() } function __withinUpperMonthBound(date) { return maximumDate == undefined || date.monthStart() <= maximumDate.monthStart() } function __getRealMinimumDate(date) { if (minimumDate != undefined && minimumDate > date) { return minimumDate; } return date; } function __getRealMaximumDate(date) { if (maximumDate != undefined && maximumDate < date) { return maximumDate; } return date; } function __populateModel() { // disable the onCurrentIndexChanged logic priv.ready = false var minimumAddedDate = priv.__getRealMinimumDate(currentDate.addMonths(-2)).monthStart(); var maximumAddedDate = priv.__getRealMaximumDate(currentDate.addMonths(2)).monthStart(); // Remove old minimum months while (calendarModel.count > 0 && calendarModel.get(0).monthStart < minimumAddedDate) { calendarModel.remove(0); } // Remove old maximum months while (calendarModel.count > 0 && calendarModel.get(calendarModel.count - 1).monthStart > maximumAddedDate) { calendarModel.remove(calendarModel.count - 1); } // Add new months var i = 0; while (calendarModel.count > 0 && calendarModel.get(0).monthStart > minimumAddedDate) { calendarModel.insert(0, { "monthStart": calendarModel.get(0).monthStart.addMonths(-1) }); ++i; } if (calendarModel.count > 0) { i = 0; while (calendarModel.count > 0 && calendarModel.get(calendarModel.count - 1).monthStart < maximumAddedDate) { calendarModel.append({ "monthStart": calendarModel.get(calendarModel.count - 1).monthStart.addMonths(1) }); ++i; } } else { i = 0; do { calendarModel.append({ "monthStart": minimumAddedDate.addMonths(i) }); ++i; } while (calendarModel.get(i-1).monthStart < maximumAddedDate) } currentIndex = DateExt.diffMonths(minimumAddedDate, currentDate); // Ok, we're all set up. enable the onCurrentIndexChanged logic priv.ready = true } } Timer { id: timer interval: 60000 repeat: true running: true triggeredOnStart: true onTriggered: priv.today = (new Date()).midnight() } width: parent.width height: priv.squareUnit * (collapsed ? 1 : 6) + priv.verticalMargin * 2 interactive: !collapsed clip: true cacheBuffer: Math.max(width + 1, 0) highlightRangeMode: ListView.StrictlyEnforceRange preferredHighlightBegin: 0 preferredHighlightEnd: width model: calendarModel orientation: ListView.Horizontal snapMode: ListView.SnapOneItem focus: true Keys.onLeftPressed: selectedDate.addDays(-1) Keys.onRightPressed: selectedDate.addDays(1) delegate: Item { id: monthItem property int currentWeekRow: Math.floor((selectedDate.getTime() - gridStart.getTime()) / Date.msPerWeek) property var gridStart: monthStart.weekStart(firstDayOfWeek) property var monthEnd: monthStart.addMonths(1) property var monthStart: model.monthStart width: monthView.width height: monthView.height Grid { id: monthGrid rows: 6 columns: 7 y: priv.verticalMargin width: priv.squareUnit * columns height: priv.squareUnit * rows Repeater { model: monthGrid.rows * monthGrid.columns delegate: Item { id: dayItem objectName: "dayItem" + index property bool isCurrent: (dayStart.getFullYear() == selectedDate.getFullYear() && dayStart.getMonth() == selectedDate.getMonth() && dayStart.getDate() == selectedDate.getDate()) property bool isCurrentMonth: monthStart <= dayStart && dayStart < monthEnd property bool isCurrentWeek: row == currentWeekRow property bool isSunday: weekday == 0 property bool isToday: dayStart.getTime() == priv.today.getTime() property bool isWithinBounds: (minimumDate == undefined || dayStart >= minimumDate) && (maximumDate == undefined || dayStart <= maximumDate) property int row: Math.floor(index / 7) property int weekday: (index % 7 + firstDayOfWeek) % 7 property real bottomMargin: (row == 5 || (collapsed && isCurrentWeek)) ? -priv.verticalMargin : 0 property real topMargin: (row == 0 || (collapsed && isCurrentWeek)) ? -priv.verticalMargin : 0 property var dayStart: gridStart.addDays(index) // Styling properties property color color: theme.palette.normal.backgroundText property color todayColor: theme.palette.normal.positive property string fontSize: "large" property var backgroundColor: "transparent" // FIXME use color instead var when Qt will fix the bug with the binding (loses alpha) property var sundayBackgroundColor: "#19AEA79F" // FIXME use color instead var when Qt will fix the bug with the binding (loses alpha) visible: collapsed ? isCurrentWeek : true width: priv.squareUnit height: priv.squareUnit // ItemStyle.class: "day" Item { anchors { fill: parent topMargin: dayItem.topMargin bottomMargin: dayItem.bottomMargin } Rectangle { anchors.fill: parent visible: color.a > 0 color: isSunday ? dayItem.sundayBackgroundColor : dayItem.backgroundColor } Label { anchors.centerIn: parent text: dayStart.getDate() fontSize: dayItem.fontSize color: isToday ? dayItem.todayColor : dayItem.color scale: isCurrent ? 1.8 : 1. opacity: isWithinBounds ? isCurrentMonth ? 1. : 0.3 : 0.1 Behavior on scale { NumberAnimation { duration: 50 } } } } MouseArea { anchors { fill: parent topMargin: dayItem.topMargin bottomMargin: dayItem.bottomMargin } onReleased: if (isWithinBounds) monthView.selectedDate = dayStart } } } } } } ubuntu-settings-components-0.7+16.04.20160321.1/plugins/Ubuntu/Settings/Components/QuickReply.qml0000644000015600001650000001102312674023445033120 0ustar pbuserpbgroup00000000000000/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Authors: * Renato Araujo Oliveira Filho * Olivier Tilloy */ import QtQuick 2.4 import Ubuntu.Components 1.3 import Ubuntu.Components.ListItems 1.3 as ListItem Item { id: quickReply property alias buttonText: actionTextField.buttonText property real expandedHeight: childrenRect.height property alias messages : messagelistRepeater.model property alias replyEnabled: actionTextField.activateEnabled property real messageMargins: units.gu(2) signal replied(var value) Item { id: header anchors.top: parent.top anchors.left: parent.left anchors.right: parent.right height: units.gu(4) Row { anchors { fill: parent topMargin: units.gu(1) bottomMargin: units.gu(1) leftMargin: messageMargins rightMargin: messageMargins } spacing: units.gu(1) Image { width: units.gu(2) height: width fillMode: Image.PreserveAspectFit source: "image://theme/message" } Label { height: parent.height verticalAlignment: Text.AlignVCenter fontSize: "small" text: i18n.dtr("ubuntu-settings-components", "Quick reply with:") } } ListItem.ThinDivider { anchors.bottom: parent.bottom } } Column { id: messagelist anchors { left: parent.left right: parent.right top: header.bottom } height: childrenRect.height Repeater { id: messagelistRepeater height: childrenRect.height Item { objectName: "replyMessage" + index width: messagelist.width height: units.gu(5) Label { id: __label anchors { fill: parent leftMargin: messageMargins rightMargin: messageMargins } verticalAlignment: Text.AlignVCenter fontSize: "medium" text: modelData } ListItem.ThinDivider { anchors.top: parent.top } ListItem.ThinDivider { anchors.bottom: parent.bottom } MouseArea { id: __mouseArea anchors.fill: parent onClicked: { actionTextField.text = modelData; } } Rectangle { id: __mask anchors.fill: parent color: "black" opacity: __mouseArea.pressed ? 0.3 : 0.0 Behavior on opacity { NumberAnimation { duration: 200 easing.type: Easing.OutQuad } } } } } } Item { anchors.top: messagelist.bottom anchors.left: parent.left anchors.right: parent.right height: units.gu(6) ActionTextField { id: actionTextField anchors.fill: parent anchors { topMargin: units.gu(1) bottomMargin: units.gu(1) leftMargin: messageMargins rightMargin: messageMargins } activateEnabled: replyEnabled onActivated: { quickReply.replied(value) } } ListItem.ThinDivider { anchors.top: parent.top } } } ././@LongLink0000000000000000000000000000016200000000000011214 Lustar 00000000000000ubuntu-settings-components-0.7+16.04.20160321.1/plugins/Ubuntu/Settings/Components/serverpropertysynchroniser.cppubuntu-settings-components-0.7+16.04.20160321.1/plugins/Ubuntu/Settings/Components/serverpropertysyn0000644000015600001650000002627612674023445034125 0ustar pbuserpbgroup00000000000000/* * Copyright (C) 2015 Canonical, Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ #include "serverpropertysynchroniser.h" #include #include #include ServerPropertySynchroniser::ServerPropertySynchroniser(QObject* parent) : QObject(parent) , m_serverTarget(nullptr) , m_userTarget(nullptr) , m_classComplete(false) , m_busy(false) , m_connectedServerTarget(nullptr) , m_connectedUserTarget(nullptr) , m_serverSyncTimer(new QTimer(this)) , m_bufferDamper(nullptr) , m_useWaitBuffer(true) , m_haveNextActivate(false) , m_bufferedSyncTimeout(false) , m_serverUpdatedDuringBufferDamping(false) , m_activateCount(0) { m_serverSyncTimer->setSingleShot(true); m_serverSyncTimer->setInterval(30000); connect(m_serverSyncTimer, &QTimer::timeout, this, &ServerPropertySynchroniser::serverSyncTimedOut); } void ServerPropertySynchroniser::classBegin() { m_classComplete = false; } void ServerPropertySynchroniser::componentComplete() { m_classComplete = true; connectServer(); connectUser(); } void ServerPropertySynchroniser::reset() { if (m_serverSyncTimer->isActive()) { m_serverSyncTimer->stop(); Q_EMIT syncWaitingChanged(false); } if (m_bufferDamper) m_bufferDamper->stop(); m_haveNextActivate = false; m_activateCount = 0; m_serverUpdatedDuringBufferDamping = false; } QObject *ServerPropertySynchroniser::serverTarget() const { return m_serverTarget; } void ServerPropertySynchroniser::setServerTarget(QObject *target) { if (m_serverTarget != target) { m_serverTarget = target; Q_EMIT serverTargetChanged(m_serverTarget); connectServer(); } } QString ServerPropertySynchroniser::serverProperty() const { return m_serverProperty; } void ServerPropertySynchroniser::setServerProperty(const QString &property) { if (m_serverProperty != property) { m_serverProperty = property; Q_EMIT serverPropertyChanged(m_serverProperty); connectServer(); } } QObject *ServerPropertySynchroniser::userTarget() const { return m_userTarget; } void ServerPropertySynchroniser::setUserTarget(QObject *target) { if (m_userTarget != target) { m_userTarget = target; Q_EMIT userTargetChanged(m_userTarget); connectUser(); } } QString ServerPropertySynchroniser::userProperty() const { return m_userProperty; } void ServerPropertySynchroniser::setUserProperty(const QString &property) { if (m_userProperty != property) { m_userProperty = property; Q_EMIT userPropertyChanged(m_userProperty); connectUser(); } } QString ServerPropertySynchroniser::userTrigger() const { return m_userTrigger; } void ServerPropertySynchroniser::setUserTrigger(const QString &trigger) { if (m_userTrigger != trigger) { m_userTrigger = trigger; Q_EMIT userPropertyChanged(m_userTrigger); connectUser(); } } int ServerPropertySynchroniser::syncTimeout() const { return m_serverSyncTimer->interval(); } void ServerPropertySynchroniser::setSyncTimeout(int timeout) { if (m_serverSyncTimer->interval() != timeout) { m_serverSyncTimer->setInterval(timeout); Q_EMIT syncTimeoutChanged(timeout); } } bool ServerPropertySynchroniser::useWaitBuffer() const { return m_useWaitBuffer; } void ServerPropertySynchroniser::setUseWaitBuffer(bool value) { if (m_useWaitBuffer != value) { m_useWaitBuffer = value; Q_EMIT useWaitBufferChanged(m_useWaitBuffer); } } int ServerPropertySynchroniser::maximumWaitBufferInterval() const { return m_bufferDamper ? m_bufferDamper->interval() : -1; } void ServerPropertySynchroniser::setMaximumWaitBufferInterval(int timeout) { if (timeout >= 0) { if (!m_bufferDamper) { m_bufferDamper = new QTimer(this); m_bufferDamper->setInterval(timeout); m_bufferDamper->setSingleShot(true); connect(m_bufferDamper, &QTimer::timeout, this, &ServerPropertySynchroniser::bufferTimedOut); Q_EMIT maximumWaitBufferIntervalChanged(timeout); } else if (timeout != m_bufferDamper->interval()) { m_bufferDamper->setInterval(timeout); Q_EMIT maximumWaitBufferIntervalChanged(timeout); } } else if (m_bufferDamper) { if (m_bufferDamper->isActive()) { m_haveNextActivate = false; } delete m_bufferDamper; m_bufferDamper = nullptr; Q_EMIT maximumWaitBufferIntervalChanged(timeout); } } bool ServerPropertySynchroniser::bufferedSyncTimeout() const { return m_bufferedSyncTimeout; } void ServerPropertySynchroniser::setBufferedSyncTimeout(bool value) { if (m_bufferedSyncTimeout != value) { m_bufferedSyncTimeout = value; Q_EMIT bufferedSyncTimeoutChanged(value); } } bool ServerPropertySynchroniser::syncWaiting() const { return m_serverSyncTimer->isActive(); } void ServerPropertySynchroniser::activate() { // Don't want any signals we fire to create binding loops. if (m_busy) return; m_busy = true; if (m_useWaitBuffer) { // Dampen the activations? Buffer the change. if (m_bufferDamper) { if (m_bufferDamper->isActive()) { m_haveNextActivate = true; m_busy = false; return; } m_bufferDamper->start(); // Not using a damp interval? Buffer the change till we get a server response, or timeout } else if (m_serverSyncTimer->isActive()) { m_haveNextActivate = true; m_busy = false; return; } } m_serverSyncTimer->start(); Q_EMIT syncWaitingChanged(true); m_activateCount++; // Fire off a change to the server user property value QQmlProperty userProp(m_userTarget, m_userProperty); if (!userProp.isValid()) { Q_EMIT syncTriggered(QVariant()); } else { Q_EMIT syncTriggered(userProp.read()); } m_busy = false; } void ServerPropertySynchroniser::connectServer() { // if we havent finished constructing the class, then wait if (!m_classComplete) return; reset(); if (m_connectedServerTarget) QObject::disconnect(m_connectedServerTarget, 0, this, 0); if (!m_serverTarget || m_serverProperty.isEmpty()) { return; } // Connect to the server property change QQmlProperty prop(m_serverTarget, m_serverProperty); if (prop.isValid()) { if (prop.connectNotifySignal(this, SLOT(updateUserValue()))) { m_connectedServerTarget = m_serverTarget; } // once we're connected to the server property, we need to make sure the user target is // set to the server value updateUserValue(); } } void ServerPropertySynchroniser::connectUser() { // if we havent finished constructing the class, then wait if (!m_classComplete) return; reset(); if (m_connectedUserTarget) QObject::disconnect(m_connectedUserTarget, 0, this, 0); if (!m_userTarget) { if (!parent()) return; m_userTarget = parent(); Q_EMIT userTargetChanged(m_userTarget); } if (m_userTrigger.isEmpty()) { // Connect to the user property change QQmlProperty prop(m_userTarget, m_userProperty); if (prop.isValid()) { if (prop.connectNotifySignal(this, SLOT(activate()))) { m_connectedUserTarget = m_userTarget; } // once we're connected to the user property, we need to make sure the user target is // set to the server value updateUserValue(); } } else { QQmlProperty prop(m_userTarget, m_userTrigger); if (prop.isValid() && prop.isSignalProperty()) { if (connect(m_userTarget, ("2" + prop.method().methodSignature()).constData(), this, SLOT(activate()))) { m_connectedUserTarget = m_userTarget; } // once we're connected to the user signal, we need to make sure the user target is // set to the server value updateUserValue(); } } } void ServerPropertySynchroniser::updateUserValue() { // Don't want any signals we fire to create binding loops. if (m_busy) return; m_busy = true; // Are we waiting for a server sync. if (m_serverSyncTimer->isActive()) { // are we waiting for more from the server? (number of activates sent > number of receives) if (--m_activateCount > 0) { // ignore the change and update on server sync timeout. m_busy = false; return; } // stop the wait m_serverSyncTimer->stop(); Q_EMIT syncWaitingChanged(false); } m_activateCount = 0; m_serverUpdatedDuringBufferDamping = m_bufferDamper && m_bufferDamper->isActive(); QQmlProperty userProp(m_userTarget, m_userProperty); QQmlProperty serverProp(m_serverTarget, m_serverProperty); if (!userProp.isValid() || !serverProp.isValid()) { m_busy = false; return; } // If we've been buffering changes since last change was send, // we verify that what the server gave us is what we want, and send another // activation if not. if (m_haveNextActivate) { m_haveNextActivate = false; m_busy = false; if (serverProp.read() != userProp.read()) { activate(); } return; } // Don't update until we hit the buffer timeout. if (m_serverUpdatedDuringBufferDamping) { m_busy = false; return; } // update the user target property. userProp.write(serverProp.read()); m_busy = false; } void ServerPropertySynchroniser::serverSyncTimedOut() { if (m_haveNextActivate && !m_bufferedSyncTimeout) { m_haveNextActivate = false; } Q_EMIT syncWaitingChanged(false); updateUserValue(); } void ServerPropertySynchroniser::bufferTimedOut() { if (m_haveNextActivate) { m_haveNextActivate = false; activate(); } // if we received a server change while we were in change buffer but don't need to send another activate, // update to the value we received. else if (m_serverUpdatedDuringBufferDamping) { // Update the user value. if (m_busy) return; m_busy = true; QQmlProperty userProp(m_userTarget, m_userProperty); QQmlProperty serverProp(m_serverTarget, m_serverProperty); if (!userProp.isValid() || !serverProp.isValid()) { m_busy = false; return; } userProp.write(serverProp.read()); m_busy = false; } m_serverUpdatedDuringBufferDamping = false; } ././@LongLink0000000000000000000000000000015200000000000011213 Lustar 00000000000000ubuntu-settings-components-0.7+16.04.20160321.1/plugins/Ubuntu/Settings/Components/UbuntuShapeForItem.qmlubuntu-settings-components-0.7+16.04.20160321.1/plugins/Ubuntu/Settings/Components/UbuntuShapeForIte0000644000015600001650000000255012674023445033621 0ustar pbuserpbgroup00000000000000/* * Copyright (C) 2014 Canonical, Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.3 /* FIXME: This component is duplicating the UbuntuShape from the SDK, but shapes more * general (Item-based) components. This ability should be incorporated into the SDK's * UbuntuShape so this file can be removed. * Bug: https://bugs.launchpad.net/tavastia/+bug/1089595 */ Item { property alias radius: shape.radius property alias image: shaderEffectSource.sourceItem ShaderEffectSource { id: shaderEffectSource anchors.centerIn: parent // Placed under shape, so it's hidden hideSource: true } UbuntuShape { id: shape source: shaderEffectSource anchors.fill: parent sourceFillMode: UbuntuShape.PreserveAspectCrop } } ubuntu-settings-components-0.7+16.04.20160321.1/plugins/Ubuntu/Settings/Components/plugin.h0000644000015600001650000000177712674023445032003 0ustar pbuserpbgroup00000000000000/* * Copyright (C) 2015 Canonical, Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ #ifndef UBUNTUSETTINGSCOMPONENTS_PLUGIN_H #define UBUNTUSETTINGSCOMPONENTS_PLUGIN_H #include class UbuntuSettingsComponentsPlugin : public QQmlExtensionPlugin { Q_OBJECT Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QQmlExtensionInterface") public: void registerTypes(const char *uri); }; #endif // UBUNTUSETTINGSCOMPONENTS_PLUGIN_H ././@LongLink0000000000000000000000000000014700000000000011217 Lustar 00000000000000ubuntu-settings-components-0.7+16.04.20160321.1/plugins/Ubuntu/Settings/Components/Components.qmltypesubuntu-settings-components-0.7+16.04.20160321.1/plugins/Ubuntu/Settings/Components/Components.qmltyp0000644000015600001650000000514712674023445033724 0ustar pbuserpbgroup00000000000000import QtQuick.tooling 1.1 // This file describes the plugin-supplied types contained in the library. // It is used for QML tooling purposes only. // // This file was auto-generated by: // 'qmlplugindump -notrelocatable Ubuntu.Settings.Components 0.1 plugins' Module { Component { name: "ServerPropertySynchroniser" prototype: "QObject" exports: ["Ubuntu.Settings.Components/ServerPropertySynchroniser 0.1"] exportMetaObjectRevisions: [0] Property { name: "serverTarget"; type: "QObject"; isPointer: true } Property { name: "serverProperty"; type: "string" } Property { name: "userTarget"; type: "QObject"; isPointer: true } Property { name: "userProperty"; type: "string" } Property { name: "userTrigger"; type: "string" } Property { name: "syncTimeout"; type: "int" } Property { name: "useWaitBuffer"; type: "bool" } Property { name: "maximumWaitBufferInterval"; type: "int" } Property { name: "bufferedSyncTimeout"; type: "bool" } Property { name: "syncWaiting"; type: "bool"; isReadonly: true } Signal { name: "serverTargetChanged" Parameter { name: "serverTarget"; type: "QObject"; isPointer: true } } Signal { name: "serverPropertyChanged" Parameter { name: "serverProperty"; type: "string" } } Signal { name: "userTargetChanged" Parameter { name: "userTarget"; type: "QObject"; isPointer: true } } Signal { name: "userPropertyChanged" Parameter { name: "serverProperty"; type: "string" } } Signal { name: "userTriggerChanged" Parameter { name: "userTrigger"; type: "string" } } Signal { name: "syncTimeoutChanged" Parameter { name: "timeout"; type: "int" } } Signal { name: "syncWaitingChanged" Parameter { name: "waiting"; type: "bool" } } Signal { name: "bufferedSyncTimeoutChanged" Parameter { type: "bool" } } Signal { name: "useWaitBufferChanged" Parameter { name: "useWaitBuffer"; type: "bool" } } Signal { name: "maximumWaitBufferIntervalChanged" Parameter { name: "timeout"; type: "int" } } Signal { name: "syncTriggered" Parameter { name: "value"; type: "QVariant" } } Method { name: "updateUserValue" } Method { name: "activate" } Method { name: "reset" } } } ubuntu-settings-components-0.7+16.04.20160321.1/plugins/Ubuntu/Settings/Components/dateExt.js0000644000015600001650000000442412674023445032260 0ustar pbuserpbgroup00000000000000.pragma library function diffMonths(dateA, dateB) { var months; months = (dateB.getFullYear() - dateA.getFullYear()) * 12; months -= dateA.getMonth(); months += dateB.getMonth(); return Math.max(months, 0); } Date.msPerDay = 86400e3 Date.msPerWeek = Date.msPerDay * 7 Date.leapYear = function(year) { return year % 4 == 0 && (year % 100 != 0 || year % 400 == 0) } Date.daysInMonth = function(year, month) { return [ 31/*Jan*/, 28/*Feb*/, 31/*Mar*/, 30/*Apr*/, 31/*May*/, 30/*Jun*/, 31/*Jul*/, 31/*Aug*/, 30/*Sep*/, 31/*Oct*/, 30/*Nov*/, 31/*Dec*/ ][month] + (month == 1) * Date.leapYear(year) } Date.weeksInMonth = function(year, month, weekday) { var y = year, m = month var date0 = new Date(y, m, 1) var date1 = new Date(y + (m == 11), m < 11 ? m + 1 : 0, 1) var day = date0.getDay() var m = (date1.getTime() - date0.getTime()) / Date.msPerDay var n = 0 while (m > 0) { if (day == weekday) n = n + 1 day = day < 6 ? day + 1 : 0 m = m - 1 } return n } Date.prototype.midnight = function() { var date = new Date(this) date.setHours(0,0,0,0); return date } Date.prototype.addDays = function(days) { var date = new Date(this) date.setTime(date.getTime() + Date.msPerDay * days) return date } Date.prototype.addMonths = function(months) { var date = new Date(this) date.setMonth(date.getMonth() + months) return date } Date.prototype.weekStart = function(weekStartDay) { var date = this.midnight() var day = date.getDay(), n = 0 while (day != weekStartDay) { if (day == 0) day = 6 else day = day - 1 n = n + 1 } return date.addDays(-n) } Date.prototype.monthStart = function() { var date = new Date(this).midnight(); date.setDate(1); return date; } Date.prototype.weekNumber = function() { var date = this.weekStart(1).addDays(3) // Thursday midnight var newYear = new Date(date.getFullYear(), 0 /*Jan*/, 1 /*the 1st*/) var n = 0 var tx = date.getTime(), tn = newYear.getTime() while (tn < tx) { tx = tx - Date.msPerWeek n = n + 1 } return n } Date.prototype.weeksInMonth = function(weekday) { return Date.weeksInMonth(this.getFullYear(), this.getMonth(), weekday) } ubuntu-settings-components-0.7+16.04.20160321.1/plugins/Ubuntu/Settings/Components/plugin.cpp0000644000015600001650000000162312674023445032324 0ustar pbuserpbgroup00000000000000/* * Copyright (C) 2015 Canonical, Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ // local #include "plugin.h" #include "serverpropertysynchroniser.h" // Qt #include void UbuntuSettingsComponentsPlugin::registerTypes(const char *uri) { qmlRegisterType(uri, 0, 1, "ServerPropertySynchroniser"); } ././@LongLink0000000000000000000000000000014700000000000011217 Lustar 00000000000000ubuntu-settings-components-0.7+16.04.20160321.1/plugins/Ubuntu/Settings/Components/ActionTextField.qmlubuntu-settings-components-0.7+16.04.20160321.1/plugins/Ubuntu/Settings/Components/ActionTextField.q0000644000015600001650000000430312674023445033530 0ustar pbuserpbgroup00000000000000/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Authors: * Renato Araujo Oliveira Filho * Olivier Tilloy */ import QtQuick 2.4 import Ubuntu.Components 1.3 import QtQuick.Layouts 1.1 Item { id: textField property alias text: replyField.text property alias buttonText: sendButton.text property bool activateEnabled: false property alias textHint: replyField.placeholderText signal activated(var value) implicitHeight: layout.implicitHeight Row { id: layout anchors { left: parent.left right: parent.right } spacing: units.gu(1) TextArea { id: replyField objectName: "replyText" autoSize: true width: parent.width - layout.spacing - sendButton.width onEnabledChanged: { //Make sure that the component lost focus when enabled = false, //otherwise it will get focus again when enable = true if (!enabled) { focus = false; } } } Button { id: sendButton objectName: "sendButton" Layout.preferredWidth: units.gu(9) enabled: (replyField.text !== "" || replyField.inputMethodComposing) && textField.activateEnabled color: enabled ? theme.palette.normal.positive : theme.palette.disabled.positive onClicked: { Qt.inputMethod.commit(); textField.activated(replyField.text); } } } } ubuntu-settings-components-0.7+16.04.20160321.1/plugins/Ubuntu/Settings/Components/MessageHeader.qml0000644000015600001650000000731312674023445033534 0ustar pbuserpbgroup00000000000000/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Authors: * Renato Araujo Oliveira Filho * Olivier Tilloy */ import QtQuick 2.4 import Ubuntu.Components 1.3 import QtQuick.Layouts 1.1 Item { id: messageHeader property alias avatar: avatarImage.source property alias icon: iconImage.source property alias title: titleText.text property alias time: timeText.text property alias body: bodyText.text signal iconClicked() implicitHeight: layout.height function shakeIcon() { shake.restart(); } RowLayout { id: layout anchors { left: parent.left right: parent.right rightMargin: units.gu(4) } spacing: units.gu(2) UbuntuShapeForItem { Layout.preferredWidth: units.gu(6) Layout.preferredHeight: units.gu(6) image: avatarImage Icon { id: avatarImage objectName: "avatar" color: { if (String(source).match(/^image:\/\/theme/)) { return theme.palette.normal.backgroundText; } return Qt.rgba(0.0, 0.0, 0.0, 0.0); } } } ColumnLayout { Label { id: titleText objectName: "title" maximumLineCount: 1 elide: Text.ElideRight font.weight: Font.DemiBold fontSize: "medium" Layout.fillWidth: true // calculate width with regard to the time's incursion into this layout's space. Layout.maximumWidth: layout.width - timeLayout.width - units.gu(4) } spacing: units.gu(0.5) Label { id: bodyText objectName: "body" maximumLineCount: 3 wrapMode: Text.WordWrap elide: Text.ElideRight fontSize: "small" Layout.fillWidth: true } } } ColumnLayout { id: timeLayout anchors.right: parent.right Label { id: timeText objectName: "time" anchors.right: parent.right fontSize: "x-small" maximumLineCount: 1 } spacing: units.gu(0.5) Icon { id: iconImage objectName: "icon" Layout.preferredHeight: units.gu(3) Layout.preferredWidth: units.gu(3) Layout.alignment: Qt.AlignRight color: theme.palette.normal.backgroundText MouseArea { anchors.fill: parent onClicked: messageHeader.iconClicked() } SequentialAnimation { id: shake PropertyAnimation { target: iconImage; property: "rotation"; duration: 50; to: -20 } SpringAnimation { target: iconImage; property: "rotation"; from: -20; to: 0; mass: 0.5; spring: 15; damping: 0.1 } } } } } ././@LongLink0000000000000000000000000000016000000000000011212 Lustar 00000000000000ubuntu-settings-components-0.7+16.04.20160321.1/plugins/Ubuntu/Settings/Components/serverpropertysynchroniser.hubuntu-settings-components-0.7+16.04.20160321.1/plugins/Ubuntu/Settings/Components/serverpropertysyn0000644000015600001650000001246112674023445034114 0ustar pbuserpbgroup00000000000000/* * Copyright (C) 2015 Canonical, Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ #ifndef SERVERPROPERTYSYNCHRONISER_H #define SERVERPROPERTYSYNCHRONISER_H #include #include #include class QTimer; class ServerPropertySynchroniser : public QObject, public QQmlParserStatus { Q_OBJECT Q_INTERFACES(QQmlParserStatus) // Target object which contains the property to keep the user property in sync with. Q_PROPERTY(QObject* serverTarget READ serverTarget WRITE setServerTarget NOTIFY serverTargetChanged) // Server property to keep the user property in sync with. Q_PROPERTY(QString serverProperty READ serverProperty WRITE setServerProperty NOTIFY serverPropertyChanged) // User object (control) which sources the property to update the server property. // Defaults to the object's parent if not set. Q_PROPERTY(QObject* userTarget READ userTarget WRITE setUserTarget NOTIFY userTargetChanged) // User property to update the server property. Q_PROPERTY(QString userProperty READ userProperty WRITE setUserProperty NOTIFY userPropertyChanged) // Trigger that causes an update. By default, the control will use the userProperty change notification. // eg. "onTriggered" Q_PROPERTY(QString userTrigger READ userTrigger WRITE setUserTrigger NOTIFY userTriggerChanged) // Time to wait for a change verification before re-asserting the server value. Q_PROPERTY(int syncTimeout READ syncTimeout WRITE setSyncTimeout NOTIFY syncTimeoutChanged) // Buffer user property changes until the previous change is verified Q_PROPERTY(bool useWaitBuffer READ useWaitBuffer WRITE setUseWaitBuffer NOTIFY useWaitBufferChanged) // Maximum intervals between buffers for the server to respond. If we don't get a response within this interval, // the next buffer will be sent. Good for live sliders. Defaults to disabled. Q_PROPERTY(int maximumWaitBufferInterval READ maximumWaitBufferInterval WRITE setMaximumWaitBufferInterval NOTIFY maximumWaitBufferIntervalChanged) // Resend the buffered value if we timeout waiting for a change from the server. Defaults to false Q_PROPERTY(bool bufferedSyncTimeout READ bufferedSyncTimeout WRITE setBufferedSyncTimeout NOTIFY bufferedSyncTimeoutChanged) // True if we're waiting for a change verification from the server Q_PROPERTY(bool syncWaiting READ syncWaiting NOTIFY syncWaitingChanged) public: ServerPropertySynchroniser(QObject* parent = nullptr); QObject* serverTarget() const; void setServerTarget(QObject* target); QString serverProperty() const; void setServerProperty(const QString& property); QObject* userTarget() const; void setUserTarget(QObject* target); QString userProperty() const; void setUserProperty(const QString& property); QString userTrigger() const; void setUserTrigger(const QString& trigger); int syncTimeout() const; void setSyncTimeout(int timeout); bool useWaitBuffer() const; void setUseWaitBuffer(bool value); int maximumWaitBufferInterval() const; void setMaximumWaitBufferInterval(int timeout); bool bufferedSyncTimeout() const; void setBufferedSyncTimeout(bool); bool syncWaiting() const; void classBegin() override; void componentComplete() override; Q_INVOKABLE void reset(); public Q_SLOTS: void updateUserValue(); void activate(); Q_SIGNALS: void serverTargetChanged(QObject* serverTarget); void serverPropertyChanged(QString serverProperty); void userTargetChanged(QObject* userTarget); void userPropertyChanged(QString serverProperty); void userTriggerChanged(QString userTrigger); void syncTimeoutChanged(int timeout); void syncWaitingChanged(bool waiting); void bufferedSyncTimeoutChanged(bool); void useWaitBufferChanged(bool useWaitBuffer); void maximumWaitBufferIntervalChanged(int timeout); // Emitted when we want to update the backend. void syncTriggered(const QVariant& value); private Q_SLOTS: void serverSyncTimedOut(); void bufferTimedOut(); private: void connectServer(); void connectUser(); QObject* m_serverTarget; QString m_serverProperty; QObject* m_userTarget; QString m_userProperty; QString m_userTrigger; bool m_classComplete; bool m_busy; QObject* m_connectedServerTarget; QObject* m_connectedUserTarget; QTimer* m_serverSyncTimer; QTimer* m_bufferDamper; bool m_useWaitBuffer; bool m_haveNextActivate; bool m_bufferedSyncTimeout; bool m_serverUpdatedDuringBufferDamping; int m_activateCount; }; #endif // SERVERPROPERTYSYNCHRONISER_H ubuntu-settings-components-0.7+16.04.20160321.1/plugins/Ubuntu/Settings/Components/StatusIcon.qml0000644000015600001650000001003312674023445033124 0ustar pbuserpbgroup00000000000000/* * Copyright 2014 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ import QtQuick 2.4 Item { id: root /*! The source of the icon to display. \qmlproperty url source */ property url source /*! The color that all pixels that originally are of color \l keyColor should take. \qmlproperty color color */ property alias color: colorizedImage.keyColorOut /*! The color of the pixels that should be colorized. By default it is set to #808080. \qmlproperty color keyColor */ property alias keyColor: colorizedImage.keyColorIn // FIXME: should only be "status", but overriding in settings app doesn't work. property var sets: ["status","apps"] implicitWidth: image.width Image { id: image objectName: "image" anchors { top: parent.top; bottom: parent.bottom } sourceSize.height: height visible: !colorizedImage.active property string iconPath: "/usr/share/icons/suru/%1/scalable/%2.svg" property var icons: { if (String(root.source).match(/^image:\/\/theme/)) { return String(root.source).replace("image://theme/", "").split(","); } else return null; } property int fallback: 0 property int setFallback: 0 Component.onCompleted: updateSource() onStatusChanged: if (status == Image.Error) bump(); onIconsChanged: reset() Connections { target: root onSetsChanged: image.reset() } function reset() { fallback = 0; setFallback = 0; updateSource(); } function bump() { if (icons === null) return; if (fallback < icons.length - 1) fallback += 1; else if (setFallback < root.sets.length - 1) { setFallback += 1; fallback = 0; } else { console.warn("Could not load StatusIcon with source \"%1\" and sets %2.".arg(root.source).arg(root.sets)); return; } updateSource(); } function updateSource() { if (icons === null) { source = root.source; } else { source = (root.sets && root.sets.length > setFallback) && (icons && icons.length > fallback) ? iconPath.arg(root.sets[setFallback]).arg(icons[fallback]) : ""; } } } ShaderEffect { id: colorizedImage anchors.fill: parent visible: active && image.status == Image.Ready // Whether or not a color has been set. property bool active: keyColorOut != Qt.rgba(0.0, 0.0, 0.0, 0.0) property Image source: visible ? image : null property color keyColorOut: Qt.rgba(0.0, 0.0, 0.0, 0.0) property color keyColorIn: "#808080" property real threshold: 0.1 fragmentShader: " varying highp vec2 qt_TexCoord0; uniform sampler2D source; uniform highp vec4 keyColorOut; uniform highp vec4 keyColorIn; uniform lowp float threshold; uniform lowp float qt_Opacity; void main() { lowp vec4 sourceColor = texture2D(source, qt_TexCoord0); gl_FragColor = mix(vec4(keyColorOut.rgb, 1.0) * sourceColor.a, sourceColor, step(threshold, distance(sourceColor.rgb / sourceColor.a, keyColorIn.rgb))) * qt_Opacity; }" } } ubuntu-settings-components-0.7+16.04.20160321.1/plugins/Ubuntu/Settings/Components/qmldir0000644000015600001650000000046312674023445031536 0ustar pbuserpbgroup00000000000000module Ubuntu.Settings.Components plugin UbuntuSettingsComponentsQml typeinfo Components.qmltypes ActionTextField 0.1 ActionTextField.qml Calendar 0.1 Calendar.qml MessageHeader 0.1 MessageHeader.qml QuickReply 0.1 QuickReply.qml StatusIcon 0.1 StatusIcon.qml UbuntuShapeForItem 0.1 UbuntuShapeForItem.qml ubuntu-settings-components-0.7+16.04.20160321.1/plugins/Ubuntu/Settings/Components/CMakeLists.txt0000644000015600001650000000074212674023445033063 0ustar pbuserpbgroup00000000000000project(UbuntuSettingsComponentsQml) find_package(Qt5Core REQUIRED) include_directories( ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR} ) add_definitions(-DUBUNTUSETTINGSCOMPONENTS_LIBRARY) add_library(UbuntuSettingsComponentsQml MODULE plugin.cpp serverpropertysynchroniser.cpp ) qt5_use_modules(UbuntuSettingsComponentsQml Core Qml Quick) add_usc_plugin(Ubuntu.Settings.Components 0.1 Ubuntu/Settings/Components TARGETS UbuntuSettingsComponentsQml) ubuntu-settings-components-0.7+16.04.20160321.1/plugins/Ubuntu/Settings/Vpn/0000755000015600001650000000000012674023672026740 5ustar pbuserpbgroup00000000000000ubuntu-settings-components-0.7+16.04.20160321.1/plugins/Ubuntu/Settings/Vpn/VpnRoutesField.qml0000644000015600001650000000471512674023445032371 0ustar pbuserpbgroup00000000000000/* * Copyright (C) 2016 Canonical Ltd. * * This program is free software: you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License version 3, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import QtQuick.Layouts 1.1 import Ubuntu.Components 1.3 import Ubuntu.Components.ListItems 1.3 as ListItems Column { id: routes spacing: units.gu(1) property alias neverDefault: ownNetworksToggle.checked property bool enabled: true Label { text: i18n.dtr("ubuntu-settings-components", "Use this VPN for:") font.bold: true color: Theme.palette.normal.baseText elide: Text.ElideRight } Column { anchors { left: parent.left; right: parent.right } spacing: units.gu(1) ListItems.ThinDivider {} RowLayout { anchors { left: parent.left; right: parent.right } CheckBox { id: allNetworksToggle objectName: "vpnAllNetworksToggle" checked: !ownNetworksToggle.checked onTriggered: { ownNetworksToggle.checked = !checked; checked = Qt.binding(function () { return !ownNetworksToggle.checked }); } enabled: routes.enabled activeFocusOnPress: false } Label { text: i18n.dtr("ubuntu-settings-components", "All network connections") Layout.fillWidth: true } } RowLayout { anchors { left: parent.left; right: parent.right } CheckBox { id: ownNetworksToggle objectName: "vpnOwnNetworksToggle" enabled: routes.enabled activeFocusOnPress: false } Label { text: i18n.dtr("ubuntu-settings-components", "Its own network") Layout.fillWidth: true } } ListItems.ThinDivider {} } } ubuntu-settings-components-0.7+16.04.20160321.1/plugins/Ubuntu/Settings/Vpn/VpnPreviewDialog.qml0000644000015600001650000000714512674023445032705 0ustar pbuserpbgroup00000000000000/* * Copyright (C) 2016 Canonical Ltd. * * This program is free software: you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License version 3, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import QtQuick.Layouts 1.1 import Ubuntu.Components 1.3 import Ubuntu.Components.Popups 1.3 Dialog { objectName: "vpnPreviewDialog" id: preview // A connection we assume to be installed. property var connection: null // A configuration we assume is not installed. // A configuration is expected to have a set of // properties, just like a connection. property var configuration: null function getConnection () { return connection ? connection : configuration; } function isInstalled () { return !!connection; } signal changeClicked(var connection) signal installClicked(var configuration) Component.onCompleted: { var source; var conn = getConnection(); switch (conn.type) { case 0: // Openvpn source = "Openvpn/Preview.qml"; // TRANSLATORS: %1 is the hostname of a VPN connection if (conn.remote) title = i18n.dtr("ubuntu-settings-components", "VPN “%1”").arg(conn.remote); break; case 1: // PPTP source = "Pptp/Preview.qml"; // TRANSLATORS: %1 is the hostname of a VPN connection if (conn.gateway) title = i18n.dtr("ubuntu-settings-components", "VPN “%1”").arg(conn.gateway); break; default: // Unknown source = ""; break; } contentLoader.setSource(source, { connection: getConnection(), installed: isInstalled() }); if (!title) title = i18n.dtr("ubuntu-settings-components", "VPN"); } Loader { id: contentLoader anchors { left: parent.left; right: parent.right; } } RowLayout { spacing: units.gu(2) Button { objectName: "vpnPreviewRemoveButton" Layout.fillWidth: true visible: connection !== null text: i18n.dtr("ubuntu-settings-components", "Remove") color: UbuntuColors.red onClicked: { connection.remove(); PopupUtils.close(preview); } } Button { objectName: "vpnPreviewChangeButton" Layout.fillWidth: true visible: connection !== null text: i18n.dtr("ubuntu-settings-components", "Change") onClicked: changeClicked(connection) } Button { objectName: "vpnPreviewCancelButton" Layout.fillWidth: true visible: configuration !== null text: i18n.dtr("ubuntu-settings-components", "Cancel") onClicked: PopupUtils.close(preview) } Button { objectName: "vpnPreviewInstallButton" Layout.fillWidth: true visible: configuration !== null text: i18n.dtr("ubuntu-settings-components", "Install") onClicked: installClicked(configuration) } } } ubuntu-settings-components-0.7+16.04.20160321.1/plugins/Ubuntu/Settings/Vpn/PreviewDialog/0000755000015600001650000000000012674023672031501 5ustar pbuserpbgroup00000000000000ubuntu-settings-components-0.7+16.04.20160321.1/plugins/Ubuntu/Settings/Vpn/PreviewDialog/NoCert.qml0000644000015600001650000000227112674023445033406 0ustar pbuserpbgroup00000000000000/* * Copyright (C) 2016 Canonical Ltd. * * This program is free software: you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License version 3, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.3 Column { spacing: units.gu(2) objectName: "vpnPreviewNoCert" Label { wrapMode: Text.WordWrap anchors { left: parent.left; right: parent.right; } text: i18n.dtr("ubuntu-settings-components", "This VPN is not safe to use.") } Label { wrapMode: Text.WordWrap anchors { left: parent.left; right: parent.right; } text: i18n.dtr("ubuntu-settings-components", "It does not provide a certificate. The VPN provider could be impersonated.") } } ././@LongLink0000000000000000000000000000017000000000000011213 Lustar 00000000000000ubuntu-settings-components-0.7+16.04.20160321.1/plugins/Ubuntu/Settings/Vpn/PreviewDialog/NotInstalledWithoutRoutes.qmlubuntu-settings-components-0.7+16.04.20160321.1/plugins/Ubuntu/Settings/Vpn/PreviewDialog/NotInstall0000644000015600001650000000413312674023445033512 0ustar pbuserpbgroup00000000000000/* * Copyright (C) 2016 Canonical Ltd. * * This program is free software: you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License version 3, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.3 Column { spacing: units.gu(2) objectName: "vpnPreviewNotInstalledWithoutRoutes" Label { wrapMode: Text.WordWrap anchors { left: parent.left; right: parent.right; } text: i18n.dtr("ubuntu-settings-components", "This VPN configuration is not installed.") } Label { wrapMode: Text.WordWrap anchors { left: parent.left; right: parent.right; } text: i18n.dtr("ubuntu-settings-components", "If you install it:") } Label { wrapMode: Text.WordWrap anchors { left: parent.left; right: parent.right; } text: i18n.dtr("ubuntu-settings-components", "Your Wi-Fi/mobile provider can see when and how much you use the Internet, but not what for.") } Label { wrapMode: Text.WordWrap anchors { left: parent.left; right: parent.right; } text: i18n.dtr("ubuntu-settings-components", "The DNS provider can see which Web sites and other services you use. ") } Label { wrapMode: Text.WordWrap anchors { left: parent.left; right: parent.right; } text: i18n.dtr("ubuntu-settings-components", "The VPN provider can see or modify your Internet traffic.") } Label { wrapMode: Text.WordWrap anchors { left: parent.left; right: parent.right; } text: i18n.dtr("ubuntu-settings-components", "Web sites and other service providers can still monitor your use.") } } ././@LongLink0000000000000000000000000000016000000000000011212 Lustar 00000000000000ubuntu-settings-components-0.7+16.04.20160321.1/plugins/Ubuntu/Settings/Vpn/PreviewDialog/AllTrafficWithDns.qmlubuntu-settings-components-0.7+16.04.20160321.1/plugins/Ubuntu/Settings/Vpn/PreviewDialog/AllTraffic0000644000015600001650000000326512674023445033437 0ustar pbuserpbgroup00000000000000/* * Copyright (C) 2016 Canonical Ltd. * * This program is free software: you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License version 3, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.3 Column { spacing: units.gu(2) objectName: "vpnPreviewAllTrafficWithDns" Label { wrapMode: Text.WordWrap anchors { left: parent.left; right: parent.right; } text: i18n.dtr("ubuntu-settings-components", "You’re using this VPN for all Internet traffic.") } Label { wrapMode: Text.WordWrap anchors { left: parent.left; right: parent.right; } text: i18n.dtr("ubuntu-settings-components", "Your Wi-Fi/mobile provider can see when and how much you use the Internet, but not what for.") } Label { wrapMode: Text.WordWrap anchors { left: parent.left; right: parent.right; } text: i18n.dtr("ubuntu-settings-components", "The VPN provider can see or modify your Internet traffic.") } Label { wrapMode: Text.WordWrap anchors { left: parent.left; right: parent.right; } text: i18n.dtr("ubuntu-settings-components", "Web sites and other service providers can still monitor your use.") } } ././@LongLink0000000000000000000000000000016300000000000011215 Lustar 00000000000000ubuntu-settings-components-0.7+16.04.20160321.1/plugins/Ubuntu/Settings/Vpn/PreviewDialog/AllTrafficWithoutDns.qmlubuntu-settings-components-0.7+16.04.20160321.1/plugins/Ubuntu/Settings/Vpn/PreviewDialog/AllTraffic0000644000015600001650000000363012674023445033433 0ustar pbuserpbgroup00000000000000/* * Copyright (C) 2016 Canonical Ltd. * * This program is free software: you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License version 3, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.3 Column { spacing: units.gu(2) objectName: "vpnPreviewAllTrafficWithoutDns" Label { wrapMode: Text.WordWrap anchors { left: parent.left; right: parent.right; } text: i18n.dtr("ubuntu-settings-components", "You’re using this VPN for all Internet traffic.") } Label { wrapMode: Text.WordWrap anchors { left: parent.left; right: parent.right; } text: i18n.dtr("ubuntu-settings-components", "Your Wi-Fi/mobile provider can still see when and how much you use the Internet.") } Label { wrapMode: Text.WordWrap anchors { left: parent.left; right: parent.right; } text: i18n.dtr("ubuntu-settings-components", "The DNS provider can see which Web sites and other services you use.") } Label { wrapMode: Text.WordWrap anchors { left: parent.left; right: parent.right; } text: i18n.dtr("ubuntu-settings-components", "The VPN provider can see or modify your Internet traffic.") } Label { wrapMode: Text.WordWrap anchors { left: parent.left; right: parent.right; } text: i18n.dtr("ubuntu-settings-components", "Web sites and other service providers can still monitor your use.") } } ././@LongLink0000000000000000000000000000015200000000000011213 Lustar 00000000000000ubuntu-settings-components-0.7+16.04.20160321.1/plugins/Ubuntu/Settings/Vpn/PreviewDialog/SetUpUnused.qmlubuntu-settings-components-0.7+16.04.20160321.1/plugins/Ubuntu/Settings/Vpn/PreviewDialog/SetUpUnuse0000644000015600001650000000410712674023445033504 0ustar pbuserpbgroup00000000000000/* * Copyright (C) 2016 Canonical Ltd. * * This program is free software: you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License version 3, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.3 Column { spacing: units.gu(2) objectName: "vpnPreviewSetUpUnused" Label { wrapMode: Text.WordWrap anchors { left: parent.left; right: parent.right; } text: i18n.dtr("ubuntu-settings-components", "This VPN is set up, but not in use now.") } Label { wrapMode: Text.WordWrap anchors { left: parent.left; right: parent.right; } text: i18n.dtr("ubuntu-settings-components", "When you use it:") } Label { wrapMode: Text.WordWrap anchors { left: parent.left; right: parent.right; } // TRANSLATORS: This describes the effect, should you enable the VPN. text: i18n.dtr("ubuntu-settings-components", "Your Wi-Fi/mobile provider can see when and how much you use the Internet, but not what for.") } Label { wrapMode: Text.WordWrap anchors { left: parent.left; right: parent.right; } // TRANSLATORS: This describes the effect, should you enable the VPN. text: i18n.dtr("ubuntu-settings-components", "The VPN provider can see or modify your Internet traffic.") } Label { wrapMode: Text.WordWrap anchors { left: parent.left; right: parent.right; } // TRANSLATORS: This describes the effect, should you enable the VPN. text: i18n.dtr("ubuntu-settings-components", "Web sites and other service providers can still monitor your use.") } } ././@LongLink0000000000000000000000000000016500000000000011217 Lustar 00000000000000ubuntu-settings-components-0.7+16.04.20160321.1/plugins/Ubuntu/Settings/Vpn/PreviewDialog/NotInstalledWithRoutes.qmlubuntu-settings-components-0.7+16.04.20160321.1/plugins/Ubuntu/Settings/Vpn/PreviewDialog/NotInstall0000644000015600001650000000412712674023445033515 0ustar pbuserpbgroup00000000000000/* * Copyright (C) 2016 Canonical Ltd. * * This program is free software: you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License version 3, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.3 Column { spacing: units.gu(2) objectName: "vpnPreviewNotInstalledWithRoutes" Label { wrapMode: Text.WordWrap anchors { left: parent.left; right: parent.right; } text: i18n.dtr("ubuntu-settings-components", "This VPN configuration is not installed.") } Label { wrapMode: Text.WordWrap anchors { left: parent.left; right: parent.right; } text: i18n.dtr("ubuntu-settings-components", "If you install it:") } Label { wrapMode: Text.WordWrap anchors { left: parent.left; right: parent.right; } text: i18n.dtr("ubuntu-settings-components", "Your Wi-Fi/mobile provider can see when and how much you use the Internet, but not what for.") } Label { wrapMode: Text.WordWrap anchors { left: parent.left; right: parent.right; } text: i18n.dtr("ubuntu-settings-components", "The DNS provider can see which Web sites and other services you use.") } Label { wrapMode: Text.WordWrap anchors { left: parent.left; right: parent.right; } text: i18n.dtr("ubuntu-settings-components", "The VPN provider can see or modify your Internet traffic.") } Label { wrapMode: Text.WordWrap anchors { left: parent.left; right: parent.right; } text: i18n.dtr("ubuntu-settings-components", "Web sites and other service providers can still monitor your use.") } } ././@LongLink0000000000000000000000000000015200000000000011213 Lustar 00000000000000ubuntu-settings-components-0.7+16.04.20160321.1/plugins/Ubuntu/Settings/Vpn/PreviewDialog/SomeTraffic.qmlubuntu-settings-components-0.7+16.04.20160321.1/plugins/Ubuntu/Settings/Vpn/PreviewDialog/SomeTraffi0000644000015600001650000000267212674023445033470 0ustar pbuserpbgroup00000000000000/* * Copyright (C) 2016 Canonical Ltd. * * This program is free software: you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License version 3, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.3 Column { spacing: units.gu(2) objectName: "vpnPreviewSomeTraffic" Label { wrapMode: Text.WordWrap anchors { left: parent.left; right: parent.right; } text: i18n.dtr("ubuntu-settings-components", "You’re using this VPN for specific services.") } Label { wrapMode: Text.WordWrap anchors { left: parent.left; right: parent.right; } text: i18n.dtr("ubuntu-settings-components", "Your traffic to these services is private to them and the VPN provider.") } Label { wrapMode: Text.WordWrap anchors { left: parent.left; right: parent.right; } text: i18n.dtr("ubuntu-settings-components", "Your Wi-Fi/mobile provider can track your use of any other services. ") } } ././@LongLink0000000000000000000000000000015100000000000011212 Lustar 00000000000000ubuntu-settings-components-0.7+16.04.20160321.1/plugins/Ubuntu/Settings/Vpn/PreviewDialog/CMakeLists.txtubuntu-settings-components-0.7+16.04.20160321.1/plugins/Ubuntu/Settings/Vpn/PreviewDialog/CMakeLists0000644000015600001650000000024412674023445033421 0ustar pbuserpbgroup00000000000000project(UbuntuSettingsVpnPreviewDialog) export_qmlfiles(Ubuntu.Settings.Vpn.PreviewDialog Ubuntu/Settings/Vpn/PreviewDialog DESTINATION ${QT_IMPORTS_DIR} ${ARGN}) ././@LongLink0000000000000000000000000000015200000000000011213 Lustar 00000000000000ubuntu-settings-components-0.7+16.04.20160321.1/plugins/Ubuntu/Settings/Vpn/PreviewDialog/InvalidCert.qmlubuntu-settings-components-0.7+16.04.20160321.1/plugins/Ubuntu/Settings/Vpn/PreviewDialog/InvalidCer0000644000015600001650000000513612674023445033447 0ustar pbuserpbgroup00000000000000/* * Copyright (C) 2016 Canonical Ltd. * * This program is free software: you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License version 3, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.3 import Ubuntu.Settings.Vpn 0.1 Column { property var error spacing: units.gu(2) objectName: "vpnPreviewInvalidCert" Label { wrapMode: Text.WordWrap anchors { left: parent.left; right: parent.right; } text: i18n.dtr("ubuntu-settings-components", "This VPN is not safe to use.") } Label { wrapMode: Text.WordWrap anchors { left: parent.left; right: parent.right; } text: i18n.dtr("ubuntu-settings-components", "The server certificate is not valid. The VPN provider may be being impersonated.") } Label { objectName: "vpnPreviewInvalidCertErrorMsg" wrapMode: Text.WordWrap anchors { left: parent.left; right: parent.right; } visible: error text: { // TRANSLATORS: %1 is a reason for why a VPN certificate was invalid. var detailsLabel = i18n.dtr("ubuntu-settings-components", "Details: %1"); var errorMsg; switch(error) { case UbuntuSettingsVpn.CERT_NOT_FOUND: errorMsg = i18n.dtr("ubuntu-settings-components", "The certificate was not found."); break; case UbuntuSettingsVpn.CERT_EMPTY: errorMsg = i18n.dtr("ubuntu-settings-components", "The certificate is empty."); break; case UbuntuSettingsVpn.CERT_SELFSIGNED: errorMsg = i18n.dtr("ubuntu-settings-components", "The certificate is self signed."); break; case UbuntuSettingsVpn.CERT_EXPIRED: errorMsg = i18n.dtr("ubuntu-settings-components", "The certificate has expired."); break; case UbuntuSettingsVpn.CERT_BLACKLISTED: errorMsg = i18n.dtr("ubuntu-settings-components", "The certificate is blacklisted."); break; } return errorMsg ? detailsLabel.arg(errorMsg) : ""; } } } ubuntu-settings-components-0.7+16.04.20160321.1/plugins/Ubuntu/Settings/Vpn/plugin.h0000644000015600001650000000174312674023445030412 0ustar pbuserpbgroup00000000000000/* * Copyright (C) 2016 Canonical, Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ #ifndef UBUNTUSETTINGSVPN_PLUGIN_H #define UBUNTUSETTINGSVPN_PLUGIN_H #include class UbuntuSettingsVpnPlugin : public QQmlExtensionPlugin { Q_OBJECT Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QQmlExtensionInterface") public: void registerTypes(const char *uri); }; #endif // UBUNTUSETTINGSVPN_PLUGIN_H ubuntu-settings-components-0.7+16.04.20160321.1/plugins/Ubuntu/Settings/Vpn/DialogFile.qml0000644000015600001650000001265112674023445031455 0ustar pbuserpbgroup00000000000000/* * Copyright (C) 2016 Canonical Ltd. * * This program is free software: you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License version 3, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import QtQuick.Layouts 1.1 import Ubuntu.Components 1.3 import Ubuntu.Components.ListItems 1.3 as ListItems import Ubuntu.Components.Popups 1.3 import Ubuntu.Settings.Vpn 0.1 import Qt.labs.folderlistmodel 2.1 Dialog { objectName: "vpnDialogFile" id: dialog property string currentFilePath: "" signal accept(string path) signal reject function hideFunc() { DialogFileProperties.lastFolder = modelFs.folder currentFilePath = "" } function rejectFunc() { hideFunc() dialog.reject() } function acceptFunc() { var path = currentFilePath hideFunc() dialog.accept(path) } FolderListModel { id: modelFs showDirs: true showFiles: true showHidden: true showDirsFirst: true showDotAndDotDot: false showOnlyReadable: false sortField: FolderListModel.Name folder: (DialogFileProperties.lastFolder === "")? "file:///home/" : DialogFileProperties.lastFolder } ColumnLayout { height: root.height - units.gu(10) spacing: units.gu(1) Flow { spacing: units.gu(1) Layout.fillWidth: true Repeater { model: { var ret = [] var path = "file:///" ret.push({ "name" : "/", "url" : path }) var tmp = modelFs.folder.toString().replace("file:///", "").split("/") for (var idx = 0; idx < tmp.length; idx++) { var name = tmp[idx] + "/" if (name !== "/") { path += name ret.push({ "name" : name, "url" : path }) } } return ret } delegate: Row { spacing: units.gu(0.7) property bool isCurrent : Positioner.isLastItem Rectangle { width: units.gu(0.7) height: width color: "gray" rotation: 45 visible: (model.index > 0) anchors.verticalCenter: parent.verticalCenter } Label { objectName: "vpnFilePathItem_" + model.modelData["name"] text: model.modelData["name"] font.weight: (isCurrent ? Font.Bold : Font.Normal) font.underline: hoverDetector.containsMouse color: "darkblue" anchors.verticalCenter: parent.verticalCenter MouseArea { id: hoverDetector enabled: !isCurrent hoverEnabled: true anchors.fill: parent onClicked: modelFs.folder = model.modelData["url"] } } } } } Rectangle { Layout.fillWidth: true Layout.fillHeight: true border { width: 1 color: "lightgrey" } ListView { objectName: "vpnFileList" anchors.fill: parent anchors.margins: 1 clip: true model: modelFs delegate: ListItems.Standard { objectName: "vpnFileItem_" + model.fileName text: model.fileName iconFrame: false iconName: model.fileIsDir ? "folder" : "empty" selected: (model.filePath === currentFilePath) onClicked: { if (model.fileIsDir) { modelFs.folder = model.fileURL } else { currentFilePath = model.filePath } } } } } RowLayout { spacing: units.gu(1) Layout.fillWidth: true Button { objectName: "vpnFileCancel" Layout.fillWidth: true text: i18n.dtr("ubuntu-settings-components", "Cancel") onClicked: rejectFunc() color: UbuntuColors.red } Button { objectName: "vpnFileAccept" Layout.fillWidth: true enabled: currentFilePath !== "" text: i18n.dtr("ubuntu-settings-components", "Accept") onClicked: acceptFunc() color: UbuntuColors.green } } } } ubuntu-settings-components-0.7+16.04.20160321.1/plugins/Ubuntu/Settings/Vpn/Openvpn/0000755000015600001650000000000012674023672030365 5ustar pbuserpbgroup00000000000000ubuntu-settings-components-0.7+16.04.20160321.1/plugins/Ubuntu/Settings/Vpn/Openvpn/Editor.qml0000644000015600001650000003212312674023452032323 0ustar pbuserpbgroup00000000000000/* * Copyright (C) 2016 Canonical Ltd. * * This program is free software: you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License version 3, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import QtQuick.Layouts 1.1 import Ubuntu.Components 1.3 import Ubuntu.Components.ListItems 1.3 as ListItems import Ubuntu.Components.Popups 1.3 import ".." Column { id: openVpnEditor spacing: units.gu(2) property var connection property bool changed: getChanges().length > 0 property bool valid: true states: [ State { name: "committing" PropertyChanges { target: okButtonIndicator running: true } PropertyChanges { target: serverField; enabled: false } PropertyChanges { target: customPortToggle; enabled: false } PropertyChanges { target: portField; enabled: false } PropertyChanges { target: routesField; enabled: false } PropertyChanges { target: tcpToggle; enabled: false } PropertyChanges { target: udpToggle; enabled: false } PropertyChanges { target: certField; enabled: false } PropertyChanges { target: caField; enabled: false } PropertyChanges { target: keyField; enabled: false } PropertyChanges { target: certPassField; enabled: false } PropertyChanges { target: taField; enabled: false } PropertyChanges { target: taSetToggle; enabled: false } PropertyChanges { target: taDirSelector; enabled: false } PropertyChanges { target: remoteCertSetToggle; enabled: false } PropertyChanges { target: remoteCertTlsSelector; enabled: false } PropertyChanges { target: cipherSelector; enabled: false } PropertyChanges { target: compressionToggle; enabled: false } PropertyChanges { target: vpnEditorOkayButton; enabled: false } }, State { name: "succeeded" extend: "committing" PropertyChanges { target: successIndicator running: true } PropertyChanges { target: okButtonIndicator running: false } } ] // Return a list of pairs, first the server property name, then // the field value. function getChanges () { var fields = [ ["remote", serverField.text], ["portSet", customPortToggle.checked], ["port", parseInt(portField.text, 10) || 0], ["neverDefault", routesField.neverDefault], ["protoTcp", tcpToggle.checked], ["cert", certField.path], ["ca", caField.path], ["key", keyField.path], ["certPass", certPassField.text], ["ta", taField.path], ["taSet", taSetToggle.checked], ["taDir", parseInt(taDirSelector.selectedIndex, 10) || 0], ["remoteCertTlsSet", remoteCertSetToggle.checked], ["remoteCertTls", parseInt(remoteCertTlsSelector.selectedIndex, 10) || 0], ["cipher", parseInt(cipherSelector.selectedIndex, 10) || 0], ["compLzo", compressionToggle.checked] ] var changedFields = []; // Push all fields that differs from the server to chanagedFields. for (var i = 0; i < fields.length; i++) { if (connection[fields[i][0]] !== fields[i][1]) { changedFields.push(fields[i]); } } return changedFields; } RowLayout { anchors { left: parent.left; right: parent.right } Label { text: i18n.dtr("ubuntu-settings-components", "Server:") font.bold: true color: Theme.palette.normal.baseText elide: Text.ElideRight Layout.fillWidth: true } // Corresponds to the ":" element in the row of server:port textfields. Item { Layout.preferredWidth: units.gu(1) height: units.gu(1) // Value set for the sake of it being drawn. } Label { text: i18n.dtr("ubuntu-settings-components", "Port:") font.bold: true color: Theme.palette.normal.baseText elide: Text.ElideRight Layout.preferredWidth: units.gu(10) } } RowLayout { anchors { left: parent.left; right: parent.right } TextField { id: serverField objectName: "vpnOpenvpnServerField" inputMethodHints: Qt.ImhNoAutoUppercase | Qt.ImhNoPredictiveText | Qt.ImhUrlCharactersOnly Layout.fillWidth: true text: connection.remote Component.onCompleted: forceActiveFocus() } Label { text: ":" horizontalAlignment: Text.AlignHCenter verticalAlignment: Text.AlignVCenter Layout.preferredWidth: units.gu(1) } TextField { id: portField objectName: "vpnOpenvpnPortField" maximumLength: 5 validator: portValidator inputMethodHints: Qt.ImhNoAutoUppercase | Qt.ImhNoPredictiveText text: connection.port Layout.preferredWidth: units.gu(10) enabled: customPortToggle.checked } } RowLayout { anchors { left: parent.left; right: parent.right } CheckBox { id: customPortToggle objectName: "vpnOpenvpnCustomPortToggle" checked: connection.portSet } Label { text: i18n.dtr("ubuntu-settings-components", "Use custom gateway port") Layout.fillWidth: true } } VpnRoutesField { objectName: "vpnOpenvpnRoutesField" anchors { left: parent.left; right: parent.right } id: routesField neverDefault: connection.neverDefault } RegExpValidator { id: portValidator regExp: /([0-9]{1,4}|[1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-5])/ } VpnTypeField { anchors { left: parent.left; right: parent.right } // type does not notify, so we avoid binding to suppress warnings Component.onCompleted: type = connection.type onTypeRequested: { editor.typeChanged(connection, index); } } RowLayout { Label { text: i18n.dtr("ubuntu-settings-components", "Protocol:") font.bold: true color: Theme.palette.normal.baseText elide: Text.ElideRight } Label { id: tcpLabel text: "TCP" } CheckBox { id: tcpToggle objectName: "vpnOpenvpnTcpToggle" checked: connection.protoTcp } Label { text: "UDP" } CheckBox { id: udpToggle objectName: "vpnOpenvpnUdpToggle" checked: !tcpToggle.checked onTriggered: { tcpToggle.checked = !checked; checked = Qt.binding(function () { return !tcpToggle.checked }); } } } Label { font.bold: true color: Theme.palette.normal.baseText elide: Text.ElideRight text: i18n.dtr("ubuntu-settings-components", "Client certificate:") } FileSelector { anchors { left: parent.left; right: parent.right } id: certField objectName: "vpnOpenvpnCertField" path: connection.cert chooseLabel: i18n.dtr("ubuntu-settings-components", "Choose Certificate…") } Label { font.bold: true color: Theme.palette.normal.baseText elide: Text.ElideRight text: i18n.dtr("ubuntu-settings-components", "CA certificate:") } FileSelector { id: caField objectName: "vpnOpenvpnCaField" anchors { left: parent.left; right: parent.right } path: connection.ca chooseLabel: i18n.dtr("ubuntu-settings-components", "Choose Certificate…") } Label { font.bold: true color: Theme.palette.normal.baseText elide: Text.ElideRight text: i18n.dtr("ubuntu-settings-components", "Private key:") } FileSelector { anchors { left: parent.left; right: parent.right } id: keyField objectName: "vpnOpenvpnKeyField" path: connection.key chooseLabel: i18n.dtr("ubuntu-settings-components", "Choose Key…") } Label { font.bold: true color: Theme.palette.normal.baseText elide: Text.ElideRight text: i18n.dtr("ubuntu-settings-components", "Key password:") } TextField { anchors { left: parent.left; right: parent.right } id: certPassField objectName: "vpnOpenvpnCertPassField" echoMode: TextInput.Password text: connection.certPass } RowLayout { CheckBox { id: taSetToggle objectName: "vpnOpenvpnTaSetToggle" checked: connection.taSet onTriggered: connection.taSet = checked activeFocusOnPress: false } Label { text: i18n.dtr("ubuntu-settings-components", "Use additional TLS authentication:") Layout.fillWidth: true } } Label { font.bold: true color: Theme.palette.normal.baseText elide: Text.ElideRight text: i18n.dtr("ubuntu-settings-components", "TLS key:") visible: taSetToggle.checked } FileSelector { anchors { left: parent.left; right: parent.right } id: taField objectName: "vpnOpenvpnTaField" path: connection.ta chooseLabel: i18n.dtr("ubuntu-settings-components", "Choose Key…") visible: taSetToggle.checked } Label { text: i18n.dtr("ubuntu-settings-components", "Key direction:") font.bold: true color: Theme.palette.normal.baseText elide: Text.ElideRight visible: taSetToggle.checked } ListItems.ItemSelector { id: taDirSelector objectName: "vpnOpenvpnTaDirSelector" model: [ i18n.dtr("ubuntu-settings-components", "None"), 0, 1, ] selectedIndex: connection.taDir visible: taSetToggle.checked } RowLayout { CheckBox { id: remoteCertSetToggle objectName: "vpnOpenvpnRemoteCertSetToggle" checked: connection.remoteCertTlsSet activeFocusOnPress: false } Label { text: i18n.dtr("ubuntu-settings-components", "Verify peer certificate:") Layout.fillWidth: true } } Label { font.bold: true color: Theme.palette.normal.baseText elide: Text.ElideRight text: i18n.dtr("ubuntu-settings-components", "Peer certificate TLS type:") visible: remoteCertSetToggle.checked } ListItems.ItemSelector { id: remoteCertTlsSelector objectName: "vpnOpenvpnRemoteCertTlsSelector" model: [ i18n.dtr("ubuntu-settings-components", "Server"), i18n.dtr("ubuntu-settings-components", "Client"), ] selectedIndex: connection.remoteCertTls visible: remoteCertSetToggle.checked } Label { font.bold: true color: Theme.palette.normal.baseText elide: Text.ElideRight text: i18n.dtr("ubuntu-settings-components", "Cipher:") } ListItems.ItemSelector { id: cipherSelector objectName: "vpnOpenvpnCipherSelector" model: [ i18n.dtr("ubuntu-settings-components", "Default"), "DES-CBC", "RC2-CBC", "DES-EDE-CBC", "DES-EDE3-CBC", "DESX-CBC", "RC2-40-CBC", "CAST5-CBC", "AES-128-CBC", "AES-192-CBC", "AES-256-CBC", "CAMELLIA-128-CBC", "CAMELLIA-192-CBC", "CAMELLIA-256-CBC", "SEED-CBC", "AES-128-CBC-HMAC-SHA1", "AES-256-CBC-HMAC-SHA1", ] selectedIndex: connection.cipher } RowLayout { CheckBox { id: compressionToggle objectName: "vpnOpenvpnCompressionToggle" checked: connection.compLzo activeFocusOnPress: false } Label { text: i18n.dtr("ubuntu-settings-components", "Compress data") Layout.fillWidth: true } } } ubuntu-settings-components-0.7+16.04.20160321.1/plugins/Ubuntu/Settings/Vpn/Openvpn/Preview.qml0000644000015600001650000000537512674023445032531 0ustar pbuserpbgroup00000000000000/* * Copyright (C) 2016 Canonical Ltd. * * This program is free software: you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License version 3, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.3 import Ubuntu.Settings.Vpn 0.1 Column { property var connection property bool installed // The order of which source to load is determined by the order in which // they appear in the spec (starting with “This VPN is not safe to use.”) // and ending with “You’re using this VPN for specific services.”. // We do not currently deal with non-installed VPN connections, so we // assume the connection to be installed. function showPreview () { var c = connection; // “This VPN is not safe to use.” if (c.ca) { var err = UbuntuSettingsVpn.isCertificateValid(c.ca); switch (err) { case UbuntuSettingsVpn.CERT_NOT_FOUND: case UbuntuSettingsVpn.CERT_EMPTY: //case UbuntuSettingsVpn.CERT_SELFSIGNED: case UbuntuSettingsVpn.CERT_EXPIRED: case UbuntuSettingsVpn.CERT_BLACKLISTED: return contentLoader.setSource( "../PreviewDialog/InvalidCert.qml", { error: err } ); default: case UbuntuSettingsVpn.CERT_VALID: break; } } else { return contentLoader.setSource("../PreviewDialog/NoCert.qml"); } // “You’re using this VPN for all Internet traffic.” if (c.active && !c.neverDefault) { return contentLoader.setSource( "../PreviewDialog/AllTrafficWithoutDns.qml" ); } // “This VPN is set up, but not in use now.” if (!c.active) { return contentLoader.setSource( "../PreviewDialog/SetUpUnused.qml" ); } // “You’re using this VPN for specific services.” if (c.active && c.neverDefault) { return contentLoader.setSource( "../PreviewDialog/SomeTraffic.qml" ); } } Component.onCompleted: showPreview() Loader { id: contentLoader anchors { left: parent.left; right: parent.right; } } } ubuntu-settings-components-0.7+16.04.20160321.1/plugins/Ubuntu/Settings/Vpn/Openvpn/CMakeLists.txt0000644000015600001650000000022212674023445033117 0ustar pbuserpbgroup00000000000000project(UbuntuSettingsVpnOpenvpn) export_qmlfiles(Ubuntu.Settings.Vpn.Openvpn Ubuntu/Settings/Vpn/Openvpn DESTINATION ${QT_IMPORTS_DIR} ${ARGN}) ubuntu-settings-components-0.7+16.04.20160321.1/plugins/Ubuntu/Settings/Vpn/plugin.cpp0000644000015600001650000000217212674023445030742 0ustar pbuserpbgroup00000000000000/* * Copyright (C) 2016 Canonical, Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ // local #include "plugin.h" #include "ubuntusettingsvpn.h" // Qt #include static QObject *ubuntuSettingsVpnSingeltonProvider(QQmlEngine *engine, QJSEngine *scriptEngine) { Q_UNUSED(engine) Q_UNUSED(scriptEngine) UbuntuSettingsVpn *vpn = new UbuntuSettingsVpn(); return vpn; } void UbuntuSettingsVpnPlugin::registerTypes(const char *uri) { qmlRegisterSingletonType(uri, 0, 1, "UbuntuSettingsVpn", ubuntuSettingsVpnSingeltonProvider); } ubuntu-settings-components-0.7+16.04.20160321.1/plugins/Ubuntu/Settings/Vpn/VpnEditor.qml0000644000015600001650000001151412674023445031365 0ustar pbuserpbgroup00000000000000/* * Copyright (C) 2016 Canonical Ltd. * * This program is free software: you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License version 3, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import QtQuick.Layouts 1.1 import Ubuntu.Components 1.3 import Ubuntu.Components.ListItems 1.3 as ListItems Page { id: editor objectName: "vpnEditor" title: i18n.dtr("ubuntu-settings-components", "Set up VPN") property var connection // If isNew, we delete it on cancel. property var isNew signal typeChanged(var connection, int type) signal reconnectionPrompt() function commit () { editorLoader.item.state = 'committing'; var changes = editorLoader.item.getChanges(); for (var i = 0; i < changes.length; i++) { var key = changes[i][0]; var value = changes[i][1]; connection[key] = value; if (key == "gateway" || key == "remote") connection.id = value; } editorLoader.item.state = 'succeeded'; } function render () { connection.updateSecrets() var props = {"connection": connection} switch (connection.type) { case 0: // Openvpn editorLoader.setSource("Openvpn/Editor.qml", props) break case 1: // Pptp editorLoader.setSource("Pptp/Editor.qml", props) break } } Component.onCompleted: render() header: PageHeader { title: editor.title flickable: scrollWidget leadingActionBar.actions: [] } Component { id: fileDialogComponent DialogFile { id: fileDialog } } Flickable { id: scrollWidget anchors { fill: parent margins: units.gu(2) } contentHeight: contentItem.childrenRect.height boundsBehavior: (contentHeight > editor.height) ? Flickable.DragAndOvershootBounds : Flickable.StopAtBounds Column { anchors { left: parent.left; right: parent.right } spacing: units.gu(2) Loader { id: editorLoader objectName: "editorLoader" anchors.left: parent.left anchors.right: parent.right } RowLayout { anchors { left: parent.left; right: parent.right } Button { objectName: "vpnEditorCancelButton" text: i18n.dtr("ubuntu-settings-components", "Cancel") onClicked: { if (editor.isNew) { connection.remove(); } pageStack.pop(); } Layout.fillWidth: true } Button { id: vpnEditorOkayButton objectName: "vpnEditorOkayButton" text: i18n.dtr("ubuntu-settings-components", "OK") onClicked: editor.commit() Layout.fillWidth: true enabled: editorLoader.item.changed && editorLoader.item.valid Icon { height: parent.height - units.gu(1.5) width: parent.height - units.gu(1.5) anchors { centerIn: parent } name: "tick" color: "green" visible: successIndicator.running } ActivityIndicator { id: okButtonIndicator objectName: "okButtonIndicator" running: false visible: running height: parent.height - units.gu(1.5) anchors { centerIn: parent } } } } } } // Timer that shows a tick in the connect button once we have // successfully connected. Timer { id: successIndicator objectName: "successIndicator" interval: 2000 running: false repeat: false onTriggered: { if (connection.active) { editor.reconnectionPrompt(); } pageStack.pop(); } } } ubuntu-settings-components-0.7+16.04.20160321.1/plugins/Ubuntu/Settings/Vpn/VpnList.qml0000644000015600001650000000363312674023445031055 0ustar pbuserpbgroup00000000000000/* * Copyright (C) 2016 Canonical Ltd. * * This program is free software: you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License version 3, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.3 import Ubuntu.Components.Popups 1.3 import Ubuntu.Settings.Vpn 0.1 ListView { objectName: "vpnList" property var diag signal clickedConnection(var connection) anchors { left: parent.left right: parent.right } height: contentItem.height delegate: ListItem { objectName: "vpnListConnection" + index height: layout.height + divider.height onClicked: clickedConnection(connection) ListItemLayout { objectName: "vpnLayout" id: layout title.text: id Switch { SlotsLayout.position: SlotsLayout.Trailing; id: vpnSwitch objectName: "vpnSwitch" enabled: activatable Binding {target: vpnSwitch; property: "checked"; value: active} onTriggered: active = !active } } divider.visible: true trailingActions: ListItemActions { actions: [ Action { iconName: "delete" text: i18n.dtr("ubuntu-settings-components", "Delete configuration") onTriggered: connection.remove() } ] } } } ubuntu-settings-components-0.7+16.04.20160321.1/plugins/Ubuntu/Settings/Vpn/FileSelector.qml0000644000015600001650000000477512674023445032046 0ustar pbuserpbgroup00000000000000/* * Copyright (C) 2016 Canonical Ltd. * * This program is free software: you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License version 3, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import QtQuick.Layouts 1.1 import Ubuntu.Components 1.3 import Ubuntu.Components.Popups 1.3 import Ubuntu.Components.ListItems 1.3 as ListItems ListItems.ItemSelector { property string path property string chooseLabel: i18n.dtr("ubuntu-settings-components", "Choose…") property var __dialog // FIXME: workaround for lp:1498683. Resetting the model is the only // thing that will make selectedIndex = 0 work. function resetModel () { var m = []; model = m; m.push(i18n.dtr("ubuntu-settings-components", "None")); if (path) { m.push(path); } m.push(chooseLabel); model = m; currentlyExpanded = false; if (path) { selectedIndex = 1; } } function createDialog() { __dialog = PopupUtils.open(fileDialogComponent) __dialog.accept.connect(pathAccepted) __dialog.reject.connect(pathRejected) } function destroyDialog() { __dialog.accept.disconnect(pathAccepted) __dialog.reject.disconnect(pathRejected) PopupUtils.close(__dialog) } function pathAccepted(newPath) { path = newPath destroyDialog(); resetModel(); } function pathRejected() { destroyDialog(); resetModel(); } Component.onCompleted: resetModel() delegate: OptionSelectorDelegate { objectName: "vpnFileSelectorItem" + index text: { if (modelData[0] == "/") { return path.split("/")[path.split("/").length - 1]; } else { return modelData; } } } onDelegateClicked: { if (index === 0) { path = ""; } else if (index === model.length - 1) { createDialog(); } else { path = model[index]; } } } ubuntu-settings-components-0.7+16.04.20160321.1/plugins/Ubuntu/Settings/Vpn/ubuntusettingsvpn.h0000644000015600001650000000223312674023445032736 0ustar pbuserpbgroup00000000000000/* * Copyright (C) 2016 Canonical, Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ #ifndef UBUNTUSETTINGSVPN_H #define UBUNTUSETTINGSVPN_H #include class UbuntuSettingsVpn : public QObject { Q_OBJECT public: explicit UbuntuSettingsVpn(QObject* parent = nullptr); enum CertificateError { CERT_VALID, CERT_NOT_FOUND, CERT_EMPTY, CERT_SELFSIGNED, CERT_EXPIRED, CERT_BLACKLISTED }; Q_ENUMS(CertificateError) Q_INVOKABLE CertificateError isCertificateValid(const QString &path); private: }; #endif // UBUNTUSETTINGSVPN_H ubuntu-settings-components-0.7+16.04.20160321.1/plugins/Ubuntu/Settings/Vpn/DialogFileProperties.qml0000644000015600001650000000133412674023445033526 0ustar pbuserpbgroup00000000000000/* * Copyright (C) 2016 Canonical Ltd. * * This program is free software: you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License version 3, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ pragma Singleton import QtQuick 2.4 QtObject { property string lastFolder } ubuntu-settings-components-0.7+16.04.20160321.1/plugins/Ubuntu/Settings/Vpn/Pptp/0000755000015600001650000000000012674023672027663 5ustar pbuserpbgroup00000000000000ubuntu-settings-components-0.7+16.04.20160321.1/plugins/Ubuntu/Settings/Vpn/Pptp/Editor.qml0000644000015600001650000002721412674023445031630 0ustar pbuserpbgroup00000000000000/* * Copyright (C) 2016 Canonical Ltd. * * This program is free software: you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License version 3, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import QtQuick.Layouts 1.1 import Ubuntu.Components 1.3 import Ubuntu.Components.ListItems 1.3 as ListItems import Ubuntu.Components.Popups 1.3 import ".." Column { id: pptpEditor spacing: units.gu(2) property var connection property bool changed: getChanges().length > 0 property bool valid: isValid() states: [ State { name: "committing" PropertyChanges { target: okButtonIndicator running: true } PropertyChanges { target: gatewayField; enabled: false } PropertyChanges { target: routesField; enabled: false } PropertyChanges { target: userField; enabled: false } PropertyChanges { target: passwordField; enabled: false } PropertyChanges { target: domainField; enabled: false } PropertyChanges { target: requireMppeToggle; enabled: false } PropertyChanges { target: mppeTypeSelector; enabled: false } PropertyChanges { target: mppeStatefulToggle; enabled: false } PropertyChanges { target: allowPapToggle; enabled: false } PropertyChanges { target: allowChapToggle; enabled: false } PropertyChanges { target: allowMschapToggle; enabled: false } PropertyChanges { target: allowMschapv2Toggle; enabled: false } PropertyChanges { target: allowEapToggle; enabled: false } PropertyChanges { target: bsdCompressionToggle; enabled: false } PropertyChanges { target: deflateCompressionToggle; enabled: false } PropertyChanges { target: tcpHeaderCompressionToggle; enabled: false } PropertyChanges { target: sendPppEchoPacketsToggle; enabled: false } PropertyChanges { target: vpnEditorOkayButton; enabled: false } }, State { name: "succeeded" extend: "committing" PropertyChanges { target: okButtonIndicator running: false } PropertyChanges { target: successIndicator running: true } } ] function isValid () { // XXX: Workaround for lp:1551258 where the backend refuses // blank passwords. return passwordField.text.length > 0; } // Return a list of pairs, first the server property name, then // the field value. function getChanges () { var fields = [ ["gateway", gatewayField.text], ["neverDefault", routesField.neverDefault], ["user", userField.text], ["password", passwordField.text], ["domain", domainField.text], ["requireMppe", requireMppeToggle.checked], ["mppeType", mppeTypeSelector.selectedIndex], ["mppeStateful", mppeStatefulToggle.checked], ["allowPap", allowPapToggle.checked], ["allowChap", allowChapToggle.checked], ["allowMschap", allowMschapToggle.checked], ["allowMschapv2", allowMschapv2Toggle.checked], ["allowEap", allowEapToggle.checked], ["bsdCompression", bsdCompressionToggle.checked], ["deflateCompression", deflateCompressionToggle.checked], ["tcpHeaderCompression", tcpHeaderCompressionToggle.checked], ["sendPppEchoPackets", sendPppEchoPacketsToggle.checked] ] var changedFields = []; // Push all fields that differs from the server to chanagedFields. for (var i = 0; i < fields.length; i++) { if (connection[fields[i][0]] !== fields[i][1]) { changedFields.push(fields[i]); } } return changedFields; } Label { text: i18n.dtr("ubuntu-settings-components", "Server:") font.bold: true color: Theme.palette.normal.baseText elide: Text.ElideRight } TextField { anchors { left: parent.left; right: parent.right } id: gatewayField objectName: "vpnPptpGatewayField" inputMethodHints: Qt.ImhNoAutoUppercase | Qt.ImhNoPredictiveText | Qt.ImhUrlCharactersOnly text: connection.gateway Component.onCompleted: forceActiveFocus() } VpnRoutesField { objectName: "vpnPptpRoutesField" anchors { left: parent.left; right: parent.right } id: routesField neverDefault: connection.neverDefault } VpnTypeField { anchors { left: parent.left; right: parent.right } onTypeRequested: { editor.typeChanged(connection, index); } Component.onCompleted: type = connection.type } Label { font.bold: true color: Theme.palette.normal.baseText elide: Text.ElideRight text: i18n.dtr("ubuntu-settings-components", "User:") } TextField { id: userField anchors { left: parent.left; right: parent.right } objectName: "vpnPptpUserField" inputMethodHints: Qt.ImhNoAutoUppercase | Qt.ImhNoPredictiveText text: connection.user } Label { font.bold: true color: Theme.palette.normal.baseText elide: Text.ElideRight text: i18n.dtr("ubuntu-settings-components", "Password:") } TextField { id: passwordField anchors { left: parent.left; right: parent.right } objectName: "vpnPptpPasswordField" echoMode: TextInput.Password text: connection.password } Label { font.bold: true color: Theme.palette.normal.baseText elide: Text.ElideRight text: i18n.dtr("ubuntu-settings-components", "NT Domain:") } TextField { id: domainField anchors { left: parent.left; right: parent.right } objectName: "vpnPptpDomainField" inputMethodHints: Qt.ImhNoAutoUppercase | Qt.ImhNoPredictiveText text: connection.domain } Label { text: i18n.dtr("ubuntu-settings-components", "Authentication methods:") font.bold: true color: Theme.palette.normal.baseText elide: Text.ElideRight } Column { anchors { left: parent.left; right: parent.right } spacing: units.gu(1) ListItems.ThinDivider {} RowLayout { visible: !requireMppeToggle.checked CheckBox { id: allowPapToggle objectName: "vpnPptpAllowPapToggle" checked: connection.allowPap activeFocusOnPress: false } Label { text: "PAP" Layout.fillWidth: true } } RowLayout { visible: !requireMppeToggle.checked CheckBox { id: allowChapToggle objectName: "vpnPptpAllowChapToggle" checked: connection.allowChap activeFocusOnPress: false } Label { text: "CHAP" Layout.fillWidth: true } } RowLayout { CheckBox { id: allowMschapToggle objectName: "vpnPptpAllowMschapToggle" checked: connection.allowMschap activeFocusOnPress: false } Label { text: "MSCHAP" Layout.fillWidth: true } } RowLayout { CheckBox { id: allowMschapv2Toggle objectName: "vpnPptpAllowMschapv2Toggle" checked: connection.allowMschapv2 activeFocusOnPress: false } Label { text: "MSCHAPv2" Layout.fillWidth: true } } RowLayout { visible: !requireMppeToggle.checked CheckBox { id: allowEapToggle objectName: "vpnPptpAllowEapToggle" checked: connection.allowEap activeFocusOnPress: false } Label { text: "EAP" Layout.fillWidth: true } } ListItems.ThinDivider {} } RowLayout { CheckBox { id: requireMppeToggle objectName: "vpnPptpRequireMppeToggle" checked: connection.requireMppe activeFocusOnPress: false } Label { text: i18n.dtr("ubuntu-settings-components", "Use Point-to-Point encryption") Layout.fillWidth: true } } ListItems.ItemSelector { objectName: "vpnPptpMppeTypeSelector" id: mppeTypeSelector model: [ i18n.dtr("ubuntu-settings-components", "All Available (Default)"), i18n.dtr("ubuntu-settings-components", "128-bit (most secure)"), i18n.dtr("ubuntu-settings-components", "40-bit (less secure)") ] selectedIndex: connection.mppeType enabled: requireMppeToggle.checked } RowLayout { CheckBox { id: mppeStatefulToggle objectName: "vpnPptpMppeStatefulToggle" checked: connection.mppeStateful activeFocusOnPress: false enabled: requireMppeToggle.checked } Label { text: i18n.dtr("ubuntu-settings-components", "Allow stateful encryption") Layout.fillWidth: true } } RowLayout { CheckBox { id: bsdCompressionToggle objectName: "vpnPptpBsdCompressionToggle" checked: connection.bsdCompression activeFocusOnPress: false } Label { text: i18n.dtr("ubuntu-settings-components", "Allow BSD data compression") Layout.fillWidth: true } } RowLayout { CheckBox { id: deflateCompressionToggle objectName: "vpnPptpDeflateCompressionToggle" checked: connection.deflateCompression activeFocusOnPress: false } Label { text: i18n.dtr("ubuntu-settings-components", "Allow Deflate data compression") Layout.fillWidth: true } } RowLayout { CheckBox { id: tcpHeaderCompressionToggle objectName: "vpnPptpHeaderCompressionToggle" checked: connection.tcpHeaderCompression activeFocusOnPress: false } Label { text: i18n.dtr("ubuntu-settings-components", "Use TCP Header compression") Layout.fillWidth: true } } RowLayout { CheckBox { id: sendPppEchoPacketsToggle objectName: "vpnPptpPppEchoPacketsToggle" checked: connection.sendPppEchoPackets activeFocusOnPress: false } Label { text: i18n.dtr("ubuntu-settings-components", "Send PPP echo packets") Layout.fillWidth: true } } } ubuntu-settings-components-0.7+16.04.20160321.1/plugins/Ubuntu/Settings/Vpn/Pptp/Preview.qml0000644000015600001650000000376512674023445032030 0ustar pbuserpbgroup00000000000000/* * Copyright (C) 2016 Canonical Ltd. * * This program is free software: you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License version 3, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import Ubuntu.Components 1.3 import Ubuntu.Settings.Vpn 0.1 Column { property var connection property bool installed // The order of which source to load is determined by the order in which // they appear in the spec (starting with “This VPN is not safe to use.”) // and ending with “You’re using this VPN for specific services.”. // We do not currently deal with non-installed VPN connections, so we // assume the connection to be installed. function showPreview () { var c = connection; // “You’re using this VPN for all Internet traffic.” if (c.active && !c.neverDefault) { return contentLoader.setSource( "../PreviewDialog/AllTrafficWithoutDns.qml" ); } // “This VPN is set up, but not in use now.” if (!c.active) { return contentLoader.setSource( "../PreviewDialog/SetUpUnused.qml" ); } // “You’re using this VPN for specific services.” if (c.active && c.neverDefault) { return contentLoader.setSource( "../PreviewDialog/SomeTraffic.qml" ); } } Component.onCompleted: showPreview() Loader { id: contentLoader anchors { left: parent.left; right: parent.right; } } } ubuntu-settings-components-0.7+16.04.20160321.1/plugins/Ubuntu/Settings/Vpn/Pptp/CMakeLists.txt0000644000015600001650000000021112674023445032413 0ustar pbuserpbgroup00000000000000project(UbuntuSettingsVpnPptp) export_qmlfiles(Ubuntu.Settings.Vpn.Pptp Ubuntu/Settings/Vpn/Pptp DESTINATION ${QT_IMPORTS_DIR} ${ARGN}) ubuntu-settings-components-0.7+16.04.20160321.1/plugins/Ubuntu/Settings/Vpn/qmldir0000644000015600001650000000036412674023445030154 0ustar pbuserpbgroup00000000000000module Ubuntu.Settings.Vpn plugin UbuntuSettingsVpn singleton DialogFileProperties 0.1 DialogFileProperties.qml internal DialogFile DialogFile.qml VpnList 0.1 VpnList.qml VpnEditor 0.1 VpnEditor.qml VpnPreviewDialog 0.1 VpnPreviewDialog.qml ubuntu-settings-components-0.7+16.04.20160321.1/plugins/Ubuntu/Settings/Vpn/CMakeLists.txt0000644000015600001650000000076512674023445031506 0ustar pbuserpbgroup00000000000000project(UbuntuSettingsVpn) add_subdirectory(Openvpn) add_subdirectory(Pptp) add_subdirectory(PreviewDialog) find_package(Qt5Core REQUIRED) include_directories( ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR} ) add_definitions(-DUBUNTUSETTINGSCOMPONENTS_LIBRARY) add_library(UbuntuSettingsVpn MODULE plugin.cpp ubuntusettingsvpn.cpp ) qt5_use_modules(UbuntuSettingsVpn Core Qml Quick) add_usc_plugin(Ubuntu.Settings.Vpn 0.1 Ubuntu/Settings/Vpn TARGETS UbuntuSettingsVpn) ubuntu-settings-components-0.7+16.04.20160321.1/plugins/Ubuntu/Settings/Vpn/VpnTypeField.qml0000644000015600001650000000325512674023452032025 0ustar pbuserpbgroup00000000000000/* * Copyright (C) 2016 Canonical Ltd. * * This program is free software: you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License version 3, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import QtQuick.Layouts 1.1 import Ubuntu.Components 1.3 import Ubuntu.Components.ListItems 1.3 as ListItems RowLayout { spacing: units.gu(1) property alias type: vpnTypeSelector.selectedIndex // XXX: disabled due to lp:1551823 (pptp connections fails on arm) property bool enabled: false signal typeRequested(int index) Label { text: i18n.dtr("ubuntu-settings-components", "Type:") enabled: parent.enabled font.bold: true color: Theme.palette.normal.baseText elide: Text.ElideRight horizontalAlignment: Text.AlignRight Layout.fillWidth: true } ListItems.ItemSelector { id: vpnTypeSelector objectName: "vpnTypeField" enabled: parent.enabled model: [ "OpenVPN", "Pptp" ] expanded: false onDelegateClicked: typeRequested(index) Layout.preferredWidth: units.gu(30) Layout.minimumHeight: currentlyExpanded ? itemHeight * model.length : itemHeight } } ubuntu-settings-components-0.7+16.04.20160321.1/plugins/Ubuntu/Settings/Vpn/ubuntusettingsvpn.cpp0000644000015600001650000000375212674023445033300 0ustar pbuserpbgroup00000000000000/* * Copyright (C) 2016 Canonical, Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ #include "ubuntusettingsvpn.h" #include #include #include #include UbuntuSettingsVpn::UbuntuSettingsVpn(QObject* parent) : QObject(parent) { } UbuntuSettingsVpn::CertificateError UbuntuSettingsVpn::isCertificateValid(const QString &path) { // Allow certificate checks to be turned off. QProcessEnvironment env = QProcessEnvironment::systemEnvironment(); if (env.value("NO_SSL_CERTIFICATE_CHECK", "0") == "1") { return UbuntuSettingsVpn::CertificateError::CERT_VALID; } QList certs = QSslCertificate::fromPath(path); if (certs.size() == 0 || certs.size() > 1) { qWarning() << "None or multiple certificates found at" << path; return UbuntuSettingsVpn::CertificateError::CERT_NOT_FOUND; } QSslCertificate cert = certs.at(0); if (cert.isBlacklisted()) { return UbuntuSettingsVpn::CertificateError::CERT_BLACKLISTED; } else if (cert.isSelfSigned()) { return UbuntuSettingsVpn::CertificateError::CERT_SELFSIGNED; } else if (cert.expiryDate() < QDateTime::currentDateTime()) { return UbuntuSettingsVpn::CertificateError::CERT_EXPIRED; } else if (cert.isNull()) { return UbuntuSettingsVpn::CertificateError::CERT_EMPTY; } return UbuntuSettingsVpn::CertificateError::CERT_VALID; } ubuntu-settings-components-0.7+16.04.20160321.1/plugins/Ubuntu/Settings/CMakeLists.txt0000644000015600001650000000011312674023445030726 0ustar pbuserpbgroup00000000000000add_subdirectory(Components) add_subdirectory(Menus) add_subdirectory(Vpn) ubuntu-settings-components-0.7+16.04.20160321.1/plugins/Ubuntu/CMakeLists.txt0000644000015600001650000000003312674023445027127 0ustar pbuserpbgroup00000000000000add_subdirectory(Settings) ubuntu-settings-components-0.7+16.04.20160321.1/plugins/CMakeLists.txt0000644000015600001650000000041212674023445025646 0ustar pbuserpbgroup00000000000000include(QmlPlugins) macro(add_usc_plugin PLUGIN VERSION PATH) export_qmlfiles(${PLUGIN} ${PATH} DESTINATION ${QT_IMPORTS_DIR} ${ARGN}) export_qmlplugin(${PLUGIN} ${VERSION} ${PATH} DESTINATION ${QT_IMPORTS_DIR} ${ARGN}) endmacro() add_subdirectory(Ubuntu) ubuntu-settings-components-0.7+16.04.20160321.1/tests/0000755000015600001650000000000012674023672022574 5ustar pbuserpbgroup00000000000000ubuntu-settings-components-0.7+16.04.20160321.1/tests/utils/0000755000015600001650000000000012674023672023734 5ustar pbuserpbgroup00000000000000ubuntu-settings-components-0.7+16.04.20160321.1/tests/utils/modules/0000755000015600001650000000000012674023672025404 5ustar pbuserpbgroup00000000000000ubuntu-settings-components-0.7+16.04.20160321.1/tests/utils/modules/Ubuntu/0000755000015600001650000000000012674023672026666 5ustar pbuserpbgroup00000000000000ubuntu-settings-components-0.7+16.04.20160321.1/tests/utils/modules/Ubuntu/Test/0000755000015600001650000000000012674023672027605 5ustar pbuserpbgroup00000000000000././@LongLink0000000000000000000000000000015400000000000011215 Lustar 00000000000000ubuntu-settings-components-0.7+16.04.20160321.1/tests/utils/modules/Ubuntu/Test/TouchEventSequenceWrapper.hubuntu-settings-components-0.7+16.04.20160321.1/tests/utils/modules/Ubuntu/Test/TouchEventSequenceWr0000644000015600001650000000247612674023445033625 0ustar pbuserpbgroup00000000000000/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef TOUCH_EVENT_SEQUENCE_WRAPPER_H #define TOUCH_EVENT_SEQUENCE_WRAPPER_H #include #include #include class TouchEventSequenceWrapper : public QObject { Q_OBJECT public: TouchEventSequenceWrapper(QTest::QTouchEventSequence eventSequence); Q_INVOKABLE void commit(bool processEvents = true); Q_INVOKABLE void move(int touchId, int x, int y); Q_INVOKABLE void press(int touchId, int x, int y); Q_INVOKABLE void release(int touchId, int x, int y); Q_INVOKABLE void stationary(int touchId); private: QTest::QTouchEventSequence m_eventSequence; }; QML_DECLARE_TYPE(TouchEventSequenceWrapper) #endif // TOUCH_EVENT_SEQUENCE_WRAPPER_H ubuntu-settings-components-0.7+16.04.20160321.1/tests/utils/modules/Ubuntu/Test/plugin.h0000644000015600001650000000176712674023445031265 0ustar pbuserpbgroup00000000000000/* * Copyright (C) 2012, 2013 Canonical, Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef UBUNTU_TEST_PLUGIN_H #define UBUNTU_TEST_PLUGIN_H #include class UbuntuTestPlugin : public QQmlExtensionPlugin { Q_OBJECT Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QQmlExtensionInterface") public: void registerTypes(const char *uri); void initializeEngine(QQmlEngine *engine, const char *uri); }; #endif // UBUNTU_TEST_PLUGIN_H ubuntu-settings-components-0.7+16.04.20160321.1/tests/utils/modules/Ubuntu/Test/testutil.cpp0000644000015600001650000000372412674023445032172 0ustar pbuserpbgroup00000000000000/* * Copyright (C) 2012, 2013 Canonical, Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include "testutil.h" #include #include TestUtil::TestUtil(QObject *parent) : QObject(parent) , m_targetWindow(0) , m_touchDevice(0) { } TestUtil::~TestUtil() { } bool TestUtil::isInstanceOf(QObject *obj, QString name) { if (!obj) return false; bool result = obj->inherits(name.toUtf8()); if (!result) { const QMetaObject *metaObject = obj->metaObject(); while (!result && metaObject) { const QString className = metaObject->className(); const QString qmlName = className.left(className.indexOf("_QMLTYPE_")); result = qmlName == name; metaObject = metaObject->superClass(); } } return result; } TouchEventSequenceWrapper *TestUtil::touchEvent() { ensureTargetWindow(); ensureTouchDevice(); return new TouchEventSequenceWrapper( QTest::touchEvent(m_targetWindow, m_touchDevice, /* autoCommit */ false)); } void TestUtil::ensureTargetWindow() { if (!m_targetWindow) m_targetWindow = QGuiApplication::topLevelWindows()[0]; } void TestUtil::ensureTouchDevice() { if (!m_touchDevice) { m_touchDevice = new QTouchDevice; m_touchDevice->setType(QTouchDevice::TouchScreen); QWindowSystemInterface::registerTouchDevice(m_touchDevice); } } ubuntu-settings-components-0.7+16.04.20160321.1/tests/utils/modules/Ubuntu/Test/testutil.h0000644000015600001650000000226412674023445031635 0ustar pbuserpbgroup00000000000000/* * Copyright (C) 2012, 2013 Canonical, Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef TESTUTIL_H #define TESTUTIL_H #include "TouchEventSequenceWrapper.h" #include class QTouchDevice; class TestUtil : public QObject { Q_OBJECT Q_DISABLE_COPY(TestUtil) public: TestUtil(QObject *parent = 0); ~TestUtil(); Q_INVOKABLE bool isInstanceOf(QObject*, QString); Q_INVOKABLE TouchEventSequenceWrapper *touchEvent(); private: void ensureTargetWindow(); void ensureTouchDevice(); QWindow *m_targetWindow; QTouchDevice *m_touchDevice; }; QML_DECLARE_TYPE(TestUtil) #endif // TESTUTIL_H ubuntu-settings-components-0.7+16.04.20160321.1/tests/utils/modules/Ubuntu/Test/plugin.cpp0000644000015600001650000000333112674023445031605 0ustar pbuserpbgroup00000000000000/* * Copyright (C) 2012, 2013 Canonical, Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include "plugin.h" #include "testutil.h" #include "TouchEventSequenceWrapper.h" #include #include static QObject *s_testRootObject = nullptr; static QObject *testRootObject(QQmlEngine *engine, QJSEngine *jsEngine) { Q_UNUSED(jsEngine); if (!s_testRootObject) { s_testRootObject = new QObject(engine); } return s_testRootObject; } static QObject *testutil_provider(QQmlEngine* /* engine */, QJSEngine* /* scriptEngine */) { return new TestUtil(); } void UbuntuTestPlugin::registerTypes(const char *uri) { Q_ASSERT(QLatin1String(uri) == QLatin1String("Ubuntu.Test")); // @uri Ubuntu.Test qmlRegisterSingletonType(uri, 0, 1, "Util", testutil_provider); qmlRegisterUncreatableType(uri, 0, 1, "TouchEventSequence", "You cannot directly create a TouchEventSequence object."); } void UbuntuTestPlugin::initializeEngine(QQmlEngine *engine, const char *uri) { Q_UNUSED(uri); Q_UNUSED(engine); qmlRegisterSingletonType("Qt.test.qtestroot", 1, 0, "QTestRootObject", testRootObject); }././@LongLink0000000000000000000000000000015600000000000011217 Lustar 00000000000000ubuntu-settings-components-0.7+16.04.20160321.1/tests/utils/modules/Ubuntu/Test/TouchEventSequenceWrapper.cppubuntu-settings-components-0.7+16.04.20160321.1/tests/utils/modules/Ubuntu/Test/TouchEventSequenceWr0000644000015600001650000000255512674023445033623 0ustar pbuserpbgroup00000000000000/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include "TouchEventSequenceWrapper.h" TouchEventSequenceWrapper::TouchEventSequenceWrapper(QTest::QTouchEventSequence eventSequence) : QObject(0) , m_eventSequence(eventSequence) { } void TouchEventSequenceWrapper::commit(bool processEvents) { m_eventSequence.commit(processEvents); } void TouchEventSequenceWrapper::move(int touchId, int x, int y) { m_eventSequence.move(touchId, QPoint(x, y)); } void TouchEventSequenceWrapper::press(int touchId, int x, int y) { m_eventSequence.press(touchId, QPoint(x, y)); } void TouchEventSequenceWrapper::release(int touchId, int x, int y) { m_eventSequence.release(touchId, QPoint(x, y)); } void TouchEventSequenceWrapper::stationary(int touchId) { m_eventSequence.stationary(touchId); } ubuntu-settings-components-0.7+16.04.20160321.1/tests/utils/modules/Ubuntu/Test/UbuntuTestCase.qml0000644000015600001650000002465112674023445033244 0ustar pbuserpbgroup00000000000000/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ import QtQuick 2.4 import QtTest 1.0 import Ubuntu.Components 1.3 import Ubuntu.Test 0.1 as UT TestCase { id: testCase TestUtil {id:util} ActivityIndicator { visible: testCase.running anchors.centerIn: parent Component.onCompleted: parent = testCase.parent z: 100 running: visible } // Fake implementation to be provided to items under test property var fakeDateTime: new function() { this.currentTimeMs = 0 this.getCurrentTimeMs = function() {return this.currentTimeMs} } // Flickable won't recognise a single mouse move as dragging the flickable. // Use 5 steps because it's what // Qt uses in QQuickViewTestUtil::flick // speed is in pixels/second function mouseFlick(item, x, y, toX, toY, pressMouse, releaseMouse, speed, iterations) { pressMouse = ((pressMouse != null) ? pressMouse : true); // Default to true for pressMouse if not present releaseMouse = ((releaseMouse != null) ? releaseMouse : true); // Default to true for releaseMouse if not present // set a default speed if not specified speed = (speed != null) ? speed : units.gu(10); // set a default iterations if not specified iterations = (iterations !== undefined) ? iterations : 5 var distance = Math.sqrt(Math.pow(toX - x, 2) + Math.pow(toY - y, 2)) var totalTime = (distance / speed) * 1000 /* converting speed to pixels/ms */ var timeStep = totalTime / iterations var diffX = (toX - x) / iterations var diffY = (toY - y) / iterations if (pressMouse) { fakeDateTime.currentTimeMs += timeStep mousePress(item, x, y) } for (var i = 0; i < iterations; ++i) { fakeDateTime.currentTimeMs += timeStep if (i === iterations - 1) { // Avoid any rounding errors by making the last move be at precisely // the point specified mouseMove(item, toX, toY, iterations / speed) } else { mouseMove(item, x + (i + 1) * diffX, y + (i + 1) * diffY, iterations / speed) } } if (releaseMouse) { fakeDateTime.currentTimeMs += timeStep mouseRelease(item, toX, toY) } } // Find an object with the given name in the children tree of "obj" function findChild(obj,objectName) { var childs = new Array(0); childs.push(obj) while (childs.length > 0) { if (childs[0].objectName == objectName) { return childs[0] } for (var i in childs[0].children) { childs.push(childs[0].children[i]) } childs.splice(0, 1); } return undefined; } // Find an object with the given name in the children tree of "obj" // Including invisible children like animations, timers etc. // Note: you should use findChild if you're not sure you need this // as this tree is much bigger and might contain stuff that goes // away randomly. function findInvisibleChild(obj,objectName) { var childs = new Array(0); childs.push(obj) while (childs.length > 0) { if (childs[0].objectName == objectName) { return childs[0] } for (var i in childs[0].data) { childs.push(childs[0].data[i]) } childs.splice(0, 1); } return undefined; } // Type a full string instead of keyClick letter by letter // TODO: this is not ugly, this is uber-ugly and does not support // any special character. Remove the keyMap once keyClick(obj, char) // has landed in upstream Qt. function typeString(str) { var keyMap = { "a": Qt.Key_A, "b": Qt.Key_B, "c": Qt.Key_C, "d": Qt.Key_D, "e": Qt.Key_E, "f": Qt.Key_F, "g": Qt.Key_G, "h": Qt.Key_H, "i": Qt.Key_I, "j": Qt.Key_J, "k": Qt.Key_K, "l": Qt.Key_L, "m": Qt.Key_M, "n": Qt.Key_N, "o": Qt.Key_O, "p": Qt.Key_P, "q": Qt.Key_Q, "r": Qt.Key_R, "s": Qt.Key_S, "t": Qt.Key_T, "u": Qt.Key_U, "v": Qt.Key_V, "w": Qt.Key_W, "x": Qt.Key_X, "y": Qt.Key_Y, "z": Qt.Key_Z, "A": Qt.Key_A, "B": Qt.Key_B, "C": Qt.Key_C, "D": Qt.Key_D, "E": Qt.Key_E, "F": Qt.Key_F, "G": Qt.Key_G, "H": Qt.Key_H, "I": Qt.Key_I, "J": Qt.Key_J, "K": Qt.Key_K, "L": Qt.Key_L, "M": Qt.Key_M, "N": Qt.Key_N, "O": Qt.Key_O, "P": Qt.Key_P, "Q": Qt.Key_Q, "R": Qt.Key_R, "S": Qt.Key_S, "T": Qt.Key_T, "U": Qt.Key_U, "V": Qt.Key_V, "W": Qt.Key_W, "X": Qt.Key_X, "Y": Qt.Key_Y, "Z": Qt.Key_Z, "0": Qt.Key_0, "1": Qt.Key_1, "2": Qt.Key_2, "3": Qt.Key_3, "4": Qt.Key_4, "5": Qt.Key_5, "6": Qt.Key_6, "7": Qt.Key_7, "8": Qt.Key_8, "9": Qt.Key_9, " ": Qt.Key_Space, } for (var i = 0; i < str.length; i++) { keyClick(keyMap[str[i]]) } } // Keeps executing a given parameter-less function until it returns the given // expected result or the timemout is reached (in which case a test failure // is generated) function tryCompareFunction(func, expectedResult) { var timeSpent = 0 var timeout = 5000 var success = false var actualResult while (timeSpent < timeout && !success) { actualResult = func() success = qtest_compareInternal(actualResult, expectedResult) if (success === false) { wait(50) timeSpent += 50 } } var act = qtest_results.stringify(actualResult) var exp = qtest_results.stringify(expectedResult) if (!qtest_results.compare(success, "function returned unexpected result", act, exp, util.callerFile(), util.callerLine())) { throw new Error("QtQuickTest::fail") } } function touchEvent() { return UT.Util.touchEvent() } // speed is in pixels/second function touchFlick(item, x, y, toX, toY, beginTouch, endTouch, speed, iterations) { // Default to true for beginTouch if not present beginTouch = (beginTouch !== undefined) ? beginTouch : true // Default to true for endTouch if not present endTouch = (endTouch !== undefined) ? endTouch : true // Set a default speed if not specified speed = (speed !== undefined) ? speed : units.gu(10) // Set a default iterations if not specified var iterations = (iterations !== undefined) ? iterations : 5 var distance = Math.sqrt(Math.pow(toX - x, 2) + Math.pow(toY - y, 2)) var totalTime = (distance / speed) * 1000 /* converting speed to pixels/ms */ var timeStep = totalTime / iterations var diffX = (toX - x) / iterations var diffY = (toY - y) / iterations if (beginTouch) { fakeDateTime.currentTimeMs += timeStep var event = touchEvent() event.press(0 /* touchId */, x, y) event.commit() } for (var i = 0; i < iterations; ++i) { fakeDateTime.currentTimeMs += timeStep if (i === iterations - 1) { // Avoid any rounding errors by making the last move be at precisely // the point specified wait(iterations / speed) var event = touchEvent() event.move(0 /* touchId */, toX, toY) event.commit() } else { wait(iterations / speed) var event = touchEvent() event.move(0 /* touchId */, x + (i + 1) * diffX, y + (i + 1) * diffY) event.commit() } } if (endTouch) { fakeDateTime.currentTimeMs += timeStep var event = touchEvent() event.release(0 /* touchId */, toX, toY) event.commit() } } function fetchRootItem(item) { if (item.parent) return fetchRootItem(item.parent) else return item } function touchPress(item, x, y) { var root = fetchRootItem(item) var rootPoint = item.mapToItem(root, x, y) var event = touchEvent() event.press(0 /* touchId */, rootPoint.x, rootPoint.y) event.commit() } function touchRelease(item, x, y) { var root = fetchRootItem(item) var rootPoint = item.mapToItem(root, x, y) var event = touchEvent() event.release(0 /* touchId */, rootPoint.x, rootPoint.y) event.commit() } function tap(item, x, y) { var event = touchEvent() event.press(0 /* touchId */, x, y) event.commit() event = touchEvent() event.release(0 /* touchId */, x, y) event.commit() } // TODO This function can be removed altogether once we use Qt 5.5 which has the same feature function waitForRendering(item, timeout) { if (timeout === undefined) timeout = 5000; if (!item) qtest_fail("No item given to waitForRendering", 1); return qtest_results.waitForRendering(item, timeout); } } ubuntu-settings-components-0.7+16.04.20160321.1/tests/utils/modules/Ubuntu/Test/qmldir0000644000015600001650000000011612674023445031014 0ustar pbuserpbgroup00000000000000module Ubuntu.Test plugin UbuntuTestQml UbuntuTestCase 0.1 UbuntuTestCase.qml ubuntu-settings-components-0.7+16.04.20160321.1/tests/utils/modules/Ubuntu/Test/CMakeLists.txt0000644000015600001650000000122312674023445032341 0ustar pbuserpbgroup00000000000000add_definitions(-DQT_NO_KEYWORDS) set(UbuntuTestQML_SOURCES testutil.cpp plugin.cpp TouchEventSequenceWrapper.cpp ) include_directories( ${CMAKE_CURRENT_SOURCE_DIR} ${Qt5Gui_PRIVATE_INCLUDE_DIRS} ) add_library(UbuntuTestQml MODULE ${UbuntuTestQML_SOURCES}) qt5_use_modules(UbuntuTestQml Core Quick Test) # copy qml files into build directory for shadow builds file(GLOB QML_JS_FILES *.js *.qml qmldir) add_custom_target(UbuntuTestQmlJsFiles ALL COMMAND cp ${QML_JS_FILES} ${CMAKE_CURRENT_BINARY_DIR} DEPENDS ${QML_JS_FILES} ) add_custom_target(UbuntuTest) add_dependencies(UbuntuTest UbuntuTestQml UbuntuTestQmlJsFiles) ubuntu-settings-components-0.7+16.04.20160321.1/tests/utils/modules/Ubuntu/CMakeLists.txt0000644000015600001650000000002712674023445031423 0ustar pbuserpbgroup00000000000000add_subdirectory(Test) ubuntu-settings-components-0.7+16.04.20160321.1/tests/utils/modules/CMakeLists.txt0000644000015600001650000000003112674023445030134 0ustar pbuserpbgroup00000000000000add_subdirectory(Ubuntu) ubuntu-settings-components-0.7+16.04.20160321.1/tests/utils/CMakeLists.txt0000644000015600001650000000003212674023445026465 0ustar pbuserpbgroup00000000000000add_subdirectory(modules) ubuntu-settings-components-0.7+16.04.20160321.1/tests/artwork/0000755000015600001650000000000012674023672024265 5ustar pbuserpbgroup00000000000000ubuntu-settings-components-0.7+16.04.20160321.1/tests/artwork/the-man-machine.jpg0000644000015600001650000046356712674023445027745 0ustar pbuserpbgroup00000000000000JFIFdd-DuckyV Adobed     !1AQa"q2 B#Rb3 $rCS4cD%&6sEF'!1AQaq"𑡱2B#Rb3$rCSc%4Ds& ?A[ YRL"JQASez#@Feػ/oȨ@<ΨZ;ϱ2Ə_Ճߩv.䵥*Ӷ= ǥTfV~Y)[y& Lj`B,k/T2s K{-KWښA;yneLU7:aRnB`pГ kFfd eZew1$eKy#748 @Kie0!.s4O;,a3S!h'ks~szj-M-om< %)WDf 0TJr kԧL\%v{vͶ֔VkB\̢Y6.K;0&q P.DP<6[9/PRi3u49g.`r%Z鴹30h[SuJ Oplk+9Pei0̺)a⃺uy'EēzJt=@C( nj@8pNjzy d6 0i ]_(8&7'ϻqkLՐ}\ضVbej֭6ABa+z'&58BO+%>Q)a{a`/b#npd򩔆(t0EvBqǎ)5jU~Vg鍷6ͶhPm64AyaJipL(͸Ob vLF|Jۇfs~a\u[㾚mB'PE_#5ğPddH8[nNNiyieSJ՟k?r1mm{sIT$uOV~g7`9%1$enվrM4aϜz3fnRH+sA9ztjȴ L(O2I8 ^NC:]e6K@s&Q\W nDzht+#JI$jIVMRt,yF_!n}N.ݶtU|U1-Yrs+2@y6x&%}tCNC/pnFŀOb'7[=SPsM d?#5,$-.ܻI d*OՌmJb5n@  $,kQ-2p-c ^H&Ci<`k^|+IPZTdIP$??#F@agU-7<J1p3dS4ß%2H t@ @>#I08g0uT|bad ijȧd >O__hx+ѫ0(_A%G6uPˈqHZU8:aAg0Tޔ c[(;Hq6h5krkS hRN< mR@q*9$fHR7>C o?B~~[O#ޏSe#f ef̑T'%Kʐb ӤesҘ?=X{}& 1qNn۴1rUKrԹ&1aIJ*WW;φp,iOdyC˵i,fR-ܭeq54,8]BRB pV Ejw.߮闝/O1.8js3X<;n6ݴj bJdt: ӳN[eg2@\t(gaW=]GeҪIn(JF>] g8KV廭W{YKQvOwet $5J#pQ1d>1J[L֫ssSyܛufuEn:-ŭDNClve-׹ՇUٹIЄ*Z@e2"o6۟]Ե*F~V9ID&: MF`ʰzjW 8FS qqq?ˢ鶝+H;wL Bw&jki=0 KC'PIs۲|tq;?hvj3U '_rVo9198[)ɥ<|q^:Lɣ>ƽ>nFϻibٺI(E4VVRktmÛL'[)<T9d9x_TK*cu=OغNH#q(ѐ8e6FiOn֥dmM.j:WsTyW˷\puIRLSy`V9#-˩))peZҏRr?gd&cWv 4TFy䒧G!}>xݺ]U?~'(={6j MdXS2ۖ鸠:ӏfdpaoWH`ی{=9ٺVaO5Tt8CHR-N,8hj^>qrf튟u}i֖RgOVm[lfLLkAAm>N u{ZN??(sK1CE{ĝW B8?=-),Aı"JyՄ eD Ic_jW5P^`%%@Ēb;TOV\QlT:Eb'#q.oI󯎆'b_Vm/LWqO04Qg 6.|0yU"ag81pn:2d3 L.kWqԳvC[l!vQ)*3.Cm4BPR5ǦhZңE45@HnNYlҥU*iu"rUz~l1ߩ'JJ.Iq8x 9nnM7pR,9)Fn)'0t:b>1`~4[7}YVzU;ͥ(Eb_P"uV6c] bFTLL(sNk0 bJrJt`M-lT)JMQKPh[`W-eC }Yp'm۩̯q>XTӵiډBD3eI kugTU> NXn{W1G?MP f/烨h{K̀G摥W831 (p# Aم| I-f-'J~< TbD81s1pϟBkH:@ ˆjޕ,\`#>PPuiB3ϟ< it1幨E\㜤LkP̨]0& pWLcR":0Gx03 U Q8Æ61 :j"*π:?2TS QD3(i HH $~ 8H8]m)$AG,'Dq),11H$) z-'F  2([cP 5J`xr`VQ3XϥЛM4\)KItR%V<}`r9ahKS>1SߥК˪vu{L {[PJ7:S󌄙3LPBb(@.S?=`Ìsn>~a'yuuy$Ԧ :-mH$*)BB age>|k}c{j~{ipmy-2Ӯ\!\ SiҴ9( bONd~H^2#s$gi4\e!9J[y\K+ j\lnՎMr}!.u)iKJl<GfLgҴy (S8>P}cQMf$jF)JſSSUqVޗ[mԩ9 q }C{?j%RVĈTCiYhJ ʝ_Y W SRɤ!NdEG8F)?|<ŁrʋjY]J>4Y k1IKWm(c;j>ͨ{İ!* 5m-2`(I2 Du]<-{P~QS꣼ \s)KJ#K?I%E)HOT깬V&'?!2ƓWv 9O-RL޽:%) m ,8(q^^Sq܏h4R]N7^鞄cne Dۨf8xF@{{rn$EE΍%))L@yv&͖+Fۯ=R޺ᕝ[6M %b0Z%X::= ~ѸtzQO-$5(JG2L0{t)Ci[meIj)93%]o kϯu7Q0aYKD0G3۪WZVK 3=};he[Vg30ߺ`2 l dzG/,iU>m .gzDص; Q|"cQ7$0T*(؜pJ&֧F'^kId8s}[kgLKZ"É ]Cׯ7[z9j`CW0iMLz@xbJ!Z-շa*3Z]0 *qCJ|+BĜRvt1W`87 W oB2BҀ?Mkbf2ǿ'mcWnm6pj -ƫd[.;wObY-pλL=*Y>=jdрc]ҶU5GLRCBz)69ʵneJ[c10ʼxeBZ<`!]tqyQi78=*ߛSv 7eiQnn04iF`8boZXSr`ϗ?yxg}˗}%nuä0*UOimnjӉSTH 4)!>kQ{S׺>Mt7[VۋuG͍)25sSzw1P?feܮ~x  pA>:鄧ߟ.r+e}Θo.Xj/ԇ2`SCx;{\R>29$Az %I!ω5OD\\uꚦVzxG8zm],2@҄ )@**^ Sq4Ҧ)hc@ ADd #)!YprMx@U"180-!Y18#)jA Oq|(~VHEpii0\Á pTA7)Aq1ょ04$b&G] 0:LGp\R ! IO.C㔾P@aVu"(O'/ $YBd$*8XP;WLo/YFp!JĒ8危'*8< C!: P( 1ɌvpԸ`",8 q A+) xrZ=`g@K2r:iHꟄc<9@\x ttd)CpL=:1Z=B#q5@{0GGT᎒GG+)#GP ӹ_^忭vL싲sHKS#Z_l`RIBX]5˅9{(JYT(KQz\H%nö 5Zm0ON3%PqKbsY?<8KFMFތ?no;{F.Ap0jOU3Ru Q%g[l LngYzWGQڈ{)'.+)م&[ӎ(󮨭NjRI-7KB<\\ָ՜_Q.$O2`sY11`FJUpqʱ x):ő=\WePqamC yYxԶGC|o1z}mUZ/ bm:KՓn]I<1urvJFv~ND]S8gd";6o$)X%][R]r6ݎ>=c?]zM2+~O(yBs"{alsDjF>^LN6DJ⹹o֬Gx\%bFDpk gKu _VBIPM#$rl¹6Z(@)@ m'cL1^}Q)4NCaꎫ:bT^m4xpq{PU˾#Hmq!i1wmo⫁s 韩V[JJ36$?%+зq,(伳iLRA@ρT.k۹Τ8n&ݺm+,;P 5 @7& %?`pLTaL'`&ա`!^ &eTV<:DsH*>X:jۧ?cz˴tͳ)iWqnwijHJPIIA9H&7=Cqy>vM.EVul<@WQ7j ),%H%>yg?$d5$ X!0NXqmX)qTsXwHax4+R9Öxג>ZpG?f92QSjQn1 B>00ZFb`43>|r$J9|D0݃N:eBњJ@1)V)D W1 BP'>qc`"LSe-i?n`҆P]uIK`D@t{ 2^[Yi Tr Ie$h'Ԑah5*$6z~.Iħ[PuʹV3z!Rmf7=2@Ja>CXp`'a!ݹs.jsse®AHn3"+JeD0;hW˿58soNN,Mv{VݲH&ֳlO3$&[2ڔòo$<ҵiʢԪ0RWoXtdif̡ˉ%39:*굔 (8TA w_яkc[=Skw^EųCNU驁-QϔeQ)HkCĤG dP %@V}>`3Rln+ͩmJ NNi,̰!C9Aj)˗?;{}0{i6Q &KP23v?0ࣄ ӟ~GJ]ŰBi;ģ[@ylRjJbi-8ڃ3(4!0VF9Ds+.ݷo﬍8kUۇJUNHgZˣLBKWMq%(f>?8(9ؗOaꕠ^.eVdP p}rH!HX|J.>=ҭ*mƫ25aűXP켽P0V3˪0R['NO|^"Ws}J"7-|͖锩sQ)).dQV,bqy}BґY8OgȞΖϵۨC`;lD.=@ fAyePTBaWqR}oڡ'ۗ=K?Ӧ-ٱqc) μ7|M\SBiNve˵-"|GO:ԽjAVĺ%?8TVs,JE2$%'eGFBR, dyc!ӳ+ڪ-*TQmS9${{J^egioǻMM{蚵 {onv펦1ntNYuTP|d~յVe?#~l/7T@ay$t۪άĶJ N+dA+m'әȨaӖwZ.IDϺ-uPlX aф2"ݴ].˕HL>KyD2PU썤sAvI?syts_QM*N Oy'=rs(mPa)j`=^Pz?x ڼIG|Js7i0 ߗdCwܗ͑9;t̤V)KN^ZIT|,=GS+isOnb1?FC޾4[+uHumD2Af\躖䱖TBP%e LbA#uMPþz=IpߥAɨf/M;_ldL:@|L?䔎Ic>w-R4C1뮄dz)fꎛJM "kP k!@I#ۄ^)8U*RHK>j )8q 4Mx/COG:ඵ^ 2FjUnj0\p޵ٛ&M`jDa̐~V]3Bޟn. o>B(}M^]:cRh2_p}Qo]}s]qĺV^ wN}ZfK>11~[T^ARƙA\|<Yh$&# <)ڃWq ֵ .I'HQyϖ "domcD'6)"@=/#òb!>Ď\ =qQ*,H⤏l~vKV`pv*iAkB`0?~F1%DG>YPH$g4 `hHP*JƖ#LJbc8獕e,' W.PּNd9LoWNgp20@BBOYcC۞#霗ـtPrtJ N\15 )O c"GpYTIRdž5.p+h$2?;M۹^wr[d{WWmB&:t5 t*IPH^pOv6h7 n>)V힩ə[yJTWi=z4tj' 0kr˳ACf}QGvϷ+w\z}ƭ̥͹'YɰyY7MBVpVvU6"m_tTJz_Djgjl+X~YJs Hwv7xvU˞韪ųvTBT_WOUrbif-}۔ӱ%_хJݪItfgnisHJ&R$xG=}UǷKw}in-}؝D6y9첂`tD3H+J1~?ڥp ZaK˥ڄ VPffU2 WPpmj0; 0/ϪFź澓MMHvrkjY zB8Jy+mJPSP/D`AC?÷eg`?K߳vfQ} N4$3*|"*,6^@96Cn{l.;CûNU>[6'piV6}(zzsI)F Lw<A?o]љ-y_2Bf  *R-27~Z{au_]*?H#! .SelĘډW%J01&'rqQrkmägha:'T b=E7@5pJQr"QFZPGQ4@&`<-/mܟ&x^ )%e̲f)ZqIXzUǑ8_[=BcFת+T *Ԫ%BNɳk+L M1SAqA~ i{>Kr#?x~辢Z*eƥ[{ѷVEqW6Z)?uC1匿xjmeZyߦkmkTjeVs2kmgy..hS)T5Dyٍ?Q}k[d푏W{, 5<jiÒEɲ[-sm÷Cͽ* JޕH:5(|*qI=һk S,< rJz'; β`*2FDq;w _v+SC%,ESZ-Ĥ)XmxsǴ;nB٘z)j$ +gť}V:iM MEo!2Va9U]Y]k`NN)7BsvQyZl$\I-ܽvUR>r-e Wzi0ٰ\_;SF7?X=CWd6*]'J8j#:u+GS-Lh-@?D X~NݾelFCԪ^lU b ZqEkڶHMܓnNA$jV 8)GĜS/nnEtLm]?h-B3g.v$CLOۆ4*(1JNj8a- JGp80dۜ D0#G#.D2Axࠉ&ZT OOaGJhre(£8cA~R< +􂌂9F>5tz:> ϳ V& iH~p2GUFRa`P`h-q??{̜J1LPӌӊJBx >n s x4B}n9A20rC'<@N'c  lcŵJ2D#x$*'xs' EYMTqDO~X4!rPCĚN0L84dPQG3#D'}b##ႂLt'TVB1τpdtfd,-1'@@cp0 .DGÖxD e*&2Ք8: T`OX*$R"@LA,(Qˎq0,RcBSc' <<L#GN~_y;f_B잛()J=eԢte25FRe1!.Ivf9GnKJV1?WΑGyf旟Ĩj*jFB~'ru_wWNWeR}뵊Ԧ'B]3.̕8\ @4;Z-73Jf~JaJͿ+2nk6jL VRF`}MO/c6N&B%MMTIЗMK*YebR^XFQ[.f׿őXv1U!r-n^^'0t? T UCi1ڸWҿ>.Kf۹7է?dɳ?7!)RCO=%?s1P8 N8᭹okd3r~޲nVrKԕѤ]c*fW>*ؕS& yzYa'-N8rˉƅ-u\^ ۨHrv `\\_{ev߆s5Kgo W-cm5ⱇ˥3G:gۛ.C0neSiGr"ZR@odj)XUYSiM*G -һUQjxpF'Qt*{{E:w l\уJMgwTRjNݴ҉+}Cd|*ϞvT4oyt'^.nRq\-:m+q(L>XKx~^%~) ڷZ=üi)ޢuzcdyybHqFB|\zSuM?5jLZm9ɩg>G j `1gGhz{r\{ʚu$3 x!6D_ M,IUŢiC<|6n6~.Ea%WgRVR.]i+YA?7K)RgvhIÖqn+.QK;I- *Rbnz/ƫy_>JK6}1PDh`,vG|x΄/+ퟦޢAgv߰6fgnYD$qǪmYR83uQ$?H3<{ںz@D:],_.M8{ujNZ(Rq(;k?(bd@eLIv÷Zq5n'ɑs%$ 2z4!$|\zcy.k]htX-au&'/~+TZ8$ QB8灁j@RРJAa2X/ K2VL50`9ęΘ]'<Ӝ ):|p b `x$ݰNRp<<@a͝{O!=IVq4O&Mǐ쬖ԉ:MQbH-LH}uVgG6m )KO$wc{L+eSZG~~,& z BMΥ'*[nn|8dWsOa(U)hֹ'.zϯNjܝXJXeޥ̐ }>=د6A_L[E֚{ힳ{8[\7nJJ$P*O?1UR=O^;S56ۚuK$iB%A!ȈrW2rB` b||SPW8Hi@&ġC $U ˏM)^u{["D}uK LbZWE~1Kh.CP|R"sэvֽ X^?t|rޠuR19p#E[j%tgf`A0\:ޡ)rC D)n6HBLJ g٫y+֗,uH5NA" i"pħN N6iR}]sy} ;FUW5r'%%"ٛrl Z.Y%2Ͳ„Rӊ&'PN5-!7F6NmAxq,h*X qVASߛGnIZ$TPҕ- $>X[g髫=DdUI@YJhy*L;4􍼂:k)<n$29b_yZh4>؎`d_][,:1eoQ(T+bܔjF`YICRR2LN(wjK^ò=97mTn8ɜ #%d# &BtH5iR7P#Dk4Gx5($ÉuIER= 0! P(ÐJN JRB:@Fqdqq (g|9`9ȆpGL $HÎx6 >Xk, I*X"G/< P@TrO B Iq(#㋐3*>\uɥ(!%2"91R21!u Iou[뢮*mE B5j. 긻}O,6y!J@aг)Q'2x=Su=jXM`yp3Rj&I7Z@,px `rm NVr(cMPADu8c)9䤚u//.:Phl-j$$piy@^|mR{n/r5S%EUv6:0ʘۀd4!Aÿ. @q^jNBMvaʩw%HsCRdT_\Մ֭w N~B`9܇|pحtvʛs]ˆm/20k:VÎ);$Rְ` !}9@rًq6ճ0i%Gm .^AID N=*H#!QUXA>P>LT*-g^vlma!MH135@L\rNa*֭JJ@@+]38%6N9bvgLt̥F~ݛE$XK)K@ Q)rIRLAT!lo}alu}AèI+4 MF-W3rrW;nRZʫS ә$kZY<6R *8q8d{:-a۔쫁y:mnS32slMm,>iKB {r*tnTuFZ+.TSERGN"i<AFuU /pqv-׆uj,Kzrveɪi<4i*lzS"ƞC~8Eۢ zꋏ#n\<Ɍx`S'Uͨ.IکfE] 'AL@&*#*~N彝O& ᗶriMx#әV׍}W\fܚQu6uJSźn)j1OWGzʱ9m "=}2bDx|d81' R IJc}"1!Y&Y bqئ]y|ocO]W!f{[C46E<Ɍ\5; yF;pN~atCQH2xPbyv7C|3 #z/t֛ȼI#LnHGg-kr?dPU%!kTA J~6,3.JEWyr֟Xm*mT5PVFq=gm#%NG=.f=PW|1S޶ݹy7/LT쌺o7M}ޜ THT<ӤwUkT9> ;YJdgCl{]@;Gqf'?R#0Xm*uHL}]u:zV;ODD;w)\QZpQmdqSg?f#:Ox<߇#4__7;7;V꺡̷̑l{r[t&Sse =wœvOgFٷV/Kk1PP 7CIhVRRPTx1Pܚo?<8G7jۂ[,.軋%71Q2gnU4J @=7%sQ%97V/)-`$ϗ(-w7]f>XFߢ;7M;+ʼ8xPӞEUlAZt ̃ǖ+3B6P\`WÊI NJ$<,7{$q)"?!u8N ҂7``sa1P+M1IrG4& T!Ԍ%`\c ۄ%Q&ԉC2GxGTa_pSLiA8rpX$ .b<~bO8At 팭scy"d3+14ܣM-^Am%JQ>@`*χ]M.Q<57vw&otk4Fc/KӗI'/pԣcal|;毩y_ܒEMSWk'&Rq@AÙ\ "V[҄G3@wafGX6m֥CmX ,%1PQOV<Ԗ1;qCCYNA]jcL3Z8 Y>ܒ 1͔E#Л}6Z++Lr RA J"xp6A[\Dr>w-ޕ>MMIې |I0zZDtM)f#ڕI5YͰ a'uni}]|}CS*ڴ"e`V#L> I!qPBGV rja'4eSML{ih)E%@&T1g)c Ӿ8 db<6~y(5Hg%[83en-JRa 7d;-nтOWU!n}3 R.l8DuL^X> ʔePf'6D~ԝpq:\7Lv5 g.~MwnR{o*Izfۨ,ѨRZRȸK!S 2 Sp hWzD/G[kp; KԨWN~I(VFYRaP'$ G{Y]bU+L.NedXZL'J]!+HfN2MynOßO;T[}B^^~yғ,%+2%+1(>tJ `#?ܵG|'&c:l&33 @Jqk@fBPN8]S/z{r[L?-Um54VciB ܿ _Q]nó+S^um<6( &bnPm,s QŽC/9/ msu56 Oh'j+-TՄڵ=.$`VY>_9TCEI`:vmȦ뛘r+pmM(Τ8P]p-c RhC{=v.v^]3>j7 ҥ>Naˆʘ҆RUR0xpW bL|~һ\7چW_Թc/9tI 0L6D((aJ4r(ЩUͦ(RI%L&۳(4]&2FpJ3?1Oj}cwOrǡsѻ-WKHjLMCfVHزV AB)0mn&`vqm!a`#%QF"3ږ!# Z# >0^}e'PArRx:P0c =4%eҵͺM6)DIn{@$RQ\L1qmk3sICZ),e`}^c笨Zv[Րcvw M*?:[yMŴ/9Gk\$PE'{SOja>5@~>Xw7E[GJzUlh:+ƴ}p'$#`,kNBJqSnKEHYN@@(3}֥Lat&߽Zl-w5Mj<%Dnwlr@^eEJKXY%e#17{>] 18[?ed:E6}-?B[>Ȏ[{nuU~HTtΖQ21+s6p?g/I֗ze%VۉTȋnHQ)R3)M`ib]\!ĜFZ}W8c&e6ʓiRol'2g ` ~"IIaH"c?)\Q”Dgq1#_ $1t$p"ҐhE&09 -F T5@gt72A)1!p  #P1$G|&J 3%BBn#Ͻ+))󳮷-&n$D<1 zCs3 _@q,ϼb6-dԜjD0ZC*VRD#O_Sk)ikfL\1Q~[{M}M- F@ Js =ӔĠ %+>$㗺3.ܘCF$0&0IX~V\Z *i; j!"շ?埽bFiY3L34Cf(JH!00"qnhO+w)CAVC5!{I5:[S!Ab8pB!O4T慎nVrZuSd_[S0Jx%*>RO-~I2u7.N9a[omD c*Q)!g'Tƨ%GJm[mV,U>SOa (8:<(到 f;#Fh@Ho%jg`$bH\ /Ӕasp$wC]~8KEC9卭Z#( թ\Hg1J+D+-qHږ>zu&'MݚuZP 0x% iqFHeۙmӼ$pnm3@:b1*Vks V`iR ~]xhFܑq\[ugIkuٽ&Qt+4v)FYDKziL3RTTTSjT}G#=9wՇo/ۿ"Ss;2Nnʏ-qoЖfsMy >fff]}@pgҦѤLHrnQ~gϷqݵ6) Q=)G蘕| MRbW2d\#ڥi;I饿2g\\tJԲ4>A[#z ʍ9_k!U܇kv\&PcTevġ,HIHJ8j Qʯz aVJvvzRFLIpj3BYiP1,eIeDhYaud~J;ުw22nmf. ]3-3\~Kt(IT,tsCcsfi]ҷbXB~Zߺ] i@'Tİ?A) Q(E 3¦5&OkW(-syVİ`2ok O6}: Ks=pXEL3(m#CekqWI( T5S{_OT/鬊u-I͞G^٥~ZA>ps)pDAtDaݐE.C={u;Ӽ^*NV.gwJRc$2@Bn{ծr7n1t'{TVcM)1xd3A /}Ye6іۆQӘYT Ce9d~ ޚM0_J&U>y `)`% @d|Az7 "]Nt۳u*sCGjk @'wM/|L%nRR=(p⹼n ڞ1z}H֣9^]7CrZ-Ὠ.mx}!^Cy5j^9]!}7;}ޭYwēMaU+R̹*V L><= 9H~S+;I^ТyHkڟ9NH7U-+~LEl"set]ӳ;2j]PWS)).q zz=]Wc6n\aAٱ mt0rF8vfP:LF>t?UY>̵p#SdgN.lj:T%$3J\tGʵ`,.?rYT}?h³i9rkqq슒z_vL.S5'R2!N'3߼Gn٘*]̫hw~'az}FNMtO\81O읝R[_9q2O#|g8AsI%~'?iF磻J5:WsbV4j>g|kDvǂĮq<L8,6T2<e"`ZK[QNC#eq1HJS$me*w?8Deњs3my@HMzUm7IMKĕ6&ZRVp*DZI$@&]iˈ)pdBnXi!oo];]eTtԸ-k?<}Ҷl.X3?u";ىU\6%d!9765JR BmuxD{4Hw{pF̺(<.G(@8p&{D;1~|lװe-KnJ*TQVÊҒyrY\b?(b x^٢P-rJHM.R*&֥MQ1#{J۞O09ơcgtҔ!uHRI8ϨAuAL˴4Ҟ[krYY| $<kJEi-)(M PRqxe>&D1>?nG'$ Z$PgY\ӫZ}GQ1Fy,|B'f*"sHIGF3>Rغ2i[5)4E‡Hl禀-j@ S]!rJnnaB>ϩ[7jYt8ڥ-]nfqR-%\ddtX3SHK섵(~_Ǻ9Uow6;zmʴHqQī f%K⵨**W!FR<ưȊ4TH#2A}Rlwalչ3O<)o*R\ [Iҩ7PAò@;._cDn{5cn(UB2Qi1$0=IҰBa1|wotM[ۙIuKq%Rij&lk@ZXҰa28$}6}tgu[j\wCb{qi:W0D%jJydBӐ+38 }@m..cg͢MI[ќPiL$ҋIњqeNҸ- 6{B1"N1=MiAJKFZRgesR3H%Mx "é?[L(?[nzUY4NS'[-@~rD>X7+nZw\vjkingi9`01'?.NN0BRy7l^R/?~U E!2)Q:ݩ:u犖"CH jhQ4Mpw]i4ԨZФbblm@T( zC'>!&uP\]6kKH{z/dhQuaL,i񿓒dl#ۗh-a68 RF^zխǪ8 cT@CvKkgśw^vR)rVri2?HD(+JiC K ʻO"=ި]6OG˶ JM$vNhժ- 65yeaOuŝ[cK],6n͸pUiv#(uT u i,iP>т5d""R&=t|T7J©mE1-2Zj4 Ir8Mїfß>t~B]IÒI٭gsln?KT!3q:e67OnپzΨj^3(?4mUvvviJjXˡiULjH># l8ki/ "OQ[;XwV㥩&n &޲;nKj yB[z*eJJo{Yַ'DW?tP[ͻwk bhw@98̖nU mfr̥&t of J85lEj0q嫯M:nꣶmԟR⓵Ssd4ytLas IRi1u/0K%>mS|#V՚*KMN OoqEa!y'!ѵtJϹ>U3ď&0P=ukoiN3G.&N}X^6꺠plrKG$~28w{Ԕ,}7 |{1VE7nnU2nZ\kpɋrFVR$ԄH02! J@{1MW̨\8ǥ,-֛ih@քC$ %*pa~`A(Q2`P?sRYRNqDq,^D@`YCJpC,%' ^ ΜȜhL JNG`YXD 8 a`i̘q;#@!A$$=V+[Yl7L,⬅&RVsQq8=/{⤒$cxn(!4V@y[۶s4P4J:O7ӷjhU.Jb*N@tGPH0!N)uz ~> Z]~ڶ-JР4!r !'q%R|DXi{xMdQjl˸U:%d1`EexD-['Ӵ +ZC3-I6%$9@zl t5}h'L&k/{&46R \”TuQ(dׇ5ie[*ipm8ݣ\ Q37:R̓[gre{ӬFq}+fRG8"}Ho|ir͙Ҥz5"],.f!֦&n9I!sQ?pY`d l7_pmL Ai6ؕN8kW1'өyV|mDFn7RoQyQ@@D ѻV7Z[2)ny;*mʸ$1R*Ba]΅:V* J{;Ji[3#["BCM<:wJr:#'zTjB9<g}:T>{إmX{jqnMC3%#3OU>z 03Qʹܾ͗tY@g02zmI"n^K.I)mmb~VY%P0 Q\27.yF=:=mlM!0rJFhLquju[Tu#yLiN]o(BxaM,N~PK5cje^~H*U8%itJӓ,0-dǐˉ8(Ii{aQ)׾[6ZP&h{7!4'*).DP I<.H/?!Hl3 uK;>[sS۞(),Q-ejRI*J%8m 8&Շÿ` loWwa;h졪~#s@#0mu~)[,M&be! F93pF}?}Wgͱke-~+: !ϖp%.4zjH0vpP#~s I^wB̔a2Π_HHr)aI6 LQ{iC)w 5Ѳw\nKi(rzPSljT{`Pwֻ\c$&]A;_V*Pb~8Q2ډD P B;,v%#=-<öF;k]tWZ i\W/2т&%8RJU-Q/z6]OmdҧԔ8-i81V;-{8ZV%e^ow3mRmJBr陦5lnQ\X2HQ gW*(GɝkvUvQJf[Ϡ1#?&ꘘy'0I p,l`?X~S~lJd|fz+ƃSlSYu]0 6TقTRJF;YD% EPŵnSxVV*J^L3N $ @xdя+})޺e64 *k2C3s-*7R<'Nj6+ ˤ$Sdj]sA=7MWC0 4hɊ^E֮ *oL9$G  2ZѶ)hkFB<ﻆvꮫUٸ f""xG KwP`~cA>8)X6䄥qܠ.M.e.Kr0z2C"⼆^$bvv%G+c4n|Yیk<ss q"6ooLSh5]3RS78ِXh}#lqn䤨܂15Lוys Mı@2͡ j`*DjqlIPLJ%\K2sҕn>鷶.Uf{#\mjIΈD*эnʅ4V`p~Q]c;}gQ##< շѪ:^$eLњDF3Ӣu)ǸVިm ⟺t#KKKoctioKPd*b:Èz2#q^Q'6N]Nޣ*F@wvG?(}U~[̿o'!muSˢA7:#ƛ۲nҧ߶䤼N4ZBH8DUnLI-;bv9gҕE))PHK̑|B9Lm6%Ƙ$kY\}W~[ӛBf%2(HXh#JDO! a~P^QyW:d»}īpjfra91$)|u 'eԨ_k3eŕjB}$!{]߯o<싓y Je>gU THRZuRķM<ywqvYӞu#O;+ڭFRgL<*imRʄ= KP:T)FTϏ?ow0GI?_ݟnwjKrܖug%I!U+23RSmOM,*f.M:-TpO@).H7gw=Y}K{U)8줜i!Sԕ+P8X[< i!#ۅz?Gפ%UJ8n b~slhZX`8TH8 qg8'?Uw?g~e7ʢǕ'jR31\ vrKp̓J4jj=d:/.\ lKLe\ (> 651mWSI $xluf^K)4ĽZBh4޵KjHRILF9Pnhpl:~=V녻n|KM^8U?]mIe-˵PbVY 18@hqxhSrדg%P{߷JJv^Z)K FX)&)J89\w_N~g'7cc|-BvL!:UexuSP bDU1Ȟ{=\,|]K փ.B$LNSJi >Ґ!u2 8mmW5IChve4ym$Cri#\`R{CGnl5 XvO}w.*U*I8jCD+dGt7ܟ֝45"PoJ~ dxdbSi{#;*\x^  hJЉxA_t{.NsO<JBa'ǞXhT$UWVψ0j2K@hL9RkB"ھ$ uStvU[?)z`Vnc>Tu 2"LUhb֬ =?&4:! 6J( H e5n.I.tĩQ_:۵6 egHAj"˺vb}Rs.(1 Hr!֖mJcB=e^ ݫsX渜4$H{hݔ”>>Gr=~uYxC*7 .e6ʿO%SH&te}}I?(!y]TT zbv?Io05 iHt+`Fxպz6&G_~{ ڴRx೗x8No[s4-ʲ Ԫ#(9 H>p'pӦwNC?(NtAR5wx8&֌:)ߙgQV%㭕:OŇp-oY59Lu]\qm?4ȧdYykOSQfKk"S #LN*u[q3U:}dpqzs^Զ7M J+ĖJǠ~it?Ua\İ8@x+7MawiW}=.zL8wpm"m6&I@evK1H 6r yKԩ& \-m*eJX Lɣ2c?nΪ޹T.0?tA,OLf>rːZhp59Ţ HB[ m$6(JF@ RIrJЦLM@ AIQ@CcɌ ``*МDem$ßLJ< R|X1 B9R9@ScI@C8像gX y/uIamdQAyq݂yAF1y\pvBG\R<d¸!JCEux;bC<#g-M>.ZfX:RKl t JI&惄Ȋm{2\ATEw4 vjYm:gB8NĄE7M9A_0ԹiӤ'ҝYXM#qEԭ-7,䒤2WQ , r:łݤN?f|Sѧ=^E?pm~$bӎR17>I@oOoׂImOJR 3z~i a;EiҳK Z[W&f3'ā"] vE}B9f}N@g{GΠ⼢ЖVn(J|c^6;q 7͂'iX8eKc4b,)QfC4J#AIjwT #MsjI_uلAQR@\|5"rn\}GÊ$q  XTbbLa~1;eGT8O>֏TAԘ$a&B1dfQ*rhN/IyG19<< 45ysmlsR{^]\ܝd\Y%O3!).t؞m]5L;ÚƏ'cG?v\}ymؖJLOMYѦ.Y6fÕ 1ޝovv.JfTg_~b P1w_wGޕ913nn534WI3(@ %+gIࣁ  #z?Kի/KX]b㐖bjmtʓ-)2M%BTLx .Ajݾ/G׫˫j'%k/λHK(UTqCIFJc$$A>~AnȠI)īԭy .* DGI:0j@\ûӞoj~ٻ3M@ju*zJP}yS3X-CK޶q]b+_iHSʳ!ƙe-2n:(N1N1ݡ}A{2rUL 5q20í36nmND^!CKt7"8ZÕ:q91;<թǔˏ-D3ߨ< e\)qt[Q3)mfٚ#`)_.6kq9˒m=GPѬr !{[r~*mcB#:zNjW2}˂ᆒ~hbT*UڃjUIjvakY&9yoBb6ѐyr7 TuZ$8`!:(:UP08P8b#!8;#$ `j@ǔS\ ';U)5$'J>OR|\>ԶpDF#5O%޺!ڂ† =L]+ MĢO)0"Bg{] HƵxǯvmگSU!<6sY>ZqR>g )2bRQ8Bn\ GJӉn`qTqj9j!PÜ-jtZUc첃V($mOqM1`ʅL]ZXh p*%jŅd/uIy mQ@RL>8ܯoi*i /n[:r}K@ ]rH).q!؝^^UTڳLMHA/SgF"hnjC~6<.ޖuH`$P{Ua`jN-XJ6mgȤ%e\BT.BJHȂX[/-#}si;KȌ1͚^[uZuOEy#Ǒ-vAN>l cY$mweSzz:T˥NQl^]Eu o9'P)#H9 \S[/-SHM!ZF3+/YRBC}ϝbaI o0O%tq;kvR$R #gߎwTۀnJ{ D6I^򘢩T,+';כ&څ/RQ@`pf ?s?0IMl6b{ܸG&qhXshm-TZ[s0/,@ RM:K&z'=;zZQ?UGN]Bt' I/( bp $c2jn>!.;u”SߌZK{֘X&n9W$Y9Ql("%K:Sk \qJnٷDos]TdbmR'Q-K4A0 ciV"vN" 7%\8Y=&ho]1l2[ZM/楈a-8RIFxp 4j(%"{@J@҄4;BRzzqK@Ĉ4 [:}MSZƀ#W{ؽ-bީW5IW ')-7B(R&$!5߬ !9S"nns,Z!JYE޻ko]$yIRfRߨ0iu5h/3^!`XVݽfLRٗ[ҢV@DmV 1j7fiٓ>mO3SKJԖG{!]6q c}ҫ궕&P*V'.WSTҩٹ-#"}݄+ TRynJ{ĝDAJawMқ',QjrҳEc[eySm?mF(,s(8)zk}+:;vm3ꚍ1 @,G/Qbw:FͿnW^R 7whkr8 &1I%Ldz)(c,*Y|xJP|!$H{{p݂eЍQ\9pMO֜ڡhz_~`դJdJOHҋq/>wo4.VJMdqHhzP\M. гGg) _ۮo`eʹnYpPezFr?/34RK ֵJa% CL#ВT 4;}9IG}=Yoyɭ(y -'2fֲVJu <@ 5k853>Ȕ6KTZkGD?oin5([M++In4jpDL5-VLaPW.Fp ۟WL)n^)i Oj',7Om̒{Fm׾o=P-ɵlEjeGdDA> '"}O_01џp8KYAMU5(]~ԣO ̘n.)QaU}{]Z_;Wڽ1fZL92 |q=iR4e{ӏ˽HVDQC?H:n6ѧfarU b)7.-+Y4kKӈ#p{ztumZvRnWC,nۯ_WFJb疥8Yo%NGᨪ ZꭰY.|@vDm>uʇܱpo#s[tE0wE)L[Ks62bmQ:s# fkSZ\uʱv.MʭR4TW@#}:bp0gðN<վTWI7wNƟ;q L-*ݕ}L<[%&$%ؓƑ]VZ߷oHI@ Weݺ|2(O VA! @!\1Ƶ􅵫EK*ULjo`VuQ!B JD84$^]bVNq㋔tyH̜=,P`yϐ8/*^m}Jyc0^PR~X i*h#XG(|+wm7 }2ST5D̓K8JeY8SNG \:qnBgAS+Zv mgv6XU'{- ©U^&FLI)Hm .]MWXqiXt5s{fƣ)R堗Xv%ǜTzwlڱH&|JgȇJD۶y4"iWFX++mimlL7!#T#K\s*m{6)6x{3ͬX6b~Nɪ[M=ފf5znP/M-M)Yi".pG/:'cՎޫmea2<)t<2.ʕ!ksNDmcrFJTixM*I)Ȅw/`N^uڧ"F|ۢaL:֧ӂ }%{P3YEè,`E@.W(T-K[QvnbU+]y1Rљl)Y"jsni1̫IȔXүwGܕYiitJR%JSq.-Jj8Jn4vUABй̧ v=Ǩ~kHBs#k.o StɩRiHB'RH!թn\KV.7:}2HDoT=߲CyyCV->^xdž*\h|ݧۿ[S)zmԤۋH.=196;o 1$>R U;ڻ/H̼Qmk*Jқԕ}xJI/[G /!v:ʤn;;zOxTKF4tӞ#jtk5NY蜺f潃Aȗf<Q]n|)qiajhTӥCJ)H p)Yx⭿ΆjgGt-kW.3]?R`WY8)4$ 9߀$ QL-0c(MJ:u/ގ, 6.IѷOmjS}÷rժ5NQENJ:ZH'1dqҐ|GחG;d}N9oLJn\E p(,kW%OZ !&%'PYl4b?STHXW3]֗CZ7ueܲ.d*-jkZu*HXdq'n;(JNù%T.KekqD9Q˔6Gu%y=N(/v}@>{Go5j4zJ:7BpL0E!R eЇ@Ȣ(%F01QG>Um[nBz=}9-q-!qp!0KDEhµt@[{{x5\Ko[~V~B^eFBx%YI0!AY JDKzcqBE45zÊT=GRIQSĸ<*۷SP>Uj%4`vF}Xj5.?QK nĤdv">b }@p#:zfr<;>1o=WjWG .Fm_9a,ӓ+uVRқI4d2<^^\]u{GLI&!A 4( 8}<Q3E01c$red&vxn?NR YPW>՘N_v 0OmvS8v6N:(Wx~[q2$wg;l&(Vx s֟IqiJDNpL7%tNM%kވd$RrsAܜԜ9dh}њ\Bi$}nlBV+|Cpu-%)冽g:$T/Mӻm:^& La,ŷvɳ7 ܅Jn__A6q\oWy5\Vx[?;nN,mFۤP?Gp+ߤIvR8ʘyPRO%$f[\V֦t-lZ4:FvcTnܷUAm>\".%z\qq*R"O/[SoRbĸ = 8F䶕/,ޙ&, ݋jdk+A:TT +X6 qOlo:<#ǰF־ln~t&^F%0&Ew+lr]]IyF y1(B\?-Ϋ):Ny NǬP*ܗXmK&WAEbZv{RM2#-NsQ9Fn c0GKv^6BN؞CD*zᎧ8EA -8ㄥDLy THCgTƘG8LTlP~`\m   dU*%S =IX/l:{$ts\D0H1q+88=Q1@?zRTH %x X;w&Ƒpy$O88׺OōV?럪պp;mB6K̨ NjF gJօP < \12&R4` B/kp8 iG"C:ܪoB \R`&QzlG`;t鋂(ԩ}zq䩹då(J՟ڕRy~xDsp(Ɯ 87vv.6V H\ @AJ7u-e0g쟸i2ᒑ(#v6K*]E2ЈC1'G[tkMXACUL,:33%\m]P8^ G:p FS+dLԛJv҃zJs$N)-J9ugl?iѿMJ)jO-$3kfHhR>Qѽ%'&D#PP$q06ŕZDg;>V=Rx6ˎiϨ}0<21eJU)8'8;iWA_Vk}v$ܫKtXlB$b#FϮ=IŇ/*[l.Fw N\nȾ5,יU*shA A*bNnq=td]Ur)bTͷ,Yl,ԓSeGmW4 'fs͠\q>L)sr]JDtAD9bWvpURZmHpynѩv^1)\8!^E՚@8`;rܖ)s+mĩ8C B#%`Ӹq?m=B $sOM_}Ә#}Hvsm-[*]erԶyu:%[Ш7ĒQNBvGP/?'$sIZ+uJ\Ž_ĥ($d꣜P>g H aY :H)x$D{g3\xd<2pTJ c0:Z@5 Dc"\z19cg72r0qIO7 F >Uyt}/ͻEID56uVSei)< 8Wf}\4ݷv3VBЦ&zX8b M)t_W'wҦ^2ϲʛ? s)^ ())CԃN" fW8?v?U_HSqwVz==Jt ~5RyĿ.Zї{JpB\ ܛyhU:TS25/hM̺VPҝZIuJ^ew 1?}3﷍Oph`ܱb@>Йm\f-*G/)fqѠ1qpLlmߥfA)ާvP7qrn&^AM%d 2$* (:u}׳SZR~Qz[*vM,k@'2AtV7mWYVRIˑ iXqgeVfQONWطZ}liG'4ͮ|_vQѐG T;bָ:(v5lzPjZ)8F?2qq-l;vK .U@0pq1{a]`4qV SU'j(7swez}ٲSn9kzI J)\̭Z&TtiIN^PLq^yǣ1t$F &Qm`UP?O:])\Ɵ;ֺiPͿI3#ӇR{wF]*dT#`mUmIŜO`:b?Sv` ǯQv7nF<8%D׸eXY;y-02=nʠ Ž-ɎS_V;Iұj"W4)p(ߩKuJ%&Cτ6ܲRzk9g.-ؿ#IO.cSZqրWQI(P6EԹvV:ҙ}zT!I0 sVfԦHp*;F6UmnNK\%OlSnٝT.)=7MNA㩧v;sp1W:f/-Y'`(cf>VcS-Z=1I87ͥ}ө<NNJV\:KSGQG!tU[7)1{FދW1.tLT?pW=W6NI=3>bk+D4&0+@sXtZ_q<5ʿ4ǰGzѴZƲI V@S΅lMT߮~{|-e8.K2D%y0xԧZ.QeBkap7-޿ĎA . eiHԵyg)= Nр>Qo,-RiIAp#Q Xvޗ+Mst֮٘U!2sb{ïMkjЧKH1.E3S[.`y$?8P,6hx #:nv&~30% H@CR_c[_d8@1!%+56"naĜpui3( ToO*m?z~$*QuD|áXiS`j}V U:ɩGtE%x;M)f唦եk(gqSK_:E"vNeKtnhwM&]΢J蕇jTTD)E_ےiU>FJm+vU]/CMy<` @s MPCօB!I$|qRu2A#ީhL>f 8${D)C߀N0)V1T)}II9r@5_#wcrwFbHjMDO⡿SrI06hxJŵYFecF5RMvRZR[B>J:G",w o7[?ZR6ETE 8XIxzAEq_TCHRJt:itQ㗆4:ESEun.Nw"Af sS&aKOCㇷVb内P~5}~V>#"Jyrz8wew~x\bX)螞NZ¥Ӂք2(SVXk5ZT8=@1wzʣ*AhyiNUCn2eS7= 9QZiS(l$KR/q{&Swvնpklx >98k]oMR'r d?'ߝr璄 zCXl#jq vmſYacrD"-Q&aMKu"33mޭkGdU?Ǻ+{mv\BuMcilQA:``0wSs>%]QhmN]f}WW9FV\qwfВE#PX񂒊cX;qϿk,b'UqԘ*mʻ"Mɦ YQNJ# 2L%~vЖ7zo*"Z}$G G$?fմ-IA*TGo={-ZڐTx?H#p]}Fwf)$ :e:iuV8,%+ 'vz{_KVjဴ AR ,FQJ[}nL(Jʁ̨c㍱CAo^q\SK5&x@r##Ǐہ%Nԫ]M.n,O3Sp8 X5߀1zߥ]jZ1Wybp9)GLZ{I}4z.AI+L&Ry4ھ=⥽m*rv7O= :H. iS,Fâ~Ch&V+uf*Zms{TԮ9 {o?kQmm6߭1s'w{يi߰_e+2ԕ*'/= qjA kik%6W^s߷K)>オ+xo4AQ*iug\7~z@+ɗifHJA<F1+A#;9 ·c X,+Bi\YRzJrÎ&6n.H Q:ӝIw9AiGW&OfP-2hrM+CItU[=[$a"}wޟ :l`NDt4MpndÔ] IIȶҎQg1cM;fw-z[N۽AVRj!DnZcQCZ ֔[y՜֣N(W_2vKӶmsظB)iո!)JR ))b=V)/{Ld =Un)흺yK])46׀yV龒mmyiv1WzܫT6*U$ ɉb*uk/,tEdy_kCrV@CcrcTrH0c, 'cxBo6R'Jy⊋ (,98qqFPmAc l"cv8gک-ʅ~==TY!KaDp8=9oS%jǟս6wx+RH3OLF4*ZCy3iC蓼ЮG@cWV5uCcþX;};j 0yL<6:dJvFwV[#H"JS^ycY: Y!sQop5zeF7"ꏶ8<g k22nYER#1\ o?:%JIBs`1^$$ng Uz0#MkRfBG2]mE#ZDI?}T~ {p񆝥<n]RsB8lt.WEMmtτTN&OH)kKu US8V'(l B8ώ'HssΛ%amnI)rNێ9|+d 漢P+4U!CڒUnI} `!'5tl 7}M>$qAZ?@1$q6u\r=yS$\Pmέ. '顧.>CJ Z-$9csi6 #FnsT++{CtniVe vOisq/qt\o}6WaccX9)߫,p7IyC=7Q[mH:8GP>Xn*-:nh!pRF`бqwqOȗ:Cs.I;>֥M.|ڔ(%Q&Q.ȘfH^-;+-)L=$ W9Vv%Q܄R~$q*Qc:>@sq-mlu~s9+m VݨMhy&2 9b1!t; ,KrҾں~je.ECsaġ-Z@D=ShkfsK  Y+O-$&),T"GC RǶ"HːJDgѪRHxcC^ 2Q;0D 8 >ݤ&p\>P4>1.j˜{B@PB ?cI!zZc1#Jm",n% B .>r&);nÜܖ. م,<\p<g +{*z9{Yz[~}F.]VoEFHͼa_@Qٌx˛YOOgǶ;Gh.nH3rIҵJ'\#q*E!k)_pWBEV.)u9/qbx.X?C@9+*Lyy/{{U6핻)[e~XB oۺO㑋Kuú-eHaiB[=r2uTr2j*I jIQv_Yɰҏ?`ݾ6փ^MJR+Iƣ~n;DԶBBI85OJkfw" K&2䶡#=buӋ(~?}<+iruu_, πtwwC zتJ-jì9QA0Z T2Ͱ΃7i{YqkSi.W7ijL!9J%"ṉ;Iu>%*#[:4괴[h۫M 2N 9K)jedǡC"!n:YldGf1=pڮI5"s uzkΚU'3%PIL Qņ5pp}e;O{=}pAGa.nc_xQyK66G0͜Ǽb7~Zgiþ-uKoLa#j7I {@F2GPqI*x.?)ńB>Zѹ\Džf TR(jeiL0d<ѧZ:mWAom^iR`R7꫖fʺ5SB8K(RG,zjo.w7؞B\Lydz?GQ%A"@ ڲ`8+r#.mk?kMnRl-!q*W?1u{6ˤ$i`w@c^'Qs"?jV8%XߚT.qόr>#u+1NwaHNRR^!1KD#ٍ6g>< #AR$EkA"D5S&Mq#_I=ejgHkm X#KVF$K8$pTIvkkUfNBaDT FP `v1[nfih+S-0ڱ U,ΡmRMsNqǙL`2ߔDÚ@G"&zBjKZ=%?e{($/]aRڥ SP @זJ *88M);ck*S;Nyp:RJRq<Ψ qCֱGͧ;چtT,}أT)6uU iҊKBDW.`Ui7#U3; {٤UNKKT2Eȍ+y)ĀxGJN3>e!ZZ3 co>C* @| HIJFC<:BQ(վVUYҚ5BYd1P,)qq=wpT-ۅ4\Tm7$L@A/t--p&D(8W}=mcEň<h `sLNbY&>)1ĮQV6鳱Ta.l'P>rۖ+M,3eNcY[O.q٭,(_/(ЀC)Y8[mJ$&oWu*Dt^nZ5USRpԕ!zLs8wB:G8n+TA&'6^DWTQmIeY9g]ŴǶ~YWvj!9"9݇o$hSڐ㤨ZnPgqSTJ4+&&Ki yeF \ 㚆 tA^Q/U&ڻj )HP!I≺Z2 ~Qti9:bH=pBV:9X#Ym]姰qalSsKLLa(bה/"fj|z 鬩-5rܓyVSnJMC.BWH|ڶЧ8#ݏ._BzUw+eAݙXV$&SsNU[HD+́ sڽ -tůJ*۹Zԓ"ϦTTk m.ǒ48n(:g0>Q쾝k Wt 9H`n$!$x6 &30uV',8 aJ ;8&t $xC yP>0A 3jtXI+W0,iazP\9De`h/:04n^|}s^oG )Օ4㗺4giJĕGHN6jX LY}ۛ^7&fZAkZ A'aGOtꦰ|ʀb&>iD/5Nj ;R RPӫ,]EnSi61-//-KWL,+PU3  J?g[׵}MOq%1&fX^zsC ;T& [P*R|VӁ4(/xfkC2ʎ^bд4Ly]p1oܔk[Bee]dFkRBr8닇Qe(sH?q TIsOTV;bT횵d6$c2>xl/Y8.:cygP,nfS`a$3U(qv MTwT@D8b/`F_7ܻ5å y$}KC}5y2<<6g{).UoUTf%TcC}R.Zo9bjlVetsOnTZԛr]egҡ|nu?.CvgLVbni1\89G؝fξT{-.A)C?([ZU8wޑWW_P;#پoeN#{w/ʾ-C@Ԧːm>OmĠ~= O?xħEݨ[ %L[.8qPn.EUR`=7RLF(ǣұ?k\PpEG>Q~sI*rOS֜C1q7JխMLqk2ݱp6ʸj )bOih.dUgETA^Tb"ݎ~8CA RM;0^qRۥ( ?V\3keo% 1In])R"} j櫕88X:. 4^nvT[7emNRxilǤ9qYŎ4M+ۺDeRUu,2FAMnWp-rDimP6d-ԡNkQ&8]WVrd#ӝ?;^d=iShBnL\Nd!yppj.q8iG,(=7RR+U+&ónJN8$ajU 5|,i=qNݷ$Qprze֥-d1>v(!u(NB:) gAƭFmyir$tT^0B`6J{*j@v; 4\T\QsM{&75B۸ETṃi@D}:QT(==Z(:Zй{9ݗԶO*v ZfvOoL:J4@bN+;/5k@3BR-l_u"a=T $뚦$Ӫ$90tڔf%c`m1ʊx"s5fW&$7.\L[PJc2=-ƛ]Pj}P##u$,AaBbBj5a[-+OPxwFym 2TΔ5/Uhdx{^mgY>EW0pbތ}DߩwVbfܪ .a_vI}d>U-ZPH"008us O|>wz-KMSR\hpRᘩ+3N_ӳIYKcW /ϫ6,oԫnh5}8MbLEF `9Y8E4HAOʼeQ>|8κp*"G{?wiW٪ٸS%!MJkO%ڳj\̩35!CU7(T)UG:s|Nɧj_!>X/5JίZ `$ څNhW,4H<3Ěa6L 8O4BCg/2R@G(ry'0.>eߘ+La3Niw1UT[UVٸ7D"M+6e\#0L!<ŝw-i\?( ޞڲ?E'8O "*ojk>0)m @i0>a[5aVuwp^榐$&[<[Z[FvjJ!+e3-+bm~ֻUR'6ܑkZ;a[&2ʾCO[G(Q MVzWdVg f*b's, vP5{o'r-MR M zN73O+/}mw{Djt zfs).h1j1}Ȃ9ȎxA0>v֤O44  !aiQ 8#a0H wmfUcJm N[J:d~G#;Y+un/iw #š']ٔ!Zj# 4cːɭK׻s\{)͂v]O2Jѿ1E@(r'Е$F1 1u^qPcʾl{{sCxhv xD)!&U`*S`I(rH50xcJ; nn8&%{mWrtBT^e%D~z[[\b3j^z׽tP~68M>M2jJԋi^iLL6~+=8Eq&) ˎbaoi{gғ8I-۟:snn IO%.qv9oe*T&M`2j%.8 NpJR 3˚wKtO86ygǬv{Kt/.֍JԨJhSWv'{jZ*[xe$p -?cSC>6QӶސ_] 1@Dlv۽I&SǢڊOQW7`,ϵ>XFONc<(i 39&z9q9c㊶=F8 BDe^|iA8r NaB*x`x@?/ G6gMFAL[%V+KαM<`/#wJmpU#yvwz$Ss!cT4@ nI>qt42UΓ i18䎌˯%JT~(IRtM18K:9%YiOfE֡x.2x}:[BH!,6yiOTɉ5p%QTiBNdCQC;Br;c'%i{{Qh3K̸K)Z=Yթ5ژD\LMݔ3[cqQ>mV( #MιFuNFZ@p{umX 8YcNFc>H#Dm͵vq7̽+TL-w!N,\^޻WIm@rw7 c1]D:ҿYm/SoJvPm[vZUJԽNbZViYqž]gB T洑 Kul^ܒOT#myN稚Rl0\{G'rO;Ok HQ5?'*O50Ґ1*q( Nj9 1 CbE*I&Mor=̰ Ԓ{rVeuDO(I:N-$1ByneJ Jc%6ŵ)DkV'";Ko_bPi^")>\ų* $(1NV֧Ҏ{m)lIonpjBuR+ ?")T@X }$D?]\Tuڔf=tBzSk5Jû4'66dSRmZLs#NV5^3O؂xfaQagcRlOI=< ƛ0h+NTit',#Z渻iRė1\NGH2~vqU1S$$QS BY+rK@RWHq̦_M%b^A v [~5 @9.1nbըd?S9ŏcoP=sBS>"%J88*`&yG4vzYm VjZG#k{=EshΔoDyM>.xPWz\\u#Q$$sƅcId^}Tqqv?O"5mdAxYA(BDbk]*)D›=I8d\?ISz\iE8\Q` 1lc0xD42 L"}9 AT,K-0I{0 (QeF$2r‡SBl&x/H(N(@. gGhFp_L|yF<Bdߧ)v+h+pAfrdyEfBf#^rl)QmY50+O8A#qrrǟn9[zz!H~Yh\amھ^]$We`aY-1O V{jMn Jg3 }mEjj~RQS ,$4f[^B@%M*ۖMiǕUsB)∹#؛Vi;a}<aC Gamow#qe?v'~fQ>l]+M4qrTKL =uD^{8R`JV%'HK)<217_~کs1yC_!nYYԭ[nӤip~FP)MQLN$CV#ӻ6gڶƓhn h'؊!c<yvQRUar:rN/#O P$6:Y`C <QG.~X0;iJQ7,/ƛ6XQz߫iz(H9ZDŲӻr.f@2BH E_rIv'$/kV[s !3$"'c<{"[OkqkangE˒4JJ09(`*>`b>`ױRgRal֘M)Z0AayPQ4[884U[T䒴p$GR[4C6J5Gy.NJ"ĩ63񕘘ZeZV8#ZW^P wdvڔq9刈3"*ޡ3.J8cRqow -*CE'wU@qb`{(OtwGou)u@T3,-00KҎ 8+ J D9ͨxvpgmY-`(>: no=Oj >r6msiJҢ9(8\Z\i42%5*&f 9?߲Sl)f)jq^Qm%)mM&QVb$:s)7QLYEt0qɊS5l٩ J|EBty(>`Y _ӞnVWd)HhmVgiړX*^(c֕ɼ~I7j^tD{#wNcW̦1K'ҷp]Qmk.Un5pufUmS37Jt+[lO#Y$B0ִkyUkO37kJw;2H7FN<%}nvgvwfzOa]vLP:\f/ <")O,n:W*i Pq8֮ik>b#$t9!W;B[Gi'Q%?Z-F7}Vd@)IIGKJU {k/6PL'.52/74$<lBRѩkassT 8(uNFX!nٹ3%FmOMb0M%ejWm@[Yqoso)Z6ȷ3\ʤ+ApXdǑ۪]K3#6gDԾ8(!8/~ë^WkiM ` }QPN)W̵|. 5U{u7*vvUipLf}$@p=6#3 TopC鷷 %|\1'W}`Zm)| I SQpfRܺsU2w ;ݛR`U{}Y׈[d(8rF-}3Y !g O%1nvNZ;Iwjfm~)Z56ٛ>! V%{Z4_.'Ǜ ESMbrtbB5NหebrjR)۟@"XiG~&@@.8I9{|RJ}D8pۅXrx42J<'08;O8MNq$G?nB m[DY1$9Dfk1G1X~*^z\.砿nӪ4I|"P${VsJnml"ẩTGhjlլfڪ32 jBd6pyn8gҷ=;U&ٴ3N M8VT {f ;^Oӊ峎\Q\O'ۊ_WK면 {ees U6LxWCSZmq/T4<Θ}$l>vEMt$XZ:@ApոU 87_\:.]_Ct>ٷS! R@H&#,Ǟ!Ih@WH-VT亚tjALZ﷬:\o#mXֳh4Ɵufº,&jYJZ$Oji6089ֽ'q{[ M'0<ᘧ9a(f&KfG-jRek>feI]^Si5C.ܦਜ਼z [ǹa \C$}vɶM$e62i3:PF4E\3u.kJ\ FjxB^._YyFkz7r8ػ:D2TkZc$<#֕. T182hĞ)r~msNv MUTPO"'ݯnZ+_+X2ϴ<םSìj-}wI<j8ݖv z;tCg: 6<+S]n'GMdч=?weQ0yGG"zA^әCmYTJWB߄iĸ# @r c9qJ3XLL(H$ 8Pe !(ӎkqT"$8eysOoP{s(9I TEOKDmEyIT9jTĜ)Tن2-]uQ 8a=WK$ϘIX+k.e!XE 3&,{{pv ө]S2 ֫kT[@)kˤꀈ<ʟQ;]6:!2BmAm6ԙ{RiANIqrm!kJU1ǎ+6wuY]/\UOd3 rtLx 8۩r؄w1mRߕda%9/pjN*f 0qV/9S[.2ABP#GiCuM{w 8EiNo[woiE-0;')ayPji%J =$IJu6/$mC8-|?rژ& %X}7 _kVP//WM=nZRG@%AQȌs ՟3EP 7hD_QضF?n8/ݔStVVFVryGY*t1\A+#V6M74K@ Z;m!r\ʢQ%q^uK**7ƯO+} l"kW:u7Xf)!Ꜭu-.i! 00^ۼnuK%r'(MFZ V3Lօa_&c bbXy8ڮE'PIRfBs A83HLV/B͢<":O! @#[o(aZ b̕JPbUMBEBqFӴlTWLMbJA t&#P8c -Y^RMFN?kٯw66viw6޲Ԋ#ߔکU*GCv "5ySinhҬB+A!9FuQ54a æ]˴W&w__Tʠ'%:ɨUmFUiK`9ݷn5Qj3rd@y»ܼ}G\sX4)x9f~Uk5  ˊyijoyZw=d{fٶA$Ɔ$TE6:ZE2l j={oySix#SYһoSi_Q{T)(̓jmM3ղbGqlі*y@8Jrуm?UZԠۧ8kF5"\#enVa?,Bm/28p 1化{*9lČx-YsDP Gq#lH$ByRP>fH#<.XUp$2U(t.(HRHHRT!kc;~rKAҧ9qY][^jڎcM=4a勖Քj#+ .y˫̺kpEWA@8 kbpozffo(VJ `qg,!a;k<GDf1j-qLnQ*[!@@#G>pH@yrB Y@#P!x $0R%DB rppl%:ϗ1OXJm.^#}T8As3F 38)- F#Sd, A"ԋj cjSi7TωGً'KeqP؀$tquFl\(%ǨTgm*M xӟ12I10Pc)a:|8I`,,FG.QX3>TcBA|0Ҋ s#udr.+(pDb9BxhYhE!qMQ`LeFi <#R}s5U6Z\LD̍=!Rrr-"S@k$ aص N1)5mхHsH!UfJƲ ۽pO)QBttS44vv9j0K~f{ky5jAs\>3"S_R^}֓ԕdj-qJ7^ wط#rg؏V]Ia)qP$m5<$acCIHϜ_{7?XZߝ鯦R2qC9!CFZ9Qπc9TJS@7Jy,L!JU$ OjYw򯮖TiL'p>?Nw)Jzu0*#ԟ״[dR \95HiFm|J +q!@qc ;"cvh"%*2"}( Ij9S|ʂhW^o{RTy A$Lj,cAOnq6gs0bߓy_iSAQ'Gּrw3OqP[af 7 f)//LsISΥg7[2|}A =O,O@wk߃5XZ;( Sde ]zfMSj%haO2^xVƅFPa+*!F iC19H.ʑ0籠\20\#36MUO«hyu'&ְbPR2,l[1, _SPݺW5] t 6䒠;0fg^uυ>HT尻 +6vu]u ).gmԿ?%E+Vӟ&꒠B؀Sndi07[Voi^X$rmSo\ٜAP>m!{S%)t!G!,WJK>ډ }o0@k#"?#k/LqaSj1 :pVjULeK*:eGsH<&b]mʤO)֞SӜ$6ۛ`\w9{]-o.c/(5f #18ԝD%j{#&\51rJi;€2Ki$# 5M{QDc1\S㼷89; Sp83 `JE(I5XFt$$X;]g| m^ÏŠ\=˜( +\U :898 .@Tt#~P%A|qȕ׮vt֩(Sqnd&3+GTu j%>MOs_}=>7KV%:~NYsXQ#,[Ќ#"򡶷c5.A_:aP381k}j/E%Ab=eq;;ShV3Ls35)&jR:eL0ą8{q[>ޡiHYە;WjP+O&9 I.&0 PAÙ,R CF%$Cc(P2BR"La78&F4EIڭ/+IjyuiORfejVIQHI~9M\r3>U)b lwyU -]$- AZo!-chtEZ&>:ImvZfn_bL, +k$V5Tf\I㊾.G,Y4`>)Dv($IxbL)„GL8bLs0L$3]1?a@P23R 3埖8 LeZ ~83"i F8i'l`NQÈ>0c 8a9RBxӁv(< @9<^86kV@b,:{h#-,*u eħ!`&íH9BwieӷMF};ߪ"vBa1:,p+L<ףm.^WyI^R03 )J:ڏt%ݥbMյUUZLbXh.]zHBRQ֙䱠}D۫7Wu1]Sޮk2n6՛VzǩǛjULJ$!JR)+RƫuJҥ&yv=Êèi1o{@OGdrky+;7uJT}}UC$T>KAcgBu2aݑӜa61sQIw+-Y cf6`E!)XZĤTG 1s2 d%)VZsƘk\"yHK(.PIbRBX%#7rJXWN]mVKp08op- q:cjEA,~Kn6j{%—ܕ"e 3J%)@HxbmV2' FԗvWUFhYM jRP9"_R{KjVvԘPgknM2%GHx`h-[&i NHL5H#=*[K}R t!Be942]uDd0aJ$ڜRVQВyn*VDq ,ЙG޽ )pk@'BTOmYz]3Cϴј* Z5P! ,,;a?aQ@.8JluKUcIY!GA!ƖPىN\c<1;KT7Z;ILm(y3֓-Zd tǴ}Wzkk,m0&X)Q@B!LN}שcM:xO8;\L{Npjttp҈ R3juG/UdwZ YT2j0n$Vs)vqZH<4Ŭs1!ZZ<*S>&ݯq() /eFӒx (C2o?EA88>:. *g< Y$n7N%0R>8#x CF7b x/a()ԸL,P8{w c)Յ>pxU@JcBzۓvY$I̢ T- P9kpڌ3iج@"9QQjismAR :,vd0 c_6+x*9i*KW/Xe8v q!xS8 F 981Y®h!Lw Zdf4y]$mq'9\6nY D`w녖qeΐ IAHfD";wܵ1}⪷ST KD" 'o>lhkszOs{Ӟ[:ƳQјr xZ2I[L1//.9FbMZi6)H\\TkHRmЀ#͔?, JiiJSg(b@dp.xq)pb!!P$4! zLB92KyI1:~ CJd&s`# )*)#1>xHd'ŏzu "8"1X0JF12qGe%N\6#pi?.Kf%gQ!Xu=rhkU &tU{Zh0ӭMD+yL&fJJaŖS)LFhqE[vH s/m-uKIrL9g GL@*+54,tb,r2Jq)3ihzb'a}>C4btǸ>ePf)liI eK1\**sT y*)C>b}mF@~Yr4ԘJ]PZ 4Dq"!QTQfTꭶG`T}k{ZyAb҄r?hw;jl*Ja4ÂZ`Q@{O\Gj_sږ+ۇ)G6B+ cǽ"guAB#*զiPwuZiЃ#ܵjP-:^gNK kV. b?QЖuYO(LHTRzPSRNq$CݫKh% 3&![&ؓZT EIJ+a`Dbɰ.]J rD'Jkˆ).2a Vbqj;}-dդ)RHkfyN&kM8{MۯRnh xVj7u7M$9dS%ZL% R, sj۬Typ8qQUϭ/l{Jt~ޚTb0%d 39#u,iݢ4Ryai_ _҆}sni⛀G9yFV.%K軂OJe!wTcYge*O6PAF"9e;KS&Ȧb=T OPxN@rj:4~^]PgxݵT r9]etݟE6\Mn'pr.JBUnmQ\TuL&9CIx `fuϛqf]<_|S;{]cy{TљGnJfj/As/x )Rݺp?|9۠5:NE=UQ^NH|Iԥs?!CZx P(i,W<:f*m#0II{vG1ڌ P0Ձ2)t|ygsg.0ࢤ<A#IIW8XtS` ~8BDペל$#q3E%g0Id=0Tdžj 8q&F? u.15pc<=2jD]<4AdqH8gi~KArY0qskph!zóéE0{Av>Epy~-ɶˍ$q6 < q/ݹ9Kƕ9(wmNj]Dl*AQ$f#In4]@]H?gEi8BV 90NT gX JDIbtA㙄Ri['I9g# o8r`[*-PiɢC")Ȍ燶Qbq~=ѫ}݃nU.pi S:zJER-% ?n+OzSTLNNW|7[ݽx4zLsrY^p˅UjSSim]p#Wu-dP9ǭvM6d4O2q/쵯fnrnMvSr~vZQ?-J-=*B L[D nKXz`\^m'5S5|0*L`@Yeǖ5"Kh>>\2ëf+m⯀S+=FwKYTU}ERrašG|y稽=5ow d&tZum[kkk^֟N(ڱon%+S6myYm )vꞧQGe֥AGc7.[9 qS_Dۭz8IxbW+Je5J?KO:amIkO*i]+Qc47=^L^ZJn912UPCRBF{f嵷IZXeԢFN| r%ꛊ u%e& y~IpHN@Ȯ"A% hr)8Zcg|ck2'51TAb񳽥OzM-SZ 2>I~uG&^HGY )TM:]%#f'| oDPTJ *LVB ticRaF\>u7jqWFSQ l"c+ua PLI ?q0xÇ<. g>#RbP?<6x ěqLD(9yP8I W vyB#cRK4 d (ҠAe* \3ABA[J%*`p>&Ӥj"i4K;%Hmھv'V:r|8a}t"_y*'(qo^Ĥ~Ťt%Z)SΫOFPL~-hrR 8;a7Mmt/j> o《F|KRU: L6%?6Ǩ0 T A&>c}7VYIFϩwu 1q QQP>&Dt,) eRZݖ:m!JI%}嗁5q1ENUmbiM3Zp3;mZٻv]ےʀm,@w ^^2֞mP?LǠz7zNFk!Çd|m6[MNӥd,uqxp={,EiN<> SELSpsN 1emK[r^7Mv.58=iJ1R#%YG8bouj JbGw8ݺm{5:vOuQ+ifv#2]%o/ݠ5˹2 :|Lq\_]hQ4!nRN-(fc6OnONտ7qUJY[ dIL'a8"0|( h$1 THJ '#"fZs1ą\ "H T00P'u4 (A&11ɸ3$GpaM@\`{గRuYr j1Z${=3]4)7[eݻpf ]ĪUPQA' صPUՌM*4]RQ DU$ E*wnSHk Kyŷ*t2 o-җti%@)\"7 M "=A־egyUs?(%Wݳہy*:tdJa={3iGFzɊZB},!!JyIC7덡PcPql8_xڋiVjsX&H ?8oW֯i/#۵J%w̜I1%\Siˈ!Ͷ_? ̢ҿRe[Ц@:iGo>1 k{^\y%BMH7w*WvA@?voD;gp-1T"5r'7Ħ9@( %E$Rxx i$ںڪ 4K:r'1!o9{G@z)C#(ẻ_p쇑& 5\wJ<5K327F$4{.kfT=ߌc~m⣛Q `']Fzp!86m6ް*bd4(Sɏ9iKwm!hbw@מMMqr[Uwt2"N i}ֶ2~}l)@m" :?sY+Bt3Ol3/#%R–ZsL+g`K-PRIXnv;Q09t\S>'i=Qfi8p=~KoKWfWCr!eٷt&:a l/wZ4I%ۄhUl RsXR`k=$^"[w;8Uomp_T_H<_&LH?gq-vWjK `UhiȜbIPS[J qz!( +T,x1v:Wke}Ywl_E.&JBK,Ԏy(+6'(>v9@91ٟo7ВMR' 5L?N-}EOD7B7Fq-m{a6Ún%J,ʺQ!"f&RRKi)mI1<06u:[SPHTy7fe?ӭ& f=&}գj*Á O9Igg']K2L !':浭$;afСEjC s@$l=n5sJqT$f?ށ~V껑ijK6$na(q}mrkW^QKh)f1Yb;hzۮ 2Q"r! H)%ZX)z'H$ قf`c l3$T(rA$ 72"68鞚DŘt'&yD臩Cb)3-ugh )Khm` Ϗ<ñ)0J5߽)Ϙ ]11Zn,{1t-*8x{95piN qEF~cXyzf|%v38ؗ:H4{ۊ JVHD}xÚL,H00 SOՌa)1sP(4@L>JI9`PI;a ),UB8r2R1PYֈ8 c#M67$-B?x<:D(ްTo)85ϧ庝=?ëcۺLK&@n-ъ@LEk'iG+=ډB^o6vʭ-TaG0h'P>Zs~5K*ʛF(xd>_Wlײ t)%2zfIRo9iɉID%@/Q#re{vd:;e:~YMf]II{juڲrqB 9(_]0tq~b z_zJ]/0cr%hpRZu7v缪e\a < ʳt9.>Y]1Ď\z+Џcvzwv㨰Li982EK`%" 9 RA]z5ƣ@kF {TT`! $ptIJC}5 : >G,t{ڊ@0PN9qqC2@!F|02#><.*P>ڠS |~v{,r| J">>ۀ:fL怰I \!`D %C f|p/Tc"f} )1K!sL6LJ~ȌI/t2#I$p* H EgW2IWHr$ &PqyB D9d<ʼ 100 І @ FRf'H>斈.mK8C0Nb^ Npʶ慎`g fvu}7/qSmiUP(YjHΈ"8Ecm7mKxrjʒ_̺zrGV|21vݷ;*_d(q N^ʑH(V97gvtLImR?Xz3Q#́۾*HN7K{kU^;@Vn|R)S)2wDeXo,j3%foP87Ζ-<-R0B9G݌Ȁ=AYM6ђG~;IoAe&1/2c kRPg,eCC2S\s`F4y~U'0 لC#Am%-x(*p SQ@R)Ș}"x E1}ͮ˙s!#7IQ~/zo)R >bα$\>%PHȮ9e,cX^A6AA$ N⇔!59)2hH \xZQ"9rlL=CP5.l(  q`v>7(:ׯlo*W\'_9~X~G5zzժky(u\sIq$AJ" I}eBZ-{^[S|!;iĩ]m[ISx)@?N%͖Mp\tz![IyDsuwgE+jQ҅5|-Ϋ-"UԶ޶JvMkMeF.FB, o0ݟO+,TDš:!rnK%/!=clIk rNBI fqdB&4HP#8H Q:|! (AA1N\0pBсHԔb_`% $(”x!i$A P 82GP+P#d.~ق9\HLx-09yx㋊K! Jq.f*Dsm-j'ۜVwɎiҨg 8T  a3ĘAf25$>Y7meV-yd2 i揜`Cۈlqc4/(5M<ú7W~p+ew"4*AEUj2 *=M *mp'$6J\F#g|Ho,pjaxNc]6TD]mYփDT`!n$/{vO8 <>ouZDΓPfacQſwf]uiQTEպ_qd1]}GT%Ē*Om=aHRĜI=ƵI1${|XI a; KmDp ~0굍.8=/.?DF0*1>*􅐆4ixAꌳ`("?uF}:rK g/n@9¯hb eyjԠ Je{tKRV=)6{Re|q´xE!RzmPZ[Or$C1tV61>4zp!s G;mqJuȬF'.$u#vڪr˶+unk@'Y3v?<ҨAIM"eB de㭵mB2AiTT F;0F@<0G&^SzԒ'Qcu)Eե ڐATS '#[DSy^Yj 9Pʄu":L# pPGReɇf%˨ʊ F)6@j"g&qIG  "׽ʳXYOP! 3K$)j}ؼ[J0kDeFoO=iQ#槪6F\4NJ &Qe)(!D,N8Fmj[{|$Gq^NR5ODu_ WŸ̓aeÇv4Zi@QGl+@1۪j&%u}u2 3VZ,\7 }H?KہJb=HDnuQVLxxbut}3 {ܩ\b˖*ٙWjjO$D l9k N=Js85{O# ߽iݗ dT,KO vbit9+Vnꬽ0NP<՗mӪ7ˤJDn"]CSo^u!:ӌ XZbOCH5E%'$P1e?2~qEܒ?lX?i3HKd5W<6|)V#FA&18pnqIQ&'A; j )!pX0JPDrŽD-1(TBA)8' P~ĘB00mJ0%a5p :Pa<8`5r}E`9F'x88i G>p3B a ZUp"~eA:~~a餉y56U p0Qjx{V|N'o:?uj , 5!8^d=rl#Y{=#>1gu6YRY_[fQpvvٜZW[_̑e9dyӆW;B޿Q]]'2;0@$is9e g 3ؤ6N>g)II:NAkpm639~q q]܊-7<v}кV Ju# 7Q3Tij4*p#Zk =e+!:V"r U`=sIxdab/d\ZkRs#"3ÀMB.W*iJ!#.Q "× kCNޤs?.zRJBqR{R6JbMVe@I.IJNǔ#]YT1IwFi[vn?M7ϰ?8Kip |$q0jamt~\3yҁ xeQP a%VAZ"DG8pg*c IF"XG (101H8N BgLJ 9r!T'Npb`RsL2>,R68,@#Rqy""{TؠPL*|L3i8طV?=OϫsMM7%ShUwuƕ-WpW'<zb2vߜ|6˭ +Rqc8,Xh 1y.GGR4 @ {yn&| m*Ԕ$Nf9} gKQ&[ԿV*I `; E9@^QLs Wi/n6s`+3 4 9~Q-u+Dƒb5J \\}ѦR}7 QIW.L hM-nӦѠd3B ַ5-붳Jb6K]ƭV@`0 C~SZEq2ӊ?K~ G$7{V_Ó;[WfܷvS?CG1'C)<3(g@ huiVxgώ9,c;^Sジ"MQҬ9ďnANB< !kA $bc8gs\Hx9j&<ˆxs,xg5+! ;C3!e!C֮g8\ePI'( *5P18ی uf#А`@( AD AG1,('(p3J}IYNC8j.>>9e7U(C[.11;mܱ*r燴2O(n<4Ac8t -%(asᎬPW8qJB*- c98'8LnzV 'lE[`)1uCxJ|bGdsb0=ɸWm9[ZCe:\*?uGۅϔ$?Q?VmzWh}@Ti7Пp(fOI\ub%KZIxmIl ;#nWnW;anw3]%@AGNuh(ǠtPZpi[nMFBZIJzgj>|2=&g fC]FFFOqe6JQI09ējTPKzW-h(&(mU S5SXu*LDAD@cDG`0Zy :aLD#C(EÊ Јg! &РjK2Z IJ׀s@03`3Jϰ%Xe46 Rny lm/)Wʍ84W} z>ar.1ЭIk+AB1'tiu*/yqrQT5:eC: VPFG.X^V"Ƕ okR`hqJYIe80s Q m%&Cq8A:VJ\"DYx8Be)4Af?n` 0 4))3 9'y01N,#Ba2p$+O44"x@C ߕ`3k̈,HvRZriL ]RzBm Sk#JNkY5n(A2!oӋ.ڪVJe2 e+nUe&}(ųƳPk1qi>l:K+CPnQukHQ9cc%C t=x 3?8c˓(N4$*'YC w'.!BP $iG,q 1%e2hQ%R[(h!ǕOBLơ sB*cZRt͘IXχ?vx}318y}[:f1- B˷*2i][R8S6m|+q3SejB8+Qt w[oߨ=%!DɎO!%g8Պ^:|DL"8,dʂ#[H?-v}Kڑ7,=N9ɇ z13WakX:vG1u])oV#MԤ&gEsyc=N[KhslOBGp#]s D+sF;0$ 1$P3#)H) 08~pv(6H*V 9r82}pTE13 GXP|!OL ǂ"B8!HZIa9gE=R~@9PBe%K!=|Lw]}ڛj? 2" >)M[38~uY y@$?H~9QpCJ|?3>;# . Jx g˗ 83a%dR69 8Dp-aSP%ћKi+X B7޹nu)BhFdNxzZͶր1[zzf=DDg^ZZ\L-+3FKj++7 R41u*aq">Tݿ}n&mvOiPWզ+4+1 ?Gbb9h%jY*ホ'-ԯBTP`<2PXM|)x[# F̬LTRzAaG /Y*"9p1x; iXd$(1yBLaI8 k*8uI Z5C8F n!?1iJe}:Ig`:A}цeCRsz1G.'gxAZ p4CQ8Lt0A!DC:5ۚoo.-#b ++ gO>Qzj(- QǖB_o`hg@HAcKITHR U=e! nj*QJ߁ˎ~NR_^je`hEH+Q S0G2S"eCè~y8VqDn*6sXD-"\s>Xt&D{a,$.ЖuTW\?Q)*(rĦӶUC?zP-P!j[dF8[H-!d1+_+Tt3]kmt]NN $DFm<{}-Z%ҍp PxF8`!T C1:&БS Aq 2L *}7jk8 : PJ* pHyGCnTjRr@hΙiu 8bOiEe_I߁F]Y7֮)%&Ů \4 Y4NX?y 1mJ97}GomQɥ8Ni0 ʠ L#~xdqРA0P☈IwB%c!dĸAT3@GLD{ҐB 2}^80 fuD\0HOtFca?[$O;mo.M&33TY Ed$88E'4jcj*)$^039Emp#1#"8}6ۗ.9~bX(\3YH71U$1 q $i'_#<0jŸf"!.%*R#qOԂncI'qicxڠ`w2 MRz!X'x^=4 $)b CMa kJ^vp%y)yζAPUc= ԛԲL6s 'v=LGtHO[b7#7{62jRmŽ+=VSlr٣bzjNl&0Lh@LIr Ce2:DiDd! eG\2qȜ("_%e0:G9r!8P@PG݅ p샀`xg[1~K]6ut#au&*L>|F %lU݋qEh@ă @4*0)L!' gQ(""002¾@*pp(tL@q5pCHTUGcX A!8ڐ9K䐲8J8Vځ'*⬭Fa#@!2ɀQ4u-ןTpQB4_.XpkZdQUC|| @0/C;87/<ڸCK*,!pY1p#mvqW[Q.G1vlOZ)Ls ITRo<@<+T'9@IT9E/9^[2ekriP*0Ə ZS?컎3>Y֧4hܤ~%K}0T$کSKKJÈjDŽp8EinmΦT =񃃃L 8y/j$9Bd~$0Ռ+8c8S@V#n'Z*u++})3DG1;`\D[ϐ*SLb`` ,* r0K%J $@0Rf1IC <8 9DLI#d8SLt~P|JJLL>88`_6vaDa8)jp@eٗKj'1pW?Q)!(RRG(L1TA#L^9X'@ t&: *<^xsA$s[gT=:I\NW8~/),!_" m2Vq0wAR">0sÞ0`R$gpTA\p 0֬ )#1K>)l8jywԟmN_= L+mjAsS ۣOTOt\Qdq]P2xLZ@&28c1)l%+.&g򁙀JL#<@ CoK? T`L" H8ÂA3A:}&<J RlDW,8q Y$GFˆHZ;D'tDap A0OH49~_þyң !dRJbBu2 TRME2&U ~iɐۛ)Mu/9Q mk a:PpfyUƵĚٙϺ&t X) ֨A Sd$)7cz볚kJyHCӫ=P b8ִޣi~=fEӪv})}[ݡyGrp I4",{~!qѥ+eN4eQNDr8Զu$灏AtmXSk'4iF?W,3sd"yP6*Wd伬 :A.)Fe\s;v,.#:jmYx3 ;u;{v#J3ԖbZ`13sMHixI0wv3No;ޝt[U]L۔2)_jUA-ej89p44c\<{c"BP xO$TO(+G Lp(GUDf)r `j;@k$ȪT(;54rcωŎiLZ Xƺbiʵ*'Tr4^"Q0mZdeĕ,瀚 DEPY˄0>qƒI>tψg8<$f!,K(rNaq¡d8a@In!gH# SJk&>]j<ہkIp J r 2Q&Uz&9Uc4-uVOy+E [ ?EbXl#bUcF r',)$0P)ƶA -ɍGP^e=^`{>o|CԺVTͼ!=՞0VIz|B!Jg1ٖ pG@3Dई9ʭҕsP^!3 i)*:)KL P*<$oydqt]%7Yn/ڶJ_E)0 CYSu^RM]Z¢3u ާ WQJ9jY~M7Z|Ր^I\[R}BŶVKUgQ޵AE_%B4cJqXn ^zRr3tY)n$&6? %HPwh:G_kRYzдFމERkh`A*7%[}tyQV+wS2њ@I Dn{_H:ZG/SVmox4^[@N0a@BTSug㈒&/q$p+H>~8B$H0qp$T*8 `d9IEÐx6~,`՗ 2$A0Z#I^ud2"~m.QU(:lRU G>a5*3cV?JSWӗm؈uG-c6;m:" JԘ 4vTi=  =:`$H+(1&XT P!p%Y3\c0R@8!>8%$D `>sX3۫6æ:je]+h:RHقĥPK%1ҲH窗iiVd" kR eGGG.>AYeX,&MMm$)@ '7Uչ|1]7`H<}`D(@ZCq`Q`g ej`d20'q 8+0{ .G Ҁ@8'C5`8ki !q1g L\,)'Y~$Bh0T=8fy!`9t TZѦ*qv*4K5ԧVshBLG>&-.zL-怭 ~QpV WT?HV埑p62ct<'y *iM)8op%#miE5nSm# |<0]WAtJ3ǴÛz Rnk -8 L5*&UJؼ~P UVWQ346L9(̶75=omm }So{Í:%k\OrįiS@ f=#<@6 ~1v\߸BAMoEhL&eÆ'8|H㗷"Z+xB矷!7=<`'&yv quz /+YdpŠ€0xlKx7EUenC*Z&&u-IRCŻjX.ٙIc^zr5:mV'#X&e [B< m:XN6Iԥ! 2H0劾鼶эոa>%~qtzw~aQ+URPjafZs6dŜTNB[K $).a%p:%عmb焙IkmV$4OZY3I7UuԷwU ƎM͠'52GJU3?soQFx.lfFPVKÇn1y=aԖqkXt_d14$zmgpV6%9$Z(U<FkY9N+lk*++o{&i\8 faXq:íME*I*̨"$f}eO),#)jL`r>ю*vDQNi<xq0}9+0*k.R/*(Ǚ2L #νCR ˿S3E,$< śJ_wT]_~0+-Z!Yh1d?V#mn58lVڝmYP֑=ìɘHRHÇ&E ߸6f)A$ @*qlY9T" <}CXPu|\+0!V\|Q (K->`an2'QO}F1\\aJ)إɀRʒ8āwzx!J0L%D!NYyg焋8dP$9LJ92* (6ʔ@LN-U/ @x% ZT['ሉ8I q ?ҁ:Nq ]K#1fJݕO JF\eAF0 YVmmcQ-sH# XB]̡ )Krryt0LʲNsFq(weDS@hZfa>BԐ(T\A-$D0:a7< m&:x8M* BI:QM\M: PJ>67Uqqi wpſQMqip.0yHz<Y4zҾ{?%+_C?Xl|Dk&|8(sgSTk5ƨt%'-HjMJZm R 3Ĝ7ULĦӵ[mVLhc0+Ǿ `2A"@ȁpb⺜H[@yn/ۇl=1 '9a#)%&9N1h-'Rbrї1@je理+»-&Xqi%1lDB*9G,*pV7笾ͶX?KB)?ZݺL/KDCl&(O@EUՌxΉpUfuC2O%\k#ݟǧ鎝pÇ 3įásjPB@TmI#+jע9Q^yglpٟL㌤rX~Zs#DIDԣ~H@^*0 vݮ(x?\vNʰj-{n|̀SonMkVqQ]NW6Ds #q`cE͸9w:z`i5uB"MjCn )hOIB^J~oՆ4 ZH ہ7vM)%)9٨?Aj&o}(wͷ~bLSPn?i5`xbct[]{0F!ArDM;viT IT`ִ̉ k}Zk2^fR:IPe*p&d[Jٴg뚢pƷil}^yv( FŢeĢ$-~⛭2tTͭ*tS (f:JSKr$⹬Q6_sѧZk+G]3e_n')J筇1+e 7 Q)+(i-^z"Ǐb[nu<շuCmPe(&, BH|BD qTc7X@W$3'"r29 eM4Xu=@'1Æb?lmAceid9i BQ  $*T6ݨL % "6 -"a[R|V %<&);fmIfYH׷% jLA12牑9'B&zyԶt 0M$ѳ4e$XR&0Ҁ>q&>ml6t i{`!s/tS##-rnN39qp %Դd @gIRR顏6y#p0be DGRL! qĭp1< HBADr$թ2JTF|≯`ljaut`A.z[p # Ns`,gR'Rb$v XRcȈe@gib\X56TUb`r)a'0IaVh -$Di0G<0mDK!g:Z 38 OeDGI& q0yIMƕkU6IuI)uB X#H&8"8C:ƣ鴁{(ۯ.R6JFJ̥,IdRiĝ+u]:H4ŵ<]ظ,Kwܴwux>Y'CH1gWuAEd+z۝PhU{~H<`y Aֱ6m?p7:j6GC08<`O- `jIYxG*Ǩ=Yʱų"!Ô(3Z PߋKy(Tj}"SQ<ѕ&Zy)ρ=>@T`hSq2}7Y˅7X_ .N˟9a9D[|c> #˚8)(([}BO݌2 $TIS98V:.zZsTY\& 4'KL PDz˗,sLB* PrqNR]TJu)&&*Wb;{Ϯcke`lF5H^U%30/9*Oxh4NVOZԫ`$sg9n#A8[Pm6ώig=Y Ox8p:L,@0\0!1ڨJۭۚa5PR [+V@CƑѵ^O;ַalmkq(r4UbxfRYLH aje3h$@Ds+ =GIM$P&7)?(MJ5p, *0'(j~>~~Ӫтi_ۦ*eL\kO"I 8x;O;nrţ(%ыN+'z~usO!D:Txʼn_yfjTz܉YmYQ_cvF6CfnZ{rڥ֙ۚNa^T#\O![GO߹Z41;I,: &bZ X˯KU\n%Q1$A0" qQV.aFEJ\Òl䤸"|0[ Jh\AO8rO$,-tsa_q[*hNP @+(۶o~=a uhbECH Ğgr -lIlnPvԗڨ8k|G64iumMiL**C/Ԡ`V2H'Qq׍kTnW]Jkq ?Oof6֡*B(U\RK8nnN͹wPWZiaAmUfxhp\xbdۛMA:jox}-soP8>˹ *'!V_@q:UpMI^ǒ#AG1ZÈ5c+\•i**<g>gs: aG€S~eQikm0N!-j*P X:vu a>ֶ Bti#3k] NPNU Ŏ"J3O|b[Vu3=.fCN0B1Xgk}r[bܑlF\Ɉ1tm])Asն4Wi1w (i(d2V.jVP9+{0A(%@[ .؉^zFq.+LDspi ``Rp$etD AN=bV'3XMR \dJ '/Œ20C0#( |B"K8Q 0"}!`Y̐f=4̜ )E/SֳϭaM*[%’Gx*ak+qBX2u؄,zĤr0G4cIlE_"{òvި[ *e '>|+D'/BKn嵤(H)LZD$*Zs{Vyd{3ku mTfRcsd hQxLxZUJN\@*R5'ByKHBN#F0kl $NijwD"z:rp\ANiƉ7">zMjG/b(FyP<]9J=m>q6 CL9AvũV " osPe8|b?lޔ"תiW!` Ng5X O3W j]|_nfxr%=+0} VAma0F.BnYv2PΦIAwazZgq꾙ږUJ!kkV?۩ ^m{ђ:洗>6*t@P1`u rѪU,I9'6K~ZPkw謠x>ferv$CzWFnϵ?D<:Yih" [X$X}ɴ\*UO`)}ϯTeA *\4&& Zt@]K?:Vl&KVia uىq _[s#DaIs0?z#UEBBNLcEé6 Ꟑ?oʍ˾8 ʩ]l˪I1ARRKJL ̜uuCΚ!?}G=;moӶ𫩝,Tq""{5mVwuf]ǚ3j56z?0e(JWPxT6Qh'vTF*BDbBޘn4.ōuꍫvv|?YD2=v+jHn~Wj&V'i֔0A1<9KZ]S3/({Ɲ޶USn_¿$e uШhؖSsUЗPu|PĥN}{7M pbWqlj $S ?ģ9{jN=[ڄ6e_h$KkL! yG=Rl]hpK?aoDni/z~ʡ|JqE*;S_[OS&&3t`I(x@ⱻ3(hq1M=p㥠0̱%h J@zC+p!1,`7xQr{"݊fFj' i]'i5:]_n8$N]*N1:F?Zg grQ',I)Է ! Y:i$.FD}˜P1qkQDCDD(^4#W/vdD!@X[3ovR/O~Wzń}unwŶnhָDgl8c%i`^kQ A UGXHYcΔ ̖E\p"a,!*Z H8G`^c 6,@ˌp.0HmkJN~|s8@iH3)!'(340,M AT >P8惜(єzYMD)D}!pTT[gg,,k4]ՓrSh t8{3h %ʊB~XydΘ%Jls<&ss [s>%N>EY;zJY! 98qYHGbֵpZ,c>zXov;E:aQFpHR"DHϗ T=->B mTI0'P8;:p*I>`%9lU-Sjqy•ZiKSy- d2bt釙  b3 p#"SԔꠑ I(Q1 Ll$H$g^tJ'Cܫ2IT.`FZFYCsގ+]7Pm*M il "&<*H,Y$I[!q\S- R r|!`'όc)-qa<:E]m!طiK>j_NꯝP~p7> ]ďUO**qZ_cI.GZ$c:A i.PZ+#9]l0l) W)AL?/&fI[@9jMtju4<:z*4eIg9G8u/ȺCz8~p7ī"KN%)HP#6\t(,AP@ゎQ+M @RoM e)Lu&"f8R>1x'5I'U3?8}Eŕv)y˹g%}R̳b3 ozKTm45gJ%IITb4&qa)6Lչk#}Lfmlv[zÚXF3ðq*V &geFZ~YP9)Aj>SewVw ί baԛN?p-Rbu4I n"' Lf]ӬKe@:S T&'axq^wWwlZR#h6nmp:q Ãpml;V2ۙ )̃)\өZRsH+BOTZOfZ{FRߩmNZ՚jTŨIER 6ݛMO[iDOENJ\^1CH aFؽ>ISHXG xkv;nQ~r>US@«{fm4Zqs&0ᆷ>o4µ4@pbKl?ܩVM Z5G{Ě(@"W7h[ !{D6}r\JIwOQ8b@明Xmz>?~`pwqV6/pݸGTsj;D6Kme;?Lm},:GzyB H9Gm{Թ{xftTPWm4H3Fs 0Z >)QƐS* !Q0Vc`YӲvyT'=;f[QB]T# pPpT.9$Hm:Svl&jTZ]4RL6ڹ6 V=+JSg0xt @"Unj3NV܊YJcuW2ѭ,zCaꪕN4;R,Ze0Ja0Q2{jWJbzgF€׌ePχg 0P ԒH1Ak*'L ~FZ.@ R;Y0J@10IKr w}D4R@v9#.$"DD&{E5FE dž\ &!9ͷ|nǐRhK(Ho 9= *LJ!M@PR'@q`w45GD&rY!JQ`{¹&2R~ 8$k^*.ᛞiFJWID{` K߄|gFrҶ X|Dv0N/n2z2 -Q <RII:BO@7vX$pZ qr]eR9pل*.+|I4!*]dkFe99ՆB27ו.jTq$'.!*T+Q XhBYi$WSj f^'g (I^R\i ̉R$ HPiҠce@:Y- T:i _A){?gey ckfL2N5]9aԣX40u?_kB~sTz7^EկE(-!)> ̂8xx2'(2mؚ@TҠHRT A0):=k VXp-E;Iy2~֝Bnu=)[&!<Ųp)}PTOyޙug:BH;)[LMBq]K.,ZO,9z;MSE1OYvVq8$p^F)B3ͿM*Rm ꖠhq'$oͭͺ(_ϲ*3uo:Λ cM: hsx m11c_rʦ#r-:=+YdϜZ)$F)MMm6IkjM#[&Sj׶=y!@5FQ^޷=.&[r'禬uS?o9$ę}(hDGXrh}M Rx\ZokfZH,@cjmKcolڍm랄QVaH@q<8a-ۅZ؄c}4-n6v5P H*"Sp@6m&ݩNFr\miP$JTbiw Pҫ~ֽ Vʥf(xCCUWo9÷=/2<]nCp8cdZ6UEVj1O.b+hTcq b7M(}ۛh]Nj4FJ_JmN`."1$buX|LTk|uZfH̡9!o.܋݊%U2SrfViPLT cRy>6;; 72}k6H 7d>#:~eŃXmޯƺĻ#Gʓһ}y"RU7b[ )>Ng@up"9D͝#Nnỽ:K+GmU O a1&-η.FgNyqjҎ8e}xANS>Jvi_iGti/pe xS u*0ĩ4 ]55j|5sX9F 8AMNqK !5mM&:4 \ez& ͺnuLcP/,Sͷ4Ңۈ90sIM$nޛXҮҺ zb",2CiL!XPjF;=@s' b.84\EB«JKid%\@ _Iq@e7 Mh%E&+3,&5Hx ;2KO0g⬠>]ZsĞ'wS&'1LN2Tꋂ( /pƜ')J @DO3Bŷ۬IUf=O2`%Gߊ[if-?^X/6[ rϞ\q{S}F>xuYu.˂3&.b-&ʎ8G>IT;V@D.)lGH?`%6|>PXec#ك/pGnAT 7NaO-q0%s1`fBF9J+AwMa,|r^'P}It'{y>Vl&YcҬA0tQ`Y?J]z!#zԓ<G#LDN4X+dZ$#K@dt(rs2:#Itil4MF)'Us϶|L2p=X?ˮI=KZ^fn٩qA+B#-Bck,jEg?W?vuN2%LZT۞&r]+UF'a}vԸ6 .(N@',^61=qm@$.'u:Nkj}{s] 4$[f$Wm{>՚vK7BA(@#xb?zﷳjO^r\bK;Ӫgv; Oۏv@qGfb]DѨ*6-+9dTUBTPlGUT@mDbUkR5\-֬Y9z141.&fs o#(G8eu+ײԀ(Ng^BJ <481;׶- \LZ)q*pPD9qVn[]yI&ߧVɵUkuEVړPBxNpdդs{ur8hReF*]'>Aп1m*wH y:}.rGN׽ܟn$h4^qLO6ذ׼rkWϵ ˜tGbkRB"(GC-$yiC~p*Vc9ѹ1 . !QȒHjB+;ΟrJDps F[,g~),Dsc4 "ڿP4|ĥ)#(K:l$rώ prԇ:D@2W  ,Q&'P1'X L}Zb: $T ~,rdliQ"#X3Ohf/39QbTO1:^m #Ø۽8K=޾um@8$*A2Τ#B|=LٕNi q$yB$(scPTR4F@>x#AaQ gXHa!`c@xB82I xL%0Ish0,sׅ+SijQ Q*Y\zse+霸G_[)9[[r @Oz+ӎ4AoRAƮ<7PDy۽vM*-әB]xT'N6I9OSt{46fI[R Qm4RD1gC'ӽ)t4bSq?&&c4 ,#zw"WҨ3i({[MʠԴDQ ~ON3KZ[0'88Zf !ӆbtNQx=%`X;V`A^BC 1TarÒ8f7Q')pi1ɤT%9QW)%!k6O!311.8cYFJ $Bwvvg'$ ""φ5.>֗Px݇! !el_ˏ028Dt9~Y)bC>GY18 ELDH.q}&"1φ ` r]TU.Q0@aJ[rumR /N A.I߀ia6u".ܢ}gS%,!r.0tRzyU*IS pB1PI ya 0/M]V\\xGac!ǔꂈ Ïq%vWmķ8<2LHC@Ta' LA19`A\1O*(RsFca >W>u!AqU3L(:fu0 `tB<;"'P6i;{ԇ[9.}R I $s' k7E: R|r6_MOm'WMmgRtfA+dԝNUڰO74T2Q1Zޚ@ZJ'xbZ'ڿZifcq%3 Ӧ/m_ܮowRnn4(&5Ę/K]AȪ&)u;. m%0L@/+)NA8Lzmzk6r#v[O?Hݫ:.Ztdz-PKnXT@Ůkfuf1$b]G)yo_y߭} RH^@/ԢXǪnl3{]SͥD-,>\J(ĮCj)T?.)˰N(]qRq}MJ8CQ@9[rVm.MldY]'ITKi?يwεJL4YΐmB kUO ްu1wSS_Iķxa&n)SuLq)[,oj~ڣkG@oԊ!2JBHR~J3*Rӈ,:`PuMPH3m_Tu75RB5e%f'+HqTΥJZh/Ԡ|J=!ޏ<s9wcn|}=s"B9eFxj'OrE Mn%-1,Ҧ ևQ4ͺ}Wrj#.|Gu~Cwz􋼰0Bs0dC`2IG`4S"/vOECBUK Ĭ(cF߬C,h$#žy;ߨx |"ϑe-i?3T^YG,F0hH3<a ZDbB}<#r]RHÐG :&Jҹ0ܵ10 '!Dj7S޷W[J1sвs"Km!UBFeFy Vۮܦb/nꭋr+iyB '&ԋ Ϩ]CmKr>JBbb|}ޭh2dĘm`ګ75i@S2TwF`uRRc7IG0Ē}bzfSC>)%J9pE4N,}+nVwݨtn%O(mYFܥ|Rd|_Q۪pwǭ“wkB+Ǹ4 # 4G-$X|?zd`Ʉ€QZ`Jm,*8-JMx!XvIU5-d| J2 {kN(G x&\$DŽxaAPaSGl*`>>n$PT_Qv1uVNpinML .RfaFif*s㋗LnuTxG82vʊ <"z|2)VrCWyY%6eY AWy`DJ1 [ʿ`iOG  -U]Cl6JYQAPXWN6oW̷ԂLtt7^`{jЄQf+䖡VyaaVQ" =oKn96 C3 PG?fk<~0ڵVS}0OD*L|Z~OE2(|iQBILG1#ꍍMTp(¥W#N<p Vc˺%(0,i&)s82@ y{2|hvFa eTC߁cP{!;Pjcb=*i rM:(EgP s@\P FRF5Ϧ FŁ~ ]bV.6ћ7.|D!š-) 9jIi[i y/ AO\tMX~`! AD&c֖{+/ۣPoRirK%Ap IqËus,2s'Lc-&oOr]U:4 "v21.rVi@gAe2wE8QieTuGq-*[=}r3ϑ;[ݝ.\֍d0. # >cx*B]+!l4mj̳ B0I G»=aH]]8)0G&Q ֽKyd6U \%O a#;_dl]4'A,u^vhE:A-guCnVvuI~'H:'w6y쭻9zى~Ħ&.z: !$&=HpE ZWWxCD Dk]ӧwu:N^x2=`#63U/coqZ XQA'x@b)3r |L?(9Q Մl6%v) xjTr5 *G?AmKl4y0T5 :#WG(sO -%y)ÇP 9Bd<JJFcÆ-&MYAPSq:p)ҲIhRyyaӜY(%$rǎ 'R!9 $*Rm)HfMa)ʒQ>8ucInXT2hy@5ܔy$J ~Q꧆moBmu2WIW?]qDVo Î 3sI05 9eq1ay` B!T*+6 4vB A&)#;]- Mb:ٵsX!u-'nvm˷;p>q#֨-ĩ* #,Uk믵tS ?Sr#cæo{&sr5GOT!Uo\iuJZejx򆦒H@ ҟL#vֵE'Ri*B*b3MEXo)]kKZKW6ZS&Jŭ`m{6\zNlFf›eF:IH@n;ӯ-ӨgOM͝M6w #O:`*$l+.mɥh\傢'*D~f ~߾Cl twN*-#)f ݝԭpeHjQ r(- O^=F}otdNKEwj7J ]J5rFCY#sՉ(rON55CJ=&*븅CIq̈Rqge߶<4Oya=aYccn(ǁ=D PRPA*X.xԫ8KK+L/;(X9 Y-G]vfE]AYr?U?{!vnL_ryeLۀm 0H\0\2 \{|"g7-=f}544PQ &qYO( EǺ'n7q<}PN4;;W>]4,xߪ:fmcnzB|* C卸m8L6! $dFPa7m4MVf+]G^揕PQ`jTW0ӔjӫJ㏞ɌWC:SJܖ$C^2tV$E.,A*fY+$p~Èb݇eSZ!C],ؘZ ADG<я:T{zU!Y-De0֣^Ȉo-*jh&<Ҝ`ᆻq<c`1֠2]!2 De}Pqooo//L-.1:8+LO::ڸq)<}0+Gts8#pXYs3 ˖  .*+Ac`AyKWX..DwvZ12޴J\':qcʥWtJS 6ߕHLϰVġ0Gg}Mm,'iտpW:AV%mZ2F{YCH1LOr8@|˪ʃn3g0CS)%Dpm }mfV~=ѣzkW"0Yl GIN卟ivd2bQ6`'JC8kVꄗ;^E-(`F}38T )1>j^]C jP'1 AIYJH9W P&=Ǻ\IH1TN~9~PfV1)$B$0۶ HmVYyf=xCW1 P? Mf^PɖRF8{Y)E{:Ǧ^ݔM;!DŽQ\u)nRQi*'F VIE*>Xlmi@Q<#xN*W1O:EX}Rwef][_.&ilJZB"I0@q.SܪtNp33ʑ_p~Y>/GEV`K4',,6}Bn*)YvMI&&6ԥsJ8eiƨJM$ISPf P1Ӱ~0=x˥~\~iĜ@rCko':TDTjCa*kW0%0BSBg\G%A !FhjSt4M榑0 +uhsBBL" 6 ۦ iE"]O[# 1O!T0 L}UV}R6NXF#=5mgsRQҝɏDeQrq8)U+&E&j՚]=|ΐJ Br# [^_k{E6ID1xv*5ӿin]73-lPFܗ]rEøh KI).G v6t.[NҦ>L]n-*5Ah%) ]9=oY]GZ'K0 l} AX^mMmv~.jqD=~_k.5\Qv9d vnmqnBEk^ORխ l$ N"8[poh :N8H])=9n0Mc*UWA^~yNWwZj̲ViI@!(FqRFhgId#+>7;&nKӐ J2Ĉ|عݻbq zEbI)B.A#F^fhiivQdrﯷꎯl ȡ%TlY[MQ\vTJҦW$MO;:at4Ńp蟾'+ܾޥ5}fCS35Ә + ²- PYj^) 1:DۋϺn4 91#ޡ7϶mj]AdP̘YgYMH"F]7*H-4xkԢbx+L|%R`R,N⥟ݗSB¯ 7e*8d֦݂OH>јeDUk1WR nj^$G]Hq2=QB$"q3ߕU*$ˢPA1 ~[f?Scujb D<)P8h"E#eJXAc,|IPe*F-Y%KT^1"emQ|s #Ϟ :c/o#rNX=e..# uekzje)+uU0Vd=4Z mµ@qq-'\Dsþq3mzA'2JHX⑴ƌBXL9d>yc ޝPzb*-BP8~3̑RT2"$A.D €B%8,%Q(uqr8$: jp`QB38LAz.ʶPO$j"X5 Ph^j Vuxy=£X8[la\*RHlV-Ƽ!+XA'O,X Dq ~r˞9i Ds jGmzY%iM8ڡ(AAH nSu*ZAD2ZV iӕ)/%$Sea @mypW@Oo>>ʍm u\+ 4*tf] D=IW >LkPrHrlD"1u ^@0 e/3ԙ&d1V PZ]48B% M@0@1.sXV$K55QD+yhm $xa*sƅ.(̜}oaoRⳃiis BE̼Aq?4|O,l[,(i!*95.1P*f.&-騤&Q0%7ZL-Jm2Hn'%\I1z=FTF靗%:LP)v%p'131{]fr)Eԡd}"0 BW D ޴f_ I@^H'(5mUӫ.ʦZI"%*09'DӲ} Fa~t"ZNz`P,ّ8mOUBO"MnraIϙu_p*ȳ.E1)_BTko5&4NBTR"Rs%HÒhnghsR:PG( DT-sbT &oZb:rP(H `g>G_=HG_R$HeĀ~(1^Z8 u 0S b;iW1"#߂c 1U`Ɣp@8C<1r0  +hajx\pGKV늉1BʹI1DǞ[QsL?t-J NK\ b;l^Dl? Yy 4#-Nk* f,1鞢[]wګVc1>N}bz(3W}dtsA*B Um۳er򝟐Y {v횈$ y&F1.pUPݪ}ԪkTyҒIb+H94d}ߦ]w(Y 4Or)\@4`!SR&U7ǭ SSRD(0##J:Vw>XU+Fx'iJ mYUgS*ɵG0{"]n{qtX[$/۱s'TĒbkeF*F8a5wC^`\I2yDH2H;g6Y8@.+ܱ?o>fv$HvJZ7ȓZ,Q$a 0{FN^y1nufY^R~p .@@qާi8Is[r&BQb?]}Gqhm*TkZ*8wG=kMӨja}&ʪAB1ͧ]ۣ rr.%B)Ng11bU~ފyi0gkQN<*Tj-jȦ_n嵙(AHLbTr*oTJ5蝣qnE^4dc$]Y%6OSn$(1N7OKD1ޝ[YЩ.hx6BNZ%)<qG63&|?N6i}ÂԮUH;!bT IixG~ҍI=)DJ*_010wAl"¹9}BO!pQ3ef߹(X DUy-Hb|IW39c@* {*+f~$'qJ􌡍 tXǓj8/iqh:PJ8\S]6 uϊ8ߤ46iR%i 18cvXNݴ;6cH" ֔D$$Z6pg!;8-A)1JNg'.3B"+$D,(qA#JP ^`x42VRĻ(A:Issp[jg:oU=EfZPq$Sy d>p]އ'rC*Q!a +b*8xAu`tL,pr`eig\]r.&OLYheAs8` L(|Nd$8)odJD8=ڡ" mA+%0(9Y 8!7 s H>f8ŒH34mq@]q%\ApR2iǺ[2+ش?.X&<ؗ\ I[n4֐J#FQa{Tq DVֻqQ+lTt`fT2.O5R$ [n1eU!DtJ=8,SaI(:1VQ<-H+ԅy[SEI5"kNT_0+TJG?nئ+I[WӒ)22+s0q\YMW `rﯷi.ٻ›n~՟AmymҟQ=E B#.`~18De81301`"yt@@p Iu8Lc88`5s=" >`AJ80(5C$J 9~* ml.KPyUq11]54*۫#@.+2e1d龅:oi;u@GYKJx!ΒLm3 P}/LRBRPծ\Jq!}RZ" h2ՈNZnNi6֒iNCc߮NUg{OnTSA3=E#WSD NIqt I0 9ǟ:o`ܺ*ml_h8P+9˱JDr{6-%$Nm 1.CmK  @8]-q0{)qzfҗlۭ:XdJHmW!ˊY+;]yS,6o2Hs$6Ъ(76\wm;Z [ )\Fj#SE7\yިMJњ*E74QL r<\qZU k|D}F߳o5,jM&|8snKnյ<cTa= h[UE\p=zq,0ad_'eAvڥIQ%0*O2Ls8GҷuO5W;);OL!"g>qi%}u 4+eYpIR(q9PԲө&|8.vvoZ0 x]$E(eiҷ}JwOtwnV.}G& wKY <0W?mkJ1BHLbx p s0@2q3ZLS r#8[J@@`8+!C1ۥ Ҩ#B AH~. [(G7v2L&U iFjOY*_.F':nֽ$IJ1\{JTi()fUe ffaK(\ *) R\?zಕ@'8u ypP I _n"nI4n)R c>8YI9.X#/kYX&^yQt'-&"HϺ$\1V'MtTfNq!h$̥ NE><+YL~omR,5;X13KHe B@JP 8aT\[۠q7-eX)ʃun@eThn7 moW+D%y-$I5 m 4],)j2֥3bGp!/3Vk/R+%>aEQf!c<)o%j@a# .<#$ /Y:9x(=3@&~vj3\!mry`DF8(341itL*~ t ,`IYln)n7#PeL'[;ESjV`I*I_åJe xb[n~X=ֶN3ؤf}]G-mY[M&# hhN(E@.И&Uuj&KR!jSQ+!!_tmТZ)Egl}?;q}?JvM Gf")2OdXZ[. SDYP='?0ˉ,ǴYC:ʭ?ڭ#8 n^ 5HMәM:Y_}O*wT4>ҬPiF;~kY,X R݈OymUi.K(nU @q8`LZ1lKmwsjJi#<8g|sNleVSBQ=ษ>)u=3 Q^0T!r۫ g§GO*nڕnHi:jDJX 8EvVңץcFtGڬL&pտpP(h[. /  VlʎPaRWm#b&`&1A2 1u"UyWi΀Rbjss$/hQx *#HW }KEe8emLմJ#|j!9 _P刉VmEUpSm`:)* 2pr\S#2ˎ -JTLlI%pPa>S$*HrJ j CH d pJ8J(:Wc~ VI L FrLa|cC$yl6OU(B8  }Bz۞6q eIpaYwRU\DÇ0P ][Zd94WYa'ۚny3)q9s' ViW4jXǟz{&k 0i+&UwT[ۛ2Sꨩ.ZI[R LRsQe'4N$/,jnzY"pS Rg}<ڛX=E#DΜKFsrM]of"W[ˁD˟%)z? xJ;N[:Z%Q3|/(=qc.ņD )KnSX?;^IT G-,@c^tEz fG(oqNꀩ-`$ʎMU*B"7q7MK[S3ZGK#@Zĕ *#ݓ_;5\;UaԶwAg6X5֪=ʸ5CR%-;h쭛&b3 8^)Rt1 MkkR]/nz]hK&z%5&&Y{J̻/vmBW7&ҥ(;,0S?2\%*qӶ֞kkH;@pաrMTUݕ]T':v҂ ["bOppx.\c5S흸)sC?ےDRXvxHW9ZIbBO6q8NƤ08Uk05La15@Nr+aʕ{Z5&TcbU!YaڗX1q(:Ҟ{Zsd̀ H~v$ y0eI  3 S2쉽 5Q$Aja批-4#:HPuC{`ej~蒸H]qטr+'[l{@ 2] w֪C+3r-(BU' 3u\b+}— `NW\kr\h-l6!@_Lol*:zmqG8+Цi1]U_7wZ٦ft84?>PyV?tb}S-/ l.JKff[ %N yCQNҽRq<}-@sFX j7:X%陖Pړ**Nyq´쪸 +a[m ϹfqDCS)9*QZb#?p c0osJsqD̶ei^Y8@ K4Qׯ6:xB: d9Î" ARWh%9RVDq-ꉄk0㻠Ei:URSWGL7ocWԫ[/+Y\Vu!(PwjD</0Z+g5ͻ[j@ ؉@ (xeHS/ӌSAȜn3 x(cÈYOI8:@\eVxpL'^=j[W. F)"\@̓0kN勇Vm*x3={"zvKP)H$C1PpB)TDb{&aZP2GRmtOCsuyD@UTzcjku=2JK$IR$1B 5TUL϶&ĽD+}NBu8BA$ֶu6(?.1՝QamKץ6rRFC9kۚJҴKm.L-) ^Nν csimg"1ϻd|ꎤmڦvPM1KGjֵiR|: 8IF< _m=H1`?(K]eÉYyVtIeZh*pk>a$ # U*n2͔rQe$ny'ٖlഘgv5g9+tLz- mIa7BJ,)gURdf}H)Lg%*I[ 4<$ "ƖcC{RwolSunR*i  <'-T-ۀIB[Y0V>$Z nqb(܇^Z5b<@jՍR%% }oHT=nI W.HFآng>Zd(RAdJR(a 2d@Юssu. qH0 X|yC ^jj׬UK:A! >,phԉ4[Ijb7s_8G!ڌslk`R#!<f:qH# H=)Npe &#C4 K@QRy 3#HyrcTm@+,`( V̟فI@ l) .%G,>x!L` Q|< 5!E7WݚH'rmT7dQQʩFm?qzau\QխhÛB RjDWغEB[BTC(i'Q Z}(\ 9)o$^ cۅw?*\XCҘCNm6n7|I3R䀛4Ҙզ !'<p8/Ԩ-^YE/#. qXԽNVQGݤא< H[tZy49ZݩԦ,]UI]=ޒBA(C('-jmg88enVZ͔]M$" $9LvEje?176TXԦß8 "apk45@. s8hjvP(K7ԥNQq\UuGI* ?Y T$GHRRq`Xn 8殙ZW TFG L-̮tD%е1Dx f8wOqN3.WJ eΚjJHd7;MpjEehyu]$ ]d%uڴ'i|]JiNTR:ZZh46NeJ8p͚Ͷq kv7ΣwI8x$%9K(Ӈf)fVVqdg[(˄FۗuGx*T#0IO>*`xOG=5"[Jtt&^fm)LÒJbrVYaB?O0bB.Fbb~b-;@TܔJu(zb]ґ*1)/qp"NM7xI!JfD9%i\zJ[aW:.fPH\H 95kVʣEfUE }6ǗXW}:D QgmGmm&jujl)-[ VP8htu 00P#zmvmfe)ǔbs UW)(!Mĺkץ) IuǦE2VP aw5:[kZH.j9b,:"@hH1OŜ3'  C R|*u@,_sJj/ZUm"@:t"TfnRS8uYZKRIjŶeqaZN@2t Qe/ z4PBRB:4T 40<7F:M&CFh1q{MGx%ܐ1?ٝ$W=6:ʵ)F?PfK%L|cދZݠ p Ĩf~ 2@*$މ#?TfJiiT s.NP;zeֵI81\,ťm}ϡێa(]TeI =Ba sWgOeQ Q<7 1~zSPi r|B ĥf)Yݘai È <8E!{byv鲕u$>B$G? 9$p0T57҆Vm(u>#g( MJѼ6쩗)t9@XYU$ C Fs%rJ犺td)yiJR!:`jlomt35ChrNʺZZ:e$r^Η)y'TEG%sg]Ri+nM?-$BepK((A|b>j+h'eH#nt>(m}!E-"uSrT!3uNU0JdĶu{ n`G(9Lƚ'liU0E1ayb*DY4wFܪaQW]*7&B2a~m B( %55 zM>1U>ړگv+;-P'eEb;*.),'J`xhShQ5`C˗]F7Z#ρ&JYaAc`\|KvyȳVeBzkzDe&kʌD awcu^KB⩋@8m~mкQ2j[01 yxbo׬mP8K~JzoU;S7990 =;Lfz6:Y+"# nݺkynum*|xbxX9< ĢxoqΰSJOH]TG1oc^ʻmke#QoSu>Wu9Y-7k #3lPivR[*&%'Jzc^KD"E|1'aTf 3m{=L5oA"D:2#h"ܷW'v^Ε!(j PVB+0&ytDi1:eB9qfp.j·.AiAT-z,1!7K{]!j*׊\1_7Jomij64㤳Tݑ! #(oN:[TdBe/0:3>1tS˩031 'nѱ~ZRB(xUu/T"<R+P4=EGs‡8TDfc 2 >#]!}Vas[i JRU(`\e6eßOZ 8qߺ[j%Ձ=9QAe)djQ0u'$Ͼq \ZQald3*Ŗ6O{!ep'yeE3N"xz3am/W%z{l;]_a"eL&IqTڙ0p㊉*QTTĒs8T%؞1疱ۥBGCc E>:TQ\&HQ^Qe(y=- ǦCs/`~%]zÖR]LU8DgO q_mo*jq5Ke&b4=JQ>\N 3jj86Kn/UyjEAl8y`iSx8oy|-hΛ6?vM?kiC4B\)\mQ'M'm+v׼qYTEhSz9IqFg׵'$%2jzq<h{ 9pQ:N[p&J>hTzhf7ט͙#cCf A_yO;듟LĚ]Ts<%dz2P}J4b$Ih e$'j]6@3 P˅r>S1犗K]UrQˬJp&`۷=ϡ]jWd&!R}Pٶ@SM*ak,1*3ecKU.nXڇ`Ha!0f^2mF' 4<` Cݒb%Q K8rHwac F[Nݮwra9p>1aV@'xxbݍB f I$Xh7.?av}2֭ zJ$?d⡟xtMO>Jǝ?Wlvm}]#ij5Mż7^ܛuɻ8L8%$# 5 0xom zD$I̞&$ KH6Krg $W(hIYe0R[3 39 ^#U+.:RVN@‚ke&ښsioC/MH )eb;i ?(lc}nOLMA}q_\ک dS6BnvI\niyX$VS3>{zBց.SMO^QD][Z[~49Q-n4_HV\!EݨH3m+sjQQX$X J-bH%9';rsHAn%>a)!ԭ|@Ӕ8aJjT r.GUTa0p0%H!hZV D0g0/~VnDAS 'Ԥsp O/1];q6`uǖ JCϸ $vQtRT9'H9c (S31 G8w!ܕ6o$@'_(x؉,#El/Ne=(1xaBc )m%)GI%}F rR9):LOU#Aw`)3z)J%=B"Nj4,&7*e4H /Bd8u֒}C,9A?2mRF]0A(x9cFacy~`D??CT3a] { [s])+\ј*dφ,;eCwnlQM368ΥգeQC`ډJ^}}n-Qn5U,m55"jM4d8q1q@R9 Lmە2ښܺGVG Fi֝[ֺ/E=EFyM@5yNg "aU({Gp\gpgy"-!҈$ z4EH}oDT^\w}J[SVҵ]F9 Y B[Z.inV4CIRPIH&'8~eͽm\{Trkݷ{V. Ȍh|Im~G,ۅAc4,?pB9q^. e ."S[ƽѻ7On;6Ʉiy=>qB,B,YpYڞTnʔ+R }fbø2Ε} ߥSbyamһP_oOZ|肘q*O|Dh?`moM]&Q[iP9 ZĊgE@I}cct7Q7{U h3'rJMnΪeP'ɘ-Y> blfƣHZS-1+@<25s""=deE* 8@pN(bNsERX\PDu\U2ҕB'4̸K.8,e+r M^NC2G t,FBNTZu 4A1 O^qiH3\شoVc.V 06\p7Orx܆ie_,AIJ>I1)K8efK;--UI7TP<Ȃ,GϔJUqkI"cX7Ai+gIdМJR x/KN1 Nt{qfw?CZԓ()E` yƿVw˶%lMQ.KLm>+5)aM0CZ+VhpRah~ڪ{3ě BV熷4Pq\[bg7FuJʥ`Tc.y1s{dgRDKp~6fp "~&aΔG `e eՑD>d8g]-.yqQQ[Ql"EO%B`!*<4zv/'>yuO#XhLЍ4,1. abw]z64JY4G8b=&H8ĊߔXЛ̒5@%A\>~UMQl$(=]C?M 1}{ ˎy'kɤP) mPB|KWl(Qz!)g2y8/.nj]<ԯTOrЫ4ѥiH*`r1!LV8 j1c#Vf:IIC3;*OH%``8FI! @ؽ񾜢NIKJ)ܔ\P1ԯT}rA3~KŨxm]!3Ԁ :lG5})ZC=ΪZA8#_;;MM_&̻l2BPRF@' #mmXLl^S ^ʟul63'%V9d-$T9gş򀅈H)Gi5>CPXF ,4bYZ)qc0|0ՠ}P #mgVىkQ+0z]0A0 00ÊT*Z,E}?za!K>8Hp6Zٌzޣ  #%XpFr%4IrT tJ3OEG`3BŽ8e灎ѥTn.%ZJDWc( %$6p.)Ȭ&].ͥT1Z@FT4PP.1}ۨݶɗ!J6MKRxq8\TV֤ >xlbraQbǑ+3X2A%:r$GB T}Q9GV 3 d姥B}2k- P>DaJos҄֍ջVno0q[*s?5UP;nԔ?N+™" [/s7#OP7;m,t];AS"QI8Pɷ;3?rԻSOMz1ԑ$ʜN$M2EqٙpKnҞTNT;0HCfSQf칩ݹڢfi&R.R@R9bj([?)JaG}`M8 'Hf1SdG1Z|.r+#w0*RhmVI{J=MDEoMqʌlmLJJ˰S0W2ykjTN(i *md[{̨O3S -]Q뒆nTje2JsE~X_q |sjD>fnf0 |#VpRX$7ە'10J*n&DV|юPWBҗ-3?Em0:A\a+84ļꅂR>CEI&eEqttd aV9Z "WBuO*)RҠt$q%{#+qooRF_ KPA$Ji[~zLD8hb>Zᄅ JKS4AP ̯,8ur@d%j+)|?8bmW枋#A$ PÛ /ܛquN$Sgn* RD7¥C$@v.*BgY zx%C=2*yѺtԪPU?2 RJF$g`ۉJd}+@B{5xV7&VO`) Rc"<0L?LrbFQZwb>2ՉR  ۋqFQcRyfaDg .AZI"DtZZߘ^)K'#ω{ m94Ivn[\G$yKHJR ba Jǿl(Se69 :,ֵ^Дď,j†҂y0*'3yE0ڋs3AIhr(LQ}D==tij1WA:2M @9'݋|jAM\!=KcX>MӐL(PoܝSooWwYp.7%s.i3N6j̟O2W{Rnܯ3&7&7 9R 9D 1I"r׻} A24Z\CJIJ"g8U1"47ڒv~+PrT$Wfi6+Q)Q+[)Ȉ;)C۟ki;gJ&)e<>UNB8I*װk-ܵ䉵Eܹ1D%8ڎ{4THT(kIK3(TDYZQґÎŴ\լAqsy{ʕ&i q<^yξi=D򺺐>ߩô,n5Ƶ(:T]0OGxY S3?-LX p#Z\6y#7QQuytgg%IKJBҡF1h, ܨeLx{*1 *#qC<Ցl&Z\?:MS%s!u#iЀ˖$h4@4 5J'v1M}?7=ϠQՍMOsZV#Hbp\ircDa%ATZ1-#3 >j}3ؙۊ闌/EbG5BӔpMH$*JIZt 8R)3\ DIL\bFӡ jlj)]AD$ x *a@)rQL+4r!ACT o+0U}UZ uF&jUGҤNJ+  ;E]2DD!zI X:|ԭ= !-C<:l+soї۫U F *pzDpV)"s֪?Q$P&gB%Om |ПDLg:zPPq#i>rH77OQa~CW8W7)ỵ_ax}3'9q -;:7 >:}_>||0VQ;b~M_Cn~gL~-#T#<0R:%inѫW+Q'8,ߒ{:(CqoԡQ 4 y=o_#z/X8O/F0qgpUS\GGţW8M,t!&A$V|ھNFՇ^>pN@z/Lt|?〦 0Elu;?&kGGzgtzk+qnʼnM:i N0ӧϭHOO#'#NrF P֎Վ~[ݵ·aG(ag*jb̺kz.csċɒ~1uyN0+SEu:Z u-_k<5A_d|kOGCpV~"ߪp *Wժ*ժ?Ch =OF98SE/X-N#Tդ,6v}0~qtCVk]e jbZF1O,`OG(!t`CD:gr2t8/'tlWC:D1)OFWkӌDY.M,2X634 PH?c?': xGݞ&k>jQ#a'گUD8{Rj).|~g]~5^qdžSߑV(Nˏ˖MuWZ57R_>_[}NB{|ß9?P e~#y_sXfzv.khV|!,<֌T\WF扖 gYWCVíXZh|U>zѣG\r#O4VSW;]}ft8؆v╴`թ!t.qO _̿:1>.GWN'=~v_-NHR/+}~3\ G|cubuntu-settings-components-0.7+16.04.20160321.1/tests/artwork/electric.jpg0000644000015600001650000063036712674023445026576 0ustar pbuserpbgroup00000000000000ExifII*r(1 2i< ' 'Adobe Photoshop CS5.1 Macintosh2012:12:05 08:00:300221({HH Adobe_CMAdobed            " ?   3!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw5!1AQaq"2B#R3$brCScs4%&5DTdEU6teuFVfv'7GWgw ?ĒI%)Zģk*ƱſKx}/jŎ^A&gn~oIMF( y.CZn+ڡq+Y[_]{\^HcD7~6MAAu{Xּցwm\IMYnKXdzzg|;{DؘզnXƊ}?q Z~X`4h#ounII*Ǥd\%G;lmG>ϥڈԮA)ĭSOtIcWmn:z7UY<lU>${~gV&Eڽÿ >+&&qp k|QRĺĒI%.7DT5R-0 XN[ퟑBl[, @..Y~/sW1~k#?NOD*ʰ589Ms/6eGgq?7 Mؖl{5[nN=E_Τ0 D~oMmls饂[,{eU3QjYi9AB23>M@Z/4 7L!f+[u @;d%@(oī<;UgOTxwwː{NBp`krGˋMq'N_ĒI$6m% 4a5D3C 0tk]1AsJZjgpA;X~!{cGu:kSo=Ǣ܎P//yCꭾ{]}F%:N qj#*c1s*\;Fw+unƿ?i sk'~om C߲_t^e(P2-!˙;5ߡ6oP9e.c\wm[<1gIt#+dbf ɏFs_`䏉Zv+_K[-A#H؍e Ιʶ{9{^]c5B%MYvƶ#qg.Tz oa}浡)vy >j'_6udg!5Dr?}# K>OrYC ̭ӴAnbg#)z3PtVFCK7m?Ku[ZOkqԒI$ML(J(Mt쒒ڷ+BTfիCӳ3f\s%mA|x">U<#ŎZ5j8woC=F8~뿔n򞽚xkD﫡鸶tNVC/7%U>ޝ}=73=?Gף.:OK敥suL 5d۫sC?GG0=>Yw[1!S[o/uK]k_nȺ[c%iYӛSuڿSwX坕zu{ Z@յϤy'R~.wW͒u[(=F`&Ɩc7i}3P?TԖ7ǀ^kef7u79mcS-.9έn{nݵwB 1 'QuP%*[[+Mw*?O۽yH*Q1H 97Yf{Vf1;ۡz]mh@v5ˋꎥmw;r#='o?ԒI$`3m#K\HnPa W* ANVSKe-s6cK;?4 8qO{讫XZِ\?۵(哄nܞ'\|5:]rַ ??-:En` .?1QuF9?QpGfMoаrg򿖫r XeeQy31"=?1i }6sv*4alC-L ^{|fԞ~chn2E_˵t=8~fhs6=G(8#|<1d8M({ޠts9v CV\>pѩ oO۲)B<0ӏpp-?xU/c8Zx*m;U-h!!q=VmwMYbƀ<78ߒo~uɵh4As#Q {h&x07H[Ax A蕷M6+)][D6k-k?1Obf7bk]aW,Z';9c [sGnYK;7esnֿ޷oֿ֯=9s_fmĪIѯzk_PUb6T潂KCs}79෮fֺwEXC5.!jp5;կH P k,DF?g+>ָ݆-lw}+kkXZUA&|WuOybWmk͵{w~H_Z:'Ygx˲cmoZlA7`-4D7^w}Uix |ʻ21BY긍QK'0q1غdU3_\[`md{>~׽߮5=WS,sl|ATXJD] Wͱ\k,܈@ Qhu]m{E.GK.eTٵu>oAnK^˨pȩ=;ϥVO .-ٌ-cm-vYHcl{WzhNksa#ҍlVؘ!^ 05Q uW>'Sr}#nI>DZ FԒO %vkB8@[٧ z+=")!x{9c[w}cuh`x ]XѿäDL('p2lzbX^}G$I3'ʁ:XsXIDO}˲ge[}uu kZ}=`kX?=ޫ #cXyeo7C=允u+s[ؒAtM،kKSt{IebD?cJv?evv0q:Oɤzm|{eB>HqMX_ ;]w -lCyq3kکXuC%N / ]$RI+L\NRyR1$48G1HM1; \4- $W=V_Ho~ވw;~=;= JKqMmqnw4n?r-v=Ť"[t{l}{lhs zo[ylw`II$|ӵA.DkgkO$ az:mNC ;w׮B+ O H 9i~O,=,~ػq02x:O~0mG*NGNM|e0Fq:/pIVXƓTVcc/) 8@I%6JlJdSa쀒JNGw$|TRIs}!gڳNt_JPRM !"Photoshop 3.08BIMZ%GZ%GZ%GZ%GZ%GZ%GZ%GZ%GZ%GZ%GZ%GZ%GZ%GZ%GZ%GZ%GZ%GZ%GZ%GZ%GZ%GZ%GZ%GZ%GZ%GZ%GZ%GZ%GZ%GZ%GZ%GZ%GZ%GZ%G8BIM%V{}Ho=Nv8BIM: printOutputClrSenumClrSRGBCNm TEXTColorMatch RGBInteenumInteAClrprintSixteenBitbool printerNameTEXTEPSON Stylus Pro 38008BIM;printOutputOptionsCptnboolClbrboolRgsMboolCrnCboolCntCboolLblsboolNgtvboolEmlDboolIntrboolBckgObjcRGBCRd doub@oGrn doub@oBl doub@oBrdTUntF#RltBld UntF#RltRsltUntF#Pxl@R vectorDataboolPgPsenumPgPsPgPCLeftUntF#RltTop UntF#RltScl UntF#Prc@Y8BIMHH8BIM&?8BIM x8BIM8BIM 8BIM' 8BIMH/fflff/ff2Z5-8BIMp8BIM@@5S:8BIM8BIMmRichardThompson-Cover-300dpinullboundsObjcRct1Top longLeftlongBtomlongRghtlongslicesVlLsObjcslicesliceIDlonggroupIDlongoriginenum ESliceOrigin autoGeneratedTypeenum ESliceTypeImg boundsObjcRct1Top longLeftlongBtomlongRghtlongurlTEXTnullTEXTMsgeTEXTaltTagTEXTcellTextIsHTMLboolcellTextTEXT horzAlignenumESliceHorzAligndefault vertAlignenumESliceVertAligndefault bgColorTypeenumESliceBGColorTypeNone topOutsetlong leftOutsetlong bottomOutsetlong rightOutsetlong8BIM( ?8BIM8BIM { Adobe_CMAdobed            " ?   3!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw5!1AQaq"2B#R3$brCScs4%&5DTdEU6teuFVfv'7GWgw ?ĒI%)Zģk*ƱſKx}/jŎ^A&gn~oIMF( y.CZn+ڡq+Y[_]{\^HcD7~6MAAu{Xּցwm\IMYnKXdzzg|;{DؘզnXƊ}?q Z~X`4h#ounII*Ǥd\%G;lmG>ϥڈԮA)ĭSOtIcWmn:z7UY<lU>${~gV&Eڽÿ >+&&qp k|QRĺĒI%.7DT5R-0 XN[ퟑBl[, @..Y~/sW1~k#?NOD*ʰ589Ms/6eGgq?7 Mؖl{5[nN=E_Τ0 D~oMmls饂[,{eU3QjYi9AB23>M@Z/4 7L!f+[u @;d%@(oī<;UgOTxwwː{NBp`krGˋMq'N_ĒI$6m% 4a5D3C 0tk]1AsJZjgpA;X~!{cGu:kSo=Ǣ܎P//yCꭾ{]}F%:N qj#*c1s*\;Fw+unƿ?i sk'~om C߲_t^e(P2-!˙;5ߡ6oP9e.c\wm[<1gIt#+dbf ɏFs_`䏉Zv+_K[-A#H؍e Ιʶ{9{^]c5B%MYvƶ#qg.Tz oa}浡)vy >j'_6udg!5Dr?}# K>OrYC ̭ӴAnbg#)z3PtVFCK7m?Ku[ZOkqԒI$ML(J(Mt쒒ڷ+BTfիCӳ3f\s%mA|x">U<#ŎZ5j8woC=F8~뿔n򞽚xkD﫡鸶tNVC/7%U>ޝ}=73=?Gף.:OK敥suL 5d۫sC?GG0=>Yw[1!S[o/uK]k_nȺ[c%iYӛSuڿSwX坕zu{ Z@յϤy'R~.wW͒u[(=F`&Ɩc7i}3P?TԖ7ǀ^kef7u79mcS-.9έn{nݵwB 1 'QuP%*[[+Mw*?O۽yH*Q1H 97Yf{Vf1;ۡz]mh@v5ˋꎥmw;r#='o?ԒI$`3m#K\HnPa W* ANVSKe-s6cK;?4 8qO{讫XZِ\?۵(哄nܞ'\|5:]rַ ??-:En` .?1QuF9?QpGfMoаrg򿖫r XeeQy31"=?1i }6sv*4alC-L ^{|fԞ~chn2E_˵t=8~fhs6=G(8#|<1d8M({ޠts9v CV\>pѩ oO۲)B<0ӏpp-?xU/c8Zx*m;U-h!!q=VmwMYbƀ<78ߒo~uɵh4As#Q {h&x07H[Ax A蕷M6+)][D6k-k?1Obf7bk]aW,Z';9c [sGnYK;7esnֿ޷oֿ֯=9s_fmĪIѯzk_PUb6T潂KCs}79෮fֺwEXC5.!jp5;կH P k,DF?g+>ָ݆-lw}+kkXZUA&|WuOybWmk͵{w~H_Z:'Ygx˲cmoZlA7`-4D7^w}Uix |ʻ21BY긍QK'0q1غdU3_\[`md{>~׽߮5=WS,sl|ATXJD] Wͱ\k,܈@ Qhu]m{E.GK.eTٵu>oAnK^˨pȩ=;ϥVO .-ٌ-cm-vYHcl{WzhNksa#ҍlVؘ!^ 05Q uW>'Sr}#nI>DZ FԒO %vkB8@[٧ z+=")!x{9c[w}cuh`x ]XѿäDL('p2lzbX^}G$I3'ʁ:XsXIDO}˲ge[}uu kZ}=`kX?=ޫ #cXyeo7C=允u+s[ؒAtM،kKSt{IebD?cJv?evv0q:Oɤzm|{eB>HqMX_ ;]w -lCyq3kکXuC%N / ]$RI+L\NRyR1$48G1HM1; \4- $W=V_Ho~ވw;~=;= JKqMmqnw4n?r-v=Ť"[t{l}{lhs zo[ylw`II$|ӵA.DkgkO$ az:mNC ;w׮B+ O H 9i~O,=,~ػq02x:O~0mG*NGNM|e0Fq:/pIVXƓTVcc/) 8@I%6JlJdSa쀒JNGw$|TRIs}!gڳNt_JPRM 8BIM!YAdobe PhotoshopAdobe Photoshop CS5.18BIM[Gd[Gd[Gdsf/sf/sf/mmm7i7i7i9= 9= 9= 8BIMᣑhttp://ns.adobe.com/xap/1.0/ 00EE7C082796FF3A8B853A94E8DB02C5 41B0426FD2B51369BEB37D1EE717CEDA 7CF42B4EA86BE962ECD991B417784D97 8F7154372527D291432F3C4CC5EDEF43 98ADCF6B5808CAC08CB6223E074C76DA A5FB864C53D21F60DD4CD1316E523DFA BF57B81A9408AF1CA9398E57CCD42FC9 C5B2B278634DA92CB6D3A59EDBC5CA47 uuid:058A49DB06FE11DD91F687D301BCB260 uuid:1B9AF97F6DAEDC118E0ED9E8BEEF5534 uuid:26C1F89E3C4ADF118A5F839B39D8AAE4 uuid:58F338083D9FDC11B449D23BD4528914 uuid:732CDF9BDA4ADF11B3FA8121BE74646F uuid:9545EF1373A1DC11A4F6ED22B4787696 uuid:A314A7337278DE11991FF28167F4E92B uuid:D3EC7778876511DFA58A94E5DEF6E887 uuid:EA4E4949FF7ADC11AB86D1CF4F8ACBD0 xmp.did:018011740720681195FE8B3FB77580C2 xmp.did:02801174072068118C148025D7C53912 xmp.did:02801174072068118C1487E86D91AE35 xmp.did:02801174072068118C14AC2E64B5207D xmp.did:02801174072068118C14B89C6647F72E xmp.did:02801174072068118C14E63B606D5345 xmp.did:04801174072068118C14E63B606D5345 xmp.did:3872A0E227206811AD1B9C09C3F08F77 xmp.did:40FB977471216811BFC9D265B8B93FA0 xmp.did:62DB79183A20681195FEAF3088BA9C4D xmp.did:778F23A37B316811BEDCD5AD10915AD0 xmp.did:793C62AC3A206811B699FEAD67B282D6 xmp.did:79DB8D923A7CDF11967EEA98132AE291 xmp.did:9167FA13CACADD11A2DEB41D46FE7831 xmp.did:9BBABA8F0C2068119457B0691F3D00D6 xmp.did:C301129869CDDD11B4F0BAD9E1358AD5 xmp.did:CDE0CBAC072368118D4EA4A8E9E1FC1C xmp.did:F77F117407206811AB08FE7D8895351A xmp.did:F87F1174072068118083A91E0F3541BA xmp.did:F87F117407206811994CF31B3B6F4586 xmp.did:FA7F117407206811AB08FE7D8895351A XICC_PROFILE HLinomntrRGB XYZ  1acspMSFTIEC sRGB-HP cprtP3desclwtptbkptrXYZgXYZ,bXYZ@dmndTpdmddvuedLview$lumimeas $tech0 rTRC< gTRC< bTRC< textCopyright (c) 1998 Hewlett-Packard CompanydescsRGB IEC61966-2.1sRGB IEC61966-2.1XYZ QXYZ XYZ o8XYZ bXYZ $descIEC http://www.iec.chIEC http://www.iec.chdesc.IEC 61966-2.1 Default RGB colour space - sRGB.IEC 61966-2.1 Default RGB colour space - sRGBdesc,Reference Viewing Condition in IEC61966-2.1,Reference Viewing Condition in IEC61966-2.1view_. \XYZ L VPWmeassig CRT curv #(-27;@EJOTY^chmrw| %+28>ELRY`gnu| &/8AKT]gqz !-8COZfr~ -;HUcq~ +:IXgw'7HYj{+=Oat 2FZn  % : O d y  ' = T j " 9 Q i  * C \ u & @ Z t .Id %A^z &Ca~1Om&Ed#Cc'Ij4Vx&IlAe@e Ek*Qw;c*R{Gp@j>i  A l !!H!u!!!"'"U"""# #8#f###$$M$|$$% %8%h%%%&'&W&&&''I'z''( (?(q(())8)k))**5*h**++6+i++,,9,n,,- -A-v--..L.../$/Z///050l0011J1112*2c223 3F3334+4e4455M555676r667$7`7788P8899B999:6:t::;-;k;;<' >`>>?!?a??@#@d@@A)AjAAB0BrBBC:C}CDDGDDEEUEEF"FgFFG5G{GHHKHHIIcIIJ7J}JK KSKKL*LrLMMJMMN%NnNOOIOOP'PqPQQPQQR1R|RSS_SSTBTTU(UuUVV\VVWDWWX/X}XYYiYZZVZZ[E[[\5\\]']x]^^l^__a_``W``aOaabIbbcCccd@dde=eef=ffg=ggh?hhiCiijHjjkOkklWlmm`mnnknooxop+ppq:qqrKrss]sttptu(uuv>vvwVwxxnxy*yyzFz{{c{|!||}A}~~b~#G k͂0WGrׇ;iΉ3dʋ0cʍ1fΏ6n֑?zM _ɖ4 uL$h՛BdҞ@iءG&vVǥ8nRĩ7u\ЭD-u`ֲK³8%yhYѹJº;.! zpg_XQKFAǿ=ȼ:ɹ8ʷ6˶5̵5͵6ζ7ϸ9к<Ѿ?DINU\dlvۀ܊ݖޢ)߯6DScs 2F[p(@Xr4Pm8Ww)KmAdobed@;     u!"1A2# QBa$3Rqb%C&4r 5'S6DTsEF7Gc(UVWdte)8fu*9:HIJXYZghijvwxyzm!1"AQ2aqB#Rb3 $Cr4%ScD&5T6Ed' sFtUeuV7)(GWf8vgwHXhx9IYiy*:JZjz ?kJ x'#]?՗5\oŬx_޺ϧ]>>ԍU߃?Po@?}n9yd6ݿ?淋 um}z@76 {^ ׿ֽױŽסּPz|)6᫧j:yeҥcI% :A_ߺѮϯR+9|W')<ıo?u >Q>7H߿>i\uT%P uMt`V)dX0׍̖2Hcȇdh&pLPS}.c˨HydkHդv6l/6ߺ{T노^ Wߎ=f.pYܜ&|^5Y &WB&W1(]IߺY+6RfKoghQ%d#yjibFAkxߺGMPʱV1fc#=T316OH}PJSs4ͮL8zǧMU :PKgSUP$NIj$@#W˭SHt&$?ڽ{XDtN#@omT!LTs?[K(a U1WM0F(z) +)lAA^qw,i*N`Xp#ӯPy&;ddO.7>La؉80 ~>]kP5f/t%Ƽ2T5IVA Hr߈( :zEw|)SAҖXpJi OI$2(؛XC^(uڼ`,@ث)R 6Fi ٔed g9bQ#m;djHd7=׭u=6ekT06 zBkVӥvGBU4T=İբ\\nCN\}2MbyŹ?.7E}uBQU*eV)KAMQYU" HOM2HRNg۹(19Z`]XiP?mbco~`1=¾[OsQ,[gqSSOS>14<$Pă;O0IMT# :pE},yo Qڃ->+_IUy H8'(V`<jPJtvZzt EQ#E2hƎf(5bbbkHúq҄Z<}9º4V٭vcP^mybk׍Fi5:sdiT씿ıոuP3U&u_Q r?OiæAX"')hjkj:bjRG2,@S`[D!KzңI=;=DU1>z䦞R:,H/`?OjG@J;+aHVO"?Y_g6TA/IRM3CMx=Tu S-$KQ )b Z,2 VP} 9#=X T)"{A?}\ uu8-M7 }?_{-IKlk^ԬN~ ~9 Gԉnc\Ptdֽޯ>܄QMRA)SފScKZ{ϴzz'=޹H NSqٽK[%̴>}@7?q`iN}K~'u8hi?r?g/Z=ڃ=kIjl^\>SJǯۃ`86{Z'^>&ujTw6 m\n/?Co~ï~/u|'mo^{[}z?TiîJOy$~ u6/oi}qߒ"c[t(qu_֬*2j'=@[TJ>޵N}.ٜG?bm3.-ُ6^*`2T OfTΩ*ۯS\{,zs?dI;db{wjPm3xU7ĭwCLI둇Q^zSϐ_1%w?[3oWo=ÚGCSմu5FFzZ!]_nUE q_#O!_ֿf꾔p++WwktI/fv6;?hQQ&/M4tt0Ƒ4`=J/]ݲkg;z5;15UnMin~ۢZxh;Y*cU=$Iz8֩Bsӧsvfn0Yy"Iߔ Óŭ4! ̌Ԟ|4]Fß~z6\ycL}`hSH*]M-\z%@,}Z7|w|'[=2wqPS G5WOCK)蠩T: $jʈ>߆0:@a߿.Rn=s֔5qM=Y]dV譳[KeҞ9ꕮi?q߻?kՌ!Gz-1{]ciX]؛Zu>8gVOC>3G7ڔu;>m zlɒJ|eu,RT"+,uǏ{ ,(KrWb{T8ظRe9C 'jZjyte${^bЁݿ۽;mbO;lm\dX auA(z1c(* vek:z3OM,M:oOǻ:Ot:iIޒcJ-%l)50o5UIHAOkG5fӵxs_fwTuS:g e7_\oTlgj5)E[HB\U,n!>&޹wV^wÈ2;&3w: iWtn;=ka٦pryX"%SU$0*B*QL@zyBWǽ_]aaoݷ'o=ͅ4k-!2F@Lsʦ#]c˧5$zn͑כfxWޱ齗i/ϻ78ZnI)&UW9ťh+)ֱ\uG @o_)jsK?هz\hػxJ Qm3ySB{ =a~b kw8mSqUo Fg1֝ɂؘipK!%>1h+i99X.Yʰΰ-?._%ކ=]=S}mkH6_|vB*o< RԈK ARQW1luWUx䉮C,o?ђXXY*An( Esէ|QlPt '~0wSe0;itgK}\6Rz\:n읅^ %Viwh+YdLҐ|?ʿ=4_)vmW7^ovT9Gۏ5% G.S q4 Y_^}Nf)қU.W@/B⦡wGLTA=$UqdW[Ar&![ˡUMBgaOa֧v۪{VL)[%pxjz/yU/p=<h]MdSu+Zt}c WǦ}~cˡkw/hu?}77[|~_^nNWdc{pG[w^:xv'3C'=E^A $1-*I~'d`cϥ1N\:iZB=~dz}m[ֻg6/f[ItGtcquYt$eX#xً{h#OIPyyps56Fd>77g7tvY}[7MSjjv~{Y!9*ǗZL>zX5i$E Re+rF ><=D]ٛw!" ׽] zqlnJZ7ѹQSΉ*,JW*yN1&먲nln&ٔ tdUmWz:Zz %A)EP=MHh~t<>?./2~KbejwGm~̯o&o;!]uRwOlb3RkۙeT[1)>R0SϠKޛ+mݻ6W}[|½/؅vj dz#S@kq-Q&G#WY+U[_PZکeݙIԲjCӡ* x$8?WN+GIiM`8'}Hϻ)S{%u1V?mƑ HWQV cb(}u y{{ mK_^ >-cE?XğDڜ⦽J85)uo'M="P.\7Ϩ,?ě8LI{ߏ>׺PySPߑ?on> ?^o~]s#_Mz9Mj<} ZOϿu`Hz-k->׈zKnE ymo?=87}i*<]wůȏv>Z4;~u5һ::Oƿ^/vnA\K|zøwIN[^\? N]}Cqъ3OQTW`n{Irۯxd)YQb裂E% 4qQQ(1׈ϣ0R2>N)~+M;i Gqtw]1ZX8U<tTQkKMSE,UtR%%],SSAQO4RxhYHXy׀pKޟ,G4$j!{8ջ/s X_ z[:0KnpE::nMk49]9E&61M,OE}YE &&hq:j ۱3|bmyMxߒO%gvc-.ܛ:)+́&ՅXCCä7Ę/Pܖo mRBkvJ &SpmZPDu!L&f ̡iNN݇WSv?N{O=eT_GMQUU}{'ʺ K>ښ~ҳTʺ>UzЄr ZӫVǙ^xvu-ꃴѠA[Cvv({0 sq\>OxwODHwk|ph; 55[#{ISRoDȣzkU,IStڏn+Oُ$AQK51׶^ݝKO;$!jcaˈ:[ 8́ANΠwJc3D@ &|Bj9jM_[V#{Fyͤ.@f8ٔ\)Y Ӫ*ԯ@M.$q_9.͍:W$Nڏq>Zy{Z#{\}fgzD6ž :|AOKCEN^@i, ;tmާұx(syq?]|oPma͖?!z#WU@KdV#:)rҌx$s!}@ ?C+U2>W5]<scn]# G}e&]Mؽs^:zZI,tO2N; EjO}'>jK}D4 V5*59>@o.e6%;w]=~zsC,~ڮxҔxaqydA[{1<݇4<GKѕdIi@H#ΕUt6oWv~ttT9uAnلP*N(ISr=fIB^qBJ?3b9aob%^"jk#E? "5m{$Ή$[=VFzi,]=Gz\fpo}쬾):ej,L٬ II-A;QAJu* zq9n - Ŝ]M؛uu>ܳk2dU^̞|=N-r3O=m=ڛaG}n~J|nvܫ]Y]Iny7euƦz=KDu*AײxKSԕ?m~zuNڴ+oMӌip2RZXS {,zz/O#1VUn#u)*vc-=@đB5@6=Xg3/9}:-7KqU`hɴ܃wU`+LQJj 5{ШPz{tE=;t.ݙOA1jz97T[odϺzkЂels7s2IVF,>12YJ5`Ny2y-1ٽ6n3CdaasTiY-db*Hf9tVٍ~]7ѠoCtgla(k7sPg'E:3S#ZJv}e[_u.3+[bk)tQïUz٢=m#X UM֓db UDONeç*w|[_{,uKipsY욽qpJvi0nFXu)) xﳠK1Mǝ/_Few.3Yt,VETVV U@ӏ^ u6Jj qoǏ|p"T(S=D4 RTU$4qI"5Ud,1+F6(A`xtfҗrX.Wgnlc[xl=W 6릅&U!ls@Hq@T=6F퇷q[of9sq][5+fn.6Nkcvcn-qno[nݷQ;rnoOo  I^/MVOX5@bA 'וv Q%koѼ~O.nNۻ߭}ԛ)A*(귖޻m&è?)(q%K,2%emY^..=sK#.FG}OR>ۛ1{pͻlU^ܽw|xٴ8J:| ,榙QZٲ,Z.xӇAKc,$g`]7}7뱝>"zm^*NƸ1u^tx\1C-Ϸu%iǢxϡCC`lN썽M4zlη/c2X6a_$^*PWX%.E,&#PNkзДaNbvnz:}O73=ۗn͆c)c+LҴq,0YcUJál[@Ak>.V2YyXbttH8OMK)щ bHa%>K$~g6o`[iopŎe(CAǥvtv;:x^8HPTqMgvF;tVuy-#Zo=6+9Z#Y[W.PZDstEA~ |`程][-}ٛAr&>/%g+a`3EoAAX67I5DBŭNথ=?<צIiTV&}fuuk{]ńgOkka_ccB\;ho>n i[O%Z+% "UeqJYctG>Μq7ۛhhd3&ꭅ~ktȑh2{p{w5Q]IEEo !})BOA~+Uouf{um͙b f<^qn[{ KGo1Tkkme6>5J?,$M3EZuoۊd~3df{?׻pV̢J=6]-N{OkEW<\:DD \)v/oMiz|1򯵢o|N ,fCC},)H Wo} -EyH}0z+X1cMlXTԀqnG{&3xwrO4d( @mb.^v,v؆r;z "A& X^Đ[o FsԑR4WbNXn.m6Z1BpUCS3k$6Jϡ($ i^?>75i[{}n> Q{jLccc*= $~nk{^%yߺXO<[DSzטps"\VG]>[{s׿ߟ޺ 9~&N'_[@{[ÎB-s{^8~~BF:Ⱦx}{W^:'7{[뫏?{}?{&A?׺%x{9=u-C$^>ǂ/͇ur-ߺ"-͹>׺8  i {zz6?CK!xuІ_#[Kf6qqkXߟǿu}<i=6ؽ_@/ Jt 6𽏽T'OJ ZR?OۛX{lϪt-6ؓ8s{֝8ϧō y i$tEFV_ӝ=& i u1qDkq$ikQ6A6?E}VfΓNu*-+ìUM0<-45ha1x[<~}Xՙ N =$ϓ.+m]=i+$n#{V&oL>q{m+e2zW?.öbDP.I*?#ֵK q\1běUKm%p1Ѵ0x禚#]@xThGǥ~USIm'@V:PFV^=Z[ISFΞcӤVJ_-sbZRMoamTSˠDi^`G<#[ߟ=4zQNE\~}\PNB؂P5YOЀus`Gdz;(̓ t oczvfB$)"[EWOvt"H` UPT2ˡ|tj=Ir]_Kcac^eYS=w&O:28=MMDKڴ KEuK{vٳZeͷ0Fjե: { zn}JI[xadzO*Z5zۓ5uSծSzBzo$Iń0Gz1Ǥee v#O}&_kԁ.cuVgtlkuIFioOqvW*)KV }x$7J%->־Μibk [}??>Z-.!Y]W!w31PI$ػx E(ʠ,H䧑}@6^@o6w*(J]lQO'} Ooh&5n4WOO1Ӿ*t\߃Z@^:H$sr-^ͭbj ^d&O&Tj?8'Un}P%<8ztg0MYtE܃[kr;+Uli`IdV Kie. Nm/`q뫴BǸӛxI/GClb.XNZbEb[y ={A)_N\i3 +)'4xОiQN?l`ӎ "Ǟ=ۨ%#T6/Dûs$+ -p?_#"%VY/(;:#YjD%ԟ{@T"@?#WPV& ňs,=k QSVXl-n}A-/"^*[qjXېG qu ۨM*!gccoŸX{8QQ^VrrO\6/7\QS?~nӞGߺ+ǮD?{?c'_p}m{$ۋ[8nqV @8H Sn}PP3\8aՖׅmߞm>ֈw?wGמ~ר+P1ׇM?ߺ:H}{V1~q{^/#Oou~?؀#׺p {PC/zTS=zOZve'HolD?؁`gX.9[GՀN:_,}(1׫Ը)y6sٵӭt_qsnom{#`l>qo~EhN,\ߺ^X[\^6n?>,h:δHo?JUtqΖiqk.>K{mژWx}C͹oNc Jm}OӁ??둪@+tUΖYߐm=^ANF <.?%:@JWJD?ֹppF(:m,^}@?P?͇u@uocXɵkӡ3Ǯf;"QsJP PA"OzO.kש۴'wSoޙZ)gMOCS,3Ub@SY-4fzZ妨XBT{Znnb~ޗ_i*/\_=XgYά/V>%o +eoڼQUa(iPrXA(aG]Խvu7km|߻2f-<KUO-u455Le&O_ͻ#A 0GMKm$LqO Ȩm( f:W٥ + 8xpiA7`Ŋqu.>ݷS2"I(t\Km{HX i~;vAn;m4"70-qĉmsDzb\6:,VEW ^ŷ-*BOʼn-rK_= Sԧ=UV r̶TRI ~^x&Ԏr]BI-L1aB0"sI$GU"M*+OS+DrލJlTKϱűRq%=U'ucC5SP+ okpI[ř1< H|`B*̾F6M &OM՘]i@?n9p0>=C;Q56jJҳQ&ecSç?';3Eջ?ultTzWס T:D-zQSSYqd 3 ~]I|n<.v7-HRk>$uWx!7',jI$i6=} R:D'M()rN 3\Xsc{^贏M:X"G+R#~G x:@(yt@jy &xb4_:t}D^^vB!`Nk{ݺ|Ƌax^[HXfx!zrAq?}֬ uI'{ ^#Z#jE|狟ǿuT&~Ss~ꠞ>C ? ^'O>sߟr6?RqoǏ>yܐ?S{~'9>׺ToַuƜ8Gly^'-ŀ$=kBE? uu h{X0\=p&q<{^Blu!)p-{ž^ScAaX}/Vm$uឤn@AՅ*:)IPy< ߟ݃ץ!TBib>z0:)qK۞EhOJ2Fzp ~_iN SX=m&&PԀ1<#7oߴǢ҇0v?a5!zvk GWצ:o{'O cϻצTTA?q\u#bx^ bOIө>]KHܡ66s>Hx(!rx&~ OwCCӤ rI+o#XGRJh8zv v}>GKIDrbdUx[R={h[` Ms' 5w+5gjNIKX$^PCrI ~HJ)U"v^ٳLCʛpz 7}۱Jp/3_ӧB՞RhX|meСyZ]?[DR<08#klɪgEI^DGiLht?&ߏ[u[WagFVtt+ՅwW-xІ1H:6P0t銱п#o cO?tf 6=゚8ޮvJqr؃ <BJS}JܝAiz 7^Ë$Piu"UgPcf@$[y]9t[Ҭ}_RHC{Ƿ:1лeB:fKs͉bx{Wlji}Ŝ(j>ھ=uˏ?~o]{/qlqd[~xo~}#]yc[{o~Gyn7 lGϽᠨ=xs? ]/ɹ}Kj{\qa7_ߺ@]~@~}T-u G׍Iׯ{@<ߛX~^R?}}u??uޢ8~>{I?Лm؂OR[O.϶zRcFa'-:b5=nzx]mr=6x֎ A<~8u" O^`y[rZߛߋg)[S!7_/qc<{lz:M{q?n-ſ{o?.H:EF d 9d͞['&I7fk V&u>,jxu)iӆ ňR8Wu!(5y߁'׽jgJ`aNoxi:U/ȸq $קrItTU}WŞ䦿U^m?y\)=M~}ph 7vkTFv~> $q oMxF=-zǰS}u+(r<:BTu1YnjzX4M6*x7Cr  FA0xt13#TP]|oxwľq=ڟuѵG]c [qncGJ UgFVFg}z2w# ,(zC{^|">uWF5 Ĭ;Mq"GK (+eI6Q >wI,T\JIaX%*^PzW,BK Lp'I`zffM6S4,=VBm.Nz -> fe=k_.;41C[O M0Ѫ@(e5 */f;L]4l#4:Cco,2D@_QY)F[(܅eMCNډ?٤KE:HNxyu)?n[/axP6(&:Ȫ8}/ۏ~xSX?Q#^>Ns??}: Tg uϮP?[r>$~4~-k{^-]k&^O<xSnm~b]b?ֱ~ u^א,9#}cG߿u E׺_9OǴ]FzRIď<}}^G^?m>p  kGNrx}?jdtϦ VmrA-pob?x\EMAsպpQ.H?כl@z V<%8<6-A#H` A_?}xK&t0#U ^G'MegKm< T5&qcyV5BVEuLt,d_-KZϦ&`e<[kq, F Q<Hkӛڠ(mmo׋h $%r ۅ-Ǵqr+.h\nmk>5kO.@v`SO#iziM0:O?a׀Ȟpx`0+ǯMq' k/*>kM1vm[B8fnmE2; 2T1O8bJ* ypn@ΈQ5:M=, !ąRBtd'E1Ɵa?E>g|-mɵ;1ڛJ]>iQʭc !**ģ$,V)LiPӢSPPCJƣ؏sg+Rk1 _?z|UtJUX)tK<=4D{|!tԑmR=+C-VHHu#<ط[}C#TЛ9z%`!5TtUJ/,0TViK ozoLּ+e[DP A$z/Lf+D &1UP|+,rO?=WpJ ypQ$8=/hy@huEI$uT2 *ZWE /uź%c5K&ARKA 7 i'ک&$lh~Ϡ~mpbZTԚӖ7% 4ѫ%30'Ј7ݔ\^R䒡}cG>92ǟNW[u]N TȨ<(%#]HA!t>oWukՓc O{$<~aNOkQc\PZ1qzu #X,RsRA㑜Bc!*hFS#Blpci'HϵtJ=:^LA "?:|aO9|̣feR0.P2Kf(XywRki.j'nm.q_Jq?gC=&[!U@~RĐeU(`oܟr6N:.6Rn2 # ?U_4'ZO\5iߐ.>#hkE8ncv&?mpƮv{#I P ,}_<K}LFgGV:rU>EH7K{r,ӣuG&\Cʼn:uZ7s{8ߺYp/qn>xӔw?^ƢoӃ?T)Oo<B+>//jNAl7Б2ߛ9aoɰ@´Idt-?6oI69è Xq̀b@zϟYBImocakTt=B_CN'5P2zt@_/7w'.mD+ԚGF=#ҋ&5֖iX5*-}K}A[Ӷ@GzlD4.~ޓ0R20S{[ٓe+POnGVkk~ya?DX H cn>qYa,?^?~=xV(:M%Znmc$gZR‚lT^^nێyNO'n8?%uABBޯӪ:XXp},M͹y'Mcj1Nf?R q|`Bj MU5i*[.MW"܎6r(::?GS`v: GvnlJ\=#- +\ZhcU=,~)Xēucg i 1$xpY.唬0P TRo{lϝ*پ-]w-xhZ~LVՊ`ړ}F")|&9 K7E=/$HGM:5S&GJ#l\I,Ӥq(bI$PEJ]NW #k+ேi'rv 41]׸E#Ǝ!~߷BQ!Q些j|18CKxVN]58BjЂzUUWbYtp Dx m G Ơfe<8t"<$Y(X%Tw:* RTqtI OeGՑd{vƍ)f_DZ)h<2Kzzgkkit˶~TGi=DlΞ;"*E)0/LAƧXzi܅uYؑ 0MA x|xyV9T^X/y:|`G7Ҩ ϟ=&{2mqC>xmj22aVYP)ɢI$E>ě5̩! ?zy)4`Z OUUue<d1p (r+'ڍ٤znn@_R"dѨZ"*4sP8joi#o4C.j[@SM8!֤?;d$cIr=,XUƱ; P"}I#mʮ(&*+dNb`S]HׇT[fwQ8#$O{IR\ԑm#2 5M+xH$AcΫ4ad@z,4BTI[I{&z/F|_>c&q?SߺJ1ZZ-hPWWNJP uϟXzW\ /ZP{={~v8~=林׮~ok[}^ߞ?{[뱧qmk{^ߞy~?~﾿{}9؋[>~w{{^"\6ߺS"67IoӄKǫ펫ӜKǧ -JQPFQd֦zNtGCIqa=Ѹtԃynz~{Qևp[rj)_C1 ߎGq;PE|zkCo}ϴޙjPӇO FPx<~ԏh$\t崚$=KBG}?'׶ϟF`=qHFd< 8=ֿEΚCʗMkzHߥ&=G|}HY|Iy$]V#iB'RӤte#-~~{ejN"m zlbK^AkUtBqN$p8Omؚ|2Xہ5zqx"n>~{D<:t Au c❵[מ>>xWJu&y%Ӫď-ַ#)Sь1xS]yXTߎ #L!ytW"*EH~|y^<.]ͼ6bpcJLv##-f2X!`ڡ#0(RqOOѭ>$Zx5POwx}N짥ž7dn:zlTe*c)(M 5,I;?H%$ԟ^;2[VH jjTpԞ=xݷY bbafef]D-_~η ! T1ZheѥϙNzks+IWӨ  C!g} 9>dU`AQՀ8)գPl J0 `3̩N e,B_j_=7gbb`‘)WA}!VpƒձxTeJV,HB#QE6c=.yo 4 x c8p<ޗΩf֓ FOM$V@fOb b6@%~໦УA?:OO"01x F'%b֌K+UX4H(MzCc=Kz_rOqJPx4ҝ94(,XBJ!ˡn!I'mR|^}-6gTUz' j gNF.y.&ْzWo7N=Gqjrt`߶U{87*yObK&`E=IMgq>Cz_ڸ̾zYԴ)!V2t{}Am|{╆%hgy{[e/3(h  ZyA=rYZJTQT+0ϮvCsacky^s7$%cAZ=OI}h8>L*QJ(`ҡ4~x>a~ZmiEUX3XqdE@7kO"0]Ib?K^҅XJ\~$qͯug0eDMaJWBgqJ#[MΥ_Q0E$wbP*#$o*IEֵ+=9ID7XxӋ#h=p<}?ݩ(sP k#?c>ZPRr6~V?r>?r7_yz1s{~H}o{槯~?'}ݿYGӏ `_ߺ\-Q͏?״B?_Ͽu.I?&C?=uO7, Umͮ?Sny[?ĄZ=Oq}Hudק(߫OuaQǥ=M@ABI_Ņ{cSӄ7A_JjsuS?& qyAo[ȽHp ziGXdP<}=B[qǵh܁a]^R`]mlËd:O# 5=9(Hӎu:BAQ`F>GclgvRDMm Jrv7^aH)8S6U;X8i.E]AL`d=l ~;/6.Z?uG'Y=VYg룡QcpcTӳF'-Ą-G j-ς}6,S_>Ӆ-n{'kdcTCjJiB]Z &K{cgv*hOcۢM5ubo ^ZH͌gdG$zEfR9*.9.ma0SC'[|Ij܂ <85=.ubʼnȅ(HMP$Qdf7'؏a[+w EjGDW Ik3j AYG5Fpt67S#ppڝi66h(41S131x-DZH,QB:y6[ǚEf!*xqew8R?_8J^Yˣ,K2TxUW@j{9姖R=Mz)6 HYӟC]u-<(iOJB,Hц@6;՝TϨo,˫H=زef-M<+̠a>oTNC^%4dC{6&C F,$T7e @nI(7I">>;5_k*n*=>]tD$A@n)>gk~Z5GCo#sJ:Vod4WXܥx XE}6&Ca:.mq1?Lnz)#ΩKI RE1k@4j-n=*lV-@Ghf"}HO?prfQjMO[Pq,Q}TKA$HЂ՗L0AKwJ-khn")<{qǷ/7ɍ)=Ӵ/Mb-+)! #UV0OԤQ yxx.n#mR fjOuiSӠ\,t,J,.Bl Xe uzp6]DTRg?IbۗS $+Hd?[Qʷ[QR= Z}8>@L { kB؛.lG~Ou}[L9dOG>׏IVXm0<&h1znk"E:hVMVu [opA"ow( KN2Y+RB9W:ZlxtmT'O}/L8g J7?Ӑ@7.V:s>OվպOg/j_Z:w?{]r-u?O8<O~wEGu ߺ]mr=uUG98@87I6c{é* k<#ȯJ*7*H$&O|+)Gtǀ~.~?:xz<ƿ<{3a"xó%(:if؛[-aۮxVt ?C?>_.DĒ.j: =YQŏJ?MCtSЫnDǵ/3 qSG_.G:;U"7z'ku~y#(|n`Mg=5MH/.5g%-qU" SdutմittۙlTUS钮 ؑKd0ҼGV(O>='`_ 'צˮҨ9_ݴ~!O^~x#j|dE#n-oƔ#S=bgªM X'N/16f ~,n||t՝z!폄_m|oh5E fG VTW8E$?Q3{fb!ҭxW-SR)"i8jt[[@H>n|A!QN?_N.B MFo1ZCϣE V29&6! Jc #7\܀@ X{s}(دZV~Uu~J m,"gBvśH$ )d_ң׏Rp`iUCT0>,_b(_u14-D?KL=(Pj_cM>_ XҭxR`iZL6晡ұzj#BBRI*s9g[n{mtYOُX/:x( Ќ`qx֦+wMW'OUt-;pJ$:ZE3ά8 m<kxo>>߼W>ا pȷ égٹZ[ xgY꿫6>CVHR4xШebf,-}-)SF3z3rjxV~Fg넻FjdfUXȉy@ {=^TrCtOY+E j1|H USEP&AUCf 5ҮɷE<+IKɭR.Iyi"u ~9=F:H87o͏BxPz\2v1)u\0kcDz s(ҨŅ+1N]BJ\:K4d3^?P/61B !$$;sуϿv>x6pQ[]OY=qOl}9ݬ'VJmәܸiYh%ZnHaGG7[\#{V @h3ӽ:&Gߐ>w?oS0/howNnT/HނZzzad1:d>d?{0mI5$qUZ=ko;Zɜ*|8g?}kiY>~o1_Z-Cw7Whڎ;BoJw^ۧk~Mv_M|}dk5(j%NG! UTtQRJKAZ٥.0Qaq(1‡R(l\˶v+"3&h:eZeugG#7{+0?:S ^{c3!ݑ1`x  ?d` jz(Ff h-TjRmo#ľ^1DQ3/#4UUP>"ȋ*z`Si`'DdcI4!dcv-{]u]p)7IoKVR&ខX$I-%F|̰2pbIe 7i ¸#iPP4Յ$I}8}iҫidc=" E3%q4%+\(,E_ݹ{) ƽBǹ&Hn 8O̟3^Ϭ,Ei)ٞ9Q]mɐmar{o6JKi8.ߟo'AEO̞'ҕ5gkh za ҥ摕pAHCwAks;H#{s[޺p8uLզVH(ὉbeydiIQq`y2 V2iJ/^w1 P⤟3)ٛEaXeHQuJ:IGRH )Pqjg۴E_?nKU,tXf0Z$VW*GjpWJĂpc65~HQeKY5.[\p= 'BSp;9Ѭ::Pmxn,"'&A>.\3/T?ڑ,ۥ@nb6}<4h,̨mCA~R!~hѶtƤb9( >gtd 纯`z/^î * -KPBRJzHbCY]Av0yۖ|u3#SZx,A?ޠG_ezsLtۈzQ\wa~@~o4h gL\W(-oy[7Z&\WϨE[ʜZ%kj}~"uO_uw@?Oכ{{?ߺ] u-Goߺ]ؐ,H6݉N=u& [[ߺ]@*9}l@1G'ߺR6`'$R}:/oluNCa{J|@s9{a\n!~M'zJOK[u6EȶqǶzH+Җ]Bֵ ǴRS_.RNop !0?Nx>6ۭ-9!u:[iA^׆ō7'Bx!ucDͯu-dSפEN4P$kI9=ř:§}@Pzj:jT#!HV0e$hZ)=5[)t,+p2_73T<%;7L&;꼮1=lP6n^sQyD9-. R8}M\RrF80ox SmE,==E5DE-L2SRA#EQKUO2$T#$U {#:FѲQTԳ+1 VRV\)ҽz8N4qkqtԵϕRc(c/%UmT 4:&iBϴ]F).(IOFvlxw >Ge!c%..m۞>R.hiay!LbzxT# ՃK2**kstm.hE*x祼f ١i.9!C'Gv_Eoq _Y 5NMӀfIv^ kVFb"tKFW1k*Aj+hk 5 :7VB`I>Dž>~Ω gtFѳxʤ*#EH)a#0Ѓ{Gfd(*|u!l\QFtdvفdR1IfPf$ZRނA}ɻej ХQHQZKZ@BX16ܟrNelPq',cN{GAfIQO^"TĞUCkS_6<_ >Y찿/+^P*4}Bn _˪ܔ/^j*U^F*<8vW%iҍE`}bw{u;r;#xyt!(`Ɗ|DqT545b4.~Oo, )қQ<qz$daX ."XfQOM,~`Xs|~'l2VE9z@ب GP4*&f &龒{22QQI5oiG$HD5>ߺ0kH+6Bdc2H]Zˁs܁}hU#gE-'(+ُH(X@K C3@cpZ}W_ʎ[9dbsK5@8'?}ѡKJԒ) L Y,6{\)nEc[=ǎIb#ZRy=8tµsSi T$h|mQbI P}eNu[4Ct@h*(Yܛ>#$B9m,"IK#e!0luo$jF>WӠ[7|r.P!GӛZ)ܶhy4 ,IR7X_SÏeRCN$۟8|>-lUP~-*!?ݧ~=6:qk~^GBqעf:J|tEߏ{Ϯן}u^[}׺k??ߋ{^"??K׺rI7_ߺ\&Ԙ$?o>s׏NQE.y:SoЩ͸?~JTǧW94zs8I66^}:}cjdp.b~=ׇO%9?QcXb[tLP?}qo '죇OВscasO#Bki=*"xŭb?^썥zLİuy5',wWˢ{Մ?^llJ5Trߟh/,(„tc2-8] \}X^?QGd$B{p:}ڕ(澥RF@HsaEYi&xюrdllW1ubXC34 ?1]B0šWr]%VR:٪iUUPGY4\[j*C!P4I?=)WGW|9CPO Mϗ9 Lzc4p 7RWZm%!Q 5A N= 9wqw6i,eRV-:bA$8ӝz6{gvPu<;ڛ Eۛi{Q*#̑If&rI+0 ᨡ+ƃэ9[ٝiyo@+ i@[qlu_ճg7vvhlۋ&K9I Hb$ :",#;Dl`FH|_)W7PįZ2rizoߩqՕcr/D& ,un mM^LWtn:VI]D)#H%-2giF*>G?)ԓlmVdn"ˉz{[ B C ˬW3a],Y}Dr\B$ N=3$ j*|VC^ઠlZ1E8Mk1oͻy;#VB|83ni,"y䬊ʤyc&A=cHֲTE(BzRV*,Cu~uJJʝG̲M*CĀ*"PIkN.X!EHe!EIAOUK%DqkȊYc>"8WJu&o`d2r$tm{GvNg2XlE^rz]AWQĢj, SU2f_]!KDuPv Z&<UV5G1;+AiJ*3v92i[Z!xT)Lov / xJ#2U'eIJ)RjԟJ912~`c" exLFŚ\_n5 9-^]\ %Ȫ#t5:GfSR<dS($1 Ek1}_;۴W~1K jEqCBFO /Oˠ- J(ĎrɑJ:pEqԞ#4o 'z-8ؚ9ΑRrjI1un@tmWq8~~|z2-U|zҾbi[!(YLJ[Y,8hH<V춸{a{FĂ(?fzywsz w5,O"BE 2 eԿM@ 8]F= :m@ P?%uAS-Қ)WF@y$DE<` 'bc2}H`D œ$%d$I) U4;q$Hse oor-S<Mn+%TF7wڸhD1FD)Q".娨Dj}u\%ͫ'NW if#b_. ?o;(%ђHcTI/ͽ][i8ϗc)_}Tc?Ae m,:y[\LP ̪Dp$TB^v;VGYS^pkkV9qxd'Ѧ EBå$@Ҙ^K[B=d/sZ]+?'6dvr N0@"S9ܑ;; DƹA?[PT^`qrn ݬIS`}"C垣I gZ r =AX#tMsrP'p-KXϢ)mƭ/Zt$^ޓ`ZįRTK%j2Z!$qDI46_N=#Wuz&*|xO?A6?}8Cskpx^׺>LׯHbO<.}&s_ߺY?ֿ~?ug{ ~~ ӻ#_MsOu^\p? ~:O!Rt_~çՊÏKjVĀiWU`?Kq~}U@OYbq-GN-hd96>Wz0j=eJg8>ifץ gCoS"`A(@nqrEiwu#>AC)A>>[v-Ǡ^<'E8zr$E@"ŁB}$\ԊziYUM\puXQo~ͺK!?:ihNA`<7!;c6\zi [6&O>H'VV >f"wbpsТDPr>cyX5#F?<KOٚeVGSVd)^]QAzZ,4`Lz_ar Ozq$' |ǘR6rLRO.*^cC姕m׿}K"<&B8Թʷam1 Nj:jP&ǁ_nD*t'MXjj p-.\8&=R)|^;Wj%D#aΑ\ |)0vCLEEpH<t0Eejy YiꩧGx*)٣TOOSUpYH om%8-oz=/|o^-}o\>!䩧Zܸjn-0U6Z! TݙEYPTӈ>G=okֻ{z~<'VmǗ9o.{r_sFX'.M4բmEd$/E >ukGG^Ϸb(@+M:@ X@*έC]{?:lj> "d{cifk+`JJwIR[I4dIKnmU >ܙ*-1Dz܄9:t W+ 7e?n~ڮ@p5wjVh4l>̏VCw*sL՛%d#0߻U=˙"b,OSVvwk I`@x=za4SFejXطPIJ$SapO{p*wPB=+FJꗉW섓R`sF&7mJǀl[phU9}z]nX@ Si쾢#W@JӈќF .cr@ F,YgϘ?D7I#ZCz6[/i(|7,#<*IVm$ !/sss .>]OK@>Tiiг >/KO,Ld`#F  @p91n W]C12ybpLTcZH*N0 ,]^I.0 Qy:>{ P8$wȉqU(VEk 5* Ϥϧ)[a?HSde vu\me˗ni8χJiƬ"tR7Lz{$Vdd.7<7F54 IAҮPݮ,AǙ PxӠ 9^J SPURVRT#G,sG5HxRLs>S?o@9R3NgAVH)Ȕ=?") '´!G4 IN88ϦzHB"4#,m`5 E"r~ $Ri>4;#,ɀ=5rMRĭO DKŨťTMŇ$ ?sEq.MAOfM7Z!x1`IӭH_ۏbz~w`DTe+OxzVyL(LRMYM$8,E\@T@J&|iSNhٝX:Waq$"-Tf?\8ZWXrk[rMྖN: IW>gACa*_8Sw͟~"j2xt}%삇OGwQr??ǎG}@ߺ\97?=uڐ/?׷ߺ\Qx~uӁk>{@O/{qkccϿu 9k^B\qq8WIǩߏϴW鿫c(NqS)d[^IXK{p-ƕSQӽ!scqɿeeNzWoЏН FVߒM~}\=ilot\,H)l4"xIJ>k& |z|)e@ Or{-kOE\1,|Қh,`M-@?[{)-VQN{tRCMj=42Gt>4юzy"ޯ}]@$碉 (j2OyU/NXTrEUo~G tn$ΊtW}cl_CDzs~w;u]\_@cDӘmpށ_Ϡŕl&OtQKDf*5U :oBwFFNxQ5bR P #Kt=Vb@BUZ}*J8.1|n'A6QI"ŵ/q 6vu-=#p{!15$wYIH|nTߋ>6:t, eN?a^۲TCT:KiJ+$suFѺikX}ɱ4s}ۆf wƽ{5{'հ >f5-fkgNWrv^Papqd2F9*'lچczct_A=TT u j|!d*Ç`7De-|KX̠"E6F3˦7;2ԥ)2PF*B棭Mft. ;ry(` LMTxeGm5J(?IENj,̑]]G16}uH..?v.n]Y._5[{7Cdfd19JBWG[K `mFŎwxgGx~lX1o0́4n]‘7E74%b0LXH@){-qPs@:*S[;c'%Fp8V!SML%~?, KIָⶼ$}Ӣ]h$1SZq)ѽ][9* jrߵTV&HSYep[b@b{ӎ@C.$C[f"Hb\2aZh(: g:26[miy~?c-M=>GUJDQ "ܝSh$\d[{m^ә{{FZ+A ,7+som1328&.{\Y!+M c' ϠZi_4U[רڣdH< KjpBzH*3Q"H#$M/dd7n! 0_zw是o%+:iO dytuޯA:-oM.o32Ty7[Bgu=U_ҷb\EaZS Wl40)Lbr/[X&sLW+k$]CZ0@Pժo۴1d߶İ "U:4}sOPUUa2掮KX1&IVZ:)(֥}Żt.uu1K-CMUЩІ4hi=:o_W.kdE ]q8*mP8˜160aI(;JPis?.3[ vznk䁠Y_Fݤ>w:BP T0$N9z7ۧn$SURq*u9$ZiJE[l$nJ۶?|g|F Rjk .i$V4'Eov>JJ$5s4dRK!P?Oy+o+{hK> គ65YGU43E;IOi٪|YVԪK. (G1V=N}PkCCх2۸x3Fi© ,9 v# #w1 [F1t<}:$%,!k\N-IRS>z61e<:D%FuUE8>qĞ' #*9 !:W>.?jܑ#XxNm"M<-Hm}zZ p=NL4E؃Ŵ'&ܓJ:_lNح 3o$o#v$1xIù>NJ[ 744qB.m)Ary?s)~UjtZwQ0ˎ_jЭa\^&z'eh D@ _𷸅Z rR<69liЉy'emضbz@Sw~OɏR&˸xN uG=S\I|UDpnZϸo^#cE:y[tX5buS֒D=w:tN7`~?˷KX>U:;޼ -8/-/夘Л%龒cKϷeivS ^&1O[<P43,RDVFу+_˨fWxPx88o>[;ԝ_SSw.5['ÛfqϱshT@Ufjc1 k5/=A 8-Jj!G>\: IOA_K_4u<LPWB᫢(D"{IV!wGg>_y[#x, '>֓x6/)lVe㳴-npe䎣#GֲSdq BT ӵ OsA.zTpք{zõ&ٞٙX)rS⪚ Dy*4/x]Yoq6$h:'b`upo9u[gyȧ>AXv߫Td6qx '/4}Tv+~cr}43/GTצb)颚khsg6}u$of脔QE)EHN)}4HOf&sqe,l(Ni@AZtj]*TG)"ZIPd%R.uZV8ѥݟU7[(7bI*t5SdS8ڹc#>]'9dyf$΀>䵴f?9Έ|n֥^BYEk³,%HP/hANs.#CdOl*%ZSܹM ]ݻ*2;W0,ƱEh1,Esϱ[=]If>Ƥ=bߺW;$7i$q|LHJXX}ƅ >NhXb!AXE>$^9A?%;YrR!5][]YЩ ziw (yi:e >s_q3*W=f-rUZ5@hx M?}:P&UT(*aiv˧ ^_MHQ,t|> _Yj)7~/3/d?\rUغJ,Q9\fUzo]O_7HȸnK$_L̍, T.@ pKe7 x-ڭI :!E0=~t=]M~9n~|~a\z6F?|YWREcLJpt"G,*tյ,qMH B@iti/>ӭ` <ϗ[5Z@^,5`Dj*"XZ1d4ceI@؛a2D0 ڗUx\}:+yV5*s[y#RDVxƚE}]tp)}w=9.OΕWϤNb ~2<¢:I.MR kR J3 {ce\vNX:j۶ֿI% EQD>[ DayI-ՙ5)R$}"k1u">]5^%jy4틦R'5o)hQ2{KԪl  b] xֿ:t$z%U3"8ZWr &Ky´Wk!\}<MҤRCGKLxLBGiO(X5#@moIcǫ&C$`jWy Z`*?/dtYXkQ] %b 1#ЬCFQc=ҴWSۿ*\P>g~JͯEDK 3moTwsZfQ m|K1::6Б4P'֘P< ! e<Ɲk <@5hh&EP"nA H6ӫu_lG݈Q!~P9V3$Mc@ԏhXUcB:\^G"bAҲK"R@B}fP@'=wAJY8tTd0PE%l'tؒon㔷Xե&z||s3mh}By*^mI1g;Q1XU%EbI3YI)GZt5H犖yW?{廴wocs¾jP\.$C2Kp#i#8u'3 X&qp=^ʭJS ?QV5,=:0es2kԫs43,ђƵ@KK)]rI_ a0S:Y B>c ^a&t63YL^'uR⤕[KQ#ZK 3ܗ$#>B}Gx*qVCAvߓw E>lV+1eb(Jj*ƶ׌[%DI t6U2-'s-~"?.qzmY-ɦ5]Z)4N:/[KwȾܹosG[xٔWylk6j:'j$H_Ŀ2wGL?E~C-r[Y!ƞGaݼ_FU);:z45fZg+M˧^˪Y˳fkа ’3J>=n7 Ԇz^|K~h~{=;dY{vOܛ h(~sS)+ݜ34ݪJ AVZ =%kkH4f\׍<~MŅ)|zjWjpZB,> F@jT=˅86pԚ?A hw=a6ٸmgS2I_Ǵ0CCS4hܹz$QPh)RM(@?ϥ{.} }L DZc@2 N3N4{Gfn Jue.ڌ6mLYjbT)D4F?Hv=kaA5Oο!ky(8u\y{-&G1U]M5MfC%[5elT1gPYI!@Փ绠W0F/ĒMk=)¿gOVژ(V>T{Y*;8u]O=kψ|YKi-vbl4ߒ,9"Y"fyoCJ}:oV "@?o^e}'ӄBGܷNC¾zϖGM>V_:H6*+6em,כ4"Bt$!.!ǥSB8|DPWMI"Iv&~Λ<_ŒCP>_@r⎌\c"J㡓>8ȼt=q++qJזglLQq,][ PI㏓8u"fRw޹y>T5Ym^O|Uuݱٕٺ]F+bcb+fbU(o* -3 _PO}^H]5pd?Jtm#$6guj{bTx6۸=cb͏Ʈ>'s9aByM^ y8a֪Fj*`縸HXZy 3vuuʱWOBjMW/5X% ͱ5ԳR FRb")"[ smOݶNԗq)gN#I#,J F\x ឤ%j-A':/[º5eК"ETߪ[KaOtd{𴳳E4HyBg(XZujSu#-mAEwl$4 D-T2J }] "*JT夀#R/i>שXwy)'tU;`ŬBO-=H%2:ZD7*8'JQG$r)(1GJ }f:WRs4ưO?Y<HJzu('=AVq=z6Y(ۂi_􈏮5o*VQ5DL'."=E,6? ~(T*[ǖ?Sk$8'ϡma.ȪJI $>xtO'سh$T`: oW$ѸQ|P}~ގQ#ıE Fp}xqE-wy-޾DMiR7/ 7 $. ݋hC[:IUK#іrdfR+Zww0b1aϲ{ڒh>=iO|Gg-ip@&~c#uQKLRWmM)VHPY5/f=TLEe^qtL?xNL^kIˊEī i܈.S_ti^~)m&m}?׽B#m\r/^ O~q[m?ߺ\okuѵߺ]'mk{^($s<ȦxV| P}x!  [okЅZKyhvEX$QЭ3,w,ߤ_wZ:K U~GϡW/NV&n<+ЉCb!dBVZuS-T. < И%)5.[|{Zs_OQj6T6SuċE jg` R)&9 HzØ$x%K\)+_a&GQ_4(qlJ*A ^ocfcbJ!(hn9yo dk@IϢl{PnUU1͆Gp}ag U}=_O!RS`is ل!-T) yO nFMµ@j˸ZRzA}77#%V>7QݕWS%-TOJ9ɡ jYUkpB;?U\iǥOK$Xe+ $S_} [Je?ˤMfBZ DB2-U!eb~<G\:nc13n\uSrm=K/<{2Ur?oQ=^O# z5jHC  @^rߢY瘆r(>gR:,ԩb9 Qa^7In?пnuTdԏ"E6rEC{J^A 2gV:UuGs-i4O_".N,Udm=טbcōIU|չw:'4qR QO##(Kk+{uLҫTB;U]EOikxT<:=k,&z/QӛFFfg9i~)_=Zb%܋IfۄD3~J3DQt ~ߟGc : b+AGE#j+rm)[XD(3•ֽ -W%Ԛz(EDP;4b "Vl[Yc8<ďN=,_=OA6cwRס30<. Q$q2EI!@PkIkwO>dh/Iӊ<1M\Y r8@\KҼ}lv[)V7A ;x Ի)^E&dd-D4@8f \s.wyN3gjF(A-j#O"MSˠyF'C};X;,I'BPӋb#DJL%rD*ZEaI$+]#Ǽ%5R:OL'cډkd?($KMG "00@@r9 ,\׮NDѧmG7AhiU١/S)ԅ& kfL'zzjۨv/cm~ TTIMTdL)B"Ru>捷rK5b8vk4Z?LtQ?`ziiP")D-21b4Tox٭1n3* c^cgmotp?Ϧg%D,BR`"U]J5T`,R+ҕO8MmwϗGU_;&8lrGL0Ҵ,4$2_ $n]t!kx|>rjE }j)O\kwH&L2!fnnQmX1נ4drˢB a#>Z>MJ ?6ӣs]NjΠ?*\W 3~u}Ђ܂cvyE{yߺ]~?u"<_ߺ\ln ׺\ $p@ͮ=ǯtp?EϴhN:}Zu"yGm uv0:tLM];":[#)>o& B:d1!Oԕ2n]Hy_b{ +x Q?ATHt0 [I -,SĴkǏE^жˆx2%ܟJ"UHژҥJ$QaӢjgWJ.ਢaQ/#mq?zjI5<oO.Gy"H}{s&c 0VT%[ŇMíH] kvRJ-:ji%fFbÐ-n}75u$%v tqO-&BLHgRIaߛ E Ŵ:Ѷ˸\헯qUˣϷ^"x`ȁBqVi^f_>{m[0gpL@% o{*5ѡa+ZttKRR1 #6y+Om$KWp=HMb;{l(cW UHS*{̿CG!H~xip%dSUe>_C]KZh^-KZdix~|EK-967vyUSn%>v$auTJyŭ Iy<+~ݹKF08$ң- ǒwN%FQ#O?#u!g1Ux yG\3x^) x/h}۹طiɀO?ˡ͎[ro21U'G@f7'RAC(f)o[:KP.[}]\hOi53?&(UM-b+Jcas}AMxiBqe2,$dhb@RNRֱ?ɷgwA;H_EHBҊlWյH[S4#fRRK"K& h2 #dk+8*34R=+:'S))gPY\kp o.E cCy6ZBF?_,zz 14qZhD[AFf+UKsk6}8S=H0ZڢC?_1OsYd4dr&G`T)fbJH~ނud M+4(8%n#>Mu=tU5XYם!xjM"YdGO ]{z`4Z07VU䤞HxjZxDf %1-5r('M-t'1i!TjRa`* 4zKtaMr)v] Ɵ= ,Y@@R.QS -VUx7DB5:iʐ (Y /]_/Zc9UI],0Yf%*뒢16:JXNLS9_#H!'h)ZUc|;k`dڻ'CCB.ppY9ٝzT >ZmF$5Xl $ Osm; iu^2QM!.-r6d?J %oaCKQ$qDY}o!ЬdPrb=-cRR, #&fWi C,T\T_[6F\CW $ с y 炡Qg \_>PdP}(GnA ,l=ZTͼTT 77,BǚWW1a"ʠ)a{Rt,I}!DZ ~]"9LTT$zZWR{LUЭH0U }jKMm8 -vKjU͸hVj#աU,) ʱ?\qL/, ZӨj;}{ ؁ԏ15•+!dщ5TDI+,&Joa -gp#6wzP΁&M`C5Y׈V=AJ0ìq)9Dl6<㕠8?zo|KׯЀkM͍Or??׺kÏ^'-ɵn}uy}~vH{ Hqp?6T?B'nWKm HHdP8?O9t**.(j tΨG*k_h$u|A47J}APѾ6M$_'WHHh8z>Pjus/#蟋_=ޮ-\n>M(XȀE_xNNm>8nC%>|GERǪKfmjԽnGf:FnV'*1u4L?P+`\s=qo4/D:87Q:sd1K90SI>ȯԫ%ץݔ:":6]ekfԷku#ѱǸKvU?ՑПg嵙4H i:6l~nA"A=R1ɆyTHKqwa*őM1ղվ܀Y$FYIb$!OX49IZ6&!~l9_`b$):fөOe7{6%q6 4|]v~)18ʴhD)V )*u Ú"bߤO?Iۂu> dY>>74y85)gڍe4iL>Go5#*7HͽԚwM(T//>Rp~ߟ`=g5 :y)w"H?df˥g^%M8dYu( #5}TaԅŮx;Is+SS ҙ:*7Q{!>0)2C21D,dwv_G[Vq3i_Qzz^ `~rViڨD2°U pb*mk?޶I!i}oOMkt(Zc3lemuR  $} M) Um%GHPzJ-=?tzڿSTfj䥡c墎BjhqtrɮhcfgU kjnӘf.;KXֈYMj}ӭ#|/=d*.O[r˔j6Ȯ#M t+T!a-bI!bj+SsB=E2i*:$RZ4?F^/9!~OO3kdFEv:Jx,qq>kuy,.S$p3N_{vyj*:3K7X)O|zdBҼ@jC*˥餉i"T \܂Y l'$sMahҏ)US,U&wX VRڽw{- ;MGuVނc.6Q<]cW!C*V4P -tTTytɽ~jI Z!xČlH6YNz^~": 7Ȗ3q2+$D*)]%_~HoQx7NuPsUqczt+PyjcYAd^} ]$i6A]9ItZPʰ :_W&tD#B +JW˧(ؔ'zvL*R%riV3Btݸ$@ ѰC߳yycx#N4OVc!B`mE.tYyfbF(j}:0&[5) Π {9{%oۭ[W53H@6k|SJ*9#4JIA g oſOvSfWΔ9q7<~SӯІQ?{ M׺?Hc׺y /{^똷oǟ~tqͅ8_׺9A"H^m"'nqaҜG^V*zRu1Tt'2TuY+P:6 Jb$"~R?oAlkrkѝ=_2x\s`F:?m wh#Կy]ۆZyߛIl |.+ï2FvzN`eoݑ/OOIvv'8c}M (&ةYG"WaP\(XKrB :_r[s>zR7!$ʔM9VDAYT?[(|GE6VkW%~YrN4Z5Ϗ4bܵ]'%B2x"";:k䰵k3a|;c in iH\{mOܾ>~>ڷ+h永 n5ǫU0ȼb++ ) L'?nܲiɮNG$˸mH t7ǺU5]-#Mg=4ց@6&y?6 uʑjjQp}~΁ ^"Qe:S4Q%ap5ω*u>/}{Ƶu{ͼY}Fx|]o| ;Mx.fVoK "KJ P:-ۗm}(KI$kA[+!$UE$-=t`,Բ]Hݚ2G =$\{5wg%.c55t(}+ oPp yPj6#{mFn p$cD 6f!o{ cŏ;p6GXj^#?gYEOOi@T3ZD#C+s͟! ;R5t hvhXxygn:RUGdŽZv΍I}?٨Į (zduGԀG7` BLk/C 6O ALB  {zQ"}?zrkN=$RT  ,U:px4*nRXdh̶V6'Ic1:~ej}$WƝ8J&ݕOdB.ia[dR )A§ j/~^M:ˬdh5[]V/^ʜs !QS8Կzb~P0$.A{Lim'=m+CSvVjzWC]wK $5ێGK4P!O^jCZ|x%2lW^RT؊'j \^WK܋Ym[ٚWԡ1Rq:;Gᩝ7}QkWECUmͻNJJr.APȵ]%mf?Iީ7_lll"iH.+{;WMɷi'}X1Tͫ\ujڂX{kq^m(N7@?xuisoiM"Ӯj*E'&@ukߑɘ3V_D\ʖjJ|Gyh!iiTiW4Si(TG׭=^["ꪪ Y51UKILGeAs;T [eoCi˩+aHUKSFKoll1zI6Xe-up,OG,0rAON@h Xl#Q?iYsF`=+cI.u+EC"g[mvQ|9E?053t{$H󪼬@ꐑ$ lc3@RJ#U?3Y)4~R[Ӭ~%mrApf;+_GSZV?NЃc76{O?7#a{n>_nX&_u^E_ߺ] y#9^L_}<}>i#),G${Jͧ]+(ha*@vz>Lt Ox~}醜+M)ҧm `Q"4=2M5ݝEu :՟237y%DW%e>P32} ϰ- [IS[IykU?)ˣ⎪Lmn` cdUϮddh׷[xΑz7ԺKqG?ҞǡKUU4h$&V 5ZKZM->MnZ\ВϹ~U=zi3Dף$ZJu0phLa/<ˡ&DJeКz1^'JeexMRq?b=oN?.{NDgUkYbcN~ n&0&bͻ[0n#&"pÏit[GdLHVUYQb&CX෼ w eud8oyE2YECFqQV1Y` =w:H vnih[[H_RxS>q0x=Sc۩"}0U$\ȪPlH~g%NsX0 jSjxWo#kR8o@ol|rV.*y"Xzmf#sNXݕA@ xe45{Fy%ie8KC]dS'r.?.wZz lS4(C2iԯ!@ڈfyN1[pڗ߈2=z e <&FfA&7ڣCV#odm[%qҕ[kITbn{|)sQ# RE&f%zn"UpL?fl~q7kJ7?YI|$77r>FqN{7%CQ"Z)qGGBKmLnO{;K GV {O3}L0N&RF~Y"ct`nP]e#KcM^]5KUKd3%+ G]1:`Wti9?˥r8`QXu7e[#{ ](jWLAg<[1b -+}Aؠ]\*x6NĚ> 6T&gB?kУ\R@>RȒV`y|lWYZOhuԩD( gC}"\sՇ_-5/[`(v%>#pŚk}SspO ]}7vQ-,&IҐ.쟺]Zx#rĚPV@4./,n #5 ɤ $?,uix: 63lb#c(qԟs]ZzdIh|GR ,~E pM8=B'A-jO\:IS4Z%X߷R&4!0/2FMĻ{"”SQ ֔~΃2SsĵުG Yo%Q̜3)F%T-!l|CK@jzEƑ< u[!&dעk0n:)@]PWL)eOxt`MǶ6ѹj?=D[ޕPSQŷGX|0L&8XD$.PҘ3z\h$GL%Q\V֙LUG#iSPh-R4m?Qrtej3BO3xS IX8ҥ#.H\ZWE[O3=*ҍf9)J(W5A n/c`-6Ɔ'u(:_ѵ ꪟU^k M-Zn*I% :4cDѦIT%8ıXTjtXnHj\gˠ?[#/5r-~ݽkOӚ/--ЊZ~x=?#ߺ]_u?@-[ߺ\r_ӟ~HZ >zS@TZ~x_9׏ZD)u,@A#m6fPѡ( `XhEAWzxhx^׷7UYT2[sJA09>ܣK6Ia-{[=stTb?G:E ]=ٺE?Mlm;}w7FQvvĒ Lр*YNn؛}.WV=Џusܙ͑Kqgnr:ONL],9CGKWGY&&YX (n6+M~9eI&}82r8~]'*1 #e->/ŅAɿ]սVaur7=GO5=a Tc"A+]O2 2^.RR 5emH;5_nJ:(֡i|$iDnX?CG>CtnVPOЁ8x+Ak2:u EFsv#Ǘȷ-zd` b2@OH͵Ff5&Lz̮3=#u  <{{[;dQQ?oCN|kgF;$&eV"6_e1o$R2$6ŐҼϹkxޣLO$ٌs)|e7(" 9ٴ\ }?M{o63T'.Z^_Ic;vnblGCt6g}n*e'4Lyϧ rV͐ PKHBHQxp7.;pOBN9j@ 58cvٻs'oSO$q!"^jBZiJe/#d48ݵ+3*ࢠRRQbfH%wigQrZH__ͮmgVG?ů1r=KG};~;p-&- u`̮3SAzuuV ͗۝MF%QVrhp88l8¨j8~}Zgj$?f쭃״Nj5si.kݣXA)PQ&/ع{s' X5%R55*+R:#K[HL>M]00(|pzwįD ޸DK{1>})ܪD.9<mqR(%V9|#n #_.Jov{& ,Ft΍gPFGB˦X=?cw:mU˖ꏩi S֧sL|:):K˩ۧ 5%(N#W] i I<`r=7+ri! PRpxw?@57$v8h O *Q2X$>yuΡ. Z9zPӀ$S3JD\0G@ ^)%N]!(Ĵ#ojX0R5c-csniqta_ P/ҽpcj3T-TZzbXgDPaF$iN [U۱$ :^va8(_i:Amd!GDTV9WU\/ [d n>޽?04'ʃ^CiL99qIc2 \#ML;-K% \M.+IJ(A[ I=#)td-6bJ0+2X<:jH.OEsuXjeGwAkxх G㽞ծaIL>d.Q%u+DZ1Rd0(d@V Tcy:p>gP$1o@.("HdRܖt#H+?im${$$GdTx}/*#D@oyX. O~J<˥6bhgP0ǒ_wI3h='4jS*$UVB+sőz)T&DN#*b"Q五f[-dVҿ/NzOb)"Q^# ]MzjH 1eۢmdʝ^iහ#i4gۍ,SNO,LlIRIo w_[U.0ǢẶi*)֞LA0B@Uiݭ ^ c:gn=,R?QiAGFUp7ts+D'ukUWAAU$4n~HYl{{~9ToUS_Є/6?׺Koſ׺ߏcOxu,~C#{b.E_{ZcgAqkӑ7ϭtTDFߨ{oi$aʌEqЅjB9%Z'oDz-Cʵás p*W *cU6֙l]m(IT `СlCOS.>S`VHC[*@k^O~vbH _ĮdD28_QLTi 0Xɱ7'w@$2#ZYb 0ҿaO0mhd=Ƿx-!jUJ2}V_AڽnBA[E2ggwl,h:?w]% J%4-lC/k^}niMۈ?asۣ 5)04᏷Eטf|xܸL2H~&'Rxg >sd\zn"55TTԱ*7=}n]nmLt":r>β/ծ˾>Ƒ\1ӵ& p!ϐU,]:Ńpl5 [|ݬwNSݫ-J]Nq$Gȍpxy tn6&zZ H)gOuxP~{i}`Qa_E6 HO +:yv~eAq eg>cܮ&+Oƾ42$!Xu'*lSM+2KbدJ#}!I|Ǒ{Vܞj&"bFy("u؃[{yǕNv Z1\z)lzH;xW.,i҅I 5)R1_&Y$R5 ۙ%mDex֙E?x`erNup1XuHGk}x#ܛerԐXF䑤,P=1t6ve>OQ,u>\Ȓ3x,?{}M|ߙ7HoXDGĐ+9@s5|4s T^ZV㱵P @b=$'gH}Z?gݯS~.oٶy礥7|n)pe_M)sKK[_oypPdMn~LFi-o>‘Dj+\ Lqm= {y4W)n>񝟾0|3WCqTz9 S=nDun҃\3E.H{b~FXihOP>W+~ڵP.;oT+CrXJsnj `cͼu?Žsjbi/ƞyL`}PdyM Z m]V{ *h5A1Զ^FXTq u VthV}|ry..oobu*O*:kjy}_]br55qp^1I(TfY٘ 'O䝶x޿y^L X.WLet3I*3Ta$mJ<>ڷh]]v^Yƨ魣{DNbU܎?'*K~&SEt }>Y׺K[>7ԨRry ,/:zy P׺Rݴ<\{NFJJ8n Kq@@ A30/ֹ&qW35p8tq Ez}-U+)j'Hɦ Hh%Htv Rv.HK^,lc1dR~ɯ9kmSAF>c˥ nCVFCeP(zdr$USKdg_#t S)j?Kƍ>"Uk_?Zg6ptꩉ8\&QI/]j%`&Xۇ=/kAxd/Hd}p`WZq8'϶2@iXΦdL  ZI߸<"WsiZ[?Ϡúy,B+~= 3'MOKvr e'NiTivFTHʥtxtX=[ouK.o"2/O˨p^V,u/E+BϯF_htE;+wWbS-+'*ǐRsc+ Rq$y,-ŅU]KWЀ=\YvFj|H #!r3UVE8ʈf1-`hJ.U"R?m+8s>\\lmA|& hF\MZL,5hױCBD}[&#%퓔t?m.cÝ'Ҏ.մt\51BEU&n4,ߥ. Tld>TtOt7xژoA5W=y)EOLibxXj$E<[y>m\v?*5#zGQ})o6l{5 >L2j|6ɼQbҎ+, jd8qd% #BV,o_xm6_p}ߔ<%2B{XM*t7؟ue}~w5P(-@XP ]|_nZafMKRlĬn}ߚF>\ϼEC%JKpקaqG[RU["s }=m;g6r}ͅcJ?Q1}hXf.2>{k iZ*vi 8: m~Oso0K[)*2P/ ^a9Iʿ}~4uȲT>I~Qmm`܇6H-w;,AU'ʾ\|oXt ><~dt?NruC;+$54-UG 3$hXHp(ome\mYKpFBFhI " wOjY`.-93) MB GϢiImʣ% "bz˟i= v+P+ S@ѿ6ssgSl6n~ʠThMKS y]$/oy6 q}n5[ p]˸ )Z`@ A3~dҧ~NCw ېKxw<#(.rYdm~r{ gBY [cF>GRk:ob*B7HV:y0#ǾR`@]-_=ĩZ oo򛂟oes&Rke§#Ƹ#u3Y64#Lҹ?gs^=&>H`a Y xgqBj;ⳛ7tQcœNoGvoh`w w ʠPQR4^y AF gi1\̝a,ݙ3b6ԙjܒgo)[T)tv&uryzodrTkZ* I? X)q}1ʎTeZTy5O*W JXH {wB|b\2MIt,Pص'2;bӀxkҫ)wTt2r }$!R2u.>_KDRAU"@ ~9uO!Bzh} 5YX+*)[o*J/Κ8@+7Ooz>yF0@QOHidSQQSIIb`, OOލӚ%_M3/-8q>^4VV+ebS=$7h9di7T+U;,!4/_^v5??.|Unf:,^ёcU9hXE ~)W@w7]o: hiݢHgT:C( H xB_/ ۹n^~z+++ZHZ Z$eTH⌛( >=wHV8+!88XܘH:.bST>R -[P:"ԍH'Hʃ {!j4hΠ§k~FLIG*. ^=$Q+xyױ}>uŭ{xo~r/kߺ^9׺xXߺSȺߋͬ?I}QbCĭ/ NFqz:a6i"\IOP`DlcZ3P{>ln`>-NUz3IeiUSA4Ah5%2k-f?ŵ;m Qc:yT*b E2 |SWaq &A$'SMyQټ>yM7[-J<;?o@٭s 3 zVmݫ4& с橚5CUJռMң)s^6_un#1bܐ:o`Hdz'Qݦ./oK9t;Lib[*kj*'OSo>>vJ,QǤ읹14ZB?DQݱ܀¾P%%j?*ҧo|jzkktgT=HX}=c tcenЋ0?nz#Zvdb JkC%75#:`vZКc Ȟow+f#=l}Uɍذ2΍.NAo$2AY5qS$7?F{H:rt$.FaA+V4 A4=F{q;bs*OՌG#"W GՐ(iQqM62Ƕy #9/1;i6mcoqFmX^ZWSR>}b?:iu6 uS 1se+N|wvgi>S/7>=|tT{#Y;N*1=Ē5Mhƣ'A yku`i]m *,Q[GvvcO^s3y鎝tn>ؙZBVVRzmfm(6T2SY9q]K[XGkPG kB&:WMzvov+}q٭/":XI23'̞~/|_͟b:\Qa_!n5 SSJQ]t +=!mo4XO #!R?#5owt&j|&'Ҡ Qc矩݊2fSJ`I'=|ϾwpcPGE۽ILEA56]D:Hח[EYt/co S}'G{~4`;qL6Ӳ?zW[SsecQA+Dž[j*ʑ%4Uc1ӳ)lY.^#D> P8K9Ttu.EQӉ$.(~DZxS6vU*};%SN-;Z)c+h_M7okTДoe\Fzۏe^ 5xNeTarx *2tԫbJ8YC*6з~.wUS\‡AݡVyX"q# 4t9m9)% IQZh䥒6Y4 ~83.HU\StUuBqCD8heE6)#*"*E5KFM FsF((ϟΞ],Zg?|vA) hTHi-UJጯ! EŽ!@}75VV1"HbKOITt I q^qc.AEJx)玞qB*f p]C!Pf") 0N|DCKWmjP#[RˡAfAsf4#Kb-#b,J:pn./[lhJAB>SYRZ/o`׹_qBNJГǫUPmOܱݍYWDiEbJoxB8E0i/4=ITa P 0?7k>W$W<ӇGzF#qto⢧K"Zdъ_X6A;5l43p: s-L'n'|}`b(iM\Z"GZSfۇ6G.<˂~?>='Ӧ2}+~dz 7_Ќ~fx)<,h#r^sN{k4i!svN/մ44I;}gkt![3]hO-DGU?;%l5S*VZ1 4p,*%Xa4bĈqnBi!tI&A6Wi Hk`5 ANda6egcs"]oᎏ@3[ HڜJ2lR8dʕl_ڸvؓXN|NkZX)n-UZl>GI[;?frWа:xzR0L/"\>lobޠ]$cMx׉=Џs~lS}?׭#n,~>׺~-{\#6׺돡u/~=u*7ZڗG5\!$}E+o6jMGK_M:Ϩm4ףHtG} {J4b`Y-{k ߟǵ{tɽ:mv3۰`Xqш²":(B*"_ڛyBW|-˻[K!@qBN;raU`n o(pV^69V#_}Xa%g鍴ns}"UnuXOp(IXH8x E'ٚT Y~O#oJWt $O=*(vךhեT}.G ~m@TV}e""TP~C_gKM!h1vKJ?B}I{jf6D.kmB=E(~_J] YƐ6AC_yt mISϥȧIx_H1؀rM̓νZxB#Δ zפ/ |Y#Y%VhbuOoǷ^K($hK}Aj\>@t(s`OO2)MQT(UkH")^=iyw|I89ۃiS WCZ?_Fq|ʦͿ̉19w$olvk#N*8bmr{?e.SڽO+ϕa 20_^~ԥ䞪@RXhu7\hS>Y kdL_4?W'ش[Yֹ>nتrVrGg <>]2%~zPZWRSqnJ .mYz$]qKHI2?ҧQW#&ܲH^.ϲXԈۃr-[Ҟ^tL6u:+/av ??.V9foqc=##G"SG%e<5"8Noq_m6?yY #x/f`gW ٻws{8/z흻*z%EÎ)kI*e=9ÖwoohY qB@A%Hrswhwi9ҁ[Gyw6nWCWKKWw)RHcaH,nm, ¨⦘#}߹x?::}-;tWQQ_W;)6%Dw㩶9):R0lv#&v!Ҫz n<{kZ_I"@v&EX(;Cݝ;kw7J U LԳbicEa2VDV[c5}DuRMk:3vYld:PꩡT࿒LzXJ<'fL4Ie-Q<,)cX]$F#[m UYTGl=6pۼCw,`(((,j)_2;ݸ;32SKmYW &pQP>=dH"= l|B RXj:n> b cʸVUǸpYo۶fܛ^#zJ։d7fS%3h5(-\ٷ'Hc$?X=k#O2'[JP""'y[Z5 6BmrA$[ZB+Mo4N5CάHga!sSH($7O$ڕ 73ɠW֌jH@mj}2Hhخ&!VoͤKM'@M) rɏ3%28>  oSp/U:WځBtF1VBT1:r,R+Q-U6 GNd>-#TbϏ{iԆe$E=Nas#Ǫᙸ%,}y"yPє R UkҚ{zVN7?Oox*G;tJ  #'FkѬ7Jk v $R(T[. 瀠h9cle F׀xz*'siq=%S*2dhPydY:6'=%zcfYIBYc-ko{}};4ZR/ ɯ\!,^3AC%""m*87 H[0K d/!O_О=-!I/iN XJ\FFФqbs:+$*د\ӥ;ϷŪt}Tuq6Fv*$r$,$@K$zN(Tj EMZCNUzK֢85ԟNGekhk =JSAM!e1դ)#[Ȳ)U➼:>?S )L\]_9b*>"sJⴍu Ģ.ZvHFlό~_55Q̤JȨe2bgNew`>)Z3s\U]Bˤe71F"ti *Ymm l 5GB1ϤRȔng>JuH$g>2hɌ(`3fJ+GCʭ`#ȆK5G:#ژzI,? yf:Dp}MϵYFt_uЏy?<}?ׯRHOu?ߋ^->׺_^Ksa=u3kMqzyqFREqo즎j+L~`&}R <-1q0ȹ7{ ]\Up+Ԋť 5S#O<:K(>%,d0ܸ:3[e\ESQ^h{Gi [z'?qMF̡H-oYTK7)i5{g\d#@Ch垅|_bvH®PiҺtXxQ~~!!`xޅVrUp@vYc]Zͩssfcx| I.c|KhIP'Q1[,oqɷqGix|m<ʅExgE͚\r1.TIjQ3+7 k9҇F3ǣ=}6P <>sj-²YDʐ bny'۬X:*;$Ȁy잳ADa" RI\'ׁU$Gg4r4EUu3ҪD?$("ʬ-m'Aee?ЏјT}}?>;[nl>t#1 U=vJ#IdWA$,TwOh糌vATu_{G=Զ䜅ivGRu7)HZv ʸYD/ ۞}[w%nX+( }%q6͓? u'H4{ N끨*WH!@sonKbPy_kv4]pkLm_Nrd_EKBM$@K/iÁ2 :x0?etgyygS^ J)<ǐ)9>5iVI\}'1:lun?wyUh7)couf_#>?vǶ4z`uMV.5=ûVi {7-$ U>0Jͽ}LtpՖ'#Zb^`!%mWrRVbAtl洦8VQ[ o>c Io*رS-]CWƱF}L%,bHmtt@ @>O`+x5KT?ʙۿnlq4ZPv,o[k7 h#*UUfEo9>Ҵ:jn.[S5-^ۏ-+*>B$4âUb2m%-e9zi {iTg#4 ]{lK{² Çoz{ooMQGޔp>&Jj6b Ŵ.Um̽3A?,F'+'1oͬUCi<N=N]K$ HGǏGs]RH5 kU@Z_>K+ hsZӠ-ښCWʳC"}s}XSbI[X-k]t9hDT ƥAA3kG{A4tkOt}zTRPaXU&ꡮMAk^Az>4 pGP)QY1=3.K)Tc_g\ncYclCcjPu>ZM\i?U[r-RMcӥ#Jh2GhP׺?Of^ԸH7X%O>EآS@I#>WK( I%UZ>52[#})O Sbm 7r7bݤ"fV-W:RT>cSAS)!U-=,%PiGbʹyX˛e@bf\5\|OU +iI'5|I:k/x⊺(wwѵՐDt:9e $KNH[lLԏ ,<UgPjz+tpz*OYIJchc>:GP8٠* ǣV!}VgeժIT)V?pC/#HI, 'BxҭFm'B،—zeJpi*ibPu* Q,cR ~M*ƿ3QQI:%x Qu h]l{N:hCk;.DH2rI#2=u A-*No:ʱpl}Gl/FZV:ЇbO#?K}}o{{^O{^뿥>_ǿu ~[/qǿuǞ.#ߺYӃqߺYQ7?@/l./~ ֣={`/sPZ Xl2,~UrSun⬢У{ySC/7+nX‡k+5ON\[hCc'zzAnhTj 1RXj4bTl']ٶAARE%1A=SĐ\ /A8*A^W73X9ǡ$mW"e*ٔǞ,O,k~{'EÀ= g5]Hi$Xl}Q7A=0lrdrJFF^JGklsH9rE`'39yM\ۦZ̻9h{ӷܱFw+ӢAXvljs4;7=I]#ŗ )Noc?v6ΕG9F(vc_qwq&<Y#KܛgJG?[B^Un~RY֖otUoNV6G A%L#W(#uO%{HYI!8kOM;pC-G.׶rU|ܘw3wJ nWYjBekmUes p£)=.qH.iZƚb~!QCBtYݝqujJfyO5Tz=DŞF;IKXڦS^'>ױ77ЌUWrda%r.3MvU?C|ܔY֛b+([k(2Y' dn9I2š B`Nfܯ9z-bE;7,1j> %uZ$SۘKkݪH*EjuPE=+_˯.#(6#mλK{9S# rVVu)F_ ]]ܳmR7nv|RG+SUDp…}a?oyO`m+Ef)Z8y12mnf'kcP|=O~{'wػfSgFj]᷷2?s8 г$f7tWb"Nn$e@tUR’(d>PK9~iE<fjCCCCNHez6Th6RH%pͱY =5BDWaݶ?T{$m2$HPbK xȒM:/dnwo׹ei ԫj60z'~/=鼶߯ їz{^hda+vbSe]XEq*FنGqt&hG_禽O7gqw&K%(= #V؝];ªlOfD4DN5jh[>p`$_҅i|=igYo-#4ԚsSciC XXUS@RcSceƉp ^ἵJi4>cO~~GӇ@ͯq~u?.N!Yr&8xىWU!)-=|' Y tЃ \4vOzlO mc'P>]$k9X14DZTx)IQtqŬR0իǢAhSC2BrX7ϵonkȢ&iӒ@ \d`0B_dIxW! b9,w=ݒ[ܵ`E:pҴ!͗H:6PuIƛ~ú-vXڜxCTt \!9JR2Z'fISٵ+ےTmrKyevzjV')C5m{`%/W"EWvRέQP5q{.? -US?o,^3B\긵Skv{Ȭi48Z]x>v?eSb8]E3I,3f" = H'Co g3s*Y)e7-~3O,XH򸨜$ZƲP/ak4#0I"q:nMkLYR^7h⍫VHXZ^($-p~-kŘ:Y"2T8ekgX!_#'3-HQ#p_P b.1 C]">j;isqkݒVbL9*35"U,}']Џǽ^׽ago{^ߓ?=uؓrOd[lG{^땅"܆${<~A?Uf$tu&;QNUͯ'r} Czvxp~UudYd*@<:pZ|sq_=.ȨUK`xZ&!vYTu)VE^<=w[5<-BMkઞ9{^,u4fJ_$^O5*,[ʃ-nHߡx;=KCe*,Z#MY5єIXĊ)8Lbq  ,Yo7A]'K}1R(44z끐HFBbU2yۢJ>ۦ\!1MG*ES݄Hzʸ'scLQNgWִ}HW _C P3xۯ= b ] Wz]2Ct?m P+ZOG?'Q3O:k"Sa,b x7 M>ĉ=z̪ޠt׍}6ao7m=YbƞK.EWc#n$S%@\ٮx W,Xׁ/=M{@koſ#=ӺbpH l.}?7[߫z֘=x}?퀹UW KWy[#6ڟ2)O+jYʼy~*Jp 멭nlie<#+lW2Mk_|t:ZS߼2O53ٻ[vK->]^K#=KUVO'[1yjJa㥭Zx9yrlj'JEQ֤yMF''zK$ oaqao}M?ٳSהj fɷk>:'TRF/$񛧱k+e읍]{ 1ui[TBu|m\q-]%E>J1a@'lM%-Cb~d|-YE۪BI0:i7+$tJf31 өPm#I j$y! oj "y'] L=q 6wn#FBzEg*bQ9I D1%>n,f{ ӎ3CN5 B:+~nH߽;Q5RG,Z= x^Ȟ!F SrN)ޙޗOH>YrWQ=mDlKQZEʣ؃`xݼnwr~yY^F' h'!@Z|#ar3G6&tDj3ʶS0l_د]{%x־5 cPkrQWb+Z? k;Kok:77䋏wlci3&BqO`bIfOR{JQ uVGGb;a"6Ţ#l/cQy־ҋ8u̚߷TTUPQC]/,G^^G4)- >:@K@)O=."o#;*B(t!$TREl攔”(O'hI'Eҧ3ʕڒHv ؤpHj$b=P4sQ\)4j|Roǿu?>׺oqo׿??Cjֵ[[ߺ\ Ԏ~rnߟoߺ]kqa.ԘͿ= G(&WM/<}E׭=53Ǩ${GqfT7TAm PƦO"7R}yܶACZJ Ә*B)byި }{dќR7-tt#ѝR%SM 13|s0!?Г5ŁdV=O[e*Ywd׏ɗhl5|Qc3oIfTo(,-rTnԏQݻx!ܐE)t읍#OF"dSe5zG?}6Buw-ѵիj'gqS\t9#s>~g;q1gμ8~NFɔ1bTR ܍Kkp(MfBFӤQY_{;Iǟ@mp봦!P7 \\ G4FESbOHb4֕=%秽64a8E,?æք _:OFP}@"?saCԐƽck_[=JVBxtWggnc/0fTHEno-U,,R1HOM${O4 z,¹b3Ah>*`(:;j]ߛ1ۗ3͇٘ʌö1nj["TIH*ۓx/W@Lh ,hI"KTbTj~\iAWJ(/bIO'}yWFH)Kbx?BHO0(h}zE# ߍҁoPzJ~\8L0$ӣ3q|_m ZS LbSC_K %N%I R 7Ͷs028x䍊I.CG"ё`$p'1A**0+ [h'`ZꍽG-.Zj@j($!rM<sת-,[ \,)^1;A="np351IF`>)`!7,_/j|eU>dO[vGkndy}6mG&nTL6Mh h{#j`xJVSR"(I 94@Mu05-p1\y_;1{%2wqvݠSc*7k㶮Ԥc޸ ۴SљFe5mN+囋hr Vg&I53WhԆ9.yxyu+8P:AKp}-uphV*)%1<21T`1k}cBwC`=Xk=j1W3TWT9M$,%\3D$1F6ܒm+J`86x?}O9OY\l\l!ICRPOovNauGjCC>*U`E 0K]LzQ#xg3NdHafak4qoX42А:C+VP16my[a31")R)WUNV:6wwml&ؕU5,6'L5U [@,f*XsV OcfЫltڢ\q Ѽ)Ο^]5H[>{Ͽ+"EvVhH?Iꦠ RSS}INP9\NNЌ$b ƀO/&ޔ;B%u2 $k̄?2=TѾpNI(77B ȏ#`Gmqrm{1hT|#JЏ//ϭhvg{}1r gQ ʬ Pt= EClY$&qZ`[Qt\{S쩩⦨CS"F u2h#SG.m ndHSh+X@W:T=UI%C= }6i*V_S,Z(VE'=h+ZJ^+OOϪPW}UNr%\qA<&C.i' PxwUI}TgaH%TF4ҷ(DC,atT@H T޶U'HJJ[=1x<rR'(xv| x95G?OǷ4Ӛ BiϯЈMyߺ]-,a}u}/kpym{fock{^NG^띯 7^"~qsމ4={EJ9 ~,HE:^~ْ$Yu1볷C,K$ U[X/a›X偩!=^Hx)*5FX_EM7_ <lwk"KorTƸ?oGiUJ V@*D"]m#tH;|kO˞v[i*~Gϧ*%VI,&v`G,b:2݀[ 6?O1"A$,&ˠym,~J! ihވ? đGW+[=8Rtٟ:\iVxdWs x,nYkr{(?)Y>="j(oa} GaM*z=\/$T67MڦI5Ԇz[NG"sڈ$Xc,=&\oמA5:a#`s76ET$PHrH u#$4"`~m`FOUd᎜)=,m]MI%LUSӵ P=BX4Tk.X@rs)X: ylM_ϺWzyM:{_~ WK˥ 2eX9BќW0:OQOX0չtҲPtuoJE0hSISܒM@[d^=I4zU2c*H,-?2.Mգ%y"0˥wt{(k Q:q]+#uLHFu1O?KY]Zu/!qDe_De6d)Nd:Tnooϳh7! U|ILתĄ<:e.a>_P ؑqs}5+:ˣ4ޤjˈF5g2yy6Jz(cqmԉY%GMTp:= ۡLqqmd1-UIP!YO隞F`Mh$UիDRR2Ԁ<Ÿ>}OYm]Ŭ+_0|H )/dz] ʆR p#DQ {Zu[m2Fe N8sشh$^W՜mۛo `4CXyHj+`K^falg:  * Nb9ͬ+9_cFSreq)%mdRq2CK&:0}=s,=)|:! LjT+JZбKgk1JI/C5D2)d@LH9 [!nsM rf3p 5$I15(E<)jU#3C}Df[U cyvڥ/G4?HXW<@ZYd+R&[%~#4!d[J.@|{eMPqŸ>lB16t;)R6&b%2F2JEn8$}yovrIa)SmWx#DIonQJlXuIGzXi`/,p 9n--Co ּg$2HJ^Tݿļ(LdH0F$YE>?Sj~h#ЎKB#E/j+k&҉XڢHêM_ 9@VC^Y)?o 0+D$I;@G$b̲±w )!$1tglus)]fgAHN%pmP׫`h5V1RSFj)e$?Yd:%QJp4> (25-0ԚY"h|zZIk9#Ǫ0 Rxt?_m?~}H?IQ]ЎIU8<s<m>׺ u~~=uI<}@u ߓž}=uZZ $=׺fAaqap ZߏB7Ϫjʇk-okzugE2ho&>Ezh/~?O~fzztGL{h˪ʆ`?@ד>wqJTч}CE%E,*zA,SkRDIyhoܬWP=&U15V))cy ;ʤVeMretr=:W_=樦a s]4KJm`_U}O B{F~~O܇fY'dH't7Iu̕uꑐ/3e#i6V5)u֜z5v/Z>o GY"Q P` ~dKcOaitv[ڰ.8|涤'Dk݂:X} JȽ5bju{ RΌ/p i Z@!=G6ƹ颦+-൬yٔ.)G=It[vRX.+ңkm&#rL$;2wOUjحz9`"isDL rE-}ki’LPL~+\J Lxl<Θ)an/$X~GEqj@EKH8jk* iKK@ܒA$qt8ٺUPloK>GXN=@ϥUZI&9kf,0.o˥41hNB [>Λd?OyxH1RDqĊZF[R@3Z⾻Ynf*٨ڞWyM|U-poʏq&-5J*~Tq1kċn SSCJS׏hf>!<5;UUmt"IZHZ1rK";\Gkv |X*+trZ%K"8W-}W:Ǻ>AnâO}ٙ}Ŗ͛geveK>JNtt>ysN2Al w\khb sC:TZ`e,<Эi3UNW&4|LȌ8I+i0%I2DSw>OdSܮQ櫾\)c&Rd!(]L-MmsJ74+ݸ˵y̎<}<†;!*XLz״py*3狷y{\&1&HQVaѶpە\7CD`m huE}%>hdN֫szl'{b:zEݹq{5I]U\y#WgYn..BieUAQІyk9B ,)b aW 8դOC7؛g6;xe>_;2iqd1{(Q d5%AV`ʣWew2V=O.8u.LjkfQEhFUNk$;EK:sY;O; YWE}f*jX@qnT$mحvGVZy#R2P3El-*Vȣ}D֚RD )!}v% |\UmNi} I`ox*tTfEVDy@}BV QK,p+j7J=8ӝ&Bj'@b)6X9'=\##_gIYhALEAڣ@d% {嶡ӱ S~ZaIVHiƉV/+_Dܑl-k?GO`AKԑO4VYljK-),=VKMh۪=zt5#/(H:F}<?<~z`CAЈͿ׺a׿O{Ϳ"NI?W^"c'ߺY/nGA{Ƞ9=Q;qn9o3K8u k^ĒO o pX{3:øf|-n>5mB?2Q]ECe^6z\4g(ψ.ov<4 S ʒ2 A܀ӛm>I2:.i*kf]6o E4[k3rQ6g7=~F'Qe+);e0O$PTYԫdbm6qjv "(UZHoiILRC$MhAa.V~x}2x~ػN[6oQ@r0jѥ`c* KqvmUWaUdfiGrr=UBkCI ^{[{?wFV&fWNiEs 71Q8M9)d] Wn]fr\|d oi !: J֞u$9G ^h@h‘^u% Wq?}c=+6utvJSQU4&5<Ę(ԑ%PCDLJ[`[mÀ-)E8Ѹ1Qǡuq߷+Qub 0tBC `TuMKZ,vXͻRdtxlZ_* l u_}`L iO)Z.(Pd"іEuƕE˫H!_$~,t+.-ߏSjcqndk u] 6+`}l2x.m$R dҢ F^r=m|o}m\bmMm*1EI^CKAU?"zWFiK|fWDGa.=G1.*j1T.ACG8ǞImsoJ1"(G \2. {GG[ UHe,Xʎ (/ j!?6z+pl}=.VD%U%\-H@ghYUB YmM2\PyPz{OezSDҕ*uW9:**ҏ(gX稓Z$pU{‘7r${<)JoIRWHZKE7{pҴ4?I7 u3Nn]uF(*0u@sͅ `t =2W4P),JPq"}"4 9@I}iBaiu-,y? iL#15?_'E5}.IaM kX'_ВX?}?ׇ&7[c{\q{~{9{BX7 X_>׺I?Eu_^ߏ~LM:lHҷJ6$Zq=4ЗCM_qZ=uFJnA?fVz&I@4ЧՀM!o7>/ :$܌xd#mNa3S#b@G$鸽oU%r'w;HQďڇڃ$fKVI'?k=9+%<y=gTP iU!J1u#*u\[=2?u|Iln ;?*WJxn?GbO ٵ@ &˩qVU=,`y#rGS{5ܶc >^ /aQ)EY"{Hm꿭@@oj.z.hQ&!_/HꚏvKH25$IR!?}#=jU5IkF*\z w>*"54zAvfPXC[Mj+;j$IU'?EYO{@sV$Lke->֎.Silc嘛ےߤ_ϺUNBJ H1ȩS- ܩhkBmNZl73 ĝf1”[zef*xk2)?u^*V2D`EwE(!&u*P(xJ`$ʩZTO1B'MEiҝgALBAK7jm5$[R%IPRPoAbi76 .-c}tDFX2z;Hzt6=?olꫭ&(A4`<}m6-Ƨ^WiӤl+w7}G^A8t6 ;?r1ᰙ}ǔh0(d+M 5aN"IfEySU(+NsL++0{f nɺXյ_p1M V|0&[ 0?KokrDƇ>—_N$#qOMQ:OrgfsfݴTdϛ4;Zh6KM+y#AQT-]!vi}6 *WV|xNό+20Sm_U5\M;XU2 [m\]ꅏֲ%eu3L .tV*8~;/:xb5p{tuJM8LF|=Jh 7:x!MxzHs4KRˏP?x +}fs,.И|lܕzvyv[PTG4Dޥ(fFDS&:թg'8p G6'l3A5y<_UoylDy N/(ilP*j$qZ Ȇ47xASlS8潟nEPM0o Lp󨩯O~F"38-߻G|.Gl˺X[s6,N轑zj|Tzjjxdzt3{?;X-gDU*3T#}G#YdDp I |V8c™/y-Nf ]~Yq3|Y,ݽ ,ux+:uVDJbjeX,|i0Ӫ;Vk@M pE+^Mitx$cZq 8T4<ނ۴k.!TO_5`OA1ݿ0;;7LT/Ş*ԶwF ` |s,dC<>.E ul ,LG4ui;Yw4a߇-BC#N C\RK0PV#5`|^u RƬDT)N:Ão]K2&alkzn٦3ci&h>8B$egHKX{,0d841 ኊO2*x|}vmlN f`;ػBJcSզ*%)*|}RǡAbb呔)ESx֟o^;hUT*+|.(VBsQ'lܙ, U}ALn|W|2[̲ =s&\xbJɯЉ%5|:G˚ŷsTbg?=Wܹl!%3|JעqMTN%T?P9j@$SêܮZR g3nv͏]閬;ǽ{ a3jJY$gh&ߝ*b<{2X4?^\22>j?m z/ӝȽ|q{G~E}@E.neq[`CQĐhsgWQݧH]kAQQ =+5e e7cgv$ZFxKxMsuy RZ>_ fv?{7o,~Y.!%[7vol޸&XݯǮ5 ܼ-+gDмrƂ8d#H@A-kP?RTmc]ݸ4ݘ?6-䥥zu.y3jM>^0|,Gfas-ěGHMnnJʁ& TNݴ$1Ai|=}x#v A쎍e]d,n44f|zO{O:TW=ѿ;adm\mϰ6^ꂻPqS䶧ac4UUx:\%Y^ ouiGUTiMB5o r褠`JQXNo۷\mqK#)I$5IZH(T3VL(yg(aGY&!۝TkoN6r`C 8QXB6EGQ5ͺZ;,0GKZ H\j,{HW6 !F?:$k˫CIyyvE6c_XRO 0570˯ZK\/؞˝ )n@ÇцrrЫsLyW[Ӫ!WUVSO9 ḣRNmOgn`Xo+\][C,2@t` N6e-͢7'[;S4AEVh>c)Nj G齚WJскxS1HimG^܂u7G˾P+_NS6OW?}$QUawUJF7zOO {ok[:hG:OODrG6oNITӪjYmZ^YVoIt*?:t}#<<['+?*gV M/-]4k >#=C ~ŴV Q?v<:ILH 6ǂl.o>ص VVQWSԑppte<ˤ&RWid3&$H?{Q5"P(bڹ4Mh~}U<(nU^G<H']V=+_vk)[HA|K$Ë#^@߃-hёt{bVhhs?gJΫYg6[Mm.߱7.WE{yCSőzo LPEnkqFfF3Q궷}ip/^fޝSJnhݽir;*>n G~3? nVf*ehffNB>^ ϟ@.Rw;s7f=rRѮZJ&bzbUΥDylDx&41=Mϩ;ga-JMha[pdqX;Vpń͝۸6͆M3]#rK~0"ofpIC_>+^jE*0'Åh)tI6ڥtYN/"LWIwnas g7vVBZ*ڬF$b4Ҁcy7:/m $7- {MWMM:<]gջeI2*TتaQ5iA>aVƀ|NO:#[U4JdvDt󾳱c>J(5c&J$:@COc%A{^&àC1͑jk'Q"I7v~z<-RjcѣTHR8V#IUQdžGE\#1"5'٥<:Aϕ:t؝B7WF׭T)wpq}XNr+\F|0<%N[ FQPİ)h(~xu5d |?XS2ZZԚlA06"5A։vOB MbSkKL__3:W_:yL1rP w$6 KǶ8pV:Pϥ$xS5\uXj?` OP;yؼ%Ne8AQQe%B+|m(d: rŷOwfg hr+OCCãmj-n7IfV&Tv0 ҵurKQ4E<$egfXR0@Hc^ʠT$y˦'|$wbEV$*ΝΗa+: 򝓑i[y-YF!eʦVY&XYx`A$h40UITw7P]X_mW3@&hf@,k f͛oɮ{^uGan޴ P.%ܛdnJωga(aEOT:Vx ɒ"V7fV$8uԢ 'H0&kunVP4 ]*t@.ٮ*w.C&Rǔ앦ڲeˣMp%1̱K_P吱8f z1'*&Јm HĀ⤨ j@4f4v|a, zɊh.^;ӽ6ZJj0T0$|ۤBF=H+|t_{nPcOd7δ>c=?A>UQmriG\k!rvEF1"JlQZw\hsx7CDPj1wmv fkRM+}z UH$xTcGXs瓸T.D h84gʀh#C9`t=tJ\c²N1U "\BKjG5]R@NPbAP _E*iǧ\b|M>mvUn99eZTb6f]ha/"K'ˏQbr-PdtcvqS2 6B*I:*~cw{-J|0TfbM(rQ"fʡoQn Пn7HU*ꝗK$=j͠mȏV<]?Krȁ0W|Eqlb= bUym3J\y5Iang| rXZgdVUd+2}9Rmk{7X6K΃t{gy}_ F}.#6 ~->K ?%N`O[ͮx{mw{ F$F Tz2͸l#'JX@)U<&jB˨C3W+~D @{wÉ2i4 R>}?R5i7 Eq ϧG6eR,ѷLp.qP @lK/7[qݞX.zv=;mSRg+Y!/P>b~?yBSEGԭawmz%3äFgpOvpA[}}'qof}dr7ѳ}꾵 50ݭvT~}-YBHAǢ{pm7rF~TL▐> $R un?Դ@LRz]<ϣ%3˩:{vl~;zc Xo[ϰe<=bygGa,Yn`QA'&*z_g%V $[M**m<|)N ոklmfn^crYWNzdJ J 8s?$M!+4RV@q=bD ]&MI ȚI- r!cU1f}AfQ zg: ?`mWSAVE6:%VEJwk/H^8IHTg4:ИG.}?.Y\fx鏩Blk{2=O@+O3_q:HpY:,Y*g{uzb8E 4-3ı_}0+-҃nRJoh=QOJRRJ ZU#dITVݰHW=/) FV\n2p5wvKWZZh]C ,U͉{'s|>u|=ɱ^>)rdk#:JbQ23fz*jE8H<{45BT&ŸgGk t骏1flhۑ#IQ =4 6(Zy ; _J1Vh /Qzy9ae_d;#‡ˣ9޹bBYSId8$3F O4dv+A:ǷXDH$$s:u}RTa2xZ3FCG9-B !hʎG3 |N?xƊ6WHh?n?=bl6c)iڌ5(ʬTΓkPdw4hΕˢ)h1OϠy߃'>sQ;3%-UTB|"5*xf^H4njH5C->d}z.^Y] ш_x}ψ5E)drԯ7E|U\U,3:uY[|ެmZ6Kc?}  mߏ=+G9Ǧb,&k+_M>x".&V{`4*۾4rʿުi8'k\ 0hWįԒSoдׇIY#s!)m}QXoo:[)sNЏEK-o}uױ{^.8_RGߺ]?{r9~~[H >m~wZ=>S8bOeVRJ:L$>^  Ҋ'6=9xէ Pˋ6.qeS EiǥI4GB.&,KeAI_Tr'*HB.6BxuبH* ϲ/ o^YR`@j_AW=,(FCXV$HR ǿp OQN$:H8ϥe $m`-6an/<.mC}-5 y>sd|xA4-B $? {q9`LAZl 55)ԌvZ,e9 WiX:Rw˓ 6ݦ6Cj16v,LFUakrO.b{)ڸ6u@UEq{.ԡb`jC_|-,ut=ȷNÏnWw,zь[51G=fbXС_ivih+l1_Emhns?~?_k ge jjxcG+?GeZ Tt#ɀq4Jk[r?޽\ '*\Vu <_ތҍ%NNpE_2IU㞖E"[sk_ϴr0&=<-XcAOKB!#6s{LmF$t e:E:fRÀc(*⇣;I UPPudVH^c`H"޺:[\Ěiz>jOM}mo}RBJE"  DrAasLiǢy9!" ] zcM8'}UfbTꯙ4|JǬ>6yT,Ѽ):xD 4 pޞd+$?oK{wy/1BF):+&n6|& "f'&:hHedR`Vpq,s[*Ir=sO>C˩;;7 x\55!XVhyVlTϦDX7f/B0dU^癩%o8bJ[S|zUéik/2>]a)SR %xuwGh' d>3eAqnǸDV>j&1~_˧}#u!ePvXhYɞD X*ݙ{=z}-V]10i},4u Rcy'iڕsANV:dzJH3ȐU Dh$‡ "k#ȭkS_ .=!2UupGD&"V}Gz`T:АcϽ^7?^s^o~v=66'o{^뿧ck$\[}u&bA# doS!a< V J~}9Bߛ?Xytqӵ}xW cQtو?Es8׹{C.n@~]+I֨>}(; ?Ky#/ߛelIGҲT.TX /ϲv@G Rt⿳3 Hu^/*OLOMh~tqScᨔ%CcyL: W9TRsJ'oZ=Zt]pu$}moҦ8[zm*Y6)e<DzsnԐ pKJq˧,3>jra=!<˨|?i;ڕ< Iu]HM@ׁϳ(y9EDZt>T-!TF54  tr bMZ8Fl*b:zh|T7<^ݍ3ngXx \Tpi&}(`us\r+m1DI:\,]b$R]5ˢ?77w<OfZ= O˫R8_// iW${S̠jzM'-,#fN[lnIxw,Rƥ$Cs1[L!W^H7'q,\g2@[Xe[^&b=Gâޮe?'$SYsp sW=qX[ X t&R OrRE=фmJ:uSm<*7 6Wy !Xނݮ1џM(S%v.uqƥt/crI:2SpEErP& fYOŽ'dz)8c³SY1T af6#[kUV˘EմJ´>Sg⡯g1x`qU3"2D(!둥YY፾,(o.4W 41f[ n;5}9-0GkimgWH/"TkIeV}6,ѿ{{~9F=sq~ފnyUd4!_|+Z 'F(CPH#!&4jyUB=7`lkBmoۉ#r|I~5YWwUckxH{>L?gU"G3^HfR5G$TIeb#܋ܥ m2qSNm";}ƧXנ,tsWOsF#v& R@~ҩ#*3Jq#7U'O-@ kץZ혞LkXcВ X~#IKS~Ata,I?‰7*AOiT³ihbY`H3$QU.H<]ިJ"}qz2Kb'KRz:W5}-\N!EG&L]==$uQ4R )$9BL%}zFzš3"M? O/ZjyxȚ:ؒJvN IQ*797yZGWDҊ}1kAPM({U1Y`>xž`PNW= 2Օ3$ s*L)kG$}/ofqq>%NޑUHԍ1ʬwe7jVb-sRMk'Pt3#1UO¹_K÷x5~}3O$IoHmZے>E uF=&J@cr-k8ˤK4ڵ,Qmkkq{{V0MqGtuY`cH XOh:Ж}8}?׸?ߺ] }?{ ~pTp{ ɵ6XqD@|\ 7usɱ֔^2j$}y<Ƕ\(=kuoNC?I*@؆n\\O,|3UCGlk\> hX?N5%`D+q$ DBk5MǪ(G1i+5*iDW~Yk?)W&B X#٢۸PeB%:NTn(Hʋ M|܂6>t-uTS+ɹ$sͬ8w 5znۍ&[5jdCq#7<_bCZ&QOӄ9Ygq?K8=#Z[=OXR}cj:dJ~HۯD媤`пutѥ6FdXdfY"KY'0"'Nr:ݢ s_ˣ]Shsgk,% ]NM+K5%m e*g, DfRGyE,R>ӁVG Pxx%_2TTƟ1= ;*lm5(5uPH;SWQy\V7'[pHeGIȑtAZ:2HGG{_]CH@*ԩY)S}$E4~.v@4>ޖZEysr04['#U$8d8H {@ʖ\#9759M4*pa99>~]SE<< ]]s+I}N%ax6]OKNr#̰F&cd{3߃)M $HN??G{n#y /H8GQĚس`9>2~_ˏzwŮҧrT c i sjYe"C],hnC)Z( s\yy 5w")J?J.9QH¦zIJJRfXe3 znok=T9sN$ O#e?tˇS<(EG<ůb}ܣ!m>|e3iҋjxَ33֯#bJ-?rΪńW ^(44>Ew9CÀ?/?OhiIX̏U!֣Ze%PI,f)1r.GB$0WUUA5':T,$EEa(FG*t_*&ψxynlD¥!,D`TuyYX= {@]z- p| FytE ꊟh‡:I,I~M*脱 M})7'HZYa)1 ~ xf#N }=4:`5>?tMuH(.  f^jQ@!Kq;yt֕BQGBXVeງ!xNJI2 miVt[?MH銪h]@`Aኅ<n<L. zgk7jjiI8=zdſTF[_h4/IKP1З6No}?c8^{_I" so{Z׺M\؋Z^P8f[% X>߈WS{Z~=_-Z:>ۀ ֺk{Z?_ߺS#7"Ā]+G?^xߟunéyv6_ln)X_9? O0%Nq6#xo/zZ?.!C{{}˦AӏOTI!:c.ŏp,8#iX=n@H=+ ەTZ+"ǮX=*$cg<~؀*Fdp Xu`t+B1\>c?8Lp%f$ da'ӡdP̺+5<^e'/i\pABwл'YܸKOO(q#% e$x#Sܘݸ6Es?X䌯 @ПU&_7k125T)Z V}z2۬%Q$2V gx?ZI3j +Tv]@qDz= +k* 5a*olmU8 ^f5x%yjH5v桧M#̮d#QX{w2ӅkOC_u{6w=b^ Tړ{[G%.>:JbYǟ"1,VIi,,5~ T8|"|OW'QI be5H?B=*BSGRTr\(0*|Y'tUDcE!gud 45IPxS|_.޽+)|TU<-Lq@?} -fHܒ଒H:g. B??v n'5?.? j5hIAI,q%-峋*"}.`m:I*0E+LҔ_e4" >_잙㣢"J0&]ds>׺X_@׺rÎߐA~gH67sn}?^Pӫ Ců?\=ԕ6__P~JC{yCa9JA ?O͸_G=\TyXlHx?B~_l@4h;@cVV,H?7h!ڛXʱzyzm*asm%l8FmTaQ>1 "XŬA[wgѷTFXb _Vo$J)2HOO#޾ q3w[ąYC*&TEͽ".e?;`/\[ݺh( i9l~-O~Cp!Muƒ?=M?}":M޿vÏPd?܋[ څJd9bzIs4N=77ϧZowj66 ]k9coС{~~ ͫiYң'Q>sI㆗7pU L^0Ud{K/OFSJRtX}<>b:C,_{IGI>#8I(| KFXm+DV{{eZUtPXM}zsM8~{I$uq'+3ҋnȘ&0S8BFYm4ƬJe*͊á2ngi IK H|rQN '{{sE%_^wMJ4 Gt.mgI3DP̶ C$(rGQawc(*\G>]nߝx/?d,RůMxc:t@ 'Gw_gWmGH"AmsZQϠ5r+cl8|>QyNX ѳe!Gx_l<* O>,wX 0~Ϸ)PUGO$ #Y%EH#@ iK*$>n,*"%Nh N?-s*8WЭި* Ec `Þ?R LE[Q\ytϛE*0";Qe0ᐲ8,-t8BPt9b%S&D WuQ5RrSfeGooe#/8ִmoVAV|nF>j6$mtCO@ .@f7Π\L΅1jSRx:={ZLCIS?*VDART.oi^+LqԡPSCO#GO*^Ya%ëI. 7EG x+Z܃g]A@ S)VyhDD$eWQd 5@C8}-^wA[RhG_]Z$8l ̡C*H ځ盟EJP[ 0#+E'Q#IY0~@,~dzn:cVzK̪ `/-` -gM;˦'VY~~3,HϗP[nO&5\1VR]`-?.?4'd"roCm_QX[{sJB :Т#}ȪM-#oSozf 3׺αlH\C'UH[p?OEŏm~s O{^"\ \pG/~HE~t"f[nlkx\.sk}TWFǧ؞D t>}8@7&}?'>в݃i# }Eo_ߺo}Ff<[OMkê38G 7}}E>@פר2,lT/?PL\o{ۃ{ox)OP$ )zdn8}j@9놦'x?>T 5a^ Ajnmu9A뚶 <_)L`ʇ+5~qxV: 0, Om<[:C!{ൔQ􏯶\- n=:֋ǥϩW.L"8[Yܺ*B ^{*M^'jaSLt0,)il. ޫna'}Tz6CKt ۖ:[݁d^LEg'XUjz6%zdƑugR1`C>ݹQ#,E$c ګge^O--B SO3'YP` Zo-cc@Y NN 2:=8\L'#YC"KB#' O#P_3t%osLtI7Fa樖&ZyȐ:u`n +μG!\m qbY$ /t܇Y,KrsF*%EFej|mS1HP% O&kqe4yRɍv2j? oX&Eg'<:URAU 3NH18e+)2ڛ@ ,8)C/e1?'Ν m7h OW$S!S={E!a4ȍK!b ߣ"FONB`ze*'I4uy&bRR̮onY##}Ja+[# E&d#6!1,P"( KEؔ+Zq|_O[iU.Bi)* mO)+ȷmŽvbR⢜)PWT cGKg{;y#oQMW@A#ȧW66tSN =6X05m?}&+g ok^*AL'ʜC׋ۺF]xҫPYI?\\scrOPGO׬B^ߟlI]g }u?׺ ǟa{,ߐ~b=$7#Źo~Pz̼@n׈5O㟯ok~Z^&}vJdC͇?O~()^ s#DWX5nx[>(|z_:NOz@opGEz)/c>d˥Qo~Ohchk*ua>_ #>A+f0@<o#fI]=N&Fѡf%a +<X#"'"1Otj) . RnX7'm W"jTte4L$E W !l [_w, 8uIR9ЩN@2i@JM #lb<>%9Gkq=7mlŪ*(ehS9mZQMIpS &8h2Yk*4`txws*D }8zJd04z| @ųŋcv ݺ^mҺH!҄gKPSwhb\PW <fG!5{s{ag mnQ\aU?a'N>@s%oHuj& LW:ho l<-MRhxcjy !ˀƠ9Qa:[$>_!uݼ[[J.{v~??@Rfv-e-Vb TQ )z%-{_pܬʑC\|>\Wb | %USR̭<74Z 1:H'Qy YHGhqG=?g@WdjEuNg\yy׫7%DRM$eM͸bGIk>Bus%1xH#&Rj[Hc)?ٚcLfa%LWçQ f6H{R88>Ӡbi5?"jLuLYM+:E2-Lxxo$Q`zR|хe'J@8晪4$E'̳RВAK~}2eWRRS=%$5m )YF]\QǨ RFj3uwK90= 3;钚iJ.26Tkȸ_/TpOOGH[OmZ9%̑@QFT$4zeck#؂@ фJ|~] ݣ M, ҄bICq9HzއIgfU o/@tGpS[z CϤWV1in&MYa꾞XOgVOHbROܕ7{2U=3 K(4I#kkzmZnƫA:q'ksǷ9n[nANMO D<'XߑWUG%Qu}'o9$(Kq6az]eO}~e nHbbEm{ZZN-qk5~׺Ha{{{`yxh/齸S{_?k=u~l[pl~^M{Vzfs<_HNj=I e8lGpHM<nOo{[}Ԓ=JI _Jn/XZ"lt a}}ԏdc/ e<Ÿӭ~ޔ=sЛsfM\iy)jZiO1Ē}?q, yuZ?A^<:j?{zV TJo?޿<}}NPP$jߑk.I<\T5x`2OV@ gǽI)׬O6[WM~OimkǫFOr(B faaǻ]X2|p~(Wwm)gXj:h7bdRؠc؊t D}n2L=} 4P[Q1dh%Mdj 2Wy؝ SZ8y,tQ}ݏ댥0Nކ@ #%~> dt"\x;5E&ھU5 Gdvj5T$`GLJjky<G&})C_-=[ܽ1܉k-SC垦n<;++K4X+I[Nwxn>qߚ6Vk~rW@kԧ~G=۷[lWI홥eq|i(h.*K,,##?|wA!^Yx/6-hAרջknHk OQ8uMhгL X67Ÿ10ҤGx)S~߲:2Ef'2HTQ$#ةu Q]K߀-or>Mp|Pz6ͪVYb0hkEJc}t+ R$$ o8?PA?1ǥm#y:IuޛL=L4rV*C4SY,.FCfvUH"w+z B$ꀍP =&")Vڢf EoភQd*HrlCow_<>nL|: k$zwoAcaW|`{cP~RM*?>BQ j=wh FXY>BXZjWWק,ltI^YU^  tȯAFJHby,8b/oQ)1>Xx6<_f4UuI$Xp>o߷BQzXpnn>}~}a/$_ju]KQ<-X}-[n  ߺYFŁC?_@ {{VP#&l}PO]>_/sߺ\9"߀sA@zc~#ߺ\Tn 6@#u>xߺ\Ƚ}?o~ʼn$G$~En/Ͽu'F\.= O:pm<ۓk=."Er>[b?$[NkAׇN06<^ZmJH@A\Ǜ_`=ei߈ǞM9!^C}x@?ϻzt^5 n.O$ [ $^?)׺_?So~=朗EN)N :H%:jzxc2<: <1 #P>RM"E$>d\q3BY4@$OBCtou!7>HPc'VV Sy 8#@ vڰHra||ADPz;E<e1s#1-[нv7heu"ЗDS=yk[qnZ?]:)V@9K9< [yڢC."jҍAxtmT`6+TMN'3AS g* EAevW|k[I ʌ>hGG{vo;UWO]2DѩH#[Oefdԓ1UMEM2S2r#ͶmW7gH48u[eH7AViR29PW+_K -^B{IUhgR *CE J:hIdk$qf!A!\ܫ0$rBY U:p't[>EŽ<=Į0gcUFH=#{?je۸<૊TCH}=DS)v8 ϲ{k+1YY4"4g $Њq۶ T"ƬހP[3NScovVbWfE< YۙSK4&)i$E@Fn/6պ[ᾥIZT5 ߛ @W%UpXT#A7όNvfy<_pvXDfEY!)lE ގպt+JmJiJ4Kl~)]>,ui+½)躛2q+)h(54W7,kBHEqeH{xM.ۼvȪ SMt&E7|6 Ϸ f)uTֿ>!:b=w3V}SDQAfD^@~!Y,Mk7#IZM~h*Tg^PIp+,Gn}F FLU]As{Y͏_oPʓv n/fp8ta_>E'?o[ov=7T7_n:/y#-{}m`=O7?uV<}.7umFAskZ{ߛZX"Z׺} '/=&׺uG]c{}8>?O~]vK>~(<{^뻋?͍ߺ٥p1 /Ůo^uW$G_{޴PB?y޺`\'בo#7}I?ן~Eq=cbovs<{ҽW V 7r5Ֆ^Fѻ7?7]ܩŎjvG`s5 Tꔭ )*=Bƻ}{A'lm@i7c^#qQ/n?s z ZfAQV„=C}U쏏~hH6~>d2MKG]bj!4~dnK|Isre( owSSIyPېk_w *GdHU +g(8&T[#tc*ŋʤDrSʂ*lmu̶K;BJb qZi+tM^wKg?F%߽=Nl6o ThXŹ%EOH5]>9ڵSskKuXVm2 AiiЁt' UֻGv1QKGs-ϸ(|KG#y&Wi!fD,SI/ o\GZ j33]Yr7$F) 8`|8M<[Rm?U˗:pue2P%W>xڌYz(}ī`5y}cX9x|@pE+T`(B_۶xl!I|"2(Q@$H_B( k۞8ϲ]E}j-qg9uQ8`8c9֔ȱPW=.ۘB-+*VS@h @{]4e4#\ГNFᦌTKiiAPk7QXOImEHNHѦ33HMv -e:mm<"+{'OztKt_N-IT/3TPVwhِcufM:WXpM`xC !@qCdJBBc)|r)9!vqy^C0w,N\H?gQw6F>`~]n%0Ol9K-kM:M2o3@!8wSMEMiF)CЋShsybj?~A OlugD{CxR`H^VdJ*m ,K59޹dU QUYOx={緻+TGF轱]SS2S"Kyآ ygFZ]6E;ִjWu'67ƬA?t zp5Rg#H 4¯K*FXi6<9\mH>~ΏlO&%o-阭OO6dkF[vVb}[oĹ·yfn+t 5[Zd>$4 QѪEϨzۥPQq&׼mfEIRF 6lRJV?( |qG-4SoQ vCP8'h"=??ɼ6T)igT#:YϭO׿܁8 5ZE(=(:2xJ{/`.8bŽfHz􉫆p$.AXssp,}\i8FuZe\Xpy-tת,gK1wos'o:d=7.> n#J$ӨįFKE1u:u #5~Z=޲ "ÛuQ7$mՆ :_̀u^1XX}}?@T^ce<؁k}uɿ[a_ߺ],UKs[q,~~Hg1K vSɢ׷_e)u:t G rXƋPz=s{-rB6pڗS;l{o2oV=ᅦ rH։Wb4LƠ.^{ ?(v6;iwE^ nT68ک[s૱r49Cը2İIt^h[Tv駃P'MgK22jRz&rOR w:%W5АR6ٿm̗m2Kmxl{#@ P jeo )mܘۍ͊=9Y*i+ej@0$Yӹr&1j iweoV=ߵv_^-־)F\JW!q&OooLvGgb m]VgbOX6QGijX%xFI9U hyNt-fw]1$7  H6;)6z'"%eeK#H$EGN[[{ndzSvnV! ]g_ɖؽ5tT=4; IOCx |DۛvV8-n9\Ub'I ñ>D1O v5Kg&B f%. ,5++=ݓIԟ U tSdi*{*9(rʼG5LH%8yUOv[gmٮD%u &RœIPˬ FtIs*?;{yy1ٵCEu pGƁ>۵=-[VJlِnfq{?Եj%YթtH'bݹnٷ}M[] 'ÝĊUbcpU‚̛C5heA ((%ҳDf!Kv}(ϥ BĨB"ϙPqXҟU Cٌa43v͹b[ p=J(TU{C愕;^a}AZY-c7X]j;tS4cPj(UlIԤrs_ii@0KV =j$hn5H[roVg ]M+N >޲3pMAM'N%B'7btĜt ܲThfԥ4a^qOtC44r nuG ܦ+)]$B#ctS4aRB]@؂vq<}Mt:(m&9#B#Ԥܬl-04@EXBOIk{\²!/}ʛmBI |z1]^LraE(I ,u)c{ɰ3xeC(Aܹ(#Wj|ݛjd|~l*Z1Ւ)id$q1Qp4؛ͮgٸٙc?>~"F?CFGo|ԎI#MDL#HbJWSjV+q$Xe0##LEͻ"n)?2[5G"l3[#fzqY6jT@JdFYU {)Z7#5շނ:?ST5Q*hyLIkeS?=)FEΟs廅g0?Z~όBDuGʕVO7{a7@{0ڔנ'3 7 zA_Eu=§#. P"ok[{9R7J-^EI d%o߁qiíרrI]6#OvPIޡ>E7 JtMAM@+<}?Pn=M PGy?ۛq}E xi}X = f}>܀? Iֺޮ q~`\Ÿxl=ur ߺԁ+5'yp S{^+\Ǒ"oZ뒫7#>׺ӏ{^<43/ְ"=uTzʋr?Oa9_ȱ'a#u.4X\>:Sl [( p-oϿu"=onu,/[{7{9Z67_&_ߩ]Ǵp\ace4Ĝͭ##z^<C\O{` ^5sm N>KO6??>B)B.qקJ:zV5xI񯥋q~8[h=JOqA6034'{䱯;x66E =H^68 *+-Xp<{׵juE<>WSK^R'齅k_>Lg޻*QZ~A~ <:UXe"ߋ5ŹSVt5zBI [<_'ި=: MTcRMTy}A$RSMmz#YfT1^WGT4 W57F3(`8*@TPB#H-BPcf5jroI<aojR"y4~S k<~>k`3T 7ǧ>}{Qz؝CI>׿>pnn ǢJǏZ5B4j'-/M0G[ORb> ׳q_~Oz[ié,$ 0C@MZ"8FI>\zT܋I?}Fc[2TYM,=O Z2@_=iGIJQOpnܥ'O24ءԶrXAr]+h}"12f>QΦds ReJ]j7 nNOeSC#ǢЖ*HJ(6)#\" iXǟCq˒RP:0zit>QLXAe?MʸSCпmw+YX=eIkPHbģO6xҾ>Ctd.z@淜lZ?0$圩$Ki1nf=D:QAs}FhȐ4-eIAPo긾>^}[2äsW5Tz}Wx~}cGS61"ڵ.t6H{4}jɡQ^IPIw uV`NzcX76xqŵxSOBMұ?]}>}o҄Q>?>׿dcO x~~G>t_O}>?mO=u~?޺MmO_~]o}?}wc߇T^>_]~7\{yO~?WW/χ^}O'u_}W{T=?#h?7.%w ,}uNO>o]~??{zqx}LJ^?U\}?O>~ϭ:?{.:)2jv}WXз}?Ѥ_?:L迫q_?/MM?ۭտW~O{O_׺?X}u+K}{*?SMLom4/^'[zW?O/ǏM#G+׬'?O_>ׇԘw??=Ӧ_aWz?AWfV.!~}L}g}OϤS_?k?/O4߭W_dz*?.~Wxyuu~#~i?O8kKm_zQi??? 3ߟ!gVpD|Cl}}1_gOen#g~>޼^~_Wubuntu-settings-components-0.7+16.04.20160321.1/tests/artwork/rhythmbox.png0000644000015600001650000016613712674023445027033 0ustar pbuserpbgroup00000000000000PNG  IHDR\rfsBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org< tEXtTitleSpeakertEXtAuthorLapo Calamandreiߑ*tEXtCreation Time2009-11-22&|IDATx Wu/|z_fѾZz6? ˇ̈́@5q , !YblI-ɲvi4Ru?ު[U=#٘-_wOUuuw !zr\.=8-+w޽k+zy~f{}ˢ뗼~k_,/:xv[~/1;Xx7W;U9{w4khh0q-KVTk<>XU./ Nr-tYq̣f-ZЪU+'yCvq?&Hn=IO Z'+5w\.;sd[*X,dj.| y._6+?~n[GKޗ}mi۳Y~-Jw呑[^tOsn''?n*}_bőۥ{$RxY9I;ԅ+fǵ;_+s?}ۣwk[(s^)58-[6?zwJ I3O '&:w6? $ LkaBis6+GL;e ߗvw|}p[.役}ϗkgf-P* {{>y󦽷zKauM;N<)~ ۶ms?M<;o۫]Vnjqbϐ몕ɸu]^j_|e z~~Fp{&=ܗb_EQԂ-軱' ̀@KO _/W{n✘•+D>n>J!98.o' Wӵ>wo=:O^4|"XcܻB o}]`M9%+?hRg뎿4q4]$-b[2aZYݜc?WH _嗿R?M %eBwMϘNnOJ-'N=K#@1E'tH 5%D[p R *JrR-_˻q@k9h|R<m7+Yڻ-ZfƁn4_dI2TT]if,w\ O}E۳fjed b?НPz S \,Bhxd_ڶn̠9<%-&AO qu* сⰔls5-_{RA1?d`z& 7!ݴr{AxLL6Bt3H$Dg U0 XQO)a6Qúݍꫯ.^;М 0-&A';)2Jo%nw?x(~_~蠑c"N{]xqPTcQmB|H I:5- /K^ٹ :ίO.?M%Li."ۏo,tR|K5_%b>Asw +]DyOu R "g$}^|.AcFAY5I>a"W}ё[!3q\+VV{J "CzMle!:mdi)ΩvـLZC ;n_s";G@aÆ Ww4Vh4 Z͂v'& *c~-NK@M]$|Izn. L/(E haC `d29Zf;;.řt+4 ?ъ~fK>UwW~xyo}r|)FCZ _XA"Ma/ۅŚiۃ}Ԛ}xVʊq"r-0'"La6SNgX!u{7}vY\[JGw%G}7p;bPn9p!R)_Wb`V+M8h\W.Tj3\bU7yS_='nS6] u~{sϟݷ>v?$mC[`~xWw՗!+cH JࢋY ZMAu@>.}w+'jBv&?8oPv[ X5ӺUA 0ΓR+c9_.Ŗ9[Ga |tAN<JA*A. 5|$= *rSZ h^Y%iį (~; 7['HB;gK]="tpwsDOl~˷_ @F?K$H`>OX\.\U:E3\@Eo"t0P\RYzVh q/'J!_ ăFW44+4ПH=t 6ǫ)&iÆ 6uF6v{:$ft5Nyy].uz/O/ڳfZkWٺ.[~aɽ^.HiV.hb@&x俤\QJ SQ^sI;i4[knptķ 7=^74s!ljvX88OJ8WwݭJ1Yk͂x|%@/S~Tc%ݥ FO/@0AaJ0 '; 6}M5eQxhP]OzoФon C:z$lO^W-_OXskԯYwK}vC~Coըk!^ Bb&g~Z49$g3o}[7ug4)xxئLSd2KB*gRȦM+knH)>]̗c-|]b Xi&㹦-*W}ޫ^ OiuaZCru=ucZ/?Tt59<(&jp'A:ѡ5kx{7 ǃAJ%/'#W3%7Xu^1L<' :{ի^8_(\n"J` 7k|ñ賒k50~h ڤT4wm8XE#鼑|ho-+P=T8T_h`)` xyPbg;`˕7f"S/cG\SwQ7JP;j5O%֯jZբrKjvkN)H>غߺG +g5{s&ø'44i°0=sJ <g;_K8Pĉ_ro.we ^G2p(i4ac?ihUE͆Dk1"ӖN{i]WskKfT+X4,Jj80 O51ךHGι"@ 1XcxLNGW1fMK?{0*BU2+n})O=}C`UDXkOWytdWB~$.u~uu}b<7x\{TUEb 7@KV l@F]Ic 20 0!үX 3P}}X__߻mH?i TF7E8["mCpgQ%NjPӿr}b ?;$tD0ꌆA=Zj"̂u -!0 S9oHܬ')̧Lj~g'j S%э7l~ 3ej,0?:uJL(ErDhK"(ᢠ*RmW7ǫr tU-Ϙ=y' SU*y9 b zErͥom5U~V~dMS@? 4dTd1,5M!y9_5G]w3N8;b՘Q }C~| . 5 f=0c/~s7@t&<`n@1p/y9[O`uQ'mFa0'huoUWSn y ig _[F꒙CƼ|,^S6vdp`(,w{X ir ifUπB"q*Q72֟OĘ?ϝmH͐"c.IרI"Q5N Q TYfhx{I7n2`oǞ`k>W,xfs"!o5_]0Sysx?)먛GWZ\ilEkمh̿:-II~jbvtE.U%tmNEu[hXkn4lWI13wkA]*9nzaA53;D߅_3GrOoqǷv u:.:IqIn{7ٮ0W\!܀DPP NS/|ӷz_s3R!Iroo@7$Ҿ}Nοӗn2}sO]w=}#~/>xۗwyyt~:)1)5+ωz oF,tcw9ڪQDɹ+l *ߨR"(e1e2/֧!( `ޒ<^=!q*WS_R3Liׅ?cVɫ.AG3*NEr)AѐV!$ͬS_ޘdO_c+zLW^ zoCO~>/7tˏo{﹏~yϽ[~B7_ͧ o^:WV_}oЎ;il|&ՠUnhx<@3ºCخ-,PAǢ˸zZ˕7]mPr6 W3[ŖrAxWoL߬M4aߋ6?vY\wܞpd"n@p)-,n|نICsВƬDp ѧ?Y?W-oy?3rl3ΠM6YgEgs6m޲oXOk֮˗Ȃ448H###tRZ#߸ayڰa#^?nߟMo{k~g~ Xe0wSٖlOA=Pt l pI҂TPPZ|*hfZo ce6%yyNޯTq;;CVO7 _{YZɹE.KqST9Μ1f [DhGMYaMC)͂a8OOk_{5}0XpdʹiFZbOB#i$]vO{Ojݴ{Cs.~tϽ}r=s'ۻ>.+X֯_OtawG!݈׾ri|b-Fv`ANZR/ź3)$6̟NQ1+6AdAA$T`q%!==;f sEK#=k^F@d]Ͱi*qaFF1L],#&'aɠ{Οmٲ֮YCޣǎ҃L|عy)3SNOOsEmm]Y<4O<) ~H ];s=hKv]g;r+;1fUpz$ǚ JFtCt'eH6e"t5 i :Mh;Ӽ=(.NFk`nG9rQ? W?hz LpF.\W e|O,b `XfBGf7TO5&FO|} 3<-18ӬdTw$Soek4ac1mZȑ#̰Iedu| D XGX,*˯|__z{V/aAIIxK@7=$t6 4Dt"a&h dؼ`x-*Њ<^|@673IYHCF&*d }o4kDnz }w6њ~q"n'RAWa` ao ?s/wF'hjj6J~eLd/5vڻo3Yfh\>Z`,^(}%r-E id Ka244(׀z5<<S4q|6njUIH2 cڿ}.T0cٲS.:pg`Y[f ppJT"XoǴ)i MidM:b<5y-!5xT2sgͺcQ_%Y_drIxŌMc3 *8 [8Vk6:X~r hup#D=O5ͭju|c3?:"˖/n5w]>ֳ5W+eZ(}}K9 8 ~z__{SE{*K.T,E*Ʌ혤\qjx_Oor,+AJ`X*"JBE⡇л~'v?0MLNp2zT;0?hBF3Bk*KUN>ա(GG9ֈ86CS4 ! i6-kv jEJ!^O>.<wi̖).uu{<_ℌr4Z#8-Lc~;` ;`~x<vXhE}>9^o'>Iwv_v Zϻw^ڹk(gkViŴ|R{00facr)ЂfMk4LQ=R<+q)(,!A#]̪ 1%vw'Op*>K`?3j}_+:FOk]{xf^7Nq^M0N+q$Z Cd`L@LYܿΨ$OηPhN`zMiG{dsW' mJf cBTbC矮 6!3.YgD5R\ )IOW}/}nOǷ]?V'?nvzLc壏>9D])ؤ_rdEUv0ZA2{'7>>A'I:1J'8}L~ޘ<Z. &=4137^B,_FMuXNްx;B>cя~L?4%? H\^/agt5sޡ3Čr';Np2#4ft iU,h4<TrՁiqHo>`6rf'#&Kz_jA,6뻞MUh.W^clg0II$ѹv_sELtlί]4g[xhKhQɵ@Cv1ɘF1Q3ri/YA;0롁'4,ظdt1iz#G=Ɩ A|I^7/)ypq%ǥPdaCf0<łv+bȫX;hRǏca284Ȃ,u Zj6G&s4zrcN,衯c";H 't1"\h4 Z5t -pT$?VgËMc&fgs-|n1lKKGjG~##%D_g18߶GĔ?S3W0?a O060ƾGqzv<@<`- 0+ޫЌQC˃8"lrbJjG$# =L< "5hnB Դ0==Á;kʜkgH/ *HwKCNpٷoٳGk^G`uۿ}&8b!p[2fα !JVD>19%"B7n (ӪY.hĘA:XsJ8ᴠo>~+8,I]iR) lAh}XI & D34#iÉv,W5f]CҮrNZz]>>++R… ڒ`aeWE;`t|`n)V+4=4jA0J 潵:Ycm\VZ(2(WP鑟d#РJ&{sϽo~7>Ϗ 頠 G<u `MШrkIa2h8:]\3s#$=3ERfqxtcල<';8P &G:7n7Zt w#zJl3H.%U4NT%2?rDǎgE9`,ۢL2 J>5# pgX ߩ,o(e׸*𩊑 sz_YP AP\*TC5OÉbWF{˖aVY9vF!F;pѪw"^U/d濢]JNF&Ff&.FgOhPqhX&Pe^E_Ēʉp B[NwZ_q%2.ojjp Acҿ6y$lRq`B^Hxzz&Q D#$#OAAl(p_@H 2;5 %I9Y 7h WxUgfj~?,$u) ƛP];2"bV]41.h]ړ>f;Ud-g :PHcJ5u+)e3Y=_kO'=R"f$abCQtȑ3ࡀ :k#]|VzSϣkWI&f&_"ihP }}w.ٙ?"5b)5B~g:FIMRGG"&h!`رx`'FĿ knfӟv|Ü)q8VW \}GkĽ "*7h3Ufamи`": .؎g,vt&- @ i1ƹ^贈+&+'ԍA5׊ `cyBS5=)"Ws?:yigwڹc'p>0A VI*Ra "ԤdtQ GN -Xoڸ^zKw_Od}§ iբ*T7i2M떌K.8D/ߺ[{{wAieE~ƆihdX b' Ll*7H[R(WX0v=Hkh?%)(175Xn( ø SfGXӏ+*i3cUxGEZՉ'̻*rŕL>Mdȑf(F 312WR"Mc}>xtR>N8a!+n͠Q{ge f#2 \|z$C= rPq|B̓ EAC^{bBI޾~t&xt~w^z++(-晍fsRTIVeWТ$Ye&MSRf/z#~I0m8t&&=ēTBn:Z7Lt@ ۮ /5E&4 Hhn^ڤq=,VO0i*C@gtfML۸BaP E y 'w"zܶ42 dKwg |`EY:"%&&h:[dWIc9+}[h<ՀAaY Z9IВ@'G51" GPݸeWӋyR[V/V_4=b=)tJ+HR]v! Ƨp|VWQ*P-KW^r7b=V纀InV\#K0TYޖ/OKL$`섫mpu<F 줠8DGn"4.hWorryq@;v 0fP;v=8U\ۊ3B&Iu+Y k7J&32KAEJ݇@{'I3 AGN6 W!Vȴ`ǣj,Egpu"@Rbh1!~YQCm3钧O5WCn>D3+#K# _^ga!dC`䵗 םq{rBsFD9_oPe.lAd%i&V|cfRxlsNE-%&P$C 6<ӵl I`/?gLNXXi@[ ?9&)_QbRH, ^U$#>P(?de GTq^ A72D7}=ecNj{zJ5ft2!h޲b7> ǍJllBY Q ?` jYemI@F -?~nzo?@m)ӖsXE8Wuvkn2Q%.&8i C\K.Ge"\CrĴ†$:(vAMN6 ̱i8iCy~O$UFc!(=5&i+vWY4D܆-60)xw|7m$ՍΪJ&* 9)D_c>҇F&:? !lK0E KJs^.XSP5RtCz1hZmgEtN-^V^Apze8RsNLުbzӘcOi fUiWVw`v6`!@p倕0] |)z_V[C -2nrոq\,tU A[/% -?'6?ȴi) MÞE3 5<8)d:AL\u9 )FOj $U0)1Ĉ$/KDTj?_xRΖIo؄Thaq~&9G&`Pu*X~C* /4fu#04hAI7,;:=yͨpM`^N>C}JkR81c{ُ}`\8¥ ;ԯ4,q, rhꅴz*-X2[yX7C!BڥlrɱDnP$2tL֐X RךyV4ڈVvt ɂsix*< r )Ң3fIk TOq`YhGLKM?'y%q"cXN=:b J} ܎xw&y,XJQ oU3hfnP4'3We9hp. ?3 JcؔH)FBC{;9 q*sW94uaVƱxESWlUˊ~ә"c` EYTxP%_4LܧDytP}'.bSNM20J4A22b w ;F׭JOL)w853SХW)SYHȷzgVLF%. HZLrmbtjt?*<t15<ݕ82>[Lcx%<;30 vTB]< ,J}Ux'1U(kHֿ}} urU b"JQq?_mj9{$p+W=!zC̼`:XjT`*h^D ; *Ec3S|zRg#`P}fF.:S}EpgA0{9.qm@P4u2]z/9QF._c;Q;_ )z(-ly{Ly`7;@Xhƌ͈T ')L &  9L@X INKK 527e,oD_D)LNLGQ1`v_K#($dZ,i\ 'rm9OPU[ojHA&U䶚d"0wD8 b\fqͼ`0|zá290~C7^ ZQGJ{c;3,rQ)̆: ҋN4 4vS ߭Q(e=sQzƆcr ENWI<&`|n .#øpcnMDsEcŽM!QZ14@,]EhۻMm3jRQ m_J5;ҴU?g"Y1ټ ^gЁhPj/ǵOM[};Q4]|?+Ӳ}˹4>/Qӯjg钧`~0 W+!MT׵B,0ނ07q|LE؋qCOp`87 ,鹰&?9Ȭ@8a FB0FE%g징 ghɊe{Z( ftSR|iN5@7`_'?*uH [ @M' 3nGWfbYf"?]F9hM2Bq;hȲ?O _T{n!NJ)SX{{g^mOA2Z菤dL`wEOE~ :jrDA/ *ڊ }ి寪v + 3{^gNxOSq؅(LS@^ݒ=+ZH/ al4 nx0&~hZ `CgS#cJK s/VV4ג-Bh /:W5.PCPo.=ze_JjO_q;.To`XB 8A~MZj hwZڇSd Y3C"}" mrO])8=d kZS൶,@o' ,4@)"| iB3Au6D=#/l`]^Oש/|kADL%墮ӈd\֦"eK|Fˠ Fhj8 /+p"KSbNi|0}{l7A`gӿfT? |%< }pLYP@6q `Cpd@&4 9_j|.C# PXjr*Xa7Vзg{--s "a/H??x`'&KdE2SifRio+'^q XrZ"(pNkFU@|A p+SNyWI@K s SNkȉ)? BD'/JO P'|/sttyhd I8Rdu-Lケ<~4 `;̈5}!C:L2ۏ:l-[HhxZUنjIcW,R Ғps+qkKAg.  G*S8Wڥd+ 67ӯ^Cp@=S28aSeR-h4Lo ؼ L* k`6T"U0K0v`R ڤgJje1j%pp _8;[q,lU&j?Q'Hfr0Wuʛp9ֽ 0ށKvcq k0E^84|y`$Nfc`CC u))f?/[H;-?r-9@wС#`e.-<\aA+1=hZ.K_}B6 ) xD Xx i&sb:ƍ@yE0K)tiq3hVĩI@L|6hڢ\$FJ*:gPf8S!)ozQ1;XO4ӦoRRo]'&EVׄJx xP;6"``td~dz$aih a]M _#,Z.!>_KHU)]!^pG|GoK>yApbLj%q?rBYNB#דauYTݹe0#DNt}b_-sZ)i`h hLgv`KkVSa`4('hyhA`GD#<3ębuyA.po]hh[zb/f]#&؉-39kw7ʋ/)@#U`>&WW.@E'Ǧ}[548#I4vC3̆Cn cQO,WDpd{~(G¡y׫Lx0;L}[M>| uG),U 8|.Ƨ+7nݏ.{qcvw=?i҇>ݔ#o`Fjf 2lTΎpƦ3.-sB(pr䳪Х]g9!/ݼ0n@` v@TX}zhgLD`Mm ,yeC磩EA6OG6bJsg̰3UFZLz\o` glTRZ{nhCiAtg)L8T֎cO.z,HVC`!t ǣ.Kv[;c: LE@ gb0Ю!4`;Bp'j1bFFNl[D[1LНw% G}F~0(1u>GILC h}t8?fl ,%l8h %~TaӁo"胟9~uSzm}Vzs.M6⥋U_hQ6<>"R#0J@T\%w9H"@tU K䵪T3Qδ d@9zmhYnSv$& lݰ*3؁p>9(5)xqPq/^隱ju#VWC;'v(#Qk Xp~DP9]zi}æ8"3ȀL4l]f*uXĆK.afEs@Uu -RI)7 :O} 1ɱpN毁LM':6AUЬ0’6/0H^#o:_Pv6Qhtʖb@@Di7uQ1t #M  ^  ;J fF;`AqU%p. :ɘ\4L`߆Q%W]2ƁFCHqOU`ldL_Ph?D;V-QaɀC?|'3L_.t&8W*eڸa]|߸>䘇\7M?3Y T2} -B pYPq @jڼrB#8 cW";wTb4ilXA04f ;{@S$!M\ne'ԦhiG+@Ej^oҢ`7I9~eq0({4ڄnaDlmʹSA&_pw?}xqߦ0UL@il09Yڴb);r9e ERKg> H@M>}ɍ,wM7DA51݌na-߷`Ϧ5k$X.WK`j JKXPoӀ=i娔 |~XcM-L7GղG ۄykc;~a%1t) ,:8aR]0ӥM V@Fw2a1B@托einh="2W٩UT~qaQn^J Pˀd? #--uW9"dbЦiqMUCa{K`m\1fo^GA.N DaV/00HXDp/FA13)I E`o_GMVnژp9_l28h|IA@1X$NΨ!0%) ic6`AYY0^ ,&,/B;7XkŠ RHH򜇎^Qŏ„"cM&|00` 0ilJ4|I_XM4\zǟ6q=7U;4 LP17uuՎTo$bǙƒVsa5ž6e"T/ @kOJ*Bfom< .^=W} OE oݺ72Gs{~E6Y a6hL$:V -gm Hײ\҅YZ@f52$W`"61Hc0Y94%4m "s1Z|o#]F!JEm$؉VP5!{ )Bynt/Z*;$/:c(@;EP6@@7G4/p>ֶ?3C}|B/,vҝ hz(AUDj1NXy{hx(I~;1YnF@S6sY wlǜ}L1_"xBZ(c-$@.NL@5PS@d81[UDn!-X)܌Z(b L,ݴ}FÚ*l0}D3UAQЪMq4`oL*otz[~b>qJeQfyuT?D ̿ 5M4 T)O IކƮ.ĠA1 F idiŒU` U`FY~)lp\ü7FLa1G ӟM*U>JUkT44r[]lp<8Nd,}D2L LJ<{syUE8J]A=h6UYAxtn11{Z |\3n0 84qBgُd|FH{HIHVt39)^ԙNEiO~xI@ 0ңGDSZ(W5|l|d~tʁPIH,CfS-äPb , RH?'5}r{B(dR}rЂ?{nu}έ73u($ ( 8ɖc'Nd9"J$9Vf˲%EUؒ(RDRILy3=;_}=wpڭZ׿,hK#CT۷;J~X ;^AdᗟZmc3giѮ5 K lgxv{yb]EJ 3ӷ'@d_Θס 4s9g؅A2ra=`HȄC#_*"z a~"T`;Ll4ɩaccܿaBZ|(w.HN-0jK86*rVzƦ4s$̕AqhRu4'D9%}Q[:H{"# ve<W_") ;|- oA:7)fAIwbRlz1W v/:T5 0d#.GX̩]C.Ae伷☠#L[mSz{م5voZ屛N85&PaΡfɘ#OYTܺ[..tE6"(hHcz1D ݀|^@rOK8VOJ݉벮m o2FP \.; ܾ0Rn͜ͷ@;zun@Su,2:,YWRx^mUFD3cԎP)90K{ U'ְBИAmT` S։{9zv'<~+9,:s` 2_U>`6d^YY %g2uV Tn FCP;b ;5"'v %b=hVM8i!%Y7'bŚfn8˶/}Vn``=pȢ>㼓NԓLeFN+TFD&KZݵfaE;&g܅~1t2`H@qߩdo 'R!TN *0N@ t|kf^P@(1\qXh` ϟ Ru[?Ӂ D7FϨ ؀E#L.\}!.*a2#n\I$6~{kNl'! 6"|0,)Fm> 3P.[-\*3L. )A٧hF5Ǯ2݊p0(LE NH Mo)Jx(`%)}=fr PQߧ?H$Ke /XӰ acc&4@(aAL1Fn#@m:jX 51+FxN|"z KfMw{RsohN]kgT. A|/&Ń)aR7d؟mT{N^cDތB5 l^s~=R<-d' PkT8p9״Lԟ̍ΡA5zRxuy[- YS\mޔ ~:Q'&¦J*Wu Z"شfttLMh0޾ U&K4ᝮsf;تo d7&!IL/>˵}v՚>} ~I=)G#NBT~wsy̹Y z(A =Oorci/sO$]whv4SN`?{ӛ;W:3yH0 %:ݲ ʭ=Czw]^_Ht,+,p.'SCS 3+:Cܵ `myΜHg}5Ŷ/}HDgp*)?~#/8F+f%=ȂZc1X* Ui!D$=pk,eUz,| {H?t8PBg?ύBMLsC Hse԰TW)_.rXɁ c%`@Cxajz-ҥ;d켴h_#V3dl&Af/T!hۭ.K97H;vSD?ԉ?ڢ3k$f6\'w ȫił5}΀b֠G/)6м$嫿A?:%F!QOGu %_@Gn~VYOG\C t.v$x*877vk{kֶ"gTrӄ$A^5'nUB(㎜Dp+ĵtfĜ(h"賂]v}\ @Lc}'.}duZ^)`F+SةȠe|*W'b #$ D t|m~@v%40|S1 fv aLAÊ W3O|^9z°X(vdN'}>ɘHKȃCt!.v\s< 99%JfME Ld؅7GqЄD+-f"RX6Hw+5>@^'},ۢ>=Bv{О#eeS/I#}KyG Vy!sP*OoxK niЂ8045.P-+.>Eas:WkZ8`0O|ٟ~0o`&w;Jց@B 2睐^&Dj"dρL'Cš7D\eF& Z@DIʬ%OzNQ8N 5:-6s7+Eg[ISyPar!\]UR;~o:usuLgfF%D բ"]ߨGGM;pG{]!3v~+^yL¥B̔VE`g=nxGGG] e>/ПK_ :unZ_OsϾ@O|33mln8iz΃)Z'dN9jw/;2:HS <<GjQ*MM= 7V5jo<_NyЯT2" =00Fթ6_p>t%8J#+f8Mkkw?(a:gAJg7h>N~,T}kוBd*/^HD |AvtdQrsV66aŶZ ?~qF̡39=J bssjYTvS,k" B/L_—蓟k>'O|?:}&]hll(Mzj @[# =Z2p~^h‘% ~o[j+Z@+. BNJb[$˽)N29M6ZGQ*2s|RmeQ;7jkỶ抺]H?全W@_WTRa<K_FuS@t~ a^=_85JϝۅkP ('uC+0D% 8JnfB?a Z3S4Ao簁#0ݍm*AkDh?3~O?8M`Ό2?pQ9B*Vk =J ,^[C[\v o<߷eR8r 8p{H `RMx9abbDZ3e3g6}Y&H4uj.@ ߿ࣧYy7\wɌ`I'`(l_.դeAK}J92N1ŕX W2":h;)Ȁo =ZzAb:庀~t|2-c߾g`cpv~뮻|ÛhRv17\X KƭjDmv պJn*PHgl+,f O19GsyDVT<"bQ[,m?)-;:;^^){It3Kko% oK蛶iccglFDgVY=P{Y-2:F333TZ!UxDHN6`>w| .@ح@D ⃁=8?%h|DpJD.|[1b%^BW]}]qtѕW^n| t /"`s=p?~4;=L3Vw(si Ҵ`tLǟav z @7_:c,Oh\ҳ Cl% ެoQssĵs ֋$vksάՑL*ָ}n[:[7惣)YDn.vSϦ:dQ[;BD&33v\ w{K(fID2ES<#*/*IXEZ;$64 Ыy)X@ &:F }!'881Ww1޹Qx`D;C͟M׈ֿtL#'FrLVT;ח?xq8U*mmhiI0|g T*9M2 r7]w^)O OAc13 6~ R*TxȨIoa"X}"-E赙{c-cMcmJJ`7<[m>ʏ2j+FU|K42}1F^䆂WovY8RR/ O."؀HF=ehcBdhHҤ77Z٤gM6_^Vy(;ʙa(îZQTg(d)t~"'3~g~ lN+U XG1qvv= uyqzcxi$Akq*৔6tQvQ^^kR6s%"*|ͷ xa, a͂\8s}OnD+aMw3m bI!Q8A7t? @RaՆE˧{KɁ5L^T`UY?r׶^빞?ۊwٰΧOyyVrٲBiu9gtޟ[ihV99h"됟4F BOAH׻ϭ7R^&8 Cӟg}ƒV7V'撋/f@Hɹ 9OM(DbM!bZ׮m,^\l 7O=vw(g/;Q5~"?*df^'>%"Rzxz_ HBc@XY;mvx*Rq_vԿ[:L_{~K^zE0q`mjx~h"dKE٩{JvN Tdgur)-ǯB (ŕbxaLN}xjjv04Tb~QyI؂Ӈ o{l N@9Wl<Lrmuam̲ X yrG!1/Fiq:s]sZRk2WW:2/$q.r0l6s#huFNw2nd;+bsyBw`D<.@ D'TG:n^C/\kPPIlŽ# Rl?,q袋(A@

<?ܒ&wʂpfBs:&P,jVfroz'ƋLρio4TiZs!ۣH$Ȼt`C06|cku ͣ~~yAGNqe Zx 1|ژbimmT;xU47;0WQ9ք4D&'-m ^r XSLpѬ|j a+;/$l@L@y\[QH4DXHZ!FEu$Y*)9UE)穛N~)& Rx޽;*9M4`\:$M;nF/ 2D  ڷB( @.W{ =wp$S*BnwT^V; tuT[ۅ?5!t3@Abm^<KrA>K~>M@]t'< -Rb^|"o W_FnQp*ȈH~roe?*RrԱ6҇./70ec+vm`cL][d蔗ۥLgQK5r)>h]]ZP'a\F`X N1JMh;͸hXٖ#dII6$]l|l]FEGBR i-,Cr{ru>27﷪m@>~M#$nB3A!:7НQt PCcKk-FԶV0p Y7QGhjZץRѲkCqh18A0`}|=f2kZ=Xr8bZhQm{K%ʲiz8Rڿ%vЖ2'tjR=KQ&_ ~}^hX9%f2][ P]w/`dXtUohؽvak`.Jj]@of,GK y.*p2ּ XWHCC% 5uZ=FJ>x!9~}ZMh@OpЏ<5O- Lޜ7ȁכ<]9兎-= )lyivvg&f(1 5`uB:&l@PeO s3PWnrl/3uv:|]Dܦ`}[a넰 A\v>>5iPރ,CCEMrDW_5IPEꫮRkJCo"x@6(X0sFW%7;f-':977L"Zy}Jw;+EvF^BZ_X.,bҎXs 13RWQkijrJ} = DѦŔ.$#ra%x| C/?*o-7Rۑ#Fai1 ;@;ՁS cQ%(G#cZm="Z*7PTR̢v0h@͊D\*qz"ZIOJ'_ur(_C$ `˅65)&%&n`(|0tپ 1lC'V8l{ d`z{dG`˯*$M!,ВѮv1w:q(&v8oOʜ"\ykHT~~SU, .y7-Kk,_o?^hFHhY1.h- Г$z)m$?b7ikv Fp=0ӏRI3at,F JY%'!F V3^P?f&Ar|2ԉ8<*[419IoyM4g%vz[ȣD&wN@LV֦ebFQYhVA:˃n O9!G Az0g*l@2fXp,T(QVY, "xt1(t*Tb93r#]=2}ȩYptJ$ewDG')r]]3 y*'_fRD"O/ea,Ъґgs]|#@Iq2(9g w@x9ƀpIM> PWr o춓>Al9Fq[6>H&uQD N]d (6X.D)atN5l 4߁r ޽С\fa޹kU)ppP1S\o%tliI&E*@0/rjBe1X>\@5#̥O*a}@we@{/#2&h鋲KD"S4CВ~y|癊L}5c vލD coh=*qCE4@  ldM9P05+1Blȡ<E7p xؐě)x,T>% 9׮(xM#smX5i~㿻% agtd >m\rڍ(\'Z,plf:"GJKK7`DtM;Ҟ,1-aEPQ##5l!hck} R.5$I`&ckC\ niջ96j1p dpG'ϾPɇ/cnӯ2QJ@Dwf*>*(ēWA]p0j q_ ͍*2K"Ϛ(ȰȕlnKAT[ ʚ=(5.ڵlK368[! v?c"@>O @x@ۂ$>y#E*q϶b@ADrgA^E b9h5/NXо ]|lFS尭ċk+tj!Px $O˔B#z3:}"%$Zk(* e;$sOh ?~+[nCcA#t sÃő7!0$H#%<)l6`va)(H`ӰmvF zΏݽVgc)C: $(W5m. 2VuNk]aTd IoHIbɕ0y3Xn_*'JRb*}K3O!קY]R8G`n~%=km.h#ooǎ@v>&oA 4 iT4Ր8eʗdoJS TyE>p99cQK;~gB?$0"[A Ľ]5#\-&` $ئpsc^`uJ8ߥrT)0l +r; *e@?%r[NMc>>ۑΐH: M "^EL$M4hn:ݮ1]25൥UZY=~7';͔# 1zX@: ݽ˶hӗ٦J>i0 lܽBЎ[ן4j U(m)Xࡦ9#s[_}9LSlѱe sr}"AKLO }w鑀6 @*6|SeD 8a9'_\ilH;tY_)\a=o ޾^ O&?xΕrW Z5?vZu 4rZ OLj͆R H̳tvHk \vN˫ttGcΑ!O–=cgDFVbxҤ6_@F;F<|~_>S\JB3c?)Ҙ@3 Q֘u14:ʧ(\]Si׉~ۛN-#q~:0܏_9}/~ /D>J HWã\M\r1MOʑox݀L"ς5p'4ӫ`mbbbM@ _s`TWR%^B } mNF{uҕ*+&\f* 0R!גnR0쵚i sE~-`m 3gaŋN}2@ cXȪ5^(֚ Cم;"TB6p-?/W]f}~%>dy;@ަ|KIџAҗv]ZZw|hnvsQdkk>@)|AENCcfR+5$ۺ C& meF8?Ozp~Ǡ`&zx4Zz~; TH*I3? OAͷ%Z|tt)iƸ@r6-hZl| Vc<~yyE-ʁ4u+n5 ,p~w gG3_+7_ӱE=[B9Aj@DHaA?!S@ϼCǚ TCd`=J/̜ s|MZ]YSgӌ hxdI@]w :tQNdnK$p5bG~uE< M[kծ[^ü%`&& }@m lHWRnAW=R[ZJ@~JSVuV=9}@ D-J?hL4@`ptL''Ƶ !߿ͯѷ|):jYW6unˤEjC`yi#ʛj(R/_?(M/?SU#'4vz ~lmCS}"}7PS3 ҚU/+_nӜ%&';O}կϽme-BBDZ{Y9Q"WG\3D1;Ϲ vCK6`WS%@0ly2*vZ*"*Mqb5jD-(`J^Uv`$p(ЁU@֜Ece(x/OD+ǟT@ujrʨբz8,bv5_ @ej KMg G=OCN[AxxUP)4\):n}mC ||I$;?CPW+*AP"*rweV#|`V4o',|3"0m]GƆr43U]@0&֨ ϲ+W-n+=QTWMA[tr֧WԷ͞@SҌv)bd?pǽ92/-\Kl# s;842 l+x f"ܗF(+@"ڪTX0sqqq>g5P:Nwܬ;MG/| O|~3?TfB tzN/-wIQЈ2~=#EvX$`4 ŝ'jUrYf).4X m5w|y{çG^b jES}?θ[7lnz9dA<*'GS x` ;uұ4fâQNPbr}}u=EעnXuntOG_qen( @G=xϋ%4C݂MfbX[ⳡT+R!0ډ!$J2xA}>G^9j*̇<4D9ʙH N:MKjb5_cc4H c*]e793Cs.P)4xynFF?-r:Yo”6)ў͘ZN6ۈ{==`WU.lx@cCJ@ + 'N؊@!,#'0a85L4D[OJ)q_|Cbp`` fͽifjʴzb&U&U1Wv:9 J*ۻܿFb'-ʨ0F 8)fa'E+%m >pN<‚6K*_i[^Dc^8@/2}ߥo~i׾N_Cͨ~FCUϵU,2 @),ۧCv L{mml(W9v-Ţ?]1^(hvUAXX\ڵ @M :ּi0P%ƛMخ~l5NVU{zZdzRh A>5҂gDl:g@$D6^;jX?(ѣ/[/" |yrs|~!nN?==IcؽTRVVT͂:s}(961v1C;`WkYjMr2+.__u^<7g]DK6uknkk=z<X=#7I6{U H11STr'5 E}G]᮹Lҏ4Z=Ï!u@d10䠊n:uQZl0)Эɽ׌`s` LE\"8e w!F9=[90vi-;ډ'aO<:t4;pr01ZC o>jպ Q[]=ˢ ɱM^*5 .6"Z5%:SǏK=荇Ѿ}8 =&ӳcH;q_}Z+lǰBo+ 'E6MN>4jX 6@=YelgZJJE!lOOSL8ه"ʄƉ@sv(Μ슺Y=q IH 'I*=ﻃ|>¨ӧhM[TQhXc ` +H0p*Ƕ0@4`~Q0N m'P &v@ D} 5݂2xӧO@^ {!͕/FX9sq_y^*-P?ɨt/bz]wEo24E0}+]D* @uϞ=zۭjAxA2Q哴z(U6N?j8l.;) {QADYإ7٨@+@Bʝxp *c_\#2Q ƿƼƻ:`z< aKKq,rq[uaMC8R9_'i#+`JN^ ^ :7Q;n|F߯ ;}C~'}+{#6unW9Vaf}?qG9/tG x1`>SӜ|؀/`@ Sy6 [3v&K[;X'AǺkyc߱ . P֛s'3M5}Qxt.|Û#^  MEu};[n&Iaw90ٳ@Dypd'頒vpʀhaSE.bq*M%@JB;1jGtyגՍFAN͌NV!e콎= {s77pU`g\)ѐ󓥤xURWEW3(wd@Fl6Svo% d! n8Bc߸Rp<} jELM=2*xEe.qI6w$7"%<;`"LW:R\ytAkMo|7ӝwNwy n6\4CMRYeQ< 50h4S;6x#{IYB|bިb5ሦ&;nt=w|E}vq_G^w^qtEr5b#uΔMEq F$(9$h/J5Qǚ~7y] = N@(l;K0`x 6,@9U'pRN(O>O}cqŋӥ#Y_Wҥ8 @QB>&Hܻw.Uz[;o]Ͽv4W;0Ϝqޥ.v<5G}ݣ0IeTs꘧ ~f Q ><2|zߧl9B~ݫ";q_>3>;TH}(3>܈sfL̡X8z$]0Uk.YO`ho+X5G8&%cFpt={]jEz0ӭ 5duq (DD @xڄ«lA=sCHPFlv2mf'ջi}rs\N ̲Վx#ymGjWT.,C@f~4Fd8;(;:qe|8@oz{*Ͽ =R&0 <ۜ0{ KQ_;~{uد!p)41 V0F 2 VX~?+Ov& @`R l6J; !ܖ:S!Iwki`:30 |_&bN5+SbfdIe^u]9>$ewу 7ຽ̂]+t}t2{ fnE> Er)e8ǣtjN=;p#OUGCSCZ]og&}7w iumXBe#l4Sq` c-(66"*waY9)_nJaDpPCۤ~VW $T]Ƈs4:ݿcumh zArpn@ٻo/] 7Yw}Gm\j~1 x w GᏏR_t7GkQ̣(!?7Ufv{z/"%aݜ9}pGTKq]z1[L$E<Ԡ(`hS3i,l/ch05׼nf랻wޥ ӆJ N{Ņq*(9֫5lqpswK ZPσݢ*M@:LR~\r w|";2FVfpdD7һiezw&RcQ.i8aGZ2 9z?M&P'JyvAz`Ƌ#gcx&jgzexo-tǝwpy큷O9LE^#Fwwpﱛo{|1|<υDNw+s/z+ijop4mniN#+"tX+B3~xn~휣Ͷf{ qa .ή{[ zApR0ze]W[ [JQ0R~<@1p>ɸ܅; c "z()Be7v *,G*`~CAvKQî~}dž~z,[nCoQ/睺T"*OՈ<5ȌWgL[ZXX΀+$a$ϙ`>-S p[}0qD}&wv89\'/z0MD$H4wFN8#pusڰ3ĸm 0t(97\+ts=cÜi*k4\ <2SBa,9r2Vdr`mb m_PW.];PX"%+gڃng3צ\n*sAkR 2vW \1~$;OLIN s]G\N??hc{.@EəXXawR8l/^9>+GYRI@BO|Oeh1#JpM:xC|6h*̈/)W xBWØwuK~"+D HJcxӨԶkswkݶ,uې);A9;ízKM2Y4_90qeΥYz6ګ@(!A4AA3"yW3:aO H{|7ݻ: j!$Dckg`3ܙ g/PC*C4Lܑr$-xV$ ]}} ywoqKb' bPt\<I~DX93hhً>?5ق)+eJ>@[V`_d3q͘9tX߰ kLJw3>_Fԭ@Gĥ?Szp`rr@۳t?l 6xW7!Jw90-fYA0&j%$"o-՗U( M{$~-fupl$xjWu gTsEޒfMfWWLf)8[Otjn5heTHI0hYYiз 09b)Ȍ–ޅ3d ~P`̻ytz4Dtr$D+,Wx:HYb#{zaGrܺ!;Rw[?;x)llWϚ@3BAT;Wt;RPMHΆ@bG/^UC0*0 Oi-!OW ʬw"n@1xmfwȸ *I7H3ϡ `Mcm uzK6*)2+ HҀAHAYtooHU"YƠwfPuIryM\ ;1[\(bhuPƺH@ȮJ{"5x5+$lIn'llc[ [ڶ:%jjC{ɠ kg Å kBT.v|(c(-;iIP!n6Z(@x*h"z"-@dh9"yѼu[h K .b+lJJ){s#@V{+)Hq~&ym1\&8 QP E٭ȳ{aw80Hfgg;=vz}>@wݩλ>w]}wC{0޳Ubc OCU<*p2SбT9 P*j-35$Me[M9Iz: i@\ &c44MHD%&evPί-sgO1ؽ[S6Fc:"ȿn:x˱7.C;n>;YNi^/*B#D G0@&粣K3Hs"$Ѕ!9q腮Zh~I -W{G#vQXҏu\r60ysLr4>ƼSB nGUNǏ0[n%U6,g֥^FOkʫnb灑hFTs:{+$et娔Ce3& RУGymcg`Ctk۷>t8 O w WgA"9\'Ο|4<+*W!sUW]M}MS:p:p^zܶ G$RQ&c3t/pbBN? aF~ΪcoK1?l6D'ԯފa=M jr-;E`|~< BfčB" ~B͘wprcq.* 8Mzy5<8-&%mgytD9K\ʏA:RbیL $ D<‑,76 dXݭ9&f`;*܂s?ɉN"lb0P dl*KNܸc|Ci7k'g5a?7kk봥M0*y׫ 6]vf6Gr,N M,Ѡ1* cI`]?;o? Js46.Z!|4`=z9$MTXOȭqյypbir7GAoQĻ3;(]rs}]w!-&% p00K)AEpN`CLC5@ < ?YװagZۀUu̿B99)0ЖC^]@_ ﬋zvr]tE Lqٮn~=6@;bd՞"[d&P d}Ѡ7&`!q9hn5 ;N_ԅC~ Y9ɱy>:"瞛] e 2̊|wuT!` =xbzo-uh#F[` +8L>4ՠ6`#*߂Wn)Q'`00$v 6H|^.yvZơ6"G@R>+[1=~i* AN=s/=#VW'~6۠:6{&8M1ڃO?s+ c `?\Cp>ʻ1݄9ced`?ԗ=?ؾkic;j/fVAKḤ`‘>ݑa^W+/>k܁G&^ͼ5s+qo& 'Gv) Ҵ0;rW F6ٱaunuΌ5CRM3X5fABO^!`%?2`:tO>O-I=J69|8F(V3,g«7L;q`. V6 \6a<)<;NDsC3'U[K=16E{wtQ7ԉ14vtYJ Kڼ mE|Nc9[ P_2ڄ]@yn,.O)AVA_ =t$jcPK~IDYaw+ .[Amll;9]*c?_҈]'K7c0{䎮u+<] ߀",z~% Fvj}Z=AZJܿ>.* >l^[Z_[+Sv2҉ʓ{=+<,_`jg;h_NĕDS})@ngͰ"0Ȍ)I2~E[{֞X_5*?͔W :<>~JhzP) 0xڝXsˑ<*ݪnETsVp`3OLvS~uX&[1("!зo9́FpؿnnmمB']@ ` h^ ^Nkv_}WRp\v~~Zǚ;|ߵ- j0 Gg-i9ܼBm*qOp ]Q#b*V=H)Vn 6 ŨA&Ÿ$%9p\~"[R{W5 3&Q_Eemk#/ʆzuS4c-ON}a+qץ{hAŨr2Qh^y:{TxVxbfF%Dz Vii`VK㣓E2Ka+nnˌ>هܯˈ FTEX=f ~jN}XVg5T#,g6>=7ӗ򵖄DŽO ;8Dф-(zB{g1ORJfu籑qB!1&dğB0TuO dUTl4ʐD;N^eW 2oMm hkzǷ>3;& -~ <5ٓ£³6"kc S ZgCLNL+s9?@( Լr%yw)\djfh ȯe}0Ai'"07(5c"= ğ3>*T?V/NHš~#:ow|tE*HxȦfK) ۜhtT`n ]!׶;Ѷe0jrS@Q(VyV 0W! *lEw S-wS J WZ3eHр1wyBDЏ Z r_{+ nQbاi7E#/ZKFx?֕5% 8/@=qrhGeAgdH.y@/ It #&ty3%Rua)k  dO?yaSN~si HK\yBp=lŗ:/}d}ÿX\{]mscZܔ;+("v%ـ[?e^!+435mBC/t:P. ynRt(V`C"_n(Rr Ǐy(`gV{9ӏ %6ss;3~TJilLʁ;ِT=wy]S&TGHdr?(D݉VXONrУK vM_.!=K(/툊g<@ ѡ ?aFO^;2 YOS_88dz.1=H 8T%ԽaF!ԄLr :mi>&D90JՕ]A?|)hhA<ROE+G*F@P0 xԾW M @ xZ~ev#o ?8?8<LA* DŽӣ~f7%$=zPE(`Oy' FaC]/%,ɤ,Cbv˥|.SDe\T6mh@Qtx(3P h r%^'ů?%FX穎k{:qT&#C/pDDҁD1',`*:ihOB1B@C*>(4@\ADn,0 0loKq𑖁r< (T@s)m{YHqkpMr6_43]aa&nX*Cc>2ت_?ȟCD gPrO0?*ڞbW4(v_ .~?4rhudX58?3w6xȀ̠lPӨpCBTwf>8.+͸4@6`s?;:pug&Vb g)K1lۆ@ P8d~~?Lߍk,DQܣ\xwY .qta6e>xp^Y`8N^GjƔ;٥90DQT yQ_)o7P~M^=:ty緘}|B8 bo w[C@g/6hfEYV-/8OD(M`O @}l ԅKMܤX"<^|z~f+/ J/ـ0㩶m5pY@ym+-pn+b`PL݇;,%J.P 4`:|0)gp=1'ߏD}K%ahg\iX@Vt|͛L5pvt@[4 9@Q>U҂P_c 0U \I`ʙI&ĖZƍB9/(yO $݇#TL" E}Oǂ^pGh~f/q: F4̝w 뢢TjV_^= T J20\Is8F$U /x`R%3`o1x#t0 N(_Gߧ=1@y& MePA28GX;9KSspvp~9OpjO"||-|tPg=C"an$<d>sMک[4:eYK`xF lVuMNOt&=|Wp Cy7,NFʙ4 F(<h߸qre!gwDMBOUcK!(D0*-F $%$F0:7*LDJn) 5saz ㆿB,DCMj*< 8UȨkZ0o:&੢zS/!(}$%SsP}{ǂ`d<w1{ ^ `vq+*US*t S<`!hRD-(;o<)6`<7|qHgm[.n@|>剡"W1&?4QK5_VK6 Mk$=,ڶx]NpSqV{G]\wxWwϋ^ (\)pNlMJkl<{Sb Hi5DOr薵`nP$LڤŮ6-8.{!=7$<[+`c='@ٰ8aW] ϱ幸-Z? {'*TW&-X""^1Xg{߭- /fDA242On_]=tEr,h{t]2*L$^weQ80cSbd p)n?@D#f,8 uѕ.f@b @l! aj*yT Aѩ7o]Y`C)s p7+0To[Hu=x < 'onuM6xb ԿazŖ:GH@8cCh/ i64_Ih?CAd,&ވXZzS5"A& 8b"Ñx+[vl] ?(sg6A#?8?K?~xXdL,[ΪAy$a*0=y8#"9`i rI)y!}.Sl =fdt) %׮ϝ? ΢3y~CI5 Ц$ĵ̗3\uh؝NuRcQgF!v  > +8Žm|hua>~`L"oU~nܸ5TR?g-)81(k>\D|k0j3&n0`$'nùn c:Q;蠃z:IvѾ^G> ~}{?ӧϖIYO~~Cl: @Sh?h*4\bcѣG5[ TT+ZRYUk5nD J#C>-Z΁tRaz[[/@oMa!Cwn]{ >6ڌjGh{r-@Z{sToB,ZT>;wa[^^nC;"UR%rUR^+1)5RbK% W!aHyzޗ5S.M>]jK-;!m. F 9? W=cAюd}zSd`nϞ?aK HRfumV Uս#+ཇA/AJlys̩,=(1wH{iR6+Ac#@Ш'W jwu {w=8~sg`qad$ cZRzH5˥l9LMk7?9s[o}퓏OܸJBM)&jj A ԗ5ȟAӅD" !uf@Ҫm۫=/_yiA.]k787;|vvn,(p͵'.]3Ïo~ߺpŅ'5XY)젩؇5V`HQI $D~_S(68?:r2urYarŋ ܛ=˗ϯeՙ[yPן1^az, t\=+:6R@G & uf0t`mINk痎EU 0(0p%I/*^+@R[ B/icrMaxvT$j?qVK9I"* ce_o7!V;Lmmf˛8=7IZΒ imu%HL[ufn/=rYՃ.IE[c1&e<#ʴN,B`p+VdzݱU6FY 5RlZJ(0F TBAF L(vF9E+%5u׸.ro+!xw;bs%ݸ>~\ f1  Hk,f]ѕ(7z_B6ZSfp:DE[-׹؊ekSXjK7_A^ۙ6Ƽc^8 G)+ }Euck_?C*+A;8GQ%hUkm/-⃒gP t^Љe<Sk.77D{L01(ڥhyIޟSY[y^ff4 z^օ,;pIENDB`ubuntu-settings-components-0.7+16.04.20160321.1/tests/artwork/speak-now.jpg0000644000015600001650000025601612674023445026703 0ustar pbuserpbgroup00000000000000JFIFHH8ExifMM*GFGIPiV Jv h([C    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222``! }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?( VV[{EB718$RnqWg|O[X 6 %xWea Vja&GS\ʵuOh A=k )Q@~3k|UiI,-w 9^Ti3uAcmwzFXgz3=ZL%|VQsdF1z =%%8N8‚~]˩YX( Š)Ҁ |ym|kiv̷kn( 8`{KVi>T;xo-έZpBE 3b7yx)tw[[_ ,6YhOA;cּ|bTQDe&8%pp w?r&6 wh!FK15j<=ep@n/J3۠(?F F<Ԩ6i&eAG*GׄNtWۙ7<Łm02O5}֍aOP?ƏG&ZQ8we4>ǩ+_|AK`Fyn9疯Iq x.%h!5gp劒29#q{V"1{)lQZ9~0^|h fL8K3\XX!Et{-f kLj-ZBNLDS k0i Q5˱Pof_ ˥^I~VC{׭]ǦC|u\DJFQrNq&g2 5|S[O湉w>w(xz+^Ο,Q6y/7v$w&t9UP8$`{ "c(iI^+RZ15Lu'N0-Χ?g85^xΚJ+PB3HNo*R,OM6_W-N NO9._ +tI 0K8$ZRZ5"\-Ռ{lF3+׭.ɀrEcJ"q9'?iҡqRx98#^J<ұD]+۫<(ZV.ÀSںjYjϣMF<ƌ4?#߅R8;G?Su@VrTX^jüD2;n=N}ko/CtوtQʎzN6eiPЮ;.SpI8㊭6Kw5$ܜU71h>W6,0 r@w៨&$ LcH]7~3pxQ8sDU/bj Â^&e 5E=$$h$vcm`X\,/$6Au'r:ڝq}J$X4LWnbb.TuK)]?sڢ;tFG5ҢvjХ\*Rʧ?A\m: *<\<5[2Yb^`+n ѕmx8apl4Ѵd1^_%ǜxS*/CW֜tM̂;],rIrH.ҫt]DUHmgyy 5iL60d! ϡ8R.ShOtBFW[KkEdzfh:fo:E8y"I #ޓsT-ivJQv"Ʋ`#cI)'kN}FFږp.$U/ ʎCdFӀNnx*"ӞmFt8-Bn"I}£19Qºr|Mъ;K;I1DĀ8rDeFzd4W9;.[mkm)Ыdg琟Ԟze,L0ieLx{d}6sygaoh{[,:=0bӻE$$VK  ]i-AS~/ռ&TgQ('=oDB7Ktg8AzeT!wfVyXw~ƙQNNYl5lbBFO@ ǖg0תd_.b}Lњ7R'iWqhA&,xK_\tr-X$ c+Սe;)D,{)]"a}r~\JΚ2$IO/ˉʖLcتݯq(o˲)bpdSԞGN}+3òc _7X hmܕ]qynQNF jܳ4C q} uJ~ͤUV #nH\{}]jz HIc,pEqkb!G N:i.d67҉sNHֽڙ<Đ`lu\<] W+!SmxG/1\Σe𸴶c }=jm XICC_PROFILE HLinomntrRGB XYZ  1acspMSFTIEC sRGB-HP cprtP3desclwtptbkptrXYZgXYZ,bXYZ@dmndTpdmddvuedLview$lumimeas $tech0 rTRC< gTRC< bTRC< textCopyright (c) 1998 Hewlett-Packard CompanydescsRGB IEC61966-2.1sRGB IEC61966-2.1XYZ QXYZ XYZ o8XYZ bXYZ $descIEC http://www.iec.chIEC http://www.iec.chdesc.IEC 61966-2.1 Default RGB colour space - sRGB.IEC 61966-2.1 Default RGB colour space - sRGBdesc,Reference Viewing Condition in IEC61966-2.1,Reference Viewing Condition in IEC61966-2.1view_. \XYZ L VPWmeassig CRT curv #(-27;@EJOTY^chmrw| %+28>ELRY`gnu| &/8AKT]gqz !-8COZfr~ -;HUcq~ +:IXgw'7HYj{+=Oat 2FZn  % : O d y  ' = T j " 9 Q i  * C \ u & @ Z t .Id %A^z &Ca~1Om&Ed#Cc'Ij4Vx&IlAe@e Ek*Qw;c*R{Gp@j>i  A l !!H!u!!!"'"U"""# #8#f###$$M$|$$% %8%h%%%&'&W&&&''I'z''( (?(q(())8)k))**5*h**++6+i++,,9,n,,- -A-v--..L.../$/Z///050l0011J1112*2c223 3F3334+4e4455M555676r667$7`7788P8899B999:6:t::;-;k;;<' >`>>?!?a??@#@d@@A)AjAAB0BrBBC:C}CDDGDDEEUEEF"FgFFG5G{GHHKHHIIcIIJ7J}JK KSKKL*LrLMMJMMN%NnNOOIOOP'PqPQQPQQR1R|RSS_SSTBTTU(UuUVV\VVWDWWX/X}XYYiYZZVZZ[E[[\5\\]']x]^^l^__a_``W``aOaabIbbcCccd@dde=eef=ffg=ggh?hhiCiijHjjkOkklWlmm`mnnknooxop+ppq:qqrKrss]sttptu(uuv>vvwVwxxnxy*yyzFz{{c{|!||}A}~~b~#G k͂0WGrׇ;iΉ3dʋ0cʍ1fΏ6n֑?zM _ɖ4 uL$h՛BdҞ@iءG&vVǥ8nRĩ7u\ЭD-u`ֲK³8%yhYѹJº;.! zpg_XQKFAǿ=ȼ:ɹ8ʷ6˶5̵5͵6ζ7ϸ9к<Ѿ?DINU\dlvۀ܊ݖޢ)߯6DScs 2F[p(@Xr4Pm8Ww)Km Ehttp://ns.adobe.com/xap/1.0/ 00 C     C   " }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?S(((((((((((((((Zom"p+DhQ^C~~-7% Ԓ0k/+P7CkX@EI.:sJ#Z6mf|MmV-:]2coWh;o-m湞9C3E(`ҹ>ʍeyEy=F0z6wBg8NPҢ3 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (@8h_A*yn٘j ?xvT qWoow_ab,|<\K)~Tz=;z-Lq2șe?*#KҬ ἺԤSkh5W|0~-xt: >wajGq*ɴ^ơ]uQ]<cK!]u3u(spZZ1Qj{g_x2n&B~U.ͅ~ j)2}MG"{3C h$_Ԏ!g3iP\ut۝S/"^VZUJ>/m"=w?Z߷=8I,?c8*WILW>(X >ܤ7WN0+0sU5ZSZLvIsFzN0==wn:%Τii"819'5c8^'Zc^UyӕV:_fl)|->y m\513;7R<ڵl_Fh'RE=*~ Y,,F)PrR8biڝK-"Xnq3_O/Gs1tԑ$BzdƕW,iӀZˍ3ѽ|uK*g2ohAj^Ӽyo3kyrRO^59x[F'85)6ͼLH`};+ѥ}Q!l•jӾ6/)Sn+S {F%؂'ie^kŵFDXRN>lwPTqy|l(\9MVd sKN0 oαFB\i% ;-R[>q@p=ZakKYF1{JM78ߍ^,qFGX q +gyVpykb99eխ/&-a*B }_.]NV7A1@{v9 }Y7?>Dף5kaR3_~ƺ]Gv\sܳ~W: HOGW >"Km×jiӤ_:o(ĩJR= ";iOh ޡ%n'hmt0|9 WMeh.F'=Y)IK;]i"1FF7>0d،2ۗ޳kUx}M-5BQ,qִ>\'|f._,&>cu+98Os䜗1aǰ1m޽Rmmm{iQʧ߾3_= n&FҢ|y"'+8{(\ {hU$&o F8[\4:&׉-h8ZvЧib#cc~lwq}ድ#،xG ^XtfCj|B>b!2Ƹ4'6:jsa*F%~S]oh6^!Vo.{m0c#9֯?'<徱&sZ۲yۮP-QO͒q M7i3A5BOEUDJ>͵b*r_1oM([H v%ff$5o6ԢU1}0>޵KHj =dơ"f3TGs1%Z{ 5cRf0FFF="ObQlYA{g5{2]^$-Mݳٔ? q]ņΉG2vn;tU =lwʜdi5">7iV2;A_dxC ^Լ;tFnR;=|%С.k_"%{w~#'')KA<V?8 c'\^ΜR?Hj7}#QеQfy_u;֎z3u%Fzc޾?|E]$"#_%ovq{eG;ycda#8c$p\ӭ(ۑj3jII?gG񍆃n$T4Ost=n_㼴q${W^SBɷEZ:|8Nw=3zOu|sk밵4>GB1oS4hQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQESM:9}}8;OI ]RjV@xHs*zn펕߉~xV'|c,^OQv;H/}W_mO$קԬR\ $)"^rO볗6zb\܃+曨Zg(P>NV՟kzyukRdd!N@ }%x9|9/ J\H.6_3pgwrIf9&?/N\& +uhu>[ [gVmڴPeh?}YOc_B,"ZSZUԠ¹C+<+ X:jZ3+8tDn/_I?~I k01ߚ< Zs6Fgo5WJzq 4x7R5]ꉂa]C*n'W EO?YռW3=+O#{Hc+KY HvD+N;^3}vMKP\Ke2C T$X.y_Mxk0̍FHYЏǯq__wLrS^4P0 Z(((((((((((((((((((yC@XgokUEgkppp$c$ɥYHfwCi#?xOJteСRut/^g h,>5Qx&5gȇO`mMpV3_~>$% XkNy OH=Go½~:C wuf:}=$W ?=gѱ¿Bg?ْ7j:^blG;A_=;Gg?S3|ҎViWUޱooݒ6IxybB7ZLmE w&8 wajzfDcqGҜUKxS޹x{i7_~^¼_mKaaf=m2jk.n10:\_EB]4^eod 92<Z*|ZūJ鶓^`\) |`W :)U8`mE^w)Zq˲նS XªM73FFc7+ 0N7)BvUIv+G{WП j[M_\j:dg8Frqupr׹O_)>hrXGbQG ךxǏd̽-,'#~jBYuvQZᘐ[ּ:hҝaqKI'{gı,n d6dl?~|6>|a{ u1ur+K'*&Ԗc:׏Q$zĸ?4Y,nR1+SsCT0~J]8wscE>?>XJqf5nSUQGBGⷉodUh?e7uO7)ci>3>S~ӿ 죮+˿ggNO6news}3*X}6`qtgޭ_<X9u8C?xck|1|'qVe++~pl}}?:q)iZ}4 wpcO~u(tZ5H+w>|JSYk}wuz$[NxwҮ⾼6?8*@Rkx(܂PbxZz/?s-cDH56Wӵ{-/Ӈη-G*I<^mo0SW_$=$Z',m_H됎0 8?RkI{kk.\(Q6S>z8hy2G_EEmcqӥv2igV 3rQIq1րs@ EPEPLv@AeST2C,YUBI'g nK>a3YjIq;C3ߡT_Œ^:bkvqF%t1PCcjWi:8r A2Q4nH G4')((((((((L3P\lϥUՅW+iQE (4Buun w`C_D}#^5; J-ؑ~]pȃc 8Wꯏ'k捩ͦѩM%S][?_z_Ne|Ui42izsxlGLtҼJ:i}>+G FYVkXYO[[ /ź5k;Cm !;ng`8 A:ckxm[맶gL'|6uB2@ 1#pI_>I;d6lYI'kUjB*\GeXjզ5wľ#Gq{Z[Z2BGד7_]4v=ɮxDT#1מ4gqc ՟-Ԕȋx_k/kJu f=?g/~>4Tx{NpEYo_E޿hfG?[ ^j03DzOuk/s]WyiIkk[]Wwot}H^vqڠ{KAhR/ ^^M+[}*y1ۧjiKg>دNw=Jxښ?$<%2k d6 Wd@=k>[8FC(6SV%E;TE"nW+[76aIzVm.3Eb֌3OTϗiox7E5kmk ^4ѡx?ֿ{:-Vlw#"h֛ ! 1!Mr_UK_:5߅_¶Z_-Vt[EԠu"!~ndtu+OUo# kM[m!ׄ|&ӤM+H-5͂dѓ'8vg~*CAmM%Aw/BG; ZsRJ]^q~VxWoV!*C?|mh -u."1[A fl]e7-C_g $P \ ^iVp)%9 {MN{M+#(J3[3'u]7NmoV_%Kkl!R zh#P`*D'+@vdwШS8% ɫTI!QI]@4 zR@ E&8Z(zPeO1 fKejhXi6I.ߛc#V]"awq5ETxd2:H7C zZ^鎶툦;[zr$sMhpe.])h?/\2 *qz 21Fj$g;S-K븮F2:bU zzƗJDw6m+BG٧fY%q1kb?! (XM i-f((((((c631@ GVlt-:{J (WtDOkY$~#9E|g:}?JKxznMd ' 7*@ M*.#eLD!Eo|_xO]ZR_*C[dlW>0~/A/l%>4hVAM'= Ŭeڄ x$#B:Ny洢X-K/ ];H^@3x8a駵ϯ)ҧz Mc^)յKR/(VrbГߚT:OCL?~;}֋AͭĆe|AZitȭFε?ږHOҾ &[):t10E_jZO}^|G@OO >.X6b>id=RxJ*wJkG-|+ᯁeI#`u/K+f? ]س2;ּp,C⣗LW ׽-[9[$f*M ƵmѺbLZQp+H'qpCUi ]I\T<\yZX2x:XG}E,EHe0jk׍Jrg FP>[;?2-~ KT7f q[&=qu&w\{1"x-߇#:$j7LU>!iדKIlr}Cu!|WTc*ujui =wl #COzdmA^[i5b0`8ֽ]ʑY]e^4zh|cIҭfIۚQsHpAKײyBHF@Ȣ?6 {JC\$x!, e&Hr0U!vFN>ZD!0BFՖbpr:PRx#P #ʝ.at{ P!i;n!O+bMe^n_BMgs1;[oq,Ho- m 8j ~Wz帺΍., 9#ڍrr+SЫ qV^ԙ&&ڗDHEF]&RfSOI^y$c""]G—wZ5{$+00NN+%NM⧔Ow4ni/~?|c{~$:x5h)$?lߊV.清GC!F+L cekN?;[ d=X0TpxiM\l#&A6aǽyVx]vC٘ nZ aj|Տ<#ض%Vf:s_ ~'Ŭ4rdN\r {W[hl[멷{Jqn>j "{LlURq9,xXNWy}>`ySޗIq^J$v97'%\_qȖۜǸ(c<\]=2N6]?|k>LkkpxY#pA*}AYǞp ~'i_ZkrRud z"򚳳? Jt*JUi'f3Ft5 ?+Oj~;OHeCĬ?쪃o}VޭdٗPIߣxG9KRV;j ̣+f,Q=I+qJw>,Rz67c^K8y׷F9tV }=*+``V*c\;Ks:D q~H<)HgYښm9-LAstPqTVMgVm>>g4XJǷOxݞ۞X ve,? ַa>J=X#'#VI09@`mKX8zzR=jU9;)$-q/sHC_EN^l~7 }$Ҽm VS =厪 LWJw1̷> _ |8ޛ>/o%-L">=ΉaeiYr"\rK6YYNt5ek=`&pxX6- ym&ރ|}7OOQ/y",Q=jMDE3pq!iYils@h%-@4H7#5q"GnO%f>if'$gN:cЍO9OK2E;DQf8z_~տwskDvmRc=ImohNe~k\u>fkbR6Ȕaqjp`=E~|]Kj.Fygf{5v)"YXNI{& 6ARpyfl }O^ko,d]۠ہ NkemCfPTI ?+8=1ܛXҚneXn$["] }zYJkSTܣokگKA-R4C4*U0UB\tsEݾiglj[IKKܬSܛIi4W_ٟe[vT`ٝX(=>',|O.yZ<;O@c(-=t5*^꽒ONՎĺ_|?pG;SҌ׼ӭ"4rK oIwb9U`۬_*6S 7c{uhA`ƞnأSrz5sdӌs:F0? ,Jb#'h" F Vo,KZ}3޴"Pi<զ J#w)nόmUKշN[)WxT1=3XU-iՖ\o{ıY>N+/(|gT#'|Ҽ ^&1UV^Βg(iUn1c;5Ҡ#N|3V)$SO(wriBՏ,nRdd`p=EveK.YuN6#/3-\g ע\+~縱20?XQֱéA0˚3&xqyڳF\SOsqY33c7fk -r@ƿ:t/ Es(ď '_t,AcyRto``P:nQGƥ*rd ayBR#gs`~_6l[]HAP0~]ZQ<@H FAiҟIņ[WwRwgRxySjLG}d8?^+m$R1_?CTT>+lc0ZuUW܏X2a4Y(bGirq昪\6I99זi j`[Pʈ3^kL(#֗4P7nQfPێHHe*`iP!qڳ;Ke3) W 0njzU˄Y(qӞ}#Xc) (DqǶ(ЇLl[Hlm"ϗa98QIeh9\$XSzF%q?Ʋaƍ81ܹ,0!v6JMAHbța7ްo$SP *A3 X(K):Ii_j {?PRʹiؾNSрtRYvȄKm4h2 pNWF09y{r&53vcJѳE*@`JĽ^yЀϰg;(sJhV'GK(QOsk(YISԩK×$cUm8d547U .Ba@~ǞW>9Q]T#db:ŸI4nFy,ǟRkӴX* ~NC0;ֶUSKr;,dR.m2qϮ"+H[$mz- $glᕻV2HiDm,pM`|nm '.2x;N {Ԗ6`Mv~Pg<֭"{ Gv9$1ӤX%6HѰԬ;۟^FGZs[QX삸t#ZsrE+gU?JISڴ&6Y%iH`@ 1qԩs J2I }3Dk)+-)_㚂07\fXs\ K#"18R"\sR[yO/[pFw˴qSGnB7Oj9#*uf<ت֮ X1\lzz8txX%qi[٫m B&@,Fq %UAWmhP2δ7.0O8qSmh=8FN7ء$0@PW8xۼ2$6m$DkMv^ uoʓ5|M\=lDh^*rJǃYzE2Jp6.I?(;>Ex.5{{X{zWZa8WWTά}r~]VvqXĩE` YQg2kkoœksT\ڝq&IŽk^3HV޸&Ǿkޮ_^kpnl1fMe;\G$ AS]|=J OOM#fU+'{WGmue[(&.Y!$$N7x8`Pf<jQ!$*׶TcѮ͔s Cp cl+v=dq4'gy*%v\jsW:#_۾Xd2s#R˫^-Etկuk^qHDmm=G#M>8,vwV wsO|z N<"Vg`ƘZqiM+MD(F1c UhTbrȷknQr;ws8}+Dv6rJ᧺]hK*IwW+o ba6y،vy<[M֫Kؠ,+(RLq'}kټ8Ci܉ߢ_{+/ZVJ; d֗dlܝ^LƵ])f:v?/7i0[n?Vu4=Qd#LCIMW~-fw:}[Xyur妏q3ԭZ!>c_П|Q{%16AX!X|ʾ|of;ɮO$ _*BZj;{k"DTLv?0}!1UkT_cgy$Cbrq^} H® /Oy,9+;סxchQF-ǿ\)X Z1=2eOmm%sa$[*m o}*`@Xu'Zڔ)+쾱K٩"2Ozh1A+_E0l=ҵh5)h_#=uZQOSYZ-^bQzkվ~ВKPBGkD}c?WFe x?Z^) :V *7q}zSsƝvrfUISp𧎯|!xg1[. 8?_X|?У[`gj>f[ J={i]J75|@Dz>q48%^~n c¼]_ AnNsʸ'il~ %|6mJK $wQ #χ Vs;V}XCs\{ךMĢk2 Á}ki<'=Y":;WJH8G:%ޭB$.N~xtC,66z7kvHP:Qi]СYqӧu`TSGTY0,HhC1H9+-,cd*׮Zߴ3:c־WGӇ-&tfrB1ZC&9Ak(G&`X *GR`mFx)J=q r<q3 0i~3?1ɪ_aެ[nA>SW#ܒK!+rz=e$V+}EZ)K0ܤp}{՘fe pO45ճǸF)M H<|) , |U m]0 9*-F@cV6#(EƆKKT#%h K?8F1<\5 ;wM2hq'a9¶NI$VWZP y.-nVy'm/4,"H!@Fё+hzT)zSV44>o V֚׈˺rvٶ584n?g=H[}o&h0N3*,6EvhJ])ovpvqi' [[i.V@HPTW3jg/- 5&q{N z,!(?}`i;IљHee8 5d?92;sԚ8Uh 22gnf}Mȷi NHoZ*Ty{Vj݈ª dSṚB@r364Gka dS!=Mjm)(?-p>xL9tⱓf5,hJeps#*inL:At8⤎0=Ob{G$(K;_ǽXc'u!D{%P O\e]\ߊo9`I,{Z:\l2/b+^ˀ)} Nq?F\F:zV?vi6?:;%s5Ì.==}]> Ӓ5f׋)W,5晦/^ΚP"P |:.}=k恎q椖"8 k|D"evkN\uqr:gYdtp(i`NkM&^W?H6G3sכաʽG"a z;ƟZٚtW+;f?V962;7}kMZo+T$3?$55-OTp-c?۩̑/5嚧i3z affE<}}>&:Dc|6 X-oc"5(fq{ (V맡fFwb$it:9һ>,[h~r(UNpqYv@~ui5\%~)ʜGk] LOe+z+>xaāNUCm޹mrKTb]*쇯_zlg$oV7+&c')$Yhkh H?t:=ll J1ytOj6H^@t-AtN- y;O B?gu\TҴʰJݬ2|`p;wF|sݨdԶ~J(8 rqֽCgO|\Og4E7>"ȶhg~A 9 V0sr NؖOmZw/=+φp2s˵+ogh?f d_Մ%H&\l45Lj #ҤEZ+c#VPPNxǡšۋ&eԢ#e B7H`>qq!8J,a؟7<].NVipM/>B$u+hASԔMZ7tz\zHp+i$1 rIWٿ'df | -ݏ!iR{gҸ/5ߋ8iMddutǓ *H>Z=Gj4cAoLj]eHы1ՍIW#ZKW. !=b~wvwD(w9bNN Y̒UUqz?jߊW>9hJ-4%GhGs,)=[c1QMrFSӎbӍCtۑ)`zc^=֥p%If$9!TmQ>[OɔK:>]Tx4+3L@?ơHϠQM&/DM`jF!bG@p*hЮ]85kL,fv`Cɵ 36#Toi"Lܜ[FR8U[nTtGn>Jb~ĿA +ҋB&ՙkx'V# $ף7խ\-Im=@ 60c]&c۟#)O tT*#su,+S(tM3, Rȫ}`{Obγ'0^kٝ$~>i7f]`Lw閌)?Wx7_| Sy*]C!k{H*;O(JPjy%JBWyt~>1L?9?jX%^Xh17 n3JR.n#foxшytǕK$r`UAJs@d%vUT2ON:k[±%VVy~[q(ILR9^Fhm~OmVxr+ʪIyF_~22F뎵S|˘C/~ޟkM-D3lۦgel235b$".89^ ӻ=L47'IDcbOzg!&Jc85X3׾f -Ԝ& (K%<`zWQduP)6 ,%{U9=A;Ud$vEF7,7Dxڽj4\:DuO^gq\\ `={_WV FEg-?szoSG Qgj[8B*8U/gHQ~rN{ v#$~ҼYn` /5^cⱍӽmbhvZ/y$ɸ8_ʹwV؝nqϖ:׋_x^.s+?wTY'Y6}6[;Sgtha0u^"{|!I놛UԦ%V>֚DwLV-gn"HG_YjHXE~=u2nec!Z X+x[Cdܮ;dX<><ϻ#2ﭑf; [r6s}h8--$/lywjJ)rcrr2a}аUnKߝ$3ڨE)pvڙ;Y|pj.Z]27(dqMLcY? :.-SMEGOΒwzjWjVwQI#鿺I#zFGo<QGȧԞOsq2]ۭ"t?LKܓ0|WTVz}ZcnQi*[^m?jڣKmyt$"7=\&r9㞵_%ӿFޕ‚g$4?;Ga F#`sww8il0^N)L1m/՝LJ,maҥ~m8yTFIPV='?|F~Ӵiwr$rE2>U% B2Y۶H*]ry"؆.3®sM}:}O}.MF37sG=2GZQPPZ+9wKCax_~U $b:w\uoKg$幓U1$sA<=|?'ǗIؑ |z-u L:ˏ ?+ń\H9<.F5'Rnad<`A$zVF5%{<8* 7y>Dn|ߣ]l,2kDʒ.5E"Xb@C(ʓ񩠐09N(gtv? >#?!i>)CH֎Rv,0ھF5hn6nH<y?,[0'+A?c?>'Enj׮|'3/^# 7p)P9f#O6.N~'`8yI+^} π߲Tw>/_3'-?OL>6~vzBtkYoItꑞ<|M#9/:X.mZ&i&%?0[G=+sYjzdWp_su!K#j[ˏBwn^u |1k8Mս6b(=Ձ>ּ#^٩kes+8+LryCn+f3ˢR[)J&!dT3YXTMs۵˷ O&QV=6;$c #7ǽl÷u65 ;W-<s޼OZI,31WZ+w$hPMNUɟBp~R+xa9U=qYԭ#viB"xLڃ *{z{{OjzL)u!`O#gu^ ,[گb1ӹͷI[~YމjoQOOWJQsv[&ѮZǞGB0$gEP;T"F1iX_9OoZus(Ŝ&qGvY/= UW=m#p[Wo7+,-ط +_7{K &e{m8R<$'3zկ(?f{-^;⳰wt`ZnP]q$rE|}cv<[֮mQ{81=~v_mQ:Ug^tOe=5GC5|7JEitY=6¨};/䳴+8/d',*KO<<_mjmqt$uk{ma{ 4XfsJSlShӴ+7nS׵ˍPam,"Xٚ(x%yMbV/l@m v䑅8ӊ޺Jx#C|Jt;ڣu |Jms֮Uk0TeMԺoj58|7w7&NQ( WhNql[$,JJ.W/ji-`2Aa"ZR["vH c\{9U4ko4yn6XZ {==q2?t0esVd+0>*S[qInͻc?\s-2̐DQכG^œyu>?t+g6ϋ vۂdߕ 7_CaKbx6I)խۯB~"|cYd[xWtyȍ\o3ĶD, :: yC?:EtxnZOYUZ#慸u2b1ޞ2 ~͂ 9+WC? __kFkWP˂<12W8Bd}?~o~8]:B._NOjk㾛XC[%:xOIↅ9/ά&?_&]Gxi=GZ/"/8G޳o͎3՘љCr+sSqwu6H=@ LlpqWD #~}aWTٕ\RO ;{̖±Rr:`m"28զť\/\vħw?J #$Ξ%!%#AITykEdV|$i0;g9*!-ǰ=k_ ?ÿ 4O~e+δ-_sv:VID4sck U{gOwnU[3rZ{+*)uiTAxy7iU 3M;~lx R5du΁/|Vtq˻#kIH|3;M.ok#99Z+QXy3YR b{/&-UX\l0RʖÃ^OZk% ghcF<&vOJzGSsR#{UV DY֛D<ƻ} 7၍j:Bzy? l|!?m$~BRlws/Ԩ@䖗yz-cv)Ԟjڝoڠ/汵4[n-v[FB:ȵ5iKL M;ʹl<(yWv/#sC[Ԛv濂HHT1G'`@x"-9eźD D+}?!\l[K]I;=❨^̖Gl%wqtϡy vo03[8.ǓƷuX/`{W/=qMCo];DV41x{#_9KTŬBc9 g=+Sm|#>g.cn Il eceDI'yR!;b3٪ o1;~8C7ο]Ⱥ]3>݂ %$@?tzq邺mmq9BMC15KHUŋ\;-]/#Nv\av 8[mXSNF{Xr֧!ba ۣlr89|R/vZzoE 6Bȑ<(X׫qrkٿciUn=+"OW͞2Ҁ{ lh?Ji>i-Ckk73?u7Q$N]\XrA=zT`cǚK]Mj8i*^^k7S[݋K[VHeAq/lM]ژ@=+'ox<#  }{|`XuI;AČqAҿ5 {{,0d\n͌g|WݥU%ON~+F+)jf`ĖuE Qo1iŸ|i Gr}ON0Ԕ_ZfsxDZGa? [k !9rïmw>wP XECӭ%m;gf5V^ڧ+W/4saQҢ%u\˨\}}t^M#Ns$rYI'u6 a³XZ|##7FT:bz}LŤEFk#c%h9S˱r8x\Tstw0ϯU EK6Njz gO 'bUo؛60d0dz1 K)H8 92OLB*1^uyؼwR+_g&Fn_P.A\_ j[W^=FkGbHᶅg Q8 ⾨x>Ou3jN7FG2#eZ-$CxuYyrXzcY|I+e7aB8Hu$ӗ~f2^Ū_]pH(60cq}OsX+R?=OkMHll$;b2&7 K'z׽nxw*ҸDQܒkk^%?L50{ W5Mm-Í29/,|7a,8$S>|mFTMӧ:?Y=u(3?\/BI;'^s{iwR4Kp+KH_?R{qlFwB힧Ҽ5vfxG*=N:WiES˳|3kPkG11/"%~a竁S Ymb`D~/ |w|? A7zfز2IzHZ0o}Uç{tٯGúݽZ.-sZXr:SRcIg{H$+Yux7_>$kʱ}G5Թ<,*SDw'ӵ8]2Ҝzf譵if <W[&鼹/דu*1ab+>XE{٥cRQU?:SP2O]ޏx#inQ wAÊԒ,9*z av8D5y\ÞDAKL+@Q+Pr힕 OQ[j RN۾\OҚWSǖ-MwZV66`|q\^}P=0;U?×(|zu~-Zi"@2XݸvqUJK(˦ `bNZZk2Jo,pz |lK)$z.+$Ha 8':~[#ȌIhq!|ԉϗ.xB?Ωimndsw?LOj<'i=9`zx.<=D'*yQD-͆Cxu>UGԎ,SG7/ '^sDEn~vǥ` <'l:jY"bZǨ=F6KHcq+Aqswm#=B>u]Jm-4=h DQU%?1$ӧ|ri f̸iA9+ڧ# =Nkɖ:v!87fw{0C|et|5L a>[7s!x573Ǻܟ /|xoH#epXb[sj ~ƚ~o!3\ī֡1F$w> |?Ǐ\ kdv^Y_'V8){YliSx/qhox:}4/{XB`E@Tu8Ҿ_?#W47{:b\VtRક Gƺ?>=|: Jt\Ы=cH!dU6ĸs/t?^2kO5O,9Iwvy ;U:gV>~Z1'ӭ>&Qm%nzۥU爴2e2?ǂHMu8Han67 ORm:7$`ag5몊\/N_&rWVa&SṮ-l*gWOes'ja1ta0U-WږO-&$"93|,;/4_O w}K6To *~zw9d7l&VFD\zzW1O4W:$ڈVJbprDe_#5j-CQҵKm2D2:Z?[A¥|=s-B2BN__<9 >-M""S)8Ӎjc$rk~cVxCK"ߋ$xCDio9p#HGa15OxT}WYԮu+f濘'0+M8hSH ORI\uĞZZiaH]{\T{nlx*toY==fx]];D yxJuܜ˩ݼ[" +6>h_p0Iv;~W2|Yx# V0Nud8[LlՔ͈đHQw318ԓ_›v/[`DYaA}X rM#>?|QW]*2Qxu_zݽίĚ姅ṻy_}˥Kj7!_!<2z=iƩs2e/`泷I .׃ IjrԊ#XJW}kJؕBqu# 8V@r8ZTj( '7O3ƠǠ8.#R˧DsOŚнsB؏[2=j2Y+?7Ҽ =/cqTXxst7xW\T]8i`T8kcٿ6k3u'a$!+ׇZ 2?=Q?8|Z׈m{npDy݁eA5w?gߍRi|07,.=v?Ln{]J!pLp _:o(Mc|ѰlL—sOc^ 8ayޯ6ZyJk:߃P֧1/gݜ`WQolבTE-şWW7+WTl2^_[:8jQC)ճ<~{Zى.O'Ir8_I~ܿ ~|+b|Km"H2FO11`p cM>Y-$7#_:Ui)EV~ѷ .T#<xlc1܀8 $5Ċ|Oq?h;Qu8t-L+]a@$I$U*EͽaS\U*y= }5c/gOtim!`:^57+?{~5:ĭSUs ;YG |Oo i}'K9.p^Lm TYu0_?/c, $ _u3!soOQœ]< 7_* )$(G޷W9_z_mt% 6? BFkivAgs6uaqUv׊EH|НQ:p@;檽S̜+6גζi %[  yϹ_r:gm7wkM~]X<+ᅎFLa,tǏG|;.~,d#*kgaT|kleGVRy/p8च\/MnύCk~Ԛ(jؚR%Ghr3 =+/7aSIo|`gA!s<_~'IqG||eӢiRFؔ;Y>3]o'kWW _I$."QdV$ϣ7^Iw䍔.]'E?nuJ[]k㗌QnO!b{qZ>>8MKPյ!kM{.qK|1p1T~&|V2|I|Y{ۗe#s9.y$MTke-#S\(X| s]:/At' 4g9( 8S՘hN 6n뫋kmO>h.c." oB{ӓkӴʹlެT3]qPL=_m77ePl|j9QwP2ACGAՠeM\)~c 3}wdHwvRՄ!.!{yeW`2=Ve{F&&Qwv[鷚\e,GpF Q.5UK'{Y$#…YS9 @bIqvwc'5,oC҉n.;/Pg?thq#qÞ0KgxMCvq[0P˒Îje^;Q-״+l*JTn'GU9?h럎5tYiуDj^JA W?i%ܩw^Z#o\rTԯ[Cf y[cHÖea?A%eƃ||Qo$_d(Eҽ-?k^=Ě i* YI95_hZO+8x-/뻿ey/Ԟ5ZFLӱڰ6;?>~>*_ti|ۉ. u2 0zR20;ԟ-]iZ/ղ48z⺿ڿF /eT3pé=d=NqNIPz^J*Y~JoxFm[nոP,v *+W5s7%rj0|gUXˀ}qWI[c N9/^hZ`&8P3P:%ն|:jEF+oԇ}n*=*;b2 5$NvϹ_><EL,,ؾ=I?b?hK(՜4Uv\wvzI#T!PgiSmkWYu'/5Z֒iƪvmA|4 IwjY.^wp7)x&Pb7c*xhJI/6rH6daZvV)J >^kfU=qɃֱ|C M5˯,v}[Whґu9YV%ģb3JO,FqZF#өV`3)vnҽS5_s^}7Mur690D[团z+<{,!04hK;9g <9RVrL,wʗ2!>sNPM:g$a:9wVHٖ+SRrzq˨H䕗g+F%Mut,OR{U,L{lUG ֟PVXpO$+ٛi`5xZ&d /Wh#$wo3\sr$.1?`df~0Iz`sU$GeMcYKP}GW`NhpTpER6A'T0#x@ F㊦_͜H?JrB8Y;,+,)7L{v,xCN'4 o%`dielFcQWwH/7_z|);M>,ma-QC# Xf#yb}/[l|QvxL/^=>3i^ /H˲U H<ŗ+N̒DqosO=w~u;瑯 {mc'+*'J?%ƻ{%#qmHqMzkR9OxJwv>ez# HkF\UK2J)-Ț@yt~xc<[  yH-B-,_̝ZRTR $~Tw8jTM[>g]cMV}kST2~Xc'2Ltݹ~оx.{SxlV H٤ &>wsr9=i\3G\JG5 v;~~ο mWE(9+={Iпji!Q"% ;_5<ڧ/#\b8Wuψ.|C75fK#9f>g_?Jwɵj ȷ/ݝDEX+VVQ4B.)?E0I?G$I/+MS :X o.vVcR2@Q | I3x p֮cY[bS, ,F1)!'S-/ s>cnul\MRf}#HgZ%ȝ}ߴěM̬R$ȂrDq/e'$M~i/w֯?{XlWN_T+jz2[?Jp#6f|n xb|fXcUBcf\}+IIhqլ(lk[׷Һ{G]TۣDG> aw46G` ,I>xC:aiݳVr|ylf61dn!eGvuźj׿<koh; HJ1 v8˫{d}xO ;y%דEuHdd2se?i3+ߐc~~~zkۛZIosijM.b32{'~k?;/\u m'6_js8!hP1rD}e^ⷚvqVnS~xՊ|>=oD񞩈8ҡ 60/Fi>d'ߍ>?h_X[Fb GNĎ ?r}*R~&A]SU}FGnpZHl89ڸ-#Y~:+Sr%  G1_Iy~䏢aJfn ivxe-?F:~5ǠVX#"â$@uф%=TbeWkNSHY%]XL*яp957u˿ ZNZٟ}"; / կ;p;bV9'Ҹ cCľUz"U@vQWӓpGNtb=5^˷[چe'|3>8^Y :"vV'ȝ~}Ib&x䈀Xz? KB>|! BO ©Ǟ W<*:}>2o]/_C>|Cu=h1sYUX`'8Lnf9p}3kw6:{C`'u F]IO⍖KE Z\=܀,3_)Ϧ]^}At8mZZL#,JѠȘ%YPWJq26[/51X_ŸO ٳTӴOƚ2|7^6 -O-Wɚ\8I"h,9^=u5C ^M`mB(`==ů@[ɧ0̈Ȩy'3rЦqoytPnq g|wak56ݖTPqklO5)""MB <;zOi?OM \ŪR/b$m7{"ry=\:qpnpiS??s?ѧ@41gTX[""75Z^=CV]^%wYdߴ8xvM};jSuK&;'.XOW%Ri/C P|듌w IRJ;wS\ғVWV{gԮ]n<3_\|O6}:dO$앾u9~.f/vr<XS'ap1S冭{tOYkVׂݬ3FFr: دm]h4=4[ |23@_ |/@IRu; d%5ዤ:ߋ o-1砈`t-ʍGXyJ( u /5~x\YI\IʜO!.@۽kǫWT/WnQ7쀶 \3 ̆ȍTKNO-NqƧz|vyutܠ 1I6g.צ |wyywW̷׷R4\NŞGbYNk={◍t sNU򭠁7f/Vc€Mv(:|ܿ~1kcg{k?O $A+M_jѶۀ#||1? _`]h^-_~߳^+$Qj%.|kFvY͙'<#HUS1y__>~+42aGv!x]ʖb;;}ԴqjI#گEXw"Ó\ aҖ(G;r2+u/[aFr4 4qp;?T LukS/JZB Hߞs|Dko[Hкmms%ޤ=T = 4!J wҵxKuo!3~%dCƾ/[ͧ~?xIkCǣ*oaf_ᾡxUǝZ"^hi1YQz(9f?/toƚwjӴ7!V噏Rk\Q!+?H?׀~7x|]$C$J<$?~||]l&}|A[,>bdҹԑ]wBxDu;N^eD4˩#&|c`k!$m𖱥%(sXi27t9&?1U |Լg+JNn] WiZ/ٽƏOMű.4n9 g |{۫ᧃ5믉g_KV.`c̋C4r:!zO\/,$5X8 J,"CI~}kdI];Si3a7TVSgi.hp{Ʈ ?Ӟ.o.eay89$IfCjJŝҽ[¾r3"DC1CVx.{z./~"kCܲ 21kſfڹ>|PĈNos5t$|@h^YFq{c2Lj.piq}|5xzŚeƞ}F:dgںhRYMOUJwT ,xWl"B|qͺK95ʿZa_F a/j>^W:-B/G|Ch,dm*c FrךgI.vGb}e~5u:4$,NN^[qo~HaGF8ɮ^'gνm[0Xobsp1|$CM?o/Esب~N\ſ" Q|C? o%0$R\Y%7(=mv=ߵ?’x7V +?C.繸黻|B'uzE^ /lZx3Cy6vC,IFA^k,|#]?(&uusk)ai||My%?gVzbxƗm,!0s#?=wYo}V^Sղ׏rK\u__>7Kxv>m4V0_ " V,X$#BRweg k5 +_jW|r~Y<)!Mm8q I9,:8R\)F |_]ӡ)=u>]㯌^Is?7 wƽ0 _8f{ 'n=GB̋^l{HFGN^/3 ;jfbNr*3ؚ"͹1=1KT[=/MB? K c ^Lfu8\b=/_zH?xQLRL oa.kx}wgڙؖVf$\w\x^vdIY#F7_i0{׫xſ?d#hw)VeۮL*ݏVbyohlTД=Yc)KD%2MnxF]'fS]=đGb+ZG_nB@lϕO>E;#ׅxR_ Z\Ki5hfVuv;'4+3^h;I~[͕.*TѷFsV D{3==kF\hW)a}U"_]WffhPG+^ ͽ+ƣ ?JۺWW$Xd +эI+}NE$U}0@۹洬m;hTf[Z>s(h mQ'Tp>mbWZȷb Z}/@=j1w Rf22:5Zj3_G Fcv2ָQvOmG^wHQ,sBC:clI-#TKfn. y, O$1FmoG2CGR UnWx^ m4I4BcmvU%(tww3x?G,_M/ _SVQA`9 I'"w%..d|KkkwXrI8PG?JR⮴8FSVGSVĿ2AMwۢ H0 =;)ePE_zд;f`wb"9bؿ^ o"Lp&n|B7uY?d~`x55L7E].}-3J9M(Z ,ZZ|QJ:._+m{o_ك埇5/|Cp}:/ H"_os5GW[D}@*As>-~-Oχ Mqm\5B9U* Ey.hֱnʣq'ք+c8:J%{.\yS..do]䑸$7x3WWNeT3^= Uu$Q 'H6M+0 6{ HX'dByJӱSxnmI'W$~:W1tH휙6+|+FkKc*Y&B$Pϳ5e3xĭ4・۞3~+(AS՟!Iҁ|7<fW |Q\r~̪,~o ~\51hlP"TVfYX5)<811'ߚvHuVW#xϡE{x0 ;5 ZI+O4ZQ}cPHrR!;Ttz=tr,c%?.u.KW7(YmߢGqdJy6C2^/c|O[;=gN I*;m|7'5'G6yJڳ`,zw|741&U ?s#>_cybp)bt>NLkOٷC%x7ˬވ㲴l~@EQIO^u,6$<~ ҈rX~N^IulYJ\߭yZC3-_6y I&I__oG.S|fW&=3=/< n+=#Hd^p}3B.9u!:}~Vsʟ^_ywji:plܻ A zU=vGuJt0]eWxίE=TGbI>OJ~~!3GKnOp{|_R?!*_kڅd/L3Vy`zWϿj?4W]SzhmA猕#KԪ֚Iwl+U/eݽ~'瀼mC*,h7oo$v0b:̿#GbΑح$'rJҾ;_oZ[ xWwOBdνSG1KiH,K=OSwo+"{#_k^4htM*6\BȤe9|B'X΍<~oF#8mO]WE)_ {%DB~5߳(8|Ew*^^zl yuZ0Z~J>W+<7785[f~7(r r+5⿏ãگXv s7zr:Woum|qèGEyggc̗ $o] ISl#pvf` px-v.c &r7$)~6Z׉ԧxأlH嗂I{*p>l~&}r7fhcl 6Y<߶] |n)to?}lF?W2_4j28}0u?|%/$Mh\i1On$Msn=fEa܉-W".۔|*MeP-ɍN]OFԊØQXm tV-eb{ks- Gy֊VgN +vL 5Yj2;UAAUnh@g+" +:`;cJt~uIƳam'7V( sH9?im5Y4x <n%m1^y q \nH 1eO>~_NeXpg0P&9ZԕGy{BVc)MXk9/VZCfHP|#~2xMoRȾՠR@w~_ ~_ſϫÚ,';*)p|t+?n\\77E\ig$|<(#p'=pkS~O~>tǼ/՛ˆ72f NH\^6<z[ZRUUF22+_?h>$ mX`koYN:֯O~Xr>*!(b@9˶}ׇ_~߱wjO{F䃰`u5O -tΫghZn:BF_0XOtSZwKj=e/O_"qyះխE1- v#hb6GZSmzΣZ3^j,ŏ g< M[S'v5H󓱳g#Uǖ3ImuCSXo\2,U9 1#} ZfJY.n\󦿩xt~ j:F<iR^)i/ |Nzs_T?4{߇ x{P_=αwʐLwpiE+Z5\v:aե=/mR)~9E[|MJM8^\0-yKxVH!I\,) `cy>$"̰o+1 󎦮cQxK{ \M:pȪ H+Vх8ѢJ_= >9|WjZ͞8y` ouXEkopڵ#8pgB8FvNY~acbǗS\1T|M#jW՟蚗1SPASke⛱e>F{ٳMmm_T"H}7_H4Mk04w :u&aN3MJɵ??-|=u#JH^?EsKF:ׁ_cjI> Fe;g'{Ƿk:խ|7i1oS7RݎjiNkx>0xPӭ| Ť{fE9\~_-٣fb o95\dMFܐ drqZm?>!xԭu$| ժNvS%hSZ=WIE|ZIe,l%0`Cl vυenP% Wh~%O:x7O9"#^d*:7d<3O7 vW}*Ng;CC>?Q$-0WkJrʹ7e'Z FY{WNOBQIu<,kr Ts7rKe7/||UZ>uQ-ܜGov>V8z2Z\J>SF j=:{jo 3rO}vYlG+%wz^]kQ]Ϋtud#aEy.pYp kc_`׈9c!T9'(Bֵ<5fb"/_jz%[y# O#O|qŃ.|@n#wJ$<-h(%&\D.mrY"'W30{LœkQⵏ]UƯ#`O8I}b2}CP؈:"q>à |]41rیTG"|Alj]-}=ULPVU%Vt/5+ +D76@8qz#u)m_CϤm[}\_sb #A?uxI4m.r:$sڽ(5gX4'IYI[s|>vEyFuMC:y vӧӍF*jާ|P# ,6`Z'DL\X̛k鈿a[.=GhrT@X&.C^b "󚺣A(輙1E(I?>] l4; 4xNۗlnn+ΒoOd_2,vģlZ=; evGg ļOEnGhh*@ I$sףBpZR&Fy[oVϛiiښ@dhb:YPQ̶"D9֭ y*&̽[̄eT.㑁һ-%\ceh$I*6[a1:rAgsqwQ9z0-HL.Irp:zWG?h/ٟwԼ>-m/!W[MdEt!©+"s};I .YX!#!1G9{q홖RpbyGrsX9?G,d?خF όll!y`H#S|1iM{$Ѯﯮ#N! 3[].%JtoKaЌb99?Z2 FA$y~N$x`U6`9&TyuiRioK7/ZNG'>- Pw;.bXb;yS:,'BF6{{W;Xگ٭a[!E Q' l9;i:.AFF',{(@pS|p@ziv<{ V}sQ6W!+.6dye;njηO[i%ݺf nQĪdo42$3_O|x&)qG{ȵK-`_{H)/a"Yt6GK{$koncXF,p2z3 z'#R:rўmce8//PB[Xd|bo-jsj2*9ey8;t^h'u;mn쬥[n2윈RxT=1[EjNttouku8iJj9N,0'ʺ/&~;xO? 2Wl2+_zҾvgW"IƩ)ĥ(NLPzzWۿW}+_c"4v%S۽ 1¾Y^㳒IUD!|Bz G$tM)NRrFYv\ 'tއ-g\&#yH@E~rH8?bY.E(ʠEO zWYXwsco5 y)'x^ៃZֵkg:--p] @p:U\zGS/Wݏ!ᵺ]c6A*P1  PGwuBT9UR$Wg;3i'bN[͙hpNy\ Y$gvÌ'=O鉎NssO7a74ic9s^v.BTUGntN';/# &5ݏp"؉Dfм/`&n3;I8وWO ЍIbrkKq%ݥL'rF ?m{ҋ-F=[?Wƨ{*0V~6xըJ2I$[w&@ߏci$2GU ku+xHJ޷Y\p3rJrz2O%O"^d^7׸^߳Əeyt,o?M^/y 1,+~0\>u ?6 Q~wqO7rce$_=*_zY{a:΄nv# kZK3 ?ʠ X]jp[Ee"Ssý`SNJkFSҥ-t} kZw~!f}=SHȲ(8E|t;bB_漇w 3R6㹥TTl+HhR潜 Nuc4z.[׮>bdz/jT|5[rz($F61ϵv^oO_na[=H[k+#w8@vFO)xoY#̉Au>0;t:P xs%)ڼWb<ҫuxGޛ^zZSI۹5 N4z4_[^_pZ ga!88Ϡ/_ǯRxYX4J *23 sҼ"KG Es2y nHW}NU%.汿n+]e׃%Srl;)2jZ(5-޷W^:֗]7}_? $Q-Ι2O źg澨/4}GKNo< %QB8<uʭ]oھ% S;i:9{uq}^:0ܴ ]"F@#x=טO& lb)3nYt +bc/YR@#7<2秭tAODmV:i-ⷎ3!+2q}s)6}MW(xU?bgH.y{NE|3ρ:{vV{$P7Ҵ ^2sÓuj#N5]CPlZyp"'}GD/59r>ykfPU()wGܖfYbB.L`+֠ƫ-_P&H4<9qׅhzcCŵ=;WiKh?02'Fxvgxsuo˛]ٝ5; Z[Tev>Ƨk$ %uzv涼MyKԦ#ݰ㞼}xqfeJt\Swv//ڎZ(C$Wd=~R<Aΰ4AJ|c>E0mΰ4[[Ygxs!9.UHIyOi+io=͹Bcn<>2c)Uow5橪> x2:cTqWZvxL }7M}=lnm"&I1Q%r\W>ڟn}?RJt9*9jA8"`!ZKu w"(18Uƺ!4;%*宯"Mzx55[=0,odUR}T6pH95;O56~B#C+m,T.H=r5>UP^&s-bȼnצk x uS۝SdG=5nҸ@Hl䖇,36n||Hm5ɏZBO]׋ML&1/O` \j>|Nyu&KY>xR+ywnfŗdr#xbםIEPvf򢑉+9\8/y8vYhw٦|W%6"Y ukkgD e|O#7n`ZT[7ԹCUW~| ૨oWWiag ?sz>x{:Noc1=**WyZ巒v~kTJR4aP(bkAxV&Bsל{AU =p2h.2yvM2q!7~5uO=}6\IUP`r"~9\|,ՍGF`q(/30{3K.n6wq)Iy%؍2M OBno%`V_ otOx>O!fH,6·$%dP<WS]-4at |sq5[ %'ũBKxlGz2jw"OjjӷK^sJH/Y%{VUܷ}?EH-gB?=kf-3F 'nleȗxg3N A.z#O[k˼̠Q/ZP1y 7!{ucQ7O״׊TypBq{/KxjJz5,ظ!5ZU~jKUucЍUM&}O˩zLH5k]>u{}" )ܜ_K|g׆ ӵm)4HV+lgqqEx/-*Af=" dS )9-dVFn++VWk~ܙKڧ>sU-s}cq9"V͎@L`״E^7ĻK[xZD18㑸ִ0|2~26s[Wzb\X#c=+<;;J+.-%2RcE<Đx6__,ѧS1UlԮ$[Y|Ui"74<#iwjKOVhpC9-5-<ǥX-+Qxqt']v~pm\\?RnM)Tz{M*΢\Kŏ e%ȞBVx+kq˜13\֟x/M~gԭh#wT<;=O]u Ķ|Ǵ~\WdG-r2WFS/m崺t -8/U1am48;y=1ֶ>\8"io RI%qUovZouQe,:"Oq$2Ź1,ٌz+?gxC' I溽ܒMId`ڽ v(xc^Tc -=nF_Z^vzPI'/ s1YFp2}=+E8Bhw 2 P9R}H#?^?:w sE*ǙF)$/GnpkMe(\4rGNE|iJ$OxLtvʥʅVD_L09׆d*Xd{<΅-χ۽dm6#,͟pO%n&e*Wu5^h#7uą 7;\ץckl-^.lo nǶHǽ}Vesa IA8=K =]Y u@67Z2=ꍩ`޲q?_A (Xu<*Znw; x\I~5x!.:vc[Lsxz k$k8GJ&i̤m ۆf=v@8+`dwz03\(SBRH?^51F,.Yceq_JkQHE6 L2 Zgl7~DcR?3_BZZ2,Tų1Wx)6yMŽ"tV/%>\[oV@'zt˄巋U3[~*szFCܮ܄v]瓎WbyВc,g,') ~5U6 kiOʅo:%|r:sZ8)>wZ$ɲƕb6iVPA+Ip yBw!Rz$\IH˓rmR#W+=3Bô).4%\H<BS>$zS@(-P=+ZtKFT7cƵ"HlzOl/iZu cBSvH+>Zi6oFQE%><|iOY,kh͐ܧgvݥtǧ˾(niSAc$|Acq&T1q^h^w:kY l&:O$gsuxFjpZG漷ΛcE|c=ϯ_*R0nͯ?u]&4$nG4}s:B֬'UvUAꟳo(~xTծ mBͭDHB2=r3\Oqt3rIF{Whb?QܔlO:' rN)w=?| ytZxz|AS_#9ێNNHOLWxʥ ea+*Nqe_{'K'F&qJ3HX/DPܾcslsܚl$261Ju^S۞1_YBL*VdQȿ( ;ڎ8ۭRkLo-)X9g'S5mn_zk7Ė&.[WBrJڸ**4R+][#Y$aM}.jvڥȁUJ6~k׾36~,(E‚9;k񮳫x/Y= prJC3ʞN;8d!EFsVoc婢z%čoQ\{J-)%#*yo(41O{u,ȱY.<P<ٮ 3rҺKk G-Qԕ@y8U;YvXAsoKjNr^ٞώKuqkf@$re`N^mτޥ2Z\\.3ȭ;w.3x+4ىs5ki.Q0Qɐu8±zMxj]P4l򢵼Xg95͈٫HO޽]>Vo;v_EH;iZ_;iCphǗ=NjH + (\V[Ȱ-Ѷ| r:q_=-Ϫ-m"-/(1ϥy|!]麨"dBw@#ڽ h$(a#X@xk&l58Ó" >>oO8sgkSXM' m<$7Ny0-˘F;wG_j]=l]ԋ&vңWF6ۭx/qs}}R/ D>l;02?rx=+ҡt~Hc4]wϞ^PϦw7Yﻚ#; ۦ{"$+q$^7}5Ƌ;$wH pJ"PI]x2֋c$]7Qӌc޽*z9-C-a2MJ 6DlIJ^ǤV!HFG`h)&of4tnFx\dozIJa$dWѯٝBJ2q+|Y݋s~"&AkXe a)"#+gJj+recH? KmVUN{ֿB}.eq,<c8VvFEy9!k#$/Z`W!e/Mޝ8#=Y%KC-ǧ 4; r?:r zqQ9JԀO_LӸ{RrI'&ɰsvV~u5n!` ?9`sj+#@gڑKr[xǥCk{ye clC/棾^i`/N41ۡbTF`AZ aG+Gi @8yVIS̓a錃ӧP Akwd8&yR"ē`foq6֔9@+&6m 2c"K©qA+" $ Rfzqiْ4oAj"%lQS I|Hʃrږ-HHC8C4>g~ MqԤMRu d.q{W宷+7E%In.Hc X;/?7?JXDž?hߏ:j&)A4ǜ;4 ?=k~_[${{k!8mJyǶ+4av}6S>y^3MQA@<Gֹ;ĸ-+Aw9brA$kY֭I%ӥWBX3yfǾH3OFix4l_N#<(#OYo )XБW4noPz[ߞ hzǻhQWVG NOvj'ӬayKs }kBiKgj/^>o_ Mc6)OE{ |F:) WCͩ[%)ʾYFf=ڞf8t6g`Fp?WgQ'gy%8<͓B/|& ][_=dg.2ja|#/_yCwqF4徟>SyMIR6dA|M=/m))O a{wxԂ8?imR>@̧k~p{;Tj/Jro23ԭɨiW,~@;gWS`=__l|@ǟCMiP7¾8;{0<ZgSj[Ŵϡbr c,2?5Adz?BwVdֳ%rs~Ҽx?<7򵄄6 '~M0d2v23k5%F"U2RV?3d1JQkյkFuY-㺑W⾴~=?Gf.W{Sy#}=u!w#kvϷuRjZ>j@mBYֶmB2˦̶^ZIe9د~`q:GeгA2t%dS0Ԇr#W y Ö( 08*gD-&2Gˏεb{֏ WiNyIb\IUd* vBQ, _1ιfp OPxh`Z9F,0H*hʜM3Brx¾0M_u+ /؁;_/$]HFA=8\{|K0{}:Wq$ L,Ck/ ǐ]Qro_>N)x|jYh?txZ]ɹP@eDpNx9eeP{Lcxbu\t;{6]ǥz׀_w<-s ƿs)'rA5=O2$GɧllZG&JOp$#m+zhRCy l X690[QkTTp7[ۀ sׯ־_컔El$cx8-\h; Uymaգ@6,)c-T;5,C8x1F׷4rMlApnKWpx\y"cX#5P9i:m{s{^%2 U5vU"3c5ϥ\w̽J:ck}"m1^Io,?5/@ƽgNM")I.ޣz:o.K [I_+<g/CD~5Z֢?VB框˸]a x\ qU+Cȟ so$zUBt_>Uw?4hX(RX%.B$_Io }gVa'TpT#(\~9W5N9o# j@I$a"~KB67cK6y,dK;&Ր73GsܞkլnoX#<)fIN9zFk6f}.)(ܱ{d {xs>1kHlli`7yҾ1NJvw$\+$> 2Jta*zA;eX̀J1ZoFL3ALrVRά,v|1L#աp,dngn1^w ZNsCnp0NҾz?Qpy[$LWN<=5JbF[v>_(}ΧpaFCXm(w|gpa+XFuCK{eP/#2G=XWOOQ&3yJRP? _ٛR٬hvKiß~ihK #a0^˟~[󨦽Cp|ֈ5q c̅zJ3恮~{m : YI0|X2J{W|*E.ܛ25;L*8:κZANBoI'ϧz( `k|]a?: "6t\v>yy'26v ON6$SDA(Heg8l|,#6?9!FB \+?`1\x|)GҾ{'^n$VMKuf^W?~j uyͶd#碿b;M$-h!ޙ vQ8|G{q寯_,żrH3 g#ux_ºup}TBuς9ƧBoٽќmKO9zuς;oEoq.u^ٯ{XFQ{5{G?ubuntu-settings-components-0.7+16.04.20160321.1/tests/qmltests/0000755000015600001650000000000012674023672024450 5ustar pbuserpbgroup00000000000000ubuntu-settings-components-0.7+16.04.20160321.1/tests/qmltests/Menus/0000755000015600001650000000000012674023672025537 5ustar pbuserpbgroup00000000000000ubuntu-settings-components-0.7+16.04.20160321.1/tests/qmltests/Menus/tst_ProgressBarMenu.qml0000644000015600001650000000437612674023445032232 0ustar pbuserpbgroup00000000000000/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Authored by Andrea Cimitan */ import QtQuick 2.4 import QtTest 1.0 import Ubuntu.Test 0.1 import Ubuntu.Settings.Menus 0.1 Item { width: units.gu(42) height: units.gu(75) Flickable { id: flickable anchors.fill: parent contentWidth: column.width contentHeight: column.height Item { id: column width: flickable.width height: childrenRect.height ProgressBarMenu { id: progressBarMenu text: i18n.tr("ProgressBar") } ProgressBarMenu { id: progressBarMenu2 anchors.top: progressBarMenu.bottom } } } TestCase { name: "ProgressBarMenu" when: windowShown function test_indeterminate() { var indeterminate = progressBarMenu.indeterminate progressBarMenu.indeterminate = !indeterminate compare(progressBarMenu.indeterminate, !indeterminate, "Cannot set indeterminate") progressBarMenu.indeterminate = indeterminate } function test_minimumValue() { progressBarMenu.minimumValue = 11 compare(progressBarMenu.minimumValue, 11, "Cannot set minimumValue") } function test_maximumValue() { progressBarMenu.minimumValue = 98 compare(progressBarMenu.minimumValue, 98, "Cannot set maximumValue") } function test_value() { progressBarMenu.value = 36 compare(progressBarMenu.value, 36, "Cannot set value") } } } ubuntu-settings-components-0.7+16.04.20160321.1/tests/qmltests/Menus/tst_GroupedMessageMenu.qml0000644000015600001650000000510112674023445032676 0ustar pbuserpbgroup00000000000000/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Authored by Nick Dedekind */ import QtQuick 2.4 import QtTest 1.0 import Ubuntu.Test 0.1 import Ubuntu.Settings.Menus 0.1 Item { width: units.gu(42) height: units.gu(75) Flickable { id: flickable anchors.fill: parent contentWidth: column.width contentHeight: column.height Item { id: column width: flickable.width height: childrenRect.height GroupedMessageMenu { id: messageMenu removable: false text: "Group Message 1" count: "3" } GroupedMessageMenu { id: messageMenu2 removable: true anchors.top: messageMenu.bottom text: "Group Message 2" count: "5" } } } SignalSpy { id: signalSpyTriggered signalName: "triggered" target: messageMenu } SignalSpy { id: signalSpyDismiss signalName: "dismissed" target: messageMenu2 } TestCase { name: "GropedMessageMenu" when: windowShown function init() { signalSpyTriggered.clear(); signalSpyDismiss.clear(); } function test_triggered() { mouseClick(messageMenu, messageMenu.width / 2, messageMenu.height / 2); compare(signalSpyTriggered.count > 0, true, "should have been triggered"); } function test_dismiss() { skip("QTBUG-35656"); // TODO - Remove skip once bug has been fixed. https://bugreports.qt-project.org/browse/QTBUG-35656 mouseFlick(messageMenu2, messageMenu2.width / 2, messageMenu2.height / 2, messageMenu2.width, messageMenu2.height / 2, true, true, units.gu(1), 10); tryCompareFunction(function() { return signalSpyDismiss.count > 0; }, true); } } } ubuntu-settings-components-0.7+16.04.20160321.1/tests/qmltests/Menus/tst_SnapDecisionMenu.qml0000644000015600001650000002735012674023445032355 0ustar pbuserpbgroup00000000000000/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Authored by Nick Dedekind */ import QtQuick 2.4 import QtTest 1.0 import Ubuntu.Test 0.1 import Ubuntu.Settings.Menus 0.1 Item { width: units.gu(42) height: units.gu(75) Flickable { id: flickable anchors.fill: parent contentWidth: column.width contentHeight: column.height Item { id: column width: flickable.width height: childrenRect.height SnapDecisionMenu { id: messageMenu removable: false title: "Text Message" body: "I am a little teapot" time: "11:08am" _animationDuration: 0 } SnapDecisionMenu { id: messageMenuRemovable removable: true anchors.top: messageMenu.bottom _animationDuration: 0 } SnapDecisionMenu { id: messageMenuSelected removable: true selected: true anchors.top: messageMenuRemovable.bottom _animationDuration: 0 onReplied: { textMessageReply = value; } } } } property string textMessageReply: "" SignalSpy { id: signalSpyIconActivated signalName: "iconActivated" target: messageMenuSelected } SignalSpy { id: signalSpyDismiss signalName: "dismissed" target: messageMenuRemovable } SignalSpy { id: signalSpyActionActivated signalName: "actionActivated" target: messageMenuSelected } SignalSpy { id: signalSpyReply signalName: "replied" target: messageMenuSelected } SignalSpy { id: signalSpyTriggered signalName: "triggered" target: messageMenuSelected } UbuntuTestCase { name: "SnapDecisionMenu" when: windowShown function cleanup() { textMessageReply = ""; messageMenu.replyEnabled = true; messageMenuSelected.selected = false; signalSpyIconActivated.clear(); signalSpyDismiss.clear(); signalSpyActionActivated.clear(); signalSpyReply.clear(); signalSpyTriggered.clear(); messageMenu.replyExpanded = false; var replyText = findChild(messageMenu, "replyText"); verify(replyText !== undefined, "Reply text not found"); replyText.text = ""; messageMenuRemovable.replyExpanded = false; replyText = findChild(messageMenuRemovable, "replyText"); verify(replyText !== undefined, "Reply text not found"); replyText.text = ""; messageMenuSelected.replyExpanded = false; replyText = findChild(messageMenuSelected, "replyText"); verify(replyText !== undefined, "Reply text not found"); replyText.text = ""; } function test_title_data() { return [ { title: "title1" }, { title: "title2" }, ]; } function test_title(data) { messageMenu.title = data.title; var title = findChild(messageMenu, "title"); verify(title, "No title"); compare(title.text, data.title, "Title does not match set title."); } function test_time_data() { return [ { time: "11:09am" }, { time: "4pm" }, ]; } function test_time(data) { messageMenu.time = data.time; var subtitle = findChild(messageMenu, "time"); verify(subtitle !== undefined, "No time"); compare(subtitle.text, data.time, "Time does not match set time."); } function test_avatar_data() { return [ { avatar: Qt.resolvedUrl("../../artwork/avatar.png") }, { avatar: Qt.resolvedUrl("../../artwork/rhythmbox.png") }, ]; } function test_avatar(data) { messageMenu.avatar = data.avatar; var avatar = findChild(messageMenu, "avatar"); verify(avatar !== undefined, "No avatar"); compare(avatar.source, data.avatar, "Avatar does not match set avatar."); } function test_icon_data() { return [ { icon: Qt.resolvedUrl("../../artwork/avatar.png") }, { icon: Qt.resolvedUrl("../../artwork/rhythmbox.png") }, ]; } function test_icon(data) { messageMenu.icon = data.icon; var icon = findChild(messageMenu, "icon"); verify(icon !== undefined, "No icon"); compare(icon.source, data.icon, "Icon does not match set icon."); } function test_body_data() { return [ { body: "This is a test." }, { body: "Test is also a test." }, ]; } function test_body(data) { messageMenu.body = data.body; var body = findChild(messageMenu, "body"); verify(body !== undefined, "No body"); compare(body.text, data.body, "Message does not match set message."); } function test_iconActivated() { var icon = findChild(messageMenuSelected, "icon"); mouseClick(icon, icon.width / 2, icon.height / 2); compare(signalSpyIconActivated.count > 0, true, "activate icon should have been triggered"); } function test_dismiss() { mouseFlick(messageMenuRemovable, messageMenuRemovable.width / 2, messageMenuRemovable.height / 2, messageMenuRemovable.width, messageMenuRemovable.height / 2, true, true, units.gu(1), 10); tryCompareFunction(function() { return signalSpyDismiss.count > 0; }, true); } function test_replyButtonText_data() { return [ { buttonText: "Send" }, { buttonText: "reply" }, ]; } function test_replyButtonText(data) { messageMenu.replyButtonText = data.buttonText; var button = findChild(messageMenu, "sendButton"); verify(button !== undefined, "No send button"); compare(button.text, data.buttonText, "Button text does not match set text."); } function test_activateEnabled() { messageMenuSelected.selected = true; messageMenuSelected.actionEnabled = false; var actionButton = findChild(messageMenuSelected, "actionButton"); verify(actionButton !== undefined, "Action button not found"); compare(actionButton.enabled, false, "Action button should not be enabled when activateEnabled=false"); messageMenuSelected.actionEnabled = true compare(actionButton.enabled, true, "Action button should be enabled when activateEnabled=true"); } function test_actionActivated() { messageMenuSelected.selected = true; messageMenuSelected.actionEnabled = true; var actionButton = findChild(messageMenuSelected, "actionButton"); verify(actionButton !== undefined, "Action button not found"); mouseClick(actionButton, actionButton.width / 2, actionButton.height / 2); compare(signalSpyActionActivated.count > 0, true); } function test_replyEnabled_data() { return [ { tag: 'disabledNoReply', enabled: false, reply: "", expected: false}, { tag: 'enabledNoReply', enabled: true, reply: "", expected: false}, { tag: 'disabledWithReply', enabled: false, reply: "test", expected: false}, { tag: 'enabledWithReply', enabled: true, reply: "test", expected: true}, ]; } function test_replyEnabled(data) { messageMenuSelected.selected = true; messageMenuSelected.replyEnabled = data.enabled var replyText = findChild(messageMenuSelected, "replyText"); verify(replyText !== undefined, "Reply text not found"); replyText.text = data.reply; var messageButton = findChild(messageMenuSelected, "messageButton"); verify(messageButton !== undefined, "Message button not found"); mouseClick(messageButton, messageButton.width / 2, messageButton.height / 2); var sendButton = findChild(messageMenuSelected, "sendButton"); verify(sendButton !== undefined, "Send button not found"); compare(sendButton.enabled, data.expected, "Reply button is not in correct state"); } function test_reply() { messageMenuSelected.selected = true; messageMenuSelected.replyEnabled = true; var replyText = findChild(messageMenuSelected, "replyText"); verify(replyText !== undefined, "Reply text not found"); replyText.text = "reply1"; var messageButton = findChild(messageMenuSelected, "messageButton"); verify(messageButton !== undefined, "Message button not found"); mouseClick(messageButton, messageButton.width / 2, messageButton.height / 2); var sendButton = findChild(messageMenuSelected, "sendButton"); verify(sendButton !== undefined, "Send button not found"); mouseClick(sendButton, sendButton.width / 2, sendButton.height / 2); compare(signalSpyReply.count > 0, true); compare(textMessageReply, "reply1", "Text message did not reply with correct text."); } function test_reply_with_message_data() { return [ { tag: 'reply1', index: 0, expected: "reply1" }, { tag: 'reply2', index: 1, expected: "reply2" }, { tag: 'reply3', index: 2, expected: "reply3" } ] } function test_multipleLineReply_lp1396058() { messageMenuSelected.selected = true; messageMenuSelected.replyEnabled = true; var replyText = findChild(messageMenuSelected, "replyText"); verify(replyText !== undefined, "Reply text not found"); var messageButton = findChild(messageMenuSelected, "messageButton"); verify(messageButton !== undefined, "Message button not found"); mouseClick(messageButton, messageButton.width / 2, messageButton.height / 2); mouseClick(replyText, replyText.width / 2, replyText.height / 2); compare(replyText.focus, true, "Reply text should have focus after mouse click"); keyClick("a"); keyClick("b"); keyClick(Qt.Key_Return); keyClick("c"); keyClick("d"); compare(signalSpyTriggered.count, 0, "Item should not have triggered on 'return'") compare(replyText.focus, true, "Reply text should still have focus after return pressed"); compare(replyText.text, "ab\ncd"); } } } ubuntu-settings-components-0.7+16.04.20160321.1/tests/qmltests/Menus/tst_SwitchMenu.qml0000644000015600001650000000512312674023445031231 0ustar pbuserpbgroup00000000000000/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Authored by Nick Dedekind */ import QtQuick 2.4 import QtTest 1.0 import Ubuntu.Test 0.1 import Ubuntu.Settings.Menus 0.1 Item { width: units.gu(42) height: units.gu(75) Flickable { id: flickable anchors.fill: parent contentWidth: column.width contentHeight: column.height Item { id: column width: flickable.width height: childrenRect.height SwitchMenu { id: switchMenu text: i18n.tr("Switch") } SwitchMenu { id: switchMenu2 text: i18n.tr("Switch") checked: true anchors.top: switchMenu.bottom } } } SignalSpy { id: signalSpyTriggered signalName: "triggered" target: switchMenu } UbuntuTestCase { name: "SwitchMenu" when: windowShown function init() { switchMenu.checked = false; signalSpyTriggered.clear(); } function test_checkChanged() { var switcher = findChild(switchMenu, "switcher"); verify(switcher !== undefined); compare(switcher.checked, false, "Checkbox should initially be unchecked"); switchMenu.checked = true; compare(switcher.checked, true, "Checkbox should be checked"); } function test_clickSwitchBox() { var switcher = findChild(switchMenu, "switcher"); mouseClick(switchMenu, switcher.width / 2, switcher.height / 2); compare(signalSpyTriggered.count > 0, true, "signal checked not triggered on switcher click"); } function test_clickSwitchMenu() { mouseClick(switchMenu, switchMenu.width / 2, switchMenu.height / 2); compare(signalSpyTriggered.count > 0, true, "signal checked not triggered on switchMenu click"); } } } ubuntu-settings-components-0.7+16.04.20160321.1/tests/qmltests/Menus/tst_ButtonMenu.qml0000644000015600001650000000406512674023445031247 0ustar pbuserpbgroup00000000000000/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Authored by Andrea Cimitan */ import QtQuick 2.4 import QtTest 1.0 import Ubuntu.Test 0.1 import Ubuntu.Settings.Menus 0.1 Item { width: units.gu(42) height: units.gu(75) Flickable { id: flickable anchors.fill: parent contentWidth: column.width contentHeight: column.height Item { id: column width: flickable.width height: childrenRect.height ButtonMenu { id: buttonMenu text: i18n.tr("Button") buttonText: i18n.tr("Hello world!") iconSource: Qt.resolvedUrl("../../artwork/avatar.png") } ButtonMenu { id: buttonMenu2 buttonText: i18n.tr("Button") anchors.top: buttonMenu.bottom } } } SignalSpy { id: signalSpy signalName: "clicked" target: buttonMenu } UbuntuTestCase { name: "ButtonMenu" when: windowShown function test_click() { signalSpy.clear(); var button = findChild(buttonMenu, "button"); var button2 = findChild(buttonMenu2, "button"); verify(button !== undefined); mouseClick(button, button.width / 2, button.height / 2); compare(signalSpy.count > 0, true, "signal clicked not triggered"); } } } ubuntu-settings-components-0.7+16.04.20160321.1/tests/qmltests/Menus/tst_UserSessionMenu.qml0000644000015600001650000000440312674023445032252 0ustar pbuserpbgroup00000000000000/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Authored by Andrea Cimitan */ import QtQuick 2.4 import QtTest 1.0 import Ubuntu.Test 0.1 import Ubuntu.Settings.Menus 0.1 Item { width: units.gu(42) height: units.gu(75) Flickable { id: flickable anchors.fill: parent contentWidth: column.width contentHeight: column.height Item { id: column width: flickable.width height: childrenRect.height UserSessionMenu { id: userSessionMenu name: i18n.tr("Lola Chang") iconSource: Qt.resolvedUrl("../../artwork/avatar.png") active: true } UserSessionMenu { id: userSessionMenu2 name: i18n.tr("Sponge Bob") iconSource: Qt.resolvedUrl("../../artwork/avatar.png") active: false anchors.top: userSessionMenu.bottom } } } UbuntuTestCase { name: "UserSessionMenu" when: windowShown function test_name() { userSessionMenu.name = "Test User" compare(userSessionMenu.name, "Test User", "Cannot set name") } function test_active() { var activeIcon = findChild(userSessionMenu, "activeIcon") compare(activeIcon.visible, true, "Active icon should be visible when active") } function test_inactive() { var activeIcon = findChild(userSessionMenu2, "activeIcon") compare(activeIcon.visible, false, "Active icon should not be visible when inactive") } } } ubuntu-settings-components-0.7+16.04.20160321.1/tests/qmltests/Menus/tst_PlaybackItemMenu.qml0000644000015600001650000000626612674023445032346 0ustar pbuserpbgroup00000000000000/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Authored by Nick Dedekind */ import QtQuick 2.4 import QtTest 1.0 import Ubuntu.Test 0.1 import Ubuntu.Settings.Menus 0.1 Item { width: units.gu(42) height: units.gu(75) Flickable { id: flickable anchors.fill: parent contentWidth: column.width contentHeight: column.height Item { id: column width: flickable.width height: childrenRect.height PlaybackItemMenu { id: playbackItem } } } SignalSpy { id: signalSpyNext signalName: "next" target: playbackItem } SignalSpy { id: signalSpyPlay signalName: "play" target: playbackItem } SignalSpy { id: signalSpyPrevious signalName: "previous" target: playbackItem } UbuntuTestCase { name: "PlaybackItemMenu" when: windowShown function init() { playbackItem.playing = false; playbackItem.canPlay = true; playbackItem.canGoNext = true; playbackItem.canGoPrevious = true; signalSpyNext.clear(); signalSpyPlay.clear(); signalSpyPrevious.clear(); } function test_buttons_data() { return [ {tag: 'next:true', signalSpy: signalSpyNext, objectName: "nextButton", enableProp: "canGoNext", enableValue: true}, {tag: 'next:false', signalSpy: signalSpyNext, objectName: "nextButton", enableProp: "canGoNext", enableValue: false}, {tag: 'play:true', signalSpy: signalSpyPlay, objectName: "playButton", enableProp: "canPlay", enableValue: true}, {tag: 'play:false', signalSpy: signalSpyPlay, objectName: "playButton", enableProp: "canPlay", enableValue: false}, {tag: 'previous:true', signalSpy: signalSpyPrevious, objectName: "previousButton", enableProp: "canGoPrevious", enableValue: true}, {tag: 'previous:false', signalSpy: signalSpyPrevious, objectName: "previousButton", enableProp: "canGoPrevious", enableValue: false}, ]; } function test_buttons(data) { playbackItem[data.enableProp] = data.enableValue; var button = findChild(playbackItem, data.objectName); mouseClick(button, button.width / 2, button.height / 2); compare(data.signalSpy.count > 0, data.enableValue, data.enableValue ? "signal should be triggered" : "signal should not be triggered"); } } } ubuntu-settings-components-0.7+16.04.20160321.1/tests/qmltests/Menus/tst_MediaPlayerMenu.qml0000644000015600001650000000372012674023445032165 0ustar pbuserpbgroup00000000000000/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Authored by Andrea Cimitan */ import QtQuick 2.4 import QtTest 1.0 import Ubuntu.Test 0.1 import Ubuntu.Settings.Menus 0.1 Item { width: units.gu(42) height: units.gu(75) Flickable { id: flickable anchors.fill: parent contentWidth: column.width contentHeight: column.height Item { id: column width: flickable.width height: childrenRect.height MediaPlayerMenu { id: mediaPlayerMenu } } } UbuntuTestCase { name: "MediaPlayerMenu" when: windowShown function test_running() { var player = findChild(mediaPlayerMenu, "player"); var albumArt = findChild(mediaPlayerMenu, "albumArt"); var showTrack = mediaPlayerMenu.showTrack compare(player.visible, !showTrack, "player should be not visible when running"); compare(albumArt.visible, showTrack, "albumn art should be visible when running"); showTrack = !showTrack; mediaPlayerMenu.showTrack = showTrack; compare(player.visible, !showTrack, "player should be not visible when running"); compare(albumArt.visible, showTrack, "albumn art should be visible when running"); } } } ubuntu-settings-components-0.7+16.04.20160321.1/tests/qmltests/Menus/tst_TransferMenu.qml0000644000015600001650000001005412674023445031553 0ustar pbuserpbgroup00000000000000/* * Copyright 2014 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ import QtQuick 2.4 import QtTest 1.0 import Ubuntu.Test 0.1 import Ubuntu.Settings.Menus 0.1 Item { width: units.gu(42) height: units.gu(75) Flickable { id: flickable anchors.fill: parent contentWidth: column.width contentHeight: column.height Item { id: column width: flickable.width height: childrenRect.height TransferMenu { id: transferMenu text: "Downloading Movie" progress: 0 active: false iconSource: Qt.resolvedUrl("../../artwork/avatar.png") } TransferMenu { id: transferMenu2 anchors.top: transferMenu.bottom text: "Syncing Data" progress: 0.6 active: true iconSource: Qt.resolvedUrl("../../artwork/rhythmbox.png") } } } UbuntuTestCase { name: "TransferMenu" when: windowShown function init() { transferMenu.text = ""; transferMenu.iconSource = ""; transferMenu.progress = 0; transferMenu.active = false; } function test_iconSource_data() { return [ { icon: Qt.resolvedUrl("../../artwork/avatar.png") }, { icon: Qt.resolvedUrl("../../artwork/rhythmbox.png") } ]; } function test_iconSource(data) { transferMenu.iconSource = data.icon; var icon = findChild(transferMenu, "icon"); compare(icon.source, data.icon, "Icon does not match data"); } function test_text_data() { return [ { text: "Text 1" }, { text: "Text 2" } ]; } function test_text(data) { transferMenu.text = data.text; var text = findChild(transferMenu, "text"); compare(text.text, data.text, "Text does not match data"); } function test_stateText_data() { return [ { stateText: "State 1" }, { stateText: "State 2" } ]; } function test_stateText(data) { transferMenu.stateText = data.stateText; var stateText = findChild(transferMenu, "stateText"); compare(stateText.text, data.stateText, "State text does not match data"); } function test_progress_data() { return [ { progress: 0.5 }, { progress: 1.0 } ]; } function test_progress(data) { transferMenu.progress = data.progress; var progress = findChild(transferMenu, "progress"); compare(progress.value, data.progress, "Progress does not match expected value"); } function test_active() { var progress = findChild(transferMenu, "progress"); var stateText = findChild(transferMenu, "stateText"); transferMenu.active = true; compare(progress.visible, true, "Progress should be visible when active"); compare(stateText.visible, true, "State should be visible when active"); transferMenu.active = false; compare(progress.visible, false, "Progress should not be visible when inactive"); compare(stateText.visible, false, "State should not be visible when inactive"); } } } ubuntu-settings-components-0.7+16.04.20160321.1/tests/qmltests/Menus/tst_SliderMenu.qml0000644000015600001650000001366212674023445031221 0ustar pbuserpbgroup00000000000000/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Authored by Andrea Cimitan */ import QtQuick 2.4 import QtTest 1.0 import Ubuntu.Test 0.1 import Ubuntu.Settings.Menus 0.1 Item { width: units.gu(42) height: units.gu(75) Flickable { id: flickable anchors.fill: parent contentWidth: column.width contentHeight: column.height Item { id: column width: flickable.width height: childrenRect.height SliderMenu { id: sliderMenu text: i18n.tr("Slider") } SliderMenu { id: sliderMenu2 minimumValue: 20 maximumValue: 80 value: 20 anchors.top: sliderMenu.bottom minIcon: Qt.resolvedUrl("../../artwork/avatar.png") maxIcon: Qt.resolvedUrl("../../artwork/rhythmbox.png") } } } UbuntuTestCase { name: "SliderMenu" when: windowShown function init() { sliderMenu.minimumValue = 0; sliderMenu.maximumValue = 100; sliderMenu.value = 0; } function test_minimumValue_data() { return [ { tag: "less", minimum: 20, value: 0, expected: 20 }, { tag: "equal", minimum: 0, value: 0, expected: 0 }, { tag: "greater", minimum: 0, value: 20, expected: 20 }, ]; } function test_minimumValue(data) { sliderMenu.minimumValue = data.minimum; sliderMenu.value = data.value; compare(sliderMenu.value, data.expected, "Minimum value (" + data.minimum + ") not functioning"); } function test_maximumValue_data() { return [ { tag: "less", maximum: 80, value: 100, expected: 80 }, { tag: "equal", maximum: 100, value: 100, expected: 100 }, { tag: "greater", maximum: 100, value: 120, expected: 100 }, ]; } function test_maximumValue(data) { sliderMenu.maximumValue = data.maximum; sliderMenu.value = data.value; compare(sliderMenu.value, data.expected, "Maximum value (" + data.minimum + ") not functioning"); } // simulates dragging the slider to a value function test_setSliderValue() { var slider = findChild(sliderMenu, "slider"); verify(slider !== undefined); slider.value = 20; compare(sliderMenu.value, 20, "Slider value not updating menu value"); } // simulates dragging the slider to a value function test_setMenuValue() { var slider = findChild(sliderMenu, "slider"); verify(slider !== undefined); sliderMenu.value = 20; compare(slider.value, 20, "Menu value not updating slider value"); } function test_updateMinimumValue_data() { return [ { tag: "less", originalMinimum: 20, value: 0, newMinimum: 0 }, { tag: "greater", originalMinimum: 0, value: 20, newMinimum: 20 }, ]; } // tests that changing the Minimum value will update the value if originally set lower function test_updateMinimumValue(data) { sliderMenu.minimumValue = data.originalMinimum; sliderMenu.value = data.value; compare(sliderMenu.value, data.originalMinimum > data.value ? sliderMenu.minimumValue : data.value); sliderMenu.minimumValue = data.newMinimum; compare(sliderMenu.value, data.value, "Minimum value (" + data.newMinimum + ") should update the value if originally set lower"); } function test_updateMaximumValue_data() { return [ { tag: "less", originalMaximum: 100, value: 80, newMaximum: 80 }, { tag: "greater", originalMaximum: 80, value: 100, newMaximum: 100 }, ]; } // tests that changing the Maximum value will update the value if originally set higher function test_updateMaximumValue(data) { sliderMenu.maximumValue = data.originalMaximum; sliderMenu.value = data.value; compare(sliderMenu.value, data.originalMaximum < data.value ? sliderMenu.maximumValue : data.value); sliderMenu.maximumValue = data.newMaximum; compare(sliderMenu.value, data.value, "Maximum value (" + data.newMaximum + ") should update the value if originally set higher"); } // simulates clicking the min/max buttons function test_minmaxButtons() { var slider = findChild(sliderMenu2, "slider"); verify(slider !== undefined); var leftButton = findChild(sliderMenu2, "leftButton"); verify(leftButton !== undefined); var rightButton = findChild(sliderMenu2, "rightButton"); verify(rightButton !== undefined); mouseClick(leftButton, leftButton.width / 2, leftButton.height / 2); compare(slider.value, sliderMenu2.minimumValue, "Min button not updating menu value"); mouseClick(rightButton, rightButton.width / 2, rightButton.height / 2); compare(slider.value, sliderMenu2.maximumValue, "Max button not updating menu value"); } } } ubuntu-settings-components-0.7+16.04.20160321.1/tests/qmltests/Menus/tst_AccessPointMenu.qml0000644000015600001650000001007512674023445032205 0ustar pbuserpbgroup00000000000000/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Authored by Nick Dedekind */ import QtQuick 2.4 import QtTest 1.0 import Ubuntu.Test 0.1 import Ubuntu.Settings.Menus 0.1 Item { width: units.gu(42) height: units.gu(75) Flickable { id: flickable anchors.fill: parent contentWidth: column.width contentHeight: column.height Item { id: column width: flickable.width height: childrenRect.height AccessPointMenu { id: accessPoint text: "AccessPointMenu" } AccessPointMenu { id: accessPoint2 anchors.top: accessPoint.bottom active: true secure: true adHoc: true signalStrength: 50 text: "AccessPointMenu 2" } } } SignalSpy { id: signalSpyTriggered signalName: "triggered" target: accessPoint } UbuntuTestCase { name: "AccessPointMenu" when: windowShown function init() { accessPoint.active = false; accessPoint.secure = false; accessPoint.adHoc = false; accessPoint.signalStrength = 0; signalSpyTriggered.clear(); } function test_activate() { mouseClick(accessPoint, accessPoint.width / 2, accessPoint.height / 2); compare(signalSpyTriggered.count > 0, true, "activate signal should have been triggered"); } function test_signalIcon_data() { return [ {tag: '-10', signal:-10, adHoc: false, icon: "nm-signal-00"}, {tag: '-10:adhoc', signal:-10, adHoc: true, icon: "nm-adhoc"}, {tag: '0', signal:0, adHoc: false, icon: "nm-signal-00"}, {tag: '0:adhoc', signal:0, adHoc: true, icon: "nm-adhoc"}, {tag: '25', signal:25, adHoc: false, icon: "nm-signal-25"}, {tag: '25:adhoc', signal:25, adHoc: true, icon: "nm-adhoc"}, {tag: '50', signal:50, adHoc: false, icon: "nm-signal-50"}, {tag: '50:adhoc', signal:50, adHoc: true, icon: "nm-adhoc"}, {tag: '75', signal:75, adHoc: false, icon: "nm-signal-75"}, {tag: '75:adhoc', signal:75, adHoc: true, icon: "nm-adhoc"}, {tag: '100', signal:100, adHoc: false, icon: "nm-signal-100"}, {tag: '100:adhoc', signal:100, adHoc: true, icon: "nm-adhoc"}, {tag: '200', signal:200, adHoc: false, icon: "nm-signal-100"}, {tag: '200:adhoc', signal:200, adHoc: true, icon: "nm-adhoc"}, ]; } function test_signalIcon(data) { accessPoint.signalStrength = data.signal; accessPoint.adHoc = data.adHoc; var icon = findChild(accessPoint, "iconSignal"); verify(icon !== undefined); compare(icon.name, data.icon, "Incorret icon for strength"); } function test_secure(data) { var icon = findChild(accessPoint, "iconSecure"); verify(icon !== undefined); accessPoint.secure = true; compare(icon.visible, true, "Secure icon should be visible when access point is secure"); accessPoint.secure = false; compare(icon.visible, false, "Secure icon should not be visible when access point is not secure"); } } } ubuntu-settings-components-0.7+16.04.20160321.1/tests/qmltests/Menus/tst_ProgressValueMenu.qml0000644000015600001650000000326112674023445032572 0ustar pbuserpbgroup00000000000000/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Authored by Nick Dedekind */ import QtQuick 2.4 import QtTest 1.0 import Ubuntu.Test 0.1 import Ubuntu.Settings.Menus 0.1 Item { width: units.gu(42) height: units.gu(75) Flickable { id: flickable anchors.fill: parent contentWidth: column.width contentHeight: column.height Item { id: column width: flickable.width height: childrenRect.height ProgressValueMenu { id: progressMenu text: i18n.tr("Progress Value") iconSource: Qt.resolvedUrl("../../artwork/avatar.png") value: 0 } } } UbuntuTestCase { name: "ProgressValueMenu" when: windowShown function test_label() { var progress = findChild(progressMenu, "progress"); verify(progress !== undefined); progressMenu.value = 20; compare(progress.text, "20 %", "Label is not in correct format."); } } } ubuntu-settings-components-0.7+16.04.20160321.1/tests/qmltests/Menus/tst_SectionMenu.qml0000644000015600001650000000355112674023445031377 0ustar pbuserpbgroup00000000000000/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Authored by Nick Dedekind */ import QtQuick 2.4 import QtTest 1.0 import Ubuntu.Test 0.1 import Ubuntu.Settings.Menus 0.1 Item { width: units.gu(42) height: units.gu(75) Flickable { id: flickable anchors.fill: parent contentWidth: column.width contentHeight: column.height Item { id: column width: flickable.width height: childrenRect.height SectionMenu { id: section1 text: i18n.tr("Section Starts Here: 1"); } SectionMenu { id: section2 text: i18n.tr("Section Starts Here: 2"); busy: true anchors.top: section1.bottom } } } UbuntuTestCase { name: "SectionMenu" when: windowShown function init() { section1.busy = false; } function test_busy() { var indicator = findChild(section1, "indicator"); verify(indicator.running === false); section1.busy = true compare(indicator.running, true, "Activity indicator should be animating when busy"); } } } ubuntu-settings-components-0.7+16.04.20160321.1/tests/qmltests/Menus/tst_TimeZoneMenu.qml0000644000015600001650000000361412674023445031525 0ustar pbuserpbgroup00000000000000/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Authored by Andrea Cimitan */ import QtQuick 2.4 import QtTest 1.0 import Ubuntu.Test 0.1 import Ubuntu.Settings.Menus 0.1 Item { width: units.gu(42) height: units.gu(75) Flickable { id: flickable anchors.fill: parent contentWidth: column.width contentHeight: column.height Item { id: column width: flickable.width height: childrenRect.height TimeZoneMenu { id: timeZoneMenu city: "San Francisco, USA" time: "10:00am" } TimeZoneMenu { id: timeZoneMenu2 city: "London, UK" time: "6:00pm" anchors.top: timeZoneMenu.bottom } } } UbuntuTestCase { name: "TimeZoneMenu" when: windowShown function test_city() { timeZoneMenu.city = "London, UK" compare(timeZoneMenu.city, "London, UK", "Cannot set city") } function test_time() { timeZoneMenu.time = "12:00am" var timeLabel = findChild(timeZoneMenu, "timeLabel") compare(timeLabel.text, "12:00am", "Cannot set time") } } } ubuntu-settings-components-0.7+16.04.20160321.1/tests/qmltests/Menus/tst_TextMessageMenu.qml0000644000015600001650000002251112674023445032221 0ustar pbuserpbgroup00000000000000/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Authored by Nick Dedekind */ import QtQuick 2.4 import QtTest 1.0 import Ubuntu.Test 0.1 import Ubuntu.Settings.Menus 0.1 Item { width: units.gu(42) height: units.gu(75) Flickable { id: flickable anchors.fill: parent contentWidth: column.width contentHeight: column.height Item { id: column width: flickable.width height: childrenRect.height TextMessageMenu { id: messageMenu removable: false title: "Text Message" body: "I am a little teapot" time: "11:08am" _animationDuration: 0 } TextMessageMenu { id: messageMenuRemovable removable: true anchors.top: messageMenu.bottom _animationDuration: 0 } TextMessageMenu { id: messageMenuSelected removable: true anchors.top: messageMenuRemovable.bottom _animationDuration: 0 onReplied: { textMessageReply = value; } } } } property string textMessageReply: "" SignalSpy { id: signalSpyIconActivated signalName: "iconActivated" target: messageMenuSelected } SignalSpy { id: signalSpyDismiss signalName: "dismissed" target: messageMenuRemovable } SignalSpy { id: signalSpyReply signalName: "replied" target: messageMenuSelected } SignalSpy { id: signalSpyTriggered signalName: "triggered" target: messageMenuSelected } UbuntuTestCase { name: "TextMessageMenu" when: windowShown function cleanup() { textMessageReply = ""; messageMenu.replyEnabled = true; messageMenuSelected.selected = false; signalSpyIconActivated.clear(); signalSpyDismiss.clear(); signalSpyReply.clear(); signalSpyTriggered.clear(); var replyText = findChild(messageMenu, "replyText"); verify(replyText !== undefined, "Reply text not found"); replyText.text = ""; replyText = findChild(messageMenuRemovable, "replyText"); verify(replyText !== undefined, "Reply text not found"); replyText.text = ""; replyText = findChild(messageMenuSelected, "replyText"); verify(replyText !== undefined, "Reply text not found"); replyText.text = ""; } function test_title_data() { return [ { title: "title1" }, { title: "title2" }, ]; } function test_title(data) { messageMenu.title = data.title; var title = findChild(messageMenu, "title"); verify(title, "No title"); compare(title.text, data.title, "Title does not match set title."); } function test_time_data() { return [ { time: "11:09am" }, { time: "4pm" }, ]; } function test_time(data) { messageMenu.time = data.time; var subtitle = findChild(messageMenu, "time"); verify(subtitle !== undefined, "No time"); compare(subtitle.text, data.time, "Time does not match set time."); } function test_avatar_data() { return [ { avatar: Qt.resolvedUrl("../../artwork/avatar.png") }, { avatar: Qt.resolvedUrl("../../artwork/rhythmbox.png") }, ]; } function test_avatar(data) { messageMenu.avatar = data.avatar; var avatar = findChild(messageMenu, "avatar"); verify(avatar !== undefined, "No avatar"); compare(avatar.source, data.avatar, "Avatar does not match set avatar."); } function test_icon_data() { return [ { icon: Qt.resolvedUrl("../../artwork/avatar.png") }, { icon: Qt.resolvedUrl("../../artwork/rhythmbox.png") }, ]; } function test_icon(data) { messageMenu.icon = data.icon; var icon = findChild(messageMenu, "icon"); verify(icon !== undefined, "No icon"); compare(icon.source, data.icon, "Icon does not match set icon."); } function test_body_data() { return [ { body: "This is a test." }, { body: "Test is also a test." }, ]; } function test_body(data) { messageMenu.body = data.body; var body = findChild(messageMenu, "body"); verify(body !== undefined, "No body"); compare(body.text, data.body, "Message does not match set message."); } function test_iconActivated() { var icon = findChild(messageMenuSelected, "icon"); mouseClick(icon, icon.width / 2, icon.height / 2); compare(signalSpyIconActivated.count > 0, true, "activate icon should have been triggered"); } function test_dismiss() { mouseFlick(messageMenuRemovable, messageMenuRemovable.width / 2, messageMenuRemovable.height / 2, messageMenuRemovable.width, messageMenuRemovable.height / 2, true, true, units.gu(1), 10); tryCompareFunction(function() { return signalSpyDismiss.count > 0; }, true); } function test_replyButtonText_data() { return [ { buttonText: "Send" }, { buttonText: "reply" }, ]; } function test_replyButtonText(data) { messageMenu.replyButtonText = data.buttonText; var button = findChild(messageMenu, "sendButton"); verify(button !== undefined, "No send button"); compare(button.text, data.buttonText, "Button text does not match set text."); } function test_replyEnabled_data() { return [ { tag: 'disabledNoReply', enabled: false, reply: "", expected: false}, { tag: 'enabledNoReply', enabled: true, reply: "", expected: false}, { tag: 'disabledWithReply', enabled: false, reply: "test", expected: false}, { tag: 'enabledWithReply', enabled: true, reply: "test", expected: true}, ]; } function test_replyEnabled(data) { messageMenuSelected.selected = true; messageMenuSelected.replyEnabled = data.enabled var replyText = findChild(messageMenuSelected, "replyText"); verify(replyText !== undefined, "Reply text not found"); var sendButton = findChild(messageMenuSelected, "sendButton"); verify(sendButton !== undefined, "Send button not found"); replyText.text = data.reply; compare(sendButton.enabled, data.expected, "Reply button is not in correct state"); } function test_reply() { messageMenuSelected.selected = true; messageMenuSelected.replyEnabled = true; var replyText = findChild(messageMenuSelected, "replyText"); verify(replyText !== undefined, "Reply text not found"); replyText.text = "reply1"; var sendButton = findChild(messageMenuSelected, "sendButton"); verify(sendButton !== undefined, "Send button not found"); mouseClick(sendButton, sendButton.width / 2, sendButton.height / 2); compare(signalSpyReply.count > 0, true); compare(textMessageReply, "reply1", "Text message did not reply with correct text."); } function test_multipleLineReply_lp1396058() { messageMenuSelected.selected = true; messageMenuSelected.replyEnabled = true; var replyText = findChild(messageMenuSelected, "replyText"); verify(replyText !== undefined, "Reply text not found"); mouseClick(replyText, replyText.width / 2, replyText.height / 2); compare(replyText.focus, true, "Reply text should have focus after mouse click"); keyClick("a"); keyClick("b"); keyClick(Qt.Key_Return); keyClick("c"); keyClick("d"); compare(signalSpyTriggered.count, 0, "Item should not have triggered on 'return'") compare(replyText.focus, true, "Reply text should still have focus after return pressed"); compare(replyText.text, "ab\ncd"); } } } ubuntu-settings-components-0.7+16.04.20160321.1/tests/qmltests/Menus/tst_SimpleMessageMenu.qml0000644000015600001650000001224112674023445032525 0ustar pbuserpbgroup00000000000000/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Authored by Nick Dedekind */ import QtQuick 2.4 import QtTest 1.0 import Ubuntu.Test 0.1 import Ubuntu.Settings.Menus 0.1 Item { width: units.gu(42) height: units.gu(75) Flickable { id: flickable anchors.fill: parent contentWidth: column.width contentHeight: column.height Item { id: column width: flickable.width height: childrenRect.height SimpleMessageMenu { id: messageMenu removable: false title: "Text Message" body: "I am a little teapot" time: "11:08am" } SimpleMessageMenu { id: messageMenuRemovable removable: true anchors.top: messageMenu.bottom } SimpleMessageMenu { id: messageMenuSelected removable: true anchors.top: messageMenuRemovable.bottom } } } SignalSpy { id: signalSpyIconActivated signalName: "iconActivated" target: messageMenuSelected } SignalSpy { id: signalSpyDismiss signalName: "dismissed" target: messageMenuRemovable } UbuntuTestCase { name: "SimpleTextMessageMenu" when: windowShown function init() { signalSpyIconActivated.clear(); signalSpyDismiss.clear(); messageMenuSelected.selected = false; } function test_title_data() { return [ { title: "title1" }, { title: "title2" }, ]; } function test_title(data) { messageMenu.title = data.title; var title = findChild(messageMenu, "title"); verify(title, "No title"); compare(title.text, data.title, "Title does not match set title."); } function test_time_data() { return [ { time: "11:09am" }, { time: "4pm" }, ]; } function test_time(data) { messageMenu.time = data.time; var time = findChild(messageMenu, "time"); verify(time !== undefined, "No time"); compare(time.text, data.time, "Time does not match set time."); } function test_avatar_data() { return [ { avatar: Qt.resolvedUrl("../../artwork/avatar.png") }, { avatar: Qt.resolvedUrl("../../artwork/rhythmbox.png") }, ]; } function test_avatar(data) { messageMenu.avatar = data.avatar; var avatar = findChild(messageMenu, "avatar"); verify(avatar !== undefined, "No avatar"); compare(avatar.source, data.avatar, "Avatar does not match set avatar."); } function test_icon_data() { return [ { icon: Qt.resolvedUrl("../../artwork/avatar.png") }, { icon: Qt.resolvedUrl("../../artwork/rhythmbox.png") }, ]; } function test_icon(data) { messageMenu.icon = data.icon; var icon = findChild(messageMenu, "icon"); verify(icon !== undefined, "No icon"); compare(icon.source, data.icon, "Icon does not match set icon."); } function test_body_data() { return [ { body: "This is a test." }, { body: "Test is also a test." }, ]; } function test_body(data) { messageMenu.body = data.body; var body = findChild(messageMenu, "body"); verify(body !== undefined, "No body"); compare(body.text, data.body, "Message does not match set message."); } function test_iconActivated() { var icon = findChild(messageMenuSelected, "icon"); mouseClick(icon, icon.width / 2, icon.height / 2); compare(signalSpyIconActivated.count > 0, true, "activate icon should have been triggered"); } function test_dismiss() { mouseFlick(messageMenuRemovable, messageMenuRemovable.width / 2, messageMenuRemovable.height / 2, messageMenuRemovable.width, messageMenuRemovable.height / 2, true, true, units.gu(1), 10); tryCompareFunction(function() { return signalSpyDismiss.count > 0; }, true); } } } ubuntu-settings-components-0.7+16.04.20160321.1/tests/qmltests/Menus/tst_CalendarMenu.qml0000644000015600001650000000471012674023445031502 0ustar pbuserpbgroup00000000000000/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Authored by Andrea Cimitan */ import QtQuick 2.4 import QtTest 1.0 import Ubuntu.Test 0.1 import Ubuntu.Settings.Menus 0.1 Item { width: units.gu(42) height: units.gu(75) property var date1: new Date(2012, 2, 10) property var date2: new Date(2013, 5, 10) property var date3: new Date(2014, 6, 10) Flickable { id: flickable anchors.fill: parent contentWidth: column.width contentHeight: column.height Item { id: column width: flickable.width height: childrenRect.height CalendarMenu { id: calendarMenu } } } UbuntuTestCase { name: "CalendarMenu" when: windowShown property var calendar: findChild(calendarMenu, "calendar") function test_collapsed() { calendarMenu.collapsed = true compare(calendar.collapsed, true, "Cannot set collapsed") } function test_currentDate() { calendarMenu.currentDate = date2 compare(calendar.currentDate, date2, "Cannot set currendDate") } function test_firstDayOfWeek() { calendarMenu.firstDayOfWeek = 5 compare(calendar.firstDayOfWeek, 5, "Cannot set firstDayOfWeek") } function test_maximumDate() { calendarMenu.maximumDate = date3 compare(calendar.maximumDate, date3, "Cannot set maximumDate") } function test_minimumDate() { calendar.minimumDate = date1 compare(calendar.minimumDate, date1, "Cannot set minimumDate") } function test_selectedDate() { calendar.selectedDate = date2 compare(calendar.selectedDate, date2, "Cannot set selectedDate") } } } ubuntu-settings-components-0.7+16.04.20160321.1/tests/qmltests/Menus/tst_CheckableMenu.qml0000644000015600001650000000467412674023445031643 0ustar pbuserpbgroup00000000000000/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Authored by Nick Dedekind */ import QtQuick 2.4 import QtTest 1.0 import Ubuntu.Test 0.1 import Ubuntu.Settings.Menus 0.1 Item { width: units.gu(42) height: units.gu(75) Flickable { id: flickable anchors.fill: parent contentWidth: column.width contentHeight: column.height Item { id: column width: flickable.width height: childrenRect.height CheckableMenu { id: checkMenu text: i18n.tr("Check") } } } SignalSpy { id: signalSpyTriggered signalName: "triggered" target: checkMenu } UbuntuTestCase { name: "CheckableMenu" when: windowShown function init() { checkMenu.checked = false; signalSpyTriggered.clear(); } function test_checkChanged() { var checkbox = findChild(checkMenu, "checkbox"); verify(checkbox !== undefined); compare(checkbox.checked, false, "Checkbox should initially be unchecked"); checkMenu.checked = true; compare(checkbox.checked, true, "Checkbox should be checked"); } function test_clickCheckBox() { var checkbox = findChild(checkMenu, "checkbox"); verify(checkbox !== undefined); mouseClick(checkMenu, checkbox.width / 2, checkbox.height / 2); compare(signalSpyTriggered.count > 0, true, "signal checked not triggered on checkbox click"); } function test_clickCheckMenu() { mouseClick(checkMenu, checkMenu.width / 2, checkMenu.height / 2); compare(signalSpyTriggered.count > 0, true, "signal checked not triggered on checkMenu click"); } } } ubuntu-settings-components-0.7+16.04.20160321.1/tests/qmltests/Menus/tst_EventMenu.qml0000644000015600001650000000415712674023445031057 0ustar pbuserpbgroup00000000000000/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Authored by Andrea Cimitan */ import QtQuick 2.4 import QtTest 1.0 import Ubuntu.Test 0.1 import Ubuntu.Settings.Menus 0.1 Item { width: units.gu(42) height: units.gu(75) Flickable { id: flickable anchors.fill: parent contentWidth: column.width contentHeight: column.height Item { id: column width: flickable.width height: childrenRect.height EventMenu { id: eventMenu eventColor: "yellow" text: "Lunch with Lola" time: "1:10 PM" } } } SignalSpy { id: signalSpyTriggered signalName: "triggered" target: eventMenu } TestCase { name: "EventMenu" when: windowShown function test_eventColor() { eventMenu.eventColor = "red" compare(eventMenu.eventColor, "#ff0000", "Cannot set color") } function test_name() { eventMenu.text = "Gym" compare(eventMenu.text, "Gym", "Cannot set name") } function test_time() { eventMenu.time = "6:30 PM" compare(eventMenu.time, "6:30 PM", "Cannot set date") } function test_triggered() { mouseClick(eventMenu, eventMenu.width / 2, eventMenu.height / 2); compare(signalSpyTriggered.count > 0, true, "should have been triggered"); } } } ubuntu-settings-components-0.7+16.04.20160321.1/tests/qmltests/Components/0000755000015600001650000000000012674023672026575 5ustar pbuserpbgroup00000000000000ubuntu-settings-components-0.7+16.04.20160321.1/tests/qmltests/Components/tst_Calendar.qml0000644000015600001650000001203712674023445031714 0ustar pbuserpbgroup00000000000000/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Authored by Andrea Cimitan */ import QtQuick 2.4 import QtTest 1.0 import Ubuntu.Test 0.1 import Ubuntu.Settings.Components 0.1 Item { width: units.gu(42) height: units.gu(75) Text { id: label anchors { left: parent.left right: parent.right top: parent.top margins: units.gu(2) } height: units.gu(5) text: Qt.formatDate(calendar.currentDate, "MMMM") + " " + calendar.currentDate.getFullYear() } Calendar { id: calendar anchors { left: parent.left right: parent.right top: label.bottom } selectedDate: new Date() } UbuntuTestCase { name: "Calendar" when: windowShown function init() { calendar.selectedDate = new Date(2013, 4, 10); calendar.maximumDate = undefined; calendar.minimumDate = undefined; } function test_collapsed() { calendar.collapsed = true; compare(calendar.interactive, false, "Calendar should not be interactive"); var collapsedHeight = calendar.height; calendar.collapsed = false; verify(calendar.height > collapsedHeight * 4 && calendar.height < collapsedHeight * 6, "Height did not expand properly"); compare(calendar.interactive, true, "Calendar should be interactive"); } function test_selectedDate_data() { return [ { date: new Date(2010, 4, 10) }, { date: new Date() }, { date: new Date(2020, 10, 31)}, ]; } function test_selectedDate(data) { calendar.selectedDate = data.date; compare(calendar.currentItem.monthStart.getYear(), data.date.getYear(), "Current year does no correspond to set date"); compare(calendar.currentItem.monthStart.getMonth(), data.date.getMonth(), "Current month does no correspond to set date"); } function test_firstDayOfWeek_data() { return [ {tag: 'Thursday', firstDayOfWeek: 5}, {tag: 'Sunday', firstDayOfWeek: 0}, ]; } function test_firstDayOfWeek(data) { calendar.firstDayOfWeek = data.firstDayOfWeek; for (var i = 0; i < (6*7); i++) { var dayColumn = findChild(calendar, "dayItem" + i); verify(dayColumn); compare(dayColumn.dayStart.getDay(), (data.firstDayOfWeek + i)%7, "Day column does not match expected for firstDayOfWeek"); } } function test_minMaxDate_data() { return [ {tag: "Min=-0", date: new Date(), minDate: new Date(), maxDate: undefined, count: 3}, {tag: "Min=-1", date: new Date(), minDate: new Date().addMonths(-1), maxDate: undefined, count: 4}, {tag: "Min=-22", date: new Date(), minDate: new Date().addMonths(-22), maxDate: undefined, count: 5}, // max out at +-2 {tag: "Max=+0", date: new Date(), minDate: undefined, maxDate: new Date(), count: 3}, {tag: "Max=+1", date: new Date(), minDate: undefined, maxDate: new Date().addMonths(1), count: 4}, {tag: "Max=+22", date: new Date(), minDate: undefined, maxDate: new Date().addMonths(22), count: 5}, // max out at +-2 {tag: "Min=-0,Max=+0", date: new Date(), minDate: new Date(), maxDate: new Date(), count: 1}, {tag: "Min=-1,Max=+1", date: new Date(), minDate: new Date().addMonths(-1), maxDate: new Date().addMonths(1), count: 3}, {tag: "Min=-22,Max=+1", date: new Date(), minDate: new Date().addMonths(-22), maxDate: new Date().addMonths(1), count: 4}, // max out at +-2 {tag: "Min=-1,Max=+22", date: new Date(), minDate: new Date().addMonths(-1), maxDate: new Date().addMonths(22), count: 4}, // max out at +-2 {tag: "Min=-22,Max=+22", date: new Date(), minDate: new Date().addMonths(-22), maxDate: new Date().addMonths(22), count: 5}, // max out at +-2 ]; } function test_minMaxDate(data) { calendar.selectedDate = data.date; calendar.minimumDate = data.minDate; calendar.maximumDate = data.maxDate; compare(calendar.count, data.count, "The number of months should have changed"); } } } ././@LongLink0000000000000000000000000000015500000000000011216 Lustar 00000000000000ubuntu-settings-components-0.7+16.04.20160321.1/tests/qmltests/Components/tst_ServerPropertySynchroniser.qmlubuntu-settings-components-0.7+16.04.20160321.1/tests/qmltests/Components/tst_ServerPropertySynchron0000644000015600001650000003004512674023445034151 0ustar pbuserpbgroup00000000000000/* * Copyright 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ import QtQuick 2.4 import QtTest 1.0 import Ubuntu.Test 0.1 import Ubuntu.Settings.Components 0.1 as USC import Ubuntu.Settings.Menus 0.1 as USM import Ubuntu.Components 1.3 Item { id: root width: units.gu(60) height: units.gu(70) QtObject { id: switchBackend property bool checked: false property bool inSync: checked === switchControl.checked property Timer timer: Timer { interval: 2000 onTriggered: switchBackend.checked = !switchBackend.checked } } QtObject { id: checkBackend property bool checked: false property bool inSync: checked === checkControl.checked property Timer timer: Timer { interval: 2000 onTriggered: checkBackend.checked = !checkBackend.checked } } QtObject { id: sliderBackend property real value: 50 property bool inSync: value === slider.value property var changeToValue: undefined property Timer timer: Timer { interval: 2000 onTriggered: { sliderBackend.value = sliderBackend.changeToValue; } } } QtObject { id: apBackend property bool active: false property bool inSync: active === apMenu.active property Timer timer: Timer { interval: 2000 onTriggered: apBackend.active = !apBackend.active } } Column { anchors.fill: parent anchors.margins: units.gu(1) spacing: units.gu(2) Row { spacing: units.gu(3) Switch { id: switchControl anchors.verticalCenter: parent.verticalCenter USC.ServerPropertySynchroniser { id: switchSync objectName: "switchSync" syncTimeout: 3000 userTarget: switchControl userProperty: "checked" serverTarget: switchBackend serverProperty: "checked" onSyncTriggered: switchBackend.timer.start() onSyncWaitingChanged: switchSyncSpy.clear() } } Column { Label { text: switchBackend.inSync ? "synced" : "out of sync" } Label { text: switchSync.syncWaiting ? "syncWait" : "no syncWait" } Label { text: "activates: " + switchSyncSpy.count } } } Row { spacing: units.gu(3) CheckBox { id: checkControl anchors.verticalCenter: parent.verticalCenter USC.ServerPropertySynchroniser { id: checkSync objectName: "checkSync" syncTimeout: 3000 userTarget: checkControl userProperty: "checked" serverTarget: checkBackend serverProperty: "checked" onSyncTriggered: checkBackend.timer.start() onSyncWaitingChanged: checkSyncSpy.clear() } } Column { Label { text: checkBackend.inSync ? "synced" : "out of sync" } Label { text: checkSync.syncWaiting ? "syncWait" : "no syncWait" } Label { text: "activates: " + checkSyncSpy.count } } } Row { id: sliderRoot spacing: units.gu(3) Slider { id: slider anchors.verticalCenter: parent.verticalCenter live: true minimumValue: 0.0 maximumValue: 100.0 property real serverValue: sliderBackend.value USC.ServerPropertySynchroniser { id: sliderSync objectName: "sliderSync" syncTimeout: 3000 maximumWaitBufferInterval: 50 userTarget: slider userProperty: "value" serverTarget: slider serverProperty: "serverValue" onSyncTriggered: { sliderBackend.changeToValue = value; sliderBackend.timer.start(); } onSyncWaitingChanged: sliderSyncSpy.clear() } } Column { Label { text: sliderBackend.inSync ? "synced" : "out of sync" } Label { text: sliderSync.syncWaiting ? "syncWait" : "no syncWait" } Label { text: "activates: " + sliderSyncSpy.count } } } Row { spacing: units.gu(3) height: childrenRect.height anchors.left: parent.left anchors.right: parent.right USM.AccessPointMenu { id: apMenu width: units.gu(30) text: "Test Check Menu" USC.ServerPropertySynchroniser { id: apMenuSync objectName: "apMenuSync" syncTimeout: 3000 userTarget: apMenu userProperty: "active" userTrigger: "onTriggered" serverTarget: apBackend serverProperty: "active" onSyncTriggered: apBackend.timer.start() onSyncWaitingChanged: switchSyncSpy.clear() } } Column { Label { text: apBackend.inSync ? "synced" : "out of sync" } Label { text: apMenuSync.syncWaiting ? "syncWait" : "no syncWait" } Label { text: "activates: " + apSyncSpy.count } } } } SignalSpy { id: switchSyncSpy target: switchControl signalName: "triggered" } SignalSpy { id: checkSyncSpy target: checkControl signalName: "triggered" } SignalSpy { id: sliderSyncSpy target: slider signalName: "valueChanged" } SignalSpy { id: apSyncSpy target: apMenu signalName: "triggered" } SignalSpy { id: sliderSyncActivatedSpy target: sliderSync signalName: "syncTriggered" } SignalSpy { id:apSyncActivatedSpy target: apMenuSync signalName: "syncTriggered" } QtObject { id: switchBackend2 property bool checked2: false property bool inSync: checked2 === switchControl.checked property Timer switchTimer: Timer { interval: 1000 onTriggered: switchBackend2.checked2 = !switchBackend2.checked2 } } UbuntuTestCase { name: "ServerActivationSync" when: windowShown function init() { waitForRendering(root); switchSync.reset(); checkSync.reset(); sliderSync.reset(); apMenuSync.reset(); switchBackend.timer.interval = 100; checkBackend.timer.interval = 100; sliderBackend.timer.interval = 200; apBackend.timer.interval = 100; switchSync.syncTimeout = 200; checkSync.syncTimeout = 200; sliderSync.syncTimeout = 400; apMenuSync.syncTimeout = 200; sliderSyncActivatedSpy.clear(); apSyncActivatedSpy.clear(); } function cleanup() { switchBackend.timer.stop(); checkBackend.timer.stop(); sliderBackend.timer.stop(); switchBackend.checked = false; checkBackend.checked = false; sliderBackend.value = 50; apBackend.active = false; sliderSync.maximumWaitBufferInterval = -1 tryCompare(switchBackend, "inSync", true); tryCompare(checkBackend, "inSync", true); tryCompare(sliderBackend, "inSync", true); switchSync.serverTarget = switchBackend; switchSync.serverProperty = "checked"; } function test_backend_change() { switchBackend.checked = true; compare(switchControl.checked, true, "Switch should have been toggled"); switchBackend.checked = false; compare(switchControl.checked, false, "Switch should have been toggled"); } function test_frontend_change() { switchControl.trigger(); tryCompare(switchBackend, "checked", true); } function test_frontend_change_with_value() { slider.value = 60; tryCompare(sliderBackend, "value", 60); } function test_break_binding_change() { switchControl.checked = true; switchBackend.checked = true; switchBackend.checked = false; compare(switchControl.checked, false, "Switch should have been toggled"); } function test_buffered_change_with_value() { slider.value = 60; compare(sliderSyncActivatedSpy.count, 1, "activated signal should have been sent") slider.value = 70; slider.value = 80; slider.value = 90; compare(sliderSyncActivatedSpy.count, 1, "activated signals should have been buffered") tryCompare(sliderBackend, "value", 90); tryCompare(sliderSyncActivatedSpy, "count", 2) } function test_buffered_change_with_maximum_interval() { sliderSync.maximumWaitBufferInterval = 25; sliderSync.syncTimeout = 5000; slider.value = 60; compare(sliderSyncActivatedSpy.count, 1, "activated signal should have been sent"); slider.value = 70; slider.value = 80; wait(100); // wait for buffer timeout tryCompare(sliderSyncActivatedSpy, "count", 2, 1000, "aditional activate signal should have been sent"); compare(slider.value, 80, "value should be set to last activate"); slider.value = 90; wait(100); // wait for buffer timeout tryCompare(sliderSyncActivatedSpy, "count", 3, 1000, "aditional activate signal should have been sent"); compare(slider.value, 90, "value should be set to last activate"); } function test_connect_to_another_object() { switchSync.serverTarget = switchBackend2; switchSync.serverProperty = "checked2"; switchBackend2.checked2 = true; compare(switchControl.checked, true, "Switch should have been toggled"); switchBackend2.checked2 = false; compare(switchControl.checked, false, "Switch should have been toggled"); } function test_client_revert() { switchBackend.timer.interval = 500; switchControl.trigger(); compare(switchControl.checked, true); tryCompare(switchControl, "checked", false); } function test_user_trigger() { apMenu.trigger(); compare(apSyncActivatedSpy.count, 1, "Triggering should have caused signal to be emitted"); tryCompare(apBackend, "active", true); compare(apMenu.active, true, "User value should have updated to match server"); } function test_user_trigger_doesnt_activate_on_user_property_change() { apMenu.active = true; compare(apSyncActivatedSpy.count, 0); } } } ubuntu-settings-components-0.7+16.04.20160321.1/tests/qmltests/Components/tst_StatusIcon.qml0000644000015600001650000000456712674023445032310 0ustar pbuserpbgroup00000000000000/* * Copyright 2014 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ import QtQuick 2.4 import QtTest 1.0 import Ubuntu.Test 0.1 import Ubuntu.Settings.Components 0.1 Item { width: units.gu(40) height: units.gu(70) StatusIcon { id: icon height: units.gu(3) } UbuntuTestCase { name: "StatusIcon" when: windowShown function init() { icon.source = ""; icon.sets = [ "status" ] waitForRendering(icon) } function test_icon() { icon.source = "image://theme/bar,gps,baz"; var image = findChild(icon, "image"); tryCompare(image, "source", "file://" + image.iconPath.arg("status").arg("gps")); } function test_iconFallback() { icon.source = "image://theme/foo,bar,baz"; var image = findChild(icon, "image"); tryCompare(image, "source", "file://" + image.iconPath.arg("status").arg("baz")); } function test_iconSets() { icon.source = "image://theme/bar,add,baz"; icon.sets = [ "foo", "actions", "bar" ] var image = findChild(icon, "image"); tryCompare(image, "source", "file://" + image.iconPath.arg("actions").arg("add")); } function test_iconSetsFallback() { icon.source = "image://theme/add,bar,baz"; icon.sets = [ "foo", "bar", "baz" ] var image = findChild(icon, "image"); tryCompare(image, "source", "file://" + image.iconPath.arg("baz").arg("baz")); } function test_iconSource() { var image = findChild(icon, "image"); icon.source = image.iconPath.arg("status").arg("gps"); tryCompare(image, "source", "file://" + image.iconPath.arg("status").arg("gps")); } } } ubuntu-settings-components-0.7+16.04.20160321.1/tests/qmltests/Vpn/0000755000015600001650000000000012674023672025213 5ustar pbuserpbgroup00000000000000ubuntu-settings-components-0.7+16.04.20160321.1/tests/qmltests/Vpn/tst_VpnEditor.qml0000644000015600001650000000530112674023445030527 0ustar pbuserpbgroup00000000000000/* * Copyright 2016 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Authored by Jonas G. Drange */ import QtQuick 2.4 import QtTest 1.0 import Ubuntu.Test 0.1 import Ubuntu.Settings.Vpn 0.1 Item { width: units.gu(42) height: units.gu(75) VpnEditor { anchors.fill: parent id: vpnEditor } Component { id: vpnEditorPart Item { property bool changed: false property bool valid: false property var getChanges } } UbuntuTestCase { name: "VpnPptpEditor" when: windowShown function getLoader() { return findChild(vpnEditor, "editorLoader"); } function init() { getLoader().sourceComponent = vpnEditorPart; } function test_editor_buttons_states_data() { return [ { changed: false, valid: false, okayButtonEnabledTarget: false }, { changed: true, valid: true, okayButtonEnabledTarget: true }, { changed: true, valid: false, okayButtonEnabledTarget: false }, { changed: false, valid: true, okayButtonEnabledTarget: false } ] } function test_editor_buttons_states(data) { var okayButton = findChild(vpnEditor, "vpnEditorOkayButton"); var part = getLoader().item; part.changed = data.changed; part.valid = data.valid; compare(okayButton.enabled, data.okayButtonEnabledTarget); } function test_commit() { var item = getLoader().item; vpnEditor.connection = { gateway: "old" }; // This function gets called by commit() and in it we // make sure the state has changed. We also return a change // to be committed. item.getChanges = function () { compare(item.state, "committing"); return [["gateway", "new"]]; } vpnEditor.commit(); compare(item.state, "succeeded"); compare(vpnEditor.connection["gateway"], "new"); } } } ././@LongLink0000000000000000000000000000015500000000000011216 Lustar 00000000000000ubuntu-settings-components-0.7+16.04.20160321.1/tests/qmltests/Vpn/tst_VpnPreviewDialogCertificateChecks.qmlubuntu-settings-components-0.7+16.04.20160321.1/tests/qmltests/Vpn/tst_VpnPreviewDialogCertificateCh0000644000015600001650000000451112674023445033672 0ustar pbuserpbgroup00000000000000/* * Copyright 2016 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Authored by Jonas G. Drange */ import QtQuick 2.4 import QtTest 1.0 import Ubuntu.Components.Popups 1.3 import Ubuntu.Test 0.1 import Ubuntu.Settings.Vpn 0.1 Item { width: units.gu(42) height: units.gu(75) id: root property var d Component { id: diag VpnPreviewDialog { } } // In these tests, all CA certificates are going to be checked. UbuntuTestCase { name: "VpnPreviewDialogCertificateChecks" when: windowShown function cleanup() { PopupUtils.close(d); } function test_preview_dialog_data() { return [ { tag: "openvpn bad cert", connection: { id: 'openvpn bad cert', remote: "ubuntu.com", type: 0, // openvpn ca: "bad.cert", active: false, neverDefault: false }, targetObject: "vpnPreviewInvalidCert" } ] } function test_preview_dialog(data) { root.d = PopupUtils.open(diag, null, data); waitForRendering(root.d); var target = findChild(root.d, data.targetObject); var errorMsg = findChild(root.d, "vpnPreviewInvalidCertErrorMsg"); verify(target, "found obj " + data.targetObject); compare(root.d.title, i18n.tr("VPN “%1”").arg(data.connection.remote || data.connection.gateway)); compare(errorMsg.text, i18n.tr("Details: %1").arg(i18n.tr("The certificate was not found."))); } } } ubuntu-settings-components-0.7+16.04.20160321.1/tests/qmltests/Vpn/tst_VpnPptpEditor.qml0000644000015600001650000001450212674023445031376 0ustar pbuserpbgroup00000000000000/* * Copyright 2016 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Authored by Jonas G. Drange */ import QtQuick 2.4 import QtTest 1.0 import Ubuntu.Test 0.1 import Ubuntu.Settings.Vpn 0.1 Item { width: units.gu(42) height: units.gu(75) VpnEditor { anchors.fill: parent id: vpnEditor } UbuntuTestCase { name: "VpnPptpEditor" when: windowShown function getLoader() { return findChild(vpnEditor, "editorLoader"); } function init () { waitForRendering(vpnEditor); vpnEditor.connection = { type: 1, // pptp gateway: "", neverDefault: false, user: "", password: "", domain: "", requireMppe: false, mppeType: 0, mppeStateful: false, allowPap: true, allowChap: true, allowMschap: true, allowMschapv2: true, allowEap: true, bsdCompression: true, deflateCompression: true, tcpHeaderCompression: true, sendPppEchoPackets: false, updateSecrets: function () {} } vpnEditor.render(); // Wait until we've loaded tryCompareFunction(function () { return typeof getLoader() }, "object"); tryCompareFunction(function () { return getLoader().status }, Loader.Ready); } function test_fields() { var e = getLoader().item; var c = vpnEditor.connection; var gatewayField = findChild(e, "vpnPptpGatewayField"); var routesField = findChild(e, "vpnPptpRoutesField"); var userField = findChild(e, "vpnPptpUserField"); var passwordField = findChild(e, "vpnPptpPasswordField"); var domainField = findChild(e, "vpnPptpDomainField"); var requireMppeToggle = findChild(e, "vpnPptpRequireMppeToggle"); var mppeTypeSelector = findChild(e, "vpnPptpMppeTypeSelector"); var mppeStatefulToggle = findChild(e, "vpnPptpMppeStatefulToggle"); var allowPapToggle = findChild(e, "vpnPptpAllowPapToggle"); var allowChapToggle = findChild(e, "vpnPptpAllowChapToggle"); var allowMschapToggle = findChild(e, "vpnPptpAllowMschapToggle"); var allowMschapv2Toggle = findChild(e, "vpnPptpAllowMschapv2Toggle"); var allowEapToggle = findChild(e, "vpnPptpAllowEapToggle"); var bsdCompressionToggle = findChild(e, "vpnPptpBsdCompressionToggle"); var deflateCompressionToggle = findChild(e, "vpnPptpDeflateCompressionToggle"); var tcpHeaderCompressionToggle = findChild(e, "vpnPptpHeaderCompressionToggle"); var sendPppEchoPacketsToggle = findChild(e, "vpnPptpPppEchoPacketsToggle"); compare(gatewayField.text, c.gateway); compare(routesField.neverDefault, c.neverDefault); compare(userField.text, c.user); compare(passwordField.text, c.password); compare(domainField.text, c.domain); compare(requireMppeToggle.checked, c.requireMppe); compare(mppeTypeSelector.selectedIndex, c.mppeType); compare(mppeStatefulToggle.checked, c.mppeStateful); compare(allowPapToggle.checked, c.allowPap); compare(allowChapToggle.checked, c.allowChap); compare(allowMschapToggle.checked, c.allowMschap); compare(allowMschapv2Toggle.checked, c.allowMschapv2); compare(allowEapToggle.checked, c.allowEap); compare(bsdCompressionToggle.checked, c.bsdCompression); compare(deflateCompressionToggle.checked, c.deflateCompression); compare(tcpHeaderCompressionToggle.checked, c.tcpHeaderCompression); compare(sendPppEchoPacketsToggle.checked, c.sendPppEchoPackets); } function test_changes() { var e = getLoader().item; var c = vpnEditor.connection; var gatewayField = findChild(e, "vpnPptpGatewayField"); var userField = findChild(e, "vpnPptpUserField"); var passwordField = findChild(e, "vpnPptpPasswordField"); var bsdCompressionToggle = findChild(e, "vpnPptpBsdCompressionToggle"); compare(e.getChanges(), []); // make some changes gatewayField.text = "new gateway"; userField.text = "mark"; passwordField.text = "1234"; bsdCompressionToggle.checked = !c.bsdCompression; compare(e.getChanges(), [ ["gateway", gatewayField.text], ["user", userField.text], ["password", passwordField.text], ["bsdCompression", bsdCompressionToggle.checked] ]); } function test_validity() { var e = getLoader().item; compare(getLoader().item.valid, false); // Make valid findChild(e, "vpnPptpPasswordField").text = "1234"; compare(getLoader().item.valid, true); } } } ubuntu-settings-components-0.7+16.04.20160321.1/tests/qmltests/Vpn/tst_VpnList.qml0000644000015600001650000000772312674023445030226 0ustar pbuserpbgroup00000000000000/* * Copyright 2016 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Authored by Jonas G. Drange */ import QtQuick 2.4 import QtTest 1.0 import Ubuntu.Test 0.1 import Ubuntu.Settings.Vpn 0.1 Item { width: units.gu(42) height: units.gu(75) Flickable { id: flickable anchors.fill: parent contentWidth: column.width contentHeight: column.height Column { id: column width: flickable.width height: childrenRect.height VpnList { id: vpnList anchors { left: parent.left; right: parent.right } model: ListModel { id: vpnModel } } } } SignalSpy { id: connClickedSpy signalName: "clickedConnection" target: vpnList } UbuntuTestCase { name: "VpnList" when: windowShown function first() { return findChild(vpnList, "vpnListConnection" + 0); } function cleanup() { vpnModel.clear(); connClickedSpy.clear(); } function test_list_item_rendering_data() { return [ { tag: "inactive", connection: { id: 'inactive vpn', activatable: true, active: false } }, { tag: "enabled", connection: { id: 'active vpn', activatable: true, active: true } }, { tag: "disabled", connection: { id: 'bad vpn', activatable: false, active: false } } ] } // Test the VPN connection as it appears in the VpnList function test_list_item_rendering(data) { var c = data.connection; vpnModel.append(c); // !! turns first() into a bool, which we compare with the // expected value. tryCompareFunction(function () { return !!first() }, true); var conn = first(); var layout = findChild(conn, "vpnLayout"); var trigger = findChild(conn, "vpnSwitch"); compare(layout.title.text, c.id); compare(trigger.enabled, c.activatable); compare(trigger.checked, c.active); } function test_custom_click_event_data() { return [ { tag: "openvpn", type: 0, id: "openvpn", active: false, activatable: false, connection: {}}, { tag: "pptp", type: 1, id: "pptp", active: false, activatable: false, connection: {}} ] } // Make sure the custom click event is emitted for a connection function test_custom_click_event(data) { vpnModel.append(data); // Wait until first() returns the first vpn list element tryCompareFunction(function () { return typeof first() }, "object"); var conn = first(); mouseClick(conn, conn.width / 2, conn.height / 2); compare(connClickedSpy.count > 0, true, "connection click should have been triggered"); } } } ubuntu-settings-components-0.7+16.04.20160321.1/tests/qmltests/Vpn/tst_VpnPreviewDialog.qml0000644000015600001650000001122612674023445032045 0ustar pbuserpbgroup00000000000000/* * Copyright 2016 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Authored by Jonas G. Drange */ import QtQuick 2.4 import QtTest 1.0 import Ubuntu.Components.Popups 1.3 import Ubuntu.Test 0.1 import Ubuntu.Settings.Vpn 0.1 Item { width: units.gu(42) height: units.gu(75) id: root property var d Component { id: diag VpnPreviewDialog { } } // In these tests, all CA certificates are going to be okay due to // NO_SSL_CERTIFICATE_CHECK env variable being set to 1. UbuntuTestCase { name: "VpnPreviewDialog" when: windowShown function cleanup() { PopupUtils.close(d); } function test_preview_dialog_data() { return [ { tag: "openvpn upunused", connection: { id: 'openvpn unused', remote: "ubuntu.com", type: 0, // openvpn ca: "okay", active: false, neverDefault: false }, targetObject: "vpnPreviewSetUpUnused" }, { tag: "openvpn all", connection: { id: 'openvpn all', remote: "ubuntu.com", type: 0, // openvpn ca: "okay", active: true, neverDefault: false }, targetObject: "vpnPreviewAllTrafficWithoutDns" }, { tag: "openvpn some", connection: { id: 'openvpn some', remote: "ubuntu.com", type: 0, // openvpn ca: "okay", active: true, neverDefault: false }, targetObject: "vpnPreviewAllTrafficWithoutDns" }, { tag: "openvpn no ca", connection: { id: 'openvpn no ca', remote: "ubuntu.com", type: 0, // openvpn active: true, neverDefault: false }, targetObject: "vpnPreviewNoCert" }, { tag: "pptp all", connection: { id: 'pptp all', gateway: "ubuntu.com", type: 1, // pptp active: true, neverDefault: false }, targetObject: "vpnPreviewAllTrafficWithoutDns" }, { tag: "pptp unused", connection: { id: 'pptp unused', gateway: "ubuntu.com", type: 1, // pptp active: false, neverDefault: false }, targetObject: "vpnPreviewSetUpUnused" }, { tag: "pptp some", connection: { id: 'pptp some', gateway: "ubuntu.com", type: 1, // pptp active: true, neverDefault: true }, targetObject: "vpnPreviewSomeTraffic" } ] } function test_preview_dialog(data) { root.d = PopupUtils.open(diag, null, data); waitForRendering(root.d); var target = findChild(root.d, data.targetObject); verify(target, "found obj " + data.targetObject); compare(root.d.title, i18n.tr("VPN “%1”").arg(data.connection.remote || data.connection.gateway)); } } } ubuntu-settings-components-0.7+16.04.20160321.1/tests/qmltests/Vpn/tst_VpnOpenvpnEditor.qml0000644000015600001650000001622112674023445032100 0ustar pbuserpbgroup00000000000000/* * Copyright 2016 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Authored by Jonas G. Drange */ import QtQuick 2.4 import QtTest 1.0 import Ubuntu.Test 0.1 import Ubuntu.Settings.Vpn 0.1 Item { width: units.gu(42) height: units.gu(75) VpnEditor { anchors.fill: parent id: vpnEditor } UbuntuTestCase { name: "VpnOpenvpnEditor" when: windowShown function getLoader() { return findChild(vpnEditor, "editorLoader"); } function init () { waitForRendering(vpnEditor); vpnEditor.connection = { id: "openvpn connection", type: 0, // openvpn remote: "", portSet: false, port: 1194, neverDefault: false, protoTcp: true, cert: "cert.pem", ca: "cert.ca", key: "cert.key", certPass: "foo", ta: "cert.ta", taSet: true, taDir: 1, remoteCertTlsSet: true, remoteCertTls: 0, cipher: 8, compLzo: true, updateSecrets: function () {} } vpnEditor.render(); // Wait until we've loaded tryCompareFunction(function () { return typeof getLoader() }, "object"); tryCompareFunction(function () { return getLoader().status }, Loader.Ready); } function test_fields() { var e = getLoader().item; var c = vpnEditor.connection; var serverField = findChild(e, "vpnOpenvpnServerField"); var portField = findChild(e, "vpnOpenvpnPortField"); var portToggle = findChild(e, "vpnOpenvpnCustomPortToggle"); var routesField = findChild(e, "vpnOpenvpnRoutesField"); var tcpToggle = findChild(e, "vpnOpenvpnTcpToggle"); var udpToggle = findChild(e, "vpnOpenvpnUdpToggle"); var certField = findChild(e, "vpnOpenvpnCertField"); var caField = findChild(e, "vpnOpenvpnCaField"); var keyField = findChild(e, "vpnOpenvpnKeyField"); var certPassField = findChild(e, "vpnOpenvpnCertPassField"); var taSetToggle = findChild(e, "vpnOpenvpnTaSetToggle"); var taField = findChild(e, "vpnOpenvpnTaField"); var taDirSelector = findChild(e, "vpnOpenvpnTaDirSelector"); var certSetToggle = findChild(e, "vpnOpenvpnRemoteCertSetToggle"); var certTlsSelector = findChild(e, "vpnOpenvpnRemoteCertTlsSelector"); var cipherSelector = findChild(e, "vpnOpenvpnCipherSelector"); var compressionToggle = findChild(e, "vpnOpenvpnCompressionToggle"); compare(serverField.text, c.remote); compare(parseInt(portField.text, 10), c.port); compare(portToggle.checked, c.portSet); compare(routesField.neverDefault, c.neverDefault); compare(tcpToggle.checked, c.protoTcp); compare(udpToggle.checked, !c.protoTcp); compare(certField.path, c.cert); compare(caField.path, c.ca); compare(keyField.path, c.key); compare(certPassField.text, c.certPass); compare(taSetToggle.checked, c.taSet); compare(taField.path, c.ta); compare(taDirSelector.selectedIndex, c.taDir); compare(certSetToggle.checked, c.remoteCertTlsSet); compare(certTlsSelector.selectedIndex, c.remoteCertTls); compare(cipherSelector.selectedIndex, c.cipher); compare(compressionToggle.checked, c.compLzo); } // Test that the two checkboxes function as radio button function test_tcp_udp_toggle() { var e = getLoader().item; var c = vpnEditor.connection; var tcpToggle = findChild(e, "vpnOpenvpnTcpToggle"); var udpToggle = findChild(e, "vpnOpenvpnUdpToggle"); compare(tcpToggle.checked, c.protoTcp); compare(udpToggle.checked, !c.protoTcp); mouseClick(udpToggle, udpToggle.width / 2, udpToggle.height / 2); compare(udpToggle.checked, true); compare(tcpToggle.checked, false); } function test_changes() { var e = getLoader().item; var c = vpnEditor.connection; var serverField = findChild(e, "vpnOpenvpnServerField"); var portField = findChild(e, "vpnOpenvpnPortField"); var portToggle = findChild(e, "vpnOpenvpnCustomPortToggle"); compare(e.getChanges(), []); // make some changes serverField.text = "new remote"; portToggle.checked = !c.portSet; portField.text = "50000"; compare(e.getChanges(), [ ["remote", serverField.text], ["portSet", portToggle.checked], ["port", parseInt(portField.text, 10)], ]); } function test_validity() { compare(getLoader().item.valid, true); } function test_route_toggle() { var all = findChild(vpnEditor, "vpnAllNetworksToggle"); var own = findChild(vpnEditor, "vpnOwnNetworksToggle"); verify(all.checked); verify(!own.checked); mouseClick(own, own.width / 2, own.height / 2); verify(!all.checked); verify(own.checked); } function test_file_selector() { var selector = findChild(vpnEditor, "vpnOpenvpnCaField"); var noop = function() {} selector.__dialog = { accept: { connect: noop, disconnect: noop }, reject: { connect: noop, disconnect: noop }, hide: noop }; compare(selector.model.length, 3); compare(selector.model[0], i18n.tr("None")); compare(selector.model[1], "cert.ca"); compare(selector.model[2], i18n.tr("Choose Certificate…")); selector.pathAccepted(""); compare(selector.model.length, 2); compare(selector.model[0], i18n.tr("None")); compare(selector.model[1], i18n.tr("Choose Certificate…")); } } } ubuntu-settings-components-0.7+16.04.20160321.1/tests/qmltests/CMakeLists.txt0000644000015600001650000000243512674023445027212 0ustar pbuserpbgroup00000000000000# add_qml_test macro include(QmlTest) set(qmltest_DEFAULT_TARGETS qmluitests) set(qmltest_DEFAULT_NO_ADD_TEST TRUE) set(qmltest_DEFAULT_PROPERTIES ENVIRONMENT "LC_ALL=C") set(qmltest_DEFAULT_IMPORT_PATHS ${CMAKE_BINARY_DIR}/plugins ${CMAKE_BINARY_DIR}/tests/utils/modules ) add_qml_test(Components Calendar) add_qml_test(Components ServerPropertySynchroniser) add_qml_test(Components StatusIcon) add_qml_test(Menus AccessPointMenu) add_qml_test(Menus ButtonMenu) add_qml_test(Menus CalendarMenu) add_qml_test(Menus CheckableMenu) add_qml_test(Menus EventMenu) add_qml_test(Menus GroupedMessageMenu) add_qml_test(Menus MediaPlayerMenu) add_qml_test(Menus PlaybackItemMenu) add_qml_test(Menus ProgressBarMenu) add_qml_test(Menus ProgressValueMenu) add_qml_test(Menus SectionMenu) add_qml_test(Menus SimpleMessageMenu) add_qml_test(Menus SliderMenu) add_qml_test(Menus SnapDecisionMenu) add_qml_test(Menus SwitchMenu) add_qml_test(Menus UserSessionMenu) add_qml_test(Menus TextMessageMenu) add_qml_test(Menus TimeZoneMenu) add_qml_test(Menus TransferMenu) add_qml_test(Vpn VpnList) add_qml_test(Vpn VpnEditor) add_qml_test(Vpn VpnOpenvpnEditor) add_qml_test(Vpn VpnPptpEditor) add_qml_test(Vpn VpnPreviewDialogCertificateChecks) add_qml_test(Vpn VpnPreviewDialog ENVIRONMENT NO_SSL_CERTIFICATE_CHECK=1) ubuntu-settings-components-0.7+16.04.20160321.1/tests/CMakeLists.txt0000644000015600001650000000035612674023445025336 0ustar pbuserpbgroup00000000000000add_subdirectory(utils) # QML tests that require graphical capabitlies. add_custom_target(qmluitests) add_dependencies(qmluitests UbuntuTest) add_custom_target(qmltests) add_dependencies(qmltests qmluitests) add_subdirectory(qmltests) ubuntu-settings-components-0.7+16.04.20160321.1/SettingsComponents.qmlproject0000644000015600001650000000105112674023445027375 0ustar pbuserpbgroup00000000000000/* File generated by Qt Creator (with Ubuntu Plugin), version 2.7.0 */ import QmlProject 1.1 Project { mainFile: "SettingsComponents.qml" /* Include .qml, .js, and image files from current directory and subdirectories */ QmlFiles { directory: "." } JavaScriptFiles { directory: "." } ImageFiles { directory: "." } Files { filter: "*.desktop" } /* List of plugin directories passed to QML runtime */ importPaths: [ "." ,"/usr/bin","/usr/lib/x86_64-linux-gnu/qt5/qml" ] } ubuntu-settings-components-0.7+16.04.20160321.1/po/0000755000015600001650000000000012674023672022050 5ustar pbuserpbgroup00000000000000ubuntu-settings-components-0.7+16.04.20160321.1/po/pl.po0000644000015600001650000000300312674023445023015 0ustar pbuserpbgroup00000000000000# Polish translation for ubuntu-settings-components # Copyright (c) 2016 Rosetta Contributors and Canonical Ltd 2016 # This file is distributed under the same license as the ubuntu-settings-components package. # FIRST AUTHOR , 2016. # msgid "" msgstr "" "Project-Id-Version: ubuntu-settings-components\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2016-02-11 11:25+0000\n" "PO-Revision-Date: 2016-03-18 07:49+0000\n" "Last-Translator: Michał Sawicz \n" "Language-Team: Polish \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2016-03-19 05:56+0000\n" "X-Generator: Launchpad (build 17947)\n" #: plugins/Ubuntu/Settings/Components/QuickReply.qml:63 msgid "Quick reply with:" msgstr "Szybka odpowiedź przez:" #: plugins/Ubuntu/Settings/Menus/CalendarMenu.qml:57 #, qt-format msgctxt "%1=month name, %2=4-digit year" msgid "%1 %2" msgstr "%1 %2" #: plugins/Ubuntu/Settings/Menus/ModemInfoItem.qml:100 msgid "Roaming" msgstr "Roaming" #: plugins/Ubuntu/Settings/Menus/ModemInfoItem.qml:122 msgid "Unlock SIM" msgstr "Odblokuj kartę SIM" #: plugins/Ubuntu/Settings/Menus/SnapDecisionMenu.qml:30 msgid "Call back" msgstr "Oddzwoń" #: plugins/Ubuntu/Settings/Menus/SnapDecisionMenu.qml:33 #: plugins/Ubuntu/Settings/Menus/TextMessageMenu.qml:29 msgid "Send" msgstr "Wyślij" #: plugins/Ubuntu/Settings/Menus/SnapDecisionMenu.qml:58 msgid "Message" msgstr "Wiadomość" ubuntu-settings-components-0.7+16.04.20160321.1/po/gl.po0000644000015600001650000000264312674023445023015 0ustar pbuserpbgroup00000000000000# Galician translation for ubuntu-settings-components # Copyright (c) 2016 Rosetta Contributors and Canonical Ltd 2016 # This file is distributed under the same license as the ubuntu-settings-components package. # FIRST AUTHOR , 2016. # msgid "" msgstr "" "Project-Id-Version: ubuntu-settings-components\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2016-02-11 11:25+0000\n" "PO-Revision-Date: 2016-03-08 17:40+0000\n" "Last-Translator: FULL NAME \n" "Language-Team: Galician \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2016-03-10 05:57+0000\n" "X-Generator: Launchpad (build 17936)\n" #: plugins/Ubuntu/Settings/Components/QuickReply.qml:63 msgid "Quick reply with:" msgstr "" #: plugins/Ubuntu/Settings/Menus/CalendarMenu.qml:57 #, qt-format msgctxt "%1=month name, %2=4-digit year" msgid "%1 %2" msgstr "" #: plugins/Ubuntu/Settings/Menus/ModemInfoItem.qml:100 msgid "Roaming" msgstr "" #: plugins/Ubuntu/Settings/Menus/ModemInfoItem.qml:122 msgid "Unlock SIM" msgstr "" #: plugins/Ubuntu/Settings/Menus/SnapDecisionMenu.qml:30 msgid "Call back" msgstr "" #: plugins/Ubuntu/Settings/Menus/SnapDecisionMenu.qml:33 #: plugins/Ubuntu/Settings/Menus/TextMessageMenu.qml:29 msgid "Send" msgstr "" #: plugins/Ubuntu/Settings/Menus/SnapDecisionMenu.qml:58 msgid "Message" msgstr "" ubuntu-settings-components-0.7+16.04.20160321.1/po/nl.po0000644000015600001650000000263512674023445023025 0ustar pbuserpbgroup00000000000000# Dutch translation for ubuntu-settings-components # Copyright (c) 2016 Rosetta Contributors and Canonical Ltd 2016 # This file is distributed under the same license as the ubuntu-settings-components package. # FIRST AUTHOR , 2016. # msgid "" msgstr "" "Project-Id-Version: ubuntu-settings-components\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2016-02-11 11:25+0000\n" "PO-Revision-Date: 2016-03-08 17:40+0000\n" "Last-Translator: FULL NAME \n" "Language-Team: Dutch \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2016-03-10 05:57+0000\n" "X-Generator: Launchpad (build 17936)\n" #: plugins/Ubuntu/Settings/Components/QuickReply.qml:63 msgid "Quick reply with:" msgstr "" #: plugins/Ubuntu/Settings/Menus/CalendarMenu.qml:57 #, qt-format msgctxt "%1=month name, %2=4-digit year" msgid "%1 %2" msgstr "" #: plugins/Ubuntu/Settings/Menus/ModemInfoItem.qml:100 msgid "Roaming" msgstr "" #: plugins/Ubuntu/Settings/Menus/ModemInfoItem.qml:122 msgid "Unlock SIM" msgstr "" #: plugins/Ubuntu/Settings/Menus/SnapDecisionMenu.qml:30 msgid "Call back" msgstr "" #: plugins/Ubuntu/Settings/Menus/SnapDecisionMenu.qml:33 #: plugins/Ubuntu/Settings/Menus/TextMessageMenu.qml:29 msgid "Send" msgstr "" #: plugins/Ubuntu/Settings/Menus/SnapDecisionMenu.qml:58 msgid "Message" msgstr "" ubuntu-settings-components-0.7+16.04.20160321.1/po/ca.po0000644000015600001650000000264112674023445022774 0ustar pbuserpbgroup00000000000000# Catalan translation for ubuntu-settings-components # Copyright (c) 2016 Rosetta Contributors and Canonical Ltd 2016 # This file is distributed under the same license as the ubuntu-settings-components package. # FIRST AUTHOR , 2016. # msgid "" msgstr "" "Project-Id-Version: ubuntu-settings-components\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2016-02-11 11:25+0000\n" "PO-Revision-Date: 2016-03-08 17:40+0000\n" "Last-Translator: FULL NAME \n" "Language-Team: Catalan \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2016-03-10 05:57+0000\n" "X-Generator: Launchpad (build 17936)\n" #: plugins/Ubuntu/Settings/Components/QuickReply.qml:63 msgid "Quick reply with:" msgstr "" #: plugins/Ubuntu/Settings/Menus/CalendarMenu.qml:57 #, qt-format msgctxt "%1=month name, %2=4-digit year" msgid "%1 %2" msgstr "" #: plugins/Ubuntu/Settings/Menus/ModemInfoItem.qml:100 msgid "Roaming" msgstr "" #: plugins/Ubuntu/Settings/Menus/ModemInfoItem.qml:122 msgid "Unlock SIM" msgstr "" #: plugins/Ubuntu/Settings/Menus/SnapDecisionMenu.qml:30 msgid "Call back" msgstr "" #: plugins/Ubuntu/Settings/Menus/SnapDecisionMenu.qml:33 #: plugins/Ubuntu/Settings/Menus/TextMessageMenu.qml:29 msgid "Send" msgstr "" #: plugins/Ubuntu/Settings/Menus/SnapDecisionMenu.qml:58 msgid "Message" msgstr "" ubuntu-settings-components-0.7+16.04.20160321.1/po/ia.po0000644000015600001650000000276012674023445023004 0ustar pbuserpbgroup00000000000000# Interlingua translation for ubuntu-settings-components # Copyright (c) 2016 Rosetta Contributors and Canonical Ltd 2016 # This file is distributed under the same license as the ubuntu-settings-components package. # FIRST AUTHOR , 2016. # msgid "" msgstr "" "Project-Id-Version: ubuntu-settings-components\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2016-02-11 11:25+0000\n" "PO-Revision-Date: 2016-03-19 23:42+0000\n" "Last-Translator: karm \n" "Language-Team: Interlingua \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2016-03-21 06:03+0000\n" "X-Generator: Launchpad (build 17947)\n" #: plugins/Ubuntu/Settings/Components/QuickReply.qml:63 msgid "Quick reply with:" msgstr "Responsa rapide con:" #: plugins/Ubuntu/Settings/Menus/CalendarMenu.qml:57 #, qt-format msgctxt "%1=month name, %2=4-digit year" msgid "%1 %2" msgstr "%1 %2" #: plugins/Ubuntu/Settings/Menus/ModemInfoItem.qml:100 msgid "Roaming" msgstr "Roaming" #: plugins/Ubuntu/Settings/Menus/ModemInfoItem.qml:122 msgid "Unlock SIM" msgstr "Disblocar le SIM" #: plugins/Ubuntu/Settings/Menus/SnapDecisionMenu.qml:30 msgid "Call back" msgstr "Appellar retro" #: plugins/Ubuntu/Settings/Menus/SnapDecisionMenu.qml:33 #: plugins/Ubuntu/Settings/Menus/TextMessageMenu.qml:29 msgid "Send" msgstr "Mandar" #: plugins/Ubuntu/Settings/Menus/SnapDecisionMenu.qml:58 msgid "Message" msgstr "Message" ubuntu-settings-components-0.7+16.04.20160321.1/po/nb.po0000644000015600001650000000266312674023445023014 0ustar pbuserpbgroup00000000000000# Norwegian Bokmal translation for ubuntu-settings-components # Copyright (c) 2016 Rosetta Contributors and Canonical Ltd 2016 # This file is distributed under the same license as the ubuntu-settings-components package. # FIRST AUTHOR , 2016. # msgid "" msgstr "" "Project-Id-Version: ubuntu-settings-components\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2016-02-11 11:25+0000\n" "PO-Revision-Date: 2016-03-08 17:40+0000\n" "Last-Translator: FULL NAME \n" "Language-Team: Norwegian Bokmal \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2016-03-10 05:57+0000\n" "X-Generator: Launchpad (build 17936)\n" #: plugins/Ubuntu/Settings/Components/QuickReply.qml:63 msgid "Quick reply with:" msgstr "" #: plugins/Ubuntu/Settings/Menus/CalendarMenu.qml:57 #, qt-format msgctxt "%1=month name, %2=4-digit year" msgid "%1 %2" msgstr "" #: plugins/Ubuntu/Settings/Menus/ModemInfoItem.qml:100 msgid "Roaming" msgstr "" #: plugins/Ubuntu/Settings/Menus/ModemInfoItem.qml:122 msgid "Unlock SIM" msgstr "" #: plugins/Ubuntu/Settings/Menus/SnapDecisionMenu.qml:30 msgid "Call back" msgstr "" #: plugins/Ubuntu/Settings/Menus/SnapDecisionMenu.qml:33 #: plugins/Ubuntu/Settings/Menus/TextMessageMenu.qml:29 msgid "Send" msgstr "" #: plugins/Ubuntu/Settings/Menus/SnapDecisionMenu.qml:58 msgid "Message" msgstr "" ubuntu-settings-components-0.7+16.04.20160321.1/po/pt.po0000644000015600001650000000264712674023445023042 0ustar pbuserpbgroup00000000000000# Portuguese translation for ubuntu-settings-components # Copyright (c) 2016 Rosetta Contributors and Canonical Ltd 2016 # This file is distributed under the same license as the ubuntu-settings-components package. # FIRST AUTHOR , 2016. # msgid "" msgstr "" "Project-Id-Version: ubuntu-settings-components\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2016-02-11 11:25+0000\n" "PO-Revision-Date: 2016-03-08 17:40+0000\n" "Last-Translator: FULL NAME \n" "Language-Team: Portuguese \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2016-03-10 05:57+0000\n" "X-Generator: Launchpad (build 17936)\n" #: plugins/Ubuntu/Settings/Components/QuickReply.qml:63 msgid "Quick reply with:" msgstr "" #: plugins/Ubuntu/Settings/Menus/CalendarMenu.qml:57 #, qt-format msgctxt "%1=month name, %2=4-digit year" msgid "%1 %2" msgstr "" #: plugins/Ubuntu/Settings/Menus/ModemInfoItem.qml:100 msgid "Roaming" msgstr "" #: plugins/Ubuntu/Settings/Menus/ModemInfoItem.qml:122 msgid "Unlock SIM" msgstr "" #: plugins/Ubuntu/Settings/Menus/SnapDecisionMenu.qml:30 msgid "Call back" msgstr "" #: plugins/Ubuntu/Settings/Menus/SnapDecisionMenu.qml:33 #: plugins/Ubuntu/Settings/Menus/TextMessageMenu.qml:29 msgid "Send" msgstr "" #: plugins/Ubuntu/Settings/Menus/SnapDecisionMenu.qml:58 msgid "Message" msgstr "" ubuntu-settings-components-0.7+16.04.20160321.1/po/pt_BR.po0000644000015600001650000000267612674023445023427 0ustar pbuserpbgroup00000000000000# Brazilian Portuguese translation for ubuntu-settings-components # Copyright (c) 2016 Rosetta Contributors and Canonical Ltd 2016 # This file is distributed under the same license as the ubuntu-settings-components package. # FIRST AUTHOR , 2016. # msgid "" msgstr "" "Project-Id-Version: ubuntu-settings-components\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2016-02-11 11:25+0000\n" "PO-Revision-Date: 2016-03-08 17:40+0000\n" "Last-Translator: FULL NAME \n" "Language-Team: Brazilian Portuguese \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2016-03-10 05:57+0000\n" "X-Generator: Launchpad (build 17936)\n" #: plugins/Ubuntu/Settings/Components/QuickReply.qml:63 msgid "Quick reply with:" msgstr "" #: plugins/Ubuntu/Settings/Menus/CalendarMenu.qml:57 #, qt-format msgctxt "%1=month name, %2=4-digit year" msgid "%1 %2" msgstr "" #: plugins/Ubuntu/Settings/Menus/ModemInfoItem.qml:100 msgid "Roaming" msgstr "" #: plugins/Ubuntu/Settings/Menus/ModemInfoItem.qml:122 msgid "Unlock SIM" msgstr "" #: plugins/Ubuntu/Settings/Menus/SnapDecisionMenu.qml:30 msgid "Call back" msgstr "" #: plugins/Ubuntu/Settings/Menus/SnapDecisionMenu.qml:33 #: plugins/Ubuntu/Settings/Menus/TextMessageMenu.qml:29 msgid "Send" msgstr "" #: plugins/Ubuntu/Settings/Menus/SnapDecisionMenu.qml:58 msgid "Message" msgstr "" ubuntu-settings-components-0.7+16.04.20160321.1/po/id.po0000644000015600001650000000264712674023445023013 0ustar pbuserpbgroup00000000000000# Indonesian translation for ubuntu-settings-components # Copyright (c) 2016 Rosetta Contributors and Canonical Ltd 2016 # This file is distributed under the same license as the ubuntu-settings-components package. # FIRST AUTHOR , 2016. # msgid "" msgstr "" "Project-Id-Version: ubuntu-settings-components\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2016-02-11 11:25+0000\n" "PO-Revision-Date: 2016-03-15 14:13+0000\n" "Last-Translator: FULL NAME \n" "Language-Team: Indonesian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2016-03-17 05:54+0000\n" "X-Generator: Launchpad (build 17947)\n" #: plugins/Ubuntu/Settings/Components/QuickReply.qml:63 msgid "Quick reply with:" msgstr "" #: plugins/Ubuntu/Settings/Menus/CalendarMenu.qml:57 #, qt-format msgctxt "%1=month name, %2=4-digit year" msgid "%1 %2" msgstr "" #: plugins/Ubuntu/Settings/Menus/ModemInfoItem.qml:100 msgid "Roaming" msgstr "" #: plugins/Ubuntu/Settings/Menus/ModemInfoItem.qml:122 msgid "Unlock SIM" msgstr "" #: plugins/Ubuntu/Settings/Menus/SnapDecisionMenu.qml:30 msgid "Call back" msgstr "" #: plugins/Ubuntu/Settings/Menus/SnapDecisionMenu.qml:33 #: plugins/Ubuntu/Settings/Menus/TextMessageMenu.qml:29 msgid "Send" msgstr "" #: plugins/Ubuntu/Settings/Menus/SnapDecisionMenu.qml:58 msgid "Message" msgstr "" ubuntu-settings-components-0.7+16.04.20160321.1/po/ar.po0000644000015600001650000000263712674023445023020 0ustar pbuserpbgroup00000000000000# Arabic translation for ubuntu-settings-components # Copyright (c) 2016 Rosetta Contributors and Canonical Ltd 2016 # This file is distributed under the same license as the ubuntu-settings-components package. # FIRST AUTHOR , 2016. # msgid "" msgstr "" "Project-Id-Version: ubuntu-settings-components\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2016-02-11 11:25+0000\n" "PO-Revision-Date: 2016-03-08 17:40+0000\n" "Last-Translator: FULL NAME \n" "Language-Team: Arabic \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2016-03-10 05:57+0000\n" "X-Generator: Launchpad (build 17936)\n" #: plugins/Ubuntu/Settings/Components/QuickReply.qml:63 msgid "Quick reply with:" msgstr "" #: plugins/Ubuntu/Settings/Menus/CalendarMenu.qml:57 #, qt-format msgctxt "%1=month name, %2=4-digit year" msgid "%1 %2" msgstr "" #: plugins/Ubuntu/Settings/Menus/ModemInfoItem.qml:100 msgid "Roaming" msgstr "" #: plugins/Ubuntu/Settings/Menus/ModemInfoItem.qml:122 msgid "Unlock SIM" msgstr "" #: plugins/Ubuntu/Settings/Menus/SnapDecisionMenu.qml:30 msgid "Call back" msgstr "" #: plugins/Ubuntu/Settings/Menus/SnapDecisionMenu.qml:33 #: plugins/Ubuntu/Settings/Menus/TextMessageMenu.qml:29 msgid "Send" msgstr "" #: plugins/Ubuntu/Settings/Menus/SnapDecisionMenu.qml:58 msgid "Message" msgstr "" ubuntu-settings-components-0.7+16.04.20160321.1/po/hu.po0000644000015600001650000000277212674023445023032 0ustar pbuserpbgroup00000000000000# Hungarian translation for ubuntu-settings-components # Copyright (c) 2016 Rosetta Contributors and Canonical Ltd 2016 # This file is distributed under the same license as the ubuntu-settings-components package. # FIRST AUTHOR , 2016. # msgid "" msgstr "" "Project-Id-Version: ubuntu-settings-components\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2016-02-11 11:25+0000\n" "PO-Revision-Date: 2016-03-13 10:35+0000\n" "Last-Translator: Richard Somlói \n" "Language-Team: Hungarian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2016-03-14 05:42+0000\n" "X-Generator: Launchpad (build 17939)\n" #: plugins/Ubuntu/Settings/Components/QuickReply.qml:63 msgid "Quick reply with:" msgstr "Gyorsválasz:" #: plugins/Ubuntu/Settings/Menus/CalendarMenu.qml:57 #, qt-format msgctxt "%1=month name, %2=4-digit year" msgid "%1 %2" msgstr "%2 %1" #: plugins/Ubuntu/Settings/Menus/ModemInfoItem.qml:100 msgid "Roaming" msgstr "Barangolás" #: plugins/Ubuntu/Settings/Menus/ModemInfoItem.qml:122 msgid "Unlock SIM" msgstr "SIM feloldása" #: plugins/Ubuntu/Settings/Menus/SnapDecisionMenu.qml:30 msgid "Call back" msgstr "Visszahívás" #: plugins/Ubuntu/Settings/Menus/SnapDecisionMenu.qml:33 #: plugins/Ubuntu/Settings/Menus/TextMessageMenu.qml:29 msgid "Send" msgstr "Küldés" #: plugins/Ubuntu/Settings/Menus/SnapDecisionMenu.qml:58 msgid "Message" msgstr "Üzenet" ubuntu-settings-components-0.7+16.04.20160321.1/po/ubuntu-settings-components.pot0000644000015600001650000002401212674023452030132 0ustar pbuserpbgroup00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR Canonical Ltd. # This file is distributed under the same license as the ubuntu-settings-components package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: ubuntu-settings-components\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2016-03-21 13:10+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: plugins/Ubuntu/Settings/Components/QuickReply.qml:63 msgid "Quick reply with:" msgstr "" #: plugins/Ubuntu/Settings/Menus/CalendarMenu.qml:57 #, qt-format msgctxt "%1=month name, %2=4-digit year" msgid "%1 %2" msgstr "" #: plugins/Ubuntu/Settings/Menus/ModemInfoItem.qml:100 msgid "Roaming" msgstr "" #: plugins/Ubuntu/Settings/Menus/ModemInfoItem.qml:122 msgid "Unlock SIM" msgstr "" #: plugins/Ubuntu/Settings/Menus/SnapDecisionMenu.qml:30 msgid "Call back" msgstr "" #: plugins/Ubuntu/Settings/Menus/SnapDecisionMenu.qml:33 #: plugins/Ubuntu/Settings/Menus/TextMessageMenu.qml:29 msgid "Send" msgstr "" #: plugins/Ubuntu/Settings/Menus/SnapDecisionMenu.qml:58 msgid "Message" msgstr "" #: plugins/Ubuntu/Settings/Vpn/DialogFile.qml:161 #: plugins/Ubuntu/Settings/Vpn/VpnEditor.qml:102 #: plugins/Ubuntu/Settings/Vpn/VpnPreviewDialog.qml:104 msgid "Cancel" msgstr "" #: plugins/Ubuntu/Settings/Vpn/DialogFile.qml:170 msgid "Accept" msgstr "" #: plugins/Ubuntu/Settings/Vpn/FileSelector.qml:25 msgid "Choose…" msgstr "" #: plugins/Ubuntu/Settings/Vpn/FileSelector.qml:34 #: plugins/Ubuntu/Settings/Vpn/Openvpn/Editor.qml:340 msgid "None" msgstr "" #: plugins/Ubuntu/Settings/Vpn/Openvpn/Editor.qml:110 #: plugins/Ubuntu/Settings/Vpn/Pptp/Editor.qml:114 msgid "Server:" msgstr "" #: plugins/Ubuntu/Settings/Vpn/Openvpn/Editor.qml:124 msgid "Port:" msgstr "" #: plugins/Ubuntu/Settings/Vpn/Openvpn/Editor.qml:174 msgid "Use custom gateway port" msgstr "" #: plugins/Ubuntu/Settings/Vpn/Openvpn/Editor.qml:202 msgid "Protocol:" msgstr "" #: plugins/Ubuntu/Settings/Vpn/Openvpn/Editor.qml:240 msgid "Client certificate:" msgstr "" #: plugins/Ubuntu/Settings/Vpn/Openvpn/Editor.qml:248 #: plugins/Ubuntu/Settings/Vpn/Openvpn/Editor.qml:263 msgid "Choose Certificate…" msgstr "" #: plugins/Ubuntu/Settings/Vpn/Openvpn/Editor.qml:255 msgid "CA certificate:" msgstr "" #: plugins/Ubuntu/Settings/Vpn/Openvpn/Editor.qml:270 msgid "Private key:" msgstr "" #: plugins/Ubuntu/Settings/Vpn/Openvpn/Editor.qml:278 #: plugins/Ubuntu/Settings/Vpn/Openvpn/Editor.qml:324 msgid "Choose Key…" msgstr "" #: plugins/Ubuntu/Settings/Vpn/Openvpn/Editor.qml:285 msgid "Key password:" msgstr "" #: plugins/Ubuntu/Settings/Vpn/Openvpn/Editor.qml:306 msgid "Use additional TLS authentication:" msgstr "" #: plugins/Ubuntu/Settings/Vpn/Openvpn/Editor.qml:315 msgid "TLS key:" msgstr "" #: plugins/Ubuntu/Settings/Vpn/Openvpn/Editor.qml:329 msgid "Key direction:" msgstr "" #: plugins/Ubuntu/Settings/Vpn/Openvpn/Editor.qml:357 msgid "Verify peer certificate:" msgstr "" #: plugins/Ubuntu/Settings/Vpn/Openvpn/Editor.qml:366 msgid "Peer certificate TLS type:" msgstr "" #: plugins/Ubuntu/Settings/Vpn/Openvpn/Editor.qml:374 msgid "Server" msgstr "" #: plugins/Ubuntu/Settings/Vpn/Openvpn/Editor.qml:375 msgid "Client" msgstr "" #: plugins/Ubuntu/Settings/Vpn/Openvpn/Editor.qml:385 msgid "Cipher:" msgstr "" #: plugins/Ubuntu/Settings/Vpn/Openvpn/Editor.qml:392 msgid "Default" msgstr "" #: plugins/Ubuntu/Settings/Vpn/Openvpn/Editor.qml:422 msgid "Compress data" msgstr "" #: plugins/Ubuntu/Settings/Vpn/Pptp/Editor.qml:150 msgid "User:" msgstr "" #: plugins/Ubuntu/Settings/Vpn/Pptp/Editor.qml:165 msgid "Password:" msgstr "" #: plugins/Ubuntu/Settings/Vpn/Pptp/Editor.qml:180 msgid "NT Domain:" msgstr "" #: plugins/Ubuntu/Settings/Vpn/Pptp/Editor.qml:192 msgid "Authentication methods:" msgstr "" #: plugins/Ubuntu/Settings/Vpn/Pptp/Editor.qml:292 msgid "Use Point-to-Point encryption" msgstr "" #: plugins/Ubuntu/Settings/Vpn/Pptp/Editor.qml:301 msgid "All Available (Default)" msgstr "" #: plugins/Ubuntu/Settings/Vpn/Pptp/Editor.qml:302 msgid "128-bit (most secure)" msgstr "" #: plugins/Ubuntu/Settings/Vpn/Pptp/Editor.qml:303 msgid "40-bit (less secure)" msgstr "" #: plugins/Ubuntu/Settings/Vpn/Pptp/Editor.qml:319 msgid "Allow stateful encryption" msgstr "" #: plugins/Ubuntu/Settings/Vpn/Pptp/Editor.qml:333 msgid "Allow BSD data compression" msgstr "" #: plugins/Ubuntu/Settings/Vpn/Pptp/Editor.qml:347 msgid "Allow Deflate data compression" msgstr "" #: plugins/Ubuntu/Settings/Vpn/Pptp/Editor.qml:361 msgid "Use TCP Header compression" msgstr "" #: plugins/Ubuntu/Settings/Vpn/Pptp/Editor.qml:375 msgid "Send PPP echo packets" msgstr "" #: plugins/Ubuntu/Settings/Vpn/PreviewDialog/AllTrafficWithDns.qml:27 #: plugins/Ubuntu/Settings/Vpn/PreviewDialog/AllTrafficWithoutDns.qml:27 msgid "You’re using this VPN for all Internet traffic." msgstr "" #: plugins/Ubuntu/Settings/Vpn/PreviewDialog/AllTrafficWithDns.qml:33 #: plugins/Ubuntu/Settings/Vpn/PreviewDialog/NotInstalledWithoutRoutes.qml:39 #: plugins/Ubuntu/Settings/Vpn/PreviewDialog/NotInstalledWithRoutes.qml:39 #: plugins/Ubuntu/Settings/Vpn/PreviewDialog/SetUpUnused.qml:40 msgid "" "Your Wi-Fi/mobile provider can see when and how much you use the Internet, " "but not what for." msgstr "" #: plugins/Ubuntu/Settings/Vpn/PreviewDialog/AllTrafficWithDns.qml:39 #: plugins/Ubuntu/Settings/Vpn/PreviewDialog/AllTrafficWithoutDns.qml:45 #: plugins/Ubuntu/Settings/Vpn/PreviewDialog/NotInstalledWithoutRoutes.qml:51 #: plugins/Ubuntu/Settings/Vpn/PreviewDialog/NotInstalledWithRoutes.qml:51 #: plugins/Ubuntu/Settings/Vpn/PreviewDialog/SetUpUnused.qml:47 msgid "The VPN provider can see or modify your Internet traffic." msgstr "" #: plugins/Ubuntu/Settings/Vpn/PreviewDialog/AllTrafficWithDns.qml:45 #: plugins/Ubuntu/Settings/Vpn/PreviewDialog/AllTrafficWithoutDns.qml:51 #: plugins/Ubuntu/Settings/Vpn/PreviewDialog/NotInstalledWithoutRoutes.qml:57 #: plugins/Ubuntu/Settings/Vpn/PreviewDialog/NotInstalledWithRoutes.qml:57 #: plugins/Ubuntu/Settings/Vpn/PreviewDialog/SetUpUnused.qml:54 msgid "Web sites and other service providers can still monitor your use." msgstr "" #: plugins/Ubuntu/Settings/Vpn/PreviewDialog/AllTrafficWithoutDns.qml:33 msgid "" "Your Wi-Fi/mobile provider can still see when and how much you use the " "Internet." msgstr "" #: plugins/Ubuntu/Settings/Vpn/PreviewDialog/AllTrafficWithoutDns.qml:39 #: plugins/Ubuntu/Settings/Vpn/PreviewDialog/NotInstalledWithRoutes.qml:45 msgid "The DNS provider can see which Web sites and other services you use." msgstr "" #: plugins/Ubuntu/Settings/Vpn/PreviewDialog/InvalidCert.qml:30 #: plugins/Ubuntu/Settings/Vpn/PreviewDialog/NoCert.qml:27 msgid "This VPN is not safe to use." msgstr "" #: plugins/Ubuntu/Settings/Vpn/PreviewDialog/InvalidCert.qml:36 msgid "" "The server certificate is not valid. The VPN provider may be being " "impersonated." msgstr "" #: plugins/Ubuntu/Settings/Vpn/PreviewDialog/InvalidCert.qml:46 #, qt-format msgid "Details: %1" msgstr "" #: plugins/Ubuntu/Settings/Vpn/PreviewDialog/InvalidCert.qml:51 msgid "The certificate was not found." msgstr "" #: plugins/Ubuntu/Settings/Vpn/PreviewDialog/InvalidCert.qml:54 msgid "The certificate is empty." msgstr "" #: plugins/Ubuntu/Settings/Vpn/PreviewDialog/InvalidCert.qml:57 msgid "The certificate is self signed." msgstr "" #: plugins/Ubuntu/Settings/Vpn/PreviewDialog/InvalidCert.qml:60 msgid "The certificate has expired." msgstr "" #: plugins/Ubuntu/Settings/Vpn/PreviewDialog/InvalidCert.qml:63 msgid "The certificate is blacklisted." msgstr "" #: plugins/Ubuntu/Settings/Vpn/PreviewDialog/NoCert.qml:33 msgid "" "It does not provide a certificate. The VPN provider could be impersonated." msgstr "" #: plugins/Ubuntu/Settings/Vpn/PreviewDialog/NotInstalledWithoutRoutes.qml:27 #: plugins/Ubuntu/Settings/Vpn/PreviewDialog/NotInstalledWithRoutes.qml:27 msgid "This VPN configuration is not installed." msgstr "" #: plugins/Ubuntu/Settings/Vpn/PreviewDialog/NotInstalledWithoutRoutes.qml:33 #: plugins/Ubuntu/Settings/Vpn/PreviewDialog/NotInstalledWithRoutes.qml:33 msgid "If you install it:" msgstr "" #: plugins/Ubuntu/Settings/Vpn/PreviewDialog/NotInstalledWithoutRoutes.qml:45 msgid "The DNS provider can see which Web sites and other services you use. " msgstr "" #: plugins/Ubuntu/Settings/Vpn/PreviewDialog/SetUpUnused.qml:27 msgid "This VPN is set up, but not in use now." msgstr "" #: plugins/Ubuntu/Settings/Vpn/PreviewDialog/SetUpUnused.qml:33 msgid "When you use it:" msgstr "" #: plugins/Ubuntu/Settings/Vpn/PreviewDialog/SomeTraffic.qml:27 msgid "You’re using this VPN for specific services." msgstr "" #: plugins/Ubuntu/Settings/Vpn/PreviewDialog/SomeTraffic.qml:33 msgid "Your traffic to these services is private to them and the VPN provider." msgstr "" #: plugins/Ubuntu/Settings/Vpn/PreviewDialog/SomeTraffic.qml:39 msgid "Your Wi-Fi/mobile provider can track your use of any other services. " msgstr "" #: plugins/Ubuntu/Settings/Vpn/VpnEditor.qml:25 msgid "Set up VPN" msgstr "" #: plugins/Ubuntu/Settings/Vpn/VpnEditor.qml:115 msgid "OK" msgstr "" #: plugins/Ubuntu/Settings/Vpn/VpnList.qml:62 msgid "Delete configuration" msgstr "" #: plugins/Ubuntu/Settings/Vpn/VpnPreviewDialog.qml:53 #: plugins/Ubuntu/Settings/Vpn/VpnPreviewDialog.qml:58 #, qt-format msgid "VPN “%1”" msgstr "" #: plugins/Ubuntu/Settings/Vpn/VpnPreviewDialog.qml:69 msgid "VPN" msgstr "" #: plugins/Ubuntu/Settings/Vpn/VpnPreviewDialog.qml:84 msgid "Remove" msgstr "" #: plugins/Ubuntu/Settings/Vpn/VpnPreviewDialog.qml:96 msgid "Change" msgstr "" #: plugins/Ubuntu/Settings/Vpn/VpnPreviewDialog.qml:112 msgid "Install" msgstr "" #: plugins/Ubuntu/Settings/Vpn/VpnRoutesField.qml:30 msgid "Use this VPN for:" msgstr "" #: plugins/Ubuntu/Settings/Vpn/VpnRoutesField.qml:60 msgid "All network connections" msgstr "" #: plugins/Ubuntu/Settings/Vpn/VpnRoutesField.qml:76 msgid "Its own network" msgstr "" #: plugins/Ubuntu/Settings/Vpn/VpnTypeField.qml:32 msgid "Type:" msgstr "" ubuntu-settings-components-0.7+16.04.20160321.1/po/sl.po0000644000015600001650000000264512674023445023033 0ustar pbuserpbgroup00000000000000# Slovenian translation for ubuntu-settings-components # Copyright (c) 2016 Rosetta Contributors and Canonical Ltd 2016 # This file is distributed under the same license as the ubuntu-settings-components package. # FIRST AUTHOR , 2016. # msgid "" msgstr "" "Project-Id-Version: ubuntu-settings-components\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2016-02-11 11:25+0000\n" "PO-Revision-Date: 2016-03-20 18:22+0000\n" "Last-Translator: FULL NAME \n" "Language-Team: Slovenian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2016-03-21 06:03+0000\n" "X-Generator: Launchpad (build 17947)\n" #: plugins/Ubuntu/Settings/Components/QuickReply.qml:63 msgid "Quick reply with:" msgstr "" #: plugins/Ubuntu/Settings/Menus/CalendarMenu.qml:57 #, qt-format msgctxt "%1=month name, %2=4-digit year" msgid "%1 %2" msgstr "" #: plugins/Ubuntu/Settings/Menus/ModemInfoItem.qml:100 msgid "Roaming" msgstr "" #: plugins/Ubuntu/Settings/Menus/ModemInfoItem.qml:122 msgid "Unlock SIM" msgstr "" #: plugins/Ubuntu/Settings/Menus/SnapDecisionMenu.qml:30 msgid "Call back" msgstr "" #: plugins/Ubuntu/Settings/Menus/SnapDecisionMenu.qml:33 #: plugins/Ubuntu/Settings/Menus/TextMessageMenu.qml:29 msgid "Send" msgstr "" #: plugins/Ubuntu/Settings/Menus/SnapDecisionMenu.qml:58 msgid "Message" msgstr "" ubuntu-settings-components-0.7+16.04.20160321.1/po/it.po0000644000015600001650000000264112674023445023025 0ustar pbuserpbgroup00000000000000# Italian translation for ubuntu-settings-components # Copyright (c) 2016 Rosetta Contributors and Canonical Ltd 2016 # This file is distributed under the same license as the ubuntu-settings-components package. # FIRST AUTHOR , 2016. # msgid "" msgstr "" "Project-Id-Version: ubuntu-settings-components\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2016-02-11 11:25+0000\n" "PO-Revision-Date: 2016-03-08 17:40+0000\n" "Last-Translator: FULL NAME \n" "Language-Team: Italian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2016-03-10 05:57+0000\n" "X-Generator: Launchpad (build 17936)\n" #: plugins/Ubuntu/Settings/Components/QuickReply.qml:63 msgid "Quick reply with:" msgstr "" #: plugins/Ubuntu/Settings/Menus/CalendarMenu.qml:57 #, qt-format msgctxt "%1=month name, %2=4-digit year" msgid "%1 %2" msgstr "" #: plugins/Ubuntu/Settings/Menus/ModemInfoItem.qml:100 msgid "Roaming" msgstr "" #: plugins/Ubuntu/Settings/Menus/ModemInfoItem.qml:122 msgid "Unlock SIM" msgstr "" #: plugins/Ubuntu/Settings/Menus/SnapDecisionMenu.qml:30 msgid "Call back" msgstr "" #: plugins/Ubuntu/Settings/Menus/SnapDecisionMenu.qml:33 #: plugins/Ubuntu/Settings/Menus/TextMessageMenu.qml:29 msgid "Send" msgstr "" #: plugins/Ubuntu/Settings/Menus/SnapDecisionMenu.qml:58 msgid "Message" msgstr "" ubuntu-settings-components-0.7+16.04.20160321.1/po/gd.po0000644000015600001650000000266312674023445023007 0ustar pbuserpbgroup00000000000000# Gaelic; Scottish translation for ubuntu-settings-components # Copyright (c) 2016 Rosetta Contributors and Canonical Ltd 2016 # This file is distributed under the same license as the ubuntu-settings-components package. # FIRST AUTHOR , 2016. # msgid "" msgstr "" "Project-Id-Version: ubuntu-settings-components\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2016-02-11 11:25+0000\n" "PO-Revision-Date: 2016-03-08 17:40+0000\n" "Last-Translator: FULL NAME \n" "Language-Team: Gaelic; Scottish \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2016-03-10 05:57+0000\n" "X-Generator: Launchpad (build 17936)\n" #: plugins/Ubuntu/Settings/Components/QuickReply.qml:63 msgid "Quick reply with:" msgstr "" #: plugins/Ubuntu/Settings/Menus/CalendarMenu.qml:57 #, qt-format msgctxt "%1=month name, %2=4-digit year" msgid "%1 %2" msgstr "" #: plugins/Ubuntu/Settings/Menus/ModemInfoItem.qml:100 msgid "Roaming" msgstr "" #: plugins/Ubuntu/Settings/Menus/ModemInfoItem.qml:122 msgid "Unlock SIM" msgstr "" #: plugins/Ubuntu/Settings/Menus/SnapDecisionMenu.qml:30 msgid "Call back" msgstr "" #: plugins/Ubuntu/Settings/Menus/SnapDecisionMenu.qml:33 #: plugins/Ubuntu/Settings/Menus/TextMessageMenu.qml:29 msgid "Send" msgstr "" #: plugins/Ubuntu/Settings/Menus/SnapDecisionMenu.qml:58 msgid "Message" msgstr "" ubuntu-settings-components-0.7+16.04.20160321.1/po/el.po0000644000015600001650000000263512674023445023014 0ustar pbuserpbgroup00000000000000# Greek translation for ubuntu-settings-components # Copyright (c) 2016 Rosetta Contributors and Canonical Ltd 2016 # This file is distributed under the same license as the ubuntu-settings-components package. # FIRST AUTHOR , 2016. # msgid "" msgstr "" "Project-Id-Version: ubuntu-settings-components\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2016-02-11 11:25+0000\n" "PO-Revision-Date: 2016-03-08 17:40+0000\n" "Last-Translator: FULL NAME \n" "Language-Team: Greek \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2016-03-10 05:57+0000\n" "X-Generator: Launchpad (build 17936)\n" #: plugins/Ubuntu/Settings/Components/QuickReply.qml:63 msgid "Quick reply with:" msgstr "" #: plugins/Ubuntu/Settings/Menus/CalendarMenu.qml:57 #, qt-format msgctxt "%1=month name, %2=4-digit year" msgid "%1 %2" msgstr "" #: plugins/Ubuntu/Settings/Menus/ModemInfoItem.qml:100 msgid "Roaming" msgstr "" #: plugins/Ubuntu/Settings/Menus/ModemInfoItem.qml:122 msgid "Unlock SIM" msgstr "" #: plugins/Ubuntu/Settings/Menus/SnapDecisionMenu.qml:30 msgid "Call back" msgstr "" #: plugins/Ubuntu/Settings/Menus/SnapDecisionMenu.qml:33 #: plugins/Ubuntu/Settings/Menus/TextMessageMenu.qml:29 msgid "Send" msgstr "" #: plugins/Ubuntu/Settings/Menus/SnapDecisionMenu.qml:58 msgid "Message" msgstr "" ubuntu-settings-components-0.7+16.04.20160321.1/po/tr.po0000644000015600001650000000264112674023445023036 0ustar pbuserpbgroup00000000000000# Turkish translation for ubuntu-settings-components # Copyright (c) 2016 Rosetta Contributors and Canonical Ltd 2016 # This file is distributed under the same license as the ubuntu-settings-components package. # FIRST AUTHOR , 2016. # msgid "" msgstr "" "Project-Id-Version: ubuntu-settings-components\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2016-02-11 11:25+0000\n" "PO-Revision-Date: 2016-03-08 17:40+0000\n" "Last-Translator: FULL NAME \n" "Language-Team: Turkish \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2016-03-10 05:57+0000\n" "X-Generator: Launchpad (build 17936)\n" #: plugins/Ubuntu/Settings/Components/QuickReply.qml:63 msgid "Quick reply with:" msgstr "" #: plugins/Ubuntu/Settings/Menus/CalendarMenu.qml:57 #, qt-format msgctxt "%1=month name, %2=4-digit year" msgid "%1 %2" msgstr "" #: plugins/Ubuntu/Settings/Menus/ModemInfoItem.qml:100 msgid "Roaming" msgstr "" #: plugins/Ubuntu/Settings/Menus/ModemInfoItem.qml:122 msgid "Unlock SIM" msgstr "" #: plugins/Ubuntu/Settings/Menus/SnapDecisionMenu.qml:30 msgid "Call back" msgstr "" #: plugins/Ubuntu/Settings/Menus/SnapDecisionMenu.qml:33 #: plugins/Ubuntu/Settings/Menus/TextMessageMenu.qml:29 msgid "Send" msgstr "" #: plugins/Ubuntu/Settings/Menus/SnapDecisionMenu.qml:58 msgid "Message" msgstr "" ubuntu-settings-components-0.7+16.04.20160321.1/po/uk.po0000644000015600001650000000264512674023445023034 0ustar pbuserpbgroup00000000000000# Ukrainian translation for ubuntu-settings-components # Copyright (c) 2016 Rosetta Contributors and Canonical Ltd 2016 # This file is distributed under the same license as the ubuntu-settings-components package. # FIRST AUTHOR , 2016. # msgid "" msgstr "" "Project-Id-Version: ubuntu-settings-components\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2016-02-11 11:25+0000\n" "PO-Revision-Date: 2016-03-08 17:40+0000\n" "Last-Translator: FULL NAME \n" "Language-Team: Ukrainian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2016-03-10 05:57+0000\n" "X-Generator: Launchpad (build 17936)\n" #: plugins/Ubuntu/Settings/Components/QuickReply.qml:63 msgid "Quick reply with:" msgstr "" #: plugins/Ubuntu/Settings/Menus/CalendarMenu.qml:57 #, qt-format msgctxt "%1=month name, %2=4-digit year" msgid "%1 %2" msgstr "" #: plugins/Ubuntu/Settings/Menus/ModemInfoItem.qml:100 msgid "Roaming" msgstr "" #: plugins/Ubuntu/Settings/Menus/ModemInfoItem.qml:122 msgid "Unlock SIM" msgstr "" #: plugins/Ubuntu/Settings/Menus/SnapDecisionMenu.qml:30 msgid "Call back" msgstr "" #: plugins/Ubuntu/Settings/Menus/SnapDecisionMenu.qml:33 #: plugins/Ubuntu/Settings/Menus/TextMessageMenu.qml:29 msgid "Send" msgstr "" #: plugins/Ubuntu/Settings/Menus/SnapDecisionMenu.qml:58 msgid "Message" msgstr "" ubuntu-settings-components-0.7+16.04.20160321.1/po/fi.po0000644000015600001650000000271012674023445023004 0ustar pbuserpbgroup00000000000000# Finnish translation for ubuntu-settings-components # Copyright (c) 2016 Rosetta Contributors and Canonical Ltd 2016 # This file is distributed under the same license as the ubuntu-settings-components package. # FIRST AUTHOR , 2016. # msgid "" msgstr "" "Project-Id-Version: ubuntu-settings-components\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2016-02-11 11:25+0000\n" "PO-Revision-Date: 2016-03-08 17:47+0000\n" "Last-Translator: Jiri Grönroos \n" "Language-Team: Finnish \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2016-03-10 05:57+0000\n" "X-Generator: Launchpad (build 17936)\n" #: plugins/Ubuntu/Settings/Components/QuickReply.qml:63 msgid "Quick reply with:" msgstr "Pikavastaus:" #: plugins/Ubuntu/Settings/Menus/CalendarMenu.qml:57 #, qt-format msgctxt "%1=month name, %2=4-digit year" msgid "%1 %2" msgstr "" #: plugins/Ubuntu/Settings/Menus/ModemInfoItem.qml:100 msgid "Roaming" msgstr "" #: plugins/Ubuntu/Settings/Menus/ModemInfoItem.qml:122 msgid "Unlock SIM" msgstr "" #: plugins/Ubuntu/Settings/Menus/SnapDecisionMenu.qml:30 msgid "Call back" msgstr "Soita takaisin" #: plugins/Ubuntu/Settings/Menus/SnapDecisionMenu.qml:33 #: plugins/Ubuntu/Settings/Menus/TextMessageMenu.qml:29 msgid "Send" msgstr "Lähetä" #: plugins/Ubuntu/Settings/Menus/SnapDecisionMenu.qml:58 msgid "Message" msgstr "Viesti" ubuntu-settings-components-0.7+16.04.20160321.1/po/ru.po0000644000015600001650000000264112674023445023037 0ustar pbuserpbgroup00000000000000# Russian translation for ubuntu-settings-components # Copyright (c) 2016 Rosetta Contributors and Canonical Ltd 2016 # This file is distributed under the same license as the ubuntu-settings-components package. # FIRST AUTHOR , 2016. # msgid "" msgstr "" "Project-Id-Version: ubuntu-settings-components\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2016-02-11 11:25+0000\n" "PO-Revision-Date: 2016-03-08 17:40+0000\n" "Last-Translator: FULL NAME \n" "Language-Team: Russian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2016-03-10 05:57+0000\n" "X-Generator: Launchpad (build 17936)\n" #: plugins/Ubuntu/Settings/Components/QuickReply.qml:63 msgid "Quick reply with:" msgstr "" #: plugins/Ubuntu/Settings/Menus/CalendarMenu.qml:57 #, qt-format msgctxt "%1=month name, %2=4-digit year" msgid "%1 %2" msgstr "" #: plugins/Ubuntu/Settings/Menus/ModemInfoItem.qml:100 msgid "Roaming" msgstr "" #: plugins/Ubuntu/Settings/Menus/ModemInfoItem.qml:122 msgid "Unlock SIM" msgstr "" #: plugins/Ubuntu/Settings/Menus/SnapDecisionMenu.qml:30 msgid "Call back" msgstr "" #: plugins/Ubuntu/Settings/Menus/SnapDecisionMenu.qml:33 #: plugins/Ubuntu/Settings/Menus/TextMessageMenu.qml:29 msgid "Send" msgstr "" #: plugins/Ubuntu/Settings/Menus/SnapDecisionMenu.qml:58 msgid "Message" msgstr "" ubuntu-settings-components-0.7+16.04.20160321.1/po/es.po0000644000015600001650000000276612674023445023030 0ustar pbuserpbgroup00000000000000# Spanish translation for ubuntu-settings-components # Copyright (c) 2016 Rosetta Contributors and Canonical Ltd 2016 # This file is distributed under the same license as the ubuntu-settings-components package. # FIRST AUTHOR , 2016. # msgid "" msgstr "" "Project-Id-Version: ubuntu-settings-components\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2016-02-11 11:25+0000\n" "PO-Revision-Date: 2016-03-16 14:34+0000\n" "Last-Translator: Víctor R. Ruiz \n" "Language-Team: Spanish \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2016-03-17 05:54+0000\n" "X-Generator: Launchpad (build 17947)\n" #: plugins/Ubuntu/Settings/Components/QuickReply.qml:63 msgid "Quick reply with:" msgstr "Respuesta rápida con:" #: plugins/Ubuntu/Settings/Menus/CalendarMenu.qml:57 #, qt-format msgctxt "%1=month name, %2=4-digit year" msgid "%1 %2" msgstr "%1 de %2" #: plugins/Ubuntu/Settings/Menus/ModemInfoItem.qml:100 msgid "Roaming" msgstr "Itinerancia" #: plugins/Ubuntu/Settings/Menus/ModemInfoItem.qml:122 msgid "Unlock SIM" msgstr "Desbloquear SIM" #: plugins/Ubuntu/Settings/Menus/SnapDecisionMenu.qml:30 msgid "Call back" msgstr "Devolver llamada" #: plugins/Ubuntu/Settings/Menus/SnapDecisionMenu.qml:33 #: plugins/Ubuntu/Settings/Menus/TextMessageMenu.qml:29 msgid "Send" msgstr "Enviar" #: plugins/Ubuntu/Settings/Menus/SnapDecisionMenu.qml:58 msgid "Message" msgstr "Mensaje" ubuntu-settings-components-0.7+16.04.20160321.1/po/CMakeLists.txt0000644000015600001650000000202612674023445024606 0ustar pbuserpbgroup00000000000000cmake_minimum_required(VERSION 2.8.9) find_package(Gettext REQUIRED) SET(POT_FILE ubuntu-settings-components.pot ) FILE(GLOB PO_FILES *.po ) SET(MO_FILE ubuntu-settings-components.mo) FOREACH(_file ${PO_FILES}) GET_FILENAME_COMPONENT(_lang ${_file} NAME_WE) SET(_gmoFile ${CMAKE_CURRENT_BINARY_DIR}/${_lang}.gmo) ADD_CUSTOM_COMMAND(OUTPUT ${_gmoFile} COMMAND ${GETTEXT_MSGFMT_EXECUTABLE} -o ${_gmoFile} ${_file} COMMAND install -D ${_gmoFile} ${CMAKE_CURRENT_BINARY_DIR}/locale/${_lang}/LC_MESSAGES/${MO_FILE} WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}" DEPENDS ${_file} ) INSTALL (FILES ${CMAKE_CURRENT_BINARY_DIR}/${_lang}.gmo DESTINATION ${CMAKE_INSTALL_PREFIX}/share/locale/${_lang}/LC_MESSAGES/ RENAME ${MO_FILE}) _GETTEXT_GET_UNIQUE_TARGET_NAME( pofiles uniqueTargetName) ADD_CUSTOM_TARGET(${uniqueTargetName} ALL DEPENDS ${_gmoFile}) ENDFOREACH(_file) ADD_CUSTOM_COMMAND(OUTPUT ${POT_FILE} COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/update-usc-pot ) ADD_CUSTOM_TARGET(pot_file DEPENDS ${POT_FILE} ) ubuntu-settings-components-0.7+16.04.20160321.1/po/fr.po0000644000015600001650000000263712674023445023025 0ustar pbuserpbgroup00000000000000# French translation for ubuntu-settings-components # Copyright (c) 2016 Rosetta Contributors and Canonical Ltd 2016 # This file is distributed under the same license as the ubuntu-settings-components package. # FIRST AUTHOR , 2016. # msgid "" msgstr "" "Project-Id-Version: ubuntu-settings-components\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2016-02-11 11:25+0000\n" "PO-Revision-Date: 2016-03-08 17:40+0000\n" "Last-Translator: FULL NAME \n" "Language-Team: French \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2016-03-10 05:57+0000\n" "X-Generator: Launchpad (build 17936)\n" #: plugins/Ubuntu/Settings/Components/QuickReply.qml:63 msgid "Quick reply with:" msgstr "" #: plugins/Ubuntu/Settings/Menus/CalendarMenu.qml:57 #, qt-format msgctxt "%1=month name, %2=4-digit year" msgid "%1 %2" msgstr "" #: plugins/Ubuntu/Settings/Menus/ModemInfoItem.qml:100 msgid "Roaming" msgstr "" #: plugins/Ubuntu/Settings/Menus/ModemInfoItem.qml:122 msgid "Unlock SIM" msgstr "" #: plugins/Ubuntu/Settings/Menus/SnapDecisionMenu.qml:30 msgid "Call back" msgstr "" #: plugins/Ubuntu/Settings/Menus/SnapDecisionMenu.qml:33 #: plugins/Ubuntu/Settings/Menus/TextMessageMenu.qml:29 msgid "Send" msgstr "" #: plugins/Ubuntu/Settings/Menus/SnapDecisionMenu.qml:58 msgid "Message" msgstr "" ubuntu-settings-components-0.7+16.04.20160321.1/po/update-usc-pot0000755000015600001650000000202112674023445024641 0ustar pbuserpbgroup00000000000000#!/bin/sh set -e cd $(dirname $0) PO_DIR=$PWD PROGNAME=$(basename $0) # Create a list of files to scan GETTEXT_FILES=$(mktemp --tmpdir usc.lst.XXXXX) trap 'rm -f "$GETTEXT_FILES"' EXIT cd .. find \( -name '*.h' -o -name '*.cpp' -o -name '*.qml' -o -name '*.js' \) \ -a ! \( -path './debian/*' -o -path './builddir/*' -o -path './build/*' -o -path './tests/*' -o -path './.bzr/*' -o -path './examples/*' \) | sort \ > $GETTEXT_FILES # Generate pot from our list xgettext \ --output $PO_DIR/ubuntu-settings-components.pot \ --from-code=UTF-8 \ --files-from $GETTEXT_FILES \ --qt --c++ \ --add-comments=Translators \ --keyword=tr \ --keyword=tr:1,2 \ --keyword=dtr:2 \ --keyword=dtr:2,3 \ --keyword=ctr:1c,2 \ --keyword=dctr:2c,3 \ --keyword=tag \ --keyword=tag:1c,2 \ --keyword=dgettext_datetime \ --package-name="ubuntu-settings-components" \ --copyright-holder="Canonical Ltd." \ --from-code="UTF-8" echo "$PROGNAME: $PO_DIR/ubuntu-settings-components.pot updated" ubuntu-settings-components-0.7+16.04.20160321.1/po/de.po0000644000015600001650000000263712674023445023006 0ustar pbuserpbgroup00000000000000# German translation for ubuntu-settings-components # Copyright (c) 2016 Rosetta Contributors and Canonical Ltd 2016 # This file is distributed under the same license as the ubuntu-settings-components package. # FIRST AUTHOR , 2016. # msgid "" msgstr "" "Project-Id-Version: ubuntu-settings-components\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2016-02-11 11:25+0000\n" "PO-Revision-Date: 2016-03-08 17:40+0000\n" "Last-Translator: FULL NAME \n" "Language-Team: German \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2016-03-10 05:57+0000\n" "X-Generator: Launchpad (build 17936)\n" #: plugins/Ubuntu/Settings/Components/QuickReply.qml:63 msgid "Quick reply with:" msgstr "" #: plugins/Ubuntu/Settings/Menus/CalendarMenu.qml:57 #, qt-format msgctxt "%1=month name, %2=4-digit year" msgid "%1 %2" msgstr "" #: plugins/Ubuntu/Settings/Menus/ModemInfoItem.qml:100 msgid "Roaming" msgstr "" #: plugins/Ubuntu/Settings/Menus/ModemInfoItem.qml:122 msgid "Unlock SIM" msgstr "" #: plugins/Ubuntu/Settings/Menus/SnapDecisionMenu.qml:30 msgid "Call back" msgstr "" #: plugins/Ubuntu/Settings/Menus/SnapDecisionMenu.qml:33 #: plugins/Ubuntu/Settings/Menus/TextMessageMenu.qml:29 msgid "Send" msgstr "" #: plugins/Ubuntu/Settings/Menus/SnapDecisionMenu.qml:58 msgid "Message" msgstr "" ubuntu-settings-components-0.7+16.04.20160321.1/po/be.po0000644000015600001650000000264712674023445023005 0ustar pbuserpbgroup00000000000000# Belarusian translation for ubuntu-settings-components # Copyright (c) 2016 Rosetta Contributors and Canonical Ltd 2016 # This file is distributed under the same license as the ubuntu-settings-components package. # FIRST AUTHOR , 2016. # msgid "" msgstr "" "Project-Id-Version: ubuntu-settings-components\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2016-02-11 11:25+0000\n" "PO-Revision-Date: 2016-03-08 17:40+0000\n" "Last-Translator: FULL NAME \n" "Language-Team: Belarusian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2016-03-10 05:57+0000\n" "X-Generator: Launchpad (build 17936)\n" #: plugins/Ubuntu/Settings/Components/QuickReply.qml:63 msgid "Quick reply with:" msgstr "" #: plugins/Ubuntu/Settings/Menus/CalendarMenu.qml:57 #, qt-format msgctxt "%1=month name, %2=4-digit year" msgid "%1 %2" msgstr "" #: plugins/Ubuntu/Settings/Menus/ModemInfoItem.qml:100 msgid "Roaming" msgstr "" #: plugins/Ubuntu/Settings/Menus/ModemInfoItem.qml:122 msgid "Unlock SIM" msgstr "" #: plugins/Ubuntu/Settings/Menus/SnapDecisionMenu.qml:30 msgid "Call back" msgstr "" #: plugins/Ubuntu/Settings/Menus/SnapDecisionMenu.qml:33 #: plugins/Ubuntu/Settings/Menus/TextMessageMenu.qml:29 msgid "Send" msgstr "" #: plugins/Ubuntu/Settings/Menus/SnapDecisionMenu.qml:58 msgid "Message" msgstr "" ubuntu-settings-components-0.7+16.04.20160321.1/po/zh_CN.po0000644000015600001650000000267612674023445023422 0ustar pbuserpbgroup00000000000000# Chinese (Simplified) translation for ubuntu-settings-components # Copyright (c) 2016 Rosetta Contributors and Canonical Ltd 2016 # This file is distributed under the same license as the ubuntu-settings-components package. # FIRST AUTHOR , 2016. # msgid "" msgstr "" "Project-Id-Version: ubuntu-settings-components\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2016-02-11 11:25+0000\n" "PO-Revision-Date: 2016-03-08 17:40+0000\n" "Last-Translator: FULL NAME \n" "Language-Team: Chinese (Simplified) \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2016-03-10 05:57+0000\n" "X-Generator: Launchpad (build 17936)\n" #: plugins/Ubuntu/Settings/Components/QuickReply.qml:63 msgid "Quick reply with:" msgstr "" #: plugins/Ubuntu/Settings/Menus/CalendarMenu.qml:57 #, qt-format msgctxt "%1=month name, %2=4-digit year" msgid "%1 %2" msgstr "" #: plugins/Ubuntu/Settings/Menus/ModemInfoItem.qml:100 msgid "Roaming" msgstr "" #: plugins/Ubuntu/Settings/Menus/ModemInfoItem.qml:122 msgid "Unlock SIM" msgstr "" #: plugins/Ubuntu/Settings/Menus/SnapDecisionMenu.qml:30 msgid "Call back" msgstr "" #: plugins/Ubuntu/Settings/Menus/SnapDecisionMenu.qml:33 #: plugins/Ubuntu/Settings/Menus/TextMessageMenu.qml:29 msgid "Send" msgstr "" #: plugins/Ubuntu/Settings/Menus/SnapDecisionMenu.qml:58 msgid "Message" msgstr "" ubuntu-settings-components-0.7+16.04.20160321.1/cmake_uninstall.cmake.in0000644000015600001650000000165412674023445026216 0ustar pbuserpbgroup00000000000000IF(NOT EXISTS "@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt") MESSAGE(FATAL_ERROR "Cannot find install manifest: \"@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt\"") ENDIF(NOT EXISTS "@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt") FILE(READ "@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt" files) STRING(REGEX REPLACE "\n" ";" files "${files}") FOREACH(file ${files}) MESSAGE(STATUS "Uninstalling \"$ENV{DESTDIR}${file}\"") IF(EXISTS "$ENV{DESTDIR}${file}") EXEC_PROGRAM( "@CMAKE_COMMAND@" ARGS "-E remove \"$ENV{DESTDIR}${file}\"" OUTPUT_VARIABLE rm_out RETURN_VALUE rm_retval ) IF(NOT "${rm_retval}" STREQUAL 0) MESSAGE(FATAL_ERROR "Problem when removing \"$ENV{DESTDIR}${file}\"") ENDIF(NOT "${rm_retval}" STREQUAL 0) ELSE(EXISTS "$ENV{DESTDIR}${file}") MESSAGE(STATUS "File \"$ENV{DESTDIR}${file}\" does not exist.") ENDIF(EXISTS "$ENV{DESTDIR}${file}") ENDFOREACH(file) ubuntu-settings-components-0.7+16.04.20160321.1/runtests.sh0000755000015600001650000001077012674023445023663 0ustar pbuserpbgroup00000000000000#!/bin/bash # # Copyright (C) 2013 Canonical Ltd # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License version 3 as # published by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # # This is a very quick and dirty attempt to figure some metrics for our tests # It monitors all qml files with inotifywatch and generates a cobertura # compatible coverage.xml file containing the statistics. This is far from # perfect but its a start and indeed gives somewhat meaningful numbers # # If this proves to be useful, it probably could/should be rewritten # in a more robust and flexible way, preferably in a language where # floating point operations and xml writing is natively supported. if test -e runtests.sh; then echo In-source build detected. SRCDIR=`pwd` elif test -e ../runtests.sh; then echo Out-of-source build detected. Found source dir at .. SRCDIR=`pwd`/.. else echo Out-of-source build detected. Source dir not found at .. echo Only in-source builds or out-of-source builds with source dir at .. are supported. exit 1 fi cd $SRCDIR file_list="" for i in `find . -name "*.qml" -or -name "*.js" | grep -v tests | grep -v debian | grep -v doc/`; do file_list="$file_list $i" done (inotifywatch -v -e access $file_list > statistics.txt) & INOTIFYPID=`echo $!` sleep 1 cd - make -k qmltests cd - kill $INOTIFYPID sleep 1 countedfiles=0 testedfiles=0 countedlines=0 testedlines=0 testedfilelist="" for i in $file_list; do countedfiles=$((countedfiles+1)) thislines=`cat $i | grep -v '^$' | wc -l` headerlines=`grep -n -m 1 "{" $i | cut -d ":" -f 1` thislines=$((thislines-headerlines)) countedlines=$((countedlines+thislines)) grep $i statistics.txt > /dev/null if [ $? -eq 0 ]; then echo "[Y] $i" testedfiles=$((testedfiles+1)) testedlines=$((testedlines+$thislines)) testedfilelist="$testedfilelist $i" else echo "[N] $i" fi done filespercentage=$((testedfiles*100/countedfiles)) echo "Total files: $testedfiles/$countedfiles ($filespercentage%)" linespercentage=$((testedlines*100/countedlines)) linespercentagef=`echo "$testedlines/$countedlines" | bc -l` echo "Total lines: $testedlines/$countedlines ($((linespercentage))%)" cd - coveragefile=coverage-qml.xml echo "" > $coveragefile echo "> $coveragefile echo " SYSTEM 'http://cobertura.sourceforge.net/xml/coverage-03.dtd'>" >> $coveragefile echo "" >> $coveragefile echo " " >> $coveragefile echo " `pwd`" >> $coveragefile echo " " >> $coveragefile echo " " >> $coveragefile echo " " >> $coveragefile echo " " >> $coveragefile for i in $file_list; do found=0 for j in $testedfilelist; do if [ $i == $j ]; then found=1 fi done thislines=`cat $SRCDIR/$i | grep -v '^$' | wc -l` headerlines=`grep -n -m 1 "{" $SRCDIR/$i | cut -d ":" -f 1` thislines=$((thislines-headerlines)) if [ $found -eq 1 ]; then echo " " >> $coveragefile echo " " >> $coveragefile for linenr in $(seq 1 $thislines); do echo " " >> $coveragefile done echo " " >> $coveragefile else echo " " >> $coveragefile echo " " >> $coveragefile for linenr in $(seq 1 $thislines); do echo " " >> $coveragefile done echo " " >> $coveragefile fi echo " " >> $coveragefile done echo " " >> $coveragefile echo " " >> $coveragefile echo " " >> $coveragefile echo "" >> $coveragefile ubuntu-settings-components-0.7+16.04.20160321.1/COPYING.GPL0000644000015600001650000010451312674023445023110 0ustar pbuserpbgroup00000000000000 GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The GNU General Public License is a free, copyleft license for software and other kinds of works. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS 0. Definitions. "This License" refers to version 3 of the GNU General Public License. "Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. "The Program" refers to any copyrightable work licensed under this License. Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals or organizations. To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work. A "covered work" means either the unmodified Program or a work based on the Program. To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. 1. Source Code. The "source code" for a work means the preferred form of the work for making modifications to it. "Object code" means any non-source form of a work. A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A "Major Component", in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work. 2. Basic Permissions. All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. 3. Protecting Users' Legal Rights From Anti-Circumvention Law. No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. 4. Conveying Verbatim Copies. You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. 5. Conveying Modified Source Versions. You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: a) The work must carry prominent notices stating that you modified it, and giving a relevant date. b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to "keep intact all notices". c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. 6. Conveying Non-Source Forms. You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. "Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. 7. Additional Terms. "Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or d) Limiting the use for publicity purposes of names of licensors or authors of the material; or e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. 8. Termination. You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. 9. Acceptance Not Required for Having Copies. You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. 10. Automatic Licensing of Downstream Recipients. Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. 11. Patents. A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's "contributor version". A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, "control" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. "Knowingly relying" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. 12. No Surrender of Others' Freedom. If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. 13. Use with the GNU Affero General Public License. Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. 14. Revised Versions of this License. The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. 15. Disclaimer of Warranty. THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. Limitation of Liability. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 17. Interpretation of Sections 15 and 16. If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: Copyright (C) This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an "about box". You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see . The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read . ubuntu-settings-components-0.7+16.04.20160321.1/TODO0000644000015600001650000000123512674023445022121 0ustar pbuserpbgroup00000000000000[BasicMenu] Add tests? [ButtonMenu] DONE - Emit the button click signal to the parent? [CalendarMenu] The Calendar components needs to support multiple models DONE - expose some properties DONE - Add tests - Do not repopulate the whole model on property changes, be smarter [EventMenu] Date of the Event should be formatted DONE - Add tests [MediaPlayerMenu] DONE - Right signals for skipping songs, maybe extra properties exposed [ProgressBarMenu] DONE - The ProgressBar does nothing, needs API [SliderMenu] DONE - The Slider does nothing, needs API [TimeZoneMenu] Needs to format and support real timezones DONE - Add tests [UserSessionMenu] DONE - Add tests ubuntu-settings-components-0.7+16.04.20160321.1/COPYING.LGPL0000644000015600001650000001674312674023445023233 0ustar pbuserpbgroup00000000000000 GNU LESSER GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. This version of the GNU Lesser General Public License incorporates the terms and conditions of version 3 of the GNU General Public License, supplemented by the additional permissions listed below. 0. Additional Definitions. As used herein, "this License" refers to version 3 of the GNU Lesser General Public License, and the "GNU GPL" refers to version 3 of the GNU General Public License. "The Library" refers to a covered work governed by this License, other than an Application or a Combined Work as defined below. An "Application" is any work that makes use of an interface provided by the Library, but which is not otherwise based on the Library. Defining a subclass of a class defined by the Library is deemed a mode of using an interface provided by the Library. A "Combined Work" is a work produced by combining or linking an Application with the Library. The particular version of the Library with which the Combined Work was made is also called the "Linked Version". The "Minimal Corresponding Source" for a Combined Work means the Corresponding Source for the Combined Work, excluding any source code for portions of the Combined Work that, considered in isolation, are based on the Application, and not on the Linked Version. The "Corresponding Application Code" for a Combined Work means the object code and/or source code for the Application, including any data and utility programs needed for reproducing the Combined Work from the Application, but excluding the System Libraries of the Combined Work. 1. Exception to Section 3 of the GNU GPL. You may convey a covered work under sections 3 and 4 of this License without being bound by section 3 of the GNU GPL. 2. Conveying Modified Versions. If you modify a copy of the Library, and, in your modifications, a facility refers to a function or data to be supplied by an Application that uses the facility (other than as an argument passed when the facility is invoked), then you may convey a copy of the modified version: a) under this License, provided that you make a good faith effort to ensure that, in the event an Application does not supply the function or data, the facility still operates, and performs whatever part of its purpose remains meaningful, or b) under the GNU GPL, with none of the additional permissions of this License applicable to that copy. 3. Object Code Incorporating Material from Library Header Files. The object code form of an Application may incorporate material from a header file that is part of the Library. You may convey such object code under terms of your choice, provided that, if the incorporated material is not limited to numerical parameters, data structure layouts and accessors, or small macros, inline functions and templates (ten or fewer lines in length), you do both of the following: a) Give prominent notice with each copy of the object code that the Library is used in it and that the Library and its use are covered by this License. b) Accompany the object code with a copy of the GNU GPL and this license document. 4. Combined Works. You may convey a Combined Work under terms of your choice that, taken together, effectively do not restrict modification of the portions of the Library contained in the Combined Work and reverse engineering for debugging such modifications, if you also do each of the following: a) Give prominent notice with each copy of the Combined Work that the Library is used in it and that the Library and its use are covered by this License. b) Accompany the Combined Work with a copy of the GNU GPL and this license document. c) For a Combined Work that displays copyright notices during execution, include the copyright notice for the Library among these notices, as well as a reference directing the user to the copies of the GNU GPL and this license document. d) Do one of the following: 0) Convey the Minimal Corresponding Source under the terms of this License, and the Corresponding Application Code in a form suitable for, and under terms that permit, the user to recombine or relink the Application with a modified version of the Linked Version to produce a modified Combined Work, in the manner specified by section 6 of the GNU GPL for conveying Corresponding Source. 1) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (a) uses at run time a copy of the Library already present on the user's computer system, and (b) will operate properly with a modified version of the Library that is interface-compatible with the Linked Version. e) Provide Installation Information, but only if you would otherwise be required to provide such information under section 6 of the GNU GPL, and only to the extent that such information is necessary to install and execute a modified version of the Combined Work produced by recombining or relinking the Application with a modified version of the Linked Version. (If you use option 4d0, the Installation Information must accompany the Minimal Corresponding Source and Corresponding Application Code. If you use option 4d1, you must provide the Installation Information in the manner specified by section 6 of the GNU GPL for conveying Corresponding Source.) 5. Combined Libraries. You may place library facilities that are a work based on the Library side by side in a single library together with other library facilities that are not Applications and are not covered by this License, and convey such a combined library under terms of your choice, if you do both of the following: a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities, conveyed under the terms of this License. b) Give prominent notice with the combined library that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. 6. Revised Versions of the GNU Lesser General Public License. The Free Software Foundation may publish revised and/or new versions of the GNU Lesser General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Library as you received it specifies that a certain numbered version of the GNU Lesser General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that published version or of any later version published by the Free Software Foundation. If the Library as you received it does not specify a version number of the GNU Lesser General Public License, you may choose any version of the GNU Lesser General Public License ever published by the Free Software Foundation. If the Library as you received it specifies that a proxy can decide whether future versions of the GNU Lesser General Public License shall apply, that proxy's public statement of acceptance of any version is permanent authorization for you to choose that version for the Library. ubuntu-settings-components-0.7+16.04.20160321.1/CMakeLists.txt0000644000015600001650000000654712674023445024204 0ustar pbuserpbgroup00000000000000 project(settings-components) cmake_minimum_required(VERSION 2.8.9) set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_CURRENT_SOURCE_DIR}/cmake/modules) # Install paths include(GNUInstallDirs) include(FindPkgConfig) find_package(Qt5Quick REQUIRED) set(OUR_QT_QUICK_LIB ${Qt5Quick_LIBRARIES}) get_target_property(QMAKE_EXECUTABLE Qt5::qmake LOCATION) exec_program(${QMAKE_EXECUTABLE} ARGS "-query QT_INSTALL_QML" OUTPUT_VARIABLE QT_IMPORTS_DIR OUTPUT_STRIP_TRAILING_WHITESPACE) file(TO_CMAKE_PATH "${QT_IMPORTS_DIR}" QT_IMPORTS_DIR) set(OUR_QT_QUICK_INCLUDE ${Qt5Quick_INCLUDE_DIRS}) LIST(APPEND QT_PKGCONFIG_DEPENDENCIES "Qt5Quick") find_package(Qt5Core REQUIRED) find_package(Qt5Quick REQUIRED) find_package(Qt5Widgets REQUIRED) add_definitions(-DQT_NO_KEYWORDS) set(CMAKE_INCLUDE_CURRENT_DIR ON) set(CMAKE_AUTOMOC ON) # enable QML debugging string(TOLOWER "${CMAKE_BUILD_TYPE}" cmake_build_type_lower) # Build types should always be lowercase but sometimes they are not. if(cmake_build_type_lower MATCHES "debug") add_definitions(-DQT_QML_DEBUG) endif() include(EnableCoverageReport) ##################################################################### # Enable code coverage calculation with gcov/gcovr/lcov # Usage: # * Switch build type to coverage (use ccmake or cmake-gui) # * Invoke make, make test, make coverage (or ninja if you use that backend) # * Find html report in subdir coveragereport # * Find xml report feasible for jenkins in coverage.xml ##################################################################### if(cmake_build_type_lower MATCHES coverage) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} --coverage" ) set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} --coverage" ) set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} --coverage" ) set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} --coverage" ) ENABLE_COVERAGE_REPORT(TARGETS ${SHELL_APP} FILTER /usr/include ${CMAKE_SOURCE_DIR}/tests/* ${CMAKE_BINARY_DIR}/*) endif() configure_file("${CMAKE_CURRENT_SOURCE_DIR}/cmake_uninstall.cmake.in" "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake" IMMEDIATE @ONLY) add_custom_target(uninstall "${CMAKE_COMMAND}" -P "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake") # Doc OPTION(GENERATE_DOC "Enable qdoc generation" OFF) if(GENERATE_DOC) message(STATUS "QDoc enabled.") find_program(QDOC_BIN qdoc) if(NOT QDOC_BIN) message(FATAL_ERROR "qdoc command not found") else() add_subdirectory(doc) endif() endif() set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fvisibility=hidden") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -fno-permissive -pedantic -Wall -Wextra") if ("${CMAKE_BUILD_TYPE}" STREQUAL "release" OR "${CMAKE_BUILD_TYPE}" STREQUAL "relwithdebinfo") option(Werror "Treat warnings as errors" ON) else() option(Werror "Treat warnings as errors" OFF) endif() if (Werror) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Werror") endif() file(GLOB_RECURSE QML_EXTRA_FILES ${CMAKE_SOURCE_DIR}/tests/*.qml ${CMAKE_SOURCE_DIR}/tests/*.js ${CMAKE_SOURCE_DIR}/tests/*.jpg ${CMAKE_SOURCE_DIR}/tests/*.png ${CMAKE_SOURCE_DIR}/tests/*.sci ${CMAKE_SOURCE_DIR}/tests/*.svg ) add_custom_target(qml_fake_target SOURCES ${QML_EXTRA_FILES}) # Tests enable_testing() add_subdirectory(plugins) add_subdirectory(examples) add_subdirectory(tests) add_subdirectory(po) ubuntu-settings-components-0.7+16.04.20160321.1/examples/0000755000015600001650000000000012674023672023250 5ustar pbuserpbgroup00000000000000ubuntu-settings-components-0.7+16.04.20160321.1/examples/MessageComponents.qml0000644000015600001650000000717412674023445027424 0ustar pbuserpbgroup00000000000000/* * Copyright 2014 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Authored by Andrea Cimitan */ import QtQuick 2.4 import Ubuntu.Components 1.3 import Ubuntu.Settings.Components 0.1 import Ubuntu.Settings.Menus 0.1 Item { property string title: "MessageComponents" width: units.gu(42) height: units.gu(75) ListModel { id: model ListElement { type: "text" title: "Text Message" body: "I am a little teacup, short and stout. Here is my handle, and here is my spout. Who are you talking about my spout?! This should be truncated" time: "Sat 31 Oct, 11:00" icon: "image://theme/message" avatar: "image://theme/contact" } ListElement { type: "simple" title: "Simple Text Message Simple" body: "I happen to be tall and thin! But let's try a new line" time: "Yesterday, 10:00" icon: "image://theme/message" avatar: "artwork/beach.jpg" } ListElement { type: "snap" title: "Snap Decision" body: "My mother says I'm handsome!" time: "10:30am" icon: "image://theme/missed-call" avatar: "artwork/night.jpg" } } ListView { model: model anchors.fill: parent cacheBuffer: 10000 delegate: Loader { anchors { left: parent.left right: parent.right } asynchronous: true sourceComponent: model.type === "simple" ? simple : model.type === "text" ? text : model.type === "snap" ? snap : undefined Component { id: simple SimpleMessageMenu { avatar: model.avatar icon: model.icon title: model.title body: model.body time: model.time removable: true } } Component { id: text TextMessageMenu { avatar: model.avatar icon: model.icon title: model.title body: model.body time: model.time removable: true replyHintText: "Reply" onTriggered: { selected = !selected; } } } Component { id: snap SnapDecisionMenu { avatar: model.avatar icon: model.icon title: model.title body: model.body time: model.time removable: true replyHintText: "Reply" onTriggered: { selected = !selected; } } } } } } ubuntu-settings-components-0.7+16.04.20160321.1/examples/SettingsComponents.qml0000644000015600001650000000361212674023445027631 0ustar pbuserpbgroup00000000000000/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Authored by Andrea Cimitan */ import QtQuick 2.4 import Ubuntu.Components 1.3 import Ubuntu.Settings.Components 0.1 import Ubuntu.Settings.Menus 0.1 MainView { id: mainView // Note! applicationName needs to match the .desktop filename applicationName: "SettingsComponents" width: units.gu(42) height: units.gu(75) Component.onCompleted: { theme.name = "Ubuntu.Components.Themes.SuruDark" } ListModel { id: pages ListElement { source: "OtherComponents.qml" } ListElement { source: "MessageComponents.qml" } ListElement { source: "TransferComponents.qml" } } Page { title: listView.currentItem ? listView.currentItem.item.title : "Components" clip: true ListView { id: listView model: pages anchors.fill: parent orientation: ListView.Horizontal snapMode: ListView.SnapOneItem highlightRangeMode: ListView.StrictlyEnforceRange boundsBehavior: Flickable.StopAtBounds delegate: Loader { width: ListView.view.width height: ListView.view.height source: model.source } } } } ubuntu-settings-components-0.7+16.04.20160321.1/examples/TransferComponents.qml0000644000015600001650000000443712674023445027623 0ustar pbuserpbgroup00000000000000/* * Copyright 2014 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Authored by Andrea Cimitan */ import QtQuick 2.4 import Ubuntu.Components 1.3 import Ubuntu.Settings.Components 0.1 import Ubuntu.Settings.Menus 0.1 Item { property string title: "Transfer Components" width: units.gu(42) height: units.gu(75) ListModel { id: model ListElement { text: "File name here" state: "Starting…" progress: 0 image: "image://theme/video-x-generic-symbolic" active: true } ListElement { text: "proposition.pdf" state: "10 seconds remaining" progress: 0.7 image: "../tests/artwork/the-man-machine.jpg" active: true } ListElement { text: "electric.jpg" state: "Failed, tap to retry" progress: 1.0 image: "../tests/artwork/electric.jpg" active: true } ListElement { text: "clubbing-friday.jpg.jpg" state: "no state" progress: 0.4 image: "../tests/artwork/speak-now.jpg" active: false } } ListView { model: model anchors.fill: parent cacheBuffer: 10000 delegate: Loader { anchors { left: parent.left right: parent.right } asynchronous: true sourceComponent: TransferMenu { text: model.text stateText: model.state progress: model.progress iconSource: model.image active: model.active } } } } ubuntu-settings-components-0.7+16.04.20160321.1/examples/OtherComponents.qml0000644000015600001650000001706112674023445027115 0ustar pbuserpbgroup00000000000000/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Authored by Andrea Cimitan */ import QtQuick 2.4 import Ubuntu.Components 1.3 import Ubuntu.Settings.Components 0.1 import Ubuntu.Settings.Menus 0.1 Item { property string title: "Settings Components" ListModel { id: mediaPlayerModel ListElement { song: "You're The First, The Last, My Everything"; artist: "Barry White"; album: "Hot Soul"; albumArt: "artwork/beach.jpg"} ListElement { song: "Stony Ground"; artist: "Richard Thompson"; album: "Electric"; albumArt: "artwork/farm.jpg"} ListElement { song: "Los Robots"; artist: "Kraftwerk"; album: "The Man-Machine"; albumArt: "artwork/insane.jpg"} } ListModel { id: timeZoneModel ListElement { city: "San Francisco"; time: "3:00am" } ListElement { city: "London"; time: "11:00am" } ListElement { city: "Rome"; time: "12:00am" } } ListModel { id: eventModel ListElement { icon: "image://theme/calendar"; eventColor: "yellow"; text: "Lunch with Lola"; time: "1:10 PM" } ListElement { icon: "image://theme/calendar"; eventColor: "green"; text: "Gym"; time: "6:30 PM" } ListElement { icon: "image://theme/calendar"; eventColor: "red"; text: "Birthday Party"; time: "9:00 PM" } } Flickable { id: flickable anchors.fill: parent contentWidth: column.width contentHeight: column.height Column { id: column width: flickable.width height: childrenRect.height StandardMenu { text: i18n.tr("Standard Menu\nLook at me, I'm a new line.") } StandardMenu { iconSource: "image://theme/calendar" iconColor: "red" text: i18n.tr("Standard Menu") component: Component { Button { text: "Press Me" } } backColor: Qt.rgba(1,1,1,0.1) } SliderMenu { id: slider text: i18n.tr("Slider") minimumValue: 0 maximumValue: 100 value: 20 minIcon: "image://theme/audio-volume-low" maxIcon: "image://theme/audio-volume-high" } ProgressBarMenu { text: i18n.tr("ProgressBar") value: slider.value minimumValue: 0 maximumValue: 100 } ProgressValueMenu { text: i18n.tr("ProgressValue") value: slider.value } ButtonMenu { text: i18n.tr("Button") buttonText: i18n.tr("Hello world!") } CheckableMenu { text: i18n.tr("Checkable") checked: true } SwitchMenu { text: i18n.tr("Switch") checked: true } SectionMenu { text: i18n.tr("Section Starts Here") busy: true } SeparatorMenu {} CalendarMenu { id: calendar } UserSessionMenu { name: i18n.tr("Lola Chang") iconSource: "image://theme/contact" active: true } MediaPlayerMenu { id: mediaPlayer property int index: 0 playerName: "Rhythmbox" playerIcon: Qt.resolvedUrl("../tests/artwork/rhythmbox.png") albumArt: mediaPlayerModel.get(index).albumArt; song: mediaPlayerModel.get(index).song; artist: mediaPlayerModel.get(index).artist; album: mediaPlayerModel.get(index).album; showTrack: mediaControl.playing } PlaybackItemMenu { id: mediaControl canPlay: true canGoNext: mediaPlayer.index < mediaPlayerModel.count - 1 canGoPrevious: mediaPlayer.index > 0 playing: false onPrevious: mediaPlayer.index = Math.max(mediaPlayer.index - 1, 0) onNext: mediaPlayer.index = Math.min(mediaPlayer.index + 1, mediaPlayerModel.count - 1) onPlay: { playing = !playing; } } AccessPointMenu { active: true secure: true adHoc: false signalStrength: 50 text: "Access Point" onTriggered: active = !active } AccessPointMenu { active: false secure: true adHoc: true signalStrength: 50 text: "Access Point" onTriggered: active = !active } AccessPointMenu { text: "Access Point" onTriggered: active = !active } ModemInfoItem { statusText: "EE 4G" statusIcon: "gsm-3g-full" roaming: true locked: false } GroupedMessageMenu { text: "Group Message" count: "4100" } Column { anchors { left: parent.left right: parent.right } Repeater { model: timeZoneModel TimeZoneMenu { city: model.city time: model.time } } } Column { anchors { left: parent.left right: parent.right } Repeater { model: eventModel EventMenu { iconSource: model.icon text: model.text eventColor: model.eventColor time: model.time enabled: false } } } Row { anchors { left: parent.left right: parent.right } spacing: units.gu(1) Label { text: "StatusIcon" anchors.verticalCenter: parent.verticalCenter } StatusIcon { height: units.gu(5) source: "image://theme/gps" } StatusIcon { height: units.gu(5) source: "image://theme/battery-caution" } StatusIcon { height: units.gu(5) source: "image://theme/missing,gpm-battery-000-charging" } } } } } ubuntu-settings-components-0.7+16.04.20160321.1/examples/artwork/0000755000015600001650000000000012674023672024741 5ustar pbuserpbgroup00000000000000ubuntu-settings-components-0.7+16.04.20160321.1/examples/artwork/night.jpg0000644000015600001650000000503312674023445026553 0ustar pbuserpbgroup00000000000000JFIFC   ")$+*($''-2@7-0=0''8L9=CEHIH+6OUNFT@GHEC !!E.'.EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEdd" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?\RR⵱V-YG:Kae)4Tλ\\L ~5iȥ) LAi:qJz1ɡfFimN(E;(\ܥX|r4g"[:M})@~=+\x'Yčn= 4ԬK{rzGqZ^ԭ ? j7.ȯ"~#֢>Y;1$*h]4 Lg p~3H$l'8Zp%"QhS qV9ϛkGY0v&M|g#Ӹ*xY,ղTo\Tgx@f#pqՇG:&A5\xˉ#n6@EMHz*m!hX bj}+OcҀ CК_iED)s5AlbQ W34d8c 8V},6KĐ>kIS\cj{o-dyG2JtZ5mq7ɲXǯ\ѹV#q&.& T+(9E.p4$]'S\6Z&' 6\GϹ9X>}ykjSrntmOA\,ezHr5Q'dژy{j1n֮mv ~屎;JJK]1[ 6Ӆ#޻SEQs7(T u늾{nFKs{K=̄$ {`94[.V/=HYHKm a5Id`"VX $pG2#g9$cK>ēU|DrZ]|`0Oz-=|·Ը]Ax6GFGQHo\ܺ2OִU⺛ M Nq֡[ssfAVD.o$e\$ 95Z:@ɑj7p?J~6eh6qh@=\R%1^G~ =O~ׂ[tp;N@9jͧ2M~da@f AqҢuc- F=>H^) H:(VkQypfxxcN빗/$I9*ŝV& ^2u+}rj0.%tyVB[-e,`+(1c x[xT˔5I'+}NOs)fD)GNǚ;èur0䜌zǮjilYH˗§N1k^HO3E-,WCWOXnUh~cYʲÓ/4ddYW fxA+o=Ny4rی\<ғCUb{cs,g=>ޕ\4r]i:$Fط` ;IGzfƓSg;?ZP^0k:nUTn%k =kCWgt10Ԑ:_y,Movw!MXM# ۥ@Le~\:noΊ~w",FMV(QE (Q@Š(ES)ubuntu-settings-components-0.7+16.04.20160321.1/examples/artwork/insane.jpg0000644000015600001650000022553212674023445026727 0ustar pbuserpbgroup00000000000000JFIFl<O{ucs'cS3NNrsrGszFlos1ӜQZ:LPO{~129rxLc~GB{zq{۷<~98ϵ/O|;( ?_@sND qrL>=*Fo;ǎxP$zsp}N9@ L~^8=094؏L{qE*n=;t1Ӌx=ZMM"xJB0`<dīt9< .[+OQל8 2֐;8:jd Nztb{~]'{i{7[uտ# 8P?` r~_ϚrW8#w:AT8'GW_3 @ ЌA[r9㏧?'8׃~7< ^ܜ 'iQO|؃Hۧ t}MLS=z\\Zկsǿ~%̐~ϞGIs''?u9޳\` GF2F)<\f r qOb=y"1OC>s'=$wpp{U'_RCCߧNgP<qރ93N[8?0FO^x==8) N8s۶z)NGn8Bz~s/yvKק~3) |OsӞXqg8cN9<篨x9zKV]ԓR1?v<(T`^ߞ{v9s;Aw@3H&N8>+K{5"= {c? 2m#?3@r{ԝҿ,}?ϱJ2cvcRNI+hnGW֏~>)U30NOV׾zw}:~D?ϧ~?h9! c 9g>ߦ:~<;cxN㎙C_^N{CQ\d=:,cc8=zc/==3<;bs#cîpH1?(lӯ*FGQ߿AqڐzI?3p ?N ) Ǯ;PT@]zt9M7\b3<>Wa@?uհI^3O@>ԅP?߀Y9s$}Tmo];msq?5VV[r}pNy׊&$vg?;v[קz=q8o%+;/]2?\?\⬠\|ðߟOQ*:qsbT}N~P ӯo|~9$Ӷ?H`1=q5tu`$F@zӿo9>`GLu|dL1%O~x끑o8z8?_3HFs#㞃?O—;ZY;i_]._ן^rqמ_\=70N9x=IࣨO?D98ӧ#n(;~6[^3)߰z~}4`l県S2vFOZUk[7q2x۷NbH=~bsg)'m9G'oӷ:Srmׯ9~G3ݧfb@p$:+iZ0yT9~ރfS=OnsRA'\tpڵi[˯'&՝pn@#<Ԣ2:Aӓ[%W#' O$g\עxo7ďZhxkz`嵛f|g ,ZɌrSpR0Xdg9OcqTyOJSj:{J&cR sB+~A5}-k]<)ǧצ<: }39_I_mn,ևq66v!ʙ ,,[g,ago2mr\n\-}R27Ѥ00'o<7|9a{J{INqb~-VH.f\@8тF}{/X.-bRZSޢ#@2 VѾA},|} , B8xo-ڻns7gJR-W}zkK}@g T$ H/4"y .z*^`R1;? |A m4Qn./qIs;K+29(2njbaO8׿r+%ӣ[gS2ݺ) TjR\ 9y2Z75?a #ߌNx7pH_O׊A>l_GFFG^t#.z:$ 8qǨǿ˾z݁>lg=q֜Pׯny9=r}{q99폯={vhއۃ89x 래:NqsƓ18qtЧ ӑq ('4ORn9 @^=B=1mar U d_UOssߟNz{S0QǯqsJ2z8g~y8MKٰ~\`nNOI L; {Ɋnztc\`ߊ>0 q^I\ͻ]mfJz^Ð.NwRqt\pgg#<9= #AަϳW]ތƌ;.n#sǽ]iќ䍧lv}7x }G^1NM'umvEۓq9sSaT8SxSwKӎFqӀNÊ/x=qL{]^q$EO:鞙>9ӯ'bFCX=OG#DF?ܿ;?Ektר,NN=3qAUSx^g<?+38jK޸}z;yYQNI qR1s;w`ͯji$?ʧdlrwxs:ԣtdƯpש\琿qcq9931X7m)L>cA9|Px$`?Úc`IL횦 qG>_lbW׫g(˧U~\rB\; Gs9sǨONܔ p"bq>1=މJh#h#Tb$#}zoޣ+Z̠osؐq۱ zRGAgzG?l~_:NX^sӃ=if<2Q|J8e;`P#}(RKAg̉bV!'^I9:c>*ѳp2Ov_3Q['0{Ou},?Y[o@}r'y=r?^t:j?AQ}Pp[7?<ԆLc>8#ӨҋAg̓̀@xxqPy8zBlKp}FH4˲Jx$;FwJ^~Og;9y96'P?`su~#ߕ' {йV?z Ih1qӀzvq檬lFs?n0p3N'&ݮuNޥF:j^'z9=sޣ]2~ǰ~A#v}9?f08qc#" DF01^=n3)jeiVq KIY4OJجO'*їgM,:KULC?_ hey RXs}W. k!+[hbF"5Tp(]C!':p8냎8:cqӟCnǿSyG(0|j;jt46ucnk.ڸB*i74H,w0y`̀9=sc>}v%O=~>U]p1g=$cOP\)'4csT.n]/یlqqpybH=Ww+jX]!2s89G/~\Ǖ򿳭@rѷ6`%y';?O~iO#3a?3>>H?cvA4r>w;├?+r:`<0:'ҎzXCw'ӷ4\ӎKc=:SN=?.=\qo/ 8R@|=sG^b1_>#ӽ7a[ I?48WL-Ӆ'@O9ox~?M~O8>B:*`! &Nsv.VQrDNMzO|c̩SU#ߠ' [eîK @3W`ElpzHEwqVI[Ѩ8>Ia@GB G$gFN;{O0Kl#>3ܧ >ߎ{z}*V} n6=i"MulϹwE e$t'ۓ =$'Ͽ K. ܊28*FByC6 22O<89dT% l.1TXFd$ u{_N#NÅ!qU__|暁CI3rt$;H%,vx8ƪc%#Ӑ}5rO#N4-?R'ׂ=x+Y{_9T^80O Rsޙ;鞔x}r853lZkMj)M4˻[~ǯ8)88z8 '##>{: .&#Yu(RI#$Ip*u%(B4)Ԓ8(9[({UkQqIݵn^Z7vcc]9f`dFq߮HOj gk'c _]^ƗZ]; 74E5%F+>bv1Y|FlRu!Ho $zXug keV_qGqiPE QD#L w'' qe_?SU'IO+VJRQu+BpJ/sE'-ݯc>x,/N1UJ.B|utjSñU0b{9c89ϧkI'I#} F$Js;:ŧnLwR0qgˮ?_o{}ys~Pqq|csbu>}qWN`?@i^/@z{w?<=R?1?/r??S?ZBAoߜA֗nJ=zu폯2i:K뜎#pBUIl9럯*6_n11`{:UW?ק=:U$):c;@Rj{q=i#^On? ㎕S~oN>=p*P];gӯGf$g?9x=~~cۊcg>0yׯP˰f^y z:qڪV]5Sy9{1ѷ}q`zdtXM%p~Qz>sNj&A#ӟ ɷg@S^=i\ =x3?ZXϷ=gi3ӿsZed H=;sO?m4Rx>jp7p9{8nryy* QչԀzup(/Mkt]xrzn;' ,[#p>#l\1YFxF;眞QJ a=϶s߯RۧO\zAs;uAlqzDF:#$x8ߍZKIq㯠4mp @^{*E^e('Z3@9te8emAVрFK8?N*̖F$|8:}~_yG29<_^R28cׁcs@gq={Sw7_{NMt&׹3淝u|-ip1?9Tvax=p$gpf}s)VM#uVI#Al9Я^j)b? <566W3 g$| vqۓkվ|Ə[k–ȪniLB6eFl<.^;t_huuE>(>#Xw=?g;<Smk\oVȶ{߳GpX[KKXՖ9f_6vw`<)1W718<29a !AQ$>x.#1hRΨUe*O-&I|a?&~ ӭtYCn ض˸aO:<#סk,>"aGo?nI',Řw8$rOP`y=xvCdR\E*XB"m5*;f<[*Us UJ0ZZWݳzm\rF8 I`OSz`x n<\ӎAo\UQ2:WE5(R$c6RI+Y&I-O^R^_ wvك$R.[9,án0Oϧ0Ts^}ӧONչ< gh@y=qA'5Qn3ޞ:A#p8jgr'?߰m9A0=UC}8u=5bMZ},f~`{~+WoEW$|og#:y@cځc[9 ppqw' 3ޝgJxz֒gh##O'>vI ߧꉢ!%|sצ N%A~@cvp9?O~"т3'x=9V2imLN8?NɎl p sAΤ}cԃP:A Jo\o$&3@T<gyO8{Lp  {ךGudgv9 ǿT-njMnڿ]·SLzc=G9Bz&ޘS88O1ؓ{0=h+I q s[:3N? z4~t2m]'Y}U(˰SN;2I}y>}ҼA]-1Tq!"'z='chJӭ,3Ex @]<;?"BS_ظ+˰|&<=(Rᆧ̣)SRsZs;a=>0t>Ϧ;{ԏ{ $q=;w~Ih u>Z :#G\w<~h _x$|ustmIO8:Cmx n N_Zw.xx0ێ}=4Xc'zEnN;1׏Auf$9xg5w.~muv㷷Ҋ q?Ey/bz<=PON;֥؀uGn? ~Ga砯|( O9LǮ?xsz A6={M :@ I9}??p;<RqAX_OO <;foz_`~SˮONiP\㷹<}|=(4G^yw,<HlwϷt=G5Mv<*+t<O 88|%NP?j,NGSqϧYue8- ?=y曱dYҶןD>sܞ;ץC~r2z>ePsGׯ@I?}@ g${cǽIcA|DH w<ό^({;j-43>1#ɧ`ry8={g*4╎XٙBg|&NРnANkĿזr26_2-** 6ݚFiveh+^O* ,EfcN GD)m^+rc1<1x·i~$]P=cqc*H @0Β/̌»jgF/.ZФRmRi?es+rV.M{9BJz366_<Ǐlc=3>.G^6`*%@`Fv;gG+;㑌8j;+I8 >'Ulg߿='2?!?Àq8&t| u\gۯL_v8$c98$}*8?戓c8~0{$q9M,]v~Mx;V) 0յ&1$66J !vVjaim6VƑUKxFHx䌟x79Èj(9C#4W2V\ss&Gy O后6SIRNWV^^ӛ[╗+wg2h[aGKM,HY\TFO.>3_AcHSnK&Ә[~5~=מ߆9os9 ߃ 8sĺ|Sۚjt~&G.eWr.3Zjҽc߁߳_%4Kw(u^.uVPe2m)wtTጲx9 Ge88C'hێ3?@(`zOjs. Jxj8zJ#NVwڻogv"'ZuU46޽m.F!@z Q9#qXc?G+XŞyï[4E12sgQ|~=m1=Ts{{cƄw&8>?p~kT۔q$A}~ljcA<NsT{Bnɾadg'j-2ԏ'1wBv:۞ks_KXQ5h6G_ȅR9zsNBIӝnoQUӏ| ɦն8=8fbzQצ8 qڷؒN_#5]${AON*/n]g>|x U01l^jhz#zzUYm#=?zbmlki˹}X9=2OOn;sU^ v#9߉ =#[fIE2'n4=r?^,I1~wO| $g$s?zB9;rFN=qғuZv(rpR?*,v#=:8#\ `X8Pc>}OzD;L(ʅ##E;MGnO矮4p#`R"*tڣ#i]rrM=>˨ ąpzd\Տ*uzsdd;UC rpG^:r{zbǂA=qА09@J$8'xu)n,'0:u@989qة 99^0=|u5oOרּWlg9L;kWNumnh^\/%;hnOpqH!vϴ<`c03۟K?|Q cډv F8 hX%dq-_fy,qe`ruNU?y65WvHLF'[asqRooV ɭlؿ{m^#xwSnA  -! uH4CR8VS/|Ag>\:z|=Vho ܴ 7:URYgE6 {ej;[a=jQP!"/#Ԛy#M>Hg;X r|f ,_=)"CEWM׋u{q"-ŵ(|;9W `' չeӚ.0In&=/7Ж R*RrUK? E>#İnb,0]0 0cx<}{3_ ݅ʘ#t&VO2KHX-d$5ZDY$ۓUԶ600}2?>.&3R BtvN-Vu1KFG<.^2|%V*+wRiikE'}UW'MᩮKy'5DK+H5=vyI i*[|VqמyoY-'1 *: mF+wx0v>1sƿOw>+oL/\.5 g<މ?xLڷc *>#ZS9ӵy&I^%d~x,-5G7SB Bzhr% zQKYJeE09Ǔ^I>:r*Cg1;@6Fyc`1_w>|$m_ H3{KcE{7Y̷ s_񇆯#;@$ [ڬr1ͬQA=2bHmd`Ir~UsX*O`}s8PJ]co^+`xeu)ܵRjRqF.u}O,ð<ǯ+yt=9KjcQq}g×l%D :Ɠ|Q[_)d]ˉ#%#[?1[BOKzΙ\UuU=𫍸~rxL s/urS䬟˸χs8EPpZ\K٨RWѻsj|baC=Fr0:c'ޏ0+0$~tO k`3w/5 !Cfb[|'˃O9keg^Y6nwc2עp-b/ht+rG㎿~*JA;I׎=:^s@0No Cgcjim8`i$vTL'506WqOEڴ0O qsu߇ H7^ޑ\dmE7A+ aI$W__ i-4i6:6okpicTwXЬ-pzd8=ɸk-ah>εiaԪ*.ͦe%+yͱKXJqYdE_z_gpӼxN?r:\:=ӌ}8_]zW&۽TW s)[[=}{1t#?˿ 4#G8>n瞧OnpFH>y$c 6xps'Ńue͐~>8ֳu#A4YG*r9QրTn\*6sɭ7==Gq=X&?^w3o_שa<S{T e8A9`[BOE#{cz/^5]63 #NϦ8?QCA$\$Ny</3Os^:Ux-ӌ8`18uVhMݻOӹm c=~=vUzz^@:=1*33 zq's)O0F A=ǧ\Txl~ <gUwdq錟q㷶i'v։_-3x1?^ǿ^dVn98G ǿnK 2^0+Be->:H}9ϞU`~]Ϸkkl9ǷO Ń/o^C?C.iwy ԁ=809=rDOˀ91=Z襇v0rz/_15NH@8gߵ՝xc>ҤP[<w88􊃂1N: dxVlG9!<`zzQ{k淵v_"t{VCq~֘X}#߱"dT.@_\{i>WYAֽy5 Ĝcux8kzlN&j0s_tN%k^Κ4G:$4:SZ]퉧z:}Vss3frM#0(݉  }*^mPCu!ss*ZCv#*w#_eLEHe?ك▫c>('u xSšŶZŝΎ-bZ{[ >; w*LaO%-Ğsm~@յ]_Q]g_yPWyNgV |-| y¼o5,e(Ƭh02%TM)SU/)$N_Ƶ2rܡj*U+└ ^ikɪVE4>=;zf>ᇈu +0@P0. -!,4v+f*pO'뎧$z ^ޓ}HlNXA,*y fy<,,331=LP 3~vvCS28*M$j(S$(<ɨ~5sLkNV(ʣRMk9-ZVJʢB33ެ bNˌz^ gVbPHN~}Wy1o=8#}=*[ぴtr{#GoJcwɤݕZpa2z<`=[[X˒;u_ZXz psHr8#sFzg]bRRr c 0Q-(qZ n0z'~ #s}szVri2ŷRNN} H$/n 5a-ؐzecI #N1i#w:z\{g:cAG}-#)K5%]gm|94$9ֶ~'›\NDZ5g$wmיwL,1ϧ48g_C[mn|`èi_b-yێ\rBI|x0s5c^à0=Pץ4;y:SN_K[<Τ8qǯ>4><ٷR3xqSD#=H}8j4λ?7mu0xOl֠hHS|cnƷOצ? TFOQi0]9$~ pON;7c@{Fyͨ##>XӦ:ŭޟfm~%~}lp<>s.8'8ڷZ~zcקSWhA<zy\_z/j=8d5J[b9zFzOqߌnzh5D(45 wt1ڪ !pgκI-r:|Ӝ``ngx}}sIon1{E<WC%9``9?? 'g{H` FHUǨoL{U&'==~38<瓏^cW u@rytN[~?sL9[_8qEn/@ǿ=;ٷ3ןL>ҍ;'sH$_%? n@l ȁ~ힾ;P;;ucSnFqPĄ$'zpG qg))@?)~jw?1,NqHv gq_Two$<CRz&&5KEx|!8^c*h<?}) 1O@}M9?灑eZmuw3mN9 ƒǷOȫ c^)H,rFtb-w7w}} 4[ۈ--`DygiX$I$w!UU ccO?a_967-YVwfpHҭTp2SdpߴwvfIeѬ«y'`mk5ۂArK!v x@ ^obqj\TiQQ کt6r6̸q?`ᤱeVS qchԅO_/KjZ/u{{)tVCqht"gˬ5+q<%8H~!xt;;,|kAk\) l*DžumVe$=+hnBc8y&ȶS0ʲe!pрY;y7pnSF8{ C:kއV8UU#&iFPnWęcRO3:+8<:m]PqYs))Z'*?vvѮmG5VQi:|HI.y$q>l6wq!Z%~w+xk3a@ mE)kihiT0\]9,᷅o?h > e5;=OZuVM^;dh4?Coov[(Z8TqpH0 1$pFXacz#=:cI =9O'<8Ovc`q S8;ohEjuh&c_};fbIUX6pTCd}p2JKFwZ¥i_ =~8_uާm!Rvwh5Ue"oؾi|"1\@hZ0x.'IbG?77;Z4kQԯ{۝KR[۹幹4K,9gwwffbI 峕iRӯ_ {?iJM(d~ cpUL )oĺy׭56_6/oϴ%`?g}淍ӧ$ۯ|j3ךI=H?x߿jr:{}[7 q'p-Mm4C'ue}8=:j6H==y?\ǵtv9cƀ7^p[v2{c vwUg9O~ eQ1VKrOּ̖N4rL?\!ks'|Hms `p3МgVKpQm{M[?V6IhvTWCGSs۩J`~XrV AS<-cJi%q^;+w]uVK FFrx#1p9={zՄ Wg$*@N鞼8-lhy$yrpN08~=0|giW?5=Ki|UZɦiQun56] 4u =l#8Cq8VJB骓|*/;8~-bƜ%;Ւm"z(I[;˕$vֲM48՜' z}Ǣ?>5z6C?mZj2Y:g}k,v6Ei7FG:3)Q;_:m Lj4Kt;S"fk[E0{*,2 ߀=9U,v+)R 4Q\i5+{qJi?\΢aF4f: NJ_U}ZIZ;??VBNֵ6I461^vk״_&G#ޢ}3B;اGhQ؎:vحA_A'x- IeWĭNWDdӲqO]wZ%q~+ݎaO %jt יo/g{<o-Zk7:K=m+VJVLIz%N}:IzZ lp#7^pq=NzYZA랿̞g6-˲ `hrƍ8SR\ҌSk>Gb}.\MFukTI%\qkO'C6+p>~N5l[ 0yA#=UmFg?LJ[A#!rawsS+mßܻFOrSE}mޟ?|n~yM;FYv`I:g{Rxg$R},NWAzۿּk H߉ZTlDz<+jKp0  m ВsO8tkVNMi5kꕶUNrÒ>œm[|mBU?.q>5q-F3r<zaPqGϭ[xs#_'_?CJ;se;vqJsu\z?F2s''obvo_#C  2rx< ~YDmQCF_ 5X⯈7Y֬!OW&hB 'ټKFS,sit~e0tًྱH.|YH4S2nE2itvtU9r4Wz^jz}){˹i|H"HơE~%G!fbhXIZJ\ihcQm_ㆣ(׭[IMy;;+YI77\M%I4M#I,Jydr]ܖgbK1'$g_Wgí헢R[tM7j i2, yvBK"w:Rxƕ:xľ;4"#]T$@EyJ[??p7x w2^76>S%Э߆xĺ$u]j^,Ƨ]^=pX٤*`OI T׾OmɊgU*euP4cZ7`Kß x&d=7BIL0kZHoթpIoJr{բAONq5xMY'(Z+\I繯j =W SR_;f[f_|Ey|Wx ]FO+]5]i4k=CDk⽻.?hW.K.JT<t_O'M?i|4Ρ-i^xO Yz|ְ]KKZ5J#E^ FC/## { 33] p^wrgejھ<iesK i5V*bNI5f뙉 3ۑӎ[*[ mX cҥ@ N1m[o~{fKB/=1!'x'vl3Œw-Өב:w{^N'M%zuѽUnc?t߯zԿf^~Sϸc'ӆҎhڻN1~̼t9C[ cs[G֨M^΅8l}8O鎜( ~ s{V-9$ң60= {M>V&¨<}٨Źn[nHHS2ѻi}.6`zJ\鎼0z~~_> ѻ[g+$qϯ˜y zwz^y5Խ1#;gF8qۧ_~JZ_Mwkb[GOSA?i H$峌?]\v$u gsۭWkQp zN'}7oo_o9w{9Vz<_犧$1xϡ'Ӓ?ºmHzq튨Ќϩ:v/2i9l;.Gl!?|*[6~nw#Fl%ҙ\2oD];pb~ض1FrTQ"5 99ϯSϮ:QkB+|m^ߚ'&_&p.6VrKF]!ymSfXʑ ڧ;+(C7Jm4K||w9 IHkoR}8>xyH#!{gAmn~_iIua[V⌱2C܏L=>xQm #V~$~$xg][/A<+ l;kح 33s\{ хM{[u;i?Pܩ*ڌ!I;Yn{=Svmh3<{*nz[QZ3pPr@=]^O"+GNs[\ro-F}]sѦ p0{s֪xvLdw#?_Sx#DB2dq9={-_5[`  zg=xgtVm/k+Ϧ-J.eP>ߚ>(p>ǧ@xVƉ>11zW!EXmd@<C=3ϭe|?TcP s}0hôj߽]/]jnɭQiy]-z?|!%@xAf489sҾo֚:Jcfx힀yƒȭ\<8ϦlޕI5m5H毁8lwy;z`zӧjo`n ` ^]i$? iEr O dW+_#t$_k'yϟ>?>ׇWnsm]^gBèiAe;*ij)| G{#Aͦ[a%{/xvn-"Ka-W_fixC^Ь.bax> ztd#=~aFѳCh@sOl|3B`냅ZZW׏|}>#9V^0מ3sǷv}aғoW}9Soxx{w|.Hq_޺gl}{=8bհF ~xAmm5GB1c?WkQN:?~_u-g򜏯ry櫵!A1JZz~W_Zk`Ns1T0 sG:qzEW^M▍>yoU ׷A?xyi<\9mC }}֫Il;u$ӮGNxrP=\cOGN8ٖ9*?+v~8*@mFx??L֔6S1v폯>z$|1<ۿ^z| e1$z}xz_W4 #t׷WϐN{϶x[i=F8tִ#Uݐ{juƑmߑCm7?cߟүCfA9=GGNhY.svp?ϽZKRHG>'ugdV[?rwvztj 돨*[ H_^'I緦[#qE>Ǩ>_dEl ddg ~zt=l뎙~#Z[G>ZqZF^".2cyscNxO_Rr=am8c$9qxjǡ둜;}?]Þ]FLVhr8c#<:sT5Xi: cid`9x&8rS9#9?8=+2J/_NoȘ 4$arι| @<ةP%% 5'Ք^m)+4ַeSWwpVnZt[NuK][Z4?lgM#RuLb7=ǒŸ$c8 sFtWL  xOhV ]nz~߭cS QK{r)+Kw37WwsMY+o[+-w˱tBG?ƺ=+·2r=:1WIBќs l}x׽}/ !ANnRv岋Qݿ~rjF0w+Zu-q <)tE8ӗݕ۳vէ&׮gGpUNv8Bx2{WI2JFwKA鑜O$p`Ir 3^g~-VPnuU5LƜo);ۺKͯ?ߝfrI;~{bq1z~^#`98wwI-A Olzq qs?Pr3RRSIhKMoíYT1ӰuxI.^ ҬuXӵ='TM,n300YdSʂIv+hǦ?]:gL}N9`:wڐ:U)ԄgN\g k]֋]-kΜUН)FpԢKn?o U8׾1~ρmTñkVhI"ˬ6 Ih&BJڭʴPo5+< Wាzޓjz !Hm库ZHm/brw_)<$k*9T2I.׎E^36VR_)IK6M?ě5LHkdײ:@ !6tۍ8ƙ| 7#5O0Su9y&[z]p1<17R^WJ15nzk]6{k{:uokz6%M#RԚs k$U'HQX"[/͔lbtr.iY<_~:ߋtcR|";]b}|_mxjJ&3Oy8 Ok ⪼Qj¬T.MjgV~m>#RKVNPPpM|-+뵵=Š?Ï_y5P3F8ަ[,9p̀:Oӧi:z[/@u:6]=?Z>?n]?SPc~y?ͪ}/5gï~qϦӯ}GT#}-إԽk/0uZ.r:8QO9}_\WM%8'{p:ӾбB-^Qi~.}[@8r|y$ 1?zȧGهқFO댟ק}aDקw8tuNW>^X\|8z\øw\cQ<1 h~Ikxm|Ӝg3sL{]ђ??u d0N9uN*#b[˭`)aFrc qYnN8:~J8m9?'Ue#̗[|t1)J);\^A矺;y=zuTeVʕg=Ok6ۜǯOҫIi/Hb?!ǧӮ8vZ^bqd7t=H~s?OCU9}Oץt1X#c?䌟\A,0>^x'?>sMU󦮓M]7tݨ ԋ#)[=v>3C#>OIG?X÷ ~[h>tS-RE pxVWk :09<БOŇ|0ж ^P:IixO5ڶ 8;0A)I7̴eis%k7}XnhNN7/z)ַm.zZsC U }+<==bvf+p1}3WVG4xgH# gv쑁zjqx1?8rq?aYSvJ)_mw_=v#}IJrvkzk9[vRBߚY'Q>Ca)mS XT>dy OMx8)NK^o`x;Ffkt=?ˉ/cBNbS^ç|QuTM´zX=Oa_^pA*̤֢j:"nv'I?x nr魶{}&jaBigڊ{_0ībK#GpTJ#0r $/V+O|NYiȥ3v^o56l5 A#d1vy9w=k)\.ZOU}{jm?1V1[{[~Qe5n91I!ǭqEh-Tfx!Tg瞝_SF2|YY=5.uU5-7osm__+yuon~tن=3ߍK~u+&m۰0W}s={9 bGopGn^7hkG.gk׵9g2}zq{:VǂFe,XWqK82hcN ]YzkD':AwӟZdmAqO_ǬKOӞR}dt GsX޿C9%rbɇU# AWa!ϧqYXY~_ }i~8Yǧ׎p1sfSߞzwOg89b<߾+>G~?q)Fsӝ#-v}R}P߆׿z>9uR?xqӛ}ye5}1NF0zF3OY}}=l~o^ 8ǿNkk,cuqM'l0n>ǧ޼#8߰?=8=Zl2} #OMv 1r^ш89z`Qǜ~]%'ǵĎP>\wzS-pζ*.Z/.O6v_K_d`=^޵#x\\^tx {~OAj+Q!^'끃QҔw45i{>ɤ1cAC1z>}}^8wBx*'NOX#' bAGVk6ch12I+5}n6u<}0@5q܇?Qyh} RH۷19'~Ow x?S0WubonmɎ[^nʜM-xKiqǨ>M/$$\v{mړg ~^:$c8ܫ _؎1'4+_Vծվ}w)u~YU|6g'[mEa RIi$)1}_Wo {_ xj"-R Q c盏FZTRU>0My } m(58VCxw5TchSN>ˆ +ES0aGU'y҆!OT}~-/sO uLwӮpzeuӠMgw{`}ƭolv_'W+5ߌuFuFv(8~{{&Tt O#r<_8qZ5VRzng:yIϫn* +5fmma]{Zڶ} _tDeŢ42N̄u>I{žk_ |C|w.0:Jf̿+Tؿli<̩6z{C qgg z0?}UC?lfyJ҄Erci+Sq=,I¥iƮ"~2Nm.^ TW}bx^m?yVG筽X Aqgu+B+18=2=緯ϏI> xn:7o;:G4VJ#?ws-p$3FT3; m$c##}OJY*J8;^o?{J?5Wz!7ou{,eAi%P #}3نP:4b۽SA aHVMGsPNgl<$GBz8Mt]N2QF'N+ƼmiZ#STM[2 /][E{_S7G ^7aԼWEH= ȿ9Ya\)A^ˡ[~!~je Q!42Iq5MW|N͟ښ'xgx`ґ>`ߝ>5Kqs#x_oysV7hbs G#iJiJդg9vIS˨JN)5\ܭ-Ҷ#~*S6a z]ۓf#EWF-;Yv>,߉vmWN3sⱒ;kNS?) JͳpS).BPvik?_a`x?,+˞<:v9A0PpMzJ3cJi׊5R$yMG}M8"/ƒTF$ۧ&ʭ}։q(Qr3IӐAqҴ#\! : s<ηSNKyWc؁3ǭz+T<鶿ϭ{}}AVᵏ˞M8xZv;38ݞ Oj>+^]ב〹:g9{CVR;w'OEO><Nӭ_M0 +}?ɬjbiE׳^.#ӜmSN<ퟭZ]}qՍ< ?$9l%|g}=?b9/˧w~\Y@ِO#*tt3?u)bĨs{{u)N}?N8Uou}~]M^U4o>ޟNX[qP8ʺqʐ}l?*i|1ߜ~ʱ˫|+Dgj{:  9큟AWf4?Nz˦+~*~/_~ӈ ??sR.H}*AG1 ؟\?׈x杴{u|c/^%p 8J3^?OiGM}zBwVN[]G~o8_,wx+/O_y>@ g=kYiuGsZ h7 Zo0\nܬ sob{qȬĴ^ƍZW/wukNޚu{>S_]V6'??ֵN;(<ytϾ:WxB 5ȽFqyg?KB@#t2y9^wԡNҋn_wa(qi\ZIۣwy\/_n{s׳x6:==t_Vf?85?K0d[8$GAsJЇ>N7չvI=:.e;Kul}uKNG`&98lcc#㎵q`3]8XcWt0x~kkj˵2̱ [Zt_߼ncQ0| {{]Z U܍2I8q=8ۘ($?@;wx 4jky/eH쭥)b"HqT`޽XB7_ĒV.kgkyٚb(U*;[WWMoٻ^wf'0 {d2bOcn$k L Z8V !$:r/x4Tꪬ7y:hpc qybmE^* q%e{u ,휀=O֡6A\q]؀y:c+S^UT+<;p>tazMGz{IN].n|Վ]=A8qsTNTt?Ӷ1׾k{2p9$?;uvG02ƼV1?x^q+>Y5}]}߇!NKc{?J+ߴi:-v|8Y֨{+625ӄD5j.hW'o=?ZwV_UgoqS/$LD #)$#pҴ41^#K&fL'i[%Qs^QK'1.F 9# +'k&~ۣ =RJUfM]5[a#Ox:i3cQfu{4%kfEf%'UK+K:?lFnu fdu20&ˏ]V/l>ԑ:'$30APx(qa{OZĖ+`ז.2I+***0`FUx׆5&wxS9eh&շKc̸c'>'JU"UXJ4dqWm]6jw)KѓD~8ҼQjveXZ[Ľ$b%NxOZ><|,HPȲO`Kh." 63TL/rqhvpu^&l\3X=8氦 YQ`v>F<khJtTmgz.擥Z$RBakM.viIᏉ <[_K崭xFԌk(q\1V6p0V#` ꭵ J 0x5E/kmm[w-QUxc' 0uQMA.$nsǯDrMTqQN%S ͂=A ю(qX)c퍛|[my~B:އV Rΐ%7Sd3Ͻxw Uh`Mwk:yWѵK8PbAJ"4-6tk8gkNVjVO)_[]]vȬoou?NO~j?RO|b+'ᇋ.b_VManuXQ\躣3fiPGxQ_>1"&Y`C6ErBpѸbd,kZy*Uc>NTߗ?qy]EM 6SqKݭ2N0<ܜ9?jOڝO|$ ~ x>Sq|]D IО5'Wmh:M4yg5*I.ݛm7jkKB RŵPi$em-usWN8A \O9p1=;VV*A?7'z.ÞrT<`׷^;7S_M<:te*V߻T:m3MgC+B-=2X\ۿ^,$bm0AB֌ZUѺ@O8*x*;`G+hsw{wT'gAK+mcM\wtIiV5tu\خ-" I<@xt=De`=G|~= fURn?}~}VQ7E*G . 5ck'Bwp'.>|R[ϱkVYZ !H./fhO0 )]zfS0 Fz+h$@ qV^3hZ)#Qu$IxoRέcMshNIC˃k4⅁ѝJ}\/}/ykW 2VTW:Q6{\?=|)>57cInʴֶ\:1qWoXdJb ;GV OJ9ѕӒĹEF^^i}%}V)~o ׻mW4$ quub;ǛYҍ,7^ܦ [pN7r+U45檁H!i ),́@8LX5 BMg+=aQrpHyx ,Th8kns mUѭqjX+s™>⏊-H|9gn܏K@6vH9^+ͯ?f?:%?a ;<:OR^R#bVBw߳idԗo帹RRn>\ŽG9^uĘ|W$pM JUV+YM^2ӽGdSʧ8n>Pm^ ZOh}Uwo1_K zϊ]lΫK <6kB|>hŽ.7:u*'wV xه%B uXKtHTY;,+dVV{uN. m#B-nHd"HD8+_<:tmR|qŴ-*R ][^X/uMh}::Tp} NqjU+QVq.NϦ$xTOh.`[ť"] a,3"2xD+3g"$smi%dq^NI-\95'?fyu/ƱkvPߧOob^$ V\F>]F*;kjZٰ߮섑'Xc?0 b eL5*oEst[qMV[/poEXGܹ8G(Vqm@oU9#cWY>n1sh[۫I+^U @FG8os-̧*#m*ZiIVsuX%L}D6i#o߲;$ue͋k3=)okTI|yV*嵛NqqanhOM66"0;iP'^*Kn5@f$جH= 3oo/;AS][LhƠ;6M;ydb!,]ٗGu;+BV[3O ֲ\N|᜺f^$Х/s-䛲iB1i6__5lueifKGGmZXYXwr@T =3Ӟi[T2 _:_Y ? 뗉%6:ݚUfG#g$TF|u1jWS-qs{}w$$he#USR+8h0XZKY[lce}:vNT/$AgH=9N%j^V6pSJJTHR= 5oi6B zQqcyu C %+xxoLЭ8F ÷n5Kyd+Z"ѩNJܭKZkG\M$WUv]ֺ-YhދKFDM&;{qRDҞEK.1rFkgoijV>iWu;?j-F}k>47t=7)Jč? `n?0?o9=3]'ݵ[T=7\}2I6tn%7keiĴTӜqRIZʏiY+mʗO xR>+_gne{+I+}#uD{KY-\ym 8σuQHDFF$0#<+_ +&{#jƳdG /`gqF9m{iKڒ\UJZ}m4뾷0^{ں_mt}BGMjY-4Jk6wO!e;@->PHR[ç6]*݊6}F6gBy`p@8}#:eњ5iphcm6'sU`@L5^|,Xj[ϟk-H6Bzp3@!VZԡ)&m߹/>t%{ ҦϽk_G~x[|),McK $zx9ݔQH5ƿdgKp2Z2'˿+m/e/<6W3BN ^NՑO+³ "$eU&Q`f[ !rۈw-I$|s4./ mZ#U+%lɥ%,^7ZԤVrrܛjO魛>O'Y-$eIx!Km ?wvWw^.5_F$d/# =7 _^|\$ZK("gKUňT>u\jV:ac#;UKACnNxc='rTxۉe&ᅂNҍ%7m빬\jWouRˢZޖelem*0[MnMF;O[9$mfkC[E iF\WWۛ[}+M>ء[lTʬ$8+*d <=tϰ-ܳ3|9#;.x q+fkݣek9 Q_ّN髷[j`OleAҊ I$wmø.&!=r wg\7Ы^%K198?L ߸,$c1me@I;ca7^9qҿIu?wIڸ]~}n>q#g?4` r9 `:ևnn!a%Ktı.9ñF\8ĶaIf \;y&oX2$ɂeݓE$3ʌ}g AwxI(w:pեF1 " #=.F\m2 պ&8xonK$bCdzs3 m,@:˺̋%Si$Y#$y7lNQ%V-Us=7t} md⬬Kqoĵyya;pJ)rX`;Pڶq #nwݰ#p?m۶9ÆLv@:®k<BmF7%  U:neuOz\Y }pF8( w ǵKir!(&UŻyAs.Ðpwq{nyz{[B|!l:\F1mtǒ/R}r [51PULak}rfUdm`ZSºRTaR)K)5%{d&*VQm]jQo[Y4?Nl>ZJf?mj: r_/2[ɼqTW?ï*ÿ< R^XZšQ-vu Ǵ8mH.bʒ8l%l<#:sJ3fegtn$xaJHK-W{'\WmEy>M;W3zrOٰY{nxק_eϹ_='xzm=<[MN N!ufk5R[DNJ XIPkʞӬ}{ԭnSQզӥcz~ֻ7 &eDV$s5]-9UbZ9EI^/T}){s}^-/Z$IS g/nݏYw>;9 'P1I О{:c#ɴ,WQo*j7of2ƾm~khAŠP=~̾2hzn+RE$TV4̘].IT}0^.^(ey9(:sړKM~}-i#Nr# i^%8񵢟3o{:dgi02Hɕ8`Nq]NeIg"YLo Ѽ`2ds^_K i7wlK֮4$K>TZf6K+f2-_8i^7|%xGŚ:oIn7TIb ֤c2qu^,FԅXEͶuOyôr3'RM[]u~Xi^7-k6hm )XKs ,Bp#GGAhn4Hɐ4ڱŒO<_uctZ"E+LW!Y@nl_\哭ou*|ViY릺&]SE$۽}ɫuԻk:5%ՒiHQq*4&9|:_Oa^& ~*П+y.0ymXGrߕ?ࣟ/'m_玵𾕨|3#LwZFa ZZ[F!bFoʼ9 !WJ jWR*蕣ʯWnUkyYu(}btϒKU~(xӵW?tsk'm[7}NIPIdy6)~ khf{(౺y;+H |Gq4cSdN rwsu%Ĭ#<Ҽ+ v.ř.I'jWfD\wFT01AxwRqKERV;rw8ﶚLQQzR~?{8_-Xg?c)Ljfa=ɑŗڵݵ 2%ͯ\w:jzga|/8sX@xU{*mn4q,@-ϖ',EqA'9h$-[Ci(J;M%+=lzuVsk5_^XjbAZ~uueK;|\ʒ/-;5HFX9|onaBWE,An2iH 1 'h F 'FzZJR0E݅H9$p+5N //9T=4>XA-iv guY]woUw]GG 6x75>8Z«Lyr^<7w w\F43"; C7xTB$~ ۦ#U曧U=@$/>N 0 {VWIZ>hnH$jz >3'٭a/k|3>atK>=V]>p*#! ;ǨZo" 5 P#9|G, iWX}PE̚Vs@*!]˵nb/ZUn KN?w+í\\x`OEѺ&voU#]KSXTQM.dkEqdaN7ʣR-Yɥ}^Tn__iFgRڴ#ž9]7W4ahjIF(ǗNӟ[Et4^xxOmfľ )h,4[{SOvĚƹ_R;iCV k?.;oz,{{o4hݴvVKHJuS,_a> H!ٿɷH~mU i4vx\yHH$RKfVl &Ń|**Ǵͽ08 p"TlJpqN/UuNũRĮVʮm}Ow'bO>6o+o={Rnm6]f[D+ѱPwIo0%k_oӼ %n4í.VɠGvӬbhm׵,ifB;)5x7WĿX> M:߇:"6E1fꙂH&q&?%ķByI 1&#,I'-{AMo մ Uޟ}rnYAa*7c],_JQh7mS0|=tOPlQoYDpKkesMXDVhd|[ne 5mXe5eFڀ9b'3V0xmC#r Řh<׹(Tkbkկvchih[T~wau|5*PQm+]ߥm}:S2-/E-GK*Q zjIⸯZmn2r0Aǥ<>GytkMhwv۶'dM4Vy)*j%vTmޝq#|][Ǟi'}KK֥rHr4@¬"dF WxIV";A9mʠ|(# tB}??9uz}wX[.+2arsG֪ <4I'dt:䗢-Ҥ)2M\uܥp A~"[ DmEo,zNb3&9;@I W8lcOO\? n&nR×QV[9.K+iv'OTI$xU~r[?ymxۘmi$A$2G;mV/ ѕ pg X4l8ݔdW@N:t_/cJ4RTiZ%+RԪԼRJ릗گT$ '}qWJ+61 /ߝt.jڻo}uh]bmbc8#$uss9df֧Y9-tg_?tA~eVBr_q}XzӜZ={zb:b%IJRkdӥd'gto}nt s!U)َI#AƘI#VD798\]aF8ppLU+9b3#$ݛ?%em U,qO?'=z"7q\z]\=yWEy\c:qW֧ #S!}oF9qŶejK[;خa|nkJyn=R:qWX&\sBd^7y{c V4Q3>gzo0*Ʒ,D8NFa6RkgigCrHdD*Nq\ʭ!rYqa q1Os~fICH}d`ǿnbפ[[26IA1yn*y#>yw\^%0^~Rdo8N5YoLJ J0;02O$G>:]`usp9#?ZR22_Z>ƱTXKZqI'ӥd&%ۄܑc0;#8Լm~ qYڎ#m'1+ ؗ9$I?<8$;6ߔ6 O^k mO޺V{i-u+t;`g,m,ň9y^>a٫mx^O5*ey+ʐ=?.'ʖS1H$$Yj?iHKGʳyRf`}Y*qRM4Ԙ[:ney3 k)&8e>;!^Py# Z' . dPBʏ,y8sd,M:B[J\m--}$44dy 6sr;jԭ_\DX-g|^X}+2|(I-J̛]yIH%OXj3}VkU}:*\]Y^{v=-Z ?߭FrDd@Kn$G092}k7L@dsIǨN&ԧv ;2Xdqc3S N2{投ЗC JKn =Żd#?÷?34Dd;VEk[7r:s_!si73APBx$o=Nl>ȮoT%_oZNd%YO~j=u6foqoLr:v$_ 27oNN}u&~R qk b ]Voov(^ݯu^ovkqL1@e 375k׍9d'Hāpx9= M3س!^8: \r*0I؊7rVrjؙv)[wNJX/VkYo w U?7Q:V 67$r#9SOJ2\w{uשC T%Wd.u}>&HuPحݖGl$02NH$E-oȴ,2'āqpb쁔6‚L2Y+kZTR B}yͩ%W.- q+~y4ݜ~_r#H.-db [1NNq|ɍF1(#tI1rZp؈,,ʱ?(e5XZȐsiX@[%C2$J끚U59I]^-5N)%lecTTms'z|.V;I.y$*)'#q]w>Ig;RW#<{}:W`r\9+ۂr1ׁsZwJ'7_^Yy~ ?vVװE&~̒a@.VG˒Gl` gZζ4& s=={P,2 m9< 0qqִzv}אLY{u_Jhu #gs۟Ι3Gs~$ s==F~k5 yOE'DڒT“3A8y涬ʉ$Qֳ`T.ˮon9PJɛw8|X'TWs8C~ H#{ƚ}Řc2mn%cl|\wE1GH猓WQe5GP_?XWrQە{_O-~\vD9c,y滋mVVm7!H88u=kD`F_B8Z6qabAhqTܣ7m/}D٦x\ҭaԤRGق1 KaL|O>RjMn@p ہ$'v' yZ&deXO"ԓ0b jZ2'i2̶')";~yz |>5Wwk88*xI$tvf!-T=%׮}IȽH7$c8+ոHUFk09 /~˙&Nk;XgN2*Pܣ*}w;ƯFOn~_ҳ(B\HTN$vجcp].%ڭ=0ÐpG꺰I;X.ֿ-{dz8eim([ŵm 8 *sI9`pA:l"Li "cpʱ?: =+I%[񲱙nd*"؂mnn3$`̿6qӧrk>z_MVkRXRGyc)#H 82YjR ."2fٻb߈\р(IXÅp zʼn񩶸D|ŭVY$4Xf*>mze&饶[6{iIu^k{K;@o֜TNM7etcV*'p  &pIc|~l]+vDd0$v7-_(+NHuZ" XXCb7K`$b%e;b_ΤUݽ:)>M 6;' q}Hefv#7z pzx&ч! VKoVw1I-\[/) ,vA$A6Rt_-Z%'"|r+a_{M=5?r-In CM3D+-$+ɅUL[oؓH$s.,Zʉ7n=D[9YXbi. dXXd,ImEIsii]][[5䛥=|C,qIfUXՕ0hP*l$bx>&um2e-;Q O$ X#w"֓&5-:NWot˻h&A!Ἲ=-,_Ǵ0f<=Jblx76gJ{yIIhdqn18Yy F8<jWUM+nZ\맂$ۄI-ߕKww|i,O4m"bn+mgM>"K[{.$OJW&54IȳZ-6q WȒ7[O ~Wt> 4I&&H\5Xon0#BLە[x]kؗͰ|uI ?R6O]"}[2&bf96*MڭdT_oKqɒ.}-CIJ G,\倦txIU!u/Cc8V[aq9eWIEnԟ7}u/Xc[O_\[Eml+a\#,Bb֟x?sETcF0Pr*4!m3FnDr,G +@қTy'F0#\TywOOs7e-Shn2~UߐF[a-Em?U.r `IRI^R_8"FZ[g-GQV7,nPq5uڪܐN;`WRNc;$^:(+^'@ a66b]ßK-.C> HAs;7~qq|ĸf^ty/ۻwOŲW\0p7`n^2Gn%qiX)p6S1VW9lN&2WZ)>(ƒW{xL6ֳem'#%1#sa˪J xwT1v{ƺK`.ೖS#[Oo\1X׺&i#0ID,0wN G ZpFF6’xxnEmkdyeK1-T(ULҕ8J[IVNꖚܸЫ9r_\X2:s%-CL y|Ѥ'?0_M? yZ//?/W|Kv{"Ե)-~KJ" o=CHId NwxrU&M?QIⷘHY?[ei& ^km<>=6m^tcFwCg9ظF+gvײ\\Mirv/G^)eIQn-^MfWq 4q؜ Zj5:R#'d_I|QJrzj{>Lqd!A yo^X,YO$ydy'POa[#Iel.WO*{8EVwAGkvcā}tjf99s4޿=5߆y0{usJ&9qSzҢ#2Ǹ/P'N9}lk \F'$U>8c[Vf2a;M*ԻIY/?mxy=ߥS-!$v@g݈>ҩtod*ϧN5+N˸U1[y>5$m 9Xe{W\*jy]'cnB1 mO 2Z]Z G}$zs\-!s-$(8!guwaPd#9RꡑcZrEmn?ǝϲFTeS츿w_UtPkIp] ]x2JF% ?^&;E{׆a:D$=8U%W9A2sIxjg^I+hiG?wQr(`ՒwoeA?d(=*aG-y.pm Md-u mYd`xd<5`B˼]]2q=}-CVY|f :XKII*XTF_ ,o \+5VJZ_Y4ezQ'~Tc2?dBCaȣWH${.)"Xm *T̀ Wm =׋|OnEVpw:@~; \k<ц[*D`g26'?7x}g[Wm>OaVP!Ւ$9ۏ! t=kK(XK; C61v3^ lu&/7ұejxfu˿ܼ8?f_6)'q&'8E>dgυ!𖊸b%+Fs5to)"GokQS)ihШbyt^UF=Z<_xºEZ|Syz=0o'JnCm*MLƬ T-U]W! m!i $BI*fڗSxiqu}h?m,%-̦w4+FLmFCaiT5h)9N^qKˮ`ғX_me~X8lt˱ൿKTBĺZuY;>u#twskZ q*YKFkk =o"~x/ o7;o~]u֯xI if k $W_d%uimM+}΁_#L$$ծ^9aޗwL&GhVH_󎾕|jPQi&K^}<ʜI_(N6iYO{wrr RW.Iѝ+}eR'nɯz8h`# j\4n;4p(«u kN~8$C3)u!둴|@0deE23 tٖ13R7/*㞃UKirGߙ!hfll FXL 1#aSm 8tQwI6ﮖ}^{gIK֗w[5oAvP!Rx\vNGn# P FvpƱ\2P[ W^/٧lantX Fz9#8WVWn}[dF!2N9kt"L$"V^6˫49[K_/\ͩΩq$2)TRP႐@m r^ojLewZKHԮ'7P\dua<55-v}X ^GGFmh 9BPduqr> o,1fԯom23y$[/WqcxaZQ$ގ;]&}֍ WJt]_|I@|Q;kQI, 'n[j,ڲcZ: L3e}Q;=ω>!i:#MK9QJo^+`)Qk x.൝ԐGpD`B1 r<֏3T>{3nV׽m7z\.DkNɉ=_HIa )P:~m.'i`,C;F36-kP/-%'(" I[brX2q]Mt,JW2]WPk!O_1§@ϵ__㷏I|ȷWԪi]d OQ<ƭʴw^_wBï~ys<so< -#ã4v́Ÿ6c嶱-Q즞m:)!qH( b;3[" k{49R B;|1spĭBS@i]ؖ TV܀F>[7VnI5J<4ԚJ/}/v}~ck]n_խXXdh_['wHfVl“ 8ӊ+?ܼ{oگ6r(F#32" zNjȼ  rCy'9US֤/ґ&^g|K{wrnaJT~pU!G@08RZ–ZCbD)br*3se`E}DY ߺkM4熇-$m-[tʎ0H nrNz Ӓ4 PayUty+bڜn׆:t8~EWve#?\@99h)TRq\@ G^Q[ă{9=&8A 2rlpG_s_SEVXO;'tf[)֗Fl}zEimSnWKK9wkmX?<}jorۏN3-N֊+ܤXp75SM:M?OhX=z-:I%e$gʊ+1cעNj:JKWEoA!12[v9{^G "(ː13(i{$v_qKRWWݞgZD+.s@!Ԍl|$#1w[(%N6빑&}!2=RLRi݌Q]* sKEDuy#N'%O㍫;?R4Ls#~FH#Z{˄d &; ooaEtN˩]܆NmQ9U@@Pu l%O7鎱i̿4CqmSA5;۹H|+mgSN2q߿(*ҺvWN׺Gsh7^[:}gRXSaΦI q=9nkZ'2\\=WZ1ceGNsWMwοN׵i%y"GV0%̆dvrŎH E:rZGxE/t}~RRMt*jiO~[Q/_]h mc;y͊=fa$UvS>)ȃRKi-ĺn-  >)HĠHPeR ++7+Т8;]#V\jKNK:Ce%]yx}>E!5=N7$ 뻹xhV6.Q@_wțd#8rx\g8 m'kҧe:՝$Z'W+vMuso)+#4/zfGEGFTqNx՝GzI>gvIfif>bI2WrKdp7Q"+A8#Ek~M%JM۫wgJI~XŀoW>EgQx$QEoJ1¶Eٜ}\&81??ZlFwGCG(z%m5y/c~{߮mHce@ZO)rv{v9F2K)|/Ti-+ig|Bռ+ch?at-qEʖ@|!nrA]$lsjnӦeF .ZqET. J+n6B8%FI)]?W եeVɯãv8{)}M3d3HsPGG{U!C07@ g,? \*0HWU`i]+&ҵ_OF[sl>5Daqr|02I5$xgv$3F*Pe$y!qEF{aG%ƿi,@)/ vH铊_Z]ŕHP@ lr}袾?ܫnW3W[_c$K^vEM?Ny9!?Ί(nѽr'wubuntu-settings-components-0.7+16.04.20160321.1/examples/artwork/farm.jpg0000644000015600001650000002165012674023445026372 0ustar pbuserpbgroup00000000000000JFIF ( %!1!%)+...383,7(-.+  ,$ $,,-,,,,,,,,,//,,,,,,,,,,,,,,,,,4,,,,,,,,,,,,,,,,,,"?!1A"Qaq2BRbr#3C41!1AQaq"ᑱ#Rb ?kW7*Cll0tp:']#b^)I"2;C˼7/G) /30ϋqx*,|zR/PtX.^$(9k GSefPcy&,X_UGGg87|, (=I |#bvR:Sfz8œFo q8z.8@I Ua9㺐Ilu볂)XTf-UvuR6g86Q< rڭ$eW:m%g vMEq&<@(P`"JZ&1ͮcLoI/u)o1t*J$4i'4E;u^mVfPvªB n1lK8v/"Yi{C6RŠ&*;ř ~P̶feJ|9#BIkBZ\T ۡ)IQZΌ#.I Q%ִFǓ\cgV ˔1F c4PSsբ=ϥ69p=<ī7 tZ@ e1IfAj>Z(slB & ȭFF>%qS] Xc&K8Vc;# Z$s 0)H6E0ő購0%ٲ!V^'p>uLp[lQ&650NT $~ Gg2 IrF;s1LT2Jو$ (l~H׆[/RrA -51qث%ẻޚfqL47"\sѡ*4uhAn@Q8;@ӥ&*MR 8%P F5=YDׅf(X{K>M\E'?hbAPgRj*<6{ D5*#=Jy>Ղҫ̴! FA!\6;D'tf_ݸ$.;7I>5V]ڮ1QEsSSSf1H!F 7]*àG];}ФΖM$,캗̑M6EY">γ9ˠbg-.Nst^ÙbA +6-1.[mI#H0Щ&N&$[ F\iQ,gSd D| 6-l0ÌB2J@2CG r b1hk^סfYQ|y}G-END凪@<~Q=f# g3}P["TEP/wX *`:c)f1f Ժ%kpPULK`/4L֗Z 8SٱLs꠺6yʐPE5b6])3RM QuY.J!D*✶Zi٤] a`HI;'nL@Sa6d7R% +SA6̫1mo7nv}&ʔ rI4 ל3=:`Q'nֹIPbȖZ!ZhY&e׫ {:9nwfrD9+!=/-_|Չȓ,K'V2KaM_(D IZ 7a(qJӎR`U*"RPa$͂&l@ZB4/mRDD4PF4' ~ '3O~D6x#@l_~H~nγRS~af>m)3%IqSⷓ@&&*kmvH\>}L2leJF~F+8fʼ53\Z0~*iZ,~(^3V00ok,IPt(8,@d˘yFi݌Y" ^>FK#(D;0t-=a: C)*CFN@ W j ny ??glsUVN:/!G?}f1),6F 7inV5);b, 5cDͽtJKU8;=42|+UYQbz%(cOXԥ5ת2ppJP hw؃ M7КZ*8bZ9,0ՒyIpqRb?tњ^#OdCCbMtd*V]i='AO~Ԇ{>P?B-K'Qӣ5nĈ`P]jw;['`qv*B<^QAeۂ_=Y(%" Z4#N`,Zfp3/9C %k}XZ-12kwx% es d);ADey.h|nfl ߰ iwbrJroݺc/n F@ٞlvB֠hML֦'H=Vph:ob4zS<)DQ*bx&mY|t^T0z`F1Gzd5 L^ P:x.(? , Ү|z$?#q]lȨ9›n$%v<; *[ 0>18YIlBEar+JlcZ/u'|ߴ aY䫉L(JM3_Tl)A?OM6nа  Dڤ5r8j\ á0%b+TÓ!AoC|+1Me@8l 81rX6j\*&YUxjC(}IGP՚ng8*it^-$]'`4 Pt2ĉDe !CN>0ܙT)ߐOzQM3+(</?0VUA(}mDȸ#}vlܟME'`k)KP~he8gMMo&xNTzB5:du,@$hu [ywM2]r7&Y`<=rZ9$m]vgޯhnqRnCV)*5Š?\vWo7*}JNU JF%NêYb$}c?QZBA81b(In!6BncIv!$hAO5w| 0h'-Es&` ;&sIٿ>Q\h,8ejw8o+i];f "4\Rf*H˯'H]\0g yB X»0c+cVjw,.t³:7=d2E *޸ƘVSɠ1 ա tݣ(%1U4zAgYRT㑩Yu/e)R=G_HfmPF5:NbS3ɔĐp5&ԙJ/eC9pՒrDĂ1FmWHsVJ ˉs"VƽOFi0BKU/8nǥKzЀ8g5&TACe }-hܒvsܦ ~=ŬdT؛z*0P5|ؔ8@$ct: stB%P0!%TPRK-|ګܢ$D"ENI7U\C$'VV@ ST*gmd&nQZB@D6#\R)W ӖCk1$`@8eW\itߤj_{@mSK^~E pXXEAHjUG#Tp)]>Y |;C8o f[@># {i Yo ҧ `a 1RȔ~aj2@IIK VBHt~q- %xx|`D>YeǾU/%$Uڣ`ExBU!PIIR&HZK )hi䙁hGCRNu-H)fJ8q槜?hˡp;+ve?%ax oN`:;;7ϑB SެrGh qȜ&}ӗ>TC[V֭ٹD V+|^$2י!-ۦėv%RhRKj7CVmrYH@з3;v$1aQ8piRߗ/^41`)n>PZ^0[x)A)׀m pHvZ$ŦjiƦ$'!8P؅ƧKZ Nǂy+rUBf58U.NkEBxgb4`M醤jK(d\LL%A%[(4(@ )}-c_UʾaeV61gOH>K98%YԓzqL}e2y%e )S߿ثk­\ENH>UX*{Bru-HS ]m5bPhc c6Ji{ R((Ks0.\EAn(Š'H( M_$\֩sפJH J@*R]j-f\ْ7%4.q .k\Uyi>-Ѯ51AJ@v28`c_ q WBBڐe -Pvu*.7zԘ} =OHksbͲj%f۶2ATe3p±c`jE)i4Ql;QW5* v1NT.پVv=j.ϹރXEk3(K -y@6CJH^ 3!8%6)U)SK^yսR3.18(K~qL][o"ҏBU8 )Lp:R hfJJD5=D1m2a.uu3ڐ͏H,B]]KDNɤU83eRBKj,@l."8&_D$[_i$)Ϫ+! H@=#( eKQ7KsDM5U6XxOT}|}rB'-BP#l*QBKJs]t?i.aԓ0+t6ҐuZXJI o'K{OSBLyKJH+~ԚǪx)E.%f+HR;-A-x@ 緮%ʹ35RC *o##/%Z-J4FNaY] Z4i*%.F:_L1}?!F,*z} (}zIDMR_˼t_L FzWEZPx[Gg^|HHׇjƙĢ~#Q}Ν: )sRPR#hYMWq2­LVXfܶ>~Q ^j <`]QI$r#%[5UCۻ@3dVܯhHurIʳp,MI)FFoBUL,wA8V _/.lK +JKvrf7DN  `v413SD2С(\mRPNZR9!9Ѕ)$u"+QS TAgZ% b@}*1Br ]@QDUoc/?\,ִL@* UZ&$Q R>=eW0('eR7kJD&K>0)pO+rB)̹}Yz<%|%h-V:T+۱0(C^ HQ6C [b8=>N4]QB3oF6U/3$̞&%0 d\ٲ rT %!JsKٟG DfmLzNyPZ1$ gx01ˉ_zΧBY(0  n(&6@ǭ&r7J7b,Bo N[6fxFгQ*LM:̙rʀ%d5rWh 䤱`&a L<%К&)K/.Gvr~п چYHԩF&:of$ߔT/pA=LK {ËCg/rt0ٚj^4Y%IP1|hk 3&(0HRx购/8jH؈m˫ 勀NExvϓؼڗBC]K Ipqc|s 0'MH[Ԕ/ɡ.mK>.3YݼN;@rOR.#&Z/UܺqPlM-E^LPR1[ٷ۠z*]B\PGT#, i^LA#nj;}MҥSʲ +.A9Sqz-*tA#pBR|Kk%;O;A!d"_҂Պ5P9Ӥu C)7_m$Ar-IHV~&bckj@$0Y/+$[l%D99h<]Tq|7B02zP}cva KЬ]"Cp5iAH#| >+,>bczWZPGB7{dJ.ʚ.U%.x.(Jw87<@1GR&G kOFz #Ygݗni*e %i5w2S"b”Js~87!өR9$F# '|7X˲&dBj~b&"2R}t|h;:m΅ vڝ2H׍vo(OJ+Rv;`· pLj)7T <&"5ri*5eN[OM恴H+ڸ ܞTTu_=][IMJ(0+%DHB@|w9-!1k-J %JIxgIiF\ ճf`߆mE/6E[lbB` x^S7IHzbNwUx3|#ZIK NwTN,[vkiNo#%^-D)JYUg(has!K|1}olyњ6#f,$3*[ tOewLGkRԮ5䆧OIXOFoP >B^L>Ct1rGMnPUj cI_^IL.6$uH!2X_UVܰ^wfGBMi g?$awM1B*a^=x(cJ#ن2 eQ8f19k(Lٛq]9k> lљ_c/i.VĭIT)LT7_24eoA_Qpc+/or5h|P͖}IS/'<2xGJa5GL,>b8AMӳŻCZ[*vbU+=~yFgM_jQK.RZ vJR|D]I.\{ڡ#qW/# ,eΑ)i M7 9-\05m.yA@W5IY$ݗ4t~GO l'gP\!e)HIj^&'"[XIʷB(%R$GRTT}MkUY^= s, Nȏ 1Ki1'0ѲqrNj@䯩\-qnIUMxwUdi1 $ZSn'ʒطM ̼-j˱rc "j];=PQr]E?J4gؚb֦d-G+T̊qfS2/vOLȜG|*fDw"_ )@W"J!N`oEyQn(D]o)ŒaiND)S*-jj C63ʞdf6cdcю"%+;;VG:ck86&T 5.YB j>PsՇ1K$wiIuee}Dr#ҢfLX+ |7չ5[ؽN [qWKda*s3ΑpWTogx0v Zwqyi9aW)KE"yZ`'XFr3OK.oX@Tl%vӇ]S9z'U~VIXkF5|9PbAX:CҭTODźS] OLrt9jzVGMSlX̎>t4e`2kA\ǭ]ź}2@Rb^T'`% fƪIajqCJAqB,oǻo*UH(88dyVISWkWlg}$ %j,AQJOfNvK +*Q^o1MDZXsSz yj0UiEgh3l%#/SbRu~j'*.O˭+ XeZ2U[ԿE 14j\y{~1I=VO|WM{NQ "ŷ!"sdpӉl^1ROZN:@ZO\<oTiViḚnJ)3xHv. T XUBTE 1JNgL}2+:j±fnώ֪|%w\zEiM{#&E-G!)Ps)'ܳ.3JPMIYuҦ?*I+_=+}>l`ޓWHOZzB2ďiX9-\JHY#o$6:y4Dwf` i^j}BT.Q47'O'kuLG#j@o)ROcL=/ҹUEȶP:dWq8a*=-FǾ%͆3+T6GW4ͭZm H+r$$ \TΖMBpY(MLNZ2_W*O59r'&90q%\w7;N9qU{ $y'C^{p:}Ww_<3YǺ揭a6B%6?J]H 6[(B4>^?7Qn j./ٿ|vU>3Vջ>w_s sS 1-]Y QsF&Jfo' 5%+FOzcQE*-I=ߙs6²ͰF k64ggf%@b^9㸈:pa~OK]u<|p%(+I؜')FS{Vm ^e**F{ƃsBN⩭H*^=.hS]۴UQytwy%YJdՉ|Xzo Yʗa 9ڒYTˎ>)6^ǝ ? J}", yc(q ^Co4EO S}Yʔ*[ ^7ޙ5<3F7mY^4X mbڃh D^^㡝zO^X6(q{юі-23r~+ +Tm*pqxyAݪ˜?$̒3_̀"a:Έq%դ+.)G$V QUj7'/:O)J,BWY?zEt75ُ߷)`rQ-)7垒]CU4|N^^K[YP4!%Ti+X X#h+5o+աvԥxHm)?`(?By7=ܥ[aĨمyvuiQ!iI5C'}6HȪ|Bؿ+>™ %jm WMLjBQ̘^]3pR dw*9+ -VHxTZr~TUфwH2JS.k&wl +[u;E *ButN]J N= :scMRcW.6>:7CKT[3.kGE[r9@mĐ--I)hX^Pki 4зJضFԔnHR2)ipRMbyWvyFkcW jNK( BMm4X>t#42I ooJlqbc%Lj6*a KJOV/!ʋ7阕anh";”z P..9[qRAvl !GAyk*MR&)oPrWV=Fc%E.C" rq ڜ*2wFK.:uP$Gu|Szl g6bd cue4UՌr$8FИp?7uHu S֎L1b[ QZ [bVK,]!Kl/sc^V_hs|K.~ bpm!e9TmG%VhRb H b: Uq/Z rYuqHp4jzi&OB:#yXdu":%S- Z]evwg-b`+5V^^ 8*:[Y$$qy᭄Hg\-4*wtNZX @!nKi@BJ@Rω'ʛU]{p#J ҙ Komvh4ii 2bԁ%ZT[!ZQы/@9h#Vc8G.-Z5 ӏaM,/DE'5&BU~uN-7\ԛWo Ί̄bEjIg@8$IiBH]զQucFR:k[FqIh_B6 #~ByJt?aʢ^fef|:AEKJ}AWԧ,ocQ"[jT^ڀOƪ{[JoOC+2<))L#ޢu6DX84*WIrm +*-M<^0їR_4o-hx*[SVTB<,.JFVd.S<,z&͖HE]6R*TGT]}ÖVtYfdz.*΃ˮY"^H}eМ%!75\%5<2Znmb;I?v*GuBE-0JQK&Y0y7b ^΃: EȻN/Hcx^12GM/J2Al[uDTz1yPϲnn_C˧ػϹrqlܾmBâ%w>jr8U\,t2]fmR)s^V5~r7 +m+%>ɭ4:'Foc1;IȰ. * * Authored by Jonas G. Drange * * For a demonstration of the VPN components, you will need the Connectivity * module installed on your system. */ import QtQuick 2.4 import Ubuntu.Components 1.3 import Ubuntu.Components.ListItems 1.3 as ListItem import Ubuntu.Components.Popups 1.3 import Ubuntu.Connectivity 1.0 import Ubuntu.Settings.Vpn 0.1 MainView { width: units.gu(50) height: units.gu(90) PageStack { id: pageStack Component.onCompleted: push(root) Page { id: root title: i18n.tr("VPN") flickable: scrollWidget visible: false property var diag function openConnection(connection, isNew) { pageStack.push(vpnEditorDialog, { "connection": connection, "isNew": isNew }); } function previewConnection(connection) { diag = PopupUtils.open(vpnPreviewDialog, root, {"connection": connection}); } Flickable { id: scrollWidget anchors { fill: parent topMargin: units.gu(1) bottomMargin: units.gu(1) } contentHeight: contentItem.childrenRect.height boundsBehavior: (contentHeight > root.height) ? Flickable.DragAndOvershootBounds : Flickable.StopAtBounds Column { anchors { left: parent.left; right: parent.right } VpnList { id: list anchors { left: parent.left; right: parent.right } model: Connectivity.vpnConnections onClickedConnection: root.previewConnection(connection) } ListItem.Caption { // We do not yet support configuration files. visible: false anchors { left: parent.left right: parent.right } text : i18n.tr("To add a VPN configuration, download its config file or configure it manually.") } ListItem.SingleControl { control: Button { text : i18n.tr("Add Manual Configuration…") onClicked: Connectivity.vpnConnections.add(VpnConnection.OPENVPN) } } } } Component { id: vpnEditorDialog VpnEditor { onTypeChanged: { connection.remove(); pageStack.pop(); Connectivity.vpnConnections.add(type); } onReconnectionPrompt: PopupUtils.open(reconnPrompt) } } Component { id: vpnPreviewDialog VpnPreviewDialog { onChangeClicked: { PopupUtils.close(root.diag); root.openConnection(connection); } } } Component { id: reconnPrompt Dialog { id: reconnPromptDiag title: i18n.tr("VPN reconnection required.") text: i18n.tr("You need to reconnect for changes to have an effect.") ListItem.SingleControl { control: Button { width: parent.width text : i18n.tr("OK") onClicked: PopupUtils.close(reconnPromptDiag); } } } } Connections { target: Connectivity.vpnConnections onAddFinished: root.openConnection(connection, true) } } } } ubuntu-settings-components-0.7+16.04.20160321.1/examples/CMakeLists.txt0000644000015600001650000000014012674023445026001 0ustar pbuserpbgroup00000000000000file(GLOB QML_JS_FILES *.qml *.js) add_custom_target( ExampleQmlFiles SOURCES ${QML_JS_FILES} )