summaryrefslogtreecommitdiff
authorStark Li <stark.li@amlogic.com>2016-08-25 12:01:17 (GMT)
committer Stark Li <stark.li@amlogic.com>2016-09-02 09:33:21 (GMT)
commit574177f6c2e5622c8e79c58bcfc00d6ef84afe63 (patch)
tree8ef59d55dc0237cd6a74fc8ab3fa43625db6e3ca
parentfea39b79cbd368510aee538bdd7b516c1cb1a910 (diff)
downloadhwcomposer-574177f6c2e5622c8e79c58bcfc00d6ef84afe63.zip
hwcomposer-574177f6c2e5622c8e79c58bcfc00d6ef84afe63.tar.gz
hwcomposer-574177f6c2e5622c8e79c58bcfc00d6ef84afe63.tar.bz2
HWC2 first version integrated
Change-Id: If28c9471921af605d13a62a83ef9f4833dc60ad9
Diffstat
-rw-r--r--[-rwxr-xr-x]Android.mk64
-rw-r--r--hwc2/common/base/HwcLayer.cpp253
-rw-r--r--hwc2/common/base/HwcLayer.h96
-rw-r--r--hwc2/common/base/HwcModule.cpp688
-rw-r--r--hwc2/common/base/Hwcomposer.cpp992
-rw-r--r--hwc2/common/base/SimpleThread.h25
-rw-r--r--hwc2/common/base/VsyncManager.cpp202
-rw-r--r--hwc2/common/base/VsyncManager.h54
-rw-r--r--hwc2/common/devices/ExternalDevice.cpp327
-rw-r--r--hwc2/common/devices/PhysicalDevice.cpp842
-rw-r--r--hwc2/common/devices/PrimaryDevice.cpp75
-rw-r--r--hwc2/common/devices/VirtualDevice.cpp494
-rw-r--r--hwc2/common/observers/SoftVsyncObserver.cpp149
-rw-r--r--hwc2/common/observers/SoftVsyncObserver.h49
-rw-r--r--hwc2/common/observers/UeventObserver.cpp204
-rw-r--r--hwc2/common/utils/Dump.cpp42
-rw-r--r--hwc2/common/utils/Dump.h23
-rw-r--r--hwc2/common/utils/HwcTrace.h111
-rw-r--r--hwc2/common/utils/Utils.cpp165
-rw-r--r--hwc2/common/utils/Utils.h45
-rw-r--r--hwc2/include/ExternalDevice.h53
-rw-r--r--hwc2/include/Hwcomposer.h143
-rw-r--r--hwc2/include/IDisplayDevice.h128
-rw-r--r--hwc2/include/IPlatFactory.h25
-rw-r--r--hwc2/include/PhysicalDevice.h169
-rw-r--r--hwc2/include/PrimaryDevice.h30
-rw-r--r--hwc2/include/UeventObserver.h53
-rw-r--r--hwc2/include/VirtualDevice.h124
-rw-r--r--hwc2/platforms/Android.mk91
-rw-r--r--hwc2/platforms/PlatFactory.cpp55
-rw-r--r--hwc2/platforms/PlatFactory.h27
-rw-r--r--hwc2/test/Android.mk26
-rw-r--r--hwc2/test/my_640x480.nv121
-rw-r--r--hwc2/test/nv12_ved_test.cpp136
-rw-r--r--hwc2_old/Android.mk68
-rw-r--r--hwc2_old/hwcomposer.cpp3283
-rw-r--r--[-rwxr-xr-x]hwc2_old/tvp/Android.mk (renamed from tvp/Android.mk)0
-rw-r--r--hwc2_old/tvp/OmxUtil.cpp (renamed from tvp/OmxUtil.cpp)6
-rw-r--r--[-rwxr-xr-x]hwc2_old/tvp/OmxUtil.h (renamed from tvp/OmxUtil.h)0
-rwxr-xr-xhwcomposer.cpp1190
40 files changed, 9267 insertions, 1241 deletions
diff --git a/Android.mk b/Android.mk
index 140eaec..53aff37 100755..100644
--- a/Android.mk
+++ b/Android.mk
@@ -1,56 +1,24 @@
-# Copyright (C) 2011 Amlogic
+# Copyright (C) 2008 The Android Open Source Project
#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
LOCAL_PATH := $(call my-dir)
+LOCAL_ROOT_PATH := $(call my-dir)
-# HAL module implemenation, not prelinked and stored in
-# /system/lib/hw/hwcomposer.amlogic.so
-include $(CLEAR_VARS)
-
-LOCAL_MODULE_RELATIVE_PATH := hw
-LOCAL_SHARED_LIBRARIES := liblog libEGL libutils libcutils libhardware libsync libfbcnf libhardware_legacy
-LOCAL_STATIC_LIBRARIES := libomxutil
-LOCAL_SRC_FILES := hwcomposer.cpp
+USE_HWC2_CPP := true
-LOCAL_KK=0
-ifeq ($(GPU_TYPE),t83x)
-LOCAL_KK:=1
-endif
-ifeq ($(GPU_ARCH),midgard)
-LOCAL_KK:=1
-endif
-ifeq ($(LOCAL_KK),1)
- LOCAL_CFLAGS += -DMALI_AFBC_GRALLOC=1
+ifeq ($(USE_HWC2_CPP),true)
+ include $(LOCAL_PATH)/hwc2/platforms/Android.mk
else
- LOCAL_CFLAGS += -DMALI_AFBC_GRALLOC=0
+ include $(LOCAL_PATH)/hwc2_old/Android.mk
endif
-
-MESON_GRALLOC_DIR ?= hardware/amlogic/gralloc
-
-LOCAL_C_INCLUDES += \
- $(MESON_GRALLOC_DIR)
-
-LOCAL_C_INCLUDES += system/core/libion/include/ \
- system/core/libion/kernel-headers
-
-ifneq ($(WITH_LIBPLAYER_MODULE),false)
-LOCAL_SHARED_LIBRARIES += libamavutils_alsa
-AMPLAYER_APK_DIR=$(TOP)/vendor/amlogic/frameworks/av/LibPlayer/
-LOCAL_C_INCLUDES += \
- $(AMPLAYER_APK_DIR)/amavutils/include
-LOCAL_CFLAGS += -DWITH_LIBPLAYER_MODULE=1
-endif
-
-ifeq ($(TARGET_EXTERNAL_DISPLAY),true)
-LOCAL_CFLAGS += -DWITH_EXTERNAL_DISPLAY
-ifeq ($(TARGET_SINGLE_EXTERNAL_DISPLAY_USE_FB1),true)
-LOCAL_CFLAGS += -DSINGLE_EXTERNAL_DISPLAY_USE_FB1
-endif
-endif
-
-LOCAL_MODULE := hwcomposer.amlogic
-LOCAL_CFLAGS += -DLOG_TAG=\"hwcomposer\"
-LOCAL_MODULE_TAGS := optional
-include $(BUILD_SHARED_LIBRARY)
-include $(call all-makefiles-under,$(LOCAL_PATH))
diff --git a/hwc2/common/base/HwcLayer.cpp b/hwc2/common/base/HwcLayer.cpp
new file mode 100644
index 0000000..cd3918c
--- a/dev/null
+++ b/hwc2/common/base/HwcLayer.cpp
@@ -0,0 +1,253 @@
+/*
+// Copyright(c) 2016 Amlogic Corporation
+*/
+
+#include <inttypes.h>
+#include <HwcTrace.h>
+#include <HwcLayer.h>
+#include <Hwcomposer.h>
+#include <IDisplayDevice.h>
+#include <cutils/properties.h>
+#include <Utils.h>
+
+namespace android {
+namespace amlogic {
+
+HwcLayer::HwcLayer(hwc2_display_t& dpy)
+ : mDisplayId(dpy),
+ mBlendMode(0),
+ mCompositionType(0),
+ mAcquireFence(-1),
+ mDataSpace(HAL_DATASPACE_UNKNOWN),
+ mPlaneAlpha(0.0f),
+ mTransform(HAL_TRANSFORM_RESERVED),
+ mZ(0),
+ mInitialized(false)
+{
+
+}
+
+HwcLayer::~HwcLayer()
+{
+
+}
+
+bool HwcLayer::initialize() {
+ Mutex::Autolock _l(mLock);
+
+ mInitialized = true;
+ return true;
+}
+
+void HwcLayer::deinitialize() {
+ Mutex::Autolock _l(mLock);
+
+ mInitialized = false;
+}
+
+void HwcLayer::resetAcquireFence() {
+ Mutex::Autolock _l(mLock);
+
+ mAcquireFence = -1;
+}
+
+
+int32_t HwcLayer::setBuffer(buffer_handle_t buffer, int32_t acquireFence) {
+ Mutex::Autolock _l(mLock);
+
+ // Bad parameter
+ if (buffer && private_handle_t::validate(buffer) < 0)
+ return HWC2_ERROR_BAD_PARAMETER;
+
+ if (NULL == buffer) {
+ //mBufferHnd = buffer;
+ // if (-1 != acquireFence) mAcquireFence = acquireFence;
+ //} else {
+ ETRACE("Layer buffer is null! no need to update this layer.");
+ }
+ mBufferHnd = buffer;
+ mAcquireFence =acquireFence ;
+
+ return HWC2_ERROR_NONE;
+}
+
+int32_t HwcLayer::setSurfaceDamage(hwc_region_t damage) {
+ Mutex::Autolock _l(mLock);
+
+ // TODO: still have some work to do here.
+ mDamageRegion = damage;
+ return HWC2_ERROR_NONE;
+}
+
+// HWC2 Layer state functions
+int32_t HwcLayer::setBlendMode(int32_t mode) {
+ Mutex::Autolock _l(mLock);
+
+ // TODO: still have some work to do.
+ mBlendMode = mode;
+ return HWC2_ERROR_NONE;
+}
+
+int32_t HwcLayer::setColor(hwc_color_t color) {
+ Mutex::Autolock _l(mLock);
+
+ // TODO: still have some work to do.
+ mColor = color;
+ return HWC2_ERROR_NONE;
+}
+
+int32_t HwcLayer::setCompositionType(int32_t type) {
+ Mutex::Autolock _l(mLock);
+
+ mCompositionType = type;
+ return HWC2_ERROR_NONE;
+}
+
+int32_t HwcLayer::setDataspace(int32_t dataspace) {
+ Mutex::Autolock _l(mLock);
+
+ // TODO: still have some work to do.
+ mDataSpace = dataspace;
+ return HWC2_ERROR_NONE;
+}
+
+int32_t HwcLayer::setDisplayFrame(hwc_rect_t frame) {
+ Mutex::Autolock _l(mLock);
+
+ // TODO: still have some work to do.
+ mDisplayFrame = frame;
+ return HWC2_ERROR_NONE;
+}
+
+int32_t HwcLayer::setPlaneAlpha(float alpha) {
+ Mutex::Autolock _l(mLock);
+
+ // TODO: still have some work to do.
+ mPlaneAlpha = alpha;
+ return HWC2_ERROR_NONE;
+}
+
+int32_t HwcLayer::setSidebandStream(const native_handle_t* stream) {
+ Mutex::Autolock _l(mLock);
+
+ // Bad parameter.
+ if (NULL == stream) {
+ return HWC2_ERROR_BAD_PARAMETER;
+ }
+ mSidebandStream = stream;
+ return HWC2_ERROR_NONE;
+}
+
+int32_t HwcLayer::setSourceCrop(hwc_frect_t crop) {
+ Mutex::Autolock _l(mLock);
+
+ // TODO: still have some work to do.
+ mSourceCrop = crop;
+ return HWC2_ERROR_NONE;
+}
+
+int32_t HwcLayer::setTransform(int32_t transform) {
+ Mutex::Autolock _l(mLock);
+
+ mTransform = transform;
+ return HWC2_ERROR_NONE;
+}
+
+int32_t HwcLayer::setVisibleRegion(hwc_region_t visible) {
+ Mutex::Autolock _l(mLock);
+
+ // TODO: still have some work to do.
+ mVisibleRegion = visible;
+ return HWC2_ERROR_NONE;
+}
+
+int32_t HwcLayer::setZ(uint32_t z) {
+ Mutex::Autolock _l(mLock);
+
+ // TODO: still have some work to do.
+ mZ = z;
+ return HWC2_ERROR_NONE;
+}
+
+#if WITH_LIBPLAYER_MODULE
+void HwcLayer::presentOverlay() {
+ int32_t angle = 0;
+ bool vpp_changed = false;
+ bool axis_changed = false;
+ bool mode_changed = false;
+ bool free_scale_changed = false;
+ bool window_axis_changed =false;
+
+ if (Utils::checkBoolProp("ro.vout.dualdisplay4")) {
+ vpp_changed = Utils::checkSysfsStatus(
+ SYSFS_AMVIDEO_CURIDX, mLastVal, 32);
+ }
+
+ mode_changed = Utils::checkSysfsStatus(SYSFS_DISPLAY_MODE, mLastMode, 32);
+ free_scale_changed = Utils::checkSysfsStatus(SYSFS_FB0_FREE_SCALE, mLastFreescale, 32);
+ axis_changed = Utils::checkSysfsStatus(SYSFS_VIDEO_AXIS, mLastAxis, 32);
+ window_axis_changed = Utils::checkSysfsStatus(SYSFS_WINDOW_AXIS, mLastWindowaxis, 50);
+
+ if (!vpp_changed && !mode_changed && !axis_changed && !free_scale_changed
+ && !window_axis_changed) {
+ return;
+ }
+
+ switch (mTransform) {
+ case 0:
+ angle = 0;
+ break;
+ case HAL_TRANSFORM_ROT_90:
+ angle = 90;
+ break;
+ case HAL_TRANSFORM_ROT_180:
+ angle = 180;
+ break;
+ case HAL_TRANSFORM_ROT_270:
+ angle = 270;
+ break;
+ default:
+ return;
+ }
+
+ amvideo_utils_set_virtual_position(mDisplayFrame.left, mDisplayFrame.top,
+ mDisplayFrame.right - mDisplayFrame.left,
+ mDisplayFrame.bottom - mDisplayFrame.top,
+ angle);
+
+ /* the screen mode from Android framework should always be set to normal mode
+ * to match the relationship between the UI and video overlay window position.
+ */
+ /*set screen_mode in amvideo_utils_set_virtual_position(),pls check in libplayer*/
+ //amvideo_utils_set_screen_mode(0);
+
+ memset(mLastAxis, 0, sizeof(mLastAxis));
+ if (amsysfs_get_sysfs_str(SYSFS_VIDEO_AXIS, mLastAxis, sizeof(mLastAxis)) == 0) {
+ DTRACE("****last video axis is: %s", mLastAxis);
+ }
+
+}
+#endif
+
+void HwcLayer::dump(Dump& d) {
+ Mutex::Autolock _l(mLock);
+
+ static char const* compositionTypeName[] = {
+ "UNKNOWN",
+ "GLES",
+ "HWC",
+ "SOLID",
+ "HWC_CURSOR",
+ "SIDEBAND"};
+
+ d.append(
+ " %11s | %08" PRIxPTR " | %10d | %02x | %1.2f | %02x | %04x |%7.1f,%7.1f,%7.1f,%7.1f |%5d,%5d,%5d,%5d \n",
+ compositionTypeName[mCompositionType], intptr_t(mBufferHnd),
+ mZ, mDataSpace, mPlaneAlpha, mTransform, mBlendMode,
+ mSourceCrop.left, mSourceCrop.top, mSourceCrop.right, mSourceCrop.bottom,
+ mDisplayFrame.left, mDisplayFrame.top, mDisplayFrame.right, mDisplayFrame.bottom);
+}
+
+
+} // namespace amlogic
+} // namespace android
diff --git a/hwc2/common/base/HwcLayer.h b/hwc2/common/base/HwcLayer.h
new file mode 100644
index 0000000..b4ff6dd
--- a/dev/null
+++ b/hwc2/common/base/HwcLayer.h
@@ -0,0 +1,96 @@
+/*
+// Copyright(c) 2016 Amlogic Corporation
+*/
+#ifndef HWC_LAYER_H
+#define HWC_LAYER_H
+
+#include <hardware/hwcomposer2.h>
+#include <utils/threads.h>
+#include <Dump.h>
+#include <utils/Vector.h>
+
+
+namespace android {
+namespace amlogic {
+
+class HwcLayer {
+ public:
+ HwcLayer(hwc2_display_t& dpy);
+ virtual ~HwcLayer();
+
+ // HWC2 Layer functions
+ int32_t setBuffer(buffer_handle_t buffer, int32_t acquireFence);
+ int32_t setSurfaceDamage(hwc_region_t damage);
+
+ // HWC2 Layer state functions
+ int32_t setBlendMode(int32_t mode);
+ int32_t setColor(hwc_color_t color);
+ int32_t setDataspace(int32_t dataspace);
+ int32_t setDisplayFrame(hwc_rect_t frame);
+ int32_t setPlaneAlpha(float alpha);
+ int32_t setSidebandStream(const native_handle_t* stream);
+ int32_t setSourceCrop(hwc_frect_t crop);
+ int32_t setTransform(int32_t transform);
+ int32_t setVisibleRegion(hwc_region_t visible);
+ int32_t setZ(uint32_t z);
+ uint32_t getZ() const { return mZ; }
+
+ int32_t setCompositionType(int32_t type);
+ int32_t getCompositionType() const { return mCompositionType; }
+
+ buffer_handle_t getBufferHandle() const { return mBufferHnd; }
+ const native_handle_t* getSidebandStream() const { return mSidebandStream; }
+ int32_t getAcquireFence() const { return mAcquireFence; }
+
+ bool initialize();
+ void deinitialize();
+ void dump(Dump& d);
+
+ void resetAcquireFence();
+
+#if WITH_LIBPLAYER_MODULE
+ void presentOverlay();
+#endif
+
+ private:
+ hwc2_display_t mDisplayId;
+ int32_t mBlendMode;
+ hwc_color_t mColor;
+ int32_t mCompositionType;
+ int32_t mAcquireFence;
+ int32_t mDataSpace;
+ float mPlaneAlpha;
+ int32_t mTransform;
+ uint32_t mZ;
+ hwc_frect_t mSourceCrop;
+ hwc_rect_t mDisplayFrame;
+ hwc_region_t mDamageRegion;
+ hwc_region_t mVisibleRegion;
+
+
+ union {
+ buffer_handle_t mBufferHnd;
+
+ /* When compositionType is HWC_SIDEBAND, this is the handle
+ * of the sideband video stream to compose. */
+ const native_handle_t* mSidebandStream;
+ };
+
+#if WITH_LIBPLAYER_MODULE
+ // for store overlay layer's state.
+ char mLastVal[32];
+ char mLastAxis[32];
+ char mLastMode[32];
+ char mLastFreescale[32];
+ char mLastWindowaxis[50];
+#endif
+ // lock
+ Mutex mLock;
+ bool mInitialized;
+};
+
+} // namespace amlogic
+} // namespace android
+
+
+#endif /* HWC_LAYER_H */
diff --git a/hwc2/common/base/HwcModule.cpp b/hwc2/common/base/HwcModule.cpp
new file mode 100644
index 0000000..55eade3
--- a/dev/null
+++ b/hwc2/common/base/HwcModule.cpp
@@ -0,0 +1,688 @@
+/*
+// Copyright(c) 2016 Amlogic Corporation
+*/
+#include <hardware/hardware.h>
+#include <string.h>
+#include <stdio.h>
+#include <fcntl.h>
+#include <errno.h>
+#include <HwcTrace.h>
+#include <Hwcomposer.h>
+
+#define GET_HWC_RETURN_X_IF_NULL(X) \
+ CTRACE(); \
+ Hwcomposer *hwc = static_cast<Hwcomposer*>(device); \
+ do {\
+ if (!hwc) { \
+ ETRACE("invalid HWC device."); \
+ return X; \
+ } \
+ } while (0)
+
+#define GET_HWC() \
+ CTRACE(); \
+ Hwcomposer *hwc = static_cast<Hwcomposer*>(device); \
+ do {\
+ if (!hwc) { \
+ ETRACE("invalid HWC device."); \
+ } \
+ } while (0)
+
+#define GET_HWC_RETURN_ERROR_IF_NULL() GET_HWC_RETURN_X_IF_NULL(-EINVAL)
+#define GET_HWC_RETURN_VOID_IF_NULL() GET_HWC_RETURN_X_IF_NULL()
+#define GET_HWC_RETURN_NULL_IF_NULL() GET_HWC_RETURN_X_IF_NULL(NULL)
+
+namespace android {
+namespace amlogic {
+
+static int hwc2_device_close(struct hw_device_t *dev)
+{
+ CTRACE();
+ Hwcomposer::releaseInstance();
+ return 0;
+}
+
+int32_t createVirtualDisplay(
+ hwc2_device_t* device, uint32_t width,
+ uint32_t height, int32_t* format,
+ hwc2_display_t* outDisplay) {
+ GET_HWC();
+
+ if (width > 1920 && height > 1080) {
+ return HWC2_ERROR_UNSUPPORTED;
+ }
+
+ int32_t ret = hwc->createVirtualDisplay(width, height, format, outDisplay);
+
+ return ret;
+}
+
+int32_t destroyVirtualDisplay(
+ hwc2_device_t* device, hwc2_display_t display) {
+ GET_HWC();
+
+ int32_t ret = hwc->destroyVirtualDisplay(display);
+
+ return ret;
+}
+
+void dump(hwc2_device_t* device,
+ uint32_t* outSize,
+ char* outBuffer) {
+ GET_HWC_RETURN_VOID_IF_NULL();
+
+ hwc->dump(outSize, outBuffer);
+}
+
+uint32_t getMaxVirtualDisplayCount(
+ hwc2_device_t* device) {
+ GET_HWC();
+
+ uint32_t ret = hwc->getMaxVirtualDisplayCount();
+
+ return ret;
+}
+
+int32_t registerCallback(
+ hwc2_device_t* device,
+ hwc2_callback_descriptor_t descriptor,
+ hwc2_callback_data_t callbackData,
+ hwc2_function_pointer_t pointer) {
+ GET_HWC();
+
+ int32_t ret = hwc->registerCallback(descriptor, callbackData, pointer);
+
+ return ret;
+}
+
+int32_t acceptDisplayChanges(
+ hwc2_device_t* device, hwc2_display_t display) {
+ GET_HWC();
+
+ int32_t ret = hwc->acceptDisplayChanges(display);
+
+ return ret;
+}
+
+int32_t createLayer(
+ hwc2_device_t* device, hwc2_display_t display,
+ hwc2_layer_t* outLayer) {
+ GET_HWC();
+
+ int32_t ret = hwc->createLayer(display, outLayer);
+
+ return ret;
+}
+
+int32_t destroyLayer(
+ hwc2_device_t* device, hwc2_display_t display,
+ hwc2_layer_t layer) {
+ GET_HWC();
+
+ int32_t ret = hwc->destroyLayer(display, layer);
+
+ return ret;
+}
+
+int32_t getActiveConfig(
+ hwc2_device_t* device, hwc2_display_t display,
+ hwc2_config_t* outConfig) {
+ GET_HWC();
+
+ int32_t ret = hwc->getActiveConfig(display, outConfig);
+
+ return ret;
+}
+
+int32_t getChangedCompositionTypes(
+ hwc2_device_t* device, hwc2_display_t display,
+ uint32_t* outNumElements, hwc2_layer_t* outLayers,
+ int32_t* outTypes) {
+ GET_HWC();
+
+ int32_t ret = hwc->getChangedCompositionTypes(display, outNumElements,
+ outLayers, outTypes);
+
+ return ret;
+}
+
+int32_t getClientTargetSupport(
+ hwc2_device_t* device, hwc2_display_t display, uint32_t width,
+ uint32_t height, android_pixel_format_t format,
+ android_dataspace_t dataspace) {
+ GET_HWC();
+
+ int32_t ret = hwc->getClientTargetSupport(display, width, height, format, dataspace);
+
+ return ret;
+}
+
+int32_t getColorModes(
+ hwc2_device_t* device, hwc2_display_t display,
+ uint32_t* outNumModes, int32_t* /*android_color_mode_t*/ outModes) {
+ GET_HWC();
+
+ int32_t ret = hwc->getColorModes(display, outNumModes, outModes);
+
+ return ret;
+}
+
+int32_t getDisplayAttribute(
+ hwc2_device_t* device, hwc2_display_t display,
+ hwc2_config_t config, hwc2_attribute_t attribute, int32_t* outValue) {
+ GET_HWC();
+
+ int32_t ret = hwc->getDisplayAttribute(display, config, attribute, outValue);
+
+ return ret;
+}
+
+int32_t getDisplayConfigs(
+ hwc2_device_t* device, hwc2_display_t display,
+ uint32_t* outNumConfigs, hwc2_config_t* outConfigs) {
+ GET_HWC();
+
+ int32_t ret = hwc->getDisplayConfigs(display, outNumConfigs, outConfigs);
+
+ return ret;
+}
+
+int32_t getDisplayName(
+ hwc2_device_t* device, hwc2_display_t display,
+ uint32_t* outSize, char* outName) {
+ GET_HWC();
+
+ int32_t ret = hwc->getDisplayName(display, outSize, outName);
+
+ return ret;
+}
+
+int32_t getDisplayRequests(
+ hwc2_device_t* device,
+ hwc2_display_t display,
+ int32_t* outDisplayRequests,
+ uint32_t* outNumElements,
+ hwc2_layer_t* outLayers,
+ int32_t* outLayerRequests) {
+ GET_HWC();
+
+ int32_t ret = hwc->getDisplayRequests(display, outDisplayRequests,
+ outNumElements, outLayers, outLayerRequests);
+
+ return ret;
+}
+
+int32_t getDisplayType(
+ hwc2_device_t* device, hwc2_display_t display,
+ int32_t* outType) {
+ GET_HWC();
+
+ int32_t ret = hwc->getDisplayType(display, outType);
+
+ return ret;
+}
+
+int32_t getDozeSupport(
+ hwc2_device_t* device, hwc2_display_t display,
+ int32_t* outSupport) {
+ GET_HWC();
+
+ int32_t ret = hwc->getDozeSupport(display, outSupport);
+
+ return ret;
+}
+
+int32_t getHdrCapabilities(
+ hwc2_device_t* device, hwc2_display_t display,
+ uint32_t* outNumTypes, int32_t* /*android_hdr_t*/ outTypes,
+ float* outMaxLuminance, float* outMaxAverageLuminance,
+ float* outMinLuminance) {
+ GET_HWC();
+
+ int32_t ret = hwc->getHdrCapabilities(display, outNumTypes, outTypes,
+ outMaxLuminance, outMaxAverageLuminance, outMinLuminance);
+
+ return ret;
+}
+
+int32_t getReleaseFences(
+ hwc2_device_t* device, hwc2_display_t display,
+ uint32_t* outNumElements, hwc2_layer_t* outLayers,
+ int32_t* outFences) {
+ GET_HWC();
+
+ int32_t ret = hwc->getReleaseFences(display, outNumElements, outLayers, outFences);
+
+ return ret;
+}
+
+int32_t presentDisplay(
+ hwc2_device_t* device, hwc2_display_t display,
+ int32_t* outRetireFence) {
+ GET_HWC();
+
+ int32_t ret = hwc->presentDisplay(display, outRetireFence);
+
+ return ret;
+}
+
+int32_t setActiveConfig(
+ hwc2_device_t* device,
+ hwc2_display_t display,
+ hwc2_config_t config) {
+ GET_HWC();
+
+ int32_t ret = hwc->setActiveConfig(display, config);
+
+ return ret;
+}
+
+int32_t setClientTarget(
+ hwc2_device_t* device, hwc2_display_t display,
+ buffer_handle_t target, int32_t acquireFence,
+ android_dataspace_t dataspace, hwc_region_t damage) {
+ GET_HWC();
+
+ int32_t ret = hwc->setClientTarget(display, target, acquireFence, dataspace, damage);
+
+ return ret;
+}
+
+int32_t setColorMode(
+ hwc2_device_t* device, hwc2_display_t display,
+ int32_t /*android_color_mode_t*/ mode) {
+ GET_HWC();
+
+ int32_t ret = hwc->setColorMode(display, mode);
+
+ return ret;
+}
+
+int32_t setColorTransform(
+ hwc2_device_t* device, hwc2_display_t display,
+ const float* matrix, int32_t /*android_color_transform_t*/ hint) {
+ GET_HWC();
+
+ int32_t ret = hwc->setColorTransform(display, matrix, hint);
+
+ return ret;
+}
+
+int32_t setOutputBuffer(
+ hwc2_device_t* device, hwc2_display_t display,
+ buffer_handle_t buffer, int32_t releaseFence) {
+ GET_HWC();
+
+ int32_t ret = hwc->setOutputBuffer(display, buffer, releaseFence);
+
+ return ret;
+}
+
+int32_t setPowerMode(
+ hwc2_device_t* device, hwc2_display_t display,
+ hwc2_power_mode_t mode) {
+ GET_HWC();
+
+ int32_t ret = hwc->setPowerMode(display, mode);
+
+ return ret;
+}
+
+int32_t setVsyncEnabled(
+ hwc2_device_t* device, hwc2_display_t display,
+ hwc2_vsync_t enabled) {
+ GET_HWC();
+
+ int32_t ret = hwc->setVsyncEnabled(display, enabled);
+
+ return ret;
+}
+
+int32_t validateDisplay(
+ hwc2_device_t* device, hwc2_display_t display,
+ uint32_t* outNumTypes, uint32_t* outNumRequests) {
+ GET_HWC();
+
+ int32_t ret = hwc->validateDisplay(display, outNumTypes, outNumRequests);
+
+ return ret;
+}
+
+int32_t setCursorPosition(
+ hwc2_device_t* device, hwc2_display_t display,
+ hwc2_layer_t layer, int32_t x, int32_t y) {
+ GET_HWC();
+
+ int32_t ret = hwc->setCursorPosition(display, layer, x, y);
+
+ return ret;
+}
+
+int32_t setLayerBuffer(
+ hwc2_device_t* device, hwc2_display_t display,
+ hwc2_layer_t layer, buffer_handle_t buffer,
+ int32_t acquireFence) {
+ GET_HWC();
+
+ int32_t ret = hwc->setLayerBuffer(display, layer, buffer, acquireFence);
+
+ return ret;
+}
+
+int32_t setLayerSurfaceDamage(
+ hwc2_device_t* device, hwc2_display_t display,
+ hwc2_layer_t layer, hwc_region_t damage) {
+ GET_HWC();
+
+ int32_t ret = hwc->setLayerSurfaceDamage(display, layer, damage);
+
+ return ret;
+}
+
+/*
+ * Layer State Functions
+ *
+ * These functions modify the state of a given layer. They do not take effect
+ * until the display configuration is successfully validated with
+ * validateDisplay and the display contents are presented with presentDisplay.
+ *
+ * All of these functions take as their first three parameters a device pointer,
+ * a display handle for the display which contains the layer, and a layer
+ * handle, so these parameters are omitted from the described parameter lists.
+ */
+
+int32_t setLayerBlendMode(
+ hwc2_device_t* device, hwc2_display_t display, hwc2_layer_t layer,
+ hwc2_blend_mode_t mode) {
+ GET_HWC();
+
+ int32_t ret = hwc->setLayerBlendMode(display, layer, mode);
+
+ return ret;
+}
+
+int32_t setLayerColor(
+ hwc2_device_t* device, hwc2_display_t display,
+ hwc2_layer_t layer, hwc_color_t color) {
+ GET_HWC();
+
+ int32_t ret = hwc->setLayerColor(display, layer, color);
+
+ return ret;
+}
+
+int32_t setLayerCompositionType(
+ hwc2_device_t* device, hwc2_display_t display,
+ hwc2_layer_t layer, hwc2_composition_t type) {
+ GET_HWC();
+
+ int32_t ret = hwc->setLayerCompositionType(display, layer, type);
+
+ return ret;
+}
+
+int32_t setLayerDataspace(
+ hwc2_device_t* device, hwc2_display_t display, hwc2_layer_t layer,
+ int32_t /*android_dataspace_t*/ dataspace) {
+ GET_HWC();
+
+ int32_t ret = hwc->setLayerDataspace(display, layer, dataspace);
+
+ return ret;
+}
+
+int32_t setLayerDisplayFrame(
+ hwc2_device_t* device, hwc2_display_t display,
+ hwc2_layer_t layer, hwc_rect_t frame) {
+ GET_HWC();
+
+ int32_t ret = hwc->setLayerDisplayFrame(display, layer, frame);
+
+ return ret;
+}
+
+int32_t setLayerPlaneAlpha(
+ hwc2_device_t* device, hwc2_display_t display,
+ hwc2_layer_t layer, float alpha) {
+ GET_HWC();
+
+ int32_t ret = hwc->setLayerPlaneAlpha(display, layer, alpha);
+
+ return ret;
+}
+
+int32_t setLayerSidebandStream(
+ hwc2_device_t* device, hwc2_display_t display,
+ hwc2_layer_t layer, const native_handle_t* stream) {
+ GET_HWC();
+
+ int32_t ret = hwc->setLayerSidebandStream(display, layer, stream);
+
+ return ret;
+}
+
+int32_t setLayerSourceCrop(
+ hwc2_device_t* device, hwc2_display_t display,
+ hwc2_layer_t layer, hwc_frect_t crop) {
+ GET_HWC();
+
+ int32_t ret = hwc->setLayerSourceCrop(display, layer, crop);
+
+ return ret;
+}
+
+int32_t setLayerTransform(
+ hwc2_device_t* device, hwc2_display_t display,
+ hwc2_layer_t layer, hwc_transform_t transform) {
+ GET_HWC();
+
+ int32_t ret = hwc->setLayerTransform(display, layer, transform);
+
+ return ret;
+}
+
+int32_t setLayerVisibleRegion(
+ hwc2_device_t* device, hwc2_display_t display,
+ hwc2_layer_t layer, hwc_region_t visible) {
+ GET_HWC();
+
+ int32_t ret = hwc->setLayerVisibleRegion(display, layer, visible);
+
+ return ret;
+}
+
+int32_t setLayerZOrder(
+ hwc2_device_t* device, hwc2_display_t display,
+ hwc2_layer_t layer, uint32_t z) {
+ GET_HWC();
+
+ int32_t ret = hwc->setLayerZOrder(display, layer, z);
+
+ return ret;
+}
+
+hwc2_function_pointer_t hwc2_getFunction(struct hwc2_device* device,
+ int32_t /*hwc2_function_descriptor_t*/ descriptor) {
+ GET_HWC_RETURN_NULL_IF_NULL();
+
+ switch (descriptor) {
+ // Device functions
+ case HWC2_FUNCTION_CREATE_VIRTUAL_DISPLAY:
+ return reinterpret_cast<hwc2_function_pointer_t>(createVirtualDisplay);
+ case HWC2_FUNCTION_DESTROY_VIRTUAL_DISPLAY:
+ return reinterpret_cast<hwc2_function_pointer_t>(destroyVirtualDisplay);
+ case HWC2_FUNCTION_DUMP:
+ return reinterpret_cast<hwc2_function_pointer_t>(dump);
+ case HWC2_FUNCTION_GET_MAX_VIRTUAL_DISPLAY_COUNT:
+ return reinterpret_cast<hwc2_function_pointer_t>(getMaxVirtualDisplayCount);
+ case HWC2_FUNCTION_REGISTER_CALLBACK:
+ return reinterpret_cast<hwc2_function_pointer_t>(registerCallback);
+
+ // Display functions
+ case HWC2_FUNCTION_ACCEPT_DISPLAY_CHANGES:
+ return reinterpret_cast<hwc2_function_pointer_t>(acceptDisplayChanges);
+ case HWC2_FUNCTION_CREATE_LAYER:
+ return reinterpret_cast<hwc2_function_pointer_t>(createLayer);
+ case HWC2_FUNCTION_DESTROY_LAYER:
+ return reinterpret_cast<hwc2_function_pointer_t>(destroyLayer);
+ case HWC2_FUNCTION_GET_ACTIVE_CONFIG:
+ return reinterpret_cast<hwc2_function_pointer_t>(getActiveConfig);
+ case HWC2_FUNCTION_GET_CHANGED_COMPOSITION_TYPES:
+ return reinterpret_cast<hwc2_function_pointer_t>(getChangedCompositionTypes);
+ case HWC2_FUNCTION_GET_COLOR_MODES:
+ return reinterpret_cast<hwc2_function_pointer_t>(getColorModes);
+ case HWC2_FUNCTION_GET_DISPLAY_ATTRIBUTE:
+ return reinterpret_cast<hwc2_function_pointer_t>(getDisplayAttribute);
+ case HWC2_FUNCTION_GET_DISPLAY_CONFIGS:
+ return reinterpret_cast<hwc2_function_pointer_t>(getDisplayConfigs);
+ case HWC2_FUNCTION_GET_DISPLAY_NAME:
+ return reinterpret_cast<hwc2_function_pointer_t>(getDisplayName);
+ case HWC2_FUNCTION_GET_DISPLAY_REQUESTS:
+ return reinterpret_cast<hwc2_function_pointer_t>(getDisplayRequests);
+ case HWC2_FUNCTION_GET_DISPLAY_TYPE:
+ return reinterpret_cast<hwc2_function_pointer_t>(getDisplayType);
+ case HWC2_FUNCTION_GET_DOZE_SUPPORT:
+ return reinterpret_cast<hwc2_function_pointer_t>(getDozeSupport);
+ case HWC2_FUNCTION_GET_HDR_CAPABILITIES:
+ return reinterpret_cast<hwc2_function_pointer_t>(getHdrCapabilities);
+ case HWC2_FUNCTION_GET_RELEASE_FENCES:
+ return reinterpret_cast<hwc2_function_pointer_t>(getReleaseFences);
+ case HWC2_FUNCTION_PRESENT_DISPLAY:
+ return reinterpret_cast<hwc2_function_pointer_t>(presentDisplay);
+ case HWC2_FUNCTION_SET_ACTIVE_CONFIG:
+ return reinterpret_cast<hwc2_function_pointer_t>(setActiveConfig);
+ case HWC2_FUNCTION_SET_CLIENT_TARGET:
+ return reinterpret_cast<hwc2_function_pointer_t>(setClientTarget);
+ case HWC2_FUNCTION_SET_COLOR_MODE:
+ return reinterpret_cast<hwc2_function_pointer_t>(setColorMode);
+ case HWC2_FUNCTION_SET_COLOR_TRANSFORM:
+ return reinterpret_cast<hwc2_function_pointer_t>(setColorTransform);
+ case HWC2_FUNCTION_SET_OUTPUT_BUFFER:
+ return reinterpret_cast<hwc2_function_pointer_t>(setOutputBuffer);
+ case HWC2_FUNCTION_SET_POWER_MODE:
+ return reinterpret_cast<hwc2_function_pointer_t>(setPowerMode);
+ case HWC2_FUNCTION_SET_VSYNC_ENABLED:
+ return reinterpret_cast<hwc2_function_pointer_t>(setVsyncEnabled);
+ case HWC2_FUNCTION_VALIDATE_DISPLAY:
+ return reinterpret_cast<hwc2_function_pointer_t>(validateDisplay);
+
+ // Layer functions
+ case HWC2_FUNCTION_SET_CURSOR_POSITION:
+ return reinterpret_cast<hwc2_function_pointer_t>(setCursorPosition);
+ case HWC2_FUNCTION_SET_LAYER_BUFFER:
+ return reinterpret_cast<hwc2_function_pointer_t>(setLayerBuffer);
+ case HWC2_FUNCTION_SET_LAYER_SURFACE_DAMAGE:
+ return reinterpret_cast<hwc2_function_pointer_t>(setLayerSurfaceDamage);
+
+ // Layer state functions
+ case HWC2_FUNCTION_SET_LAYER_BLEND_MODE:
+ return reinterpret_cast<hwc2_function_pointer_t>(setLayerBlendMode);
+ case HWC2_FUNCTION_SET_LAYER_COLOR:
+ return reinterpret_cast<hwc2_function_pointer_t>(setLayerColor);
+ case HWC2_FUNCTION_SET_LAYER_COMPOSITION_TYPE:
+ return reinterpret_cast<hwc2_function_pointer_t>(setLayerCompositionType);
+ case HWC2_FUNCTION_SET_LAYER_DATASPACE:
+ return reinterpret_cast<hwc2_function_pointer_t>(setLayerDataspace);
+ case HWC2_FUNCTION_SET_LAYER_DISPLAY_FRAME:
+ return reinterpret_cast<hwc2_function_pointer_t>(setLayerDisplayFrame);
+ case HWC2_FUNCTION_SET_LAYER_PLANE_ALPHA:
+ return reinterpret_cast<hwc2_function_pointer_t>(setLayerPlaneAlpha);
+ case HWC2_FUNCTION_SET_LAYER_SIDEBAND_STREAM:
+ return reinterpret_cast<hwc2_function_pointer_t>(setLayerSidebandStream);
+ case HWC2_FUNCTION_SET_LAYER_SOURCE_CROP:
+ return reinterpret_cast<hwc2_function_pointer_t>(setLayerSourceCrop);
+ case HWC2_FUNCTION_SET_LAYER_TRANSFORM:
+ return reinterpret_cast<hwc2_function_pointer_t>(setLayerTransform);
+ case HWC2_FUNCTION_SET_LAYER_VISIBLE_REGION:
+ return reinterpret_cast<hwc2_function_pointer_t>(setLayerVisibleRegion);
+ case HWC2_FUNCTION_SET_LAYER_Z_ORDER:
+ return reinterpret_cast<hwc2_function_pointer_t>(setLayerZOrder);
+ default:
+ ALOGE("getFunction: Unknown function descriptor: %d", descriptor);
+ return NULL;
+ }
+}
+
+void hwc2_getCapabilities(struct hwc2_device* device,
+ uint32_t* outCount,
+ int32_t* /*hwc2_capability_t*/ outCapabilities) {
+ GET_HWC_RETURN_VOID_IF_NULL();
+}
+
+//------------------------------------------------------------------------------
+
+static int hwc2_device_open(const struct hw_module_t* module,
+ const char* name,
+ struct hw_device_t** device)
+{
+ if (!name) {
+ ETRACE("invalid name.");
+ return -EINVAL;
+ }
+
+ ATRACE("open device %s", name);
+
+ if (strcmp(name, HWC_HARDWARE_COMPOSER) != 0) {
+ ETRACE("try to open unknown HWComposer %s", name);
+ return -EINVAL;
+ }
+
+ private_module_t *gralloc_module = NULL;
+ if (hw_get_module(GRALLOC_HARDWARE_MODULE_ID,
+ (const struct hw_module_t **)&gralloc_module)) {
+ ETRACE("failed to get gralloc hw module");
+ return -EINVAL;
+ }
+
+ Hwcomposer& hwc = Hwcomposer::getInstance();
+ // initialize our state here
+ if (hwc.initialize(gralloc_module) == false) {
+ ETRACE("failed to intialize HWComposer");
+ Hwcomposer::releaseInstance();
+ return -EINVAL;
+ }
+
+ // initialize the procs
+ hwc.hwc2_device_t::common.tag = HARDWARE_DEVICE_TAG;
+ hwc.hwc2_device_t::common.module =
+ const_cast<hw_module_t*>(module);
+ hwc.hwc2_device_t::common.close = hwc2_device_close;
+
+ hwc.hwc2_device_t::getFunction = hwc2_getFunction;
+ hwc.hwc2_device_t::getCapabilities = hwc2_getCapabilities;
+ hwc.hwc2_device_t::common.version = HWC_DEVICE_API_VERSION_2_0;
+ *device = &hwc.hwc2_device_t::common;
+
+ return 0;
+}
+
+} // namespace amlogic
+} // namespace android
+
+typedef struct hwc_module {
+ /**
+ * Common methods of the hardware composer module. This *must* be the first member of
+ * hwc_module as users of this structure will cast a hw_module_t to
+ * hwc_module pointer in contexts where it's known the hw_module_t references a
+ * hwc_module.
+ */
+ struct hw_module_t common;
+} hwc_module_t;
+
+static struct hw_module_methods_t hwc2_module_methods = {
+ .open = android::amlogic::hwc2_device_open
+};
+
+hwc_module_t HAL_MODULE_INFO_SYM = {
+ .common = {
+ .tag = HARDWARE_MODULE_TAG,
+ .version_major = 2,
+ .version_minor = 0,
+ .id = HWC_HARDWARE_MODULE_ID,
+ .name = "AML Hardware Composer",
+ .author = "aml",
+ .methods = &hwc2_module_methods,
+ .dso = NULL,
+ .reserved = {0},
+ }
+};
diff --git a/hwc2/common/base/Hwcomposer.cpp b/hwc2/common/base/Hwcomposer.cpp
new file mode 100644
index 0000000..ca8bcc9
--- a/dev/null
+++ b/hwc2/common/base/Hwcomposer.cpp
@@ -0,0 +1,992 @@
+/*
+// Copyright(c) 2016 Amlogic Corporation
+*/
+#include <HwcTrace.h>
+#include <Hwcomposer.h>
+#include <Dump.h>
+#include <UeventObserver.h>
+
+namespace android {
+namespace amlogic {
+
+Hwcomposer* Hwcomposer::sInstance(0);
+
+Hwcomposer::Hwcomposer(IPlatFactory *factory)
+ : mPlatFactory(factory),
+ mVsyncManager(0),
+ mInitialized(false)
+{
+ CTRACE();
+
+ mDisplayDevices.setCapacity(IDisplayDevice::DEVICE_COUNT);
+ mDisplayDevices.clear();
+}
+
+Hwcomposer::~Hwcomposer()
+{
+ CTRACE();
+ deinitialize();
+}
+
+bool Hwcomposer::initCheck() const {
+ return mInitialized;
+}
+
+int32_t Hwcomposer::createVirtualDisplay(
+ uint32_t width,
+ uint32_t height,
+ int32_t* /*android_pixel_format_t*/ format,
+ hwc2_display_t* outDisplay) {
+ DTRACE("createVirtualDisplay");
+ if (width > 1920 && height > 1080) {
+ return HWC2_ERROR_UNSUPPORTED;
+ }
+
+ IDisplayDevice *device = getDisplayDevice(HWC_DISPLAY_VIRTUAL);
+ if (!device) {
+ ETRACE("no device found");
+ return HWC2_ERROR_BAD_DISPLAY;
+ }
+
+ return device->createVirtualDisplay(width, height, format, outDisplay);
+}
+
+int32_t Hwcomposer::destroyVirtualDisplay(
+ hwc2_display_t display) {
+ DTRACE("destroyVirtualDisplay: %d", (int32_t)display);
+ IDisplayDevice *device = getDisplayDevice(HWC_DISPLAY_VIRTUAL);
+ if (!device) {
+ ETRACE("no device found");
+ return HWC2_ERROR_BAD_DISPLAY;
+ }
+
+ return device->destroyVirtualDisplay(display);
+
+ return HWC2_ERROR_NONE;
+}
+
+void Hwcomposer::dump(
+ uint32_t* outSize,
+ char* outBuffer) {
+ RETURN_VOID_IF_NOT_INIT();
+
+ if (NULL == outBuffer) {
+ *outSize = 4096;
+ } else {
+ Dump d(outBuffer, *outSize);
+
+ // dump composer status
+ d.append("Hardware Composer state(version: %08x):\n",
+ this->common.version & HARDWARE_API_VERSION_2_MAJ_MIN_MASK);
+ // dump device status
+ for (size_t i= 0; i < mDisplayDevices.size(); i++) {
+ IDisplayDevice *device = mDisplayDevices.itemAt(i);
+ if (device)
+ device->dump(d);
+ }
+ }
+}
+
+uint32_t Hwcomposer::getMaxVirtualDisplayCount() {
+
+ // TODO: we only support 1 virtual display now.
+ return 1;
+}
+
+int32_t Hwcomposer::registerCallback(
+ int32_t /*hwc2_callback_descriptor_t*/ descriptor,
+ hwc2_callback_data_t callbackData,
+ hwc2_function_pointer_t pointer) {
+ switch (descriptor) {
+ // callback functions
+ case HWC2_CALLBACK_HOTPLUG:
+ hotplug_cb_data = callbackData;
+ pfnHotplug = reinterpret_cast<HWC2_PFN_HOTPLUG>(pointer);
+ if (pfnHotplug) {
+ DTRACE("First primary hotplug, just for now!!");
+ IDisplayDevice *device = getDisplayDevice(HWC_DISPLAY_PRIMARY);
+ if (!device) {
+ ETRACE("no device found");
+ }
+ device->updateDisplayConfigs();
+ pfnHotplug(hotplug_cb_data, HWC_DISPLAY_PRIMARY, 1);
+ }
+ break;
+ case HWC2_CALLBACK_REFRESH:
+ refresh_cb_data = callbackData;
+ pfnRefresh = reinterpret_cast<HWC2_PFN_REFRESH>(pointer);;
+ break;
+ case HWC2_CALLBACK_VSYNC:
+ vsync_cb_data = callbackData;
+ pfnVsync = reinterpret_cast<HWC2_PFN_VSYNC>(pointer);;
+ break;
+ case HWC2_CALLBACK_INVALID:
+ default:
+ ETRACE("registerCallback bad parameter: %d", descriptor);
+ return HWC2_ERROR_BAD_PARAMETER;
+ }
+
+ return HWC2_ERROR_NONE;
+}
+
+int32_t Hwcomposer::acceptDisplayChanges(
+ hwc2_display_t display) {
+ DTRACE("acceptDisplayChanges disp = %d", (int32_t)display);
+
+ IDisplayDevice *device = getDisplayDevice((int32_t)display);
+ if (!device) {
+ ETRACE("no device found");
+ return HWC2_ERROR_BAD_DISPLAY;
+ }
+
+ return device->acceptDisplayChanges();
+}
+
+int32_t Hwcomposer::createLayer(
+ hwc2_display_t display,
+ hwc2_layer_t* outLayer) {
+ DTRACE("createLayer disp = %d", (int32_t)display);
+
+ IDisplayDevice *device = getDisplayDevice((int32_t)display);
+ if (!device) {
+ ETRACE("no device found");
+ return HWC2_ERROR_BAD_DISPLAY;
+ }
+
+ bool ret = device->createLayer(outLayer);
+ if (ret == false) {
+ ETRACE("createLayer failed on display = %d", (int32_t)display);
+ return HWC2_ERROR_NO_RESOURCES;
+ }
+
+ return HWC2_ERROR_NONE;
+}
+
+int32_t Hwcomposer::destroyLayer(
+ hwc2_display_t display,
+ hwc2_layer_t layer) {
+ DTRACE("destroyLayer disp = %d, layer = %llu", (int32_t)display, layer);
+
+ IDisplayDevice *device = getDisplayDevice((int32_t)display);
+ if (!device) {
+ ETRACE("no device found");
+ return HWC2_ERROR_BAD_DISPLAY;
+ }
+
+ bool ret = device->destroyLayer(layer);
+ if (ret == false) {
+ ETRACE("destroyLayer failed on display = %d", (int32_t)display);
+ return HWC2_ERROR_BAD_LAYER;
+ }
+
+ return HWC2_ERROR_NONE;
+}
+
+int32_t Hwcomposer::getActiveConfig(
+ hwc2_display_t display,
+ hwc2_config_t* outConfig) {
+ DTRACE("getActiveConfig disp = %d", (int32_t)display);
+
+ IDisplayDevice *device = getDisplayDevice((int32_t)display);
+ if (!device) {
+ ETRACE("no device found");
+ return HWC2_ERROR_BAD_DISPLAY;
+ }
+
+ return device->getActiveConfig(outConfig);
+}
+
+int32_t Hwcomposer::getChangedCompositionTypes(
+ hwc2_display_t display,
+ uint32_t* outNumElements,
+ hwc2_layer_t* outLayers,
+ int32_t* /*hwc2_composition_t*/ outTypes) {
+ DTRACE("getChangedCompositionTypes disp = %d", (int32_t)display);
+
+ IDisplayDevice *device = getDisplayDevice((int32_t)display);
+ if (!device) {
+ ETRACE("no device found");
+ return HWC2_ERROR_BAD_DISPLAY;
+ }
+
+ return device->getChangedCompositionTypes(outNumElements, outLayers, outTypes);
+}
+
+int32_t Hwcomposer::getClientTargetSupport(
+ hwc2_display_t display,
+ uint32_t width,
+ uint32_t height,
+ int32_t /*android_pixel_format_t*/ format,
+ int32_t /*android_dataspace_t*/ dataspace) {
+ DTRACE("getClientTargetSupport disp = %d", (int32_t)display);
+
+ IDisplayDevice *device = getDisplayDevice((int32_t)display);
+ if (!device) {
+ ETRACE("no device found");
+ return HWC2_ERROR_BAD_DISPLAY;
+ }
+
+ return device->getClientTargetSupport(width, height, format, dataspace);
+}
+
+int32_t Hwcomposer::getColorModes(
+ hwc2_display_t display,
+ uint32_t* outNumModes,
+ int32_t* /*android_color_mode_t*/ outModes) {
+ DTRACE("getColorModes disp = %d", (int32_t)display);
+
+ IDisplayDevice *device = getDisplayDevice((int32_t)display);
+ if (!device) {
+ ETRACE("no device found");
+ return HWC2_ERROR_BAD_DISPLAY;
+ }
+
+ return device->getColorModes(outNumModes, outModes);
+}
+
+int32_t Hwcomposer::getDisplayAttribute(
+ hwc2_display_t display,
+ hwc2_config_t config,
+ int32_t /*hwc2_attribute_t*/ attribute,
+ int32_t* outValue) {
+ DTRACE("getDisplayAttribute disp = %d", (int32_t)display);
+
+ IDisplayDevice *device = getDisplayDevice((int32_t)display);
+ if (!device) {
+ ETRACE("no device found");
+ return HWC2_ERROR_BAD_DISPLAY;
+ }
+
+ return device->getDisplayAttribute(config, attribute, outValue);
+}
+
+int32_t Hwcomposer::getDisplayConfigs(
+ hwc2_display_t display,
+ uint32_t* outNumConfigs,
+ hwc2_config_t* outConfigs) {
+ DTRACE("getDisplayConfigs disp = %d", (int32_t)display);
+
+ IDisplayDevice *device = getDisplayDevice((int32_t)display);
+ if (!device) {
+ ETRACE("no device found");
+ return HWC2_ERROR_BAD_DISPLAY;
+ }
+
+ return device->getDisplayConfigs(outNumConfigs, outConfigs);
+}
+
+int32_t Hwcomposer::getDisplayName(
+ hwc2_display_t display,
+ uint32_t* outSize,
+ char* outName) {
+ DTRACE("getDisplayName disp = %d", (int32_t)display);
+
+ IDisplayDevice *device = getDisplayDevice((int32_t)display);
+ if (!device) {
+ ETRACE("no device found");
+ return HWC2_ERROR_BAD_DISPLAY;
+ }
+
+ return device->getDisplayName(outSize, outName);
+}
+
+int32_t Hwcomposer::getDisplayRequests(
+ hwc2_display_t display,
+ int32_t* /*hwc2_display_request_t*/ outDisplayRequests,
+ uint32_t* outNumElements,
+ hwc2_layer_t* outLayers,
+ int32_t* /*hwc2_layer_request_t*/ outLayerRequests) {
+ DTRACE("getDisplayRequests disp = %d", (int32_t)display);
+
+ IDisplayDevice *device = getDisplayDevice((int32_t)display);
+ if (!device) {
+ ETRACE("no device found");
+ return HWC2_ERROR_BAD_DISPLAY;
+ }
+
+ return device->getDisplayRequests(outDisplayRequests, outNumElements,
+ outLayers, outLayerRequests);
+}
+
+int32_t Hwcomposer::getDisplayType(
+ hwc2_display_t display,
+ int32_t* /*hwc2_display_type_t*/ outType) {
+ DTRACE("getDisplayType disp = %d", (int32_t)display);
+
+ IDisplayDevice *device = getDisplayDevice((int32_t)display);
+ if (!device) {
+ ETRACE("no device found");
+ return HWC2_ERROR_BAD_DISPLAY;
+ }
+
+ return device->getDisplayType(outType);
+}
+
+int32_t Hwcomposer::getDozeSupport(
+ hwc2_display_t display,
+ int32_t* outSupport) {
+ DTRACE("getDozeSupport disp = %d", (int32_t)display);
+
+ IDisplayDevice *device = getDisplayDevice((int32_t)display);
+ if (!device) {
+ ETRACE("no device found");
+ return HWC2_ERROR_BAD_DISPLAY;
+ }
+
+ return device->getDozeSupport(outSupport);
+}
+
+int32_t Hwcomposer::getHdrCapabilities(
+ hwc2_display_t display,
+ uint32_t* outNumTypes,
+ int32_t* /*android_hdr_t*/ outTypes,
+ float* outMaxLuminance,
+ float* outMaxAverageLuminance,
+ float* outMinLuminance) {
+ DTRACE("getHdrCapabilities disp = %d", (int32_t)display);
+
+ IDisplayDevice *device = getDisplayDevice((int32_t)display);
+ if (!device) {
+ ETRACE("no device found");
+ return HWC2_ERROR_BAD_DISPLAY;
+ }
+
+ return device->getHdrCapabilities(outNumTypes, outTypes, outMaxLuminance,
+ outMaxAverageLuminance, outMinLuminance);
+}
+
+int32_t Hwcomposer::getReleaseFences(
+ hwc2_display_t display,
+ uint32_t* outNumElements,
+ hwc2_layer_t* outLayers,
+ int32_t* outFences) {
+ DTRACE("getReleaseFences disp = %d", (int32_t)display);
+
+ IDisplayDevice *device = getDisplayDevice((int32_t)display);
+ if (!device) {
+ ETRACE("no device found");
+ return HWC2_ERROR_BAD_DISPLAY;
+ }
+
+ return device->getReleaseFences(outNumElements, outLayers, outFences);
+}
+
+int32_t Hwcomposer::presentDisplay(
+ hwc2_display_t display,
+ int32_t* outRetireFence) {
+ DTRACE("presentDisplay disp = %d", (int32_t)display);
+
+ IDisplayDevice *device = getDisplayDevice((int32_t)display);
+ if (!device) {
+ ETRACE("no device found");
+ return HWC2_ERROR_BAD_DISPLAY;
+ }
+
+ return device->presentDisplay(outRetireFence);
+}
+
+int32_t Hwcomposer::setActiveConfig(
+ hwc2_display_t display,
+ hwc2_config_t config) {
+ DTRACE("setActiveConfig disp = %d", (int32_t)display);
+
+ IDisplayDevice *device = getDisplayDevice((int32_t)display);
+ if (!device) {
+ ETRACE("no device found");
+ return HWC2_ERROR_BAD_DISPLAY;
+ }
+
+ return device->setActiveConfig(config);
+}
+
+int32_t Hwcomposer::setClientTarget(
+ hwc2_display_t display,
+ buffer_handle_t target,
+ int32_t acquireFence,
+ int32_t /*android_dataspace_t*/ dataspace,
+ hwc_region_t damage) {
+ DTRACE("setClientTarget disp = %d", (int32_t)display);
+
+ IDisplayDevice *device = getDisplayDevice((int32_t)display);
+ if (!device) {
+ ETRACE("no device found");
+ return HWC2_ERROR_BAD_DISPLAY;
+ }
+
+ return device->setClientTarget(target, acquireFence,
+ dataspace, damage);
+}
+
+int32_t Hwcomposer::setColorMode(
+ hwc2_display_t display,
+ int32_t /*android_color_mode_t*/ mode) {
+ DTRACE("setColorMode disp = %d", (int32_t)display);
+
+ IDisplayDevice *device = getDisplayDevice((int32_t)display);
+ if (!device) {
+ ETRACE("no device found");
+ return HWC2_ERROR_BAD_DISPLAY;
+ }
+
+ return device->setColorMode(mode);
+}
+
+int32_t Hwcomposer::setColorTransform(
+ hwc2_display_t display,
+ const float* matrix,
+ int32_t /*android_color_transform_t*/ hint) {
+ DTRACE("setColorTransform disp = %d", (int32_t)display);
+
+ IDisplayDevice *device = getDisplayDevice((int32_t)display);
+ if (!device) {
+ ETRACE("no device found");
+ return HWC2_ERROR_BAD_DISPLAY;
+ }
+
+ return device->setColorTransform(matrix, hint);
+}
+
+int32_t Hwcomposer::setOutputBuffer(
+ hwc2_display_t display,
+ buffer_handle_t buffer,
+ int32_t releaseFence) {
+ DTRACE("setOutputBuffer disp = %d", (int32_t)display);
+ if (display != HWC_DISPLAY_VIRTUAL) {
+ ETRACE("Should be a virtual display: %d", (int32_t)display);
+ return HWC2_ERROR_UNSUPPORTED;
+ }
+
+ IDisplayDevice *device = getDisplayDevice((int32_t)display);
+ if (!device) {
+ ETRACE("no device found");
+ return HWC2_ERROR_BAD_DISPLAY;
+ }
+
+ return device->setOutputBuffer(buffer, releaseFence);
+}
+
+int32_t Hwcomposer::setPowerMode(
+ hwc2_display_t display,
+ int32_t /*hwc2_power_mode_t*/ mode) {
+ DTRACE("setPowerMode disp = %d", (int32_t)display);
+
+ IDisplayDevice *device = getDisplayDevice((int32_t)display);
+ if (!device) {
+ ETRACE("no device found");
+ return HWC2_ERROR_BAD_DISPLAY;
+ }
+
+ return device->setPowerMode(mode);
+}
+
+int32_t Hwcomposer::setVsyncEnabled(
+ hwc2_display_t display,
+ int32_t /*hwc2_vsync_t*/ enabled) {
+ DTRACE("disp = %d, enabled = %d", (int32_t)display, enabled);
+
+ bool vsync_enable = false;
+ switch (enabled) {
+ case HWC2_VSYNC_ENABLE:
+ vsync_enable = true;
+ break;
+ case HWC2_VSYNC_DISABLE:
+ vsync_enable = false;
+ break;
+ case HWC2_VSYNC_INVALID:
+ default:
+ ETRACE("setVsyncEnabled bad parameter: %d", enabled);
+ return HWC2_ERROR_BAD_PARAMETER;
+ }
+
+ return mVsyncManager->handleVsyncControl((int32_t)display, vsync_enable);
+}
+
+int32_t Hwcomposer::validateDisplay(
+ hwc2_display_t display,
+ uint32_t* outNumTypes,
+ uint32_t* outNumRequests) {
+ DTRACE("validateDisplay disp = %d", (int32_t)display);
+
+ IDisplayDevice *device = getDisplayDevice((int32_t)display);
+ if (!device) {
+ ETRACE("no device found");
+ return HWC2_ERROR_BAD_DISPLAY;
+ }
+
+ return device->validateDisplay(outNumTypes, outNumRequests);
+}
+
+int32_t Hwcomposer::setCursorPosition(
+ hwc2_display_t display,
+ hwc2_layer_t layer,
+ int32_t x,
+ int32_t y) {
+ DTRACE("setCursorPosition disp = %d", (int32_t)display);
+
+ IDisplayDevice *device = getDisplayDevice((int32_t)display);
+ if (!device) {
+ ETRACE("no device found");
+ return HWC2_ERROR_BAD_DISPLAY;
+ }
+
+ return device->setCursorPosition(layer, x, y);
+}
+
+int32_t Hwcomposer::setLayerBuffer(
+ hwc2_display_t display,
+ hwc2_layer_t layer,
+ buffer_handle_t buffer,
+ int32_t acquireFence) {
+ HwcLayer* hwcLayer = NULL;
+ int32_t err = HWC2_ERROR_NONE;
+ DTRACE("setLayerBuffer disp = %d", (int32_t)display);
+
+ IDisplayDevice *device = getDisplayDevice((int32_t)display);
+ if (!device) {
+ ETRACE("no device found");
+ return HWC2_ERROR_BAD_DISPLAY;
+ }
+
+ hwcLayer = device->getLayerById(layer);
+ if (hwcLayer) {
+ err = hwcLayer->setBuffer(buffer,acquireFence);
+ } else {
+ ETRACE("bad layer.");
+ return HWC2_ERROR_BAD_LAYER;
+ }
+
+ return err;
+}
+
+int32_t Hwcomposer::setLayerSurfaceDamage(
+ hwc2_display_t display,
+ hwc2_layer_t layer,
+ hwc_region_t damage) {
+ HwcLayer* hwcLayer = NULL;
+ int32_t err = HWC2_ERROR_NONE;
+ DTRACE("setLayerSurfaceDamage disp = %d", (int32_t)display);
+
+ IDisplayDevice *device = getDisplayDevice((int32_t)display);
+ if (!device) {
+ ETRACE("no device found");
+ return HWC2_ERROR_BAD_DISPLAY;
+ }
+
+ hwcLayer = device->getLayerById(layer);
+ if (hwcLayer) {
+ err = hwcLayer->setSurfaceDamage(damage);
+ } else {
+ ETRACE("bad layer.");
+ return HWC2_ERROR_BAD_LAYER;
+ }
+
+ return err;
+}
+
+int32_t Hwcomposer::setLayerBlendMode(
+ hwc2_display_t display,
+ hwc2_layer_t layer,
+ int32_t /*hwc2_blend_mode_t*/ mode) {
+ HwcLayer* hwcLayer = NULL;
+ int32_t err = HWC2_ERROR_NONE;
+ DTRACE("setLayerBlendMode disp = %d", (int32_t)display);
+
+ IDisplayDevice *device = getDisplayDevice((int32_t)display);
+ if (!device) {
+ ETRACE("no device found");
+ return HWC2_ERROR_BAD_DISPLAY;
+ }
+
+ hwcLayer = device->getLayerById(layer);
+ if (hwcLayer) {
+ err = hwcLayer->setBlendMode(mode);
+ } else {
+ ETRACE("bad layer.");
+ return HWC2_ERROR_BAD_LAYER;
+ }
+
+ return err;
+}
+
+int32_t Hwcomposer::setLayerColor(
+ hwc2_display_t display,
+ hwc2_layer_t layer,
+ hwc_color_t color) {
+ HwcLayer* hwcLayer = NULL;
+ int32_t err = HWC2_ERROR_NONE;
+ DTRACE("setLayerColor disp = %d", (int32_t)display);
+
+ IDisplayDevice *device = getDisplayDevice((int32_t)display);
+ if (!device) {
+ ETRACE("no device found");
+ return HWC2_ERROR_BAD_DISPLAY;
+ }
+
+ hwcLayer = device->getLayerById(layer);
+ if (hwcLayer) {
+ err = hwcLayer->setColor(color);
+ } else {
+ ETRACE("bad layer.");
+ return HWC2_ERROR_BAD_LAYER;
+ }
+
+ return err;
+}
+
+int32_t Hwcomposer::setLayerCompositionType(
+ hwc2_display_t display,
+ hwc2_layer_t layer,
+ int32_t /*hwc2_composition_t*/ type) {
+ HwcLayer* hwcLayer = NULL;
+ int32_t err = HWC2_ERROR_NONE;
+ DTRACE("setLayerCompositionType disp = %d", (int32_t)display);
+
+ IDisplayDevice *device = getDisplayDevice((int32_t)display);
+ if (!device) {
+ ETRACE("no device found");
+ return HWC2_ERROR_BAD_DISPLAY;
+ }
+
+ hwcLayer = device->getLayerById(layer);
+ if (hwcLayer) {
+ err = hwcLayer->setCompositionType(type);
+ } else {
+ ETRACE("bad layer.");
+ return HWC2_ERROR_BAD_LAYER;
+ }
+
+ return err;
+}
+
+int32_t Hwcomposer::setLayerDataspace(
+ hwc2_display_t display,
+ hwc2_layer_t layer,
+ int32_t /*android_dataspace_t*/ dataspace) {
+ HwcLayer* hwcLayer = NULL;
+ int32_t err = HWC2_ERROR_NONE;
+ DTRACE("setLayerDataspace disp = %d", (int32_t)display);
+
+ IDisplayDevice *device = getDisplayDevice((int32_t)display);
+ if (!device) {
+ ETRACE("no device found");
+ return HWC2_ERROR_BAD_DISPLAY;
+ }
+
+ hwcLayer = device->getLayerById(layer);
+ if (hwcLayer) {
+ err = hwcLayer->setDataspace(dataspace);
+ } else {
+ ETRACE("bad layer.");
+ return HWC2_ERROR_BAD_LAYER;
+ }
+
+ return err;
+}
+
+int32_t Hwcomposer::setLayerDisplayFrame(
+ hwc2_display_t display,
+ hwc2_layer_t layer,
+ hwc_rect_t frame) {
+ HwcLayer* hwcLayer = NULL;
+ int32_t err = HWC2_ERROR_NONE;
+ DTRACE("setLayerDisplayFrame disp = %d", (int32_t)display);
+
+ IDisplayDevice *device = getDisplayDevice((int32_t)display);
+ if (!device) {
+ ETRACE("no device found");
+ return HWC2_ERROR_BAD_DISPLAY;
+ }
+
+ hwcLayer = device->getLayerById(layer);
+ if (hwcLayer) {
+ err = hwcLayer->setDisplayFrame(frame);
+ } else {
+ ETRACE("bad layer.");
+ return HWC2_ERROR_BAD_LAYER;
+ }
+
+ return err;
+}
+
+int32_t Hwcomposer::setLayerPlaneAlpha(
+ hwc2_display_t display,
+ hwc2_layer_t layer,
+ float alpha) {
+ HwcLayer* hwcLayer = NULL;
+ int32_t err = HWC2_ERROR_NONE;
+ DTRACE("setLayerPlaneAlpha disp = %d", (int32_t)display);
+
+ IDisplayDevice *device = getDisplayDevice((int32_t)display);
+ if (!device) {
+ ETRACE("no device found");
+ return HWC2_ERROR_BAD_DISPLAY;
+ }
+
+ hwcLayer = device->getLayerById(layer);
+ if (hwcLayer) {
+ err = hwcLayer->setPlaneAlpha(alpha);
+ } else {
+ ETRACE("bad layer.");
+ return HWC2_ERROR_BAD_LAYER;
+ }
+
+ return err;
+}
+
+int32_t Hwcomposer::setLayerSidebandStream(
+ hwc2_display_t display,
+ hwc2_layer_t layer,
+ const native_handle_t* stream) {
+ HwcLayer* hwcLayer = NULL;
+ int32_t err = HWC2_ERROR_NONE;
+ DTRACE("setLayerSidebandStream disp = %d", (int32_t)display);
+
+ IDisplayDevice *device = getDisplayDevice((int32_t)display);
+ if (!device) {
+ ETRACE("no device found");
+ return HWC2_ERROR_BAD_DISPLAY;
+ }
+
+ hwcLayer = device->getLayerById(layer);
+ if (hwcLayer) {
+ err = hwcLayer->setSidebandStream(stream);
+ } else {
+ ETRACE("bad layer.");
+ return HWC2_ERROR_BAD_LAYER;
+ }
+
+ return err;
+}
+
+int32_t Hwcomposer::setLayerSourceCrop(
+ hwc2_display_t display,
+ hwc2_layer_t layer,
+ hwc_frect_t crop) {
+ HwcLayer* hwcLayer = NULL;
+ int32_t err = HWC2_ERROR_NONE;
+ DTRACE("setLayerSourceCrop disp = %d", (int32_t)display);
+
+ IDisplayDevice *device = getDisplayDevice((int32_t)display);
+ if (!device) {
+ ETRACE("no device found");
+ return HWC2_ERROR_BAD_DISPLAY;
+ }
+
+ hwcLayer = device->getLayerById(layer);
+ if (hwcLayer) {
+ err = hwcLayer->setSourceCrop(crop);
+ } else {
+ ETRACE("bad layer.");
+ return HWC2_ERROR_BAD_LAYER;
+ }
+
+ return err;
+}
+
+int32_t Hwcomposer::setLayerTransform(
+ hwc2_display_t display,
+ hwc2_layer_t layer,
+ int32_t /*hwc_transform_t*/ transform) {
+ HwcLayer* hwcLayer = NULL;
+ int32_t err = HWC2_ERROR_NONE;
+ DTRACE("setLayerTransform disp = %d", (int32_t)display);
+
+ IDisplayDevice *device = getDisplayDevice((int32_t)display);
+ if (!device) {
+ ETRACE("no device found");
+ return HWC2_ERROR_BAD_DISPLAY;
+ }
+
+ hwcLayer = device->getLayerById(layer);
+ if (hwcLayer) {
+ err = hwcLayer->setTransform(transform);
+ } else {
+ ETRACE("bad layer.");
+ return HWC2_ERROR_BAD_LAYER;
+ }
+
+ return err;
+}
+
+int32_t Hwcomposer::setLayerVisibleRegion(
+ hwc2_display_t display,
+ hwc2_layer_t layer,
+ hwc_region_t visible) {
+ HwcLayer* hwcLayer = NULL;
+ int32_t err = HWC2_ERROR_NONE;
+ DTRACE("setLayerVisibleRegion disp = %d", (int32_t)display);
+
+ IDisplayDevice *device = getDisplayDevice((int32_t)display);
+ if (!device) {
+ ETRACE("no device found");
+ return HWC2_ERROR_BAD_DISPLAY;
+ }
+
+ hwcLayer = device->getLayerById(layer);
+ if (hwcLayer) {
+ err = hwcLayer->setVisibleRegion(visible);
+ } else {
+ ETRACE("bad layer.");
+ return HWC2_ERROR_BAD_LAYER;
+ }
+
+ return err;
+}
+
+int32_t Hwcomposer::setLayerZOrder(
+ hwc2_display_t display,
+ hwc2_layer_t layer,
+ uint32_t z) {
+ HwcLayer* hwcLayer = NULL;
+ int32_t err = HWC2_ERROR_NONE;
+ DTRACE("setLayerZOrder disp = %d", (int32_t)display);
+
+ IDisplayDevice *device = getDisplayDevice((int32_t)display);
+ if (!device) {
+ ETRACE("no device found");
+ return HWC2_ERROR_BAD_DISPLAY;
+ }
+
+ hwcLayer = device->getLayerById(layer);
+ if (hwcLayer) {
+ err = hwcLayer->setZ(z);
+ } else {
+ ETRACE("bad layer.");
+ return HWC2_ERROR_BAD_LAYER;
+ }
+
+ return err;
+}
+
+template <typename T>
+static hwc2_function_pointer_t asFP(T function)
+{
+ return reinterpret_cast<hwc2_function_pointer_t>(function);
+}
+
+void Hwcomposer::vsync(int disp, int64_t timestamp) {
+ RETURN_VOID_IF_NOT_INIT();
+
+ if (pfnVsync) {
+ VTRACE("report vsync on disp %d, timestamp %llu", disp, timestamp);
+ // workaround to pretend vsync is from primary display
+ // Display will freeze if vsync is from external display.
+ pfnVsync(vsync_cb_data, IDisplayDevice::DEVICE_PRIMARY, timestamp);
+ }
+}
+
+void Hwcomposer::hotplug(int disp, bool connected) {
+ RETURN_VOID_IF_NOT_INIT();
+
+ int32_t cnet = HWC2_CONNECTION_INVALID;
+ if (connected)
+ cnet = HWC2_CONNECTION_CONNECTED;
+ else
+ cnet = HWC2_CONNECTION_DISCONNECTED;
+
+ if (pfnHotplug) {
+ DTRACE("report hotplug on disp %d, connected %d", disp, cnet);
+ pfnHotplug(hotplug_cb_data, disp, cnet);
+ DTRACE("hotplug callback processed and returned!");
+ }
+
+ // mDisplayAnalyzer->postHotplugEvent(connected);
+}
+
+void Hwcomposer::refresh(int disp) {
+ RETURN_VOID_IF_NOT_INIT();
+
+ if (pfnRefresh) {
+ DTRACE("refresh screen...");
+ pfnRefresh(refresh_cb_data, disp);
+ }
+}
+
+bool Hwcomposer::release() {
+ RETURN_FALSE_IF_NOT_INIT();
+
+ return true;
+}
+
+bool Hwcomposer::initialize(private_module_t *grallocModule) {
+ CTRACE();
+
+ if (!mPlatFactory || !grallocModule) {
+ DEINIT_AND_RETURN_FALSE("failed to provide a PlatFactory");
+ }
+
+ // initial gralloc module.
+ mGrallocModule = grallocModule;
+
+ mUeventObserver = new UeventObserver();
+ if (!mUeventObserver || !mUeventObserver->initialize()) {
+ DEINIT_AND_RETURN_FALSE("failed to initialize uevent observer");
+ }
+
+ // create display device
+ mDisplayDevices.clear();
+ for (int i = 0; i < IDisplayDevice::DEVICE_COUNT; i++) {
+ IDisplayDevice *device = mPlatFactory->createDisplayDevice(i);
+ if (!device || !device->initialize()) {
+ DEINIT_AND_DELETE_OBJ(device);
+ ETRACE("failed to create device %d", i);
+ }
+ // add this device
+ DTRACE("HWC devices initialize device is %p at %d", device, i);
+ mDisplayDevices.insertAt(device, i, 1);
+ }
+
+ mVsyncManager = new VsyncManager(*this);
+ if (!mVsyncManager || !mVsyncManager->initialize()) {
+ DEINIT_AND_RETURN_FALSE("failed to create Vsync Manager");
+ }
+
+ // all initialized, starting uevent observer
+ mUeventObserver->start();
+
+ mInitialized = true;
+ return true;
+}
+
+void Hwcomposer::deinitialize() {
+ // delete mVsyncManager first as it holds reference to display devices.
+ DEINIT_AND_DELETE_OBJ(mVsyncManager);
+
+ // destroy display devices
+ for (size_t i = 0; i < mDisplayDevices.size(); i++) {
+ IDisplayDevice *device = mDisplayDevices.itemAt(i);
+ DEINIT_AND_DELETE_OBJ(device);
+ }
+ mDisplayDevices.clear();
+
+ if (mPlatFactory) {
+ delete mPlatFactory;
+ mPlatFactory = 0;
+ }
+
+ mInitialized = false;
+}
+
+IDisplayDevice* Hwcomposer::getDisplayDevice(int disp) {
+ if (disp < 0 || disp >= IDisplayDevice::DEVICE_COUNT) {
+ ETRACE("invalid disp %d", disp);
+ return NULL;
+ }
+ return mDisplayDevices.itemAt(disp);
+}
+
+VsyncManager* Hwcomposer::getVsyncManager() {
+ return mVsyncManager;
+}
+
+UeventObserver* Hwcomposer::getUeventObserver()
+{
+ return mUeventObserver;
+}
+
+private_module_t* Hwcomposer::getGrallocModule() {
+ return mGrallocModule;
+}
+
+} // namespace amlogic
+} // namespace android
diff --git a/hwc2/common/base/SimpleThread.h b/hwc2/common/base/SimpleThread.h
new file mode 100644
index 0000000..8842c21
--- a/dev/null
+++ b/hwc2/common/base/SimpleThread.h
@@ -0,0 +1,25 @@
+/*
+// Copyright(c) 2016 Amlogic Corporation
+*/
+#ifndef SIMPLE_THREAD_H
+#define SIMPLE_THREAD_H
+
+#include <utils/threads.h>
+
+#define DECLARE_THREAD(THREADNAME, THREADOWNER) \
+ class THREADNAME: public Thread { \
+ public: \
+ THREADNAME(THREADOWNER *owner) { mOwner = owner; } \
+ THREADNAME() { mOwner = NULL; } \
+ private: \
+ virtual bool threadLoop() { return mOwner->threadLoop(); } \
+ private: \
+ THREADOWNER *mOwner; \
+ }; \
+ friend class THREADNAME; \
+ bool threadLoop(); \
+ sp<THREADNAME> mThread;
+
+
+#endif /* SIMPLE_THREAD_H */
+
diff --git a/hwc2/common/base/VsyncManager.cpp b/hwc2/common/base/VsyncManager.cpp
new file mode 100644
index 0000000..22e896b
--- a/dev/null
+++ b/hwc2/common/base/VsyncManager.cpp
@@ -0,0 +1,202 @@
+/*
+// Copyright(c) 2016 Amlogic Corporation
+*/
+
+#include <HwcTrace.h>
+#include <Hwcomposer.h>
+#include <VsyncManager.h>
+#include <IDisplayDevice.h>
+
+
+namespace android {
+namespace amlogic {
+
+VsyncManager::VsyncManager(Hwcomposer &hwc)
+ :mHwc(hwc),
+ mInitialized(false),
+ mEnableDynamicVsync(true),
+ mEnabled(false),
+ mVsyncSource(IDisplayDevice::DEVICE_COUNT),
+ mLock()
+{
+}
+
+VsyncManager::~VsyncManager()
+{
+ WARN_IF_NOT_DEINIT();
+}
+
+bool VsyncManager::initialize()
+{
+
+ mEnabled = false;
+ mVsyncSource = IDisplayDevice::DEVICE_COUNT;
+ mEnableDynamicVsync = !scUsePrimaryVsyncOnly;
+ mInitialized = true;
+ return true;
+}
+
+void VsyncManager::deinitialize()
+{
+ if (mEnabled) {
+ WTRACE("vsync is still enabled");
+ }
+
+ mVsyncSource = IDisplayDevice::DEVICE_COUNT;
+ mEnabled = false;
+ mEnableDynamicVsync = !scUsePrimaryVsyncOnly;
+ mInitialized = false;
+}
+
+int32_t VsyncManager::handleVsyncControl(int disp, bool enabled)
+{
+ Mutex::Autolock l(mLock);
+
+ /*if (disp != IDisplayDevice::DEVICE_PRIMARY) {
+ WTRACE("vsync control on non-primary device %d", disp);
+ return false;
+ }*/
+
+ if (disp > IDisplayDevice::DEVICE_VIRTUAL || disp < IDisplayDevice::DEVICE_PRIMARY) {
+ WTRACE("vsync control on invalid device %d", disp);
+ return HWC2_ERROR_BAD_DISPLAY;
+ }
+
+ if (disp == IDisplayDevice::DEVICE_VIRTUAL) {
+ WTRACE("vsync control on virtual device %d", disp);
+ return HWC2_ERROR_NONE;
+ }
+
+ if (mEnabled == enabled) {
+ WTRACE("vsync state %d is not changed", enabled);
+ return HWC2_ERROR_NONE;
+ }
+
+ if (!enabled) {
+ disableVsync();
+ mEnabled = false;
+ } else {
+ mEnabled = enableVsync(getCandidate());
+ if (!mEnabled) return HWC2_ERROR_BAD_PARAMETER;
+ }
+
+ return HWC2_ERROR_NONE;
+}
+
+void VsyncManager::resetVsyncSource()
+{
+ Mutex::Autolock l(mLock);
+
+ if (!mEnableDynamicVsync) {
+ ITRACE("dynamic vsync source switch is not supported");
+ return;
+ }
+
+ if (!mEnabled) {
+ return;
+ }
+
+ int vsyncSource = getCandidate();
+ if (vsyncSource == mVsyncSource) {
+ return;
+ }
+
+ disableVsync();
+ enableVsync(vsyncSource);
+}
+
+int VsyncManager::getVsyncSource()
+{
+ return mVsyncSource;
+}
+
+void VsyncManager::enableDynamicVsync(bool enable)
+{
+ Mutex::Autolock l(mLock);
+ if (scUsePrimaryVsyncOnly) {
+ WTRACE("dynamic vsync is not supported");
+ return;
+ }
+
+ mEnableDynamicVsync = enable;
+
+ if (!mEnabled) {
+ return;
+ }
+
+ int vsyncSource = getCandidate();
+ if (vsyncSource == mVsyncSource) {
+ return;
+ }
+
+ disableVsync();
+ enableVsync(vsyncSource);
+}
+
+IDisplayDevice* VsyncManager::getDisplayDevice(int dispType ) {
+ return mHwc.getDisplayDevice(dispType);
+}
+
+int VsyncManager::getCandidate()
+{
+ if (!mEnableDynamicVsync) {
+ return IDisplayDevice::DEVICE_PRIMARY;
+ }
+
+ IDisplayDevice *device = NULL;
+ // use HDMI vsync when connected
+ device = getDisplayDevice(IDisplayDevice::DEVICE_EXTERNAL);
+ if (device && device->isConnected()) {
+ return IDisplayDevice::DEVICE_EXTERNAL;
+ }
+
+ return IDisplayDevice::DEVICE_PRIMARY;
+}
+
+bool VsyncManager::enableVsync(int candidate)
+{
+ if (mVsyncSource != IDisplayDevice::DEVICE_COUNT) {
+ WTRACE("vsync has been enabled on %d", mVsyncSource);
+ return true;
+ }
+
+ IDisplayDevice *device = getDisplayDevice(candidate);
+ if (!device) {
+ ETRACE("invalid vsync source candidate %d", candidate);
+ return false;
+ }
+
+ if (device->vsyncControl(true)) {
+ mVsyncSource = candidate;
+ return true;
+ }
+
+ if (candidate != IDisplayDevice::DEVICE_PRIMARY) {
+ WTRACE("failed to enable vsync on display %d, fall back to primary", candidate);
+ device = getDisplayDevice(IDisplayDevice::DEVICE_PRIMARY);
+ if (device && device->vsyncControl(true)) {
+ mVsyncSource = IDisplayDevice::DEVICE_PRIMARY;
+ return true;
+ }
+ }
+ ETRACE("failed to enable vsync on the primary display");
+ return false;
+}
+
+void VsyncManager::disableVsync()
+{
+ if (mVsyncSource == IDisplayDevice::DEVICE_COUNT) {
+ WTRACE("vsync has been disabled");
+ return;
+ }
+
+ IDisplayDevice *device = getDisplayDevice(mVsyncSource);
+ if (device && !device->vsyncControl(false)) {
+ WTRACE("failed to disable vsync on device %d", mVsyncSource);
+ }
+ mVsyncSource = IDisplayDevice::DEVICE_COUNT;
+}
+
+} // namespace amlogic
+} // namespace android
+
diff --git a/hwc2/common/base/VsyncManager.h b/hwc2/common/base/VsyncManager.h
new file mode 100644
index 0000000..6c5dfe1
--- a/dev/null
+++ b/hwc2/common/base/VsyncManager.h
@@ -0,0 +1,54 @@
+/*
+// Copyright(c) 2016 Amlogic Corporation
+*/
+
+#ifndef VSYNC_MANAGER_H
+#define VSYNC_MANAGER_H
+
+#include <IDisplayDevice.h>
+#include <utils/threads.h>
+
+namespace android {
+namespace amlogic {
+
+
+class Hwcomposer;
+
+class VsyncManager {
+public:
+ VsyncManager(Hwcomposer& hwc);
+ virtual ~VsyncManager();
+
+public:
+ bool initialize();
+ void deinitialize();
+ int32_t handleVsyncControl(int disp, bool enabled);
+ void resetVsyncSource();
+ int getVsyncSource();
+ void enableDynamicVsync(bool enable);
+
+private:
+ inline int getCandidate();
+ inline bool enableVsync(int candidate);
+ inline void disableVsync();
+ IDisplayDevice* getDisplayDevice(int dispType);
+
+private:
+ Hwcomposer &mHwc;
+ bool mInitialized;
+ bool mEnableDynamicVsync;
+ bool mEnabled;
+ int mVsyncSource;
+ Mutex mLock;
+
+private:
+ // toggle this constant to use primary vsync only or enable dynamic vsync.
+ static const bool scUsePrimaryVsyncOnly = false;
+};
+
+} // namespace amlogic
+} // namespace android
+
+
+
+#endif /* VSYNC_MANAGER_H */
diff --git a/hwc2/common/devices/ExternalDevice.cpp b/hwc2/common/devices/ExternalDevice.cpp
new file mode 100644
index 0000000..b56f60a
--- a/dev/null
+++ b/hwc2/common/devices/ExternalDevice.cpp
@@ -0,0 +1,327 @@
+/*
+// Copyright(c) 2016 Amlogic Corporation
+*/
+
+#include <HwcTrace.h>
+#include <Drm.h>
+#include <DrmConfig.h>
+#include <Hwcomposer.h>
+#include <ExternalDevice.h>
+
+namespace android {
+namespace amlogic {
+
+ExternalDevice::ExternalDevice(Hwcomposer& hwc, DeviceControlFactory* controlFactory)
+ : PhysicalDevice(DEVICE_EXTERNAL, hwc, controlFactory),
+ mHdcpControl(NULL),
+ mAbortModeSettingCond(),
+ mPendingDrmMode(),
+ mHotplugEventPending(false),
+ mExpectedRefreshRate(0)
+{
+ CTRACE();
+}
+
+ExternalDevice::~ExternalDevice()
+{
+ CTRACE();
+}
+
+bool ExternalDevice::initialize()
+{
+ if (!PhysicalDevice::initialize()) {
+ DEINIT_AND_RETURN_FALSE("failed to initialize physical device");
+ }
+
+ mHdcpControl = mControlFactory->createHdcpControl();
+ if (!mHdcpControl) {
+ DEINIT_AND_RETURN_FALSE("failed to create HDCP control");
+ }
+
+ mHotplugEventPending = false;
+ if (mConnected) {
+ mHdcpControl->startHdcpAsync(HdcpLinkStatusListener, this);
+ }
+
+ UeventObserver *observer = Hwcomposer::getInstance().getUeventObserver();
+ if (observer) {
+ observer->registerListener(
+ DrmConfig::getHotplugString(),
+ hotplugEventListener,
+ this);
+ } else {
+ ETRACE("Uevent observer is NULL");
+ }
+ return true;
+}
+
+void ExternalDevice::deinitialize()
+{
+ // abort mode settings if it is in the middle
+ mAbortModeSettingCond.signal();
+ if (mThread.get()) {
+ mThread->join();
+ mThread = NULL;
+ }
+
+ if (mHdcpControl) {
+ mHdcpControl->stopHdcp();
+ delete mHdcpControl;
+ mHdcpControl = 0;
+ }
+
+ mHotplugEventPending = false;
+ PhysicalDevice::deinitialize();
+}
+
+bool ExternalDevice::setDrmMode(drmModeModeInfo& value)
+{
+ if (!mConnected) {
+ WTRACE("external device is not connected");
+ return false;
+ }
+
+ if (mThread.get()) {
+ mThread->join();
+ mThread = NULL;
+ }
+
+ Drm *drm = Hwcomposer::getInstance().getDrm();
+ drmModeModeInfo mode;
+ drm->getModeInfo(mType, mode);
+ if (drm->isSameDrmMode(&value, &mode))
+ return true;
+
+ // any issue here by faking connection status?
+ mConnected = false;
+ mPendingDrmMode = value;
+
+ // setting mode in a working thread
+ mThread = new ModeSettingThread(this);
+ if (!mThread.get()) {
+ ETRACE("failed to create mode settings thread");
+ return false;
+ }
+
+ mThread->run("ModeSettingsThread", PRIORITY_URGENT_DISPLAY);
+ return true;
+}
+
+bool ExternalDevice::threadLoop()
+{
+ // one-time execution
+ setDrmMode();
+ return false;
+}
+
+void ExternalDevice::setDrmMode()
+{
+ ITRACE("start mode setting...");
+
+ Drm *drm = Hwcomposer::getInstance().getDrm();
+
+ mConnected = false;
+ mHwc.hotplug(mType, false);
+
+ {
+ Mutex::Autolock lock(mLock);
+ // TODO: make timeout value flexible, or wait until surface flinger
+ // acknowledges hot unplug event.
+ status_t err = mAbortModeSettingCond.waitRelative(mLock, milliseconds(20));
+ if (err != -ETIMEDOUT) {
+ ITRACE("Mode settings is interrupted");
+ mHwc.hotplug(mType, true);
+ return;
+ }
+ }
+
+ // TODO: potential threading issue with onHotplug callback
+ mHdcpControl->stopHdcp();
+ if (!drm->setDrmMode(mType, mPendingDrmMode)) {
+ ETRACE("failed to set Drm mode");
+ mHwc.hotplug(mType, true);
+ return;
+ }
+
+ if (!PhysicalDevice::updateDisplayConfigs()) {
+ ETRACE("failed to update display configs");
+ mHwc.hotplug(mType, true);
+ return;
+ }
+ mConnected = true;
+ mHotplugEventPending = true;
+ // delay sending hotplug event until HDCP is authenticated
+ if (mHdcpControl->startHdcpAsync(HdcpLinkStatusListener, this) == false) {
+ ETRACE("startHdcpAsync() failed; HDCP is not enabled");
+ mHotplugEventPending = false;
+ mHwc.hotplug(mType, true);
+ }
+ mExpectedRefreshRate = 0;
+}
+
+
+void ExternalDevice::HdcpLinkStatusListener(bool success, void *userData)
+{
+ if (userData == NULL) {
+ return;
+ }
+
+ ExternalDevice *p = (ExternalDevice*)userData;
+ p->HdcpLinkStatusListener(success);
+}
+
+void ExternalDevice::HdcpLinkStatusListener(bool success)
+{
+ if (!success) {
+ ETRACE("HDCP is not authenticated, disabling dynamic vsync");
+ mHwc.getVsyncManager()->enableDynamicVsync(false);
+ }
+
+ if (mHotplugEventPending) {
+ DTRACE("HDCP authentication status %d, sending hotplug event...", success);
+ mHwc.hotplug(mType, mConnected);
+ mHotplugEventPending = false;
+ }
+
+ if (success) {
+ ITRACE("HDCP authenticated, enabling dynamic vsync");
+ mHwc.getVsyncManager()->enableDynamicVsync(true);
+ }
+}
+
+void ExternalDevice::hotplugEventListener(void *data)
+{
+ ExternalDevice *pThis = (ExternalDevice*)data;
+ if (pThis) {
+ pThis->hotplugListener();
+ }
+}
+
+void ExternalDevice::hotplugListener()
+{
+ bool ret;
+
+ CTRACE();
+
+ // abort mode settings if it is in the middle
+ mAbortModeSettingCond.signal();
+
+ // remember the current connection status before detection
+ bool connected = mConnected;
+
+ // detect display configs
+ ret = detectDisplayConfigs();
+ if (ret == false) {
+ ETRACE("failed to detect display config");
+ return;
+ }
+
+ ITRACE("hotpug event: %d", mConnected);
+
+ if (connected == mConnected) {
+ WTRACE("same connection status detected, hotplug event ignored");
+ return;
+ }
+
+ if (mConnected == false) {
+ mHotplugEventPending = false;
+ mHwc.getVsyncManager()->resetVsyncSource();
+ mHdcpControl->stopHdcp();
+ mHwc.hotplug(mType, mConnected);
+ } else {
+ DTRACE("start HDCP asynchronously...");
+ // delay sending hotplug event till HDCP is authenticated.
+ mHotplugEventPending = true;
+ ret = mHdcpControl->startHdcpAsync(HdcpLinkStatusListener, this);
+ if (ret == false) {
+ ETRACE("failed to start HDCP");
+ mHotplugEventPending = false;
+ mHwc.hotplug(mType, mConnected);
+ }
+ }
+ mActiveDisplayConfig = 0;
+}
+
+int ExternalDevice::getRefreshRate()
+{
+ Drm *drm = Hwcomposer::getInstance().getDrm();
+ drmModeModeInfo mode;
+ if (!drm->getModeInfo(IDisplayDevice::DEVICE_EXTERNAL, mode))
+ return 0;
+ return mode.vrefresh;
+}
+
+void ExternalDevice::setRefreshRate(int hz)
+{
+ RETURN_VOID_IF_NOT_INIT();
+
+ ITRACE("setting refresh rate to %d", hz);
+
+ if (mBlank) {
+ WTRACE("external device is blank");
+ return;
+ }
+
+ Drm *drm = Hwcomposer::getInstance().getDrm();
+ drmModeModeInfo mode;
+ if (!drm->getModeInfo(IDisplayDevice::DEVICE_EXTERNAL, mode))
+ return;
+
+ if (hz == 0 && (mode.type & DRM_MODE_TYPE_PREFERRED))
+ return;
+
+ if (hz == (int)mode.vrefresh)
+ return;
+
+ if (mExpectedRefreshRate != 0 &&
+ mExpectedRefreshRate == hz && mHotplugEventPending) {
+ ITRACE("Ignore a new refresh setting event because there is a same event is handling");
+ return;
+ }
+ mExpectedRefreshRate = hz;
+
+ ITRACE("changing refresh rate from %d to %d", mode.vrefresh, hz);
+
+ mHwc.getVsyncManager()->enableDynamicVsync(false);
+
+ mHdcpControl->stopHdcp();
+
+ drm->setRefreshRate(IDisplayDevice::DEVICE_EXTERNAL, hz);
+
+ mHotplugEventPending = false;
+ mHdcpControl->startHdcpAsync(HdcpLinkStatusListener, this);
+ mHwc.getVsyncManager()->enableDynamicVsync(true);
+}
+
+int ExternalDevice::getActiveConfig()
+{
+ if (!mConnected) {
+ return 0;
+ }
+ return mActiveDisplayConfig;
+}
+
+bool ExternalDevice::setActiveConfig(int index)
+{
+ if (!mConnected) {
+ if (index == 0)
+ return true;
+ else
+ return false;
+ }
+
+ // for now we will only permit the frequency change. In the future
+ // we may need to set mode as well.
+ if (index >= 0 && index < static_cast<int>(mDisplayConfigs.size())) {
+ DisplayConfig *config = mDisplayConfigs.itemAt(index);
+ setRefreshRate(config->getRefreshRate());
+ mActiveDisplayConfig = index;
+ return true;
+ } else {
+ return false;
+ }
+ return true;
+}
+
+} // namespace amlogic
+} // namespace android
diff --git a/hwc2/common/devices/PhysicalDevice.cpp b/hwc2/common/devices/PhysicalDevice.cpp
new file mode 100644
index 0000000..cf6e12c
--- a/dev/null
+++ b/hwc2/common/devices/PhysicalDevice.cpp
@@ -0,0 +1,842 @@
+/*
+// Copyright(c) 2016 Amlogic Corporation
+*/
+#include <HwcTrace.h>
+#include <PhysicalDevice.h>
+#include <Hwcomposer.h>
+#include <sys/ioctl.h>
+#include <Utils.h>
+
+namespace android {
+namespace amlogic {
+
+PhysicalDevice::PhysicalDevice(hwc2_display_t id, Hwcomposer& hwc)
+ : mId(id),
+ mHwc(hwc),
+ mActiveDisplayConfig(-1),
+ mVsyncObserver(NULL),
+ mIsConnected(false),
+ mInitialized(false),
+ mFramebufferHnd(NULL),
+ mFramebufferInfo(NULL)
+{
+ CTRACE();
+
+ switch (id) {
+ case DEVICE_PRIMARY:
+ mName = "Primary";
+ break;
+ case DEVICE_EXTERNAL:
+ mName = "External";
+ break;
+ default:
+ mName = "Unknown";
+ }
+
+ // init Display here.
+ initDisplay();
+
+ // set capacity of layers, layer's changed type, layer's changed request.
+ mHwcLayersChangeType.setCapacity(LAYER_MAX_NUM_CHANGE_TYPE);
+ mHwcLayersChangeRequest.setCapacity(LAYER_MAX_NUM_CHANGE_REQUEST);
+ mHwcLayers.setCapacity(LAYER_MAX_NUM_SUPPORT);
+
+ // set capacity of mDisplayConfigs
+ mDisplayConfigs.setCapacity(DEVICE_COUNT);
+}
+
+PhysicalDevice::~PhysicalDevice()
+{
+ WARN_IF_NOT_DEINIT();
+}
+
+bool PhysicalDevice::initialize() {
+ CTRACE();
+
+ if (mId != DEVICE_PRIMARY && mId != DEVICE_EXTERNAL) {
+ ETRACE("invalid device type");
+ return false;
+ }
+
+ // create vsync event observer, we only have soft vsync now...
+ mVsyncObserver = new SoftVsyncObserver(*this);
+ if (!mVsyncObserver || !mVsyncObserver->initialize()) {
+ DEINIT_AND_RETURN_FALSE("failed to create vsync observer");
+ }
+
+ mInitialized = true;
+ return true;
+}
+
+void PhysicalDevice::deinitialize() {
+ Mutex::Autolock _l(mLock);
+
+ DEINIT_AND_DELETE_OBJ(mVsyncObserver);
+
+ mInitialized = false;
+}
+
+HwcLayer* PhysicalDevice::getLayerById(hwc2_layer_t layerId) {
+ HwcLayer* layer = NULL;
+
+ layer = mHwcLayers.valueFor(layerId);
+ if (!layer) ETRACE("getLayerById %lld error!", layerId);
+
+ return layer;
+}
+
+int32_t PhysicalDevice::acceptDisplayChanges() {
+ HwcLayer* layer = NULL;
+
+ for (uint32_t i=0; i<mHwcLayersChangeType.size(); i++) {
+ hwc2_layer_t layerId = mHwcLayersChangeType.keyAt(i);
+ layer = mHwcLayersChangeType.valueAt(i);
+ if (layer) {
+ if (layer->getCompositionType() == HWC2_COMPOSITION_DEVICE
+ || layer->getCompositionType() == HWC2_COMPOSITION_SOLID_COLOR) {
+ layer->setCompositionType(HWC2_COMPOSITION_CLIENT);
+ } else if (layer->getCompositionType() == HWC2_COMPOSITION_SIDEBAND) {
+ layer->setCompositionType(HWC2_COMPOSITION_DEVICE);
+ }
+ }
+ }
+ // reset layer changed or requested to zero.
+ mHwcLayersChangeType.clear();
+ mHwcLayersChangeRequest.clear();
+
+ return HWC2_ERROR_NONE;
+}
+
+bool PhysicalDevice::createLayer(hwc2_layer_t* outLayer) {
+ HwcLayer* layer = new HwcLayer(mId);
+
+ if (layer == NULL || !layer->initialize()) {
+ ETRACE("createLayer: failed !");
+ return false;
+ }
+
+ hwc2_layer_t layerId = reinterpret_cast<hwc2_layer_t>(layer);
+ mHwcLayers.add(layerId, layer);
+ *outLayer = layerId;
+
+ return true;
+}
+
+bool PhysicalDevice::destroyLayer(hwc2_layer_t layerId) {
+ //HwcLayer* layer = reinterpret_cast<HwcLayer*>(layerId);
+ HwcLayer* layer = mHwcLayers.valueFor(layerId);
+
+ if (layer == NULL) {
+ ETRACE("destroyLayer: no Hwclayer found (%d)", layerId);
+ return false;
+ }
+
+ mHwcLayers.removeItem(layerId);
+ DEINIT_AND_DELETE_OBJ(layer);
+ return true;
+}
+
+int32_t PhysicalDevice::getActiveConfig(
+ hwc2_config_t* outConfig) {
+
+ return HWC2_ERROR_NONE;
+}
+
+int32_t PhysicalDevice::getChangedCompositionTypes(
+ uint32_t* outNumElements,
+ hwc2_layer_t* outLayers,
+ int32_t* /*hwc2_composition_t*/ outTypes) {
+ HwcLayer* layer = NULL;
+
+ // if outLayers or outTypes were NULL, the number of layers and types which would have been returned.
+ if (NULL == outLayers || NULL == outTypes) {
+ *outNumElements = mHwcLayersChangeType.size();
+ } else {
+ for (uint32_t i=0; i<mHwcLayersChangeType.size(); i++) {
+ hwc2_layer_t layerId = mHwcLayersChangeType.keyAt(i);
+ layer = mHwcLayersChangeType.valueAt(i);
+ if (layer) {
+ if (layer->getCompositionType() == HWC2_COMPOSITION_DEVICE
+ || layer->getCompositionType() == HWC2_COMPOSITION_SOLID_COLOR) {
+ // change all other device type to client.
+ outLayers[i] = layerId;
+ outTypes[i] = HWC2_COMPOSITION_CLIENT;
+ continue;
+ }
+
+ // sideband stream.
+ if (layer->getCompositionType() == HWC2_COMPOSITION_SIDEBAND
+ && layer->getSidebandStream()) {
+ // TODO: we just transact SIDEBAND to OVERLAY for now;
+ DTRACE("get HWC_SIDEBAND layer, just change to overlay");
+ outLayers[i] = layerId;
+ outTypes[i] = HWC2_COMPOSITION_DEVICE;
+ continue;
+ }
+ }
+ }
+
+ if (mHwcLayersChangeType.size() > 0) {
+ DTRACE("There are %d layers type has changed.", mHwcLayersChangeType.size());
+ *outNumElements = mHwcLayersChangeType.size();
+ } else {
+ DTRACE("No layers compositon type changed.");
+ }
+ }
+
+ return HWC2_ERROR_NONE;
+}
+
+int32_t PhysicalDevice::getClientTargetSupport(
+ uint32_t width,
+ uint32_t height,
+ int32_t /*android_pixel_format_t*/ format,
+ int32_t /*android_dataspace_t*/ dataspace) {
+
+ if (width == mFramebufferInfo->info.xres
+ && height == mFramebufferInfo->info.yres
+ && format == HAL_PIXEL_FORMAT_RGBA_8888
+ && dataspace == HAL_DATASPACE_UNKNOWN) {
+ return HWC2_ERROR_NONE;
+ }
+
+ DTRACE("fbinfo: [%d x %d], client: [%d x %d]"
+ "format: %d, dataspace: %d",
+ mFramebufferInfo->info.xres,
+ mFramebufferInfo->info.yres,
+ width, height, format, dataspace);
+
+ // TODO: ?
+ return HWC2_ERROR_UNSUPPORTED;
+}
+
+int32_t PhysicalDevice::getColorModes(
+ uint32_t* outNumModes,
+ int32_t* /*android_color_mode_t*/ outModes) {
+ return HWC2_ERROR_NONE;
+}
+
+int32_t PhysicalDevice::getDisplayAttribute(
+ hwc2_config_t config,
+ int32_t /*hwc2_attribute_t*/ attribute,
+ int32_t* outValue) {
+ Mutex::Autolock _l(mLock);
+
+ if (!mIsConnected) {
+ ETRACE("display %d is not connected.", mId);
+ }
+
+ DisplayConfig *configChosen = mDisplayConfigs.itemAt(config);
+ if (!configChosen) {
+ ETRACE("failed to get display config: %ld", config);
+ return HWC2_ERROR_BAD_CONFIG;
+ }
+
+ // TODO: HWC2_ERROR_BAD_CONFIG?
+ switch (attribute) {
+ case HWC2_ATTRIBUTE_VSYNC_PERIOD:
+ //*outValue = (int32_t)mVsyncObserver->getRefreshPeriod();
+ if (configChosen->getRefreshRate()) {
+ *outValue = 1e9 / configChosen->getRefreshRate();
+ } else {
+ ETRACE("refresh rate is 0, default to 60fps!!!");
+ *outValue = 1e9 / 60;
+ }
+
+ ETRACE("refresh period: %d", *outValue);
+ break;
+ case HWC2_ATTRIBUTE_WIDTH:
+ //*outValue = mFramebufferInfo->info.xres;
+ *outValue = configChosen->getWidth();
+ break;
+ case HWC2_ATTRIBUTE_HEIGHT:
+ //*outValue = mFramebufferInfo->info.yres;
+ *outValue = configChosen->getHeight();
+ break;
+ case HWC2_ATTRIBUTE_DPI_X:
+ //*outValue = mFramebufferInfo->xdpi*1000;
+ *outValue = configChosen->getDpiX() * 1000.0f;
+ break;
+ case HWC2_ATTRIBUTE_DPI_Y:
+ //*outValue = mFramebufferInfo->ydpi*1000;
+ *outValue = configChosen->getDpiY() * 1000.0f;
+ break;
+ default:
+ ETRACE("unknown display attribute %u", attribute);
+ *outValue = -1;
+ break;
+ }
+
+ return HWC2_ERROR_NONE;
+}
+
+int32_t PhysicalDevice::getDisplayConfigs(
+ uint32_t* outNumConfigs,
+ hwc2_config_t* outConfigs) {
+ Mutex::Autolock _l(mLock);
+
+ if (!mIsConnected) {
+ ETRACE("display %d is not connected.", mId);
+ }
+
+ /* if (NULL != outConfigs) outConfigs[0] = 0;
+ *outNumConfigs = 1; */
+
+ // fill in all config handles
+ if (NULL != outConfigs) {
+ for (int i = 0; i < static_cast<int>(*outNumConfigs); i++) {
+ outConfigs[i] = i;
+ }
+ }
+ *outNumConfigs = mDisplayConfigs.size();
+
+ return HWC2_ERROR_NONE;
+}
+
+int32_t PhysicalDevice::getDisplayName(
+ uint32_t* outSize,
+ char* outName) {
+ return HWC2_ERROR_NONE;
+}
+
+int32_t PhysicalDevice::getDisplayRequests(
+ int32_t* /*hwc2_display_request_t*/ outDisplayRequests,
+ uint32_t* outNumElements,
+ hwc2_layer_t* outLayers,
+ int32_t* /*hwc2_layer_request_t*/ outLayerRequests) {
+
+ // if outLayers or outTypes were NULL, the number of layers and types which would have been returned.
+ if (NULL == outLayers || NULL == outLayerRequests) {
+ *outNumElements = mHwcLayersChangeRequest.size();
+ } else {
+ for (uint32_t i=0; i<mHwcLayersChangeRequest.size(); i++) {
+ hwc2_layer_t layerId = mHwcLayersChangeRequest.keyAt(i);
+ HwcLayer *layer = mHwcLayersChangeRequest.valueAt(i);
+ if (layer->getCompositionType() == HWC2_COMPOSITION_DEVICE) {
+ // video overlay.
+ if (layer->getBufferHandle()) {
+ private_handle_t const* hnd =
+ reinterpret_cast<private_handle_t const*>(layer->getBufferHandle());
+ if (hnd->flags & private_handle_t::PRIV_FLAGS_VIDEO_OVERLAY) {
+ outLayers[i] = layerId;
+ outLayerRequests[i] = HWC2_LAYER_REQUEST_CLEAR_CLIENT_TARGET;
+ continue;
+ }
+ }
+ }
+
+ // sideband stream.
+ if ((layer->getCompositionType() == HWC2_COMPOSITION_SIDEBAND && layer->getSidebandStream())
+ //|| layer->getCompositionType() == HWC2_COMPOSITION_SOLID_COLOR
+ || layer->getCompositionType() == HWC2_COMPOSITION_CURSOR) {
+ // TODO: we just transact SIDEBAND to OVERLAY for now;
+ DTRACE("get HWC_SIDEBAND layer, just change to overlay");
+ outLayers[i] = layerId;
+ outLayerRequests[i] = HWC2_LAYER_REQUEST_CLEAR_CLIENT_TARGET;
+ continue;
+ }
+ }
+
+ if (mHwcLayersChangeRequest.size() > 0) {
+ DTRACE("There are %d layer requests.", mHwcLayersChangeRequest.size());
+ *outNumElements = mHwcLayersChangeRequest.size();
+ } else {
+ DTRACE("No layer requests.");
+ }
+ }
+
+ return HWC2_ERROR_NONE;
+}
+
+int32_t PhysicalDevice::getDisplayType(
+ int32_t* /*hwc2_display_type_t*/ outType) {
+ return HWC2_ERROR_NONE;
+}
+
+int32_t PhysicalDevice::getDozeSupport(
+ int32_t* outSupport) {
+ return HWC2_ERROR_NONE;
+}
+
+int32_t PhysicalDevice::getHdrCapabilities(
+ uint32_t* outNumTypes,
+ int32_t* /*android_hdr_t*/ outTypes,
+ float* outMaxLuminance,
+ float* outMaxAverageLuminance,
+ float* outMinLuminance) {
+ return HWC2_ERROR_NONE;
+}
+
+int32_t PhysicalDevice::getReleaseFences(
+ uint32_t* outNumElements,
+ hwc2_layer_t* outLayers,
+ int32_t* outFences) {
+ HwcLayer* layer = NULL;
+ uint32_t num_layer = 0;
+
+ if (NULL == outLayers || NULL == outFences) {
+ for (uint32_t i=0; i<mHwcLayers.size(); i++) {
+ hwc2_layer_t layerId = mHwcLayers.keyAt(i);
+ layer = mHwcLayers.valueAt(i);
+ if (layer/* && layer->getAcquireFence() > -1*/) num_layer++;
+ }
+ } else {
+ for (uint32_t i=0; i<mHwcLayers.size(); i++) {
+ hwc2_layer_t layerId = mHwcLayers.keyAt(i);
+ layer = mHwcLayers.valueAt(i);
+ if (layer/* && layer->getAcquireFence() > -1*/) {
+ outLayers[num_layer] = layerId;
+ outFences[num_layer++] = layer->getAcquireFence();
+ // TODO: ?
+ layer->resetAcquireFence();
+ }
+ }
+ }
+
+ if (num_layer > 0) {
+ DTRACE("There are %d layer requests.", num_layer);
+ *outNumElements = num_layer;
+ } else {
+ DTRACE("No layer have set buffer yet.");
+ }
+
+ return HWC2_ERROR_NONE;
+}
+
+int32_t PhysicalDevice::postFramebuffer(int32_t* outRetireFence) {
+ HwcLayer* layer = NULL;
+ int32_t err = 0;
+ void *cbuffer;
+
+ // deal physical display's client target layer
+ framebuffer_info_t* cbinfo = mCursorContext->getCursorInfo();
+ bool cursorShow = false;
+ for (uint32_t i=0; i<mHwcLayers.size(); i++) {
+ hwc2_layer_t layerId = mHwcLayers.keyAt(i);
+ layer = mHwcLayers.valueAt(i);
+ if (layer && layer->getCompositionType()== HWC2_COMPOSITION_CURSOR) {
+ if (private_handle_t::validate(layer->getBufferHandle()) < 0) {
+ ETRACE("invalid cursor layer handle.");
+ break;
+ }
+ private_handle_t *hnd = (private_handle_t *)(layer->getBufferHandle());
+ DTRACE("This is a Sprite, hnd->stride is %d, hnd->height is %d", hnd->stride, hnd->height);
+ if (cbinfo->info.xres != (uint32_t)hnd->stride || cbinfo->info.yres != (uint32_t)hnd->height) {
+ ETRACE("disp: %d cursor need to redrew", mId);
+ update_cursor_buffer_locked(cbinfo, hnd->stride, hnd->height);
+ cbuffer = mmap(NULL, hnd->size, PROT_READ|PROT_WRITE, MAP_SHARED, cbinfo->fd, 0);
+ if (cbuffer != MAP_FAILED) {
+ memcpy(cbuffer, hnd->base, hnd->size);
+ munmap(cbuffer, hnd->size);
+ DTRACE("setCursor ok");
+ } else {
+ ETRACE("buffer mmap fail");
+ }
+ }
+ cursorShow = true;
+ break;
+ }
+ }
+
+ if (!mClientTargetHnd) {
+ ETRACE("target handle is null.");
+ *outRetireFence = -1;
+ return HWC2_ERROR_NONE;
+ }
+ if (private_handle_t::validate(mClientTargetHnd) < 0) {
+ *outRetireFence = -1;
+ return HWC2_ERROR_NOT_VALIDATED;
+ }
+
+ *outRetireFence = fb_post_with_fence_locked(mFramebufferInfo, mClientTargetHnd, mTargetAcquireFence);
+
+ if (*outRetireFence >= 0) {
+ DTRACE("Get retire fence %d", *outRetireFence);
+ } else {
+ ETRACE("No valid retire returned. %d ", *outRetireFence);
+ //-1 means no fence, less than -1 is some error
+ if (*outRetireFence < -1) err = HWC2_ERROR_NOT_VALIDATED;
+ *outRetireFence -1;
+ }
+
+ // finally we need to update cursor's blank status
+ if (cbinfo->fd > 0 && (cursorShow != mCursorContext->getCursorStatus()) ) {
+ mCursorContext->setCursorStatus(cursorShow);
+
+ DTRACE("UPDATE FB1 status to %d ",cursorShow);
+ ioctl(cbinfo->fd, FBIOBLANK, !mCursorContext->getCursorStatus());
+ }
+
+ return err;
+}
+
+
+int32_t PhysicalDevice::presentDisplay(
+ int32_t* outRetireFence) {
+ int32_t err = HWC2_ERROR_NONE;
+ HwcLayer* layer = NULL;
+
+ // TODO: need improve the way to set video axis.
+#if WITH_LIBPLAYER_MODULE
+ for (uint32_t i=0; i<mHwcLayers.size(); i++) {
+ hwc2_layer_t layerId = mHwcLayers.keyAt(i);
+ layer = mHwcLayers.valueAt(i);
+
+ if (layer && layer->getCompositionType()== HWC2_COMPOSITION_DEVICE) {
+ //hwc2_overlay_compose(ctx, display, hwclayer);
+ layer->presentOverlay();
+ break;
+ }
+ }
+#endif
+ err = postFramebuffer(outRetireFence);
+
+ return err;
+}
+
+int32_t PhysicalDevice::setActiveConfig(
+ hwc2_config_t config) {
+ return HWC2_ERROR_NONE;
+}
+
+int32_t PhysicalDevice::setClientTarget(
+ buffer_handle_t target,
+ int32_t acquireFence,
+ int32_t /*android_dataspace_t*/ dataspace,
+ hwc_region_t damage) {
+
+ if (target && private_handle_t::validate(target) < 0) {
+ return HWC2_ERROR_BAD_PARAMETER;
+ }
+
+ if (NULL != target) {
+ mClientTargetHnd = target;
+ mClientTargetDamageRegion = damage;
+ if (-1 != acquireFence) {
+ mTargetAcquireFence = acquireFence;
+ }
+ // TODO: HWC2_ERROR_BAD_PARAMETER && dataspace && damage.
+ } else {
+ DTRACE("client target is null!, no need to update this frame.");
+ }
+
+ return HWC2_ERROR_NONE;
+}
+
+int32_t PhysicalDevice::setColorMode(
+ int32_t /*android_color_mode_t*/ mode) {
+ return HWC2_ERROR_NONE;
+}
+
+int32_t PhysicalDevice::setColorTransform(
+ const float* matrix,
+ int32_t /*android_color_transform_t*/ hint) {
+ return HWC2_ERROR_NONE;
+}
+
+int32_t PhysicalDevice::setPowerMode(
+ int32_t /*hwc2_power_mode_t*/ mode){
+ return HWC2_ERROR_NONE;
+}
+
+bool PhysicalDevice::vsyncControl(bool enabled) {
+ RETURN_FALSE_IF_NOT_INIT();
+
+ ATRACE("disp = %d, enabled = %d", mId, enabled);
+ return mVsyncObserver->control(enabled);
+}
+
+int32_t PhysicalDevice::validateDisplay(uint32_t* outNumTypes,
+ uint32_t* outNumRequests) {
+ HwcLayer* layer = NULL;
+
+ for (uint32_t i=0; i<mHwcLayers.size(); i++) {
+ hwc2_layer_t layerId = mHwcLayers.keyAt(i);
+ layer = mHwcLayers.valueAt(i);
+ if (layer) {
+ // Physical Display.
+ if (layer->getCompositionType() == HWC2_COMPOSITION_DEVICE) {
+ // video overlay.
+ if (layer->getBufferHandle()) {
+ private_handle_t const* hnd =
+ reinterpret_cast<private_handle_t const*>(layer->getBufferHandle());
+ if (hnd->flags & private_handle_t::PRIV_FLAGS_VIDEO_OVERLAY) {
+ mHwcLayersChangeRequest.add(layerId, layer);
+ continue;
+ }
+ }
+
+ // change all other device type to client.
+ mHwcLayersChangeType.add(layerId, layer);
+ continue;
+ }
+
+ // cursor layer.
+ if (layer->getCompositionType() == HWC2_COMPOSITION_CURSOR) {
+ DTRACE("This is a Cursor layer!");
+ mHwcLayersChangeRequest.add(layerId, layer);
+ continue;
+ }
+
+ // sideband stream.
+ if (layer->getCompositionType() == HWC2_COMPOSITION_SIDEBAND
+ && layer->getSidebandStream()) {
+ // TODO: we just transact SIDEBAND to OVERLAY for now;
+ DTRACE("get HWC_SIDEBAND layer, just change to overlay");
+ mHwcLayersChangeRequest.add(layerId, layer);
+ mHwcLayersChangeType.add(layerId, layer);
+ continue;
+ }
+
+ // TODO: solid color.
+ if (layer->getCompositionType() == HWC2_COMPOSITION_SOLID_COLOR) {
+ DTRACE("This is a Solid Color layer!");
+ //mHwcLayersChangeRequest.add(layerId, layer);
+ mHwcLayersChangeType.add(layerId, layer);
+ continue;
+ }
+ }
+ }
+
+ if (mHwcLayersChangeRequest.size() > 0) {
+ DTRACE("There are %d layer requests.", mHwcLayersChangeRequest.size());
+ *outNumRequests = mHwcLayersChangeRequest.size();
+ }
+
+ // mark the validate function is called.(???)
+ // dctx->validated = true;
+ if (mHwcLayersChangeType.size() > 0) {
+ DTRACE("there are %d layer types has changed.", mHwcLayersChangeType.size());
+ *outNumTypes = mHwcLayersChangeType.size();
+ return HWC2_ERROR_HAS_CHANGES;
+ }
+
+ return HWC2_ERROR_NONE;
+}
+
+int32_t PhysicalDevice::setCursorPosition(hwc2_layer_t layerId, int32_t x, int32_t y) {
+ HwcLayer* layer = getLayerById(layerId);
+ if (layer && HWC2_COMPOSITION_CURSOR == layer->getCompositionType()) {
+ framebuffer_info_t* cbinfo = mCursorContext->getCursorInfo();
+ fb_cursor cinfo;
+ if (cbinfo->fd < 0) {
+ ETRACE("setCursorPosition fd=%d", cbinfo->fd );
+ }else {
+ cinfo.hot.x = x;
+ cinfo.hot.y = y;
+ DTRACE("setCursorPosition x_pos=%d, y_pos=%d", cinfo.hot.x, cinfo.hot.y);
+ ioctl(cbinfo->fd, FBIO_CURSOR, &cinfo);
+ }
+ } else {
+ ETRACE("setCursorPosition bad layer.");
+ return HWC2_ERROR_BAD_LAYER;
+ }
+
+ return HWC2_ERROR_NONE;
+}
+
+
+/*
+Operater of framebuffer
+*/
+int32_t PhysicalDevice::initDisplay() {
+ if (mIsConnected) return 0;
+
+ Mutex::Autolock _l(mLock);
+
+ if (!mFramebufferHnd) {
+ mFramebufferInfo = new framebuffer_info_t();
+ //init information from osd.
+ mFramebufferInfo->displayType = mId;
+ mFramebufferInfo->fbIdx = getOsdIdx(mId);
+ int32_t err = init_frame_buffer_locked(mFramebufferInfo);
+ int32_t bufferSize = mFramebufferInfo->finfo.line_length
+ * mFramebufferInfo->info.yres;
+ DTRACE("init_frame_buffer get fbinfo->fbIdx (%d) "
+ "fbinfo->info.xres (%d) fbinfo->info.yres (%d)",
+ mFramebufferInfo->fbIdx, mFramebufferInfo->info.xres,
+ mFramebufferInfo->info.yres);
+ int32_t usage = 0;
+ private_module_t *grallocModule = Hwcomposer::getInstance().getGrallocModule();
+ if (mId == HWC_DISPLAY_PRIMARY) {
+ grallocModule->fb_primary.fb_info = *(mFramebufferInfo);
+ } else if (mId == HWC_DISPLAY_EXTERNAL) {
+ grallocModule->fb_external.fb_info = *(mFramebufferInfo);
+ usage |= GRALLOC_USAGE_EXTERNAL_DISP;
+ }
+
+ //Register the framebuffer to gralloc module
+ mFramebufferHnd = new private_handle_t(
+ private_handle_t::PRIV_FLAGS_FRAMEBUFFER,
+ usage, mFramebufferInfo->fbSize, 0,
+ 0, mFramebufferInfo->fd, bufferSize, 0);
+ grallocModule->base.registerBuffer(&(grallocModule->base), mFramebufferHnd);
+ DTRACE("init_frame_buffer get frame size %d usage %d",
+ bufferSize,usage);
+ }
+
+ mIsConnected = true;
+
+ // init cursor framebuffer
+ mCursorContext = new CursorContext();
+ framebuffer_info_t* cbinfo = mCursorContext->getCursorInfo();
+ cbinfo->fd = -1;
+
+ //init information from cursor framebuffer.
+ cbinfo->fbIdx = mId*2+1;
+ if (1 != cbinfo->fbIdx && 3 != cbinfo->fbIdx) {
+ ETRACE("invalid fb index: %d, need to check!",
+ cbinfo->fbIdx);
+ return 0;
+ }
+ int32_t err = init_cursor_buffer_locked(cbinfo);
+ if (err != 0) {
+ ETRACE("init_cursor_buffer_locked failed, need to check!");
+ return 0;
+ }
+ ETRACE("init_cursor_buffer get cbinfo->fbIdx (%d) "
+ "cbinfo->info.xres (%d) cbinfo->info.yres (%d)",
+ cbinfo->fbIdx,
+ cbinfo->info.xres,
+ cbinfo->info.yres);
+
+ if ( cbinfo->fd >= 0) {
+ DTRACE("init_cursor_buffer success!");
+ }else{
+ DTRACE("init_cursor_buffer fail!");
+ }
+
+ return 0;
+}
+
+void PhysicalDevice::removeDisplayConfigs()
+{
+ for (size_t i = 0; i < mDisplayConfigs.size(); i++) {
+ DisplayConfig *config = mDisplayConfigs.itemAt(i);
+ delete config;
+ }
+
+ mDisplayConfigs.clear();
+ mActiveDisplayConfig = -1;
+}
+
+bool PhysicalDevice::updateDisplayConfigs()
+{
+ Mutex::Autolock _l(mLock);
+
+ bool ret;
+ int32_t rate;
+
+ if (!mIsConnected) {
+ ETRACE("disp: %llu is not connected", mId);
+ return true;
+ }
+
+ ret = Utils::checkOutputMode(mDisplayMode, &rate);
+ if (ret) {
+ mVsyncObserver->setRefreshRate(rate);
+ }
+ ETRACE("output mode refresh rate: %d", rate);
+
+ ret |= Utils::checkVinfo(mFramebufferInfo);
+
+ if (ret) {
+ // reset display configs
+ removeDisplayConfigs();
+ // reset the number of display configs
+ mDisplayConfigs.setCapacity(1);
+
+ // use active fb dimension as config width/height
+ DisplayConfig *config = new DisplayConfig(rate,
+ mFramebufferInfo->info.xres,
+ mFramebufferInfo->info.yres,
+ mFramebufferInfo->xdpi,
+ mFramebufferInfo->ydpi);
+ // add it to the front of other configs
+ mDisplayConfigs.push_front(config);
+
+ // init the active display config
+ mActiveDisplayConfig = 0;
+ }
+ return true;
+}
+
+void PhysicalDevice::onVsync(int64_t timestamp) {
+ RETURN_VOID_IF_NOT_INIT();
+ ATRACE("timestamp = %lld", timestamp);
+
+ if (!mIsConnected)
+ return;
+
+ // notify hwc
+ mHwc.vsync(mId, timestamp);
+}
+
+int32_t PhysicalDevice::createVirtualDisplay(
+ uint32_t width,
+ uint32_t height,
+ int32_t* /*android_pixel_format_t*/ format,
+ hwc2_display_t* outDisplay) {
+
+ return HWC2_ERROR_NONE;
+}
+
+int32_t PhysicalDevice::destroyVirtualDisplay(
+ hwc2_display_t display) {
+
+ return HWC2_ERROR_NONE;
+}
+
+int32_t PhysicalDevice::setOutputBuffer(
+ buffer_handle_t buffer, int32_t releaseFence) {
+ // Virtual Display Only.
+ return HWC2_ERROR_NONE;
+}
+
+void PhysicalDevice::dump(Dump& d) {
+ Mutex::Autolock _l(mLock);
+ d.append("-------------------------------------------------------------"
+ "------------------------------------------------------------\n");
+ d.append("Device Name: %s (%s)\n", mName,
+ mIsConnected ? "connected" : "disconnected");
+ d.append(" CONFIG | VSYNC_PERIOD | WIDTH | HEIGHT |"
+ " DPI_X | DPI_Y \n");
+ d.append("------------+------------------+-----------+------------+"
+ "-----------+-----------\n");
+ for (size_t i = 0; i < mDisplayConfigs.size(); i++) {
+ DisplayConfig *config = mDisplayConfigs.itemAt(i);
+ if (config) {
+ d.append("%s %2d | %4d | %5d | %4d |"
+ " %3d | %3d \n",
+ (i == (size_t)mActiveDisplayConfig) ? "* " : " ",
+ i,
+ config->getRefreshRate(),
+ config->getWidth(),
+ config->getHeight(),
+ config->getDpiX(),
+ config->getDpiY());
+ }
+ }
+
+ // dump layer list
+ d.append(" Layers state:\n");
+ d.append(" numLayers=%zu\n", mHwcLayers.size());
+ d.append(" numChangedTypeLayers=%zu\n", mHwcLayersChangeType.size());
+ d.append(" numChangedRequestLayers=%zu\n", mHwcLayersChangeRequest.size());
+
+ if (mHwcLayers.size() > 0) {
+ d.append(
+ " type | handle | zorder | ds | alpa | tr | blnd |"
+ " source crop (l,t,r,b) | frame \n"
+ " -------------+----------+------------+----+------+----+------+"
+ "--------------------------------+------------------------\n");
+ for (uint32_t i=0; i<mHwcLayers.size(); i++) {
+ hwc2_layer_t layerId = mHwcLayers.keyAt(i);
+ HwcLayer *layer = mHwcLayers.valueAt(i);
+ if (layer) layer->dump(d);
+ }
+ }
+}
+
+} // namespace amlogic
+} // namespace android
diff --git a/hwc2/common/devices/PrimaryDevice.cpp b/hwc2/common/devices/PrimaryDevice.cpp
new file mode 100644
index 0000000..d932f5f
--- a/dev/null
+++ b/hwc2/common/devices/PrimaryDevice.cpp
@@ -0,0 +1,75 @@
+/*
+// Copyright(c) 2016 Amlogic Corporation
+*/
+
+#include <HwcTrace.h>
+#include <Hwcomposer.h>
+#include <PrimaryDevice.h>
+#include <Utils.h>
+
+namespace android {
+namespace amlogic {
+
+PrimaryDevice::PrimaryDevice(Hwcomposer& hwc)
+ : PhysicalDevice(DEVICE_PRIMARY, hwc)
+{
+ CTRACE();
+}
+
+PrimaryDevice::~PrimaryDevice()
+{
+ CTRACE();
+}
+
+bool PrimaryDevice::initialize()
+{
+ if (!PhysicalDevice::initialize()) {
+ DEINIT_AND_RETURN_FALSE("failed to initialize physical device");
+ }
+
+ UeventObserver *observer = Hwcomposer::getInstance().getUeventObserver();
+ if (observer) {
+ observer->registerListener(
+ Utils::getHotplugString(),
+ hotplugEventListener,
+ this);
+ } else {
+ ETRACE("Uevent observer is NULL");
+ }
+
+ return true;
+}
+
+void PrimaryDevice::deinitialize()
+{
+ PhysicalDevice::deinitialize();
+}
+
+void PrimaryDevice::hotplugEventListener(void *data)
+{
+ PrimaryDevice *pThis = (PrimaryDevice*)data;
+ if (pThis) {
+ pThis->hotplugListener();
+ }
+}
+
+void PrimaryDevice::hotplugListener()
+{
+ bool ret;
+
+ CTRACE();
+
+ // update display configs
+ ret = updateDisplayConfigs();
+ if (ret == false) {
+ ETRACE("failed to update display config");
+ return;
+ }
+
+ DTRACE("hotpug event: %d", isConnected());
+
+ getDevice().hotplug(getDisplayId(), isConnected());
+}
+
+} // namespace amlogic
+} // namespace android
diff --git a/hwc2/common/devices/VirtualDevice.cpp b/hwc2/common/devices/VirtualDevice.cpp
new file mode 100644
index 0000000..7ef2315
--- a/dev/null
+++ b/hwc2/common/devices/VirtualDevice.cpp
@@ -0,0 +1,494 @@
+/*
+// Copyright(c) 2016 Amlogic Corporation
+*/
+#include <HwcTrace.h>
+#include <Hwcomposer.h>
+#include <VirtualDevice.h>
+#include <Utils.h>
+#include <sync/sync.h>
+
+namespace android {
+namespace amlogic {
+
+VirtualDevice::VirtualDevice(Hwcomposer& hwc)
+ : mHwc(hwc),
+ mId(HWC_DISPLAY_VIRTUAL),
+ mIsConnected(false),
+ mInitialized(false),
+ mWidth(0),
+ mHeight(0),
+ mFormat(0)
+{
+ CTRACE();
+ mName = "Virtual";
+
+ // set capacity of layers, layer's changed type, layer's changed request.
+ mHwcLayersChangeType.setCapacity(LAYER_MAX_NUM_CHANGE_TYPE);
+ mHwcLayers.setCapacity(LAYER_MAX_NUM_SUPPORT);
+}
+
+VirtualDevice::~VirtualDevice()
+{
+ CTRACE();
+}
+
+bool VirtualDevice::initialize() {
+ CTRACE();
+
+ mInitialized = true;
+ return true;
+
+}
+
+void VirtualDevice::deinitialize() {
+ CTRACE();
+
+ mInitialized = false;
+}
+
+HwcLayer* VirtualDevice::getLayerById(hwc2_layer_t layerId) {
+ HwcLayer* layer = NULL;
+
+ layer = mHwcLayers.valueFor(layerId);
+ if (!layer) ETRACE("getLayerById %lld error!", layerId);
+
+ return layer;
+}
+
+int32_t VirtualDevice::acceptDisplayChanges() {
+ HwcLayer* layer = NULL;
+
+ for (uint32_t i=0; i<mHwcLayersChangeType.size(); i++) {
+ hwc2_layer_t layerId = mHwcLayersChangeType.keyAt(i);
+ layer = mHwcLayersChangeType.valueAt(i);
+ if (layer) {
+ if (layer->getCompositionType() != HWC2_COMPOSITION_CLIENT) {
+ layer->setCompositionType(HWC2_COMPOSITION_CLIENT);
+ }
+ }
+ }
+ // reset layer changed or requested to zero.
+ mHwcLayersChangeType.clear();
+
+ return HWC2_ERROR_NONE;
+}
+
+bool VirtualDevice::createLayer(hwc2_layer_t* outLayer) {
+ HwcLayer* layer = new HwcLayer(mId);
+
+ if (layer == NULL || !layer->initialize()) {
+ ETRACE("createLayer: failed !");
+ return false;
+ }
+
+ hwc2_layer_t layerId = reinterpret_cast<hwc2_layer_t>(layer);
+ mHwcLayers.add(layerId, layer);
+ *outLayer = layerId;
+
+ return true;
+}
+
+bool VirtualDevice::destroyLayer(hwc2_layer_t layerId) {
+ //HwcLayer* layer = reinterpret_cast<HwcLayer*>(layerId);
+ HwcLayer* layer = mHwcLayers.valueFor(layerId);
+
+ if (layer == NULL) {
+ ETRACE("destroyLayer: no Hwclayer found (%d)", layerId);
+ return false;
+ }
+
+ mHwcLayers.removeItem(layerId);
+ DEINIT_AND_DELETE_OBJ(layer);
+ return true;
+}
+
+int32_t VirtualDevice::getActiveConfig(
+ hwc2_config_t* outConfig) {
+
+ return HWC2_ERROR_NONE;
+}
+
+int32_t VirtualDevice::getChangedCompositionTypes(
+ uint32_t* outNumElements,
+ hwc2_layer_t* outLayers,
+ int32_t* /*hwc2_composition_t*/ outTypes) {
+ HwcLayer* layer = NULL;
+
+ // if outLayers or outTypes were NULL, the number of layers and types which would have been returned.
+ if (NULL == outLayers || NULL == outTypes) {
+ *outNumElements = mHwcLayersChangeType.size();
+ } else {
+ for (uint32_t i=0; i<mHwcLayersChangeType.size(); i++) {
+ hwc2_layer_t layerId = mHwcLayersChangeType.keyAt(i);
+ layer = mHwcLayersChangeType.valueAt(i);
+ if (layer) {
+ if (layer->getCompositionType() != HWC2_COMPOSITION_CLIENT) {
+ // change all other device type to client.
+ outLayers[i] = layerId;
+ outTypes[i] = HWC2_COMPOSITION_CLIENT;
+ continue;
+ }
+ }
+ }
+
+ if (mHwcLayersChangeType.size() > 0) {
+ DTRACE("There are %d layers type has changed.", mHwcLayersChangeType.size());
+ *outNumElements = mHwcLayersChangeType.size();
+ } else {
+ DTRACE("No layers compositon type changed.");
+ }
+ }
+
+ return HWC2_ERROR_NONE;
+}
+
+int32_t VirtualDevice::getClientTargetSupport(
+ uint32_t width,
+ uint32_t height,
+ int32_t /*android_pixel_format_t*/ format,
+ int32_t /*android_dataspace_t*/ dataspace) {
+
+ // TODO: ?
+ return HWC2_ERROR_NONE;
+}
+
+int32_t VirtualDevice::getColorModes(
+ uint32_t* outNumModes,
+ int32_t* /*android_color_mode_t*/ outModes) {
+ return HWC2_ERROR_NONE;
+}
+
+int32_t VirtualDevice::getDisplayAttribute(
+ hwc2_config_t config,
+ int32_t /*hwc2_attribute_t*/ attribute,
+ int32_t* outValue) {
+ Mutex::Autolock _l(mLock);
+
+ if (!mIsConnected) {
+ ETRACE("display %d is not connected.", mId);
+ }
+
+ // TODO: HWC2_ERROR_BAD_CONFIG?
+ switch (attribute) {
+ case HWC2_ATTRIBUTE_VSYNC_PERIOD:
+ *outValue = 1e9 / 60;
+ ETRACE("refresh period: %d", *outValue);
+ break;
+ case HWC2_ATTRIBUTE_WIDTH:
+ *outValue = 1280;
+ break;
+ case HWC2_ATTRIBUTE_HEIGHT:
+ *outValue = 720;
+ break;
+ case HWC2_ATTRIBUTE_DPI_X:
+ *outValue = 0;
+ break;
+ case HWC2_ATTRIBUTE_DPI_Y:
+ *outValue = 0;
+ break;
+ default:
+ ETRACE("unknown display attribute %u", attribute);
+ *outValue = -1;
+ break;
+ }
+
+ return HWC2_ERROR_NONE;
+}
+
+int32_t VirtualDevice::getDisplayConfigs(
+ uint32_t* outNumConfigs,
+ hwc2_config_t* outConfigs) {
+ Mutex::Autolock _l(mLock);
+
+ if (!mIsConnected) {
+ ETRACE("display %d is not connected.", mId);
+ }
+
+ if (NULL != outConfigs) outConfigs[0] = 0;
+ *outNumConfigs = 1;
+
+ return HWC2_ERROR_NONE;
+}
+
+int32_t VirtualDevice::getDisplayName(
+ uint32_t* outSize,
+ char* outName) {
+ return HWC2_ERROR_NONE;
+}
+
+int32_t VirtualDevice::getDisplayRequests(
+ int32_t* /*hwc2_display_request_t*/ outDisplayRequests,
+ uint32_t* outNumElements,
+ hwc2_layer_t* outLayers,
+ int32_t* /*hwc2_layer_request_t*/ outLayerRequests) {
+ *outNumElements = 0;
+
+ return HWC2_ERROR_NONE;
+}
+
+int32_t VirtualDevice::getDisplayType(
+ int32_t* /*hwc2_display_type_t*/ outType) {
+ if (!mIsConnected) {
+ ETRACE("display %d is not connected.", mId);
+ }
+
+ *outType = HWC2_DISPLAY_TYPE_VIRTUAL;
+ return HWC2_ERROR_NONE;
+}
+
+int32_t VirtualDevice::getDozeSupport(
+ int32_t* outSupport) {
+ return HWC2_ERROR_NONE;
+}
+
+int32_t VirtualDevice::getHdrCapabilities(
+ uint32_t* outNumTypes,
+ int32_t* /*android_hdr_t*/ outTypes,
+ float* outMaxLuminance,
+ float* outMaxAverageLuminance,
+ float* outMinLuminance) {
+ return HWC2_ERROR_NONE;
+}
+
+int32_t VirtualDevice::getReleaseFences(
+ uint32_t* outNumElements,
+ hwc2_layer_t* outLayers,
+ int32_t* outFences) {
+ HwcLayer* layer = NULL;
+ uint32_t num_layer = 0;
+
+ if (NULL == outLayers || NULL == outFences) {
+ for (uint32_t i=0; i<mHwcLayers.size(); i++) {
+ hwc2_layer_t layerId = mHwcLayers.keyAt(i);
+ layer = mHwcLayers.valueAt(i);
+ if (layer) num_layer++;
+ }
+ } else {
+ for (uint32_t i=0; i<mHwcLayers.size(); i++) {
+ hwc2_layer_t layerId = mHwcLayers.keyAt(i);
+ layer = mHwcLayers.valueAt(i);
+ if (layer) {
+ outLayers[num_layer] = layerId;
+ outFences[num_layer++] = layer->getAcquireFence();
+ // TODO: ?
+ layer->resetAcquireFence();
+ }
+ }
+ }
+
+ if (num_layer > 0) {
+ DTRACE("There are %d layer requests.", num_layer);
+ *outNumElements = num_layer;
+ } else {
+ DTRACE("No layer have set buffer yet.");
+ }
+
+ return HWC2_ERROR_NONE;
+}
+
+int32_t VirtualDevice::presentDisplay(
+ int32_t* outRetireFence) {
+ int32_t err = HWC2_ERROR_NONE;
+
+ // deal virtual display.
+ if (mIsConnected) {
+ if (!mVirtualHnd) {
+ ETRACE("virtual display handle is null.");
+ *outRetireFence = -1;
+ return HWC2_ERROR_NO_RESOURCES;
+ }
+ if (private_handle_t::validate(mVirtualHnd) < 0)
+ return HWC2_ERROR_NO_RESOURCES;
+
+ if (mTargetAcquireFence > -1) {
+ sync_wait(mTargetAcquireFence, 500);
+ close(mTargetAcquireFence);
+ mTargetAcquireFence = -1;
+ }
+ *outRetireFence = mVirtualReleaseFence;
+ }
+
+ return err;
+}
+
+int32_t VirtualDevice::setActiveConfig(
+ hwc2_config_t config) {
+ return HWC2_ERROR_NONE;
+}
+
+int32_t VirtualDevice::setClientTarget(
+ buffer_handle_t target,
+ int32_t acquireFence,
+ int32_t /*android_dataspace_t*/ dataspace,
+ hwc_region_t damage) {
+
+ if (target && private_handle_t::validate(target) < 0) {
+ return HWC2_ERROR_BAD_PARAMETER;
+ }
+
+ if (NULL != target) {
+ mClientTargetHnd = target;
+ mClientTargetDamageRegion = damage;
+ if (-1 != acquireFence) {
+ mTargetAcquireFence = acquireFence;
+ }
+ // TODO: HWC2_ERROR_BAD_PARAMETER && dataspace && damage.
+ } else {
+ DTRACE("client target is null!, no need to update this frame.");
+ }
+
+ return HWC2_ERROR_NONE;
+}
+
+int32_t VirtualDevice::setColorMode(
+ int32_t /*android_color_mode_t*/ mode) {
+ return HWC2_ERROR_NONE;
+}
+
+int32_t VirtualDevice::setColorTransform(
+ const float* matrix,
+ int32_t /*android_color_transform_t*/ hint) {
+ return HWC2_ERROR_NONE;
+}
+
+int32_t VirtualDevice::setPowerMode(
+ int32_t /*hwc2_power_mode_t*/ mode){
+ return HWC2_ERROR_NONE;
+}
+
+bool VirtualDevice::vsyncControl(bool enabled) {
+ RETURN_FALSE_IF_NOT_INIT();
+
+ return true;
+}
+
+int32_t VirtualDevice::validateDisplay(uint32_t* outNumTypes,
+ uint32_t* outNumRequests) {
+ HwcLayer* layer = NULL;
+
+ for (uint32_t i=0; i<mHwcLayers.size(); i++) {
+ hwc2_layer_t layerId = mHwcLayers.keyAt(i);
+ layer = mHwcLayers.valueAt(i);
+ if (layer) {
+ // Virtual Display.
+ if (mVirtualHnd && private_handle_t::validate(mVirtualHnd) >=0) {
+ if (layer->getCompositionType() != HWC2_COMPOSITION_CLIENT) {
+ // change all other device type to client.
+ mHwcLayersChangeType.add(layerId, layer);
+ continue;
+ }
+ }
+ }
+ }
+
+ // No requests.
+ *outNumRequests = 0;
+
+ if (mHwcLayersChangeType.size() > 0) {
+ DTRACE("there are %d layer types has changed.", mHwcLayersChangeType.size());
+ *outNumTypes = mHwcLayersChangeType.size();
+ return HWC2_ERROR_HAS_CHANGES;
+ }
+
+ return HWC2_ERROR_NONE;
+}
+
+int32_t VirtualDevice::setCursorPosition(
+ hwc2_layer_t layerId,
+ int32_t x,
+ int32_t y) {
+ Mutex::Autolock _l(mLock);
+ return HWC2_ERROR_NONE;
+}
+
+bool VirtualDevice::updateDisplayConfigs()
+{
+ Mutex::Autolock _l(mLock);
+ return true;
+}
+
+void VirtualDevice::onVsync(int64_t timestamp) {
+ // dont need implement now.
+}
+
+int32_t VirtualDevice::createVirtualDisplay(
+ uint32_t width,
+ uint32_t height,
+ int32_t* /*android_pixel_format_t*/ format,
+ hwc2_display_t* outDisplay) {
+ mIsConnected = true;
+ mWidth = width;
+ mHeight = height;
+ mFormat = *format;
+ mVirtualReleaseFence= -1;
+ *outDisplay = HWC_DISPLAY_VIRTUAL;
+
+ return HWC2_ERROR_NONE;
+}
+
+int32_t VirtualDevice::destroyVirtualDisplay(
+ hwc2_display_t display) {
+ if (display != HWC_DISPLAY_VIRTUAL) {
+ return HWC2_ERROR_BAD_PARAMETER;
+ }
+ mIsConnected = false;
+ mWidth = 0;
+ mHeight = 0;
+ mFormat = 0;
+ mVirtualReleaseFence = -1;
+
+ // TODO:
+ return HWC2_ERROR_NONE;
+}
+
+int32_t VirtualDevice::setOutputBuffer(
+ buffer_handle_t buffer, int32_t releaseFence) {
+ if (mIsConnected) {
+ if (buffer && private_handle_t::validate(buffer) < 0) {
+ ETRACE("buffer handle is invalid");
+ return HWC2_ERROR_BAD_PARAMETER;
+ }
+
+ if (NULL != buffer) {
+ /*mVirtualHnd = buffer;
+ mVirtualReleaseFence= releaseFence;
+ } else {*/
+ DTRACE("Virtual Display output buffer target is null!, no need to update this frame.");
+ }
+ }
+
+ mVirtualHnd = buffer;
+ mVirtualReleaseFence= releaseFence;
+ // TODO: do something?
+ return HWC2_ERROR_NONE;
+}
+
+
+void VirtualDevice::dump(Dump& d) {
+ Mutex::Autolock _l(mLock);
+ d.append("----------------------------------------------------------"
+ "---------------------------------------------------------------\n");
+ d.append("Device Name: %s (%s)\n", mName,
+ mIsConnected ? "connected" : "disconnected");
+
+ if (mIsConnected) {
+ d.append(" Layers state:\n");
+ d.append(" numLayers=%zu\n", mHwcLayers.size());
+ d.append(" numChangedTypeLayers=%zu\n", mHwcLayersChangeType.size());
+ if (mHwcLayers.size() > 0) {
+ d.append(
+ " type | handle | zorder | ds | alpa | tr | blnd |"
+ " source crop (l,t,r,b) | frame \n"
+ " -------------+----------+------------+----+------+----+------+"
+ "--------------------------------+------------------------\n");
+ for (uint32_t i=0; i<mHwcLayers.size(); i++) {
+ hwc2_layer_t layerId = mHwcLayers.keyAt(i);
+ HwcLayer *layer = mHwcLayers.valueAt(i);
+ if (layer) layer->dump(d);
+ }
+ }
+ }
+}
+
+} // namespace amlogic
+} // namespace android
diff --git a/hwc2/common/observers/SoftVsyncObserver.cpp b/hwc2/common/observers/SoftVsyncObserver.cpp
new file mode 100644
index 0000000..44cda76
--- a/dev/null
+++ b/hwc2/common/observers/SoftVsyncObserver.cpp
@@ -0,0 +1,149 @@
+/*
+// Copyright(c) 2016 Amlogic Corporation
+*/
+
+#include <HwcTrace.h>
+#include <SoftVsyncObserver.h>
+#include <IDisplayDevice.h>
+
+extern "C" int clock_nanosleep(clockid_t clock_id, int flags,
+ const struct timespec *request,
+ struct timespec *remain);
+
+
+namespace android {
+namespace amlogic {
+
+SoftVsyncObserver::SoftVsyncObserver(IDisplayDevice& disp)
+ : mDisplayDevice(disp),
+ mEnabled(false),
+ mRefreshRate(60), // default 60 frames per second
+ mRefreshPeriod(0),
+ mLock(),
+ mCondition(),
+ mNextFakeVSync(0),
+ mExitThread(false),
+ mInitialized(false)
+{
+}
+
+SoftVsyncObserver::~SoftVsyncObserver()
+{
+ WARN_IF_NOT_DEINIT();
+}
+
+bool SoftVsyncObserver::initialize()
+{
+ if (mInitialized) {
+ WTRACE("object has been initialized");
+ return true;
+ }
+
+ mExitThread = false;
+ mEnabled = false;
+ mRefreshRate = 60;
+ mRefreshPeriod = nsecs_t(1e9 / mRefreshRate);
+ mThread = new VsyncEventPollThread(this);
+ if (!mThread.get()) {
+ DEINIT_AND_RETURN_FALSE("failed to create vsync event poll thread.");
+ }
+ mThread->run("SoftVsyncObserver", PRIORITY_URGENT_DISPLAY);
+ mInitialized = true;
+ return true;
+}
+
+void SoftVsyncObserver::deinitialize()
+{
+ if (mEnabled) {
+ WTRACE("soft vsync is still enabled");
+ control(false);
+ }
+
+ mExitThread = true;
+ mCondition.signal();
+
+ if (mThread.get()) {
+ mThread->requestExitAndWait();
+ mThread = NULL;
+ }
+ mInitialized = false;
+}
+
+void SoftVsyncObserver::setRefreshRate(int rate)
+{
+ Mutex::Autolock _l(mLock);
+
+ if (rate < 1 || rate > 120) {
+ WTRACE("invalid refresh rate %d", rate);
+ } else if (mRefreshRate != rate) {
+ mRefreshRate = rate;
+ if (mEnabled) {
+ mRefreshPeriod = nsecs_t(1e9 / mRefreshRate);
+ mNextFakeVSync = systemTime(CLOCK_MONOTONIC) + mRefreshPeriod;
+ }
+ }
+}
+
+bool SoftVsyncObserver::control(bool enabled)
+{
+ Mutex::Autolock _l(mLock);
+
+ if (enabled == mEnabled) {
+ WTRACE("vsync state %d is not changed", enabled);
+ return true;
+ }
+
+ if (enabled) {
+ mRefreshPeriod = nsecs_t(1e9 / mRefreshRate);
+ mNextFakeVSync = systemTime(CLOCK_MONOTONIC) + mRefreshPeriod;
+ }
+ mEnabled = enabled;
+ mCondition.signal();
+ return true;
+}
+
+bool SoftVsyncObserver::threadLoop()
+{
+ { // scope for lock
+ Mutex::Autolock _l(mLock);
+ while (!mEnabled) {
+ mCondition.wait(mLock);
+ if (mExitThread) {
+ ITRACE("exiting thread loop");
+ return false;
+ }
+ }
+ }
+
+
+ const nsecs_t period = mRefreshPeriod;
+ const nsecs_t now = systemTime(CLOCK_MONOTONIC);
+ nsecs_t next_vsync = mNextFakeVSync;
+ nsecs_t sleep = next_vsync - now;
+ if (sleep < 0) {
+ // we missed, find where the next vsync should be
+ sleep = (period - ((now - next_vsync) % period));
+ next_vsync = now + sleep;
+ }
+ mNextFakeVSync = next_vsync + period;
+
+ struct timespec spec;
+ spec.tv_sec = next_vsync / 1000000000;
+ spec.tv_nsec = next_vsync % 1000000000;
+
+ int err;
+ do {
+ err = clock_nanosleep(CLOCK_MONOTONIC, TIMER_ABSTIME, &spec, NULL);
+ } while (err < 0 && errno == EINTR);
+
+
+ if (err == 0) {
+ mDisplayDevice.onVsync(next_vsync);
+ }
+
+ return true;
+}
+
+} // namespace amlogic
+} // namesapce android
+
diff --git a/hwc2/common/observers/SoftVsyncObserver.h b/hwc2/common/observers/SoftVsyncObserver.h
new file mode 100644
index 0000000..027e8e3
--- a/dev/null
+++ b/hwc2/common/observers/SoftVsyncObserver.h
@@ -0,0 +1,49 @@
+/*
+// Copyright(c) 2016 Amlogic Corporation
+*/
+
+#ifndef SOFT_VSYNC_OBSERVER_H
+#define SOFT_VSYNC_OBSERVER_H
+
+#include <SimpleThread.h>
+
+namespace android {
+namespace amlogic {
+
+class IDisplayDevice;
+
+class SoftVsyncObserver {
+public:
+ SoftVsyncObserver(IDisplayDevice& disp);
+ virtual ~SoftVsyncObserver();
+
+public:
+ virtual bool initialize();
+ virtual void deinitialize();
+ virtual void setRefreshRate(int rate);
+ virtual bool control(bool enabled);
+ virtual nsecs_t getRefreshPeriod() const { return mRefreshPeriod; }
+
+private:
+ IDisplayDevice& mDisplayDevice;
+ int mDevice;
+ bool mEnabled;
+ int mRefreshRate;
+ nsecs_t mRefreshPeriod;
+ mutable Mutex mLock;
+ Condition mCondition;
+ mutable nsecs_t mNextFakeVSync;
+ bool mExitThread;
+ bool mInitialized;
+
+private:
+ DECLARE_THREAD(VsyncEventPollThread, SoftVsyncObserver);
+};
+
+} // namespace amlogic
+} // namespace android
+
+
+
+#endif /* SOFT_VSYNC_OBSERVER_H */
+
diff --git a/hwc2/common/observers/UeventObserver.cpp b/hwc2/common/observers/UeventObserver.cpp
new file mode 100644
index 0000000..8d8b81a
--- a/dev/null
+++ b/hwc2/common/observers/UeventObserver.cpp
@@ -0,0 +1,204 @@
+/*
+// Copyright(c) 2016 Amlogic Corporation
+*/
+
+#include <poll.h>
+#include <sys/socket.h>
+#include <sys/un.h>
+#include <sys/queue.h>
+#include <linux/netlink.h>
+#include <sys/types.h>
+#include <unistd.h>
+#include <HwcTrace.h>
+#include <UeventObserver.h>
+#include <Utils.h>
+
+namespace android {
+namespace amlogic {
+
+UeventObserver::UeventObserver()
+ : mUeventFd(-1),
+ mExitRDFd(-1),
+ mExitWDFd(-1),
+ mListeners()
+{
+}
+
+UeventObserver::~UeventObserver()
+{
+ deinitialize();
+}
+
+bool UeventObserver::initialize()
+{
+ mListeners.clear();
+
+ if (mUeventFd != -1) {
+ return true;
+ }
+
+ mThread = new UeventObserverThread(this);
+ if (!mThread.get()) {
+ ETRACE("failed to create uevent observer thread");
+ return false;
+ }
+
+ // init uevent socket
+ struct sockaddr_nl addr;
+ // set the socket receive buffer to 64K
+ // NOTE: this is only called for once
+ int sz = 64 * 1024;
+
+ memset(&addr, 0, sizeof(addr));
+ addr.nl_family = AF_NETLINK;
+ addr.nl_pid = pthread_self() | getpid();
+ addr.nl_groups = 0xffffffff;
+
+ mUeventFd = socket(PF_NETLINK, SOCK_DGRAM, NETLINK_KOBJECT_UEVENT);
+ if (mUeventFd < 0) {
+ DEINIT_AND_RETURN_FALSE("failed to create uevent socket");
+ }
+
+ if (setsockopt(mUeventFd, SOL_SOCKET, SO_RCVBUFFORCE, &sz, sizeof(sz))) {
+ WTRACE("setsockopt() failed");
+ //return false;
+ }
+
+ if (bind(mUeventFd, (struct sockaddr *) &addr, sizeof(addr)) < 0) {
+ DEINIT_AND_RETURN_FALSE("failed to bind scoket");
+ return false;
+ }
+
+ memset(mUeventMessage, 0, UEVENT_MSG_LEN);
+
+ int exitFds[2];
+ if (pipe(exitFds) < 0) {
+ ETRACE("failed to make pipe");
+ deinitialize();
+ return false;
+ }
+ mExitRDFd = exitFds[0];
+ mExitWDFd = exitFds[1];
+
+ return true;
+}
+
+void UeventObserver::deinitialize()
+{
+ if (mUeventFd != -1) {
+ if (mExitWDFd != -1) {
+ close(mExitWDFd);
+ mExitWDFd = -1;
+ }
+ close(mUeventFd);
+ mUeventFd = -1;
+ }
+
+ if (mThread.get()) {
+ mThread->requestExitAndWait();
+ mThread = NULL;
+ }
+
+ while (!mListeners.isEmpty()) {
+ UeventListener *listener = mListeners.valueAt(0);
+ mListeners.removeItemsAt(0);
+ delete listener;
+ }
+}
+
+void UeventObserver::start()
+{
+ if (mThread.get()) {
+ mThread->run("UeventObserver", PRIORITY_URGENT_DISPLAY);
+ }
+}
+
+
+void UeventObserver::registerListener(const char *event, UeventListenerFunc func, void *data)
+{
+ if (!event || !func) {
+ ETRACE("invalid event string or listener to register");
+ return;
+ }
+
+ String8 key(event);
+ if (mListeners.indexOfKey(key) >= 0) {
+ ETRACE("listener for uevent %s exists", event);
+ return;
+ }
+
+ UeventListener *listener = new UeventListener;
+ if (!listener) {
+ ETRACE("failed to create Uevent Listener");
+ return;
+ }
+ listener->func = func;
+ listener->data = data;
+
+ mListeners.add(key, listener);
+}
+
+bool UeventObserver::threadLoop()
+{
+ if (mUeventFd == -1) {
+ ETRACE("invalid uEvent file descriptor");
+ return false;
+ }
+
+ struct pollfd fds[2];
+ int nr;
+
+ fds[0].fd = mUeventFd;
+ fds[0].events = POLLIN;
+ fds[0].revents = 0;
+ fds[1].fd = mExitRDFd;
+ fds[1].events = POLLIN;
+ fds[1].revents = 0;
+ nr = poll(fds, 2, -1);
+
+ if (nr > 0 && fds[0].revents == POLLIN) {
+ int count = recv(mUeventFd, mUeventMessage, UEVENT_MSG_LEN - 2, 0);
+ if (count > 0) {
+ onUevent();
+ }
+ } else if (fds[1].revents) {
+ close(mExitRDFd);
+ mExitRDFd = -1;
+ ITRACE("exiting wait");
+ return false;
+ }
+ // always looping
+ return true;
+}
+
+void UeventObserver::onUevent()
+{
+ char *msg = mUeventMessage;
+ const char *envelope = Utils::getUeventEnvelope();
+ ETRACE("onUevent: %s", mUeventMessage);
+ if (strncmp(msg, envelope, strlen(envelope)) != 0)
+ return;
+
+ msg += strlen(msg) + 1;
+
+ UeventListener *listener;
+ String8 key;
+ while (*msg) {
+ key = String8(msg);
+ ETRACE("received Uevent: %s", msg);
+ if (mListeners.indexOfKey(key) >= 0) {
+ DTRACE("received Uevent: %s", msg);
+ listener = mListeners.valueFor(key);
+ if (listener) {
+ listener->func(listener->data);
+ } else {
+ ETRACE("no listener for uevent %s", msg);
+ }
+ }
+ msg += strlen(msg) + 1;
+ }
+}
+
+} // namespace intel
+} // namespace android
+
diff --git a/hwc2/common/utils/Dump.cpp b/hwc2/common/utils/Dump.cpp
new file mode 100644
index 0000000..e9809bd
--- a/dev/null
+++ b/hwc2/common/utils/Dump.cpp
@@ -0,0 +1,42 @@
+/*
+// Copyright (c) 2016 Amlogic Corporation
+*/
+
+#include <stdarg.h>
+#include <stdio.h>
+
+#include <Dump.h>
+
+namespace android {
+namespace amlogic {
+
+Dump::Dump(char *buf, int len)
+ : mBuf(buf),
+ mLen(len)
+{
+
+}
+
+Dump::~Dump()
+{
+
+}
+
+void Dump::append(const char *fmt, ...)
+{
+ int len;
+
+ if (!mBuf || !mLen)
+ return;
+
+ va_list ap;
+ va_start(ap, fmt);
+ len = vsnprintf(mBuf, mLen, fmt, ap);
+ va_end(ap);
+
+ mLen -= len;
+ mBuf += len;
+}
+
+} // namespace amlogic
+} // namespace android
diff --git a/hwc2/common/utils/Dump.h b/hwc2/common/utils/Dump.h
new file mode 100644
index 0000000..7f97317
--- a/dev/null
+++ b/hwc2/common/utils/Dump.h
@@ -0,0 +1,23 @@
+/*
+// Copyright (c) 2016 Amlogic Corporation
+*/
+#ifndef DUMP_H_
+#define DUMP_H_
+
+namespace android {
+namespace amlogic {
+
+class Dump {
+public:
+ Dump(char *buf, int len);
+ ~Dump();
+
+ void append(const char *fmt, ...);
+private:
+ char *mBuf;
+ int mLen;
+};
+
+} // namespace amlogic
+} // namespace android
+#endif /* DUMP_H_ */
diff --git a/hwc2/common/utils/HwcTrace.h b/hwc2/common/utils/HwcTrace.h
new file mode 100644
index 0000000..6041cf2
--- a/dev/null
+++ b/hwc2/common/utils/HwcTrace.h
@@ -0,0 +1,111 @@
+/*
+// Copyright(c) 2016 Amlogic Corporation
+*/
+#ifndef HWC_TRACE_H
+#define HWC_TRACE_H
+
+#define LOG_TAG "hwcomposer"
+//#define LOG_NDEBUG 0
+#include <cutils/log.h>
+
+
+#ifdef _cplusplus
+extern "C" {
+#endif
+
+//#define DEBUG
+#ifdef DEBUG
+// Helper to automatically preappend classname::functionname to the log message
+#define VTRACE(fmt,...) ALOGV("%s: " fmt, __func__, ##__VA_ARGS__)
+#define DTRACE(fmt,...) ALOGD("%s: " fmt, __func__, ##__VA_ARGS__)
+#define ITRACE(fmt,...) ALOGI("%s: " fmt, __func__, ##__VA_ARGS__)
+#define WTRACE(fmt,...) ALOGW("%s: " fmt, __func__, ##__VA_ARGS__)
+#else
+#define VTRACE(fmt,...) ((void)0)
+#define DTRACE(fmt,...) ((void)0)
+#define ITRACE(fmt,...) ((void)0)
+#define WTRACE(fmt,...) ((void)0)
+#endif
+#define ETRACE(fmt,...) ALOGE("%s: " fmt, __func__, ##__VA_ARGS__)
+
+
+// Function call tracing
+#if 0
+#define CTRACE() ALOGV("Calling %s", __func__)
+#define XTRACE() ALOGV("Leaving %s", __func__)
+#else
+#define CTRACE() ((void)0)
+#define XTRACE() ((void)0)
+#endif
+
+
+// Arguments tracing
+#if 0
+#define ATRACE(fmt,...) ALOGV("%s(args): "fmt, __func__, ##__VA_ARGS__);
+#else
+#define ATRACE(fmt,...) ((void)0)
+#endif
+
+
+
+// Helper to abort the execution if object is not initialized.
+// This should never happen if the rules below are followed during design:
+// 1) Create an object.
+// 2) Initialize the object immediately.
+// 3) If failed, delete the object.
+// These helpers should be disabled and stripped out of release build
+
+#define RETURN_X_IF_NOT_INIT(X) \
+do { \
+ CTRACE(); \
+ if (false == mInitialized) { \
+ LOG_ALWAYS_FATAL("%s: Object is not initialized! Line = %d", __func__, __LINE__); \
+ return X; \
+ } \
+} while (0)
+
+#if 1
+#define RETURN_FALSE_IF_NOT_INIT() RETURN_X_IF_NOT_INIT(false)
+#define RETURN_VOID_IF_NOT_INIT() RETURN_X_IF_NOT_INIT()
+#define RETURN_NULL_IF_NOT_INIT() RETURN_X_IF_NOT_INIT(0)
+#else
+#define RETURN_FALSE_IF_NOT_INIT() ((void)0)
+#define RETURN_VOID_IF_NOT_INIT() ((void)0)
+#define RETURN_NULL_IF_NOT_INIT() ((void)0)
+#endif
+
+#define DISPLAY_INVALID(dpy) \
+ if (dpy > IDisplayDevice::DEVICE_VIRTUAL || dpy < IDisplayDevice::DEVICE_PRIMARY) \
+ return HWC2_ERROR_BAD_DISPLAY
+
+// Helper to log error message, call de-initializer and return false.
+#define DEINIT_AND_RETURN_FALSE(...) \
+do { \
+ ETRACE(__VA_ARGS__); \
+ deinitialize(); \
+ return false; \
+} while (0)
+
+
+#define DEINIT_AND_DELETE_OBJ(X) \
+ if (X) {\
+ X->deinitialize();\
+ delete X; \
+ X = NULL; \
+ }
+
+
+#define WARN_IF_NOT_DEINIT() \
+ CTRACE(); \
+ if (mInitialized) {\
+ LOG_ALWAYS_FATAL("%s: Object is not deinitialized! Line = %d", __func__, __LINE__); \
+ }
+
+
+// _cplusplus
+#ifdef _cplusplus
+}
+#endif
+
+
+#endif /* HWC_TRACE_H */
diff --git a/hwc2/common/utils/Utils.cpp b/hwc2/common/utils/Utils.cpp
new file mode 100644
index 0000000..b2eed85
--- a/dev/null
+++ b/hwc2/common/utils/Utils.cpp
@@ -0,0 +1,165 @@
+/*
+// Copyright(c) 2016 Amlogic Corporation
+*/
+
+#include <hardware/hardware.h>
+
+#include <HwcTrace.h>
+#include <fcntl.h>
+#include <stdlib.h>
+#include <errno.h>
+#include <cutils/properties.h>
+#include <hardware/hwcomposer2.h>
+
+#include <Utils.h>
+
+namespace android {
+namespace amlogic {
+
+Utils::Utils()
+{
+
+}
+
+Utils::~Utils()
+{
+
+}
+
+bool Utils::checkBoolProp(const char* prop) {
+ char val[PROPERTY_VALUE_MAX];
+
+ memset(val, 0, sizeof(val));
+ if (property_get(prop, val, "false") && strcmp(val, "true") == 0) {
+ ALOGD("prop: %s is %s",prop, val);
+ return true;
+ }
+
+ return false;
+}
+
+int32_t Utils::checkIntProp(const char* prop) {
+ char val[PROPERTY_VALUE_MAX];
+
+ memset(val, 0, sizeof(val));
+ if (property_get(prop, val, "2")) {
+ //ALOGV("prop: %s is %s",prop, val);
+ return atoi(val);
+ }
+ return 0;
+}
+
+int32_t Utils::checkAndDupFence(int32_t fence) {
+ if (fence < 0) {
+ ETRACE("not a vliad fence %d",fence);
+ return -1;
+ }
+
+ int32_t dup_fence = dup(fence);
+ if (dup_fence < 0) {
+ ETRACE("fence dup failed: %s", strerror(errno));
+ }
+
+ return dup_fence;
+}
+
+#if WITH_LIBPLAYER_MODULE
+bool Utils::checkSysfsStatus(const char* sysfstr, char* lastr, int32_t size) {
+ char val[32];
+ char *p = lastr;
+
+ memset(val, 0, sizeof(val));
+ if (amsysfs_get_sysfs_str(sysfstr, val, sizeof(val)) == 0) {
+ DTRACE("val: %s, lastr: %s",val, p);
+ if ((strcmp(val, p) != 0)) {
+ memset(p, 0, size);
+ strcpy(p, val);
+ return true;
+ }
+ }
+
+ return false;
+}
+#endif
+
+bool Utils::checkOutputMode(char* curmode, int32_t* rate) {
+ int32_t modefd = open(SYSFS_DISPLAY_MODE, O_RDONLY);
+ if (modefd < 0) {
+ ETRACE("open (%s) fail", SYSFS_DISPLAY_MODE);
+ return -1;
+ }
+
+ char outputmode[32] = {0};
+ read(modefd, outputmode, 31);
+ close(modefd);
+ modefd = -1;
+
+ *rate = 60;
+ if (strstr(outputmode, "50hz") != NULL) {
+ *rate = 50;
+ } else if (strstr(outputmode, "30hz") != NULL) {
+ *rate = 30;
+ } else if (strstr(outputmode, "25hz") != NULL) {
+ *rate = 25;
+ } else if ((strstr(outputmode, "24hz") != NULL) || (strstr(outputmode, "smpte") != NULL)) {
+ *rate = 24;
+ } else
+ DTRACE("displaymode (%s) doesn't specify HZ", curmode);
+
+ //check if need update vsync.
+ if (strcmp(outputmode, curmode) == 0) {
+ DTRACE("outputmode didn't change %s", curmode);
+ return false;
+ }
+
+ strcpy(curmode, outputmode);
+ DTRACE("get new outputmode (%s) new period (%d)", curmode, rate);
+ return true;
+}
+
+bool Utils::checkVinfo(framebuffer_info_t *fbinfo) {
+ if (fbinfo != NULL && fbinfo->fd >= 0) {
+ struct fb_var_screeninfo vinfo;
+ if (ioctl(fbinfo->fd, FBIOGET_VSCREENINFO, &vinfo) == -1)
+ {
+ ALOGE("FBIOGET_VSCREENINFO error!!!");
+ return -errno;
+ }
+
+ if (vinfo.xres != fbinfo->info.xres
+ || vinfo.yres != fbinfo->info.yres
+ || vinfo.width != fbinfo->info.width
+ || vinfo.height != fbinfo->info.height) {
+ if (int32_t(vinfo.width) <= 16 || int32_t(vinfo.height) <= 9) {
+ // the driver doesn't return that information
+ // default to 160 dpi
+ vinfo.width = ((vinfo.xres * 25.4f)/160.0f + 0.5f);
+ vinfo.height = ((vinfo.yres * 25.4f)/160.0f + 0.5f);
+ }
+ fbinfo->xdpi = (vinfo.xres * 25.4f) / vinfo.width;
+ fbinfo->ydpi = (vinfo.yres * 25.4f) / vinfo.height;
+
+ fbinfo->info.xres = vinfo.xres;
+ fbinfo->info.yres = vinfo.yres;
+ fbinfo->info.width = vinfo.width;
+ fbinfo->info.height = vinfo.height;
+
+ return true;
+ }
+ }
+
+ return false;
+}
+
+const char* Utils::getUeventEnvelope()
+{
+ return "change@/devices/virtual/switch/hdmi_audio";
+}
+
+const char* Utils::getHotplugString()
+{
+ return "SWITCH_STATE=1";
+}
+
+} // namespace amlogic
+} // namespace android
diff --git a/hwc2/common/utils/Utils.h b/hwc2/common/utils/Utils.h
new file mode 100644
index 0000000..fc993a6
--- a/dev/null
+++ b/hwc2/common/utils/Utils.h
@@ -0,0 +1,45 @@
+/*
+// Copyright(c) 2016 Amlogic Corporation
+*/
+
+#ifndef UTILS_H_
+#define UTILS_H_
+
+#include <gralloc_priv.h>
+#if WITH_LIBPLAYER_MODULE
+#include <Amavutils.h>
+#endif
+
+#define SYSFS_AMVIDEO_CURIDX "/sys/module/amvideo/parameters/cur_dev_idx"
+#define SYSFS_DISPLAY_MODE "/sys/class/display/mode"
+#define SYSFS_FB0_FREE_SCALE "/sys/class/graphics/fb0/free_scale"
+#define SYSFS_FB1_FREE_SCALE "/sys/class/graphics/fb0/free_scale"
+#define SYSFS_VIDEO_AXIS "/sys/class/video/axis"
+#define SYSFS_VIDEOBUFUSED "/sys/class/amstream/videobufused"
+#define SYSFS_WINDOW_AXIS "/sys/class/graphics/fb0/window_axis"
+
+namespace android {
+namespace amlogic {
+
+class Utils {
+public:
+ Utils();
+ ~Utils();
+ static bool checkBoolProp(const char* prop);
+ static int32_t checkIntProp(const char* prop);
+ static int32_t checkAndDupFence(int32_t fence);
+#if WITH_LIBPLAYER_MODULE
+ static bool checkSysfsStatus(const char* sysfstr, char* lastr, int32_t size);
+#endif
+ static bool checkOutputMode(char* curmode, int32_t* rate);
+
+ static bool checkVinfo(framebuffer_info_t *fbinfo);
+
+ static const char* getUeventEnvelope();
+ static const char* getHotplugString();
+
+};
+
+} // namespace amlogic
+} // namespace android
+#endif /* UTILS_H_ */
diff --git a/hwc2/include/ExternalDevice.h b/hwc2/include/ExternalDevice.h
new file mode 100644
index 0000000..346005b
--- a/dev/null
+++ b/hwc2/include/ExternalDevice.h
@@ -0,0 +1,53 @@
+/*
+// Copyright (c) 2016 Amlogic Corporation
+*/
+#ifndef EXTERNAL_DEVICE_H
+#define EXTERNAL_DEVICE_H
+
+#include <PhysicalDevice.h>
+#include <IHdcpControl.h>
+#include <SimpleThread.h>
+
+namespace android {
+namespace amlogic {
+
+
+class ExternalDevice : public PhysicalDevice {
+
+public:
+ ExternalDevice(Hwcomposer& hwc, DeviceControlFactory* controlFactory);
+ virtual ~ExternalDevice();
+public:
+ virtual bool initialize();
+ virtual void deinitialize();
+ virtual bool setDrmMode(drmModeModeInfo& value);
+ virtual void setRefreshRate(int hz);
+ virtual int getActiveConfig();
+ virtual bool setActiveConfig(int index);
+ int getRefreshRate();
+
+private:
+ static void HdcpLinkStatusListener(bool success, void *userData);
+ void HdcpLinkStatusListener(bool success);
+ void setDrmMode();
+protected:
+ IHdcpControl *mHdcpControl;
+
+private:
+ static void hotplugEventListener(void *data);
+ void hotplugListener();
+
+private:
+ Condition mAbortModeSettingCond;
+ drmModeModeInfo mPendingDrmMode;
+ bool mHotplugEventPending;
+ int mExpectedRefreshRate;
+
+private:
+ DECLARE_THREAD(ModeSettingThread, ExternalDevice);
+};
+
+}
+}
+
+#endif /* EXTERNAL_DEVICE_H */
diff --git a/hwc2/include/Hwcomposer.h b/hwc2/include/Hwcomposer.h
new file mode 100644
index 0000000..cec6e74
--- a/dev/null
+++ b/hwc2/include/Hwcomposer.h
@@ -0,0 +1,143 @@
+/*
+// Copyright(c) 2016 Amlogic Corporation
+*/
+#ifndef HWCOMPOSER_H
+#define HWCOMPOSER_H
+
+#include <EGL/egl.h>
+#include <hardware/hwcomposer2.h>
+#include <utils/Vector.h>
+
+#include <IDisplayDevice.h>
+#include <VsyncManager.h>
+#include <UeventObserver.h>
+#include <IPlatFactory.h>
+#include <gralloc_priv.h>
+
+namespace android {
+namespace amlogic {
+
+class Hwcomposer : public hwc2_device_t {
+public:
+ virtual ~Hwcomposer();
+public:
+ virtual int32_t createVirtualDisplay(uint32_t width, uint32_t height,
+ int32_t* /*android_pixel_format_t*/ format, hwc2_display_t* outDisplay);
+
+ virtual int32_t destroyVirtualDisplay(hwc2_display_t display);
+ virtual void dump(uint32_t* outSize, char* outBuffer);
+ virtual uint32_t getMaxVirtualDisplayCount();
+ virtual int32_t registerCallback(int32_t /*hwc2_callback_descriptor_t*/ descriptor,
+ hwc2_callback_data_t callbackData, hwc2_function_pointer_t pointer);
+ virtual int32_t acceptDisplayChanges(hwc2_display_t display);
+ virtual int32_t createLayer(hwc2_display_t display, hwc2_layer_t* outLayer);
+ virtual int32_t destroyLayer(hwc2_display_t display, hwc2_layer_t layer);
+ virtual int32_t getActiveConfig(hwc2_display_t display,hwc2_config_t* outConfig);
+ virtual int32_t getChangedCompositionTypes(hwc2_display_t display,
+ uint32_t* outNumElements, hwc2_layer_t* outLayers,
+ int32_t* /*hwc2_composition_t*/ outTypes);
+ virtual int32_t getClientTargetSupport(hwc2_display_t display, uint32_t width,
+ uint32_t height, int32_t /*android_pixel_format_t*/ format,
+ int32_t /*android_dataspace_t*/ dataspace);
+ virtual int32_t getColorModes(hwc2_display_t display, uint32_t* outNumModes,
+ int32_t* /*android_color_mode_t*/ outModes);
+ virtual int32_t getDisplayAttribute(hwc2_display_t display, hwc2_config_t config,
+ int32_t /*hwc2_attribute_t*/ attribute, int32_t* outValue);
+ virtual int32_t getDisplayConfigs(hwc2_display_t display, uint32_t* outNumConfigs, hwc2_config_t* outConfigs);
+ virtual int32_t getDisplayName(hwc2_display_t display, uint32_t* outSize,char* outName);
+ virtual int32_t getDisplayRequests(hwc2_display_t display, int32_t* /*hwc2_display_request_t*/ outDisplayRequests,
+ uint32_t* outNumElements, hwc2_layer_t* outLayers, int32_t* /*hwc2_layer_request_t*/ outLayerRequests);
+ virtual int32_t getDisplayType(hwc2_display_t display, int32_t* /*hwc2_display_type_t*/ outType);
+ virtual int32_t getDozeSupport(hwc2_display_t display, int32_t* outSupport);
+ virtual int32_t getHdrCapabilities(hwc2_display_t display, uint32_t* outNumTypes,
+ int32_t* /*android_hdr_t*/ outTypes, float* outMaxLuminance,
+ float* outMaxAverageLuminance, float* outMinLuminance);
+ virtual int32_t getReleaseFences(hwc2_display_t display, uint32_t* outNumElements, hwc2_layer_t* outLayers, int32_t* outFences);
+ virtual int32_t presentDisplay(hwc2_display_t display, int32_t* outRetireFence);
+ virtual int32_t setActiveConfig(hwc2_display_t display, hwc2_config_t config);
+ virtual int32_t setClientTarget(hwc2_display_t display, buffer_handle_t target,
+ int32_t acquireFence, int32_t /*android_dataspace_t*/ dataspace, hwc_region_t damage);
+ virtual int32_t setColorMode(hwc2_display_t display, int32_t /*android_color_mode_t*/ mode);
+ virtual int32_t setColorTransform(hwc2_display_t display, const float* matrix, int32_t /*android_color_transform_t*/ hint);
+ virtual int32_t setOutputBuffer(hwc2_display_t display, buffer_handle_t buffer, int32_t releaseFence);
+ virtual int32_t setPowerMode(hwc2_display_t display, int32_t /*hwc2_power_mode_t*/ mode);
+ virtual int32_t setVsyncEnabled(hwc2_display_t display, int32_t /*hwc2_vsync_t*/ enabled);
+ virtual int32_t validateDisplay(hwc2_display_t display, uint32_t* outNumTypes, uint32_t* outNumRequests);
+ virtual int32_t setCursorPosition(hwc2_display_t display, hwc2_layer_t layer, int32_t x, int32_t y);
+ virtual int32_t setLayerBuffer(hwc2_display_t display, hwc2_layer_t layer, buffer_handle_t buffer, int32_t acquireFence);
+ virtual int32_t setLayerSurfaceDamage(hwc2_display_t display, hwc2_layer_t layer, hwc_region_t damage);
+ virtual int32_t setLayerBlendMode(hwc2_display_t display, hwc2_layer_t layer, int32_t /*hwc2_blend_mode_t*/ mode);
+ virtual int32_t setLayerColor(hwc2_display_t display, hwc2_layer_t layer, hwc_color_t color);
+ virtual int32_t setLayerCompositionType(hwc2_display_t display, hwc2_layer_t layer, int32_t /*hwc2_composition_t*/ type);
+ virtual int32_t setLayerDataspace(hwc2_display_t display, hwc2_layer_t layer, int32_t /*android_dataspace_t*/ dataspace);
+ virtual int32_t setLayerDisplayFrame(hwc2_display_t display, hwc2_layer_t layer, hwc_rect_t frame);
+ virtual int32_t setLayerPlaneAlpha(hwc2_display_t display, hwc2_layer_t layer, float alpha);
+ virtual int32_t setLayerSidebandStream(hwc2_display_t display, hwc2_layer_t layer, const native_handle_t* stream);
+ virtual int32_t setLayerSourceCrop(hwc2_display_t display, hwc2_layer_t layer, hwc_frect_t crop);
+ virtual int32_t setLayerTransform(hwc2_display_t display, hwc2_layer_t layer, int32_t /*hwc_transform_t*/ transform);
+ virtual int32_t setLayerVisibleRegion(hwc2_display_t display, hwc2_layer_t layer, hwc_region_t visible);
+ virtual int32_t setLayerZOrder(hwc2_display_t display, hwc2_layer_t layer, uint32_t z);
+
+ // callbacks
+ virtual void vsync(int disp, int64_t timestamp);
+ virtual void hotplug(int disp, bool connected);
+ virtual void refresh(int disp);
+ virtual bool release();
+
+ virtual bool initCheck() const;
+ virtual bool initialize(private_module_t *grallocModule);
+ virtual void deinitialize();
+
+public:
+ VsyncManager* getVsyncManager();
+ private_module_t* getGrallocModule();
+
+ IDisplayDevice* getDisplayDevice(int disp);
+ UeventObserver* getUeventObserver();
+ IPlatFactory* getPlatFactory() {return mPlatFactory;}
+
+ void (*pfnHotplug)(hwc2_callback_data_t, hwc2_display_t, int32_t);
+ void (*pfnRefresh)(hwc2_callback_data_t, hwc2_display_t);
+ void (*pfnVsync)(hwc2_callback_data_t, hwc2_display_t, int64_t);
+
+protected:
+ Hwcomposer(IPlatFactory *factory);
+
+public:
+ static Hwcomposer& getInstance() {
+ Hwcomposer *instance = sInstance;
+ if (instance == 0) {
+ instance = createHwcomposer();
+ sInstance = instance;
+ }
+ return *sInstance;
+ }
+ static void releaseInstance() {
+ delete sInstance;
+ sInstance = NULL;
+ }
+ // Need to be implemented
+ static Hwcomposer* createHwcomposer();
+
+private:
+ hwc2_callback_data_t hotplug_cb_data;
+ hwc2_callback_data_t refresh_cb_data;
+ hwc2_callback_data_t vsync_cb_data;
+
+ // plugin through set
+ IPlatFactory *mPlatFactory;
+ VsyncManager *mVsyncManager;
+ private_module_t *mGrallocModule;
+ UeventObserver *mUeventObserver;
+
+ Vector<IDisplayDevice*> mDisplayDevices;
+
+ bool mInitialized;
+
+ static Hwcomposer *sInstance;
+};
+
+} // namespace amlogic
+}
+
+#endif /*HW_COMPOSER_H*/
diff --git a/hwc2/include/IDisplayDevice.h b/hwc2/include/IDisplayDevice.h
new file mode 100644
index 0000000..fa297f4
--- a/dev/null
+++ b/hwc2/include/IDisplayDevice.h
@@ -0,0 +1,128 @@
+/*
+// Copyright(c) 2016 Amlogic Corporation
+*/
+#ifndef IDISPLAY_DEVICE_H
+#define IDISPLAY_DEVICE_H
+
+#include <Dump.h>
+#include <hardware/hwcomposer2.h>
+#include <Hwcomposer.h>
+#include <HwcLayer.h>
+
+namespace android {
+namespace amlogic {
+
+// display config
+class DisplayConfig {
+public:
+ DisplayConfig(int rr, int w, int h, int dpix, int dpiy)
+ : mRefreshRate(rr),
+ mWidth(w),
+ mHeight(h),
+ mDpiX(dpix),
+ mDpiY(dpiy)
+ {}
+public:
+ int getRefreshRate() const { return mRefreshRate; }
+ int getWidth() const { return mWidth; }
+ int getHeight() const { return mHeight; }
+ int getDpiX() const { return mDpiX; }
+ int getDpiY() const { return mDpiY; }
+private:
+ int mRefreshRate;
+ int mWidth;
+ int mHeight;
+ int mDpiX;
+ int mDpiY;
+};
+
+
+// display device interface
+class IDisplayDevice {
+public:
+ // display device type
+ enum {
+ DEVICE_PRIMARY = HWC_DISPLAY_PRIMARY,
+ DEVICE_EXTERNAL = HWC_DISPLAY_EXTERNAL,
+ DEVICE_VIRTUAL = HWC_DISPLAY_VIRTUAL,
+ DEVICE_COUNT,
+ };
+ enum {
+ DEVICE_DISCONNECTED = 0,
+ DEVICE_CONNECTED,
+ };
+ enum {
+ DEVICE_DISPLAY_OFF = 0,
+ DEVICE_DISPLAY_ON,
+ DEVICE_DISPLAY_STANDBY,
+ };
+public:
+ IDisplayDevice() {}
+ virtual ~IDisplayDevice() {}
+public:
+ virtual int32_t acceptDisplayChanges() = 0;
+ virtual bool createLayer(hwc2_layer_t* outLayer) = 0;
+ virtual bool destroyLayer(hwc2_layer_t layer) = 0;
+ virtual int32_t getActiveConfig(hwc2_config_t* outConfig) = 0;
+ virtual int32_t getChangedCompositionTypes(uint32_t* outNumElements, hwc2_layer_t* outLayers,
+ int32_t* /*hwc2_composition_t*/ outTypes) = 0;
+ virtual int32_t getClientTargetSupport(uint32_t width,
+ uint32_t height, int32_t /*android_pixel_format_t*/ format,
+ int32_t /*android_dataspace_t*/ dataspace) = 0;
+ virtual int32_t getColorModes(uint32_t* outNumModes,
+ int32_t* /*android_color_mode_t*/ outModes) = 0;
+ virtual int32_t getDisplayAttribute(hwc2_config_t config,
+ int32_t /*hwc2_attribute_t*/ attribute, int32_t* outValue) = 0;
+ virtual int32_t getDisplayConfigs(uint32_t* outNumConfigs, hwc2_config_t* outConfigs) = 0;
+ virtual int32_t getDisplayName(uint32_t* outSize,char* outName) = 0;
+ virtual int32_t getDisplayRequests(int32_t* /*hwc2_display_request_t*/ outDisplayRequests,
+ uint32_t* outNumElements, hwc2_layer_t* outLayers, int32_t* /*hwc2_layer_request_t*/ outLayerRequests) = 0;
+ virtual int32_t getDisplayType(int32_t* /*hwc2_display_type_t*/ outType) = 0;
+ virtual int32_t getDozeSupport(int32_t* outSupport) = 0;
+ virtual int32_t getHdrCapabilities(uint32_t* outNumTypes,
+ int32_t* /*android_hdr_t*/ outTypes, float* outMaxLuminance,
+ float* outMaxAverageLuminance, float* outMinLuminance) = 0;
+ virtual int32_t getReleaseFences(uint32_t* outNumElements, hwc2_layer_t* outLayers, int32_t* outFences) = 0;
+ virtual int32_t presentDisplay(int32_t* outRetireFence) = 0;
+ virtual int32_t setActiveConfig(hwc2_config_t config) = 0;
+ virtual int32_t setClientTarget(buffer_handle_t target,
+ int32_t acquireFence, int32_t /*android_dataspace_t*/ dataspace, hwc_region_t damage) = 0;
+ virtual int32_t setColorMode(int32_t /*android_color_mode_t*/ mode) = 0;
+ virtual int32_t setColorTransform(const float* matrix, int32_t /*android_color_transform_t*/ hint) = 0;
+ // virtual int32_t setOutputBuffer(buffer_handle_t buffer, int32_t releaseFence) = 0;
+ virtual int32_t setPowerMode(int32_t /*hwc2_power_mode_t*/ mode) = 0;
+ virtual bool vsyncControl(bool enabled) = 0;
+ virtual int32_t validateDisplay(uint32_t* outNumTypes, uint32_t* outNumRequests) = 0;
+ virtual int32_t setCursorPosition(hwc2_layer_t layerId, int32_t x, int32_t y) = 0;
+
+ // Virtual display.
+ virtual int32_t createVirtualDisplay(uint32_t width, uint32_t height, int32_t* format, hwc2_display_t* outDisplay) = 0;
+ virtual int32_t destroyVirtualDisplay(hwc2_display_t display) = 0;
+ virtual int32_t setOutputBuffer(buffer_handle_t buffer, int32_t releaseFence) = 0;
+
+ // Other Display methods
+ virtual hwc2_display_t getId() const = 0;
+ virtual bool isConnected() const = 0;
+
+ // device related operations
+ virtual bool initCheck() const = 0;
+ virtual bool initialize() = 0;
+ virtual void deinitialize() = 0;
+ virtual const char* getName() const = 0;
+ virtual int getDisplayId() const = 0;
+
+ virtual HwcLayer* getLayerById(hwc2_layer_t layerId) = 0;
+
+ virtual bool updateDisplayConfigs() = 0;
+
+ //events
+ virtual void onVsync(int64_t timestamp) = 0;
+
+ virtual void dump(Dump& d) = 0;
+
+};
+
+}
+}
+
+#endif /* IDISPLAY_DEVICE_H */
diff --git a/hwc2/include/IPlatFactory.h b/hwc2/include/IPlatFactory.h
new file mode 100644
index 0000000..89ccf42
--- a/dev/null
+++ b/hwc2/include/IPlatFactory.h
@@ -0,0 +1,25 @@
+/*
+// Copyright(c) 2016 Amlogic Corporation
+*/
+#ifndef IPLATFORM_FACTORY_H_
+#define IPLATFORM_FACTORY_H_
+
+
+#include <IDisplayDevice.h>
+
+namespace android {
+namespace amlogic {
+
+
+class IPlatFactory {
+
+public:
+ virtual ~IPlatFactory() {};
+public:
+
+ virtual IDisplayDevice* createDisplayDevice(int disp) = 0;
+};
+} // namespace amlogic
+} // namespace android
+
+#endif /* DATABUFFER_H__ */
diff --git a/hwc2/include/PhysicalDevice.h b/hwc2/include/PhysicalDevice.h
new file mode 100644
index 0000000..545ecd8
--- a/dev/null
+++ b/hwc2/include/PhysicalDevice.h
@@ -0,0 +1,169 @@
+/*
+// Copyright(c) 2016 Amlogic Corporation
+*/
+#ifndef PHYSICAL_DEVICE_H
+#define PHYSICAL_DEVICE_H
+
+#include <utils/KeyedVector.h>
+#include <SoftVsyncObserver.h>
+#include <IDisplayDevice.h>
+#include <HwcLayer.h>
+
+namespace android {
+namespace amlogic {
+
+class IHdcpControl;
+
+class DeviceControlFactory {
+public:
+ virtual ~DeviceControlFactory(){}
+public:
+ virtual IHdcpControl* createHdcpControl() = 0;
+};
+
+class CursorContext {
+public:
+ CursorContext()
+ : mStatus(false)
+ {
+ mCursorInfo = new framebuffer_info_t();
+ }
+ virtual ~CursorContext(){}
+
+ virtual framebuffer_info_t* getCursorInfo() { return mCursorInfo; }
+ virtual bool getCursorStatus() { return mStatus; }
+ virtual void setCursorStatus(bool status) { mStatus = status; }
+private:
+ framebuffer_info_t *mCursorInfo;
+ bool mStatus;
+};
+
+class Hwcomposer;
+class SoftVsyncObserver;
+
+class PhysicalDevice : public IDisplayDevice {
+ enum {
+ LAYER_MAX_NUM_CHANGE_REQUEST = 8,
+ LAYER_MAX_NUM_CHANGE_TYPE = 16,
+ LAYER_MAX_NUM_SUPPORT = LAYER_MAX_NUM_CHANGE_TYPE,
+ };
+public:
+ PhysicalDevice(hwc2_display_t id, Hwcomposer& hwc);
+ ~PhysicalDevice();
+
+ friend class Hwcomposer;
+ friend class HwcLayer;
+
+ // Required by HWC2
+ virtual int32_t acceptDisplayChanges();
+ virtual bool createLayer(hwc2_layer_t* outLayer);
+ virtual bool destroyLayer(hwc2_layer_t layer);
+ virtual int32_t getActiveConfig(hwc2_config_t* outConfig);
+ virtual int32_t getChangedCompositionTypes(uint32_t* outNumElements, hwc2_layer_t* outLayers,
+ int32_t* /*hwc2_composition_t*/ outTypes);
+ virtual int32_t getClientTargetSupport(uint32_t width,
+ uint32_t height, int32_t /*android_pixel_format_t*/ format,
+ int32_t /*android_dataspace_t*/ dataspace);
+ virtual int32_t getColorModes(uint32_t* outNumModes,
+ int32_t* /*android_color_mode_t*/ outModes);
+ virtual int32_t getDisplayAttribute(hwc2_config_t config,
+ int32_t /*hwc2_attribute_t*/ attribute, int32_t* outValue);
+ virtual int32_t getDisplayConfigs(uint32_t* outNumConfigs, hwc2_config_t* outConfigs);
+ virtual int32_t getDisplayName(uint32_t* outSize,char* outName);
+ virtual int32_t getDisplayRequests(int32_t* /*hwc2_display_request_t*/ outDisplayRequests,
+ uint32_t* outNumElements, hwc2_layer_t* outLayers, int32_t* /*hwc2_layer_request_t*/ outLayerRequests);
+ virtual int32_t getDisplayType(int32_t* /*hwc2_display_type_t*/ outType);
+ virtual int32_t getDozeSupport(int32_t* outSupport);
+ virtual int32_t getHdrCapabilities(uint32_t* outNumTypes,
+ int32_t* /*android_hdr_t*/ outTypes, float* outMaxLuminance,
+ float* outMaxAverageLuminance, float* outMinLuminance);
+ virtual int32_t getReleaseFences(uint32_t* outNumElements, hwc2_layer_t* outLayers, int32_t* outFences);
+ virtual int32_t presentDisplay(int32_t* outRetireFence);
+ virtual int32_t setActiveConfig(hwc2_config_t config);
+ virtual int32_t setClientTarget(buffer_handle_t target,
+ int32_t acquireFence, int32_t /*android_dataspace_t*/ dataspace, hwc_region_t damage);
+ virtual int32_t setColorMode(int32_t /*android_color_mode_t*/ mode);
+ virtual int32_t setColorTransform(const float* matrix, int32_t /*android_color_transform_t*/ hint);
+
+ //virtual int32_t setOutputBuffer(buffer_handle_t buffer, int32_t releaseFence); // virtual display only
+
+ virtual int32_t setPowerMode(int32_t /*hwc2_power_mode_t*/ mode);
+ virtual bool vsyncControl(bool enabled); // virtual hwc2_error_t setVsyncEnabled(hwc2_display_t display, int32_t /*hwc2_vsync_t*/ enabled);
+ virtual int32_t validateDisplay(uint32_t* outNumTypes, uint32_t* outNumRequests);
+ virtual int32_t setCursorPosition(hwc2_layer_t layerId, int32_t x, int32_t y);
+
+ virtual int32_t createVirtualDisplay(uint32_t width, uint32_t height, int32_t* format, hwc2_display_t* outDisplay);
+ virtual int32_t destroyVirtualDisplay(hwc2_display_t display);
+ virtual int32_t setOutputBuffer(buffer_handle_t buffer, int32_t releaseFence);
+
+ // Other Display methods
+ virtual Hwcomposer& getDevice() const { return mHwc; }
+ virtual hwc2_display_t getId() const { return mId; }
+ virtual bool isConnected() const { return mIsConnected; }
+
+ // device related operations
+ virtual bool initCheck() const { return mInitialized; }
+ virtual bool initialize();
+ virtual void deinitialize();
+ virtual const char* getName() const { return mName; };
+ virtual int getDisplayId() const { return mId; };
+ virtual HwcLayer* getLayerById(hwc2_layer_t layerId);
+
+ // display config operations
+ virtual void removeDisplayConfigs();
+ virtual bool updateDisplayConfigs();
+
+ //events
+ virtual void onVsync(int64_t timestamp);
+ virtual void dump(Dump& d);
+
+private:
+ // For use by Device
+ int32_t initDisplay();
+ int32_t postFramebuffer(int32_t* outRetireFence);
+
+ // Member variables
+ hwc2_display_t mId;
+ const char *mName;
+ bool mIsConnected;
+ Hwcomposer& mHwc;
+ char mDisplayMode[32];
+
+ // display configs
+ Vector<DisplayConfig*> mDisplayConfigs;
+ int mActiveDisplayConfig;
+
+ SoftVsyncObserver *mVsyncObserver;
+
+ // DeviceControlFactory *mControlFactory;
+
+ framebuffer_info_t *mFramebufferInfo;
+ private_handle_t *mFramebufferHnd;
+ CursorContext *mCursorContext;
+
+ int32_t /*android_color_mode_t*/ mColorMode;
+
+ // client target layer.
+ buffer_handle_t mClientTargetHnd;
+ hwc_region_t mClientTargetDamageRegion;
+ int32_t mTargetAcquireFence;
+
+ // num of composition type changed layer.
+ uint32_t mNumLayersChangetype;
+ uint32_t mNumLayerChangerequest;
+
+ // layer
+ KeyedVector<hwc2_layer_t, HwcLayer*> mHwcLayersChangeType;
+ KeyedVector<hwc2_layer_t, HwcLayer*> mHwcLayersChangeRequest;
+ KeyedVector<hwc2_layer_t, HwcLayer*> mHwcLayers;
+
+ // lock
+ Mutex mLock;
+ bool mInitialized;
+};
+
+
+}
+}
+
+#endif /* PHYSICAL_DEVICE_H */
diff --git a/hwc2/include/PrimaryDevice.h b/hwc2/include/PrimaryDevice.h
new file mode 100644
index 0000000..b812086
--- a/dev/null
+++ b/hwc2/include/PrimaryDevice.h
@@ -0,0 +1,30 @@
+/*
+// Copyright(c) 2016 Amlogic Corporation
+*/
+
+#ifndef PRIMARY_DEVICE_H
+#define PRIMARY_DEVICE_H
+
+#include <PhysicalDevice.h>
+
+namespace android {
+namespace amlogic {
+
+
+class PrimaryDevice : public PhysicalDevice {
+public:
+ PrimaryDevice(Hwcomposer& hwc);
+ virtual ~PrimaryDevice();
+public:
+ virtual bool initialize();
+ virtual void deinitialize();
+
+private:
+ static void hotplugEventListener(void *data);
+ void hotplugListener();
+};
+
+}
+}
+
+#endif /* PRIMARY_DEVICE_H */
diff --git a/hwc2/include/UeventObserver.h b/hwc2/include/UeventObserver.h
new file mode 100644
index 0000000..48680bc
--- a/dev/null
+++ b/hwc2/include/UeventObserver.h
@@ -0,0 +1,53 @@
+/*
+// Copyright(c) 2016 Amlogic Corporation
+*/
+
+#ifndef UEVENT_OBSERVER_H
+#define UEVENT_OBSERVER_H
+
+#include <utils/KeyedVector.h>
+#include <utils/String8.h>
+#include <SimpleThread.h>
+
+namespace android {
+namespace amlogic {
+
+typedef void (*UeventListenerFunc)(void *data);
+
+class UeventObserver
+{
+public:
+ UeventObserver();
+ virtual ~UeventObserver();
+
+public:
+ bool initialize();
+ void deinitialize();
+ void start();
+ void registerListener(const char *event, UeventListenerFunc func, void *data);
+
+private:
+ DECLARE_THREAD(UeventObserverThread, UeventObserver);
+ void onUevent();
+
+private:
+ enum {
+ UEVENT_MSG_LEN = 4096,
+ };
+
+ char mUeventMessage[UEVENT_MSG_LEN];
+ int mUeventFd;
+ int mExitRDFd;
+ int mExitWDFd;
+ struct UeventListener {
+ UeventListenerFunc func;
+ void *data;
+ };
+ KeyedVector<String8, UeventListener*> mListeners;
+};
+
+} // namespace intel
+} // namespace android
+
+#endif
+
diff --git a/hwc2/include/VirtualDevice.h b/hwc2/include/VirtualDevice.h
new file mode 100644
index 0000000..6bae7ad
--- a/dev/null
+++ b/hwc2/include/VirtualDevice.h
@@ -0,0 +1,124 @@
+/*
+// Copyright(c) 2016 Amlogic Corporation
+*/
+#ifndef VIRTUAL_DEVICE_H
+#define VIRTUAL_DEVICE_H
+
+namespace android {
+namespace amlogic {
+
+class VirtualDevice : public IDisplayDevice {
+ enum {
+ LAYER_MAX_NUM_CHANGE_TYPE = 16,
+ LAYER_MAX_NUM_SUPPORT = 16,
+ };
+public:
+ VirtualDevice(Hwcomposer& hwc);
+ virtual ~VirtualDevice();
+
+ friend class Hwcomposer;
+ friend class HwcLayer;
+
+public:
+ // Required by HWC2
+ virtual int32_t acceptDisplayChanges();
+ virtual bool createLayer(hwc2_layer_t* outLayer);
+ virtual bool destroyLayer(hwc2_layer_t layer);
+ virtual int32_t getActiveConfig(hwc2_config_t* outConfig);
+ virtual int32_t getChangedCompositionTypes(uint32_t* outNumElements, hwc2_layer_t* outLayers,
+ int32_t* /*hwc2_composition_t*/ outTypes);
+ virtual int32_t getClientTargetSupport(uint32_t width,
+ uint32_t height, int32_t /*android_pixel_format_t*/ format,
+ int32_t /*android_dataspace_t*/ dataspace);
+ virtual int32_t getColorModes(uint32_t* outNumModes,
+ int32_t* /*android_color_mode_t*/ outModes);
+ virtual int32_t getDisplayAttribute(hwc2_config_t config,
+ int32_t /*hwc2_attribute_t*/ attribute, int32_t* outValue);
+ virtual int32_t getDisplayConfigs(uint32_t* outNumConfigs, hwc2_config_t* outConfigs);
+ virtual int32_t getDisplayName(uint32_t* outSize,char* outName);
+ virtual int32_t getDisplayRequests(int32_t* /*hwc2_display_request_t*/ outDisplayRequests,
+ uint32_t* outNumElements, hwc2_layer_t* outLayers, int32_t* /*hwc2_layer_request_t*/ outLayerRequests);
+ virtual int32_t getDisplayType(int32_t* /*hwc2_display_type_t*/ outType);
+ virtual int32_t getDozeSupport(int32_t* outSupport);
+ virtual int32_t getHdrCapabilities(uint32_t* outNumTypes,
+ int32_t* /*android_hdr_t*/ outTypes, float* outMaxLuminance,
+ float* outMaxAverageLuminance, float* outMinLuminance);
+ virtual int32_t getReleaseFences(uint32_t* outNumElements, hwc2_layer_t* outLayers, int32_t* outFences);
+ virtual int32_t presentDisplay(int32_t* outRetireFence);
+ virtual int32_t setActiveConfig(hwc2_config_t config);
+ virtual int32_t setClientTarget(buffer_handle_t target,
+ int32_t acquireFence, int32_t /*android_dataspace_t*/ dataspace, hwc_region_t damage);
+ virtual int32_t setColorMode(int32_t /*android_color_mode_t*/ mode);
+ virtual int32_t setColorTransform(const float* matrix, int32_t /*android_color_transform_t*/ hint);
+
+ //virtual int32_t setOutputBuffer(buffer_handle_t buffer, int32_t releaseFence); // virtual display only
+
+ virtual int32_t setPowerMode(int32_t /*hwc2_power_mode_t*/ mode);
+ virtual bool vsyncControl(bool enabled); // virtual hwc2_error_t setVsyncEnabled(hwc2_display_t display, int32_t /*hwc2_vsync_t*/ enabled);
+ virtual int32_t validateDisplay(uint32_t* outNumTypes, uint32_t* outNumRequests);
+ virtual int32_t setCursorPosition(hwc2_layer_t layerId, int32_t x, int32_t y);
+
+ virtual int32_t createVirtualDisplay(uint32_t width, uint32_t height, int32_t* format, hwc2_display_t* outDisplay);
+ virtual int32_t destroyVirtualDisplay(hwc2_display_t display);
+ virtual int32_t setOutputBuffer(buffer_handle_t buffer, int32_t releaseFence);
+
+ // Other Display methods
+ virtual Hwcomposer& getDevice() const { return mHwc; }
+ virtual hwc2_display_t getId() const { return mId; }
+ virtual bool isConnected() const { return mIsConnected; }
+
+ // device related operations
+ virtual bool initCheck() const { return mInitialized; }
+ virtual bool initialize();
+ virtual void deinitialize();
+ virtual const char* getName() const { return mName; };
+ virtual int getDisplayId() const { return mId; };
+ virtual HwcLayer* getLayerById(hwc2_layer_t layerId);
+ virtual bool updateDisplayConfigs();
+
+ //events
+ virtual void onVsync(int64_t timestamp);
+ virtual void dump(Dump& d);
+
+private:
+ // For use by Device
+ int32_t postFramebuffer(int32_t* outRetireFence);
+
+ // Member variables
+ hwc2_display_t mId;
+ const char *mName;
+ bool mIsConnected;
+ Hwcomposer& mHwc;
+ uint32_t mWidth;
+ uint32_t mHeight;
+ int32_t mFormat;
+ char mDisplayMode[32];
+
+ int32_t /*android_color_mode_t*/ mColorMode;
+
+ // client target layer.
+ buffer_handle_t mClientTargetHnd;
+ hwc_region_t mClientTargetDamageRegion;
+ int32_t mTargetAcquireFence;
+
+ buffer_handle_t mVirtualHnd;
+ int32_t mVirtualReleaseFence;
+
+ // num of composition type changed layer.
+ uint32_t mNumLayersChangetype;
+ uint32_t mNumLayerChangerequest;
+
+ // layer
+ KeyedVector<hwc2_layer_t, HwcLayer*> mHwcLayersChangeType;
+ KeyedVector<hwc2_layer_t, HwcLayer*> mHwcLayers;
+
+ // lock
+ Mutex mLock;
+ bool mInitialized;
+};
+
+}
+}
+
+#endif /* VIRTUAL_DEVICE_H */
+
diff --git a/hwc2/platforms/Android.mk b/hwc2/platforms/Android.mk
new file mode 100644
index 0000000..b72ae37
--- a/dev/null
+++ b/hwc2/platforms/Android.mk
@@ -0,0 +1,91 @@
+# Copyright (C) 2016 Amlogic
+#
+#
+
+LOCAL_PATH := $(call my-dir)
+
+# HAL module implemenation, not prelinked and stored in
+# hw/<OVERLAY_HARDWARE_MODULE_ID>.<ro.product.board>.so
+include $(CLEAR_VARS)
+
+LOCAL_MODULE_RELATIVE_PATH := hw
+
+LOCAL_SRC_FILES := \
+ ../common/base/HwcLayer.cpp \
+ ../common/base/Hwcomposer.cpp \
+ ../common/base/HwcModule.cpp \
+ ../common/base/VsyncManager.cpp \
+ ../common/devices/PhysicalDevice.cpp \
+ ../common/devices/PrimaryDevice.cpp \
+ ../common/devices/VirtualDevice.cpp \
+ ../common/observers/SoftVsyncObserver.cpp \
+ ../common/observers/UeventObserver.cpp \
+ ../common/utils/Utils.cpp \
+ ../common/utils/Dump.cpp
+
+LOCAL_SRC_FILES += \
+ PlatFactory.cpp
+
+LOCAL_SHARED_LIBRARIES := \
+ libcutils \
+ liblog \
+ libEGL \
+ libdl \
+ libhardware \
+ libutils \
+ libsync \
+ libfbcnf
+
+LOCAL_C_INCLUDES := \
+ system/core \
+ system/core/libsync/include
+
+LOCAL_C_INCLUDES += $(LOCAL_PATH) \
+ $(LOCAL_PATH)/../include \
+ $(LOCAL_PATH)/../common/base \
+ $(LOCAL_PATH)/../common/buffers \
+ $(LOCAL_PATH)/../common/devices \
+ $(LOCAL_PATH)/../common/observers \
+ $(LOCAL_PATH)/../common/planes \
+ $(LOCAL_PATH)/../common/utils \
+ $(LOCAL_PATH)/
+
+LOCAL_KK=0
+ifeq ($(GPU_TYPE),t83x)
+LOCAL_KK:=1
+endif
+ifeq ($(GPU_ARCH),midgard)
+LOCAL_KK:=1
+endif
+ifeq ($(LOCAL_KK),1)
+ LOCAL_CFLAGS += -DMALI_AFBC_GRALLOC=1
+else
+ LOCAL_CFLAGS += -DMALI_AFBC_GRALLOC=0
+endif
+
+MESON_GRALLOC_DIR ?= hardware/amlogic/gralloc
+
+LOCAL_C_INCLUDES += $(MESON_GRALLOC_DIR)
+
+LOCAL_C_INCLUDES += system/core/libion/include/ \
+ system/core/libion/kernel-headers
+
+# WITH_LIBPLAYER_MODULE := true
+ifneq ($(WITH_LIBPLAYER_MODULE),false)
+LOCAL_SHARED_LIBRARIES += libamavutils_alsa
+AMPLAYER_APK_DIR := vendor/amlogic/frameworks/av/LibPlayer
+LOCAL_C_INCLUDES += $(AMPLAYER_APK_DIR)/amavutils/include
+$(info Libplayer is $(AMPLAYER_APK_DIR))
+LOCAL_CFLAGS += -DWITH_LIBPLAYER_MODULE=1
+endif
+
+LOCAL_MODULE_TAGS := optional
+LOCAL_MODULE := hwcomposer.amlogic
+# LOCAL_CFLAGS += -DLINUX
+
+ifneq ($(TARGET_BUILD_VARIANT),user)
+ LOCAL_CFLAGS += -DHWC_TRACE_FPS
+endif
+
+include $(BUILD_SHARED_LIBRARY)
+
diff --git a/hwc2/platforms/PlatFactory.cpp b/hwc2/platforms/PlatFactory.cpp
new file mode 100644
index 0000000..5eb0b76
--- a/dev/null
+++ b/hwc2/platforms/PlatFactory.cpp
@@ -0,0 +1,55 @@
+/*
+// Copyright(c) 2016 Amlogic Corporation
+*/
+#include <HwcTrace.h>
+#include <PrimaryDevice.h>
+//#include <ExternalDevice.h>
+#include <VirtualDevice.h>
+#include <Hwcomposer.h>
+#include <PlatFactory.h>
+
+namespace android {
+namespace amlogic {
+
+PlatFactory::PlatFactory()
+{
+ CTRACE();
+}
+
+PlatFactory::~PlatFactory()
+{
+ CTRACE();
+}
+
+IDisplayDevice* PlatFactory::createDisplayDevice(int disp)
+{
+ CTRACE();
+ //when createDisplayDevice is called, Hwcomposer has already finished construction.
+ Hwcomposer &hwc = Hwcomposer::getInstance();
+
+ class PlatDeviceControlFactory: public DeviceControlFactory {
+ public:
+ };
+
+ switch (disp) {
+ case IDisplayDevice::DEVICE_PRIMARY:
+ return new PrimaryDevice(hwc);
+ case IDisplayDevice::DEVICE_VIRTUAL:
+ return new VirtualDevice(hwc);
+ case IDisplayDevice::DEVICE_EXTERNAL:
+ // return new ExternalDevice(hwc, new PlatDeviceControlFactory());
+ default:
+ ETRACE("invalid display device %d", disp);
+ return NULL;
+ }
+}
+
+Hwcomposer* Hwcomposer::createHwcomposer()
+{
+ CTRACE();
+ Hwcomposer *hwc = new Hwcomposer(new PlatFactory());
+ return hwc;
+}
+
+} //namespace amlogic
+} //namespace android
diff --git a/hwc2/platforms/PlatFactory.h b/hwc2/platforms/PlatFactory.h
new file mode 100644
index 0000000..75cd622
--- a/dev/null
+++ b/hwc2/platforms/PlatFactory.h
@@ -0,0 +1,27 @@
+/*
+// Copyright(c) 2016 Amlogic Corporation
+*/
+
+#ifndef MOOFPLATFORMFACTORY_H_
+#define MOOFPLATFORMFACTORY_H_
+
+#include <IPlatFactory.h>
+
+
+namespace android {
+namespace amlogic {
+
+class PlatFactory : public IPlatFactory {
+public:
+ PlatFactory();
+ virtual ~PlatFactory();
+
+ virtual IDisplayDevice* createDisplayDevice(int disp);
+
+};
+
+} //namespace amlogic
+} //namespace android
+
+
+#endif /* MOOFPLATFORMFACTORY_H_ */
diff --git a/hwc2/test/Android.mk b/hwc2/test/Android.mk
new file mode 100644
index 0000000..0c9fe4a
--- a/dev/null
+++ b/hwc2/test/Android.mk
@@ -0,0 +1,26 @@
+# Build the unit tests,
+LOCAL_PATH:= $(call my-dir)
+include $(CLEAR_VARS)
+
+LOCAL_MODULE := nv12_ved_test
+
+LOCAL_MODULE_TAGS := tests
+
+LOCAL_SRC_FILES := \
+ nv12_ved_test.cpp \
+
+LOCAL_SHARED_LIBRARIES := \
+ libEGL \
+ libGLESv2 \
+ libbinder \
+ libcutils \
+ libgui \
+ libui \
+ libutils \
+
+LOCAL_C_INCLUDES := \
+ $(call include-path-for, gtest) \
+
+# Build the binary to $(TARGET_OUT_DATA_NATIVE_TESTS)/$(LOCAL_MODULE)
+# to integrate with auto-test framework.
+include $(BUILD_EXECUTABLE)
diff --git a/hwc2/test/my_640x480.nv12 b/hwc2/test/my_640x480.nv12
new file mode 100644
index 0000000..d8a0c34
--- a/dev/null
+++ b/hwc2/test/my_640x480.nv12
@@ -0,0 +1 @@
+"&&%# *6BTjstx{zywxxwtnlptw|}|{{|{ywvuvyyxyz|}{zxz~~||||}~~~||€~}{z{}~€~}€~~ƒ‚}}~‡‰‡~€‚€}}‚†ˆ‡†ˆˆ‡†ƒ‚ƒƒ‚€~‚…††‰ŠŠ‰ˆˆ‡†……†‡ˆŠˆ„‚ƒ„…††††ˆˆ‡‡…ƒ„‰Ž‰†…„‚„†…ƒ…‡ˆ‰Š‰ˆˆŠŠˆ……‡ŠŒ‹Šˆ………†‡‡†ƒ…ˆ‰Š‹Š‰‰Š‰ˆ‡ˆŠ‹Š‰‰‰‡†‹‹‡‡Š‹‹Š˜g- !#$'+/01147889?DB=4) *7BShpminqrtwyz|€‚€}xxƒM"!$$#!'4BUhqtx{zyxxxxsnkotwz|{{{{{yxwuvxyxyz{|{{{{€}{zzz|~~}||~}|{zz{}}}~|{‚€~}}}~~…‡…€}€‚€~€}}„……†‰‰‡…ƒ‚ƒƒ€~„…‡ˆ‰‰ˆ‡††…ƒƒ…†‡‰ˆ…ƒ„……†‡††‡†††„ƒ„‰Œ‰‡†……ƒ„…ƒ‚„‡ˆ‰‰ˆ†‡‰‰‡…†‡ŠŒ‹‰ˆ†……………†…ƒ†ˆˆˆ‰‰ˆˆ‰ˆ‡†ˆ‰ŠŠ‰‰ˆ†…‰ŒŠˆˆ‰ŠŠ—n1 "#&*-/0148:9:>@A=7.#".;Qijjloqrtwxy{€€}yw€C #0BUeotx{zywwwwtnmquwyyz{{yxvwxwvxzz{{||}~~~€}zxwxz|}}|~€€€~}}}||~‚€€€~{{}€€~}}~~ƒ‚}€ƒƒƒƒƒ€~||}ƒ…†ˆ‰†ƒ‚‚ƒ‚~€ƒ†‡ˆˆˆˆ†…„……ƒƒ„…†ˆˆ†…†‡ˆ‰‰ˆ‡…„……„„†‰Šˆ†‡††„ƒƒ‚‚…‡‰‹Š‡…†ˆˆ‡‡‡‡ˆ‰‰‡‡‡……†…„†ˆˆˆˆ‰‰‰‰‰‰Šˆ‡‡ˆ‰Š‹‹Š‰‡†ˆŒŒŒ‰ˆˆˆˆ˜ˆR!#%&(*,.027=@>=?ADFGE<4*!(7Vghnqrsvwwvx}~~~z}z5 ,BVdmsy{zxvvvwtpnquvwxy{{ywwwyywwy{|}}}}~~}€|ywvwyz{|}~~~}}‚‚€~}yy{}~~~~~~~~„„ƒ…†„~}}~€ƒ…‡‡‡…ƒ‚„…‚€‚ƒ…†‡‡†…„„„„…„„ƒ„…‡ˆ‡††‡‡‡ˆ‡…ƒƒ„…„„…‡ˆ††‡††„ƒƒ„…†‡ˆŠ‰…ƒƒ†‡ˆ‰‰†††††‡ˆ†„…ƒ„‡ŠŠˆ†ˆ‰‰ˆˆ‰‰‰ˆˆˆˆˆŠ‹‰ˆ‡††‰ŠŠ‰ˆ‰ˆ‡œr $')))*+-028?A>>ADEFJLJHE;," '8P_mmpsvvusuwyz||z}z#+BWdnty{zxvwyyusrtuvwxyz{zyyzzywvx|~}}~€€~{ywwy{|}~~~~~~~‚‚€~~~}|{|‚‚‚€€‚‚‚ƒ„„„†‡†„ƒƒ‚€€‚„‡ˆˆ‡……„………ƒƒ„„ƒ„ˆ‰ˆ†„„„„„……‡†……‡ˆˆ‡†††ˆˆ‡…„…………††‡ˆˆ‰Šˆ†„ƒ„†‡‡‡‡‰‰‡††ˆ‰Š‹Š‡†…†‡ˆŠ‰‡†††ˆ‹‰ˆ‡ˆŠ‹ŠŠŠ‹‹ŠŠ‰ˆˆ‰‹Š‰‰ˆ‡‰ŠŠ‰Š‹Š‡‡£ "$#$'+.--/00349?AABFIHIMRRRTQG5##)G`moswxvtuvvxz{y}y(@Ucovyzxwwy{zwuuuvvvxxz{{{}~|yvtvz~~~|{|~}yxxxxz}~~€~~}}}|}}}~€€~€~~‚ƒƒ‚ƒ„………„ƒ‚ƒ…†††‡†„ƒ„†‡ˆ‡†††………††………‚„‰‹‰†„…††„„„‡ˆ‡……†‡†„„†‰‰‡†‡†…„…†‡‡ˆ‰‹‹‰‡……†††††††‡†‡ˆˆˆ‰‰‰†……†††‰Šˆˆˆˆ‰‰‡‡‡ˆŠ‹Š‰Š‹‹Šˆˆˆˆˆ‰‰ˆˆˆ‡‰ŠŠ‰ŠŒŠ‡‡œ’ $(('(*--0211348;?BEIJIKNRVXXYUK:(!'H\juvxxvvvuuxzx|v%:Pasuwxwwxyzzxvvwxxwxyz|||}}|xuuvy|}}}}{z{zwtuwwwz}~€€€€~~}}|||~„„„‚€‚‚ƒƒ‚ƒ„…………„~‚„†‡‡ˆ‡‡‡ˆˆ††††‡††‡‰ˆ‡ˆ‰‡†‰‹Š‡„…‡‡…„…†ˆˆ†……†‡†…‡ˆˆ‡‰‰‰‡††‡‡‰Š‹‹‹Š‰ˆˆˆ‡†††‡‡†…†‡‡‡‡ˆˆ‡ˆˆˆ‡‡‹ŽŒ‹Š‹‹‹‰‡‡‰Š‹Š‰Š‹‹‹‰‰‰‰ˆ‰‰ˆ‡ˆˆˆ‰Š‹Œ‹‰‰Š˜˜-!""""%(+++,-/2321358;@DGIKLMNQVZZZYTMA0""0C]wwuyzzxvvy{zx 1GYjprttuuuuvuttvwxwyz{||{{zzxwxwy|}|{{zyxwuttvwwz}|}€€€€€~}||z|}~€ƒ„ƒ‚€~€€‚‚‚‚}}€ƒ……„…†††††…„„…………†‡‡‡ˆŠˆ‡ˆŠ‰‡„…………„ƒ„…†…„…‡ˆ‰ˆ‡†††ˆˆˆ‡……„„‡‰‰ˆˆ‰‰ˆ‰ˆ‡……†‡‡…„„……„ƒ…‡ˆˆ‰‰‡ˆŒŽ‹‰ˆ‰Š‹ˆ……‡‰‹‹ŠŠ‹‹Œ‹Š‰‰ˆŠŠˆ†‡ˆˆ‡ˆŠ‹‰‰Š‹˜˜[ !$&%%'(,..../1112469<@CEHLMNNQUXXXXXVSL9&#.=Xlmuz{{yxz|{s+CXfmqttssssssstuxyyz{||{yyyyxxy{}~}{zzzyyyyxxxz}~~€‚‚€€‚~~~}}~€‚ƒ‚€‚‚‚ƒ„„‚~€‚‚†‡†„ƒ„…„………„ƒƒ„……††‡ˆˆŠ‰ˆ‰Š‰ˆ††…„„„„……†……†‰‹‹‹Šˆ‡ˆ‰ˆ‡†…„„„†ˆˆ‡‡ˆˆ‡‡††……†‡‡‡††‡‰ˆ††‡ˆ‰ŒŒ‰‰ŒŠˆˆ‰‹Œ‰…†‰‹ŒŒŒŒ‹ŠŠ‹ŒŠŠ‹‹‰‰Š‹‹Š‹‘š€L !"#&())+-0122102357:;=?BDEJNNOQSUUUXZ[\]\T@,%+8Rrx|~}|||{†i&=Sbkorssrstsrstuwyyz{{{ywxyyyz{}€}{{z{{{|~|zz|~~‚‚‚‚€‚~|}‚‚€‚‚‚ƒ‡‡ƒ~|€ƒ„„„„ƒ‚†ˆˆ†„€‚ƒƒ€‚ƒƒ„…………†‡†‡‡‡‡ˆˆ‡†††………„ƒ„‡‰ŠŠˆˆ‡‡‡‡†……„„„„…‡‡……††…ƒ‚„†…†ˆ‰‰ˆ††ˆ‰ˆ†††ˆ‹Š‡‡ˆˆ‡†‡‡‰‰ˆ†‡‰‹ŒŒ‹ŒŽ‹Š‰ŠŽŽŒ‹ŒŒ‹‹ŠŠ‹‹‹™—j!#$%'))*,/1124423468;=?@BCFJLMPSTSRSVZ\]^^^WF/&+2Unqx~}|{yxc!7Pclpsuutttttuvvwxxy{{yxxyxx{}}}~€€~||||}}‚|}€€‚‚„„ƒ‚€€}~€€‚„ƒƒ…ˆˆ…‚†ˆˆ‡†…„‡Š‰‡…‚€‚‚€‚‚„„ƒƒƒ……„„„…‡‰Š‰ˆ‰ŠŠˆ‡†…‡‰Š‰ˆ††‡ˆ‡‡††‡ˆˆ‰‡‡‡ˆ†††…ƒ‚ƒ…‡‡‰‹Œ‹Šˆ††‰‰ˆˆ‡ˆ‰‰‡‡‡ˆ‡††‡‡ˆŠŠ‰Š‹ŒŒŒŒŽŽŒŠŒŽŒŒ‹Š‹Œ‹Œž€ #'*+,,,/23224446789<@BCEGHJMORTUTRRUWZ\\\_`YI4',9]ou}~}|yyb0Kbmsvwwvuttvwxxwwwxzywwz{yy{|}||~~}||}~€}{}~€„„‚€~}~€€€~}~€ƒ†‡…‚‚ƒ†‰‰‡†……‡‡†……ƒ‚‚ƒ……‚~€‚„…ƒ€ƒ…†ƒ‚„†‰‹Šˆˆ‹Œ‹‰‰ŠŠ‡…„…‡ˆ‡††ˆˆŠŠŠ‰‡‡‡††††……†‡ˆˆˆ‹‹‰‡…†ˆ‰‰ˆ‡‡‡†‡ˆ‰‰‡…„„†‰Š‰ˆˆŠ‹ŒŒŽŒ‹ŒŽŽŒ‹ŒŒ‹‹ŒŠ‰Š‹Š‹‹‹¥‘!',--,,033233369;<=@BCCFHIKORUVVUTTUVX[[[^a_YL819Kgw}~}}}zze /H`nuyzxuvuuxyyyxxxz|{yz~~|||}~~}~~~}}}~€€€|z|~€€€‚ƒƒ€€~|~~~€ƒ„ƒ‚‚€€€€‚…†„„…„…‡‡…„„…†…‚„„ƒ‚„…ˆ‡ƒ€€ƒ†‡„‚…‡‡„‚ƒ…†‰‹Šˆˆ‹ŽŽŽŽŽŠ…ƒƒ…ˆ‰‡†ˆŠ‰ŠŠ‹Š‰ˆ‡†‡‡‡†‡‡ˆˆˆˆŠŒŽŒŠˆˆ‰ŒŠ‡†‡ˆ‰ŠŠ‰ˆ‡‡…†‰‹‹‰ˆ‰Š‹ŒŽŒŽŽŽŒŒ‹ŠŠ‹Š‰‰‰Ÿ1"(,-/013458978;?BCCEDCBGKLNRTVVUUWXYYY\`abbbb^P=2>Zq€|}~zxe!!.E\otyzvrtuuxyyyyy{}~|z{~~}}}~€~~~~~}}~~~~{z|}}€€€€‚‚€€€~€‚……ƒ……„‚€€„†……„„ƒ„ƒ€€‚„„ƒ‚‚ƒ„††ƒ‚ƒƒ„‡‡„ƒ‡‰ˆ†„…ˆŠ‹‹ˆ‡‡ŠŽŽŒ‹†‚ƒ…‡ˆ†‡ˆˆ‡ˆˆˆˆˆ‡†…†……†‡‡‡††ˆŠ‹ŒŠ‰ˆ‰‹Œ‰‡†ˆ‹‹Šˆ†‡‰‰‡‡‰Š‹‹‹‹‹‹Š‹ŽŒŽ‹ŒŽ‹ŒŽ‹Š‰ˆˆˆ‡^!"$(*,.25558<<;=@CDEDEB@?DIKLPRSTTVXZ\\[\`cddefe_O72>Qs{v{}ywd +AXkrwxtqrstvxyzzz|}|{zz|||~‚‚€€~}}}~}|}~~€~~€€ƒ„‚‚‚‚‚…ˆ†„†‡†…„ƒ„‚€‚…‡†…ƒƒ‚€€‚„…„€‚„„„„„„ƒƒ…†††††…„…ˆŠŠ‰‡‡Š‹‹Šˆˆˆ‹ŒŒ‹ŠŠŠˆ…‚ƒ†‡ˆ‰‰ŠŠ‰ˆˆˆ‰‰ˆ‡††††…†‡‡‡††‰Š‰ŠŽŒ‹Š‰‰‰ˆˆ‰‹‹Šˆ†‰Ž‹ŠŠŠŒŒ‹‹‹ŒŽŒŽŒŽŽŒ‰‰ˆ‰Šˆ‹™|2!"$'*,/2579<>>?BDDEFFECAACGILOOPSUWZ]^]]]^adeffec]K4..Wtwz{xvb':N^jqrollmnoruxxy{zxyzyxxy|ƒƒ‚€~}}€€~}}}~€€~€‚„…„„„ƒƒƒ‚‚ƒ…†…ƒ„……†……†„‚ƒ………„ƒ‚€€ƒ„…‡‡ƒ€…‡‡†…„„ƒ„……††…„…††ˆ‰Š‰‡‡‰ŠŠ‰ˆ‰Š‹‹Šˆˆˆ‡…„„‡‰Š‰‰Š‹ŠŠ‰‡‡‰Š‰††††‡‡‡†…††‡ˆˆ‡ˆ‹ŒŠˆ‡ˆ‰‰ˆ‰ŠŠˆ‡ŠŒŒŠŠ‰‰Š‹Œ‹Š‹ŒŽŒ‹ŒŒŒŽŽŒ‹ŽŽ‹ˆ‡ˆŠ‹‰†’‘d!"#(+.0379;=>@@AEGHHIHEDCDGJKNNPRTWZ\^^^^^^`bdddcbZG.+0O~yzvt`$2ER\ab`_`ceehpwxyvvvxyyxyy{ƒ„„ƒ‚‚‚‚€~~€‚ƒ~}}~‚‚‚€‚„…………„ƒ‚ƒ…………ƒ‚ƒ„……†‡‡†…††„„„…ƒƒ„……„‡ˆˆ‡‡ˆˆ‡‡‡†…†‡†††„…‡ˆˆˆ‰ˆ‡‡‰Š‹‰‡‡ˆŠ‹‹‹‰‰ˆ†„„†‰ŠŠ‰‰Š‹‹‹Šˆ‡‰‹‹‰ˆˆˆˆˆˆˆˆˆˆ‰Š‰ˆˆ‰‹Œ‹ˆˆ‰Š‰ˆ‰Š‹‹Š‹Œ‹Š‹Š‰‰Š‹‹‹ŽŒŒŒŒŽŒ‹ŒŽŒ‰ˆˆŠ‹Šˆ£‚"%'(+.15:===>ACBAFJKKKJIHHGKNNOPPRUXZ]___`a`__`bdedbX>,/%„„{wwf!,8BILJJMRUUSRXaefkptwxzyyz|‚‚‚€€€€€}~€‚‚~|||ƒƒ‚‚€€‚ƒ……„ƒ‚ƒ„…„ƒƒ‚‚‚‚„††††‡†ƒ‚ƒƒ‚‚ƒ„…†…†ˆ‰‰‡…„„…††……†‡†††††‡‡ˆˆ‡‡‡ˆ‰‹Œ‰……‡‰Š‹‹Šˆ‡…„†‰Šˆˆ‡ˆˆˆˆŠŠˆ†‡ˆ‰ˆˆ‰ˆ‡‡‡‰‰‰ˆ‰ŒŒ‹‰ˆ‰ŠŠ‹Šˆˆ‰‰ˆ††ˆ‰‹‹ŠŠ‹ŠŠŠŠ‰‰Š‹ŒŽŒŠ‰Š‹Œ‹ŒŒŠŠ‹ŒŒ‹ŠˆˆŠ‹Š‰‰© $)*+-.27<@?>?BDCADGGHGGIKKKNPOPRRRUXZ\^]_`cb_\]`dfed_P:+(rŠ{tu_ ").34215:<;:9:DKYfotxz|{z{}€€€€€~~€€}}~}‚„„…„ƒƒƒ‚ƒ„……„ƒ„„„ƒƒ‚ƒ€„††‡††…ƒƒ„…………‡ˆ‰ŠŠŠˆ…ƒƒƒ„………‡ˆ††‡‰‰‰ˆˆ‰‰ˆ‰ˆŠŒŒ‰†…‡ŠŒŒ‰‡††‰‹ŒŠ‡‡†††‡‰‹‹‰‡ˆ‰‰‰‰ŠŠˆ‡‡‰ŠŠŠŠŒŽŒŒ‹‰‰ŠŠ‰‰‰‡††ˆŠ‹‹Š‹Œ‹Š‹Œ‹‹‹ŒŽŒŠ‰ŠŒŒ‹‹Œ‹Œ‹ˆ‰‹‹Š‰Š¡’ !!%*,,--28>AAACEGECBCDFEEKOQRSSRQTVTVWY\]]_bdc`]]`egffc\K21;g}stW $7Uhqwz{}{zz|€~~€~~€~~ƒ………„„ƒ„„††„ƒ‚ƒ‚‚‚€€‚‚€ƒ„……‡†„ƒ‚‚ƒ„„„ƒ„†ˆ‰‰‰ˆ†„ƒ„ƒƒ…††‡†……‡‰ŠŠˆ‡ˆ‡†‡ˆŠŒ‹ˆ‡†‡ˆŠŒ‹ˆ††‡Š‹‹‰…„„……‡Š‹Šˆ‡ˆŠŠˆˆ‡‡†††‰‰Š‹ŠŠŽ‹‰ˆŠŠ‰ˆˆˆˆ‰‹ŒŠŠŠŠ‹‹ŒŒŽŽŒ‹ŒŽŽŒŒŒŽŽŒˆˆ‹ŒŠŠ‹¡–D# $*----18<>ABCEFFDBBCFGHLPRSSTSSUVUUWZ\\\^acbba`adeefebXC4:Iqqm]3Sitz|||{zz}€~~}}~€‚‚€€€ƒƒ€~}‚………ƒƒ„…………„‚‚‚ƒƒ€€€‚„††……‡‡„„……ƒ„„ƒ‚ƒ„†‡ˆ‰ˆ†…ƒƒ„„…‡ˆˆ‡‡†……‡Š‰‡…………‡‰‹‹Š‰ŠŠˆ†‡Š‹‹‹ŠŠŠŠŠˆ…………„‡‰‹Š‰‰Š‹ŒŠˆ††‡‡‡‰‰Š‹Š‰Œ‘ŽŒŠ‰ˆˆˆˆŠŒŒŒŽŒ‰‰‰‰‹Ž‘‘ŽŽ‘‘Ž‘‘ŽŒ‹ŒŒ‰‹ŽŽŒ‹‹˜—m?#)-./148:=ACDDDFGEEEHJLMORRRSTTUUTTW\\\^_abbeedddddeeeaT?//jnmb,Omx|~||zyy~}||}€~€€ƒƒ€}}~€‚ƒ€ƒ‚‚‚€€‚„…„‚€€‚…‡†„„…†…†ˆˆ†…„ƒ‚…†‡ˆˆ†„ƒƒ„………††††‡†„ƒ…‡†ƒ‚‚ƒ„‡‰Š‰ˆ‡‰Šˆ…†ˆŠ‹‹‹‹ˆ‡ˆˆ‡ˆ‰ŒŠ‰Š‹‹Š‹Š‰‰ˆ†„†ˆˆ‡‰‰‰ŠŠ‰Š‘‹‰ˆˆˆ‰ŠŒŒŒŒŠ††‡‰‹ŒŽŽŽ‘‘‘ŽŽ‘’‹ŠŠŒŽŒ‹ŒŽŽŒŠŠ–…^ !$*-.1469;=BEFFFIKJHGIKMNPQQPRTSSUTTWZZ\_`abdhhffecceedd^L-3^jmc&Cjx|~|||{|€~||}€€€€~~€„„€€€~€€€ƒ……„‚‚€€„ˆ†„…†‡†‡ˆˆ‡††…ƒ„‡‡‡ˆˆ†……†‡ˆ‡†††……†…„ƒƒ……„ƒƒ„…‡ˆˆ‡ˆ‰Š‹‰‡ˆ‹‹‰ŠŒŠˆŠ‹Š‹ŒŽŽŒŒŒ‹‹‹‰‡†‡‡ˆ‰‰ŠŠ‰‰Š‹‰‰Ž‘‹Š‰Š‹ŒŽŽŽŒŒŠˆˆ‰Š‹ŽŽŽ‘’’‘‘‘‘‘Ž’ŒŽŽŽŽ‹ˆˆ”u "&*-14469<?CDDFJJIJKKLNPPOPSTSSSSUTW[[Z[^`beedefgfddfeddbR1-E`ke'Dbqy}|zz{}}}|zy}}}||}}}}}~€‚‚‚‚€}}}{{}€€„…„‚€€‚‚‚‚„……†‡‡†‡ˆˆ‡ˆ‰ˆ††††……†ˆ‰‡„„„„„„„„ƒƒƒ‚‚„…†‡††ˆ‹Œ‹‰‰ˆ‡ˆˆˆˆˆˆˆˆ‰‰Š‹‹‹‹Š‹‹Š‡„…‡‡††‡‡ˆ‰ŠŠ‰‰‰ŠŒŒ‹‹Š‰ŠŠŠŠŠŠŠŠ‹Ž‹‹ŒŠŒŽŒŒŽŽŽŽŽŽŽŒŽŒŽŽŽŽŽŽŒŒŠ‰‰Œª‰ "$'*-256:=?ADEGKMKJMNNOQRQOOSTTTSTWY[]]\\]_bddcfgfeeggfddcW=19Shl%A\nvzyxyz{{{zyz~}{{}~~~~€€‚‚‚€~~}{|‚‚…„‚€€€~€ƒƒ‚…ˆ†…††ˆ‰ŠŠ‰‰‰‡……††…„†‡ˆ‡…„……„„„…„„ƒ‚‚ƒ„……‡ˆ‰‹Ž‹‰‰ˆ‡ˆŠ‹‹‰‰ŠŠŠ‰Š‹ŠŠŠŠˆ‰‹‹Š‡‡ˆˆˆˆˆ‰Š‹‹‹ŒŒ‹‹‹ŒŒŒŒ‹Š‰Š‰‰ŠŒŒŒŽ’‘‘ŒŽŽŽŽŽŽŽŒŒ‹ŠŠ‰¡—!$%)-059;=?@CEGJOPQRSSRSSSROOSVVVUWZ]^__^___adccfhgfhjiheecYG4)3`n#?Zjvywvyzzzzzz{€}{{|}~~~~€€~€€€€~~€ƒ„ƒ€~€‚€€‚…„‚†ˆ†……†‡ˆ‰ˆˆˆˆ‡…………„ƒƒ„„„………†……†††‡‡†…„………†‰‹‹ŒŒŠ‰‰‡‡‰ŠŠ‰†‡Š‹Š‰Š‰ˆ†„„†ŠŒŒ‹‹ŠŠŠŠ‰ˆŠŒŒ‹‹‹‹ŒŽŒ‹ŒŒŒŠ‹ŒŽŽŒŒŽŽ‘ŽŽ‘’’‘Ž‹‰‡”š. #$%)-048:<?BEFHMPQSVWUTRRTSPPSVVVVVY\^_`^____bcdffefijihfebZP<$/UT !>[jswvvy{zyyyz|~~|{|}~€‚ƒƒƒ€€€€€‚ƒ‚€~‚ƒ„„„€‚…„ƒƒ„‡‡„„‡ˆ†……†ˆˆˆˆ‡‡ˆˆ‡†……ƒ‚‚„……†††‡‡‡ˆŠŠŠ‰‡†ˆˆ‰‹Œ‹Š‹‹‹Šˆˆ‰Š‰‡…†Š‹Š‰Š‰‡…‚ƒˆŽŽŒ‹Š‹‹‹ŠŠŠ‹‹ŒŒ‹Š‹ŽŽŽŽŠŠŒ‹ŒŽŽŽ‹ŠŠ‹ŽŽŽ‘’’‘‘‘’’’ŽŽŽŽ‹ˆ†”›K!"#$%(+/26:=AEGHKQSQRUUTRQRUVTSUUTUWWYZ\_ba`aaaaceeeeegihhfd`[UE&*OR% !"#"! 9fksxwxz{zzz{|}~~~{z|~€‚„„‚€€€€€€~ƒ‚€€ƒ„…„ƒ‚…†…„ƒ„†‡……††ƒƒ„†‰ˆ‡‡‡††‡‡†…„‚ƒ…††‡ˆˆˆˆˆ‰‰‰ŠŠˆ‡ˆŠ‹‹‰ˆ‰Š‹‹‹Š‰ŠŠˆ††‡ŠŠ‰‰Š‰ˆ‡…†ŠŽŽŒ‹ŠŠ‹Œ‹‰ˆˆ‰ŠŠ‰‰Š‹ŒŒŽŽŽŽŽŽŒ‰Š‹‹‰ŠŽŽŒŠ‹‘‘’’““’ŽŽŽŽŒ‹‰ˆ–š`( !"$&)-16:?CGJKMSURQSRQPQQTVVVVUTVYZ[Z[\^_`abbbcddefghiiifc`\YK,.RW9 "$%%$#"/`otyxx{|}}}~€€}|~€‚‚‚„ƒ€~€€€‚‚ƒƒƒ„……†‡†……„…‡‡†……†ˆˆ‡‡…‚‚„†ˆˆ†††……†‡‡†…„„„†‡ˆˆ‰Š‹Œ‹Šˆˆˆ‰‹ŒŒ‰‰‹‹ˆˆ‰‰‰‹Œ‹Ž‹‰ˆŠŒŒŠŠŠ‹‹‹‰‰ŽŒ‹‹‹‹Œ‹ŠŠ‰‰‰‹‹‹‹‹‹ŽŽŒŠŠ‹‹‰‰‘Ž‘’““’‘‘’’‘’’‘‘’““‘Œ‹Š‰‰ŠœyJ !"#$(+.39>CGIKMNSVTTVTRRSSTUVWXXVVY]^]\\\_abccefgghijjijifc`^[O22SYA #%$$$#2Zntxxx{~~€€~€‚‚€~}~‚„ƒ‚ƒ„„„†‡‡†††…†‡…ƒƒ…………†ˆˆ‡†ƒ‚ƒ„„„„††……††‡‰‰‰ˆ‡‡ˆ‰Š‹‹‹ŠŠ‰ˆ††ˆ‹ŒŒŠ‰‰ŠŠˆˆˆ‡‡‰ŠŒŽŒŠ‰‹ŒŒ‹ŠŠ‹‹Š‰ŠŽŽ‹‰ˆˆŠ‹‹‹ŒŒ‹‹‹ŒŒŒŒŽŒŒŒ‰ˆ‹Ž‘‘ŽŒŒŽŽŽŽŽŽ‘’““’’’’‘‘‘Ž‹‰ˆˆŠŠ›…X "&(')+-17=CGIJKMQTTWYXVUVVUUUUVYWUX[]]^]]_``abeghiiikjiigb_^^\Q87T[F#!#$$" /Xiswxy{€~€‚€€€€}}~}€‚ƒƒ„†…„…†……„ƒƒ…‡…€‚„„†‡ˆ‡……„ƒ‚‚‚‚‚„†‡‡‡ˆˆ‰ŠŠ‰ˆ‡‡‡‰Š‹‹Š‰Š‹Š‡†‡‰Š‹Œ‹ˆˆˆ‰‰‰‰ˆˆ‰‹ŒŠŠŠŒŽ‹Š‰‹Š‰‰‹ŽŽ‹‰ˆ††ˆ‰‰ŠŒŒŒŽŒŒŽŽŽŽŽŽ‹‰‹ŽŽŽ‘““”“’’’‘’’ŽŒ‹ŠŠŠ˜\ "'++)),05<ADHIKMQSTWZZYYYYYXVTSVXUW[\^___`aaabehiijjlljif_[^_\T@<QXF'!!""!0Tgqvy{}€~~€~€€€€~~~~}{|~„„………†…‚‚€ƒ‚„„†ˆ‡„„…††„‚‚‚ƒ…††‡ˆ‰‰‰ˆ‡…†‡‡†ˆŠŠ‰‰ˆŠŒŠ‡†‡ˆ‰Œ‰‡ˆ‰‰Š‹Š‰‹‹Š‰ˆ‡ˆŠŒŽ‹Š‰‰‰ˆ‰‰‹Šˆˆ††ˆŠŠŠ‹ŒŒŒŒŽŽŽŽŒŒ‘ŒŒŽŽŽŽŽŽ‘‘“””“ŽŽŽŽŽ‹ŠŒ“{U!#',-*)-26;=?EILORSUWXXYZZYXYXVVWWVY\\^`__`abccehihhillkie_^`a^VF=JQD( 3Vhsy}€‚ƒ€~~~€€€€€€€€~}{z|ƒ††††‡ˆ‡ƒ€€~‚…†……ˆ‡…„‡ˆˆ†…„„†ˆˆ‡‡‡‡††…„„‡Š‹ŠŠŠ‹‹Š‰‰‹‹‰‡‡ˆŠ‘ŽŠ‰‰ŠŠŠ‹‹ŒŒŠˆˆ‰ˆ‰‹Ž‹ŠŠŠ‰ŠŒŒŠ‰ˆ‰‰‡‰ŽŒŽŽŽŽŽŽŽ‘Ž‘‘Ž‘’‘‘‘‘‘’“•••’‘‘’’‘ŽŽ‘ŽŒŒŠŠŽuU $',//-.379:=@FLOPRSVXYYZ[[YWY[[[ZYY[\]`a``abdffghhhhjklkiebbde`WH<AG?(5Xjx{~€€ƒ‚€€€‚‚‚€€€~|yz~…‡ˆ‡†…††ƒ€€‚…ˆˆ…„††„…‡‰‰ˆ‡††ˆŠŠ‡…††…„ƒ‚‚‡ŒŽŒŠŠŒ‹ˆ‡‰ŠŠ‰ˆ‰Œ‰‰ŠŠ‰‰Š‹ŒŒŠ‰‰‹‹ŠŒŽŽŒ‹‰‰‹Œ‰‡‡ˆ‹ŒŠŠŽŽŽŒŒŽŽŽŽŽŽŽ‘‘’“‘’“’’’’‘’”•–•“’’’“‘ŽŒŽ‘‘ŒŠ‹‹ŠŽnN""&)-011248::=BHMPPPQUXZ[[\]\ZZ[[[[[\[Z[^_^__`cghhhhhhjkjjhfcbdd`XK@@D>(5Xny|~€€ƒƒƒƒ‚ƒ‚€€‚ƒ‚€€~}ƒ…‡ˆˆ‡…„„„„ƒ‚‚‚ƒƒ„†ˆŠ‰…ƒ……ƒƒ…ˆ‰‰Š‰ˆˆŠ‹‰‡ˆ‰‡†……ƒ†‰ŠŠŠŠŒŒ‰ˆ‹Œ‹‹ŽŽ‹ˆ‰‹Œ‹‹‹ŒŒŒ‹Š‰ŠŠ‰ŒŽŽŒ‹ŒŽŒ‰‰Š‹Œ‹ŒŽŒŒŽŒ‹ŒŽŽŽŽ‘‘Ž’’’““’‘’“”“’“”””–—•”“’“””’ŽŽŒ‰Š‹‹ŒdC $'*,034348;<?CHMPQRTXZ[\\]^]][[[[\]]\[\]\\]__bfhiiihhjjjjihecdc_YOFCD<%5Yoz|€€ƒƒƒ„„ƒ‚€€„„}}~~~€‚ƒ„††…ƒƒ‚‚ƒƒ„„„„…†‡ˆ‰Šˆ…„……ƒƒ†‡‰‰‰ˆ†‡‰‰ˆ‰‰‡††…„…‡‡‡‡ˆŠ‹‹Š‹ŒŒ‹ŠŒŠˆ‡‰ŒŒŒŒŒŒŒŒŠˆ‰ŠŠŒŒŽŒ‹ŒŒŽŒ‹Š‹‹Œ‹ŒŒŒ‹‹‹ŒŒŽŽŽŽŒŠ‹ŒŒŒŽŽŒ’’’’’’““””“‘‘“••••“’’““”“ŽŽ‘‘Ž‹‰ˆŠŠ“_> %()+045347;<>BGKOSVZ\]]]]^_^]\\^^^^^^]^^][\^_acehihfgghjkjhedc`\XSKFC7!5^r{}€‚‚‚ƒ„„„„‚€€ƒƒ}||}}‚„„………„‚€‚‚ƒƒ„„„„…‡ˆ‰ŠŠ‰‡†††„ƒ„†‡‰ŠŠˆ‡‡ˆ‰‰‰‰ˆ‡†††‡ˆˆ‡‡ˆ‰Š‹‹ŒŠŠ‹ŽŒŠˆ‡‰ŒŽŽŒ‹‹ŒŽŒŒŒŠŠŒŽŒŠ‹Œ‹‹ŒŒ‹‹ŒŒŒŒŒŒŽŽŽŽŽ‘“““““”•”””“‘’•––•“’’”••”‘‘’’‘ŽŒŠŠŒ‹—‹V7!'*,.256568;<>DIKOTY^`^^_aaa_^^^``^]]]^_`a```abbdhigfhhikmjgfea^ZXTLGB/4^ow}ƒƒ‚‚ƒƒ‚€€ƒ„ƒ‚~‚ƒ„„ƒ‚€‚ƒ‚ƒƒƒ‚„†‡‡ˆˆ†………………††‡ˆŠŠŠŠ‰ˆˆˆˆ‰ˆ†………‡‰Šˆ‡ˆŠŠ‹‹‹Š‰ˆŠŽŽŠˆ†ˆŒŽ‘Œ‹‹ŽŒŒŠ‰ŠŽ‹‡ˆ‹‹‹ŒŽŽŒ‹‹‹ŒŽŽŽŒŒŒŽŽŽŽ““““““““”””“’‘“””””“’”””“’‘‘‘‘‘‹Š˜ƒI-"'+.146668:<<@FLMOTY\]\]`bcba``__^\[ZZZ\]_ababcccfgffhjklkhfge`[WVTOI=#2\my~€‚ƒ€~~~„……„‚‚‚€„…„ƒ€€‚„ƒ€‚ƒƒ„…‡ˆ‡†…ƒ‚ƒ„…†ˆˆ‡†‡‰‹Œ‹ŠŠŠ‰‰‰ˆ†……‡ˆŠ‹ˆ†ˆŒ‹Šˆˆ‰ŒŽŽŒ‰‡‡‰ŒŽŽŽŠ‰‹ŽŒŒŽŒ‹Ž‹ˆŠ‘Œ‹‹Š‹ŒŒŽ‘ŽŽŽŽŽ‘’““’‘‘‘‘‘’“’’’’’‘’””““’‘‘’“”“’““““’’’’’’’’ŽŽ‹Š‹‘•~L. #(-1466568;=>BIMOQTXYZYZ]`aa```_^\ZYYWXZ[]bcbbcedefeegikkigefe`ZVTROK8,_ox~€€€€€€~}}}|~‚…†…ƒ‚~}}€„…ƒ‚‚‚‚‚„„€‚„†‡ˆ‡…„‚‚€‚…‡‰‰ˆ†…‡‹ŒŠ‡ˆŠ‰‡‡†„„…‰ŠŠˆ……‡‹ŒŠ‰ˆˆ‰ŒŒŠˆ‡ˆ‹ŽŽ‹ˆ‡‰‹‹ŽŠŠŠŒŒŒ‹ŒŒ‹Œ‹‰‰‹ŠŒ‘Ž‹Š‹Š‹ŒŽŽ‹Œ‘‘ŽŽ‘‘“”””“’““’’’‘‘‘‘’“““”“‘‘“”‘‘““’’‘‘’’’‘ŽŽŽ‹Š‰ŠxJ+"'+/1232368<?DIKNPSUVXZZ[]_____^]\[[ZXX[\^bdbbcdeeggfefgghhfdc`[XSNLJ5"/\ox}~€€€€~}|zz|€„……„ƒ~~„„„„…„‚‚……ƒ‚ƒ…‡ˆ‰ˆ…ƒƒƒ‚‚ƒ†ˆ‰‰ˆ††‡ŠŒ‹ˆ‡ˆˆ‡……††‡ŠŒ‹ˆ†‡ˆ‰Š‰‰ŠŠ‹ŒŽŽ‹Š‰ŠŒŠˆˆ‰ŠŒŽŠ‰‰ŠŠ‹ŒŒ‹ŒŒŒŒ‹ŠŠŠŠŒŽŽŒ‹ŒŽŽŽŽŽ‘‘“““””””””””‘‘“’’““’““”””’‘’””’’’“““’’“’’‘‹‹‰…‰rG*!'*,-.01257:@FIKLNQUWZ\\\]___`_]]]\\[YZ]__cedddeffhkjihggghhfca^[UKFB.#%(+./.,,,-.//02465444420,)&#!"#$#"!"""""$&%$$(',A]nw|~€€€‚‚€}{yyz~‚„„……„‚‚ƒ‚‚ƒ„‡ˆ†ƒ‚„†„‚ƒƒƒ†‡‰Š‰†„ƒ„„„…‡‰‰‡†††‡‰‹Šˆ‡…†……†‡‡ˆŠŒ‹Š‰‡‡‡†…†‰‹ŒŽŽŒ‹‹‘ŽŒŒŒ‹‹‹Š‹Œ‘Šˆ‰‰‡ˆ‹ŒŠŠ‹ŒŒ‹ŠŠŠ‹‹Œ‹Š‹ŒŽŒ‹Œ‘ŽŽ‘’“’’““’’‘‘‘‘‘’””“““““’“••–•““““’‘‘“””’ŽŒŒŒ‹ŠŠ‹i@'!&))*,/13468=CGFHLPTX[]^^_`aaa`^]]]\[[[^^^_abdfghhhjnnmjihhhgdb`]VI=5%:=BGLOLFDEHJGFILNNNOQQSTRNID=9<CIJGB?ABCACFE@>CIKXeqw{}€‚ƒ€}zy{~‚…†ˆˆ†„………‚‚…ˆŠ‰†……†„‚ƒ„…‡‡ˆ‰Šˆ†„…†‡ˆˆ‰‰‡…†‡‡ˆˆˆˆ‡…„„…‡‡‡ˆ‹ŒŒ‹ˆ‡ˆˆ‡†‡ŠŽŽŽŒŒŒŽŽŽŽŽŽŽ‘ŠˆŠŒ‰‡ŠŠ‰‰ŒŽŒ‹‹ŒŒ‹ŠŠ‹ŽŽŽŽŽŒŒ‘‘’‘ŽŽ’’’‘’“‘’”’‘“”“’‘’’‘‘”•”•—–•““““’“””’Š‹ŒŠŠŠš^;% &)*+-023568<BEDGLPSW[^`a`abbca``_^\[[Z]^]]`begikkijnpmjjiigedc`\UI9*KOV[`dc^Z\`_[Z^biihfgghgeb`__[]bjnmg_^__bgkljjkkkpstwz}}~€‚ƒ‚‚‚~{{}€ƒ…‡‰‰†ƒ„…„‚…ˆˆ‰‰ˆ‡†„ƒ„†‡ˆ†††‡‡†„„‡ˆ‰ˆˆˆ†…†‡†…†‡ˆ‡„ƒ„‡‰‰ˆˆŠ‹Š‰‡‡‰‰‡‡ˆ‹ŒŒŒŒ‹ŒŽŒŒ‹ŒŽ‘‘ŽŽ‹ŠŽ‹Œ‹ˆˆ‹ŒŽŽ‹‰‰‹ŽŒ‹‹‘‘’‘’’‘‘Ž‘‘‘“’‘’”“‘‘’“‘‘Ž‘••“”––”’’““‘’’‘Ž‹ŠŠŠ‰‰‰—pY@$!&+,.1123689;?CDFINSVZ]`abbcdedcb`_][YW[_^]`dfhjkkkkmnkjiiheddd`[TH5!W\chknmjhjmmjikqvxrrrsrtnmqsrporx|zvrqnoq|{||}}wwxwxy}€ƒƒ‚€~‚„„…‡‰ˆ…ƒ…†„‚ƒ‡‰‡ˆ‹‹‰‡…„†ˆ‰ˆ…„„„…†……ˆŠŠˆ†††…††„„‡‰‰ˆ††‡ŠŒ‹‹ŠŠ‰ˆ‰ŠŠ‰‰‹ŒŒŒŒŒŽŽŽŒ‹ŒŽ‘ŽŽŽŽŒŽŽŽŠ‰Š‹ŒŽŽŠˆ‰ŒŠ‹’“•“’’‘ŽŽ’”““’‘’““““’’““‘‘’’‘‘‘‘‘’•””–—•”’“•”’’‘ŽŒŒ‹Š‰‰ˆmX?##(,.144369:::<BGHJNTWY\`cddfghgeb`_][XWY^`_aehhjlmnmmlkkkjgffgfa[SF0`dlpqrqpopsutsrswywwxxxurruwvtux|}{xwwwxy~~~}|zxxxy{€€€~~„…„„…‡…ƒ‚„…„ƒ……„†ŠŠˆ†…†‰Š‹‰†„‚‚„……‡‰ˆ†„…†††…‚…‰ŠŠ‰‡‰‹ŒŒŒŒŒ‹Š‰‰Š‹ŠŠ‹‹‹‰‰ŠŽŽŒ‹ŠŒ‹‹ŒŒŽŽŽŽŽŽŽ‹‰‰Š‹ŽŠ‰ŠŽŽ‘’‘’’‘Ž‘’’’’’‘‘’’“”“’‘‘‘ŽŽ‘’““““““““‘’–—”’’”–”’’‘ŽŽŒ‹ŠŠŠˆŽkR;!#(+.03337;988:AHKLNUYY[_ceffhigeb^][YYXY\_`behhjmopnmllmmkggijga[RB)gjprrrrstuxyxwvvx{{z{|{xuvz|zwwz~|z{||||‚€}zwx|~€‚‚‚€€~~~~~€ƒ„„ƒƒƒ‚€€‚„ƒ€‚ƒ„…‰‹ˆ†…ˆ‹Œ‹Šˆ†„‚ƒ……†ˆ‰‡…†††††…‡‰Š‰ˆˆŠŒ‹‹ŒŒŠ‰‰‹ŒŠŠŒ‹Šˆˆ‰‹Œ‹‹ŒŒŒŠŠŒŽ‹Š‰ŠŒŽŽŽŽ‘‘‘Œ‹‹Œ’’ŽŒ‘’““‘ŽŽ‘’‘‘‘Ž’”““‘’“’‘Ž’’’““”––”“‘‘”–•’’“”“’’’ŽŽŒŒŒŠ‹’dF5"&*/12127<:78;AJOQRUY[]adeegjkigda^[Z[YY]^`beggjnqqonmllljgfikg`[Q;!jlqrpoqtwwyzyxwuwz||{{zxwxz{yxxz}~{{~€€‚}}|yvy‚ƒ‚€€~}~€€€€~}}€‚‚„…‡Š‰‡†‡‰ŠŠ‰‰ˆ†ƒ‚ƒ„„ƒ†ˆˆ‡†…†‡ˆˆ‰Š‰‡‡‡‰‹ŒŠŠ‹Œ‹‰ˆˆŠŒ‹‰‰Š‰‰ˆˆˆˆˆ‰ŠŠ‹Œ‹Š‹ŽŽ‹Š‰‰‹ŒŽ‘‘‘ŒŒŽ‘’‘ŽŽ‘““’‘ŽŒ‹ŒŽŽ“•”’‘‘’’’“’‘‘’”•”’’‘‘“””’‘’’’’“’ŽŽŽŒŒ‹ŠŠ’`B1!%(-13214898:=AHNSUVY]^_abdgkkihgdb`_^\\^_`beghjmonmmmkjjiffghf`[O6kmqromptwxyyxyxvwyyzzzyxxz{zyyz{}}}ƒƒ‚‚‚€}{{{yx|ƒƒƒƒ‚€€~‚‚ƒƒ€~~~€‚‚€„‡ˆ‰Š‰‡†‡ˆˆˆ‡ˆ‰ˆ†„………„…ˆŠ‰ˆ†ˆŠŒŒŒŠˆ‡‡‰ŠŒŠ‰‰‹Œ‹Š‰ˆ‰‹ŒŠ‰ŠŠŠŠŠŠŠ‹‹ŒŠŠŒŽŽŽŽŒ‹‹Œ‘“““’’’’ŽŽ’’‘“”““”“‘ŽŒŽ’”•”’’’‘‘‘’•–““••””•”““““”“’““••••“‘‘’’’’’‘ŽŽŽŒŠ‹•_>,"'),154237:<>BDIOTWX[_``acehjlkjigedda^]^_acfhiklmmllmkjjiffggfaZN6hjnomknsvvwwvwxxxwvvwwxyyz{zyyzzz~€ƒƒ‚‚‚{yyz{{}€€‚„ƒ€„…„ƒ‚€€‚ƒ‚€„…„„„„ƒ…ˆ‰Š‰ˆ‡…††‡‡†‡‰‰†„…†‡††‡ŠŠ‰‡ˆŠŒŽŒ‰‡‡‡ˆ‰‰ˆ‰‹Œ‹‹ŠŠ‹‹‰‰ŠŠŠŒŽŽŒŠŠŒŽŒŒŽŽ‹‹ŽŽ’““““’‘‘ŽŽŽŽ’“’’“’Ž‘‘‘’“’’‘‘“””””•—˜––––•“”•••””“““’“––••”’“”“’‘‘‘‘ŽŽŽ‹Š‘Y;'$)+,044447<==BFINSVVY^_`bdfhijjihhffea^]^_acdfgjjjlllnnnmjgeeeeaYM6bfjkjjnruvvutvwxwwwvvwy{{{|{yyzzy|€‚ƒƒ‚~|zy{|}€€‚†…‚€€ƒ††„ƒ‚ƒ„„„‚ƒƒ…‡ˆ‡†††…†‡‡‡‡††………†‡††ˆˆ†……ˆŠŠ‰‰‹‹Š‰ˆˆ‰ŒŽŽ‹‰‡†‡ˆ‰Š‹ŽŒ‹ŒŒ‹Šˆ‰‹ŒŽŽŽŒŒŒ‹ŒŒ‰‰ŒŽŽŠŠŽ‘‘“’““’‘ŽŽŒŒ‘““’““‘ŽŽ‘’““‘‘“’‘“”’‘’”•––˜™™—–••”’’“”•––•”“’”—–””•”••”“’’“’’‹ˆV>" %*,.25776:>>>AFJNRRSX\_`bcehgggfgihfda_^_`acdehjjlnopprsplifcbcaZL4\agihjnqsuvutuwwwz{yxxy{|}}|{{}|z{}~‚ƒ~|{z{|‚ƒ‚€‚„„‚‚ƒ„„ƒ‚ƒ……„……†††‡ˆ†………………„ƒƒ„……„„…†…„…„ƒƒ„‡Š‹‹‰Š‹‹Šˆ†‡‹ŽŒŠˆ‡††ˆ‹ŒŒ‹‹ŒŒŒ‹‰‡‰‹ŒŽŒŠˆˆŠŒŒ‹Œ‹ˆ‡†ˆŒŽ‹‹‘‘“’ŽŽ‹Š‰‹‘‘‘’ŽŒŽ’”“‘‘‘‘‘’’‘‘‘‘“”••–˜—•“‘“”’‘’’“•–••”““””“’“•–”””””“’‘ŽŽŽP8!&(*.46888<??>AFIKMNRW[^`bcefgfedfhigdcaaa``bdfjnprqqrrrrqnjfcbb`[M0^afijloqsuvuuvvwy||zyz|}~~~~|}}|{{||}~~~}{{{}€ƒ„„ƒ„…„ƒƒƒ……„ƒ‚‚‚„…††…†‡ˆ††‡‡‡…„„ƒ„…ƒƒƒ„……ƒƒ„„‚‚‚‚‚‚…ˆŒ‹Š‹‹Š‰‡‡‰ŒŒŠŠŠˆ†‡Š‹ŠŠŠ‹‹Œ‹‰ŠŒŽŽ‹‰ˆ‰Š‹ŒŒ‹‰ˆ†‡ŠŽŒŽ’“’‘’”“ŽŽŽŽŒ‹‹Œ‘’‘““’‘’‘‘’“””““•—————–”’“••”“’’•–•••••••”“’•—•“•–”’ŽŽ’’~Q6#&(*.478:;=???BFJKNSWZ^acefghijjiijjjhfeca__aceiosttsstsrqokgcbb`\L-bdgkmqrrsuvwvuuw|~|zy{~~}|||{zzz{|}~€€€}|}}ƒƒƒƒƒ„„„„ƒ„„„„ƒ‚ƒ†ˆ‡†…†‡…ƒƒ…†‡†ƒƒ……„…‡ˆ†ƒ‚ƒƒ‚‚‚ƒ‡ŠŠ‰‰ŠŠŠŠˆ‡‡‰ŠŠŠ‹Œ‰‰‹Š‰ˆˆ‰‹ŒŽŽŒŠŠŒŽŒŒŽŽŠŠŒŒŠˆ‡‡ˆ‰ŠŒ““‘‘‘’‘Ž‘‘ŽŽŽŽ‘’’’’“’‘‘““‘‘“”•–••–——–••–•””––•”””——••••––——•”•—•’“”“‘ŒŽ“ˆrO5 $&)+/4569===>>BFHKQVZ[_bdefghilmmmlkkkhedb``abcfjnprsrrqqqnkhdcc`[L*^cinrtuuuuvwurrw}}{yz~€€}{{{{zyyz{|}~€€~€‚‚‚ƒ€€‚ƒ„………„ƒƒƒ„„‚†Š‰†……„‚‚ƒ…‡‡„‚…††‡ˆ‰†ƒƒ„„„ƒ‚„ƒƒ…‰Šˆ‡‰Š‹‹‹‰ˆ‡ˆˆˆ‰‹ŽŒ‰ˆˆˆ‰‹ŽŽŽ‹‹Ž‘‘‘‘‘’ŒŒ‹‹ŽŠ‰‰ˆ†‹’’‘‘‘‘‘‘‘‘‘’“‘ŽŽŽŽŽ‘‘’”•““”““””•”’‘’’““•———––—–•••”””–—•••–˜˜—˜—––—˜˜˜–•–•’’’’’‘ŽŽ—fK3!%(-147779=??@BFHIMRWZ\_beffgiiknpponlkifdccbccdfhjmpsrpoppnkifdc`\M+Zajquwwwxvuvurrw|~}zxx{~~~~|{||zyz|}}~~€€€ƒƒƒ‚€~ƒ„„ƒƒ„ƒƒƒƒ‚€ƒˆˆ†…„€€‚…‡‡…ƒ‚‚„…‡ˆˆˆ†…†††††……†…„†‰‰†…‡‰ŠŒŠˆ‡ˆˆ‡‡ˆ‰Š‹‹‹ŒŠˆˆ‰‹ŽŽ‘‘’““’Ž‰ˆŠ‹ŒŒŒŽŽ‹‹ŽŽŽ‘‘‘’‘‘’’““‘ŽŽŒ‘‘‘’“’“”“”•””–•“’““”••••••–•”““’’“–—•••”•—˜˜˜—––—––•“”•“’’’’‘ŽŽŽŽšzbM0#&-259:9:=?@CEILLNSWZ\^befefhijlnpqpnlifecccddfhjlnnoonmmnokhgec`\N-Zclswzyzzxvvuttx{{{xvwz|~~~~}}|{{}~€€€‚ƒƒ‚€€ƒƒ„„ƒƒ„„ƒƒ‚€„ˆˆ……†‚€ƒ…‡†…ƒƒ…ˆ‰‰ˆ‡‡‡ˆ‡‡ˆˆˆ‡…„‡ˆˆ…„†ˆŠ‹‡‡‰Šˆ‡ˆŠ‹Š‰ˆ‰‰ˆ‰‹Ž‘‘‘‘‘’““‘ŒŠŠŒŽ‘‹‹Œ‘’’’Ž‘““’‘‘’’“’‘‘‘Ž‘’‘‘‘’“••••”•—•“’“”••”“““•—–“’“““”–˜——–••——˜š›™—–••–•”••”“’‘‘Ž—i\J,"(/469<;<>?AFILMOPSVY\_cggfgjlmmnpstrnjggecddehkmnqqppqomnokgfeb_[M-[bkqtwyyzywwwxxxyzzwuuwz}~~~}|~€€€~|}~€„„ƒ€‚ƒƒ„„……„„„……„„ƒƒ„†ˆˆ††‡„‚‚ƒƒ…†…ƒ‚…ˆ‰‰ˆˆ‡‡‡‡ˆ‰‰‰ˆ†……ˆ‰ˆ…„…‡ŠŒ‹‡‡‹Œ‹‰‰‹Œˆ†‡ˆ‰Œ‘Ž’“’‘‘‘ŒŒ‘‘‘‘ŽŠˆŠŒŽ’““‘‘’’‘’““’‘’’‘‘‘“••”““””“’•••“’“”–˜–’“•–———˜———–•–•—™š™—•”•——–””••’‘’’‘‘•VUF)$+2668;;>?@CGJLMOQSVX[_begghkmoonnqtsnihhfddeegjjkoqrstrpnmkgda_]YK+Z_fkptxyyyxyzzyxyyxvtuwz~€€€€€‚‚€||~……ƒ€ƒ„ƒƒ…‡††††‡‡‡‡†††ˆ‰‡†††……†‡††‡†ƒ„ˆŠ‰ˆ‡‡‡‡††ˆŠ‰ˆ‡…„†ŠŒ‰‡†‡‡ˆŠŠ‡‡ŒŽ‹‰‹ŽŠˆˆ‰Š’Ž‹ŒŽ’’ŒŽŒ‹’’‘’““‘ŒˆŽŽŽ‘’‘‘’‘‘Ž‘’’’“”••”””““’’“””””••”’‘‘’”••””•—˜™—••–——™™˜——˜˜–––—˜˜———–•—˜–””–—•““””’Œ•“UT@'(06::;=?AABFIKNPRSWYZ\`bfijkmoqqonopqokijhffghiiiimprrssqnljgb^_]XJ)TVZ_cmruuwxy{|zxxxvuttwz}~~~€‚‚ƒƒ‚€}}~……‚€ƒ…„ƒ…††…‡‡‡‡‡†……†‡ˆ†…………‡‰‰ˆ‡‡‡…‚‚…‰Š‡†‡‡††‡‰‹‹ˆ†…„„†‹‹Š‹Šˆˆˆˆ‡ˆŒŽŽŒŠ‹ŽŽŽŽŒŒŽŒŠŒŽ‘Ž‹‹Œ‹‰‰‹’””“‘‘‘Ž‘’’’’‘‘”•••”“’’“’“””””•••“““’’“••–—˜˜—––——”“–™™——˜˜—––—˜—•—˜˜–—˜—““–—•“’“’‘‹‘SM:%#,27<>?ACCBDHJKNQSUZ]]]`cfjklmorqpomklmljihgghjkjjjlnonnonmkhea`a_XK*KKMPWalorvxy{|{zxxxwuux{}}}~€‚‚‚‚}}€‚„„‚€€‚„„ƒƒ„„…‡‡‡††…„„††††……†‡Š‹‹‰ˆˆ‡„ƒƒ†Š‹‰‡ˆˆˆˆŠŽ‹‡„„„…ˆŒ‹‹ŒŠˆˆˆˆŠŒŽŽŒŒŽŽŽŽ‘ŽŒŒŒŠˆ‰‹Œ‘““‘‘’’’‘‘‘““’‘‘‘‘ŽŽŽ‘’”•••“’’“““”––—––—–••”’‘’”•–—˜—•”—™—”“–š›š™™˜—––—˜—–—˜˜––—–”“••”’‘‘“’‘Œ‘PG7$"+37<AEEEEFFGJLLNQSV[___acgloppqsrqrpmjkljhghhgiklllmnmmmmmlkgdbab`ZM+VUQPRW_hpvyz|}}|zzzywwy|}}|}€~~€€‚}~€‚‚€‚ƒ‚€ƒ„…„…………„„…………†‡ˆ‰‹Œ‹ˆ‡ˆ‡ƒ‚ƒ†‰Šˆ‡‡ˆˆ‰ŒŽŽˆ†……‡Š‹ˆ‰ŒŠˆˆ‰Š‹ŒŽŽŽŽŒŒŽŽ‹ŒŽŒ‰ŠŠŠŒŽŽ‘ŽŽŽŽ‘‘’‘ŽŒŽ’“““““’“”””••••””——•••”’’“”•—˜–””–˜—––˜™™™™™—•••–˜————–••–••”””’’’•“‰Š†U@4#)18<?BEGHGHIJKNNNPSX[]^_abejnpppqqqsrpkikjhghgeefgiklmnmnmmmkgeccb`\N,[RQZfqwz|}}}}{{{zy{}}}}||~~|{}}}}~€~„„‚„…„ƒ…††‡‡†††……†‡ˆ‰‹‹Š‡‡ˆ‡ƒ‚ƒ„…†‡††‡‰‹ŽŠˆ†‡‰‹ŒŠ†‡Œ‹‰‰‹Œ‹Œ‘ŽŒŽŽŽŽŒ‹‹ŒŒŽŒŠŒŽŽŒ‹ŠŠŠ‰ŠŽ‘ŽŒŒŽŽ‘“‘‘’’’“””’’“’“““”•••–˜—–””•”“”˜˜––—–––•””—™˜–••––—™™™˜˜˜˜—–••–˜™™™˜—–——–––”“““’”–—‡‡M:0 $08?BCDFJMLLMORUUUUX[^^^_acfjmoppqqqrsrollkiijhfeeegkmnppommmkhedddb]M,+OW*NRXdpwz|||{{{zzzz|~}||}~~{xxy}‚}{yyy{|}ƒ††ƒ‚‚„…„„‡‡‡ˆˆ‡‡‡†…………‡ˆ‰ˆ††‡†ƒ‚ƒ‚‚ƒ„„„†‡ŠŒŽ‹‰‡‡ˆ‰Š‹‰†‡‹ŒŠ‰‰‹Œ‹ŒŽŒŒŒŽŽŒ‹ŠŠŒŽŽŒ‹ŒŒ‹‹Œ‹‹ˆŽ‘‘Š‰‹Ž‘‘ŽŽ‘““‘‘“”“””“”“’’“’––”””“”•––––—“’’““’”—–••––—˜—•“–™™˜—•””—™š™˜˜———˜˜—–—™™™˜—––———–””••••”’‘Š‡vI8-)4;@DFFHMRRRQTY[[Z[]_`__`acfhjmnorqpopqnmlkiijhfefgiklmpqommnlieddec^M*Ï¿ŸkSR^muz{{zyzzzz{|~€€~~}zwwx{€ƒ‚}zyxwz~„‡†„ƒƒ„……†ˆ‰‰‰ˆ‡‡‡‡†…„ƒ…‡‡‡‡†‡†„ƒƒƒ‚ƒƒ„…‡ˆŠŒŠ‰‰‰‰‰ˆ‰ŠŠ‡‡ˆ‰‰ˆ‰‹ŒŒ‹Š‰‰‹ŽŽŽŽŽŽŽŽ’’‘’’’ŽŒŠŠŒ’“’‘‘‘””““”•••”’’“”““”“•——•””•–—–•”‘“““””””““”–——–”–—˜š™–––—˜™™˜——™››™˜ššš™˜—••–———–•”“•–”ŽŒnR7(#-9@EHJKLQVWWVY\_^]]_abcbbcfhhijlosspnnmlklkkjkjgefhkmnoqqpnoonkhfdcb^M)ëåϤR_lty{yxy{{zyz|~€€~€€€}zxwxz~‚ƒ}|{y|‚‚„†…ƒƒƒ„……„…†‡‰ˆ†‡ˆˆ‡‡‡‡‡††‡‡†‡†„ƒ„…†‡‡††ˆŠŠŒŒ‰ŠŒŽŽŒ‰‰Š‰ˆˆˆ‰‰ˆˆ‰Š‹Š‡…†‰‘‘ŽŽŽŽ‘‘ŽŽŽŽŽ‘“””’““’‘ŽŒŒ‘’’’’’‘‘’““’“•–•’’““’’“’“••”‘’”•””“’’””“““””“’”•—˜—–••—šš™™š™——˜—––›™™š™™™˜˜•““””–—•’’“•“Ž’seO4 '1<DGHJKLPUYZZ[]^^]^acdfggghiiiiknstsolkjihjkkjjhffgilmopponoonmkheba_N)ëèÞ¿Q[ktxzywy||{zz{|}€€€~|{zyz~‚ƒƒ~€ƒ„„„……ƒƒƒ…‡†„ƒ„†ˆˆ†‡ˆˆ‰ŠŠŠˆ††‡‡††‡……†ˆ‹Œ‹ˆˆ‰Š‹ŠŒŽ‘ŒŒ‹Š‹ŒŠˆˆŠ‹ŒŒˆ…†‰‘ŽŽŽŽ‘‘‘ŽŒŒ‘“””•”••”‘ŽŒ‘’““’‘”•’‘”––““““‘‘’’“””’’””“’“””‘’”••••–—–•–—˜˜™™—–•—››ššš™˜——˜˜—›ž›››š˜™›šš—”’‘’–˜–“’’“’—dZI/%1<DHJIKLNSWZ]^^__``begghjjjjjkjjknrttqmmlhegjjiijkllllmoooonnnmljifdc_O*âãÞÅ29[luwxxwy|{{{{zz|‚‚‚}||{{|‚ƒƒ‚ƒƒ…‡†…„„‚‚…†…‚ƒ…‡‡‡‡ˆ‰ŠŠŠ‰†„„†‡‡‡ˆ‡‡‰Š‹Šˆ‰ŠŠŒŒ‹Œ‘‘Œ‹Š‹ŽŽŠˆŒŽŽ‰‰‰‹ŽŽŽŽŽ‘ŽŒŒŒŒŽ’’’‘’”••“‹‹’“‘’••‘’••““•–Ž‘’”–•“•–•”•——•”””••–—–”•—˜˜˜™š˜——˜š›š™——˜˜™››š›œ›ššš™™™šššœ—“‘’”–”““““‘‘¢ŒLSA+".;EIIJIKNQUYZ\^__adegjjihiihiklkkkmpsspoonjgfhihghloppoopponnnmkjjjihfaO,âãäÙ‰JGjuxwvvz}}|}|{{}„„‚€}|}}|~€‚‚‚€ƒ…†‡ˆ‡„€€‚„…ƒ€‚„…†‡‡‡ˆ‰‰Š‡„ƒ…ˆŠ‰ˆˆˆŠ‹ŒŒŒ‹‹‹ŠŠ‹ŒŽ‘ŽŒ‹‹ŠŠŒŽŽŠŠ“’ŽŒ‹‰ŠŽŽŽŽ‘‘ŽŒ‹ŽŽŽ‘’’‘’”“‘ŽŒŒŽ‘’’‘’““’Ž‘“””“’‘””’“•–”‘‘•˜——™š˜———˜–”•–––—˜—––—–•—™šš™˜™š›š™——™šœžœœœ›šš››œ›œ›››š•””••”••”“‘’šƒ@H;'(4?HLMLLNQTX\\]`cdefhjlljjjihkoponnoprtsqpomjhhiihilpqpoqrrqppomllllkjhbQ-äåêæÁˆ"crwwvx|~}{|}}~ƒƒ€~}{{{|||€€‚†‡ˆˆ†‚~€‚„„‚‚ƒ„†‡††‡‡‡„‚ƒ†‰‹‹ˆ‡†ˆ‹ŒŒ‹Š‹‹ŠŠŠŠŒŒŒŒŒ‰ˆ‡ˆ‰ŠŠ‹‹Œ‘ŽŽŒŠˆŠŽŽŽŒ‹ŽŽŽ‘‘”•”““’’‘’““”•“““’’””•“’‘’•——˜™™———™˜––—˜—˜š›š˜—–••—™›š™˜˜™™˜———™›œ››œœ™˜™š›››œœ››š—–––——–•“‘’™’vH?4#,6>GMOMNRTVY^^_adeeehkllkkkjkmooonnoqruusrqnlkkkjiilnonmnprrrqommnnmkigdS,ææëéÓ¤]muvwz}~{yz}€€€€}{zz{|}~€€€‚€…‡‡‡…€‚ƒ„…‡†……„……††††………}~‚†ˆ‰‰ˆ††‡ŠŒŠ‰‰‰‰‰‰Š‹Šˆ†…†……†‰‹‹ŒŒŽŽŽŽ‹‰Œ’ŽŒŒŒŽ‘‘Ž‹‹‘‘‘‘“•“’”——•”“‘‘””“”–”“”“”“’‘‘’’“””•–˜™™—–—š™˜™š˜—™œšš™˜˜˜—š›››š™™™™—–—˜™›œ›™™œš™š››››œ›šš›™˜——™™—”’™š€fD7*$3<BIPQPQUXY\abacfgeeijklllmnooppppppqqstttspmllkihjmopnllmpqrqpopqoligfdU,èèëêÔ—Zluwxy|}{yz}€~{zz||}€€€€„†‡‡…„†ˆ‡†„…ˆ‰ˆ†…………†††…„„‚………†ˆˆ‡†ˆŠ‹Šˆ‰‰ˆˆˆ‰Šˆ…‚ƒ…†‡‡ˆ‰ŠŠŒ‹Š‰‰ŠŠ‹ŒŽ‹‹““ŽŠ‰‡‰‹Œ‘’‘‘‹Œ’““‘““’’•——•“‘Ž‘“““”•’ŽŽ‘““““’’””‘’”˜———––——˜šš–•––•–˜™™™›œ››š™˜˜˜˜—–—˜™››š˜™››ššœ››ššš™˜˜™˜–•—˜˜–“‘–ZVE2!(7AEJQSRTWYY\`aacgigfiijlllmnpoopqrqqqppqstrnmkjhggimoomllkmopqrrttqlgeedU*èèëëÑ’ ]owxwwz|{zz}~}~~|zz{}}~€‚ƒ‚€~~‚„……„…‰Š‰‡„„†‰ˆ†„„………†‡‡…„‚‚‚„…„ƒ…ˆ‰‡…†ˆ‰‰‰‰Š‰‰ˆˆ‰‡†……ˆ‰ŠŠ‰‰‹ŒŽŠ‰‰‰‰‰Œ‘‹‹Ž‘‘‰ˆˆˆ‰ŠŒ‘’’’‘Ž“”“’‘‘‘‘’’•—–•”’‘‘’’’“”““””’‘’”•••”“’‘••‘“•–––––””—››˜••–••—™š›œœ›™˜˜˜™š™˜™šš››š™™››œ›››š™š™———˜—––——–””’Ž’…LO>+ -;CHLQRSUXYZ\`bcehhgikjkmmmnpqpppqqqpppoprrnkkihhgfgilkkmnmmmnprtvvsnhecbS(èèëëÄ^)bsxxvuxzzy{~}~€~{{}~~~„…ƒ~}~€€‚ƒ„„ƒ…ˆˆ†„‚€„…„ƒ‚ƒ„…‡ˆ‡†…„…††††…†ˆˆ††‡‡ˆˆˆ‰ŠŠ‰ˆˆ‰ˆˆˆ‰‰Š‹‹ˆ‰ŒŽ‹‹ŒŒ‹ŠŽ‘“‹Š‹ŒŒ‹‹‹ŽŽ“’ŽŽ’‘ŽŽ‘’”•”•”“”–•””””“““’‘‘’“••–––•’’––“’’’“““••”’”›š™—–—˜–•—™›œš™˜——˜™šš™™™™ššš™™šœ›˜˜™™š˜–—˜—–•––•“““”“€KH9&&2<CHMPRUVWXZ^acdfghiklllnnmnopppppnmnppopqqnkjihiigeefgknoonnnnprtuspkfcaR(çèëëLjuwvuuwyyy{~€€}|}~~€ƒ†…ƒ‚€€‚ƒƒƒƒ‚ƒ……„‚€~ƒƒ‚‚„†‰‰†……‡ˆ‰‰‰‰‰‡††…‡ˆˆ‡‡ˆ‰Š‹Šˆ‡ˆ‡ˆŠ‹ŒŒŒŒ‰‰ŒŽŒŒ‘‘‘’’‘ŽŽŽŒ“”“‘‘‘‘ŽŽŒ‹Ž‘’””••““•—–”–—–”’’‘‘’“”–—––——–”“•–—–“’‘‘‘’”“’“—™™™˜˜š™—˜›žŸœ—˜˜——™š››ššš™™™ššš››˜™ššš˜—˜˜—•””””’‘‘—–Œ|UC3"#.8BGJNSUXYY[]_bdefiijjmnnprqpppppponmoppqrsspmljhijihhiknpooooopqrttrokgc`R(éêëê[dovwvvwyzz{|~~€‚‚‚}~€ƒ„„ƒƒ‚‚‚ƒ„„„ƒ€€‚ƒ‚~€ƒ…ˆŠŠˆ……ˆŠŠ‹‹ŒŒ‰†…†‰Š‰‡ˆ‰‰Š‹Š‰‡ˆ‡‡‰‹ŒŒŒ‹‰‰ŒŽŽŒŒŒŒŒŽŽ’“‘ŽŽŽŽŽ‘“”“’‘’”••“ŽŒ‹Ž’””•••’’”•””–—•“‘‘’’’’’”–••—™™›”’•——•“““‘‘‘‘‘“”˜™™˜˜™›™™œ  œ˜˜™™—™šœ›šš››™˜šœžœš˜™››šš˜˜™˜——––•’Ž’—fOA0 *6@GIKOSUXXZ[]_`acehihhknnoqqpoppooppppoprsrqonmkihiiijklopnnoopqrsttrnjfc_P'èçêä]dovxyz{|{z{}~€‚ƒƒ‚}}€‚‚‚‚‚€ƒƒƒ„ƒ‚‚€‚€‚‚ƒ…†‡ˆ‰ˆ†„…‰ŠŠŠŠ‹‹ˆ††ˆŠŠ‰ˆ‰‰‰Š‹ŒŠ‰‰Š‹ŒŽŽŽ‹Š‹Ž‹‹ŒŽŽŽ‹‰ˆŽŽŽ‘’‘‘“”“’‘“•–•“‘ŽŽ“••••–”“””“”•–•“‘‘““““’”––•–š›™”’”——••••“’’“”–˜™šš™˜™œœ›ŸŸšš›œ›œŸžœœš˜šœžŸŸ›šš››››™˜™™™››™˜“‘Ž”›u[P>)!-9CJLMPSSVXY[]^_`cegjjjlnooqqqqrsqqrrrqoqssqqononmjihhikmopqqsrqqqqrqnkheb^M$½ºÒÃZeqxzz{}}z{}€‚‚ƒ„‚~{{~‚‚‚‚‚€„„„„ƒ‚ƒ„ƒ‚„…„„……„„†‰Š‰ˆ‡„ƒ„…‰Šˆ‡ˆŠ‰‡†‡‰‰ˆ‡ˆˆˆŠŒŽŽŒŠ‹ŒŽŽŽŽŒ‹ŒŽŽŒŠ‰‹ŒŒŒ‹‰ˆ‰‹ŒŒ‘’““‘‘’’’‘‘“””’‘‘’’‘‘”••”””•”“””“”””””’’”””“’”••“’ŽŽ‘”––••––•”——˜™™šš™™˜˜›œžžœ›šš›œš™šžžž›™š›œž Ÿ›››šššš™˜˜˜š™–””“‘“cSK8!'/:DJMOQRRUXYZ]_`adfhjllnpqpqqqptusrsstqpqrrrrqoppomjgfhjmpqrrttssrpolihgeb]J#•¤º”Rcsz{{|~}{|ƒ……„…„€{yy}ƒƒƒƒƒ‚‚„‡‡††„‚ƒ…ˆ‡…ƒ„‡‡††ˆ‰‡‡‰‹‹‰‡†ƒƒ„†ŠŠ‡†‡‰‰‡‡‡‰ˆ†‡‡ˆ‰‹ŽŽŒŒŽ‘‘Œ‹ŒŽŽŒŠŠ‹‹Š‰Š‹ŒŒŒŒŽ‘“”‘‘’’‘‘’””“Ž’“’‘‘”•”””•–—–••–••”“””“’’”•••––”’‘‹‰Ž’””••••—˜™ššššš›š˜™š™šœžžžœ›š™›œ™––—›œ››šœ  Ÿœœ››››››š™—˜˜—““”“ŽƒWTE.#1<CHMOPSTSUX\^_accefikmnoqrqqrrruvustttrqqrrssrppqrpmjijknqqqqrtuusqolhgfeb^I"ÐÄÔÃSeu{||{|}{y{ƒ…†††„{zz}‚„ƒƒ„ƒƒ„†ˆ‰‰‡…„„‡ˆˆ†ƒ„‡‡‡‡‡‡††‰‹Š‡†‡†……‡Š‹ˆ‡‰‹‹‰‰‰‰‡‡ˆˆ‰ŠŒŽŽŒŒŒŒŽŽŽŽŒ‰ŠŽŽŒ‹‹ŒŒŒŒ‘‘ŒŽŽ‘”’’“’Ž’““’Ž‘“‘’”“‘’“•—˜˜—•””•”“”•“‘’”–––”’‘‘Žˆ’’’“””•—šš›ššš˜™™™šš™——›œ›™˜™™š›™˜–•“™žžœšš›žœ›››ššššš˜——˜š™˜–““›’|ZL<&&7DHJMNPSUTUW[^``bcefhkmnnooopqqqsuttttsrqqrsssrpqqppnlkjjlmmnoprssrppokigdb^I"èåèÜQeu{|}|zzzyz~‚‚ƒ„ƒ}||~ƒƒƒ‚ƒƒ„†‡‰Š‰†……†‡†…„ƒ„†††„„„…‰Œ‹‡†‡‡†‡ˆŠ‹‰ˆŠŒŒ‹‰ˆ‡‡‰‹‹‹ŒŽŽŒ‹Œ‘Ž‹Š‹ŒŽŽŽ‘’“ŒŽŽ“’‘‘‘Ž‹‹‹‘‘‘“”“’””“‘’“•–—™™•’‘“”““”“‘‘’”–––•“’““˜›˜”““••””–™›œœ™™œžš–““œ™™˜™››š›››˜–—›žŸžž›™š›œœ››š™™››˜—˜™›œ›˜””¤‹tXE0,<FKNPOPSUVWXZ]_`acffhkmmnnnorsrqrstuutsrrrstsrrrqonmmlkjjkjjlmmnopnnpomkhd`[G"æçéÚOas{|}|zyyz{}}}}}€~~~€ƒƒ‚€ƒ„…†‡ˆˆ†ƒƒ„…„„ƒ‚ƒ……„‚‚„†‰ŒŠ‡†‡‡ˆˆˆŠ‹‰‰‹ŒŒ‰‡†…ˆŒ‹‹‹ŒŒŒŽŠ‰ŒŽŽŽŽŽ’“’‘’‘‘ŽŒŒŽŽ’’ŽŽŽ‹‰‰ŠŒ“””””””•“’’“””“”––’’”“‘’““””•–••••””–š›š”“˜—–”“–™›œœœ›™šŸ™“”—™™šžžœœžœ™™šœ™š›œ›™˜š››š›š˜—™š˜˜˜™™™™–“Ÿ¢zbR<%0=AFKNNOQTUXYY[]^`bddegjkmmmorsrrrstuuttsrrstrpprqnkjjiijklllmnmmnnnmnnmlje^WD æåèØQau{}~~|z{|}|{{{{|~€€‚‚„„‚‚„……††††„ƒ„„„ƒ‚„††„ƒ…†ˆŠ‹Š‡†‡ˆ‰‰ˆŠ‹‰‰‹‹Š‡†‡‡‰ŒŽŽŒŒŒ‹‹ŒŒŒŽŒŒ’‘“ŽŽ‘’”“’’’‘Œ‹‘‘’‘Ž‹Š‹ŒŒ‰ŒŽ•——–––––“‘“”•••––’‘‘““’’”–——––•”–˜——™››™–•˜™˜–•–šœœ›™™™šœœ™—”••—š›œŸŸœœœ›šššš˜™ššœœœœœœœœœš˜›œššš™˜—–•‘››tXM5$2=@CHLNPSUVXYYZ\]_abbcfilnnnortttuuutttuttsssrppqpnlkighjmnoppooooponnnnmje]UAéèçÑM^sz|~}|~~|{{{|{|}}‚‚‚…†…………„…„„‚€~€‚„„ƒƒ…‡ˆ‡††‡ˆŠ‹Šˆ††‡‰Š‰‰‹‹‰ˆˆˆ‡……†ˆŠ‹ŽŽŒŒŒŒŠ‹ŽŽŽŽŽŽ‘“‘Ž‘ŽŽ‘’‘ŒŠŒ’“’’’Œ‹“’’–•”–—•••–••’‘““•———–“’““’““”•—˜˜—–“’•———˜˜™˜–•—™˜––—˜œ›˜—™šš››™™››™—–šœœœš™›œšš››š™™š™™šœœœ›™ššššš™—˜—–’‹ŽpVG1)2<BEHKMPSUVVXYY[\^_abdfiloonorrsttuutttttssrqqppqomnmjggikmprqprssrqponlkie^S=éèáÇL^py|}€€~{{|}}}~~}~‚ƒƒ‚…††‡†…„„‚€~~€‚„„„…‡ˆˆˆ‡‡‰‰Š‹‹‰ˆ‰‹ŒŒ‹‹ŒŒ‰ˆ‡‡††……ˆŠ‹ŒŽ‹ŒŽŽ‘ŽŽ’‘ŽŽŒ’••””“’Ž‘’”——–––”“””””’‘“••–˜™˜–”””••••–––˜™™™•”•—————™š˜—™œœ˜˜˜™œš˜˜›œœšš›œ›™˜™››ž™˜œž›˜œ›››žœ›žžžžžœ››››››™™š™—˜™œ „bTB-!.7?GLMNPRTWVTVZZ[]_`cfhiknqqqrsssstvwvututtssrqpqqonoolgfgikpssstttsrrqnjhhe_Q8ëëÐJZmw{|~€€}{{|}~€~~ƒ„ƒƒ…†……„ƒƒ‚€~€‚„………††ˆ‰ˆ‰ŠŠŠ‰‰‰‰‹Œ‹ŠŠŒ‹‰‡‡‡‡‡‡‡‰Š‹ŒŒŒŽŠˆŠŽ‘‘‹ŠŠŠ‹‹‹ŒŒŽ‘‘Ž’””“’‘‘•–”““”“’‘‘‘’’“”––—˜™—–•••––––—–••—˜™–”•––——˜š›™˜šžœšš™šš™˜šžž›šš››šššš™˜—šž žœžŸžœœžžžžžŸœ˜˜šœœ˜—˜˜——˜¡žŠxVN<'!/:BHLNQRRTVVUW[\]`aabfiknppqqrrrsstvwvsstuutsrqpoonmopnjhgginqsttsssttsnigfe^M1ëê³O2HYmyyz|~}||{}€€€‚…††‡‡„„ƒ‚‚~„…„„†ˆ‡……†‰ŠŠŠ‹‹‰ˆˆˆ‰ŠŠ‰‰ŠŒŠ‰‰ˆˆ‰‰ˆ‰‹ŒŒŒŠ‰Š‰‡†‰‘’’‹‰Š‹‹ŒŒŒŒŒ‹ŒŽŽŽŽ‘’’‘’“’‘Ž’”•’‘““’‘‘“””•–—˜˜––————–––—––••–˜—––––˜™™š›šššžœ››™™šš˜˜›œžž™˜˜šœœœš˜——›žž›œŸ ŸžžžžžžŸœ™™šœž™—˜˜–•––jXF1 "0:AHLPSSSUWWWY]^_cdbcgjmpqpprtssstuvvtrsuvvuspnmnnmkmoqpmjikmprstssuvvtojfdd\G)ܾC&@DShrtvy{~€{zzxy{}~}}~€ƒ…†‡…‚ƒ‚‚‚‚ƒ„††…„„††…†‰‹‹‹ŠŠŠ‰ˆ‡‡†††„‚ˆŠŠ‰ˆ‰ŠŠŠŠˆ‰‹ŒŒ‹Šˆ‡…„…‡ŠŒŽŽŒŒŽŽŒŒŒŒ’‘ŽŒ‘‘‘‘’’‘ŽŒŒŽ‘”••––’’““’‘’’“”””•–——•”•–——–””•––––”•–––••˜š™˜š›™˜šš™š™——˜˜—˜š›š›ž˜––™››››™—œž›˜šœœ››šššš›œœ››šššš››œœš™™˜–””›•vcW>&#/7?GKNPQSVWVVY\]^ab`aehknnnnqttsstuutsrtutsrpmjjlmkjknrrommnnmmprstvxwtpjecbZ@"xnI0A4:M[^ikkquxwutrtw|{z{~€€‚……ƒ‚„………„„……ƒ‚„…†‰‹Œ‹‹‹‹‹Š‰‰‰ˆ†„€€„ˆŠŠ‰‰ŠŠŠŠˆ‡‰‹Œ‹Š‰†„†ˆ‰‰ŠŠŠ‰ŒŒŒŽ‹Š‹ŽŽŽ‘””‘Ž’’“””“ŽŒŽ‘•˜˜———”‘’“’’“””””“’’•——•“’“–™—”“•–˜™™—–˜™™—•—™—–˜š™—˜™™™™˜———˜š››™™›—˜š›š›œ›œŸŸ›š›››œ›™™™šœœ›š›››››››™–•“œ–pdS7$1;BIMNOQUWXWUX\\]_aacfhkmmnoquuttuvvussttqoppmkkkjijlnqpooppnkjmqrux{xuqkfcaW90,#(3CNOQRU]`^`cflqwxux~€€‚‚€||‚…‡‡…‚‚„…ƒ‚ƒ…ˆŠŒŒŠŠŒ‹‰ŠŠ‰…‚€„‰‹‹ŠŠŠˆ‡ˆ‡†‡‰‹ŠŠŠ‡†ˆˆ‰‰‰‰ˆˆˆ‹ŒŽŽŒŒ‹Š‹Ž“••”‘’’’”••”’Ž“”–——––––•””“’‘’”•––•”‘’•–•““”–——•”•—˜™›™˜™›™–”•˜—•—˜—–—™˜——˜˜—˜š›š™˜™š››œœœœœœŸŸžžžœ››œžŸœœœžžœš™š›œ›™——”¡’f^O5&3=DIKMPQTUVVVX[\]^`cefhjllnnpqrstttutqrsromnnmklljjklnonnoonkijmprsvwxvslgcaU1"'058:=ADFKQWY]ajnu}€€~{|€ƒ†ˆˆ…ƒ……„„†‰‹ŒŒ‰ˆŠ‹‰‰Š‰†„„‚‡ŠŒŒŒ‹‡…………‡ˆ‰‰‰‰††ˆˆ‰‹Œ‹ŠŠŒŽŽŒŠŒŒŒŒŽ“””“Ž‘‘‘’“””””“’’“”•––”•––˜˜—•”““”•–——–’‘”•”•—˜–””•••—˜™š˜˜šš—”’“•–––•••–š›—–˜š™™™™™™™•˜˜šœžœžŸ ŸžžžŸžžžžžŸŸžŸ žžžœš˜—˜š›šš˜–––…VYJ1 )5?FIKOSSTTTVY\]]^_afiiijlnooppqtvtstsqpqpljklllmnmlmmnonnnmkjjlnqrrrsvwtngdaS+ #%'+08?EHJLYdn|‚‚ƒƒ~~‚„†ˆ†„‚ƒ†‡†…†‡‰ŠŠˆ‡ˆŠŒ‹‰‡ˆˆ‡‡‰ŠŠ‹‹‹‹ŒŒˆ‡‡ˆ‰ŠŠ‰‰‰‡†‡‰Š‰‹ŒŽŽŒ‰‰‹ŽŽŽ‘’Š‹ŽŽŽŽ‘“””“’’““““””””•—˜—–••••–•””•’‘”–”•˜™•“””•–––•—šš—”““”•——•”•™œ›˜—™›š™˜•™žŸž›š›œ›™›žŸžžžžžžŸžœžœœœ››š™˜––˜™šš˜–“ŠvZPE."+4<CHLPSTVVUVZ]^]]^afhhijlnoopqsttrstsqppmiiiklmmonnnmmnnoomkkkloqssqrtutngdaP&"(,/145JYh{~ƒ„……„‚‚ƒ„†‡†ƒƒƒ…‡ˆˆ†…‡ˆ‰Šˆ‡‡ˆ‹Œ‰‡ˆ‰ˆ‰‹ŒŒŒŒŠ‰ŠŒ‹ŠŽŽŽŽˆŠ’‹Ž‘‘‘‘‘ŠŠ‹ŽŽŽ‘Œ‰ˆˆŠŽŽŒŒ’’’‘‘’””’’”••”•——––——˜˜—–””•”“•–••˜˜”‘‘““””•••–˜™›™—––––˜˜–•—™››™™šœœ›š›¢¢¢¡ žœ›œš˜™œœœžž  ŸžžžžŸ Ÿžžœ›››š™˜˜˜™˜—–•„o[H>*&08>DIMORTVWXXZ\^^^_bfhijkmnoprttsssuvuttrolllklmnopponlllnponnmlnquvtssttoifaL# !'4Pau}ƒ………†††††…†‡…ƒ„…†‡ˆ‡„ƒƒ„†ˆ‡††‡ˆ‰ˆ‡‡ˆˆˆ‰‹ŒŒŒ‰†‡‹Ž‘Ž‘‘‘’“‘‹Œ‘“Ž’‘Œ‹Š‰‰ŠŒŽŽŒŒŽ‘’’•”“––•–—–––––––———˜˜–•””•–——”“”––————˜™™™›š—–—˜˜˜˜˜˜˜ššš™šœžœšš¡¡¡Ÿžœ››™—š›œžžž  žžŸŸžžžžžŸ Ÿžœ›š™™™˜—œ›hWE8$&1:@EJLNQUWXXYYZ]^^_adhijkllnpstsssstvvuvusqqplklmmoqrqnllnoppqpnnquwusrttpje^E*C\t}††…††††‡‡†………„…………††‚‚„…………†‡‡‡‡ˆˆˆˆˆ‰‹‹‹‡„†‘‘‘’‘‘Ž‘‘‘“•”Ž’”“’ŽŒŽ’“Œ‹ŒŽ‹‹ŽŽŽ’’‘‘’‘•—–•–——–•••••–—˜šš™—•”–˜˜–“”—š™™˜™š›š™™™—••–˜™˜˜™šš™™™šœžžœšœŸ ŸžŸžœ››™™šœœššžœ›œŸžž ¡ žŸ œ ¡ žžŸŸžœš™™™ œv`UC3&1<BFKNOSWYYZ[Z[^___bfijjkllpsvvuvwtsvwwwwwuspmlnnmnqssqoopqqrrrrqrtutssttqkeY;"<Zxƒˆˆ‡††…………„‚‚„……„„…††ƒ€€‚‚‚ƒ…†‡‡ˆˆˆ‰‰ˆ‰Š‰‰†ƒ„‹ŽŽŽ‘’‘‹ŒŽŽ‹‹’”••‘’’‘Œ‹Œ’“–“ŒŒŽŽ““’““’’‘—–”“•••”“”••”•–˜™™˜—•”—š™–”•˜š››™™œœš™™˜––––—˜˜™š››š˜™››œœ››Ÿ Ÿœœœœœššœ››ž¡¡ žŸ œ™˜žŸœžžžžŸŸ›š™™Ÿ”_XQC.&.9BFKOPTXY[\\[[]___beghikmmquwwwyyvuwwvvwxwtqnoqqonnprrrrssssstttssttttsspldS2;Wyƒ„‡†…„ƒƒ„„‚‚……ƒƒ†ˆ‡„‚‚‚€€‚„‡‡‡ˆ‰ŠŠŠŠŠŠ‰ˆ†ƒ„ˆ‹Œ‹ŒŽŽ’’‹ŒŽ‰‰Ž“••”“’‘‘ŽŒ‹ŒŽ’“”––ŽŽŽŽ‘’“•“’’’‘”–•‘’“”–˜—••™˜™™˜—–•˜›š—–—™š›œ›œœ˜—˜˜——™˜˜™šš™™š›™š›žž  Ÿ››››œžžžŸŸœ›››œœœžŸ žžŸ œ™›œ›œœœœž™™š˜¡“P[O@% )/8AGLQSUWXZ]]\[]_abdfghknqpswyxyz|zxxwvvwxvsqpsuvurppqqstuuuuvvwwvutuvusrpmdM)7V|…„†…ƒƒƒƒ‚}}€ƒ„ƒ‚…ˆ‰†„„„„„…„„…‡†…‡ŠŠ‹‹ŒŒŒŠ‰‡……ˆ‹Ž‹ŒŒŠ‹ŽŽ‘’ŒŒ‘“•”’’‘ŽŽ‘’”––“‘‘‘‘Ž‘’”””““““•–”‘‹‰Š“•—˜˜”•™˜˜˜————™š››œ™šš›œš–•—–•—›š™š››™˜š››š›žŸœžžž››œ›œžžŸœœœœžœŸŸžžžžŸ ›žœš™ššššš™—˜š›¢UXN;#+09AGLPSVWWY[[[[\]`begghlpqqtwxwxy{{yxxwuuvtpnosvwxvsqooqrtuvuvwwxxwuuvvusqndK&3U}ˆƒ…ƒ€€€‚„‚~~ƒ…„‚„ˆŠˆ‡‡‡‰Š‰ˆ†…††‡ŠŒŒŒŒŽ‹‰ˆ††ˆŽŒŒŒŠ‰ŒŽ‘’“•Ž’“’‘‘‘‘‘’“’’“•–•““”•“’“•••••–••”””ŒŽ”————”•——––––˜™ššš› ¡š˜™›™—–––•˜›™˜šœ›š›œ›››œœœœš›žžžŸ  ŸžœœŸ¢ŸžŸŸŸŸžžŸ¢Ÿœ›žžš™™™™™š™——––”}WUI6$+2<EIMQUXYXXYZZZ[]_cfhjkmoqruwwxyyzzyyzxuturpnoqtuwvtqppqqrtuuvvwxyxvvwxwtrodL'0Tyƒƒ‚€~~€ƒ‚€ƒˆˆ‡„„‰‹Š‰ˆ‰‹Œ‹‰‡††ˆ‹ŽŽ‹ŠŠŽ‹ˆ‡††‰‘‘‹‹ŽŽŽ‘“””’‘Ž‘’““”•”“‘‘’‘‘’’’’”–•‘‘’”–—–•—˜—•”–˜›—–•–˜––•••—–”””•˜š›š™šœœš˜–—›œš™šš™™™™š™—™ Ÿžžœ›››››ššš››š˜Ÿ Ÿž   žžŸŸŸ¡£žœžŸŸŸžž ¤¥ž›œ Ÿ›ššššš›š™——•‹{_PE2$*1<FKMQVYZZXWXXY[]adfhiklmpruuvxzyxxyzzxvuurqomopqsttsrrrrsttssstwxwwwwxwurndM)0Uu€€‚~}‚‚„ˆŠ‰‡†‰‹Š‰ˆ‰Œ‹‰ˆ‡†ŠŒŽŽ‹‰ˆŠŒŒ‰†…†ˆŽŽŒŠ‰Œ’”’‘ŽŽŽ’“•–•”“““””‘ŽŽŽ’”–•’‘’“•—–”–˜—•–˜˜˜˜™™™˜———–—˜—•”””–™šš›œœš˜—˜™™˜˜šššššš™˜–— ¡ŸŸŸ›š›œ›™™šœœž¡¡Ÿž  ŸŸŸ  ŸžŸ ¢žœœž   žž¡£§£œœŸŸœœ›œœ›™˜–Ÿ›„t]J@-$+3?IMOSWY[ZYXXYZ\_dggghjlmpsutvxzywwyzxvutsqqomopqrtvvuttuuuspppquwxywwwwusncL).Nj{€€€€~~€ƒ„ƒ‚ƒ†ˆ‰ˆˆŠ‹Š‰ŠŠŒ‹Š‰ŠŠ‹Œ‡‡‡ˆ‹‹Š‡…†ˆ‹ŒŒŠŠŽ‘Œ‹‹ŽŽŽŽŽŽŽŽŒŒ“”•”“””””•“ŒŒ‘”•”’’“’’”””––••—™˜–•˜š™˜˜š™˜˜˜˜—–••”•–˜›œœš˜—˜˜––——˜š››™—–—šŸžœŸŸ›šœ›™šœž ¡ žœžŸŸŸŸŸžœœ›œŸ ¢¡žž ¡¡ ŸŸŸžœœœ›—––¤–o`WH<'$+5@HLQVWXWXZ[[[\^adggfgijlopqrsvwvvvxxussrqpppprsstuwyywvxxwtpnnosvxyxvwvusmaI(*@`sz€‚‚€ƒ†„ƒƒ…ˆ‰‰ŠŠŠ‰‰‹Œ‹Š‰‰‹ŽŽ†…†‡ˆ‰‡‡†‡ŒŒ‹‹Œ‹‹ŽŒ‰‰ŒŽŽŽŒŠŒ‘‘‘Ž“”““’“”““””‘ŽŒŒ–—–““““‘’“““““”—™˜——˜™˜˜™››™™™˜™˜˜—•”•–˜›œœœ›™™šš——––˜šœœœš™˜˜˜•šŸŸ  ŸžŸŸœŸ¡¡Ÿ››ŸžŸžžžœ›š› ¢¢ŸžžžžžžŸŸŸŸŸž›šš™—”’‘f]TI:#!&.8AGMTYYWVVZ]]]_abdfhhikkklmnpsuuvwxxwtrqqqrsuvvvvwwx{{yxxxywtpmnquwxwvvvvsnaH(%% $/M]dvƒƒ€ƒ†…ƒ„†ˆˆ‰Š‰ˆˆ‹‹‰ˆ‰Š‹ŒŒŒŒŽ‹††‡ˆ‰‡…†‰Œ‘ŽŒŠ‹‹‹‘‰ˆŒŠ‡‰’””“‘’””’’’‘‘‘‘““’‘ŽŽ‘•˜–”””’‘‘““‘‘‘“˜˜˜˜˜˜˜———™š™™™™˜——™˜––––•™šš™™šŸž™™˜——™›œ›™˜˜˜›žžœ¢ žžžžž  ¡ žœžžŸŸŸŸžœœžžœŸ¡¡ žžžžžŸŸžžžš—˜™™—“˜Šc_SF5")19@FNSXXWVXZ[\]_aabcegkmlklmmpstuvwwwutsrqrtvwxwwwxxxyywvwxyywsnlnpqstutttrodG)*55.")=N_t‚‚€~‚……„…‡ˆˆ‰‰††‡ŠŠ‡ˆŠ‹ŒŒ‹Š‹ŒŽŒŠŠ‹‹‹ˆ…‡ŽŽŒŠŠŠŒ‘‰ˆ‹ŽŽ‹‡‰Ž’“””“’‘“”“‘’’“”“’’’“••””’‘‘““’‘‘“•––––˜˜˜–•–——˜˜˜—–—™™˜˜—––—˜™™›Ÿ¢Ÿ™——™›žœššœœœœžžžžžœž   ŸŸŸ¢ŸžžŸ žœŸ   ŸŸŸžŸ  Ÿžžžž››žŸœšš›žœ–’Y\PA-$-6<BJRUVWWXZ[[\]_``bcdhklllopqsuvvvvwwvuutstuvxyxvtttvvuuuvxyxwtnllllotvutssqgM,4BB:+0A^t€~~ƒ…„…†‡‡‡‡†ƒ„‡Š‹‰†‡ŠŒŒŒ‹ŠŠ‹ŽŽŒŒŽŒ‰‡‰Ž‘‘Œ‹Œ‹ŒŒŠŠ‹‹‹Šˆ‰‘’“““’’”“Ž‘‘’’“••””“’“”“’‘’””””““”•••”•——•““”–———–––—˜˜˜——˜™™™™›¡ Ÿžš˜—™œ››œœ›œœšš›œ›œž  ŸŸ¡¤¢ŸŸ¡¡ŸŸŸŸ  žŸŸžžžžžžžžžœ™™œžœœœž™€VWM=%%.7=CLSVVWXY[[[\\^``acegihilpssuwwvvuvvttuuuuutvxwtqpqtuuvvvwxxwtpnljjouxwuttsiQ0!<LME3#&8\u~~~€ƒ………†…„…†…„…‡Š‹ˆ……‰ŒŒŒ‹‹‰ŠŒŒ‹ŒŽŽŒŠ‹‹’“ŽŽŽŒŒŒ‰†‡ˆˆ‰’““’““’‘Ž’“““”””––“’“”’’““”—•““•••”–——•”–—–•••–—˜™™™™˜——––›œššš  žœ›š™šœžž›œžœœœœ›šš›žžœœžŸ Ÿž¡£¤¢   ŸžžžŸ ŸŸ  žžžžŸŸžœš—œž›šœœ››¢‡„aSK:#/9>DKRUUX[\]]\\]_bbcdfhihjmqstvwwwvvvvtsuwvvtstwwusqruuvxyyxxxwuspljknsxyxvvsiU5&BPRL9%1[u…}|}„„„……ƒ€ƒ‡ˆˆˆ‰‹‹ˆ††ˆ‹‹Œ‹‹‰‰Š‰ˆˆ‹‹Œ‘‘‘’”•ŽŽŽŽŽŽ‰††‡ˆŠŒŽŽ‘’’’‘‘‘’”””“’’“••’‘“”“’”–™š–“’”––•—™™—”•–—˜˜˜˜˜™šš››™——”•›žžœ™˜šžžœ›ššš™›Ÿž››žœœžž¡¢žžŸ   ¡¤¤¢ žžŸžžžŸ ¡  ¡¡ ŸžžŸŸžž Ÿžœ˜—šœš•˜ª¡vp_QK9".7<DJPTVY\]^]\[\_bccdggggknprsuvvvuuwwutuvvvtrtwwvutsstuwyyyyxwvtpmlmnotwvuutlZ;.HSUP;&)Tq€€{}‚ƒƒƒƒ„‚€‚ˆŠ‰ŠŠŒŒ‹‰‰ŠŠ‰‰ŠŠŠ‹Š‰‡†ˆ‹ŠŠŽ‘’‘‘•–‹ŒŽ‘Œ†‡ˆ‰‹ŒŽ‘‘ŽŽ’”””““’‘‘“••’‘“””“”—˜š˜–”–˜—•—š›˜•–———˜——––—šœ™™™˜––™œœœ›™™šœœš™™™š›žžœ›žœŸŸžžŸžŸ¦¤¢ŸžŸ¡¢¢¢¢££¡  ¡¡ Ÿ£££¢¡¢¡  ŸŸŸžžžŸŸŸž›——ššš”’¥¢qc^PG4"/7@HKPUXY]^^^]\]_abdfiigilnpqtwxwwuvyzxwwwwvtstwxxwurpqssstvwwxwuqonnoqsvuuuun^@!8OWXR;&%F[otwx€†…€€€ƒˆ‹Š‰‰‹ŒŒ‹‹Š‰††‡‰Š‹Šˆ‡†ˆŠ‹‹Ž‡‰Š‹ŽŽŽ‹‰‹ŽŽ“’ŽŽ“”“’’‘’““‘‘“–•””–˜™™™›œš–’”›™—–——––——–•”•–‘Œ–—––˜™šššššš››š˜˜™›œœœ›œžžžž ŸŸž›œ¥£¡ŸŸŸ¡¢£¢Ÿ¡¢¢¢££¡¡£¤¤¢¡¡ ŸŸŸ ¡ Ÿžžžžžœššš™–“Œ’•nd\N@,#/:CILQVXY[]]^]\]^_`cfiihjlmnpswxwvuvwxvvvwwvttuxzyxxvssronopqsttsrrqoprstttttoaE&@T\\S;%0DQ]adn}†„}~€€„‰ŒŠˆˆŠŒ‹Š‹‰‡††‡‰Š‰‡†‡‰ŽŽŽŽ‹ˆ†‡‹ŽŽŽŽŽ”’’‘““Ž‘’“’‘‘’’“’’’’‘Ž”—–””–˜™™šœ œ”’“——————––——–••••”Ž‹–—˜˜—˜š››šš›››™™›œž™šœžžžžŸŸŸž›˜§¤  ¡¡¡¢£¢Ÿ ¡¢£¤¢ ¡£¡  ŸŸŸžž ¡£¢ Ÿžžžœœ›š˜–”–Žb`YK;&$2=EJMRVXY\]\]]]^^^`cfiihjmmnoqtvvwvvuvvvwxxxvvx{{yyzxvvtpnpqqqrrrsuuqpoopsssspeK +DX__S9# *7BHKR`nqpqsz‚…‰‹‰‡‡‰‹‹‰‰‹‹‰‡‡‡ˆ‰ˆ††‰‘ŒŒŒ‹ˆ‡Š‘ŽŒ‘‘’’””“‘“’‘‘‘““‘ŽŽ’’’“”““””–™˜—••—˜˜—˜œœŒ‘’’”••–——•”””•—˜˜——š›šš››š˜˜šœ›˜™œœ›š›žžš•ŸŸžœ›œžžžžšœ žŸ¡¢¢¡¢¢žž ¡¡¡ŸŸ¡¡™šŸ Ÿžž ¡¡ŸžŸžžœ›œžžœ›ž››[_TF6"#3=CHMRUXZ\]\\\]^^^`befffgjjkmoqtvwvusuvvwxxxxyz}|yxxwwwvssuwvsqqrsvvspmloqrrrqhR!0I\b^Q7 %,39>AKU\ffj…‰‰Šˆ††ˆŠŠ‰ŠŒŠˆˆ‰‰‡ˆŒ‘’‹Š‹‹‰‰‹ŽŽ‘‘‘’’ŽŽ‘‘’””Ž‘““““’’’ŒŒ’’‘“•–•—˜šš›™——˜˜–——˜—‘’“”””•–˜—•’‘”˜š™˜™› Ÿœš˜™›œœ—šŸŸžœ››œ˜’“¡Ÿžžœš›žžŸž›žœŸ  ¡¡£žž ¡¡¡ŸŸ¢¡› ¡ žœœžŸ¡¡žžŸž›š›ž›™ž—”ˆ\YMA2$3=BGLSWXZ\]\\\]^^^`bdeddfiihkoqstuuutuvwxzzzzz|~}zwvwwxxvvxyxwwvttuvspnopqrrsrjV5P`c]Q7 $(+-2<BXfm†‡‡‡†……ˆ‹‹‹Œ‘‘ŽŠ‰‹‹Š‰Œ‘‹‰ˆŠŒŒ‹ŒŽŽŒ‘’’‘ŽŽ‘’’‘““““’’’Ž’•”’”–––——˜™›š˜˜˜–•—˜—–“’“•••••–™œ—“’•œš—˜š›œœœ™˜˜šœŸŸŸžœœœœ™”––žœœœžŸŸ  žžžžžŸ ¡ › ¡¡   ¡¡Ÿ ¡¢ žžŸ ¡žœœžž›šœœœ›˜–˜•‹yaTI>.%2;?CIQWXY[\\[\]]\\^_acccegggjlnqrrrsstuvxyyzyyz{{xuuwxxxxxxwvxyxtrsutqooqqqqrpj[<Uce]R7!$+6B[l†……†„„…‡Š‹Œ‘‘ŽŒ‹ŽŒ‹ŒŠ‡†‰ŒŽŽ’““‘ŽŽ‘’‘’““””“”–“‘˜™˜•••–—–”’–šš˜˜™–•˜šš—••˜™˜˜––˜š›œ—“™œœš–—˜™œœš˜—™œŸ  ŸŸžœ›š˜”–™›œžŸŸžŸ Ÿ ¢¡žŸ   œ¢¢¡¡¡¢¢¡¡¡¡¡ ¡  Ÿ   žœœœ›œœœœœ™š—„jaRH;)(4<?CIOTWXZ[[[[]]\\]^_aabceghijlopqrttuwxz{{zyyxyywttvwvvwwvuuwyyvrtvvspnprrrqoj`&BWeg_Q6 %.AYi†……†……†ˆŠŒŒŽŽŒŒŽŽŽŽ‹ˆˆŠŒ‘’’’’‘‘““‘ŽŽŽŽ’””•–˜™™—•–™œš—”“”•”’’•™˜—˜™•”š›—–™›œš™——™š›››œœœ›˜–––•™›š™˜™œœ›œžŸŸžžž›šššŸœ›œŸŸ  Ÿž ¡ œœœœžŸ ¡££¢££  ¡¡¡¡¡¡¡¡¡££ ŸžžžŸŸžœœœ›œž¡£ž”~f^RK<$(4<?CHMQUWYZZZZ[[Z[]]]^`bbcfhijkmoqsuuwxyzzyxxxxwwvttvvutuusstuvwwvwxwuqooqssqoka.FWdh`P7 "*?Xh„…‡ˆ‡†‡‰‹ŽŽŽŽŽŽŽŒŒŒŒŒŽ’”’’“’‘Ž‘‘Ž’•–˜™™™˜—–—š››˜”““”“’’”˜˜—˜˜•’›™—˜š››š™˜˜™šš›œœ›™™˜–“—™š›››››šœžŸŸžž››› ¡¡žœ›œžžžŸŸŸ  ŸœœŸ  ¡¦¥¤££ žŸ¡¢¢¢¢¢¢£¤¤¡ŸžžžŸ ŸžžœœžŸ ¨ ‘zb[RL=!'3;@DIMPSWXXZ[[[[YZ\]\\_a`bfijklnoquxxy{{zzyyxyyyyyxyyxvtuwvvxxxxyyxwwuqpqrtutrnc#8LZeh`N6 "*@\m†‹‹‰ˆˆ‰ŒŽŽŽŽŽŽŽŒŠ‹ŽŽ‹Œ‘’‘‘ŽŽŽŽŽ’’“•–—˜˜–‘““”••™™—•””“““’“—˜˜˜—–—šš——˜™™™™™™˜™™˜˜˜™˜˜™š›œ˜—™ššœ›››š›Ÿ Ÿœž¤£¡žžžœ››Ÿ  ŸŸ¡¢ ŸŸŸ  ¢¥¦¤¢¢¡žŸ¡¡¡¢£¥¤¤£¡  ŸžŸ ŸžŸŸŸžœœ ªŸscXPL:$/7>DHMPTWVWZ\]]\YXZZZ[]__afijklnorvxxyzzzzzzxxyzz{{|{{xvuwwy{|{yxxwvvtpoqrsttspf+?R_gh_N6 #*?^sŠ‹‹‹Šˆ‰ŒŒŒŽ’‘ŽŒ‹‹Š‰ˆ‹‘’‘ŽŒŒ‹‹‹‹Œ‘”•–––—˜—•‘‘“””–—–•””““”“”–—˜———˜™˜——˜˜˜™šš››œ›˜——–••—šœœ›› œœœš›žŸŸœœžž¡£¡žžŸŸžœ›œŸŸ  ¡£¤¢¡  Ÿ ¢¤¥£¢¡ Ÿž ¡¡¡¢¥§¦¥¤¢¢£¢¡  žžžŸŸžœ›œœœ£›ˆ^`UMG4#+2=EINQTUUX\]]]]ZXXYZ[\^`cgjjlmoqtwyz{{{z{|{yy{||~~}}|zxwwvwy||zyxwvwvrpprssssqg%#2GXejh]N6 ")>\s‹ŒŠŠ‰‡††ˆ‰‰‰‹‘ŒŒ‹Š‰‡…‡Œ‘‘‹ŒŽŒŒŒŒ‹‹‹ŒŒ‹‰‰‹‘“—––•”–˜—”’‘“”””•–•”“’’”••–——––—˜—––————˜™š›œœš™™˜–•—™››ššžžžœœššœœœš›œž ŸžžŸžžŸžŸŸžžŸ¡£¤¢¡¡ŸŸ¢£££¢¡ ŸŸ ¡¢¢¢£¥¤¤£¢¢¤£¢¢ œžœœœššž•}KZRJD.")1<CFKOQRUY\\[YZZYYZ[[\^aegijklorsuy{}}}|}}{z|}~~~}|{yxxwwvx|}{yxwvwwtqoprrrrqj0$7GYcklg\M4 (=YpŠŠˆˆ†…„„…„…ˆŠŽŽŒ‹‹ŒŒ‹‰†„‚‹ŠˆˆŠŽ‹Š‰‰‰Š‹Œ‰ˆ‹’”••”“•——–”’“•••”•˜–””””•–——˜˜—––——••–••–˜˜˜›žŸœ›––˜™™™™šœŸŸžœžŸœš™—™œŸ›››œž  œœŸ ŸŸ¡ žž¡££¡¡¢ žŸ¡¡££¢¡ ŸŸŸ¢£¢¡¡¢¢¢¡¡¢£¢¢¡ŸœžžžœŸ ”{PUOG>*(/9@BEIMPTXZZZYY[\[[\\]_beghjkmqtuuy~€€}}~~}}|zyxvuuvz~~|{yvuvvtsqqstssre=!=TWblomg[K3(=Xm…‡„„ƒ„………„…‡‹ŒŠŠ‹ŒŽŽŠ†ˆˆ†‡‰Œ‹Š‰‰Š‹ŽŽŽ‹ŠŒ‘’““””•—˜—–””••”“”—–•—™––—˜˜™šš˜”˜š—––••—™˜••”•œœš˜™œš™™š›žžžŸŸžŸŸ›™˜™¡¡ž˜™™›ž¤¦œœž žž¡¢žžŸ¡¤¤¢¢¢¢¡¡¡¡     Ÿž ¡¡Ÿ ¡¡ŸžŸ     Ÿž Ÿœ™š œwZSMD9&&.6<>?DIMRWXXXZ[\\[[[\]^_acgjlmosuvy}€‚‚€~~€~|}|ywutttw{}|{zyvuutssqpqrstsgI,.Ybkpssng[K4(>Yo‡ƒ‚‚„……†‡‡ˆŠŒ‹‰Š‹ŠŒŒŠ†ˆ‹ŽŽŒ‹ŒŽŽ‘’’’‘‘’””•••–”“””““”•–˜š›™˜˜˜˜™šš™˜› žš˜•”˜›˜•’’Ž”›žœœ›œ¡Ÿššš››žžžžžŸ Ÿ›› ¤¢ ›˜š˜ž¦¨¢ŸŸŸž¡¢¢¡ ¡¢£££¢¡¢¤£ žŸ    Ÿ ¡ŸŸ¢£¡ŸžŸŸŸ ¡ žŸŸŸœœœš—š’k]QKA3!%-5;<>DINRTVVWZ\]]]]^^^^^_bfjmmnrwy{}~ƒƒ€€~€~~}zwuvwvxyzyyyyxvtsstrpoprrqiY99Zjvwxuog[J6 (?]u‹ƒ„„„………‡‰‰ŠŠŒŒ‹ŠŠŠŠŒŽŽŒŽ‘‘’’’’’‘‘’“””““’‘‘‘’’’‘‘’’“’’“—šš™——˜˜˜˜˜—˜›žš—•”—™—•’’‘“—šš››žššœœ›šžžŸžž¡¤£¤£šš¡§©¤ŸŸŸŸ¡¡¡ŸŸ¡¢¤¢šŸ¢¢ Ÿ¢¡¡¢¢££¢ž¤¤ žŸŸŸ ¡¡Ÿžžž›œœ››žnaZOJ@.#-5;<?GMRSSTVXYY\]]]^^^^^_bgilnoquy{|~‚‚‚€€€~|zyyzxxyzyyyyxvttuuurooppolbN &D`n}yuogZH5!(@^xŒ„…†‡‡†‡‡ˆŠ‹Š‹ŒŒ‹ŒŒ‹ŽŒŒŒŽ‘““’’‘‘’“’‘‘’““”““’’”••“‘‘‘‘“““““““—™™˜˜˜™˜—–•—šœ™˜–—˜˜˜•“”•—˜˜šššš›žžœšžžŸ   ž›œž ¡¢£££ žŸ£§¤¡œžžžžŸ ¡   ¡£¤¢œž ¡ ŸŸ¢¡¢£¤¤¥¤¢£¥¥ œž  ŸŸ  Ÿžžœœ›ž¢’haYNH>*!+5;:>HOSTTVYYWW[^^]^_`aabfjkmpttv{}~€‚‚€€€€~}||{zxyzzyyxxwvwxxxwtrpoooiZ)Gar{}vrohZF3'?^t‰…†‡ˆˆˆˆˆˆ‰ŠŠ‹ŽŽŽŽŒŒŒ’““““‘Ž‘’’’‘’””’‘Ž’“”–“‘‘’’‘’••”••””–˜˜™š›››š™—–˜šš˜˜˜™™™š™—˜›œš›œ›š›žŸŸžœ›¡    ŸœŸ ¡ ¡¢¢ ŸžŸ¢ ŸžžžŸ   ¡¡¢£¢¡  ¡¡¡¢££¢¡¢£¥¥£¢£¤¦¡ž ¡  Ÿ ¡ žžžžžœ—˜¢bdXNH<'(165:FLORTVYYVVY]^]^_acddhlmnquwy|~€‚ƒƒƒ‚€€€€€~~}{{{xwwxyxwwwwwz{yxwtqoool`+Hary{upmhYE0&>[o‰†‡‡‡‰Š‰‰ˆ‰‹ŒŒ‘ŽŽŽŒŒŽ‘““’ŽŽŒŒŽ’”•”““’‘‘’’‘‘““’”’“•••””••–—˜™›œœ›š™˜—–—˜—˜šœš™œŸŸ žœ›ž Ÿœš›žŸšœœœŸ¢¡ŸŸžžŸŸŸ ¡¡ŸŸ ¡¡ŸœžžŸŸžžžŸ  ¡¢¢  ¡¢¢¢¡¡¡¡¢£¤££¢¢¡žŸ¡¢ žŸŸ ¡¢¡ŸŸ  ŸŸžžžš˜›ˆ^aVMH;##*04;DHJMPTYYXY[]_^^`cfggjnpqrux{|}€‚„„„ƒ€€€}}}{zyxvvxyxvvwww{~|zwurpopne& )B`mtxtnjeXE.'=Zq†…†‡ˆ‰‹‹Š‰ˆŠŒ‘ŽŒ‘‘ŽŽ“’‘‹Œ’”””“““‘‘’‘‘“““”’‘“““’’“•—————›œ˜——˜˜–•––˜šš™—™  Ÿš˜  œ››–™››Ÿ¡ ›œœžŸ  ¡¢¡ ŸŸ¡¡ œœžžŸ ¡¡¡¡£¢ Ÿ ¡££¢£¤££££££¢¡¡œœžžœ›žŸŸŸ¡¡Ÿœœž£¢•~\^SKG8$,4<FJKLNTYZZ[\^___aegghjmppquxyz|~ƒ……„€€~}|}|ywvvvvxxwvuwxwy|}{wtqppqoh4!$;[fourlhcXF-(<Xo€‚†‰ŠŒŒŠ‰‡ˆ‹‘ŽŒ‘’“’‹‹ŒŽ‘’““’‘†Ž’“’’“”””“’‘’’’’’•”““‘‘’’’’’””•—˜”““•—–––——–•––—›š™˜˜š  ŸŸ››¢¤ ž››œ›š››› ¡¡›žŸŸ ¡¡¢£¢¡ ¡¢¡ŸŸŸžœœ ¢£¤¢¢£¤£¤¡£¥¥¥¦¦¥¤¤¤££££¤ žžŸŸ› Ÿž ¢¡Ÿœ››œœžŸœ›Ÿ¢•zbZPHE5 +6@IMOQSWZ[\^_`acceijiijloptwxyz}€‚„†††ƒ‚~}|}}|yvuvvwxxxxxxxvvz~~zvsrrrpdD*1T^hmkhd[P@)*=Wkw…‰‹Š‡††‡‰‹ŽŒŒŒŽ’““‘‹ŒŽŽ‘“””’’—•’‘“”••”“’’“’”š—”’‘’‘‘’”——•”’’’’““”•—––––––˜œœšš™™œ¢ œšš¡ª£š˜˜šœžž ¢¢£ ŸžžŸ¡¡ ¢¢¢  ¡¢¡¡¡ žœŸ£¤¤¢¡¢¤¥¤££¤¤¤¥¦¥££¤£¤¥¤¤¢¡¡¡¡¡¢£  ¡¢¡ Ÿžœœž žœš™›“x^WNGD4)6AINPSUW[\^_`abbdgkjgffimpsvxyz|€ƒ…†‡‡†…ƒ‚~~}{{{{zwuvvvwwxxyzwuty~}zvttrpgT2&HY[__]XOD5! +?Vhv‚ˆ‰‹Œ‹ˆ…†‡ˆˆŠŒŠŒŽŒ‹Ž’”’ŒŽŽŽŽ’“’‘‘’”–™–‘Ž’••”“’‘’’’”š˜•’‘““’’“–˜˜–”“––“‘“••–––––—šžŸžœ™—–”—™šœ ”•–™›œžŸŸ¡¢££¢ žž ¡ ŸŸŸŸŸŸ ¡  ¡¢¢¢ŸŸ £¤¤¢ ¢¤¥¤¢¢£¢¡¡£¤£££¤¤¦¦¤¢£¤¢¡¡¢£¢¡¡¢¢¢¥¤ Ÿ ›’…q`TNGC2)7BHLOSUX\_`abcccdfhgdceimpsvy{{}€‚„…ˆŠ‰‡…ƒ€€|zxwxxvuvvvwwwvy{zwvy|~~|wutrqlcC*:CFGHF>5(,A\p{„‰‰‰‰ˆ†…†ˆ‰‰ŠŽŽŠ‰ŒŒŠŠŠŒŒ‘Ž’“’“”•–˜–‘ŽŒ’““‘’““““˜™••–˜•”“”•–——•”›Ÿžš•“™˜———————™žŸž›˜–•—™™š›™——˜™šš™™Ÿ¡¡¢¢¢¡žžŸ  ŸŸžŸŸŸŸ ¡ Ÿ¡¤¤¢ŸŸ¡£¤¡ ¢¤¤¢¡¡¢ Ÿ ¡¢££¤¤¤¤¥¤¢¤¥¢ ¡¡¢¢¡ ¡¡¢¥¡¡ š™šœ ›ŒscZOKE?/'5@DHLQUX\^___abbaacdccfknqrvz{|}€‚ƒ„ˆ‹Š‡…ƒ€~|xvttsrrstttuuuvyzzzz{}~ywtstpgR%*+-/0,%+Bazƒ…ˆ‰ˆ‡†††‡ˆ‰‰ŠŒŒŠ‰ŠŒŒŠˆˆˆ‰Š‹‘‘ŒŽ’””•–””•–‘ŽŒŽ‘’’‘’“•—–—›š˜˜˜™–””•–•••”“œ›™˜˜›››š™˜˜™œŸŸ›™—”‘•›››šš™˜˜šž›™š¡¡¡ ŸœœœœŸ   ¡¡¡¡¢¢¢ Ÿ£¤£¡ŸŸ¢¤¢¡¡£¤¢¡¢£¢¡¡ ŸŸ £¤£¡££££¤¤¢¢¢¡¢¢¡ Ÿ¡ŸŸ  ˜–™šž™‰j_SIHB<+$4=BHKPUY\]^^^_`a`_acdehlprswz{|€‚ƒ„„‡Š‰‡„ƒ€~}|zwurommoqrstuuuuwyz{{{|~{zvttrk[)Be‡…ˆŠ‰‡†††‡‡‰‹‹ŽŒŠ‹ŒŽŽŠ‡‡‰‹‘’‘Œ••–——•‘‘‘Ž‘‘’’“””–˜™š››™™™—•””•”“’’’”›™˜˜˜™šœœœ›ššš›žžœ›››œŸžžœ›š˜˜™ ¢¥œš›œœ›››››œœ›¤¢¡¡¢£¢¢¤£Ÿ›Ÿ¡¢ Ÿ¡££¢¡¢¢¢¡£¤¤£¢ ž›ž¢£ ¡¢¢¡¢££¢¢¢££¢ŸœŸ¡¡žœš˜›–…h`PIGA9(!2<BHLPUY[[\]\\]_a`acfhilqrswz{{~ƒƒƒ„†ˆ‰‡…ƒ|{yvsrpmklppqsvwxxwwwwxxx{}}~~yutqmc*(AfŠ†‰‹Šˆ†‡ˆ‡‡‰Œ‹ŒŽŒ†‡‰‹‘“”•ŽŽŽ•–•–––Ž‘’’“”–••—˜™ššš™˜—•••––•’’‘’•——˜™™™šœžœ›š›œœššœŸžžŸŸ›™™š¢¡Ÿ››œ›ššœŸŸŸš™¥¢¡¢¤¥£¢¤§Ÿžž £¢Ÿ¢££¤£££££¤¦§¦¤£ Ÿ  ¢££££¢ ¡¤¤£¢£££¢ žœŸ¡¡ŸŸž›˜›’ƒl_QKG@7&.:AFIMRVXZ[\\\]`abbdikjkpsux{|}~ƒƒ‚„†‰‰‡…|yyvspnmmmosssuxz|}}|xuuvx{|{}~{wtqnk>)Af~Œˆ‰‹‹‰‡ˆ‰ˆ‡‰ŒŽŽŒŽ’’‰ˆˆ‡“”•‹Œ‘–•““’ŽŽŽŽ’”––––——–—˜˜—–•””•–—–•”“”•–—™››š˜™Ÿœ››š››š˜˜šœžžœœž Ÿœ™™š¢Ÿœ›œœœž  ¡¡  £¤¢¡¢¥¥¢¡£¤Ÿžžžž¥£££¢¢£¤¤¥¥¤¥¦¦¦¦¤¡¡¡¢£¦¦¦¦¤¢¢¤¥£¢¡¢¢¡ ŸžžžŸŸœ ››¢„m^SMH@5$*9>ADJORVXZZZ[^`abbeikijmqtwxz|~€‚ƒ†‰Šˆ…€zvutrolklmquwvwy|~€zvuvy{|{|}{yvsphR'!+BdyŽˆŠ‹‰ˆˆ‰‰‡‡ŠŽŽŽŒŽ’’‹‡ŠŠ‘’”‚‹Ž’•’ŒŽ‘‘’•–—––••––••–——–””–—––––••–—š››š’‘•™š›œœ›››š™™›ŸŸœ›œ¡¡žš˜™šžœž ¡¢¢¢¡¡¢£¢¢¡¢¦£ ¡¢¡žžžŸ££¤¤£¡¡¢¤¥¥¥££¢¡¡¡¡¡¡  ¢¤§§§¥¥¥¥¥£¡ ¡¢¢  ŸŸžžŸœ›™™¡‰|e[RLG?3"(8;=CINQTWXXZ\^``bcfjjijknrvwy|€‚ƒ„†ˆŠˆ…€yusqomllllpuyyz}€€€~zxy{{{{{{zyxwup`>"+BatŠ‰‰ŠˆˆŠŠ‰ˆˆ‹ŒŽŽ‘ŽŒŒ‘‘‘‘Œ…ŠŒŒŠŽŽ‹Š‘‘‘’’’”•••”’““””••–—–””••””••”•–˜™™™”‹Œ’•—˜žœœœœššœžŸžžŸ  Ÿœš™œžž¡¡Ÿž ¢£¢¡¡¡  Ÿ  ¡£¢   Ÿžž ¤¢¢£¡Ÿ ¢£¤¦§£Ÿ   ž ¢¡žž Ÿ¢¥¥¤¤¥¦¥£ŸŸŸ¡¢¢¡ Ÿžžžœš˜—¡†zeXPJE<0%48<CILNQTTW\^_`abdgjjjklnruwz}‚„…‡ˆˆ‡…€{wtpmklmmmptx{}€‚‚‚‚‚€}{{{{{{|{yxy{yvkR"+A_q„…‡‰ˆ‰ŒŒ‹ŒŽŽŒŽŽŒŒŽ‘’’‘Œ‡‰‹Š‹Œ‹‹‹ŠŠ‘’‘“••”””•”’ŒŽ‘”•“’“““”““““””•—˜—––—–•••™žŸžœœ›››žŸŸ  žžžžžŸ¡¢ Ÿ¡¤§¢ Ÿ £¤¢¡¡¡¡ŸŸ   ¡¡ ¡¡  ¤¤¢¢£¡Ÿ ¢£¥§­§¡¡¢£¤¦¦¢žž ¡¢£¤£¡¢¤¥£Ÿžž ¢¢¢ Ÿžœœ™™£ˆz`SNGA8-"06=CHJLOSUY^`abbdgiiiknnorvx{}€„†‡ˆˆ††„€{wtollmoqsuvx{~‚„„„ƒ}{{{||}|yvy}}xtl""*>\r„††ˆˆ‰ŽŽŽŽŒŒ‹ŽŽ”“’‘’’‹Ž‰Ž’“”–˜—•””””‘‹ŠŽ“——”””“’‘‘’’“”•–˜™—””•˜šœ™š™ŸŸžœœ››œœžŸŸžœ›Ÿ      ¢¤¤¡Ÿžž¨£¡ Ÿ    ¡  ¡¡ ¢£¢¡¡£§¥¤££¡žŸ¢£¤¦¦¥¤¤¥¥¦¦¥¢¡¢¢¢¢¤¤£  £¥£ŸžžŸ ¡¢¡ žžžš ™qWOKF?5*+4<AEILNRW[^``abehgegjlmoruwy|~€‚„…†‡†…„‚~yuspopqqruvwy{‚„……†…ƒ~zxy{|}|yxy|}zyt!!(;Xr†‡†‡†ˆŽŽŽŒŒŽŽ‹‹”•“‘’“’“’’‘‘’––““““”–˜—•““”“Œ‰’–˜—–––”’‘‘“““•———˜˜•““”šžžŸžœœ››œžžšœžŸŸŸŸŸŸ¡¥£¡Ÿ—ž¢¡ Ÿ  ¡¢¢¡¡¢¡¡£¤£¢¢£¥¦¦£¢¡ ¢¢¢¤¥¤¤¤£¥¦¦¦¥¥¥¥¤£¢££¢ŸŸ¢¤£ Ÿ    ¡¢¡ Ÿ  ŸžŸtm\NJF@6''0:?DIMNRX\^^^`aceecfhhjmrvwy|ƒƒ„……„ƒ~ytrqrstussux{}€‚„†††‡‡†„}zxxyzzzyyz}|zu@&:Wt‹‡‡ˆ‡ˆŒ‘‘ŽŒŽŽŽŽŽŠŠ“”’‘““““”“’“”•••”’‘’–—•’‘‘‘Ž–—–••–—–””•–••–˜—–—˜—•“““—œ››œž›ššš˜™™šžœŸžš›œŸŸžžŸ¢¢ Ÿ›˜œ¢¡ ŸžŸ¡¢¢¢¢¢¢¢¢¡ ŸŸ ¢¤¥£  ¢¤£¡£¤¤¤¤¢¤¥¥¤¤¥¦¤£¢¡¢¢¡  ¢£¡¡¡¢¢¡¡   ŸŸŸžœœ› ‘rl\NIGB6%%,5;AFILQY[\\\_aabcbefefkptuw{~€€ƒƒƒ{wtrqtvwvutvz}€‚ƒ„…‡†‡‡‡†ƒ€|ywwwxyywx|}}ƒ`7%;\x‰‰‹‰ˆ‹ŽŽŒŠŠ‘’’””’’’‘“•”“‘‘’”–•’‘’“’Ž•—•“”–—˜———˜˜˜˜š™–•—™˜–””—™™™›œœš™™–™ššš žžŸž˜™šœ ¢¢¡žžŸ  Ÿœ¡£¢Ÿžžž ¡¢¢¢££££ ŸŸ ¡¡¢¥¤¡ ¢££¢¤¥¥¥¤£££¤¤¤¥¦¤£¢¡¢¢¢¡¡¢¢   ¡¡¢¡ ŸŸŸŸŸ›››¡”jfZOKGB5!"*3:?CFKRY[[[\^`abbbccdglpstw{€€‚ƒ‚|xvsquxxwuvy|ƒ„…‡‰‰ˆ‡‡‡„‚|yyxxwwvwz|~oU%=`zŠ‹Œ‹Š‹ŽŽŽ‘ŽŽŒŠ‹‹‹’””’‹“••“‘’“•”‘‘”—š••——•“”–—™˜––—˜˜™š›—”–™š™˜––˜˜˜™›œœŸžœ›šœŸ Ÿž˜™—›¢£¤§¤žž ¡¡¢¢£¡ŸžžŸ ¢£££¤£¡¡¢££¢¡£¤¢¡¡¡¡¡£¥¥¤£¢¢¢£¤¤¤¥¦¢¡ ¡¢£¢¡¢¢¡ŸžŸ¢¢¡¡ ¡ Ÿž››œ¢•a`XPLFA2'18<@ELRXZZZ\^abba`__agmqssuz~~€‚ƒ€~{yvsruxywuvz|}‚…†ˆ‰ˆ‡ˆˆ‡…ƒ}{{{yvssux{}|{l!'Aax‹Š‹Œ‹Š‹ŽŽŒ‘ŽŽŽŒ‹‹ŒŽ“’‘’•–•ŒŽŽ•–—–’‘’”‘Ž”——–•••”“”—™š™–”–™šššš˜•–˜šš™——˜˜™šœžžŸŸŸŸž›™›Ÿ žœš™œ ¢¤¥¤¢™ ¢¤¥¤¢¡ŸžŸ¡¤¥¤¥¥¤££¥ª¦¡¢££¢¢¡¡¢£¤¤£¢¢¡¢¤¤££¤¤¡ ŸŸ¢¢¡¢£¢ŸŸ¢¡Ÿ ¡¢¡Ÿž›œ¡¢•[\WOID?1$/5;AGNUZZYZ[]ac`][Z[_fmqrrtz}}~ƒ‚€}zxvuuuxzzywx{~„†‡ˆˆ‡‡‰‰ˆ†„‚}|{zvrsuwz}~€~W*Dcx‘‰Š‹ŒŠ‰‹Ž‹‹ŒŽŽŽŽŽ“™•“”–—•ŽŽŽ”——•’’’’“’–––”“”––—™š›™–”•™›™™˜š––˜™—–•–—˜šŸŸ ŸžœŸžš™›žžœžŸ  ¢¤¤¢šœž £¤¥¤¢¡ Ÿ ¢¡¡¤¦¦¦§¦¤¢¤§©¢¡¡¢£¤¥¥¥¥¥¤¢¢£¢¡¢¢¡ ¡¡  ¡¢¤¤£¡¡££ ŸŸ žŸ   ŸŸ››£œ‹R`WNGB=."-29?ELUYXVVX\__[XXY[_cjmoprx|||‚ƒ‚|yvvvvxz{{{yy}€‚…‡‡ˆ‰ˆˆ‰‰‡…„‚€~{xwvvwxy{}~}‚{Z!+EcvŒ‰Š‹ŒŠ‰ŠŽ‹ˆ‰ŠŒŒŒ‘’ŽŽ“••••––•’ŽŒŒŽ‘•–—•””’’’Ž”——••”˜™šš››š—•–™›––••“”˜™—––—˜™¡  Ÿ››ž›šžžžœŸŸž ¡Ÿ ££¢ŸžŸž¡£¥¦¤£££¤££¢ ¡¤¤¥¦¦¥£¤¥¥¢¡¡¡£¥¥¦§¦¥¤¢¢¢¢¡¢££¡¡¡¡¡¢¤¥¥£¡ ¢¢ žž››ž ŸžŸ¡Ÿœ›—ƒT_UMHC=,*17<BIPTTTSUWYXTTVY]aehklnsy|||~‚}ywxxxy{{|}||€‚„†‡ˆŠ‹ŒŒ‰‡…„~|yxyz{{{}~~ˆt!+BczŠˆŠŽŽ‹ˆˆŠ’”’Ž‘’““”••••”‘ŽŽ”–•”“’‘““‘”—˜™˜—››šš››šš—––•“““”’”—˜—˜™™˜™Ÿ  Ÿœ››œœ ŸŸžœžžž ¡ ŸŸŸ¡ Ÿ  ¢£¤¥¤¤¥¥¨¤¤£ Ÿž£¤¥¥£¡¡¢££¤¥¥¥¥¥¥¦¥£¢¢££¢£¤¤££¢¢¡ ¡¢£££¡  ŸŸžŸž›œž   Ÿ  ›—–…]]TMIC<+'.5:AGKMPSTRSSRQTX[_cghiknrvy|||€~|zyzyxy|}}~€€ƒ…‡ˆ‹ŒŒˆ‡†ƒ€€}{{{|||~ƒ<!*@c{ˆ‡ŠŽŽŠ‰‰‹ŒŒ’“”‘‘‘’“““““””’ŽŽŽŽ‘••”’‘““””•——™–•šš˜˜››š™–•”’‘‘“•”•—˜˜š››ššžŸŸž››œŸ  ŸžœœžžŸ¡¡ŸžŸ   £¤¤¥¥¤¥¤££¤¤£¡¡¢¤¥¥¥£  ¡¢£¤¦¦¦¦§§¦¤¢¡£¤¤£¤¦¤£¤¤£¢¡¢¢££¤£¢ ŸŸŸ ¡››Ÿ¡¡ žžŸ¡Ÿ’ˆb\SLF@9)$,3:@DILNRTQONORVZ^aefghlosuwz{|~~~}|{{{zwy~€€€‚ƒ~~€…‡ˆŠ‹Œ‰ˆ‡†…„ƒ‚€}{{}~€‚ƒ€}†h5!*@byˆ‡ŠŽ‘Ž‹‹‹‹‹‹‰‹’““’’““‘‘’’“’ŽŽ‘•–•’’”•—–“”™—•“—š——››™˜–•“‘‘’“••–˜——œœœžžžœ››žž  Ÿžž›™›ŸŸ ¡   ŸŸŸŸ¡¤¥¤££¤¡šŸ¥¤¢£¤¥¥¦¥¢Ÿ £¤¤¤¥¥¥¦§¦¥¥£¢£¥¥¤¤¥££¤¤£¢£¥¥¥¤¤¤¤  ¡¡¢¢žŸ ¡Ÿœž ¡•Šƒg[SMG@8( *27=AFJKNQOMLNUZ]`ceedglnpsvyzz|||||}}|ywy~‚‚‚‚~||…ˆˆ‰‰‰ˆˆ‡‡‡†ƒ€~{{~€€ƒƒ€|{u`!*Acxˆ‰‹ŽŒ‹‹Œ‹‹‰‡Š‘‘’’ŽŽ‘””’““Ž‘’”••“’“•–˜—–—™˜–“‘‘–˜˜˜š™˜˜˜—•‘’’’“–›žž Ÿžžœœœœžž¡ žžžœ™šž  ŸŸ  ŸŸ  Ÿ¢¦§¥¡Ÿ›žžŸ¦¥¤£¢£¤¤¤£¡Ÿ¥¦¥¤££¤¤¤¤¤¥¥¤¤¥¦¦§§¥¥¦¥¤£¤¦¦¥¤£¤¥£¢¢£££     ›œž ›…{eYTOHB9(&06=@DGILNMKLQY^`bcdddhllmqvxxy{{zz{}}|zy{}€‚ƒƒƒ‚€}{|€…ˆ‰ŠŠŠ‰ŠŠ‰‰ˆ„€}}‚ƒƒƒ‚‚}{~w!+Dez‰‹ŽŒŒŒŽ‹Š‹ŽŽ‘‘Ž’“‘’–•’‘“””•”“’”–——•”—˜˜•’‘•˜š›œš™™›š˜–”’‘“—¡ŸŸ Ÿœœ››šœžŸžžžœœžŸžžžžšž¡ œš›žŸ  £§¦ š—’—›¡¤¥¥¥£¡ ¡¡¡¢¦¦¦§¥£¢£¤£¢¡¢£¤¤¦¦¦¦§§¦¦¦¥¤¤¤¤¢£¤¢¢£¢¢¡¢¤¥¢ ŸŸŸœžžœ~raWSOIC:'!.4:>@CFHIFGMU]``aabcehjjlptvvwyyyyz|}}}}~ƒ„„ƒ{y{~‚…ˆŠ‹‹ŠŠŠŠ‹‰†„ƒ‚~|~‚……„ƒ€}z(!-Fe|ŠŠŽ‹Š‹ŽŽŽŽŽŽŒŽŽŽŽ‘”—–”“’‘”–—–”’’”–——•”–—–”’‘Ž—˜™›œ›šššš™˜—“’’—šŸŸžžœ›››™—™Ÿ Ÿž›œŸ ¡  ¡ œš™œ  Ÿ ¢¤¥¥£›˜™˜ž¤¤££¤£¢¡  Ÿ¢¦§¨§¥¢¡££¢¡¢£¥¥¥¦§¦¦¦§¦¦¦¥¦¦¤¤£££¢¢£££¢¢¤¥£¢ ŸŸŸžžžž££ƒq]TPMIB7%!/59;<@DECAFQY^``abbdghijnruvvwzyyz|~~~€€€ƒ……„‚}yy{ƒ‡‰ŠŠŠ‹ŒŒŠ‡„‚~|~ƒ„……„ƒ‚~…@ "/He}‹ŠŽŒŠŠŽŽŽŒ‹ŽŒ‹Ž‘“•––•”“‘’”——”’’“”–––•–––”““—šš˜š››š›š™˜™›—”–—™žœœœœœœš˜™ž žœžžœ›žŸ¡¡   œš›¡£¤£££££¤¥¤Ÿ ¤§§£¡ ¡¢£¢ž ¦¥¦¦¦§¦££¤¤££¤¨§¦¥¥¥¤¥¤¤£££¤¥¥£¢£¢¢£¤¥¥£££¢£¢¢ žž Ÿžœ›¤¡l`SOMJA5$-48:<?@?==FT\_a`ababdgijosvvvwyyz|~€€€‚„†…ƒ€|xwwz}‚…†…‡‰Š‹‰ƒ€~‚„„……„ƒ‚ƒZ4"/HeŒ‹ŽŽŽ‹ŠŒŽŽŽŽŽ‹‹‹Œ‹‹‹’““‘‘”••”““’‘’•–”’‘‘‘‘”—•–—˜˜––˜››™™›››œ›™˜š›™˜˜˜˜œžœžœœžŸŸŸžŸŸœœžžŸŸœœŸ¡¢£££¢¡¢¤¦¦£¢¢¤¤£¢  ¡££¡¢¥¥¤¥¤¥¦¦¥¥¤££¤¦¦¥¥¥¤££¢£¢¢£¤¥¥¢¡¢¢£¥¦§¥££¤¢  ¡ žžžœ›™ ›{g]ROMH@4"(17;<;:89?KW^`bbbb`_aeikotvvwwyz{}€€€€€‚……„‚€vrrvz}‚…‡‡‰‹‹‹‘‹ƒ€€€‚„…††…„ƒ‚€zhH"!,FdŠŒ‹ŠŒŽŽ‹‹ŽŽŒŒŒ‹‹ŠŠŠ‹Œ‘“”’‘““’’’‘‘“•”’‘‘ŽŒ‘•—˜˜—•–˜™˜˜š››œ›™™š›š˜˜˜˜š›œœžžœžžœŸ  žŸŸœ››žŸŸžž    ¢¡ ¡¢¤¦¦£¡¡¡¡¢£¢¡¡¡¡¡£¤¤£¤££¥¦§¥¤¤¤£¤££££¢¢¡ ¢£¢¢£££¡ ¡¡¡¢¤¥£¢£¤£¡  Ÿœœ›š™™ž•xg\QNLG?3!!+4997626COY_aba``^]`dgjnrtuwwxz|~€€€€ƒ……{vpmotz}~†‡ˆ‹Œ‹ˆ‰‹ƒ„†‡†…„„ƒ{] *Aa}ŽŠŠˆ‡ŠŽŒŒŽŽŒŒŒ‹‹ŒŽ’”“’‘‘’“““’‘’””“““Œˆ‘”–˜˜—––—˜—˜š›ššš™™™ššš˜˜˜˜˜šœœœžžžœ›œžŸŸžŸ ŸžœœŸ ŸŸžž  ¡¡¡¢¢¢££¤¥¤£¢¢¢¢¤¤£¡ŸŸ¡£¤¤¤¤££¥¦¦¦¦§¦¤¤¤¤£¢¡  ¡£¥¥¤££¢¢¢¢¡ ¡¢£¢¢¤¦¤£¢¡ ŸžŸœššŸŸŽqiYNMKE<1%/554417IU]aba_^^^`cegkoruxxxy{}€€‚ƒ„……€tojimsy}~‚†‰Š‹ŒŒ‰ŠŒŽŒ…€€€‚†ˆˆ‡…„„ƒ‚ƒ‡o"*7`|Œ‰ˆ……†ŒŽŽŽ‘‘‘““”””““““’‘‘’””””’‘’“•––•–––—˜—˜™™˜™šš™˜˜š›™˜——˜™šš›››œœœœœœžžŸ¡¢¡Ÿž  žžŸŸ¡£¤£¢££¢¢¢£££££¢£¤¤£¡ŸŸ¢£¤¥¥¤£¤¦¦¦§ªª§§¦¥¤£¢   ¢¤¥¥¤£¢¢££¢¡Ÿ ¢¡¡£¦¦¤££¡¡¡ Ÿœœœ¤‰mhWKJHC;.!+01023<MX_ba_]]]_acegimqvyywwyz|~ƒƒ„……ƒphfhmrwz|€„ˆŠ‹‹‹‹ŒŒ‡ƒ€€ƒ†ˆ‰‰‡…„ƒ‚‚x'" $-:c€‰ˆ……ˆŒŽŒŒŽ’’‘’““’“”••””“””““’‘“”””““•–•••••”••–˜—————™››—–˜›œš™˜˜šš››œœœœœž ¡žŸ ¡££¡Ÿžž ¡ žŸŸœ¢¦§¤¢££¡¢¢¢¢¢££¢¢££¢¡ ¡¢£¥¥¥¥¦§¦¥¤¦¦¤¥§¦¤££¢¡¢¢£££¤¤£¢¢££¢¡ ¡¢¡¢¤¦¦¤££¡¡¡¡žœœ¡”ieTIGEB;+(/.+/6BRZ_a`]\]^_acegilrxzxvwy{}~‚ƒ„…†……Œfacglquy{~„ˆŠŠ‹ŒŽŽŒˆ„‚ƒ†ˆŠ‹‰‡„‚€€~€F&#-?g‰‰ˆ‡ŠŒ‹‹Ž‘’’““”•–•“‘’’’”“Ž‘”••••–——”’”•–••”•––••–—™›š–•˜š›ššš›œœœžžŸ¢¦ žŸ¡¢£¢žœš ¡¡  Ÿ¢¥¥¤££¢¡¢¤£¡¢££¡¡¢¡¡¢££££¤¥¤¥§§¤£¡  œ ¦§¤¢¢£¤¥¥¤£¢£¤¤£££££¡¢£¤££¤¥¥¤£¢¡   ››šžŽ€e`SKGDB9('-*&,8FV^_`_\[\]]_adfimrwxwvxz|}}~€ƒ„…†ˆ†‡„YY`fjoty{~ƒˆ‰‰Š‹ŒŽŽŽ‹ˆ…‚‚‚ƒ…‡‰‹‰†„~~~†h=# +?f~‹ˆˆ‰‰ŠŒŒ‹‹‹Œ‘ŽŒ‘’‘’”••’’““••‘‘•–————˜™™”‘“–˜˜˜–•••”•–•–™˜——™››››œžŸœœŸŸžœžŸŸ ¥ žžŸ¡¢¡ ž›˜œž¡¢¢¡ž¡¤¤§§£¢¢£¥¥££¤¤¢¡¢¢¡£¤¤££¤¤£¢¥¥¤¢¡  ¡¢¥¦¥¤£¤¦§¦¥¤£¢¤¥¥¤¤¤¤¤¥¦¥¥¤¤¤¤£¡¡    ž›š›¡”‡f[QNICA8%%*($*:JY```_[[\]^_bcfjmquvuuwxz{{{~„†‡‰†‰~^U]dimsy}€„ˆŠŠŠŽŽŽŠ‡…ƒ‚‚„†ˆ‰Šˆ…ƒ~}~}Z(Bb{‹ˆˆ‰‰Š‹‹Š‹ŒŒŽŒ‘‘‘’’’Ž“”••“‘’“–˜™˜˜—˜™™•’—ž —””••••““•˜šš››š››œžž——ž ¡ŸœžŸ›žžŸŸŸŸŸžœžŸ¡££ œ›—˜¥¡Ÿ £¤¥¦¥¤¤£¢¢£¢¢¤¥¤¤£££¢¢£¥¤£¢¢¤¤¥¦¦¥¥¤¤¦¦¥££££¥¦¦¤¤¤¤¢£¤¥¤¤££¢¡   ŸŸ Ÿœšœœ’„dZROLFA7$"%%$,>MY]^_^\[\]^`abejlnruuuvvvxxy}‚…ˆŠ‰lYS\chkqx}€ƒ‡ŠŠŠŒŽ‹ˆ†„„„…‡ˆˆ‡†…„‚€~p *Baz†‡ˆˆ‰ŠŒŒŠ‹‹‹ŒŽŒ‹ŠŒ‘Ž‘’“‘Ž‘•––”’‘“”–™™™—•–™™–•”™ž—””–—–•““•˜™œœ›œœœž™˜œŸ ŸžŸœš›žŸŸŸž ¡¡ ¢¡£¤£ ™˜–œ  ž£¤¤§§¥¤¢¢¢¢¢£¤¥£¢¢££££¤§§¦¤¤¥¦¦¦¥¤¤¥¥¥¥¤¢££¤¥§¦££¤¢ ¡£££¢¢¡¡¡¡¡¡ŸžŸšœ•ŒeZRNLGB7$"#%1DQX[]^^\[]^_abdgkmnpsuvvutvwz‚„‡Š‹’tdUR[bhmrw{ƒ‡Š‹‹ŒŽŠ‡†‡‡‡ˆˆ‡††‡…‚€€€€„1!-@e~††††‡ˆŠŒŒ‹Š‰‰‹ŒŠŠŠ‘’‘‘’’‘ŽŽ”–••“‘‘“•—™™™—“”™š˜——›ž›–””•–———•˜˜—˜šš›œ››œ›š˜žŸŸŸ ŸššœŸ  ŸžžŸ¡¡¡¡¢¢¢¢¡¡Ÿ—Ÿ¤££¥¤œŸž££¢¡¡¡¢¡¢£¢¡¡¢£¤¥¥¦§¨¦¤¥¦¦¦¤¤¤¥¤¤£¢¢££¢¡ž¡¡¢¢¡¢¤¤£¢¡   ¡¡¡ žœœœœš˜Š{dYSMJDA7&"&4ITY[\\[ZZ]__`cehlnnnqstutuuvy~ƒ†ˆŠŒ–e_TT]dimswz}‚†‰Š‹‹Œ‰‡‰‰‰ŠŠˆ†††…‚~~€ƒR+!/Emƒ………†ˆ‰‰Š‹‹‹ŠŠ‹ŒŠ‰Š‹‘‘ŽŽŽŒ”••”“’“•˜šš™˜—“•™›™˜™››™’“”•––—˜˜˜šš—–˜™š›šš›œž ŸŸŸ  ¡ šš¡¡ ŸŸ ¡ ¡¡¢¢¡¡¡¢£¢£¢¡¤¥¥¤¤£ Ÿž ¢£¢¡ ¡ ŸŸ  ¡¡¢£¤¢ ¥§¦¥¥¦¦¦¦§§§¥¤¢¡¢¤£¢¡¡¡¡¡¢¤¦¦¥£¢¡ Ÿ ¡¡ŸŸžœœ›š ›‡v_VQMIDA9&")8LV[]]\ZY[_`acfhilonnqsttuxxww{†ˆŠ‹•WXSV`glptx{~‚†‰‹‹ŒŽ‘‘Š‰‰‰‰‹Œ‰…„……ƒ||…mA!/Er††††‰‹Š‰Š‹‹Š‰‹ŽŒŒ’“’‘Ž‹‹ŒŒŽ’””““”–šš˜˜—••š›™˜š›š–‘““˜™™˜˜——›¡˜–—˜˜˜˜™›ž ¡ ŸŸ    žš› ¢¡žœŸ¢¢¡¡¢£¢ ž ¥£¢¢£¢££¤£¢¡   ¡¡¢¡Ÿž ¡ ŸŸ¡¢¢¢££¢¢£¦¦¦¦¦¥¦§¨¨§¥¤£¢¢¢¡¢¤¥¤£¢£¥¦¥¤£££¡žŸ ŸžŸ Ÿžœœ¢œ‚qZSOLGA@8% )9LW[]][YY\_acdghhjmoqqrstuxzyx{€„ˆŠ[SSYbhlpuy{~…ˆ‰‰‹Ž‹ŠŠ‰‰‹‹Š†„„„ƒ€|{}€‚a!/Fs†‰‰‰Š‹ŠŠ‹Œ‹‰ŠŽŽ‘•”•‘ŠŠŒŽ‘••””””˜›™˜—˜–•˜™™˜››š—”•˜™›™œž˜–—˜–•–™œžŸŸžžŸžŸ¡Ÿœœ ¡ ž ¢¢¢£¤¢ Ÿ ¦¤¢¢¢¢¢£¤¥£¡ ¢££¢¢¢¡Ÿ ¡¢¡£¥¤¢¡£¥¤£¤¤¦§¦¤¤¥¦§§§¥¥¦¦¤¡ ¡¥¦¥£¢££££££¤¤¤ Ÿ  Ÿ ¡¡  Ÿ  ™~m^PNKD>>6#*=OX[]\[ZY\^adfgghjmpttrrtuvwxy}„‰‹VPS[bgkpuy{}€ƒ†‡‰‹‹‹Œ‹‹Š‰‰‰ŠŠˆ…ƒ‚|{|u .Gq‡Š‰‰‰‰ˆ‰‹Š‹ŒŒŽ‘”•”’‘“ŽŽ‘–—•”“’‘–––—–•–•‹‰šž›š™™š™™œ£ ‘—œ—–˜™˜”•šžžœ››ž›ŸŸžžžž¡¢£¤¤ Ÿž™œŸ Ÿ ¡£¤¥¤¢¡¢£¢¡¡¢¡¡¡£££¥¨§¦¨ªª§¥¤¤¥¦¤££¤¥¥¥¤¤¥§¦¥£¡¡¤¥¤¢¡¡Ÿ¡¡¢¤¤¤£¡  ¡¡    ¡¦¤˜•{j]RPLFA=2 -@QXZZYZ[[[\^bdefhjmpttsrsttsux}…‰‰‘QPT[afjntz|}~„…‡Š‹ŒŠ‹Œ‹Š‰‰‰ˆ‰‰‡…‚~~€‚7.Gpƒˆ‰‰ˆˆˆ‹Œ‹‹‹‹“•”’‘•–“‘“–—–•“‘•–——–”“‘ˆ‡™š›››š™˜˜Ÿ˜™š™––š›šœŸ ¡Ÿžš™š››œžžžŸ›ŸŸžž¡¤¥¤¤›ž›š›žžŸ¡¢¢¢¢¡¡¡¡ ŸŸŸ  ¢£¤¤¦¨§¦©©¨¥¤¤¥¦¦¤£¤¥¥¥¤¤¤¦¥¤¤¤££¤¤£¢¢££ ¡¢£¤¤¤¤¢¡¢£¢ Ÿž¡«¨›˜€l]TRNJD</0BPXZZY[]^\\^acefiloprtuttuvwz|‚†‰‰ˆu[QU\bhjmsz|~€‚ƒ…ˆŠ‹‹‹‹ŠŒ‹‰‡ˆ‰‰‰ˆ†„€~~‚ƒ‚„‹W*.Hp‡‰ˆ‡‡Š‘‘’‘ŽŒ‹ŒŽ’‘‘““’‘’——”ŽŽ’“””””“‘“••–”“’ŽŽ”—™š›š™˜——™˜—––••—šœœž     Ÿ™™™šœžŸŸŸœ›œŸ   ¢£¦¨—œŸŸžŸ¡¢£¡Ÿ      žžž›Ÿ¢£¤¤¥§¦¦§¨¦¤£¦¨¨¦¤¤¥¦¦¥¤¤¥¥¥¥¤¥¤££¢¡¢£¥§¨£¢¢¢¢¤¦¤¢¢¢¢¡Ÿœ¢£–‘€k[RPLIB:/1BMW[[Z[]\\]^`bdfilnoortssuwz}€‚ƒ‡ˆ‡€kZRV]dhjkqx{|€‚ƒ…ˆ‰Š‹‹ŠŠ‹‹Šˆ‡‡‡ˆ‰ˆ‡…€~~ƒƒ„ƒˆm@!%%$#!  .Hl€‡‰ˆˆ‰Œ“’“’Ž‘““Ž‘“—˜–’’“““”””“‘’“’‘’‘”•–—™™™š™˜˜˜—––”•——™›œžžžž ŸŸžœ™›žŸ  ¡œœŸ¢¢¢¡ŸŸŸ˜•š¡¡žŸ¡¢£¢¡¢¢¡ Ÿ ¡¡£§ ˜¢¤¥¥¦¨§¦¦¦¦¦¥§©¨¦¥¥¥¥¥¤£££¤¥¨§¦¥£¡¡¡¢¤¥¥¥¤¤££¢¤¦¥¢¡ ¡¡¡œ  †yhXPNID?:02FRY\]\[[[]^^`cdfjnonnqrqrux{~‚„„‡‡…wfWSZ`eiikqxxy}ƒ†ˆ‰‹Œ‹ŠŠŠŠŠ‰‰‡†ˆ‰‰ˆ…€‚ƒ„ƒˆ„c!'+-,+)(&$  -Cj~‰‰Š‰ŠŽ‘“’’“’ŒŒŽŽ•˜˜•‘‘“––•••”••”“’‘“’‘‘“’“•–••–˜šœ›ššš™˜š›œ›™˜™›œœ˜˜ŸŸŸžŸŸŸ ¡¡¡ žŸ¡££¡ ›—”ž¤ž ¡¡¡¡¢¤¤¡  ¡¢£§§©¨¢£¤¤¤¥¦§¦¥¥¦§¦¦¥¤¥¦¦¥¤££¢¢¢¡¥§§¥¥¤£¢¢£¥£Ÿ¡£¤¥¥££¤¤¢¡ŸŸ ¡ ž¨£zsaTLLHA<8-2HSXZ\[[[[]]]_cdeimmlnponquy{~ƒ„‡‡…sbTR[aehhkrxy{~‚„‡‰‹‹‹ŠŠ‹ŒŒ‹Šˆˆ‰Š‰‰†‚€ƒ„ƒƒ‰t$+/24542.)%!!,@h|„Œ‹Œ‹Ž’’‘Ž‘‘’Œ–š™“‘“••–˜˜–•––••“‘‘‘––“•—•”•–•••–›œœœ››šš›œ›™–—˜šœœ™˜šžžžŸ ŸŸ ¡¡¡ ŸŸ ¢£ ŸŸžžž›˜Ÿ  ¡Ÿž £¤¤¢¡¡¢¢£¥§¨¨¦¦¦¤££¤¦¥¥¥¦§§¦£¢¤¦§¦¤¢¢¢£¡¡¦¦¥¤¤¥¥¤¢¢£¢ Ÿ £¦¦¤££¢¢¡Ÿž Ÿž««Š~p`RKKG@;6+4IRVX[\\\]_^\_bdehkllnpoorvy{~ƒ…ˆ‰n^POY_behlsx{~‚‚‚…‰‹‹Œ‹ŠŒŒŠ‰Š‹‹‹‰†ƒ~€‚ƒ……ƒ‹„B $*.148<<:5.)%!  #,EgyŠŒŒ‡‰ŽŽ‘‘‘ŽŽ‘‘’•™˜•’“•––—™™•”––––•”•™œ™˜˜™—•••••””•š›œœœœ›š™šš˜•–››œœ–˜›žŸŸžŸ   ŸŸŸŸŸžŸ¡ Ÿ Ÿ¡ ž£¢ ŸŸž¢£¢£££¢¡£¥¦§¥¥¦¥£¢¢££¥¦¥¥¦¦¤£¤¥¥¦¤£¢£¤¦§¨§¥¥¤£¢¢¢¢¢¢¡ ž£¥¥¤££¢¡  œžž®¤m_RKJGA;7-5JQUW[]\[]_^]_bcdfgiknpqrtuwx|…‡‰ˆaYLLW\^bgkrx{~‚€‚…ˆ‰‹ŠŠ‹Œ‹ŠŠŠŠŠˆ…ƒ€€ƒ„‡ˆ…ƒ…jA #&'%%(,.03:?@?;50+&%#""! !!$-Dex‚ˆ‹‹††ŠŽ‹‘Ž’’’‘’“•—˜—”•——––š˜–••–––••—™›š™˜˜—–•”””””•˜›œœœœ›•–˜›Ÿžžœ›™žŸžž ¡ ¡¡ ŸŸ žžŸžžŸ¡¡¡¡  ¢¡žŸ£££¢Ÿ—Ÿ¢£¤¥¤¢¡£¨©¨¡¡§¨¦¤£¢¢£¤¤¤¥§§¥¥¥¥¦¥££¥¦¨©§¦¦¦¤¢¡¢¤¤¤£££¤¥¥¥¤¤££ žŸŸžœ¤–‰ya\QLJGA<917KSWY\]]]^^_^`bcdfgilnqstvwxy{‚†ˆ‰†ˆZTKLU\^bhlqwz}}~€ƒ…‡ˆ‰ŠŒŽŒŠ‰ŠŠ‰ˆ††…ƒ‚ƒ…ˆŠˆ†zh"%),.00.++,,-/6>A?<971-*&#"! !!%-;e~‰‰‹Š…ƒ‡‹Œ‹ŠŒ‘““‘’“””–———˜˜–”’”——–––——––—˜˜™™˜—–•”“““”•–˜šš™˜˜—••—Ÿ¢¢ŸžžŸ¡¡ Ÿžž ¡¡¢¢¡¡ ŸžŸ Ÿ¡¡¡¢££¡¢£¡Ÿ ¢££¤¨§¥¥¥¥¤£¡¡¢£¤£Ÿ¨©§¥¤£¢£¤¤¦§¨§¥¤¥¥¦§¦¦¦¦¨¨¥¤¥¦¤¢¡¢§¦¥¥¤¤¤¤¤¤¤¤£¢žš¡¤¤¡žœ›’Œx_XQLIFC>;2!8MUY[\\\\]]^^`bccehjloqrsuwxxz„‡††‰_QKMT[^ahlpuxyyz|~€‚‚„‡Š‹ŒŒ‰ˆ‹Š‰ˆˆ‰ˆ…€ƒ„ˆŠˆ…u"*26998640.,+,2;=;8::62.)%# #,;l‰ŽŠŒ‹…ƒ†Š‹Š‰ŠŒŽ‘’’’’““””•—™š™•’”—˜———˜˜˜—–•–——˜—––––––——˜™š˜““”–••˜žžž››šŸ¡¡   žžžŸ¡¢£¢¡Ÿž ¡¡¢£¡¡¤¥¤¤£¢¡¡¢££¤¨««¨¨§¥¤¤£¢¡ŸŸœ ¨¨¦¥¤££¤¥§¨©§¦¤¤¥¦§¦¥¦¦¥§¨¥¤¤¥¤¢¢£¥¦¦¥¥¤££¥¥¤£££¡ž£££¢¡Ÿš‘‡x]VQKFDC>:19MVZ\\\\\\\^^_bcbdhjmpqrsuwxy{~‚„…ˆ†ZNJMTY]agknrttvx{}€€ƒ†ˆŠŒŒ‹Š‰‹ŒŠˆ‡‡‡…€‚ƒ†ˆˆ†7 %-6;>?><951,('+24115742/*'# ",=nŠ‹Œ†ƒ…ˆ‰‰‰‰‹ŒŽŽ’“’’’“““•—˜—•‘‘”˜™˜——˜™˜—–•••–———–——˜˜˜™™™˜˜–“’š™•™œ™™™›œžŸžž  Ÿž¡¢£¢¢Ÿž  ¡¢¡¡£¤¤£££¢¢¢¡  ¥§¦¦¦¦¤¤¥¤£¢£¤£¦¨§¥¤¤¤¤¦§¨¨§¤¤¤¥¥¥¥¢ ¥§§§¨¦¥¥¥¤£¢£¤¤¤¥¥£¡£¦¥££¢¢¢¢¢££¢¥¨ ˜„tcWTMECB=9/7JSXZZZZZ[\^]^`aadgiloqstuvxxz}ƒ‚†UIGLSW[`dgimprtwy|}~€‚…‡Š‹‹‹‹‹‹Šˆ‡‡†…ƒ‚‚‚‚…‡ˆ‡„ˆ‚V'"'-59<>?=950*%#$(((*0320,($" !->iƒŽŒŒ†„…‡ˆˆ‰Š‹ŒŽŽŒŒ““’’’’’“••–•’‘“—˜˜–––––––——–••–––—˜™˜™›œš˜™˜Ž›œ››œœššš›ŸŸœ  ŸŸ ¡¢¢££¡ ¡¢¢¡¡¢¢Ÿ¡¢£¢¢¢ žž£¤££¤¤££¥¦¤¤¤¦§§§¦¦¦¦¥¥§©©¨¥¤£¥¥¤£¤£¢£¦§§§§¦¦¦¥¥¤£££¤¥¥¤£¤¥£¢¢¡¢££¢¢¡ ¡œžž…qaURKDBA=;/5HPTVWXXXZ\^^^`abdfilprsssuwxz~€‡LCBIQUZ`egimqtvxz|}€‚„„…‡ŠŽŒ‹‹ŒŒŒ‹ŠŠŠˆ‡…ƒƒƒ„…ˆ‰Š‡Š„c;#&*0479::61,'"!!"&-00,'#! ".E`yŠ………†‰ŠŒŒŒŽŒŠ‹Ž“”“““’’“””””“’“•––•“““”–˜™™—••••”•–˜™šœ›š›žœž¡ž››œœœœ›Ÿ Ÿž››Ÿ¢¢¡  Ÿž¡¥¤¡££¢¡££¡ŸŸ¡¡ ¡¢š¡£¤£¢¢¡¡¢¥¥¥¤£¤¤¤¤¦¨¨¨¥¤¦¨¨¦¥¥¥¦¥¤¤¥¤£¤¥¦¦¦¦¦¦¦¥¥¥¤£¢¦¦¥¥¥¥¦¤¢¡¡¡¡¡¡¡ ›”ˆ’•}n_SOKFC@?<-2EMRTUVVWY[\]]^`abdhloqqpooprw}ƒ~C=@HPUZafkosuvwz{{|€‚ƒ„……ˆ‹ŽŒ‹Œ‹ŒŒ‰†„‚‚ƒ„‡‹Œ‹jL#&(+.1231.*&! $)+)&# ".D_vŠŽŠˆ‡…ŠŽŽ‹‹’””““’’”••””•••––•”“’’“”—™˜——––•••—š›œžžœš›œžžžœ™˜š››œŸ¡¡Ÿ›› ¤£¡ŸžœœŸŸ ££££££¡ŸŸŸŸŸ¡¢¤¤£££¢¢¡¡¡¤¥¦¥¤¤¤££¥§¨¨¨¥¤¦¦¦¥¥¥¦©¨§¨¨¥¥¦¦¦§§§¦¥¦¥¤¥¦¦§¨¨¦¦¦¥¥§¢¡¡¡¡  ¡ š‘Œyl^SPKFB>;6(/BJORTUUWYZ[\]]_``cglopponkjmtz~ƒu>:?HQW]dimtz{z{}}}‚ƒ…†…†ŠŒŒ‹‹ŒŒŒŒ‰…„ƒ‚‚‚„‡‹Ž‰oW" "##%'())(&$  #&%#!!.FbyŽŒ‹ŠŠ‰‘“’‘‘Œ’•–••”“•—–•–—–––—–•“’’“”–———˜˜–•”–™›œ˜˜›™™š›˜•™™˜––•“Ÿ ¤¥ž™™šŸ£¢ŸœœžžŸ ¡¢¢¢¡   Ÿ   ¡£¤¥¤¢¢¢¢ ¢¨¦¦¦¥£¤¥¤¤¦§§¦¦¤£¤¤¥¥¥¤¦©««­­©§§§¦§¨§¥¤££¢¥§§§§§¦¦¦¥£¡  ¡¡¡   ŸŸ¡ž“Œvj\TSNHC>81$);AFJMPTVWYZ\]]___aeimmnnnkjmsx|€€l68@IPXaeiow|}}}~€‚‚ƒ……„„‡ŠŠŠ‹‹ŒŒŒŒŒ‹ˆ…„„ƒ‚ƒ„‡Š‡ƒrZ!#$#  !"!!-Bg|‹‹Š‰‰‹ŒŒŽ‘‘Ž““‘”——––•”•—————––———–•“’“••–—˜™š˜–•—™›››””–˜———‘’——•”””œ¢ ›š•”› ¢¡œžžžžœŸ¡¡         £¥¤£££¤¤££¦¥¡£§¦§¦¢¡£¥¥¤¥§¦¥¤£¢£¤¤¥¥¥¥§©¬¬¬«¨¦¥¥§«¨¦¦¤££¥¦¦¦¥¤¤¥¤¤¤£ž ¡¡¡ Ÿžž¡¤–‰teZTRLHD@8.""29@EJPTVVX[]]]^_^`cgjjlmmmnqvy|€…€`B8CLR[chlsy|}~~€‚ƒ„ƒƒ…‡‡„„‰‹ŠŠ‹‹‹ŠŠŒŒŠˆ…„„ƒƒ„…‡ŠŒŒŠ†v\ ! !.Elƒ†ˆˆˆ‰ŒŽŒŒŒŒ“”’“”•™šš—••––——–”““““””••”“”–––—˜™š—•”•–˜™™—”•–—˜—•‘“”””•—˜›œš•”•—˜ŸŸ›  ž ¤¢¡¡  ŸžŸ ¡¡  ¤¨¦¥£¢¢£¤©«¥¡¡¢£¥£ £¤¤¢£¥¥¥¤¤£¥©©§§¦¥¥§¦¤££¤¤¤¥¦¥ ¥¦¥¤£¤¤¥¤£¢¢¢¢£¥©§¢¡¡¢¡ Ÿž¡–‡qeXROJFC@7+*4>GNSVVVX\]\[\\\]`ceegikmpsx{~€oV=6DMS\dimrxzzz{}€‚ƒ…ˆˆ„„ˆ‰‡‰ŠŠŠ‰‰‹Œ‰†…„ƒ‚„…†‰‹Œ‹„^ .Fq‰Šˆ‰ŠŒŒŒŠ‹Œ’’“””–™›š˜–•–—˜–”’”””•—˜——˜™˜•”•–––˜˜–•”–™œŸ‘‘“•–œ›š™™˜™™™žœ› ¡ ¡£¤¢¡¢¢¡Ÿ ¡£¢¡¡¤¤¥¦¥¥¤£¤§¦¥£¡ ¡££Ÿ¡¢£¢¢£¥¦§©©ª«¬­«¨¨§§¦¦¤££££¤¦§¦¤¥§§¤¤££¤¤¤£¢¡¡¢¦¨¥¢¡¢¢¢¢ žžŸ¡€lbVOLHD?<5*&4ALSVXWX[]][YZZ[]_abacfjnrvz~€gN95DNU^eknrxyxxz||}……†ˆ‰…†‰Š‰‰‰‰ˆ‰‰‹‹ˆ‡†ƒƒ„…†‰ŒŒ…‚a-Djƒ‰‹ŠŠ‘‘ŒŒ‘”””•–˜˜–•“”––”ŽŽŽŽŽŽ’“”•–——•–—–””—˜˜˜™˜•””—›œœ’—Ÿžœ››œ¡ œœžžžŸ ¡¢¢¢¢¢¢¤¥§¥£¤¥£Ÿ¡¢¢¡£¥¦¦£¢£¤¥¤¢Ÿ¡¤¥¤££££¤¥¦§¨©ª«¬«©¥¥¥¥¥¥¦¦¥¤£¥¦§§§¦¥¥¤£¢¢¢¢¢¤£¢¡¡¡¢¡      ¡  ¡£‹jbUKIGA;83)!6GPTXYYXY[[[ZXYY[^_``_aejosv{~‚`L87GPX`glotwwwxy{{~…††ˆˆ††‡‰‰‰‡‡‡ˆŠ‹ŒŒŠŠˆ„ƒƒƒ„ˆŒ…~l-Ag}‹ŒŒ‘‘‘’‘Ž‘””““”“”’‘‘’”•”ŒŽ’’‘’”••––””•••–—˜˜˜˜—”“•˜›œš˜¡ŸžžžŸ  žŸ¡¡  ¢¤¤¢¡¡¢¤¤¥¢¢¤¤£ ¢£¢ ¡¢¥¥£¢¢£££¢ŸŸ£¤¤¤¥¦¦¦§¦¦§ª©©ª¨¦¥¤¤££¤¦§§¥¥§§¦§§¥¤¤££¢¢¢¡¡£¤£¢¢¢¡¡¢££¢  ¡¡¢¤¦šŠ‚m`SFFF@:61'.GTZ\\\[ZZZXXYXXZ\_`aa_aflquz~€‚~[I;<KT\bhmqvyzz|}}~ƒ„†‡ˆ‰ˆ‡‡‡ˆ‡†‡‡ˆŠ‹‹ŒŒ‹‹ˆ„‚‚ƒ†ŠŽŒ†s -Hf~ŒŠ‘‘‘“””’‘ŽŽŽ’”•’“””“““‘‘’”•–•““’•–——•”••”“”–šœœœœ››ŸŸœŸžžžž›œŸ¡¡ Ÿ ¢¢¡ ¡¡¢£¢ŸŸ¢¤£¡¢£¡   £¢¢¢¢¢¢¢¡ Ÿ¡¢¢£¦§§§¦¤¢¤¦¦¦¥¦§§¦¦¥¤¥§¨¨§§§§¦¦¦¡¤¥§¥¤£¢¡¢£¤¤¤¤¤¢¡¤¥¥£¡ ¡¢¢¥§œˆzh]RHGFB=81%*CRX[\ZZZ[[ZXWVUVY\]___^`fmqv|€€zVG=@MV^bhnrw{{}‚‚‚„††ˆˆˆ‰ˆ‡…„„„„…†ˆŠŠŠŠ‹‹‹ˆƒƒ†ŠŠ€{z /Ig€‘ŒŽ‘’‘‘‘‘’“••“‘Ž‘“”‘Ž’•–”’”•”’’”–——“‘Ž’˜˜–”““•’’”™›œ›››››œžœœžŸŸ›››œ ¢ žŸ   ¡¡¡¡¢¡Ÿž¢¤¤¢¡¡ Ÿ ¢¤£¢££¦¤¡¢ Ÿ ¢¡¡¤¨¨§££¢£¥¤¥§©©¨¨©§¥¥¦¨¨§§©©¨¨¨©¨§§¦¥¤££¤¤¥¦¤¤¤£¢¤¥¤£££¢¢¢¡Ÿ™ƒrbXPKIEB@;1#(@PY[[YWXZ[[YXWTSTWYZ[\\]_fmqw~€}tQD=@LV]djptz}~…†„ƒ†ˆ‰Š‹‰ˆ‡„€‚‚ƒ…‡ŠŠŠŠ‹ŒŒ‰…‚‚…ˆŠ‹‰‚~|!0Jh“Œ‘“‘‘‘Ž‘“•”“‘Ž“’’““‘’•––“‘“••’‘’“–˜˜–•™››››œœœœœœœ›š™š›››››››œ›Ÿ  žœœ››œ ¢¢žž£ª¨¤¤¡¢¡ŸŸ£££¡ Ÿ  ¤¥¤£¤¦§¦£¢¡¡¢££¢£§©¦  £¤¥§¨©¨¦¦©¨¦¤¤¦§§¦¨©¨¨¬¯ª¨¦£¤¥¥¤££¤¥£¡¢£¥¤£¢¢¤¤¢ŸŸ¡™’r_TONKFBA>1 9KTZ[ZYXXYZXVWXVSRTVUUWY]`dhmu|€zpL@;@KT\cjpuz|}€ƒ„ƒ‚„‡‰‹‹Š‡…ƒ€~~~‚„‡ŠŠ‹‹Œ‹‰†„ƒ‡ŒŒ‹ˆ}}†!0El”Ž‘‘ŽŒŽŽ‘”•”“’’“˜—•”“’’’”––”““””’‘•˜™™šœœ››››››œ›™™šœœš™˜™šœœž ¡  ¡ žœ ¤­ªª§££©°±­©£žœšŸ¡¡ ŸžŸŸ£¥££¥¦¥¤¢¡¡¡¢£¤¢¢¦©¦˜Ÿ¥¥¦§¨¨§¤¥¥¨©§¥¤¥¦§¦¦§§£¨­¬¬©£¤¥¦¤¤¤¤£¢  £§¦¤£¢¤¦¢žŸ§›’„taRONJECA;/+BOVZZYYZYXXWWWWWSQRTSSUX]bdejqw||lG;8AMU\cjouz{|}‚‚‚„†ˆŠ‰‡…ƒ€~}|}€ƒ‡Š‹ŒŒ‹‹‰‡††ŠŽŽ‰€|~Œ+!/Eq†–‘‘‘ŽŽŒ‹ŒŽ”–•”’“•–—–•”’’’’”•••”””“‘‘’•—˜™™™š››šššššššš™™™™››™˜˜š›œŸŸžŸ  ¢¢£°­¦¡ ›‘Š’ž Ÿ¢£ œžŸŸžŸ¡£¢£¥¤¢¢¢£££¤¤¥£¢¦©©¤§§¦¥¦¨¨¦¦¥¤¦©¨¦¥¦¦¥¦¥£¢Ÿ£§¥ ž¡¢¤¥¤¥¦¤¢¢  ¢¥¥¥¤¢£¥£ŸŸ¦š˜†paUQOKHE?8,0BKRXZYXXYYXWWXWWXURRSRRUX\acdflrw|{veH67BPX]cimsxyz{‚‚„†‡‡‡†„‚€~||{{}€†Š‹‹Œ‹Š‰‡†ˆŒ‰€|€Ž;#.Cr†”’‘‘ŽŒ‹‹‹‘“••”““““”•”’‘‘‘‘’”••””•””•–•——–•””–——™šš™™˜—–˜™™›œœ›››šššœžœ ª±®§œŽ‰‰†€rlrx}…’ž¢¡ ¡Ÿ ŸžŸ¢£££££££££¥§¥¦¦¥¤¢¤§ªª¨¨¦£¦§¨¨¨¦¤¦§§¦¥¦¥¤¥¤£¢£¦¦£Ÿ  ¡£¤¤¦¦¤¢¢¢¢£¤¤¤£¢¤¥£¡ ¡––zf`VQNJHF>6)+DQUWZZXWWYZYXWYYZ[WSQPOPTX\_cegkpsvxl\B49ERX\binrwy|~ƒ„†‡†„„ƒƒƒ}ywxy|‡‹‹‹‹‹ŠŠˆ‡ŠŽŒ‹€~‚I##.CpŽ‘ŒŒ‘ŒŽ’“””“’‘’’‘‘“”••–––˜™™™˜•”“““”–™››š™˜˜—˜˜˜™œžŸœ››œžžœ™¢¨¤•ƒo_WOOSZV@=CQc}’œž¥¨¤§¤¤¤¥¥¥£¢¤¦¥¤¦¨¨¨¦¤££¥§§¦¦§©§§§§§§¦¤¥¥¥¤¤¥¦¥¤£¤¥¦§§¥¢¡¢¢£££¤¤£¡¢££¤¤££¢¢¤£¡ £¦’…hh`VQMJIG@6')>NWY[[ZXWX[\\ZYZZ[[XTRONOSWZ]adglqrpkaP:3<HSZ]aiosvy}€‚…†††„‚‚„…ƒ}vssux|}€‡‹‹ŠŠ‰‰‰ˆˆŒŽ‹‡€~„—\1#/GczŠŽŽŽ‘‘ŒŽ’“”••”’‘‘ŽŒŽ’•–————™šš˜––•”””•˜›››šš™™˜—–˜›œžžžŸŸžžž¢¥¢¢ “{eVV^XSQPOLKLE=@j†’Ÿ¨©ª¦¥¥¥¦¥£¢¥©§§§§¨¨¦¤£¤¦¦£  §ª«ª¨§¦§§§¦¥¥¥¥¦¨¨¥¤¥¦§¦¥¥££¤¤¤££¢£¤¢££££¤£¢¢¢¢¡ ŸŸ¥wbi_UOLIHGB5%"8JTZ\]]ZYXZ]^]\ZZZZZXWUROPSWY[^bfjmmiaUB21=IU]_dkqtvz~€‚„…„‚€~~…†‚zroprvz}€†Š‹ŠŠ‰ˆ‰Š‹’“‹……“qA"0F\q‚ˆŒŒ’““’‘“”••”’’’’‘ŒŠŠŠ•—˜˜—•”™š––˜˜–••–˜šœœœœ›š˜—–•œ›š›œŸ¢¢Ÿ¨­¤–ˆwYJ[^YSMHFEC@=<?CBAVm‡›ž ¡££¤¥£¢¢¡¤¦¨¦¥¦§§§¦¨¨§¥¢Ÿ§ª«¬«©©©©©¨¦¥¦§¨ª©¨¦¦§¦¥¤¤¤¤¤¥¥¤£¢£¥¦¥¤¢¡¢¢¢¢¢¢¡ œ¡”‚hf]TOLJGE@3$!2ERXYZ\]\ZYY[\\\[ZZ[[[ZYUQPRVXYZ]begd_UD4-3AMV]`ciorux}€€€€~ywx}ƒ„vnlmpty|€…‰ŠŠŠˆ‡ˆ‹’’‘ˆƒ€†‰ƒ_"0Hat€†ŒŠŠ‹Œ’””“‘’“•••”‘Ž‘“””’Š…†‹‘”––——•”–˜“”—˜—•”•˜™››š™™™™ž•—š›œ›šœ¨°¨—‚kQQURRQLE@>=:63368:8B:kœ¢Ÿ¢£££¢¢£££¥¦¦¤¥§©©©©©¨§¤¤¦¨ª¬¬¬¬¬ª©©¨§§§§¨¨§§§§§¦¥¤¤¥¦¦¥¤£¢¤¦¦¥££¢¢¢¢£££ Ÿœ ˜jaXROLJFB<1"0EPXZYY[]][ZZZ\^_^\\^_^^\YUQPSUVWY]_\VOD2')6GQX]_cinruy}~}||{wtv|‚ƒ~ukikoty|€„‡‰‰ˆˆ‡ˆŒŽ‘…ƒ‡ˆ˜{"/Ei}†‹ŒŒŠ‰‰‹Ž’””“’‘‘’““””“‘’”••“‘Ž‰•••””•––•——””–™˜•••—˜šœœ›››œžž˜—œ›–˜¥ ŠpWZVOKJIJJD=:950,-///2:0Ch‰¥¨ª£¢¡¡£¥¥¥¥¦¥¥¥¦§¨©¨¨¨§¦¦§§¦ª¬¬«ª¨¨§§§¦¥¥¥¥¦¦§§§§¦¥¥¥¦¦¥¤¤¤§¨¨¥£££¢¢£¤£Ÿžœž‘„a_TOOLJF@8/ '@NTYZZYZ[ZYZZZ[^`_]_aba`_]XSOPSTTUVSMF>3&$-=MUX\^bhnqtw{|{zzyywy}„„uifintx|‚…†‡‡ˆ‰‰Œƒ€ƒ†ˆŒ Ž "/Cs…’”Œ‰ˆ‰‹Ž‘’’’’’‘‘Ž’“’‘‘’”••”””–œ˜—”’‘“”••—˜–”™šš™——–—˜š›œžžžžžœœœœž˜“™—‰oLSPHFFFFFFA:652+''('%',-;RvŸ©¬¯££££¥¥¥¥¥¦¥¥¥¦§§¦¦§§§§¦¥¦§©«¨¦¥§§§§§¥¥¤¥¦§¨¨¨¨§¦¥¥¥¥¥¥¥¦¨©¨¦£¢£££££¢ŸœžžŸž|a`UNKHGE?6-#:OY[[\\[ZXXY[[Z[]_`_`bcba`_\VQPQQQPME>5,% #3DPWZ]_cimqsvyzyxzyy{‚…‡…vgdhmty{~ƒ…‡ˆ‰Š‹ŒŽ„ƒ‡‰‹š•1 ".Cvˆ”ŽŒ‰ˆˆŠ‘‘’’ŠŒ’“““’“•••”•—›™—“‘‘’““”–˜—˜šœ›šš›˜–—˜šœžžŸŸš›œœœ¤¢ ™bMMJB?@BDFFD>842/("""! "'+5Lƒ‘•¤ª¦¥¤¤¤£¤¥¥¦¤¤¥§§§§§§¨§¦¥¥¦§¨§¥¦¨©©©¨©§¦¥¦¨ª©©©¨§¤¤¤¤¥¥¥¦¦§¦¤¢¡¢£¤£¢¡ŸŸ¡¤£¡uhaYQLGDC?7,4HV[\[Z[[YVVY[\[[\^``_`bbbba^ZURPMKHB:3+$'9HQX\_adhloqsx{zz|}}‚„†ˆ…ufaflswz‚‚„‡ˆ‰Š‹‹…ƒ…‡ŠŒ––]2!-@p€™Ž‹ŠŠ‰‘ŽŽ‘’‘Š‹’”••“’••“’’”˜™”’‘‘‘‘’“—šš›œœš™š›š—–—žŸžž Ÿœ”—šœ›™›–†gQIB:89<?BFGC=73/,&!$*7u‰Ž›«¨§¦¥££¤¥¥¦¤¤¥§§§§§§¨¨¨¦¦¥¦¨¨¨¨©ªª©ª©©§¦¦¨©©ªª©¨¥¢£¦¦¥¤¥¦¦¥¤¢¢¢££¢¡¡ ¡£¤Ÿœ‹je`YRNJFCA9,2GPVZZZZZ\[XXZ\]]\]_abaabdddb_[VQLEA>8/)#"0BMTZ^adhjlnqty~€€€‚„†‡‰†€wgbhntx{‚†ˆ‰Š‹‘‰…†‡‰ŒŽ’c+>m}•‘ŒŽŽŽŽ‘‘Ž‘‘Ž“”””’’•”‘Ž“”“’’’‘’““˜›œ›™—™œ–•— Ÿžœœžžš——™šœž“~dPE>3028=@BEEB=82-)$ #[€•¦¶ª§¦¥¤¤¤¤¥¦¥¤¥¥¤¢¥¥§©ªª¨§¦¦¨©©¨¨¨¨§§©©ª§¦§¨©«««ªªª¨¨¨¥£¥§¨§¥¤££¤¤¢¡  ¡£¤“–‰ne_WQOMJEB:*'=KQSTUWYZ[ZZZ[\]]]]^accbcccb`]ZUOE=950("(9FOV[^bfjlmmpuz„„‚‚ƒ…†ˆ†€whdjoswz~„ˆ‰‰ŠŒ‘Œ‡…†ˆ‹ŽŽ—¤,Ai}ŠŒŠŒ‘Œ‹‹‹Ž‘’’’‘’““ŽŒŒ’“”–”“““”—šš›œš—–––•”•˜œžœššœ›™˜š›™¦£Œ{N563+))-3;?ACBA>80*&!9l–©³ª¥¥¤¤¤¤¤¤¥¥¦¦¤¢¢¤¥¦©««ª¨§§¨¨§¦¦§§¨©ªªª©¨§§«¬¬«ªªª¨§§¥¤¥§¨¦¥¤££¥¥££¡ ¡¢£–˜‹td^WQNLHB@8&3GORRSSVXZZXXZ[\]^^_^_cdcba`_]XVSL@60*#"2BLRX]`chkmoorv}ƒ…ƒ€€‚‚ƒ…†ˆ†tigmpsx{}~€ƒ‡‰ŠŠŒ‘‹ˆ†‡ŠŽŸ– !!! -Cj|†ˆ‹Œ‹‹‹Ž‘“”“’‘‘“””’Ž“•——–”““”–—————–•““““–™š›™˜š›™—™œ«¤—|fL:1'##&)-48;>>>=80)$  I‘¤©¥£¤¤¥¤¤££¤¦¦¦£££¥¥§©©¨¨§¦¨©©¨§¦¦§©««ª©¨¨§¦¦­ª§§¨¨§¦¥¤¤¥§§¥¤£¡¡£¥¤£¡ ¡¢¤œ—Šv_[WRLIE@=3!";KQSSSTVXZYVVY[[\^_^]]aca_^_^YTQME:1*"!/@KQW[]_behjnquy~‚‚€‚ƒ„†‡‰‡qhflorvz|}~€‚…‰ŠŠ‹ŽŽŠ‰‡‡‰ŒŽŽŽŽ™™H)#$%%$" .Cl€€„‡‹Œ‹ŽŒŒ•••““’“••˜•‘‘’”•—˜—”““”–—˜˜—––•””›œ›™˜™š—–™œ —„Q>:0'!#&),/158;;72,'"*„§¦£¥¥¦¦££¤¥¦§¦¤¥§¨§¨¨¨¨¨§§©ªª©¨§¦¦§©ª«¨§§§¥¥¥£¢¥¦¦¦¦¥¤¥¥¦¦¥¤££ ¢¥¥¢  ¡¡¢›u]VTRMHEA<0-DNPSUTSUYZXVWZ[[]^^^\\_a_]]][UPJC:2+$*>LTY\^^^adgjnsx}‚‚‚‚ƒƒ‡‰Š‹€qgejorvy||~€ƒ†‰‹Š‹Ž‹Š‰‰ŠŒœ›a7 $&(*)% #1Cq‚‡ŽŽŽŒŽ‘Ž“““’’’‘”••–—˜•”•”’“•”““’’”—˜˜˜˜˜˜˜—šœœš™™™˜•–™œˆ‚‡}M71'" "#%&).4774.(#yœ ¤¦§§§¦§¨¨¨¨¦¤¦ª¨¨¨¨©©©¨¨©ªª©©¨§§§§¨©¨§¦¦¦¦§¦£¤¥¤¥¥¤¥¦§¦¥¤£¤¥ª©©¦¢¡¢¢¡¢ŸxscUTTOHDA</ 4FLLPSSRTXYXWVXYZ\\\]\\]^]\ZXTPLF;3.( *:JTZ]`_^^adfimrx~€€‚ƒƒƒƒ„‡‰Š‹Œ}neciosvxz|~„‡‰Š‹‘‹Š‰‰Š‘–˜qQ&&')*'# !  '6An€˜‘‘‘’‘ŽŒ‹‹‰‰‹‘’“‘”–—–••“‘‘“‘’“’‘“–—–—˜™™˜—˜˜˜˜˜˜™›š—•• ŸˆˆrN9-%  '0453,&!b˜¢®¦§§¦¦¨©©¨§¥£¥§§§§¦§¨©ªªª©©ªªªª©¨§§¨ª©§§§©ª¬§¤¤£¤££¤¥¨¤£££¤§«¬«¨¤¢¢¢¢¤¡”|scVUUNFA>7+)<HKKNQRRSWYXXXXZ[[Z[\\\\[ZYTOLHE@5,'",>JT\`ab`^^acgkpuy}€‚‚‚ƒ„„†ˆŠ‹vlcciptwxz}€ƒ†‡ˆ‹‘’‘‹‰‰‰‹Ž‘‘’‘™l*&#$$$##$$"!!!!!""""""!  "$#! "&157n…–”’’‘‘Ž‘’‘ŠŠ‰‰‰ŠŽ‘‘‘‘‘•–––•“‘“’’“”•–˜˜––˜™˜——–––••–™››˜•”£¡‡wX:-!&2552*$  Hn”¤²©§¥¤¤¦¨©©¨¤¢£¥¥¥¥¤¥§¨¨¨§§§©¬­¬«©¨¨©ª©©©ªªªª«¨§§¦¤£¢££¢£££¥¦ª¯ª¨¥£¡žœ˜œ˜}ncZWTME@92& ,9EKKKNQTTTVXWWWX[\[[ZZ[[ZWVSNHD@=8/'!+=KS[`bba_]]_bfkpuy{{|~‚„……†ˆŠtjbbiosuwz}ƒ…‡ˆŠŒŽ‘††‰‹ŒŽ‘‘‘˜¦€,&"%&'(()))*++***)'&()))*++++,/.:8K€Š—“’‘‘Ž’“’‹‹Œ‹ŠŠ’’’’’‘”•••“‘‘“”“”—œ›š˜——˜˜——˜––••–—™›š™˜žœU?7*(4751)$ 8X©®¦¥¤¤¦¨©ªª§£¢¤¥¤¥¦§§¦¦¥¦¦¦ª­®¬«ª©¨¨¨§©««ª¨§©¨¨¨¨¦¤£££¤¤¤¥¥¤£§§£££¢ž———™zlc\YTNGC;0!'5BJNMLMOSVUUWWVWVVY[ZYWWWWVTROIC?:4-&!.=JS[_cdca^]\^bfjouz{zxz}ƒ…………‡‰ˆribahnqtw{ƒ„…ˆ‰Š‹ŽŽ…‡‹ŽŽŽŽ¤‹-&"',0234567665432267644578;?AGGPs‡Š˜“’ŽŽ‘’‹ŒŽŽŒŒ’““““‘ŽŽ’“““’’“”••”—šœ›™˜˜™™˜™™—––—˜™šš˜™«ŸN4,$.7960)$:RŠ” ­¦¥¤¥¦§¨©©©¢¡¤§¨©©§¥¤¤¤¤¦¨ª««©¨¨¨§¦§¦¦©ª¨¥¤£¤¦§§§¦¥¥¦¦¥¤¥¦£¡¢£¢¡¢¢¡Ÿ›™“wlc\ZVOHC;-$)/4=EKOQPOOQTVUUWWVWVTVXXVTRSTSQOJD?:3,$$0=HQY^accb`^]]^bdfksz|xvy}€„†…„„†ˆ‡pgbafmprw|ƒ„†ˆ‰‰‹Žˆˆ‹ŽŒœ‹-%%09<=>?BDECA@ABCCB@?ACDFIMU]dw‹ŽŠ˜”ŽŽŽŒŒŒŒŽ‘’“””’‘‘‘‘’”••–—˜š›œš˜™™™š›š——–—šš˜—–“£—xV-'!"*4;<81)$+M‹”£°¤¤¥¥¥¦¦§©¥ž £¨«ªª©¢£¥¦§¨©ª©©§§§§¦¦§¦¦§¨§¥¤££¤§¨©¨¦¦¦¦¤£¤¥¤¢ž¢¢¢¢¢¡£¦›xnbYYVND?6'&-7?CIOPQRSSRRUVVVWWWXVTUXVTQPRQOLHD?91)# )4AMTZ_bddcba_^]_aceiqxyxwz|„†…„„…‡‡neaaekorw|„†‰Š‹ŒŽ‘‹ŠŒŒŽŽŽŽ›’-$"3?FJLLLNPNMORSSQNKKMOPQV\i…“ £™š—ŒŽ‘‘ŽŒŽŒ‘‘’“”““““’‘‘‘‘’”–›ššššš™—˜˜—˜›™———˜š™—•••Œz[C.! '0:BC>5*"?ŽŸ¦© ¤¦¦¦¦¦¦§¡  ¡¥§ª«©¡£¦¨¨§§§¨§¦¦§§¥¦§¨©©©©§¥£¤¥¨©¨§¦¥¥¦¥¤¤¥¦¥¤¥¥¤¢¢¡¤¥š’zm_UUTK@90!'/6>FKOSQOPRSQRTVWWVVWWVTSUTRPPQNGDA=70("  %,6CNUY]`bcdddb`^^_acdhntuwxz|„…„ƒ„…†…ld``dinrvz|ƒ‡‰‹Œ‘‘‹ŠŒŒŽŽŽŒ˜”0%2AKRTUUUUTTXZXYWTQQTWZ_fm|•š§´²£›—ŒŒ’‘Œ‹ŠŒ’’‘‘’’’’“••“’’“’‘’”›œš˜˜˜—––•’“™˜•—˜™›™—— ž€X&&!#,9EMNF9)  Š¢ ž¤¦¦§§¦¥£¢¢¡¤¥§©«©¤£¦¨¨§¦§¨§¥¥¦¦¦§©ª«¬¬¬§¥¤£§©¨¦¦§§¦¥¥¤¤¦§¦¦§¦¥£¢¢¤ž˜ph[QQOH>6+!.6=ELORSQNMPQQRTUWWVUUUTTSRQONMKE?;83-&! !#)3=GQX[]`bcbcdc`^]]_bdfhjnquvy}…†„ƒ„……ƒkc``chnsvz|ƒˆŠ‹ŒŒ‘‘ŽŠ‰Š‹Œ‹‹ŒŽŽŒ—3&/@KPRUXYYWY\\[ZXUSTWZ^bioxŒ—­±¥£™˜ŒŒ‘“‘ŽŒ‰‰Œ‘“”’‘“””““”””“‘‘•››˜————•””“‘˜–”–˜šžŸ“a9()/G\fdW@*#}“˜š›£¥¥¦§¦¤£¤¥¨ª¨©ªª¨¥¥§¨¦¥¥§©§¡Ÿ£¥¦¨ªªª«¬¬§¦¦§¨©§¥¥¨©¨¦¥¥¦§§§¦¦¦¤£¢¢ ˜–gbYPOMH@6(+6<BHLNOONMMOPPRSTVXWVTRRSQONLJGC>841,%! "(/5@LSX[[]bddbab`_^]]`begghknpsw}……„ƒ„……‚jb`bdinsvy}€‚†ˆŠŠ‹ŽŽŠˆ‰‹ŒŒ‹‹Œ˜Œ2%-?KPRUX[[Z\^^^\ZYZZ[]aekpz•¥«¡££Œ‹’’ŽŠ‰ŒŽŽŽ“”‘‘’“““’’“““’“–š›™˜—˜—•”””•›˜“’•—› ¡˜ˆwC&#/4Q{‹ƒ`D+!s‹¡¨ £¤¤¤§¥¤¦¨¨¨¨¨©ª¨¦¦¦§¨¦¤¥§¨§¢¢¡¥§©ªª©©ª©¨¨ª¨©©¨¦¥§¨¨§§§§¨¨§¦¦¦¥£££¤—”‘nfZQMHD>4$)7?DGJLMLLMNNOPQSTTVWXWTQQQNKHFEA=81,)&"!'2=DLTZ]^^`dffecba`_^_aceghhijlqw|„…………††ƒg``cejosvy~‚ƒ…‰‹ŒŽ‹‰Š‹Œ‹‹‹‹Ž˜Š* +>LSUVX\^^`a```^]^_^]afjoz“¤ Ÿ§Ÿ‰‹ŒŒ‹ŒŽ‘ŽŽ““‘’““’’’“••“‘ŽŽ’—˜™ššš™˜–••–™žœ””••——œ™uS."'Ca’¡¢•b@,1p­³¡££¢¢£¤¥«ª¨§§§§§£¤¥¥¥¦§¥¤¤¦§¢¢£§¨©©ª©¨¨¨§¨©©¨§§¦¥¥¥¥¦§¨¨¨¨§¦¥¥¥¤¤£©œ’‹lh^WOG@9/! )3;@EHKNNLKMOOOQRSSSTUVUSPOOLGCBA=82,(#"#'/9DJOTZ^``_`cdefedcccaabdeefhiiknsz~ƒ………†ˆ„f``beinrux}ƒ†‰Œ‹‰‰‹ŒŠŠ‹‹‹ŒŒš…#+?PWWVX\^^acbbcb`aba`cfkqzŠ’˜Ÿ™˜¡žŠ‹Š‹ŒŒŒŒŒŒŽ‘’“’‘‘’“’’““•——•’Ž‘•——™›››™––––˜š™—–•”•“”ŽO1"#)g„ª¯£˜cI/*d‡¯²¢¢£££££¦«ª¨§§¦¦¦¤£¤¥¥¥§§¦¤¤¦¥£¥¨¨§¨©ª©©©¨¨¨©¨¦¦¦¦¦¥¥¥¦§¨¨¨¦¥¥¤¤¤¤£¨ž…ig_ZSI>5)#/9AEEGJMOONMNNNOQQPQQRSUTQNNNKEAA>81+&$!#-6>GNQUZ^abbcddddeeddeecbcfgfegijklpw}€‚„†††‡…hb`bejmqvz~‚…‡‰‹ŽŠ‡…‡‹ŒŠŠ‰ŠŒŽœ‚-ARXWWY^``bcccedabddcdgmt{ˆ‘Ž’”—›•‹‹‰‰Š‹Ž’”•–—’Ž’‘’‘‘’“”•––••”‘’”••—™››š™™—••˜˜–•”“žz/&2PrŠµ³›[>/ $Z‚®±¢¡¤¨¨¦¤¥§§¦¦§§§¦¦¦§§¦¦¦¨§¥£¤¥¤¦¨§¦§©©©©©¨§¦¨¨¦¥¥¦§¨§¦¦¦¦§§¥£¤££¤¤££Ÿ”ˆnf^YSI>3%!&,6?FHHHKMNNNONLLNPPNNOQSUTPLKKID@>:3+&"!$0?HJMRVX\`bbddddddeeccddcbdghffghijjnsx}ƒ…†‡…ha_aeimrvz~‚…‡‡ŠŽŽŠ‡†ˆŒ‹ˆˆŠŒŽ‘•r.CRWWY[^_abbbdfecceffhkou|„ŠŠ“‘Ž‹‹ˆˆŠŒŽ‘“”––—”ŽŒ’“’‘‘“”••”’’“”“’’““–—™™™šš™”•—˜–”’¢œ}Y"Qr‰žº· “^?/$d¨¶¢£¥¨©ª¥¤¦§§§¨§¦¦¦§¨¨¦¥¥¦¦¥¢¤§¦¨©§¤¤¦¨§§¨¨¨§¨¨¦¥¥¦¨¨¨¨§§¦¦¦¤££££¥¥£¡¢šŠdd[WQF<2"'.37=DHJJJKKLLLNNKJKMNMMNNPRQOJGEC?<94+#! #.APUSSX\]_bccefeffeffdcefedfhihhhijjjmorz„‚„ˆˆ„}i`_aflptwzƒ…‡‰Œ‘‘Ž‹‰‰Œ‹‰ˆŠŒŽ”…X-APVY\]^^`a`adfeddegijlotyƒ…‡ŠŒŽŒŠˆˆ‰Ž’‘‘‘“–•””‘‹Ž’””’’”••“’‘‘“““‘‘’”—˜———™›››ššš—“‘™ŠP; e¨¯·²ŸŒ\A-$i} ³¦¤¤¦©©¦£¥¨ª©©¨§¥¦§©¨¦¤£¤¥¥£¤¨¨©ª¨¥¥¦¨§¥¥§¨©ª©§¥¥¦§¨¨§§§¦¥¥¥¤¤¤¥§¦£ž¢œ‰caZVOC8."%-37;?DGILKIHIJJMMJHHKMLLKKMLLJF@=<:61*# !)5ANWZYY\_abcdceffggfffddfhgffghijkkkkkkklqy~ƒ‡‡‡|f]^bhmrvwz‚„‡ŠŽ‘’’‘Œ‹‹ŒŒŒŒŽ˜vE,@PVX[[ZZ[]^`deeeefhjlmpux{~€ƒ†‡Š‹Š‡…„…‡ŽŽ“••ŽŽŽ‘“”’’“”“’“””””““““–˜™˜–—™››œœœš—““š“u,(<i”¤¨§­«”‚`D+!`xŸ²«¤¤¤§©§£¤¨©©©©¨¦§¨©¨¦¤£¤¥¥¥¦§¨©©©§§¨¨§¦¥¦¨©ª¨§¦¦¦¨©ª§¦©¨¦¥¦¦§§§§§¡¢£˜‰gbZTL@3)"!&,17<?BEGKNLHGHGFIKHEFJKJIHIHDCC@:652+$ #-=JOT[]^^^_bdddceghiihfeddfhhfeegjklmmmmljjlrz‚†„…cY^djnty{}‚…‰‘‘‘Ž‹‹ŒŽ‘“—d; )=MSUWXXZ[\\]_`acdefhlnqtwxz|„‰Šˆ…ƒ~†Ž““Š‹ŒŽŽ’‘’’’’‘‘’”–—–”“””–˜šš™—™›››œ›˜——¤œ‡_l†¢¨˜˜ ¢Œ‚hC(WsŸ­¦¤£¤¥§¦£¤¥¦¦¦¨ª««ªªª§¦¥¦¦¦¦¥¦¨¨§§¦§¨¨¨§¦§¨¨¨¦¦¦¦¦¨ª¨¦¦¨¨¦¦¦§¨¨¨§¤Ÿ£¡Žgc[RG;,$"$).059=ACDFIKJGGFDCEGFEEEFEDDEC>=>;730*! /@LRSW\_a`_`cdddcehghjhfecdfggfeefikkllmoollkox€ƒƒxm_Z`dhmrx{}‚†‹ŽŽŽ‹Š‹ŒŒŽŒ‘œ•F*'<JPSUUWY[[\]]^`bcbcgkmqvxxyy|…ˆ‰†ƒ€€ƒ‘‹ŠŒŽŽ’’‘‘’“•–——“’“”—™šš™—šœœœœ–“•—žŒgC&ƒœ¨¡—•— Ž‚b=&\sš§œŸ¤¥¦¦¥¥£¤¥¥¦§ª«ª©©©§¥¥¥¦¦§¦§©§¤¤¥¦§¨©¨¦¦¨©¨£¤¥¦¦§§¦¥¥¦§¦¥¥¦§¨§¤ž™œžzhc\QC5& #'.36;=?CEEEEFFGGFDCDDEEB@@?==??:89742,%)?OTVWY]`bcccdeefghhhikkigefhhhggfgjkllkmpponmow~€lc\]bfjnrw|€ƒ‡Œ‹‹ŒŽŽŽ¡”"';IOTVVY[\\^_^^^abbdhjjox||ywz€„‰‰†ƒ€„““‘Ž‡…ˆ““’“•–—–“’“”–—˜˜——™›™–”’‘“˜ŸŒu.Amš¥¥ž•••šŽZ9$d|˜¡™Ÿ¢¥§¦¥¤££¤¤¥¨©ª©¨¨¨¥¤£¥¥§©¨§§¦£¢¤§§¦§§¦¥§©¨¥¤¥¦¥¥¦¦¥£¤¥¦¥¤¥¥¦§¥ ˜˜œ•|da\P=,!$*057;=?BDDC@@ABEFCBAAAA?<;9889976630.(!"0BPWYZZ[]`bdedcdefhhggiklkiggijjigghijkkklnnnonou{}{eZX\beimqu{‚‡Œ‘’’’ŽŽŽ¤˜';HOTWXZ\[\^^]\\_adgjjjoyƒ‚‚‡Š‹…~}~‚…ŽŽŽ‘‘’‘‹ƒ„‰’“•–––•“””•–•”““—–‘’‘’’— €e"yŽ£¯¥Ÿš–—“‹\>#aƒ¤¥£¢¤¨§¤¤££¢¢£¦©©¨¨§§¥¤£¦§¨©¨¦¥ Ÿ¡¤¨¨¦¦¨¨¦¦¨§¥¤¦¦¥¤§§¥¤¤¥¦¦¥¥¤£¥¦¨ž™˜~h`ZM3$!#(/378;=>@BCA><::?A?==<::;;864332111-(&"!(6EQX[\]]]_bdeeeccdfghghiklljiijjjhghjjjklmmmmnpppsuus^ST[beinru{ƒ„ˆ‘“”“ŒŒŽŽŒ¦š(:GPTWZ]^^^^]]]^_acgjjjow€…Š˜ ›‘‘„€~|}€„‡Ž‘“””’Œ‰ƒ†ŠŽŽ’•”””–—˜——–“‘‘Ž•–‘’“”•”¦šfE "=•ŸŸ¥Ÿžœ¢ž‘„Y4!T| ©¯¨¦§©§¤¢£££¢£¤¥¥¤¥¦¦¦¦¨¨ªªªª¨¤¡ ¡£¨§¥¦¨ª¨¦¦§¦¦§§¤¥§§¥¥¦§¨¨¦¤¥¤¤¥¨§›“„{laXG*"',13358;;;<<:86569;:8765677410.+)())%! "-=IPVZ[[]^_adefedccddfghikkkjiijiijhgikkklnnmjlopqqpnkcWRU\beinsw{€ƒ…ˆŒ‘’’ŒŠŠ‹ŽŒŠœƒ ):IRTVZ\]\]]\[]^^^aehijpw‹Ž›¬«˜’„{{}€„‡‹ŽŽ‘““‘Œ‹’“’‘’•™™™˜•‘‘Œ›œ“‘“–—¢‘E,)j¢© žžœ£¤“‚L/Jt ª¬§§¨¨©¡¡£¥©«¨¥¥¤£¤¥§§§§¨©©©ª§¤£¢¡¤§§¦¦§©ª¦¦§¨¨¨§¦¦§§¦¦§§¨©§¥¦¨¥¤§«¡’~wjaWC&#+13202678786433467632222320,*)'%"!  ,>LRVY[\]`abdffgeddeeegijklmlkkkkjjkihilmmmnmkhkopstme_XRQV[afkpuy}„†‰‘Šˆ‰ŒŽŽŒŒp'9KSTUY[[[\[[[\]^_aefgipw‘’¦« ”„~yy|„‡ŠŽ’‘ŽŽ‘’Ž’’‘“’‘”˜™™˜–“’”– ž—™›š¢¡–|#q“¢¢›œœœœ› ¡‹t<0Mx¤®«¦§¥  ¡¡¥ª¬¬ª§¦¥¥¦¦§¨¨§§¨¨¨§¥¤¥¥©§§§§¦¦§££¥¦§§§§§§¨¨¨¨¨©©©¨§§§£¢£¥£–wg\R=#%,11000222221/00143/,+,-.,*&#""  +9GQVYZ[]_aabdeeeeeefffhjkklnnmmmlkklljjkmmllkihjoqsqeYQNMPV]chlpuz~‚„†ŠŒŽŒˆ‡‰‹ŽŒŒ’‹e&9KSSTWZ[Z[ZXY[\]_adddgnu~’–™¢¤« ’ƒ€xw|ƒ†‡ˆŠŠŒŽ’“’Ž’’““ŽŽ‘”——––•””–š›š›œ£¦›‚c,Z¡´¨Ÿ›œœœ £qG.QxŸ­¨¤¤£žŸŸ£¥¨¬«¨§¦¥¥¦¥¦©©§§¦¦¦¦¦¥¦¨«¨§¦§§¦§¥¢£¤¥¥¥¦¦¦¦¨©©©ªª¨§¦¦¦£¡¢ ›—‰{gXI6# ',/01100..,+***,-.+'$$$&&# .@KRW[\\]_acbcefeedefffgikkkmppnnnonnnnmllmnlkkjiknomgYLGGJPY`ejosw{ƒ…‡‰ŒŒ‹ŒŠ†…‡‰Œ‘’Œ–}X%8HPQSVZ\\\[YZ\]]]`bbcekqyš Ÿ ¥§—wu{ƒƒƒ„…ˆŠŒŽŽ’”•“ŽŒŽ‘‘’Ž–˜—–••””••™ššš ››Z7d…«µ­£žœœœžž¢¥sG-"Ws˜ª£££££ªª¦¥¦©¨¦¦¦¥¤¤¤¥¨¨§¦¥¥¦§¨©ªª©¨¦¥¦¥¤¥¦¤¤¥¥¥¥¥¥¥¥¦©©©ªª§¤¤¥¦¥¤¤Ž†vfWC0#!'*+-00-,,*($"""#$$!,?MUY[]]^__acccdeeeceeefgjkjjmppnlmoooooonmnnnmmlllkhaTGACFKQZ`dinrux|„„†‰‰‰ŠŒ‹ˆ…„†Š““’‘•uM%7FMPRUYZ[\[YYY[[Z\^_achotŸª¢ ¤¥˜ƒ€rsx|€‚„†ŠŽŽ‘“”“‘ŽŽŽŽŽ–š˜–––•”““•™šš˜’’…8•¥¯ª¥ œ››¦£ˆd?**d{ ²¨¤¥¦¦©©¨¥¤¥¦¥¦§¦¥¥¥¦§§¦¦¥¦¦¥¨ªª©§¦¦¥¥¤££¥¦¥¦¦¦¦¦§§¦¥¦§§¨§¥¡£¥¥¥¦§’ŒzpgXB,!!'*+,,+)(&%# ,=IRZ^^]^`bacggeddffeeffgjklkkmppollnoopppppponnnmmkf]N?88>FLT^cejortw{‚ƒ…‰Š‰‹‹Šˆ……ˆŒ’”“’–lI%5CMOPRSTWYYWVVYZXXXZ\]bjvŒŸ²¯£­¢’}tptx{~€‚ƒˆŒŽŒ‘‘‘‘’‘ŽŽŽŒ–š—•””””““•˜š™•‡o/^“™›—•š›œœ›šª¥Q6&0r‡¦¶¬©§¨¨¨©§¥£¤¥¤¥§§¦¦¦¦¦¦¦§§¨§¥§©©§¥¤¥¥¤¤¤£¤¥¥¦§§¨§¨©©¦¤¥¦§¥£¢£¥¤¡¢¥¤œŠsog[D+!!%()(%#"" ,<GOV[]]]]adddggeccegffgfgjkllmnooomlnoopoopqqpnopmke^L<214<ENV_cfkpsux|‚„‡Š‹ŒŒ‹ˆˆŠ“”“’—œf9$0=FIJJKMQSQQSUVUSRQSUVZcu‰›¦©¬ªŸŽyysoqux{|~€‡ŒŒŠ‹‘‘‘‘Ž’•—“’“””•—ššœ‘tQg†¦«›™—‘•›žžœ™¤¤|O2$/oˆ¤²¬§§§§§¨§¥¥¥¥¤¥§¦¥¦¦¥¥¥¦§¨©§¥¦¨§¦¥¥¦¦¦¦¥¥¥¤¤¥¥¦¨§§¨©¨¦¤¥¦¥¤£££¢  ¢¨™„pmg\D* "$%$,@KPSX[]_``bdeeggeccefggffhkkkmonnoponoppponoqsroonib]D6,)-3<GPX_dimpsw|‚†ˆ‰‹ŽŽŽŽŒ‰‰‹“”““’ž£X("+38;=?ADHIIJMOMKIHGGJLPVcw‡’–šœwuropsvxy{}€‡Œ‘ŽŠ‰Š‹‹Œ‘‘’““‘’“””“‘“”””–œ £•[5Š©®ž™”‘›ž  ¡¡’kR.!l‰¢«¥¦¦¦¥¦¨ªª«¨¦¦¦¦£¡£¤¤¥§§§¨©¨¦§¨¨§§¦¦§©¨¦¥¥¥¤¤¤¥§¦¥¤¦¨§££¤¥¤¤¢¢¢¡ ¡¤•†tkeZA) !!,?KOQTX\^_`abbcdedccbcdfhhgikkkmoonoponnnppnmnqtromhaK4.(%'.6?KSX^ejmorw|ƒˆ‹‹ŒŒ‹‹Š‰‰‹Œ’’“”“¢¤H $(*,.148;<=?A@><;:9:=@CHMUjy†‰Šƒwsqnnqstvxz}…‰ŒŒŠ‰‰‹Ž‘’”•”“’““”””“‘’”•”“’Ÿ¢¡”@ :–¥§ª¢˜™  ¡ ž¡›ƒ_P2#v‘¦«¥¥¥¥¤¥­¬¬ª¨¨§¦¥£¢¤¤¤¦©¨¨ªª©¨©©¨§§§¦¦¨¨¥¤¥¤¢£¤¤¦¦¥¤¥¨¨¤¢£¤¦¥£¢£¢¡ ¡–ŒwkcW?) ! '5BLPRSV[___`abbbcdccdcbbeiiiklkknqqqrrqonnpqonoprpkkaL,#&1:DNU[ahmopsv{„‰ŒŒŒŠˆ…„…‡‰Š’‘’”“§£:!""#%'*,-/121/.-,-/1469?BLR_morrsqomlmoqrux|ƒˆˆŒŠŠŒ‘•–••••––•”‘‘•––•““  —„&Iož¨ª¥¢ŸŸŸ ¡ ž™Ÿ¢‹bM/#2€—­µ¨§¦¦¤¢®®«ª¨§¦¥¤£¤¥¥¥§©©ª««ªªªª©¨¨§¥¤¥¥£¤¥¤£¤¥¦¦§¦¦§©¨£¡¢¤¥¤¢¡££¡ŸŸ’ˆtiaT?,! #$$#""! )4>FLPRSTX\__^_`bbbbcbcdcbadgikmljknpqqqrronoqrpoppokfO5, (2;ENU\aglpqtvy~ƒˆŠŒŽŒŠˆ„‚ƒ†ŠŽ‘“’¥Ÿ,!$$##$%$##$%'+.02468;9HYdkmnomkhimpqrvz‰‡‰ŽŒ‹ŒŒŒŒŽ–———–•••”’‘’–™™˜•“ œ‡swŒ§¦¡ŸŸ   ¡¡žšž ]F*9™´»¨¨¨¨¦¥§§¨ª§¦¦¦¦¦¦¦¦¦§©ªªª«¬­¬ª©ªª©¥¤¤¤££¤¥¦¦¨¨©©§§¨ª©¤ ¤¥¥¤¢¢££ šœ…slaSA2%"$&%%%#!)6@FIMPRSTVY]`_^_`abbaaabcdcdegikkkknpqppqssqqrrqooomhfO-"#-5>HPX^aekqsuvw{…ˆŒŒ‹‰†‚‚†‹Ž‘’‘£š# """! #(.35654216EYekllmlkiinqrtvz~‚„‰‹ŠŠ‹ŠŠŠŒ”–––•“’””““”–˜™™—“ —oQ!‘—’¡œŸž ¡ ¡¥‰J<%?‚¶´§¨©¨§¦¥£¡¥¥¥§¨¨¨¨¨§§¨ªª©©ª­®¬©§¨ª©¥¥¥£¢£¤¦§ª¬«ª©¨§¨¨¨§¥¥¦¦¤£¢¤¦¤˜”‡uldWF6)!!#%%%&&!%1=EKNOPRSUUWY\__^`aabaaaabdeffghjjiikoqqpoopqrrrrolljgU:(39AKRX]adhnrvwwx~„ˆ‹Ž‹ŠŠˆ…ƒ„‰Ž‘’’£˜"#"$# '.5:>>;7422?Ucjlmljihinpruwy{~‰ŽŠˆ‡ˆˆˆŠ””••”‘’”••–˜™˜™™š˜œL)Ož§žžœ››œ››ŸŸ¢¨›…G4!&M…²­¤¥§§¦¦¤£¢£¤¥§©©©©ªªªª«ªª©©«¬ª¦¥¦¨©¨§¥££££¥¥¦«¬«¨§¨§§§§¦¦¦¦¥££¥©°›Œ„rjcZJ7%!#%$$%#!-:CINQRQRTUVWWY[^_abbbbbbbbcefgghijjhilprqpooopqqpolgg^H++8=FOUZ_bfilpuwww}„‰‹ŒŠ‰‰ˆ†„…Œ’‘‘’’‘Žœ˜!#%%%&$$-5;BGHE@;86?Uemqqolihjmmotwxz~‚‰‘ŒŠ‡†‡ˆ‡‰‘’”–”‘‘“•––—™™—–—¡¢–$Px¥¬œšœžœ›ššž¦¨•zA-2U…œ®©¡¢¥¥¥¤¤£¢¢£¥¦¦§¨©ªªª©¨§¨ªª©©¨¦¦¦¦§©¨¥¤¥¥¤¤¤¤¢¤¦¦§¨§¦¦¦¤£¤¤¤¢£¥ª¯›Š}zlfaYL7!#""!#-8AHMPRSSSUVVWXXY[^_aaaabcdcbcdefgghiihilnppooooonmljeaI)%,9@ISX\_cgjlosuuv|…Š‹‹‹‰‰‰‰‡„…Ž‘’’““™™!$(*))**'! #*29@FJMMIA;8?Vfptsqmjiklknrtwzƒ‡‰‰ˆ†…†ˆ‰‡†ˆŽ‘”–•“”•–•”•——•“”¨¥„gl‹¨¨™˜šŸ ¡Ÿ™™œŸ«§‹l7/6Q‡ž°§œ §¦¦¥¤¤¢¡£¦¥¥§©©¨§¥£¥¦§«±¬¨§§¨¨§§¨¨§¦§§¦¥¤¤¤¤¥¦¨ª¨§§§¥££¤£¡¡¤©­™Œƒyeb_YN7+8AHLOQRSUTTVWWWYY[]_`aaaabddcbcceghhiiiiklmnppooonljhh\F%$1<DNV[^cgjlnpqpqu}†ŠŠŠ‰ˆ‰Š‰‡„†Œ‘’’““‘Ž™›"(,/.--,*'%&),29>DFHMQNE=:AVfqutqolhhhiknquy}‚ƒ…†………‡‰‰‡†ˆ‰””””–—–”“”––•”“¥a=„˜¦˜—™Ÿ¡ ž›šœ­¥a?+<ZŠ®¤Ÿž¥¦¦¥¤¤¢¡£¦¥¤¦©©§¤££¢§©ª­ ¤¦§©ªªª©§¦§¨©¨§¥¥¥¦§§§§¦¦¨¨¥¢¢£¢¡¡£©¯™Ž‰y`^^ZO5(4?GKMNPPQRTTTUUWXYYZ\___abaacccbccdfgghgghkmmnopomllie`K+# +7@IPV\`eiklnonmov~†‰ˆ‡†‡ˆˆ‡†…†Œ‘’““’šœ( $*/21/...-/0237=CFGIMQNE>;BUcotqonlgbadhknsvy~ƒ…„…‡ˆ‰ˆ†‡ˆŠ‘’“”–˜˜–•“–˜˜˜™¦™H!Q—£¢›››Ÿ¡ Ÿžœœ›ª¦€`=' Ge‰›¯¨ž¡¤¤£¢¤£¡§§¦¤¦¨ª§¥¥¥¤¨ª¨¤¢§¨¨¨ª©§¦§©©©§¥¤¦¨¨¦¥¥¥¦§©¤¡¡¢£¢Ÿž«¬–Š}a[[XM2#0:AHNPQQQQQRTTTTUWYYYY\_^_```abcccccbcdefffilmmmnonkiff[F%%/8@HQW^chlnonlllov†‡…„ƒ„…†……†ˆŒ’“”““‘œ4&%+032..//15799;?DEFIKMIA;9@Ranrommld^]cilnqtx|ƒ„…†‡†…„„†‰ŒŽ‘”——˜˜—™›šš§¢“(Bz§ª›žžžŸžžœ›§¢|_9#$MmŠ´±§¥¤¥¤¢¢£¦¦§§¥¤¥§¨§§¨©§©©§¥¤¡«©©¨§©ª¨§¨©©¨¦¤£¡¨¨¥¤§§§§¤¡Ÿ¡£¤£Ÿœœ™‹fZWUM5"*4?FHJNQSTSSSSTTSTUVWWXX[]]]]]^`bcdedddccdefgijjkkmnlhc\@%$'2:AJRW^filppmiilpw€…†ƒ‚‚‚„…†‡‰Œ“”””“’£@%+0330---/169:=BEDBDGGC<75>Q`lpmkjh`\_eilnpsw{~ƒ……ƒ~€ƒ†ŠŽŽ‘•—˜™›œ›ž¤—Šq‘¬§˜šžŸŸŸœœžž œyV1Ms“Ÿ¯¦¥¥¥¦¥££¦ª¨¨§¦¦§¨¨§©«ª¨¨¨¦¦¦§ªª©¨§¨©©¨¨¨¥¤¥¥¥§««¬ª©¨¨¨¡ž ¢£¤¥Ÿ›’‘‰}cYURM:*4;BIMNOPSTTSRQRTSSSTTTUVVY\[[\\^_aceecceeccegiihhhijiedX= *8BHOV[ahkmonkghmrz€„…„ƒ‚‚ƒ„‡Š‹ŒŽ“””””’¢›J!#*0684.+*))-28<AC@<;=?<621=Rcorpmjgb_behkmnqtw{‚…„€|{~ƒ†ˆ‹ŽŒŒŒŒŒ”–™šš™­£…rŽ¡«¥–šœ¡¡¡Ÿžž¡¤˜zS*!Sz ¦¬¤££¥¥¥£¤¥§§¤¥§¨©©§¦©«ª¨¦¥¦¨©©©¨¥§¨¨¨¨¨§¦£¢¥§¨©«¬«ª¨¦§¨©¤¢£¤£¡  §¦”†€yaXVTO?&/8?DHLNPQRSSRRPOOQSRSSSTTTTW\]\[[]_`bdcbbefdcdghgfhihfc`G+!#.=HNS[_dhjkkigefkr}‚„……ƒ‚„„„‡‹ŒŽ‘••”””‘£ŸG"*18;60+($!$*18=>;75564/./<Ugqsqnkgb`bdefiloqtx}‚ƒ‚~|{}„…‡ŠŒŒŽŽŽ’”–˜˜˜« sT“¦§¢œ›šŸ¦¢Ÿžžœ¢¤›’nM&)]~¤­©¤¢¢¤¤¤¤¥¥¤¤¤¤¦ªª«¨¥¥«ª¨§§¨©©©¨§¦¥¦¦§©©§¥¥¥¦¨©¨ª©¨¨§¦¦§¨¥¢¢£¢¡  ¡©–}}veXUQL?% +6<AEHKNOOPOPPQRPNNOQRRRSTTTTW\^\[[]^`bddccefdcfhhfeghd\WB"#-9EMRX^dikllkhedhnu…‡‡„€„……ˆŠŒ“–—–•”¦ž) (/562,'#!(/5630-++(%'-=Wirtqpokecdcaabgjlprw~€€~ƒ„„‡‰‹Ž”“’’’““•––¥˜X*)Xš¨Ÿžžœš•—˜šœžŸžœž ˜‰YH#0by «£¡Ÿ ¢¤¥¥¦¥¤¤¤¤¥¦§©¨¥¤§¨¨¨©ª§¦¦¦¦§¦¥¥§ª«©¥¥¦§¦¦¥¤ ¤§§§¥¥¥¤¢¡£¤£¢Ÿ›¤›…~teZVPI>+#-7@DFHKNPNLKJKMOQPOOOPQQRRRRRSVZ\[YZ[\_cffeeggfehjhdcc_Y< !+6AJPV[`gkmmmlhedhpw€‡ŠŠ†‚‚„†‡ˆŠ”•——–”’£•%*./,'$ $)+)&$" )=Wirsooomheeb^\\aefhmty}}~‚ƒ„‡‰‹Ž’•”’‘‘“—˜œŽ3T€§¬œžœ™˜™šššŸŸ¡•†WA%5cvœ©Ÿžž ¥¥¦¦¦¦§¦¤¤¥§¨§¦¦§§§§¨¨¦¥¥¥¦§¨¦¥§ª«¬£¥¦§§§¦¤£¥§§¦¥££¤£¡¢¤¤¢žœ£œ‹zqf[VOG=0#(3=DHJKMPSSOKHGIKMNMMNNOQQQQQQQQTWXXXXZ[^ceedefgfgijgdaZS:%'3@JPVZ]cjnppolgddiqx€†Š‹‡„€~ƒ‡ˆˆŠ“”–—–••¦ "&)*'# &=Ufpqnnpoljhd^ZY_backsx}~~„………†ˆŠ‹Ž“•”’’”›•‡$v˜¯«œœ››œœžž£¡’€Q8  ;mƒœ¦ŸžŸ¢¤¥¥¦ª¬©¥¤¥¦¦¦§§¨¨¦¤¦¨¨§§¦¦¦§¥¥¦¨ª®©¦¦¨§§¦¥¥¦§§¦¥££¥¤¢¢¤¥¤£§£œŽrlcXQKD<2'%.6>EJMMOQSVVQLIJKKLLKKLKLOPPOPQQQRTUWXXZ\`eecbceffghhea^E&#-:GOTY]_flprqplfdfksz„‡ˆ†„~~…‡‡‰Ž’“–˜—••¥Œ !#""%&"&=Udnqonppnkhc]XX[_`dlsx}~€…‰‰ˆŠ‹‹‹Œ“’’Ž“› €†£®¡œœœœœœœ›œ x@,#>nŠš¢¤¡¡ Ÿ¢¥¤££®¬¨§¦¥¤££¥§§§¥Ÿ£«©©¨§¦¦¥¥¦§§¨¯ª¦¨¨¦¦§§¦¥¦§§¦¥¥¦¦¥¤¦¦¦¦¦œ‘kg^SLF@:0&!+5:?DHLOQRSRSSQLIJKIIIIIIIKMNNMNOQQPQSVY\^_beecbbdgffeb\WB'&.7DOSV[_cinqrqnlhfiov{‚„„ƒ„‚€~‚†ˆ‹’”–——–”¥Š"$&%"""'>Wfptsqqqnid`[VVY]bgmty|}|}„ˆˆ‡‰Š‹Š‹Ž“““’’¤¤`)4Ž¥£œ˜š›™šžœœ›œœsE+(Bk‡•š¡¢¢¡¡¦ª¥ž— ¦¦§§¥£¢¡¢¦¥¥¤¢ ¤§§§¨¨§¦¦©¨¥¤¥¤¥¦¦¥¥§§¦¤¤¥¨¨§¦§¨¨©ª¨§§¡˜œ”daZPIB:0'! &07=@CGKNPQQQOMMLIGHHFEEGHGILLKKLLMNNNOSW[_``abccbacgfdaWC)#%.6?IQUX^bdinrtrnkiilqwz{~€‚ƒƒ‚€€ƒ‡‹’”–––•“¦‡$')'$!!"&?Zjtxwutrlf`\VRSV]dinty|{z{€„…„…ˆŒŒŽ”–•“’§¦oF;[–¥›˜——–››™”–¡ŸŸ ¡œ…h<$(Du˜£¢££¤¨ª¤—›™¡¥¦§¦¤£¢¢£¤¤¤££§©©¨©ª©©©ª¨¥¤¤¤¤¦¦¦¨©ª©¨¥¦¨©©§¨¨¨®¨¢£¢ —œ™m`ZRJB4'!")3<AEGILOPPOOONLIGFFGFECACEEGIIHILLLKLMPSVY^aaa``bbbbcb]YF-%-6>GOUY]befiosusoljkouxyxz}ƒ„„ƒ‚€‚ˆŒ‘“”•–•“¥&)-+&# !#$!%@^mvzywvsld_[UQQSU]cjqw{|{|~‚ƒ‚ƒŠŒ”™™™•‹’’©œO-YvžªŸœ™—˜œ›š¢£¡¢£¥©šw]30Q~“¡¤¡¡¢£¥§©ª¥¡£¦§§§¦¦¥¥¤££¥¦¥¦¬¯«©©©ªªª©¨§§§¦¦¦¦¥¦¨©ª©§¦¦¨©¨¨¨§¥¡¡¢£§ ›—rc]VM@." $+4<BHKKLNONMKKKMMHDDEEDCCA@ABCFFFIKLJIIKMPSVZ^__^_`aa`^XN3& %,3;ENSX\afggkpsutpnlmquxwtuy}€‚}‡Œ‘“”••“¥‰&)..+'%##!"&&"$Bfovxyxvslgc^XSRQPU^fntz}}~~€€‚‡‹“˜˜™™’‘’“¤’,!gƒž¬Ÿ¢ŸŸœœžž ¡¡  ¤¦—sW)3X}”©°¥££¤¥§©©©§¨©¨¨§¦¥¦¦¦¥¥¦§¦¦¨®¬¨§§¨¨¨¨¨¨¨¦¦§§¦¥¥§©©©¨§¦§©©¨§¥£¢¢£¤¨§’se`WJ8& %.6=AEJOONNMLKIHHIIFCBCCBAAB@??@CEEGJJGGGHJNRTW[]^^^__]YQI2 %-4:AKRV[`eiijnrtttrpooquwvsruxyz|€~}€‡Œ‘’“”“˜ '*/21.,,+($ #''""@hsuxxwurnkhc[WRNKNW`gnv{}€€€€‚‡ŠŒŽ“™—””’‘•ž‹ uŠ–™žŸžžŸ   ¡¡œ¡¢oW$5[vŒ«³££¤¥¤¥¦§§¦¥¥§§¦¥¤¤¥§©««§¦£¡Ÿ£¥¥¦§§§¨©©§¥¥§§¦¥¥§¨§¦¦¦¦§©¨¦¦¥¥¥¥¥¤¥§œwh`TB.)4;?CGKOONNLJHGFEDCCBA?@@??A@??@CDCDFDBCCCFKNPRVZ]^^^ZTJ:(!$*28>FNTX]bfijlqttstsrqqrtwvrprvwwy}~‡‹Ž‘’“”“—˜u)-3678764/)#!%('"!:gpvzywtqnlib[WQKGKW_dltz|}~ƒ†ˆˆˆ”“‘’’‘•‘‚‘ •–—˜œœž  ŸŸ žžŸ˜„eP#6Ws‰®­¤¤¤¤¤¤¥¦¥¤££¦§¥¤¤¤¤¦ª««¤¢¢¢ £¥¦§§¦¦¨¨¨¥¥§¨¨§¤¥§§¦¥¦¦¦§¨¦¥¦¦¦¦§¦¤£¤™ˆni_M5#,8>BFKNONLKJGECB@???>>=<???@??@@BA?>><;<=>AFIKNQTVXXWRE4##'*/7>EMSW[aehkmotusrssrstuuwvsqrvyz{}€€‚‡‹’”•”“”o"+07:=@B@;5.&! $'*(# 6csx|{ywsolhaYTMFFKT[bjrxz{|}}~€ƒ…†‡‰‹‘“‘‘’•š{c']¦®¥™˜™œœš›Ÿ¢¢¡ŸŸ¡¤ŸŒuSA#:Q›µ¨¢¢¢¢£¤¦§¦¥¥¤¦¥¤¤¦¤¡ Ÿ¢¡ž¡£¤¤¦©©¨¦¥§¨§¥¥¨©¨¦£¥§¦¥¥¥¦¦¦¦¥¥¦¦¥¦¦¤¡¢§™„gi_H(-8>CGLNNKIGEDB?>=<;;::::<==;9;==>=9787668;=@BDGIJKKID6'#&+.4;BIPVZ]cgjknquvtqrsstvwwvwtrrvxz{}€€‚‡‹“””•—”‰n#).7>EIJHB;5-&$%(*($!=ar}|zwrnh_VQHCEJOU]hrwz{|}|}€‚„…†‰Œ‘““““™¥uD@t¤¯™™—˜›œ™™Ÿ¡£ žŸ ¥ž†nP2#?Cˆ£¬¦£¢¡¡¢¤¦§¥¥¦§§¦£¥¦¤¡ Ÿ¤£ ž ¦¦¦§¨©¨¦¤¦¨§¥¥§¨¨§¥¥¦¦¥¥¦§¨§¦¤¤¥¥¤¦¦£ ¡«œ‹pl`F!!-6?EILNKHFCA@?<::98766779:855789:953554359:;<=>?>:60&$),05<BHNTY]`dhjlnruwurruvvwxxxwurrtwy{}~‡‹Ž‘“”””—•Šl!'.8CNRPLF?92+'')*($!>bsƒƒ€|wsojbVOHDEHJNXfqvz|}}|~€‚ƒ„‡Š‘““““ª§o3b†›¦˜—•–š›š›žŸŸžœ›š¡˜€oL,F]’ œ£££¢¡¢£¤¤££¥§¨©££¦¢ ¡¤¨©¦£¥¦¦¦¦§¨§¥¤¦§§¦¥¥¦¨§¥¦§§§¦§¨¨§¦¤££¤¥¦¦£¡¢£˜‘~o_C$/6>EGIIE@?=::97799874322476346788842343235544320+$$*/15;AFMSX[^adgjlpruxwtuwxxwxxyyvrppruy{yz|‡‹Ž“”““’–…g)/:FU\XQIB<60+*+,*%  >at‡…†ƒ}vspkdYPJEEEEJUcmsx{{|}‚…ˆŒ‘‘§ Nœž˜˜–”š››œžŸ›››˜•›’|oF+ Nsž¥ž¡¢£¢¢¢¢¢¢¡¢¥§¨°¡£¡ ¢¤¦¦¥¤¥¦¥¤¦¨©§¤¤¥¥¤¥¥¤¥¦¦¥¦§©©¨§¨§¦¥¥£¢£¦¥£££ –““„p]?%09@EFEC>987564258::9521025425788873100///10.*&#")068<AFMRX]`bdehlosstxxvxyyyxwy{{xuqopswyvv|‚‡‹Ž“”“’‘—†c*0:EQYVLB=<951.-.-)$=`s‡„†ƒ}wtqmh_UNHDA@FQ^houyy|‚ƒ†‰ŒŽŒž“*•¦•—˜™››œœœœžœž›š –|f;#'Qt¢¨£¡¡¢££¤¤¢¡¡¢¥¦©£œŸ ŸŸ¡£¤¥¥¤£££¤¦¨¨¦¥¥¥¤£¤¥¤£¤¥¦¦¨©¨§¦¦¦¥¥¥¤¢£¥¥£¤£ —”–†mY<&1;ADD@<744567547:<=;732/.//034666420,))**+*% !'-28<AHMQVZ_acegjmqtstwxwz{z{ywx|}{vsrqruvstz€„ˆ’””“‘˜ˆ`)/8AKOK@8579740/12/+% =^n€€‚|wtqojbYQJC?=BMWbkrx{~€‚‚‚„ˆŠ‹Ž‘‘‘‘— Š'—¨“•š›œœ›››œžžŸ¢¡•xY-4Zt£ª¤¡¡¢££££¡¡¢¢£¤¤¡ ŸŸŸ¡¢¡¢¥¦¤¢¢£¥¦§§¦¥¥¥¤¤¥¥£¢£¤¦§¨§¦¥¤¥¦¦¦¦¥¥¥¥¤£¤¤£ž˜—„kZ;'5=@A?;623458988<=>?>:640+)*+.0221../,'&&$!"+036;AGOTWZ]acehjkosuttuwz||{||wv{}{xwwvtrrqsx„ˆ’”””“•†]&*18<<6.((,010-.2441+%#<_ny}{vsqqog^VMD>;@IS]gow|€€€‚†‰ŠŽ’“’“™{7—ª—™žœœœ›˜••œŸš™¢¦—ˆpQ$#=h¦¬ ¡¢£¢ ŸžŸ¡££¡¢£¢¢¡ ¡££ Ÿ£¦¥¢¡£¦¦¥¦¦¥¤££¥¦¥£¢¢£¤¦§¦¤£¤¥§§§¦¥¥¥¦¥¥¥¤££˜s^8%4::976337:;<>>>@AAA?:51+'$#$&)+,*'')(#" (1689?FMSWZ]_cdfilosvwuttw{}|{|}yx{||{zywrnmmpv}…‹’””“’–ž€U"'-0/*#$'))+15760)$&D_q{|}}zvqpqpkaWNB;9=GQ[eny{~~}}‡Š’“’–—‰a;\˜¬˜› Ÿžœ›œ›™’‘›Ÿ™–Ÿ¥}kO(5s‰¦«Ÿ¡¢¢ ŸŸŸ ¢¤£¢¡¢¢£££¤¥¤ ž¡¤¤¢¢¤¦§¦¥¥£¡ ¢¤¥¤¤£¢¡¢¦§¦¤¤¤¥¦¥¥¦¥¤¤¥¥¥¥¤¢¡œŒ‚}b7!05545889?CDEFFEEEDB>82,%"!$%#!! '/7<>?ELPVZ]`bdfhlorvxxwvuvz|}||}{z{|~~}ytmgehmt|‰Ž‘””“’•ž}R'$)+' #&)-154/*&'D`s~}}|xqnoomdYNB:8;FPZcksz{|{yxz|€ƒ‹˜švG\r“ž”—ŸŸš›ž”˜š˜—œ„uaD!-A}§¯¥¤£¢  ¢¢¢¢££¢¡¢££¤¤¤¥¤ Ÿ ¢££££¤¥¦¥¤£¡¡£¤£¤¥¤¡  ¢¥¤¤¥¥¥¥¤¥¦¦¥¤£¤¤¤¢žž¡—ˆe9*467;ADEFGHHHHHGGC?:3-& $-4;?ADKPSW\_adffhloqtvyz{zyy|}}||}}||~~}xofa`dkry‡‘’’””“‘ ~P&"&&#!%(+--*(($'C`r~~}||xplmlje\RE;7:DOZckqxyxvttwzˆ Ÿa6j„™ž•˜›ž™™¡”—™˜–›”|oW8,Hx•±¶¥¦¤¢¡¡¢¢  ¡¢¢¡¢¤¤¤¥¦¥¤¢  ¡¤¤¤£¢¢¤¤¤¤¤¤¦¦¤¢¦¤£¢¢£¤£¢§¥¥¤¤¥¦§§¥¤££¤£¢›››‚f;(4:?DILMLLKIHFFFD@<60(!#-5;@CEIPTX\`acgiijlprtwz|}}|{|~~}~}|}~|uia[\bjs{‡‘““””’” {O% #"!"#$#!"&'$!! 'C`q{}|}yroolhe`YK?:;AJXbjqxyvusuy|„‹ŽŒ¦œ?{•§§™™šœ›š˜™œœ–”š›š—œ‘zoP,:Ktš¶®¥¥¥¤£¢¡ œŸŸ¢££¢££¢¥¦¦¦¥¢£¦¨§§¦£¢¢¢¢£¤¦§¨ ž£££¤¥¥£££¤¥¤¤§¤ž¢¦¦¥¤¤¤£¥¡Š‚gA!$3>FILNOOOLHDAAA@<83+##.5;?BEGLRW[_abehjlmosuvx|~~}}}~€€~}|zy{|zud\Y\dlt}ˆŽ’“”“‘’›wN& ##!#''%""##" (Cbq€}||yurqniec]PD=;<CS`iqxzxvuwz}ƒŽ˜’Œž”.Š © ›™™šš———››ššž›ž£’ujD("?Yœ¬¦£¤¤¤¤¤¤¢žž¡¢££¢¡¡¢¤¦¦§¦¥§¨¨§§¨¤£¢¡žž¢¥¦¥ž ¢£¤¥¦§¦¥¤£¤¤¤¦žš£¥¥£¤£  ¤¤‹‡‰„mH%/@JLNNOQQLEA>=><83.$#2<@CDEFHMTY]abeijloqruwx{~€€~~€€€}{yxxwug]XY_fmt~ˆ’““’”tO' #&))!!%&%"!"##!(@`s‚~||{ywuqnjf_TI@;9?N\fox{{{{||}‹–•“˜—…&5™«§œš˜˜™šš—’™› ŸŸœ ª™o[7!Ki‘Ÿ£¢¢£££¢¤¬«¬¬¦¤£££¢¡ Ÿ £¥¤¥§§¤£¤¤¥¤£¡ŸœŸ¥§¦¡¢£¤¥¥¥§¨¨§¥¥¥¤¢ ž§¥££¡›ž£¥ŽŒŠsO)$:GJKKLONHC@=;971*$,7?BEFEHKPVZ^abfkmnqrsvwz}€€}~€}}{zzvtqe\UV[ahls}‡Œ““’ŽrP')+-/.' !$$"'>`w€‚}{zyvrpnh^UKA<<?IWcmv{}€€~‰””™£Žs(H˜°žœš™˜˜™š—•˜¡¡¡ Ÿ›¡™kO+"Sq™¦¦ ¡¡¡ œ˜ª®¨¦¦¥¤¥¥¤¢ŸŸž¢££¤¦¦¥¤££¤£¢¡ž™™¤¦¦¥¥¤¤¥¤¤¦§§¥¤¥¥¤  ¢¥¤££¡ŸŸŸ¡£–••ŽwU#0@FHGIKJEA?=71-("(4<CEFEFLRV[^`bcgmpqqsvxy|€€~~€€~}{yxtnfYOMS\bgls}‡‹’’‘Ž‹lN&45653-$! ##!%=bs}ƒ‚|zywspmh_UJ>;>AHWcltz}‚‚„Š‘‘ ¡‚d7[‘§šœ›››™˜™˜—˜£¢¢¢£™–‘gI$%^|¡­¦¡¡¡¢ž˜‘¢©§¤¤¤¥¦¥¥¤£¢¢¦¥££¤¥¦¥££££¢ ªª§§¨§¥¤¤¤¥¤££¥£££¤¤¤£¢£¤¤££££¢ Ÿ ™•”‹y[% /<BCDED@=:6-% %/8>EGGFIQX[]_`bcflqqqswyz}€€~€~~~}{xuof[NGJS]bflt}…ŠŽ’’ŽŽ‡iL%;;;:82'! !# $=^pwƒ‚}|zwsokf_VK>:>BIXdksx{~€‚ƒ…ˆ‹Ž¡šsUX|Ÿ¦š›››››™˜˜˜™œ§¢¡¢¨“ŠdE%/fƒ¢´©££¤¥¦ ž¤¥¤¤¤¤¤¤££¤¤££¨¨§¦¤¤¥¦¤¢£¤¤¥ª©©¨§¦¤£¤¦§¦£¢£¤£££¢££¢£¤£¢¡¢¢¢¡¡¡œ—•ˆx^#!2<?AA>:72* $07=AGIJKPX]^^_bdegmqstvyz|‚‚€~~}~}|{xtf[OGEJS\agmu|„‰Ž‹‹†hL$B@=:83*$  !!$>^nvƒ‚}zuqlgbZNA<?CJXdlsxz|~€ƒ…†Š¡˜Y8s”­­œ›ššš›œ›š˜˜£ ŸŸ¥Ž[? )4p†œ­¤¦¥¥¦§¦¥¥¥£££¢¢¡¡¢¢¡¡ ¥¨©¨¥¤¤¥¥¤££¥¨¨§¦¦¥¤¤¢¤¦¦¥¤£¤¥¥¥¤££¤££¤£¡¡¡ ¡¢¢¡Ÿž›y_#$/6;:40*# ,7=?BFJMPTY^^_`cfgjnruwxz{}‚‚‚~}{zyeTKEDFMU]chnu}…‰‹ˆ‡„hH$B?942/)&# !&@^o}‚‚~{xuoje^SF??CKXdnuxyzz{}‚ƒ†‰§•@…ž©¥›š™›ž›—–˜šš›œ£ŸŽvP6+GyŸ©¤¦¤¤¥§¨§¦¥¤¢  ¢££¢¡¡¢£¦¨¨¥¢£¤¤¤¤¤£¤ªª¥£¥¤£¢¢¤¥¥£¤¥¥¤¥¦¦¥¥¥¤¤£££¢¡ ¡£¢ žœ”ƒe+ (.,% *6=@ACHNRUX[^`adgijlpruxzz{}‚ƒ„„ƒ€€}wtlUE<<AGOW_ejpw~„ŠŽ‹‰ˆ…„~jJ&850,*'%$"(A\qƒ‚€€‚€~|zytokbVI@=?HUcnuxxxxy|€ƒ„‡ˆ¢/’ Ÿžž™™šš——––“™™ ›x@,6Sƒ™¥¦£¤¢¢¤¥¦¦§§¥£  ¤¦¥£¡£¥¬«©¨£ž¡¢££¤¤£¢¥§£¡¢¢¡¢£¤¤¤¤¥¦¤£¢¤¦¥££££££¤££¢¡¡¡œš——”‡n7 %1;ACDDJPUZ\^`behjlmnqsvyyz{|~€€ƒ„…„‚‚€~tcSD748BJPX_ekqw|ƒˆŒ‹ˆ‡‡„€{mQ((&$!)AZo€~€€€|zzvqlaUIA<=GUbmswyyxy|…ˆ‰‰šŒ,E–¡˜žŸŸœ™˜š›™—••˜šš›•‡t0! ?`Ž § ¢£¢¢££¤¨©§¤£  £¤¤£¡¢£¥ª¨¨§¢ ¡¢¢£¤£¡¢¤£¢¡¡ ¡£¢¢£¤¥¥¥¤£¤¤¤£¢¢¢¡¡¢£££ ž›š˜–•”‰x?$0:AEHIIMRX^abdfikmnopruxyxz{{}€‚„„ƒ‚€lMA5/08CKRY_emruz‚†ˆˆ‡†…ƒyhS'(>Vl|}}€‚‚|zwqj`VLD@@GS_iqvyyy{}‚‡‹Œ•’w:d˜¡—££Ÿš™™›œœœœ››Ÿž¥˜~_G^‘¤¨Ÿ ¡¡¢¤£¢¤§¥£¢¡¢££¤¤¤£¡ž¢¦§¥£¢¡¡¢¤¦¤¢¤¤££££¢¡¡  ¢££¥¥¥¥¤¢¡¢¢¢¡¡     Ÿžžš•””Š}Z4*6?BEJMNPU[_bcegjmoppqsvwxyyz{}€‚„„ƒ€‚nZG;635;CJQX_enrtxƒ…‡†„„„{iP%!! '<Sjyz|}~€‚ƒ€|yuqi`YRKFCFO[emsvxz|~‡ŠŸ…^Vv–¢›› §›™˜šœžœœœŸ ¢˜tP"(Oc”¦§ Ÿ ¡¢¤£¡¢£¢¡¡£§¥¥¦¦¦¦¢¢¤¥¤£¤£¡ ¡¦©¦¦¦¥¤££¢¢ ŸŸŸ ¢£¤££££¡Ÿ¢¤£¢¡ ŸŸŸŸžœ—”””‰|eH%$0;BCEINPSY^adehiloqrrqtwyzzz{|}‚ƒƒ‚{jYJ<5348>ELRZahprrv}ƒ…ƒ‚„ƒiO& "#" ';Rfvy{|}€‚‚€|yvsmd\VPKFEKVahlpuz|}„†Š–tGl„“¡œš ˆŠ•›œœœœšž™Žb?6ezœ©§ žŸ¡¢££¢£¢¡ Ÿž¢¤¤¥¦¥¤££¥¥££¥¥¢¡¡£¥¦¨¥¥¥¤£¢ŸœŸ ¡ ¢¤¤¢  ¢¡ ¢¤¤¢¡¡ žœŸŸ›•”•‘‰lR%'3=CDEINRW[_bdfiklorsrquy{}}|}~~~€‚‚€€hVI;6436=DJPV^cjprps{€‚‚€„„gO)  !!"#!&;Sesy{{~€€}zxuph^VPLHFIT_diouz}~€…‡‹—e3y’ŸŸ˜›Ÿž„…~‰“™››š—”–™“‰Z7&An†¡ª¤¢  ¡¢£¤¤¤£¢¡ Ÿ ¢¤¤¤¤¤££¤¥££¥¦£¢£¤¥¤¡¡£¤¤££¡š› ¢¢¡££¡Ÿ ¡¡¡¢¤¤¢ ŸŸžžžœ›˜—“wZ. *5>DEHKPV[^`cegjklnqsssux|~~}}€€€}znTF80245:CLQU[aekoqqsy~€€€‚„ƒ|fN) !! !$%# &=Xktz|}~€€€|ywskbWPNLIKU^djrvx{}„‡›R+‚™¤••™››‘“›ž›šš›š“”™¡„W((Oq…¥¥¢¢¡  ¡£¤¤¢¢¢¢¡¡££¡¢££¢¢£¥¤£¥¦¤£¦§¦¤¢¡¡£¥¦¦¦¤¢£¤£¡¡¢¢ ¢£¢¡¡¢¢¡ Ÿžžžžžœ›—“—y_6%%-6?DGJNSX\_bdfhkllmprsstvz}}||€ƒ„o\A:2/268=FOUZ^bfkoopsvz}€‚‚€{dJ&  ""!  "$$$!"$%#!(A`rz|~€~~€€}ywsog[QNNLNV`houxxy|€ƒ„”“..†š£•”–˜˜˜š›œ››ššœ –“œ ˆ}D1Yz…•›Ÿ£¢¢¡ Ÿ £¢¡¡£¤¤¤¤£¢¡¢¢¡¡¢¤¤£¤¥¤¤¦¦¦¥¤¢¢¢¥¦¥¤¥¥¤£¡  ¡¡ ¢£¡ŸŸ  ¡¡  ž Ÿžœ›š•’‡yd?+&/5:AGJMQVZ^begikmnnoprsrsvy{|{|~‚~}yo[L;/+-269<GRY]bfimonoqtvx|‚}xcF$ !$&&%""!!#$%%%"!&*+)&#+D_t}}€€~}€|ywtqjaWRPNPV`jpuyxx{~‹D ¡–”•™™™™šš™™ššœ›˜“ž˜j3 9W‡”•—œ¡¡¢¢¡žžŸ¢¤¥¦¥¤££¢¡¢¢¡¢¤¥¤¤£¢¢£££¤¤£¤¥¥¤ž¡¥¥¢¡ ¡¢¢ ¡¡ œžžŸ ¡¢¢¢£¢¡žœœ›››•ˆyeJ0&/6<@FKMPTY\^bfhjlnnpqrrrqsvxy{{{|~€~~tdUMA80,.048>HT\`dhikmmkloqsx~‚{t_A" !$')**('%! %&'()(%!#(,.*'%"+D^rz|~€€€{yxvsmd[SNMPV^houyyy{}€‚?eš§—–˜›š˜—˜™˜™š›œ›œ›–‹kQ."I[“¤œšžŸŸ ¤§ŸžžœŸ£¥¦¦¦¥¤¤¤¤¤¤£¤¦¦¦¥£¢¢££¢¤¥¤¥¥¤¢¡¢¥¤¡ ¡£¤¤¥£¡ŸžŸŸŸ¡¡¡¢££¢¡žœœœ –Ž‹ƒxeM4#)28<AGLOQTX]`adgjklopqssrstuvxyz{|{{zxtiQH>73/-047;BLV^bfjijmnkilnot}€}zoS9" !!"$')*,-,*'#$)++--,'#"'*+(&$"'?[mvz|~~|{{zwrh]UOORTYbkrvwy{}€k\{ «œ™˜˜››˜—˜˜—˜šœœ ˜‹€R<!,Xjš¦–™žŸœ£¤¡¡¡ ¡£¥¦¥¥¤£¤¤¤¥¥¥¦§§§§¥£¢£¢¢£¥¥¤¦¢¡¢£¥¤¢£¤¦¦¥¤£¡ ¡¡¡¡¢¡    Ÿ žœŸ¢¦›’’‡yeM6$+29=AFJNQTX]abcfiklklorsssuxwvwxy{|{xupgWG<8643369<AIQX_cgjjklmljjllqz}{yxjE2" !#%()+,.-+(&#!&*++-0.)!&)%&'%! $'(&$$"%;Thty{|}€€~}|||yxh`XQQTSV`hnruy{|}ƒw^f…£¦˜š™˜šš˜˜™˜—–™œœ¢—Š~K4 7ct §˜›Ÿ Ÿ ¢££¤¤¤¤¥¥¦¥¥¤¤¥¥¥¥¤¥¥¥¥¦§§¤£¢£££¤¤££ ¡£¤£££¤¥¦¥¤££¢¢¢¢££¢ Ÿ ¡ŸŸŸžžŸŸª›““‡vdN7 (.4:AEGHLPSW]befgiklljknrtuuwyywvwxz|{voeQG913457:=@DJPUZafjlmmmnmkjjinuwvtqhG,"!#&)++,,*)(%  $(,--/1/( $,5R9)))&!!$$##$$"$8Qbqtwxz|~~~}|zvjd[RQRQU_hlorwzyykHq‰¡œ”—•“™šš›Ÿœ˜—™›œœ¥™‹w>+&7u†¨³œŸ   ¡¢¢£¤¥¦¤££££¤¤¥¤¤££¢££££¤¥¤£¡£¤¤£¢¢¢ ¡¤¤¢¢¢¤¥¥£¡ ¡¢¢¢¢££¡ž ¡ŸžŸ¡ •“†pbN6"'-3;CJKKKORTX^cefhijkljjlptvvwyywvwxyywuj[J<42579<?BFKNRV\bgjlmnnonlkhfioqppng4&# #&(*,,)))'! $).1110-("'-=rŠ)(&" !#$$##6O]flpty}{}~~~}}}zunh^TQPQT^hlmqwxww|T,$€Œ™•’’†˜š›œœ™˜™šššŸ—…j3",<t‰¨°¡¡¡  ¡  ¤¥¦¤£¢¢£¤¥¤£¤¤¢¢¢££¢¢¢££££¤£¡¡¢¢¡¡£¤£¢¢£¥¥£  ¡£££¢¢¢¡žŸŸœœ›œžŸ›”‹ˆ|g_N4$.15;AHMNNNPRTX\aehihiklllmorssuwxwvvwxwtiXL?5138:=@CGLQSTY`ehjlnooonlkifgjkklla !%'+..+**(" $(.221-($!)Rs†‘$## "###  0GUZ_chpssvz{|}~~|wph]SNMOR[ekmqvvuvu<5Š“–’“’‹˜œš››™—–——™œ˜‘{W0/Go„ £ ¢¡  ŸžŸ¡¤¥¤£¢¢£¤£¢¡££¡¡¢¤¢¡¡¢£¤£¢¢¡ ¢£¤¥¤¥¦¥£¢¢£¤£¢££££££¡Ÿ  ŸŸŸžœžžš•’„xg[M4"-59=CGJLMNOPQTW[_ehfehjkkkklopqsvwwvuuvrhVH=7226:<?CGLPSVX]chjjkmooomljigfefimmb "%(*.0.+*'""%).0.+&"! ! !""""(;HORTX_fjovz{~€}xpg]RKIMRYbjosvvvwv.A‹˜–’“’“—™šš™—––—˜™”rL%:[“«ªžŸ¡¢¢¢¢¢¡  ¢¥¤££¤¤¥¤¡ ¡¡  ¢¥£¡¢¤¦¥¤£¢¢£¤¤¤¥¦§§¦¥£¢¢£££¥¦¥¤¥¥¡ž ¡  ¡¡¡ ŸŸžœ™•’‘‹~h[O7$1;@BFJMNOOPQSSUY\`efcdghghjiiloqsuuuutsriXI;4236;=>AGMRTVY]bgkmlmnoponlifeedfh|‰p !#%&&'**)'&#!#%(+-,*% !!"! !!!"""##$1<BFGJS_iov{}‚}woh^SJIMQW_hotvvww~ D‡’““’’’’“–™™šš™™™™œ¤“ˆlG7h’£·«¡¡¢¡¢£¤¥¤¡Ÿ¢¤¤£¥¦¦¦¤¡ŸŸ   ¡££¢¢¤¦¥££££¥¥¥££¤¥¥¥¤£¢¢¡¡¡¢¤¤¤£¤¡Ÿ ¡ ¡¢¢¢¡ Ÿœ™™˜“Ž‹~k]R8$/:BEEILOQRSSSUVXZ]adeefgedehggjorrssttrni^M?9668;?ABEJRWYZ]aeiklmnnoponmidaceI‹ o!#%%#!!"! !!#$$$$$""&)()+*("!"## #%&%$#! %1=DHHJQ]hou{~€ƒƒ€wpj_UNMPQT[enuxxwzs<j—š’“’’“•–—™™™šš›š™Ÿ¨†{_=%Im•¥´£¢£¢ ¡¢£¤£¢ ¢¥¥¤¥¥¥¥¤¢  ¡¡  ¢££¢£¤£¢£¢¢¤¥¤¢¡¢¢¢¢¢¢¡ ŸŸŸ ¡£¤¢¡    ŸŸ¡¢¡ ž›™˜™’‰†zi^P6%1;CHIIKOQSUVUUVWY[^beggfgffhjhgkqttrqrrng]M?8789:<?CHLPW\^_afillkmppponnmidaeRi ª—i! !%',00/-(#    #$&'#!(+)()(%   !#$!&)*(%# !,=LUXXZ_ekqv{~ƒ‚€xrkaYRORPQXbmvzzvzd]†§§’’‘‘’–—˜˜˜˜™™šš™ª¢m]H//\yš§¤¡¡¡¡  ¡¡¡¡¡¡¢¥¤££££¢ ¡¡¡¢¢¡ ¤¤£Ÿ    ¡¡¡¢£¢¡¡¡¡   ŸŸžŸ   ¡¢¡ Ÿ ¡¡ žœŸ¡¡ žœš˜—“‹ˆ|fYL2$0:BIKKLNPSTVVUTTVY\_begfeggilligjpuutsroi_N>77:<=<<@FMQU\_`adhklklmprqommnjffFo‡¨¬Œ[!(./4:>?:0*!&! "%()%!!(*)()&# "#!"# %(('%"&4H`imlnnosux{‚ƒ‚~yrkb[SOPOOXcnw{zoRr•©¤”“’‘—™˜——˜™™˜™™«¢oS@(#7e}•©¦ ¡¡  ¡    ¢¡¡¢£¢¢£££¡¡¢¢££¢£¥¥¤¤£   ¡¡¡¡¡¡¡   ¡¡¡ ŸŸ £££¢¡ ¡¡¢¢¢¢Ÿœœ ¡¡ Ÿš–”’ŒŠcTF-!/:BIMMMNOQRSTUVUUW[_acffeehijlmkiimrttsqk`R@66:>ABBBEKRVY_ccdfilmmnoqsrpnnokbOs“œ¦­‹Q$)09Hcx}uF !##"!!&))))&#!#%$! "$&%$!(7Og{ƒ|||zyy{~ƒ…„xsld\TPMJKUcnuwu{Y9Ÿ£š”•—•”˜š™—––˜˜———¦ tP4 +Ahv‰¤¤¢¢ Ÿ ¢¢¡ŸŸ¡¡¡¡¡ ¡£¥¤£¢¢££££¤¥¥¥¥¥¡ ¡¢¢¢¡¡¢¢¡¡¢¢££¢¡ ¡¢¤¥¥ŸŸ¢£££¢¢Ÿ›œŸ Ÿžœš–”‘‹‡y^P@')6?EJMMNOOPQRRTWWWY]_adfffgijjkmljhkorrrofWG:68=BDEEGJNTX]aefgilopppqrttronlhc¢Ÿ’–«ŒQ'2E~Ÿ¥¯ª˜z= $()('$""#$$" #$" &8So„€€~}}‚„††…€yvoe[UQKEHSbmsttuE%‰§£˜—™™™œ™š™—•••••—™£šlE).Gs€•¤¢¢¡ Ÿ ¢£¡ŸŸ¡¢¢  ¡¡£¥¥£¢£¤££¤¥¥¤¤¥¦¢¡¢£¤¥£¢¢¢¡¡¢££££¢¢¡¢££¤¢££¡  Ÿ›šœ››š™—ˆ‚n[K;"",3<CGKMOQQPQSUTVYYY\_abegffgiijlmmkijmoomg\J<668=ADEFHNRW\`ehijmoppoprsutrnjecX °Ÿ“™«…L$1E}‘™ª¸À»ªƒL"'(&&# !%$#" " $6So|~€~}}ƒ………„~zqg\SNJFGQ`lssqg=#‘« —˜™˜š™˜——–•““’“– Ÿ]: :Y…˜¥§ž  Ÿ ¡¡¡ žŸ¡£¡Ÿ ¢¡¡¢£¢¡£¤¢¡£¥¦¤£¡¢¢£¤¤¥¥¤££¢¡¢£££¢¡¡¢¢¡   žœœžžžžžžœ››š™™š›Œ‚{jXI:"!,48?FJKMPQQPQSVWXYXZ\_aceedfggfilmmkihjklg\M>779;=ACEGKRW[]afhiknpqpooqrsrojd]Y6š¨”“šª{F$0@{Œ—¨²¸¸®žr $'&%""$$# %7Umy€€~}~‚ƒƒ„„ƒyqf\RLKIGM\irskb2™®•–˜˜—’Ž‘•—–”“’’•¨›†R7&BUŒ ¢¡Ÿ   ¢¢¡ Ÿ ¡¤¥¢Ÿ£¢¡ ¡ Ÿ¢¢¢¡£¦§¥¢¡ ¢¤¥¥¥¦¥¤££¢£¤£¢¡¡¡¢£¢¡  žœššœž›œžžžœš›šš™œž’„}jWH;##07<?DKNNNORRRQSVXXXXZ\^adeddfffehlmmkihijjbO<55:=>AEHLORX]`aehjkmpqppppqppnkg`XS,‡ž•“š©{G&0>ƒš‘›žœœ¢°»¿º¨‡4 !%&%!"##%$! '8Rgs|€z{|}‚ƒ„€{rg]SMLIFKXhrska* =¡±”’”–•’•™™–““””Ÿ‘xH-%I]š–Ÿ¡¡¡¢¢¡ŸŸ¡¤¦¦¤¡£¤£¢¡ žœ ¢¢£§¨§¢¡¡¢£¤££¥¦¥¤¤¤¥¥£¡  ¡¢£¤£¢¢ œš™œŸ œœžŸ›œœœš’–•ˆ€nXI;##-6;?CHMOOOPSSSRSTVWWWYZ[^ceeeeddegklkjiijjg\D437<>AEKORUX]`cehklmopppprrrqokfb]VPMr‘œ“™¦zF!+1&ˆ‘›¢žž±¾Ä¼¦z:"##  #$'('$" "#"&7O_lttsstvx}ƒƒ€|vi_VOJHFKXgrrp_#9\£·–““––Ž‘’žž—”•–˜—ƒi;#!4`q”ž™›ž¡£¡¡¡¡ Ÿ £¥¦¤¤¥¥£¡¡ ž™Ÿ£££¥§¥¢¡¡££¢¢¢¤¥¥¥¥¥¦¦¢ Ÿ  ¡¢££¢£¢œššœŸ žŸŸŸžššœœš’‘ŒxnZH9"%1;ABEHKNPQQRSSRSSSTUTTWYY\aeffecbdgjkjijjkg]M8/37:<AIPTWY^adgikmoqqqqqqqrqolf_[XSOWcƒŸ˜š¤tB -4)‰ž–Ÿ¤   ŸŸŸ ¨°·¹²¥w !!!#$&*+)'&##$#!#0EU_eggiklu{€€‚ƒƒ€}zk^WQJGELYfqqlWSy¡¬˜•”—™–“•ž¢›•––¦œ~a: (Et}œ¥œœœŸ  ¡¡ Ÿ ¡¢£££¥¥¢ž   ŸŸ¤¤¤£¤¥¥££¨¬©£¡ ¡¢¤¥¦¥¤£¢¡¡ ŸŸ¡¢¡¡¢¡žœžŸ¡  Ÿž›™—–˜›š˜–Œ|oiZH6#.8AFFHKNOPQQRTSRRQPPRQRUWWX\acdcbbcehiijlljbN9//59<?DMTWZ^beghjlmpsrqrsrrrpmg`YTRPOWYrœ™¤¤n:+9AŠšœ¢¡¡  ŸŸŸŸŸŸ «¹ÂÀµª¥£§«¦V!#$&)*)('$!""!  +>JRXZ[_emtz~‚‚‚‚}{k]VQKFBIXfrqgK_‰žŸ˜–”—š˜‹“š™›žš—™Ÿ—rT+/Fz~§œœœž ¢¤£ ¡¢¢¢£¥¥¥£ ¢££££¤¥¥¤££¤¤¥©©¨¥¢ ¡¢£¤¥¢¡¢££¢ Ÿ ¡¡¡ ¡¡  ŸŸŸ¤¢Ÿ™•˜—•—š™——ŽmgYF0"0:AGKKKNPOOOPRUSQPPOOPQSVXWUX]`bcccddgijlnmg\A,*/6<AFKRX\_cfijknoorsssttssqlf^UMJMNQX]aš£¦¦g0,?X„ž£Ÿ¡¡ŸŸŸŸŸ¡¡ žž«¹ÀÁÁ¿ÀÅÇ´—t9!! "%'()((('%  +;EKNORXcnu{…†„~}}{j]VRJ@<DVerqc@a†˜ž—”“—š˜•—œ›œœœš™œ“ˆY;.R„¢§žžž¡¦ª¨¥¥¢ ¡¤§§¥¤£¤¤£¢££¤¦¤££¤¥¥£¦§¥¢¡£¤¤£¢  £¤¤£¡¡  ¡¢¢¡  ¡ žž  žœ–˜š˜–—‚pdWE-+8@DJNNOPQPOOORSQNNOPQRTVXZYVVY]`aabccehkmnkaQ:+,28>DJOTZ_aegjlnpqprstsrqqqmd\SKFGMQT[bW—¥­ªd+2DI}¡Ÿž Ÿžžžž ¡ žžžŸ  ŸŸž¡«²º¾Àº”S "&**(&((&$"-@LOQQSYcnu|ƒ‡‰ˆ{€}i]TPG<6?SbpnZ5sŽœ—•”—š™—™ž›š™žœŒ‚Y6<]‡—§§ ŸŸ  ¡¥§¨§§¥¡ ¢¤¦¦¥¥£££¢¢¤£¤¦¥¤¤¤¥¤¡¤¦¥££¤¥¤£¢ ¢¤¤¤¤£¢Ÿž ¢¡ ŸŸ¡ ŸŸŸŸžŸŸž›™š—•™‚rcVF.+7CILQUUTSRPONOPPNMMORSUWXY[ZWVX[]^`bcdfilmmfVB4./4;CJMPV]behjlnprssstutqonkcXOHA?FMSY_cT‡œ´®i+#9A?}‘ žžžžŸ Ÿžžž    ŸŸ ¢©±¸Á¿² l !%)++))*)%!&3L]`cbbbhow~ƒ‡‹ŒŒ†„Š„e]SOH=5<N^lhL)¦¢––••—™˜—šœœ›™˜™£›‚yU/Cd„—§£    ¡¡£¦§¥£ Ÿ ¢£££¢¡Ÿ ¡¡¢£££¤¥¤¥¤¤¢¡£¥£££¤¤¤¤£¢£¤£¢¤¥£ Ÿ¡¡ žŸ¡¡ ŸŸžžŸŸœœœŸ™––zoaTD-*5=EJMRWXWUROLKLMLKKMNPRTVWYZXVVXYY[^`acfjlkg_M;4349@INOQW_dhkmmmprsttssromibWG><<=DKRZ`d`{–³¬h)%?Q^‡“ ¡žŸŸŸŸŸŸžŸ     Ÿ  ŸŸŸ ®·½¸£ˆY  ! #&),,++*(%("+;Ymxwwvuuw{~‚…‰ŽŒ‹”Žq_RNI?58GXgc@%š°’’“””•—˜™ššš™˜˜˜¥•ufH$$Pp‹˜£¢¡¡ ŸŸ¡£¢¢   ¡¡¢¢¢£¢¡ŸžŸ¢¢£¢¢££££££¡¡£¤¤¤¤¤¤¤¥¥¤££¢¢££¡ ¡¢¡ŸœŸ ŸžžžžŸ››ž ¡š•~tk^QB+,6>DGIMRVXWTRNJJKJHGIJMOQRSUXXVTVXYYZ\_acgjjf^RB658;@FMQSV]dhlopooqrtssrqpoldU@0.38>CHPX`efm‹±©c%$B_z—¤¡žžžžŸ  ŸŸŸžž     ¡¡¡¡ ŸŸŸ ¡«³»ÀÁ»¦Z  !$(),-,+)'#­p$/Bas|€|~~}~€ƒ‡ŠŒŒ‹’Žw`QKIA56BSc^5, ªŽ’““”••˜™™™™šš›¥”nY9!!0^v“žŸ  ¡¡›ž   ŸŸ¡££¢¢££¢¡ ŸŸ¢££££¤¤£££¤¤£¤¤££¤¢¡¢¢¥¦£¡¡£¤£¢¡¢¤¢ žžžœ›œžžžŸššž¡¢™›˜…{i[P@'(7>FJKLPUXXURQNJJIGEDEFHLNPQSVWVUVXYYZ\_aadge^QE;68<AEKPTV[afilnoopqrrrrqonnmbK4+,29>BFMU^eje}©®c-"DdyŽ™¤œžœžŸŸžŸŸ ŸŸŸ ¡¢¢¡ŸŸ ¡¡¡¢¡ ¢´º¾ÃÁ«Œ[ !  $&'+.-*'%!-s’¦®ÄÈ–0 $2Ibv‚‚‚€„‡ˆ‰ŠŠŠ†n]OIHB57DQ^X+%@¡­••””””““”—™ššœœœž‘hM*'3lz•¦£ ¡¢ ›œžŸŸŸŸ ¢£¢¢£¤£¢¤££¤¥¥§¤¦¤¥¥¦¦¦¦¥¥¤¢¡   Ÿ£¥£¡ £¤££££££¡ŸžžœœžŸžžžž›šœ  ‘•„~eWO?"!5BHNRSSVZ[XTQPMIFEDA@A@AEILOQTVXWWWWXZ]```bb[QE;77:@EIOTWZ`fhjmooopqppppnljklaC,)-39>BHOV^djns¯³`$"?gv‹£œœžžœœžŸ¡¡¡ ŸžŸ ¡¢¡   ¡ ¡¡¡¡  ¡¨¶Áû¥„B!"#" !#%&*,*'%% 7wž¯¸¾¾Á¬d+!$"!"" #0G`s~€‚‚ƒ…†‡ˆŠŠˆ†‚e[OHHB56EPZR#(Z¡®›˜——–•““•—š››œ ¡—‹Y3'H|…•£¤¢¢¢ œ›žŸ    ¡¢¢££¢£¦¥¤¥¤¥¤Ÿ¢¤¦¦¥¢¢££¢¡ŸŸ ž¡¤¤¢¡¢££¤¤¢¢¢¢ŸžžžŸŸ œ›šœ“‘}wdWO> /@KOSXYZ[[ZWSPOLHFEC@??==?ADJNQSVUTTUWY\^_^^XND;789=BGKPVX\afhjmnnnonllmmkifhlcA)(.37;@FLT]cjni©²W#=o…£œœžœœŸŸžŸ¡¢¢¡Ÿž ¡¡  ¡¡  ¡¡¡¡¡ ¡¡¡¡£²¾À¼°ˆH "#$%"!#%'()'$$% 9v”§­®®¯±³±²¬µ·©v"%$"#$$"!!$$!!.C[r…‚‚‚‚€€…ˆˆ‰Š‹Š‡„ƒk[OHH@22BMUI;m¥ª˜™˜—–•”•—˜šœœ›¦ ”‰V.3Z…‘œ¤¡¢¢£ œ››Ÿ  ŸŸ ¢¢¢¢¢¤§¦¥¦£¢¡  ¢£¥¤ œ ¡¢£¡ŸŸ ŸŸ¡¤¥£¡¢¢££¢   ¡ŸœœžŸ  Ÿœ™››šš››™•™‘wvgYP=+>IPRUYZZ[ZWTQPOMKIHFCCC@=<<>DJMNPQQRTWXXYZXSK@977:<@EIMRWY^dhjjlmlmmljijhec`bibC*)/59;>DLV^cjma›²\#<u“–š¡œžžžž  žžŸ¡¡ ŸŸŸ ¡¡  ¡¢¡¢¢¢¢¢ ¡¡¡¡¡¡¡¤­²¿¾´§{ !##$%"!%(())&$$#%x£³¹½¾»·¶¶«œ¢³¶£g #$#"#%&&''%&(-/.'*=Sn†„€‚‚„‡ˆŠŒŒŠ…‚~o_QJG>/->KPARª –——•“””–˜™š›œœ›“Š~N'$Bb‡“¢¥ ¡¡¡ žœš›ž  ŸžžŸ¡¡¡ ¢¦¥¢¢    ¡£££¢ŸžŸ ¡¢¡žŸ¡¡¢£££¢¢¢¢£¢¡¡¢¢¢¡Ÿž  Ÿžš˜˜˜˜™š›˜–¤nsgYP=4FNQTWYZYXVTSSRQQRQPNNOMIC@<;@EFGIJMPSUTRQPJB<77:=>@CHLOSWZ`ehiijkjklkjigc`]Z\e`C-,17;<=@IU_chklX$>t’™› žœžŸŸ  ŸžŸŸŸŸ Ÿ ¡¢¡ ¡£££££¢¡  ¡¡    Ÿ ¢¯µ·½¸—a !!"!!! !&)*++(&$"&No¦«®°³²¬¡˜–––—™ª³³‰#%%#! !$%(**()-3773('9Rf{}€€{|ƒˆŠ‹Šˆ„~qaSKE;+*;IM;fˆ¥––”’‘‘’“™››œœ¢˜‰€n8$Qg…’£¤Ÿ    ŸŸžœšœŸ  žŸ ¡¡¡¢¢¡  Ÿžž ££¢ Ÿž ¡ ¡¡Ÿ ¡¢¢¢¡ ¡¢¡ ¡¡¢¢¢¡¡¡¡ ŸŸ Ÿž›™˜˜˜˜š›™– †nqeXP<+ANRUXZ\]\XSRTWVUWZXVWWUTPJFCA@?>@DFINOPOLID<5027?DEFINRTVY^cfiighiiikkif`[WTRV`[@-,17<==>HU_bgkp{‡P$>nŠ™ŸŸŸžžŸ  ŸžœžŸŸžŸŸŸŸ¡¢¢ ¡¤¤¤£¢¢ Ÿ ¢¢¡¡ Ÿž ££¡£­½¿·£\ !$&(**(&%!Xem}£´»ÀÁ¾º´§žšš˜—••—™¦©«™>-,'# "&+**,16:;9/ #-BT_ilmprps{€†ˆˆ‡†ƒ€scVME9)(:HK7w‘¢ —–”’“—šœœ¢–Š{]/2`p‰–¥¡žžŸ    ¡ ŸšŸ¢¡ žš ¢¢     ŸŸžžŸ¡¢¡¡ ¡¥£¢¢¢¡ ¡¡¢¡  ¡¢¡ Ÿ¡£¢¡  ¡¡¡ Ÿžžœš™™™™™šš˜šŠwoaUO;#8GPTX[]]__ZSRUYZY[][[\ZXWVRMJHC<:;?CFIIHGC=84104;DIIIKPUWY]adeffeefhjlkhaWLHHLT^W<++06:=<=FT]bfmprsJ%@k…™¢ŸŸžŸ Ÿžœœž  žžŸŸŸ¡¢¢ ¡¤¤¢¢¡¡¡  ¡¢¡  žž £¢  ¡¥¶¸º©l!#%((&$'' pš¥¨­³·¶¶¸³­¯¬¢™˜™šššš™™—––›²¸žU64/'"#')*.28;;91#!&5FTZ\^eknry€„…„ƒƒ‚‚€qcVOF9('8DE3€™£œ˜—–”’‘’”—š›–‹nH!#>ev’›£¢¡ ¢£¢¡¡¡¢£Ÿ¡¥£¡ Ÿ¤§¢ Ÿ ¡¡¢¢¡ ¡¢¢¢¡¢£¥¤££¤£¢¢££¢¢£¤¤£¡ ¡¢¢¡      Ÿœœ›œœ›™™™››xk[QM:,BLSW[^^\[[YUUWZ^___]]]\ZZZVPJE?979=@BCA>;62//026>GLMOPQVZ]`bdeeeeeegiigbYJ=7=IT]S6(*05:??@HS]ciprpn1&El–¥ žœž ŸžžžžŸ¡ ŸŸ    ¡¡  ¢¢¡¡¡¢¢¢¢¢¢¡¡¡  ¡£¢ ¡¡¡ ¢®¹¶¥ŠE !!"%')&#!'0$O…°Á½¹¶¬¤¡›œš˜™š™˜™šš™˜˜™™™Ÿ¦¦˜jC@:0'"%)+.16:85. #(3CPUSU\djp{‚…„ƒƒƒ‚‚€ocUNG9(&7@=-ƒ™ž—––—˜˜—•““–™šœš“ƒV.+Ii|™žš¡¥§¤¤£¢¢¡¢£¤©§¥¢ ¡¡¦¤¡Ÿž ¡¢££¡¡¢£¢¡ ¡£¢¢¢¡¢£¤¦¨¦¤¥¥¥¥¥¤£¢¢¡    žžŸžœ›šœžšš™œ™ˆugWNL91GPU[^_^[XVXYZ[^abba^^]\ZZXSKD=8447;>?;6/,*++.26:AJOPRTUX\_`bdedefgggfeaZNA508HU\P1&+05:@ACIQ[elqqmh%Adx’¥žœ›œžŸŸŸžŸ  ŸŸŸ  Ÿ   Ÿ ¢¢¡¡¢¢£££££¢¢¢¢¡¡¢¢¢¢¢¢¡ ¡°»¿»°Ÿd !!##""!$')(&$$'\…¯º±°¯œ———–—––˜šš™™™™™™™˜——™¯¸¯{RME:1($*,-.363/)$-;JUZZZ\U\\y‚ƒ„„……„ƒ€seVLC7''6<6&”ž–—–•–———–••—™™žš‹yF(.Sr„Ÿ —œ¢¦¤£££¢¡¡¢¥¦§§¥££¤¤¤¡ŸŸŸŸ ¡¢ Ÿ¡¢¡ ¡¢¢¡¡¢¡ ¢¤§¨§¥¦¦¥¤¥¥¤¢¡     žžŸŸŸž›ššŸžœ›šžugVMJ75JRX^a`_]ZZ[]aaacdba_^]\[YTMF@953358:94/)$%(+.4;AGMQPRUWZ^`abdeeghjhea]UK?71-5ERYN/%,26;??@FLWckpoja#7Ot ¬œ››œœŸ ŸŸŸ ŸžžŸŸ   ŸŸžŸ ¡¡¡¡¢££¤¥¤££££¢¡¡¢¢£££¢¡¡¢¦±³¼¿º²§š€Z !"###%$# #&'()))1kŽ¹¿ž™š˜——–•–—˜˜š™˜—™™˜—˜˜—•˜©³­ˆSME=6,!%+-..02.(!&5K]komjlpu~‡†……‡ˆˆ†ƒ€viXI>1%%25.:¥¨“—˜–”‘’“”•–——§ ƒn7&;V~‘¤¢˜šžŸ¡  ¡ ŸŸŸ£¤¢¤¤£¤£¢¢¡¡¡ ŸžŸ¡  ¢£¡¡¡¡   ¢£¢¢£¦¨¤££¢¢£¤¤££¢   ¡ žŸ  Ÿœ›š™˜šœœœ›š›‰‚whYOJ65JSY_ba`__``accbcca`_`_^^ZSKC<8542100.***().027?EKPQOQUX\_`acedegijf`YRI?72/,3AMUK-"*16:<;;@EQ_innh["9Ii¨­œœ›š›œŸ žžœžŸŸŸŸžžŸ  ¡¡¡¡¡¡¢¤¤££¢£££¡¡¢¢¢¢£¢¡ ¡££¢¤©©µ¼½¾½·ª’V !$%$$# !#$%()'v—¦¦›š™˜——–•–˜™™™™——˜˜——˜™›©³´¢aOJC<6.$&+.//0/*!(=\s…Š…€ƒ„‡ˆ‡††ˆŠŠ‡„~ujXG;-"",,$$1£©“•–•“‘‘“•––“z_6,FU‚™¨« ¡žžŸŸžŸ £¤œœ¢££££££¤£¢ Ÿ ¢¢¢¤¥¤£¡ ŸŸ ¡£¤£¢££     ¡£££££  ¡ žŸ¡¡ž›š›™™›œ›™™™›œ†sf[RL65KT[`ca`__`bcdcbba``bba_]YPID>:50-)((&%(+-0458<BIPTSQRVY]_`acddcfhhc]TH<62/,*1?JSK,(27:<=<?CN`jnni[!7K_£¨›œœ›››››œž›œœœžžžžŸ¡¢¢¡¡¢¢¢¢¢£££¢£¤¤££££¢¢¢¢¡ ¡¢¢¢¢¢¢¢¥£±¼Â¼­”q!$"""!!"! !#"#%%–°¤œššš˜˜˜–•–™™˜˜™˜˜—––—™©°¯°¨€GD=84/&$)-121.( *@azŠˆ†‡‡…„†‰Š‰‰‹ŒŒ‰†‚vjZJ<-" '&$O¢­““”•”“’‘‘“–˜–“ŒaJ)*Xfˆ™¦§  Ÿ›››žžŸ ¢¤¢žž¡¡¡£¥¦¦¤¢¢¢¢¢¢¢¢£¥¦¥¢Ÿ¡¡¢¡¡¢¢¡      žžŸ ¢¡žŸ¡¡ žœœžœ›››™™›œš™˜˜šš‘€gd\SL54LUZ`c`___`bccbba``addb_ZUOLKF@7+" $'*/25777:@DKRVVSSUW[^__`bccdeb]SH>8520,)/;FPH)+578;>?@BOajmmi\!;Uk¤¬œœ›››››ššœœœ››œœžžžžŸ¡¢¢¡¡¢¢¢¢¢¢¢¢¡¡£££¤¤¤¤£¢¢¡ ¡¢¢¢¡ ¡¡ Ÿ¡¡¢©§³¼·£h  !  !!#$#!#"!%«·š™š››™™™˜˜˜™™˜˜™š™˜—–¥»À±y!"@=720-& "'+/00.'"-B`z‰…‡ˆ‡‡‰ŠŠ‹ŠŠ‹‹Š‡wk]O@0##!9l§®”’’•—––•””–™˜•ˆW=/ax˜ Ÿ   ŸœœœŸ  ¡£¤¢ŸŸ ¡¢£¦§¦£¡¡¢££¢¡ ¡¥¦¦¥£¤££¢¡¡    ¢¢¢¡žž ¡ žž¡¢¡Ÿœœœ››››š˜šœœ›™™š•‹}ig\TM43KUZ`ca`aaabbaacbabceed`XSPPQLB7(&,17:=>=;>BGMRVWUUUTW[_``abba_[SG;5431/+(-6@JB%-778;???@N`jmmhZ$>Wq¨°œœœœ›š™›žœ›œžŸ   ŸŸžŸ¡££¢¢££££¢¢¢¢¡¡¢£¤¤¥¤¤£¢¡¡¢££¢¡ ¡¢¡¡¢¢¢¡¢¨¯µº³™w:!!  "####" "#"-¬¶ššš›š——˜™™™˜˜˜™™˜˜™ž¢¤®­} yŸˆ;74/,+*&"#&)+,.,'"/C]wƒ†ˆ‡†ˆ‹Œ‹‰ˆˆ‰‹Œ‰zm^PB2#En£¦•’‘•—————–—ššŠ‚Y2#6i…™œŸŸ ¡¡ žžŸ¡ ¡¢¢¢ Ÿ ¡¢¢¤¥¤¡  ¡¢¢¢¢   ¤¥¤££¢¢£¤£¡ ¡¡¢¢¢¢œž ¢¡žž¡¢¡ ŸŸ¡œœ›™˜šœž›š›žš†ke[TN5,DQX`bccecbbbabcdcdfgge`YUTSQG7+# &.38=?ACB@@BGMPTVVVURRW\^____]WND<5232/,)(+2;E?".889>A?<=M`jnmeR)ATi§°›œœ›™›žžœœžžŸŸ     ŸŸ ¢£¢¢¢¢¢££¢£¢¡  ¡££££££¢¡¡¢££¢¡¡¢¢¢¢£¢¢¢£¢¡¡¨´¸²¥k !! "$$#!  #&/Jd­®›šš›™–•—™š™˜˜˜š™˜§·½±  M©¼°„2-)'&&%#"#&''''('$#0Ed{†‡‡…„…‰Š‰ˆ‡‡ˆŠ‹ŒŠˆo]OB1"RrŸ¥•’’”••—˜˜˜˜š¤ž‡~P(8y›£¥¢  ¢¢¡ ŸŸ   ¡¡¡ ŸŸ¡£££££¢  ¢£¤¤£¡ ¡£¤¤£¢¡¡£¤¤¢¢££££¤¦ ŸŸ¡¤£  ¡£¢  ¡¡Ÿžžœžžœššš›‹kcZUO7$;MY`cdedddeedefgffghhea]XVQG8( $-49=ABCEDA@BFJMORTSRPOPTXZZZWSK=100/01.*(').6B=#/:99=A?=?NbknkgH-CP]¥±œœœ››ššœžžœžžŸ  ŸžŸ ¡  Ÿ ¡¡¡¢¡¢¤¤££¢   ¡¢¢¡¡¢£¢¡¡¢£¢¢¢££¢££¢¡¡¢¤£¡Ÿ¡©¯³º²S !"""  &t…¡¢š™šš˜–•–˜˜˜˜˜˜š¡£¤©©Ž? S€¨¯­ž*.*'$$$$$%'))&#"! $/Glƒˆ‡†„‚ƒ†ˆˆˆˆˆ‰ŠŠ‰‰ˆn[LA0 e~˜””“”••–—˜™™š©žn=*M…’• §¤¡¡¡¡ ŸžŸ   ¡¡¡ ŸŸ¡¢¤¤¤£¡  ¢¤¤£¢¡¡£¤¥¥¤£¡ Ÿ¡¢¢£¤£¢¢¥¦¢ Ÿ¢¤£¡ ¡££¢   ŸŸžŸŸŸŸŸžœššš›•ˆŠld\VO9-FWadddbcdfhihhiigfffdb`\TG4$$*17<?DFFFDA@ABEFGILMMLKIKNPPNJF=0++++02.)((*,1><%.7669=>?ANcklh`=.ERa¡ªœœœš™™šœœžžŸ  Ÿžž  ŸŸžžŸŸ ¡ ¡£¤£¡ Ÿ   ¡¡¡ ¡¢¡¢¢¢¡¡¢££¢¡££¢¢¡¢££¡   Ÿ ¯º¶¤„@ %›¤™˜˜™š™˜–—˜™˜—˜˜¥µ½¶Š0$‹¡¤”¡§ƒ)'%$$%&%&),*% !  %/Fl…†…„ƒ„†‡‡‡ˆ‰‹‹‰…††‚nZLB0 rˆ•””““”•–—˜ššž¦œ|b-&>Xƒ”š¤¦£¢¢£¡ŸŸ ¡¢¢¢¢¡¡¡¢¢£¤¥¥¤¡ ¡£¤£¢¢¢£¥¥¥¥¤¢ žŸ ¡£¤¤£¢¢¤¦¤¡¡££¢¡¡¡¢£¢¡¡     ŸŸŸžžž›š–Œfe_XO9">Uadddbbcfillkkkhfdddc`VI5#$-38=@CFIIHFEDCAAB@?BDEEDCCDD@<:71*'((*02-(&(++.98$ -468:<>ABMblkeU3,DTgœ¢›œ››šš›œœœžŸŸŸŸŸŸ¡¡ žŸ Ÿžžžž ¡ ¡¢¤¤¢  ¡¡¡  ¡ ¡¡¡¢¢¢¡¢££¢¡¡££££¢¢¢¡ ¡¡Ÿžž ¨²´°¡^ #Ÿ¯œ—–˜˜˜˜—˜™˜–—˜¥®°¬™c&o¢ª’’“£¨›`###$%'('(*-+%"!!&/Ei|„‡†…††‡‡‡‡‡ˆ‹Šƒƒ‚oZLB0!{‘Œ–––”““”••—› ¡—v[+/Rh‚–˜ž¤¢¢££¢¡¡¡¡¢¢££¡¡¢£¢¢¢¢££¢¢¢¢¢  ¡£¥¥¤¥¥¤¡Ÿ ¢££¢¡¡¡¢£¤¤¤£¢  ¡¡¡¡¡¡¡¡ ŸŸžžžŸžœŸŸ••`d`YO70L]cccaabeimnmlkhdcccaU? !*39>CGHHIKHFFEB=;<;:=>>>==>>7.').,'&&').0,'%(+,-30" -47;<=?AAK`jlfS/*ATgœ¥žœ™š›œœœ››Ÿ¡       Ÿžž ŸžžžžžŸ  ¡¡¢£¢  ¡¡¡¡¡ ¡¡¡¡£¢¡¢¢£¢¢¡¡¢£££££¢  ¢¢ žžŸ ¢­±¹®iO¦¥˜˜–––—˜˜™™˜˜¦µ¹ j‹¡ š’•¥¯©|1 "%'())),-+%   &1Gf{Š‡†„…†‡†‡ˆ‡ˆŠ‰€‚‚€q[J>. ƒ™–š—–”””””™œ¢—„rS-[x‹”™˜š   ¢£¢¢¢¢¡¢¢£¢¡¢¢¢¢¢¢¡¢£¤¤¤¢¡ Ÿ¡£¥¥¢¤¦£¡ž¡£¤¤¢¡¡¡¢¥¥¥¦¦¥¢¡  ¡¡¡ŸŸ ¡¡Ÿœ››  žŸŸ¡£Ÿ’’Žcc^XN6 <W`acbabeilnmllidb`\]?"&09@EJMLJIJD>==:41234688788:7+#&%$%'*,-+&$*///0* !-49<<<=>@J_imhT+)>Rj©ž›™™›œœ››ž         Ÿ    ¡¢¡ŸŸ ¡¢£¢¡¢¡   ¢££¡ ¡¢¢¢£¢¡¢££¢¢¡¡¢£¢¢£¤£¡¡¢¢¡ Ÿ  ¡¢¬¹ÀµŒAB•­°ªšš™—––—˜™ššž§°°¢…(Iœ«˜‘‘‘’““š¨«¡["&)+,,*+-*%!  !&3Kfx‡…„„†‡ˆˆ‰‰ŠŒ‹†ƒ„ƒ€sZD6)ƒ™˜œ˜™—•““’’œ£”wwkH$6a˜  ¢¡ŸŸŸ ¡¢£¤¡Ÿ¡¢¢ ¡¢¢¡¡¡¡ ¡¢¢¢¡¡¡Ÿ¡¢£¥¤  ¡  ¢§¥¤£¢¢¢¢¡¥§§¦¦¥¤£¡  ¡ žž ¡Ÿœ›šœ  žœ•–•daZTL4$FY_ccbbfiklkiihd]Q>()6?GKMNMIFD>7541,''*,/3226;?<. #%$%&(+,+(%'06520+ "08:<<;;<?K_jmgN&)>Tn£œ›šš›œœœŸŸŸžŸ         ¢£¢¡¡¡¢££¡¡¢¡ Ÿ ¢¤£¡  ¡¡¢£¢¡¡£¤£¢¡¡¢£¡ ¢¥¤¢¢¢¡¡    ¡¡¡¡®®«QM•³·»µ¦›–—™˜————˜˜¤¸¼±”G ! p‹ ¥‘‘’’“””“—£­²©’xD %(+,,+**($! !!$3MerŠ†„ƒ„†ˆ‰‹‹ŠŠ‹‹‰‡‡„€sY@1%†™™š™›™–“’“–š «švp]7-Eo†Ÿ©¢£¡¡  ¡¢£¤¤¢ ¡¢¢ ¡¡¡¡¢¢¡ ¡¢¡  ¡£££££¤¤ ŸŸ¡¤¦§¥£¢£¤¤¤¦§§¥¤¤¤£¢  ¡¡žžž ¡ ŸžžŸœœ™“••’’“maWQK50O^ddddfiiihd_c`O2!!'1>IOOLJIHE@;7785,$"%(,-)+4?IG:,# #%&(+,+'%*6=:51-"#2;<<<<;;>LakmeD"(?Uv¤œ›š›œžŸŸžžžžžžŸŸ    ŸŸ ¡¢¢¡¡¡¢¢¢¡¡¢¡  ¡£¤¢¡  ¡¡¢¤£  £¤¤£¢¡¢£¡Ÿ¡¤£¢¡¢¢¡     ¡ ¡£¥®³¨A "'I¨ÀÍÏÊÆ»¸·´©Ÿ˜•–—™¢­±©—V  !""! “£ ™”’““““””“’“£­®±­“i(!$'*++*))'#  !""%2MftŒ‡…„……‡ŠŒ‹‰ˆ‰ŠŠ‰ˆ…‚qYB2%%¢ ˜˜˜—•““”—™œªšp`K'3P}Œž™œŸ   ¡¡¢£¢¡¢¤¤£¡   ¡¡¢¡¡¢£££¢£¤¤£¢££££¤£¡£¥¦¦¥£££¤¤¤¤¦¦¡¢£¢¢££¢ žžŸ  Ÿžžžž™™šš——›ž–pcXRL77_`bccddc`\ZF0! &/:CMQOJIJKKFA>BC>4)%')(",>LOHC8+"%%&(++)&+7==82.''2:<==<;<?Lalla:(A]‚¦­œ›š›œž  žžžžŸŸŸŸŸŸŸŸŸŸ ¡¡ Ÿ ¡¡¡¡¡¡  ¡¢¢¢¡ ¡¡¡¡££¡¡¤¤£¢¢¡¢¢¡Ÿ ¢¡   ¡¡  ¡¡¡¡    §·º°šX!`Ÿª©µÃÀ±–}‰–£­±²´¶´´»½µœ[ !!!""#"! 9‚¢ž•–”““’’““““’“““— ¬³¯¥‰h2##"#&(**))*($  !##&3Njzˆ…„ƒƒ…‰‹‹‰‡‡ˆŠŠˆƒoYE5%/”¤—–”•–•••–˜˜–£˜mP7!%?]„‘Ÿžš› ¡¡ Ÿœž¢¡¡¤¥¥£¢  ¡¢££¢¢¤¥¦¥¥¤¤¢¢££¢¢¤¦¥¤¥¦§¦¥¥¤¤¥¤¢¢¥¥¢¡¢¢£¥¥¤£ ž ¡¢ žœŸ ŸŸ›š››˜˜˜¢“€kbWRN8@U^aa_ZXK>2&%1;BGNQQPQRQPMGBCA;2*(+("8JRTQE7( "%$$&)+*(+3;@>5/*+49<><::<?Lakk^3.ET†¯µœ››œœœŸ¡ŸœŸŸžžŸŸŸ  Ÿ ¡ Ÿž ¢¡  ¡¡¡¡¢¡  ¡¡¡¡¢¢¢££¡ ¢£¢¢¢¢¢¡¢¡¡¢¡¡¡¢¡¡  ¡¢¡¡¢¢¢¡ žŸ ¡£«©µ±vm““‚qU21_zŽŸ­³¯¡j "!!#$$""##"!ƒ¬¦˜”•“’’’’’’‘’’’““”““š±²±³¬‡I'&$$&(+++-.+&" "$$(4Os€’Ž‡…ƒ‚…ˆŠ‹‰‡ˆˆŠŠˆ†‚t[G6%'?™¥‘’””––—™˜• —nI(,J^‰—¢¡™™¡¡ Ÿ››Ÿ£§¥¤££¡¡¥§¥¤££¤¤¤£££¢¡¡£¢¡  ¤¥¥¥¤¤¤¤¤¥¥¥¤¢¢££¡ ¡¢¤¦¦¥¤¤ Ÿ¡¡Ÿžž Ÿžœœœ˜——ŸhbXSP8@]XXPC(# ,8@EIOSUWZZWRMHA<6/+(*.&+@NVSH=1)%#"#&(**()-7@?70*+48;;:9:<>Lajie."4IK|±·œš›œœ›ž¡žœžŸžžŸŸŸ   ¡¡¢¢ Ÿ ¢¢¡¡¡¡¡¢¡  ¡¢¢ Ÿ¡¢¢££¡ ¡¢¢¢¢¢¡¡¢¢¡¢¡¡¢£¢¡¡  ¡¡¡¡¢¡¡ŸžžŸ ¡¡¥±¼¯q!"""!$%$##$$#!G†¢ ‘“”’‘“’‘‘’’’“““““’’”“‘ ®®¦˜j*('&&(,./01-'# ! !#$)4Huƒ‰…ƒƒ…ˆŠŠ‰‡‡ˆŠŠ‰‰„{]G4#%[ ©’“••–—˜–\@-Qdš¡Ÿ››ŸŸžœ›š›ž¢¥¤¤£¤¤¤¥¦§¦££¤¤£¡¡¢¢¡¢¢¢¡¡¡£¥¦¥££¤££¥§§¦¤¤£¢¡ ¡¢¥¦¥¥¦¥¡Ÿ¡¡Ÿžœ›œžžœš˜—œ‘‚ecZTP9'<6/ "2>DHNUX\^_^ZTMD;2,('&(,$8KSRJB;3*$#$&(**(()0;<6/()38;:889;=K`iif("6LHw·ºš›››žŸ›œž ¡¡  ¡¢¢¢¢ žŸ¡¢¡¡¡ ¡¢¡Ÿ ¡£¢ Ÿ¡¡¢¢¢¢¡¡¡¡¢¢¢¢¡¡¢££¡¡¡¡¢¢¡  ¡¡   ŸžžžžžŸ   £¯³®G !##"""$%%$#$%#!}¢Ÿ•’’’“‘‘‘‘““’‘‘’’‘‘‘Ž›°´¬›†T**('(,02222.'"!"! "#(3Eu‡ŽŒ‹‡ƒ„†ˆ‰‰‰ˆˆ‰Š‹Š†‚x]E1 2n ›‘‘‘“”••›—–„H:!2_y›¡œ›™œŸŸŸœžŸŸ ¤¤¥¤¤¥¥¦¦¤££¤£¢¡£¥££££¢¢£¤¥¦¤¢¢¤¤¤¥¦¦¦¥¤¤£¢¡¢£¤¤£¤¥¤ žŸŸžžžš›œ››œœ›˜˜’`e^WQ:#5BINTZ^``^\XQH9( "$&'#.BHJJD>7/'%%')))(&&)/21,%&19;:9:;<=J_jje! 4LJw»º˜œžž››œœœœœŸ Ÿžž ¢¢¡¡ žŸ¡¡¡¡ Ÿ¡¢¡ŸŸ¡¢¢  ¡¡¢¡¢¢¡¡¡¡¢¢£¢¡  ¡¡¡   ¡¡ Ÿ   Ÿ  ŸžžžŸŸŸžžžžž¢ªª‰. !!!"##"!"%&%$###"B„ ¢‘’“’‘‘‘’““’’““’‘‘ŽŽŽ’¤«©žw:*)(').23211-'"  ! !!  !(3Gw‹ŽŒŒˆ„„…†‡ˆ‰‰‰‰ŠŠŠŠt[C/N{›Ž‘“““”””“™•Ž}J1&6d„ ¡˜š›œŸ  žœŸ  ŸžŸ¢¤¤¤¤¤£¤¥¥¤¤¥¤££¥¦¥¤¤¥¥¤¤¥¥¥£ ¡£¤¤¤¤¥¤£££¤££¤¤¤£¢£¤£ žžžžžžœœœœœœœ›˜•™of`XO;,@MQW[^_`^ZVOC5$#&&"#5=CGB;7/)%%&'(*+)%"!"%%"$.8;9:<=<<J`lkb/I?o¸·›œŸž››œžžžŸ ŸžžŸ¡¡ ¡¡  ¢¢  ŸŸ ¡   ¡¡¡¡¡¡¡¡¢¢¡¡¡¡¢¢¡¢¢¡ŸžŸ   ŸŸ ¢ Ÿ ¢¡Ÿ ¡ ŸŸŸ  ŸŸŸŸŸžŸ¦®«ŽZ!$'&$$$##"!"$&%$"!!0„¡¥š““”“‘‘‘‘‘‘’“““““‘Ž‘š©ª¢’\)('')-120.-+'#! !! !"!!!"(4Ht†Œ‹‡………‡ˆ‰ŠŠŠŠŠ‰ˆ}mXB-f†—“‘“””••”“”€rE(%:k‡œš—ššœŸ  ž›œ ¢¢ Ÿ ¢¢¡¡¢¢¢¢££££¤¤££¥¦¥££¤££££¤¤ŸŸŸŸ£¤¤¤¤£¢¢££¤¦¦¥£¢¢£¢¡ žžžžŸŸœ››š›››š—“…sic[P="2EPTY]^][XTN?) %(($(7DLE:4-(&$%&).30'!,799;=>=<Kblka*G>r··™žžžœœŸŸ Ÿžž  ŸŸ ¡¡ ¡¢¡¡¢¡ Ÿžž ¡¡¡¡¢¡ ¡¡¡ ¡¡¡   ¢¢¡ ¡¢¢ ŸŸŸ  ŸŸ¡£¡Ÿ¡££ Ÿ   ŸŸŸŸŸŸŸžžŸŸ «°ª]"%(+($%%$$#"#%&&$#! l“ž¡—•”“’’‘’“’‘’’’““”““’‘ŽŽŽŽš«®¨Ÿ-)&%&),-,*)(%#!  !"#!""! """'1Dl|ŒŒ‰‡†…†‡ˆ‰‹‹ŠŠˆ†yjVA.mŸŸ”““““”––”’ˆze=##;\œœŸœœž ¡ œœŸ¢¢¡¡¢¡ žŸ¡¡  ¡¢¢£¤¤£££¥¥£¢££ ž¡¥¥¢  ¢¤¦¦¥¤£££££¥§¨¦£¡¤¥£¡ ŸŸžžŸ›™™˜™››™—•”‹…mlg_S>$6HRVZ\\XSOG<*"'*+*%"! 7KUL;3,('%#$(/88. .789=>>>>Ndlia)@>y·ºžžžžžžžŸ ¡Ÿž    žŸ ¡ ¡¡¡¡¡¡  ŸŸ ¢£¢¢¢¡  ¡¢¡¡¡ ¡¡¢¢¢  ¡¡¢¢¢      ¡¢¡Ÿ¡££¡Ÿ    ŸŸŸžŸŸžŸ¡¡ ¡¥¦§ž|"&()+'$%%&'('&&&%$#" :’«©–•–•“’’“““’‘’’’’’’’‘ŽŽŽŒŽ•—›1+%#"#%&&&$"!  !#"!""! !##"&0Idv‹ŒŒ‹‰‡‡††‡‡‰ŠŠ‰‰ˆ…}mXA/n–£˜•••“‘“––•‘‡…tT,+Jdˆ–ž¥¤ŸžœŸ¢¡žž¡££££¢¡  ¡  ¡¡¢££¤£££¢¤¥¢¡¢¢¡Ÿž¥¦¤£££¤¥¦¦¤££¤¤£¥§§¥Ÿ £¦£¡¡¢¡œœžŸžœš™˜™š›˜——˜“ˆoolfX@ 2EOTVWTOG;*#&(+--./%5LXO:1+)*("!'1:=5% 188<@><=@Qglh^)HOz¶»ŸœœœœžŸŸžž   ŸžžŸ    ¡¡  ¢£¡  ¢£¢¡¡¡  ¡¡¢¡ ¡¡¡ ¡   ¡ ¡¢£¢   ¡¢¢¢¢Ÿ ¢¢¡ŸŸ¡¡  ŸžžžžŸ  ŸžŸª°¤x$ "%''(('%%%&*+)&%$#""!l—š ¡““”•–“’“““’‘’’’’‘’’’’‘‘‘‘‘ŽŠ‰0+$  !"   "##"!""""!"!!%1Hbu‰ŠŒŒˆ††††‡‡‡‡‡††‡‡‚sY@/s™£”•––•••”Ž‡cC 2MW„–¡§ŸŸžŸ¡¡   ¡£¤¤££¢¡   ¡¢¢¢££¤¤¤¤¤¤¤£¢¢¢£¡ ¥¦¥¥¤£¡¡¤¦¥¤¤¤£¢¤¦¦¤žŸ£¥£ŸŸ¢¥ žŸžœ›››ššš˜—˜˜‹ynpj\B"*ALNNMH>3$#$%*-.170(?KF70-+.+" '2>?7&#!$289>@>=>ASgmh\+HNy´µšœœœœœ›œŸ   ŸžŸ    ¡¡ ¡¢¢¡  ¡¢¢¡¡¡ ¡¡¡¡¢¡¡   Ÿ ¡¢¢  ¡¢¡ ŸŸ ¢¢¢¢¡¡¡¡¢ Ÿ ¡  ŸžžŸŸŸ ŸŸžžŸ¦±³ªŠ5!&)((((&%%$$()'%$"!Nž²¯Ÿ””“”•–”“’““’‘’“’‘’’’‘Ž‘ŽŒ‹Š/+$ !""$&'&$$##$%#"! %3Ic|‹Œˆ……†ˆ‰‰‡„„ƒ„†„ƒyXA/v›¤“”––‹””“–•R7!.R_‡š¡žžž  ¡¢££¢¢¢¢¡¡¡ ŸžŸ££¢¢¢¢¡  ¢£¤£££¢¢££¢£¤¤¤£¢¢¢¤¥¥¤¤¤¢¢¤¥¤¢ŸŸ¡£¢ŸŸ£§¦¤ Ÿœœœž›šš˜˜™š‰ˆ€usn^E%6CDC=/$$$%),-186(,:;88511-"%2@A6$&)+279=>>?@CSflg\,G:s³±˜›œœœžœ›œœœœžŸ ¡ žŸ ¡ Ÿ          ¡¡¡¡¡ ¡¡¡¡¢¡ŸžŸ Ÿ ¡¡¢¡¡   Ÿžž ¡¢¢¢¢¢¡ ¡ ŸŸŸŸŸžžŸžžžŸŸ¡®±¨…B#  !%'&&&&%$#"#$#""#!eŽ¢«¨”••”“”••”“’’’’’’’’‘‘‘‘’’‘Ž‘‘ŒŒŒŠ/,% !"%()*,-*(&%$%%#!%2Gf€‹‹Šˆ‡ˆŠ‹Œ‹‡„‚„ƒ{YA,|¢“”–’Œ““”™uC,'7\v”—›œœœž   ¡¢¢¢  Ÿž  žœœ¢¢¢£¢¡¡ž›–£¤¤¤¤££¤¤¤¥¥¥¥£¢£¤££¤¤¥¥£¢£¤£¢¡¡¡¢¡ž¡§¥££¡Ÿ›œžžœ›š˜˜œ™‡„€zun^D%".1.% %%&)-/3882#"26;A;43.$!%1CC3#(/26:<<;<>@CRejdX.I:u¼´˜œœœŸŸžžžžžžžžž ¡ žŸ ¡ ŸžžŸ Ÿ ¡ ¡¡   ¡¡  ¡¡¡¡ žŸŸŸ  ¡¡¢¢¡ŸžŸŸžŸ ¡¡¢¢¢¡Ÿ  Ÿžžžžœœœžžœž§±²šG   !"##$%$"""""!  !A°¬›””••“’“”““’‘‘‘’“’’‘Ž‘‘‘‘‘ŒŒ‹ˆ/,%!""#&(+/24540,)'%%$$"!!'0Ek‚‹‰ˆˆ‡ˆ‹Ž‹‡ƒ€{U>*„£ž“”•’ŽŽ“’“–‡m7&/Fm†ž“™žœ›ŸžžžŸŸŸŸŸžžŸŸœœžŸŸ ¡¡¡¡Ÿ¢¨¥£££¢¢££¥¦¥¥¤¢¡¢¤¤¤¤¥§¦¤£¡¡¢£¤£¢¢£¥§ª¤¡¡¡ žžžŸžœ›™˜˜›œŠ„|xq^E$ %'(*.0479:-)2;@933-%"$.>=*,488;><:;=ACQdh_K0J2zÄ»š›››œžžŸŸŸžŸŸŸžžŸ ŸŸŸŸ   ŸŸŸ  ¡¡  ¡ Ÿ ¡¡ŸŸ    ŸŸžžžŸ ¡¡ ¡¡¡ŸžŸ ŸžŸ ¡¢¢¢ Ÿ ¡ ŸžžŸžœœžžžœ›œœœœœž¬¶§y1  !"""!!"#"! V“˜œ’“““”””“””’’’‘‘’“’’‘‘‘‘Ž’’ŽŒŒ‹‰.+$#%'(*,.05:>@?:62.)&%%%$#$)2Fj…‹ˆ‡‡†‡‹ŽŠ‡€€„{U=)©™‘’“‘’”’•”`4 0K{£ž”•žž›šœžžžžžŸžŸŸŸŸžžžœ›œž ¡¡¡¢¥¥¥£¢¢¡¡¢£¥¥¥¤££¢£¥¦¥¥¥¦¤££¢¢£¥¥¤¡¡¤¦§©ŸœŸ¡¡¡  Ÿžœœœš™˜›š‡„‚}{scJ( %&'*-037;>6!+9>5/1,%"#*74 '19>=;;:;;=ABPcfZ?1J1tÁº˜š›œžžžŸŸŸŸŸžŸ Ÿ ŸžŸ ¡¡ Ÿ ¡¢¢¡¡¢¡  ¡¡ ŸŸŸŸŸ   ŸŸ ¡¢¡  Ÿ ŸžŸ¡ ŸŸ ¡¢¢ žŸ ¡¡    ŸžœžŸžžœ›œœœœžŸ­©ž†* !!!  0†ž¡¥—•”“’’““’’’’’’‘‘’’‘‘‘ŽŽŽŽ‘ŽŽŽŽŽŽŽŽŒŠŠŠ‰+)$$(+.2567<DJLKIC=81+'%%%%%%)4JjŠˆˆ‡††ˆ‹Œ‹‡‚€‚€€qP<)“§‘‘‘“•–—–ŒvS'%9Z…•¤¡™Ÿžšœ  ŸŸžŸ ŸžžŸŸŸŸŸŸžžŸ Ÿ ¡¡  ¡¢¢£¢¢¡ Ÿ ¢£¢¢£¤¥¤¤§§¥¡¢¥¤¢£££¤¦¦¥¡¢¤¥£¢šž¡¡¡¡ žœš››™˜—”†‡†€€jO. #$'),/26<@=/ 4:0-30&##'/* +158;=;8:>>>?@PceW82J3m»¸˜šœžžŸ Ÿž    ŸžžŸ¡¢ Ÿ ¡¢¡¡¡£¢¡ ¡¡¡ ŸŸŸŸ ¡¡   ¡¡¡   ŸŸŸ ¡¡   ¡¢¡ŸžŸŸ ¡¡    Ÿžžžœœœ§­¨†3  ! !# ¢–’”””““““““’’’“““’‘‘‘‘’’‘ŽŽŽŽŽ‹ŒŒ‹('#  %+048<??AIU[ZUNHB<6/)%$####'3Kgy„ˆ‰‰‡†ˆŠ‹‰…‚‚‚ƒ…{gK:&–ŸŒŽ‘”——œ€hG+DcŒ—¡ Ÿ¡¡š›Ÿ ¡¡ ¡¡¡žžŸ   Ÿ ¡ ¡¡¢£¤£¡¡¡¡¡¡¢¢¡ Ÿ ¢¤£££¥¦¦¦§¤ ¡¢¥¦££¤¤¥¥¦¥¥¥¤£¢¡žœž¡¡  Ÿœ›ššœœš˜–’‹ˆƒ„ˆmP4"#')+/38=@A;)/7,.:8-(&(.%(575238:8:=?>>AQceV32KDk·¶œœŸŸŸ¡¡ žžžŸ ¡¡ žžžž ¡ŸžŸ¡¡¡¡¢££¡¡¡¡ ¡¡¡  ¡¡  ¡¡¡¡  ¡¡¡¡¡¡¢¡¡¡   ŸŸŸŸŸ ¡¡  ¡  žžŸŸœœžžœ›œœœ›ž®±¯¢e p©¯¥”’“’’’’““’’“‘‘’””‘ŽŽ‘‘‘‘‘‘ŒŽŽŒŒŒŒŒ‹‹‹ŽŒŠ%# "'.59=BHLJHP`fcZOHC=71+&$##"!%0Hf|„‡ˆˆ‡†‡ˆ‰ˆ†……„„„†‰~gP8"2™›ŒŽ‘”—Ÿš†sU;)Rl‘˜š›ž  žšššŸ¢¢¢¡¢¡ŸŸ  ŸŸžŸ¡¡¡¡¢£¤¤£¢¡¡¡¡¢¢¢ Ÿ¡£¤¥¤¤¥¦§¨ª¦£¡ž§§¤££¥¦¤£¤¥¥¤£¢ žžŸ¢¢¡ žœ›œ››š™˜™—ŒŠ‡‡ŠkU9"#%(+.18=@BC4.7-0@>30--0$)761**2878:<=?BRceS.2LHmµ¶žžžžžŸ   ŸžžŸŸ ¡¡ žžŸŸŸŸŸŸ    ¡¢¢¡¡¡  ¡¢¢¡¡¢¢  ¡¡    ¡¡¡¡¡¡¡¡   ŸžžŸŸžž ¡  ¡¡  žŸž›œ›™™›¤¦³ªcVˆž‘‘““’‘‘’“””’’““’““””’‘‘‘‘‘’’ŽŽŽŒŒŒŒŒŽŒ#!$)/7>AEKQURMUflh]MD@;72+'$"""!$.Fhƒ††††††††‡ˆ‡ˆˆ†…„†Š‚jR6$E›Œ‘’’’•–¡”tbK+$7Zx–ššž ›™›¢¢¢¢¢¢¡¡   ŸžŸŸ¡¢£¤¤¤¤¤¤£¤¤£¢¤¤££¤¥¥¦¦¦¦¦§©ª¨¦¢¢¥§¤¢¢¥¦¤¢£¤¤££¢ ŸŸ ¢£¢¢¢žœœœœ›™™š–‹‰ˆ…‰nV<!"$%'*-.19@BDF="*4.3?=760-/&'34-"$3;;::;>AESdcN'2KFk±´œœžŸŸŸŸŸŸŸŸŸ  Ÿž ¡ŸžŸ   ŸŸ        ¡¢£¢ ¡££¡     Ÿ     ¡¡¡ ŸŸ  žŸŸžžŸŸŸŸžŸŸœžŸŸŸžœœžžœ›››™™››Ÿ«º°p@Œ¯ª’‘’“”“‘‘’““’‘‘’““”””””“‘‘’‘ŽŽŽŽŽŽŒ‹‹ŒŒŽŽŒ%$!  #)09ELLNSWXRKP`fcXI@<972+&##$$$'/FgŒ†…†………†ˆ‰‰‰ˆ†„ƒ„†‚mT5+MŸ£’““““––žŽc[@%-Hmšœ˜™˜™›œœ›œ ¡  ¡¡¡ŸžŸ£¥¤ Ÿ ¢£¥¤¤¤¤¥§«ª¢¢¥¥¥¤¥¦¦¦¦¦¦¤¤ª©§¥¤¤¤£¢¡¡¢¥¥££££¢£¢¡  ¡£¤¤¤¢Ÿœœž›š™–Œ‰‡†ŒsZA&#%%(+,-18?DFGC1"--29888.)-*"*-&"5>?=<=?CGVebE#2KHk±·œœ››œžžžžŸ ŸŸŸ  Ÿž  žŸ¢¢¡      ŸŸž ¢£¢¡Ÿ¡££¡  ¡¡¡         ŸŸŸ ¡ ŸŸŸŸžœŸŸžžžžžžŸŸ Ÿœœœššš›››œœœ¬¯¥p…¡§£’’’’“”“’’”””“’““””””“““’‘‘’ŽŽŽŽŒŒŽŽ)'%#"#%,6CPYYY[][TJKTYXOD=:983+%""###(1FdwŠ‡‡†…„…‡‰Š‰ˆ‡†„ƒƒ‚oS43W ‘”””“’”—Ÿ’fU75Rn‚¢£˜™˜™š›œž ¡¡Ÿ ¡¡ŸžžŸ¡¤¨£  ¡£¤¤¤¥¥¦§ª¤¡¢¤¥¦¥¥¦¨§¦¦¦¤¤¦¦¥¥¥¥¤¡¡¡¡£¦§¤£¢££££¢¡¢£¥¥¥¤ œžŸž›™–’Žˆ‡Š”t^G,*C?!#$%(),/3:AGKKI@)"(.3368-'..#"%!#4<=<=?CFKZhcC!0JIu¸»ššššœžžžŸŸŸŸŸžŸ ¡ žžŸ ŸžŸ££¡¡¢¢¢¢¡   ¡¢£¢¡ ¡¢¢¡  ¡¢¡   ¡¢¡ŸŸ ¡¡ ¡¢¢¡ Ÿ ŸžŸ ŸžžžŸŸŸžŸŸŸœœ›š™™š›œœœŸ¢­ªopž¬£”•”“’“”’‘‘“““’’‘’““““’‘‘ŽŽŽŽŽŽŽŒŒŒŒŽŒŒ-+(%#$&-:HTYYXY[YRGDGJKF;55673+%##$$#(2Ecv‰‡ˆ‡…„†ˆŠŠ‰‡†‡‡†„ƒlP1;a› ‘”–•“‘‘’š’cK-#6Xo‰§ ™™™›œœœžŸŸŸžžŸŸ   ¢££ ŸŸ¡¢¢£¤¦¦¥£¡¡£¢¢¤¥¢¡¥§¦¥¥¤¤¥¥¤££¤¤£££¡¢¥¦¤£¡¢¤¤¤£¢£¥¥¤¥¤¢žžŸŸžžžš˜–”’‹™xeN1wtZ"#%&&&)-39@GKKKI3 '-078-(--& &38779<AEL[id@ .IKw»¼—™ššžžŸžžžžž ¡ ŸŸŸŸžžŸ¢¢¡¡¢¢££¢¢¢¢¡¡¢¢¡¡¡¡ ŸŸŸ ¡ Ÿ Ÿ ¢¡ŸŸ¡¢¢ŸŸ¢¤¢¡ ŸŸŸžŸ Ÿžœžžžœœš™™™˜™›œ›œœœ¨±§ps¡’’“””“’“’‘‘‘’“’’‘‘‘’‘‘‘‘‘ŽŽŽŽŽŽŽŽŽŒ‹ŒŽŽŒ1.*'%%'/=KQSSSSSSNE?=<=9.)+041*%#$%%%)1Fcv††ˆˆ†…ˆŠ‹‹Šˆˆ‰ˆ‡„…ydJ.6h› ’––”’’”–\<*E_w£žš››œžžžžŸžœššœžžœ¡£¢¡ ŸžžžŸ¡¢¤¥¥¤¡ ¢£¡¡£££Ÿ£¦§¦¥¤¤¥¥¥¥¥¥¥¥¥¤£¢¤¦¦¤¢¢¤¥¥¤££¤¤£££¤ Ÿ Ÿž›˜–—–•‘Ž’™ƒoS5†J#$%#!"'-6?EJMNM:"'0==1.1.*&! "*375569=CKYhb80ICq¹»ššššœœœžŸ ŸžžŸŸ Ÿž ¢¡¡¢¢££¢¢¢¡¡ ¡¡¡¢¢¢ žŸ     žŸ¡¡ Ÿ ¡ŸŸ¢¤¢  ŸŸžžžžžœœ›œžœ›šœœš™™š™™š››››œ ª²©h`–ª®’’’’’““’’‘‘‘‘’’‘‘‘‘‘ŒŒŒŽŽŽ‹‹ŽŒ‹ŠŠ‹ŒŒŒ‹Œ3/*'%'*1<FIJJHGHIF=6224/&"%+0.)%$%&&')0Ectƒˆ††…†‰‹‹ŒŠŠ‹‹Š‡ƒ‚u^E-:p™—Ž‘”•””——‡S.2Teƒ”›™š›››œœžžš™™žžœ ¡¡¡ ŸŸžš™¡¢£¢¢¢  ¢¢  ¢££¤¤¥¦¥¤¤¥¥¥¥¥§¦££¤¤££¤¦§¤¢£¤¤¥¤¡¡£££¢¢¡ŸŸ Ÿžœ—–—˜—–’†vW6"Lkª•#$# '3>CJOQM= !,@A3163/.-(#"$*166568:@IUd_/4NDn··™š››œœ›œœž ¡ ŸŸŸœžŸ ŸŸ ¢¢¢¢¢££¢¡¡¡   ¡¢¢¢¡ žŸ   Ÿ ¡ŸŸ¢¢¡ŸŸŸžžŸ¡¢¡ ŸŸŸžžŸŸžœœžžœš™›œœœ›šššš›œ›š™šœœ¦¬ c$cœœ˜“•’‘‘‘‘“’’““’’’“’‘’’‘‘‘‘‘‘‘‘‘‘ŒŽŽŽŽŽŽ‹ŒŽŒ‹Œ‹ŒŒŒ2.)%$(-27<>>;9:<><3+)+-)" #(,+(%$%%$$&-B`uƒ„……ƒ„‰ŠŠŠ‰‰‹ŒŠ†‚u_D,L{”““”••£’€zF%!8XiŒŸ¡œ›œœ›œœžœš—œ  ŸžžžŸ ¢¢¢¢¢¡¢¢¡   ¡¢¤£¡ ¢£¤¤¤££££¤¥¥¥¥¥¦¦£¢£¤¤¤¥¦¦¥¤¥¤¤¥¥¡ ¢¢¢¡¡ Ÿ   œœ™–—˜˜–‘Œ]>({”¥™ $$#$5AEKTUN?%+DG66A?611.'"$*165568:?HSb]+:U<o·³˜›œœ›œžžŸ¡¡¡¡¡ žžžžŸŸŸ ¡¢¢££¢¢¢¢¡¡¡¡  ¡¡¡ ¡¡¡¡¡¡ Ÿ¡¡  ¡¡¡ ŸŸŸ   ¡  ŸŸ ŸŸ  Ÿžžžžžœš™›œœ›šššœ›™™˜™›œœ¤³²†K•¨—‘””’’‘‘’’’’‘’“’‘‘‘‘’‘‘‘’’’‘ŽŽŽŒŒŒ‹ŒŒ‹ŒŒŒ‹‹‹Œ.+'$#(.000/*''+163*%$'*'#"$')*(&%%%$#$+?^sƒ„†…„†ˆ‡‡‡††ˆŠŠ†ycE)Xz‹Ž‘“•–™›ˆqjA$&3]s¢¤œ›œœžžœœž¢¡ ŸŸžžŸ¡£¤£¢¡¢¦£¢¡   ¢¤§¦¢¡¢¤¤£¢Ÿ¡¢£¤¤¤¥¥¥¤¤£¢£¤¤¤¤¤¥¦¦¦¥¥¥¤¢¡¡¢¡¡¡¡¡¡¡¡Ÿžž›˜—–––•–“”…aH1Eƒ•‡‰™ "$$5DFKX[TD-'@C7>OOA41/)%',255579:>GTaZ#;WL}»¶™œœœžžœŸŸžžŸ ¡¡¡¡   ŸŸŸžžŸ  ¡¢¢¡¡¢¢¢¢¡¡    žž ¡¡¡ ¡ Ÿ  ŸžŸ    Ÿ    ¡  Ÿ    ¡¢ žžžœš™›œ›››š™››˜˜™š›ššš¨¶³‘`!D†–ž˜’’““”“’’’’’’‘’“”’’’“““’‘’’’‘‘’‘ŽŒŒŒŒŒŒŒŒŽŽŒŒŒ)'$#$(-.,(""(-+%!!$'&$$&'(('%$$%%#%,@_u…†ˆˆˆˆ…„„„„…‡‡…}vhF&]~‘“‘’””–•„ma3 /Ak€‘ŸŸœœŸ ¡ŸžŸ¡ ŸŸžŸŸ ¢£¢¡¢£§¤  ¡¡¡¢¥¨§¤¢¢£¤£¢¡¢¤££££¤¥¥¤££¤¤¦¦¥£¢¤¦§§¦¥¤£¢¢¢££¢¢££¡¡¢ Ÿš˜—–•˜š”Š‚lU4&¦…™•!#&3EHN[`[K5'"8=5@VZK:30*'*/355568:>GTac5PW‚µµ›žžŸžŸŸ¡¡  ¡¡¡¡¡¡ŸŸ Ÿžž ¡¢£¢¢¢£¤£¢¡    ŸŸŸ ¡¡¡¡¢¡ ¡¢      ŸŸŸŸŸ ¡ ŸŸ  Ÿ ¢£ žŸ žœœœœ›šœž››››šš›œ›ššššš™š››š¥«­§‚@.ˆ¦ª¤™’‘‘’’’’”””“‘‘“““‘‘’“““‘‘Ž‘’ŽŽŽŽŒ‹‹Œ‹ŽŽŒŒŽŽŒ‹‹$"!#&)..*$"''" !$''&'))('%$"#$%#%.Ddy„…‡‰‹Šˆ†………„„…†„‚ueD"kŽ“‘’˜“€jW%#6Sy‡ššžœœ ¤ žžŸžžžžœž£¡žžŸ     ¡¢¡ŸŸ ¢¢¢¢£¤¥¥¢ ¡¢£¢¢¤¥¤£¢¡¢££££¤¥¥¦§§¤¡£¤¥¥¤£££¢¢£¤¥¤£¤¤¢ Ÿ Ÿœ›šš˜˜šš š}wcB/kˆ•“‡†Ÿ #&+?GMX_^R<2.074?U]UD7/(',13566679>HU``,A]ˆ²¹ žœ›žŸ Ÿž  ¡¢¡¡    ŸŸ¡¢¢¤¤¢¢£¤¤¢  ¡¡   ŸŸ ¡¡¡¡¡¡¢£¡¡¡¡  ŸŸŸžŸ ¡ŸžŸ ŸŸŸ ¡ Ÿ  žœœ›œœœœ››››šššš›ššš™™™šššš™ «¶¶°­ªžiKl}‹–ž¤£¢¤£“‘’“’““’’”••“‘‘’““’‘‘’“’‘‘‘ŽŽ‘’ŽŽŽŽŒŽŽŒŽŒ‹Š! "&*//) $%#"#%())++)('&$##$$#&0Fg{„„‡‰‹Šˆ†…………††……„ŠubA ™ Ž‘¢~gK(A[zŒ™ž˜œœ™ ¢ŸžŸ Ÿžž ¢¢žž ¡ Ÿ¡£¢¢ Ÿ¡¢¡¡¢£¢¢¤¥¢Ÿ ¡¢¢¢¤¤¤¤£¡£¥¤£¤¥¥¦§©«¦££¤¤£¡¡£¤££¤¤¤¤£££¢   ¡žš›œ  œ£¨ƒsN/*IŒ£—†‡ˆ¡~""#$2@JRX[S?88'-63>U_]P;,%%.34567778?JT^\&7]“¹½œš›œžœ›œžŸŸžŸŸ ¡¡¡¡     ¡¢¡£¥£¢£££¡¡¡¢¢¡ ŸŸŸŸ   ¡¡¡¡¢¡ ¡    žž  žžžžžžžžžŸŸŸžœ››ž›š›››››ššš™š›™™™™™™˜™™˜——Ÿª°¹¾¾±x-Uu‡Œ—¨²µ³°®²² š“”““’‘‘‘‘“”“‘‘’‘‘‘’’‘‘ŽŽŽŽŽŽŽŒŒŽŽŒŽŽŒŒŽŽŒ‹Œ‹Šˆ‡ !"%)//) #&&&&'*-./,)''&$$$$#"'0Ddxƒƒ†ˆ‰ˆˆ†„……†‡‡†……ˆr^>ˆ”ŒŽ‘™ƒtZ;0N^x ¢œœ™’”žŸ œžŸ ¡ žžŸ Ÿ £§¤¤¡ £¤¡ ¢£¢¢£¤¢  ¢¢¢¢¢¢¤¥¤¤¨¦¥¤££¤¥¦¨¨¨¤¥¥£¢¢¢£££¤¥¥¤¤¤¤£¤££¤£¡œž  žœ¦™Š…VA7.'$# l’ˆ†‡‡‡›s&$$$!!6DMRUP?8:++53>T`cZB.$#+01237998>LU]Z#5VŒ¸¸–˜š›žžœŸŸŸŸžžŸŸŸ ŸŸ   ¡¡¡¢£¢¢¢¢¢¡¡ ¡¡ ŸŸŸŸŸžžŸ ¡¡     ŸŸ  ŸžŸœœžžžžœ›š™ššš›››š™™šš™™™™˜˜˜˜—––˜—––—•›®¯t&A[o~†Ž— ¥§«¯±°ª¤¥©£œ’’‘’““’‘‘’’‘‘‘‘’’‘‘’’“‘‘‘‘“‘‘‘’ŽŽŽŽ‹ŒŽŒŒŽŒŽŽŽŽŽŽ‹ŒŒ‹‹‹Š‰! $)./*"$)++,-0232.(%%%$$$"!"(0Dcy†„†‡‡‡‡†……………………„…p[<‰œ‘ŽŽŒŒ{jN+%5\h—¦§ ¡žš—˜œžžž››ŸŸžŸŸŸŸŸžŸ¡¡¤¤¥£¡¤¥¢Ÿ ¡¢¡¢£££¤¥¤££££¥¥¥¤¦¦¥¤£¢£¥§§§¦¥¦¦¤££¤£¢£¤¤¤£¤¥¤£¤¤¤¥¤¢ŸŸ  ¡¡ž›šœŽŽnYK;/*($jŸ¦ Š‡Š‹Š™i(''''$-AMQQK=:<.'22=S`faK4'$*.//048:8>LV\J":Y‡µµ—šœžŸŸŸžžžžŸ  žžŸŸžžŸ ¡¡¡¡¢¡¡¡¡¢¢¢¡¡ŸžŸ  žŸ¡ ŸžžžŸ¡¡   ¡¡ žŸ ŸžžžžžžŸžœ››œœœžžžžžžžœšš™šš››š™™™™™™š™—˜™˜—–•—–•–——–›®°H Wq‚’Ÿ¤¥§«¯°®­±´±§©ª¡‘‘‘‘‘‘’“’‘“’‘‘‘Ž‘’‘’’‘‘‘“’‘’’ŽŽŽŠ‹ŽŽ‹‹ŽŽŒŒŽŽŽŽŽŽŒ‹ŒŽŽ‹‰Š‹‹‹$" #(./+&"(.22259984.'"!"#$#""$(0Ebw†„„ƒ…‡ˆ‡†……„ƒ‚‚ƒƒ„oW9†—’ŽŠweE(-Biv‰œª¥  ž›˜˜œŸ žœ›ššžŸŸžžŸŸžž  ›¡¢¢¡¤¥£¡Ÿ¡£¢ ¡£¤¥¥¤¤¤££¤¥£¢£¤¤¤¤¢¡¡£¦¥¤¥§¦¤£££££¤£¢¢¢¤¥¤£¢¢£¤¤£¢¢¢¡¢¡œš™š•’‘{i`M;1/* Pui='!!Ac}‡™”ˆˆŠŠ‹Œ‹•–h'()))*&$9JOLE;9;3'*0>S`fcQ;,(+./..05::>JUZH#6]Ž¶¶›œžŸŸŸžžŸžŸ¡¡  ¡ žž ¢¢¢¢£¤¢ ¡¢££¢¡ŸžžžžŸ    ŸŸ ¡¢¢¡¡¡¡Ÿžž  ŸžžŸŸžŸ ŸœŸžœžŸžžžŸžœ›š™™™™™™™™™˜˜™™™—˜š™˜—–——••˜™˜—ž±³K' `„™¦§§¬®­®²³§žž—‘‘‘‘’““‘‘‘‘‘’“’‘‘’’’‘‘Ž‘“’‘’‘‘’’’’‘ŽŽŽŽŽŒŽŒŽŽŽŽŽŽ‹ŠŠŠŠ‰%#"!$)/21+% !'/5778;=<94-&!!#####$'0Hcs„‚ƒ†‡†……„…„‚‚ƒƒ‡pV8†–“”’’‘‘’ƒkX9!!3Il•œ›ŸŸ Ÿž™˜› ¡ŸšœœœŸŸŸŸ ¡ žŸ¡ œžŸ ¡¢££¡ ¡¤£¡ ¢£¤¤¤¤¤£¢££¢ ¡¤¥¦¦£¡¡¡©§¤¤¦¦¥¤££¤¤¥¤£¢¢£¤¤¤£¢¤¤¤££¢¢¢¢ š››Ÿš’Žnl_J>;5(2`Ÿ¬Ÿš“‘œ¤¨¥˜‡…‡ŠŒŒ‹Š‹“Œb&&'(*-/+*BJFA:7740&.@S`fbSA1+-//../4;>@JTXE"/Z”º´ŸžžŸ    ŸŸ  ¡¡¢¢¢¡  ¡££££¥¥¢ ¢£¤£¢¡ŸžžŸ ¡¢¡¡¡¡¡¢¢¡¡¡¡ŸžŸ ŸžŸ ŸžŸŸžžŸŸžœœœžœœœš˜——˜˜™™š™˜™™™˜—˜š›š˜—˜—•”—™™™™›ª§ŸD gŒ¤­°²¯ –•”‘’’‘‘’’’’’’’‘‘‘’‘‘’’‘‘‘‘‘‘‘‘‘‘’‘‘“‘‘’’‘‘‘Ž‹ŽŽŽŒŒŒŒ‹ŒŽŽŽŽŒŒŒŒŒŒŠŠŠ‰ˆ‡‡&%$#&*2884,'$#%-689:99:84/+'" !#""""#&0Hdv‚„ƒ‚ƒ†‡……„ƒ„…„ƒ„‡‚oY7(‹š–’’’’—”€^J+#9Plƒ¢¦™›žŸŸš˜š ¢¢œž››œžžž¡¥¥¡ž ¡ ŸžžŸ  Ÿ   ¢¤¤¢  ¡££££¤£¢¢¢¡¡£¥¥¥¤¢ ¡¤«¨¤¤¥¦¦¤£££¥¦¥¥¤££££¤¤£¤¤£££¢¡¢£¢žŸ œ•’…uujNIJC0#?f£¬š¢¥¨¨•Œ†……†‡‰‹Œ‹Š‹šƒX%$%(+19:.7D?:63214./BP]d_QA2---....29=@IQTA"1R¹®ŸžžžžŸ¡¢¢¡ ¡¢¡ ¡¢¢¡¡¢¢¡¢£££¥¥¢¡¢££¢¡¡¡ ŸŸŸžžŸ ¡¢¡¡¡¡¢¢¡  ¡¡ žžŸžžŸžžžžžžžŸžœ›››œœœœœ›™˜˜™˜˜™šš™š™™™™™›œ›™˜˜—–•—˜™˜—––¨±¯Ÿo&h—¯®©ª­­£™“‘‘‘‘‘’’’’’’‘‘’’’’’’’‘’”“‘‘’“’‘‘‘’‘’‘‘““‘‘’’‘‘‘‹ŽŒŒŒŒŒŒŒŒ‹‹ŒŒŠ‹ŒŒŒ‹Š‰ˆˆ‰$#""&,6=@<5/,*,29;=>:731.*(&#!!! $.D`tƒ…††††………ƒƒ„„„ƒ‚ykY4 -‰›”’’““™}T<% ';Zu ¥™™šŸžœšœŸ¡¢›š›œ› ©¤ž›ž ¡¡Ÿž ¡Ÿž ¡¡£¤¢ Ÿ ¢£¢¡£¥£¡£¤¤¥¥¥¤¢¢¢£¥ª¨¦¥¥¦¦¥£¢£¤¥¥¥¥¥¤££¤¥¥¦¥¤£¤£¢¢£¢¡¡¡™•’†{…|USWQ:)Jp¡”ŒŽŽŒ‹ŒŒ‰ˆˆˆ‡ˆŒŒ‹‹P '%$'-6?D<&+<:421..66"1DNY`]PA4-+*+./147:>IQR;#6SŠµ®žŸ  Ÿ ¡££¡¡£¢¡¡¡¢¢¡¡££¢¢¢¢£¤£¢¡££¢¡ ¡¢ Ÿ ¡   ¢¢¢¢¡ ¡¡    ¡¡ žž ŸŸŸŸŸžžžžžžœž Ÿ››œœœœœ›››šššš™˜˜š››™™˜˜™š™™šš™˜˜˜—–—˜˜—–••–œ ­²§š‘‹yƒ•§¸½¹¢š–•––•”“’‘‘’““”””’‘‘’’’“““‘‘“”’‘‘’’‘‘ŽŽ‘’’“’‘“”“‘‘‘‘’‘‘’’‘ŒŽŒŒŒŒŒŒŒ‹‹ŒŒŠ‹Œ‹‰ŠŒŒŠŒŒŠŠ‰Š‹ $,7>BA;75557:>@@;4.,+(%$#""!#,@Zq|‚‡ˆ‡†††‡†„„„……‚~xjS0!)†œ–’’’–š†uS0 !!.IfƒƒœŸš˜˜›žœš›œ››œœ›››š—— ›”œŸ¢¢ŸŸ¡¡ žŸ ¡¡ ¢¢  ¡££¡ £¤¢¢¤¥¦¦¥¥£¢££££¥¦¦¥¤¥¦¦¤¢£¤¤££¤¥¤££¢¤¦§§¥¤¤£¢¢¢ Ÿ  œ™š˜‡•ˆAY`[?!$Lm Ž‹Ž‹ŒŒŠŠŠ‰‡ˆ‹ŒŒ‹•rA '%$&.:BGD7" /3100-.:@,-@ISYWL@4-*)),/2788>JQO7%;^Ž·²¡¡¡ Ÿ¡¢¤¤¡¡¡¡¡¢¢¢¢¢££¢¡¡¢¡¡¢¢¢¢££¢¢¡¡¡   ¢¢¢¢¢££¢ Ÿ ¡¡  ¢£¡ŸŸ¡ ŸŸŸŸŸžžžžžœž Ÿžžœ›š››š™š››š™™š››™™˜—™›˜—˜˜˜——™™˜—˜˜—–•”•–••¨´´³´±¬©¦¡œ“’‘‘‘“”•–••“’’““””””“’’‘’““““‘‘““’’‘‘‘’’’’‘‘’‘‘’‘‘“•“’‘‘‘‘’“’ŽŽŽŽŽŽŒŽŽŒ‹‹ŒŒŠŠ‹‹Š‹Œ‹Š‹‹ŒŒ '19>?=:8:99=@@=71+('%"!""  %,>[u~„‡Š‰‡‡ˆ‡†„„„……{iM-#,‹ •’’‘›–oL( !&7Vs†ˆ ¡š——šžš™š™™š››œœ››™˜’œš–šž ¡  ¡¡ŸŸŸ   Ÿ ¡¡ ¢£¢¡¡¤¥¤£¤¥¤¥¥¥¤£¤¤£££¥¥¥££¦¦¤£¤¤¤¢¢££££££¢£¥¥¤££££¢¡ŸŸ›š˜‘ŽŸŒ9_jeJ&.Wq¤”ŽŽŽŒŒ‹Š‰ŠŠŠ‹‹ŒŽc3 '&&(0>FJIC0!)-/0-/@F1 4AKPNE<3-*+++-169;ALQL2%:_¸´£¢¡  ¢¤¥¥¢ ¡¡¢£¢¢¢¢£¤¢¢££¢¢¢££££¢¢¢¡¡¡   ¡£££¢¢£¢¡  ¢¢¡¡£¤¢žŸ¡¢ ŸŸŸ  ŸžžžžžŸžžžž›™š››™˜™›œ›™™š››š™˜—™š™——˜—–—™™™˜™™—•”“”••–——˜—˜™™—••–•”“’““””••””“’’“’’’“’‘‘‘’““’’‘‘‘‘’’’‘’’‘Ž‘’“‘‘‘ŽŽŽŽŽŽŒŒŽŽŒŒŒŒ‹ŠŠ‰‰ˆ‰ŠŠŠ‹‹‹(07:;96666:;:60+'$"!!!!  !%-Bbx€„‡ŠŠ‰ˆ‰ˆ†………††‚}fH+:’¡’“’•xgE'!!"-C`r„‘Ÿš™—–šŸš˜™˜™›œœœœœ›˜œ¡Ÿžžžž  ¡¡ ŸŸŸžžŸ  ¡¡¡¢£¢¡¢¤¤£££¡ ¡¤¦¦¤££¢££¤¤¡¢£¦¥¡¢¤¤¤£¢¢¢¡¡££¡¡£¤£¡¢¤¤¢Ÿšœ››˜“¤ŽRqyQ#:`}¢“ŽŒŒ‹Š‹ŠŠŠŠŠ‰”—U''''*2?HLMJ;!(,-*/AG3!"7DHE@:4.))+++-39<BMPH.#7_“¸³¢¢¡¡ ¢£¤¤¢¡¢£¤¤¤££¤¥¥££¤¤£¢¢££££¢¢¡¡    Ÿ ¢£¢¡ŸŸ  ¡¡¡¢¡¡¢¤¢žž ¢¢  ŸŸ ŸŸžžžžžžžœœœ›š››š™™™š™™™™™™šš™—˜™™™————–——˜˜˜™™—•“””•••–—–––——–•••••”””””““”“’’‘‘’’’‘‘‘‘‘‘‘‘‘’’’ŽŽ‘‘‘‘ŽŽŽŽŽŽŽŒŒŒŒŒŒ‹‹ŒŒ‹ŠŠˆ‡‰‹‹Š‰ˆˆ'.47620004542.*&#!!!"! !! $.FczŠ‡‡‰Š‰ˆˆ‡…„„…††ƒ‚|aC( F•™ŠŒ‹‡ŽŒt_; "!#5Mhn…–œ˜™™˜žŸŸ›šš™š›œŸœž ¡¤¢¡¡  ŸžŸŸ  ŸžŸŸŸŸ ¡¡¡  ¡¢¢¢¢¢¡¡¢¢¡ ¡¤¦¦¤££¤¥¤¥¤¢¢£¤£ŸŸ¢£¤¤£¢¢¢¢£¤¢¢¤¤¤££¤¤¢œ›šœ˜•””¤“%VU$"@c ŽŽŒ‹Š‹‹ŠŠŠ‹‹‰–ŸB'''*4CKOQPD,"+-*/BG5' /?A>;862*'')*.5;;AMOC)"4Z”·²£££¢¡¡¢¤¤££¤¦¦¦¥¥¥¥¥¥££¥¤¢¢¢¢¢££¢¡   ŸŸ    ¡¡ ŸžŸ¡¢¢¡¡ ¡¡¢¡  ¡¡¡¡  Ÿ ŸŸŸŸžžžžœ›œœœœ›š™šš™™šš™—˜˜˜˜˜™˜——™š™™˜—————––˜˜˜˜˜–””•––••–•••——–•””••”“”“’’“”“‘‘’‘‘’“’‘‘’’’’‘‘’’Ž‘‘‘‘’‘‘‘‘ŽŽŽŽŒ‹ŒŽŽŽŽŽŽŒŠŠŠ‹‹‹‹‹Œ‹ŠŒŽŽŒŒ‹‰‰Š‰‡ˆŠ‹‰‰ˆ‡%*/0-++,0222-($! ""! !"" ".Fc‘‹ˆˆŠ‰ˆˆ‡…„„……„ƒ…‚aE'#L•–‡Š‹ˆ‰…hL*!%#%<Uln|–˜šœžŸžœ›››š™š›žœšŸ¡¢¢¡¡¡¡¡Ÿžžœœž ££££¢¡ Ÿ ¡¢¡ ŸŸŸ ¢¢¡¢£¤£¢¢¢¥¥¤¤¥£¢¡¡ ŸžŸ ¡¡¡¢£¤¥¦¦¤£¤¤¥¥¤£¢ œžŸž›™œ˜••˜£9L’“W&#@a|˜ŽŽŒ‹‹‹‹‰ˆŠŒŒŠ—.'&&)5DLNQRL=%(/*.AG7,+!*:<977:7.&$'*.588@MM=%!4R±«¢£¢¢¡¡¢££¤¥¦¦¦¦¥¥¥¦¥¤¢£¤¢ ¡¡¡¢¢¢ ŸŸ ¡ŸŸ¡¡ ŸŸ  ŸŸ ¡¢¢¡¡¡¡¡   ¡  ¡¡ ŸŸŸŸŸŸŸŸžžžŸœœœ›ššš™™™™š››™˜˜˜™™™™˜——™››š˜—˜˜——–•––––—––•–—–••••”“”••””““““““‘‘“•–•‘Ž“•”Ž‘’“”•”’‘’“““‘’’“‘ŽŽ‘’‘‘’’‘‘‘’‘‘‘ŽŽ‹ŒŽŽŽŽŽŽŽŒŠ‰ŠŒ‹‹‹Œ‹‹‹ŒŒ‹Š‰‰‹Š‰‰ŠŠ‰‰ŠŠ$),*((+.144/(#  !!  !!! "-D`~’‰‰ŠŠŠˆˆ‡…„„„ƒ‚…†dE(&M˜¡ŽŒˆ{Y=%%($ )?aƒ†Œ•–™œžŸžš››œ›™˜™š›œž¡£££¡ ¡¡¢ŸœžŸœœž¡££¤¤££¢¡  ¢¡ŸŸŸŸ ¡¢¡¡¡¢¡¡¡¡¢¢ ¢¤¥¤¢¡ ŸŸŸŸŸ  ¡¢¤¦¦¦¥¤¥¤¤¤¤¢¡ ¢£¤ š™™–”••ž‹U]™ V'$Af€œ‘‘ŽŒŒŒŒŠˆ‰‹‹Ÿœ'&%*6EKNSVVL3%0,.BH924)-6658<;4)%'*-367@NL8"5X–·¬¢££££££££¤¦§¦¥¦¥¥¥¥¥¤£¤¤¡ ¡¡¢¢¢¢¡ŸŸ¡¡ Ÿ¡¡ ŸŸŸ ŸŸ¡¢¢¡¡¡¢¡ ŸŸ      ŸŸŸŸŸŸžŸžŸŸžžžœœœ›™™šš››››œ›šš™˜˜šš™™˜—˜š›š—–˜™˜—•””•••––––––•”••”“““””•”“’’””“‘’•––•’“”“’‘’’’“””””“‘’““’‘““‘ŽŽ‘‘’‘‘’’‘‘ŽŽ‘‘ŽŽŽŽŒ‹ŽŽŽŽŽŽŽŽŒ‹Œ‹ŠŠŠ‰ŠŒ‹‹‹‹‹‰ŠŠ‰‰ˆˆ‰‰‰Š‹ &))(')-0561)#  !  #-D]yŽŒ‰ŠŠŠˆ‡ˆ‡†……„€bD'+Zš£”‘’’‚vT1%'$!!0Hd‹’ž™™›œš—˜š››š˜—˜™›žŸ ¢¢¡ŸŸŸŸ›šœŸ ŸžŸ ¢¢¡¡¢££¤£¡ ¡¢¡ŸŸŸ ¡ŸŸŸŸ    Ÿž˜›£¦¦¤£¢¡¡¢¢¢¤¤¢¡£¥¦¦¤¤¤£¢¢£¢¢¢£¤¥žš™™–“””˜ll¬N"%Chž•’’’““‘ŽŒ‹ŽŒŠŠ‹‹Š¢š&&'+7CINTYZUA*(.CI;66)0547;=:0&$)-156?NJ21`ŸÀ¼¡ ¡¢¢££¤££¦¦¥¦¦¦¥¤¤¤¥¤¤£¢¡¢££££££¢¡¢£¡ ¡¡   ŸŸžŸ¡¡    ¡  ŸŸ       ŸŸŸŸžžžŸŸŸžœœœœ›››œœœœ›šš™—˜šššš˜—˜™š™——˜™˜–••••–––•–––••••—–”““””••“’“•–•““””””’‘’’““”•”•”“““’‘’“’‘’“’‘’’‘‘‘‘ŽŽŽŽŒŽŽŽŽŽŽŽŽŒ‰‰‰ˆ‰Œ‹ŠŠ‹‹‹‹‹‹ŒŠˆ‰ŠŠ‰ˆ#&()()+.361*$!!!%/Fdx†‡‡‰Š‰†…‡ˆ‡†…„‚|u^B$3a”™“˜‘~pJ+ %'$#&9Sc ›––š››™™™›œ™™ššš›žžŸŸ ¡ žžžžœ™™œŸ    ¡££ Ÿ ¢¥¤£¢¡¢£¢ ¡¢¤¢¡¡¡¡¡¡¢¡ ŸŸž¤§¦¤¤¤¢¢££¥¦¥£¡¢¥§¦¤¤¤¢¡¢¤¤¤£££¢Ÿ›™˜—••”™‘mlŸ±P!'Dc¦˜““”“”“ŒŒŽŠ‰‰Š‰¢—%')-7CIOU[\ZK(,HN?61)!)347:=@8'"(.355;JG-.jž·µž¡¢££¥¥¤¤¦§§§§¦¥¤£££¤£¡¡¡¢¤¤¤¥¥¤££¤¤£¢¢¡¡¡¡ ŸŸŸ    ŸŸŸŸ    ¡¡¡ Ÿ žžžžžžŸ  žœœœœœœœ›ššššš˜——™™™™˜—˜™™™——˜˜—–––———–•”•”””””•––”’’””••““”––•””“““”“‘“”““““””•”’‘‘‘‘‘‘Ž‘““‘ŽŽŽŽŽŽŽŽŽŽŽ‘ŽŒŠŒŒŒŽŽŒŒŒŒŒŠ‰‰‰‡ˆŠ‹ŠŠŠŠŠ‹ŒŒ‹ˆ‡ˆˆ†…!#'*+++-034/)%"  !"#'0Hiy„†‡‰ˆ…ƒ†ˆ‡†…ƒ‚€{o\A":e–”–ub="#&&$&-A`m{Œš—•–™š›››œ›˜™œœœœœ››ž Ÿœ›œœœ›œŸŸ   ¡¡¡¡¡ŸŸ ¢¡ ¡¢££¡ ¡£¤¤¤£¢¢¢£££¡ ¡¤¤¤¤¤££¢¡¡¡¢£¤¤¢¡¢¤¥¥¤¥¤¢¡¢£¤¤£¡¡ Ÿš˜——–•”˜Šnc¡µZ!)H`‚«™’’’‘‘‘ŒŠ‰‰‰ˆ¡‘%()-5AHNTZ\ZP2'JRA3++1%-358>D=(!&,2549HG)pœ¦¡Ž“¨¦£¤¥¥¥¥¥¥¦§§¥¥¥¤¤££¢¡¡¡¡¢£¤¦¦¤¤¥¥¥¤£¢¡¡¡¡¡ Ÿ      ŸŸŸŸŸ ¡¡¡ Ÿžžž ŸžžŸ   œœœœ›™˜™ššš™˜˜™˜™™˜—˜™™™˜—˜———–––——–•”””””•••–•“’“””••”“““”““““““”“‘‘”“‘‘‘‘’“””’‘‘‘‘‘ŽŽŽŽŽŽŽŽŽŽŒŒŒŒŽŒŽŒŒŒŒŒ‹‰ˆŠ‹‹‰‰Š‹Š‹‹‹‹‹ŒŒŠˆ‡‡†……$# $'*-//02464/)&#  !! !#$(/Dhv„……‡‡„ƒ…††…ƒ‚ƒ|nZA!?k’”†jT/!'(%"(2@gy€›™—™™šš›œœœ›š›œ››œœœ›šœ›šš››œžŸŸŸ ¡¡ŸžŸ ŸžŸ ŸŸ ¢£¢¡ ¡¤£¤¥¤¢£¤¥¥£¡¡¢¤¤£¢£¤£¢¢¢¡¢£££¡ ¢¤¥¥¥¥¦¤¢¢¢£¤£Ÿ Ÿš˜——˜——‘ng¢¶X *Ba~¤š“’’Ž‹ŠŠ‰‡£‰&(),4AJPW]_\Q7!GSA2(*91$/36=F@+"$)/34:LI'*n˜œ™Œ§­¦¦¦¦¦¦¦¦¦§§¦¦¦¦¤£££££¡ ¡¢¤¦¦¥¥¥¦¥££¢¡¡¢¢¢¢¡   ¡    Ÿžž ¡¡ žŸ¡ŸžŸ  Ÿž›œœžŸžžžž›š™šššš™˜™™˜———–—˜˜˜——————––••–••””””•••”“’“’‘‘’•–”““““’’““““““’’’‘’”“’‘ŽŽŽŽŽŽŽŽŽŽŽŽŒŒŒŒŒŒŒŒŒ‹‹ŒŒŠˆˆŠŒŒ‰Š‹Š‰ŠŠŠŠŠ‹Œ‹Š‰ˆ‡†„„… %%! #'-0489888960*'$  !"! !"&.Aey‚ƒƒ…‡…ƒƒƒ„„‚‚ƒ|n[A!Ek‘‹‹wk[C)$('$!(8Ho~†•œ›šš™š››šš›œ›™™šœ›˜—˜››š™šœŸŸŸŸ ¡ žžŸžžŸ  ¢££¢¡ ¡¢£££¢¢£¤¥¤£¡¡¢¢¢ž ¢¢¢£¤¤¤¤££¢¡¡£¥¥££¤¤¤¤£¢¢£¢ ŸŸ›™—–—˜ ’|mi °I(Ad|›™’‘‘ŽŽŽŽŽŒ‹‹Œ‹‡œ‚!'(*,3@JQYac`R7&?L>0'*;5+34:C?.%%'-23<OJ$*k’˜š“›ª§¨¨§§§§¦¦§¦¦§§¥¥¥¥¦¨§£¡ ¡¢¤¥¥¤¥¥¤£¢¡ ¡¢¢££¢¡ ¢¡ ŸŸžž ¡ ŸžžŸŸœžŸžœŸŸžœœ››žžžž›šš›››š™˜™š™˜—•••—˜————————–••–––”“”••–•“‘‘““‘‘”–•””””““““’’’’““’‘‘’““‘‘‘‘‘ŽŽŽŽŽŽŽŒŒŒŒŒŒŽŽŒ‹ŒŠŠŠŒŒ‰Š‹‰‰Š‹Š‰‰‰Š‹Š‰‰‰‰‡†‡"&%! #)08=??=;:960*&#  !"##! !$+>^x€€„‡…ƒ€€‚ƒ‚ƒ‚}q\A Mn“ˆŒocQ:" &)&" *=Ns€Š˜š›œœš˜˜š›™˜˜›™™˜šœœ›˜––šž›š›žžžŸŸœžŸŸžŸ  ¡¢¢¡¢¢ ¡¢£¢¢¢¢£¤¥¤£¢¢¢¢ žŸ¡¡£¤¥¥¥¥¤££££¤¤£Ÿž¡£££¢¡¡¡ ŸŸŸš—–••š¦uueª®8'@g…Ÿ“‘ŽŽŽŒŒŒ‹‹‹…—{!'(+.4@KR[egdW;-*2@8/%);7 '48=D?0*((+/09LG +h”¡ ‘€˜§©©©©©©¨¨¨¨§¨¨§¥¥¦§¨§¦¤££££¤¤¤£££££¢¡ ¡¡¡£££¡¢£¡  Ÿž ¡¡ ŸŸ   ŸžžŸžžœ›œœœ›šœœœššš››š™™˜™š™˜—–•”–————––––—–•••••”“••••”’‘““’‘’“•””•••”””““’‘’“’‘‘‘‘’’’‘‘’’’ŽŽŽŽŽŽŽŽŽŽŽŒ‹ŒŒŒ‹‹ŒŒŒ‹‹‹ŽŒŒŒŽŒ‰‰‹ŽŒ‰ŠŠˆˆŠ‹Šˆ‡‡‰‹Šˆˆ‰‰ˆ‡‡ %)*% &0>FHFA>;973.(#  "###"! !$*;Wt€€€…ˆ‡ƒƒ„„‚zr\@Wy–‰‰‹tgQ8#'(%"!-@Z{†Š’˜™›œ›™——˜˜˜—•••–˜˜šœš”•˜¢œœŸž›Ÿ›œžŸ ¡¡¢¡¡¢¢  ¡¡  ¡¡ Ÿ ¢££££¢¢¢¢¡ Ÿ  ¡£¤£££¢£¤¥¦¥¤¢¡Ÿ ¡¡¡¡  ¡¡    Ÿ›•••”•žŠttjº·8$<gˆ¡’ŽŒ‹‹Œ‹‹Œ‹Œ”y#$(,3>IOZeigZ?27.%340%'88*!08=B=2/,))*+5ID'[Œ£¤Œ~™§­ªªªª©§¨©©¨©©§¦¥¦¦¦¥¤¤¤¤¥¥¤££¤£¢¢££¡¡¡¡¡¢£¢¢£¢ ¡¡ŸžžŸŸŸ ŸŸžžŸ ŸžŸžœœœœ›š›œœœš›œœœ›šš™š››™™™™™™————–”•–———––••–•••””””•––•””“’“””””““““’“””“““““’‘‘’‘‘‘‘’’‘‘‘‘‘‘ŽŽŽŽŽŽŽŽŽŽ‘ŽŒŒŒ‹‹‰Š‹Œ‹‹‹ŒŒŒŒŒŒŽ‹Š‹ŽŒŠŠ‰ˆˆ‹‹‹Š‰‰‹‹Šˆˆ‰‰ˆ‡†(+030' !*;NUSLB<962/,'! "##"!  #(;Yr‚‚‚ƒ†ˆ†ƒ€ƒ……‚~yqZ>Z}Ž‡‡‹vgO2&*($""/Jd‡‡Ž“••”˜˜—˜—–––••••—˜™š™—–•—œœŸ ¡Ÿ››žš›Ÿ¢¡¡¡¡¡¡¡žŸ    Ÿœœ ¢£¢¢¢¢¡¢¢¢  ¡  ¢¢¡¡ Ÿ¡£¤¥¥£¢¡ ¡¡ ŸŸŸ ¡¡¡  ŸŸ••••”švtl»¼3#7a‡œŒ‹Œ‹ŠŠŠŠ‹Š’‰f!!"$*9EMWafg]A4<9"$/2'&387+&28;943.('&%0GB&J‡¬¢†x™¥¯«ª«ªª©©ªªª©©¨§§§¥¥¥¤¤¤¤¤¥££¤¤£¢¢¢¢¢¡¢¢¡¡££££¢¡¡¡  ŸžŸŸŸžžŸžžŸžœœœ››››œ›››››š™™˜—™š™˜—————–——–””–———–”““••””““””•–•”””“““”“““““’’’‘’’‘‘’“’‘‘‘‘Ž‘ŽŽŽŽŽŽŒŽŽŽ‘ŽŽŽŒŠ‰‡‰‹‹‹‹‹ŠŠ‹ŒŒŒŒŒ‹‰‰Š‹‹Š‹‹Š‰ˆˆˆ‰Š‹Š‰‰‰‰ˆˆ‡ˆˆ†……36::4*!!.CX\XN?752.+)&!!"#"!! #)<[tƒƒ‚„ˆ‰‡†ƒ‚ƒ…†…‚~ytZ<]~Œ‡‰‰s^B)',)$"$4Oh|ƒ†’““”—˜———––—–•––—˜˜™™™š˜—˜˜šœŸŸžœ›ž›šœžŸžž ¡¢¡ žžžŸ   Ÿ›¢££¡Ÿ¡  ¡¢¡¡  ¡¡¡ŸžŸ ¡¢¢¤¥¤¢¡ ¡¢ žŸŸ ¡¡¡ ŸŸŸ—–––• tpun¶µ"6bŠŽŽŠ‰ŒŒŠ‰ŠŠŠŒŽ|^!!0@IQX^c]C3:;)*6*&.6@7,23333/*(%".HC11|³œvyš ­¬ªªªª«««ªª©¨¨¨¨¨¦¥¦¦¥¤¤£££¤¥¥££¢¡¡¢¢££¢¡££££¢¡¡¡¡¡Ÿœœžžžžžžœœœœ›š™œžœ›››™˜™˜——˜™˜––—˜˜˜˜—–”•–———•“’“•—–”““““”•”““”””“””““““’’‘‘‘‘’’’‘‘‘’‘ŽŒŽŽŽŽŽŽŽŽŽŽŽŒŒ‹ŒŒ‹‹Œ‹ŠŠŠ‹ŒŒŒ‹Š‰‰‰‹‹ŠŠŒ‹ŠŠ‰ˆˆ‰ŠŠŠ‰‰ˆ‡‡‡‡‡‡†…†7:?=5+"".DW\XL:220+'&%! !!  #*>\s‚‚€‚†ˆ‡‡„‚ƒ„„~{yvY:`”ˆ‰‰jR5 !(*&"$*<Yo…‹’“””•˜˜–———™š˜–•–˜™ššššœš™˜š›œžžš—œœ›œž ¡¡ žžŸžžŸ ¡¡ Ÿ¥¤¢ žžžžŸ ¡¡¡ ¡¢¢¡ Ÿ ¢¢¢¢¤¥¤¢¡ ¡¢¡ŸŸŸŸ ¡¡Ÿž˜–––•–¦pwwu·°"8j‘ ‘‘‘‘ŽŽŽ‹ŠŒŽŠŠ‰ˆ‰ˆz`"#"%9IRV[daG5==+&7,(.8E>")10/020,'%"-ID/>oµ™knŽ˜°¯«««¬­®¬«ª©©©¨©©§¦§§¦¥¤¤£¤¥§¦¥¤£¢¢££££¡¡£££¤£¢¡¢¢¢¡žžžžœœ›šš›žžœ›œ›™™™™˜˜˜˜—–––—˜—––•”•–––•”“’“•–•“’’’’’““““”•”’’’’’“““’’‘‘‘““‘‘’’ŽŽŽŽ‘‘ŽŒŽŽŒŒŽŽŽŽŽŽŽŽŒ‹‰Š‹‹‹ŠŠŠŠŠ‰ˆˆŠ‹‹Œ‹‰ˆŠŒŠˆˆˆ‡‡ˆˆˆ‡‡‡†……††………†‡16<:3)""+;KRPD610,)&$"  !$,?[s‚€„…††„‚€|yywsS5c„š‰_H0%)(#$3Cbq„‘““”•—™˜–—˜™›œ™–”•˜š›››š›œœš™››››œœ›™™šœžžžžžŸ  ŸŸžžŸŸž ¢££££¢¡ŸžžŸŸŸ    ¡¢¢¡¡¢£¢¡££££¢ ¡¢¢¢¡Ÿžž ¡ žœ›’“”–••¥pov‚²±"9k‹œ‘’’’ŽŽŒŒŽŽ‹‰ˆ…„‹yU&'$,FSUY`\D5B@,!"2+*2;FA*'0.,/22+$!!-IE-:tºŽcj‚–¶´¬¬¬­­®­«©ªªª©©¨§¦¦¦¦¦¦¥¥¦¦§¦¤£¢¢££££¢  ¡¡¢¤£¡ ¡¡ ¡ Ÿ  žœžžœœœ››œœœœ››››š™™™™™™˜˜————˜—••––••–––•”””””••“’’’‘‘’“““”””’‘‘‘’““““’’‘‘“’‘’“”“ŽŽ‘ŽŽŒŒŒŒŒŽŽŽŽŽŽŽŽŽŽŽŽŽŒ‹Š‹‹‹‹ŠŠŠ‰‰Š‰‰Š‹‹ŒŒŠ‰‹ŒŠˆˆˆ‡‡ˆˆˆ‡‡‡…„…†ˆ‡††ˆŠ(-32,&"#)2<BA:20/,)'$! ! "*>[s€ƒ„„„…ƒ‚€}xxxvqO1h‰ž“[A(&*("':PjrŒž˜•””•˜š™–—˜™š››š–—˜š›œ›œœœœœ››œœ›š—š—˜ž žŸ ŸŸŸ    žŸ¡£¤££¢¢¢    Ÿž ¡¡¡ ¡¡¢¢¢ ž¡¢¡¢¡ ¡£££¡ŸžŸ¡¡ žœ˜‘’“”•™¨sq|‡°±'Ak‡œ‘’’“’‘ŽŒŠ‡„„tE ()'!;PUY[R:3DC.'(((+2=GC1!))(-34++GB+=v¹t|~“¶¹®®®®®®­¬«¬¬¬«ª¨§¨¨§¦¦§§§¦¦¦¦¥£¢¢£¤¤£¢    ¡¢¢ ŸžžŸ  Ÿ ¡ŸžŸ ŸŸžœœžžœ›š™šœ›™™™˜˜™™™˜˜˜˜˜˜—••——••––••••••”””“’’’‘‘’“”””““’’“”””“’‘‘‘’’’““‘‘‘ŽŽŒŒ‹ŒŽŽŽŽŒŽŒŒŽŽŽŽŽŽŽŽŽŒ‹‹‹‹ŒŠ‰ŠŠŠ‹‹‹‹Š‰ŠŠ‰‡‰‹‰ˆ‡‡ˆˆ‡‡ˆ‡‡‡…„…‡‰‰‡‡‰‹!%'$"!#%*./.*)+.-+($! !" !(<Yr€‚……„„„…„ƒ‚~zzyzlH-mš’[: &)'# *?Uq‚Ž—˜—•””–˜˜–—™˜˜™šš™˜˜˜šš™›œœ›œ›ššœœœœ››—›Ÿ œžžžžŸ ¡¢¢ ŸžŸŸ ¡¡¡¡¡¢¢¢¡¡¡Ÿ›œŸ¡ ŸžŸ ¡¡¡Ÿž  Ÿ¡¡  ¢¢¢¢ Ÿ ¡¢¡Ÿ›˜’’’“”™©lY|‰«®*Ek‰™‘‘’’“’ŽŒŠˆ†…n: '))")@NVXL1-?>/-3'#+07DD6("%,34**E>-@q´—x~x‡°¹®®®®®¯®­¬¬­­¬ª§¨©©¨¨§¨¨©§¥¤¥¥¤££££¤£¢¢£¢¡¡¡¡ žœŸŸžžŸ ŸžžŸ  Ÿžœ›œœššš›œ›™™™˜™™™™™ššš™™˜——™™—–––•”””•••””’’’“’’“”””“““““‘‘“““””“’‘‘’’‘’’’‘‘ŽŽŽŒŒŒŒŽŽŽŽŽŽŽŽŒŒŒŽŽŽŽŽŽŽŽŒ‹‹Œ‹ŠŠŒŒŒŒŒ‹‰‰‰ˆ‡ˆŠŠ‰‰ˆ‹Œ‹‹‹‰ˆˆ†…†‡ˆ‰ˆˆ‰‰!#$#! $*-+'# !"! ");Zr}ƒ……ƒ‚ƒ„„‚~zzxtbE*#oŽ—‡wW2#((%#".H\|Œ——–•””–––—˜™˜—™š˜——˜™™™››šššš››œžžž Ÿ Ÿžž ŸŸ ¡¢¡ŸžŸ   ŸŸ ¡¡¡¡¢¡¡  œž ŸžžŸŸ¡¢£ Ÿ  Ÿ ¡ŸŸ¡¢¢     ¡£ œš˜–’““•š©]M|Š¡­ ,Jd…œ‘‘‘‘“’ŽŽŒŒ‹‹Š‰Œ’a6"%''$*DPSF,'9;259.+-2BE7-"#.0-(*C9/Gf¥’yx‚¯º®°¯¯¯°°¯­¬««ª¨¦¨ª©©¨¨©ª©§¤£¤¥¤££££¢¢¢¤¥¤¢¡¡¡ ¡žžŸŸžŸŸžžŸ    žžžœœœššš››šš™˜˜˜˜™™šš™™™™˜˜˜™˜––––•”“•••”“’‘’““’’“”““““”“’’’’‘’“’’‘Ž‘‘‘‘‘ŽŽŽŽŽŽŽŒŽŽŽŽŒ‹ŒŒ‹‹ŒŽŽŒŒŒ‹‹‹‹‹‹ŒŒ‹ŠŠ‹ŒŒŒ‹Šˆˆˆ†‡‰‰‰ˆ‡Š‹ˆ‡‡†………‡ˆ‡†…„ !$))%! ! #*<Yr|ƒ……„‚ƒ…„}||{r^D*#p’“”zjN,$(&#"%5Rc‚‰’••••••••––———˜˜–––—˜˜™œžž›™™››œ››œœœžŸŸžžžž  žžŸ  ŸžŸŸŸŸžŸŸ ŸŸ ¡ ŸŸ¡ œœ›œ ¢£¢¡ ŸžŸ¡ Ÿ ¢¢Ÿ ŸžŸŸž›š™˜•••–œ¨ZgŒ¨¬#-K^ –‘‘‘ŽŽŒŒŒ‹Š‹ŠŽ˜U)#%''%8JMA(%7828<2#'+0AD83+",+),*"+A3-Mg’ˆ~€y‡²¹¯°°¯¯°¯®­«ªª©¨¦§©©¨¨¨©ª¨¦¤£¤¥£¢¢¢¢¡¡¢£¤¢Ÿ ¢¡¡¡ žžžŸ ŸžŸŸ  Ÿœœœžœ›œœ›š›››š™˜—˜—˜™™™™——˜˜˜˜˜˜—••–—–••––•”“’’’“”’‘’”“““’“““’’’‘‘‘‘‘ŽŽ‘‘‘‘ŽŽŽŒŽŒŽŽŽŽŽŒŒŒ‹Ž‹Š‹Œ‹ŠŒŽŽŒŽŽŒŒ‹‹‹ŒŽŽŒŒ‹ŠŠ‹ŒŒŒŒŠ‰‰‰‡‡ˆ‰‰ˆˆ‰‹Œ‹Š‡†‡ˆ†††‡ˆ‡………!! %'&#  #+=Zp|„ƒ…†…ƒƒ…ƒ€~~~~v`D)%t‡Šr\>&%'%!"*>Wj‡“’‘’””•–——––––˜™™™˜˜——™™™š›œ›››œœœšš™˜—šœœœŸŸ žžŸžžŸžžŸŸ  Ÿ ¡¡ Ÿ¡¡Ÿœœœœœœ¡¢¢¡ ŸŸŸ¢¢Ÿ¡ žžŸŸžŸš™™˜—–––£¥Si€¬¯.Faƒ¦˜‘ŒŽŒŒ‹ˆ‰ŠF$'(&$!'=F=&$463:=6.  $0BB;9/&+.55,#+<,)Gf‰~}s„©¸²±±°¯°¯­­¬¬¬­©§§©©©¨©ª©¨¦¦¦¥¥¤¢¢¢¢¡¡¡¢£¡Ÿ ¢¡¡¡ žžžž  ŸžžŸŸŸŸŸœœœ››œœœœ››œœ›™˜˜˜——˜———––—˜˜˜˜˜–•”•–—––˜—–”’‘’’““’‘’”“““’‘’’’’’’‘Ž‘Ž‘‘‘ŽŽŽŒŒŒŽŽŽŽŽŽŽŽ‹‹ŒŒŠŠŒŽŽŽŽŽŽŽ‹ŠŒŽŽ‹‹‹‹ŠŠ‹‹ŒŒ‹Š‰‰ˆ‡†‡ˆˆˆˆˆˆˆˆ‡…„†ˆ‡††‡ˆ†…†‡#"$'(&""+>[nv‚ƒ„…„ƒ„…ƒ€€€}gE&)n~}mS0 %&$ $0EZqŒ“‘‘’”•–—˜˜——˜œœš˜—˜˜˜š›œ›˜•—™š›žœœ›š™—–”˜›œ›šœžŸžžœœžžœœŸ¡¡  žš›Ÿ¡¡ŸžŸ ž›œžžœœœŸŸŸŸŸžŸ¡¡™œžŸžžžžŸ žœšš˜—–••¡¢Jh}Ž®¯-Lc‡¨–ŽŒŒ‹Ž‹‡‡ˆ–š2$&%$" "';8$"1317<<9+*AB??4& +3;<2%)4$&>ZŒŠ}{n}ž¶¹²²±°°¯®­­­­¬ª©¨©¨¨¨¨¨§§¦§§¦¥¤¤¤¤¤£¢¢£¢¡  ¡  ¡ ŸŸŸŸŸŸžŸžžžŸžœœœœœ›››œœ››››œœœš™™˜˜——————————˜˜———•”“•–––––•“’‘‘‘‘‘’“““’‘‘‘‘‘’’‘ŽŽŽ‘“’ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŒŽŒŒŽŽŽŽŽŽŽ‹ŒŒ‹‹‹‹‹ŠŠŠ‹Œ‹‹‹ŠŠ‰‡‡ˆ‰‰‰‡‡‰‰ˆ‡……‡ˆˆ††ˆ‰‡…††#&% %()&#!"##! !+@]o}„…†……††„‚€{yk@"-otwxeM)"&'%!&5J_vŒŒ“––––———˜™›œ˜––—˜œŸ£œ—•–———š›œœœœ˜•”˜››œžŸžžžŸžœ›œŸ¢ ŸŸž›› ¢¢ žžŸžŸŸŸžœžŸŸŸŸ    ž›› ŸžŸŸŸŸžœ›š˜˜˜–•š¢CfzŒ­® /K_‡¨“‹Š‹‹ŠŠŠŒŽŽŠ‡†‡—•%%$$""+&-1 -114:>?5 #998>6+'2:;3%%*$@QŒŠ{pp|ž±»±²²°¯®®®®­¬«ª«ª©©¨¨§¦¦§§¦¦¦¤¤¤¥¥¤¤¢££¢    Ÿ ¡ŸŸŸ ŸŸžžžžžŸŸž›››œœœ›››š™š›šššš™™˜——˜—––—–––––••––•””•–––•”””“‘’’‘’’‘‘‘‘‘‘“’ŽŽŽŽ‘ŽŽŽŽŽŽŒŒŒŽŽŒŒŒŒŒŒŒŒŽŽŽŽŒŒŽ‹Š‹‹Šˆ‰Š‹ŠŠ‰Š‹Š‰Š‹‹‰‡‡ˆ‰‰ˆ†…‡‰‰‡†„…†‡‡††‡ˆ‡††… '*($"'**(%# "%''$! !+B^s…‚„†‡‡‡ˆˆ‡…‚~}}|{e9!|uur\D'$'&#!(9Me{ŽŽ‘–——””•––™™™›šš˜•““–œ¡“””–——–—™›œœ›š›œŸžœžžžžž  Ÿžžœ›  Ÿžž›œ¡¢¢ žžžžžŸŸŸŸŸŸžŸ   ¡¢¡  Ÿ›œžžž  žššš™——˜—• ž5cvŠ­²-0J[…¨’Š‰‹Œ‹Š‹‹‹‹ŒŒ‰‡††—’''&&##/.  +24339@=*258>8-#".573&"%#>X”™vmlzŸ¬¶³²±°¯¯®­¬¬«««««ª©©¨§¥¥¨¨¦¥¥¥¤¥¥¥¥¤£££¢¡¡ ŸŸ  žžŸŸžžœœžžžœ››œœœ››š™™š›š™™šš™˜—˜™—–——–––––••–––••”•–•““••“‘‘““’’’‘’‘‘’’ŽŽŽŽŽŽŽŽŽŽŽŒŒŽŽŒŒŒ‹‹‹ŽŒŒŽŽŽ‹‹ŽŒ‹‹‹‹Šˆˆ‰Š‹‹ŠŠ‰‰‰Š‹‹‰‡‡Š‹Šˆ††ˆ‰ˆ††…††††††‡‡‡‡‡†$),,)##),,)($""&*+*($! !!!*Bauƒ…‡ˆ‡ˆ‰ˆ‡†ƒ{zxp_7!#‚umP9"''$!!*<Ol‚””™™˜•”””“šš™™˜˜˜–”–™›š˜––šš–˜˜˜—™™™œžŸŸžžžžžžŸŸŸŸŸžžŸŸžžœœœ¡¤¡žžž ¢¡  ¡¡   ¡¢££¡  ŸžžŸŸžŸ¡ šššš—•–——”¦˜:e„Œª³-0J`~š‹ŠŒŒŒŒŒ‹Šˆ‡…„—”))('%#(33&!1763/4BC/-4;?80('/54'!"#=J“žyscp¨¶µ²°°°°¯­¬¬¬««««ª©©©¨¦§©©§¦¥¥¥¥¤¤¤¤£££¢¡ ŸžžŸŸžžžžœœ›œ›œœ›ššš›š›œš™˜™š™——˜™————––•–—––––––•”•–•““••“‘‘‘’“““’‘Ž‘‘‘’‘ŽŽŽ‘ŽŽŽŽŽŒŽŽŒŒŽŽŒŒŒŠŠ‹ŽŽŽŽŒŽŒ‰ŠŒŽŽ‹ŠŠŠŠŠˆˆˆŠŠŠŠŠ‰ˆ‰ŠŠ‰ˆ‡ˆ‰Š‰‡†……†…ƒ„…………………†‡†‡‡†#',/0-)#!#&+/-)&%%&)./-*&#! !*Bbw‚„…††‡‡†…„‚{ytlW8 -‡…|mF*&)'#!!+@Usƒ”‘•———–”’’•–––––˜™˜——˜˜™š›™›šš™˜———™››™›žžžžœœžžžœœžžžžžœžŸœ› ¢¢¡Ÿ ¡ žŸ ¡¢¡ŸŸ  Ÿ     ŸŸžœš™š™•“”––”¡.h‘¥¬&.J`x‹ŒŒŽŒŒŒŒ‹‰‰‰‡„)''&&',45/ !3887.2FH1!#/=D>6/##076+#"#>@©|qVgš§¸¶³²±±±°®­­¬««¬«©¨¨©©¨§§§§§¦¦¦¥¤¤¤££££¢ žžžŸŸŸžœœž››šš››œœ›››š˜™š››œœ›™˜™š˜—˜™™˜—˜–––•–––•–––––•””““’“’’‘‘’’“““““’Ž’‘ŽŽŽ‘‘ŽŽ‹‹Œ‹‹ŒŠ‹ŒŒŒŒŽŒŒŽŒ‹ŒŒŽŽŒŒ‹‹ŒŒŠ‹ŒŽŽŒ‹Š‰‰Š‰‰Š‹ŠŠ‹‹Š‰‰ŠŠ‰ˆ‰ˆˆˆ‡‡†…………„…††……†††††…………!$'*-021.*&$%(*-/-(%&'(+/0.+'$! !!"+Abwƒƒ„„„……„‚~ysjU6%3‰…zj>%"()&"!"/F]y…’’“––—˜˜–’‘’”••–——˜˜˜˜˜˜™›œœ›œœ››™——˜™šš™šœœ›š™˜˜™œžŸž›š›œœœžŸ  žžžœœ›œŸ¡¡ ŸžŸžž ¡¡Ÿž  ¡¡ ŸŸ Ÿœššš™•’’•–•¥ŒLkŒª© ,Jc|‘‹ŽŽŒ‹‹Š‰‰‰Š‰‡“~(%%%&)-264'.48:/2IJ3'!#8?<;4)#298/'"">:‘ªwpkh—§»·³²±°°¯¯¯®¬ª«¬¬ª©©©©©¨¦¦¦¥¥¦¦¦¤¤¤¢¢££¡ŸŸ ¡  žœžžŸŸœšššš›œœ›ššš™˜˜™šš››š™˜™š˜——˜˜˜™˜–””””•””––••••”“““’’‘‘’’’“““””“’’’‘‘ŽŽŽŽ‘ŽŽŽŽ‹‹ŒŒ‹‹‹ŠŠ‹Œ‹Š‹‹‹ŠŠŒ‹‹ŒŒ‹ŠŠ‹‹‹Š‹ŒŒŠ‹‹‹‹ŒŒ‹‰ˆ‡ˆ‰‰‰‰‰‰‰‰‰ˆˆ‰‰ˆ‡ˆˆ‡††……„…†……†††…††††…„„„……"$%(*+,/2220,('),-,*('''(+..-*'$!!##!#+?`wƒƒ‚‚ƒ„„ƒ€‚zvmY9'Fˆ‚xc4#''$ #4Ne‚†“”——–•–˜˜‘’”–˜˜—––————˜š››˜˜™š›œš˜˜šš™™™›œœ›™—–—˜š›žžž›˜—™šš›œž  ŸŸŸ›œ››žžœœœž ¡¡ž›œžŸŸŸœžŸœ›—™š™”‘“•™¦Œmwƒ°¬ *Icv•ŒŽŽŒŒŠ‰‰ˆˆˆ‰ˆ„ˆs '##$&(,158-#.7:.2JJ4-+.78=8.$.672+"">B–©onlk¤½»²±±±®®®®­«ª«¬«ªª©¨¨©¨§¦¥¤¤¦§¦¥¤¤£¢¢¢¢¡ ¡¡¡ŸžœžžŸŸœššš››››š™™™™˜˜™™™™™˜˜˜˜™˜—˜——˜™—•”””““”–—–••••”“”“’’‘‘’’“”““””“‘‘’“‘ŽŽŽŽŽ‘ŽŒŽŽŽŽŒ‹‹‹‹ŒŒ‹‹ŠŠŠ‰‰‹ŒŒŒŽ‹‹ŠŠ‹ŒŒ‹‹ŒŽŒ‹‹Œ‹ŠŠŠ‹Œ‹ŠŠŠŠ‰ˆ‰‰‰Š‰ˆ‡‡‡†††……†‡‡‡‡‡‡‡‡‡‡‡†……†……&&'())),/121.*'())'%%%%$%(**))(&%%&&%',=Zs‚‡ƒ‚ƒ‚‚ƒ€{wnZ:(Gwq\+#''#'<Xl‚‰––———‘˜™–‘“•˜šš—•”–—––——››™—˜™™™™™™˜——˜™š›œ›š˜–›žžŸŸ———™ššš™œœœžœ›œœœœšš›žžŸ ¡¢Ÿœœ›šššš›žœ™——™˜”‘’”—œ…qyƒ®°8)H`pœ”ŽŒ‹‹Œ‹ŠŠ‰ˆˆˆ†…„n%#$%').48;3"&69-2JJ5//"+5=7/*%043.!!?E˜¢woq`ŸÀ¼²±²²±¯®®­¬¬¬«ªªª¨¦¦§¨§¦¤£¤¦¦¦¥¤¤¤£££¢¢¡¢¡ žžžžžžžœžŸžœšš›››ššš™™šššš™™™™™˜˜˜˜˜—˜˜——˜˜–•”••”“•——•••––•””“““’’’’“”“‘“”“‘‘“”“‘‘ŽŽŽŽŽŽŽŽŽŽŒŒŒŒ‹‰‰ŠŠ‹‹‹‹‹‹‹ŒŒŒŒ‹‹‹ŒŒŠ‰‰ŠŒŒŒŒŒ‹‹‹ŒŒŽ‹ŠŠ‰ˆ‡ˆ‰‰Š‰‡†‡‡††††……††††‡‡†……†‡†…†‡…„'&%%&%$&*,./-*'&$#! !#$%')*)))*+,0=Vjy€~~€€~~€‚„}xmX7'EqokS&"&&" .Deuˆ‘•˜———–˜™˜’‘“–˜™˜•“•——––”’—™™˜˜—–—˜˜••–—˜™™™šš˜™ŸžžŸ  ›™šš›š™š›ššœ››œœœœœœœ›™™œŸ ŸŸŸ  ›œœ™˜™šš›››™˜—––•‘’“•—…zz…¥®P%(F[jŸ”‹ŠŠ‹‹‹ŒŠ‰ˆ†ƒƒ‚h##$&')/58;8)39,1KL6,+#!6@91-#.44/>EŽ—vssUu½´³²³²°°°¯®­­«ª««©¦¥§¨¨§¥¤¦§¦¥¤¤£¤£££¢¢¢¢¡ ŸŸžžžœœœœžžœ›››šššš››œ›šš™˜˜™™˜˜˜™™˜˜——–•––––••––•–—•”••––•””“““’‘‘‘’’‘’““’‘’““’‘ŽŽŽŽŽŽŽŽŽŽŒŒŒŒŒŽŽŽŠŠŒ‹Š‹Œ‹ŠŠ‹ŒŒŒ‹ŒŒŠ‰‰ŠŒŒŒŽŒ‹‹ŒŒŽŒŠŠŠŠ‰ŠŠŠŠ‰‡††‡††‡‡†……†††ˆˆ†„…†††…†‡††&%#"! "%(*+*)%  #(,..--/135?Sbnuxzxyz{{}ƒ‚yiT.&Ecg_H$ "# "7Rm{Ž“”–——–•‘‘”˜•‘’•–––””–˜˜——•‘’—šš™–••–˜™˜—˜™™˜˜˜š›™˜šžŸœš˜Ÿ¡¡žœ››œš˜šœ›šš›žœ››œžŸŸžžžžœšžœš™››šš›š˜˜˜–”““’““‘’‘‚zz…¢©W$BW]™’ŽŒ‹Š‰‹ŒŠ‰ˆ†„„}_###%'+/35;;-#".7*1OP6*(#4C;2/()24-<K‘wf\QtœÃ¼´³²±°°°°®­­­««­¬ª¨§§¨¨§¦¦§§¥¤¥¤¢¢£££¢££¢¡   žžœœœ›š›››œœ›š™™™™™˜——˜™™™˜—––—––—•••––—–•”••••”““““’‘‘‘‘‘’’’‘‘’’‘ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŒŒŒŠ‹ŒŒŽŒŠ‹ŒŒ‹Š‹ŒŒŠŠ‹‹ŒŒ‹ŠŠ‹ŒŒŠ‰‰‹‹‹ŒŒŒŽ‹Š‰‰‹‹Š‰ŠŠŠ‰‰‰Š‰‡†…………†‡‡…ƒ„……‡ˆˆ…ƒƒ………„…†††!! "&(**& &,035668889@N[dknpqrsuwz~‚…„Š„dL.&E``Q8! %>Zp{‹‘“’’”•”“”•““™–““““”–˜˜—–“”™›š˜••–—˜˜™™™™˜˜—˜šš˜––™šš™˜—œ››œš˜˜››š™›Ÿžœœœœœœœœœœœ›œœœšœžœšššš˜˜˜–““””•“’}y{‡¨­i# <Tb˜’ŽŽŽ‹ˆˆŠ‹‰ˆ‡†…ˆvW$###&+/13:;-%*&%0'0PR8+'#"5E>70*"!+1+:M”¡”‚0+j›Å¾µ´±°°¯¯¯­¬««ª«­¬©¨¨¨¨¨§§§§¦¥¤¥¤¢ ¡¢¢¢£¤£¢¡¡ œžžžžœœ›œœššœœœœœœ›š™™™™™™˜—––˜™˜˜———————–”•••––•”••””“““’‘‘‘‘‘‘‘ŽŽŒŒŽŽŒŽŽŽŽŽŽŽŽ‹‹ŒŒŠŠ‹ŒŒ‹ŠŠ‹Œ‹Š‹ŒŒ‹‹ŒŒŒŒ‹Š‰Š‹ŒŒŠŠŠ‹ŒŒŒŽŒŠ‰‰‹ŒŒŠ‰‰‹‹‹‰ˆ‰‰ˆ‡††……†‡‡‡…ƒ„†‡ˆˆˆ†ƒƒ…††……………#%)*'!%-47:=>=>>==AKU]behjmoquy|ƒŠ˜‘dG*&D[YC*"# )C`x}†Œ‘“‘“––•”“‘”˜˜•’’’’“–™˜—•—›œ™–••––——™š˜——˜™™š™––—™šš›˜–›œœ››š™™š››šœ ¡˜›žžœœžŸ›œœžœ›œœŸš™™™™˜—–“’“”–”’•ˆzxx‰¡¯w18Sh˜’ŽŽŽŒ‹ŠŠ‹Š‰‡††pL$#"#%*/249:-(/,#"0NQ</)') 0=:71+'!.*8E‹¤°°dw™Äµ´²±±±°¯®¬««¬¬­¬ª©©¨¨¨¨¨¨¨¦¥¥¦¤¢  ¢¢¢¤¤£¢¢¡ ŸžžŸŸžœ›››œ›šš›œœ›š™™™™™™™™˜—–•—˜————–––—˜—–•••––•••”““““’‘‘‘‘‘‘‘‘‘‘ŽŽŽŽŒŒŽŒŽŒŽŽŽŒŒŒŽ‹‹‹ŒŠŠ‹‹‹‹‹‹Š‹Œ‹Š‹‹‹‹ŠŠŠŠ‹ŒŒ‹Š‰Š‹Œ‹Š‹ŒŒ‹‹Œ‹ŠŠŠ‰ŠŠ‰ˆˆˆ‰‰Š‰ˆˆˆ††‡‡‡‡ˆ‡††…„„†‡‡††…ƒ‚„…†…„„„ƒ!!! !%),*$"-6;=?AA@@@??AHPUY\_bfiltxzŠ–’Ÿ–fJ*&AVT: %&",Gb}„••”“”––”’‘Ž“–˜—”’’’“–˜˜˜—˜šš—•“’“•–—˜˜—•—šœœ›˜“˜›››œ ¡¡ŸŸžœšš™š››››š›žœ“• žœ››žœš›œœœœœ›šœžžžœ™˜˜˜™˜”’’‘’“•”–™vyz‹œ©x65Qa“—ŒŒŒŒŒŒŒ‹ŠŠŠˆ†††‘fA""#$&).3785+*31%,HL=2.13(%3452., ,)8R~™¶¿ªŸ‘œÃ¾´³³²²±°¯®­¬¬­¬«««ª©¨¨¨©¨¨¨§¥¥¥¤¢¡¡¡¡¡£££¡¡¡¡¡ŸžŸ žœ›››››››ššš›œœ›š˜˜˜˜™˜˜˜˜™˜——˜—˜˜–•””•——–•”•••”””•”•”’‘‘‘‘‘‘‘’’‘ŽŽŽŽŽŽŽ’‘ŽŒŽŒŽŒŒŽŒŒŒ‹ŒŒŒŒ‹‹‹‹ŒŒŒŒŒŠŠ‰‰‰‰‹ŒŒ‹‹‹‹‹‹‹ŒŒŒ‹‹‹ŠŠ‹‹ŠŠ‰‰‰‰‰‰‰‰‰ˆˆˆ‡‡ˆ‰ˆˆ‡‡††††††‡‡‡†…„ƒƒ„††…„„ƒ&&%#!$*.,&$2<@@AA@?@@@?AFKNPSUX]aht€‰™˜¢˜gM*$>SN0$%"!0Id{‚…Ž•––•”••’‘”—˜—–”“””•–————˜˜–”’’“–˜™™˜——™œžžœœœœœœ žŸŸ›šš›œ›››ššš™–—šœœœœ›˜™›œœ›š›œœžžžœš˜—˜˜•“’“”•––—œz{{~‘–§|<2JZ”‹‹ŒŒ‹ŒŒŠ‰ˆ‡†††’]7""!#&*.364/)+53&'BG>769:,'/40.,#*)7Tv…¦° ª¤§Åº´³³³²±°¯®®­­­¬««ª©¨¨©©©©©¨§¥¥¥¤£¢¢¢¢¡¢¢¢¡ ¡¢¢ ŸŸŸžœš›œ››››››››œœ›š™˜™™™˜——™›™˜˜™™™˜–•““”•–•••––•””””••”’‘’’‘‘‘‘’‘ŽŽ’‘ŽŽŽ‹‹‹ŒŽŽŒŒŒ‹ŠŠ‹ŒŒŠ‰ˆ‡ˆŠ‹‹ŠŠŒŒ‹ŠŠ‹ŒŠ‹‹‹Œ‹‰‰‹Š‰‰ˆˆˆ‰ˆˆˆ‰‰ˆ‡ˆ‰‰‰‰‡……††……‡‡††††…„ƒ‚‚ƒ……„„„ƒ-+)&$!#*/-%"1;==>?>=>A@??BCDILMNSZ`r‰˜™—¤˜bH(#:NF(!%$!$/Yn~‚…’••”““”’“™—–•”””””•–—–•––—–”•–™šš™—–—™›œœœž£žœ›šš™˜—˜™™˜˜˜šœœ››œ›š™™˜™™š›œœ›œ›˜—™›œ›š™šœœœœœœš—–••”““•—–••–šu{|€ˆ•¤I/E\™‹ŒŽŒŒŠ‡…†††‡šW,!!!!#(,032.)-61$"#9A=;<=7),61-,' ((5Tpw£zŒ£­Ã¼´´³³²±°¯¯®­­¬««ª©©¨©©¨§§§§¦¥¤¥¤£¢¢£¢ ŸŸ    ¢¢ Ÿžžžœ›››››œœœ››œœ›šš™™™™™˜˜˜šš™—˜š›™—–•”““”••”•––”““““””“’‘‘’’‘‘’’‘‘ŽŽŽŽŽ‹Š‹‹‹ŒŽŒŽŽ‹‹ŒŒŒŠ‹Š‰Š‹ŒŒŒŒ‹‹Š‰ˆŠ‹‹ŠŠŒŒŠ‰‰ŠŠ‰ˆ‰Š‹Œ‹ŠŠ‹‹‹‹Š‰ˆ‰‰‰‰‰ˆ‡‡ˆ‰ŠŠ‰‡……††……††…………„„ƒ‚‚ƒ„„„„„„30-)'#!(+)!!/7;::;===?@>==<>DEEFNWco|š™˜£–_C$ 5F="#&#*<d|‡ˆ‰‘“”•”””“‘‘‘‹”“““”•––—˜˜–”•—™™™—–˜™š™—–—˜˜–•˜žœœšš™—•••–––•™›œžž››œ›šœ››œ™˜™›œœ›žžœ››œœš˜—•““”•——–•”•˜wz|‚‡‹Ž¡†T+=\ž—Ž‹Œ‰„„…†…žR!#%!"" !$).11-(-60%&-%-79>A?5)!'74//.*!&'3Um~¬£de«À¶µ´³³³±°¯®¬¬««ª©©©©ª©¨§¦¥¥¥¥¤£££¢¢£¢ ŸŸŸŸŸŸ  Ÿžžžžœ››œ››œœœ›ššš›ššššššš™˜—˜šš˜–––•““”–•••–•“““’’’’’“’’’‘‘‘‘‘Ž‘ŽŽŽŽŽŽŽŒŽŽŒ‹Œ‹‹‹ŒŒŒŽ‹Š‹‹ŠŠŒ‹ŠŠŠ‹ŒŠŠŠ‹Š‹ŒŒ‹Š‹Œ‹Š‰ŠŠˆˆ‰‰‰ˆˆˆŠ‹‹ŠŠ‹ŠŠ‹‹‰ˆ‡ˆ‰‰ˆˆ‡‡‡ˆ‰‰‰ˆ†…„………„„ƒƒƒƒƒ„„ƒƒƒ‚‚‚ƒƒ‚‚52/,(""$#!,27768;<:9;:998:>??AJUan€––––‘Y?!-;4#$"!2Hi{‰‹’”•””““’‘’‘ŒŒ’“•–—˜™š™—••—™š™—•——˜˜—––––•’”—˜š›››š™˜–””•–•””™›ž››››œœ›™šœœš™™˜˜˜š›œœ››œœ››››š˜——•”“””””“’“”™so{ƒ‡¥Y'3P ™ŽŽŒŠ‰Š‰‡„…‡‡…‹žD$*"!"!!&,00,'-50')0*%3>A=3--,$ .00210(''1Rf…¼«xlrˆ¦³¼¸³³³²²±¯­«ªªª©©©ªª©¨§§¦¥¥¥¥£¢£££££¢¡  Ÿžž  Ÿžœ››œœ›™šš››œ›ššš™˜™š›š˜™™˜™™˜—–—–•””•–•””””’’’‘’’’’““’‘‘‘‘’ŽŽŽŽŒŒŽŽŽŒŒŒ‹‹‹‹‹ŒŒŒŠ‹ŒŠ‰‰Š‹ŠŠ‰‰‰ŠŠŠŠŠŒŒ‹ŠŠŠ‰‰ŠŠŠ‰ˆ‰‹‹‹Š‹Œ‹‰‰‰‰ˆ‡ˆŠ‰ˆ‡‡‡‡ˆˆ‰‰ˆ‡†…„„……„ƒ„„ƒƒ„„„„…ƒƒ‚‚‚‚‚2/.,% *05757::9:98777:<<<@HS`n€‘“‘›e@ $/+!$#!$9Rqy’š’”•”””“’’’’‹Š‘”–˜˜—˜™™™—–—˜™™™—–––——––•–—–•“–——˜™ššš™™˜––˜™•‘‘™›œœ›œœœ›™™œ›˜—–—˜˜˜š›œšš›œ›œœš—––••••”‘‘‘“”žšai{‚„ˆ¢‘[$.I¡œŽŒŠ‰ˆˆˆ‡ˆ‰‡…‹Ÿ6&-#$+//+(,1.'*1-!0CD=417:1#!*.133+('2NNy¼©Tu}€–¢®´¶´±²²±°­¬««ª©©ªªª©§§§§¦¦©§¢¢¤¤¤¤¤¢ŸŸ  Ÿž  Ÿœœœœœœœ›™˜˜˜™›œ›™™™˜˜™š™˜—˜˜———–•–˜—•”•––•”””””’‘’““’’’’’’““’ŽŽŽŽŽŽŽŒŒŽŒ‹ŒŒŒŽŒ‹ŠŠŠ‹ŒŒŒŒŒŠŠŠ‰‰‰ŠŠŠŠŠ‰‰‰‰ˆ‰ŠŒŒ‹‰‰Š‰‰Š‹‹Š‰‹‹‹‹ŠŠ‹Šˆ†ˆˆ‡‡ˆ‰ˆˆ‰‰ˆˆ‡‡ˆ‰ˆ‡†…ƒƒ…††………„ƒƒƒƒ„„ƒƒƒ‚‚‚‚-*(% ).3666889<<977:==<>BJS`o}‡‰ŠŒ—“lE %$#%# &=Xx…™˜’‘’””“““‘‘“”“‘ŽŒ’”˜™—–———–•••••––•––••••––•—˜›œš™˜˜˜˜˜˜—˜˜˜˜šš™—˜œœ›šššš™—˜œœš˜˜™™˜—˜˜˜˜™››š›œš–––••””“’’“•–¤ŸQc~††‰Ÿ’d +G ‹‹‹‹‹Šˆˆˆ‡‡‡…ƒ”š#',  )00,)*-+'*10* +AB=52:>5(#+0680 )&"!5R@pÁ³5fƒ‚‰ž¬¸²°°±°®­­¬¬ª©ªªªª©§¦¦¦¥§©§¤£¥¤£££¡Ÿ  žž  žœ››œœœ››œ™˜˜˜—˜›œš˜˜™™™™™—––—˜——–•”–˜˜–••••”“““”•”’’“’‘’’‘’””’‘’‘ŽŽŽŽŽŽŽŽŽŒŠ‹Œ‹ŒŒŒŠŠŠ‹Œ‹‹‹ŒŒŠ‹‹Š‰‰ŠŠ‰Š‹Š‰‰‰ˆ‰‰‹‹‹Š‰‰Š‰ˆŠŒ‹‰‰ŒŒŠŠ‹‹Šˆ‡ˆˆ‡ˆŠ‰‡‡‹ŒŠˆ‡‡‡‡‡‡‡†……†‡‡†……„ƒƒ„„„ƒ‚ƒƒ„…††'&#!',1567889;<;:;>@@?@DLUbnv}‚†ˆ‹fA $#")B^}Ž›”““‘‘”””“’’”–™–”’’•š™––˜™—–•“““”–”’”–•••–˜—•–˜œœ›š™™˜———˜˜˜šœ››œŸžœ›˜˜™™™™˜™œœœœœœš˜˜™˜˜š››ššœ™––—•••“’““”””ž£I`|††‰Œ™’j$G›•Š‹ŠŠŠŠ‰‰ˆ†„„ƒ€&((10,))*(&)/0.(#7>;20:?9.(1:>7'!,& $$"4RAqÌÃ'Rƒ‹‰Œš¥²´¯°°¯®­­­¬ªª«ª©©©§¥¦¦¥§¨§¥¥¥¤¢ ¡ Ÿ  ŸŸ  ž››œœœœ›››š™™š™˜šœœ›™™š›šš™—––—˜—–––•–˜˜—–••••”“’”–•“““’‘’’‘‘’“’‘’‘ŽŽŽŽŽŽŽŽŽŽŽŽ‹Š‹‹Œ‹Š‰Š‹ŠŠŠŠ‹‹‹ŠŠŠ‹ŠŠŒ‹Š‰Š‹Š‰‰ŠŠ‰‰ŠŠŠŠŠŠŠ‰ˆ‰Š‰ˆŠŒ‹ˆˆŒŒ‹Š‹‹‹‰ˆˆˆˆˆ‰Š‰‡‡‹ŒŠˆ‡††…†††††††††………„ƒ„……„ƒƒ„………##!%+15789:979;<=@BCCCFOV`ksw~„‚ƒƒ`: !.Hb|Š–““’Ž‘“”’‘“–—™––“‘’–˜™˜””˜™—––”’’”•“’––••–˜˜—–—š›››š™™–”•—˜˜—™™™™››š˜š›™—–——••——–™™›œžœ™—™š™™š››ššš›—–—–•••“‘’’“““”žUbz…‡‰‹–Žd,=——ŠŠ‰ŠŠ‰ˆˆ‰…‚‚‚„#$#,,*)**&%(/22-#&36+(5;91" -9?;,%/("#$0O9pÐÉ1!†’“›«±¯°°®¬¬­¬«ª«ª©¨©©¨§¦¦¦§§¦¥¦¦¤¢  ŸžŸ Ÿžžž››œœœœ›ššš›œ›šš›œœ››››ššš™˜˜˜———˜™—––——–•”••”“’“•”“’’‘‘‘’‘‘’’‘‘‘’‘‘‘ŽŽŽŽŽŽŽŒŒŠ‰‰ŠŠŠ‰‰‰‰ŠŠ‹‹‹‹‹Š‰‰ŠŠŠŠŠŠ‹‹Š‰‰ŠŠ‰‰‹Š‰‰‰‰‰ˆˆŠ‹Šˆ‰Š‰‡ˆŠŠˆ‰Š‹Šˆ‡‡‰‰‰ŠŠŠˆˆŠŠˆ‡‡†…………†††…††…„……ƒ‚ƒ…†…„‚ƒ…………""!#+2579::979;<>ACDEGKRX^hoty~~~]6$3Lc{‡’“’Ž’”“’”––‘“•”‘’”–™”’–˜—–——”’“•“‘“––•””•—™™˜˜™™™˜––”’“˜——————˜š˜—–˜™˜—˜™˜””––•••—š››š™˜™š™š›ššš™˜––—˜—•••“‘‘‘’“’’šQfzƒ‡‰Œ˜Š^(0œ‰‰ˆˆˆˆ‡ˆŠˆ„‚}!$((()*'&(-142)'.$&6;7/):C@0)3, !"-K(eÏÍY/„ŒŒŒŒ“¥­²±°®¬¬­¬¬¬¬«©¨©©¨§§§¨§¦¥¤¤¤£¢¡  Ÿ ¡¡ ››œœ››œ›››œœš™šœ›ššš›œœ›šššš›š™™™˜˜˜™™—–••••••••”“’”–•’‘‘‘‘’‘‘‘‘‘‘‘‘‘‘Ž‘ŽŽŽŽŽŽŽŽŽŒŒŒ‹Œ‹‹Šˆˆ‰‰‰‰‰‰‰Š‹‹Š‹ŒŒŠ‰‰ŠŠˆ‰ŠŠ‹‹ŠŠ‰ŠŠˆˆ‰‰‰ˆ‰ˆˆˆ‰ŠŒ‹ˆ‡‡‡‡ˆ‰‰ˆ‰‰‰‰‡†‡‡‡‡ˆ‰‰ˆˆ‰ˆ†……„„ƒƒƒ„„ƒƒ„…ƒ‚……‚€‚ƒ„„„ƒ‚‚ƒƒƒ„!""#,358::9879<=?@BDDHMSX\dkpsvyz~[4"*<Vl~‡Š’“’‘’““’””’‘•”’‘’’’‘”•”’””“’’“”““••”“’”–˜˜———˜—–””’‘‘“•–•””—˜———–——˜™š˜••••“”–—•–—˜˜—–—˜™š™˜”–—–••——–”””“‘‘’‘‘–auz‰ŒŽ™h%#‰›‰‰ˆ‡†††‡‰ˆ…ƒŠu !$$&))(&',35*!#"9?:1%9B=0,5, !+GXËÎnNƒˆ‡‹ˆŽ¢­µ±°®¬­­¬««««©¨¨¨§§§§¨§¦¥¤¢¡¢¢¡    ¡¡ ›œœœ›››šš›š™™š›œ›™™™™™šš™™™šš˜—˜˜˜˜˜˜—–•””””–––•”“““••’‘‘‘‘’’‘‘‘‘‘‘‘’‘ŽŽŽŽŽŽŒŽŒŒŒŒŒ‹Œ‹ŠŠŠ‰‰‰ŠŠ‹‹ŠŠŠŠ‹‹‹‰‰‹‹‰‰ŠŠŠ‹‹‹ŠŠŠˆ†‡ˆˆˆ‰ˆˆ‰Š‹‹‰‡††‡‡ˆ‰‰Š‰‰‰ˆ‡‡‡‡††ˆ‰‰ˆˆ‰ˆ‡††…„„ƒ„……„„…„‚ƒ…„‚€ƒ„„…„‚‚ƒƒƒ„$%%#!#,358:;:89:=>@ABDFHMTZ`flptxz{}T5 !$1?`v†ŠˆŒ‘‘‘‘’””“““‘’•“‘‘‘Ž‘’““’‘‘’’‘’””“”••”““•–––——–––•”“‘‘”–––••–—˜˜–––˜˜™š™——–””•–——–˜™—–——˜š™˜–•–˜˜™˜—–•••””’’‘‘’’—“gw||‡ŒŽ››u%9‹ ‹Šˆˆ‡†……††…ƒ‰l!$)+(%%*47)"' 7@>4#2=;208. (C%PÊÐ<„‰‹Œˆ‹¢¯º°°¯®­­«ª«««¨¨©©¨§¦§§§¦¦¤¢¢¤£¡ŸŸ     Ÿžžœœœœœ›››š™™š›œ›™™˜˜˜™™™˜˜˜™—————––—–•–••••–––––”““”“’’’‘‘‘’’’’‘‘‘‘’“’ŽŽŽŽŽŽŒŒŒŒ‹ŠŠ‹ŒŒ‹‹Š‹ŒŒ‹ŠŠŠ‹‹‹Š‹Œ‹‰‰ŠŠ‰‰Š‹ŠŠ‰ˆ††††‡ˆˆ‰‰‰‰‰ˆ‡†††‡ˆ‰‰Š‰‰‰‡††††……‡ˆˆˆ‡ˆˆ‡†………ƒ‚ƒ……†‡†„ƒ„„ƒ‚‚ƒ„„ƒ‚‚‚‚‚+*)'$ $+047:<;::;<>@A@CGILSZbhmosƒzP5 " &8Ji€ˆ‡‡‹Ž‘••“““‘‘“’Ž‘”“’’““’’’’“•“”••“’“••””–•““–—–“‘’–˜——–••–˜—••–˜™™™˜—–””•–––—˜šš—–————••”•—™™™˜–”••”””“““’“‘–‰Yuz†‹¤„&<Œ¦Š‰ˆˆ‡…ƒƒ„†…ƒ~i!(,($$)8:($1*1<@?1(%#8<3091%@CÈÐ’_‚‰‰‰}œ©»³°°¯®¬««ªª©¨¨¨¨¨§¦§§¦¦¦¥¤¤¥¤¢žžŸžžŸ Ÿœœœœœœœ›œ››šššš›™——˜˜˜™™˜——˜˜————––————•”––•”••••”““’’’’’‘‘’“““’’‘““ŽŽŽŽŽŽŽŽŽŒŒŒŒŠŠ‹ŒŒŒŒŒŒ‹ŠŠ‹‹‹‹‹ŒŒ‹‰‰ŠŠ‰ˆ‰Š‰ˆ‡‡…†……‡ˆˆ‰‰ˆˆˆˆ‡†……†‡‰‰‰‰‰‰‡†‡‡‡………‡‡ˆ‡ˆ‡‡††††…ƒ„……‡‡†„„„„„„ƒ‚‚ƒƒƒƒ‚‚‚‚.-,)% %+-159;;;;;<=@ABDHKOU^floju…†‰yQ6 *?Uq†Šˆ‰‘””“““‘Ž“•“‘’””’’””‘’–•”““’’•—–”’‘’•˜˜–”““•˜™—–•••——––•—œ——–”‘“—™—–—™š›—––———”””•–˜˜˜–”””“’“““””“’‘‘„orxˆŠ‹Š§Œ&)…Ÿ‰‡‡‡†„ƒ„…†…‚{{e%+'%(0><)(:5*5>@61,#2;/-73"<BÆÌ—z}zyƒ“™­±®¯¯­«««ª©¨¨¨§¦§§§§¦¥¥¥¤¤¤¤¥¦   ŸŸŸŸž›š™˜™››˜—˜˜˜™™˜––˜˜——˜˜—••–——”“””“’“”““““’‘’““““’’“““’‘‘’’ŽŒŽŽŽŽŽŒ‹ŒŒ‹‰‹Œ‹‹‹ŒŒŒŒ‹ŠŠ‹‹Š‹‹Š‹‹ŠŠŠ‰ˆˆ‰‰‰‰‡…„ƒ„……‡‡‡ˆ‡††ˆˆ‡…„„…†ˆˆ‰‰‰‰ˆ‡‡‡†……†‡‡ˆ‡……††……†…„ƒƒ„…†…„ƒƒƒƒ„„ƒ‚‚‚ƒƒ‚‚€,++("&+.048::::;;=?BDFHMOT]hpt{‰‘xR6 !1H[tˆ†ˆŠ‘’’‘’“‘’“‘ŽŽ‹‘’’“”’““’“••’’••“‘‘’“•—–”’ŒŽ•—˜——–““–—–“””•–——•“”—•“””‘‘•˜—••——˜—••—˜–”””“’“”””“’‘Ž‘‘’“’‘†trw€†‰‹Š­—#4|š‡‡‡‡††……„„ƒ~zz[ %%().=>,,><&!.<>431* ,5('45"9!OÇË™’˜—— «¬£¡¬®¬¬®«ªª«ª©¨¨¨§¥¦§§¦¥¥¤££££££¡ŸŸŸ  Ÿžžœœžžžžžœš™˜˜š›™————˜˜–••—˜—˜š™—–••——”’“““’““’‘’’’’”••””“’’“’’‘‘‘ŽŽŽŽ‹‹ŽŽŒŒ‹ŒŒ‹Š‰ŠŠ‹‹ŠŠŠŠ‰ˆŠ‹Š‰‰ˆ‰Š‰ˆˆ‰ˆˆˆ‡…„„…†‡ˆˆ‡‡‡…†ˆˆ††††††††‡‡ˆˆ‰‰ˆ‡‡‡‡ˆˆˆ‡…„…†‡…„……„ƒƒ„……„„ƒƒƒƒ„„„ƒ‚ƒ„ƒƒƒƒ€)'&$&,/0379889;<=?AEHJMOT_ju~Š˜žš‘vQ4"# $9Q^u…‡ŠŒ‘“’‘’‘‘’’’‘‘Ž‹‘‘’“’“””••”’’’““’‘““”––”‘Ž’–—˜˜—”’“•”“”••––—–“’‘‘‘“”’’•–––––•–––•––••••“’’““’““’‘‘Ž’’’’†wuy†ŠŒ‹ª.u’‡‡‡‡†‡†„ƒ‚€~znU &(,=>-->>-(=?753-%"+##38(6#UÆÇ•”™ž¥§¸Ã¼±¬«©¨ªªª©««ªª©©¨¦¥¦¦¥¥¤£¡¢£¤¤£¡ŸŸ  ŸŸ Ÿ›šœžžžžžœ›™˜—™™˜—˜™˜˜—–•––––˜š™–•–––•”“’“““““’’’“““”•”””“’’’’’‘ŽŽŒŒŒŒŒ‹Š‰‰‰ŠŠŠŠŠŠŠ‰‡‰‹Šˆ‡†‡ˆˆˆˆˆ‡‡‡‡†…†‡ˆˆˆˆ‡‡†††‡‡‡†††‡†……††††‡ˆˆ‡‡‡††††…„„…††ƒƒ„ƒ‚‚‚ƒ„„„„ƒƒƒ‚‚‚ƒ‚‚‚€€€~}~%$!&,/149:977:<>?AEHJMPU_iw‰“šŸ’xP2#$!&=Vcy…‡ŠŒŽŽ‘’‘’“‘Ž‹’”•”’‘‘‘‘‘‘’•••“‘‘““••’‘‘’““••””•––•“’‘‘”–•”•––—˜™—””–—•”•••••“’“““’“”’’’’Ž‘’“”’‡zxz€…ŠŒŠž›+lŠ†‡‡†††…ƒ€~{jK!#"$)<=+,<=3*9?863/*#39./dÅÄ“‡rx–› §¬±®ª©¨©©©ªª©©©©§¥¤¥¦¦¥¤£¢¡¢££¢ ŸŸŸžžŸž›šœžžœœœ›š™˜———–—™™˜—–––——••—˜—•••••””””””““’’’’““““’‘“””’‘’‘‘‘ŽŽŽŽŒŒŒŒŒ‹Š‹ŒŒŒ‹‹Š‰‰ˆ‰‰‰ˆ‰Š‹‰ˆ‰Š‰‡††††‡‰‰ˆ‡‡‡ˆ‡†‡ˆˆ‰‰ˆ‡‡‡††‡†††††††…†‡‡†…†‡††‡††………„…††††„„„ƒƒƒƒƒ„ƒƒƒƒƒ‚€€€€}~~~! &,/049;;:::;>?AEHKOQV_hzŠ“™ ¥“zP1##"+AYkŠ‹Ž‹‹‘ŽŽ‘ŒŽŽ“•–”’‘‘‘‘‘’”““““’‘““’‘’“”•–•”“””••”“’‘“–—––––˜™™˜–•—˜•••–—–”’’““““““‘‘ŽŒ‹’”“„wxz}…Š‹Š¤Ÿ&dŒ††‡‡†„‚€~~}‚d@"'% ';>,,9:82#-99940.'#491!3(sÁÄ¢Ž`bs„oƒ ­±´¯£Ÿ¨©ª«ª©©¨§¦¥¦§¦¤£££¢¡¡¡ ŸŸ  žœŸžœœœžžœ››œœ›š™™˜™˜—™›š™˜—–—˜˜–••——––––•””••”“““’’’’’‘’’‘””’‘‘ŽŽŽŽŽŽŽŒŒŒŠŠ‹Š‰ŠŠ‹ŠŠŠŠ‹ŠŠ‰ˆ‰‰ˆˆ‰ŠŠ‰‰‰‰ˆ‡††………‡ˆˆ‡‡‡‡‡…†ˆˆ‰‰ˆ‡‡‡‡†…………„…†……†‡‡†„„„„„„„……………†††††……„‚‚ƒƒ‚‚‚€~~~~}}}~~&,/147::;<;;>?AFJLOQU_h{Ž—™š¢ŽxO/!" ! $2EZn…‹ŒŒŒŒŽŒŒŒŽŽŽŽ“””““’‘‘’’‘‘‘‘““‘‘“””’‘‘’“•”“’’“•–••”“““””••“’’”•””“”–—•”””••“’”–—–’‘‘’’’‘’‘ŽŽ‹ŒŽ”|puy{„‰ŠŠ§ Z{Ž…„†‡†„‚€~~}\3"(+%#9>-,4597(!1;<401.#"4<4# (S…½Ä´¥i…Šƒƒšœ—š–®«ªª©©©©¨§¦¦¦¥¤££¤£¢¡ ŸŸ   žžžœœ›œœœœœœšššš›š˜˜™™™˜—––—˜—–•–—–•–—•””””““““‘‘’’’‘‘‘‘‘““’ŽŽŽŽŽŽŒ‹ŠŠŠŠ‰ŠŠ‰ˆ‰Š‹‹‹Š‰ŠŠˆˆ‰Š‰ˆ‰ˆˆ‡‡†††‡‡ˆˆˆˆ‡‡ˆ‡„…ˆˆˆ‡‡‡ˆˆˆ‡†………„…†……†‡‡‡………„„„ƒ„…………††…††……„‚‚ƒ‚€€€€€€€€€€ƒ#"!$-013589;<<<?@AFLMOQU^gz‘œ–š¡|Q. ! (9L_q„‹‹ŒŽŒŠ‹ŒŒ‘‘’‘Ž“”“”“’‘‘‘‘’’‘‘”••”’’•—–”““”••””•”””••–—–’‘“““’‘••’‘’“’“‘‘”–—–’‘‘‘‘Ž‘‘ŽŽŽŒ…{utx}„ˆ‰‹¢œVuŒ„‚„…„ƒ‚€‚Y+#*/,"6>/.56<:*"':?5044.6@8&#,r’·¾·«ŠŠˆ†‰Œ‘˜–‘Š‹’œ²¬«ªªªª©©¨¨§¥£¤¤¤£¢¢¢¡ŸŸŸŸžžžŸŸœ››œœœœ›™™™šœœš˜—˜™˜—–––——–––—–””••““““‘‘‘’‘‘‘’’‘‘‘‘‘‘‘‘ŽŽŽŽŽŽŽ‹Š‹‹‹Š‰ˆ‡ˆ‰ŠŠ‹ŠŠ‹Š‰‰ŠŠˆ‡ˆˆˆ‡††††ˆ‰ˆ‡ˆˆ‡†‡‡††‡‡†††‡ˆˆˆˆˆ‡……††……†‡‡‡‡†………„ƒƒƒ„„ƒ„††………„ƒƒ€€~~€‚€~~€€‚‚€ƒ'&$#!!*/0//26:;;;>ADINOPTY^ew¡› Ÿ}N) *AVgr‰ŠŒŒŽŽ‘’‹ŠŒŒŽŽ’Ž’“”“‘ŽŽ‘‘‘‘’‘ŽŒŒŽ’’’“”•”’‘•—•“‘‘““““”•–•”•–˜–’’““‘‘••’‘““‘‘‘’”•••“’‘‘ŽŒ‹ŽŒŽŒxuux}ƒ†‡‰£¦SqŒ„‚„ƒ‚€‚X%'.23,!3=//7:>:-*+4?62463&5A;('6ƒ–®°¯©|‘”‰„‘”——–”‘’›ª¯«ªª©©¨§¨©¨¦¤¤¥¤¢¡¡¡ žžŸžžžŸ Ÿœœžžœš˜™ššš›™———˜˜——––———–•––”“””’’“’‘‘’’’’’“’‘‘‘‘‘‘ŽŽŽŽŽŽŽŒŒŒŒŒ‹Š‹ŒŒ‹‰‰ˆ‡‰ŠŠŠŠŠŠŠŠŠ‰‰ˆ‡ˆˆ‡‡‡†‡‡‰‰‡†‡ˆ‡†ˆ‰ˆ‡†……††‡ˆ‡†‡ˆ‡……††……†‡‡ˆˆ†„…††„ƒ„ƒƒƒ„†‡†……„ƒƒ€€‚€~‚ƒ€€€€ƒ„‚))(&#',,,,-1689:>CKRUSSW]`cvŠ¤£¦—{p># /Kbpu~ˆ‹ŒŠŠŽŒŽ’’Ž’””“’‘‘‘‘‘‘’’Œ‹Œ‘“”““””•”’’–˜•’Ž‘’““”–—•“’”––’‘““’‘’”•”’”•”’’“““””””“‘ŽŒŒŒŽŒŒŒŽ’‘Œ‚vtv{‚„…‡ª/Jk†„„††ƒ‚‚’J+2672)4<//8>A<0/1&+842320&1A;(9‚—«®°«tŒ§¡š˜”“™š“‡“¢¯­ª©©¨§§¨§§¥¤¥¥¤¢¢¢¡ŸžŸ¡¡  ŸŸŸžžžœœœœ›™š›š™š™˜———˜™™˜˜˜——––——•””“’’””“’“”••”““’’’‘‘ŽŽŽŽŽŽŽŽŽŽŒŒŒŒŒŒŠŠŒŒ‹Šˆ‡‰‹Š‰‹‹Š‰‹‹‰ˆˆˆˆˆ‡‡‡‡‡ˆˆˆ‡……†††‡ˆˆ†„ƒ…††‡†……††…„„………†‡ˆˆˆ‡…„„†‡„ƒƒƒ„……††………„ƒ‚‚€~~€€€€}}ƒ++,(#"%&'()*,.16=FQZ]YX]aciu}‘”œ‹YU4#6Thv{~…ŠŒŒŽŽŒŒ‹‰ˆŠŽŒŒŽ‘‘Ž”“’‘’’‘’’’“””‘ŒŒŽ‘‘‘’’’’“””“’’“”“’‘’“”“‘”•“‘‘’“’’’“••“”••”“’‘’““”““’‘ŒŒ‹‹‹Œ”’Ž‡wsv|€ƒ……†ŒžAAk“†……††ƒ‚…3,3773-#.3,/48?<10/( +/120-&0B=)'(…Ÿ®©º®Xf¢¯³Ÿ˜›”’•œ§ª¨¨¨¨§§§¦¥¤¤¦¦¤¢£¢¡ŸžŸ¡¡ ŸžžžžŸŸžœœœœœ›šš›š™šœš™˜˜—˜˜˜˜˜˜——————–—–””“’‘’“”““””•••“‘‘‘‘Ž‘‘‘ŽŽŽ‘ŽŽŒŽŒ‹‹‹Œ‹ŠŠ‹ŽŽŒ‰‰Š‹ŠŠŠ‰ˆ‰‹‹ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ†…†ˆ‡‡ˆ‡…„„†‡‡‡†…………„ƒ„„ƒ…†‡ˆˆ‡†…„…‡†…„ƒƒ…††……†……„‚‚ƒƒ‚€‚ƒ~~~€€}~€‚+-/,&!!!!"#%',9HU`dcbcefksxƒ‡”‰RE*(=Wiw€ƒ‡‰‹‹Œ‹ŠŠ‰ˆˆŠŒŽŒŒŒŒ‹Ž‘’‘‘‘‘’““””’‘“””’‘‘‘”•”’‘‘‘’”“’‘‘‘’““‘‘’“‘‘‘’“’“”••”“”•––“‘‘’’’’’’’‘Œ‹ŒŒŒ’’Žƒzuw|…ˆŠ‹—M 7b‘‰…„„„‚‚ƒ}‚ˆ')28<90$ '(-.1;;2.+('(020-&5F?)  <“«°¦»°3lˆ––žµ¸©¬«¡ž§­©©©§§§§¦¥¤¤¥¥£¢¢¢¡Ÿžž ŸžžŸŸžŸ ¡Ÿœœœœ›š™š›™˜™›š™˜˜˜˜™™˜—–•–——––––•“““’‘‘““““”””•”’Ž‘‘ŽŽŽŽŒŽŽ‹ŠŠ‹‹‹‹‹ŒŽŽŒ‹‹Š‰‰ˆˆ‡‰‹‹‰‰‰ˆˆ‡‡‡ˆˆˆ‡††‡†††‡‡‡‡†…†††††‡‡……„„„ƒ„„ƒ„†‡‡‡††…………„„„„ƒ…†…„†‡†…ƒ‚‚‚‚‚~~€‚‚~}||~~}}~~~‚+-0/+& %3HWeklkjjkpuy|~…}W=( !-C]nzƒ‡ˆˆ‰ŠŠ‰‰ˆ‰‰ˆˆŠŒŒ‹‹ŽŽ‘‘‹Š‘’‘‘’’’’‘‘“•“‘ŽŒŽ“–”‘Ž‘‘’‘‘‘‘’’‘‘‘’“’‘’“’““’’“”•••“‘‘‘‘’’‘ŽŽŽŽŽŽ{xvxz†Š‹Œ’b/(Fƒ†ƒ‚€€ƒƒ{~")4;?>4$! &(-9:2,%'0'",..,&<KC*18H¡´®¥º±4^bnxŠ§¹¼¹§£¡Ÿ¥±®«ª¨§¨§¦¥¤¤¤¤¢¡¡¡¡  ŸŸœžŸžžŸœ›šš›š˜—™™˜™˜˜˜˜™˜—–••–——––––”“””“’’“““’“““““‘‘ŽŽŽŽŽŽŽŽŽŽŽŒ‹Š‹ŒŒŒŒ‹ŒŽŽŒ‹Š‰ˆˆˆˆ‡ˆ‰‰‰‰ˆˆˆˆ‡†ˆˆˆ‡††‡‡‡‡‡‡‡†……†……„…†‡†„„„ƒƒ„…ƒ„†††…†‡………ƒƒƒ„„„…„ƒ„‡†…„‚‚}~€€~~||}~~}}}}€(*.0.+$"1J^rvvwrrtvxyxwyqN:$#2Kfv…ˆ‰Š‹ŒŒŒ‹‰ˆˆ‰ŠŠ‹Œ‹‹ŒŽŽŽŽŽ‹‹Ž‘‘Ž’“’‘‘“’Ž’•”‘‘‘ŽŽ‘’’‘‘’’“’‘’“’‘‘“”•““’‘‘ŽŽ‘‘ŽŽŒxwwxy{‰ˆˆˆŠ“o0:ƒˆ„ƒ€‚~z~{ ,8AED8(!%#!%.;;1+#'51$)+*%"=LC*,KPV«º¨¦¾³6TfgcVJ^‡¢©©¢¢¡¢¦²¯«¨¨¨§¥¥¥¥£¢¡¡¡¡¡   ¡Ÿžžžžœžžœ›››™˜˜˜˜˜™™˜˜˜™˜——––—˜˜————–••”””””•“’’’’’‘‘‘’“’’‘‘‘‘‘ŒŽŽŒŒŒŒ‹ŒŒŒŒŒŒŒŒŽŒŠ‰‰ˆˆ‡‡ˆˆ‡‡ˆˆˆˆˆˆˆ‡‡ˆˆˆ‡‡‡‡‡‡‡‡††…„ƒ„„ƒ„…††…„„„„ƒƒ„„……………††„ƒ„ƒ‚ƒ„……„‚‚„…„ƒ‚‚‚~~€~~~}||||||||}~€'),./.)#!0J_u|{|zz{{{ywusmP5!$6Pn|€…ˆ‹ŒŒŽŽ‹ˆˆ‰Š‹‰Š‹Œ‹ŒŒŒ‹ŠŠŠŒŽŽŒŒ‘’‘‘ŽŽ‘“•”‘‘“’ŽŒ‹‹ŒŽ‘’‘‘‘’’’‘‘’Ž‘’Ž’’‘’‘ŽŽ‹‹ŠŠ‹ŒŒŽ‹ruvwx|„†…„ƒŽ{A#9’Š…„}||}|z„s/>FJF:*!"#(9:0)#&01+#((%"<JC+.M[_¯¼¦¥ÁµC\gffjiNQp‚š¶²¢ ¡¦©§¦§§¥¦¦¤¢¢¢¢¢¢¡ Ÿ ¡Ÿœœžžœ››ššš™˜˜—˜™—–—˜™™˜˜—––————˜—––•””””””“’‘‘‘‘’“’‘‘‘‘‘ŽŽŽŽŽŒŽŒ‹ŒŽŒŒŒŒŒ‹‹‹‹‹‰ˆˆˆˆ‡‡ˆ‰‡‡‡‰ˆ‡‡‡‡†‡ˆ‰ˆ††‡ˆ‡‡‡‡†…„ƒƒ„ƒƒ…†……„ƒƒ„„ƒƒ„††…ƒƒƒƒ„‚ƒ……„ƒ„……„‚‚ƒ‚‚ƒƒƒ‚‚€~~€€€~}~~}||{||||}€(*-/00.*#/Ibx{~€~||zxupeM1&;Tny„ˆŒŽŠˆˆ‰‰ˆˆ‹ŽŽŒŒ‹Š‰ˆˆ‰‹ŽŒ‹ŒŽ‘Ž‘’‘’“‘Ž‘’’““‘“”‘ŽŽ‘“”“‘‘’’‘‘’ŽŽ‘‘ŒŽ’’’‘’’‘ŽŒŠ‰Š‹ŠŠ‹‹‹‹ŠŠ‹Œ‹‡nssvx|ƒ…„…„“‡V2‘‚‚}||||{ƒk,=KMF;+!37.(#%*,0*&(&$=ID.#FGF¨»¨¤À¶Tdlkjjjja.E{°Ç¤£¢¤¦¦§¨¨¦¦¦¤¢¢¢¢¢¡ ŸŸŸŸ›œœžœ›š™™™™šš™˜˜™™—•–˜˜˜————––••—˜—–––••”““““’’’‘Ž‘’’‘‘‘ŽŽŽŽŽŽŽŽŽŒŒŒŽŒŒŒ‹Š‰Š‹‹Š‰ˆˆˆˆˆ‰Š‰‡‡ˆ‰‡…†††‡‡ˆ†……†††……††…„ƒƒƒƒ„…………„ƒƒ„…„„…‡†„‚‚ƒ‚ƒƒƒ„„„ƒƒƒƒƒƒ€‚ƒ‚‚ƒƒ‚‚€€~~€€~~~}}|{{|||}~0011354/($!.G`vz|~~}|{yxuocJ/+AXl{ƒ†‰Š‹ŽŒ‰‡‡‡‡‰‹ŽŽ‹‰‰‰ˆ‡ˆŠŒŒŽŽ‘‘‘“’ŽŽŽŽ‘’‘‘‘‘‘“””“‘‘‘Ž‘ŽŽŽ’’‘‘ŽŽŒ‹‹Šˆ‡ˆŠŠ‹‹Š‹‹ŒŒttsvy}ƒ…„†‡‘Œ]$ƒˆ~€€~~}|{c#2BFA9)'.*&%&(+2. &%"8EA/!!2¡¹£¢¸°Icopnkhfef7H¯ÂÄ·¦£¤¥¦§§¥¥¤££¢¢¢¡ Ÿžœ›œœœœœœ›››™˜˜˜˜˜™™˜—˜™™˜–•–——––—–•””•–—•••––•”“““““““’‘‘ŽŽ‘‘‘‘ŽŒŽŽŽŽŒŒŒŒŒŒŒŒŒŒŒ‹Š‰‰Š‹‹‹Š‰ˆ‰ˆ‡ˆŠŠˆ‡‡ˆˆ‡‡‡ˆˆˆ‡…„……„ƒ„„†††„„„ƒƒ„……††„ƒƒ„††……††„ƒ„„„ƒƒƒƒƒƒ„ƒ‚‚‚ƒ‚ƒƒ‚‚ƒƒ‚€€~€€€€~||}}||}||}}~~~46645882+'#.F_wz~~|{|{ywwtm`F,!1J]s}‚„…‡ˆŠŒŠŠ‹Œ‰‡†‡‰Š‹ŒŠ‰ŠŠ‰‡ˆˆŠŽŽ‘‘ŽŒŒŽŽŒŒ’“’’‘‘“”“‘‘‘ŽŽ‘’‘‘ŽˆŠ‹‹ŠŠ‹‰ˆ‹ŒŒ‹ŠŠ‹Œ–ytrtv{ƒ…„…†ˆŒbw€~€€€~||zuU$4@C:& #$#$&)0.# /=<+<©¾¨¡¹®A`qsplgecefC?ZŽ«±«¥¥§¨¨¦¤¤¤£££¢¡  Ÿžœœ›œœ›œœœœ›š™˜˜˜˜˜—˜˜˜˜™™˜˜—•”—˜—–—–•””•—˜–””•–”“““’“““’‘‘‘‘‘Ž‘‘ŽŒŒŒŒŒŽŽ‹Š‰ŠŒŒ‹‹ŒŒŒŠ‰Š‰‰‰‰Š‰ˆˆ‰ˆ†…ˆ‰‡…†‡ˆˆˆ‡ˆ‰‰‡…„…†„ƒ‚ƒ…†„ƒ„„ƒƒƒ„………„ƒƒƒ…††…„…„ƒ„…„„‚‚ƒƒƒƒƒƒ‚‚‚ƒƒ‚‚ƒƒ‚€~€€€~}}}~~}}}}||||||47754671,'!.F_uz~}zxyyvuurk^B)$7Rg}~ƒ††††ˆŠ‹ˆ‡ˆŠˆ‡‡‰‹‹‹Œ‹‹ŠˆˆŠ‹‰ˆ‡†ˆŽ‹ŠŒŽŽŽŽŽŒŠŠŒŽŒŽŽŽ‘’’‘ŽŒ‘‘‘Ž‘‘ŽŽ‘‘ŽŽŒŠ‹Œˆ‰‹‹ŠŒŽŽ‹‰‰‰‹Œ“uroqsy‚„ƒ„„…šr"t‚‚€~|||}sU"1=5!! ")*$&&¢ºª£½°D_rtplhedhkn_D^ƒ–œšž¢ª§¥£¤¤¤¤£¡  Ÿžžœœ›šš›››œš˜—˜™™—–—˜—–˜˜˜——”“–˜————–•””•–•““”•”“’‘‘“’‘Ž‘‘‘‘‘ŽŽŽŽŒ‹Œ‹Š‰‰‹Œ‹ŒŒ‹ŽŒ‹Š‰‰‰‰‰‰ˆ‰‰ˆ†…†ˆ‡……‡‰‰‰ˆˆ‰‰ˆ††††…„ƒƒ„…„ƒ„„ƒƒƒƒƒƒƒƒƒ‚‚ƒ„„ƒ‚ƒ„ƒƒ„…„ƒƒƒƒ‚‚‚€‚‚‚ƒ‚‚‚‚‚€€~}|}~~~}~}|}}{{{/464221.+'!.G_ty|{wvwwuttqiZ>' (;Vj}ƒ‡ˆ‡‡ˆŠŠ‡†‡‰‰ˆˆ‹ŽŒ‹‰††‰‹‹Š‰‡ˆ‹ŽŽŒŠ‰ŒŽŒ‹ŒŒ‹ŽŽŒŒŽŽŽŽ‘’’‘‘’ŽŒŽŽŽŽŒŠ‰‹Œ‹ˆˆŠ‹‹‹Œ‹ˆ‡ˆ‰Šmnmqtx‚„„„–}r‚ƒ€}}}{pU*' "!¡¿¸ÀÉ´GGswsmihhkpsswyuƒ‘“—ž¬®¥¤¤¤££¢¡ žžŸ žœ›š™™šššš˜˜™š™—–——–•–—–––•“•—————–•””••”“’”””’‘‘’ŽŽŽ‘‘‘ŽŒŽ‹‹ŒŒ‹Š‰‰Š‹‹ŽŒŠŒŒŒ‹‹‹Š‰‰‰‰‰†††‡‡†„…ˆ‰‰‰‰‡‡‰‰‡‡ˆ‡‡†„ƒƒ„„ƒƒ‚‚‚ƒƒ‚‚ƒƒ‚‚ƒƒƒ€‚„ƒ‚„……ƒ‚‚€€‚‚‚€~~€}{{|}}}|}}||{zyz*.11/..--("0JauxzzwvxxwvvrhW<%!*=Wk|€ƒ†ˆ‰ˆˆ‰‰‡‡‰‹Œ‹Š‹Œ‹ˆ†…ˆŒŽ‹‰ŠŒŒ‹‹ŒŒŒ‹ŠŠŒŠ‰‹ŽŽŽŒ‹‹‹‹ŠŠ‹ŽŽŽ‘ŒŒŒ‘’ŒŽŽŽŒ‹‰‰Š‹ŠŠ‰ˆŠŠŠŠŠŠŠŠ‡††ˆˆ‹oonrvy|„…„‚™Œo‹€€€~~~|mNŸ¼¶¾Á¤S]xsqmifflp~Š…‡‘‘††«©¢¢¡¡¡¢¡ŸžŸ¡¡Ÿžœ›››š™™š™™™™˜˜™˜–—˜—••–—–•–”’“–————–•”“””“’““”“’‘‘‘Ž‘Ž‘ŒŽŒŒŠŠŒŽŽ‹ŠŠ‹‹‹‹‹ŒŠ‰Š‹ŒŒ‹‹ŒŠˆˆ‰Š‰††ˆˆ‡‡††ˆ‰ˆˆˆ‡‡‰‰‡‡ˆ‡†……ƒ‚ƒ„ƒƒƒƒƒ„„„‚ƒƒ„„‚ƒƒ‚€‚ƒ‚‚ƒ…„ƒ‚‚€€‚ƒ‚€‚ƒ‚€€€€~€}|||||}}|{{{{zzz{|"&*-.--.-("2MdqxzzxxyzyyythV;$ "-BZmz€ƒ†‰‹‰‡ˆˆ‡‡‰ŒŒ‹‹Œ‹‹Œ‹Š‰‰Š‹ŒŽŽŒ‹Š‹‹‹Š‰‹Œ‹ŠŠ‹ŽŒŒŽŽŒ‹‹Š‹ŒŒ‹Š‹‘‘‹‹Œ‹‹ŽŽŽŽŽŽ‹ŠŠŠŒŒŠ‰ŠŠŠŠŠŠŠŠŠ‡††ˆ‰rqqtwz~‚„……„˜–h‡~}~€€~~}|jGCE`qh6?gxsa`_^bsy›šž›˜“—¥°ºÀº°®°¬ª£ŸŸ ŸŸŸž›š›››ššš™™š™˜˜™—–—˜—•–—˜—––”“”•–—––––””••“’“““““’‘ŽŽŽŒŽŒŒŒŠ‰‹‹ŠŠ‹‹‹‹‹‹ŒŠˆŠŠ‹Œ‹‹‹‹Š‰‰‰‰ˆ‡‡‰ˆ‡ˆ‰ˆˆ‡†ˆ‰‡‡‰‰‡††…„„„„ƒƒ„ƒ„„„„………ƒ‚‚ƒƒ‚‚‚€€‚ƒƒƒ‚€~‚ƒƒ€‚ƒ‚€~}€~}||||{{{{{zzyz{|}%*----+&!3OesyzywwxyyyxrgU;$!! $1G_oz€ƒ…‰‹ˆ‡‡‡‡ˆ‰ŒŽŒ‰‰‰Š‹‹‰‹ŒŠ‹‹Œ‹ŒŒ‹Š‰ŠŒŒ‹ŠŠ‰ŠŠ‹‹‹ŠŠŽ‹ŠŠ‹ŒŽŽŒŽ‘‘’‘Š‹Œ‹ŽŽŽŽŽŽŽŽŽŒ‹ŒŒŒ‹ŠŠŠŠŠ‰‰‰‰ˆ‡ˆˆ‰‹rrrtvz‚ƒƒƒ„›Y{y{}~~|||{xd>*<<CR`r©±²¸¼½½¾ÀÃÃÃÅÃÀ¿¿¾¼·´µ±¬§¡Ÿšš™™™˜—–––––•–˜™˜—–•””•””•–––•”••““”“’’“““ŽŽŽŒŒŽŽŒŠ‹ŒŒ‹‹‹Š‹‹‹‹‹Š‹‹ŠŠŠŠ‹ŠŠŠŠ‰‰ˆˆ‰‰ˆ‡‰Š‰‡††ˆ‰†‡‰ˆ†……„ƒƒ„……„„„„……………„‚‚ƒƒƒƒ€€€€‚‚‚~€€‚‚‚‚‚€~~~||}|{z{{{zz{{||}#),..-*$ 4SixzywtuvvwxvqeR:$ "! &6Nht|ƒ„ˆ‹Š‰‰Š‰ŠŠŒŽ‹‰Š‹Š‡ŠŽŒŒŒŒ‹Œ‹ŠŠŒŽŒŠŠŠ‰ŠŒŒ‹‰‰ŒŒŠŠŠ‹ŽŽŒ‹ŒŽ‘‘ŒŒŽŽŽŒŽ‘ŽŽŽŽ‘Ž‹‰Š‹‰ˆ‰ŠŠˆ‡‰Š‰ŠŠ“ppqstx‚‚‚ƒŒ*Ppyz{||{{{yt[4Kjt~‘ £¥ª¬¬­±··µ¶¼¿»¸¸¸·¸¹¼¼µ¨¦£›–””˜˜™™˜————–””•–––••––••”“’’“““ŽŽ‘ŽŽŒŽŒŒŒ‹ŒŒ‹Š‹ŒŒŒ‹Š‰‰‹ŒŠŠŠŠŠŠŠ‹‹Š‰ˆ‰Šˆ‡††‡‡……‡ˆ‡…„…„ƒ„††……„„………„ƒƒ€€‚ƒ‚ƒƒ‚€€€€‚€~€€€€€€€€€€€€€~~~~~||}|zyz{zyz{{{{{!(+//-*$ 2Siz{yurrtuuurm]J5#!" "+=Tmx~ƒ„†ˆ‰Š‹‹Š‹Š‹ŽŽ‹ˆˆ‰‡…‡Œ‹ŠŠŒŽŠ‰‹Œ‹ŒŽŽŒ‹‹‹Š‹Ž‹Š‹ŒŒ‰‰‰Š‹ŒŒ‹Š‰ˆ‰‹‹Œ‹‹Œ‹ŒŽŽŒ‹ŠŠˆ†‰‰‡…ˆŠŠˆ‰Š‰ˆˆˆknoppt‚‚„‹™JIjyyz{{{||yzS''SqssŒ–Ÿ¦¬«ª«°¸½¹²µ»¼»»ºººº¹¬§©§¢›–””””•”“’’‘’““Ž‘‘ŽŽŽŽ‘ŽŽŽŽŽŽ‘ŽŒŒŒŒŒŒŒ‹ŠŠ‹ŒŒ‹Š‰‰‹‹Š‰‰‰‰‰‹Œ‹Šˆ‡ˆˆˆ†††‡‡†…†ˆ‡…„„„‚„†‡‡†…„„„„ƒ‚‚‚ƒ‚ƒ‚€‚€€€€€€€€~€~~~~}}}||}|zzz{{zz{|||{ (,.-*&".Ldw{yuqqstutogWC0  !#1EYny}‚„†‡ˆŠŠŠŠ‹Š‰‰‹Œ‹ˆˆˆ‡†ˆŠŠŠ‰‰‹ŒŒ‰‡ŠŒŒ‹ŠŒŽ‹ŒŒŒ‹Š‹ŒŒ‹Š‰ˆ‰‹ŒŒŒŒ‹ŒŒ‹Š‹ŒŒŒŒŽŽŽŽŽŽŽŒŠ‰‰‡…ˆ‰†…‰Š‰‰ŠŠ‰‡ˆˆ‰ommopvƒ‚‚„Š’S#4b‚{{|{z{{wrJ$Uix‡’™Ÿ¡¤¦¨ª¬®¯®®²´²±µ¹¸²®¯ª£¡•’‘‘‘’ŽŽŽŽŒŽŽŽŽŽŽŽŒ‹ŒŒŒ‹ŠŠŠ‹ŒŒ‹ŠŠŠ‹Šˆˆ‰ˆ‡‰Š‹Šˆ†…‡‡†………†‡††‡ˆ†„ƒƒ‚€‚…†…„ƒƒƒ‚‚‚‚~€€‚€‚‚€€€~}~~€€~€~||}~~~~}|}}}}}|{|||}|zzzzzzyy{}|z'*+'#*F]sxzwsrstutoeT>- %8N_v~‚ƒƒ…ˆˆ†‡‡†ˆ‰Š‰‡ˆ‰‹‹Šˆˆˆ‰ˆˆ‰Š‰‡††‰Šˆ†‡‡ˆˆˆ‰ŒŽŽŽ‹Š‹ŽŽŽŽŽŒŒŒŠ‰ŠŒŒŒŒŒŒŒŠˆˆŠ‹ŒŽŒŠ‹Ž‹‹ŒŽŽŠŠ‹Šˆˆˆ‡†…‡ˆ‡ˆ‰‰‡‡‰ˆ‡‡‰‰‡mlnprw~‚‚‚„ˆ‰Y,"T†|||{yzzvoC"#4FWi{Ÿ¡Ÿ¢©°³±®®°²µ¶³²´µ±®§ ž ¢Ÿ”‘ŒŒŒŒŽŽŒŒŒŒŒ‹‹Œ‹‹‹‰‰ŠŠ‹‹ŠŠŠŠ‹‰‡ˆ‰ˆ‡‰‹Š‰ˆ…„‡‡†………†††‡ˆˆ†„„„‚‚„„ƒ‚€€‚‚~‚‚€€€€€€€~{}~‚€~}~~}}||}|{|}|{|}|{{yz{{zzxx|}|{#&&#*D^rwzzvtuuusndS<*(=Tcx…‡‡††ˆˆ†……„†ˆŠŠˆ‡ˆŠ‹Š‰ˆ‰‰‰‰Š‹Š‡……ˆŠˆ†††‡‡‡ˆŠ‹‹ŽŽŒ‹‹ŽŒ‹ŒŒ‹ŠŠ‹ŽŽŒŒŒŒŒ‰ˆŠ‹‹ŒŒŠ‹ŽŽŒŠ‹ŒŒ‹‰Šˆ‡ˆ‰ˆ‡‡ˆ‰‰‰Šˆ‡‡‡…„…ˆˆ…mmosuy~€€ƒ„‚‰g:HŒ‚}|{yxwtm9>Q]o€‰šŸ˜”š¡¨¬©¨¬«ª«¬¯°«§§ª¥›‹‹Ž‹ŒŒŠ‰ŠŠ‹ŒŠ‰‰Š‹‹Š‰ŠŠŠ‰ˆˆˆˆˆŠŠ‰Š‰†…†ˆ‡†……††††‡‡…„„„ƒƒƒ„‚‚€€‚‚‚€ƒ„ƒ‚‚‚€€|~€€‚€~}€~€€~|{|}|{|||{||{zzyy|{{zxx|}|{ *D^twyxutuuspmeT=)+@Xgx„‹Šˆ‡†…„ƒƒƒƒ†‰Š‰‰ˆˆˆˆ‡†‡ˆˆˆ‰‹Š‰ˆˆŠ‹‰ˆ‡ˆ‰‰‡‡ˆ‰ˆŠŒŽŽŒŽŽŽŽ‹‹‹‰‡ˆ‹‹ŠŠŠŠ‹ŒŒŒ‹‹‹Š‹‹‹Š‰‰‰Š‰‰‰‰‰ŠŒŒŠ‰Š‹‹ŒŒŠˆˆ‡‡‰Š‰ŠŠ‰ˆˆ‡‡‡‡†„ƒ„…‡‡‹nlosvy}~~„…ƒ‰rJ+‡„}{{zxvsn0/QZ`ly‹˜—–š¡¨«©ª««ª¬²³¨¨§¢¢Ÿœˆ‰‰ˆ‡†‡‡‡‡‡‡‡ˆˆ‰‰‰ˆ†…†ˆˆ‡…†‡†……†…„………ƒ„…„‚‚ƒ‚‚‚‚‚‚‚‚ƒ……ƒ‚‚‚‚‚‚ƒ‚€€‚€~~~€€~€}|{||{{|||||}|{{z{||{zyy{||{(B]twxwutvtqmkcR=) !.D\m{…ˆ‹‰‡„‚‚‚‚‚‚ƒ†ˆ‰‰‡†‡‡†„†ˆˆ‡ˆ‹‹Œ‹‹ŒŒ‹‰ˆŠŒ‹‰ˆ‰Šˆˆ‹ŒŒ‹ŽŒ‹Œ‹ŠŠŠ‰‡ˆŠŠŠŠ‹ŒŒŒŒŒŒŒŒ‹ŠŒŒ‰‡ˆ‰ˆˆ‰ŠŠ‹ŒŒ‹‰Š‹ŒŠˆ‡‡‡Š‹Œ‹‰ˆ‡……‡ˆ†„ƒ…††‡‰qkostx~€€‚ƒ…„‡~W€†}zyywutn&1HMbr|„Œ”šœžž ¢¤¤ Ÿ£¦¨©¦  ›š•Œ‹Š‹Š†‡‰ˆ†…†‡ˆˆ†…………„„„„„…†…„„„ƒ‚‚ƒ‚‚ƒ„„ƒ‚ƒ„„ƒ‚ƒ„…ƒ‚‚€€€€€~~~~}}~~~~}}|{{{zz{|{|}~~}|||{yyyxwyzz{'?ZrwxwuuvurokbP:'$%!!1H_n|ˆ‡‰ˆ†………„ƒƒƒƒ„†‰‰‡††‡‡…†ˆ‰ˆ‡ˆŠŒŒŒŒŒ‹‰ˆŠ‹‹‹‹‹Šˆˆ‰ˆˆˆ‡†ˆŠŒ‹‰‡ˆ‰Š‰‰Š‰‰‰‹ŒŒ‹‹Š‹ŒŒŒ‹‹Œ‹‡††‡‡ˆ‹Œ‹‹ŒŒ‹‰‰ŠŒŒ‹‰ˆ‡‡‡Š‹ŒŒ‹Š‰†„…‡ˆ‡……‡†…†mkorrw~‚ƒ‚‚„…„†a~„{xwyywtj!*/?T\bs}€†•œ¢¢¡¡ ¡§¬« ¡£›œ™•Š‹‹Šˆ‚‚ƒ„…ƒ‚‚ƒ‚‚ƒ‚‚ƒƒ€€‚ƒƒ‚ƒ„…ƒ€€‚€€€~€€€~|}~~~~~}||{{{{{{zz{{}~~}}||{yxxyxwxxyy '>[twyywvwvvsnbL5#!%$!%7Oco}ˆ‡††…†‡ˆ‡……†…„…‡ˆˆ‡‡ˆˆ‡‡‰‰ˆ††ˆŠ‹Œ‹ŒŒ‹‹‹Š‹ŒŒ‹‰ˆ‡‡ˆˆ†……ˆ‹Œ‰†‡ˆ‰ˆˆˆ‡‡‰ŒŒ‹ŒŒŽŽ‹‹‹Š‡†………†‰ŠŠ‹‹Š‹ŠŠˆ‰‰‰‰ˆ‰ŠŠŒŒŠˆ‡‡‡ˆ‡††‡†„„‰ljpsty‚ƒ‚‚„……‹isyxxyyw{o+?IS[dr‰‹’———˜——™œŸŸ• £¤š––”ŠŠ…‚ƒ‚€€~€€‚ƒ‚€~€€€}~€€~}}~~}}}|{{{zzz{{{zzz|||{zz{zyxyyxxxyyy##(A\vyyyvvwwwunaH1!""  +@Whq|††…„„…‡‡††‡ˆ†ƒ„…†‡‡†ˆˆ‡‡ˆ‡†ƒ„†ˆŠŠŠ‹ŽŽŽŒ‰ˆˆ‰ŠŠˆ††‡‰ˆ††‡ˆ‹Š‰‰‰‰ˆ‡††‡‰‹Œ‹Š‹ŽŒŒ‹ŒŒŠˆˆ‡ˆˆˆ‡‡ˆ‹ŒŒ‹‹‹‰‡†ˆŠ‰‰ˆ†…‡ŠŒ‹‰ˆˆ‡††…„„††„ƒ…fhnrtx}‚ƒƒ€Šuhywxxxvtvj18@Sagkq{Žš–—ž£™———‘”•ˆˆˆˆ†††~}}}~~}}}}~~}~~~€~}}}|{{|{zzyxxyz{|{{z{{{{z{{zzzzyxxxyyx$$ +F_xzzxvuvwvsl^F1!" #0G\js}ƒ†††…†‡ˆˆ‡‡ˆ‡………†ˆ‡†‡‡†‡ˆ‡…ƒ„…‡ŠŒŠŠ‹‹ˆ‡††‡ˆ‡†‡‰Š‰ˆŠ‰ŠŒŒŠŠŠŠ‹Š‰ˆˆˆ‰‰‰‰ŠŒŒ‹‹ŒŒŠ‰Š‹‹‰‰‹ŒŒ‹‹‹ŒŒŠ‰ˆŠ‹ŠŠŠ‡……ˆˆ‡†‡‡‡‡‡…ƒ„………ƒƒlimorw|~€‚‚‚‚cwvyzyvss].G\iszvxz|Ž†‰•–ŒŠŠ‹Œƒ……ƒ|}}~~}|||zzz{{zzxwwxyz{{zzzyz{{{{yy{zxxxxxyw/JaxyyxursttphZB0!!%5L^ks~ƒ†‡‡††‡‰‰ˆˆ‡††……†ˆ‡…†‡††ˆ‰†„„…‡Š‹Šˆ‡ˆˆˆ‡‡‡†…†‡‰Š‹‹‰ˆˆˆˆ‰ŠŠŠŠ‹‹ŒŒŠ‰ˆ‡†‡‡ˆ‰ŠŠŠŠ‰ŠŠŠˆ††ˆ‹Œ‹‰‰‹‹Š‰‰ŠŒŒ‹ŠŠŠˆ‡‡‡†„ƒƒƒƒ…†‡‡†„ƒ„…„ƒƒ‚pklmoty|~€€€‡[rvz{zwrj[#->PZ[[gswy…‰ƒ„…‡Š‹Œƒƒƒ„„……ƒzyyzzzzyyyzzyyz{zzxxyxwwxxxxw1LapvxxtqrttoeW>,':Q`kuƒ„…†…„†‡ˆ‰‰ˆ‡………††…„†‡†…‡‰ˆ…„„…‡‰Š‰‡‡ˆˆˆˆˆ‡…††ˆ‰ŠŠ‰‡†…††ˆ‰Š‹Œ‹‹ŠŠ‰‰ˆˆ‡††ˆ‰‰‰ˆ†……†ˆ‡…ƒ„‡‰‰ˆ‡ˆ‰ˆ‡ˆ‰Š‹Œ‹‰ˆˆ‡††ˆˆ„‚ƒ„…‡‰ˆ‡†††…ƒƒƒolkloswz|}~€€€‡NmyzzyvqiY*4;GSZamw{~€‚„………†ŠŒ}|{|wwxyxxyywwvvyzxwwx 4O`mtuutrstsndT<()>Tbmx„ƒ‚ƒ„ƒ‚„†ˆ‰‰‡………„ƒ‚ƒ†ˆ…ƒ…ˆˆ†…………‡‰ˆ‡‡Š‹‹ŠŠˆ‡‡†††‡‡‡†………†ˆ‰‰Š‹‹Šˆˆˆˆ‰ŠŠˆ†‡ˆˆ‡†„ƒƒ†‰ˆ†……‡ˆˆ†……†‡‡‡‡†‡‰‰†…‡‡„…‡‡„‚ƒ…†‡‰‡††‡†„‚ƒ„mjilpsvyz{~~…ŽFfwyyxuplS+DV\aekuqsƒ…†‰~|zz…yvtuw %:RcotsstuusrlbS;&*@Udq{…ƒƒ……ƒƒ†ˆŠŠ‰‡‡‡†„ƒ„‡ˆ„€‚…‡‡‡‡ˆ‡†††…†‰ŽŒŠ‰‰‰‡…„……„„…‡ˆ‰Š‰ˆ‰ŠŠŠŠ‰‡‡ˆŠ‹Šˆˆ‰ˆ‡††††‰ŠŠˆˆ‰‰ˆ‡†………††††„…ˆˆ…„‡ˆ†…†‡††…†‡‡ˆ‰ˆ†‡‡†„ƒƒƒ‚mhimqtwyyz}~~><]twxxvuhJ#3H[bcehluxx„#!.;Vgorqqrstspj^P;&  ,@Tes|………†…„‚ƒ…†‡‡‡†††ˆˆ‡††‡‡…‚ƒ…‡ˆ‰‰ˆ†ƒƒƒƒ‚Š‹Š‡ˆ‹‹ˆ…………ƒ‚„‡‰Šˆ††‡‡ˆ‰‹Š‡‡†‡ˆˆˆˆ‰Š‰‰‰‰Š‹ŒŠˆ‡ˆ‰‡††‡‡‡‡……†…†ˆˆ…„…†…„ƒ…†‡ˆ‰ˆ‡‡‰‡…††„„ƒ‚‚‚nginrtxzz{}€~}ˆV 0Tpstuur_@&ej&!".>Qakopnnoptuqi\M8$ ! $1BUev}ƒ…†‡‡†……†††…„„…‡‰Š‰‡††‡†ƒƒ„…‡ˆˆˆ‰‡…„„ƒƒ‡Š‰‡ˆŠ‹‰‡‡‡‡…ƒ„…‡‰ˆ††‡†…†‰ˆ†…„„…†††‡‰ŠŠŠŠ‹ŒŒ‹ˆ‡‡ˆˆˆ‰‹ŠŠˆ†………†ˆˆ†…„„ƒƒƒ…†ˆŠ‹ˆ‡‡ˆ…„„…„…„ƒ‚ƒnfioqsvz|~~€~†\,(Ioqqssp[;-)"&.=O]iopolkknsuqiZH2!!"""!&6FXj€‚„„…………†††……„„†ˆ‰Š‰ˆ‡‡‡†„ƒ…‡ˆˆ†‡‰‰ˆ‡…„ƒ„†ˆˆˆ‡ˆ‡‡‡‡†…„„„…‡†…‡‡…ƒƒ…†„ƒ„……ƒƒ„…‡ˆ‡‡ˆˆˆ‰Š‰‡‡‰‰‰ŠŠŠŠ‰‡†…„…ˆ‡†…„ƒ‚ƒƒ…ˆŠ‰††‡†„ƒƒƒƒƒƒƒlfinpqtx{}}‡c6?qrstskX4(")49J[dmqrqmiimrtqhWC.!""#"(:L\m‚€‚ƒ„„„„……†††…„…‡‰Š‰‰‰ˆˆˆ†ƒ‚…ˆŠ‰…†‰ŠŠŠˆ†„ƒƒ†ˆ‡…………††………†…„„„…‡‡…‚ƒ…‡„„†ˆ‡„ƒ„†‡‡††‡††‡‰‰‰Š‹Šˆˆ‡ˆ‰‰‡††…†‡‡…„„ƒ‚‚ƒ‚ƒ‡‰ˆ…††„„……„ƒ‚~}zldinprtwy|}~~jC5rtuvupO-*$$+>LT`imnpsurnmorsqhU@,!! !"+>Qan}‚ƒƒƒƒƒ„…††„ƒ‚ƒ…‡ˆˆˆˆˆˆ‡…ƒ„‡‰ˆ†‡‰‰ˆ‰‡†…ƒ„‡†„„…„ƒƒ„„…†‡…‚ƒ„††„„†ˆ‡††‡‰‰†…†‡‡††……††‡ˆ‰‰‰ˆ‡†………†‡…………†……„„ƒ‚‚ƒƒ…†…„„„„„……„‚}}}zjbgmoquwxz||||}}uR)psuvuqG&+%$+4@WanosutsvwusppqrpfS>+ "-AUep‚ƒƒ‚ƒ„„„†‡†ƒ‚…††‡‡‡ˆ‡…„ƒƒ…‡‡‰‹‰ˆˆ‡††…„…†‡‡‡‡†…„…††‡ˆ†‚ƒ…†‡†‡‰Šˆ‡‡†‡ˆˆ‡ˆ‰ˆ‡‡††‡‡†‡ˆˆ‡††††…„„„„„„…†…„…†…„„……ƒƒ„ƒƒƒ„„ƒƒ„‚€€|ecfloptxz{{}~~}{}_sxssrrG")# (0;DQblpruvvuvvtssqqqodP;) #1EYgp}‚‚€ƒƒƒ†ˆ†€ƒ„„…††‡†„„„‚€€‚„‡ŠŒŠˆ‡†‡‡†…„…ˆŠ‰‡†……†‡‡‡‡„‚…†ˆˆ‡ˆ‰ˆˆ…ƒƒ††‡‰Š‰‡†……†‡…„…„„„……………„ƒƒƒƒ„„ƒƒ…‡…„…††…„‚„ƒ‚€~kdchnqrvzzz}~z‡jfqopnnC##,6@LU_lsttuvvvutssrqqpl`K8'!!&6K\hoz€ƒ„„†ˆ†€‚‚‚ƒ„„…†………†„‚‚„†‰Šˆ†…‡ˆ‡…„†‰Š‰ˆ‡……†‡‡ˆ‡…ƒƒ„…‡‰ˆ‡†‡‡†ƒ‚„…ˆ‹‹Šˆ†…††‡…„ƒ‚„††………†……„„„„„„…‡ˆ…„†ˆ†…‚ƒ€ƒ„‚€~~}}mgehostvxyy}}zŠrYhnomi9 '1<HR[`gpuvvuuutsqqqpoonj\E3& "!'9P_jsz}~€‚‚ƒ…††…€€€€‚„„„„„……„ƒ‚‚…‡†„ƒ†‡†……‡ˆ‡‡†…„„„………………„‚ƒ…†…‚‚„‡‡„ƒƒ„‡Š‹Šˆ†……„„„ƒ…ˆ†…„„…………„„„ƒƒ…†…ƒ‚„…„‚‚‚‚‚‚ƒ‚‚}|{{zjfehmqsuwxz}€|{zTfnpnb3 )4=MXagjlptwxxwvtrqpponmkfX@/$ "!*<Salu{|}‚‚„…†„‚€ƒ„ƒƒ„„…†…„‚€€‚„……„…††‡ˆ‰ˆ‡†…„„„„ƒ‚ƒ„„„„‚‚ƒ„‚€ƒ…†…ƒƒ„‡‰Š‹ˆ††…ƒƒ„ƒ‚‚†‰ˆ‡†…………†…„ƒƒ„…„ƒ‚„ƒ‚ƒ…„ƒƒ„ƒ‚‚}|{nfgknpsvxz{|}~}|ƒMcnqpn, &0<HW`gknpqqrtvxwuttsrpoomidW@.#!!!-?Udnv}~~‚€‚„„ƒ‚‚€~~€‚ƒƒ„„„‚€€ƒ…††…„„†ˆ‰‡…„‚ƒƒ‚ƒ„ƒ‚‚‚‚ƒ……ƒ‚ƒ…††††…†…„ƒƒ‚‚ƒ…††‡†„ƒƒ„„„ƒ‚„„‚€€‚ƒ…†„ƒƒƒ‚€~€~~oghlpqqtx{{z{{||ƒAalqqm$&-7CS^ksqrsuvsrrsuvutstrpnnmhaU?."!! $/AXgpw}~~~€‚}‚ƒ‚‚ƒ„„‚€‚ƒ„ƒ‚€€‚ƒƒ„…‡‡†…„…‡‡‡…„‚€ƒ„ƒ‚ƒƒ‚‚ƒ„ƒ‚‚„…„ƒ„„„„……†‡ˆˆ‡†……………†‡…ƒƒ„ƒƒ„„‚ƒ……„ƒƒ‚‚ƒ„…†…„ƒƒƒ‚~~}znegmstrsw|{zz{||zƒ+0Vjpng!)3?IT_gntuuvxwtqpqstusrrqnmmmi`T?-!!  %1C[krx|~~~€‚€}~ƒ‚‚„…„„‚€€€‚ƒƒ€‚ƒ…†………„„„‚‚ƒ„„„‚„„ƒ‚ƒ„……„ƒ‚„†…ƒƒ„……„ƒ„„ƒ…†…„…………„ƒ„„„…††„ƒ‚‚‚‚ƒƒ‚„‡‡†ƒ‚ƒ„„ƒ„„ƒƒƒ‚~}}{{|||wlbbjrtrsvzyxy{||z€A+Timi`$-8EPYagkntvwxyxuqppqrsssrqommokaS=+%3I_muz~~~€‚‚‚ƒƒ„……‚€€ƒ„…„‚ƒ„…†‡†…ƒ‚‚ƒ€€‚‚ƒƒ‚‚ƒ„ƒ‚‚„†‡ˆ†…„…‡†„„„ƒ‚ƒ…ƒƒ…†…„„„„„ƒƒƒƒ„…‡‡…„ƒ‚‚‚„ˆˆ‡ƒ€„†…ƒƒ„…„ƒ}}}|zz{{{{kaairuuuvxxwyzz{zzO%$OgkeX '0=LW_dfhjmpruwxvtpnnoopstsrpmmnj^O:( (8Ocnvz~€~€ƒƒ‚€€ƒƒ€€ƒ…„‚€€‚‚ƒƒƒ„…„€€~~€‚ƒƒ‚‚‚‚ƒƒ„…„„„…†…ƒ€„„ƒƒ„„ƒƒƒ‚ƒƒ‚ƒƒ‚‚ƒƒƒƒƒ€‚€€„††ƒ‚„†…ƒƒ„„‚€}{{||{zzzzvkb`hqtstuvwxz{{|{sX3<mjcS$-6AP]fjkkkllmosvvuspnmmmorssrqnmmfYI5$  +>Udovz€~}‚€~~€‚ƒ€„†„€‚‚‚„„‚€€€€€€‚…„ƒ€‚ƒƒƒƒ……ƒ€‚„…ƒƒ„„„‚‚‚‚‚‚ƒ‚€‚ƒ…„€€‚…ƒ€ƒ„„ƒƒ…†…‚ƒƒ‚€}{{}}{{zyyvledjrsrsuwy|}~}|zsbA+mj`O!*5AJR\gklmnnmklosssssrqpmmnoqqrpmjiaRC/  -CXeoty}~{{~€€€}}~€‚‚€…†ƒ€‚‚‚€€‚ƒ€‚‚~‚…„‚€€€€‚ƒ‚€‚………‚„…„ƒ€€‚ƒ‚‚ƒƒ„ƒ€ƒ…„€€€‚ƒ‚‚ƒƒ~€€€}||zxyzzzukcdkpqpqtwxyyxxxvpjK nh]M$/;GQY_flnnpqpommpqqopsttrmlmnnoonjge]N?,0I]lsx{{z~~‚‚}}~†‡ƒ‚ƒ‚€~~€‚‚‚ƒƒƒ„„‚……ƒ„ƒ‚‚‚‚‚‚ƒƒ‚ƒ………‚ƒ……ƒ‚„ƒ‚‚ƒƒƒƒƒƒ‚‚ƒƒ}~€€€‚ƒ‚~~}}~~}{yvvy|z|j][gmnknƒˆyƒxvrstphSjeYH)3@KTZ`dglnnprrpnnqrqnortusnmnnmmmlifd[M>-! 3N`mtx|||€€€€ƒ~~~~}{|}€……ƒ‚ƒƒ€~~~€‚„„ƒƒƒƒ‚€€‚ƒ„„‚‚ƒ„„„‚‚ƒƒ‚ƒƒƒ‚ƒ„„…ƒƒ„„ƒ€‚ƒ‚ƒƒ‚‚‚‚ƒ€€€€€~~€‚ƒ‚~}|{|}}{}ysqzŠ‰kK94456:KTZgslsyolf[eaU9#,8BMV]beghknoqrrpnpqrsrqrtusonnnmllmmkf\K=.""6Oanvz{}~|}ƒƒ‚‚‚~~}||~€‚ƒƒƒ„ƒ}}€‚€~~€ƒ†…„„„‚€€‚‚€‚‚‚ƒ„…††‡„‚ƒ„…ƒ‚‚ƒ„ƒ‚‚‚‚‚‚ƒ€‚„ƒ‚‚‚€~€€€€€€€}}|{y{~yplgmm_A#'Hccjqp\]Q2%/;GNT[`cfijlmnpqpnnppprsrrssrpppomlmopmf\I9,!';N`nvzz{}}~€‚„„‚€~}~~~€€€€‚€€}|~ƒ††……„€‚ƒ€€€‚‚ƒ„†„~€‚„…ƒ€‚ƒ‚‚‚€‚‚€}€„ƒ€~~€€~~€€€€~~}|{|vui_WJ3.QXL/#+3>JTY]adfhijkkmoonnnoooprsstsqpqrpnmmnomf[F4).AQaox{{}€€€‚‚€||}~~€‚ƒ‚€}}~€‚‚€~|ƒ…†……„ƒƒ„ƒ‚‚€ƒ…„€‚„…†„‚€‚‚„ƒ‚}‚ƒƒ‚€€ƒ„ƒ‚‚~}~€€~}~~~~~ƒ‚zg\RE5!KPG,#-9CLU\`bdegiiiijlmllnoonmnpssssqpqrpmlljlkcWA0% 3GXepx{}€~|}~~}}}{z{|}~€‚ƒ‚}||}~€‚‚‚€~|‚‚ƒƒ……„‚‚ƒƒƒƒ„ƒ€€‚‚€‚ƒ„„„‚€€€ƒ…„ƒƒ‚€€‚ƒƒ‚‚‚ƒƒƒ€‚‚}}~€€}|~~|||„udWC1&#(73#!-:FQ[afiihgjjhghikmlmoponklostsrqppqokjigii`R=-$!5K]iry|}€}{{{{z||{{|~~€‚€~~~€€‚‚€~~€€€€‚„„„ƒ‚ƒ„„„……€€€€€€€€€ƒƒ‚€€€€ƒ……„„„‚‚‚‚‚ƒ‚‚‚‚€€‚‚€‚‚}~~}zy|€v^I6#(5COYbfjkjijkkhhikmnnpqrqolkmqssqqpppnjhhhjh]N;+#"6Nakrxz||}|{{{|{z{{{|~}}~€€~~€€€€€€~€~€‚‚‚‚€‚ƒƒ‚‚€€€~~€€‚‚€€€€€‚ƒƒƒƒ‚‚‚‚€€€€~~‚‚€~||~~}zw{oP6$!&-$2BPX`fhjkkkkkjijklnopqqrrpnlmortrppoonkiiijfZJ8)!%9Qblswz|||||||}}{|||{{€}}~€‚‚€€€~~€‚ƒƒ‚‚€‚ƒ‚‚‚€~~‚‚‚ƒ„„‚€€‚€€€€€~~€€~~€‚€~}||}~~}rfA("'*+)$%1?NX_befhjklkkkjkllmoppnopomllnpsrqponmlkjihcWI6(!(<Scnty{}~~}~~}}|{~€{y|€~}||}€‚‚€€}~‚‚€‚ƒƒ‚€}}€‚€‚‚‚‚‚€‚ƒ~~~}}|}~€€}}~|}€~~|{{z{|‚gU'"+3;BGKNPZO;&"*/9CNY_ceeegikkjklkkklnpqqnmonnnnmnpqsrokhhhhgf`UG6(!!*>Vgpw}~~‚ƒ|~~€~~€€~}€€~}|}~€€€€€€€€€€‚ƒƒƒ~|€‚€€‚‚‚‚‚‚‚‚~}}~~}}~~~~~€~~€~~||zz~‚r=, '*)%!")06>GPW]_]ZSH9*=CKRX]adffgghhhhjkjiikmpqpnmnnoqpmlmosspkhhiigd^SB4( $/AYjrx|}}}~€€}z|}|~~~~€€€€~~|{}}}}}}~€€~}~€‚ƒ‚€~}}}{|~~€€€€‚ƒ€€ƒƒ~|~~€‚~~~}}€€€€€~~~~||{ywl^.<ADD@8-$ !$').9CMSVXXWOB5&LPW]`bcehiijihgfgiiggikmnomkkmpsrpmlnrsqnmmlkhd\N</&%6K]lsw{||{}~|yyzzy{}}}}~~|}||~€~||||}€€~}}ƒ„„~}}~€€~|{}€€€ƒƒ‚‚‚€€ƒ‚~|~€ƒ„ƒ€€‚€~||z{sG/2MV[[ZTJ;-&%&%%&+4=DHIIID:0$UY_cddehjjhhihgeehhfeghhjlkhhkoqqqonnpppooonmje\J8,$%:Qamsvyyyz}}{xxzywx{{z{{zxy}~~|{}}}||{{|}~}{{|}€ƒƒƒ€}|}€~|}€€€‚‚‚€€€||~€‚ƒ‚~}~€€€‚‚€€€€€€~~}}{{…p*MrkmijifaWH7..-)&&(,28<<;71*"Z]cfffgijhedghgddgfcdfggjljhilmnnnljikmnooonljeZH5+$'=Tdosvxvvz~~|zz{{xwz{zz{|yx}€~~}||||}|}~~|{{|{{€ƒ‚‚€~€€~}}~€€€‚‚‚‚‚‚€€€€}}€€€€}|}~€€‚€€€‚€~}xokV _pxrrsssqi`TB9982-***-0/-+& "[^cffefhhfbaegfbdfdbdeghkliikllkjkifegkmnmkkjje[G5*%)>Tdotxxuty~~|{{||yvy{zz|~|y|€€}|z{|}|}~|yyz{zz~‚€‚~|{{}}€€€€€~~~}}€}||}~}}~~~‚€€€€|teVG#!,5gvtvvvwwumdYH@BA<3.-++,*&$ # yuyuxtwtvtuuuvtvvuwtwtvvtwtwvvxtytvuuwuwvwvvuwuxuxvyvyuwuwvvvwvwvwxyxywyvzuztytwuvuvtyt{t{t{tzuzu{t|t|t|u{uzuytxtxtytzt{t}r~r}s|u{t}}€€€~~~}~||{|z}xu€s‚r„q…r„r†p†nˆlŠj‹hd`Ž_ŽaŒ`Š`‰`‹b‹i‡tz|mos|u|u{t|t}t~|€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~~~~~~~~~~}~}}||||{{zxtrrstvvwuysxsysyryqyqyqyrxswswuwwvwvwvvxvyvzvzvyvxvwvvvwsvrvqvqvsvtwtxtxsxtvuxvxvyvxtxsututvvvvxvxvwuvvvvvwvwvxtxwvwuxvxwxxwwwvwtxsvssuswtxvwvwuyuzuztytytyuwuwvvwwxyyyxzv|t}t}uzwwvvtxtytxvxwxwwvxvyuyuwvvuxt{r}q|r{r{s|s~st}t|uzr{{~€€€~~}}}}}|}{}w}u~s€p‚p†o‡pˆo‡o…m…k†j‰h‹e`__‹`‰aˆaˆdŠfŒjˆuy~j‚m~sztyvzv}t|€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~~~~~~~~~~~~}~}|zyxyxzyzuulxlyqzsztztzuzs{pzoxoxpxqyryrxswsvtwuyvzvztytxuyvxvxuxrvpvpvpurutxtyuxvwvuwvuwuyuxvwvvuvvwwvywyxvxtytxvwxvxvxvywywwxwzvzvzuwvvuwuvtvuuyu{uzvyuyuzuzu{u{u{uzuyuxvxwwxwwwuzuzu{uywxvyvzuzuxvwvwvwuyuytyuwvwvxu{t~t~t}t{s|r}s}s}t|r}s|}}€€~~~}~}{~y~vtqƒo„m†lˆm‰kŠj‹jŒjŠi‰hˆeŠb‰`‰_‰_ˆ_ˆ_ˆaˆbŠc‹e‹n‚rvuuvuuvyv}u|€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~~~~~~~~~~~~}}|zyvwvwzyzwukxnzs|tzsyszszrzqypyowqwqyqzo{oyqxtxuztytyswuwuxuxtxtwsvtvsvrwsxtyuxuwuvvvwwwxwxwxyxywxxvytxtxswsxsyuwxvxvzwzvzwzvywxyuytytxvvwuxuwvwvwvxwxuwuxuyuzu{u{u{u{tytyuyuwwwwvwwwwvwwxwyuzu{t{tytxtwvxuzu{uzuzuyvyu{v|v|u|uzt{s}r~r}s|s{tzt|~€€~~|~|~z~w~tr‚o†mˆlˆk‡iŠjihhhŽf‹dˆb†a„`„_†`ˆ`ˆb‡b‰b‹ddl€osxoyryt|t|€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€|z||}}~}~~~~~~~~~}}|{yxvwvzxzxuowrzvzuytzq|n{pzqysxswtxsysyryryszvyvyuxtxtvuuuuuutuuuuvuwuxtytztytxuwuwvxwxxxxxxwxwzvzvyxuysxqwrwtvuvvvwvxwzvzwywywywyvyvxvxvyvyuztyuwvvwuvvvvuyuyu{v{vzvyuxuyvyvwwwwwuxuyuyuyuzuytzszs{s|s|u{vzwywyvyvyuyvyvzuzu{uzuzt{szsztyuyu{r|z~~~}}||{{y|v~t€q„mˆkˆi‰g‡h‡iŠgfeŽedŒc‰b‡b…a†a‰b‹`Š`Š`‹aŽcŽc‹fƒouxn{s{t|s}{€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ywyx{z|{}|}|~}~~~~~}}}|{zy{z|{|zxrwk|i}i}i~h€de~k{q{t{uzuwvwvwuytztyvxwwwwwvwtvtvsusvtuuuvuxuxvxwwvuvuvvvxuyuwuvwuwvxvzwywxxvxuvuvvtvtwtvtvvwwwwvvvuvuwuwtvttusvsvutxtxuxvwvwtxsytytztztztytxuyuzu{uzuyuyuyt{u{u|u|t{sytytzt|t|t{uyuytyt{sztytytzt{t{uyuytyszr{r|r~r‚{‚€~~~}|}z|x{v}tq„m†i†g‡e‡e‡f‰e‹dbbŽbŽcŽbŽaaaŒ`Œ`Œ^\Ž\]Ž`Œa‰c‡jt{yw{t}|€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€yxyxzxyxzx{z||}}}}~~~~}|||}|}}}|{xzr{o|p~p~ol~i}i|qxvyvxvwwvxvwxtytytwvvxvxwwwvvwuvtvtusutuvvwuyuwuvuuuvuvuvuvwuyuyvyxwywyvwvwuvuuttutwsytzvyvxvvuvuvvvvvuvuuutvtvuuxuyvzv{v{uzuyvyu{t|r|r{tyuxuytzsyszs{t{szuxwyv{v|tztytwsxs{s|s|t|r|q{qzswtvuwtyuzuzuyuzs|p}p}o}s|u|~}|zx~w~vtƒp†m†hˆe‰c‹bŠcŠd‹ddŒdccb‘`_Ž^Œ^‹_‹^Œ]\\]Œ_‹aŠf„k}v{xz}~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€}||{zxywxvyvzx{z||~}~~~}}}}~}}||{}|~~~~~~~{vuuvvuwtysyvyywyvxvwwwwvxvwuxsysyuxxxywvuuvuvuwuxtxryrxtxuwwvyvzv{vywxxwxvyuwtvtutututvuvwvzvyvyuwuwtvuuuuuuvvvuvuxuxxwzuzuzvzvyuzuyu{t|szsztxuvuwswqxq|s~t|vzvvwwv{u|t|uzuxuxtxtys{t{q{q{pzrysxuxuzu{vzvyxyvyt{r{syuwtwz|~|~{zx}w}vt‚o…lˆi‹fŒd‹cŠd‰eŠf‹fŒcŽbŽa`‘`^Œ]Š[‰[‹[Œ[\Œ]Œ\‹_ŠbŠbŠi†s€z}}~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~}|{zxyvxvxvxwzy|{}{||}|}|}||{~}€€€€€€€€~wvuuwtwtxuxwxywyvxwxwwwvwvvtvtwuxwzyzyyvwtwswtvuvuwtwuwuvuvvuxuxvvwtytwuwvwvwuvsvsvrwsvtuvtxtxtwuwtwtvtututwuxuwvuwtwuxvwvuvtwtwtwtvtvtwuwvyvwwvwtutsvrzs|v{wvxtvvvyt{t{t{u{u{uytxrxrzqzqzrxsxtxtxrzs{t|v|v{vzuzt{s{s{t{|}~}}{|z{w{u}t€qƒm…k‰jŠfŒd‹bŠbˆc‰b‹a`__Ž`Ž_Ž^Œ\‹ZŒYŽ[[\]^Œ`Œbbg‹n‚y~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~~}|{yywxvwuwvxvyw|z|{}|}|~~€€€€€€€€~xwvuxvyvyxywyuxuxvxvxvwuvuututuuuvwvxvxtyryrzsyuxvxwvwvvtusvswtwvuxrxrxuvxvzvyuwuuuswswtvvuvuvuuuwtxtyuxuyuyuzuwwvwvwvxvytxswrwqvrvrustvuwvxvwvvvtvuuwtzt|uzuxuwuxt{s{szsztzt{tzsyszs|r|s|t{u{v{vzt{s|s}t|u|uzuyt{s|s}s{ty}}~}||z}w€tƒq…m‡l†k‡i‡e‡c‡aŠa‰aŠ`Œ_Ž__Š_‰_‹^Ž]\[‘[‘]^a`‹`‹_Œ^Ž_eŠq{{~}€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~~|{yxuvsurvtxvyxzy{{}}€€€€€€€€{wxuyvxvzv{uztytwwwwwvwtwtvuuttusvtvvuwtxtwuyuywywxxxvxvvvvvvvwvxtxtxtxvwwvxuytytwuuxtxtxuwuvvvvwwwwwxwywzvyvywwwvwvvvwwyuytyrxrwswvvwuwwxxxxwvwtwsytzu|u|v|u|w{wzvzuzsysxtxtzu{t|t|t|s}s}s|t{v{v{v|t|s}s{tyuxuxt{r}rtq}z}~{|x}u€r‚qƒn„k„i…f†dˆcŒbŽbŽbŽbŽaŽaŒaŠ_Š]‹\]Ž]Ž_`aŽ`Œ`Œ`‹^Œ`Œ^`d‰n…t~y}~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~~}|{yyvwsuqurvtwvzy~~~~{vysysxtytytxtwuwvvvvuwuwuvuvvuvtuuuvtvswtvuvwwxwywxxuxsvsvuwvwwxvxuytzryrwsvuvwwwxvyuxuwtvutuuuuuwuxvwwwwvwvvvuvtvuxvxxxxxywwvvvuvvvwvwywzwzwxxvyszt|u|v|v{u{uzvxwxvxuxuvuxvzvzvzuxtys{t|szuxvzv{v|v|u{tzsysyszq}o~qtu€|~~{{xzu{s{r}o€niec…aŠ```Ž`aŒa`_‹^‹]‹^Š]‹^Œ_`aŒ^Œ]‹]‹`Š`‰aŠ`‰e„l}uy~~~~|{ywvsurtqxw}}zvwqyrysysytxtxtxuxvxuxuxtxtwtwtvtwswsvrwswtxuxvvvvwvvvuvtvuvvwwxwxvyvzuyuxwwwwwwwwvwuwtvtuuututusutuwuwuxtxuvuuvtwvxvyvyvxvwvvwuvuwtxvxxxzyzyxxvxtys{t{uyuwtxtytyuyuxtwtwtyu{u{uzuwvxtzt|t|u{v|w|v|vztyryqzq{r}rrsu~w}{~~|{xyw{t}q€oƒl„jƒe‚a…^‰]‹_Œ_Œ_Š_‹^^Ž^`‹_‰_Š^^___[[‹^Š^‹^Œ`^Œd‰oyz~€€€€€€€€€€€€€€€€€€€€€€€€~~|{{xzw{{~~€€€€€€€€~~zvvrxsxsyszt{t{tzuyvyvyuxtxuwvvuwuxtxuwtwuwtwuvuuuuvvvvvwvwuwtxuzvzvzvxwxwwwwvwuvuvvvvvvvvwuwtwtustutwszt{uywvwtvtvvuwvwwvvvvwtxtxtytzvyw{w{w|vztyrzqzsytwuxuyu|t|s{sysxtwuyt{s|r}r|q|r|s}s|t|t{u|t|uytxsxsyr|s}s~r~st~s~w}~}{zvyu{r€o…m‰k‹i‹g‰b‰_‰^‹_‹_‹^Š]Š\Œ\Ž^_Ž^Œ^Œ^Ž_Ž`bŽ`_Ž^ŽaabŽeŽcŽfq„||€~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~€€€€€€€€~~wurswtvvvvvwxv{s{s{szuyvxvvtwtwtxuxvywxwwvwvvuwtxsxsxuwuwuwsxswuvwvwvxvxxwxvxvwwvvvuuuvwuyvzuzuxuwtutwtxtyvyvxvwvwvvvvwwwxwxuvtwtxuyvwvvvwuwuys{r}r|rztyvwvwwwvyv{u|u|u{uyuzu|t|s}t{r{s|r|p|q{qzsztzuytysyszr{r}r|r|r|s}q{w|~~z|v{r}o‚m†lŠkŒgŽebŒa‹_Š^‹\]]‹\Œ[[\\Ž\Ž[Ž[]``‘b_aŽbbbbŒcŒl…w~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ywsuwwvxvywxwwxtxryqyrxsxrwrwrvuwwvwvwwvwuxuwtxsyryqyrxswtxtxtwvvvuwuvwuxuxuxvxwwwwvvwvzu|u}v}v{vyvxvvtvtvsxsytzvzwwwxwyvywwvuvtvuuvtvtvsvtvtwsxsztzsytytxuxvxuxvxv{v{u{s{s{s|u|t|t}s}q}r{q{rzsztytytyt{s{q|q|q|szszr|p~l{x|~|~wroƒn„m‡lŠhfdŒcŠa‰^Œ]Ž]Ž^‹]‰\Š\Ž\]^Ž^Ž_Ž`Ž`Ž`Ža^_aa^_Œbj‰uƒ~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~~~~~€~€~€~~~~€€€€€€€~{xxxxxwwwvwvwwwvvuvtvuvuvvvvvvwvxwwwwxwwxwxwxvxuxsxqxpxqxsxtxwwxvvuvttttvtvuwuxuwuxuxvwxxyv{wzwzwywvvsvsustwswtxvxvwvyvyvwwvwuvvuwtvsxuzu|u{vyuwuwtxsytysytxuxvwwvvyuzu|s|s{rzszs{r|r|q}s{t{s{s|s|t{t{t|t}q~rp~r}s|r~rozy|~zu…p‡n‡m…l„k‡hŠfŒdŒcŠaŠ_Œ]Ž]Ž]Œ^Š_‰`Œ_Ž^]_`bbŽaŒaŒ_`Ž``]_en‰z‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~v~u}t|tzu{t|sr€qr{qyqytzu}ww~w|x{y|y}x}v~u€rk~nytxswrwtwwwwvwuuuuwvwwxvxvxvyvxwyxwxxzw{wywwytysysxuxvxwxwyvwtvsuttuuvvwwwywxwwvwwwwxvwvwvvxvxvxuwvvuutwswtytyuyuyuywvwuwtwvuxtxtyuzv|w|w{u{t|u|uzvyuyuyuxvvvvuxszt|s|t{r{szr{s|t{t{t{t{s|s}ss~t|r{r{r|s}r|r{r{t|t~q{{}~~z€t„p‡n‡m„l‚i…f†d‰b‹a‹_Š^‰]‹\\[^‹_‹^]Ž]]_‘`’baŽc‹a‰aŠ`‹aŒ_^e‹q…|€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€zn{n}k{j{i|i}j~kk}myovptpun|l}j|lvpsnulyj{k|k~jk~n{pxowqwswuwwwwwwxwywzxxwxvxvxuvvwvvwvxvxwwwwxvxtxtxtwtwuwvwtwqwpwqwrxsyszuzwxxvwvvvvwvvvvwvwvxwxwyvzuytytztzs{s{s{szuyvwuuvtuuuuuvtvtvuwuyuzuzuzuzvzuzuztztxuyuyuzt{t{s{r|s}q~st}u{vzu{u}u~ut}s|r|q|s}s}s|rxswuyuzsx|}~}z|uq‚n‡l‰l‰j‰f‡c†`‰_‹^Š^‰\‰]‹\[Ž[[ŒZZŽZZ‘\‘_‘aa`Ž_Œ_Š]Š]Š]‹^‹e‡t~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ysyuzu|s}r}r|uzvyvxwwvwuwtxtztysyryrxqyqyqxrysytzsysxrwrwtwuwuwvxvzwzwzxxxwwwvwvvuuututwvwvwvwwwvwvwvwvvvuvuuuutusvrwrwswsxtyuyxwztxsvtvuxuzu{t{t{u{v{vyuztztzuyuwtxryrzsytxtxtwtvuuutttsusutvuvuvtvuvuwuxuxtyszs|t~u}t}s}s|s|s|s|t|t{t{uyu{v}u~us|r{r|rr€qqr|r{t{rxuw|}~~z|u~qo†mŒljŽfŠb†_‡]Š]‹^‹]‹_Œ_Ž][[ZŽ[Ž[Ž[Ž]__`_baŒ]Œ]Œ]Œ_‹h‡y€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€uuwvwtyszrzszvxwxwwvwuxtysysyswswsxsxtxuwwwwvvvuwsyrxrxsxsxrxtwvwwwwxwxwxvxvxuxtvtvuvvvwwwwvwvwvwvwuwuvwvxvyvwwuwtxswsvtvtwwxwyxxxwwuysysytyuyt{t{u{wywwwwvyvzuxuwuvvwvwvwuwtzs{sztwvtwtutsusvsvtvtvuuuuwvwwvytztzt|u}u}s|s{s{s{t{t{szsxsvrwr{r|s|t{tztzs{s|r}q~q~r~t{lwsy}~~~y~u€q‚nƒn†lŠiŠfŠc‰`‰^Š^Š^Š_‹_Œ`^[[[\]``ŒaŠbŠc‹bŒa_Œ^‹^Œ]bŒm‰|€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€wrxswrvrwqwpyqytyvwtwrxqzqyqyqyrxswtvuvvwuyrzqzryqyqypzpyqyrytyvxwwwxuxryqzrzrzsxsxtwtvuvuvvwuxuyuxtwtwtwuwwxvytxuxvwvvuvtwvxvxuxtwvwyvywwwvwvuwuxvxvxvyvyvxvwvvvxwxwxwwwvwwvzvztzuxtwtysyryrxswtvuvvuvuwvwwvwuyuyvzvzvzu{tztzuzuztzs{szsyryszs{t{uzuyuytztzt{s{q}q~t|svyx~~~}z}w~r~nl‚i†h‡fˆdˆa†_†_‡^‰_Š^‹_Œ_[Y[Š]‰^‰`Šb‹c‹cbŽ`Ž^ŽZ[\Œ_‹c‹p†}€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€vswvxwxwxsyryrxuwwvvvrvpxnwmxnxowrvtuwtvvuxsyryswsxtwsyryrytyvxxwxvxvtvrwpxqxswuvwvwuvuvuwtxuxvwwwwwvwvvvtwswtwvwyxzwxwvuuvvvwvvvvuxvyvzvyuxuwvvvvvvvxuyuxvwvwvxvzuyuwvvwuwwwzw{uytysyrzrzrxrxsxtwuwvvvwvwvxuyuzt{t{s{s{r|s~r~s}s{szs}r~s~s~s|s{szs{s|r~r~s|u{t{s|r~sq}z{~}}z|v~som„j†g†g…d„a„^†]‡]‰^Œ^^][ŽYŽY[‹]Š_‹bŠeŒdbŽ\[ŽZŽZŽZŽ]‹bŠp†}€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€utwuwuxuxtxswsvutxtzuxwtyqxpwpwqwrwsvtuuvvwwvuwuwvwvvvwuwuwuwuwuwuvwuwuvvswqwrwuuwuwwwxxyxxxwwuwuwuywzxywxwwvxvywywxwvwuuuvvuxvxvwvxvxuytzsytxuwvwvzu|u|v|vzvyvwvwuwtwuvvuvvvxvxvxwxuwtwuvvvvvuxtzt{tztysxsyszs{t{t{s|r{q{q{q|r|s{t{t|s|s|t|s{r{q{q{r|s|t{tzuytzs|s}t~q{y|~}~x~ur€pm‚kƒj„h†eˆb‹^‹[Œ[Œ]Ž__`Ž_Œ]Ž[Z\Ž_a‹dŒdda]Œ\‹[ŒYŒ^Šd†r‚~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€vtwtwsusvsvsvuuwuywyxxyvytxrwrwswswrxqxpxqyrwrxrwtvuvvvuuuusvrxpyoysyuwwwvwswtwuwwwwzw{wzwxwwwvwvwvwwxyxxywxwwwvwvwvwuvutuuwuxwxwwwvwvvvvvuvwvvwvxu{u|w|v|vzvxvwwwuxsxsvrusttuuvvwwwvwvwvwvwwxwyvzv{u{tzsysxsxs{u{u|s{syrysyrzs{t|u|u|s{u{u{t{t|r}r|rztxuvtxtzs{t|u{s{qz{}}}x}ur‚o‚ljƒh†f‹dŽb`]‹\Š^‹`Œ`ŒbŒa^]Z]_]`_`ŽaŒ^‹]‹YY\Œa‰r…~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€stwsxrxrxrwrwsvtwvyvzuzsxrwrwswuwuwtysyqyqxrwsvswtwuvtutvtusvqwpwoyqyswuwuwuwuwuvuwtxuxvvuvuwuwuvvvtwtxuxwwwwvwuwvvxuxrxswuwwwxwwwvvvvwvvwuvuvuvuwuxvwvwvwuwtwtyuztztyuvttususvtuvvwvvwvwvwvwywzvyuyuwvwuwswswsyt{t|s|r{rzsztzuzvzv{v{s|t{t{t|r{q{qzsxuvvvuxr{r|r|t{qyry{}|{wzs|o€l‚jƒg…gˆe‹cŒbŒ`‹]‹\‹^Œ`Ž_Ž_^Œ_‹^‹Z[Ž^^___]\Ž[YXŒ[Œ`Šq‡~‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ufzh|i{nzpxqwrwswszqzqzqxswuwvwwwwwwxvxuysxswsvuvvvvwtwsyryrxrxqwrxsxswuvtvvvvvvuvwvvvvuvtvswswtwvwvwvwvwwwwwwvvvwvxuytytyuxwvxvwuvtvuvuvvuvuututvuwvxwxwwwvvwvyu{v{vywwwuwtvswsvsvuvvwuwuwvwyv{szsxsvsusurwryszs{tzt{s{szsztzuyuytzt{r~r~r}s}rzryrxsvtvtwtyq|q|r{uxouqv{~{{sxnzjhƒh‡f‹d‹b‹bŠaŠ_Š^Œ^_^’\’]\Ž^_Œ_\Ž]Ž`Ž`ŽbŒcŒ`Œ`‹^‹[ŒY\ŒaŠq†€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€skwgyf|m{qxtwuvwwuxryqxrwtwvxvxwwwwwvvwtzs{rzrxuuwuyvwwvytxtvtvtwuwuwuwwvvvwvwvwwxvwvyvyvywywxvxvxvwwwxwyxxywyuwuwvvwvwwvxvxuxuxuwuvvwwwywwwuuststttvvvwvyuytzuxvxwxwwvxvxvvvswqwqvuvxvxvxwxu{t|szrxswuvuvtytzs|r{sysyszrzrzq{r{r{rzs{q}q}r}s}r|r{r{r|r|r|r|s}s}uzwtoprv|~~xp€lh‚g„eˆc‹cŒb‹b‰a‰`‹_^ŽaŽ_]]\`Ž^\Ž[ZŽ\]]]Ž^`Ž_^Ž\Ž]ŽaŒr‡q‹f„cxqqxtwuwvvvwtxuxwwxvxuxuxwxwxwvvtvswtyszsyuxxvyvywxxvxvvvvvwwxwwvwwxvxvwuwuvwvwvwvxwyw{w{vzuyuxwxxwyxxywxvwvvwvvxwywzwyvxuytytwuuwtxuxvvvutuuuuvvswsyr{szvxuvvwuyuzvxwwwvvvvvwxwxvyvxwyvzwzvyuwwwwwxvuwtxrzr{q|r|r{r{s{s{t{uzszs{r}q}r}q}p|p|q|q~qp~p}r|p~p€q}lztz}~{t„m‡h‡g‡fˆdŠb‰aˆa‡`‰`‰^Œ]\^^Œ__Œ^Ž`]ŽZŽYŽY[\\\Ž\\_]\\`‹r†€e„Aƒk{hptsxrxqxqwsxvwwwwwvwwxwwwwvxtxuwuvuvuvuvvwvwuwvwwvxwxwwwwxvwvwvvwwwxvyvxuwvxuxtxtxtwxwxxwwxvxtysytwvxvwvvvvvvvwwyyyyxwwvxtytxsuttuuvtwtxswtwvuyszrzs{szsxswrxrxsyuyvyv{v{uztyuwuwuwuxuxuwuvtwvuvuvtvuvwtxrzq{r{rysxsxtxtzu{t{s|q|q~q~q}q}q|q|p|p}p}p}q}p}q~o€l|vz}}xo„i†g…f†d‡b‡`†^†]†]‰\‹]\ZŒZ‹[‰ZŠ\Š[‹ZŒ[Œ[\[[\‹\‰\‰[‹YŽ\[[ZŒ_‰p„~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€hƒQ|gwinqrxtyryqxtxvxvxuztztzuyuxuwtxuwuxvwvwwvvwtxsxtwwvywxwxwwxvxwwxwxxwyuyvyvxvytzt{tyuxvvwwxwzw{uzsytwuwvuxsxsxtvwwxxyxxxwvwuwvxtwtwuwvwvwwuwvwwuztzrzszszrzrysxsytytzuzuzuztzsztxtwsxsysysxswsxtyuytxtyuzvzvzuxtxtxsys{s{q|s{r{s{s{r|r}r{s|s|q}p|p{p{p}q}s|u{ryrwz{z|q}kg„e…c„a…`†_†_†_‡`‹__^Ž]Œ]‹Z‹ZŒ]ŒZŒYŒY[Žaab`‹^‰_‰]Š\Œ][\ŽZŽ_Œo‰~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€M†bƒInjhnmxtwtwtvuvvwuxvyuztysyrxryqyqysxswtwuwtwrxrxswtwwwwwwwwwvwvwwwvxtyuxwwwvvxtxtxtxtwuvuvvwxxyxxwwuuuvuvwtxtxuwxuzvzvywvxuwtwutvtwuwvyvyvxvwvwuxuyswsxsyrzs{t{u{u|t|t{uzuyvzv{vztyszs|s|t{tytyuzuztzt|t|u|tzuxvwuwtzr{q|p|q{p|q}q~q~r}r|s|s|s}r}q}p~p€q€r~uyrsuv{|v|kf„e‡dˆbˆ`‡`ˆ`ˆ`‡`ˆ`‹^Œ^Ž]Ž]Ž[[Ž[Ž]Ž]Ž[Ž[Ž[\Ž\Ž^_Œ_‹_‹`‹]]Ž[Ž\]a‹pˆ~‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€a„uYqmqtjyqxswsvsxsyszuzvyvxuxsxqypypxrwtwtxsxsxsxswuxtwuwuvvuxvxvwvvwtxrxsxvvwvvvtvtuuuvuvuwuwwwwwwvwvwvwvvvwuvvvwvxtxvwuwwuwtwsvttwuyuzv{v{vxvxvxtytytxtwtxtzu{t{uzt{szsytxtyuzv{uztzt{t{u{uztytyuyuyvzwzvzvytytxuxuytyrzrzrzr{q{p|q|q|r|r{r|s}s}t}s~rp€qu}uxstxy{}qgfe„c‡a‰aˆcˆ`‰_‰[ˆ[‰[ŠZ‹ZŒ[ZŽ\Œ\‹_‹`Œa]ŽZŽXŽXX[Ž^Œ`‹bŒ`]\Z‹^‹dŠq‡~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~s‚|€[jjapcxpwrvrvsysztyvxyvyvxvtvrwqvrwswswtwtwuwvwwwwxtxswtuvuwvvvwvvvvwvxvwvwvwuvuuttttuuvuwuwuxuxvyvywyxwxwwvwvwwuwtytytxvvwuwtwvtyu{u|v{wyvwvwuwtyuzuytytxtzu{t{u{uxtwtvsvtxtyt{sztztztzt{uyuxtxsys{sztyvwwvuwtys{s|t{t{uzt{t{t{rzryqyrytzt|t}t}t}sqoq€t|swuy{~w‚l…f…d‚d‚c„`…a‡aˆ`‰`‰^‰^‰^Š^Œ]Ž]][Ž\Œ]Œ^_ZZXXXZ[ZŽ\^^Ž\[ŒZŒ`Œo‰~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€r‚{€n€mprnvsututvsxtxuxwwxwwvvvuwtwtvuvuwtwuxuxvxxxyxxxvxuvvuwvwwvwwwxwyxzwzwyvyuwuwuvvvvvwwwvwvvxu{v|u}v|wzwyvxwyvzvztztztzuzuyvztzsytztxuxuxvyvyvxvyuzu{tztztzuzvzuzuytytyuxuxuxuztzuytzr|q}rzsytytzs{t{s{sytyszr{q}r|s|t{t{s}sqq~q~p}r}s|s}s~r~r~qp€oqrmzsxy{r~h„d…b…`†`‡^‡^‰^‰^‰aŠa‹cŒceŽb_‘]‘X‘ZZ\]Z‘W‘VWYZ\[X‘Z‘\ZZZŒ`Šq†€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€@~T{x~lwtwtwtuvtwtwuvwvywywwyuytyuwvwwwwwwuvuvvwwxyxyxwxwyuzvzvyvwvwvxwxwyv{t{s|s{tyuvvuwvwwwwwwwyw|w}w}w{wzvzuxtxsxuwuxv{u|u~u}u|s{rysytxtztzv{w|v{u{t{szsztyuyuyvztzt{tzuzvxuwuwvxvxvvvwsyrzrzqyqzp|p}q~q~q}r}r}r}q~r}t{txuyt{t}r}r}r~qrr~q~pp€qqqqr‚kƒgt|uj‚b‡`‰`ˆ^†^†]‡]ˆ]ˆ]‰]Š_aŽcdŽcŽ_Ž\[Y‘Y‘]^‘]‘[‘YXZ]`Žba_\‘YWX`sˆ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€<sIrv{nvuwuxuwuvvwvwvwvwwwwwyvxvwvvwwwwwwwvvuuvuwvwvxvxuxwwxwxwxvxuvuuuvvvuxtzt{t{uytxtyuyvyvxvxv{u|u}v|wzwyvyuxtwtvuwuxvzuzvzvzwzvztztztxtxuxvyvzuzs|s|s{s{uzuytytzt|u|v{v{uzuytxuwuwwvxuvwuyt|s|p|n{o{p|r~q~s}t{s{s}r}s{sxtwtyr{s|s|s|r}q}q}q~qq€r€s€s€s€tƒh„l~x~tƒj‡eˆc‡a‡`†_†^ˆ^‹^‹^Š^‰]Œ[^_Œbaa`___]\‘ZZ[Ž_ŽabŒbŒbŒ_Ž\Z‘X’Y‘b‘t‹‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€l‚k{z|omvsvvvuwtwtxuwvwuvtwvwwvxwwvwwwwwwwwvwuwvwvwvwvxuyuyvxxwwvwvvuvuvvvvvvwvxvyvyuxuyuyvywxwwvytzt{uywxvxvxtxuxtxtytwuwtvvwvxuyuzu{u{uyuwwuwuwwvyu{t}t}t|tztxswsxuzvzw{u|t{t{tyuxuyvyuyu{uzu{u{t{s{szsytytytytys{s}s}s{rzszr|q~p~q}p}q}o}n|p|q|q}q~r~strƒlqyw{r€j‡gŠe‰cˆb‡aˆa‰`Š_‰_‰`‰^Š[Œ\Œ^‹bŒaŒ``Ž`_^Ž[ŽZŽXŽ[^``_ŒaŒ_Œ]Ž\Ž\Z‘]‘d’tŒ‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€p‚jzz{qgwowswrwsvtvvwvxuxtxuwvwwwwwwwxwxvwvuwtxvxvwwvxwxwxxxxxxxwxwwuxuwuvvvvwvwwwxwwwwxvyvzwywxwwuxtxtyuwvwvxuyuztysytxtwtvtwuytytyuzw{xzwxuvuvvuwvwxuytzszszryrxswtwuyt{t}r|t{u{u{t|s{r|r{tzuyuzu|s}s|sztxuxu{u|ttt}s|q|r{q}q}q~q~q~p€oo}pzqyp{p|p~su~pm|v{v|mh†fŠe‹b‰b‰a‰aŠ_‰^‰^‰_Š`Š_Œ^]^^\]^ZYŽXŽYŽ[^`Œ``_Ž_Ž]ŽZZŽZZ^eu‰€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€z€bowvtczkxqwrvsutuvvvwuxuxtwvwvwvwvwwwwwvwuxtzuzuxvvwvxwywywyxxwywxvxvxvvvvvuwuxuyvywwwvxuwuwuwvvwvwwwwwwxwwvwyvzuzuytwsxtyuzuzuyvxvxwytztzryswtuuuvwtytytzsyszszszryryrzr{r{t|uzuztztztzuyuxsyq{r}r~s|s{tytzt}utt}t}s}r~r}p|p}pq€q€q€qq}s{rzqzqzr{s}r|lzpzy|u|l~hf…dˆc‰aˆ`‡_‡_‡^ˆ^ˆa‰b‰`Š]‹]‹_‹bb_‘^‘[[Ž[]^ŽaŒ_‹_‹aŠa‹^Œ[Œ[ZXŽYŽ]Žfx†€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€‚YŠBƒnot`}kzpxqwrwrwtwtxtxtwtwwvxwxwvwtxuxuwuyvzvzuyuxuwwwzwzwzwzuxuvvuwuvuvvvvwvxwywyxxwwvuuuuuvuvtwuwvxvxvwuwtwtxsysxtxuxuxwxwwxuxuxwxyuztzsyryszszt|s|tzuzuyuytysyrypypyrzrzs{szrzqyqzrztztzt|s~r~s}s{t{t|t|t{v{u{tzs{s|r}s~q}q}q}r~r}r|r|r|s|s{s{r{s{s}o}i{rzz}u}mg€e‚c†b‡`‡^‡^‡^‰_Š`‹c‹cŠ`‹_‹`‹a‹ba_`]]]Ž]]_aaŒ`Œ`Œ\ŒY‹\Œ[Œ[Œ\^Œiz…€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€c‹n‹pyzh€d~d}f{k{kzn{pzryswsvuuuwuxtxswswtwtyvxwxwwwwvwwwywxwxuxuwuwwwxwwxvyvxwwywyxywxwwwvwwvwwvwuxuxuwvvvuvtttuvtxsysztzuxvwwvwuwwwxwzwyuytxsxszszu{uztxswswsxsyuysxswrwswsxrzr{q|r|s|s{tzuzu}u€t~r}r{t{t{v{u{u{t{szr{r|s{t{t{s{r|q|q}s}s}r}p~n~p}p~qq}nzmwvyy~s€lƒf‚e„c‡bˆ`‰_ˆ^‰bŠcŒcbŒaŒ_Œ]Œ^Œ^Œ_```_Ž^Ž^\^^Ž_Ž^]Ž\[YŽYŽ]ZŒ_ŒcŠn‰|ƒ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€w‚z||~z~u}p|l|h~d€cƒc‚e€lzqxswsxsysxsxsxrxsyuwwwvwuwuxvxxwxvwuwuvuvwxwyvzvzvxwuxsxqyrxsxuvwvxwxwxwxvxvwwvxuxtvtuusvrwtwuwvuvwwxwyvxwxwxwwvwuwtwtwtxuyvyuxtxsxsxsxtxsxsxsxsxsxtxtytyu{v{u{uztzt|t}s|r|r{r{r{sztztzt{s|r{rzsxtwtwtyryqzp|q|s|r|p~n}n}n}oq|nsrqyyy}pkg~dc„c†a‡a…_‡bˆd‰eŠbŠ_Œ\[]]Œ]Œ`Ža_Ž]]^]]Œ^Œ]Œ_Œ\[Ž\Ž[ŽZ\Ž]Ž_g‹t†~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~~~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~~}{~vqo}jzlwtvvwvvvvwuwvwxuytzuyuxuyuxvxxwzuzuztxuwtvtvswrysysxtvtutuuuuuvvvvvvwvxuwwwywywxwxwvvvtususvtvvvvuvxvzwywxwwwvvvtvswsxtxtxvwxtwvuwtysysytzt{tzuytyuxuxuxuxvzuzuyvyuxuyt{r{q|q|q{r{rytxtwuytyryrxrwsxtytzr|q|p~oqq~r}q{p{o|np|ouss{{z}p~ieƒb‡`Š_Š^ˆ^…`†b‡c‰eŠa‹__Ž`Ž`Ž_Œ^_Ž_Ž_Ž][ZŽ[^Œ^‹]‹`Œ_‹_Œ[ŽYZ[^`gv‡~~~~~~~}{}y}|{ysttxuzuzuztzuyvywwxwxwxwxvwvvvvwvxvxvwuxuxtxtxsxrxswtxuxuwuwtwuutuututvuwuvuuwuxuxvxvwuvvvtxu{t|u{wxwywzwzvzuytyryrxrxryuzvztztvswsxsysysxsxtyvxvyvyuyuzuzuztzs{s{tzuyuzt{s{q{q{q{r{rztytytyqzqzq{r{r{s}s}s}r|p}qq€qqp}o|o}qp}oxtx|}x~oie„bˆ`Š^Š]‰\Š_^Ž`a‹aŠbŒbcŒc‹`‹_`Ž`^‘]‘[‘Y‘Z\\Œ]‹\Œ\Œ\YŽUY[\^dv‡~~~~~~~~€€€€€€€€€€€€€€~~|~|~~}{vtwvwxvwvvvvwvxuyuyvwxwxwxvvvuvswtxtwuvwuyuzt{sztyuxvwwwxuwuvuvuuvuvuvvwwvuvuvuvvvvvuwtxuyu{u}t}u{wwxuxwwyv{vzvyuxtwrwsvuxuzr|r{qzrxqyrysxsxsxtxtxtyuzuzu{t{s{s{s{s|s|s|s{szrzr{s|s|t|t|s|s|s{r{q|r{r|sztysyqzo{p}p~q€p€o~o|p|s}owqrww||u|mh€fec`…`‡_ŠaŒ`_Œ_Œa‹cŒeŠe‰c‰_‹__^^’\’]‘]]\Ž[^‹]‹^Œ\ZŽXŽ[\`bŽgŽy†€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~~~~~~~~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~~~|yqzsyuxtxsxuyvzuztzrxswuxvwvwuwsvtwtwwvxuytytyuxuxuwuwuuvtxsxsxtwuvvvtvtvtvuvvwwwwvvvvuxuzu|u|tyuwvtxswuwyv{vzwwvwvwuxtxswswsxsxtwvwuxuyuyuyuzu{u{uzuzszs{r{s|t{t{t{szszrzszsysytytzs{s{s|r|s|r|q|p{q{sytyt{p}n~n~o}p~q€q€q€s|tzotqqyy{|s|lh‚f‚dc`‚_†`‰b‹cŒcŒcŒd‹e‹d‹cŠbŠ`‹c‹d‹bb]‘\\\]]^Œ_‹^‹]Œ^Œ_^abŽeŒiŒz„€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~~~~~~~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~}}}~~}zzl{myswvxuxuyuztzszrysxuxvxwxvxuxtytyuxvwvvwvxuyuyuytxtvutwswrvsvuuuuuutvtxuyvyvyvyvywxxxzv|t{syuvvtxtwwxyvzvyuwuvvxsyszqzrxswtwuwuxuyuzuyuyvyu{t|tzsxswswrzr|t}s}s{rzszs{s|s{szszrzq{q|q|q|r|r|r}q~q}r|s|s}p~mkmprsƒs‚u{uwssuv{{z}qkhƒf†d„aƒ`„_…_‡aŠdŒdŽdŽdŒa‹b‹bŒ`ŒbŒd‹e‰dŠcŠb`_]^Ž`Ž_][ŽY]^Ž\^_e‹i‰{‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€}|{wyw{wyn{izpwuwvxuyuztztzsytxvxxxyxzyzyyxvxuxtwuvvuxuxvxvxtxuwuvvvvvtutvswtwuwuwxxxxxxxwwwwwwxxxxzvzuzuxuvvwuxuyuzuxuvtutwsyszuzuytyszr{r|s|s|tytwuxuzt|s{rxrwrxrzs{s{rzsyrys{r}s~s}s}r}p}p|p{rzryrzs{s{r{r{r|s{rzqzo{n}o~oqrs~t|quqpwt||z}t~n€iƒe‡d‡b†a„_…`†aˆb‹cŒdŒdŠdŠd‰dŠd‹b‹a‹`Ša‰bŠa‹aŽa_]\\\‘Z’X[Ž\\Ž\‘\cŽhz‡€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~~}~~~~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~~|{uuqtvuyuwlxqyvxwyvytztyszrzrzsxwxzx{x{xywwwvwvxwvwvwvwwvxwvxvxvxuxuxuvuvvuvwvxvxwxwxxxxywyvxwvxuxvwxvwwwvvvvuwsxtxtwtvtwtxtzuzvxuxuxtytztzu{uzuyuxtyt{u{tztysxtxtytzs{sysysyr{s|s|r{szrzrzrzsytxuwuxuztzszszsztytytysyszs{s{s|s|s}tzsnsixr}|z|s~m‚g†d‡b†a„`‚`„b…bˆ`‰bŠc‰fˆhˆg‡eˆcŠ`‹aŒ_Œ`ŒaŒ_Œ^Ž^[ZZZ]\\\Ž^Œ`_\‘`e“x‰~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~~~~}~~~~~~~~~~~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~~{|r{pysvzyxrwqytyszryryrwqwpwpwswvwxvxwxvxvxvyvyxwxwxvwvwvvxvxwwwvvvtxsztzuxvwwvvuvuuvwvvwwwwvwvxvwvwvxxxxvwuwsvrwswswtwuxuyuytxtxuwuwvvvwuyuyuytysyrzq|s}t{s{rysys{t{s{s{s{r|r~r~s}s|szsxswsyr{t{tytxsyr{r|r}r}t|s|r|q|q|s|s|s|r{s{uvpqrpyx~}z}rk‚g„c…`ƒ_ƒ_„`…b‡b‡bˆb‰aŠb‹e‹d‹d‹`_`ŽaŽaa‹_‹_‹]ŽZ[\]`ŽcŽdŽ`Ž^^Ž\Ž\`d‘xˆ~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~~~~}~~~~~~~~~~~~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€y|s{qzsx{{{wzlznxpvsuututsvrwswuvwuxuxtxuvuvuytztzuxxvytwtvuvvwvxuxvuxtzt{uzvxvwuvuuuvuvuvvvwvwwwuwuwuwwuxuxtxtwsxsxtzvxvwwuustusvuwwvwuvvtvuwtwsxryr{r|s}t|szrxrxryszr{szrzr{r{r}s}s|tztysyszr{s|r{qzqzqyq{q}opp~q~q}q~q~p|o}o}r|qwmspuz|z~pie‚ba‚_…_‡^‰_‹`Ša‹b‹aŒ`ŒcŒbŽaŽ____Ž_^^`Œ^Œ]]Œ\Œ\Œ[^aŽaŽ^[Ž[]`du‰€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~~~~~~~~~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~~v|q|qyqu{{~{{l|b{cxjuptttuuuwuwvvwvyuyuwtvvuvwuxuxvwxvxuwvwvwuxtyrxtvvuxuyvwxvxvwwvxvyvytzsyuwvuwtwuxvwwtysxsxswtvtwuxvwvuwrvrvuuwuxvwvvvuuvtwtxszs|s}s}s|s{sxsxsxryr{r{rzsytzr|r}r|szuxuxsysysyr{p{ozpyqxqzq|o~op~q}s|s|r|p|n}no~jymstt||zrkfƒdƒbƒ`…`‡^ˆ_‰a‰bŠb‹bŠ_Š`Š_Š_Œ_Œ`_][\^bŽabŒb‹`Œ^YŽ\___[Œ]Œ^aŽes‹‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~~~~~~~~~~~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€}}uytyswsu||~}|xyqwmwiufqlovtxwvwvvwvyvyuytyuxvwxwxuxuxuwuxvxvwwwuwuwvvvuwuwuvwvvwvxuxuxvyu{sztxuuwtwwwywyvxtvsurususxsytxswtwuxu{u{t{tzvwvvuwuxtys{s{s{r|r}r}s{s{szrzrztytxuxuzs}r~q~r{tztysysysxtyr{q|p|p|q|q}q}q~qr~s}t}r}r|q|s~s|lzlwuy~~zqj…e†b†a†`†`‡`ˆ_‡`ˆ`Š`Œ`Œ^Œ^Œ^Š^Š^‹_^Ž][[\‘]‘\‘^`Ž^]]]Ž[ŽXŽ[WŒ[Z_Žfuˆ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~~}~}~}~}~~~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€{|qzs{rxtv||}|{yywxvuqmmkurxwxxwwxwwwvvvuvuvvwwvxvxuwuwuxtytxvxwxwxwwwvwtvtwuwtytyuwuvvwvxuxvwwvxwwxvxvvwvvuuvtvsxsytytyszr{s|s~t}u|v{vyuxtxtxtxtztzszr{r{r|r|r{s{szrytwuwtxtyt{t|s|rztytzs{r{qyszs|r~q€qqq}o|o}p~r~r~s~r~q~q|t}uysrrqxy~~ypjg‚d„b†`ˆ_‰_Š_Š_Š^Š^‹^Œ^^^`Œ`Œ`Œ__^‘_“_“`’^‘^`__][[X\XŒ[^`Žh‹w†€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~~}~}~}~}~}~~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~~v}jon{sw}}~}|{{zzxwtpnisqxwxxwxwxtxsxsxqwrwsvtwuwuwvwwxvxuxvxvxwxwwwuwuuuvvwvwuxuxvyvyvxuvuvtvuxuxvxvxvxtysysxuwuvvuuwuytzs|r}r}t|vzvyvxtytxtwsyrysytzszszrzsytzs{r{rysxrxsytytytzsztytyrzq|q|r|s|s}rq€pp~o|n|o|q|q}q}q}q~r}qo|rtwq{zz|rynzj~gd„a†a‡bˆ`‰_‰^‰]‰]Š]‹^Œ]^_``aŽ`‘a‘a‘eba_]]Z[‘Z‘\^Ž]Œ]Œ`ai‹u‡~‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~~~~}~}}}~}~}~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~~{yswn}o€o}tz|}~||z|z{yyvqnmstxwxwwwvvuwtxvxvxuwswrvtwuxwywxwwvvxuxuywyxxxzxywwvwvuvvuvuwuxuwtvtwsutuuvwxwyuytyryswvvwvvwuxuyuzu{s|r}r{s{tztzu{t{tzrzrzszs|r|r}s}uzvytysyrzsyryryryryrzr|r|q{qzr{r{s{szrzq}ppqr}r|q{p{pzp{p{q|r|szkym{t}|~z|pyj{g€dƒa…_†_†a‡_‰_ˆ]ˆ]ˆ]‰^‹]]Ž[Ž\Ž^Ž_Ža__‘^’a‘a‘_’]‘]\[^]]``Œ_`af‹n‰}‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~~~}}|}||{}|~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€|zwrvuv{s}n}rz|}~|{zyzz{yyvqnnruvvwvwuwuwvwvxvyvxvwvvvwwywzxzwxwwuytztzuzv{v}v|uzuxuwswswtvuwuwtxtytytyuyuyvytxsvrvsvtvuvvwvvvuvwuytztzsxswszt{u|t}t}s|t{uzt{s}q~r~s~s|s{r{r{rzszr|qzp{q{p|p~p~r}r{rzqyqyqyq{p}qr}tztysxryqyq{p|p}q~q}k|k{s||~€€z}q~ie…e‡bˆ`‰_‰_Š^‹^‹^Œ]‹[Œ\ZŽZZŽ^`ba`Ž^__`‘_‘]^Ž__Ž_Ž^[Œ]Œ_^]_ŽcŒgŒy…€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~~}|}|}||{}|~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~~uzoyrzt{rznurt||~{{xwzy{zyvqnntszu{vzwyvxvxvxuxuyv{v{w{v|wzwywwwwuys{r|r|t|u{u{vzuyuyuytzuxvvvvuwuwuxuxuytxtwswswtwvwvxuyuxuwvvvwuyvyvxuwswsysytyu{u|u}t}u|t{szszs|s}r~p~q}r|qzrxsytxsyr{p|p~p~q~q|q|q|q{rytxszr|p~q|rzrzszqzq|o}p|p|p~m|pwwx}~€€|~t}m~jg…e‡dˆa‰_Š^Œ^Œ^Œ]‹[Œ\Œ[Œ]Œ`ŒcŒd‹d‹b‹bŒ`a^^^\^Ž`ŽaŽ^Ž[XX[Ž\\‘\bŽfvŠ~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~}}}}|}|||}|~~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~‚~}}swoyr{r|p|muts|{{|xyyy{yyvqqkzq~u|w{v{vzvxvxvxvyvzv{v{u{vzwywyvyuys{r{s{tzvyvyvyvxvvwvvxvxuzvyvyvwvwvwuwtxuxuwuwvwvwwxvyvxuxuxvyvyuztytwsvtuuvtxtyu{v{v|t{tysytyt{s|r}r|s{tztytxryrzr|r}q~q}q|r{q{r{s|s}s|r{q}q}p~q~r}r|s{q{r|q}q{ryqynwsuyx~~~w}q}mg…eˆdŠb‰a‰_‹^Œ]Œ[ŽYZŒ\Œ^ŒaŽcŽdŽdŽdcŽaa``_][]`Ž_Ž^ŽYŽXŽ\Ž][Z’`‘guŒ}ƒ~}}|}|}{|{}{}}€ƒ}ˆy}{rwmyp|o}m~kysw}}~||xzzy{zzxqtk{s}v{w|w|v{vzvzvzuztztzt{t|u|v{xyvxvwuwuwuwuvuvuxtztztxvwvwwxw{w{w{u{tyuxvyvzw{wzwywvvwwvwuwvwwuxuytysyrzsztyuwtwtwtxtytxsxsytytzt{s}s|t|tzuzuzs{r{q|p~ppqr}r|r|p{p{q{p|q}p}p}q}r}q}q}p{rzryr{q}q}rzpxnwrwy{zso„kŠheb‹aŠ_‹^Œ]ZYZŽ\]^ac‘db`^’^“_’^‘\‘[YYZ[^]Ž[[ZY‘Z^gnŽ|…~}}|}{}{}{}|}}€~ƒx€€€€€€}|wvqws{r}n|mutv}}~z{wxyx{yyxtrowuzv{w|w|x{yxwxwyt{s{sztzu{uzvywwxvxwvvvvvvwvwvvvtxtztzuzuyvzw|w|w|v{uztzt{vzwzxxwwwwwwvvvuvvuxtyszsysyr{s|t|szsytxtwuwswrxqys|t}t}s|rzrztzuzt{r{q|p}p}oqrr~t|s|r{p{p|o|p{q{r{r}q}q~p}o|q{qzr{r|r}rzoyozr|y~€€€€{v‚o‡j‹fbŽabŒaŒ`Œ_Ž]Ž\Ž\Ž]^‘_’a‘acbaba‘`‘^’\’Z‘ZŽXXŽY\`]Z‘Z[Y\cŽhx†€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~~}~|}{}{}|~}~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€{€€€€€€€€~}xzsxtuwnxqvyz~~~~y{wyyx{zzxssoxs{s}t}u|xzxwxvwuvwuxuxuxtxtxuwvwwvwvvvvvvwvyvyvxvxvxvxtytyuyuzvyuzuzv{u{u{uzvyvwvxvxxyvzu{s{q|s|r{tzuytyszs{r{r|r|t{vztzs{r{r|s|s|r|r{rzszt{s{r|q}q~q|q|r{q|r|r{r{qzq{q{p|q}r|p|q}ppq€p€pp}q|r|s{ryoxnys{z}€€€€€~xn†gŠd‹a‰bˆcˆc‰bŠa‹_\Ž\_‘_‘a’cccŽdŽeŽecŽa^‘[’X‘VŽTVX[bŽbŽ_^]Z‘Z’`fu‰€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€}~}}}}{}|}}~}€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€}€€€€€€€€€~~z|xzxyx{z~}~}zyyy{z|zzxustuwwvzt|u|vzxyxxxwwwwvvvtvsvsvswtwuwuwuxuzs{s{sztyuxtxuyuzuyvyvyvyuzvzu{tztztyvxvyvzv{w}w}w}v}t}t}t{uyuytytztzszszszt{tztztztzt{r{r|r}s}r}s|r{rzr{r|s}t}t|szsyr{q|r}q{szszr|q}p~oop€ppn€noq~s|vxswmvnutv||€€€€€€€z‚o‡f‰b‰^‡^‡^†_ˆ_‰_‹_`Ž^Ž``a‘b‘bcdŽeŽdŽa`]’Z“W’UUW\‘^‘a‘a^‘^’]’Z‘Y‘Z‘ao}…€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€}~}}}}|}}~}}€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~~~~~€~}||{|{{yywsrtvxvvxuxuyuzv{v{x{xyvyuxtusttrusvvvxuytzszsztzuytxuxtxuywywxxxwyvyuyuytyrysyswtwuxtzvzwzwzw{v{u{v{vzwywxvxuytyuxuytyr|r|s{tzt{s}s~s|uzu{u{s{sztxtyt{s|r~r~r|szs{t|s|s{s|s}qo€mmopq~p~pqq~q~q~t{m}g{lvut}|€€€€€€€€€|€r…gˆbŠ_‰^ˆ]ˆ\‰]Š^`ŽaŽ````Ž`bŽdŽeŽfŽc]’[“Y”Y”X’Z‘[‘[^^_]‘Z’[’\‘[XZ‘]‘e•xŠ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~~}}}{}{}{~}~}€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~~~}}{yxvqoptvwwvvuuvuxuyvzw{wzvyuyuvutvtwuwxwywywyvxwvwvxwwwwvvuvvwuwuwuvvuxtyuytzs{rzsxsustsutuuvuwuzt|t|u{v{vzvytysytyuxuytzr|s{s{uzt{t{t{uyvxvxuxtwswtxszr{r|r|t|t}t|t|s{s{s{s}t~srq}p}p{p|q}q}q}r}r|q|s|tzl{hzlwuw}}€€€€€€€€€€~uj†f‰b‰a‰`ˆ_‰`‹^`_a`‹_Œ^_Ž`ŽbŽeŽfe`’Y”X”Y“\^aŒa``^‘^’[”Z•Y•Y”Z“_’`‘du‰€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~~}}}|}|}|}}}}~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€}{zxxtrkumzsysxtvtuuuvvwwxwywzwyxxxwxwwxwywywxwvwuxtxuxvxwxxxwwuxsxrxsxvwxuxvwtwtxsxtuvsurtuuxuzu{u{u{uyuyuzt{r{szrzszt{tzuzsysxsxtytytytytytytxtvsvswsys|r}s|s{uzu|u|s|r{q{r|r}t}s}s|s|s{rzrzr{r|r|s|s{t{u}xwsqporpxv~}€€€€€€€€€€w}n~iƒe…bˆ`ˆ`Š_Š]‹__bŽabŒaŒ`Žaabdca“\”[“`‘bbcŒccc‘a’`’]“Y“[“[“]‘]dŒi‹r‰}‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~~}|}}~}~}~}}|~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~~}|{yywwtqnqrwvwvuuuuuvuvvvvxvyv{x{yyyxyxwwvxvytytytxtwuwvxvxwwxvvvvutttvtxv{w{vzuxtwtwtvtxuyv{v|w|v|vzsytxtyt{t{r|s{szszt{t{szrzqxpyrytytxtytytzszsyryrzr{r}r}r|s{s{r}r}s}r|q}qq~q}r{s{r|r}q}q{r{r{s{s{s{s{t|vyquotpvwz~~€€€€€€€€€€~x}n}jfƒb‰_Š^Œ]Œ\Œ_Ž_Ž`^abacbbca‘`“\”\’`‘`’a’bbcŽba`\X‘X‘Z\[Ž`edw‡€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~~~~~}~}~~~~~}~}~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~~|zywxvwtonjwrztytxtxuxtxuxvyvyvzvyvyvyvxuytyvzt{rzsysytytytyuyvwvvuvtyszt{t}v}u|u{uzuyuytxtzt|u}v|vzuxsysztzuzvzu{u{uxuwuwtxsyqzryrysxtwsxrxrzs|s|s{rzr{r{r{rztysyq{q~q~r}s|r|p~po}q{s|r}q}q|qyqyqzq{q}q|q}r~q~m|nxrvzz~~€€€€€€€€€€{sm~hd…a‰_‹^^Ž_][‘[]]^_`bd`\‘Y’Y“]“^“`’a‘bba^‘_‘[’X’W‘WXXZ_an|…€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~~~}}}}}~}~~~}~}~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€}|zxxvxuwtpnnvuzuyuyuyuzuzuywyvxvxvxvwvxuyu{t}u|v{tzuytyuytyuzvyvwxwxxxzv|v|u}u}t}t{tzuzuyuxtwtvtxtxuytzs|s}t|tztzu{u{vyvwtwsxrypypysysxswrwqyq{q{rzsytyszszszsztzszqzq{p{q{r{r|r{r|rzr|r}r~r}q|qzrzq{p|o|o|o~oo~m{oxruzz€€€€€€€€€€€€~€xq~l~g‚cˆaŒ`Ž_^‘[ZYŽZY‘\^_aa^ZX’Y“]“_’`cŽccb`‘`‘[“X”W“V“W’V“Z’`‘d’e—t‘}„€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~}}|}|~}~~~}~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€}|ywxvxvwtqnqvvzwxwwwwvyvzvywywywywyvxvwuxuzu|u|vzvxuxvxuxuwuwvwvxwxwzxyx{w{w}v}uztytxuwuvvtutustvsxs{s~su~u|szrzrzsyuwuutwsyrzrzrzr{r|s|r{s|r{rzrzszs{t{tztzt|s~s}s|ryryryr{r}s|t|t{t|s}s}r|r|r}r}q|q{o{n|o}pp}mznwqxz|€€€€€€€€€€€€€y~s}mg†c‹aaa’`“^^\Œ^Ž_bdŽdcŽb_[‘Z’]“`“b“a’a‘a‘b‘ed‘c‘_’\’[’Z’\‘\’^’a’a’gk{…€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~~}|||}}~}~~~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€||zxywyxxuqopvtzvxwxwxvyvxvxxxxxxyxxwwwvwwwxvzu{vzxxxvxvxwwwtwvwvxwyvzvyuywyxzv{u{tztxuvvuwtwtvuuvuzs|t}t}v{vztzs{q{rztwvvuxtyrzsysyszr|r~s}t|uzvyuyt{t|s|t{s{s{r}r|s{sysztzs{r|s|t|t|t|s{rzrzq|r|r{rxqwoyozrzsznwmrpquw|}€€€€€€€€€€€€{}t|mƒhŠeŒcŽba‘`‘aaŒ`Œa`aaŽcŒcŒaŽ`‘^“\“`‘bd‘a’^“_‘cdddb‘b‘_‘\\Ž[^Ž__dgŠx„€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~~}|||||}|~}~~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€}|zxywywxuponwszuywywwwwwvxxxxxzwzwywyxxyvxxwxvyv{wyxxxwwxvxuwuwvwwxwxuxswuwvxvxuysysxsvuuvuwvvxuyuzuzuyuyuxtyt{t|t|t|u{u{uzuytxuwtxtyr{q|r{s{uzu{tzsytytzuzszqzr{s{r|r|q}q|q|r{sztzs{rzqzqzq{p|q|p{pzpyozpyqzswoookrpwx}~€€€€€€€€€€€€€€~~vn…j‰gŠe‹da^^Ž\Ž]][\\]Ž`Œ_Œbb‘`’b‘cc^‘[“]’bbŽaŽaa‘c‘a’]‘Y‘Y\]‘^‘_‘hŒt‹}ƒ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~~}}|}|}|}|~~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~|{yywywxuoqi{q~t{wyxwxwvvvwvwvzw{w{wywwxvywwxwzv{v{vzvxvvuvuwuwvxvxwwwwvvvvuwuwuxsxsxrvttvuvvvyuyuyuyuxuytzszt|u|u{u|t~s~s|uxvvxuvvuwsxryszs{r|q|q{q{s{t|u|u}r}s}t}s}qp€p~r|s{szszryrzq{p}p~p}p|q{p{o|o|p|r{sxnumsprvu}}€€€€€€€€€€€€€€€€€w€o„j‡h‰gŒe_[ŽYYXZZ\__`ŽaeŒdŽbc‘cc]Z‘[‘^‘_‘^^ac‘b’]“Y”Z’]’^‘\’Z“b‘f”xŠ~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~~~~|~|||||~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~}{yywxwxupri{q}uzwyxxxuvvvwuxuzuzv{xzxxyxywxxvyuzu{u{tztztyszsztzuyvxvxvyuzuztytyuyuxuwuvvvvxvyu{uzt{szs|s|t|t|s|tzszs|s|s|tyuvvtusutsxrzqzqyqyryszr|s|s|r}q~p€p€pq}q}p|p|q{q|r|r|rzrzrzr{q|q|q{p{p{p|p}q}t|r}kj~oyww~}€€€€€€€€€€€€€€€€zr‚lˆjŒjŽc^Œ[ŒYZŽYŽ\Ž_ŽaŽcŽcŽbcba`’c’e’b’[‘Y[_‘`‘``a_‘`’\“Y”]“b‘ca^‘a’e”s}ƒ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~~~}}|}|}|}}~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~~~~~~€€€€€€€€€€€€}|zxxvxvxuqnoutzwyxxwwwuvvwxvyuyuxuzvzvywvwtvvuwtxtzu{t{u{t{szszsztxuxtxuyuzv{vzvzvyvyuyvxuwuxuyt{t|u}s}r~r}s|s|r|s{s{t{tzszszsztwtvswryrzq{rysyuxuxv{t{r{p{o|n~nmo~q|r|r{q{q{pzoyqxrwswsyszr|r|r|q{r|q|r{s{s}l}k~ozwy~~}~v~p€o„m†e‡aˆ]‰[Š\‹]Œ^‹`ŒbŒbŽaŽ`_Ž`aa‘c’f’^”X“Z‘[^`baa^Ž_\’X•Z”`‘cŽcŽab’g“p’|…~~}}}|}}~}~}~~~~}~|~|}~}{zxxvxvxurmruvzvywyvxvwvxvwwwvvvvvxuyuyvwuvtutvtwuwuytytwsvtvsxtxuwtwtvtvtwvxwxxxwwvwuvuwuwtwtxuzu}u~tsr~q~p|r|s{r{szryryr{r|s|r{rzqzqyqysyuxvyvyw|u|t|t{ryqxpxoypzq|r|s{r{qzpzozpzrysytys{r|s|r|q{r{qztxtxsxmrmppqwu~~y}s|q}j€c…`ˆ^Š\Œ[[Ž]Œ`‹a‹aŒ^Ž\Ž^Ž`ŽaŽaŽbŽe[“Y‘^^ŽadŒdŒc‹a‹__\’V•Y“^‘`‘b‘`’^“b‘e”v‹~~~}}|~}~}~}~~€~€}~}~}~~€€€€€€€€€€~~~~~|{zxxvxvxvroqwu{vzwzvyvyvxuvvvuvuvvwvwvwwxvxtysxsxuwuxtwsvsvsvsxsyswsutusvswtxvwwxvxuytyuytztyuxtzu|s}t|s|rzs{rzsztzsytxsxsyq{p}q}p|p|r{r{rzr{szu{u|v}u~u}u|tyrwrwpxpypzp{r{r{syrzq{q}r}s|szs{s{szryqzq|q|qzqzkzjtmpqqyw~~€€€€€€€€€€€€€€€€€€{vrh„aˆ^Š[ŒZYY[`ŒbŒa`Ž\]^Ž\`Œc‹dŽ[’Y’YZ_cŒb‹bŠa‹aŒ`^‘]‘^`‘`’a’a’`“b’h’wŒ~ƒ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~~}|}|}}~}~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~€~€~€€€€€€€€€€€€€€€€€€€€€€€~~~~}|}|}|~}~}}||zzyywyvyvxvptn|u{vwvxvzu{tyuwuwtwtvuvuxuzvzwzv{tzt{tytytxuxuytyszs{rysyuwsvswuxvyvzvzv{u|v{u{uyuxtxtyrzrzryrxtxtxuyuyuyuxuwtxrzp{p}p}p|q|q|r}r}s}t|u{u|t|t}s}s|rzqypzq{p|n|o}q}s{szrzq{q}q}r{sztytysxqyq{p|o}m|gzhxoustzy~~€€€€€€€€€€€€€€€€€€}~xqe‡a‰_‹\ŒYYYZ]Ž^^_‘^’^’]‘^bŽf`[•Z“Y’X’\^`baaŽa`’_’`’]’^’^’a’b’c“i‘j”yŠ~€€€€€€€€€€€€€€€€€€€€€€€€€€€€~}}|~}~}~~~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€}|~~~~}||{{yzxzy{z{yzxywxvxvywyvwtorpzuzvwwwwxwwwvwvwuvuvuvvvxuzvzxyxywxvzvzvzv{u{u|u{szsxsxtxtysxrxsytzt{v{w{v{u{t{tzt{s|s{s{szsxtxuwuwuyu{u|u|t{szsyszq|r}q|q{q{r|r|r|t{tzs{r{r{r{r{r|r|r{s|q}p}p}q{szszr{p{p|o}p{q{rzrzqzpyqyrzrzqxkukuovrwy{}€€€€€€€€€€€€€€€€€€€€z}q}dƒ_‡^ˆ]‰\‹\]^\Z[’\’`’a’_‘`ci_•]–]“\“[’_`‘bdc‘b’a“`’_’_’_“`“_“_“_“`”d’e–s‘}„€€€€€€€€€€€€€€€€€€€€€€€€€€€€}}}}}}}}}}}€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€|y}|~~~~~}||{{yzxywywyxzxzxywywywyxxtpmptvwwvwvwvwvyuytzsxswswtvuvvwvxwxwxwwxvyvyvyvxvyuxvxwvwvvvtys{r{t{t{uyvxvxuyuwuwuxt{s~s}s}s{sytxuxtyuzuzuyuzsysysxrzr{r}r~s}s|s|sztysys{q|q|p{q{r|q|r|rzryqyq{o|p|s{t{szr{q{p|r{r{q|qzpzqyryuyxuuqonlqntruyy~~€€€€€€€€€€€€€€€€€€€€}}q|b‚]†\ˆ]‰^Š_Œ^_^Ž]]^``^aŽcja“_“^‘_^bbdŽdcb`‘`‘_“b“a”a”`”^“^’b‘e‘j‘m”{ˆ€€€€€€€€€€€€€€€€€€€€€€€€€€€€~~}}|}}}}~}€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€{vzx||~}}||{|{{yywwtvtwvywyxzxzxxwywxtplosvuvvvwuzu{wzxxxuwtvsusvtvtvuwuvvxxwxvyvxvwwwwuwuxvxvxwxwvxvzu{uzwxwwwvvvuwvxuwtxuyt{s{r|q}q|q{szs{uytxtvswsyszszszszszs{r|r|r|rzsyqyq{p|q{pzrzs{s{r{rzryqyq{p|p|r|sztytysyrzrzrzq{qzp|p{r|t{xsykveshukvmzu}}€€€€€€€€€€€€€€€€€€€€€€~~r€c„^‡]‰^Š_‹^^_aŽ`Ž`_Ž_`‘_‘bcc[‘]’]‘]‘_bcŒdŒdŽa``_‘_“_”`”`”]“]’^‘be‘h‘e–v~‚€€€€€€€€€€€€€€€€€€€€€€€€€€}}|}|}|}}}}€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€xsyw{z|{{z{z{zzwxrunslrmurxuywyxxvxvwtplqsvvvuvvvzv|vzwxwwvwuwuwuwvwvwvvvwvzu{s{syuxvxwxwwwwvwvwwvvvvwtys{s|u|u|u|u{u{uztyuwuwtyszr{r{r{s{tzuytxtxsxszs{t{tztzszq{p|p|p|q{rzryryryryrzrzr|r}q}q|q|r}q}q}q|s|t{tzsyrzrzqypzozp{p}r~r}s|uqwgveukuouqzw~~€€€€€€€€€€€€€€€€€€€€€€rƒe‡`‰_‰_Š_Œ]Ž\_ŽcŽcŽcaŽaba‘a‘d[‘X•Z”Z’[’^_aaa‘`_‘_^^\‘^‘^’\’^’_’a’e’f’f’q|„€€€€€€€€€€€€€€€€€€€€€€€€€€}~}}}}}}}}}€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ywzxzyzxzvzuyuyqymvhsgphpltrwuxvyvxvxupqqxvywvwvwvwxwywxwyxywzvyvyvyvywxwxwwvwtwtwuyuzvzwzvyvywxvtvsuusxrzq|s{s|t{s{s{uztyvxvxuytxsxrxrxtytxtxsxsysyszszsysyszrzr{q|p|p{rzryszszrysysyrzrzp{o|o}p|r|q|p|p{r{s{s|r{r{rzrzpzpzq{q}rq€rryrqqlsortruzz€€€€€€€€€€€€€€€€€€€€€€~€q…dˆaˆ`ˆ_Š^Œ\Ž[Ž]ŽaŒ`Œ`‹`Œ_`Žbbf\“Z–\’[]__``Ž_Ža`abb_^_‘]’_’_“b“c“c“e‘exˆ€€€€€€€€€€€€€€€€€€€€€€€€€€~~}}|}|}}~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€zy{yzwzrylyjwkxkxkwitiolmnoprrusxvxvwtpqoxt{uzwywwxxxyxzyzyyxzwyvyvwvvxwwwwuvvvwtxtytyuyuyvyvxxwwuvutvrxozozpzq|s|t{sztzt{u{u{uztzs{rzr{tztysyryryr{szrzsysyszszu{s|r{qzqyoyp|p}q{ryrwrxryqypzo|o|qzrzqzp{o{p{q|r|r{r{q{q{r|s}q}qp€rs}nxntoqqsstzz€€€€€€€€€€€€€€€€€€€€€€~p„d†_†]ˆ\Š[Œ\Ž\Ž]Œ`‹`Œ``Ž\\aŽcf]•]—_“`aŽbaŽ```ŒbŒ`Žbbb__‘_’_“_”_“`“b”b“b“cs}ƒ€€€€€€€€€€€€€€€€€€€€€€€}~|}|}}}}~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€{z{y{v}n|fzewgviwmxnunpqlulwoxuvxvxvwtplpusztzwxwxxxwzwzxywzvzu{uzuyuxwwxvwuwvvxtxsxtwtxtxuwvwwxwxuytyryqypxrys{t|uzuyuxuztzt{t{t{t|t|t}s}q}r{rzryrysyrysxtxtxt{s}r}p{o{ozpyqzq{q{qzqzr{rzsysxryqzr{r{r}q}p|q{q{r|r{qzpzq{q|r}q~q~p~rt}m{hvjsoqtrzz~~€€€€€€€€€€€€€€€€€€€€€€~oƒc…_‡^ˆ\‰[‹[Œ\Œ]^Ž`ca‘__`a‘b’\—`˜_“]]]\‘]‘]`b`Ž`_Ž^[‘_‘`’`“^”_•`”c”c”b”d‘d“x‰~€€€€€€€€€€€€€€€€€€€€€~~~|}{}|~|~}~~~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€zyzxzu{n{gzdxewgxoytxtttpuowqxuwxvywxusksruzt{vzvzvyuzt{uzuzuzu{u{tztyuywxxwvxuyuytzuzuzuzvyvxwwvwtxtxsyr{rzr{tytyuyuxuzuztytzs{s{s|s{r|p}q|rzrzryqwrvrvsusvrwqzp|p}q}q|p{qzrzq{q|p|p|q|r{tzuzt{s{s|t|s}r}r}r|r}q}q|q{rzr{rzr{r|q}q}q~s|nyjujqnnqqzz~~€€€€€€€€€€€€€€€€€€€€€€~€o…d‰a‹`‹^Œ]Œ]]^Ž_bc‘_“_’_‘bfgc˜c—^‘[YZ]_’_’beb`Ž`Ž_^aec‘a“^•`•b•d”d“e‘b’tŠ~€€€€€€€€€€€€€€€€€€€€€€~~~}|z|z|z||}}~~~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€yxzxzwxtwowmwmxlyqzvzvwturusvtvtwuyvwtopqyv~v~v}v{wzwzu{uzuzt{uzuxuxtxuyvyvxuxtxuxuywzv{v{vzvxvvuututuuwuxuxtytwuutvtvuwuxuxuzt|r|q{ryqwqxrxsytyrzoypxovsuuvtwszr{r|r|rzqyrxryqyrzpzpzqzr{t|t}sr~s}t{tzszs{r|r}q|q|q}p}q~q}q}q}q}r{sxuxpxovoqrmtp{z~€€€€€€€€€€€€€€€€€€€€€€~€s…gŠbŒ`^Œ^]Ž]^_dŽb_‘__bŽiŽif˜d–\YŽZ_ŒaŒbcŽeŽdŽc`__‘`cfŽeb‘^”]–_–d•e”g’e“r~‚€€€€€€€€€€€€€€€€€€€€€€~~}{}z{z|z|{}}~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€yxzy{yzxywyvyvyt{t{w{vyuwtwuxvwuwuxvvsooswxzy{xzwzvyvxvwvxtzszsyswtutxuyvyvyvwvvvvvvvwvxvyvxvwvtvttututvvvvvuvuuuututvsvswtxt{r|q|q{rysysxtysytzszqzqzqysytytxtztyszsysyrysytzszrypyqzrzs|s~qp€pr~s}s{s{s{r|s{rzrzr|q|r|s{r|q}p}tyuwtxpzozqttowr}{€€€€€€€€€€€€€€€€€€€€€€€~wƒlˆf‹aŒ_Œ^]^`_b`]_`bgŽb‘d—e•[ZŒ^‹`ŠbŠ_‹aŒcŒdda`‘a’a“a’b‘c_^’[•]–c”e“g’h’u~ƒ€€€€€€€€€€€€€€€€€€€€€€€~~}~{}{|{}|~}~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€|{|{|{|z{z{z{z{y|x|y|y{yzy{yzyyvxuwuvsqlttxxzvzvyywzvzuyuxtytytwuvuvuxvzvyxxywyuwuvvuwuyvyvvvsvsuttvswswuwvxvwwvvuuvtvswtxtxtzs{r|q}q|s{szs{s|r|r{rysysyrzryrxryrzr{rzrzrzszs{szszrzq|p}p}q}p~p~pqp~p}q|r|r}r{q{qzqzrytwuwuxt|r}uzvyryowowqsuqxu}|€€€€€€€€€€€€€€€€€€€€€€€€~~x~m„f‰b^]Ž^_``‘`’^“\“_’`’b’f_‘f’d\ZŒ[‹]Š_‹`Œcefeda‘b“b”a”`“b`‘`’_“^•`•e”g‘lŽwŠ~‚€€€€€€€€€€€€€€€€€€€€€€€€}~|}|}|~}~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€}|}|}|}|}|}||{|{|{|{|{}|}}~}|{ywxuwuwstlvuyyxwxxwywzvzvyuyuyvxvwvwvwuwuwvvvwxxxwwxuxtyuzvywxwvuwtxtyuyuwvwvwuwuwtwtxsysysztztysyq{q{q{sxtwsxsyryrxswswqxqypxpxqxryrzs{s{r{q|q{qzqypyo|o~oq~r}r{q|q~p}p}r|t|s}q|p|p{ozoxqwswtyt{s|tywvrtlskuossryv~}€€€€€€€€€€€€€€€€€€€€€€y~n‚d‰`]]\Ž\\]]\[‘[aŽfŽfhŒ`fŽb‹]Œ[]Ž`dfŽefŽgŽd`‘_’_“_“_“_`Ž`a_‘^”^–c”d’nŒ{…‚€€€€€€€€€€€€€€€€€€€€€€€€~|}{}|}|}}~}€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€|{|{|{}|~}}|}||z{z|{|z||}}~}}|zxyvxvwtsovxz{xxwwuxvyvyvywyvywxvxvxvxuytxswtwvvvwvyuztzuzv{v{v{v{v|u{uzvxvwuxuytxuxuwuyuzt|tztysyqzrzsxuvvvuwuxtwuvuvsvqxqyqzrzszsyszszszrzq{o|p{p|q|p}q}q~s}t|t{r{q|q|r|t|t|r|p|o|p|p{p{q{q|s}t}t}uzxusrmrlsntqsyx~~{~n‚c‰_^\[ŽZ[Ž\\\[[Ž^Œb‹gŒhia’f‘`\\`ŽcŽddceŒfd`‘]“Z”\“\’^___‘_“`”b“d’b’lyˆ~ƒ~|}{}|}|}|~|~~|{|{|{}}~~}||{|z{z{z{z|z||}|}{{yywxwwtpnqvyyxyxywxxxwxwxxwwxxxwzvywxvxtyszszuxvwvxuyuyuyuzuzv{xzw{wzuyuyuyuzu{u{uzvxwwvxuxuyt{r|q}q}szuxwwxwxwwvvvuvsxrzq{q|sztzsys{p|p{p|r|r|t~r~r~p}q{r{s{s{r{p{p{p|q|q{q|q{p|p|p{p|q|r|r}s}t|uzwxwzsyouqqsrvu|{~|~p€f‡a``‘]\Œ[Œ\]’]“]‘]]Ž_cfhkc’fa\Ž\]Ž^ŽabŽabŽcb‘^“[”\’^‘`cŽbb‘b“c”d”d“e’`’ioŽ|…€}~{}{}{|z}{}|~~|{|{|{}|~}~}|{{z{z{z{z{z|{}|}{{yywxvwtomnuvxwyxzvyvxvzv{vzwzwyvywxwvvvswsxtyuxvxvxuxvxvxvxvyvzvzvyuxtwtxszs{u{uzuytxtxuxtxt{s}m}g~c{hwmvpnwh}i|pxwuzs{r|qq~s|s{szr|o~n~oqrs~q}o|n}n{p{qzqzp{o|o}o~o~o}o|p{q{qzqxrxryr{r{s{s{sysytzrwqrsptpwu}|€€€€€€€€€€€€€€€€€}se„_‰]Œ]^^Œ]‹\Œ\\\]]^`ŽeŽec‘c’d“gb^Ž\Ž_^cdcdd‘da‘[’^adeed’c“c”e”e”e”a“ji’wŠ€€€€€€€€€€€€€€€€€€€€€€€~~{|y|z{z{z}{~}€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€}}}{|{|{}|}|{{{z{z{z{{|{}|}}|{zxywywxtponxt|u{uyuwvwwxxzxzwywywxwxuwtwsytyuxvwvywzuzuywxuxuyu{t{uzuyuyuxtytytytwtvtwtyu|s}q~k~fzfvgtirnqtk{dƒ^‡\‚hzuuzs|s~s}t|s{r{p{o}p~qrs}s{qzpynzn{n{nzozp{p|o}p}p~p~q~q}r|s{szqzrzp{p{p{q{sytztzqvnsntoqut{{€€€€€€€€€€€€€€€xj‚`†[ŠY[Œ]Œ^‹]Œ\Œ\Œ\^Ž^^Ž_Ž_Žaa’^“`—h–c‘_]^__cŽaŽaccgd’[—[•_‘accb‘`’a“d“e“d“a’ikxŠ~„€€€€€€€€€€€€€€€€€€€€€€€~}{|z|z{y{x{z}|~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€}||{{{{{|{|{{z{z{z{{||}}~~~}{zzxywxwxtoopxu}v|vzvxxxxyyzxyvxvwvwwxvxvyuyuyuyvxvyw{v{v{vzuxtxtyszt|u|v{vzvyvzuysyszszs{qjƒ`„c}ltoonpopsoxo|mi…b†_€lwvv{u}t~t~s~r}q{q{q}q}r}s|syqxqxpyp{p|o}o|pzryryr{q|q|r}s}t|t{s{p|p|o{nzozozrzs{synwmvnsrnwq|{€€€€€€€€€€€€€€zmƒb‡\‹ZZ\]_Œ^Œ]Œ^Ž]]‘]‘^^^_a’f“m”l”c‘__ac‘bb\Ž[Ž^aŽfb“Y—Y•^“`‘ccb_ad‘fb‘bfj‘s’{ˆ€€€€€€€€€€€€€€€€€€€€€€€~~{}z|z{y{x{z||~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€{y{y{y{y{z{yzyzx{y{z||}}}}}|{yywywxwxupnswvzwywxwwwxwywyvxuvuuuvuxuxvxuxuxtxuxtys{rztyuyuxuwuxtytzuzuzuzu{vzvyuxuzt}u}mdg{ostprqqssrvtzt|s~s€q€m}jxrx{w~t~t~s}s}t{tzuytytysyszrzqzrzrzr|q}q|p{q|r~r~r}r{r{r{s{szr{q|p}p}o{p{p|r|ryrtlqkqmpsnzs~|€€€€€€€€€€€€€€|€o„dˆ_‹\Ž[Ž\^^_]Œ\Œ]]Ž\\‘^‘a‘b‘e’jqŒtŠkŽdŽacŒfŒfŒecŽ_Ž]Ž`bfe‘[”[“^“_’a“`“`’_’a‘deb‘b‘e’g“f™v‘~„€€€€€€€€€€€€€€€€€€€€€€}||{|y|z{y{z}|€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ywxvxwywywywywzxzxzxzy{z{y{yzxywywywxtqktsxwwvwwuwvxvwwwwuxuvuuuuwtwuwuxvxuxuxtyt{s{syuxvxvxvxuyuwuxuyu{t{vzvxuxuzt}q}jxnpsmulvotsttttwtytzu{v|w|vxqvqwxu|s|s|s{t{t|u|t{szsyszt{s}r|rzryrzr{p{p{p{q|r|s|s{szszrzq{q{q|r|r|r{s{t{uwxuuqpplqnqsozu~}€€€€€€€€€€€€€€~t†g‹b`Ž`Ž^]^‘^Ž]Œ]‹\Š[‹\Œ]^Ž`c’h’ntˆx„r…gŠbŒ`aŒdŠd‰e‰e‹dŽ`a‘a‘c‘d‘Y“[‘^‘`‘`‘_’`‘a‘bedcfg‘g“j•w|ˆ€€€€€€€€€€€€€€€€€€€€€~~}{}{}{|{|{}|~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€wswrwswtwtxuxvywywyxzxzxywywywxwxvywwtoirruwvxvyuxuwuwvwvwxxxxwwvxtwuxuyvyvxvyuzt{t{uzvxwxvwwwwwvwvxvyv{t|tztzu|v~t~nysrwqypyoxnwowpwpyrztzw{x{z|zzwwoxrwytzszrzs{r~r~q}q{rzr{s|r}q~q|q{qzqzpzpzoypyqyr{r{rzrxrxqzr{r|s|s{s{rzsztuwtrsnsmqqpuo{v~€€€€€€€€€€€€€|€nˆdŒbŽ`a__’_’^]Œ^‰_‰_‹^Œ]Ž_Žch‘nu‰z…uƒi‡a‹]\\Ž]‹`‰c‰e‹dŽca’_‘a]‘T“X’\’`‘`‘^^abdcaŽcffjj’zˆ€€€€€€€€€€€€€€€€€€€€€€}~|~}~}}|}}~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€vpwoxpwrvsvswuxvwvwvywywxvxvxvxvxuwuvrllmvsyuzuztzszuyuxvxwyxyxzwyvxtyuxvxuxtys{s|u{uyuxuxuwuwuwuwvxuxuzu{tztzv|tn{suxu{v{u{t{t{qzoypzs{v{y|z}|}}}{yuvswxuztzrzr|p~p~q|r|r|r}r~rqqop}qzqzpzn{n{o|o}o}p{rzsxsyszr|r|r{r{q{s{twuunvjtlrrpvr|z€€€€€€€€~€v„gŒ`_]]]]‘^^Ž]]‹^Š_Š`‹aŽd‘io‰uƒ{€x‚m†cˆ]Š\‹[ZŽY\Œ`‹aŒba‘`“^’b[‘V’X‘]‘]‘^‘[\Ž^Ž`bbaŽacŽcgŽh‘w‰~‚€€€€€€€€€€€€€€€€€€€€€€€~}~}~}~}~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€wmxnypzqyqxqwrvquqvqvrvrvruqvrwsxsxptkklmxwyxxwwuvuvuxuyvyvywywzvyuxtwvvvvvvuwtxtyvyuyuytxtwtvtvuvuvvwvxuztzu{q{qwuszu{y|z|y|y|z|uzmxmyqzv|y|{~}~|zvruwuxsyrzr{q|q|q{r|r|rrqq~qpp}p{pzp{p}p}q~q~p}q|r{szszrzr{rzr{s{q~p~tytvnwkwkwqswt|{€€€€~~~}}}xo…e`^]Ž\Ž[[[Ž]\Œ\Š]‰_‰a‹dŽgn‹uƒz~w€l…b‰_‹\Œ\Œ[ŒZŒYŒ\Œ_Š_‹`Œba’a’e]’W“Z“^“]“^“]’]‘^]‘a‘a‘bcbŽadlŽ{ˆ~ƒ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€vqytzw{v{rynwitgtgshtithrgrgrhuhzd_‚[{`zqywwxwwwuvwvxuzuzvyvyuyuytxuvvuwvwvuwuvuuuvuxtysxswtvuvvvvuvutwszu}uxppuq{v|z}|}}~}}}|yzrwnvowryv{y}|~}|vqtusvryq|q|q|r{rzr{q|q~pppp~q~p{pzpypypzq{q{rzrzqzq{q|p}p}p}q|r|r~qn€p{qwmvlwlvrqxu}|€€€~|yxvxqjŠeŽaaŽaŒ`Œ^Ž]\‘\‘]^Ž_ŒaŠbŒeŒhŒm‹s„wsj…aŠ[\\\\Ž[[Œ`‹b‹_bd‘c’d‘hŽ_‘X•Z–_”`”b•a•b“b‘`‘c‘c‘cdŽbad‘k‘z‹}…€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€xq{y~}}|{uymxiwisjqmpmompkpirixi}efj}rzwwyvwvwwwwxvxvyvxvxvxvyuzuzwywywywxuwuvvwvyvytyswsxsxuxuwtvtvsxt|tzsnwp{y}|}}~~~}zzrxkulsntqyw{z}|€€~}xutyq{pzq|q}r|r{qyqypzo}p}q~q}p}q}qzqxqxpzo{p{pzpzp{o|o|o}m~n~n}o|p}q}q~o€p}myjvluorsoyu~}€€€~z~rk„eŠbŽbbbŽbŽ`_\^^_``ŽaŽcŽg‹l‰qˆr…p„i†aŠ]\\]‘^‘_’_‘aŽdŒeŒdc‘d’d’cgŽ^’Y•[•`“a“b•b”e“e’e‘edbŽa`afl‘y|‡€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€yn|z}yynxmvsrtpuqsprrrrqtqwrxsyvyuyyx|v}v|vzvywxwvwvxuwvvwvyv{w{wzwywyvxtwtvuwvzu{tztxsxsxuxuwtwuyvzyyuouo{y~}~~}{xynxjxotmspyw|{}}€€€€~yyt{q{p{q{q{q|q|p{pzp{q|q|r|qzq{p{pzryqyq{o}o|p|p{p|p}p|q}p}n}n}n|p{qzq{o~r}mziykxqttr{y~~€~}~xo‡g‹c‹aŒcŽcb`^Ž_`‹`Š`‹`Œ`Žbeh‹n‡q…lˆhŠdŒ_\Ž\]\]^_’`’a‘aaaab`_cZ“W”Y”^’_’`’c‘d‘d’d’d‘bcb‘a’c‘g‘n‘z|†€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€xq|{}zxnwnuusttttqtpuqsqtrutvuwvyvxwwyw{w{w{v{v{vxwwxvwwvxvyvzw{vzv{uyvyuwwuvuvxtzrzryrxsxuwtvtwvxyy{swpzx}}€~}zztuoyszwsqsqyw||}}€€€€zzsyu|r}p}q}q|r}r|r{rzrzrzr{rzrzqzrzrzszr|q}p}p}q|r{rzszszs|q}p}n~n}o|q|q~s|o|j|j|pyvy||~~~|}x~r†kŒfdbŽbb’`’__aŒbc‹c‹b‹dŒgŒl‰q„sƒo†eŒ_Ž[ZYZŽ[Ž\Ž_`_Ž_Ž\\‘[’Z’_`a`ŽcŽY’W’Z‘\‘__``_‘a’`’`‘bba‘c‘fn{ˆ}ƒ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€|x}}€€~~~zzm{hylxmwputtvrvpssqsrttuvvvuxuzt|v{wywxvyuxuvwuwwvxuyvzwzvzv{vzvzvyvwvwwwvvuwuxsysxtwtwtxuxys}q|x}}~~~€€€€~~}|{vzmwqxyxzrsrrzx||~~~~€€€€~~zypxv|u~sr~q}r}r|q{q{qzq{r{q{r{q{s{rzrzp{p|p|q{q{qzqzrzs{s|r}p}n}o}p|r|s{s|o}ll€q~w||}{~v~ql…hŠf‹eŒdŒbbba‘babŽbcdŽeiŠn‡sƒs€mg…a‹^Œ\Œ\[\[]_`_Œ^‹\ŒZ[‘[’_bŽdeg\‘Z_Ž_```bŽbcb‘`‘babeiŽp‹|…~‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~|~~€€~~~z|n}h|jymvotstustrssqqrrusvsusvsyt{u}v|wywyvxvxwxvxuytxuxwwvyuzv|u|uztxtwvwuwvxtyszpyqyrwuwyt}i|s}}~~€€€~~{ytrvqwxw{wysntq{z}}~~~~€€€€~~|zuvx{w|u{t{r{q{q|o}p}p}q|r{p|p|q{rzryqyo{n|o{p{p{q{p{q{q{q}p~p}p|p|q|q|q|q}n}l}nzrzx|y~sƒm‡i‰fŠe‹eŒeeŒcŒcŽdccbcdŽegŒk‰p…t‚qƒj…d‡`ˆ]‹_Œ`ŒaaŽ_]Ž[]Œ^Œ_Œ^Œ^^Ž\^‘_‘aegŽh][__’^‘`‘`acccb‘d‘d’d’gloŒy‡~€€€€€€€€€€€€€€€€€€€€~~~~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~{}pk~l|nxnvouquoupsqsrrvswrxrwtxwxwyxyxxywyxyzxzvzuzuxvwxvvvuxuzu{uzuxswuxuyuzs{s{rzrzsywy{o|p}z~}|yyo{p~tzvvxtxhyp|{~~}{wwx{w|tzszrxrwqyqzp{p|q{rzr{q{pzpypxpyp|o~n~o}p{pzp{p{q{r|r}q}p}q|q{q{q{q|o|nyouswv{s€m…kˆh‰fŒdŽddddd‘feŽeŽeŒfŒfŒgŠl‡s‚w€qƒi†bˆ]Š]‹]Œ`Ž_Ž_`^^Ž]Œ]‹^‹aŠa‹aŒaŽ]^_‘^‘eŽiŒe‹\Z^‘_’`bŽaab`]\‘_’c’a“e‘kŽm’x‰€}|~~|~p€i€hizlvmvlvluntqsstuvwtxswuxwxxwywxvywzxzyxywyvywwwtxsxtvvvyuzvyvxvwvywzv{vzuyuxvxxz|xzq|x~~~|{txuzt{txvsxqyjzq}{~~||syv|v{t{r{qzqyrxsxsxsxryrzrzqypyoyoyozp|p}p}p|qzqyqzq{r{r{r}q~p~q}p}p|q{rzq{r|qxvzu}qƒm†k‡j‡h‹ee‘eŽfffgŒhŒhŠiˆjˆjˆl†q‚u‚p†g‰b‰]‰\‹[ZŽ\]^\[Ž\Œ^‹_Š`ŠaŠ_Š^‹_Œ_Ž_`‘]cŽjŠa‹]‹\^^‘`Že‹e‹ec_[\_a‘`‘dl‹yˆ}ƒyv||€~}{r|l}j{ixiviwhwivmtqsvsxtxtyszu|v}xzwwwvxvyvxvwvvxvxuwtvvuwuwwvyuyvywwxwwxwytyuyuxuyxz{yn~v~~€€€€€€€}|xys|s{szsxuvxsvkxt}|€€€€€€€€||mzp|s{r{q}p|q{rzqzqyqyrys|r|q|q{pypyqyqypzp{q{rzrzr{q|q}q}r|r}q|q}p}r~s|t{o~m€o}u|sp„mˆl‰k‡j‡jˆjˆiˆi‡jˆj‰j‹lŠnˆp…p„r‚tsm†e‹`Œ]Œ]‹\‹\Œ[Ž\]\Ž\ŒZŒZŒ]Œ\Œ^‹\Š[‰^‰]Œ]Ž]‘[“\’]`Ž^^Ž]]‘^‘begŒfŒca^Ž^cŽdbfl‰|„€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€{t}{€~|ysxmylxjwhuhtksmrprrustvuxu{u}u~v|wxwvwvwuxuwvwvvwuwtvswtwuyvzvzvywywywzvzuyuyuzuzv{x|}sp~z€€€€€€€€~|xxxtwxr{q{rztyvwqoxw}}€€€€€€€€||k{o|q}p}o}o{pzp{o|n}o|p{r|r{r{q{pyqxryqzq|q|r{s|r}q~o~o}p|q{q{q|q}p}r|u{t{p|l|r|t|p€m„mˆm‰lˆk…l…n‡mˆnˆo†o„p†s…v…wƒxƒwƒtƒk…dˆ_‹]]]Œ]Œ_Œ]Ž_^\Ž[ZŒX[ŽZ[ŽZŒ\‹^Š\ŒZX‘X’Z’Z‘\‘_’^‘^‘]]bŽdŽgŽgfeŽcdŽfedgŽlˆz‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~y~}€~|zryk{hzgxfuhrlqorqspvqwrxtxww{v|vzuuvtwvwvwvxwxwxwvvvwtxuyuzuyvzuyvzv{u|t{syuxuwuwvxzs€h~t~€€€€€€€€~{{n{q|s|r}q}r}s|vyrsyx~}€€€€€€€€{|o|s}r|q{p{qyqyqzo|o}o}o{rzryryryqypzp|p~q}r|szr{r{p|o}o}o|p{p{o{o|p|q|r{qzpvpsvxv~qƒo„p…q‡rˆt†t„t„s†u…wƒwx€{€|€}}u…jŠc‹_‹]‹\^Ž_]^Ž\\]]Ž[Œ[Œ[][[Z\‹\Š\‹\[[Z_ca][Z[`Žcgf‘f‘dbbŒcŽc‘c‘gkŠx„€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€}~€€~|{o|ge|fzgwhvjvkvlulvlxkykyqwxwzwxvsvswtxuwvwxwxwxwwwvuxuyuysyszs{r|t{szsysxsvtvuuuszn{s~|€€€€€€€€~~r}rztytzs}s~r~s}wvvr|z~€€€€€€€€{|r}t}s|r|rzrypxqyqzq{qzqzq{q{qyqxpzp|poo|pyqwrwqyq{p}p}p}p|p{o{o{p|o}n}k{nvpsvyvsƒtƒu‚w‚x‚z‚{€{~{~{}€}}~~€x…n‹fŽ`Ž][[Œ^‹_‹^‹][\]Œ^‹_‹`Œ_Œ]Œ\Š]‰\‰^ˆ^ˆ^‰^Œ]]’f‘jŒgŠ`Œ[ŽY[]`ded‘e’b‘`^`‘a’b’hŒe‹v…€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~~}{|q|g|dzewexhvivhufrfrewb~^e{qwvuvtuvtvuwuxvvyv{u|tzuxvxwxvxuytzs{tzuyuxtvtuutuuvvxuzj{u~~€€€€€€€€€€z}su|tytxtzt|s|r|ryrv{{€€€€€€€€w{r|t|s|r}p|qzqzq{r|r{qzq{p}o~o}p{o|p~p€pq}qzryryr{q{q|q}q|p{qyqxpzo~mm€p{pwnrsxt~tv‚wxy{€~€~~~~x†o‹gŽb`^]]_‹^Š\Š\Œ\Œ]]Œ]Œ^Œ^Ž]ŽZZŠ]ˆ^‡`ˆa‰`Œ[_‘kŽq‡mˆeŽ]Y‘Y‘]‘`cdd‘c’e‘cb_‘`‘_“`’gŽe‘x‡€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~}~~~~~}|zzvxrwowmvjwivjvjuisgsfudy_~]~c{mxsvuvtvtvuxvxwxyvzuytxuwvxwxwywywyvxvvuvtwuvuwtwvwzv{v}|€€€€€€€€~~r{t}u|tzuyuyvzu{uzrutu||€€€€€€€€€€u|oqr~r}q}q|q}q}r~q}p|n{o|o|p}q}q}q|q|r}q|r{r{r{q|p{p|p}q}q|rzqzq|pp‚rt~p{lxs{vuvxy€z€|~€~~}{~tƒkŠeb````‘`^^Œ]‹^^Ž^Ž^_Œ_^Ž]\ŽZŒ\‹\‹]Œ]]‘e“sx…t…lŽd“]’Y‘Z^_‘a‘c’d’c’c‘_‘^’\’a_a‘io•{ˆ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€}}}}}||{|{{zzwxuwswrwrwtwtvrtmvhvdubsdsfupwwvwtvutwtytzvxxvzvxuvuvuzv{w{vzwxvxvwuvtxtytztzuzzr}y~€€€€€€€€€€~y{rxuwuyt{u|u{u{v{wvunwt}}€€€€€€€€~~vxr{sr}r|r{r|r|r}r}q~p}o{p{pzpzqzqzr{r{rzszszs{r{q|p{q{p}q~p~p}p|p~p€r‚tq€n€ks~v€uuwy{€}~~~}||v~n„h‰c‹b`__`__]]Ž_^\^Œ^Œ`‹`Œ___Ž_Ž_X‘X’`”pxˆ|ƒ{ƒrŠi‘d“a‘_^Œ`_‘]’a’a‘cb^‘]“]“a’b‘dlŽv‘{‡€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€}||{|{|{|{{zzwyrxnwmwowsxtvqviy`{^xaqgnnnyt}t{syuuxryryuvwuxvwvvvvvxvywyvzvyuyuxuvtwsxtxvyyx{v~|€€€€€€€€€~~s{szsxsyszs|s|tyvuymyhzu~~€€€€€€~|tut|ut}s}s|q|r}r}r}r}q|pzpzpzpzp{q{r{s{s{s{r{q}p~p~q}q|q}p|o{o{p{p|q€q‚s€q~p|pyvzx|vvxƒz‚|~€~~}{}v~n„g‰dcŽbba`^Ž^Œ^Œ^]Ž[\‹\Š[‹[Š\Š^‹_Œ^^Ž^_‘^’]•i”v‹~‚~€}€yƒn‹gb‘`aŒa‹a‹__ŽdŽdŽdcaŽ_c‘c‘b‘c‘jv{†€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€|{{z|{{z{z{zzvznyiwhwkwmymyiydy`z_{_ucnjmvs{s{rytuvtxuyvwwwwvwuxuxvwwuwuvwvxuxuvttttttuuxv|p~x~€€€€€€€€€€~x{t|t{ryryszs{r|s{uxwlwj{x€€€€€€€}|pyqrq~q~r}q}q}r}s|s{qzpxpwpxpyqzq{s{s|r|q}o~o~n}o|p|q{q|p}o}p|r{s{u}u€tq~r{tyz{|}z{€}~€~~z}t€m„g‰b‹``Žaaa_‘_^_Œ`Œ_Œ^Œ[‹]‰\‰]‰\ˆ^‡`‰`‹^ŽZV’W“b“r|„€€|‚u‡kŽc‘`‘^`a‹`Š_cŽfca`b_‘a’a‘_‘`‘gq”z‡€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€zy{z{z{z{z{yzuznxiwhwhwfyeyazaxbybybugolnvtzszryrwutytzuzvywwyuzuyuvvtwtvvvvvwvvvuuuuvuxwywv||€€€€€€€€€~~q{t|t}s|s{s{r{r|q}rq{pw{|€€€€€€€€~{|k|o~q}s{r{s{r{s{t|s|r|p|o{p{p{q{r{s{tzs{r|q~p~p|qyrxsxrxqzq|q}r~s~t{wyw{v}s|r{tz{}~}~€~}~x€p„hˆcŠ`‹^‹^^``‘_‘_‘_‘`ŽaŒ_]\Œ]Š_‰`‰`Š]Š\Š_Š^‹^Ž[\“kx‡~€€€€~y„pŠha]\Ž_Œa‹`aŽfh’d“`“`‘`_‘`‘`_`fŒk{…€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€zyzyzy{y{z{zzvymwivhujvkvhwa|aydxfwhtkqnrvuyuyszrzuwyt{s{tzvxxvyuytwvuwtxuyvxwwwwwvwuvvwxt|y~~€€€€€€€€€€~~~wzwytzs{s{s{rzr{q~r‚qq}{}€€€€€€€€~~yzg}p}vzvxuyszr{s|s{r{q{p|p~q~q}r}s}s}s|s{r|r|q|q{ryrzrzr|q|r}r~rrr}syu|v{szpzpyy{~~~}}z|tm…hŠdaŒ^‹^Œ^Ž^‘]‘]‘^’_‘_`Ž^]\‹\‰^ˆ_‰b‹bŒ`Œ]‹\‹ZZb“q|„€€€€€€€€|„t‹kd_\]_^[‘^ef’c”^•`“a’a’`“b‘abiˆm‡|‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€zyzxyxzx{z{zzwynxivivnwtxsyj{exgwkvnvqsmutvxuwtxtvwsypzp{sysxuvuuvtvvvwuxuxvwxvyvxvxvwvwyl}y€€€€€€€€€~s~szuxtyr{r|q{rzszu|w}vxww}}€€€€€€€€~wzg|o~t{uzu{s{r}q}r}r}q}p}q}r|r|r}q}q}r|s{rzrzqzp{q{p|o}p}p}q}r}r~r~r}t{s~u|rxovpsuu||~{}ung„dˆcŒbcŽbbŒa_]]^’_’^‘^^^\‹]Š]Š^‹`Œa‹`‹^Š]Œ`nxˆ~€€€€€€}€y…p‹iŒd‹aŠa‹ba]‘X’Zaba“]”`“b’d‘c‘cbdŽm‹tŠ|ƒ€€~~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ywxvxvzxzyzyzxzrxnwovrxwzyzvysyuywzyzxurtuvxvwvvvrxozl{m|qztyuwtvuvuvvvvwvvvtysztyvxwwyvyv}}€€€€€€€€€€~t~v{v{t{s}r~q}q|uzxy{v{m{v~~€€€€€€€€€€~}uxnzp€p€q}t|t{s{r|r{s{r{r|r|s|s|r{q{qzryrxrxqzq{p{q|p|p|p{pzqzq{r|q}q}r}r~q|nymvnrrsyy|}y€s‚i‡dˆa‡aˆaŠbcŽc‹cŠd‰bŠ`Œ_Ž^__```‹_‰`‰_‹_‹`Š_Š]‹\gŽt‰}‚€€€€€€€€}y‚rŠidbŠb‰c‰c‹a\[`ŽdŽgŽe‘`“`“adŽeŽdŽcfŽm‹z‡}~~~~~~~~~~~~}~~~~~~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€vqupuqxvyxyxzyyvxswuxwzx{z{z{z|{}||||zvqvtxyxxyvzqzkyjxnxsxvxvwuwtwuvwwywyuyuzu{u{vyyv|m}v~~€€€€€€€€€€~v}r|w{vzuztzr{r|t}v|yzzvyo|y€€€€€€€€~|stqys~s}s|s|s|q|q|r}t|r|r|r}r|r{rzqzryrzr{q|p|q|r|s|r}q}p}p|qzqzrzr{q|p}tzrxmunspqtuwzt€m…h‡eˆeˆdˆdŠbabbŽcŠeˆeˆc‰bŒ__`Ž``‹_‰^‰`Š`ŒaŒ_‹]Š]Šl‰z„€€€€€€€€€~|y€s…k‹fŽba‹`Ša‰bŠ_ŒZŽ]ŽdŒeec‘^“\”\’addŽdfmŠ{…~€~~~~~~~~~~}~}~}~}}{}|~~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€smriskuqwtxvyxyuwrwsyx{z|{{{|{}}~}~}|{wqxryxywyvypxkwhvhxjznytxvwwvwvwwxxyxzyzw{v{vzyw{m|x~}q|vzvyvxuxtxsys|t}u}w}xxxt}{~~~~~~}|ruozs|s{s{r|q}o~p~r}s}r}q}p}p|p{q{rzszs{r|q}n|p}r}r~s~r~p~o}q{qzryqyq{q}s|r{oyputtwys€lˆgddŒeŠf‹fee‘efgŒgŠh‹gŠfŠcŠa‹`Œ`_Œ_‹_‹^Œ``^‘bpˆ|‚~~||y~t‚mŠfŽdŽccŒ`‹]‹_]ŽZ‘\‘b‘a’a’a‘`[‘Z_bdcfŽlŒz†}€~~~~~~~~~~~}~}~}~}~}~}~}}}}||{|y|{}}}~}€}€|}}~}~~~~~~~~~~rksgtitltnuqxuysxowryw{z||||}|}}}}~}}{ttsvwyvzuzvxuuuoujuhzjzqyvwwvwvwxwxwywzwxyxzw{xxzv}}~}|u{wzu{t{t{s|t|s|s|t|w{ytzu~}~~~~~}|{qxm|q|szsyszr|p~o~p~q|q|q|p}p}p{q{s{s{rzp{p|o}p}p}p~q~p~o}n}o}o{oznzn{o}p~l€k~lyuzun‹i‘g’f“f’f’f’f’f‘ghŽiŽiŽiŽhgfŒf‹e‹d‹cŒaŒ`‹^‹^\^“f‘uˆ~~~{}xu…nŒgbŽbccŽ`]]‘]‘^“]’_’^“]’_‘`Ž]]Ž`Žddc‘e‘kŽz…}}}~~~~~}~}~}}}}}}}~}~}~}}|}z{y{z||}}}~}|€{|{||~}}~~~~~~slshuguisktlvpwowmxqyx{z|{}|}}}}}}}}|{vutxuztztxvxxxwvssprtrxvxwwwwxwxwywxvxwxvxvywzyu|y~€€€€€€€€€€~}syrzuzs|s|r}r}s|s|t{u{w|ys|w~€€€€€€€€}|znwn{s{szsysxsyq{o}p}p|qzqzqzr{q{r{r|q}o|o}p}p}p}p}o}p|p|p|p}o}o|o{oznzn}m€jjp|wq‡khg‘g’i“h”h’hhŒj‹jŒkjifddŒgŠh‰hŠh‹geŒc‹bgŽq‹z…€€€€€€€€€€€|€x€t„oˆicŽ__Ž``‘b‘b‘`’_‘a``_‘]’]‘^^Ž`Žbedc‘fjŠvƒ}~}}~~~}~}~}~}}}}|}|}|}{{z{{|}}}}}|}|}{zzz€z{~{}}}}}~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€rksgvixjvhthukulukvpxw{z||}|}}}}~}}}||wutwuytxtvvvywxxuvtptnvtwxvxwyxyw{wzuyuxtxtxxx{p}y€€€€€€€€~~t}vzvxuyt{s|r|s{s|t{v{wzwt{y€€€€€€€€€€~}{znzr|t{s|s{rzqzp{p|q|q|q{rzq{r{r{q|q|q|p{p|p}p|p|o|o}o}p{p{p|p|p|q|r}q~omol}t}w‚mŠfe‘f’i“k”k’jjˆj†l‡mˆm‰lˆjŠh‹ggŒiŠjˆk‰lŠmŠnˆp†v…z‚~€€€€€€€€€€€€€€|x…rŠmjŽd`]^_`‘a‘`a‘abac_‘[“Y’\Z]`Žcdcfk‡v}}~~~~}~}~~}}}}||||{{z{y||}}}}}}|}|}{}{}z}z}z}{|{|{}|}}~~~~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€shuewjumrjsiuhvititlvryx{{~}~}~~~~~|{vuqxuzuxtwvwwxvxsvsprkrnvuvwvxwxwywyvwvwvxwxyw}w~}€€€€€€€€€€{{t|uzwyvzv{t{s{szt{uzwyztzr~{€€€€€€€€~}|wxi}o€qr}r}r}p|p|p|q|q|q}r}r|rzrzr{q{r}q}p|q|p{p{p{p|p}p}q|p{p{p|q}q~p€m‚nuzqxw{w€m‡gŽgikoŒn‰l†j…k…m‡n‡n…m…m…m‡lŠlˆm‡m†o†r†uƒz}€€€€€€€€€€€€€€€€€}wƒq‰mŽhfbŽ_^_aŽcŽbŽ`Ž`ŽaŽcbŽd`\’\‘]‘Z‘]‘_abŽbŽeg‰u‚~~~~~~~~~~~~~~}|||{|{{y||~~~~~~}~}}|~{~{}{}z|{{{|{|{||}}}}}}~~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ukufsiqnsqvpwkwkviujunwszy||~}~}~}~~||txrzuzvxuwuxvysypwotpnqnwswuvwvxvxvwwwvyv{w}yy~{~€€€€€€€€€€~u{ryvxwyv{u|s|r|s|t}w|xxyqzu~}€€€€€€€€~}|szfl€n~o|p{qzq{q{q|q}q~p€qqq|q|q|q}q}q}p|q|q|q|q|q{t{s{s{q{p{p|o~o}o~o~np~m}vx„mŠijlŒn†p„oƒpƒm‡lˆm‰nŠqˆr‡q‡r‡q†q„qƒrƒwƒ{}~€€€€€€€€€€€€€€€€€~xo‡jŒhŒf‹bŒ_Œ]]^`bcbcŒbŒcŒ`Ž^‘_’^’`‘]‘\‘`‘`‘baadcŽp…~~~~~~~~~~~~~~~}}|||{}|~}~~~~~~|~|~||{~{}{}{}z|z{{{{||~}~~~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€wqvmwoyv|z{xztxqvntntpuryvzy{z{z|{}}}|syq{uzvyvwvwwxuxsvpqsotqyvxwwyvzuyvxvwvxuyv{yt}z€€€€€€€€€~~qs{vyvzu{t{s{r{szt{v|v}uxxy~~€€€€€€€€€€~}|rym|o}o|p|q|r{szsysyr|q~p€qq~q|q}q~p}p|q|r|s|s}r~q~o}q|q{q|q|q}q}p}p|q|s{s~o€it€z‚o‰iŽijkŒkŠjˆk‡k‰lŠo‰s‡v„x„w„w…v…x‚z}€~€€€€€€€€€€€€€€€€€€€{~q„h‹ecŒa‰^Š]Œ\Œ^_Œ`ŒaŒabŽb`Ž`Ž^[’`’`‘]‘[ZŽ^Ž`edehŽgŒp„~~~~~~~~~~~~~~}|}{~}~~~~}~~~}~}|€}€{{~{~{~y|yzzz{|}~}}~~~~~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€wsxqzt|{~~}{{xzuvtututvryszvyvyuzx{{|zrwo{t|u|uywxwxuxssqmtluowtxxwzvztytxtwuxuwwwxr}|€€€€€€€€}tt{uxuyuztzsysysytyvzwxvt{z€€€€€€€€€€~|zquqzr}q}q}q}q}s{rxrxrzr{r}s}r{r{q{r|r{sztztzs{s{q|p|o|o{p{r}r}q}q}p}q|r}s~u~qk€r~}~vnˆkŽjjŽiŒiˆj‡k‰oŠs‡vƒxz€|€}€~€~€€€€€€€€€€€€€€€€€€€€€€€€|~t~j†eb“a‘^Ž]Œ^‹_‹`ŒabcdcŽbŽbŽ_^‘]‘`bZYWŽYŽ^Ždee‘ihq‰~~~~~~~~~~~~~~~~~}{}|~~~~~~~}|}|~|~{~{~{}{{{z{{}~~}|}}}~~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€toumwrzy|{{zzwxuxtxvxvwswrysytyuywzz{yqvn{t}u{uzwyvyuyrurmskvmwrxxwzu{tzsxswsxuzwv{x~~€€€€€€€€€€~ts}vytxsytytysztzszs{uzxqyr}|€€€€€€€€€~}zzlzo|q{q|q|q|q|r{q{rzryrytytzszrzrzsztzuyuyrzq{n|n}p|p|qzq|r}q~p~p}pqqp€op~mt}~~{t„m‹jjklˆn†o…s„wz|}€€€€€€€€€€€€€€€€€€€€€€€€€€€€}~wmƒeŠbŽa‘a“_’^]^Ž`ŽabcŽdcab_^__\‘\“\‘YX^bc‘c“f”f“o‹}~~~~~~~~~~~~~~~~~~}~z~}~~~~}~}}}}}}|~}~}~|}||||}}|~{z€z€{€|}~~~~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€sfuhvnxtywywxuwswswuwuvtwuyvywzxzy{z{yqum{s}u{vzvxvxvysyqxquttvtxwyywzuztyuwvxw{ys|x~~€€€€€€€€€€~€l‚o}tzuysyszszs{s|s|r~u|xs{v~}€€€€€€€€€€€~~}wxm}p}qzqyqyrxqyszr{s{sysysyszs{s|s|s|s{tzszrzpzp{o{p{p{q{p{p}o}p~pp€q€p€p~p{rzr{u{~~y€q‡mŽlmŽoŠs‡vƒz€}~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~xƒo‰ieb‘_’_’_‘^^Ž`ŒaŒdeŽddŒcŒa`aŽaŽ`_^’_’]‘Y’Z‘`db‘`”d•d’o†{|}|}}~}~}~~~~~~~~~}}|~z}€€~~~~~~}}~~~~~}|}|}}||{|{}z}z}{}}}}~~~~~~~~~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~~~~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€uavewjxpxtyuyvzwyvwtvuwvzy|{||}|}||{zyqvlzr{syuxuwuxuys{q{oxqusrxvxwxxwyvyvzv{yz~q~{€€€€€€€€|r€q~s{txsxsysyuzv{uzt{v{wtzx~€€€€€€€€€€~}|ttpxs}r{qypypzq{szszsztzszs{r}s|s{s{t{sztytytwrwrxqyqypzozo{o}p}p~p€oo€pq~q}s{s{t|}~x‚s†q‰s‡w„{‚}€~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€zƒrŠj‘h“eb_]Ž^^_‹a‹bŒcŽdŽdŽcŽbŽa`c`Ž]`’b’^ZX’\cec`”c•b’o‡|}}|}}~}~}}}~~~~~~~}}|}{~€€€€€€€~~~~~~~~~~~~~}~}}~|~|}|}|}}}~~~~~~}}}}|{€|}€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~€}€|~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ykxmwoxrxsxuzy{z{yzwywzy||~}~~~~~}}|zyqslwrwtuutuvuyu{uzryosopmrrwtyvxwwwwwyvzzy~v}€€€€€€€€€€~v€s€t|szsxsxsysyuzuzuztywwvs|{€€€€€€€€€~~|zrvszss{swsvrxrzsysysyszszs|r}szsxsytysysxsxsxsxsyrxrwqwqxqyr{r{q|q}o~p~p~q~q€p}s|q{z}~~|~{}~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€|t†iŒdb`Ž^‹]‰\Š]‹^‹\‹_Œ_ŒaŒ`ŒaŒ`aaŽ`ŽaŽ]agŽcŽ]ŽZ[`efb^“b’a‘oˆ}}|{}|}|}{|{}}~}~~~~~}}|~€€€€€€€€€€€€~~~~~~~~~~~~~~~€€€€€€€€€€}~|~{~yy€y€yz~|~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€}z‚{~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~z~{}{{yywywzz|{|{{z{y|{}}~~~}~}}||{zxqmpmupwqxswwvzv{vytwrprnprsuuxvvxuxvxwxwzu}z~€€€€€€€€€€~ns|vytyswtvswtxuytyszt{yr{s~}€€€€€€€€€€€~~}zyqwuyu{vxuwtwrxrxsuttuvsyr{r|s{szs{rzsxswsvrwrxrzryqxrvqusvrxszs{r|r{s{s{s|s|s|s{uxqqvv~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~x‚oˆg‹c‹^‹]‹\‹]‹]Š^‹_Œ[\]^Œ^Œ^‹^Œ_ba\aŒi‹jŠeŒ`^`Žcee_’^“dfpƒ}}}|}||{|z|{}|}}~~~~~}~|€€€€€€€€€€€€€€€€€€€€€€€~€€€€€€€€€€}~{}z}y}x}x}x~vw€y€}€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~|yx{€~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~}|zzyzy{z}}}||{{{|{|{|{}}}}|{zxqnomurxrytxvvxtwrvruqqsqurvuwvwuwtwsxszr|l~y€€€€€€€€~~s~uyuwtxrwrvtwtytysytzv{{q}v~€€€€€€€€€€~~}|vupwwwvwuwsxrzpzpyqvsvtwszr|r|t|t|s}r{rzswsxrxqzq{qzrytxsxsyrzr{q|q|pzqyrzr|s|sztytyrptr||€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€{s†kŒfb^]]Ž^Ž^Œ`Œ_Œ[Œ\^_ŒaŒa‹a‹bŒbŒ_ŒaŒj†j‰gŒdŽa`ŽbŽbŽcŽd_“a“g‘iŒpƒ|}}||{|z|{|{}|}}~~~~~}~}€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~}|{{z|z|y}y}x~v€t€u€x€|€~€€€€€€€€€}y€wux€}€€€€€€€€~~~~~€€€€€€€€€€€€€€€€€€~€~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~~||xytxuyx|{|z{yzyyxyx{y||~~}|{ypulyszvyxxwxvxtwpwpwmtqptqstuvuvvuvtwvyw}p~{€€€€€€€€€€{{t|tzrzrzrzsyuyuyuxuxwyzzzs|z~€€€€€€€€€€~~}{suqxuvtwrwqwrwrxryryszs{r|q|r|s|t~rq~q}q{q{qzqyrzrysztztzt{s{r{q{q|p{nzozpyqyrzq{syussp{y€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~xƒnŠgcŽ`Ž^^^Œ^Œ]]Ž]]_Œ`‹a‹bŠa‹aŒb_a‹i‡mˆhc’aaŽcbabŒcŒaa‘edpƒ||}{|{|{}|}|}|}|}}}}}}~}€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~~}}}|{|z|z~yxv€t€s€tx€{}~~~~~~~~~~~}}}~~~~€€€~zw„u„tƒuz€€€€€€€€~~}}}}~~€€€€€€€€€€€€€~~}€}€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~}}|}{|y{rymxpwsyxzy{y{y{y{x||~~~~}|zrvpyuzwzxzwywwtwrwswrqtktosttyuywwwxwxyz}y}€€€€€€€€€€w~t}t{szszuzvyvxvvvuvuxyzyzu~|€€€€€€€€€~}{ypwq{uxtwtwtwsvsvswsytzs{q{qzrzs{t}r~r~q~q}p|p{qyrvsvsxtzt{tztyrxrxryrzr{r{ryrxqzpytxvxsryy€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€}yr…k‹fŒcŽ`Ž]]Ž^]^Z]]Ž_ŽbŒca_Ž^\‘c’ilŠlŽi’e’bcba`aŒa‹acŽed‰r~{z|z|{}||{}|}|}||{|{|{}|~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~~~~}||z{y}x~w€u€s€q‚qƒsƒw€z~|}{~}}€}}}}}|||}}~}~~~|~x‚t‡rŠq‹r†x‚~€€€€€€€€€€~~}|||}}~€€€€€€€€€€€‚~„}…z„y~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€zsysyuyuwqwnvovqxuzy}|~~~~~}~~}{{rwpzxyxxxxvyuzsysxtwttuqsrsttwvxvwwwwwxy}|~~~su|tzszsztztztzrzsztzxy{u|w~~}|xxl{r}uztztzt{tzs{t{t{t{s{q{p|q|r}s~s~r~q}p}o|pzpyqxqyryr{s}s|r|qyqwrwrwsysztysyqzoxr{s}ovwy~€z‚u‡o‹ieca‘_‘]]]’\“_’_‘_‘___ŽbaaŽ]ajlŒjŽig‘c`aa‘a^]`ŒbŒe‹gˆfƒt|{z|{}|}||{|z|z|z|z|{|{|{}}~~~~~}}{|y|w~v~t~rp„qˆq‰s„w~{}{|‚|ƒ}‚}€}|~|}}}}~}~~}zu‚q…pˆo‰r†y‚~€~~}||}|~~€~€~‚}…|‡yˆq…r€|€ultnvrxuxtxqypxqysyw}}~}|{syo{vyxwwwvwuwtvtvuxtyqxrurrsuvwvwwwxwyt|{}}s~t|tytxtxtysyszqzrzu|yx|t}{~~|uxo}t~u}t|s{szszs{s|t{t{szr{r|r}r}r~r~r|r{qyqxpypyq{q{r{r{q|pzpzqyrxrwrwrzs|t|s|q|nzq|s|quxy~~z€u‡nh“d’`‘^]]]]\\_aŽba`^_Œ]\`iljhgeŠdŠc‹dccŽa`_`dŠi‡n‚x|zy{z}{}{|z{yzyzy{y{z|{|{||~~~~}}{|z}x}x}v}t~r‚r‡r‡t‚x~}~}}}}~€~}|}~}~~~~~}~{}y~u~r~rt‚w‚}€}~|~z}€‚~„{…xˆvˆr‡px~€vqvrwuywyv{s{rypwowr{z~~€€€€€€€€~~~}|{xwtvvuwuwtwtxtwtwtwtwtvqwpyqwswuvwwvzu{r~{€€€€€€€€€€~~xyr|r|tyuwuwuyuyuytyuywy|s}s~}€€€€€€€€€€€~~~}{pwnzu{tysysxrxrxsxsyt{s{t{sztzt{tzsysysyryryryrysyryszr{r{qzpxpxqyq{r{t{u{v|t{t|q}n|r|syus{y€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~~y}rl‡heb_^]]][‘[‘[^Ž`Œa‹b‹_[[\Œ`‰h†hŠhŽf‘ccŒb‰a‰eŠcabba__hŠs„{~}~{}y}y|y{xzxzvyvzw{x|z|z|z}}~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~~~~~~~}|}{{y{xzu}tt€s~u|y}~~~~~~~~~~~}}}}}~~~}~{}y}x}u~t~s€u€y€~€€€€€€€€€€€€€~~~~|€y{~€€~€~€~€~}‚}||}}~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€wswsyvzxyvysxqxoxqxs|z~~€€€€€€€€~~}||{yutoumumtsuwwxwwxwyvytynyj{kzlzpxtys|r|u~}€€€€€€€€€€~~rvrxtwtuuvvwvzw{wzvyxx{skv~€€€€€€€€~~~|{n{m}q|rzryqyqyryrxrzs|q}s|szsysxsxsxsxryqyqyrzsztzsysxryrzrzswswsxp{r~t~t|u{tysyr{q}sztvvr|z€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~y€o„gŠcŒc‹b‹a``^]]‘]’]“\’]’`aŠ`Š\‹ZŽ[Ž`j‡m‚i†g‰eŒbŒaŒ_Œ_‹a‹aŒccbŽ^]aŠpƒw}}~€€}~{}z|xzvzuzuzuztzuzwzx{y}}€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~~~~~~~}}|z{w{v|w{xyxyw{x~{~~~~~~}~~~~~~~~~~~~}~{~{~z}y}vts„tx€~€€€€€€€€€€€€€~~}~z~x€y}€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€wswqxuzxyvyqzq{s{v{y}|€€€€€€€€~}|{ywrrmvovowrxuyuxvywxwyvxowkujsmttuwvvzn|v€€€€€€€€€€~qxuxtxtxtyvzv{w|w{vzwy{n€j~z€€€€€€€€~}yxoyqzqzryryq{p|q|q|p}qp~r|r{qysxsxsyryqypxoxoyqzrzrzqyrxrxrwrvqvpxp{q|r|szsyqxrwtvuvsvssur}{€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~€y‚q†g‹da``Œ_^Ž]\Ž\\‘[’[“Z“[“\‘_`^^ahkŠk‡h‰f‰dŒ`_]Ž_a‹aŒbaŽa‹a‰f„q~y{zw~|€€€€€~}~zx€u€r~l{mxrxxzzz{|}€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~}||y|v}w|w|x}w€w‚xz{}~}}~~~}}}}}}|}z~{{{}y~us‚s…v‚{€€€€€€€€€€~~|}x}ww€z~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€xuwsyvzxzv{r{s{w|y}|€€€€€€€€€€~}|{ysqmvs{vyxwytysytwvvwvvvptlpnlupxtxwvxp{y€€€€€€€€}~vwvvtzu{uzuywyw{w{u|vyymzn~|€€€€€€€€€€€€~}|tumzsxtvsurvryrzqzqzq{q}q}r{q{qzrysysyrypyozp{o{qyqyqyqyryqyqxownwnxpzqzryrxrwqyqytxuuuqulwo}|€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~€z…r‹kŽecŒb‹a‹`‹^Œ\Œ[Œ[[[Y‘Y‘X‘Y‘Y’Z“]’]‘^giŠg‹eŽdcb`ŒbŒ`Œa‹b‹bŒb‹_‹`‡gƒuz~y{zv~|€€€€€€€€€€~€}‚zƒs€i~o{vwzs|u~x~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€}~{}y~y}y~x~x~z~{}y|y}|~}}~}}{}{}z~yyz€{€zxus‚t‚w€}€€€€€€€€~}}z|w|v|v~y~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€xuxtywzy{x{v{v{w|{~~€€€€€€€€€€}|zxromutywyxwyuxuwvuxuyuxvvspsppvpxvxytzr~|€€€€€€€€€€~||xyvxuzvyuxvvwwwxwywzzu~h|t~~€€€€€€€€€€~~}|{zn{o~vyvvuutvswrwrxrxryq{r|r}r{szsytysyrzr|r|s|r|r{p{pzrzsyrypypxqvrusvsvsxqxqxpyq{s|vywrzi{l~{€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€|ƒv‹n’h’dcŽbŒa‹`Œ^Ž]Ž]^_]Z‘Y‘Z[YZ_^e‹iˆi‡gŠc`^Ž^_Œa‹`‹aŒabdŒe‰f„kzwzx|x{yr}z€€€€€€€€€€€€}z~tzl{swutytzr~p€vx~€~~~~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~}~|}|}z}z}{|z{y{x{z||}{z€zxxxyyy€z€y€x€wuƒvƒy‚}€€€€€€€€€€~~|}z{w|v|v~x~}€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€zxzwzx|{}{|y{w|v|x}{~~€€€€€€€~~||yxrrpuuywxwwwwwxvzuzvyvyvvsqsopqquwvyrzt~}€€€€€€€€€€v}w{vztytyswtwvwvxvyxxzr}j}y€€€€€€€€€~}}{xwo|s|xzvzuzuztyryrzq{q|q}s|s{tytzs{r|q|r{r}s|t|s|r|p|p{qzsyqyqzozpxrvsvtvswqwqwpxrytzt{uxxlzm~{€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~{uˆmŽh’d’baaŒaŒaŽ__‘_“_‘_]]]__^`dŠfŠl‡j‡h‰d‹aŽ^Ž]Ž^ŽaŽaaŽbcedi‰k‚qyxyx|w}ux||€€€€€€€€€€€€~~||tvkxrtvrwrxrys|sprz~~~~~~~~~€~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~~~}}{}|}||y{yzz{{|y}xx€xx~y}y~y~y~yy€y‚y‚yƒu…u„z~€€€€€€€€€~}}{{z}x~v~x~}€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€{yzx{y}|~}~|}y|u{uzw||€€€€€€}}|zyxurupwrxownwrxvxzvzwxwvuprkolnmrryu{p|x~~€€€€€€€€€€~y|{|wzuztytyuwuxtyuyxyznzn}|€€€€€€€€€€}}{uuqzt|v|v|v|u{t|r{q|q}r~r~s|tztys{s|q|q}r|r}s|r|s|s|q|q{qyqypzpzo{ozrysyuyszqypxpxqyrxswtvvmyp}|€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~z€uƒnŠhŽeccŽaaŒ`Œ`Ž_^]‘]^^^]Ž]^acŽeŒl‰o‡kŠe`Ž^Ž^`cbccdeŽebˆf€mwqtrvwyx}s{€€€€€€€€€€€€}|uviwqrxqxqxrytzt{u}u}t{yzz{z~uw‚z‚~€~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€}~|}|}{|y{y{{|z}xxx€xxy~z}y|y{x|y}yy€y‚w„x‚|€€€€€€€€~{~x€w€v~w}y|}~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€{zzx{y|{}}}~{}w{u{x|{€€€€€€€~}|{ywuprjqgtdvfzozvyxwxwuwstmplmopovs{v|s}z€€€€€€€€~~{|{zyywyuytytxtytyuxzx{p|v~~€€€€€€€€€€~~}|ypxpztyu{u|u{tzt{szsztzt{t|tztztyszs{szs{t{t|t{szszsyryrzrzrzsysxszr{t|t|u{t{szryqxqxrwvtvsuoys}}€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~zƒrŠkfŽdŽccdbbaa‘_]Ž]Œ]‹^Œ^Ž]ŽZZ[_`‹h‡o†m‡hŠb‹_^_‘acŽaŽbcŒe‹fŠd†f}loqlorlssuxyt{y}€€€€€€€€€€€~~}|vvnwtt{sysztzu{u{t{s{sytwtwtxtztr‚pƒy‚~€~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€}}~|~z}y}y|y|y|x}x~xxx€yyy|x|w}xy~y}z~}~€~€€€€€€€|~xt…s†s…vy}€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€|{{y{x{y|{~~~}}y|w|z~~€€€€€€€~~|zyvsmqlumwnwrxvxyxzwzvyuwrvltmrqpus{xyw}}€€€€€€€€€€{|v}v|uzuztxtxtwtxuyvyzxzs|{€€€€€€€€€€€~~}zyj|o{tvtyt|t|tztytxtxuyuytytytyuyt{s{szsytzt{u|t|uztytyszr{s{sytytzr|r}s|t{uzvxuwtxszt{uttssrxw~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€{s„i‹daŽbŽcd’e’d‘bŽaŽ_^‘]]Ž^Ž]]]\Z[Ž]Œa‹j‡mˆjŠe‹aŒ_^^b‘b‘bcb‰d†d‚h}ntqopqownwstxwtwz|€€€€€€€€€€€~~xvstxyt|t{t{t{t{tzszr{rzsytxswsys}rr‚qƒq…v‚x€~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~~}~|~z|y|x|x{xzxzx{y|x|yxx€x€wwxy€{~~~~€€€}~{}wtƒs…t…w‚z~€€€€€€€€€€€€€€€€€€€€€€€€€€€~w€x…|„€€€~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€|y|w|u{u|w|{|{{y{y}|€€€€€€€€~}|yxuqnqsvvwvvxvyvzwyw{w|v}s}mxqrtotpxtvv~}€€€€€€€€€€~wvtxuztytxtwswsys{u|x{yuzs~|€€€€€€€€€€€~}}|wwnzrytvtxtzsztytxtwtxuytyszrzszuzuzt|r|r{tzt{u}t~u~u}u|t{szszrzrzrzq{r|r{s{tytysyq{q}s{ttqsprvw~~€€€€€€€€€€€€€€€€€€€€€€€€€€€}€sƒh†cŠ_‹_ace’f‘eŽdŒc‹aŒ`Ž____^]]Ž\]Ž_Žfj‹igŽdŽbaŽ_^Ž`b‘dec‡hjysutssspwpzpyruwxsv{{€€€€€€€€€€€~~~wusvvxtysyszt{t{u{tztytytztzs{r}q~rr€ss€t€qrƒuƒ{‚~}€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~~}~|}z{x|w~xx~x}y|y|y|z}y}x~wwwy}€|~xutƒtƒu€w~{~€€€€€€€€€€€€€€€€€€€€€}€v€w||z€q‡z„€}||€|€~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€{w{t|r{q|t|v{x{vzv|{~~€€€€€€~}|{yxuropuuxuwvxvxwywywyw{x|v{svvryqym|ozu~~€€€€€€€€€€~uzt{vzuytwrxqyr{s}w|zx{o{t~~€€€€€€€€€€~~}|{ysqruuyvxuzt{s|tzuxuwtxuztzs{t{s{t{t{s{r{r{syr{t{t}t~t~s}r|r{r{q{q{ryrzs{s{sysxsxrxp{p}p|svsqvnzw~€€€€€€€€€€€€€€€€€€€€€€€€€€~€vƒjŠc`Œ`Œ`ab‘c‘dfŒgŠg‰fŠdb`__^]^Ž_ŽaeŒh‹gŒfŽbŽ`ŽaŽ`Žaaa`ŽafŠiƒq{qstqttquovqwsvttwxuu{|€€€€€€€€€€€~~~~~xyv{w|t{rysytyuyuyuyuxtxtyrzr{r{s{t{t|t|s}s|s}sq‚o…n„y}‚~€€€€€€€€€€€€€€€€€€€€~|~{}y}w~vwxyyy€yy~xxw€w€w€y€}~~~~{}wt€s‚rt€v€{€€€€€€€€€€€|ww~{~}~|}||}y€vƒy…}‚}~|~z}y~y~|€€€€€€€€€€€€€€€€€€€€€€€€€€€€{u{s{rzszsypyqxownxs|{€€€€€}|{yyvrmqpuwuxvywxywyvxvwxwyvwrrunynzi}i|v€€€€€€€€€€~s|szsysyryryr{r{t|v|yw|n}y€€€€€€€€€€}}|zvpnquuyuyuyuztysxswsxrzs{s|s|tzszszs|r|q|qzqyr{s|r~r~r|rzrzr{q|q{rysxsxtytytysyryqyqyqypzsuvoym|x€€€€€€€€€€€€€€€€€€€€€€€€|€o†eŒa_acŒd‹eŒdŒe‹e‹eŠd‹de’e’c‘aa``ŽbŽfj‹i‹hfŽdŽaŽ_Ž`Ž_Ž_Ž^``Œ`‰dkytstnunspqqmporttvvxzty|}€€€€€€€€€€€~~~~~x}uvr|qzrzr{sztyuytxsyrxqzq{rzrzuyuyuzszs{s{s{r~srpƒm…w‚~~€€€€€€€€€€€€€€}}{|y{w~vvuw‚y‚z‚yxx‚x‚xƒx‚x‚wƒy‚{€~~~~~~~~~{|z|vt€stw~}~€€€}}~}}v}x}{|z|zzyz{x|x~w€v‚s‡{„}‚~€}€z€yy}y{z{}}€€€€€€€€€€€€€€€€€€€€€€€€€€€€zrytyuzvyswmvmvjvhxk{v~€€€€€€~|{zzwtoolsqwtxvzvzuzuxtwuwvxvxpxkwmwjyl|z€€€€€€€€}~w{uxtxsyszsztytyuyvyzr~s~}€€€€€€€€€€€€}~{yuouqxsyszszszsxrxqyqzp|q|q{r{r{r{s{t{rzr{r{r|r}s}r}r{q{ryryszr{r{r{szrzr{r{r}q~p~p|p{qyrzuuxnzm|y€€€€€€€€€€€€€€€€€€€€€€€€€v„i‰cbbcfiŠl‰j‰kˆjˆhˆgŠfhiiŽfŽddfŒjŠn‰kŒgec‘b_^_Ž_^\’_‘ab„gxmttsuqxpwntonnnrswvyxztw}}€€€€€€€€€€€~~~}xywzx|t{qzrzszsytyszsyryrzr{r{rzsytxszs|t}t|t|t|t}s}s}rrnƒvz€~€€}|{{z{x}wuuw‚x‚zz€xw‚xƒzƒz‚z‚{}€~~~}}~~~~~~~~~~~~}}{}y|vt‚tv}{yw€vx~z~{||z|y}w}v}vzvzvzv|vt‚p…p…{ƒ~~~|}{€yx€z~{|}}~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€wtvtwuzwzwzpxkwhwfyh|t~~€€€€€€€~|{yywtqmlmpqqttyuzuyvwuvuxvzt|m|jynyn{q~{€€€€€€€€€€~|{xywxuyu{u{uyuxuxtyww{l}w~€€€€€€€€€€~~||yquh|o|szt|t|tzuxuxtzt{s}s|r{szszs{tztzsyszr{q}q~r}r|r{q{qzrzrzq{p{r|s|s|r|rzryqzp{p|q{twwvwvutuuz{€€€€€€€€€€€€€€€€€€€€€€€€~s‡gŒdŽcbbŽfŒi‹l‹lŠlˆk‡k‡jˆiˆkˆmˆl‹hhŽlŒnoŒmŽhcŽ`Ž____`aaabd‰j|orpqtptowovmtnnmlopuuwxwyy~~€€€€€€€€€€€~~~|zw{vx{u|r{sztytyszs|s{t{szs{t{tztztzt|s|s}t}u}u|u|u|t|t}rrs€s€r€w€y€}€~~~~~}{|z{x}w~vuƒv„wƒxx€xx‚x‚z{€|€~€~}|{~|}|}}~}~}~}|{~xv€t‚tu}x|}y~y{|z{y|w|v}uuu~t|u|u}vuƒs†xƒ|‚~}|~z}yyz}{}|~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€sttpunxtzxyqyjxixiyo{y~~~}{zyvsooosutvvvzu|sztwwuwvwvutqvoxqzo}s~}~vxsyuzvyv{u{vxuwuvsywqyn}{~~}|zwmuk~p{szu{wywxvuuxuzs{r}s}r|r{szrzszrzr{r{q{q|q}r|r{q{q{q{rzr{q|q|r|s|r|r{rwrtstswsxtwwuzuxuruqvy|~€q…f‰dŒdŽceŽhŽkŽmŽn‹n‰nˆl‰jŠi‹j‹kŠm‹oŠoŠo‰p‰o‹kŒgŒb`Œ``bŒa^^_ŽbŠg„m}qtropkrjsmuntnsnpkmisnvtyu}{~}|xvww|t|sztztztzt|t}t~s}r}s|s|t{u|vzuzu{u|t}u}s|r{s{s{t{t|r|s|s{t|t~t€wu‚w‚|~€~€~~~~~~~{}z|x}vu€t‚v‚vwxxƒx‚y‚z€{}~~~~~}~}~|{~|}|}|}}~}~}~}~|~zyv€t~tvyz~x~w~v~v}v|v{v{w{w{w~u€t‚o…x‚}€}}|z€x~x~z~{}{~|~€~€~€€oprlukxrzvxpxjwjylzu}|~~}|{yyuqooutyuzvywyxvvvvwuwwwwxsvsrwrzq}w~}~~tzszvxwwwxvyvxvvvvvsxfyp}}~~||{xsrrrytytyuyuxuxuvsxszrzs|t{szryrxryrzr{r|t}s}r}r|s{tysyryqzr{s}r}r|r{tzszrzrxswtwuwuvuuvuxu|nylxp{{~€r†g‰eŒdŽcŽfŽgŽikŽm‹nŠlŠj‹gŽfg‹n…t‚uqƒn…n…m‡kˆg‰bŠa‹acŒcŠ`‹\Œ]‹`‡gqvvqvounrjtkuqvquosnrmolvqzv}u~{~}~|xyryx{wzuzuytyt{s}s}r|r|r|r|t{txuwuvuwvxvyvzu{t{szsytyszszsysxtxtyt{u}t~ts‚o…tƒy‚~~€~~~~~~}}{{x}w~vu‚vv€v€ww„xƒz‚{€{|~|~}~}~|||||~}}}}}}~~~~~~}}|}z~w~sty~x|x|x}w~w~v|uzvyvyw{t~to„x‚}€~~~~~}|~|€zxwy|~}~~~~z€w~ulvmxp{s{typwkulvnxu{z||~}~}}||{{yywxtrorwu|v|w{w{wzvxvwvwwxxyuvsrwszu}{~€€€€€€€€€€~~wzwzuwutvtvvvxuyvzwwyo{x~~€€€€€€€€€€€~~||zvpsutztxtyszsztysxsxszr{r{rzrzrzqysytys{s|t|s{s{s{t{szr{r{r{r|r}r~r}r{syr{r}s}s|tztztysytwvtxmxkyo}{€€€€€€€€€€€€€€€€€€€€€€€€€€tˆfŒccŽbbccgŒh‹h‹d‹baŽck‹t„uƒq†lŠjŒjkŽieŒcŒbŒbŒccŽba‹a†h}qtxpznxpyqwowqvuutsqrpprotuw{z|x~}€€€€€€€€€€€€€€}||zutrvy{w|v{vyuyt{s}s}r}r|s|s|t{sxtwtxtxuyvywxwxvyt{s|r|r|r{r{r{szszt{s|s~s~ss€r‚m…r„zƒ~€~~~}}||z}x~w€wwuu€vvƒwƒxyz{|~}~}|||||~|~|}}||||}}~~~}~z€w€q„i‰r€v{v|v}v}v|uzuzv{u~u‚p‡t…||}~~}~|}{~z€yxxz|€~~}}|{x}wy€€€€€€€€€€€€€€€€€€€€€€zlznzp{o{oymxowqxtywzvzw{z{{{zzyzxywwsqlrttztyuxuyvyvxwvvuwvvxtsspyu|y~}€€€€€€€€€€€€~zzxzuwttvuvwvzu{v{xz{v}|€€€€€€€€€€€€€~€}}zvuvzxzvzt{s}r|szsysxsyrzq{p|q{rzszs{szs{s{s{s{szszs{s|r}r|s|r|q|q|r{r{s{szs{s|r{tztysxsytxvuunujwn|z€€€€€€€€€€€€€€€€€€€€€€€€€€€y„jŠe‹dŒddŽeŽfjŒjŠg‹dŒbŒemŒw†v„s…nˆjŒgg“h“h’gecŒb‹dŒeŒeˆgƒkzstxqzpzpzqzrxpvpvuttrrrrqtottxzx|v~|€€€€€€€€€€€€€€}}|zuqptu}t~s}t|s{s}s|t|t|t{t{t{s{szsztzt{t|u|u{v{uzt|s|r}p}p}q}q|rzs{s|s}uu~u~t~s~qoƒmˆtƒ}‚~€~~~~}}}}{|z|z}x~wu~w~w~ww~x~y~{~|~}~}}|}|}|}|~}~}~|~|~{}|}}~~}~|}y~zu‚v~w}w}w}w|vzvzu|tpˆq†{ƒ{€|~|~|~|~z~yxx„x…x…y„|‚}}}~{y€t€u|pƒu‚~ƒ~‚€€€€€€€€€€€€€€€€€€€yqzq{n{m{mzlyqxuywyvxsxtyxzxzyzxywxvvrpkputztytytxvwvuwtwuvxwzvvvr{w}|~~€€€€€€€€€€~~|zx{tztxtwuxszs}u{sxuw~}€€€€€€€€€€~~€}|{zo|p~tyuxuytzszryrxrvsvtxtzr{rztytytzsztzuzszszsysxsyr{r|s|s{rzryqysxsxszszr{r{r{r{rzryqxqxsxpuqstt{|€€€€€€€€€€€€€€€€€€€€€€€€€€€€~sƒi‡fŠcŒdŽgŽhiŒi‹dŒbbp‰y…z„sŠmŒkŽhŽgfiŒjl‹j‹i‹hŠhŠhˆm‚szusxpzr{q{o|p{qzoxoxtvqvotpsqoqtvzx|x~}€€€€€€€€€€€€€€~~~}|ywprsu}u~u|s{s{s{t{t{t|t|u|u{tztzsysztyuzv{u{t|t{s{s|r}q~q~r|t{u{t|t}t}u}u|u{t{s}rrr€nƒt…z„|~~~~~~~~~~~~}}|}z~y€x€w€x€x€x€yz}{}||||||||||||}}}~|~|~{~z~{~}~}}}}€s€u|zy{w{w{wzwzv{t~ro„{‚|‚{‚|€{{z~yxwƒx„x„y„z„{}~~|}y{y~w}v|vt‚q…y…}„~‚~€€€€€€€€€€€€ytyrzm{lznznyryvyvyvxuwuxvywywywxvwuuqplrvvzwxwwwuwtwuwwxywzx|xvzq}x~}€€€€€€€€€€~~||{yw{u~t}r|r{rztzzqwnyw~~€€€€€€€€€€~~~}}{uyk|p|r{sztyuxtwsvruqvrxr{q|q{qzsytyuyuyvyuyszsyrxrwrwryrzszrzryqypxqxryszr{r{szsysysxryryrxuvquntrv{}€€€€€€€€€€€€€€€€€€€€€€€€€€€€|~rl†hŠefgŒeŒcŒahv†}|w†nŽifffŒfŒi‹l‹pŠq‰p‰o†m‡l„r€y{zt{q|qzqxnyoyozpxoxqwmwluosrorswxxww}}€€€€€€€€€€€€€€~~~|{xtqrvw|v}v}u{tzszszszs{s|t|t{t{s{q|q{rzsztzs{s|s|t{t{t|t|t{s{t|u}t~ss~s}t|u{u{u}t}s|s{s~p…m‡w„}ƒ}€~~~~~~~~~~}}|}{}{}z~yxx‚yy€|~||||}|}|}|||}|}~}~{~z}z|z|~{|z~{~z||z|y}x|wzw{u}tl†x‚{{~{~z‚zƒy‚xxxx‚x‚y‚xz{}~~xy€ww|wzwzw}u€tƒq†v„w‚~€~€~xrxrxnxlxlxmxszwzwyvxvxwxwywywxvwtvtvrrkssvxwwwvwuvvvxtxuzv{x}wwys|y~€€€€€€€€€€€€~yxuxwzv|v}u{u{szuxh~j}z€€€€€€€€€€}~{|zq|o~r{u{u{t{s{rysxsxtzs{q~p~p}q}r}s|u{uzuztzszsxswsvsxszs{s{s{syryryrzr{s{s|s{tyuxvwuwsxsysztzqznwrv{|€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€|}sm…g‰d‹d‹eŒlŠu†|ƒ€}€y…q‹jfŽeŒe‹ddf‹jˆnˆqˆt†wr|m{l|pywwyuytwruotptotqtownwjwjtmsppqtvwvvu}}€€€€€€€€€€€€€€~|zyrvn|v|w{w{w{u{u|t{uzuzuzuzszs{r|r}r}q|r|r{r{s{s|u{u{u{u{uzsyszr|ss€s€ss~s}u}u~u}t}t}t~r€pƒk‡sƒ|ƒ|~~~~~~}~}~{}{}{}z}yy€y€y€{~}}}~}~}€|}€}}{{z{zy~z~{|~}~|~}~}~{{x~vm…x‚{}€{z}y~x€w‚vv€v~w€w€xzy€y{~|~~~z|z|x}v|vzwywyw{u~tr€s‚p„p…uƒz‚~€~€€€vpvpvovkvivkwqyvzwyvxvwuwuwuxvwtvtvtuqpnrxt|uzvxvxvzuytxtxt{v|xuyq{y~~€€€€€€€€€€€€~~vyuyxxxxxyw{v{u{uyjp~}€€€€€€€€€€~~~|~{{xr|r€s|sztyszszszuzuzt{s|q|q{q|q|r}s}t|s{rzqzrzt{uzszs{s}s|s{tyuxuyuzs}r}r}s}s|s{tztzszszszszs{oznusqzy€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~{}tn„m‡u†yƒ}€~~€{ƒr‹kiŠiˆl‡l‰jhŒl†r~u|v}y~yyqvmwnurtvswswrwqwpvpsotpvpwmvmsmsnrovtzuxt~}€€€€€€€€€€€€€€~~}{zrvlyvyvxuyvzvzvzv{v{u{t|tzszs{r{s|r|r|r{s{t{s{s}t{t{u{t{tzszszr{s}ttusr~r~s}s}t|u|t}r~q}p~n‚rƒzƒ}~~~~~~~~}~{}{}{~{~{zz~z~{~}~}~}}}€|€}€}€}~~}}~}}~~~}|~{~|~}}}~}}|~}}{{z|x}wvvv~u~u~v€w€xz€{~|||z}}}w~w{xv{uzuxwxxzx}v~u}t|u}u}tssƒrƒz~~€vmwoxmxhwfvivpxuywywxvwtvsvtwuwtvsusuqnnryu{uwuuuvvxuxvwvwvxvxxpyo|z€€€€€€€€€€€€~~s|v{xyxxxywzwzw{v|yt|x€€€€€€€€€€}~{}ywvp|r€s~r{rysxtxuyuyszr|q~q}q|r{s{s{t{t{r{q{q{r{s{s|r|q|p|rzsxswtxszt{t|s|q|q}r|r{szsytytytyuytvqvrtsrzz€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~|€}€€€}€w…mŠhŒiˆj†k‡j‹jŽp‰xyxxtwsyx~}~|zrwlvlrnsovpxpyoyoyqwqwqvqvnsmrlqmrmvtzwyx~€€€€€€€€€€€€€€}|zuspwwytxsxuxvyvzv{u|t{t{sysyszsztzs{s|s|u{u{t{t{s{t{u{t{u|t{u{u{u{t|t}t~t}s|s|r{s|u{u{u|s{sztyr|n‚i…zƒ}€~~~~~~~{}{{{€{€||~|~|~}~|}|}|}}~|}~~~~~~~|{{~z~zy€z{~|}~~}}}||y{xzw|v€vuvvuw~x~y}{}||}{}|~u~v{xyyw{v|w{w{x|x}w~w|v{uzuyvzv|v~v€u‚s…y„xkxnymyjxjwmwrwtxuxtxuwtvsurvtvtvsvrupoirswuvuvtvuwuxuwvwwwxwyusxs}{€€€€€€€€€€€€~}xwyywzwyvyvyvywxyw{r~{€€€€€€€€€€{y|wtvm~ps~r}s{ryqxrxryrzrzr|s|s|s{t{t{t{s{r{ryryrzs{s|s|q{qzqxrwsxs{s}s|r{szs{r|r|s{tztyuxuxtxuxuuqvsysxz{€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€}€s…hŠeŒgŠgŠgŠj‹s‡|‚~}zwwqvnyr|x~}}w{qyounuovowpvmuows{y|wztwqsnqnqmrmxr{u|z€€€€€€€€€€€€€€€~}zwprsv{sysxuwuyt{t|t|tzuytytytytytzt{t}t|t{t{u{t{tzt{u{v|v{vzvyuytyszr{r|s}s{szsytzt{t{tztztzs{r}q€nƒk„z‚|}}~~}}{~z{~{}{}|}|~}~}~}~}~|}{}{}{|€|}~}~}~~}}|{{z{z€{€||~}~|}{}y}w}v|u{v~vuƒuƒu‚u~v}x{z{{{~|€}„twzyy{x{w{w{x{x{w{w{v{w{w{vzvzu|v}x|yyyyy|xwixmxpxpxpxsyuyuxtwswsvtursotpurvsvrtpoiqpvuvvvxvwwuwuwuwvxxxxtvwx}}€€€€€€€€€€~~wyvzu{uzvyvzvzuvzn|r}€€€€€€€€€€~}}z|yyvpvq|s~t~t}t|s{r{q|r|szuyvwvyuytyszs{s|s{s{ryqyqzr{s}s}r}q|q|s{s{u|u|t{s{szs{s{t|u{u{uzuytxsys{sypyo{nzw{€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~uh‰cdŽeŽk‹w„}€}zuxpxnxnzr}{}{yxwtrupwowqtqqqst{z}y}vzqvntmsmsowtzv}|€€€€€€€€€€€€€€€€~}}yvnrnvzt{szuyuzu|t{t{tztzsytzu{u{u|t|s|s}s}s}t|uzwyvzv|u}u|u|u{t{syryqzq|r|s|r}s{t{tztysytztzszr{q|r~ql†t„|}~}}{}z~{~{}|~|~||€{€z€z€yxw€xƒz„{ƒz‚{|€}}}|€||~zz€z€z€{{€{€zxvt‚tu~uu‚t†t†s„uwx{zz}}ttw{zy|x|w{v|v|u|u}v|w|x{yzy{xzv|v~v~x|yxyxxyvythuoxuywyuyuyvxuwsvswrwrvptntpuruququqooovtxuxuxuyuwtwuvvvxxwwusww}~€€€€€€€€€€€|~v|uztytxuxvywywxzq}x€€€€€€€€€~}|{yzxvrnuuzuyuyuytytyszs|s|t{u{uzuytzszr{r|r|r{r{r{r{rztzuzt{s{r{r{q{q{r{s{tztzt{s|s~s~t}t|u{u{s{s}r€st{tysrxv€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€}~t€l†l‰t†{‚€€€~|zuxpyoxnynyv}||xwqtmspwpxsuosjtmzx}v|q{lwkukulsowuzv|{€€€€€€€€€€€€€€€€€~~|ztsnru{u{t{u|u|u{uzuzuzt{s{t{u{u}s~sr~s}s|s{uzvzw{v{u{s|s}s~s}t}s|s|r|s{s|t}sst}szszszt{tzuytytyszr|rm„sƒ}€}~}}|||~|~{~zyx‚w‚vu€vx‚zƒzƒzƒyƒ{‚||{~z~zyy€z€y€z€z‚zƒzƒz‚xus‚s‚uu€uuv‚v‚w€x}zy|u€rvzxwzwzw{x{x{w|w~u~u~u|v|x{z{z{z}y~x€w~v{wyxywzv{tjuoxvywyvxvxtwrvovmxjxgvhtismtptptpuqqmssvvuutvuyuzu{uyvyxyyxvsvv}}€€€€€€€€€€€€z|x{uyuwuwvxvxwyyx{u}|€€€€€€€€~}}z|zzxqwp}rs}u{vztytxsxuytzt{s|s|s{szs{s|s}t{tztyszs|t|v{vzu{uzszsyryrzrzr|s{r{r}s}s}s}s}t}u}u|t{s}s€t€t}vyvoyt~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€}~{|€~€€€€€€}|zuyryqzoxmwr{z}|yuvnsotqvrtpqlurzv}q{lwktjujvlsrvyxy{|€€€€€€€€€€€€€€€€}}|zswlwr€su}v}v}v|vzuytzszs{s{t{s|s}s}s|s{s{t{tzt{t|t|t|s|r|r}s{s|s}s}s}s{u|t|t~s}r|s{s{t{u|t|s{tztytzt{t}v€l‰u…}}}~}~}}|~|}z~x€wvw€w€x€y€z€z‚z„y…z„z‚zz~yx€xƒx„zƒy‚z{‚zƒz„{ƒyƒw‚u€t€t~t}v|w}xxy|{y~yv}xx{u|u|v|w{w|w|x~wwv}v}w}x}y}y}zy€xw}v|x}x~w}v}uiuowtxvxvwsvoumukujxkxjugsgritotquqtoqjutxvvtvtvvwxuzu|u|y{yzwuxw}}€€€€€€€€€€€€xzv{v{vzvzv{u{uxzv{w~}€€€€€€€€€€~|}y|yxwkznpƒr~s{tzsytysxsytytytyuyuyuyuzt{s{t{tzs{r|r|r|t{t{tzr{rzrzsyszsys{s|r|r|szszs{s}tttt~tuss|syqtuu}}€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~|}v}s{qznwmtrwy|}|zyququrususutyxxxyszqvptpsqtspws{tzz}€€€€€€€€€€€€€€}}|zurpst~st}u}u}t|t{uytytzs|s|t{szszs{s|s{szs{r{q}r|r|r|r|r|r|s{s|t{u|t|u{u{v{u|s}r|s|uzuzu{u|s|r}q}s~t~u€sƒp…l‰r…{ƒ|~}}~|~{z€zx€v€wxy€yyz€zz‚z„y‚yy€yxxyxyz|‚|‚|‚|‚|‚zƒxƒxxxx~x~xxz|||xx|{x}u}u|u}ww~v~u}v~u~vv~w~x~y~y~xyyxx}w}w}ww~v~tmupwtxtvptjrjqnrnppvqwnvftdshtmuquqsnmirsvvvuvtvuvvvwuyuywzwzuuyx~~€€€€€€€€€€€€~rzp}s~t}t|t{tywvyq|y~€€€€€€€€€€~}z|x{xtvf}ll€o}qzrxrxsysysytytytyuzt{t{t{s|s|r}s}s|s{s|r|rzryryrzr{q{szs{r{s{r{szsysxswsxr{r~r€s€rrst~r|pzozqz}~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~{|w|szqxnuoquqzw~~|wvrtquqvsvuxyzv{vxyxuurtrsqtmwo|pzz}€€€€€€€€€€€€€€~~|zttqwx}u~t~s~s~r}r{tztzv{u|v|vzuytzt{s|s}r}q}r}q}r}r}q}q~q~r~t}u}t|t|t{v{v|v|t|s}r|r{tyuxuxuzs}s~r~rrs€t€t~s€oƒu„{„~€~{€z‚yƒy‚y€xx~y€yy‚zƒz‚zzz€yyyƒy„yƒx‚y€y€z€|€{€|€}||€y‚x‚x€wxx€x€x~{z~zy~zz{v}u~t~t~u~wvv}u}u~u~uvv~x|x|w~ww~x}x~x~w~v~v~v~w~tnuqwtvpugvduitnvmtjxlzkvgthsjsmtotqtnolquuxvxuxvxuxvwvwvxvyvzuu{x€€€€€€€€€€€€~}nzn}r}t{tzuzuzwtwq}{€€€€€€€€}~y|x{xrvl|oo{qyrxtxtytytyszszszszr{r|s|s{tztzu{s{r|r|r|s|r|r|r}s|t{sysysyszsztytxtxryqzpzp{p}p~r~s|r{ryr{q|p}m~o{{}€€€€€€€€€€€€€€€€€€€€€€€€€€|~{~€€€€€€€€€€€€€€€€€€€€€€€€€€}z{t{qzqwptoqrqwtz|}yyvwswsvtvttxvzuzu{wvussrrqtmwq{oy{}€€€€€€€€€€€€€€€}}}zuyo}u‚t€t}t|t~sr}s{szt|u}v|v{v{u|u}t}t}s|q|r|r|s}s~r}r~s~uut~r}r|r|s|s}r}rr~t}u{vztytytzt}t}s}s}r~r~st}t|r}pƒx‚|…{‚{€zyx€xzz~zzz€{€z€z€z{~{~{zyyy‚yzz|~}~}}}~}{€z€y€x}x~x€x~zy~v€u~yy{vzu|u}u}u|v|w|v}v}u|u|v}wxx~x|w|v}v}v}x|w|x}w~w~w~xx€tjtnuqtlxd{fyjuoumsjtkulsnsnsmsltnupuoqlruuxwwwuvuvvvvuxvzw{x{vu{y~}qxv|u|u|u{vzx{vvxv~}~{x~x{wtssyr{q|r|r}r}t|uzuyuytzszr|r|r}r}s|r{sztzsysyryrys{s}r}r~r}s|s{sysysytztztytzr|p~op~q|q|r|r{qzqzr{r|s}r|qxzz~~~|}x{}~}z{s{pzqxpuostrwsyy|}{}wywuyt{txwuyt{r{txrtsstsvozr|qz|~~}|zrzkt„s‚s~t|t}u}t|s{r{r|t}v|wzwzv|u}t}s{szryrzr{t}t}t~t~t~t~u}t|s|r{ryryr{r~ssu~v}v{uztzt{s~s€r€rr}r|r}s}s|s|r€p…t‡y‡{{|y}y~yz€{zz|||~|}}}|~|~|~|~|~|~{~z}{~|~|~}~~~~~~~~~~~|zz~yz~}}€v€u}zz{zzxzw{w{w{wzxzwzwzv{u{u{v|w}x~x~x}v}w}w~w|x{wzx{x|x~x€x€yshtltnuiwexgujpmpnqorprqtstssqupupvqtoplrvuyvwvuwtwtvwvzv|u|wzvv|{~}uzy{xzvzvzwzzzzx}z~~~yv}wytrvtxsyr{r~s~s}t|t{tytxtytyv{t}s}r}r|sztztztzszryqytxtxtxsxryszt{tztysyr{s}s|s|r}q}q}s|t{t{s}r~r~r}s}r}r}vzwuzw~}~~x~yzx~}}y{szq{uzsxqvuuxwxyz~}|xyttssxrytwusxrzpynxptrrtowtzvz~~~~{zoyfr…sƒr~t{t{u{uyvyu{t|t|u{vzvzu{s{s|r}s}r|r|s|t|u|u}u~u~u}t|t|r|r{sytyt{t|s}s}s}s{szsysxsyr{qr€rs}r{sztzuzv{u}t€p†vˆ{†{€z~z}z}z{~z~{}|}|}}~~}}}}~}~}}~}~|}||{|{}|~}~}~~~~~~~}}}||}|}{||y|{~u~x{zyzxyzxzzy{x|w}v~w}x{xzxzwzv|u~w~xx}y{yzy|y}y}x|wzvzx|x|y~yz€phsmvmwiwhulunuotmuovqurvuvuupvoupuqtoqnryu|v{vxvwwuwvvwvyu{w{uy||€€€€€€€€€€~}t}v{xzwzvzxyzvzu~|€€€€€€€€€|~x~v|vwtpytztzr{r{szuxuxuxtxuvuuvwvyt{t|s|sztxuwuxtzszszsysxtwuxvyuyt{t{szszrzr{s|s{s|r|r|s|t{u|t~s~s~s}t{s{s{t{xxzrxr|{~~~~€€€€€€€€€€€€€€€€€~v~xz|}}~~€€€€€€€€€€€€€€€€€€€€€€€€€€~z|u|t}z|xypynzo{ryu|y|zztwpsur{q|swxszo|m{nwospqutyxz~~€€€€€€€€€€€€€€~~}{twmzsƒq‚r~tztxvwvxvyv{t|t|t}t~t}t|szszs|t}u}u|u|uzv{v{v|u}t|t|s|r|r|r|s{t{u|u}t}s}r}r}r{syryqyq{r}s~s~s}t{tzuzvyv{v|u€s†l‹u†y‚|€{z€|~|~|}}}}}}}}~}~}~~~~~~~~}}}}}|}|}|~}€}€}€}~|}||}|~}~}~€xƒruyxwzvzvywzw|w}v~v~vv~x~y|y|y{x|x~x~x~x}y{yzyzyzx{x{v{v}vwyxysoupxmykzozvzxyvvsvrwrvpvotntltlsnsnsmpmryv|x{x{wzvxuwuxuxwzyzxx|}€€€€€€€€€€}~xzxywyvxwxyt~m|r~}€€€€€€€€€€z~v~vztssqysxtxtxtwtvvvtwuytxvwvvwvvwtwtytytytysyszqzq{q}r}s{tztzu{szs{rzrzr{r{r|t|u{u{t{s|r|s|r}r}r}r}t{szszs|s}s}v|szwz{{}{~|€€€€€€€€€€€€€€€€xƒr}xx{x{~}€€€€€€€€€€€€€€€€€€€€€€€€€€{zzw{x~|~}yrvkxkxmtmws|{|yzrvstwsyruxszozlwlvkslsqwwz|€€€€€€€€€€€€€€€~~|yqyqy€qq|sytxtxuxuxuxtyuyuyu{t|t{tzuzuyv{v{w{w{vyvyvyuzt{t|t}s}r|r|r|s|t|u~u~t~t}s|s|s|s{tztxtys{t}ts~s|t{tyvwvxvzv}u~t€ssƒq†vƒy…z|}|}|}|~|}{~|~|~|}~}~|~{}{}}}}}}~~~€}~}||}~yxyw|y~z~y|zyzwzwzvzvzv|w}x~v~v~vw€xxx~w}v|v}w}x|x|y|x|w{wzx|x|x|w~vw€w€vu‚vsxtypzlyqzx|zzxwrwpyn{lymvmtlslrmrnrnpktuxyxzx{v{vzvxvxvywzxyxw}}€€€€€€€€€€€€|{yvxvvytyvwzr|k|v~€€€€€€€€€~}x}t|uwqpuqzrxsxrxswtxtxszrzrzszuyuyvyuytzszt|t{szryqzq|pr€t~u{uzuyszszszszs{s{r|t|uzvytztzt{r{r{q{q{r|r{rztzs|r}p€s€p€o|tyxw|z€~~€~~~€€€„t‚q|uwzu{xy~}€€€€€€€€€€€€€€€€€€€€€€€€€€€~{ywvxuyx}||xymxkvnrnrsz{~|zvtsptrxntttvruntnsopnspxt|{€€€€€€€€€€€€€€~~|zr~o|sr{rysyszsytxtvtututvtxtzt{t|v|u|u{u{t|t{tzsytyuzu{t{s}s}r~s~s}t}t{t{s|s{tztytzt|t|t{tztzs{s|s}s}s|t{tzuyu{u{u|t|t}t}t}s€qƒs…x„y{}|~{{{|}|{||~~~}~|~||ywxvzzy{y|z|z|z|z~x~x|y{y{y|w|v|v|w{w{vyvzv{v|u|v|u~vvwvus~s}u|xzyzx{w{v{vzx{x|x}x~w}w~v~vu€vqwrvmuitlvsywwsulvjxh{i|k{nxquqtptptprlttxxwwwxvxwxwxxxxyxywwwu}}€€€€€€€€€€€€{zwywxuzs}q|wxys}{€€€€€€€€~|}w{tyssmpvr|rzrzpyqxsytzszs{tzs{s{s{sztytxuxuxuytysyszs|s~su}u|u|t{s{s{s|r}r|ryrxswuwuytzt{s{r{s{s{rzrzrzr{s{t|s|p€qo‚n}nvusyx}}~}}t}u|tzvxs{t}w{vyvvwsyrztz|~€€€€€€€€€€€€€€€€€€€€€€€€€€€€~{xwsxrwr{v}{}tzoumrpqvw{|}yzrwlzn|jvptrststsrsprstyv||€€€€€€€€€€€€€€~~}|us|tszsytzt{t{tzszsyszs{t{u|u~utt~t}s}t}t|t{sztzt|u|t|t~t}s}s}s|s|s{t{tzsztytytzt|t}u|t|tztzt{t|t}u~u~u}u|u|u}u}t|s}s|s|t}t€r„oˆv…{„yƒy{}}~~~~{~wy}{}}{}z|y{yzv{t|s~t~v~v~ww~x}x{x{x{w|w}w~w~x}xzwzuzt{t{uzu|v}v}w|v|t|r}s}u}w}x}w}w|v{wyxyyyyzx{x{w|w{w{v|vovoumujtlvnwowktgtetevfxixnxqvqvpvqvqsmsuwxwvxsxtxwwywzwyxxyt{s~|€€€€€€€€€€€€~~xwvzvzvzt}s~xuzu~}€€€€€€€€€~~}z}u{tysqopus{s{szsytytytztztzuztzszsyryrxsxuxuxuzs|t|t}t|t}t}v|u|t|t|t|t}s}r~r|szrxrwtxuyvzt{s|r}r|t|s|s|r|s|t}s}qn‚o€o€q}nttpxt||{yquvzvzvxvyvxvyuxvwvvuwuywr}y€€€€€€€€€€€€€€€€€€€€€€€€€€€€~~}x{r|o}m~o~x~z|pwktmtsxw{z|{vwpzqznvqrtrurtsrsqtrvxx||€€€€€€€€€€€€€€~~~€~~}us{~s|sxtwsys|s|t|t|t{t{t{t|t}s}s~t}s|s{sytxtxtytzs|r}s}t~s}s|r{rzrzr|s|t|v{vzuzu{u}v~vv~u}u|t{uzt|u~v~w~x~v}v~v~v~v}u|t|s|t|t}u€v‚t„u„zz~{w|v}y|z{{z|x|x|w|w{w{v{u{t|u}u|v|v|w}w~x|x{wzv{v~vw~w}x|x|w}v|u{w{xzx|x|x{vyuxtxszu|v}x~x~w~ww~x|xzyzyyyzxzxzxzyzxzxrzt{o{hzhwjujuetbtardshslupvrvqvpvqwqtkvqwvvuwtvvvyvzv{v{w{xw{w~€€€€€€€€€€€€~ywxyxzwzx{wzyn{v~€€€€€€€€~}|x{tztwrpvr|s}s{tzsxsyszt{t|u{u{tztxtwtututwuytzt|s|s~s~s~t}t~t}t|u{uzuzvztyuztzt{r{s{t|v{u{s{s{r|r|s{r{s{s|t|u}s}q}q}r|r|t{mvstws{zzwrvt{tzsztzs{s{sztytxtyw{zs~y€€€€€€€€€€€€€€€€€€€€€€€€€€€€~}w{q{m}i|k{r|z|vzoynyqxryv|{xxtwtxrvtruqupupsrptpwtw{|€€€€€€€€€€€€€€€~~~w{wz€t}sytwtyt{s|t|v|u{uzt{s{r{r{s{t{u{tytxswtxtzt{t|q}qq€q~q|rysxuxtyt{t{tzszs{s|t}vvuu}s}s|t|t}u~u}u~u}u|u|u{u|v}v}u}t|t{t{t{t|t~u€u€w~x{xzxywzwzx{w|v}u}u|t|t}s|r~t~t|u{vzv{u}u}u|t{t{u}v~w~w}w}v~v~v~w}x~y~xxv~u|uzuyvywzx{x{w}vv€w€x~x{xzwywzw|x}y~zz~}{|z|w|m{fwfugtgterdqgsmuqvrwswrvrvrvqrksruxvyuztyuyvzvyvywxwrzu~~€€€€€€€€€€€~}uxuyxyxxyv|q|n}z€€€€€€€€~~}{{tzqysuur|tt~t{tzsysyszu{u{uztzs{t{tztwtwtxuzuzsytys{t}t~s~s}s|s{t{szsztztzs{s|r}s}t}v|v|t|r{rzrysysyszszsysytytyszszs{r{s}kypxttzyw{n~r}sztytzt}t|tztwtvtxv|w{}}€€€€€€€€€€€€€€€€€€€€€€€€€€€€~~}{|v{p}kl}n}v}{~w{twsurusxw{wytwtturtttututstpupvsv{|€€€€€€€€€€€€€€~~~~~~~}|u{s{}x}v{v{u{tzs{tyuyuyuzt|t|t{tzu{u|v{u{t{t{t{u|u{u|s{s{s{szszswuxuxtztztztysyrzr{r{t{u|u|u{tytytzs{s|s{s{s{t{uzvxuxuzu|u}u}tztytxuzt|t€v€wv|u|u{v{xzxzx{x|v|v|u}u~t|s|t{t{t{uztytztzt|t|u{v|v|v|u|v{v{w{x{x|y~yw€w€vu~v}v|x{x{y{xzw{w}xyy}x{w{w{x|x|x~x~y€y~~~}|{{xyowivkumujtitltpvrvswsvrvrurtpplruwzxzxzwzvzuzvxwvxsxlys~~€€€€€€€€€€~~|tvtwvywxxu~m|s~}€€€€€€€€€€~~}y{qzpwrqvq|tu}vzvxtxtytztzuztytzs|t|sztxsxsyszryrwsyt{t|t}s|r{r{r{r|r{txtxtyt{t|s}s~s~s}s{r|s|r}r|tztyszq{p|pzryqxqzozp{q}r€m}o|s{y|t}kp~q{rzszs|s|r{szqyqzs}sz}~€€€€€€€€€€€€€€€€€€€€€€€€€€€~~}y{u|o~lno€t{~}zxttoqpntpzx{uyquqstsuvuxsuqpqpurx|}€€€€€€€€€€€€€€~~~~~~~~~|zuyp|zy|v{v{u{t{s{tysxtxuyu|v}v~v|v{v{v{u|t|s|s|s|t}t}u}t{uztytzs|q}r|r{sztyuyuzuzuzuzvxvxvyvyvzvzt|t}s|tztytzt|u{vyvxvzv|v|v|t|s|s|s{t|u~v~w~v|v{u{u|v|w|w|w|w|w|x|w~v|u{u{u{v|v|vzuzuzu{v}w~w~w~v}u|v|x|x{xzyzy|y~w~w}v}v}v~x~x}y{xxwwvxvzw|x}x|x{x|w}w}w}w~ww€w€~||y{xytxnwlulshsgrjsnurvswtwrvrustpolptvxwwxwwxvxuyuxuwvvvpxv~~€€€€€€€€€€}|qurytzuxxsyl{w€€€€€€€€€|~w|q{quqktozt{s}s{sysxswsxszs{s|s|s|t{sztytyszszrzrzszs{u|u|uzsyrzq{q|p|qzqzs{r|r|s|s|r}r}s|s|t|r}s}t|t|s}p~oo~q}p{ozo{o{q}ris€t~y|tynzq{qzqzrzq{q{q{q|q|q|s}yz}~€€€€€€€€€€€€€€€€€€€€€€€€€€||wzs|o~l‚kor~y~~yyrsnnpksmyv{xyuxswuvtwrwptnpqpwtz}~€€€€€€€€€€€€€€~~}zw{t}|x}u{uzuzt|s{s{r{s{u|v}v~ww}w{vzvzu{s{r|q}q|s|s|t|s}s}r}r}r}r}r}r|s{tzuzvzx{w{w|uztztyvyv{v}t}t~t}v|v|v}u~u}u{u{t|t}t}u}t}s}s~s}t}u|v|v|w{w{v}t}tuv~u}u|u{v|w~w}v}v|v|x{y{xyxywyvzx|wv€u€uv~v~x~x~x}w}w}w}w{wzwzw{w|w|x{xzwzvzvzvzw{wzwywxxyx{x|x|w|w~vv€~}y|tztysxnwjuhtfrdqisourvswswtwtwuwspmntsxuwwvwvwwvxuxtxuyttww~~€€€€€€€€€€||rxuzwyxvxmxm}z€€€€€€€€z~s{pzsssmxpzvzuztytwtvsvsxr{s|s|t|s{tztztzuzuzuzt{t|t}t~t}u|tzsysyszs{s|s|q|q~q~o~q~r|r{tztztztzr{r|r}s}s}r~rr~r}s{rzrzqzszs{o}t~s{zztxnzszryryrzrzrzszs{sztzv|}}~€€€€€€€€€€€€€€€€€€€€€€€€€€~{|u|roj‚hm|pzu}|}|xvrrqqtswuzzzywuvvutuqunrmpqpwvz~~€€€€€€€€€€€€€€~~y|x}zu‚t}t|t}t|s{s{s|s}t}u~uuu~u|t{t{s{s{s{s|r|r|r{r|t|s|s|s|s{s|s|s}s|u{u{u{u|u|u|t|t|tztzu{u{t|t|t}u~uv~v~v}u{s|s|s~s}t|u{v{u|u}u|uzvzvzvzv|v}u~vuttt~u}v}w~w}w|w|v|v|x{xzwzwzw{x|x}w~v|w|w{x}y}x~wv~v}w|wzxzxzxzx|w{w{w{w|v{u|v|v}w|w{v{wzxzy{y{x|wwx€~z|tzpyqxpwixfwfvetesjupwtxtxtwsxtxvxtrnruvxwxxyxxxwvvuwtxuxusxv~~€€€€€€€€€€}|sywzxxxwzq{t~}€€€€€€€€€~}~w|q|qzsrqqvuyvzuytxuwvxvyu{tztytytyrzs{t{uyuytytyt{t|s}t}t}u|uzszrzr|s{uzuzt{s|q}pqq}r{tztztztzr{r}r}r{s{s}sst~t}s}s|r{sysxmws{twzztvqxtzszrzrzrytzt{t{t{vzy{~~€€€€€€€€€€€€€€€€€€€€€€€€€€}z|t}q~mj}l|s{sxszw}}}{xtuqusvsyw{zwvtttssptosorprvx{€€€€€€€€€€€€€€~~}zy|x|x€v{v|t~t}t{szr{r}s~tuu~t}t|tzs{s|s|s}s|s|r|r}r}t}t|tztytztzu{t{t{vyvyuzu}s}t|t{szsztzt{tzu{u|u|u}v}v|v|u{s|s}t}s}t}u|u{u{u{u|t{uzuxvxvyw{w}v~vtt€t€u€vxx}w{w{w{v|v}v~v~u|u{v|w}v}w{xzyzx{x}x}x}w~v~v~w}xzxzxzx{w}v|v|w|w{vyvzv|v~ww~v|xzxyyzx{x}xx€y|p{mylxqwkvgxfuivjvivlvqwtwsvsvswtyuxssopxuzvzwzwzvxvvvuwuxuxnzv~€€€€€€€€€€}}p}r}wxzt{o}x€€€€€€€€~||u|p}qyqrqtuuytzswtvuwuxvytzsysysytyr{s}t}uztyszsytytwuwuxvyvzvztyryqypyryrytytztzt{s{r{r{sztxtxsyr|q}r}szszryr{s{s|s~r~r}q{szpyixrzuwzztpsqtxtysysysysyuyuzvzx{|z~€€€€€€€€€€€€€€€€€€€€€€€€€€}z{t{pzl{gzlytywtwtxz{~}{uyqxsvtvvzzzwyqwpvqtrtotlwn|y€€€€€€€€€€€€€€~~~}zv|s}{~yzv|u}u}u|tzt{t|t}u~u~u}t|t{tzszsztzszs{s{s|t}t~t~t}s{tztyuyuytxtxtwuwuwuyt{tztysysyszs}t~utu~u}t}t}t}t}t~uuv}v{vzv{u|t{t{tztzuzuyuzv{w|v}utt~u~u~v~v}w|vzuzu{v|v}vu~t}u{u{u}u}v{wzwzx|w}x~ww~w~v~v|wzxxxywzv{v{v{v{wyvxvwvzv~uu~u|vzwyxzx|w~xyzyj{i{kxpviwjwiuhwjxlwnvqwrwswswtxtxuxttoqvuzuyvywxvwvwxxxxywzozv€€€€€€€€€€}}q}s}xx}p|p~{€€€€€€€€}z|q{lzovmpppvswtxsxsxuxvwuwsys{s|t|u|t}u{uyvwvxtzrzryrwtuuuvwvyuzt{tytxsxqyqzszsztyuwuwtwsysyrxsys{s}r}s|szsysxsysyr{szq{rzrysynwkytzxx|{urrqtvtvswsxsxtxvyu{u|w{|w~|€€€€€€€€€€€€€€€€€€€€€€€€€€€€z}t|p}q~i‚f~o|wxwtwwx||~{~q{nwmtmxv|y{rxruqtrspukzj}x€€€€€€€€€€€€€€€€~~}ywtuy}y~yzxzvztzt|t|t}v{v|v|v}u}u|u|u|u{uztxsys{s}t}u~v}v|v|u{v{u{uzuztyswsvttutuuuwtyuytytzr{r}r}t}t}t|t|t|t{u{v|vv€u€u}tzuyuzuzuyuyu{u{v{v{v{v}v}u}t}t}t}u|u|t}t}t}t|t|t}u~v~v~v|wzvzuzu|v|v{w{w|x}x~x}x}x|x|v|w|w{xzwzw{v|v|w{wzxxxyxyw|vuu}v|v|v|w|x|x{x{x{y|xlzkznyqxlxjyhwjyjwmuovqvrwsxtxuxuxuxsuluqwvwuxtxsxtvvvwxw{u|p}x€€€€€€€€€€|}qs~ywm~q}€€€€€€€€€~}x{ozkyotlpsowswtwszsyuwvvuwtyrzs}t}t~u|u{vzuyuytzryrypyqyryszszt{s|s{szq{p}q}q}s{tzvxwwvwtyszs{s{s|s}s|sysxtytztztztzrzrzr{s{uzqwpxvz||}}vwsyuyuxuxtxtwsxtzt{t{uzxs}{€€€€€€€€€€€€€€€€€€€€€€€€€€€€~z}s~rx€t‚k€o~r}n{l|o|w~|}uzovktjvq{y{szovmtntqupyp|z€€€€€€€€€€€€€€€~~zyswy|w|wzxzwyuyt{s|s~v}v}v|v{uzuzt|u}v}vzvzuzs|s~s}t|uzvyvzw}v}u}v}v}u|tyuwwvwvwwwxwywzv{s|r|r|r{s{s{szs{szuzvyw{v~utu|tzuzuyvyvyvyuzt|t|u{u{u{u}u}t}t}s|t}t|s|s|s{s|s{s|t|u{vzwxwxwyvzu|u|v{w|w{w{w|w|x|y{x}w}v}v}w|x|x}x}x}x}x|xzy{y{x|w}v}v}v{wzwzx{x{x{x|y|z|ytxqyqyrypwovpwqwovnupvswtwtwtvsvswtvsrkrovtxsxrxsuususvwtzs{n|x||r}szxt|i|t~~|}v|p{ozptorvqwsxuxuztxtvtvsvrxryrzs{s|u|t}t}s}r}r|s{szsyszrzr{r|s|s|s|s{r|r|s|t|s}t}s{tytytytysysys{s{sztytytysytyuyuysyqzq|r~vk{oxwz{{}|wuvwwyvyvxuxsxrzs|t}v}w{xq|y{zyt{s}z~|to€k~l~j}lzp|z|yytvowowpyv{xzrwmtlvsxuxu|}~~~~~{xwr}w{yx{x|x{vzu{t|s}u}u|v{vzuytyszt{u{v{vzu{tzt{t{s|t|v|v}u~t~t}u}v|u|t{tzuyvxwxwxwyvzu{t{tzt{t{s{t{s{r~rtuvu~u}u{u{t|s|t|uzuyvxtzs{s{t{v{v}u~u~t}t|u{v{v{u{t|t{t{s{s{szuxwwvwwxwxvzu{u}v}w}v{u|u|v}w}y}y~xwv~w~x}x}x}w}w|w{wzw{x{w{w}w}v}u|v{w{x{x{x{x|y{{{}||z|w{u{tzw{z{yxuwrwrxtxuyuwtvsvsvsurrksowuxuxvvwtvrssqvqyqxp|zzxuwuxvtvo|y~{{u{rzrvqpwr|syuwuxtyszs{sysytwuvvvvxvyv{t|s}s~r~r~s~s|s{szsxsxsyszr|r|s{s{t{u{u{szsyryryrysxtvswszr{r|s|s|r}q}qzryuxuzszq|r}rug}m|v{yz|{usutvywxvwuwsxszs|u~v~x{yr}{{zyuyr|w~|{p‚j}ozownvnxt|{{wzrzrwrwv{{{vxoumvsxxxz|~~~~{vyn}t|wzxx{w|v|u|u|t}t}t}u{uzuzuzszs{t{t|t}u|tztzs{s}u~w~vvt}t|u|u}u}t|tztytxtzt{t}s}s}s|t{t{t{t{t{s}r~r€s€uvw~x}w{u{s{r|s|t{tzuxuyt{s{u}u~vvu}u|v{vyvzwzv{v|v{u{s{szsytxuwuyu{v|v|v|v}x~x~w}v}v}v}w}x|x|x}x}x}x}x~x~xx}w{w{w{v{v}v}v~v~v}v}v}w{w{wzw{x{x|x}~~}}y{tzrzw|{|zxvvrwrxuxtwsvrvsvsvruqqkpruxvyvzuysxsvutxtzsyr}{€€€€€€€€€€€€|yyxywysys}|€€€€€€€€€€|{ywwuvtptlzn}q{sxuxtxs{s}s}s|szsxtxuxuyv{u|t{s{rzs{s|s{tzsxsxswswtxsyszrzszu{u|tzsxrwqyr{r|r{s{s{r|r|r|s{r|q}p}q{sysyszs{r|s~t~v~k{n|u}w{{ytrsuuzvyvxvxsxsysytzuzwz{x}~€€€€€€€€€€€€€€€€€€€€€€€€€€€€}{{wyszuyv}{~v€l|pvquptpvryx|zzxyyv{v|||}{zvxqvqxuyw}}€€€€€€€€€€€€€€}~}{wtmxuwyuzx{x|w|v|v|v}t}s~t|t{t|s|s}s}s|s}s~t}s|s{s|s~u}v~v~v~u|u{v{u}u}v{uyuxsys{s}ssr~s}s|t|s|s}s}s}s|s|s|u|v|x{x{xzv{t{t}s}s~s}s|t|t|s|u|u|v|v|v{uzuztytztzu{u{t{t{s{s|t{u{v{v}v~u~u~v~w~x~xv€v€uv~w}w}w|v|w|x|x|y|y|x}x}v}v}w|v|v|v|u}v}v~vx€xw|w{w{x{x|x{~~||vzoymxsyxyvuotmuowswquntmuqururuqnniwp{t{u{t{t{u{tzwwytys}|€€€€€€€€€€€€~zywywxwrzv~~€€€€€€€€€~y|tytvvnwnzqysyuyvxvwwwvyvzt{szrysxsxtxuzu{szrzrzsztztztytxswszrzr{s{tyuytytzt{uyuwuwtyt|s~s}s}s|r{r{rztztzt{s{r{rzryrxrxsxuyuzu|l{n{w|vz{zvssuuytytxvxuyszszszuxxx|z}~€€€€€€€€€€€€€€€€€€€€€€€€€€€€}zzwwuutrrvv}||z{wusspsptsuw|{}|zwyuxwzz}}|{yuxpzo{r~|€€€€€€€€€€€€€€}~}|yupwxw{wzyyx{v}v}u}u}t}s}s|t|t|s|s|sztytzs{s|s|t{t{t|t|t}t}u}t}t|u{u{vzvyvyvyt{t|t{u|u|u}u}v|u{t|s|s}s}t|u|t|t|u}v|w{wzv{v|v|v}v}t}s}t}t|u|vzv{w{v{u{tzt{s|s}s}t~t~t~t~t}u}x}y}y~xvtt}u}v{x{x|w}v~vwx€xx~v~w}x}y|{{zzy|x}v~v}x|x|x}x{xzwxvzw}www}w|x|x{yyyw€y€u~p{kyjynxqvpulukunwpvnvjsjsnurvsvsopjxq}t|uzuyuyuytzuytvvu~}€€€€€€€€€€€€~vwsxxxwt{z€€€€€€€€~{~t|p{rvtnvqztyuyvxwxvxvyvzvyuxsxsysytxuxtys{r|q}r{s{u{uysytxtwuytzs|r}s|t{uzu{t|s{sysxsyszsztztzsyqxqxqxsyvzw{u|r|pzpxqyrzsztxtwtwnwk~t{ttzyusrttxrzq{r{r{s{r{qzsxxv~{~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€}xzsxqupsmtqzz~~|zvrtpsrtrttzy~|~t|mwqwvz|~}yvupxp|v}€€€€€€€€€€€€€€€~~~~{}s~y}zzxyxwzvzvzvzvyuyuytzt{t{t|s|s{tzuzt{u{v{v{v}u}s|r|r}s~ss~s}t}u|u{u{t|t}u}vzv{w{v|v}v|v{u|t|t}t}v}v|v}v~u~u~u}u|v|w|w}v}v}u}v}v}v{vzvyvzv{v|u}t}t|tzuzt{u~u€u€u€u~v|x{xzw{v}v}v~v~v~v|w{v{v|v|w}w}x~yyyy~x}y}z{y{yzzzy{xzw{w|x|xzxwwuvwvyw|w~w~w~w~w|wyxv{q{n{n{m{kykvkvlumvlwmxnwmujrjrmsouquqqmmttyuxvvuuuuuvvxvyvyux}}€€€€€€€€€€€€}uxuyzvzu~}€€€€€€€€€€~}zzrzoyrtooqsuryrysvtuvwvxvwvvuvtwtzu{vzvyvyt{t}r}s{tytytysztytwuvvwu{t}t|uzvzu{t|t|szrzqzqxswtwtxsyryryryrzt|t|t|s{rzrzs{s|s|szsxqylxp}v~szzzsuowt{r|r}r}r}s|t{s{t{yy~}€€€€€€€€€€€€€€€€€€€€€€€€€€€~|wyrwpvnultpxx}~~}}u|qxrvpuoys}{~{|suosrvw|{zvvpvo{w}€€€€€€€€€€€€€€€}}~}zwp{u|wvwrytzuxuxuyvxvxuyt{s|s|s|s|r|s|u|u{u{vzv|u|t}s|r}s|t}u|t|s}t~t~t|t{s{t|t|u|v|u}t}t}u}u}v|u}t~tuu}t|t{s{s{s{s|u}v}vvu~u~u}u}t|t{tzuzv{u|t}t}u|uzvzu{v{v|w}v}w}v|w{w{v{v{vzw{w|w}w{wzu{uzu{v|u}vv€w€x€yy~x}v|v{xyzyzxxwwwwxwzxzwxvvuvvxxzx}w~u~w}x|w{vzumunwqysynxjvjvmvpxrytzvytwqtmtkukvkukrisoxuytxswuvuuwvyvzxwxv~}€€€€€€€€€€€€~uvvwxs{w~€€€€€€€€€~~{yzszrwuprmuvutxrzsyuwvvvutvtvtvtwuwuzvywxwyvzu{t{szsxryryszs{txtxvxvyw{w{x{wzv{v|u}u~s}s|sztytxtwtwuxuzs{s{r|q{r|t}t|t|t|s}s}r}s{szqzs}t€q}yzuuqtuxuzt|t{t{u{v{v|v}w~|€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~}{txpvnvluluqwxz|~~|~uzryozlzq}x~}{xtvpvqzx{ywrvq{y~€€€€€€€€€€€€€€~~}{ssvtxtpqowt{u{u{v{v{v{v{u}t~t}s}s}q}r~u}v}v{u{t}t}t}u|u}t}u}t}s}s}s}t|u{uztzsysyt{t{t|s|r{r|s}t~u~u|u|t|t{t|s{rzrzr{r|s|u|u{wzvzvzv|u|t|u|u}v}v{vzu{u}u~v|w|v|v|v{wyw{w}v~v~w|xzwzvyvzuzuyvxwwvyvzvzvzwzv{v}vuv‚xx~x}w}w}w|wzwwwwxyx{x}xzxwxwxyx{x{x{v{x{w{x{x{upupvsxuytzrzoypzu|z~}~~}|ztujsfresfsfsfwjzp|p|pzsxuvxuzt~t{ww~}€€€€€€€€€€€€~xyxxwu|z~€€€€€€€€~|}w}s}uyvpupxuvuwuzuzvxwvvttuswtwtwuwuxuytytyuxuxuxuyszs{tzu{u{t{sytwvwwyvzvzwzwzu{t{s|s}u}u}v|uzsxrwswtxsysxrxsxsyu{u|t|q|q|q}r}s}tzswtwuyvsyxysumxvwyvzuytyuyvyvyxyzv}|€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~}ztxqwowlukumwszu}z~~{ywtvovmxqzx}~~wxupuozt}{zvys|{€€€€€€€€€€€€€€€€~}~~~|zt{yy{qxm}t}u{u|u|u|u{u|u~u~u}t|u|s|s|u}v}w}v~v~u}t|s{s|s|s|t{t{t|s}t}u|t{s{r{r{szt{t|s|r{r{s|t|vzuyuyuzu{u|u|u{u{t|t}t}v|vywvwvwxwzw|v|v|u|u{uzuyvzw{x|x{x|v}u~v|xyxzw{v{vzwxwxxywzwzxzxywywyvzvzwywwxwxxxzx}v€vx€y}z|y|x}x}w{wzw{x|y~y~x{wzwywzxzxzxzxzwzv{vzvyvqupurxvyxzvzo{n}u~|€€€€}|sxiuesfrhshsguewhzhzlxrxwxxwxwzwuxv~~€€€€€€€€€€€€zyzuyt}|€€€€€€€€€€~{}v~t}vxuptrvuxuyuzvyvywxvwvyvzuyuyuwuxuytxtytxuyuyuzs|r~s}u{uzs{s{u{vzvyu{t{u{v{u{s{s{r~t~t~u}u|t{rxswtwtxuxuztzu{t|t|s|r{r{q}s}u}u|rzrztytxxz{twoywvztzrzrztyuxvwxw{o}y€€€€€€€€€€€€€€€€€€€€€~}zxxuxswounupwqxpzu}|}|yvsprourwy{~zzwrwmyq|y}z|v~|€€€€€€€€€€€€€€€~~~xyy}xv|u|u{uyuxtys{t|u}u}u~u~t}t}t}s}u}t}u|v|v{u{u{tztztztztzuxuxvxvyuyuztzs{sztytztzsztzuzu{u{vzu{vzu{t|t|u}u~u~uuv~w|v{vyvyuzv}v~w}w|u{uztxtyuzv{v{w{w{u|u}w|w|w|w|w|w|w{v{w|w}x}x|x{wzvyvyu{wzwxxxxxxxx{w}w}v}w{w{x{x{x{x|x}x}y|z}y}y{xzwxxxwxwxvxvzvzvzuxuvvltltowu{yzxypyn|u~~€€€€}|sxjwhvkumrnqlpipgrhtlvrywzuxuyv{m{u~€€€€€€€€€€€}w}p|v~~€€€€€€€€€€~~y|u|uzxtumwpxsxuxuxvyvyxywywyuytztztytytysytxuxvyvzu|t~q}r}tzuytzs|t|u}t{t{szszsztzsztzr|s|s|t|u|u{uytxtyr{s|r}r|r|r|r|s{s|s}s}st€s~q~o~r~tz|{yxpwu|s~p}q|r|tzuyuwwyvv||€€€€€€€€€}|{||~~€€€€€€€€€~|{wztzrzpwqvvvxutvsxu||}{yqvovsu{y}~||szoxoyt{z{y~}€€€€€€€€€€€€€}}}€~~wzwzy~r}u|w|vzuzs{r|s}u}w}w}w|u|t}t}t}u}t}t}u{t{t{t{t{t{t|t|t|t{uyuyvyuzt{szszrzt{t|u{uzuyuyuzu{u{uzwyuzt{s}t}t~uuu~v}u|t|t{u{u{u|t}u}v}u|u|tzsyuyuzu{v|v}v~v~u~u~t}t}u}v}u}t|u}t|u}u|u{uzuzt{u|v|w|x{x{x{x{xyvyvxuyvzv{u{u|uu€v€v~w~xzyxyxxywzv{t{s{t{t{vzvyvwwivkuowv{z{yytxr{w~~€€€€~~}v|ozlymvorpropnpnppoqqvxxzuxtxsymzw~~€€€€€€€€€€~~~wqy~~€€€€€€€€€~}}x|t{uxvnsnxqxrwtwuxuyu{vzu{tzrzr{rztzsxswswuxwxwzv{t}s}r|s{s{tzt{tzt{t}t{t{s{szrzszrztzuyuxtzt|u{u{tzt{t{t{s{qzrzr{s}s}u|u}u}s}r}r}ozpxpys|u{||{ynwr{s}r~s~t|u{vzwyx{wz}~€€€€€€€€€~~}|v{t~|€€€€€€€€€€~~~{}v}t|u{qyrxvxwwtwswt{z~}|xwrupsvt|w||zytwpwqyxz{}~€€€€€€}|~|~~~€||~~~~~~yu{s{{nq{wyxzu{s}s~uv€w€x€wv~v}v}u~u~u~u~u~t}s|s{s{s|s}s~r~q~r}t|u{t|t}r{szt{u|u|u{uzuytytytxuxuyvyu{t|t~t~s~t~t~u}u{uztztzt{t{t{tzuyuzu|t~t}t{tztyt{t|u~v~u~t|s{s{uzw{w{w{u{u{tzu{v|w}v}u|t|u|w|x|z|y{y|x{xzxxxwxxwyu{t|t}uu~u~t~u}v{xyxxx{w~ut~s}t{t{v{v{w|ykxnxuzy|{{z{w{w|{~~€€€€~~{wxqwmxmvotpuprqrqqtnvqxvxyvxuwvwoyw~~€€€€€€€€€€~~~~z€v|€€€€€€€€~~{~v~s{uwsmpptrvtwuwwxvyuzuzt{t{r|t~t~t}t|szsyuyvxuxuxtys{r}q~q|s{tyuyuzt|s{s{tyuxuxtzs{szvyvyvzvzwywxxyx|w|v|u{szszs{t|t|u|t}t|s|r{r{lypxryt{v|~|zrnrus|s}u|vzwxwyvzy|{}~~€€€€€€€€~~}}v}t~|€€€€€€€€€€~~~z}v}w|z{vxrwswtxuyuwwvy{}~|ytwouqrutxz{}|zvwruswyx~}€€€€€~}zzw{w}|~~~~~~~~~~~~~xxwvy{m{gn}uxwxvzu}v~v€v€vvv~v}u|u}v~v~v~u~t}t~t~t~t}t|s|r|r|r{t{t{u|u}u|v{w{v|v|w|uzu{r{r{rytytzuzu{uzv{u{t{s{t|u{vzvyuzt{t{t}t}t|t{v{v|u~t~s~s}t|t|t}u}v|w{vzvywyxzy{y{y{x{wzvywyw{w}w~w}v{xzyzz|z}y|y{yyyyzyzzxzx{w{u|u|v{wzwzv{w|x|x{xyxzw{v|t}u|w{x{yzyzz{xrysyx{{}||||{}|~~€€€€~{wvqwqxpwpvntmqmqoqrrsvtyvywwxvyruxx€€€€€€€€€€|y~€€€€€€€€€€~z~t~s{utthvmzrwvxwxxxvxtxryr{s}uuuu}t|t{uyuxuwuvtvuwtys|r|s{txuwuxuzuztztyuxtwsxrysztyuyuzv{wzwxwvwwtzu|t~u~t}s|rzrysys{r}r}r|s|t}n|r{szuzxy}|}zsmstsyszuyvxvwvwuzx|€~€€€€€€€€~|}w}w~€€€€€€€€€€}{{wzw}||{{uysxsxtysyrwtyw|||x|pzoxmxp{w~|{zutqrruvz|~€€€€}{{v{v|z€~zvvux{krmzq}t{wyvzu|t|t|t{u{u|v{u|t}suuv}v{v{w|v}v|v{v{u{u|t|t{t|u~uu~v|w{w|w~xw~u}t}s}s|s{t{t|u|u|u{vzvzuzu{u{u{vzv{w{w{x{w|v}u}v}v}v|v}u}u|t{tztzt{u}v}w}w|w{xzw{wywzwzxzxywywxvyv{u{v{wzwyx{w|w~v~w~x|zzz{z{x{xzwzx{x{x{xzxyw|x|x|x{xzxzxyvyu{v|w{y{yy{x|xxpysyw{z}|~}~~€€€€€€~|wzqzp{pymwktiqipkolontrvuvwvxvxstyz€€€€€€€€€€€~}€€€€€€€€€€~~y~t}uzvsrnws{vyvxvyvyuxtwrxrzs}t~u~u|uzvzwzwywwvvwuuvvvuyr{r}t{uxwxvyvytyuwtxtxsyszsztztxsytytzuyuwuwuxszt|t|t}t|r|r{ryrys{r~rq~q{sznxqyqysyxv~{}{vtvwvwuxuxuwtwuwvyx~~€€€€€€€€{~x~z~€€€€€€€€€€~{{x{y}}~{~v|uytzrzpynxszw}{{wyswnwoxv{y}{wtroqput{|€€€€|~x|w|z~€€€€€€€~xwptu|e~h€p€rv|x{u{u{u{u{v{v|w{v{v{u~u~u|wzwxwyv{v{v{w{w{v}uts~s}s}t}u}u}v|x|x{x{x|u}t}t|u{uzuzu{u{v{v{vzvzv{u|u|v|w{x{x|x|x{v{u|t|t|t|t|u~v~u}u|u|t|t|t}u~v~v}w|w{w{vzwxwxwxwyw{x{w|w{v{w{v{u{u{t}u~w~x~x}y{xzxzwywwwwxxy{y{y{xzxzxzwzw{xyyxxyvyu{v{u{v{vzxzyzwlwmwryx}|~~~~€€€€€€~}wzowmvntmslsktktlqnmqotruuwuxvwus|z€€€€€€€€€€€€€€€€€€€~w~t}vzvqsrwwyxxvxuxtwuvuvtxtzt{t{t{s|t{u{t{t{tztyuxvvuvuwuwvxvwvwuytztxrxrxrzrzszsztytztzsztytytytysytyuzuzv{u{t{s}r}r|rzuyv{u}sr}s|nyswtwuyx}~~~|wwwxwyuzt{sysxuxvyx{{}€€€€€€€€}{~x{€€€€€€€€€€€~|}z}z|z~}~||yxuxuxsxowrwt{z}}|zxtsusxuzz{{yvqsqurzz€€€~z}x}z~€€€€€€~~yxmqt{g‚do€o€r~w}v|u{u{v{w|w}v}w{x{x|w}x|wzwxuys{s|t{v{w|wuu~t{s{r{sztzvyvyvzvyv{u{t|t|u|u|w{v{v{u|v|v{v{u{t{s}s}u}w{x|x|xzw{u|t|s|t}t}t~uw~w}x}x}w|vzuzu{w|w|x{wzwzwzvzuzvywxxyxzx|w|v|w|w|v|u|u{v{w|w|x|x{xzxzxyxyxzxyx|w|w|w{wywzv|u|wywxvxuzu{u{uzv{w|x|x|wivlwsyx}|}}}|}|~~€€€€€€|wxoumrnqqqpsovpxpwpssqxsztyuzvyuv{{€€€€€€€€€€€€€€€€€€€€€€|w~t|vxrpprvwwwxvyuytyuwwwwwwyvyuzuyuzuytysyrzsytxwwwwuxtxtytytyrytyuxuwuxtxtysysxtwtxtzszsyswswsyszrzrzrzs{t{uztzt{t|t{t{uyuyt{t|s}t~s{tyu{s~t€|~}xsvtuxrzq|q|qztxwwwy|}€€€€€€€€€~~}~€€€€€€€€€€}||{|z|x{w}|}{{v{tyszoxpuqww|}}}wysuwr{w|||vvtrrqxw~~€€€€~}}{}{~~€€€€~}~{xqpvyr}r|v|x{x{v|u}t~u|vzwzw{v}v}w|w|v|v}v{vytys{s|t}u~v~vu~u|t{s{r|s{uyuwuxtxuxtzt{s|s|s{u{v{w|w|v|v|u|t}t}s}s~s}t|u|w|w{xzwzuzu{u|vvu€v~x|x|y|x|v{vyuyu{u{v{vywwvwvxu{s|t{vyxxxzx}v~u|u|v}w~w}w{wzw|x}x}x|w{w{x}y~x~x|w|v|u}u}u|u|u}u|v{vzwzw{w|w|v|v}w}x}x}xoxryw|z}|}}|{|{~~|xwqwmtmsnrospuovovmsqrxs}s{uyxxxt||~~{~w~u{vuppstywyvywzv{u{vzuyvxvywyvzvxvyuxtxsxrwrwswuwvxtzs{r|s|t|s{tzvxvwwwuxtysxrwswsxsxrxtwtvtwtxtxtxrzqzr{rzsxtxtyuzv{u{u{tztytxuyvyvyvzt|qp‚{~~xvswszq|q}s|tyvvyuzq}z}|}{}{|xzryt}|~~{~u~r}m{nuntrxy}}~{|vxsvvxw{y{yxtsqwu}}~~~~~}{}}~x|u{w}th}rzuyu{u}t}r|t|u{u{u|u}v|v|u{u|u}v}u|u{u{u{u{v{t|t}s|s{s{r|r}s{tyuxtxsytyt{t{s}r}r|s|u{v{vzuztzs{s|s|s|s|t|t{t{vzwywzwzvzvywyx|x~xw~u|u|vzwyvzv{u{v|w{w{vzv{uyuyt{s}t~v|xzy{x}w~v}u|v|v}w|wzwywyw{w|x|x|w}www~v}v|v|u}v}w|wzxzw{x|w|w{wxxxxzx{w}x}w}w~wswtxw{z||~~}||{~~|xyrxowkwhugxhxixlvkqonwp{szuzxuyp}z~y~u}u{tuqswu{uzuzuyvyuzuzuyuxsxtzt{u{t{szsyszsxtytytxtxszr|r}t{uzvyvyvxvyuzt{s{r{qzqyrxtytyuyuywxwxvwuxtzr|s}s|tztxuxvzw{u}t|szsxuwwwxuxxw{w|u}u|~~zysxs{r~s~u~v|wzx|wy}|}||{}y{uynvlwt}}~zv€q}pvrssvw{|}~x|pyoxqyt|z{xwqxt~}~~z~|~}wzp{vv€ik|oysyt{s}q~u}u}t~t~v~v}v|u{u|v}u}u}v|w}x|x{wzvzt{u{u|t}s}t{tzvyuytztzuzv|w~uts~s}u|v{wywxvyuztzt{t|t|u}v}x|w{xwwxvzu|u{wzw{x|x}w}u|u{vxwxwyu|u|v|w|x}w~v~v{uxuzu|uvv|w{wzwzxzx{x{w|v|v|w|w}w}w{wzwzv{v}v~w~v|vzwyxzyzyzxxxxvzw{w{w{wzxyxyxzw|x|x{yzuoupvsyw{{}|||||~~€€}|w{qznylyixhxhwivkujqoouryuzxzztzp}{€€€€€€€€€€€€€€€€€€€€€€}xt}txrsptvtzsytyuxvxuyuzuztysyszu{vzuztxsxsxtxuwuxtwtvuwuwuyuztztytytxuyuytzt|s}q}r}s|u}u}t~t}t|u{u{u|t{t{t{u|v|uzvzuzu{u{t{szrysyuzw{v|u|v|w{z{{z~~|zwrxvwzv|w|v|u{wzwv||€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€|z|z|z|wzqvnuoyw}}~€{€u€r}pypxuxy}|~{}qymwmxo{w|zytxu~|€€€€€€€€€€€€€€€€€€€€}€y|~|tvrzw}y|w{t{q{rzt{t}qsu€t€tt~u|vzvzuzvzu{vzv|v~v}v|v{v{t{t}t~s~r}t|t{v{v{vzvywxw{w~u€stu}u|v{vyvxvyvzv{v|u|t{t{v|w}w}w|v{u{t|u}v}w}w}w~v~w}v|wywyvzu{u|v|w|w}w~v}w{wxxzw|v~v~t{tyuxuxvyv{w|v}u}u|v|w|w}w}v{wzw|w~w€v€v|uyvwvxwzw|v{v{w{xzyyxyxzwzvywxwywzxyzwwovnwpxuzy|{|{||~~~~~~~~||x|t|qzpxovltktkvoynxowsxuywzx{s{t~|€€€€€€€€€€€€€€€€€€€€€€€€€|xu~txpusxvwxuzuzvxwwwwuyuztzsytyuzvzvxuwuvtxtyuxtxtwtvtwwxvxuytzszs{tytxuvvvvwuytzt{t{t{s|s{s{t|u|t|u|t{t{u{t|v{vzv{v{uzuztzs{rzrzs{t|s}s|s|s|w|uy|}}{wpytxxwywywzw{yzxv}}€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~|}{|{{xxsunulyq}y~}{x|r}o|nyrwuzw~||xzqxnyp{w|{ywyw~|€€€€€€€€€€€€€€€€€€€~{}v|z|{rxs{u}u~n{uzyyxxwxtzt~u~w~ut~t|t{vzvyvyvyvywyv{v|u}t|u|t|s|s|r|r|r{s{s|t|u{uztzt{u~t€t€s€t~v|w{w{v{t{t{uzvzw{u{tztzvzw|w}v|u{t{u|uu€uu}v}uu~u|v{vzvzu{t|u|v{v|v}v}v|v{v{v}v}v{uyuxtyt{u{w|x|x}u}u}u}v|v}w}v}v}w}w~w}w}w|vzvyvyv{v{v{wzxyywywxxwzvzvyvyvzw{x{x{xmxlvmwryx{z|z|{~}}|{z{z|{|{|z|y{xzwxuuosnwuxuxtwtxvyv{v{o{t~}€€€€€€€€€€€€€€€€€€€€€€€€€€€|ƒwu}uwpwryvxwvyvxvxvwvwuwuxuwtvtvtxuyuyvxwxwyw{wztytxtxtyvzvzwyt{t|s}s|txwuwtvuvvtvtwtxtxsxsxszt{v{u|v|u|t{t{tyuwuvwwxxxyvytzr{s|s{uyvytzs{r|q|t|syy|~|wswuwxuxvxxyyx{w{x~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€{|}z{uvpsnvmyq{u}{~}{~u}o|jylxqxt|{~|}v{rzs{x{|xxzw}|€€€€€€€€€€€€€€€€€€€~|zwzxu{l„u€w}u~nyrxvrxp|w{yx{w|w|w}u|t}t|t|t{t{uyvxwwwwvyuztztztztzs{q|q|r|s{tyuxtxtxtzs|t}t}t}t}t}u}v|w|w|u}u}w{wzw{u{u{vzwzwzvztytyvyw|w~v~v}u{v{t|t}t|t}u|v|u|tztyuyvzw|w}x|v|vzwzwzvyvzvzv{v}w}x|xzwzu|s}s|t|v|x|x|x|x{xzxzx{x|x}x|x{xzwzwzxyxxxxwxwywzwzwyxyxzy{yzyxxlxjwkwlxsyw{x|z}|||{y{y{{||~}}}|{{yzxvrqruvwuwtvsvtvvwwwq{u~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~€{v}u{vtruuvwtwswtxtyu{vzvxuwuwvwvxwxvzvzv{v{v{u{tytxtxuytzuzuyvxvzu|s}s|tzvvvuutvvuvwuvtwuwvwxwyxzxzwzvzuzt{tztytxuwvvvwvxvyu{t{s{sztxswtxuwvxuxuysxz|~zxywywvxvzwzyx|u~z~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~~{~|}{{vwrtrtrwszu{x}}~~{}uzkwlxpxtzw}|~{|tzu{x|yys{s||€€€€€€€€€€€€€€€€€€€€~~{|zu|j†u‚y|xzpqoxq{qxus{r~vyyu{t|u|u}t~tt|s|tzuyuxvxuxuytzu{u|u|t|t|t|t}t|t{vztytyt{t|t}t}t|t|t{t{v{u{v|u}u}u|v{w{v{v{v{v{vzu{tzt{v{w|x|w|w|v{v{v|v{u{u{u|v|tzuwuvuwvzw|v~u}t}t|u|u|t}t}u|v{w{x|x|vzu{s|t}t}u|w|w|w|v{uzuzw{x}x~yy}y{xzwzw{x{x|w{v{wzw|v{uyvywyyzzzz{xpxmvkulvowtyw{y|{|{{z{z||}}~~}}{{xxsssvwxvxtxsxtwvvuuqzx~~€€€€€€€€€€€€€€€€€€€€€€€€€€}~w|t|uyuuuuyuzuytytzt|t~v}w{wxwxuzu{v|w|v|v|u{tzsysytxtwvwuyuyvwwwwxwzt|t}t}v{vzvyuxvwwtwswuxwxywzwzvyvxvwuwtyt{t|t|tzuwvuwvvwvyu{tzszr{oztxxvxwwyu|u}{}|z{vzuxxwzv{wz{v|{€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~}{}{}z}w}p{kylxszwzw{y}}~~||v{tzsyryqzw~}}z|x}x{vzn{q}{€€€€€€€€€€€€€€€€€€€€€€€~€~€x‚j€qyyxymum{n}m}qxxml~wz|v|v|v{u}t}t|tzuzu{u{t{t{tzuzuzu{u{u|w|w}w}u}u}v}u|t}t}t~u}u|u|u{t{tzu{tztyt{t|t}v}w}w|v|v{v|u{u{u{v{vzwzvzv{v|w}w~x}x|x{x|w|w}v{wxvyvyv|v~v€t€st|t|u|u~u~u|v{w{x{x{yzxzw|v|w|w{wzv{v}v|u{u{v|v}w}x|x{x{wzwzxzyyxzv|v}w}x|x{xzwyvyv{w~xwsuntltlunwsyx{z|{|{|{}|~}~~}}{ywtqrwxwxxxxvxuxuxqwm{x€€€€€€€€€€€€€€€€€€€€€€€€€~}{{vzsztvqsswwwxwxuytyvxuywyyxyxxxvyuyuyvyvyvxvxuyuzuzvxuwuwtxtwuvwvwxu{t|t~t~v|u{uzuyuxvxwxuyvyuyvxvvvuwtwtvuuyt|u|uzuyvxvwxwwxvyvzvyt{s}o|ryuyvzu|t~v€}}}xyvwvxvyuyxwzt|{€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~}|}|}||zx€r‚nu{y|y{x{y}}{~w}u{s{p{u}|~~{}z{yzv|y~~€€€€€€€€€€€€€€€€€€€€€€€€€€€~€~~y{{z|m{k}m|k}l|p}ozwz}z{zy{v|u}t}t|t|u}v|v|v|u|t}v|v|vzu{u{u{u|u|u|v}u}uuu~u}v{w{w|w|v}v|vzvzuyt{t|u|u}v}v}w}v|u|u|vyvxwxvywzvyvzw{w}w}w|wzw|w}x~w}w{v{v{v|w|vu€u€t|uzuzvzv{w{wzwzwzxzxzyzyzxzvzvywxwxxyw{v}v}u}v}v|v{w|w|w|v|v}v|u{t{t|t|u|wzxzyzyywyvzw|y}yqvjuiuluovszx||}}}||{}|~}~}~}~~}}{zwtprwxxwyxxwxvys|l{j}x€€€€€€€€€€€€€€€€€€€€€€€€€}}z|v|uzvstpxsysyuyuzvywxvvwvwwwwuwuwtvuuwuwuvuvwvzv{vzuyuxtxtwtwtvvwvyu{s|t}u|w{uzt{t{u{vzwzvzvyuyuyuxtxuwuwtxtzszryrysxtzu{v{wzwywzvzt{tzqyrytyvzu}ss|~}|wywxuztyuyxwzs}z€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~~}~}}}~}}~{‚{~{}z}y|y|z~}~~|~{}y}x}y}{~~~~~~~}~~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~y|{|}mp~vzryvxxyy|z{{z|w{yz{y|x|w}v}v~w}v{uzu{t}v}w}w}v}v{tztztzt|uu€u€uu}t}u|v{xzyzxzxywxwxvxu{t}t}t}u|v{w|v}u|u|vyvxvxuyv{vyvzv{v{w{wywywzw|x~w}w|v{vzv{v{v{t|s|t|v|v{w{wzxzx{w{w|w|w{w{v{u{u{vzwywywyvzvzu|u|u{vzwyw{w|w|w|w}v|v{u{u{v{vzvywzy{z{x|w|w|x}yvwmvjvkvlvsyx|{}||{|{}}}}}||||{}}}}|{wtntvxxwzvxwwwwuynym|x€€€€€€€€€€€€€€€€€€€€€€€€€}~zv~v|uussxs{r{s{uyvxwvvvvvvwwwwwwuvvwuxvwwvxuyuzwyvxuxtxuxuwuvvvvxvzwzvzwzwzwzvyvyuxuzvzv{vzwxvyvyuyszuyuxtwswrxrxrxtwuxwyxyxyxwwvuvvvvwuxuxvwwwvyu{t}u{~~~}sxtzs{s{tzwxwu{{€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~}~~~~€€€~}~|}x}y}y~{~~~~~|~}~~~~~}~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~}~~~~}}~~|x|uvx‚x†xƒ|€}~}}{|{|y|x{w{w{yzy{zzzz{xywxwwtxuyt|u~u~u}u|s|s|t|v{v{vzvxvwvwwwwywzv{v|v|v|v{w{v|v|u|uyuyuzvzvyvwvxuzv{vzwzw|x}xx~w}u|u{v|v{vztzs|s}v~w}x{xzxyxywzx|x{x{v{vzvyvyv{v|v{vyvyvzv{vzvyuxvxw{w}wwxx}x{xzxzx|x|x{xzxzx|w{x{yz{{{ywqwmxmxoxtyx|z|{|{}}~~~}}|||{{||}||{wvmxtzvyxwxvvwuwsotn{z€€€€€€€€€€€€€€€€€€€€€€€€€}~yv}uysrrsvuwswtxuxuxvwvwwvwvxuwvwwwxuxvytytysytxuwvxwyuyuyuxvwvxvxuxvyvxwwxvwvwwvwvvuwvwvxwxwxvyuzt{t|t|uyuwtwsxrxsxtwwwxxxxxxwvvtvsvtwwvxtxuvvuvwtzt}k~{~~}ryrzs{s{s{tzsyz}€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~~€€€€€€€€~}~|~|}{}y~z~|~~€€~}~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~€€€}w~wyz||€z~y|{z|y}y~z|{{zzyzx|y|x|x|w{v{wzv{w{x{wzv{v{u{u|u}u}w}w~w~u}t}t{uzvywxwwwxvyuzu{v|v}w~w}w{u{tztzu|v|v{u{u|u}u~u}v}w{wywxwywzxzx{x{wzwxwxwzvzvxvwwxxzx|x{wyvxuxvyw{x}y~y}y|xzxyxyyzx{x|xzxyx{xzyxxxwz|zztzpypytyw{y|z|{}|~}~}}}~}|{z{||~}|{xwnvs{uyuvwtwtwtunwr}|€€€€€€€€€€€€€€€€€€€€€€€€~|}w}u|wyrspttuuuwvwwxwxwyvxuwwvxvxuvvuxs{t|s{txtxtwuxvzwzwzwywxvyvyuyuyvzvxwxwwvxvxuxvwvwvwwxvxuxvyvzw{v{vzvxvxtzs|r{szuwxvxwwxvytxuwuuuvuxsxsuuuuuuwszs{qzz}~~wwrwsxryrzt|u{|~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~€€€€€€€€~}~~~~~}}|}{}{~}€€€€€~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~~|yzx|{~|~}~}}z||{}z~z~z}z{{z{yzyz{y{y|z}z~y|x{vzwzw{xyxzxywzw{vzuyuzu|w|w|xzwyvyuyvywzwzwzw|u}u~u~u|vzvxvxvyv{w|x}x}x|w{wzxzxxxxxwwxxyx{y{xyxyuyvzw|x{yyxxwyv{w|wzxywyxzxzxyxyxxwxvwux}|{wztzvzx{y|{}|~}~~~}||}}~~}|{{||~~}|wumrsxvxvvwtwrxsvnyt~}€€€€€€€€€€€€€€€€€€€€€€€~|w~v}v{ouptttwtztzvzwyxzw{vzwywxvwsxs{s}u|uzuxuyuyv{w|w|v{wzwywyvywxvxwwwvwvwvvxtztzuzvxwxvxuxtxuwuxvzu{uzwxvyu{t|t|t{uzuytzs{s{s{uyvxwvwuvsvrxtwvwwvxvxtx{}~~yxtwswryszx{|{~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~~~~~~€€€€€€~~~~~~~~~}~|}{~}~~€~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~~}}x}w~z~}~}~{~u~s}x{{{}z|z|z{yzyxyxxwxxxyyxywzwyvxvxwwxwyv{v{v}v|w|w{vzuyuyvywzxzxyyyxzx{x{xzyyyxxxxxwxwyx{y|y}y|x}w~v~v|vzwyw{w}y}y{xxxvxvyxyyyzxzwzvzvy}|{yzxzx{z{z|{||}}~~~}zzyz||{|{|}}~~}|wultsyv{vzuxuwvvupyu~~€€€€€€€€€€€€€€€€€€€€€€€€€~~z€vu|uvoqur|s}s}t|u{u|v|w{vywvvvvwt{s}s|t{vxuvtwtyvzw{w{vzvxwuxuxuwvuxuwtwvxvyv{t|s}s|u{vxwvwuuuuuswtxtytyvyvyuytysztyuzuzu{r{rzrztyuxvvwswqwtxvxwwwvyuyuy|}~~{{xzuzsyvyxx{{~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~~~~~~}~~€€€€€€€€~~~~~~~~~~~~~|~|~~~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~~{wzt{u}y~{~z}w}t}s|x|yyzx|x~v~v~w}x}x|w{wzvzwzxzyyzxzxyzx|x}w{wzwxwxwxxzw{w|w}w}x|w{v{u{v|w|w|w|x|x{y{xxxxwxwzx|y}x}w}v|vz}||z{yzy|{|{|{||}|~~}|xyuzw|z|{{}}~}}{yvpuvyvzwyvyuywyvt{x~€€€€€€€€€€€€€€€€€€€€€€€}}x|t{uytpsozs|s|t{t{u{t|u{vzuxuwtwuxuyuzuxtxvwwxwxwxxxxxwyvyvywxxwyuyuxwuzt{uzvywwwwvwuxtyuxvwwwwwuxtxtvuuuvuwuxuwtvtvtvvxvxvxtysxrxswtwuuvruovrwvvxuyt{szvy}~}}{{wzuywxyx{{€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~~~}{~}€€€€€€€€~~~}~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€}}z{zz}|}|~|~|zx~z}|{~zz|{yzyxywyxy{z{zzzy{yzyzxzwxvxwxxyyzyzyzyxzxyxyyxzx|x}x~x|xzxyxz{z|{}||||||{|{}|}|}}|{yxwzw|y{{{}}~}|{xupsuwvwwvwwwyxyvv|y~€€€€€€€€€€€€€€€€€€€€€€€~|}w}s|twrqvq{uzuxwvwvwvvxuyuzvyvwuwtysysytxuwvwvwvwwwvyuzv{vzwzw{wyxzxywzu{uztzuzwywxvwuxvwwxxxxxwxvyuxtwtvtwtyu|uzuxuvuvvyvzvzvzuztxtysytxuwsrurwuvwvxvvuuww{{~~|zxyuxvxxx||€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~~{~€€€€€€€€€€€€€€~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~€€~|{xyx}yz|{~z|y|z{{z{yzyyzxyzxzx{yzzxzwzvxwyyx{x|x{xxxxyzyvzy|{}|}}}|}|}|~~~~}{zzzx{y{{{~~~~|ztvjxrztxuwuyu{t|ry{y~~}z}u}t}uysvxuzwxuvvsyryrxuwxvywyxxxyv{u{t{u{sztxuxuvvwuyt{t|u|v|w}w|v{v{tzsytytzt}v~v~v}v|w|x{w{uztzu{uzuzuyuyu{w{vyvxuwtxuzu{u{tytysyrzq{tzwyxtxtxwwwvwvvvwwxrw}~~wzw{uzuzvy{}~|~~~~~~~€€€€€€~~~}{{y|{|}{~z~x|v|vz{xxy{zyy{zszx{z}|~}~~~}}|~}~~~~}|zzz{z}|~}|{zurpmxszuwvvvyu{u{sv{z~~~y~u}t|wxwu{u|uysxsvutvswuuwwxxwxwxyxzxzwywyvztztyuwwwwwwywzw|w~wv~vzuytwtwuxwywzv{v|w{w|x{wyvyuyuzt{u{vxuxuxtzu{uxvxuwwxwzv{uztxrwrwqyr{v{zy}xzyx{w{v{uytyuzpx{|x{xzxzxywwz|}|}|}}~||~~~}~}~~~~~€~~~~z|u}s{x|{}}}|}|~}~}~}~}}|{|{|{|x|q|i{jzsxvxuxvywywxrxr|y€€€€€€€€€€€€€€€€€€€€€€€}~x~t}tzvuwtzvzvyuxuxuxuwuwvwwxwxwxvywywyxxxywzvzuyuxvxvxwwwwvxvzvzuzvwwuvvvxwywywyuzuyvxwwxuyrxtxuwxvyvxtwsvsxtytzuyvxvxxxwywzvyuytyszs{u}v|yzxzwzv{v{w{wzuyuxts{{yywwwyxywv{|€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~}~{}z~|~}~€€€€€€€€€€€€€€€€~€€€€€~~}}|}|}}~}~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~xrzx|{}|}|}}}|}|~}~~}}z|u}mhk}pzsxuwvvwwxxwwpxr}z€€€€€€€€€€€€€€€€€€€€€€€|~w|s{tystrswuwvwxvxxxywywywyvywywxwzv{v{wzwzwzvyvzuztysxtwtwtwuwtxuwuwuvuxu{u|uzvxvwwvvvvvvwvwuxuytytytztzsysytytzuzuyuyu{t|uzuzvzu{tzuzwzw{w|r{qzuyvywyuxtwuxvw}}{xxuxuzvzt~|€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~|}~~~|~~€€€€€€€€€€€€€€€€€~€€~~~}|{|{}}~}~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€vqyw||~~}}}||{}|~}~~~~}}y|p}i~k}qytwuvuwuwvvwuxvxurxu~|€€€€€€€€€€€€€€€€€€€€€€~{~w|t{twqsstxuyvxxxxxxxxyxzw{w{wzxyx{w|v}vzwxxxwyv{u{tzuxuvvvvuvuvuwwvwvwtys{s{tyvwxvwuuvsxrzs{s|s{sysxszr{s{s{tzs{t{tzuzu{s{t|u{u{wzvyvywzw|v|uzsvwtwuvvtxsytyxx}}€~|{rzqzsys~}€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~~~}{|€~€€€€€€€€€€€€€€€€€€€€€€€~}}||{|{}|~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€xuzx||~}~}|{|z|{}}~~~~}{|u{k}f}j|pztwuvuuwvwvvvuwuvuurxw~}€€€€€€€€€€€€€€€€€€€€~~z~u|t{uurptsvuwvxvxwxwxwyvzuzvyvxvxvyvyuyuwtuusuuvwuzuyvvwuxuvvvuwtwuwvvxsyrztzuywwwvvutvtxsztzs{syswtwuwtxtxszsysztzt{t{t{s{s{t{t{uyvyvyvzv{t|r}n{sxuvwuwwwzv{w{}}~{ttwvxwxx~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~~{z€|~€€€€€€€€€€€€€€€€€€€€€€€€€~~||{|{||~}~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€zx{z}|}|}}}|}|}|}||{zwzozg}h}n{rxuxxwyxxxxwxvwuvwtxsyq|w}€€€€€€€€€€€€€€€€€€€€}yv~u{uuqqtuwuxtxswtvvuxuxvxwxvwtxtwuwuvwtxtwuvvuvuuvuuvuvuwvvwvxvwuvuvuwtxtytyuxuwvuuvuuvuvvwvwvvvvuuvvwvwxxwyvxuyvyxwxxwyv|t}t|u{uzvzvyvxuwuxrzozswuvvwwyv|u|v|v{~~~}uuwvzv{y€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~€}€€€€€~}~{~~€€€€€€€€€€€€€€€€€€€€€€€€€€€~~{}z|z|{}|~}€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€|{}|}|}|}}}|}||{{xzqxg{b|k{qyuwuwvxxwzyyyyvyuxtxwwysyr|x~}€€€€€€€€€€€€€€€€€€€€~{xw~x|vwrvuxxvxuytxtvwtytzvzxyvxuxtxuxwwxvzv{wzwwvuuuuuvvwvxvxxwyuytwuuvtvuvwuzu{uyvwuvtvuxuxvwvwvwwwwwxwxvxvvxuxuxvxxvxvwvuxtytzvyu{v|w{wxwxwxuzryuxwwxxx{v|t}u|s{|~~xuyt{s|y€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~}~€€€€~}~€€€€€€€€€€€€€€€€€€€€€€€~~}{|y|z|z}|~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€}|}}~}~}~}~}}|~vlcbj{ryvxvxuwuwuwuyuxvwxxxxxyvyrwq{x~}€€€€€€€€€€€€€€€€€€€€~~z~w}w|xytsrswvxvwxwxvxuyvxwxwxxxvwuwwwyv{v|v{wxyvyvxvuwvvwuwuwvvxvyvxvwvuvuvuwvwxwxwwwwwxvzt{tztztzuytyuxwwwwvwsyq{r{syuwwwvwtxtxtxvxuyu{u{tzs{t|s}pztyuxxyyzxyvywyuxz}yxyxyu{z€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~~|~~€€€€~€}€€€€€€€€€€€€€€€€€€}~{}z|y|z}}~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~}~~~~~}}||y|si‚e‚g~o|syuyvxwwvwvvvwvwuxtyuywzwytwnvozx~}€€€€€€€€€€€€€€€€€€~~y}w}v{vwrqrswwxxvxvwvvvvxwyuxuvvsxrxtwxvyuxvwxuytyvwxuytxtxuxtxtxtyvxvxvxuxuxuwtuusutuwuyu{u{uzvyuytys{r|t{vxuwuxs{s|s{tzuzuzt{tztzvywzwzuytwuxvzuzpyuxwwyw}u}tzuxwvy{~|{{y{w|{€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~~|~€€€€€€€~€}€~€€€€€€€€€€€€€€€€€~~|}z|z|{}}~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~~~~~||v{m|g~h~m{rzvyvzwzvzvyuwvvxvyvyvxvvvvuwuvtqxq{x~}€€€€€€€€€€€€€€€€}~y}t|u{wxouovuwvwvwvwuvvvwuxtwuvvuwswtwuvuuuvwvxwwxvwvuwtxsytxtwtxuwwwwwwxvzt{s{rytwtutvtyuzuzuzuztyrzrzr|t|vywxvxwyv{v|u|t|t}u}uzuzvyvxvxwwwvxwxwwvuwuuwrzt€u‚rs~s}t}|€€}~z}x}|€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€}z~|~~€€€€€~€€€€€€€€€€€€€€€€€~|}z|z|z}|~}~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~~|}vzl{h{ozrytytytyuwvxvxuxtwuwvwwwywxuvtutuvtuoyr|y~}€€€€€€€€€€€€€€€€€|~w~t}v|xymyjypytxvyvyvxuwuuwuxtxuyvyvyvxvvvvwwwyuxuwuxvxvxtxtxswtvuuxuxvxvwwxxwxvwuwuwuxuxvxuxvwuwtwsxsyt{t{wzxyxxxyvzuzs{r{sztzvxwwwxvxqyowrvyy}}~}}|}|~|}€~~€~|x~€€~zyyw|}€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~{€{€~~€€€€€€€€€€€€€€€€€€€€€€~}}{}z}z}}~~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~}||u|j}i}o{tytzszpyqytxvvwvvwuwtxtyvzvzvytwtxtxpwjyp{y}|~€€€€€€€€€€€€€€zwu~x|wxlymyryuxwywxwyxxxwyvxuwvxvwxwyvyuyvyxxyvyuxuxuxvzuzuztxvwvwvxuytzuyvywxwwwuxuxvwxvyvyvxuytytxtxvxwxxyxzw{v{uztytxtysytzu{w{t|pysxx{}|~}~~~}~}~~€€€€€€€~|x|w~}€€€€€€€~}}|~~€€€€€€€€€€€€€€€€€€€€€€€€€~€}€}~€~€€€€€€€€€€€€€€€€€€€€€€€€€€€~|~z}z}{}{~}~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€|zyvvowmzp|s{uzwyvysyrytyvxwwuwrwpyrytyvytyrzr{rzmwjwpzy|{~~€€€€€€€€€€€€€€~~z~w~v}xzvssrwuxwxwxwxvxwywywxwvvuwuwuytyuyvxxv{v|vzvyvxuxtztztzuxvwvxvxtxsyrzr{t{wxwwvuwuvvwwvyu{tzsysxtxuywyxyxywyvyuytxtwtwtwuyu|q{szy{}}~~~~~~~}}{|x{xz{}~~€~€€€€€€€~€}~€€|yyv~}€€€€€€€€€€€€€€€€€€€€€€€€€€€€}€||€~€€€€€€€€€€€€€€€€€€€€€€€€€€}{|yzy{y{z}|~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€|o{kxlwqwqyozrzvyxywxvywzwzvysxrxpxqyszszpyoyn{myhvjwrzy|z}|~~€€€€€€€€€€€€€€~}}y}v|v|xyvswsywywxxwwxvxvxwxwwxvwwvxvyvzvzvyvyuzuzvzuzuztztzuyvyvyvzt{uzuvttsurwszuxtwruqurvtvuxtytxsxrxrys{uyvvvvvuuvuwsxsyszuxxuurvv{{~~~~~}~{}xzvxvyvyqykziwqtyo}m€s{€€€€~~~}~~€~~~~~}~}|}~€€€€€€€€€€~~€€€€€€€€€€~€}€{|~~~€€€€€€€€€€€€€€€€€€€€€€~~}||z{y|{||}|~}~€€€€€€€~~~~~~~€€€€€€€€~~~~~~~~~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€xkzl{myqyqyqzr{uzwyvxuxuxvxuwsvsvtwtytytyswswpxkyexkzu|y|z}|~~€€€€€€€€€€€€€€~|~x~v}w|xztwtxwxxvwvxtxuyuzvzwyxxxxxyxyxzxzwyvyuwuyu{u{uyvxwwyxxyxzw{u{tztxsusvrwsytxswsvrxsytytyuxuxuytyryqzryryryrxrxswsxsyszuyxpzu||~~~~}{}q€i{nqtnrrqwqypzmylynuqqvqyv|}€€€€~~€~~~~~}~z}w|w|{}}~€€€€€€€€~€€€€€€€€€€€~~}~}~~~~€€€€€€€€€€€€€€~~€€€€€~}}{|z|z|{}|~}~~€€€€€€€€€~~~~€€€€€€€€€€€~~~~~~~~~~~~~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~~~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€uxwwyvzt{r{r{q{rztytuttttstrurutvwvwvwwvwvwwwvvstlwo{w|{}{~}}}x}u|w{yxrxqyvywvvswqxqzrzt{uzwxxwwvwuwwwwxwuxuyu{v|t{tyuwvwwwvxvywyvysyq{pzryrwuwuvtwszr|t}v|u{vzvxuysysyrzrzsytxuwuxsyrzszvxzszt||~~{xxm}l{qvwo}h|iypwuvuvwtwpxpxqzv{{~~~{}v}u|z}|~}~~~}{|y|z}|~}~~~xwwwxwxtzr|o{m|n{pxrssovoupututvwwxuwuwrxrxuwvuwqqtrzx|{{{~~€€€€€€€€€€€€€€€€~}|w{t{wzxvpvpyuyvvvrvpxoyqzsyuxvxvwuutsvtxtxuvvuxvzv{tzqyozqzrzr{t{vywyszp~nq{tvwtvstvr{p|r}t{uyvxvwtwrwsxtwuwvwvvvvvwrzp~s}{x‚lƒw€}rh€m{rxp{i_…_‡d†lp|vuys{q}s}y~}€€€€€€€€€€€€€€€€}{yuyt}{~}~}€€€€€€€€€€€€€€€€€€€€€€€€€€~~€€€€€€€€€€€€€€€€€€€€€~|{{y|z}|~}~€€€€€€€€€€~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~~}€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€
diff --git a/hwc2/test/nv12_ved_test.cpp b/hwc2/test/nv12_ved_test.cpp
new file mode 100644
index 0000000..253c924
--- a/dev/null
+++ b/hwc2/test/nv12_ved_test.cpp
@@ -0,0 +1,136 @@
+/*
+// Copyright (c) 2016 Amlogic Corporation
+*/
+
+#include <gtest/gtest.h>
+
+#include <binder/IMemory.h>
+
+#include <gui/ISurfaceComposer.h>
+#include <gui/Surface.h>
+#include <gui/SurfaceComposerClient.h>
+#include <private/gui/ComposerService.h>
+
+#include <utils/String8.h>
+
+using namespace android;
+const char * filename = "/data/my_640x480.nv12";
+#define PIXEL_FORMAT_NV12 0x7FA00E00
+
+// Fill a YV12 buffer with a multi-colored checkerboard pattern
+void fillYUVBuffer(uint8_t* buf, int w, int h, int stride) {
+ const int blockWidth = w > 16 ? w / 16 : 1;
+ const int blockHeight = h > 16 ? h / 16 : 1;
+ const int yuvTexOffsetY = 0;
+ int yuvTexStrideY = stride;
+ int yuvTexOffsetV = yuvTexStrideY * h;
+ int yuvTexStrideV = (yuvTexStrideY / 2 + 0xf) & ~0xf;
+ int yuvTexOffsetU = yuvTexOffsetV + yuvTexStrideV * h / 2;
+ int yuvTexStrideU = yuvTexStrideV;
+ for (int x = 0; x < w; x++) {
+ for (int y = 0; y < h; y++) {
+ int parityX = (x / blockWidth) & 1;
+ int parityY = (y / blockHeight) & 1;
+ unsigned char intensity = (parityX ^ parityY) ? 63 : 191;
+ buf[yuvTexOffsetY + (y * yuvTexStrideY) + x] = intensity;
+ if (x < w / 2 && y < h / 2) {
+ buf[yuvTexOffsetU + (y * yuvTexStrideU) + x] = intensity;
+ if (x * 2 < w / 2 && y * 2 < h / 2) {
+ buf[yuvTexOffsetV + (y * 2 * yuvTexStrideV) + x * 2 + 0] =
+ buf[yuvTexOffsetV + (y * 2 * yuvTexStrideV) + x * 2
+ + 1] =
+ buf[yuvTexOffsetV
+ + ((y * 2 + 1) * yuvTexStrideV)
+ + x * 2 + 0] = buf[yuvTexOffsetV
+ + ((y * 2 + 1) * yuvTexStrideV)
+ + x * 2 + 1] = intensity;
+ }
+ }
+ }
+ }
+}
+
+void loadYUVBufferFromFile(uint8_t* buf, int w, int h, int stride) {
+ FILE *fp = fopen(filename, "r");
+ int line = 0;
+ int offset = 0;
+ int buffer_height = h * 1.5;
+
+ if (!fp) {
+ printf("%s: failed to open %s\n", __func__, filename);
+ return;
+ }
+
+ printf("buf=%p, w=%d,h=%d,stride=%d\n", buf, w, h, stride);
+
+ for (line = 0; line < buffer_height; line++) {
+ printf("reading line %d...\n", line);
+ offset = line * stride;
+ fread(buf + offset, w, 1, fp);
+ }
+
+ fclose(fp);
+}
+
+int main(int argc, char **argv) {
+ sp < SurfaceControl > sc;
+ sp < Surface > s;
+ sp < ANativeWindow > anw;
+ ANativeWindowBuffer *anb;
+ uint8_t* img = NULL;
+ sp < SurfaceComposerClient > composerClient = new SurfaceComposerClient;
+ if (composerClient->initCheck() != NO_ERROR)
+ return 0;
+
+ sc = composerClient->createSurface(String8("FG Test Surface"), 640, 480,
+ PIXEL_FORMAT_RGBA_8888, 0);
+ if (sc == NULL)
+ return 0;;
+ if (!sc->isValid())
+ return 0;
+
+ s = sc->getSurface();
+ anw = s.get();
+ if (native_window_set_buffers_geometry(anw.get(), 640, 480,
+ PIXEL_FORMAT_NV12) != NO_ERROR)
+ return 0;
+ if (native_window_set_usage(anw.get(),
+ GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN)
+ != NO_ERROR)
+ return 0;
+
+ /*
+ * load buffer
+ */
+ if (native_window_dequeue_buffer_and_wait(anw.get(), &anb))
+ return 0;
+ if (anb == NULL)
+ return 0;
+ sp < GraphicBuffer > buf(new GraphicBuffer(anb, false));
+ //if (anw->lockBuffer(anw.get(), buf->getNativeBuffer()) != NO_ERROR)
+ // return 0;
+ buf->lock(GRALLOC_USAGE_SW_WRITE_OFTEN, (void**) (&img));
+ if (!img) {
+ printf("failed to lock buffer\n");
+ exit(-1);
+ }
+
+ loadYUVBufferFromFile(img, 640, 480, buf->getStride());
+ buf->unlock();
+ printf("querying buffer...\n");
+ if (anw->queueBuffer(anw.get(), buf->getNativeBuffer(), -1) != NO_ERROR)
+ return 0;
+
+ // loop it to continuously display??
+ while (1) {
+ SurfaceComposerClient::openGlobalTransaction();
+ if (sc->setLayer(INT_MAX - 1) != NO_ERROR)
+ return 0;
+ if (sc->show() != NO_ERROR)
+ return 0;
+
+ SurfaceComposerClient::closeGlobalTransaction();
+ }
+ return 0;
+}
+
diff --git a/hwc2_old/Android.mk b/hwc2_old/Android.mk
new file mode 100644
index 0000000..99072f6
--- a/dev/null
+++ b/hwc2_old/Android.mk
@@ -0,0 +1,68 @@
+# Copyright (C) 2011 Amlogic
+#
+#
+
+LOCAL_PATH := $(call my-dir)
+
+# HAL module implemenation, not prelinked and stored in
+# /system/lib/hw/hwcomposer.amlogic.so
+include $(CLEAR_VARS)
+
+LOCAL_MODULE_RELATIVE_PATH := hw
+
+LOCAL_SRC_FILES := hwcomposer.cpp
+LOCAL_CFLAGS := -DLOG_TAG=\"Hwcomposer\"
+
+LOCAL_SHARED_LIBRARIES := \
+ libcutils \
+ liblog \
+ libEGL \
+ libdl \
+ libhardware \
+ libutils \
+ libsync \
+ libfbcnf \
+ libhardware_legacy
+
+LOCAL_STATIC_LIBRARIES := libomxutil
+
+LOCAL_KK=0
+ifeq ($(GPU_TYPE),t83x)
+LOCAL_KK:=1
+endif
+ifeq ($(GPU_ARCH),midgard)
+LOCAL_KK:=1
+endif
+ifeq ($(LOCAL_KK),1)
+ LOCAL_CFLAGS += -DMALI_AFBC_GRALLOC=1
+else
+ LOCAL_CFLAGS += -DMALI_AFBC_GRALLOC=0
+endif
+
+MESON_GRALLOC_DIR ?= hardware/amlogic/gralloc
+
+LOCAL_C_INCLUDES += \
+ $(MESON_GRALLOC_DIR)
+
+LOCAL_C_INCLUDES += system/core/libion/include/ \
+ system/core/libion/kernel-headers
+
+ifneq ($(WITH_LIBPLAYER_MODULE),false)
+LOCAL_SHARED_LIBRARIES += libamavutils_alsa
+AMPLAYER_APK_DIR=$(TOP)/vendor/amlogic/frameworks/av/LibPlayer/
+LOCAL_C_INCLUDES += \
+ $(AMPLAYER_APK_DIR)/amavutils/include
+LOCAL_CFLAGS += -DWITH_LIBPLAYER_MODULE=1
+endif
+
+ifeq ($(TARGET_EXTERNAL_DISPLAY),true)
+LOCAL_CFLAGS += -DWITH_EXTERNAL_DISPLAY
+ifeq ($(TARGET_SINGLE_EXTERNAL_DISPLAY_USE_FB1),true)
+LOCAL_CFLAGS += -DSINGLE_EXTERNAL_DISPLAY_USE_FB1
+endif
+endif
+
+LOCAL_MODULE := hwcomposer.amlogic
+LOCAL_MODULE_TAGS := optional
+include $(BUILD_SHARED_LIBRARY)
+include $(call all-makefiles-under,$(LOCAL_PATH))
diff --git a/hwc2_old/hwcomposer.cpp b/hwc2_old/hwcomposer.cpp
new file mode 100644
index 0000000..3bd08b7
--- a/dev/null
+++ b/hwc2_old/hwcomposer.cpp
@@ -0,0 +1,3283 @@
+/*
+ * Copyright (C) 2010 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+//#define LOG_NDEBUG 0
+#define LOG_TAG "HWComposer2"
+#include <hardware/hardware.h>
+
+#include <fcntl.h>
+#include <math.h>
+#include <poll.h>
+#include <pthread.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+#include <inttypes.h>
+#include <stdint.h>
+
+#include <sys/ioctl.h>
+#include <sys/mman.h>
+#include <sys/time.h>
+#include <sys/types.h>
+#include <errno.h>
+#include <sys/resource.h>
+
+#define HWC_REMOVE_DEPRECATED_VERSIONS 1
+
+#include <cutils/compiler.h>
+#include <cutils/log.h>
+#include <cutils/atomic.h>
+#include <cutils/properties.h>
+
+#include <utils/String8.h>
+#include <hardware/gralloc.h>
+#include <hardware/hwcomposer2.h>
+#include <hardware_legacy/uevent.h>
+#include <utils/String8.h>
+
+#include <EGL/egl.h>
+#include <utils/Vector.h>
+#include <utils/Timers.h>
+#include <system/graphics.h>
+#include <sync/sync.h>
+// for private_handle_t
+#include <gralloc_priv.h>
+#include <gralloc_helper.h>
+
+#if WITH_LIBPLAYER_MODULE
+#include <Amavutils.h>
+#endif
+#include "tvp/OmxUtil.h"
+
+///Defines for debug statements - Macro LOG_TAG needs to be defined in the respective files
+#define HWC_LOGVA(str) ALOGV_IF(chk_int_prop("sys.hwc.debuglevel") >=6,"%5d %s - " str, __LINE__,__FUNCTION__);
+#define HWC_LOGVB(str,...) ALOGV_IF(chk_int_prop("sys.hwc.debuglevel") >=6,"%5d %s - " str, __LINE__, __FUNCTION__, __VA_ARGS__);
+#define HWC_LOGDA(str) ALOGD_IF(chk_int_prop("sys.hwc.debuglevel") >=5,"%5d %s - " str, __LINE__,__FUNCTION__);
+#define HWC_LOGDB(str, ...) ALOGD_IF(chk_int_prop("sys.hwc.debuglevel") >=5,"%5d %s - " str, __LINE__, __FUNCTION__, __VA_ARGS__);
+#define HWC_LOGIA(str) ALOGI_IF(chk_int_prop("sys.hwc.debuglevel") >=4,"%5d %s - " str, __LINE__, __FUNCTION__);
+#define HWC_LOGIB(str, ...) ALOGI_IF(chk_int_prop("sys.hwc.debuglevel") >=4,"%5d %s - " str, __LINE__,__FUNCTION__, __VA_ARGS__);
+#define HWC_LOGWA(str) ALOGW_IF(chk_int_prop("sys.hwc.debuglevel") >=3,"%5d %s - " str, __LINE__, __FUNCTION__);
+#define HWC_LOGWB(str, ...) ALOGW_IF(chk_int_prop("sys.hwc.debuglevel") >=3,"%5d %s - " str, __LINE__,__FUNCTION__, __VA_ARGS__);
+#define HWC_LOGEA(str) ALOGE_IF(chk_int_prop("sys.hwc.debuglevel") >=2,"%5d %s - " str, __LINE__, __FUNCTION__);
+#define HWC_LOGEB(str, ...) ALOGE_IF(chk_int_prop("sys.hwc.debuglevel") >=2,"%5d %s - " str, __LINE__,__FUNCTION__, __VA_ARGS__);
+
+#define LOG_FUNCTION_NAME HWC_LOGVA("ENTER");
+#define LOG_FUNCTION_NAME_EXIT HWC_LOGVA("EXIT");
+#define DBG_LOGA(str) ALOGI_IF(chk_int_prop("sys.hwc.debuglevel") >=4,"%10s-%5d %s - " str, HWC_BUILD_NAME, __LINE__,__FUNCTION__)
+#define DBG_LOGB(str, ...) ALOGI_IF(chk_int_prop("sys.hwc.debuglevel") >=4,"%10s-%5d %s - " str, HWC_BUILD_NAME, __LINE__,__FUNCTION__, __VA_ARGS__);
+
+#define SYSFS_AMVIDEO_CURIDX "/sys/module/amvideo/parameters/cur_dev_idx"
+#define SYSFS_DISPLAY_MODE "/sys/class/display/mode"
+#define SYSFS_FB0_FREE_SCALE "/sys/class/graphics/fb0/free_scale"
+#define SYSFS_FB1_FREE_SCALE "/sys/class/graphics/fb0/free_scale"
+#define SYSFS_VIDEO_AXIS "/sys/class/video/axis"
+#define SYSFS_VIDEOBUFUSED "/sys/class/amstream/videobufused"
+#define SYSFS_WINDOW_AXIS "/sys/class/graphics/fb0/window_axis"
+
+#define MAX_SUPPORT_DISPLAYS HWC_NUM_DISPLAY_TYPES
+
+#ifdef SINGLE_EXTERNAL_DISPLAY_USE_FB1
+#undef ENABLE_CURSOR_LAYER
+#define CHK_SKIP_DISPLAY_FB0(dispIdx) \
+ if (pdev->displays[HWC_DISPLAY_EXTERNAL].connected\
+ && dispIdx == HWC_DISPLAY_PRIMARY) {\
+ continue;\
+ }
+#else
+#define ENABLE_CURSOR_LAYER 1 //cursor layer supported in hwc 1.4
+#define CHK_SKIP_DISPLAY_FB0(dispIdx) //nothing to do
+#endif
+
+// hwc2
+#define isValidDisplay(dpyContext, displayId) \
+ if (displayId > HWC_DISPLAY_VIRTUAL || displayId < HWC_DISPLAY_PRIMARY) \
+ { \
+ HWC_LOGEB("Bad Display: %d", static_cast<int32_t>(displayId)); \
+ return HWC2_ERROR_BAD_DISPLAY; \
+ } else { \
+ if (!dpyContext || (dpyContext && !dpyContext->connected)) return HWC2_ERROR_BAD_DISPLAY; \
+ }
+
+typedef struct hwc2_module {
+ /**
+ * Common methods of the hardware composer module. This *must* be the first member of
+ * hwc_module as users of this structure will cast a hw_module_t to
+ * hwc_module pointer in contexts where it's known the hw_module_t references a
+ * hwc_module.
+ */
+ struct hw_module_t common;
+} hwc2_module_t;
+
+typedef struct cursor_context_t{
+ bool blank;
+ struct framebuffer_info_t cb_info;
+ void *cbuffer;
+ bool show;
+}cursor_context_t;
+
+
+typedef struct hwc2_hotplug_cb {
+ hwc2_callback_data_t callbackData;
+ void (*hotplug)(hwc2_callback_data_t callbackData, hwc2_display_t displayId, int32_t intConnected);
+} hwc2_hotplug_cb_t;
+
+
+typedef struct hwc2_refresh_cb {
+ hwc2_callback_data_t callbackData;
+ void (*refresh)(hwc2_callback_data_t callbackData, hwc2_display_t displayId);
+} hwc2_refresh_cb_t;
+
+
+typedef struct hwc2_vsync_cb {
+ hwc2_callback_data_t callbackData;
+ void (*vsync)(hwc2_callback_data_t callbackData, hwc2_display_t displayId, int64_t timestamp);
+} hwc2_vsync_cb_t;
+
+
+// layer's number.
+#define HWC2_MAX_LAYERS 32
+#define HWC2_MAX_OVERLAY_LAYERS 5
+
+typedef struct hwc_layer {
+ // layer contents
+ union {
+ buffer_handle_t buf_hnd;
+
+ /* When compositionType is HWC_SIDEBAND, this is the handle
+ * of the sideband video stream to compose. */
+ const native_handle_t* sideband_stream;
+ };
+ int32_t layer_acquirefence;
+ hwc_region_t demage_region;
+
+ // layer state
+ hwc2_blend_mode_t blend_mode;
+ hwc2_composition_t clt_cmptype;
+ hwc2_composition_t dev_cmptype;
+ int32_t /*android_dataspace_t*/ dataspace;
+ hwc_color_t color;
+ hwc_rect_t display_frame;
+ float alpha;
+ //native_handle_t *sideband_stream;
+ hwc_frect_t source_crop;
+ hwc_transform_t transform;
+ hwc_region_t visible_region;
+ uint32_t zorder;
+} hwc_layer_t;
+
+
+typedef struct display_context {
+ struct framebuffer_info_t fb_info;
+ struct private_handle_t* fb_hnd;
+#ifdef ENABLE_CURSOR_LAYER
+ struct cursor_context_t cursor_ctx;
+#endif
+
+ bool connected;
+
+ int32_t /*android_color_mode_t*/ color_mode;
+
+ // client target layer.
+ buffer_handle_t clnt_tgrhnd;
+ hwc_region_t clnt_tgrdmge;
+ int32_t tgr_acqfence;
+
+ // num of composition type changed layer.
+ uint32_t num_chgtyps;
+ uint32_t num_lyrreqs;
+
+ // bool validated;
+
+ // vsync
+ bool vsync_enable;
+ int32_t vsync_period;
+
+ // layer
+ hwc2_layer_t types_layer[HWC2_MAX_OVERLAY_LAYERS];
+ hwc2_layer_t requests_layer[HWC2_MAX_OVERLAY_LAYERS];
+ hwc_layer_t* hwc_layer[HWC2_MAX_LAYERS];
+
+ // virtual display.
+ buffer_handle_t virhnd;
+ int32_t vir_relfence;
+ uint32_t width;
+ uint32_t height;
+ android_pixel_format_t format;
+} display_context_t;
+
+
+typedef struct hwc2_context {
+ hwc2_device base;
+
+ /* our private state goes below here */
+ hwc_layer_t const* saved_layer;
+ unsigned saved_transform;
+ int32_t saved_left;
+ int32_t saved_top;
+ int32_t saved_right;
+ int32_t saved_bottom;
+
+ bool blank_status;
+
+ // video buf is used flag
+ char video_buf_used[32];
+ // hdmi output mode
+ char mode[32];
+
+ // vsync
+ pthread_t primary_vsync_thread;
+ pthread_t external_vsync_thread;
+ const hwc2_vsync_cb_t vsync_cb;
+
+ const hwc2_hotplug_cb_t hotplug_cb;
+ const hwc2_refresh_cb_t refresh_cb;
+ pthread_t hotplug_thread;
+
+ private_module_t *gralloc_module;
+ display_context_t displays[MAX_SUPPORT_DISPLAYS];
+}hwc2_context_t;
+
+
+typedef struct hwc_uevent_data {
+ int32_t len;
+ char buf[1024];
+ char name[128];
+ char state[128];
+} hwc_uevent_data_t;
+
+
+static pthread_cond_t hwc_cond[HWC_NUM_PHYSICAL_DISPLAY_TYPES] = {PTHREAD_COND_INITIALIZER, PTHREAD_COND_INITIALIZER};
+static pthread_mutex_t hwc_mutex[HWC_NUM_PHYSICAL_DISPLAY_TYPES] = {PTHREAD_MUTEX_INITIALIZER, PTHREAD_MUTEX_INITIALIZER};
+
+extern "C" int32_t clock_nanosleep(clockid_t clock_id, int32_t flags,
+ const struct timespec *request, struct timespec *remain);
+
+static bool chk_bool_prop(const char* prop) {
+ char val[PROPERTY_VALUE_MAX];
+
+ memset(val, 0, sizeof(val));
+ if (property_get(prop, val, "false") && strcmp(val, "true") == 0) {
+ ALOGD("prop: %s is %s",prop, val);
+ return true;
+ }
+
+ return false;
+}
+
+static int32_t chk_int_prop(const char* prop) {
+ char val[PROPERTY_VALUE_MAX];
+
+ memset(val, 0, sizeof(val));
+ if (property_get(prop, val, "2")) {
+ //ALOGV("prop: %s is %s",prop, val);
+ return atoi(val);
+ }
+ return 0;
+}
+
+static int32_t chk_and_dup(int32_t fence) {
+ if (fence < 0) {
+ HWC_LOGWB("not a vliad fence %d",fence);
+ return -1;
+ }
+
+ int32_t dup_fence = dup(fence);
+ if (dup_fence < 0) {
+ HWC_LOGWB("fence dup failed: %s", strerror(errno));
+ }
+
+ return dup_fence;
+}
+
+#if WITH_LIBPLAYER_MODULE
+static bool chk_sysfs_status(const char* sysfstr, char* lastr, int32_t size) {
+ char val[32];
+ char *p = lastr;
+
+ memset(val, 0, sizeof(val));
+ if (amsysfs_get_sysfs_str(sysfstr, val, sizeof(val)) == 0) {
+ HWC_LOGVB("val: %s, lastr: %s",val, p);
+ if ((strcmp(val, p) != 0)) {
+ memset(p, 0, size);
+ strcpy(p, val);
+ return true;
+ }
+ }
+
+ return false;
+}
+#endif
+
+static int32_t chk_output_mode(char* curmode) {
+ int32_t modefd = open(SYSFS_DISPLAY_MODE, O_RDONLY);
+ if (modefd < 0) {
+ HWC_LOGEB("open (%s) fail", SYSFS_DISPLAY_MODE);
+ return -1;
+ }
+
+ char outputmode[32] = {0};
+ read(modefd, outputmode, 31);
+ close(modefd);
+ modefd = -1;
+
+ //check if need update vsync.
+ if (strcmp(outputmode, curmode) == 0) {
+ HWC_LOGVB("outputmode didn't change %s", curmode);
+ return 0;
+ }
+
+ strcpy(curmode, outputmode);
+
+ int32_t period = 16666666;
+ if (strstr(outputmode, "50hz") != NULL) {
+ period = (int32_t)(1e9 / 50);
+ } else if (strstr(outputmode, "30hz") != NULL) {
+ period = (int32_t)(1e9 / 30);
+ } else if (strstr(outputmode, "25hz") != NULL) {
+ period = (int32_t)(1e9 / 25);
+ } else if ((strstr(outputmode, "24hz") != NULL) || (strstr(outputmode, "smpte") != NULL)) {
+ period = (int32_t)(1e9 / 24);
+ } else
+ HWC_LOGDB("displaymode (%s) doesn't specify HZ", curmode);
+
+ HWC_LOGVB("get new outputmode (%s) new period (%ld)", curmode, period);
+ return period;
+}
+
+static bool chk_vinfo(hwc2_context_t* context, int32_t disp) {
+ display_context_t *dctx = &(context->displays[disp]);
+ isValidDisplay(dctx, disp);
+
+ struct framebuffer_info_t *fbinfo = &(dctx->fb_info);
+
+ if (fbinfo != NULL && fbinfo->fd >= 0) {
+ struct fb_var_screeninfo vinfo;
+ if (ioctl(fbinfo->fd, FBIOGET_VSCREENINFO, &vinfo) == -1)
+ {
+ ALOGE("FBIOGET_VSCREENINFO error!!!");
+ return -errno;
+ }
+
+ if (vinfo.xres != fbinfo->info.xres
+ || vinfo.yres != fbinfo->info.yres
+ || vinfo.width != fbinfo->info.width
+ || vinfo.height != fbinfo->info.height) {
+ if (int32_t(vinfo.width) <= 16 || int32_t(vinfo.height) <= 9) {
+ // the driver doesn't return that information
+ // default to 160 dpi
+ vinfo.width = ((vinfo.xres * 25.4f)/160.0f + 0.5f);
+ vinfo.height = ((vinfo.yres * 25.4f)/160.0f + 0.5f);
+ }
+ fbinfo->xdpi = (vinfo.xres * 25.4f) / vinfo.width;
+ fbinfo->ydpi = (vinfo.yres * 25.4f) / vinfo.height;
+
+ fbinfo->info.xres = vinfo.xres;
+ fbinfo->info.yres = vinfo.yres;
+ fbinfo->info.width = vinfo.width;
+ fbinfo->info.height = vinfo.height;
+
+ return true;
+ }
+ }
+ return false;
+}
+
+/*
+Operater of framebuffer
+*/
+int32_t init_display(hwc2_context_t* context, int32_t displayId) {
+ display_context_t *dctx = &(context->displays[displayId]);
+
+ struct framebuffer_info_t *fbinfo = &(dctx->fb_info);
+
+ if (dctx->connected) return 0;
+
+ pthread_mutex_lock(&hwc_mutex[displayId]);
+
+ if ( !dctx->fb_hnd ) {
+ //init information from osd.
+ fbinfo->displayType = displayId;
+ fbinfo->fbIdx = getOsdIdx(displayId);
+ int32_t err = init_frame_buffer_locked(fbinfo);
+ int32_t bufferSize = fbinfo->finfo.line_length
+ * fbinfo->info.yres;
+ HWC_LOGDB("init_frame_buffer get fbinfo->fbIdx (%d) "
+ "fbinfo->info.xres (%d) fbinfo->info.yres (%d)",
+ fbinfo->fbIdx, fbinfo->info.xres,
+ fbinfo->info.yres);
+ int32_t usage = 0;
+ if (displayId == HWC_DISPLAY_PRIMARY) {
+ context->gralloc_module->fb_primary.fb_info = *(fbinfo);
+ } else if (displayId == HWC_DISPLAY_EXTERNAL) {
+ context->gralloc_module->fb_external.fb_info = *(fbinfo);
+ usage |= GRALLOC_USAGE_EXTERNAL_DISP;
+ }
+
+ //Register the framebuffer to gralloc module
+ dctx->fb_hnd = new private_handle_t(
+ private_handle_t::PRIV_FLAGS_FRAMEBUFFER,
+ usage, fbinfo->fbSize, 0,
+ 0, fbinfo->fd, bufferSize, 0);
+ context->gralloc_module->base.registerBuffer(
+ &(context->gralloc_module->base),
+ dctx->fb_hnd);
+ HWC_LOGDB("init_frame_buffer get frame size %d usage %d",
+ bufferSize,usage);
+
+ }
+
+ dctx->connected = true;
+ pthread_mutex_unlock(&hwc_mutex[displayId]);
+
+#ifdef ENABLE_CURSOR_LAYER
+ // init cursor framebuffer
+ cursor_context_t* cursor_ctx = &(dctx->cursor_ctx);
+ cursor_ctx->show = false;
+ framebuffer_info_t* cbinfo = &(cursor_ctx->cb_info);
+ cbinfo->fd = -1;
+
+ //init information from cursor framebuffer.
+ cbinfo->fbIdx = displayId*2+1;
+ if (1 != cbinfo->fbIdx && 3 != cbinfo->fbIdx) {
+ HWC_LOGEB("invalid fb index: %d, need to check!",
+ cbinfo->fbIdx);
+ return 0;
+ }
+ int32_t err = init_cursor_buffer_locked(cbinfo);
+ if (err != 0) {
+ HWC_LOGEA("init_cursor_buffer_locked failed, need to check!");
+ return 0;
+ }
+ HWC_LOGDB("init_cursor_buffer get cbinfo->fbIdx (%d) "
+ "cbinfo->info.xres (%d) cbinfo->info.yres (%d)",
+ cbinfo->fbIdx,
+ cbinfo->info.xres,
+ cbinfo->info.yres);
+
+ if ( cbinfo->fd >= 0) {
+ HWC_LOGDA("init_cursor_buffer success!");
+ }else{
+ HWC_LOGEA("init_cursor_buffer fail!");
+ }
+#endif
+
+ return 0;
+}
+
+int32_t uninit_display(hwc2_context_t* context, int32_t displayId) {
+ hwc2_context_t *ctx = (hwc2_context_t*)context;
+ display_context_t *dctx = &(ctx->displays[displayId]);
+
+ if (!dctx->connected) return 0;
+
+ pthread_mutex_lock(&hwc_mutex[displayId]);
+ dctx->connected = false;
+ pthread_mutex_unlock(&hwc_mutex[displayId]);
+
+ return 0;
+}
+
+static void hwc2_overlay_compose(
+ hwc2_context_t* context, hwc2_display_t displayId,
+ hwc_layer_t const* l) {
+ display_context_t *dctx = &(context->displays[displayId]);
+ int32_t angle = 0;
+
+#if WITH_LIBPLAYER_MODULE
+ static char last_val[32] = "0";
+ static char last_axis[32] = "0";
+ static char last_mode[32] = {0};
+ static char last_free_scale[32] = {0};
+ static char last_window_axis[50] = {0};
+ bool vpp_changed = false;
+ bool axis_changed = false;
+ bool mode_changed = false;
+ bool free_scale_changed = false;
+ bool window_axis_changed =false;
+
+ if (chk_bool_prop("ro.vout.dualdisplay4")) {
+ vpp_changed = chk_sysfs_status(
+ SYSFS_AMVIDEO_CURIDX,last_val, 32);
+ }
+
+ mode_changed = chk_sysfs_status(SYSFS_DISPLAY_MODE, last_mode, 32);
+
+ free_scale_changed = chk_sysfs_status(SYSFS_FB0_FREE_SCALE, last_free_scale, 32);
+#ifdef SINGLE_EXTERNAL_DISPLAY_USE_FB1
+ if (dctx->connected)
+ free_scale_changed = chk_sysfs_status(SYSFS_FB1_FREE_SCALE, last_free_scale, 32);
+#endif
+
+ axis_changed = chk_sysfs_status(SYSFS_VIDEO_AXIS, last_axis, 32);
+ window_axis_changed = chk_sysfs_status(SYSFS_WINDOW_AXIS, last_window_axis, 50);
+
+ if ((context->saved_layer == l)
+ && (context->saved_transform == l->transform)
+ && (context->saved_left == l->display_frame.left)
+ && (context->saved_top == l->display_frame.top)
+ && (context->saved_right == l->display_frame.right)
+ && (context->saved_bottom == l->display_frame.bottom)
+ && !vpp_changed
+ && !mode_changed
+ && !axis_changed
+ && !free_scale_changed
+ && !window_axis_changed) {
+ return;
+ }
+
+ switch (l->transform) {
+ case 0:
+ angle = 0;
+ break;
+ case HAL_TRANSFORM_ROT_90:
+ angle = 90;
+ break;
+ case HAL_TRANSFORM_ROT_180:
+ angle = 180;
+ break;
+ case HAL_TRANSFORM_ROT_270:
+ angle = 270;
+ break;
+ default:
+ return;
+ }
+
+ amvideo_utils_set_virtual_position(
+ l->display_frame.left,
+ l->display_frame.top,
+ l->display_frame.right - l->display_frame.left,
+ l->display_frame.bottom - l->display_frame.top,
+ angle);
+
+ /* the screen mode from Android framework should always be set to normal mode
+ * to match the relationship between the UI and video overlay window position.
+ */
+ /*set screen_mode in amvideo_utils_set_virtual_position(),pls check in libplayer*/
+ //amvideo_utils_set_screen_mode(0);
+#endif
+
+ context->saved_layer = l;
+ context->saved_transform = l->transform;
+ context->saved_left = l->display_frame.left;
+ context->saved_top = l->display_frame.top;
+ context->saved_right = l->display_frame.right;
+ context->saved_bottom = l->display_frame.bottom;
+
+#if WITH_LIBPLAYER_MODULE
+ memset(last_axis, 0, sizeof(last_axis));
+
+ if (amsysfs_get_sysfs_str(SYSFS_VIDEO_AXIS, last_axis, sizeof(last_axis)) == 0) {
+ HWC_LOGDB("****last video axis is: %s",last_axis);
+ }
+#endif
+}
+
+static int32_t hwc2_fb_post(
+ hwc2_context_t *context,
+ hwc2_display_t displayId,
+ int32_t* outRetireFence) {
+ display_context_t *dctx = &(context->displays[displayId]);
+ hwc_layer_t *hwclayer = NULL;
+ int32_t err = 0, i = 0;
+
+ // deal physical display's client target layer
+#if ENABLE_CURSOR_LAYER
+ cursor_context_t * cursor_ctx = &(dctx->cursor_ctx);
+ framebuffer_info_t* cbinfo = &(cursor_ctx->cb_info);
+ bool cursor_show = false;
+
+ for (uint32_t i=0; i<dctx->num_lyrreqs; i++) {
+ hwc2_layer_t layer = dctx->requests_layer[i];
+ hwclayer = dctx->hwc_layer[layer];
+ if (hwclayer && hwclayer->dev_cmptype == HWC2_COMPOSITION_CURSOR) {
+ if (private_handle_t::validate(hwclayer->buf_hnd) < 0) {
+ HWC_LOGEA("invalid cursor layer handle.");
+ break;
+ }
+ private_handle_t *hnd = (private_handle_t *)hwclayer->buf_hnd;
+ HWC_LOGDB("This is a Sprite, hnd->stride is %d, hnd->height is %d", hnd->stride, hnd->height);
+ if (cbinfo->info.xres != (uint32_t)hnd->stride || cbinfo->info.yres != (uint32_t)hnd->height) {
+ HWC_LOGEB("disp: %d cursor need to redrew", (int32_t)displayId);
+ update_cursor_buffer_locked(cbinfo, hnd->stride, hnd->height);
+ cursor_ctx->cbuffer = mmap(NULL, hnd->size, PROT_READ|PROT_WRITE, MAP_SHARED, cbinfo->fd, 0);
+ if (cursor_ctx->cbuffer != MAP_FAILED) {
+ memcpy(cursor_ctx->cbuffer, hnd->base, hnd->size);
+ munmap(cursor_ctx->cbuffer, hnd->size);
+ HWC_LOGDA("setCursor ok");
+ } else {
+ HWC_LOGEA("buffer mmap fail");
+ }
+ }
+ cursor_show = true;
+ }
+ }
+#endif
+
+ if (!dctx->clnt_tgrhnd) {
+ HWC_LOGEA("target handle is null.");
+ *outRetireFence = -1;
+ return HWC2_ERROR_NONE;
+ }
+ if (private_handle_t::validate(dctx->clnt_tgrhnd) < 0) {
+ return HWC2_ERROR_NOT_VALIDATED;
+ }
+
+ *outRetireFence = fb_post_with_fence_locked(&(dctx->fb_info), dctx->clnt_tgrhnd, dctx->tgr_acqfence);
+
+ if (*outRetireFence >= 0) {
+ HWC_LOGDB("Get retire fence %d", *outRetireFence);
+ } else {
+ HWC_LOGEB("No valid retire returned. %d ", *outRetireFence);
+ //-1 means no fence, less than -1 is some error
+ if (*outRetireFence < -1) err = HWC2_ERROR_NOT_VALIDATED;
+ *outRetireFence -1;
+ }
+
+
+#if ENABLE_CURSOR_LAYER
+ // finally we need to update cursor's blank status
+ if (cbinfo->fd > 0 && (cursor_show != cursor_ctx->show) ) {
+ cursor_ctx->show = cursor_show;
+ HWC_LOGDB("UPDATE FB1 status to %d ",cursor_show);
+ ioctl(cbinfo->fd, FBIOBLANK, !cursor_ctx->show);
+ }
+#endif
+
+ return err;
+}
+
+static int32_t hwc2_close(hw_device_t *device) {
+ hwc2_context_t *dev = (hwc2_context_t *)device;
+
+ LOG_FUNCTION_NAME
+
+ pthread_kill(dev->primary_vsync_thread, SIGTERM);
+ pthread_join(dev->primary_vsync_thread, NULL);
+
+ pthread_kill(dev->external_vsync_thread, SIGTERM);
+ pthread_join(dev->external_vsync_thread, NULL);
+
+ uninit_display(dev, HWC_DISPLAY_PRIMARY);
+ uninit_display(dev, HWC_DISPLAY_EXTERNAL);
+
+ if (dev) free(dev);
+
+ LOG_FUNCTION_NAME_EXIT
+ return 0;
+}
+
+//#define USE_HW_VSYNC
+#ifdef USE_HW_VSYNC
+/*
+Still have bugs, don't use it.
+*/
+int32_t wait_next_vsync(hwc2_context_t* ctx, nsecs_t* vsync_timestamp) {
+ static nsecs_t previewTime = 0;
+ nsecs_t vsyncDiff=0;
+ const nsecs_t period = ctx->vsync_period;
+ //we will delay hw vsync if missing one vsync interrupt isr.
+ int32_t ret = 0;
+
+ if (ioctl(ctx->displays[0].fb_info.fd, FBIO_WAITFORVSYNC, &ret) == -1) {
+ HWC_LOGEB("ioctrl error %d",ctx->displays[0].fb_info.fd);
+ ret=-1;
+ } else {
+ if (ret == 1) {
+ *vsync_timestamp = systemTime(CLOCK_MONOTONIC);
+ vsyncDiff=*vsync_timestamp - previewTime;
+ if (previewTime != 0) HWC_LOGEB("wait for vsync success %lld",vsyncDiff);
+ vsyncDiff%=period;
+ if (vsyncDiff > 500000) {
+ nsecs_t sleep ;
+ sleep = (period - vsyncDiff);
+ *vsync_timestamp+=sleep;
+ struct timespec spec;
+ spec.tv_sec = *vsync_timestamp / 1000000000;
+ spec.tv_nsec = *vsync_timestamp % 1000000000;
+ clock_nanosleep(CLOCK_MONOTONIC, TIMER_ABSTIME, &spec, NULL);
+ }
+ previewTime = *vsync_timestamp;
+ ret=0;
+ } else {
+ HWC_LOGEA("wait for vsync fail");
+ ret=-1;
+ }
+ }
+ return ret;
+}
+#else
+//software
+int32_t wait_next_primary_vsync(hwc2_context_t* ctx, nsecs_t* vsync_timestamp) {
+ display_context_t displayctx = ctx->displays[HWC_DISPLAY_PRIMARY];
+ static nsecs_t vsync_time = 0;
+ static nsecs_t old_vsync_period = 0;
+ nsecs_t sleep;
+ nsecs_t now = systemTime(CLOCK_MONOTONIC);
+
+ //cal the last vsync time with old period
+ if (displayctx.vsync_period != old_vsync_period) {
+ if (old_vsync_period > 0) {
+ vsync_time = vsync_time +
+ ((now - vsync_time) / old_vsync_period) * old_vsync_period;
+ }
+ old_vsync_period = displayctx.vsync_period;
+ }
+
+ //set to next vsync time
+ vsync_time += displayctx.vsync_period;
+
+ // we missed, find where the next vsync should be
+ if (vsync_time - now < 0) {
+ vsync_time = now + (displayctx.vsync_period -
+ ((now - vsync_time) % displayctx.vsync_period));
+ }
+
+ struct timespec spec;
+ spec.tv_sec = vsync_time / 1000000000;
+ spec.tv_nsec = vsync_time % 1000000000;
+
+ int32_t err;
+ do {
+ err = clock_nanosleep(CLOCK_MONOTONIC, TIMER_ABSTIME, &spec, NULL);
+ } while (err<0 && errno == EINTR);
+ *vsync_timestamp = vsync_time;
+
+ return err;
+}
+
+int32_t wait_next_external_vsync(hwc2_context_t* ctx, nsecs_t* vsync_timestamp) {
+ display_context_t displayctx = ctx->displays[HWC_DISPLAY_EXTERNAL];
+ static nsecs_t vsync_time = 0;
+ static nsecs_t old_vsync_period = 0;
+ nsecs_t sleep;
+ nsecs_t now = systemTime(CLOCK_MONOTONIC);
+
+ //cal the last vsync time with old period
+ if (displayctx.vsync_period != old_vsync_period) {
+ if (old_vsync_period > 0) {
+ vsync_time = vsync_time +
+ ((now - vsync_time) / old_vsync_period) * old_vsync_period;
+ }
+ old_vsync_period = displayctx.vsync_period;
+ }
+
+ //set to next vsync time
+ vsync_time += displayctx.vsync_period;
+
+ // we missed, find where the next vsync should be
+ if (vsync_time - now < 0) {
+ vsync_time = now + (displayctx.vsync_period -
+ ((now - vsync_time) % displayctx.vsync_period));
+ }
+
+ struct timespec spec;
+ spec.tv_sec = vsync_time / 1000000000;
+ spec.tv_nsec = vsync_time % 1000000000;
+
+ int32_t err;
+ do {
+ err = clock_nanosleep(CLOCK_MONOTONIC, TIMER_ABSTIME, &spec, NULL);
+ } while (err<0 && errno == EINTR);
+ *vsync_timestamp = vsync_time;
+
+ return err;
+}
+
+#endif
+
+static void *hwc2_primary_vsync_thread(void *data) {
+ uint32_t displayId = HWC_DISPLAY_PRIMARY;
+ hwc2_context_t* ctx = (hwc2_context_t*)data;
+ display_context_t *dctx = &(ctx->displays[displayId]);
+ nsecs_t timestamp;
+
+ setpriority(PRIO_PROCESS, 0, HAL_PRIORITY_URGENT_DISPLAY - 1);
+ sleep(2);
+
+ while (true) {
+ pthread_mutex_lock(&hwc_mutex[displayId]);
+ while (!dctx->vsync_enable) {
+ pthread_cond_wait(&hwc_cond[displayId],
+ &hwc_mutex[displayId]);
+ }
+ pthread_mutex_unlock(&hwc_mutex[displayId]);
+
+ if (wait_next_primary_vsync(ctx, &timestamp) == 0) {
+ if (ctx->vsync_cb.vsync)
+ ctx->vsync_cb.vsync(ctx->vsync_cb.callbackData,
+ displayId, timestamp);
+ }
+ }
+
+ return NULL;
+}
+
+static void *hwc2_external_vsync_thread(void *data) {
+ uint32_t displayId = HWC_DISPLAY_EXTERNAL;
+ hwc2_context_t* ctx = (hwc2_context_t*)data;
+ display_context_t *dctx = &(ctx->displays[displayId]);
+ int64_t timestamp;
+
+ setpriority(PRIO_PROCESS, 0, HAL_PRIORITY_URGENT_DISPLAY-1);
+ sleep(2);
+
+ while (true) {
+ pthread_mutex_lock(&hwc_mutex[displayId]);
+ while (!dctx->vsync_enable) {
+ pthread_cond_wait(&hwc_cond[displayId],
+ &hwc_mutex[displayId]);
+ }
+ pthread_mutex_unlock(&hwc_mutex[displayId]);
+
+ if (wait_next_external_vsync(ctx, &timestamp) == 0) {
+ if (dctx->connected && ctx->vsync_cb.vsync)
+ ctx->vsync_cb.vsync(ctx->vsync_cb.callbackData,
+ displayId, timestamp);
+ }
+ }
+
+ return NULL;
+}
+
+//#define SIMULATE_HOT_PLUG 1
+#define HDMI_UEVENT "DEVPATH=/devices/virtual/switch/hdmi_audio"
+#define HDMI_POWER_UEVENT "DEVPATH=/devices/virtual/switch/hdmi_power"
+
+static bool isMatch(hwc_uevent_data_t* ueventData, const char* matchName) {
+ bool matched = false;
+ // Consider all zero-delimited fields of the buffer.
+ const char* field = ueventData->buf;
+ const char* end = ueventData->buf + ueventData->len + 1;
+ do {
+ if (!strcmp(field, matchName)) {
+ HWC_LOGEB("Matched uevent message with pattern: %s", matchName);
+ matched = true;
+ }
+ //SWITCH_STATE=1, SWITCH_NAME=hdmi
+ else if (strstr(field, "SWITCH_STATE=")) {
+ strcpy(ueventData->state, field + strlen("SWITCH_STATE="));
+ }
+ else if (strstr(field, "SWITCH_NAME=")) {
+ strcpy(ueventData->name, field + strlen("SWITCH_NAME="));
+ }
+ field += strlen(field) + 1;
+ } while (field != end);
+
+ return matched;
+}
+
+#define HOTPLUG_UEVENT_DEBUG
+static void *hwc2_hotplug_thread(void *data) {
+ hwc2_context_t* ctx = (hwc2_context_t*)data;
+ display_context_t *dctx = &(ctx->displays[HWC_DISPLAY_PRIMARY]);
+ bool fpsChanged = false, sizeChanged = false;
+ //use uevent instead of usleep, because it has some delay
+ hwc_uevent_data_t u_data;
+ memset(&u_data, 0, sizeof(hwc_uevent_data_t));
+ int32_t fd = uevent_init();
+
+ while (fd > 0) {
+ fpsChanged = false;
+ sizeChanged = false;
+ u_data.len= uevent_next_event(u_data.buf, sizeof(u_data.buf) - 1);
+ if (u_data.len <= 0)
+ continue;
+
+ u_data.buf[u_data.len] = '\0';
+
+#ifdef HOTPLUG_UEVENT_DEBUG
+ //change@/devices/virtual/switch/hdmi ACTION=change DEVPATH=/devices/virtual/switch/hdmi
+ //SUBSYSTEM=switch SWITCH_NAME=hdmi SWITCH_STATE=0 SEQNUM=2791
+ char printBuf[1024] = {0};
+ memcpy(printBuf, u_data.buf, u_data.len);
+ for (int32_t i = 0; i < u_data.len; i++) {
+ if (printBuf[i] == 0x0)
+ printBuf[i] = ' ';
+ }
+ HWC_LOGEB("Received uevent message: %s", printBuf);
+#endif
+ if (isMatch(&u_data, HDMI_UEVENT)) {
+ HWC_LOGEB("HDMI switch_state: %s switch_name: %s\n", u_data.state, u_data.name);
+ if ((!strcmp(u_data.name, "hdmi_audio")) &&
+ (!strcmp(u_data.state, "1"))) {
+ // update vsync period if neccessry
+ nsecs_t newperiod = chk_output_mode(ctx->mode);
+ // check if vsync period is changed
+ if (newperiod > 0 && newperiod != dctx->vsync_period) {
+ dctx->vsync_period = newperiod;
+ fpsChanged = true;
+ }
+ sizeChanged = chk_vinfo(ctx, HWC_DISPLAY_PRIMARY);
+ if (fpsChanged || sizeChanged) {
+ if (ctx->hotplug_cb.hotplug) {
+ ctx->hotplug_cb.hotplug(
+ ctx->hotplug_cb.callbackData,
+ HWC_DISPLAY_PRIMARY, 1);
+ }
+ }
+ }
+ }
+ }
+
+ return NULL;
+}
+
+/*
+ * Device Functions
+ *
+ * All of these functions take as their first parameter a device pointer, so
+ * this parameter is omitted from the described parameter lists.
+ */
+
+/* createVirtualDisplay(..., width, height, format, outDisplay)
+ * Descriptor: HWC2_FUNCTION_CREATE_VIRTUAL_DISPLAY
+ * Must be provided by all HWC2 devices
+ *
+ * Creates a new virtual display with the given width and height. The format
+ * passed into this function is the default format requested by the consumer of
+ * the virtual display output buffers. If a different format will be returned by
+ * the device, it should be returned in this parameter so it can be set properly
+ * when handing the buffers to the consumer.
+ *
+ * The display will be assumed to be on from the time the first frame is
+ * presented until the display is destroyed.
+ *
+ * Parameters:
+ * width - width in pixels
+ * height - height in pixels
+ * format - prior to the call, the default output buffer format selected by
+ * the consumer; after the call, the format the device will produce
+ * outDisplay - the newly-created virtual display; pointer will be non-NULL
+ *
+ * Returns HWC2_ERROR_NONE or one of the following errors:
+ * HWC2_ERROR_UNSUPPORTED - the width or height is too large for the device to
+ * be able to create a virtual display
+ * HWC2_ERROR_NO_RESOURCES - the device is unable to create a new virtual
+ * display at this time
+ */
+hwc2_error_t createVirtualDisplay(
+ hwc2_device_t* device, uint32_t width,
+ uint32_t height, android_pixel_format_t* format,
+ hwc2_display_t* outDisplay) {
+ hwc2_context_t *ctx = (hwc2_context_t*)device;
+ display_context_t *vctx = &(ctx->displays[HWC_DISPLAY_VIRTUAL]);
+
+ if (width > 1920 && height > 1080) {
+ return HWC2_ERROR_UNSUPPORTED;
+ }
+
+ vctx->vir_relfence = -1;
+ vctx->width = width;
+ vctx->height = height;
+ vctx->format = *format;
+ vctx->connected = true;
+
+ *outDisplay = HWC_DISPLAY_VIRTUAL;
+
+ // TODO:
+ return HWC2_ERROR_NONE;
+}
+
+/* destroyVirtualDisplay(..., display)
+ * Descriptor: HWC2_FUNCTION_DESTROY_VIRTUAL_DISPLAY
+ * Must be provided by all HWC2 devices
+ *
+ * Destroys a virtual display. After this call all resources consumed by this
+ * display may be freed by the device and any operations performed on this
+ * display should fail.
+ *
+ * Parameters:
+ * display - the virtual display to destroy
+ *
+ * Returns HWC2_ERROR_NONE or one of the following errors:
+ * HWC2_ERROR_BAD_DISPLAY - an invalid display handle was passed in
+ * HWC2_ERROR_BAD_PARAMETER - the display handle which was passed in does not
+ * refer to a virtual display
+ */
+hwc2_error_t destroyVirtualDisplay(
+ hwc2_device_t* device, hwc2_display_t display) {
+ hwc2_context_t *ctx = (hwc2_context_t*)device;
+ display_context_t *vctx = &(ctx->displays[HWC_DISPLAY_VIRTUAL]);
+
+ if (display != HWC_DISPLAY_VIRTUAL) {
+ return HWC2_ERROR_BAD_PARAMETER;
+ }
+ vctx->connected = false;
+ vctx->vir_relfence = -1;
+ vctx->width = 0;
+ vctx->height = 0;
+ vctx->format = (android_pixel_format)0;
+
+ // TODO:
+ return HWC2_ERROR_NONE;
+}
+
+/* dump(..., outSize, outBuffer)
+ * Descriptor: HWC2_FUNCTION_DUMP
+ * Must be provided by all HWC2 devices
+ *
+ * Retrieves implementation-defined debug information, which will be displayed
+ * during, for example, `dumpsys SurfaceFlinger`.
+ *
+ * If called with outBuffer == NULL, the device should store a copy of the
+ * desired output and return its length in bytes in outSize. If the device
+ * already has a stored copy, that copy should be purged and replaced with a
+ * fresh copy.
+ *
+ * If called with outBuffer != NULL, the device should copy its stored version
+ * of the output into outBuffer and store how many bytes of data it copied into
+ * outSize. Prior to this call, the client will have populated outSize with the
+ * maximum number of bytes outBuffer can hold. The device must not write more
+ * than this amount into outBuffer. If the device does not currently have a
+ * stored copy, then it should return 0 in outSize.
+ *
+ * Any data written into outBuffer need not be null-terminated.
+ *
+ * Parameters:
+ * outSize - if outBuffer was NULL, the number of bytes needed to copy the
+ * device's stored output; if outBuffer was not NULL, the number of bytes
+ * written into it, which must not exceed the value stored in outSize
+ * prior to the call; pointer will be non-NULL
+ * outBuffer - the buffer to write the dump output into; may be NULL as
+ * described above; data written into this buffer need not be
+ * null-terminated
+ */
+void dump(hwc2_device_t* device,
+ uint32_t* outSize,
+ char* outBuffer) {
+ hwc2_context_t *ctx = (hwc2_context_t*)device;
+ int32_t numHwLayers;
+
+ android::String8 result;
+ if (NULL == outBuffer) {
+ *outSize = 4096;
+ } else {
+ using namespace android;
+ result.appendFormat("Hardware Composer state (version major: %d, minor: %d):\n",
+ ctx->base.common.module->version_major, ctx->base.common.module->version_minor);
+ for (size_t i=0 ; i<HWC_NUM_PHYSICAL_DISPLAY_TYPES ; i++) {
+ display_context_t *dctx = &(ctx->displays[i]);
+ framebuffer_info_t *fbinfo = &(dctx->fb_info);
+ if (!dctx->connected)
+ continue;
+
+ result.appendFormat(" Display[%zd] configurations (* current):\n", i);
+ result.appendFormat(" %ux%u, xdpi=%f, ydpi=%f, refresh=%" PRId64 "\n",
+ fbinfo->info.xres, fbinfo->info.yres,
+ fbinfo->xdpi, fbinfo->ydpi, dctx->vsync_period);
+
+ for (i=0; i<HWC2_MAX_LAYERS; i++) {
+ if (NULL != dctx->hwc_layer[i])
+ numHwLayers++;
+ }
+
+ result.appendFormat(
+ " numHwLayers=%zu\n",numHwLayers);
+ result.append(
+ " type | handle | tr | blnd | source crop (l,t,r,b) | frame \n"
+ "-----------+----------+----+------+--------------------------------+------------------------\n");
+ for (i=0; i<HWC2_MAX_LAYERS; i++) {
+ const hwc_layer_t *hwclayer = dctx->hwc_layer[i];
+ if (hwclayer) {
+ int32_t type = (int32_t)hwclayer->dev_cmptype;
+
+ static char const* compositionTypeName[] = {
+ "UNKNOWN",
+ "GLES",
+ "HWC",
+ "SOLID",
+ "HWC_CURSOR",
+ "SIDEBAND"};
+ result.appendFormat(
+ " %9s | %08" PRIxPTR " | %02x | %04x |%7.1f,%7.1f,%7.1f,%7.1f |%5d,%5d,%5d,%5d \n",
+ compositionTypeName[type],
+ intptr_t(hwclayer->buf_hnd), hwclayer->transform, hwclayer->blend_mode,
+ hwclayer->source_crop.left, hwclayer->source_crop.top,
+ hwclayer->source_crop.right, hwclayer->source_crop.bottom,
+ hwclayer->display_frame.left, hwclayer->display_frame.top,
+ hwclayer->display_frame.right, hwclayer->display_frame.bottom);
+ }
+ }
+ }
+ *outSize = 4096;
+ strcpy(outBuffer, result.string());
+ }
+}
+
+/* getMaxVirtualDisplayCount(...)
+ * Descriptor: HWC2_FUNCTION_GET_MAX_VIRTUAL_DISPLAY_COUNT
+ * Must be provided by all HWC2 devices
+ *
+ * Returns the maximum number of virtual displays supported by this device
+ * (which may be 0). The client will not attempt to create more than this many
+ * virtual displays on this device. This number must not change for the lifetime
+ * of the device.
+ */
+uint32_t getMaxVirtualDisplayCount(
+ hwc2_device_t* device) {
+ hwc2_context_t *ctx = (hwc2_context_t*)device;
+
+ // TODO:
+ // we only support one virtual display for now.
+ return 1;
+}
+
+/* registerCallback(..., descriptor, callbackData, pointer)
+ * Descriptor: HWC2_FUNCTION_REGISTER_CALLBACK
+ * Must be provided by all HWC2 devices
+ *
+ * Provides a callback for the device to call. All callbacks take a callbackData
+ * item as the first parameter, so this value should be stored with the callback
+ * for later use. The callbackData may differ from one callback to another. If
+ * this function is called multiple times with the same descriptor, later
+ * callbacks replace earlier ones.
+ *
+ * Parameters:
+ * descriptor - which callback should be set
+ * callBackdata - opaque data which must be passed back through the callback
+ * pointer - a non-NULL function pointer corresponding to the descriptor
+ *
+ * Returns HWC2_ERROR_NONE or one of the following errors:
+ * HWC2_ERROR_BAD_PARAMETER - descriptor was invalid
+ */
+hwc2_error_t registerCallback(
+ hwc2_device_t* device,
+ hwc2_callback_descriptor_t descriptor,
+ hwc2_callback_data_t callbackData,
+ hwc2_function_pointer_t pointer) {
+ hwc2_context_t *ctx = (hwc2_context_t*)device;
+
+ switch (descriptor) {
+ // callback functions
+ case HWC2_CALLBACK_HOTPLUG:
+ {
+ hwc2_hotplug_cb_t cb = ctx->hotplug_cb;
+ cb.callbackData = callbackData;
+ cb.hotplug = reinterpret_cast<HWC2_PFN_HOTPLUG>(pointer);
+
+ if (cb.hotplug) {
+ HWC_LOGEA("First primary hotplug!");
+ cb.hotplug(cb.callbackData,
+ HWC_DISPLAY_PRIMARY, 1);
+ }
+ break;
+ }
+ case HWC2_CALLBACK_REFRESH:
+ {
+ hwc2_refresh_cb_t cb = ctx->refresh_cb;
+ cb.callbackData = callbackData;
+ cb.refresh = reinterpret_cast<HWC2_PFN_REFRESH>(pointer);
+ break;
+ }
+ case HWC2_CALLBACK_VSYNC:
+ {
+ hwc2_vsync_cb_t cb = ctx->vsync_cb;
+ cb.callbackData = callbackData;
+ cb.vsync = reinterpret_cast<HWC2_PFN_VSYNC>(pointer);
+ break;
+ }
+ case HWC2_CALLBACK_INVALID:
+ default:
+ ALOGE("registerCallback bad parameter: %d", descriptor);
+ return HWC2_ERROR_BAD_PARAMETER;
+ }
+
+ return HWC2_ERROR_NONE;
+}
+
+/*
+ * Display Functions
+ *
+ * All of these functions take as their first two parameters a device pointer
+ * and a display handle, so these parameters are omitted from the described
+ * parameter lists.
+ */
+
+/* acceptDisplayChanges(...)
+ * Descriptor: HWC2_FUNCTION_ACCEPT_DISPLAY_CHANGES
+ * Must be provided by all HWC2 devices
+ *
+ * Accepts the changes required by the device from the previous validateDisplay
+ * call (which may be queried using getChangedCompositionTypes) and revalidates
+ * the display. This function is equivalent to requesting the changed types from
+ * getChangedCompositionTypes, setting those types on the corresponding layers,
+ * and then calling validateDisplay again.
+ *
+ * After this call it must be valid to present this display. Calling this after
+ * validateDisplay returns 0 changes must succeed with HWC2_ERROR_NONE, but
+ * should have no other effect.
+ *
+ * Returns HWC2_ERROR_NONE or one of the following errors:
+ * HWC2_ERROR_BAD_DISPLAY - an invalid display handle was passed in
+ * HWC2_ERROR_NOT_VALIDATED - validateDisplay has not been called
+ */
+hwc2_error_t acceptDisplayChanges(
+ hwc2_device_t* device, hwc2_display_t display) {
+ hwc2_context_t *ctx = (hwc2_context_t*)device;
+ display_context_t *dctx = &(ctx->displays[display]);
+ isValidDisplay(dctx, display);
+
+ // HWC2_ERROR_NOT_VALIDATED
+
+ return HWC2_ERROR_NONE;
+
+}
+
+/* createLayer(..., outLayer)
+ * Descriptor: HWC2_FUNCTION_CREATE_LAYER
+ * Must be provided by all HWC2 devices
+ *
+ * Creates a new layer on the given display.
+ *
+ * Parameters:
+ * outLayer - the handle of the new layer; pointer will be non-NULL
+ *
+ * Returns HWC2_ERROR_NONE or one of the following errors:
+ * HWC2_ERROR_BAD_DISPLAY - an invalid display handle was passed in
+ * HWC2_ERROR_NO_RESOURCES - the device was unable to create this layer
+ */
+hwc2_error_t createLayer(
+ hwc2_device_t* device, hwc2_display_t display,
+ hwc2_layer_t* outLayer) {
+ hwc2_context_t *ctx = (hwc2_context_t*)device;
+ display_context_t *dctx = &(ctx->displays[display]);
+ isValidDisplay(dctx, display);
+
+ hwc_layer_t *hwclayer = NULL;
+ uint32_t i = 0;
+
+ hwclayer = (hwc_layer_t *)malloc(sizeof(hwc_layer_t));
+ if (NULL == hwclayer) return HWC2_ERROR_NO_RESOURCES;
+ memset(hwclayer, 0, sizeof(hwc_layer_t));
+ hwclayer->layer_acquirefence = -1;
+
+ for (i=0; i<HWC2_MAX_LAYERS; i++) {
+ if (NULL == dctx->hwc_layer[i]) {
+ dctx->hwc_layer[i] = hwclayer;
+ break;
+ }
+ }
+ if (i > HWC2_MAX_LAYERS) return HWC2_ERROR_NO_RESOURCES;
+
+ *outLayer = (hwc2_layer_t)i;
+ return HWC2_ERROR_NONE;
+}
+
+/* destroyLayer(..., layer)
+ * Descriptor: HWC2_FUNCTION_DESTROY_LAYER
+ * Must be provided by all HWC2 devices
+ *
+ * Destroys the given layer.
+ *
+ * Parameters:
+ * layer - the handle of the layer to destroy
+ *
+ * Returns HWC2_ERROR_NONE or one of the following errors:
+ * HWC2_ERROR_BAD_DISPLAY - an invalid display handle was passed in
+ * HWC2_ERROR_BAD_LAYER - an invalid layer handle was passed in
+ */
+hwc2_error_t destroyLayer(
+ hwc2_device_t* device, hwc2_display_t display,
+ hwc2_layer_t layer) {
+ hwc2_context_t *ctx = (hwc2_context_t*)device;
+ display_context_t *dctx = &(ctx->displays[display]);
+ isValidDisplay(dctx, display);
+
+ if (NULL != dctx->hwc_layer[layer]) {
+ free(dctx->hwc_layer[layer]);
+ dctx->hwc_layer[layer] = NULL;
+ return HWC2_ERROR_NONE;
+ } else {
+ return HWC2_ERROR_BAD_LAYER;
+ }
+}
+
+/* getActiveConfig(..., outConfig)
+ * Descriptor: HWC2_FUNCTION_GET_ACTIVE_CONFIG
+ * Must be provided by all HWC2 devices
+ *
+ * Retrieves which display configuration is currently active.
+ *
+ * If no display configuration is currently active, this function must return
+ * HWC2_ERROR_BAD_CONFIG and place no configuration handle in outConfig. It is
+ * the responsibility of the client to call setActiveConfig with a valid
+ * configuration before attempting to present anything on the display.
+ *
+ * Parameters:
+ * outConfig - the currently active display configuration; pointer will be
+ * non-NULL
+ *
+ * Returns HWC2_ERROR_NONE or one of the following errors:
+ * HWC2_ERROR_BAD_DISPLAY - an invalid display handle was passed in
+ * HWC2_ERROR_BAD_CONFIG - no configuration is currently active
+ */
+hwc2_error_t getActiveConfig(
+ hwc2_device_t* device, hwc2_display_t display,
+ hwc2_config_t* outConfig) {
+ hwc2_context_t *ctx = (hwc2_context_t*)device;
+ display_context_t *dctx = &(ctx->displays[display]);
+ isValidDisplay(dctx, display);
+
+ return HWC2_ERROR_NONE;
+}
+
+/* getChangedCompositionTypes(..., outNumElements, outLayers, outTypes)
+ * Descriptor: HWC2_FUNCTION_GET_CHANGED_COMPOSITION_TYPES
+ * Must be provided by all HWC2 devices
+ *
+ * Retrieves the layers for which the device requires a different composition
+ * type than had been set prior to the last call to validateDisplay. The client
+ * will either update its state with these types and call acceptDisplayChanges,
+ * or will set new types and attempt to validate the display again.
+ *
+ * outLayers and outTypes may be NULL to retrieve the number of elements which
+ * will be returned. The number of elements returned must be the same as the
+ * value returned in outNumTypes from the last call to validateDisplay.
+ *
+ * Parameters:
+ * outNumElements - if outLayers or outTypes were NULL, the number of layers
+ * and types which would have been returned; if both were non-NULL, the
+ * number of elements returned in outLayers and outTypes, which must not
+ * exceed the value stored in outNumElements prior to the call; pointer
+ * will be non-NULL
+ * outLayers - an array of layer handles
+ * outTypes - an array of composition types, each corresponding to an element
+ * of outLayers
+ *
+ * Returns HWC2_ERROR_NONE or one of the following errors:
+ * HWC2_ERROR_BAD_DISPLAY - an invalid display handle was passed in
+ * HWC2_ERROR_NOT_VALIDATED - validateDisplay has not been called for this
+ * display
+ */
+hwc2_error_t getChangedCompositionTypes(
+ hwc2_device_t* device, hwc2_display_t display,
+ uint32_t* outNumElements, hwc2_layer_t* outLayers,
+ hwc2_composition_t* outTypes) {
+ hwc2_context_t *ctx = (hwc2_context_t*)device;
+ display_context_t *dctx = &(ctx->displays[display]);
+ isValidDisplay(dctx, display);
+
+ hwc_layer_t *hwclayer = NULL;
+ hwc2_layer_t layer;
+ uint32_t num_type = 0;
+ // if (!dctx->validated) return HWC2_ERROR_NOT_VALIDATED;
+
+ // if outLayers or outTypes were NULL, the number of layers and types which would have been returned.
+ if (NULL == outLayers || NULL == outTypes) {
+ /* for (uint32_t i=0; i<HWC2_MAX_LAYERS; i++) {
+ hwclayer = dctx->hwc_layer[i];
+ if (hwclayer && hwclayer->dev_cmptype
+ && hwclayer->dev_cmptype != hwclayer->clt_cmptype) {
+ num_type++;
+ continue;
+ }
+ } */
+ *outNumElements = dctx->num_chgtyps;
+ } else {
+ for (uint32_t i=0; i<dctx->num_chgtyps; i++) {
+ hwc2_layer_t layer = dctx->types_layer[i];
+ hwclayer = dctx->hwc_layer[layer];
+
+ if (hwclayer && hwclayer->dev_cmptype
+ && hwclayer->dev_cmptype != hwclayer->clt_cmptype) {
+ HWC_LOGDB("composition type is changed: %d -> %d", hwclayer->clt_cmptype, hwclayer->dev_cmptype);
+ outLayers[num_type] = layer;
+ outTypes[num_type] = hwclayer->dev_cmptype;
+ num_type++;
+ continue;
+ }
+ }
+
+ if (num_type > 0) {
+ if (dctx->num_chgtyps == num_type) {
+ HWC_LOGDB("There are %d layers type has changed.", num_type);
+ *outNumElements = num_type;
+ } else {
+ HWC_LOGEB("outNumElements:%d is not same as outNumTypes: %d.",
+ num_type, dctx->num_chgtyps);
+ }
+ } else {
+ HWC_LOGDA("No layers compositon type changed.");
+ }
+ }
+
+ return HWC2_ERROR_NONE;
+}
+
+/* getClientTargetSupport(..., width, height, format, dataspace)
+ * Descriptor: HWC2_FUNCTION_GET_CLIENT_TARGET_SUPPORT
+ * Must be provided by all HWC2 devices
+ *
+ * Returns whether a client target with the given properties can be handled by
+ * the device.
+ *
+ * The valid formats can be found in android_pixel_format_t in
+ * <system/graphics.h>.
+ *
+ * For more about dataspaces, see setLayerDataspace.
+ *
+ * This function must return true for a client target with width and height
+ * equal to the active display configuration dimensions,
+ * HAL_PIXEL_FORMAT_RGBA_8888, and HAL_DATASPACE_UNKNOWN. It is not required to
+ * return true for any other configuration.
+ *
+ * Parameters:
+ * width - client target width in pixels
+ * height - client target height in pixels
+ * format - client target format
+ * dataspace - client target dataspace, as described in setLayerDataspace
+ *
+ * Returns HWC2_ERROR_NONE if the given configuration is supported or one of the
+ * following errors:
+ * HWC2_ERROR_BAD_DISPLAY - an invalid display handle was passed in
+ * HWC2_ERROR_UNSUPPORTED - the given configuration is not supported
+ */
+hwc2_error_t getClientTargetSupport(
+ hwc2_device_t* device, hwc2_display_t display, uint32_t width,
+ uint32_t height, android_pixel_format_t format,
+ android_dataspace_t dataspace) {
+ hwc2_context_t *ctx = (hwc2_context_t*)device;
+ display_context_t *dctx = &(ctx->displays[display]);
+ isValidDisplay(dctx, display);
+
+ struct framebuffer_info_t *fbinfo = &(dctx->fb_info);
+
+ if (width == fbinfo->info.xres
+ && height == fbinfo->info.yres
+ && format == HAL_PIXEL_FORMAT_RGBA_8888
+ && dataspace == HAL_DATASPACE_UNKNOWN) {
+ return HWC2_ERROR_NONE;
+ }
+
+ HWC_LOGEB("fbinfo: [%d x %d], client: [%d x %d]"
+ "format: %d, dataspace: %d",
+ fbinfo->info.xres,
+ fbinfo->info.yres,
+ width, height, format, dataspace);
+
+ // TODO: ?
+ return HWC2_ERROR_UNSUPPORTED;
+}
+
+/* getColorModes(..., outNumModes, outModes)
+ * Descriptor: HWC2_FUNCTION_GET_COLOR_MODES
+ * Must be provided by all HWC2 devices
+ *
+ * Returns the color modes supported on this display.
+ *
+ * The valid color modes can be found in android_color_mode_t in
+ * <system/graphics.h>. All HWC2 devices must support at least
+ * HAL_COLOR_MODE_NATIVE.
+ *
+ * outNumModes may be NULL to retrieve the number of modes which will be
+ * returned.
+ *
+ * Parameters:
+ * outNumModes - if outModes was NULL, the number of modes which would have
+ * been returned; if outModes was not NULL, the number of modes returned,
+ * which must not exceed the value stored in outNumModes prior to the
+ * call; pointer will be non-NULL
+ * outModes - an array of color modes
+ *
+ * Returns HWC2_ERROR_NONE or one of the following errors:
+ * HWC2_ERROR_BAD_DISPLAY - an invalid display handle was passed in
+ */
+hwc2_error_t getColorModes(
+ hwc2_device_t* device, hwc2_display_t display,
+ uint32_t* outNumModes, int32_t* /*android_color_mode_t*/ outModes) {
+ hwc2_context_t *ctx = (hwc2_context_t*)device;
+ display_context_t *dctx = &(ctx->displays[display]);
+ isValidDisplay(dctx, display);
+
+ // TODO: ?
+ return HWC2_ERROR_NONE;
+}
+
+/* getDisplayAttribute(..., config, attribute, outValue)
+ * Descriptor: HWC2_FUNCTION_GET_DISPLAY_ATTRIBUTE
+ * Must be provided by all HWC2 devices
+ *
+ * Returns a display attribute value for a particular display configuration.
+ *
+ * Any attribute which is not supported or for which the value is unknown by the
+ * device must return a value of -1.
+ *
+ * Parameters:
+ * config - the display configuration for which to return attribute values
+ * attribute - the attribute to query
+ * outValue - the value of the attribute; the pointer will be non-NULL
+ *
+ * Returns HWC2_ERROR_NONE or one of the following errors:
+ * HWC2_ERROR_BAD_DISPLAY - an invalid display handle was passed in
+ * HWC2_ERROR_BAD_CONFIG - config does not name a valid configuration for this
+ * display
+ */
+hwc2_error_t getDisplayAttribute(
+ hwc2_device_t* device, hwc2_display_t display,
+ hwc2_config_t config, hwc2_attribute_t attribute, int32_t* outValue) {
+ hwc2_context_t *ctx = (hwc2_context_t*)device;
+ display_context_t *dctx = &(ctx->displays[display]);
+ isValidDisplay(dctx, display);
+
+ struct framebuffer_info_t *fbinfo = &(dctx->fb_info);
+
+ // TODO: HWC2_ERROR_BAD_CONFIG?
+ switch (attribute) {
+ case HWC2_ATTRIBUTE_VSYNC_PERIOD:
+ *outValue = dctx->vsync_period;
+ break;
+ case HWC2_ATTRIBUTE_WIDTH:
+ *outValue = fbinfo->info.xres;
+ break;
+ case HWC2_ATTRIBUTE_HEIGHT:
+ *outValue = fbinfo->info.yres;
+ break;
+ case HWC2_ATTRIBUTE_DPI_X:
+ *outValue = fbinfo->xdpi*1000;
+ break;
+ case HWC2_ATTRIBUTE_DPI_Y:
+ *outValue = fbinfo->ydpi*1000;
+ break;
+ default:
+ HWC_LOGEB("unknown display attribute %u", attribute);
+ *outValue = -1;
+ break;
+ }
+
+ return HWC2_ERROR_NONE;
+}
+
+/* getDisplayConfigs(..., outNumConfigs, outConfigs)
+ * Descriptor: HWC2_FUNCTION_GET_DISPLAY_CONFIGS
+ * Must be provided by all HWC2 devices
+ *
+ * Returns handles for all of the valid display configurations on this display.
+ *
+ * outConfigs may be NULL to retrieve the number of elements which will be
+ * returned.
+ *
+ * Parameters:
+ * outNumConfigs - if outConfigs was NULL, the number of configurations which
+ * would have been returned; if outConfigs was not NULL, the number of
+ * configurations returned, which must not exceed the value stored in
+ * outNumConfigs prior to the call; pointer will be non-NULL
+ * outConfigs - an array of configuration handles
+ *
+ * Returns HWC2_ERROR_NONE or one of the following errors:
+ * HWC2_ERROR_BAD_DISPLAY - an invalid display handle was passed in
+ */
+hwc2_error_t getDisplayConfigs(
+ hwc2_device_t* device, hwc2_display_t display,
+ uint32_t* outNumConfigs, hwc2_config_t* outConfigs) {
+ hwc2_context_t *ctx = (hwc2_context_t*)device;
+ display_context_t *dctx = &(ctx->displays[display]);
+ isValidDisplay(dctx, display);
+
+ if (display == HWC_DISPLAY_PRIMARY) {
+ if (NULL != outConfigs) outConfigs[0] = 0;
+ *outNumConfigs = 1;
+ } else if (display == HWC_DISPLAY_EXTERNAL) {
+ HWC_LOGEB("getDisplayConfigs:connect = %d", dctx->connected);
+ //if (!dctx->connected) return HWC2_ERROR_BAD_DISPLAY;
+ if (NULL != outConfigs) outConfigs[0] = 0;
+ *outNumConfigs = 1;
+ }
+
+ return HWC2_ERROR_NONE;
+}
+
+/* getDisplayName(..., outSize, outName)
+ * Descriptor: HWC2_FUNCTION_GET_DISPLAY_NAME
+ * Must be provided by all HWC2 devices
+ *
+ * Returns a human-readable version of the display's name.
+ *
+ * outName may be NULL to retrieve the length of the name.
+ *
+ * Parameters:
+ * outSize - if outName was NULL, the number of bytes needed to return the
+ * name if outName was not NULL, the number of bytes written into it,
+ * which must not exceed the value stored in outSize prior to the call;
+ * pointer will be non-NULL
+ * outName - the display's name
+ *
+ * Returns HWC2_ERROR_NONE or one of the following errors:
+ * HWC2_ERROR_BAD_DISPLAY - an invalid display handle was passed in
+ */
+hwc2_error_t getDisplayName(
+ hwc2_device_t* device, hwc2_display_t display,
+ uint32_t* outSize, char* outName) {
+ hwc2_context_t *ctx = (hwc2_context_t*)device;
+ display_context_t *dctx = &(ctx->displays[display]);
+ isValidDisplay(dctx, display);
+
+ android::String8 pmyName = android::String8("Primary Display");
+ android::String8 extName = android::String8("EXTERNAL Display");
+ android::String8 virName = android::String8("Virtual Display");
+
+ switch (display) {
+ case HWC_DISPLAY_PRIMARY:
+ if (NULL != outName) strcpy(outName, pmyName.string());
+ *outSize = pmyName.size()+1;
+ break;
+ case HWC_DISPLAY_EXTERNAL:
+ if (NULL != outName) strcpy(outName, extName.string());
+ *outSize = extName.size()+1;
+ break;
+ case HWC_DISPLAY_VIRTUAL:
+ if (NULL != outName) strcpy(outName, virName.string());
+ *outSize = virName.size()+1;
+ break;
+ default:
+ HWC_LOGEB("invalidate display %d", (int32_t)display);
+ break;
+ }
+
+ return HWC2_ERROR_NONE;
+}
+
+/* getDisplayRequests(..., outDisplayRequests, outNumElements, outLayers,
+ * outLayerRequests)
+ * Descriptor: HWC2_FUNCTION_GET_DISPLAY_REQUESTS
+ * Must be provided by all HWC2 devices
+ *
+ * Returns the display requests and the layer requests required for the last
+ * validated configuration.
+ *
+ * Display requests provide information about how the client should handle the
+ * client target. Layer requests provide information about how the client
+ * should handle an individual layer.
+ *
+ * If outLayers or outLayerRequests is NULL, the required number of layers and
+ * requests must be returned in outNumElements, but this number may also be
+ * obtained from validateDisplay as outNumRequests (outNumElements must be equal
+ * to the value returned in outNumRequests from the last call to
+ * validateDisplay).
+ *
+ * Parameters:
+ * outDisplayRequests - the display requests for the current validated state
+ * outNumElements - if outLayers or outLayerRequests were NULL, the number of
+ * elements which would have been returned, which must be equal to the
+ * value returned in outNumRequests from the last validateDisplay call on
+ * this display; if both were not NULL, the number of elements in
+ * outLayers and outLayerRequests, which must not exceed the value stored
+ * in outNumElements prior to the call; pointer will be non-NULL
+ * outLayers - an array of layers which all have at least one request
+ * outLayerRequests - the requests corresponding to each element of outLayers
+ *
+ * Returns HWC2_ERROR_NONE or one of the following errors:
+ * HWC2_ERROR_BAD_DISPLAY - an invalid display handle was passed in
+ * HWC2_ERROR_NOT_VALIDATED - validateDisplay has not been called for this
+ * display
+ */
+hwc2_error_t getDisplayRequests(
+ hwc2_device_t* device,
+ hwc2_display_t display,
+ hwc2_display_request_t* outDisplayRequests,
+ uint32_t* outNumElements,
+ hwc2_layer_t* outLayers,
+ hwc2_layer_request_t* outLayerRequests) {
+ hwc2_context_t *ctx = (hwc2_context_t*)device;
+ display_context_t *dctx = &(ctx->displays[display]);
+ isValidDisplay(dctx, display);
+
+ hwc_layer_t *hwclayer = NULL;
+ hwc2_layer_t layer;
+ uint32_t num_requests = 0;
+
+ //if (!dctx->validated) return HWC2_ERROR_NOT_VALIDATED;
+
+ // if outLayers or outTypes were NULL, the number of layers and types which would have been returned.
+ if (NULL == outLayers || NULL == outLayerRequests) {
+ /*for (uint32_t i=0; i<HWC2_MAX_LAYERS; i++) {
+ hwclayer = dctx->hwc_layer[i];
+ if (hwclayer && hwclayer->dev_cmptype && hwclayer->dev_cmptype != HWC2_COMPOSITION_CLIENT) {
+ num_requests++;
+ }
+ }*/
+ *outNumElements = dctx->num_lyrreqs;
+ } else {
+ for (uint32_t i=0; i<dctx->num_lyrreqs; i++) {
+ hwc2_layer_t layer = dctx->requests_layer[i];
+ hwc_layer_t *hwclayer = dctx->hwc_layer[layer];
+ outLayers[num_requests] = layer;
+ if (hwclayer && hwclayer->dev_cmptype != HWC2_COMPOSITION_CLIENT) {
+ outLayerRequests[num_requests] =
+ (hwc2_layer_request_t)HWC2_LAYER_REQUEST_CLEAR_CLIENT_TARGET;
+ }
+ num_requests++;
+ }
+
+ if (num_requests > 0) {
+ if (dctx->num_lyrreqs == num_requests) {
+ HWC_LOGDB("There are %d layer requests.", num_requests);
+ *outNumElements = num_requests;
+ } else {
+ HWC_LOGEB("outNumElements:%d is not same as outNumTypes: %d.",
+ num_requests, dctx->num_lyrreqs);
+ }
+ } else {
+ HWC_LOGDA("No layer requests.");
+ }
+ // dctx->num_lyrreqs = 0;
+ }
+
+ return HWC2_ERROR_NONE;
+}
+
+/* getDisplayType(..., outType)
+ * Descriptor: HWC2_FUNCTION_GET_DISPLAY_TYPE
+ * Must be provided by all HWC2 devices
+ *
+ * Returns whether the given display is a physical or virtual display.
+ *
+ * Parameters:
+ * outType - the type of the display; pointer will be non-NULL
+ *
+ * Returns HWC2_ERROR_NONE or one of the following errors:
+ * HWC2_ERROR_BAD_DISPLAY - an invalid display handle was passed in
+ */
+hwc2_error_t getDisplayType(
+ hwc2_device_t* device, hwc2_display_t display,
+ hwc2_display_type_t* outType) {
+ hwc2_context_t *ctx = (hwc2_context_t*)device;
+ display_context_t *dctx = &(ctx->displays[display]);
+ isValidDisplay(dctx, display);
+
+ switch (display) {
+ case HWC_DISPLAY_PRIMARY:
+ *outType = HWC2_DISPLAY_TYPE_PHYSICAL;
+ break;
+ case HWC_DISPLAY_EXTERNAL:
+ *outType = HWC2_DISPLAY_TYPE_PHYSICAL;
+ break;
+ case HWC_DISPLAY_VIRTUAL:
+ *outType = HWC2_DISPLAY_TYPE_VIRTUAL;
+ break;
+ default:
+ *outType = HWC2_DISPLAY_TYPE_INVALID;
+ HWC_LOGEB("invalidate display %d", (int32_t)display);
+ break;
+ }
+
+ return HWC2_ERROR_NONE;
+}
+
+/* getDozeSupport(..., outSupport)
+ * Descriptor: HWC2_FUNCTION_GET_DOZE_SUPPORT
+ * Must be provided by all HWC2 devices
+ *
+ * Returns whether the given display supports HWC2_POWER_MODE_DOZE and
+ * HWC2_POWER_MODE_DOZE_SUSPEND. DOZE_SUSPEND may not provide any benefit over
+ * DOZE (see the definition of hwc2_power_mode_t for more information), but if
+ * both DOZE and DOZE_SUSPEND are no different from HWC2_POWER_MODE_ON, the
+ * device should not claim support.
+ *
+ * Parameters:
+ * outSupport - whether the display supports doze modes (1 for yes, 0 for no);
+ * pointer will be non-NULL
+ *
+ * Returns HWC2_ERROR_NONE or one of the following errors:
+ * HWC2_ERROR_BAD_DISPLAY - an invalid display handle was passed in
+ */
+hwc2_error_t getDozeSupport(
+ hwc2_device_t* device, hwc2_display_t display,
+ int32_t* outSupport) {
+ hwc2_context_t *ctx = (hwc2_context_t*)device;
+ display_context_t *dctx = &(ctx->displays[display]);
+ isValidDisplay(dctx, display);
+
+ // TODO: we do not support Doze for now.
+ *outSupport = 0;
+
+ return HWC2_ERROR_NONE;
+}
+
+/* getHdrCapabilities(..., outNumTypes, outTypes, outMaxLuminance,
+ * outMaxAverageLuminance, outMinLuminance)
+ * Descriptor: HWC2_FUNCTION_GET_HDR_CAPABILITIES
+ * Must be provided by all HWC2 devices
+ *
+ * Returns the high dynamic range (HDR) capabilities of the given display, which
+ * are invariant with regard to the active configuration.
+ *
+ * Displays which are not HDR-capable must return no types in outTypes and set
+ * outNumTypes to 0.
+ *
+ * If outTypes is NULL, the required number of HDR types must be returned in
+ * outNumTypes.
+ *
+ * Parameters:
+ * outNumTypes - if outTypes was NULL, the number of types which would have
+ * been returned; if it was not NULL, the number of types stored in
+ * outTypes, which must not exceed the value stored in outNumTypes prior
+ * to the call; pointer will be non-NULL
+ * outTypes - an array of HDR types, may have 0 elements if the display is not
+ * HDR-capable
+ * outMaxLuminance - the desired content maximum luminance for this display in
+ * cd/m^2; pointer will be non-NULL
+ * outMaxAverageLuminance - the desired content maximum frame-average
+ * luminance for this display in cd/m^2; pointer will be non-NULL
+ * outMinLuminance - the desired content minimum luminance for this display in
+ * cd/m^2; pointer will be non-NULL
+ *
+ * Returns HWC2_ERROR_NONE or one of the following errors:
+ * HWC2_ERROR_BAD_DISPLAY - an invalid display handle was passed in
+ */
+hwc2_error_t getHdrCapabilities(
+ hwc2_device_t* device, hwc2_display_t display,
+ uint32_t* outNumTypes, int32_t* /*android_hdr_t*/ outTypes,
+ float* outMaxLuminance, float* outMaxAverageLuminance,
+ float* outMinLuminance) {
+ hwc2_context_t *ctx = (hwc2_context_t*)device;
+ display_context_t *dctx = &(ctx->displays[display]);
+ isValidDisplay(dctx, display);
+
+ // TODO: currently not support Hdr Capabilityies on aml platform???
+ *outNumTypes = 0;
+
+ return HWC2_ERROR_NONE;
+
+}
+
+/* getReleaseFences(..., outNumElements, outLayers, outFences)
+ * Descriptor: HWC2_FUNCTION_GET_RELEASE_FENCES
+ * Must be provided by all HWC2 devices
+ *
+ * Retrieves the release fences for device layers on this display which will
+ * receive new buffer contents this frame.
+ *
+ * A release fence is a file descriptor referring to a sync fence object which
+ * will be signaled after the device has finished reading from the buffer
+ * presented in the prior frame. This indicates that it is safe to start writing
+ * to the buffer again. If a given layer's fence is not returned from this
+ * function, it will be assumed that the buffer presented on the previous frame
+ * is ready to be written.
+ *
+ * The fences returned by this function should be unique for each layer (even if
+ * they point to the same underlying sync object), and ownership of the fences
+ * is transferred to the client, which is responsible for closing them.
+ *
+ * If outLayers or outFences is NULL, the required number of layers and fences
+ * must be returned in outNumElements.
+ *
+ * Parameters:
+ * outNumElements - if outLayers or outFences were NULL, the number of
+ * elements which would have been returned; if both were not NULL, the
+ * number of elements in outLayers and outFences, which must not exceed
+ * the value stored in outNumElements prior to the call; pointer will be
+ * non-NULL
+ * outLayers - an array of layer handles
+ * outFences - an array of sync fence file descriptors as described above,
+ * each corresponding to an element of outLayers
+ *
+ * Returns HWC2_ERROR_NONE or one of the following errors:
+ * HWC2_ERROR_BAD_DISPLAY - an invalid display handle was passed in
+ */
+hwc2_error_t getReleaseFences(
+ hwc2_device_t* device, hwc2_display_t display,
+ uint32_t* outNumElements, hwc2_layer_t* outLayers,
+ int32_t* outFences) {
+ hwc2_context_t *ctx = (hwc2_context_t*)device;
+ display_context_t *dctx = &(ctx->displays[display]);
+ isValidDisplay(dctx, display);
+
+ hwc_layer_t *hwclayer = NULL;
+ hwc2_layer_t layer;
+ uint32_t num_layer = 0;
+
+ /*for (uint32_t i=0; i<HWC2_MAX_LAYERS; i++) {
+ hwclayer = dctx->hwc_layer[i];
+ if (hwclayer->layer_acquirefence > -1) {
+ if (NULL == outLayers || NULL == outFences) {
+ num_layer++;
+ } else {
+ outLayers[num_layer] = i;
+ outFences[num_layer++] = hwclayer->layer_acquirefence;
+ }
+ }
+ }*/
+
+ /*if (display == HWC_DISPLAY_VIRTUAL) {
+ if (NULL == outLayers || NULL == outFences) {
+ HWC_LOGEA("No layer have set buffer yet.", dctx->tgr_acqfence);
+ } else {
+ HWC_LOGEA("No layer have set buffer yet.");
+ }
+ }*/
+
+ if (NULL == outLayers || NULL == outFences) {
+ for (uint32_t i=0; i<HWC2_MAX_LAYERS; i++) {
+ hwclayer = dctx->hwc_layer[i];
+ if (hwclayer && hwclayer->layer_acquirefence > -1) num_layer++;
+ }
+ } else {
+ for (uint32_t i=0; i<HWC2_MAX_LAYERS; i++) {
+ hwclayer = dctx->hwc_layer[i];
+ if (hwclayer && hwclayer->layer_acquirefence > -1) {
+ outLayers[num_layer] = i;
+ outFences[num_layer++] = hwclayer->layer_acquirefence;
+ hwclayer->layer_acquirefence = -1;
+ }
+ }
+ }
+
+ if (num_layer > 0) {
+ HWC_LOGDB("There are %d layer requests.", num_layer);
+ *outNumElements = num_layer;
+ } else {
+ HWC_LOGDA("No layer have set buffer yet.");
+ }
+
+ return HWC2_ERROR_NONE;
+}
+
+/* presentDisplay(..., outRetireFence)
+ * Descriptor: HWC2_FUNCTION_PRESENT_DISPLAY
+ * Must be provided by all HWC2 devices
+ *
+ * Presents the current display contents on the screen (or in the case of
+ * virtual displays, into the output buffer).
+ *
+ * Prior to calling this function, the display must be successfully validated
+ * with validateDisplay. Note that setLayerBuffer and setLayerSurfaceDamage
+ * specifically do not count as layer state, so if there are no other changes
+ * to the layer state (or to the buffer's properties as described in
+ * setLayerBuffer), then it is safe to call this function without first
+ * validating the display.
+ *
+ * If this call succeeds, outRetireFence will be populated with a file
+ * descriptor referring to a retire sync fence object. For physical displays,
+ * this fence will be signaled when the result of composition of the prior frame
+ * is no longer necessary (because it has been copied or replaced by this
+ * frame). For virtual displays, this fence will be signaled when writes to the
+ * output buffer have completed and it is safe to read from it.
+ *
+ * Parameters:
+ * outRetireFence - a sync fence file descriptor as described above; pointer
+ * will be non-NULL
+ *
+ * Returns HWC2_ERROR_NONE or one of the following errors:
+ * HWC2_ERROR_BAD_DISPLAY - an invalid display handle was passed in
+ * HWC2_ERROR_NO_RESOURCES - no valid output buffer has been set for a virtual
+ * display
+ * HWC2_ERROR_NOT_VALIDATED - validateDisplay has not successfully been called
+ * for this display
+ */
+int32_t presentDisplay(
+ hwc2_device_t* device, hwc2_display_t display,
+ int32_t* outRetireFence) {
+ hwc2_context_t *ctx = (hwc2_context_t*)device;
+ display_context_t *dctx = &(ctx->displays[display]);
+ isValidDisplay(dctx, display);
+
+ int32_t err = HWC2_ERROR_NONE;
+
+ if (display == HWC_DISPLAY_VIRTUAL) {
+ // deal virtual display.
+ if (dctx->connected) {
+ if (!dctx->virhnd) {
+ HWC_LOGEA("virtual display handle is null.");
+ *outRetireFence = -1;
+ return HWC2_ERROR_NO_RESOURCES;
+ }
+ if (private_handle_t::validate(dctx->virhnd) < 0)
+ return HWC2_ERROR_NO_RESOURCES;
+
+ if (dctx->tgr_acqfence) {
+ sync_wait(dctx->tgr_acqfence, 500);
+ close(dctx->tgr_acqfence);
+ dctx->tgr_acqfence = -1;
+ }
+ *outRetireFence = dctx->vir_relfence;
+ }
+ } else {
+ // deal with physical display.
+ hwc_layer_t *hwclayer = NULL;
+
+ // TODO: need improve the way to set video axis.
+#if WITH_LIBPLAYER_MODULE
+ for (uint32_t i=0; i<dctx->num_lyrreqs; i++) {
+ hwc2_layer_t layer = dctx->requests_layer[i];
+ hwclayer = dctx->hwc_layer[layer];
+ if (hwclayer && hwclayer->dev_cmptype == HWC2_COMPOSITION_DEVICE) {
+ hwc2_overlay_compose(ctx, display, hwclayer);
+ }
+ }
+#endif
+ err = hwc2_fb_post(ctx, display, outRetireFence);
+ }
+ // reset num_chgtyps & num_lyrreqs to 0.
+ dctx->num_chgtyps = 0;
+ dctx->num_lyrreqs = 0;
+
+ // reset validated to false.
+ // dctx->validated = false;
+ return err;
+}
+
+/* setActiveConfig(..., config)
+ * Descriptor: HWC2_FUNCTION_SET_ACTIVE_CONFIG
+ * Must be provided by all HWC2 devices
+ *
+ * Sets the active configuration for this display. Upon returning, the given
+ * display configuration should be active and remain so until either this
+ * function is called again or the display is disconnected.
+ *
+ * Parameters:
+ * config - the new display configuration
+ *
+ * Returns HWC2_ERROR_NONE or one of the following errors:
+ * HWC2_ERROR_BAD_DISPLAY - an invalid display handle was passed in
+ * HWC2_ERROR_BAD_CONFIG - the configuration handle passed in is not valid for
+ * this display
+ */
+hwc2_error_t setActiveConfig(
+ hwc2_device_t* device,
+ hwc2_display_t display,
+ hwc2_config_t config) {
+ hwc2_context_t *ctx = (hwc2_context_t*)device;
+ display_context_t *dctx = &(ctx->displays[display]);
+ isValidDisplay(dctx, display);
+
+ // TODO:
+ return HWC2_ERROR_NONE;
+}
+
+/* setClientTarget(..., target, acquireFence, dataspace, damage)
+ * Descriptor: HWC2_FUNCTION_SET_CLIENT_TARGET
+ * Must be provided by all HWC2 devices
+ *
+ * Sets the buffer handle which will receive the output of client composition.
+ * Layers marked as HWC2_COMPOSITION_CLIENT will be composited into this buffer
+ * prior to the call to presentDisplay, and layers not marked as
+ * HWC2_COMPOSITION_CLIENT should be composited with this buffer by the device.
+ *
+ * The buffer handle provided may be null if no layers are being composited by
+ * the client. This must not result in an error (unless an invalid display
+ * handle is also provided).
+ *
+ * Also provides a file descriptor referring to an acquire sync fence object,
+ * which will be signaled when it is safe to read from the client target buffer.
+ * If it is already safe to read from this buffer, -1 may be passed instead.
+ * The device must ensure that it is safe for the client to close this file
+ * descriptor at any point after this function is called.
+ *
+ * For more about dataspaces, see setLayerDataspace.
+ *
+ * The damage parameter describes a surface damage region as defined in the
+ * description of setLayerSurfaceDamage.
+ *
+ * Will be called before presentDisplay if any of the layers are marked as
+ * HWC2_COMPOSITION_CLIENT. If no layers are so marked, then it is not
+ * necessary to call this function. It is not necessary to call validateDisplay
+ * after changing the target through this function.
+ *
+ * Parameters:
+ * target - the new target buffer
+ * acquireFence - a sync fence file descriptor as described above
+ * dataspace - the dataspace of the buffer, as described in setLayerDataspace
+ * damage - the surface damage region
+ *
+ * Returns HWC2_ERROR_NONE or one of the following errors:
+ * HWC2_ERROR_BAD_DISPLAY - an invalid display handle was passed in
+ * HWC2_ERROR_BAD_PARAMETER - the new target handle was invalid
+ */
+hwc2_error_t setClientTarget(
+ hwc2_device_t* device, hwc2_display_t display,
+ buffer_handle_t target, int32_t acquireFence,
+ android_dataspace_t dataspace, hwc_region_t damage) {
+ hwc2_context_t *ctx = (hwc2_context_t*)device;
+ display_context_t *dctx = &(ctx->displays[display]);
+ isValidDisplay(dctx, display);
+
+ if (target && private_handle_t::validate(target) < 0) {
+ return HWC2_ERROR_BAD_PARAMETER;
+ }
+
+ if (NULL != target) {
+ dctx->clnt_tgrhnd = target;
+ dctx->clnt_tgrdmge = damage;
+ if (-1 != acquireFence) {
+ dctx->tgr_acqfence = acquireFence;
+ // wait acquireFence to be signaled, wait 5s.
+ // sync_wait(acquireFence, 5000);
+ }
+ // TODO: HWC2_ERROR_BAD_PARAMETER && dataspace && damage.
+ } else {
+ HWC_LOGDA("client target is null!, no need to update this frame.");
+ }
+
+ return HWC2_ERROR_NONE;
+}
+
+/* setColorMode(..., mode)
+ * Descriptor: HWC2_FUNCTION_SET_COLOR_MODE
+ * Must be provided by all HWC2 devices
+ *
+ * Sets the color mode of the given display.
+ *
+ * Upon returning from this function, the color mode change must have fully
+ * taken effect.
+ *
+ * The valid color modes can be found in android_color_mode_t in
+ * <system/graphics.h>. All HWC2 devices must support at least
+ * HAL_COLOR_MODE_NATIVE, and displays are assumed to be in this mode upon
+ * hotplug.
+ *
+ * Parameters:
+ * mode - the mode to set
+ *
+ * Returns HWC2_ERROR_NONE or one of the following errors:
+ * HWC2_ERROR_BAD_DISPLAY - an invalid display handle was passed in
+ * HWC2_ERROR_BAD_PARAMETER - mode is not a valid color mode
+ * HWC2_ERROR_UNSUPPORTED - mode is not supported on this display
+ */
+hwc2_error_t setColorMode(
+ hwc2_device_t* device, hwc2_display_t display,
+ int32_t /*android_color_mode_t*/ mode) {
+ hwc2_context_t *ctx = (hwc2_context_t*)device;
+ display_context_t *dctx = &(ctx->displays[display]);
+ isValidDisplay(dctx, display);
+
+ // TODO: return HWC2_ERROR_BAD_PARAMETER && HWC2_ERROR_UNSUPPORTED;
+ dctx->color_mode = mode;
+ return HWC2_ERROR_NONE;
+}
+
+/* setColorTransform(..., matrix, hint)
+ * Descriptor: HWC2_FUNCTION_SET_COLOR_TRANSFORM
+ * Must be provided by all HWC2 devices
+ *
+ * Sets a color transform which will be applied after composition.
+ *
+ * If hint is not HAL_COLOR_TRANSFORM_ARBITRARY, then the device may use the
+ * hint to apply the desired color transform instead of using the color matrix
+ * directly.
+ *
+ * If the device is not capable of either using the hint or the matrix to apply
+ * the desired color transform, it should force all layers to client composition
+ * during validateDisplay.
+ *
+ * The matrix provided is an affine color transformation of the following form:
+ *
+ * |r.r r.g r.b 0|
+ * |g.r g.g g.b 0|
+ * |b.r b.g b.b 0|
+ * |Tr Tg Tb 1|
+ *
+ * This matrix will be provided in row-major form: {r.r, r.g, r.b, 0, g.r, ...}.
+ *
+ * Given a matrix of this form and an input color [R_in, G_in, B_in], the output
+ * color [R_out, G_out, B_out] will be:
+ *
+ * R_out = R_in * r.r + G_in * g.r + B_in * b.r + Tr
+ * G_out = R_in * r.g + G_in * g.g + B_in * b.g + Tg
+ * B_out = R_in * r.b + G_in * g.b + B_in * b.b + Tb
+ *
+ * Parameters:
+ * matrix - a 4x4 transform matrix (16 floats) as described above
+ * hint - a hint value which may be used instead of the given matrix unless it
+ * is HAL_COLOR_TRANSFORM_ARBITRARY
+ *
+ * Returns HWC2_ERROR_NONE or one of the following errors:
+ * HWC2_ERROR_BAD_DISPLAY - an invalid display handle was passed in
+ * HWC2_ERROR_BAD_PARAMETER - hint is not a valid color transform hint
+ */
+hwc2_error_t setColorTransform(
+ hwc2_device_t* device, hwc2_display_t display,
+ const float* matrix, int32_t /*android_color_transform_t*/ hint) {
+ hwc2_context_t *ctx = (hwc2_context_t*)device;
+ display_context_t *dctx = &(ctx->displays[display]);
+ isValidDisplay(dctx, display);
+
+ // TODO: return HWC2_ERROR_BAD_PARAMETER;
+
+ return HWC2_ERROR_NONE;
+}
+
+/* setOutputBuffer(..., buffer, releaseFence)
+ * Descriptor: HWC2_FUNCTION_SET_OUTPUT_BUFFER
+ * Must be provided by all HWC2 devices
+ *
+ * Sets the output buffer for a virtual display. That is, the buffer to which
+ * the composition result will be written.
+ *
+ * Also provides a file descriptor referring to a release sync fence object,
+ * which will be signaled when it is safe to write to the output buffer. If it
+ * is already safe to write to the output buffer, -1 may be passed instead. The
+ * device must ensure that it is safe for the client to close this file
+ * descriptor at any point after this function is called.
+ *
+ * Must be called at least once before presentDisplay, but does not have any
+ * interaction with layer state or display validation.
+ *
+ * Parameters:
+ * buffer - the new output buffer
+ * releaseFence - a sync fence file descriptor as described above
+ *
+ * Returns HWC2_ERROR_NONE or one of the following errors:
+ * HWC2_ERROR_BAD_DISPLAY - an invalid display handle was passed in
+ * HWC2_ERROR_BAD_PARAMETER - the new output buffer handle was invalid
+ * HWC2_ERROR_UNSUPPORTED - display does not refer to a virtual display
+ */
+hwc2_error_t setOutputBuffer(
+ hwc2_device_t* device, hwc2_display_t display,
+ buffer_handle_t buffer, int32_t releaseFence) {
+ hwc2_context_t *ctx = (hwc2_context_t*)device;
+ display_context_t *vctx = &(ctx->displays[HWC_DISPLAY_VIRTUAL]);
+
+ if (display != HWC_DISPLAY_VIRTUAL) {
+ HWC_LOGEB("Should be a virtual display: %d", (int32_t)display);
+ return HWC2_ERROR_UNSUPPORTED;
+ }
+
+ if (vctx->connected) {
+ if (buffer && private_handle_t::validate(buffer) < 0) {
+ HWC_LOGEA("buffer handle is invalid");
+ return HWC2_ERROR_BAD_PARAMETER;
+ }
+
+ if (NULL != buffer) {
+ vctx->virhnd = buffer;
+ vctx->vir_relfence = releaseFence;
+ } else {
+ HWC_LOGDA("Virtual Display output buffer target is null!, no need to update this frame.");
+ }
+ }
+ // TODO: do something?
+ return HWC2_ERROR_NONE;
+}
+
+/* setPowerMode(..., mode)
+ * Descriptor: HWC2_FUNCTION_SET_POWER_MODE
+ * Must be provided by all HWC2 devices
+ *
+ * Sets the power mode of the given display. The transition must be complete
+ * when this function returns. It is valid to call this function multiple times
+ * with the same power mode.
+ *
+ * All displays must support HWC2_POWER_MODE_ON and HWC2_POWER_MODE_OFF. Whether
+ * a display supports HWC2_POWER_MODE_DOZE or HWC2_POWER_MODE_DOZE_SUSPEND may
+ * be queried using getDozeSupport.
+ *
+ * Parameters:
+ * mode - the new power mode
+ *
+ * Returns HWC2_ERROR_NONE or one of the following errors:
+ * HWC2_ERROR_BAD_DISPLAY - an invalid display handle was passed in
+ * HWC2_ERROR_BAD_PARAMETER - mode was not a valid power mode
+ * HWC2_ERROR_UNSUPPORTED - mode was a valid power mode, but is not supported
+ * on this display
+ */
+hwc2_error_t setPowerMode(
+ hwc2_device_t* device, hwc2_display_t display,
+ hwc2_power_mode_t mode) {
+ hwc2_context_t *ctx = (hwc2_context_t*)device;
+ display_context_t *dctx = &(ctx->displays[display]);
+ isValidDisplay(dctx, display);
+
+ if (mode < HWC2_POWER_MODE_OFF || mode > HWC2_POWER_MODE_ON) {
+ HWC_LOGEB("setPowerMode bad parameter: %d", mode);
+ return HWC2_ERROR_BAD_PARAMETER;
+ }
+
+ return HWC2_ERROR_NONE;
+}
+
+/* setVsyncEnabled(..., enabled)
+ * Descriptor: HWC2_FUNCTION_SET_VSYNC_ENABLED
+ * Must be provided by all HWC2 devices
+ *
+ * Enables or disables the vsync signal for the given display. Virtual displays
+ * never generate vsync callbacks, and any attempt to enable vsync for a virtual
+ * display though this function must return HWC2_ERROR_NONE and have no other
+ * effect.
+ *
+ * Parameters:
+ * enabled - whether to enable or disable vsync
+ *
+ * Returns HWC2_ERROR_NONE or one of the following errors:
+ * HWC2_ERROR_BAD_DISPLAY - an invalid display handle was passed in
+ * HWC2_ERROR_BAD_PARAMETER - enabled was an invalid value
+ */
+hwc2_error_t setVsyncEnabled(
+ hwc2_device_t* device, hwc2_display_t display,
+ hwc2_vsync_t enabled) {
+ hwc2_context_t *ctx = (hwc2_context_t*)device;
+ display_context_t *dctx = &(ctx->displays[display]);
+ isValidDisplay(dctx, display);
+
+ if (HWC_DISPLAY_VIRTUAL == display)
+ return HWC2_ERROR_NONE;
+
+ switch (enabled) {
+ case HWC2_VSYNC_ENABLE:
+ dctx->vsync_enable = true;
+ break;
+ case HWC2_VSYNC_DISABLE:
+ dctx->vsync_enable = false;
+ break;
+ case HWC2_VSYNC_INVALID:
+ default:
+ ALOGE("setVsyncEnabled bad parameter: %d", enabled);
+ return HWC2_ERROR_BAD_PARAMETER;
+ }
+
+ pthread_mutex_lock(&hwc_mutex[display]);
+ pthread_cond_signal(&hwc_cond[display]);
+ pthread_mutex_unlock(&hwc_mutex[display]);
+
+ return HWC2_ERROR_NONE;
+}
+
+/* validateDisplay(..., outNumTypes, outNumRequests)
+ * Descriptor: HWC2_FUNCTION_VALIDATE_DISPLAY
+ * Must be provided by all HWC2 devices
+ *
+ * Instructs the device to inspect all of the layer state and determine if
+ * there are any composition type changes necessary before presenting the
+ * display. Permitted changes are described in the definition of
+ * hwc2_composition_t above.
+ *
+ * Also returns the number of layer requests required
+ * by the given layer configuration.
+ *
+ * Parameters:
+ * outNumTypes - the number of composition type changes required by the
+ * device; if greater than 0, the client must either set and validate new
+ * types, or call acceptDisplayChanges to accept the changes returned by
+ * getChangedCompositionTypes; must be the same as the number of changes
+ * returned by getChangedCompositionTypes (see the declaration of that
+ * function for more information); pointer will be non-NULL
+ * outNumRequests - the number of layer requests required by this layer
+ * configuration; must be equal to the number of layer requests returned
+ * by getDisplayRequests (see the declaration of that function for
+ * more information); pointer will be non-NULL
+ *
+ * Returns HWC2_ERROR_NONE if no changes are necessary and it is safe to present
+ * the display using the current layer state. Otherwise returns one of the
+ * following errors:
+ * HWC2_ERROR_BAD_DISPLAY - an invalid display handle was passed in
+ * HWC2_ERROR_HAS_CHANGES - outNumTypes was greater than 0 (see parameter list
+ * for more information)
+ */
+hwc2_error_t validateDisplay(
+ hwc2_device_t* device, hwc2_display_t display,
+ uint32_t* outNumTypes, uint32_t* outNumRequests) {
+ hwc2_context_t *ctx = (hwc2_context_t*)device;
+ display_context_t *dctx = &(ctx->displays[display]);
+ isValidDisplay(dctx, display);
+
+ hwc_layer_t *hwclayer = NULL;
+ uint32_t num_type = 0, num_requests = 0;
+
+ for (uint32_t i=0; i<HWC2_MAX_LAYERS; i++) {
+ hwclayer = dctx->hwc_layer[i];
+ if (hwclayer) {
+ if (display != HWC_DISPLAY_VIRTUAL) {
+ // Physical Display.
+ if (hwclayer->clt_cmptype == HWC2_COMPOSITION_DEVICE) {
+ // video overlay.
+ if (hwclayer->buf_hnd) {
+ private_handle_t const* hnd = reinterpret_cast<private_handle_t const*>(hwclayer->buf_hnd);
+ if (hnd->flags & private_handle_t::PRIV_FLAGS_VIDEO_OVERLAY) {
+ hwclayer->dev_cmptype = HWC2_COMPOSITION_DEVICE;
+ //dctx->types_layer[num_type] = i;
+ dctx->requests_layer[num_requests] = i;
+ //num_type++; num_requests++;
+ num_requests++;
+ continue;
+ }
+ }
+
+ // change all other device type to client.
+ hwclayer->dev_cmptype = HWC2_COMPOSITION_CLIENT;
+ dctx->types_layer[num_type] = i;
+ num_type++;
+ continue;
+ }
+
+ // cursor layer.
+#if ENABLE_CURSOR_LAYER
+ if (hwclayer->clt_cmptype == HWC2_COMPOSITION_CURSOR) {
+ HWC_LOGDA("This is a Cursor layer!");
+ if (display == HWC_DISPLAY_VIRTUAL && dctx->virhnd
+ && private_handle_t::validate(dctx->virhnd) >=0) {
+ hwclayer->dev_cmptype = HWC2_COMPOSITION_CLIENT;
+ dctx->types_layer[num_type] = i;
+ num_type++;
+ } else {
+ hwclayer->dev_cmptype = HWC2_COMPOSITION_CURSOR;
+ dctx->requests_layer[num_requests] = i;
+ num_requests++;
+ }
+ continue;
+ }
+#endif
+
+ // sideband stream.
+ if (hwclayer->clt_cmptype == HWC2_COMPOSITION_SIDEBAND && hwclayer->sideband_stream) {
+ // TODO: we just transact SIDEBAND to OVERLAY for now;
+ HWC_LOGDA("get HWC_SIDEBAND layer, just change to overlay");
+ hwclayer->dev_cmptype = HWC2_COMPOSITION_DEVICE;
+ dctx->types_layer[num_type] = i;
+ dctx->requests_layer[num_requests] = i;
+ num_type++; num_requests++;
+ continue;
+ }
+
+ // TODO: solid color.
+ if (hwclayer->clt_cmptype == HWC2_COMPOSITION_SOLID_COLOR) {
+ HWC_LOGDA("This is a Solid Color layer!");
+ hwclayer->dev_cmptype = HWC2_COMPOSITION_SOLID_COLOR;
+ dctx->requests_layer[num_requests] = i;
+ num_requests++;
+ continue;
+ }
+ } else {
+ // Virtual Display.
+ if (dctx->virhnd && private_handle_t::validate(dctx->virhnd) >=0) {
+ if (hwclayer->clt_cmptype != HWC2_COMPOSITION_CLIENT) {
+ // change all other device type to client.
+ hwclayer->dev_cmptype = HWC2_COMPOSITION_CLIENT;
+ dctx->types_layer[num_type] = i;
+ num_type++;
+ continue;
+ }
+ }
+ }
+ }
+ }
+
+ if (num_requests > 0) {
+ HWC_LOGDB("There are %d layer requests.", num_requests);
+ *outNumRequests = dctx->num_lyrreqs = num_requests;
+ }
+
+ // mark the validate function is called.(???)
+ // dctx->validated = true;
+ if (num_type > 0) {
+ HWC_LOGDB("there are %d layer types has changed.", num_type);
+ *outNumTypes = dctx->num_chgtyps= num_type;
+ return HWC2_ERROR_HAS_CHANGES;
+ }
+
+ return HWC2_ERROR_NONE;
+}
+
+/*
+ * Layer Functions
+ *
+ * These are functions which operate on layers, but which do not modify state
+ * that must be validated before use. See also 'Layer State Functions' below.
+ *
+ * All of these functions take as their first three parameters a device pointer,
+ * a display handle for the display which contains the layer, and a layer
+ * handle, so these parameters are omitted from the described parameter lists.
+ */
+
+/* setCursorPosition(..., x, y)
+ * Descriptor: HWC2_FUNCTION_SET_CURSOR_POSITION
+ * Must be provided by all HWC2 devices
+ *
+ * Asynchonously sets the position of a cursor layer.
+ *
+ * Prior to validateDisplay, a layer may be marked as HWC2_COMPOSITION_CURSOR.
+ * If validation succeeds (i.e., the device does not request a composition
+ * change for that layer), then once a buffer has been set for the layer and it
+ * has been presented, its position may be set by this function at any time
+ * between presentDisplay and any subsequent validateDisplay calls for this
+ * display.
+ *
+ * Once validateDisplay is called, this function will not be called again until
+ * the validate/present sequence is completed.
+ *
+ * May be called from any thread so long as it is not interleaved with the
+ * validate/present sequence as described above.
+ *
+ * Parameters:
+ * x - the new x coordinate (in pixels from the left of the screen)
+ * y - the new y coordinate (in pixels from the top of the screen)
+ *
+ * Returns HWC2_ERROR_NONE or one of the following errors:
+ * HWC2_ERROR_BAD_DISPLAY - an invalid display handle was passed in
+ * HWC2_ERROR_BAD_LAYER - the layer is invalid or is not currently marked as
+ * HWC2_COMPOSITION_CURSOR
+ * HWC2_ERROR_NOT_VALIDATED - the device is currently in the middle of the
+ * validate/present sequence
+ */
+hwc2_error_t setCursorPosition(
+ hwc2_device_t* device, hwc2_display_t display,
+ hwc2_layer_t layer, int32_t x, int32_t y) {
+#if ENABLE_CURSOR_LAYER
+ hwc2_context_t *ctx = (hwc2_context_t*)device;
+ display_context_t *dctx = &(ctx->displays[display]);
+ isValidDisplay(dctx, display);
+
+ hwc_layer_t *hwclayer = dctx->hwc_layer[layer];
+ struct cursor_context_t *cursor_ctx = &(dctx->cursor_ctx);
+ struct framebuffer_info_t *cbinfo = &(cursor_ctx->cb_info);
+ struct fb_cursor cinfo;
+
+ // Bad layer.
+ if (NULL == hwclayer)
+ return HWC2_ERROR_BAD_LAYER;
+
+ if (HWC2_COMPOSITION_CURSOR != hwclayer->clt_cmptype)
+ return HWC2_ERROR_BAD_LAYER;
+
+ // TODO: ...HWC2_ERROR_NOT_VALIDATED?
+
+ if (cbinfo->fd < 0) {
+ HWC_LOGEB("hwc_setCursorPositionAsync fd=%d", cbinfo->fd );
+ }else {
+ cinfo.hot.x = x;
+ cinfo.hot.y = y;
+ if (display == HWC_DISPLAY_PRIMARY) {
+ HWC_LOGDB("hwc_setCursorPositionAsync x_pos=%d, y_pos=%d", cinfo.hot.x, cinfo.hot.y);
+ ioctl(cbinfo->fd, FBIO_CURSOR, &cinfo);
+ } else if(display == HWC_DISPLAY_EXTERNAL) {
+ // TODO:
+ HWC_LOGDA("hwc_setCursorPositionAsync external display need show cursor too! ");
+ //ioctl(cbinfo->fd, FBIO_CURSOR, &cinfo);
+ }
+ }
+#endif
+ return HWC2_ERROR_NONE;
+}
+
+/* setLayerBuffer(..., buffer, acquireFence)
+ * Descriptor: HWC2_FUNCTION_SET_LAYER_BUFFER
+ * Must be provided by all HWC2 devices
+ *
+ * Sets the buffer handle to be displayed for this layer. If the buffer
+ * properties set at allocation time (width, height, format, and usage) have not
+ * changed since the previous frame, it is not necessary to call validateDisplay
+ * before calling presentDisplay unless new state needs to be validated in the
+ * interim.
+ *
+ * Also provides a file descriptor referring to an acquire sync fence object,
+ * which will be signaled when it is safe to read from the given buffer. If it
+ * is already safe to read from the buffer, -1 may be passed instead. The
+ * device must ensure that it is safe for the client to close this file
+ * descriptor at any point after this function is called.
+ *
+ * This function must return HWC2_ERROR_NONE and have no other effect if called
+ * for a layer with a composition type of HWC2_COMPOSITION_SOLID_COLOR (because
+ * it has no buffer) or HWC2_COMPOSITION_SIDEBAND or HWC2_COMPOSITION_CLIENT
+ * (because synchronization and buffer updates for these layers are handled
+ * elsewhere).
+ *
+ * Parameters:
+ * buffer - the buffer handle to set
+ * acquireFence - a sync fence file descriptor as described above
+ *
+ * Returns HWC2_ERROR_NONE or one of the following errors:
+ * HWC2_ERROR_BAD_LAYER - an invalid layer handle was passed in
+ * HWC2_ERROR_BAD_PARAMETER - the buffer handle passed in was invalid
+ */
+hwc2_error_t setLayerBuffer(
+ hwc2_device_t* device, hwc2_display_t display,
+ hwc2_layer_t layer, buffer_handle_t buffer,
+ int32_t acquireFence) {
+ hwc2_context_t *ctx = (hwc2_context_t*)device;
+ display_context_t *dctx = &(ctx->displays[display]);
+ isValidDisplay(dctx, display);
+
+ hwc_layer_t *hwclayer = dctx->hwc_layer[layer];
+
+ // Bad layer.
+ if (NULL == hwclayer)
+ return HWC2_ERROR_BAD_LAYER;
+
+ // Bad parameter
+ if (buffer && private_handle_t::validate(buffer) < 0)
+ return HWC2_ERROR_BAD_PARAMETER;
+
+ if (NULL != buffer) {
+ hwclayer->buf_hnd = buffer;
+ if (-1 != acquireFence) {
+ hwclayer->layer_acquirefence = acquireFence;
+ // wait acquireFence to be signaled, wait 5s.
+ // sync_wait(acquireFence, 5000);
+ }
+ } else {
+ HWC_LOGDA("Layer buffer is null! no need to update this layer.");
+ }
+
+ return HWC2_ERROR_NONE;
+}
+
+/* setLayerSurfaceDamage(..., damage)
+ * Descriptor: HWC2_FUNCTION_SET_LAYER_SURFACE_DAMAGE
+ * Must be provided by all HWC2 devices
+ *
+ * Provides the region of the source buffer which has been modified since the
+ * last frame. This region does not need to be validated before calling
+ * presentDisplay.
+ *
+ * Once set through this function, the damage region remains the same until a
+ * subsequent call to this function.
+ *
+ * If damage.numRects > 0, then it may be assumed that any portion of the source
+ * buffer not covered by one of the rects has not been modified this frame. If
+ * damage.numRects == 0, then the whole source buffer must be treated as if it
+ * has been modified.
+ *
+ * If the layer's contents are not modified relative to the prior frame, damage
+ * will contain exactly one empty rect([0, 0, 0, 0]).
+ *
+ * The damage rects are relative to the pre-transformed buffer, and their origin
+ * is the top-left corner. They will not exceed the dimensions of the latched
+ * buffer.
+ *
+ * Parameters:
+ * damage - the new surface damage region
+ *
+ * Returns HWC2_ERROR_NONE or one of the following errors:
+ * HWC2_ERROR_BAD_LAYER - an invalid layer handle was passed in
+ */
+hwc2_error_t setLayerSurfaceDamage(
+ hwc2_device_t* device, hwc2_display_t display,
+ hwc2_layer_t layer, hwc_region_t damage) {
+ hwc2_context_t *ctx = (hwc2_context_t*)device;
+ display_context_t *dctx = &(ctx->displays[display]);
+ isValidDisplay(dctx, display);
+
+ hwc_layer_t *hwclayer = dctx->hwc_layer[layer];
+
+ // Bad layer.
+ if (NULL == hwclayer)
+ return HWC2_ERROR_BAD_LAYER;
+
+ // TODO: still have some work to do here.
+ hwclayer->demage_region = damage;
+ return HWC2_ERROR_NONE;
+}
+
+/*
+ * Layer State Functions
+ *
+ * These functions modify the state of a given layer. They do not take effect
+ * until the display configuration is successfully validated with
+ * validateDisplay and the display contents are presented with presentDisplay.
+ *
+ * All of these functions take as their first three parameters a device pointer,
+ * a display handle for the display which contains the layer, and a layer
+ * handle, so these parameters are omitted from the described parameter lists.
+ */
+
+/* setLayerBlendMode(..., mode)
+ * Descriptor: HWC2_FUNCTION_SET_LAYER_BLEND_MODE
+ * Must be provided by all HWC2 devices
+ *
+ * Sets the blend mode of the given layer.
+ *
+ * Parameters:
+ * mode - the new blend mode
+ *
+ * Returns HWC2_ERROR_NONE or one of the following errors:
+ * HWC2_ERROR_BAD_LAYER - an invalid layer handle was passed in
+ * HWC2_ERROR_BAD_PARAMETER - an invalid blend mode was passed in
+ */
+hwc2_error_t setLayerBlendMode(
+ hwc2_device_t* device, hwc2_display_t display, hwc2_layer_t layer,
+ hwc2_blend_mode_t mode) {
+ hwc2_context_t *ctx = (hwc2_context_t*)device;
+ display_context_t *dctx = &(ctx->displays[display]);
+ isValidDisplay(dctx, display);
+
+ hwc_layer_t *hwclayer = dctx->hwc_layer[layer];
+
+ // Bad layer.
+ if (NULL == hwclayer)
+ return HWC2_ERROR_BAD_LAYER;
+
+ if (mode < HWC2_BLEND_MODE_INVALID
+ || mode > HWC2_BLEND_MODE_COVERAGE)
+ return HWC2_ERROR_BAD_PARAMETER;
+
+ hwclayer->blend_mode= mode;
+ return HWC2_ERROR_NONE;
+}
+
+/* setLayerColor(..., color)
+ * Descriptor: HWC2_FUNCTION_SET_LAYER_COLOR
+ * Must be provided by all HWC2 devices
+ *
+ * Sets the color of the given layer. If the composition type of the layer is
+ * not HWC2_COMPOSITION_SOLID_COLOR, this call must return HWC2_ERROR_NONE and
+ * have no other effect.
+ *
+ * Parameters:
+ * color - the new color
+ *
+ * Returns HWC2_ERROR_NONE or one of the following errors:
+ * HWC2_ERROR_BAD_LAYER - an invalid layer handle was passed in
+ */
+hwc2_error_t setLayerColor(
+ hwc2_device_t* device, hwc2_display_t display,
+ hwc2_layer_t layer, hwc_color_t color) {
+ hwc2_context_t *ctx = (hwc2_context_t*)device;
+ display_context_t *dctx = &(ctx->displays[display]);
+ isValidDisplay(dctx, display);
+
+ hwc_layer_t *hwclayer = dctx->hwc_layer[layer];
+
+ // Bad layer.
+ if (NULL == hwclayer)
+ return HWC2_ERROR_BAD_LAYER;
+
+ hwclayer->color = color;
+ return HWC2_ERROR_NONE;
+}
+
+/* setLayerCompositionType(..., type)
+ * Descriptor: HWC2_FUNCTION_SET_LAYER_COMPOSITION_TYPE
+ * Must be provided by all HWC2 devices
+ *
+ * Sets the desired composition type of the given layer. During validateDisplay,
+ * the device may request changes to the composition types of any of the layers
+ * as described in the definition of hwc2_composition_t above.
+ *
+ * Parameters:
+ * type - the new composition type
+ *
+ * Returns HWC2_ERROR_NONE or one of the following errors:
+ * HWC2_ERROR_BAD_LAYER - an invalid layer handle was passed in
+ * HWC2_ERROR_BAD_PARAMETER - an invalid composition type was passed in
+ * HWC2_ERROR_UNSUPPORTED - a valid composition type was passed in, but it is
+ * not supported by this device
+ */
+hwc2_error_t setLayerCompositionType(
+ hwc2_device_t* device, hwc2_display_t display,
+ hwc2_layer_t layer, hwc2_composition_t type) {
+ hwc2_context_t *ctx = (hwc2_context_t*)device;
+ display_context_t *dctx = &(ctx->displays[display]);
+ isValidDisplay(dctx, display);
+
+ hwc_layer_t *hwclayer = dctx->hwc_layer[layer];
+
+ // Bad layer.
+ if (NULL == hwclayer)
+ return HWC2_ERROR_BAD_LAYER;
+
+ // Bad parameter.
+ if (type < HWC2_COMPOSITION_INVALID
+ || type > HWC2_COMPOSITION_SIDEBAND)
+ return HWC2_ERROR_BAD_PARAMETER;
+
+ // Do not support solid color for now.
+ if (type == HWC2_COMPOSITION_SOLID_COLOR)
+ return HWC2_ERROR_UNSUPPORTED;
+
+ hwclayer->clt_cmptype = type;
+ return HWC2_ERROR_NONE;
+}
+
+/* setLayerDataspace(..., dataspace)
+ * Descriptor: HWC2_FUNCTION_SET_LAYER_DATASPACE
+ * Must be provided by all HWC2 devices
+ *
+ * Sets the dataspace that the current buffer on this layer is in.
+ *
+ * The dataspace provides more information about how to interpret the buffer
+ * contents, such as the encoding standard and color transform.
+ *
+ * See the values of android_dataspace_t in <system/graphics.h> for more
+ * information.
+ *
+ * Parameters:
+ * dataspace - the new dataspace
+ *
+ * Returns HWC2_ERROR_NONE or one of the following errors:
+ * HWC2_ERROR_BAD_LAYER - an invalid layer handle was passed in
+ */
+hwc2_error_t setLayerDataspace(
+ hwc2_device_t* device, hwc2_display_t display, hwc2_layer_t layer,
+ int32_t /*android_dataspace_t*/ dataspace) {
+ hwc2_context_t *ctx = (hwc2_context_t*)device;
+ display_context_t *dctx = &(ctx->displays[display]);
+ isValidDisplay(dctx, display);
+
+ hwc_layer_t *hwclayer = dctx->hwc_layer[layer];
+
+ // Bad layer.
+ if (NULL == hwclayer)
+ return HWC2_ERROR_BAD_LAYER;
+
+ hwclayer->dataspace = dataspace;
+ return HWC2_ERROR_NONE;
+}
+
+/* setLayerDisplayFrame(..., frame)
+ * Descriptor: HWC2_FUNCTION_SET_LAYER_DISPLAY_FRAME
+ * Must be provided by all HWC2 devices
+ *
+ * Sets the display frame (the portion of the display covered by a layer) of the
+ * given layer. This frame will not exceed the display dimensions.
+ *
+ * Parameters:
+ * frame - the new display frame
+ *
+ * Returns HWC2_ERROR_NONE or one of the following errors:
+ * HWC2_ERROR_BAD_LAYER - an invalid layer handle was passed in
+ */
+hwc2_error_t setLayerDisplayFrame(
+ hwc2_device_t* device, hwc2_display_t display,
+ hwc2_layer_t layer, hwc_rect_t frame) {
+ hwc2_context_t *ctx = (hwc2_context_t*)device;
+ display_context_t *dctx = &(ctx->displays[display]);
+ isValidDisplay(dctx, display);
+
+ hwc_layer_t *hwclayer = dctx->hwc_layer[layer];
+
+ // Bad layer.
+ if (NULL == hwclayer)
+ return HWC2_ERROR_BAD_LAYER;
+
+ hwclayer->display_frame = frame;
+ return HWC2_ERROR_NONE;
+}
+
+/* setLayerPlaneAlpha(..., alpha)
+ * Descriptor: HWC2_FUNCTION_SET_LAYER_PLANE_ALPHA
+ * Must be provided by all HWC2 devices
+ *
+ * Sets an alpha value (a floating point value in the range [0.0, 1.0]) which
+ * will be applied to the whole layer. It can be conceptualized as a
+ * preprocessing step which applies the following function:
+ * if (blendMode == HWC2_BLEND_MODE_PREMULTIPLIED)
+ * out.rgb = in.rgb * planeAlpha
+ * out.a = in.a * planeAlpha
+ *
+ * If the device does not support this operation on a layer which is marked
+ * HWC2_COMPOSITION_DEVICE, it must request a composition type change to
+ * HWC2_COMPOSITION_CLIENT upon the next validateDisplay call.
+ *
+ * Parameters:
+ * alpha - the plane alpha value to apply
+ *
+ * Returns HWC2_ERROR_NONE or one of the following errors:
+ * HWC2_ERROR_BAD_LAYER - an invalid layer handle was passed in
+ */
+hwc2_error_t setLayerPlaneAlpha(
+ hwc2_device_t* device, hwc2_display_t display,
+ hwc2_layer_t layer, float alpha) {
+ hwc2_context_t *ctx = (hwc2_context_t*)device;
+ display_context_t *dctx = &(ctx->displays[display]);
+ isValidDisplay(dctx, display);
+
+ hwc_layer_t *hwclayer = dctx->hwc_layer[layer];
+
+ // Bad layer.
+ if (NULL == hwclayer)
+ return HWC2_ERROR_BAD_LAYER;
+
+ hwclayer->alpha = alpha;
+ return HWC2_ERROR_NONE;
+}
+
+/* setLayerSidebandStream(..., stream)
+ * Descriptor: HWC2_FUNCTION_SET_LAYER_SIDEBAND_STREAM
+ * Provided by HWC2 devices which support HWC2_CAPABILITY_SIDEBAND_STREAM
+ *
+ * Sets the sideband stream for this layer. If the composition type of the given
+ * layer is not HWC2_COMPOSITION_SIDEBAND, this call must return HWC2_ERROR_NONE
+ * and have no other effect.
+ *
+ * Parameters:
+ * stream - the new sideband stream
+ *
+ * Returns HWC2_ERROR_NONE or one of the following errors:
+ * HWC2_ERROR_BAD_LAYER - an invalid layer handle was passed in
+ * HWC2_ERROR_BAD_PARAMETER - an invalid sideband stream was passed in
+ */
+hwc2_error_t setLayerSidebandStream(
+ hwc2_device_t* device, hwc2_display_t display,
+ hwc2_layer_t layer, const native_handle_t* stream) {
+ hwc2_context_t *ctx = (hwc2_context_t*)device;
+ display_context_t *dctx = &(ctx->displays[display]);
+ isValidDisplay(dctx, display);
+
+ hwc_layer_t *hwclayer = dctx->hwc_layer[layer];
+
+ // Bad layer.
+ if (NULL == hwclayer)
+ return HWC2_ERROR_BAD_LAYER;
+
+ // Bad parameter.
+ if (NULL == stream)
+ return HWC2_ERROR_BAD_PARAMETER;
+
+ hwclayer->sideband_stream = stream;
+ return HWC2_ERROR_NONE;
+}
+
+/* setLayerSourceCrop(..., crop)
+ * Descriptor: HWC2_FUNCTION_SET_LAYER_SOURCE_CROP
+ * Must be provided by all HWC2 devices
+ *
+ * Sets the source crop (the portion of the source buffer which will fill the
+ * display frame) of the given layer. This crop rectangle will not exceed the
+ * dimensions of the latched buffer.
+ *
+ * If the device is not capable of supporting a true float source crop (i.e., it
+ * will truncate or round the floats to integers), it should set this layer to
+ * HWC2_COMPOSITION_CLIENT when crop is non-integral for the most accurate
+ * rendering.
+ *
+ * If the device cannot support float source crops, but still wants to handle
+ * the layer, it should use the following code (or similar) to convert to
+ * an integer crop:
+ * intCrop.left = (int) ceilf(crop.left);
+ * intCrop.top = (int) ceilf(crop.top);
+ * intCrop.right = (int) floorf(crop.right);
+ * intCrop.bottom = (int) floorf(crop.bottom);
+ *
+ * Parameters:
+ * crop - the new source crop
+ *
+ * Returns HWC2_ERROR_NONE or one of the following errors:
+ * HWC2_ERROR_BAD_LAYER - an invalid layer handle was passed in
+ */
+hwc2_error_t setLayerSourceCrop(
+ hwc2_device_t* device, hwc2_display_t display,
+ hwc2_layer_t layer, hwc_frect_t crop) {
+ hwc2_context_t *ctx = (hwc2_context_t*)device;
+ display_context_t *dctx = &(ctx->displays[display]);
+ isValidDisplay(dctx, display);
+
+ hwc_layer_t *hwclayer = dctx->hwc_layer[layer];
+
+ // Bad layer.
+ if (NULL == hwclayer)
+ return HWC2_ERROR_BAD_LAYER;
+
+ // TODO: still have some work to do.
+ hwclayer->source_crop = crop;
+ return HWC2_ERROR_NONE;
+}
+
+/* setLayerTransform(..., transform)
+ * Descriptor: HWC2_FUNCTION_SET_LAYER_TRANSFORM
+ * Must be provided by all HWC2 devices
+ *
+ * Sets the transform (rotation/flip) of the given layer.
+ *
+ * Parameters:
+ * transform - the new transform
+ *
+ * Returns HWC2_ERROR_NONE or one of the following errors:
+ * HWC2_ERROR_BAD_LAYER - an invalid layer handle was passed in
+ * HWC2_ERROR_BAD_PARAMETER - an invalid transform was passed in
+ */
+hwc2_error_t setLayerTransform(
+ hwc2_device_t* device, hwc2_display_t display,
+ hwc2_layer_t layer, hwc_transform_t transform) {
+ hwc2_context_t *ctx = (hwc2_context_t*)device;
+ display_context_t *dctx = &(ctx->displays[display]);
+ isValidDisplay(dctx, display);
+
+ hwc_layer_t *hwclayer = dctx->hwc_layer[layer];
+
+ // Bad layer.
+ if (NULL == hwclayer)
+ return HWC2_ERROR_BAD_LAYER;
+
+ // Bad parameter.
+ if (transform < 0 || transform > HWC_TRANSFORM_ROT_270) {
+ return HWC2_ERROR_BAD_PARAMETER;
+ }
+
+ hwclayer->transform = transform;
+ return HWC2_ERROR_NONE;
+
+}
+
+/* setLayerVisibleRegion(..., visible)
+ * Descriptor: HWC2_FUNCTION_SET_LAYER_VISIBLE_REGION
+ * Must be provided by all HWC2 devices
+ *
+ * Specifies the portion of the layer that is visible, including portions under
+ * translucent areas of other layers. The region is in screen space, and will
+ * not exceed the dimensions of the screen.
+ *
+ * Parameters:
+ * visible - the new visible region, in screen space
+ *
+ * Returns HWC2_ERROR_NONE or one of the following errors:
+ * HWC2_ERROR_BAD_LAYER - an invalid layer handle was passed in
+ */
+hwc2_error_t setLayerVisibleRegion(
+ hwc2_device_t* device, hwc2_display_t display,
+ hwc2_layer_t layer, hwc_region_t visible) {
+ hwc2_context_t *ctx = (hwc2_context_t*)device;
+ display_context_t *dctx = &(ctx->displays[display]);
+ isValidDisplay(dctx, display);
+
+ hwc_layer_t *hwclayer = dctx->hwc_layer[layer];
+
+ // Bad layer.
+ if (NULL == hwclayer)
+ return HWC2_ERROR_BAD_LAYER;
+
+ hwclayer->visible_region = visible;
+ return HWC2_ERROR_NONE;
+}
+
+/* setLayerZOrder(..., z)
+ * Descriptor: HWC2_FUNCTION_SET_LAYER_Z_ORDER
+ * Must be provided by all HWC2 devices
+ *
+ * Sets the desired Z order (height) of the given layer. A layer with a greater
+ * Z value occludes a layer with a lesser Z value.
+ *
+ * Parameters:
+ * z - the new Z order
+ *
+ * Returns HWC2_ERROR_NONE or one of the following errors:
+ * HWC2_ERROR_BAD_LAYER - an invalid layer handle was passed in
+ */
+hwc2_error_t setLayerZOrder(
+ hwc2_device_t* device, hwc2_display_t display,
+ hwc2_layer_t layer, uint32_t z) {
+ hwc2_context_t *ctx = (hwc2_context_t*)device;
+ display_context_t *dctx = &(ctx->displays[display]);
+ isValidDisplay(dctx, display);
+
+ hwc_layer_t *hwclayer = dctx->hwc_layer[layer];
+
+ // Bad layer.
+ if (NULL == hwclayer)
+ return HWC2_ERROR_BAD_LAYER;
+
+ hwclayer->zorder = z;
+ return HWC2_ERROR_NONE;
+}
+
+/* getCapabilities(..., outCount, outCapabilities)
+ *
+ * Provides a list of capabilities (described in the definition of
+ * hwc2_capability_t above) supported by this device. This list must
+ * not change after the device has been loaded.
+ *
+ * Parameters:
+ * outCount - if outCapabilities was NULL, the number of capabilities
+ * which would have been returned; if outCapabilities was not NULL,
+ * the number of capabilities returned, which must not exceed the
+ * value stored in outCount prior to the call
+ * outCapabilities - a list of capabilities supported by this device; may
+ * be NULL, in which case this function must write into outCount the
+ * number of capabilities which would have been written into
+ * outCapabilities
+ */
+void hwc2_getCapabilities(struct hwc2_device* device, uint32_t* outCount,
+ int32_t* /*hwc2_capability_t*/ outCapabilities) {
+ if (NULL == outCapabilities) {
+ *outCount = 1;
+ } else {
+ *outCount = 1;
+ outCapabilities[0] = HWC2_CAPABILITY_SIDEBAND_STREAM;
+ }
+}
+
+hwc2_function_pointer_t hwc2_getFunction(struct hwc2_device* device,
+ int32_t /*hwc2_function_descriptor_t*/ descriptor) {
+ switch (descriptor) {
+ // Device functions
+ case HWC2_FUNCTION_CREATE_VIRTUAL_DISPLAY:
+ return reinterpret_cast<hwc2_function_pointer_t>(createVirtualDisplay);
+ case HWC2_FUNCTION_DESTROY_VIRTUAL_DISPLAY:
+ return reinterpret_cast<hwc2_function_pointer_t>(destroyVirtualDisplay);
+ case HWC2_FUNCTION_DUMP:
+ return reinterpret_cast<hwc2_function_pointer_t>(dump);
+ case HWC2_FUNCTION_GET_MAX_VIRTUAL_DISPLAY_COUNT:
+ return reinterpret_cast<hwc2_function_pointer_t>(getMaxVirtualDisplayCount);
+ case HWC2_FUNCTION_REGISTER_CALLBACK:
+ return reinterpret_cast<hwc2_function_pointer_t>(registerCallback);
+
+ // Display functions
+ case HWC2_FUNCTION_ACCEPT_DISPLAY_CHANGES:
+ return reinterpret_cast<hwc2_function_pointer_t>(acceptDisplayChanges);
+ case HWC2_FUNCTION_CREATE_LAYER:
+ return reinterpret_cast<hwc2_function_pointer_t>(createLayer);
+ case HWC2_FUNCTION_DESTROY_LAYER:
+ return reinterpret_cast<hwc2_function_pointer_t>(destroyLayer);
+ case HWC2_FUNCTION_GET_ACTIVE_CONFIG:
+ return reinterpret_cast<hwc2_function_pointer_t>(getActiveConfig);
+ case HWC2_FUNCTION_GET_CHANGED_COMPOSITION_TYPES:
+ return reinterpret_cast<hwc2_function_pointer_t>(getChangedCompositionTypes);
+ case HWC2_FUNCTION_GET_COLOR_MODES:
+ return reinterpret_cast<hwc2_function_pointer_t>(getColorModes);
+ case HWC2_FUNCTION_GET_DISPLAY_ATTRIBUTE:
+ return reinterpret_cast<hwc2_function_pointer_t>(getDisplayAttribute);
+ case HWC2_FUNCTION_GET_DISPLAY_CONFIGS:
+ return reinterpret_cast<hwc2_function_pointer_t>(getDisplayConfigs);
+ case HWC2_FUNCTION_GET_DISPLAY_NAME:
+ return reinterpret_cast<hwc2_function_pointer_t>(getDisplayName);
+ case HWC2_FUNCTION_GET_DISPLAY_REQUESTS:
+ return reinterpret_cast<hwc2_function_pointer_t>(getDisplayRequests);
+ case HWC2_FUNCTION_GET_DISPLAY_TYPE:
+ return reinterpret_cast<hwc2_function_pointer_t>(getDisplayType);
+ case HWC2_FUNCTION_GET_DOZE_SUPPORT:
+ return reinterpret_cast<hwc2_function_pointer_t>(getDozeSupport);
+ case HWC2_FUNCTION_GET_HDR_CAPABILITIES:
+ return reinterpret_cast<hwc2_function_pointer_t>(getHdrCapabilities);
+ case HWC2_FUNCTION_GET_RELEASE_FENCES:
+ return reinterpret_cast<hwc2_function_pointer_t>(getReleaseFences);
+ case HWC2_FUNCTION_PRESENT_DISPLAY:
+ return reinterpret_cast<hwc2_function_pointer_t>(presentDisplay);
+ case HWC2_FUNCTION_SET_ACTIVE_CONFIG:
+ return reinterpret_cast<hwc2_function_pointer_t>(setActiveConfig);
+ case HWC2_FUNCTION_SET_CLIENT_TARGET:
+ return reinterpret_cast<hwc2_function_pointer_t>(setClientTarget);
+ case HWC2_FUNCTION_SET_COLOR_MODE:
+ return reinterpret_cast<hwc2_function_pointer_t>(setColorMode);
+ case HWC2_FUNCTION_SET_COLOR_TRANSFORM:
+ return reinterpret_cast<hwc2_function_pointer_t>(setColorTransform);
+ case HWC2_FUNCTION_SET_OUTPUT_BUFFER:
+ return reinterpret_cast<hwc2_function_pointer_t>(setOutputBuffer);
+ case HWC2_FUNCTION_SET_POWER_MODE:
+ return reinterpret_cast<hwc2_function_pointer_t>(setPowerMode);
+ case HWC2_FUNCTION_SET_VSYNC_ENABLED:
+ return reinterpret_cast<hwc2_function_pointer_t>(setVsyncEnabled);
+ case HWC2_FUNCTION_VALIDATE_DISPLAY:
+ return reinterpret_cast<hwc2_function_pointer_t>(validateDisplay);
+
+ // Layer functions
+ case HWC2_FUNCTION_SET_CURSOR_POSITION:
+ return reinterpret_cast<hwc2_function_pointer_t>(setCursorPosition);
+ case HWC2_FUNCTION_SET_LAYER_BUFFER:
+ return reinterpret_cast<hwc2_function_pointer_t>(setLayerBuffer);
+ case HWC2_FUNCTION_SET_LAYER_SURFACE_DAMAGE:
+ return reinterpret_cast<hwc2_function_pointer_t>(setLayerSurfaceDamage);
+
+ // Layer state functions
+ case HWC2_FUNCTION_SET_LAYER_BLEND_MODE:
+ return reinterpret_cast<hwc2_function_pointer_t>(setLayerBlendMode);
+ case HWC2_FUNCTION_SET_LAYER_COLOR:
+ return reinterpret_cast<hwc2_function_pointer_t>(setLayerColor);
+ case HWC2_FUNCTION_SET_LAYER_COMPOSITION_TYPE:
+ return reinterpret_cast<hwc2_function_pointer_t>(setLayerCompositionType);
+ case HWC2_FUNCTION_SET_LAYER_DATASPACE:
+ return reinterpret_cast<hwc2_function_pointer_t>(setLayerDataspace);
+ case HWC2_FUNCTION_SET_LAYER_DISPLAY_FRAME:
+ return reinterpret_cast<hwc2_function_pointer_t>(setLayerDisplayFrame);
+ case HWC2_FUNCTION_SET_LAYER_PLANE_ALPHA:
+ return reinterpret_cast<hwc2_function_pointer_t>(setLayerPlaneAlpha);
+ case HWC2_FUNCTION_SET_LAYER_SIDEBAND_STREAM:
+ return reinterpret_cast<hwc2_function_pointer_t>(setLayerSidebandStream);
+ case HWC2_FUNCTION_SET_LAYER_SOURCE_CROP:
+ return reinterpret_cast<hwc2_function_pointer_t>(setLayerSourceCrop);
+ case HWC2_FUNCTION_SET_LAYER_TRANSFORM:
+ return reinterpret_cast<hwc2_function_pointer_t>(setLayerTransform);
+ case HWC2_FUNCTION_SET_LAYER_VISIBLE_REGION:
+ return reinterpret_cast<hwc2_function_pointer_t>(setLayerVisibleRegion);
+ case HWC2_FUNCTION_SET_LAYER_Z_ORDER:
+ return reinterpret_cast<hwc2_function_pointer_t>(setLayerZOrder);
+ default:
+ ALOGE("getFunction: Unknown function descriptor: %d", descriptor);
+ return NULL;
+ }
+}
+
+static int32_t hwc2_device_open(const struct hw_module_t* module, const char* name,
+ struct hw_device_t** device) {
+ int32_t ret;
+
+ if (strcmp(name, HWC_HARDWARE_COMPOSER)) return -EINVAL;
+
+ hwc2_context_t *dev;
+ dev = (hwc2_context_t *)malloc(sizeof(*dev));
+ memset(dev, 0, sizeof(*dev));
+
+ if (hw_get_module(GRALLOC_HARDWARE_MODULE_ID,
+ (const struct hw_module_t **)&dev->gralloc_module)) {
+ HWC_LOGEA("failed to get gralloc hw module");
+ ret = -EINVAL;
+ goto err_get_module;
+ }
+
+ //init primiary display
+ //default is alwasy false,will check it in hot plug.
+ init_display(dev, HWC_DISPLAY_PRIMARY);
+
+ // willchanged to use hw vsync.
+ dev->displays[HWC_DISPLAY_PRIMARY].vsync_period = chk_output_mode(dev->mode);
+
+ dev->base.common.tag = HARDWARE_DEVICE_TAG;
+ dev->base.common.version = HWC_DEVICE_API_VERSION_2_0;
+ dev->base.common.module = const_cast<hw_module_t *>(module);
+ dev->base.common.close = hwc2_close;
+
+ dev->base.getFunction = hwc2_getFunction;
+ dev->base.getCapabilities = hwc2_getCapabilities;
+
+ dev->displays[HWC_DISPLAY_PRIMARY].vsync_enable = false;
+ dev->displays[HWC_DISPLAY_EXTERNAL].vsync_enable = false;
+ dev->blank_status = false;
+ *device = &dev->base.common;
+
+ ret = pthread_create(&dev->primary_vsync_thread, NULL, hwc2_primary_vsync_thread, dev);
+ if (ret) {
+ HWC_LOGEB("failed to start primary vsync thread: %s", strerror(ret));
+ ret = -ret;
+ goto err_vsync;
+ }
+
+ ret = pthread_create(&dev->external_vsync_thread, NULL, hwc2_external_vsync_thread, dev);
+ if (ret) {
+ HWC_LOGEB("failed to start external vsync thread: %s", strerror(ret));
+ ret = -ret;
+ goto err_vsync;
+ }
+
+ //temp solution, will change to use uevnet from kernel
+ ret = pthread_create(&dev->hotplug_thread, NULL, hwc2_hotplug_thread, dev);
+ if (ret) {
+ HWC_LOGEB("failed to start hotplug thread: %s", strerror(ret));
+ ret = -ret;
+ goto err_vsync;
+ }
+ return 0;
+
+err_vsync:
+ uninit_display(dev,HWC_DISPLAY_PRIMARY);
+err_get_module:
+ if (dev) free(dev);
+ return ret;
+}
+
+static struct hw_module_methods_t hwc2_module_methods = {
+ .open = hwc2_device_open
+};
+
+hwc2_module_t HAL_MODULE_INFO_SYM = {
+ .common = {
+ .tag = HARDWARE_MODULE_TAG,
+ .version_major = 2,
+ .version_minor = 0,
+ .id = HWC_HARDWARE_MODULE_ID,
+ .name = "hwcomposer2 module",
+ .author = "Amlogic",
+ .methods = &hwc2_module_methods,
+ .dso = NULL,
+ .reserved = {0},
+ }
+ };
+
diff --git a/tvp/Android.mk b/hwc2_old/tvp/Android.mk
index 068106e..068106e 100755..100644
--- a/tvp/Android.mk
+++ b/hwc2_old/tvp/Android.mk
diff --git a/tvp/OmxUtil.cpp b/hwc2_old/tvp/OmxUtil.cpp
index 2bd0901..844e125 100644
--- a/tvp/OmxUtil.cpp
+++ b/hwc2_old/tvp/OmxUtil.cpp
@@ -47,13 +47,13 @@ int setomxpts(int time_video) {
}
void set_omx_pts(char* data, int* handle) {
- if (strncmp(data, TVP_SECRET, strlen(TVP_SECRET))==0) {
+ if (strncmp(data, TVP_SECRET, strlen(TVP_SECRET)) == 0) {
if (*handle == 0 || amvideo_handle == 0) {
*handle = openamvideo();
if (*handle == 0)
ALOGW("can not open amvideo");
}
- if (strncmp(data+sizeof(TVP_SECRET)+sizeof(signed long long), TVP_SECRET_RENDER, strlen(TVP_SECRET_RENDER))!=0) {
+ if (strncmp(data+sizeof(TVP_SECRET)+sizeof(signed long long), TVP_SECRET_RENDER, strlen(TVP_SECRET_RENDER)) != 0) {
signed long long time;
memcpy(&time, (char*)data+sizeof(TVP_SECRET), sizeof(signed long long));
int time_video = time * 9 / 100 + 1;
@@ -63,7 +63,7 @@ void set_omx_pts(char* data, int* handle) {
ALOGW("setomxpts error, ret =%d",ret);
}
}
- memcpy((char*)data+sizeof(TVP_SECRET)+sizeof(signed long long), TVP_SECRET_RENDER, sizeof(TVP_SECRET_RENDER));
+ memcpy((char*)data + sizeof(TVP_SECRET) + sizeof(signed long long), TVP_SECRET_RENDER, sizeof(TVP_SECRET_RENDER));
}
}
diff --git a/tvp/OmxUtil.h b/hwc2_old/tvp/OmxUtil.h
index 846c9aa..846c9aa 100755..100644
--- a/tvp/OmxUtil.h
+++ b/hwc2_old/tvp/OmxUtil.h
diff --git a/hwcomposer.cpp b/hwcomposer.cpp
deleted file mode 100755
index bd1c846..0000000
--- a/hwcomposer.cpp
+++ b/dev/null
@@ -1,1190 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-//#define LOG_NDEBUG 0
-#define LOG_TAG "HWComposer"
-#include <hardware/hardware.h>
-
-#include <fcntl.h>
-#include <math.h>
-#include <poll.h>
-#include <pthread.h>
-#include <stdio.h>
-#include <stdlib.h>
-
-#include <sys/ioctl.h>
-#include <sys/mman.h>
-#include <sys/time.h>
-#include <sys/types.h>
-#include <errno.h>
-#include <sys/resource.h>
-
-#include <EGL/egl.h>
-
-#define HWC_REMOVE_DEPRECATED_VERSIONS 1
-
-#include <cutils/compiler.h>
-#include <cutils/log.h>
-#include <cutils/atomic.h>
-#include <cutils/properties.h>
-
-#include <utils/String8.h>
-#include <hardware/gralloc.h>
-#include <hardware/hwcomposer.h>
-#include <hardware_legacy/uevent.h>
-#include <utils/String8.h>
-
-#include <EGL/egl.h>
-#include <utils/Vector.h>
-#include <utils/Timers.h>
-#include <system/graphics.h>
-#include <sync/sync.h>
-// for private_handle_t
-#include <gralloc_priv.h>
-#include <gralloc_helper.h>
-
-#if WITH_LIBPLAYER_MODULE
-#include <Amavutils.h>
-#endif
-#include "tvp/OmxUtil.h"
-
-#ifndef LOGD
-#define LOGD ALOGD
-#endif
-
-///Defines for debug statements - Macro LOG_TAG needs to be defined in the respective files
-#define HWC_LOGVA(str) ALOGV_IF(chk_int_prop("sys.hwc.debuglevel") >=6,"%5d %s - " str, __LINE__,__FUNCTION__);
-#define HWC_LOGVB(str,...) ALOGV_IF(chk_int_prop("sys.hwc.debuglevel") >=6,"%5d %s - " str, __LINE__, __FUNCTION__, __VA_ARGS__);
-#define HWC_LOGDA(str) ALOGD_IF(chk_int_prop("sys.hwc.debuglevel") >=5,"%5d %s - " str, __LINE__,__FUNCTION__);
-#define HWC_LOGDB(str, ...) ALOGD_IF(chk_int_prop("sys.hwc.debuglevel") >=5,"%5d %s - " str, __LINE__, __FUNCTION__, __VA_ARGS__);
-#define HWC_LOGIA(str) ALOGI_IF(chk_int_prop("sys.hwc.debuglevel") >=4,"%5d %s - " str, __LINE__, __FUNCTION__);
-#define HWC_LOGIB(str, ...) ALOGI_IF(chk_int_prop("sys.hwc.debuglevel") >=4,"%5d %s - " str, __LINE__,__FUNCTION__, __VA_ARGS__);
-#define HWC_LOGWA(str) ALOGW_IF(chk_int_prop("sys.hwc.debuglevel") >=3,"%5d %s - " str, __LINE__, __FUNCTION__);
-#define HWC_LOGWB(str, ...) ALOGW_IF(chk_int_prop("sys.hwc.debuglevel") >=3,"%5d %s - " str, __LINE__,__FUNCTION__, __VA_ARGS__);
-#define HWC_LOGEA(str) ALOGE_IF(chk_int_prop("sys.hwc.debuglevel") >=2,"%5d %s - " str, __LINE__, __FUNCTION__);
-#define HWC_LOGEB(str, ...) ALOGE_IF(chk_int_prop("sys.hwc.debuglevel") >=2,"%5d %s - " str, __LINE__,__FUNCTION__, __VA_ARGS__);
-
-#define LOG_FUNCTION_NAME HWC_LOGVA("ENTER");
-#define LOG_FUNCTION_NAME_EXIT HWC_LOGVA("EXIT");
-#define DBG_LOGA(str) ALOGI_IF(chk_int_prop("sys.hwc.debuglevel") >=4,"%10s-%5d %s - " str, HWC_BUILD_NAME, __LINE__,__FUNCTION__)
-#define DBG_LOGB(str, ...) ALOGI_IF(chk_int_prop("sys.hwc.debuglevel") >=4,"%10s-%5d %s - " str, HWC_BUILD_NAME, __LINE__,__FUNCTION__, __VA_ARGS__);
-
-#define SYSFS_AMVIDEO_CURIDX "/sys/module/amvideo/parameters/cur_dev_idx"
-#define SYSFS_DISPLAY_MODE "/sys/class/display/mode"
-#define SYSFS_FB0_FREE_SCALE "/sys/class/graphics/fb0/free_scale"
-#define SYSFS_FB1_FREE_SCALE "/sys/class/graphics/fb0/free_scale"
-#define SYSFS_VIDEO_AXIS "/sys/class/video/axis"
-#define SYSFS_VIDEOBUFUSED "/sys/class/amstream/videobufused"
-#define SYSFS_WINDOW_AXIS "/sys/class/graphics/fb0/window_axis"
-
-#define MAX_SUPPORT_DISPLAYS HWC_NUM_PHYSICAL_DISPLAY_TYPES
-
-#ifdef SINGLE_EXTERNAL_DISPLAY_USE_FB1
-#undef ENABLE_CURSOR_LAYER
-#define CHK_SKIP_DISPLAY_FB0(dispIdx) \
- if (pdev->display_ctxs[HWC_DISPLAY_EXTERNAL].connected\
- && dispIdx == HWC_DISPLAY_PRIMARY) {\
- continue;\
- }
-#else
-#define ENABLE_CURSOR_LAYER 1//cursor layer supported in hwc 1.4
-#define CHK_SKIP_DISPLAY_FB0(dispIdx) //nothing to do
-#endif
-
-#define get_display_info(ctx,disp) \
- display_context_t * display_ctx = &(ctx->display_ctxs[disp]);\
- framebuffer_info_t* fbinfo = &(display_ctx->fb_info);
-
-typedef struct cursor_context_t{
- bool blank;
- struct framebuffer_info_t cb_info;
- void *cbuffer;
- bool show;
-}cursor_context_t;
-
-typedef struct display_context_t{
- bool connected;
- struct framebuffer_info_t fb_info;
- struct private_handle_t* fb_hnd;
-#ifdef ENABLE_CURSOR_LAYER
- struct cursor_context_t cursor_ctx;
-#endif
-}display_context_t;
-
-struct hwc_context_1_t {
- hwc_composer_device_1_t base;
-
- /* our private state goes below here */
- hwc_layer_1_t const* saved_layer;
- unsigned saved_transform;
- int saved_left;
- int saved_top;
- int saved_right;
- int saved_bottom;
-
- //vsync.
- int32_t vsync_period;
- int vsync_enable;
- pthread_t vsync_thread;
-
- bool blank_status;
-
- //video buf is used flag
- char video_buf_used[32];
- //hdmi output mode
- char mode[32];
-
- const hwc_procs_t *procs;
- pthread_t hotplug_thread;
-
- private_module_t *gralloc_module;
- display_context_t display_ctxs[MAX_SUPPORT_DISPLAYS];
-};
-
-typedef struct hwc_uevent_data {
- int len;
- char buf[1024];
- char name[128];
- char state[128];
-} hwc_uevent_data_t;
-
-static pthread_cond_t hwc_cond = PTHREAD_COND_INITIALIZER;
-static pthread_mutex_t hwc_mutex = PTHREAD_MUTEX_INITIALIZER;
-
-extern "C" int clock_nanosleep(clockid_t clock_id, int flags,
- const struct timespec *request, struct timespec *remain);
-int init_display(hwc_context_1_t* context,int displayType);
-int uninit_display(hwc_context_1_t* context,int displayType);
-
-static bool chk_bool_prop(const char* prop) {
- char val[PROPERTY_VALUE_MAX];
-
- memset(val, 0, sizeof(val));
- if (property_get(prop, val, "false") && strcmp(val, "true") == 0) {
- ALOGD("prop: %s is %s",prop, val);
- return true;
- }
-
- return false;
-}
-
-static int chk_int_prop(const char* prop) {
- char val[PROPERTY_VALUE_MAX];
-
- memset(val, 0, sizeof(val));
- if (property_get(prop, val, "2")) {
- //ALOGV("prop: %s is %s",prop, val);
- return atoi(val);
- }
- return 0;
-}
-
-static int chk_and_dup(int fence) {
- if (fence < 0) {
- HWC_LOGWB("not a vliad fence %d",fence);
- return -1;
- }
-
- int dup_fence = dup(fence);
- if (dup_fence < 0) {
- HWC_LOGWB("fence dup failed: %s", strerror(errno));
- }
-
- return dup_fence;
-}
-
-#if WITH_LIBPLAYER_MODULE
-static bool chk_sysfs_status(const char* sysfstr, char* lastr, int size) {
- char val[32];
- char *p = lastr;
-
- memset(val, 0, sizeof(val));
- if (amsysfs_get_sysfs_str(sysfstr, val, sizeof(val)) == 0) {
- HWC_LOGVB("val: %s, lastr: %s",val, p);
- if ((strcmp(val, p) != 0)) {
- memset(p, 0, size);
- strcpy(p, val);
- return true;
- }
- }
-
- return false;
-}
-#endif
-
-static int32_t chk_output_mode(char* curmode) {
- int modefd = open(SYSFS_DISPLAY_MODE, O_RDONLY);
- if (modefd < 0) {
- HWC_LOGEB("open (%s) fail", SYSFS_DISPLAY_MODE);
- return -1;
- }
-
- char outputmode[32] = {0};
- read(modefd, outputmode, 31);
- close(modefd);
- modefd = -1;
-
- //check if need update vsync.
- if (strcmp(outputmode, curmode) == 0) {
- HWC_LOGVB("outputmode didn't change %s", curmode);
- return 0;
- }
-
- strcpy(curmode, outputmode);
-
- int32_t period = 16666666;
- if (strstr(outputmode, "50hz") != NULL) {
- period = (int32_t)(1e9 / 50);
- } else if (strstr(outputmode, "30hz") != NULL) {
- period = (int32_t)(1e9 / 30);
- } else if (strstr(outputmode, "25hz") != NULL) {
- period = (int32_t)(1e9 / 25);
- } else if ((strstr(outputmode, "24hz") != NULL) || (strstr(outputmode, "smpte") != NULL)) {
- period = (int32_t)(1e9 / 24);
- } else
- HWC_LOGDB("displaymode (%s) doesn't specify HZ", curmode);
-
- HWC_LOGVB("get new outputmode (%s) new period (%ld)", curmode, period);
- return period;
-}
-
-static bool chk_vinfo(hwc_context_1_t* ctx, int disp) {
- get_display_info(ctx, disp);
- if (fbinfo != NULL && fbinfo->fd >= 0) {
- struct fb_var_screeninfo vinfo;
- if (ioctl(fbinfo->fd, FBIOGET_VSCREENINFO, &vinfo) == -1)
- {
- ALOGE("FBIOGET_VSCREENINFO error!!!");
- return -errno;
- }
-
- if (vinfo.xres != fbinfo->info.xres
- || vinfo.yres != fbinfo->info.yres
- || vinfo.width != fbinfo->info.width
- || vinfo.height != fbinfo->info.height) {
- if (int(vinfo.width) <= 16 || int(vinfo.height) <= 9) {
- // the driver doesn't return that information
- // default to 160 dpi
- vinfo.width = ((vinfo.xres * 25.4f)/160.0f + 0.5f);
- vinfo.height = ((vinfo.yres * 25.4f)/160.0f + 0.5f);
- }
- fbinfo->xdpi = (vinfo.xres * 25.4f) / vinfo.width;
- fbinfo->ydpi = (vinfo.yres * 25.4f) / vinfo.height;
-
- fbinfo->info.xres = vinfo.xres;
- fbinfo->info.yres = vinfo.yres;
- fbinfo->info.width = vinfo.width;
- fbinfo->info.height = vinfo.height;
-
- return true;
- }
- }
- return false;
-}
-
-static int hwc_device_open(const struct hw_module_t* module, const char* name,
- struct hw_device_t** device);
-
-static struct hw_module_methods_t hwc_module_methods = {
- open: hwc_device_open
-};
-
-hwc_module_t HAL_MODULE_INFO_SYM = {
- common: {
- tag: HARDWARE_MODULE_TAG,
- version_major: 1,
- version_minor: 0,
- id: HWC_HARDWARE_MODULE_ID,
- name: "hwcomposer module",
- author: "Amlogic",
- methods: &hwc_module_methods,
- dso : NULL,
- reserved : {0},
- }
- };
-
-#if 0
-static void dump_handle(private_handle_t *h) {
- //ALOGV("\t\tformat = %d, width = %u, height = %u, stride = %u, vstride = %u",
- // h->format, h->width, h->height, h->stride, h->vstride);
-}
-
-static void dump_layer(hwc_layer_1_t const *l) {
- HWC_LOGVB("\ttype=%d, flags=%08x, handle=%p, tr=%02x, blend=%04x, "
- "{%d,%d,%d,%d}, {%d,%d,%d,%d}",
- l->compositionType, l->flags, l->handle, l->transform,
- l->blending,
- l->sourceCrop.left,
- l->sourceCrop.top,
- l->sourceCrop.right,
- l->sourceCrop.bottom,
- l->displayFrame.left,
- l->displayFrame.top,
- l->displayFrame.right,
- l->displayFrame.bottom);
-
- if (l->handle && !(l->flags & HWC_SKIP_LAYER)) dump_handle(private_handle_t::dynamicCast(l->handle));
-}
-#endif
-
-static void hwc_overlay_compose(hwc_context_1_t *dev, hwc_layer_1_t const* l) {
- int angle;
- struct hwc_context_1_t* ctx = (struct hwc_context_1_t*)dev;
-
-#if WITH_LIBPLAYER_MODULE
- static char last_val[32] = "0";
- static char last_axis[32] = "0";
- static char last_mode[32] = {0};
- static char last_free_scale[32] = {0};
- static char last_window_axis[50] = {0};
- bool vpp_changed = false;
- bool axis_changed = false;
- bool mode_changed = false;
- bool free_scale_changed = false;
- bool window_axis_changed =false;
-
- if (chk_bool_prop("ro.vout.dualdisplay4")) {
- vpp_changed = chk_sysfs_status(SYSFS_AMVIDEO_CURIDX, last_val, 32);
- }
-
- mode_changed = chk_sysfs_status(SYSFS_DISPLAY_MODE, last_mode, 32);
-
- free_scale_changed = chk_sysfs_status(SYSFS_FB0_FREE_SCALE, last_free_scale, 32);
-#ifdef SINGLE_EXTERNAL_DISPLAY_USE_FB1
- if (ctx->display_ctxs[HWC_DISPLAY_EXTERNAL].connected)
- free_scale_changed = chk_sysfs_status(SYSFS_FB1_FREE_SCALE, last_free_scale, 32);
-#endif
-
- axis_changed = chk_sysfs_status(SYSFS_VIDEO_AXIS, last_axis, 32);
- window_axis_changed = chk_sysfs_status(SYSFS_WINDOW_AXIS, last_window_axis, 50);
-
- if ((ctx->saved_layer == l) &&
- (ctx->saved_transform == l->transform) &&
- (ctx->saved_left == l->displayFrame.left) &&
- (ctx->saved_top == l->displayFrame.top) &&
- (ctx->saved_right == l->displayFrame.right) &&
- (ctx->saved_bottom == l->displayFrame.bottom) &&
- !vpp_changed && !mode_changed && !axis_changed && !free_scale_changed && !window_axis_changed) {
- return;
- }
-
- switch (l->transform) {
- case 0:
- angle = 0;
- break;
- case HAL_TRANSFORM_ROT_90:
- angle = 90;
- break;
- case HAL_TRANSFORM_ROT_180:
- angle = 180;
- break;
- case HAL_TRANSFORM_ROT_270:
- angle = 270;
- break;
- default:
- return;
- }
-
- amvideo_utils_set_virtual_position(l->displayFrame.left,
- l->displayFrame.top,
- l->displayFrame.right - l->displayFrame.left,
- l->displayFrame.bottom - l->displayFrame.top,
- angle);
-
- /* the screen mode from Android framework should always be set to normal mode
- * to match the relationship between the UI and video overlay window position.
- */
- /*set screen_mode in amvideo_utils_set_virtual_position(),pls check in libplayer*/
- //amvideo_utils_set_screen_mode(0);
-#endif
-
- ctx->saved_layer = l;
- ctx->saved_transform = l->transform;
- ctx->saved_left = l->displayFrame.left;
- ctx->saved_top = l->displayFrame.top;
- ctx->saved_right = l->displayFrame.right;
- ctx->saved_bottom = l->displayFrame.bottom;
-
-#if WITH_LIBPLAYER_MODULE
- memset(last_axis, 0, sizeof(last_axis));
-
- if (amsysfs_get_sysfs_str(SYSFS_VIDEO_AXIS, last_axis, sizeof(last_axis)) == 0) {
- HWC_LOGDB("****last video axis is: %s",last_axis);
- }
-#endif
-}
-
-static void hwc_dump(hwc_composer_device_1* dev, char *buff, int buff_len) {
- if (buff_len <= 0) return;
-
- struct hwc_context_1_t *pdev = (struct hwc_context_1_t *)dev;
-
- android::String8 result;
-
- for (int i = 0; i < MAX_SUPPORT_DISPLAYS; i++) {
- get_display_info(pdev,i);
-
- if (display_ctx->connected) {
- result.appendFormat(" %8s Display connected: %3s\n",
- HWC_DISPLAY_EXTERNAL == i ? "External":"Primiary", display_ctx->connected ? "Yes" : "No");
- result.appendFormat(" w=%u, h=%u, xdpi=%f, ydpi=%f, osdIdx=%d, vsync_period=%d, video_buf_used: %s\n",
- fbinfo->info.xres,
- fbinfo->info.yres,
- fbinfo->xdpi,
- fbinfo->ydpi,
- fbinfo->fbIdx,
- pdev->vsync_period,
- pdev->video_buf_used);
- }
- }
-
- //result.append(
- // " type | handle | color | blend | format | position | size | gsc \n"
- // "----------+----------|----------+-------+--------+---------------+---------------------\n");
- // 8_______ | 8_______ | 8_______ | 5____ | 6_____ | [5____,5____] | [5____,5____] | 3__ \n"
-
- result.append("\n");
-
- strlcpy(buff, result.string(), buff_len);
-}
-
-static int hwc_blank(struct hwc_composer_device_1 *dev, int disp, int blank) {
- struct hwc_context_1_t *pdev = (struct hwc_context_1_t *)dev;
-
- //TODO: need impl
- if (disp == HWC_DISPLAY_PRIMARY) pdev->blank_status = ( blank ? true : false);
-
- return 0;
-}
-
-static int hwc_setPowerMode(struct hwc_composer_device_1*, int, int) {
- LOG_FUNCTION_NAME
- //TODO:
- LOG_FUNCTION_NAME_EXIT
- return 0;
-}
-
-static int hwc_query(struct hwc_composer_device_1* dev, int what, int *value) {
- LOG_FUNCTION_NAME
-
- struct hwc_context_1_t *pdev = (struct hwc_context_1_t *)dev;
-
- switch (what) {
- case HWC_BACKGROUND_LAYER_SUPPORTED:
- // we support the background layer
- value[0] = 1;
- break;
- case HWC_VSYNC_PERIOD:
- // vsync period in nanosecond
- value[0] = pdev->vsync_period;
- break;
- default:
- // unsupported query
- return -EINVAL;
- }
-
- LOG_FUNCTION_NAME_EXIT
- return 0;
-}
-
-static int hwc_eventControl(struct hwc_composer_device_1* dev,
- int,
- int event,
- int enabled) {
- struct hwc_context_1_t* ctx = (struct hwc_context_1_t *)dev;
-
- switch (event)
- {
- case HWC_EVENT_VSYNC:
- ctx->vsync_enable = enabled;
- pthread_mutex_lock(&hwc_mutex);
- pthread_cond_signal(&hwc_cond);
- pthread_mutex_unlock(&hwc_mutex);
- return 0;
- }
- return -EINVAL;
-}
-
-static int hwc_prepare(struct hwc_composer_device_1 *dev,
- size_t numDisplays,
- hwc_display_contents_1_t** displays) {
- int err = 0;
- size_t i = 0;
- hwc_context_1_t *pdev = (hwc_context_1_t *)dev;
- hwc_display_contents_1_t *display_content = NULL;
-
- if (!numDisplays || !displays) return 0;
-
- LOG_FUNCTION_NAME
- //retireFenceFd will close in surfaceflinger, just reset it.
- for (i = 0; i < numDisplays; i++) {
- CHK_SKIP_DISPLAY_FB0();
-
- display_content = displays[i];
- if ( display_content ) {
- display_content->retireFenceFd = -1;
- for (size_t j=0 ; j< display_content->numHwLayers ; j++) {
- hwc_layer_1_t* l = &display_content->hwLayers[j];
-
-#ifdef ENABLE_CURSOR_LAYER
- if (l->flags & HWC_IS_CURSOR_LAYER) {
- l->hints = HWC_HINT_CLEAR_FB;
- HWC_LOGDA("This is a Cursor layer");
- l->compositionType = HWC_CURSOR_OVERLAY;
- continue;
- }
-#endif
-
- if (l->compositionType == HWC_SIDEBAND && l->sidebandStream) {
- //TODO: we just transact SIDEBAND to OVERLAY now;
- HWC_LOGVA("get HWC_SIDEBAND layer, just change to overlay");
- l->hints = HWC_HINT_CLEAR_FB;
- l->compositionType = HWC_OVERLAY;
- continue;
- }
-
- if (l->handle) {
- private_handle_t const* hnd = reinterpret_cast<private_handle_t const*>(l->handle);
- if (hnd->flags & private_handle_t::PRIV_FLAGS_OSD_VIDEO_OMX) {
- l->hints = HWC_HINT_OSD_VIDEO_OMX;
- }
- if (hnd->flags & private_handle_t::PRIV_FLAGS_VIDEO_OVERLAY) {
- l->hints = HWC_HINT_CLEAR_FB;
- l->compositionType = HWC_OVERLAY;
- continue;
- }
- }
- }
- }
- }
-
- LOG_FUNCTION_NAME_EXIT
- return 0;
-}
-
-static int fb_post(hwc_context_1_t *pdev,
- hwc_display_contents_1_t* contents, int display_type) {
- int err = 0;
- size_t i = 0;
-
-#ifdef ENABLE_CURSOR_LAYER
- cursor_context_t * cursor_ctx = &(pdev->display_ctxs[display_type].cursor_ctx);
- framebuffer_info_t* cbinfo = &(cursor_ctx->cb_info);
- bool cursor_show = false;
-#endif
-
- for (i = 0; i < contents->numHwLayers; i++) {
-#ifdef ENABLE_CURSOR_LAYER
- //deal cursor layer
- if (contents->hwLayers[i].flags & HWC_IS_CURSOR_LAYER) {
- hwc_layer_1_t *layer = &(contents->hwLayers[i]);
- if (private_handle_t::validate(layer->handle) < 0) break;
- private_handle_t *hnd = (private_handle_t *)layer->handle;
-
- HWC_LOGDB("This is a Sprite, hnd->stride is %d, hnd->height is %d", hnd->stride, hnd->height);
- if (cbinfo->info.xres != (unsigned int)hnd->stride || cbinfo->info.yres != (unsigned int)hnd->height) {
- HWC_LOGDB("disp: %d cursor need to redrew", display_type);
- update_cursor_buffer_locked(cbinfo, hnd->stride, hnd->height);
- cursor_ctx->cbuffer = mmap(NULL, hnd->size, PROT_READ|PROT_WRITE, MAP_SHARED, cbinfo->fd, 0);
- if (cursor_ctx->cbuffer != MAP_FAILED) {
- memcpy(cursor_ctx->cbuffer, hnd->base, hnd->size);
- munmap(cursor_ctx->cbuffer, hnd->size);
- HWC_LOGDA("setCursor ok");
- } else {
- HWC_LOGEA("buffer mmap fail");
- }
- }
- cursor_show = true;
- }
-#endif
-
- //deal framebuffer target layer
- if (contents->hwLayers[i].compositionType == HWC_FRAMEBUFFER_TARGET) {
- hwc_layer_1_t *layer = &(contents->hwLayers[i]);
- if (private_handle_t::validate(layer->handle) < 0) break;
-
- //deal with virtural display fence
- if (display_type == HWC_DISPLAY_VIRTUAL) {
- layer->releaseFenceFd = layer->acquireFenceFd;
- contents->retireFenceFd = contents->outbufAcquireFenceFd;
-
- HWC_LOGVB("HWC_DISPLAY_VIRTUAL Get release fence %d, retire fence %d, outbufAcquireFenceFd %d",
- layer->releaseFenceFd,
- contents->retireFenceFd, contents->outbufAcquireFenceFd);
- continue;
- }
-
- get_display_info(pdev, display_type);
- layer->releaseFenceFd = fb_post_with_fence_locked(fbinfo,layer->handle,layer->acquireFenceFd);
-
- if (layer->releaseFenceFd >= 0) {
- //layer->releaseFenceFd = releaseFence;
- contents->retireFenceFd = chk_and_dup(layer->releaseFenceFd);
-
- HWC_LOGVB("Get release fence %d, retire fence %d",
- layer->releaseFenceFd,
- contents->retireFenceFd);
- } else {
- HWC_LOGEB("No valid release_fence returned. %d ",layer->releaseFenceFd);
- //-1 means no fence, less than -1 is some error
- if (layer->releaseFenceFd < -1) err = layer->releaseFenceFd;
- contents->retireFenceFd = layer->releaseFenceFd = -1;
- }
- }
- }
-
-#ifdef ENABLE_CURSOR_LAYER
- //finally we need to update cursor's blank status
- if (cbinfo->fd > 0 && (cursor_show != cursor_ctx->show) ) {
- cursor_ctx->show = cursor_show;
- HWC_LOGVB("UPDATE FB1 status to %d ",cursor_show);
- ioctl(cbinfo->fd, FBIOBLANK, !cursor_ctx->show);
- }
-#endif
-
- return err;
-}
-
-
-static int hwc_set(struct hwc_composer_device_1 *dev,
- size_t numDisplays, hwc_display_contents_1_t** displays) {
- int err = 0;
- size_t i = 0, j = 0;
- hwc_context_1_t *pdev = (hwc_context_1_t *)dev;
- hwc_display_contents_1_t *display_content = NULL;
-
- if (!numDisplays || !displays) return 0;
-
- LOG_FUNCTION_NAME
- //TODO: need improve the way to set video axis.
-#if WITH_LIBPLAYER_MODULE
- for (i = 0; i < numDisplays; i++) {
- CHK_SKIP_DISPLAY_FB0();
- display_content = displays[i];
- if (display_content) {
- for (j = 0; j < display_content->numHwLayers; j++) {
- hwc_layer_1_t* l = &display_content->hwLayers[j];
- if (l->compositionType == HWC_OVERLAY) {
- hwc_overlay_compose(pdev, l);
- }
- }
- }
- }
-
-#endif
-
- for (i=0;i<numDisplays;i++) {
- CHK_SKIP_DISPLAY_FB0();
- display_content = displays[i];
- if (display_content) {
- if (i <= HWC_DISPLAY_VIRTUAL) {
- //physic display
- err = fb_post(pdev,display_content,i);
- } else {
- HWC_LOGEB("display %d is not supported",i);
- }
- }
- }
-
- LOG_FUNCTION_NAME_EXIT
- return err;
-}
-
-static int hwc_close(hw_device_t *device) {
- struct hwc_context_1_t *dev = (struct hwc_context_1_t *)device;
-
- LOG_FUNCTION_NAME
-
- pthread_kill(dev->vsync_thread, SIGTERM);
- pthread_join(dev->vsync_thread, NULL);
-
- uninit_display(dev,HWC_DISPLAY_PRIMARY);
- uninit_display(dev,HWC_DISPLAY_EXTERNAL);
-
- if (dev) free(dev);
-
- LOG_FUNCTION_NAME_EXIT
- return 0;
-}
-
-//#define USE_HW_VSYNC
-#ifdef USE_HW_VSYNC
-/*
-Still have bugs, don't use it.
-*/
-int wait_next_vsync(struct hwc_context_1_t* ctx, nsecs_t* vsync_timestamp) {
- static nsecs_t previewTime = 0;
- nsecs_t vsyncDiff=0;
- const nsecs_t period = ctx->vsync_period;
- //we will delay hw vsync if missing one vsync interrupt isr.
- int ret = 0;
-
- if (ioctl(ctx->display_ctxs[0].fb_info.fd, FBIO_WAITFORVSYNC, &ret) == -1) {
- HWC_LOGEB("ioctrl error %d",ctx->display_ctxs[0].fb_info.fd);
- ret=-1;
- } else {
- if (ret == 1) {
- *vsync_timestamp = systemTime(CLOCK_MONOTONIC);
- vsyncDiff=*vsync_timestamp - previewTime;
- if (previewTime != 0) HWC_LOGEB("wait for vsync success %lld",vsyncDiff);
- vsyncDiff%=period;
- if (vsyncDiff > 500000) {
- nsecs_t sleep ;
- sleep = (period - vsyncDiff);
- *vsync_timestamp+=sleep;
- struct timespec spec;
- spec.tv_sec = *vsync_timestamp / 1000000000;
- spec.tv_nsec = *vsync_timestamp % 1000000000;
- clock_nanosleep(CLOCK_MONOTONIC, TIMER_ABSTIME, &spec, NULL);
- }
- previewTime = *vsync_timestamp;
- ret=0;
- } else {
- HWC_LOGEA("wait for vsync fail");
- ret=-1;
- }
- }
- return ret;
-}
-
-#else
-
-//software
-int wait_next_vsync(struct hwc_context_1_t* ctx, nsecs_t* vsync_timestamp) {
- static nsecs_t vsync_time = 0;
- static nsecs_t old_vsync_period = 0;
- nsecs_t sleep;
- nsecs_t now = systemTime(CLOCK_MONOTONIC);
-
- //cal the last vsync time with old period
- if (ctx->vsync_period != old_vsync_period) {
- if (old_vsync_period > 0) {
- vsync_time = vsync_time +
- ((now - vsync_time) / old_vsync_period) * old_vsync_period;
- }
- old_vsync_period = ctx->vsync_period;
- }
-
- //set to next vsync time
- vsync_time +=ctx->vsync_period;
-
- // we missed, find where the next vsync should be
- if (vsync_time - now < 0) {
- vsync_time = now + (ctx->vsync_period -
- ((now - vsync_time) % ctx->vsync_period));
- }
-
- struct timespec spec;
- spec.tv_sec = vsync_time / 1000000000;
- spec.tv_nsec = vsync_time % 1000000000;
-
- int err;
- do {
- err = clock_nanosleep(CLOCK_MONOTONIC, TIMER_ABSTIME, &spec, NULL);
- } while (err<0 && errno == EINTR);
- *vsync_timestamp = vsync_time;
-
- return err;
-}
-#endif
-
-static void *hwc_vsync_thread(void *data) {
- struct hwc_context_1_t* ctx = (struct hwc_context_1_t*)data;
- nsecs_t timestamp;
-
- setpriority(PRIO_PROCESS, 0, HAL_PRIORITY_URGENT_DISPLAY-1);
- sleep(2);
-
- while (true) {
- pthread_mutex_lock(&hwc_mutex);
- while (ctx->vsync_enable == false) {
- pthread_cond_wait(&hwc_cond, &hwc_mutex);
- }
- pthread_mutex_unlock(&hwc_mutex);
-
- if (wait_next_vsync(ctx,&timestamp) == 0) {
- if (ctx->procs) ctx->procs->vsync(ctx->procs, 0, timestamp);
- }
- }
-
- return NULL;
-}
-
-//#ifdef WITH_EXTERNAL_DISPLAY
-//#define SIMULATE_HOT_PLUG 1
-#define HDMI_UEVENT "DEVPATH=/devices/virtual/switch/hdmi_audio"
-#define HDMI_POWER_UEVENT "DEVPATH=/devices/virtual/switch/hdmi_power"
-
-static bool isMatch(hwc_uevent_data_t* ueventData, const char* matchName) {
- bool matched = false;
- // Consider all zero-delimited fields of the buffer.
- const char* field = ueventData->buf;
- const char* end = ueventData->buf + ueventData->len + 1;
- do {
- if (strstr(field, matchName)) {
- HWC_LOGEB("Matched uevent message with pattern: %s", matchName);
- matched = true;
- }
- //SWITCH_STATE=1, SWITCH_NAME=hdmi
- else if (strstr(field, "SWITCH_STATE=")) {
- strcpy(ueventData->state, field + strlen("SWITCH_STATE="));
- }
- else if (strstr(field, "SWITCH_NAME=")) {
- strcpy(ueventData->name, field + strlen("SWITCH_NAME="));
- }
- field += strlen(field) + 1;
- } while (field != end);
-
- return matched;
-}
-
-static bool chk_external_conect() {
-#ifdef SIMULATE_HOT_PLUG
- HWC_LOGDA("Simulate hot plug");
- return chk_bool_prop("debug.connect_external");
-#else
- //TODO:need to check hotplug callback for different device.
- //Should consider different device.
- return chk_bool_prop("sys.sf.hotplug");
-#endif
-}
-
-static void *hwc_hotplug_thread(void *data) {
- struct hwc_context_1_t* ctx = (struct hwc_context_1_t*)data;
- bool fpsChanged = false, sizeChanged = false;
- //use uevent instead of usleep, because it has some delay
- hwc_uevent_data_t u_data;
- memset(&u_data, 0, sizeof(hwc_uevent_data_t));
- int fd = uevent_init();
-
- while (fd > 0) {
- if (ctx->procs) {
- fpsChanged = false;
- sizeChanged = false;
- u_data.len= uevent_next_event(u_data.buf, sizeof(u_data.buf) - 1);
- if (u_data.len <= 0)
- continue;
-
- u_data.buf[u_data.len] = '\0';
-#if 0
- //change@/devices/virtual/switch/hdmi ACTION=change DEVPATH=/devices/virtual/switch/hdmi
- //SUBSYSTEM=switch SWITCH_NAME=hdmi SWITCH_STATE=0 SEQNUM=2791
- char printBuf[1024] = {0};
- memcpy(printBuf, u_data.buf, u_data.len);
- for (int i = 0; i < u_data.len; i++) {
- if (printBuf[i] == 0x0)
- printBuf[i] = ' ';
- }
- HWC_LOGEB("Received uevent message: %s", printBuf);
-#endif
- if (isMatch(&u_data, HDMI_UEVENT)) {
- //HWC_LOGEB("HDMI switch_state: %s switch_name: %s\n", u_data.state, u_data.name);
- if ((!strcmp(u_data.name, "hdmi_audio")) &&
- (!strcmp(u_data.state, "1"))) {
- // update vsync period if neccessry
- nsecs_t newperiod = chk_output_mode(ctx->mode);
- // check if vsync period is changed
- if (newperiod > 0 && newperiod != ctx->vsync_period) {
- ctx->vsync_period = newperiod;
- fpsChanged = true;
- }
- sizeChanged = chk_vinfo(ctx, HWC_DISPLAY_PRIMARY);
- if (fpsChanged || sizeChanged) {
- ctx->procs->hotplug(ctx->procs, HWC_DISPLAY_PRIMARY, 1);
- }
- }
- }
- }
- }
-
- return NULL;
-}
-//#endif
-
-static void hwc_registerProcs(hwc_composer_device_1 *dev,
- hwc_procs_t const* procs) {
- struct hwc_context_1_t* ctx = (struct hwc_context_1_t*)dev;
-
- if (ctx) ctx->procs = procs;
-}
-
-static int hwc_getDisplayConfigs(hwc_composer_device_1_t *dev,
- int disp ,uint32_t *config ,size_t *numConfigs) {
- struct hwc_context_1_t* ctx = (struct hwc_context_1_t*)dev;
-
- if (*numConfigs == 0) return 0;
-
- LOG_FUNCTION_NAME
-
- get_display_info(ctx,disp);
-
- if (disp == HWC_DISPLAY_PRIMARY) {
- config[0] = 0;
- *numConfigs = 1;
- return 0;
- } else if (disp == HWC_DISPLAY_EXTERNAL) {
- HWC_LOGEB("hwc_getDisplayConfigs:connect = %d",display_ctx->connected);
- if (!display_ctx->connected) return -EINVAL;
-
- config[0] = 0;
- *numConfigs = 1;
- return 0;
- }
-
- LOG_FUNCTION_NAME_EXIT
- return -EINVAL;
-}
-
-static int hwc_getDisplayAttributes(hwc_composer_device_1_t *dev,
- int disp, uint32_t, const uint32_t *attributes, int32_t *values) {
- struct hwc_context_1_t* ctx = (struct hwc_context_1_t*)dev;
-
- LOG_FUNCTION_NAME
-
- get_display_info(ctx,disp);
-
- for (int i = 0; attributes[i] != HWC_DISPLAY_NO_ATTRIBUTE; i++) {
- switch (attributes[i]) {
- case HWC_DISPLAY_VSYNC_PERIOD:
- values[i] = ctx->vsync_period;
- break;
- case HWC_DISPLAY_WIDTH:
- values[i] = fbinfo->info.xres;
- break;
- case HWC_DISPLAY_HEIGHT:
- values[i] = fbinfo->info.yres;
- break;
- case HWC_DISPLAY_DPI_X:
- values[i] = fbinfo->xdpi*1000;
- break;
- case HWC_DISPLAY_DPI_Y:
- values[i] = fbinfo->ydpi*1000;
- break;
- default:
- HWC_LOGEB("unknown display attribute %u", attributes[i]);
- values[i] = -EINVAL;
- break;
- }
- }
-
- LOG_FUNCTION_NAME_EXIT
-
- return 0;
-}
-
-
-static int hwc_getActiveConfig(struct hwc_composer_device_1*, int) {
- LOG_FUNCTION_NAME
- //TODO:
- LOG_FUNCTION_NAME_EXIT
- return 0;
-}
-
-static int hwc_setActiveConfig(struct hwc_composer_device_1*, int, int) {
- LOG_FUNCTION_NAME
- //TODO:
- LOG_FUNCTION_NAME_EXIT
- return 0;
-}
-
-static int hwc_setCursorPositionAsync(struct hwc_composer_device_1 *dev, int disp,
- int x_pos, int y_pos) {
- LOG_FUNCTION_NAME
-
-#ifdef ENABLE_CURSOR_LAYER
- int err = 0, i = 0;
- struct fb_cursor cinfo;
- struct hwc_context_1_t* ctx = (struct hwc_context_1_t*)dev;
- cursor_context_t * cursor_ctx = &(ctx->display_ctxs[disp].cursor_ctx);
- framebuffer_info_t* cbinfo = &(cursor_ctx->cb_info);
-
- if (cbinfo->fd < 0) {
- HWC_LOGEB("hwc_setCursorPositionAsync fd=%d", cbinfo->fd );
- }else {
- cinfo.hot.x = x_pos;
- cinfo.hot.y = y_pos;
- if (disp == HWC_DISPLAY_PRIMARY) {
- HWC_LOGDB("hwc_setCursorPositionAsync x_pos=%d, y_pos=%d", cinfo.hot.x, cinfo.hot.y);
- ioctl(cbinfo->fd, FBIO_CURSOR, &cinfo);
- } else if(disp == HWC_DISPLAY_EXTERNAL) {
- //TODO:
- HWC_LOGDA("hwc_setCursorPositionAsync external display need show cursor too! ");
- //ioctl(cbinfo->fd, FBIO_CURSOR, &cinfo);
- }
- }
-#endif
-
- LOG_FUNCTION_NAME_EXIT
- return 0;
-}
-
-
-static int hwc_device_open(const struct hw_module_t* module, const char* name,
- struct hw_device_t** device) {
- int ret;
-
- if (strcmp(name, HWC_HARDWARE_COMPOSER)) return -EINVAL;
-
- struct hwc_context_1_t *dev;
- dev = (struct hwc_context_1_t *)malloc(sizeof(*dev));
- memset(dev, 0, sizeof(*dev));
-
- if (hw_get_module(GRALLOC_HARDWARE_MODULE_ID,
- (const struct hw_module_t **)&dev->gralloc_module)) {
- HWC_LOGEA("failed to get gralloc hw module");
- ret = -EINVAL;
- goto err_get_module;
- }
-
- //init primiary display
- //default is alwasy false,will check it in hot plug.
- init_display(dev,HWC_DISPLAY_PRIMARY);
-
- // willchanged to use hw vsync.
- dev->vsync_period = chk_output_mode(dev->mode);
-
- dev->base.common.tag = HARDWARE_DEVICE_TAG;
- dev->base.common.version = HWC_DEVICE_API_VERSION_1_4;
- dev->base.common.module = const_cast<hw_module_t *>(module);
- dev->base.common.close = hwc_close;
-
- dev->base.prepare = hwc_prepare;
- dev->base.set = hwc_set;
- dev->base.eventControl = hwc_eventControl;
- //++hwc 1.4 abandon api
- dev->base.blank = hwc_blank;
- //--hwc 1.4 abandon api
- dev->base.query = hwc_query;
- dev->base.registerProcs = hwc_registerProcs;
-
- dev->base.dump = hwc_dump;
- dev->base.getDisplayConfigs = hwc_getDisplayConfigs;
- dev->base.getDisplayAttributes = hwc_getDisplayAttributes;
- //++hwc 1.4 new apis
- dev->base.setPowerMode = hwc_setPowerMode;
- dev->base.getActiveConfig = hwc_getActiveConfig;
- dev->base.setActiveConfig = hwc_setActiveConfig;
- dev->base.setCursorPositionAsync = hwc_setCursorPositionAsync;
- //--hwc 1.4 new apis
- dev->vsync_enable = false;
- dev->blank_status = false;
- *device = &dev->base.common;
-
- ret = pthread_create(&dev->vsync_thread, NULL, hwc_vsync_thread, dev);
- if (ret) {
- HWC_LOGEB("failed to start vsync thread: %s", strerror(ret));
- ret = -ret;
- goto err_vsync;
- }
-
-//#ifdef WITH_EXTERNAL_DISPLAY
- //temp solution, will change to use uevnet from kernel
- ret = pthread_create(&dev->hotplug_thread, NULL, hwc_hotplug_thread, dev);
- if (ret) {
- HWC_LOGEB("failed to start hotplug thread: %s", strerror(ret));
- ret = -ret;
- goto err_vsync;
- }
-//#endif
-
- return 0;
-
-err_vsync:
- uninit_display(dev,HWC_DISPLAY_PRIMARY);
-err_get_module:
- if (dev) free(dev);
-
- return ret;
-}
-
-/*
-Operater of framebuffer
-*/
-int init_display(hwc_context_1_t* context,int displayType) {
- get_display_info(context, displayType);
-
- if (display_ctx->connected) return 0;
-
- pthread_mutex_lock(&hwc_mutex);
-
- if ( !display_ctx->fb_hnd ) {
- //init information from osd.
- fbinfo->displayType = displayType;
- fbinfo->fbIdx = getOsdIdx(fbinfo->displayType);
- int err = init_frame_buffer_locked(fbinfo);
- int bufferSize = fbinfo->finfo.line_length * fbinfo->info.yres;
- HWC_LOGDB("init_frame_buffer get fbinfo->fbIdx (%d) fbinfo->info.xres (%d) fbinfo->info.yres (%d)",fbinfo->fbIdx, fbinfo->info.xres,fbinfo->info.yres);
- int usage = 0;
- if (displayType > 0) usage |= GRALLOC_USAGE_EXTERNAL_DISP;
-
- //Register the framebuffer to gralloc module
- display_ctx->fb_hnd = new private_handle_t(private_handle_t::PRIV_FLAGS_FRAMEBUFFER, usage, fbinfo->fbSize, 0,
- 0, fbinfo->fd, bufferSize, 0);
- context->gralloc_module->base.registerBuffer(&(context->gralloc_module->base),display_ctx->fb_hnd);
- HWC_LOGDB("init_frame_buffer get frame size %d usage %d",bufferSize,usage);
- }
-
- display_ctx->connected = true;
- pthread_mutex_unlock(&hwc_mutex);
-
-#ifdef ENABLE_CURSOR_LAYER
- // init cursor framebuffer
- cursor_context_t* cursor_ctx = &(display_ctx->cursor_ctx);
- cursor_ctx->show = false;
- framebuffer_info_t* cbinfo = &(cursor_ctx->cb_info);
- cbinfo->fd = -1;
-
- //init information from cursor framebuffer.
- cbinfo->fbIdx = displayType*2+1;
- if (1 != cbinfo->fbIdx && 3 != cbinfo->fbIdx) {
- HWC_LOGEB("invalid fb index: %d, need to check!",cbinfo->fbIdx);
- return 0;
- }
- int err = init_cursor_buffer_locked(cbinfo);
- if (err != 0) {
- HWC_LOGEA("init_cursor_buffer_locked failed, need to check!");
- return 0;
- }
- HWC_LOGDB("init_cursor_buffer get cbinfo->fbIdx (%d) cbinfo->info.xres (%d) cbinfo->info.yres (%d)",
- cbinfo->fbIdx,
- cbinfo->info.xres,
- cbinfo->info.yres);
-
- if ( cbinfo->fd >= 0) {
- HWC_LOGDA("init_cursor_buffer success!");
- }else{
- HWC_LOGEA("init_cursor_buffer fail!");
- }
-#endif
-
-
- return 0;
-}
-
-int uninit_display(hwc_context_1_t* context, int displayType) {
- get_display_info(context, displayType);
-
- if (!display_ctx->connected) {
- return 0;
- }
-
- pthread_mutex_lock(&hwc_mutex);
- display_ctx->connected = false;
- pthread_mutex_unlock(&hwc_mutex);
-
- return 0;
-}
-