Files
OpenBMC/meta-raspberrypi/recipes-graphics/userland/files/0003-wayland-Add-Wayland-example.patch
2026-04-23 17:07:55 +08:00

866 lines
75 KiB
Diff
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
From 03053b119a625a03e28a86be0f0ab2aa9e2a6a49 Mon Sep 17 00:00:00 2001
From: Tomeu Vizoso <tomeu.vizoso@collabora.com>
Date: Tue, 1 Oct 2013 13:19:20 +0200
Subject: [PATCH] wayland: Add Wayland example
---
Upstream-Status: Pending
.../linux/apps/hello_pi/CMakeLists.txt | 1 +
.../linux/apps/hello_pi/Makefile | 2 +
.../hello_pi/hello_wayland/CMakeLists.txt | 8 +
.../hello_pi/hello_wayland/Djenne_128_128.raw | 3 +
.../apps/hello_pi/hello_wayland/Makefile | 5 +
.../hello_wayland/cube_texture_and_coords.h | 100 +++
.../apps/hello_pi/hello_wayland/triangle.c | 666 ++++++++++++++++++
7 files changed, 785 insertions(+)
create mode 100644 host_applications/linux/apps/hello_pi/hello_wayland/CMakeLists.txt
create mode 100644 host_applications/linux/apps/hello_pi/hello_wayland/Djenne_128_128.raw
create mode 100644 host_applications/linux/apps/hello_pi/hello_wayland/Makefile
create mode 100644 host_applications/linux/apps/hello_pi/hello_wayland/cube_texture_and_coords.h
create mode 100644 host_applications/linux/apps/hello_pi/hello_wayland/triangle.c
diff --git a/host_applications/linux/apps/hello_pi/CMakeLists.txt b/host_applications/linux/apps/hello_pi/CMakeLists.txt
index b28a94a..2849fad 100644
--- a/host_applications/linux/apps/hello_pi/CMakeLists.txt
+++ b/host_applications/linux/apps/hello_pi/CMakeLists.txt
@@ -25,6 +25,7 @@ add_subdirectory(hello_encode)
add_subdirectory(hello_jpeg)
add_subdirectory(hello_videocube)
add_subdirectory(hello_teapot)
+add_subdirectory(hello_wayland)
if(BUILD_FONT)
set(VGFONT_SRCS libs/vgfont/font.c libs/vgfont/vgft.c libs/vgfont/graphics.c)
diff --git a/host_applications/linux/apps/hello_pi/Makefile b/host_applications/linux/apps/hello_pi/Makefile
index 4c2b2ef..d2b2555 100644
--- a/host_applications/linux/apps/hello_pi/Makefile
+++ b/host_applications/linux/apps/hello_pi/Makefile
@@ -24,6 +24,7 @@ apps: libs/ilclient/libilclient.a libs/vgfont/libvgfont.a libs/revision/librevis
$(MAKE) -C hello_teapot
$(MAKE) -C hello_fft
$(MAKE) -C hello_mmal_encode
+ $(MAKE) -C hello_wayland
clean:
$(MAKE) -C libs/ilclient clean
@@ -43,4 +44,5 @@ clean:
$(MAKE) -C hello_teapot clean
$(MAKE) -C hello_fft clean
$(MAKE) -C hello_mmal_encode clean
+ $(MAKE) -C hello_wayland clean
diff --git a/host_applications/linux/apps/hello_pi/hello_wayland/CMakeLists.txt b/host_applications/linux/apps/hello_pi/hello_wayland/CMakeLists.txt
new file mode 100644
index 0000000..9a2f75c
--- /dev/null
+++ b/host_applications/linux/apps/hello_pi/hello_wayland/CMakeLists.txt
@@ -0,0 +1,8 @@
+set(EXEC hello_wayland.bin)
+set(SRCS triangle.c)
+
+add_executable(${EXEC} ${SRCS})
+target_link_libraries(${EXEC} ${HELLO_PI_LIBS} -lwayland-client -lwayland-egl)
+
+install(TARGETS ${EXEC}
+ RUNTIME DESTINATION bin)
diff --git a/host_applications/linux/apps/hello_pi/hello_wayland/Djenne_128_128.raw b/host_applications/linux/apps/hello_pi/hello_wayland/Djenne_128_128.raw
new file mode 100644
index 0000000..de9173c
--- /dev/null
+++ b/host_applications/linux/apps/hello_pi/hello_wayland/Djenne_128_128.raw
@@ -0,0 +1,3 @@
+雛彑潜愾毖丁效毖丁效喆濁拌喆濁拌喆濁拌喆濁拌荿茸拌荿茸拌櫢霜愾櫢霜愾杉彑咩煽愾櫢霜愾櫢霜愾咩煎彑咩煎彑蒸嵜咩煎彑穣嫋穣嫋穣嫋穣嫋穣嫋叙埆穣嫋穣嫋呪埆助喙飼匯飼匯窄从窄从窄从窄从候儿侯亳鯲虞老麩剣儿駘挙老麩倦裕鯲具裕駘拒裕駘拒裕靆基夢靆器乏鑠鰹乏酲猿鳳酲猿鳳酲猿鳳酲燕憤鑛逸憤酩逼軾猫貲㈹猫詁頭詁笛蠹笛詁頭菽暢蘢辿菽辿菽即喆諾效毖兆枋飯糖榲飯糖榲菶訂枋菶訂枋菶訂枋菶訂枋蹄枋蹄枋蹄枋蹄枋顗凋效顗凋效顗凋效顗凋效顗凋效顗凋效荿茸拌荿茸拌櫢霜愾櫢霜愾咩煎彑咩煎彑櫢鎗彑咩煎彑据嵜据嵜据嵜雛嫋穣嫋穣嫋序喀序喀寿匱寿匱索啝似啝獄匣策匣候儿鵠亳侯亳佼老佼老麩兼老麩健龍鯲愚龍駑奇隆駑奇隆駑奇隆靈叶由鰺椛眠駝会眠靄縁憤鑛逸憤酩逼酩溌酩溌軾猫貲㍾溌軾猫詁頭蠹笛菶訂枋菶訂枋飯糖榲飯糖榲飯糖榲飯糖榲飯糖榲飯糖榲飯糖榲飯糖榲菶訂枋菶訂枋蹄枋顗凋效顗凋效顗凋效顗凋效顗凋效顗凋效荿諾愾荿茸拌荿茸拌櫢霜愾櫢霜愾櫢霜愾咩煎彑据嵜据嵜杉彑雛嫋穣嫋穣嫋序喀序喀寿匱寿匱索啝事匣策匣策匣黒儿黒儿黒儿侯亳侯亳佼老麩兼老鯲愚龍駑奇隆駑奇隆駑奇隆靈叶由鰺椛眠駝会眠靄艶鳳鑛逸憤鑛溢逼酩逼鑛溢逼軾猫貲㈹猫貲㈲頭貲㈲頭詁頭飯糖榲飯糖榲乳歹乳歹飯糖榲飯糖榲飯糖榲飯糖榲飯糖榲飯糖榲菶訂枋菶訂枋顗喋枋蹄枋顗凋效顗凋效顗凋效顗凋效荿茸拌荿茸拌荿茸拌荿茸拌櫢霜愾櫢霜愾櫢霜愾咩煎彑咩煎彑咩煎彑杉彑雛嫋穣嫋穣嫋序喀序喀寿匱寿匱索啝事匣似啝策匣鵠亳獄匣黒儿侯亳鵠亳侯亳麩兼老麩健龍鯱拠狼鯱拠狼駑奇隆靈叶由鰺椛眠駝会眠靄艶鳳靄縁憤鑛逸憤酩逼酩逼酩逼軾逼酩溌貲㈹猫詁頭葈糖歹莫歹飼日歹飼日歹葈筒榲葈筒榲葈筒榲葈筒榲菶訂枋菶訂枋飯糖榲飯糖榲菶訂枋菶訂枋毖兆枋菶訂枋喋枌喋枌顗凧畋顗凧畋顗凋效顗凋效荿茸拌荿茸拌櫢煽慇櫢煎弯恕慇櫢煎弯据嵜雛嫋譲彑咩洗埔授埃咜恕崗腰埃咜徐媾似啝似啝策匣策匣黒儿黒儿黒儿黒儿黒儿黒儿侯亳麩兼老麸愚狼鯱拠狼駑奇隆靈叶由駝会眠駝会眠駝会眠靄艶鳳靄艶鳳靄縁憤鑛溢逼酩逼鑛溢逼酩逼貲㈹猫貲㈲頭葈糖歹駁淒飼日歹飼日歹葈筒榲葈筒榲葈筒榲葈筒榲飯糖榲飯糖榲飯糖榲飯糖榲飯糖榲飯糖榲菶訂枋飯筒枋喋枌喋枌喋枌喋枌蹄枋蹄枋顗凋效顗凋效顗凧畋顗茸拜櫢煽慇櫢煎弯咩煎彑咩潜嵜咩煎彑咩染嫂橳醸崗茁菅弯樹媾咜序埃咜徐媾咜徐媾授埃授埃似啝似啝似啝似啝黒儿黒儿鵠亳侯亳麸虞亢麸愚狼麸虞亢鯱拠狼麥寄隆麥寄隆鰺椛眠駝会眠駝会眠靄艶鳳靄縁憤鑛逸憤鑛逸憤酩逼酩逼酩溌飼乳淒駁淒駁淒駁淒飼日歹飼日歹飼日歹飼日歹飼日歹飼日歹葈筒榲葈筒榲乳歹乳歹菶諦榲飯糖榲逓楪逓楪喋枌喋枌蹄枋蹄枋蹄枋蹄枋顗凧畋顗茸拜顗茸拜荿霜慇荿茸拌櫢霜愾櫢霜愾咩煎彑茁菅弯茁菅弯茁椙崗咜徐媾咜徐媾咜徐媾授埃授埃授埃授埃似啝似啝似啝似啝策匣黒儿侯儼券儼麸虞亢鯱拠狼喰狼渠狼麥寄隆鰺樺由鰺樺由鰺椛眠駝会眠靄艶鳳靄艶鳳靄縁憤鑛逸憤酩溌飼乳淒眉淒駁淒駁淒駁淒駁淒駁淒駁淒飼日歹飼日歹飼日歹飼日歹乳歹乳歹飯統歹日榲逓楪逓楪到榲到榲蹄枋蹄枋蹄枌喋枌顗茸拜荿増枌顗凋效顗兆拌顗兆拌櫢騒拌穿慇靑旋弯靑煽崗橳錠弯橳醸崗橳醸崗咜徐媾咜徐媾咜徐媾咜徐媾授埃授埃授埃授埃似啝策匣黒匕候匕券儼兼亢空亢挙隆渠狼麥寄隆麥寄隆麥嬉由鰺樺由鰺椛眠駝会眠駝介鳳靄苑眠靄縁憤駁淒駁淒飼日歹飼日歹駁淒駁淒飼乳淒駁淒麦淒麦淒麦淒麦淒駁淒駁淒飼日歹飼日歹乳歹乳歹飯糖榲飯糖榲葈凧歡飼訂榁葈兆榁葈兆榁蛸楝蛸楝蛸楝蛸楝顗凧畋顗凧畋顗凧畋顗凧畋櫤椙擔櫤椙擔櫤椙擔櫤杉愍櫢霜愾櫢霜愾据嵜据嵜穣媾女媾女媾女媾寿媾受啝歯啝飼匣麪鵠匣麪穀亳麪穀亳鯰交亳佼老麩兼老侯亳侯亳駭倦老駭倹龍靂駒龍鑞居裕靈叶由靈鰹眠鑢駕眠酲猿鳳美瀏美瀏美瀏美瀏美瀏美瀏駁淒眉淒駁淒駁淒駁淒駁淒駁淒駁淒駁淒駁淒乳歹乳歹飯糖榲飯糖榲葈凋歡飼諦歡飼諦歡飼諦歡寵歟寵歟蛸楝蛸楝喋枌喋枌喋枌喋枌顥像杼顥像杼蛸楝顥像楞櫢霜愾櫢霜愾櫢霜愾櫢霜愾櫢煽慇咩杉弯蒸崗蒸崗序崗叙埃穣媾叙埃呪埃飼匣歯啝柵匣窄儿黒儿麩兼老麩兼老駭倦老靂駒龍駭倹龍靂駒龍鯱拠狼鯱拒隆駑奇隆靈叶由美瀏美瀏美瀏美瀏美瀏美瀏美瀏眉淒駁淒駁淒駁淒駁淒駁淒莫歹飼日歹飼入淒麦淒駁歹乳歹日歡統淌飼蹄淌統淌統淌統淌糖歡飼諦歡飼訂榁葈兆榁葈兆榁葈兆榁葈兆榁葈兆榁葈兆榁葈兆榁葈丁效毖丁效毖貯拌喆濁拌喆鐸收潜拈染愎雛愎杉弯咩据崗蒸崗穣媾女媾叙埃歯啝歯啝事匣窄儿鵠亳侯亳交亳鯰鯉老駭健亳鯰鯉老駭健狼鯱拠狼駑奇隆駑基由靈栢猗馞琵猗馞眉疉幅疉復猗馞琵猗馞琵猗幅疉服瀏美瀏美瀏美瀏美瀏美瀏眉淒駁淒麦淒麦淒統淌乳淌統淌統淌統淌統淌統淌統淌飼諦歡飼諦歡飼諦歡飼諦歡飼諦歡飼諦歡葈兆榁飼諦歡菶訂枋菶訂枋毖丁效毖丁效氿諾杪氿濁攸坙鎗攸坙鎗攸櫢煽慇櫢煎弯櫢煎弯咩杉弯咩杉弯穣媾女媾呪埃受啝歯啝柵匣柵匣柵匣麪酷儿麪酷儿鯰交亳鰕倦亢駮具亢靉巨狼靉居隆馞琵猗幅疉幅疉幅疉幅疉幅疉幅疉幅疉美瀏美瀏美瀏美瀏麦瀏眉淒駁淒駁淒飼日歹飼日歹飼日歹飼日歹統淌統淌統淌統淌統淌統淌飼諦歡飼諦歡飼諦歡飼諦歡飼諦歡統淌飯糖榲飯糖榲飯糖榲飯統榮坙鎗攸坙鎗攸坙鎗攸坙鎗攸喆濁拌喆濁拌喆濁拌喆濁拌雛愎雛愎畳彎状崕穣媾女媾呪埃寿埃鰉昨唳鰉昨唳鰉昨唳駲国匚鯰交亳駭倦老駭倦老駭倹龍馞眉疉幅疉幅疉幅疉幅疉幅疉幅疉幅疉幅疉幅疉幅疉幅疉美瀏美瀏美瀏美瀏麦瀏眉淒美瀏美瀏駁淒駁淒統淌統淌統淌統淌統淌統淌統淌統淌統淌統淌飼蹄淌統淌飯糖榲飯糖榲飯糖榲飯糖榲飼諦歡飼諦歡葈兆榁葈兆榁菶訂枋菶訂枋毖丁效毖丁效坙鎗攸潜拈坙遭拈潜拈咩据崗蒸崗女媾叙埃儒媼儒媼黌雌垰黌賜唳朔儿麪酷儿鯰交亳駭倦老﨟副疉﨟復睚﨟副疉﨟副疉﨟副疉﨟副疉﨟副疉﨟副疉幅疉幅疉幅疉幅疉麦瀏美瀏美瀏美瀏美瀏美瀏駁淒駁淒駁淒駁淒駁淒駁淒乳瀑乳瀑餧糖淌餧糖淌飼日歹飼日歹飼日歹飼日歹葈筒榲葈筒榲葈筒榲葈筒榲蒴訂歡蒴訂歡蒴訂歡蒴訂歡飯糖榲飯糖榲菶訂枋菶訂枋葈丁杪氿諾杪坙鎗攸潜拈櫢煽慇咩杉弯咩杉弯蒸崗畳彎状崕助崕儒媼歯啝柵匣麪酷儿麪穀亳﨟副疉髙放睚髙放睚髙放睚髙放睚髙放睚髙放睚髙放睚朋睚朋睚朋睚朋睚美瀏美瀏美瀏美瀏美瀏美瀏美瀏美瀏美瀏美瀏眉瀑乳瀑日淌餧糖淌餧糖歹飼日歹飼乳淒莫歹飼日歹飼日歹飼日歹飼日歹飼廿歡蒴訂歡蒴訂歡蒴訂歡蒴諦榲飯糖榲飯糖榲飯糖榲飯筒榁氿諾杪氿茸榁氿諾杪氿諾杪坙鎗攸坙遭拈潜拈雛愎趨彎助崕諸媼首垰黌雌垰鰉昨唳鰉昨唳駲甑眸墲微疉增復疚驎愈疝驎李疉﨟副疉﨟復睚髙放睚髙放睚髙放睚方疉幅疉眉眸眉眸眉眸眉眸煽狷朋淒眞蒴猪敍汯稟沆託篳埈淅驟麦淒麦淒麦淒麦淒麦淒麦淒麦淒麦淒乳歹乳歹飼日歹飼日歹飼日歹飼日歹葈筒榲葈筒榲氿艇枋氿艇枋氿艇枋氿艇枋氿艇枋氿艇枋氿艇枋氿艇枦託愾送愾雛愎趨彎叙彎諸媼儒媼首垰黌雌垰鰉昨唳夋抱睚浯抱睫驎愈疚驎梨疝髙放睚髙放睚髙放睚髙放睚髙放睚髙放睚幅疉幅疉幅疉幅疉幅疉幅疉毘猝翦汜猪猴禀蒴鎗翳泚美瀏美瀏美瀏美瀏美瀏眉淒駁淒駁淒駁淒莫歹飼日歹飼日歹飼日歹飼日歹飼日歹飼廿榲葈筒榲葈糖歹飼日歹飼廿榲葈筒榲葈答枋氿艇枋氿艇枋氿艇枋氿程拌託愾遭拈染愎趨彎状崕助崕儒媼首垰黌雌垰黌字篷涬麿稷蘒李稷理睥練稻慢稻万睚髙放睚髙放睚髙放睚髙朋睚朋睚朋睚朋睚朋睚朋睚貯猗泚朋瀏爺槃黹毘猴美瀏美瀏駁淒駁淒駁淒駁淒駁淒駁淒駁淒駁淒駁淒駁淒飼日歹飼日歹駁淒駁淒飼日歹飼日歹葈筒榲葈筒榲氿艇枋氿艇枋坙貯效鐸拌坙遭拈潜拈趨彎畳彎状崕助崕儒媼首垰涖履稷涖李稷魵簾篶穗蘒李稷蘒李稷蘒李稷蘒李稷蘒李稷理睛驎癒疚癒疚朋睚朋睚朋睚朋睚朋睚朋睚朋睚朋睚縛疉蕫答轗nhc鳬滾榾答瀚美瀏美瀏美瀏美瀏美瀏美瀏美瀏美瀏駁淒駁淒駁淒駁淒駁淒駁淒駁淒駁淒駁淒駁淒飼日歹飼日歹葈筒榲葈筒榲葈筒榲葈筒榲氿締效坙貯效坙鎗攸坙遭拈洗彎穣愎畳彎助崕助崕儒媼浯漣睥浯漣睥涇梨穗魵煉稷魵簾篶魵簾篶蘒李稷蘒李稷蘒李稷蘒理睛理睛睛髙放睚髙放睚﨟復睚麿睚幅疉朋睚朋睚放疝驎抵歿旄]eg瀚浯美瀏美瀏駁淒駁淒駁淒駁淒美瀏美瀏駁淒駁淒駁淒美瀏駁淒駁淒飼日歹飼日歹葈筒榲葈筒榲氿艇枋氿艇枋氿艇枋氿艇枋氿艇枋坙貯效坙鎗攸潜拈潜拈雛愎畳彎助崕儒媼儒媼鮏奠縒魵傀睥蘒篶魵簾篶魵簾篶蘒李稷蘒李稷蘒李稷蘒李稷理睛理睛理睛理睛璃穃練睛癒疚癒疚癒疚癒疚﨟愈疚驎睇塚灯耜UdlYhe等簓方疉幅疉幅疉幅疉服睚朋睚方疉幅疉復猗馞琵猗馞琵猗馞琵猗蕫美瀏美瀏美瀏眉淒駁淒駁淒莫歹飼日歹飼日歹飼日歹飼日歹飼日歹飼虹枋氿艇枋氿艇枋氿艇枋坙丁杪氿諾杪坙遭拈潜拈染愎畳彎畳彎助崕樹穡夋劔穡蘒穗蘒稷蘒梨穗髜穗髜穗髜穗髜穗蘒穗髜理睛理睛理睛理睛梨疚驎愈疚驎愈疚驎愈疚驎愈睚萢鈞@Vg:PM籠奛琵疝幅疉幅疉幅疉幅疉幅疉幅疉馞琵猗馞琵猗幅疉幅疉幅疉幅疉眉淒駁淒駁淒駁淒駁淒莫歹飼日歹飼廿榲葈筒榲葈筒榲葈筒榲葈筒榲氿艇枋氿訂榁葈丁杪氿濁攸坙鎗攸染愎雛愎蒸拈趨彎償舸悚蕚剱篶簧魵傅簧魵傚穗蘒穗蘒穗蘒穗髜理睛璃穃理睛簾疚理睛理睛理睛理睥練稻凪敝lyzB[n>VW腸微睚朋睚朋睚朋睚朋睚幅疉幅疉幅疉幅疉幅疉幅疉幅疉幅疉美瀏美瀏美瀏美瀏美瀏駁淒駁淒飼日歹飼日歹飼日歹飼日歹葈筒榲葈筒榲葈筒榲氿艇枋氿諾杪氿諾杪氿諾杪坙鎗攸潜拈雛愎畳彎畳彎湜哈諍檐舫恋舅蠇囿疱憐簣奛偸縅魵傅簧魵傅簧魵簾篶縅魵簾篶魵簾篶髜穗髜穗髜穗髜穗魲簾篶魵簾篶蘒李稷蘒履稷裂睛莽A;=?LWI]`AU[椢殕稟髜副睇練稠眉眸眉稟服禀服禀眉眸眉眷柾翩篷掾尾穢愽韆眉猗馞琵猗馞琵猗馞琵猗馞毘瀁蕙縛瀁蕙縛瀁蕙縛瀁泚駁淒駁淒縛榲飼乳淒莫歹飼廿榲葈筒榲葈筒榲葈答枋氿締效坙貯效坙貯效濁拌遭愾送彑染彑杉蛉恂縢恫袵誧屎蚰圀穗蘒穗蘒篶魵簾篶魵簾篶魵簾篶魵練簧傴簧傅穗髜穗髜篶魵簾篶魵煉稷蘒李稷蘒翔魲鷲播GV`=QV@TY.23D2+黔稻髜復睚朋睚朋睚朋睚朋睚朋睚樋臻諦睹汞恷斛諦瀏馞琵猗馞琵猗馞琵猗馞琵猗馞琵猗馞毘瀁蕙縛瀁蕙駁淒駁淒駁淒飼日歹飼日歹飼廿榲葈筒榲葈筒榲葈答枋氿艇枋坙丁枋坙貯效坙著拌託愾送愾走彑煽鈞寬磔轜攪袒湜撕蠣椢縅奓簣淏傅簧魵傅簧魵傴縅篶魵簾篶魵簾篶魵簾穗髜穗髜穗髜穗髜篶魵簾篶魵簾篶魵簾篶魵簇浯劒睥簇丹_pzGV]@T\MRS慢睚魵復疝驎簾睇髙放睚薰方稻万睚﨟服睚朋睚朋睚朋睚疆增眉瞎袤hwv驗殘夋増疂幅疉幅疉幅疉復猗馞琵猗馞毘瀁蕙縛瀁蕙駁淒駁淒駁淒莫歹飼乳淒飼日歹飼廿榲葈筒榲葈筒榲氿艇枋氿艇枋氿締效坙貯效坙著拌鐸拌送愾装迚岦脛鱇癪諧孖曉舍淏偸簣裵傴縅縅髜穗髜傴簧傴簧魵簾篶魵簾篶魵簾篶魵簾篶緘墲剱疳緝赧\m|M[d:T\LSV梨篳蘒麿稷練稻慢稻万睚髙方稻満睚朋睚朋睚朋睚Viu雀疂幅疉幅疉幅疉復猗馞琵猗馞琵猗馞琵猗馞琵猗馞琵猗馞枇瀁蕙縛瀁蕙縛瀁蕙爆淨汯虹淨汯虹淨汯肉歸埈祷楪程楪程楪丁枋坙貯效坙著拌鐸拌装跫纔驀寬暘蛉淼漿袤悚葭奬簧劑縣剱穉魵傅簧魵傅簧魵傅簧魵傴簧傴簧傅穗髜穗髜穗髜穗髜穗髜穗髜偈眥﨡圉穰 /5G\nJS_<ZgFOW冒什釉裵愈篶浯練稻慢稻慢稻慢稻万睚髙放睚髙放睚髙放睚髙慢秣荿涛聰K`tSS_鵰綸涇副疉﨟副疉﨟副疉﨟副疉涇復睚﨟蕗瀁洄枇猗洄枇猗蕙縛瀁蕙縛瀁蕙縛瀁蕙縛瀁汯虹淨汯虹淨埈等歸埈等歸埈等歸埈等歸程楪程楪氿艇枋氿艇枋坙貯效鐸拌册剿跂恙誑鮏悁窖尓萸淏傚耘裵劒縊劑縣劑縣魵傅簧魵傅簧魵傅簧魵傅簧傴簧傴簧傴簧傴簧傴簧傴簧髜穗髜穉奛曝猩决料v1EYPVd;ZiGQYogc釶塚愉緞﨡簾穗蘒李稷蘒李稷蘒李稷蘒李穃理睛理睛驎愈疚驎油疥斃炒|?RePUb矚戉倏﨟副疉﨟副疉﨟副疉﨟副疉﨟副疉﨟伏猗洄枇猗洄枇猗馞琵猗馞琵猗蕙縛瀁蕙縛瀁汯虹淨汯虹淨汯虹淨汯虹淨埈等歸埈等歸程楪程楪程楪程楪苧枌猪畋|蛞恣萍傲穹曁穢妺麿耘裵劈舍裵劑縣劑縣劑縣劑縣劑縣劑縣辨縣辨縣劑簧傴簧傴簧傴簧傅穗髜偬蘿尢嬋轗麺|@ZnKM\=_nJU`C<;鴒篶簾篶髜篶魵簾篶魵簾篶魵簾篶魵練睛理睛梨疚驎愈疚也猜灑貝9=APbTYf袵喋睚髙放睚髙捧疉﨟副疉﨟復睚﨟副疉﨟副疉﨟副疉﨟伏猗洄枇猗洄微瀁﨏漠瀁﨏漠瀁﨏漠瀁﨏曝淨賑淨匂歸痘歸痘歸痘歸祷楪程楪程楪禎枌jWi閠暘衢耻鵰捧耙裵剱耘裵劑縣劑縣劑縣劑縣劑縣劑縣辨縣辨縣劑簧傴簧傴簧傴簧傴簧傴簧偖蠧屓慚舩湾w]v`bsChx[ir淸暹緲涬漣縅劈篶魵簾篶魵簾篶魵簾篶魵練睛理睛理睛理睛睛褂吝魂捷b;JXZbn袷試瀟復睚髙放睚髙放睚髙放睚捧疉﨟復睚﨟副疉﨟副疉洄枇猗洄枇猗洄枇猗洄枇猗﨏漠瀁﨏漠瀁賑淨賑淨賑淨賑淨痘歸痘歸埈等歸埈等歸埈祷楪程楪CHV蒭囑縱練舁恂耘剿耘奝剽縊剱耘鮱哈縣劑縣劑縣劑縣劑耒傴耒傅縅傴耒舊鳧癒衄訒列籀籠馞俣蓊倔斂炸謝娥穆k;W^Nir/GQざ子掎鉈熈瀝奛捧緻蠇麿篶蘒穗髜疵鰀糖緞淸麿穉墲煉睥蘒璃稱黶倣艢々jUT_MZ[x檍稾浯薮疥驎梨疝驎漣睫浯利稱夋抱睚浯捧疉﨟服疉蕗疚增侭疔增柳猜崩猜沫狷匂狷弐濺匂狷薄濺当濺当濺当濺痘淞禎淞汀楝碇歟JM[笶縣哇縱傴舂尹耘淸劔耘奝劑舍鮱咬耘裵剱耘裵剱耘裵剱耘裵剱耘裵剱耒裵傚耒裵傅舊鮱劒耒裵做耡戉耨涖符柬}ザyzx\mx<R^8M]K\iJVaV[^onj鉗缺萍淸理縊魲傴簧囿緤魵愉篶髜菲鮱m"?PSXiN^`F]Y緡鑓簓蘒聯睛梨疚驎鑓睫浯薮稱夋抱睚浯捧疉﨟副疉蕗疔增侭疔增迄猜崩猜崩猗尾猗備瀏迫瀁迫瀁迫瀁薄淨迩淨匂歸痘歸痘歸匂歸NQ_筐蚯鮻恫耨辨莽廁舍淲哄舍鮱哈葭咨耙劈舍鮱哄舍鮱哄舍鮱哄舍鮱哄舍鮱哄舍鮱哈葭鮱哄舍裵剿痞簪﨡幵穢坿彰v{{s~´]R_q>M_BSg=L`KXhFO]OU]餐服緻淏縅魲簧魵傴簧傚篶﨡練穗髜sKRhL]h#>:訒愉緻魵穗驎油疚浯薮疥夋庖稱浯抱睚墲放睚髙放睚增侭疔增侭疔增侭疔增侭疚尾猗尾猗尾猗薄淨迩淨迩淨迫瀁迫瀁痘歸痘歸当楪禎楪JM[艀囗耨辨莽廐耡奧耡鮏奩耡奩耡舫鮱哄舍鮱哄舍鮱哄舍鮱哄舍鮱哄舍鮱哄舍鮱哄舍鮱咨葭尨衽┘v}yx|s_^^gv@Q]>N^<L^<M]TaoMZd繭縊淏偸縊魵傅簧魵傅簧涬囮簟魵哈簧稔篠mgn`w.OJ鞴續睫鑓穃方稱李稷浯煉稷蘒李稷蘒履睫浯鑓睫浯鑓睫浯鑓睫浯薮疔增侭疔增迄猗尾猗備瀁尾猗增風瀁迫瀁迫瀁迫瀁薄淨迩淨迩淨燈淨,/=ztnZ樢耨辨莽幺睾廈耡奩耡奧舍鮱哄舍鮱哄舍鮱哄舍鮱哄舍鮱哄舍鮱哄舍鮱哄舍咏縱舍涖癒菻qΞУ^wm^sCXkCZj|Obf<MVBV\BU\@TZGXaCW]r哇稷囹耘劑縣剽簟鮏奩耡傴睥塚愉縣鮻綰黯m:ZtMfs.QRQIN嗅在埣鱆覧猜満睛涖覧穃蘒李稷蘒李稷涖履稷墲薮睫墲薮睫墲薮睫迄疔迄疔葺睇葺禀薄倏薄倏備疊備疊薄倏備眸迫瀁迩淨燈歸迩淨?BP寀纛猝閇葺耨辨莽幺縡鞆驂満蛆淸奧耡鮏奧耡淲咥舍淲咥舍淲咥舍淲咥舍淸尹耡淸奢耡淸奢耡淸奢耡濶奢虱恃瀾妺Yxy%*=Q\-?M<N_yYj{CTfTglATZAT[AT[@RY!59@PUu暈瀝撩舊淸劑縣劍縒蠇圄縊劈簣奛囓蒄轢剞蛔┴番PpK`k*PS|}MJ@癩菻蘒煉稱髜履睿蘒李稷蘒履簍墲愉稷嵐淅墲薮睫墲薮睫迄疔迄疔迄疔迄疔沫猖沫猖峯猜峯猜峰瀛峯猜峯濾楓淺簸淅簸淅DGU黼燧穗攪耨辨莽庠誚哇萼贓備耜奢耡淸奢舍淲咥舍淲咥舍淲咥舍淲咥耡淸奢耡淸奢耡淸奢耡淸奠袵嚥痼闌諢痞u篭度j~JapeoVlxF\cGW`2@J6CK-6A $狸剱縱裵劒耘劔舊裵劑耒劑舩鞐會袰縹舒妬廓xwyRhlCkmO\]Z`\板搾睹魵簾簗魵煉篶髜穗髜穉薰厄槐涖吏睫墲薮睫墲薮睫墲薮睫迄疔迄疔迄疔迄疔迄疔迄疔峯猜峯猜峯濾風濾楓淅樋歿GIW黹沾縊贓奣恬蛆孅伸广耨麼耨淲圀舊鮻劒舍淲囹舍淲咥舍裵屁耡裵奢耡淸尹耡淸奢耨瞎訷穢俎゛m⊆z~7R_3T[6]]<RiAYjBTe>N\<GS">BPEJ]黯理蚰奛哄耡鮱哄舍鮱咬舍裵剿蠣韜爨すy∈Suqm|]pt:dfNU`^mvZcd澱紙拮淏聯緞鑓篶髜穗髜睿訒呻槐鮻咏嫂李稷涖履稷墲薮睫墲薮睫墲薮睫墲鑓睫迄疔迄猖迄疔迄疔迄猜峯猜峯猜楓濾楓濾飛歿?TX知裸縹寀蔆鮻囎舸驤怫淤叔Zp~Xdr釼滌猾轎渧手竄籵逞萪翡馞咥籀鮪衢褂恟袂微葭孖剱藾裵蚰蒟n{usxne|7N]>R^=Q_8MR@U\@V]@S[9MU/6;MV<NWw憮繽聽蘒穽葢沐縉幺籃詈闊{]j~CTdYhwSak<NXSkd^fu戯玩縊厠昴旙鱧剿穢封耘玳U`k掵懌猩裵傴篷﨟覧痂廉緘訳稾訳簗黷抹稾躍緡峰疔靖睫末疔末疔峯猜峯猜葺猜峰淅BTZJSW謾穩菻妤囑蕚鼕PdlEU^闃釡鰀奐衽皷銅左\\c漲萠髙囓縢叮挈檜幀窕髜誥鈞寢瞞鰌轌輔窶Πwk|f}Thw>U`@Vc:P\AT[@SZ@RZEX`?OYGXaBS\DT^9WRHX[萠奣咐耻鱠廂舊劍耿夋號矗Цo暗h|DTdfvDU^9ITIa[HQb※Z猾F>H蔬衒咢簟傅耆鮻抹縊涜fpz疾件蚫齎到篷薰恋睾恋篷蘭簍蘭簍訳稾訳稾靖睫末疔末疔末疔宝猜宝猜宝疔抹猜9JX<FMupp轜圄舩咸蚪繝pz~>T\@S[縷呰袂蒿螺蚶}U\i鱧劍簷搓舐Z]h髴縟鮏恷蜑俺荒孛驗蘭袿洋}ouxu|aue|8KV@S_F[bFV_>OXIZcFW`GU^GV_ET]ES\7Y^G[c@FJ尓衫呰蕚濫簫并縣侘┯~{孤Ldt=P]_q|?RY;NWCZYWar_^l亘藍衾尢簟哇縊鮏癒蚣釶友└Ubl軏襠轂鮻咥疝做穃峰穃裂穃裂穃烈睛利稷靖疔末疔末疔末疔末疔抹猜部濾4DTGQ[IHM鱧糢聆訒屁葭渹丗摸`ruBZbAT\]ad鈬汾睹埓塰dpxKXeZcg胱縒驟徘卍lzO[kД葫黷僥XjvAS\跏條窰У^o 1C!<K[n-=;O`6KZ*<I@T_>SZ1FN-:)5=JW!.;1?LJUaFR^NXd:XbBUaBDM韆胄舫咆袞鼈恤舩衢訷倩聚謌繆旃杜Lcr9P[OdoI\c<OX.-'2IQ`]佳LRe電戊緞瞞裵傀簣驀鍋淤悉QapRYZ譣恕篶奓劣穉剿緲裂穃廉穃裂穃藍睛訳稾躍緲訳稾訳簗末疔末疔奉濾封猜.?%347?聲竏毓瑩蒄辟Sls:RX<LVFFN鶴鋺窘鯵Tdl>KZCU^芫纐簟皷Tjx>R__eg~D`lA^eglf粤シkzxTj|yBWfG^i?R]@U\9NV0?L7GS0>J#1=6DP#/%1"-9"6F2<K74?恂耄恫縱驟撥萸鱚叭邃1商化~wc}H`l?UaAW^BR[>PWDWX;F\)8;┰GRg辷哄籌奓Ug{T]]框梦瀚哇簣剳簪列睛黷欄睛黷藍睛藍睛濫疚藍睛黴末疚躍疚訳猖抹猖,9G!,:7=H #,/.3校伽糎a|Jbh?UZ>MTEDS聹驎jHV^;IU:P`mts淲夬瞰rUnt4OYGVX瘁孑慳gz~>[e9TZ7EI氛x8I8I「}vzczqQit<R]@Va6NU<KW<LX3CO1AM/<H:HT;IU(6B(:G*2A'%0F85疳黝涬葷趾棡葭鳧彎撲uーxcyUny=VbCVbG[b?NWDPYHZZEPe@QSPhbP_tZbj齊惧默裵剿耄剞蒂{Uk\hn桀怦瀘訳簣黻剪穢剩穉剳簟偐穉偐穉剳睛藍睛濫疚藍睛薬疚薬疚薬疚薬疚?KT.:F0:H1;JCMW?JQ>LPCRP8KY:NR>RR=PW?M\BIV鼈eIRULU_/J]Wae釐赭xI_c@[h8LXqxwΞqLdtIZ`2LTHQ`_Nj{.?Pet^|rnxo`{8P\=Ua<V`AQ^?P^9JW6GT7GT6FS8HV8HU7LW8DQ;=E蛛漑耿鱚油轌鮻搨聒儿妬Rp/@*<K2@;KWdw&9D9OZ@V]-7%2:AKTL\[CLaGXZF`[FVmIPX籌裵偸耘剽耘諂農讐〓=TlWclvxu三鞦躍簣黹呶穢剳簪剳簪偐穉偐穉偕睛黷欄睛黷欄睛黷欄睛黹劣疚薬疚訳睛藍睛@JR?IS/:I%3C(8J&9G-BI7OU;FU@MR;IJ5HO1JZ2L[-CEL`O/TdMRSKPY4OeGRVOmgz}:TfCWjPXbl}G[nCQV1N[CPasslz]{tnoQk|4O]:U`9T`<O\;O\1ER*:G=N[<MZ?O\BQ_5SW-@G9CG痰棘鰡諤副釐燉舖亠太ozwNW\FVd5GQVkuAU`GZa8GP5?G?FQ*75ILeK\^Hc\@PgAIQ奬耋奛偖耒奝蔆籤E_xWbj┼欄耄鰾呶穢囎簪咐簪剳穉剳穉剩穃劣穃劣穃鱇約睛烈睛藍睛濫疚薬疚9JP4BH1<C/8A-5>'%,;1;J6FN2DN3FR2ES1DP8IS7HR1?L?P];P_5KX@P\>P^J`rqftBX`9MW=P]7K[「Zr|Kbk4MT7PZ.KV_wnkhfua}B]jXsd{@Tc?P`=P_8CQ*7+<I@Sa8LY2BO(6"+:ALS6=G7:>鈑鬻釵詭裨摯簽鰾棕yvssi}^sas;N\I[f@QZ;NU6JP;M\@RV>HQ,3@-7@CEJ怯蚶渝廈袒徇處ツ奸掴l型貞瞼鰲夾緡黼暦緡黻剴簪黻剴簪驍睿鱆會穉驍假睾驍假睾鞨睿驍疥黷欄睛黷欄睛鱇役疚鱇役疚4DK)9BEOY2;D4=G"0)2?1=I6EN:IQ5EQ7GT8IV9IU5CL(.?L5ER6GT<MZ7GT3CP@P];KX4JQ3GS=P]>Qa:M\H[h6JU6KR2IQ2JV`wd}d|za|qh<SbAYh;O^AVe/DS=P_=P`<IU5EQ2DO9NY8JU-<I+9EEP\:KW)8D(2y}源拙掖繖晞葫用祷赳ⅱ蝣渥tmkh{BUbEWbCT]BT[<NUI]dK\cLY^9DLLU_/38諷檍袂閹尹耄wg~ua}Seo]bd掌会簫囈耒黽偕簪黻剴簪黻剩縡黻剴簪黻剪穉鱆會穉鱆會穉驍睿驍睛黷欄睛黷嵐疚鱇役疚鱇-=J+9E#/)2?-6@2=F0:D2=G3?I<GT6DP/@M5ER1?K9DQ#/9'7E4DQ;KX9IV@L[9FT)+8F4JQ4HS8KX8K[3FU8KX1EP8MU<QY6IU!4A)<K^rgz{v9IUK\iAQ^FZf?R_?Q^;N[<S_BS[5FO:MU;NU9MT:KT7FO=HQ4IW8IV1CQet^lu譏N^[板汀n~|xh|s_rDWdEWbK\eM_fGY`HYc@NTfqt^gn=GQEKO踐蚰渧耄黽t~~h|Wn~HZdfoputk韆暈耡囈與鰾囃簷鰾囃簷鰾呻簟驛剞睾驛假穉驛假穉驛假穉鞨睿黷欄睛黷欄睛鱇役疚鱇役疚)9F)72=K*3@%/9=GQ0>E6CK8BL6BN4AP5AO5BP:GUDP\8BK1BO5ER8ES8ES2?M8BP)7.8F0EP6HR;KYCS`%6C$5B2BM5EQ7JR=MV&6C+;F/<]lyM^k9IV-8C<GS@NZ (3EP8LW8LW<S^CS\:KT?OY@QZFXaFU^?NW<GQ;LX8HU7IVN_lSgw?Sce{F_d\dl髟Vns$2-?P3>MnThy0?9LYEWb$4=)0&8?*9B2=C*.sJW^CKP鴆蝠艀漣飜艢|Khj\mw`t[n{@R\OY^_^[鉞溏耡黼剩縡黼囀縒黼囀縒鰾呶縒黼囀縒驛假穉驛會簧驛假穉驛偃睿驍睿驍睿驍睿驍睿3BS3@P5?M.7D/8F7AJ6BL(9?-6D)5A3@N1=N2>O#0>'/7E7HU8HU6BQ7DRAN\5?M9DR>HV.?L2BP3FP:LW0?L)9E-:H/<J5GO8GP".8&0&/,%1,:"+.7AFQ[:IQ5FNAT[?U\6OV&6?(1,>G #$-(1(1-=F9AGO\`?KSAPY7ITBUbXpTk|1N^@MZ穏qgj{7DP\qsK_q,@R`r9LYEWb:KT8JPCV\BP]?JR4?C +.1@G2<?囘鰀咥贏雙てu|oWfoLX]DGF掫苓疽鼇尠舖黼囀縒黼囀縒驛剪簟鰾咀簟驛剔穡驛剔穡驛剔穡驛剔穡鞨睿鞨睿鞨睿鞨睿3DQ6GS2@N1<J2;H5BN-9E%2+7(63@N/>O7FV)6C0:H?LW;KX:JW3DQ1AN0<J&4 &.;I3CT4ER1CNCS\>MU1?L1;I,6H4GS;IU5?H'0:#'3 )3#0<,:&31>J:ERDQ^DS`@R^?S^9MY1DK6GP+9B +5&2<&1;0@H)207=$(.$17'-:MT?R_J_n,L[CS_z~g{by|[nЦM`o7KX?Q\>OX<NU:MS@M\BNYEPSARX:MU:GN珮碵鈬謔捍弊w|O_kSblVcgAHG窿溂湟黽幇穢黼囀縒黼囀縒黼囃簟驛剔穡鱆剪穡鱆剪穡鱆剪穡鱆剪穢驛假穉驛假穉鞨睿鞨睿3EP6FS2@L.:F.:H6AO0>L%2@%3?.:I1AQ/?O1AQ/>N0<J8GS7HU5FS5FS4ER2CO,9?P\=MZ5EU0BN4CO3DM%.%108F29J8IZ8HU&.;%*5(.9'1:,4B"/= /:3AM:HT?O[:MX@R]=OZ<Q[6GS0@L9GT%)1>0=I8FS$0&.=.6C;GQ:KQ;MT3FM<MXAS`-IZBM\~YzuXey[r|ThzOcu{DWdI[fEV_ASY@SX;I]?MYBSYDW[=S[<PX轄蜒捶盒失YlpvzhUbnSclP\cOZZEJF裝檮穹囁簫驗夲簫驗夸縟驗夭穩閧咒簟鞣咒簟鞣咒簟鞣咒簟鞣呰簧閼倆簧閼們簣鈔簣鈔4HO1BK7FR*7C-8G09K-:J-8K.=H+<I/?O';J*>M.>N,<I4BN5IV3FS4HU4ER/@M(9F)9E5FR.>O2DP3CO2@H)4=8DO5=K4;M(<M)7H -',6-0:).9/8F1>O&7C->K8HU8IV>O\GWe;LY6FT3CQ8HU+4C#18@O?FUCQ_%3'0G6DX6GS1AN<PW;MX7KX>Qa3P^@JUEKX6Qb'J_dt &2Pcu/A1@AUbEWb>OX'9@L^c?NdGXf@PWDX^8P]H]fS\`孕^fm]{fw}eゥU^jNYdAPVWehU]X跪籌渹懶穰驗囃縒黻囃穩鰾囁簫驗寳簟鞣咒簟鞣咒簟鞣咒簟驗咒穢鞦咒穢鞦呰穡閭剌穡閭0=I0>J(13<F.8A2>J0=K1>M*8D,=I'8E+>M.BN2DN3EM3CI1@M/?K1AN4DQ6EV,;K+9L/<O/@J0AO,@P0CU+>P/?Q)9I*7E-<M);G!3@#1?#.="2>*8D+<G*;H-?L2CP5IV2ER9Q\:Q]8Q],CM 7B"7B:MX9JV6GS&2,8.EN5HR=MY>KW4?K4?KCP\<IU;JW8ETAMY:CO2<IDTbudy9IT0AM1CM2DOCVa*;D<LV$.")'4<E*4<DPWKW_YfoGY`@UewPaoQbrtK^o<K\LdiEX_HX^@EK=<>趙恪耻闍汝葩趺贔窘瑯應籀鈔恂耆跂梦縱辣梦縱諠咎穢諠咎穢趁呟穢趁呱穢赳剏睹赳剏睹,<I+7-9E-9C*6.9G*7G-;M3AM0=K-=J.>N0AN5EQ3BK1BH3CP4DP->I7GT6FS2AR1@P0@P0@L0@L1BO7FW6EV+:K+8F*6B,>K/?L'4B#.<)1>#/;'3?)7C/;J0@M1AN4ER6JW;N[.EQ/EQ/EP-@K+@K8JU<LX5EQ1?K9GS8NY2EO%1)58DP3?K/=I-:F,<I5APBNZ'4=)5 #%5F(9M0@L5ER3BO:JVFVc!2;6GP=OX"*3DLU9EL>HP)15BJ,4<MRjzDXeatzViwCUfi{xH[bNahFU[V_cLQR慝嚀痍裄帑蚩鰐粭氣耜裘恁籃鱠呱縱辣梦縱辣夛簷趙嚮簷趙嚴簷鈔嚴簷鈔嚴穢釿呷穢釿2BR3CP1=L)7C-;I-:J-;N/>Q4@K7BP0<M-<L3BS7DR9EN8CN8GP1@I2@L9GS1?K1?J.;I,9G5DL/>G->J3CP:JW2?K-8B09C0AN2>L)4B(0?)1>%-;)1?*6B/9H0=K2?M3CP:JW=N[8HV7JX7KV5JU7HS7IT:JV1AM6DP;IU5GR4DQ3AM=IU8DP.:FFT`6GR3BS3@N@LX"+5.8B'09*6B0;F2?M0=L2AL8EQES`7FOCR[APY<FNFQY<GOGQY&4<:GOGT\EQYWiq6GOI[fSdpzlli}I]aIYa4@EALT>BF韞艟榕碣絋XW]裼條舍跂幀窕跂幎縱辣梦縱辣梦縱辣梦縱辣夛簷趙嚮簷趙嚥簷諢嚥簷諢5GX-=M9IV)6E*7E*9I)9J(;-"0.;K2?N3@P-:H!.$-7".8%0:$09*6@=IR.9F%1=5AM8EL0<F1?L7DPDR^2=G3=E,6=.;J4?M,5C%-:)/<'0=-6?/9C1:H4?M9DR;HV?KY<LY<MZ7HU;MW9JU5HS<KX8HT3DP9FR:HT3DM1CL9HQ?JT'0/:D2BJ%7?'7H7DR@KW:DM7?H*5;8?F3;@4=L@HV3;H9EQFR^NYcJV`DOZHV]DQYES[AOWCPXFS[IV^@MUDTZBQXEV_br~xtfxH]pIV\R`fLX^JS[U_bowzエ[]i榴菩蚓鈕夊瞹粃梃縉跂幀縉跂恚簽諢寞簽諢寞穢諠咎穢諠咎穢諠咎穢諠(:K.>N/?L&3A,9G2BR-=N!3F08F0:K9GV5@S.;J/<J'3?7AJ*6(4%1=*6?-8B+4$.)3%()55DP&2;)0)0"*-$/>7?L)1>',9#)6 &0)2<+3=-6E.7E'2@*4B<IW8HU:JW@P]<LX5EQ9IU9IU9IU7DP6DP@NZ<KS>MV>IT@IS1>H7BL6EN2CL=IX8ES&5@&1>2=D$+2"'4;<(/?$409F7@M?LX7CM&1<&6?1BI8IOMYaGT\VckN[cMZb;IQFQW;JOHU]CS[DR^4DRgx6GYJT\R^dCOU>JPEOWIS[blt<Y_}OQ^旙弥衾鈕夛窩聽樣簽諢寞簽諢寞簽諢寞簽裘寞穢諠咎穢裄刳睹裄刳睹裄.>N;KX<IW+:F1>L7DT+9K)8K,7E.7I/:M0?Q/=P6CS/;F/;G+8F&3A,:F)7C/=I,:F+;C$3< ,6(4@&5A-:F*6$+$$(+8)5A)'5*#"-)3%+9)7"08DR;LY:KX6GT!1=&2/;(4)7C*9E.<H$1>&6>/;E.8B5?I+4>9EO.=F3DM:HT3@N0=L.<H-9C"*4(*/67&-=")8)2?;CPCO[AQY7GO;IR*9@/>E,2/5(5=,9A2?G9FNIS\?JRGRZ;FM0:D7AK%/9\foEPWQ\dGSZ>IMYdh+6:ISZhoyOin\`n侑芙篶裄呵窕艫搴簽諢寞簽諢寢龝裔夊龝裔夊穢裔咏睹蛯刮睹蛯刮睹蛯"2?!.:'3*6@*6B9DR4AQ-;M.;K2?O1?Q1AR4DU4DS/<J0>J.=N)9I+:J%6B*;H0@L&6C*:G.8G&3A*6D'8E/=I'2=(-"-0&4A+7C/7D(1%.#-".5$.6"-<%0>$2@,8F1BN9JW:KX:KX*7C1>J0=I,9E1?K-;G9JV%6B/:E(2<+5@(2<(1;9EO.@I6HQ5AJ0<H5AP.?L(4C'3=&/9(06,2C)3@)1>4@LAO\AR[<LV;OW1CJ=OV8JQ<KR?PWJW_<IQ'4<6@J09CCLU3:C:@F29@;=EHJR@KUV^hNY\GTU1=?HUVMY\SYbCVSR[hgj{構香簧艫揶炒鈑憺穹諠幃穹諠幄瞠裄寢瞠裄寢穢蛯刮睹蛯刮睹蛯刮睹蛯0<H*7B7BK'1(2.:F4AO1>N,9J)8H*:K*=N-?P2BR,=J0?K-;O+8K(7G)8I5EQ2CP%5A*:F&3A.;K&6F0?O1AN(7?!.6%16+<H-;G0<H )3'1(2&19%3:"/?%2A)5D,<J.?M;LY7KX2ER7CO1>K6DP4BN3AM3@L2BN3CP7BI7@H;EMELU6AH3@G+?E3GM19C1>J5AP,<M(8I%2B(3<,5=,6E.6E,8D/=IANZ>OX7KS<OW=PW@SZ<OVEV\DU\>KS<JRBPW@HW?HRDIU@EN9;D*(/<=@HDF>JTV^h?IM9EGQZY6>APY]KSYR`VJR]EJ[^fd巒抑殱鱶瑜縣蜒帷穹蜒帷穹艨壼瞑艪壼瞑蛯刮睹蛯刪痂蛯刮睹蛯刮睹$@Q$<M+?N&7D)6E2>J7?L/;D,=H/@M3CT0=T-<O5DT3>J7AI+:B/=H,8F,9I1>O3?M.<H+:B-:I+<I)8I0AQ,;K.:I*7$-7(9K6FS+9E#.5+2*2%08$0;$4<&5=':B,=E*=H6HS8MW<O\7LV8MX0EP5GR2DO0CN3CO4DP3MT/HP8NV?T\"1: *&0!(2'4)50=I%.7)2<%.8-2>29B'-63;E2>J-;G@P\<LY7EO0AH9@IGNX5@G(2;KV\JT[MT[DHO>IQ>KP>IO:EL3<C5<@:@F=DIAIOMW^NZ`HTXNZ_HTYBOPIPT3GGL\YFPKQUO蜃溪瞰邃嘯縟聰怕瞰聰怏瞰萵恚疱諱恁痍諠穉裔穡蛛吝瞋聳嚆瀲+BR*@O4DT)6D+6D.9G+7C,7C5EQ'9E.>O-:Q0?R5DT3AM/<D1AJ3AN5AP.;K6CS4AO0>J-<D/:G(5D(9F/>N3DP(6B(1;!-4*:L.?K'5A!,3)1!,4%08'3=%0;,8B%4=1>K5ER6HS5ES8KX3EP8JU+=H0CM9IU.>J7GS3CO2IP5HP6IQAR\0@H,8B*4>6?I.=I'3?2>J(2<%/9 )"..6>#,!++7C3@L<MYEVb(7@"39(1;",61=G8EM&.#+"(*28ALTCPV?IPDLS5=D>DI.49?BG<DKISZHTZAMQJVZT`dIVXFNRN][HUUNVSab^闌繞窈聽怺袮珮帋穽窿怩穽竅怎瞰聰怕瞰籬噪疵瘁嘯獗矗宸獗矗宦炙0BM1AL7ER)4B.9G-7H(5E.-8-=,<M,;N*9M,;K*6$.'0 ,-%2B5BR)6D!/;.6+3=!.:&5@5BP7EQ+7A$,5'18*;L6FS-;G!,3)1!,4(3;$0:-6@'0: ,9#/+8D7HU1AN9JW2AM(8D/?K(9E1>J>LX1?K@NZ5CL;JS=MUEPZ?KU/;E1:D9BL/>J,7C6BO+5>%/9"+5(-9+2;*1:(1;(4@0>J:JV:KW>MV5EL:FR8DP8FS<KT5DM@LWAMT,4>,8@&07)3:,4;"*2-380386:?DLSHRYAMT6BF.:>+7;5BC=FIANNX``LQQPQM湾楳獪蒹栫瀾氓巒瞞氓巒瞞珥巫瞞烽巫瞞槲怡獰烙憚獨毯斈炙珎宦獨5DM6AM=FS,5C/7E-7I/:L"0C&2@,<L*;L*:K+;L3AQ-9/>F(7@-9-9H'3D.;K&2@"/;%.&-!+5&2>3?J ,!+"+$*(9J*;G%1 *2$, '/$0;"'5&/<'3%2A:FT7GT'7C!-%5A#/-9#1=$0*6B!- +5 * *#-+5.:D,9C5AK4CO)5A6BN4=G&0:$-7(.9*1:.4=*3=(4@0>J5EQ@P\@OX=NT:GV@NZ;KW9IU9IV>NWFR\8CM:CL;EL4?F8@G-2:3:?8<A<?D<DKISZMZ`HTXEQUEQU>KMBKN@GJ?DEHMLTXW窿氈渣聹桷籔珥巫瞞珥巫瞞珥巛瞞珥巛瞠槹昊獰滿恠獨瘁孺灑痼吭疵2>H'2>&/<+4B2;I6@Q.<O*:K,:J.;K-;M-=N,<L4DT-=J-:F,=F-=I*;H(7G5DT6FS'7C&8A*5<&/9#/;/;G.:F)3<$-")/&7I*;G!/;&-!)&.(3;,6"*8(1>'0<)3B%3@7DR<LX4CT.>J0@L2?K-;G0?K2>J1=I6BN4@J.:D7BM8DN6BL($.1=G&5A)4@6BN7@J%/9#,6-3>+2;-4=/7A(4@/=I7HT?O\IXaCTZ?KZAR^<KWAT_8GTFU^COZ>HS;CM<GN>EL=FM06><?D7;@CEJ9AHKU\MY_NZ^LX\MY]KWYHQTUZ]PUVKPOOTR腕類瞽繞槧瞶蜃桷瞰炮刄疼玻壺籔瘁斈榻玳壜渙舮掾猾珎處敲痾昧簪"0< .9.9F*5C!,:+9I/>O.>N3<N1>N.>M-=M+;K2CO+;H.>K4EM.>K3CP,;L2AQ9IV*:F,=F4=G*7C&4@4AO7EQ-8B#+4",3+<M)9F(6B *2!,4)1(3;$0:,4A)1>%0?+8F,8F5FR<K\8HX7GS7GS4DP5FR7EQ6DP7DP<IV8GO:IR9HQ?IT9EO*4",6+4>!-$0+7C"+ *4&0)/:+2;.5>.7@(4@-;G:KWDTa(7@"28)5+77GTEV_+=F+:C:GO)4<'0:)18.6=.4;#*126:,/41389AHCMT:FL0<@-9=.:>3@B*46;>B:?@=ACIRQ憚榴湶桎掉炒聰昊榑珈寃獰嶢輔聟毳寃籐籵巛槃矍壤湲框昧耻Д3CS+;K/?O&3A/<J2?M1AL/AL3=O3?Q1@P-=M/@L4ER,=J2BN0AJ-=I1AN*9I4CS:KW.>J->F/:G.;J'8E0?P8IU+9E%.8)1+<M/?L5CO*1 +3)1$/7#/:'3?)4C'4B)5C&7C2BS9IY1ET7IS;MX8JU4FQ8HT8HT6FR>NZ1GN;MU8LS=NX;JS0;F&/9;EN)7D&2>:GS0:C%/(!&2(/8(.71:D/;G*8D>NZBR_?MV<MTBLW;KSAPYGZa8IO5AJ>JP7BH8?H:BI:BI8>E(+326;/271386>EHRYKW]JVZ@LPAMRJVX>HKIKOHLM?IINYW仔綻搬俔簒殷忝宸聳噐嘲繃怡彁村恠慱殷桀嘸炬毯掖搜粳籀痣2EW4EW8GX&6C)5D.=H0AM,>F37M4=P1@P/AM0AM8IV,=J.=N,>F.>K.>K(7H6FV5FS-=J&8@+8G):G$3D/@Q6EV+8F'4@'2*<M1AN3AN)0'/)1%08'4>#1A$1@$6C'8E):K1AR3GV5GW9NY:OZ6KV:MX5HS5HS1AM:JW5OV3LT4JR7KS;JT1=G%0:4=G6ER*5B6BN2<F)3(2(-9$+4%$-7+7C*8D:JVBR_HV_DT[GS[FRZ?PW@PW>NTBPVKV\?IO;AK;CJ7<C@FM.1:15:58=79>4<CBLSERXHTXHTXFRVJVXFOSNSULSV=GGANLwzА疾惨捷廃yoxt~夙蛭沼静壁凉vvdx|*KS2QY0GR-?J.<H.:F7?L3;H1AI6FN7GT3BS/?Q3BR4@Q1>L-<D/>F4BN)6D0<J;IT1@H,:C4?I/;E+9E4BM8FR2>G+6=&06,9F7DQ:DK$.4#*1%,3*3<)2<06>/8@-7@*6?.<H2BM8IV8LY<JRAOX>LU=GR<GQ@KU@LVCLVEOWDMU:DK:DL2=D.4=04=?>H5BL%2;5AK5?I&/8"+4&-5%,5$-6,5?,4A-9E@MYBR^EV_9MTBRYGW^=MTAQX>NU>OVEV]:LS5?F=GN3<CGLT,3758=26;:=A6;BHOWJUXHTXJVZFTUDPR/=>=@E9@B;CGFQRizwaupn~b{rl^uid}|[rp[ljcqk}}m|cvw^uvtw|.JT1JT2FQ/?K1@K4@L -8*"+,9/?L,<L4DT7FV&3C)7.7!09#1=,:9FT4BN'6>-6"-&0%4@5CN'5A)"*!(#4B0>J#,6'0%+$.%.7#,6'2(0:*3&3$2>6FR3DQ)=K,4!* /8$-!,6*5)3'1%/",&0$/+7B%/#03> )&02>H*3>'/$-6%+4&,5"+4(1;*3@/;G3AM@Q]CT]6JQ&6=-4,<CHX_2BI-=D3CJ1BI'1)3:%-419A!&*.3$(-,059?FGOV2;C+7;/;?/;@;GI9FHJPT?DI>IMIVXCQSbwt\sp_tsUthp`|rczucvt[libpn}yz{n4JV8KX<LY1>L+6D5?M(4C!-<,<D*:F2CP/>N-<M1AQ"3?"/=,4$1'5@$1?1>L,;F(5$3<(3=-;H"0<.?L1>J*5?(/ &&7E-;G%/"+
$(1&0)*4=&.<"-,9E:JV2CP(8F$5==NW$5>3AJ/>G.>G2=G'2<3CL-<E2CL3DM9HP/;E#,6;?J$4A#,/<E(2$.$(1"(1$!*4(1>'3?1?K=MZ8HQ(;B7FM?OVGW^BRYBRY=MT/?F0AH4=F@IR5=D@HO(-5.59,/41498=DFNUFPX?KN>NPAMQBNR<IJBJQ<FM<GM;IOy~|x]tpv^wlUja\nfdvr_jnt`m{sxwfw[j~m}^l.>K.>K5BP/9G/:H0=K.?L(9E.;H1AM3DP,@O+>M7GW/?L+9D1@H)7C+7F"/=1=K7DR2@L-<D,8A+9E"3@2BO9IV1?K(1;(/,=K9FR7CM)1 *$-(1;!,5(1?*2@(5@)8C,=H3CO:KX9JW2EL5EN6GP5FP5CLN\eKZcN]f?PY7JR7IQ7JR7HR0?H&2<5?I4BO"/+7C;GQ!+#.!*3&/#,5'0:*3@&2>2@LAQ^EV_BU\BRY@PW?OVAQX@PWAQXCSZCT[2>EAJS+5>DLS05<+1947<48<1:@@JQEQWESZFVXBRUAMQ<GK?IPAMR1>F>MVvwlrcvz^qnXkbRdV\naycqxwcp~zv{}fwhwdq(7D*71>K1<J"/=3@N4DQ,=J2BN3BP1@Q+>M(;J7GT8HT)9F.>J-=I.>K&5E4CS7GT3DO,<I0>K/=I(8E4DP8HU8FR(4>(0(:G3DQ7CL&18"+ )1%0:'0>'2@+6D*8F0<J,=J<KY:LW>P[8KS8KS9LT9LT6GP5FO:KT>LU5IQ9LT8NU9NV7KR5FO+53<E5CO!/;+:F8DQ",!+6"+5$-7'08&/9'0=(4@-;G?O[CT]>RYJY`GW^=MTAQX?OVHX_AQXGW^/:BDOW6>H@IR-6<16=/6=45>/6??HQIU[GU[DRXBRTEQU=IM=JP=IN6BJ<KT`p}euN]nQdw:JPWfiVf^M^Q`ndhtsirWfobt|Xht\mzOancrJYbJW_-@O1@P5DT-<L.;K1@Q1AR-AP0@M3EQ*=L)<K)<K4GT9KV,=F3CP4DQ4DQ)8H7EV8HT2BO.>J3@L->K$4A-=M<MY7EQ*6@!,3,=N4DQ6DP%/9'.",6)3<*2?)7H+8I,9F->K0@M9IV<NY;MX;QX6LT:MU=OW:NU;LU=NW<MV;MY<MY;OZ<Q\:LW4EQ*6/7E/@M!.:+9E7CO(5",6!,6"+5)2;&/9&/<'3?*8DAQ^BS\-AH$4;(/ 07AQX<LS&6=(8?$5<+4?BLV2;CBLT28B-5<06=4:A39B>GPLV_ESXCTZCQWCQX?JN=JP9EK6CK;FP;IVUfs[kxSbtcv}kz}bnn{qw_otvarzpbs|ex~lzbrt2IX0ET6IX-<M,;K1AQ3CS+>M.>K8HX2ET+>M)<K2ER9KV+<E3CO6FS6EU)8H3BR8GW3CP2BN6DP1BO)8I2BR6EU6BP-9B"+5/@Q4DQ9GS)2<$.#-7'0>'4?)9I+:J,;K/?K,<I4DQ7JU:LW5JR9NV<QY9OW<NVAT\EX`?RZ;JW9KV9KV;MX9LW8FR!.94<I1BO$5B/<H7EQ(5!+4#-7",6)1:&/8%.;%1<.<HCS_AQZ&9@5EL:JQ?OVBRYEU\<LS@PWCTZ3<FEOY1;EDNW07@18A39?27>1:C=FOHU]BSZFV\CSYESY@LR>GOBKS3?ELW_ERZ>ITM]fZiraqwグxz{~{^mvFVbn~x{DPV0M[0LZ7M]1EU0AQ2BR4DT.AO0?L4CT2ET*>P+AP4HT;OU,=E3CO3CP5CT+:J2AQ:IY2CO/?K8FR3CP(8I1AQ9IY7HT2>J)3/@Q1AN:HT(4>$.%.8(0>(5@(5J+9L-<L0?O6FR9IV5DP;LX5MU9MU:PX:OW@V^AS[AT\?RYBQ^=LY:LX<NY9HU6DQ"*82:G3DQ&7D.:I2AM"/;"+9#-7 *5(19*3<*3A%2>(7C?O\HYb:NUBRYEU\CRY;KRFV]IX_:JQGW^1=H>HR.8CAIS09C.5>04>49@/8A>IQER[FW^DTZBRXDRX?JQ@KN=HK<FM7CI:FLAOVSagVbirK^epyccstp~lhrvyxcn~wzsqgoz~?O\?NZ7FR1?K1>K2AQ/?P.?S/CO.AN3FU.>O*:K5EU9JX0@M2BO4DQ4DQ-=J2BO8IU5ER0@N4BN0@M"2?1AR8HT6DP.:C",6+<I:JV4EM(7@%/%2<'/=.6E*:A+9E,<I/>N.=N:JW8KV9MT7JR;NV<OWCU]>QYBU]<OWAT\=QXBU];NU;NV=QX3BJ(2/8A.<I+9E0<H8DN&0:$/8&/9&.7$0;)2<+5?.8A+4>=LUDU^>RZ>PWDV]CV]@RYEX_FX_ASZEY`9EK<HN2<C?IP.6=6;B06=4:A7;D;BILX^KX^EU[?SVARU6HJ?HS:EN7AIGPTCLOGSTT`dQac7JRJ[bS_e[gjo{~■絢|Xqvtr}lmZovo|/>O8IV<LY0>J8ES4CS/?P.?R3FR2ER6IX0@Q,<M4DT8IV-=J2BO3CP4DQ-=J0@M5ER0@M.>K/=I2BO 0=1AR?O\7DP0<E"+5+<J9IU3EM+:C%/#/9&.<,5C,<D,:F*:G,:K/>N9IU;MX>RY:MU9LT8KS7JR@S[@S[>QYCV^=PX>QY=PX:MU:MU2AJ ,61;D;JV*8D6BN8DN*4>",6%.8&/8%1;)2<+5?,6@7@JAPYGXa-@H7GM2AH+;B1AHCSZ#3:$4;%5<)/4AG09@@KQ08?.7>27>39@9>G:BIIU[ESYCSZCSVBSV9JM<IQ;GM:EI?HL:ED?HKNZ\OZ^5HO8FM[gk_kmZeikv}tx_u{n~r}tuct}x':H%5E$1!2=$1,;K1AR0AU1DQ3FS4GV.>O.>O7GW9KW.>K4DQ6FS7GT0@M/?L9IV6FS-=J1?K-=J#3@/?P7GT8FR0;E!+50AN9IU5FO0?H&0!.7&/<,5C+;C,:F):G-;L,;K3CP7IT:MU8KS9LT=PX?RZ9LT=PX@S[CV^AT\?RZ=PX8KS<PX4CL$0:09C4CO-;G/;G:FP,6@!+5%.8$-6%1<)3=*4>,6@3<F>NW>OX!5=)9@%5<-=DAQXAQX4DK>NU?OV9DJBNT2?DBLS29@/8?27>5;B3:D6=DHTZESY@QW@QTCQT6EHETZ<HL6CEAIIbjj^gfV\_NVY?MTT`d\ijJVXFRUixi|U\i}o~u_o|PZd,?Q*=K5FS,<I-=J.>J3CS3EV3FS6IV3FU.>O,<M5EU9JW.=J1AN4DQ6FS.>K4DQ8HU4DQ/?L2@L3CQ%5B1ARIYf/=I3>H!*42CP6FR0AJ-<E)3#/9&/<.6E'7?*8D*:G0?O2AQ5ER:LW:MT<OW;NV@S[=PX9LT@S[EX`?RZ>QYBU]=PX?RZ:NU4CL&2<1;D4BO/=I2=J7DM/8B$.8)2<$-6*6@+5?-7A-7A5>H<LUCT];OWAQX<LSAQX:JQGW^AQXEU\DT[6DJ<JP2>DBKR+5<19@*3:4:A29B0:AFRX@NTFSZDTVBRT8CGFVXBMR2?A=FEMQRBGG:AD9>CCOSP\^forIUWKV\嗣殻甌惜yfm|t|t{lz\er4K[1FT:NZ.?L.>K3CO1AQ4CU/BO3FS6IX/?P*:K4DT6HT1AN1AN3CP7GT0@M0@M8HU7GT/?L2@L4ER3CP+;L3CP4BN3?I)3=->K<LX7HP,;D ,6+5)2?.6E-=E-:G+<H,;K0?O8HT9KV<OV9LT<OW<OWBU]<OW?RZ;NVBU];NVAT\<OW;NV>QY4CL*6@09C6EQ3BN+7C<HR3=G#-7)1<&/8#/:-7A.8B-7A09D<LTGXaAU]DU[DT[@QX<MSBRYFW^P`gFW^;IO1@F3>DFRX-8?,3:.6=-6<3:C.8?EQV@OU>MSCNRFRV6@E@PSIVX0<>>FECLKGMP',1/7>?JNEQRNWZ?KM>KR\mx]t[t_t@O_LVgwxr2J]4L\>P`/@M5EQ5ER2BS5EU2ER3FS1DS-=N)9J5EU7IU2AN3CP2BO4DQ.>K3CP9IV7GT.>K=KW.?L"2?3CS1AN1?K3?H,5?,=K9IU6GP-<E'1!-73;I(1?"2:9FS*:G,;K.=M5ER:LW<OV8KS<OW>QY?RZ=PX=PX<OWDW_?RZ>QY:MU?RZ:MU6EN-9C,6?4CO2@L*6B?KU7AK!+5*3=)1:)5@.8B-7A.8B3<F7FOEV_=QYKW_ANV4AI#081>F>KS(0 )&4:0>D7EK:FL/9@&18+3:/7>18A.8?COU>JP>MS@LP>JN4<@AMQIUY1>?:BF<EH>ILhtzx>IPDPTN[\?KM8GJ4GNpnhЧ0HZ4JZ<Q`2CP4DP4DQ1BO5DU5HU5HU3FU/?P'7H5EU:KX5DQ4DQ3CP6FS/?L4DQ9IV;KX/?L3@L/?MYiv6FV8HT5CN5AJ,6@+<J6FR6GP-<E%1;'4='/=19HP`h(6B0AN1@P.=N6FS=P[<OW8KS:MU<OW=PX8KS=PX>QY>QY:MU<OW=PX>QY>RY6DM0<F09C6DQ5CO)4A<HR8AK!+5&/9&/8(4>-7A,6@-7A/8B4CL;LUBV^$19$19.;C1>F8EM@MU5BJ;HP8IO:HN.<B<HN4AG-7>*5<+3:07@,6=BNT?KQDPVALP:BF5>A;HMGQY1<@=HL;GKCOWGXa2DP9IPCQXIUY=JLFUX;LS|}rヲ_vhzj^z]{]u\p2M_+FV8M]/AN/AL4DO4ER:JW3ES3FS4GW0?Q*:L8HX:KX3BO/@M2BO7GT.?K0@L6GS;KX-=J8EP9IVDSd7ES6CO5AJ/9B.?M6FR8IR/>G#/8&3<3:GmsSbkAN[*:H0?O-<M3CP:MX5HP>QY9LT>QY?RZ=PX<OW>QY=PXARZ;NV:NU:NV:NU:GP5?J-5?4BO7ER)5B:FO>GQ*4>&/9)1:%1</9C-9B+7@/8B.<E<MV=RZCNX<HQDQYAMU:GN8EM&3<=ISCRX>NU7EK;FL;GM;EL:DK6>D6<F+4<?KQ=IPCPW?KO4>A9?C>GQ?IPHRYMV]KY_<PV@S_(AN4FP<MTHSZS^bFUWBU[OcoPitBcKeTlPjGj~LpLiTj4EP6EQ4DP/<J/<0AM8KW.DP2JV)?K9LX1BN(9F6GT7JW.AN/;J6CQ4DQ*9J1@P3AS0@Q1AR0CTMbqB^g2LU/AL:AO03C.=H9KV7JR0?H)/='-="2CMejH]e/AL.<M1>N7DR>LX?PY9MU>QY?RZ>QY:MU?RZ?RZ>PX3SW>RZBN[BNZ7IWs*AH"1:6BJ;HP.;C7GP5FN2>H1;E.7B$5>,5>43B12A0<H$6A/ALHSa=TT>RW>PWAS\*:C(6<>HMJWT>RW9MR6FL5FL8GM:GL?IP=GN9HK7FI;GK>IM@HLINS:@E=?D4AG?KQANTFPXCMT=GNBIP@FM7BH?JPGV\FTZJV_HX_JZ`P`fN]hO^jM\hO^jM\hL[gM\hN^j*<I 3@%6C.>K.>J3CS6JX=Ra*BNG]i5HU<LY):G6GT5IV.AN0<J4AO2BO+:K0?O1>Q8IZ2AS/CUt;V`9R\4EP6BN07F0?K8JV7JR2@I.4B2;IBRcごOfkEYaEWb1AN5AO;GV<MY=NW;NV=PX?RZ>QY:MU>QY>QY>PX3SW9NVAMYAP^TnwEYd!3;5AH;HP4AI7GP7CM4AK8BL8AK-AH1<D58C38B(6Bj~?N\>RW:OSASZ?PY?MW@PV:LOERT@TY<OT9IO9JP<JP=IO>HO=FN<KN8HK:FK:EI9DH9CF39>;@E@LP=IMDOS>IMBMQ>JM<GK7BF:FJ;GKCQWGU\JX^GW\EU\GW^EU^FV_EU^HW`HXaHW`HXaIYb4LX,BN8KZ/?O-=M4DT5GX5IZ~Lbn?Q^6GT*;H6GT7JW1DQ1=K4AO1BO-=J,:K4CS/@O/?O*>PЬ{8S]?U`7IT4?K27G5CO6JQ7JR4BK09F5=KScsqLglH_fCT_+;I1=L8FQ;LU:KT<PW9LT9LT>QY;NV>QY=PX=PX7RX<QY>MZ*:GlI`j>MZ1?H:IR8GP5@J8DN7CM;GRAIT0FJ:HN>GP<EO
*詰uASeAUY?PXBU[@PZDV]=PU@SVCVX=QVAUZ?OU=KQ>MS@LR=JPBJR=LN8HJ8CG4AD0;>+7:6?B=FJ6<ABGL/9<ENR=HL3=A?KO;FJ>JNAMQGVYFUWIW]JZ`HX^HX^P[cR]eS^fVahU`hWbjYdkYdl:T`5K[4JY1CT5GX<M`8H[;PaH^j>Q^/@M%6D3DQ6IV2ER1=K3@N1AN-=J.>K9IV7GW/?P,AWTlx<R\:LW5CO8@M4FN5IP4IR1BK;BO7AO}WpyI_jEYd>MY(8D4CP;LU;LU;NV<OW=PX;NV=PX=PX;NV<OW9U[>PX2AMFXh洩yCXgL[h6JP5FO9HQ;GQ8EO=GO>KS?KT6ML:LNBLTAOWJcn以iDWnDU[ASZ?QW>QX@SZ@TY?TY@UZHX^EU[?PUGU[APU@LQ7CI7CI?MS=KQ?NS@KQ:FL.:@8AI#.58<@>BF9>CAJMDOS;GJ@OR@OQFRVEPUJY[JY\HV\BRXIY^Ufl_hq`ir^gp`hqajsbjt`hr^gp0KWKdp1GV-AO1CT0AT1DZGZosRgr7KV6HS+=H1CN5IT/CN.:I5BP4DQ2BO1AO8HU3DQ3DQ1I`Nfq=S^:LW.;H9DP,=F6HQ2IN7HQ?JV,8IUtF]hG]hDXc9KW*;C3DM=NW6IQ8KS<OW;NV<OW;NV=PX<OW>QY8QW>PX>N\Ym|仰tH_oETdH\g1CO:HQ:EP>IQ>IQ<IR>KQ9PP;MOBMU=NYi袷q@UnCV]BU]BS\FX^BT[CV]>PWI]cEV]HY`IV^IV^ANVCPXGT]KX`NZcVckUbjTbjWdlCPXLW_S_g\]fX^dPX_XbiS_eP^dP]cL\cQ]aUadTchYgmWejXhoXio\mt_jq`ksbmtcnualtbmt`ks^iq義3GS4ER1AQ4DU7H[3I[|Lbm>R]<NY4FQ3EP5IT4HS)5C1>L1AN2BO6FR>NZ6HS3EPOh案qNet?S]BT_7GS8FR5HN4KQ2HN4GO7DQO^noIaqAXgEXcDW_(9B5EN:MU;NV<OW=PX<OWAT\;NV<OW;NV?RZ7NS<OV>N[mOgyt_z:NY:JW@KUALT?IR=LQ?OU?SUAQW<LR7JUコ俜eBVn>OY@R^EV_BT\FW]CPY-4IV`=JRCPXERZFS[KX`MZbR_gUbjScjRbiPagT`hUbjZgnZgoWdl\enYaj]enWaiZgoZfnWgnVfm\go\goXemYgn\gq\ks\ks]mubmw`lv]irZeo]isalv]hrVak_qx0?HDR_8IV0@P.BS6L^核Ndo=P[8JU5GR6HS7KV2FQ0<M5BP0AN3CP3CO=LY8KS8KS罫wBYhK]jI[eCR_.>J:LR2IN.GM5GO)9Feue]uD[jGZeGZb/BH:MT6IQ9LT;NV=PX<OW=PX;NV<OW;NV>QY;PX=NZ(;G衝~m。Havp>T_5ER>GQDMVBNSCQWFV\ARWERZCMW6JU柿rBWm:MZ?Q\8IRARXHUZXaj
+bepSaiYfnYfn[hpWdlZgo\iq]iqYhrWfoYhq[ktUdm[jsZir[js[jr]ktZjrZirZir[js[js]lu\fo^hr]ir_kw^jv\kv\iwYftWgsQamO_kRbnM]iM]iM]iN^jgsy=IQDOY:HT6FS4IX/HX〆BWc6JU8JU:LW7IT6KV4IS0<M8DR0@M7FS8HT(9ANahtWsOhzNdsL`lrz{Ν揃鍍サk[qAXhF\fO`gI[a@RX%7>&;B(9A)<C-@G5HO7JP?QX@RYBRZ<QX1@Ks各kTl5NZ<LX@ITAISALR>KR9LM@MVAITHQ^1CO火澗`}BWj@QaNbmYjsYhm]gmbjr41@gu|gt|cpxanvcpxamvZkqSdkZhpWfn[irZhq]ktXiqWhq[ltZlxYlvaq}`p|^o{ao{_ny^lxem{fm{amxbl{_hv\huZeuR]nL_lL_lL_lL_lJ^kI\iG[hFYgOjp2IN;LU8FR6FS3HW/JZv>V\8MU3HP7IT4ER1AN1AN18;MX]ozeykj}h~PfsE]iG\gJ[eO_l^n~rwOfvI`pG^n{Σ^δ勸累UrvGam>LT?HPESXAQWHV[HSY[ggO^cZp{d~嫁d@Yi7R^FakXkr`pyv,1>kp~3YhpWgo\gr_ls]jqanu_ltbntWkyWkx[o{Xmx[ny^p{]oz\nz[nx^nz`p|aq}dqdqerercrz^nz[jvVgsPcrL`rKcsNfvOeqNepRerWguVfrUeqZgtWfoPjp;PV5HO;KW@P]2ET塞Yqw:PU6KS4IQ:LW5FSN^kbr~t\nyRdoL`kM`mK^k>T`>T`4LX=S_\lyZkx>Raaxt ̄ャШwwh~\sYq~\t呼αゼtyΣ<VbCR^ET\K[d>SZFXcQ]jK\aN`jXq┝iCZi=Vb9P[Ymt`kuYclX`mt{06Ebs_o|_o{_o{`nz^lxao{_lx[kxUfsTenTenSdmTfoTfoZirZjv]mxYiuScpScpYiuZhxVduTfpXhtUhuSfuSftRgxThyThzRhtPcpPdqSepXhuZjv\ktXgp\v|=T[3EP5DQ8HUL`lpG]b7LT5JR6GS9KV8IV8HU:IY7JT9KV>P[<P[ATb5HU9P[8OZ7M]9OZ粧RboBVe9QaRl}s」yynnWptyげ9JWl竿ЮsЮ╋<Vd>MZ\myy屮置夷^tDYh=T`9MXWhqbnxCLWHS\DMZ%,;as^o|]n{Zkx_p}YjwQboYjx]jq]jr^ksbowiv~dqybowhu|evjzjzfw`o[m|TixPetPfuOfuQetNbsOctRduPbsM_qOcnPdoUfr_q}XiqRclRakQ`i^wCYd/DN6HR8IV6GTlH^j>QY9LT5IP6IT5FS8IU8HY:JZ7JT;MW8JU9LY6IV7JV7L[7L[4N]:Q`@S`BUb=Ra7Qasx|ox}kyd}h[v|tDP`AUfせ|だ{zЬそuB\l?Q`Pdu礒呑戸t]qGVg<P]GYdTcl\iq`ksLU`8DNco|_itdoygr|hs}lteq~huivlu|nx~jt{ku}r}vr|oyap[jzSbrM`oK_pKbrIbrHaqGbrF_oGaqKcsMasPctTduTdvPbmYkvfz\mvPajL_fIZ`EU\VnzDZf=P]<MZ:LW4FQ>P[9KV7HQ6GP7GS2BN7HU7GW9IX5EU8JT:KX8IV3FS6IV;M]5JY4IX3K]E^nRhs7MY6K[<Sc<Scayx{{pf~a}fjyt吉mUaq2FXszぜw機系{y泳|AXh:K])=N袷}ЮvlUl~M`oK\iCVcDUc?NWeszgrzZem1=Gkx{x~u{xzw~oxt~s~s}o{lwit}anz[hsTctN`qM^oI\mI_pI`rGbrF`pD_oIasJ`rOcuQds]m~aq~dt\mvZjtVgqN`gL_fIY`FV]BRX]t@Wf8NY7JW9KV5ER7FO7FO<KS7EQ5FR7GU5EQ,<L2BR5EW5FS5FS3DQ3GS3FV5GV2HV5JY+DX=UgPfv@Va6LX:LY7JZ8PcMexyzkqoi]yhzp」O_lAVf3I\^wーwnォ畜稽kAVgGVe8K]tvypGauB[n>VfCYhBTbFWaBWg>Q^>OXiv~v}$/7S_hz{v}wxxn}mziy]lxWgsN`oObpM^oNasJ_rI_qG_pG_sHbuJcwFbvPfxNdwShy[o~`q~euYiu]luK\eJ]dHZaEX_FV\AQWAPWBRXI`pNeu9N^=P]<NY?NW=JR<FN2@M1?K2@L0AN#2B#3C-=N4DU7HU6GT4ER6IX7JY3FU/DU/CT3KbD_l=Ua5LX2ER;LY7N^7M]Ibr{wnqnxqhf}yoZr|>T`?QbQ^u~々}xx}堪否c{IXgETd8KZUp~¨e}L^tCXjEYl=OaG[h@R]DUa=RZAV]8O`8N[=QY[goxjt|":CMclsgsxis{lwiw`o{[kwZjvUhwQcrQftLcrG^pG_sG`sG^uF`pFaqHauIbvIcvKcyMe|Nf}Xi}[n~aqZkxXhu[luN`gK[bL\cFV]M\dGV\CSYDTZ=PS;NQLctAXh=Ra9KXCT^DQYEQXIRZDO[6CO-:F,9G$+;-<M1@R5ER6FS3DQ2FU4GV1DS1DU*=N.E\暇Zu<T`FYd9JU@O\0JV;S_=VgB]nwspuyld~h~UtyLbm@N^NTizЬ|┥}y按~Shw@OaBM[?P]*FQ2O]9Qa<K\AP`>M^BM\ANZ<MU?RY=RZ<QW6Ra9R^@RYCRXq{tyqv|gkoVdoTdpTdoK]kM`qJ`rI]sD\qI`oF`oE]nF^rE`tD`y=]tFeDcuHcwJexKg{TlUmUnVolw]i}_nWguM^hEW^GW]DUWDS[HX_>NTCTYCSYASU;OR@SVfD_h6P\6P\5O[>YgB]kHcqTjtATaqo~ytrxE撻置Vm|BXdATa?Rb8KZ>TXBZcF\i?ZjF`tkpmwsjg}7MY=P_.BSxy{dFX^>QY@R]=OZ7HU=NZ9IY;K[;J[<MZ9JW:KX=N[<NY;MX<MX4IY3K[5M`/J[Gcx>ZoA]rB^q9Xr>Yt>XqBZsF^tBZqC[qF`sM_tK_tG_rB_tFcwFbzMgSiNkYtLg}^yWqWo~WlxLanHfkQjoEX_IY`IU]GW^ASZBT[=VV?TV>NTDOWEPXDOUCQT>OR_xPiu7Q]4N\5O]:TbE^nOhxVm|F\gI[h@Rb;N]DXXCV[K^fNaoVi|F`pv。}|zoqv┫刎廓XpxC[g@Ud9M^tx{dUpF]q?YjBT[BU]>P\:LW;LZ8JV:JZ9IZ4EQ6GT8IV<LZ8JU;MX=OZ:LW;LV<MU9LZ3HWJaqD[nC]mD]qA\qC^sD_tH_uBYpIbuJbuA]pKbzLe}Kf~MlHg~KkVp]t[w`xIcwpごjKamNbnG`fI`eFX_GW^CPXAQW@SY=PW=STAUY>NUBMUFPXAMS?NQ=OPlSm{6P^2K[5O^:ScC[mLdulv「~~mql}{局vk?Sb@Ud@Ud=PbKZ^N]dTemZlvK^kYo{Umyw~z{_{?Ye>Tc.EUw`yk;Sf@Wg>Vf0EU<S^5HV<NY;MX<NY=OZ8HV:KX3DQ5FS:KX8IV9JW8IV9KV6HS;LX:LY@KN@NT>NT9KUThwLcuGbuKfzMgzLezHeyEauLh{Kf~Hg}Gf|IfKlNoSuKkPoSpOkjy}patI]hN_kCV^CT^BQZ@OX?NW?NW>OX:MU9MS@QZ>NV@LVAMW=KQ?MP=OPzXq5N^6N`1I[;SeAYmH`tizXsuァgWuq〆{|r}n<RaE[j=Tc@WhL_hSeqXm{`sΟΨ夏位紂述 ̄c>Xf5Q^9Rb>Uem?TfBUl:P^>Td?R_BVc9KU>P[5GR:IV<NY7IT4FQ+=H$28IV1BO8IV7IV5FS9JW6HS9KV9KW>QY8LT?MN@OU;MS7JUE^mJg{MjJhPmPrXzVzTxJoVzlzス{。]qUgyPdsL]jHYf=OZBU`AR[DU^>LV?MVAPY?PZ;KU<MV>MVAQY;IU>IVBNXAOUBSV@RSr_w5M_/GY1I[7OcC[oNfzrvwbIe~=\u6Tp=^{Xwclk}Ь肯|pC]k;Uc:Sc<Ud>WkE]qC^r}曩嬬営}VsB`o<Vf6O_4L\AUg<K\6FX9LV<NY9KV;KW=MY8IQ6GO6HP@P^3CP4DQ(5,89IU7GS4DP6FS9IT8HT9IU8HU:KT;LU:KT7IQ=OW6JT5LZ]x{{}ζ~{顧エ遮j`}hc~JduRetI\lHYfDTbCT`CUa?RZ>OX>OV>PX4GNASZ7JQ:LSASZ>QXCQY;GQ7FOBQZ@NX@PV?PS=OPd}>Wg0HZ2J\7OaBZoNfznumXs9Ti5Qj$A]"@]">RJh}squwVpIcs<Vf6O`4Pa9Yo@`wIgmr{xy営u[t@Zj6P`4N^3IX9KZ4DT:IZ9IT;KW:JV8HT7FR7GS7GS7GS5ER5EQp+!1=7GS1AM1@M2BN9IU9IU:JW9JR;LU<MV<LU2IU7NY5KV2IX9Titrtyzなy╂ZzTpLdzQiyF[kAWc=TaCTaCT`BT_?Q]?RY<OW>PY>PX:RW5MR5MQ6OS4JO;OT9LR;LR<HMBQT>MT9KS=OV<OTASU>OS|kD]m3L\4M]7OaBZlOgynxs\uIct-H\,Gb4S4GX,CSz}c~Jdt;Ue6Sb3O`7Ug@_rIf|Lh∈vqWn>Vh<Wf2L\2M[6LX8HU8HU7HU7IU:JW9JV4ER5FS6GT6GS7FV8GWJZgRbo1AM:JW=NV3EM;KW9IU;KW6GP=NW;KU8JQ7IP6IQ7KR9LS;NV-BQHdxIeDhDdGkCjBiFoFhHdKa~E`pLdtNetPanJZhHXeDW_BU]?RZ>RY<OW>PX:OW8MU=SY9NTEdcDdc8WV+JI1MM2KK=OP:ILCQMDRP9KL@SV=QV>RV>NT=LO{s=We7O_6O_7P`B[kPhzqziXn}=Wd0IZ,G_8T7EO/AN{zШu[y9Vd7Tc2Pa;V`A[iLeuTmzup|yh|<Qc=Wf4O_0KY1GS9KU<KW<MZ4CT3GV2ET4GW2FU3EW4GY2AR8GX0@M5ER5EQ8HU6GP3DM6ER4CP9HU<MV:JT8IS7JQ6IQ>PP:IK=KHBNO=MR6J[2Kd3Qq8Sx8Vw4Uu2Vo9\uMj[p]l~QhtJ\gQ_kJV_T\fO\cDSZ=OU=PX:MU2IP;QX7NT7MT9MT#5>UuuCgfMqpRrsPmnF[].15>CMXPLYUburF[\DY^ATZ?NUN[bse7Sd0JZ3L\6Pa@YmMh|x}}\w7Wj3Sf.F\'5O;R[7M_rαⅨ~k^y<Wl5Sh3Rg3Wd<^mFbsQj~ku|{{~xsxe=Wg<Ue6M]1EV3DV5EV7EZ3HR5JT5JT4GU5FS6GT/@M5FT6GO6GP6GP4EN:IR>MV6EN8GP7KS5HO9LS5IM6JO9JL<MP<JM:KN<MO=MS;LS4CKES_M[gKVd<P]CVcOcnWht_pxUfoYioRbhK]iGYdGYdGYdDWb>P[?Q\9KV4HO-;G7CO4@L2BIAWZ40SyqDyk?uf:oaH|jF{iPpPqNmLsU{p.A>{ENQ0BA9SO4OKub?Yj1JZ4M];SeB[pKg{}t」nh4Ue3Sf+CY%3N5LU,BTrq「hJcw?[o>Yn3Pe5Wf@]nHcwTkd|iuvwsvrkIcs:Sc5L\8L]1CT6EV5DV3HR3GR3GR2ES2CP0AN2CP4DR3DM4EN8IR9KT>MV;JS:IR:HR6IP6HO9LS9IP<LR=MTAPS@OR:KM;JQ9HN9IP5DM?MYM[gFR`M_lZkyVhsSfpCR_UfnIYcXhqGYdDVa?Q[?Q\>PZ<NY9KV;MX1EL,:F5BN;CQUaj[mqXsq[{tI|oDvj;pcG|oCxiCxjEzlLrc|hp。e>Xi5N^8Qa;SeB[oLeyslvUq<^m0Qd.DZ 0G/FP2H[┿}|㍉{r_xD]r:Sh7Sd7Vi@^qGbwOf}WotttywЮЯwrRl|:Sc6M]7K\2CT3EV5DV4HR2FQ1FQ4FQ3EP5HS9IU8GT;MT4FM3FM<LS<LS9IP9IP:FN7GN8IO:JQ<IQ;IO>MR>MSCNT;OS;NS7IP9KRL]fJZfO_k`p|]mzTdq[kwUdpOalHYeGZb>RXBS`=N[AR_;LY7HU9JW:KX4FS1AM6EP6>L!+2;EBNRFXWf|xTwJunN|rM}tExnG|rHqKv?pGwCuiq正u尊r庚鳥~fB\m?Xh7P`?WiHauIbvtro[u8Zj5Sf)?V!.EE\f?Ug~qvwシZq>Wh4M]:UkC^sHcxNh}Xsw}vズ~ЮЮ~rUn~<Vf5N^/FV2EW3EV4GV6IV3FT4FQ5GR6HS3CO2BN:KS;NT;MT=MT<LS=NTANV>KS<IQ:GO>KS>KSANV:GPALT<GO>HP2EK9KR:MSFW`N`hRbnP`lO_kP]kKWfJ[fGWcBT^?S^DYc<Q[<MZ;LY7HU6GT6HU:LY2CP8IW1BM2@L<FP"(1;CJHQV(21&&*CA
)&?]Z`}V~wS~wQ~wU|JDxEvMr紺o振}幼5zumBZl?XhCYi@VhMeyc|vs「~\v<Zk2Pa&>R$1IAXb8NaЮt┿}ЦWn~L`o<R^=S_8PhBYpIdyPm^zwwzyt~v\x;Uf6O^1HX3HW4GV2FU6FS6GT6HS6HT5FO5FO3EN4EO;KQAQX:JQ<LSBNV?LT9FN:HP<GO<GOAKS?LT<IP5AI/<D>KR;LUEV_^ow[ltO_kTdpQamO`lKXdIWbBR_@P]?O\>Q^:NZ;N[;KX7GT3DP1AN7GS9IV3CP5FR0=K.:F1;E")35;@JOR"'*"''46-/ $"!=:Xurs~rZ:u^o険M~zgyoNfx?VfAXhF\nf~t~qf=\k/M^(=R!.E1HRAWiЮ}^s3FS7IT3FM9RhE^rIdyPmZyk{{{~|f?Yj2K[6M]3HW1FU4GS4ER6GT7IT6FR8IR1DK6FM;KR;KR=MT7HN?LT>KS<IQ=JS@KS?JR9FN9FN<IQ5AKCR[=LTCRZdt]myuWfs^nzK[gAP]HXdGWcBQ]JZgAQ^:KX:KW8HX9IY:IY7FV8GW6EU2AQ5DT0?O0@P,7H%.='0;%,8>CEJM&)- #(-/527:48;7>A!!"1-&FAcrss「u「^vRiyjpy{x:Zi0N_(=R!-C4>1GY勤yw{ズħnZlyJ\g:KT/AG5K_C[mFavKjSrjruvwl<Xi4N]4M^1GV/EP.EQ9IV7HU<LW8GT5FO>NU9IN=MS<LR<LR9JP@NT=KQ>MS>JP:FL6CL8DM7HO<LSGU_7HQVfr[jwGZdj|CU`PbmDVaAS^GYdAS^7IT7IT9JW4ER6FR6EV9HX8GW5DT7FV3BR8GW5DT5DT2AQ0@P-5F$+:"+5%-+2527:69= #$(-25-25!$) "###$ )>;;<DG"47%9?qojuwezv|k|m:Zi6Rc&<N ,C3<EZmw沌ッc{Wiv?PX+=D*9?8M`6P`Nk|Gh{Uuqy{szs=Yj1K[8Qa5L[4JU0GS8HU2BO9HU5FO&7A<LSBRX4DJ:IO;KQ=KQ>LR9GM9EJ/;A5AG7EJ=MT?OUAR[WgpZlwM_jXjuQaoM]kJ\gFXcAS^>P[:LW<MX;PZ6JU<P]2CO6EU8GW<GY4?Q5DT3BR6EU4CS2AQ2AQ1@P,=L+0D!'7(2$';EH!$$ #+-(*  %&/12!%53,;=..7WLYlqd}rquw|zgjG^m;P^1CP-@M0HXゾsPetAR^:KS:JQ3DR4GVRg|Nfgznv{ζ闇|ズvqe>\o=Wf7Q_;Q]6JU7HS1FQ4HT6KS9KS7IP6FM;IO>IO:PR7LM:MU3EM1AN%7@=KU;KQ?QX:LSWip[msQbkRclVgpPajCV^J]e@S[<OV=OZ@R]7IS:KW4DT;K[:JZ7GW5EU9IY8HX3CS4DT2BR1AQ9HX1@P.=M.>N.;K$/='4#,!&!%/45#"#(' .,,&!"+"O93D($gRQqgj~rjrnwm~v|i^xOhx@WgCWfMap_~azEZi6FSARZ8GP/BM/CRJ_u\tysuw~闇ζЬ~~rズ{:Xk5N^9Tb:O[9MW3GR4FQ7IT9LT9MU6IO9IP<JO;GM9IK<JP1>F:FP1>J@LX?KULWbSfm\nuQcjQcjL]fHYbK\eFW`GZb>QY:MT>P[7IT:LW6GT7HT6FV9IY8HX6FV7GW8HX7GW7GW3CS3CS1AQ3BR/>N,<L3@P,9I$/=%3!*#!"022### 
$3';.(60-#'&|zゾ~{zШu[vrNhy@Xjz6JY9KU4EM5DL6GS,<L8OaЬヾ{扎斧x┰xa:Xk=Wg:Sc;Qa4JU6HV3EP6IP7HQ8GP9HQ:GN;IQ<GO<FM6?H5>G19FAJWZbp\fpfnyNahFX_GY_@QZHYbEV_;LTFUbDW_:MT;MX5GR:LV3CQ3DQ4FR3CT5EU4DT3CS6FV6FV5EU4DT1BR/?O/>N.=M-<L0=M0=M*7H&1?$1%!&)
&((!##% "LFHQMI]]T$) #.'CSL)%}㌢vg嬰rtVlwVhs7GS<JV2CL5FS3EЮЫ紗ζ{|w~aYw6RcA[k9P_:Q`5KW5HO7HQ8GP7CM@LV:EO:FP:EP2<C:FP6BNlvWgqJ\cBT[HYb6GP?QY;KW;KW<KX9MT3EP>P[2DO6GT2CP6GT3EQ3CS3CS4DT7GW4DT5EU3CS->N2AQ.=M0?O.=M.;K+8H2?O#1A"0*& &6<=%%% ebdLNLAIB&!)"&θv{msWssЯlOdoDVa;KW8ER7FO/@N*>Qu、Ю竿訊~ズュシmRq@[l=Vh9Rb:Qa6M]:MS9JS5DM:FP:DM4@L3AM:JV?U\-AL景Т饗mRhsLdkCT]HYb?PY>PX:JW<LX=MY9IU3EP9KV2DN.>L3DQ4ER4ER3CS3CS2BR3CS1AQ4DT6FV4DT/?O1@P2AQ.=M1>N0=M-;K2<M#,>(6"/#-$$)*  %!&XWY@ECCJE87.\RKgXRzjjxtlt{fovya}[tKak;MX9HT8ES4DJ2BO.CTBZqtn|v`~B]n=Wh:Te9Qa1K[4HO6IQ6DM2=J,8D0>JDVa9KXLguwNfr=Va<W^9IR@QZ7HP?O[7GS8HT8HT3CP3EP1CN5FS1BO.?L3DP3CS1AQ5EU3CS3CS1AQ3CS4DT3CS/?O2AQ1AQ0=M/<L0=M/9J+5F$.@!,:&4$. %!!&'  
  475GHF>3/ub]B)%bhqvqvvmpァ}~{ηvδ}|jE\d@RZ:JW6BS9FL/?L/AS0H^すzs{wg<Xh=Yj;Uf8Rc2L^7NU4IQ+<D8COAO[;JWxクRm|lF]mYn}7JW9KV=QX>NX:KT9JS7GS2BN:JU6FS9HV2EO.?L5FS1BO0AM1AQ1AQ1AQ2BR2BR2BR2BR1AQ3CS4DT3CS2AQ0=M0=M/<L0:K1;L)3D(2C#.<)6$."'$), ! !#()
+!" &'%&$$ /(%$OD=ky…歌{と{rog|―wE\dCV]7FT>K[9FM3CP*<M$<RЮ{|srmk>Ym=Yj:Te8Rc6Pb1KQ/FO9IR>KXⅥ}^x[vf}Oct:L]BQbAN\;GSDMW;MV5GO1AM5EQ5EQ5ER9IV3BO1BO/@M3DQ/@L3CS/?O0@P2BR0@P0@P2BR3CS0@P1AQ1AQ1AQ,9I0=M1>N'4D+5F1;L'1B'1C"-;!*7$.$*&+/&*+"'((,-".+%-,#"%$#!!,+'/+*=98%-&
\ No newline at end of file
diff --git a/host_applications/linux/apps/hello_pi/hello_wayland/Makefile b/host_applications/linux/apps/hello_pi/hello_wayland/Makefile
new file mode 100644
index 0000000..c9ddf23
--- /dev/null
+++ b/host_applications/linux/apps/hello_pi/hello_wayland/Makefile
@@ -0,0 +1,5 @@
+OBJS=triangle.o
+BIN=hello_wayland.bin
+LDFLAGS+=-lwayland-client -lwayland-egl
+
+include ../Makefile.include
diff --git a/host_applications/linux/apps/hello_pi/hello_wayland/cube_texture_and_coords.h b/host_applications/linux/apps/hello_pi/hello_wayland/cube_texture_and_coords.h
new file mode 100644
index 0000000..663e23b
--- /dev/null
+++ b/host_applications/linux/apps/hello_pi/hello_wayland/cube_texture_and_coords.h
@@ -0,0 +1,100 @@
+/*
+Copyright (c) 2012, Broadcom Europe Ltd
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ * Neither the name of the copyright holder nor the
+ names of its contributors may be used to endorse or promote products
+ derived from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY
+DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+// Spatial coordinates for the cube
+
+static const GLbyte quadx[6*4*3] = {
+ /* FRONT */
+ -10, -10, 10,
+ 10, -10, 10,
+ -10, 10, 10,
+ 10, 10, 10,
+
+ /* BACK */
+ -10, -10, -10,
+ -10, 10, -10,
+ 10, -10, -10,
+ 10, 10, -10,
+
+ /* LEFT */
+ -10, -10, 10,
+ -10, 10, 10,
+ -10, -10, -10,
+ -10, 10, -10,
+
+ /* RIGHT */
+ 10, -10, -10,
+ 10, 10, -10,
+ 10, -10, 10,
+ 10, 10, 10,
+
+ /* TOP */
+ -10, 10, 10,
+ 10, 10, 10,
+ -10, 10, -10,
+ 10, 10, -10,
+
+ /* BOTTOM */
+ -10, -10, 10,
+ -10, -10, -10,
+ 10, -10, 10,
+ 10, -10, -10,
+};
+
+/** Texture coordinates for the quad. */
+static const GLfloat texCoords[6 * 4 * 2] = {
+ 0.f, 0.f,
+ 1.f, 0.f,
+ 0.f, 1.f,
+ 1.f, 1.f,
+
+ 0.f, 0.f,
+ 1.f, 0.f,
+ 0.f, 1.f,
+ 1.f, 1.f,
+
+ 0.f, 0.f,
+ 1.f, 0.f,
+ 0.f, 1.f,
+ 1.f, 1.f,
+
+ 0.f, 0.f,
+ 1.f, 0.f,
+ 0.f, 1.f,
+ 1.f, 1.f,
+
+ 0.f, 0.f,
+ 1.f, 0.f,
+ 0.f, 1.f,
+ 1.f, 1.f,
+
+ 0.f, 0.f,
+ 1.f, 0.f,
+ 0.f, 1.f,
+ 1.f, 1.f,
+};
+
diff --git a/host_applications/linux/apps/hello_pi/hello_wayland/triangle.c b/host_applications/linux/apps/hello_pi/hello_wayland/triangle.c
new file mode 100644
index 0000000..1a7bfc4
--- /dev/null
+++ b/host_applications/linux/apps/hello_pi/hello_wayland/triangle.c
@@ -0,0 +1,666 @@
+/*
+Copyright (c) 2012, Broadcom Europe Ltd
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ * Neither the name of the copyright holder nor the
+ names of its contributors may be used to endorse or promote products
+ derived from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY
+DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+// A rotating cube rendered with OpenGL|ES. Three images used as textures on the cube faces.
+
+#define _GNU_SOURCE
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <math.h>
+#include <assert.h>
+#include <unistd.h>
+#include <sys/socket.h>
+#include <sys/un.h>
+
+#include <wayland-egl.h>
+#include <wayland-client.h>
+
+#include "GLES/gl.h"
+#include "EGL/egl.h"
+#include "EGL/eglext.h"
+
+#include "cube_texture_and_coords.h"
+
+#define PATH "./"
+
+#define IMAGE_SIZE 128
+
+#ifndef M_PI
+ #define M_PI 3.141592654
+#endif
+
+
+typedef struct
+{
+ uint32_t screen_width;
+ uint32_t screen_height;
+// OpenGL|ES objects
+ EGLDisplay display;
+ EGLSurface surface;
+ EGLContext context;
+ GLuint tex[6];
+// model rotation vector and direction
+ GLfloat rot_angle_x_inc;
+ GLfloat rot_angle_y_inc;
+ GLfloat rot_angle_z_inc;
+// current model rotation angles
+ GLfloat rot_angle_x;
+ GLfloat rot_angle_y;
+ GLfloat rot_angle_z;
+// current distance from camera
+ GLfloat distance;
+ GLfloat distance_inc;
+// pointers to texture buffers
+ char *tex_buf1;
+ char *tex_buf2;
+ char *tex_buf3;
+ struct wl_display *wl_display;
+ struct wl_registry *wl_registry;
+ struct wl_shell *wl_shell;
+ struct wl_shell_surface *wl_shell_surface;
+ struct wl_compositor *wl_compositor;
+ struct wl_surface *wl_surface;
+ struct wl_callback *wl_callback;
+ struct wl_egl_window *wl_egl_window;
+ int needs_update;
+ int ellapsed_frames;
+ int kill_compositor;
+ int single_frame;
+ int terminate_abruptly;
+} CUBE_STATE_T;
+
+static void init_ogl(CUBE_STATE_T *state);
+static void init_model_proj(CUBE_STATE_T *state);
+static void reset_model(CUBE_STATE_T *state);
+static GLfloat inc_and_wrap_angle(GLfloat angle, GLfloat angle_inc);
+static GLfloat inc_and_clip_distance(GLfloat distance, GLfloat distance_inc);
+static void redraw_scene(CUBE_STATE_T *state);
+static void update_model(CUBE_STATE_T *state);
+static void init_textures(CUBE_STATE_T *state);
+static void load_tex_images(CUBE_STATE_T *state);
+static void exit_func(CUBE_STATE_T *state);
+
+static void
+registry_handle_global(void *data, struct wl_registry *registry,
+ uint32_t name, const char *interface, uint32_t version)
+{
+ CUBE_STATE_T *state = data;
+
+ if (strcmp(interface, "wl_compositor") == 0) {
+ state->wl_compositor =
+ wl_registry_bind(registry, name,
+ &wl_compositor_interface, 1);
+ } else if (strcmp(interface, "wl_shell") == 0) {
+ state->wl_shell = wl_registry_bind(registry, name,
+ &wl_shell_interface, 1);
+ }
+}
+
+static void
+registry_handle_global_remove(void *data, struct wl_registry *registry,
+ uint32_t name)
+{
+}
+
+static const struct wl_registry_listener registry_listener = {
+ registry_handle_global,
+ registry_handle_global_remove
+};
+
+/***********************************************************
+ * Name: init_ogl
+ *
+ * Arguments:
+ * CUBE_STATE_T *state - holds OGLES model info
+ *
+ * Description: Sets the display, OpenGL|ES context and screen stuff
+ *
+ * Returns: void
+ *
+ ***********************************************************/
+static void init_ogl(CUBE_STATE_T *state)
+{
+ EGLBoolean result;
+ EGLint num_config;
+
+ static const EGLint attribute_list[] =
+ {
+ EGL_RED_SIZE, 8,
+ EGL_GREEN_SIZE, 8,
+ EGL_BLUE_SIZE, 8,
+ EGL_ALPHA_SIZE, 8,
+ EGL_SURFACE_TYPE, EGL_WINDOW_BIT,
+ EGL_NONE
+ };
+
+ EGLConfig config;
+
+ state->wl_display = wl_display_connect(NULL);
+
+ state->wl_registry = wl_display_get_registry(state->wl_display);
+ wl_registry_add_listener(state->wl_registry, &registry_listener, state);
+
+ wl_display_dispatch(state->wl_display);
+
+ // get an EGL display connection
+ state->display = eglGetDisplay(state->wl_display);
+ assert(state->display!=EGL_NO_DISPLAY);
+
+ // initialize the EGL display connection
+ result = eglInitialize(state->display, NULL, NULL);
+ assert(EGL_FALSE != result);
+
+ // get an appropriate EGL frame buffer configuration
+ result = eglChooseConfig(state->display, attribute_list, &config, 1, &num_config);
+ assert(EGL_FALSE != result);
+
+ // create an EGL rendering context
+ state->context = eglCreateContext(state->display, config, EGL_NO_CONTEXT, NULL);
+ assert(state->context!=EGL_NO_CONTEXT);
+
+ // create an EGL window surface
+ state->screen_width = 1024;
+ state->screen_height = 860;
+
+ state->wl_surface = wl_compositor_create_surface(state->wl_compositor);
+ state->wl_shell_surface = wl_shell_get_shell_surface(state->wl_shell, state->wl_surface);
+
+ wl_shell_surface_set_toplevel(state->wl_shell_surface);
+ wl_shell_surface_set_title(state->wl_shell_surface, "triangle.c");
+
+ state->wl_egl_window = wl_egl_window_create(state->wl_surface, state->screen_width, state->screen_height);
+
+ state->surface = eglCreateWindowSurface( state->display, config, state->wl_egl_window, NULL );
+ assert(state->surface != EGL_NO_SURFACE);
+
+ // connect the context to the surface
+ result = eglMakeCurrent(state->display, state->surface, state->surface, state->context);
+ assert(EGL_FALSE != result);
+
+ // Set background color and clear buffers
+ glClearColor(0.15f, 0.25f, 0.35f, 1.0f);
+
+ // Enable back face culling.
+ glEnable(GL_CULL_FACE);
+
+ glMatrixMode(GL_MODELVIEW);
+}
+
+/***********************************************************
+ * Name: init_model_proj
+ *
+ * Arguments:
+ * CUBE_STATE_T *state - holds OGLES model info
+ *
+ * Description: Sets the OpenGL|ES model to default values
+ *
+ * Returns: void
+ *
+ ***********************************************************/
+static void init_model_proj(CUBE_STATE_T *state)
+{
+ float nearp = 1.0f;
+ float farp = 500.0f;
+ float hht;
+ float hwd;
+
+ glHint( GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST );
+
+ glViewport(0, 0, (GLsizei)state->screen_width, (GLsizei)state->screen_height);
+
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+
+ hht = nearp * (float)tan(45.0 / 2.0 / 180.0 * M_PI);
+ hwd = hht * (float)state->screen_width / (float)state->screen_height;
+
+ glFrustumf(-hwd, hwd, -hht, hht, nearp, farp);
+
+ glEnableClientState( GL_VERTEX_ARRAY );
+ glVertexPointer( 3, GL_BYTE, 0, quadx );
+
+ reset_model(state);
+}
+
+/***********************************************************
+ * Name: reset_model
+ *
+ * Arguments:
+ * CUBE_STATE_T *state - holds OGLES model info
+ *
+ * Description: Resets the Model projection and rotation direction
+ *
+ * Returns: void
+ *
+ ***********************************************************/
+static void reset_model(CUBE_STATE_T *state)
+{
+ // reset model position
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+ glTranslatef(0.f, 0.f, -50.f);
+
+ // reset model rotation
+ state->rot_angle_x = 45.f; state->rot_angle_y = 30.f; state->rot_angle_z = 0.f;
+ state->rot_angle_x_inc = 0.5f; state->rot_angle_y_inc = 0.5f; state->rot_angle_z_inc = 0.f;
+ state->distance = 40.f;
+}
+
+/***********************************************************
+ * Name: update_model
+ *
+ * Arguments:
+ * CUBE_STATE_T *state - holds OGLES model info
+ *
+ * Description: Updates model projection to current position/rotation
+ *
+ * Returns: void
+ *
+ ***********************************************************/
+static void update_model(CUBE_STATE_T *state)
+{
+ // update position
+ state->rot_angle_x = inc_and_wrap_angle(state->rot_angle_x, state->rot_angle_x_inc);
+ state->rot_angle_y = inc_and_wrap_angle(state->rot_angle_y, state->rot_angle_y_inc);
+ state->rot_angle_z = inc_and_wrap_angle(state->rot_angle_z, state->rot_angle_z_inc);
+ state->distance = inc_and_clip_distance(state->distance, state->distance_inc);
+
+ glLoadIdentity();
+ // move camera back to see the cube
+ glTranslatef(0.f, 0.f, -state->distance);
+
+ // Rotate model to new position
+ glRotatef(state->rot_angle_x, 1.f, 0.f, 0.f);
+ glRotatef(state->rot_angle_y, 0.f, 1.f, 0.f);
+ glRotatef(state->rot_angle_z, 0.f, 0.f, 1.f);
+}
+
+/***********************************************************
+ * Name: inc_and_wrap_angle
+ *
+ * Arguments:
+ * GLfloat angle current angle
+ * GLfloat angle_inc angle increment
+ *
+ * Description: Increments or decrements angle by angle_inc degrees
+ * Wraps to 0 at 360 deg.
+ *
+ * Returns: new value of angle
+ *
+ ***********************************************************/
+static GLfloat inc_and_wrap_angle(GLfloat angle, GLfloat angle_inc)
+{
+ angle += angle_inc;
+
+ if (angle >= 360.0)
+ angle -= 360.f;
+ else if (angle <=0)
+ angle += 360.f;
+
+ return angle;
+}
+
+/***********************************************************
+ * Name: inc_and_clip_distance
+ *
+ * Arguments:
+ * GLfloat distance current distance
+ * GLfloat distance_inc distance increment
+ *
+ * Description: Increments or decrements distance by distance_inc units
+ * Clips to range
+ *
+ * Returns: new value of angle
+ *
+ ***********************************************************/
+static GLfloat inc_and_clip_distance(GLfloat distance, GLfloat distance_inc)
+{
+ distance += distance_inc;
+
+ if (distance >= 120.0f)
+ distance = 120.f;
+ else if (distance <= 40.0f)
+ distance = 40.0f;
+
+ return distance;
+}
+
+static pid_t get_server_pid(CUBE_STATE_T *state)
+{
+ struct ucred ucred;
+ socklen_t len;
+ int fd;
+
+ fd = wl_display_get_fd(state->wl_display);
+ len = sizeof ucred;
+ getsockopt(fd, SOL_SOCKET, SO_PEERCRED, &ucred, &len);
+
+ return ucred.pid;
+}
+
+static void
+frame(void *data, struct wl_callback *callback, uint32_t time)
+{
+ CUBE_STATE_T *state = (CUBE_STATE_T *) data;
+
+ state->needs_update = 1;
+}
+
+static const struct wl_callback_listener frame_listener = {
+ frame
+};
+
+static void
+update(CUBE_STATE_T *state)
+{
+ if (!state->single_frame || state->ellapsed_frames == 0) {
+ update_model(state);
+ redraw_scene(state);
+ }
+
+ state->wl_callback = wl_surface_frame(state->wl_surface);
+ wl_callback_add_listener(state->wl_callback, &frame_listener, state);
+
+ if (state->ellapsed_frames == 100) {
+ if (state->kill_compositor) {
+ fprintf(stderr, "reached frame 100, killing compositor\n");
+ pid_t pid = get_server_pid(state);
+ kill(pid, SIGTERM);
+ } else if (state->terminate_abruptly) {
+ fprintf(stderr, "reached frame 100, terminating right away\n");
+ exit_func(state);
+ exit(0);
+ }
+ }
+
+ if (!state->single_frame || state->ellapsed_frames == 0)
+ eglSwapBuffers(state->display, state->surface);
+ else {
+ wl_surface_damage(state->wl_surface, 0, 0, state->screen_width,
+ state->screen_height);
+ wl_surface_commit(state->wl_surface);
+ }
+
+ state->ellapsed_frames++;
+}
+
+/***********************************************************
+ * Name: redraw_scene
+ *
+ * Arguments:
+ * CUBE_STATE_T *state - holds OGLES model info
+ *
+ * Description: Draws the model and calls eglSwapBuffers
+ * to render to screen
+ *
+ * Returns: void
+ *
+ ***********************************************************/
+static void redraw_scene(CUBE_STATE_T *state)
+{
+ // Start with a clear screen
+ glClear( GL_COLOR_BUFFER_BIT );
+
+ // Draw first (front) face:
+ // Bind texture surface to current vertices
+ glBindTexture(GL_TEXTURE_2D, state->tex[0]);
+
+ // Need to rotate textures - do this by rotating each cube face
+ glRotatef(270.f, 0.f, 0.f, 1.f ); // front face normal along z axis
+
+ // draw first 4 vertices
+ glDrawArrays( GL_TRIANGLE_STRIP, 0, 4);
+
+ // same pattern for other 5 faces - rotation chosen to make image orientation 'nice'
+ glBindTexture(GL_TEXTURE_2D, state->tex[1]);
+ glRotatef(90.f, 0.f, 0.f, 1.f ); // back face normal along z axis
+ glDrawArrays( GL_TRIANGLE_STRIP, 4, 4);
+
+ glBindTexture(GL_TEXTURE_2D, state->tex[2]);
+ glRotatef(90.f, 1.f, 0.f, 0.f ); // left face normal along x axis
+ glDrawArrays( GL_TRIANGLE_STRIP, 8, 4);
+
+ glBindTexture(GL_TEXTURE_2D, state->tex[3]);
+ glRotatef(90.f, 1.f, 0.f, 0.f ); // right face normal along x axis
+ glDrawArrays( GL_TRIANGLE_STRIP, 12, 4);
+
+ glBindTexture(GL_TEXTURE_2D, state->tex[4]);
+ glRotatef(270.f, 0.f, 1.f, 0.f ); // top face normal along y axis
+ glDrawArrays( GL_TRIANGLE_STRIP, 16, 4);
+
+ glBindTexture(GL_TEXTURE_2D, state->tex[5]);
+ glRotatef(90.f, 0.f, 1.f, 0.f ); // bottom face normal along y axis
+ glDrawArrays( GL_TRIANGLE_STRIP, 20, 4);
+}
+
+/***********************************************************
+ * Name: init_textures
+ *
+ * Arguments:
+ * CUBE_STATE_T *state - holds OGLES model info
+ *
+ * Description: Initialise OGL|ES texture surfaces to use image
+ * buffers
+ *
+ * Returns: void
+ *
+ ***********************************************************/
+static void init_textures(CUBE_STATE_T *state)
+{
+ // load three texture buffers but use them on six OGL|ES texture surfaces
+ load_tex_images(state);
+ glGenTextures(6, &state->tex[0]);
+
+ // setup first texture
+ glBindTexture(GL_TEXTURE_2D, state->tex[0]);
+ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, IMAGE_SIZE, IMAGE_SIZE, 0,
+ GL_RGB, GL_UNSIGNED_BYTE, state->tex_buf1);
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, (GLfloat)GL_NEAREST);
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, (GLfloat)GL_NEAREST);
+
+ // setup second texture - reuse first image
+ glBindTexture(GL_TEXTURE_2D, state->tex[1]);
+ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, IMAGE_SIZE, IMAGE_SIZE, 0,
+ GL_RGB, GL_UNSIGNED_BYTE, state->tex_buf1);
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, (GLfloat)GL_NEAREST);
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, (GLfloat)GL_NEAREST);
+
+ // third texture
+ glBindTexture(GL_TEXTURE_2D, state->tex[2]);
+ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, IMAGE_SIZE, IMAGE_SIZE, 0,
+ GL_RGB, GL_UNSIGNED_BYTE, state->tex_buf2);
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, (GLfloat)GL_NEAREST);
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, (GLfloat)GL_NEAREST);
+
+ // fourth texture - reuse second image
+ glBindTexture(GL_TEXTURE_2D, state->tex[3]);
+ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, IMAGE_SIZE, IMAGE_SIZE, 0,
+ GL_RGB, GL_UNSIGNED_BYTE, state->tex_buf2);
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, (GLfloat)GL_NEAREST);
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, (GLfloat)GL_NEAREST);
+
+ //fifth texture
+ glBindTexture(GL_TEXTURE_2D, state->tex[4]);
+ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, IMAGE_SIZE, IMAGE_SIZE, 0,
+ GL_RGB, GL_UNSIGNED_BYTE, state->tex_buf3);
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, (GLfloat)GL_NEAREST);
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, (GLfloat)GL_NEAREST);
+
+ // sixth texture - reuse third image
+ glBindTexture(GL_TEXTURE_2D, state->tex[5]);
+ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, IMAGE_SIZE, IMAGE_SIZE, 0,
+ GL_RGB, GL_UNSIGNED_BYTE, state->tex_buf3);
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, (GLfloat)GL_NEAREST);
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, (GLfloat)GL_NEAREST);
+
+ // setup overall texture environment
+ glTexCoordPointer(2, GL_FLOAT, 0, texCoords);
+ glEnableClientState(GL_TEXTURE_COORD_ARRAY);
+
+ glEnable(GL_TEXTURE_2D);
+}
+
+/***********************************************************
+ * Name: load_tex_images
+ *
+ * Arguments:
+ * void
+ *
+ * Description: Loads three raw images to use as textures on faces
+ *
+ * Returns: void
+ *
+ ***********************************************************/
+static void load_tex_images(CUBE_STATE_T *state)
+{
+ FILE *tex_file1 = NULL, *tex_file2=NULL, *tex_file3 = NULL;
+ int bytes_read, image_sz = IMAGE_SIZE*IMAGE_SIZE*3;
+
+ state->tex_buf1 = malloc(image_sz);
+ state->tex_buf2 = malloc(image_sz);
+ state->tex_buf3 = malloc(image_sz);
+
+ tex_file1 = fopen(PATH "Lucca_128_128.raw", "rb");
+ if (tex_file1 && state->tex_buf1)
+ {
+ bytes_read=fread(state->tex_buf1, 1, image_sz, tex_file1);
+ assert(bytes_read == image_sz); // some problem with file?
+ fclose(tex_file1);
+ }
+
+ tex_file2 = fopen(PATH "Djenne_128_128.raw", "rb");
+ if (tex_file2 && state->tex_buf2)
+ {
+ bytes_read=fread(state->tex_buf2, 1, image_sz, tex_file2);
+ assert(bytes_read == image_sz); // some problem with file?
+ fclose(tex_file2);
+ }
+
+ tex_file3 = fopen(PATH "Gaudi_128_128.raw", "rb");
+ if (tex_file3 && state->tex_buf3)
+ {
+ bytes_read=fread(state->tex_buf3, 1, image_sz, tex_file3);
+ assert(bytes_read == image_sz); // some problem with file?
+ fclose(tex_file3);
+ }
+}
+
+//------------------------------------------------------------------------------
+
+static void exit_func(CUBE_STATE_T *state)
+{
+ // clear screen
+ glClear( GL_COLOR_BUFFER_BIT );
+ eglSwapBuffers(state->display, state->surface);
+
+ // Release OpenGL resources
+ eglMakeCurrent( state->display, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT );
+
+ wl_egl_window_destroy(state->wl_egl_window);
+ wl_shell_surface_destroy(state->wl_shell_surface);
+ wl_surface_destroy(state->wl_surface);
+
+ eglDestroySurface( state->display, state->surface );
+ eglDestroyContext( state->display, state->context );
+ eglTerminate( state->display );
+
+ wl_display_flush(state->wl_display);
+
+ // release texture buffers
+ free(state->tex_buf1);
+ free(state->tex_buf2);
+ free(state->tex_buf3);
+
+ printf("\ncube closed\n");
+} // exit_func()
+
+static int running = 1;
+
+static void
+signal_int(int signum)
+{
+ running = 0;
+}
+
+//==============================================================================
+
+int main (int argc, char *argv[])
+{
+ struct sigaction sigint;
+ CUBE_STATE_T state = {0,};
+ int ret = 0;
+ int i;
+
+ for (i = 0; i < argc; i++) {
+ if (strcmp(argv[i], "--kill-compositor") == 0)
+ state.kill_compositor = 1;
+ if (strcmp(argv[i], "--single-frame") == 0)
+ state.single_frame = 1;
+ if (strcmp(argv[i], "--terminate-abruptly") == 0)
+ state.terminate_abruptly = 1;
+ else if (strcmp(argv[i], "--help") == 0 ||
+ strcmp(argv[i], "-h") == 0) {
+ printf("Usage: hello_wayland.bin [OPTION]\n\n");
+ printf("\t--kill-compositor\tkill the Wayland compositor after 100 frames\n");
+ printf("\t-h, --help\t\tshow this text\n");
+ printf("\t--single-frame\t\tupdate the display only once\n");
+ printf("\t--terminate-abruptly\texit right after rendering the 100th frame\n");
+ return 0;
+ }
+ }
+
+ // Start OGLES
+ init_ogl(&state);
+
+ // Setup the model world
+ init_model_proj(&state);
+
+ // initialise the OGLES texture(s)
+ init_textures(&state);
+
+ sigint.sa_handler = signal_int;
+ sigemptyset(&sigint.sa_mask);
+ sigint.sa_flags = SA_RESETHAND;
+ sigaction(SIGINT, &sigint, NULL);
+
+ state.needs_update = 1;
+ while (running && ret != -1) {
+ if (state.needs_update) {
+ update(&state);
+ state.needs_update = 0;
+ }
+
+ ret = wl_display_dispatch(state.wl_display);
+ }
+
+ exit_func(&state);
+
+ return 0;
+}
+