pax_global_header00006660000000000000000000000064147442636160014527gustar00rootroot0000000000000052 comment=c61b4d1024b5077e9f203611b9d8db8aab756e98 fstl-app-fstl-efc5fb8/000077500000000000000000000000001474426361600150075ustar00rootroot00000000000000fstl-app-fstl-efc5fb8/.gitignore000066400000000000000000000000411474426361600167720ustar00rootroot00000000000000build/* *.pro.user *.qmake.stash fstl-app-fstl-efc5fb8/CMakeLists.txt000066400000000000000000000130451474426361600175520ustar00rootroot00000000000000#### Fast .stl viewer ##### # Original Project Author: Matt Keeter Copyright 2014-2024 # Author: Paul Tsouchlos Copyright 2017-2024 cmake_minimum_required(VERSION 3.3) project(fstl) # Setting -std=c++11 set(CMAKE_CXX_STANDARD 11) # Setting standard to required, as requisted by DeveloperPaul123 on github set(CXX_STANDARD_REQUIRED ON) # Set the version number set (FSTL_VERSION_MAJOR "0") set (FSTL_VERSION_MINOR "11") set (FSTL_VERSION_PATCH "0") set (PROJECT_VERSION "${FSTL_VERSION_MAJOR}.${FSTL_VERSION_MINOR}.${FSTL_VERSION_PATCH}") message(STATUS "Version: ${PROJECT_VERSION}") set(CMAKE_AUTOMOC ON) set(CMAKE_INCLUDE_CURRENT_DIR ON) set(CMAKE_AUTOUIC ON) #set project sources set(Project_Sources src/app.cpp src/backdrop.cpp src/axis.cpp src/canvas.cpp src/glmesh.cpp src/loader.cpp src/main.cpp src/mesh.cpp src/window.cpp src/shaderlightprefs.cpp) #set project headers. set(Project_Headers src/app.h src/backdrop.h src/axis.h src/canvas.h src/glmesh.h src/loader.h src/mesh.h src/window.h src/shaderlightprefs.h) #set project resources and icon resource set(Project_Resources qt/qt.qrc gl/gl.qrc) set(Icon_Resource exe/fstl.rc) #set Policy CMP0072 FindOpenGL behavior set(OpenGL_GL_PREFERENCE GLVND) #find required packages. find_package(Qt5 5.14 REQUIRED COMPONENTS Core Gui Widgets OpenGL) find_package(OpenGL REQUIRED) find_package(Threads REQUIRED) #add resources to RCC qt5_add_resources(Project_Resources_RCC ${Project_Resources}) #tell CMake AUTOGEN to skip autogen on the generated qrc files set_property(SOURCE ${Project_Resources_RCC} PROPERTY SKIP_AUTOGEN ON) #include opengl files. include_directories(${QT_QTOPENGL_INCLUDE_DIR} ${OPENGL_INCLUDE_DIR} ) if(WIN32) add_executable(fstl WIN32 ${Project_Sources} ${Project_Headers} ${Project_Resources_RCC} ${Icon_Resource}) set(Fstl_LINK_FLAGS ${CMAKE_CURRENT_SOURCE_DIR}/${Icon_Resource}) set_target_properties(fstl PROPERTIES LINK_FLAGS ${Fstl_LINK_FLAGS}) elseif(APPLE) add_executable(fstl MACOSX_BUNDLE ${Project_Sources} ${Project_Headers} ${Project_Resources_RCC} ${Icon_Resource}) else() add_executable(fstl ${Project_Sources} ${Project_Headers} ${Project_Resources_RCC} ${Icon_Resource}) endif(WIN32) target_link_libraries(fstl Qt5::Widgets Qt5::Core Qt5::Gui Qt5::OpenGL ${OPENGL_LIBRARIES} ${CMAKE_THREAD_LIBS_INIT}) # Add version definitions to use within the code. target_compile_definitions(fstl PRIVATE -DFSTL_VERSION="${PROJECT_VERSION}") #installer information that is platform independent set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "Fast .stl file viewer.") set(CPACK_PACKAGE_VERSION_MAJOR ${FSTL_VERSION_MAJOR}) set(CPACK_PACKAGE_VERSION_MINOR ${FSTL_VERSION_MINOR}) set(CPACK_PACKAGE_VERSION_PATCH ${FSTL_VERSION_PATCH}) if(WIN32) set(QT_USE_QTMAIN true) if(MSVC) set_source_files_properties(fstl PROPERTIES LINKER_LANGUAGE "CXX") set_target_properties(fstl PROPERTIES LINK_FLAGS "/SUBSYSTEM:WINDOWS") install(TARGETS fstl DESTINATION bin COMPONENT all) install(FILES $ $ $ $ $ $ DESTINATION bin COMPONENT all) #install file in the platforms directory. install (FILES ${Qt5Core_DIR}/../../../plugins/platforms/qwindows.dll DESTINATION bin/platforms COMPONENT all ) #custom commands based on: https://gist.github.com/Rod-Persky/e6b93e9ee31f9516261b add_custom_command(TARGET fstl POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy_if_different $ $ COMMAND ${CMAKE_COMMAND} -E copy_if_different $ $ COMMAND ${CMAKE_COMMAND} -E copy_if_different $ $ COMMAND ${CMAKE_COMMAND} -E copy_if_different $ $ ) endif(MSVC) # windows specific installer generation information set(CPACK_GENERATOR NSIS) set(CPACK_NSIS_ENABLE_UNINSTALL_BEFORE_INSTALL OFF) set(CPACK_NSIS_MODIFY_PATH ON) set(CPACK_NSIS_MUI_FINISHPAGE_RUN ${PROJECT_NAME}) set(CPACK_PACKAGE_INSTALL_DIRECTORY "${PROJECT_NAME}") set(CPACK_NSIS_INSTALLED_ICON_NAME "bin\\\\fstl.exe") set(CPACK_NSIS_URL_INFO_ABOUT "https://github.com/fstl-app/fstl") set(CPACK_NSIS_DISPLAY_NAME "fstl ${FSTL_VERSION}") set(CPACK_NSIS_MUI_ICON "${CMAKE_CURRENT_SOURCE_DIR}/exe/fstl.ico") set(CPACK_NSIS_MUI_UNIICON "${CMAKE_CURRENT_SOURCE_DIR}/exe/fstl.ico") set(CPACK_NSIS_CREATE_ICONS_EXTRA "CreateShortCut '$SMPROGRAMS\\\\$STARTMENU_FOLDER\\\\fstl.lnk' '$INSTDIR\\\\bin\\\\fstl.exe'") set(CPACK_COMPONENTS_ALL all) if (CMAKE_CL_64) set(CPACK_NSIS_INSTALL_ROOT "$PROGRAMFILES64") else (CMAKE_CL_64) set(CPACK_NSIS_INSTALL_ROOT "$PROGRAMFILES") endif (CMAKE_CL_64) elseif(APPLE) set(CPACK_GENERATOR "DragNDrop") set(CPACK_DMG_FORMAT "UDBZ") set(CPACK_DMG_VOLUME_NAME "${PROJECT_NAME}") set(CPACK_SYSTEM_NAME "OSX") set(CPACK_PACKAGE_FILE_NAME "${PROJECT_NAME}-${PROJECT_VERSION}") set(CPACK_PACKAGE_ICON "${CMAKE_CURRENT_SOURCE_DIR}/app/fstl.icns") else() install(TARGETS fstl RUNTIME DESTINATION bin) set(CPACK_GENERATOR "DEB;RPM") set(CPACK_PACKAGE_FILE_NAME "${PROJECT_NAME}-${PROJECT_VERSION}") endif(WIN32) include(CPack) fstl-app-fstl-efc5fb8/README.md000066400000000000000000000076171474426361600163010ustar00rootroot00000000000000# fstl `fstl` is a very fast [.stl file](http://en.wikipedia.org/wiki/STL_\(file_format\)) viewer. It was originally written by [Matt Keeter](https://mattkeeter.com), and is now primarily maintained by [@DeveloperPaul123](https://github.com/DeveloperPaul123). It is designed to quickly load and render very high-polygon models; showing 2 million triangles at 60+ FPS on a mid-range laptop. For more details, see the [project page](http://mattkeeter.com/projects/fstl). Issues and minor pull requests are welcome; the project is under 1K lines of code and should be fairly approachable. ## Screenshot ![Eiffel tower](http://mattkeeter.com/projects/fstl/eiffel.png) (credit to [Pranav Panchal](https://grabcad.com/pranav.panchal)) ## Setting `fstl` as the Default STL Viewer ### Windows 1. Right-click an STL file 2. Select `Open With` >>> `Choose another app` 3. Select `More Apps` and `Look for another app on this PC` 4. Enter the path to the `fstl` EXE file ### MacOS 1. Ctrl+click an STL file 2. Select `Get Info` 3. Navigate to the `Open with` section 4. Select `fstl` in the dropdown 5. Click `Change All` ### Linux If `mimeopen` is available on your system, it can be used to set `fstl` as the default viewer for STL files. Run the following in your terminal: ```bash # replace example.stl with an actual file mimeopen -d example.stl ``` The following output will result: ``` Please choose a default application for files of type model/stl 1) Other... use application # ``` Select the `Other` option and type `fstl` as the desired command to open STL files. This will now become the system default, even when opening files from the file manager. ## Building The only dependency for `fstl` is [Qt 5](https://www.qt.io), plus [`cmake`](https://cmake.org/) for building. ### macOS Install Qt from their website or [Homebrew](brew.sh). Install `cmake` through Homebrew or equivalent. Then, run through the following set of commands in a shell: ``` git clone https://github.com/fstl-app/fstl cd fstl mkdir build cd build cmake -DCMAKE_PREFIX_PATH=/usr/local/Cellar/qt/5.15.0/ .. make -j8 ./fstl.app/Contents/MacOS/fstl ``` You may need to edit the Qt path depending on your installation. To package a standalone app, go to the app directory and run `package.sh` ``` cd ../app ./package.sh ``` This should produce two new files in the root directory: - `fstl.app` is a standalone application that can be copied to `/Applications` - `fstl.dmg` is a disk image that can be given to a friend ### Linux Install Qt with your distro's package manager (required libraries are Core, Gui, Widgets and OpenGL, e.g. `qt5-default` and `libqt5opengl5-dev` on Debian). You can build fstl with CMake: ``` git clone https://github.com/fstl-app/fstl cd fstl mkdir build cd build cmake .. make -j8 ./fstl ``` -------------------------------------------------------------------------------- # License Copyright (c) 2014-2017 Matthew Keeter Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. fstl-app-fstl-efc5fb8/app/000077500000000000000000000000001474426361600155675ustar00rootroot00000000000000fstl-app-fstl-efc5fb8/app/Info.plist000066400000000000000000000016661474426361600175500ustar00rootroot00000000000000 NSPrincipalClass NSApplication CFBundleIconFile fstl.icns CFBundlePackageType APPL CFBundleGetInfoString A minimal fast STL viewer CFBundleExecutable fstl CFBundleIdentifier com.impraxical.fstl CFBundleDocumentTypes CFBundleTypeExtensions stl CFBundleTypeName Stereolithography file CFBundleTypeRole Viewer fstl-app-fstl-efc5fb8/app/fstl.icns000066400000000000000000002014711474426361600174220ustar00rootroot00000000000000icns9ic091 jP ftypjp2 jp2 Ojp2hihdrcolr"cdefjp2cOQ2d#Creator: JasPer Version 1.900.1R \@@HHPHHPHHPHHPHHP]@@HHPHHPHHPHHPHHP]@@HHPHHPHHPHHPHHP]@@HHPHHPHHPHHPHHP ߅ +\'C5w#ci.H1/ ,|x`aB@qGd9^[D0CEn CeXx*Xͽ,kJf\[ߪGw6_Q7~iiY'[p'i䍬Yjem%: _\ VɺFK×k62Q7߅7fP&l4qExDŽ6/6*Ywk?`" '/y^'!@/;e?h Vw|Tb|3_^3WdW6DG<<#==E״JNY [K&#<ޞ[EFoDeb(A̪@o듭t4-:*dWS=I߅7eT~ c/z&E"䃟_@e 4YriTk7;{i4/= B5ٗ PR%֮#Gc$^ςŁ*uOxHnuf^(31Jj%]C(~JU #,kg_T ʈ-*-?Σ9+-Qs@ω6NRj;iu߃P1Io֙euv{Lj}d[w @C3+'CaTb H}Ig,1uN„~1N6sqį*eoJHk{B5I&–k6xSR\U7JADHGKGHv#;9`. xn׌IzgX@_i`Xc=<0̋*fpL%mX`ԟԏ8IQ؞Js^>'P8ޛcҪ9OT`OɂuߟS4wGy/k V17 e&f޿ /r}w77ۤ/hp0/|2N0s[fN1!::O~M[hQ׼4V8*0yk"o .O7G[Oe epygɟzzػ+]oLelJv N[K\mwp^j~/ H^ kQxDnuJ./y!Tqc]U݋e7**B̎Dr5JGFC@Qw<&? ` h9X[ &Lcn;b2$s]WGFki5 ._~7lÍ ]w보@hsob6冴Ș!4_~gn"qsP#}oB0li[\ fQ -?!ADSàcL߻S"6K%ٺ>:TW? 1\Vataw (,Բ<m4ֈj͜\,dݡ&e2A[BtDK_+{,hơo#AI9)'oG͇5]/.t  4j#mk |_hq[tmܱ/ C|6+ZnƲgmGD-g4.߽ 0 g$f߀ |Y 2d *z`AZL0>ҺC$HK-+5#5{QfrǻЉܡMHO}Y,!\o/h4l{FK> &^ H̻&D܌Tg @ c|(|L$FAT Lj^3'-,,GxbߌL(j@^ Dwid;ye | d<řzwCQlOEp敶+lBy?Y4?G!GC%B E`w|~1h䇿wpZf8N0AB&~Z E +$fUufaj]n'{TY`$ H+j#ƀm#&){q!$_G]lӈbPWhB.kHNZyTaX0>CbaODt?s1rO} W d3j ƲQJa:&%qk=րd)OF6F.3KHx:Iتd.~7U:ܳ%S1Ғh0΢)>I9&jefPL앬I!P Ū*H^#&\ h|Sյa{#-p֥``*Mܚ.5҈+S'nGOf%nԁ.9f7J8]p4Jh>(~h=G|bXұors@0abR]= hxAFd:MDxw'"%`S"* r2w0fs_(~\|ڍl; ۳q~ċ)Akނ\-!O“*}.jX}[ mb5\Ź^^$\1~|vc18mf]bO f#f^~u3FT[\TQF-Kh^(H<^+^wLfQMbR?|͌l'q%VžȼFӡw8=;,ڵ($T!AxUbr : s zf  O}cKs@2Hrl) ޽1Zt c04֥e9g9"0\\I>().1w5ez$^h?ajFDw\]!*ȟ4x.`X#Wpߘ``*Mܚ R8 #_A^0ήzyg0JNr QoSGĎ i/d[j]ѴKY粞!C_ӳ-h٧&y 'O?X߆huK_okB3k/* pcYofdrF ^A {B Me+۩h-/coH%$c8+ŵa ܚu~mA{0]Ĥo+WGW37Ri‡{Cs=Ы?y[ I*EYz F 5-µ+"(9߄cg7@b6T^3xّ0jet*h&Aԭ.$2%E%F̼\ lЩXYo_X%B>c{I,,\^+JvN=i;5a8@ )t!g^Ex{Rκ]bdo)LPv-/RDzZ;gYʫGO8ܒtV4v;>F֖ۘZnq]`̅1+ZOn? $P#ʾ^ F}8 >[u=B2qM`t`ӶvNǺ,& qg^[w9a ݌[QJZEXf)SG7ȸ3"vCTEg!:\w&/N^>МFS}~ q$)Q=eM h9~_7%b8)(mVKe%fZ1TX9|Yntk:,J`yQqb 8!zQ=C]Ut&2@+GhUJHH Igh߹ q: ֫w{?u.[͆!]sO˶GB/0WM)m5˃5Qґǻ&`K߱V(nVIp+Pp)vW: l&GZ_`AMثk!eLg(Gp*r>%mn^-43X!eb>G}Z߯X0|m.pZOS촹Ykp)u CVCX0 DgVV[\4\z {IX({X3>N$}/:n PJ$|>`_"~_2WT*-'2ECw7 Zf0Sq]S&k΁Q~>Sc=Zk/h ~&v+}3'=_x޻@5:#ɱqG+\X-o"^ =N4uEl$0فSTp"'_s K\ĵotwVM*h P}<XRH(vsk:fd;;cY#"o&XmƘ4x,>JE4VFvDI>HAͷ5uprw٩MqM: qydSj4 ĊZ\bJӈ> *tI wX Y1j͜?|n6!rvC$^IAciVjd=ÎXC&a{RaF,,;r52|tBW>x}f BLO~i*7Ww/CBytbHK cRܚ};(QS2O˲Czs=cZM G&Ȃ[&A\A<6f൏aj#Te(([/},f+6Y&"QhU 'B8ڝPާ`]:B>}N?HB2\\dM#q8u0acI~^kohGEk׸a嶓bARtkSP[WXz*JfZ_ܓf*0Z_0vO:M! ~|PCxy,ߩU̠䣟6&Bݥ'wW&^],U D*#tT K3)p#39 nI0 =$nфNVm-M`KcFt 4 T$ktl a-B{Iz`n("Mz;Ko })ؚuSg&*jF24a aee5hRF!9~V>O };H|uXprda[vqB!44IgI[9jAQm|ަ6,z#\/)DN5a0 9AoeR35RqB;Z_>n`X/bƉ>61"_q}A:ғVPSҋ1- eK("HL6JS%U4OAD sȓ2NUJ=nh fߊI~RC5$ﴴOpW# $H"*dЭA%9QFm ʳ7&#M#}7*)P-#TsNtN'-Y?对=E&2#N;>hlՂeW0o?)[ 'IV;˳펖/fCZ_[<Vo(T8-~F;άhyۉK{x` qqRݣ0IIB O(HJXupFo:s^DOb1]`*Lj5WK4 Sf$ódPHI4s-髍p2}l:i9kF=t,+C7* G!:H"vSRTOI]2^ g5h*r}|oYǘ_N\.I"OT>B' qR_]lZ(=K˽F.W*]?piԘfrԭ<^-40ՄK48 L(s}K;T׺{ȷ۳>E+c+[\Ӂd<Y!q/ IMMœv^IfP"zy6N䰱¶CH5n!3ON). 혈#lOڻd?aA#>u=-7sacQn0:4Y ,!hCK 93b]v{@Ъ%gMMۦ"0F7DwEr,)kjO^6,0͈A"QMԦ@X &Jx+ \ l?5LUj^xX`852ID.8w0DZ0576qzp]U#{<Ě/ L LmAd3 S|Dp|u-q1Yc$wa˷|O~T{!RE9~"dfe(Wn9QyW=S-N3 %P(`pgKOJĝJԧ\bgz` ]fD"b͏](@L⫱w1/] c,+mn_EfFe4 3f(?>a{ۓWϨvΪ%J T}<܌Nl5ZCJp5X?sw4 pZ5qH/o5o-8O RXŮȨl:A`8D i.V*^|B*}_O`4LKqF@\'=âx|lv-D˂MZ+HҮ"!~ 'WQHqXџ|Jွ` ⽸ ښb9ڶmQ.O_o*gն*󅶰tzlT6& úQM-xUTT3@?oZL˛YdD{`Ex5Jltk݋On s d˷S;z3gp;dL`tOfDbhgz>qO] 1Wa`.X3Nra>u昶Uzۯ.Ae 5@t]U[[:sɞb:pqqO^#ml-``_H nlL3y,qwΡn>:7jGPήb:eFY/1;0; fo.%@;US[/YnO/Oٻ1Q.✼xނ?Z1i_}C0.WPBDޘuki p!Q9ļ%I ƺnѼ peLmԐ:{E.D>kYK6Ay5ջQ?NdRU\ZN!L<9"h\/X'8iKQVT >CL, lj - nJ \A3rwy}$K)v#)g>ųF!Ӿ6L~*7y(?/rDcV @80Y??M j1ȎKS?~hOPfE4'Uհ,҃jpCZz -2tJ)'|>c'.CTNE#YuɄݤZj=)!cuvus4rL+EM !;rąJbngJuf}' u`9B\*Q4>gKq:a^F6Ig)Bpdun]sKdL_$jcbč\b#3N}xgo|Hx}vrt/[1M ['d\86nV6L(N> gԙjI߽fKCI,1^G@OK!YkXь%˴;6-Dq\o63($=X<& Gt;< O3eϺ9L4K1J'{B|pd~'s2BJsmf"Փ5Y\*T,t(xM+0/Z'`b*۔ɢ #,'bfldfRfBj%;UH5n+rn-. kB;l֮2?o5 ,ۦ%k-ǐkT i_ݳk)>s !i-Cw9Ի1FEY#E&o-Zl11+Oy2z(!Uw;LdN$JK7-ޖ~@66u}>A EPjmc(=4|?rR7k%Ŀ }BU@ѣVAeOWcl}PMNPa6k7!]2 ))iu&B$QNO[/z1W('Lu`E$9 vLq&FH+m}4$X=Q>yL:ġM۱_ DGOţKSȚ(NqmyͿfxSqV9]@fNhTP_ lx %Nա4ue#sh:0!z[=x@0-G/m+Ο8 ^"]*X(F%Sv|/ M *uז=jBt mؑ6/bAW.-#@Jݬ>@ь )f4( r兪;iĉbp$^HHXCH]=PbKoHA<9T%35[lrm AEimc [4Kx$9cofzW׭"mF., ?^b eQIXfE6:2R,I;ROey̹CM*ɕTJj~|K~IQ JUEZPhclA"#VÐoKɂ#08bcpylum IHft﭂8ɀ'xxMe\y\8YΔ|2QZɰ{TT-d  ^MW(Ґ/cf' t\!Ke6w Xwe3Z^o C f7e-EojQUd%Łj+;Oa\@tm$BB<^thc@ѡ'{zY'7y)TOcMxn[oU+Gfm\ 竮 sluaՇH|0Ycy4tΏ%c%UݜLƴA-mNmFԺF~G9$HZ58E* @#؉31c۟.F*Iy)gUHAqMu@ v# a&k4z9⨉7'4-V[`R;3VWBY9i"[6G\}Nqȃݸ۶@&HabF&&JPzN*lIR!skt wFYO瘢sg!ېAhv4|0^-C[2񉇗aXWϚ_s#[f TE/b֌hP{ˎh})8Cu|7|7}ܶ^h㋒LAO6$PhZ Sd$W;@/=sa *:\ 7 ATa9dG'w?B R?SŻV& n}=3qPcg"0tN>R2g&ٚ OO'jt(pq *LA_i %Ua@B|-@H>Yq!#[lu,^24k?ސ@8lF),jt?+^OOME nN+fiO:Π9J9!Yma[&T,xͿ[p[MUi68 $I$I$I$I$Cç\XOweGBP?V;f|-$1-Q[w8KŸWElQ804Ǫ.Gg-"AƳOHdPrf\&2X4:y,wۭ[8v' _n_nn€]D^>8Ńq 9V$'t+i8R-iɨnDdn΋IH߉RyXvK{JkϦsdRqLG\$P|sPE(f ys$k*&0XJjzvz}'ͶhIV~mCPn.cʫao77')*eѝ7 Icj9S; c&t-M;O; %VG1-kXRSѤL;2IBwC* ]4;ҳ+`΍;)4!D9PmP[8:4akM 14rlM.l"QU0$23b˘D ~>>Y* Ι#cuydg(`FL =wjdrbڱ7̛$OP҉ Mg{=c N%T ;#3#6z*qLƂͬ,J@Z/S@' ٲ^k|z" tiVYxHŔo6`ѣZqME,*xQs\i7&OgjD)φ0 )nA.]/e+B``dI\e;4^2d IrWAw]֬v-"c^ TK*㽯tL Ĉ:VΈT:z}lcrO~o_K5¥ݪqN5@$I'G'En9l6H;Ưs,`2:am1; K?f'<0T-w[eeD۾˿]qaL+.`z fV e6\X+6ќi+xWx:~ lYar_u 5a![c9Qz*o~:E(Jx=tO쏀%o DO:fS\_{]PA& `fǜ&CEӏeK&pǖB\ĶL29G`zlbWhMNV콃lNeIO4)ԋqYD>xmV܅g6gI"ɇHol['Я9qj6j@AenBS6XyXMTK,|}A.?= R8aO 30 %W`Uj$<ӊLXEtX,8B0(/{l4r;~6Y{'Qp(^bK+)2^>eB 6}<{͑^?E@hѓRiv<}\?{], ۬²PT%X-g}6&X (=[I^4^˻㡾AlLUo{[ TYnToW$ntE!!:>Oq樱yY7 E:ÔdYO=WO7[p/ B{tw"#&. $vW0B0 KƇ@@DZo!km,6A$%叺ǯ ^cE>o'8dkE@tE9O4K}z`B2: kll}=ʈt3&$•kCj0z:W`^[L^sqo|!NKCEj3:2lƻ[DeSS!@Ov1_i^ƹn9DKh2i5"yHL̹? Ї8-kp7 ٓۑ(5\jV]^* UD(yG, )ހw?y)&`p +\.#&[rwؿq_\2b7fYbc ^,ȢWO{WtW-= ŷu 7Sy*+IguXSEm7<@=_ (+y^F!k쿘"8 Vu"'q:xN hl|zC#q/_>JgimƏ S TwG6i|lSs8F+#1%zuklꪧ9NrZpb|R_3x_w)acۃA:P蛄lJk6TT_XZQѼDGDe(#4+.HAtW8_FIl`>ȊtZy GGwSN\k&(FTER` A[gi)7\P~4Ώu՛:8dž47yp͎qxMd.8pAR #k/VXOF Gm~EzF{#,D-ijy ڂ6Bjcaa4[8EfkO]j{2udVclJfyZAK|ks[&ޤDƬ(:[0|Af]0)d n]~:L Wj%+Hr<[`g4䃜nq6p@*|٩]$lj@-@s PcAU1,DpLF Qu5jL-w wE2pt Bݠ ,~rpR}g0x؀PczhfeGM Ā(oY^6 tA}ZƲ|C3Ο~<НЈ?f_<;H}F:tK|SD2U ?s@0)xNwΐ21kEKӟD/-bq}>ou#z-]-] G(.h&wMwƨwWز}v+Q39ϥ y(Vwx=_N#U|)ir9c||ˈ YVae O܄д&?R~B{ "NSk;LCb?7~>Ԯvv}(Cu_gXT P(}Y2+i/a[["FzWM8V o@X~m1bRkL/1m>N "6j)!RhftnℭɸzA`L,wrd=uiHz\ 2opW1mCމ-fؾ}rK=Q|ܼdmE? N#+Ls-:+'5wŦXd8Hz3Jɍ[QBF#'ga )]%9Bw W~/vC嵠Tp=Z?QQB:RGkkn$*%ue=Ȅ֏D'v2)ś 02m%QTKQ~턠fW^il}C+֬@C(S]'ELwA3Kઃ}$ cUdseVkh Ԡq2b(F6jKk7]l#rJ㿯g{}B[ƽղ4huMX棩HwI3d*ʎ7-:\V/Sjz®k#gce UW*N%un Z_ '*O%w'n?oH۾7&yn~ݿx K{8M [zy(rZ\DJMy)R?Wඉ$:ENkiP"[h|8tsV{+JΏ.+y.G8#{jUs bL<cpN<-Kvüa6%=q;٨LJGi< Q,Gش9skD5"))<=c $:$5+Z*|j5gΖKwl {Q9 o5 єORUV6 Fo1@ *]Rqqes*Bm]L P̷lTڥї8`&ɨ<;*ΐW4|A xԌk1C'tBUˉfgw>z}C-##OΑ pժtaCӌ;BʟL' Qю듐 awJŇN3QjK"' ./]AsZ-IeNkټJ,nRw| ũ?"EJOzϞwgȮ΅L Œ @;7 5zE~xgҏt Ͳ}÷)VW20dujJ-]Y3ח1šyK~+(}ՔÑ5~u }X!245*DV?Z"݇+CAI 89#>rW50i F^l@9~WJ:9ZKKNu <G)4z6@=y!ut.\9bRLǿi~umkmO۾ZWN`GBLaB?J qsD-k=)^$22- mII~r林 ULCa}%3;p2fv/R!G ٿĮy3}v%#u"'~tH֐pA;6QxP߸NE1ڔiSgM? 8VsԜb2#(zp(d^Y-)f/P( fʽ? @~=7 W߂ygSEg:AhƊI懛b2S8SÁMqT&8B45mr%2 3DP;Z8ϕpY-{:,c:CJS`!j|'V5O_ 3( Fr.HZ}5mY@-"(D-s|yB-M/uO7,)(~@oF~7SG/6d#[qěm NX1R zѤ[Y o~`ߵ;kXV~&9 };96'T%^jXٙH~{@ʼnDc2Ǐ䣔Xrybk3-G7+)%EnUYE:V^zh$ݛ>. '6]鍧 njN\IOGe+L/AB"ߡa>Z dҮγ=kt]ӡ xA&9O 6 87g/}Ds2Rz(&G0"[2On]feHhgH±&\YfGxg mxSwu`¨'쵀aaWW,>T~he_V")!G}6ݨaazf3~Fd]A_dbpН@u6%3fD%9ԂՆq icd` i9CQh{ʹ3RFGtd<#sDžȺ8e6Kr_8 lT46[x bkC5;n!ՔMty];I SrJh_N,[@0 kAZ1f-\#LwHЯG_O9$xc/"}CUԲ s[H!!j'S_4mñ_DK¹ƉrY om EZYzgu $j1^1r23'4Qi!#fo*7*ʰ0im}m_,5 |kT5>SP[:愊dq[E[/\PߑyjƼШf$0>Ad#P6KfӸ_=!^ Q_EN;@ hmR_dz**YRmΨ akU̝3L< 5@B+@f%f~c2WY[/w mpAieBgd TdV: _s;Y7g?i0 i6ƚ,Sʞj۳aʯEܕQZӕQ8=5`a0㎥XԽCa!8'|/W7]F!2v}Z'j݂Y8n=܂{Ь H Ok)n>cKZH4gU`1/,QRO3[PK~ʸJ /m O]:UUݟq%E1mKb'7R&n9*^@}k/g2Jfx.0GVLbWS *Ted7^0u^d( T, ~zyb@8鿨 tTlݍ9%5\ zzz )2x ̬z}EDES` WC[Qfi~GµV_997ڜtbg%gh+a<V sMyF/5f5 ď(.[B3럾^}ޜ K>L1A+Q}xHF] )UwT)Zu<+uSzNiB9=0G @Ӡ]{ٱvXK(f S+uSy.ꈓI}y"o#,J+h{k DۼDq_ftຉTWL6@)c; h" {qtM$^Xtf<`1oܭBm4AE/͎b e٬0A.*iY *a9ڳezfPb2>o4-fi ND~7e8ZTDγ*4ۼwٔI>;s`%Xт-rYQET1Үo 낣gWy֚W:*?v*^ yCt% &0{H^:N$G4#ZQ4d4wO^:. \*Z'o_uu”-ϝ FB̋c~*N[lzZ;!>d'/I}hQ|*Rm3I6jjYN2ۅ҆¹&NheӲ:Ϲ?nE4w}C bkٰ>ӳ*)ڙ+Nŗt3l w@?|8bzFrwtJCN->DIGhw%慓L'}}n|X޽Y6})0Y1IO g7Caa,jM!fc}71]_6ٟry ~ BR(*)ɻXqua ,AJSr$5P RIJUɎ$ nXɃaU;>9 cν% [򈃝EfЕW vHʃ:'d>6c k[Xt#ɽIJGߊV(%P\} R$zT"ej:D/c lEG[{U헒 :nAm`܀OXk2VrNoLG_dwhF`NThemn_~ވoAЅt۲չ[ zbsʴuWH{ffI$ZedR%mީZb%XJJjz-pdv2S΂H0\ʂJm(.B%+HTi9J@p,THRkzkdʊ{DUܥ80@aʼ}nS1:5U2[JDL9QpO\7t%+s(~6sxdmyfNPb>J<4"W+'"$ Quo5=Ȕ% $E FHI n$-A*D\D+,":jy_5!;E!Ǔeꌽ.1U/~ōOVtcJ08"RyR @3 3T=dKL8a|I_!)wQ߯Vd)mI`m/(Pcİ^IR %l=^jյ6kEx(-E>gmhS&,H(PG1랰 }td . kj};,T ppSeEu l_N#2 TAsn9\Q{> ݀+pe5oQg+٠- RٛbrrEU ymz/4!2^|;d==dJ!_ !+ X0%˿eZF$0KC˩źy( !ҮUfF@tulZ8_CAI 89$S]0)vyΫ/hj2f'0fG3[yQfWMzt R;sm6#ei_7e^{=:w:1VRA,SO/i\*v2;v]ثf Q/,Dt/gJ~f<f-+|z/P&'|o4LԮhV\`Y +T=1|1-}7;g;Ə,8Z؝Neȧ7 s2+{ "a>R5)ijAݔOw_ũe,t=܄n:p'h-9ѶJaMbD2l-͋aI%~xS ;[j @Kj"x X?iLZ Y>̉B:sXOPup`4?$'ȎG1(gu"s'\>Nt;kMvS y` α?yz;ˇabGwISWU]=b{>&1qj @9s'.SLidukG*NC&! )HSnB!(g)Po SU, ҭk#j ]vG-\u3o2Ps<0% s{'kw_U ;<Bs7 1c' 6OyI\,9ڴO_4N3%fm,Eo"~`P͉0RG>S  <'(EnׄJ4yk~ %c4AZd0j^k3hUV1a63,>ۈՃcEX 1d4yr6c~Qn-/ QYg]VyeCWSa"b h-d"DdQ20 2,gFޕ2eYYmFq!G73tΦX]U #if` 'aRCgz^フ<-rK -= w P^B?"* lZ 7@u cjw}-G>˻ipar͍M,b p9 %oyU{vAIęf470+LHU>qAd:p޲@aTW*FFŒ]6 bcP)A=kf]a!o>]9T|BO^[l!QJi`ytmgb3'K&t Wdqz;` ψfrQȟ5ބRcLHS'0ۅgfI*;YbP:&YَsT#$e5Q Aۆa@KgD*p+x8#P ~PXzI܆b]M_5t>"?ٙ ~}Uy |'QJ ^cŕiH^N25EgJ&SWG!WuUn6;o'Z]-ʗux@EDX`nP>`tOSgV{]W.O-cWƗ(snH6\ X&ZQe9ɬl>I[4sQ!D[ 4zMv =4b_3BQ1:ޕq>/*euC*3ߜq'~l&6biZ=V.iGSm/Olcb(I`t`mqW]e˒.yoZ/IvMGjQKÒW8:׈ oNi%p#6#(t s[$?ՙCD:dqf2TCf^}jcƂ_2`p8kfSw~#<^ /D`Cz#_&rF]v1>7öQO?~53,XmlE4MR,gRZiΦ` ժjd_Q>b#˷6ٙBN mLH54?OA(K!'ɠWehXHYtWWh$+ 4 _/;P"LʶR6 ah,r }k6їY.g s>c<>߈˜FӡJ~d`Ze)bq:u[ȟi!Rh֙$6P}3tԖ|.|g/ g=BDehY!̄f,6#2Zuo< --{\M1ũ`n<򞃑pVMIuUɈ2ʢ1^3HxZ잶cFEɋ5lnQ2lԐCks1& >Q7`/ BGU%Z[yǔl}>l'3%89;1NڷvjihX{J*F1tIɸ˿9aM@cGM3-Ns]!=G57bLRgJG$I~Gi Yr0~UC `aBU&tfyӅ{јdP\laktÃ%/thy;jۭh Ig`&@RkNYlrrюQOn^]FSGX֭0ۑ`FԿQr1vWsr>t]\F]GJ2Wry!^?U|oWG#1#YlH!0x#<`t)4 I_VWex )$RS/!;/|qHI80`|D 5o=p=$p(VKɾH*{ Nq7ɒOKȲ)ֳ:jOLu$ K@M=qHI6$،ș|V `!>3{A>6lfelhS<^2u62ʬXQdM񕠤V69?겛Y , ZWbKDBb(u#3H'f(V[ս wHs.ֻ10}tHzIGK`sg@ ȹG}*|6{3%%0.=,!P%ԉ َϳ֠06~ɏ-ج5s#f[EZ04#B9R2yzR;s>IycġuK|- 亊ÉbR7BXH.>:-~Fߟd=y#jɕqn.AN俇cegFtUmZ [K_0/g2d i\z4 o*=(POsuI-oG&nto?bEӅAρr`k}L!jO{{7H.?z gm VK Çj~458Gt wFYk9fz) _q!WNërsY&=08kDӀ z^{NzkE*۶8nd3W$t"*I{rܮQbAl5bH=C՗ N9|t/k'yڳ>OUOm}s>0 dt1&?IT(d7?wZoż, JF d;K&[m ~Nr6:9~ooEMԧ#`oo0 ]P>B.'_9/0f龋N6qƻ6pr[t-_KH=m'N;GORSX9 k΍Sc]\'[ium.մV][Kiq ]x" pk}m.մV][Kium.ú̪Ňih]%35Y8;Tz4XV/ro:2!c[ˢ[9 qcYk!w Dmuoo#L&k-al6 a۲n2~?laBg4!Dxh(=:(T̝SX#[ Awŗ~=***,GyGS Hk}m.մV][Kit,T:IC?J})~D}m.մV][Kium.t<8ۑˌ2O|pz]ܲan8?X\N4-X,|Bk Nf-fsDg/\h`02" 5$N4 y/g1D.sn筲OpJf}ŷeW}ZQC^HMnM(՝KWYN s2mD|ڎᒠdtՉ.8և ]k+潯4N)}#H W4ߛTQur0o9?L3ΩJMgW=&MNg+̾BX1|Tւsucb{vSXpG~X[m38~ 5:7BU ' Mq *aߔQëUU-mli/kzv>oX4t6=|կ| *UD;c^Wl;jѻuկ;k갠{zkqgۮCL!d0-db~b NZ=H}ŒpʂaWlhYmyV7  ?q)[,R:鰻?Rx5*q2& Լ JC!u_߰/ 9hK*q{GN˾"Џ Y}q<]*םG^Wfsg@ b#;jg=̈́fɝ9"1pKнݻ"jв"_ j!y^zkwf*d1ɍmΩq= tc)"QE~')=vc=>;qT|V腙4\A_ IQW穠9#'o/o7.cTͣAjS&H%P7VN=w$ankVA oYF`nmpȵYRrLånbenTW|Jcrhww:5Mj]z`xVxn%%-6f,dZWB$4psb(WdaǽY I*VȝKm> =醙d㩆df#_8#4I`@4q/<"~rNNzft"{Ie*]΀KxLj:< nLt(DSvGdozi),>;ys~{h;ؐotx+Ea("0+B%S @@Lͥ `/xǬN?,HG4 6 R% t/'ar hom&olدejFtPa~۳*Ii:#,0=^!H& j-<% gڣ$קVW맵XܨڭayJ~Q~htRbalR_ e 8k`x'p篆oԌrq|0gXN՗`[p+lIpт6"!F]xNr %~R;H*vʲwj[ Ba'~F6Se}:3DԜ= [~27=bW`k O*_߫^θЃd,,9wϩ8IZ$m ]t|wBvTwlR8| 8x4|NzM<~*` )@z݂dRx&3JjNrpq@/ڼ*=zet N(mfc4_^7Wzo)0OVrj=?9"`]v~uqR$$]NY7!,> Bq ~&Me##BWd$&W}G4wjUQ-?(ݪ8IɞPJ v7rmwБ9|be^>RNwR?/H@z-C F#MT`365Wo-hswn(UT XNgoP9[FaNgz{Dzh'{X ȣ-ۿLkHv5$ځ vPIdZBp.6yF:m=oHfl|KyQjɪܪ=wZzgQ4>&3QDmpzV0ŸT giMA{VS=Dcݖ::^d`oE˃Yq{B7]-7# ܌^7%1VR_SarP(%+zwR;Y!4lf , 05mz @ Fri=S]kCX%* H"DQ7=k>c<^kF%~Z,۩Fxȴ?۲tH}*j GՒ։[,O 2ܥA5CjӇGag8NKc_12@LqXKu 7 ESڔ]Z-6Uhz`4ޫKBf;kϮ< ¡Zك˝+DBor)6Stsr{i/Ǟo[:i=j2Y95,S")N:8v!HiM8 [h^1{EloiP]%Wq牪LFI~4{}2"V._C9(: 2 8- \QtHAUCWhj{Φke1aBqqH) ٨gm.3&Fiۥ؊`}kX&>G:wqèS0bigN>2DI1:!#(]L+l@L=dKW(?KYr3E#4VY?صQDȋo<eO#|JlMCZ &?p^]% @Z M0T@bfn|y[+=Ņ&YU%x͢:@{_J 4e;_qw+X7:N@Ps֚~𗀘F Wkݶ!ŤޅE-m[ ?9wC哚LjnjB1y:Y0 'pefCMi_F{H*U}p*gT.U^7ʯ$Y--`J㢓JxP #C( t|Z&FTO Uʑ0g mK䖇ƨn~}K4Ѵ-x`Xi܋_oٿՇ'y.q9m_*sAזMS1`Ȓ Z- KQ5\ycrێCz]#.xԃ1-DV+}{QwaݣRkLҙz 6\?څpLGwXSeT>>v JV؎najp5VHe!o{5)0WuG?|Ѫ_|)KRѿg}9,c:SĆLχ /es=X>elW"`^ )RGpuUG%j~tfB`tufI) Yf=*`>6HOJ_e$)NN}p'U"x9h D6cH,tR}ʝu"{{GѧL#䁪lWǁէ2eAp\'I.C<}UL.s|Fu?0*|(G;=_7GTo#=ly+$eS7ۯ𚯢xLYmC󽒐 } wKlx#5B;H?揿xUC^^_.6 /˟W4xkK}gٯ:IF=Js31M{\+ZMADQ\¾M?f g(H=4 b1ȱ2G:/|I_%HEߐ;;CqkbE}S5^2KBN0J8&G?ʷV6I1INr A- Wqg7ɂ5;uc&97@%.t2_Te*x(Դ숩C[⥪#Z*MDPgnkkFd{F6GJXkVs2X |BUD[:՞zU 2!Զ7XIt"4o8,z'R#CIxSL4BD#ꉫC"'m\[ @b22C@w]ti}Dy(;-6>o4%"ٲmg C@ۀ$ԗiDޞEbb I,Jg 6,.Y~W');8B ۵MҐl*_\ɞȅR7Z1oaC pjBrФq / CŃ̫́.9k(fb@1̶!q<#cWR^~tX<^|D{+pV[A#\qWԹJ]J(c>RNF3G6|J*䵠-3?6J1y ˪gK-B#+N⩿*lډg[`q/16P=$`~H;ΏSFkƀp:Vqu0-5\$Z_ljo2D~<\@UmG =*a?/b̠x=%ԁX)go.hXFg3w1+nD.TZ~n1Um4΀^ /]BsU$z1B8,GzJ,\#&Yipt.@g!=P[(#E簥# Ll 6 ^a!RG9›<;\ DB)&ڈQ TJ]X&%'Q= 9"ɨB;WG@JDv2>B#dwU)F*Vr꘴4r hljQE6%sjM2Wl^ܶc,Ym/qiM蘔K|(M.qވ{ K H)[fYy7JF^M:*W.׈^KrC7"?j/̐~u!8xyK-o͝po2vSnx:l$/:ShѢ^!\QE[FBgx[@!O$ ѮߩPKoߞkj%Q^o%zM§=R7|-9ۜ~vai@-.+|KN/[oƗm·a '*_@0a~w}KU,?⫀+" ܾw["1;c>Q\pl8ݽjph[[m\l\%C;+W?Ge.Hn Ro[o2`6;/]HgҺJrȢ/q>'΁.v!<֯8"[H% fz 孛:\p3!wlC֡f9>'[C=!cQjI%Tke纊 4XO;?nwR]9pX {E5U=@Dd"71R41a^oiuIiK$ jcHp :uZ΀ILzzyrj _hJmO F6gF8%za dxH~T)xnX{Ҍz|v9ݻZ CZf]wY<֛KO}+b^'+g;Ζ݂;2Xt=87غZ̩VQk!+}uQ@J3Xh1@#Ȁ2Ohqѽ'F#q1x".d/sR};&&+w{f !KڒT}RZ*M6\刺v4<5őOajcg|~\IbΆdwUPBͶFg BKR+) A 7lzi<#yfnO٘JdMƢl4V+V !L+u8dψ;2|J5J, (e>8~4F,moOe,9VOO-ȧP44Z>^F8h[}J!{%sB`Q5ov鵯 圀RdYӜe=W*1SS*Cp6Ē9rӅ\/i" 篆]FԜQ-!e֔}xb8L[nDE ~'SZa!Lbo A,"0/"Jo2?|l=52^-}A2q =Qs-?XCuW>rh5(hTGhB~ $eY~ t+Yzbh_pOe(Sum$3 g/e,A:9r@QMKNf]=ߑόy[NB$zrsMTzn>R(`@v,c!=F3bd9j.}OklD:ʫAkǻx[23Z)x1!8_^wD Tz{􈒩FڨAͶ+?-/IUB}FpޜiﶕPJH=U=1Li8I]:r{/kvJ"a+򂧾Vip ZIa;1XT%ި˗H%_>W'>}u>}U$-o >~~SOFϞb}}W^աE_?U3ӿZ!|߃k^~6WO?iO>kptm8LH/|2ԘV3qC٪?vƠgD HR =WZK[>I_Qܠ.-P4 ILpqxp )i'Y !ɚU{fqcw VJqq iZBpIF1Uze%_TK$, Q)cҧ%}= 8_ɲqT ff]ւN,N`5Ma@0["4Å+ÉkB܀oID4̕ & fl:ⓗS9(@;/ ;`r gewo(ڎQ2NRla4e*FD>^| %nՕ8 h&&%Xfr,30w!I1,d;D?g7b!dER_}\LJ|a40r2r:^SqNJ$ 3Z>s`z!!lCG%^nPplMԜ+U7uBtؽN}f%.q+/ЩDCD+*`PЀK1^c$nrLwRYn=ǥϕl ő%S֖Crbe$-lmgJ}^$x&(X7kٻiNr5@+N%=t&ˤ٦61O]kfbQRanT'6afdiWR~@'G.h_.,SMR3Q͇$p3k%u(ONhmŁg}NYo]\8u;Ĉ~L!e&HVAGe7Ma^DwX%3Fqw7D. e M=xhCk6g2}j b@j nA} A˞B@\k?GXF*ts~=|[IcWg1oK͠ )q6=x68I|iDGD>W&MEax5SҪTh]pBkJDi׮g^f-ʃoCpQ$K4+ة5Or[7":8B."mf{JWli~^t%O_A_nG-'}RR13az_nlQ2ս&ۄa{ 1׼!shiDS;D&ǥF,QHl28qre;Mf.XGl@P#.A,4Nfu i0¸:o)(^tmt"hi$dQ[x7c81 8#4v=(.iS k!FW.dxp_\wY)(-۵0la$NYt&&ʿU01wU 𕾄oFG [ᘸ25Je'E-YgDX~xr YME`=88?(E{wxiF.e9"MŁ%6;IK<7%dWEsP;#5A |Jcwu(a<3:E a}S̲;Y0 3<'Jt]߫}"Y('zƹ_~4Ǡ}=tG! ;ׄ r:uBHj] &S')czݗٻZ-*%!as ![+ܖUY/{h\ >jt33+?ÏfџAz=>qlC-k#sdei4f)GB ) bbiʘ˻gMeo}TV:칆3 5YBl$t쀑 ہ tعOT-+~Qq )PP TnVlfo)aX_p+&"kcNlV³X2#TEz}pP E6k/vNZpwO5"AL_N NYPWn^y\K`9 C#]V ` z|zBȖԇX87x[گ1tj~ kI56=?yTCr~:HUK}_N0~u1M/~`/Gm̆_ō!vwIW؏;tl{ \!ಛ;*̆x~_KZRGbUGXz6 xMW+VK}"dXI`$s3|(]ݑOy+L"$уUIU+bOBؒҞ`\Ý vW+Z3%"ITݪ!/Gz<#!ص#<Hx7! cE/Oyu|yO<=3NӢAKTDW,:vE/w0lG~@@\R> 'b?E.(S |jYPD62$[GZ[fz0c>;_BcFqo%eafGAIK_fG]3[,+L}4Ѣj[=#WJ P|'Q>%ɝ *<5O"g^wk? ss$~d%'PP4uBn(RTQ="P{f!hpz* oj#V1ϕb: jt;%"<j%6:F:Vt0 V@M9XjRnOU UQ;$40pbE!GSNP\I4].<"I IC P}nϘ]ϻ4\ͺי)_vJcנ @%je v`_ Uj#>o`H12FꖹSx^2Ň!=%^E#~?l3sX Fdz!zYk4hlk~d`4ߊ%&לLv|x`ʬ¨BVћ#$7&kjJ"j#z7cHJaePDv"gozELK VΎ-€'%Q&hC" %ŤFFguaR % 0ǨQp&_'mE߭~Bh3!Sa/s]:aRjRfwwZl+,6\ܾă[N˕Q԰J."`$D X:SR!Re^DT,.`1L\&oHD-_=ux=9xgXaaʇ 7>79ph+Ԅҏy·GV7YHX3J#G׶ErG(2Y-:ApP`G?7"+ƪ^WAۖi#B*r Њ(?<Ub>͸LW BJd٪3[W[q!4{%쐚ךj/ֵ$8<56 SZ^9ui"Eplj CtHz K+ȓv:㲄yc!$PcGX5/<+tfYľȾ;˧0FAKSnnnJrQڼ˂Ґ#*P\9 Xx.,Eq. 'ܪkpid=5ލO7ѱUfs"M2PZ`fEk>)| j̥@;ˠi1(M8և4yy Y( RV"N7FdZ*iV6t {a=n8XJ$4/CQQsMv 4]kIDJ;KvfepZfr3Azz8nCje>Ѹż"=b}ˤ ̉c2X+ 4DV60ᩥx"+0׈Ǩr$Zx{mB]) caVZt'0{EMA!c6m ьҼFQ T;RvVJ'"I&Q윢UC0+z3E7v]nw32`I U>w"ɳ%n9X*sX7Ž'^xkSC`J[:5X̝ӠGH5jx${mh ~0Uz{z얹|e"L {.o߳|<-y|~B>eŌĒ.fyɝN"FбU@-D<^|dL/Wava&_CbL/?cs/3_enPf t!0g2 ^T M8T}o:I~k7۔Zсv=Og)$M%/UlHn4Ǘ{EԚ%fMO!.S&**N׷djQn3#)WW0TUHa;aYHhK P,zΈ7/v*@OƓ=W_e"W;0V|t.}Mq zb6*-{)xvF̕bܮ,8ur3~G-*tL̉ml5!]1U0(gFdqWKRR d;e~zi-ꆷ,8H{2Xlu< uUjan+O3qT`'ޭp4i&&o9{)d\݂$T*9X eBzx6-vV3{j2V,B˺BvB;. ZF/.R6ZB0>5xB6;EX]Pޚ\*(;.n_t<5  D% vf]AyA7ŊиqnU884ΊR-'l9|hxk.%,#õ{e ievҀ4|ʃ-9ZLbR\IgNB¾bՑqu9Y֘ SP_|FN_vU X6B,֠;-t뛚qRDKV# =n4ƙ}*L= .w AQ+xA-!JWK "ݙ{)1BGP3 46fz8 meqM^6})v5L '8; JF`r\h=:KQq72${ฎ=ܨy;y|m9jgKP*2>YBm=XPN ecQAf$0fj0 @S/X1F׌x3>w*D(Oz. -X5ҙJ|X2KgyA o+v ՛ƨP߬ȣ[zy9lNlmwMo5*y{1ڻ{%u5x(3 - ?1CK"' 7Au (SΠ"n xibIl?cJS)!fT ^WMJ`YMi:I ÛULB`[Xl @).aBqߒ]s Y[\;/.`\pM[ܟjX3Ӂx<-*B}.Ll  W(㑯ʩ-IOZE 5NCv*GYc^$bnN_7 HY@xe\8eH"7P4Q `\48P$z0!6`>Yf#D3a,ۋk4tteJZSaݧTu8*Ey怉OzГ##LtR]#drz"|,&|7̚_*L.\4D>k2,Y_Xsk/xȠC^P:oP*Ki06 sl1`C 'n*N1!%y#b6ӿS\%U.mhdL[2k1F">~< ]-]=鶟6z9KBj.Xi nuQ]no 32dz,Qb˪ [Ƽ[ʋWQdFU*HcHYhBzHћO( t~w6tF촊t0Y4QKR L*t*zm xkx..]#գ%/2|%*/dTTB\-f#' Zo|Ti$H'>[Rw#:uWɔA`\1 uL[i>H3x Pf:A*E8pwAB(9~rڻ́pAǃ 5!ecO:ɦ 8%Ar ߄eو9M(N%X:3 |wKNʟ$iLziczޤhʳioĊKt33ɓVp j&}AeDK \`HQ,\`}iی+&'ަ`誥waHW+K4/]h?Tݥ?Iesa*"1z7K!f~A &췃譲;a;|=MlTLW7Ql|rYch$/ex&`[D$iOVS?Hēk$`ɿ 1C1Mpv謩˓";ԡ%3>1f|9} ^!0 Ɨ[(;2 T^ZCB^M:мBXOO5D8j1p^[˺m =lo'ZPI-I}hz@fԉ *QΜ܋6VJ +hEuGjó1F5%o"*ٲ>qYaKKA>,𓵦>VCĝȀ_!͓is/z*nqEQ28 ;ba7Lfȵ0_Փza9Δ>-؜f,*wfл2m_^L$/# 35@>t1n s)+Ca~4Xn!Di q% <ϴ+(oLwCh"wAQ/Saq>zt} wʹG#aPh:ˁ\C Px ؖxi-ƶ5Dcǝc&㄂0Ü&8(iX'5NNΞ,Ƒ\ glcclq(jإ|ݸ;!PWSV.-%0I^|7V=FPz}W5"?!;4tIUq@:Ő\b I:]0dR% 6HTʐ2-|G܋{P앲7˵BDFnsXJyX{hI~n&OUlr[ecN 5?id.y@2;r{7ug=z%`qҎik?GuXe.ѱʃpX{G7̧ }Mw 'ܿo~yEI?'Z\ gf_-\>GV\UGxSFڦ ͻwT^woQX'>xLA\O\~4Ss|}wv'iZh(wec*Z$gq~[2Q=WXQA᏿s ZL1Kb֤_BCl=[ gOLwf-zPAJFuuB2޲~8=/EF&DޛÉ?-#8E>d /@뚯Sq7sGn@{ [!NS2W/oI }ckwqGy{#!cvwEp8:0{#w9 ,Q;8|]ɘ+g]J~ϦC37kDb"LٌATJ\ڇVt>^޿c<N=G'3qvoL>kag@x0 DL(dE&k*'i z*c GBq/u 6^LC$\鲅ʰbŰa*woٜEq7MSHy HOV/ԒX z6i5Wm.blOV$7(.0QXC4bNRiN,k<؂Gr,]q?j<4N[#mC"2M+M{Xgмπ42AӇs<<6 *(;@W ڬjP Ͱ6vM]Qpφ[@Z(f]&:'^(4/߶Pғyz{ZXN~ hGt!!㫰5En.D%Kdo 0vܗH+Fx€K!sڟ癀` uI0ar{/މ⟘Rm9?goJl||҆(ڠPcØ?ĔΓ>dfjI}HuUx<3MEp ?Sh},֧eQʫE>5,_К/ߕKTL࣌#oeMYEݡe' AEC*#gNP3  ߽E7z3D2ZwӋ3:׹e$/Tk0؝˴j%3o>ȯIW<û$_6aR >@+0%P#Wped-~`,:߿XYvT.MnAW~W>}[}ToS߫A'.|95 h4G긿VL*}|Vw|'пգϱ8?}e[oϴһwɤ>V\4xkqqn8R88 ~Zla9-gyX;|nUq3w`⸴A&<A(Ѝ/gs9uk6]-"STEr1Mi2=KaO%kzK2tDzSym {?R=`6WD3j8MB|#q LzeF:J*DIbSkP3y:6 ܎y.cÅ!t0A|a3R52>>E%kmztb6MhiqB6_8TQ}/ש tP3nvݠHk r`W4BJ?hX zΣơ|+q*JgqHAek+St~\CKڤS vk ;7|yn*Y[~`lxS-x/W.!(Ikɰ˧R_X ?4DܰJȗG*%^zZVeh&¯ F=BA8kfLpJi6 v̚!?i2w`B<(z^f4QU ͝r{5NË^#:n 6̔8.Iòu>>\Y!Ϩ;ږ6VMѭfRR(k^טO*!Kurz)KFw9p۵A̦j(󐲭LA_tO(lANӁK18/ejF}ӹ(DϺ[ILZf'& eIu-(Ioe|p 4TGȑ<H`?SFY$eoρ>SU9!_.us[iݛ#Ȏ˛ϯ[R C~ Rqs݂]ȭC0nnMDч @rqhFeK}91!A?_M"хw=r'@o;UOۻ"w_2eFt/-t*YGHFzP`Y]DtoQ>)f($)SI1tnA8yfhZ~DC8Y~J$7a>2 RK,/Yb0z_0A㦗>t9­65]G~7Ի96a@qS8yOF`a$rx{a5X #w50i&A\YOBy[ ZLL˞~G)SbʜJ}%>q,5LE 9u.NŘm-R0uG8B-C|.C0im{^Ms]"qj͞}C,O3Lak-OݑqM9("A@r_ (SK` _ '4pSZBG0.\(Gw]Gkj4&<7`PH@lG*,ۄa{ 1׼"umy2K>ϧ u7L9Eżl.rgd /%)?y붿uIQUns$BdHM$!l5gyi>,TCԅPXQIRQVrI p;WĐö L$S~85J>5sW})9$ig#8 Y6]rP]'IpXh݋4\]pͻAiٗm-aOW5"-Ȭ fj~n^Fs9l3YV!dN#j2E21/apͫ9$*~ECW3yK=Yq?A U吚aG ҧ.Pw;$sd!24̏:KlBf.;{6VuX~^~;1{9~4ئ^u &< Ya&XWG,+)FrB Fx0U=GSsIqf!_)hAD!쏃|?pQ!ÏfџAz^E~UPhAL3z'` YRrBɳQU 8@d \` 97@LԦص)]ٴ# 4uvbn@9 Eq,^lSsby6qXES(jE|z!0𲿿K5N߽BPSgt#5s:< tj%%xOTNWmk6 me,<ߐi9l~nI #Hy6? ;5:u62T<?Bqx <'ɣF~=HZ7g!}[6ĆUGLշQ=jY#8-Ԓb (khK*,mZR/[d_~ŴX ӛfSv;?M27UHHTFk#d YS7\1G$Qr.:Tȃ[7TU9[ꧨJݶuX JXN81‚+"y?O*_u[h #v,9*aISo8:%DPVؖrWeLkեT3/B4~qF|]Y20!kFv;oy@^iB]K:-8D}2T\Ã; 4qud5׳? y$hUbg?󳊰 ^5vZ>%$.9~ELlP6mjK%@N AD~XoϘdҵD=aI_JwVr^Y,X*ڰ}$q=XUW7h-(s`숢6H`p'[i3(nqY"K b#s|Gk$fEL&ʄ`GgzhO ]c 6fGX%̅VLS??zAAN=FK!ę" 8fTh=㕻:]>GvjCIuȽ|Sx;i7ފ'\ɫ>B~Hn_y1OKAX nK~^gN9+%fr?W~?Kq!Cj7K?eڐs\*!&q˷Ne*ȮO7cؔP9\Oۗ=. nr[pSI3(n;l9>HPOf2¹Bs ^m${9[\"ED%PΓLsНIRt!xb'=u^Zdjj6l0*K ]Qݸ26?w@xWT+7B[pMKYF–}@X?3)܎0'uǦs\RUY[.]hrܠd59izTTy/Z0ѮLZ_]]I"^cCv&?Qpf?(n k9*(=iB9s5 DOL?U$%iPɖ_8{ s@nv~!n yOHkׯ#OcF˵|?1 chM| h)pRR jO@ePko>FHOl4e߽0?q$Za iPHo}CM|M,ă_]lf=,mb˝afX|zPh$tCh>RBf,;ٸQ@,g+5" m4 V\wTxcך͢꫆<"~4ygo}YbuFRUdF Vy D}[Lfd( ڎoOg_\oMN{mlݸ$|#Q'ۏ6@iQFw^_ȌX[.Q8:% :\^Ś+|_t2*"4֐/gUnOBVޝ u Gp7ȐyךmՇT=ByY { aR v!)X 0iK\5fU$c ,Cŵp=VY2xk">]dn4ݚa`Ҭ)l!tHC/5>B_Zx{mB 4x '^.b9yޚ7弱bOZQmCӐ"٥?WT=Ec4D!.)Y4HP3ǥethZaԹ'Lđ7Ta-H>son`d[P؜z\E5rUk5%^wZ zU,84o pumR'iXtox24 xĉ478LUM~E;2/xok{k*NO8[s9TW0MYXܵGZ˸0v@c۬!M*ZX/3_enPf l;!qƓ ,zӼZ@TBS[u~](q0YBf[Kȝݖ6An]gF h$'*76+?HI:Y %K0ɨCeLzbye+\V-֨|y`2P~d΃agĪ鴈fӁ^PI1%?1D>H<9ۮPuZzzneVQM)4$!݁z(Kl?`p q-oX $yqBɢGL㆏;6ͳ.YFoؕ*}_yL/Z{aݡ !P =S<0|,>RϋQĨ/۔L֯ryi+q3`7۝̜!b EVk}_zGk_? ާ| WLJBnTmzXv8΋O LH N w3o)|]1w @{!'xmHo^Jx i1B˺.2~; EF/@ #J@ 9>kvv_$MV5-:"m z2!%I}\S5aTgCP|F˅\:?EEIE6(~M mOĹ4ի{$!&;r·ŴOeeX^%Meh/)8or9Y֘ T,˿[{7X IWq6@W^l̆_$$MBx})]A5( c7_@A@-9 Z! Y.,#PvyCcT,8p۱J|w6l3B#PK}(B l͕deWE-QO][(ioXNr{[ܠm_O4 .y1VELjՕ\1C2o%}ȭ!N/C'}&C֛GAJ2àD GiZ _ujLSu$12WU?Fe{vqGH8!Wۘs.XZT|j b%}s4/nA*zuH:(U:ij7=+_}ƶnH"|4<ӘfG9,wR Ta\>Y&'-(`.f (ж @wϴxFDaЏRofbDd.؜VZKi @:}|gz pѱHu` bEͩО,/{@xʊ5!%y> 4):>GHjp)l6~ij@~g>ܝͦ^&yʝ#(_3gE[8u?O )d2'׍N$cгWc A,qBoWpEb|Cmx2wZS4sbnө ]KWJ1@]VqiUi7 [so|VtVܬy:,_/#AEXJw iVVRri4=Г⎥P1kKQv#ӄs4Ge7ӖmS|>^NyYi*΢5j':&(&<Sv yr"K Ep.4R%򭢺Ӹ^bѠyHa5P쎵%z܆fXư?[ |=lݭQv0KY=FKW!33EGa[+}bkO; g/gn+#MgH W춧ͮ..@$ CN*6I:*IӱlXi"&|K+ h7os^8kٙS @ّpr`+#:Y?EC@=63 }uج*1g ro3!yj̑HX\K -N xAF\]IFO5Q^լ#i!Z9ǥhSe0yI7V9Wo-1 +<461Uu_0?>aC%#|xh+V`~YHJC X|<{azt#qm=/&`R>ChdomGP;MMjg2x_ csHB|p +;9u>o8~T玀K3t>DYS1yiP: x^*\f}h8TU#?g}~NSE mn‡8F uoאaJЇfI֡ BZ(~iJϖ{:Pi@FMp4,|'`zK/<>1Mxj޾@Y\B;W%l#Rb"-T?13n|&+1cH!"(bb/ bF4{m>k˨[8erK9~'Zś(__xwQЪdr2Ԑ16ƞhiQ/ {G b( eQ84c3af;|4Kz "{vsATJ\zRmq'*y־9{Hڡ^]N 'h]0fU5PАWVJ2e4X˄6^Go1ij'k|!R uCɧrFZ (^@("t~m@] ΢fr3&j՝3}˵^療y"3=n!B0iGPym#%?f?.6Sq厚eRXm8R!_.] vkz]'mӱ{ `&DMW`m,w \? T[Vs0[s.j&҂s vqg>w#VCC,՟?-ۙxnl4Q[FWVm);nmC6r:@a㭫EChr!`=P)J7M&@I ,WG4AF0"5#O5f 1ۻp t5t/4&Jٜ&0f;_㛖 HװWw\bV?/?=CGٜk4Go?=?NQ_S1?%XT>GVK/i<޺ӢҖ`-rA!l$:I'RKYE~j/#lI n0D hh_Gѻ$ЋxE^vO0jlDt(SOAڜ?b- q}FbouHfpp2Ji}dj~/ ~Fxbhɝ.rQ;,oBx;%2WUZ1Nۇ Zq𝒂h6YFrec_|q_)Ĉ"g(AI}BTKb5ns/1T-w=ge ) ucz%~HK* L!B3lX,oq Nx'<dYEǰOv%n{ b5ġ3Md~s=x`.NXG \T`+RKɹgAUD@ӻ c ,>xzYU D#%ϻD)!_V3p\r;o"_(nzGa!(nzGa!(n~!(p"x\W+YIK 1:&J: Ao[(|#jZ-H2 Kހœb%y׻`|SrͰ \5o+֥PKk(}}?3H< AˉB~-j2گIM6B8fXi "IT^H?BnH"t[9?i~w(^ _s HdZUx") LjLԜiz~}%&;ȴ O\C twHJg "žۆʨz" "(ph19=vn%z3|+_I$I$I$L)j`%p)vܨF}qI$xڴ-1d*Z)?bٷV{n.{0nZ~=e!i@PXq߁f8С`Khd={-LUoxP={}x=NXrL&Vutޱ.X.қO^FQx  )u]@,! 8rп-݃Qc {'jXM_G48RB(׃fb3!Cxs6.14*8+9,9,`Y;QG"?3@36,:-:-;.;.rmT[S0@4A5 B6 7-1jdG{þoJ@B5 B6 C7 C8 9/ =0>1>1?2?2@3@4C7 B6 B6 C7 C8 D8 E9 E: :1 ?2?2@3A4A5B5B6C7 C7 D8 E9 E: F: F; G< =4 @3aA4B5B6C6C7 D8 E9 E9 F: F; G< G< H= H> ?5 7( @   S{}}}}}}}}}}}}}}}}}}}}}}}}yK  %))))*****++++,,,,,----.....+ ()*****++++,,,,,-----... . / / / / / ,K***+++++,,,,-----. . . . / / / / /!0!0!0!0!1"y++++,,,,,---- . . . . . / /!/!/!0!0!0!0!0"1"1"1"1#}+,,,,-- - - . . . . .!/!/!/!/!0!0!0"0"0"1"1"1"1"1#2#2#2$},- - - - - . . .!.!/!/!/!:.[S:zuameORH-:, 1"1"1#1#1#2#2#2#2$3$3%3%}- - .!.!.!.!/!/!/!/"0"XP7~mokeN9, 2#2$2$3$3$3%4%4&4&}.!.!.!/"/"/"/"0"0"4'mfPu7)3%3%4%4&4&4&5'5'}/"/"/"/"0"0#0#0#?2woY}zf6'4&4&5'5'5'6(6(}/#0#0#0#0#1#1$NC&}vavq\6'5'6(6(6(7)7)}0#1$1$1$1$2$2%}vaqmV6(7)7)7)7*8*}1$1%2%2%2%2%<0l7)7*8*8*8+9+}2%2%3&3&3&3&LA"¾8*8+9+9+9,:,}3&3&3&4&4'4'^U9>2 9,:,:-:-:-}4'4'4'4'5'5(|zfOF$:-:-;.;.;.}4(5(5(5(5(6(~SJ);.;.1 1>1 }7*7*7*8+8+8+]V8þ}=1>1>1>2?2?2 }8+8+8+9+9,9,MB uqX>2?2?2?3@3@4 !}8,9,9,9,:,:-:-c[?QG"?3@3@3@4 @4 A5 !}9,:-:-:-:-;-;-;.leJJ@@3@4@4 A4 A5 A5 B6 "}:-;.;.;.;.;.<.<.1}he`@A4A5 A5 B6 B6 B6 B7 C7 C7 C8 "}0>1>1>1@4 YP-xt[nWO*A5 A5 B5 B6 B6 C7 C7 C7 C8 D8 D8 D9 #}=0=0=0=0>0>1>1>1?2?2?2@3@3@4@4I>B5 A5 B5 B6 B6 C6 C7 C7 C8 D8 D8 D9 E9 E9 E: #}=0>1>1>1?1?2?2?2@3@3@4A4A4A5A5B5 B6 B6 C6 C7 C7 C8 D8 D8 D9 E9 E9 E: E: F: F; $}>1?2?2?2?2@3@3@3A4A4A5A5B5B6 B6 C6 C7 C7 C8 D8 D8 D9 E9 E9 E: F: F: F; F; G< G< %{?2?2@3@3@3A4A4A5A5B5B6B6 C6 C7 C7 C7 D8 D8 D9 E9 E9 E: F: F: F; F; G; G< G< H= H= !S@3C@3A4A4A4A5B5B6B6C6 C7 C7 D7 D8 D8 D8 E9 E9 E: F: F: F; F; G; G< G< H= H= H= H> B8 A4CA5A5B5B6B6C6C7C7 D7 D8 D8 D9 E9 E9 E: F: F: F; F; G; G< G< H= H= H= H> I> H= 2* (0` %5CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC5c $$$%%%%%%%&&&&&&&''''''''((((((()))))))# S"{())))*))******+++++,,,,,,,-,-------.... . / / /S%1))*)*****+++++++++,,,,,-------.-.. . . / / / / / / / / /  ))*****+++++++++,,,,-------... . . . . . . / / / / /!0!0!0!0!0!%5*****+++++,,,,,,,,,----- - - . . . . / / / / / / / / /!/!0!0!0!0!0"1"+C*++++++,,,,,,----- - . . - . . . . / / /!/ / /!/!/!0!/!0!0!0!0!1"0"1"1"1"1#-C++++,,,,,,--- - - - . . . . . . . .!.!/!/!/!/!/!0!0!0!0"0"0"0"1"1"1"1"1"1#2#2#2#- C+,,,,-, - - - - - - - . . . . . / . /!/!/!/!/!/!/!0!0!0!0"0"0"0"1"1"1"1#1"2#2#2#2#2$2$.!C,, - - - - - - . - . .!. .!. .!/!/!/!/!/!:.[R9vq\d[DJ>#4&0"0"0"0"1"1#1#1#1#2#2#2#2#2#2$2$3$3$3%.!C, - - - - . .!.!.!.!.!.!.!/!/!/!/"/!7* VL2wr]y{{ztnqiSXN3?21#1#1#2#2#2#2#2$2$3$3$3$3%3%4%4%/"C- - - . .!.!.!.!/!/!/!/!/!/!/"/"!f_G2$3$3$3%3%3%4%4&4&4&4&5'5'0#C.!."/"/"/"/"/"0"0"0"0#0#0#2$\R7x]T:3%4%4%4&4&4&4&5&5'5'5'6'0$C/"/"/"0"/"/"0"0"0#0#0#0#9, meMmUL/4&4&4&5&5'5'5'5'6(6(6(1$C/"/#0#0#0#0#0#1#1#1#1#F:yr\{fOD&5'5'5'5'6(6(6(6(6)7)1%C0#0#0#1$1$1$1$1$1$1$C7yeze¾½I>6(6(6(6(7)7)7)7)7*2&C0#0$1$1$1$1$2$2$2$2$VL0}i{:- 6)7)7)7)7)7*8*8*2&C1$1$2%2$2%2$2%2%2%2%f]C~jJ@7)7)8*8*8*8*8+8+3'C1$2%2%2%2%3%3&3&3&3%unW|ZS68*8*8*8+9+9+9+9,4'C2%2%2%3%3%3&3&3&3&6)|hkfM8+8+9+9+9,9,:,:,4(C2&3&3&3&3&4'3&4'4'D8}ÿ{yc9+9,9,:,:,:-:-:-5)C3&4&4'4'4'4'4'4'5'TJ,|:,:,:-:-:-;-;.;.5)C4'4'4'4'4'5'4'5'5'pjT:-:-:-;-;.;.;.;.6*C4'4'5(5(5(5(5(6(5(o;-;.;.;.;.1>1>18-C6)7*7*7*7*7*8*8+8+H>E9=0=0>1>1>1>1>2?28-C7*7*7+8+8*8*8+8+8+>1 >1>1>1>1>2>2?2?2?29.C7+8+8+8+8+9+8,9,9,9,>1>2>2?2?2?2?3@3@39.C8+9,9,9,9,9,9,9,:,:,ZR3}{d?2?2?3?3@3@3 @3 @4 @4 :/C8,9,9,9,9,9-:-:-:-:-:-bZ=K@?3@3@3@3 @4@4@4 @4 A5 ;0C9,9,:-:-:-:-:-:-:-:-;.;-jdH¾pA5 @3@3@4@4A4 A4A5 A5 A5 A5 ;0 C:-:-:-:-:.;.;.;.;.;.;.<.0|ybPG!@4@4 @4A4A5 A5 A5 A5 B6 B6 B6 C6 B7 <2 C;.;.;.0>0>1?2VL)uqWiTK&A5 A5 A5 B5 B5 B6 B6 B6 C6 C7 C7 C7 C7 C8 D8 D8 =3 C1>1>1>1>1?2?2?2H=f_@nrZS/A5 A5A5A5B5B6 B6 B6 B6 B7 C7 C7 C7 C8 C8 D8 D8 D9 D9 >3 C0>0>1>0>1>1>1?1?2?2?2?3@3@3@3@3@4A5 RI"B6 A5A5A5B5 B6B6 B6 B6 C7 C7 C7 C7 D8 D8 D8 D8 D9 D9 E9 E9 E: >4 C=0=0>0>0>0>1>1>1>1?1?2?2?2@2@3@3@3@3@4A4A4A4A5A5B5 B5 B6 B6 B6 C6 C7 C7 C7 C7 C8 D8 D8 D8 D9 D9 E9 E9 E: E: F: F: ?5 C=0>1>1>1>1>1>1?2?2?2@2@3@3@3@3@4@4A4A4A5A5A5B5B6B6B6B6 C6 C7 C7 C7 C7 C8 D8 D8 D8 D9 D9 E9 E: E: E: E: F: F; F; @5 C>1>1?2?2?2?2?2@2@3@3@3@3@4A4A4A4A5A5A5B5B5B6B6 C6C6 C7 C7 C7 D8 D8 D8 D8 D8 D9 E9 E9 E: E: F: F: F: F; F; G; F; G< @6 C?2?2?2?2@2@3@3@3@3@4A4A4A4A5A5A5B5B6B6B6 B6C7C7 C7 C7 D7 D8 D8 D8 D8 D9 E9 E9 E9 E: F: F: F: F; F; F; G; G< G< G< G< ?6 5?2@3@3@3@3@3@3@4A4A4A5A5B5B5B6B6B6 C6 C7 C7 C7 C7 C7 D8 D8 D8 D8 E9 E9 E9 E9 E: F: F: F: F; F; G; F; G< G< G< H< H= H= H= 90 ?2@3@3A4A4A4A4A5A5A5B5B5B6B6C6C7C7 C7C7 D7 D8 D8 D8 D8 D9 E9 E9 E9 E: F: F: F: F; F; G; F; G; G< G< G< H< H= H= H= I> H= *$c@3IA4A4A4A5A5B5B5B6B6C6C6C7C7C7 C7 D8 D8 D8 D8 D9 E9 E9 E9 E: F: F: F: F; F; F; G; G< G< G< G< H= H= H= H= H= I> I> I> >5 {A4A4A5B5B5B5B6B6B6C6C7C7C7 C7 D8 D8 D8 D8 D9 E9 E9 E9 E: E: F: F: F; F; F; G; G< G< G< G< H= H= H= H= H> I> I> I> B8 1(@ B################################################## y m A#()))))))*********+++++++++,,,,,,,,,---------........./ .!33')))))*********++++++++++,,,,,,,,,---------....... . . / / / / / / ) ())*********+++++++++,,,,,,,,,,---------..... . . . . / / / / / / / / / 0 0!!o'E*********+++++++++,,,,,,,,,---------.... . . . . . / / / / / / / / /!0!0!0!0!0!0!0! )*****+++++++++,,,,,,,,,---------.. . . . . . . . / / / / / / / /!/!/!0!0!0!0!0!0!0!0!0"1"**+++++++++,,,,,,,,,,--------- . . . . . . . . . / / / / /!/!/!/!/!0!0!0!0!0!0!0!0!0!0"1"1"1"1"#*++++++,,,,,,,,,,------- - - . . . . . . . . . / / /!/!/!/!/!/!/!0!0!0!0!0!0!0!0"0"0"1"1"1"1"1"1"1#2##*+++,,,,,,,,,----- - - - - . . . . . . . . . / /!/!/!/!/!/!/!/!0!0!0!0!0!0"0"0"0"0"1"1"1"1"1"1"1"1#2#2#2#2##+,,,,,,,,---- - - - - - . . . . . . . . .!/!/!/!/!/!/!/!/!/!0!0!0!0!0"0"0"0"0"0"1"1"1"1"1"1"1"1"1#2#2#2#2#2#2$2$#+,,,,,- - - - - - - - - . . . . . . .!.!.!/!/!/!/!/!/!/!/!/!0!0"0"0"0"0"0"0"0"0"1"1"1"1"1"1#1#1#1#2#2#2#2#2#2$2$3$3$3$#,, - - - - - - - - - . . . . .!.!.!.!.!/!/!/!/!/!/!/!/!/!:-ZR9qkV[Q9A50"0"0"0"1"1"1"1"1#1#1#1#1#1#2#2#2#2#2#2#2$2$3$3$3$3%3%3%#,- - - - - - . . .!.!.!.!.!.!.!/!/!/!/!/!/!/!/"/"0"6) UL2vq]z{{ys{hh`HOD(7) 1#1#1#1#1#1#2#2#2#2#2#2#2$2$2$3$3$3$3%3%3%4%4%4%#- - - . .!.!.!.!.!.!.!.!/!/!/!/!/!/"/"/"/"/"0"4&PF+qkVx{{{{{{ysssqvoZ]S9D72$2#2#2#2$2$2$2$3$3$3$3$3$3%3%3%4%4%4&4&4&#- .!.!.!.!.!.!.!.!/!/!/!/"/"/"/"/"/"0"0"0"0"`YAOE)2$2$2$3$3$3$3$3$3%3%4%4%4%4&4&4&4&5&5&#- .!.!.!.!/!/"/"/"/"/"/"/"/"0"0"0"0"0"0"5) meNH=3$3$3$3%3%3%4%4%4%4%4&4&4&5&5&5'5'5'#.!/"/"/"/"/"/"/"/"/"0"0"0"0"0#0#0#0#0#A5woYC73%3%4%4%4%4&4&4&4&5&5&5'5'5'5'5'6( #.!/"/"/"/"/"/"0"0"0#0#0#0#0#0#0#1#1#RG+~wb~?24%4%4&4&4&5&5&5'5'5'5'5'6'6(6(6( #/"/"/"0#0#0#0#0#0#0#0#0#1#1#1#1#4(e\Bzesx;- 4&5&5&5'5'5'5'5'6'6(6(6(6(6(6) #/"0#0#0#0#0#0#0#0#1#1#1$1$1$1$>2tlUze~jp9+5'5'5'5'6'6(6(6(6(6(6)7)7)7) #/#0#0#0#0#1$1$1$1$1$1$1$1$1$K?"}v`zeze~zf7)6'6(6(6(6(6(7)7)7)7)7)7)7*!#0#1$1$1$1$1$1$1$1$1$2$2$2$1$phQ|gzeÿĿxt_6(6(6(7(7)7)7)7)7)7*8*8*8*!#0#1$1$1$1$1$1$2$2%2%2%2%2%3%xd~jsb\A7)7)7)7)7)7*8*8*8*8*8*8+!#1$1$1%2%2%2%2%2%2%2%2%2%3%>1~j}i¾xu`7)7)7*8*8*8*8*8*8+8+9+9+!#1$2%2%2%2%2%2%2%3%3%3&3&3&MC%~jtw8*8*8*8*8*8+8+9+9+9+9,9,"#1%2%2%2%3&3&3&3&3&3&3&3&3&]T9}i8*8*8+8+9+9+9+9,9,9,9,:,"#2%3&3&3&3&3&3&3&3&3&4&4&4&meLu8+9+9+9+9+9,9,9,:,:,:-:-"#2%3&3&3&3&3&4&4'4'4'4'4'4'|u`1>1$#6)6)6)7*7*7*7*7*7*7*7*7*@31>1>1>1>1%#6)7*7*7*7*7*7*7*8*8*8*8+8+}g=0=0=0=0>1>1>1>1>1>2>2?2%#6*7*7*7*7*8+8+8+8+8+8+8+8+uf`B=0>1>1>1>1>1>2>2?2?2?2?2%#7*8+8+8+8+8+8+8+8+8+9+9+9+|ydLB>1>1>1>2>2?2?2?2?2?3?3?3 &#7*8+8+8+8+8+9+9+9,9,9,9,9,pkS>2>1>2?2?2?2?2?3?3?3@3 @3 @4 &#8+8+8,9,9,9,9,9,9,9,9,9,:,QG%>1?2?2?2?3?3@3@3@3 @4 @4 @4 @4 &#8+9,9,9,9,9,9,9,:,:,:-:-:-:-YP1m?2?3?3@3@3@3@3 @4 @4 @4 @4 A4 A5 &#8,9,9,9,:-:-:-:-:-:-:-:-:-;-:-aY0>0>1F:tpWiG=A5 A5 A5 A5 B5 B5 B6 B6 B6 B6 B6 C7 C7 C7 C7 C7 C7 C8 D8 D8 D8 (!#;.0>0>1>1>1>1>1?1>1E:c\0>0>1>1>1>1>1?1?2?2?2?2?2?3@3@3SI$rnSw]W4A5 A5 A5 A5 B5 B5 B6 B6 B6 B6 B6 C7 C7 C7 C7 C7 C7 C8 D8 D8 D8 D8 D9 D9 E9 E9 E9 ("#0>0>1>1>1>1>1>1?1?2?2?2?2?2?2@3@3@3@3@3@4@4@4G;[T0C7 A5A5 A5 B5 B5 B6 B6 B6 B6 B6 C6 C7 C7 C7 C7 C7 C8 D8 D8 D8 D8 D9 D9 E9 E9 E9 E9 E: E: )"#=0=0=0>0>1>1>1>1>1>1>1>1?1?2?2?2?2?2?2@3@3@3@3@3@4@4A4A4A4A4A5A5A5 B5 B5 B6 B6 B6 B6 B6 C6 C7 C7 C7 C7 C7 C8 D8 D8 D8 D8 D8 D9 E9 E9 E9 E9 E: E: E: F: F: )##=0>1>1>1>1>1>1>1?1?1?2?2?2?2?2?2@3@3@3@3@3@4@4A4A4A4A4A5A5A5B5 B5 B6 B6 B6 B6 C6 C6 C7 C7 C7 C7 C7 D8 D8 D8 D8 D8 D8 D9 E9 E9 E9 E9 E: E: E: F: F: F; F; F; )##=0>1>1>1>1?1?2?2?2?2?2?2@2@3@3@3@3@3@4@4A4A4A4A4A5A5A5B5B5 B6 B6 B6 B6 C6 C6 C7 C7 C7 C7 C7 D8 D8 D8 D8 D8 D8 D9 E9 E9 E9 E9 E: E: E: F: F: F: F; F; F; F; G; *##>1?2?2?2?2?2?2?2?2?2@3@3@3@3@3@3@4A4A4A4A4A5A5A5B5B5B5 B6 B6 B6 C6 C6 C7 C7 C7 C7 C7 D8 D8 D8 D8 D8 D8 D9 E9 E9 E9 E9 E: E: E: F: F: F: F; F; F; F; G; G< G< G< *##>1?2?2?2?2?2@2@3@3@3@3@3@3@4A4A4A4A4A5A5A5B5B5B5B6 B6 B6 C6 C6 C7 C7 C7 C7 C7 D7 D8 D8 D8 D8 D8 D9 E9 E9 E9 E9 E9 E: E: F: F: F: F; F; F; F; G; G< G< G< G< G< G< +$?2?2?2@3@3@3@3@3@3@3A4A4A4A4A4A5A5B5B5B5B5B6B6 B6 C6 C6 C7 C7 C7 C7 C7 D7 D8 D8 D8 D8 D8 D9 E9 E9 E9 E9 E: E: E: F: F: F: F; F; F; G; G; G< G< G< G< G< H< H= H= H= ("?2M@3@3@3@3@3@3A4A4A4A4A4A5A5B5B5B5B5B6B6B6 C6 C6 C7 C7 C7 C7 C7 D7 D8 D8 D8 D8 D8 D9 E9 E9 E9 E9 E9 E: E: F: F: F: F; F; F; G; G; G; G< G< G< G< H< H= H= H= H= H= H= y>1@3@3@3A4A4A4A4A4A4A5B5B5B5B5B6B6B6C6 C6 C7 C7 C7 C7 C7 D7 D8 D8 D8 D8 D8 D9 E9 E9 E9 E9 E9 E: E: F: F: F: F; F; F; G; G; G; G< G< G< G< H< H= H= H= H= H= H= I> I> >5 @33@3A4A4A4A4A5B5B5B5B5B6B6B6C6C6 C6 C7 C7 C7 C7 D7 D8 D8 D8 D8 D8 D8 E9 E9 E9 E9 E9 E: E: F: F: F: F: F; F; G; G; G; G< G< G< G< H< H< H= H= H= H= H= I> I> I> I> F< #A@43A4A5B5B5B5B5B6B6B6C6C6C6 C7 C7 C7 C7 D7 D8 D8 D8 D8 D8 E8 E9 E9 E9 E9 E9 E: F: F: F: F: F: F; F; G; G; G; G< G< G< G< H< H= H= H= H= H= H= I> I> I> I> I> I? G< 3+ 3@3A4MA5A5B5B5B5B6B6B6B6C6C6C7C7C7C7 C7 D8 D8 D8 D8 D8 D8 D9 E9 E9 E9 E9 E: E: E: F: F: F: F; F; F; G; G; G< G< G< G< G< H= H= H= H= H= H= H> I> I> I> F; E(  '5=AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=5'  'QyyQ' Q !&())))))))))))))******************++++++++++++++++++,,,,,,,,,,,,,,,,,,,------------------.............-)"Q' !())))))))))))))*******************++++++++++++++++++,,,,,,,,,,,,,,,,,,------------------.................. / / / .o')()))))))))))))******************++++++++++++++++++,,,,,,,,,,,,,,,,,,-------------------................ . . / / / / / / / / + y'")))))))))))******************+++++++++++++++++++,,,,,,,,,,,,,,,,,,------------------.............. . . . . / / / / / / / / / / / / / . o "))))))))*******************++++++++++++++++++,,,,,,,,,,,,,,,,,,------------------............. . . . . . / / / / / / / / / / / / / / / / / / / Q Y())))******************++++++++++++++++++,,,,,,,,,,,,,,,,,,,------------------.......... . . . . . . . . / / / / / / / / / / / / / / / / / / 0 0 0!0!0!,'  ()*******************++++++++++++++++++,,,,,,,,,,,,,,,,,,------------------......... . . . . . . . . . / / / / / / / / / / / / / / / / / / / 0!0!0!0!0!0!0!0!0!Q %[*****************++++++++++++++++++,,,,,,,,,,,,,,,,,,------------------....... . . . . . . . . . . . . / / / / / / / / / / / / / / / / /!/!0!0!0!0!0!0!0!0!0!0!0!0!0!. y(*************++++++++++++++++++,,,,,,,,,,,,,,,,,,,------------------..... . . . . . . . . . . . . . / / / / / / / / / / / / / / / /!/!/!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0"')**********++++++++++++++++++,,,,,,,,,,,,,,,,,,------------------... . . . . . . . . . . . . . . . / / / / / / / / / / / / / /!/!/!/!/!/!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0"1"1"1"$5&%*******++++++++++++++++++,,,,,,,,,,,,,,,,,,------------------.. . . . . . . . . . . . . . . . . . / / / / / / / / / / / /!/!/!/!/!/!/!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0"1"1"1"1"1"1",=(=***++++++++++++++++++,,,,,,,,,,,,,,,,,,,----------------- - . . . . . . . . . . . . . . . . . . / / / / / / / / / /!/!/!/!/!/!/!/!/!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0"0"1"1"1"1"1"1"1"1"1"0"A*A++++++++++++++++++,,,,,,,,,,,,,,,,,,---------------- - - . . . . . . . . . . . . . . . . . . / / / / / / / / /!/!/!/!/!/!/!/!/!/!/!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0"0"0"1"1"1"1"1"1"1"1"1"1"1"1#1#1#A*A+++++++++++++,,,,,,,,,,,,,,,,,,,------------- - - - - - . . . . . . . . . . . . . . . . . . / / / / / /!/!/!/!/!/!/!/!/!/!/!/!/!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0"0"0"0"0"0"1"1"1"1"1"1"1"1"1"1"1"1"1#1#1#2#2#2#A*A++++++++++,,,,,,,,,,,,,,,,,,------------ - - - - - - . . . . . . . . . . . . . . . . . . / / / /!/!/!/!/!/!/!/!/!/!/!/!/!/!/!0!0!0!0!0!0!0!0!0!0!0!0!0!0"0"0"0"0"0"0"1"1"1"1"1"1"1"1"1"1"1"1"1"1#1#1#2#2#2#2#2#2#A*A++++++,,,,,,,,,,,,,,,,,,---------- - - - - - - - - . . . . . . . . . . . . . . . . . . . / /!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!0!0!0!0!0!0!0!0!0!0!0"0"0"0"0"0"0"0"0"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1#1#2#2#2#2#2#2#2#2#2$A*A++,,,,,,,,,,,,,,,,,,,-------- - - - - - - - - - - . . . . . . . . . . . . . . . . . .!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!0!0!0!0!0!0!0!0!0!0"0"0"0"0"0"0"0"0"0"0"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1#1#2#2#2#2#2#2#2#2#2$2$2$2$A*A,,,,,,,,,,,,,,,,,------ - - - - - - - - - - - - . . . . . . . . . . . . . . . . .!.!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!0!0!0!0!0!0!0!0"0"0"0"0"0"0"0"0"0"0"0"0"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1#1#1#2#2#2#2#2#2#2#2#2#2$2$2$2$3$3$A*A,,,,,,,,,,,,,----- - - - - - - - - - - - - - . . . . . . . . . . . . . . .!.!.!.!.!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!0!0!0!0!0!0"0"0"0"0"0"0"0"0"0"0"0"0"0"1"1"1"1"1"1"1"1"1"1"1"1"1"1#1#1#1#1#2#2#2#2#2#2#2#2#2#2#2$2$2$2$2$3$3$3$3$A*A,,,,,,,,,,-- - - - - - - - - - - - - - - - - . . . . . . . . . . . . .!.!.!.!.!.!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!0!0!0!0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"1"1"1"1"1"1"1"1"1"1"1"1#1#1#1#1#1#1#2#2#2#2#2#2#2#2#2#2#2$2$2$2$3$3$3$3$3$3$3$3%A*A,,,,,,- - - - - - - - - - - - - - - - - - . . . . . . . . . . . .!.!.!.!.!.!.!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!0!0!0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"1"1"1"1"1"1"1"1"1"1#1#1#1#1#1#1#1#1#2#2#2#2#2#2#2#2#2#2#2#2$2$2$2$3$3$3$3$3$3$3$3%3%3%3%A+A, , - - - - - - - - - - - - - - - - - - . . . . . . . . .!.!.!.!.!.!.!.!.!.!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/"0"0"0"/!9,WN5SI/:-/!0"0"0"0"0"0"0"0"0"0"1"1"1"1"1"1"1"1#1#1#1#1#1#1#1#1#1#1#1#2#2#2#2#2#2#2#2#2#2#2#2#2$2$2$2$3$3$3$3$3$3$3$3%3%3%3%3%3%4%A+A- - - - - - - - - - - - - - - - . . . . . . .!.!.!.!.!.!.!.!.!.!.!.!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/"/"/"0"0"0"/!6( SJ0up[y{zrzt``W?F;2$/!0"0"0"1"1"1"1"1"1#1#1#1#1#1#1#1#1#1#1#1#1#2#2#2#2#2#2#2#2#2#2#2#2#2#2$2$2$2$3$3$3$3$3$3$3$3%3%3%3%3%3%3%4%4%4%A+A- - - - - - - - - - - - - . . . . .!.!.!.!.!.!.!.!.!.!.!.!.!.!/!/!/!/!/!/!/!/!/!/!/!/!/!/"/"/"/"/"0"0"0"0"0!2%OE*oiSv{{{{{ztsslmeOTI/;.0"1#1#1#1#1#1#1#1#1#1#1#1#1#1#2#2#2#2#2#2#2#2#2#2#2#2#2#2$2$2$2$2$3$3$3$3$3$3$3$3%3%3%3%3%3%4%4%4%4%4%4&4&A+A- - - - - - - - - . . . .!.!.!.!.!.!.!.!.!.!.!.!.!.!.!/!/!/!/!/!/!/!/!/!/!/!/!/"/"/"/"/"/"0"0"0"0"0"0"1#I>#jdMs{{{{{{{{{zussssr{t`aX?H<3%1#1#1#1#1#1#1#1#2#2#2#2#2#2#2#2#2#2#2$2$2$2$2$2$2$2$3$3$3$3$3$3$3$3$3%3%3%3%3%4%4%4%4%4%4%4&4&4&4&A+A- - - - - . .!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!/!/!/!/!/!/!/!/!/!/!/"/"/"/"/"/"/"/"/"0"0"0"0"0"0"0"D8e^Fp{{{{{{{{{{{{{zusssssssnogQUK03%4&4&4&4&4&4&5&5&5&5&5&5'5'5'5'5'5'5'5'5'6'6'6(6(6(6(6(6(6(6(6(6(6(A-!A/"/"/"/"0"0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#1#1#1#1#1#1#1#1#1#1$6)g^EzezezeoXO33%4&4&5&5&5&5&5&5'5'5'5'5'5'5'5'5'6'6'6(6(6(6(6(6(6(6(6(6(6(6)7)7)A."A/#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#1#1#1#1#1#1#1#1$1$1$1$0#@4vnWzezeze|gPE(5%5&5&5&5'5'5'5'5'5'5'5'5'6'6'6(6(6(6(6(6(6(6(6(6(6(6)7)7)7)7)7)A."A0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#1#1#1#1#1#1$1$1$1$1$1$1$1$1$1$PF)~wazezezezeJ> 5'5'5'5'5'5'5'5'5'6'6'6(6(6(6(6(6(6(6(6(6(6(6)7)7)7)7)7)7)7)7)A."A0#0#0#0#0#0#0#0#0#0#0#0#1#1#1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$5'dZAydzezezeydyE95'5'5'5'5'6'6'6(6(6(6(6(6(6(6(6(6(6(7)7)7)7)7)7)7)7)7)7)7)7*A."A0#0#0#0#0#0#0#0#1#1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$2$2$>1skTzezezezezem~A45'6'6'6(6(6(6(6(6(6(6(6(6(6(7)7)7)7)7)7)7)7)7)7)7)7*7*7*8*A."A0#0#0#0$0$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$2$2$2$2$?2}vazezezezeze{f½Ŀy1~j~j}ip8*8+8+8+9+9+9+9+9+9+9+9+9,9,9,9,9,9,:,:,:,:,:-:-:-A1%A3&3&3&3&3&3&3&3&3&3&3&3&3&3&3&3&3&3&4&4&4&4&4&4&4'NC%~j~js8+9+9+9+9+9+9+9+9+9,9,9,9,9,9,:,:,:,:,:,:-:-:-:-:-A1%A3&3&3&3&3&3&3&3&3&3&3&3&3&3&4&4&4&4&4'4'4'4'4'4'4'^T9~j}i9+9+9+9+9+9+9,9,9,9,9,9,:,:,:,:,:,:-:-:-:-:-:-:-:-A1%A3&3&3&3&3&3&3&3&3&3&3&4&4&4'4'4'4'4'4'4'4'4'4'4'4'ldL~js9+9+9+9,9,9,9,9,9,:,:,:,:,:,:-:-:-:-:-:-:-:-;-;-;-A1%A3&3&3&3&3&3&4'4'4'4'4'4'4'4'4'4'4'4'4'4'4'4'4'4'5'|u`~jF;9,9,9,9,:,:,:,:,:,:,:-:-:-:-:-:-:-:-;-;-;-;.;.;.A2%A3'3'3'4'4'4'4'4'4'4'4'4'4'4'4'4'4'4'4'4'4'5'5'5'1>1A4(A6)6)6)6)6)6)6)6)6)6)6)6)7)7)7)7*7*7*7*7*7*7*7*7*g`Fÿ1>1>1>1>1A4(A6)6)6)6)6)6)6)6)6)7)7*7*7*7*7*7*7*7*7*7*7*7*7*7*ZR51>1>1>1>1>1>1>1A4(A6)6)6)6)6*7*7*7*7*7*7*7*7*7*7*7*7*7*7*7*7*7*7*8*ND#{xb1>1>1>1>1>1>1>1>1>1>2A5)A6*7*7*7*7*7*7*7*7*7*7*7*7*7*7*7*7*7*7*7*8*8*8*8*B6b\>=0=0=0=0=0=0=0=0=0=0=1>1>1>1>1>1>1>1>1>1>1>2>2>2>2A5)A7*7*7*7*7*7*7*7*7*7*7*7*7*7*7*8*8*8*8*8*8+8+8+8+8+G<=0=0=0=0=0=0=0>1>1>1>1>1>1>1>1>1>1>2>2>2>2?2?2?2?2A5)A7*7*7*7*7*7*7*7*7*7*7*7*8*8*8+8+8+8+8+8+8+8+8+8+8+x¾>1=0=0=0=0=1>1>1>1>1>1>1>1>1>1>2>2>2>2?2?2?2?2?2?2?2A5)A7*7*7*7*7*7*7*7*8*8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+~{g=0=0=1>1>1>1>1>1>1>1>1>1>1>2>2>2?2?2?2?2?2?2?2?2?3?3A5)A7*7*7*7+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+9+9+9+rmVk>1>1>1>1>1>1>1>1>1>1>2>2>2?2?2?2?2?2?2?2?2?3?3?3?3 ?3 A6*A7+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+9+9+9+9+9+9+f`EicF>1>1>1>1>1>1>1>2>2>2?2?2?2?2?2?2?2?2?3?3?3?3?3 ?3 @3 @3 A6*A8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+9+9+9+9+9+9,9,9,9,9,ZR4ND>1>1>1>1>1>2>2?2?2?2?2?2?2?2?2?3?3?3?3?3?3 @3 @3 @3 @3 @3 A6*A8+8+8+8+8+8+8+8+8+8+8+9+9+9+9,9,9,9,9,9,9,9,9,9,9,ND"½@4 >1>1>2>2?2?2?2?2?2?2?2?2?3?3?3?3?3?3@3 @3 @3 @3 @3 @4 @4 @4 A6*A8+8+8+8+8+8+8+8+9+9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,A5>1>2?2?2?2?2?2?2?2?2?2?3?3?3?3?3@3@3 @3 @3 @3 @3 @4 @4 @4 @4 @4 A6*A8+8+8,8,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,:,:,:,;-ut>1?2?2?2?2?2?2?3?3?3?3?3@3@3@3@3 @3 @3 @4 @4 @4 @4 @4 @4 @4 @4 @4 A7*A9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,:,:,:,:,:,:,:-:-F;{ojO?2?2?2?2?2?3?3?3?3@3@3@3@3@3 @3 @3 @4 @4 @4 @4 @4 @4 @4 @4 A4 A4 A5 A7*A9,9,9,9,9,9,9,9,9,9,9,9,9,9,:,:,:,:,:-:-:-:-:-:-:-:-:-J?UL)?2?2?3?3?3?3@3@3@3@3@3@3 @3 @4 @4 @4 @4 @4 @4 @4 @4 A4 A4 A4 A5 A5 A5 A7*A9,9,9,9,9,9,9,9,9,9,9,:,:,:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-OD!B7 ?3?3?3@3@3@3@3@3@3@3 @4 @4 @4 @4 @4 @4 @4 @4 A4 A4 A4 A5 A5 A5 A5 A5 A5 A7*A9,9,9,9,9,9,9,:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-;-;-;-:,VL,I>?3@3@3@3@3@3@3@3@4 @4 @4 @4 @4 @4 @4 @4 A4 A4 A4 A5 A5 A5 A5 A5 A5 A5 A5 A5 A7+A9,9,9-9-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-;-;-;-;-;-;-;-:-]U7hA4 @3@3@3@3@3@3@4@4 @4 @4 @4 @4 @4 @4 A4 A4 A4 A5 A5 A5 A5 A5 A5 A5 A5 A5 A5 B5 B6 A8+A:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-;-;-;-;-;-;-;.;.;.;.;.;.:-e]Aþb[;?2@3@3@3@3@3@4@4 @4 @4 @4 @4 @4 A4 A4 A4 A4 A5 A5 A5 A5 A5 A5 A5 A5 A5 B5 B6 B6 B6 B6 A8+A:-:-:-:-:-:-:-:-:-:-:-:-:-:-;-;-;-;-;.;.;.;.;.;.;.;.;.;.;.;.;.;-leJMB@3@3@3@3@4@4@4 @4 @4 @4 @4 A4 A4 A4 A4 A5 A5 A5 A5 A5 A5 A5 A5 A5 B5 B5 B6 B6 B6 B6 B6 B6 A8+A:-:-:-:-:-:-:-:-:-:-;-;.;-;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.<.<.<.<.toVsB6 @3@4@4@4@4@4 @4 @4 A4 A4 A4 A4 A4 A5 A5 A5 A5 A5 A5 A5 A5 A5 B5 B5 B6 B6 B6 B6 B6 B6 B6 B6 B6 A8+A:-:-:-:-:-:-;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.<.<.<.<.<.<.<.<.<.=0|xahcD?3@4@4@4@4@4 @4 A4 A4 A4 A4 A5 A5 A5 A5 A5 A5 A5 A5 A5 A5 B5 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B7 C7 A8,A:.:.:.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.<.<.<.<.<.<.<.2 ~iÿQH"?3@4@4@4@4 A4 A4 A4 A4 A4 A5 A5 A5 A5 A5 A5 A5 A5 A5 B5 B5 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B7 C7 C7 C7 A9,A;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.<.<.<.<.<.0>0>0UK(wt[A4 A4 A4 A5 A5 A5 A5 A5 A5 A5 A5 B5 B5 B5 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 C6 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C8 C8 D8 D8 D8 D8 D8 A:-A0>0>0>0>1>1=0^W6]V3@4A5 A5 A5 A5 A5 A5 A5 A5 B5 B5 B5 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 C6 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C8 C8 D8 D8 D8 D8 D8 D8 D8 D8 A:-A0>0>0>0>1>1>1>1>1>1>1>0I>hbDr¾|{bQH!@4A5 A5 A5 A5 A5 A5 B5 B5 B5 B5 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C8 C8 C8 D8 D8 D8 D8 D8 D8 D8 D8 D9 D9 D9 A:-A0>0>0>0>1>1>1>1>1>1>1>1>1?1?1?2?2>1A5 XO,xt[lUM(A5 A5 A5 A5 A5 A5 A5 B5 B5 B5 B5 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 C6 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C8 C8 C8 D8 D8 D8 D8 D8 D8 D8 D8 D9 D9 D9 D9 D9 E9 A:-A0>0>0>0>0>1>1>1>1>1>1>1>1>1>1?1?2?2?2?2?2?2?2?2?2?2H=haCqx\U1B6 @4A5 A5 A5 A5 A5 B5 B5 B5 B5 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 C6 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D9 D9 D9 D9 E9 E9 E9 E9 A;.A<0<0=0=0=0=0=0=0=0=0=0=0=0=0=0=0=0=0=0=0>0>0>0>0>0>1>1>1>1>1>1>1>1>1?1?1?2?2?2?2?2?2?2?2?2?2?2?3@3@3@3@3A4 WN*wrYþd^=B6 A5A5 A5 A5 A5 A5 B5 B5 B5 B5 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 C6 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C8 C8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D9 D9 D9 D9 E9 E9 E9 E9 E9 E9 E9 A;.A=0=0=0=0=0=0=0=0=0=0=0=0=0=0=0=0>0>0>0>0>0>0>0>1>1>1>1>1>1>1>1?1?1?1?2?2?2?2?2?2?2?2?2?2?2@3@3@3@3@3@3@3@3@3@3?3I>haBokfGE:A4A5A5 A5 A5 A5 B5 B5 B5 B5 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 C6 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C8 C8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D9 D9 D9 D9 E9 E9 E9 E9 E9 E9 E9 E: E: E: A;.A=0=0=0=0=0=0=0=0=0=0=0=0>0>0>0>0>0>1>1>1>1>1>1>1>1>1>1>1?1?1?1?2?2?2?2?2?2?2?2?2?2?2@3@3@3@3@3@3@3@3@3@3@3@4@4@4@4A4@3B5 XN*{x_qnQI?@4A5A5A5 A5 A5 B5 B5 B5 B5 B5 B6 B6 B6 B6 B6 B6 B6 B6 B6 C6 C6 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C8 C8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D9 D9 D9 D9 E9 E9 E9 E9 E9 E9 E9 E: E: E: E: E: E: A;.A=0=0=0=0=0=0=0=0=0>0>0>0>1>1>1>1>1>1>1>1>1>1>1>1>1>1?1?1?2?2?2?2?2?2?2?2?2?2?2@3@3@3@3@3@3@3@3@3@3@3@4@4@4@4A4A4A4A4A4A4A4A5A5A5A5A5 A5 B5 B5 B5 B5 B5 B6 B6 B6 B6 B6 B6 B6 B6 B6 C6 C6 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D9 D9 D9 D9 E9 E9 E9 E9 E9 E9 E9 E: E: E: E: E: E: E: F: F: A;.A=0=0=0=0=0>0>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1?1?1?1?2?2?2?2?2?2?2?2?2?2?2@3@3@3@3@3@3@3@3@3@3@3@4@4@4@4A4A4A4A4A4A4A4A5A5A5A5A5A5 B5 B5 B5 B5 B5 B6 B6 B6 B6 B6 B6 B6 B6 B6 C6 C6 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D9 D9 D9 E9 E9 E9 E9 E9 E9 E9 E9 E: E: E: E: E: E: F: F: F: F: F: A1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1?1?1?1?2?2?2?2?2?2?2?2?2?2@2@3@3@3@3@3@3@3@3@3@3@3@4@4@4A4A4A4A4A4A4A4A4A5A5A5A5A5A5B5 B5 B5 B5 B6 B6 B6 B6 B6 B6 B6 B6 B6 C6 C6 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D9 D9 D9 D9 E9 E9 E9 E9 E9 E9 E9 E: E: E: E: E: E: F: F: F: F: F: F; F; F; F; A1>1>1>1>1>1>1>1>1>1>1>1>1>1>1?1?1?1?1?2?2?2?2?2?2?2?2?2?2?2@3@3@3@3@3@3@3@3@3@3@3@4@4@4A4A4A4A4A4A4A4A4A5A5A5A5A5A5B5B5 B5 B5 B5 B6 B6 B6 B6 B6 B6 B6 B6 C6 C6 C6 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D9 D9 D9 E9 E9 E9 E9 E9 E9 E9 E: E: E: E: E: E: F: F: F: F: F: F; F; F; F; F; F; F; A1>1>1>1>1>1>1>1>1>1>1>1?1?1?1?1?2?2?2?2?2?2?2?2?2?2?2@3@3@3@3@3@3@3@3@3@3@3@4@4@4A4A4A4A4A4A4A4A4A5A5A5A5A5A5B5B5B5 B5 B5 B6 B6 B6 B6 B6 B6 B6 B6 C6 C6 C6 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D9 D9 D9 E9 E9 E9 E9 E9 E9 E9 E9 E: E: E: E: E: F: F: F: F: F: F; F; F; F; F; F; F; F; F; G; A1>1>1>1>1>1>1>1?1?1?2?2?2?2?2?2?2?2?2?2?2?2?2@2@3@3@3@3@3@3@3@3@3@3@3@4@4@4A4A4A4A4A4A4A4A4A5A5A5A5A5A5B5B5B5B5 B5 B6 B6 B6 B6 B6 B6 B6 B6 C6 C6 C6 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D9 D9 D9 E9 E9 E9 E9 E9 E9 E9 E9 E: E: E: E: E: F: F: F: F: F: F: F; F; F; F; F; F; F; F; G; G; G; G< A1>1>1>1?1?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2@3@3@3@3@3@3@3@3@3@3@3@4@4@4A4A4A4A4A4A4A4A4A5A5A5A5A5A5B5B5B5B5B5 B6 B6 B6 B6 B6 B6 B6 B6 C6 C6 C6 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D9 D9 D9 E9 E9 E9 E9 E9 E9 E9 E9 E: E: E: E: E: F: F: F: F: F: F: F; F; F; F; F; F; F; F; G; G; G; G< G< G< G< A=0A>2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2@2@3@3@3@3@3@3@3@3@3@3@3@4@4A4A4A4A4A4A4A4A4A4A5A5A5A5A5B5B5B5B5B5B5 B6 B6 B6 B6 B6 B6 B6 C6 C6 C6 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D9 D9 D9 E9 E9 E9 E9 E9 E9 E9 E9 E: E: E: E: E: F: F: F: F: F: F: F; F; F; F; F; F; F; F; G; G; G; G< G< G< G< G< G< G< A=0A?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2@2@3@3@3@3@3@3@3@3@3@3@3@4@4A4A4A4A4A4A4A4A4A4A5A5A5A5A5B5B5B5B5B5B5B6 B6 B6 B6 B6 B6 B6 C6 C6 C6 C6 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 D7 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D9 D9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E: E: E: E: F: F: F: F: F: F: F; F; F; F; F; F; F; F; G; G; G; G< G< G< G< G< G< G< G< G< G< A>1A?2?2?2?2?2?2?2?2?2?2?2@2@2@3@3@3@3@3@3@3@3@3@3@3@4@4A4A4A4A4A4A4A4A4A4A5A5A5A5A5B5B5B5B5B5B5B6B6 B6 B6 B6 B6 B6 C6 C6 C6 C6 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 D7 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D9 D9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E: E: E: E: F: F: F: F: F: F: F: F; F; F; F; F; F; F; G; G; G; G< G< G< G< G< G< G< G< G< G< G< H= H= =>1??2?2?2?2?2?2?2@2@2@3@3@3@3@3@3@3@3@3@3@3@3@4@4A4A4A4A4A4A4A4A4A4A5A5A5A5B5B5B5B5B5B5B5B6B6 B6 B6 B6 B6 B6 C6 C6 C6 C6 C7 C7 C7 C7 C7 C7 C7 C7 C7 D7 D7 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D9 D9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E: E: E: E: E: F: F: F: F: F: F: F; F; F; F; F; F; F; G; G; G; G; G< G< G< G< G< G< G< G< G< G< H< H= H= H= H= G< 5=0+?2?2?2?2@3@3@3@3@3@3@3@3@3@3@3@3@3@3@4A4A4A4A4A4A4A4A4A4A4A5A5A5A5B5B5B5B5B5B5B5B6B6B6 B6 B6 B6 B6 C6 C6 C6 C6 C7 C7 C7 C7 C7 C7 C7 C7 C7 D7 D7 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D9 D9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E: E: E: E: E: F: F: F: F: F: F: F; F; F; F; F; F; F; G; G; G; G; G< G< G< G< G< G< G< G< G< G< H< H= H= H= H= H= H= H= C8 '=0 ?2@3@3@3@3@3@3@3@3@3@3@3@3@3@3@4A4A4A4A4A4A4A4A4A4A4A5A5A5A5B5B5B5B5B5B5B5B6B6B6B6 B6 B6 B6 C6 C6 C6 C6 C7 C7 C7 C7 C7 C7 C7 C7 C7 D7 D7 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E: E: E: E: F: F: F: F: F: F: F: F; F; F; F; F; F; G; G; G; G; G; G< G< G< G< G< G< G< G< G< H< H= H= H= H= H= H= H= H= H= H= :1 y?2@3@3@3@3@3@3@3@3@3@3@3@4A4A4A4A4A4A4A4A4A4A4A5A5A5A5B5B5B5B5B5B5B5B6B6B6B6B6 B6 B6 C6 C6 C6 C6 C7 C7 C7 C7 C7 C7 C7 C7 C7 D7 D7 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E: E: E: E: F: F: F: F: F: F: F: F; F; F; F; F; F; G; G; G; G; G; G< G< G< G< G< G< G< G< G< H< H< H= H= H= H= H= H= H= H= H= H= H> H> ,&Q ?2m@3@3@3@3@3@3@3@3@3@4A4A4A4A4A4A4A4A4A4A4A5A5A5B5B5B5B5B5B5B5B6B6B6B6B6B6B6 C6 C6 C6 C6 C7 C7 C7 C7 C7 C7 C7 C7 C7 D7 D7 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E: E: E: E: F: F: F: F: F: F: F: F; F; F; F; F; F; G; G; G; G; G; G< G< G< G< G< G< G< G< G< H< H< H= H= H= H= H= H= H= H= H= H= H= H> I> I> H= '>1?2@3@3@3@3@3A4A4A4A4A4A4A4A4A4A4A4A5A5A5B5B5B5B5B5B5B5B5B6B6B6B6B6B6 C6 C6 C6 C6 C7 C7 C7 C7 C7 C7 C7 C7 C7 D7 D7 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E: E: E: E: F: F: F: F: F: F: F: F; F; F; F; F; F; G; G; G; G; G; G< G< G< G< G< G< G< G< G< H< H< H= H= H= H= H= H= H= H= H= H= H= H> I> I> I> I> I> <2 Q ?3m@3@4A4A4A4A4A4A4A4A4A4A4A4A5A5A5B5B5B5B5B5B5B5B5B6B6B6B6B6B6C6 C6 C6 C6 C6 C7 C7 C7 C7 C7 C7 C7 C7 D7 D7 D7 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E: E: E: E: F: F: F: F: F: F: F: F; F; F; F; F; F; G; G; G; G; G; G< G< G< G< G< G< G< G< G< H< H< H= H= H= H= H= H= H= H= H= H= H= H> I> I> I> I> I> I> I> H= ?2@3A4A4A4A4A4A4A4A4A4A5A5A5B5B5B5B5B5B5B5B5B6B6B6B6B6B6C6C6 C6 C6 C6 C7 C7 C7 C7 C7 C7 C7 C7 C7 D7 D7 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E: E: E: F: F: F: F: F: F: F: F: F; F; F; F; F; G; G; G; G; G; G; G< G< G< G< G< G< G< G< H< H< H< H= H= H= H= H= H= H= H= H= H= H> I> I> I> I> I> I> I> I> I> I> 4- '@3@3A4A4A4A4A4A5A5A5B5B5B5B5B5B5B5B5B6B6B6B6B6C6C6C6C6 C6 C6 C7 C7 C7 C7 C7 C7 C7 C7 D7 D7 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E: E: F: F: F: F: F: F: F: F: F; F; F; F; F; F; G; G; G; G; G; G; G< G< G< G< G< G< G< G< H< H< H< H= H= H= H= H= H= H= H= H= H= H= I> I> I> I> I> I> I> I> I> I> I? I?=4 )@3@4A4A5A5B5B5B5B5B5B5B5B5B5B6B6B6B6B6C6C6C6C6C6 C6 C7 C7 C7 C7 C7 C7 C7 C7 D7 D7 D7 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 E8 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E: E: F: F: F: F: F: F: F: F: F: F; F; F; F; F; G; G; G; G; G; G< G< G< G< G< G< G< G< H< H< H< H= H= H= H= H= H= H= H= H= H= H= I> I> I> I> I> I> I> I> I> I> I> I? I? I?I> >5 ?3A4mA4B5B5B5B5B5B5B5B6B6B6B6B6C6C6C6C6C6C6 C7 C7 C7 C7 C7 C7 C7 C7 D7 D7 D7 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E: E: F: F: F: F: F: F: F: F: F: F; F; F; F; F; G; G; G; G; G; G; G< G< G< G< G< G< G< G< H< H< H= H= H= H= H= H= H= H= H= H= H= I> I> I> I> I> I> I> I> I> I> I> I? I? I? J?J?G= 91 Y @3A4mA4A5B5B6B6B6B6B6C6C6C6C6C6C6C7 C7 C7 C7 C7 C7 C7 C7 D7 D7 D7 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E: E: F: F: F: F: F: F: F: F: F: F; F; F; F; F; G; G; G; G; G; G; G< G< G< G< G< G< G< H< H< H< H< H= H= H= H= H= H= H= H= H= H= I= I> I> I> I> I> I> I> I> I> I> I> I? I? J? J?I> H= B8 [ ?3 @4+A5?@4AA4AA4AA4AA4AA4AA4AA5AA5AA5AA5AA5AA5AA5AA5AB5AB5AB5AB6AB6AB6AB6AB6AB6AB6AB6 AB6 AB6 AC6 AC7 AC7 AC7 AC7 AC7 AC7 AC7 AC7 AC7 AC7 AC7 AC8 AC8 AD8 AD8 AD8 AD8 AD8 AD8 AD8 AD8 AD9 AD9 AD9 AD9 AD9 AD9 AE9 AE9 AE9 AE9 AE9 AE: AE: AE: AE: AE: AE: AE: AE: AF: AF: AF: AF; AF; AF; AF; AF; AF; AF; AF; AF; AF; AF; AG< AG< AG< AG< AG< AG< AG< AG< AG< AG< AG< AG= AG= AG= AH= AH= AH= AG< =D: %%(  !!########################################################################################################################################################################################################!!  )5AKSW[]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]][YSKA5)  )=QcuucQ=)  -Ga{{aG- 'Ec !%'())))))))))))))))))))))))))))************************************++++++++++++++++++++++++++++++++++++,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,------------------------------------...........................-+'! cE' 7Y $)))))))))))))))))))))))))))))))************************************+++++++++++++++++++++++++++++++++++++,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,------------------------------------..................................... -" }Y7  !Ak ()))))))))))))))))))))))))))))*************************************++++++++++++++++++++++++++++++++++++,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,------------------------------------................................... . / / / / / / / *kA!  #I ()))))))))))))))))))))))))))*************************************++++++++++++++++++++++++++++++++++++,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,------------------------------------.................................. . . / / / / / / / / / / / / / * uI#  #M&))))))))))))))))))))))))))************************************+++++++++++++++++++++++++++++++++++++,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,-------------------------------------............................... . . . . . / / / / / / / / / / / / / / / / / / "{K%  !O()))))))))))))))))))))))*************************************++++++++++++++++++++++++++++++++++++,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,-------------------------------------............................. . . . . . . . / / / / / / / / / / / / / / / / / / / / / / / ) {I! K!))))))))))))))))))))))************************************+++++++++++++++++++++++++++++++++++++,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,------------------------------------............................ . . . . . . . . . / / / / / / / / / / / / / / / / / / / / / / / / / / / , uA?#)))))))))))))))))))************************************+++++++++++++++++++++++++++++++++++++,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,------------------------------------........................... . . . . . . . . . . / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / , k7 -"))))))))))))))))*************************************++++++++++++++++++++++++++++++++++++,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,------------------------------------........................ . . . . . . . . . . . . / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / - Y'  ))))))))))))*************************************++++++++++++++++++++++++++++++++++++,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,------------------------------------..................... . . . . . . . . . . . . . . . / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / 0 0 0 0 0 0!*}E [())))))))*************************************++++++++++++++++++++++++++++++++++++,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,------------------------------------.................... . . . . . . . . . . . . . . . . / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / 0 0 0 0 0!0!0!0!0!0!0!"c-  #&))))))************************************+++++++++++++++++++++++++++++++++++++,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,-------------------------------------................. . . . . . . . . . . . . . . . . . . . / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / 0 0 0!0!0!0!0!0!0!0!0!0!0!0!0!0! G ")))*************************************++++++++++++++++++++++++++++++++++++,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,-------------------------------------................ . . . . . . . . . . . . . . . . . . . . / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / 0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!+a)  !)************************************+++++++++++++++++++++++++++++++++++++,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,------------------------------------.............. . . . . . . . . . . . . . . . . . . . . . . . / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / /!/!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!{=%{*********************************+++++++++++++++++++++++++++++++++++++,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,------------------------------------............. . . . . . . . . . . . . . . . . . . . . . . . . / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / /!/!/!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!+Q  (******************************++++++++++++++++++++++++++++++++++++,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,------------------------------------.......... . . . . . . . . . . . . . . . . . . . . . . . . . . / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / /!/!/!/!/!/!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0! c) "?***************************++++++++++++++++++++++++++++++++++++,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,------------------------------------......... . . . . . . . . . . . . . . . . . . . . . . . . . . . . / / / / / / / / / / / / / / / / / / / / / / / / / / / / / /!/!/!/!/!/!/!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0"0"1"$u5'***********************+++++++++++++++++++++++++++++++++++++,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,-------------------------------------...... . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . / / / / / / / / / / / / / / / / / / / / / / / / / / / /!/!/!/!/!/!/!/!/!/!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0"0"1"1"1"1"/!A)********************++++++++++++++++++++++++++++++++++++,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,-------------------------------------..... . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . / / / / / / / / / / / / / / / / / / / / / / / / / / /!/!/!/!/!/!/!/!/!/!/!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0"0"1"1"1"1"1"1"1"1" K)****************+++++++++++++++++++++++++++++++++++++,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,------------------------------------... . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . / / / / / / / / / / / / / / / / / / / / / / / /!/!/!/!/!/!/!/!/!/!/!/!/!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0"1"1"1"1"1"1"1"1"1"1"1"S&7*************+++++++++++++++++++++++++++++++++++++,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,------------------------------------.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . / / / / / / / / / / / / / / / / / / / / / / /!/!/!/!/!/!/!/!/!/!/!/!/!/!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0"1"1"1"1"1"1"1"1"1"1"1"1"1"1"$Y!'Y**********++++++++++++++++++++++++++++++++++++,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,----------------------------------- - . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . / / / / / / / / / / / / / / / / / / / / /!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"*[!(q******++++++++++++++++++++++++++++++++++++,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,---------------------------------- - - . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . / / / / / / / / / / / / / / / / / / /!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0"0"0"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1". ]#)***++++++++++++++++++++++++++++++++++++,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,-------------------------------- - - - - - . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . / / / / / / / / / / / / / / / / /!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0"0"0"0"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1#1#0"]#*+++++++++++++++++++++++++++++++++++,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,------------------------------- - - - - - - . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . / / / / / / / / / / / / / / / /!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0"0"0"0"0"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1#1#1#1#1#1#]#*++++++++++++++++++++++++++++++,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,---------------------------- -- - - - - - - - . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . / . / / / / / / / / / / /!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0"0!0"0"0"0"0"0"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1#1#1#1#1#1#1#2#2#2#]#*++++++++++++++++++++++++++,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,------------------------- - - - - - - - - - - - . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . / / / / / / / / / / /!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0"0"0"0"0"0"0"0"0"0"0"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1#1#1#1#1#2#2#2#2#2#2#2#]#*+++++++++++++++++++++++,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,------------------------ - - - - - - - - - - - - . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . / / / / / / / / /!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0"0"0"0"0"0"0"0"0"0"0"0"0"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1#1#1#1#1#2#2#2#2#2#2#2#2#2#2#]#*+++++++++++++++++++,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,----------------------- - - - - - - - - - - - - - - . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . / / / / / / /!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0"0"0"0"0"0"0"0"0"0"0"0"0"0"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1#1#1#1#1#2#2#2#2#2#2#2#2#2#2#2#2#2#]#*+++++++++++++++,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,-------------------- - - - - - - - - - - - - - - - - . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . / / / / /!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1#1#1#1#1#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#]#*+++++++++++,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,------------------ - - - - - - - - - - - - - - - - - - . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . / / / /!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1#1#1#1#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2$2$]#*++++++++,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,----------------- - - - - - - - - - - - - - - - - - - - - . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . / /!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1#1#1#1#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2$2$2$2$2$]#*++++,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,--------------- - - - - - - - - - - - - - - - - - - - - - . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1#1#1#1#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2$2$2$2$2$2$2$2$]#*+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,------------- - - - - - - - - - - - - - - - - - - - - - - - - . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .!.!.!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1#1#1#1#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2$2$2$2$2$2$2$2$2$3$]#+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,----------- - - - - - - - - - - - - - - - - - - - - - - - - - - . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .!.!.!.!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1#1#1#1#1#1#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2$2$2$2$2$2$2$2$2$3$3$3$3$]#+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,--------- - - - - - - - - - - - - - - - - - - - - - - - - - - - . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .!.!.!.!.!.!.!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!0!0!0!0!0!0!0!0!0!0!0!0!0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1#1#1#1#1#1#1#1#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2$2$2$2$2$2$2$2$2$3$3$3$3$3$3$3$]#+,,,,,,,,,,,,,,,,,,,,,,,,,,-------- - - - - - - - - - - - - - - - - - - - - - - - - - - - - . . . . . . . . . . . . . . . . . . . . . . . . . . . . .!.!.!.!.!.!.!.!.!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!0!0!0!0!0!0!0!0!0!0!0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1#1#1#1#1#1#1#1#1#1#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2$2$2$2$2$2$2$2$2$2$3$3$3$3$3$3$3$3$3$]#+,,,,,,,,,,,,,,,,,,,,,,,----- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - . . . . . . . . . . . . . . . . . . . . . . . . . . .!.!.!.!.!.!.!.!.!.!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!0!0!0!0!0!0!0!0!0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1#1#1#1#1#1#1#1#1#1#1#1#1#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2$2$2$2$2$2$2$2$3$3$3$3$3$3$3$3$3$3$3$3$3$]#+,,,,,,,,,,,,,,,,,,,---- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - . . . . . . . . . . . . . . . . . . . . . . . . . .!.!.!.!.!.!.!.!.!.!.!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!0!0!0!0!0!0!0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1#1#1#1#1#1#1#1#1#1#1#1#1#1#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2$2$2$2$2$2$2$2$3$3$3$3$3$3$3$3$3$3$3$3$3$3$3%3%]#+,,,,,,,,,,,,,,,-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - . . . . . . . . . . . . . . . . . . . . . . .!.!.!.!.!.!.!.!.!.!.!.!.!.!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!0!0!0!0!0!0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2$2$2$2$2$2$2$2$3$3$3$3$3$3$3$3$3$3$3$3$3$3$3%3%3%3%3%]#+,,,,,,,,,,,- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - . . . . . . . . . . . . . . . . . . . . . .!.!.!.!.!.!.!.!.!.!.!.!.!.!.!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!0!0!0!0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2$2$2$2$2$2$2$2$3$3$3$3$3$3$3$3$3$3$3$3$3$3$3%3%3%3%3%3%3%3%]#+,,,,,, , , - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - . . . . . . . . . . . . . . . . . . . .!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!0!0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2$2$2$2$2$2$2$3$3$3$3$3$3$3$3$3$3$3$3$3$3$3%3%3%3%3%3%3%3%3%3%3%]#+, , , - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - . . . . . . . . . . . . . . . . .!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/"/"0"0"0"0"0"0"0"0"0"/!.9,3&-/!0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2$2$2$2$2$2$2$3$3$3$3$3$3$3$3$3$3$3$3$3$3$3%3%3%3%3%3%3%3%3%3%3%3%3%4%4%]#,- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - . . . . . . . . . . . . . . . .!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/"/"/"0"0"0"0"0"0"0"0"0"0"0".7* PF,qlVq|ikcMNB(;.. / 0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"1"1"1"1"1"1"1"1"1"1"1"1"1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2$2$2$2$2$2$2$3$3$3$3$3$3$3$3$3$3$3$3$3$3$3%3%3%3%3%3%3%3%3%3%3%3%3%3%4%4%4%4%]#,- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - . . . . . . . . . . . . .!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/"/"/"/"/"/"0"0"0"0"0"0"0"0"0"0"0". 2$J?&nhRr|{{{wtlxr^]T|ix{{{{{{{{{{{{{{{xssssssssq}jldMRG,9+ 0!0"1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2$2$2$2$2$2$2$2$2$2$2$2$2$3$3$3$3$3$3$3$3$3$3$3$3$3$3$3$3$3%3%3%3%3%3%3%3%3%3%3%4%4%4%4%4%4%4%4%4%4%4&4&4&4&4&4&4&]#,- - - - - - - - - - - - - - - - - . . . . . . .!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/"/"/"/"/"/"/"/"/"/"/"/"/"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"/!9+ WO6yuax{{{{{{{{{{{{{{{{{{{yssssssssssrpzs^_V2`Y@|xe}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zussssssssssssssssssssssv|infPSI.;.4'1#1#2$2$2$2$2$2$2$2$2$2$2$2$2$2$2$2$2$3$3$3$3$3$3$3$3$3$3$3$3$3$3$3$3$3$3$3$3$3%3%3%3%3%3%3%3%3%3%4%4%4%4%4%4%4%4%4%4%4%4&4&4&4&4&4&4&4&4&4&4&4&4&4&4&4&4&5&5&5&5&5&5'5']#- .!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!/!/!/!/!/!/!/!/!/!/!/!/!/"/"/"/"/"/"/"/"/"/"/"/"/"/"/"/"/"/"/"/"/"/"/"/"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"/!:-]T<|xe|xxxxxxxxxxxxxxxxxxxxxxxxyw|vbd\DK@#3%2$2$2$2$2$2$2$2$2$2$2$2$3$3$3$3$3$3$3$3$3$3$3$3$3$3$3$3$3$3$3$3$3$3%3%3%3%3%3%3%3%3%3%4%4%4%4%4%4%4%4%4%4%4%4&4&4&4&4&4&4&4&4&4&4&4&4&4&4&4&4&5&5&5&5&5&5'5'5'5'5']#- .!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!/!/!/!/!/!/!/!/!/!/!/"/"/"/"/"/"/"/"/"/"/"/"/"/"/"/"/"/"/"/"/"/"/"/"/"/"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"/!H>!gaI1#2$2$2$2$2$2$2$2$3$3$3$3$3$3$3$3$3$3$3$3$3$3$3$3$3$3$3$3$3$3%3%3%3%3%3%3%3%3%3%4%4%4%4%4%4%4%4%4%4%4%4%4&4&4&4&4&4&4&4&4&4&4&4&4&4&4&4&5&5&5&5&5&5&5'5'5'5'5'5'5']#- .!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!/!/!/!/!/!/!/!/!/!/"/"/"/"/"/"/"/"/"/"/"/"/"/"/"/"/"/"/"/"/"/"/"/"/"/"/"/"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"1$YO4]U;1#2$2$2$3$3$3$3$3$3$3$3$3$3$3$3$3$3$3$3$3$3$3$3$3$3$3%3%3%3%3%3%3%3%3%3%4%4%4%4%4%4%4%4%4%4%4%4%4&4&4&4&4&4&4&4&4&4&4&4&4&4&4&4&5&5&5&5&5&5&5'5'5'5'5'5'5'5'5'5']#- .!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!/!/!/!/!/!/!/!/!/"/"/"/"/"/"/"/"/"/"/"/"/"/"/"/"/"/"/"/"/"/"/"/"/"/"/"/"/"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0#0#/"8, jaIx[R91"3$3$3$3$3$3$3$3$3$3$3$3$3$3$3$3$3$3$3$3$3$3%3%3%3%3%3%3%3%3%3%4%4%4%4%4%4%4%4%4%4%4%4%4&4&4&4&4&4&4&4&4&4&4&4&4&4&4&4&5&5&5&5&5&5&5'5'5'5'5'5'5'5'5'5'5'5'5']#- .!.!.!.!.!.!.!.!.!.!.!.!.!.!.!/!/!/!/!/!/"/!/"/"/"/"/"/"/"/"/"/"/"/"/"/"/"/"/"/"/"/"/"/"/"/"/"/"/"/"/"/"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0#0"0#0#0#0#0#0#/"C7xpZmND)1"3$3$3$3$3$3$3$3$3$3$3$3$3$3%3%3%3%3%3%3%3%3%3%3%3%3%3%4%4%4%4%4%4%4%4%4%4%4%4%4%4&4&4&4&4&4&4&4&4&4&4&4&4&4&4&5&5&5&5&5&5'5'5'5'5'5'5'5'5'5'5'5'5'5'5'5'5']#- .!.!.!.!.!.!.!.!.!.!.!.!/!/!/"/"/"/"/"/"/"/"/"/"/"/"/"/"/"/"/"/"/"/"/"/"/"/"/"/"/"/"/"/"/"/"/"/"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0#0#0#0#0#0#0#0#0#0#0#0#0#/"VL0xb{gK@$1"3$3$3$3$3$3$3%3%3%3%3%3%3%3%3%3%3%3%3%3%3%3%4%4%4%4%4%4%4%4%4%4%4%4%4%4&4&4&4&4&4&4&4&4&4&4&4&4&4&4&5&5&5&5&5&5&5&5'5'5'5'5'5'5'5'5'5'5'5'5'5'5'5'5'5'5']#- .!.!.!.!.!.!.!.!/!/"/"/"/"/"/"/"/"/"/"/"/"/"/"/"/"/"/"/"/"/"/"/"/"/"/"/"/"/"/"/"/"/"/"/"/"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#/"4' h_FzezeF;2$3%3%3%3%3%3%3%3%3%3%3%3%3%3%3%3%3%3%4%4%4%4%4%4%4%4%4%4%4%4%4%4&4&4&4&4&4&4&4&4&4&4&4&4&4&4&5&5&5&5&5&5&5&5'5'5'5'5'5'5'5'5'5'5'5'5'5'5'5'5'5'5'5'6'6(]#- .!.!.!."/"/"/"/"/"/"/"/"/"/"/"/"/"/"/"/"/"/"/"/"/"/"/"/"/"/"/"/"/"/"/"/"/"/"/"/"/"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0"A5woXzezet|=02$3%3%3%3%3%3%3%3%3%3%3%3%3%3%4%4%4%4%4%4%4%4%4%4%4%4%4%4&4&4&4&4&4&4&4&4&4&4&4&4&4&5&5&5&5&5&5&5&5&5'5'5'5'5'5'5'5'5'5'5'5'5'5'5'5'5'5'5'5'6'6(6(6(6(]#-!."/"/"/"/"/"/"/"/"/"/"/"/"/"/"/"/"/"/"/"/"/"/"/"/"/"/"/"/"/"/"/"/"/"/"/"/"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#1#1#0"RG-}vazeze~jv3%4&4&4&5&5&5&5&5&5&5&5&5&5'5'5'5'5'5'5'5'5'5'5'5'5'5'5'5'5'5'6'6'6'6'6(6(6(6(6(6(6(6(6(6(6(6(6(6(6(6(6(6(6(6(6(6)6)7)7)7)7)7)7)7)7)]#."/#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1$1$1$1$1$1$1$1$1$1$1$1$3&UK/wbzezezezezezezeyd|A44%5&5&5&5&5&5&5&5&5'5'5'5'5'5'5'5'5'5'5'5'5'5'5'5'5'5'6'6'6'6'6(6(6(6(6(6(6(6(6(6(6(6(6(6(6(6(6(6(6(6(6(6(6)7)7)7)7)7)7)7)7)7)7)7)]#/"0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#1#1#1#1#1#1#1#1#1#1#1#1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$0#8+ g^E{gzezezezezezezeydpz?15%5&5&5&5&5'5'5'5'5'5'5'5'5'5'5'5'5'5'5'5'5'5'6'6'6'6'6(6(6(6(6(6(6(6(6(6(6(6(6(6(6(6(6(6(6(6(6(6(6)7)7)7)7)7)7)7)7)7)7)7)7)7)7)]#/"0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#1#1#1#1#1#1#1#1#1#1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$/"C7vnWzezezezezezezezeze|hy;.5&5'5'5'5'5'5'5'5'5'5'5'5'5'5'5'5'5'5'6'6'6'6'6(6(6(6(6(6(6(6(6(6(6(6(6(6(6(6(6(6(6(6(6(6(6)7)7)7)7)7)7)7)7)7)7)7)7)7)7)7)7)7)]#/"0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#1#1#1#1#1#1#1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$SI-}u`zezezezezezezezezeze}j7)5'5'5'5'5'5'5'5'5'5'5'5'5'5'6'6'6'6'6(6(6(6(6(6(6(6(6(6(6(6(6(6(6(6(6(6(6(6(6(6(6)7)7)7)7)7)7)7)7)7)7)7)7)7)7)7)7)7)7)7)7)7)]#/"0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#1#1#1#1#1#1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1#6) e[Bydzezezezezezezezezeydzzva7)5'5'5'5'5'5'5'5'5'5'6'6'6'6'6'6(6(6(6(6(6(6(6(6(6(6(6(6(6(6(6(6(6(6(6(6(6(7)7)7)7)7)7)7)7)7)7)7)7)7)7)7)7)7)7)7)7)7)7*7*7*]#/"0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#1#1#1#1#1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$2$2$0"@4sjSzezezezezezezezezezeydnupZ4&5'5'5'5'5'5'6'6'6'6'6'6(6(6(6(6(6(6(6(6(6(6(6(6(6(6(6(6(6(6(6(6(6(7)7)7)7)7)7)7)7)7)7)7)7)7)7)7)7)7)7)7)7)7)7)7*7*7*7*7*]#/"0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#1#1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$2$2$2$2$2$0"PE(|t_zezezezezezezezezezeze|gibJ4%5'5'6'6'6'6'6'6(6(6(6(6(6(6(6(6(6(6(6(6(6(6(6(6(6(6(6(6(6(7)7)7)7)7)7)7)7)7)7)7)7)7)7)7)7)7)7)7)7)7)7)7*7*7*7*7*8*8*8*]#/"0#0#0#0#0#0#0#0#0#0#0#0$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$2$2$2$2$2$2$2$2$4&bX>ydzezezezezezezezezezezezef^E5&6'6'6'6(6(6(6(6(6(6(6(6(6(6(6(6(6(6(6(6(6(6(6(6(6(7)7)7)7)7)7)7)7)7)7)7)7)7)7)7)7)7)7)7)7)7)7)7*7*7*7*7*8*8*8*8*8*8*]#/"0#0#0#0#0#0#0$0$0$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$2$2$2$2$2$2$2$2$2$1#;.qiRyezezezezezezezezezezezeydw]T94&6(6(6(6(6(6(6(6(6(6(6(6(6(6(6(6(6(6(6(6(6(7)7)7)7)7)7)7)7)7)7)7)7)7)7)7)7)7)7)7)7)7)7)7*7*7*7*7*7*8*8*8*8*8*8*8*8*]#/"0#0$0$0$0$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$2$2$2$2$2$2$2$2$2$2$2$2$2$0#_V<}hzezezezezezezezezezezezek¾¾QG*5'6(6(6(6(6(6(6(6(6(6(6(6(6(6(6(6(6(7)7)7)7)7)7)7)7)7)7)7)7)7)7)7)7)7)7)7)7)7)7)7*7*7*7*7*8*8*8*8*8*8*8*8*8*8*8*8*]#/#0$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$2$2$2$2$2$2$2$2$2$2$2$2$2%2%2%2%2%ohQ~j}i{fzezezezezezezezeze{f¾þPF(5'6(6(6(6(6(6(6(6(6(6(6(6(6(7(7)7)7)7)7)7)7)7)7)7)7)7)7)7)7)7)7)7)7)7)7)7*7*7*7*7*8*8*8*8*8*8*8*8*8*8*8*8*8*8*8*]#0#1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$2$2$2$2$2$2$2$2$2$2$2%2%2%2%2%2%2%2%2%2%7* zs^~j~j~j}hzezezezezezezezeÿÿF:5'6(6(6(6(6(6(6(6(6(7(7)7)7)7)7)7)7)7)7)7)7)7)7)7)7)7)7)7)7)7)7)7)7*7*7*7*8*8*8*8*8*8*8*8*8*8*8*8*8*8*8*8*8*8*]#0#1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$2$2$2$2$2$2$2$2$2$2%2%2%2%2%2%2%2%2%2%2%2%2%2%2%<0~k~j~j~j~j}i{gzezezezezet¾ÿĿ}A56(6(6(6(6(6(7(7)7)7)7)7)7)7)7)7)7)7)7)7)7)7)7)7)7)7)7)7)7)7*7*7*7*8*8*8*8*8*8*8*8*8*8*8*8*8*8*8*8*8*8*8+8+8+]#0#1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$2$2$2$2$2$2$2$2%2%2%2%2%2%2%2%2%2%2%2%2%2%2%2%2%2%2%2%1$J@"l~j~j~j~j~j~j}i{fzeze~jÿ½|?26(6(7(7)7)7)7)7)7)7)7)7)7)7)7)7)7)7)7)7)7)7)7)7)7)7*7*7*7*8*8*8*8*8*8*8*8*8*8*8*8*8*8*8*8*8*8*8+8+8+8+8+8+]#0#1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$2$2$2$2$2$2%2%2%2%2%2%2%2%2%2%2%2%2%2%2%2%2%2%2%2%2%2%2%2%2%1$\R7k~j~j~j~j~j~j~j~j|g{fÿ¾w2l~j~j~j}i½½9+9+9+9+9+9+9+9+9+9,9,9,9,9,9,9,9,9,9,9,:,:,:,:,:,:,:,:,:,:,:,:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-;-;-;-]#2%3&3&3&3&3&3&3&3&3&3&3&3&3&3&3&3&3&3&3&3&3&4&4&4&4&4'4'4'4'4'4'4'4'4'4'4'4'4'4'4'4'4'4'4'4'4'4'4'4'4'MC$~k~j~j~jq9+9+9+9+9+9+9,9,9,9,9,9,9,9,9,9,9,:,:,:,:,:,:,:,:,:,:,:,:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-;-;-;-;-;-;-]#2%3&3&3&3&3&3&3&3&3&3&3&3&3&3&3&3&3&4&4&4'4'4'4'4'4'4'4'4'4'4'4'4'4'4'4'4'4'4'4'4'4'4'4'4'4'4'4'4'4'4']S8~j~j~j}i½;.9+9+9,9,9,9,9,9,9,9,9,9,9,:,:,:,:,:,:,:,:,:,:,:,:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-;-;-;-;-;-;-;.;.;.]#2%3&3&3&3&3&3&3&3&3&3&3&3&4'4'4'4'4'4'4'4'4'4'4'4'4'4'4'4'4'4'4'4'4'4'4'4'4'4'4'4'4'4'4'4'4'4'4'4'5'5'meL~j~j~jpJ@9,9,9,9,9,9,9,9,9,:,:,:,:,:,:,:,:,:,:,:,:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-;-;-;-;-;-;-;.;.;.;.;.;.;.]#2%3&3&3&3&3&3&3'3'3'4'4'4'4'4'4'4'4'4'4'4'4'4'4'4'4'4'4'4'4'4'4'4'4'4'4'4'4'4'4'4'4'4'4'4'4'5'5'5'5'5'|u`~j~j~j½\U89,9,9,9,9,9,:,:,:,:,:,:,:,:,:,:,:,:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-;-;-;-;-;-;-;.;.;.;.;.;.;.;.;.;.]#2%3'3'3'3'3'4'4'4'4'4'4'4'4'4'4'4'4'4'4'4'4'4'4'4'4'4'4'4'4'4'4'4'4'4'4'4'4'4'4'4'4'5'5'5'5'5'5'5'5'<. ~k~j~jrÿjeK9,9,9,:,:,:,:,:,:,:,:,:,:,:,:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-;-;-;-;-;-;-;.;.;.;.;.;.;.;.;.;.;.;.;.]#2&3'4'4'4'4'4'4'4'4'4'4'4'4'4'4'4'4'4'4'4'4'4'4'4'4'4'4'4'4'4'4'4'4'4'4'4'4'4'5'5'5'5'5'5'5'5'5'5'5'LA!~j~j~j|ze:+:,:,:,:,:,:,:,:,:,:,:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-;-;-;-;-;-;-;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.]#3&4'4'4'4'4'4'4'4'4'4'4'4'4'4'4'4'4'4'4'4'4'4'4'4'4'4'4'4'4'4'4'4'4'4'5'5'5'5'5'5'5'5'5'5'5(5(5(5(5(ZP4~j~jry9+:,:,:,:,:,:,:,:,:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-;-;-;-;-;-;-;-;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.]#3&4'4'4'4'4'4'4'4'4'4'4'4'4'4'4'4'4'4'4'4'4'4'4'4'4'4'4'4'4'4'5'5'5'5'5'5'5'5'5'5(5(5(5(5(5(5(5(5(5(iaG~j~j¼9+:,:,:,:,:,:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-;-;-;-;-;-;-;-;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.<.]#3&4'4'4'4'4'4'4'4'4'4'4'4'4'4'4'4'4'4'4'4'4'4'4'4'4'4'5'5'5'5'5'5'5'5(5(5(5(5(5(5(5(5(5(5(5(5(5(5(4'yr\~jt8*:,:,:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-;-;-;-;-;-;-;-;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.<.<.~jtNE#:-:-:-:-:-:-:-:-:-:-:-;-;-;-;-;-;-;-;-;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.<.<.1]#5(6)6)6)6)6)6)6)6)6)6)6)6)6)6)6)6)6)6)6)6)6)6)6)6)6)6)6)6)6)6)6)6)7)7)7)7)7)7)7)7)7)7*7*7*7*7*7*7*TK,SJ'1>1>1>1]#5(6)6)6)6)6)6)6)6)6)6)6)6)6)6)6)6)6)6)6)6)6)6)6)6)6)6)6)6)7)7)7)7)7)7)7)7)7*7*7*7*7*7*7*7*7*7*7*7*F;>11>1>1>1>1>1>1>1]#5(6)6)6)6)6)6)6)6)6)6)6)6)6)6)6)6)6)6)6)6)6)6)6)6)7)7)7)7)7)7)7*7*7*7*7*7*7*7*7*7*7*7*7*7*7*7*7*7*1>1>1>1>1>1>1>1>1>1]#5(6)6)6)6)6)6)6)6)6)6)6)6)6)6)6)6)6)6)6)6)6)7)7)7)7)7*7*7*7*7*7*7*7*7*7*7*7*7*7*7*7*7*7*7*7*7*7*7*6)½~1>1>1>1>1>1>1>1>1>1>1>1>1]#5(6)6)6)6)6)6)6)6)6)6)6)6)6)6)6)6)6)7)7)7)7*7*7*7*7*7*7*7*7*7*7*7*7*7*7*7*7*7*7*7*7*7*7*7*7*7*7*7*6)qtqY1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1]#5(6)6)6)6)6)6)6)6)6)6)6)6)6)6)7*7*7*7*7*7*7*7*7*7*7*7*7*7*7*7*7*7*7*7*7*7*7*7*7*7*7*7*7*7*7*7*7*7*7)ws]YQ21>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>2]#5(6)6)6)6)6)6)6)6)6*6*7*7*7*7*7*7*7*7*7*7*7*7*7*7*7*7*7*7*7*7*7*7*7*7*7*7*7*7*7*7*7*7*7*7*7*7*8*8*8*keL@4 1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>2>2>2]#5(6)6)6)6*6*6*7*7*7*7*7*7*7*7*7*7*7*7*7*7*7*7*7*7*7*7*7*7*7*7*7*7*7*7*7*7*7*7*7*7*7*7*7*8*8*8*8*8*8*_W;>1 =0=0=0=0=0=0=0=0=0=0=0=0=0=0=0=0=0=0=0=0=0=0=1=1=1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>2>2>2>2>2>2]#5)6*6*7*7*7*7*7*7*7*7*7*7*7*7*7*7*7*7*7*7*7*7*7*7*7*7*7*7*7*7*7*7*7*7*7*7*7*7*7*8*8*8*8*8*8*8*8*8*8*SI)=0=0=0=0=0=0=0=0=0=0=0=0=0=0=0=0=0=0=0=0=1=1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>2>2>2>2>2>2>2>2?2]#6)7*7*7*7*7*7*7*7*7*7*7*7*7*7*7*7*7*7*7*7*7*7*7*7*7*7*7*7*7*7*7*7*7*7*8*8*8*8*8*8*8*8*8*8*8+8+8+8+8+F;Ŀ|zd=0=0=0=0=0=0=0=0=0=0=0=0=0=0=0=0=0=1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>2>2>2>2>2>2>2>2>2?2?2?2?2]#6)7*7*7*7*7*7*7*7*7*7*7*7*7*7*7*7*7*7*7*7*7*7*7*7*7*7*7*7*7*7*8*8*8*8*8*8*8*8*8*8+8+8+8+8+8+8+8+8+8+:-^W8=0=0=0=0=0=0=0=0=0=0=0=0=0=0=1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>2>2>2>2>2>2>2>2?2?2?2?2?2?2?2?2]#6)7*7*7*7*7*7*7*7*7*7*7*7*7*7*7*7*7*7*7*7*7*7*7*7*7*7*7*8*8*8*8*8*8*8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+~F;=0=0=0=0=0=0=0=0=0=0=0=1=1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>2>2>2>2>2>2>2>2?2?2?2?2?2?2?2?2?2?2?2]#6)7*7*7*7*7*7*7*7*7*7*7*7*7*7*7*7*7*7*7*7*7*7*7*8*8*8*8*8*8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+l@3 =0=0=0=0=0=0=0=0=1=1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>2>2>2>2>2>2>2>2?2?2?2?2?2?2?2?2?2?2?2?2?2?2]#6)7*7*7*7*7*7*7*7*7*7*7*7*7*7*7*7*7*7*7*8*8*8*8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+ws\>1=0=0=0=0=0=1=1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>2>2>2>2>2>2>2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?3?3]#6)7*7*7*7*7*7*7*7*7*7*7*7*7*7*7*8*8*8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+jdJþl1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>2>2>2>2>2>2>2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?3?3?3?3?3]#6)7*7*7*7*7*7*7*7*7*7*7*7+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+9+9+]U8gbE=0>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>2>2>2>2>2>2>2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?3?3?3?3?3?3?3 ?3 ]#6)7*7*7*7*7*7*7+7+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+9+9+9+9+9+9+QG&K@>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>2>2>2>2>2>2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?3?3?3?3?3?3?3 ?3 ?3 ?3 ]#6)7+7+7+7+7+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+9+9+9+9+9+9+9+9+9+D8C7>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>2>2>2>2>2>2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?3?3?3?3?3?3?3?3 ?3 ?3 ?3 @3 @3 ]#6*7+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+9+9+9+9+9+9+9+9+9+9+9+9+9+;/?2 >1>1>1>1>1>1>1>1>1>1>1>1>1>1>2>2>2>2>2>2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?3?3?3?3?3?3?3?3?3 ?3 ?3 @3 @3 @3 @3 @3 ]#7*8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+9+9+9+9+9+9+9+9+9+9+9,9,9,9,9,9,:.{þu=0>1>1>1>1>1>1>1>1>1>1>1>2>2>2>2>2>2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?3?3?3?3?3?3?3?3?3?3 ?3 @3 @3 @3 @3 @3 @3 @3 @3 ]#7*8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+9+9+9+9+9+9+9+9+9+9,9,9,9,9,9,9,9,9,9,9,9-}ilgK=0>1>1>1>1>1>1>1>1>1>2>2>2>2>2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?3?3?3?3?3?3?3?3?3?3?3 @3 @3 @3 @3 @3 @3 @3 @3 @3 @3 @3 ]#7*8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+9+9+9+9+9+9+9+9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,vr[QH$>1>1>1>1>1>1>1>2>2>2>2>2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?3?3?3?3?3?3?3?3?3?3?3@3 @3 @3 @3 @3 @3 @3 @3 @3 @3 @3 @4 @4 @4 ]#7*8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+9+9+9+9+9+9+9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,ibHF:>1>1>1>1>2>2>2>2>2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?3?3?3?3?3?3?3?3?3?3?3@3@3 @3 @3 @3 @3 @3 @3 @3 @3 @3 @4 @4 @4 @4 @4 @4 ]#7*8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+9+9+9+9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,]V9@4 >1>2>2>2>2>2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?3?3?3?3?3?3?3?3?3?3@3@3@3 @3 @3 @3 @3 @3 @3 @3 @3 @4 @4 @4 @4 @4 @4 @4 @4 @4 ]#7*8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+9+9+9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,PE$½=1>2>2>2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?3?3?3?3?3?3?3?3?3?3@3@3@3@3 @3 @3 @3 @3 @3 @3 @3 @3 @4 @4 @4 @4 @4 @4 @4 @4 @4 @4 @4 ]#7*8+8+8+8+8+8+8+8+8+8+8+8,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,:,:,:,C6tqW>1?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?3?3?3?3?3?3?3?3?3?3@3@3@3@3@3 @3 @3 @3 @3 @3 @3 @3 @4 @4 @4 @4 @4 @4 @4 @4 @4 @4 @4 @4 @4 @4 ]#7*8+8+8+8,8,8,8,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,:,:,:,:,:,:,:,:,=0 XO,>1?2?2?2?2?2?2?2?2?2?2?2?2?2?3?3?3?3?3?3?3?3?3?3@3@3@3@3@3@3@3 @3 @3 @3 @3 @3 @4 @4 @4 @4 @4 @4 @4 @4 @4 @4 @4 @4 @4 @4 @4 @4 @4 A4 ]#7+8,8,8,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,:,:,:,:,:,:,:,:,:,:,:,:,:,^V8þI>?2?2?2?2?2?2?2?2?2?2?2?2?3?3?3?3?3?3?3?3?3@3@3@3@3@3@3@3 @3 @3 @3 @3 @3 @3 @4 @4 @4 @4 @4 @4 @4 @4 @4 @4 @4 @4 @4 @4 @4 @4 A4 A4 A4 A4 ]#8+9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,:,:,:,:,:,:,:,:,:,:,:,:-:-:-:-:-:-icGB6?2?2?2?2?2?2?2?2?2?3?3?3?3?3?3?3?3?3@3@3@3@3@3@3@3@3 @3 @3 @3 @3 @3 @4 @4 @4 @4 @4 @4 @4 @4 @4 @4 @4 @4 @4 @4 @4 @4 A4 A4 A4 A4 A4 A5 A5 ]#8+9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,:,:,:,:,:,:,:,:,:,:,:-:-:-:-:-:-:-:-:-:-:-:.keJ=0?2?2?2?2?2?2?3?3?3?3?3?3?3?3?3@3@3@3@3@3@3@3@3@3 @3 @3 @3 @3 @4 @4 @4 @4 @4 @4 @4 @4 @4 @4 @4 @4 @4 @4 @4 @4 A4 A4 A4 A4 A4 A5 A5 A5 A5 A5 ]#8+9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,:,:,:,:,:,:,:,:,:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-;.vqYzw_=0?2?2?2?3?3?3?3?3?3?3?3?3@3@3@3@3@3@3@3@3@3@3 @3 @3 @3 @4 @4 @4 @4 @4 @4 @4 @4 @4 @4 @4 @4 @4 @4 @4 @4 A4 A4 A4 A4 A4 A4 A5 A5 A5 A5 A5 A5 A5 ]#8+9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,:,:,:,:,:,:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:->2 ~ze_W7>2?3?3?3?3?3?3?3?3?3@3@3@3@3@3@3@3@3@3@3@3 @3 @3 @4 @4 @4 @4 @4 @4 @4 @4 @4 @4 @4 @4 @4 @4 @4 @4 A4 A4 A4 A4 A4 A4 A5 A5 A5 A5 A5 A5 A5 A5 A5 A5 ]#8+9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,:,:,:,:,:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-?2 |hMC?3?3?3?3?3?3?3@3@3@3@3@3@3@3@3@3@3@3@3 @3 @4 @4 @4 @4 @4 @4 @4 @4 @4 @4 @4 @4 @4 @4 @4 @4 A4 A4 A4 A4 A4 A4 A5 A5 A5 A5 A5 A5 A5 A5 A5 A5 A5 A5 A5 ]#8+9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,:,:,:,:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-;-;-;-B4uk@4 ?3?3?3?3@3@3@3@3@3@3@3@3@3@3@3@3@3 @4 @4 @4 @4 @4 @4 @4 @4 @4 @4 @4 @4 @4 @4 @4 @4 A4 A4 A4 A4 A4 A4 A5 A5 A5 A5 A5 A5 A5 A5 A5 A5 A5 A5 A5 A5 A5 A5 ]#8+9,9,9,9,9,9,9,9,9,9,9,9,9,9,:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-;-;-;-;-;-;-;-:,H<{f`B>2?3?3@3@3@3@3@3@3@3@3@3@3@3@3@3@3 @4 @4 @4 @4 @4 @4 @4 @4 @4 @4 @4 @4 @4 @4 @4 A4 A4 A4 A4 A4 A4 A4 A5 A5 A5 A5 A5 A5 A5 A5 A5 A5 A5 A5 A5 A5 A5 A5 A5 A5 ]#8+9,9,9,9,9,9,9,9,9-9-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-;-;-;-;-;-;-;-;-;-;-;-;-:,I=~OF?2@3@3@3@3@3@3@3@3@3@3@3@3@3@3@4@4 @4 @4 @4 @4 @4 @4 @4 @4 @4 @4 @4 @4 @4 A4 A4 A4 A4 A4 A4 A4 A5 A5 A5 A5 A5 A5 A5 A5 A5 A5 A5 A5 A5 A5 A5 A5 A5 A5 A5 A5 B5 ]#8+9,9,9,9-9-9-9-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;.;.:-PG$|D8@3@3@3@3@3@3@3@3@3@3@3@3@3@4@4@4 @4 @4 @4 @4 @4 @4 @4 @4 @4 @4 @4 @4 A4 A4 A4 A4 A4 A4 A4 A5 A5 A5 A5 A5 A5 A5 A5 A5 A5 A5 A5 A5 A5 A5 A5 A5 A5 A5 A5 B5 B5 B6 B6 ]#8,9-9-9-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-;-;-;-;-;-;-;-;-;-;-;-;-;-;.;.;.;.;.;.;.;.9,XO0½plR?2@3@3@3@3@3@3@3@3@3@3@3@4@4@4@4 @4 @4 @4 @4 @4 @4 @4 @4 @4 @4 @4 A4 A4 A4 A4 A4 A4 A4 A5 A5 A5 A5 A5 A5 A5 A5 A5 A5 A5 A5 A5 A5 A5 A5 A5 A5 A5 A5 B5 B5 B6 B6 B6 B6 B6 ]#9,:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-;-;-;-;-;-;-;-;-;-;-;-;.;.;.;.;.;.;.;.;.;.;.;.;.;.9,[R3VM)>1@3@3@3@3@3@3@3@3@3@3@4@4@4 @4 @4 @4 @4 @4 @4 @4 @4 @4 @4 @4 A4 A4 A4 A4 A4 A4 A4 A4 A5 A5 A5 A5 A5 A5 A5 A5 A5 A5 A5 A5 A5 A5 A5 A5 A5 A5 A5 B5 B5 B6 B6 B6 B6 B6 B6 B6 B6 ]#9,:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-;-;-;-;-;-;-;-;-;-;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.9,hbFD8?2@3@3@3@3@3@3@3@3@4@4@4@4 @4 @4 @4 @4 @4 @4 @4 @4 @4 @4 A4 A4 A4 A4 A4 A4 A4 A4 A5 A5 A5 A5 A5 A5 A5 A5 A5 A5 A5 A5 A5 A5 A5 A5 A5 A5 A5 A5 B5 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 ]#9,:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-;-;-;-;-;-;-;-;-;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;-leIwt[>1@3@3@3@3@3@3@3@4@4@4@4@4 @4 @4 @4 @4 @4 @4 @4 @4 @4 A4 A4 A4 A4 A4 A4 A4 A4 A5 A5 A5 A5 A5 A5 A5 A5 A5 A5 A5 A5 A5 A5 A5 A5 A5 A5 A5 B5 B5 B5 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 ]#9,:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-;-;-;-;-;-;-;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.<.<.<.;-qkQ[S0>1@3@3@3@3@3@4@4@4@4@4@4 @4 @4 @4 @4 @4 @4 @4 @4 A4 A4 A4 A4 A4 A4 A4 A4 A5 A5 A5 A5 A5 A5 A5 A5 A5 A5 A5 A5 A5 A5 A5 A5 A5 A5 A5 B5 B5 B5 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 ]#9,:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-;-;-;-;.;.;-;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.<.<.<.<.<.<.<.<.=0{w`I>?2@3@3@4@4@4@4@4@4@4@4 @4 @4 @4 @4 @4 @4 A4 A4 A4 A4 A4 A4 A4 A4 A4 A5 A5 A5 A5 A5 A5 A5 A5 A5 A5 A5 A5 A5 A5 A5 A5 A5 A5 A5 B5 B5 B5 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 ]#9,:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-;-;-;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.<.<.<.<.<.<.<.<.<.<.<.<.<.<.?2 }yd{yaA4 @3@4@4@4@4@4@4@4@4@4 @4 @4 @4 @4 @4 A4 A4 A4 A4 A4 A4 A4 A4 A5 A5 A5 A5 A5 A5 A5 A5 A5 A5 A5 A5 A5 A5 A5 A5 A5 A5 A5 B5 B5 B5 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B7 ]#9,:-:-:-:-:-:-:-:-:-:-:-:-;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.2@4@4@4A4 A4 A4 A4 A4 A4 A4 A4 A4 A4 A5 A5 A5 A5 A5 A5 A5 A5 A5 A5 A5 A5 A5 A5 A5 A5 A5 B5 B5 B5 B5 B5 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 ]#:-;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.<.<.<.<.1A4A4A4 A4 A4 A4 A4 A4 A5 A5 A5 A5 A5 A5 A5 A5 A5 A5 A5 A5 A5 A5 A5 A5 A5 B5 B5 B5 B5 B5 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C8 C8 C8 C8 C8 C8 D8 ]#:-;.;.;.;.;.;.;.;.;.;.;.;/0>0@3 ~iJ>@3A4 A4 A4 A4 A4 A5 A5 A5 A5 A5 A5 A5 A5 A5 A5 A5 A5 A5 A5 A5 A5 B5 B5 B5 B5 B5 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C8 C8 C8 C8 C8 C8 D8 D8 D8 D8 D8 D8 D8 ]#:-;/;/;/;/0>0>0>0>0>0D8v}{cB6 A4 A4 A4 A4 A5 A5 A5 A5 A5 A5 A5 A5 A5 A5 A5 A5 A5 A5 A5 A5 B5 B5 B5 B5 B5 B5 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 C6 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C8 C8 C8 C8 C8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 ]#:.;/0>0>0>0>0>0>0>0>1>0H<`Y8?2A4 A4 A5 A5 A5 A5 A5 A5 A5 A5 A5 A5 A5 A5 A5 A5 A5 A5 B5 B5 B5 B5 B5 B5 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 C6 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C8 C8 C8 C8 C8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 ]#;.0>0>0>0>0>0>0>0>1>1>1>1>1=0I>¾MC@3A5 A5 A5 A5 A5 A5 A5 A5 A5 A5 A5 A5 A5 A5 A5 A5 B5 B5 B5 B5 B5 B5 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 C6 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C8 C8 C8 C8 C8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 ]#;.0>0>0>0>0>0>0>0>1>1>1>1>1>1>1>1>1>1=0MBvsZnjMD9@4A5 A5 A5 A5 A5 A5 A5 A5 A5 A5 A5 A5 A5 B5 B5 B5 B5 B5 B5 B5 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 C6 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C8 C8 C8 C8 C8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D9 D9 D9 ]#;.0>0>0>0>0>0>0>0>1>1>1>1>1>1>1>1>1>1>1>1>1>1>11I=`X9ktqUOF?3@4A5 A5 A5 A5 A5 A5 A5 A5 A5 A5 A5 A5 B5 B5 B5 B5 B5 B5 B5 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 C6 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C8 C8 C8 C8 C8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D9 D9 D9 D9 D9 D9 ]#;.0>0>0>0>0>0>0>0>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1?1?1>0=0D8QG"rmRzx_QG!B6 @3A5 A5 A5 A5 A5 A5 A5 A5 A5 A5 A5 A5 B5 B5 B5 B5 B5 B5 B5 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 C6 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C8 C8 C8 C8 C8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D9 D9 D9 D9 D9 D9 D9 D9 D9 ]#;.0>0>0>0>0>0>0>0>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1?1?1?1?2?2?2?2?2>1>0@4 G<`Y9kÿiUL'D9@3A5 A5 A5 A5 A5 A5 A5 A5 A5 A5 A5 A5 B5 B5 B5 B5 B5 B5 B5 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 C6 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C8 C8 C8 C8 C8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D9 D9 D9 D9 D9 D9 D9 D9 D9 D9 E9 E9 ]#;.0>0>0>0>0>0>0>0>0>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1?1?1?1?1?2?2?2?2?2?2?2?2?2?2?2>1>2C6 QG!rmRxYR-E9@4@4A5 A5 A5 A5 A5 A5 A5 A5 A5 A5 A5 B5 B5 B5 B5 B5 B5 B5 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 C6 C6 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C8 C8 C8 C8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D9 D9 D9 D9 D9 D9 D9 D9 D9 E9 E9 E9 E9 E9 ]#;.0>0>0>0>0>0>0>0>0>0>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1?1?1?1?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2>1@4 E:^V5iÿ^W4E:A5 @4A5 A5 A5 A5 A5 A5 A5 A5 A5 A5 A5 B5 B5 B5 B5 B5 B5 B5 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 C6 C6 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C8 C8 C8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D9 D9 D9 D9 D9 D9 D9 D9 D9 E9 E9 E9 E9 E9 E9 E9 E9 ]#;.0>0>0>0>0>0>0>0>0>0>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1?1?1?1?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?3?3@3@3B5 PEqkP|jeFE:A5 A5A5 A5 A5 A5 A5 A5 A5 A5 A5 A5 A5 B5 B5 B5 B5 B5 B5 B5 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 C6 C6 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C8 C8 C8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D9 D9 D9 D9 D9 D9 D9 D9 D9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 ]#;/<0<0<0=0=0=0=0=0=0=0=0=0=0=0=0=0=0=0=0=0=0=0=0=0=0=0=0=0=0=0=0=0=0=0=0=0=0=0=0>0>0>0>0>0>0>0>0>0>0>0>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1?1?1?1?1?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?3?3@3@3@3@3@3@3@3@3@3D8^V5|eplOG<A5A5A5A5 A5 A5 A5 A5 A5 A5 A5 A5 A5 B5 B5 B5 B5 B5 B5 B5 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 C6 C6 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C8 C8 C8 C8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D9 D9 D9 D9 D9 D9 D9 D9 D9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E: ]#0>0>0>0>0>0>0>0>0>0>0>0>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1?1?1?1?1?1?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?3?3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3OEpjNwtZLC@4A5A5A5A5 A5 A5 A5 A5 A5 A5 A5 A5 B5 B5 B5 B5 B5 B5 B5 B5 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 C6 C6 C6 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C8 C8 C8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D9 D9 D9 D9 D9 D9 D9 D9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E: E: E: E: ]#0>0>0>0>0>0>0>0>0>0>0>0>0>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1?1?1?1?1?1?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@4?2D9`Y8}fgTL%?3A4A5A5A5A5 A5 A5 A5 A5 A5 A5 A5 B5 B5 B5 B5 B5 B5 B5 B5 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 C6 C6 C6 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C8 C8 C8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D9 D9 D9 D9 D9 D9 D9 D9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E: E: E: E: E: E: E: ]#0>0>0>0>0>0>0>0>0>0>0>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1?1?1?1?1?1?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@4@4@4@4@4@4@4?3?3RH"pkNqYQ->2@4A5A5A5A5A5 A5 A5 A5 A5 A5 A5 B5 B5 B5 B5 B5 B5 B5 B5 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 C6 C6 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C8 C8 C8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D9 D9 D9 D9 D9 D9 D9 D9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E: E: E: E: E: E: E: E: E: ]#0>0>0>0>0>0>0>0>0>0>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1?1?1?1?1?1?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@4@4@4@4@4@4@4@4A4A4A4A4@3>1G:`W6|eÿza[9B7 @3A5A5A5A5A5A5 A5 A5 A5 A5 A5 B5 B5 B5 B5 B5 B5 B5 B5 B5 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 C6 C6 C6 C6 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C8 C8 C8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D9 D9 D9 D9 D9 D9 D9 D9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E: E: E: E: E: E: E: E: E: E: E: E: ]#0>0>0>0>0>0>0>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1?1?1?1?1?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@4@4@4@4@4@4@4@4A4A4A4A4A4A4A4A4A4A4A4?2?2SJ"E:?2A5A5A5A5A5A5A5 A5 A5 A5 A5 B5 B5 B5 B5 B5 B5 B5 B5 B5 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 C6 C6 C6 C6 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C8 C8 C8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D9 D9 D9 D9 D9 D9 D9 D9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E: E: E: E: E: E: E: E: E: E: E: E: E: F: F: ]#0>0>0>0>0>0>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1?1?1?1?1?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@4@4@4@4@4@4@4@4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A5A5A5A5A5A5A5A5A5A5 A5 A5 A5 B5 B5 B5 B5 B5 B5 B5 B5 B5 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 C6 C6 C6 C6 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D9 D9 D9 D9 D9 D9 D9 D9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E: E: E: E: E: E: E: E: E: E: E: E: E: F: F: F: F: F: ]#0>0>0>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1?1?1?1?1?1?1?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@4@4@4@4@4@4@4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A5A5A5A5A5A5A5A5A5A5A5 A5 A5 B5 B5 B5 B5 B5 B5 B5 B5 B5 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 C6 C6 C6 C6 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C8 C8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D9 D9 D9 D9 D9 D9 D9 D9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E: E: E: E: E: E: E: E: E: E: E: E: E: F: F: F: F: F: F: F: F: ]#0>0>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1?1?1?1?1?1?1?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@4@4@4@4@4@4@4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A5A5A5A5A5A5A5A5A5A5A5 A5 B5 B5 B5 B5 B5 B5 B5 B5 B5 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 C6 C6 C6 C6 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C8 C8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D9 D9 D9 D9 D9 D9 D9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E: E: E: E: E: E: E: E: E: E: E: E: F: F: F: F: F: F: F: F: F: F: F; ]#1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1?1?1?1?1?1?1?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2@2@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@4@4@4@4@4@4@4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A5A5A5A5A5A5A5A5A5A5A5 A5 B5 B5 B5 B5 B5 B5 B5 B5 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 C6 C6 C6 C6 C6 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C8 C8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D9 D9 D9 D9 D9 D9 D9 D9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E: E: E: E: E: E: E: E: E: E: E: F: F: F: F: F: F: F: F: F: F: F: F; F; F; F; ]#<0=1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1?1?1?1?1?1?1?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2@2@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@4@4@4@4@4@4@4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A5A5A5A5A5A5A5A5A5A5A5A5B5 B5 B5 B5 B5 B5 B5 B5 B5 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 C6 C6 C6 C6 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C8 C8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D9 D9 D9 D9 D9 D9 D9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E: E: E: E: E: E: E: E: E: E: E: E: F: F: F: F: F: F: F: F: F: F: F; F; F; F; F; F; F; F; ]#=0>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1?1?1?1?1?1?1?1?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@4@4@4@4@4@4@4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A5A5A5A5A5A5A5A5A5A5A5A5B5B5 B5 B5 B5 B5 B5 B5 B5 B5 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 C6 C6 C6 C6 C6 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D9 D9 D9 D9 D9 D9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E: E: E: E: E: E: E: E: E: E: E: E: F: F: F: F: F: F: F: F: F: F: F; F; F; F; F; F; F; F; F; F; F; ]#=0>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1?1?1?1?1?1?1?1?1?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2@2@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@4@4@4@4@4@4@4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A5A5A5A5A5A5A5A5A5A5A5A5B5B5B5 B5 B5 B5 B5 B5 B5 B5 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 C6 C6 C6 C6 C6 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D9 D9 D9 D9 D9 D9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E: E: E: E: E: E: E: E: E: E: E: E: F: F: F: F: F: F: F: F: F: F: F; F; F; F; F; F; F; F; F; F; F; F; F; F; ]#=0>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1?1?1?1?1?1?1?1?1?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2@2@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@4@4@4@4@4@4@4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A5A5A5A5A5A5A5A5A5A5A5A5B5B5B5B5 B5 B5 B5 B5 B5 B5 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 C6 C6 C6 C6 C6 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D9 D9 D9 D9 D9 D9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E: E: E: E: E: E: E: E: E: E: E: E: F: F: F: F: F: F: F: F: F: F: F; F; F; F; F; F; F; F; F; F; F; F; F; F; F; F; F; ]#=0>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1?1?1?1?1?1?1?1?1?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2@2@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@4@4@4@4@4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A5A5A5A5A5A5A5A5A5A5A5A5B5B5B5B5B5 B5 B5 B5 B5 B5 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 C6 C6 C6 C6 C6 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D9 D9 D9 D9 D9 D9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E: E: E: E: E: E: E: E: E: E: E: F: F: F: F: F: F: F: F: F: F: F; F; F; F; F; F; F; F; F; F; F; F; F; F; F; F; F; G; G; G; ]#=0>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1?1?1?1?1?1?1?1?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2@2@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@4@4@4@4@4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A5A5A5A5A5A5A5A5A5A5A5B5B5B5B5B5B5 B5 B5 B5 B5 B5 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 C6 C6 C6 C6 C6 C6 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D9 D9 D9 D9 D9 D9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E: E: E: E: E: E: E: E: E: E: E: F: F: F: F: F: F: F: F: F: F: F: F; F; F; F; F; F; F; F; F; F; F; F; F; F; F; F; G; G; G; G; G; G; ]#=0>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1?1?1?1?1?1?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2@2@2@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@4@4@4@4@4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A5A5A5A5A5A5A5A5A5A5A5B5B5B5B5B5B5B5 B5 B5 B5 B5 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 C6 C6 C6 C6 C6 C6 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D9 D9 D9 D9 D9 D9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E: E: E: E: E: E: E: E: E: E: E: F: F: F: F: F: F: F: F: F: F: F: F; F; F; F; F; F; F; F; F; F; F; F; F; F; F; F; F; G; G; G; G; G; G< G< G< ]#=0>1>1>1>1>1>1>1>1>1>1>1>1?1?1?1?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2@2@2@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@4@4@4@4@4@4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A5A5A5A5A5A5A5A5A5A5A5B5B5B5B5B5B5B5B5 B5 B5 B5 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 C6 C6 C6 C6 C6 C6 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D9 D9 D9 D9 D9 D9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E: E: E: E: E: E: E: E: E: E: E: F: F: F: F: F: F: F: F: F: F: F: F; F; F; F; F; F; F; F; F; F; F; F; F; F; F; F; F; G; G; G; G; G; G< G< G< G< G< G< ]#=0>1>1>1>1>1>1>1>1?1?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2@2@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@4@4@4@4@4@4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A5A5A5A5A5A5A5A5A5A5A5B5B5B5B5B5B5B5B5B5 B5 B5 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 C6 C6 C6 C6 C6 C6 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D9 D9 D9 D9 D9 D9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E: E: E: E: E: E: E: E: E: E: E: F: F: F: F: F: F: F: F: F: F: F: F; F; F; F; F; F; F; F; F; F; F; F; F; F; F; F; G; G; G; G; G; G; G< G< G< G< G< G< G< G< G< ]#=0>1>1>1>1>2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2@2@2@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@4@4@4@4@4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A5A5A5A5A5A5A5A5A5A5B5B5B5B5B5B5B5B5B5B5 B5 B5 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 C6 C6 C6 C6 C6 C6 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 D7 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D9 D9 D9 D9 D9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E: E: E: E: E: E: E: E: E: E: F: F: F: F: F: F: F: F: F: F: F: F: F; F; F; F; F; F; F; F; F; F; F; F; F; F; F; G; G; G; G; G; G; G; G< G< G< G< G< G< G< G< G< G< G< ]#=1>2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2@2@2@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@4@4@4@4@4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A5A5A5A5A5A5A5A5A5A5B5B5B5B5B5B5B5B5B5B5B5 B5 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 C6 C6 C6 C6 C6 C6 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 D7 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D9 D9 D9 D9 D9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E: E: E: E: E: E: E: E: E: E: F: F: F: F: F: F: F: F: F: F: F: F: F; F; F; F; F; F; F; F; F; F; F; F; F; F; F; G; G; G; G; G; G; G; G< G< G< G< G< G< G< G< G< G< G< G< G< G< ]#>1?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2@2@2@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@4@4@4@4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A5A5A5A5A5A5A5A5A5A5B5B5B5B5B5B5B5B5B5B5B5B5 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 C6 C6 C6 C6 C6 C6 C6 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 D7 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D9 D9 D9 D9 D9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E: E: E: E: E: E: E: E: E: E: F: F: F: F: F: F: F: F: F: F: F: F: F; F; F; F; F; F; F; F; F; F; F; F; F; F; F; G; G; G; G; G; G; G; G< G< G< G< G< G< G< G< G< G< G< G< G< G< G< G< G< ]#>1?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2@2@2@2@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@4@4@4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A5A5A5A5A5A5A5A5A5A5B5B5B5B5B5B5B5B5B5B5B5B5B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 C6 C6 C6 C6 C6 C6 C6 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 D7 D7 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D9 D9 D9 D9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E: E: E: E: E: E: E: E: E: F: F: F: F: F: F: F: F: F: F: F: F: F; F; F; F; F; F; F; F; F; F; F; F; F; F; F; G; G; G; G; G; G; G; G< G< G< G< G< G< G< G< G< G< G< G< G< G< G< G< G< G< G< G< ]#>1?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2@2@2@2@2@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@4@4@4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A5A5A5A5A5A5A5A5A5A5B5B5B5B5B5B5B5B5B5B5B5B5B6B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 C6 C6 C6 C6 C6 C6 C6 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 D7 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D9 D9 D9 D9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E: E: E: E: E: E: E: E: E: F: F: F: F: F: F: F: F: F: F: F: F: F; F; F; F; F; F; F; F; F; F; F; F; F; F; F; F; G; G; G; G; G; G; G< G< G< G< G< G< G< G< G< G< G< G< G< G< G< G< G< G< G< G< G< H< H= ]#>1?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2@2@2@2@2@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@4@4@4@4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A5A5A5A5A5A5A5A5A5A5B5B5B5B5B5B5B5B5B5B5B5B5B6B6B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 C6 C6 C6 C6 C6 C6 C6 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 D7 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D9 D9 D9 D9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E: E: E: E: E: E: E: E: E: F: F: F: F: F: F: F: F: F: F: F: F: F: F; F; F; F; F; F; F; F; F; F; F; F; F; F; F; G; G; G; G; G; G; G< G< G< G< G< G< G< G< G< G< G< G< G< G< G< G< G< G< G< G< G< H< H= H= H= H= [!>1?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2?2@2@2@2@2@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@4@4@4@4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A5A5A5A5A5A5A5A5A5B5B5B5B5B5B5B5B5B5B5B5B5B6B6B6B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 C6 C6 C6 C6 C6 C6 C6 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 D7 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D9 D9 D9 D9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E: E: E: E: E: E: E: E: E: F: F: F: F: F: F: F: F: F: F: F: F: F: F; F; F; F; F; F; F; F; F; F; F; F; F; F; G; G; G; G; G; G; G; G< G< G< G< G< G< G< G< G< G< G< G< G< G< G< G< G< G< G< G< G< H< H= H= H= H= H= H= H= Y!>1?2?2?2?2?2?2?2?2?2?2?2?2?2?2@2@2@2@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@4@4@4@4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A5A5A5A5A5A5A5A5A5B5B5B5B5B5B5B5B5B5B5B5B5B5B6B6B6B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 C6 C6 C6 C6 C6 C6 C6 C6 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 D7 D7 D7 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D9 D9 D9 D9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E: E: E: E: E: E: E: E: E: F: F: F: F: F: F: F: F: F: F: F: F: F: F; F; F; F; F; F; F; F; F; F; F; F; F; F; G; G; G; G; G; G; G; G; G< G< G< G< G< G< G< G< G< G< G< G< G< G< G< G< G< G< G< H< H< H< H= H= H= H= H= H= H= H= H= G< S=1y?2?2?2?2?2?2?2?2?2?2@2@2@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@4@4@4@4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A5A5A5A5A5A5A5A5A5B5B5B5B5B5B5B5B5B5B5B5B5B5B6B6B6B6B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 C6 C6 C6 C6 C6 C6 C6 C6 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 D7 D7 D7 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D9 D9 D9 D9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E: E: E: E: E: E: E: E: E: F: F: F: F: F: F: F: F: F: F: F: F: F: F; F; F; F; F; F; F; F; F; F; F; F; F; F; G; G; G; G; G; G; G; G; G< G< G< G< G< G< G< G< G< G< G< G< G< G< G< G< G< G< G< H< H< H< H= H= H= H= H= H= H= H= H= H= H= H= E; K=0e?2?2?2?2?2?2?2@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@4@4@4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A5A5A5A5A5A5A5A5A5B5B5B5B5B5B5B5B5B5B5B5B5B5B6B6B6B6B6B6 B6 B6 B6 B6 B6 B6 B6 B6 C6 C6 C6 C6 C6 C6 C6 C6 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 D7 D7 D7 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D9 D9 D9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E: E: E: E: E: E: E: E: E: F: F: F: F: F: F: F: F: F: F: F: F: F: F; F; F; F; F; F; F; F; F; F; F; F; F; F; G; G; G; G; G; G; G; G; G< G< G< G< G< G< G< G< G< G< G< G< G< G< G< G< G< G< G< H< H< H< H= H= H= H= H= H= H= H= H= H= H= H= H= H= H= A7 A=1G?2?3?3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@4@4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A5A5A5A5A5A5A5A5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B6B6B6B6B6B6 B6 B6 B6 B6 B6 B6 B6 C6 C6 C6 C6 C6 C6 C6 C6 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 D7 D7 D7 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D9 D9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E: E: E: E: E: E: E: E: F: F: F: F: F: F: F: F: F: F: F: F: F: F: F; F; F; F; F; F; F; F; F; F; F; F; F; G; G; G; G; G; G; G; G; G; G< G< G< G< G< G< G< G< G< G< G< G< G< G< G< G< G< G< H< H< H< H= H= H= H= H= H= H= H= H= H= H= H= H= H= H= H= H= H= :1 u5>1@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@4@4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A5A5A5A5A5A5A5A5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B6B6B6B6B6B6B6 B6 B6 B6 B6 B6 B6 C6 C6 C6 C6 C6 C6 C6 C6 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 D7 D7 D7 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D9 D9 D9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E: E: E: E: E: E: E: E: F: F: F: F: F: F: F: F: F: F: F: F: F: F: F; F; F; F; F; F; F; F; F; F; F; F; F; G; G; G; G; G; G; G; G; G; G< G< G< G< G< G< G< G< G< G< G< G< G< G< G< G< G< G< G< H< H< H= H= H= H= H= H= H= H= H= H= H= H= H= H= H= H= H= H= H= H= H= 0)c) ,#?2@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@4@4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A5A5A5A5A5A5A5A5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B6B6B6B6B6B6B6B6 B6 B6 B6 B6 B6 C6 C6 C6 C6 C6 C6 C6 C6 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 D7 D7 D7 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D9 D9 D9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E: E: E: E: E: E: E: E: F: F: F: F: F: F: F: F: F: F: F: F: F: F: F; F; F; F; F; F; F; F; F; F; F; F; F; G; G; G; G; G; G; G; G; G; G< G< G< G< G< G< G< G< G< G< G< G< G< G< G< G< G< G< G< H< H< H< H= H= H= H= H= H= H= H= H= H= H= H= H= H= H= H= H= H= H= H= H= H> H> #Q?2@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@4@4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A5A5A5A5A5A5A5A5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B6B6B6B6B6B6B6B6B6 B6 B6 B6 B6 C6 C6 C6 C6 C6 C6 C6 C6 C6 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 D7 D7 D7 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D9 D9 D9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E: E: E: E: E: E: E: E: F: F: F: F: F: F: F: F: F: F: F: F: F: F: F; F; F; F; F; F; F; F; F; F; F; F; F; G; G; G; G; G; G; G; G; G; G< G< G< G< G< G< G< G< G< G< G< G< G< G< G< G< G< G< G< H< H< H< H= H= H= H= H= H= H= H= H= H= H= H= H= H= H= H= H= H= H= H= H= H> H> H> I> I>  {=?2a@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@4@4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A5A5A5A5A5A5A5A5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B6B6B6B6B6B6B6B6B6B6B6 B6 B6 C6 C6 C6 C6 C6 C6 C6 C6 C6 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 D7 D7 D7 D7 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D9 D9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E: E: E: E: E: E: E: F: F: F: F: F: F: F: F: F: F: F: F: F: F: F; F; F; F; F; F; F; F; F; F; F; F; F; G; G; G; G; G; G; G; G; G; G< G< G< G< G< G< G< G< G< G< G< G< G< G< G< G< G< G< H< H< H< H< H= H= H= H= H= H= H= H= H= H= H= H= H= H= H= H= H= H= H= H= H= H= H> H> I> I> I> I> A7 a) =1@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@3@4@4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A5A5A5A5A5A5A5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B6B6B6B6B6B6B6B6B6B6B6B6 B6 C6 C6 C6 C6 C6 C6 C6 C6 C6 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 D7 D7 D7 D7 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D9 D9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E: E: E: E: E: E: E: F: F: F: F: F: F: F: F: F: F: F: F: F: F: F: F; F; F; F; F; F; F; F; F; F; F; F; G; G; G; G; G; G; G; G; G; G< G< G< G< G< G< G< G< G< G< G< G< G< G< G< G< G< G< H< H< H< H< H= H= H= H= H= H= H= H= H= H= H= H= H= H= H= H= H= H= H= H= H= H= H> H> I> I> I> I> I> I> I> -&G?2@3@3@3@3@3@3@3@3@3@3@3@3@3@3@4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A5A5A5A5A5A5A5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B6B6B6B6B6B6B6B6B6B6B6B6 B6 C6 C6 C6 C6 C6 C6 C6 C6 C6 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 D7 D7 D7 D7 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E: E: E: E: E: E: E: F: F: F: F: F: F: F: F: F: F: F: F: F: F: F: F; F; F; F; F; F; F; F; F; F; F; F; G; G; G; G; G; G; G; G; G; G< G< G< G< G< G< G< G< G< G< G< G< G< G< G< G< G< G< H< H< H< H< H= H= H= H= H= H= H= H= H= H= H= H= H= H= H= H= H= H= H= H= H= H= H> H> I> I> I> I> I> I> I> I> I> H= c- >15@3@3@3@3@3@3@3@3@3@3@3@4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A5A5A5A5A5A5A5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B6B6B6B6B6B6B6B6B6B6B6B6 C6 C6 C6 C6 C6 C6 C6 C6 C6 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 D7 D7 D7 D7 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E: E: E: E: E: E: E: F: F: F: F: F: F: F: F: F: F: F: F: F: F: F: F; F; F; F; F; F; F; F; F; F; F; F; G; G; G; G; G; G; G; G; G; G; G< G< G< G< G< G< G< G< G< G< G< G< G< G< G< G< G< G< H< H< H< H= H= H= H= H= H= H= H= H= H= H= H= H= H= H= H= H= H= H= H= H= H= H> H> I> I> I> I> I> I> I> I> I> I> I> I> 90 E@3?2@3@3@3@3@3@3@3@4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A5A5A5A5A5A5A5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B6B6B6B6B6B6B6B6B6B6B6B6C6 C6 C6 C6 C6 C6 C6 C6 C6 C6 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 D7 D7 D7 D7 D7 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E: E: E: E: E: E: E: F: F: F: F: F: F: F: F: F: F: F: F: F: F: F: F; F; F; F; F; F; F; F; F; F; F; F; G; G; G; G; G; G; G; G; G; G; G< G< G< G< G< G< G< G< G< G< G< G< G< G< G< G< G< G< H< H< H< H< H= H= H= H= H= H= H= H= H= H= H= H= H= H= H= H= H= H= H= H= H= H= H> I> I> I> I> I> I> I> I> I> I> I> I> I> I> H= Y' >1/@3@3@3@4@4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A5A5A5A5A5A5A5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B6B6B6B6B6B6B6B6B6B6B6B6C6C6 C6 C6 C6 C6 C6 C6 C6 C6 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 D7 D7 D7 D7 D7 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E: E: E: E: E: E: E: F: F: F: F: F: F: F: F: F: F: F: F: F: F: F: F; F; F; F; F; F; F; F; F; F; F; F; G; G; G; G; G; G; G; G; G; G; G< G< G< G< G< G< G< G< G< G< G< G< G< G< G< G< G< G< H< H< H< H< H= H= H= H= H= H= H= H= H= H= H= H= H= H= H= H= H= H= H= H= H= H= H> I> I> I> I> I> I> I> I> I> I> I> I> I> I> I> I> I> 7. k7@5@3@4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A5A5A5A5A5A5A5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B6B6B6B6B6B6B6B6B6B6B6B6C6C6C6 C6 C6 C6 C6 C6 C6 C6 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 D7 D7 D7 D7 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E: E: E: E: E: E: F: F: F: F: F: F: F: F: F: F: F: F: F: F: F: F; F; F; F; F; F; F; F; F; F; F; F; G; G; G; G; G; G; G; G; G; G; G< G< G< G< G< G< G< G< G< G< G< G< G< G< G< G< G< G< H< H< H< H< H= H= H= H= H= H= H= H= H= H= H= H= H= H= H= H= H= H= H= H= H= H= H> I> I> I> I> I> I> I> I> I> I> I> I> I> I> I> I> I> I> I> E; A?2 @3A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A5A5A5A5A5A5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B6B6B6B6B6B6B6B6B6B6B6C6C6C6C6 C6 C6 C6 C6 C6 C6 C6 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 D7 D7 D7 D7 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E: E: E: E: E: E: F: F: F: F: F: F: F: F: F: F: F: F: F: F: F: F: F; F; F; F; F; F; F; F; F; F; F; G; G; G; G; G; G; G; G; G; G; G; G< G< G< G< G< G< G< G< G< G< G< G< G< G< G< G< G< H< H< H< H< H< H= H= H= H= H= H= H= H= H= H= H= H= H= H= H= H= H= H= H= H= H= H> I> I> I> I> I> I> I> I> I> I> I> I> I> I> I> I> I> I> I> I> I> H> ("I! A4+A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A5A5A5A5A5A5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B6B6B6B6B6B6B6B6B6B6B6C6C6C6C6C6 C6 C6 C6 C6 C6 C6 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 D7 D7 D7 D7 D7 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E: E: E: E: E: E: F: F: F: F: F: F: F: F: F: F: F: F: F: F: F: F: F; F; F; F; F; F; F; F; F; F; F; G; G; G; G; G; G; G; G; G; G; G; G< G< G< G< G< G< G< G< G< G< G< G< G< G< G< G< H< H< H< H< H< H< H= H= H= H= H= H= H= H= H= H= H= H= H= H= H= H= H= H= H= H= H= H= I> I> I> I> I> I> I> I> I> I> I> I> I> I> I> I> I> I> I> I> I> I? I?I?7/ M# @3EA4A4A4A4A4A4A4A4A4A4A4A5A5A5A5A5A5A5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B6B6B6B6B6B6B6B6B6B6C6C6C6C6C6C6C6 C6 C6 C6 C6 C6 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 D7 D7 D7 D7 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E: E: E: E: E: F: F: F: F: F: F: F: F: F: F: F: F: F: F: F: F: F; F; F; F; F; F; F; F; F; F; F; F; G; G; G; G; G; G; G; G; G; G; G; G< G< G< G< G< G< G< G< G< G< G< G< G< G< G< G< H< H< H< H< H< H< H= H= H= H= H= H= H= H= H= H= H= H= H= H= H= H= H= H= H= H= H= H= I> I> I> I> I> I> I> I> I> I> I> I> I> I> I> I> I> I> I> I> I> I? I? I?I?I?=4 O# @3OA4A4A4A4A4A4A4A5A5A5A5A5A5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B6B6B6B6B6B6B6B6B6B6B6C6C6C6C6C6C6C6C6 C6 C6 C6 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 D7 D7 D7 D7 D7 D7 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 E8 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E: E: E: E: E: F: F: F: F: F: F: F: F: F: F: F: F: F: F: F: F: F: F; F; F; F; F; F; F; F; F; F; G; G; G; G; G; G; G; G; G; G; G; G< G< G< G< G< G< G< G< G< G< G< G< G< G< G< G< H< H< H< H< H< H< H= H= H= H= H= H= H= H= H= H= H= H= H= H= H= H= H= H= H= H= H= H= I> I> I> I> I> I> I> I> I> I> I> I> I> I> I> I> I> I> I> I> I> I> I? I? I? I?I?J?J??6  K! @3EA4A4A4A4A5A5A5A5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B6B6B6B6B6B6B6B6B6B6B6C6C6C6C6C6C6C6C6C6 C6 C6 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 D7 D7 D7 D7 D7 D7 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 E8 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E: E: E: E: E: F: F: F: F: F: F: F: F: F: F: F: F: F: F: F: F: F: F; F; F; F; F; F; F; F; F; F; G; G; G; G; G; G; G; G; G; G; G; G< G< G< G< G< G< G< G< G< G< G< G< G< G< G< G< H< H< H< H< H< H< H= H= H= H= H= H= H= H= H= H= H= H= H= H= H= H= H= H= H= H= H= H= I> I> I> I> I> I> I> I> I> I> I> I> I> I> I> I> I> I> I> I> I> I> I? I? I? I? I?J?J?J?J??5  ? A4+@4A5A5A5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B6B6B6B6B6B6B6B6B6B6B6C6C6C6C6C6C6C6C6C6 C6 C6 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 D7 D7 D7 D7 D7 D7 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 E8 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E: E: E: E: E: F: F: F: F: F: F: F: F: F: F: F: F: F: F: F: F: F: F; F; F; F; F; F; F; F; F; F; G; G; G; G; G; G; G; G; G; G; G; G< G< G< G< G< G< G< G< G< G< G< G< G< G< G< G< H< H< H< H< H< H< H= H= H= H= H= H= H= H= H= H= H= H= H= H= H= H= H= H= H= H= H= H= I> I> I> I> I> I> I> I> I> I> I> I> I> I> I> I> I> I> I> I> I> I> I? I? I? I? I?J?J?J?J?J?I> :1 -?3 A4B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B6B6B6B6B6B6B6B6B6B6B6C6C6C6C6C6C6C6C6C6C6 C6 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 D7 D7 D7 D7 D7 D7 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E: E: E: E: E: F: F: F: F: F: F: F: F: F: F: F: F: F: F: F: F: F: F; F; F; F; F; F; F; F; F; F; G; G; G; G; G; G; G; G; G; G; G; G; G< G< G< G< G< G< G< G< G< G< G< G< G< G< G< G< H< H< H< H< H< H= H= H= H= H= H= H= H= H= H= H= H= H= H= H= H= H= H= H= H= H= H= I> I> I> I> I> I> I> I> I> I> I> I> I> I> I> I> I> I> I> I> I> I> I? I? I? I? I? J?J?J?J?J?J?J?F< 0([ B5@3/A4B5B5B5B5B5B5B5B5B5B5B5B5B6B6B6B6B6B6B6B6B6B6C6C6C6C6C6C6C6C6C6C6C6 C6 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 D7 D7 D7 D7 D7 D7 D7 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 E8 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E: E: E: E: E: F: F: F: F: F: F: F: F: F: F: F: F: F: F: F: F: F: F; F; F; F; F; F; F; F; F; F; G; G; G; G; G; G; G; G; G; G; G; G; G< G< G< G< G< G< G< G< G< G< G< G< G< G< G< H< H< H< H< H< H< H< H= H= H= H= H= H= H= H= H= H= H= H= H= H= H= H= H= H= H= H= H= I= I> I> I> I> I> I> I> I> I> I> I> I> I> I> I> I> I> I> I> I> I> I> I? I? I? I? J? J?J?J?J?J?J?J?H= >5 # B5@35A4B5B5B5B5B5B5B5B6B6B6B6B6B6B6B6B6B6C6C6C6C6C6C6C6C6C6C6C6C6 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 D7 D7 D7 D7 D7 D7 D7 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 E8 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E: E: E: E: E: F: F: F: F: F: F: F: F: F: F: F: F: F: F: F: F: F: F; F; F; F; F; F; F; F; F; F; G; G; G; G; G; G; G; G; G; G; G; G; G< G< G< G< G< G< G< G< G< G< G< G< G< G< G< H< H< H< H< H< H< H< H= H= H= H= H= H= H= H= H= H= H= H= H= H= H= H= H= H= H= H= H= I= I> I> I> I> I> I> I> I> I> I> I> I> I> I> I> I> I> I> I> I> I> I> I? I? I? I? J? J? J?J?J?J?J?J?J?H= A7 {!! ?3A4aA4A5B6B6B6B6B6B6B6B6B6B6C6C6C6C6C6C6C6C6C6C6C6C6C7C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 D7 D7 D7 D7 D7 D7 D7 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 E8 E8 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E9 E: E: E: E: F: F: F: F: F: F: F: F: F: F: F: F: F: F: F: F: F: F; F; F; F; F; F; F; F; F; F; G; G; G; G; G; G; G; G; G; G; G; G; G< G< G< G< G< G< G< G< G< G< G< G< G< G< G< H< H< H< H< H< H< H< H= H= H= H= H= H= H= H= H= H= H= H= H= H= H= H= H= H= H= H= I= I= I> I> I> I> I> I> I> I> I> I> I> I> I> I> I> I> I> I> I> I> I> I> I? I? I? I? J? J? J? J? J?J?J?J?I> H= F; =4 ? -%@4@5G@4e@5yA5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6B6B6B6B6B6B6B6B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7 B7 B7 B7 B7 C7 C7 C8 C8 C8 C8 C8 C8 C8 C8 C8 C8 C8 C8 C8 C8 C8 C8 C8 C8 C8 C8 C8 C8 C9 C9 C9 D9 D9 D9 D9 D9 D9 D9 D9 D9 D9 D9 D9 D9 D9 D9 D9 D9 D9 D: D: D: D: D: D: D: D: D: D: E: E: E: E: E: E: E: E: E: E: E: E: E; E; E; E; E; E; E; E; E; E; E; E; E; E; E; F; F; F; F; F; F; F; F< F< F< F< F< F< F< F< F< F< F< F< F< F< F< F< F< F< F< F< G< G< G= G= G= G= G= G= G= G= G= G= G= G= G= G= G= G= G= G= G= G= G= G= G> G> G> G> H> H> H> H> H> H> H> H> G< qF< [D9 7/(fstl-app-fstl-efc5fb8/exe/fstl.rc000066400000000000000000000000461474426361600170660ustar00rootroot00000000000000IDI_ICON1 ICON DISCARDABLE "fstl.ico" fstl-app-fstl-efc5fb8/exe/package.sh000066400000000000000000000003331474426361600175160ustar00rootroot00000000000000#!/bin/sh set -e -x cd ../build make clean rm -rf fstl.exe make -j8 cp ../README.md README.txt cp release/fstl.exe . /c/Program\ Files/7-Zip/7z.exe a fstl.zip fstl.exe README.txt cp fstl.zip .. rm README.txt fstl.exe fstl-app-fstl-efc5fb8/gl/000077500000000000000000000000001474426361600154115ustar00rootroot00000000000000fstl-app-fstl-efc5fb8/gl/colored_lines.frag000066400000000000000000000001421474426361600210700ustar00rootroot00000000000000#version 120 varying vec3 frag_color; void main() { gl_FragColor = vec4(frag_color, 1.0); } fstl-app-fstl-efc5fb8/gl/colored_lines.vert000066400000000000000000000004421474426361600211340ustar00rootroot00000000000000#version 120 attribute vec3 vertex_position; attribute vec3 vertex_color; uniform mat4 transform_matrix; uniform mat4 view_matrix; varying vec3 frag_color; void main() { gl_Position = view_matrix*transform_matrix* vec4(vertex_position, 1.0); frag_color = vertex_color; } fstl-app-fstl-efc5fb8/gl/gl.qrc000066400000000000000000000006411474426361600165230ustar00rootroot00000000000000 mesh.frag mesh.vert mesh_wireframe.frag mesh_surfaceangle.frag mesh_light.frag quad.frag quad.vert colored_lines.frag colored_lines.vert sphere.stl fstl-app-fstl-efc5fb8/gl/mesh.frag000066400000000000000000000010501474426361600172020ustar00rootroot00000000000000#version 120 uniform float zoom; varying vec3 ec_pos; void main() { vec3 base3 = vec3(0.99, 0.96, 0.89); vec3 base2 = vec3(0.92, 0.91, 0.83); vec3 base00 = vec3(0.40, 0.48, 0.51); vec3 ec_normal = normalize(cross(dFdx(ec_pos), dFdy(ec_pos))); ec_normal.z *= zoom; ec_normal = normalize(ec_normal); float a = dot(ec_normal, vec3(0.0, 0.0, 1.0)); float b = dot(ec_normal, vec3(-0.57, -0.57, 0.57)); gl_FragColor = vec4((a*base2 + (1-a)*base00)*0.5 + (b*base3 + (1-b)*base00)*0.5, 1.0); } fstl-app-fstl-efc5fb8/gl/mesh.vert000066400000000000000000000004001474426361600172410ustar00rootroot00000000000000#version 120 attribute vec3 vertex_position; uniform mat4 transform_matrix; uniform mat4 view_matrix; varying vec3 ec_pos; void main() { gl_Position = view_matrix*transform_matrix* vec4(vertex_position, 1.0); ec_pos = gl_Position.xyz; } fstl-app-fstl-efc5fb8/gl/mesh_light.frag000066400000000000000000000013541474426361600204000ustar00rootroot00000000000000#version 120 uniform float zoom; uniform vec4 ambient_light_color; uniform vec4 directive_light_color; uniform vec3 directive_light_direction; varying vec3 ec_pos; void main() { // Normalize light direction vec3 dir = normalize(directive_light_direction); // vec3 a = vec3(0.0, 1.0, 1.0); // normal vector vec3 ec_normal = normalize(cross(dFdx(ec_pos), dFdy(ec_pos))); ec_normal.z *= zoom; ec_normal = normalize(ec_normal); vec3 color = ambient_light_color.w * ambient_light_color.xyz + directive_light_color.w * dot(ec_normal,dir) * directive_light_color.xyz; // float coef = dot(ec_normal,dir); // vec3 color = coef * lightcolor + (1.0 - coef) * objectcolor; gl_FragColor = vec4(color, 1.0); } fstl-app-fstl-efc5fb8/gl/mesh_surfaceangle.frag000066400000000000000000000007541474426361600217330ustar00rootroot00000000000000#version 120 uniform float zoom; varying vec3 ec_pos; void main() { vec3 ec_normal = normalize(cross(dFdx(ec_pos), dFdy(ec_pos))); ec_normal.z *= zoom; ec_normal = normalize(ec_normal); //rotated 10deg around the red axis for better color match float x = dot(ec_normal, vec3(1.0, 0.0, 0.0)); float y = dot(ec_normal, vec3(0.0, 0.985, 0.174)); float z = dot(ec_normal, vec3(0.0, -0.174, 0.985)); gl_FragColor = vec4(0.5-0.5*x, 0.5-0.5*y, 0.5+0.5*z, 1.0); } fstl-app-fstl-efc5fb8/gl/mesh_wireframe.frag000066400000000000000000000001661474426361600212520ustar00rootroot00000000000000#version 120 uniform float zoom; varying vec3 ec_pos; void main() { gl_FragColor = vec4(1.0, 1.0, 1.0, 1.0); } fstl-app-fstl-efc5fb8/gl/quad.frag000066400000000000000000000001421474426361600172010ustar00rootroot00000000000000#version 120 varying vec3 frag_color; void main() { gl_FragColor = vec4(frag_color, 1.0); } fstl-app-fstl-efc5fb8/gl/quad.vert000066400000000000000000000003071474426361600172450ustar00rootroot00000000000000#version 120 attribute vec2 vertex_position; attribute vec3 vertex_color; varying vec3 frag_color; void main() { gl_Position = vec4(vertex_position, 0.9, 1.0); frag_color = vertex_color; } fstl-app-fstl-efc5fb8/gl/sphere.stl000066400000000000000000000077641474426361600174410ustar00rootroot00000000000000Exported from Blender-2.68 (sub 0)Pji wھ㦽iwھֹ>e wھfw>xji㦽iwھwھjiwھ㦽i>wھji㦽i>wھ >wھֹ>efw>x A>3E }wھe>ϾiieE6i} A3E }w>eE6i>} H>ֹ>>e>> >H>ֹ>e A>3 >HϾE }wھeii HϾe A3 A3>E }w>e H>ii?ֹ>>e >H> A>3>E >}wھe>E>6i}>=iw>ֹe>Ͼ>ֹ>e>fwھx>w>E >}w>e>>>=i>w>>e>E>6i>}>>w>㦽iwھ>ϾE }wھe㦽iwھ wھ>Ͼ wھֹ>e>Ͼfw>x >wھֹ>>efw>x wھ >wھ wھji >wھwھE6i}ewھ㦽iwھE6i}㦽iwھE }wھeE6i}㦽i>wھE6i>}E }w>e㦽i>wھwھE6i>}wھeE6i>} >wھ>>ֹ>>e >wھ㦽i>wھ>>㦽i>wھE }w>e>> A>3 A>3>>e> A>3fw>x A>3>fw>xֹ>>e A>3>ii >HϾE >}wھe>ii>Ͼ >HϾ>Ͼֹ>e >HϾ A3 HϾֹe> A3E6i} HϾE6i}E }wھe HϾ H> A3>ֹ>e> H>E6i>} A3>E6i>}e A3> >H>ii?E >}w>e> >H>>>ii?>>E }w>eii? >HϾE>6i}>E >}wھe> >HϾ A>3E>6i}> A>3>e>E>6i}> HϾϾ>ֹe> HϾiiϾ>iiE >}wھe>Ͼ> A3>fwھx>ֹ>e> A3> A3fwھx> A3ֹe>fwھx>ii?>>E >}w>e>ii? H>>> H>ֹ>e>>> A>3>E>6i>}>>e> A>3> >H>E>6i>}> >H>E >}w>e>E>6i>}>=iw>>w>ji?=iw>E>6i}>>w>E>6i}>>e>>w>=iw>ji?Ͼ>=iw>Ͼ>E >}wھe>=iw>w>ji?w>fwھx>fwھx>ֹe>=i>w>w>ji?=i>w>>>w>>>ֹ>e>w>>w>=i>w>ji?>w>E>6i>}>=i>w>E>6i>}>E >}w>e>=i>w>fstl-app-fstl-efc5fb8/qt/000077500000000000000000000000001474426361600154335ustar00rootroot00000000000000fstl-app-fstl-efc5fb8/qt/icons/000077500000000000000000000000001474426361600165465ustar00rootroot00000000000000fstl-app-fstl-efc5fb8/qt/icons/fstl_64x64.png000066400000000000000000000076471474426361600211150ustar00rootroot00000000000000PNG  IHDR@@iqiCCPICC profile(}=HPOSR* ␡:Yq*BZu0y4iHZ\ׂ?Ug]\AIEJ/)}wQf5hzL%b&*^C_f1'IIx=uSxwߟի,DYfU ͪy8̊J|N>"VjCUZUJ  ( Bͭė\>̜sfw҉ᅵ1xWfQ=C6w>c*Ax_/``ۄ_0ү&9O?:5e--X²wa6s(UDh))dÓ`1'YLG 2ՍXTrr.wXpy kr}F?%BDя"$Ӣ-tkƦ2FS6GmN- 6qH"@J2Z!X&7ocs ܜ oHFH'$i1Zx? B8T": ( sfQz>2ZzJZ=}&W'i!0>BrAva#\b#0JZqa :IQd.m4)y6F'#aaKER ût$h?"X+$ɷ`&n.$ Y! n*(ER<0qdD!a)AX ("PM(&*aPť0P0-jT [9!QCΞµy*AՈ)VD ez11=cvl*RÉSgN̅)6H(Q#0>a>!JlnQmE7*0X̹ϋyqxN%Ua乄+JF?3l0 dR3B/{G A+6\<~CX# l.!}(r  +#'k<ΐϦ_Xo8\;Z 0 m ?p8c8C.%@9qt}84M8@6JCV-%; 1 50Y׏G۶0-+&E4n-CA;8䥴1?3-[YΡi5N"d2`0a$>b\Z\)Ccn6LD!ubdK} nGb^о:̇ A2c_e=+ض9x/5 $@1d2H}"4]#K Q rHavlBPR4Dz%hˡ_uF%.$I*d&F%t߾ (fKj@V2jmZp}_-SҶݼ,ސQd!P!z޲m&W4j?Vcfy!D bu0 3Ӵk\|4!Cr;8\c[A[2隆f˄Zo6C  X#=N'"k{=-;Wr-WRn04ԛ4ʘK")73h%XUB)|*FaB'TW/<cRnzjڦݕ)iݴD! y"JR{EHqgClbTYah!%CfBVHԾiXXgFBt= J¦qh:q -U"D3Ai\]iYI$54DJ VM c1kV,;L EX`neD2h,+`a)]2Uocն^a`\5Jr!{ ^\jX/Y[,9WiJ0[CD ˫5&cF<PkA1}:/=4X$1T :(Uشa˵>d#CZ_XoQȸ}K8cyA桊2kjhZkoP~mD 2C1PA1`!}$5F+\&յ/vv`Zp+l_$!~KHu4;]2 yeVg;rj:A^:X(`6.]ñOq"DIz )T+xOlK~qKexXS4͖ Ӳ1TZr] P7R˜0  %O'C}4D~jx7G)ChehhҾW\X\≐d&Qp1脈j_|o!nudpM%K8sfba!; =$v\dͳWi"XgZ&Ξ.!NaQ؎m[n |+.WVULL?kKм&f||b~;'ưmM<;3/0L'HXR_٠dڈ\˫5ޙ>@Wqza ]@輔 )YXZ꜀MknG/$Qi}:pAWI/ :G`$|in=;B:Ma1`b >M^e:cV D_]H6ś}tJ"E@}eř)rSk-ߓ'EۭKZ=J=SE̩j$k3bdn<3}7_bHA-jbqf DfōG[,tc2̚%LxDSE4VQm>CD\ z16l 2M=xm6Xvc D45Q׌(z:?. 2e" R3lfIENDB`fstl-app-fstl-efc5fb8/qt/qt.qrc000066400000000000000000000002041474426361600165620ustar00rootroot00000000000000 style.qss icons/fstl_64x64.png fstl-app-fstl-efc5fb8/qt/style.qss000066400000000000000000000000741474426361600173240ustar00rootroot00000000000000QWidget { background-color: null; color: #839496; } fstl-app-fstl-efc5fb8/src/000077500000000000000000000000001474426361600155765ustar00rootroot00000000000000fstl-app-fstl-efc5fb8/src/app.cpp000066400000000000000000000013501474426361600170610ustar00rootroot00000000000000#include #include #include #include "app.h" #include "window.h" App::App(int& argc, char *argv[]) : QApplication(argc, argv), window(new Window()) { if (argc > 1) { QString filename = argv[1]; if (filename.startsWith("~")) { filename.replace(0, 1, QDir::homePath()); } window->load_stl(filename); } else { window->load_stl(":gl/sphere.stl"); } window->show(); } App::~App() { delete window; } bool App::event(QEvent* e) { if (e->type() == QEvent::FileOpen) { window->load_stl(static_cast(e)->file()); return true; } else { return QApplication::event(e); } } fstl-app-fstl-efc5fb8/src/app.h000066400000000000000000000004271474426361600165320ustar00rootroot00000000000000#ifndef APP_H #define APP_H #include class Window; class App : public QApplication { Q_OBJECT public: explicit App(int& argc, char *argv[]); ~App(); protected: bool event(QEvent* e) override; private: Window* const window; }; #endif // APP_H fstl-app-fstl-efc5fb8/src/axis.cpp000066400000000000000000000125641474426361600172560ustar00rootroot00000000000000#include "axis.h" const float xLet[] = { -0.1, -0.2, 0, 0.1, 0.2, 0, 0.1, -0.2, 0, -0.1, 0.2, 0 }; const float yLet[] = { 0, -0.2, 0, 0, 0, 0, 0, 0, 0, 0.1, 0.2, 0, 0, 0, 0, -0.1, 0.2, 0 }; const float zLet[] = { -0.1, -0.2, 0, 0.1, -0.2, 0, 0.1, -0.2, 0, -0.1, 0.2, 0, -0.1, 0.2, 0, 0.1, 0.2, 0 }; const int axisSegCount[] = {2, 3, 3}; const float* axisLabels[] = {xLet, yLet, zLet}; Axis::Axis() { initializeOpenGLFunctions(); shader.addShaderFromSourceFile(QOpenGLShader::Vertex, ":/gl/colored_lines.vert"); shader.addShaderFromSourceFile(QOpenGLShader::Fragment, ":/gl/colored_lines.frag"); shader.link(); const int ptSize = 6*sizeof(float); for(int lIdx = 0; lIdx < 3; lIdx++) { const float* l = axisLabels[lIdx]; const int ptCount = axisSegCount[lIdx]*2; float c[3] = {0.0}; c[lIdx] = 1.0;//set color QOpenGLBuffer b = flowerLabelVertices[lIdx]; b.create(); b.bind(); b.allocate(ptCount*ptSize); for(int pIdx = 0; pIdx < ptCount; pIdx++) { b.write(pIdx*ptSize, &(l[pIdx*3]), ptSize/2);//write coords b.write(pIdx*ptSize + ptSize/2, c, ptSize/2);//write color } b.release(); } //Axis buffer: 6 floats per vertex, 2 vert per line, 3 lines float aBuf[6*2*3] = {0.0}; for(int aIdx = 0; aIdx < 3; aIdx++) { aBuf[(2*aIdx)*6+3+aIdx] = 1.0;//Set color (last 3 floats) aBuf[(2*aIdx+1)*6+3+aIdx] = 1.0;//Set color (last 3 floats) aBuf[(2*aIdx+1)*6+aIdx] = 1.0;//Extend line in axis } //The lines which form the 'axis-flower' in the corner flowerAxisVertices.create(); flowerAxisVertices.bind(); flowerAxisVertices.allocate(aBuf, sizeof(aBuf)); flowerAxisVertices.release(); //The lines which form the model-space axes vertices.create(); vertices.bind(); vertices.allocate(aBuf, sizeof(aBuf)); vertices.release(); } void Axis::setScale(QVector3D min, QVector3D max) { //Max function. not worth importing just for max auto Max = [](float a, float b) { return (a > b) ? a : b; }; //This is how much the axes extend beyond the model //We want it to be dependent on the model's size, but uniform on all axes. const float axismargin = 0.25*Max(Max(max[0]-min[0], max[1]-min[1]), max[2]-min[2]); vertices.bind(); //Manually rewrite coordinates to control axis draw lengths float s = sizeof(float); //aIdx*12+aIdx gets us to the set of 2 points of the axis line, plus the offset for that dimension //+6 gets us to the other end of the line in that dimension for(int aIdx = 0; aIdx < 3; aIdx++) { float t = min[aIdx]-axismargin; vertices.write(s*(aIdx*12+aIdx), &t, s); t = max[aIdx]+axismargin; vertices.write(s*(aIdx*12+aIdx+6), &t, s); } vertices.release(); } void Axis::draw(QMatrix4x4 transMat, QMatrix4x4 viewMat, QMatrix4x4 orientMat, QMatrix4x4 aspectMat, float aspectRatio) { shader.bind(); vertices.bind(); // Load the transform and view matrices into the shader auto loadMatrixUniforms = [&](QMatrix4x4 transform, QMatrix4x4 view) { glUniformMatrix4fv( shader.uniformLocation("transform_matrix"), 1, GL_FALSE, transform.data()); glUniformMatrix4fv( shader.uniformLocation("view_matrix"), 1, GL_FALSE, view.data()); }; const GLuint vp = shader.attributeLocation("vertex_position"); const GLuint vc = shader.attributeLocation("vertex_color"); glEnableVertexAttribArray(vp); glEnableVertexAttribArray(vc); auto loadAttribPtr = [&]() { glVertexAttribPointer(vp, 3, GL_FLOAT, false, 6 * sizeof(GLfloat), 0); glVertexAttribPointer(vc, 3, GL_FLOAT, false, 6 * sizeof(GLfloat), (GLvoid*)(3 * sizeof(GLfloat))); }; loadMatrixUniforms(transMat, viewMat); loadAttribPtr(); glDrawArrays(GL_LINES, 0, 3*6); vertices.release(); //Next, we draw the hud axis-flower flowerAxisVertices.bind(); glClear(GL_DEPTH_BUFFER_BIT);//Ensure hud draws over everything const float hudSize = 0.2; QMatrix4x4 hudMat; //Move the hud to the bottom left corner with margin if (aspectRatio > 1.0) { hudMat.translate(aspectRatio-2*hudSize, -1.0+2*hudSize, 0); } else { hudMat.translate(1.0-2*hudSize, -1.0/aspectRatio+2*hudSize, 0); } //Scale the hud to be small hudMat.scale(hudSize, hudSize, 1); loadMatrixUniforms(orientMat, aspectMat*hudMat); loadAttribPtr(); glDrawArrays(GL_LINES, 0, 3*6); flowerAxisVertices.release(); for(int aIdx = 0; aIdx < 3; aIdx++){ QVector3D transVec = QVector3D(); transVec[aIdx] = 1.25;//This is how far we want the letters to be extended out QOpenGLBuffer b = flowerLabelVertices[aIdx]; //The only transform we want is to translate the letters to the ends of the axis lines QMatrix4x4 labelTransMat = QMatrix4x4(); labelTransMat.translate(orientMat * transVec); b.bind(); loadMatrixUniforms(labelTransMat, aspectMat * hudMat); loadAttribPtr(); glDrawArrays(GL_LINES, 0, axisSegCount[aIdx]*2*6); b.release(); } shader.release(); } fstl-app-fstl-efc5fb8/src/axis.h000066400000000000000000000011561474426361600167160ustar00rootroot00000000000000#ifndef AXIS_H #define AXIS_H #include #include #include class Axis : protected QOpenGLFunctions { public: Axis(); void setScale(QVector3D min, QVector3D max); void draw(QMatrix4x4 transMat, QMatrix4x4 viewMat, QMatrix4x4 orientMat, QMatrix4x4 aspectMat, float aspectRatio); private: QOpenGLShaderProgram shader; QOpenGLBuffer vertices, //GL Buffer for model-space coords flowerAxisVertices; //GL Buffer for hud-space axis lines QOpenGLBuffer flowerLabelVertices[3];//Buffer for hud-space label lines }; #endif // AXIS_H fstl-app-fstl-efc5fb8/src/backdrop.cpp000066400000000000000000000021731474426361600200720ustar00rootroot00000000000000#include "backdrop.h" Backdrop::Backdrop() { initializeOpenGLFunctions(); shader.addShaderFromSourceFile(QOpenGLShader::Vertex, ":/gl/quad.vert"); shader.addShaderFromSourceFile(QOpenGLShader::Fragment, ":/gl/quad.frag"); shader.link(); float vbuf[] = { -1, -1, 0.00, 0.10, 0.15, -1, 1, 0.03, 0.21, 0.26, 1, -1, 0.00, 0.12, 0.18, 1, 1, 0.06, 0.26, 0.30}; vertices.create(); vertices.bind(); vertices.allocate(vbuf, sizeof(vbuf)); vertices.release(); } void Backdrop::draw() { shader.bind(); vertices.bind(); const GLuint vp = shader.attributeLocation("vertex_position"); const GLuint vc = shader.attributeLocation("vertex_color"); glEnableVertexAttribArray(vp); glEnableVertexAttribArray(vc); glVertexAttribPointer(vp, 2, GL_FLOAT, false, 5 * sizeof(GLfloat), 0); glVertexAttribPointer(vc, 3, GL_FLOAT, false, 5 * sizeof(GLfloat), (GLvoid*)(2 * sizeof(GLfloat))); glDrawArrays(GL_TRIANGLE_STRIP, 0, 8); vertices.release(); shader.release(); } fstl-app-fstl-efc5fb8/src/backdrop.h000066400000000000000000000004631474426361600175370ustar00rootroot00000000000000#ifndef BACKDROP_H #define BACKDROP_H #include #include #include class Backdrop : protected QOpenGLFunctions { public: Backdrop(); void draw(); private: QOpenGLShaderProgram shader; QOpenGLBuffer vertices; }; #endif // BACKDROP_H fstl-app-fstl-efc5fb8/src/canvas.cpp000066400000000000000000000401701474426361600175570ustar00rootroot00000000000000#include #include #include "canvas.h" #include "backdrop.h" #include "axis.h" #include "glmesh.h" #include "mesh.h" const float Canvas::P_PERSPECTIVE = 0.25f; const float Canvas::P_ORTHOGRAPHIC = 0.0f; const QString Canvas::AMBIENT_COLOR = "ambientColor"; const QString Canvas::AMBIENT_FACTOR = "ambientFactor"; const QString Canvas::DIRECTIVE_COLOR = "directiveColor"; const QString Canvas::DIRECTIVE_FACTOR = "directiveFactor"; const QString Canvas::CURRENT_LIGHT_DIRECTION = "currentLightDirection"; const QColor Canvas::defaultAmbientColor = QColor::fromRgbF(0.22,0.8,1.0); const QColor Canvas::defaultDirectiveColor = QColor(255,255,255); const float Canvas::defaultAmbientFactor = 0.67; const float Canvas::defaultDirectiveFactor = 0.5; const int Canvas::defaultCurrentLightDirection = 1; Canvas::Canvas(const QSurfaceFormat& format, QWidget *parent) : QOpenGLWidget(parent), mesh(nullptr), scale(1), zoom(1), anim(this, "perspective"), status(" "), meshInfo("") { setFormat(format); QFile styleFile(":/qt/style.qss"); styleFile.open( QFile::ReadOnly ); setStyleSheet(styleFile.readAll()); currentTransform = QMatrix4x4(); resetTransform(); QSettings settings; ambientColor = settings.value(AMBIENT_COLOR,defaultAmbientColor).value(); directiveColor = settings.value(DIRECTIVE_COLOR,defaultDirectiveColor).value(); ambientFactor = settings.value(AMBIENT_FACTOR,defaultAmbientFactor).value(); directiveFactor = settings.value(DIRECTIVE_FACTOR,defaultDirectiveFactor).value(); // Fill direction list // Fill in directions nameDir.clear(); listDir.clear(); QList xname, yname, zname; xname << "right " << " " << "left "; yname << "top " << " " << "bottom "; zname << "rear " << " " << "front "; for (int i=-1; i<2 ; i++) { for (int j=-1; j<2; j++) { for (int k=-1; k<2; k++) { QString current = xname.at(i+1) + yname.at(j+1) + zname.at(k+1); if (!(i==0 && j==0 && k==0)) { nameDir << current.simplified(); listDir << QVector3D((double)i,(double)j,(double)k); } } } } currentLightDirection = settings.value(CURRENT_LIGHT_DIRECTION,defaultCurrentLightDirection).value(); if (currentLightDirection < 0 || currentLightDirection >= nameDir.length()) { currentLightDirection = defaultCurrentLightDirection; } anim.setDuration(100); } Canvas::~Canvas() { makeCurrent(); delete mesh; delete mesh_vertshader; delete backdrop; delete axis; doneCurrent(); } void Canvas::view_anim(float v) { anim.setStartValue(perspective); anim.setEndValue(v); anim.start(); } void Canvas::common_view_change(enum ViewPoint c) { if (c == centerview) { scale = default_scale; center = default_center; zoom = 1; update(); return; } currentTransform.setToIdentity(); currentTransform.rotate(180.0, QVector3D(0, 0, 1)); switch (c) { case isoview: { currentTransform.rotate(90, QVector3D(1, 0, 0)); currentTransform.rotate(-45, QVector3D(0, 0, 1)); currentTransform.rotate(35.264, QVector3D(1, 1, 0)); } break; case topview: { currentTransform.rotate(180, QVector3D(1, 0, 0)); } break; case leftview: { currentTransform.rotate(180, QVector3D(1, 0, 0)); currentTransform.rotate(90, QVector3D(0, 0, 1)); currentTransform.rotate(90, QVector3D(0, 1, 0)); } break; case rightview: { currentTransform.rotate(180, QVector3D(1, 0, 0)); currentTransform.rotate(-90.0, QVector3D(0, 1, 0)); currentTransform.rotate(-90, QVector3D(1, 0, 0)); } break; case frontview: { currentTransform.rotate(90, QVector3D(1, 0, 0)); } break; case backview: { currentTransform.rotate(90, QVector3D(1, 0, 0)); currentTransform.rotate(180, QVector3D(0, 0, 1)); } case bottomview: [[fallthrough]]; default: break; } update(); } void Canvas::view_perspective(float p, bool animate){ if(animate) { view_anim(p); } else { set_perspective(p); } } void Canvas::draw_axes(bool d) { drawAxes = d; update(); } void Canvas::invert_zoom(bool d) { invertZoom = d; update(); } void Canvas::setResetTransformOnLoad(bool d) { resetTransformOnLoad = d; } void Canvas::resetTransform() { currentTransform.setToIdentity(); // apply some rotations to define initial orientation currentTransform.rotate(-90.0, QVector3D(1, 0, 0)); currentTransform.rotate(180.0 + 15.0, QVector3D(0, 0, 1)); currentTransform.rotate(15.0, QVector3D(1, -sin(M_PI/12), 0)); zoom = 1; } void Canvas::load_mesh(Mesh* m, bool is_reload) { delete mesh; mesh = new GLMesh(m); QVector3D lower(m->xmin(), m->ymin(), m->zmin()); QVector3D upper(m->xmax(), m->ymax(), m->zmax()); if (!is_reload) { default_center = center = (lower + upper) / 2; default_scale = scale = 2 / (upper - lower).length(); // Reset other camera parameters zoom = 1; if (resetTransformOnLoad) { resetTransform(); } } meshInfo = QStringLiteral("Triangles: %1\nX: [%2, %3]\nY: [%4, %5]\nZ: [%6, %7]").arg(m->triCount()); for(int dIdx = 0; dIdx < 3; dIdx++) meshInfo = meshInfo.arg(lower[dIdx]).arg(upper[dIdx]); axis->setScale(lower, upper); update(); delete m; } void Canvas::set_status(const QString &s) { status = s; update(); } void Canvas::set_perspective(float p) { perspective = p; update(); } void Canvas::set_drawMode(enum DrawMode mode) { drawMode = mode; update(); } void Canvas::clear_status() { status = ""; update(); } void Canvas::initializeGL() { initializeOpenGLFunctions(); mesh_vertshader = new QOpenGLShader(QOpenGLShader::Vertex); mesh_vertshader->compileSourceFile(":/gl/mesh.vert"); mesh_shader.addShader(mesh_vertshader); mesh_shader.addShaderFromSourceFile(QOpenGLShader::Fragment, ":/gl/mesh.frag"); mesh_shader.link(); mesh_wireframe_shader.addShader(mesh_vertshader); mesh_wireframe_shader.addShaderFromSourceFile(QOpenGLShader::Fragment, ":/gl/mesh_wireframe.frag"); mesh_wireframe_shader.link(); mesh_surfaceangle_shader.addShader(mesh_vertshader); mesh_surfaceangle_shader.addShaderFromSourceFile(QOpenGLShader::Fragment, ":/gl/mesh_surfaceangle.frag"); mesh_surfaceangle_shader.link(); mesh_meshlight_shader.addShader(mesh_vertshader); mesh_meshlight_shader.addShaderFromSourceFile(QOpenGLShader::Fragment, ":/gl/mesh_light.frag"); mesh_meshlight_shader.link(); backdrop = new Backdrop(); axis = new Axis(); } void Canvas::paintGL() { glClearColor(0.0, 0.0, 0.0, 0.0); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glEnable(GL_DEPTH_TEST); backdrop->draw(); if (mesh) draw_mesh(); if (drawAxes) axis->draw(transform_matrix(), view_matrix(), orient_matrix(), aspect_matrix(), width() / float(height())); QPainter painter(this); painter.setRenderHint(QPainter::Antialiasing); float textHeight = painter.fontInfo().pointSize(); if (drawAxes) painter.drawText(QRect(10, textHeight, width(), height()), meshInfo); painter.drawText(10, height() - textHeight, status); } void Canvas::draw_mesh() { QOpenGLShaderProgram* selected_mesh_shader = NULL; if(drawMode == wireframe) { selected_mesh_shader = &mesh_wireframe_shader; glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); } else { if(drawMode == shaded) { selected_mesh_shader = &mesh_shader; } else if (drawMode == surfaceangle) { selected_mesh_shader = &mesh_surfaceangle_shader; } else if (drawMode == meshlight) { selected_mesh_shader = &mesh_meshlight_shader; } glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); } selected_mesh_shader->bind(); // Load the transform and view matrices into the shader glUniformMatrix4fv( selected_mesh_shader->uniformLocation("transform_matrix"), 1, GL_FALSE, transform_matrix().data()); glUniformMatrix4fv( selected_mesh_shader->uniformLocation("view_matrix"), 1, GL_FALSE, view_matrix().data()); // Compensate for z-flattening when zooming glUniform1f(selected_mesh_shader->uniformLocation("zoom"), 1/zoom); // specific meshlight arguments if (drawMode == meshlight) { // Ambient Light Color, followed by the ambient light coefficient to use //glUniform4f(selected_mesh_shader->uniformLocation("ambient_light_color"),0.22f, 0.8f, 1.0f, 0.67f); glUniform4f(selected_mesh_shader->uniformLocation("ambient_light_color"),ambientColor.redF(), ambientColor.greenF(), ambientColor.blueF(), ambientFactor); // Directive Light Color, followed by the directive light coefficient to use //glUniform4f(selected_mesh_shader->uniformLocation("directive_light_color"),1.0f,1.0f,1.0f,0.5f); glUniform4f(selected_mesh_shader->uniformLocation("directive_light_color"),directiveColor.redF(),directiveColor.greenF(),directiveColor.blueF(),directiveFactor); // Directive Light Direction // dir 1,0,0 Light from the left // dir -1,0,0 Light from the right // dir 0,1,0 Light from bottom // dir 0,-1,0 Light from top // dir 0,0,1 Light from viewer (front) // dir 0,0,-1 Light from behind // // -1,-1,0 Light from top right //glUniform3f(selected_mesh_shader->uniformLocation("directive_light_direction"),-1.0f,-1.0f,0.0f); glUniform3f(selected_mesh_shader->uniformLocation("directive_light_direction"),listDir.at(currentLightDirection).x(), listDir.at(currentLightDirection).y(), listDir.at(currentLightDirection).z()); } // Find and enable the attribute location for vertex position const GLuint vp = selected_mesh_shader->attributeLocation("vertex_position"); glEnableVertexAttribArray(vp); // Then draw the mesh with that vertex position mesh->draw(vp); // Reset draw mode for the background and anything else that needs to be drawn glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); // Clean up state machine glDisableVertexAttribArray(vp); selected_mesh_shader->release(); } QMatrix4x4 Canvas::orient_matrix() const { QMatrix4x4 m = currentTransform; return m; } QMatrix4x4 Canvas::transform_matrix() const { QMatrix4x4 m = orient_matrix(); m.scale(scale); m.translate(-center); return m; } QMatrix4x4 Canvas::aspect_matrix() const { QMatrix4x4 m; if (width() > height()) { m.scale(-height() / float(width()), 1, 0.5); } else { m.scale(-1, width() / float(height()), 0.5); } return m; } QMatrix4x4 Canvas::view_matrix() const { QMatrix4x4 m = aspect_matrix(); m.scale(zoom, zoom, 1); m(3, 2) = perspective; return m; } void Canvas::mousePressEvent(QMouseEvent* event) { if (event->button() == Qt::LeftButton || event->button() == Qt::RightButton) { mouse_pos = event->pos(); setCursor(Qt::ClosedHandCursor); } } void Canvas::mouseReleaseEvent(QMouseEvent* event) { if (event->button() == Qt::LeftButton || event->button() == Qt::RightButton) { unsetCursor(); } } // This method change the referential of the mouse point coordinates // into a referential x=[-1.0,1.0], y=[-1.0,1.0], with 0,0 being the // center of the widget. QPointF Canvas::changeMouseCoordinates(QPoint p) { QPointF pr; // Change coordinates double ws2 = this->width() / 2.0; double hs2 = this->height() / 2.0; pr.setX(p.x() / ws2 - 1.0); pr.setY(p.y() / hs2 - 1.0); return pr; } void Canvas::calcArcballTransform(QPointF p1, QPointF p2) { // Calc z1 & z2 double x1 = p1.x(); double x2 = p2.x(); double y1 = p1.y(); double y2 = p2.y(); double p1sq = x1 * x1 + y1 * y1; double z1; if (p1sq <= 1) { z1 = sqrt(1.0 - p1sq); } else { x1 = x1 / sqrt(p1sq); y1 = y1 / sqrt(p1sq); z1 = 0.0; } double p2sq = x2 * x2 + y2 * y2; double z2; if (p2sq <= 1) { z2 = sqrt(1.0 - p2sq); } else { x2 = x2 / sqrt(p2sq); y2 = y2 / sqrt(p2sq); z2 = 0.0; } // set v1 and v2 QVector3D v1(x1, y1, z1); QVector3D v2(x2, y2, z2); // calc v1 cross v2 QVector3D v1xv2 = QVector3D::crossProduct(v1, v2); QVector3D v1xv2Obj = currentTransform.inverted().mapVector(v1xv2); // calc angle double angle = acos(std::min(1.0f,QVector3D::dotProduct(v1, v2))) * 180.0 / M_PI; // apply transform currentTransform.rotate(angle,v1xv2Obj); } void Canvas::mouseMoveEvent(QMouseEvent* event) { auto p = event->pos(); auto d = p - mouse_pos; if (event->buttons() & Qt::LeftButton) { QPointF p1r = changeMouseCoordinates(mouse_pos); QPointF p2r = changeMouseCoordinates(p); calcArcballTransform(p1r,p2r); update(); } else if (event->buttons() & Qt::RightButton) { center = transform_matrix().inverted() * view_matrix().inverted() * QVector3D(-d.x() / (0.5*width()), d.y() / (0.5*height()), 0); update(); } mouse_pos = p; } void Canvas::wheelEvent(QWheelEvent *event) { // Find GL position before the zoom operation // (to zoom about mouse cursor) auto p = event->position(); QVector3D v(1 - p.x() / (0.5*width()), p.y() / (0.5*height()) - 1, 0); QVector3D a = transform_matrix().inverted() * view_matrix().inverted() * v; if (event->angleDelta().y() < 0) { for (int i=0; i > event->angleDelta().y(); --i) if (invertZoom) zoom /= 1.001; else zoom *= 1.001; } else if (event->angleDelta().y() > 0) { for (int i=0; i < event->angleDelta().y(); ++i) if (invertZoom) zoom *= 1.001; else zoom /= 1.001; } // Then find the cursor's GL position post-zoom and adjust center. QVector3D b = transform_matrix().inverted() * view_matrix().inverted() * v; center += b - a; update(); } void Canvas::resizeGL(int width, int height) { glViewport(0, 0, width, height); } QColor Canvas::getAmbientColor() { return ambientColor; } void Canvas::setAmbientColor(QColor c) { ambientColor = c; QSettings settings; settings.setValue(AMBIENT_COLOR,c); } double Canvas::getAmbientFactor() { return (float) ambientFactor; } void Canvas::setAmbientFactor(double f) { ambientFactor = (float) f; QSettings settings; settings.setValue(AMBIENT_FACTOR,f); } void Canvas::resetAmbientColor() { setAmbientColor(defaultAmbientColor); setAmbientFactor(defaultAmbientFactor); } QColor Canvas::getDirectiveColor() { return directiveColor; } void Canvas::setDirectiveColor(QColor c) { directiveColor = c; QSettings settings; settings.setValue(DIRECTIVE_COLOR,c); } double Canvas::getDirectiveFactor() { return (float) directiveFactor; } void Canvas::setDirectiveFactor(double f) { directiveFactor = (float) f; QSettings settings; settings.setValue(DIRECTIVE_FACTOR,f); } void Canvas::resetDirectiveColor() { setDirectiveColor(defaultDirectiveColor); setDirectiveFactor(defaultDirectiveFactor); } QList Canvas::getNameDir() { return nameDir; } int Canvas::getCurrentLightDirection() { return currentLightDirection; } void Canvas::setCurrentLightDirection(int ind) { currentLightDirection = ind; QSettings settings; settings.setValue(CURRENT_LIGHT_DIRECTION,currentLightDirection); } void Canvas::resetCurrentLightDirection() { setCurrentLightDirection(defaultCurrentLightDirection); } fstl-app-fstl-efc5fb8/src/canvas.h000066400000000000000000000067311474426361600172310ustar00rootroot00000000000000#ifndef CANVAS_H #define CANVAS_H #include #include #include class GLMesh; class Mesh; class Backdrop; class Axis; enum ViewPoint {centerview, isoview, topview, bottomview, leftview, rightview, frontview, backview}; enum DrawMode {shaded, wireframe, surfaceangle, meshlight, DRAWMODECOUNT}; class Canvas : public QOpenGLWidget, protected QOpenGLFunctions { Q_OBJECT public: explicit Canvas(const QSurfaceFormat& format, QWidget* parent=0); ~Canvas(); const static float P_PERSPECTIVE; const static float P_ORTHOGRAPHIC; void view_perspective(float p, bool animate); void draw_axes(bool d); void invert_zoom(bool d); void set_drawMode(enum DrawMode mode); void common_view_change(enum ViewPoint c); void setResetTransformOnLoad(bool d); QColor getAmbientColor(); void setAmbientColor(QColor c); double getAmbientFactor(); void setAmbientFactor(double f); void resetAmbientColor(); QColor getDirectiveColor(); void setDirectiveColor(QColor c); double getDirectiveFactor(); void setDirectiveFactor(double f); void resetDirectiveColor(); QList getNameDir(); int getCurrentLightDirection(); void setCurrentLightDirection(int ind); void resetCurrentLightDirection(); public slots: void set_status(const QString& s); void clear_status(); void load_mesh(Mesh* m, bool is_reload); protected: void paintGL() override; void initializeGL() override; void resizeGL(int width, int height) override; void mousePressEvent(QMouseEvent* event) override; void mouseReleaseEvent(QMouseEvent* event) override; void mouseMoveEvent(QMouseEvent* event) override; void wheelEvent(QWheelEvent* event) override; void set_perspective(float p); void view_anim(float v); private: void draw_mesh(); QMatrix4x4 orient_matrix() const; QMatrix4x4 transform_matrix() const; QMatrix4x4 aspect_matrix() const; QMatrix4x4 view_matrix() const; void resetTransform(); QPointF changeMouseCoordinates(QPoint p); void calcArcballTransform(QPointF p1, QPointF p2); QOpenGLShader* mesh_vertshader; QOpenGLShaderProgram mesh_shader; QOpenGLShaderProgram mesh_wireframe_shader; QOpenGLShaderProgram mesh_surfaceangle_shader; QOpenGLShaderProgram mesh_meshlight_shader; QColor ambientColor; QColor directiveColor; float ambientFactor; float directiveFactor; QList nameDir; QList listDir; int currentLightDirection; const static QColor defaultAmbientColor; const static QColor defaultDirectiveColor; const static float defaultAmbientFactor; const static float defaultDirectiveFactor; const static int defaultCurrentLightDirection; const static QString AMBIENT_COLOR; const static QString AMBIENT_FACTOR; const static QString DIRECTIVE_COLOR; const static QString DIRECTIVE_FACTOR; const static QString CURRENT_LIGHT_DIRECTION; GLMesh* mesh; Backdrop* backdrop; Axis* axis; QVector3D center, default_center; float scale, default_scale; float zoom; QMatrix4x4 currentTransform; float perspective; enum DrawMode drawMode; bool drawAxes; bool invertZoom; bool resetTransformOnLoad; Q_PROPERTY(float perspective MEMBER perspective WRITE set_perspective); QPropertyAnimation anim; QPoint mouse_pos; QString status; QString meshInfo; }; #endif // CANVAS_H fstl-app-fstl-efc5fb8/src/glmesh.cpp000066400000000000000000000017101474426361600175600ustar00rootroot00000000000000#include "glmesh.h" #include "mesh.h" GLMesh::GLMesh(const Mesh* const mesh) : vertices(QOpenGLBuffer::VertexBuffer), indices(QOpenGLBuffer::IndexBuffer) { initializeOpenGLFunctions(); vertices.create(); indices.create(); vertices.setUsagePattern(QOpenGLBuffer::StaticDraw); indices.setUsagePattern(QOpenGLBuffer::StaticDraw); vertices.bind(); vertices.allocate(mesh->vertices.data(), mesh->vertices.size() * sizeof(float)); vertices.release(); indices.bind(); indices.allocate(mesh->indices.data(), mesh->indices.size() * sizeof(uint32_t)); indices.release(); } void GLMesh::draw(GLuint vp) { vertices.bind(); indices.bind(); glVertexAttribPointer(vp, 3, GL_FLOAT, false, 3*sizeof(float), NULL); glDrawElements(GL_TRIANGLES, indices.size() / sizeof(uint32_t), GL_UNSIGNED_INT, NULL); vertices.release(); indices.release(); } fstl-app-fstl-efc5fb8/src/glmesh.h000066400000000000000000000005001474426361600172210ustar00rootroot00000000000000#ifndef GLMESH_H #define GLMESH_H #include #include // forward declaration class Mesh; class GLMesh : protected QOpenGLFunctions { public: GLMesh(const Mesh* const mesh); void draw(GLuint vp); private: QOpenGLBuffer vertices; QOpenGLBuffer indices; }; #endif // GLMESH_H fstl-app-fstl-efc5fb8/src/loader.cpp000066400000000000000000000147431474426361600175610ustar00rootroot00000000000000#include #include "loader.h" #include "vertex.h" Loader::Loader(QObject* parent, const QString& filename, bool is_reload) : QThread(parent), filename(filename), is_reload(is_reload) { // Nothing to do here } void Loader::run() { Mesh* mesh = load_stl(); if (mesh) { if (mesh->empty()) { emit error_empty_mesh(); delete mesh; } else { emit got_mesh(mesh, is_reload); emit loaded_file(filename); } } } //////////////////////////////////////////////////////////////////////////////// void parallel_sort(Vertex* begin, Vertex* end, int threads) { if (threads < 2 || end - begin < 2) { std::sort(begin, end); } else { const auto mid = begin + (end - begin) / 2; if (threads == 2) { auto future = std::async(parallel_sort, begin, mid, threads / 2); std::sort(mid, end); future.wait(); } else { auto a = std::async(std::launch::async, parallel_sort, begin, mid, threads / 2); auto b = std::async(std::launch::async, parallel_sort, mid, end, threads / 2); a.wait(); b.wait(); } std::inplace_merge(begin, mid, end); } } Mesh* mesh_from_verts(uint32_t tri_count, QVector& verts) { // Save indicies as the second element in the array // (so that we can reconstruct triangle order after sorting) for (size_t i=0; i < tri_count*3; ++i) { verts[i].i = i; } // Check how many threads the hardware can safely support. This may return // 0 if the property can't be read so we shoud check for that too. auto threads = std::thread::hardware_concurrency(); if (threads == 0) { threads = 8; } // Sort the set of vertices (to deduplicate) parallel_sort(verts.begin(), verts.end(), threads); // This vector will store triangles as sets of 3 indices std::vector indices(tri_count*3); // Go through the sorted vertex list, deduplicating and creating // an indexed geometry representation for the triangles. // Unique vertices are moved so that they occupy the first vertex_count // positions in the verts array. size_t vertex_count = 0; for (auto v : verts) { if (!vertex_count || v != verts[vertex_count-1]) { verts[vertex_count++] = v; } indices[v.i] = vertex_count - 1; } verts.resize(vertex_count); std::vector flat_verts; flat_verts.reserve(vertex_count*3); for (auto v : verts) { flat_verts.push_back(v.x); flat_verts.push_back(v.y); flat_verts.push_back(v.z); } return new Mesh(std::move(flat_verts), std::move(indices)); } //////////////////////////////////////////////////////////////////////////////// Mesh* Loader::load_stl() { QFile file(filename); if (!file.open(QIODevice::ReadOnly)) { emit error_missing_file(); return NULL; } qint64 file_size, file_size_old; file_size = file.size(); do { file_size_old = file_size; QThread::usleep(100000); file_size = file.size(); } while(file_size != file_size_old); // First, try to read the stl as an ASCII file if (file.read(5) == "solid") { file.readLine(); // skip solid name const auto line = file.readLine().trimmed(); if (line.startsWith("facet") || line.startsWith("endsolid")) { file.seek(0); return read_stl_ascii(file); } // Otherwise, this STL is a binary stl but contains 'solid' as // the first five characters. This is a bad life choice, but // we can gracefully handle it by falling through to the binary // STL reader below. } file.seek(0); return read_stl_binary(file); } Mesh* Loader::read_stl_binary(QFile& file) { QDataStream data(&file); data.setByteOrder(QDataStream::LittleEndian); data.setFloatingPointPrecision(QDataStream::SinglePrecision); // Load the triangle count from the .stl file file.seek(80); uint32_t tri_count; data >> tri_count; // Verify that the file is the right size if (file.size() != 84 + tri_count*50) { emit error_bad_stl(); return NULL; } // Extract vertices into an array of xyz, unsigned pairs QVector verts(tri_count*3); // Dummy array, because readRawData is faster than skipRawData std::unique_ptr buffer(new uint8_t[tri_count * 50]); data.readRawData((char*)buffer.get(), tri_count * 50); // Store vertices in the array, processing one triangle at a time. auto b = buffer.get() + 3 * sizeof(float); for (auto v=verts.begin(); v != verts.end(); v += 3) { // Load vertex data from .stl file into vertices for (unsigned i=0; i < 3; ++i) { qFromLittleEndian(b, 3, &v[i]); b += 3 * sizeof(float); } // Skip face attribute and next face's normal vector b += 3 * sizeof(float) + sizeof(uint16_t); } return mesh_from_verts(tri_count, verts); } Mesh* Loader::read_stl_ascii(QFile& file) { file.readLine(); uint32_t tri_count = 0; QVector verts(tri_count*3); bool okay = true; while (!file.atEnd() && okay) { const auto line = file.readLine().simplified(); if (line.startsWith("endsolid")) { break; } else if (!line.startsWith("facet normal") || !file.readLine().simplified().startsWith("outer loop")) { okay = false; break; } for (int i=0; i < 3; ++i) { auto line = file.readLine().simplified().split(' '); if (line[0] != "vertex") { okay = false; break; } const float x = line[1].toFloat(&okay); const float y = line[2].toFloat(&okay); const float z = line[3].toFloat(&okay); verts.push_back(Vertex(x, y, z)); } if (!file.readLine().trimmed().startsWith("endloop") || !file.readLine().trimmed().startsWith("endfacet")) { okay = false; break; } tri_count++; } if (okay) { return mesh_from_verts(tri_count, verts); } else { emit error_bad_stl(); return NULL; } } fstl-app-fstl-efc5fb8/src/loader.h000066400000000000000000000013371474426361600172210ustar00rootroot00000000000000#ifndef LOADER_H #define LOADER_H #include #include "mesh.h" class Loader : public QThread { Q_OBJECT public: explicit Loader(QObject* parent, const QString& filename, bool is_reload); void run(); protected: Mesh* load_stl(); /* Reads an ASCII stl, starting from the start of the file*/ Mesh* read_stl_ascii(QFile& file); /* Reads a binary stl, assuming we're at the end of the header */ Mesh* read_stl_binary(QFile& file); signals: void loaded_file(QString filename); void got_mesh(Mesh* m, bool is_reload); void error_bad_stl(); void error_empty_mesh(); void error_missing_file(); private: const QString filename; bool is_reload; }; #endif // LOADER_H fstl-app-fstl-efc5fb8/src/main.cpp000066400000000000000000000007071474426361600172320ustar00rootroot00000000000000#include #include "app.h" int main(int argc, char *argv[]) { // Force C locale to force decimal point QLocale::setDefault(QLocale::c()); QCoreApplication::setOrganizationName("fstl-app"); QCoreApplication::setOrganizationDomain("https://github.com/fstl-app/fstl"); QCoreApplication::setApplicationName("fstl"); QCoreApplication::setApplicationVersion(FSTL_VERSION); App a(argc, argv); return a.exec(); } fstl-app-fstl-efc5fb8/src/mesh.cpp000066400000000000000000000016651474426361600172460ustar00rootroot00000000000000#include #include #include #include #include "mesh.h" //////////////////////////////////////////////////////////////////////////////// Mesh::Mesh(std::vector&& v, std::vector&& i) : vertices(std::move(v)), indices(std::move(i)) { // Nothing to do here } float Mesh::min(size_t start) const { if (start >= vertices.size()) { return -1; } float v = vertices[start]; for (size_t i=start; i < vertices.size(); i += 3) { v = fmin(v, vertices[i]); } return v; } float Mesh::max(size_t start) const { if (start >= vertices.size()) { return 1; } float v = vertices[start]; for (size_t i=start; i < vertices.size(); i += 3) { v = fmax(v, vertices[i]); } return v; } int Mesh::triCount() const { return indices.size()/3; } bool Mesh::empty() const { return vertices.size() == 0; } fstl-app-fstl-efc5fb8/src/mesh.h000066400000000000000000000012661474426361600167100ustar00rootroot00000000000000#ifndef MESH_H #define MESH_H #include #include #include class Mesh { public: Mesh(std::vector&& vertices, std::vector&& indices); float min(size_t start) const; float max(size_t start) const; float xmin() const { return min(0); } float ymin() const { return min(1); } float zmin() const { return min(2); } float xmax() const { return max(0); } float ymax() const { return max(1); } float zmax() const { return max(2); } int triCount() const; bool empty() const; private: std::vector vertices; std::vector indices; friend class GLMesh; }; #endif // MESH_H fstl-app-fstl-efc5fb8/src/shaderlightprefs.cpp000066400000000000000000000150031474426361600216370ustar00rootroot00000000000000#include "shaderlightprefs.h" #include "canvas.h" #include const QString ShaderLightPrefs::PREFS_GEOM = "shaderPrefsGeometry"; ShaderLightPrefs::ShaderLightPrefs(QWidget *parent, Canvas *_canvas) : QDialog(parent) { canvas = _canvas; QVBoxLayout* prefsLayout = new QVBoxLayout; this->setLayout(prefsLayout); QLabel* title = new QLabel("Shader preferences"); QFont boldFont = QApplication::font(); boldFont.setWeight(QFont::Bold); title->setFont(boldFont); title->setAlignment(Qt::AlignCenter); prefsLayout->addWidget(title); QWidget* middleWidget = new QWidget; QGridLayout* middleLayout = new QGridLayout; middleWidget->setLayout(middleLayout); this->layout()->addWidget(middleWidget); // labels middleLayout->addWidget(new QLabel("Ambient Color"),0,0); middleLayout->addWidget(new QLabel("Directive Color"),1,0); middleLayout->addWidget(new QLabel("Direction"),2,0); QPixmap dummy(20, 20); dummy.fill(canvas->getAmbientColor()); buttonAmbientColor = new QPushButton; buttonAmbientColor->setIcon(QIcon(dummy)); middleLayout->addWidget(buttonAmbientColor,0,1); buttonAmbientColor->setFocusPolicy(Qt::NoFocus); connect(buttonAmbientColor,SIGNAL(clicked(bool)),this,SLOT(buttonAmbientColorClicked())); editAmbientFactor = new QLineEdit; editAmbientFactor->setValidator(new QDoubleValidator); editAmbientFactor->setText(QString("%1").arg(canvas->getAmbientFactor())); middleLayout->addWidget(editAmbientFactor,0,2); connect(editAmbientFactor,SIGNAL(editingFinished()),this,SLOT(editAmbientFactorFinished())); QPushButton* buttonResetAmbientColor = new QPushButton("Reset"); middleLayout->addWidget(buttonResetAmbientColor,0,3); buttonResetAmbientColor->setFocusPolicy(Qt::NoFocus); connect(buttonResetAmbientColor,SIGNAL(clicked(bool)),this,SLOT(resetAmbientColorClicked())); dummy.fill(canvas->getDirectiveColor()); buttonDirectiveColor = new QPushButton; buttonDirectiveColor->setIcon(QIcon(dummy)); middleLayout->addWidget(buttonDirectiveColor,1,1); buttonDirectiveColor->setFocusPolicy(Qt::NoFocus); connect(buttonDirectiveColor,SIGNAL(clicked(bool)),this,SLOT(buttonDirectiveColorClicked())); editDirectiveFactor = new QLineEdit; editDirectiveFactor->setValidator(new QDoubleValidator); editDirectiveFactor->setText(QString("%1").arg(canvas->getDirectiveFactor())); middleLayout->addWidget(editDirectiveFactor,1,2); connect(editDirectiveFactor,SIGNAL(editingFinished()),this,SLOT(editDirectiveFactorFinished())); QPushButton* buttonResetDirectiveColor = new QPushButton("Reset"); middleLayout->addWidget(buttonResetDirectiveColor,1,3); buttonResetDirectiveColor->setFocusPolicy(Qt::NoFocus); connect(buttonResetDirectiveColor,SIGNAL(clicked(bool)),this,SLOT(resetDirectiveColorClicked())); // Fill in directions comboDirections = new QComboBox; middleLayout->addWidget(comboDirections,2,1,1,2); comboDirections->addItems(canvas->getNameDir()); comboDirections->setCurrentIndex(canvas->getCurrentLightDirection()); connect(comboDirections,SIGNAL(currentIndexChanged(int)),this,SLOT(comboDirectionsChanged(int))); QPushButton* buttonResetDirection = new QPushButton("Reset"); middleLayout->addWidget(buttonResetDirection,2,3); buttonResetDirection->setFocusPolicy(Qt::NoFocus); connect(buttonResetDirection,SIGNAL(clicked(bool)),this,SLOT(resetDirection())); // Ok button QWidget* boxButton = new QWidget; QHBoxLayout* boxButtonLayout = new QHBoxLayout; boxButton->setLayout(boxButtonLayout); QFrame *spacerL = new QFrame; spacerL->setSizePolicy(QSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Expanding)); QPushButton* okButton = new QPushButton("Ok"); boxButtonLayout->addWidget(spacerL); boxButtonLayout->addWidget(okButton); this->layout()->addWidget(boxButton); okButton->setFocusPolicy(Qt::NoFocus); connect(okButton,SIGNAL(clicked(bool)),this,SLOT(okButtonClicked())); QSettings settings; if (!settings.value(PREFS_GEOM).isNull()) { restoreGeometry(settings.value(PREFS_GEOM).toByteArray()); } } void ShaderLightPrefs::buttonAmbientColorClicked() { QColor newColor = QColorDialog::getColor(canvas->getAmbientColor(), this, QString("Choose color"),QColorDialog::DontUseNativeDialog); if (newColor.isValid() == true) { canvas->setAmbientColor(newColor); QPixmap dummy(20, 20); dummy.fill(canvas->getAmbientColor()); buttonAmbientColor->setIcon(QIcon(dummy)); canvas->update(); } } void ShaderLightPrefs::editAmbientFactorFinished() { canvas->setAmbientFactor(editAmbientFactor->text().toDouble()); canvas->update(); } void ShaderLightPrefs::resetAmbientColorClicked() { canvas->resetAmbientColor(); QPixmap dummy(20, 20); dummy.fill(canvas->getAmbientColor()); buttonAmbientColor->setIcon(QIcon(dummy)); editAmbientFactor->setText(QString("%1").arg(canvas->getAmbientFactor())); canvas->update(); } void ShaderLightPrefs::buttonDirectiveColorClicked() { QColor newColor = QColorDialog::getColor(canvas->getDirectiveColor(), this, QString("Choose color"),QColorDialog::DontUseNativeDialog); if (newColor.isValid() == true) { canvas->setDirectiveColor(newColor); QPixmap dummy(20, 20); dummy.fill(canvas->getDirectiveColor()); buttonDirectiveColor->setIcon(QIcon(dummy)); canvas->update(); } } void ShaderLightPrefs::editDirectiveFactorFinished() { canvas->setDirectiveFactor(editDirectiveFactor->text().toDouble()); canvas->update(); } void ShaderLightPrefs::resetDirectiveColorClicked() { canvas->resetDirectiveColor(); QPixmap dummy(20, 20); dummy.fill(canvas->getDirectiveColor()); buttonDirectiveColor->setIcon(QIcon(dummy)); editDirectiveFactor->setText(QString("%1").arg(canvas->getDirectiveFactor())); canvas->update(); } void ShaderLightPrefs::okButtonClicked() { this->close(); } void ShaderLightPrefs::comboDirectionsChanged(int ind) { canvas->setCurrentLightDirection(ind); canvas->update(); } void ShaderLightPrefs::resetDirection() { canvas->resetCurrentLightDirection(); comboDirections->setCurrentIndex(canvas->getCurrentLightDirection()); canvas->update(); } void ShaderLightPrefs::resizeEvent(QResizeEvent *event) { QSettings().setValue(PREFS_GEOM, saveGeometry()); } void ShaderLightPrefs::moveEvent(QMoveEvent *event) { QSettings().setValue(PREFS_GEOM, saveGeometry()); } fstl-app-fstl-efc5fb8/src/shaderlightprefs.h000066400000000000000000000017441474426361600213130ustar00rootroot00000000000000#ifndef SHADERLIGHTPREFS_H #define SHADERLIGHTPREFS_H #include class Canvas; class QLabel; class QLineEdit; class QComboBox; class ShaderLightPrefs : public QDialog { Q_OBJECT public: ShaderLightPrefs(QWidget* parent, Canvas* _canvas); protected: void resizeEvent(QResizeEvent *event) override; void moveEvent(QMoveEvent *event) override; private slots: void buttonAmbientColorClicked(); void editAmbientFactorFinished(); void resetAmbientColorClicked(); void buttonDirectiveColorClicked(); void editDirectiveFactorFinished(); void resetDirectiveColorClicked(); void comboDirectionsChanged(int ind); void resetDirection(); void okButtonClicked(); private: Canvas* canvas; QPushButton* buttonAmbientColor; QLineEdit* editAmbientFactor; QPushButton* buttonDirectiveColor; QLineEdit* editDirectiveFactor; QComboBox* comboDirections; const static QString PREFS_GEOM; }; #endif // SHADERLIGHTPREFS_H fstl-app-fstl-efc5fb8/src/vertex.h000066400000000000000000000011631474426361600172650ustar00rootroot00000000000000#ifndef VEC3_H #define VEC3_H #include /* * Represents an optionally-indexed vertex in space */ struct Vertex { Vertex() {} Vertex(float x, float y, float z) : x(x), y(y), z(z) {} GLfloat x, y, z; GLuint i=0; bool operator!=(const Vertex& rhs) const { return x != rhs.x || y != rhs.y || z != rhs.z; } bool operator<(const Vertex& rhs) const { if (x != rhs.x) return x < rhs.x; else if (y != rhs.y) return y < rhs.y; else if (z != rhs.z) return z < rhs.z; else return false; } }; #endif fstl-app-fstl-efc5fb8/src/window.cpp000066400000000000000000000573531474426361600176260ustar00rootroot00000000000000#include #include "window.h" #include "canvas.h" #include "loader.h" #include "shaderlightprefs.h" const QString Window::OPEN_EXTERNAL_KEY = "externalCmd"; const QString Window::RECENT_FILE_KEY = "recentFiles"; const QString Window::INVERT_ZOOM_KEY = "invertZoom"; const QString Window::AUTORELOAD_KEY = "autoreload"; const QString Window::DRAW_AXES_KEY = "drawAxes"; const QString Window::PROJECTION_KEY = "projection"; const QString Window::DRAW_MODE_KEY = "drawMode"; const QString Window::WINDOW_GEOM_KEY = "windowGeometry"; const QString Window::RESET_TRANSFORM_ON_LOAD_KEY = "resetTransformOnLoad"; Window::Window(QWidget *parent) : QMainWindow(parent), open_action(new QAction("Open", this)), open_external_action(new QAction("Open with", this)), about_action(new QAction("About", this)), quit_action(new QAction("Quit", this)), perspective_action(new QAction("Perspective", this)), common_view_center_action(new QAction("Center the model", this)), common_view_iso_action(new QAction("Isometric", this)), common_view_top_action(new QAction("Top", this)), common_view_bottom_action(new QAction("Bottom", this)), common_view_left_action(new QAction("Left", this)), common_view_right_action(new QAction("Right", this)), common_view_front_action(new QAction("Front", this)), common_view_back_action(new QAction("Back", this)), orthographic_action(new QAction("Orthographic", this)), shaded_action(new QAction("Shaded", this)), wireframe_action(new QAction("Wireframe", this)), surfaceangle_action(new QAction("Surface Angle", this)), meshlight_action(new QAction("Shaded ambient and directive light source", this)), drawModePrefs_action(new QAction("Draw Mode Settings")), axes_action(new QAction("Draw Axes", this)), invert_zoom_action(new QAction("Invert Zoom", this)), reload_action(new QAction("Reload", this)), autoreload_action(new QAction("Autoreload", this)), save_screenshot_action(new QAction("Save Screenshot", this)), hide_menuBar_action(new QAction("Hide Menu Bar", this)), fullscreen_action(new QAction("Toggle Fullscreen",this)), resetTransformOnLoadAction(new QAction("Reset rotation on load",this)), recent_files(new QMenu("Open recent", this)), recent_files_group(new QActionGroup(this)), recent_files_clear_action(new QAction("Clear recent files", this)), watcher(new QFileSystemWatcher(this)) { setWindowTitle("fstl"); setWindowIcon(QIcon(":/qt/icons/fstl_64x64.png")); setAcceptDrops(true); QSurfaceFormat format; format.setDepthBufferSize(24); format.setStencilBufferSize(8); format.setVersion(2, 1); format.setProfile(QSurfaceFormat::CoreProfile); QSurfaceFormat::setDefaultFormat(format); canvas = new Canvas(format, this); setCentralWidget(canvas); meshlightprefs = new ShaderLightPrefs(this, canvas); QObject::connect(drawModePrefs_action, &QAction::triggered,this,&Window::on_drawModePrefs); QObject::connect(watcher, &QFileSystemWatcher::fileChanged, this, &Window::on_watched_change); open_action->setShortcut(QKeySequence::Open); QObject::connect(open_action, &QAction::triggered, this, &Window::on_open); this->addAction(open_action); open_external_action->setShortcut(QKeySequence::Open); QObject::connect(open_external_action, &QAction::triggered, this, &Window::on_open_external); this->addAction(open_external_action); open_external_action->setShortcut(QKeySequence(Qt::ALT + Qt::Key_S)); QList quitShortcuts = { QKeySequence::Quit, QKeySequence::Close }; quit_action->setShortcuts(quitShortcuts); QObject::connect(quit_action, &QAction::triggered, this, &Window::close); this->addAction(quit_action); autoreload_action->setCheckable(true); QObject::connect(autoreload_action, &QAction::triggered, this, &Window::on_autoreload_triggered); reload_action->setShortcut(QKeySequence::Refresh); reload_action->setEnabled(false); QObject::connect(reload_action, &QAction::triggered, this, &Window::on_reload); QObject::connect(about_action, &QAction::triggered, this, &Window::on_about); QObject::connect(recent_files_clear_action, &QAction::triggered, this, &Window::on_clear_recent); QObject::connect(recent_files_group, &QActionGroup::triggered, this, &Window::on_load_recent); save_screenshot_action->setCheckable(false); QObject::connect(save_screenshot_action, &QAction::triggered, this, &Window::on_save_screenshot); rebuild_recent_files(); const auto file_menu = menuBar()->addMenu("File"); file_menu->addAction(open_action); file_menu->addAction(open_external_action); file_menu->addMenu(recent_files); file_menu->addSeparator(); file_menu->addAction(reload_action); file_menu->addAction(autoreload_action); file_menu->addAction(save_screenshot_action); file_menu->addAction(quit_action); const auto view_menu = menuBar()->addMenu("View"); const auto projection_menu = view_menu->addMenu("Projection"); projection_menu->addAction(perspective_action); projection_menu->addAction(orthographic_action); const auto projections = new QActionGroup(projection_menu); for (auto p : {perspective_action, orthographic_action}) { projections->addAction(p); p->setCheckable(true); } projections->setExclusive(true); QObject::connect(projections, &QActionGroup::triggered, this, &Window::on_projection); const auto draw_menu = view_menu->addMenu("Draw Mode"); draw_menu->addAction(shaded_action); draw_menu->addAction(wireframe_action); draw_menu->addAction(surfaceangle_action); draw_menu->addAction(meshlight_action); const auto drawModes = new QActionGroup(draw_menu); for (auto p : {shaded_action, wireframe_action, surfaceangle_action, meshlight_action}) { drawModes->addAction(p); p->setCheckable(true); } drawModes->setExclusive(true); QObject::connect(drawModes, &QActionGroup::triggered, this, &Window::on_drawMode); view_menu->addAction(drawModePrefs_action); drawModePrefs_action->setDisabled(true); const auto common_menu = view_menu->addMenu("Viewpoint"); common_menu->addAction(common_view_iso_action); common_menu->addAction(common_view_top_action); common_menu->addAction(common_view_bottom_action); common_menu->addAction(common_view_front_action); common_menu->addAction(common_view_back_action); common_menu->addAction(common_view_left_action); common_menu->addAction(common_view_right_action); common_menu->addAction(common_view_center_action); const auto common_views = new QActionGroup(common_menu); common_views->addAction(common_view_iso_action); common_views->addAction(common_view_top_action); common_views->addAction(common_view_bottom_action); common_views->addAction(common_view_front_action); common_views->addAction(common_view_back_action); common_views->addAction(common_view_left_action); common_views->addAction(common_view_right_action); common_views->addAction(common_view_center_action); common_view_iso_action->setShortcut(Qt::Key_0); common_view_top_action->setShortcut(Qt::Key_1); common_view_bottom_action->setShortcut(Qt::Key_2); common_view_front_action->setShortcut(Qt::Key_3); common_view_back_action->setShortcut(Qt::Key_4); common_view_left_action->setShortcut(Qt::Key_5); common_view_right_action->setShortcut(Qt::Key_6); common_view_center_action->setShortcut(Qt::Key_9); QObject::connect(common_views, &QActionGroup::triggered, this, &Window::on_common_view_change); view_menu->addAction(axes_action); axes_action->setCheckable(true); QObject::connect(axes_action, &QAction::triggered, this, &Window::on_drawAxes); view_menu->addAction(invert_zoom_action); invert_zoom_action->setCheckable(true); QObject::connect(invert_zoom_action, &QAction::triggered, this, &Window::on_invertZoom); view_menu->addAction(resetTransformOnLoadAction); resetTransformOnLoadAction->setCheckable(true); QObject::connect(resetTransformOnLoadAction, &QAction::triggered, this, &Window::on_resetTransformOnLoad); view_menu->addAction(hide_menuBar_action); hide_menuBar_action->setShortcut(Qt::CTRL + Qt::SHIFT + Qt::Key_C); hide_menuBar_action->setCheckable(true); QObject::connect(hide_menuBar_action, &QAction::toggled, this, &Window::on_hide_menuBar); this->addAction(hide_menuBar_action); view_menu->addAction(fullscreen_action); fullscreen_action->setShortcut(Qt::Key_F11); fullscreen_action->setCheckable(true); QObject::connect(fullscreen_action, &QAction::toggled, this, &Window::on_fullscreen); this->addAction(fullscreen_action); auto help_menu = menuBar()->addMenu("Help"); help_menu->addAction(about_action); load_persist_settings(); } void Window::load_persist_settings(){ QSettings settings; bool invert_zoom = settings.value(INVERT_ZOOM_KEY, false).toBool(); canvas->invert_zoom(invert_zoom); invert_zoom_action->setChecked(invert_zoom); bool resetTransformOnLoad = settings.value(RESET_TRANSFORM_ON_LOAD_KEY, true).toBool(); canvas->setResetTransformOnLoad(resetTransformOnLoad); resetTransformOnLoadAction->setChecked(resetTransformOnLoad); autoreload_action->setChecked(settings.value(AUTORELOAD_KEY, true).toBool()); bool draw_axes = settings.value(DRAW_AXES_KEY, false).toBool(); canvas->draw_axes(draw_axes); axes_action->setChecked(draw_axes); QString projection = settings.value(PROJECTION_KEY, "perspective").toString(); if(projection == "perspective"){ canvas->view_perspective(Canvas::P_PERSPECTIVE, false); perspective_action->setChecked(true); }else{ canvas->view_perspective(Canvas::P_ORTHOGRAPHIC, false); orthographic_action->setChecked(true); } QString path = settings.value(OPEN_EXTERNAL_KEY, "").toString(); if (!QDir::isAbsolutePath(path) && !path.isEmpty()) { path = QStandardPaths::findExecutable(path); } QString displayName = path.mid(path.lastIndexOf(QDir::separator()) + 1); open_external_action->setText("Open with " + displayName); open_external_action->setData(path); DrawMode draw_mode = (DrawMode)settings.value(DRAW_MODE_KEY, DRAWMODECOUNT).toInt(); if(draw_mode >= DRAWMODECOUNT) { draw_mode = shaded; } QAction* (dm_acts[]) = {shaded_action, wireframe_action, surfaceangle_action, meshlight_action}; dm_acts[draw_mode]->setChecked(true); on_drawMode(dm_acts[draw_mode]); resize(600, 400); restoreGeometry(settings.value(WINDOW_GEOM_KEY).toByteArray()); } void Window::on_drawModePrefs() { // For now only one draw mode has settings // when settings for other draw mode will be available // we will need to check the current mode if (meshlightprefs->isVisible()) { meshlightprefs->hide(); } else { meshlightprefs->show(); } } void Window::on_open() { const QString filename = QFileDialog::getOpenFileName( this, "Load .stl file", QString(), "STL files (*.stl *.STL)"); if (!filename.isNull()) { load_stl(filename); } } void Window::on_open_external() const { if (current_file.isEmpty()) { return; } QString program = open_external_action->data().toString(); if (program.isEmpty()) { program = QFileDialog::getOpenFileName((QWidget*) this, "Select program to open with", QDir::rootPath()); if (!program.isEmpty()) { QSettings settings; settings.setValue(OPEN_EXTERNAL_KEY, program); QString displayName = program.mid(program.lastIndexOf(QDir::separator()) + 1); open_external_action->setText("Open with " + displayName); open_external_action->setData(program); } } QProcess::startDetached(program, QStringList(current_file)); } void Window::on_about() { QMessageBox::about(this, "", "

fstl
" FSTL_VERSION "

" "

A fast viewer for .stl files.
" "https://github.com/fstl-app/fstl

" "

© 2014-2024 Matthew Keeter
" "matt.j.keeter@gmail.com

"); } void Window::on_bad_stl() { QMessageBox::critical(this, "Error", "Error:
" "This .stl file is invalid or corrupted.
" "Please export it from the original source, verify, and retry."); } void Window::on_empty_mesh() { QMessageBox::critical(this, "Error", "Error:
" "This file is syntactically correct
but contains no triangles."); } void Window::on_missing_file() { QMessageBox::critical(this, "Error", "Error:
" "The target file is missing.
"); } void Window::enable_open() { open_action->setEnabled(true); } void Window::disable_open() { open_action->setEnabled(false); } void Window::set_watched(const QString& filename) { const auto files = watcher->files(); if (files.size()) { watcher->removePaths(watcher->files()); } watcher->addPath(filename); QSettings settings; auto recent = settings.value(RECENT_FILE_KEY).toStringList(); const auto f = QFileInfo(filename).absoluteFilePath(); recent.removeAll(f); recent.prepend(f); while (recent.size() > MAX_RECENT_FILES) { recent.pop_back(); } settings.setValue(RECENT_FILE_KEY, recent); rebuild_recent_files(); } void Window::on_projection(QAction* proj) { if (proj == perspective_action) { canvas->view_perspective(Canvas::P_PERSPECTIVE, true); QSettings().setValue(PROJECTION_KEY, "perspective"); } else { canvas->view_perspective(Canvas::P_ORTHOGRAPHIC, true); QSettings().setValue(PROJECTION_KEY, "orthographic"); } } void Window::on_drawMode(QAction* act) { // On mode change hide prefs first meshlightprefs->hide(); DrawMode mode; if (act == shaded_action) { drawModePrefs_action->setEnabled(false); mode = shaded; } else if (act == wireframe_action) { drawModePrefs_action->setEnabled(false); mode = wireframe; } else if (act == surfaceangle_action) { drawModePrefs_action->setEnabled(false); mode = surfaceangle; } else if (act == meshlight_action) { drawModePrefs_action->setEnabled(true); mode = meshlight; } canvas->set_drawMode(mode); QSettings().setValue(DRAW_MODE_KEY, mode); } void Window::on_drawAxes(bool d) { canvas->draw_axes(d); QSettings().setValue(DRAW_AXES_KEY, d); } void Window::on_invertZoom(bool d) { canvas->invert_zoom(d); QSettings().setValue(INVERT_ZOOM_KEY, d); } void Window::on_resetTransformOnLoad(bool d) { canvas->setResetTransformOnLoad(d); QSettings().setValue(RESET_TRANSFORM_ON_LOAD_KEY, d); } void Window::on_watched_change(const QString& filename) { if (autoreload_action->isChecked()) { load_stl(filename, true); } } void Window::on_autoreload_triggered(bool b) { if (b) { on_reload(); } QSettings().setValue(AUTORELOAD_KEY, b); } void Window::on_clear_recent() { QSettings settings; settings.setValue(RECENT_FILE_KEY, QStringList()); rebuild_recent_files(); } void Window::on_load_recent(QAction* a) { load_stl(a->data().toString()); } void Window::on_loaded(const QString& filename) { current_file = filename; } void Window::on_save_screenshot() { const auto image = canvas->grabFramebuffer(); auto file_name = QFileDialog::getSaveFileName( this, tr("Save Screenshot Image"), QStandardPaths::standardLocations(QStandardPaths::StandardLocation::PicturesLocation).first(), "Images (*.png *.jpg)"); auto get_file_extension = [](const std::string& file_name) -> std::string { const auto location = std::find(file_name.rbegin(), file_name.rend(), '.'); if (location == file_name.rend()) { return ""; } const auto index = std::distance(file_name.rbegin(), location); return file_name.substr(file_name.size() - index); }; const auto extension = get_file_extension(file_name.toStdString()); if(extension.empty() || (extension != "png" && extension != "jpg")) { file_name.append(".png"); } const auto save_ok = image.save(file_name); if(!save_ok) { QMessageBox::warning(this, tr("Error Saving Image"), tr("Unable to save screen shot image.")); } } void Window::on_hide_menuBar() { menuBar()->setVisible(!hide_menuBar_action->isChecked()); } void Window::rebuild_recent_files() { QSettings settings; QStringList files = settings.value(RECENT_FILE_KEY).toStringList(); const auto actions = recent_files_group->actions(); for (auto a : actions) { recent_files_group->removeAction(a); } recent_files->clear(); for (auto f : files) { const auto a = new QAction(f, recent_files); a->setData(f); recent_files_group->addAction(a); recent_files->addAction(a); } if (files.size() == 0) { auto a = new QAction("No recent files", recent_files); recent_files->addAction(a); a->setEnabled(false); } recent_files->addSeparator(); recent_files->addAction(recent_files_clear_action); } void Window::on_reload() { auto fs = watcher->files(); if (fs.size() == 1) { load_stl(fs[0], true); } } void Window::on_common_view_change(QAction* common) { if (common == common_view_center_action) canvas->common_view_change(centerview); if (common == common_view_iso_action) canvas->common_view_change(isoview); if (common == common_view_top_action) canvas->common_view_change(topview); if (common == common_view_bottom_action) canvas->common_view_change(bottomview); if (common == common_view_left_action) canvas->common_view_change(leftview); if (common == common_view_right_action) canvas->common_view_change(rightview); if (common == common_view_front_action) canvas->common_view_change(frontview); if (common == common_view_back_action) canvas->common_view_change(backview); } bool Window::load_stl(const QString& filename, bool is_reload) { if (!open_action->isEnabled()) return false; canvas->set_status("Loading " + filename); Loader* loader = new Loader(this, filename, is_reload); connect(loader, &Loader::started, this, &Window::disable_open); connect(loader, &Loader::got_mesh, canvas, &Canvas::load_mesh); connect(loader, &Loader::error_bad_stl, this, &Window::on_bad_stl); connect(loader, &Loader::error_empty_mesh, this, &Window::on_empty_mesh); connect(loader, &Loader::error_missing_file, this, &Window::on_missing_file); connect(loader, &Loader::finished, loader, &Loader::deleteLater); connect(loader, &Loader::finished, this, &Window::enable_open); connect(loader, &Loader::finished, canvas, &Canvas::clear_status); if (filename[0] != ':') { connect(loader, &Loader::loaded_file, this, &Window::setWindowTitle); connect(loader, &Loader::loaded_file, this, &Window::set_watched); connect(loader, &Loader::loaded_file, this, &Window::on_loaded); reload_action->setEnabled(true); } loader->start(); return true; } void Window::dragEnterEvent(QDragEnterEvent *event) { if (event->mimeData()->hasUrls()) { auto urls = event->mimeData()->urls(); if (urls.size() == 1 && urls.front().path().endsWith(".stl")) event->acceptProposedAction(); } } void Window::dropEvent(QDropEvent *event) { load_stl(event->mimeData()->urls().front().toLocalFile()); } void Window::resizeEvent(QResizeEvent *event) { QSettings().setValue(WINDOW_GEOM_KEY, saveGeometry()); QWidget::resizeEvent(event); } void Window::moveEvent(QMoveEvent *event) { QSettings().setValue(WINDOW_GEOM_KEY, saveGeometry()); QWidget::moveEvent(event); } void Window::sorted_insert(QStringList& list, const QCollator& collator, const QString& value) { int start = 0; int end = list.size() - 1; int index = 0; while (start <= end){ int mid = (start+end)/2; if (list[mid] == value) { return; } int compare = collator.compare(value, list[mid]); if (compare < 0) { end = mid-1; index = mid; } else { start = mid+1; index = start; } } list.insert(index, value); } void Window::build_folder_file_list() { QString current_folder_path = QFileInfo(current_file).absoluteDir().absolutePath(); if (!lookup_folder_files.isEmpty()) { if (current_folder_path == lookup_folder) { return; } lookup_folder_files.clear(); } lookup_folder = current_folder_path; QCollator collator; collator.setNumericMode(true); QDirIterator dirIterator(lookup_folder, QStringList() << "*.stl", QDir::Files | QDir::Readable | QDir::Hidden); while (dirIterator.hasNext()) { dirIterator.next(); QString name = dirIterator.fileName(); sorted_insert(lookup_folder_files, collator, name); } } QPair Window::get_file_neighbors() { if (current_file.isEmpty()) { return QPair(QString(), QString()); } build_folder_file_list(); QFileInfo fileInfo(current_file); QString current_dir = fileInfo.absoluteDir().absolutePath(); QString current_name = fileInfo.fileName(); QString prev = QString(); QString next = QString(); QListIterator fileIterator(lookup_folder_files); while (fileIterator.hasNext()) { QString name = fileIterator.next(); if (name == current_name) { if (fileIterator.hasNext()) { next = current_dir + QDir::separator() + fileIterator.next(); } break; } prev = name; } if (!prev.isEmpty()) { prev.prepend(QDir::separator()); prev.prepend(current_dir); } return QPair(prev, next); } bool Window::load_prev(void) { QPair neighbors = get_file_neighbors(); if (neighbors.first.isEmpty()) { return false; } return load_stl(neighbors.first); } bool Window::load_next(void) { QPair neighbors = get_file_neighbors(); if (neighbors.second.isEmpty()) { return false; } return load_stl(neighbors.second); } void Window::keyPressEvent(QKeyEvent* event) { if (!open_action->isEnabled()) { QMainWindow::keyPressEvent(event); return; } if (event->key() == Qt::Key_Left) { load_prev(); return; } else if (event->key() == Qt::Key_Right) { load_next(); return; } else if (event->key() == Qt::Key_Escape) { hide_menuBar_action->setChecked(false); return; } QMainWindow::keyPressEvent(event); } void Window::on_fullscreen() { if (!this->isFullScreen()) { this->showFullScreen(); } else { this->showNormal(); } } fstl-app-fstl-efc5fb8/src/window.h000066400000000000000000000070121474426361600172560ustar00rootroot00000000000000#ifndef WINDOW_H #define WINDOW_H #include #include #include #include class Canvas; class ShaderLightPrefs; class Window : public QMainWindow { Q_OBJECT public: explicit Window(QWidget* parent=0); bool load_stl(const QString& filename, bool is_reload=false); bool load_prev(void); bool load_next(void); protected: void dragEnterEvent(QDragEnterEvent* event) override; void dropEvent(QDropEvent* event) override; void resizeEvent(QResizeEvent *event) override; void moveEvent(QMoveEvent *event) override; void keyPressEvent(QKeyEvent* event) override; public slots: void on_open(); void on_open_external() const; void on_about(); void on_bad_stl(); void on_empty_mesh(); void on_missing_file(); void enable_open(); void disable_open(); void set_watched(const QString& filename); private slots: void on_projection(QAction* proj); void on_drawMode(QAction* mode); void on_drawAxes(bool d); void on_invertZoom(bool d); void on_resetTransformOnLoad(bool d); void on_watched_change(const QString& filename); void on_reload(); void on_common_view_change(QAction* common); void on_autoreload_triggered(bool r); void on_clear_recent(); void on_load_recent(QAction* a); void on_loaded(const QString& filename); void on_save_screenshot(); void on_fullscreen(); void on_hide_menuBar(); void on_drawModePrefs(); private: void rebuild_recent_files(); void load_persist_settings(); void sorted_insert(QStringList& list, const QCollator& collator, const QString& value); void build_folder_file_list(); QPair get_file_neighbors(); QAction* const open_action; QAction* const open_external_action; QAction* const about_action; QAction* const quit_action; QAction* const perspective_action; QAction* const common_view_center_action; QAction* const common_view_iso_action; QAction* const common_view_top_action; QAction* const common_view_bottom_action; QAction* const common_view_left_action; QAction* const common_view_right_action; QAction* const common_view_front_action; QAction* const common_view_back_action; QAction* const orthographic_action; QAction* const shaded_action; QAction* const wireframe_action; QAction* const surfaceangle_action; QAction* const meshlight_action; QAction* const drawModePrefs_action; QAction* const axes_action; QAction* const invert_zoom_action; QAction* const reload_action; QAction* const autoreload_action; QAction* const save_screenshot_action; QAction* const hide_menuBar_action; QAction* const fullscreen_action; QAction* const resetTransformOnLoadAction; QMenu* const recent_files; QActionGroup* const recent_files_group; QAction* const recent_files_clear_action; const static int MAX_RECENT_FILES=8; static const QString OPEN_EXTERNAL_KEY; const static QString RECENT_FILE_KEY; const static QString INVERT_ZOOM_KEY; const static QString AUTORELOAD_KEY; const static QString DRAW_AXES_KEY; const static QString PROJECTION_KEY; const static QString DRAW_MODE_KEY; const static QString WINDOW_GEOM_KEY; const static QString RESET_TRANSFORM_ON_LOAD_KEY; QString current_file; QString lookup_folder; QStringList lookup_folder_files; QFileSystemWatcher* watcher; Canvas* canvas; ShaderLightPrefs* meshlightprefs; }; #endif // WINDOW_H fstl-app-fstl-efc5fb8/xdg/000077500000000000000000000000001474426361600155715ustar00rootroot00000000000000fstl-app-fstl-efc5fb8/xdg/README.txt000066400000000000000000000011271474426361600172700ustar00rootroot00000000000000Linux : ----------- desktop file and application icons installation. This tells the system that fstl knows to open stl files and allow stl to be launched using windows key. Install : ./xdg_install.sh fstl Uninstall : ./xdg_uninstall.sh fstl if runned as regular user this will install locally in : $HOME/.local/share/mime/ $HOME/.local/share/applications/ $HOME/.local/share/icons/ if runned as root this will install system-wide in : /usr/share/mime /usr/share/applications /usr/share/icons Third script xdg_package_install.sh is to be used when building deb or rpm package. fstl-app-fstl-efc5fb8/xdg/fstlapp-fstl.desktop000066400000000000000000000002351474426361600216030ustar00rootroot00000000000000[Desktop Entry] Name=fstl GenericName=Fast STL Viewer Exec=fstl %U Terminal=false Icon=fstlapp-fstl Type=Application MimeType=model/stl; Categories=Utility; fstl-app-fstl-efc5fb8/xdg/icons/000077500000000000000000000000001474426361600167045ustar00rootroot00000000000000fstl-app-fstl-efc5fb8/xdg/icons/fstlapp-fstl_128x128.png000066400000000000000000000202041474426361600230440ustar00rootroot00000000000000PNG  IHDR>aiCCPICC profile(}=HPOSR*vuP,8jP! :4$).kŪ "%ޗZx>λ}Ш046ɄͭW00"2$)n8zռŀH< & ޴ QVUs1.Hu7E53y(X`YԈcSXYXuZHbK BA eT`#NN4'|_"B29PZ /)_cͺ|;N>Wz_m3Z.ۚ\Olʮ% }SkZ8}24 pp){=s5vrs>ibKGD pHYs  tIME tEXtCommentCreated with GIMPW\IDATx]iGuzݷj͒l l86ā@"K%J%!W*BpEQrm lғܙ9qYgg>Rꕤf9s>}ĕHgmc1?jO-QE+5cFdm/NDdK7ܭw > X/F!$"7Ξ~\ Gtƴ|16WaL*d d8m^ɣ j@;5vg c.2 LLIT+ l`O?GFs@doccRt2#jJcJ@6!/[G.kϟ3X9/zrDcfڮJc"%"JN5d3Wzow@s4v?(1OVrnz47 lPG2y tu}04ak4Da[ }u`yo m` '2;p0vT]``C01ȣ! uEDٴئz+T qi#Oc+ VX8e1 \}od@|{G^aAYa&[<0PG69Tqxk w=~dT|DTe0RxAA0K8 wwZ6? `QƘ36qBɗ!ސ$39x#^'响r5ՑQコz5 Q&`+?uu:#Ɍ"yM(W=jfA ,HrvùΏH-kD 00rD\bFA fu,!i0ٵCx)L4 @EXJm@*ʙd +&CeWPPXħ | `q F E0d8r\lP#X01lL\~&# P؈Q!LDRGi>zcMY!Jrr. '2 P!&= g8pfDTEC+T#ԥX0H*Lҕɐ(EN/&ID`Dz-F0&?Z C< a-xQ3{m31J@pIJ *$)Ƚ%FCL$*)Q^@.p{pջqջub[J`hWNӯ0L"١O>\CL b!TX Vfɗ Hþ[pぽٶ֞(s)vsȤu~aX7̋gNę?9 ,BjYd%+Qb9!`p<T{qÁ=xP*}. P>~~MXZ]Ï~K|'iضMIN<5rեmR s![qvٶAk|[O#Gn2z4< \]Tʉ9K98א 4eDJE\`n8oڷ B^cX Cld_s8};};MɟOers~ϭ0)@NB9J*8z6GQrPe1Tbd1hbĮgO^hS 24W.P66uO3E9 &"GP*)hN5s ^1Yݧ?/|#e3ay!XnMekpw?,4D +\ᴨUee+lZ7TS|/ #M˦it\)ݑ1 Y۹m7 &A!6-/p mu}c|xFK֟Ji.bd#!LC1E!#JlEj'0@,S"() wرy\& YL !dt] 6 Iet0#رi a!$O;?1cm LZh |./"mK{;|.T퍮ۻ?»n~0ȁA N0p RFq{VwUgA!qȥRJo'¼ c Clo5\,>|wBJ9C8j'gx5$QA{Mxჽl-yL xic0YY(>/)LI*("Вs0fWgr)T2G *lFG6'7__gq˵{l*05d  AA "rոێPEu] dJH~JyF'C$>;ʶ(AF5ׇDم߾.W]e06\h \6RVc葰LSo1ƝJ4.D9 7~W <"Hpն]FCԮ6RT*W\&nIt pÎbhN n'?=M#k0- -ӄiY,˒f߇oՑiNI|mL 'ưkԾ D @`MPf~cCދ|6q[FKU kuf3|ݿy0N$뾣eہC˰b> Ӫòl6=K'Fڽ *{b-co d`o"sw~.F.F˲ ehYVS&iNj:lێtfMu~:{;߻:"ޓ)s ChZ`ۦ1_ aTh.;MZ./P-!=qC5{v]Oڲ&ݑY@k|U^>q%xL+z 0y\2*@%nny= %<Ǫ< qA]^-R~#McL3~(|&|pTĦaN6O~p|6˖I]eZ,N{ ,e/l"\g'hc*tr'{Q!ZXRge2D)`&sM9KDUݿ37cl+m:Nz=@.F6㏇aTG|$UE 'a#N>"H[CDPlm+˒cA}eLef.JÉi־'slNbY$ dFeeqwK"~{jL\J$ -8'`hg^ #A #~PWmT,W#z*%=cYGQ~PҜ^pޝyk?b V^P( fS@j$ vmO]:3.C@DЙUlUٴQDe*eZ8;%HgdžKUoEZHڢBɡ9]R c}"cJP h ԏ&Hr [rY;L Y^4LK, "Ȑ`&yLjѨwH%Yͤi̕<5ֿ5b0`Ԟ~zd#θa [^Ɛ8{AeiXB$01lU48j%nNV/gj80IE#`#"&F"Sү8i0-+y<ei\CHB y4VˌH;لR1 fiEVi6u*XSoxη[8AL]>W&ܝ+j4[f҉.Co4[06L˖;s]YG^00M?u,l-|@i B6Y$UMM8?5(h8TQѓRcMÌPЎjf%dm✴QkZo`vq`u%X.cjnY2_7$lB;η#qjW[փB0$-Zob.7tLiqehĭ bT9]eGoR; ˵(tw3 \\Y>, gAha$1csKe Vq*h;M Wý@:ܩ0~Wn^Hڞ Dl2D~KI E bq-إ`/1[Ra(vLibRHU2`ذšKJ5 ,xtȤOaD˲1:FV-$m/ KN_JB~OBQEPBn>l`a* dҩбrJ, oCRKP]<,4@8tۺ^%h2s dyƔrV8YF\+<84!Q4Z/i]~ο֐ hʅv`ajl`v̉gyXd!ma +kղlZV a'~a]N0xy؆@`aj~oU6bjM#4^GHv|ϳ~@` ao f +сRۏ'dQ_c ŒOp˃I %Mgah{2lz?2:Ynn nAx_k4V3>$HZ.Q_hum7n&V* $uBmLˊ[-VVLQ_F2Ζ JegϭZka`F(l۷)Dܾv٘2Zcրa BUb2qp9`Z "u^7WkM,'RR-jsK_CVWz kUqr-,aQ&ďs'^iYa+ȝC˴XaQMϗ!}Όj߾0*q(m8Fym~*UwE*x&JZ#Ǝah[`\ݴ,<رS(*yiLNM0g_ ꨵ+x6"yNm_B+0ml]ԏ/uzRjZq1- jN!_oY(^%8뿟|=9L ҳUĚR'&|j(~5aI '~"m:gSϣiw3fB$Lr+kJ5񕇾aDTāQG񦃝*rڷm?j{ [7O ٞr- K]74kb=)Ap`qܫ[ <0éW+il܋7ڏR"i\Ӵ-~ S3E$ ǎ QNs{rX6䭤EWVxIز {Q,#u~ >2qif195Jy;UOHODgBv" ` xP3=E< ػsڇCv#u~˿a\utrTZ;;sA!:W D.Lޫp݁zNv_;4Z4=ɩL^AH6%5 xI/"8@ƒ`I1Ӳq测IYth?v M:;X~iSӘ[!X$Cv&O#="W ~c /μDB{`$LbRٲDp|f]A K)x`$ & {L{2$9q0 Rb+ k7qA٫ EF%* AY41Yb6+4 64TW&H:BViDmRcW3dhj5j[CeX4!"W[A!Z@@4"a[_OĪ+}F}4vd6֖L(3UW'lq^Է]_]՚pj &;RQUR(X!|,$W l,\| LdQ(ɻuQB_  X::gLNP{1Aw` Sdx%֕$[RrӓX[|c `t0w~ `LKLXA=: 0j~dL˗c< i8OD \؏}?tvwdKP,>0 _wrX//cefp` ې-ޅ;퀞B;1cYBGtiլ^Fuy_潝/@9pmߣ5꺒.+wg:l @Bp;+2;82}~eW@X;"rCSeIENDB`fstl-app-fstl-efc5fb8/xdg/icons/fstlapp-fstl_16x16.png000066400000000000000000000021421474426361600226750ustar00rootroot00000000000000PNG  IHDRaiCCPICC profile(}=HPOSR*vuP,8jP! :4$).kŪ "%ޗZx>λ}Ш046ɄͭW00"2$)n8zռŀH< & ޴ QVUs1.Hu7E53y(X`YԈcSXYXuZHbK BA eT`#NN4'|_"B29PZ /)_cͺ|;N>Wz_m3Z.ۚ\Olʮ% }SkZ8}24 pp){=s5vrs>ibKGD pHYs  tIME 4cgtEXtCommentCreated with GIMPW:IDAT8uKTq?73JLQLdlmZBjӲ$h߶]Цv h"I!MrLg޼m}?{#;<< ";ֿz}Zen8hcu`y0fXki`f`F\;o?|՛wl4\c6P2V nM\ N902pl`x2^ͫ j W{;;0U,U 3wš~ 5Ey4SZ R8I9̌8gfbA}Fz$I'Icf!{?j}^"|v'BԌQ5Ԍ8IY,f[p+BJ4IPU#}J*4"5D3bl`fb}"{ G1KZ@M<,/wF_^λ}Ш046ɄͭW00"2$)n8zռŀH< & ޴ QVUs1.Hu7E53y(X`YԈcSXYXuZHbK BA eT`#NN4'|_"B29PZ /)_cͺ|;N>Wz_m3Z.ۚ\Olʮ% }SkZ8}24 pp){=s5vrs>ibKGD pHYs  tIME 0ztEXtCommentCreated with GIMPWIDAT8}k\E9gd4_6FIR66(( ՊТJz'RA"" ?EZ)䫚M1z1{vѳ3;<32VbiDߺƵ{B%i$,svν]z }ZA;Aߏ OE"KtPUϲ,k&DTU"Ӹځ{yn8S9ub8Y~4*R}vE ʩi._|J>f!1|#}Á5zm>P-g'ǸpE WK͸.޸pO?xo7X?Z*A9;6̫/=]U% C*Qp|[Z:I `USGydZrcȍi+ցBFG<Ρ>t0$[kVc&S ƅ.2vdȱ RUR4kzXխX<3;A]P%*M3whI#'!ڕEٯSڥٖo:QH6u DHiNZ=emkîn.($ i6Xf*{_嵵My6nscuj} UDk( €ݽ~n} "! ^Qh@ǙasmJ#CcُS@!Is6|州<(ˑsEP'ҌgBVq~ }]@᥊GO(Lpq^9s8SYϛlŸ9K0.j:8%M#T⡍Zt m6϶\kZ۝K{_6zbi9X lIg%_'=IENDB`fstl-app-fstl-efc5fb8/xdg/icons/fstlapp-fstl_256x256.png000066400000000000000000000435041474426361600230600ustar00rootroot00000000000000PNG  IHDR\rfiCCPICC profile(}=HPOSR*vuP,8jP! :4$).kŪ "%ޗZx>λ}Ш046ɄͭW00"2$)n8zռŀH< & ޴ QVUs1.Hu7E53y(X`YԈcSXYXuZHbK BA eT`#NN4'|_"B29PZ /)_cͺ|;N>Wz_m3Z.ۚ\Olʮ% }SkZ8}24 pp){=s5vrs>ibKGD pHYs  tIME "tEXtCommentCreated with GIMPW IDATx}i$uޗU{`/,8H !)ER-S,ٲad;d>~%Q,V(D%DH$"]93;gLU]S]GVUfUF3UYޑ/#13v 947̞]Q&g c8Dv$ QWJ"ߗDf ͆0k(LzX_~u:k:cJ σ3 {< !{nJ @$,b0 0"Ijm+Z#q(Qz!gb,Pȓ%|}rW2Le nQI1# H,>0pcmnVO~5TZ\wB.IT  FfɂY}?N-k =)~$HAA`@D1 [!`04 if6j5^}?ƫVy@,Ww H d,"0h#Xb}oXhf֪_z|@އx1d [' #F0৙Q^{ҳcS/zpzŞ_80{z$mq8fJ!AŢ3, T;"4 O3>0 ۭ` p<1O2@ H c ʦYB܍N3mz!K#us10f*`~I2cHtf4clXC3%/*stZdE d&Xο3AL F39 tsϏG3mzWWw(2^ɂA4XwDQ``6 ptI3el|2g)΀1Mg~W }S`c}e#K39qcuيXZF.,qEd=kY eV2GȸVs]@4y ĉ~ ,0ȢY 74#oO;glrL4*~JQĸ %"w& C|X$ʳYaZ&jhF>nȷ8iF`f$i@pYs!сKkh FUxH@fZe$02hǾܵ'G ίJ:K31` #v2h愿̭&QxA!@я!0@"^=Z m;HnܝsIav `cNɶ>0#XD͢X4BL(8c`` jYv!}ۅ\&B.PUc~{wލ*x%]<ݎ2Zݎ~pk!SVg`g(e28sd?;o9R.e3;3UUn vOMCxǟ}_+ ( $M:7Q0Sz0nG@L^ { vSFL['>d4cqه8o>S ^t E|WVgREhv;aL&Sh8yrv[u?31U/x[ȽaēϿyn1amdX@PD`)Ёu na6sZ;Zq~PK;f'0Q*H]uJ 9w/V^<.- @`,;?(5m "\Lr\S1=c)pMqשq5X.au ľ)o=c87'{_XX]Gm$dHԡJP?M1PNfavrw8;n9#wT0ky'?} LI)؃c#?Ix{/ &  Nkn`O N;(;)PS1;w']niyäJSG>8N:3G=W/g_^92@ ӑ=$U]ǖ, c33z={f0Ya}YDp\FžId2*< ,>} olx|󯢭ENלt:gyBx,ÿ(1;U[_T9KL 9LP*Q*p`[3ދ/~+MN׀8!H@0 8#^֕,%yI CXcTi s?鉱>cZٌƊyd3(c0)ݣ0Lğ'4"-]hG.UdEYD?LG b0`/*`PgO0N> ݧVƋh*B}'!CQH'1<~ <> m FNwa)y8쌪=\oafB.35U QFVU3c?Ƌa@0fD,/8_,@o*?8vpfJR|p4U&PwMu^A# o_#aR朔*ڪ u{q-p0{؈B>>z yIocL!ц2. !4oܶ 9޿ۿ{0vQāxx0X`\5o?ca6 p@ûv'n?~1ce5NYAPJ%V ~(ނ~$0p% *6 s;~[b^(Sc,p͔X~?Z !%`=3;c,( X{A<=/%ed4\uf$o2~'Ug•CƫR[Ч9/I8P!ћ<`vr"R;H[.A }rd<_SU|CX|w=VğA!/Ov2>ڟwpgTM6TRQ]ѱ B:[^kּ 򻿆G-rv A'^( _Y[;ފn?~?>:#E+#_a I`* Y_ о]Ŀ(>ȏ9WYo/rR$F@>(PJoCw*xEv\@X,!l\  khe3~s.g4w oe<  0%`q)1<|':Y_*+ V 0XlW Ù؏݁?c\o6+! v0>͇皔!?VcfOj* J p7.]  (?>у{G{h*f:{qjk^[JJUUeTw?ۿ^j"eq (|³}2e=5? rלּ !/ Ptg.ÞR ;rY-0?e읝 $'*> >xѿyf|b$Bi Y,dan?&y^P %ZY `ܥ;(E0ǸŹӘ,cj#z &Nx@bcGlq 2YJW)lFÇ{{g8 i~>0h2bRw0 kb` cvr<)[܄nٌ?8~耧w@>Q^ݾjn,J"BtihZIlf`&ں0)((DgJ y_CD^]kRJ{#(niZӑ>I֣>W[ʶ H@@@K<|=ɩbI,| (tEMIhxڐ%r4(0hb>zEnhu=B>v.5/rUԲ523zmZ;Nj}6$v& mð(Cۭ$vL\Re`pkAaw.U"ma)kBg+1료n'yjnHiBkg͔2zlNLYMoIqP|!5vdknnxi[\9 4)ũYܷP$Xcx !02lzzaKXFZ)9FVU:0ty1Wa&K%n_1)/k:t<4) jJ4&M[c߹i.0 0༐biŐ0;5@g('(F*v:3ۤ(+o&1=16̒2N(U8g`2/ ?tx#38@w2 &2p[i=;׾}`54sm裑<=ɷȣ{,P{VCJPTo cz?lTNbGH]#z|}x>|itf&Jy\6Pjʉbkcs@PʌcP/+•h2Dz܊@)x1C3`f+0I WC6 8('tPxL,Pm϶a&丯l=G.rd=ndX2rx׉tpM{wdBTǎpFHH0k&_R!%PB uN҅_.Tl3f3*Ta`0/D@Ly/q(sxdW 2uQ¤A.sp$`tXB(,]xT a fCDF'Mx PpI! yn_H1(9e"0Xz&DqL [qA!4PCY{,Ҝ [=QSE * V ơEZ,hCEnYRȵ`Ӄ43Q-U/(35) Z'GBwpMw91Y.8%G?Qw%와2[7L!ە<~ DX;)Ẁdစ@"A@ʛ2@#* [{t]$PԒiNV)[<Ƙ|0H0^g*JD{ IDAT1욞og ZX>fhu_L?@)#Jc` h:gi.s13xFBI!ZT|Wn9tS!0-$fY~?^FqUUFy@ OYd$Q1 !p{ A'$k9l/0v t)qpޙ@ǁba|$> (NMH] 씽;Z EۭpówN#i8#["(H!.c:NRiA\䜁(Xv  ÷,?>WRwH2[Jȃ>O!Q>2]"G&uZx~L>yuo v-8\BQWI+ pQVs`kem`ASj0 SwեS 0iaw[( 4yd]+= #p-  GVJq&d'] m%IP S .!Kq[rs[dYLMcyIiow_X6FN.qBdTh㽔`w+MŤm 8Y*N#m;.B2w]8 8| o@Ę Q0LM`zb,Vf4 jȲIn݀Qv+ Vm8 p `n+s]~5ktk0)2Bd2uͽ33O9)9Dwg$ty`|R2owJ͖["NOm r(^H ?/Tʛ2VVzz"?*V C;n)9g27d^^O6|_ w@jZVc | ZmCxC!SLhX.nhu\z}c vU섒u&-a}9ɨz)_-'&˛ֺqQq(a$XYX5(Z3fl$.HP ,,-5A,05ebBQoVk͖KԛX2Dj$[otupl`a= B +0 ٌ5HMSA֛kğv;۞8@..h* *EiV Z*MUitL-xe5 '/U)@,$Gب,+`]Uhu\t.?mCOܓ4;ڿ5Z  ! R%E,oYjO?c:,0Kl___^x %^aV+&T1tf[OUn_Br~If[s3"%hgv?-Bt,oӢi =,LpGjݱRWn9Fx-2cyGKeaA$UQziV;yW@ 1֋~'A 蝀f[G{rҵ5[E ȩ2q;|3_jhty- r\`oip!(Fj9F($&V<̥J+}W/E4`+ -*G̊$:u"0 K V|-M+T&eNGcRܓMkoTlm.[Rkb, ?@J%iZvA`q=Td'~1/8>umvze(Uֱ RӤ͘iQ DQ0gKdxbǯd &֐@t30Ejŗ Jw`!QѦ!svHuHg5Je4U7h ʨu[n1ELsZ-o_ Xm/' ZA[j)h2hLjH!k`[4꺣&lgj;4m2;sh L ![,v0(@dMsPX-W5!! bV&wXHv_fiL1~ ںB)y!B 9#dlVV[X|'r2$=3i@00fi $P}FFh h^ (76MuX@&#O%M[2ۆ鸴^g< X|VA l栃om&V+}"?W !ۯkM5[^ kOB.Amq+/+ #/Ag[ eEܘ0D͔i9e^ H R(Q(Bii=Q A\ SzR1+u5exkN:]N^v'lQ6P7ףn㓟2KC `0"0뇢%T(%$0~PFVݻe1|2'. Ö) g) zfi=J\'[<~!OrPЦ TE)fam԰Zـnu|_:^çm` #p8[s"U')9왝d ":/đ}gچ Xf chZjE[ϣ&t@KI)*&0n^pgw>d0`= lk:B !W/\1 !Xۨaa@uoRJ Fabz זX-}PJ񅧟w_|A9pNRF 'j1A`tQfU}e=B 7/ O~ke^Ir~ElX-פ7f +Fd"Yg>jDA `vU ŠOϜB^ yiˬ&hjl\;.jZ N 1z *պ ڛ/?3`˷0rK%NዻSu|l&śKR} !IVlmKh ,VV2y%O&Z$D?cF%&[XGW+h뚘&uj Q9o# Jm?upR9|A V5oE-VjVz l^vD63_zeÖ_/^X0&]zv*\~H*Q..s_} = _7?B jF=rZ_7:j R.y\^XeJ Ax0P=)U"Z ՛x[^{~9|WBHU%A\2i;?!z}u+Ql(ZlnXs`Į :_x{ّO|`,0% $E*Kۜx;[LQ6pui=ḅ'#jEA?/TҍH Ok0X d@!llV'¹WzZ`:*FltX!{{pJŷB/7z pY3 `1`L@ ?Ltē|}E ._JIfr癳n L )cWOhx]S( ] 噀%Z*(XNj ׿Z._OJյv-]v4ZuvV}Q\`I\0k8b~D!K_ť [v2Mrӡ8h5:V*Xߨ w-PgJqAo0^j:)!3YJ0!hw싯WֱHcrf,K`݃; SʻuF/b~acY`N7z'(+pDCs7~_2Lk_NJå}ތu2!VIl>eywtd0H9 ,]BWO'(z: j`(oֳwZfJ)*&6k P*L_xU޻]vHH<&8YWb&A ^W_{q`Hht&DabRnd&0(Dg4@# cӭAALu@+ ϿgxɛqacI#['(W˸|mp"R }vKd# H@DJ@foE<+(ᶓp93+pXmeOUlXXZ+Wq"V/pŐB0˱o}.1G73[ϾIq8N?qq:A7P'KX^]n`bc ! _0X.ZFd;K1 m',`n>~n>b!{ I"h6[_\+pa~fJ&}c1`@=  "P3'Ӥtu.+>N͇Ķ(yteKWqU\[Z:J˧̃ m\qD8DS$;%]Fo\7.\A6#sqܴ1!1]7p./5/ ` A!!Ω F$m "ii:^={qb­'a8ˀRb.s5,,FJ ̉tiu{6? 0b>$(H^CA/g#LMpc/AU[&eu)hu\Y WBh"b``U5/<͇DFx?]38}Μ8b 7R ]wu*]Ǖj\iIP. 0".'Bs cK:yBW^_]8rpN8c7Di੕ c+Splaaio^+ Kج>fi|8 \J"7Y ,n``s"Dpu\CFp>v8G1뻣aRfǬWq".4;$`8l P(w_#(EWy 8:gN}l_X Wp}e͎w<`@\yZ.d&FٛDUh xC݆js2  8ƙbn0OJ"ro$|i\C|@%v>Y ڄL.7Bj]wԥG$0w% NqJJE9 ݑ-:?q%  ؛-=X'l8ensnMŃA +#1U{)_ %^M<|5p` j *:Sb1WL\8 >|L6fBʷD?YLhk%X߮lDe<?@ @d &!d4ҰϟunXKDȻkQdk1sAj3"O,4L{9xd@#NS,=ikgHR*p ǗHZa'=xx*4?CTAE4oL@k>9?C( S. oU K (MӤ|kog 0sU nGMFKKx&`ʷ%d9>*PL&`%I֗kn?$%s`@$ DF.R J (r&`Ls#[d/r|Qtx1jbߥ`q+eB"b bڀI R{$ 4L;op/V& MicN亠=m3D sJs DE dbJ=,=3dɑ4B^it ĥ{,(4@m>8?Bnmi!̈́{,(wGj؅:cF8f Kx>BmJ3a4LͺSa^IDAThtNF|@(_xQ؊2K sI`(|D6 `;fjw@ '!Mȗٮ4d-n  KP&BDAG]ӸQjh}#S (ji1s7R3؎=%$|fi*.0ƨZ6LSceM#flЌ=36kk/7猱kD,|4ic Dc+֧1K0ZP:B,4s3cy\i Fy4%Z )npM#{+͆$0?8jlXlY]B{c:ֈ34q4Mbk$Z>Qj_p>` _C&y#e#MӰ%k1.4`F+-M_pwXkW魯EC4&H`H?) ౴d,̜iX|޴LYf,hԯaǙ~N8'skf#ŨIr" KدY[?:=sF+4k=E{r?OCQ$$fئO'e\S/ZB݄A'-܇=Gp*a$')A9mW M!| yTWWЉoX  gP%+HdnSocsm KVO[[}Ξ s@L` cEpcS#7vZ8%H l0QhEZy 5+l_ 6,k9`2Cȏ@&?-[(@[PRg 4c `Ԁi0M:Z*`[ƫYE'Tl@Y@>,+d]@C;wkul 5ۧ+0u=C5}]fOtA`vWmZ [zتH  Ȣ,,>E34ݚ~/ \&vC;cgxlV+8Xva3,RT쌝3??_!bIENDB`fstl-app-fstl-efc5fb8/xdg/icons/fstlapp-fstl_32x32.png000066400000000000000000000037071474426361600227010ustar00rootroot00000000000000PNG  IHDR szziCCPICC profile(}=HPOSR*vuP,8jP! :4$).kŪ "%ޗZx>λ}Ш046ɄͭW00"2$)n8zռŀH< & ޴ QVUs1.Hu7E53y(X`YԈcSXYXuZHbK BA eT`#NN4'|_"B29PZ /)_cͺ|;N>Wz_m3Z.ۚ\Olʮ% }SkZ8}24 pp){=s5vrs>ibKGD pHYs  tIME  ̌etEXtCommentCreated with GIMPWIDATXÍˏTEۏpf@[t(:>ĕ;.]31Fn4c@L KCPy::.n{{*3Iu9uWuU  #5SID/bKGP8;?-{{9|%KiJZώyіSiY+'&uCDI'p!MeWZ3MnMMtCuLE@@UG+Y=ᘶ)z㞪41Li#5;vR*Rof,\=kxb)vaۖQvmqVy K?ÅWZ.%@]Dga];( 7 e8is5A*醃>OP*,Z\*:y.rp釜"j^0K GU#)y(:H#I$FsD<^{)ye*% FSvwDʖީy8m4 KHp'u+rFlF AfeI$D<_|cYzZP$쳻`jf)dHߙ9&,$䋌"BdLrKGoRo+(14sܸ>*s=yLqR]rSy$J@!sD b djvoӯ& λ}Ш046ɄͭW00"2$)n8zռŀH< & ޴ QVUs1.Hu7E53y(X`YԈcSXYXuZHbK BA eT`#NN4'|_"B29PZ /)_cͺ|;N>Wz_m3Z.ۚ\Olʮ% }SkZ8}24 pp){=s5vrs>ibKGD pHYs  tIME %tEXtCommentCreated with GIMPW IDAThZK%USuow<3DyظpGn k qaDY! E#a :}_UwQϩjթU??CLP;yj7 Pc/rﮙ y6/_81pgV>s}ff9W6sP)1Aa>19$ysO?a愪w?DSl /,Ri\^7vsS>F0hC2¬WN><+4Ƀٻ̆nvJ7x'cfÔm`N2`@E'hK .v-lBX7͜bnn8 &F>!ɤju/1nAn ҲLNbX!"T s1 ɈjJ 4r %mgBYgb(;@(cF$ p;cɍ^[1N,TsRK87vs ӏ"g+0z>6`iNk&]&E]Z`vN;>7|\l{p%dtƳyQ|^;'o?#{cqy gޛ™\@ng­SS-McFD`+bKڎcGؿfDJaV[23gN1YY~ޛq&av y$ V~p!7RQ켩H,4}xI<^ Ibg6XIo\p G#et6c܏{>sȩH[77^$9m Q[έ xLQ TXs,^~OR81("P#::"'ӽw¯=|[}!#q]0ʞ|1(&c`qT+S8:(bQۚ~PD0Y&:3wކS'a&M4P|3 1g;-ZV0Rۓ?&usYW-q %i%{ nǏ'Q#l<54ExGn, .T4.ߺ_np q8%jO`by2""Bs|i[ )e>+S%+YZkH2TS8w 0a~GUGkT 3T*43D#TةfC&m߳}+ - hđ <5cP*ˮi66adG ? Ӆl AD#U*"<TD._siɰ[B / T뽁s&" 1o&X tmC4B" p%\m!4u8BH>ZlćNv+ᎄ"݃i3 {}0gf@7=c61T;4%V0 G쇞$I^Y68sF )%T$I$u)ij(tz=hf.sb!,Y7N2ZtyAb`@kTs>>`vq ~s(w%03ζ $ZzeU!"&)Vֺ&[-ȘH’SULdUUfJD3HsU\<ۚ&)puLZg>^2Ȍ#>6~ X<SRJ2vE%?Y=ZxGӋhkUY^!֫vdٲ8;++kC\k]<+6G]sP}cv/LJ Ht{C,,!U ewY\~ו^U PGy+ ?p&J ʀZ>C @ku    |p_?96{9RXXƻ_ٖW|,vZzKXt1/y o;_@,=|ʲN|Gʎ{B;(kn6xS8oĊW%5\j3קq4+yezn\u:#KF}m7 ™Zk %7.ð$3k1<E *np?Zװ3blMTGl0}'O96|MXkOa9!mLAVe ZM^;q 0IENDB`fstl-app-fstl-efc5fb8/xdg/icons/fstlapp-fstl_64x64.png000066400000000000000000000076461474426361600227210ustar00rootroot00000000000000PNG  IHDR@@iqiCCPICC profile(}=HPOSR*vuP,8jP! :4$).kŪ "%ޗZx>λ}Ш046ɄͭW00"2$)n8zռŀH< & ޴ QVUs1.Hu7E53y(X`YԈcSXYXuZHbK BA eT`#NN4'|_"B29PZ /)_cͺ|;N>Wz_m3Z.ۚ\Olʮ% }SkZ8}24 pp){=s5vrs>ibKGD pHYs  tIME %tEXtCommentCreated with GIMPW ~IDATx[[lΙywc;HBl&MҐ rJ)E-RT>>"VjCUZUJ  ( Bͭė\>̜sfw҉ᅵ1xWfQ=C6w>c*Ax_/``ۄ_0ү&9O?:5e--X²wa6s(UDh))dÓ`1'YLG 2ՍXTrr.wXpy kr}F?%BDя"$Ӣ-tkƦ2FS6GmN- 6qH"@J2Z!X&7ocs ܜ oHFH'$i1Zx? B8T": ( sfQz>2ZzJZ=}&W'i!0>BrAva#\b#0JZqa :IQd.m4)y6F'#aaKER ût$h?"X+$ɷ`&n.$ Y! n*(ER<0qdD!a)AX ("PM(&*aPť0P0-jT [9!QCΞµy*AՈ)VD ez11=cvl*RÉSgN̅)6H(Q#0>a>!JlnQmE7*0X̹ϋyqxN%Ua乄+JF?3l0 dR3B/{G A+6\<~CX# l.!}(r  +#'k<ΐϦ_Xo8\;Z 0 m ?p8c8C.%@9qt}84M8@6JCV-%; 1 50Y׏G۶0-+&E4n-CA;8䥴1?3-[YΡi5N"d2`0a$>b\Z\)Ccn6LD!ubdK} nGb^о:̇ A2c_e=+ض9x/5 $@1d2H}"4]#K Q rHavlBPR4Dz%hˡ_uF%.$I*d&F%t߾ (fKj@V2jmZp}_-SҶݼ,ސQd!P!z޲m&W4j?Vcfy!D bu0 3Ӵk\|4!Cr;8\c[A[2隆f˄Zo6C  X#=N'"k{=-;Wr-WRn04ԛ4ʘK")73h%XUB)|*FaB'TW/<cRnzjڦݕ)iݴD! y"JR{EHqgClbTYah!%CfBVHԾiXXgFBt= J¦qh:q -U"D3Ai\]iYI$54DJ VM c1kV,;L EX`neD2h,+`a)]2Uocն^a`\5Jr!{ ^\jX/Y[,9WiJ0[CD ˫5&cF<PkA1}:/=4X$1T :(Uشa˵>d#CZ_XoQȸ}K8cyA桊2kjhZkoP~mD 2C1PA1`!}$5F+\&յ/vv`Zp+l_$!~KHu4;]2 yeVg;rj:A^:X(`6.]ñOq"DIz )T+xOlK~qKexXS4͖ Ӳ1TZr] P7R˜0  %O'C}4D~jx7G)ChehhҾW\X\≐d&Qp1脈j_|o!nudpM%K8sfba!; =$v\dͳWi"XgZ&Ξ.!NaQ؎m[n |+.WVULL?kKм&f||b~;'ưmM<;3/0L'HXR_٠dڈ\˫5ޙ>@Wqza ]@輔 )YXZ꜀MknG/$Qi}:pAWI/ :G`$|in=;B:Ma1`b >M^e:cV D_]H6ś}tJ"E@}eř)rSk-ߓ'EۭKZ=J=SE̩j$k3bdn<3}7_bHA-jbqf DfōG[,tc2̚%LxDSE4VQm>CD\ z16l 2M=xm6Xvc D45Q׌(z:?. 2e" R3lfIENDB`fstl-app-fstl-efc5fb8/xdg/xdg_install.sh000077500000000000000000000040201474426361600204340ustar00rootroot00000000000000#!/bin/bash # This script will install mimetypes, icons and desktop file, # it takes a name in argument # # if runned as regular user this will install locally in : # $HOME/.local/share/mime/ # $HOME/.local/share/applications/ # $HOME/.local/share/icons/ # # if runned as root this will install system-wide in : # /usr/share/mime # /usr/share/applications # /usr/share/icons if [ $# != 1 ]; then echo "You must provide an application name" exit 1 fi name=$1 # echo "Installing mimetypes" # xdg-mime install fstlapp-$name-mimetypes.xml echo "Installing desktop file" xdg-desktop-menu install fstlapp-$name.desktop echo "Installing apps icons" iclist="fstlapp-$name" for im in $iclist do xdg-icon-resource install --theme hicolor --context apps --size 16 icons/${im}_16x16.png $im xdg-icon-resource install --theme hicolor --context apps --size 22 icons/${im}_22x22.png $im xdg-icon-resource install --theme hicolor --context apps --size 32 icons/${im}_32x32.png $im xdg-icon-resource install --theme hicolor --context apps --size 48 icons/${im}_48x48.png $im xdg-icon-resource install --theme hicolor --context apps --size 64 icons/${im}_64x64.png $im xdg-icon-resource install --theme hicolor --context apps --size 128 icons/${im}_128x128.png $im xdg-icon-resource install --theme hicolor --context apps --size 256 icons/${im}_256x256.png $im done # echo "Installing mimetypes icons" # iclist="`cat fstlapp-$name-mimetypes.xml | grep "icon name" | sed 's/^.*"\(.*\)".*$/\1/'`" # for im in $iclist # do # xdg-icon-resource install --theme hicolor --context mimetypes --size 16 icons/${im}_16x16.png $im # xdg-icon-resource install --theme hicolor --context mimetypes --size 22 icons/${im}_22x22.png $im # xdg-icon-resource install --theme hicolor --context mimetypes --size 32 icons/${im}_32x32.png $im # xdg-icon-resource install --theme hicolor --context mimetypes --size 48 icons/${im}_48x48.png $im # xdg-icon-resource install --theme hicolor --context mimetypes --size 64 icons/${im}_64x64.png $im # done fstl-app-fstl-efc5fb8/xdg/xdg_package_install.sh000077500000000000000000000026371474426361600221230ustar00rootroot00000000000000#!/bin/bash # For a package installation (rpm or deb), we must proceed a different way # This script takes two arguments, the first one is the installation # prefix and the second is the name if [ $# != 2 ]; then echo "You must provide two arguments" exit 1 fi base=$1 name=$2 # echo "Drop mimetypes file in /usr/share/mime/packages/" # mkdir -p $base/usr/share/mime/packages/ # cp fstlapp-$name-mimetypes.xml $base/usr/share/mime/packages/ echo "Drop desktop file in /usr/share/applications/" mkdir -p $base/usr/share/applications/ cp fstlapp-$name.desktop $base/usr/share/applications/ slist="16 22 32 48 64 128 256" echo "Installing apps icons" iclist="fstlapp-$name" for im in $iclist do for s in $slist do mkdir -p $base/usr/share/icons/hicolor/${s}x${s}/apps cp icons/${im}_${s}x${s}.png $base/usr/share/icons/hicolor/${s}x${s}/apps/$im.png done done # echo "Installing mimetypes icons" # iclist="`cat fstlapp-$name-mimetypes.xml | grep "icon name" | sed 's/^.*"\(.*\)".*$/\1/'`" # for im in $iclist # do # for s in $slist # do # mkdir -p $base/usr/share/icons/hicolor/${s}x${s}/mimetypes # cp icons/${im}_${s}x${s}.png $base/usr/share/icons/hicolor/${s}x${s}/mimetypes/$im.png # done # done # # Put this in the post installation and post uninstallation scripts # #echo "Updating mime database" #update-mime-database /usr/share/mim # #echo "Updating desktop database" #update-desktop-database fstl-app-fstl-efc5fb8/xdg/xdg_uninstall.sh000077500000000000000000000034041474426361600210040ustar00rootroot00000000000000#!/bin/bash # This script will uninstall mimetypes, icons and desktop file # # if runned as regular user this will uninstall locally from : # $HOME/.local/share/mime/ # $HOME/.local/share/applications/ # $HOME/.local/share/icons/ # # if runned as root this will uninstall system-wide from : # /usr/share/mime # /usr/share/applications # /usr/share/icons if [ $# != 1 ]; then echo "You must provide a name" exit 1 fi name=$1 # echo "Uninstalling mimetypes" # xdg-mime uninstall fstlapp-$name-mimetypes.xml echo "Uninstalling desktop file" xdg-desktop-menu uninstall fstlapp-$name.desktop echo "Uninstalling apps icons" iclist="fstlapp-$name" for im in $iclist do xdg-icon-resource uninstall --theme hicolor --context apps --size 16 $im xdg-icon-resource uninstall --theme hicolor --context apps --size 22 $im xdg-icon-resource uninstall --theme hicolor --context apps --size 32 $im xdg-icon-resource uninstall --theme hicolor --context apps --size 48 $im xdg-icon-resource uninstall --theme hicolor --context apps --size 64 $im xdg-icon-resource uninstall --theme hicolor --context apps --size 128 $im xdg-icon-resource uninstall --theme hicolor --context apps --size 256 $im done # echo "Uninstalling mimetypes icons" # iclist="`cat fstlapp-$name-mimetypes.xml | grep "icon name" | sed 's/^.*"\(.*\)".*$/\1/'`" # for im in $iclist # do # xdg-icon-resource uninstall --theme hicolor --context mimetypes --size 16 $im # xdg-icon-resource uninstall --theme hicolor --context mimetypes --size 22 $im # xdg-icon-resource uninstall --theme hicolor --context mimetypes --size 32 $im # xdg-icon-resource uninstall --theme hicolor --context mimetypes --size 48 $im # xdg-icon-resource uninstall --theme hicolor --context mimetypes --size 64 $im # done