diff --git a/PixelComposer.resource_order b/PixelComposer.resource_order index 288a0dc5e..8d5943666 100644 --- a/PixelComposer.resource_order +++ b/PixelComposer.resource_order @@ -117,6 +117,7 @@ {"name":"overlay","order":2,"path":"folders/panels/preview/overlay.yy",}, {"name":"sprites","order":3,"path":"folders/panels/preview/sprites.yy",}, {"name":"shader","order":8,"path":"folders/shader.yy",}, + {"name":"_helper","order":49,"path":"folders/shader/_helper.yy",}, {"name":"3d","order":29,"path":"folders/shader/3d.yy",}, {"name":"blend","order":18,"path":"folders/shader/blend.yy",}, {"name":"blur","order":38,"path":"folders/shader/blur.yy",}, @@ -127,6 +128,7 @@ {"name":"flood fill","order":47,"path":"folders/shader/flood fill.yy",}, {"name":"generator","order":19,"path":"folders/shader/generator.yy",}, {"name":"mask","order":45,"path":"folders/shader/mask.yy",}, + {"name":"misc","order":50,"path":"folders/shader/misc.yy",}, {"name":"shape seperator","order":35,"path":"folders/shader/shape seperator.yy",}, {"name":"sprites","order":20,"path":"folders/shader/sprites.yy",}, {"name":"warp","order":41,"path":"folders/shader/warp.yy",}, @@ -141,7 +143,7 @@ {"name":"node_time_remap","order":3,"path":"scripts/node_time_remap/node_time_remap.yy",}, {"name":"sh_perlin","order":1,"path":"shaders/sh_perlin/sh_perlin.yy",}, {"name":"node_tool","order":10,"path":"scripts/node_tool/node_tool.yy",}, - {"name":"sh_find_pixel","order":46,"path":"shaders/sh_find_pixel/sh_find_pixel.yy",}, + {"name":"sh_find_pixel","order":3,"path":"shaders/sh_find_pixel/sh_find_pixel.yy",}, {"name":"panel_preview_window","order":1,"path":"scripts/panel_preview_window/panel_preview_window.yy",}, {"name":"sh_scale3x","order":29,"path":"shaders/sh_scale3x/sh_scale3x.yy",}, {"name":"node_csv_file_write","order":13,"path":"scripts/node_csv_file_write/node_csv_file_write.yy",}, @@ -231,7 +233,7 @@ {"name":"_3D","order":6,"path":"scripts/_3D/_3D.yy",}, {"name":"sh_corner_erode","order":48,"path":"shaders/sh_corner_erode/sh_corner_erode.yy",}, {"name":"node_outline","order":11,"path":"scripts/node_outline/node_outline.yy",}, - {"name":"sh_mesh_generation","order":44,"path":"shaders/sh_mesh_generation/sh_mesh_generation.yy",}, + {"name":"sh_mesh_generation","order":4,"path":"shaders/sh_mesh_generation/sh_mesh_generation.yy",}, {"name":"math_function","order":7,"path":"scripts/math_function/math_function.yy",}, {"name":"__point","order":4,"path":"scripts/__point/__point.yy",}, {"name":"scrollBox","order":13,"path":"scripts/scrollBox/scrollBox.yy",}, @@ -586,6 +588,7 @@ {"name":"node_VFX_spawner","order":1,"path":"scripts/node_VFX_spawner/node_VFX_spawner.yy",}, {"name":"_draw_defines","order":21,"path":"scripts/_draw_defines/_draw_defines.yy",}, {"name":"sh_color_replace","order":8,"path":"shaders/sh_color_replace/sh_color_replace.yy",}, + {"name":"__surface","order":8,"path":"scripts/__surface/__surface.yy",}, {"name":"rotator","order":11,"path":"scripts/rotator/rotator.yy",}, {"name":"s_node_edge_detect","order":20,"path":"sprites/s_node_edge_detect/s_node_edge_detect.yy",}, {"name":"node_fluid_add_collider","order":6,"path":"scripts/node_fluid_add_collider/node_fluid_add_collider.yy",}, @@ -694,7 +697,6 @@ {"name":"sh_fd_turbulence","order":22,"path":"shaders/sh_fd_turbulence/sh_fd_turbulence.yy",}, {"name":"s_node_compare","order":1,"path":"sprites/s_node_compare/s_node_compare.yy",}, {"name":"s_node_fluidSim_domain_queue","order":9,"path":"sprites/s_node_fluidSim_domain_queue/s_node_fluidSim_domain_queue.yy",}, - {"name":"sh_camera","order":43,"path":"shaders/sh_camera/sh_camera.yy",}, {"name":"s_node_vfx_spawn","order":2,"path":"sprites/s_node_vfx_spawn/s_node_vfx_spawn.yy",}, {"name":"texture_set_repeat","order":1,"path":"scripts/texture_set_repeat/texture_set_repeat.yy",}, {"name":"fd_rectangle_update_velocity","order":22,"path":"scripts/fd_rectangle_update_velocity/fd_rectangle_update_velocity.yy",}, @@ -720,7 +722,7 @@ {"name":"s_node_fluidSim_vortex","order":8,"path":"sprites/s_node_fluidSim_vortex/s_node_fluidSim_vortex.yy",}, {"name":"string_hexadecimal","order":1,"path":"scripts/string_hexadecimal/string_hexadecimal.yy",}, {"name":"s_node_camera","order":3,"path":"sprites/s_node_camera/s_node_camera.yy",}, - {"name":"sh_find_boundary","order":48,"path":"shaders/sh_find_boundary/sh_find_boundary.yy",}, + {"name":"sh_find_boundary","order":2,"path":"shaders/sh_find_boundary/sh_find_boundary.yy",}, {"name":"_node_strand_affector","order":10,"path":"scripts/_node_strand_affector/_node_strand_affector.yy",}, {"name":"sh_vertex_pnt_light","order":4,"path":"shaders/sh_vertex_pnt_light/sh_vertex_pnt_light.yy",}, {"name":"surfaceBox","order":22,"path":"scripts/surfaceBox/surfaceBox.yy",}, @@ -795,7 +797,7 @@ {"name":"steam_ugc_project","order":1,"path":"scripts/steam_ugc_project/steam_ugc_project.yy",}, {"name":"sh_fd_visualize_pixel_art_fire_glsl","order":15,"path":"shaders/sh_fd_visualize_pixel_art_fire_glsl/sh_fd_visualize_pixel_art_fire_glsl.yy",}, {"name":"struct_functions","order":4,"path":"scripts/struct_functions/struct_functions.yy",}, - {"name":"sh_content_sampler","order":34,"path":"shaders/sh_content_sampler/sh_content_sampler.yy",}, + {"name":"sh_content_sampler","order":1,"path":"shaders/sh_content_sampler/sh_content_sampler.yy",}, {"name":"fd_rectangle_get_repeat","order":19,"path":"scripts/fd_rectangle_get_repeat/fd_rectangle_get_repeat.yy",}, {"name":"s_menu_white","order":1,"path":"sprites/s_menu_white/s_menu_white.yy",}, {"name":"color_loader","order":13,"path":"scripts/color_loader/color_loader.yy",}, diff --git a/PixelComposer.yyp b/PixelComposer.yyp index fd328f75d..f8d875425 100644 --- a/PixelComposer.yyp +++ b/PixelComposer.yyp @@ -144,6 +144,7 @@ {"resourceType":"GMFolder","resourceVersion":"1.0","name":"overlay","folderPath":"folders/panels/preview/overlay.yy",}, {"resourceType":"GMFolder","resourceVersion":"1.0","name":"sprites","folderPath":"folders/panels/preview/sprites.yy",}, {"resourceType":"GMFolder","resourceVersion":"1.0","name":"shader","folderPath":"folders/shader.yy",}, + {"resourceType":"GMFolder","resourceVersion":"1.0","name":"_helper","folderPath":"folders/shader/_helper.yy",}, {"resourceType":"GMFolder","resourceVersion":"1.0","name":"3d","folderPath":"folders/shader/3d.yy",}, {"resourceType":"GMFolder","resourceVersion":"1.0","name":"blend","folderPath":"folders/shader/blend.yy",}, {"resourceType":"GMFolder","resourceVersion":"1.0","name":"blur","folderPath":"folders/shader/blur.yy",}, @@ -154,6 +155,7 @@ {"resourceType":"GMFolder","resourceVersion":"1.0","name":"flood fill","folderPath":"folders/shader/flood fill.yy",}, {"resourceType":"GMFolder","resourceVersion":"1.0","name":"generator","folderPath":"folders/shader/generator.yy",}, {"resourceType":"GMFolder","resourceVersion":"1.0","name":"mask","folderPath":"folders/shader/mask.yy",}, + {"resourceType":"GMFolder","resourceVersion":"1.0","name":"misc","folderPath":"folders/shader/misc.yy",}, {"resourceType":"GMFolder","resourceVersion":"1.0","name":"shape seperator","folderPath":"folders/shader/shape seperator.yy",}, {"resourceType":"GMFolder","resourceVersion":"1.0","name":"sprites","folderPath":"folders/shader/sprites.yy",}, {"resourceType":"GMFolder","resourceVersion":"1.0","name":"warp","folderPath":"folders/shader/warp.yy",}, @@ -278,6 +280,10 @@ {"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"s_noti_icon_warning_strip2.png","CopyToMask":-1,"filePath":"datafiles/data/themes/default/graphics/icon",}, {"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"s_padding_link_strip2.png","CopyToMask":-1,"filePath":"datafiles/data/themes/default/graphics/icon",}, {"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"s_panel_active_split.png","CopyToMask":-1,"filePath":"datafiles/data/themes/default/graphics/icon",}, + {"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"s_panel_animation.png","CopyToMask":-1,"filePath":"datafiles/data/themes/default/graphics/icon",}, + {"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"s_panel_graph.png","CopyToMask":-1,"filePath":"datafiles/data/themes/default/graphics/icon",}, + {"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"s_panel_inspector.png","CopyToMask":-1,"filePath":"datafiles/data/themes/default/graphics/icon",}, + {"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"s_panel_preview.png","CopyToMask":-1,"filePath":"datafiles/data/themes/default/graphics/icon",}, {"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"s_paste.png","CopyToMask":-1,"filePath":"datafiles/data/themes/default/graphics/icon",}, {"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"s_pin.png","CopyToMask":-1,"filePath":"datafiles/data/themes/default/graphics/icon",}, {"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"s_play_all.png","CopyToMask":-1,"filePath":"datafiles/data/themes/default/graphics/icon",}, @@ -293,6 +299,7 @@ {"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"s_sequence_control_strip7.png","CopyToMask":-1,"filePath":"datafiles/data/themes/default/graphics/icon",}, {"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"s_slider.png","CopyToMask":-1,"filePath":"datafiles/data/themes/default/graphics/icon",}, {"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"s_sort_24.png","CopyToMask":-1,"filePath":"datafiles/data/themes/default/graphics/icon",}, + {"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"s_star.png","CopyToMask":-1,"filePath":"datafiles/data/themes/default/graphics/icon",}, {"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"s_steam_creator.png","CopyToMask":-1,"filePath":"datafiles/data/themes/default/graphics/icon",}, {"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"s_steam.png","CopyToMask":-1,"filePath":"datafiles/data/themes/default/graphics/icon",}, {"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"s_strandSim.png","CopyToMask":-1,"filePath":"datafiles/data/themes/default/graphics/icon",}, @@ -644,7 +651,7 @@ {"id":{"name":"node_polygonal_shape","path":"scripts/node_polygonal_shape/node_polygonal_shape.yy",},}, {"id":{"name":"fd_rectangle_get_collision_mask_sprite","path":"scripts/fd_rectangle_get_collision_mask_sprite/fd_rectangle_get_collision_mask_sprite.yy",},}, {"id":{"name":"node_flip","path":"scripts/node_flip/node_flip.yy",},}, - {"id":{"name":"shader_set_functions","path":"scripts/shader_set_functions/shader_set_functions.yy",},}, + {"id":{"name":"shader_functions","path":"scripts/shader_functions/shader_functions.yy",},}, {"id":{"name":"node_gradient_points","path":"scripts/node_gradient_points/node_gradient_points.yy",},}, {"id":{"name":"_f_code","path":"fonts/_f_code/_f_code.yy",},}, {"id":{"name":"sh_combine_rgb","path":"shaders/sh_combine_rgb/sh_combine_rgb.yy",},}, @@ -1041,6 +1048,7 @@ {"id":{"name":"s_node_equation","path":"sprites/s_node_equation/s_node_equation.yy",},}, {"id":{"name":"_draw_defines","path":"scripts/_draw_defines/_draw_defines.yy",},}, {"id":{"name":"sh_color_replace","path":"shaders/sh_color_replace/sh_color_replace.yy",},}, + {"id":{"name":"__surface","path":"scripts/__surface/__surface.yy",},}, {"id":{"name":"rotator","path":"scripts/rotator/rotator.yy",},}, {"id":{"name":"s_node_edge_detect","path":"sprites/s_node_edge_detect/s_node_edge_detect.yy",},}, {"id":{"name":"node_fluid_add_collider","path":"scripts/node_fluid_add_collider/node_fluid_add_collider.yy",},}, @@ -1443,6 +1451,7 @@ {"id":{"name":"buttonGradient","path":"scripts/buttonGradient/buttonGradient.yy",},}, {"id":{"name":"sh_draw_downsample","path":"shaders/sh_draw_downsample/sh_draw_downsample.yy",},}, {"id":{"name":"__view_get","path":"scripts/__view_get/__view_get.yy",},}, + {"id":{"name":"sh_sample","path":"shaders/sh_sample/sh_sample.yy",},}, {"id":{"name":"s_node_texture_map","path":"sprites/s_node_texture_map/s_node_texture_map.yy",},}, {"id":{"name":"fd_rectangle_create","path":"scripts/fd_rectangle_create/fd_rectangle_create.yy",},}, {"id":{"name":"s_node_level_selector","path":"sprites/s_node_level_selector/s_node_level_selector.yy",},}, diff --git a/datafiles/data/themes/default.zip b/datafiles/data/themes/default.zip index 82c9bd0eb..2c963278d 100644 Binary files a/datafiles/data/themes/default.zip and b/datafiles/data/themes/default.zip differ diff --git a/datafiles/data/themes/default/graphics/graphics.json b/datafiles/data/themes/default/graphics/graphics.json index 536dac069..f4d5506e0 100644 --- a/datafiles/data/themes/default/graphics/graphics.json +++ b/datafiles/data/themes/default/graphics/graphics.json @@ -878,6 +878,41 @@ "yorigin": 16, "slice": null }, + "star": { + "path": "./icon/s_star.png", + "subimages": 1, + "xorigin": 16, + "yorigin": 16, + "slice": null + }, + "panel_graph": { + "path": "./icon/s_panel_graph.png", + "subimages": 1, + "xorigin": 16, + "yorigin": 16, + "slice": null + }, + "panel_preview": { + "path": "./icon/s_panel_preview.png", + "subimages": 1, + "xorigin": 16, + "yorigin": 16, + "slice": null + }, + "panel_inspector": { + "path": "./icon/s_panel_inspector.png", + "subimages": 1, + "xorigin": 16, + "yorigin": 16, + "slice": null + }, + "panel_animation": { + "path": "./icon/s_panel_animation.png", + "subimages": 1, + "xorigin": 16, + "yorigin": 16, + "slice": null + }, "inspector_area": { "path": "./inspector/s_inspector_area_strip2.png", "subimages": 2, diff --git a/datafiles/data/themes/default/graphics/icon/graphics x2.ai b/datafiles/data/themes/default/graphics/icon/graphics x2.ai index 26173002f..a15b2e212 100644 --- a/datafiles/data/themes/default/graphics/icon/graphics x2.ai +++ b/datafiles/data/themes/default/graphics/icon/graphics x2.ai @@ -24,8 +24,8 @@ Adobe Illustrator 27.0 (Windows) 2022-11-26T09:16:08+07:00 - 2023-03-14T14:05:18+07:00 - 2023-03-14T14:05:18+07:00 + 2023-03-19T20:40:21+07:00 + 2023-03-19T20:40:21+07:00 @@ -39,7 +39,7 @@ default uuid:65E6390686CF11DBA6E2D887CEACB407 xmp.did:7647d1b0-ea83-ca49-b85e-bbc9513ca4bb - uuid:4ad51ef4-4b0c-43bf-9927-aa51a3b88258 + uuid:2c75ac60-16fc-4762-a1fd-3b92cae2ecf7 uuid:673f9e21-4d80-48ad-ba53-812ef9241a78 xmp.did:efa7ff44-b17d-d449-8cbc-4cf525bcc8d1 @@ -322,17 +322,17 @@ -endstream endobj 3 0 obj <> endobj 35 0 obj <> endobj 37 0 obj <> endobj 5 0 obj <>>>/Thumb 3530 0 R/TrimBox[0.0 0.0 16.0 16.0]/Type/Page/PieceInfo<>>> endobj 3527 0 obj <>stream +endstream endobj 3 0 obj <> endobj 35 0 obj <> endobj 37 0 obj <> endobj 5 0 obj <>>>/Thumb 3644 0 R/TrimBox[0.0 0.0 16.0 16.0]/Type/Page/PieceInfo<>>> endobj 3641 0 obj <>stream H10 ݧjqvR  Ƃ–* N[t-Z ZYŁzloZSP7E6H(6^\SftHfsF33Ü Y -endstream endobj 3528 0 obj <> endobj 3530 0 obj <>stream +endstream endobj 3642 0 obj <> endobj 3644 0 obj <>stream 8;Xp,rVCYe!!<3,C'.`~> -endstream endobj 3531 0 obj <> endobj 3533 0 obj <> endobj 3534 0 obj <>stream +endstream endobj 3645 0 obj <> endobj 3647 0 obj <> endobj 3648 0 obj <>stream %!PS-Adobe-3.0 %%Creator: Adobe Illustrator(R) 24.0 %%AI8_CreatorVersion: 27.3.1 %%For: (Makham) () %%Title: (graphics x2.ai) -%%CreationDate: 3/14/2023 2:05 PM +%%CreationDate: 3/19/2023 8:40 PM %%Canvassize: 16383 %%BoundingBox: -48 -241 604 0 %%HiResBoundingBox: -47.3922855564306 -241 603.17639088057 0 @@ -362,9 +362,9 @@ endstream endobj 3531 0 obj <>stream -%AI24_ZStandard_Data(/Xn.+Kd*/ }ig`[wr:8 ;;;^ H"J>qtQ^iH^Z5OLSeIJ&GI=gf4}dɽ120P(<0*8Y,4a;)gDc'+Qz5c," ^>,uc,w)@t=MuW/wg$Q^;4I(>-5q *M,gGVOze.mАgJA hZlGb6n_򳩓 2Lj8I 6$$jbhD~(C"@ 1@e`h0DC " $&"",— Tpwx!b, ! d 113RjuM>4 !,З]A 24R14Ԕ14 E8 N8aDFLD04LHD04@$#,""(#q24"@w'R"!.-)'Jf`5?EʛL"LmfF3UK!UQ5` >ԃP)qKC`p0p9H -⧓ !ƌdVTkXiKf̶]eMf fF~R-xxx@VVZ2489w|Cg#0]؉8i4ZM:","h"& & $ "    aCDAT'$$?C=CUF C3",Ѐu(H@<)\ LB)7ګz^u.3~~6f"{g% CksdF_39W3Mab"FbN&QGdE$C$"pEq䑢'Vm7nzTǍ :̨jfW>an|yoYv&& "$&P*14`"Bb@er((Z --`a&a6a&mv`hp%< |wxy?8"a18tbf>!!R"'r>>;8ԡ{`h?<<@ "(#1QJ\A"BbB5 DCACC DCÄÄCÃC$R''% h4246"H_A  ,14ʡfB"3uB$P%j\'l" -Q .{ph2404!l@ V`hpgf^^:8qL̚8# ;2I؃9UD=CTDn Ѐ`+z`h 4@A^*@EE(TP\TT +endstream endobj 3649 0 obj <>stream +%AI24_ZStandard_Data(/X0*֌ djI'bVk_ɬrs2Z7E4A 24L:Ex'|z`飼AӦ3;j *zʒr%M5{%N͔iȌ{9 h`qHx & &4,2:V +Gz)eMLQo6f#B*V=%tdjs7lgrG2z-TK#P *IFZtD8l,cjd9le=]IL5o9g[D%Umk.ÖX˟tjԒ7(w(Kib7zQ)&#l\ +$o,!qqu4E-RZ'1+=KָLhU5>Y,4a;)gDc'+Qz5c," ^>,uǾYf"K)RfiH{^Hܑz&w4hP|d_u#ZjURY%[YΆᏬ\ ڠ!WϔRGZѴ2F5l:TlgS'Ad~.xeAѸh`1ofXbXrLȓ%i ++WòG‘Iٰ+"*4.6f,E2 y#J#{8H'ʒLֻǝIO{Խ$qJ6YikBÉ)3Γ7sDʘNH$1z + PAE ,0b! C d*[`878Bı髇 *EC5HD@8~JD,0UF`DC]I}6˵I!Yje /0$.0 p۪ KURV%0!Yp琎0\s(Z`h> -0|!lE 7`PT0A&H`!b\LPabE&TL@ *Jp ``TL  ,&Ă .,(&&X`X0PBP *PT` `H 60A*\XL<`X`x0.` +x; ( ,0l`HpP$Hp A…Tp`¢C -`@A -… (@D -<@f.*.\ ašOz;)9#XTH) , -(@TX\*D +.@PqAØ:qkG& -r!{%1R4\O[6ɭSM'TX\B.*4 .``>`EŅ -.,0xxP0a $PP1 TP. *"Px *$@@ 8э ,\@ - L`ƌ*8CƻYr}#HqYV},3ޫLRw2 -ko e(ѝjeC/!gմ*rwK -ubk3uoYtMSQN߭dr(H4y^v͎.mwCj/ٜݛ<ۭ3bHZTCNj|BZZdL+eFWLX3nkM?o)8WbH1aQ<1ȧRtT*#c(붚Qa}E͜d鞫R&t]$:QJyɢ,,#ٔV&י>/3XhɍWwJEXSH$ĩc҈!Upw^jemZEF={,ʹ_K4!&VD,#TFIX"}:e)gvĖѠwXjwG~'Lc$͑ΞU$TDmmXJ -]))J+#Dk%GTՊ+'o"<4-TԎɐ6;5K^2'84Yx)lZ}>%I4HvL)MړҤuT9BiLRSkYfti.̛ҮuH>:/w+b(X#"ɕ(m"3UÚg]O)uRx%U>̟;id/umɚU$LsEaި&7Q6~+6\S|W[׫D^"]yUh<4dv=Nge:/|DtgitMrr!RzϻlVZJh9<%#~Vm>e$@TGOYv˚]Effwv9Fx7u9/9هGv[/GD1NSc/Ι庴UbW_~I^MF珳6u=XN~tV$^uԅhvd+鎞k39*V촻͕{)"G;H ӦkRХψ'}rl#Vffi' R}/-x>WnݝݥIdan"lzR M]bw7>"֥[׳haaZO/&Jt]fwNҐ]-.n)5K<<*;T6>l_+ݏZi9NOULՉ6 pR~חӨϺ{>+uRGFG>N\9aK4WB$%S=bdH3EExDdXh2Jve MZfstI(>w$JA JI882uջa_,qY*qMI9vהy&XdtWӼ[QGծ9ZymtO"Yt20!iuZ49TuyU|:y(T2[gTn5KKmf^_v}ۓ$fs/ų7įVoD< Ovb"|QybDˊ~!MrCjFHOnpӞx#5mIJdOE{&ՇO8#sݜ;R+ue +&PL ! \P@APA +6@$  HCB p \XLhhhhhpA&BPq! +&6 AŅ60 .$8X`BEdࠢBP *4؀Tp@a (lA \XLpp!aD TL" *H0Aa;*.,.,2 (@y]`0񁋊Hw(0a +vPp0(XPPaa +*"TA +F0a" +*8BB@aE +"l +!bCTDuDHATD`.$L6 +*4pp ` "|„ + 0` ,"D "ALuHALL}TD‚BE k lPH a.,0P" $<@ +@@f .**T aM,&(T +p$P*@TX`*@0+*L\LaJuaq؎qcQQT:' }qA$XB < *`@`EE .,0px0`d "HPA +Lw"D + TD@&*X\\`BE (0cV +BB&(AEv8r,,YaɊ +4Ƞ6TQ1DP 40!(`E,Ja_SfԂQ,y5Ua &lӃsυ)e ;Mslcq#ʌbp11AB``.9& <8L$3Yˢ9qLW,`m+q3e2(`eoʴ,B`Bi&J4Ɉf{tON,q/2Ei׮hd(]QMX-:^pTl svؒ ml(&"|,,0@,1"a؊ @ 1A;4˳A*TT LPb@C L@DB PQa" $*"XH<0 T@ +@b*HB #0L !B +L@`\La\@a(P0a.*2؀Bz2uXD/A +XQ N  Hpʺ *R`AD .& 01vA!TT`  +!`b *"T@,0 &B0 X0. A +*%H &T`A2 +FF(` &&TA  *LTLx1R PAt&,ABO*G.ST5P\$CG)z--J\&ie].ki!4Lr~ϯmjHE3},ܠ,7D;1Ey]cwL{;A$"o(Zd֔R]_7U2zWg6 <4HյEs*Ŋ+fO[̄(~V32|2FK?*&GqhTSǜC ZxJ8F#q3}w#`G۳XfB3*W2+4dt+Q;uis1*݇^BΪi+U8d_g$6隦ο[U QZ)h(Q{)sЍU]^9%G7 y[gdEtZ4XV(.据屢gݞ,:/D3;[/RqĐ" j橍E>` Va F˔eFYդ2 + +m\'L\=?2Q%щjvUZTEKeaΦ2y!BNn4GU*šB*̤&!NF 3R+ˌn*2*vtWM(~ /Ҽl?+KX)SyR%amfc\Yq[Fj߭c"ީI]2͓4Gr:{VP7a))wYצ4g3+9o毴Ć^ ufQmW+S(cШvPQ;&C;,y8fАogqԒy\;}a7c輜;qLVi #4鋆Hu>Y)?h)Y`K?PYN.Sf <)f-kBDv弨|8fm0;QVNY;gҷV]}uIB'y5?Tl`h89Y[xQٱz;zܫX6W]ڧr= w3LIC>#ɩin?X:,#6H̦j,\9vwv&=FMً辳IK%H7eOtG<'$D{Ү5HQڧ'^Ny^=)7H3s#C585֥ COiri6BI>zOߒBd*vIM7TK8Y0σE:ޙ|/)̜_Okr%Qy7r -Q'|{eA[ڕO9&˔-,u9[yt߱uU+GJ-$y|iP0g2*[ɝRбHIs,LDJ{-QzBi[JLfmqH%EŚ,Ϩ'S3jTȾ-R-Xv1+Q^6#d%O .ݓĴ^dXURܑ?BY"5E|;w6wtW&KlO o'I JK"|MQ^w'LBl?rK9sNݳ—OKeM;)QC%}Tn=8=PUrMi Ɔ#94(k,nǡ~v\=;\ZJ><;l&|׬.4K,xשrx}T’_&M9xdS;fQU9ŰxyD¡ue]YC$ 6C9QUaz{K6فCs[aJGb%N\5>TvMךYdݓg,({v/T7L 0fیa#OX#Ų@S"X%5xxbJ)-@|=.y5p=%qqd(ObMɵ -FMr hv+kKs nK#;yS|# dd51b4DKZ Ni*seUՒP( },er"GMn%>.mvstC{ڍt9Z63J0W%(OQd8.If1kFr2"W˪NtCKcfǪ|vb,VD>_mbZGjuj:y k|3:SYcES#/c2f2)JX%ejG)"02v2㩴F>ﶕQHYg/A<[Ey mVA4&Z4h,3dD[k3Vk+|Ipޭ뷔8{>] QjZ_$|H*_J2@ʳekN Btmpd#˺G2xA93F-6 g븬+yf7;ikA]82<8Ss5I~SĘvf'd֩!D;ZdcɣXyvGD䅒6I"}nN$Ski(m!ڬ,cHdoL+J$ {ș"g6^"S_FeXVg/e?]6ڬg΄3amvf7dtv& I:r{B*SZG1Ż=ʾx_{hX&mpl+ -ϦdErUJ]R&"aPjŲ*똋BUݓr՟Y40iNTPJBd]BC|Y"?{U^fī1͇ -sgT+KLC2&tW"M^>ηHNaos4ʺ QV -;h5=w+4|NDqO߅e,*ŦzOz(kaVGsȇ'!+-cz%ʬZkYem'i K:z~._Eu,_wR]15d?(ǧilNvt3t2-uY - d)3ѵZ686N^eEa/IS ~X9Bijٹij3^$ɨF5 nS(ENb-x/x9!zwbwB3Ir99Yu`L - oxdz'ҝODzHYz!45u3]VWV젉pߩBl+]3x٨Mۧt%9zNc_NbՉrazծvf¾e]Ǒ?tǗh5_V;*;J{c2ײϡ;&{|m6FΘSBo7ʙ)tdi:L::tyĪj`shRn: ٠\ɒZfnݤjMkt%T婏vѰ=r4fhuf^/V^UKkz2kr*-V%CEUtFY9meY4t:KۡIiƃrA1C#މxY4֝X#懝r31V6Yem.iVz& ODw*eݧ/yon̡qPYrR9^uc!s ЍeuMC9D1DDl$DwmX!6UqSK!QO_Ynh(Y£yjGԍl4k&Iꆝ.nhL/ḪId$}#8wW:Ѯ\]2ghWWRs)Q{>)g9h3O28^&礲 -3>Qfsf65%l_Dg85Qir ֙wjdȻBf/;wEf72}`*jm{ʒ̐U4uKF'qvewe.Y!ɗ&cMeYJ9뼪#~2]sG%H9x׫)4jSIf>l O46;ZG!UC~3~f>KxL(3v&EWɴtLjOL<)bJN$~p&}WXB=itI1,'.̄W:5 nMK}c+͘%ugdD>z콾n圷VHitiU>ևe?]QL*n,IS~\êE}L(XgMKnE";he$$atIWhkz{q 3}dƌqmriu^,H3b"P  -PPp@@`AH@a*LUL:T%3j|?|5;*U/Ykhrϡhh$LBJ,$*)GLgrdzBec,QPfR:e.S9RI9Q ɍȜ2Ys$c2eDF%xyѵ24d#C8u\FRfAq^Ƚ%#Y\JzRJ9%UNSN525UEVIMȬnbclO5خm3sĶv MҚ&dS&fdRM5h_seLB9qѕUJ̤6v;32) ݫs͝J%=Smg:O5.</Hs\ЏMPl89N ;,v2YGS9$UΩ ͊ IrI\^o])G|{93r,4WI2r\);NA[a#*eRٝ6Fk#9aINF ~R(rT#@|olv\yeN%e6H9=nƜ&ﲎ}iy4MO2S;J{ڌ4+(2IH|!\h::-DGs&%ҹn$VTi×lˢSu_L<̬l'Y4<)- n,dG<$Ou)W4ͰzurdmX6=ռrǛBf~%'R͸>DTӏTeR)CwUT5d\!y+\qsڢre4c|?j|/}Bos;E>CM]E"+Cig?GT7^&fJseiw؈0'k*V74~5Ңar_߱\*`$T%㢩O]90OG:fZqoRW"zy3EQ&{NmcUd9f1ɹQy̱{󪨇V43锉|#7hW -tNCiVCU*'zs9\L ,r)gJ$N笕̙ߕnYQpx~>Ix::.[hl9w6*wvhw2VOh7dϔ srh9ʬ٘2!L.(X\p&l@AP¢ -8ۂ ->@)gnڱcqN%A ΙcBDrʊ|"_iǥh if(B -s`@<ɌxŞ@F@ʼnc`p(ӗOROW~Țnȏ.m -{ZxWpMń -1Wx!?_y|ܚ3AdQ1rM`/TX)y΀{ -y,R߱=iWKPϑx"'Pc+y6b{K "a+y<viZ'ܱ2whT'FXj?,-q~Ypڎa-hHrD9z& y6.@y!&5%TJ J%XGYX!2,v8̄cX)mXLJE<.OL+SY<>Dkc -_CXoO{?(j `\z!ħmW>*6q`)U-(?6DNq94'Uc ]'-c@f!=N~qAAqyAV[Y՚_ ڨ8pu!AݳL93,w|k(A.KP5Akx5΁‰#Cin>3 ёXı HCIAS1y#G[E7 c.2& )JgOJ!s?TX2NK! $Bm*d*Y6AIYcdskū0tJvymko|WX\"'X.cBl"Ծ}2܅.a,3dVp"!F=2r,ErOȆP!t@%wo2`"kIC -hȟ.fi: -Ճ!8ϐ28&0b@z-_ PalbD.}Z&̈bKDJdڊ6˥R"%ޗRTm`$,QO4"l3c  sE+|0,!GLwz(gxE - [#ZӐ0Y7WSh4k&I;>ldz6JEIWKexL8fk6'QJ7Y6ʊ= H k?vdM:Z0Rw0>J8RmqA30ˏp3)k$Z2 czyXH՝og$ȖHg"WXDKR\2V=[a{ B Lym$߅U!䳋fϬyb}-B6MO#._ThͭШD;XFND0Ҽ6pEGU?0A4:{䶦цOz=,CHSFx+-^} gWzJ林+Q>(cΥΗi $usZ8yOW:]t$8FuO'FVV\8eLUjZX,di斬e?^.+ -}P$HqST][V+_6Z¡-)s5o+sr64eFZj0I+QIv␆8KVeLԭDԘOē`+JP]FISvF`8xH&G.<uҨ_}Yh_)QK E!fb&v#o\#3PQ T-5a4}ݲ@c:Ȟ8ę -$~c/tR#L>Bߟ7'Nu}QñP =sU{ϼ]ai>X06 -VvCZPeG̏N jd 2D?R1 diԄ -֨&덂F4GCD=b7m5i5#FQS`ii_sIiz6U,Ѭ|jsT~@NUXkajZ-94Z;L̯l^& kbB~[\EDkRDM7,oo7๎h 5`('^3>kٯcLVIt ^$'b,W]{H19's_ْ+7XC M ->B(MЮB9EH';Otr_ziKV[#H*~@l[t rmoC^1izvA^n'HEo8ɥ;ra+, Z w_xqq%Mܘ{/vV9hbr' K"anᤙvE[w)o#Ԅ M'v[]_DoV`w}myR# MH!Y 1%F:w'6joDD2ɍ\❆<.`,=*P-/>ȿaJqW>3 fVTv 6Sl -xhx$i+` -xiEhSn&[e%\Ī ~Iav -šSEW:%<Ѥx  Z[CJ]X :~n7*9:8p֧\VW"08nlv9pN_t9դ~1z7bmR0{ܠ - }\Qr iILe=Lw.!KN/?n[9rI1VY#A]} 4 dkc/g#ߒ%s -LrZ,t1Q!͉e"pE&:#K)|()nRr3yPKP|;W)>~6@#Ja -"IE.uDա~{8 -X=K:j՛v1t(<"B;F:ң@>G=62VR#ܬ]wƿe-[͘Ȥ9^6q5d}Mv3{o W~Gw9[8[|LQ~6S~{EL671݇ x(wqb,[ -wChn. oսG}s )Ԫ{wi,N/oG+ĀchxdQF?gŀ2ZnL<[ iC$'db@*Cap~^$Kdw 'Qo _?҅ O)4B 3 k;E[ "Iu?rVOFQL^(u'1o+@aG3wiYzɤ&i-Uė7[H!C| .3qNZ3⟒OX\]g2qpL\\5L\$xc#7;p -p}Gb4!X -:mZj&DM*Ys &nh1nWTg DI6Ͽ,&&ߧT -R&)%"`iWmVuRa2$~Of X[W+>U/)r9I&(񎘹vSiKVhrXӻ /}[@%F{ڲ}_](K 9Oń5#>Ƶbćޮ~#aaj5aNK$Bg.'oSq%i98]LURgML - qs]M8){;BuA0H6U5v\zh(7x|N#r)4rHFb&,I7&YKV}eV9}P,؁r"Wv=ty˓P8@3oG0ͷBU#^7n5>D)眭s๵:=d!smH6YLѾ} -SC F+z;it?[^3ҳ%I'0 @;=1:+kb+;dr:UӇJviQGG;)S5f/:jpuɨd}B,GZ<`[!r}j_~kzxn}O-5l쉬D%@˾O2hf vmۙp:-nŖiN ~a[bE>@#{}Qw}r6%%M~7TcIp|5y-aHg|Ƿ(VZE~<>~ 3X~٢Mur*i#C_Q&0})pC_'1Bf}.튨Sc+C={. >~ ܼ` ~ÿG -O2TK9oLs -AWAn&86ѫ35`q'[b-HN꾃-ptq}k=@59qk2H Bvzك' ?7Я<L/{'%K __[3BV6L\WyqU6=6L݆~OL5\ˁ!w*&rw࿬Gx%o JZnGЧwN-7k?u7lL>"Gn%y[:juL]nF(ocC4?E/ -Xat2_-qSCVE i\oG L&GYPW ->QƐ.%h/R#1b < wPD/Ψ^g%0!&P@~? tsM2qPLF&!C,.@W( H(6: )=3PHiYn 7h ~&prSߐy,SM<1Jik0|Uϔ  -qNԘU>?9$ )<:arc{ 㫵镺liحefX#q÷Ub48%{Aؽ4}#6'cuQ讹ǸNTNZ-`戙O$]o?r#mϻ3= ` b* ؽ_,&sdm,FUTE!IS | -?I֮)\"rZv" hhץ3zdRļ\XFV>:_CBem!>SՔCQF [E$m+7cxyǨ9ǚBn>0lU@SuSR2a>yL6{Y.eqnLj]솜d%d8m -% *5`tF%}BIN`^/8 |1]/|?#8ć5?ߦ˽_řIuSYlUEF[Q7@!j5)P@&1} ૦UӮI~OE@jNZH&D'tWϜRT?/7D]Ia+̀G'E^$XDqi?7Fbث̏ZY@YB'%'1fa6VkMgtBuVM5C&5(0Zr) _f mW66Џ<VҸ& B k(V[,G")Dul!VW9Xr6aC~K:uIsnd x>1 qaPu^$Yme&SY;| jlxO9pA*B-6 "~Fe, k}5S؍-gH@XcqVbMp]5L[v9'Ψ#}OI Sa:ѯA -uTpO@7NO4a<˛KO guq١X΀JxN@ -S$Ξx˫9p] -^9[DZ~Nxo@`t,~pɀF`iW⦉gȞ\H1߸SZ֐W|i O#ecT]e2g6|1 [ JfMQ)>YQ>owL$efV4n}{$a^3 -li3}ĶG5O%ʪ5bPp@8YO `U *plS<f7/ ?$N"hg|K|TLK$#bFυS`9YUx\6rWMʥp3_א#>~Dyz%9? ^=[3Z=m~G3kIv |YUjOH ,Q6QfEUlHZS,$vX~r<$kslW^&܏,\PͭzNفݮa[D.R!@g!Lu3,]RםlTNu0A@PJ_oG f.DdgUG S#U 8lEΛEU%j -VI5 U\ta1J\;ȥRt_`BpmG_bR$Y3R Hi `خpL4/qyZ0׈|!0S-H& wo`K+(C ,? _N j)F\9SP_,:3۽%ЦjF ~Dpiɬ_a)Cn:ʐ=n)q .D D( klHAv޻J_ʴҢ:$\/>慐zR]CC2ET9qh/(8MxLrnRL@]ǫv3wSVb ^G/-"6dHFVP3v0dzHyN&3cV!\$OUxO1qr$Qy8nP7YX$\0ux~%'A% *,5+!Ow;} rQJEV0RZ늕~ΦkA>ZV W[J?ַ|W|ѡ߄w\3xJ_*^>bm8i8 1F#}P:'qȼHpLx~MȆ J1plu7\*碡Ѹ#rBŨN|CN)^O'CNЌcw6k?2{bgق1{;6 -ם6?r%@yJR HJP(*{[!}R5D Qg5[A?M w ݞDtooFzg2$vD ]KĔ.fV<[cMngh)e ȧ"jZPWvu]vd\8ֽ?\3_"=섻3Kˣ'X _ƼP 4tMVt:8lypp(K p-6It*G-&+vN=KL+`hEx%s(\'sV$bD< M&²ch 8E\Fɔ~y5ShE5:بi{ǘ=wf`e:vaXΘ8ǡ#Pg+^XPqimG4\3q#҆zEްi*Md:(,[mM|onA\ii5՝Xҙ.vmCsiz @>tZx쥛FIɜ䴷>hA^xtWc2 FÊHjk& -nE>KFC;"ªp>@an9e@y4^ LƼK8\p?hYGW4%99SSn3,jiЉTeyzYl`|[ؔm(s=K3'럐BEW5~>ܡ>H 4c>}uVS^=)EBtLŀ3Љ4ur$t'-Hߋ\k8Gf@KMpձ 't2.g }@;k͂gYoÎ|lHaCbW[مk-CI3/o/,J1&#}`*!8lɣgO3]vf&,]W)P]]g"#%TuqzuIxbwT"Ɩ@$MN u&+x!35RؾDXtxŹ36V ,Z ,M(d,TNcʳ< Sgy.Wܼ"jϷZ")h{?LazYE;J~*o;|uɷ_@-9EDꀱZ=9@_IP(mlHT]]U.G:nUȊ"Tq,_{d;__.DY;'ͨ6Dtջ#4(,8MN#nAGy\ -]"2eDKS``DtDN!դZ+ސq ,Y7Xh4s9d2Dp;՝Pg\qĝ#jRbO}3{r[*KryoFRh]*7fW ` ۉ lx#R3O suWi=@c;\d)5S3!WS7vIĬ^q].M[PhG#H'5h]5vXpoɵIf{|(ZzY:<(}a.;{_HRvRBf袑dYRdE3`"$9?TBM:*֗j0\/~L!YfB% -6cR^m,tx +&K-{>]N=Z8#d>.K"v='N[XX:= 2>_1#.+CEun@)uRXQ)V[??AOռ!~T} -Ev )KT $D QwQCn\˜P1 UQ,D-:V'NnN%PrQ;uz#&p -9 J?B r -Av}yaT&88NkW82sh3ggXMCqi\TksIk{gdp,$쒓P -εdXK9-uA^@-OT ֗\MƉ3h=NcђVG2gdz,gk2{faʻz nѦ5q(9c7 }?˸>_nݲ9[Ѐ&XS+?v"fK<9kNC|Q - Uc6r_<9j5&S@z^A,[dQ᠟Ό(h]pXY^" u4>l΅03ld:,Ex/4& {3*63*t *2ew^Fq:Qp&isST<rlxaYƫ.W:̥ց3PkWlʇla>\C -+#f߄^K-퍌Reńaώv~a@G8,lrx2߂(//ء'tKݨhЅ4{JJ H0}l8R$zf:@VTyCnk}gCvOh&Co,6֫RB"6Nw ]eo#|O0 |A2DM|c 8wmI)SvCg&}wD^a/(K,1kB]'pg4m;Έ;WV ƌy7KdMqb,vF= ZM7(7?Ak;[Ҧ^&W'WpZ(v"9C/ku1+pQ xI|p(~g_p4 L"M!P8ue `o+ƼiȯFlM:jLџ,?%{,Q+Rb]S;QSвp+Yk׷+jLA!#P^Th4km"U ad*dDpv}xܨY. ZH{;)5TE0T 'F ~`pt`{PT -C9'Xqu>\B~8΍E|}~ewآeR:[vf7)ЫAieC,*-Vq9$]%ѦNmP6h1g^W|w[y2u c ~!Hz]>(@}g] HLfCdzl⑄[t -VM0ɝ,6_%q@!PDx0XG6OKЅDuZ%^k?Ta`1 v Ojgx,5jpORC",*DW?oQlMs$F:!Ӛ[ؽ$d\6XR4tvEO?[#UH.pq+P7i%;h'EC>y5!~͸*?"e/Cɪ8;Ar9q)sZRFɮ?RS琗G9Y -tv-ȂkճJIĔ;q«` Ć2wxp(Њ ɍ\k#S*eX+8!3{hy -U$4XT|-î-HIxY݃Ѿ+1%b.`d*djW{N6OYrw!m8,IxjL(e%ej^qCTpܸ n|p-oOR[84b Vۜ.|bo`Ьw1;d FpA+[}*E - . 4p%\ *޳?HrXm!<`$u#'f! lH҃ $GM22iwf#YG%jAP8P"YԊ/LAҵ;Pk_g!4&'1&pz۹LQBo)/Oc/ϣx-t+﹖T|("0BFL\Jab9՟#YJݥȰoral1r@"R( a}"]tHI ,ۘU Efk ndE^̈́K"5}$&RqGd~'QHx*QG.'|Re81=4:  ?"Y *#]>-2x2b跅.1;BZ?ew;E{7kd=(O Ԓagy{O )Cj3*qDfHۺ'a -S7UF5)Jٟ( 7P@!Kǎپ331lu<$aBT:^ [ lc1@sQ/` I`,0 5gvݔE|cd - ޞ_]pWhps u9#ܟ#% -jKT/%F€ԑrnudS=*i{ˋRQ^ =yJTǮDe+^2g%!` -fJWTyEr{+b* -P5rf[i -AkbY: -G<}bjFHuj`\D,2Ɋ$263GwR 1#sb H+ BdL8VN)X[v ! o"g1W`ߊHkwrr}̕[Mb8@ϝ-o0?<ՊfYe0^Tͅ퉁gyM.57XǰCdz$c(3j*Sm ,n24*4yK -ꙿm33џSz(s!4uM\"I\DXNwߚFyDQFzgàC߻X\48B =PL+4x2.Ucn +mDQz3GN -P9n=N4r;q `92@\'אr0;AbNc5ǴΉsFlOtCQi!k7%H^G(Q8;7kGtiH‚;Hw_Ď\UAXo2<`o% "^+em -@@Um:N E\fL'pq)/a^= PK [{C"`T`#\٧剏"f!^r.JE:@IPMc/*za[z<2țsU~QW"Qĉv`nao]އ˴Jv |j.VX|i)xh{`"ՙFčVȪs#V*k @):&Ѷd.gw.!\# xsWFFw5|I{RyN&}V>`~1t{eDngƩ,>d+^of kc?qYJ-! -"BZ6맇 nQ|BO5lOc=EcEYUH kv]:7K8Xݍn]B5QCBכ_Gqd#(6S_h0__]%3RǦ9o -x6V1qO5F]X.J0t}8=PU<"@ 8M\2Ṅ:vb!6jY` ),BS QSL?.JБ~X SJ sOV[u]t t '09Z]9Nf!`H"zd9nю dp( -i[es0 Vu&W0E2+bBn&ڐXix˻ ->ӫWZ1 -~Pɗ*GmPSГ,$wd+'> y8N$k Ae*O<(k\WIªayϩP{2%jB.tj5c)MK<P'R"G H,{;éM:UMELH4H] rZo!z>{L /oHq>yEtv&tuU4j]沍T#gjQx9͇@nG2fFhXiJ/-J|T$rtH-j)y\)2|xjFm<(_c -0~RhP@RKwvI'2BJ55XKU@Q]WIYKbM(W<~GZ9Dh -$JCCO"N7ALa6/IYU%w1IHH z(Hǂ갇m&G`萤>(Sʂ H546?DGf葼;@aT8 G6c:>C,jG?xxFFD#C@#} Ⳋyj!ۉ<H 9(IߣxuZcxx:cafu-?zQUu'+j!l9#zA;OdJ1AS&~nіޣsge9ex!HYEě: ^.TfFB%jKӹ]]Ib&ħ$ϵJBl."6%j"Kv_ؙG]h/Pa -XQp^*_Fp -'Z{3H&* Gv 9&B.<"P A0 >&ZnS(.c9FP R'$ d9['ϒZ9T8d#3Sd*Q3.r_*.8zn0x!kP q^yԖdɒfʴ 3BXw7ěi^9 -50W)2RQK.HS.Dݖ *ziփ2)`r5ȐCWrlUq -_]mp8NTkE i&i5?Q C娉̼44RTwk^B"("MM?&5nD o3<r>- 6ȅ<إ5P\ "]dTSEr$`$C 1dwDr׍8J_br"eF .)t@C0re@_|4`(9nb UmlKohkGL -)=SKFqZHydd]OYC*zzqwTŞ@Mx7NecZF$H`RӆWޅGԢcݺ!:.-Xc УJ1acS90);S~1(lzK RoHצq[w.!<`/ܦڰvyN%e#ve:A+!W( PŎLZ%qCi( (/' -B?WB<#"ÞCix]['CQNF)T[w+YnDaHQ'Y+ϟu3d1^PMH\.3"/52h]}Qg4UA&z-8&`etvQqı4p|xv GܦM];Bx%Fp )v@:P:*ZzJ+P u9IVBAߠXU*kV%pxTG65x -Wb]>|5Y,E($F^OdBæā!vk #]г}%Z߬f ?ZwkUz\#Q\BFjҐ֎)O`AC,>p]I@)2J_o<:TH~/ReP+MzWО2]'D(s:R%*+fVTXGϽ nX]j:5 2O6vp+C:s *{vhP7"aۅ!l"ukShȜ/{J1lqe;8 ;, lL+L]+T!"gɢ0[zr*֔[Ij)|E`:#Țz(B#{ЮeCP#nj  -+g]\$] -?+`aF0.+\I۝On$+xY]:Ɇz֐rW5Tr%IRPkR鰧7WQ)b5S'CPNq©Id 3utIdR?E#Fb:\<0)ܦiP(8zQ>"Чb9P^یW7ӏQ -(NR"?Z%=|"zx.Gwz޽:n(PhNPɶAJl*L}+FL -JW 3${oI,NH=⤔(g% Š6ѧ†S]BM1?´ >AFN|>@Ko=/ﶎA1T8PCB gU$VgPlIit5 HXQA" |(J#ߞ8n5vsb:\xw&B{zcFHҘ0DFn-/4ح=Ep؎# Dz5[ǑG<[#H؍5VcVv@K˽23|(ɈD>a# 6]pBӀz*<]`%BxdLs8<}D6 ȀgQY`tG0D +wcZZ?"N8KcF#|Jc;JJ Y0F%qĄ5X20G%@qAn_|84B/őh4NεQ4:3+?cZ+3zCnZ3`IXn0;iƱQb?|?6Պ1{o^! -h\idv>2D -4I9ah,acm#3dѾR?hxv1+Ԭl&\m/Uᗪ[GpBhz.$0|xbiҘV_Ed.vQ秕ؠʗSjS%{щ1JAnJ5*VزO0G %q֗~p-H6yCBE|bKu<^vƬ3e0Aj kq{h8N#wY - V4D1Z?)sd) M<K>[ Hx֓:)Jt*Z -5h!MGCf5hI}g 6}A"m`@dȥsm8n -(` 4o6t*6(rMemI[\a^d8QNdAoKbcU -]54D -v=ee3u=Bl|{uDÜU4؟ fӫ` x׊U( -J^Lnq40h`@3)/h'PoxuC'ĵ^tΟD03*=K.%u'NF$ONKҧO92d6<3lbtL"87JE;}FI6v6K|>Хy"=Ћ/@+d@u[i7S jqfh<8"D{)dL|z*N -9nI ФdZJR+]H1ѻ{lPf6S)dMcVَgqu'5@^JiLck@w0>w" lNHosTНɝ3ofhx֥Bv(C8v.DӖWsD}vD_.[?VWX LS9npW;8J;㦸R̃h@K<(G@>5ʝd!!PŢzU]WjwJ7ZB#΍VE)U93By%Zr)\FՅq2 {˜얥kiq,Ş(,FhJOCzDZ3 b,Fz*Y8"ߦSgZڠ4Lv.LE:z9v. Liд/PRh83YR&:8T#QOzEg&gxHs1Wʪ -U-GWخ*;׮`ە}PkާNWL҈y2Hrx$Z|^fn9j 8@{ -x7QL3zJse|+F&{̲cwGXJBIC0:W~wP=uz%Y< "n_"pvz/bβISz"\ܫ]7C fiwhl7uXqaΖ`'y/|6lw"b*^ W"Ugg> hGZݬ/֩]@*Ϊ@9+)~SX,O+Q,RTzӪO΋o^-yʫ<9>=/, _2սj.i|u3X0y -ݒ0V,,Kh'^ /UoG"-pKr[ P) g7F+'$ٓG@j=)0VWD`G~2)ЉH{YM -P h\?Ad-OYRq֣Ɲgѯ0G%7={i0>-<>{5dzJnQ% N@_=|@^{@/E]0sb5la sa˞ -y.G[ C 4 cY'<5'{&ۨDR8oRM&D8PoQ}PNMӢz"iS Fƭ1'|q:_kg3ErxO|w'*jg3s שy;=c&fsЯKz`ވWɀ6i"RD9e@A:Jm„o{td|ㅙσ(y]8 -}B@L9=ȪK_-[e0 aEZ8Uȯ>3Cꈓ"?ǐ !x3 O J vOT7ePߋ|zOdػZ=RZ - ,. -©~ߢ2I彦{zEw|XARSn2G\[tm-Lvm;o.HK,ugHgJK1ؕL(Lh~ Q&>_C1*:JѾGIJ(0j|-BaAmoer(?Pkf7X&Yg ݭn^f}{O #8w qvBuWV@tk0ZG -kOPBK&:*k:H؄ªhr ۥu4)Fl@J6p[6HU ">Q}%O3`V@]nGlQ ]WfRaXr$CV%ZFa# 8 -b}hv4 4@+N:WWf,59tXh)%4o0I|fN0w@;Q wq7ǐkdAw9D D|9f4A⥮s~w.l/W$W+Ӝ>|^3#vLqC>\ݔxC,O3h͕/Cn9ZRkPgLЂ~E/>-4鴬}[OГp -za&9U6 `TF)u|{pDz`PgӵadQ]+7wN6_~jE)rȉ/x?DR{|Dxn!'2Z+op~VNa8F˹;.HEU`zzkϯd \߸;F~1*D;fTHC^qMۣZ64fWUS~xZ/Nf -RQ9>Gyԅ)j)MͬII]2.?Ǵ'_>o! Sh5x\s_sK m8H -#E$^\bđVnS$0Eo{ ;mo|P_Ijz (-($ّ !jSXSf.^Wa <|[/rHkC<^'J-R`qP߉$y*qe#RXZN,/FQ]W`CUp3(x<\D3LtaaK{i - -߰R/M Kr)U~0BF{ۮ׿>p= 4_+KX)Qp:ATsQmd2,L9BP Qi<1-(PG/nvwyyWEyz/r5>Wy'21)f_z@[$kuzUpRǜҐ -pxx; !;.,Q#.>bQ`݅!*trujߠ,,E}kV- _Ei_3z$5.dexݒiЋ\1Lג.2n ߱'I>xRtMF!27n5'8GX/5f Hյmw1z!x>Hf5-V g_A^? ?CnT]1l$ ibP\$CW6*bi_F\S9#U/׊Q[$_Qc^]hpԶ&+~j|Ƅ(/i`k4\4WML^C' cUGƣ-HnIO JMO:։M6)8-@""PcOuj˟p}^e4S}(b_Y 8.8d=BȁI[i @W7&E=tlkr[nwww5IIijٶbew椽(SUUU hIT<_)cMY+hOJ@~;j}v1ef7ֶJ{XfvyckgLmo9ygzok3uLoLүӧj]oZK魕{sv}+gݺުgֽic:qNO?ڭ9'ttnj3i-5UmƗ5TyM3[:^=鶗]W׋wӻҷ47cqg{1͓Z8[7b_gowJ7eNo\ڧگ҉/oo7cK[iߘN<4_\?Ɣ/51Sk￾j|Κ~z̛֬߾~RK[L?:3}J{ύ?[[-Zj^wҺxg_ۿ1_Tϼ-Jw޿櫫o_k{ii8ө%?V߯KqͻV뿝_y^k^[+7}k?ZV{/{SܗJKZy][}W:Z:+3tRu{|wϻw]ֹj:>sSZSΪi5όe_/t[{7ҪWJxS3S|̙^7J{ޛ18xfJ/ZMTW3tλZ]5S}Z{mw[׫)wS_uXS|'vk)l%JL+ڝV|bl{ol֙N]i1R5nL[<ߊ溷Vc:ӹmśέ3:uډTϻz^i^M[M}]'V44W/1͕LR=<7l'{үz?ޟ_mYW[-~j-=}}-}ڙ[LZ+xf{mu9[|S/blg~koi~C[=kfsLk֫kZIlgs}܏\uNwwIgL|3Jŕ~wj4M/ߺ3Ə㌳7+X}5>[?_;Ls}S=ZrKi޺x9?I5Y^iz饛-띛=Z~\V[W-ݗbJ1Vz߸fJ/yZ/8yߍ'~/w_/t}Zi޴rz1bsOnk{sxM5źŔRj[L?S{Ιę^msַyITck7/үWzR~Z[iwҧN}=[[\߿}kks[u}m_u>[ۍwZSklf=R\m_y7RYk5W?WiՔZﮚݚyݛvӚNwϿn|m1xު/暿Zl?cSiڟ5cL+~VǸ=w~Wbmguv:ϊ:8_OO)Ruu~s=gڿs|Ik|r]ozfݕ-ΚfL'b}ugƯ}K;?-x_]:i?ﴷ~[c_jGYK{/T[s2z1?Yg3Tǯ?zΙ58W9IiYS]^+盛֏SJmRM+rW^Ke4g+b{7Rl{Wz79뻯ʊ⊵ėN;ΪoJ+[{ΧZcN?)͸΋[MUc|Wu޻owj:[71N}ִ֝xLu_7u+mޫTWg)zb\+o7R㝧R[z[;'VK弴|9Oi+R7xZ)ƵO_|ՕbҫoYǯsx띷Ukw{JZi3cxSL{Tw:|KY|Χu[,MTiVM+Ys?S[]c;)OoT[5rjZ_1tb:Ƿfkn5wjkΔ֚M[׹zwtn:ՙmo'ӌŵ\qJ;{;;ל8gYyLl+N\Ͽtg|Vjjۜ>|ݵL-b_^wV+W_{u78*5}LgTN7;[l߫k?Rz뮗j|L1V9mRzO5կKۣ։zվ}+߾}vbL+L6cVlrfoL5WYZD_v]j=mw2ϵieukk{ִ^}u7ߚ\͹Z59?tk%ݒn%[SyK}}޽z+_o":Uη?3k+eR*i+V,qT9ROSj|YfKw7l_^*՟T^ߗVvNkSĿ]'\l5V|_y)}zb-<o{Sly^ZXbklmbZʉuVN|'ښv-r:^ߗZkVY7[wjZ7r_O\o?~=O_o4KMZ+w旚j,giS]-RJiγ>SZƛmܷ;[{y95;iE2P]6[OD׸P]oH ؈_aR։``Y,%.ZPY,K 82)#s¦zOZv -{~ͪ uu^)dcVF!"Z2,͗h1nS !fl@]F/Qld1/P] 1 ϐ+k$F ~ 7@ـ:٘18hN`LV̗fEgql3ѫr -_v vn+[`e〩:T\%〹 8ZL D0qC$p%4!u& -au%'JDDckB'슛@S嬟p"{֪8WR$(pȤ@7.D%P$\PD\Q嬣x6Yu&΃FC]\AQ''x1T;@<1*Ė jn~S.sZ9ƎPԍXbvə/4I=2R@&qܗ wtБ/_S/A6ez5XMٔ-WI/ě WHDWb$]v.@|;'1WGQ7vDB+Us݄-2?$&\0rQn$ÅgƌZ8 )Tpi7\SJ܁{2Y;B#2X6@ ݨ2hď  nE{a{q¢Ι(c#i -I Br_=gX-G!D(j' 0 \#g{B4+Dݗ -Y7f{֦|8bOgiJBD|-9 MRJ/ lF \12W>B<;#;IыBcdz#EI|&=nT#ӸCF5ވ5+pK)QLpt!dv3_H=F v8Z -*  - jǍ@pYppÈZXQB  -6)69cjj HS"Jd$I!$zL1%"I4MN ! -" 3~PA69'D( UT;p\`&zKuDj "O%f3i;k]_K\rAclV?xƦL)v]?{Wr_KǏߕx˯NH޿ww'޻V{TNbvR-_k;YwӼkΚxV]jigE%Yjb:ܛm޵eOwѮ/uѶTnt⢢%uY:k5S/R2뽷zD+W깟R,u֯^4I}kkuֽ[m̒WvZMJZO[4wӘA5R?q-RcLʽZ+wSUMR1nΒڷE.=WX)z{֪z #c|HԤx7q8f˩d1-&tFu9Sp@Tv! -` -("ɖ8n@3 XyP2f3_t`tv̪x` E1s"5n̚D :Eđ0΂ -Z'6S0s̞: \pW@ ;HOE3W@Ę) QTVR3ţSV5xR&v[Iz:IzS@92`p{%ͪaCu_1 ob+jDXzu#b9!S<)iu*^" XGdlJF15xB#rB#Av5UAoZC|"l%t~~'Q0T=v2Y;@0$qF iW-Ohl4N }ڰ8!:`U} -xԅ -+h+h-x%Ew.f H ;&a Xs/OG;(,g%%l Չu#[&I!!`q7q!UxSڄ16]M"U&`g~K`yu9/”|aѫbTcx6_LfKI ,D:1HV?ew@8ȅr9.$E7cO""^cN@p :(ʙf҄-|RD ]x›: G(@s?PgH( -&Y0Rz/P:vҪBt`OxCJD GˑQNT(4KңqxF/!dXʃ0'lauSU@D<ф섒1Z>nUc Qof )R -c|PHh!b|^:e\|8\1U;x2\?x5`I!THLx z-9l/Q#+ d-!dqQx:0Fw/IG<[h$ ;(^|F1Y:v.IQ -&$$qH X\y6bOYU8KY;kRDLи -)f#є'yܦD9+jf+&8F8l1D(!XIR -sȨ@- I 1f`3H@w/(`Jh{;fU|E3BDVD1qĞFs]AC~M]@qXc!Y#Л1QHLUH$E6`NN9G gq|AAL;:+A6Au/)sfox^̔ "ZЁ;mS!Q3cDDđYOĨSVB4'k Lx h)4Ng8Mx4=_cScwXpi6`tnʞ@0 "Ս\:FLՏLo*[ -a|`x0L;@)0M@s?/qzWSSY#pGrʤB4@q4`r1V=x1?=;x5@dgçͪQ7bQ $qʠ™+L^#%x)5\LbT裖ՃOR9x8fN:%P&+W`)^rPMBt^|H XI1V>@:kPa -*fHq¢z X!8bR z@)h6ZNIYO䌓(5 9bQMؓvŅx9޳vuʦHp-q-^m8o Cy#p ?q*l1uuCơ$__zk5*4+&QBFO -~3$`Qq'f| hnX`!` XkaeFKi4 p%<-~yάزƞ63%ވ5!Uj1 -gB##uC&+&a6fK=&DRh#. 7WhHV4( -! -S\);.l%yΚF% A`J ! tҠz)iܽhH}ڦ|%,*#t~خF3+ZB.k5 - E5]LNG8bQ"k 1D(5@C !F!$a!_>_A -1 ksMc"XIo -@_~z1R:›~#]~F.H# !X=4ŇDMrRI(5^KbLU0hVQZAÚBXI{c~?x1V=x4[JbV(DG 8hQ .)Jkx גx%\1.J#EףR4ZH\FSѳZ4[J! GLV$gxr{Iy0Q;x8cQϛUY5]MTXIqtY:gTN?q?Q,`iBCz -(cG&tZ\A}C" -Zga% q¢D11^C\nb HH"DP40D1B(DՃⴺO1DkQ-J1qNW'bBkZwaEmAڲYȳVCArYm9bS {yШ:Uh9q5, &a#,j{@BhIh"EFu^,g*gG%|u !X#oI"YuHHz#ajbAqZ1 j -'iۯt-5\K ˷S6i؃v505826p5u}4`tlĀ:iPݥi䵜@B --㮆\UY2y8fP!NT%AG~hUq2'1槣Dn[UXl]|7Zv5Vxqұq{Yڱx!ķsAbzd~H ߵ` .Kj؂ --5LP1 -I(1N@™+ $o:Lꨇ#}ذ:X%l11.B΋&$`ThI9gQbA䫧RYTI*U9l^ 9aWB @fW+@C(ī3g D>/ o +Q30jV +r,M)[X&r٣4D!,cUgܽ%VZ6[I8yҗ&z[))/~ t;gɲLϬOK'!!&T i&ؖ[ϣaw2TRTz"1Hy?C6M{_ T˪;]̊wTY£Ke"51Ĭ7hDn.w}ke|&<:%㝤]aG8ӆGFBoIRҒ_Sפ ot4~\}S|%OYKdY|љtՅ(8:Bף(֔zVCD:,GE5SC2-yRفF%x~&N +}PDwbDC{!Uph6eOf:tvO/zᯜgSH Ě:ˣq(en_GֹOc%* 5k%>mcuv)jׁIyrޭ'TYTUNeF1l=y>^^p.uyGYW=w }"»PNTUX^rGwv\VRg*:u8#W{Sf-{2D$أL}P2hBCŎo3|e:?aRG>OA⧮bmTh)JF-ՠaāƑhN>Y6'vl+X5ˁԣ٭̯]r,́x3=(/QRjO$4 cd M&{&;ђD7CS~hYU{$T4uB@*}dHQ?z!K:;]Оv#8iͤR<4 OT #=ɶ[щK1nIY}ndu;&YfȈf%0f:VG+[o)ql}(I ǷT,eg9Nqdypj<̳1^UOF͑SCv,4hǒG쎈R %m?7DܜHP,kɤD'VHrX3[sEmE)fΘ_> +87f%hiUWmwW$6Y3/LXٍ lG(snrܞJy1FCQLgO&ZIs6!"J³)EQzF\RHX9r,:PkU\|'dV1 ̼| #j{)jҧЮ%Yt-y;Ǟ7tY)jL)Je$S*25 ݕo-Reۜn¼}TdUjZu + 5QSwaJӴZ~F:\VZ/uVYI&>ȒN^4 WeݤEcEWt ُ-i)Ff$ tK,oBB1gLt-2A %n_Y}KóV1>x65Я0Cvnsl:l OVte eM/,Knխù%?ʈ۲E?ާШ}lfJ8gRU07:d2иc^lƹ|0OstvE(' ˈzu_fz7[FC39kw*g_Ns:?wh_/og9ߡ9}qN2wj>M[R4wO2X#»7Ғ,;iu Ѥ54֦%!iaDF\dITvcx':BɚeM!н,kIɻeh3V-؋$cxIFg8c/#Ó$x2̻M:ʢ愆 6 $d՝.ǃU3Y6*,GIYJw>ˆshT#e녔c$2DtZ]YXbUՑQFRԞ ag榫F;aFYڜdGf#xdW;Qe3ڬ. vvti}P.Gpe"ەLt̯ʧ04 "IjI!+CVShULLP5nz(%KN8fF8%NF%_U~N#F$ VRUL*vJ ^7aN +%JF ~PڱA2f[YϮtWS4KC62铇Ds݌&IG$)KG$4'!J*vG袍b6y?h^&fÝ +qfPtzf6-ZoF#ӽ ];}9;MWW'=Uڙ +֗uwG[:{_l|Yx7(ɤ6^>JNOn;cOu yGf8+gБUF^0(tnwxqFϡI,dr%KkfGw5ݯIݗSٗ>Rە*FZW\(יG[xXzV-5b1kgˬɩ:LvK[ Q|W]i3gŮ:洕eF ,m&Q:ʩpx'Yf!tdn[wfbvXdEwZ}8R7>ͪU7Gt余+M3Aug9SJx~}pDR7xB7Zt?KD;OAI4^FRMT{GІbj*,^%}7!J}p>Fh2/ӟ}v<3*e9IO{N*p:e6mfcXS8Φ8(.I4{6qSQ&.G`~gYnF+4 ߫osWdv#&n, Y?LcY4pj$iyg7Y6|gP撜ŪoL|pl2&T6()%̑Ϋ:7A+E(9wTG~*kK3yj>4 qLnÖDccsѬ5xH͎R<Zi>g't({2cgR!|LKkΤ!4{͓"֪^K2 hwU-z>Q 6JMGHۜZ˻}9Lhz3[hZ `ִW9ތ[R7{vHFî }&_y{ϩkFVc}XˤrP^~NViT1E>Q!DŽU9{ִY$"= ˁVFHIbFw$q8v0If(˩&'٘V 2m=)) AxP@P.$Lxpa@ pQA1b2 Bd` $P+0QAl|/,T8TDD .`rIؓSM;#& byUgI2VGПI.UQS'X,h餰B8g`#xON1 [ ]/4#IbJL,T)CGT-FʼU;̀ZOēeDiPR%QM=vrS oLhx-{\I"͂0CSA ^Ճ7,u9Ӥ$WwObΙ-s̭O?'暹.펓(Ygs=8XRΡMTCQ54}p.E=m 뫽kgtO"u^fsZ{%$hjR}:e^gVQPޜTd9XȽ'f-Oq0N ;M2~,,y^*/?4cD2³)YNB"X-wd-OQ+618.K`KSyGgxBOv,C<4owKitMtfxf{c#wbV +e c'F,*!ëݠug4HrXD!$FBi/,֛]k5kHC,%N^kn˵eolrmq=Fٙt8hͰc Mdjkkp.Bt0k +[EүV ;K*~)NKXZ'yxp.{Fwv2}^HBWuV<,),L̓LRfd'φrR̳h?nJnNrjĎϛtsJ9q'iTw5mAn;?x;"+Sȯ𒚝wjU +SuˤSNU2js}OW]zv-FR˫***$B2K2rt*WL\M,T6vAʒO*eeF!S(2#%БH@&kdLȨT}]//Vld.H,ct2u2c2Β19߫r$Wr!T]]O\)~ʩF*ɺ M5{b6ik]Fgb\m5M&M Xjо#ʙ"rt㔣+PImv2&cgdRדW5,7-;'Jz&%}hukl >](x<^(tfϡpesvY5ev<s6s_cI8=S#H=J$;;JoO鍽8 S496rtgXh#<9e21JRvGjIIUʤ s!;%mkFr’,!~Q'Gx8#6xH'zXjl]cܳ+fIiB.7Hch_/=EHӻ⸎2,To΅mL4^4gR"[h~F/oE6|F<,=5]ZCfϬyOҲЈmf͢xH{CB*mTr5KI ;QY'Gf5ۆҡ֡;<6S,_6a݈W6ة9G8^y sƫb,CWS(-.˕« ^J"LU0p(Q>.ԕdyTxO;YcCUs3DB5x=}eR4i5GdX RRJa9XwFU|u׳e)oJScgVY>3FY՝n;Yަ Svu$-Dˑzե2GnU[^Q9SzWݫIwܯbgKwۃ5ST `YI2T7` eIfi1-F̓II̓d~f y̧,$py.=UlVþJ8",tpNlywT'ԙ3 Mbz2DӝZ4j"ЎΆEvACvˌWYUauNw6V)tٝ\%5jÚeFj1s_ztIij`Mz 4ZqwF4y5iyv0bŶdkͻnX39$o?vy.?>_$ +:PMeCIτDUSwnejjV׺)Uu^e-$N'aiUԣϝE(g,鵣M⛝*.Ǫr9c6sc7UQh3f2)FJ߭oeѮ$t霴(:D⇪TO7DsRBYV RϔH&Y+OIe?5+ݙ3[+8Y}Husu\x3$rX)7MmXUdתּ6nȞ)rYC!1eR_)8WC$R]H0QA2؀ń +p0Pw,iǎ,;08gh %J.*++U|eHe]{i=~磐N<{ӔBad7y6Oi4Y6ClkT3Eligۜ͝luS7빳QSv9 +窮SF-iF(R +s`@<ɌzŞ@F@ʼnc`p(ӷOROv~dȚn̏nƮm +1{ 58WQqM鄊1Wqi%1?_y2"||WHc@` n8BEh`pz h̋A7!prUG8d:N3ɷ = m3Ie*Ⱦ溅 2{Ld$$Ⱦ70&0rz)HM3s؎⚽mtY+LdYu1WYP<""A;Eic :PvE-!'))ÆM;Uȝ ]cLe3~1 {|N +YNUɮq +ٮbU Yd\ʅ$ 9M!'R7C~$al +N'@GC!Kmj5dru!rLhb =- P 3dqa yaBjDO"r4+2 0lɦ[#bΎȿ[T מ8akD: .[%r?Q}!a% N"3c#򜛙BW6":^,r;'"XKq?E>zexG9.WLH +p5۩og< /y~%[ۙf$ive5Mĕx 8#cyQDs\͌79e&q@y!a u6DYb _,'ҏ&Tr6y]Q|V> QU?gӘ!Ex wp¥RykBe2 +r+tHDr)4³ \O=Q@FxHn+J$iGxUcyH>^%OZٔN`%"PXG~!ei4\G2]tBc@ĜxnATOפwbTth0%/4Ѐz~۲ qֆD,m@@nI7NiEחJ.).T +Ia2kPV@R'^8rcʹ#usb+s(M_&Jb)*%ip`$Bܒ:fjJjIrHjXʙJeWo.Q^!J/Z +>$ YU;:ֈZlkU^Jnذiӈ N Q,7Ҧ4FZElҨÕ髗Anǵ/DH%u{%I5D(K % i*ߜ4].F;q WZ=j?蚏) o Qp;t헂j.FHijd~(u4 #{i-a٫ΠA 7z-QJ@ǖFlL5NJkŤ9h<5hШ~QG{ďXFm~7sk֝ GhA T9FSM9Q+lۯ:eVc5^V뀖zj_r!2;^:nsXzCÅmq%;jYR޺Y}&ZmFƮ>@P~6wכdzfƘ{#'1t-#H[\~Ac{ؑodEsKW$0`%$M>]V% bf|^m -[rVNraYҮ>m%-%틷`cmOFص]ؒ#-8QڞZo;iB n,&Np }GWXVvn]q5%w<s57wvF;<)v FvG1ᴝN + +o)okB3G{y%{/"W-"o%ֽy߮#OQF7^ 1SF-:RM=AQ՚n7je,?2\5Yz*p{,x˕l}h=ņfO4| + +xl7 +lHW?Vh0piJOSC6L?frXW + a- +ٚ3EW)<.AL[ʗx]X :^x7*9:vO ?0xN^lv9_Ԭ9u5?"URd꽂< + [\p iALmNw/~ ϧZ8pUɁ,i] bkcj'd#ߒ%f +|sZG`آ8#EoZ"+|)"!nAS )y(|;͍)D.N GZ#za@ +x!*&$B:Pq`ʕ%E Qf MMzVZ/N""䋁:G>u{mdV]uƿ寀L\d^c0]5Mv%o^~GW[dJ=|Q&w6S~EL6%֑p(kqqt; +U^!;axEb!{}zScy)tujԷ+AE}\Va3!ȡ^O}'tǴ5jr4-o#^TSP M)`h +!56 +<@w兒(>.@K;āgٚ*tOPB'6qBgxQ5mBC&OvM<"8[UDă U}o0}M:]7q[B,*&? +3Odf"q+PY52J|zϖdϐ*$f% đ=Axi)VbĿ-S%BTbdķ3ULbā)%0F\*@ BRx9q9q(+ĉ!-gT)*5.S`dJXg~;,u+Ft|x6ZqDqB;?]F&FЍS:;Ü"R#d$0f’wfkAA?7+c{uIOoY,*|9A籺N9~ί|d;ҸClY=W4\Vrމ:ŀ~ϫ6+=} -ү8VڴqJzUrEE[nz~|=d â3nHzp.E=$ޙ])y. !%ׂ'G_sXG{-֮nXmͷx+̅C{%\sݻ*}ޓ(<~ ˷^CeM2D8~/vڽT.',Ȍ_K1B[+'j GZTc4_NǻJ\XjzO;$L? 'U &G.2pj>٫D`[~?ۂCȂv3m)#K, M ^lrq,$[9 N1Ih`UtJWf80?bA7/{8D2̏Q!5w'1`pB[Xp;!#kkXƸ8\ :fpʐ#V{oNt׵ޜ@]L.wo)Ԛ ;ؤcJ+@H  Pl<-[@~ Ǔ"FN30; i;R&[ Mw{Ro'xJ @ " )ËȉX(=9=KUi=&yRCwrEZ! ָ<F $3` + d&cE +]E +&of;1d3GȽde ~Ej_ߛ1Ac7krz{<UdD rJZ`v57= +Ni-d4$uLxRayͨA CZs沥]X>Çr(FncǛ1wyåWXM)Z*{[@8)VR +{Wdy)kSڼi^Fz֐Kqcp>&mAA(j2k*; +f@%Bџ҈B!T$p`Uqa2 w`-va=5a> qWWkRPE(+^6d'fj.K>𫨷_!5 #SѕT43[' *?ƒ0f:# , 7:wGVZ $L6οl[Z;4d 2DsZ Nj &<"r S +W&[ lCڸ%^MI33 -۶GvQ3##7<`J791,TF[]]p 86 +u*!|o&́iW94&0'ƙPGE6Y.+c2"J7w{ X@E٪+˞b4 CZl +? ʆפpjHJmHyb(ddS_0HՊ[l?jk"/iߑoXhM,+RLR5^:.ĿsWNQ>9pzt-6\zm5>-jsLC⒝ F~F< ߯ǖU\*Ëv#`t$vuB 9WUqmiցK$2 y@[:XULH\~ +SF芫9 [9zhrx1nZ,s2ŒBB*l[p,~$i" ~x +ALծg~vDp%\RQAg`ͭ9<9i+"L ^PR5.ԧ hQosCփ_ !(*ݎ{')k"2QZ|いaaX $>2Gk& ؟9W3DB=G$A `){g "14(75O5j!S[ئx6| Ier2Pܟ#}FMRᴽ&g+O#at;wBNn!KXNĒ1d=N|KZD~F.nZ*swB"^;J1+d{{g@^N6"bF =z߃xاոDXӀ:9 9al/ 8`DMRxNr8njLB މ9gI)R+q !%ţF+9I"VtVLQ3/;,Jj#}ؙ1%+8k]-5 F 8i (ڜTA8i6I(T{Z|^<+ޚ2%-=(u_bN,˪y?S Q<<2'vc Z3t6$z]{'-dxsV`cY+rc+Nà7$'rƂJ;O`W${IP$oRPbLëxnbt=m(\9Ȅ7\P{>&`w%02ׄY![YG:X:"Зc}%+F^7VgGT=J)cC'ݻע6恋^U2=,\;~Slkn:a;% +åntbZ( ̦* {xgh(k|U2k)B`3Zwg-c ݽߕno +:wMCq{U׆'O2 +T0q.jPtp7g+3قSZ9 bYhWb3+JĞt &Z7<4wm郃^T^15t-(3;ڛ:lu0 +"@.Gbޟ.ک/aviixK,Å/cUd2^~6qc]84-Ef5P: "Us;U% &V?0Rv(#r9TX'97T ^!}Rv5T>&14m6_@rmv&j|BY-/oMqUeN Gqp([]e7Ȫ%,2}wr a bS~ +8ay1\s8x"/A_,)e~zaҴ=)cLɞ} k32crc0 g@Ǹh)"i+L/LPq mlxZ2=Ib'AjȲlg@>bbl,i>Ѷw](>KӷXW~ff.ٿNTLW~ -U ˡ9ST4=zouAgbޛUT#YANrھ*>h /փDxT%AEI7RȚ_:vVfFzF6ݨ[܌<fzcGm}q{e:𨠣ŘR N+Yh)3UŒ@iIDGG[]G-]$|I-9 +Wg^1ELUcߎjvL^<Vx,ƣ RFTuuFrt-4[t5xm!)mch=L z +j2t{@'v-܃Ԇi<^RFP"$ԀtdeiZg8Y|"kдeܣ&VN?,K[x:r5[F ƧTXv*=5 fǃP~-.:*M0{hJ\ik"5{YG&²Bb!mOبd0!|tSvSZ_$ +Q9H XVׂh dOd& +s,7cczw3#QGs*ќ)ɚܒ'&9ke`0Ql\w1#E:|1i+8g=QG &f%ALtz" +tf!@6-R=F-aˇc*yCi]*{pHWtj$ Q[Fxzy@Gk{w 2&hp:)ZM>a~{ޥՠolawE'4oGeJ +!wFV%m^s*3 X~QN6a3oswzcw& ]t4%?.H߯]'/⛸f0ӆóXj̣w.l\#`qkύQ}a2dbvlw0͵$3-ojFko1KB1bNZPz T 0bck4#x(~* GPJp!aNJjvq^]tݬV=)lrfŃྲ[aeig #{6Mɂ8û(,u_H/Td3+;܂&о 5 L#ELeLɪCs8bV@3Չ<6rNC [QAS*GU(5X1/uUeD^|=< ,9&Dwg$qӓ'G`ߞv6_ZZʩQ Ezd]y>%o?VRl]B7fC7`6 hvމlh#b=ok"s|i ðxJ+5LWSCBo|\M/(tGEH'5gM7>wgɔIR{ZzzYl5˵tMdpgD$cvҲffPȶYҒ2S&¢/`"9D?DMjp./&m&CJOs?1&6L:&F;(c _.u%T(V WY.'(S3th2|!]j:iÀ rЂO!=P^v0=_ je,vXYYAiT7ha lXY#;g+#]d16 t-r)J] hleo\%>MRoq"S"Zq̰ OlM{YYW:B|?GTr ĸ=a٤;I Cu_b]2ϗslJ/{<50`h NjrGb@cO͚S_gB'CUB7A*ଋZɸм$ +Va+<7nT(QGhσzg K#ֳÉԦѺfH#łԘO~EƤd4RΆ`{f.Z{y?eߜ2PTְF77@M hӃ7!h%QQ$:pQaY t?*Bzm?WTmRfElM׋e]Y Q\Y Qg@Ul@'-Y<ׅn$NٍE}GÄ"@gO/d 8- g!,$X՟\/sN dk:C?ʑ6~GBeu4¿Jz@ئֶ4Q*T%!&J'P;eo({G]8*轪ADBRN['g`j68ZeƃGoEs3_ T4iV~39'Bƥ4vPR4ECG, _ d,6ٖr\)Cty.{ mFC}w ΫVS hCDaPn>Lx6@'OxLkg&¸W=U +m]"!tNv!\Ԯh*>_&.)'(^~P6Q릴s")5;u&P"kaKCӑ42lBpI(hDAp4'O5WE 16;`/ =6[߸FtM9(?AZҨXN2$W'Ю[(Sy#F9؅!/hu1x :8J|_+p\(J&@O?$P~qu[8 +1WUkc;2~wNJvIg6 CpzuGnHcfG dՂ۝B u\Nqz\VԄQeFďV{#2sMlC)Ao,DZ,5` ʝ4u^U8XTÀ8 +n.hedkb)bc*%P<4 (0%unO`lO35{N⊊\w~0?-oTqPh 6:c>Q#J0ź{w3Grٕ[= tU O*vֳHrYXm!Ty`3su'a''*>C 4HA-IM2"p-v̶0H@:2! 5MĤ1jR$mZA#y R +qkKdJBE=|A[n/ϩ#>GR@ 8QwXiȇLɲ"NCl\LkJvRovK>Եizua`󢶢@0 Oɐ8M63a8 +K20 ,bA]LfF0̸١d>{~Z;f6$-H +wѡW#B 9nnž90o^t+`ۘLX<5U( +.-jJCNtqY9wEj$Sy!/ْDm҂$d&@{C- \} XcC$nkA)!łCcnMlS&Rk#@8<9*G+=4GNO[ʿzRh-k +(E)F;!NW#Y :5@ADƯSV9o)q|ьr,ڌːX,35;y7, 1꽵!ț%YoMɶ {F&7]h2BfKE܌r- ;)oJ c\~_@ moUM\~"yt-G6ήw,W y"Efx]Z%\Cd:j^CBPZȑxV|)Db·tdEfHnJS;.Բ ?XkW O`իGGBQ?r  Qd>%AF^CPO|lb 3<0Bteh/ \@|8=1ݚ.M, + ˅ y|vwZÐ쪊W{ kʔ&e`v| |/4 Bt[aRI[ս?BU ' 3iӀ)EC|(Fx>QEtɥTf75b$N-1v U2hDjz5[}a'1,u"s Vık/%p!^MňY*zEQq u`>7( +ѻua|4VKÐ0,31k HCdُA5L]0w@#4X o2,K>n5)m֜T?CC5p礕i@t0COCh2\"yYa{k2ڹ`MH@E s͖c hq +XE1p{8)>&\lVMVqW|HtXwep8*cCD"- Y/.GmG |g3Do8rPc8k8 "ljha 8'H0i^Sy:Ŝkɘ>'g5Q5LG=ѕNu!#xnZQvK#  ~X{ZގkqUE04FYdڞBSϙpqKnv{,0z껩 yHr d0GgE(&!.A,ZNIi!c)Dxΰj<2vUF~1~[Q"Uiԉ:P8J@7^] +*CCd{F*g@5 +xwJeJKzY>$7EB |nPSmt*GIԥ- @2ٞ LQA])^ 9ɞ Uaƿ?uql6CKM%pY>2pn +{ g:^R -6V@搔z[CS@ QPz b޾r0X-,rpBÞ3KNfZ Cvwsӭ?,@hpD1Z&z2WY4T:kA @_aɌ44gb<n=vp*.ASͨū51N 5TۮbH$,vCKS̢\'νތPHu-K_%V)@z'y,PV`Zz(N @ΤId:WN~vAǫS6)}BP(CSQ1wSTV VYy 5Oy=] [hcJTOr\Rjnh3<~$:ߪ颣0HgdK4d14ԺҦ%t Q]#^CQ +=NC6A )Pc<;Gi`Hآx +1Cyt _PJspp3¸ 9>_ZIʓ +!f +ePmNG]ϸ7bF/#'L>")q_zGj0"NL3Cʦj",>ٲ@̴^@u v2ȆV!OgZ PCe#{N`Tp<[vJ%eiDQۧ+k^4dҚ5&S547[(E2pI:&.p_la7DdP֜05L{LPh,<Ѩ.Jʗzwdsj(T45!_o9 b&)<~Ss픲tsM)k$.!OZ6Nr&dv/ɼvȩX;3ICXHj9˂>:Х>)$ ЦA/㣄pHPExS1τ##!6QNDPhQH +ыrEsrE?YE986EDw"W&e-HR)_V(l4\DJ X/cFKsSɊZ9dvjꈞ@'gsR=̧쉟bз@XM^EdKo =UR. U(](^j$kң̄<ž@F)HDv^).+/cR AE#66BweƢl}aiW%k:=0PS!DXS +x>ŞSHZoJ=[b3i װ)턠JƷ{1}I{BY6JUS 03 B6)PqÞ2҄+2cS1|0qOPLZBFL)*䛴=;bzCպn u[LWTlx SȊAWZ4h joFqtU3:A whzz8W@KqG'˸ Zh؀C$}TpN xa±5qir bIp0+HKq iJxlyx&JZ{/4ɖׯ;dǪ!GF֥q1`oߜ W{U zljwӉ4\6ck*+x m @IP1 +& a +&TX)w(/˿ٜd +&#$E55چƪgTs|"${Ulʠ^dlE:U},#[>:6Gj\l%OŕI7K&=Ppo'5ay3' 8MH)~bwxo,P.n|;CV +ɒ ߭V~q͜.;ܶj5}9x)cCĴt!cϐr}K&}BjROvIbO7yȵu-@͸ePWe2"Nۅ;XQg|Q9@:42'@FkUud2`/bوWCJ)@nJ9(}UK#8 + !Hʳ/r3![Pš-&ed{:Tߩ@}>s`cbӧ*zfөdX_9t#ĐdChe=Ն +VG5CE/U֋,q>DipjϨv/9ϊ3/UMLl]Fd$oI>ѐ3Ңx.~FFa>>(( ሣA0}v G\M\?蝗Bp;x%pĆv@ +% PK9(Zzee+PuO~F5I,PH()FcIdBMāC@jI#ٳ@>[]~Zn8 +1ҭŶxÁ6d1*taJ+\`y}I`' 7^.i o~S;y]&BX1u})/^]a_v鱣q3dp61dZ BNZqUuBW9K6#WRKA)wACoYeqJV_PX=:6UXDDi3JpBIaQJh?~xVN`2PL,k4VOo 9SvfU_z 5өT%UT + XbT!h8wɀ;O<*GwNޭ:=·M,Lن]AMn g.6AM>UFX&C+ju?${4EH樂Ĩ%L +B^LULNk]BO:Ca7lTQ"#ʦOئR~YCJoMb=/ﶄA1(y~:PAB\ g$FgPLIs5 HQAW |(J}#~Kߞ8o9:\!<&==C#$v٘[_GnV"؎p#D7K G,!-GH؍51vez#3~(Ɉd}$BVRR>~ی@f=h2wF:X +rql@|29&ts>"u{dێƳk5M(+,4 \{X>Yq9q} +q@KY4cY,1VW K˃cBag cØO}c ck$Z8F cИ^a 8gX?(9.o,[oc}|104# lUh=)- 0FfWekPϰ㬭_AStYM6ʺq&!UT4+rRUɫݬ]%`VӳzvkSzLu`+\AqMmAV+Ezj;>$٪in.ew uVaSYz?OwPJV$(C Moh 50t츢?ʪ~x]oMNŐ H%s¨/N\0C ]vnRd%:qK]U +uCGIe~)k.򯩅ok\5furt}eR4:]&:t׍WDҿcATY~Ǭf%,,T+ VU1Q @Wn|Q>,$4wDzcH5nK0Faiy}Uwwo%BvCQ,qd Mi FH>Z (':gs*`ZL + ]a!HMCf5hI= 6@*m`@dȥbm1j +5` 4o6t*6 rMumI[\!^d,xQN@!Akظ(jhC-{xe:n {h9myi?1̦W0J-n0+PV)K|g;\?ܨh`PW qjZT +Y-΍+n[+K)K^NO W d[b04:' CCŪjEMZG+"ƍhbv IN +}*+*.2"pp^ctwV٩'To8O(a \s;ӕF-@ÕRY#4>aAL= i}GE OE$/ioT)sY+#gQ'xc."֠OLV{G͂d4dOvnWo[޳C',wwkp+fNQCogX0G$j"[zQ!1b?0duv#a 0Om’ՙ( JF޾.+5PUh/$xoǩĴhANZjQp-Xd'_NhkجHl'mHZی:oN@X?P߿m=+D 5Òd(47"U2MhHQN}GFWa|f#~|Yt /]7M~pwafzxwgv½`ʡ9fVm|j*yX:#=.zDf8VG9\Oά$/l~X==Q4._DQ?`UKjkHi)( K%}ѣvz8cMjnٺpJݞr>o x2۵fd- ,g۟=}"_ 9/`#2P2eA@fDfO}~ Ŝ+Mw EL}èK-MДPJ@`}deybqq_ܙ/s6"4ZVb 6A `Mxu"t`U0@#f3ͥllA׋DvJZϮAzx}oDӬ9bhF{5 wy.&y"UN"r.&)zs'Mعm{SRNRՓԞ`'@|9FY$̎\9P(Ҕ2sa +KYØ!D^Q*U<N<%)̳W $(J +xb那}0 5*^ )PE)"!Af sXt'S uUpz~b_O=_*kLv]mҨGR_A`ºNA- "L̙3m#%cn0usjNpWjb<X%֑捙k8!.c F.|=>k&dXV?oXϾ~je1~CοTbxHji=27;c; 5 CAJU$쿇Ӳȍ8Q#U/׊Q[$_qc]hpԶƕ(m?|TcB#~2޳ؠ@H1JVNǫIL#FS$Z E:HO %EV #!@.13zkp_{^e4S}(+E=tlkr[nwww5IIijٶbew椽(SUUU fbk3y5S4-DO-V69X!̉ 3jSiycm{|g`oiZ/~ܿ=ޏf3~=wf6Y?'z??}j:m_Z)7m_κҌ֭z?Zow1鴸O{z??sIokLv<3YoΏZuVo|k_3}M't=nՓn{Uzux[z7jJ-}K3S׋s>OwJ)N=?gz8S<7}jk󫥶No{f}sW{wT_ү4c͓ZuoZ_ۜ{)zjjZ){zbj)~-W+oVϷ9~tތi9cg34Ojl^J)wR9m+ݘ~;_sijK'tOތ-қo֊Vc:|qS/'׌';XcLuίu۪};kߧ3oZ~'J-3Wl1L)zw?7l/oXkzIs㝥~m~KS=󶔾ƿ+y^Ҿ}k_L\[}Vk/5Z_[[vb~Z{}zmOjYMӿxMs_*-}j׿wzo}ն^mj4_wcK׭I{=聯b~+ޭwY[連M?ޓjM[;5<3uS~8mTK_)MO2gziޘZ:+3yo)Tk7sS]ux9ﮚbkuwLk}o]xMiv~չbM8[I5W[L)Mfkxk*1_kwwZl}w񿱥[g:uښƴKi֔1ob|+nZMo:9kk'vS=Γyy{5o5now[<\14W3JvΟVfkKxz~g]mVy-V_kg[l1Vk1TҺw3Wי3olV[LYmmo]3mk[vj}'͗N{]s?W{s9M'a3͖-+Wm{fҼ7xg|?׏3Ζެү;ctJVoXW||K3mO5O|jΟ?I/RzζI<'gz}_J륗nZwnJZk{snZm_t_)tS[wM)iet}7޹TӭRjw{Ӻ_it[LK)?w{bb<͙k}7SJn3L;ggzfuޯ['ͶR뿘bKN;_\I[jm1uI;}oowksųnJruo;#k{oiu~Zom7wiSkNzŗ֛|Kqy4Keqvtf\\USkjwkzvo:CMkߚ;җ?z{̻w~T7yҚkjӻOW՗kb׌1XjS|[Mj_jY-ڍ<+O~-?͖>Iuu[y]Jj]%Viw}նNvW:9k1RKWNzם-\M?S|u{Ϸ֚oUUWoΏm~fj3-t{S-Jo{뭟2g8S?[;g\L'JsfMuV{1T_Z?Ɩ;_kL)^K5T]ίo{-ҜsfJw]++_Ӌ+_:V⫿f;+xoM_9j_:4:/;_LoS{7V_c֙b{ルީ;coǔ;[Zw]3Օݘ}VzRwV_)vۻg⧘ŶZVKsxXVKwVKmvZlx[-J{|ݵL-b_^wV+W_{u78*5}LgTN7;[l߫k?Rz뮗j|L1V9mRzO5կKۣ։zվ}+߾}vbL+bK6cVlrfoL5WYZD_v]j=mw2ϵieukk{ִ^}u7ߚ\͹Z59?tk%ݒn%[SyK}}޽z+_o":Uη?3k+eWIV^9Դb2Y/5zJ=RmKM2[yfRyL]sJXϘJ%_:UfԵJ]kkNY]_[[miyx[b{Vlc\gX~wo+?K|֊VNr;,nwiejMeTZZgY޺UۍҼ>x⚷{K%~J3}KoYjz^3Tc'8M3GﺧoqRJs̘Һ7ޔn[u9ߛ3ϩ1-uU|CuaLl=u^*cGCu]!%`# +(f|JY'bR惁er6[`kAeO,VsȤ8S =iUە/(o94.4Ky*1^h9hzʰ|7_Nz2X=pZGAp?_Mx4Mƛt2DN@;B);% RrijGHGf)|y:ځرB o%Susa⻗(gh1ZT XIӄat8`NiD4+1Vr +mD+nIOE~‰XY4^IKh3!}ެݗ"[BpCqEIfqʚ8UA$ktqml1E`6X26Qq/ˉ(5``]=gc勑<Uq*N$P%6^M7h+Q$lA5^H]2u$B׈5ڀ1-'|Q{I:DPaztƨ8[/MrFi ;BQ7vbъ'gLȎvҤF&$Hkp_>\=ЍCG|5[LHnkR`5;dS> ,_ $]oZ>7,_ #_#1_%^#_wY:ڹpƞr\E s\AF t\rt̢ƚ.&1G/ + ғRQ SK^'3CR2R@)Տ#ty z;>zF2Z?@4)~Uq6qlʧct$Ci~IcP8BX5p"1ozRr5[Mf q!`#MVj#p2#ţ34 +q(ƎHO$826Q8`Ox#g,pD0D]ؑ7-($A o7t"ha +-)PB (n +0?8f~`z,-窵Vv^Zjmڿ-VܲZjekXZ[}yRkؾXuS-s2ۚ/Vӫm۟Y*}͙ۢ޷E_{Iuf[Twjz_wK<ۢIwk&cW4iN9ʫ/{ʫ+WjZoMtoM'[*J3潵ygIwqݻ֬ʻSS⭭/8KĻ+^wֵNZeO_XKrLx޸)uW{{ڹwf-t9srRJs_Ju,7WYqtV]3nIgUgEMc|?w)[֋uӿwkߛ?{[ު9yT;N[kHtoޚ?C+3g2S\_ZgӨItR})Rgz˭Oڷ;Ygκu+,՛9lK]įEs)1^_c,Swڢ,5j7rg;%]5Tj_-S=,}[̳fI5ot~}=-rZʯ?#Yz|76OW?r[j{\xj-un3ӝ\k\Y+֯qDn[ddCCWk'qX3Ѯmmko\YN"3bDEbp x9^ Xeb Ȣ;mFr UL!]1F^O ',as:iPgE1m[ȃF5x-񗩱y1VHݍ7p?.T y"^WԸ +*i m\ǫjRbar6F,%#1*(q6cfc4Y5]M%\<3n. D;;v7v@7r< OP`qDp C@ +p==kU1B +ZGdl$jRgr8Phkz {:q:Mp)8 *Nw0[aMdK o7H< O([/P:v0S:z;fUAG|?q?Au; 8#j'J6t'>mXLUu>cDrBs]}4Qi钢;QvTH]L,ߌ9񗧣 ]\qjEuIĺБ-n$FظD i*){m˜D&*Vi +e3%GW\͗Sa0l1har1P<@/N$@OvFvqDP$2;KB9s΢ě'D1@' +Mz p` 8}HLQi–z>qWa +)h"@.)==͗γ6kDыψNې-0R9x0VB-%jܵ`e /M##lٵ@P N䈤qu`1hhta ơ:1*8hEqWH(#5&^a&_(cȅަ +YRc~t91G(n#Z}K7ԻkqИ +*f{"$鍠*;`JoF Uz$hAF K Mz+Ei|!F!^H؈b hB X7DcO, }а|7_N} H&uʦ:ӎUgTxֲFJŽ|.JЁ]*(F;iU:'!%b ȨK *%Z ѸA <P,`6}ذ:)j*x{ "hBvBxGx-q1 7\)1X>`t`rdz1S>z/M2y.I>.J⍘< *J +a|<=F6ZݍGxgF8(dDQrI껗# Q-J c]ĝ gsw/S>,;$ѨeRu‰8,H.]q'p*%U5)"&h\hJhv0QH< ^ RwڦDHB8QF l)UHz#a9eRKsYw 8\|F0T9 tnfwΨ(J 8ePSO&Ƌ k.&1l*QAr['Aq<3pDM(ԫZ +ez/M9`|rΦ@!:/>A+ L503$8aQk` eB1 ptnw@ O4-'N䤬xrIl&IyBt^<ĜVY:eS]b +kSj6ZNWŅt!HxP8Sk຺![P/ۯt=5]MOxwΨD!#]'ac{e~zި834qH X7D{^F ,ᵰV4P{&g~K P-J\ql! +u֠D)ƫt%q/ T8{C Ybcx2$^W4WXIU`&sƤٔw5 [ȠMQLq\Յ躺Q΋9!󵰲&z`C.DD8bPƫPeD ⅵ΂ +Zdki&0ހ~#NXOk:iPͪE26ՃF!sĢƛ'~C$Iq !X}lߌ51)$dBE/E.6΂ +ZY5jd!WЅ/=lV} +$u̢LFTȎH{֪'wk8̔ P(VO1Ōb qx q=ĜVa⻖#5tD9Q e& +m:jP(HV[x`B=$4!wΦ:NXxEuuV,񝳩^c6ZN=M~Ɲs6g`NTdka#|$c*ѓix9dUaa>oW\lJa +{ԮxX1 +yԪ"[ŕ44Q.1l*[ +uФϛU +puX(c7œ's΢Ğ7*n62%Hօt#D5@.Q7 l" x(e}/ׇu0qT|Bt]]V$|JPz(fc#a7a5)CwΦz9.NԄlL瓖sȤ8Qk4qdl$Qkq>mSEFSFRC|?lW#g-k !5pp¢Ě.&q'Mj +#hF(Gi A5II !hD~c #_q/ۯQÆ5ހ91kEm,7cav/?|)Rk.?B#UCIF&b9RD)$x%14èaMD!E=1<-% +#pu(Q SXT%5[LkIgBd)q-$.C@|-q-h&+ 3VH!bZWG8aQ"Th/!.lZ7l$RO$ }u"(e}X{"ʘ{P[W!lAqZݧ튇5ר%U_'1!p6?mY],jY! ,FՃڶ)qJ=-+88,Xit۹ v1S=z2?ZhCplAC&qM$x' 7_NIGu{>lX,J kΘU!EquJPf *j +qʤ(1Hn SD),uQz9l^ 9aWB @fW+@C(ī3g D>/ o D,dp܃UȤpsFuӆA n0˦:VU" X'jb&7E4q(I֒x$Y?pWq[cXt56\OS?jKhc$JL x[?QW։Nv&ACMPQ<\at(a|EnNlE.Bgͪ5H[x5j,n&ΐ FJxCHĺАN[]~nšu^͗SE:C^Шd 40 bX69h2JQXX` Cpc5'ƾ9nQm=Q1'k:V7]D+|${f|OwNP߷~c} -o#4{Ŷ_I񯒢{pO}f - kn -ÿ+76în1{mlx,=XU Ч!P`2/n(WгbtLFGӫycwQr!ﭠ? uSwFnu~Kϩ)L-[i-ߥs.lpռjŷw60c >Ջ/iqyܠ{-8zx1E}8b4ܴQcCP{J BnI@Xơ9stejSq_  1M)^{FZ.{@=f|m`l׺ &SfoS]g-?myI5Ϳ~78A ȝw!z.Zǽ桡~zh7տ>mx]/q|{##ܴ^[f 3;n%0ۮWGݯ?f8pO?%{FE ?g)/4"6c?'aؠ[ Y!7PX"6WCz -4z߫G1]3}>\go/4k^,?x|4{rH _ܗ^7n)4^wcXОޡnXw n]%+w)}ᬽIQEIVR)f\mk2Зy:rYnLW(R݇\,߂3;YAȎs?ܰR5N#|sTQIG[Q4d?+rA\j_47F*Nϖ-DYqnݕs?k !|9Tҹ_WRF?&uM0DצH. 8O3I?5W&&m<ؔuAgr o.pNఈwF ,J wd`W4 ,k)󧊝~;p*}tɵ{A설*UjuBP{& -'w:H o{=1S{߿aft{&Sĸ}Qq:$m|aTڶbnlRڒ z|0.ə0ݨBԤpJѤf?A[Ɯ'qc[X#U@*_@ƔV[1Üzl6˯AD\G.0B HJ. I5=5"I_Q( O$0*q hriQY MeXb,`rbCI%WX+or *hUhheRz<̣q2 -DcAv fI Q4EC)KY`m䥧 7BvKۦ욜;@Tӝ}ѱn`WH͝P3ꇎyZP3 <=ccNn -g uH_4QFBG' :@~qKB;SLj69$oIMEA@YzR0WwZ -Ɩ旇5=L=itZ8fUNuk@mvA6ިY02ސck`"aƞ)ZхM -0U&' -Aqxrdz{; ua!,%&6/*0?`A4! 4p*/YyhgH}pbXkI5yM{;1Ia:OW`h)lT] 9bz lӻ|h.78t#@_ -lB[؉%4u!g`_]4\yA4o:R4S$ *<ï/{Z4`2@]% FBc(Tlu/q -3%L!._#0ALg|#nS8D!nT4N!^(o2c {TcT^~#OtSFТ\{4SCxWly -8Ϻx~*y}NFBCf V!zKS?=0Nsa<=6ϪHXHvK}=0} Qec˴gԦtldxD,V -h*x-7Nb6FKۗ?ANyHWWN!50ao[ٵ؇J%B6IɁbX]*صA,SKTrꀐ|DVG9^I8El\'\0?.!M!ߕxrʥ†k],h/\a5AbMjȾUw!~KwK&D/1twPfuni@b* E@ht95Omh d#Ws9+K, pH]Kyy fGA/Ox@;rˏvc#,-.qT#\#X$!zxz,Vl*R?v8q"#Ů;X^6y<~ޔi3rI0Q\͡! @#Rq7Zd.FZo&UaYrXH0@<z"=bf@")nFPx4I8%wԀ޵Aԡʋ̿S9 y<%ch㌫ |h wYệbp 4QfHƊŰ6= QqƔ\Mm^v}qW;]S9TRDoBfCf3&%vSZ[Bl_kSm1O6(hc/6.d0Hw۝ϗ; -K$PO8%pΩ-"ۄc4;kЦؘDۗ @ !:ZrU `jZhJyo]>ȩZgTCAz.*X@jO5 #M6D5MىRx<>ZCFG -w4]dKCqha s^r[)cIQz)nDz/ -UTj~c³k-99n hE̬9@B?@zx`4xdL4gN>F;! XFii+q/"H>c0&f'cN8ӓ"@6M6tuΉ\~/ĮȌ&Ţwu =0,3H~礙VAM~a y4)a0uƠEEZy+ b1*N - -E@Fh@Ε[l0(hQRِ@<y7bns ~S6f4ynb2oZ{Ls㠈"5C Y.Ͻir6aDzG|h[$0zF/iљyPYXNٻZp\Sg"`MGYnkgcAl(WFĔd$P9 -|5Hc7 q8=QHhd]EA9%P:Q>{-QEZI| -pZJ"܅}z>X1}3Ƀ\_39]5 \ !yF*܌C:Us5ޫqb׾T\#P`rH*9Hvzubn(T8ׯj8<=O~i:aG2e|fW7۾p HMS#E4(>O2mjF|D~ Ek>4h)˖?RvˤtsNy2b861 -j@\y>XJ1V|@b$1'^ZA"X£J$b1zй#~I&O[m *䃖j - 2.ސ^} celGd,J%Wׇcx5-ʝw^RaSo1b {Y&Fs} P8A02tD2qӿ82&IL`9"nT -*Z[UPVLDo_|>y1(* &6 ( ^&o_ -&ʗGqfAo҃W(ĔS(V=rB\"5%E̟N#-L9/5qt>stream -A\-#C" c㕰8NTx=`8b'?>.O_ZlkV'GcU"LeS*@[嘄2 ^6H5񓡖n8|Ԗ3ke>H +Re |xXth+(819P2:pSGe$j\uVjri?|7?gI]"p/?"(PK iIIbV+q394Gcp}c%츳 T$eŤ% }25gt}--dnπv`,au_KGsܝHӵiXŻAL".(B|I H rL9&3.qhA1 rڗ-p.%bdTl51V ȅ&u =E:CaFeeYfJT.А9MEU qܙt -PM%l'F,S6^Mm #"N5m9ty e;|pJtQ!A8Uƺ'[E09JhN޽'T Elj\94`T]DQƜLlcޞCՉP`IS{uD|J<̉( -n{V ǫ# !AI qGsT) -d+SAI)VE23 &%H91 k.')wHPE3`Ӆ z5Jf:\x3hnXD{2 - S8}m=j3lhkMxhb4 ->W@A4|̡5,Cn' BYWt|XQN_)e.6ܿj ^ -u|l$F>-D%"ꦆ5U# 8KIPKݫzN 7sO0lTo jk䎤B%Vyie"}TT6D3)x4IB\%5P\3azNܿӎ -!//ԥm,ZO銥`ÒQ6޴H>vc -i -YFlE?5pXC^k܀JZ -S!Vs_9d:\"Z.vpa%no|LLJy:*Sf|ԲRH]pEAV6ҴEߎܦȬT&y(f$D @` —~19Q7H^Gam >ɢ7 -AT!Mlн'50ǫ|E/Zsa~۾*jE#/GJТd= >̑V(pFcw{7/$TUa 9wÀTNQu{PmYjȿ.D4i4uŋ h&/H\7b# q{XH,I"O>nS ͤR*Mߍ*8I~ <:UC)ܒS m*T%L\]\o;!0xN,ysN3Xeiăc=KdOiqDX'ۜC8ߔ8U4;@[l0 ;z"8( br'0 !ڡ(BI74s L]$GfSɎt{ ?"vR -l*l$(T8,YGr,ꈇQXA9#9ﻵd? -ς~4elsB[j̽'>' qM^@;2d]0jȯu=#ٙ}a :7Jw\^-vKqz:oYeS.CS3op=yo$DőVr8 -ەz^_q$"n~=̂Zk%8 knG[`'{%rFƉ8ڈBVpN2mP Cz\~WcpD47"8:k7DAU-Bad`LB(sAP\GB w0ϔ T -,PTyk:[7cVpr(S<S+PD$]f5pY20weC邶QX^$q#k /CDef#lpP8!c{5sz+Hgh @IX|4LFDP$>7!hs|nPanR$vL:TYjrm;>$_aBH;[zn81;؉.s4lkOQPl%O§.<|H6o$zf2QP(fEIzJ @f\jwXqt,ӎv\’ AM'8Q"pfxedmɿW32)S;3,lKئg3a\B5k{)P 7X FG%Oa }0uAB';py1hoSw!?Bi M*玶f򐊍HhXQVj dXw'N{'^ -5 ɷV3laW5MUP>P| hLƬizj]Ag{4?ge&Yb+~#T5ۍerUP7n𩙦&Ew\ӱAB&3O'o,y]ޠ;quBrͦ6Cq; 4rwp[ GS]x |Ot -Wg<b.edwו+'ݹAyV0(A -c@S`FQ:5P8$&J8k7эܝ7ZaAۺBlZу~7E-9W3,?@?߽ĥuP[}_w}d3 -#m{dZRk:A' +{ӱ] P;aEKi+5Fd>iAɴ\Xp ̏"co~A0lFW,<췾D$NŵP+DDgԎSH&=Z`ٻ&.DMt-}w{`,_y&|M:贗:,2+D|KU4Hlasv,qSRQQ[ ^4e8V 2޲eHg wL<sl\[ʀ D1<l ol)M ;o#37<̵.T`FZ,^f4{4d^#{\i?t9 ю'(BKjK<>": -4h`?7<.rd)WF;"t-ITBOfe@h{ M%zF)hD0Y<ċxܕ,]14aC"Mu:IO⒓Ltzԩ6"҂lhnA<"+ -Kl kxhD%)Yv1$v9 `9Z2I^9@!馲D}_@#p|!QCs^ 8E¨^9XK!h㹸UЁGu4 3 iSO$V~x-"TI,9Ykqdr0?¡^'`oʒ`9o ŮctQ-A1nDc&TJmI -Hj%`te0:f[ݣV5\rFo0 [0"Si4Y"_|;YA(fFh(JÔ_cqc݊JSk+ z1 X 89tfhQϟh5ny}@y<whre!!Np;ez+daփ#}3Jh%f nfp-Z}}bmB횵TdWAe_Z}1Z#Łlҭ?Aȯs*a9 ,ѨNϼɯtԁ5e7SY^^ZGVLASVAo -_O >Ueq0HkL;Yvt؀uĊh'da1 x{DH|u4˃T%RZ=|:h> T }PaH64?$K KV &!y !/ "9!jdHB<%R B ܊IYW;P9)#K&Bb:.NجPZD'"zȈ PhDF]8B^D1DqGhN^A"XQ/ EBl HMd2jXMzHD-%& -}+ejwKRw 9,01qDddˤ Ծh"v4L|=`i\KLjfP z &' DdBIJcCMPQ<\at(a|EnNlE.Bgͪ5H[x5j,n&ΐ FJxCHĺАN[]~nšu^͗SE:CШd 40 bX69h2JQXX`@b'ƾ9oT>z@ k +ƿ+ +76]Pkc{ml۽Xb{J1ѧPd^(?r5ݘQ7ӳxLvGc賓tQrC[? uu~{)S^ [[7 +$ZKD ]B@ռ+soO$6~a5 }<_|"q907fAZ;4#'%/ 0:]HV?{CC}TBoH3}5O:^FFZizm/8Av8J]]z_^p>xҍ?|_BXcR>`CϷZvCdlק:+W|sٸ_Kl~z4~i {!5=J/Gg/$߸(Sh˽ưe~{JKOꯇ􎺁/v<[NRꆳ:,D%^*[fJIRr{ҷ@WB&*͞kˍgE(1HuV gp~ Gz fIggc ;t\L4.rÂJJTTΝ8N~HH"ByNRKvnYIMY6]bn Ѻ,<$v$\cSֽQɍPo7W;"5~سD,ܽ]{̚:,ZMGϟ*vnyKU&J>s'y>gΫ\= B(hU 1z_ |:6ýJ7jm06LfKH#cp@bdI +l8C=h7–(.ړPɴ{Vx 䳯=w|;;J%m]cc3gQu1U`R|\.B"^5obյ yzfx1E&IttBm?:$ ? 1-sPNFW=2MC Oێv* 6sX4}7 ^>&F$2a!J4:v[btQ TǨ{6LA}WMLARzE-~sH"_y*QQkۊJK="hNSk0|=\$g~q<t|Ht6 +Q)E:B,>/o}.)svp:Wƍana\Tu閪|MSr [mY sB==pp;/Aq +`{"R(z%\8h&{T8`|'a8G,?èu?ɩj Fe64a bsɉ %d^a9M˹/+UA I2NGh*Xi{ہ)-GXeVL> Hk,fE*6XdGQ(mK'kz +[Zj/{{KvNDeoE!!7B:|j90deJdmDoDw4)YjV\KDeT_ +E:i/KM. mLsp5'Y !~gAdJmԢL^huX+[6_~7T3M~w-j[j;_0U9faUxcgȄzCE}V݌؆H{];Q4(9W(4^Ő+]8U`Uԇ~_3 +Q҄,\e~HxLzHmϯ"a-?'$4a'E0'wD2 |]=&`vA3G}h -pMCߘA,%WN.CQ Cb "h| )aLv b:sT5uD`Mąu(ݠNw +D)G8§Eǖ9ڣBY>?۟J-pHn{?Ļn Ϋ BƩVCSW^Cw62`uKw4BqC +c9GFd_oaY=qXaWp7JYJ,9L+}BmΞV# Q9(fh˻ i֩Wx |.'Dn[{+}DW ۇApdZ&sI^E9Q|ݎTQj؜$I\ +Eۥ2]2?ndm\@u(ҶMdjub+t?Su2R+\>VV3!\!lrm5FҴ#Mƕ=ȴYl);܊0@p>kgqwɄ{*n> e =v-M/ L[H.gZ#CA!!l3|"c}53pԠ?E! pb[:/a(hӓveHԱ#(</:{(%Uh~f񆍄uDO hǁË`Pt.7UduNtsNeiM) q"x:&k\P1$ a;!ɩȕ[L"1 h&/4rP+bLmm\\;{;f%n46)oh"E)mt†,naGt'c0oKs.x|HT`WeAϱΡd=j2$ph!Na-H^|Ys$nb^p-^F1B8ԄBj2Lw!}A$x0 P,1t}@ŧĠ7nZp\!":QyޕvujZY>ǝ#2!/d, `|Qq!.K9|mBL!~&j 3nիV>etc~R!Pݺ^"ʹXc˸'.wuCBiA`v +cUzEM'Bh]*0P 8: 9J+=(M{Mh~ P`HQiEmej:dXX'̀=G{-U'7dH+IM^s _b7$>v_&:uIh|]@<@OI,! R9a&@9UTs: +}9 Z@6$0*ih|.[@߂)YMڛ pR^+k+C2˳} عŤ'k5 u;@^*3Llcv/Sr^.z9 HQ@"DFX[=UQ71e0IXp_;mC\O&:ZlR$/F|Pf`,LϞzb"-iryA0ߪ*&`w!"hvO$)M v SC _N5G@%tC}!0Gc-y +␼~vDdžjA @a(5/9L qAC6}&J[Vr*Sr^ưXMVZ%O5WqCçz/GkH&e~>w~kigrۘWf9t\o߅O< +ࣶ?^"ш>BzSG*+!JY)3r|Q,p&=` >i%d: q1CӓpDj!-QT%Zac]_<k(UQcVIEAKU5XoH>مvIvw +<$W^xw?_EZુLi1Nw{N_g)S~7q +G7ׅ,]Ksqӵ + ΞKQ9܏=-: 4]I׍ $,9Б +[E#`O N-b Šǜyx 44Id2)(<עVjhsK"5=k}i5&t /1&82Dw}T0+Y +kD$̎3^ÛSJlV48rbv icɊvQ2< d5EȿHjEA!|~}48|xŨNtP-F 8 hݲZIwr@\@[.sd^+n@yEh3V1Qz⻬]`Y4 j1EK)[b:3[F_POiö㍌ވ64ԅzĽg->5;8>\E9PvY|wi!6"V\ +endstream endobj 3650 0 obj <>stream +n{Sl 3W8gdLSiɗ]ሕ|@Ku_bvB(gT47Չ|xS +%'PY& +-R fQ˻_J.DՕ`UGC* +]o_Yډg)6Y5M>6 +_7 U٢XbεL1okDY)[sXڽ2}`ȼq: >+ HPDg @Pd$ qS ¿MJ~Y19*^ vL5) JZ} & +1x ;nڒ;JG +"0և= ʺGҖ\Pr4XD{rl)Y|mݵlhk6UaTO3.->+A> Ρ0!`f!,Wtsan%TwĨXN֯)0@Gqx_.Ù<6#/ubyr-QxEQqUQz|ޥj$zεU]N wɦ`7~ +V!ylн'50FϫE/Zs?,۶&j"/##Ңd=>̑V(`Fcwy7/$Xi1À$p.PmYjY_ D4i0u|ŋ h&8/H\ +7b># {PHO>nSͤR*Mߍ*8I~ \:UW)ܒS m(T%L\]\o;!0xf,yKj3Xqiăc=KdOɔqDX'9B8T81"#ޜvi;DW0 ;2EvP bq'1!ۡBIcn@s J$7;nSiδ{ ?vRm*l$(T8,ZG2,Q_R+8#OﻵɘEd?f4ulUsB[j='' aqM^}0;6d1jȯu%#ٙua :7Jw\~-vK1r:mYeQ.CS3Oz odN> +ە:e_q$"m~;´%8/{E[`'kNKrFƉ0ڈB`NmPBz^~S/Kcp57ř"<:‹kkDA^]-N!`ad`BsP\z%GB w0)3 +/Pf16{k:^Ƭ`r苨*Sk ﮚ5BG#89[_Lg`_N%?}RwphI' w])t/k@@ c֊ݯPJ?)%Jb]p!`yM Yn 0?MePIҊ]~.L8Sir0obcXMGV[%a% +r LċO&qH + +E0ЍjDњ",J+ 3f^%>SwfXؖE(Mg7Dk9R@(.oNCKrQ& a똯"'!wN8 wd]о$"&A8ӘH3λõ(w"<3#A#+$)PO{,5CEG j䞉KA?"`fFgMYcO! pegY[Pj>%OiV '4:yDJn@Mm4l-.I AO%#,0q*\MBK!VW&W3RKƣۯ]EAg@s ᬥ߈GorwBܠm}e07o +wc!&~$\|܂X^G:.:PCn]lqH*(ꏴUIHA˶Nun K{ bV覮ZMv1KC/9rP17' +lȺs}ZÁ?xA@]^Dzd;:KB]ǯ IR;N!z je0e7|=FHYU^J-U ՚vٱnƥQLJG3Gm-hr +ɳSujlRxʦJhN,#%}cd294W^Ḇq-)sQ 7XT%67-o2R:bs3RSjalG){ѯΒZzqe,Y$v<.)/F7FV^6ckp/aʝ*\HOY yp*iRCr P75r0jd/^qWttӄ MҊ4Uh$=JN4xV. 5";KꄙQI_9]_d n|LCi'm 6o@f/@ P%vpMG{=]@ͨKɟa2$+3R9@*65i-[ï(I@0B klZq ,nďUXF*#22ñ<3IM$9*IGPوH -͗n(,!6lIp'd5څwĐ64:sÆ#h p$I + rd(kM ͙|G{=" :4]m. Ҥj@$π41N6ڒcpS-Fbh#+ hwPDtbǝJxE%(KEi'uFvRqr"1ABtLǗRj >v&%U"`#!\DܙvnwZr.ϟ JsEUL,WOÈ2NHsd\;L^F4B m;W({"_^ to`pŒ:g03=@ԤEqi) )s);m\M' j)8P+ᛑ7~{Ƀkё%uu+ve2D)D)C{ Lsk/g@ut 90h{$g_Љ]zgٲ_]VW8@i,"?Jr +__~Ucq0HkL;Yvt؀uĊh'da1 {DH|u4˃T%RZ=|:h> T }PaH64?$K KV &!y !/ "9!jdHB<%R B ܊IYW;P9)#K&Bb:.NجPZD'"zȈ PhDF]8B^D1DqGhN^A"XQd EBl HMd2jXMzHD-%& +}+ejwKRw 9,01qDddˤ Ծh"v4L|=`i\KLjfP zm&' DdBIJcRxS u<)YƐ##HA_ٰIsv5je35a?"1ArȀ)r6^_Pum"m#(~BB'r`tgd75w6Ld^o?+XpTP!ñ C\DdH2Dpe9\?$cՇU{HC9yc$va!4:dht!0ߐkC:.֐ԑ>"k2x&Ct#ŐMÎGfG/SP۱5 );]!;rB;R#C!q 9R<Η LGGG<ϟǀXBN#zD <( 7Gl=q  R2d6i`:)z} #BO~K? ȏb$Ł@?4OcM`$+ ĖPE Ԁy@ڸQ-;R=@ " @`$ -iOgr$ALOڣe,T#BI JFvQkS3hyr@;:"!Z]6!#G9 -OsMH։rB+2hy% Xrg nt%w-IXg<% DL1Knތ4D&`4cc43(d3f,LΤ[:r&/c$4 v&y[j,˸&+dMeoRƊ7INg&#%ÄS;w#vE=CFD#A򨣷y14Ǩ''I:*DN5Fu1~T1,wтbL AɑGnaV:`G t;t)m''Wz$s0˜`H' $`Š`N։ q~u/F'<1~Q:yi_,Y: 6c":10,gtAECzѝyA3'@"VŚ'˻8s2]hIs_]B'-.r.+|Nd5n&X.,o e bD'N bOLDh ~[,עE~@ZH J0jD(IM5B,3hQ(YlF#gZcQU%XRIGIv,>2h3^RLGRo^@94}/Hh? x'ZnD8̴!^t$ Cc̿/ QaDhF>RxS u<)YƐ##HA_ٰIsv5je35a?"1ArȀ)r6^_Pum"m#(~BB'r`tgd75w6Ld^o?+XpTP!ñ C\DdH2Dpe9\?$cՇU{HC9yc$va!4:dht!0ߐkC:.֐ԑ>"k2x&Ct#ŐMÎGfG/SP۱5 );]!;rB;R#C!q 9R<Η LGGG<ϟǀXBN#zD <( 7Gl=q  R2d6i`:)z} #BO~K? ȏb$Ł@?4OcM`$+ ĦPE Ԁy@ڸQ-;R=@ " @`$ +i7Ohq$ALOڣe,T#BI JFvQkS3hyr@;:"!Z]6!#G9 -OsMH։rB+2h9^R XZ4: --ZI\-E3iS:PBNdSːjYnbMb0k3jBMDMgU?a&#ŧ4rjBXԿ`^-bl002\ۢKnvaya]5$[E"\0$q0#Dை44ո3#\v2G-X.ȷ\ -_ш=U3V.jDBsQ\uCfDtF`-`t˥,TˠEDh䢘eӴՂ1#@"idbшYׂF@\KЦT#xrIcш53bhl7a&%_Ȋ("PT\lˀ ]G QDyX"p*EQ{"DL/A_b`Ej_n /B|!J`y~!09vI-e&l`܍"hB$` FEaG'̵د0 6 &`HoA \Ra$kbR!8#|rĘK f71I(& ^dgbr^C!ƘN1756&!Ǩ~cCC혝W}ؑ߇?FaB9BFj}`"# |dˆ_22b(Nf!{p1$Q.TD -!ˬm2?c[_F3I4[<(23!%uLǗãm7n¹mpA:Jμ_I7q:}}eic@zCӁ$4_C3lt%t@,g(9G9 ( r(ei*cbI}494;`AVNa'z5&!@J45҅4 jzj7<kzxmoPrY.oC^fkdՆK`6tX؜B6aб ~ xM6q]^6lXfjؐR ݕ6^G p:\al3T4nFfJ47@BIh Sb3l3bmMnt x'3H|>(zlV%9XMPBl27 $$8W#8qc#`Iƫ51{-<'I@gqtbk~aH -7|ͅl/ar ϡЙ }Y]d bgp;sVB9ӣPC s₮/\s^z[qę-l1:i] y-تtU {s2-x:`hḨ@>u,daM::}OpE׹ +Ztg'*UP׫/+פX9Se%HQq$*Ҋ,P1Z9%o+< \ISJBKW0ma)~ +u.SlaS"iȹ+Q6Äͣ%TT)"XJ((cn눌"[-, R ,(ٕeQ,o-͒, +Ai5 +\(zـ7?[|'.eU +;- + ҒyuZj<1=bmz'Sډ}|-O-e CDd*u$-Ę181"LDM,:a> XZ4: +-ZI\-E3iS:PxBNdSːjYnbMb0k3jBMDMgU?a&#ŧ4rjBXԿ`^-bl002\ۢKnvaya]5$[E"\0 q0#ை44ո3#\v2G-X.ȷ\ +_ш=U3V.jDBsQ\uCfDtF`-`t˥,TˠEDh䢘eӴՂ1#@"idbшYF@\tKT#0rIcш53bhl7a&%_Ȋ("PT\lˀ ]G QDyX"p*EQ{"DL/A_b`Ej_n /B|!J`y~!09vI-l&l`܍"hB$` FEaG'̵د0 6 &`HoA \Ra$kbR)8#|sĘK f71I(& Zhgb^A;Ƙ⎞1756&!Ǩ~cCC혝W}ؑ߇*?FaB9BFj}`"# |dˆ_22b(Nf!{p=$Q.TD +!ˬm2?É[_F3I4[<(23!%uLǗãm7n¹mpA:Jμ_I7q:}}}ic@T $4_C3lt%t@,g(9G9 ( r(ei*cbI}494;`Va'5&!@J45҅4 jzj7<i:zxmoPrY.oC^fkdՆK`6tX؜ЩB6aб ~ xM6q]^6lXfjؐR ݕ6^G p:\al3T4nFfJ47@BIh S3l3bmMnt x'3H|>(zlV%XMPBl27 $$8Ws#8qc#`Iƫ51{E<'I@gqtbk

~aH +7|ͅl/ar ϡЙ }Y]d bgp;sVB9$ӣPCks₮/\s^z[qę-l1:i] y-تtU {s2-x:`hḨ@>u,daM::}OpE׹ |\+ ;Peg/W@;O+ <ΓUv49 m; U0C2@HaOGQOrmU4*6 5VOa.w8F -M!җFh!uN˽<)MG"0 . !$8)RCLB1;]~#R!^lApEgӭJI/!s-q/! fe&Ûp_h;p_^dY7A7d Ik.b=OXF;X`N‰/ɕFb7ȉUfN% _yZ+N`etk:_q㦣S3 -"U>1@răDbx|,UXB?Cp}#j҃4'V}S(* (u6ܼD@&n-@U#LwAT:o(PsʰA UYweɹ `]w4F̓!PrnQw?΀Ŝ<RU"ܢ-j]hrCܒ2TA lSPjj BA`N C> ޘ Aj@٥1Uօ8\@0Q -܀ڞpƶw?&r ˕0̯* T?'&[' Ebha9]0Ps9 XV@U{O|JVOO-z6rf%+K#L d_ Xs.;PzH DtEϾ@a -mz7 n?-M[.%Z@& e↨OOK)V3ް`<SAp*ծzL@Yu@LV_KFU$^6vej*(Uvq"TI<*? P2H3MAG`] -R%g#"AxMD-iJ"(Gh< `mnc{( \pqf N~1tf5?nqt$b7xeDZ&8;$ѱ,4@IH$6)b_DE#g̞Hȃg~^Xv.2Bs(rE.HƝo RNhH&8!A9`-/fDaSRY+@.u.DԘC> -,c61^lϣf@ -{!`:+ꌌi~7Ɓy|+`XGS@#b{[G*0^eO8y¨emⶶ+*.jP pǔU~WH)>@ 0*4f&|6LS e&\C/r9,sD"NW`dԭRk΋Ű_1{H"G(dގF^T w~&6/9̂6v*O* a]M>L`^QuR8aK ^l!Jĸ"mbÄ$0G뀭 lZp=dŻr&-<@)mnL K|'uSC2 Pz -v7TEq`aASwl8S$ފ< t|[T699/Z1ˋlZ 8cD4}yՀXk>O L(f6qljڑ+Bs¦0 Uo2H} ۱kt-eƐX@G)޸z -oL6ֵD%O햫 jeU9'F ie\!x -9)mF QxnjwVS8>a((f]>Jh{) \1>dy h J Cp̓|+^ #+t5U HV`NpjM01 ڝ~%C S$]X/ 2*‘`V̝#@qb`H M(2W6,϶YIja<5.ȧ X>h+[qYts FJI!H_ ?=O$Ik+cdsOGn[ؘ0s7)4,u(au)_<  pzt~, .wl Ht:.bߏF(3)@r U#g'2X --LxHrSb+$8? X:v ܂SLr>j95.c+clos`-h:컮t2E܃12wrpdl4c/Rc↸ >=pHeY@P16޿iR`n7xzJ /oGܿ3Nӿm -j~oy-*9{QFʿ =tb9^wLBJյY jī3AYk۶;Jg - ( Hǣz-JbfOo -=|[E@m64F V?FjL}DO81LMKGstW _t Nu$Ŷ fk:Mf?2_:xe -MN9ǡ_J|||M ǘg^3W4IHu0Tc˖2懿xV޹h )],m?8YQV].߸ŵ^S#OH_ Pj"c|U)Ls8 8ɡP;W]fUE$:}K'{!Zi{r}3LS>*~'CN}=pj?ˏW,6{@%ew%J0w%U \ie% msP[vchmCx`nU#Q;C؅ݟ d$:~m| iw\6+S$Q dZ SrO^(7'PQ۔!| /OkoF6F=~=D(Fw@cN&2ʠzfrn-ʵuFZfF"s1Z ?LON9*z)<_IܨyrwiHq-Ii abn~fP5gqƘK)Sч#J -q!T/qnumWb#A %_v%o"/4rĕsHЮQv:JQTވ1 )sдfe9J*C X2QqΑC1$.o`4 D^4^{׫ծ%X @< 卙R#h wgpYuMW`5? IDX mF@=ͅsl||LYa>)J=FZYalf-T]>a4BFqXosS$f[&=*RY#&8,r56y7 :ؿ;nɻ1r,SFĂ|s%J'LN90|=:pc|UuoBp?}Ĥ;~2b9:0\! ^@ֻmcYKW" -ǔj-s*k|oŪYF--c^;4`3,ŗ֪;~k#,&?A$>)f7;C|jv/^ux y7P ;n11|R$P}36> @#ZVP[+ԣŊ_!}aQʣEˢ6-ؗ2 -l)x9GBWʙG{X>Rs"Կ x  -sߣNfT``e{Ho>{ʜd—+^J+i/F_n^:LwKuDv -nϦkz֝_.a_"z{"3 -;Li7y^5uojCks|c -A [QYRȧ`̖Xso(#ck<Ҳ}~lgPxdf*+-{򏉸4{I0Stn⎛]*=x)a}«) *rbKpDju%liM' ş`dt`#ZڻJ[^w(E^Y.MK)BhW"o NB <;qM8.qx/Э~hvmz4ƽ/(L(pClx+T~*Z[Xi=o['>,%a쀛}mLi1H/ɸSM-,{y]GK]M;0jAEHףaT>-h?euDÌ ]K9;P"qPrhu(K -zPoP[Au!FdftP?#A}SC񪗚f=AAT swq g$t IT=}ްN/# -=NJUWdZto2{Ll)c7&zVkX}a^qG>%JHa'?wAj/_?wqH 3O%G6IZsPⱽ44@N#ߣX<4DdϟwLvچ¶ft\cZN'ykS9rJ2o埧x/Ur"0ZH'y98QJFx0bngEcސ}*G*sN\49޿Sއ1fRlܸ9d5@~W* Jsp~QÀ_ρ>yPeJ$Q/,UҖ!s[Dc -1Oa!Ĝ/2 1_=(1bj5͘cIxaq߫gSYq_}\vRڲǮk>c^ĭ>$3oz1%g -IՓ>bgB0Id̓p'D-1 daa#(i`i-j?WقU *\=I\{eA><4awFl3W-0S>l0 bvs`^9^qj ҉&@̷jIBpy82?ùʘ{' d^o֬iJ9-ISc_+z3؀{/Ϥ"۱Y›WJG̉ T %D}5)K03\ƺcc߫vHױ1oY=kW޼q~;%ۇ.D"u<8bTʒ2?*˪)L;PDq&;(*z?oyBw^Hy -fqT"yxKgoղWTaf8 L3+5/p(7r >|R(h/F"t$P _aþT;7I;I0H8܃}8\jJ!a#\{OdW#<o)WM2ϭ# 0vUPa>9R?f`-l7%񨁆+qFYFx^A _䌣>[e&s.-cbqX7B#&zqer-)ﴝRE'ihqeˉ1-_c=uXl+^.HH#8Hh/'ilEtIK_"0RϷ`oSr,I:</L;{$<ӛvB\k%C \,N =g=5G~.XiB W?HUC~Só%r!]n' 'jˌ)u{U"|s@J .ԫ;h[N"PBO{ۤn|x -¹>PIP?fz"Yi<#˂teNq2/@t*s~SXڑҦ5)Og[+>!Qpy%ԁܢ9xb#:} P0wL?8eiyomv'd_IB:|sw}FԳOcjyMD>n<5hƷz.JE:u9Wv&'I^At#}?`W/"@ #hL^wMo5 2^ln4{TeuHqko>ɽ-JoU_],Fow8 N)//jpoA9 7nܥ] Y`!i ;?q^D=3a v0}JfW2ww^[;$ݸDwP|[TlrHd;sF#CUD!;ٽvg[xp3Ӕoݑ$JIVkt;qh4{lt'ɍXItК[Gs۩+Sqs$$ka a2pmRQ8H,*T9 0\7$. N= -~-a$q~iÍ%+T`-l9!bpCc aېVvo7ZRԖ3Bjrsѱn?!Trr{0rզ0p@J -76ԞM$5#m+_َzRlk%'$tA7U.]EDa B,Te8"3ƱlAڠ) Fboh@Ɓx"]P2Bh &nc΁i$";­^2iW@:]uGj6->H 1;Ta٥H| cܼ'|,9{`uم&ޢP%xDuؖ^m0o@mM;7 Ptl&۳U엄:+Q5('e^ -VO6dGVwl.i)U؈;~V軱 g~#RCy3ZjC\\=;:)65 b?Jlx _ODž.S}x~RcоxG2 [q ;B6zR9ǪͯO;?Hs]}[ 윶e M֍Qt8{l|=UU~h,5b\{e#ϴ^kh4o~u]9ZЉmdVGk uc]g -c))&(/_Z 3>GАS - ,Z]bL`ui53kπF.>u`SFc=<#Đ!:ʘتLcXk;xE2֢zܳw[j%BH ^U ehX9!ָ|p^4 Ě'\wYtὃ|N*X:2-!e:I'B> /Tֽ!# Is#*K).bFO>g9 XfΈ d -WF"ֿجPE.b}OF2%ZRrXk V(NCoqc F|&˺0XCܢkDf}`]j]֒jR0}(l=v~<]X«ͲV3O*`*qus [(kŏfn P>_jscVT8u4@ӂt蘆Uѕ -"TCu\ږ%HUZ6TTS-.i"<*,\WJFX!u]T}iE$Htޫ(셒Du5X^<+@YuH{dڡrب0AoSOGwՇQ.zG-)HбMd.ǁb=Al:[X3%| +L;3NCiS~>ށ)! B}--l<7.vSYot/2)w3}M5}Bt7 -N_͠nny?a<LGHX"(dtq\9,TEu"T@XJ+3jJ]Xd%ʪ*US(Z^q}W/fޫ`, ue +M!җFh!u~˽<)MG"ӡ +/BdL`E^,8@Z ‹@ +ڣgϋ/e#T4ɋpZm .&=Z?n"Ё{Bq..^_ Ob-"p ,l(S!hq*@7cR +$u*•T3S+a*–R0Sjǃ"pqT^+2>An ! +"Z@ʑ "$]YN@D,3fwV!sՍ<]OԔ[?>p7SRC!bv"+u4"*Bp^l +ʦ{]Bکqy! fe&c_i"=vz_^*X7BAk= Ik.8Ov!Y;H`/ɕF4&F{7hUee% 0 xA UM`dtli tP_qMA-G3E>xăhp{DboXZXBGԫCp-ji'KN]* (uyiLn-@UFGhN'; ?@PmN{Q]weɺ:A_wF&̓9MXnn0EQw=΀96ɜ&ShU2ܢMC9`*&\2\A;Ɲv$SPjA4 C*}֢0vbj@ٵǩ#U`wܟ@0! +<ޞpKƶ w K ?0H&p ̡d}D!FlkDO w./R»H=F#]6 Z8('H,,,L%b@Ѐu]مM5TcMk5XzASHåa•\}\iZݘksFrG |}|zcwss[b?& +r  >ʕ0ܯo+ T?'M. ubxa9=;`s +XMV@C{j|JVOG Qrf'K"D< vdO Xs +:ׂϬPAem6 Z?-&bY Z'Q΂pCK gaX  @L馠L`. ,)K%QgA& +4,X%U +GX4`5=`.pKE y'P~3]~Js3n v$kpy˩\ᶶ+*V,\ ܖ6VhӲdLEI@IoYFDzJtzf 2 Cb( 9p._oqp`b(FE/a$^0 x28ꖬ;p hUJP7CFp]&Vс_|i`# }ݮW/@(KF1;-yx/G[~uEk 刁oZEp@"2o-oL.[/+]!tU6 |.`UШ8Mb3QMRvY ^=G%}X`rD<] + P[)KלJt +|Z~cօT)PD,(AyQ@3{)cB7/ Ѕ 4($VX3 .m1 lN&f“)f2uzEILϖ@F,H2A,MnN^dˋ23| $k" ($D15l 9z_6Gs!~UԡSO / M:Ȁ@Q7(> Po MݷLB'q+m8:u|/[?Dk]ƀc/,ge7̏9f~!U"͇$E.WC{t;'kGnc +)F 6HЖW=A# O0oǁO8k1#b%:ox87k$+k1ТZv[VUVȟ MWp^ +ovD@z(**z'@GB-YMYNr[Ƈ|hk5*i_'R%O%-"$O7x3'`s+j`MW]@'+#]MhS8*5[ĄȂhL+ta7H@I4WGFbT&WBlj#`"Jdc =Ray `Y Ht?MEWAN82ʦK_@MvWJ|  Ivy&KZۇ@\1 oˏM%>8pdt^6eHEC Kۦ<ۢ<úkكd'S%vo{'m$J]2"AzKqC7B{k^E66}4]ip4 xTB:!Whc6?-pSi]_ ot!_crhD) [?Ф^O鈈?Ꟶ\E~I\G45Qlퟯx@k}PɩwXp8O/o]R`Wb~fJP~&)Tw<`kCr,k4?w^Qwb~!ˋ5|0h5 կ kJyoub J_5~0π*o{a'5/=jKAZrxuBǡ: x]y#` 1 q]2o}%S4q^Y|(i}iS=Zgr򘭢f[ ~dlEձCX+6ϣ~7BDr8 { g m&v\NnqgnQtAՆXzSSxtc~:[_\q< 0EqP=o33\=΢Mz$,|:EN?"O}_U "|1[[?16oF'U7Nא6n4ikS Ewj 4 l3?|bV'GFo]~Џ} d,>)]*i +OKфUVӔΧ +/-mJ.7ӍJn#족lch2)neFHW鹼+>M3jyrͺG a#{?ߧ X9&a-s +o)`cw +/$nռo4>ڸMZO1 kp +u?&;^'UO6}!qM-'5,h'.ծ MokW7;[iAoo=o»X%6/{A QܫfɸOb}L%aglF-Οy~w"NZغY$In߭sA~USh0֚peo<~ +4v6kr3_K)z(K}H-2UPf}KO_U0[#I#=EaG iSƮQE (Tїh~sL̅\m}>, NҴ>:V e=@>~dPo q.LY藩K_AS_HmzcrV!)ӥejQ ?g`$nPn%v髱XN}ԠibN + /M%o"RkrJsHP(r:Q("oD8QCzT2z9JDCV bCEȎXYi`͡}70@o "+`CRoFWjˍ܇mDM^0΋uN@a)43~ѳp)|:i[QPŷ߷ 􂞢yXX# al|P>Dau^E# lEv.a4BuM8(i'cs{s)}R;u#})Ɓ,xgs{E\EtiZԿ;0nɻq" s;%H3*}tdDBhn0Dnj~?! ٽ|2T9Ʉ.m,^ z1 zǽ4]s.r겕2x_ &,#;ZHIݕe:{#ڭ\*d`l$f/Tew/0$\!o6Ƚg^ОH)XtL gIOWSgQFS;yhƥUukΠ͸UVW +.qiaaJa7l{R"#CW{עPg T:_o NZ?Ps7#^9G:&SwhS=<Q(݊u\FSl 8ѮD@&h'^%@yv>'Zq\=dP[}*@?i{١P*{T!5~%V2z Q}TYJ7'v;ژb(-^Ǒq㧰SX޿ *uUvjLa&CՂn ]yèLnP4~<kEoZrvJJ/=5<>YI] +aYp_]/ ~O +(UE @)^d@Ɔ`;XE&a>9=C)OO}FM]_ +MbÿGR? DWd$=2ySfK{a9%As*_Pkl'SzAQPPMe~< +V1`ӻ);൅<̠}Vhk֝AjHP(_O [Vj}|#..-A98v3NtPft;AQbUmQq*AEnԕT7UA`*VN b[^DvJ;K;$=tƟt🩧P1t'"RaH{Z< k";(hD8} +#KRWQTͦsZ@ӱ{czv 0$`t XCX{aJ +(Y|.h_s vόػWtw| +>˹7~0$(Thj=w'k|ѹ&[-$wGQMw5D7L~m]@?<>c6HwjB'?@G{ekCĞAR Aw1^'чȪ +r+F!]> =BM +kN>ωaoאR9u:( j'% rQи(10.a-1nI/ ބ?5r Q#gs rcJdME/9V/WCi;d݂n#<"|u?ˡmwyԊ?ُ0OIia~`|7R930#>s6ܙ9RE;p2^5!ݝ> 3bƭ}'||ip8w + dÃ*WTB&vyg`gB4<]ۂ :Xn.3^~ +!|9ejAgkWL ^8cΈ +3沓Rv]0no'91}g;~T=g? ǭyM`0;w94ߌΒ^sԙ+|-Xrm@y>̵WC|Cv2a>Ւn:cIsQ~!V +?m09`> ew-`.'=>a| +$&#c<0pRB͚Ę4117=L B%>|Ŭt͐I:pPz9MdWJB +3e?61`-j +Z˗U}몮 drЅTC`0[#SYRZR@ei5凉r]bvH9dZ-ܯ@/ '-/W }#v&ҫiOaSnw9dry5O,n[fuV*CeIrJZ`[Z@ Y,F+Շ@z" +0xH䢮$rdAc!Sy8WxdnL2& +2|,  Nˠx`wCwIAkgsc$ syMvA&+t,΢ +* SK'B \㡅zv~6k!ne5^W+辠$9㐸O.,d|+@G`֍慉^\@\K;mTlkcZnr"mLWXO_7[Š˿*H)N>$!ZSz7Gwď+X[┢y+IF`.F mE1W/M֝53~Pý%8K+yF*pYO(︟ V:såU5-Đlɥ_HWE2 gJ]ae߲ +Op6w29N876ip?̃ހHV4t ]f ->{/ܟVev)~MVJ8o~q-z^}u6`s2^xncFg=d*NYpޛ-aF] us[*ytKik~e=\\pM[nIB +3iBX4@Oq ڻqL~OK%u5ջV-D4y2unP[P6Q]9$ڎt#Òh. W)88i[wI$ruK6rsԝx`Q=K#CF,$uhͭ@tܹTBȕI00en^8[6b)(wmhOry *yfyw 'j0 VF]i*E1!ñðmȋŌ~+6KɛM-)va!49$XNlˢNQ+39*S|(p MJ96ԞMd m+_v$R=)6oӒm&INl/WU#O~F@#" mXrUO}Lm%@B5og/3+Hjos),Ԇ -}LPXL.X9C Xj4@棬 ܓV*֫+fkUI~k$[7 -Vhe/os Iyj@kC]0j417r)=\Tx}pPaY`@g#RF} ޙWK|q_!+^, !ў -x#O402 -XR*Ͱ_mên zN d,,Z{̱Z[`L8oKk|_elRơark-֏^fSe dq~U=q3 w13u?Y5Z7{ 3Yw2$;zֈNၴ=eJ˕&ndx۝v2wdk19Nj Dpgh-V޼6 -*r1D [e{paq LpbAl L絕Z{ 9[p"3VC[ ca{@E]'Ԑ kpٰ%7\H\ t56nChx'c]Rז )dk͝%[ ng%{BXnYvѣn%}VW?Z7]!Rfr1My v]ipJ. ]>} (HNS <5T1Lj͈g75"HM s<1 >tYnJ0EX]_(8aU)[a9J-,!Z4|Mr4|熷Ú4ձ;xƄe7ĎeN7F k:7qy#䣡w,m03= -?GQU#ǶtOǙ9os$Z0AMOx сݬTudOg{M L\ĝX*ToLej 2Mr<_ieAx R6Uny]g1nIpt`Ac NŚ:Bq{_2D xgD="lo)R=h$RP>?Y+_OR?)]>gPD)Cį:XN=qSU6n26:"ޝyrhijNG2eSx9`0uhh#pǚ$v~ wk,VjR&'.ԣ>!Vy+<=/m;Eu8Kc˦,eRz7Dz:4v{{x7n82¾ӯnb3n +sڝ&Y+ӎpgk&ү~SJQ.E{B]}zxKm&Au/n(1>{9tèz>٫4_KjޣT1lSvl]f-:lWDgfӉYM};N]6zEW,6Ψj2(xo  QaD)QA@eZUS<6:nl|™߈k2vތNn{rqM؏[1>0#fhדq!a"8vgi0}/lRQh`–{Bv4>ܱjk]ov;Ҝ.ľvA[wYfu#T{:>׍@6rO/6rXaا)2h\[s4Gy4\y]ԮlE62)ݵ:dǮ3LuIn_]W&1zr>j8SP*\oe4|!C2'Y#ybpBcaY~9:r^ ,5cM!/ʸX#koe!InQc5~GY.AS/XkIAC52+X x;P?._,«dY3'N?UVEK 8IzV-5G }[FV4WWJ׊̹Htܫ셒Du5X^<+@YuH~dڡrب0@o]NGՇQ.G- )HЅ.ÁbAl:[X3%| [L;+ϙJM L aJ+jnQhjqi +X?4qL.$LΒza.H5M0״JknӻQp*,~P{ Q f1BXa1Dz2Tl}jSTVy>M\Pqbo)cga +wz>v˅Kd̑dWYPv5ؗ&m O~,ɟ&be0ZM뗝\Q'>p?^]^<(n {0{A{er'cmH٦\)-2"wܑ ż{ղUHxu[kBݑڴ`{bPS 60Hc1k+aZDjx*w,nΰV?Xzp cw{ު#b,Y!\Ú+]o6\Ғjŵ mSѲxdIg-NU\6+vno~)ޟJR9ౄ.4݁hF>hX]vth GnDmߚcgI 5:s.\Xl5wECz9}wQʀWo +N/pjcPNe+*m^!Asϻh=zTWg+2J*6=bu/29~h/Vwt_宙9ઙb~~LזtbQnG t+wҾq/`VG>-`-!`0'KF܈*3+àQ$1SAnϸ7x=M{Y[%__ÿtd*^6Wujr\zCxa61nϞ1Ðh(\J d ;q9PބuN|ޱA$w2SI=51H0rw OS18dl!2n].l7e]|ѕ1l6eeA}PK@&UJhҁ! +y NŚ:Bq{_2D xgD="lo)R=h$RP>?Y+_OR?)]>gPD)Cį:XN=qSU6n26:"ޝyrhijNG2eSx9`0uhh#pǚ$v~ wk,VjR&'.ԣ>!Vy+<=/m;Eu8Kc˦,eRz7Dz:4v{{x7n82¾ӯnb3n Ya} &H̃C' |M|i>9*O|.>_ T-m ׀> -@Gs@ev;\JS<C!D+]XgZCG':tS3]VĠޫF궾"'7U?`_'QG*|S[ˏ2?1Tnrm#bn7mwH e耺䐃s)lxwŢY٬/ M)&iǣ >8% _!|Q~?(_|S>GoOg)|W>o|NĘh6j<8A_AᮀҌ"Q3ϼ44!>2pM6ORÐ3-Hټˠ*2x!@ o 6m> »|/H'Ļhj4W0cyn Ӯ!3,Cf9Uq]čUj;6~ ̈́vjPJXEջ7@j[KE%ߕb?%y8 ZV>ղWV+x'n2 8Ld#awgb$"%\'HE:Bh19>Pf;AAȆdY'jV!o i ]Q<9u:-$A޹4'm~8J%.,l(/m"lk(]gynymg&F99^B0AT\1 zThpO?|Ļ+PphP~+wt:=_2K_-Hg# I915ZKr=w n.m 667L`ML72=o3ODk,qlAaT1YY>$@$adtYI}9>dDu#?lU=X $&]ioh䄘eX}q'Ѭ!'ĩlx9N&7i =gG%3T@zMg/~ǭ) >m&RjiX1(i(g[w dW&X9N -) dB!;f[eS_4'aةtP_JfnjF*^UU_.6H"X_,]$+ 4njb%Jpsh-ŭ3gxiI 08IuǞ^"RSNW@7sNe]@.ׁ4A-!w~ۆ:, }]?E>W^Fx e "2! t!! BEBZ__,\0 -ett5$T$tdBV# [F.hmi i]* -:pÅ ]EE0PP$dV+ . Ie(`D䣖eA) g!, X@>|@W^Fx e "2! t!!"!/ [F.} Y2 +:: +* +:Eth+ё- [\A]F.tyaB. BEE0PP$dV+ . Ie(`DeDdHH DA0xy y YҺeȇLk 6-VYVٓЅ$.3.uBD[,p]uttP".-!-". OZZ$ >,`hTKMF0 hiA_aT1lpBp'SiU' [| gNdO0͠\rvs[bw4n86MMb@O ,k xGGm7g LJ`ax4O ik>Ͽ'NvoOfh0<}n=x< Nc&D>AEam#[xx X1XY C3cvkbq!-s~MbݮXr1x1,Kv ,TZ%m#vKre+SqOƶjf|D`z?VOA87ZS)ҖPIOf5b7v+X9Cm,VatD9h9>4}'m#wVHHTQ?bwؙ\k<.wʗ{ȵdV@< e"Yg cCaDdc 4 AXx|2#(HAQH@Q)i%mSt -`i(Š6lIʔd679G t9ii;V;3iu99ImɜVڜ4zQnaW(1tNv3|@tV e-"a9 Эx֗ZCd%):1@Z( LM'0;$ VŲī9gk9MVm -'HMX{2 \t`nTkaԯz.2V)#IGRgzB9J^ oTtmxYeHl?lu6{yW ?QN73:rvZrVE<(s4>= \5<`e{4*u\h{`^9'pq׼=1pҪ_Z~{#\]>ϢXwR,yɭe ﰟ58[c'S~1|uɩu7?st -ڈIwϚ(qgo%zV,)E]|v.d`y8Ww/D| 9Y1z4gx8@,Nv}]qQB?dgF--cPAlϊO=D}&G9Ϛ[% ח{}"~orzIa k¿R*7rop#٘Uͳ-}-70肧jO NDGq>KsSߟu>zkfɃ9mԏ`_kr`B?| 1 cn(jU׹W_xevP_goFV=W Yy^sCfKguUI*g"=izR6L31͎~[rq?A=G[׵+' ì\:3YD/ H}1QdqSGg-usEP]<^Q_C:?;iXk2Źy졫ÙR8!O؂ݧ;䦨={FIwWi }K aС&{Gŧ+j5Nמ@Nǝ'aA2T,v J -ӭpWa}>cvP?g"W\AP~RHER}%)f 3rDn[wAG[ԠI @AEFkʦAC_dpa^X9߻ﵤ J\.'&gWh4:V*,8=H܆I$[Rl"y k 8:rgA+$$Z172551d9-9ef3-4ed2-bbc1-3f2ea79f1f84336d1063-e4b3-4c2c-bf11-1cab41a000d99 670.2523fe3bec4-4b95-4332-9b12-a4179f8af2da84f846b4-97b6-42d5-897a-4f6e51d87d6485546125237-e287865f-b4ad-42d4-ac77-1898149a59cdd9630ac-5672-464b-bdb9-a8e30fa3deb543.ml10SVGFilter +>,Kv ,TZ%m#vKre+SqOƶjf|D`z?VOA87ZS)ҖPIOf5b7v+X9Cm,VatD9h9>4}'m#wVHHTQ?bwؙ\k<.wʗ{ȵdV@< e2Yg cCadc 4 AXx|2#Hd1*4A*iلm<t`˪ȎuMOFIf79pZTCs*z+@ΙzmN_R!2;mNZ(aMx/:LN DWjW(M0tN;#3L!:OPUχ 34i9 =igzCʟTJ6۔eʊޞdXfz8'qBȪBOW>β-}Sts+0<%?%ZW$]50k޺̢uHK +QA3!%;7l:=E$6{`:Uş~_Js4]8dXro`((\,4>=HO.LNv`o{<*U\hUp^g9pW׼Þ޿=Ҫ]Zf~{#T]>ϢXwR,y˭ 5@8f)@b*˩Iu><* k#{k9&&p_x1 .{s|yџ5mVYг|?<`Upsz'Q8!q^ĎygGGcv4gc2ҿiq '9⑸l~V- ^i+\p͡aR~75?+j?g-cg;?k]loZeP^˽V|ó!1y+ +EVOE zy:4*c~\7 `̼<4(eRd8Vg]GqumY MN&\#7k Y܅-%<(f 5] K-~bߋ4 7qW+˝0Yܶc0f>ޒG?+z#Ԗ}sZGa/oF~VKW IYe^ClsgKgs,Ua+g"=Iz3 kf꙲1͎~[ԫB=G[׵WO7 Yvnϣs6.{D"[FEMZ4o+rR?|,@[ixّ|OyZ3s;'I]<*oϋ]-=yT_|:1/Cnړau|?:N8Wj^(˭|_h*l0>R>Ϭ$Tt tܙ$;>HI7%unŶ +yٜtUO8CxC3`W71)iK??7b+gaK:4kOKQ5WY:^ĺ9H8-l:9 Ӕ[I[e78h*nwq[쬀7h!Gl2>o T3X~m]bjߧ - {Wl|bFI>ͱ-2BA, ͞7GXv  Y>ϵo͂F3Ug$կ#/ty ,/^?= 2cRŽe`wqif)bG 7LZQ -\iSؤj -T'9O |}и6U;J>yTB -h=>" 00EJ.(v~ܣx^Uh&Q9q(!Kcu;M*Vk Y PB[O8a aCuQ_>y#g@fk+މ9:FfUM '& FnEdId^zH2D'wc !Ur,MP^a^& R]ֆ5ZNs0Pǥ$J9p[&wZ\ (pYώTG05N_pIsKkXtRqyh -uuW;nȝ>Q$`J - AqD)bI$V -ʩ yb7 -$b8yyׇ!)F14k4jMބ͜+n+y`c) 䙡ad$b|ٶrT~RwlT'i],Rn"J@dJ敫L%b -X(KSwұr{msB`gP5u!V 6 vcJ![} &7zi 0 Ӛc0 @@ f@vc9-ݵCN$H8$T@bG{m~@}Sha&L@ Xyɝ,fT aQSXPD PTbR0D$1Ty !|P/ۺ>2u9}Wq7{y箵]n1t߆96vs9]9o֚]mcֻ+ "ELV:CuvYi{^;iǼ nc~ˌFC.3]۷9:x3CeoVbSWIAbhfRQ - -E B%@@* 6Ở)sKY]Dt{V:&`PX dcIJID(X,(2p @` @<IUEpb] -b}=3O̵w SkR]YO ƶ3\^':\U s@3q1Ѫ[+fF1 Ѣ;'63m,<_ -=zV?S̈́ {1jM4pknђʘ1t٢{] -ݙFnLVRfz 4Z̷p&Y>+I?ay?j!D7Zhx -="y\ k@_u|Os.aC`Wb& AqfֲcKw5?T-R-AEUݐR9,1ꠀ裝@IeA)z}Eֈ/r#@m -CTRD 6NPiϫ~4(8% I~@J*ĭ)F`9x7͎4~ NCڢ<i.}3~MS1 v<&`=՘ -!g3SymNCD[?b {E6qu1@kߞ}p1i SR\>+ҁ~&X.2H{|{EmE` 41;*԰Eh\Qxa+܃@=zƍ"Sg9uzX& /2`;<>m -!!iO6֝A^,Dyk -?0&#91gEJ D$xXb7.rO݄~V)M[ti` -U\ x>*rd&@C$̨^7maɛP4 -RDCv-6" ~Ej"`qeb v<18? BŗK|c3{p4WM Beyt3p FU<KY`[0%X~0;BT>C Qbͪ4 V= >&, ;~5&L1r adqnui@XqZa+ Sl aSNeuA:dahiP !ks툠dhFyH̸',> 7{qx-;yȘJq396Ł p:C>L Y0+h YE.vPL'xZQl7J;Ori Ȏz|OCMx3BR[YA Կ̱)?_.':W0 )7F!̙My. ߩt*7K`50sBUCWG rpφkY0#8@ȦCr}o鹚CCͅI3b$*}b?lo$Y $ٱSd@ ݟjݏ($g zTQ6:-JX^%[B|@+r+։th#dPGw?0{̲ǵ)F q>:X+Dz@\zvǾ`E:0҆t {6[YSM9QsKCCz؇|VPMҲY*##E_a41h#x{Ǐ ŕHljЕbKViBlS> -f5\b ѪOk9eqk$"zfv\w!?$nڼZ^$~ZI2ދ.c.yHD 1fL7(<:Z~s *H8&*Tj}-b~N3!{۷WI T2HF"Gm! /" }g[1@Ɗѭc,!62O/'6L]cEz XGf9"d2P|#7,laG{%ml$™|>3rr,&&展t|5;ЙLUλ#H9Jg/h.]-o0٭-_@b^"/70ag_Ӷ@Q̳t +/XMLNodeArray; (xmlnode-childre/attribute(numOctavesnodename2typ(2valu; ,stitchTilnoSbaseFrequency0.05turbulencresult,feT1operator2(ininSourceGraphicinComposit1f2(oheigh100%yxxid)2(AI_Alpha_ww1/Def ;4fractalNois4stdDevi2(bluGaussianB12(offsetdddfeO1z2(-20000z-1yx5xfePointL1styl2(lighting-color:whspecularExponenConstaurfacespecOueS12,a*I0lTT +q((cAAHA@ 0w10V/5;l*&6b:\nn_'2[{q&V\$5UiNm"]vwB6Kz:isq +$b1)/kQ|Ytc{O [!׎b}iR DgՐ:;Yr]l-hfXcRpva])Rڳ#H?u`q6Z);Z.P,O&2U@m{X$SOhJzh~yUHJ<$=&:`V'=r +?p2/uO4;WL}n& +Rp}PKZQ%3PnRƒD(mB#8I!z(ᘴ<{5ޖ|G9:B2FD$;,V:h +v rOCQ)՚'}fFO`¿+>O +;$z8oAU܅k65,(qv!0[nZ +oŕÇ)H9z'n|G<**)# +dA)F*34-,d.0C !Ƀ9Sj̈́p IХ5)]I tWYq hў.]~'u_rDntnR_i/%R&sy+פn#tzϧkrÉ=\qe=ӰMaibN}W|Z$:p7i5bFKQ ^PxVۖa2%RHF#)]?@y:13S^O(Rv3O3?f65EHLq&<67A9}AS|Sas'(驜2z."bPjM4MM4oj^㎕y 9<-&b"RiP +DU +B,p@ +S=z(PPQhTAi7Qi(Brp4T8hy=H`PX19( @A0U@93,(C-x G4@$@Y]^nڄ̴WBSf0׃OyDi<8Q Ru%@LPq Ȣ17.q6Di@֖/tN&{M]|9QSBnLqK\%.qK\%.qK\$DHMetCLmk3uN}>Tٹ+3NF|~{%J#Qk{9n.!s+J/oKƽ/Mnh/rcډȶϭl5[w- 'JtO!kA~Y{ovgǚ_6dmqfm[2^4ٱv=̋2ް])kM)/gpeky1]zelLd5tsA}vy PEM08-r~18P9I!Aa@\B1AP%Qk!Q( L[x-دs}#Prhݺ]ٻ* +Rwjp?kGvwERWfeeVm%t̉"5lmV~VmfwYۻ>6_V6+W{}/齅JwV ۿ[V[c ki>_[)wc\:_wzx kh$Jc]Mȟ̜fA 6VHT #!T|/7V_ܤZ/cVDxLb(vh W!ܗPW2\e(Th"Qk-ݕݟkB? Be(M9 :DH8@IA" a!.C\ĥ5".q`lr  P!0A68 }0L[ͻww,8q0?zFr4|c_b\@8@vr'kT0%%Q"D0ATĔ "O`$  (!|P/ۺ>2u9}Wq7{y箵]n1t߆96vs9]9o֚]mcֻE EòֈEZgԽ{=3uk53m!?moh0K(Ŧ'8bsBK\sa{tZR&ϞI#(5'{yEN +u{ɑ޲/箰!2`Oqvb•dK:êXkSgYS\LC뀾 \[*OAhqk,.XSyj 00 _5cGe!YoELNe + &J[mv.JM.RDlXd%٪/0 f >~(j(c U:it:՚Ʃz}L3tiU`ΖB*v,ΗjUНa9#oc B!UE-@|ayւw~{3k).[.B>mv/)O!xP  +͊ +aPRU`,yh O/ L1C/-X w|{a Z.$R*۠5$Cer$9%$1!hd5 n=# g%6*"$S!78I*r{*M +Fl\zT+ԴD?D4ɴ]zE D*5uF&%[qTYb%"U+loTKb_^ l3*|-YӆƏk2坧v5^gZgdpQHF¦Hc0 +*-iVEZyS9)w|=*e&mg>*>`BݾnotaRx1E9?b7c'9]DLHh]IMꮗ|;rHX^I|N/ZDQ ZT*eTU;6OGč1K+ʝ/e4X#qẰEdCĦ.Sʶ16;`˕ rM=A_RXE}h럠NCУ}l8Zss"e +P-yv#2A~(iAa}ƽn +qʙ r`A0ٵ=z8{ࣻ, IS*E{? Am7 XG—ty\ԷG/fTD5ؔ;u(b03vߨ@9|z8)I6m[,h-8J a`B{@g+9C4;Bp&EZ"tvUJT!xK ux?}hrk~g<#T"VajaӼ6]Ug`Y?I`oa9qAdNIQxtɱ񭿀:^T"aP .5/hM@F?@,:E7'TUzw&9Pav 3,+*Y?B._J?,şC#'# ${ccM_u +7rY1.gyDTbU]~_ܛQ `۝b8H!գsѲ4;. hHCӮ:2\9IXi +ƈRLK~R6#oŰ09﹇_-g,/]i?*͊6 mʧ]{8{xXTiЭzމ5~G+ ]+!5zĄ!/p>J) +*7anA HBNM++$QE(Y]$n}Ňq"8TAjH߱S6kH!>}'-3H4,"W251 +oW[[wb3gJ(AMRt+Ti7KKJ'47Mhi_{꜖%e[PQ-VORl [Ԡ )w篮/y7OK&x@.kHQC96I\"$Lz:w ͩ 5T?L&15_'o|lل@86 'IqM^噊y;"pͨm}1iqaK՘2(IZLC70Y4`#9z%E,MHV +!7YtԼr;+Yt@ȝX]I1-՗06ducyI66 %b[SF4 &D'9Mgm <+H0*7Y]Dq۞Ewqr tVDn %_FF+q˪bNLR]5 +,g|Zk:k˝Aݞ;.,lfF#` Jsc!bh,ne19yyph8cUS/sC s]UUjhLCsf&EC$'\1oHz긞)?ϥ5K]@NTDR`Rf/*>LUhH"fl,oDp5<}c<-tR㹓+JD߶j`y!BaJ +n>Q4N7T~$/ea@`It0 0 0 0@DdQ#$ҴAJ)%ɱi!lHadJ)v3tO0w0 .X8W @ҁc0 +\@R71=1Q  "@m@ B,4(PぃR +P`$04Aaxx0(`=x  <.Д [\`-  D8( Dk*X$JX@4@ p,"Y8X ƀQ*x3_7'A +SX@`I`< `0Dp$/5dH'qf?j7ML9 _I%[13Qp⩈p2UqM%ٯdrv.ɛL +% +Mޓޥ@8"r䃿АHғ+z|`+ ?T|tWݕ.]LNqА(_t򝜿J34<0``>YnML/͝D7&+`assUgO05I>jW#H88$  DBqH$  +D"`H((hL'9chp8˦Udq%<[ochp8M!:,cyst$<~Ƴ7MbʣEQW3販=d_L˵ g{)c ]Z!nt뻶ٲX0>l55]cCݼo7uS-G;ԧ%$_z%RO5mORm3AU &ֈa[ͼ_-{o^/ &S +)l7)=<+Æ GDz@4#*K֎%S{ 0!"M.C^!T5E=9R4=^3x zPĵBxS%X b}-ċa>fR|yCmS{ﳝӌ?NZ(*DD2&ݻ%f et^3d%5G<44g1R   "8"HpL`$< +h졀G`  1(@ +  ^ 2Y$ DЀ3_xQa  +ăUx8P 83=[#8ɚ{X0 " T"(B141ǿ{_o`E1{@ @Ph<(,P؃Q<'xX5Sd"fbsn9ۉ7چ1Ϳյ91SIcpnofDc s{L4_ILD5}lf'_>̚ۈ&36{O7YMȉ2b'I_]Vcz01llń5=`V`v hbЦv{jIH(Hʼn + @&HhmW +8mD&B HX BJx kA@dM`bY.)x<)q9ڻ ńF@Dkx5" p@}5m0/Ĕx$Ë',&`\X0-HE  ȁ (0$C7 %k<c?0вq Jܣ^# ƢP獦{J뒳tyKiyk,bcPJaC3Yւ6!:jQM;욟ƶ="umעB(]گ)cȜAKjsR 3}rfyM "hD*ZC3~:M)dE-(cM1%[/Qڞ1f`waZ=^[T#E^DNt=4L;#[1<}eE2*5d}dKyYk}i:>iGg:m6fVٜ2_tΊCqQa 6օ52cֳ':;F(AP4X +6ZNɠct\yļ`U1nRC Hh<Ѕ_}^tuJƮy!cOJoN3:NSr D8;=^L"?sT_ix@TJFk~۵{Ci6YWo-+?z/uyz;,vUXx8.t&4}^;Oglb1z+̨XkUwϽ\lWZU3)=.fO-GBQ!=s]c3 +Jb#Nfi3μCصdYZJՓi j.3:l9آ<,f_c~,i}hSNEtJc0k[Bkr_GdGu}jTC~J{S;PYe5 Yn嶽e7 y.`NaBnKiljDXf2i5?o^ԭWVܙX4TVeF/fwӱ=䳇IЃyUдu{scT5{=j1FגU Px\S Խ~BL=fg_'ϰ㧙zg=}]mf]?OI- J2`E +jɿg\:WCEuOVyc<=; ZLN b -_2f/c9bxGP +v͒](~JWUO PxD&0DBbE%E8Ph, )bRh,.Hc A *Hip80E&4 D@ap,(G1  (c,ZT*Ȣ +DĄr&@yx֫zF9^{C.Z(%\sH1K';s2s,MzQp? QxZ -,,.7 )/^{Q"" y9B윫>)?o-ɗsb[\9vkA'(6x{qfo; +G_hSU֧-vR$#"6+ rrk).@ UG̬\}C~U0p>SuѽeyN-_Wp~*RV 3~h1.|$"8tzvE?Ӿڡ56F&%TKx:zՈ*X&B}I0{R dOԟ'eJm?JU}4 ^ymNTBLϡR٨sc5 : 23#,z?B=3I#Iv!kHD3 Oy30 +9Gqf<$Ds!n5Xqz3.5%wч^}xlu4<Рx?}ⵊ!ɥDNNQ{nJEg B?|9tAJO3橑hF,̷gI3)ẺDtMtSA -`Cdj3]>jŎGJ77РX l=~'Ê/257{ڐc<0Ӄ$6  )[eG˧DO59bDdGJWKUhmu3& }MW8@7ݒj@ th\dvf`ҷ;N^9[JI=Ĕb~ܼͼ\w6n>۳Bdﱕ[fX?f U-Y42fZs|& \ Wf!)rOˏ-o-L]>?|TϹ\6:3/SZ8wiTkwg5HX5#Ze\xӝT)l&O}š߳ŻOOgzK|lX,%bxςo]2s*bD,lRks}K3I ]ϒU>stream +9珠k>$2LZ@:.Xb- k}""ݣ7.J<}Se)"Xflw ,-G\Jt (ծ]2Sb̡?9͂o]s-fA"$vf> dd9V?N0wdtx^CNk4fg\ A %R=`Ńe]q H$ls%p*0wYX 0r39In4K^`B =0eViPOgVQgvJC)סR*v!hxazLer,*B*dlŔ.a.&F3rN@1ZKvU}\|D9-Z/jmNDͽZ۬r!Sl& mr@B@{uPsMt$Ds u潝g)Yz +:%Ѐ}G(ٌ((ѱt:BxG]Lhy[,-& 1-|$؟&AJ TRBA&}ϽQC#" ypf:]ǕtKC#D2F%'O+ۅSO(ҺGu `MZo +L`T/{/ZBZ -[=sUks_7eKi( *IwrmH!rj)CjJZF?l(؆.΢4#8o_1Ɵ*ȼmB˯fzr`|_ksC4kwf |j99S)a`>'ϳ٢,C)ME6PZgˠ9 8Ncwo44~>R$%uq29dKHs2W<;ƆH(g.𕑷CdBPykl`|gؚmqpdc{%[E߁,V!E ӠN]F09VlV%unUa1r>MԎXD0!4Ʋ=qA`ʾ0v nFi$NF gx"IK;n;c,>laڦ}!%!dJT +4 +Q3)Z~vNZ\_~$B!#^HY|9m{zςP٫& 0hKGO {tdeB[63Rgs]Jռ1u-Ϋ,!=AFI=[9Ȇ>:ٞ|K's +d2Ðش32TO-u}oOT/di\&- ,GL$1:C !b;W"y˾`Ocal>aތ3>ե4W"Zca`.R &- ae@/[<d'[Đ*֩jی\NxdéIt.[E?Sb䙝/ SX:{6o/U4@UB!#Q(fcA^"Z&;&OZmaPeui& i-'aKdGB·PC 1s-:KbczhDB2Vyǵ,n8oMњ& F! +Ơ?A@;<7~fg{2ZdJ~iM;= HP4$;2ocz? r/jZV얞O^Gr+{GU‡҂k d ٤Os?vnl.uO_Ș"+ÄY4T&4vCAٱae| ;)[6B@¾ΆOn)Bv)n;?}! AvV$uӯQf*J'&aM7ľgNWDc9L.K-33 +xjl!^թDf5Dri 3R,coazrܾJC9ޟrfCnsl d۬ +rqnآ0|t,}?LT4[E7g[@JM,X]J9peY+hwPJM9$J_Ͽա7ѱ4t Uu%y3=BurxUc(fZјwnvam̶/Xk¥lw^Jjh$1+ |ꦞϱC[7F8kpa nv9Wp昅48wLC]%6| +,JKynFct+ %,q8s~7a]c͇ތāD I`|VsgWkCXf4Oesj5ِS[|֪d/,}f"S``rx 0Hcb +K(&2<\2CM"AD$ Еx) 4-q +-l<BҦ|{> +ȝڒڅx\ɭjW5h+.:㜕#Rs$e HDw +RN>em#G@̢~/7ua +āȔyQSuG g{;m8Oij8T$sqҠݮ:|m':(m yw"1P/ Hϟ{E*2psFI3x&HU#]wrecGipi%6`"M%VS㉶R) kn3ISݷV]-zM:$E3KJaY&a|IsIMΑ dGpwL[c[s&/ѴOT' 9)Zz˓yϙج + 9k!^\ :j&w,9(Pl<%,\Kj߁n)/"!l96 \4ת .%=|[E|GJeJz+$4\xR̳H7ŢRf Bw@Xm`fI"i}!VgOffcUmMfdCCQL!֣X_@6>srs[9qδ~%Eg.B*US@ҭ7P!}ĨDptPa>~'sS B%D + yޟ#MPG,JP 7esz+1A`'[F״E+Ej)_b>"or.(Jԩ?;'e +sH /Jܢ$䪾hʠYidek^\FpN#U XV$+ s@YyUrGaCh>yY@Q p#҉(i;MP`d$VAXQ6VAs~/Љ+_ͫnT;eAaK uK *7D~Sf&Ϛ鄟QQȇ@Ez:-*i*iom02EDҍj?݇2g7FH +2&O#^N6+"<~2)6m:^zLا +ե]R? d1_ +m~kZMgwWU~J< Oʷ!Gr] tPaih5Qk+FHEyhC.Ta-

U4uyci?*]Z%{\xIifAj4Տ[f’qçBe.8C -y/ ĆRy1yl'{JSy1܀}S?OɜoD *-o/4H^7;ɸY\=KYu`W{~)[E6fI.V?SO+ONv-&ߝyǸ6{iP؍VQarh ٌ_2Pn,ŤדbsZ yyyc [6z6е3U=Ũ κX'W.qߡ!AÎAǣgd8(u^#ⰏrJ ½>p Rvk,f)+mEw:T0靶EƳA; arLMm*ehqES| +(dL>d5EǠ]8A$uhr `j;cpEE<@Ut ϥ@f.P*hcrS'N\' K5~FG6N,丫c@uՍLV I7]ۀuנpSU8Nf merէ*)%T( 5+'VUp$zLo +pK~sҸ( +!` +E$s &Z> +U[%}Ie? C3 hˑBَGvDes"4xμ +;F"N #1tՐ`; caڊ[&۩&X,܊hS$|J ROXx!m-zVpZߡ\w#C.PB%Urk X(ȰA$#k_'4!΂J΃k#_ $!بk;AwUEe[],)0W"{O+_rT+EvxZ)P`CKbrðA9kN_Q@+݊lv'Z`P#Ax'&4kWiԪ{)|Wڌ(>GwL"e`  OtzҬaDJO@ѭBokx,W^"v-B v*&xF#!R3aS+wO +R3n",}" +.3 on$~3QweZpFrgguSi\+RZgnQ~]1"D$#$$!Q%2@>Z^ecy Cf.h3Ah<:lm]5& a[1{ R-@o& rbf\o88x}q ?-bWxW+MGy%q-CxO@pz"m;}~_$O4o;K-N&2S0$x41nʸ%rH 3COd1p\TuJ(m7a~]j]1@5Ӓz[%YHA@!6`r8! i:K0i'BLA3 +'·I#BRۭhlV#Oc㸘_YXq:i_rp׌@mj2頾k叩hES;L7 Cg,(.;@32*@å'i%Gos;>o3d.~m]rtnl_LܥųTH`޶{oyLѢ*3ED>CHOF?l'-4Cf{V{  +:]2GwlCiGĂCK-b⬮UF$SH '#hn T4ea-I7rfڒ:ōAvŏYrS9HɔvToRiidJ_J#&z) +X]BU(2`ۤ1,g4piC0iBѡH*Q)P~О +~&fE!SU@$G - 1 l!mpB9X&G-"(9C}~MtˢgHJŃx`s4PݪúBT&'z I#7}!axڭ D¤#޷ \+lҭ:jV;D@o>+EB+nCy4n33͘6ka.  #J\E2 +RSӇ  hZڟN}ӹ`[yF&pyE)|npXJH%!8 %Uz:BReU8 BEmE-UWٻ—!cw8l`M"e=>҃q#s"bn&ZF8_n/ ln3]̇5ݤVVE~2W#U=4w+!~GH ;1G"ч@HKT낇w}sAL؃MB^fSwԘlc] ݪ 5oŠU )Q qD'X[TAK# PBd+ V3p +oyis1 :aWJRWo*g@D*gaOoA}"p!Ⱦ"H|D0Náy#Jcdmk+/3^FFćG(Ge1%)+%9 ~\^1L7N3cN+ԃWAT;btĨvG^8N.vEv%"YKMHIuؤ3|CRI n\@WJmL/UBpKwÆ[{,$n +la#P&hms[֢a{ġn%n 1. )dBwEJ0tPU5TD}d/׃V97jk:-깾s%Maڨ٨p`6R p+y}C?l\@Jl `v>'f1s2|Zr=讁Q%`R" uFLaPbu(Qs n[HmPڧ7}>\OQZoQ}Q01`Uʱ\n;(hnla\Qn[ n-#qPa2Q4+#Q`_w 1ƚ'NRpr++L/x!m XzAKF|e'}RL$$~:!{,6wҡ)[@ I HvR"e U3k.$ `x/Q9fdr ף\blb(0NU^9&:}Ĝ5w]-y,׷J{&SђY9-չ$5][9=$youVˎ ;^qߝ׭gv] _:`kfiIT5<_vjIJPyj5: |Яբ_k5uZ =q̲+Z+gx;f٫c~G_yxԬ_Zּݱ% [qt^KVg^9>(|/Q}g{ݱe;(x/Q{sU ՘bHTKTl۪LVsg,@s%?岙/!gU`VtYl s2m/m߶}v kf?gVKխcVkӬ>knY9SZEqkGܮzVy775%=oW q%S]ϲ8h*|\*۶e9oV%lVfK-d=^RA,-Wleۣ,V<{pv,;Vl5cͲNϯWW6~:zjkU3e<'xQa-S7Yhp߭<"bիyclֲjmK|L5TV9-_̹T3'c@ 4:k*NwߧeP8ŭb x^l|+U9k{c;̝]gV\kqŕǶfϛ5W jeymsPJ9%08]*qe:pTiQW\q]w +_gJqAHX!c٢'2#)~E-z yBPrB/4-7Mؔ󠛦A4PM!hy24ЉIcj?MBId rB2Mp =*١9í0c>2/E'؞lO-=C=xp"պ Kg]j ffU'Fc!c\o\#sf(4BinIrtOd@6sv]:GՐ4Q +n s:+TqNpmpaC qNp\(l-_Tʱ=5B /rj_b}OL^DSKI!%;.(ǕqeqeqW8>~kܨP(T5X3Ζڑ-leK_=VEH~B:<Nzk /[zB>wC {_حgn@si@seޓ81$twr2xtבQ( Nl. $\73-wyO[p N~O bPâ(^NPsw2bE쿫񾽈Ѿl~PʧӾl%RB&E(:=;=PzdkKYWs?|ebBFjj"vDSm;xR|I/wӟm +ĥ3!-2 fYnfVeT ΅vsH lAPy +J96l6 n\@0\15v[˘۩TEK0,=ʢj<{"ON: +ţ($EB\~4|s~ +1W. ..Ѝ + ZVh%A>4J;˼PI}) +kf$8Zyв Zri &,)8ģ*'8)iBY&'(\@0M +_PNf(#r[C4{n-%M*hG6p_IުnB('BGmPo~b(eғ=qg ڗA[[B=OPa{. `I/㌱]$.2R#O3'=SeNPsu)g4`ʘDq1Ě6|/gآpks sUKXQ!y!{-)pA p+~?,@hdXjgzA%j&VL2A0PdkZ&:btE 2 . ]w "A!EcLjXDv-j (ȾKw,&F &<1ɊX}6vNxNgc!KRQ( P䇦z$&C3qB\j͐f^<~M,"v>J k!׃?@1jQ(M$JR3( .,u?IADQЧq6O0xV? b?`$S$Bo ާ (4+^ri>RQn% -neN)nR7G -!+jί a='DJVV^}Dz4@s!OYd\Jx Lv6|n3mu 0UC.#^BfD+dnن4;}H*NjmE&Wn. . X ,dмEJt:I CϣzdB`\$նmL<. %^ pQn n'36nwc!I9IKk!.. p"Z/e&Byoɾ&zP:,>U[[AaiaT0*DGheuL~. pHCKT-v1>Ԡ L'@3'mRCm!ruE>V'Z6H'd:!1N2A>3Z :1V1O `Z:lۨ|hQ8lffµS(XoJl Z?OdWTRT \ 2b:2q!\R#i" KPPɔIUKd!?W#E=sA~'mўR 6Wm ɳnssqTQb'U8u}T}@4&. j ru8v GteStj2G W\cxt%&,NF6BvN[,K=-,VYQ-;6^ʏ 2 h%Qce( 6#~ >Hύ#٪9`Ĵ6{Td5pe&F6ݭR. j5P ʺJMQ>Fyx{wˏiQa zZ4P˚ͥ+oJN H>\@H uظZY\@$RQB"dN*[_}kn +#F/g  6'M4:M;Z +'Q.WSݠOGu^` +06- +0B lZon*\ on X5y^2'u]L5_ RDA6* 'ÒxQK\@@  y2~fvF5 3(*^g-2O5Xы㶲i +V\@#[Xd]mBbQ."]#C׼vLCXڌ,UrwF)ekJ3❶p"=E Uj#;\$L]rqI$a?TٵljZ ŨOA aQ+F%!pB';uZj}] Gk[BtT>l nJ9^2_3 *- ܖNkGEk(FB) -2\@`th-+so + m*G\icNV/_\@9qTy/$4L_Ќ6-02F[ޒc8. pO,-V㖸˔(Kim1QM7TUOJo:*O+^&?3\"tim;~3Nz]!|_$L:1<}ΔR˯'-dW;ĤUkЕv1[7$sipw2iajM + x Rx|4V._-E]  +,B*L6 +oBj^ ֓V{ F٭:pDrȥ+ igQ+kBr,k4x$3"H^w2e#҈-dY&㿘q &\@7ͅ%ԃVV#mjB?Oo 41`Y,`F*_rN\~el]iLfZ )G3^RMuZfg'T#Z+%'FBZrE]$Tm-r,Q}w^*as'`UC.K. =JG1w.٣ IE rh>a楖g\2Ql,0a6KkeiiǴ_ ;yey9Q+$,V=daR8uVwF|Z5j,V6dxBGJ. m6_X"v wzEJV8N1Yq +Kdd%؛ ɠ8):il/C/2WV7mZda󙟠_N9|Z*N$S +AP^Mo2dC k$34Ճ'0} rBZ{B[Cp7uIauDE,y*8gzSgP(ݪ˜兾QyEO鈌z#R% ^G h|Q(¬I`<>MBv{y&y=$gd*ے)|cܒ')e距oa &`yJUbaPa ܌G~]$9~=slN#4XU_um+@-riM!jARK Z \@IpWg acF283*ﱜEֆu.t2iB*@rAd~I16-B+T!ocy㴛9 NFyN:vb4W` tM.hrNxlnmmY>V?0: j"BhG'ZtfQDE!. 8(Q-*-"B|9T,pwF5mE 9p.eڿ+TQ%J#FE%-H|i :F &\ 81d(J. Gl0`! a2 ;߼AKF/qxZ gqp} vWbQG=$q߷ 8FBPt_2e_:h8B1{94[~ѕR- .ZSd$d5]ρm/u~ =oǼ\@@؏DyO~LؾڡHy(E6;)98k4oGQ(;CkRej]CI1|. z 7Ì!;mn ` 7` ;↸< [5L:X,nȠČ:';z?0MO y}P˒*a2OIWਮdpk4On"`9i_8'SCJ,qe8͎,,)TU쬠ޗ)FvR Nkt.nbUdqL{H&;N+™MH9 ((yW+A,"N@J&8 &,@$aERE$&!H}Lh;?5LBbHDzI vz!B*$C4bD6-6qoF"I4&pg+@\;ivU6vUwsklMm M6SK4j?RwS{+eGښ2*5.L޶a54K*p/^ Kla`Yn7Drx{>SH0z+:X1zмk ;$Cӽ.mFXy/O}/SskUE9~572ɷ!eDb2xsh, +t xXi 7#$ N9V- w7sE:pp'l&JJsז)QhL9|!VJrh6ڛN=~LY&r$27qIjq7'."eBlN< ȏ9[+0H.>qKT, vGRqtA8b!;NÑt.CSSАx'U7cg[;8/ic'1gouQ[3jM6p4|џPg-[đϿaQFm>6ɬ~]-2o ,zY˯I~; Qg+hqSi74 F#1O8jgj+7\Q*'Ρ60ڻgy jpBV*Ȑ\V÷{y7^|c.U ʨ+Ufhнi4$@F&~.q=BIAl+`{YCMO>yrU9'"t3'ϐjp0yNw_,ЀtgeO6!*]BhQ݄*~Cyñ ibRH 8qWNOs04UϓлC樍[h 7B2 pe19N0E|?ܦ2tHlx>djOGmܼnyԞ˿J{EZ/jۍ_&҉+k}a9݆HE"!,O IGXb]u}Yg?jwWpI:j"E eE|&g*QRvvQ0(m:S;t˜ʉġ18b.V?_?bRd\ޫfK68P}>$D.*C# +ZRc JV@;:ajk6%2a$ɟE>AMPׄ_=M ׄNZ%Uh^BJH2FXoWȵ{sh/V7ԾrMGsSBb1MƯNS83_#vccG*d99Hn<=^bK#(jmaGhB|:-dEB+(ઊ}rn 4TދmEx PLmFq[Mm:1yU T\ϓN.zΥ$,S&35:!y-{5սŒ\gl@D:~`L1ko ZzTI<PL"%WKx[r+Br0jO0F|ȳ!vLSU1;ӵ4Uq3:Z8SGd(ӳxS{覴Bk %LnC>&JO{/l,cU VLl^uYΨBp;m B&.'U2aӣX+SIaݰZe AH *NN0;ę,O>R@];Jww\_SڏUG vրi>wnjS@m',DS[\Wca;zuY\4zs@&*S栯y榍wɍҘѹJ| +݌lzV‰h[7^XtF#5F)+&f#J)]Ug^`)@ b +GQΘ:Q0ɍĻ^pVcL)^/8i9Ng1s mNSM*k J{yir189B%G+r(C)*3H 5OUЍ.w2hy`Ά +DV5ttE5ALP3^#ܷ0wPmj:jnMK򞄮)ӀUlĬGazcв +z"kU+G:Af-q7ꖐ9iFxFH̅.le؊OH3'^ G#.؎=ICzT7Q nOnc!x=[hg5ӵI@.@pKZ<]jV^,@` [7&䛥Ok _?/]!u`C= 5/>€-Kpq6 +e}X 'x)N8yؚSndUXcJ5gx ?Hf;5.d#0}ٸPp ql +)CL{Q#}w!)fJ`RtEC[vEoX$e Vtd'5J8JE.uZMT1G.+P_ +7JO* -*auDlz5`P@ )!RWXill +ƐrqDp1?ꌠ4)L-%UAhX`輨wMIK+'0ď8&z28Rb1@ay݅:"v2o; &NGT +v3Ӱ<9a_JGG֞zZ!$>FnkvAm6l_cpN)\Li7:4:VV'0F,=q-:`l)RiUʌA4=ZS93'Rgbd-U #PieTŁ VTYӈ +\ c̙J4#R&inc2@^lv.$ƪb- t.4> x$,v *j}}Y6礞dV5NUʾQtKjmzQcW%2׊b +綛:;kʝC9X )QӉ-<b&I? *:d\h;WxV %? tg @EX9(]WGixq'鏚& lmgWcA,UA\TTa)a,bPs|o (v8V棉z TV)^_c^g>sb'g +0]CNL VEcI @*埝2CZx)0X_.2K@1<|pY%!']JTBj}3v."șAwi$(J'[rşxƖrp=~p^ h%] l֒B,NAm7cŖڠ%bxX51s2Jv0>Ԧ8ߩ#*^O \` iigF̕8Kq1/l0 $]k[A_ZRw!VCXgo%9=̑h6:2v&IJ 0!z%DN7 K~RH%r^GՆ=)rʘXz*!AAΈ|kV &Ot]\G uʼnt>C{h@MAY4^?uވ?UFDs?-Л:5䑒@$}6cռ(Ud om:$g*UtxQp e?dW$W`uWXmUQU~EٜXz% `hO֠TCi6vIkb 4UdM:p*jmE55#AcL#O&dsfomH];g3G.ī *(MD(#?Ш:to°Q$nz@-.!&,"2_$7F[J[EjW V0xaZгtF\$DP=qDwƉqFkf~ӜcN!A{S].6"k H^0QDk +k{ςQˏvYA0*omQ6%vy=w:Q#zDas[ʿ848W 8e|A/\1A~֒of j1ȁ},ܢO,؊ 1Dh%lķM~}fqлap{.$6m&> q)lI_b-Cf3/ G͹dz7%!9o"yr}g!F$&/W>{¤czUJfocx緢s2Fy-YSjiȇ h.H)[yAK3^#Hyf`yUm'B <Y'l'2#xG4u*`BBCf{b, +lsK o3mw9[OK"b;29z .$ dJ]YeE=U$+Ƕܻu zcP!T^r.kuוݮ 47~{+X>j\!?QRzʳvNp +@ +o|"ƚ7j|\G?Niv+DHt9ͻ>ew-PKu3KuL$GsWP a5Bl w;D疰;8 a$14tF.r['a\jp;~ퟥ݆֍vyщ 7N,V*ߩw Kq +r(!i;`0)U}**VIfEU0CPxaV9s:[j +rs%6 3wCK5VejP4P#*JNgAsX/!n7.ӪK9\W 5vqˣ_yȒ9JBcp>8CbY>P3UON#"& TA܁バoce\R8J5CE쁍ױ .Y;+T +WOweRYN]=W*3&--IC4pgZM'K@JcsDмrcnc:[Y ٪6X!ʺzc|n$J"lJzģ`;m Ȕ!=:/Tpy(.)\ܭᾈ~Rhiu.D/=m'O%*]D9mBc;HӚσH|,.a%U/u@ٖS#ga.JfEcb+)DBB@׿F-!,f +^~84ޛNm)VCÚXRXu6 峤s$d£pc,KjAX!T[7?%bI3E^RQO >rT':#ja+Ψ {~^m* +n:پQ%gD Bĉ+w~_b +F==vTaeFr<kv23F^wF5{kSpʇNVQHԧ'|˅vRGJYR+3\I?8E܆n(="83ܰ8]X +*>ym  pp:|T }f2]-AV(/JS΀j6A]/AP*\q6E"}@Q@HF6ArAGrJyn $W'c'_XЛLGI]iR.,)wYhRӞ6=&RoX 0 +̈GLW1$&E׊-Mgl*%vl!*y䊗sRFÚiQ.[9oz݋T AH#˔l,1gUEMcHIJ0pMŤR]M^\R+c3# jY>qUrU^̵, F]R,} ?!~M<i^0 4 /d)umiFb?S[O B eX7<%uxu :&V.>80 VrS]ic>RBU3G$A`a[.fjq81BLj|,pur˥1oU-M;xaźAA^T4.-݉Ej/Dl`YtyФIмb'$;wq I2F""6'TaftnNP ~VS}zȓA޺?̮&!#^S`IxyL)lc;%<{ܴ-cw1RGY{DU5KGUA>]SU9SF6lV_q*.Yp3vM«2 +vٓan_[5Hea{ޅh~]H+9YXPFUtNk[g,j^a5YXTBĻ~ Dk2PQL@ ki)F +c4F 2<}gDPDFP`hzU8 N^rlT Щ;SJ@Y2y^ -E^Rs]>@ w$r[jmG LZ]ӹL>֥lGv&|$<4֖=6Yn_`){M{u 0j@rjv3]S;mYpki +_ɜ g :`B.I2Lzrd4Uzcٗ\L~k0P?٫@@|5+햴xl6x?~֊d^h3dCF%$IjA̙m%UZ'"|L?{׭,u;)8#Ԙę'&H0MbqyLj߮j}A .\747QVa4ν񑪑 &(e$r7kұ&R_O}ұ sN^j?uEop+ ~ѽw8l{- 3sK-U]S&|Ìg +l,75A j]+ w;<üvovbۢJqSNal 5;̜&v$7QC٧PvϵP@Hze$.S+qQ?kf |Һ 1ڊ/ E}"M1O+Rs} q.2TOPܙחU7]F$]fS-V姾 +~ni1jx+k(O#45l{. X6kwpl\sRAc[ +.WmC̈J<%~[[B޺6whVOBX& +n- IWNF8cu`M~}CjDp6$_|s +0d7eۉ"Lnnc;~iHAYeAX;_ +݃|Ln n;cg(02rrIgʔ׹,>=:b?epyg@{}rsgY, D ;Psڠ25){{-̻Rlmh-~ "?,S> 4IhJ"瓓sQ-XM;YјJ@sK8HO&\G,7dѴU]?½(TNWXA'> +kKsdgiVL+ACXRLbƙ28wp'թ=0۵[PP21,(M->[{$Pt)!sn5pzVsD.Vl_꒺cc<Ì-qutu-k$~7hCE#jw>\nį3CI$1}mBy{ 습W1GEs\sl|ό6ݸåÌ-3Gld;z`~NH +)p-+J3-ƹs +"HnH =Ѕʜsq]nBH@ńL܇$W:$Ǒ1.2'1/ML_&!QQr݌.rM:gv侗e*! +wd9c;@Y% +F)XA%MJv2.`ixEuT +]=BR[2/'*`!lOfAy({8gd*іHn#c߆1(2c+WOQhߦ u!jq7HZi7瓆͋p(5],}a*G!+H+ִE;XxLྑl + Q)0 o]H:Sb@IOԱl>Wyf͚\+,gVȧ9~4?79#B8 0fHp,17?Ǖ4>Jl(Q~o>V$1Q B7U8x`u:I[@.^wo<{(/->DF.'bjظ%b,.6؏+?h1ݭfKL\o+%uwbg:[T yCn-"f;$y޵A-{r4p1#־ Nb'@u) CE{[8ZO\xv @9Cavev'8,BV(p@t7]v#\KLMJ7Z-m{Ä\8M_ +p ЀN@yޚm%#P匹=`DI#&:JL7`W-Ka X~=NKffiviƟop-Y2ݺ[GJjER p(,&U| hU班 g&8yrl lC:gosf{?Lh4MAg1ezgr9),.$@1sK`߿ƨ;)nDVH^ƔG*6I%F f+w"|x3UCdN a%ꬤ8k]`|T呥8>+0X3( <潛2R]0$mg4s5-ݵ 2L_iWԇ{$ ; uhfLU:Zpjnk,_sdGU 5Ή"PSQ =~h4)dصq'JX[&ucTHKd}}X ɉbpՆθl]U?^/ +G/4#ǺAL4gŮ匢,d7N#CworRI2@Q4ӝZ @])=$՗Z8YEYD?Ou?l EX蓳^ H]6;7X6mb҇`>zt9YbAn7y=I2rRʲz3{ 6d\0vansO2LF.Csxra"_A:oWU0~7پ#ĝ=U{|?z̀H-؎1ky|/]nJ&DoEsgfHM71aQ]b$R-V6ܥl3nu&#N@-E[K 'W, mUcz%[e%7!|EtDR3(]PldJ%vDn+wp ۼk333@kќdY^ľ@(; _K$D&;J7tjP%eLwJ@{5sQPC?9ӱ`Q4/q@5)KHbCo2P阍JzDN[Ucˌ|WL0gn\P +m}Ր짐"=Glgz!lЎ9"' ȖN '_R6;+kP\oGyN ú}nMװV$a \ff:28Ҝu ^Yt$t/(eѴNE Y+^l-KM{Jo0:JC.]s'Y A_ tS!2ynUZ^;Qe4n0(NE˖ eaes^Yڛ7]{Jh$>NREG4UI_{?dBI{?xf:ЅC5,c5i< IY5%+u +rAZ;"uV2ƎѬ"M3kz1̓s%DE :;R\R0? +JC47&>{A~:I[Xg(Qvzl=yRJ Pz84ck$6{nw/ԗmB0$m"0(C-i]0LMcTZ~D H NCt,o{S'2{+zK[yKW4q^\GGetjKm'3Rz՝aG7]#iaԦ",[Q}-gU:+ġ@%WY+}L +3zEsw񚩉Ij @NM'%␆[$JBە]=,+;X`UnTZ5hfI2^蠁hqIU&}?n{zKN?58G8@lݔ5>u'#~wf'[t"HQǎF[u˟ˮ2&?&.yDG[R4Fek+}ejIF@kD'zy(o(4}1@HS{t% q0Fn04oj0uS)ZgVI"t)$F5\fd:3Ǵ̹ $% %F\ jٗF h{uNB T@ + x>4DD|Pfr._ P4ߠ9<v@+0 +BpP)҇ `aBôF:@a[V'p+AD0@C4DDx8@BtP჈ B '6ìOSqˌe^HtJr\'CK&N<%%63%uki"3AA!BG&q@:,H `0\)P,2tXAc+>  60.,P4PpTFP1DP@ < Ơ@|1O@(p0@i0 + @  `@CPA0lB0@gpcȀq A) .R(T PFIDJhL +H:@ ` \B0 @Tu"8>Z͢K'щQ?7sҷRɕ*m +~6f!{CRl*)aRa"iyk?;gf㖕8x[tdXg5kNU6dğ 1OjV +:@Cc<|幙T:Jӻo h*Rը޳rJ&:>8U2HK^*I%tmLk==*B,<"3y%Ӑ9qe=E"q(v֣8Yh٤o@LBiŨ#CS[oQY93[ܫz0W8~A,'Vtyj`xPvġ c Rq*v _f2lLvlߕ)釬uJf5q,AũlI5לޖplL…l!kı-M +UM:Dd&\3q0 +vL-G5|ҝƵ VP+KZ"bΕ~HccjC4C&{kHKۃ8Hϕ_-*Qv菖9=Am-q0@v;KKKKC;KQ80P83\%8q0t WmAWt:Ǟ:hU!ARI5&QPVX͏vXD{S9&.)V}jK6Ca"r5w5[8U\ԋv9eSE3{xͨ=Y=bl!Fm۔jݴW)%FՄ6-R۪]T|TLErt;8KKN R˶kk nDk-07;ic9zʡ_l^5smnI:j[\Fn7JJT/ ɒ:;ﭵPHp!XETBPEڔ.$+EmM>;q(C9%]+Ӳֹ94zlЕ)fӮ(cccW/D3:OVM5+hHI+c|⨕0v~yG8I%S=xYV6q0rp?InnkaE@⮪M_8٣&&f4Ցl|>| '--;82~=G޴=]B,7_\ڧt3SwK Xnhu6of!8;Xx<,&ùxXXXh$uvx,Y=bqq8+RaxXH +bXV,z ieİ LinI=*zλd1(m<-3W?W_c"b'ݽSXW; hDfdtrWiVi~QJS*FIfxC{tUhY+.hU䛃%~xCW6տ&C% e3{PenylNn)oٲeKy˖.n)-xVZuvPiI2x#)tlRM\32f[D׏n&^C]Nr9tE\WE\Kȕ&ODHE +W9::]\^#q02OZuAJ[zk[|D*-diS7/L:٬K0΢ёԢ5{+l]5^ 2>kdf>&fޜiSʬU9ڰ2ZXi!=Tv_V<ިkKyYx Jw\?Guc",J [#[S++M+;W*bDΙ׵4Y] ruvġ/?YNFusi >d:N*R"tItNjdzYaE^e[u5gMUU%jInB3}.TlpII7/1l".JF&b=Z7OHeC͛­9Dh6H>.*Ix0 +Bc!cS:EߋV!̱hqK44+j)΃p .,>p/. $zo*g'aJL ҏ ^lo_Xsu*wkH],6U5q &ʍaf+ܔXHMOVQ`Ӡ8 i_qWB`Q/A$I;צ_э&){|K؏iJ|7U4j;ڔY LNUYϛv>xSxފ`grfǚae? Z1GYA'*uj,9I.CkDI4隃C88>k=v ΰȧS'NK̬ xbs-DBo+GG|JR_УkEYߣ%SL|l Rl)IHP ;B:)m$8Nxަ@L9镫75DN/ύ ^fVQAvj`3‡yCҘ&&䑎 'rb -g! YeId-82@X|D&G ,7eX9Vl[Q?Mf1qE.׷3IV?_K9+.%mZty0 D Q񰗵oor)V%xM@4#vj)+za/C?Hb&zGM~ - '9ʰoti_DZHIp~ghd=Ow,3F&.L8b6b~؞sYq AD˒!6물@G[}WRQSv5~e~Ucʔ$+;jj8%8V'|O5 쐘 -T^ˬxr-Kp"4w1W7]ZF^\sg(`0KmD0l=ERC8q]6(roz`xnXgQ!GQb@Ę !@'Z#SĚH݅a{O<ԕ'+֦:@Oh ~=QWoZDgD?l"%YdWj14 φIXZ>nX/U #=[C5xeqh؟+E_jZ ;9c)ੑű hqmSSkֈdc>mmKD|CZTtCQ !luVtDFEX׭ vݒkyD9% CfjٲI#>sϑ>4v,&mn=L" d_o_Yt%Ŵ{Fg4A ̜V{ W={8;5@lO[Vs> bd$oL/weBᇒ+];i6ܓWS5f:,Cs*͋ـ! ]l!hj%Yo\\8yZU=:$!gd-PDd3`2`n'f'lh< 6]4X Ebta>WȯJ{*/fpiBKp.p7vM/e}DcŜ˥hD5M4Z5l8wU1ᇿK1Sv!գPf^_{oQ$ [`$$T8:LIJqvZv}B+R$Η~\u\s7*2t@(Q -5e8! i G WrOd_ѐdIwUS /f07xv 8B*ݤs`a,.qXL=#z ne/>aYEK6#bIKˆˌrghCжﵚP$Ϝ$+^>ޑf**E qyq-6yh -+TOִAˬ7g jja5`6lF^1qn 0+o>LGSn`y5|r>) ؝KJ>شCd[`g=UCOQtԊ:`U98qIN[f[eu -gz-X?3td3{Kwd6O<ƋqiXupD*^9g]`;'3j lc,:RY;pϲa5Z0u\,=-XS&Gn.VWJ7 l`p ,~`}eȴY;Aeݺrт0Q\}է$nx+ _sT -[i(Ȅʹ*|5لs&DcX7yM]Xc7Jl!t->Ӝ%NS<", e_?'થ.,G~*ۗ6U=hX뵃 !PV`7-TPd`["jUFL@pfW nЇ+;k&Uxhү2K )UcEuDڻSJ t8W;٧Rd-Ҁď'. 8PEb\*[q[N? .yI+5ؑYnH?a߹JYf ?caT~'Bd܁dTM]:04|`a)R׈Ro%9fO 9&\;BP[g^V -X6ѺݵScG ⑂2<Zh:cA`It0 0 0 0 o$M6֤4PĚ-"CߞHh$eJ)鈪 -'  -d>x46Hg $*"H1P Ia10Ieh($&"!p<@TX"F& LB]VuTW{#o>@s֐L* 8L,0 L{(49 y,ҘT0g ,h`1Tu?%%!`YpAx8 - 8I=IDEX`0p0 "&,IkH LM"!iL$CCh X(4&aCCP X`p$ Gɫ97D91{ND901Qpax`ִr̮rr аY[804,`1,HfQP (071Qn*$F"TD4G=\ơQfdU,LÁQ&',=* F@̚,q-Dz̄"£!QM+)ahXBP0Bʑ,plZI{_9 0);Bʼ mJ{5I[CĂ@Sʦ嘳hE?hWўF6!)t4i+يHY񴂔uͪKM0,%NJ&֕24PtRXY҃R23NJ':.yOJR('Q=WYDg{@ ÎZdhX+(ȩd.HmU8•Gv  )"i>9E(XEʮQM=g\p0qaIŃyP[ƃAuPGçq*Z)=wj*Q1{?5D#&,3ZGԖ|KDiuӻn)Wt0uKw3oʅ5Y}索[3"ff'RSՍFɨD"y\q?<~1a<ΤSG3n -rzdu זjTcye4" c[oU:֡+L)u(Hg&]~SMVe!Y$,8eLH\C"!B{82n1L* T,LNH\<,iH*21A'4'7 -`&"`(*EIs -*`b $h &GPlYD=ppT@ZÁ會A"ACb" <4AK@$) HK 2-5(se=pģAa9 GDE*r8 -na.LU#hxPIc TUУNu=\}v/uP/Ox4 g׷{[ԍ61r?H=ߤڿͩyϧN?#Bɍ/Ą?9qg#Q?b=QI?}Yѧ&NY}O9!t6!nE9%N+gO$Ļ(E0ih& I=z:ٙʉ@@aE0n2q=`!Gz&ӦpDܤB&(k'fU?Ϯs?i{1%́9B ¸ -bLeE$=+PP  d4hUU䊖᠀LHޒW981Q&&*J}N3O;m"И( iq DB504 &pç Q, d=_Uᤚ:rϢөOrL+{v{jjğ9ZĎ:Us9=ټ3Ԏ6*')Ǥ(zjINݫ2rlrNe^O|Dښtyw3 yMXϧM% - PBb'}…URVgN6jeY$(L.<TAD x@4O#  TBEƀs@+4H`&vYN=s3ӞotsB~IɿFD8<@h`yAGLݜG9&o7PjΤp*B#_@{ lJ8LX xXF;TYp$$}LPJc@{so.;GcZs.S;,UZvP\dA=zNWxb}9(BӉQ#Avra>c /X cBPImj.v`{:i錐󧞺)\N)|1̆ jL܃BN`a\s֍NzJQG"?3g(jhvǝo#h5ohyjD$;(0rܦC ӹh/٣V>yarPZ\>^p@$ iU\bGꨋ1kJtWV1ܽ^#el"MT`LE:C uula/}b,aTZP;;hgGDUs3<ԵF` 9ycBƴvMf3'$dy]mcBĈr<)"GA(D)=^gT9rk^^Yq!_ra"KUzc+QQrl/Fvܭ꠹t';,72LH)WF|bOnM)z9K?YøWi55=̜bbLa:g<vo2h˄iN)<z;u4{Wkly -O2#Cg:][(\{GQ1WGQz=*ǘ,Hu2 -slr}%d$獓cRqĈrxfj^GmޯLF#[=U -uy[ؘ#;05qSc+6dN7FUp4=*${u;g5*G(ќ6p4ޮ;ֿhCϘUo2Hy ݫG,.{]SdXs[HSx9ܣSz6ѰfNBeD߉(52PwMPľ9'm.&vE!~mF⾳P2v1JVQ4&޷{>>u)os&w n bQcL-^̭ᐼs-r:q)StJrɱD&1r_6lw7k6-(9)i:W:qs)o] b8KIP[z#{ʨ)dȵ9p0$r1ƹ Q>9gV'dJ$-õѯB.P\GhC BQ7U+Ѩ.אs9g}RUO 1x,쿓z5s.:H"R(DSЩrdhs]brl:(̅T,H9J5{Lvy7:ܲRB*Hsr(}b w)FT; Q:SS -crfd-z_+'᭩DM[ -59ݘ%ojk*q!%eT -QStY5Srdb#$EA -X& -Ɛ<0qj`FDQp`(`(g(xP.Y"|Q2Йqۇ,z8*24mvq9nRa#X&eW[k -JFoU-p͔>oG'fbVG麟[ scd? -W!gAx7Nqk3ʆOdiЦ:91#:'m'-z, cB Bι\1t zJv~Jy2\[z)e[9}u:plc] -.zθsݴ{<*&iZJCx>"wZ^Ӕ.HD)&B.tL_I\"u|NkJ YPjy[< Y+ƷH!;Yiuxu5]=5>LL,8F=n`[H!:?j*Q^.z)C,7{}da}t#LiFː}{U5P'vLS;(ﱧtsF!oS24&*'ɐq7NuEReߩ1~~JYlNV6TBг1&nKvUjq's_/u:ڧ0/9L֞jLhTXtBuPct)U1X.xwsƣ]Bg(-}rnm${Bg% -T?Oiѯ?*, 1Oܨ31}zj10r劥OLnjᦳ)k*Rl ="b_>E#5NȹߚrtZޚB̓³锭j&=!joa2r?[~;R,k )~pwJ}+CAޖkQKGm͘LU Q4m(1f\r./tOC2ӄ9FK}(-||Tjyv/}ĺqq:J㠹&%N :k&Y1g("4ɓ%֨p<}עzU1=s״t l<`2Sn&[Qӓb4 rXZئ 5cjϦF:(9c>ubé7"ZCY[%0_1\.F*:Qc+TJ-3{<xTWm5&^ꜚUS:GQj櫛oaL -fǽڭx+Fޢcٛne L[쇚k*RON[N{Kz}iːi\5I@C4Ԙ,|y^L㡥f6NΤy,əͲtDdFͰ o&)V{] #p[-5'4*~~ZДߔ[CY 9 [5*RF_IHm*^ˉWDYM$v,"~V/^ˇ{-)* qpCC];!p8T'r`~>mZ+Je ͹-5.%U)S?7mG|LR"sAs-1i[L=1!c%_>PN IWǬWb=qSe,#CBHX$@^wt8.#ZܘG,NܲsT- ?-:jЊ ĕ|;p,MHTKfPgc=loP=QƄ}|,ƨFGJ< T7Sņ7~d@gvkMp.#c6$۾VϠR}Z,.ebIsotD?/dFPq4y!EMOuJ<,Lt}m&τ? "\Y@ҐaH5L9qP}ϤyTӷx> o.6zuIiE5=>Rk^)+-6ʼn_'e>ۆZ>ܶ5_,ƩA*B2RONV TYUVhVs}#sfDq3zM ~H esa?XVP{8\=ctO`@/5jE&Ngv3G^qd.y$^zٌb@-@ D98&7@8fL 6`yG9#(oΉ`×Q#^!@/e%vPF\!ڏ&\?=Փ C=MԦƆt1эԅ ZL]Z1wۙ/;kӪev3JcZ~̃Q܋#*횇XD"Ii8 LgQLZ*ٜq`h' Qpy %lBy -m>ڥtr=:( FwzBfGSyKcS!u dI8W>9 -D!`lP% "v@"|̧G!%Ĭ}~Щk(BGHg;4 :)Fw2@[)|shBWpB@4 -endstream endobj 3537 0 obj <>stream -VsE~ْ:С`MS  Jj:tpĠKqLd; P>8tLcty9ivͽ3ز@9M)`+xd ޽YluU۽0S$5q92 7ꀓ[=ˑJnl<B5A97b#RsS E|3OjO覙tDw].C81W@O囎_eE*eS -m*angp3 4y)S sL&3:e JփcnGׄ}Pw&dv\̠RRY/987L)K^կ cUD01HλY죃rr..~LJzaDvp'Z_JE;M9Rh[ VLxMTJLLWϯ<e2gF2y8b6ᔢ'e1`@_KF|G9dĎdHb?JA&Kܽ!`!Le@0umN8lwd5&cs̍ˆ437]T*vZAIYU4l=|z -kL }SMg(fG0wnp@埅Tx}WO|¦:FG}bSkAWŽoX!UT@!h'HC/7":B36ߋe\޲מD|HÄ*$pt!#2E4(Q͙) -U$X348ۼsӤw0+Ƞ-k$tbQ(|ջj%ntL -S?ڨعI^"Jw.o]ԉN<݇AԠRߊ-ڦMKOK%J}E*BGp]ہܯpPqO']  .&o -<Χބyq^6 HFaD'DWXU'N6-Jx&Z"{ВſVv,X6T8]5CS:(xжul^Vv`moֆ¹rכUR3Jqxu%ȃ֑I5NPT0[2K4YN9n D2o0E6Ibl1bpEӈg?'j14坪G͏2C~Zx&xŜ,b<ٱ^2=XlK+I\ANgЈpQ _g(i Be3ВGs8KEW|$W9br1b -!qǸB%lX(MXO9ZPt%DŲӖl,0) ";Ԣ3"hE~yInM`b}+6 ]6NJ SLNJRߘ, 8| -6O -$m]펥ٓJ?ixd!^*dpj2![$Y:AT[Sg?Q d 8 -oKʹDB8 q#abIG"ۑf8,_֜NO?sy~Hd^ӻ<8%5 uw1[^xcrVp̶]fm}Yw 0Ճ&vTx愛պJVW}T0+?,XdeVn[fL,O4z6o՛(XRn8U(I͏r-I~@'T뺷/Ir)5O6A -f׾«ms41W~Tu+O5Ý|]ZS VyNJsNPPIRI7}+i,~)b7A!:+\6ʑ"!E?Ф2M8.ieNn#sq&;w(4zϚ-JǧBT^ -|)T Yb^VrZ=d0 - '*v }l5M>ƘׁUSlYo.[8߻BgC.PX—tq3̖F2Y+kXjz__-|>T^ڒ5bcOK}dA}J=aT[=ꛂJ- ;%hMC(AZ\/d?rqW&vn垠ʖ5L ۼlMn$AjŮYfRfF.\g5Gz|z?\'5YNujrES*`SQ%~F2':0ebK -dz4~ Ghpc;d=x`E[B & ҈C h2e3K Sw QgVEhkrs,ȔBیŠi f^}5PK8hNES 돚P@$rl33eF|Q+Z28#RhPү ) VF:;#Ysܙ2ۖJzp:zfG-Ivg~Z}I/:4A WmëZhBqFK jFBe3 -odW ds9T\J]w!2,vz=D[ z=qf~T)7.-ۯʭQԦ#B/ Й|28wKYd[g)WZZ< 9Ahi4+dK=#b{$u1#[ʙG8Z]i  ԧzo.YbPK@9., -gDH>qO:NSQ6ow+yǟǻV_T7z|@"CI/!T:f'G{q ˰FGW O6&@q#ܜuV4@)~ -q)J xt u1Ew-:[ޣS\LJBAđ5u[Eg$jsmOhPbQ|Ř`:$A">A#\]%\0?+ʇqQutC:o5-OΉdjs'H -gA`%[>R(xa ,hzU3( -zɞuI\`^OJDl(qMPi,H3Wz>?j1༪, TӄՍg@53y|e jP=YUM%7Zy5Օ_(H -fS -x=O{gR9z!,`a~M7}~S>(@i"4?P~6G!.v =x( b9*.L|>d B<}d_V] I6 ÍR H&f'P':YƉ/#ab*B&j$Ap_ S6+!2  Z۷YAi@NZ 1 TaI92pP@ AB<(Лp?_ǭܯѳ EN^1;ZS#mo"`9qthX/P`UJrU}h1!6/k/3rk޽ -U -,`ͅUVrAC-6xw0s0,(8XA_kg.]0>A.}U{Z:jd`+Ց ,zdcr)kֻvu4k3_.kY_̴"tl5oP4m(?mi:nZG܁*44T8fHpLpxfhb\4 &< U71pq 9M?.fݭ%Fb2TrZ""ĺ HNY]-=eqM<\;l&p߂qh Wƣ.n4{o< XD!bxLbcy  -E_HYc NGHG%h xL++aOtѹsנ?xzoG8)s< -~IZ -7hXaZd|g8zX(/xWh4d&Fg"*t).sB -Gh' z*qm!-֌1aR(ťK[0$V`^jtw8t( -: 2sOUrNSї26.PԌl%^ &pi> .I&po׽hFmZd%9Y.rr1H+(D0mF#`pYSTN\ 6wO!$v,y6R>[N[' }M =ͫAGHo߾bi**eΌFy3̿AYo,=13"L4%}f5i)VAmYT4NjXa_*'1}hp0gq4x+S`F^Wwy ݭJ1uѦ$'W0K-޿^U0PAdIm;j,.=/2SZY ?h&tI[4^oz7~PQˆ6pVD֊} -&'X̺:bYM H#v,\V\ET:3ǚ%#Ҫ+eW 4 -Z#%_dF^}]J]x"+1˴&J)CDqpW T߂R*FQg$.Y[>Px'r62R2ҢIt.!d@)y lfB̗.mhc)!3$@*Y-Ϟ#j1Cv#!=@U2T9:PH PmIqTpIUo=SL}I0QL=et-gў9vK5fj[i*.#ۻ[_j(4!l}/MHBHTNDa@'ƣeZhB1[g*\KBW]x"+0ɜk -T.ٔS~  &eO,\&xFmڿkRd ̜[MSis@wZ>%G4ۂ6dzx;>T1!8 wڡ59qM Gg]ekA~, +t?e| -D41>aI Zv_z]l ;^)jc\1N ?ޱwHϴ"i_4#ܞix T㽴w)kX Z& .aPj9,t0l6Uă 4+:dB?Ɲ\H9 k r>PFiSnZV {R0ӛ$ ׷єLLi}3>2aMƒGF>mϪ@+ ҹ]~m^x:x 4Sz0LXj%EzB1$kh}Sҵ J4S6Cݷkə1KWRL^85u9v]!MӏNM}Eu2H;RdA)AMiPE.vaSSl5+FRsX4 qfS|%5ڝc Y.SD+:#j2]gNHs%$f$g .%ݘADƄn`cjVюY"jS#㋡2Nk;~Mgzb+]x4rcQdkȖ)8'2Vl-L?X8OqZz,B+ӎ=@3^̽ڴGHe5ߡD<'C @},sF 4 BfvPv_yi#&P>P}YcL04sk˹i]qܸ3g&h$3u ZybRKr> -sh; 5K'|@٠֗]?)b4ݷA锡B9rg4֒A(~oV0 ^b$$%7A/3*@5%"gi3姢c9 Gg=L/!aTy&V^LT ]Y0Oi5}x zYoY  \F -v{aIewHdhI=e\7ϓYA[kaBy %mohHm3Uմxo X+agDHCUL?uG4pE\ɸe\?HfL:nol"Fe2F(( ,@"5 G1!Vj!z,鰲P0)8EH>I{ԁ)h +mu)ExS߻zj5$ɼda -%r |y@=L`I-{M`2m=B]JߵSGz⨺)Ipic3TՉaChd'-ڦEuBm«4A% Wpyʣ󚱰O1-u T]@"(c'P8JoFqz}&?ĕBX}>\\rhC,3":7 2ya$Ǚ|v]`eEĒGx{,A)ϩ|ߜ1Y&:1S޹w'$횉Ҡ -rko(ac-wx\ I JАklCZ֝w^^{|L(숊G<}М6EB` ^!j(h9H$z2}!0_Z?=jĽG?噯ĕ}=wB=r\IMVlѯ*? ĜGC&}n}tFTZÐ3^kL! W'Q0!ܩ`>HC%:H'Hq&GDeJ0 LϺ 2& +)>!q7샚=jęY^=J%9;]ʥ`{)CʿGxm'$a]F;),fo(zt7ZJEi !רqÑq2>4a XA;IiZ^Hb-ʿՐR~kcWX/DoC/Qߐ}G9P4Uy}7v&EHߨ@ia2:2 IU'=#8Jg!M2=}t)0-mIwꪰ4Q2~IxOL<_rs'zbxȷ}A4bߩSEߥ?S?vij8hwΥ1DlPfL7TeR*Dž'j޾%Di>{wbIPUE(TވDE@J ( 1 V]^ig$s@˨fԲ}U "0U2_ h~A2xhX”BQ1ƚ67g0PpKc { -`Ob y݅Q?9Pw$wCPX4J?YI00d{5T3 )>!ND&<23n]$!B"ϸtIܴhخxU7S1 &'`p٣HwlrMBtBr ;tjoV=AnaQt(u#B餦 $3Ԑjo갎}UK#nAK߻F@p~&7v" i7+ .b ݪf5A(S--V F6-s\@3ːy t Xb\@`\J@ϊ<\@`HU .N)U( -,D,\@HO\W8gƦF+{+ !iOwDH'F o JݪW65oF渨ٳDx)c\8hK]]?*hxj\@`apy x@ -ӭ"4!=vP: -܀{VлJmz1C\U*tpCxIrAb0 vQE!-;B -$vuû㾹 rC? -baVQw̜-S]̓ݪ?8BXs9J7o7NiCݪ SPÊ -ChXSPL0I!!|FqH@e)a^1oy`s/-M:bgFP_ofE]҃bQyΉVsnWMXi ڗ^/}:tY7bP]Q01`QLdn4ቶq`.qیq --M^3Vo> -j6mk\Naچ'E -xI S *^~r&Emgc} M/h*hJK -IBPgCCcBrNj62JXv3waY ^|Y}(1:"s\_2=Wfț `\\~րWNNYt$UKr5dLeY~jaeDր#ٶWΛ#iɞӋgb1GP6/ y y@$Ns1r 2/IRm*t. (HlOўRNM?Ʀ8X*шGkj"Rxi[&Phaae[fSvH_A!} 7z:`ѧڢdS7wQ/W̾.ُꇏn0S } Wre sY4Hgu;dPyh@q@&7j**\rR/Khh9"@Tg_wt;0#0t(1(C9D!: -xdqAb^fJԳwBbpGoР@(|6M"q7+kt',SHM,(d?<={xc"i\krm1 L^H7]"I -7VзFc7ڑW0u.v2 Umww vC)Oz+t -NKGՌwA!h`S01pi -uu%6V?@rY4!Dr=k~Ǣyn`(4(\jO=0+kvᵧhHo666o]1fx7;1Pw6F(cA4k^'5#K_hxC4rgGުjC0> tNܻ4ABqkK -zﻧQVDPhY5iUvvF[M`[Pg@U2t H]'Vj"#1 Ő $wDގS@@6`zfgM=^\2iL. hAґ^[WDE0c {. hGήkgW kHi -zF3lNIhducw4̀SܹwL^-^C -LY0S17Gz}/PzkF+DΚ|Q<_ou=B:ȕׅ"B<8P;d8Fgp%^R\|Ce_b*pxPH˙=BbXP>Kdd@0̣[!(BPgd CΉ6aʞ`^ _s[-9 + c:*!԰ m#\^wmQ!<1zTEơƉO$igsXf|܈8ZF[w ЊQC9i%2*fl'QlIHUG u6>V`fEXASAAF~-ZW Jf. <If 8SVە>XCql\@A!*$14J[7n' -)Mc& b*S Ce3!!Rp!]\@@@>.ZLhk5Z -JZ16!o]))`bLOY\@Јt`kT Q6~Ę J>/Iȇm sA ɸmAr/}C;VdL)_KNu}B_]9;6O3b#%ni}N $P"Z{a6.6=@{FB0y#M.{0Y,vzW. zQHJ,9L`AA DD.*#J+FMw5i/S^ 5F%|eFIsK="_y&Ϻ 4I͝ PEIR5Fq۸q1*lj C`oGLK$TEX}6,Mu9vos&l/eGg@Q L *0]0m6>.̋UX,CmLeuvXvZ ٭( H r[f^̏ 0hfYcn& 41IC~$~8~0zsHj )+Ma'an)w^0r-R*nT. Z_Q1jqaھjU-NByx{w˓jYc0z:4XZ3a OA.l F^\@~Jn\@Z,. p](w7xj\@1th#)Fz5 UCaxlOCϣJ\쪝!`ؗlD n&nmQ1nA&>6M' -7$nAn' -7 G[ʚk<^-ң.KPʚK98=4*|YaE|- :(C|)XT+}HWCbFAԳ(D.ɲKĴkmV. ݋{ %^ ²60pz>T+3pݫ,Fi"5T}ABgTBx+\Qv/ =yoʾ!9W7u\@0jUE'JvS-k2vj3d-^T'Ҝϰ¡GbVi ϣbZ%ήrt#uEqb6(?p $-\sxYY]˕&vI&Zdh.CB -ԉ*R{b{M6l1"n+s7\m~qpxe7a_ *TRn Ű!rϪQyY-;4%'K\>Vqk&a8UΉta9p5:FWN4DYX$#PkN$3>!8`w'N4QhhJqCqr*F#+I( -rUj](D=ţߐ -c|#зj])5ͨQ``Ԑ2peuocoHrKcu"fG0/'U@ؠ (G!`fOt*@1u (gHW77Z`r:c3lZ4_=0!E몉2s#5C䃈&a+jkuvP3RwxXt/>yfTedTi+$1ri1xWܔ쬸/3WR~N&4g뷃6?>uFԴ -VrYe"jMWMVʺΌ+-MY< huVhPcyzEw4-'j1:puIZc(6$аONtND$KcѲۑKdH'2WW),6^2̰Ћ//wހʳ Se5KT;ՙ ҉@C3 COPq7[9)!\WГ(wo'5SЊط\?*V{x {V*⨕^lI5)BHe&p+g' jtƣPK y ,>IM>~`ʎ')&d1e_rx¦P >ZwǂE^ꑳ91XaHch Gv0+5|M.S%ƌ:T^+IA!4aÞ 2. 2hNFgjzDҔC5cFu?S\@YOM7$npm 4sv9WDA24JX n@PᯥH5Z*SxLnmN٩6 iP @-2!4pWH4@$Z*} -b Rݩ:D{6&D -P%Ƅi1' lf@`Fajݲ@19X(ldZ2 E7(J e#V|)%arHv`O OXlp߹> dOT'"~9m#a/I0pDI osd.:I٤3`A!4& K:;Bk5SO$c^%&vtfE -pe6[)#JSݱLޜ7ޢT򲇨T J{rhr!tAk-H$^. hNRg/#:& :A~g葳| dϲ8K1}aNe\A?7t+UQH1 $fC."JBL&4 &,D@$q RE$S&)*,<1Pmpwa -UJ]]D'TDŨXJw{j67(X Q$n(@]/$ V }T_V?+ 'E8( GlA'7{Bq :.%5,0wx$hGP/,cJ-4;^#Qw&IꅐǶڴӟhpxWYO hL' -wX@0 {\}e E&dP5K[_Yar'+(lJm!MzkˊZ|#k ^€)$[iKG@ $7zB@aQV#0zֺI>дL6AV;j0ӆj9x\; ĭah\{f5q\؉lpMŽkDA\%I;l7#sh kH"vxnlKj"рmbVihÁ0C-FM! hb2C4gxhzYD,#h&цfOiC -'!Zf#~Ƙ?#H4:Ƭ iVkQMb̨M;S~>j窿Ԥ覶߉, 60j;ES; ?GmP(Sۘ{ &^ojX9dyKNc80.&6؇NMV3_{i I@ ?h{/7~$ky%: @X;/S?7/B[MX"]G ٯmZm"B2J"mZDeӠ:ڸYs(^+f"M_[g#7q{g)1 Edzt|K4C[`-E @Nl9 آDē[2: -T?e~ -9qAovwF0Ñ'>f6#MS%U<#b[P;@)w1֜pmYmtԾL %s Zp'SLn6[-oUͿ"pMC~vY&mzEYt2 !_=;5vEKI\G>NaPOØ&<Ԯf(h鉓}L\83L5+B -aXKqVbwtEIU~?kHGEb7!42I Ch qT\[/ָ&ϰ* Ni&k9vHVe>LmM=>#BrԆP_yzB_$c>!+g(jg$`z!ZXdUI`nIdtŜ'-2:mITgmSV&gp<8GF0Oߤz!i ->Fcp71df!`+.:ݟa"! -q[JLmk!S$A $ K[#MAׄ–>{Nk(9r.Je1FXWãQWvg>f܄W躕U&&r17QС&Q*f$a틦6ׅ+I:f{KyOZo`HYD wްg=Xl({DWMRa%ڃUߘ 7U9}쐄ȼz -0ćUڼ0Ɛ_r28dyS}cAdM bjwxhj y (m;V=bH6_OF|u= -JYMm3mT౧ke\ZP{%>rqjut"Hn176Zʌ2\<5jS8$I'Zr%^EryvG>dk,!U(;,m 8`5x>- m:!N W`#"-JtS{X8-ɸP-9*D3j'GILOѓPq李Ue0SuACi]ל%Kps#|5؍YgNfJ> Q9A`FT {UX 08n vcO= `a1>CQ,=_8S;j.DbjV 2ũ<|Ԇң6b|΅Φop>(bI`z:zuY+^4oz3@f1[sMJ_,1e9ԁzĊNBe4گugk-]XbO""J=Y=yo P -wO -Uj5XhCvyTvw5^V -ğ+a+InBJ -8a8:ujDxܟj8U# 8ͨjZU|0sM)oM*e$ ,)BpdRDf?u^\2H'%3'*Xi~4S2s2耘S忀/6*EN1ܨ-Tm1x,N= !c5af"qX>Agtܑ6JFM3w|&d5kA%/c˨6ؚE2>)Zt\+ub. CDel\hBOJ, KJ$$Q$@\k8daWx!xוjs_)O aDUk84~ JMkp2ÁBXh})IX@pƦZk},]ͤL5U݉}s[hk5MD`RO6z[etXqJ;{KL9WZvNdP!'&1J* %bad$= <9/=k znQ`FylX:,%BwaL_,e~O57@։gw/C0n}kpR[GIα11@I䪨8EHO2WVz&H t:+^չ -X#okqgEk&)_aˤ A}vkk]lJEĦ;cK# 5\/4^0%&W?S~M)+ۍ~w7m_5eu!Q~qE߄a'ԭW7/ x;NOE?gk^8/@t 58zfS (|Xrؑ`*RyP( Q*gJmGA刞vfXq}d)vWDۙ!qi^} Wx DvI2or˂[ 3#[ [bF˾&zDB rX+&rh='EBsiΝ ?z-ribi*a[ -5> x@BC!‹P6Y㺒WFʟ7> x؀oHi`MoEW3U:k -`f[Xm ʐ!%&I*Q6=f)i o 8$IDG{}(\+Z`EY*0z,*8S+eXR~c;,އ8Kz{n<FC4 :\J>>-H I@u>TwEl&4 4.",Pª+  -ϒ\AfsLfjRo&GIˡQY߄mAFMC!։cY5B MOnE^,')OJrI׵l;qog ̨P~l2DʉS6Za񃮮d@bʦ96qⰝ"<'NbT*jz[w.[ޑf#'2q7cElnuݚyKf4%d!$plHn Njciv7.{xu"%zH޷0鿃:*w̆%1 ?^tG8%EU|sn"ԃb"uL7eՑ1o!(;MnU.>A/+:IcLL,+7oh;u -'i?=ȹQp4k1d42HbP2k -Zh+ -F>q j{&B祒W?I *Qz-nJrTV@I3i`JzO_Yf9~XP~3*Q@MHmJi c --yz(=H+tK1JV_ p<k~R .z5ƨ!YmhRlzDֵmJ䩟b%3sHD.9IEG)@4Lo-f^=n'+H+6pGopSS5lcypad)'0XlWYNv+K]+1wnAGRZZe;ÊI >av=H=@[ՇYs;cvQMI\Jfg- jJBFH Msqܸ#6n`|6n[#Fk+S"4͵HD |NnN#I%isz*=;viJ8ۦ_L)ALwK3RUZ+*ۂӹCᎃ!4+z{6j`K}ϖ "ۑ]a!WTAH_B̏5'27}eve;U?ڲu3TKIJK1A6CS`qG˗æA+W@O. rE`qC %osowYwU{YbyK1%7. B5nz6iCM2ؘQ[2-QHt>΍6IaȀ ܀NBS@4"jtې8<K &T -?W4]ìӘ u`}Z>_e7~Oݛ~i/Ľ³"֪ U +&b#A h՚no#\_,d+|d۲/~Q՛wa{.V#M,L;u5 ڌ2P8SiV2yl7%吣0XRxzpATA܉ /)㈇UR\!f׆TF?B#uo <d5S@퀠!+|o6ߠ>B!DH;`e#8 -4 NE`!৉` :2`qeG+GT )hC'.R5@qN(9:_U -+ 15)J g%š]tnc~)@w;'g3ՂBTP6WH9:Ta:z  R{byt7\>r% F"c:shᰭw@8QX9:& 8j N6;dpg7N - D[BNoNbA%Ȫ븤;Rcdie(tUׅۨwG6N(aviwmd kp(K&(aAj>I ϩ|cA.tgRv_ P7D!WlS __=3uadv䉈5q֏# -6B=6 5eַG4:%aL5 *C@!b+/[%|VVOZTn3QK8MuFlb@B+n=@!jD'F)LDFyEaBx!.O1bڃumv8a9PrB {/рTNDP!|FP+LS9!84>@ "jj*2/h)5Ҵbۓ#D>?S[wBB2 -X$8< %~C&R6.b6Nt .8E$~TmXe-8i@" iSPj{nbSk581B|5\`{rc}ҨdMi^N-z -A ATT/D5;QȽ;uˠ܋4)OKW#iʎ7u8Rc #piyqcp& ݰi3 -6pC~!"ShO;}"!/L)/x<K,aKlԹIIYekQ\,ܰm\ZgRYiQL}%9LΦ_ +*Mׯu#U=ǸzG.,x1F&*<eƋ0ex-e& Y?BeՀEFAڷ.w+Cnaծ9ņ:8sʖ^dیr P QC3 &|\*L`7Ʊ(3\2hrvZpybO|.0pu um;֨]PRR3mpOj(7Q >`-h⬚ND yVNٖZRjB!̔{՝j[g0Y ȸ'y}1w wJ2x %>,wdt.F|Jox@؝ 'x3K|r?8j ڸBQ7kFG9p8 -G.-yZ+R Tg 5Rr:0)Q',*O Jn dz}Γ)޶Rmd2nG2Ɔ2 W%.hO\MX6@Bh MTZr<Z$TBzӡG$OYGvlT `ϣO{?IlRYpB  .N7vbO78ȱ`gC,#X6y< `"o_*g\9'6x0 9&roqvڐ sE5^ l0dT4h^ܳ浬CŲt5̼~ݓ<\q7Wlyq,(c06K{ߚiZ\uw`wm8$>Hyž׊ct=tz[+9jz49ol')+fTϕDGF'25FÏlRc *I1nG|z6[͎z!H̍7\js֑L@G\pV/]s+ F%X6a@G20S}EOxAUu EʍOm 0ÎÇ'W>y<~^ +MpWFVE`J?qVَ03!NDj=!{2ڌSA9Ċ0;EC?r0] 35 {.L,v |ӣv]CLHUnPǥA:=GfQ&} ӶBvo~P5Z&}[@qYH_h&IkP˓CVSfW Sh;!3>EK2QE I@x=41G:5X/^5H(Jc8uf`f+kN 3ԽҺ@!)" BDF?K0d0JgQjc-p:P\)}.DI=f6^USצ4?a(*ΦyJjOgG y䴟/cJ3s -Vꋪ\߾g7"Tˊ`-wp\_,4څo MA8'SMd_\'͌h?lm*ӖT-3b= Q,[2Wz;XH'@C%Dn( ?Bk}K<4`[Lj!ڷJ 'Z I| 庁K–@XG+{{B;uzFhpq by\#Z>c̈.]-*'n![Dy.PMJ.X@$F9R>'n`Ag=^$re b]4G`S+(<6Qd-%'"ng -MbsPtC<[@x_bsʶ. yɄ ԦmӴwyDb5g"$zb} -AM(8M#^t*|t {">2GދO ˽ُLz0|~fcVO,@z_y)l6zHC(WkD}d~.uWN9{{q -s}nEL -d0xd3x4tA'=J FbWz]Tz:Yv)CiYSJwMIcEZ -LWw8#Nv -ȯXKjF -L2G5G]Q7V xa/:#k3=Ek(߀0q%GF`f6 JM[U`HVѨM=ZEel2EFox;_q4%i( -![s*;1޶ -j+g ^$ \㬦 տXVQQۮ4 sޗܥUm@kubl['C! 0>N]T=;Qiin7P&Y,f('RcNwXv&G#Aۨ8rEZ6&{پ^G QOͷ*hJ݀Y2/hFxyÏu(,Cak?uć!x-;3X 0`i9`ӤWä-Ѐ 3167?/[ꣁ~7PeohC4} Ӱ9pGf -Hi`=G~ڬy73-5S(l=*.34;Ot`Jtt;Iھj6p!DW4s|@ IbYa!mҟ12gW^2bVكPx@=Ue Ek!Yt~X1F .!ݘ(ΉA@.mW~ N70Htz ŧ.|8ez1/B)< -V,v>F ^y`k'zo5MX dXށWꦔ1ǽ+v5pf=e(#ޯ '#Rqy)iO(+QS{>8,vOgTOŁ_d&FH1L.pCK ɗhKGJh{D 탶FEH.H0;0S7Mb? TePQ-^$XW%PCؐn -Cè7xB0N>4!ty4X"!7 n"q!|")wQwSl$_rA}=V~zzcX4ĸ"s+ 'Z "fM@x(oح$kU\ iGZ}_ɵi3A8=A 54!ї-@{x -54 &(ѥ0`-ZG.yJ.8Ӝl >?W ' -c&!ib2pÐiRv(SwLZ -M44KF 1/OsD06RcT$#ת9a3q3ȉ3y<4"ir -Or߫dV}7)/D -Tº$ӈCokNhOWzŠHPRTx1 -[;M'>qh=+[{HCK\`9Ȇ>@eavm!J/63o* a(n]-;igϱ woե]WzZ "zy'G-.R 0]rm9,miݡeLZ|;Lo]j:k2ىnٱG]c -Zâ)> -Bp{?l wWJN 3T{WF9عEZD@m"~ͻ9x9-Ѻ*_Wz* !4O#EY߷Ij=Fk{I?d@6HI]cd)5jqw~|<_:օ[ί;]h|)o9◦ivM|J/V^݌֎;K˯Ge40]X] J}c%?(n9qD "k)N[]Gu?)$IHѮb#9t8ŒQdw^ۅerk1ʦG^$xMl&ٹ/i xx !HAD ܙc">WF;7شa <X 6fwQgܷ+qTnn( wr$"&@A'@ScFu0(!p`8  0()PE ,<:  8 P`hPA@C`"x8 P р -4 Q(XbE'@'(%8@ 2 - pPUqx!uef)%gN{YZBKX}ie(3XGl -mrX%Dk{#>i__M8w&M1胙 \W=Xvxgxб$CQek}Ho)8G82HsC"ɪS]z}7/94: fNќ]zV2o+F|ff&hٲ&KjJ #3ϻ̹#2ZNH\6WkW+cm٠-p -pv6xHMjҋw->)p:B+365d"!Zݡ٫6@ TAbP& q#J`݊FseAN8w|PkzǛzxs0ow0cug*]&ᰀBæB9+hr3&LpHzTwEQQCFRb!\T ED7Q^"Dq 0s\v]P/CbXS!^ -uK&̡  -EO)%Hf^Vs20xvp$TL<,&±SI P{,bYp@P D)ܵ];!AeȢƂ7߼'fWiV˒ QüyLp2hS2d8(<_)L*Ä,p qtvopH(*^3)՜ )pHLMM(TttttdTtr\\C !@d@@/aa!CvD4C"BXB3S} PƍVj5xb93$hfm-5A3hY"<%6pHe}"͍r/2$pP(gjA};^&4fbuH%'3f_fOЈoT^~$5)YUClEJ~~vx{T6+*Ja.wQuးش@+` 0A R-O#3-:1[f֞zSeh.pHp&TN=I(EđG5ĢLVJpi"sua^yrm~#WH7Y,Mm|NO3aL%ANKE.z\Qnr&U*yRbZ!*Ra7% *!\wR iJ/TŅV+qTԴ1 -9950uK/tE5s:mLB1')k ~NGl,;^KS1l5ʼ~DuŸP&Shbqʎh1̞lxH\Dq));n`&0İZAlRXdQRʨM!B.Sű$ЅWP0*6)OG0RQ!E RqNr;!qSaJ\FEˋ卒J#PHQGO ->~ &䍲B( D# L&ЩKׄi]qbB#"djJ[AkH, +#Ē#b̻LY1_53xyI+WJ I$b!bXgXfH -($E9DL4 q% !DYK&f a9ɼգ.{j[J(9D}>l<8GXU(DzV(uւᐸ]JN`8$΍E-tf1Ÿ#Gbe m7le;=pZtvhӺê=M4#7A9wCDݩ7 OlS.;b".ك{YD2or}3#yux(=dǩ@d~)rIR<) *%VIS#QcWH&㑩FVQHA3;cѐOd}tQ݆ޝ~v6C.*K62䢕}s==`{LM),bٙ~-$6%R]VH#ZHќ.ux ilp0o~G=3y|dF}lL2~^--efTeupGF(:C\ _/BS!Gmb qz!M֨Vh{|9$[j?=yԹH ND{L[=fؑGP 1svK{Ŝ܉] ) ](4iGᐰ*#cS)Et"C,F#grEXl^@4t, NI2wXd8 $}Y\ -J -7Iu1B Ġ%Tu5h 08$#8K>f:H:2,0 -!11DfN)vzӥOf0MbCdBL >@=EZp,hjQ"ߺdA̽ a~=ݢYhdo_ki0^ -ʽE|X(@m%8`7=삝tZhrp?u@^$}.1liMCn"%˨П1>qƼ[Vz9pU*.C''dIfd.l[ h٬1Q=}AP_@%qpĨ4"mWQR!X}PpzQ963d$" fЗ̎jG@9U0O SX`FP4Ob 쓭܄Qzπ^60S!Tߚ=3?:&m"⤎yPuۤM7%8F$,a7ލҕ:_1b*CvJ'4GXFw'DZhR>ur?\k*O9]ˀ >1(>Ϟ[*6N(ĐM!ڢ7G :Ƽ&qGZR@pO4JBKs"][M*8\ 7d?qyj e*ei'ЍqϞ6'A%)X\0 %}iٴ* }UYz+> rZZ҃ggu5]?JCZ#UE1㍤*8!!uW>B%nM/NX;7hr26k'M5y7N;`[xX"42@*AۧA֕ y3݃n~Mh)! LnǙx"mHV3,iwpShd'}-`$2r6NZސ~3]lD -a~nBt\Mrޯ~hҙ}V5PcYS1@o!W -W@ -E TAyIz $ :uau ^䌿"i~_kкoewZ)F4:I!uڄ9.v?xr`5NÅ N&' rRiRRЋ,=‚5=<8P&ͳӦ9yǙrV(eP9óƯ@'޸^7"JP/9lZCM)AmK5J?@dvE c>@_y5lKw.!sw$8G}R/OƓ>Rd˄ .V*z\8V -q(Rc$D$`{&(I:)lB PqCHbC  иfYb4U*ŵ*\*{h!DX;ҽm{MH%f7 +v \ h3ԱQ˙V5*N5{$dp0ق.HdU@|/3AuBIGb r@T`AK i> ;"԰0H* -ן/'T[BO$t>W*0̊#{=Ti )ZZ BȣGZI)xova-)=gf]KP‚wڐi{BGMgf@Fh1 \)E:6WMBylwRF[X\V9\m̠}zZAG+3 - PEpU{Ɵ- 8,pƔjW_V߶Cc0Rr֛\}"25bUt8; `IkӦx!P[] ղ5սh!Bݖǎuӄ.oEc,׶Aȳh֟PF?K{[ŬKD٬Vz"YWr"P5WN~P.1OKWa[֧bi E̢l$`t Ue%Nj7?b y$KXlk[ӻ[nM%EwBڦƇzpCZ6pQRTnIT@3V`?!!5G>[c|`]Pc9bq%;yP:؊qg3ҧ  ̜XZ>PT !.bbAlg\s 8v ^f7=$p<+ItfR4DER" Y:+ #AA@.oQ7(PW_w`6ВXi^jw;'umMK ocUxQnL?f bLM9}h1KC fwOs""{"%ЊW(|h]Yi\˒l4؍BLHw'FΖ zV7lE>wUM^f|FxLi)'Ş[vGM@ucеD5gTĭ2)&8`>uљDO!R ~Mm=Rx!Ieig*ҹ ?6u*;_Ù6 a{W2Gν-\D?rKo|+P~, -zp^9wDU@1@5[)2lP#B;6cz~E%is'IJ6c}PO;q2}t1'ZŇ؉hn8"f@ ,b8bǎH&CHNW 'VE ZIhy }X9#|~V](NJo#틎BxU>\&z.Ԍ'i}lզ˾%8i`'`ء*s -Q^,CT$*| hD6vd>b7mM6!{0p" rM9cj=D'"U֋hQ<<٢dgqQX[?A @](àX̣V^1lѫ*O+zsD5鐰1;G36o[)P`F:RaxMjri)U:Enԡ8fr΅N֑ - iu>8WQK9t¬(p̕mW5-B2@FLP^DɌ`$y̝Sz<یFfN= u Ar z[Lh =M/L3LɋHMz4QA듽gĥ_ $.:K#@!gU 2Hy^}+ŋMȰ=N -~Z/4I~,m+`9ϡx엧́`\҂K{XOFV>P/~ 3|fW0[Tl2v= ;!j'A!ae--bP΢:ũufa Zd'?░ۃ'a7b!sS >46SZ<M5+K7OB#Dfc66,9TW'-˞`h Lb2ezmY?UQTX5q'/Y'b'c|kZVy /Ub0DԺBv2q$c_J3=VnKs=NSe] 0ڇD>@5Y[̕P$mOط{h -1$EiLoaN %aE.)(!7fCc\οciɎbynDYZHO΄7Lc b6S9V.\EGb8l[2I/sTw^/u-I]4~D)7'¡yZO{0qdRwaR=lo [@xa3by͵\2 [?`>SsO(b;oo-3 - m:.O=YɨMNf̋{w30ۿ%( -VH:sE+J MS^P;כu0$4 -u BCʗn^0e6ks i؆i< B= MM0'LVO1Ak3&7kNo^\wnl%$S |f ybO㑛jS?^n7PC=}J5۲4#4vǼf!煤6I[zy/K֖DW6ߋClCcU?M̱QnpMAдwB!h\ `- -U{pQH+nɘ%pXH<Ú4iC0wJ)E$,M;4jLb06ar*oǒ0f:A7y9ՌCZP\RXYiL|T l4QW?Clo|٪ x\,9h4lC~ӥ=X)ݜ*- FfBbZ ~^]E' -STO-s#Pq40_wgrS]mRL  ,'T߂hT*t$"3U{s yz^FކkSMFPڕ! }-ktdѼ[YUqpȽ1"J&J y+wS$|<V{ !S -Q yDo)AÕg:⣩$>>P µG@WZ80Ԗ21*8LguK3A3W]wAT,(&f~vVQs;YS;0.$zxΉ\}qDgteKjNC/+cƤ_" 9 N{gBDd'pT PkU q).CgMP#ajB8Z litLڧbL0gV~Ok0}dQ@LrF"İݛ>87J:Z6F4BC9aB`/Vs0zo`*Z b-T4!TϚɹBYNp1 %7؏A l"}Ui)Q3(ʺ3Z/ڑCV Jd #䥼`Ų{ -́vJ[B -)&/`k:;sft @*>qA؈2G1-y}~X2A&/ZQz@Dݵ @r_3B y _>U -Wk1J7QjTŲU7~:p=&} vPƠl%YǔHg ,򼺒a/3ҡ" 㢜,OkXDS4: Au+\|N2&9+Zd'ޞ'Yú -vZVHg`k3&NXߧ2'N[@zB~Bn+`Z!TJ YCڒ0 ׊i̛O>1Fa ^ڠ(x D@L'M1j~ۗ>dYEPJs#(I AW\hs:2wh(DRjWsW.{w9 -s-HVCDF:Iyh=u"o%e+Y;6Ъ^E --`FTq7Gis( -BB UK@BrP;1$6mG/EaQF l#H,,vK@H5{SCte"l"4" i-C Ad|G&~BY\ KV'C{kmj "D3߼fB\Dd]q`t*_b:E6zmG_8`{ FR`ఎVvd`"'IrS)g.\$?Ca7[l 6 6\EoC5l"ŮZ#*<.kq:w ey-LJ>@ -:zF>dzՊ9IvIŷ!#Sr&ɐ=\>YUۙ q yȸN Vh'Ŭ"ƥ]jxK*a, =/-"'PA0,ۘngN*Eʟ -gPJ'BP1H0噇l#(II]jE^TM?47F]ʜW>vXll,=f"pJHW5 -`b 'X]jJl"M@~ſ'0y,x_I] -3(Lհog\KHnYJ4,)$c.l%W[Nfa#Qn˔ 0@ l; bNoqJETͯ61?ssWYwBo"Ƈh X(V@9 SKpD@C}YFf RHIA5U{ b:bob*H-ղdk7Ӥ5BpeF@ȹXQ!>b8ޔ(!}q(<:d=C2EʦYFԃfVEpJ>w.W E9'ަbl5r&0P6cF{g;AdeSMFw:_{jVd裗Ū̩NGyC"u`Nt+mny*rƐi{M(Gr.` -wpfYj%;b l^-'%sXG7'UܨאH ee&q -I'j|*}Z![XoΆw8Ahk^Og&-o]&7p  -fm*$6ܚ*{u)=5>݀r"SpN޳Tj-a~͘a^Ag)6}HPW0mZ5٣"KGƓCucbjMI'߈`;;YGWu%O3* utFlL>ARƧ<}"KR<ٱORz̭ԗAlg@(1JHnǣ\b`^Y0*zmPn&gm7R -(\D<8'IM=YdKPk|5֯Gv9b-АXmWfct0hIS2M{aV2'ؐMJ$G--8H h&zOPnhN- BE>]UMr>dy^s>2hN MEb0VOWE@l 14T›6-`L{{[B’ZWi<5 Sa`:bɻq2a$Ɣ%Z#z8L;)ׁ؋3X8[J k43|*ﵧsCcSW `1#|С-a-1lV_.rtAEjн\#VjRJ Vo4 [:h?FWgjzAlBh;R%5sx"qMZ}-{n ?.gy/{#L%R-{&1^dIz -ƈZh"lOs&ˮ=lܤynlm ߱qig(mlέ'PnI7p6e[y[MTh) >f򴠷c/`:R@&ee s&7|d(yhe}ˀ6Q#\f* wy-u.ic[hc8ώ9rsǣ\*| =v:v,?:xlѸ]ctȍSq~P!b 8{>⛀F2q6A]1d)hqM责{77UBYCbW%/=owIL`(uަĉRP!hd͋k\ <ÁCM[[|YEcÊv ߤ>ktnCO'_XcP>|M5ĈD9HJ6#ǩqffU@X>K,0x.bA#QOɘSˆ,:;z繷zf)6 "o4bܙ)3NJ.: - ]k%cXɹS̕p/2)<2FdcsF`x0-gA0ZN:zΤ6}Yn՝ez$)K;߬ -!xVDEth/{@`La9 EXUg'RUfAlCMd6k(YD}G@,~HDB΂YnƓZf&"ؗS/F;qK|dTzv*#A#FOSo#($ 86QiuHfb9|^Bl)= ٸ瘓yȇ-_ұq6DFh i\va98 (,I譡qw)<4\O_RJv]v~5;f2KA.it'4,ΛG_3OY-"H[`C<_ڄzP~'[TjbG=(,_}bW)@%'vlU6ƂdIz >mb$X1F;7sۇՈ)E ˨b[IQ!?;);x C< 'QⳭkdHj ?H [[cMs y^OwoZIGzf y[ -|z]#q% y9 Z߻j:?du# /:Ѵ+Wq<بVm~nq$Ԡ)/qcT3TlMA> NkZ-J3Sq`Ozk:<BS!3КvY|[0Z{%Ӯ)A0C.33JH#pJ+C̀|B67Ѿűҫ=EiFD.݋D nQ=+L%}& n<&[˫|!*r0 NEy=;},LϦebb(R]յKM}W5e"h"ϥ Vl٣4#4OZ} MUp,PqWd`P+4铽KXeOFs߹'L_-j aJ Jj_פNR$͢e?:<ðS3Lw0jӱ9IG~/9L'RLbpM8hk9VIb1DK?|9ASzIF6@1J~q,ENϿE%54/0 ۽E5":hq#MF0#inM/g:gLC72 -Uuk| Sr^w助 [((їX'ԙ)5g *1`:{l_pk^gBWk 7o ru7%1hrv65UdF[LuG0OkFHSDΊiX7EG)CKp -&RWf5`NxKOt9(m*lVR:!QyO$u Yg_OF?O- {A9/e$F\H!IJ"_KdCD&i|j9cL9/C#b韻zO-el&ݞ'`ܭR5Gí""ƒrO] Z`E7f:Yw]SѓJ>B6FR?P:1Axܯr?M/ CB:g*z^<6-/pm" =_k&~'kp-0쌒A>_b݀Db 9bIu$<`n:70§<֢},~ܡΡЉ%1~ 9f:*ȫU;^3<!ڏf QLFșİ]EEnj6 Hjw[U/حMf4ձl( -d+Er{r. ězKAwDZq/eGԄ-so9`ӐDU߄Vѫ2LjWp.@)_:6j,ks.Вfkлt B "|&Z}[Q;}}a}?r`X -9W~櫻[~ $1C]&M0iꈚpСLmݳ)᱋^Q>Ax~" Z?i55K X4 \[}axX-5Z˱ZTepSL F; nd|] 1gc.G|TZN1CMX넵;ÈkbX}j| 5oӒOd Ow+CT\ V͂ai@z&@GkqW4D@|;"9;D<_Na"t3.wHETODs^)"GWp"MbO?c_oX\ l%wTЙc[*U8G{wjϠc8S(ם\P~Fe{jݳ$rʫjyoe8yY PfN17G+w;✂R$IK!I"_+fP0%y1D؉ 8vaÜĦ[NAn4< Az:i4. m7m޵?6:͏hw3r?:g! $g}Pof@sjb"mN&[ =cTK(<󜈏*Q _Ew.X\ T'FX`mwv. ;[Zts0BTxG܅4?0wKkxqm]+XT4B$U;FѓDc"@un)j3N'o-,{r:WǺow4S5M|U⭅jP ªQC:eAɛσ.&v) u E%,Yh +qOˊH_ 4PݗSre*vX݄b]aQd I  Ό x2zvcL0,*[t$2WG=it(]1݀aҕ)%ˊj?~7*0g̫CD"َo[%E䕶"~RIXR-z&@xHě#ZYEHf@/b95H^D!3N,p3-̶\dSQ#3o+8 ;gy>Bk RS#ikaa۷% ZrF~(~ ʃ ?mqFhfL5yGiZ7OK~r徕kb'Q)z&K] z'rM!ǤEUTOh }Qx_p.BW{͌N7Q1Vs,lIUV2V9CJvrf? 8Vt՝?5ц O`Gl]s*ճ"M|,[߼2 +m#}=k Kp5Y=w;!PV$|oz*in8BTXvこ'lO )lEiɽqBہ^[k(^B(?bcvh~ O'`nOX웥1Qv䅷 B)+ -E9r D)͕h#A{ne8CmdiH-gZf=+)[Dن3)Z7mBH_a{(` 0+pe!xxi^>*3 ac4LRd&ot0 +jaejy$q I'q%b!"d:=ΛnJ0P 0ϭh@kR*8*;%l]diǾ]eG)%!T;05݆sv)M߹` Z6fk;R` HI*O#A/iU 7]oB3~/Oa}QXC2*. ri7d}N_(rlM <gkҭg0ЈD<Y/I:R[5ҖDǪ0H*-Ƃգsj/AXV\ i u-d^ +aEwR7Ch=F"WtRղi@ަQD+sp=Q̭M1ۖF& NK|x(.MSG"w"Sok#c#aPBشm>G4X'F5`<ɨGî:x}pRv1G;怒ޕBk!I@}<)FRq Ē +xSWqyVs`AոFcA'({$9h,0҅ϱ^ +ers*&Džvm +! +hv" dkQXrGE(.cecD3< s 9ؼW$KBX-s)Cx4FQ:%PH[&]|DAs&fk"qAS1hRM/pALVvxU(v)`&[/,C7oF횤Ohtn-ÎNQkY)}v;U! Qq$^}BZ},dMgٓF%PXE^+;ɽ RHĚ/hYq͠c$\>[bÚWh4VĴ0uvUG9KCm2y!MvS\Kb4/ XxVdz 䬊i˝]U9/_ψ#\<,\b@I.!5HcDJxJ3Lx<>zq(;Hc` x/YPY AFcOVCZ=p'b`44o!NZa\JqR>cUF̓G|+ծ$ 87 [m4Dk)k(^_gfM>D ߲)MNjm}rD08Fifu}=")ވ NlLkqe㴘A|;!D_FIfNlZ1:Jpג$KxbTtZѡ8OJ^Us(L`>44c6|{2%@BsMGm%CLc@ zk +@?i?` ~9sr5W&\L~T%kv)s~"U&1?{3T +kO= Xmk0aڀޟ䳽tBbɯ Ο~YDw<2X1V 8V~ٖCT3؅c`XBz2=#U$m,X9n`taǷVf3,j;{,D0`B+Ej/1$WJf.KeCfm T*/ȸHU'r6[>vcu& +M *I]p@`1v6E7sF)ª9\˴k'=&tWhݼhž +`mLD dB|㿕W6H_])fRu:ܷªeV"ʑ dW`DqKX-ͱsh>.}-J|c3Ar,{(Q9*yDpq^QkM#x +.,@q ̹Lf{FYxRT݌ 3"ߌh(ݤiXRu8S\bPʉ0@x s[ngEw ] x-JǏp:>wCX<~nd)/rQk7F[1O*xO8bnC) *Zor!6:>!,ij"q8\+4N$(Z~;݉70#xI_\-NLO*>w=Wlގ41@ eHp3a TeE`PNџP {z}Gs /j|89> y^f!Kd䕩zcC'h0Nw_ kHfe %E@9 #]*>]o$".Ae̥ s1;PEӔ#tJ$h­`m@"xcv? o 89W@t0=sD]v4K-lbz3)yЌ ueB<po cScS%-=;oE~_«7J"s)NL7[&:ҵs +ٰRl !S,ot;#ٍ/U8sTB`3 bx _;fZROK4mRԟȾ&kh[SГPNuEi; h.W^)ePhfpxT!E41mg7Kz/IxKIU!.x8PRڰPgvPXsCjz }Ga BԧK梩Dho0mͭ@~|2?@u ѮVLXY7uWV؜v~DmFF݉e2Cj9ܠ u_&7=@bNS.F&cX?LX\ƍ{R/iqrFJ +,`Zò UWYN,>gIp Slx­'S+k7)Eo*L;Poxc+RHcHll^y^{_"Vu&Ojfuts%NwTKk '8dZژ_WS[. +cAhėod0q3Z<ĭá$7P+W3LQRd5& EiK/{eӑi)k _WpN=VSy1وRm]aPaRCdj mlA/u9 +yluJlE98  F$L`WI G׳~ey&~>#k,n[iF5 Ԩ1qOY푢],3k# UrO )«T&b.Xri!3o%ZU oWR1#OiN+цqPApxefpx/^L7(@ePK'Z3^RJ]4e/ɘtqйJ$nVgZ*&kf<5-ӗ{6NJnHѡj勈JNlkE2gt>g3>InjC%OĎwg7`tO~Hw3>r7JCUܦ>|*+?YZĆ5™e>>c K0z4,׉V{nN +uӁv'8P ȴ\O+X ȃF)4WfǪfn:|1jH=Ȇ Q[Kα]+7SzV't\ʬ*Z; Xؘ9S{rpL/!,wVkj+2CNYO Z +w mf[U!.zYuÂOE.OkV|K$f]9ӄ!OviE$T@i\IאWοrg8Yþl[N73)P#%C,mSCUYGgBg_:K ϐֻ)G$Mç2\9]qI <[%SobB~V+1%ܽAc;` BW+Š F1}`:=JuT%> ԘWP[ ^i5Al [k :cA 6dT6g&{;0N?*#V2#bzEh޽C6HZJ`6/ZKKK:!F: {>U ,_kj?@crtH#+RHf.VHT#Е4qرAiw؜J*5%!5v45)Ii(I;dˮr5!n DGH%B=}s8]k,X^=|6mⱯ!xkpc=l #!vSd#`SsP2B_a6bԎO?\%z +JGxpfe^S;x2Ycpl2B=D 1贈!{ e?!% *+v6Fuo +t{q/h", +\%Hna$Ln1zm +'I">]D{#pU&ڞ>AcR:꒍9JQ9(f[0 KGf!c$[P1ԼKKYnVF9iT{qN ;}9XSZɈ%3 ϱ +76m2qذ䃘g#cL_(E-; ߨzHU8TO Վ{IRb +˙4 w< *zS D7=N]]͂@jCT Kƚ7/Hm9o.;;&eXGkŸ[q_n T~ !-޸`Z1@xa!W߄?FYzꬕnȡ$=t$|pm!Kє*]Z]PGNrj"vkŤ4KfQa^cG?Ww!В("1~!_-T,+5'o;ezICp%X*ƤW˗slgEd6!Ғ.➚T:gWSC{4䵡$vSE3unxYrzmF5C{gj#Ibx FDpUl;9Hi:ӍpF)<'%z2caUm +} Jӓz1;\jw5]ZR8 % +[=.Ϟ6BDdWS#r=0:6?]\9Ѿ)u_;:3ll'3g%Bv{/ QH``Y!" +__l- JHO̶TN׻)~$dnH -Q1P/AWj2ufcB슝M%WٔVJڎ(g'ngQ][$ +'{Xi2i+`#0+Y$]dq}S<)t@Պ0.Pw#̖2ͺ!h=!gLgSιSfveʕggșg+ ,65iwHުtkg07u..g(r0U5+2n7|[`^tpoO/1O/ d*C<-(QʰVE }=6+2=1rkbVT#Ʊ%EdP2t'sCcx.sc}_/M/5KE6&wDKTwCFfǁ/Wò)NPw>v)/ 7>ÉA3iɷE6 0I;p~+{SF|}U?dq<]/7>!Q3΢#P2fj!Jjz +$'9Q@Y6u320?JC<Y4\|3n/MV,,&ˤV^je;7D'y+QRNf.4ةh˰ ]RL{TqM8GSJWre1DuTB՛GUtifHθ8=bEDUڪy\N-D1 #ȗD@y +&4{8Y){3+&1li`Dieۼ( +n,ivKX4 lM8>:8"~_GaNxRWz&C9#l{H=jSN&8ދt,P,a6a?.x_$^p#TAZ "dXMa߷ +|(ɞ 0+!D;?2J!eݾؔ U~-Ix`{1'| Ǚ=6t"jfMj['YP&Ie%T>H q/Ԡ*ncD5BbF@I*^!FTW}X %tJr+;@) +`%J0n$em&X骍+p&k8z9;"ˢVZS'_dI$W\[ y) $ /#T LP.ɐb$S)R_])8WSζ $``ΉI-z +hc-ѷx(E ֖T@L 2pm@8Gp2<2 mI\9B4u*A7ҔShqԱK"j^ҟ(5q_rة8ALWD4+ۇlmH´OЧTC J"p@az6C?!m.sЃEq*D>km#&Dp+[b@n4,kB"@ߌa}~k1';s:rH$ј| \T48;d;`L`(7{p 7'CE-*f ş%;qM=hXyؖ2rS-=dT +LD0\`#(l/wF9A_D|\9 +8@a\[yNGM̋ad-K;j;ttiզO ˺2᪍ :$zq w9h+ZűC< b'jWG[_- VTwT p>BșTkMHhr*v}D/,="E'yKR"w`uUNFEݻ 5-uGA:rTb(j%r! @x*Ee*-%ֶ#麻 C};GږPp[Gh;HYgnDZ\0 wvVZ85m[gJ۟?u${{6G[uwvp*lqХz)ә[-^.H+>D[g t=> }ӊ'r|u| +ǝ.Aէ?IJMqz#"vG%n^>)afzsŊZ FX9*o) Ď2J&8)Dp\GnD^@Pgx gN!Rb'HӰRa_T3Sy+JrA1Yi"[ aI`=< /?uZ^BcHLJKkƲ2X^GhĒ!xػ175dMqhgZAO"rFcc,92%E^x ZƛJΛҰ&҆ ֌1K[kD|X#O! ĘMAfI=0=''-fw}Ctѻ}+85Jf Vf]nI3&ILH詨1SqR|y: v`PI٥)w\MݑNP5 (8BAAŘx"-x䝋/D)W&8ỉ'%Df{3)v%syjA,L#| s)-.^/5zEBa[|ozI6&7Bױ|0w6B`=JTRp669$-ke +*l$n/f-a;/Ǝ)ɲ{Q&x%%ȣvvOzZܿL]tgGugHi.m_ `U- f{md QҀ"YnϼYdgJ&2ނ#D=}/3%"Vu? dkW+`:iv̐ q,h/<'w8#b}Z?n8HmjVl`q$Ҩ-s71On ˘.2iems*=X!b-.vU{sx/SKUvd^p[|fWjz +S{zL\d!JoYHP.e"(Fl0֔VK`&='KZ k?m>&76CLr0ӎk8q-5zs\+ZsטKm)mi hBL3J.FW_!ڕ墮rH(D+笆A%H!H4nPuI/% O :2wWmD^SfP` ZȬFbt4pXD8dCADH1I!2gsn\A& 6=^a¨7gI!Q Kꧧ33*[I*ЋiM@0IdG"7䝶DDDm[1MMDD4zT82LPTZ&Vo"CME ڸ<(B<%@vI9׺R#MTDH6T_7{)G(WFi yrmNN65&̜$*(R͸GKv9ƍifNS U#ɢo&,evq%$V쨦N<#/"cECƉhlr5A4Nf \5›HS%"d08x@ K<7'1H(wANwW>ACt+k3{,gtT Ɯ5.CL 7egW_O(O.$ ܍P:܌чљ4F?gDʽE[kKYUN2EZB'0bp8Bhp0 a28(\& !$ATА #l8wCh#՞UABL!dfT8Ac)̸!znŌF$ %"F  +O|v" *H&5J D֏|$, +Q1F + H!yn.~ÈiwA)lTEm۶ǴR: -|Տ(˗:Z0\QN^3ʘvƫbZ'Wܮ!Uwwo_ċUUe۶=~+GS2w2 X6`n˷Ωb*8\j8r/VfWl;/Q*C 1L;\utTֵfV+YDd"}i-".Yo$Ķ8@AT n+ila"WlIӎ`憛E-",K +V{.;vۡ2NY:f6̐B-OTJ38cX]KVꐡPLڂM=Έh,<=j2jXhNLfg +#)Īx-23cl#3@w‘cU!UaEW> &Um95hg:` wvF Ǯ>Gz{%#2pE02v6V84UDxfb0KO״VQzbUTV/CŢ+%y܇e}WPQf&cNiv]"68x@Aq"4HjWwGk-upr'JJ̙nrekW#hsGo2 ֡N.`(9H bv;r%ܩE AfD ftw#QLhzu)1 a3Mj!ȇj"iO=28#65Q2'eCYMfj:3?GP {A聟!-rW 9LBO^Ẅ qSYoY{d d5~b`16G0!\/ҵ)ʵ!b2e.#Dc"&ԫ_#BㄽXe'Es58X@`QwU4UkSC Ȩrݔ*3ځ$Õ%MHr<-McRi3N;kxH":X3XbEjha-*Zĸj(cUXUswvB +$) U$eUuRGAp'h\!FN~R(4$i#KnjIuhIs"2ۂ )YJH-!XJL^#6Ry* TC+y# ce1*snӷ~Y4wd7WQY78@*VhUKK鄪eCcɦKr;Faj;6q8[`p>KeU0<FpD @}@C*0a2@ T`8 $4(` bp@69t(0ɰ;@ɃtMu 0 &$qHDaD$Nlk ԄDfJ1{[ecx=خdyet iS .=,(j~޴cNݎ$\dc!D eNDhJn6HTb%iIg۫*|8Zk܉er7ZH Hژ(F9Յ%B#T4wBz}d \Z׭ЧƦ3&s BCBw +qH + i8,|Cq + L=6JR4d$ӄV'ь4~x4.j`sߎ OH"39^h/R8=TI1SJ4"z4Xb!]zTt\7$S2iN#%D PHPS0x@"(3Yrn6N8*.&"y d 1 1F &'-SNV` +Fb\qݟ=Ոrd}Ccv!$x!ϦZ?ݯLZ &zYQK׸^}"[n?i6/g:Ӕ7Uzg0G{yš뮵ˋd +$A1{w !5`eDxIW1QFT8î"_|;!菶J$UԋK +ҡsRe3lk#f]5"CR퇨=/kkųrEU{kNgvAe,rgb08Y>]xip/Q#f)l;"b,&clYf^UaސJNkt+>#_*B|WQ513:X"69sm&ߠ^ 5hcb/]n71YًMcy_@Y"^t%AI |! .T( +-~Bbw a.({%K?-n" SӾ^8<wֹ;ƜRMU*$SHLg竰ť_wЖNmP3eTBc=} TKdw2on EX>#*v?»XݺJVpU q1?jյ9D٠6U벂=onm P%߶A"‡qxײ֡;{/90ƎPDmF0{.+@pa $/?榱b xYTZ +Г}ق='֚y1.\TkpIz]4]#W2p`Mۇog&5@-W#i732c$\KPn: |ZV$ؚmXbԭ (v)//mV67k:P^Wz4x2 #8 + 7͵̎$r{QJ8p 4Rl1]Lu qYCʕ,Q Q,2q]f0IGs 2]bB fd#1Qj(IQO z"ɐpj3򝗟Ahyu_~ԐS$IiSZz1q֚G5WcNc~,RiX| JEr%B(ri1RrMⓞLӇRqmʂ EaY!)%bH(@RPDsXVAeKeENh b؇<r۲{ +PM?M9g7W\<ZRFop 1R:,h5Ek#+9KNSu+*[:@g V[$q~Yަ&`\Mj XsX;E|faB<}R\ɌnfmU3ַd)^O(ƝlXDZpB" {o䝰e Savnp[hΪZl0V?a6 =+bCr*2Eswօǿeٌ>mPaZ^F@W-AaB(60-8-=2$gSze"iXU!gSG0couk#d//\#P VޏQo(XVǞ2FeC<}XQC蕔5B:*KG1 \VZW-;<^0Wio5Ggdcfk诙.鸊j{ㅗYQ(=(07Z98Lpđ P[mj6M;KeOp˫Q%nN&X6NB6ρcݍ"P7ܑohB l<.߇u~v;59Th]]n7> -_\-1DAqĺ !]>=5\@U%6mAG.oM^G[ha S`HlwT9t h Mt0fF^ L@\Ow9{SC]'dIsu$$AawZqJE1m̛:}0&o S>vt0z\NRڕ8&Mjo7N)VEe1T,2\Ҝg}h^&w -eFk2fE(b` PIhn="Nr0sUIə9Mࡌaj;mhQf8:TɅp%C w4? rG;"ԌN#QnT&hdH5 UDM]~~ "2P~Q1R A"jpL17Y%dq߰mz?ÄQo KB4DC32333OOgfVUTӒ a͓#̐ݕTD@wm4MD4Q $蕭eֆZ6lZ}[<5}PE ڸ<(Q!@v.)Z0Yj ƃ7>xtoACt+k3{,gtT Ɯ5.CL 7egW_O(O.$dn2yfD>1=#Re-ZU'Q-Ba€O,F]Y(9Q1"W֐3b2e.#Ǽ.5ј׈8ap~Q\ $x*^m qVϪ !bdT9vNTaD58p@T-aoBҐ#iv(+Jvv+@+ -~W E SnQQ DeT"ƽTSEUꭢR XLCՏk'ef, Wz}ԨӰ ǫ2涝j3U0kHݽ}"UUٶmJFQ -Du[=UuN.T!:PÑ{}b4e}Rja᪠ NJԺ j%)w"+`@@l[ DHMRV-:lA-i:pӡEq)QSX `/egP2};TAp) U3Zun"mDҌqk,5 \KVꐡPLڂM=Έh,<=j2jXhNLfg +#)Īx-23{1pكy;ȱ*ѐQR尢q+_SEZ*\HyP8zϘqggpsgW2"] 'X^4 #|l.c7ncCQMĎ'in7P1]O2cp Y5C&u$t:B!ɬv"W@wD!pY $QO͔\8#Rt<4dB?* Ni7Fhz]:V皿3S (!ݑ E>f%s3ј_ph{XcڕiE=:h(ñBfh'+nH& evӜFwK:bS3 /sR6Jդn3sNKh>b"wՐdckv4Ꙏ3!{Aahmp 4`!!Q3>ѵ;* ![)ɨ޺SB쪆NjUC' -͐MШ◪lc!0-0P9Ad!. -| 7z,fi+b /X7x )b'x{d>f/{̉,хwqԵ=\#V`}cJk8yNE9ٕօ . /_S YQ@! -Fjէb XQݍ^YQ(33)3!DQ~EZpuȸaS15n -¯İwQs?#^OsU}nVOF-g*F%t)JMoţr-"ד f1{ L -= {]1#.ĽNag!Cg]O#TbII,D9f_ެT'c$F6*1sFFt`h,ic$ S%gt\m4vu#2Iy qU+Ii)d'ghIFHaD&%w"X^BwN㇆bW, ˆIh yϜF7f؍48H2́@ؖ O^9hAͪ#r)9>Ԫ=N_U ,hX~p'h\!FN~aĮ8YBwSK:CK -+(Ff=LR*Fl IRbHVw!ShppwE _I++QspDF5ugz#cu1ظʺP:E^"LXJ'T%,㌧FN6 ^212S۱lnY,!D @Dr :  0@( @Lx `` -vpHc$Bn˟׻pdeXv0,L-hC߼(L0xxuf<42 H$I`*",HC9`xىu  ZЕb`;z6]@T)  -vO 7h#I,dQ YPiJnĺ jR%o:hs'>ph!I@<`Y@'CjcJBhj帒diX4ĔlPS0x@ (]xn8H8&,L&q(!cAb""B3ZUOx/tb$qYV1hpj)3592i)Js oWEyxtEEj<">ʆ;hǦfЖAHKri4,ҋ±k[%K:C(%e4y az_G_ SEU5pI1ф'" uEOЫrpr%qJ]qlN!),_CX:`Owc=PQ}e@23jL2M-dFyc @'3̣ t2k}H x!C@Nd6cxR3ry.aF~K'`I`8$%`o\|}s.o4 ]KզtbŸljeP2 -1w[.Qu{)P1R7wÄC%2`S DœVaxT110śCĪ JWvEf?]WV{JC"%H3_.X~p3bzIkԥw*r?KS :J-󾽜(/] l⻲淣0f-jҥ3}Ht%66sͥE߃IULv蔁dHѽVNHB*g& 9̬"h9XRϏIDR[ z=tw ޗpRJeɀ}\s0Vw'v\T(jm^>OBG\Y4GHNdVr6fD?7S1Xt"r} CPl0@ v%@0Q)Q?Ծ旌z10w yNGhsnyIwG\Q‹V - -n՟lD -\'7t -nٳ@>n +Ԃ18φ%ԋʌ"&pD~~4On}:ctWqo"k,( c)B%2ȜRJK誤QC<")D( ]I?aޮEE.CLPث%dp.Kt9c/2Ӟ㚭(1dbCj b > -= +FNzUv^HÓe.,}I(Gk&y:sq%XTndvi-?>mO iLy-ψvw8S.j*[E٠)7MșlT&,WRKHq7az7j͓4PtˀO]:n{($ tӤVr02Q)(h*wEIë+I&߬U}$ uQĬBՁď+"w'18Ih)X 1n(z=3aߍ;أ8 *GӚ"㚝ʝDx"'5"[FJ MHH >;^ʻѠV-uD(bT㾶H5m:Bb=O -;䏰^lN aYK2l?eSVxrZ? Zx< -B)_o&ˏ-H[%pkgO۬ ͺ̺{>@#D죏eRq! aJ0/tUra h[nF+5ZEi*432+~lm9WA*tVSTfdbona8 P%_Y]}mzUᣳ{̝s1vP %zf.G W@\dYMZ5ܢYUZГBMخuҭ_/6/Mw$u#H^%ӭe2kk*DojCWPmcBALڝnfH(/A!ھtAۇm߮,FY8XŒ@;s3{@GHب+cA?wX E20 -j!(*ȵ[. ˩Oo ׸>kTC5tSj:y7tњHL!^BW(z[l.b|t3Hj\fI0vBgtǻut']'`ׁ P 5%bHS }PLg|dU9X!`夛ie=\[{Œ@(WK x)C-<}O a %sFxtX -)蝯G*0Ei=-_U$ x'I}-J%*+HvCcmӷs%:XoS,=fô2c.}]\[DG`4z$:Xl7h%(i4 $dbg5堽=*AHi)Pl<魌{Haί%`sf-=UpB8a1„CRw#> *K޳Z\hi͜96\ CXapzI-v1-s%kLr8T&zp6v?c` `3==5B9I}0Y~vcx5#SN$P^o#О* mBnV|MJF.U "ZږWHyWq 4۹=Hf|Goj4BC1\IշUhE<=&R鏝dut2vnc E4 V'I k3#sW ?Xttz4u-&i12OARHX.cGQÞR2#%uA0'Jw#d&+ax0?4 -Hg!yhO>R-mYA^Nyb ;sB-YQэ1cYC:y$P9}ۢhZ"Hl۫XJw[NC/oKAz뛀O;BҰ K --Q^ XM%$4Tpi4?1B;SҠ?=ּ OKMB+wFOdD<-A+ x6-v&, L -T0EBq]`]'0-X>HII[&}A|e%> )So ũ_ 21`;t);F<>f~LS@l5Ry Mi >iQ97ҝ !FWըfi˅-쉬K*ENgϮ=gHia[)'騆 kMc>!nψ9!~SoN+Dba$aPA[ޙJUQmw?xo6s`Nos؁1>-&[KG'f_Xn-[NZ nN-GE'ocS`ۼ(qQLYko -l6"Ln"W` `DҵK{WG -dkvk{ާPO+3PKZe<ipLkۥp3:Sb~w<;Lp);mK:cdK^d)6^Ltc<%GlJRadjPyuϵ% -endstream endobj 3538 0 obj <>stream -ȔbfV"YN:AJEm2be~3?38Œ3{Ɂ! -AJ|$E~|>X/6780KHgvC# T1Mك0K1,eE0OjH\t~d75nBSmikƫSڙi+xp䭡glC\7  }q{{@U bvht*))c5y|^ -Hֹ,qIp"3CvyX WPjo抬)N\Tos歫vjĈYOd5$EkU۔w4j/'b5 j2 -OT#C~6fFr)$M^VUԛ7? BA2lxXDU(3>#gMlϤuU}FlAid/7U}XA2gգv[;yIDYU߶:U=8{UǙwtǏr%x%8%CqD?.pTP~/4 \8?iYάgZS(WΣK+FBL* j‰ ˋYN%F-,YN (h%^;Fh@ޏʣǴszP-ŀt꺆HŤMvKim`nea"w,PAA<JL&v+#!0rbJaj Xǡe57nʴgP^Pss 8eڶHcp, jw+4Q}FTFébL+1Wk. ȹxHOێug5!$T$@Y@Y`dZ%ydhۅH!֣Mk*hvH/ CI6(Bm[3`p?_dvhj́'xA&b"bV c >Eo A<'WOr8E1ך Ó=]I Nө:%JMZv!?-{𐌅*WMyx!}K~ _m.okQ-Ǹ@V\7@MBn@-\ T"9uH#)>“^O$tܛf^$0He X獮kz<t`OPA v*53 C[9}uOx~~G*lܜ'1x]&B|o8 -AxR$DWQ@C=PcdxբX ~Ö ̙sEXfkqa]Q XQuGNPWfXK <92hsRRBw($1&R}ԀYGђw@{X4S!^&ԡE'5 @nr}~D3yQpP4A6 -ywU? 'ڦO ,2|%&vRuIHa}nMqA7glO!6ȝm$c'Bq-mMWݢVۺiȤ0}˻XLlB9sxwPfC6# ?( 9ZޱC -ۘtG'闏$A:fLKv 2\B-jcUu1 _HJwAbfUZ,B/. -Dq"Lh@SdLL|"%ęa`zxj#l@?ˊӌY3 ׇqAڡ㙀rWLyܱmnw( TCI^8 k[9jSgzDe\h?'x|e3=e COX +""'{zse9l'wUbψK 0(DAMܛU:.df~M"ߏRA$ - bw>'t֘:-|d7c ngpl|lӠP`m⽼:) "6Pn;103\>G5WgT̬ZFn76\@WUHOi`\;NqdEQrq:;ɔK^iCkJj׏~ő!Z.LR1<׏ Iq -3xTxg^s,̽\S95~6(XT.eX#r(ChILXZM`Wg?Şr!]x'{ +/"K|XB |Q ䷵P`_7=g@uQc"|Kސ ^c`30?&Av;$*ntz!qv,L*(nG`59uP['Qϟ/d!ubx֩V^H X~L!\ tIIЧ Qs>xwW[5dEZVT[y'w~T ںt'HcհaDQyV02d|R4ꭐJ)F Q`>ArExL98IRa%XOD1E]d"/Q}.s.iojpa) mOʗ篡` G-Krм:úA~cqczC% -F=i>ҙ(5Xr57r8ՉоRTɁ |jT(U&({F1bwDUz۫XQ/|q"Рb(]a.[0|: sL`jn4Qia`W;h'u!KͶ@I!:kLEzlB h~1.|Y/b'o=4҉w$V:~hDt=O:]dh;EJ -+<!΄M -Q_VOFsPhwr3щKP!gy*>Q.{$bTPR{UE㧑ԦaV`/w V@,zIrb27s O {w!#h_SDv!48nѴ.u].Kx%w#&.sRATSEP!/ 8n&~x7J -ܒa3}w^ψ69#aS^#FkMIt}ͬ? -.j$ gؙdq{`TJң~2O_՝~%QoV:YKfwndzDIc7Z+]nڛ/[8|H8T:IaP!E*THJJžƪq,`Fvw;P35 aoo|WqlY %?򠺼M/B p^vnO%7,@`'\oŨ F+? -Fv w /?q }۬wD& }.!8/t~ ʼ wdC>,Sr# x90_4;]@rBb^Q&% Z,c"嫌x?тM.+(H~!]P y(!q`Y8tr]0a{Iش\$ׂݼu:Urk]۳xNE s/](yÈq5.ia7QP%}YҖAz{zA r"Ƒ~:8`ض:q 1 z,=|G OR使尗J Et!B0g}ȃ@rq =vtNYxCk)pN*BTU%P8:1_Z .~zaeQ||*PЕbi/A וfwg J\ϊ.at-͑<Rj -@1cpYiE"f9-07P`dINT|:`@;EE6xo2 -$߄\&.WT]1ݎVԀʡmuC_^~'ɆW6ٳaBD]|`I`[Ue3aىxS U'd@;[V~OMLF "k6 fgZ^mRV/{zQɧ!ǫHpND*}pLoO$99~<Td2Wh&Ǵ2LMU"Eߊ)67!,<$*dC[fVDb5ʘoل YV&tǰ<% f4'أvIdMsD\`J¸a+5e^h 0*r אC -WX H>Ľ 9l/, OLj_uHgM|/rctyֈz -!mK-zѐF a6 CC~NqOv {{R8ɗ]#@y_mW>isz UZLȟnd !fJ -:S!/ד9fR{jifWd\l w%:Wa")ygU+ɖL޷fOT[0!)}<({\j: r)US*^%>}ʎ( -,x F_5DSdc w᯿m9XPBBa{hbIa85đjKZ0cS -_jtt媎8(>zHv宷sG\qL~T2j2*-R1DgEmL*Oǰ`(!?!B[;[o0֓iWo` *!Sm }*AZ{rP4Z%"P]q.e6DA;L{*AoѨYþ!>cJ>_Q ܌ <%YXBX{S& oPF+7Ĕ.lvP 2PEdBfc ~_/V Ft6D)k35wCQ!]Вȅx|`c꬐zDW;oC=ZKfHP}iBI` 2#70(f`yjA  T&ig5%?I^X ܘj:$ʧ -B*:z) msO) #(B_1 +$`+#gnACi^KtadR G͗X'Hl-Um , x6H"0y!O 2챯\RM"^A$79( 8#] P = uKc.>Fp841/L*Ȅΰ@8lM{hvF#"RzK[O+P]LX鑈[DC^TLJ4Y,-yU<]~{_]ZQ3uV쬎:6!^En O(`'~wKQݳmeA{ -Ra&| Y'4Jf~-A?"&(bB<c{~K88 -]cr2R5fwi6=bvV'`zKsؕ!eRt7`[!D_N/X޴@="Nc~ P[.s~d rRMEC?pWb~{`>l @zFC&y:s ,R; wJbc%4Ñ.rGէ{kn҃)/ES{}#fD}^x뗻\2OHu""qfWK\yMJ֋>< ÇE#&46dMpw\}쯎mZ/:PdU9Luﮍ;˚ݿg ̷5sNզM̦;]}զ q_eU=s/GJv'Vdik(Y+bB51~G|e -UJ}($w.c`(*WN>kjop &tW#2Yӳ+"ddof,I zktC>,kM(գJqLȫ"v~|$cEÄ:_̏WfG/[H1"+B%&9;Jİg5=V^*%"&J[?!mYK51 t{CLTDg ג/LLxTP4XV}7CbgY%[3ppDUU0_,VOfZ7 a]Ա4(Cۗ܇\QК;4 S8{Gټ! 7䪆 ukfۛ]mrUN~Yq;i$׹3%9D?-D͚P)sO[LVEH.yUn#!(^ -3WCfY:K5In^f 첝Iã [_@26Rlaig*O4kZd%3l{C?*6ynGs%~-TW 41 )=qըBi wLxR2H\)=9X,RL-YXmHy/!G+E'ZE\(r|}V`; $8.ƎBIp9 I*R7U_. sM&eZ*ȡ%eCy,wf KG!#ae¥k0)˄'^8jB8ƏS[mrr+f_t,D2 NV*6U֣ԨI?KZؗ %r|1~E<3v (<|qˉջCq'>Nq[:KvB1=He^ -tgI4Kw j WpuXyOܝs4!p!5GRaLf'jW|)\3RRfD;M AacsKl5TV]@y7̗g^U26QG">qa %>si'!%.K hXpkKO/Hu{dDјwozjΨ*40d/%=Īc~-Jqf q ׵S{ɑKLfURshYCKVV';)M:T?gr$.TCaf;|vS8BW ȴL! BVDJJ2?(!<U{a*ʹ`GHy%ҕ$/FJQasz> O!%U)w%џex#qjz刢`0>g},5&wT#5-$-Ϻ+TG-+unOKoՃJ=>_ҋ'Oߟ[ ]j+,/mb P.u -:=a1'x&W+ l"Y׍;GVG ]%szOiM~Y٣K"CP< l\_ƪp FZ:>~'pX@oT'~W9@s>kqSMT8ǝE#\(f -՞F3$!vp{ 那`p+8_L94# qOh:x;3aUyV}Gj2$%Ɏ*T6Pbx(*#l{B&aDS4 -6CTaUeRwXMLvВ_ D;'U)rp֕\*0{\b!{d_lfC1 6:2J%[5cT!u4j0q)1j渄ŸwsJ]Tr4?&N, CSScۅFi>Vyݩ? t*hC4+N;^m8bLv'oJ霣 ?"w@w-&LR< -ZK[9vzhir(.z4a>.7^h VcU0uW;#vpv]џqbY0["R7Lr)iY68A87Nvz"ø.Lsf1De'/7Z`gytb-p'٩wr.v[>Ľm$A`ߕCǀ p5dZ̐:Afy2s@6z {p/18&\ -.[81Ab!Ҍ+Zd oOxp9H*>LެLYp 9/ -$א{^w`ԘGYjPՈqhXFg5 -0gPQ٘h9k2Fq _;W̚r~1> D1(@ǹpj'b6^mMElʸ&bX6nqUN3/P۫GY9!^-R2Q`gAjt9 Е|EҤY%L|ԛCYzNwFT#fhY5"'r*EUqR."K{+[(LAG2XqٵQWIKT=1îNzgg=wv}) [&jĿG:@ˏцaH!ʿأ$ C9b0@iV-_1קu3pf5\kPlgx@DbZb+ P[JئRACp*j hPA;&n1:Be"im&Z3|uq By/*ϐ5Kb ]z^鸋aNd[,"&؀ VߊWӕ&FgNrA썬f”^ԩ"8q;҂ N@}_;%#W8R@˂Xc\5[0qG=#t)_69*k*r _S!&k.&뷩/Z -G=i|pc c!Dk;wq^ejPa`LQv3^k-M+Z"Z @oR$oImL2IR);8n4{}T(,WDB4@eX#<<|.FDT3 -ErҸD&a -k#&^ml hoCCDxĬi'*&Sd" -* .`@y`&z%ozzۘpiY)*UD95/ -:Vexm|X$J #Xj*%aْs Gx` $p"#7yj5q"55NMaTJw*f. $MCc%"p9=lтU߳FjjB%gj*vN "E,wfl WQX{A?A#߮a˵q8 ,~.=ld+A5:tQWCBd fBNk'Ri #:|XBopRԊhP,\ODB>5V( /= S{MqXUb^bⷨ6aY5X?HhdOh;E:짡rZOrcZOTOX~>h -dz/j@}Ծui>ߩ?;5RE>>SA*"1`!׼x(&DUB,!n!#21(DfYЄώDY5|GF (NRU -(DGfg - #:$K( -@A. -$1N]pQcJLmMYt"Vz@MxUUlD8zT1aPic!2*]nzMd3R̈́ (V "՘=OhP:LmKiN{U EfUa$LTWL1ƶcǷK%Nk *\/a3.1m ڡ\.;RK͠ T5A - W\BE8cQE -KQ=DD0 -uk H0XGoD\6 ziL -h%BG8= Tv(E()^POA"I#do Ա^FA(w0gSӨ0}A -` \3𬿔]7d!hCd"cQDm ֨PPÈw1Qu hBQƠA4@q6rmMR iWg}LuYmC)P[A ߄l-jZPrcQ/FMAk -~XDk5Fj,VCD"CT9f[oı&N[-f%xڠJlL#/ -]X -G*7 -`d,RdpTf6Fug -QÕ'·H'k0g^1dxq4 slƤw|x J3~V3SFu簩|d>F+HD]OBMt<:vi:J Sr`EE(fDIV8 "veJ]{|(F'cIG$4 -g5BPg?E3dD?b zt1(JVb2KqHp5ő34DaVթHvO+DaH3"VtUMosA͔쵘""d2naB_e5f.K5IH`KضӰ9@#3eS+-ԁGת\3P9ï DÔ8J(R5Bxʟih3޽--"O@1:3#ARTQ.g<%}zLF6 +Ԇ6u>0և\ R0:"DGJ[)TJD-3 9p׼bA1܈<A$*D~U)~QH/)'x(&P/勘ڂȇ-rԌTjZ;21+p5Qpc Q9/]dYUUL. ~7%q@gi^ŰO1RYl2! -T\8HI#<"1$HH!*9 RqLk3^&(>aLA&x.Z'F ]=bKz0x"XD( ⢴+нEaAc4@8 T.h2g4!sy"%=@ib!4n!!=Qx"F!2Cx@%bHC*HЀOB%ZQ#\t)֋fԡ5|W) t$*#0R WBG. 0rBAQ~,zq5 DxBL&BFe8{r - J"h:  $P -8{Z56N&O'U އIA1j[@Pݞ +]ʉo,( Z/UA(bTb_'d=QM*'(6a_͑pHܙP].*zILY1J4444Dt:+Zъv*H$!!!!!!&ŬG"wGox5c2C B(X,2DⰕL+Wx2>KbyAC3^*,W<ϯ"f\)C ~gbBb ' ȍ -jj6qQx#"'72W_sjdJ *{$d#R M6|ab*O`Jjqh~$!{1SA.Zv[1Q; - -e(wʒZ1~ThƩ*ޠdY|T!ƆD"22L!h` >hTOFJ9} /ARe?\`P8aɢ'3ȥ@.օN5jro@|b h;R4A D ga_ dMTEZrbG2 .ie?roԩ*!@mNlBjP]f``8W00ٻC8xeQӯ5UH.#}`".[@Pb)J:%YPW͌ ِ Ƙ0F3B 2Q'\(bDptBCAj- Nt6;yYCFz<0Ip2Т1 "xLBC:@cL*|7H|=(0UD u]+ABX.xutRPb0[ԅA9#I<=. $H:״yxQx SEGFte4)'b0 .` $'F؁@J"8D=أ,=loODQ6V߇`TQ -S\tiPёb, <>dMH nwC#-,[!`E 9I>L aI-1Q&*F3wD#q8tVxQČ? o!jhB$21"hV -hZeZ Ru7Qmȝ]PbE-žW;+ETEո8+E 2Z!jmM>aI۾8jp8^z(Hp`DG RA%!R\"۪Kĵ Uǐ P7D PT6RB ]jaji(/Nc5Sk^T߃VxP!$~f*^:_N.wu eC$Uz\ dGuf(ؗ"W1BpQHGN~<"^:"Vw1PjHa D ټIJ't˹#=~u m]4zUJٝƂ+pP`@-"OCLm zDj+Q9R-7BI[S=x+sVh0Ϧ@BT, qxߴ"fu9[q8WVo-'Qͨoqǖpwf]O$%wOTDBozZwzG5ޤ 7c L@!)[45% -~d4.{FS@9TX|=hņRU.U& ;*ZksXT`6ؐH 9- -I]1?/$Rݩ'shre L51_g׊j6OLb, IOpWSp0/kLFpihѢYD0/V3b-r&8s\3_BwHz%ǘU?t>W0tPePn -&źGn,}l-x{Nmi5BMUܐZ\MS2#Kum&sBޫtgs9<Dm7t&S -2n,BP"wIDPQKr7"ŝPX| ގ`5μHb`Pv`#߬J{L2 b*~O07i7YUX4݅Bkfɬh)Kwѽ,|Fx۫kY\Jo"y  o:1f.M&.+.0HlI#"2/Ɓ!IڭQ_ +Y`wjšTOjػʱ*Zg~klshC@]'BJ -f#Pa-TߢV6].uv%^/@?jVA{_R¥JSMQJWjJ[m)!ʰ$6~Uɳ1!Q$p?yxGc7P!]Ww:$OU/b+f(f2QRZ' ĭ^ Zc(5c(8-̸'mjp%e=e<0 hk u{a"<Բ?>^xϙ,Nw b%.y¦G}HxoJ@4ή8,ag+v-EƁ6\)NR!9Oџb7x+Ct}AIЄrx,SBvM0G^-viR͒wHKB#ҭK1~?`vyU<.b)]Dn3/Lr e nhfG舷V!,#bxÝ.+&^TÞ9&Kj ^ãg8S@Sٖv^ k idٜM= ӏgvS4?yq嫡kEڙu A9֒SZ@bD&Ԇ}:Z'O) |2L -!t^g7 U)N[م2?8+(SB&AL)Orz uW%(G0հ6W \Xy"!nQa_ю}Y +xozکT"!B,HGY65-TKT8ubIȁSP#bcߍG0`b.e!|$RVv!#Ae?(fMӣPjRԨ _NZL`C6އe$4ܚI3J?sJBsmU &%ɖ},FU643.U@ -1_KZv(X:=QtzPJ|\7""CJ[v|whxΑBR;~Ṅcpj 3Q+Y ٗqRUd usBY VwU` 1SFJG3[{:7u1@&";l-U?ؖYyᨭmưbI>D)ԌeWT;9^' E'$ీ3M#$SgV֎d'$.X8ZRnjia+$n @(,o8 ͉nЂJNi67tFϑlB}N*4-kDK-"tHpDzu.<goXy;:0m1<& 'r2Ra_ 'WŲS Lh.y 4bYsvbG0!ſcfFt\ -j+ F}T2g{E5lۗ:9/F(g.쏷1~y<⫃U$t#)Wix֣xdwy'n ˟ަFeɲu8Ɂ9;Jq+x\~7 6n/AE@g~HMaW.3_k^&2s$#.1W -zUU n_~^+ЪA rJee!i-̩ݡ IK|xRfH!l^bq*LGY:(I\|i0*bx[Uv Kq qj ԙg6z MJS7LNh9 *Y{ZLg | - %*+. 4T$;1DĂY{I!T8JH̆] 3'm|3Ié$ǀi@x&5A5 mo W)zlt_H8RڷyIM%'86U _ U}WqcNT8D7*pu9h{K7K !2AB)d{چ]蓴JzI>$ GSxܠ -ܘ_yBz_G)#\" /|xb.h4@D_fux4 V='x"X|ΌYaTQ4!Tg&LCm% &jĦX$gD* [H_UKŷCC2i"W'`Rmr+7E7Y.!$U>lW&V1(nA-ȫ;=k1Џo[J]wSHF1ÉZA hw %}AU goaYEMS0Ke0ssNy޼x]Q5/2͹$N:^ UfOλpA5`2%-$"9<d=mӜ ,GZ8М ]ȷ|KP\5dPҍE H( u-"62iW($&hp~4g z!LD\Ep^E4B!(~=kk[wsBxU hK^Ս On:3)ibW9Ap^< [y+REAL$_WBOoK-n%vT -\FdyQC`1l\%tZ)PpU $ㅷʱPs09R=9li&|J"mI dStX=V& 0_ȢU7X:qdaWKm$GDKٺVmNF$4tH =81Tz qxmzjX /l,srV;~G*¦+&!aCjyZ$o@ʼn;|$( M=Y6̜w%a^ XLS V:R%qq-`wdjC$PP͊9,0"k)V){<0(P|\!ԎFtD$[ -=!Et P;Ev&fQMsO#&`@|p3:}e(Ը Ӭn[TI  `z^g(kȰ\ͧ٨8Cx8`P1v($l+l1B -`DRO_n$ҙaoUD9rΤK20u#m[=~<7nc*_b7'p'o`0:>(_c qQ-.$~JY|!TWeNwքEܪGZv/*ڎ@H*p"MQd֢vlH;dLoVx}]'ƽs/??F@h;tEZɬ"F-{5g1yiNz!CIg.S4Q/jD*r^Ey5*k⤚HhvDms[t>k49`YO`;cQm6[H*`}9# aXxg,Rtx0U^!D+ -N\ Q_t('DS'?e: C/ŘW˯ZX&:vm S^ΙY0- #jY*ཱུ}|KH4²O + Pڅ6G[wikyfѷ]E×/UVEQUHV8.9KeU)Yn볊eX7*_^5.K{';c`tcs pjɑ4qq rxG5 BܓTa٦%;)IKAm8D:BbHG."SMO[٢crgW濇Kt 2yf/meؠ4)QnB)!>y8Rn7}I&glC[Lp69w XDoS<t[ _%@`J(ڬ석tNz@Vf?ymiZbJs~r[F{Ft0ة Z luhZkqMIͺ/eBV+=<\IL}}`6dsp6P&b9 2Zg-7XZL;,\ زmIRaLD5<'~-q/HCK(Ch37ٚ_~ cm/۴7|}| :k,w2Kf+9~XO;>`pi+z[.L'{iC֘:;پO#RUb8(BLKd,~pL<ЈPkc6"^HX>j퀳.  c)YF+gZ8QZ%O׻pN#Ȁ -(BNjm9$8TQ|ȔTۙu/ĭCh GHh'l|S@8)RJ| Oǯr  pb&jOx`5qNZnr?y'{%tX {%5a@ -;Ny4 b3R9+B6 񍁍S-O\1?e|(ud dwxIzxؑi=(Fsa=戦Kœ#B_01wm1#|4-90,0;Pmœ -arYfAXKH/ 3 dE3${Syy K,!P'x0^?N;f>mk&|@XQO`1Fǚ,77$ǚ-Cf5k$T6%# n 1 hFaB]d̘k7Ή5J~F "XXC5@ kx?FX#~Z 0wƃac[ kcc c̀r޿!Eb rqQގls!/I qu4b|7~3I)֐svX,\3 VjLU+7tcd}͌Pc\MAcW -ֺ tw5rPȦNWC_6'@Nјp pcje70x5e놨':n2!ջڿ*? w'ͼ PЯFԂq7 l9n!eRq5Ѧ2Lsm[M< $jfDy iPl5Jm - ؆dghrsn5ԓhKդdbnXej(lUVր3=r-xD`viM_{R27"6ۏVsX -5$I\}Z,?YWtY 4.ﬦ񮚼kg5̥GR%c&{d\VO'W i[1BJֶ士,S&k0Cܚ@<ܐ݉j`_ 'ly56Qyn CX5J$=?}5̠(v5s$VBd+gB/ybļZ]A C0,kK ! 8,.͜s hpDE2ADg:5Db('U-l`?o˔A֑GOXӴ| {j -fh8̢^Vr8Ce>D+;35I_}DC$WrFc=16|ƓP'ړm}R54yt#PQ|sBX"rҿ[3duwyRc쩈tQu{ń`Z~G|RD6zf.FWUG_!'~өeY>2ļet=ݙ),zU$N*kGe-b&IfCmZfZIFԠ 8"l$EW*{spOA1^xA˹R8eE9 T2Erӽ-0k]Ն ;bd4B#o}$M@Jq, -4[)P{⡌N 31WqzYY^Ť Ԕ/u!䍽wRx~UCJcG\c'v1yw4y^b,rJpD;Np*vL3Eh׏Kmih~IDɼ{Y K1L' q"BԮ82y8 Ϊ[/qk2~E"b\ĐsahV:{o{rVO%Χ;,!JGVIFM:tx"m.U1k OY+X~j+e?~4SD! M N]5KcMJԚ3z2cI O(C2P! -d"ű?HЅĘW)O/fSj -|Š]0Rb?Ù={*s9^ 8S6 l+7||utt&a4HY:~CF_fut&Agn9=9K` }0!1 I%O?KEMH (r't0h)d p-4%dr!62<G1SN8Oq!ca*W@BhM3 kVRM>pvC1}Aፚm)b`O ǿ+kΨͦYc" =`uCC)"~.n/~8qs|DݗpsS}}";ޥ;8Zs@ 2̣KޙgP8K4.̀?u͈%+Z᭚\xC@}/whXSC/JKw3KKD}- - -N=`?#Gnki])֎H#59`=#j(@˒O0P׉C-&N;\Nan掾"|nCWgneK~b4!CE{ Y;16`ir$joy A|"+yb3+ -A“9#I8(n|EE -I.=kj P{QiD' ?|D p^bPczH>m)d[>v}>ĻKD BHADdpb#=(>ùݹH|3UY2$:•M)&GFMc",Q#2Oi<ʸLm󙌦UW\ -mw(ͽqQ_JW{dI[3rv}]a܁\.o?Ui&+ - 5:8`jVjR6)lG| \ET+𝥀*\Q8GkLO5!5eS >rWρ)2I -5e@ȋ%w?? -[X߶4VU73܃< Go7-̹:H]|Ҡ@\ti(uԈ<1~\'sKG;\-u7 auDS] +$Zxd"XzcRCW sl{##l -BaOnvs!q L6aXո)J7Dz%%?_dexpvt -Y O"KQ7>VHQLPQZ| +d4zMmGXBŸ)ωl8F~,b:w +֏ˁub  :@x_nd -'Kf^8^ E(D t,&:{0^d,l9nuوYy?!xAB\wH܍(kZ$x -Pd -5EV\2P0SdQ"53UdڬNBosaL̟Q5jH -Ɖu;+!:C ꠥșYvO i 5 =h헋Lu9šSG"sk Q3ja#qP -+N*$\W؇3Iyo][%U0 ֐섗\,1̓u*"gR=Z5 L4K/A=Fy%x`N-|wuŬ} *i݅5H3%N"7۬+:;<(~[4tVFj$ZQ+&ϝ4%EzRY@aDӜ;Q݋t'=dAj]KJ -؄ JL<[DԳ ^F_Ł"iEpSrpXd-f?z͗ %?$L8+ɀ%I#[`z̅y;P.P2Cz[ Gs ]*B6g9GjJaG=XBsNNjJbB1u{)Aҫ59lġ(E5ٰ_Z[UP[)f62c -H] -d78+Y-]̶vcP>Ϡ.eݼ-gd*JɈ/>)Mo+F\O}*] 0@;t5<(yv"Yҏ 9`zF --\3.Xr+(E_rЇd|Đ,]u*C4H$g<ߥqb9!w$kn& 4E SkfN@#ʔ -x?NrAT5l B!5!RR _cB+Ӏ@(m7q_E0ϪoY5VCi FaGE2F6%SvR^vYO&<%|x385΍J 28 -5׻\Z54f_9ۍqE&myְ2k4D -~Cr4r<7\B~qlht t^V**ąrwdÊY MbMeqi>-b* @-u3v:y9TDa9ٹ)B`)( f:Bݖn^]j5NA~! -݄ 0j4Fx~hlst#Auͅ?`]y|AA7X";K;b [QSVoLrwK+R7ݝY -kn wG!^hf6=d 0v05.1m|< - @#5)4CUcQ{FX-9`0rxgC89³#Kȸu:uIA#^<`o㣲.Bu\Z'F؊Y՚8,}bhm0Ci -S;05K!dcw>36i{6+0ٿ(+Ia@ɳەs=n&T.ܞun0ßG0741x,og&x4BGNWTC6qmjfu+v)²zRt`Ը_W}SdDïCɎ08+jY%4 (zHX!vp3V"C>Sz73_LR۰Pg՘>í>zĮd\p6r-.'i2܅iqlCץVc&rbZϕ=>OR[ ˻J (uH;Wzrd%Ԩ#6⛠QfqL!:(c[| -SK/JF5@a'|Y#:,@pcC4!(Dw,,b5'o^JPV`BJg#3kl8v '&6n8L$Ğ -.hV< -(5Wouj{o6\Z_ZM0[OnU-cP $J$jH9H GXݙ6PIdPO c*P !G=R}`/  "VyA%%?MbZgm=%ZSi02xmS- gex8; L\I-fN^Z -egCouGӼ6ylk,S`ɡ;9[y kŰ2DI~gy½^De T֩ݠkEv*tXOPy X''"6 /cDd5oofM.c%RlEq#D2 GB[F!Yo6)mLB$t81j|<yMڱnabxp pss{U -Ѽ9q]$S7 >oK3f Q$#c4kSȦ64ڋ}1yS9kޅҔAQ8IJ~+۟{)cuNu3P~GMH- TIɼSfIi $4 6v0e"y %b8*ҐO⻴>{9i)h7^ YqNy0tK$;/-hT$%aSk t~u2AT66O"R2fDr܁*= 6*4_J Y75'ZZw1ml8ғ5CZJu"#$5Es)06sΰ#N`E(|-`e `0%&">w3b UK5Xξ4Ƞ,;[w꟎͒$|5Nr=xVn soؾֽs.x -C w LG4xS,CQ ΐ51fҞ sG e|_ϐUkXfs-h]#%EV?c ]*lRC#DQoB B0.x 2VG6y79ݨבCl Wd/qaߕh2o+E.'*cBlaӘ4`{DWdG#4\XkQ)V<\fxC:8HHaޘӻ„H)yrT:l? /ZbI12DG.䎤HPsCWNc(YV޾> q~ /̛m4(/A>S'<=90o)"gƘҝ#Qu -C[#̊Ck(Rqsqv ɂ',f~1m,2X::U -/^XyA x7&I2GOP]v( < '`; iəAA `1£[8`8ʼfI\1w8y>ŀ pf Ĉ"[ -'mE1u$b|. -Z?0\w{ӏ sdqM4nddU$Bs*b:3W܎ErЋ2 ޜ4!)cJ-l0ZyV^ϑ^y,UwQP]P@<cpXreWC {5aw{r|ǒ*HNsu#Py꫺2O _!tw-^"&e/o殡&[ .o˓ d`L 1^#{S>O#V3ꇽfkKG*> /:2^֔0Tҳ/*E8JD}શSW>Ǘ!SqZ7SS%|f N0嶨v?~Y+e G~/p׊ >=  -& -ajym/m 8̱e8dysY(tajK -*ȯ͂̂_Q+)rBʷ4`4ȟۗݜTK c) 1,֎'|5ՇT4Ha\Xg\Y-'ԋI^ - - I;wmwN>7U,<"Ӿ^2~Jξp.Ű4v<'pj3 gJ8S1Xb[:̍;e鼐@=J,^+fijBQ}.kz Ԁ3U4j2 ͷXv]3,i+KMc0g;ʇd{D뼰gx :Ҭ%}.gF^LRv~ '`Ŵ^~x݌ pbGd/>XncP)0W}~'=\sz -ckSjz!tcW[v.:?h̤mpLTqDF?ERݺB7 BN13`[Dr ("l~/0\۠~;s =x#k*Rw\ΈX4ޮ9aW-H;VcW*d`ˀJ+) -<#ܘIAmO&' -(v -`iH& }hm􋜖C'LBKaq&ŧ -Ia"". *+c/p"K'Bk>$/`XKs7+ |]>=P1MH,G#wg kE3Zgp eė1YFH&v' o-Rc sZ J׺TAh;ԭsH7j=`_W X0>@MeZI(ɌhBD<#y3ےh -ÁI5 Pc%Nw=h#9h=UjA`]%1iXqaPe+ezv+y>E"t@,/V#p؆ALp6,>O(Ddbвp@jѴ. _)Ko("P;A Ft$m(iW`xŢydX;ɚV#' e޹7nYkl5YJlg5WVu>UM1Pk#(w0Ofsc؊XΜOChU~T%;nN2BG#3x'tIb 0$ oB<"ra`\TG|߹; $`GJ#j`IIo6F2 x~*#|5 1{H:pkΪejΣ}Gn@HHص461ۗ}4F-I+0q'Rc )ar^: -S%O||͌tɌu# ?kXc6I[% ӼqTG|-J+RHH7җ^(bΠLʧ!:ЎpiމȎN$'tӹQLS)( TW͉[V5fFFhX9e9 -:Sngf):v;?3I%jQ& GiT|]3tZ(mU,CcB6Jz L%QlkuUldOG5v9{&L:~Un2/ 4uPTMPj8>bސ!O%!8# -TlOÖLx3_`"Ӏ^G+¬NMq[T7}q#&VOC֍S$&uQ 4GLJL Z2Hoz— >6 q>u7&[h0GÀOd[<*T(kFyAfP޷ -|enmťg{Mn l'PF$ad㞷n{`?PRFmi93%ϥ -D#]{iA 85Q?--p -F^ؒ#RdHZAN.;S8{܊&U 809"*K@U6z"*AK 꼍ˇ;m{cA!h[3HȈZR8{C' O``V+>8fAV(Ζҟ:4VX 8NIќ-Pvh^F=!D>y%G;^ӌf{<|. %i`ܯsӁ>W yjgVuHū܍{7 -qƸ؄W3穕DnK_rLUw=0~,hĆƀqR ,>@aO^3)0 3 ""9IYSo!u^V^4؍\O~Yt[ -^^ - G)F^ڋT6%m@@q cMJ'k7~`T}/c%~aq+jб[C 5Qf7:n [YBc7^%kLp$fK u&b/!U𕡾),C|]ږ%i$ӿ/aWa "ẉ̈́qHD0@@,V^WEt}ǪlsC430yB`tSĹBﰟɷW{DN?HawjS@(.8龸mOn.]X5 B3)Cm~3 t˲'6Ւ~2q X+{{ {M ֊Q>\3O \2=az'-ILk`;_}];Q!-yJw?D Ȯq7DNض0tm{8z#N OnUvcgV? -,HdV[ -߇Y ~iV|67S9N<Զ'2F"/l?(XK4-X0%S? &lH g6UMUӱD ~J -gz6IyÜEYc.϶Q?JUY}^Ѵ[ԒEC7z@VFdx`Aov*2g3eox,-*9n` QVtLw)[B1jr.H -6yT'6brrƓ?3\cftmLJr=aE=U`4aQ]g$Lcܱ>ap̄wU97"2:(EqS֏|͏s'@zIjd0'>bdSC`j9M0F - SIݝ!]lpބIb+hv -Hc׏F~=5~)\e*{/pu=uwjjI.cqbHRX -3]P @ foONtysn]"W#N3ZբNoikOW풼]k44 J`08sDppYV)Dl""k<17|͈멅x)D=(%̰'|0gDG;%>$S{ !Qy/&6T/ީ$b6|RgtYQ#+=mziHw, ȶcVfސPC חn ^ Yώz>;]Vvzq8B z*2 DqIrZHjFkP_a⟬taAPH~pRsSak)!H\E@k_Ӯ&55Ȃÿ(2f)"l(*-p[zs/!({ht9NVpj2zj dk|d"d?o` -˻Fw!@>{۰ ~0:uBJIԄ#PؿMґ|z>Otfp24z)h2VL nUnʼJ G&gd*dh`A]6\OI$^i K/4[hv^5X`iBcD7~lHmu~ Xő|VX>W;0u"Ie8ұDC٩B -pؿ11BT3$` wpb%$ /8@ݹ!Cg!XQ"?,Ǩe;G>-QQl; E:O.я34YCP#@(e1 i˕5SLGS]tfi=j#`LXIVꩼnbb6Ҏo0Ы dJeg8Jzmy)\qn墻_/#˹M̍XRVP Rbȃቛfq U2fzP# nbe%Ezbda°g(%qcJ{PI$XNOcoTl=NotPM>L3vOm^ -endstream endobj 3532 0 obj [/Indexed/DeviceRGB 255 3539 0 R] endobj 3539 0 obj <>stream +20 H246sX0G&CSl]h]ATosK&"bB׹ Bu*EP!O7Yq#AM8;ns5X '@rp{;sJ[)Cf +dסϣ,M1"1ᜌHZvcNf[0ڽNZȸA 麻r:t<|ˁv5S/Q!!0QQ8潸: v_=/[ I Os qS0g<~Z_wB}}-FwP2y>SEo]˷hocʂv/&ZzM>ݢk)!w@C{h.M ]w)x gR;b +==-&䈠_ JsrA%i;6PhUǪH+E73{ba.}o7 K4io +ޞ_ݑdLN;2J,}z<WqLe 27771nhp)yL4u364x{Y\0*%_UxMZe/[Lud)5M6c!5ʚ1@6x`f3s >Ӿ+ +`mnPqűEeιN,Q*2:U- m4@SvV? R* iUM+/Bz =#ȥULFogzS,jW⡠8JAaXd*^  >t[kNRCR J_\b=6gnv]^MI `D{vm#_ Cib6{XQܺlHZmntt?Rob5chr#!-XkL[aEKpLB\NZMa7@!@+rk&d,>ζ,/~ G-q.f'V„a D=P .C`p_^J-gxJ>A{%tU+"CR5b melĭo|L'TC:Ip̞(g6%Hezm:]fS9L>}%6;V;~{].(/&gu).rHnedn' +Y yqG Nef+JTJ3FߋB9F Bqsk+0҉e=Etz P:dT/`l[Û +בTƳ8WŸ?<=? ٵ,`ۈX B!u̴ "B/{.izT^BY_=!3´٤4@.L;=o!?,xR>*ة~&15րKdaHw"u>`8V`pg $٘$dՔnY#*- g<3%BBD\`Ay>-i12eK!qwD{](iYfCQNˮ/vȺ>&{D'S?M}ӵRB!$w>stream +[^ x I*+v%ă"IGxC<݆ +vCLW;vq(Lfx֑ +4#GPa5=;ZS 1w u:oqir's~mvWl>Mp:z;vzkcl .̙UQ$Vc3FSA@h;Q"*6ϴa,#r[xW|_j*a'IB;. +IUytk{hZd?'Z Q=d q\ Stl +ȏtm|/C;\W }sCx&%IBPa^49t*T`pequR1 +g}?ZtX ¹")ymg3A'W8NX1">ZW!E|qg26St!|12ӯUA,c2ݟ#uKA xc5Wa +RE[R2͉:FO wq-ʙ-j>lJ^E2ο9˟@0H cAY}M qF~qzcg-1XDWt07S>K4y9XJ_Y$]ȞV1Gm 9 [* ԦwVQ&EBoJC)!xXruޜ^ =<p]"z:!%<Cn$ 7\>NDQ ? H)=9kD W~s2#cG!9PNAَW-ADAtm{@|?yNJڳZL!yy"$ 6TX/@~yÐҍlFfhJ+?S颫 :Noލq: _»ǫJ\gOOj7 +R@F0F)1L e=SeVjG|9={w.~mi[ܣH:0]J3f 齶0Yu.4ѽ'`}Qa-sD)bNj6ބsY$tv^ *@NÎք2sa6 +1oxJ p X +F]h>[OJ5!)BbOa'9^  ?|tD~ +,734ʹmNR.UK i$1 ϋ4J͆K%OL((×tG$T4s퍓Ң_ MiLA lh~ӨxPSC :,A Oyz CF [IPlD1m;ITp +gC#ؑu.nB<`AHcTr,pwS@ޯ>"19 =p_LӈI:m<) +<Ps"# d[ؙTo}U]RݎÞA]6p "}b +QQ V4ht7lR]gQ@װJG_XZhr#:I¬o6kH]rD]}M\&,Rȝ5$u~3)pa'EUn[951n\s4 A +yL4Vrӥ&ttV?h1*&_)\U1+H_/;:!~!3dwN!9'Z^wAև=9j@q_w^92`jC|>ih-D :ʊ@kGU>Zw܂%r;Tq \FȿdP"u3 >o6.&@ ن21c*U3\ڛL,Xsk \-B+k^o.\v`n.dP:-] AKi& WD=PVѯ6uk@)zP(B7f{[S~eu8>!15-30ڐ;+Sp_Zh&5 ~К| RAt#>}3 +n< D$<(]avѠ&hHy.OlCh64}t _ g +*6~*[q[&gH1[7vbzC4h{R.|dKF3w w:Nχ #ץ:!!vYdPy&D}l΍7 +[KtOK>PtFe`(2I.m4}8>b`t,'h{{uuIQ0uQ}Ӟy\QR B+`! 8]91o}5 X^.%DX~9ػI nY.4 sI+](&nY IG]O,GN:SFtBAzK[ĤU1>V +e¥XV5Q Hұ +?Hb,9ن#I2]nr#`Όyvd= YݐA`̲Sk 4Ћ|DoڡM[&ɧ%CxG^rOZVQ"]Xk֭ZuS\1cPJ6elg~{,c6^n$Ap +>W5Umzr[2,:@XSLmm[jL52n+E֞+$$דX$z*UJwv5Qii3$frqFQQ3;J,`41v"Y/]7ͪ.<DG ,6BHEWwZ0Ķ.YҀ'i5` %3`Z7|cH>{ya 81)3k\-OqfR:I+ +YXHЪm`F*){iWcg%4%YBPt8ݧJQUtXM"{e\2fAC&>.mt~)n/61:i|=l3s*#bh٢1&i-,HfY3bYG+ap wOR 9p<2+/#8W54Oo$F^qQOɜ) !bblx#Q ++2>A F5:#>"0qzK2l% |FtׯYOuUP" qWأT /Zpɳ7,8yMMg=O?v5fӬA=rD^D3கÃy1 dwDE|9֚C>?kqx Ai ҝe޶e\،q$ED0ePtv O Ē `Jf"l-F @XKC@ML,@–שRFIi#eMw ;Z|S3I,C ~Υ#-/ + _C^:x!r81g(:WOkdac[=AKN2mdd9k\/CU$M L}n2,=?ݓ|ljK F[;;@3ibs|_ fV$˂ ^n:c>`T_á'*FД"E԰٩6q[;3<+ gѥd= l5`m4s%s\!St1{u&Qm5YT0C.m;mKdsC`6WHkӥ}k;:" R xhw|}90nVDR^>Y7\!F ~)_KA1lq:8i-oŢC''0+R|井j~A_p֠hgv OM7 V. +=C7(i_䄂$z;CyMd8ybۓ W6Ib6TwtՕc#;]63Rs5)_Ҹ UxG7cu7s5~M8"7chj{ص4gl#3F#*0n7^P@rO.fGA  +2$w3,AAZiziJk:N&TyZx r)+ Og)i#|"|C,ÄV>'yS;ЕYeŇ:›bd-I}Ƨ!w`ΝҌN +^˼J7Ś~Q#`"ζ{U6$8]B.Q!?ŅaEZRjJCh rH"k`X9{2&1FIBqXt$B|c}Dp0( rJ_ z{lѤDT!>;J9\Ka C#"jVQĸ};`2 &zSnChH,3GWk3V5 ?Vq쐻_E"n`|OksqL HC5hEa+6_G8M%Kٰk f8*n&m࠳Ayٜq:;3COƃQA8´]&alg>|o0 F:vsBL(. +% npE1d z9:@+Pf}y Wav5嫆kl7DH +دyg + EZh꛱R37KUd!Qi]2ý+qE#w"ͳYY WMnED|݄sD,lz> IPSY ZF xa6F; ui4`(F&d* rY`$]/i5ܱ;igt!,U89pYE&X^z,'neo πgGki$TT0s QoC#._aEl@`s.-5~{b VQS 0ܜǻ߾?mT=.ÚbӲuyJ|]τ4.^nIB0G(l4V^r$R?)4d + +&7Z :1G>#ذ 2)D/M>,z"E|u\ܦFbBZpvBq')刊8r@ź|HLxQYQ꫆8`Ը %Xoˁ=6ɸҌ}}Ĺ9z޻u-1zoulZ=wg/Hd-$"'B':{YS ,1*ҳ+B*=u -Ip]KR/r#g~Ektv,,&#$isJ3 +1iq*{C"&ݪyJ^c»Y$$^1@CcUpAk +l߷&.#yĤXi%N,B}VQq0NcʳV!'>OE0#g՜664K[7͔M&2Y=ߠ펐 =2Ȧ;Nq 5n ȑȺr@Bۿ?(~q`2FcF;W]ԏEzD;ѲQc7 F[P=VDΖ$GnN)w\1/|^}-Aʳem"v>wʹİ(EΈ=_]4޴jG29H]+1TWyUȔ Dr$:iZjRkm}ң" g(vN_]ּw4qsC8S@#daNM 9;Hx8)QnSL xa!M;k(Z6p8vWM֯cu(O5J*WGG8pܻ/Ê΃ӿ)zI|Lu|L"PTh+,+Z&,V:QoQL'|"o$ L?"Xh4zT>urQ{p_pz%Ó=͡Qn1Ccї }}Qwsڙ=|҃<ʤvwDQHw҈sX["~%{߈9χ>#!{CA$ΘM#{o*%efhԻ7so1.4,Xdʝ5KgGޜpf= +:[󫄊Rav2mv)Ye2VW_M>ZuE2d*+FGf"䧕s׆ +s $ҘϳB Uѽi#~;Iq78b.rtRTޚa=b)Hʾ `mA)ˇg9xP`Rz廔8ߵT,{oH S{jœe%0dN?i;qI׊Mґ'+%z*>F7-}]HFJ}i'E+{r)e)E},ap6CtO1+c|FLy~jh)N<LMmAmsKazE;ķy tu 6{p@[ (R67~Z)}1q(ܖ3OSD-܀G*ZkQCJ#YHc'$H:QK*p/l>kKĮxUf,Ԁp|0f# ,<2|0!"Þj ttq2| i1Ѥ 16b]ӔB װQK/ޡb[o + (Nٕi1#y9Teq +~G ؿiǂ$QaYxs^Q!ay8nJb_ vbzdxs? J4lHsdQc֒% '>vACv"Іo0BpPo+TG >bCb* ѝo>N֑bߑ6AaADvIz 'XyPa L"m|JuqF*O.eJ-dͬar [ń'KcB4x|d%SPT/xBZ;8nؕc0p_)T5qFokWǏ*໻Ose;_UahSIO-?*Q\m`!FKPT-BtÙ+@^LX<[klOYLA@DC b! +~P% la$VS(L8'|(|d|}*yaw-%ިLE3IpcKqc*|*]ww2#ىTD +-z!3£%״ҹvv +)dNu`%Dzf<}`>4yYjԕ_M&snqTDaͽYّ͂_XH?ߡ/uog qͤyАnP&9HJv6dxU;fJ. aVÙ"icA${OR6\\lM[񠎈 ;<6'Ըi zH^tjQ|Cr r_8/KfA0D6Su22J2*dೲQ۬i}@H +"<5pukF;Wk>R X5 {i3ҡ xwb%a❶>ujhtk9b]- 4p= Z6IT{-CF%G#iv{Mrf? {:Xk <^}Q̰)၂En2 'yuS[‹9~,d\[iRt'LKac->tbxir+>JDyl*39?gb ?0 =!95aʾ_l\(Z + m/>?pF-Ŕ\E{f ą趋N^hԛAxh# kd;0F^D*=*< L/I:wL^`ه2x)˳K/@k1~*c5|;ZɚTS@t\L¸ a"#2 dBU`=rŸa'L>\<21e]0BqVWaL Z qjw{UI#>(Gk4TԷ犐fe +fZU>VCu1]Տ^⏉##g&qƽ%71*[0b4A?NГiS]jΗh-Y :jm$ЛR \zgL6`#$~exy95EP:M}N%%ٴTb =z K\ @SRd Dc3,x 'LRTTEqg U% YQS=HA#TUb"-Ϊβ(fpWgr +)(C.$\^DTĩgBh@gKV6&.z};;ANxF2&?`L)9ѝb'eЈj@APN$Lpm b1vx ypHU#"xfe" +*2`@I0=O ̒M7l=mL84լ*"[ĜZBlb2VqwZNZ>-LQmNV#R/:T ߢ#dKϝ6qK`@+DGoTjUDk,j3ES è"#$T2\HJD9oE3YM.`*5jeUSj,=SStJ/Zd3Sek2CX>L|5%UA퀼9#yQ6a +&̨LfFPiW8t6a =xIG4Y11q#W\pScp*F* fJ0QU2&yPB`Q8997+3:Bkt"rŽ"1)EF^ U',D첔 +!,+J(@1 L-P=QG!`uuhBQWB$+&!)'}ܽ4pDIPa*tMFDuNJjp2Ϩ1̥ +++Y8\l! |}%_W ȀfJ %~KJfbZ{I7ڐ= GW\Sվv [2RyPT`44rCLP;\4=V-( @@E?e L"*Rь2M*# 62|):y(Bx fQÚH"BzM Uo k'Ri #4a(UJ(E{GYB'Z*|"j`QlA^z/˛p5ⰪTżoQm†7(X=uNtb갟!j=cȍiq?Q=y(O8ڀ<هh!XۢxgywFBe:THc XEv5/) Q t[H# u *jdVEc,4a#Q֩E 9_itd3T +ёo%@(Ѐ vQt&%qB,PDSboKqᛲ,_E@pρ^")'jUE iXE"Aip̄'8b^̦f3!/)01(HH5 P9[v 2CBco#GhYU hk)vvĉb-7uaC4lE#mAR;tSkۥp'\qiB&^8!᪚+TVÃPu"r +Ͷw}v+!l2Avn^6Q)1(Hƭ F|C7H:Ghk%~LAcs ++,xHvZe{-EVQ 8qZfEd .`uAo %:H<qbK?rPhZ F2.%HԌFc0ShI:*>QE +KQ=DDA0ޭe% M.&.fcy^הUDid,RdpTlfϭ/hYsmXYlfR#HjݑɈI^1c8as`$yxA"ˊ(ft )#:H*5|)d,!B`p.Kv˵GyR#DD;Hc\I#C +UsTjfLQ|˜8)L2!R] dHˡGXl ^@UOAV#A\փ~؛2;ZY4rJ2&SyI2; "^k&B2/'b(2(3@Z )yU80r0z`Vzp=XAbhFYMZSx B9P ~!p%~@ z)'ADL>OQը ,0(x(|'(00* fde(X$&, P +8{Z56N&O'UÂ@b Y-=A$Jײrb4 J '3E|-X +'R}mŸYh`FG!4!ڪdX؄MZ~c7G1O#%rg[CEw%^2Wtg(B*N't""hE+iD"n*^#0Um Ռec_<J/?7q"`~ҊV2KHXF>GX^Ur,7j+ra1V xHsW\QUrbuĴL<bh=DbJUޠ8x<)JO(AUs`DC~գ  ݑoװZ8X?Ӌ`2Е).NPcMq5$D`n&D^DoJ{X@460 &*"Afq91Rq9ͷE TSKYP6B'l6D~fiumw|-C<{wG<-PYԖ`a}t Xe J3E@A)V$ +Q@%P. IPkjy ctj9# ` hpRe CT.:M4r MJTky&8QХ L)m8$? +\Hmk y` dB5Iui2򠑀QxQQ7'(I+CTQ +S\tiPёb,: * X!CF+ nz7}+$hUtA4S3IG 9<,%&jD(b܃h;N +/R1-@-MD& _JM,TqAN&jS KVEj`qŶU\fZ?D 1l21iG ` rUTTei,HA*a"DY$p[5cJĵ Uǐ P7D PT6RB ]jaji(/Nc5SN ŊPdFV>0(Im&  uD_V)I(`RC¬8T;:߉:E6^4'ՃxJHDfyL2FT86'8CiX')adK\%FD䌎0Q:QEHVB>?A9l!֜$gT}[@ +ѻ8p[dTHY,QʑRCI:_H }tʹP)}#LͺGdsTA>2PTNAz^AB"s't\u;FUtP +ZU]ƁpD%E)|uCX""3"Œ$+b#,xؕ*uXŨtrtfcU \ Ƃ`<$Ur*8"#PLJB@!eFDF#FJ7##)ƽeE!{ Z)YL)V̈"vs)%b d$q%2ѓi8a,CdUD|ZJ +'Τ<Q@ Ȫ$  3]ȟDJV|&iȜC;X`N}wEwL 5S=B!f[]BC)_:YV?⭑JMיӛ8;|WpJɰOBzN"i+*xeP,YSrP=5%'c gL VqNNdAdW܈wo vew83 {8E2i/(u`vLTY#Ql5ID(BXTf.lB`S O8r첽^ak÷vɆ>HLFpJ1^"PU!@aЫt1L(GU +/g=jg~N@?ΕD_Y~X~'dnv(I:Uը-5*<$@tsqXa%CJJʳ>%/i"qUMOhSi)LbB7AƐSu3"̱CGJ{Ġ[vlMV9a/wZW:>S`Kh>7G1XM2cû,l\rǦJOHQ&;=Dq&gҒ+vDZ; E]$FǩM$[Jc)4GmTuhVQܺ$ 1X٠-N[pM?Z BQ') v{f5g_0n  sj2jb›:^c]J{&/֥rul.k +\E˾rȡ&BδJ6W٭Q["/&n8Ze]O'BV8q@wh~F<UI0Fyl.& gh!Wi.wc.EP%@v`daF&~$\_l bo^4k7m6]+WI.X2ۻLOEͰV7B.QbS/j۟TÀ-~cXaӁYRbd8FL vAL 8SA_bİT2i=q2xh2BYscU?ϗ,EO dU ryw{cDM `4= %&;W GQo&X<Ѭv1 F1bsU=xKK6d N)=WQ_# qOEGT\ +ts--,!X-:V̗CtOmPS4:'RAS0 j.M-.Ci a\'t KzP0J@EvN- ]I*b"ɵ$`C1Rn[: yGbT^QENY*2Ӭinhh rk:8Ɓ%ǕX # HY5j#6; Z~ Ph.{PKgIҿZGLHR3ݜTUa t쏇A*xm7<䄓=u٭ , "jH7P4qyF΃xL.m$»"Fū\ SS->pn_/lw< );-XJh#Mlyv<UbL1Ҫ>f8#E,R{4 PhpL]^ cW?iJ7ۜRV(_EH$v]n/oro7^i0`v}ѐX*m|=QWYvO(m=msg03:&kߝW& m߇GP<:]5/.#Co9NGYpW + ;JY@@^ΊO{舛RD !6 SZjOc7Am/e%UabfѱqoFbG`&2OXfIB8PU1O+௬rgmAS ~ J\! !]6WcawHlru5|k$zh[ w>硐*Ra?;|Pɯw!6e1MNZ.Tc]MbAj*+w="̬)>ڢ}`'AkA7' +( 2E|oZ:2F/J(En6| +$bW`6%u>d_]%!m+jnLt׀#7?0\; # 9p"TǏ3䥰V87EAž[QE _Xb_L9Z$NG疼H}td!wV>qq ~ObG9N}b6!:b}#[.q!X#Y5.'[=66IN.PC^,ԪnXz1ܲ ayP:Ocaѩ2uތx Uߐ d9!VJ{e Ht\(MxSQ |пz8^ +mEF2F6˗řQ3MC<W@ͥ+]DX*Yv7XEP5ST1F ͡\/^Ϻ'eYA^Y~ӛ!MG+ +]Q~ 2aP6 {3g "x[DH @"Puř&#TI_3U=+[SM&\\ sGߖx%F%aЈTW5U"ۺz \(xsKuaKp x+|X' p٩C2\L kL%)>`P+J hits'Nv0$\Zu($-=friob@ 4@ + R PǽProi{4XHg,\b&Wbp(BqWi[`&ΰlP6&PlOjg*;`%E,(U @b_l:+CƝkJ&D9ɹ".ɺ+lG#@qGg*Y/<7{&(!Nߙ!Wyhb3Ch%Ix?6z*U! i68}L~C䃲qxF>v34,Q`x"O "\JS&G}a |)m;*zBZz^u8[?EUb10 VO9ҖCUXUAvNBt iB-Z .}OR5>XTO4RE ~SRl9^vzbe-I gɁdv0%.}%lT= ȿ5W()Oi x!bX[߄ZQTus%SsY˖Hu\`QbjKY1 eUMIHѓ=G-dSx$d^ .m\UYijjf}SD3BWCXɎt pdRTjG@%ic<2o(>@n}=ǯ#]yHi%L^ #@STuW""wA%RJ8PY:s3!7$7@紡y8ǶhPÕ1А;lop@9&h,| oqٕ@p9<7[>ŐtKl.Fvggdȱ$D|O&g3d<.A5tٹlK`,VA amdrE$lϊa C =IQi=|WVSWnr.~ж}2^p1_RØZ1cس:`|1K - otJ`n 1Zfr Ri.I{ >7f|APpGO؂fհTC{qt_5* +] )t;V!U`kN3Uh'A1f("ⲊvZ%rbz',E{zj'-/AMXA\t]r-H!*{#^ei}yi޾&cHZbTM|ֽ`O{]1 -_KKN"P0Y2+0a"JJC1>n^^ͽ1s; `f{dyLm,( ˥ؓ{86Bomz~7drRiʻ0 ^o[)`؆! E),CVKW<t{kIe?`gb1P''ޜ$5˥ o0:Ano:xYRi>~Y/$]mc+iV?>v6N(D Y-}(&% (V@|j9^i%B:p,室Q%qUe+XgHW%IN}^ Dgs-+DA x5YȭĊ !wQ"AFFP}d[x91z`q*C < GǘHfmcQ_љwa!+ (5V_(LN;ȭVSu ~Hsd%ʇG'l/'M@ӳ\0gZx"s{9pBE;`iFސˆm +;9 ݟy)w$!ߚJI90s{> +@U^E^҇ߎ"tq8 42qEїahTsCm&&-6J;/Z(0ƒ, |+mz5*/̉ iNEV'D?`k +d0Mb"œ-6[c=ſ *af~@狶α;NJ^>2تPj9+,bS- +Z]wʠTq08ށV"ħlEZLMn#.eؾIjcM3P^ڈ7$tl龒/ xmbVah(>f\:8 sXY׍<۫7: \Kp5䋶nL%u5#(GW`ɓ,j6JnPfPHO,6ybFQf'fG0ULy5Y2 f-Zf]A߫aZp53 %p5 qCL `?դy15Ig ִhU۠)[}^6 JuAyy܆>Rv5,rꮆ8ױpǹ6@tj5`QƦ˖[d_ ۥ;6vSd.XRQڟ}mPOjV6tj<: \}] +) +Q \%Y`˙6Y -I\5Ϡxg5KSAmtժJVCN2[GFNV3lOW3YrռXc~p5̸!¶W3T"3_ I@%^Gi 0M j=rмKȕG`>bkR+KM,tbĤ v1a`.kBK %L'i1ki&0iWXjo k%kːF4wDYFJt:J;d7{d >:Hq|lF+F-dLUBKwK[/&Ծ" 4NBY)HtvWfb0O{DEmԇNAF$JR44"7D;HIJ&*{uU@9&S2M]K0dܼ-M֕"r6܁UW,\TfAМgNwnV[ÿq2<'F-VF[ftj7J$ ;GyYr ٌ8+-/w߷ %8V@ +V4s} + mBjlmhC}\Q1gc5pOj)C*) Eo7!b C8j~64@ +;) 1j]Rvo.k2hŝ RgT{[4Q~¼κ*x! 9<&xț]in=D1lX8. h6G)l:L୩u4G(x@C H#-t++ejk?;L0Db-U2@8ڍ]>lJ14Uc o݉a8I$4,ahn),QX {E޼NPcN ЍpBBYb GgòaNW`Gܣ=g$y;0yy,r"dHdaNU7bع2\%Y^/KvKS- X%ʞ1<=ԗET VSN?g$ɐ%Al ғje굎k:t, ,ŒNccT:pۘ:(?)v̳=+V% C ?G֏zFnkq Y!}jZ蓠` J1~t@(sXdaNO"%YI4E=SjG9Nxub$J9>w!J"!d +<>R$0on})^sZ8cMJmL(`0RhaͲͷZis&1>ƒT^ 0 +JBiw't;%Íq,K wJ7.[Y5IF 8 +zyXQhAя=8|V6hM[=*`ѪHݒG0si X~nZĈD r݋ N:oN=cpkq;yRO$g>t!pl",,&heI&}>QD)`7 lX?dm +TZc6V`Fӷ\dSk*d#Πd2f9Z.5Q*$ ~R``n4&hF+@0ǑҕϬ"jtV.]s.A;=t9f%zFVpYg+:l7I%VuK]i C:4笹 }vvG?O }+R!xQedٹ*Q!:0m wQ!ር[Yԁߑ_`gCbVT l:'=+H4 m؍ IpN1E+uC f?.&(sϥ!$pt%4]PEEDaeȟ;ln;ߊKVek8 M +Ex•= FӶMc%YV .Wɥjӊu&S!07>Y:uuڄmc +/O-& xu ֣2WU_Z붱U?}θ It=s-qkTiH~7J ZKy~AF*dP]qn2c,mΥЯ_|ZDWĐ@kV`"|K';}wNgR,Fd+oQC CTaq&}_)Wp*Jc n򏃁E8Y?9O7D+c#Wee,y6A'KJV@C^Gb&?aUHES⢌bc|Mjr1>8琩UoUZw,a 1u-s'dx^M +DsJ@o^}~fBnduS* -OWWvspHIJblaz"|۟BO׃S7{^.j9A1wVt01So +-:9 *_ݔx5nVr-F!n +ԃIJFHrk:)$ס06:r@Et{iaEkn(d$֯.;~1& ޷?N!r-•~Q3d1Hx}3UBQ@ yg'Ef=D,[="Nq8PI"=W|]"XS_B}}F8k ]jj{uħ@z^oq3ZMw&-]Z-=[D7qVgH呎=[B) ߆ 6b.z1KBhCī088 woŃ{0 |%_?uA9F$vè0{RdnX υ`KOM\:ȪaVx?]2XӀgBYw)*PZx/Cp!y`Pa[pYpNdzm-#tm<7jی>o8(e?1/ ZhbXp|/Ej_Y,J@C3V\4rd:@ğ +*X{]|_C}; GₘIy d=Ss5)95/5iNMo]U# Jz/VflQ_m:F4LCm +8)VN3M`Meť,8)`|599ⷁonhR%3 B݀lnj|mcV`CKZͶq*+{@4A\E_bf3 D 2a$z`4{H|@d]g` ds.C4=ͮV{cd_t @gvh"=n_HMd !u *ˤm@V`G +:-J{"|bk*؝ Q+;tV;tEV|pJѥ7,@,XVe~)#jCu`'C3)}H0-Y 6EC,͜Kx{[ 03} E +rLwWv(1Oќ䟄y V][*dM/^Efy1mġ 0"ޚ+8ĚfQDNrRŢƐp:[ȰUKu H S[1n5b+2jR#~ >NԧNV4fX-\UXMѼw3`Y'R*8ިS +6, +t.lESau3yoj(Ն`:ޙSFt1ȸP 7X\IR{.q_ZH"15f_||To8/<$Bm\BƟZ'g:0-3j%4NdwfsTP ֹoTzIbD[bj\X" )h- +Ce!q@H|}&qLj)=Mʐogҁ{=$e*n@Uia"A?#ebn| +x%Xe6f$zdȞz,w,W@`qxVSrt`DY ս>CPyS{EQ6aQw^\U+M`A4Q.%pܻu2WϬhXAݑ 0P9fS#U"0*5*apF)K j봵W d! ҨVU({-vTD\:P/{D:/AkB@+*B1VaZ^q*+u=W@㋑"As9)S.kʯKʡR}01#"~V̼^.MKCq6dVzv* +rPWwxYÇ@e~.Iv،(c<hku 3'P+j_G3b2[u) B ECDݯ%緘UJ3&>&8Rx&3}_U̻ DKOZi;B"dR@[ id[VbWu="76dY.;P}^`ԙָP * u +RL-`: @~ utpc$GFXtF5 9{4,~n +>Fh}^;j0tDݙ/h3iEFHGU1~*-Љe@ƕoRUXsAEFE,HEO}Ʉq8GR&Hp2ct%Sk1 x_vlKZg]͌5SZT"kҺr(dEP=EzW31bZN +: astCa_cin>7UkA$>\/L1~[x.Ob43(R >=R59)!0 x&@^{dOlU 96N`f&xal.[7 +'BBP x bDz>I:\&JoGMAAm +BOAs7t>(v uljB$Mb003WE =ЧdwNiB% <;VdU-bp+e@J{5}6GqgEYN 9Kdk@Dƒ=WƺU30jnt12бӒhoᆜTg \ +V*ȯ.Ԓ(sq׾ QXTV@Kk*@x|*=϶?L#ĔN,Cf{/iD(ŜIaxM1͢ Q&eI|~C1.9 KCh_$H\s't2aYN8t@!M%v_18P?5;p: HA>JuN_ltIOҾ +*De9zϴ|NhNѩW,QJƊ$Õ Sr4S -ࢽ=Ï֊{qłGO  zdļ +sYm.c +kSFʹ jG&6"L8 VRl)fm_YWaJݰIXzCdx$P KmNvEaDdUͥv(B>բ" iR,gXZ-%ԳHg?<ͧv[bMDJ#ߡKѺrJRmctn ^bߦA(CXIM4c'' +ZJn)&bXYg3fɸ\gp꾀I ճx +:-NZ%2Z)WU~ˡwUH)8FXQR@+jk9z>ph@jZeOvQ^1cTg^yT#F^.P"#<3)ρfpZ KKj7$LL`A$V};Al$L 0˙ Lx熆ЖVO[e lRG Zqw6.6,F/43P`*A_fL5|g8`,˾SNo +%nk̙h;S#jj{w w截k3lQ .zNT$f(wv&wb46,8 SI"D́S6<60N1qdl=]뭿J05PciƜT8߬(L621OQ-y+b@BmON<;t>[k7-*RmQ~#ބ  baA_snм( ^\C4R6StAגRtzKx#3fI=^wYm;Ѷ6wh;>֥%o@rݒS (0u ags iM-2@-pR1q +F-?o}[jH3+@DdQOtZDPj +&G\ hO̶)9^"S/tlRM ٖHvTaX;gk?dz`4` {^ :0.Vk(7a9Pp)8 +u7fl𒮣H&rAc6qwӺHuMfExj#D@CV%*^1g{t]jDynZl"52`qx zRsG{iI +znp,}P6̠mV#@NYhb_Z73zb !I>͎y^0uw8,iePhq ?j"NTmCgQSa%RD? +3MJ +9.!7>Bba CjHP'kx'|yo ܼ)XݍaHȺ17=PףK.q,nY?qɊ(͖/C!(@8 [I؈ Ǡ!C f))Z*܃nƽnDNgR֘D>}9) JIXUx_]EBsSb|4BAzDsV ]bp3N'zIotELրt[B:XrE'.c=o^t%(:r5:4^hP^ߤP$WG&m6q)5a.Mğb]pRm2x dx:@$E'@G֝d< 2qk/LI[|1",yHf~`ބS0) bzyN/L"Mh*<%UP(T 1/,g>zdaBĬ/oPN̲5 @n%R.h +K`{3 +`%` +HlZ`z"1hQN_;m w¤:\U_r 'z x#wq\Q=ޯσ?YpBY%y}$7, 0qRmr|.M{4+( ,0v;?3I%*(W|^LiT|]3tZ f*Vv'tdժHd\Y=m2{DlT5ca\ܙyD+*SpF87ֈ̙BJvnN2BY}EO8~@"^ +`@0$Ut>TGc-{clJ"&oadϼ#GuC :Ҋҍ ݮtڲN2 +xw2Uw":ߙf2ɽ{pw'1;WԜw䘻z{Q{MٸD8,tQœ "ED괊333gd!S]H7;Jj +)s'HXr~~FK\C1QN`TWX[ZXB0LlESce>HBDjD&+>g~nQX -@KkA^4|+R~wqT\jQWOX +bC K.T.""&PGЛ;R}˶dK&439T$tA2eIt0Dł`0f.@(E"a@A c  F6cє%֋ n ͉8)LybzJ$(VVh[`Dld]pg 7zkޘܞ(/J9lӴgzJ +:pn-(ÍU=p% CZ@:J˓ or$\F(IlPcAp+1&bZ]}?&YuU IU1'7?({u_E[շ&b z=iٜ~Y'B G]683Cܗ}Cw+%fuWFz:0Ģ n928Z-}V3\(0h X`rK*]T*r5[o4-H. +/38)`H,N.đ{\&!H+٫f#@n ԭbEn u`MjhjHGf.@"j2S;cxy{l,=qM|n_ BaugKG`cVdOÐigd +1G +9$)piqsc!2מ=DSa 񧧰DDiR, H/m,)+ᮀmkW(;U!ѴMl]~Y+ i&q?mg'{OhL. |NRN ԡy@^voCoghżV\|"c#<=SxkTɁ X/:B|!TYAt@@a*7q_zc@buWK!Jt|Al!%A4$Oeik배r< +Ҿ>Z6lEP +8A]c0mk؁1m#OC4v}Kzq̟$( 4\^Dh'P]3!*a_v˟ "i)AU_ɉP׊J1ެ`\$#ޅq/fR'~-':XqM 0lTѕ"Ak(^H<.+%uL i|\GnV)h2i^Yݪ*HpB""[bl<z`EN' LF儡+G9iܗ{g,)7-qq|O)^% d:^,?s'*_kw 9i)κI|"?=HDY<āj$I=^؄&} $SіK'e2]ԏ0 /D?qPUn "ȢO]u:W.%c9SCP#[#`6[P->>-H [JcdhsX8m!].04 3) ybÚ4DžW9t#l@ReBء܏w4FM{EL)i0{bL'3|^f,==dgXOrP' 7׾"φtq܎U/RhDRO]6V(ДQT8i->aP;_nd xZ`,bm +wsCÞ8bˀ4L/Z +[QF=d30w kXv%"_JP{'ec!{Z0F c=0=R @DzM u(lG\U$"T|UǶ- C4cíGP\E O$:Ae05>S?(~fxM4en5jĺ8 + +GOݧoC" [vO } +e}}bs<-U"m,1ڗ ک?68o؍]A4.$O {^JmY<&fF8[{ĉ |Oݿ߯?Bjjl%lGky}M!:qƺnP$93xCYkф +ͭIeߜx #ݪEVΗ:h?E$I~'T(X' m ;MC"zgw;2l= +WH\Cu *0/z_`5br%W:c-[ ¡ZMIfqL3 2cEMs#rdW ^5ǘ] +j!~'@az֭mA,E 69Qq\nR :7ݽv]f}R#Hcݫ(o<@ {|9f`KH}t)7ev11O":Ctqχ$P\JE)`0Nmt0N +I= =J=B@I%<։8^hpWV +U9wi\K rq @lpBX㒽OK,͈9sŨ֊W4ӓyCd"qɶ`/8$Wu4OINg4mE2:J C/:mh,mQpgJ f=Uʪt}Ydu* 8`n6/a*Xyp'**$6%!@ SW0oŏ_Ks$kK#Y\ug# ۯoLCҫ[Bq*\(PbI).Xd3Qvͅ _9嵠Y.ӿ@Px"sjZIOq7n@ArD@Xi_\M:ZƩ"#א9'< Tb ϯ?'Cht'{>h{E:Jq]ee%B4Җ3z) |f+/5+jh|6. ӰxqKጻv:(*0bؔJlXFNL?:pU%aܰqٰem"ĉOLGw~ؐ(F'h`2<!c +oe4I\6gq / W koL[:؊d,ϣy|4DTX +K=5*Ґ3pAC1C NbʋwwY#,{9DX5mz8s'hGʀ7;dTU5-89q]NT[S/Ա?s\}:Hf)ǟ̉Rla8R:V4I"f6HM DtnXXG*] rt6Nn@HAHOH'l+FB(5 NsY5X+\Z4'+8;ƻH^K9n(ϽJ6ֆledFۄ氘曆\0# bYөJJ^Myn< nAй!`kQQ?Ѿ(D_Z:{PwXGyyw0 C<6"bL!4E5Y_/i UU(xg+忀'F!n/p$^&^q!x9έwP\Xbv SOˈ1\͂H +2w~TaZ1ɨkYrI>o]'OKQpV(XO^@aS?rK !$e Gg,e'W5<WHU`i:+ +L9.A|:`+l20(D )4,7+k5HK  zNW (&^ "60J8J c:%JBµGl?5(ro+5?۰MD-|oJS*yf~U1yw9%cyfL匪oh[g+Tס7 A0/Ԇ)#`p<]PoC4).9t 0<1@nBIAr?ݯG?f^ @67˛lzjMٹ#t@ q'%OjTJHؘ֓&7Zm$1&!In[t"q}Lgғ Uѯy󉗱Yg&ƈauM.ItqǂoϜ9~$mf'Bo-pD>ӣXVb*nBGt aSeP4TR@库hBzcZ]Ž\px^ x'Hg&Pcf`\iuDά$:@ +\?QvnVH0=[2|=+_lȃ_z6oG ثoDسEfVC !_f盧7B9 ,zInq1mZ`SR`jwD !z$]wɾqpH-U$Yl#fhL:/n 8pL| +Um=.Uֿ~z%ExLՠJ,lDƏ].UB=Jp?п>qѶ(vq;-15wzOi{RGVcӐ%(.#|7 :=@L@ỈA4d8bjz ڭv{ZmB/(r80s( 7$Q{`rhuE[BOA?8|nh3AhN^EΥ$¾arҲ[h8z,^ M4d; V&)1_4'# $]=Ҏ(GjF|2kE qN8^5N02+]c2ڂ0PysHx"at-fVl L1E\͏v9?|/1s kZyOߥ6#OL=Mi`F;[.UZ+TVFɁawƵ` P*[A< &m+]$`PbŒ9dhB$<2B +.F'r#w/Ǽ{]V` =hp[NF +5n zJb؀ИF$)&Ot*SEK5fO;V #x%x.AKlY U(Yh.4nCl`{ XylXoo :l'_R/ÑYt&JT)Qn +ñ Gwa212,& ϔY^=S*$Es%eu.8sNɣN)M!* z@%k2|jݔCɚ8uMžgKxզ̚(cw"NWH;f:+,7*C4=s{z.VtPHj k-^)AK41c l̾fA +!^=rTj"5YeMOpY t`=L_1cҿGp=SzѲE^7P`dv&N$3ǹZ(0}4eV2Q,(vt~ +$&C)m6KgRG906^RxGl00KBEQuwi0 pSfxW;)O(k9U>3LWTZ ФJ^Pʪ0afKuEUxK$V-xN'*l +]7W_h,jfޕPc5ɫh$LkjyDI6"O + )}a7|eMi[ +,{l?{ fJg~EX{4 +ʶ2`4/ӓ LPb#I{hl߰aLj DJl I{Uq[XUPT⢧wvqH ;Cx]5{ܖOUAGlQ@B ̨z }Á$23a{B%+oSX)X(<*dMJ.E FY T1#ܭ,G! nF1f@NWCNDUFƧT0d0,bE.8{9L?hT:vK~XqP:;Wu(\r#.bK技.n1q޹¡q:<(%?co =0gNmc_*3D|6i`Q={(㗄V eQ+Gh΍>E +endstream endobj 3646 0 obj [/Indexed/DeviceRGB 255 3653 0 R] endobj 3653 0 obj <>stream 8;X]O>EqN@%''O_@%e@?J;%+8(9e>X=MR6S?i^YgA3=].HDXF.R$lIL@"pJ+EP(%0 b]6ajmNZn*!='OQZeQ^Y*,=]?C.B+\Ulg9dhD*"iC[;*=3`oP1[!S^)?1)IZ4dup` E1r!/,*0[*9.aFIR2&b-C#soRZ7Dl%MLY\.?d>Mn @@ -1453,7 +1445,7 @@ E1r!/,*0[*9.aFIR2&b-C#soRZ7Dl%MLY\.?d>Mn VNWFKf>nDZ4OTs0S!saG>GGKUlQ*Q?45:CI&4J'_2j$XKrcYp0n+Xl_nU*O( l[$6Nn+Z_Nq0]s7hs]`XX1nZ8&94a\~> -endstream endobj 3529 0 obj <>/Font<>/ProcSet[/PDF/Text]>>/Subtype/Form>>stream +endstream endobj 3643 0 obj <>/Font<>/ProcSet[/PDF/Text]>>/Subtype/Form>>stream BT 0 0 0 rg /GS0 gs @@ -1480,22 +1472,22 @@ BT [(S)-3 (a)8 (v)10 (e A)6.1 (s c)5.9 (ommand)10.1 (.)]TJ ET -endstream endobj 3526 0 obj <> endobj 3541 0 obj <> endobj 3542 0 obj <> endobj 3543 0 obj <>stream -H|TiTY -S)ZSUTFeuqCDq!H! 1JpD ({#"( -.(0 -v} }z*5sϽ}~c" IAk|z&B }NX%O_lg1_|9nFศKj|ܹn.V1j]nfr_e\J[Sh+b4qNtFGG!rJ譛T%U:J#WF4 -*FY3?TX%FA:aS+W*g -(q,aq:MJ:/hx|\ډa0d9bsư1l cm",Nc! sVcvYhsCl"ċĩxrI~'ql K:^y vu"Sħh![M}ԇHIzQBp;gĞw7}Bt@|,Esԧ80F_\ʵޯ|62\66p'+s5 gph4'R{>tG&: 8ڍ{$N臽vf߼$U?Uin7$F{%U~E [*RZh{t6kʈPvm~> E;o^$.F^_򆀟F$DXE0Ɓ"{CajpDARĢ|)0&*+rlG'Ƀ%eON5\*%6/dO;霂CkMZ$JMu$jꮤ6ܟ&Dqա+UMoZwe]⢘ͅ~ ѥ}(pٲ[֬+)ST =? !~BImzlmB/~C9ӥZ B&'%kťW뙏Ǘq&iI^ MJ G67gC3Ugn胉;UzާvMjS 9?U `/Y^Fc up4g#}Ei)} t~v=9_sD_4sզږdttZcx ;}otӽ> 3JŹmy6ah~:LkQ{Z]J=Zq [ ՚$7W2ht!WKΰfos2\Fe'qɡf҆{_{^e FeJmԊ׼/ >tŲAp MD4 M3,̯` ⽑*?7qYtˑ }2 B||xO{NKɩiylnHrh&tǾH.TiXL[}SB5#U8>l>Z,6B]$ -c4Vן$VlfsqI\p;LK{~Ujmi;2H{/Y6ؠ-@s!zbS! ~/Xh!z,POee_|*,NWFFxCb^ ܅T*$ aO>}$I"T7MG1ڊҲ\,P0Xy[x!釘~8  u뚘GA 9t%م9 3]A:5XRj[TJb,ː7ۚW0ld4u4ݻ5³Y[\X60jݔI7:!|nٲ9> -~ ~VQMQ"BL# 1-?=N~ci*,->͊rwND£aڛe_Iqqۺ>J2WFB_/d 7?F$i@N}qd9Y?} 2cj~-sѯz) -gE]+n> endobj 33 0 obj <> endobj 115 0 obj [/View/Design] endobj 116 0 obj <>>> endobj 34 0 obj [33 0 R] endobj 3544 0 obj <> endobj xref -0 3545 +endstream endobj 3640 0 obj <> endobj 3655 0 obj <> endobj 3656 0 obj <> endobj 3657 0 obj <>stream +H|TiPYj (FfZPST\EPQ[EmqEiNCWeAQ@D9=U@<׉ٙ,|L̟"22_}{8fl8>{Ulد+|nQGՓIg_Mbgoπ_fV}9#px=c!8bWW{I8e]le-2wEtR_<1jyRa'sMAhdjFNnQ,T#SƩj\H +J,N-W(#pYd½J%d~Qoɣ )8uRcwlL܋a0dYb\ư1lcL Ƙ/]f-m|XVux-`(Fl'/7>d<&Z)J"gdB[|Ϥd4t`ݴ3㔴&~ &"͘OH!!ݥ +8%$[4L')V !&fzC( G{cz9N磣d=([S>f@D?2P fW}L(t zHSz0ǛBO_9_RyEsQR )(jA _$堢{J$4q`YdI9FnP +;GM$ySstIyZq:8o#?z_+ޟAKlWXO`ڐx2wG_ %V+4 >^%օ?^2cu)vA(IWsS c_f2熽˳R9~R>B\L<p8(C*8w7wswS0 H;-WAg~P-F,clfz +gCz/wvE2b֐ޥ 蟍"7gf^_FlÄ@X0fv"3a^pDuCĢ܀` a.G +tClGcEũO/4^+ +oI7 .rblM>*熽鬼*C{v(MƉJJo#Lk*{:px>-*ڥ+Z޴K< +"=􅣛m0RpU!ҵvoRT`Z~ #Zcd;IJBZP# )ɗ 5R|B67 f6Ε73ϬhS2J4y\^UfɍBKRAʒ;/`Gnw}}P9"< IcLҫ5 !p:h: pqbP408>.lϼkZ5'iD֕ ׶` gHI<֍W"x^v8fu?čij\Q([+g! -@6m`~զQh]WI#o=F +wMAN{5K ,Q?r9;LdчRSYIA?cׁG7vpt^J:ay;XU/K-B+9pqBb4<[E”zoύ`f鶓W_1}S9 +1, p12(~ݣ +%ٝbNF0A{qA +݆Ҹ:'T+RvcOpaX2/hU"YU'Bf <#s¢p6~(Cwܺ\'R(Ke\ͨ`2Zg8pL&I~ϋ٬:),Oxo#Dԓ9'wzqlD̪z}XD.RA@}?n#d'8L$%]8MD9MYŹK\8P0vLNpWPo" bH2g1$w"˭kaе!hgge^ibz}8T2UbXn[+<1>ݧKbL m@'lwLV}LSWMӽ[P,<վυe3( sMtk‡-S0m)) !8)9 ʹ:srcߛsw=ffm)ҲӬ,qxD$<ʈl;[׈-g+8?(x.n Ki-uL]pCcDԷG'".3F=ibP}vPu(fsF24{bqR~ q (SSeq{D|3uƜw,>cr QwF9>nol|r.#V[\_o`{KgGtEMe%e^хESNO|eB"Uuoh9Q<|P˼‿Ya +INb(I{y`.Lt~za{^2R _ǔZ܉CMՌ2 ̔Q'R*-7#]m04t 9jg6="k<.+= =Uci5 _J** ^? |/8>b +suz vb=ʔ[/QY37Nd亏 י~@;T7*Fv~j=o jG`zfB7F$AVl?@[_:;*OV8¿Lai`TUM3TH \ <sp=?GPF[X juRZƠtjINx5yZŭǴCDeŬ!Qv l[mDˠo%@!HH36ޕ>|%Kciņ;{wl/M܈S `X`͋uwC=:M88(Fkɪ"X.qw5w(K$[׬\_ Uki_1 +endstream endobj 3654 0 obj <> endobj 33 0 obj <> endobj 115 0 obj [/View/Design] endobj 116 0 obj <>>> endobj 34 0 obj [33 0 R] endobj 3658 0 obj <> endobj xref +0 3659 0000000004 65535 f 0000000016 00000 n 0000000147 00000 n @@ -1529,8 +1521,8 @@ endstream endobj 3540 0 obj <<031597721A71ED44B6E5E24ADBE315D6>]>> +<]>> startxref -274989 +278932 %%EOF diff --git a/datafiles/data/themes/default/graphics/icon/s_panel_animation.png b/datafiles/data/themes/default/graphics/icon/s_panel_animation.png new file mode 100644 index 000000000..de2cb7dd9 Binary files /dev/null and b/datafiles/data/themes/default/graphics/icon/s_panel_animation.png differ diff --git a/datafiles/data/themes/default/graphics/icon/s_panel_graph.png b/datafiles/data/themes/default/graphics/icon/s_panel_graph.png new file mode 100644 index 000000000..134029c19 Binary files /dev/null and b/datafiles/data/themes/default/graphics/icon/s_panel_graph.png differ diff --git a/datafiles/data/themes/default/graphics/icon/s_panel_inspector.png b/datafiles/data/themes/default/graphics/icon/s_panel_inspector.png new file mode 100644 index 000000000..ff67e8ad3 Binary files /dev/null and b/datafiles/data/themes/default/graphics/icon/s_panel_inspector.png differ diff --git a/datafiles/data/themes/default/graphics/icon/s_panel_preview.png b/datafiles/data/themes/default/graphics/icon/s_panel_preview.png new file mode 100644 index 000000000..a9dcf098e Binary files /dev/null and b/datafiles/data/themes/default/graphics/icon/s_panel_preview.png differ diff --git a/datafiles/data/themes/default/graphics/icon/s_star.png b/datafiles/data/themes/default/graphics/icon/s_star.png new file mode 100644 index 000000000..e3b090ef4 Binary files /dev/null and b/datafiles/data/themes/default/graphics/icon/s_star.png differ diff --git a/objects/o_dialog_about/Create_0.gml b/objects/o_dialog_about/Create_0.gml index 8839e3946..8aef650b5 100644 --- a/objects/o_dialog_about/Create_0.gml +++ b/objects/o_dialog_about/Create_0.gml @@ -21,10 +21,12 @@ event_inherited(); [ "Triangle grid", "Farini" ], [ "Pixel sort", "Ciphrd" ], [ "Simplex noise", "Ian McEwan" ], + + [ "Additional help", "ChatGPT by OpenAI" ], ] sc_thank = new scrollPane(dialog_w - ui(64), thank_h, function(_y, _m) { - var cx = (dialog_w - ui(64)) / 2; + var cx = sc_thank.surface_w / 2; var _h = _y; var yy = _y; draw_clear_alpha(COLORS.dialog_about_bg, 0); diff --git a/objects/o_dialog_add_node/Create_0.gml b/objects/o_dialog_add_node/Create_0.gml index 5235fe974..3c503ade3 100644 --- a/objects/o_dialog_add_node/Create_0.gml +++ b/objects/o_dialog_add_node/Create_0.gml @@ -24,6 +24,24 @@ event_inherited(); anchor = ANCHOR.left | ANCHOR.top; + node_menu_selecting = noone; + + function rightClick(node) { + node_menu_selecting = node; + var fav = array_exists(global.FAV_NODES, node.node); + + var menu = [ + menuItem(fav? "Remove from favorite" : "Add to favorite", function() { + if(array_exists(global.FAV_NODES, node_menu_selecting.node)) + array_remove(global.FAV_NODES, node_menu_selecting.node); + else + array_push(global.FAV_NODES, node_menu_selecting.node); + }, THEME.star) + ]; + + menuCall(,, menu); + } + function filtered(node) { if(!node_show_connectable) return true; if(node_called == noone && junction_hovering == noone) return true; @@ -72,8 +90,7 @@ event_inherited(); ADD_NODE_PAGE = pageIndex; node_list = pageIndex == -1? noone : NODE_CATEGORY[| ADD_NODE_PAGE].list; } - if(ADD_NODE_PAGE < 0) - ADD_NODE_PAGE = NODE_PAGE_DEFAULT; + ADD_NODE_PAGE = 0; setPage(ADD_NODE_PAGE); function buildNode(_node, _param = "") { @@ -242,10 +259,24 @@ event_inherited(); ds_list_add(_list, cat.list[| j]); } } + } else if(ADD_NODE_PAGE == 0) { + _list = ds_list_create(); + for( var i = 0; i < array_length(global.FAV_NODES); i++ ) { + var _nodeIndex = global.FAV_NODES[i]; + ds_list_add(_list, ALL_NODES[? _nodeIndex]); + } } var node_count = ds_list_size(_list); + if(ADD_NODE_PAGE == NODE_PAGE_DEFAULT && node_count == 0) { + draw_set_text(f_h3, fa_center, fa_bottom, COLORS._main_text_sub); + draw_text(content_pane.w / 2, content_pane.h / 2 - ui(8), "No favorites"); + + draw_set_text(f_p0, fa_center, fa_top, COLORS._main_text_sub); + draw_text(content_pane.w / 2, content_pane.h / 2 - ui(4), "Right click on a node and select 'Add to favorite'\nto add node to favorite panel."); + } + if(PREF_MAP[? "dialog_add_node_view"] == 0) { //grid var grid_size = ui(64); var grid_width = ui(80); @@ -293,6 +324,8 @@ event_inherited(); draw_sprite_stretched_ext(THEME.node_active, 0, _boxx, yy, grid_size, grid_size, COLORS._main_accent, 1); if(mouse_press(mb_left, sFOCUS)) buildNode(_node); + else if(mouse_press(mb_right, sFOCUS)) + rightClick(_node); } var spr_x = _boxx + grid_size / 2; @@ -312,7 +345,11 @@ event_inherited(); } if(_node.new_node) draw_sprite_ui_uniform(THEME.node_new_badge, 0, _boxx + grid_size - ui(12), yy + ui(6)); - + + var fav = array_exists(global.FAV_NODES, _node.node); + if(fav) + draw_sprite_ui_uniform(THEME.star, 0, _boxx + grid_size - ui(10), yy + grid_size - ui(10), 0.7, COLORS._main_accent, 1.); + draw_set_text(f_p2, fa_center, fa_top, COLORS._main_text); draw_text_ext_over(_boxx + grid_size / 2, yy + grid_size + 4, _node.name, -1, grid_width); @@ -377,9 +414,14 @@ event_inherited(); draw_sprite_stretched_ext(THEME.node_active, 0, ui(4), yy, list_width - ui(8), list_height, COLORS._main_accent, 1); if(mouse_press(mb_left, sFOCUS)) buildNode(_node); + else if(mouse_press(mb_right, sFOCUS)) + rightClick(_node); } - var spr_x = list_height / 2 + ui(14); + var fav = array_exists(global.FAV_NODES, _node.node); + if(fav) draw_sprite_ui_uniform(THEME.star, 0, ui(20), yy + list_height / 2, 0.7, COLORS._main_accent, 1.); + + var spr_x = list_height / 2 + ui(32); var spr_y = yy + list_height / 2; if(variable_struct_exists(_node, "getSpr")) _node.getSpr(); @@ -388,7 +430,7 @@ event_inherited(); draw_sprite_ext(_node.spr, 0, spr_x, spr_y, ss, ss, 0, c_white, 1); } - var tx = list_height + ui(20); + var tx = list_height + ui(40); if(_node.new_node) { draw_sprite_ui_uniform(THEME.node_new_badge, 0, tx + ui(16), yy + list_height / 2 + ui(1)); @@ -396,14 +438,14 @@ event_inherited(); } draw_set_text(f_p2, fa_left, fa_center, COLORS._main_text); - draw_text_over(tx, yy + list_height / 2, _node.name); + draw_text_add(tx, yy + list_height / 2, _node.name); yy += list_height; hh += list_height; } } - if(ADD_NODE_PAGE == -1) + if(ADD_NODE_PAGE < 1) ds_list_destroy(_list); return hh; @@ -556,6 +598,8 @@ event_inherited(); node_selecting = i; if(mouse_press(mb_left, sFOCUS)) buildNode(_node, _param); + else if(struct_has(_node, "node") && mouse_press(mb_right, sFOCUS)) + rightClick(_node); } if(node_selecting == i) { @@ -573,6 +617,9 @@ event_inherited(); } else draw_sprite_ui_uniform(THEME.info, 0, _boxx + ui(8), yy + ui(8), 0.7, COLORS._main_icon, 0.5); } + var fav = struct_has(_node, "node") && array_exists(global.FAV_NODES, _node.node); + if(fav) + draw_sprite_ui_uniform(THEME.star, 0, _boxx + grid_size - ui(10), yy + grid_size - ui(10), 0.7, COLORS._main_accent, 1.); if(node_focusing == i) search_pane.scroll_y_to = -max(0, hh - search_pane.h); @@ -616,16 +663,20 @@ event_inherited(); var _sox = sprite_get_xoffset(_node.spr); var _soy = sprite_get_yoffset(_node.spr); - var _sx = list_height / 2 + ui(14); + var _sx = list_height / 2 + ui(32); var _sy = yy + list_height / 2; _sx += _sw * _ss / 2 - _sox * _ss; _sy += _sh * _ss / 2 - _soy * _ss; draw_sprite_ext(_node.spr, _si, _sx, _sy, _ss, _ss, 0, c_white, 1); } - + + + var fav = struct_has(_node, "node") && array_exists(global.FAV_NODES, _node.node); + if(fav) draw_sprite_ui_uniform(THEME.star, 0, ui(20), yy + list_height / 2, 0.7, COLORS._main_accent, 1.); + draw_set_text(f_p2, fa_left, fa_center, COLORS._main_text); - draw_text_over(list_height + ui(20), yy + list_height / 2, _node.name); + draw_text_add(list_height + ui(40), yy + list_height / 2, _node.name); if(_hover && point_in_rectangle(_m[0], _m[1], 0, yy, list_width, yy + list_height - 1)) { if(struct_has(_node, "tooltip") && _node.tooltip != "") { @@ -637,6 +688,8 @@ event_inherited(); node_selecting = i; if(mouse_press(mb_left, sFOCUS)) buildNode(_node, _param); + else if(struct_has(_node, "node") && mouse_press(mb_right, sFOCUS)) + rightClick(_node); } if(node_selecting == i) { diff --git a/objects/o_dialog_anim_time_scaler/Create_0.gml b/objects/o_dialog_anim_time_scaler/Create_0.gml index cf19e05fc..2028b596d 100644 --- a/objects/o_dialog_anim_time_scaler/Create_0.gml +++ b/objects/o_dialog_anim_time_scaler/Create_0.gml @@ -24,7 +24,7 @@ event_inherited(); for(var i = 0; i < ds_list_size(n.inputs); i++) { var in = n.inputs[| i]; - if(!in.animator.is_anim) continue; + if(!in.is_anim) continue; for(var j = 0; j < ds_list_size(in.animator.values); j++) { var t = in.animator.values[| j]; t.time = t.ratio * scale_to; diff --git a/objects/o_main/Other_2.gml b/objects/o_main/Other_2.gml index 846edcada..5de7a99aa 100644 --- a/objects/o_main/Other_2.gml +++ b/objects/o_main/Other_2.gml @@ -26,14 +26,14 @@ window_set_showborder(false); __initLocale(); - __init_theme(); + __initTheme(); __initCollection(); __initAssets(); __initPresets(); __initFontFolder(); __initLua(); - __init_node_data(); - __init_nodes(); + __initNodeData(); + __initNodes(); __initSteamUGC(); PREF_LOAD(); diff --git a/options/windows/options_windows.yy b/options/windows/options_windows.yy index 93f1e28df..1b7ab74fc 100644 --- a/options/windows/options_windows.yy +++ b/options/windows/options_windows.yy @@ -14,7 +14,7 @@ "option_windows_description_info": "Pixel Composer", "option_windows_disable_sandbox": true, "option_windows_display_cursor": true, - "option_windows_display_name": "Pixel Composer 1.14.0", + "option_windows_display_name": "Pixel Composer 1.14.0pr2", "option_windows_enable_steam": false, "option_windows_executable_name": "PixelComposer.exe", "option_windows_icon": "icons/icon.ico", @@ -33,6 +33,6 @@ "option_windows_steam_use_alternative_launcher": false, "option_windows_texture_page": "2048x2048", "option_windows_use_splash": false, - "option_windows_version": "1.14.0.0", + "option_windows_version": "1.14.0.2", "option_windows_vsync": false, } \ No newline at end of file diff --git a/scripts/__surface/__surface.gml b/scripts/__surface/__surface.gml new file mode 100644 index 000000000..2b2ba8bbe --- /dev/null +++ b/scripts/__surface/__surface.gml @@ -0,0 +1,43 @@ +function Surface(surface) constructor { + static set = function(surface) { + self.surface = surface; + w = surface_get_width(surface); + h = surface_get_height(surface); + format = surface_get_format(surface); + } + set(surface); + + static get = function() { return surface; } + + static isValid = function() { return is_surface(surface); } + + static resize = function(w, h) { + surface_resize(surface, w, h); + self.w = w; + self.h = h; + return self; + } + + static draw = function(x, y, xs = 1, ys = 1, rot = 0, col = c_white, alpha = 1) { + draw_surface_ext_safe(surface, x, y, xs, ys, rot, col, alpha); + return self; + } + + static drawStretch = function(x, y, w = 1, h = 1, rot = 0, col = c_white, alpha = 1) { + draw_surface_stretched_ext(surface, x, y, w, h, col, alpha); + return self; + } + + static destroy = function() { + if(!isValid()) return; + surface_free(surface); + } +} + +function Surface_get(surface) { + if(is_real(surface)) + return surface; + if(is_struct(surface) && struct_has(surface, "surface")) + return surface.surface; + return noone; +} \ No newline at end of file diff --git a/scripts/__surface/__surface.yy b/scripts/__surface/__surface.yy new file mode 100644 index 000000000..a372e01a7 --- /dev/null +++ b/scripts/__surface/__surface.yy @@ -0,0 +1,11 @@ +{ + "resourceType": "GMScript", + "resourceVersion": "1.0", + "name": "__surface", + "isCompatibility": false, + "isDnD": false, + "parent": { + "name": "surface", + "path": "folders/functions/surface.yy", + }, +} \ No newline at end of file diff --git a/scripts/blurSurface/blurSurface.gml b/scripts/blurSurface/blurSurface.gml index 89a7ea646..932493c38 100644 --- a/scripts/blurSurface/blurSurface.gml +++ b/scripts/blurSurface/blurSurface.gml @@ -33,6 +33,7 @@ function surface_apply_gaussian(surface, size, bg = false, bg_c = c_white, sampl #endregion BLEND_OVERRIDE; + gpu_set_tex_filter(true); surface_set_target(__blur_hori); draw_clear_alpha(bg_c, bg); @@ -60,6 +61,7 @@ function surface_apply_gaussian(surface, size, bg = false, bg_c = c_white, sampl draw_surface_safe(__blur_hori, 0, 0); shader_reset(); surface_reset_target(); + gpu_set_tex_filter(false); BLEND_NORMAL; return __blur_vert; diff --git a/scripts/globals/globals.gml b/scripts/globals/globals.gml index 5267656e9..e76fd279b 100644 --- a/scripts/globals/globals.gml +++ b/scripts/globals/globals.gml @@ -33,7 +33,7 @@ globalvar VERSION, SAVEFILE_VERSION, VERSION_STRING; VERSION = 1140; SAVEFILE_VERSION = 1400; - VERSION_STRING = "1.14.0"; + VERSION_STRING = "1.14.0pr1"; globalvar NODES, NODE_MAP, APPEND_MAP, HOTKEYS, HOTKEY_CONTEXT, NODE_INSTANCES; diff --git a/scripts/nodeValue_drawer/nodeValue_drawer.gml b/scripts/nodeValue_drawer/nodeValue_drawer.gml index bfacfa145..7b444925a 100644 --- a/scripts/nodeValue_drawer/nodeValue_drawer.gml +++ b/scripts/nodeValue_drawer/nodeValue_drawer.gml @@ -16,11 +16,11 @@ function drawWidget(xx, yy, ww, _m, jun, global_var = true, _hover, _focus, _scr var butx = xx; if(jun.connect_type == JUNCTION_CONNECT.input && jun.isAnimable() && !jun.global_use && !global_var) { - var index = jun.value_from == noone? jun.animator.is_anim : 2; + var index = jun.value_from == noone? jun.is_anim : 2; draw_sprite_ui_uniform(THEME.animate_clock, index, butx, lb_y, 1,, 0.8); if(_hover && point_in_circle(_m[0], _m[1], butx, lb_y, ui(10))) { if(anim_hold != noone) - jun.animator.is_anim = anim_hold; + jun.setAnim(anim_hold); draw_sprite_ui_uniform(THEME.animate_clock, index, butx, lb_y, 1,, 1); TOOLTIP = jun.value_from == noone? get_text("panel_inspector_toggle_anim", "Toggle animation") : get_text("panel_inspector_remove_link", "Remove link"); @@ -29,9 +29,9 @@ function drawWidget(xx, yy, ww, _m, jun, global_var = true, _hover, _focus, _scr if(jun.value_from != noone) jun.removeFrom(); else { - recordAction(ACTION_TYPE.var_modify, jun.animator, [ jun.animator.is_anim, "is_anim", jun.name + " animation" ]); - jun.animator.is_anim = !jun.animator.is_anim; - anim_hold = jun.animator.is_anim; + recordAction(ACTION_TYPE.var_modify, jun.animator, [ jun.is_anim, "is_anim", jun.name + " animation" ]); + jun.setAnim(!jun.is_anim); + anim_hold = jun.is_anim; } PANEL_ANIMATION.updatePropertyList(); } @@ -92,7 +92,7 @@ function drawWidget(xx, yy, ww, _m, jun, global_var = true, _hover, _focus, _scr #endregion #region anim - if(jun.connect_type == JUNCTION_CONNECT.input && lineBreak && jun.animator.is_anim && !global_var) { + if(jun.connect_type == JUNCTION_CONNECT.input && lineBreak && jun.is_anim && !global_var) { var bx = xx + ww - ui(12); var by = lb_y; if(buttonInstant(THEME.button_hide, bx - ui(12), by - ui(12), ui(24), ui(24), _m, _focus, _hover, "", THEME.prop_keyframe, 2) == 2) { @@ -160,7 +160,7 @@ function drawWidget(xx, yy, ww, _m, jun, global_var = true, _hover, _focus, _scr #endregion #region use global - if(jun.connect_type == JUNCTION_CONNECT.input && lineBreak && !jun.animator.is_anim && !global_var) { + if(jun.connect_type == JUNCTION_CONNECT.input && lineBreak && !jun.is_anim && !global_var) { var bx = xx + ww - ui(12); var by = lb_y; var ic_b = jun.global_use? c_white : COLORS._main_icon; diff --git a/scripts/node_9slice/node_9slice.gml b/scripts/node_9slice/node_9slice.gml index ff87791c3..541f66991 100644 --- a/scripts/node_9slice/node_9slice.gml +++ b/scripts/node_9slice/node_9slice.gml @@ -16,6 +16,7 @@ function Node_9Slice(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) co outputs[| 0] = nodeValue("Surface out", self, JUNCTION_CONNECT.output, VALUE_TYPE.surface, noone); attribute_surface_depth(); + attribute_interpolation(); drag_side = -1; drag_mx = 0; @@ -118,10 +119,8 @@ function Node_9Slice(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) co if(!surface_exists(_inSurf)) return; _outSurf = surface_verify(_outSurf, _dim[0], _dim[1], attrDepth()); - surface_set_target(_outSurf); - DRAW_CLEAR - BLEND_OVERRIDE; - + surface_set_shader(_outSurf); + shader_set_interpolation(_inSurf); var ww = _dim[0]; var hh = _dim[1]; var in_w = surface_get_width(_inSurf); @@ -179,9 +178,7 @@ function Node_9Slice(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) co _x += cw; } } - - BLEND_NORMAL; - surface_reset_target(); + surface_reset_shader(); return _outSurf; } diff --git a/scripts/node_ase_file_read/node_ase_file_read.gml b/scripts/node_ase_file_read/node_ase_file_read.gml index 3fe3b4960..4e356569f 100644 --- a/scripts/node_ase_file_read/node_ase_file_read.gml +++ b/scripts/node_ase_file_read/node_ase_file_read.gml @@ -99,7 +99,7 @@ function Node_ASE_File_Read(_x, _y, _group = noone) : Node(_x, _y, _group) const draw_sprite_stretched_ext(THEME.ui_panel_bg, 1, _x, by, _w, _h, COLORS.node_composite_bg_blend, 1); - var index = inputs[| 2].value_from == noone? inputs[| 2].animator.is_anim : 2; + var index = inputs[| 2].value_from == noone? inputs[| 2].is_anim : 2; draw_sprite_ui_uniform(THEME.animate_clock, index, abx, lb_y, 1,, 0.8); if(_hover && point_in_circle(_m[0], _m[1], abx, lb_y, ui(10))) { draw_sprite_ui_uniform(THEME.animate_clock, index, abx, lb_y, 1,, 1); @@ -109,7 +109,7 @@ function Node_ASE_File_Read(_x, _y, _group = noone) : Node(_x, _y, _group) const if(inputs[| 2].value_from != noone) inputs[| 2].removeFrom(); else - inputs[| 2].animator.is_anim = !inputs[| 2].animator.is_anim; + inputs[| 2].setAnim(!inputs[| 2].is_anim); PANEL_ANIMATION.updatePropertyList(); } } diff --git a/scripts/node_bevel/node_bevel.gml b/scripts/node_bevel/node_bevel.gml index 7663442e5..425395c2d 100644 --- a/scripts/node_bevel/node_bevel.gml +++ b/scripts/node_bevel/node_bevel.gml @@ -35,25 +35,22 @@ function Node_Bevel(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) con outputs[| 0] = nodeValue("Surface out", self, JUNCTION_CONNECT.output, VALUE_TYPE.surface, noone); input_display_list = [ 7, - ["Surface", true], 0, 8, 5, 6, + ["Surface", true], 0, 5, 6, ["Bevel", false], 4, 1, ["Transform", false], 2, 3, ]; attribute_surface_depth(); + attribute_oversample(); static process_data = function(_outSurf, _data, _output_index, _array_index) { var _hei = _data[1]; var _shf = _data[2]; var _sca = _data[3]; var _slp = _data[4]; - var _sam = _data[8]; + var _sam = ds_map_try_get(attributes, "oversample"); - surface_set_target(_outSurf); - DRAW_CLEAR - BLEND_OVERRIDE; - - shader_set(shader); + surface_set_shader(_outSurf, shader); shader_set_uniform_f(uniform_hei, _hei); shader_set_uniform_f_array_safe(uniform_shf, _shf); shader_set_uniform_f_array_safe(uniform_sca, _sca); @@ -62,10 +59,7 @@ function Node_Bevel(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) con shader_set_uniform_i(uniform_sam, _sam); draw_surface_safe(_data[0], 0, 0); - shader_reset(); - - BLEND_NORMAL; - surface_reset_target(); + surface_reset_shader(); _outSurf = mask_apply(_data[0], _outSurf, _data[5], _data[6]); diff --git a/scripts/node_blur/node_blur.gml b/scripts/node_blur/node_blur.gml index e260a7778..5ac14d847 100644 --- a/scripts/node_blur/node_blur.gml +++ b/scripts/node_blur/node_blur.gml @@ -23,16 +23,17 @@ function Node_Blur(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) cons outputs[| 0] = nodeValue("Surface out", self, JUNCTION_CONNECT.output, VALUE_TYPE.surface, noone); input_display_list = [ 7, - ["Surface", true], 0, 2, 5, 6, + ["Surface", true], 0, 5, 6, ["Blur", false], 1, 3, 4, ]; attribute_surface_depth(); + attribute_oversample(); surface_blur_init(); static process_data = function(_outSurf, _data, _output_index, _array_index) { var _size = _data[1]; - var _clamp = _data[2]; + var _clamp = ds_map_try_get(attributes, "oversample"); var _isovr = _data[3]; var _mask = _data[5]; var _mix = _data[6]; diff --git a/scripts/node_blur_radial/node_blur_radial.gml b/scripts/node_blur_radial/node_blur_radial.gml index fc8b08426..63b867a03 100644 --- a/scripts/node_blur_radial/node_blur_radial.gml +++ b/scripts/node_blur_radial/node_blur_radial.gml @@ -30,11 +30,12 @@ function Node_Blur_Radial(_x, _y, _group = noone) : Node_Processor(_x, _y, _grou outputs[| 0] = nodeValue("Surface out", self, JUNCTION_CONNECT.output, VALUE_TYPE.surface, noone); input_display_list = [ 6, - ["Surface", true], 0, 3, 4, 5, + ["Surface", true], 0, 4, 5, ["Blur", false], 1, 2, ]; attribute_surface_depth(); + attribute_oversample(); static drawOverlay = function(active, _x, _y, _s, _mx, _my, _snx, _sny) { var pos = inputs[| 2].getValue(); @@ -48,7 +49,7 @@ function Node_Blur_Radial(_x, _y, _group = noone) : Node_Processor(_x, _y, _grou static process_data = function(_outSurf, _data, _output_index, _array_index) { var _str = _data[1]; var _cen = _data[2]; - var _sam = _data[3]; + var _sam = ds_map_try_get(attributes, "oversample"); var _mask = _data[4]; var _mix = _data[5]; _cen[0] /= surface_get_width(_outSurf); diff --git a/scripts/node_blur_simple/node_blur_simple.gml b/scripts/node_blur_simple/node_blur_simple.gml index 41b48dc6f..0d9caba9c 100644 --- a/scripts/node_blur_simple/node_blur_simple.gml +++ b/scripts/node_blur_simple/node_blur_simple.gml @@ -33,18 +33,19 @@ function Node_Blur_Simple(_x, _y, _group = noone) : Node_Processor(_x, _y, _grou active_index = 8; input_display_list = [ 8, - ["Surface", true], 0, 2, 6, 7, + ["Surface", true], 0, 6, 7, ["Blur", false], 1, 3, 4, 5, ]; outputs[| 0] = nodeValue("Surface out", self, JUNCTION_CONNECT.output, VALUE_TYPE.surface, noone); attribute_surface_depth(); + attribute_oversample(); static process_data = function(_outSurf, _data, _output_index, _array_index) { if(!is_surface(_data[0])) return _outSurf; var _size = _data[1]; - var _samp = _data[2]; + var _samp = ds_map_try_get(attributes, "oversample"); var _mask = _data[3]; var _isovr = _data[4]; var _overc = _data[5]; diff --git a/scripts/node_blur_zoom/node_blur_zoom.gml b/scripts/node_blur_zoom/node_blur_zoom.gml index 49a3acd27..79e5b5ac9 100644 --- a/scripts/node_blur_zoom/node_blur_zoom.gml +++ b/scripts/node_blur_zoom/node_blur_zoom.gml @@ -37,11 +37,12 @@ function Node_Blur_Zoom(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) outputs[| 0] = nodeValue("Surface out", self, JUNCTION_CONNECT.output, VALUE_TYPE.surface, noone); input_display_list = [ 8, - ["Surface", true], 0, 3, 6, 7, + ["Surface", true], 0, 6, 7, ["Blur", false], 1, 2, 4, 5 ]; attribute_surface_depth(); + attribute_oversample(); static drawOverlay = function(active, _x, _y, _s, _mx, _my, _snx, _sny) { var pos = inputs[| 2].getValue(); @@ -55,7 +56,7 @@ function Node_Blur_Zoom(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) static process_data = function(_outSurf, _data, _output_index, _array_index) { var _str = _data[1]; var _cen = _data[2]; - var _sam = _data[3]; + var _sam = ds_map_try_get(attributes, "oversample"); var _blr = _data[4]; var _msk = _data[5]; var _mask = _data[6]; diff --git a/scripts/node_camera/node_camera.gml b/scripts/node_camera/node_camera.gml index f80129a70..6944f7902 100644 --- a/scripts/node_camera/node_camera.gml +++ b/scripts/node_camera/node_camera.gml @@ -28,12 +28,13 @@ function Node_Camera(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) co outputs[| 0] = nodeValue("Surface out", self, JUNCTION_CONNECT.output, VALUE_TYPE.surface, noone); input_display_list = [ - ["Surface", true], 0, 3, 4, + ["Surface", true], 0, 4, ["Camera", false], 1, 2, ["Elements", true], ]; attribute_surface_depth(); + attribute_oversample(); input_display_len = array_length(input_display_list); input_fix_len = ds_list_size(inputs); @@ -119,7 +120,7 @@ function Node_Camera(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) co if(!is_surface(_data[0])) return; var _area = _data[1]; var _zoom = _data[2]; - var _samp = _data[3]; + var _samp = ds_map_try_get(attributes, "oversample"); var _fix = _data[4]; var cDep = attrDepth(); diff --git a/scripts/node_chromatic_aberration/node_chromatic_aberration.gml b/scripts/node_chromatic_aberration/node_chromatic_aberration.gml index 8b409e946..5e4407326 100644 --- a/scripts/node_chromatic_aberration/node_chromatic_aberration.gml +++ b/scripts/node_chromatic_aberration/node_chromatic_aberration.gml @@ -21,6 +21,7 @@ function Node_Chromatic_Aberration(_x, _y, _group = noone) : Node_Processor(_x, outputs[| 0] = nodeValue("Surface out", self, JUNCTION_CONNECT.output, VALUE_TYPE.surface, noone); attribute_surface_depth(); + attribute_interpolation(); static drawOverlay = function(active, _x, _y, _s, _mx, _my, _snx, _sny) { var pos = inputs[| 1].getValue(); @@ -31,22 +32,16 @@ function Node_Chromatic_Aberration(_x, _y, _group = noone) : Node_Processor(_x, } static process_data = function(_outSurf, _data, _output_index, _array_index) { - surface_set_target(_outSurf); - DRAW_CLEAR - BLEND_OVERRIDE; - var center = _data[1]; var stren = _data[2]; - shader_set(shader); + surface_set_shader(_outSurf, shader); + shader_set_interpolation(_data[0]); shader_set_uniform_f_array_safe(uniform_dim, [ surface_get_width(_data[0]), surface_get_height(_data[0]) ]); shader_set_uniform_f_array_safe(uniform_cen, center); shader_set_uniform_f(uniform_str, stren); draw_surface_safe(_data[0], 0, 0); - shader_reset(); - - BLEND_NORMAL; - surface_reset_target(); + surface_reset_shader(); return _outSurf; } diff --git a/scripts/node_composite/node_composite.gml b/scripts/node_composite/node_composite.gml index 0c3fa6ee7..a9c6521f8 100644 --- a/scripts/node_composite/node_composite.gml +++ b/scripts/node_composite/node_composite.gml @@ -31,6 +31,7 @@ function Node_Composite(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) .setVisible(false); attribute_surface_depth(); + attribute_interpolation(); input_fix_len = ds_list_size(inputs); data_length = 4; @@ -748,9 +749,8 @@ function Node_Composite(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) var imageAmo = (ds_list_size(inputs) - input_fix_len) / data_length; var _vis = attributes[? "layer_visible"]; - surface_set_target(_outSurf); - DRAW_CLEAR - BLEND_ALPHA_MULP; + surface_set_shader(_outSurf, sh_sample, true, BLEND.alphamulp); + for(var i = 0; i < imageAmo; i++) { var vis = _vis[| i]; if(!vis) continue; @@ -773,10 +773,10 @@ function Node_Composite(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) var _d0 = point_rotate(cx - _sw / 2, cy - _sh / 2, cx, cy, _rot); + shader_set_interpolation(_s); draw_surface_ext_safe(_s, _d0[0], _d0[1], _sca[0], _sca[1], _rot); } - BLEND_NORMAL; - surface_reset_target(); + surface_reset_shader(); return _outSurf; } diff --git a/scripts/node_convolution/node_convolution.gml b/scripts/node_convolution/node_convolution.gml index b071d35f9..6c6296dea 100644 --- a/scripts/node_convolution/node_convolution.gml +++ b/scripts/node_convolution/node_convolution.gml @@ -25,15 +25,16 @@ function Node_Convolution(_x, _y, _group = noone) : Node_Processor(_x, _y, _grou outputs[| 0] = nodeValue("Surface out", self, JUNCTION_CONNECT.output, VALUE_TYPE.surface, noone); input_display_list = [ 5, - ["Surface", true], 0, 2, 3, 4, + ["Surface", true], 0, 3, 4, ["Kernel", false], 1, ]; attribute_surface_depth(); + attribute_oversample(); static process_data = function(_outSurf, _data, _output_index, _array_index) { var _ker = _data[1]; - var _sam = _data[2]; + var _sam = ds_map_try_get(attributes, "oversample"); surface_set_target(_outSurf); DRAW_CLEAR diff --git a/scripts/node_dilate/node_dilate.gml b/scripts/node_dilate/node_dilate.gml index 8dcd1f905..b444a0cc1 100644 --- a/scripts/node_dilate/node_dilate.gml +++ b/scripts/node_dilate/node_dilate.gml @@ -33,11 +33,13 @@ function Node_Dilate(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) co outputs[| 0] = nodeValue("Surface out", self, JUNCTION_CONNECT.output, VALUE_TYPE.surface, noone); input_display_list = [ 7, - ["Surface", true], 0, 4, 5, 6, + ["Surface", true], 0, 5, 6, ["Dilate", false], 1, 2, 3, ]; attribute_surface_depth(); + attribute_oversample(); + attribute_interpolation(); static drawOverlay = function(active, _x, _y, _s, _mx, _my, _snx, _sny) { var pos = inputs[| 1].getValue(); @@ -49,26 +51,21 @@ function Node_Dilate(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) co } static process_data = function(_outSurf, _data, _output_index, _array_index) { - surface_set_target(_outSurf); - DRAW_CLEAR - BLEND_OVERRIDE; var center = _data[1]; var stren = _data[2]; var rad = _data[3]; - var sam = _data[4]; + var sam = ds_map_try_get(attributes, "oversample"); - shader_set(shader); + surface_set_shader(_outSurf, shader); + shader_set_interpolation(_data[0]); shader_set_uniform_f_array_safe(uniform_dim, [ surface_get_width(_data[0]), surface_get_height(_data[0]) ]); shader_set_uniform_f_array_safe(uniform_cen, center); shader_set_uniform_f(uniform_str, stren); shader_set_uniform_f(uniform_rad, rad); shader_set_uniform_i(uniform_sam, sam); draw_surface_safe(_data[0], 0, 0); - shader_reset(); - - BLEND_NORMAL; - surface_reset_target(); + surface_reset_shader(); _outSurf = mask_apply(_data[0], _outSurf, _data[5], _data[6]); diff --git a/scripts/node_displacement/node_displacement.gml b/scripts/node_displacement/node_displacement.gml index aa6c47f56..7dc9e4312 100644 --- a/scripts/node_displacement/node_displacement.gml +++ b/scripts/node_displacement/node_displacement.gml @@ -46,7 +46,7 @@ If set, then strength value control how many times the effect applies on itself. active_index = 10; input_display_list = [ 10, - ["Surface", true], 0, 7, 8, 9, + ["Surface", true], 0, 8, 9, ["Displace", false], 1, 3, 4, ["Color", false], 5, 2, ["Algorithm", true], 6 @@ -55,6 +55,8 @@ If set, then strength value control how many times the effect applies on itself. outputs[| 0] = nodeValue("Surface out", self, JUNCTION_CONNECT.output, VALUE_TYPE.surface, noone); attribute_surface_depth(); + attribute_oversample(); + attribute_interpolation(); static process_data = function(_outSurf, _data, _output_index, _array_index) { switch(_data[5]) { @@ -71,11 +73,8 @@ If set, then strength value control how many times the effect applies on itself. var mw = surface_get_width(_data[1]); var mh = surface_get_height(_data[1]); - surface_set_target(_outSurf); - DRAW_CLEAR - BLEND_OVERRIDE; - - shader_set(shader); + surface_set_shader(_outSurf, shader); + shader_set_interpolation(_data[0]); texture_set_stage(displace_map_sample, surface_get_texture(_data[1])); shader_set_uniform_f_array_safe(uniform_dim, [ww, hh]); shader_set_uniform_f_array_safe(uniform_map_dim, [mw, mh]); @@ -84,12 +83,9 @@ If set, then strength value control how many times the effect applies on itself. shader_set_uniform_f(uniform_mid, _data[4]); shader_set_uniform_i(uniform_rg, _data[5]); shader_set_uniform_i(uniform_it, _data[6]); - shader_set_uniform_i(uniform_sam, _data[7]); + shader_set_uniform_i(uniform_sam, ds_map_try_get(attributes, "oversample")); draw_surface_safe(_data[0], 0, 0); - shader_reset(); - - BLEND_NORMAL; - surface_reset_target(); + surface_reset_shader(); _outSurf = mask_apply(_data[0], _outSurf, _data[8], _data[9]); diff --git a/scripts/node_edge_detect/node_edge_detect.gml b/scripts/node_edge_detect/node_edge_detect.gml index 7b7b71793..9888ac522 100644 --- a/scripts/node_edge_detect/node_edge_detect.gml +++ b/scripts/node_edge_detect/node_edge_detect.gml @@ -25,15 +25,16 @@ function Node_Edge_Detect(_x, _y, _group = noone) : Node_Processor(_x, _y, _grou outputs[| 0] = nodeValue("Surface out", self, JUNCTION_CONNECT.output, VALUE_TYPE.surface, noone); input_display_list = [ 5, - ["Surface", true], 0, 2, 3, 4, + ["Surface", true], 0, 3, 4, ["Edge detect", false], 1, ]; attribute_surface_depth(); + attribute_oversample(); static process_data = function(_outSurf, _data, _output_index, _array_index) { var ft = _data[1]; - var ov = _data[2]; + var ov = ds_map_try_get(attributes, "oversample"); surface_set_target(_outSurf); DRAW_CLEAR diff --git a/scripts/node_guide/node_guide.gml b/scripts/node_guide/node_guide.gml index af961d17b..5e070933b 100644 --- a/scripts/node_guide/node_guide.gml +++ b/scripts/node_guide/node_guide.gml @@ -49,10 +49,10 @@ function __generate_node_data() { game_end(); } -function __init_node_data() { +function __initNodeData() { global.NODE_GUIDE = {}; - var dir = DIRECTORY + "Nodes/"; + var dir = DIRECTORY + "Nodes/Guides"; if(!directory_exists(dir)) directory_create(dir); diff --git a/scripts/node_keyframe/node_keyframe.gml b/scripts/node_keyframe/node_keyframe.gml index f66663027..0c0fcb8c7 100644 --- a/scripts/node_keyframe/node_keyframe.gml +++ b/scripts/node_keyframe/node_keyframe.gml @@ -60,14 +60,15 @@ function valueKey(_time, _value, _anim = noone, _in = 0, _ot = 0) constructor { } } -function valueAnimator(_val, _prop) constructor { - values = ds_list_create(); - show_graph = false; +function valueAnimator(_val, _prop, _sep_axis = false) constructor { + suffix = ""; + values = ds_list_create(); + sep_axis = _sep_axis; ds_list_add(values, new valueKey(0, _val, self)); + //print(_prop.name + ": " + string(_val)); - is_anim = false; + index = 0; prop = _prop; - dopesheet_y = 0; static interpolate = function(from, to, rat) { @@ -122,19 +123,24 @@ function valueAnimator(_val, _prop) constructor { return processType(lerp(from.value, to.value, _lrp)); } + static getName = function() { return prop.name + suffix; } + static getValue = function(_time = ANIMATOR.current_frame) { if(ds_list_size(values) == 0) return processTypeDefault(); - if(ds_list_size(values) == 1) return processType(values[| 0].value); + if(ds_list_size(values) == 1) { + //if(prop.name == "Position") print(values[| 0].value); + return processType(values[| 0].value); + } if(prop.display_type == VALUE_DISPLAY.gradient) return values[| 0].value; if(prop.type == VALUE_TYPE.path) return processType(values[| 0].value); - if(!is_anim) return processType(values[| 0].value); + if(!prop.is_anim) return processType(values[| 0].value); var _time_first = values[| 0].time; var _time_last = values[| ds_list_size(values) - 1].time; var _time_dura = _time_last - _time_first; - if(_time > _time_last) { + if(_time > _time_last) { //loop switch(prop.on_end) { case KEYFRAME_END.loop : _time = _time_first + safe_mod(_time - _time_last, _time_dura + 1); @@ -193,12 +199,12 @@ function valueAnimator(_val, _prop) constructor { } static processTypeDefault = function() { - if(typeArray(prop.display_type)) return []; + if(!sep_axis && typeArray(prop.display_type)) return []; return 0; } static processType = function(_val) { - if(typeArray(prop.display_type) && is_array(_val)) { + if(!sep_axis && typeArray(prop.display_type) && is_array(_val)) { for(var i = 0; i < array_length(_val); i++) _val[i] = processValue(_val[i]); return _val; @@ -254,7 +260,7 @@ function valueAnimator(_val, _prop) constructor { } static setValue = function(_val = 0, _record = true, _time = ANIMATOR.current_frame, ease_in = 0, ease_out = 0) { - if(!is_anim) { + if(!prop.is_anim) { if(isEqual(values[| 0].value, _val)) return false; @@ -297,7 +303,7 @@ function valueAnimator(_val, _prop) constructor { if(ds_list_size(values) > 1) ds_list_remove(values, key); else - is_anim = false; + prop.is_anim = false; } static serialize = function(scale = false) { @@ -316,7 +322,7 @@ function valueAnimator(_val, _prop) constructor { _value_list[| 1] = json_stringify(val); else if(is_struct(val)) _value_list[| 1] = val.serialize(); - else if(typeArray(prop.display_type) && is_array(val)) { + else if(!sep_axis && typeArray(prop.display_type) && is_array(val)) { var __v = ds_list_create(); for(var j = 0; j < array_length(val); j++) { if(is_struct(val[j]) && struct_has(val[j], "serialize")) @@ -375,12 +381,8 @@ function valueAnimator(_val, _prop) constructor { _time = round(_time * (ANIMATOR.frames_total - 1)); var value = ds_list_get(_keyframe, 1); - var ease_in = ds_list_get(_keyframe, 2); - var ease_out = ds_list_get(_keyframe, 3); - if(LOADING_VERSION >= 1090) { - ease_in = array_create_from_list(ease_in); - ease_out = array_create_from_list(ease_out); - } + var ease_in = array_create_from_list(ds_list_get(_keyframe, 2)); + var ease_out = array_create_from_list(ds_list_get(_keyframe, 3)); var ease_in_type = ds_list_get(_keyframe, 4, CURVE_TYPE.bezier); var ease_out_type = ds_list_get(_keyframe, 5, CURVE_TYPE.bezier); @@ -394,7 +396,7 @@ function valueAnimator(_val, _prop) constructor { } else if(prop.type == VALUE_TYPE.color && prop.display_type == VALUE_DISPLAY.gradient) { var grad = new gradientObject(); _val = grad.deserialize(value); - } else if(typeArray(prop.display_type)) { + } else if(!sep_axis && typeArray(prop.display_type)) { _val = []; if(ds_exists(value, ds_type_list)) { diff --git a/scripts/node_local_analyze/node_local_analyze.gml b/scripts/node_local_analyze/node_local_analyze.gml index f569dbec8..56a836b3b 100644 --- a/scripts/node_local_analyze/node_local_analyze.gml +++ b/scripts/node_local_analyze/node_local_analyze.gml @@ -33,16 +33,17 @@ function Node_Local_Analyze(_x, _y, _group = noone) : Node_Processor(_x, _y, _gr outputs[| 0] = nodeValue("Surface out", self, JUNCTION_CONNECT.output, VALUE_TYPE.surface, noone); input_display_list = [ 7, - ["Surface", true], 0, 3, 5, 6, + ["Surface", true], 0, 5, 6, ["Effect", false], 1, 2, 4, ]; attribute_surface_depth(); + attribute_oversample(); static process_data = function(_outSurf, _data, _output_index, _array_index) { var _alg = _data[1]; var _siz = _data[2]; - var _sam = _data[3]; + var _sam = ds_map_try_get(attributes, "oversample"); var _shp = _data[4]; surface_set_target(_outSurf); diff --git a/scripts/node_noise_grid_hex/node_noise_grid_hex.gml b/scripts/node_noise_grid_hex/node_noise_grid_hex.gml index 012c15cb1..186550335 100644 --- a/scripts/node_noise_grid_hex/node_noise_grid_hex.gml +++ b/scripts/node_noise_grid_hex/node_noise_grid_hex.gml @@ -30,12 +30,13 @@ function Node_Noise_Hex(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) input_display_list = [ ["Output", false], 0, ["Noise", false], 1, 2, 3, - ["Texture", false], 4, 5 + ["Texture", false], 4 ]; outputs[| 0] = nodeValue("Surface out", self, JUNCTION_CONNECT.output, VALUE_TYPE.surface, noone); attribute_surface_depth(); + attribute_oversample(); static drawOverlay = function(active, _x, _y, _s, _mx, _my, _snx, _sny) { inputs[| 2].drawOverlay(active, _x, _y, _s, _mx, _my, _snx, _sny); @@ -47,7 +48,7 @@ function Node_Noise_Hex(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) var _pos = _data[2]; var _sca = _data[3]; var _sam = _data[4]; - var _samTyp = _data[5]; + var _samTyp = ds_map_try_get(attributes, "oversample"); _outSurf = surface_verify(_outSurf, _dim[0], _dim[1], attrDepth()); diff --git a/scripts/node_noise_grid_tri/node_noise_grid_tri.gml b/scripts/node_noise_grid_tri/node_noise_grid_tri.gml index f0145a4d9..89c3faae0 100644 --- a/scripts/node_noise_grid_tri/node_noise_grid_tri.gml +++ b/scripts/node_noise_grid_tri/node_noise_grid_tri.gml @@ -30,12 +30,13 @@ function Node_Noise_Tri(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) input_display_list = [ ["Output", false], 0, ["Noise", false], 1, 2, 3, - ["Texture", false], 4, 5, + ["Texture", false], 4, ]; outputs[| 0] = nodeValue("Surface out", self, JUNCTION_CONNECT.output, VALUE_TYPE.surface, noone); attribute_surface_depth(); + attribute_oversample(); static drawOverlay = function(active, _x, _y, _s, _mx, _my, _snx, _sny) { inputs[| 2].drawOverlay(active, _x, _y, _s, _mx, _my, _snx, _sny); @@ -47,7 +48,7 @@ function Node_Noise_Tri(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) var _pos = _data[2]; var _sca = _data[3]; var _sam = _data[4]; - var _samTyp = _data[5]; + var _samTyp = ds_map_try_get(attributes, "oversample"); _outSurf = surface_verify(_outSurf, _dim[0], _dim[1], attrDepth()); diff --git a/scripts/node_normal/node_normal.gml b/scripts/node_normal/node_normal.gml index a3a95e1e1..6c732ddc5 100644 --- a/scripts/node_normal/node_normal.gml +++ b/scripts/node_normal/node_normal.gml @@ -27,20 +27,13 @@ function Node_Normal(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) co var _hei = _data[1]; var _smt = _data[2]; - surface_set_target(_outSurf); - DRAW_CLEAR - BLEND_OVERRIDE; - - shader_set(sh_normal); - shader_set_uniform_f(uniform_hei, _hei); - shader_set_uniform_i(uniform_smt, _smt); - shader_set_uniform_f_array_safe(uniform_dim, [ surface_get_width(_data[0]), surface_get_height(_data[0]) ]); + surface_set_shader(_outSurf, sh_normal); + shader_set_uniform_f(uniform_hei, _hei); + shader_set_uniform_i(uniform_smt, _smt); + shader_set_uniform_f_array_safe(uniform_dim, [ surface_get_width(_data[0]), surface_get_height(_data[0]) ]); - draw_surface_safe(_data[0], 0, 0); - shader_reset(); - - BLEND_NORMAL; - surface_reset_target(); + draw_surface_safe(_data[0], 0, 0); + surface_reset_shader(); return _outSurf; } diff --git a/scripts/node_normal_light/node_normal_light.gml b/scripts/node_normal_light/node_normal_light.gml index bfbf438f8..452657a35 100644 --- a/scripts/node_normal_light/node_normal_light.gml +++ b/scripts/node_normal_light/node_normal_light.gml @@ -1,15 +1,16 @@ function Node_Normal_Light(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) constructor { name = "Normal Light"; - uniform_map = shader_get_sampler_index(sh_normal_light, "normalMap"); - uniform_hei = shader_get_uniform(sh_normal_light, "normalHeight"); - uniform_dim = shader_get_uniform(sh_normal_light, "dimension"); + shader = sh_normal_light; + uniform_map = shader_get_sampler_index(shader, "normalMap"); + uniform_hei = shader_get_uniform(shader, "normalHeight"); + uniform_dim = shader_get_uniform(shader, "dimension"); - uniform_amb = shader_get_uniform(sh_normal_light, "ambiance"); - uniform_light_pos = shader_get_uniform(sh_normal_light, "lightPosition"); - uniform_light_col = shader_get_uniform(sh_normal_light, "lightColor"); - uniform_light_int = shader_get_uniform(sh_normal_light, "lightIntensity"); - uniform_light_typ = shader_get_uniform(sh_normal_light, "lightType"); + uniform_amb = shader_get_uniform(shader, "ambiance"); + uniform_light_pos = shader_get_uniform(shader, "lightPosition"); + uniform_light_col = shader_get_uniform(shader, "lightColor"); + uniform_light_int = shader_get_uniform(shader, "lightIntensity"); + uniform_light_typ = shader_get_uniform(shader, "lightType"); inputs[| 0] = nodeValue("Surface in", self, JUNCTION_CONNECT.input, VALUE_TYPE.surface, 0); @@ -64,26 +65,20 @@ function Node_Normal_Light(_x, _y, _group = noone) : Node_Processor(_x, _y, _gro var _light_col = _data[7]; var _light_typ = _data[8]; - surface_set_target(_outSurf); - DRAW_CLEAR - BLEND_OVERRIDE; + surface_set_shader(_outSurf, shader); - shader_set(sh_normal_light); - texture_set_stage(uniform_map, surface_get_texture(_map)); - shader_set_uniform_f(uniform_hei, _hei); - shader_set_uniform_f_array_safe(uniform_dim, [ surface_get_width(_data[0]), surface_get_height(_data[0]) ]); - shader_set_uniform_f_array_safe(uniform_amb, [color_get_red(_amb) / 255, color_get_green(_amb) / 255, color_get_blue(_amb) / 255]); + texture_set_stage(uniform_map, surface_get_texture(_map)); + shader_set_uniform_f(uniform_hei, _hei); + shader_set_uniform_f_array_safe(uniform_dim, [ surface_get_width(_data[0]), surface_get_height(_data[0]) ]); + shader_set_uniform_f_array_safe(uniform_amb, [color_get_red(_amb) / 255, color_get_green(_amb) / 255, color_get_blue(_amb) / 255]); - shader_set_uniform_f_array_safe(uniform_light_pos, [ _light_pos[0], _light_pos[1], _light_pos[2] / 100, _light_ran ] ); - shader_set_uniform_f_array_safe(uniform_light_col, [color_get_red(_light_col) / 255, color_get_green(_light_col) / 255, color_get_blue(_light_col) / 255]); - shader_set_uniform_f(uniform_light_int, _light_int); - shader_set_uniform_i(uniform_light_typ, _light_typ); + shader_set_uniform_f_array_safe(uniform_light_pos, [ _light_pos[0], _light_pos[1], _light_pos[2] / 100, _light_ran ] ); + shader_set_uniform_f_array_safe(uniform_light_col, [color_get_red(_light_col) / 255, color_get_green(_light_col) / 255, color_get_blue(_light_col) / 255]); + shader_set_uniform_f(uniform_light_int, _light_int); + shader_set_uniform_i(uniform_light_typ, _light_typ); - draw_surface_safe(_data[0], 0, 0); - shader_reset(); - - BLEND_NORMAL; - surface_reset_target(); + draw_surface_safe(_data[0], 0, 0); + surface_reset_shader(); return _outSurf; } diff --git a/scripts/node_outline/node_outline.gml b/scripts/node_outline/node_outline.gml index e499bbfeb..86c28e197 100644 --- a/scripts/node_outline/node_outline.gml +++ b/scripts/node_outline/node_outline.gml @@ -49,11 +49,12 @@ function Node_Outline(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) c input_display_list = [ 11, ["Surface", true], 0, 9, 10, - ["Outline", false], 1, 5, 7, 8, + ["Outline", false], 1, 5, 8, ["Render", false], 2, 3, 4, 6, ]; attribute_surface_depth(); + attribute_oversample(); static process_data = function(_outSurf, _data, _output_index, _array_index) { var ww = surface_get_width(_data[0]); @@ -65,7 +66,7 @@ function Node_Outline(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) c var alpha = _data[4]; var side = _data[5]; var aa = _data[6]; - var sam = _data[7]; + var sam = ds_map_try_get(attributes, "oversample"); var bst = _data[8]; surface_set_target(_outSurf); diff --git a/scripts/node_polar/node_polar.gml b/scripts/node_polar/node_polar.gml index 70ab49712..487760d28 100644 --- a/scripts/node_polar/node_polar.gml +++ b/scripts/node_polar/node_polar.gml @@ -18,18 +18,13 @@ function Node_Polar(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) con ] attribute_surface_depth(); + attribute_interpolation(); static process_data = function(_outSurf, _data, _output_index, _array_index) { - surface_set_target(_outSurf); - DRAW_CLEAR - BLEND_OVERRIDE; - - shader_set(sh_polar); - draw_surface_safe(_data[0], 0, 0); - shader_reset(); - - BLEND_NORMAL; - surface_reset_target(); + surface_set_shader(_outSurf, sh_polar); + shader_set_interpolation(_data[0]); + draw_surface_safe(_data[0], 0, 0); + surface_reset_shader(); _outSurf = mask_apply(_data[0], _outSurf, _data[1], _data[2]); diff --git a/scripts/node_processor/node_processor.gml b/scripts/node_processor/node_processor.gml index a2d23d353..5c848b142 100644 --- a/scripts/node_processor/node_processor.gml +++ b/scripts/node_processor/node_processor.gml @@ -21,7 +21,7 @@ function Node_Processor(_x, _y, _group = noone) : Node(_x, _y, _group) construct array_push(attributeEditors, "Array processor"); array_push(attributeEditors, [ "Array process type", "array_process", - new scrollBox([ "Loop", "Hold", "Expand", "Expand inverse" ], function(val) { attributes[? "array_process"] = val; } ) ]); + new scrollBox([ "Loop", "Hold", "Expand", "Expand inverse" ], function(val) { attributes[? "array_process"] = val; }, false) ]); static process_data = function(_outSurf, _data, _output_index, _array_index = 0) { return _outSurf; } @@ -97,7 +97,8 @@ function Node_Processor(_x, _y, _group = noone) : Node(_x, _y, _group) construct return inputs_data[0] } - return process_data(_out, inputs_data, outIndex, 0); + var data = process_data(_out, inputs_data, outIndex, 0); /// Process data + return data; } if(outputs[| outIndex].type == VALUE_TYPE.d3object) { //passing 3D vertex call @@ -160,8 +161,9 @@ function Node_Processor(_x, _y, _group = noone) : Node(_x, _y, _group) construct _out[l] = surface_clone(_data[0], _out[l]); else _out[l] = _data[0]; - } else - _out[l] = process_data(_out[l], _data, outIndex, l); + } else { + _out[l] = process_data(_out[l], _data, outIndex, l); /// Process data + } } return _out; diff --git a/scripts/node_registry/node_registry.gml b/scripts/node_registry/node_registry.gml index 5f1a8e6ee..e18ae0890 100644 --- a/scripts/node_registry/node_registry.gml +++ b/scripts/node_registry/node_registry.gml @@ -74,7 +74,12 @@ function NodeObject(_name, _spr, _node, _create, tags = []) constructor { ds_list_add(NODE_CATEGORY, { name: name, list: list, filter: filter }); } - function __init_nodes() { + function __initNodes() { + var path = DIRECTORY + "Nodes/fav.json"; + global.FAV_NODES = []; + if(file_exists(path)) + global.FAV_NODES = json_load_struct(path); + var group = ds_list_create(); addNodeCatagory("Group", group, ["Node_Group"]); ds_list_add(group, "Groups"); @@ -185,10 +190,14 @@ function NodeObject(_name, _spr, _node, _create, tags = []) constructor { addNodeObject(strandSim, "Strand Break", s_node_strandSim_break, "Node_Strand_Break", [1, Node_Strand_Break]).setVersion(1140); addNodeObject(strandSim, "Strand Length Adjust", s_node_strandSim_length, "Node_Strand_Length_Adjust", [1, Node_Strand_Length_Adjust]).setVersion(1140); addNodeObject(strandSim, "Strand Collision", s_node_strandSim_collide, "Node_Strand_Collision", [1, Node_Strand_Collision]).setVersion(1140); - - var input = ds_list_create(); + NODE_PAGE_DEFAULT = ds_list_size(NODE_CATEGORY); ADD_NODE_PAGE = NODE_PAGE_DEFAULT; + + var fav = ds_list_create(); + addNodeCatagory("Favourites", fav); + + var input = ds_list_create(); addNodeCatagory("IO", input); ds_list_add(input, "Images"); addNodeObject(input, "Canvas", s_node_canvas, "Node_Canvas", [1, Node_Canvas], ["draw"], "Draw on surface using brush, eraser, etc.") @@ -471,20 +480,20 @@ function NodeObject(_name, _spr, _node, _create, tags = []) constructor { addNodeObject(color, "Color Data", s_node_color_data, "Node_Color_Data", [1, Node_Color_Data],, "Get data (rgb, hsv, brightness) from color."); addNodeObject(color, "Find pixel", s_node_pixel_find, "Node_Find_Pixel", [1, Node_Find_Pixel],, "Get the position of the first pixel with a given color.").setVersion(1130); addNodeObject(color, "Mix Color", s_node_color_mix, "Node_Color_Mix", [1, Node_Color_Mix]).setVersion(1140); - + ds_list_add(color, "Palettes"); addNodeObject(color, "Palette", s_node_palette, "Node_Palette", [1, Node_Palette]); addNodeObject(color, "Sort Palette", s_node_palette_sort, "Node_Palette_Sort", [1, Node_Palette_Sort]).setVersion(1130); addNodeObject(color, "Palette Extract", s_node_palette_extract, "Node_Palette_Extract", [1, Node_Palette_Extract],, "Extract palette from an image.").setVersion(1100); addNodeObject(color, "Palette Replace", s_node_palette_replace, "Node_Palette_Replace", [1, Node_Palette_Replace]).setVersion(1120); - + ds_list_add(color, "Gradient"); addNodeObject(color, "Gradient", s_node_gradient_out, "Node_Gradient_Out", [1, Node_Gradient_Out]); addNodeObject(color, "Gradient Palette", s_node_gradient_palette, "Node_Gradient_Palette", [1, Node_Gradient_Palette],, "Create gradient from palette.").setVersion(1135); addNodeObject(color, "Gradient Shift", s_node_gradient_shift, "Node_Gradient_Shift", [1, Node_Gradient_Shift],, "Move gradients keys."); addNodeObject(color, "Gradient Replace", s_node_gradient_replace, "Node_Gradient_Replace_Color", [1, Node_Gradient_Replace_Color]).setVersion(1135); addNodeObject(color, "Gradient Data", s_node_gradient_data, "Node_Gradient_Extract", [1, Node_Gradient_Extract],, "Get palatte and array of key positions from gradient.").setVersion(1135); - + var animation = ds_list_create(); addNodeCatagory("Animation", animation); ds_list_add(animation, "Animations"); @@ -497,7 +506,7 @@ function NodeObject(_name, _spr, _node, _create, tags = []) constructor { ds_list_add(node, "Logic"); addNodeObject(node, "Condition", s_node_condition, "Node_Condition", [1, Node_Condition],, "Given a condition, output one value if true, another value is false."); addNodeObject(node, "Switch", s_node_switch, "Node_Switch", [1, Node_Switch],, "Given an index, output value base on index matching.").setVersion(1090); - + ds_list_add(node, "Groups"); addNodeObject(node, "Group", s_node_group, "Node_Group", [1, Node_Group]); addNodeObject(node, "Feedback", s_node_feedback, "Node_Feedback", [1, Node_Feedback],, "Create group that reuse output from last frame to the current one."); @@ -528,6 +537,7 @@ function NodeObject(_name, _spr, _node, _create, tags = []) constructor { addNodeObject(hid, "Grid Noise", s_node_grid_noise, "Node_Grid_Noise", [1, Node_Grid_Noise]); addNodeObject(hid, "Triangular Noise", s_node_grid_tri_noise, "Node_Noise_Tri", [1, Node_Noise_Tri]).setVersion(1090); addNodeObject(hid, "Hexagonal Noise", s_node_grid_hex_noise, "Node_Noise_Hex", [1, Node_Noise_Hex]).setVersion(1090); + } #endregion @@ -580,7 +590,9 @@ function NodeObject(_name, _spr, _node, _create, tags = []) constructor { PANEL_GRAPH.node_focus = node; PANEL_GRAPH.fullView(); } - +#endregion + +#region attribute global.SURFACE_FORMAT = [ surface_rgba4unorm, surface_rgba8unorm, @@ -601,18 +613,53 @@ function NodeObject(_name, _spr, _node, _create, tags = []) constructor { "32 bit Greyscale" ]; + global.SURFACE_INTERPOLATION = [ + "No aliasing", + "Linear", + "Bicubic", + "radSin" + ]; + + global.SURFACE_OVERSAMPLE = [ + "Empty", + "Clamp", + "Repeat" + ]; + global.SURFACE_FORMAT_NAME_PROCESS = [ "Input" ]; global.SURFACE_FORMAT_NAME_PROCESS = array_append(global.SURFACE_FORMAT_NAME_PROCESS, global.SURFACE_FORMAT_NAME); - function attribute_surface_depth() { + function attribute_surface_depth(label = true) { attributes[? "color_depth"] = inputs[| 0].type == VALUE_TYPE.surface? 0 : 1; depth_array = inputs[| 0].type == VALUE_TYPE.surface? global.SURFACE_FORMAT_NAME_PROCESS : global.SURFACE_FORMAT_NAME; - array_push(attributeEditors, "Surface"); + if(label) array_push(attributeEditors, "Surface"); array_push(attributeEditors, ["Color depth", "color_depth", new scrollBox(depth_array, function(val) { attributes[? "color_depth"] = val; triggerRender(); }, false)]); } + + function attribute_interpolation(label = false) { + attributes[? "interpolation"] = 0; + + if(label) array_push(attributeEditors, "Surface"); + array_push(attributeEditors, ["Texture interpolation", "interpolation", + new scrollBox(global.SURFACE_INTERPOLATION, function(val) { + attributes[? "interpolation"] = val; + triggerRender(); + }, false)]); + } + + function attribute_oversample(label = false) { + attributes[? "oversample"] = 0; + + if(label) array_push(attributeEditors, "Surface"); + array_push(attributeEditors, ["Oversample", "oversample", + new scrollBox(global.SURFACE_OVERSAMPLE, function(val) { + attributes[? "oversample"] = val; + triggerRender(); + }, false)]); + } #endregion \ No newline at end of file diff --git a/scripts/node_scale/node_scale.gml b/scripts/node_scale/node_scale.gml index 965425904..bf959875e 100644 --- a/scripts/node_scale/node_scale.gml +++ b/scripts/node_scale/node_scale.gml @@ -24,6 +24,7 @@ function Node_Scale(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) con ]; attribute_surface_depth(); + attribute_interpolation(); static process_data = function(_outSurf, _data, _output_index, _array_index) { var scale = _data[1]; @@ -48,12 +49,10 @@ function Node_Scale(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) con _outSurf = surface_verify(_outSurf, ww, hh, cDep); - surface_set_target(_outSurf); - DRAW_CLEAR - BLEND_OVERRIDE; - draw_surface_stretched_safe(_data[0], 0, 0, ww, hh); - BLEND_NORMAL; - surface_reset_target(); + surface_set_shader(_outSurf); + shader_set_interpolation(_data[0]); + draw_surface_stretched_safe(_data[0], 0, 0, ww, hh); + surface_reset_shader(); return _outSurf; } diff --git a/scripts/node_skew/node_skew.gml b/scripts/node_skew/node_skew.gml index d69737cb9..4289baa56 100644 --- a/scripts/node_skew/node_skew.gml +++ b/scripts/node_skew/node_skew.gml @@ -34,14 +34,16 @@ function Node_Skew(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) cons active_index = 8; input_display_list = [ 8, - ["Surface", true], 0, 5, 6, 7, + ["Surface", true], 0, 6, 7, ["Skew", false], 1, 2, 4, ] outputs[| 0] = nodeValue("Surface out", self, JUNCTION_CONNECT.output, VALUE_TYPE.surface, noone); attribute_surface_depth(); - + attribute_oversample(); + attribute_interpolation(); + static centerAnchor = function() { if(!is_surface(current_data[0])) return; var ww = surface_get_width(current_data[0]); @@ -59,23 +61,17 @@ function Node_Skew(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) cons var _amou = _data[2]; //var _wrap = _data[3]; var _cent = _data[4]; - var _samp = _data[5]; + var _samp = ds_map_try_get(attributes, "oversample"); - surface_set_target(_outSurf); - DRAW_CLEAR - BLEND_OVERRIDE; - - shader_set(shader); + surface_set_shader(_outSurf, shader); + shader_set_interpolation(_data[0]); shader_set_uniform_f(uniform_dim, surface_get_width(_data[0]), surface_get_height(_data[0])); shader_set_uniform_f(uniform_cen, _cent[0], _cent[1]); shader_set_uniform_i(uniform_axs, _axis); shader_set_uniform_f(uniform_amo, _amou); shader_set_uniform_i(uniform_sam, _samp); draw_surface_safe(_data[0], 0, 0); - shader_reset(); - - BLEND_NORMAL; - surface_reset_target(); + surface_reset_shader(); _outSurf = mask_apply(_data[0], _outSurf, _data[6], _data[7]); diff --git a/scripts/node_struct/node_struct.gml b/scripts/node_struct/node_struct.gml index f00a5a6bb..891d07b34 100644 --- a/scripts/node_struct/node_struct.gml +++ b/scripts/node_struct/node_struct.gml @@ -47,11 +47,11 @@ function Node_Struct(_x, _y, _group = noone) : Node(_x, _y, _group) constructor static onValueUpdate = function(index = 0) { if(LOADING || APPENDING) return; - if(safe_mod(index - input_fix_len, data_length) == 0) { //Variable name - inputs[| index + 1].name = inputs[| index].getValue() + " value"; - } - refreshDynamicInput(); + + if(index < 0) return; + if(safe_mod(index - input_fix_len, data_length) == 0) + inputs[| index + 1].name = inputs[| index].getValue() + " value"; } function step() { @@ -69,7 +69,10 @@ function Node_Struct(_x, _y, _group = noone) : Node(_x, _y, _group) constructor var key = inputs[| i + 0].getValue(); var val = inputs[| i + 1].getValue(); - str[$ key] = val; + if(inputs[| i + 1].type == VALUE_TYPE.surface) + str[$ key] = new Surface(val); + else + str[$ key] = val; } outputs[| 0].setValue(str); diff --git a/scripts/node_struct_get/node_struct_get.gml b/scripts/node_struct_get/node_struct_get.gml index 040992f74..9f548a5a5 100644 --- a/scripts/node_struct_get/node_struct_get.gml +++ b/scripts/node_struct_get/node_struct_get.gml @@ -31,9 +31,13 @@ function Node_Struct_Get(_x, _y, _group = noone) : Node(_x, _y, _group) construc var val = variable_struct_get(_str, k); if(j == array_length(keys) - 1) { - if(is_struct(val)) - out.type = VALUE_TYPE.struct; - else if(is_array(val) && array_length(val)) + if(is_struct(val)) { + if(instanceof(val) == "Surface") { + out.type = VALUE_TYPE.surface; + val = val.get(); + } else + out.type = VALUE_TYPE.struct; + } else if(is_array(val) && array_length(val)) out.type = is_string(val[0])? VALUE_TYPE.text : VALUE_TYPE.float; else out.type = is_string(val)? VALUE_TYPE.text : VALUE_TYPE.float; diff --git a/scripts/node_texture_remap/node_texture_remap.gml b/scripts/node_texture_remap/node_texture_remap.gml index 61bf47b92..22784168a 100644 --- a/scripts/node_texture_remap/node_texture_remap.gml +++ b/scripts/node_texture_remap/node_texture_remap.gml @@ -18,21 +18,16 @@ function Node_Texture_Remap(_x, _y, _group = noone) : Node_Processor(_x, _y, _gr ] attribute_surface_depth(); + attribute_interpolation(); static process_data = function(_outSurf, _data, _output_index, _array_index) { if(!is_surface(_data[1])) return _outSurf; - surface_set_target(_outSurf); - DRAW_CLEAR - BLEND_OVERRIDE; - - shader_set(shader); + surface_set_shader(_outSurf, shader); + shader_set_interpolation(_data[0]); texture_set_stage(uniform_map, surface_get_texture(_data[1])); draw_surface_safe(_data[0], 0, 0); - shader_reset(); - - BLEND_NORMAL; - surface_reset_target(); + surface_reset_shader(); return _outSurf; } diff --git a/scripts/node_transform/node_transform.gml b/scripts/node_transform/node_transform.gml index ade215a65..7ebf3b85e 100644 --- a/scripts/node_transform/node_transform.gml +++ b/scripts/node_transform/node_transform.gml @@ -53,7 +53,8 @@ function Node_Transform(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) outputs[| 0] = nodeValue("Surface out", self, JUNCTION_CONNECT.output, VALUE_TYPE.surface, noone); attribute_surface_depth(); - + attribute_interpolation(); + vel = 0; prev_pos = [0, 0]; @@ -209,33 +210,26 @@ function Node_Transform(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) surface_reset_target(); var _cc = point_rotate(-_px, -_py, _ww / 2, _hh / 2, rot); - surface_set_target(_outSurf); - DRAW_CLEAR - BLEND_OVERRIDE; - - draw_surface_ext_safe(_s, _cc[0], _cc[1], 1, 1, rot, c_white, 1); - - BLEND_NORMAL; - surface_reset_target(); + surface_set_shader(_outSurf); + shader_set_interpolation(_s); + draw_surface_ext_safe(_s, _cc[0], _cc[1], 1, 1, rot, c_white, 1); + surface_reset_shader(); surface_free(_s); } else { - surface_set_target(_outSurf); - DRAW_CLEAR - BLEND_OVERRIDE; + var draw_x, draw_y; + draw_x = pos[0]; + draw_y = pos[1]; - var draw_x, draw_y; - draw_x = pos[0]; - draw_y = pos[1]; - - if(pos_exact) { - draw_x = round(draw_x); - draw_y = round(draw_y); - } - draw_surface_ext_safe(ins, draw_x, draw_y, sca[0], sca[1], rot, c_white, 1); - - BLEND_NORMAL; - surface_reset_target(); + if(pos_exact) { + draw_x = round(draw_x); + draw_y = round(draw_y); + } + + surface_set_shader(_outSurf); + shader_set_interpolation(ins); + draw_surface_ext_safe(ins, draw_x, draw_y, sca[0], sca[1], rot, c_white, 1); + surface_reset_shader(); } return _outSurf; @@ -466,7 +460,7 @@ function Node_Transform(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) } #region path - if(inputs[| 2].animator.is_anim && inputs[| 2].value_from == noone) { + if(inputs[| 2].is_anim && inputs[| 2].value_from == noone && !inputs[| 2].sep_axis) { var posInp = inputs[| 2]; var allPos = posInp.animator.values; var ox, oy, nx, ny; diff --git a/scripts/node_twirl/node_twirl.gml b/scripts/node_twirl/node_twirl.gml index bf711e85e..fb5314241 100644 --- a/scripts/node_twirl/node_twirl.gml +++ b/scripts/node_twirl/node_twirl.gml @@ -33,11 +33,13 @@ function Node_Twirl(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) con outputs[| 0] = nodeValue("Surface out", self, JUNCTION_CONNECT.output, VALUE_TYPE.surface, noone); input_display_list = [ 7, - ["Surface", true], 0, 4, 5, 6, + ["Surface", true], 0, 5, 6, ["Twirl", false], 1, 2, 3, ]; attribute_surface_depth(); + attribute_oversample(); + attribute_interpolation(); static drawOverlay = function(active, _x, _y, _s, _mx, _my, _snx, _sny) { var pos = inputs[| 1].getValue(); @@ -49,26 +51,20 @@ function Node_Twirl(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) con } static process_data = function(_outSurf, _data, _output_index, _array_index) { - surface_set_target(_outSurf); - DRAW_CLEAR - BLEND_OVERRIDE; - var center = _data[1]; - var stren = _data[2]; - var rad = _data[3]; - var sam = _data[4]; + var stren = _data[2]; + var rad = _data[3]; + var sam = ds_map_try_get(attributes, "oversample"); - shader_set(shader); + surface_set_shader(_outSurf, shader); + shader_set_interpolation(_data[0]); shader_set_uniform_f_array_safe(uniform_dim, [ surface_get_width(_data[0]), surface_get_height(_data[0]) ]); shader_set_uniform_f_array_safe(uniform_cen, center); shader_set_uniform_f(uniform_str, stren); shader_set_uniform_f(uniform_rad, rad); shader_set_uniform_i(uniform_sam, sam); draw_surface_safe(_data[0], 0, 0); - shader_reset(); - - BLEND_NORMAL; - surface_reset_target(); + surface_reset_shader(); _outSurf = mask_apply(_data[0], _outSurf, _data[5], _data[6]); diff --git a/scripts/node_value/node_value.gml b/scripts/node_value/node_value.gml index a724fc68a..1500d333b 100644 --- a/scripts/node_value/node_value.gml +++ b/scripts/node_value/node_value.gml @@ -312,6 +312,12 @@ function nodeValueUnit(value) constructor { } } +global.displaySuffix_Range = [ "min", "max" ]; +global.displaySuffix_Area = [ "x", "y", "w", "h" ]; +global.displaySuffix_Padding = [ "right", "top", "left", "bottom" ]; +global.displaySuffix_VecRange = [ "x min", "x max", "y min", "y max" ]; +global.displaySuffix_Axis = [ "x", "y", "z", "w"]; + function NodeValue(_name, _node, _connect, _type, _value, _tooltip = "") constructor { name = _name; node = _node; @@ -332,10 +338,18 @@ function NodeValue(_name, _node, _connect, _type, _value, _tooltip = "") constru auto_connect = true; setFrom_condition = -1; + is_anim = false; + sep_axis = false; + sepable = is_array(_value) && array_length(_value) > 1; + animator = new valueAnimator(_value, self, false); + animators = []; + if(is_array(_value)) + for( var i = 0; i < array_length(_value); i++ ) { + animators[i] = new valueAnimator(_value[i], self, true); + animators[i].index = i; + } + def_val = _value; - animator = new valueAnimator(_value, self); - rawAnimator = animator; - graph_h = ui(64); on_end = KEYFRAME_END.hold; unit = new nodeValueUnit(self); extra_data = ds_list_create(); @@ -346,6 +360,9 @@ function NodeValue(_name, _node, _connect, _type, _value, _tooltip = "") constru draw_line_shift_hover = false; drawLineIndex = 1; + show_graph = false; + graph_h = ui(64); + visible = _connect == JUNCTION_CONNECT.output || _type == VALUE_TYPE.surface || _type == VALUE_TYPE.path; show_in_inspector = true; @@ -461,13 +478,16 @@ function NodeValue(_name, _node, _connect, _type, _value, _tooltip = "") constru case VALUE_DISPLAY.range : editWidget = new rangeBox(_txt, function(index, val) { MODIFIED = true; - var _val = animator.getValue(); - _val[index] = val; - return setValueDirect(_val); + //var _val = animator.getValue(); + //_val[index] = val; + return setValueDirect(val, index); } ); if(type == VALUE_TYPE.integer) editWidget.setSlideSpeed(1); if(display_data != -1) editWidget.extras = display_data; + for( var i = 0; i < array_length(animators); i++ ) + animators[i].suffix = " " + array_safe_get(global.displaySuffix_Range, i); + extract_node = "Node_Number"; break; case VALUE_DISPLAY.vector : @@ -475,9 +495,9 @@ function NodeValue(_name, _node, _connect, _type, _value, _tooltip = "") constru if(array_length(val) <= 4) { editWidget = new vectorBox(array_length(animator.getValue()), _txt, function(index, val) { MODIFIED = true; - var _val = animator.getValue(); - _val[index] = val; - return setValueDirect(_val); + //var _val = animator.getValue(); + //_val[index] = val; + return setValueDirect(val, index); }, unit ); if(type == VALUE_TYPE.integer) editWidget.setSlideSpeed(1); if(display_data != -1) editWidget.extras = display_data; @@ -489,15 +509,19 @@ function NodeValue(_name, _node, _connect, _type, _value, _tooltip = "") constru else if(array_length(val) == 4) extract_node = "Node_Vector4"; } + + for( var i = 0; i < array_length(animators); i++ ) + animators[i].suffix = " " + array_safe_get(global.displaySuffix_Axis, i); + break; case VALUE_DISPLAY.vector_range : var val = animator.getValue(); editWidget = new vectorRangeBox(array_length(val), _txt, function(index, val) { MODIFIED = true; - var _val = animator.getValue(); - _val[index] = val; - return setValueDirect(_val); + //var _val = animator.getValue(); + //_val[index] = val; + return setValueDirect(val, index); }, unit ); if(type == VALUE_TYPE.integer) editWidget.setSlideSpeed(1); if(display_data != -1) editWidget.extras = display_data; @@ -508,11 +532,15 @@ function NodeValue(_name, _node, _connect, _type, _value, _tooltip = "") constru extract_node = "Node_Vector3"; else if(array_length(val) == 4) extract_node = "Node_Vector4"; + + for( var i = 0; i < array_length(animators); i++ ) + animators[i].suffix = " " + array_safe_get(global.displaySuffix_VecRange, i); + break; case VALUE_DISPLAY.rotation : - editWidget = new rotator(function(val, _save) { + editWidget = new rotator(function(val) { MODIFIED = true; - return setValueDirect(val, _save); + return setValueDirect(val); }, display_data ); extract_node = "Node_Number"; @@ -520,11 +548,14 @@ function NodeValue(_name, _node, _connect, _type, _value, _tooltip = "") constru case VALUE_DISPLAY.rotation_range : editWidget = new rotatorRange(function(index, val) { MODIFIED = true; - var _val = animator.getValue(); - _val[index] = round(val); - return setValueDirect(_val); + //var _val = animator.getValue(); + //_val[index] = round(val); + return setValueDirect(val, index); } ); + for( var i = 0; i < array_length(animators); i++ ) + animators[i].suffix = " " + array_safe_get(global.displaySuffix_Range, i); + extract_node = "Node_Vector2"; break; case VALUE_DISPLAY.slider : @@ -539,44 +570,53 @@ function NodeValue(_name, _node, _connect, _type, _value, _tooltip = "") constru case VALUE_DISPLAY.slider_range : editWidget = new sliderRange(display_data[0], display_data[1], display_data[2], function(index, val) { MODIFIED = true; - var _val = animator.getValue(); - _val[index] = val; - return setValueDirect(_val); + //var _val = animator.getValue(); + //_val[index] = val; + return setValueDirect(val, index); } ); if(type == VALUE_TYPE.integer) editWidget.setSlideSpeed(1); + for( var i = 0; i < array_length(animators); i++ ) + animators[i].suffix = " " + array_safe_get(global.displaySuffix_Range, i); + extract_node = "Node_Vector2"; break; case VALUE_DISPLAY.area : editWidget = new areaBox(function(index, val) { MODIFIED = true; - var _val = animator.getValue(); - _val[index] = val; - return setValueDirect(_val); + //var _val = animator.getValue(); + //_val[index] = val; + return setValueDirect(val, index); }, unit); if(type == VALUE_TYPE.integer) editWidget.setSlideSpeed(1); if(display_data != -1) editWidget.onSurfaceSize = display_data; + for( var i = 0; i < array_length(animators); i++ ) + animators[i].suffix = " " + array_safe_get(global.displaySuffix_Area, i); + extract_node = "Node_Area"; break; case VALUE_DISPLAY.padding : editWidget = new paddingBox(function(index, val) { MODIFIED = true; - var _val = animator.getValue(); - _val[index] = val; - return setValueDirect(_val); + //var _val = animator.getValue(); + //_val[index] = val; + return setValueDirect(val, index); }, unit); if(type == VALUE_TYPE.integer) editWidget.setSlideSpeed(1); + for( var i = 0; i < array_length(animators); i++ ) + animators[i].suffix = " " + array_safe_get(global.displaySuffix_Padding, i); + extra_data[| 0] = AREA_MODE.area; extract_node = "Node_Vector4"; break; case VALUE_DISPLAY.puppet_control : editWidget = new controlPointBox(function(index, val) { MODIFIED = true; - var _val = animator.getValue(); - _val[index] = val; - return setValueDirect(_val); + //var _val = animator.getValue(); + //_val[index] = val; + return setValueDirect(val, index); }); extract_node = ""; @@ -613,6 +653,9 @@ function NodeValue(_name, _node, _connect, _type, _value, _tooltip = "") constru if(type == VALUE_TYPE.integer) editWidget.setSlideSpeed(1); if(display_data != -1) editWidget.extras = display_data; + for( var i = 0; i < array_length(animators); i++ ) + animators[i].suffix = " " + string(i); + extract_node = ""; break; } @@ -899,6 +942,16 @@ function NodeValue(_name, _node, _connect, _type, _value, _tooltip = "") constru return val; } + static __getAnimValue = function(_time = ANIMATOR.current_frame) { + if(sep_axis) { + var val = []; + for( var i = 0; i < array_length(animators); i++ ) + val[i] = animators[i].getValue(_time); + return val; + } else + return animator.getValue(_time); + } + static _getValue = function(_time = ANIMATOR.current_frame, applyUnit = true, arrIndex = 0) { var _val = getValueRecursive(_time); var val = _val[0]; @@ -906,7 +959,7 @@ function NodeValue(_name, _node, _connect, _type, _value, _tooltip = "") constru var typ = nod.type; var dis = nod.display_type; - var _base = animator.getValue(_time); + var _base = __getAnimValue(_time); if(typ == VALUE_TYPE.surface && (type == VALUE_TYPE.integer || type == VALUE_TYPE.float) && accept_array) { //Dimension conversion if(is_array(val)) { @@ -956,7 +1009,7 @@ function NodeValue(_name, _node, _connect, _type, _value, _tooltip = "") constru var val = [ -1, self ]; if(value_from == noone) { - var _val = animator.getValue(_time); + var _val = __getAnimValue(_time); if(global_use && GLOBAL.inputGetable(self, global_key)) return GLOBAL.getInput(global_key).getValueRecursive(_time); @@ -968,16 +1021,21 @@ function NodeValue(_name, _node, _connect, _type, _value, _tooltip = "") constru return val; } - static __anim = function() { - return animator.is_anim || node.update_on_frame; + static setAnim = function(anim) { + is_anim = anim; } + + static __anim = function() { + return is_anim || node.update_on_frame; + } + static isAnimated = function() { if(value_from == noone) return __anim(); else return value_from.isAnimated() || value_from.__anim(); } static showValue = function() { - var val = getValue(, false); + var val = getValue(, false); if(isArray()) { if(array_length(val) == 0) return 0; return val[safe_mod(node.preview_index, array_length(val))]; @@ -1037,13 +1095,26 @@ function NodeValue(_name, _node, _connect, _type, _value, _tooltip = "") constru static setValue = function(val = 0, record = true, time = ANIMATOR.current_frame, _update = true) { val = unit.invApply(val); - return setValueDirect(val, record, time, _update); + return setValueDirect(val, noone, record, time, _update); } - static setValueDirect = function(val = 0, record = true, time = ANIMATOR.current_frame, _update = true) { - var _o = animator.getValue(); - var updated = animator.setValue(val, connect_type == JUNCTION_CONNECT.input && record, time); - var _n = animator.getValue(); + static setValueDirect = function(val = 0, index = noone, record = true, time = ANIMATOR.current_frame, _update = true) { + var updated = false; + + if(sep_axis) { + if(index == noone) { + for( var i = 0; i < array_length(animators); i++ ) + updated |= animators[i].setValue(val[i], connect_type == JUNCTION_CONNECT.input && record, time); + } else + updated = animators[index].setValue(val, connect_type == JUNCTION_CONNECT.input && record, time); + } else { + if(index != noone) { + var _val = animator.getValue(time); + _val[index] = val; + updated = animator.setValue(_val, connect_type == JUNCTION_CONNECT.input && record, time); + } else + updated = animator.setValue(val, connect_type == JUNCTION_CONNECT.input && record, time); + } if(display_type == VALUE_DISPLAY.gradient) updated = true; if(display_type == VALUE_DISPLAY.palette) updated = true; @@ -1353,7 +1424,7 @@ function NodeValue(_name, _node, _connect, _type, _value, _tooltip = "") constru var animTo = ext.inputs[| j].animator; var animLs = animTo.values; - animTo.is_anim = animator.is_anim; + ext.setAnim(is_anim); ds_list_clear(animLs); } @@ -1372,7 +1443,7 @@ function NodeValue(_name, _node, _connect, _type, _value, _tooltip = "") constru var animTo = ext.inputs[| 0].animator; var animLs = animTo.values; - animTo.is_anim = animator.is_anim; + ext.setAnim(is_anim); ds_list_clear(animLs); for( var i = 0; i < ds_list_size(animFrom); i++ ) @@ -1387,19 +1458,24 @@ function NodeValue(_name, _node, _connect, _type, _value, _tooltip = "") constru static serialize = function(scale = false, preset = false) { var _map = ds_map_create(); - //print(" = > Serializing: " + name); - ds_map_add_list(_map, "raw value", animator.serialize(scale)); - _map[? "on end"] = on_end; _map[? "visible"] = visible; _map[? "unit"] = unit.mode; - _map[? "anim"] = animator.is_anim; + _map[? "sep_axis"] = sep_axis; _map[? "shift x"] = draw_line_shift_x; _map[? "shift y"] = draw_line_shift_y; _map[? "from node"] = !preset && value_from? value_from.node.node_id : -1; _map[? "from index"] = !preset && value_from? value_from.index : -1; _map[? "global_use"] = global_use; _map[? "global_key"] = global_key; + _map[? "anim"] = is_anim; + + ds_map_add_list(_map, "raw value", animator.serialize(scale)); + + var _anims = ds_list_create(); + for( var i = 0; i < array_length(animators); i++ ) + ds_list_add_list(_anims, animators[i].serialize(scale)); + ds_map_add_list(_map, "animators", _anims); ds_map_add_list(_map, "data", ds_list_clone(extra_data)); @@ -1417,14 +1493,22 @@ function NodeValue(_name, _node, _connect, _type, _value, _tooltip = "") constru on_end = ds_map_try_get(_map, "on end", on_end); visible = ds_map_try_get(_map, "visible", visible); unit.mode = ds_map_try_get(_map, "unit", VALUE_UNIT.constant); + global_use = ds_map_try_get(_map, "global_use"); + global_key = ds_map_try_get(_map, "global_key"); + sep_axis = ds_map_try_get(_map, "sep_axis"); + is_anim = ds_map_try_get(_map, "anim"); + draw_line_shift_x = ds_map_try_get(_map, "shift x"); draw_line_shift_y = ds_map_try_get(_map, "shift y"); - global_use = ds_map_try_get(_map, "global_use"); - global_key = ds_map_try_get(_map, "global_key"); animator.deserialize(_map[? "raw value"], scale); - animator.is_anim = _map[? "anim"]; + if(ds_map_exists(_map, "animators")) { + var anims = _map[? "animators"]; + for( var i = 0; i < ds_list_size(anims); i++ ) + animators[i].deserialize(anims[| i], scale); + } + if(!preset) { con_node = _map[? "from node"]; con_index = _map[? "from index"]; diff --git a/scripts/node_wrap/node_wrap.gml b/scripts/node_wrap/node_wrap.gml index 10b4fc469..41baba39a 100644 --- a/scripts/node_wrap/node_wrap.gml +++ b/scripts/node_wrap/node_wrap.gml @@ -30,6 +30,7 @@ function Node_Warp(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) cons ] attribute_surface_depth(); + attribute_interpolation(); drag_side = -1; drag_mx = 0; @@ -178,9 +179,8 @@ function Node_Warp(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) cons var bl = _data[3]; var br = _data[4]; - surface_set_target(_outSurf); - DRAW_CLEAR - BLEND_OVERRIDE; + surface_set_shader(_outSurf); + shader_set_interpolation(_data[0]); draw_set_color(c_white); var tex = surface_get_texture(_data[0]); @@ -222,9 +222,7 @@ function Node_Warp(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) cons } } draw_primitive_end(); - - BLEND_NORMAL; - surface_reset_target(); + surface_reset_shader(); return _outSurf; } diff --git a/scripts/node_wrap_area/node_wrap_area.gml b/scripts/node_wrap_area/node_wrap_area.gml index a4ae92179..d5f3dcac4 100644 --- a/scripts/node_wrap_area/node_wrap_area.gml +++ b/scripts/node_wrap_area/node_wrap_area.gml @@ -17,6 +17,7 @@ function Node_Wrap_Area(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) ] attribute_surface_depth(); + attribute_interpolation(); static drawOverlay = function(active, _x, _y, _s, _mx, _my, _snx, _sny) { inputs[| 1].drawOverlay(active, _x, _y, _s, _mx, _my, _snx, _sny); @@ -38,14 +39,10 @@ function Node_Wrap_Area(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) var ww = cw / surface_get_width(_inSurf) * 2; var hh = ch / surface_get_height(_inSurf) * 2; - surface_set_target(_outSurf); - DRAW_CLEAR - BLEND_OVERRIDE; - - draw_surface_ext_safe(_inSurf, cx - cw, cy - ch, ww, hh, 0, c_white, 1); - - BLEND_NORMAL; - surface_reset_target(); + surface_set_shader(_outSurf); + shader_set_interpolation(_inSurf); + draw_surface_ext_safe(_inSurf, cx - cw, cy - ch, ww, hh, 0, c_white, 1); + surface_reset_shader(); return _outSurf; } diff --git a/scripts/node_wrap_mesh/node_wrap_mesh.gml b/scripts/node_wrap_mesh/node_wrap_mesh.gml index a5052afdc..7b4b0d476 100644 --- a/scripts/node_wrap_mesh/node_wrap_mesh.gml +++ b/scripts/node_wrap_mesh/node_wrap_mesh.gml @@ -44,6 +44,7 @@ function Node_Mesh_Warp(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) ]; attribute_surface_depth(); + attribute_interpolation(); input_display_index = array_length(input_display_list); @@ -462,11 +463,11 @@ function Node_Mesh_Warp(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) _outSurf = surface_verify(_outSurf, surface_get_width(_inSurf), surface_get_height(_inSurf), attrDepth()); - surface_set_target(_outSurf); - DRAW_CLEAR - for(var i = 0; i < ds_list_size(data.tris); i++) - data.tris[| i].drawSurface(_inSurf); - surface_reset_target(); + surface_set_shader(_outSurf); + shader_set_interpolation(_outSurf); + for(var i = 0; i < ds_list_size(data.tris); i++) + data.tris[| i].drawSurface(_inSurf); + surface_reset_shader(); return _outSurf; } diff --git a/scripts/panel_animation/panel_animation.gml b/scripts/panel_animation/panel_animation.gml index d509b723d..b130d6bd2 100644 --- a/scripts/panel_animation/panel_animation.gml +++ b/scripts/panel_animation/panel_animation.gml @@ -8,6 +8,7 @@ enum KEYFRAME_DRAG_TYPE { function Panel_Animation() : PanelContent() constructor { title = "Animation"; context_str = "Animation"; + icon = THEME.panel_animation; timeline_h = ui(28); min_w = ui(40); @@ -134,10 +135,10 @@ function Panel_Animation() : PanelContent() constructor { addHotkey("", "Previous frame", vk_left, MOD_KEY.none, function() { ANIMATOR.setFrame(max(ANIMATOR.real_frame - 1, 0)); }); - addHotkey("Animation", "Delete keys", vk_delete, MOD_KEY.none, function() { deleteKeys(); }); - addHotkey("Animation", "Duplicate", "D", MOD_KEY.ctrl, function() { doDuplicate(); }); - addHotkey("Animation", "Copy", "C", MOD_KEY.ctrl, function() { doCopy(); }); - addHotkey("Animation", "Paste", "V", MOD_KEY.ctrl, function() { doPaste(value_focusing); }); + addHotkey("Animation", "Delete keys", vk_delete, MOD_KEY.none, function() { PANEL_ANIMATION.deleteKeys(); }); + addHotkey("Animation", "Duplicate", "D", MOD_KEY.ctrl, function() { PANEL_ANIMATION.doDuplicate(); }); + addHotkey("Animation", "Copy", "C", MOD_KEY.ctrl, function() { PANEL_ANIMATION.doCopy(); }); + addHotkey("Animation", "Paste", "V", MOD_KEY.ctrl, function() { PANEL_ANIMATION.doPaste(PANEL_ANIMATION.value_focusing); }); function deleteKeys() { for( var i = 0; i < ds_list_size(keyframe_selecting); i++ ) { @@ -186,13 +187,23 @@ function Panel_Animation() : PanelContent() constructor { for( var j = 0; j < ds_list_size(node.inputs); j++ ) { var prop = node.inputs[| j]; - if(!prop.animator.is_anim) continue; + if(!prop.is_anim) continue; - for(var k = 0; k < ds_list_size(prop.animator.values); k++) { - var keyframe = prop.animator.values[| k]; + if(prop.sep_axis) { + for(var k = 0; k < array_length(prop.animators); k++ ) + for(var m = 0; m < ds_list_size(prop.animators[k].values); m++) { + var keyframe = prop.animators[k].values[| m]; - if(ds_list_exist(keyframe_selecting, keyframe)) - ds_list_add(l, keyframe); + if(ds_list_exist(keyframe_selecting, keyframe)) + ds_list_add(l, keyframe); + } + } else { + for(var k = 0; k < ds_list_size(prop.animator.values); k++) { + var keyframe = prop.animator.values[| k]; + + if(ds_list_exist(keyframe_selecting, keyframe)) + ds_list_add(l, keyframe); + } } } } @@ -375,7 +386,7 @@ function Panel_Animation() : PanelContent() constructor { var is_anim = false; for(var j = 0; j < ds_list_size(_node.inputs); j++) { var jun = _node.inputs[| j]; - is_anim |= jun.animator.is_anim && jun.value_from == noone; + is_anim |= jun.is_anim && jun.value_from == noone; } if(!is_anim) continue; @@ -450,12 +461,22 @@ function Panel_Animation() : PanelContent() constructor { for( var j = 0; j < ds_list_size(node.inputs); j++ ) { var prop = node.inputs[| j]; - - for(var k = 0; k < ds_list_size(prop.animator.values); k++) { - var t = (prop.animator.values[| k].time + 1) * ui(timeline_scale) + timeline_shift; - prop.animator.values[| k].dopesheet_x = t; - var ind = prop.animator.values[| k].ease_in_type == CURVE_TYPE.cut? 4 : 1; - draw_sprite_ui_uniform(THEME.timeline_keyframe, ind, t, key_y, 1, COLORS.panel_animation_keyframe_hide); + + if(prop.sep_axis) { + for(var a = 0; a < array_length(prop.animators); a++) + for(var k = 0; k < ds_list_size(prop.animators[a].values); k++) { + var t = (prop.animators[a].values[| k].time + 1) * ui(timeline_scale) + timeline_shift; + prop.animators[a].values[| k].dopesheet_x = t; + var ind = prop.animators[a].values[| k].ease_in_type == CURVE_TYPE.cut? 4 : 1; + draw_sprite_ui_uniform(THEME.timeline_keyframe, ind, t, key_y, 1, COLORS.panel_animation_keyframe_hide); + } + } else { + for(var k = 0; k < ds_list_size(prop.animator.values); k++) { + var t = (prop.animator.values[| k].time + 1) * ui(timeline_scale) + timeline_shift; + prop.animator.values[| k].dopesheet_x = t; + var ind = prop.animator.values[| k].ease_in_type == CURVE_TYPE.cut? 4 : 1; + draw_sprite_ui_uniform(THEME.timeline_keyframe, ind, t, key_y, 1, COLORS.panel_animation_keyframe_hide); + } } } } @@ -537,12 +558,151 @@ function Panel_Animation() : PanelContent() constructor { draw_surface_safe(timeline_surface, bar_x, bar_y); } - function drawDopesheetGraph(prop, key_y, msx, msy) { + function drawDopesheetLine(animator, key_y, msx, msy, _gy_val_min = 999999, _gy_val_max = -999999) { var bar_total_w = ANIMATOR.frames_total * ui(timeline_scale); var bar_show_w = timeline_shift + bar_total_w; var hovering = noone; - var _gy_val_min = 999999; - var _gy_val_max = -999999; + var _gy_top = key_y + ui(16); + var _gy_bottom = _gy_top + animator.prop.graph_h - ui(8); + + var amo = ds_list_size(animator.values); + + for(var k = 0; k < amo; k++) { + var key_val = animator.values[| k].value; + if(is_array(key_val)) { + for( var ki = 0; ki < array_length(key_val); ki++ ) { + _gy_val_min = min(_gy_val_min, key_val[ki]); + _gy_val_max = max(_gy_val_max, key_val[ki]); + } + } else { + _gy_val_min = min(_gy_val_min, key_val); + _gy_val_max = max(_gy_val_max, key_val); + } + } + + var valArray = is_array(animator.values[| 0].value); + var ox = 0, oy = valArray? [] : noone, nx = 0, ny = noone, oly = 0, nly = 0; + + for(var k = 0; k < amo - 1; k++) { + var key = animator.values[| k]; + var t = key.dopesheet_x; + var key_next = animator.values[| k + 1]; + var dx = key_next.time - key.time; + + if(key.ease_out_type == CURVE_TYPE.none && key_next.ease_in_type == CURVE_TYPE.none) { //linear draw + nx = (key_next.time + 1) * ui(timeline_scale) + timeline_shift; + if(valArray) { + for( var ki = 0; ki < array_length(key.value); ki++ ) { + draw_set_color(COLORS.axis[ki]); + ny[ki] = value_map(key.value[ki], _gy_val_min, _gy_val_max, _gy_bottom, _gy_top); + + if(array_length(oy) > ki) + draw_line(t, oy[ki], t, ny[ki]); + oy[ki] = ny[ki]; + + ny[ki] = value_map(key_next.value[ki], _gy_val_min, _gy_val_max, _gy_bottom, _gy_top); + draw_line(t, oy[ki], nx, ny[ki]); + oy[ki] = ny[ki]; + } + } else { + draw_set_color(animator.prop.sep_axis? COLORS.axis[animator.index] : COLORS.panel_animation_graph_line); + ny = value_map(key.value, _gy_val_min, _gy_val_max, _gy_bottom, _gy_top); + if(oy != noone) draw_line(t, oy, t, ny); + oy = ny; + + ny = value_map(key_next.value, _gy_val_min, _gy_val_max, _gy_bottom, _gy_top); + draw_line(t, oy, nx, ny); + oy = ny; + } + + ox = nx; + } else { //bezier easing + var _step = 1 / dx; + for( var _r = 0; _r <= 1; _r += _step ) { + nx = t + _r * dx * ui(timeline_scale); + nly = animator.interpolate(key, key_next, _r); + + if(valArray) { + for( var ki = 0; ki < array_length(key.value); ki++ ) { + draw_set_color(COLORS.axis[ki]); + ny[ki] = value_map(lerp(key.value[ki], key_next.value[ki], nly), _gy_val_min, _gy_val_max, _gy_bottom, _gy_top); + + if(array_length(oy) > ki) + draw_line(ox, oy[ki], nx, ny[ki]); + + oy[ki] = ny[ki]; + } + } else { + draw_set_color(animator.prop.sep_axis? COLORS.axis[animator.index] : COLORS.panel_animation_graph_line); + ny = value_map(lerp(key.value, key_next.value, nly), _gy_val_min, _gy_val_max, _gy_bottom, _gy_top); + if(oy != noone) + draw_line(ox, oy, nx, ny); + oy = ny; + } + + ox = nx; + oly = nly; + } + } + } + + if(animator.prop.show_graph && ds_list_size(animator.values) > 0) { + if(ds_list_size(animator.values) == 1) { //draw graph before and after + var key_first = animator.values[| 0]; + + if(valArray) { + for( var ki = 0; ki < array_length(key_first.value); ki++ ) { + draw_set_color(COLORS.axis[ki]); + sy = value_map(key_first.value[ki], _gy_val_min, _gy_val_max, _gy_bottom, _gy_top); + draw_line(0, sy, bar_show_w, sy); + } + } else { + draw_set_color(animator.prop.sep_axis? COLORS.axis[animator.index] : COLORS.panel_animation_graph_line); + sy = value_map(key_first.value, _gy_val_min, _gy_val_max, _gy_bottom, _gy_top); + draw_line(0, sy, bar_show_w, sy); + } + } else { //draw graph before and after + var key_first = animator.values[| 0]; + var t_first = (key_first.time + 1) * ui(timeline_scale) + timeline_shift; + var sy; + + if(valArray) { + for( var ki = 0; ki < array_length(key_first.value); ki++ ) { + draw_set_color(COLORS.axis[ki]); + sy = value_map(key_first.value[ki], _gy_val_min, _gy_val_max, _gy_bottom, _gy_top); + draw_line(0, sy, t_first, sy); + } + } else { + draw_set_color(animator.prop.sep_axis? COLORS.axis[animator.index] : COLORS.panel_animation_graph_line); + sy = value_map(key_first.value, _gy_val_min, _gy_val_max, _gy_bottom, _gy_top); + draw_line(0, sy, t_first, sy); + } + + var key_last = animator.values[| ds_list_size(animator.values) - 1]; + var t_last = (key_last.time + 1) * ui(timeline_scale) + timeline_shift; + + if(key_last.time < ANIMATOR.frames_total) { + if(valArray) { + for( var ki = 0; ki < array_length(key_last.value); ki++ ) { + draw_set_color(COLORS.axis[ki]); + ny[ki] = value_map(key_last.value[ki], _gy_val_min, _gy_val_max, _gy_bottom, _gy_top); + draw_line(t_last, oy[ki], t_last, ny[ki]); + draw_line(t_last, oy[ki], bar_show_w, oy[ki]); + } + } else { + draw_set_color(animator.prop.sep_axis? COLORS.axis[animator.index] : COLORS.panel_animation_graph_line); + ny = value_map(key_last.value, _gy_val_min, _gy_val_max, _gy_bottom, _gy_top); + draw_line(t_last, oy, t_last, ny); + draw_line(t_last, ny, bar_show_w, ny); + } + } + } + } + } + + function drawDopesheetGraph(prop, key_y, msx, msy) { + var bar_total_w = ANIMATOR.frames_total * ui(timeline_scale); + var bar_show_w = timeline_shift + bar_total_w; var _gy_top = key_y + ui(16); var _gy_bottom = _gy_top + prop.graph_h - ui(8); @@ -582,139 +742,142 @@ function Panel_Animation() : PanelContent() constructor { return; } - var amo = ds_list_size(prop.animator.values); - - for(var k = 0; k < amo; k++) { - var key_val = prop.animator.values[| k].value; - if(is_array(key_val)) { - for( var ki = 0; ki < array_length(key_val); ki++ ) { - _gy_val_min = min(_gy_val_min, key_val[ki]); - _gy_val_max = max(_gy_val_max, key_val[ki]); - } - } else { - _gy_val_min = min(_gy_val_min, key_val); - _gy_val_max = max(_gy_val_max, key_val); - } - } - - var valArray = is_array(prop.animator.values[| 0].value); - var ox = 0, oy = valArray? [] : noone, nx = 0, ny = noone, oly = 0, nly = 0; - - for(var k = 0; k < amo - 1; k++) { - var key = prop.animator.values[| k]; - var t = key.dopesheet_x; - var key_next = prop.animator.values[| k + 1]; - var dx = key_next.time - key.time; + if(prop.sep_axis) { + var _min = 999999; + var _max = -999999; - if(key.ease_out_type == CURVE_TYPE.none && key_next.ease_in_type == CURVE_TYPE.none) { //linear draw - nx = (key_next.time + 1) * ui(timeline_scale) + timeline_shift; - if(valArray) { - for( var ki = 0; ki < array_length(key.value); ki++ ) { - draw_set_color(COLORS.axis[ki]); - ny[ki] = value_map(key.value[ki], _gy_val_min, _gy_val_max, _gy_bottom, _gy_top); - - if(array_length(oy) > ki) - draw_line(t, oy[ki], t, ny[ki]); - oy[ki] = ny[ki]; - - ny[ki] = value_map(key_next.value[ki], _gy_val_min, _gy_val_max, _gy_bottom, _gy_top); - draw_line(t, oy[ki], nx, ny[ki]); - oy[ki] = ny[ki]; - } - } else { - draw_set_color(COLORS.panel_animation_graph_line); - ny = value_map(key.value, _gy_val_min, _gy_val_max, _gy_bottom, _gy_top); - if(oy != noone) draw_line(t, oy, t, ny); - oy = ny; - - ny = value_map(key_next.value, _gy_val_min, _gy_val_max, _gy_bottom, _gy_top); - draw_line(t, oy, nx, ny); - oy = ny; - } - - ox = nx; - } else { //bezier easing - var _step = 1 / dx; - for( var _r = 0; _r <= 1; _r += _step ) { - nx = t + _r * dx * ui(timeline_scale); - nly = prop.animator.interpolate(key, key_next, _r); - - if(valArray) { - for( var ki = 0; ki < array_length(key.value); ki++ ) { - draw_set_color(COLORS.axis[ki]); - ny[ki] = value_map(lerp(key.value[ki], key_next.value[ki], nly), _gy_val_min, _gy_val_max, _gy_bottom, _gy_top); - - if(array_length(oy) > ki) - draw_line(ox, oy[ki], nx, ny[ki]); - - oy[ki] = ny[ki]; + for( var i = 0; i < array_length(prop.animators); i++ ) { + var animator = prop.animators[i]; + for(var k = 0; k < ds_list_size(animator.values); k++) { + var key_val = animator.values[| k].value; + if(is_array(key_val)) { + for( var ki = 0; ki < array_length(key_val); ki++ ) { + _min = min(_min, key_val[ki]); + _max = max(_max, key_val[ki]); } } else { - draw_set_color(COLORS.panel_animation_graph_line); - ny = value_map(lerp(key.value, key_next.value, nly), _gy_val_min, _gy_val_max, _gy_bottom, _gy_top); - if(oy != noone) - draw_line(ox, oy, nx, ny); - oy = ny; + _min = min(_min, key_val); + _max = max(_max, key_val); } - - ox = nx; - oly = nly; } } + + for( var i = 0; i < array_length(prop.animators); i++ ) + drawDopesheetLine(prop.animators[i], key_y, msx, msy, _min, _max); + } else + drawDopesheetLine(prop.animator, key_y, msx, msy); + } + + function drawDopesheetAnimator(_node, animator, msx, msy) { + var aa = _node.group == PANEL_GRAPH.getCurrentContext()? 1 : 0.9; + var tx = tool_width - ui(72 + 16 * 3); + var ty = animator.dopesheet_y - 1; + + #region keyframe control + if(pHOVER && point_in_circle(msx, msy, tx, ty, ui(6))) { + draw_sprite_ui_uniform(THEME.prop_keyframe, 0, tx, ty, 1, COLORS._main_icon, 1); + + if(mouse_press(mb_left, pFOCUS)) { + var _t = -1; + for(var k = 0; k < ds_list_size(animator.values); k++) { + var _key = animator.values[| k]; + if(_key.time < ANIMATOR.current_frame) + _t = _key.time; + } + if(_t > -1) ANIMATOR.setFrame(_t); + } + } else + draw_sprite_ui_uniform(THEME.prop_keyframe, 0, tx, ty, 1, COLORS._main_icon, 0.75); + + var tx = tool_width - ui(72 + 16 * 1); + if(pHOVER && point_in_circle(msx, msy, tx, ty, ui(6))) { + draw_sprite_ui_uniform(THEME.prop_keyframe, 2, tx, ty, 1, COLORS._main_icon, 1); + + if(mouse_press(mb_left, pFOCUS)) { + for(var k = 0; k < ds_list_size(animator.values); k++) { + var _key = animator.values[| k]; + if(_key.time > ANIMATOR.current_frame) { + ANIMATOR.setFrame(_key.time); + break; + } + } + } + } else + draw_sprite_ui_uniform(THEME.prop_keyframe, 2, tx, ty, 1, COLORS._main_icon, 0.75); + #endregion + + #region add keyframe + var tx = tool_width - ui(72 + 16 * 2); + if(pHOVER && point_in_circle(msx, msy, tx, ty, ui(6))) { + draw_sprite_ui_uniform(THEME.prop_keyframe, 1, tx, ty, 1, COLORS._main_accent, 1); + + if(mouse_press(mb_left, pFOCUS)) { + var _add = false; + for(var k = 0; k < ds_list_size(animator.values); k++) { + var _key = animator.values[| k]; + if(_key.time == ANIMATOR.current_frame) { + if(ds_list_size(animator.values) > 1) + ds_list_delete(animator.values, k); + _add = true; + break; + } else if(_key.time > ANIMATOR.current_frame) { + ds_list_insert(animator.values, k, new valueKey(ANIMATOR.current_frame, animator.getValue(), animator)); + _add = true; + break; + } + } + if(!_add) ds_list_add(animator.values, new valueKey(ANIMATOR.current_frame, animator.getValue(, false), animator)); + } + } else + draw_sprite_ui_uniform(THEME.prop_keyframe, 1, tx, ty, 1, COLORS._main_accent, 0.75); + #endregion + + if(isGraphable(animator.prop)) { + var tx = tool_width - ui(68 + 16 * 0); + if(pHOVER && point_in_circle(msx, msy, tx, ty, ui(8))) { + draw_sprite_ui_uniform(THEME.timeline_graph, 1, tx, ty, 1, COLORS._main_icon, animator.prop.show_graph? 1 : 0.75); + TOOLTIP = get_text("panel_animation_show_graph", "Show graph"); + + if(mouse_press(mb_left, pFOCUS)) + animator.prop.show_graph = !animator.prop.show_graph; + } else + draw_sprite_ui_uniform(THEME.timeline_graph, 1, tx, ty, 1, animator.prop.show_graph? COLORS._main_accent : COLORS._main_icon); + } + + var tx = tool_width - ui(72 + 16 * 4.5); + if(pHOVER && point_in_circle(msx, msy, tx, ty, ui(6))) { + draw_sprite_ui_uniform(THEME.prop_on_end, animator.prop.on_end, tx, ty, 1, COLORS._main_icon, 1); + TOOLTIP = get_text("panel_animation_looping_mode", "Looping mode") + ": " + ON_END_NAME[animator.prop.on_end]; + + if(mouse_press(mb_left, pFOCUS)) + animator.prop.on_end = safe_mod(animator.prop.on_end + 1, sprite_get_number(THEME.prop_on_end)); + } else + draw_sprite_ui_uniform(THEME.prop_on_end, animator.prop.on_end, tx, ty, 1, COLORS._main_icon, 0.75); + + if(pHOVER && point_in_circle(msx, msy, ui(22), ty - 1, ui(10))) { + draw_sprite_ui_uniform(THEME.timeline_clock, 1, ui(22), ty - 1, 1, COLORS._main_icon, 1); + + if(mouse_press(mb_left, pFOCUS)) { + animator.prop.setAnim(!animator.prop.is_anim); + updatePropertyList(); + } + } else + draw_sprite_ui_uniform(THEME.timeline_clock, 1, ui(22), ty - 1, 1, COLORS._main_icon, 0.75); + + var hov = pHOVER && point_in_rectangle(msx, msy, 0, ty - ui(8), w, ty + ui(8)); + if(hov) { + value_hovering = animator.prop; + if(mouse_click(mb_left, pFOCUS)) + value_focusing = animator.prop; } - if(prop.animator.show_graph && ds_list_size(prop.animator.values) > 0) { - if(ds_list_size(prop.animator.values) == 1) { //draw graph before and after - var key_first = prop.animator.values[| 0]; - - if(valArray) { - for( var ki = 0; ki < array_length(key_first.value); ki++ ) { - draw_set_color(COLORS.axis[ki]); - sy = value_map(key_first.value[ki], _gy_val_min, _gy_val_max, _gy_bottom, _gy_top); - draw_line(0, sy, bar_show_w, sy); - } - } else { - draw_set_color(COLORS.panel_animation_graph_line); - sy = value_map(key_first.value, _gy_val_min, _gy_val_max, _gy_bottom, _gy_top); - draw_line(0, sy, bar_show_w, sy); - } - } else { //draw graph before and after - var key_first = prop.animator.values[| 0]; - var t_first = (key_first.time + 1) * ui(timeline_scale) + timeline_shift; - var sy; - - if(valArray) { - for( var ki = 0; ki < array_length(key_first.value); ki++ ) { - draw_set_color(COLORS.axis[ki]); - sy = value_map(key_first.value[ki], _gy_val_min, _gy_val_max, _gy_bottom, _gy_top); - draw_line(0, sy, t_first, sy); - } - } else { - draw_set_color(COLORS.panel_animation_graph_line); - sy = value_map(key_first.value, _gy_val_min, _gy_val_max, _gy_bottom, _gy_top); - draw_line(0, sy, t_first, sy); - } - - var key_last = prop.animator.values[| ds_list_size(prop.animator.values) - 1]; - var t_last = (key_last.time + 1) * ui(timeline_scale) + timeline_shift; - - if(key_last.time < ANIMATOR.frames_total) { - if(valArray) { - for( var ki = 0; ki < array_length(key_last.value); ki++ ) { - draw_set_color(COLORS.axis[ki]); - ny[ki] = value_map(key_last.value[ki], _gy_val_min, _gy_val_max, _gy_bottom, _gy_top); - draw_line(t_last, oy[ki], t_last, ny[ki]); - draw_line(t_last, oy[ki], bar_show_w, oy[ki]); - } - } else { - draw_set_color(COLORS.panel_animation_graph_line); - ny = value_map(key_last.value, _gy_val_min, _gy_val_max, _gy_bottom, _gy_top); - draw_line(t_last, oy, t_last, ny); - draw_line(t_last, ny, bar_show_w, ny); - } - } - } - } + var cc = animator.prop.sep_axis? COLORS.axis[animator.index] : COLORS._main_text; + if(hov) cc = COLORS._main_text_accent; + + draw_set_color(cc); + draw_set_alpha(aa); + draw_text(ui(32), ty - 2, animator.getName()); + draw_set_alpha(1); } function drawDopesheetName() { @@ -737,10 +900,10 @@ function Panel_Animation() : PanelContent() constructor { for( var i = 0; i < ds_list_size(anim_properties); i++ ) { _node = anim_properties[| i]; - var _node_y = _node.dopesheet_y; - if(!show_node_outside_context && _node.group != PANEL_GRAPH.getCurrentContext()) continue; var aa = _node.group == PANEL_GRAPH.getCurrentContext()? 1 : 0.9; + var _node_y = _node.dopesheet_y; + if(!show_node_outside_context && _node.group != PANEL_GRAPH.getCurrentContext()) continue; var _node_y_start = _node_y; _node_y += dope_sheet_node_padding; @@ -783,115 +946,21 @@ function Panel_Animation() : PanelContent() constructor { continue; } + var ty = 0; + for( var j = 0; j < ds_list_size(_node.inputs); j++ ) { - var prop = _node.inputs[| j]; - var tx = tool_width - ui(72 + 16 * 3); - var ty = prop.animator.dopesheet_y - 1; + var prop = _node.inputs[| j]; + if(!prop.is_anim) continue; - if(!prop.animator.is_anim) continue; - - #region keyframe control - if(pHOVER && point_in_circle(msx, msy, tx, ty, ui(6))) { - draw_sprite_ui_uniform(THEME.prop_keyframe, 0, tx, ty, 1, COLORS._main_icon, 1); - - if(mouse_press(mb_left, pFOCUS)) { - var _t = -1; - for(var k = 0; k < ds_list_size(prop.animator.values); k++) { - var _key = prop.animator.values[| k]; - if(_key.time < ANIMATOR.current_frame) - _t = _key.time; - } - if(_t > -1) ANIMATOR.setFrame(_t); - } - } else - draw_sprite_ui_uniform(THEME.prop_keyframe, 0, tx, ty, 1, COLORS._main_icon, 0.75); - - var tx = tool_width - ui(72 + 16 * 1); - if(pHOVER && point_in_circle(msx, msy, tx, ty, ui(6))) { - draw_sprite_ui_uniform(THEME.prop_keyframe, 2, tx, ty, 1, COLORS._main_icon, 1); - - if(mouse_press(mb_left, pFOCUS)) { - for(var k = 0; k < ds_list_size(prop.animator.values); k++) { - var _key = prop.animator.values[| k]; - if(_key.time > ANIMATOR.current_frame) { - ANIMATOR.setFrame(_key.time); - break; - } - } - } - } else - draw_sprite_ui_uniform(THEME.prop_keyframe, 2, tx, ty, 1, COLORS._main_icon, 0.75); - #endregion - - #region add keyframe - var tx = tool_width - ui(72 + 16 * 2); - if(pHOVER && point_in_circle(msx, msy, tx, ty, ui(6))) { - draw_sprite_ui_uniform(THEME.prop_keyframe, 1, tx, ty, 1, COLORS._main_accent, 1); - - if(mouse_press(mb_left, pFOCUS)) { - var _add = false; - for(var k = 0; k < ds_list_size(prop.animator.values); k++) { - var _key = prop.animator.values[| k]; - if(_key.time == ANIMATOR.current_frame) { - if(ds_list_size(prop.animator.values) > 1) - ds_list_delete(prop.animator.values, k); - _add = true; - break; - } else if(_key.time > ANIMATOR.current_frame) { - ds_list_insert(prop.animator.values, k, new valueKey(ANIMATOR.current_frame, prop.getValue(, false), prop.animator)); - _add = true; - break; - } - } - if(!_add) ds_list_add(prop.animator.values, new valueKey(ANIMATOR.current_frame, prop.getValue(, false), prop.animator)); - } - } else - draw_sprite_ui_uniform(THEME.prop_keyframe, 1, tx, ty, 1, COLORS._main_accent, 0.75); - #endregion - - if(isGraphable(prop)) { - var tx = tool_width - ui(68 + 16 * 0); - if(pHOVER && point_in_circle(msx, msy, tx, ty, ui(8))) { - draw_sprite_ui_uniform(THEME.timeline_graph, 1, tx, ty, 1, COLORS._main_icon, prop.animator.show_graph? 1 : 0.75); - TOOLTIP = get_text("panel_animation_show_graph", "Show graph"); - - if(mouse_press(mb_left, pFOCUS)) - prop.animator.show_graph = !prop.animator.show_graph; - } else - draw_sprite_ui_uniform(THEME.timeline_graph, 1, tx, ty, 1, prop.animator.show_graph? COLORS._main_accent : COLORS._main_icon); - } - - var tx = tool_width - ui(72 + 16 * 4.5); - if(pHOVER && point_in_circle(msx, msy, tx, ty, ui(6))) { - draw_sprite_ui_uniform(THEME.prop_on_end, prop.on_end, tx, ty, 1, COLORS._main_icon, 1); - TOOLTIP = get_text("panel_animation_looping_mode", "Looping mode") + ": " + ON_END_NAME[prop.on_end]; - - if(mouse_press(mb_left, pFOCUS)) - prop.on_end = safe_mod(prop.on_end + 1, sprite_get_number(THEME.prop_on_end)); - } else - draw_sprite_ui_uniform(THEME.prop_on_end, prop.on_end, tx, ty, 1, COLORS._main_icon, 0.75); - - if(pHOVER && point_in_circle(msx, msy, ui(22), ty - 1, ui(10))) { - draw_sprite_ui_uniform(THEME.timeline_clock, 1, ui(22), ty - 1, 1, COLORS._main_icon, 1); - - if(mouse_press(mb_left, pFOCUS)) { - prop.animator.is_anim = !prop.animator.is_anim; - updatePropertyList(); + if(prop.sep_axis) { + for( var i = 0; i < array_length(prop.animators); i++ ) { + drawDopesheetAnimator(_node, prop.animators[i], msx, msy); + ty = prop.animators[i].dopesheet_y - 1; } - } else - draw_sprite_ui_uniform(THEME.timeline_clock, 1, ui(22), ty - 1, 1, COLORS._main_icon, 0.75); - - var hov = pHOVER && point_in_rectangle(msx, msy, 0, ty - ui(8), w, ty + ui(8)); - if(hov) { - value_hovering = prop; - if(mouse_click(mb_left, pFOCUS)) - value_focusing = prop; + } else { + drawDopesheetAnimator(_node, prop.animator, msx, msy); + ty = prop.animator.dopesheet_y - 1; } - - draw_set_color(hov? COLORS._main_text_accent : COLORS._main_text); - draw_set_alpha(aa); - draw_text(ui(32), ty - 2, prop.name); - draw_set_alpha(1); } //end prop loop if(pHOVER && point_in_rectangle(msx, msy, 0, _node_y_start, lable_w, ty)) @@ -913,6 +982,121 @@ function Panel_Animation() : PanelContent() constructor { surface_reset_target(); } + function drawDopesheetAnimatorKeysBG(animator, msx, msy) { + var prop_dope_y = animator.dopesheet_y; + var key_hover = noone; + var key_list = animator.values; + + if((animator.prop.on_end == KEYFRAME_END.loop || animator.prop.on_end == KEYFRAME_END.ping) && ds_list_size(key_list) > 1) { + var keyframe_s = key_list[| 0].time; + var keyframe_e = key_list[| ds_list_size(key_list) - 1].time; + + var ks_x = (keyframe_s + 1) * ui(timeline_scale) + timeline_shift; + var ke_x = (keyframe_e + 1) * ui(timeline_scale) + timeline_shift; + + draw_set_color(COLORS.panel_animation_loop_line); + draw_set_alpha(0.2); + draw_line_width(ks_x, prop_dope_y - 1, ke_x, prop_dope_y - 1, 4); + draw_set_alpha(1); + } + + for( var k = 0; k < ds_list_size(key_list); k++ ) { //draw easing + var key = key_list[| k]; + var t = key.dopesheet_x; + + if(key.ease_in_type == CURVE_TYPE.bezier) { + draw_set_color(COLORS.panel_animation_keyframe_ease_line); + var _tx = t - key.ease_in[0] * ui(timeline_scale) * 2; + draw_line_width(_tx, prop_dope_y - 1, t, prop_dope_y - 1, 2); + + if(pHOVER && point_in_circle(msx, msy, _tx, prop_dope_y, ui(6))) { + key_hover = key; + draw_sprite_ui_uniform(THEME.timeline_keyframe, 2, _tx, prop_dope_y, 1, COLORS.panel_animation_keyframe_selected); + if(mouse_press(mb_left, pFOCUS)) { + keyframe_dragging = animator.values[| k]; + keyframe_drag_type = KEYFRAME_DRAG_TYPE.ease_in; + } + } else + draw_sprite_ui_uniform(THEME.timeline_keyframe, 2, _tx, prop_dope_y, 1, COLORS.panel_animation_keyframe_unselected); + } + + if(key.ease_out_type == CURVE_TYPE.bezier) { + draw_set_color(COLORS.panel_animation_keyframe_ease_line); + var _tx = t + key.ease_out[0] * ui(timeline_scale) * 2; + draw_line_width(t, prop_dope_y - 1, _tx, prop_dope_y - 1, 2); + + if(pHOVER && point_in_circle(msx, msy, _tx, prop_dope_y, ui(6))) { + key_hover = key; + draw_sprite_ui_uniform(THEME.timeline_keyframe, 3, _tx, prop_dope_y, 1, COLORS.panel_animation_keyframe_selected); + if(mouse_press(mb_left, pFOCUS)) { + keyframe_dragging = animator.values[| k]; + keyframe_drag_type = KEYFRAME_DRAG_TYPE.ease_out; + } + } else + draw_sprite_ui_uniform(THEME.timeline_keyframe, 3, _tx, prop_dope_y, 1, COLORS.panel_animation_keyframe_unselected); + } + } + + return key_hover; + } + + function drawDopesheetAnimatorKeys(_node, animator, msx, msy) { + var prop_y = animator.dopesheet_y; + var key_hover = noone; + var node_y = _node.dopesheet_y + dope_sheet_node_padding; + + for(var k = 0; k < ds_list_size(animator.values); k++) { + var keyframe = animator.values[| k]; + var t = keyframe.dopesheet_x; + + draw_sprite_ui_uniform(THEME.timeline_keyframe, 0, t, node_y, 1, COLORS._main_icon); + + if(!_node.anim_show) continue; + var cc = COLORS.panel_animation_keyframe_unselected; + if(pHOVER && point_in_circle(msx, msy, t, prop_y, ui(8))) { + cc = COLORS.panel_animation_keyframe_selected; + key_hover = keyframe; + + if(pFOCUS) { + if(DOUBLE_CLICK) { + keyframe_dragging = keyframe; + keyframe_drag_type = KEYFRAME_DRAG_TYPE.ease_both; + keyframe_dragout = false; + keyframe_drag_mx = mx; + keyframe_drag_my = my; + } else if(mouse_press(mb_left)) { + keyframe_dragging = keyframe; + keyframe_drag_type = KEYFRAME_DRAG_TYPE.move; + keyframe_drag_mx = mx; + keyframe_drag_my = my; + keyframe_drag_my = my; + } + } + } + + if(stagger_mode == 1 && ds_list_exist(keyframe_selecting, keyframe)) + cc = key_hover == keyframe? COLORS.panel_animation_keyframe_selected : COLORS._main_accent; + + draw_sprite_ui_uniform(THEME.timeline_keyframe, keyframe.ease_in_type == CURVE_TYPE.cut? 4 : 1, t, prop_y, 1, cc); + if(ds_list_exist(keyframe_selecting, keyframe)) + draw_sprite_ui_uniform(THEME.timeline_keyframe_selecting, keyframe.ease_in_type == CURVE_TYPE.cut, t, prop_y, 1, COLORS._main_accent); + + if(keyframe_boxing) { + var box_x0 = min(keyframe_box_sx, msx); + var box_x1 = max(keyframe_box_sx, msx); + var box_y0 = min(keyframe_box_sy, msy); + var box_y1 = max(keyframe_box_sy, msy); + + if(pHOVER && !point_in_rectangle(t, prop_y, box_x0, box_y0, box_x1, box_y1) && ds_list_exist(keyframe_selecting, keyframe)) + ds_list_remove(keyframe_selecting, keyframe); + if(pHOVER && point_in_rectangle(t, prop_y, box_x0, box_y0, box_x1, box_y1) && !ds_list_exist(keyframe_selecting, keyframe)) + ds_list_add(keyframe_selecting, keyframe); + } + } + + return key_hover; + } + function drawDopesheet() { var bar_x = tool_width - ui(48); var bar_y = h - timeline_h - ui(10); @@ -993,18 +1177,31 @@ function Panel_Animation() : PanelContent() constructor { for( var j = 0; j < ds_list_size(_node.inputs); j++ ) { var prop = _node.inputs[| j]; - if(!prop.animator.is_anim) continue; + if(!prop.is_anim) continue; - prop.animator.dopesheet_y = key_y; - if(prop == value_focusing) - draw_sprite_stretched_ext(THEME.ui_panel_bg, 0, 0, key_y - ui(8), bar_show_w, ui(16), merge_color(COLORS._main_icon, COLORS._main_icon_dark, 0.7), 1); - else if(prop == value_hovering) - draw_sprite_stretched_ext(THEME.ui_panel_bg, 0, 0, key_y - ui(6), bar_show_w, ui(12), COLORS.panel_animation_graph_bg, 1); + if(prop.sep_axis) { + for( var k = 0; k < array_length(prop.animators); k++ ) { + prop.animators[k].dopesheet_y = key_y; + if(prop == value_focusing) + draw_sprite_stretched_ext(THEME.ui_panel_bg, 0, 0, key_y - ui(8), bar_show_w, ui(16), merge_color(COLORS._main_icon, COLORS._main_icon_dark, 0.7), 1); + else if(prop == value_hovering) + draw_sprite_stretched_ext(THEME.ui_panel_bg, 0, 0, key_y - ui(6), bar_show_w, ui(12), COLORS.panel_animation_graph_bg, 1); - key_y += ui(18); - dope_sheet_y_max += ui(18); + key_y += ui(18); + dope_sheet_y_max += ui(18); + } + } else { + prop.animator.dopesheet_y = key_y; + if(prop == value_focusing) + draw_sprite_stretched_ext(THEME.ui_panel_bg, 0, 0, key_y - ui(8), bar_show_w, ui(16), merge_color(COLORS._main_icon, COLORS._main_icon_dark, 0.7), 1); + else if(prop == value_hovering) + draw_sprite_stretched_ext(THEME.ui_panel_bg, 0, 0, key_y - ui(6), bar_show_w, ui(12), COLORS.panel_animation_graph_bg, 1); + + key_y += ui(18); + dope_sheet_y_max += ui(18); + } - if(prop.animator.show_graph) { + if(prop.show_graph) { draw_sprite_stretched_ext(THEME.ui_panel_bg, 0, 0, key_y - ui(4), bar_show_w, prop.graph_h, COLORS.panel_animation_graph_bg, 1); key_y += prop.graph_h + ui(8); dope_sheet_y_max += prop.graph_h + ui(8); @@ -1051,11 +1248,18 @@ function Panel_Animation() : PanelContent() constructor { for(var i = 0; i < ds_list_size(n.inputs); i++) { var in = n.inputs[| i]; - if(!in.animator.is_anim) continue; + if(!in.is_anim) continue; + for(var j = 0; j < ds_list_size(in.animator.values); j++) { var t = in.animator.values[| j]; t.time = t.ratio * (len - 1); } + + for( var k = 0; k < array_length(in.animators); k++ ) + for(var j = 0; j < ds_list_size(in.animators[k].values); j++) { + var t = in.animators[k].values[| j]; + t.time = t.ratio * (len - 1); + } } } } @@ -1089,7 +1293,6 @@ function Panel_Animation() : PanelContent() constructor { #endregion draw_set_text(f_p2, fa_left, fa_top); - var key_hover = noone; #region drag key if(keyframe_dragging) { @@ -1163,7 +1366,8 @@ function Panel_Animation() : PanelContent() constructor { } #endregion - #region draw graph + var key_hover = noone; + #region draw graph, easing line for( var i = 0; i < ds_list_size(anim_properties); i++ ) { var _node = anim_properties[| i]; if(!show_node_outside_context && _node.group != PANEL_GRAPH.getCurrentContext()) continue; @@ -1171,62 +1375,25 @@ function Panel_Animation() : PanelContent() constructor { if(!_node.anim_show) continue; for( var j = 0; j < ds_list_size(_node.inputs); j++ ) { var prop = _node.inputs[| j]; - if(!prop.animator.is_anim) continue; - var prop_dope_y = prop.animator.dopesheet_y; + if(!prop.is_anim) continue; - var key_list = prop.animator.values; - if((prop.on_end == KEYFRAME_END.loop || prop.on_end == KEYFRAME_END.ping) && ds_list_size(key_list) > 1) { - var keyframe_s = key_list[| 0].time; - var keyframe_e = key_list[| ds_list_size(key_list) - 1].time; - - var ks_x = (keyframe_s + 1) * ui(timeline_scale) + timeline_shift; - var ke_x = (keyframe_e + 1) * ui(timeline_scale) + timeline_shift; - - draw_set_color(COLORS.panel_animation_loop_line); - draw_set_alpha(0.2); - draw_line_width(ks_x, prop_dope_y - 1, ke_x, prop_dope_y - 1, 4); - draw_set_alpha(1); - } + var _dy = prop.animator.dopesheet_y; - for( var k = 0; k < ds_list_size(key_list); k++ ) { //draw easing - var key = key_list[| k]; - var t = key.dopesheet_x; - - if(key.ease_in_type == CURVE_TYPE.bezier) { - draw_set_color(COLORS.panel_animation_keyframe_ease_line); - var _tx = t - key.ease_in[0] * ui(timeline_scale) * 2; - draw_line_width(_tx, prop_dope_y - 1, t, prop_dope_y - 1, 2); - - if(pHOVER && point_in_circle(msx, msy, _tx, prop_dope_y, ui(6))) { + if(prop.sep_axis) { + for( var k = 0; k < array_length(prop.animators); k++ ) { + var key = drawDopesheetAnimatorKeysBG(prop.animators[k], msx, msy); + _dy = prop.animators[k].dopesheet_y; + if(key != noone) key_hover = key; - draw_sprite_ui_uniform(THEME.timeline_keyframe, 2, _tx, prop_dope_y, 1, COLORS.panel_animation_keyframe_selected); - if(mouse_press(mb_left, pFOCUS)) { - keyframe_dragging = prop.animator.values[| k]; - keyframe_drag_type = KEYFRAME_DRAG_TYPE.ease_in; - } - } else - draw_sprite_ui_uniform(THEME.timeline_keyframe, 2, _tx, prop_dope_y, 1, COLORS.panel_animation_keyframe_unselected); - } - - if(key.ease_out_type == CURVE_TYPE.bezier) { - draw_set_color(COLORS.panel_animation_keyframe_ease_line); - var _tx = t + key.ease_out[0] * ui(timeline_scale) * 2; - draw_line_width(t, prop_dope_y - 1, _tx, prop_dope_y - 1, 2); - - if(pHOVER && point_in_circle(msx, msy, _tx, prop_dope_y, ui(6))) { - key_hover = key; - draw_sprite_ui_uniform(THEME.timeline_keyframe, 3, _tx, prop_dope_y, 1, COLORS.panel_animation_keyframe_selected); - if(mouse_press(mb_left, pFOCUS)) { - keyframe_dragging = prop.animator.values[| k]; - keyframe_drag_type = KEYFRAME_DRAG_TYPE.ease_out; - } - } else - draw_sprite_ui_uniform(THEME.timeline_keyframe, 3, _tx, prop_dope_y, 1, COLORS.panel_animation_keyframe_unselected); } + } else { + var key = drawDopesheetAnimatorKeysBG(prop.animator, msx, msy); + if(key != noone) + key_hover = key; } - if(isGraphable(prop) && prop.animator.show_graph) - drawDopesheetGraph(prop, prop_dope_y, msx, msy); + if(isGraphable(prop) && prop.show_graph) + drawDopesheetGraph(prop, _dy, msx, msy); } } #endregion @@ -1245,61 +1412,22 @@ function Panel_Animation() : PanelContent() constructor { #region draw keys for( var i = 0; i < ds_list_size(anim_properties); i++ ) { var _node = anim_properties[| i]; - var node_y = _node.dopesheet_y + dope_sheet_node_padding; if(!show_node_outside_context && _node.group != PANEL_GRAPH.getCurrentContext()) continue; for( var j = 0; j < ds_list_size(_node.inputs); j++ ) { var prop = _node.inputs[| j]; - if(!prop.animator.is_anim) continue; - var prop_y = prop.animator.dopesheet_y; + if(!prop.is_anim) continue; - for(var k = 0; k < ds_list_size(prop.animator.values); k++) { - var keyframe = prop.animator.values[| k]; - var t = keyframe.dopesheet_x; - - draw_sprite_ui_uniform(THEME.timeline_keyframe, 0, t, node_y, 1, COLORS._main_icon); - - if(!_node.anim_show) continue; - var cc = COLORS.panel_animation_keyframe_unselected; - if(pHOVER && point_in_circle(msx, msy, t, prop_y, ui(8))) { - cc = COLORS.panel_animation_keyframe_selected; - key_hover = keyframe; - - if(pFOCUS) { - if(DOUBLE_CLICK) { - keyframe_dragging = keyframe; - keyframe_drag_type = KEYFRAME_DRAG_TYPE.ease_both; - keyframe_dragout = false; - keyframe_drag_mx = mx; - keyframe_drag_my = my; - } else if(mouse_press(mb_left)) { - keyframe_dragging = keyframe; - keyframe_drag_type = KEYFRAME_DRAG_TYPE.move; - keyframe_drag_mx = mx; - keyframe_drag_my = my; - keyframe_drag_my = my; - } - } - } - - if(stagger_mode == 1 && ds_list_exist(keyframe_selecting, keyframe)) - cc = key_hover == keyframe? COLORS.panel_animation_keyframe_selected : COLORS._main_accent; - - draw_sprite_ui_uniform(THEME.timeline_keyframe, keyframe.ease_in_type == CURVE_TYPE.cut? 4 : 1, t, prop_y, 1, cc); - if(ds_list_exist(keyframe_selecting, keyframe)) - draw_sprite_ui_uniform(THEME.timeline_keyframe_selecting, keyframe.ease_in_type == CURVE_TYPE.cut, t, prop_y, 1, COLORS._main_accent); - - if(keyframe_boxing) { - var box_x0 = min(keyframe_box_sx, msx); - var box_x1 = max(keyframe_box_sx, msx); - var box_y0 = min(keyframe_box_sy, msy); - var box_y1 = max(keyframe_box_sy, msy); - - if(pHOVER && !point_in_rectangle(t, prop_y, box_x0, box_y0, box_x1, box_y1) && ds_list_exist(keyframe_selecting, keyframe)) - ds_list_remove(keyframe_selecting, keyframe); - if(pHOVER && point_in_rectangle(t, prop_y, box_x0, box_y0, box_x1, box_y1) && !ds_list_exist(keyframe_selecting, keyframe)) - ds_list_add(keyframe_selecting, keyframe); + if(prop.sep_axis) { + for( var k = 0; k < array_length(prop.animators); k++ ) { + var key = drawDopesheetAnimatorKeys(_node, prop.animators[k], msx, msy); + if(key != noone) + key_hover = key; } + } else { + var key = drawDopesheetAnimatorKeys(_node, prop.animator, msx, msy); + if(key != noone) + key_hover = key; } } } diff --git a/scripts/panel_data/panel_data.gml b/scripts/panel_data/panel_data.gml index afb999342..ce15635f4 100644 --- a/scripts/panel_data/panel_data.gml +++ b/scripts/panel_data/panel_data.gml @@ -50,6 +50,20 @@ function Panel(_parent, _x, _y, _w, _h) constructor { tab_holding_sx = 0; tab_holding_sy = 0; + border_rb_close = menuItem("Close", function() { + extract(); + o_main.panel_dragging = noone; + }, THEME.cross); + + border_rb_menu = [ + menuItem("Move", function() { + extract(); + panel_mouse = 1; + }), + menuItem("Pop out", function() { popWindow(); }, THEME.node_goto), + border_rb_close + ]; + static getContent = function() { return array_safe_get(content, content_index, noone, ARRAY_OVERFLOW._default); } static hasContent = function() { return bool(array_length(content)); } @@ -198,8 +212,7 @@ function Panel(_parent, _x, _y, _w, _h) constructor { for( var i = 0; i < array_length(content); i++ ) content[i].onSetPanel(self); - if(_switch) - content_index = array_find(content, _content); + if(_switch) content_index = array_find(content, _content); refresh(); } @@ -458,7 +471,10 @@ function Panel(_parent, _x, _y, _w, _h) constructor { draw_set_text(f_p3, fa_left, fa_bottom, COLORS._main_text_sub); for( var i = 0; i < array_length(content); i++ ) { var txt = content[i].title; + var icn = content[i].icon; + var tbw = string_width(txt) + ui(16); + if(icn != noone) tbw += ui(16 + 4); var foc = false; tab_width += tbw + ui(2); @@ -498,9 +514,23 @@ function Panel(_parent, _x, _y, _w, _h) constructor { tab_holding_my = msy; tab_holding_sx = tab_holding.tab_x; } + + if(mouse_press(mb_right, FOCUS == self)) { + var menu = array_clone(border_rb_menu); + if(instanceof(content[i]) == "Panel_Menu") + array_remove(menu, 2, border_rb_close); + + menuCall(,, menu); + } } - draw_set_text(f_p3, fa_left, fa_bottom, foc? COLORS.panel_bg_clear_inner : COLORS._main_text_sub); + var cc = foc? COLORS.panel_bg_clear_inner : COLORS._main_text_sub; + if(icn != noone) { + draw_sprite_ui(icn, 0, _tbx + ui(8 + 8), tab_height / 2 + ui(1),,,, cc); + _tbx += ui(20); + } + + draw_set_text(f_p3, fa_left, fa_bottom, cc); draw_text(_tbx + ui(8), tab_height - ui(2), txt); tbx += tbw + ui(2); @@ -517,11 +547,18 @@ function Panel(_parent, _x, _y, _w, _h) constructor { var _tbx = tab_holding.tab_x; var txt = tab_holding.title; + var icn = tab_holding.icon; var tbw = string_width(txt) + ui(16); + if(icn != noone) tbw += ui(16 + 4); draw_set_color(COLORS._main_accent); draw_roundrect_ext(_tbx, tby, _tbx + tbw, tby + ui(32), ui(8), ui(8), false); + var cc = COLORS.panel_bg_clear_inner; + if(icn != noone) { + draw_sprite_ui(icn, 0, _tbx + ui(8 + 8), tab_height / 2 + ui(1),,,, cc); + _tbx += ui(20); + } draw_set_text(f_p3, fa_left, fa_bottom, COLORS.panel_bg_clear_inner); draw_text(_tbx + ui(8), tab_height - ui(2), txt); @@ -605,20 +642,11 @@ function Panel(_parent, _x, _y, _w, _h) constructor { extract(); panel_mouse = 0; } else if(mouse_press(mb_right)) { - var arr = [ - menuItem("Move", function() { - extract(); - panel_mouse = 1; - }), - menuItem("Pop out", function() { popWindow(); }, THEME.node_goto), - ]; - if(instanceof(getContent()) != "Panel_Menu") - array_push(arr, menuItem("Close", function() { - extract(); - o_main.panel_dragging = noone; - }, THEME.cross)); + var menu = array_clone(border_rb_menu); + if(instanceof(getContent()) == "Panel_Menu") + array_remove(menu, 2, border_rb_close); - menuCall(,, arr); + menuCall(,, menu); } } } @@ -752,7 +780,8 @@ function Panel(_parent, _x, _y, _w, _h) constructor { } function PanelContent() constructor { - title = ""; + title = ""; + icon = noone; context_str = ""; draggable = true; expandable = true; diff --git a/scripts/panel_function/panel_function.gml b/scripts/panel_function/panel_function.gml index 503f698ae..c26eeac63 100644 --- a/scripts/panel_function/panel_function.gml +++ b/scripts/panel_function/panel_function.gml @@ -93,7 +93,9 @@ function panelAdd(panel, create = false) { var pan = getPanelFromName(panel, create); - if(pan) dialogPanelCall(pan); + if(pan == noone) return noone; + + return dialogPanelCall(pan); } function panelObjectInit() { diff --git a/scripts/panel_graph/panel_graph.gml b/scripts/panel_graph/panel_graph.gml index 27b07614a..69c529c78 100644 --- a/scripts/panel_graph/panel_graph.gml +++ b/scripts/panel_graph/panel_graph.gml @@ -1,6 +1,7 @@ function Panel_Graph() : PanelContent() constructor { title = "Graph"; context_str = "Graph"; + icon = THEME.panel_graph; scale = [ 0.25, 0.33, 0.5, 0.65, 0.8, 1, 1.2, 1.35, 1.5]; graph_s_index = 5; @@ -10,16 +11,6 @@ function Panel_Graph() : PanelContent() constructor { grid_color = c_white; grid_opacity = 0.05; - function toOrigin() { - graph_x = round(w / 2 / graph_s); - graph_y = round(h / 2 / graph_s); - } - - function initSize() { - toOrigin(); - } - initSize(); - graph_draggable= true; graph_dragging = false; graph_drag_mx = 0; @@ -97,6 +88,39 @@ function Panel_Graph() : PanelContent() constructor { connection_aa = 2; connection_surface = surface_create(1, 1); + function toCenterNode() { + if(ds_list_empty(nodes_list)) { + graph_x = round(w / 2 / graph_s); + graph_y = round(h / 2 / graph_s); + return; + } + + var minx = 99999; + var maxx = -99999; + var miny = 99999; + var maxy = -99999; + + for(var i = 0; i < ds_list_size(nodes_list); i++) { + var n = nodes_list[| i]; + minx = min(n.x - 32, minx); + maxx = max(n.x + n.w + 32, maxx); + + miny = min(n.y - 32, miny); + maxy = max(n.y + n.h + 32, maxy); + } + + graph_x = w / 2 / graph_s - (minx + maxx) / 2; + graph_y = (h - toolbar_height) / 2 / graph_s - (miny + maxy) / 2; + + graph_x = round(graph_x); + graph_y = round(graph_y); + + //print(title + ": Center " + string(graph_x) + ", " + string(graph_y)); + } + + function initSize() { toCenterNode(); } + initSize(); + toolbar_height = ui(40); toolbars = [ [ @@ -140,18 +164,18 @@ function Panel_Graph() : PanelContent() constructor { ], ]; - addHotkey("Graph", "Add node", "A", MOD_KEY.none, function() { callAddDialog(); }); - addHotkey("Graph", "Focus content", "F", MOD_KEY.none, function() { fullView(); }); - addHotkey("Graph", "Preview focusing node", "P", MOD_KEY.none, function() { setCurrentPreview(); }); - addHotkey("Graph", "Preview window", "P", MOD_KEY.ctrl, function() { previewWindow(node_focus); }); - addHotkey("Graph", "Import image", "I", MOD_KEY.none, function() { nodeBuild("Node_Image", mouse_grid_x, mouse_grid_y); }); - addHotkey("Graph", "Import image array", "I", MOD_KEY.shift, function() { nodeBuild("Node_Image_Sequence", mouse_grid_x, mouse_grid_y); }); - addHotkey("Graph", "Add number", "1", MOD_KEY.none, function() { nodeBuild("Node_Number", mouse_grid_x, mouse_grid_y); }); - addHotkey("Graph", "Add vector2", "2", MOD_KEY.none, function() { nodeBuild("Node_Vector2", mouse_grid_x, mouse_grid_y); }); - addHotkey("Graph", "Add vector3", "3", MOD_KEY.none, function() { nodeBuild("Node_Vector3", mouse_grid_x, mouse_grid_y); }); - addHotkey("Graph", "Add vector4", "4", MOD_KEY.none, function() { nodeBuild("Node_Vector4", mouse_grid_x, mouse_grid_y); }); + addHotkey("Graph", "Add node", "A", MOD_KEY.none, function() { PANEL_GRAPH.callAddDialog(); }); + addHotkey("Graph", "Focus content", "F", MOD_KEY.none, function() { PANEL_GRAPH.fullView(); }); + addHotkey("Graph", "Preview focusing node", "P", MOD_KEY.none, function() { PANEL_GRAPH.setCurrentPreview(); }); + addHotkey("Graph", "Preview window", "P", MOD_KEY.ctrl, function() { PANEL_GRAPH.previewWindow(PANEL_GRAPH.node_focus); }); + addHotkey("Graph", "Import image", "I", MOD_KEY.none, function() { nodeBuild("Node_Image", PANEL_GRAPH.mouse_grid_x, PANEL_GRAPH.mouse_grid_y); }); + addHotkey("Graph", "Import image array", "I", MOD_KEY.shift, function() { nodeBuild("Node_Image_Sequence", PANEL_GRAPH.mouse_grid_x, PANEL_GRAPH.mouse_grid_y); }); + addHotkey("Graph", "Add number", "1", MOD_KEY.none, function() { nodeBuild("Node_Number", PANEL_GRAPH.mouse_grid_x, PANEL_GRAPH.mouse_grid_y); }); + addHotkey("Graph", "Add vector2", "2", MOD_KEY.none, function() { nodeBuild("Node_Vector2", PANEL_GRAPH.mouse_grid_x, PANEL_GRAPH.mouse_grid_y); }); + addHotkey("Graph", "Add vector3", "3", MOD_KEY.none, function() { nodeBuild("Node_Vector3", PANEL_GRAPH.mouse_grid_x, PANEL_GRAPH.mouse_grid_y); }); + addHotkey("Graph", "Add vector4", "4", MOD_KEY.none, function() { nodeBuild("Node_Vector4", PANEL_GRAPH.mouse_grid_x, PANEL_GRAPH.mouse_grid_y); }); - static addNodeTransform = function() { + function addNodeTransform() { if(ds_list_empty(nodes_select_list)) { if(node_focus != noone && !ds_list_empty(node_focus.outputs)) { var _o = node_focus.outputs[| 0]; @@ -173,8 +197,8 @@ function Panel_Graph() : PanelContent() constructor { } } } - addNodeTransform = method(self, addNodeTransform); - addHotkey("Graph", "Transform node", "T", MOD_KEY.ctrl, addNodeTransform); + + addHotkey("Graph", "Transform node", "T", MOD_KEY.ctrl, function() { PANEL_GRAPH.addNodeTransform(); }); addHotkey("Graph", "Select all", "A", MOD_KEY.ctrl, function() { ds_list_clear(nodes_select_list); @@ -183,45 +207,38 @@ function Panel_Graph() : PanelContent() constructor { } }); - addHotkey("Graph", "Toggle grid", "G", MOD_KEY.none, function() { show_grid = !show_grid; }); - addHotkey("Graph", "Toggle preview", "H", MOD_KEY.none, function() { setTriggerPreview(); }); - addHotkey("Graph", "Toggle render", "R", MOD_KEY.none, function() { setTriggerRender(); }); + addHotkey("Graph", "Toggle grid", "G", MOD_KEY.none, function() { PANEL_GRAPH.show_grid = !PANEL_GRAPH.show_grid; }); + addHotkey("Graph", "Toggle preview", "H", MOD_KEY.none, function() { PANEL_GRAPH.setTriggerPreview(); }); + addHotkey("Graph", "Toggle render", "R", MOD_KEY.none, function() { PANEL_GRAPH.setTriggerRender(); }); if(!DEMO) - addHotkey("Graph", "Export", "E", MOD_KEY.ctrl, function() { setCurrentExport(); }); + addHotkey("Graph", "Export", "E", MOD_KEY.ctrl, function() { PANEL_GRAPH.setCurrentExport(); }); - addHotkey("Graph", "Blend", "B", MOD_KEY.ctrl, function() { doBlend(); }); - addHotkey("Graph", "Compose", "B", MOD_KEY.ctrl | MOD_KEY.shift, function() { doCompose(); }); - addHotkey("Graph", "Array", "A", MOD_KEY.ctrl | MOD_KEY.shift, function() { doArray(); }); + addHotkey("Graph", "Blend", "B", MOD_KEY.ctrl, function() { PANEL_GRAPH.doBlend(); }); + addHotkey("Graph", "Compose", "B", MOD_KEY.ctrl | MOD_KEY.shift, function() { PANEL_GRAPH.doCompose(); }); + addHotkey("Graph", "Array", "A", MOD_KEY.ctrl | MOD_KEY.shift, function() { PANEL_GRAPH.doArray(); }); - addHotkey("Graph", "Group", "G", MOD_KEY.ctrl, function() { doGroup(); }); - addHotkey("Graph", "Ungroup", "G", MOD_KEY.ctrl | MOD_KEY.shift, function() { doUngroup(); }); + addHotkey("Graph", "Group", "G", MOD_KEY.ctrl, function() { PANEL_GRAPH.doGroup(); }); + addHotkey("Graph", "Ungroup", "G", MOD_KEY.ctrl | MOD_KEY.shift, function() { PANEL_GRAPH.doUngroup(); }); - addHotkey("Graph", "Loop", "L", MOD_KEY.ctrl, function() { doLoop(); }); + addHotkey("Graph", "Loop", "L", MOD_KEY.ctrl, function() { PANEL_GRAPH.doLoop(); }); - addHotkey("Graph", "Canvas", "C", MOD_KEY.ctrl | MOD_KEY.shift, function() { setCurrentCanvas(); }); - addHotkey("Graph", "Canvas blend", "C", MOD_KEY.ctrl | MOD_KEY.alt, function() { setCurrentCanvasBlend(); }); + addHotkey("Graph", "Canvas", "C", MOD_KEY.ctrl | MOD_KEY.shift, function() { PANEL_GRAPH.setCurrentCanvas(); }); + addHotkey("Graph", "Canvas blend", "C", MOD_KEY.ctrl | MOD_KEY.alt, function() { PANEL_GRAPH.setCurrentCanvasBlend(); }); - addHotkey("Graph", "Frame", "F", MOD_KEY.ctrl, function() { doFrame(); }); + addHotkey("Graph", "Frame", "F", MOD_KEY.ctrl, function() { PANEL_GRAPH.doFrame(); }); - addHotkey("Graph", "Delete (break)", vk_delete, MOD_KEY.shift, function() { doDelete(false); }); - addHotkey("Graph", "Delete (merge)", vk_delete, MOD_KEY.none, function() { doDelete(true); }); + addHotkey("Graph", "Delete (break)", vk_delete, MOD_KEY.shift, function() { PANEL_GRAPH.doDelete(false); }); + addHotkey("Graph", "Delete (merge)", vk_delete, MOD_KEY.none, function() { PANEL_GRAPH.doDelete(true); }); - addHotkey("Graph", "Duplicate", "D", MOD_KEY.ctrl, function() { doDuplicate(); }); - addHotkey("Graph", "Copy", "C", MOD_KEY.ctrl, function() { doCopy(); }); - addHotkey("Graph", "Paste", "V", MOD_KEY.ctrl, function() { doPaste(); }); + addHotkey("Graph", "Duplicate", "D", MOD_KEY.ctrl, function() { PANEL_GRAPH.doDuplicate(); }); + addHotkey("Graph", "Copy", "C", MOD_KEY.ctrl, function() { PANEL_GRAPH.doCopy(); }); + addHotkey("Graph", "Paste", "V", MOD_KEY.ctrl, function() { PANEL_GRAPH.doPaste(); }); - addHotkey("Graph", "Tunnels", "T", MOD_KEY.none, function() { - var tun = new Panel_Tunnels(); - var dia = dialogPanelCall(tun, mouse_mx + ui(8), mouse_my + ui(8)); - dia.anchor = ANCHOR.left | ANCHOR.top; - dia.resetPosition(); - - tun.build_x = PANEL_GRAPH.mouse_grid_x; - tun.build_y = PANEL_GRAPH.mouse_grid_y; - }); - - function onFocusBegin() { PANEL_GRAPH = self; } + function onFocusBegin() { + PANEL_GRAPH = self; + PANEL_ANIMATION.updatePropertyList(); + } function stepBegin() { var gr_x = graph_x * graph_s; @@ -249,29 +266,15 @@ function Panel_Graph() : PanelContent() constructor { graph_y = round(graph_y); } - function toCenterNode() { - if(ds_list_empty(nodes_list)) { - toOrigin(); + function fullView() { + if(node_focus == noone) { + toCenterNode(); return; } - var minx = 99999; - var maxx = -99999; - var miny = 99999; - var maxy = -99999; + graph_x = -(node_focus.x + node_focus.w / 2) + w / 2 / graph_s; + graph_y = -(node_focus.y + node_focus.h / 2) + h / 2 / graph_s; - for(var i = 0; i < ds_list_size(nodes_list); i++) { - var n = nodes_list[| i]; - minx = min(n.x - 32, minx); - maxx = max(n.x + n.w + 32, maxx); - - miny = min(n.y - 32, miny); - maxy = max(n.y + n.h + 32, maxy); - } - - graph_x = w / 2 / graph_s - (minx + maxx) / 2; - graph_y = (h - toolbar_height) / 2 / graph_s - (miny + maxy) / 2; - graph_x = round(graph_x); graph_y = round(graph_y); } @@ -478,6 +481,13 @@ function Panel_Graph() : PanelContent() constructor { menuItem(get_text("panel_graph_preview_window", "Send to preview window"), function() { previewWindow(node_hover); }, noone, ["Graph", "Preview window"])); + array_push(menu, + menuItem(get_text("panel_graph_inspector_panel", "Send to new inspector"), function() { + var pan = panelAdd("Panel_Inspector", true); + pan.destroy_on_click_out = false; + pan.content.inspecting = node_hover; + pan.content.locked = true; + })); if(DEMO) { array_push(menu, @@ -496,12 +506,31 @@ function Panel_Graph() : PanelContent() constructor { }, noone, ["Graph", "Toggle render"])); if(struct_has(node_hover, "nodes")) { + array_push(menu, -1); + array_push(menu, - menuItem(get_text("panel_graph_enter_group", "Enter group"), function() { + menuItem(get_text("panel_graph_enter_group", "Open group"), function() { PANEL_GRAPH.addContext(node_hover); }, THEME.group)); + array_push(menu, + menuItem(get_text("panel_graph_enter_group_new_tab", "Open group in new tab"), function() { + var graph = new Panel_Graph(); + panel.setContent(graph, true); + + for( var i = 0; i < ds_list_size(node_context); i++ ) + graph.addContext(node_context[| i]); + graph.addContext(node_hover); + + setFocus(panel); + }, THEME.group)); + array_push(menu, + menuItem(get_text("panel_graph_ungroup", "Ungroup"), function() { + doUngroup(); + }, THEME.group, ["Graph", "Ungroup"])); } + array_push(menu, -1); + array_push(menu, menuItem(get_text("panel_graph_delete_and_merge_connection", "Delete and merge connection"), function() { doDelete(true); @@ -558,11 +587,6 @@ function Panel_Graph() : PanelContent() constructor { menuItem(get_text("panel_graph_frame_nodes", "Frame nodes"), function() { doFrame(); }, noone, ["Graph", "Frame"])); - } else if(variable_struct_exists(node_hover, "nodes")) { - array_push(menu, - menuItem(get_text("panel_graph_ungroup", "Ungroup"), function() { - doUngroup(); - }, THEME.group, ["Graph", "Ungroup"])); } menuCall(,, menu ); @@ -1414,6 +1438,7 @@ function Panel_Graph() : PanelContent() constructor { if(i == -1) { ds_list_clear(node_context); + title = "Graph"; nodes_list = NODES; toCenterNode(); PANEL_ANIMATION.updatePropertyList(); @@ -1422,6 +1447,9 @@ function Panel_Graph() : PanelContent() constructor { ds_list_delete(node_context, j); nodes_list = node_context[| i].getNodeList(); toCenterNode(); + + var node = getCurrentContext(); + title = node.display_name == ""? node.name : node.display_name; PANEL_ANIMATION.updatePropertyList(); break; } @@ -1611,6 +1639,8 @@ function Panel_Graph() : PanelContent() constructor { } function addContext(node) { + title = node.display_name == ""? node.name : node.display_name; + var _node = node.getNodeBase(); setContextFrame(false, _node); @@ -1650,20 +1680,6 @@ function Panel_Graph() : PanelContent() constructor { return false; } - function fullView() { - if(node_focus) { - graph_x = -(node_focus.x + node_focus.w / 2) + w / 2 / graph_s; - graph_y = -(node_focus.y + node_focus.h / 2) + h / 2 / graph_s; - - graph_x = round(graph_x); - graph_y = round(graph_y); - return; - } - - toCenterNode(); - return; - } - function drawContent(panel) { dragGraph(); diff --git a/scripts/panel_inspector/panel_inspector.gml b/scripts/panel_inspector/panel_inspector.gml index 8f73f47d4..2ce63212c 100644 --- a/scripts/panel_inspector/panel_inspector.gml +++ b/scripts/panel_inspector/panel_inspector.gml @@ -6,6 +6,10 @@ function Inspector_Custom_Renderer(draw) : widget() constructor { function Panel_Inspector() : PanelContent() constructor { title = "Inspector"; context_str = "Inspector"; + icon = THEME.panel_inspector; + + w = ui(400); + h = ui(640); locked = false; inspecting = noone; @@ -60,9 +64,9 @@ function Panel_Inspector() : PanelContent() constructor { workshop_uploading = false; - addHotkey("Inspector", "Copy property", "C", MOD_KEY.ctrl, function() { propSelectCopy(); }); - addHotkey("Inspector", "Paste property", "V", MOD_KEY.ctrl, function() { propSelectPaste(); }); - addHotkey("Inspector", "Toggle animation", "I", MOD_KEY.none, function() { anim_toggling = true; }); + addHotkey("Inspector", "Copy property", "C", MOD_KEY.ctrl, function() { PANEL_INSPECTOR.propSelectCopy(); }); + addHotkey("Inspector", "Paste property", "V", MOD_KEY.ctrl, function() { PANEL_INSPECTOR.propSelectPaste(); }); + addHotkey("Inspector", "Toggle animation", "I", MOD_KEY.none, function() { PANEL_INSPECTOR.anim_toggling = true; }); group_menu = [ menuItem("Expand all", function() { @@ -406,7 +410,7 @@ function Panel_Inspector() : PanelContent() constructor { if(_hover && point_in_rectangle(_m[0], _m[1], 4, _selY, contentPane.surface_w - ui(4), _selY + _selH)) { draw_sprite_stretched_ext(THEME.prop_selecting, 0, 4, _selY, contentPane.surface_w - ui(8), _selH, COLORS._main_accent, 1); if(anim_toggling) { - jun.animator.is_anim = !jun.animator.is_anim; + jun.setAnim(!jun.is_anim); PANEL_ANIMATION.updatePropertyList(); anim_toggling = false; } @@ -420,15 +424,26 @@ function Panel_Inspector() : PanelContent() constructor { var _menuItem = []; if(i < amoIn) { - array_push(_menuItem, menuItem(get_text("panel_inspector_reset", "Reset value"), function() { + array_push(_menuItem, + menuItem(get_text("panel_inspector_reset", "Reset value"), function() { __dialog_junction.setValue(__dialog_junction.def_val); }), - menuItem(jun.animator.is_anim? get_text("panel_inspector_remove", "Remove animation") : get_text("panel_inspector_add", "Add animation"), function() { - __dialog_junction.animator.is_anim = !__dialog_junction.animator.is_anim; + menuItem(jun.is_anim? get_text("panel_inspector_remove", "Remove animation") : get_text("panel_inspector_add", "Add animation"), function() { + __dialog_junction.setAnim(!__dialog_junction.is_anim); PANEL_ANIMATION.updatePropertyList(); }), - -1, ); + + if(jun.sepable) { + array_push(_menuItem, + menuItem(jun.sep_axis? get_text("panel_inspector_axis_combine", "Combine axis") : get_text("panel_inspector_axis_separate", "Separate axis"), function() { + __dialog_junction.sep_axis = !__dialog_junction.sep_axis; + PANEL_ANIMATION.updatePropertyList(); + }), + ); + } + + array_push(_menuItem, -1); } array_push(_menuItem, @@ -516,9 +531,12 @@ function Panel_Inspector() : PanelContent() constructor { draw_sprite_stretched(THEME.ui_panel_bg, 1, ui(8), top_bar_h - ui(8), w - ui(16), h - top_bar_h); - if(inspecting) + if(inspecting) { + title = inspecting.display_name == ""? inspecting.name : inspecting.display_name; drawInspectingNode(); - else { + } else { + title = "Inspector"; + var txt = "Untitled"; var context = PANEL_GRAPH.getCurrentContext(); diff --git a/scripts/panel_preview/panel_preview.gml b/scripts/panel_preview/panel_preview.gml index 9956c8991..cbd5744ad 100644 --- a/scripts/panel_preview/panel_preview.gml +++ b/scripts/panel_preview/panel_preview.gml @@ -1,6 +1,7 @@ function Panel_Preview() : PanelContent() constructor { title = "Preview"; context_str = "Preview"; + icon = THEME.panel_preview; last_focus = noone; @@ -35,6 +36,8 @@ function Panel_Preview() : PanelContent() constructor { preview_surface = [ 0, 0 ]; tile_surface = surface_create(1, 1); + inspect_node = noone; + preview_x = 0; preview_x_to = 0; preview_x_max = 0; @@ -138,12 +141,11 @@ function Panel_Preview() : PanelContent() constructor { tb_framerate = new textBox(TEXTBOX_INPUT.number, function(val) { preview_rate = real(val); }); - addHotkey("Preview", "Focus content", "F", MOD_KEY.none, function() { fullView(); }); - addHotkey("Preview", "Save current frame", "S", MOD_KEY.shift, function() { saveCurrentFrame(); }); - addHotkey("Preview", "Save all current frame", -1, MOD_KEY.none, function() { saveAllCurrentFrames(); }); - addHotkey("Preview", "Preview window", "P", MOD_KEY.ctrl, function() { previewWindow(getNodePreview()); }); - - addHotkey("Preview", "Toggle grid", "G", MOD_KEY.ctrl, function() { grid_show = !grid_show; }); + addHotkey("Preview", "Focus content", "F", MOD_KEY.none, function() { PANEL_PREVIEW.fullView(); }); + addHotkey("Preview", "Save current frame", "S", MOD_KEY.shift, function() { PANEL_PREVIEW.saveCurrentFrame(); }); + addHotkey("Preview", "Save all current frame", -1, MOD_KEY.none, function() { PANEL_PREVIEW.saveAllCurrentFrames(); }); + addHotkey("Preview", "Preview window", "P", MOD_KEY.ctrl, function() { PANEL_PREVIEW.previewWindow(PANEL_PREVIEW.getNodePreview()); }); + addHotkey("Preview", "Toggle grid", "G", MOD_KEY.ctrl, function() { PANEL_PREVIEW.grid_show = !PANEL_PREVIEW.grid_show; }); function setNodePreview(node) { if(resetViewOnDoubleClick) @@ -233,9 +235,11 @@ function Panel_Preview() : PanelContent() constructor { } var _canvas_s = canvas_s; - var inc = 0.5; + var inc = 0.1; if(canvas_s > 16) inc = 2; else if(canvas_s > 8) inc = 1; + else if(canvas_s > 3) inc = 0.5; + else if(canvas_s > 1) inc = 0.25; if(mouse_wheel_down()) canvas_s = max(round(canvas_s / inc) * inc - inc, 0.10); if(mouse_wheel_up()) canvas_s = min(round(canvas_s / inc) * inc + inc, 64); @@ -341,6 +345,10 @@ function Panel_Preview() : PanelContent() constructor { var ssh = surface_get_height(preview_surface[1]); } + var _node = getNodePreview(); + if(_node) + title = _node.display_name == ""? _node.name : _node.display_name; + switch(splitView) { case 0 : if(is_surface(preview_surface[0])) { @@ -799,7 +807,7 @@ function Panel_Preview() : PanelContent() constructor { } else draw_line_width(sx, 0, sx, h, 1); - draw_sprite_ui_uniform(THEME.icon_active_split, 0, splitSelection? sx + ui(16) : sx - ui(16), ui(16),, COLORS._main_accent); + draw_sprite_ui_uniform(THEME.icon_active_split, 0, splitSelection? sx + ui(16) : sx - ui(16), toolbar_height + ui(16),, COLORS._main_accent); if(mouse_on_preview && mouse_press(mb_left, pFOCUS)) { if(point_in_rectangle(mx, my, 0, 0, sx, h)) @@ -839,15 +847,20 @@ function Panel_Preview() : PanelContent() constructor { else draw_clear(canvas_bg); + title = "Preview"; + dragCanvas(); getPreviewData(); drawNodePreview(); drawPreviewOverlay(); - if(PANEL_GRAPH.node_focus) - drawNodeTools(pFOCUS, PANEL_GRAPH.node_focus); - if(last_focus != PANEL_GRAPH.node_focus) { - last_focus = PANEL_GRAPH.node_focus; + if(PANEL_PREVIEW == self) + inspect_node = PANEL_GRAPH.node_focus; + + if(inspect_node) + drawNodeTools(pFOCUS, inspect_node); + if(last_focus != inspect_node) { + last_focus = inspect_node; tool_current = noone; } diff --git a/scripts/preferences/preferences.gml b/scripts/preferences/preferences.gml index 731b67e08..7a4f0edfe 100644 --- a/scripts/preferences/preferences.gml +++ b/scripts/preferences/preferences.gml @@ -96,7 +96,7 @@ if(!ds_map_exists(HOTKEYS, _context)) { HOTKEYS[? _context] = ds_list_create(); - if(ds_list_find_index(HOTKEY_CONTEXT, _context) == -1) + if(!ds_list_exist(HOTKEY_CONTEXT, _context)) ds_list_add(HOTKEY_CONTEXT, _context); } @@ -203,6 +203,9 @@ var path = DIRECTORY + "keys.json"; file_text_write_all(path, json_encode_minify(map)); ds_map_destroy(map); + + var path = DIRECTORY + "Nodes/fav.json"; + json_save_struct(path, global.FAV_NODES); } function PREF_LOAD() { diff --git a/scripts/save_function/save_function.gml b/scripts/save_function/save_function.gml index 5486bb857..be63f8b5a 100644 --- a/scripts/save_function/save_function.gml +++ b/scripts/save_function/save_function.gml @@ -53,7 +53,9 @@ function save_serialize() { ds_map_add_map(_map, "global", GLOBAL.serialize()); - _map[? "preview"] = surface_encode(PANEL_PREVIEW.getNodePreviewSurface()); + var prev = PANEL_PREVIEW.getNodePreviewSurface(); + if(!is_surface(prev)) _map[? "preview"] = ""; + else _map[? "preview"] = surface_encode(surface_size_lim(prev, 128, 128)); var val = json_encode_minify(_map); ds_map_destroy(_map); diff --git a/scripts/shader_set_functions/shader_set_functions.gml b/scripts/shader_functions/shader_functions.gml similarity index 60% rename from scripts/shader_set_functions/shader_set_functions.gml rename to scripts/shader_functions/shader_functions.gml index 87bdad091..2dcebbe6e 100644 --- a/scripts/shader_set_functions/shader_set_functions.gml +++ b/scripts/shader_functions/shader_functions.gml @@ -52,4 +52,44 @@ function shader_set_surface(shader, sampler, surface) { var t = shader_get_sampler_index(shader, sampler); texture_set_stage(t, surface_get_texture(surface)); -} \ No newline at end of file +} + +#region prebuild + enum BLEND { + normal, + add, + over, + alpha, + alphamulp, + } + + function shader_set_interpolation(surface) { + var shader = shader_current(); + var intp = ds_map_try_get(attributes, "interpolation", 0); + + gpu_set_tex_filter(intp); + shader_set_i(shader, "interpolation", intp); + shader_set_f(shader, "sampleDimension", surface_get_width(surface), surface_get_height(surface)); + } + + function surface_set_shader(surface, shader = sh_sample, clear = true, blend = BLEND.over) { + surface_set_target(surface); + if(clear) DRAW_CLEAR; + + switch(blend) { + case BLEND.add : BLEND_ADD; break; + case BLEND.over: BLEND_OVERRIDE; break; + case BLEND.alpha: BLEND_ALPHA; break; + case BLEND.alphamulp: BLEND_ALPHA_MULP; break; + } + + shader_set(shader); + } + + function surface_reset_shader() { + gpu_set_tex_filter(false); + BLEND_NORMAL; + surface_reset_target(); + shader_reset(); + } +#endregion \ No newline at end of file diff --git a/scripts/shader_set_functions/shader_set_functions.yy b/scripts/shader_functions/shader_functions.yy similarity index 84% rename from scripts/shader_set_functions/shader_set_functions.yy rename to scripts/shader_functions/shader_functions.yy index 49781da0c..f62463051 100644 --- a/scripts/shader_set_functions/shader_set_functions.yy +++ b/scripts/shader_functions/shader_functions.yy @@ -1,7 +1,7 @@ { "resourceType": "GMScript", "resourceVersion": "1.0", - "name": "shader_set_functions", + "name": "shader_functions", "isCompatibility": false, "isDnD": false, "parent": { diff --git a/scripts/sprite_loader/sprite_loader.gml b/scripts/sprite_loader/sprite_loader.gml index f1e0caa8d..1248f4f22 100644 --- a/scripts/sprite_loader/sprite_loader.gml +++ b/scripts/sprite_loader/sprite_loader.gml @@ -1,4 +1,4 @@ -function __init_theme() { +function __initTheme() { var root = DIRECTORY + "Themes"; if(!directory_exists(root)) directory_create(root); diff --git a/scripts/surface_functions/surface_functions.gml b/scripts/surface_functions/surface_functions.gml index a1d3d1d9d..e3a74c948 100644 --- a/scripts/surface_functions/surface_functions.gml +++ b/scripts/surface_functions/surface_functions.gml @@ -158,6 +158,20 @@ function surface_create_from_sprite_ext(spr, ind, format = surface_rgba8unorm) { return s; } +function surface_size_lim(surface, width, height) { + var sw = surface_get_width(surface); + var sh = surface_get_height(surface); + if(sw <= width && sh <= height) return surface; + + var ss = min(width / sw, height / sh); + var s = surface_create(sw * ss, sh * ss); + surface_set_target(s); + DRAW_CLEAR; + draw_surface_ext(surface, 0, 0, ss, ss, 0, c_white, 1); + surface_reset_target(); + return s; +} + function surface_size_to(surface, width, height, format = noone) { if(!is_surface(surface)) return surface; if(width < 1 && height < 1) return surface; diff --git a/shaders/sh_camera/sh_camera.yy b/shaders/sh_camera/sh_camera.yy index 59c27599b..03c6957b7 100644 --- a/shaders/sh_camera/sh_camera.yy +++ b/shaders/sh_camera/sh_camera.yy @@ -3,8 +3,8 @@ "resourceVersion": "1.0", "name": "sh_camera", "parent": { - "name": "shader", - "path": "folders/shader.yy", + "name": "misc", + "path": "folders/shader/misc.yy", }, "type": 1, } \ No newline at end of file diff --git a/shaders/sh_chromatic_aberration/sh_chromatic_aberration.fsh b/shaders/sh_chromatic_aberration/sh_chromatic_aberration.fsh index b36477850..f56101fe9 100644 --- a/shaders/sh_chromatic_aberration/sh_chromatic_aberration.fsh +++ b/shaders/sh_chromatic_aberration/sh_chromatic_aberration.fsh @@ -8,6 +8,54 @@ uniform vec2 dimension; uniform vec2 center; uniform float strength; +/////////////// SAMPLING /////////////// + +const float PI = 3.14159265358979323846; +uniform int interpolation; +uniform vec2 sampleDimension; + +const int RSIN_RADIUS = 1; + +float sinc ( float x ) { return x == 0.? 1. : sin(x * PI) / (x * PI); } + +vec4 texture2D_rsin( sampler2D texture, vec2 uv ) { + vec2 tx = 1.0 / sampleDimension; + vec2 p = uv * sampleDimension - vec2(0.5); + + vec4 sum = vec4(0.0); + float weights = 0.; + + for (int x = -RSIN_RADIUS; x <= RSIN_RADIUS; x++) + for (int y = -RSIN_RADIUS; y <= RSIN_RADIUS; y++) { + float a = length(vec2(float(x), float(y))) / float(RSIN_RADIUS); + if(a > 1.) continue; + float w = sinc(a * PI * tx.x) * sinc(a * PI * tx.y); + vec2 offset = vec2(float(x), float(y)) * tx; + vec4 sample = texture2D(texture, (p + offset + vec2(0.5)) / sampleDimension); + sum += w * sample; + weights += w; + } + + return sum / weights; +} + +vec4 texture2D_bicubic( sampler2D texture, vec2 uv ) { + uv = uv * sampleDimension + 0.5; + vec2 iuv = floor( uv ); + vec2 fuv = fract( uv ); + uv = iuv + fuv * fuv * (3.0 - 2.0 * fuv); + uv = (uv - 0.5) / sampleDimension; + return texture2D( texture, uv ); +} + +vec4 texture2Dintp( sampler2D texture, vec2 uv ) { + if(interpolation == 2) return texture2D_bicubic( texture, uv ); + else if(interpolation == 3) return texture2D_rsin( texture, uv ); + return texture2D( texture, uv ); +} + +/////////////// SAMPLING /////////////// + void main() { vec2 texel = 1.0 / dimension; vec2 coords = (v_vTexcoord - center / dimension) * 2.0; @@ -18,12 +66,12 @@ void main() { vec2 uvB = v_vTexcoord + texel.xy * precompute; vec4 color; - color.r = texture2D(gm_BaseTexture, uvR).r; - color.g = texture2D(gm_BaseTexture, v_vTexcoord).g; - color.b = texture2D(gm_BaseTexture, uvB).b; - color.a = texture2D(gm_BaseTexture, v_vTexcoord).a + - texture2D(gm_BaseTexture, uvR).a + - texture2D(gm_BaseTexture, uvB).a; + color.r = texture2Dintp(gm_BaseTexture, uvR).r; + color.g = texture2Dintp(gm_BaseTexture, v_vTexcoord).g; + color.b = texture2Dintp(gm_BaseTexture, uvB).b; + color.a = texture2Dintp(gm_BaseTexture, v_vTexcoord).a + + texture2Dintp(gm_BaseTexture, uvR).a + + texture2Dintp(gm_BaseTexture, uvB).a; gl_FragColor = color; } diff --git a/shaders/sh_content_sampler/sh_content_sampler.yy b/shaders/sh_content_sampler/sh_content_sampler.yy index ce1d27f25..44f6b7085 100644 --- a/shaders/sh_content_sampler/sh_content_sampler.yy +++ b/shaders/sh_content_sampler/sh_content_sampler.yy @@ -3,8 +3,8 @@ "resourceVersion": "1.0", "name": "sh_content_sampler", "parent": { - "name": "shader", - "path": "folders/shader.yy", + "name": "misc", + "path": "folders/shader/misc.yy", }, "type": 1, } \ No newline at end of file diff --git a/shaders/sh_dilate/sh_dilate.fsh b/shaders/sh_dilate/sh_dilate.fsh index 7a74bfb5a..971cd2f94 100644 --- a/shaders/sh_dilate/sh_dilate.fsh +++ b/shaders/sh_dilate/sh_dilate.fsh @@ -10,16 +10,64 @@ uniform float strength; uniform float radius; uniform int sampleMode; +/////////////// SAMPLING /////////////// + +const float PI = 3.14159265358979323846; +uniform int interpolation; +uniform vec2 sampleDimension; + +const int RSIN_RADIUS = 1; + +float sinc ( float x ) { return x == 0.? 1. : sin(x * PI) / (x * PI); } + +vec4 texture2D_rsin( sampler2D texture, vec2 uv ) { + vec2 tx = 1.0 / sampleDimension; + vec2 p = uv * sampleDimension - vec2(0.5); + + vec4 sum = vec4(0.0); + float weights = 0.; + + for (int x = -RSIN_RADIUS; x <= RSIN_RADIUS; x++) + for (int y = -RSIN_RADIUS; y <= RSIN_RADIUS; y++) { + float a = length(vec2(float(x), float(y))) / float(RSIN_RADIUS); + if(a > 1.) continue; + float w = sinc(a * PI * tx.x) * sinc(a * PI * tx.y); + vec2 offset = vec2(float(x), float(y)) * tx; + vec4 sample = texture2D(texture, (p + offset + vec2(0.5)) / sampleDimension); + sum += w * sample; + weights += w; + } + + return sum / weights; +} + +vec4 texture2D_bicubic( sampler2D texture, vec2 uv ) { + uv = uv * sampleDimension + 0.5; + vec2 iuv = floor( uv ); + vec2 fuv = fract( uv ); + uv = iuv + fuv * fuv * (3.0 - 2.0 * fuv); + uv = (uv - 0.5) / sampleDimension; + return texture2D( texture, uv ); +} + +vec4 texture2Dintp( sampler2D texture, vec2 uv ) { + if(interpolation == 2) return texture2D_bicubic( texture, uv ); + else if(interpolation == 3) return texture2D_rsin( texture, uv ); + return texture2D( texture, uv ); +} + +/////////////// SAMPLING /////////////// + vec4 sampleTexture(vec2 pos) { if(pos.x >= 0. && pos.y >= 0. && pos.x <= 1. && pos.y <= 1.) - return texture2D(gm_BaseTexture, pos); + return texture2Dintp(gm_BaseTexture, pos); if(sampleMode == 0) return vec4(0.); if(sampleMode == 1) - return texture2D(gm_BaseTexture, clamp(pos, 0., 1.)); + return texture2Dintp(gm_BaseTexture, clamp(pos, 0., 1.)); if(sampleMode == 2) - return texture2D(gm_BaseTexture, fract(pos)); + return texture2Dintp(gm_BaseTexture, fract(pos)); return vec4(0.); } diff --git a/shaders/sh_displace/sh_displace.fsh b/shaders/sh_displace/sh_displace.fsh index 893dbb7bc..0dc8ea1ff 100644 --- a/shaders/sh_displace/sh_displace.fsh +++ b/shaders/sh_displace/sh_displace.fsh @@ -14,28 +14,74 @@ uniform int iterate; uniform int use_rg; uniform int sampleMode; -#define PI 3.14159265359 - float bright(in vec4 col) { return dot(col.rgb, vec3(0.2126, 0.7152, 0.0722)) * col.a; } +/////////////// SAMPLING /////////////// + +const float PI = 3.14159265358979323846; +uniform int interpolation; +uniform vec2 sampleDimension; + +const int RSIN_RADIUS = 1; + +float sinc ( float x ) { return x == 0.? 1. : sin(x * PI) / (x * PI); } + +vec4 texture2D_rsin( sampler2D texture, vec2 uv ) { + vec2 tx = 1.0 / sampleDimension; + vec2 p = uv * sampleDimension - vec2(0.5); + + vec4 sum = vec4(0.0); + float weights = 0.; + + for (int x = -RSIN_RADIUS; x <= RSIN_RADIUS; x++) + for (int y = -RSIN_RADIUS; y <= RSIN_RADIUS; y++) { + float a = length(vec2(float(x), float(y))) / float(RSIN_RADIUS); + if(a > 1.) continue; + float w = sinc(a * PI * tx.x) * sinc(a * PI * tx.y); + vec2 offset = vec2(float(x), float(y)) * tx; + vec4 sample = texture2D(texture, (p + offset + vec2(0.5)) / sampleDimension); + sum += w * sample; + weights += w; + } + + return sum / weights; +} + +vec4 texture2D_bicubic( sampler2D texture, vec2 uv ) { + uv = uv * sampleDimension + 0.5; + vec2 iuv = floor( uv ); + vec2 fuv = fract( uv ); + uv = iuv + fuv * fuv * (3.0 - 2.0 * fuv); + uv = (uv - 0.5) / sampleDimension; + return texture2D( texture, uv ); +} + +vec4 texture2Dintp( sampler2D texture, vec2 uv ) { + if(interpolation == 2) return texture2D_bicubic( texture, uv ); + else if(interpolation == 3) return texture2D_rsin( texture, uv ); + return texture2D( texture, uv ); +} + +/////////////// SAMPLING /////////////// + vec4 sampleTexture(vec2 pos) { if(pos.x >= 0. && pos.y >= 0. && pos.x <= 1. && pos.y <= 1.) - return texture2D(gm_BaseTexture, pos); + return texture2Dintp(gm_BaseTexture, pos); if(sampleMode == 0) return vec4(0.); if(sampleMode == 1) - return texture2D(gm_BaseTexture, clamp(pos, 0., 1.)); + return texture2Dintp(gm_BaseTexture, clamp(pos, 0., 1.)); if(sampleMode == 2) - return texture2D(gm_BaseTexture, fract(pos)); + return texture2Dintp(gm_BaseTexture, fract(pos)); return vec4(0.); } vec2 shiftMap(in vec2 pos, in float str) { - vec4 disP = texture2D( map, pos ); + vec4 disP = texture2Dintp( map, pos ); vec2 sam_pos; vec2 raw_displace = displace / dimension; float _str; diff --git a/shaders/sh_find_boundary/sh_find_boundary.yy b/shaders/sh_find_boundary/sh_find_boundary.yy index e128aed57..31c6f0464 100644 --- a/shaders/sh_find_boundary/sh_find_boundary.yy +++ b/shaders/sh_find_boundary/sh_find_boundary.yy @@ -3,8 +3,8 @@ "resourceVersion": "1.0", "name": "sh_find_boundary", "parent": { - "name": "shader", - "path": "folders/shader.yy", + "name": "misc", + "path": "folders/shader/misc.yy", }, "type": 1, } \ No newline at end of file diff --git a/shaders/sh_find_pixel/sh_find_pixel.yy b/shaders/sh_find_pixel/sh_find_pixel.yy index b74186321..0536764cd 100644 --- a/shaders/sh_find_pixel/sh_find_pixel.yy +++ b/shaders/sh_find_pixel/sh_find_pixel.yy @@ -3,8 +3,8 @@ "resourceVersion": "1.0", "name": "sh_find_pixel", "parent": { - "name": "shader", - "path": "folders/shader.yy", + "name": "misc", + "path": "folders/shader/misc.yy", }, "type": 1, } \ No newline at end of file diff --git a/shaders/sh_mesh_generation/sh_mesh_generation.yy b/shaders/sh_mesh_generation/sh_mesh_generation.yy index 974465c30..b63f4ff16 100644 --- a/shaders/sh_mesh_generation/sh_mesh_generation.yy +++ b/shaders/sh_mesh_generation/sh_mesh_generation.yy @@ -3,8 +3,8 @@ "resourceVersion": "1.0", "name": "sh_mesh_generation", "parent": { - "name": "shader", - "path": "folders/shader.yy", + "name": "misc", + "path": "folders/shader/misc.yy", }, "type": 1, } \ No newline at end of file diff --git a/shaders/sh_normal/sh_normal.fsh b/shaders/sh_normal/sh_normal.fsh index 61828cee2..a216afd0b 100644 --- a/shaders/sh_normal/sh_normal.fsh +++ b/shaders/sh_normal/sh_normal.fsh @@ -8,9 +8,7 @@ uniform vec2 dimension; uniform float height; uniform int smooth; -float bright(in vec4 col) { - return dot(col.rgb, vec3(0.2126, 0.7152, 0.0722)) * col.a; -} +float bright(in vec4 col) { return dot(col.rgb, vec3(0.2126, 0.7152, 0.0722)) * col.a; } void main() { vec2 pixelStep = 1. / dimension; diff --git a/shaders/sh_polar/sh_polar.fsh b/shaders/sh_polar/sh_polar.fsh index 128bbdb8b..30069808d 100644 --- a/shaders/sh_polar/sh_polar.fsh +++ b/shaders/sh_polar/sh_polar.fsh @@ -4,13 +4,58 @@ varying vec2 v_vTexcoord; varying vec4 v_vColour; -#define pi2 1.57079 -#define pi 3.14159265 +/////////////// SAMPLING /////////////// + +const float PI = 3.14159265358979323846; +uniform int interpolation; +uniform vec2 sampleDimension; + +const int RSIN_RADIUS = 1; + +float sinc ( float x ) { return x == 0.? 1. : sin(x * PI) / (x * PI); } + +vec4 texture2D_rsin( sampler2D texture, vec2 uv ) { + vec2 tx = 1.0 / sampleDimension; + vec2 p = uv * sampleDimension - vec2(0.5); + + vec4 sum = vec4(0.0); + float weights = 0.; + + for (int x = -RSIN_RADIUS; x <= RSIN_RADIUS; x++) + for (int y = -RSIN_RADIUS; y <= RSIN_RADIUS; y++) { + float a = length(vec2(float(x), float(y))) / float(RSIN_RADIUS); + if(a > 1.) continue; + float w = sinc(a * PI * tx.x) * sinc(a * PI * tx.y); + vec2 offset = vec2(float(x), float(y)) * tx; + vec4 sample = texture2D(texture, (p + offset + vec2(0.5)) / sampleDimension); + sum += w * sample; + weights += w; + } + + return sum / weights; +} + +vec4 texture2D_bicubic( sampler2D texture, vec2 uv ) { + uv = uv * sampleDimension + 0.5; + vec2 iuv = floor( uv ); + vec2 fuv = fract( uv ); + uv = iuv + fuv * fuv * (3.0 - 2.0 * fuv); + uv = (uv - 0.5) / sampleDimension; + return texture2D( texture, uv ); +} + +vec4 texture2Dintp( sampler2D texture, vec2 uv ) { + if(interpolation == 2) return texture2D_bicubic( texture, uv ); + else if(interpolation == 3) return texture2D_rsin( texture, uv ); + return texture2D( texture, uv ); +} + +/////////////// SAMPLING /////////////// void main() { vec2 center = v_vTexcoord - vec2(0.5, 0.5); float radius = distance(v_vTexcoord, vec2(0.5, 0.5)) / (sqrt(2.) * .5); - float angle = (atan(center.y, center.x) / pi + 1.) / 2.; + float angle = (atan(center.y, center.x) / PI + 1.) / 2.; vec2 polar = vec2(radius, angle); gl_FragColor = v_vColour * texture2D( gm_BaseTexture, polar ); diff --git a/shaders/sh_sample/sh_sample.fsh b/shaders/sh_sample/sh_sample.fsh new file mode 100644 index 000000000..1170e64a8 --- /dev/null +++ b/shaders/sh_sample/sh_sample.fsh @@ -0,0 +1,57 @@ +// +// Simple passthrough fragment shader +// +varying vec2 v_vTexcoord; +varying vec4 v_vColour; + +/////////////// SAMPLING /////////////// + +const float PI = 3.14159265358979323846; +uniform int interpolation; +uniform vec2 sampleDimension; + +const int RSIN_RADIUS = 1; + +float sinc ( float x ) { return x == 0.? 1. : sin(x * PI) / (x * PI); } + +vec4 texture2D_rsin( sampler2D texture, vec2 uv ) { + vec2 tx = 1.0 / sampleDimension; + vec2 p = uv * sampleDimension - vec2(0.5); + + vec4 sum = vec4(0.0); + float weights = 0.; + + for (int x = -RSIN_RADIUS; x <= RSIN_RADIUS; x++) + for (int y = -RSIN_RADIUS; y <= RSIN_RADIUS; y++) { + float a = length(vec2(float(x), float(y))) / float(RSIN_RADIUS); + if(a > 1.) continue; + float w = sinc(a * PI * tx.x) * sinc(a * PI * tx.y); + vec2 offset = vec2(float(x), float(y)) * tx; + vec4 sample = texture2D(texture, (p + offset + vec2(0.5)) / sampleDimension); + sum += w * sample; + weights += w; + } + + return sum / weights; +} + +vec4 texture2D_bicubic( sampler2D texture, vec2 uv ) { + uv = uv * sampleDimension + 0.5; + vec2 iuv = floor( uv ); + vec2 fuv = fract( uv ); + uv = iuv + fuv * fuv * (3.0 - 2.0 * fuv); + uv = (uv - 0.5) / sampleDimension; + return texture2D( texture, uv ); +} + +vec4 texture2Dintp( sampler2D texture, vec2 uv ) { + if(interpolation == 2) return texture2D_bicubic( texture, uv ); + else if(interpolation == 3) return texture2D_rsin( texture, uv ); + return texture2D( texture, uv ); +} + +/////////////// SAMPLING /////////////// + +void main() { + gl_FragColor = texture2Dintp( gm_BaseTexture, v_vTexcoord ); +} \ No newline at end of file diff --git a/shaders/sh_sample/sh_sample.vsh b/shaders/sh_sample/sh_sample.vsh new file mode 100644 index 000000000..3900c20f4 --- /dev/null +++ b/shaders/sh_sample/sh_sample.vsh @@ -0,0 +1,19 @@ +// +// Simple passthrough vertex shader +// +attribute vec3 in_Position; // (x,y,z) +//attribute vec3 in_Normal; // (x,y,z) unused in this shader. +attribute vec4 in_Colour; // (r,g,b,a) +attribute vec2 in_TextureCoord; // (u,v) + +varying vec2 v_vTexcoord; +varying vec4 v_vColour; + +void main() +{ + vec4 object_space_pos = vec4( in_Position.x, in_Position.y, in_Position.z, 1.0); + gl_Position = gm_Matrices[MATRIX_WORLD_VIEW_PROJECTION] * object_space_pos; + + v_vColour = in_Colour; + v_vTexcoord = in_TextureCoord; +} diff --git a/shaders/sh_sample/sh_sample.yy b/shaders/sh_sample/sh_sample.yy new file mode 100644 index 000000000..7b98400d5 --- /dev/null +++ b/shaders/sh_sample/sh_sample.yy @@ -0,0 +1,10 @@ +{ + "resourceType": "GMShader", + "resourceVersion": "1.0", + "name": "sh_sample", + "parent": { + "name": "_helper", + "path": "folders/shader/_helper.yy", + }, + "type": 1, +} \ No newline at end of file diff --git a/shaders/sh_skew/sh_skew.fsh b/shaders/sh_skew/sh_skew.fsh index 83a11e63c..20c62c780 100644 --- a/shaders/sh_skew/sh_skew.fsh +++ b/shaders/sh_skew/sh_skew.fsh @@ -10,16 +10,64 @@ uniform int axis; uniform float amount; uniform int sampleMode; +/////////////// SAMPLING /////////////// + +const float PI = 3.14159265358979323846; +uniform int interpolation; +uniform vec2 sampleDimension; + +const int RSIN_RADIUS = 1; + +float sinc ( float x ) { return x == 0.? 1. : sin(x * PI) / (x * PI); } + +vec4 texture2D_rsin( sampler2D texture, vec2 uv ) { + vec2 tx = 1.0 / sampleDimension; + vec2 p = uv * sampleDimension - vec2(0.5); + + vec4 sum = vec4(0.0); + float weights = 0.; + + for (int x = -RSIN_RADIUS; x <= RSIN_RADIUS; x++) + for (int y = -RSIN_RADIUS; y <= RSIN_RADIUS; y++) { + float a = length(vec2(float(x), float(y))) / float(RSIN_RADIUS); + if(a > 1.) continue; + float w = sinc(a * PI * tx.x) * sinc(a * PI * tx.y); + vec2 offset = vec2(float(x), float(y)) * tx; + vec4 sample = texture2D(texture, (p + offset + vec2(0.5)) / sampleDimension); + sum += w * sample; + weights += w; + } + + return sum / weights; +} + +vec4 texture2D_bicubic( sampler2D texture, vec2 uv ) { + uv = uv * sampleDimension + 0.5; + vec2 iuv = floor( uv ); + vec2 fuv = fract( uv ); + uv = iuv + fuv * fuv * (3.0 - 2.0 * fuv); + uv = (uv - 0.5) / sampleDimension; + return texture2D( texture, uv ); +} + +vec4 texture2Dintp( sampler2D texture, vec2 uv ) { + if(interpolation == 2) return texture2D_bicubic( texture, uv ); + else if(interpolation == 3) return texture2D_rsin( texture, uv ); + return texture2D( texture, uv ); +} + +/////////////// SAMPLING /////////////// + vec4 sampleTexture(vec2 pos) { if(pos.x >= 0. && pos.y >= 0. && pos.x <= 1. && pos.y <= 1.) - return texture2D(gm_BaseTexture, pos); + return texture2Dintp(gm_BaseTexture, pos); if(sampleMode == 0) return vec4(0.); if(sampleMode == 1) - return texture2D(gm_BaseTexture, clamp(pos, 0., 1.)); + return texture2Dintp(gm_BaseTexture, clamp(pos, 0., 1.)); if(sampleMode == 2) - return texture2D(gm_BaseTexture, fract(pos)); + return texture2Dintp(gm_BaseTexture, fract(pos)); return vec4(0.); } diff --git a/shaders/sh_texture_remap/sh_texture_remap.fsh b/shaders/sh_texture_remap/sh_texture_remap.fsh index 4396381f4..5f08a8e38 100644 --- a/shaders/sh_texture_remap/sh_texture_remap.fsh +++ b/shaders/sh_texture_remap/sh_texture_remap.fsh @@ -6,11 +6,59 @@ varying vec4 v_vColour; uniform sampler2D map; +/////////////// SAMPLING /////////////// + +const float PI = 3.14159265358979323846; +uniform int interpolation; +uniform vec2 sampleDimension; + +const int RSIN_RADIUS = 1; + +float sinc ( float x ) { return x == 0.? 1. : sin(x * PI) / (x * PI); } + +vec4 texture2D_rsin( sampler2D texture, vec2 uv ) { + vec2 tx = 1.0 / sampleDimension; + vec2 p = uv * sampleDimension - vec2(0.5); + + vec4 sum = vec4(0.0); + float weights = 0.; + + for (int x = -RSIN_RADIUS; x <= RSIN_RADIUS; x++) + for (int y = -RSIN_RADIUS; y <= RSIN_RADIUS; y++) { + float a = length(vec2(float(x), float(y))) / float(RSIN_RADIUS); + if(a > 1.) continue; + float w = sinc(a * PI * tx.x) * sinc(a * PI * tx.y); + vec2 offset = vec2(float(x), float(y)) * tx; + vec4 sample = texture2D(texture, (p + offset + vec2(0.5)) / sampleDimension); + sum += w * sample; + weights += w; + } + + return sum / weights; +} + +vec4 texture2D_bicubic( sampler2D texture, vec2 uv ) { + uv = uv * sampleDimension + 0.5; + vec2 iuv = floor( uv ); + vec2 fuv = fract( uv ); + uv = iuv + fuv * fuv * (3.0 - 2.0 * fuv); + uv = (uv - 0.5) / sampleDimension; + return texture2D( texture, uv ); +} + +vec4 texture2Dintp( sampler2D texture, vec2 uv ) { + if(interpolation == 2) return texture2D_bicubic( texture, uv ); + else if(interpolation == 3) return texture2D_rsin( texture, uv ); + return texture2D( texture, uv ); +} + +/////////////// SAMPLING /////////////// + void main() { - vec4 map = texture2D( map, v_vTexcoord ); + vec4 map = texture2Dintp( map, v_vTexcoord ); vec2 pos = map.rg; - vec4 samp = texture2D( gm_BaseTexture, 1. - vec2(1. - pos.x, pos.y) ); + vec4 samp = texture2Dintp( gm_BaseTexture, 1. - vec2(1. - pos.x, pos.y) ); samp.a *= map.a; gl_FragColor = samp; diff --git a/shaders/sh_twirl/sh_twirl.fsh b/shaders/sh_twirl/sh_twirl.fsh index 2ad5aa490..bcdffc6e3 100644 --- a/shaders/sh_twirl/sh_twirl.fsh +++ b/shaders/sh_twirl/sh_twirl.fsh @@ -9,17 +9,63 @@ uniform vec2 center; uniform float strength; uniform float radius; uniform int sampleMode; +/////////////// SAMPLING /////////////// +const float PI = 3.14159265358979323846; +uniform int interpolation; +uniform vec2 sampleDimension; + +const int RSIN_RADIUS = 1; + +float sinc ( float x ) { return x == 0.? 1. : sin(x * PI) / (x * PI); } + +vec4 texture2D_rsin( sampler2D texture, vec2 uv ) { + vec2 tx = 1.0 / sampleDimension; + vec2 p = uv * sampleDimension - vec2(0.5); + + vec4 sum = vec4(0.0); + float weights = 0.; + + for (int x = -RSIN_RADIUS; x <= RSIN_RADIUS; x++) + for (int y = -RSIN_RADIUS; y <= RSIN_RADIUS; y++) { + float a = length(vec2(float(x), float(y))) / float(RSIN_RADIUS); + if(a > 1.) continue; + float w = sinc(a * PI * tx.x) * sinc(a * PI * tx.y); + vec2 offset = vec2(float(x), float(y)) * tx; + vec4 sample = texture2D(texture, (p + offset + vec2(0.5)) / sampleDimension); + sum += w * sample; + weights += w; + } + + return sum / weights; +} + +vec4 texture2D_bicubic( sampler2D texture, vec2 uv ) { + uv = uv * sampleDimension + 0.5; + vec2 iuv = floor( uv ); + vec2 fuv = fract( uv ); + uv = iuv + fuv * fuv * (3.0 - 2.0 * fuv); + uv = (uv - 0.5) / sampleDimension; + return texture2D( texture, uv ); +} + +vec4 texture2Dintp( sampler2D texture, vec2 uv ) { + if(interpolation == 2) return texture2D_bicubic( texture, uv ); + else if(interpolation == 3) return texture2D_rsin( texture, uv ); + return texture2D( texture, uv ); +} + +/////////////// SAMPLING /////////////// vec4 sampleTexture(vec2 pos) { if(pos.x >= 0. && pos.y >= 0. && pos.x <= 1. && pos.y <= 1.) - return texture2D(gm_BaseTexture, pos); + return texture2Dintp(gm_BaseTexture, pos); if(sampleMode == 0) return vec4(0.); if(sampleMode == 1) - return texture2D(gm_BaseTexture, clamp(pos, 0., 1.)); + return texture2Dintp(gm_BaseTexture, clamp(pos, 0., 1.)); if(sampleMode == 2) - return texture2D(gm_BaseTexture, fract(pos)); + return texture2Dintp(gm_BaseTexture, fract(pos)); return vec4(0.); }