diff --git a/images/search.ai b/images/search.ai new file mode 100644 index 00000000..02c90ebe --- /dev/null +++ b/images/search.ai @@ -0,0 +1,4993 @@ +%PDF-1.5 % +1 0 obj <>/OCGs[5 0 R]>>/Pages 3 0 R/Type/Catalog>> endobj 2 0 obj <>stream + + + + + application/pdf + + + search + + + + + 2012-10-06T15:55:55+02:00 + 2012-10-06T15:55:55+02:00 + 2012-10-06T15:55:55+02:00 + Adobe Illustrator CS5.1 + + + + 244 + 256 + JPEG + /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgBAAD0AwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYq7 FXYq7FXYq7FXYqwjzv8AnT+Wvkv1I9b1qEXyV/3G23+kXVR+y0cdeFf+LOIxV4f5q/5zaALxeVPL tQD8F3qknUe9vAf+Z2KvLNe/5ye/ObV+ajWxp0DGvo2EMUNPlIVebv8Az4VYPqnn7zzq3/HT8w6l ej+W4u55ABv0DOQOuKpJJJJI3KRi7fzMST+OKrMVRVpqmp2bBrO7mtmX7LQyOhG9duJHffFWVaT+ c/5r6SyGz816nxj2SOa4e4jA6U9OcyJT6MVeh+XP+cxfzR04qmrw2Otw1BdpYvq81B1CvblIxX3j OKvX/KP/ADmL+XWrMkGvWt15fuG2Mjj61bD/AJ6RASffFTAr2vRNf0PXbFb/AEW/t9Rsn2W4tZFl StK0JQmhHcHfFUfirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVYF+Z351+R/wAvLYjV 7r6xqrpyttItqPcPX7JYVpGh/mentXpir5I/Mf8A5yZ/Mfzi0tra3J0DRmJAsbBmWR132muNpH2N CF4qf5cKvJCSTU7k9TirWKuxV2KuxV2KuxV2KuxV2Kpr5d80+Y/LWoLqGgalcaZeCgMttIycgDXi 4Gzr/ksCMVfS35Xf85jB3i038wrYJWiLrtmm25A5XFuv3lov+AxV9NaTq+l6vp8GpaXdRXthcrzg uYHEkbr7MuBUXirsVdirsVdirsVdirsVdirsVdirsVdirsVdir5o/PL/AJypi0x7jy55BmSfUFJj vNeHGSGIjqlsDVZH8XPwjtXqCr5Nvr69v7ua9vp5Lq7uGMk9xMxkkdz1ZmYkk/PFVDFXYq7FXYq7 FXYq7FXYq7FXYq7FXYq7FWdflb+cXm/8udUE+kz+vpkrA32jzMTbzDYEgf7rkoNnXfxqNsVfc/5Z /ml5W/MPQhqeiTFZoqLf6dKQJ7aQ1orgdVah4uNj8wQArL8VdirsVdirsVdirsVdirsVdirsVdir sVfJP/OSf/ORc19PdeSvJt2U0+MmHWNWgYhp26PbwuP91Do7D7fQfDXkVfMuKuxV2KuxV2Ko7SNE 1nWbxbLSLG41G8f7NvaxPNIf9igY4q9N0D/nFr85dXWOR9Jj0uGTpJfzxxED/KjQyTL9KYqy62/5 wo8+sv8ApOu6VE220f1iQe+7RR4qi7j/AJwj80Lx+r+ZbGSteXqQyx08KUMlcVSHVv8AnDj817OP nZz6ZqXhHBcSRyf8l44k/wCGxV5t5r/Kb8x/KavJr3l+7tLdDRrsJ61uD/xnhMkX/DYqxLFXYq7F XYq7FU+8k+d/MfkvX4Nc0C6a2u4tpF6xzR1BaKVf2kam4+kb74q/QD8qvzR0D8xfLKaxpZ9G5iIj 1LTnYGW2mpXienJG6o9PiHgQQArMsVdirsVdirsVdirsVdirsVdirsVfPP8AzlR+dsnlzT28k+X5 +Gt6jFXVLpD8VrayD+7Wn2ZZh9Kpv1ZSFXxrhV2KuxV2Ko7RdE1fXNTg0vSLSW+1C5bhBbQqWdj8 h0A6knYDrir6l/K//nDqxhji1H8wZ/rM5ow0O0crEvtPcIQznxWMgf5TYq+jNB8uaB5fsFsND063 02zWn7i1jWJSQKcm4gcm8WO5wKmOKuxV2KuxV2KvLvzC/wCccfyz85JJMbAaPqz1K6lpyrCS2+8s QHpSb9SV5f5QxV8j/mr+RPnb8u5jNfRC/wBCZuMGs2ykxbn4VmXcwufBtj2Jwq84xV2KuxV2Ksy/ Kn8y9Y/Lzzbb65YEy2xpFqdjWi3FsSCyezDqjdj7VBVfob5d8waV5i0Oy1zSZhcadqESz28o/lbq rDsymqsOxBGBUxxV2KuxV2KuxV2KuxV2KuxViv5nefdP8ieS9Q8x3gDvbrwsrcmnrXMm0Ufju27U 6KCe2Kvzn1rWdS1vV7zV9TmNxf38rz3MzdWdzU/IeA7YVQOKuxV2Ksg8i+R/MHnbzHbaBoUHq3k/ xPI20UMSkc5pW34otfmegqSBir70/Kf8nfK35b6R9X01PrOqzqBqOryqBNMRvxXr6cYPRB9NTvgV nmKuxV2KuxV2KuxV2KuxVSu7O0vbWW0vII7m1nUxz28yrJG6MKMrowKsCOoOKvjb/nIb/nHB/KYn 81eU42l8tFg15YDk8lkWP2lJqWgr3JqvfbfCr59xV2KuxV2Kvo//AJxE/Nd9L1t/IeqTH9G6qxl0 hnIpFeAVaKp6LOo2H84FBVjir7BwK7FXYq7FXYq7FXYq7FXYq+Kv+cufzHOv+do/K1lJXTPLlVno fhe+kA9U+/pLRB4Hl44VeCYq7FXYqr2Njd397BY2ULXF3dSLDbwRirvJIQqqo8STTFX6Bfkd+UOn /lx5US2cJN5gvgsus3o3rJTaGM/77irQeJq3egCvR8VdirsVdirsVdirsVdirsVdiqyaGGeF4ZkW WGVSksTgMrKwoysp2II6jFXwj/zkb+Tf/Kv/ADQt7pUbf4X1hmew6sLeUbyWxbwXrHXcrtuVJwq8 gxV2KuxVWs7u6sruC8tJWhuraRZoJkNGSSNgysp7EEVGKv0d/Knz5beevIml+YouK3E8fp6hCv8A uu6i+GZab0HL4lr+yRgVluKuxV2KuxV2KuxV2Ksf/MDzbb+UPJeseZJwGGm2zyxI1aPMfghjNN/j lZV+nFX5rXt7dX17cXt3IZrq6kea4mbdnkkYs7H3LGuFVDFXYq7FX0t/zh3+WMd/ql1581KHlb6a xtdHVhs1yy/vZv8AnkjBV92PdcVfXWBXYq7FXYq7FXYq7FXYq7FXYq7FXYqxb8zfIen+evJWpeXL wKr3MZayuGH9zdJvDKNidm2anVSR3xV+cOpade6ZqN1p19E0F7Zyvb3MD7MksTFHU+4YYVQ2KuxV 2KvpP/nDDzybPzFqnk25lpb6pH9d09GOwubcUlVR4yQ/Ef8AjHir69wK7FXYq7FXYq7FXYq+cP8A nNPzY1n5V0byxC9JNVuWu7pQd/RtAAqsPBpJQw90xV8fYVdirsVVba2nurmK2t0Mk87rHFGvVnc8 VA+ZOKv0o/Lvyfa+TvJOkeXLcL/oFuqTuvSSdvjnk/2crMcCsjxV2KuxV2KuxV2KuxV2KuxV2Kux V2KuxV8Wf85heR10bz7a+ZLaMJZ+YoazcaAC7tgqSbDpyjMbe55Hxwq8CxV2KuxVkHkDzPN5W866 L5hiJH6Ou4ppQvVoeVJk/wBnGWX6cVfpb9Yg9D6x6i+hx9T1uQ4cKV5culKb1wKvxV2KuxV2KuxV 2Kvhn/nLnzB+k/zfuLJWBj0Wzt7MU6cnU3LH5/v+J+WFXiuKuxV2KvVv+cY/Ky+YPzh0gyoXttID 6pPTsbYD0T9Fw8eKvvrArsVdirsVdirsVdirsVdirsVdirsVdirsVeOf85XeV11r8or28RA1zoc8 N/EaVbgD6Mor4cJSx/1cVfCWFXYq7FXYq+3f8eTf9Cj/AOIa/wCkfoP9GepU19Xn+jOf+tz+L54q 9zwK7FXYq7FXYq7FX5t/mxqv6V/M3zTfhucc2qXYhY940mZI/wDhFGFWJ4q7FXYq+pf+cIdEQ3Hm nXHX40S2soH7UcvLKP8AhI8VfVeBXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYqlfmrRhrnljV9FJA Gp2VxZ8j0HrxNHX6OWKvzEZWVirCjKaEHqCMKtYq7FXYq9h/xT/1ix+hvUHrf4n+r+lvX6v9W+tc q9P73FX3fgV2KuxV2KuxVpmVVLMQqqKknYADFX5bXdw1zdTXD15TO0jV3NWJJ/XhVRxV2KuxV9sf 84aWSQflVeXHEc7vVp3LbVKpDCgBNOgKn78CveMVdirsVdirsVeQ/nR/zkX5d/Lxm0m0iGr+Z2QN 9RVuMVuGFVa4cVIJG4QfER14gg4q+btV/wCcsPzqvbpprXVLfTImPw21rZ27oo8AblLh/vbCqZ+V f+cwPzR0y7Rtd+reYLIketFJFHazce/pyW6oin/WjbFX1h+W35m+V/zC0AavoUx5RkJe2MtBPbyE V4yKCdj+yw2P0EAKyzFXYq7FXYq7FXYq/M78wNMGl+e/MemqKLZaneW6dQOMdw6rSvagwqkGKuxV 2Kpj+lG/QH6Lr8P1v61Snf0/T64q/T/ArsVdirsVdiqWeabgW3lnV7gjkIbK4kKjqQsTGn4Yq/ML CrsVdirsVfe3/OK1qIfyQ0OTly+sy3spFOlLyWOn/JOuBXrWKuxV2KuxVJvOfmKPy35S1jX3AYaX Zz3SxtWjvFGWRNv5mouKvzT1XVL/AFbU7rU9Rma4v72V57qd/tPJIxZmP0nCqExV2KvTf+cdPO13 5V/NXRykhWx1iZNM1CImiMlywSNmrsPTlKtXwr44q/QPArsVdirsVdirsVfnP+d8SR/m75uVBQHU 7hj83fkfxOFWD4q7FXYq7FX6oYFdirsVdirsVSbzsCfJmvAbk6dd/wDJh8VfmRhV2KuxV2Kvvz/n F7/yRfln/o+/7qFxgV6pirsVdirsVYF+fVnPd/k75sigXk62Dykf5ELLK5+hEJxV+dmFXYq7FWQ/ l5bTXXn/AMtW0C85pdUskRfEm4QYq/S/ArsVdirsVdirsVfnT+ef/k3/ADb/ANtGb9eFWC4q7FXY q7FX6oYFdirsVdirsVQ+pWz3WnXVqhCvPDJErHoC6lQTT54q/LfCrsVdirsVfdH/ADiNeC4/Ju1i BqbS+u4TvWlXEvTt/e9MCvaMVdirsVdiqleWlteWk9ndRia2uY2hnib7LxyKVZT7EGmKvz1/OT8o tc/LnzNLaTxPLody7No+pUqkkVaiN2GwlQbOv0jYjCrz7FXYq+lv+cUPyX1O41uDz/rls1vptmrH Q4pRQ3EzqU9fif8Adcak8T3ahH2cVfXWBXYq7FXYq7FXYq/OD84rn6z+a/m+WvKmr3sYO3SOdkHT /Vwqw7FXYq7FV3pvw9TieFePOm1etK4q/U7ArsVdirsVdirsVfmH5p06TTPM2r6bICJLG9uLZweo MUrIa1p/LhVK8VdirsVfYn/OE+ribyXr+kHdrLUVuq/5N1CqAffbHAr6MxV2KuxV2KuxVBaxouka 1p8unavZw39hOKS21wiyRt4fCwO47HtiryLVf+cRPyfvrozwRX+mq25t7S5rHU+HrpOw/wCCxVM/ Kv8AzjB+UPl26S7GmSatcxnlE+pyeuqkGv8AdKI4W/2SHFXqyqqqFUBVUUAGwAGKt4q7FXYq7FXY qtlljiieWRgkcalnc7AKBUk4q/L3WL99R1e+1B/t3lxLcN23lcuelPHCqDxV2KuxVl/+GZP+VSf4 n4/u/wBP/ozlt9r6l69PtV/4X6cVfpDgV2KuxV2KuxV2Kvz0/wCchtFOkfnL5ot6DjcXQvUIrQi8 jW4PX/KkIPvhV51irsVdir6E/wCcMPMQsvP+qaJJIVj1ew5xp2ae0cMop7RSSHFX2ZgV2KuxV2Ku xV2KuxV2KuxV2KuxV2KuxV2KsK/OrzAmgflT5n1Ini4sJbeE1pSW6H1eM/Q8oOKvzkwq7FXYq7FX 0l/gs/8AQmX1zifX+v8A6a4d6fWvqVenT0fixV9fYFdirsVdirsVdir49/5zV8tm1836H5hjQCLU 7NrWVh3mtH5VPzSdR/scKvnHFXYq7FWUflj5sPlH8wNC8wlisNhdo11x6m3krHOB84nYYq/SdHR0 V0YMjAFWBqCDuCCMCt4q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq+bP+c0/OCW3l3RvKUL/wCkahOb +7UE1EFuCkYI6UeRyf8AYYq+QsKuxV2Kr445JZFjjUvI5Coo3JJNABir9Gf8ARf8qh/wLROX6F/R nL9n1vq/p+p/yN+PArNMVdirsVdirsVdiryL/nKXyc/mP8pr6eCPneaFIupw0WrGOIFJxXqAInZz /qjFXwZhV2KuxV2KvvP/AJxg/MBfNn5ZWtpcSBtV8vcdOuwT8RiRf9GkI8GiHD3KnAr13FXYq7FX Yq7FXYq7FXYq7FXYq7FXYq1JJHHG0kjBI0BZ3Y0AA3JJPQDFX51fnX5+Pnr8xtU1uNy2nqwtdLU1 2tYKqhAPT1DykI8WOFWC4q7FXYq9K/5x28nv5o/NrRLdo/Us9Nk/Sd9VeSiO0IdQwO3F5uCH54q/ QbArsVdirsVdirsVdiqnc28Fzby21xGstvOjRzRMKqyOOLKR4EHFX5u/mh5JuPJXnvV/LkoJis5y bOQ7l7aQepA9fExsOXgajCrFcVdirsVeh/kZ+Z8v5eee7bU5WY6NeD6prESitbd2B9RRv8UTAOKb nde+Kv0Jtbm2u7aK6tpVntp0WWCaMhkdHHJWVhsQQag4FVMVdirsVdirsVdirsVdirsVdirsVeB/ 85Xfm1H5c8rt5Q0uamua7GVuyh+KCxOzkkHZpt0H+Ty6bYq+K8KuxV2KuxV9l/8AOHPkI6V5PvfN t3Hxu9ek9KyLAVFnbkjkD1HqS8qj/JU4FfQuKuxV2KuxV2KuxV2KuxV87f8AOYH5ZPrHl23866dF yvtDX0dSVRVnsnaof/njIxP+qzHtir44wq7FXYq7FX0p/wA4xfn/AA6L6PkbzXciPSnbjoupSmi2 7uf955WPSJmPwMfsnY/D9lV9eYFdirsVdirsVdirsVdirsVdirBPzd/Nzy/+W/l5r++YXGqXAZdK 0tTR55AOp/ljWvxt9A3IGKvz+8z+ZdY8za9e67rE5uNRv5DLPIegrsFUfsqq0VR2GFUrxV2KuxVk 35ceR7/zv5z03y3Z1X65KPrM4FfRt0+KaU12+FAaeJoO+Kv0f0jSrDSNKs9K0+IQWNjDHb2sI6LH EoRR9wwKi8VdirsVdirsVdirsVdiqR+dfMflny75Zv8AU/M0scejJEyXKSgOJRICvorGfttJ9kL3 xV+a2rSabLqt5JpcMlvprzyNZQTMHkSAsTGrsAAzBaAnCqExV2KuxV2KvoP8jv8AnKO/8sR2/l7z k0uoeX4wI7TUBWS5tFGyqwO8sS+H2lHSoAXFX19oevaLr2mQ6po17Df6fcDlFcwOHU+xp0Yd1O47 4FR+KuxV2KuxV2KuxV2KvIPzh/5yP8qeQ45tN05o9Z80AFRYxtWG3cbVupF+yQf91j4vHj1xV8U+ cPOPmHzfrs+ua/dtd38+1TskaD7McaDZEWuwH68KpJirsVdirsVfcX/OL35Qv5N8rNr+rQen5i11 FZo3FHt7T7UcJr0Zz8b/AOxB3XAr27FXYq7FXYq7FXYq7FXYqlHmzzZoPlPQbrXddultdPtVq7nd mY/ZjjXqzsdlUYq+CPzj/OPXvzJ176xccrXRLVmGl6WGqsanb1JKbNKw6nt0G2FXnuKuxV2KuxV2 KuxVkXkz8wfOPky/+u+W9UmsJGIM0SkNDLToJYX5Rv12qNu2KvoryX/zmtAVSDznobI/Rr/SiGU+ FbeZgR7kSn5Yq9g0D/nIX8nNc4C28zWtrK4qYr/lZlTSvEtcCOOvyY+2BWXWnm7ypeoXs9asLlBQ lobmGQb9N1Y+GKol9b0WMAyX9sgI5AtNGKqe+56Yqkeqfmr+WmlxNJfeadLi4CpjF3C8hH+TGjM7 fQMVebeav+cv/wArtKV00dbvX7kD4PQjNvBXwaScI4+axtirwH8w/wDnKH8yfN0ctlazL5f0iUFW tbAsJXQ9pLk/vDsaHhxBHUYVeQEkmp3J6nFWsVdirsVdir6M/wCcX/yHbXbyDzx5lt/9wlo/LSLO QbXcyGnqsD1ijYbD9pvYGqr7EwK7FXYq7FXYq7FXYq7FUo82ebNB8p6Dda7rt0trp9qtXc7szH7M ca9WdjsqjFXwR+cf5x69+ZOvfWLjla6Jasw0vSw1VjU7epJTZpWHU9ug2wq89xV2KuxVuhpWmx74 q1irsVdirsVdirsVdirsVdirsVdirsVdirsVdir6A/ID/nGu981TW3mbzbC9r5YUiS1sWqkt9TpX oUg8W6t+zt8WKvsy3t7e2t4re3iSG3hRY4YY1CIiIKKqqKAAAUAGBVTFXYq7FXYq7FXYq7FUo82e bNB8p6Dda7rt0trp9qtXc7szH7Mca9WdjsqjFXwR+cf5x69+ZOvfWLjla6Jasw0vSw1VjU7epJTZ pWHU9ug2wq89xV2KuxV6F+Tn5Oa9+ZOvfV7fla6Jasp1TVCtVjU7+nHXZpWHQdup2xV9o6l+R35b ah5Ht/JsulImlWan6nNHRbqKVgOU6zUJ9RiKsTUN3BG2BXyP+bX/ADjh508hvLf2yNrXltasNSt0 POFfC5iFSlP5xVPcHbCryTFXYq7FXYq7FXYq7FXYq7FXYq7FXYqmOgeXdd8w6nFpeiWM2o6hOf3d vboXandjTZVHdjsO+KvrP8m/+cTtN0R4Nc89elqWqpxkg0dfjtIGG49Y9J3H8v2B/ldcVfRgAAAA oBsAMCuxV2KuxV2KuxV2KuxVKPNnmzQfKeg3Wu67dLa6farV3O7Mx+zHGvVnY7KoxV8EfnH+cevf mTr31i45WuiWrMNL0sNVY1O3qSU2aVh1PboNsKvPcVdirsVehfk5+TmvfmTr31e35WuiWrKdU1Qr VY1O/px12aVh0HbqdsVfe/lPynoPlPQbXQtCtVtdPtVoiDdmY/akkbqzsd2Y4FTfFXYq8f8AzF/5 xe/Ljzc0t5Zwny9rElT9asFUQu57y2xojf7AoSepxV84edv+cWPzU8ts8tjZr5hsF3E+mkvKBXYN bNSXl/qBh74VeS3lleWVw9teQSW1zGeMkEyNG6kdmVgCMVUMVdirsVdirsVdirsVZJ5T/Ljz15tl CeXdEutQUsENxHGVgUnoHnfjEn+ybFXvfkL/AJwvvpjHd+eNVFtHsTpmmkPKfaS4ccFoeoRGr/MM VfSXk7yH5R8m6d+j/LemQ6fA1PVZAWllI6GWVi0kh3/aO2BU/wAVdirsVdirsVdirsVdiqUebPNm g+U9Butd126W10+1Wrud2Zj9mONerOx2VRir4I/OP849e/MnXvrFxytdEtWYaXpYaqxqdvUkps0r Dqe3QbYVee4q7FXYq9C/Jz8nNe/MnXvq9vytdEtWU6pqhWqxqd/Tjrs0rDoO3U7Yq+9/KflPQfKe g2uhaFara6farREG7Mx+1JI3VnY7sxwKm+KuxV2KuxV2KpZrnlfy3r8Ag1zSrTU4gCFS7gjmC1/l 5huJ9xirzTXf+cVPyZ1SrQ6ZPpUpNWksbmRa/wCwmM0Y+hcVYTqf/OEfliSQnTPM17ax9luYIrk/ ehtv1Yqkdz/zg9qKuBa+b4ZUp8RlsWjIPsFnk/Xiqj/0JDrn/U1Wv/SLJ/1UxVMLT/nB1KI155wJ O3OOGwpQ9wHa4P38cVZPpH/OGH5bWwVtS1LU9QlB+ICSGCIin8qxs/X/AC8Veh+XfyJ/KPy+Q+n+ WLN5gBSa7U3j1H7QNyZeJ/1aYqztEREVEUKigBVAoABsAAMVbxV2KuxV2KuxV2KuxV2KuxVKPNnm zQfKeg3Wu67dLa6farV3O7Mx+zHGvVnY7KoxV8EfnH+cevfmTr31i45WuiWrMNL0sNVY1O3qSU2a Vh1PboNsKvPcVdirsVehfk5+TmvfmTr31e35WuiWrKdU1QrVY1O/px12aVh0HbqdsVfe/lPynoPl PQbXQtCtVtdPtVoiDdmY/akkbqzsd2Y4FTfFXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F XYq7FXYq7FXYq7FUo82ebNB8p6Dda7rt0trp9qtXc7szH7Mca9WdjsqjFXwR+cf5x69+ZOvfWLjl a6Jasw0vSw1VjU7epJTZpWHU9ug2wq89xV2KuxV6F+Tn5Oa9+ZOvfV7fla6Jasp1TVCtVjU7+nHX ZpWHQdup2xV97+U/Keg+U9BtdC0K1W10+1WiIN2Zj9qSRurOx3ZjgVN8VdirsVdirsVdirsVdirs VdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir8/wD8/vzJ85+bfOd1Y69bS6Ra6RK8NnoUh/uf +LJKfC8jrvzG1Ps7dSry/FXYq7FXoX5Ofk5r35k699Xt+VrolqynVNUK1WNTv6cddmlYdB26nbFX 3v5T8p6D5T0G10LQrVbXT7VaIg3ZmP2pJG6s7HdmOBU3xV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV 2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV5T+ev5FaV+Y+lfW7ThZ+a7NCLG+Iosqjf0J6blCfst1U+1 QVXwnreiaroeq3Wk6tavZ6jZuYrm2lFGVh+BBG4I2I3GFUDir0L8nPyc178yde+r2/K10S1ZTqmq FarGp39OOuzSsOg7dTtir738p+U9B8p6Da6FoVqtrp9qtEQbszH7UkjdWdjuzHAqb4q7FXYq7FXY q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq8p/PX8itK/MfSvrdpws/ NdmhFjfEUWVRv6E9NyhP2W6qfaoKr5V/Lb8gfOfm3znc6DfWsukWukSiPXbyZP7nv6cf7LyOu6U2 p8XTqVfdPlPynoPlPQbXQtCtVtdPtVoiDdmY/akkbqzsd2Y4FTfFXYq7FXYq7FXYq7FXYq7FXYq7 FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX//2Q== + + + + + + uuid:97ce0c48-17d4-cb4e-888c-1d4c57be15b1 + xmp.did:F77F1174072068118C14FF26CDCDCBC5 + uuid:5D20892493BFDB11914A8590D31508C8 + proof:pdf + + uuid:6f945305-61b0-b244-bf48-d2818106a34b + xmp.did:FB7F11740720681188C6D6CD398E74C0 + uuid:5D20892493BFDB11914A8590D31508C8 + proof:pdf + + + + + saved + xmp.iid:F77F1174072068118C14FF26CDCDCBC5 + 2012-10-06T15:55:53+02:00 + Adobe Illustrator CS5.1 + / + + + + + + Document + Print + + + True + False + 1 + + 15.000000 + 15.000000 + Pixels + + + + Cyan + Magenta + Yellow + Black + + + + + + Groupe de nuances par défaut + 0 + + + + Blanc + CMYK + PROCESS + 0.000000 + 0.000000 + 0.000000 + 0.000000 + + + Noir + CMYK + PROCESS + 0.000000 + 0.000000 + 0.000000 + 100.000000 + + + CMJN Rouge + CMYK + PROCESS + 0.000000 + 100.000000 + 100.000000 + 0.000000 + + + CMJN Jaune + CMYK + PROCESS + 0.000000 + 0.000000 + 100.000000 + 0.000000 + + + CMJN Vert + CMYK + PROCESS + 100.000000 + 0.000000 + 100.000000 + 0.000000 + + + CMJN Cyan + CMYK + PROCESS + 100.000000 + 0.000000 + 0.000000 + 0.000000 + + + CMJN Bleu + CMYK + PROCESS + 100.000000 + 100.000000 + 0.000000 + 0.000000 + + + CMJN Magenta + CMYK + PROCESS + 0.000000 + 100.000000 + 0.000000 + 0.000000 + + + C=15 M=100 J=90 N=10 + CMYK + PROCESS + 14.999998 + 100.000000 + 90.000000 + 10.000002 + + + C=0 M=90 J=85 N=0 + CMYK + PROCESS + 0.000000 + 90.000000 + 85.000000 + 0.000000 + + + C=0 M=80 J=95 N=0 + CMYK + PROCESS + 0.000000 + 80.000000 + 95.000000 + 0.000000 + + + C=0 M=50 J=100 N=0 + CMYK + PROCESS + 0.000000 + 50.000000 + 100.000000 + 0.000000 + + + C=0 M=35 J=85 N=0 + CMYK + PROCESS + 0.000000 + 35.000004 + 85.000000 + 0.000000 + + + C=5 M=0 J=90 N=0 + CMYK + PROCESS + 5.000001 + 0.000000 + 90.000000 + 0.000000 + + + C=20 M=0 J=100 N=0 + CMYK + PROCESS + 19.999998 + 0.000000 + 100.000000 + 0.000000 + + + C=50 M=0 J=100 N=0 + CMYK + PROCESS + 50.000000 + 0.000000 + 100.000000 + 0.000000 + + + C=75 M=0 J=100 N=0 + CMYK + PROCESS + 75.000000 + 0.000000 + 100.000000 + 0.000000 + + + C=85 M=10 J=100 N=10 + CMYK + PROCESS + 85.000000 + 10.000002 + 100.000000 + 10.000002 + + + C=90 M=30 J=95 N=30 + CMYK + PROCESS + 90.000000 + 30.000002 + 95.000000 + 30.000002 + + + C=75 M=0 J=75 N=0 + CMYK + PROCESS + 75.000000 + 0.000000 + 75.000000 + 0.000000 + + + C=80 M=10 J=45 N=0 + CMYK + PROCESS + 80.000000 + 10.000002 + 45.000000 + 0.000000 + + + C=70 M=15 J=0 N=0 + CMYK + PROCESS + 70.000000 + 14.999998 + 0.000000 + 0.000000 + + + C=85 M=50 J=0 N=0 + CMYK + PROCESS + 85.000000 + 50.000000 + 0.000000 + 0.000000 + + + C=100 M=95 J=5 N=0 + CMYK + PROCESS + 100.000000 + 95.000000 + 5.000001 + 0.000000 + + + C=100 M=100 J=25 N=25 + CMYK + PROCESS + 100.000000 + 100.000000 + 25.000000 + 25.000000 + + + C=75 M=100 J=0 N=0 + CMYK + PROCESS + 75.000000 + 100.000000 + 0.000000 + 0.000000 + + + C=50 M=100 J=0 N=0 + CMYK + PROCESS + 50.000000 + 100.000000 + 0.000000 + 0.000000 + + + C=35 M=100 J=35 N=10 + CMYK + PROCESS + 35.000004 + 100.000000 + 35.000004 + 10.000002 + + + C=10 M=100 J=50 N=0 + CMYK + PROCESS + 10.000002 + 100.000000 + 50.000000 + 0.000000 + + + C=0 M=95 J=20 N=0 + CMYK + PROCESS + 0.000000 + 95.000000 + 19.999998 + 0.000000 + + + C=25 M=25 J=40 N=0 + CMYK + PROCESS + 25.000000 + 25.000000 + 39.999996 + 0.000000 + + + C=40 M=45 J=50 N=5 + CMYK + PROCESS + 39.999996 + 45.000000 + 50.000000 + 5.000001 + + + C=50 M=50 J=60 N=25 + CMYK + PROCESS + 50.000000 + 50.000000 + 60.000004 + 25.000000 + + + C=55 M=60 J=65 N=40 + CMYK + PROCESS + 55.000000 + 60.000004 + 65.000000 + 39.999996 + + + C=25 M=40 J=65 N=0 + CMYK + PROCESS + 25.000000 + 39.999996 + 65.000000 + 0.000000 + + + C=30 M=50 J=75 N=10 + CMYK + PROCESS + 30.000002 + 50.000000 + 75.000000 + 10.000002 + + + C=35 M=60 J=80 N=25 + CMYK + PROCESS + 35.000004 + 60.000004 + 80.000000 + 25.000000 + + + C=40 M=65 J=90 N=35 + CMYK + PROCESS + 39.999996 + 65.000000 + 90.000000 + 35.000004 + + + C=40 M=70 J=100 N=50 + CMYK + PROCESS + 39.999996 + 70.000000 + 100.000000 + 50.000000 + + + C=50 M=70 J=80 N=70 + CMYK + PROCESS + 50.000000 + 70.000000 + 80.000000 + 70.000000 + + + + + + Gris + 1 + + + + C=0 M=0 J=0 N=100 + CMYK + PROCESS + 0.000000 + 0.000000 + 0.000000 + 100.000000 + + + C=0 M=0 J=0 N=90 + CMYK + PROCESS + 0.000000 + 0.000000 + 0.000000 + 89.999405 + + + C=0 M=0 J=0 N=80 + CMYK + PROCESS + 0.000000 + 0.000000 + 0.000000 + 79.998795 + + + C=0 M=0 J=0 N=70 + CMYK + PROCESS + 0.000000 + 0.000000 + 0.000000 + 69.999702 + + + C=0 M=0 J=0 N=60 + CMYK + PROCESS + 0.000000 + 0.000000 + 0.000000 + 59.999104 + + + C=0 M=0 J=0 N=50 + CMYK + PROCESS + 0.000000 + 0.000000 + 0.000000 + 50.000000 + + + C=0 M=0 J=0 N=40 + CMYK + PROCESS + 0.000000 + 0.000000 + 0.000000 + 39.999401 + + + C=0 M=0 J=0 N=30 + CMYK + PROCESS + 0.000000 + 0.000000 + 0.000000 + 29.998802 + + + C=0 M=0 J=0 N=20 + CMYK + PROCESS + 0.000000 + 0.000000 + 0.000000 + 19.999701 + + + C=0 M=0 J=0 N=10 + CMYK + PROCESS + 0.000000 + 0.000000 + 0.000000 + 9.999103 + + + C=0 M=0 J=0 N=5 + CMYK + PROCESS + 0.000000 + 0.000000 + 0.000000 + 4.998803 + + + + + + Couleurs vives + 1 + + + + C=0 M=100 J=100 N=0 + CMYK + PROCESS + 0.000000 + 100.000000 + 100.000000 + 0.000000 + + + C=0 M=75 J=100 N=0 + CMYK + PROCESS + 0.000000 + 75.000000 + 100.000000 + 0.000000 + + + C=0 M=10 J=95 N=0 + CMYK + PROCESS + 0.000000 + 10.000002 + 95.000000 + 0.000000 + + + C=85 M=10 J=100 N=0 + CMYK + PROCESS + 85.000000 + 10.000002 + 100.000000 + 0.000000 + + + C=100 M=90 J=0 N=0 + CMYK + PROCESS + 100.000000 + 90.000000 + 0.000000 + 0.000000 + + + C=60 M=90 J=0 N=0 + CMYK + PROCESS + 60.000004 + 90.000000 + 0.003099 + 0.003099 + + + + + + + + + Adobe PDF library 9.90 + + + + + + + + + + + + + + + + + + + + + + + + + endstream endobj 3 0 obj <> endobj 7 0 obj <>/Resources<>/ExtGState<>/Properties<>>>/Thumb 12 0 R/TrimBox[0.0 0.0 15.0 15.0]/Type/Page>> endobj 8 0 obj <>stream +HTUKn[1 ܿSEmݢ~m4:$<2?單O>|zZ-< :>;(v9xM%$:%vOte#q<$W_Ǐx=@!5QZZ"L=~|K/MG&h*ڨ]ѯOI퉦7JRsd NΠaL-ssXb$؊#9˯-b-(x`:,V-rJZy +qދjFQo9rמZ(4.Xz +1Cᘱ?>8¡`|8e&zRv$M$ +=nv\KӅBo$s8kB3:wN%ch~CK0ئsm;fb뜹)AhUoPlfPU +4p1~$UFܕ@>vܳ ~Qz`4$$X?%!risfj֐gQWv +\ʭmv껲̥v5y(:wGa 2 ՙ5̬E} YCnV.WR3L¡Z` i]Jt{CE#6(-kmGl),A*>߳H`4Ťlj7 tC/٩|S ㋽%QZ+<3Tu _ +4d0<)*  McD,@ͦ[Y1Y1tneQ7 n fis endstream endobj 12 0 obj <>stream +8;Yb!#VZ5Y/-%4~> endstream endobj 13 0 obj [/Indexed/DeviceRGB 255 14 0 R] endobj 14 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 +6%Q2oYfNRF$$+ON<+]RUJmC0InDZ4OTs0S!saG>GGKUlQ*Q?45:CI&4J'_2j$XKrcYp0n+Xl_nU*O( +l[$6Nn+Z_Nq0]s7hs]`XX1nZ8&94a\~> endstream endobj 5 0 obj <> endobj 15 0 obj [/View/Design] endobj 16 0 obj <>>> endobj 11 0 obj <> endobj 10 0 obj [/ICCBased 17 0 R] endobj 17 0 obj <>stream +HwPS -Ћ!H $!.HZHǂ DAJQDқ4A =3μ;͛y;7g5u HL쌌]\t`-8`nn :\ ñQG܉n@% r KQd yy(D7/2Af)ԛ2 dQNr:@27T.YG3Dd,@/tWG`ϟ +pݑfz9eS+q*8 /?& +1r8jF=(HpE$=n2pjb ^]oMq G-?~:A엂D?0^0*MNQyPp?22W* Pjs5Z4m133u1)ccMcepiL\€*r]p337t4l6|-G,,ZS=MTWߛȔN6O MKkHؾq w"3FjVYvg\.4O0_䭀۷>İԵ,zÇ3!UOIE}ϳ MfրK/s+_ut~yMFp;^>l{A!vT#8jBh1?=1?;12_wt ̱2Kڅu⛰ŭov"v])@s0R%BBM4)t~0)FE.R#,86.'\a܎3.\(O)/?'"%hJ A*YG$FEFO:/ux1Ᏺw '.[$%&'>MN8{Mefޜ\<|[ GPߕg_tR21Uդ'IOKj:j꥟=~8 oh%|վ!ة:B;|m_xCQHcqiSgftgX>_] Z2[^L6~nUbqf6݁xk  LAQ(л;1ɆYyH35VO6U8+|#Ӊ ~Sg/̿)q4$C +Qߎ'JHKJKde+19X\#P^IA\G^iWyIeLOs' +]tub#NcfZ+ 3V֟N ~85`o08zzi/.[{P"ܓKK ȁ)M!}a,(h^bgT_x{q)DaoBT4'WFAKfZވ̺\p]{닧JKe**?sPD-˟ugmFME-}mKtݫ؎΁n7o= +{ /@? J ؏z~$Os9=}s&w6w|B䥸s+~_\l׍on"ߖvwǿM_ U D +2-&6Øa YNL(%#,Vk 3*G g >70^_><@QkbJ$, w\uD65eI(H2HKJee;J\ / УX줢 +W]TkS/?nyB@K׬] =I1!$?P9+F'М$埈s aN_bg8SaKbmk`/lvp:&ғIFGh HCH'8+y ;89E,{P8[R^4V< +Kxl qQW2:HG +r;A;bjJ +߹/3?z(HjU4r6\ttL(ӧ!è^+!d Eeo_87}/tg}KLsurc.p eӎ`qt 3,#|Zh80I5]^K= ǜ;yyC1TxA6G6zW[h +><1]^~|h hO#PT +>$P@%hیoK/{W4yw8 f8e D*RBy;`nQtVy:_@ϨgaJ.?c}z5M7D>XP j2{89 +O +#/a^#.y?FPgq?:K1b4wߘUuF]WqP&:=9ݵ`ez}1mޒpd7lY1-uCrjz19"z/ +2 caZnpHu| +zP1iDhTL.YeP]G&G,,` ]` Aѡ-/s">BUuF.{T}ؗ) N!"GB;dl߅[LpـnF9 ZXcL8xէeW[o@ē1VL-#C&k*K&vV,*p$i;Rxټ_PG?+\ʽMbL6))r>=@x5*fv]^Zduz]X?P41p 9Q~*^ *,0#%8b;Q'p*$LEf"޵wǕSC戽Hah :-"dk>uy7C/)d%x`'qyo SY "&]#6؂5;4uWy +tk/ G &0,#Bv"R9 59oQm@;/D5RIP+-GM#º'uhAt0";=kմ?{-We_]ډ[jA )H>Au%W#Ժ>D.ٜJA1~ S̕V asUB +䪪/j)+68˼=wpmbnv\ߝtGOx;`uKJ ̄wAߕx~Ϟl.ɂQ!h0RȥjEGlsܦ5# J58/G V//"N1J;mh`$?,Wq$L$0lJVzq+ĬЈAaix!dpTP/H_ zZYs-dqN +U)$Yǭ, H -Ϻg,7xeIHh6 <{*M@+{ Pw/fID. O-Me̙mu+M­y!@*D> Ox0LA % v[Flrt@q+ /4r +X8Dm*Q/ZB\@a8~r;E=,7!oM2D[..Reړ7tA};GbsWh q2A];%mi"+g=Uf*l3xݲ?I a~ /&.u +궥 +>'ggUi AN?oO%),z~U޶ 3^Gj)ȀZMۂFiPnQY#TVtgSVD^O˿:JOg+SMnveKlou"̋'gøSzّ[ oIpkк½+/eM=Pm4?EAO =Ф>˭=@tVw {[u)jW>'jcJ|e57R1a7/zu c\V˞ Bb-C~}5ְGU*Z$SmƩૌL "CƼ+g~>dwE͢B`Ѥ*]vQ)TTڒWЬ~E0!U~Jqb `,<7q |?ķz\w5)r-C#n[-V 1/ceSˤpm^/hOC0eծXd#GQ(HJ3`7޼yofq-Eߦ~_ڎOZKW>(C8(8>=%šЦx>ǝ/@'3EHeʹb#ӓ"=ݯQMcOu䅂A~d+ʡ^yk2͈pRtzdswB8u9]7}CꫲQ] )>^6&$Gk{«C\L`ȣnggw +;.ˊr_/C:x)P]aΥ:媀B3-⊗cpcـ=#ӗ=Z"#j%"b7KJːйcle/_>‡*E7@+V6ŸnvQGM]wTnG<2 !_,>P蓧VwN5[,*tgGvR20B'džɫ+ tGj x1jMTn"AKFoUkoȱ*h$e1%#*54N nRΝ7ⶂĎ +V"8%{4G(ȫ*d+~?ɟt#gG9w[wߺ4ݑĈvOrb4鴶ר=yR:p(bHY-Ƞ$D~)5a:GXmr ]c^vzKS8=UĊ3c7o1UNϹu!8EGpҮ69 Esu|?Wx5ɻ3FI a ~۸ߕ +TCY bY#thG:tW5-BG^pw+.xZ t#4r uI_o$郅t/*-]V:SI#< +BqEd_07Ɉp0 e,%(IkLgu=Xin## Ί9W"o;!t%-Izx`to[!֦Z?Q,YjwgW tCOTmW}9Ӓ B$pqL?5LRDH|]gpOhz셠kJ$ۨ +sOk|8C "rզqc (:/k~%Dj[ihH5nߛ-787_A%V"RjxwڶᎣͿ3"汬6EVÄA'X*{G~GZVAZv}&(lݽ6$>Yԟn-ZT3(( D;峰&pۜ :J2gkSIJ}']V +WC;KX_="ŸXʰ #ލ=Omp(e{K  nK 溞b@mfl_#va^Xw4"f0aAҰUҷ`,."4*kĔQ~$pwf k33vRIܞ =|߬oS-KmaRf@8(M_!^3<.ẂXש?{غΏ{h*0I 8G.6hy MBYnW"v vhZn?lL,6XS(i)IfړH|E8Mۀ])>ZɿݳzK=IǴAK)jT|~/|x7L |{R.YXv /hiqM:=cMYCgHZrqqeNfFz.R&)φ,+.Obp.5^W۸&P4^?7H~(+Pjřv$JӇi|zK:mS`Rץ~q1Zo8#π)Ɂg.<}CL(pd,KWJKJo>v܂1%~#6ÜGyuQ`|ƿopCćKc˴WbJ>5&0"J⛰)nÈij||bocv勒WJ=h0Ρ=("hhψБ{oj{;cFVPDJht"=ލ:0"ݜ6׉20}{bnbVEJҒN=~80="ZӋ2z&njub2~U/^IEz=F0fJ"5ƗƄˇ¨zqťm +aUIrÚ=! 0KN"𚙓0qq(ynmi]a PU>?IG<բ038|"5|;"yh!lYf`TڧHϦݤ<30ŝ)#ae^ڼxภl`ST_'HF<{ڤ0iN#({-~~r}f}Z}OGD~ C~7H+)Ѥ݁j~n +rI;fS炜ZKO^?Cm]7{‚+EܣՄ'd+т~@( rf"Zv&NܶCG67^4+(>0N?~/m r7if+ZegN͵ҊC:Y;7R5*g^W΃}̪qwen"Z/NPCF7>n*H2HSՃU}qhʙfe{/Yڹ=NZWBђF7#I*Ɛ3D.r݃},kq;e-,3YVNB'E7 *Xxi<|pķ]dྠZYHMmB}6S+ffOBT;|rp8dX0M@Bp#6񧴜+™@ |r|`p;˯dNSXMpEBPg~6-+- <{$*6aWm: ;^h(zUfb 3`7)GH$I܊賏[:.mjrupTFgʛQ_:= e4V}C?1]@8l^|Eb?,Υkz, +00X m[<?bPAߩ,C] IGe_ ߠ .1^IxO/'`c R.1B8- 梛x*g;ԗ~KtCP^W.T +Dw2EkH|0`W*q"]|P&XbĀC\1=.kCլĊIUl(ha^ȊKJmXpq}P9Vaâo^Q#ŜdD@@φPފ YAɈ~joJ V@ZK.9@Ya΃d˷glĝsg5Ņh7\ |[X̑BAa#7qb̔+z *&3(Vcҗ.' +&1O%D'M DzFHq K0;J5 7GdQX"/! C\8"wv%>+>r'ф1N[Mƿɢuo✔b/HRl+W|[{ṕ)LvŝiC؋pׯ—g߬ +1+KL!Ԙ@|m#>`V(S<{;PXVK~JxY'VV}b{7anWT4[ ҿ\݈lbR%oNCl:^sZEѯZQ-33*HqB6Jwhgڛ:gդ73s=?Wѐ*vn):AНy=liC4X Qע.273ghgq4WZܜtm|>x xRr!P s{P"_PŠyW;f3x^CSW) ((\< 25;} y$RrF|_*@uN$-'?hp +08^`lw`Yll`ײ/lp q28u{lbۇ̝9M;]w[c]|B[v4hL̫%B"HPgp"?es1c\cekE +B7)*ѧ7{>ĭGulk(67aRܶcS|}<()2L/ΤX.`sk$Z<%S0aF~l7'y i^2N@HS&xpyRF}Nք5Qd-!c%٘$cL# + Zx..m}1K橤ybI֜%sSBqrMї8mr0)YͳRܹB wWX8Je3)}U[ )WO{eTS pJJyςG5ꪲ5\E2zP$\ +YFtQwd^Nk+J*6VDy[JB~3{?=cƌifhEJcpn|\VtP rfW,ծB;?Cq9eXc8ß+͋ǚSO붅R.s+ƀ}tຎͰ՝W7۔Av+dol6\9)<:`Z2^M{ר8vWA1it}+4~iD?Q)pC63:>lm~8Q=ӌ*`{3~|wT7Q@AX-Re1CYTL/&Na%づ!o<.ΆD@hLX!V[0|rrɳ$ `M[q>/C +1wEtHt8Eu%UTTl^*!%U,kF܂0!wi %"I(s\׿knu6F rH( &U1?OP|vINI"(* b خ0'kMԸRO3 +KyشvYV:^tFƔ.{od%;V:6C&1nG(y%^eOacD=4ONi6썂; ˭L`f7Qk{2f7PI"ăW(^\ $b1S.%.F6;oAAj[ T>f+(n_I߉^ʻǫbȌ[nq 13ߏBb7C Ӂ|S綵<*/У%ڋDrܱo|RהulsUZ_fת@^uP6T)#:ςlama$Hl^z'1`XPҺ}*%]ibd9&e@՗}@v^HdnKn( +̖{]1;R ;e#ZT"?hpiK Bzޒf1zlRIP<΅R1bm],2;%E7THM>+aOέbw?R HGQK+6f[ev&ŧj|xR4X%kZ% Nhr  HzOޢ[WJk2V\^Jpsκ[GFH'3Yb}O. =דgM!.grWsG @d+Mw8|oA8a +6'GCg5ɇE-h-;^)(pdϔPY u_Te.#!S*0zo#,,~vï:9wՔsU CKWWP)PbE8ʊ w_{zr_ YY{X~ */? 9e!+s<>&.F6һL1jX:U*$ION{y/Yf?ֳb fRowgJ[9T ܹ,$~Z͠I3!MZ)%rKi&yNl!쟢#" ы? p{1(n?%#T3Bym#la ߼oÌW$e-meҡrlwũ ߏ`n9q#l#O#&&ELI +*&/x }vuL7 Z +ڡ>k$G-)1="Y_w: j˱LiYm! ;ʀ}bZFr'^;hͰYնg0hE6AL%eO%wAݞa?UBW24a:Qc᪜~yʦ/ dWm_Z!ÿlq* MlX[͔+l;):|UKeo3W # +)ln>fĆ3 _yL3̀yVii߇k4[p+Z~ɮNW +WB~l^Q%¸k=LzbBw -lƯ* +BD+R7[T*Pu2Gn.(+QO^K#6`.m@6?e÷ Yk7|RO;1KKCXo }Ic?bVx*r7k23{7}M ;=3˚P1YldHv^Jg1͘܇L>Lۡ=mz!b= ,;1) ,%=3|~XEq1o[9^iUSlwzXRkTNP'JeR@݌1p4@ٕK\Ƽ42i|S`D7n.\|"Pm4QX!:# 9Qqb.'$g/jj)?cNF=R%ȟ5TC"/A%Ԡ̟uVmvMI@V#Gxt%CG:T5ɻ5?I'Lwn|ͱ |!\d-CWnd l[ ujoT^6ݖDJ(?X`yt+`˃c8Be^bUvRs-ga>ru{?VK3(r[ܓ|%_#|F|=Iާi m߈0l108 1"+9L(h_UK4wFw#ˏqyZ)vԨ +"kSͲE~fy,pN<<6 eݽXYۻm-; ujp]ɥcRd94M8HjhpMq:)ޞ=3U޶ 5Oq}Ri'!.gEWOL::Le˾FMq.3J\%|G/)^yS +7%Tw#UUCs0}* ڇ(jWA,ӘTR r`]Crz5_VYA9?uayK$mZiin%44Q5Zq%!'Jj$;tр +a,ߛp,=Dշ{nk>Rg,*CcL57iRXZ#EoP ?ҶC_=~vǹ{*N6uW2'{R_irUR(5kx;$d#D^vS:2r[i<WΩ텇wƬw.n4]hlt9/ъx‘;vjjG)Df{׵'8yGWm~MSE"70]˝4Oڑ5|j/@@t'("2h8@$$j$pX]md%WO, 1{O?mShʌ#e3# ($NxX{OZlߢ@Ñ"G\t!nTӺ1~Z%I9zBu-r]f@&\Y˥%RMN:g@W2ݚ $cMSBԶ(~glqIeY8 +LԠ?2o$?9a s}DZ4qlse -X"Lk-?pr2i@$~Ó2Mʉii}ppʬdsƝX3K?P20l,$i|d%|_^pc˧jWSKS>񛎛P1$Nݎ/M,{oi{c6WK>112$6+ X;݉ӅQ8c{ anBzbݮVVJ>W1F$"ӘnD qo3nw9wQwkax_[y)SfVyGqz:{-|}Kŀ`}vػ}j}^~S{~kG%~:k-Ǡ%𑙂GmvEjs`^< RFߨ7:-i Zk/J恌\u9i$^;qRr凋Fp:V>-Y'q4ᐹu;iwrO]ɯR1#FQP:-kBQɘj``t¹Qhⓧ]H$QEp9ݡَr-L I'ar+tLhe\ٮQ=E9D@-2Fg X}F֌r^s˸hf\f$P٩EZ9pO- *7+~s>g[魱APnE97<,- %Yr[~e°Frcg2[{OPD9О,曹 ,ٕ{o$}߼lXrHf["tOĨWsDƦ8ܟx,ԛ\ 2r0ۊwDxlGŬy`*yYUyJz?h{3׫|p't}t~ S%? 8w>~lĭ~`/~~U~Jb~?KQ3Ū'iĢ Ђ?w;8kð:`r:UZLJJ.?873u't⡤ 읠8 ڂv>ks°`4>U>*J<χ?1H3 'C ,aIvsk'ޏp_hU%J ?R3'ģ%U x͏vk͖j6_TmI۬E3R'ˢ׎7Y [Hv B|j/_b$TaΖI>r43u8'ТTꎾ9f#-u¢CjU _T7IC>ԗZ3c%'ڡm#% niu`Gj/^к kS̴Ih>\>3Vc'ǖmH̗ЊXՃuҮi*^S$HѮ碟>:C3Kޝ +':Ғ1)Xtjwi|Ȱ^T5=SV,H?>V3Bs(Ț1V6IȋybtPyuz_v֯zwA{}6xBxvPŬ gcn +7N\VYgM`TfM~o1*:hgKxD:ppqR /Gx-5-Ӡ`_ol ts&+s0K2'AkO* +7UdAjD-Q&!Q B \ 3h(;l 0weX{!i)5$uۙ.mD&WdXQ6l44+\e8\SaOƞ*˞!}S|ILJ\ +h8񜴸x$<~PZ?wJQԔ5 FvS:r]P"6(F^]Se >:1*ٛ>LUh\W-[VLIkIHl t0,x Ԝwe\q$**&6(w$׮|~<NDYo@cuh"hA(w3$ϛvY?qz;*܁ˋ ͔o\/׸, %)gaNh{N*/P0v(= +0?ER.ocqE-輏'l$m'X +<۝|!b_7sD]&1b+r'"ؔ\ާ7-rܕbMxswq >"5OE"ϞGG2/#w5m_QwRrRq<$W`K(ABc>%%D 0oD`D :P˝nYE5e۹+F2Wͪy"9u/pQF$'ߕ>r3&=70N@9 +mUQ)!..U[_ +?KFJ4GĹÄY$ܐ''\]fG63IAv_mfax"C%k4BbT4TՂ"k<\{dq s7/d4V +{lhxZ]b[~=ifig 5Fb(ק9;O٧ViGGX_}n]wӸik6f:,p,@бkbmuFR!s37:!?`CW֧&`':gUDtx4DLؠ²CKh#NLoosR +mRҦUa9B6c.oo18g JVnv[[mFGvzB+J02Nhļɍr/ 䜲Cy5(raDlGx~H?I.ȩ GH;A!A0sARxJ8*ۛD[Ѯ~b +W.Q{!n(1_9W'IlCw'Cp^~u% ^pV& > Mфy6_E%.xA01݇"QC͈ZK+gD2sϑKtOt z nf9 ?Md$n|c-G\zx 1~F;ĚBtB":E&'>"3$vAPrfm#t&pJN866n^yOOMZ,z~ Py$;l*|\7󱇭 ؒvߪUDl?ᐺ,"uy )mܞhqS:wdREZk4cS>nW=kvKPmGYpfo&]*YV.#^LCxTrz )s=\||V+w]mԇZc&r~2fAcS_ he)>t*qQt`1x w֏+I۾:hYK *9I|8Yk^nT| uڿkVܥCA$r*S$s,ౝ+z`;mP걢dbP% @]6 +UUu +nIR:^ar]J& :þҝm)%қFҚp} 2e d';(MdFڶk ]*HДPPCjߙ m> wE2j샽/;Έ?* ,oqS6wniZMfOdI&~Ej*tcHV=֗7<Lk2XF]E=m,6rU蹲P/WSEFlPyzS8Q:/~`~kLS 0RߪnFS+d@wQlf6Vkd`j⻪5)0T5 8+F9yᲹl( ܺ),,&L@!A~VSHIe"3o%4*%yV "_;Sa8iqk¦&m&*F^XbBϓ.$%_d nC^36^$LI|yIB 3Uu ê+z;EQ^}NW%'%3mD35+۞AFI#7'_1m 1˚wEkG eZaV7Uͅf5‚"m/)euw"FYwI׵Xq [8f2n88EOfQk:sXpcuʒ@}5u ?TUf݅]m[-S]Лc<"_.×z;,^Aɝwp36 +i‡WRj|pI%(E:"L{+:eȾgdOژ9ؔgF:fՓ ԙdb:JJ[pdR"QfQPgeGE}bOSZ p0Jd9 ܽIrpGm]$h$0Åzm㍝|Si aYvq%ҞY[iS= z D>x̢L# dsV6S'ɷb]T%/y%7[]X%iLjj#]W=f&0]h=0yx\P ؋ǯ]uG_i?M^.ZRbG*I;Ҙh.}h!BQ0bPEYBtZi+m]xR)^FПf:s.C?!%8^k gbztٱh]3YQǟbFc:y'.!ܖYi3s{Wrp?sBe t`Y|u]NZLvB@w6}x*@z1y{l <1}8${ +uxo﷑yӚRPg΂MyiniƊc]*,X;߉aMAI6:)phgz<όۂx葿mݴbʯeW9.L2A\58)ݛ?htz2uzv{'1wR{Qx|Mlx|X4y}PCzZ}-ez~ z~-qԃ s-t;£9u(iv1}wjwW5xByvl,y6ycpm9+qr󊦡s2t|uivVKw߅B!x,[yiyweoSRp3q𒩠sōt{wu,lhv2Unw&TAzw+xXxZԳntQ gXSТ(LRp*৥U +!!$$wߛ{C I0B{M ED[T~{QfiŌ=~\C¤P/P%`vָ)Y /Y4T?5hMsqjq+:m'E)̐/kby@}{DR39놑>cvvSDžƖM t?65)`o&Z]d?qF4۳}lA(h|}]f;+ʹ @갋.+'n&oA\!R\;u"Q<7!ia2Sp>&ΠڴA2NPKGU;PomBp: oBv:khC8|Zp@_+nPy_@iiyi1&o)y -wSuP$-_gK?fBX/zQ է+v [+Џ3(-]tY!(y e辬9h ro/r%shxu/cP}O:kՏ@9`Ys3Crz 'Xk޸?i1GF)eDK;hز_6AЧ;rl%ۙ:$QFVwp04sf8) w|1-R͓ykx ELуCSL]*R)p̜:Rیh_<.9]QqAJKAmao:Bv/20%!;9)L͓ka{&(}{9lI:RV*҅VG܁`@*a/&]-ad{K͔5-O oۄs kgNO^˟J5YQhl:/=y%qNXD2D^Z@:3sz0ow=+,b{/. R0q 3NyG.:d*K%4U=أ9Wu"gb{3Umg5 g}xFO]RqޗŲfv5gW]eWC;SpFbHy flO0: W띀q\~#?RҤwPw@TzښY0ldӮ㣖e: s/:!g1!w<<>`Eսºshsj-AgAZB#J>ݍmȨtwXTa))A? +wGPXkm +_BIѨ+ ڣ㞠t7tj}7Deߣo]3%j%Hn- E/GXr#3,+b=?^'NC%}Uss6p)n2|0%wiC^0mo#703:|ܞ+¤ sW +TmJocz}a Ҽ؈ WǖSKl$t_@*CTV z7vdr]&4DiOQi lp;#K}&B׉/4"a$+08Mh~TRiu+a2&dg}y j`D/%@3J`<[rO@ojƛiCA F-y\H4tj Ys~T:eK3 +xJкDg&vhh\ +6+5DľGѺHs͉}dU3 ͫV>2  + ]-jxP$#LmNܫyZ44CDcXj66DgmZHSd}Wlɾ[oy@nę&)Ι;-~(.xrZG`znr YoB)`cТzٶmixC,WSeH)5ڗ>B>dS#YZ퐉FyQ R!,-j"~jo**e; +I`h]<nVD¤Hb,q(Ȕ4ZcGP=sQpv/R0!pxe_l&!?F%GNw33䊘""=XC7Βq/߉)˗M9h;F奢.qY8$I-BD/ĵ#L(>f+oZˎL;T +O'{XzE|H>PcU)'ItJ&}>wͧ3dQ%{z ;-'L5CXj>^!#ͪIWhMsfZC&9 +3WʏeL)!acE2'(h*A)?+f7GHtcfի-(U+bІ]Qx[Beb; \h3J0 DMM;Q[9Ԙ8L*fd@kR9rLDg5ٍBuJCa&NOlٯAM :m!vİ̞;('y *1\_M +UH1("D H٠hdC fܛABf"S"Y EQ˧ҴFTɍ +Ϧmߔq;K/G(:'ܷb^# jQtkA}R*SY<~522]t%/pN+t֬ Nh*{]YqxJ<+KKG/4x1%vJ1aKtׄ\&I0GIW)O1)}+% rD"Pc@?CNM_^(6ڔLAʯȿo>-}r7"w:()2I1_vZ4^u)j'6kV6V, Vb# ?/;̱;o5g:nĬ7},4mG6_n) yҰ_2l(󊞎hs`L]x7z.թQһޜ첱nEͣc:6ԥ4ݨ`j(a֍4kɪRM]Լe+-[Zb_Hq6Zن:2+}Ec]ZH&:LQОkdèi_V.36$o^ϰQ-E4<7*,+}3a$}r RHjgKV\zRffmÉl@$]{%qf,h`=Zo:5snX5~ ą(J||5v hGa};WO{p S*8"7xD"U+7euIR +wejwtpO1Yt37z h3HjYh+0`ҕ#ݶb?&ZQ~ )TKty ɘ1r)G^T>Q0ON\PP+8\6zQ-*Ze^Pxe +dP&ub~JY!Y/!]1h>@jVuF'lqV螩m1:UH≢8QEvWb\#ˡyNſ'\u/H$wuψ +MxoI&v}!&yh嫎\0txcL0UA6,*ilȔntmTiy+n^֯pLTqIG#s>jt2١2v&&Xw+Ix +̙+{Sޏ;~sRsi +t^yuSvHw>-xx2!y&.z_| 7~irzhz^{S[{H|=u|2}|&~NE hw GrW?gÀc]{RπHR=l2h=&j BP!qƴ%rgk݆*]ŅRztG77=_285&w3%ח :.q=Z\f߯ \wQ=7G= ׉2z&ff P!9pKfU>\r"QG,<ş:1՛׌t&W-  Œ yhYp,Leέ[_Q' FϢSu<{L1C`&A/; 5Èo}beHq[\P}FkǗQ<*#1g& ; un4dʬZnPM@FOQ;❰12D&Y <Ո6nk̫0d\Z;OE̠b;R1䛨%ꖞr TS_Ahnn^xo{TYcpJWq@WsP6OZt+v[ >?wy9|@%hz=tq^\uTI6uJHv@Niw6N;x+Yy j{$\|h=1~LW4h9zd^%szTzJ*{Z@S׀.IxB@%y6;+Ĥ7  +Z5x+!KVӘЍ ++B eq~[8RtH^ 6>ͧȚ5R*+p!$ +ɑK<ł0e9P[}Q-H.>R254$+a_!8F +feh`Nrj3.s%l5Vt#n#bu oJuqzvs[gzwtTaxv@vyww*yxfzyoѾotK*puH|r/v@sPw0thx"xuzyfPvyS_wz?xd{* x|fy|`m~o#~"p~8q~_Is~wt6~ewfI)wNgxE|k݇%mêo +gpqlqńvPsjd:tRQuu>Dv}))vgẃ~j +OlJrmo^pƋQu!r$c9svPt=u(v'w8i^kdminsx(tOgu@jgyiikȒl 8ԉp"GV_lRȑ!R1>f13fc3B}]ښX߯6ax4Ḫձ쵺9U[sKmyS GP mWlDk#XLꎇ }qK/cH+Mg53Y;+' 2rcz(NwV@87S߾kRn4M5> 6d\t"gE7scLìyCQte;Cop1\mFM9ky+@$z FJ(lSʐߑ44l1/W1cVģz&yOqu]&ЉO(aKv\qX!0͡#,WٖM + r]S~³Km#jc=Bf3>"d',EodbU})XO%yڪ!J@U~e ѼvӋ@qnM!{ n3۲c iwuCcS:dZ7;Kw%7@ks5N'A̝ra{;N93&`qhJۭSיά׺#420$j9CJ9gVK0+H`&~=s* Da%ZCC B l#n#Wϑ+Kd0y WĠFy怙V\0FjLMa o ".3y;XJēj3?$&LmB[Bzth1Cӑ|MƸkXm4LP3Gq!pbM-ܾtw$!2fFz$(b_n-zz1脝[Xdaz=YnQyKU?؎Z'c+U܋]ʅ3QC~"tN~R184֭5Bک+HR.MJ0Q ,; +=PmhbaOZG|mXs̩^4 >?@Uzڽ'a8,Y oۃ<)P [i H60?[^&=NBG 'i]a# +@LA5&i6u3QsN=g6P`f+]i@'RG@=`eU~Qa!:ǶWK_5PK)P>-hΎ7Tհ\W9'i6["%ӡvȘY) +IN0aI !5t9#$1$g]0d 8.{t7MO "nmaa1%T*CJPyj^^ln+T,@ :b̴S6,Ik0JA\,H!̭\R(`H:.pqIx5ͯkR|=m;WRq|)Yf+1~M"%gz6[*eF_gN>OEm{Qy%yI)/O"mr#yBAԐJ#ӖQz9Gz!dA[~2di"nw^XO(Y /"%gbJ'GXmlz@EIDz^9sޯ9̫166j?ǫ֢e,]wrUX>>%{|K@); 4jw@QOZO'8ey`2:<@}]bQ_fy֓hе>"!R Ycݚn0R}˶5\?fU$ 0FuR(` y>| \c]m4ӫ {RiB:okd"*> ~QuIP.|u7 d%T_bB=ֻI<~E=cn~ѣ#ߪ'l͞5u S[ 7\pBEbQL^:l +RV&yrQ՟2G4&sNwԶ3+Ji}/jZx,"d{~yGRX;w)G="q{,xں?U>)!崸tU3Dz.#>8DÁεǰ`G  5T<8 5tvnk0'#O<2PwndO(aY2~ ,⫈o0"fwqrMnHDKC BP.U%XdBfЁ0):}`8M{ğE[KHC沱K_Õ0A#^Z}G>lK0zAK؁7{"LA[ +CA# -nrf,lp%ǜ(l0yL@-yDS~-~e +S4c^z +]5Y&p^G6 +tk +΋@ qѶN6I`a?bꢗ `Pl{i0>#xz)FXہvgڮPxKkn Y^㫳3\~qUv*mI{RXj;,&9N\FD Dwx#YvZ򚹠NۙW)+(YCv:+4CYM,ٸrNF"I~y?)LZiI|`N]{ɿ;fHw2IİeL{Kx`*Q }7c}*72`Sٔ# (%,FS>?cu0 !.VvjnEe6f_^uUM~j~@∋j&}TX/jkB_yzn/a2=ȁ#v u({X/CߘGs ;9!猬/~u읪O8YeIqKLoRQӴfKK.ADcgT4X}nzQ+i=˸BXK}6T {e) rtv}I o.-p`-\񪰸YxM78WmM' :{*p^ʆ8_׾@u+dIWЧ-CRy:((f{3/ X']5ex%] +~%^ At "X]-ig48|GҴ 3" _pd=DSFEK T)[d/JsI.].K.,T *VWgŭu<9>GIy1iAH"M Pq n_}^1E:c:hڶ~*}kK2g%d_o: ~_/l9PKo:~Ty(mmaWHЫͳ/stMDxI,LQ5 SMzt)$"`rSh +K qr#D O[5}yH4&{zEk&Rkd)Y%V2@q3(9w1>h?h FFf &R#`T>e 7kv1ЊȬZ5mMӣЙC^(Vϗ~Z՞Iͼi:XjXG|(=EY6{T 5aȭ@<_P56{>HZV)r}{)owYWc\i#m5Zݑ4ӉUau +XQU<]-}!e \NfQ,u,.|O|f~\Z? έA }sy%*_I)ο`ߞ6_ҷ;I\la Ch)Ha{~ T' 3zIgKw{5czֺUw: bĀvX~fծrCi ˳?qLr(|# +/[cW}BwsZk>KcYpڸ?fr+"4'90Q&OVt\q]s_x>[2Tލ (Z_kN4 +LEF)"bv׸ۊ<.|ԲBT?X  hLcԀ ci.W$-lBB5 +_ƭ$SYo^,^rhT (ʥ )4gɒ?s"z`Gyو=\ϣ_RHO Oq|<  +6J rU>{E10Ipe6V DOy! + +ldRp*<s-qwTGJ*_Y$,';b,^vO'χjtZJԡ' c;l?o7t=-~Ԯui87uԕX.W涐h'y` Syn?wdT [{/\߻یל,yĐBs S-\r77dho߁Ua[ancOIw]}Yf#Z  ZBLmDCᖧnnGrν79 +Ep/dtu]9 _]l .}oz"{D| {~׋lajͯ{a{W%|%M,|C$j}9-}.VM~S"  ڒfJj*H`l`VqLŁvB x8ǝ8.+V"΂ƃ6 +/1(i2_VJLE0Bc8~u-"ٔ' +{ jh_`-RUKJB=8>ˉ-ؘ܉p"ۖ1vވ + <kсhcH^ۨU>K~Ab7--:K"ɕ  +.d!g뫮^Y}TO"KA]“t7]-q" ^ g|g[]٧Z9TLěJlA 8S7g-> g"W Ŏ .fê&]cSTJ]@Ŝȝ57/R-"q蔻H D=F7a_iGW¸RjN56l?D9m;EQo1qz'@sEwtbxvјz~a-oGWpANqUDr;3 +s1KuY'vxLϞyX |`ܹu)WQuMױvpDuwG;x<1 yG'zj柤{/;}ϕ![`oN{VM{QMY{D9x|":쨖|1}`'U~Z~9nK3`MVBMCICm:1c'<72lؚ3~_efVLZLcCJ:/1`Ӆ4'Sb[0(qtU!ɀ_gVL@Cyɉ:Y;1D'zQlqJ x_uU/LrڏC=#:(0l1#]'ό&ˆA0^UgxL&B@9s0/'uÎ˖H[[^YTUXKjBç9£Ζ0Ӡ}'y +5,~^BTѮŠKߞBl9I0'i6f *!^ȁ ne og +pirl(s7n;sGt\pBa|ur0O-vt<wu&xv ywxƹk^nmpx2nq;psQ+qxtrru`ctw+NHgŠ;i؉Ck\/m^no ]~pKr<9vsI%Jsuւtd6wfxhҐCjP}l{mn8W\oފK%q\8rN%rUWu'3cA.e#g蘟 iՖL|klm}[o.Jp8q$r1tb}d壉glif{jklҗ[nIp^85qJ +$q@t2ua߯媧d@fx\hozjX)jl2ZjmSI|o'7pN$qDsfaDceWgziͧj)kYmkIn7p;$}psN/`Jc0EeyO:gnoyii[ik8Y^l@Hn7fo՜u$ep&+sAt1dK#uf2ui`vk}wAmm wo[xqJ <ԉ]*DmW-9:E"%f}` rXJVwmzm,j[Q^KٍHG(َE4kXׁgJ./ w$턔@OxP +y9VlxZk|][$HC?nW3^#4#`'-q%;Q/خf̛`ƭrw O'erϩutKeJ4@x!@/I_!; y@8,Z=lKzQ{T/!G=Jl-x A 3F6rpJǚ;jhi-+ +4OyUVX=oRNwPFV<m1*GP<,yyfC%T/QyM&_Y88$ 8Rt8 +l/E@Cૺx+6]0Bl)q +kd "Ym?7hk$"P!(0 ,V ohJH}nJޣDY"?ޔU=a-\Zq`8g9f\ +Y|7j) +[ݤ^UtsNo׬!(rZ7C5y'gϫA;?JݎBņȐzc*K?]3'7(;\ޮ4*|KNsB!+| pF`OWp"+&ނhĤ=- {/5&2=(yA+=?9SJ} t*DlBU(ѵv"9s>y1zȭV!eQ6_T~7FD]Cw[k>D3 |LEH-'P8YOz2j = ^ u)>QJ$$~=Q Dp7!aa΄E?Z6n;u95~VT^>) +x\q})Q*flfwD,*'}=?BuppQF~)GOFWW/h4^֪͡kUj\uEʌmd_? +ʞouQ) E) Rp!%~^݀mlD+sbW4M +I"Tq`h孁;2-"1̄G ?XxAs~=pQN5F +T-Qjau!MPNi.? B+SO a_BL~nhw%G~y]wJB`E} oe7c[_j$'(߇ |6lTB򴽉6AX+aO.-P5醲=DMHPo5r1O+qkխfIRzjY).A[6FW|{./]Lm lcŻې/13p9紸9.Ï4F>Kع[Gi9—5XkhvY_݃ͩfs?% ixy@v '}̓7ŴG>yC_A^9zM4̠ug(.'z Oӡ }LՔFFO3^3iIfW +ENֆ\$,K*䙊,rBV.ܠeXyIiw[8Z'Uqhc%(>5$ܑj2\gvi,8ɂԂ;^ q8 +N(7O`AlYʿ3WGvRF wy&]=B)+D_7:zrzC%?*!SfS[x?j(S:PKѭt*tV{>9}ޣMJh 5ڙ" +)dfe$)eǵ5ߜJ \iC &)֬ Gb^QQCBe@|%xD2,Z*첄ɳMI}{Hϳ^k +:%(ʩ$?'펠dIW;Fs/K->#n\J5d["tY`L-UӮx["!.vψoKh++쭼 'VxhU]'V'7 |IJl!ԍ. ~;pcn +kT!8+G6|| {H+ƌ+h(4f[  Gg`W': h?|&b(~Rݘ!|_nCRעGL$ EJqtʽL:#sZD,QREIpY͊ŴX.ϰ),vUO_Q ǁ, &˵ +0kěY +0/J}+^,"8xd@1;t$6c-IC S~1L +%d57SE;g65N|v#e!!YH/(~*!)h#j |xT"JJӆ)0nGya OY9^`%*$'LTgw@!!a=>>j>mPbػnX!mSY%#C!ﵼ='4Ut|KaO+aWc%^^[^=3lXqv[^dVo{P fܮ=2spӏ7Bl{B +:ط3&N_=@ 9ˑlW>` =Fx8*>zL[`㛻ͱ%(U;hn頑̯ϛ'@5[\#/N^>-a#J-P +mW +ͲXY}^%=<\7yE0jw\XzZU͈޻g7{BmTtnj U5'_%_hI*OWVωsCU%oT_`-Id$,$5~u>UVjKDj2*u}? +MTC.aB.3j:@c~h$:䧒.u^H^*GAf5\џ] U-Lpt]TцPcY@V%/S%1z$f!h)ȥ,g$:b,6Ь5ex]>9R 'I*krG]ȴP$菜)LZ͈|s-hxVQWtTӧ'1uܭ}[3,n YYшXfU| qȌ5sg;\_Q=oqEI:GW-qU& _` "x{8pfj["PE֗9Ӗ-۔7ރڐ肇nMvz`'pCQe +D[;PCKE.x9Uu,ڄx|njozycp,%eregZiOel&DnX7ɑpY*r1fs u{Dy|io=ikdzC +9\ݔ.ޓ#܌iB  fhS_dU+LnȜB͒9qn.r9#ŏ` '2 +)eS}c\eRhHj&?0lB5Wnf*bphrC\s{w&}#di[XkR'm[H$n>ߠ;p5lr\*t6uw/z~Ud &oZqPQrHs>u 4ݜ"vX*uwFxKz:x} dcjuZIvQ swGx>"y4zl*Op{XOc|M=}]9<W;b| Yh|PV}G0z}=Ŝ}4O~*,]VCxGCbYpPf)Fʞ-=rH4v* v[H, aqXkO#FqÆ=*3ܘ0])𕮆X_oّ!؋pG`ٍgX)ȌO@ь2F|<ޚ93zn)͔#X f (`n!>WaNɟvEBt<3a͎)GOD4ۊr 5W:P_z.W1lN`tEYsרNx 6 x-<|y#z| G}3t&XQ{xP{GX|1>"|5ᣳ}A-&O}#ʝJ~r}<Xi`#5Z-W#ԜE(뙑eWق@4+X(4pOFܨ>.Fn5]-m#ݛcA8hdWծIO: F_=l5l,蝴R#ܚZ2 產9܆WpGN4?FSS=5<;,Ɯ퍐#Йƍ8DՋ <)WŖNvpF$>=˓@5v,A#Ù~P8LKVANDךEޥ=^.4,{#YTO +osP>j _kbӝmSewnhJ} p#jl{qm[|roZItAq~7u\si#ut Ixufihkjmlo]{n&qkForZsqStKIru6sw"t_w ewmxd's@ftEhuNEjv\zFl[wXj'n#xNYoy4HGqmz 6Arz"?s{ vk{a|adj|vf|h}1y +j}~il}Xn~ Gp4~D5q~i!q~U u~P`~Dbe,sg^wiyhkTWmnFo&59pz+!p tγ^}aR ֬:ڕPrXU6_Q8Z}^XpjCNd1dD @Hx*55{he5~,tUs;GyQF.9[YTʼn$fW`60|Di]FJ폌t;g\Ot*hx]/G$m#iZS;ڊ{s7K.>rv:܋¿zv ց h/1!y[D2j䛋 ~P4W?_Ia%lM wO ]mk~絬*Q5K_9]]V0c3KxVHK-/DP>H\/$iv",w ڬ(v ܳ76Ye4T" c.Ɂ\ 3[5]|ޢA +fL2`=t"C_P(2NW>K$ +Iy(¼=鏰5#Eli+qe#3^d]$ h7F2:c/۸# KBOq vJb;\VI; :O̤Ӥ`_ +Atp5X ]}=E-c&%k ~(N[঱) 4⧆x W@F6ȩٰuf#O~ W+ y_#Tw#B>(fbK%,rИ5yS02xbymbE##@ 4>-4zڅhx{]8)9lۜ{dX+$PV?V¸eexoz2u4y/o;I;,QjUO#?w1>5>S{)4\s(nfY' \[gv*!Ag6f˾NsN|r0q4Jby@Y}LN2M2G2+K7W <$?ъ0Gy+)~Ia/G<(z@K8;HҽYLIM )aQD*W3[Q'g4fp;&]It:\/&S1NbXsɣBߓ#A_3qnKnBp4E¦WعK%8\8{BOy$X1K!Cܦb b9!]?z_h8O.ȣmzL{8i H jE^ %g{2ekUsjOW W,X\5h[83] &ӧ~j"GmmnWi{^U_`LfF_~!q%>ߘu  "A6pGK1?noAV7nb֭J2wlk11`O'(S7JiO.v07U筂L,biHb ?D307!iX 4{/#R& soUAaW ^M;ēȋhmSNH>5VzgK'6J~.O]PCKCDkU-e' +TM3U$o;* -(oAnUqpsz?n 46ڝD%.C kXP$,P~ I)ldIN?Apc\\1k?6JCѩҩ9i)Ih_M͒'ږ6syuV*s_WaOUcJlt*! GcP,Iyi&Rae@(v\ RxBڕW/!GU,OdرAaV\ǨT0n|z E:G-X23nEOBQ`EH2ߊ8bc:t-= 0X(x6Ctca$CvnqOIl lO) DZ]%nbJx\>^O ~Z lV+Bܡ|߫8z~ܵ\_jՎxVGR?>4ցa?xN }g wFue>E'qʮvl"h(6xDQJ8PUd +/T$; +E1TIYA:H9>`'rd'G #0k6H,AE7e %a1% J"u|L8>b>_a~is[|3J e_*$6Rv{ݎ +|.'8= Ѹ)Î̥x{*\9RkD.25t{ʍoum xX%+0_NjEG7Ům}*V`JÖ2,fMsқE_g'ڷnejiRP GZ)E[Lёh_i"jeڿgm-&rG?j-< CNIUq-*lβEmS P""ϛMήӈhG#Gx\{"IaԤg@ry  #]3Ý HSGrDDD7]85/bEF"]PuI*2,[VAGBx͖;h/TZ><a(XdLg,hC~DW[޽j}2埶holpQITVE)\`MBU ^r"9vux: ɋ4W.Q26EpOhb۝{UȢ68dC]X=_v5oXk)aYAvKU`/IS9}Z=U4=h(݁{s07dZkNhm"}&\I&˭ !} v0V|bO&8>A 9Ѵ71iK]"]_@3W"CV}(s@pJvJc>a54.QS2ǜ(1#ZoZe]dWP_ֿIe^R-L!VgFz'j+~f]@fgy$#hw̦<{=IնS 9޷Ȯr>.~i-14%Q,{9&mP5&SS-\t94! l HˎrBSfӋV#aSL@Wb.{Qi\B;ыudqw0qecje* #3LMV* D4UA@e#CH `2_򒼑e(T-XQz=Qi-ZkUruz[-Bv )-|-=]󨌖d?PM;+{(h +ؓw8+x*ր!4Eǣ(ܨgè (1[ZBU/Bwߥ/ +h[t]<\,S +;H%JS ' aRWIzBr2ɑSads|b%P&Rdރ |NX9,DaB㬒;܆rKaH(_/DˆlYDzEFs<?;%-:m+ Kk)~xsnRB<Ÿry`^ye!d$_.\ +B>ق)p]4\RYNYenvV>2H5;qз=S$@ Ju"0@Gs j/fXfV!옫*մ /€,+ +]?TsdQ8i9CЦ1xWvWuZLOoeb0;\ hrC.LJM_OՌ5 NY@8oQ9Y7g:m]Řc pcMcu\Oi +h)%L۩Z<ËBMg˚pͣ1ZFx~|I=[BOIOPԧUAq6ڼEyio"Ebg7h04FnQ1b<IT?8=DCUr7? +sv2BԬ%F`w s0/Bw\CM0A& HԆ[p70NEӜ[" [2,2xKȈv@]uCE޷TzȓtST8{C2O%.x{)w95@j 6Pc@ N7a.% ֍.+:>XRP:UH(?˕7O.ȑo%[3ύ^D`S*7_&JapBc:%f1hu)j\m+;o: "Lr 㒐wPE}ReJfBeh9j1l( +npr Uu*Zy~R!jJK1l9BCm9UoB1[[p(trȜt7ěu 䗑xDÏ| QopIکqAr9ss1+u1(؝vxϛuwty 3{U<~WQnvIv:vAh]w99{x1ys(ɜzd{f2|} ~=} Q8{I:{A-.|g9 +W|0q}(›~4~s 3ڋxЀPH@'8X<0ϝy( s( -)PJH@*8a0( Ӕ, jl! UP1H^@{/8~fB0 (ъ  _FȀ/OťϐH &@=Us8N0cʎ|(~ L S`ËK Ï"|ЈvUPOdTGĢ[@ +8'ړX0E!(jk , pd:jkeZڣg^iCaLjdculg3eneiUplDqn3rq 5s0rw wtbdxdBfǒf]ihhk`tjemydlUo~Tn4qiCos52qDtqru qv.*rx +YrxwzRbu]Sdv:fwyhwkbjx]lyMnz\>Fp%{ -q]{-qR{w |ա3`~ b~1e~]xUg6~jJiJ~\kQ~M9m>=n4-fp3Dp)%u-cgfIYhQK WS`e)ꩈ X, (C-(8B {so !܈ WxĞj}V=u=p|?~JuՄ9ҊMnUMI)8eռ`y~~hcԏ.6vI6#e6W|]Agp-U&SMh[LӮ vuUnE![sK]iR:tP+gp6U~U/~(Cg=yhжsP"%/V%5}◄*q0Rœw0g3ƆoLD>>C|F^ 6oO WW.!$Ր OԯjSD-o!Z\))2ege.˟ 8PB$Ũh$v! + +fQojvlK|7%܃(.CDZaM\)>-́˧!ct (Z1n{sBsj*!-QU2!w\h?||s:#^.#LE)!56Fy.[%O:"m].^(-#9UdiҰxiGMF*]As nks!Yv-XsN8MU-ɉF-@k*uOէdB٬3VxeuP<4/۸X'ߘ&@\ٵm'FUpW?<]U4fˏ"VYղAkJ)n +K{vʯl1krȴDnʚS}n8)re]Նl*-QOdW*b@8~(M;H?e>amаcHlBy>ӡ/ʰ%iK:B/ߒI +};p"[՟z.Mfہ1vX˅\^0S}oe4FVZ~gZxe FaL ˮWܯMZ?Z[Xj~ـß++V!+*8X3 +syxhYSYhO>yi*6D `R}䪪p3=]rM>\ ^9#&ăOennfj)Ĩ4_Gg._'HBhwj7zЉ5T>)̵;*lSTmVlؚw +Ԟ64%O5:N '7Mu^.V~yG޵wBuh`4K%?#I>/%O +f c~՟%xoGP*/91KOGcjGc噉X0oNE +>X Jb'(%7^Rg#=X T@NKdAב!i0j-;2nLtO/o]eJl~?'{W x<}G:Eo-<e;Ѽ$Ϳ2H% W!'E~R'~cK2Lf nZlB''x j3i%y15Dȷ"@ 'c8~<F DWxwŇ0C\Tkq ̸ lbLst'FL<$&ec爗I՘=r_c>Cl)1^шnjK/׶PqB?]#-XkFϫ[ЃjϨ9Ruf";!8(ae E;˲Н]BSȨє(C HP +iw1#BmÌxhp;_dRJ I߰!_cΒ#Ղ*MWw[q#`~]\zii&Nw-;e-=aufKP;j WXuXs/zjՉ‹\57&Sj̵4 h3VRf(.wJgܺ5-\S ‚zt.1m͝_n|WX0R:rV4&DYovA^iTm &I5&`0dd(7FؔaXv[sG&?N}kb*7\}O愫V% þ>еK%J>=.w56]-8 +bsl u _7L^c"^hϥQ&RP=FeYs B1*Hյ!,^Xֈ6gv>hEs׷m}NWp:,g~a +gRQi"hū@>"iVV!dKAd2)Y酼8ʟ"/CgGdrǝ--D8cK(>5!LqU +r*d$("eu1Lj9YlhW ߣRUΗ4K !6=%5MQ&3 +s&$&H(QEf-1n%/ش‡i BnKL@h&>W&Ap[Z72(MIIҩl7l'i)3KhAwt-p]t"r"k;)%-[[_px޳:iqDG_LÎ̭q)?5u:gm/H "ϊU + +[Rb'3 )m{7Lm(l,!;k-X5;o)0w#+fk[ԑ<c6[^ h\@6Lzy: VZZQ0!V7߯-i7yOܓ|]lrcmY@x:I{sT3Uy9bWͱ\ȃ :|@Q*x%MnU͜ D ԕ{S˜8QU^{v[>o!za^5<zsr +/i DfhsSNF|QD1_-&AʘppL/lh2t3fQ{ 6 + RxW9)?§Xk%'_nXHG)_3p<Z i1TU<-t9K<TWRA2E  =[JW#ʼnPZw̗O{T[N: )8r.F!>2pĢS2-kBؖZ79=B)ZuRzt+Ey/Gب\rLiqZ-0  o^njCiFy=>2ҹ.Cv '[jxKuJ zTEz\qP]ټv|}%vOiG{l2FEYs7\"eJmA:}K:Al8ڲ65#feBZZޙ DNC@@ăLY+k'kwڬƮ)۲tl6Y{YSuY9[;ܤN iAEOX}]8E2ua<&"v'ĹIpL) +LWҞ3]LUiyZ _|pi#5M>AV@V! + s)lx +"hqblyR%I@SsbO(PIe+{HĊ&ӽ _[OBTF]|}ہEҷ-W 7O ^b:ޝ\TR]SJtæ|9د"cl 1V45.^z^t5{Z\6]͂pEZ[<-V;s{4%Ikp^?]ir{b pS/j8(@+Ԁ` Cr-L>Uduea;-(KOsaU3HEې#ce7gc?ݛ@fXO+ExF3ׯD+jT%nOgkGW%[XWw$g8g=I2N''$JxXI²;co򚑄2r%C[(f18dav1O f!}y︆d`@Xnd.# 9h-e12IaX\a :D&n= ~!mo/p¬鏆=^*KA׋oLdI?$%KncTM?UK<]VT=Nˆ^Ki+y*Q.` @,C7zuBz U8@îRmF$+~P=Vhʍ*zP/UQ/mx/N2Iyj>7K.g:R 0*g\rMY~il_MxĪSrPSwz6c9b Q6@['g(WZ8DmkIz8^":y@N> \ڛPay~+(a]3DŽ 9ݞ +nqwSwVfj92DT1DvPF k8b~;d]~>n.!NyN7NXəC+T8NIQS`Y0?4 x<'Z7̃g!mDmm6ߑ Q쬣?h:il2vNR? wϢEQYN,Vo"~rH-ķzte>P7ϘioΊdXYq[p0VkWUtڰ &K_$k8d0O#VneYH36`e. )2ZNf2LS~]@Ld*Jq7wE1-S &0)xnZ{DeYJ], A-bt?H4/s+5iCD9ڴ$"!Ղ@UDm#r5VY5?bkwp\|i_91:eM4m~2@WꞁlZ틐Vr+S#Z-^[s1;QثemYeֆ$9cքZ˺eM= ""Jy\@ +.lsMY#q3'dy)ZmŴ-IF^hFgmwp97ĤՌ^U,_{ܳ[ǯyTM'Ӗá5<\abcP%:9;ӉK}*WP­3`Ŝ(jJ:vc3%ޫ$(DJi}f~s4G1x"n<rz<"^Ֆux371|;qˁZ +8W8SX.yކ>MXƠjD!E8];SZ]O!ﲶ+'+{_"6@ cpZDN.᧩X3Agis$ 7 U +6ޢ*$EtQpj\ bnIH_xBPe4K˜\FTQ +FעkRrhiq< +CӰ:5տ5<)J)79[ |#{N9X2O=xp?AوQc_;|0,QPm Yůh{CM6gk uZk9>gjc:cY[.[|Uۊ9'a%9IOeUN97%|\-$_[׏Չx"e1/\gUjneji˜n`U[ %b%?dw}Zs,pvH[xr|S%PE9'#.xjy[/jm=jݿ!i<4]lmuS"l% :^hh^ԥj9ض3t"w݉e dzv~6CD],x36H!&V>;[hdtٻH{q d|Y,> c9xD$[B\%xLGԂwYlAMk2 `jP_4 TG2¡p[st?pÑ,4<qqr1g.56W[yJ忢)[HE|ou|4.X|$^s6lE2C#v/^X I/ӧ yD"Am |y̨,̬MHkU]{i%鉪Uo*c`YO.ӊ$&1P/* _l4 +qڞx 03&<@öAoްRӉ p-bѿ*pq&s[n)kŻ뚒ӊ50NC q,1˧ʯEϴ3T֒=Eʳ +_s] ʞDCheG)I oT?NbEܜf+'}#hX<'{NfHs$*'Ofb:JCi+ά֯cXgd2_ +y/\"çs T=u^an`. ґk# ,hs,׭c/K_jsH;s]d72߰Eΰήm{KL41#_myZHTm v3n8r4aᗰ3HeG[v;#6_֔>!IFQG '|6,܍7Xo`+.8aycM}M?E$D%Ւ۞M_M=.ZT@Q(KC[Kk%%ɪos<˲Khhp+PlJn i;YӎLucuj8R%lWf&EUC%X[9ᚲ~$~uۖ0Tq,D]S䀡m{W?Dn:V,QW +N*p}5y HQD lElY  ɳWd2DPpQڏB=ֽjښ‰@(={zW7?rv﬷@c />QhxּĽqqѻ?V*w}Pm0ЀJ:# J|)|)ǿ*RKDžQYk(PԱuA=- sIfXX@x?X<[Kz 'ᖔr"^lQVFJtJĹHqyB+h PE+(@tjp['y `-J9:ޥv]DWY94AK+EC>;z\5G?Ko 9 n-,@շ5^"0u;^=I'aEI挪(Wζ@_s͟a8+ A e5mu݋%a3mN&Rjoس?ϑޭg5hRRXL@,L u`~p),?CSI[O܃|_HKES<5JE)q@Gŀ!/S oz.A9"*Za[)h_1pl@`ڞlHR7x!l~敟 `sYC`OItny)ՎQԦd +AF~+Cc9/NtӯܲavUџ$MWM }ō1hmohF^*; q'-oܤcE[BZ[5)8!j RkIT}):Sה̨]\B`~] +4if$"׵aR?\]i1`qCC6g~zsə³2_D2ܪl~\ܟڀVCf?/f2]INTx9"Wsu.BuN"*Ţ}U4LN_ψU>Ѱ$%&]*_u7q28}Gjr442/%dt2m qS٦#;WC37Y((Z_qN՛oKc~V9iP0" +D729X.i' P# rCpRML޸;a7ʠ+-7c|\LY05|-lŭE0ERJ8:t;)adsNr j,܋KM3 g3l+\do9 c6 ]]7 rPݰ7sƺtl˛NYxnIFaxKX9|ޤpL.6"YƯ\fbl~#W.v ݠly%yrބöuW. SskhnsY'{[̅d6=Q20Ha `Y2}z-j:\Qw(LkK܎u3Q;OX-_Jȵs,ӢHy_al+I1\vX8Ɵ?3E xn>P0p_c4ET~OSؽxz!^߮nYn,9p^ƸiiEyS#Ui1FvHo6T_?SvSthfցS&+O(1;cQ.a";=JDPDcL&aH'lZ}GuyC cfBׯ:-IPS}*}!G{nu`Ev쀟i4i- 蛨I 2@""'t-æ՘Gj1#@ffkB +p͢Lp 8GVms\iiIIWBO2zig?UYng`N,DLs9Vv(ؐN\+f6D)->Èj7zYO3 M3v]@Ĭh~LcptGk4^ZbEJh}]K'eM=ƧYI/ #b Id}H/0,1hg*%X*$v="}U牮ℤu8QE S!ڑʉ!J%x-荺j8FD +q`5zkE!sLFI{ML&ًEt:pbi)8Ϥi/%N`s:Gu Mhp_y4!i2+ +l4V?lT4-w Jj?ƕN @hQϦ`RP1Ȧc+_UߗTB7Ia -P` &h +ަ^YvUYTWv-sVT+Ť`()z:ܚE<Cp BT_ "U/<,V#J PS0uF5E@ Fr(:Z'NWW8\[ P%BI m,3K2i+a) h^VS(9sP.D}ƴ%DfB+҃ +-6 +ڪ K(ڛt[ַ=sWƲə0M9fmS-E5i~[H3NKt-dI:;D&:I4PEJ͛$n3%lO +si9պ11BR:`.nX?/ceDh#-/~xV/FS,jLH|h,FB-AfC"49<jY2hďlBV햎PY}`4щD/P9[_񚏚Ή!3VTSsgO߯!5҃N,MC,RXQjT_Tښfbe_OJ{|\]EäۘɊm+>@3%io}Ԑ{@\ƭW}YM]LLyn(0rQ>bFH<)(K((pHOK P%:HBOTg=/v\e )/HŌމTyjj𔎡bj"!N}ܷ! vG*&)H!J~NN3wA|Rj&}z54E=sWG>Rm#,RQm:{Qưp>mhVɞ/ Gqr +Źd*G>ꈚ!wM/U?mvtKZȴ*;FQ3lI(Qe'NUܳmym˴+[o)>3SF&׺n‹9@-Υ/C>Sc%R_k!xԩBn2d^0Fy㫀h|oڒL6ǍB> 4 +6۳+ wկۓݏ?ݝR,R6dvCSO\e=~|?2}^k[Ez+Q f۶ xޤBB%],]`4M/%Cw)XMiz -J猑R/ܴ łb掲Qp5/_^%reD]}&g{ !e 5"b(,CssnօRї+cE)Jzo^.Mu?% ZN{J1FWś5\.9(*7Ǖ#h5WUL:[%ΑHۼ|R2I@wƷ*X[J:\ר +㉙"r^vۘ[z1:._%DUkv 1kD{$cf4a5_V}ӌCSNp0@jʭ4'Ua([b7$ p& +sn^m7&9都،_cDUPlZ[ʳ>${;^AǑnΔW{CfG Vj<0AP\2{#g? `XH-)7ٲTvTo4n/iL >f=4k=Èkԇ>B +R:Wj??8T5ՁzҸ9Iه8RRhLa<g-Osy:@Ɩ^gqɽӵI%*/9b{V 1]-6v= 1 r}ʌOex-HS\+MBɉWPGIx2^sMGO-V]UD` bOǞ ݓ㜢bZA<((&)<I/Hpq++Mt}B?5XHbcLb\k>Ex@X(eJSq!dUG3OMRiq |-!at.B.ɯR|])P!dHTOk$'QkV:~FnⰖmU W*qCZ\k>E +#ؤ'k#t]6M +^qwQXoM9CPAQ),go! X.zZ,. +ˈe1e*S%^[W5xQav53< 'xJ8:b$W[Tǘ%-HI;Ѭa4²6ܤ8z0҈p̩K{oU/w +K>R,VR;c=eNfMHNI?=)P7hkʔ]i"r:3S8=3n뼝X6&ՖO6O]DRǩGvT[UCay;쩢}.g\ 8^O(+omd)Ke/Ψ +W @4)q&*KJVo''7F)$b4^RuHUO0b +*vc& _'ddEP[+~!nZ}A`a e52$mGhTuxoHAR4F +u.ؽo {A6 +2:JӘ;rZ9C7h]]yz.olcG`z&y^F/~Ƞ_KAƧ fZ:ol#fCd$wg)xp{WJR;%=NH9ﵽFI+dvy ֻ^K0Ϭoo;X2 -G4KAĝuGZ5uQڛAmY@FO+/2vgrZ)*8߬)hR89\` $u,0(Ԗyn5bcr*bc('X=-%@gdM|eODs+' VÓ˶z4oПXS-տl1,ddnc ڌkwDu![M2$sV}@P9x4xKD1QKξ;t0;fN Htݰ 1}-_Yv,}{] inxuQ~LzC;5j_:O᳠Gʗ + *hPV5 ohiT$ǯU{O`[|qmWհ=$|w2gVkiVy4AeLRakpWC4tzEEgvؤ2yA3T8#)RbGaomUCuHa!n@ȍV0OlVZFkSh/9L6A,Q>ceZ(kWaTw)."1ߢnag=c 1 +R&!Ӎd%WS.Y]-㐧qbE($L\J%+49-MQ蜧H}1HRڂQɀ+CJencJcrZ٣}^$?)CL~5cMBɋVJSk`!rjY>E]Ϳ hC5d-~sޚ+2f;%l<)P,l\(N5زM1bǬ揙Lq8!1,ws["mqO~[tY^]Y|_~kMlkd&g~(5M'Vڔsm|2[Z]-j㪭<[鐟5 j|s$N;xGݮ^Zs_Z5PMYԤ_<]q(MO>\_HNW/Z7Buvff{R9VܰK [fISB3E;F<BBF>F97g9 +.V)mvpx"#nɿwqN-U5UqNs\PBQB[9zvfA4!k'VcdBuUWC~&?ܭ8ktJlf!Çx%< +U5D@a-{Q"1uE⁹&)?Gϳ7bɓ2`b<[X*v(4Y%bAi-ߠ54_L1ӑ~Lz e $Vٞ5=[TĺnqA+ +,} Z/xD@'ʻIMPO;k( XnfȇE zX,oau +)T_[# Hc (\8 MҫH7ZkM(K|)G^*QŤbV1Tڂ<(nAHPX)e";F~ 9 ztybTނ4]W@̆y!R[sdz|T&{}0G= +dgn=UTcn`"Ahn~k{/} +}Z[i1Xsɍ PSeWcsoD>/Dk:=*lagzN`CCU+kSiտ< Y6QU/r,gF<'H +IoGi'UQ2PؚEqmђO"ٕ-`#)t˴|7W2c4RruP>v +R*\a|k(㍇Wdngt~_hרZahGHU+]5T:9HcG~MLߩ]B5r4~ΉH օ/Pf +O(,Ϳ~*w&{,;>UϔRؿyXTԊG=d +V^0"@2 o=VL2'\0} Z.D"O! B!悰U )P)sy w" #|8/Fs6 |l9WQ}VөD]3n$3 +O fu[}M:L"C8fXI]jczI<8yS);GwwtƱx3e᫳2fשs6yZwx ԦҩIC_MB?H)]iRKx9e= {|e i,nAspTY꬯jzb1|#~6[(4 [`! + ."2.@HHɗޓ$$0PԖ{VQfHXlSD3l=;92v^µŁ`l'ԱX׊w`5qꨣڌ:~!vbht8x\JpFG[zP9P=V!:[1^Lע6cTDgt)egS:HpK>\S4փ>jo8D|(-@7*i cAx6Rw Dv_+h̔y յKCF'6^8I6k|.,jU +x4>40wPs)x|i5t{.ڰ{KJ :u[p \A Jz!`Q,Fiٌ8D?GHR; +[vq]'UNkB%?2/N,w.i$e~ +֌+3: e.BC1'N39OP;6Mz%s5[2`eSO)YZ6֩2nPDYY^gLGVɞcdIvuxn~ z똝KvPG*KsPydI=X&(I6SC7"g#]V3 NyjFo7e R 2!]$u#?*^M38_O/hPyn6* nen"°D shF0hÚc^'ѽBB-BP ;܄)WNܩߒ(-k!7o<&X7n*,4z%_=^ I6"56`F_T9ܴGsXoM +@FM1 + %Pw9'{l=nZ +ZĪ8njŢx\g}/N0NXe0Bhp]*lbNezW,Q򏐇ҍ*2er<+b"g!L#@rH +H4TGDR*>]&_ e Kk +PyP*Vo致ADZAZC .Bh3U0oPWT}wwI^8QP@_M` jݸb{?0Qe{DYP Ah ::*o=,:IsE3d=XX4?tS땏TIoCC#f \&IdR + C&X({%彈>S©!JT*Լ»gfDWCJPǚ5(ZLϒd(PwȪ5hTwTSo3 E|e8bvmrSe{9#Z?Bu&:f9I2 ,,H(2I0싟"[ȏX>6 bsx杴AWV$|mٛƚE<֋)zf&1HD7c #Xn +؍k"(oh3.w榈gF&r߆t]炻S8:c~_X{}[i}xLJxy_FopAhg,d}'UZ8 ͂Z1v4Ա6I@SؒӁ0R;`m4} +lQic5O򡖶c0g-űZ;wN!\ҝ?l !uK7#ө&n (m~RʝexꟵf>&|Igg 6Ͽc~&BNŜmȓ7`s2tIaunv:c* +zSҩ3 4ɛZmhe7]I&Bߜi$/P:7ji<zՂ O3d{4ycB>"FMA zK@~ ![Ea[mkn>9 |^ *Ř#tÑ}<H:S`9̌lv>h\4pEqyIu}^\2agYs&9~DV =W?8K{Za׷&[]P$`)9GݒFS6ИHzԱJl_Zp7',n)[O:kL8r 5l6rrK ȡ@}Md&pJ]zѺRU*RD_UŃ/y>y:?Z_>;6kfD>o]BnE!6oDYb-*c,{VU DkeQstl5ǕuRly"1 7YZ +RR V=jeپp@ݶ]c 1ij@#-+g5n@&efF}܇)2W + +~U^rViĠؖ?#SNf4sNJjKtrBs1t\ Vn-WT߆|pUa%jq.>!=NϢu HٯڥJ{e^ 0)A !@+b>"I$uAQOe {CrIYlPfh.<*4M_hAtr&Z^W,1薔#cƤ!F1G&yʌEHbh-¿$V屬y|,} XG]ߵeJu{py5w@]lq kAWy+ۇOy>muIMG<[QgD[0nIr+gKs`o)1op؈{JS6G'2rc%ddu*I[=*ƍ +u#jM|G+Tk*+g7Ls0U.lf!9q]gAiӂb1Yrރ^YvqM( Y^;嶧^GFxIZ*)zE b2Kύ R2J7q/8H;2 ((I ˥y]qj)[/V }P3oppsq~ǜP<*432%)m2sx}y971~X|),4)sk>TQf}-37$ö˲xIb4OxPtmNXUiY6^ٗ`K΋Z]I8XԩWsߡt5[ ;|?ݐh1S Q 5#A?0M:Bg/t]ڐfbNB(sdkBEu8$FxM;-Cfr4v0ࣰ@gVW]lB+6~ƈ=Kchۄkz&{nj&92ڌ.ՠq]!T!_2ؚ1SQp,a>~~)nZd|,&-AB "PwWl( ,Uz 5K%!DYE]EDVPOt mQqAXx̛7;s9|1*FJ=#ESkh aJڼ +AojJq%{Zpr?^lTcOVIG9z9{1!RSޏyk\7(I&dca0)>wM V{V+y?JEVH3\~;~FC]I<$m %+CU8S\ +pjƷ +i:T 7u8/ -O_zil,+'u^|,%Sbqz1LFt!&8t -KVo~N4Ғ B'~@ u3j,'Y9 +)qs~n +ͳs䖖')r|fql6s#f!xyu4_^O֐#&rw)6AZ o, [dm +rS VY< SNy>wp +zm9 1\09Maoԝ>jjXd|nY!^1GXYUaV(bpm߱q<'u KŭabwLf#fA +1 @(.$0cdJaFQBZU{c$+h&1Ľ8*cA4S"ӻɺ&nǠ8[E7׸m2{¡ 0\½ȏT7> &Qߥ|> R#` +cjmZҒ՟U**ByN,GQh<*.{KTmI1i!(GAO!A,9pyqX)0qP5T Of@`ͯ8h+a8 @;48:/:|@hx^lʻ$6Xqc<y/# `}ߝxC!`08b1 tT3J||5=sEI~*(8$K6#Z<+ųmָX;{'WI6FjR;#sCyvʺ&+6(7J7-[s~k?P]r]v7ir7Ѿa¿D`"c͟[87S?_MiX\FZ#P#jJt QSKրvB7K/Hoǫ5L +LffSV[uVC-6k!7)!NjZ҉LqrF&Yk{<@\+$;rH?<@0A%BCD +EEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abdef%g0hdۣ/Zߪ ;iǯ0Nlɸ +,Os>lśHq̙4WxԘշ 5I[lzy`F+qO, uO)lF!gD!l%m8c , + V # g;^0{N"qE  !"#p$G%%&'()j*L+/,,-./012p3\4J586(7889:;<=>?@AB~CoDaETFGGx?R@,AABCDqEMF)GGHIJ|K[L;MMNOPQRuS\TEU0VWWXYZ[\]^_`valbacXdNeEfd(؀+ˀ:JXkeVtA,|〟~׉~ˈҦ~ч~󆧨 [56j_M.Ub@p, w$}ߓ}LВ}=~e~#z~H}~tAi8~T~͆@'~2+|םB|"Υ|/}s}F2}||}h,~S~F?~p+~| |0|INK|gϣ||ݕ{m}+g=}S}Ҍ?!~+l~aW{{P{ӧl{|'w|k*zj|_fo}R}q>}Œ+{~{J޲{Y{j{he{n|y|ae|lR}>}r"+}D{ďa{ȯ{δN{0ˠK{lv{_x| e!|kHQ|ȕ>Y}%1+}mzhz8tz)!zU9{.ŋ{q6w{d|EQP|m>-|ڒ4+}3zB z[gzȉzNzv{;w[{d&{ɣQ |> |+}z*z|ōzNz ԉCpu>#%4cV5)jjJ:6.;s~jj2ըVCEJV+ǫ,o]i 6(S{.}_gH]W-Pđڬ%AiM>N{+q&CUro*pHh m7:BO"xQOi +a;|q7bA'):8%Xܯul4 +}D0[~->IpcOYd1XF h3SB4rE:"<;$;:ׯk"2wP\%U:%#y+hAZqgwu" {^!xH_m0ξJʹ(%@h3ҭyx +1@]!],\~HJ_? L@ M)LD"%9)ey% :h~!> n`NN<ٵ/?Ss{=ᰬjxkz^[uIN;3є=&^<仚 o҂WxM<iOC/2ECm*wdJ'ni}gOٲx1X{2M+HIP4#x06fV r]2&n2F߯dV n;ʣxfI;Q5Xm`\sc2EAV ]+< =.ಈKqytHK?dy]D{irn-< %c4VlsNg06Oߎ.'p dwIsmSzWzWc (e4VT8k^ԨxD͉I "ǍLŋ]ؐc?fljj5[c/ +ʯ]1GjÖNgGW,T$=]EN:uİwv E{䱙6Chf()VލLu&oޛ,fR@7W}(\N:__zQ> +}3;/e3ކTgMN2_6Ç=^9ADUѵ,S  ׂT]DA`ATT%L3Lf2i$!  D +b{}z_![JR?&Z;AHQan@({.YOwL/ W qxTd`Tk  +18mL~H nx`,F}/ék?٢ɥ<ܧ8d~G% I=='o\*_!9&(=zN4脹QQy,\e;B*LM//eG9?~?&ʯ -8QWeH. hU61f`@T'@@qˀp =­ ځWTz 6_B6P=)O-e7Po-&%x[A/ɷ.'c叺O( !#9KM?!׵MځZj6wu1g+m:z G ˷ˏY<"ExQtꁷ JJQwCy}yy]Y[B𬋆MGpm=>K;9qw 0\u^>>P5Pޗ4d},..^Z)QQiZokH + 0Q@s4rStvse<:lPYՒ&JȜ^4lM^1>Q#f/d!rE@*vNCkVT4*HyXG0L&8c;2: &w<-xe +3lX9cŬ* +d1zFzii0k + sʮS&0g'ǮSzO8-1vԪ{Xϲ5'&'P% Zݵah~Ffe-:K"D1o{|s6ƌkї2V}Jn-k_Gbʼ 6O+*Υq݋Ot7hgݧLK`z33tA7ʘ")>]UכY~ECh{,}4~O I61~W2U.Wg z wr4)6./s>LwW ^:9ɗ:- $ s\tPN1~C_Eb#^a>녻\6y5U׈Tw<)5>kN_*0`Gk;e[eZuNdO7"&ݵA|wpL: +V^!DL:IT- +˯^O8n,t +p6mreYME%wHҮS&e6Nx&Mƀ 0s`R#4l'2n^M\34\HW҆c 8a8m% #(5&^}?q% |^_S&5c8KS"C#%%{$:w"Y @'\,U֭I+Wfy/J깜3Y#q$tkH #ap%Xҭq_˾Llq~zv3^꥘C>e~)~ +?b#2i7 +T~-u\ŮPC3%yZhWr 0 Ulg8YLGBZ9@sʤCYxmԁw ݺrUO\ATDN8I,~,bFAWPeW3rReZ]< WݕiD`6pG,:l a'["[):ZɞmTu]RrdZ!?QipvJDSyB$#уQke7ֿ-^]N]mcQ{vWQLBc^6IpgMiK?=9`Un뢊g$ܕKVp jҙk<|?wbfĩFi ȫi vX˲&e#Z3Mt "hX xHur@j{)NGoAe4deщYZڣ e"J̴7x;buYMI :A4M +ce7F +XZ1 +Jpa;-6{\JdDӎ +aM'UL7,NnfȺU0*B7K8- +LGA_֍ɏCmɊעsO 3~6lMs8X?נ׉X2c B]UtGݡUJ9ܙJ o>.)Cd%ޠ:V uMt лohܮ=ߢܘ^HZHT5&{ʯ +|D=๝9_B.R?vup=oiHӑVuGU΋270=[Ǟ$2øR>6ǦV\l;Z܊V +Kv6Iz D[BGZO7e֢&[)\|Jd('Քȏrv!^!qKy=#ksbh'9rsrY[klʂ4jY8I{P,YM⑁ PƜEB@J=GLu,Z[1?+4֩}֮ZFOQ-81Tzw UsZf;9-rI7x8.ԜY~R8Ѳ}" %Ռ,GAW"VDD_d5৪x CaB=H~m?xH =EKEWOTv>}-jNH0sQIFa7;&1{'"kz,hV~}Hr[gǓR[[=P>F*M;Ec1߉'ъ~ ؝,r7MfGx[הPf]E;w1X( + }vWqĴufKқ[0\{PptE͞w;sD1݌(,x Y53Yh}qFeӮbZ̨P$nE ;`Α1l(I |άpس.ejZsOEss;Pjh1 m(b U>|+^p~neqZ,1O(EQa;C1(ui9 ڈsZ~v0}jr}` +}U~BKg~ATdi76.%Bdfu +jl_޹&U`K5A0.7ueg.&*%;׍ɂ΁9˂u;jx#_TQU:&K=Aτ7i.,q_%[7)̏#uEmjg؋_U-t|K +BA%7d.1͆ +%w*Ere u`È|j1{_r厱U"J@pO7bS.C%VŅ$Wu ܗQiݼs_%2TǰJéЎ@飹7c._m6%4pڀ2͟ tN i^ⵗ^TgJ/w@֣$7d.xՊ&iAwPGtsˠiMVD^T]җJ}9@Ȣk7kv.J&GN֩Mt2MSiѡq^YuT&?MJ]@7zp.ˍ>&t#qok)shź_i^2SKJA@~7{ .Օ_c&A@sh ]곗USѭ\J+#@7f. Y&o |zo|z̑}3{i\}| )}|~ }/{~K}gn~~*S,~~>~*(~{,x{o{ta|k`|ǂg}zX}lJfB}ł R:~>L~dp*~5yOAzrYzC{b{͈ڌ|4y|e/}Qa}x=}܃*\~;;yTyg}z zsz{f=w{xd4|gP|=4}a*&}׃lxE؋xΞAyJ"y!z5j>zv{M*cQ{܍O|i<|\*}rhwTx(3xy(NRyƉz@HuzՔb{nyOl|<|*(}VwՅwx'ex|,y<yНtzm}a{ +_yȤ!Mz_;{'*`{ދ眃tx؂yvz+9zқ{ˁ|?ur|bAI}O~?;ހ~)lẃ< +D#;큊ZtLsa1dN/xN;SY (5eڋȀ!Fvh$lXP+cu}*C+S,A@OB!@#&2*!Ȟ*RXQkN=%Ȏ &,1j= 6>Ǐ@3X-䬛RK>v'A5#g@x+7w~dCZȟB|s% 1 9ōA䩝SUYY=X3 dgcL3a ͺCnԔyr +lf;~7ޓ~~5f$|ZfDu`2@$\]G\@]zTe 9 4[y#'LY{@m!c>zn:> =.+E)pmp'^2%"qJl?o[:x``:X%>]RC K_ 8mI :u$iG@3zs( PZOr_xs.M"`/WS$nw",8X40m5<ńo~h n}DnaϠ+lQlW^Sl,]{ v`(`R顷Uږ6H['׳W6!EI>_pz)xxcvL0bquf 7?jjh>?^\Y#ʯG)RBQX ~F8F_D<=v~մgԦ4bDFzGv?VBa_݅Jh3Zd+XlJ˵a?wJ3AjVjIgu>LeX<R0EcrCBqf`cǒ02`j;1;/FPcqh4$p/)_uy{Q4hݓj|ۗ2<.LU$i42"L?`RԺR磇@*C!`(`@,2Dv_/{ @ 2]ZEWARSx*dR*WSq!Ѫ`$r"?lߡۨ,+@Ymyon-rI|Ԛ:Oe)Cd>49l'C{ K` HzZiLZsz.fT";ib-2(!-htB  _a' am/ruiP[FUYtc?&%'#'19Nu#7od%o ]#k7ak3RLhUkobJ2m% }01<:E4q2Cl^^)iZJ|jlk;> OP|"Oƪ/kQI +Q<_CUXyF|sM{v*4UWp`H +0 8Jm?qWߞS|lLwy ޙȫ +NL헡, +l~øjb7*&"4+\rT'Vn\5.q`&s S.R kICwv&[r{k\(1b0@5l@|=:s|ESҮ(/c[e4Mty^@8uX!L*<$TJx4k?.3wjnItv& Mҩc ,RHrܥJ]2`8ZDЎziX{!ZM)"pWXtly@@^3cW 3Z+mNƊW O16 HOl> sC +z!(A p!UjIRU:=ح.?\jDtE"5c9!ه=0 /F3h8{24Ulx @ڦ>_L֩l-@]Nk GY$"N (64{/ׯl"eGeu1Y/ìD6J*%F@M#x|hUGZ-*|>'叹5EJw Ty[uG)P*Gb!#a-v~0w[gcZ9w( eU2CKLM+2sZ*»as̉ͦEǟ3pG(]3o2ڴjyoM.}]?ڨ \4 n;b~g?3FG{(fi6-Q y)d2'ߢfX!:=\dLׁz|WcGcIJY)Ų܂FC"]AErrz{0j2[%by$(=]1l _dŶ yBsWܩ*pǤ +,g,{?//\~7&(O7Q +r# +jk|h?|s.jb6P^$@gH4<%"/+0i0 =yA ~'Y +NxR#po=F͵ڞO-t&73<á'$RM»"0XNG^1D>jhQߨM}&ǨpjO|dh2:'x iT+kmc{d4.W}iK?^-H,Q.So2P"rcWz$ajUNsZ2i󺩢qe͑ + hIGO^)uԿf}C&=44>-=m0 ji˹|\QXt:!ac7P{TN[\{$8nh/ymp] ve5"1 ԇ[SN[Z=E1U( +A%RV*Ȇ ^^{B2ણ𫟠pZ'Qw?ⷛK7Մ;wb] +Q.7 f#D(xabaO"Fޒn:`VuɖTUUNK}!oOrJoaxA؇u/PȆ2-6]*[U;/reU^ј +/.TklO"7{77T4^uo ?yi|Wɒ4}Z?K5ukqrt-D tP)j}6N_߳Tڸ4Iq2VQFޒH@&5(AJ)]?E,{zuq yɴQti_nE>JEWT$mT- +bH|apԠ#_RBfxS)yka +ex()S0I'b9F`" {1ϫ>ʑ[oc W[YޙwiP19b$,&ĀGht~In+d7*' W<̓'Hfb k| %c*p } +d>_RW2nqQُu5f%ďܖ5b9YŔg=0^n&kk;7O,5|Wz/é/O앗1/˹x%:Y0 +{XG(U.vabYG錝=2 D^9'rGL^ ;Zc3z7+g EHu`V5 IDI|31vba0fsq>5vGYyf?B,ѽe91x"wԲ`&`h5 f0ظAۣ]SMC4aZQIPD" B`Ic͛DU֒v#(snQqƨhM^{M 7nJ&*^(,Y(}ctS[WU>= ЖRl'[N]@X{χRzm0WIGe!Tht7h=¥T/sp% k2ADotm 4Py3#+: Ͻ؇eHqNC%{YIp؞ M+(z|= PW0aKFT }r=,Es(ŘVE:Ȼ?pT,CV(fiEGArCj$Qa_}$՚&Zu2kX(]Ϗ /&ōt}*vŵSk̯ޟaIVLB8疨/&ጥ\vHk[`H6VM9LV*Bs6+8֖D~/B&ItЇ^mܺ<'uݴk:=`QV 矛L#כrBR?8Ǖ/' "{ry&p6‚ykey[QzeQ_{5GǪ|#>@'}4J~,d#ˀzq~p ~ey~[0~QCGl>1G4i~,-#Ȓuzooe3Z[ނQ.GB>)s4,?#-1z7yGoo#dZFQ";Gi>&|4ޅ,P$3myıo(ǎ9d쌼Z0iPpAG}->%5"&,iP+$R8ׄcy n" +dsAZp|EPGP!>+5n+,$ˆW$ymÃ=nd8AZ-P}G*E=򠍌5 ҋ,"$ď1UfyAndEc"_YLPGG=65C,”vy$󎪈= +Kxˆ nc}YBPDF$]=ٟpu5,%2ވx|mռ*cr#dYl>Ow=Fɤ=ў5)I),%Bω F$x2mJc?ĤY<٠OFJ=ʞH52쑂-1%_c.syzuyv +òz|wkzwٝ#{bx؉{yvx|[zc|{O}i|nz}u6{ja| N|;}<) }v(ҿw w͇xw8y'yڄt zY`{GM{;4|S(}Qt咈uؐvӫ"wp(hx8yNryЈ` zMM{]:|(|t tSBuؖv9wvxTqy-_6zaLz։':i{(|rtsdydtTu6vFv8awƕ4px7^wy7L-zg-:'{?2(| ޝrήsctnuyQv^pfwIpx6]y Kz9zM({)4rdtʝsU\t:Su gwu򤴁pvoRwϛY]#~a&uhbIQ;5)t'VAZẀ|%搾0S#Vuv?aboUsmDցzA6 hׇ +ƻ%LP()HPu'^hvPءlDntYryW+Ŵ6x'&ғw-Sq4¯Th00"7 +R.'|aO&>0HS#ma7CG|3=7fx[:I_ƛ[SK'fAр/ńm8,po R-.\ [&g(ǂ\/{,` vbLT53E7\`NE^'[ϮVvӌ˱:'SQ1;Y!%f&]r}0z[5{rKG-Eؽ%݅!t2!mjPwE5;=~&HRߣ[9t1]8tslF0KꋾѤ[Pl݁P[ \Z\!֫MbtݜGh.3 ݤe t e^VAW7G<{;!5JD-mވdta~g4Mhw Vkٍ<%C  HtHH3@6! peP2箖墦!Hy]'N!zAdUE{ daOAy~W2+yzx5޿S?t7 #mE%Wir=#^+#>^Uu{ޓ&o>Y~<|Hr7%#SRI5(Eΰ_hwPI/6:%[?!.`D\bBnHjc(x8]+6J eAF4b+i8&VxqS:}ۍ<ɾI-w;@&@[Y%sd4(aBTiC0IvRNt>Xp^4$림r25BhBT +xG(=?j<@-h5-Ά1J8)5^6JnyE UD`)r.6 %'IBXEuǏoF_Y2 ;+CitSttKn:Inq;Ԯ +>M144b3fP/b$׌Zp 6NAy$Օ2>XчdmpG|j3'l5X)ی7=a/)JToKOӯGI!S~5{X!FM"U晚!(_'* RKQb%W!6Jӽȶ5T nQ + +*TArNr&f{.qM LqL&0N;580]aBe cJNZP6f[(V2T Z[⢸Fj #ldb RŅZMzjq0* UQ,%b 3!=HB2ʼn +n-ugzTnRkVA^BEp꡺a5+`_iiSDOG@r|12LEjPm,X >^{%(㐇j)~4L@}x!YDLPu&|:41L!oΉނym/4t}x2a\D@n]˽hV$s3UmIX E^a'LeW NmmioQGP}ׄR6GrgIoFUٸ +|Mvb [|(ߖLwud|іx\"qmw(Ta]g@5:^A D{l%Gly/@bjDؔ݀:lK1I%P&Er"=1@cJ:G$x|@෺z'ƛ;NP);09%*P 0[F]^k~m(WmяMQe + g*Vsfdj4!N̩nOGjmA8!#)9ʼֻJ'SaZS eod+ekٓ9CHL(B,6X uznzMA*\_OZw%A}a209Tw"G(>bʷp0D7JלX8e~T.¬0~{=#b[1m0#̇_g=dpbܦv/vӽsa>c|̝6 rKm"V7p}1]"%prږC{+uT @=-)fwPU :@b+[Y_璄 Ϳ8q5-,rXd]]a34sU9T/[y9 )KsPת +Vw5/mUZ /VHTM51R`Ji2Tud\ DxC|եߨ:msރYԵ#ݵ}\jb17U@ZGf&O +UxftpΗ~H7qN(s~;}!^p}x5 GwΡO=@7 +DEDTK)(.UR ɔd&ɤ 7a;;;*SAdmw)k{ Y<]%t@,kM@̑nc}ORUoM%I2;5kۮO22֠0}(d͇7-ӒOg`Av=u2"\7!s799x)gChUI!_V TZ8\ x545fl)w񎤲bNJa}(П\XI\t>b7XYR2~8<T5TpUUK +q}#{+yk|NB[I i B]e$5~kh2"uT'A)bƐ|Ϗ-:+<b,tDyI;Lzۏ77ֳnFt2+J)O *Sis%zagQ{p&%pV#/fCҊ/[AD][@ ]eofj̠O>+i:%4弭'DUeQ"h_-$cFۻ +sֲX;cC%gwb3$s-[r`OϐV i DBƃz+)@*sG,#:jg֗ߒ$|tIC尞yP5uTsYmg˶;K7?5'-qhuw~Iܲ^ƺHiw*}݆<f՝lV3_TUУWB- :v_ oSGgn8}=2oNw3# )jM +. 8c +q2 'vذݮhQ v^uw7ok;mG  ;#Cz/G`&0`CnqMP_@]j/;`'?ciwJ-?/L"=[DQFࡀO$FւKXܲ^kl(72"/4L~[mYeV /(Mo 4+1?("$Ca,HX"E>848o۴NzwuW%Mwz mKKwWl/*?/(B/ag}ADԁ(/W,kvkD嚔xUI5ᨳ-5i-LN?{GjkrtoS]sIMHqWRͥXeF XauOs~q.~,.'.v̼b #%vZDUEiF.mmXJM YKO-Yht3Mp;֛\fT4w;SE.!J~ٜ+ 3Tg8~*`-8Ov4 &+ODչTTBI~ɠ 1\"61zlxbAf9tű\'G7r0:b|zE~fS,:Lm~Z.OJ،%ISַZׇ 1,"n-(RD]uZ4I?f6ϓI2ktpW&ҦIZ$";k +TL "]Q69fܕjCf˴qC,4J}O\E+ ]x?<0»kǗxظ*O2ezuS&2V􈤫+hd& W粗uH/l16Nl7 ]p}|lU$巨djr;_֣s}@}x5} V:QOD4 +aO#%z +(*D[0LBof= B 0Bd6FTR<=\`i8ZjveI3yqƨfnw޼%{'J _X3N-ލ}wElg)i=3pb +&|ײP^"#}hKB8m/򻄙Ebov%"-{Dȡ@!5acNm֓;bEW=EEwQ1_牋}+{OF$m~HXҴX+NMDKzW-I +_[JL%k?zwҾ|B=3R{aHDLk½KȞTK}x*͕}Y>ރVՉ'sPF arʉe-3{yh+gԝ:9nb6$l`-6LK9 2G(k7%u}bLjQM4yWPD- +_CPny~3 +9[1הeʞԦdʤqM1jٛP6ds 3p:2_[(dQzI^M,)Ǫ`1;,Iڅf߰+ BkXnXZV0%+r34ߕ[IK265Eֶa:ҭN"ذ BgBS_5Ӫ8CT=ƕ^Y].@Ǻq0y7\U&64@r9ʥlG>·CP7W7Iֳ!|L} +a Q$<4t +&14$P,4]*@qtZYr_D #nǍc&k&p- +-;\T.Ls^Ӭ=XRcap|n;MȹsÛWR􄾜֢6{:~#x,aGp_1OE -:WhRϙ57e2guc# Ǚ*՟Yí+!{m]& ᜬ>6-/%{c#neې[9L@Cd4S6͚W ZFsϡ|/~ !g'>C'G:dTna#| *J|X8R;H4гg +2~WH0G]&&%bcQO\B6v׀QV#EҨ]4~|3.ZgEv7HT{DJ[; /2E:*?2]u4<"?ȥ:)q=DGaW◃da V5KUB*I%T]A%hXxU؝yd}gDP+.~pLRU< dPhz珪!΋+i{[U^<:jӡO x@{$h"WơD%,tt,ͻcdf`KI" .sϩWڞh{,-c(kyH^EL1 y{d79_9+Yx?|\F%-3Ϭ̟XH)["cf]k\dqcxV?6>Oqn"5f+ +Y䯇w͵[i1BHê'a"_?::_?{p9 ],P/e/Y8*݊o,B & 4_^}$!>ra9ByGOpx Ng5xX\ X InW ă-0WXsd$i4ScbX>uq9i6I"N`ASypCwhxY4F4]6mU(cggxc5:ͅoF R,.aŔQM,i8En?ҝ?!ÚGF$NE76[◘xx1),5G̋)El `#MIȑSAy9=h*2 @0Cay-?uF5הǼkEc"x0%zӽ !yr$z±ݠLlߩEkykxESbQl_/`4H 5%Sn)@$XٮC-guc砑 +zܰaZÅJ(J9WQXDhI+@E LhA|ؽ|*<|D7 ϝa4(DÞ 6ua ?rQ}NdƣT?;)IYArCOB_"O9*ԣۇުeE%V(0Fޝ^ F]*a=RÚ#,&AGlG+`GX̱5ƨV̥c7R!`)rt .5vxAL_bYY'Lb&Jq K : ٙd'{א(yq2a7Kj36)x QfE4WwSԙ.T3r<{W  F= 6}G6ݡgh||9Eu;(ݕɶ{?y/ёkup'᧎}oQocI~ki0ʪhJ[I;n$e]%tHzgtnv&6A%f82N5u754@KgdO~Csi4/9Snا]9y7~GƺѦ$$.lwS"'eQV%TOym+'cE$ʕ$ ^QQB^]-6Lj:l5}YMM. '\̔b=daBeHU +眛 %b5?Б9_m卯Iu.Q)^ƿ+zksm5fGN:JRIi:c}wΦLe}I^6,*-z>%X<=&=f&b$zarw;f@chvp u{v+Х6cF ~9lҙh5H#Rh9}.3/N΃@a.gP;)ADwAnlgr?Q#/NglxeFC-0O[5kV\Tک/X{IϚuxܩ)s.\ ##G3a{q P$[Ġ-xN)OS +!іk-h1@Ou9=R'hLЩfJb($i+ ( bW6Mrd'\r}ȀhZţr*BH߮lHZOqĭ~!*%AC {k!Lnt:򥃕=טOKl$M+E9S R +􁐿VC>uM(4Jv?{AEBHt&@Msp)( %ӜP3Xkez֗"§6s͟Fc{RH."#O7Z1upDp@K>am'fGCAe}cX:|Jx+~WLjm®H,wH@5[UHRPgMǴP 4cMnܙ~ZC> +lE8x?'} :遲;V.Ncj\DthU&ptW +T?Ѥm(G@ENux.ls 6*팵aai85Ts)S-?gOĢt78#@ox7~8D\bQ{U0E;C(~fRH)mс@b~uϫ @ߚVEGSojul6Si?*Bø;UJnv⬭6]g܋l0zWy7=O,8C= 4Na\I[-%T)m($[l(+0dj8J,:wa_5c3"*lcqq^yEc3حm b4"}I@zW* qK z]Vc¤>EB)/A{Y昖)yn__[NQStĮSsts( +Wj;й۩T7AZzd!p^;VmJË%zvM'f^cT{oȲXׇL V7!^tjT/h\'M+9T%$oip8oPW^ OpCϠQE#7V e94|uJ3DReb +^BH(~kάe՟+&IUطƕٗt=)Y ޡwD:%b!$gF<{|5bW;F!QmBd]LDdSwb [b3(gYo:@ƒÀZ4CYF>a剺v[_6%SiiGc^]ap;KF 'd܄1UOg^sN +[iMY_~$? c!EUaExc4ZW9Ab.h,0X.Y>=4<5Q:ݏeoB]5;Kq*V7 +/PW%=ƈһ"aY욑?pIWFn^|r g\9ˉQ䈫F;U1'لׇ L`|1@q[5f-a[GQe>Fd;njډ1'V>)暠{fјxpJeޗ[)ёPF -;kz1jY'TlsVzx9oܚ_e-NZh&P-vEƐ;:1%ч0wMn'mocqPY訉rPJ=tmFv%=vw4 ~y+0B{d" }|~wtAm.OuWcavcYw_P@xFy=Zz4|=+OM}"ߎ"~ v~zRl1zb{oYA{O¢K|F}>=<}4~+kt#RMIWu벼;l.-\bqX᥋uOuWFQ=4؁2+q#QubІ kKbQXwO~FL/<04+J#tk(a4XNŸ׈'E˛_<̗4s+T #7Xk2m񆝬wr`ysɄ+hu7WvFx~6y&z>jflnio(qpxrgtr8VuFPwy5x.&&zrʌjƹkߗ]m ro-݇pwwrKfsڌVHukEv5xk&CziIոLklݜ8npvqfsUUt@Exv^5ex&[yeǁhضjy|l<mZouq3earؕ{U't|Ev&5=w{&pyWGh-i-Tkm_+o +tp_dr`Tt yDu5wj`&yvsuokcqISsZDTu4v菊&x0$xcixkרy=myo݇zIqw zsf^{quSU|wE|x4g}zh$~L|2v3s0vtVwuvjx2vxwuyxeTzWyT{&zDk{{4||$}}tU|du(| u|v}6w}txu}dbyZ~QTzH~C{63|?$}rۅC/s˄^t9nu҃{vuswcx|SaygCkz3{$|q!pr͡stoBuXrvBbw/Rx؆By3fz$|qopدq̔KrstqvHaw&}RxLByo3:z%{ٽosvq r'珊s;QtUpuq6avQwэB3x3z%{8oO+plqqrsÚ|ot+`mv Qw^Ax)2y‰%7z;Qnװooq\^rT~!sANotj<_u&PvAx02yl%Jz89nh oyMprq}MrҦnNs._.u@GPvLAKwؒ@2y#2%[zaFn +o p1qN|rxms^tOv>IAwj2x莔%gz2l~i.b~k^'~mt~o`~qCp~s(`~tPvAI?x1zT#|;~|r +|sTw|t@Sg`ղTcC)ʐ + +ALV aPA9zwXS[Zz**z̃VS ]r7O;lW ~xL/'HhwGH\ŮP<7CUXy96`Ȅ7̨݆}j_, 9II[O@M .hv,-B;,Q9]U a4tNNv3Ƿ0/2&l}R|,sd6*Qe%LYp!=%*:|]|ӿA=b7 +L7+ziD-fU܀#Ogʤe =<}* `<bo4H[ Z%}$t!~WY*ѹ$׺]CsKT`[fr;]|K qm\1!7mFCzaHO8!ۢBgh tʼnPՐr`>$N3WujKB-[$9TdbZgsQ3){甎9iB {_okK]-~wzy.Nė+ڋ2nHZ\;a'fër,}9yqa/~`וֽƹ%1xaIiS>ģ՗y᪼}x2y ϗV؟mn&}1|R^Ǫ܋K:kk?Le(P"[Hs?x6@uӈ;)oogm#0 2׬nu͸ nz+2cœ]zXs^)<(l#Ng2qඉV#.|ouiVէ5Y) Vn9K;!V%NDWji?<kLX}~0U{w+z\JMBGδ;ZA.2؝|ւ;s{r`lj uAV_Q ˄Kh?mezlPg/uxQny|"_?=Ay"IJbSh`@U|QURYp[WЅ.Q^Ut4,N :-feWݏ1 _2-֕t |2CloTlD^)eG>:TXOdet=~ $t4^e}'RG3|w ׹䂜^iHG2Ʉq2ݙ"YA5BV,\{\_Rr><*;*>:θ#{^+f:PCs6d5e8,,XNӏ2EGUHBIn5m/=Л)oN+Gel$Ұ nfBP}ʚ;JRRUŇhvuEvo%{^;0aLr|0^%7ULXP M_e/BLm\D;6dY46otlFQ:ufEO771M)չ5ɂt?j1S]a]LXJDLKi3cOU! !_ +"g>xG=iu#J26|&Ue6'L_Fss*vp}04u v*CIi!Ɗ" .JA̗3^{ օbEzr\Uj{߿Jo=-u ++q>Ou&]=TsV\G;J +F0iYS0yHw +ob<ƑjJB5>;T +3D˞ 3wKHhYiE\6+>UdG0Fym^#:kyQZ`J)3AÊ@H9}F{:RאSOADvZZŵBg pg,VFY:{Kv,奨]{x}wG~ozwo߰^$JhoѠCɇHgItoV,&7D'@sBO8AL2CsʡݤwH1k M,uDK6~\K"r_+?8nB@O^3=&lƨ,_\MaG1,C)ÿA(8 \B~UVHTSb+{$=BL.1Px&1ЋɿwXsz։i;ڤ3ѱ~omȀ-U ׏RCuwqWpbu.o+PX: +2ҦpVv|[2 Y&;] +P 8EvgJhռYjrk}D 'rTs)$JЇI.t +#۵0К(w>n`A +NaX-STNHzN7 +:{t  꽭Yw J] ֦g]_W[Lh s0 A)iSc@ qn)N|bj% }ļE'$8ۂ}g M-4{VO +qt\xNa%+c +f6ҁL uDxI YTn32f8rܣ'L% Tܼ,Th +a| +;S|E\dD\)vmyxgyK's,%y-`#ڈ-Z&ԤtPUu<3T>^^Ӌo] bkҠH-$\wahu4J5`JkJ 9-YٗfVaj}aƃ $=.xy%WW Gj5Keo,J!Җ)ˤM)%k "١xO>W-'fm1`*ڮZ(-ꗉ,ŭlXw:eJUC^="]NFHWpևRܪɕV: B2lPRq(2IDw B 98r;w\5I?vB7jª=l Uit .= ƴҘWOBte.񭹈]hA#0_!sKT@cs|< ip3< hl"җ9t%0=5i6@L({|"l|=ZT--,Y}זTAn/UoL.BF̎@8/#N&%eDže|Ԛ.priK_>lUiKǍAn8=7.,& kӂt| +ħorF0M~5\R,h#׉|)wm!dTсZQ@H}>5e,$˂%vףmAXWcZ4;P͖텺GօB>b5FJ,$&#j@Ovlc/oY^PkSGWE>+W5*r,$D{uU|8kbېYYDʎPōEG=֊?5,@$X=tkSbSX>O?FA =^4Ռ~,o$b؃ԅ.tuYjauߙXDǗ6O.̔FY֒&=j4,X4D$iK}sTj(aWfNݔoF=74ʎ,Fz$n8p)igCk]mT֤okK٠qnCs:;u1zWw)"y!"{*~ pof˫nq][rTsKuzBw:%x1Kz^)N| !t}>;oIufM(v]-,wT%hxuKLy{Bz: {1V|)v~!0wpMnԭ%{de +{\|{S\|J}|B~~9~1sU)!*҇Dn<,2e-D\4&NSQsKJ\B@y9ΕB1) +"3n&/mLdCL[^RퟰfJRB59H1)̍["eJqP +m d5([]IRWJ TxAЗ91c)ą3"#pl2cZR>e=IšA 9koG1wه)<"}2nl"P`cDOZpQܝő*Iq#[AX~9@ꋾ1`W)닿&"Lj'sĄk{bΤÙ^Z-Q:I*A Y9x1K鋭)Ul"هŇG;jrk1pbbKYȠyQ?ɘIH6@󕦒81:0)"uX"fj]=l1TmLYLoDOq<|}4'~-W&9 2Ѐ^dϴ \4SΫ3K̀CܢHL-Ӂ&h w`9d})[鮾PSVKr|C{5m{WX]eGOsCX:}6R|t+jOPHFh}A&|1>SK3m3<]@Μ,_@z.=B1OF?{ۅ@o8gݱ]@Z'j@tڥvAvˍ' +OG7\_ږ}Ny Yx**n=n$^p?NiyҎ?hZCRr-N%MoE0צ,棞nuST_h<#޻!bq^71tq)+l55TXF/?5r0jӏw~5`>2uc)p*K֚fS*W}R#(8s*I SQ ;^KE<|qg79b/a;rcc>ymv +;ks=R\T W=$DE!A$K?弓|K ҥ6At&& ~@" ]ꕆKΏ2VDQ2DqyG+=}r;v;M'4w_un#o/c/pCpfΖQ=kCA3 Lپɘ^M)n{.*#1wبkKʝ28g¸׿J 8ߍ͏F1*Ҫ깵N ebam.P:ZD}`J.#9 AvvC@5ޓǴӼÅBfiMb]/FԏiKQPk#8P7,#.F +×Z{^5JgLHy(n_Mê28Ɋ D#ӆubQ[GD ԠUh4hsTP0RLޤ.>㿰#&Sd fPv>%WfϳhH10I#+&tn{.]+<`29oS7,TQ[Ī֔ZHv +L[(1;*NvA并KMUuk󫿌;.Iw_ݧ Ww?/>&:x҄+I˕e*nN5դNvEiU^\;= g v}*A.n=Exd}"_Q2V8 UnHٵf1)2 %#itM(18IXOd6b*XItS+:JCs~NNq?тT#pLXW?;4NLM A,3xIpOKP.`?n9 xb[6jUrt {eA&ƔdA0<;>X+n3H WD | )Xw~&0:6Ha*!2#bA&H)m.>kXoFMi]aL,~<3̜&e[<qK氀iiѸtQu(q|+t<녥eUH`gr<5 6}gm}*?Ш++8C.LGIدhQ(\цʼ> y1H, +Vݼ?ʄL7 -ղ(U]>PoKi^<(mGq]5:+[g=lצ@Q͞pt_ ʈ 98=a|6Eڐ{=hWhHޒ=]ՔnxTD~(eZ8T?! |oߜŚy&nPZ8SZU2UpP>G$Z=sAf՝Uqv&'jl¥ +3H_$U ]\7;@φ9QՇ~麝ډ=)]\UwS&[K VwkG !.a)BEaA^C.%./ Zs3 +kb3OL +"ԥE<c]DxL;7o Cszq|w/g;6kU$_˵xo!ۉWnx! YY8iaq̰M53%qʂ|NX9>]kO$ds n=  +Z 6dHb@ 论!(Y +lo|,&8neq'[Z:Gû$Ҭ!PhJ;j+6*j"[{@Z#Z0S9Nz?+Ue]E#CҾe=L Qo8y*ˣhGQ8oIQ+ͺd*RMJ4d)-e[U2e+ bUֲ&j1zhB6m &.VWH= @D( T@@@F;$!|L2;@wEݥXEUA-Zz]oxr".l>[nIM[= +Ic#.=+) ԄE>!禔0U8)!R0&lIP^xM*rȸ'#pS)rllB6SWX4 \5'kW9[JoG)y %;LI+&k&V) +xƛؐ@FUmA/Е ˧a'#edS,ڑУk@ks=%O>lLYT% 2#T>[ouʎR=-B'w65\c2>c:lm. ZcʉrA rR/5>O}ǂ72u1Sӥ[Sf[rH/nS*$]dƫ\v +hnMm G]݀w*psJN&O߰oє>QT,P:DWKrԅV7,NS= 0+[XZS=cލWEԴPs[9++f$w=\ٔɡIp1-HEl^)㲾[Fc)#gTcfA2N+V  Tq,GD"1{Q2f/9R0Z0X^P?g|%Ouy|sD&1 ҽRWv`-tATZ2"}+:]q'@Hzu۽#_DX[CNqރ";ޱ;[T7ekHy[>K^H{C9(W?'цc*uT5gl%Β0 hUK._d$j $-4k+}htŝӜ.lfˎ}H7>!Ma;+;VWr'IӨ_?^?8l.+#9"C!c"C$ +%cqvFCSy2ZnL%q`W88Ndbo/uItl,4ޚSzb(v@]巽JFܯU uF˚#ĵ&L[vBϕy6Ur ⪬.?6FPI~o)x.$uyK8,$O]ϫ3jZkzKcuV{vii]sl]gaSŘ+lrqeK %p^tD W/kNoԕ anh՞IhjWrL|+LD?o:wQ>/ʦ{\cHYyA6 [ +UfZeҩ=j+7'2m=ʃWY]+ gY1tGt<@!gM"$MH +1L SaPXW"1)\)|+`E,F0h$EOk!!놚<ZcCgBp/^; .^ډK QWIO姬 KlG+ءC$ DRi>7v7oX7-x[eW%iÓrZ߇S7o䏽.r Ct?Q/_l*/- +Z^f*6OgQ +GeH"|ۉi\#$#XBȭxxOuu{mEeU*G>h:h>Vg'6+^hóG +1pXɢ<σe´pSv1\oMƵ>Sg QYADT@fߕ =Y)JV|U~~x&V5)Niwimbjh#b/#-d_o'HEB (~i|@_ho$*7ATN!@UP?x D9 +5Lͥi=^%;24qw 7$dJ0I`j\#0 _'uwu\(5o>1jJt8wj21L) A"HQ!Nl~GASMN!P֣+H;ޢ%R֑dL-Y/F7w-^9e1{Pj49$. V$$(X=d,D"#WdB Pښ3'KBUʞ h=Hi44GbZpIˬIYcMH^i]swƆZ3 [O֘[ 'QJEEL F᪠\| cN.<0r|dbұJɧ*KvM RezI.t!Jln:u<~Ti>iY0w>7>S5)_,^}_yȌ"KVbNAJ_3tU̧>~z[sfxb{wqY^Ú YFsGd!uaeh'< Tj&˶MyyH0{u +hQ/p=nD3fڛgz485ڭ`,n&l91ˈn ~ FA@ L#ꣶ?aiYG NĶ7n k |vZMH] ̗ +p387G *(O\+ۖى"2.&Jވ]],tES 2/n-x,f,?@/|&:Y+zJ^-^?gcM1UOGpUb (;. i@F7Mtz(8c/xxI{G)b-*wEreL֞5/Lw|/YiIv)#!KwkᢈD"TaP\8,|џK5tWRK;+ J/?Ѳ]V@1&j$)(#|/ <Y®0m)u+G}dUq]&uuVQ'!- +("G_|INVAeUQqբ(X@\-z,-/̓ Im.!u*FU0k^v--,ٖk%4k˸Ymz| jCO0K LDPh5&-,Oc|/Lu:9dցD~` ^ b(ʳD0¸d&va9b9 ̾}_dp3 6XCa뙈FEJlrDhJS7[wJ\63B63!&itBP'.Tg`wVvOcsP?IA<ق2 U.(-&:/doNeNkR.^dr%Xrܕi;qr_pRF ES-I ;MC?f]aa~};C֭O3Da:R(Jugq{YϔPXihp6as>5n&ا YB>ڱ5Ϳ&ΖغZ_^묋)|jeӥ jp$+Z*qQUJ Q씝XPݚ{$n0\Jg'qڋSۃCdC𔺥mfʍU?./ϺԴH8'[i5(r$ُ=z>^" /i,'R΄{~SkeNyx&M_FI:}u')aN 73DOM p6T1ѰF=UJc:ц5콬{Kݏ@v +lDV܊QŘNvo SY@cE A.yKqMX ލ}rܑtanQlg4M)$13:/yXmK1 &œ\IҤ:gcքp.J:T<&%I&er (J:pqŻwJObl2}gn_ɹ +q?ky2ra;`U Ff ')kش-V 0Xd}:QwE4j'C>g,zTs :tLx|-dmf@/&_o©|Wc]bp^K?jJC5I0c.[+hkqGҕcAi 7y{&c)أ{5ћ@)~6s,-8 榃dpůCE*iQ롔QT*'9N{9=Nn f>0WM6j]‡;Dʲ]FtGS7l@eʹF[;eJ$^i8Y*=* +z/o +Հ.fÔW?Xlcgl| Tr}r* kAr:;9^Rm7`xM";Mғ'*wɱ%^jײߕyTsM&MiNf{pZ0bw'4U54 +lI5buT AiUs/8O>O.PNo jX[`ޥʁm.m@=XHt+]"fTNYeI!S:,$9CJ1Aj;+{+i:[4`)V +j2U`OR"v +v)S0>D3$[C fˊ1 샭s~!)FagqL܊ç5A$3z8NXE"4vha. D=B\h_}<kizVb# 4pZ +_Baqx%_DsqףOس"zx [;VQT]5D- +AN?g:5g4D_GdABƒGϞR׎45B"R;P-W 2`4dVAWFH>{bNf+Оn/]n8nj;ՒرreP>ieMwH7ݔA^ع}Q&=;4oL_6vF褭&()?,JEfb_M#Uvi۔GCbZV[`>V^*v40ɨ0l71P0V5Lݡּ[y<݋P%>͗`,]=?l{UC UjS1]ySq+2d0<1ʁNmΣ;mRDZkjT>#@ )qQDHWL2 n^IVف b5T(]"z8-."͸,ûIt|J%(ׄTyFҝ2d>XH=?E1~zh5ᓊ.sS9ĵFi܎~,42d́qz 9b*"e-'hEX>>3e_vSڱ.$>_m8/RH`8ʮGH Ur?4^vYߤ`XJ1y8k|)0NrQ, HZЏ(جd}iO_}! ?a5 ;5$1I&nesjn'1n#ԽD93aP:s"`*V3Wjȫ . C妡h|26aW,'qF`M:~ +/xq.~ͻ#XqmY|\lp&)P,} ~Cv$eIgPeYch];RYPTzc}c.{a̸|}[z_)U]j"{xrG,m2׬|ӏ AM>V(нe"Uh 뗴;u;:mhƔfnqT>|QTf8ÿlG<Rs̯5x(`\vY^[`]RSVb): ?3 #:,ΉvT=#]-@7wz }[Ej< /4hr; GdE']-Mk$W`lJp@{a x1\ub ^V(7i?ubcUd9t&0a7aWT 'zIhkl4a<$ ŘG]&}M~F'F0סqP, +yBy47 Dl~Wg.cř!J#Kb BVƭMl_ԣhba]Yc7/2M{ H< "51wѥaQX5Igq?34;ƪE=Lm:N?"\g4ż%"xM *u`玿rnP/gl2"uyiRC{Ao5_8"(wn+W,?ʻ^W}ڔ.CxM[[|d彁,ɦsUՖtU_.xҹ9YT6A-,4]\3Ͷ4 *%jԧj=*x}f\NHL]_՗lv4n]t7u[fypyNQ%0jIbM >3dEtj6h;_מصU6\i>iL@bd0m_ ԉ_Sy * !*IDp+\\{oH<Npj+xUp" uc[uտ%C R: )Z0v.7m+`D1K$5<LQ[B |W 9ҝ'ikQzGv]L2{fZ6S5# +Aʰ|P +;q`BS0dKG,_SMd5y@+t[cMJ XCag2`Ԁ7EV!l.DGR c"1!G+@'u3X^ O!:,u&W;ymM_}%3M^d G~ W]?@4P<- 5&Gb0Rt}'4:?:UGVjD SveK7 +9!zERdNoSckzrd'BRU'z!*"ӈS$B˧M;bokEӼy|}I{fk("|O"Y ϫ[JK5?O> Qv=7dhi/|ph̕b=qm(k ~5)8Sk[Z57_W= 5bNʖC1MeX"Gո +U4% ͘$du-AqX^_~=ҫ]+SF;,|jVL@Ebq[Jod-Bgl{=%ɱcmDq1}4Bvʔ>J41IW%|Ee_/Vޕu~)ȹ 5<"-s3ߖ>Z2zɎPu1Ҥ;yt(#,"!~Pœp#@kg^0ʈ`7P.'\xi69% źLt;OP0鹪R.w"7p9T=FmM~ikSg-~A+ +ѽCwP|%4=B"Ce6̇>B'p-sџ3шSV{%l"uV+J׏zI%Mx:\6玬rN{Lf˛8aQRC[o^ꥧY"Ѩ-/rDM~0KH팕ϲ=xײi٣XI{HWZn* +a8SkJ!6 +x>.1ц2I|m&!{m4% 6 "RmH&b9Pljkt ֬Qfrܢ4f8?$B,hnx4p<:(yWD[ƨo:9ȾEͦ!WDԉMz69f%!D>g"%ĥ܏ke&i5aHq{ba] zT*6Edn{C\Tk=*@$v1Pn(tl]'|s7*Ζ. }2 +Js*oSC8_Ikϲs_|ØXiyRVt[,JYE̔Wf+0(z35c:W+gQЂM-iʉ*B6Hyy[@!`"T\ +*sUihjVRJSWw3nʨX_33!/RAxB?~q=QJOM`H;ffXT.nYLDVt`FUe[ >YtU}5X86"ژ8vu~|1D2R;%_|"Sh:f m;'Æ JJn wbܼ: 0x2 ]2|N{U {OT qb+FEcH\krމW,$.AP>/瞒HIS 4f4۱WX~>f}( ⿑8/'rzKrC%5[ Zeؿj޲nrKY`*֞}e &U$+@d]g)?(iNG`,Ct*GL~k?oyyzZЬoD|FY_gG8@f"8L{Aƨ*[Ԝ7Uj/0HYb$4삉L6~5HOKL@< `h"I1TdW@m0 `Eޢ\v$TC4?w 3RH<AlS1K-(Lub&uM=:"Tn6ULwv @E6LPԧ$|`>0=]?a!o$ v _N寛)%rz*pQrKG(7AbuiP3 bEG85 uTX ꮘpPxT)R<ڥBalAQ?`ְf.ы>Hqۤ5#Xycny: 5*f"*tP +aKؐ s_areE^EӑNt;F"ϐ/'{{d2J*weTsih{}|H\_=K0;yæočdq[o&_vΩl]/5e*y9Uimkt{G}Mć7hø]]SܼNnx&S6՗fk\|^ijC/lS' ߙF@5HYEѬV 7-BB.{$Aeafd垬Su~,;}\6vaMN {짲kp; U}(\Oq*6A(H- U?eZ!ݤה3둗]X(BU̟q!r! N)dRYITۍyYO!Ecˤyk4~@ne1EZ3'b;) 8F5F-`2oZɽx!Hf^&ƨdت<*HA >1C0A`㌷t[1z& 7.}=Eibΐ٠%]3`:W) \a7Tv,}VBHbSIFb|p4$3 TC֟PBigU#䈰] NC7ja[|r kFJH͑<-/1zBIWVMDm)^ͨ~0"v]AkWF7l1ĸeXI7]҄oNGmp?ޮG7qqԿ`ҷXz4\[*x.aP:] )Quon,T2M^j 5 -Y뚇 IEDD&؎D!&T1-U4)6\*K0MeQO!0}&2Ć\= nX+ v[(rлOGeK^mZ8ʑG4Aj>Sw<5|$1*)-LR#jKwZUּ,.PeLs4r$3 Dc({%BzJccfڬcv!si mV1s fgOfQ ;%)i z,O N#pJ;rSN\Rhbn?|~k@0VŭΕ!R0FdeȔBBwo2ZyQTZUԁu.,ru?~wQT_eg2 .1$^ZHuǴxZH2\6?UJz +3t3dzT5mد7olҏL.68խo,*a$<;U-kf³̳L=Q:_2My!d0NS9 f%Ena?Ժ,| +hpMjʈ HyC@t 1Nր+L#l^s)]|+rt%aP.K?R-pp *]ZXO@5иmC'DQ4+sʽcu?нU8m"Eƍzbe ⊫ذG6Iu3ЇUb Ԯ|E]@SX@Rj!GV'ܖC`P2*_3". Aj03j <^ +o|6XazGrx6oD+Eɥ=h[BkI6쁦 PYt?ҡns󪅰;}I9OԥT򉋁=r/&A儿 @(즄Ę>=m`;Y|b[rw[̓/G#Y 0'+|@`?81lo)ʺk`Jͫ-`#-Lts-DPnfՌ Rh,R{`tgNQ7po]\oNkc?k%/9b!8Ǻǟ=r\A8on:Vٚ}!l_)Kl DYΕ7ck!fL!m|kTr$Wf4 *btfyZ%Zw6sʴ|悒6JMsro`||D]p*3gF'v%S^4nN@8-I^ӈ }(W9X2`[~Tto=elKVIȬoU_S.ڟI~Uϗ7s3r=m3y?|1~sO̤lL7N|6ȃ QL3WIY iё>mZp5@ Ya$7HGW^4x5<*G҆8%}5'd]X(Hfa(3"^ߢ~{ @O3JB"d9'@!ŏ#"y{ɘ?*V\3F`^bda Fw, %&F>_3% A(jiq!0DA#Xbfw9|aĽb 9KR!ԼET\a!!7A'G^=o7dv`u'5c.pBȨ-PCJ-,F> Ny\9CC.o?2Рό"{k%L@x +*U#U̿+̡>Uy/# +ޜ%h(+"+) +sL)k zG) <`Y$NմS]L$N"(/3Ql*Cc:MOmm-@Su_%MUϸ8lu)\3l5I*:VPXnknߛ}T` *@xfɝ:> U?vqŧ;ʰ$]kk]kmU5 ^hȧw=T8 Թ|3V+hinP$YkŖ9ƿOU7 ( +EuK "1 2aa_ͱWAH;a} ,2wcBxV9 Lj =`| +O<fasGjmJ"[^Ƭ?ApuBWV ¨ԌeF^-Gr'q cƘ{>Ljآ-mUzU~ҭձ[Jz}6[7}E'&:ۃd9p xLV0p̵X?Q2UE[+o*~(ʜil77Vo񼆴Vw?T{0ʗtf̷^ 3Ҳ(@SQ&z[ a.ufG2|stLJe;VOXJdn9[iySɦe{֗W(YW-K+O26>Шz`oNh&c ;jaSzO$͈ZIUQ;,@cSI[#nU_+&!?J ]M{&~~ W27ױBE9c@Q?+F4ޛNl$+P|JjxW?"J=bQ"/"k!SnՅH'hoYo7,W{N GV*H7rs4i=_AWj iKԙJ),MiE=C*XS*{Ee t:`d 0O뚁:G + @#AR8 R=܄ +s=b F4j/".ܻvA;H @RNYnh$54ņsӺgj7fv Eߦގqߟkˠ׻ DiuY5a(g92Q^y|V`R#XjJxzV3UBo*6&Ķ/eonnoYэT$./Fgv9l=G6ިQ7Ȫ۔)uj#Nb`Poyd"X̟*>r8P.u6 rwWA~k@\YH-d(2j"BB>/;!JEjkQi[z.T] OXBڐ!vk%^?˟oLc'7-2۴ՙ8Zcya^&Kl >z*d]wlǙlD/e=yXVjP^xacRx{jPD'C&3ZVZHzLH53iwړX1mWmUO577xFKM܇ȴ,Ց?|]ONkXAfHOZhMR'Hcir.NI:?['w&wvKOWu;)wמWOcZJWE i3;qŧ핑30j>uCgI\f>^ +ЎOYVq+, rySpL$#'|*;O*F{uF?H99yN8O/pRšRD|ʫT/s+}(uc@<1u_`F38I"#3^(D*+ܫhXj\ @/ȏJȿwRA]CR#8"N/D/J„e\@P[)UqPNPYu#v'u崳 +9SxSKPQ9UXU0əR a!Y{inqVw릜5;-M1u@θnxO}=>ˋ0]XsL<۠#kF(eueAպn~IS% +3NK `H(BXӃ} f*R@QZJbsUԅ#o# D,&dHϘD3þ +yk-:X|u7\@p䶹N F)q.HJ6F|J˽ ҪjqUUJw=E܅[Lכ6c Fl%F@M,X#]7u,Q]kg%6{8oyZRh J@m]E檖xJWGbj$Z`9wI;u bޭfA2_5Ep$>^1ϬI+ 1π2-K>N~#+;㾭uueV7QJӠR.~<`(aHru0 ^HYɟ#/Pp"V=#/duKU\gQ~X%|(,+fYړu>~NVjfʸ\[ J-P\~Shem^K^ s%vL}W-:SNED)0p,M,LYQ K^{ʬg\XEYZ=Vj܋U_}%Lk܂vKP Ajj)!jӜOu'ѳL:6hQ(*7{6v +ԲW <ff6Ǚ_HcEҋ9dk} 85k *la)sW/]VㆣYšbU5׬;|Cma0Gi +~Эh aZn?" yMP$2lž%fRe0qBm.MWkĆݦ5)yyneKeh |1DA_7>J{Y½iP7)'V? 3UH$󑊇ʕqp@t4ԇ3ݾIiPzWiN4S+o +(U\=purٿJPWy ,Ea\:Aѷt݋ j@7gQy^NKfEk/<;C:fD^0>R &9Dz!L&NG4:ѽh)QP@ͭP+%7ЁUZA.-!}μyXvnJ76-I6\HQKV?+A goE;~ )AeG|d~U(1||D_,@6=a-Cl 7T fkG(%xVøoQn Ǭ\Re݆zwme:kڤ=[`3Fnܜf-k^ +:+7͓q~7y˻,¼6Bm2,*Jo!nٝgZ'yEK{(wzen#FFT^b)ړk$ƱT"KHϸ]t^̸ҩ&f"mdar NӋrc)Ndla\6- Ofƭ>cF4~:* 9R& _!$ָycfa󰼂8|Jz+ѲfqR6w8G] Bi$ҿ >wsHe+;+]=Ίi1hTY-lrl|6FƗ,iFE>roy:QaaͶя=e"o- D-Ԑ/❴_TQ DZxK +h1K g7 ?lN&E-CJN$I%O|tQR^76ѧ0.Sy΄0Vxi𪵃SeW҂Ю8jALmzRS +.*G|\ x'I'ȪP}&-Y>Ht"5"7<%5JQ>RBR20v"7cS0W6l mxvPQGKzchND2Vľ`o$NU:ÏڧtEя zٳ s7GP΢X/?89RK."q5r's R|L6pX߃e[Q qP?`BU~vT{8,S/ k[iQjw|aUѰZ."8*{Jw6 +R8fXFnK]:|7MlELu乱[DW1-rd= oެXjo4AG5^ϷO>[ts:]c +㗢m/%nH*~є:O߱?QvԭVt1gis3$YV M^!ɽ gU|hzR8j:iԝXaɼ2C:s'Aæ !j4՝Uqb'n4:UL βMfN&_37ZCa?T jg}%T2+֫wqL ][/%30e}ML/e +M +iQ/V\V+ #uU}9 ,'C "Qyc=S^kI?+cѱ aөƸ *RZ +d):d/Q~_C7e\Nz1SP}rETp,h0DcX_ļ88V@ەhcBփB:GCK L+$\e,#%  H 0+H&obW;Ƚx|h0Y  $Flқk$&M]|ZCz$$\$~S>8/t $0g qEh3v9Q*!rgL\0d%A?4G/ǘ;!(SH0Bo!bp\{wN./5a5UuofK` cR p1ݷ 71aݴݏQ9EXJXNFx=4# MA;[F`vow2s}p`Xkmӳ-'dmo=uMBD5=)3ٞhު)XmWy'?V]Zvا u=̘-U^qfB?"%6r}nّ~δՠMr0~0@K L%>BW.~Nu Oo8dYw@sGȔL/s~C^_JGT X)z@@ %NS%7$^}wL%IL21T ) Lt&ZAGj=V\gf2,Ө|0E%EJ 2uyq 7&vװp8 tZ׿ CKV !h} =@dvv!*zUKAAm X8Z)N8Qwh`P\Gb44TnEY7i:T(;uWmqƭ7AdTq&IzUr$h|!or,mz3=h멺qv"gNt. +Rݼ.Sy^eLbVNm=ZTdiZ^a76 +x^)^hƥ{|F{ FUk4>,h@DBwB~Q/mGcrOpGuq^L90m5YJ9hIFb\D'l_$0tWdnx FO>FƔRC\;NI|W|"0UJ"Q wdTbPjˊ1|'r +򆟨7LA4QТ-ek7w´_lLPEڠSC1U}NA ͚49h3Cd>ЩTDS1|ּ$0PCA< +BP=xFjU9<8 7 >ʏfLbzH)-O{ pijXڳ 8LpROMXWyb2:4ÿTC`-W@NOT{ +v7&2F1դ`BމY .&=Gt,PG - +|. .ܫCL=k4҄$mŏq1Ec#oڧ a%- {ֈ&W&hWoV._QL?k*H깺-2L }2%ln͈i[A¤S݂FwWn@#ګ陻VTO2wMX&HS{b/.ifL +t5dqQG6֫`yБ;Q`/%Nj$1.ȫׂaf895:Ktg8rܣ~6dtQ}ii4["YIV 6Iֿ Pb5 QMSEHEΒo sҖȇfLvٸQ սQG画!Κ +\ѲӏuKPݤmeI4= b(rdQ0d~ qyOPÒ\5 qԵm7/}-7Th:|X}.O_j\mg@?Rx࠳wiSfZudm,AL?s_ `XnR܀+iPC(wm&mʡ>ĕmBcGOK(<=9!J%>솜6n )RQ8{}]aS&P;y [fs[* +᮪%Œܚ-l3^dSkvfi|W|78qmw";%eg0OJʇkmOEUd%-1En T9|+NeN +*:ݭDaRsK!"՘w 1djuDvI_~3|S^kRZK8oF[f*ƃ"i2f=1NJ# Q+,$fNZµSk-]ewtts:fl8Hc0_l}{Pe$ t~O*lE}d=ML>VG̨:W52ĖqRØJ4Dϣ_!d%q!9vR%-P2w|$D%`,fȐk fʯp1z6_o^`n|z(Ւ/M? s)Ŵ 2D]J3*B]T^ڇ8\\ht%rQEbߐ\t(f'✷34JŔ9.`p^g{y4u-3LjF倐kfUvW+MW +eWL/xNꖻ! + \# XAl>/LjXj\,:@f-ճj_;q6XE%“Yܘ1=ʥTS aM!q#zJ/@=Lb6M[T1 QOTر(c 9qb1m`QDYMl݆P(}KĭhOa/+KK*sk>[Ob5 )6JEE&f8V/tuvAN ɒ~݀<&CpKKtRKI24<B)YK1x# ]rSuVP.ee>W[ҜymHBZ^c7 -aVNQ]WvA":m +v6 ai C!ԋg׬TB1AG.зrBW$&]غ3UMp92lMaVIsuTƔ([8-þRd 3Kmo'a2-\/}|6?m۱,DZ_خe9OO޼쾣p;N`DǕ.͏;&u1\oM&FDU@8$'Aw@PFHH_/Hqq*WG롏ł8N +Q} DۦtcRb"Zͤ-+?b=[#V[cd 4r%>v 7_?=`.^*g{d+Sզ> ?VPg"c4oJ*kHc(b鶎`+{m"fUq-µ+NK`HpeS^dɘ&q^R]p ٱh>\ U鿧O]]y:qNRQᆎ y6ɟZgҾ5=4iD!:+Ѻ/ +[vZb⼄ XI燖՟HYXI\$_;j o'Pz´\K}X{i]~Xc-|Rj䔂݉RY8S+AHGѿ@IJLˮ+PNi]$`ld/B/Xldv~㨞te&T듬7 +3)pmF ih.p0,?rMވ牵^D諻 ;5۲)5 JNF2('FMϢi7H"Afs;Ծs6(̴"idج(TWְy#M Jc^eg!B V ?ls“ٹWh4;Gg;@:2k˔E\I8{R^8^F@Cd(h.%``61~4"^au:u6PWuWsV +Z r]FBM'& B1z>2!hD_cpNq +PG%R|^08V*4;}XbLhOtGD:m3 1CbȔȦqfmU|:MM,uinkAPyX^]Z&2V>BZZ,Nj\@園A) |F嫇I<=Nx7]")Xޓմ2dS]:?&Q{CMFkȨ+B?$(qyu۾t/q V,b H5R&sdSJk>Z*irm +gsS{7]hM7e!͗Pxey+8WqRg)JZsZ6]WMZ9;hVXcZmQ5[F.s*Ū@~sdIy@꺥T*~ O~6t>Y0C7{a 40F"TxLAnQ?#C&67]>I:yI"/e=naix&~ZS~eB,ӰRnўe +iW0wBZ (+zLҴ}*|)1&=ŋh(m Coӆhd0`0=16]B;6nlU3^Xk.19<\bFxTB~`K@}5y'Vz=!0BƋʒ= 3!ȖH og0-Z,Rp#UU)*'N՞ ZW-G<Ǻ[=Z+][~=S`5S);z6 C䃈@M蔷;r +B ]Jm% بDD5b!P>K sxJנg ]%K3$]iuѧҽ'>*fDsT1 YdB +6?'Q7j!,Z-c0k +'kOX[T!f<75?Nd{6zmC_cSus=kei4OmMk!T<2|"Ӧ"s*4{S/kvD1f-.߁GkG盉䗹c/IO6x(9 +:B++쉻~3xy?P󠑪ͭ0'M' hh'}<@tiTox8h쯯oRՙBˡXz +^i b .y:+W6̮·3yhD6/a{CoxwBJ +W.yUIYݫ,Qzp(v烜ޘY_.N޾!a^CxdmA$d',1Usg{cϜ_qb.gm ZKÖeo"._T v6(פΒJ'0c9nȘPx7@c'meZc%7WMEr3WxMe>hF<ԧ0ωnehG.Û-TJά05ᯙ(MGKPyP$uM>q8D$.{(v*rt YOC;ǣᇨ AT_JeA )7D軀DE(y:GI1?qk{ +:^KjAd.##ohQHLxs1>y$cm$%cT上n\pyWt=jZ7Ɨ#뒋[ū ,8Yռg0$ɣtê ˛U^>iuت.rbgоfދ{Դx"}czٯ!3*OםP-j6%+Tݑd8Kg><{Dh+ I#}Qc%aC 3F wMHb'rXq88@Ŋiq⮷w8B*7,8~ 6Gd7kރ1b"S9ExW hǢJ2#ӥLC,¹T\OLXb@0br Ѫլ +iu)Y_Ev֑Z)pgEgYk$~JƊk;ڣ@"!=|]ڂϙ(a8DA-3 x! +OZ3t'X~0p@"J1"E[L;C} X QCTk{ j/kwh0 L  6[6֘,ykp <c>f{'*$g!}ߙCHf;@*~]F:*ZuR8>A`>DnAƑ$A5)Qu#L9l8l9E ;Y3G$ܕ _lq__q6s'd}_[Z,bT⶜4{-ǐ}AI(}Y͚֙m +E?Lߜ+^I[CE  ѡ~ˬ/n{6\fhZ*ͺ0wFqe8<`vUhOq*(.59UZ!襶v5)"'H*%J:cuBcc}!yt% 8KVPBH\8GB<騳X7 5 x C!ϐ("",6PCCW cC|&cX\8 xn]0:7,y,YBc(&!%){̤1oڪX=6աcaeHk*f@Jdt BDmQ\0ԔSWmK(5U1ْ\)DQVN#׋?/wփAL(Q-UHo2@I)SwkA-,޽*R􏺄B:$?Q]%eŚ9$o> :rkM_)b؞Mj_k(ҐR(]ԩxBQ q0 kѹ3EDu!ʹ$fS\-T%iGԢΜY܆YW5@^QM 3YT^jJPdygd-ﯩ7 +37>*N792ѓ/ø IN<,™!5@)ܠڤÖ7䥪`4\)ҬVMM\Q{d~L5bx +&kUC)"듲85_:֜CM$n4e \ +l#0t:|ByFqY4Оn<ظ]1F ű}1Ac+bHq N-?Œ'[="u,5[+LU=ζbO5!o׆_|32BDNn b\JXj4[ "RbUi5R"z +%&PkpZ<7/pLaRv%V/:b)&%;¹WzP*{Tbf%h<7by +$Hx(ԍT)7%k[*qیL]>>b-i);i' lm-OL=W!fcO ri8z}働dFTF3wd +r_Ģ +)))U$7kZ6!  dwNH}+MUjx'5I},# y'd8hٷ_x.O:eS.|8Okm@.A.k~(rĽ/qb=[lUx셤ܱJzTAyIeUIW,;\ b:ZtܖN;)\k1WVi:՝7Gw]HZa錄+i:M?znW=jNr1^a2] ms ^G4(4nm]8 *u'§}_#QʫݪIa%wG؜1G%}ʜ=wB|NR.l( _߮fBzO%9=.4вd@}~NX7/O ZCrB]MPnX8Ҋ?usp^ٯFc68jHi;ZI]#X7<UX ;ZCqHa{wf6xSkq[O?T4+:U4o+Aɚz~o&hñpJ=GpT:ק4Lֵ*VeT}䥪0gܽQg PR7}e6-c18I ;)PT{uּG;#xoZ/ 0NmbWf|Pq2CV2@|dyl]r;%L6Sm`}o53T(mc38ay6N^vj$֙m,\'˻^JuuRKXe|~5x:j3تݗ:MF^"]-?Q<&VrZPP 42WN7l +m1rMȞɬ;I_guҭKjdEAVTujjryF :+7Ab1hO|(SY{}4)])ݨ[Xk@z^:W)HjjIhį`wT\,ƆʋO{x_*<h0Ufפ @!֝쒳+auep 7C'a hO'W}H[E +UZUݲ“ ;P_9z& 6RoMfaa~]+J5y|\;nR$ {,/0 !z}M:I1~j9w㪂eЖ +:&` <yMXԃy!O`}JgS\Z;S9; _$^7pxWcA=]xsj]U*-+pBk̉~e 1tk[-?^\3+t[j1A9w‰괇ڣdNb> +3y`C8y7}"K,/Bhz;]^MIVdkӚ4P% zR͋0-}F_Yk}絃x` ~|i/|#e9-KžpUmo/E q^)tkvvRI2OVP1Y1J殺Q}Ѵ@=^ +XbT! ½onNR + s߳3;'l&e4TKxPLUZp _ׄq*geNLy}qs0Һ+Lo5hٸިvC>6i)PjN:GN4yC)Dn!EHEܗu][BH5SQAkaFvh>la 3Yڦ"ciǰYJ."fibEφiQMn"dib0b".)V XȋD/S|"SaÂj='҄O@V8Er0!f+.-m6h#Ƶ (A0e##B懿hn +oܠǙiQ`aamt.MegH GG_?-1'6sD53J52`9e` >2o'TrtU'ήhU]ijkɸxშnϻA8ď)2ye @ڵ#pG+;t~5DmWhӈH^naMa j+0qn+8&oktNKÈhԩEqnxҌ ~;^gCD2Te~ti`iByT[>H (!8HCOυ"[IaO3Ofnv[|Nc"mƝH~ |>>:B!}w4 =i?ɔ6;?t 4*-t$\x&_ "1]QtoD{2 Z3 ٖ!?9ж: $Ps"Dj ᗂ۰1g%3q$l4V}Ȭel*k)mDb{ ~|XtBs[ hN@Zø_.FxvH=r͙#{EDaq<(t.i`PX:tnӮ!xF g.z vaCkPg.c@5jPuT/"p[B +J*/3rVxuxtc?Țzh9UJd؄،7 @%f cB=h7YrCY6)̈ȭ)7~}ljk%Z,&8eG)FR +Ԭ?Y ܷҧlpʀ}{*Γ=sֻ]+] @ffL- ]NQ'tw$UyqSK% ¢VOm'?4\ᵚ#U}ܙsGuE[{ݯtyru볊GU[$/6]7xڌcyH`o }Ɛ`Y /4>i|*-~A>]{ORnu|3f124r?=BBt" ګt٪ L +&+?_ +ty/ockێρ:v MBTCWQPRqGe%2^aԶDG-%a(!V!ى$g46aD%KOPVd&=V('9&Ǝ8$*#y^?_+y`GI6A#eګB*hboXfaaS͇ +pqA37eR[iV%b;j{xacvYȄӘ,7` 6rSp#+@wS8%XBL$cfka\mɅA@L@6}iUh'Q }@+zPLD .|?[bqLL΢H<D.=yF6%Ʋ4`%\;ͪXQmn~10ZHl7ճK{4?V4Z%GЧOÕ{?\IlxpG|<)g3/Vc{U!Q!G]3HU pV0e$85P&N6SK쉎=kw->sE"pHÄ4M*tq\U:, <0y3 etE>~Fgo*۰&6$N'ҒCX; l๲rRW EM(e{O ö֢Yxb?IԓkdV)TP +B\oW| L^472V2qQT`){N`,&59bFRMz}pOV2օY,gBϑZ5HM +%KP#J +э\f e dyi'-V[WChd&CꘆV3P i`j*Zԡj̷o^e ~r5dd~g|1B LB0blNxDdTtLlܥW^7orה;iMw3=frr¢aQYi峪5/j^7zGK뛷mi`П#_ƿNLJd͓7iE.[Orժx +xW]0̤oqfiesgvSS|!g 9IgQث§|sU"UG>8\ddpga乆^\'t{UovՉ}kJE|VҗddCCT08S&r\cyWS>wdg zK_Ai'nvsWfnfnwSvdcbAw`bbj*Ǝ"ETAkfnoՇn2y ԡt>g~n75a9&V C_%Ͳh=Jmn9&P$hl QdOw/x3MgYsgϸcWm8nQYQ.^qGM,Ml}66.Z ,qŚ7/lToߝd I40>ð}\b6ħa,m13ZGuKyO EifQʇPr?q۶vBنfqR`FQeV5ڔ˂}lNp)'1غEDӈLe)0djZ?pF2^ئ[; >4!p$IpkrR9DIgX)YyJH.%= ӽרmuRzY #AE2 %k[Rmc )gIrnPi%uԬ`6ښ6r<SxHڡ7^m0/a' zQɔW0-؁5LOV{>4@.8 <ڥ5c$ok|~y2dVݣ +QBGlZmmh6;csqDFWcm0oU)kfjriJE!_,.s(]fnۛfj/QG{Q;cЧo1 e#,XvOOe:xQ¨Zj_ti}CHd!%G(wp"k+Jx;% o)a t^S0=AERQ*(\))yD~ Oޏy~)rZ?Ey5AqqO;[]OLAJC0!BAyx16) WIVN5 f J:m]tWw|%+%eVT {UZ:iOªWCk7E}+.} y!@ot0/Ltv~q|/:әNhg;N&N6k1&'<1 +( +""(*^"xcu}ӗ}<3Oއp;R-Xo7qr0:'MjqJ-ҦW)URÚe[ܥpi4 l Ր8Ȕ#N0iVQQʊ/2fjr2fd*"t:E=YˮUjU? ]짶:+ H>nㆼWGޱbUI=Jڠ(cTd5 f2Z3W3WP)8A݅2p/鄇1׸ܥyvBZ+OWh "yz*B;[Ti; +dù2B7x@lCyQEn\.Y2ϼ͚TL)~CQȘm!3f  ag>?Y#DUlX;at|cb6gN&2]σj , !CCWG7DCS@ fkhZ+Ӵ(o ec,Jn&y4c}Q *0XOk2a^+w?lm ,jawW%7Fn6kp˲ 7b^D3. W u? + p$vmȼ&Rs,lx.G<˖G IY\O.<͜!,_`o0IA,t[6 4^yyߊ>]0GoCPP,b(d%kr5AR1ei\< |H%rM 6M.8Ų[ yUv W>&LǪ2Jp +4 +h|fuC9tИ0LTdh(m,<<5C4f=)R aG"dXVH8Y?۞췻ܿ1dBc*޳OAb/˩FX5yҸ +pj$;茙Œ#1!P] ON[j7 6xJc~h=Oaȥ,9sxKc.rkzl W{-ajTŝ_WwT}5ua XiO_'/ڗ'c ϫ#N9PK= +&x֝4A[ܡw[j濾8m+n,}H١]\;~.'q1*6&gɅkre<>Ї-moMʆʀ5tj;Nn(oqʓ"Ċ}ײCcDzseŽ˯+_Ʒ,pǺ v$=6x~uMLǙ[ODئ#e)@ןͿJ+@yh@@D1]|4f-?DLjYHuqƸR1BfH \./U +ui4\~:dBJ8T!0: Ee6)k1 KĖNS2/3`K CB!7y͗ tA&<""; 嘍٫En1#cN8iu֙Ng{؂**!JnrF 39rr@A$A9~}<}~}|k82h!SN"ꦈ)@7.x ˑu[2 C5dzDCQ8uW|Ï]g+xBqzk:$'I,DH?HnmV|00y + hґ84gOY%>~WYTlY3MN2 cl)Sd죈]TQM[ ~p~0<@wh@ŜH L;IDvCL($^%*ʲR{ɅF}f堎, +y&`~4p  @ AFHG24y_#zFeqzBTmfңэRScR&o-ZhB '2#E@By˜댫S%4xUg]ZlgRk +ƪXc,Cd OaM-(M~N]LDטĽV1i7CϪ63yㅌDq{Q& < |+">f?,?a6tLj4j\BR+8fz%eR^2I`1t{ܚ~b`@s؄@SFmmtW 3لyܫv5[5rXjfs +&2xqJ5g,º Ad Bˉ}wnOfjp0?I7Wu h%+:K,$Y! yd.oĚ; vu>Vxx;5y1LZ@zf*[CCagڬ)nJf!k<;ӡx8b7Դ^QeS!|%L 蹯1qA&PϏ3 t;jr}sX-n]u-/rӪop6f%(ʩ usoN6`%)O.r5z )8~sgНgotR9efO-sO@eZ@dg@B'nԑ8ݞ85@|ܱv΅%#/\_q +oރ6a Ɣof&׈8lX)Q.T4/ŲRT߬IlmHik!+~6l70!#PJYŐȉ5Iִ[ %tt~qٙmwәtvtN۪[A G@ BB@ !!w@ B -(" ȯa|k 2]Q%TS)q:@ u~U0w@ +LPF}A*ޭ=) 4ofk$j21_.7bHD%iS$ƞX3!C=dCjlD$hF@:% SWOQ2dɹEB~_oXH$aӵ!Voj 'PjanD8hAA :퐃kVųJZrҤi٪|B}<=Ow=HQw5CTMg_v4P::h<-Ɗkخ!r׋ZZtArNV-2vf){َ 2p~  +8 +K9bh|l.7nIh^J>*T<HFTɒ02:GaR( 41|   :PI>Ws&u>PJL4/gY~U=WnG @}$ %"ҟI$q+BĝgȆKu9&j@4I9il@/Go ̷F5dБ 9l/O}"Z/9iRsMV_tP0$ $CmK @p l @JB KRa(+j\Ce|ՄNAT2$]ZuX4Fjbl(^`:`A2a侮j?]w\"g'cm%H؄7*bg,L& GEw%"+'NcX'gh ;|k}?1yZ=N&"gQQ4eFu2 } ^kk +ٝt@#dh:9h /T:l}Ώ!"G#;6B7v҅-錵 vg 4AcJϺOZܾzʶ2#2xuK9.u:P4chձ*Tqle܄ˏ2/\Vߵof'.^>wgٹ&wn6|KK|8? N(&0QxE$I}?[3U3Ő9h#.w]`غtkկ 6)<|^y><@FK§MEd"gZ%þN77}ߵwjǑ+RnD%Wr7݊Vܫ7G&̜7|CϢx(hRZB(\G>u̱,{貫KtŁKR3J|kvzuĒ; ^@PAPVB$T,3h!w >k'~mqх3B cbdK焴Kĝ˙W"\nmJQkk>՛UՀ*j0Tx%b-^u|б]=}zϯ VP28%1fGRخٝӧ&g9|7!:|u ǒHJx'>x^Ͻ ö|B-*f3oFmF{ܕr>ڽrOBz* +rK N&7) +0p<=NfobЎofῚ,`4{o/9Lp1(8VBN%Eq&i~`=kPݷWp| +K*FSJVz*"^pd&<7ocx5C!4P@٩PyVHwWE-e+xt0$]NIQ1lG5ب1Є4;%#Y)eڹE_N([7+hQ,3m9x)M4Jj^y2%_$ ET\ Zrȣ3bht`::IЀQC=j񆖀sЎaH H.[L|ZaiR6SިZ t i2d>C9ۢPP)S9NsF'pKh9Љa2u[gl57ZWJE*,2Glkh?Zvd@ƋjGMc0hD {5OB{@tc"@8NO2yO[stE&E{ԫS#˅VXUk/Fʬ:CEIo f"l@JB~*—uY -$8EiZ 2UШ/4\*& +lflP{p=tA? yi]J-;IwE7Ы1ZQ7ڨ"FJLơrQC7tIQYo Mjh>g@megJ\`<|NLbRx%}c,ZQc.%mܢ)6+fEհYa2{} ;بHbr!} >P?ɳk{K4\iaTtEQ!6iz .w541-MB69u^ϜӧTf0Jr]#AC԰ d:Lw2vO[e+M,.>fِȔkOk9M}m@\>aX[YlWsMǒw#KⲴ\IЄZPC3j> +;HK]L!.bq$1g.5|̀r#Y<܍R}[q&jؽL2^Sg]Ըkk.OzkxZ~=>G@qmMPt)؞vߝpWigp*R\V xefS=Y^* L6"Jf̓w 9 ߽Ezf8s%DwgMaN] @f~(,`OD. NgX&>sMxȘ2f!S7b$o?߾M+э_\yzrt>2 *Mv/*êyr:r-I1MR钯7hգIѩS:ۮ$hC A|m_7g?~xw_?{xt5ϸ_v4Č8vZq;c׭x, @B @@$$9@B HKDw+GD0AQ-y}yw74R_2MR@9u"D1NЅ?67tGb-鑺4q.zSPu`4Xx7vkn׻buuټCP-x^{ex'J$V'$KMŸ(Oט7CAV1yЖѩc];xu١彻IN/X9.`̢R=%zJ`)+O3g*DWTC;^ց/oRKPk(:sF /[aK /v_HC˃it$d+y/2vzp\ߡ=7_ǎU˽pB \`T܏ihKYQ(>ᵫ00dλ(h68pS0K@DQ"9S@/ {~uY`uR.`+B*XlQiS,*; x[.}C8"&&>+m }i68ݬpdW-X ' +S6N88I_b>ZB90VR|V]ӼiF/їa dnH3Mfw>7xcS } +aEdǀn8K,BZ*lȞ`wp^w^8@:$uU"*h3!H--3S6੆g>z7E{#K{=O{٧ާm5HCҐ4XY eCSj)ytci<~pQ⨺SJrƋ̞ƖFVO6FS]fOF @J@%w3c|ЗgѴr*nYR`!Sc+ ̢fytuKSF[sݬF(kLyH? "P|Ԟv.ˍ&BtS~R26}DFKwjZs8:[RY֦άb7):]mrNW[UfO {w >ǡ}c{zo%'jEK],InfT9֪ +NťrN}{]s]l/v^,^oPpd1yo xQף{ײ88bAB:!@B1( % Ju(4I0"XU0AAΞ=h}xm<>rDVIyMeUٱ3G\W(2$͊tR.V)2]v]Ӑ4dE[c:~G?0lߵ3'Nϻ<):X'n7qEZ"4J隂tX%t%뻒]) +8EHU@*Ґ4dB/pd6FV2_v{َT^ܾ6HE#/68"bIsgruLzT*^T(j/}褚Nfӭow~וրFAVYmhQ~J^WKayЂ +uHa۵|JP2J] i@쌠s}?-~G +kP'T2_=u!.2J **MR rTKJEP3䂪3nedA]Pig҄3p3{|G; x |3_|J[Oz1..w%=.=-jK`fASԭ@:B.~5v?|iu5{emc;;W1xs8u@Y_kkSd4)K|U]u= @&Ґ4nznta8Ťk)_6)Md +osOVBռFOk`1[{!/ɂFvD؋qg8sS<]7;@mhND+-O:A&۩A@`ma#@\8 lA0"WgdXKk%ȬF4 +'y2><ϼ4=48hKDHC84[px+R}w{(?D68*RbH!i9j v&tΣkkWo˙ښv^LSR=_j5*ejGx}( +("( r + ((X'呷ece5~? /2%جƻBPNٛPIPM+eUj(g9f30;|} s3r;:[ t? 9XD*R4=[e4*^i=A[yѝ1eewu̖g}N<@ru9Ёv<)PȐ%w$*W~/E 2p>"xΟKɿt?:NcoUd8D]8:B= z#y}9* y^-XYil|x&A#NJjO%OLnbDqS_&%mCt {t;xGTx^ MBOJ3hyH93d +r,_5KRқV@Z?}\ڃ^e159@K@n0=˃νV*QKҴ>N yoXكU+2ꕝ6AE+~Tќ3l$(#Jg@> }UoA>ϫQh|U|,?5k$6H% $Le[&_}5K׫m65Wm! IC:HmZ:n4.P $^ȇ׺+:ԹE-yO3 +N;,iΥ BDDԡjyZ5yP(T@tO :4j X651y2KWs TjiszMPM6T2 ~䓁ZgKP0W ^qm]g 'YC\+1 s*4\eU1VXȬ/ \.l0;̬^s>ЁTwמFľͷ4}ϰ%kŴjI% +/P +!'Io`0Mt04Q[ +ݍ4FL/78 + :p`; +^#<]Ҿ{'.<Ќ +0G'7%ڴ"*'ʑq::bڈfBi-mtY \f%CB- [ b] f>?vЉfs|ΈtrAu)%hy Y| 5U4Ś&n3=Y3tm*v!Ynqٿ9~>8h?5U4Q}*ϐ4xMhJReMI2EclITt7`TD(rYCkombc'ntS_ Ie +"Yh^Rw$+MERw({$:. OTE2.l;X.hi.{kEݍϺiV ̙DsegO0c(vh l4Yty /L!SzA|k:<Ϳ<0-puoZ`_,m_3 +'YW|Ƛ;.{|QJ_8@L!?z@ͅO? KEu r|W-F޻tpbڏ?n^3Xok/lAOWϽQg> i|q1OϒPOgAE be΢>0Lgtz:ֵAEa HBBH ;T@A nXEq_uwT`P, +XQBM@^z.>7=y9; fd [Oh6 %37DiDý/B\X jG]Un-uuҎxDx#"户, +bAu#v`g9AD%s^&+d AԼJcB̙n*,^*wV X> +Λ=k.p r{+.;∐7I5-o"/i2W +|ec޲|XfX9a+lܜaxl"b`:͂`HX21]r<_op!`E1]$DJ|  #!߮"U:F! +wJ~ѐgl߸IxDG|QlBSTJ@5MHg&O䟃Ze/dN+f'2Bx.b.R\ # +q\' AI5?~Tۧh:Ov)AʱV M>K#kSќ#l[ |Hs4# &Q0 :?z2`3Z3xX3tB=|^~C)j85Cd[kKewl=Wݧ2珆Es&wpjȝe?$  +*Szn8F7zL;_ڏa44G0=qvvWӔЧ5dlH ĶVP;:_BB!d}N?SQJ #+c @+c}x]D}ۨEӽa>ĽԶq- ݺF^Abw9H=ɋf#j)6+llO' x3C&Ҙ*rG{zb겺Y2n;8Ox]'un&cd`l\% #s#[YU,{q5_e]9܎XSN[\M΋ pnqy_s$rCБw%s: fBk[/DwMY1`a{LJ?,NJU$->UTf(Z~TVj:"c:8j:8kQ1Oo2U5Irs?PhLTS[Pкak"(Uav&r*J <TQzP[/rZuR}jzI\rLӰ( ِe1|WTv?KŁ@AmKE,C@{$0!aeʖ=&,% pJXׁ(Tks զZbI}׳n_N*n=g59}h*SZ.,̪?om.ngyu^M:gW5neε6Y4$iAѮoDh:MS 㾎S <&}%*>>[\\-Kk,bʭ=*, 9yӂ'j;'w' KUDWM4k)Ҏw}+݁1!#t{ xK\V{CbIKUjMMYVkYq~{QA(QW( 9E㢜)Qn0/F dHR jh 𭷬tc5t|0!g.IH]a}ˆ7:5!puzKAy SܙVRӝv%JK/t&q&:SK&EBY SMҵ7alaQigQ'#!X~I8ď+:XYܘڜUٞXSEwLekwtIqlŤ(|C/ Yڛr&8fRIŮlz~Q0]2@ 8A?p'"V_&mKjLnIE7EG-∦aD aZpF6Ȗ6joڝg]F/Y(ML\]"bQ\qCb&VH"مǣcl>_ho3< qw-e+ 䨭B:}{Tј/8|;4鶷wo|ƨ:P<(I8U)IhfrZC$-!}Wj 5Tk(ӥrPOބ*1]m~7fa[(^5\Ű/' W :^O;[\8P8Q0:X06Spv?_# 䫮JM%mozx~]&sk4pmwoy+AR'GMaa%,H)?QX7UW7-PgJ|g.kag:Z\n+ɹ5rC>v<"5=tOt-X$.YѿRww;yIy>ws) lol,{^$[(SQc*79&й_ע +KM%/q/ \bO=}z= K#?&YFҋdKQii(q߫C @z?D͝GhOv^+;eGb2| |KY&F{.{y$Hp{>+,wcq(k6nKCyE^C.hT,Z؛jejZk/63IHgtF$b# #JXPDz>N3dDhfW꺯E|vo-Ý`l6,0C+/ROBx9w=AX DѬ f@ ALWO!tBCu#Z Ձb9hmȃ4@W'v2@Fv0v{]]=l ^@y bȦB6 +Pe1ZRLp0{ M16@xF_u7U2ukʛ%!_![UxH(/m'8۟DF )SWV`,i@j &81p<^yjP8 +QqT**"{oV& OHBHR@*R@q^ \(({-V.9ܷwIX E,we 0_(K3o^ܾm@;8|= +>j?GXaUx}֧}2mm6:8B f(Ofi"f=s Co@PK޷v9f .vX@H~)Y_kƯ5_œ 8Ü<=t1z,:1zADLG?aewbg :۲"o轖?ۀpN~`A@aȄ)t c<8:H 匄hc^V -gaӈaV3ӉBQoc=!vHy/8- += pe'((I E : yV #&/0 !qSm84k "7V3[! s)N|>DSHLF퍒D)1Z~ȿſwȯ(>k!j:`X XVa7wlT> GF ϻC%˓~%2 b:IxtCx-l6F#g/S>(uZfi r~ںkVnZ{7?7^ë5gnxxJ)?`W5۲CkמXy[W_KQNmLPc> _Cg4HF^ ';!@*J A:=Q-JhW&<>^AQ!Xm,sHٲ;W.i͟3~Usx~Uo;>O8D4UTf/rҳs2RT)BF& +Ka/Oߞ"ACuBBC zJCږܹ|x*/-h3ѲruCpR|T(*`+lDd T"*4%촚Vbfo,QڣM-283#o^;~__=k&7y|Rp]Y(.#u8Y!3%Uɑ*4YJTRU%dYs1IvWGvk =0` +m +۾|WW xںKVl=/n{TYV.“sNQb3JD [B(y AQSpyZl~S6׫ Yt$__s|>|agX|ymW[\[Kw5ufq@\㾁,JMKB&7II@EEZ`t +ETHG?R(2 +RȢ(xzy~^eKҍ뎭ر} 67l?`,o8t߆C1zck(X3M #8tMC85NCWF]Z~%ҽ[TxI)ȫҐcǮL;|jiF|i.Cl}ɏOdJѕۭ=.YGX㿃S?l>2=97 +ݯ_o1Z4 k"u8wo )ϼ1_'T.lHVݩض:o;Uy$S]y6Cu~BVuy[U2H7NGNۡ*;t0?]l˚|o &mFh\t W55K6jVo&lLDJW֝٠MS?[y&:Ƣ"|y.<4;?󉀹X$%6*L{2AB4,NU[*i ޸{5 ET,}XR +kn*k kMG-zx +[U6UݳCeƠvڙ3^oy Z7uT+lU/[K//LKv$`cKKګb%6޴mȵAOsj{yd:r'euZ:R=O%EcQԥ1 L&~Fc䇬|=D47m-sƚBzKoC?M1~Ӏ| {% , +2ٚ(K&)"oHNq,*GT}IW $C _LTCš]Z"TF)#,0wj*w^^&/Dl10`@.e% IX|/ B-BF9Bt7l~q#a} +8MNg'̝/'aLGR/s!؞!2#Ͳ}>AhO+B>!0jd2>&O 9K +sW, @`O, `:`A $;::IwPZ.42l0zNDLu +sakһy^ t ! W`3A  F@0n3!n dңJ#Kѕa +F~VBN!ހCSX2, Jc0 + :ۋqA@$ +mPBh&h% vV ߔqE۴ +༖s z,. 1"oWW\1)A +$I`ev@U.!}A *-mA~,WfQ~( Qt9 wAz:Ȩ0e HOUw ,Z[H _"O-eՐՠizA:^QT!Uۀ3\A̘JzwгNjy$uRǓ L 7j-!tZ?TU]>OUOP)bPl3&yN? bB|7!FJ}QĒ +Ye|`%_dUNV^~W!yд+4YTe7bPsv~.<" c U~U.੆.,_xVQdx<'QN_wT-ѭ]/o5nq7 (:Πu ;ք0`5w%Yҗ[2Nǽ"ǽ$^'M-TkN8g(PH ܥr+ΆU#7⛑:!2N;cGE~ M7 eސ 7,)}(vC6)r$ +?S5XN,g]"ԳmY1I}m㞦kL8l/z&$zÛbB&C78H~"eDV.y>r)R6]s˂IAUhg*Oz#z@^S/e{ ?ZwOslx:>{Ǣ3n$Ux)%mLҊKZ&ƠĞtK|!M~-J~-`&x@"Xӂk?~|yΞe-WΎrM(r_D>ϰdLfg .MBY-h=C+؏ѓi%l@] EKݡ"x>ԯvO +v-~urvܞLRdW:xFaم"q-E8 ++XrmJX1o+=P*qYAB.ҥ* FENx)>x-?bE nWޞIOlX̚\,CmBLQ,) *T/U TDYXef>VOf I> |5˪ +׻=mwlǂqcCΙZL& +JP1j\Jm&Q >Ջ[tY:N+jŏ4#FABqisa֗.ty[qF׉ʭ-~LUtͷ*rsTOtZNed' JYA!6`1C~6&{I|} + sa v~}k穪5Nk6wΥuW{ӁƆM1KG 6:CU9i1L2dM'Ds`0&Z{~Z`|h48^ Tvp vvҶ/5lÉkC!S ƒ3y*r4+@/0g Od%5k 4 ySڄ)L fx8O6ܩZP۳ʩg낆K+=[P]s1HQYjZNWU̸ + +wʦU6*b+1ϰXۓ \̠j?YDnwt\rnW9_Is{ö黢e'rO*?)مhK=d@5mnE7J[n_I^ɢk_:C\0r tq4ѵ>LJgnR % +!qnBrlDu +""^DO';:u;A<pY:huU7<[+q|g`бW~@F#& QH0q9<)P®t]N:t%1t3K3Cd1c\<@O3(t֩ 'w~Gw}>Gua?؊1 $Ե5Bl߽w޴]I*JpL7`)Àp1Ff34$ #@(FK,?`7ۙ3,|H5*$jM=xjshW,Q7nf2M7-ʦ_VÁlowp;B!YB_!dcΆqdk}o׶OZў-3l -\hխfRMz=r~_KuP7*Nƛ8Dl N^&`-!ԏ![lX١e1$kUL(>##DE``>\ mPp˸әNЙZ*s[M>B.Wr!6![c?S| "´T n &rKN8%$hS`IG^JJSf`ar V&Ec}R$%FbWϰ=XCȞ:Bճo$d3B>#c+0n|||4??h"zzfF&#!*̄8&hb"a+0v` +֪Ho=&!;lOgOl&tu0c>c?ixXr0$Pƒ@u?̡~p0^ALJ8 ( Цg#-BzIiJ~uDSKd^#^ 1x/E#>0X@0$O7ea<HPY +dO!c/idluJFMaa#ދ @ h6/*aq Kh4H-\R-F_u2 8:N +#jXtI$iO^#W4(o ?2Ph3VBiΣ )Cլ ;1|,dt#+kꔁCެ `3XP90ba'Cgq9#T#]~']]>>W^O*]ʛ=E'"PuTE  + stl FN% K1dS̀rWD׭XRlҾQ~}th^_ v5Ui5+뺘:I }=82N Sa +kv02"P 5J̶{LN据LJCfMUЬۡV骦tWܬy`5<;&r# Y@0LTd!?P6Z!,Q&uyŭ{a\`zf\fybW#6S}{#i/Y5;[o-VZ6j>_h>%}1/n +*S-Dt/Ž,ץ7٤O +4mswmͶdmVg;hݰ__گ:kr:CswZ6GA$̍OfL]߿ڹjYN|2PR/5ʭt:]wq^ulr^鼜cnRż\ 6iWAkXPQUWOEvdi;2qr̀UgU-wҵenOEss.ɵkKYv]S' +?/]|EqUaOɡ{񟈊1X?smG3~YiJ[\}RE OV GWQoCG*8P\[boɛ9K*#9`YS|7Lxt{8`nj#tA.ZK !3̘ 3F342.CY\JnIWNw<J-v={|~o݌k}a+8PƱ^ +%᧔̔r;JRO'˩ NjC M2NS<եJ}K:!Z(gˊƚwx^jqՔ7Gùúm4zJ3MmHi46Qʨ&2F%yYA~Q^30')3TAenBOb#RSrsJ;{2C;.CD6NLjJ}Ffz Ǭ +*RV9UFmbRYREv >^$_Ez:Q PUXt*2yiYqg0>OI,z*Kb^"z'OD x,O+VE`]HF x$2T_Xmu{W8xPl-ro( kI2VfferB0!3O1[9~>90`Y.<\䩂V#@MjeP fJsL)mVJc uʼn(fXlDbU 2Y& ="g;`-YrUA} +_7Tٺ0`7,W]t>[k,[]1'NEi|-etn-+"T^(w07U{*H9+s  >K|%(W puƅ5M^;TT[C..%JSRy +)l!)?()E x0`Np?W7JZث4h La7JNUmP48ȕQG$,N=Adlj +cŅaM@,'GKĢ~lj(EK V}+`ZwZaU0m;m嶱פ-Fv:MH';^WTasP]FbRZk*"Ҁ' +l{bJ7=~: [tynr{B2]щ Idrx[zzh7=8-]N hL;q;5c>5m +^< 0څm?lv\YQ3uҫ .{]$f QB Ia1}}TRP_6)Ot,21`h@8#xGU `B 0p,@yۖo9onx9'xŌD]F<4MFFep0k7B}fC|FC~Pe^0]eЂep۟?A}<<ԇGG{ײ:Kvۑ4y6 Pa"&wp#dd){J=}qxz1Ob= \h ǃ:ȝ3g͛$>uN|j:?;4k.spczdz6WC.->wv]E:kXz.apb +^e.m"/M\0^kd>k%7{7>N߿ tv}]e2bGߪksx-[Q%}\ P: x B2>iawQM6ܵqvO;>9Y|~gok/v_ímYleg=UZX&s cn.V`P89 ` @{Ñ>Ӊ@k}_dd̶ۜ=7A.VcCi"D$3nۍQFtj*~ł("-EMr$@Zh IĄQDQdP]`È ϮOT:Î>( ~}>?WlBʻR܂9^!Hjb0*llaXꌁ/W?6ݽs,t;ĸzgXHpPbo";Rߊ w?X/*ZaTXۡ04ܝ=a`>G` N6h @k?f<"~nb@4x_)2o#nHp5(գ^r#(H@yK}Ǿa;_?H2xM|7@LT9~ , +˨_L=$Ȁ]E~& 2GR/Pss]: oW`g;Xb`= + |PWhUa@ۅҪQz-u~ ;2l Y~v7D{8g6Y@2xt6."BY4x28IЁed,e|gnb Ӈ郜)Z?{{HIt +(؟<}$:m3B}@B@<}c rx쯼rV WE+'0sIFwF_N}GQ;}P'F4@2_ 28RN " d] +sHcA)>a'0-,u +s?*vp y\~r6.󕤍&d>pGyOC@8<b{i>@!B m>p7lTx' nCp%82$zLtРNj{J8SNy`wDh3E/F>(>D>><$/ޓ]ݑ5nE݌(6DCe3ח8ځ` 5gꨁ4@'t fUK}ەqVyq!A"ɝ赒GKnl6ތވ^=+mk^{(m $ 7q>"OAvJ#"y +ݭ!z(gmO.ul.=C4-}5'B7W+Mˊ]]K,;u:=>;DpD=fbl@4LnVj gd|Ck^,Zu!27rYY3S*y}.ɤIuc:#gCɟKP}~]_oX5lAY5u +Nv`51JcZ7@o@-o5H<ή"_ϭ)YRݝcTmIl\42l23V* {eڌu%縮^c`XC%M czJ2{F"Ҽ4;bY?~Y#g(TY޶XL-3\n*5g*M;טdNf2].4=)]9ԓ3('aȷ-t"mi︆Jٍe>qJюȪiK?/1/ )\a0[6m\C.`0fȥ%各"Jn$9{vkHK;>~yίuޜŋϚ7wyZo0=_V.ϓU6R+W.˳e2Ҧ2e3ٲ/dsT[S/Dm2-Frn6pՆ霩ZS-v8T8JXU,/1fWNjr^<-GQ-ϨVg(';CkvY,㹜Ș õL[SfJ`R-F}O 7]|X]y[xuSH}[Cwmޙ=)[P( +TF6E*^1S(cȉW<ޖ=59FkhbւZk`A n6/V6l㢞&?fK}`mKeUϞqaY|DNqRBZQjZb~"./OWw07jg*reD9yOT_eͅA}WXn7Sam8΄՚mzm>QT~p׮Qܪ0[Kҳ"U9[Kaŵ9a% +i@[%2ED|*5[)jHq`s! t‰nŽ.e͝ƵBNacIcgSD@v}Lhjm|L|urrDeZtRDZY!<.업T\5*bG0&`b/up'W'+*t +:$n9G|eQ№xi,YҠL n(I n<]x$I؟ts[Pda&AT*QT*i.n2*;MΓSH׃3 e}F)dк㒍I[6 + 눏 iO jW}۾;VQUq:*zĦ·H}R<,#38p``t3[ Ctk_p-:a8+tHrmHDMYa"*4Uؿo<ȯX!DY2׿ +7fG!GHBkFPvR躃+5㪧YKBo=C}"C ~C +|}{|W|*L{? :zdC=I!&ߢQm(Qc<1G&1x$Ix;vvk$wם4{w;qw?u!CWjnR g O졙z GC3-h|oGω(Gd 'KVuw%~T3r#NLazNYeT[7sz]LiΚzKǙ.Ë,wX/ۿ|:5rtz_NwD$=QW_QBfil5r^M\^;ҝ޸0xٿ7{lf>Ĵ`>йhV;L9L8n#\$9.&_qG/f"H=uH uݑalrWڡ 5梛 -0ИWcJ&SX`Dd`y r̯(jjm%KQo#H7B!ֈkLh + (20-˗c.Ks#/Lp?d_x +5,؈As RPCK-q2s\@ MW!Sњd:-AWE譫ej(]JoSy0D, +D M@Cf"t&LdULd dgE-tO︟Lpf>Z`fAEK +D1r]ih@j9Zb9uDZ!͐{ܳL 3Xb|1?K wkd΅tC`QgFEJ3 mL&)lVWD>Ѧ_=-t#tqR26͆i3vlvgEn]uq*su;#{t +}ܯ?ޏ>> _P-Qms?t;qe xcV8[d (?/g"93Wⷠ^ 3{P,N'SGCRǃ!!Ҥ q.  @YBm~] 06L:Nǐ\4W\Q~L0AdHd-~Tp_QDD ϣ$_G%(}'o?c (w/~ `9.\W?m>p068(O,߿)h5fcRv`nTab0iSoQޤ [6> +uxЋC Tf ـH9W,5 AY1rd AG0g\"f& eޤCh25.zW>\/w9b|O y}|7u'©8@삝$c Abk]ī:iۂWJ2$;$Ys= s 5&Yf+4tytyt5q5ɚ:X; DKA{I6}7}˼V#jXUR"#%ekN]lC1vUQv]t'%'N;0${r;}ʝ~ͼ".V@Sg^oq2{0nXqMCqp]c|%313p~c{b!2Z[nZ+v?O+I#x(g4@܅ [l{1j9N&s|-彛ݥb%RAQ}p3EWXGX(cKY/<̬e +jì]7E3DU vB X0@2Г\[^Vŕ< ۢOo!f(1{eJF$ ֱZq)gx7wxJ|[)╋J/ay;_ot@dee[CorA#VНP_墐ltؚЪm؛.4dy*Zū˥%2iTڐd&}/=T,(,JG[@%-̇dRoY@A;j)T1ɡcn_o؜DɐU*etAUX,O. CH5uTzS +^DvYMc/eՙFT}iffG !1j.P(1 +DdFAe5,g>*#xܺu{s&HY-kURܼ=yekխ^wcU\Ì_: f~FϠ!9Jj2D~QW}=!_sToE)q)+ +2Ss22b)8]pcEtA[JT~oJĮ;GSuLЛC?prTVAYDITz_VfgAYϻm9E9(:^y:ii]:6?fiHxMzXhuvfk 46&8jPPBtyK2 Dvqs5ߑz~~u[m0'皻IUo+Z8uX}OH}_P:} lP ho_.YOPr`[n͂Y}GێFiiI;mcrac*2W[kT~66ti*vi>\jeiRxޜT3FzW +KzhOR<I=xt^G G/DmbUDdU:@ۛ>)a 3Cnzv +:C/cdK*Ksӫ$G{{d*^dd({md_Al~D? x@h7 Y:2]Yov$p:fx=zd;j&JG/InJ?Ilj_#ف;] @@T@9'L '\D1%5Smhiw%,PK38p)XBc61fa5u9G$$3'3A};6( SЂbVCt|}3 '$"l rtZG6L(Yհ%$FB: tWѐ_GCy +h~:-zB MGDh:lfCB\ y3Ș(RQA`"6 +SX(bpa ={(:H('T2Т1->K_OZޤOJƤtlPK["CwYR@KK&Zٳʝ@.J(YA6J6rӒ])ikB5!+e);zoU9f7c1Km?1dAkkd8b:JtQNCaB~\gcL0|qAqˠ *0HDICv$ {N%$ +@T\^ю9vuwnj"ppPawE]Жqf I15rbEJ2ݚ.Vg +զ|E`V&AaK_}J"2FTQg.x +N +Z%̫(za{>qe=VkFUdH %Jz.cJ1r5bRKj%4]sIy"MӾi%kEiLPptǹCZ\0TxtZBQH__V+ 2\C2ט*H͒ufyT)Rt +_P)ԺWrgi" *n`FA1 ~g˽`j[Ž2ҷ,ni\bM92qL0ȓ9JXm*Y%sJRB+d)LPp'Sw aJ߯v}v[ $T11%^x^0&;_J2VJFNˌFؘBS%0(ƳH; +[ȿ䉙 f*Dm 0~)8ҸPv~յU5rL+3Tj4O'2ɬ*١ei)<.a_JXI +G|5r?T:Qhvvghcm1jQlr"+S!ϲW̱$lKeiJbYLiA6aK&ip&<[3\ 3h`:`s֭#}KK̇(Gm JQ/! tMfdjL[asN6̤n1h5 J&jED3y {2;; @[v7`Ttb\K:>p!icvʉ,ptFsQN;$QD@lzCo/9- |`+tnjPzB۱Q4o>?B<\к2>wU$Z\PUV:2Yt;+2)9!IEi kBl٪UE I=܍P BN!4B*Zexpx_U#"Bм)(7rݥPF#9eo6-ؖiTt6ΤZߧ#-G-"֊L°RAhG'iNT~wokރ}\6B[3ßE ] dH vs=]'kmo>W*GV=!B+ o s[J@52zx+8a W?'FH4_=j#|_3yұy\f|1#~Mo`U|ߎg <% 7=PG8L w ,`js|+@.\ +Hp! 9쩐B7^vy"3ϸ|Zp ͸!Y: +ASBFzˁŒ&A恒-̸MwqqszwL 4@Z 1 2+ aȭ\~u;q.Х+9o+q&gTfC cyIm@A_  0,&G" ^!f  H6 Ncyc>Gy}y3ewPqӯxU pzcruˁj10FT) Τw>~1 F#U?_Đ1w;Mk.^hZyO4ND>9ĠVP@%(Y:2%}y](~B iW /[)Ao\Ot?!z]$a\x?AŔ~ԇmAn|8 oP;!w!-_CE Ivϔv8VpG 3<F:fUaC +)y AIiYREZMk6ڤ]a-fxI\xvxzz9Hp[8R }S3Hp7 7sf ~Η2\ϧ<ոo21ȢHmOLoI00兌rSD>^Y+2JrIqT \N" _ >ByƟrIp u9c {[+HQZFe*xFq"JQS1)YnV,T1.V[[l+Q?BB!yJr phLy;C̋t[2#-钀M"ZaNF٥*#XeFUg\j0.O5UgPޏ73~TBE Y@7_JXQ E[{[s=qjʠeP &L;ae?XAYw;\'5H% +F>2Ӳ:MH1M8E#VkFIYJgR\^Ҽ$iB9wȻMwvp =aZ*wԗrTa +Ĕ tAeƧfEt2/"RR|f?'jF궀 ^j[^Q*,re4QՊ P,jebE$"а">ElBh*t,oWo O@O;X}OR76Dl5ձ<򪄾& US*QqE /…BX- +;p~Q| p~3~<7xekD 0۶:;@KvVkiK΂&F옶^LI'T)qs*3eMFgǙLq\e.׼[5]*#^q:*>@7vs߂ݠM)Fc'`ݧkTȉRISy lnibqbb؍HV㣈#FE)z PSAO4!pJ~(8s[t])=q݂SAWbH\:<֢g- βtZiѝB-(ˣ`fjDЈ֗4[v%"͟EeE E+FB]?ig8mT|K1~[2;֤heͧ0@% :i$GXaX?f? }J}o=,̣Ϡ;T!0LnK!풷c$e}Dx1v/g^>>6~0mCc^AχG_;َz@{G78 P6= ]IsA1wN6F8o6l3{9> ΨCfQgKRg4{aW썝#`]Wmut)4>4ͮB ft(n!\\N-c/yZ +@_.1/qQDo XN\ojߊŕ2wegF/7[aх箶@r?sͮCn$/!A併@?r Xs&Rj28iS(!@:H0Aİ%V[\=]*(ذV֊um 6EA of?^{>g/z8L0MP9Q_9W([.B1 +墐Ԥ_7`|9^\k3G:0qkQY@]MP΍GH +ұ9lj$z+=}y\gos%VB߈ J ܯCȷ!M#B +@ )K]5~46l +b_Z)=@y@@H0!Uh"<@?r-C 4P.O_r3s3O.5i%ژnVzHA.' l b&3^|gp1dz/-gA>-(½'!Kt] ;D7vQ5*'>[w";$Q t_ }d*,( w 8 !!=ټqŜOVrdN&CnTբ8F5+Q{e%٨#+G;]L#p^:7Pྒྷ# J ,Xp /#EvN?\r[T˹ͪ՜;I]4w1oJ7nG3+tC{UV\sX,B|+bFF<ɵ"}QG%αEd/D=cF5NGu)ʢ@y2N>ގ?-F~ tIi_.g$3Fv#v"yK_D^>p1KqθYqָMqڸ[┱LyxUy|PFp=`> C ɁDEN4U/xQU !;&#[R\sysq]Mk|թN/STV1JM;TL\7.1S\ԣ)2g A88C-"T$C#Н@hɅO'p=i~8ܦ-kSle+,Z~mX}7ײ7RRady?b_oa_#arhKEfB:{cit}Oe$?ZlK*JNoOouuVV뼀[K7Y37Z7f[ Zg=z9xuRuHfRcʤO+ tE("*'wkL"ХЙ^ǦrL(-?eh6?=Ր66ps ٶ١Yakm22mYWr +ϰ/O)X bIJC_R /H "T;!t;?MNРC bLNwʛ8Ty\ou&N.bș+Fe-ZdҴ2 kADA-X@AY$}A@"@$,ְM,BTj\ѱjS;L]PxB/ۙ*93ܿ}y}{Ň(QJOԉԊ_E׊!f%ff6c +*o𝭲b8Q8*n0޹?+O%K mːGP%%1MIcFZ'Hi$'hU q813M-yK-,7MOb/ŮQj p|-p[}1m%mwЧ#7%5;-IU[+UҶIU:ze} %b +S񐩔07to$.fp՘Az\G֐T.ث..eY&mo͈gS[RY XVRɚJY'PQ <Nlu##{̕,}` |?G50T ꭎ`MO;ҶLZ_%'H NiOmk \6P9Xv>vjގHh> l.+8'{=h췅7'Y+.c8>I7ut0 +gt;Ct H0Cwq=]UPѺ^S;mfN#׏o |phܡH۬%iL|}b?>+ A8M?K_XM/%48s?qC%G /72G S쒎9 + +8CՐk(1Ԯ1{F[I1uλEnFkġÇޮ -fs76 c;u c<,`%lȅb4VD.0V[{Cn0u 1^s9!xtfiЩ7NO}gGoI'cy@yE2pLN2ɟL3XE(6xP>Ĕ8x<}<( f]q6O x>xn_,e/\/V/| 뉅/ XL +g@x/,^%{ cM&p A"[?@cNIhΆs \JޮAB*[ .tOs=p았K)@w ,`;1$35Yx ~H>Xz9m~sTjt>LTf5ѨIt W%DJEBTz7"bk/"dx\^g~~3<7> gJQjGG/.&)$#GC +$l">Vl']0 0=wo,B? x "GMWO\C 0 בXE (2%('x;؋s#8uᅧC|yO'"C iCl[LE"DZ=h39?(5w7dwxMVd QGdC1}z؈A_yrwdjGs p"s_.r>X,^E3ͥ<l +J)O6`_AH5#lvx  +w̟,(-Ѻ-'KDY Yr;(Gq0g:o1zE)'VhYXPSSlWQ~wmgm/ݶw+vϨ0ȚCb&9sY݂k͑fW[B;zdR]ub]}"ݱ ]gB!pn_kJ=H=ͥ@;͕6Ϗ,O &(HT5kt ҕ3SӃ3eYp1i!dd=a_Gὀ$qIO;*3ÿ m( +R3R +T$TX@AA LXXk\hƬbI,ѻgx̽ywO~}<\^ c-{ cמZ3ǶM}urY3-VeDd,sZ6=yiwbjj”))sR(f4(RZ)1)71ɃA1ɯc?& }kpȗuRl/4CUbZINA^њб#rbR2&\5obtyl*ELZQptfETnA靁"""# +#%p-,#iO؇KPUbR+LQ),[`U8cyv_=$e9AY_go +>Y>!/}B2 F*kp.w;Mw\TV裴~+&KJ̓gY/s]85 3"wX~Oh~!_7}F!'=+׾3h0Bb >Fg|dľJce+]VTyk/dhcق +blq +/OZmFY{p:7EWEYy 砲+N%CE\nf}by}=yϯ`U12wXagɒOiRFm%&DpB Wf:) ʝvʃ6U'U]4d׆Ov\a Ζ'os?[;k:}z,i=WyZqzv3.2n~+Iߺ>u;,k=fU5kg/̧Ud9i(݇w}<]^K~`Q +6c^D7;#hɛf7Fik՘d6qgchQM<5^4tkԽ]|4,ѓ̿-zMf{ѭlvk;Imjmm +p]8}օmK躴˦mqnۧvD˱o4'<ղmt95FPq@oF+kp; +Ojc4:0Qܡ:vDH:㥓;I;WuvnTԹKպEeb_T&tvKƟ|by⍪wj>Dn欤.=";j?o 0 .LM)1Ply1\<ŢDf]ݵ ]M0:î08 `phoo6I߰qЛ$bKU`܏bR=;Vu;A{:$dB*=50ɞS?7s0tc+N;OB- "H!y`Qߚ@ <A7G\8яY< ѝEw2|SoO]$5gĜwaE 07#Z8߫XT8yGk7`` ҫG1 ~B7KWyOމ1"ɚ|aQXLaJ 7@fX-0Y*SM@Xe"9QJ./ф! x3x,] )|JoA7cl UQacX"L{]LoUu;]c'8~+O=~Ex3QڂĈ111Le !+~Ţ?Bko!no+];M>[046x e K5}MALCО NꂪI8$QL&z*I>~`PRI'/=7g׸/?INknWp<,@}mO$σ'f6OܔݵE྇ ܣׁVpdz w 1p¼%e;~.mAp";$ak)[ <yiȗ<L% o7`3rр3Ns+rه1w#X#,ku +9Ǻ`3^9~hs/Iٸ?P3 F$SSGDI$͇)I´B2lx5iH涐rgȧS!I8y7cww(8%x/)c<d/]x8 _N$WP{p/ld^ $ ?,ts8%,r8)p8!qnr8&lu8"RECAQWKEO ~s#zO#ė|@?%OH ؂hDD؝)щK'ӜuNKM1q-uTlS?oKC{%L.|Kry@ĥOC+]G ėPI,O̟ per0OJ#.#ҜR=mHjVvKi&NitktutԭW:M:#Eأ[ ?0p(LUѤpbmOAYNY._VH!+̞d=Vϭ-e^ݲaNٴwOgM!#3!>P +f`=فt0DFCSdzoҫ'IEY^%˭~mNy|JJ|*Q> [`uW,SބX'6 +"pɃQKw(cW%һ +T[JN@ lFKhemjD[Эu =F'U%V%zeBbU3+PY3y"_V)嶠tUZl-eF18έ 5lL *)99j:/WDJ)*M۸f+JJNP Q09ߑhyPs +([W@UWLkUHiEe ^F4 8iWn+zQ<*YWEratd@V = +^e>,@?gkaH_5|-zoP_""Hk(5uxmeڤ`(CRKxF X`>~qtz)^Wj|ȕ‹-z ?W8= @7}bL([K$N8WuC.% c%UkBכ8s Wjn wƚ3Or֙1?dK*qĦW! +w]Wy +#dg;k m0P:dmZGukEڜԔ f2,yXK {cieJ, e$Hlee<3 9* m&jnzy(r((}八fbZwg_?><ߊiGz$~UٽJw kPϚ!sb%@&dˁG~/f&eĨ'2ڎ]9C]_Ok7/;pi~C}ӠEI5I~]Fa+K[_E]:5XU& dQҁlfaߙžksCJr"1^[;۫ٯ 垜5+)k1kWB,jG|V{B}3]f^v]}Ő-fU{9{|^j-[d(5}z`B{"{.ESQ4(^~0Y\Cbv+xǩo4؂TGCAZݢ  vGE"h>,áKY*r̻ZXy|\L޳T#Y0Ih)k1FGj#way6&Ēmus[=6?%5]f[BnNΖ4m#{R e0r0i|*GDU H!'&KäRkd&Z? Ekk,x[&xVނgcׯbμE\\<$][n >iWxg} <0 Ґнq6M5lmh! 3Vry%3/`YU}c0[4G)6M\n7fd^|AKe6EE\AqK/̵̼9{}098 f+@{.hUCȇ@(5׆·u^m<۸nGCqඦ\d'{3Of1<(oέ_TWjn-zh#;ɽ|Ax)60* N%{*c̉=.0eؒ)$RMHݥ~ɲzOg)@|ʺRUaFZA`` ~lY XFJA&99,E>Y,K)-g;&qsN.bΣgQÙ8Lg8k'_"*QbV}U6cA'D00WqYLE84㬴_IRFj=T82㔪'p\>K8bێF)WP;FqUKM]iM 4uӎpiN8-q8꜉#ι8RFw݉:8v 5nюjnNU%ʼn|/AO 6מ='}F P` \,2TU A +9\K,?=T_)A[.^6_\EsPpgp(xX{Xg_Ž!{B!ZCU]5RyXTQf,aU9^֢~C)1(L)6]R!*!'n4i t&zj]1Wc,[g,622 jaX;!b_@ !B dMl QO"8nxqicם:v4Ӥ[bil̸xF9wyrx-byF϶6|G8f1 +q&KĜ"c$6}7}f~})1@>GuMX<&cUpLk7vU+>yq k +$.A->TےVx$E!MRjl"[*~-z|ɒV},%!W <-\Ex&kTs5ԙn}/ m0rqQvLǑʆ84G,[Tɶ88"-P[ P,E$^ zCMԾ>Z1o9lZ m0ʴפtlo.oQhT Xy)U(RĊ&Ne]Gn ΐ.[N+NZY.{SZw?T9/6YkKyowpow`DNڷgg0 +vlwQ5hISub!9BuSҦRxZjWmTVvFJ׬Ǭ"SVQKĶ]؃+G0sqd3wBw0t@GO;˵뀷*, "EڪZfik#iekzR4cB2Ws2PsYX88I4dM=>{p r^" @7HՃ_I/HSV]( \&@׍qn#Н9}@w/*QtnǓ9=~=Č, ヨ?pWQ/h X]DZv4U2Bx!aX^Y"-Q]<|D~# +Ʊ];=^DQq$f) L4fY u`󠴑{5j@Pwj@G {r) P_]<螿X䕷P擽P嗵 43~CY4:cxғ='ϔٯY3){\zۈ 4>n]hXA}Ce7@faNs]vڿwO_zpe&ۤH1 Lnɦ5$s;'=t_Kʷq+^qـ~ԝǻ:nhXc(:Y f@68ilKCi!-UNS1cw,3,[[؅oݱԎ~oa8vy52*z=<58~y khkDYS!Һ­vt+i[ !Jj!hWco_(n} >y.4̮OCu|qu~v:םs9Nαai)ItoQ [clmfvw/|ޟ~9?Q&[85{9v=aӬu(@yDH n^&G1L#w!RU@ ^XgyIy/0`Fr>H+8t8Qlz!_)6/>mx񠷭u? W_ +^j$Jr-@r5Уq 2g*.l8B/D ^MAqSٗ 9T3wPpNO$8-)4|Z)8fV8ly8(~E)hT֡Au{UgQo}{7rP(`+ +H'x\E +g|%yeo폓&wQq82\gbk"m)ܖc{sQ{z&qMqu1⪰Iaa maIa)2uCux:GR ٬.lRWI +{%ǥ꛲|yjAU V/<}gk oaw0qu~6EV!+ՌmLk7kȋ4 %tzm@N-~dQ֞WPfiQejVjJsw:_Ŝzl0l B[p4\oU>DQVn*SMQfU2jJU.W^h^nfEAOm?fLn]NxlW<:ߜ&lIP9[#E%޲A:E@u65vvvYv+Vۥ/gۧ;,ӗ:,W;.7;.֟qZ)Y)yS׺|MYcl Q饒qDM}9FͪḦa醱N ӜR K S ΋ . y.Ɇb$C<>D)9N'n u? ?wDTb(GXXe}f6$rbxIy)t9c,G^3ӍS|w㍏^*<6+ߜl[X +xbML(sxoYTQS,F$sGy\S,SLSrnSپ S~{L-LT# &š-cX-Mn 9\(J\.haQ^3,#|Y[&MlgY8ђ h,h6x;Gc߹H2 3 +l2 DAvG`aU6dWѸhmh&F5f['O㾆k{}9咟7N7XK\[#dP0'Mtse8)].m~<Ш"9ĬX9 Qb`/wʒfΔK˅i:W5E+JE2!Q#QBg q]~ @X |8r+1uC%h܂$tnȽ|}9vqDC{!Àш>F̡;2G]uQƒxDBxLxG#;܄w7fU\s*Ԁr/s0}@oG $w +|6ecEˇ(\Ɣ?1g>sB^@6l 1Kw8<΢3IWy6qUq Nc+/` D3s}6܀loif3r> ~E?6Ib99zCO^;zԟ1>/ɿ-r#Yl6٘=uyDs= Lt50 & _dqR-ď(3 -x=0P.1ɺſn)}C4݌11+n.^"(z̠OI_ }U6:x ^zezF2m,#\㪮[40` :1X2YJ̈0|8:Sˡ +j詧XKO==\\|}y\dDx꧴ h10}1/ķbLWȤOIO =܆05p{g=j/=\QIi! +"@AAMY*PQPTKTL3-5Ki6u.Դ]LsfͶ{mjgne?>x<jL- sqa`d/Q>0dĜFaPW>fuQu>B|\q8hupw,8_ۀ@?7WfLԩD7Gfi 󘓳?1g`}NWkpc>O 8џ{KSa?GbzKS<ʏ p?Zp\dlX,s$9V8ñ*8Q G"` +f"a:rDN~LN +a) ?%% +KM<;,w1+Ap/DIc1J8phY)L/\Y=Ly`2 u޸>=q{a4iwQoӷG-%">Y!I$&;U*Z,P.KB&޷ϡ-`LX +bwJiߠTE$fZF*Ӻ$UNImC됴K{ۤ;7J[s ҅z@A-c?QOQըG :QD°-bPLٖBݚ%ˡo:dEJmi47Ehzd]z١Z!.B7:ͻė{kzAη?24v0%}YlFBAQ[!kC嵡EG[ǬVYN|XrCI]0_ȏ5r/q@8V!bp=q٩%À BܮjR"![Rԇ(,r)aUJWS^lc;=lrS)G(/Fؔ֬G֬9֬,n3N &sze5ADMyz]z:2:Grj"]]QvruuKMųhxŚ ^(߬7/P/P3@kRy(8ðGQeVs\h1ǑLI>u+ncéW8ԬVej6oQGcEg?*LrWyw(ywKkL"dslg#kAP"dwSj_E-^`*WJ%\϶ڄY֊Lkm- +3l#tۡ( ?zjjyO-~O-.q }>_{D^dJ1*8P^ % Dq״6* +[*~ki~c+/ձ;21Õ"$ ʞE*r_q>,2lGq og k|:ֽMʯKJ5tպLw3mOssR\vԵ#qm`vuv +[ftfo?]3Vr7I:< }fmN޹ |qkN$4'hRGuGE]q;p"*\Df'rknf7D (0(" eVڶ{ilw˲mMr{?y#Mٳ"Dޒ. +gfKBӗ~ñrc՞oEU%ң1 +Ԅhhl~qGȼ;oͻ'8+obkjL=]9!`1p}_ H]A_^ JY~=:xh* +OKh4Pؤ1%aN3eo1QLV{0dF@j\ېl[JkRI%2<9]#y`wk~гs nJ|σ=c4s4fUiSfe={+ՓeJn$y6{7y=ExjS\e_W}+W/)-l\1eWL1^=sc*؋8ieDƲ +Ws;|3+)f4tKCI񌈽- +TB} +*To|dM7S&ތf@0xCu鶯<]JOZ/-'zp7Ii;>-R)Bc E1h7e".{9p)vLhvЌ^Z΢/ˉw!^N~ȨgVr.g 9 . %!X4ĥ@'b$,~_7~U-H >'|_³YGJxs\q _nЛ-tQb}Ρ 6(ie.5yfp +we_̹n1s1@D:J4^?h2g~˜2.e% J9sg?UOUdCW3q~#l>Y/t uBك=(> +w.xR-N. .p TcmU˺v !;>DMu{zG7J1p;ci!lV\A +maUc+%ҌVJ*%XK7!~4ہQAGXe60#*&''V)nalk->ϑ:Spҡkg'/~;6}™ g'qr8 ы09$ j`]z^=vQMmdkїe4A8[|EmJ WMK5mN2m1(0gn<ľ(k.^l^0;j.GyceeMr?9+eQ_ۈGhǿw;{ VͰr&*Fsy9Z|Z8l`LkǭyXW;XW9WV8 mf۲\QMw $#R-($IH@"p5\EejZZvkzyug[w?ekמk%{f${)8*_ɿzz,8[ +}-jyBE E +с,tQaԔ$zRUWZcZ_;lVzy>ސr7o@5WTG=n 1^;ʻ qm>/Ӱ@'PKukY4ь +DE))ja? b|FAMУtb;5c^|\d|f5YУ-lRŻxwq8=hݨ:XV,c +7h\FX2gߧ7zt]8ߡu;:E7* MC ;+.ݚة^q:p~ W%8f|GI4Zeb\^no1TSZZ#ݖ@Tk`sUmѕj~EKilYQk5bOT*%XԠMtSR$$c$| ήmCQ7.0& Lj3DD3AȞGc|$$RbhB$ )(.%AL(24AOAav:&?s:{}ANlE<&R%!{.'$.񈽜H%MFd&hYp,Y^FsKDOagq! +cK`>cМp&Anhb X"J}("0+|l"#:CzFpdu| à+EnP?ѳakgȇ)k " .&ʄ"D1/"Gx `80/'!]):paaS_W0?;Dy}:w=9<ל"*WUD9Ls( +Qt1B!?faN%9ysz&[07!rc7.;BB8uY p "( ! +'^ +Zj6 usZݴ+:Ugk;i7{Y>*k|=|y}؟JL1}ɔ[dN=9XZu:O]rQK:+Ӏ,_edva_㓁9FDSTWдBmqJ#_>g%y?qE Wԟ"m-w8( }1J;FQ(>:YOʙW̙Sµx|CEs&?9 q]-l̺dyS!Q_Ιp<&Dgsk7w3ps}䔒 Y/XF +ZKFa;x/.Er0}ܳwp-#{-'U!d.P74NoWSOf7?C8q;ƌc>~ccJ }/#mOQHF) C9u,a[/Czrx|pg_Sz cWEo,9Ym6Eḍ ȩaԓՌW}^lc 0/VvV6V6ҟ|Z~ra,02K +;9yܹ>!!gÈefFv#IX齂oGy}7O d{zpP>Q1蜁])\lcZ\҄-e,F:lcl7Ɏ`iv-t~R8?o\S%8(W/`#;=]~ }آ&U6JЫ*ScVk 5n^CǸaoas_Qny,[<^z$70~µ Oy|.85؇4Zr}:ViJ4`ʹ(%+Lc:htVaDVqXfA2Y2FO/==o}2 +3Ψ~+%vUKLw1Lj<o'MX2xh̙({ +wl)u4fҨVz5M!9r.L%**c~VaEynXmY=gDأҐRb=R&EB*Qt=@Pbit7u0nf#X &J-c.<>v:rΫIRr)Y)nXX́Z5\jt#TpkIkX' Bkeut[kpv͆=5`^K u١Z +,osƮj"ı8vr#:.$|r4z= ֳh<ӈKt]Bz 57}X9b0#vHuk'~~.:sr8 79߬h(ܞ' +Bzh~qx4V6pn1o1ǼU+^k__{}~@7:>Efh~PTxŕ3"89xKZ 2Tws8OtRtخLT/Z3ܒ`ej{jqA3XȪ#_kb-W_RUO}gqV:豎B|Su&^x{8qp&Ȅa1 F.qLqYg5u]ئFbSj z.up]E|ޞ3^ 0`x#`Icq%FCGzZP-]Qkgz*=DͪF2-wRpȱIJBxCጆ3<F՞ 'NY/ N뿡Mzu ~qքv|7g[sUʐ8['i]P N+,C%aT6Sie" ܥZEK#vkIZmCqu^Q>m`%0 # $@ ]#cK`lu2m:'Iڦm:dLvI;iڸnijy ߽O߽74̻OyY؝F뿉s+/" %vҪRE+Or8hA-(S#1:\>:g{&ivCkz nC7?nw'X0Z)_(b(lL6ʊF ,='FOqx#)3K)K We,:Nc'u.sEaj̝OfQqrN\4[^,oH>R3+ߔi8Bj!1IJX$KhОKv5xwfl~[jְ$dmm=f۰,`kdޚUYSe溼{rr_WrwuV/cQg 2!ܟBl8 +.uYW´m*~ifglyM8q IZd\K +:p;X㿬ÞeoFKCr-zǠtågu4QZ=e4X^Cn6zw+[T +{|ݽiXQVX^RToПXK?/܋߃ucq1 "8½_Fm\ +T0~9o4juz۽aPXjߘW}'Y"[{Q^#34ݕd ,{k``y` 8.\ǂDZ;'oup Z5(rS0& ++CrcZU.H+B/HCߑ?wĺRmL_Yp΃sh>@P I `NBqpے jKd;JHQytI#/ihu7%;:9Q%25&DeI{RQv~<ǰ9p:F `}}DI"lE;&%cT2V@{STғ:e"UA)姂LS^v&(7αM&yv ~B9S2ᷰ!{< 9FLDE3<ʟeIEyiJRnK[hgv}=Fl:AI$=EK$yӷ7KO|H$O hq; vؑaNX iYxCD;f,$53e $Xq7B L~t0 ``#Vr=}-`gP9"a""X\;2Cx(QOq澂Mg)$wI\9,6-,FPߡ) 0< l/U^&uh"9 k<0a{J !uı8hֱlc@r73xe|1 hSzu7Zv3\5Wn{C6GG?f?{]P(`D4}R}Lj=ݭwLokdN +S_)xf^!A/o^WQO1/3?Uv1:T:֣wRk'׏pCm,qMM凓 gBb(sJ85TA=&8mpVa^A>afr_*+qq?kyL!pG僕m0iP5kiVԠvR4ky[jR!XݖKj%ϵvUkzuHa\cv6 &[6؝t$jMdS>0_+i;6pZVk٠EjԬvWjܥE!UB^т!vW;ԧFq}pptm[x7r 2Hk~~:FaZ>|ZlxZFy,5%#0RC>t.ׂkU3rGRUc*."=ͻ_{ Yǣzi?vpoAz׎Q65\"2کj !G^<;iuYcCd(- ʫTUGT5MQ"ܨ2Cy|CYBCit$P8;f;bN b.gżmiV}avim&u梿],?@uP8oUөJga3PL79g88;v(Td*[iќ? 'ZŽe96h/$~u&r<$JǗZMUpm(uJ\dSkЕc.pg,,3Ֆ܄AS$k3m8j x=6kGl5~`g4Z>@ur +" + h7dEeE妨t jL66&4I1jk$Dicl{㼊˿9}B˓3+))F-hu"5gi`nM~:4:w5k})lgO3۳LcE8{w}w}hs^N{JhNiZw3MQK ^52,I!ʆ&Y,欐g9H4)3JJpL2uL3q1:z8zrd(7tFd2Ddhx]a+~;ay s̵Z 7cȖ8c4ڙhE9gisF8m +wPө2 u)ԹSC($,+_Sp Y?%+d=4fCa[9ғX$'B)ȤHWF*8 sMTkRJr*@W]+nCE/˧--s=p=0\)哳v*Ey6 {4Xú,B+| p4/dg=O>%vgfn|ffy-4Ħc Ȓ Fnj] w%Nm=HK]Rᆭ¡QÅ_ReSˡR&5Y0; +q4=mjj] +zgN {69'qk0b06ͼao}b<\<]M C6݇^`a#y&ɍ_f%P"ZGKGa[yi +&iD ~tB<ˏ!y# `GYG1zrd`GK3 f KgB~"a4Ġ gfuz%:.ӓn&n]:عn 9;)goژQa1}l~(x{*1Lvqw{ӣ};q_CF&LgZ'*ҧ*чT7qOQ] 6]eüK~zE_;_up/AUW Ȥ*X_hh0R-E|ܚ ZFJ"WؠprWXG7n Wv &NP'?GoO;`5@(c>xZǼtPJ"~+_M[6BBк@?Jϲu.:?@AMQPf šK0RYsقw%ˈ_ɖ;غt +{Z29zw~}ۗ{tE?TDKpf™O|+ݵ?T.^Rk`T6Wx'?RG=:vExr + +0f!mķsTd?S0JaT¨QOmګV:h=Me^k35ӟa^ OR /\baM3/!20r9 `x#ଅQB%GYi#QANn=B=w~H+BNicg&a$g`,Is)Sc=ycomdXZ ovD޿uYO^p0(xa%I8,lr@\ kp*UtΪ*'2E_ou9cv/kyGM`j0iq꽦iy/P)EզTUkO%o*|kTjsg/͝*2wi߇*.2 *JeͿM۸v<?TuT3p.`*jM"U <ȮҠLZE*\U* ޢf9-g9\Kr,ʶ|/ +W!szǴ^ +/WUサ{ӆ+ͻvw&Gwd7MdC6&ImhhB)BbN BA?# 8((2< u?=s~{4©\ږLVM^ѦR9I4hF+NJq~UC4|Rq4@6`Xtn_lu֖bMTjSOzm,\6viOECJkxZx>Q&`}+]U'Uy#U!,Q76q|>6K_җ\L[[I_ W\a F3F_|)ft1*'fjnk-}hk-6ܻD7}~XQD7VUjkUUfOU]ivUö-Z3ck>`_voqho)/#¼ [~x7ڎ{~mdjгBz]f'hzB6O鱯{!GowqqGwj=f^׬-+y}b]Z~y'6. mw~l@Cg׿DlDcG^14Zߵqk8JQ踶]jwZ$owVu&VX*bFYt֙n$6h͢،Qس(5c_3~Vy]/+wF^ǻf^G{`( $3;?;\Ol T9Tyr tRq *p9ʍ*'VvVek=Z>pI}/ihYߴ 킗fa&P_#6jK]EËU̒3YK9I~i򑈖ꆑ䜮KޡI-`Zp㯵p/@NQvv"HȻ)BF8e 4W T4 @dka7$Q8oBʝNZ:9eK;e9XҼPӼlMi0MKoFG!jlyn9o1! ;1'd&)s}< q!69:c:@OI7?k/K7%AԻvv1kFʇb`bxrpsҙgSyj1}y@Wҭok'lQv/6؍T-Egj1o.X s( A(8ʋ= #Ggq,)4J`w5v5x~m6`d1zB8 +z8N9;MqOi:|9xg~yJHut~TxKa>cRJf`\BW5 {v쵰o%{%0.^<oAP8zXnzҳ0c^`m|9yqtU +x^|RLQK螇[pc%{=z?Ӫ箅%!Lk;~N?~;< id8}ջ& ̣0|7B @/dL&6d,6Y!8I DDTP(TT˩VOjTkuhW[պ)GSlx/_f{}Cw6L_Bo:Iw5]kt;B%E:癰Y~>)?SJg?> wNJȪ'թ۽q@/ q8f7`r{3g1-  F5ch 0ǘ8I7໕S{+f.cXK&:Nm}WGmgx)r~daN jSn$5|k;#FFl%{c63OVst}űv戵q3W o XNp4%Y85O㽕Hv"f3u)rb-|-cܜI(;BpG!J>=(W60LxvU{=iөί`"VÙUZmT8U7@ǵ|W1bg:5઻rh?Uh7ϗr׎mRՌHWjnN6!>;s+8UOܨؼY?oƒjyaEhY1&52wg6z.Rmfʂ4=?]S +4Ԛ +N邅MZ]㋺[<G4S4B-Meh(n#_rL}iOЗzpsۉkf=LdyZdO/T,L+2*5QhFevj4W#`V\ަޜ+ԓ_ݹ*uWGuf2k)}v;) ZtתOY[j*V7jUz6o[ES*rWkU>j/Z޿Xl.epԐ(NBQJbA۪\X Y^*_uˍ[hUtX>6b+]es[wU;d|Gfaꓶ['{dE ]'[-Ɵ*"yep5҆6c4XE+uqioko26m4oxe՟0OZ7 g ~ +4QI*RW$Ӛ*wk\v9*x@@X6dŌF^6#mv۾#l}Y-' +[aMZ+Q7̶Vz.JZZz9r+C|ٻUUPrCM PfhL hI +*.t=gMt[3]6 n5w?%Ҿ$)'CaÕZ+5ܮpJւ—i^xkn߃J{Zs{_Wb?4S] {g nue+]*F6P) -+9R"J(!Ҝy.*4?yA8 4AA@Q~98"P+xIs\d6Ҕ5a붩զn;n5ήl^w00||}U2_% 20ElEB ZFwj{%|uU++dwb+S+lҨ2 ss9ɐ;"'uemX1rf&Eg=xW3Y,CM7T +F&*ПUspp-bY8p05$eTd5BW`D$-Y<|@ȡa8ukż !V&Y@+B t;w,,0-F#&&r̒2`okq]|ԤAk-䢥 lWu.h'^$RPS# 21K:3,R41 ,yrZXc~lNMIr;h_sDz6u'jȆ{&.'s4Zw,Amp@;XӸpGlcA]Ǐ]c7Erwax7d>v98fQ5uvT^ɀ; &΁Vf^ZiPlk& h3VVB< A|7hCM.D~@=OUEmiԀkw];|..>G.=/.qb~_ѫ'M OӐڊÓe9uqg=rE0@>{ܜ|r9o@=nr9ȢzK_&ٗ }!;9QqInrw-~BXK -@!Vs 0FH7XX?ffAxAMз)#'D G@%ktėhhr/h;(?(>CGFdP>a?A}D@[}H򮓬h +:װ.^?V_i@U4|fO>68~\Ǐqu.{z[PI:s7@_?θ ;[8bd<.;ˋ~Ǐs(& PM|\F!ScX{R}?~n]Ww +$:Tgr.ĶVtb۵nrlBk~36> +$љ/\-hp +G,Ӱ?kv!mv`۵kqJ7^jMeNpW7tW^wq\!pE8xi1RVy〣J | +RNuRδD;qf5ȵ5r6l9[9N8 +! 424aܣT dSg֨k +))r=?W^u]۸nscYXkIjT {ʽcU Ol>3U2dphV(o" [l5UY~2.hupO|:ljZ|!0dQSU4S7"U9#f+{d,R(2G-TF22)ԩ}J3U鼦>Trxnb FVV4A%;y^ +/%4\;:L٣;&Fs+sLfYcJ VJPSRM3Ue%Ӕk)Ac$p"YyA5p_ +KCf_eM45tD0ORjHRBR5}\Bs5-ԦJ%5hUq͚lyA,GXY#&*kĄ>4 }lgꄿ|9"0"K6dl-#f T%LI(M Vbx'+>"݈?Ϙ<ؘYa<YoD2ڍQ{ Q/OG1Qֈ=b3\I.×LJjROS&%X͊FhuuE}^Q5"D""XY@E++ + +"ZQ FMR[hjNLFMMQ&ĤL8Q;m6f[XN9>w{ҕe)b#Ti$֘وKm&4bNIhӧxonLԀJPvm>oV̔L RZJ(%d2h4SsEF\#6mdDwQ雌]FDczI]ԴOnc$Ӄ4q# A9(uxm?%[&d QBFfd)6#Y1Eeڌ̹FDf1Zc[5ڮ0kB;5պ_!jJg|) +|clC4'B UJž˚n*fdEeOSdvgnKW-K6Jbs)ض\sVќ.$shЄ75~G +Jw2`dKf[bz9_?US#5`Yڭ +iX 5^q)x\^5:朓_uλܿj .72`!|oIsع#Bq +r+Xs$ic6v#Ǒfpn"D<6k??6[ ߂\l 3H"iZ1ڣи; #(pp'Cu"4 MQ(yWh=߅k)qVhGs@HCA#_8*\&.Abȸ8. +¨ ]jd5"S`B(-dc-A8=pՒ +0x39pʥNd`5F2jkѹu\ln^A@דzpFLrn\[Z-bl)Z[ˋ@9:@>Y4bN@Eo /ci`hro$+E=GЮfSlE/Wї-_h9|5_@mRjJ +oWOYYڰ QZGD/؀.k EQq8v=c'=IOm mc믵:W-&pm!&zoo.XY@.BNJ?ðh=powXJ\avG_`Oq17=C |3{E6Z+t-hZ!cӿ!xC+Th_RK$:?EDg x7VGg~@K|z{-JtYz ur]& +<~?Yx?^y_~<;:ŧ'>7 :&W<vQ0u9/A8 y5`ctt >K`jQ}cXѢwP2Wr\\خ25آP;Waq;K=C|.d0#LV`a.lboCVLM6N7OvIYc7tͷ.1]#؏ƾ k9Q.ဣ va@:u^7A6} p=Q;4G1N#O⺘ ,* G:_J/¶[j"-tZn!9Ď'\8M2PR(7*WYu-QƴڦuGVRi+lL&M>^KP99wHp-1,Rt'XX,nh}C(̂2?N 'C| mR=y(- Sqa + Sdo3+fL9E.nQV e/P}Bo`ViJw\tS)E_(HZb784; AAi̥Iq+ˑ#ê̲Re9^斡ܫ~SrMGNإ}/? s\S3%> +[8G}`r4Z>W{dwU9+#dJPFu YJu+Ydg.%:ە֌)fk)ҹG# +>𪫊"+Կ3 !xz͠T6[>8WXMoHV+S.b]6ŸUEnzL!. 5 Q)~J 3 肫 4PZmx/l;D QLSǠpOB 4Sxn|^3b} @ks jgT6YnjҰImHvrx9} >(G>~zx^LSx1B0({\yuTUj?;XJX7ZOg?P/~̤q~qz1(ݘ1|ypS=FpRo b›e2^ Yz1^ xØ!fb:R”ͺD l=-k{͠PsKj x%\,)Tc.O/rG(F{\a(2 x&1j>uځT]B,OxYZ1"8MMcuXBKc5y =N _z,T.L3썱Gs@+)0aN  +XI\09ֳu4rɯ{g* Jrm͢U "93&, rXJB +8%>7"6Gs 3۸w0c{u'IQ;)[J[X4xk*fb 1˾¹![w;)`VMO^fe]wxh^b/|_ft߾~ֺnpt~6Xc ߳A0/(4'AÈWqc,Qzq^Ϊ.۴^Jd|Ck|g\XNCA@H,0St9˺ca>0`瘋uBryR7{|<Ǿs*~ os2{ul\cߠ[Y787%:>揲3ư˳߇[ +6P:'{2>5.o%{d..ip[2`Vl;v+?YP(;* [eM +: al73[r]]v끏~'+˶('t?6Q*qE)ש M2sj}٪sT9}[Uf{i=ZfVu ?^cq*q{H&Vcx\JͷGz*|ST^ +?xivx5ӖZ9Jl;؀쇱ߡScqOs%K:+A9@U KTے>ۯV 5^cb88ʱ_up4~UX2~,E%Iڋ{jlα#fYYv>_[9s)Y#28Z-aicWtπ5Iγ"K#|;g U?ۍ?[kp2#G1F?ȸD]PU +5i')>&q4("qg PDr'Otqi'9J& fF +k\Up.\A"puA<#cVbdbu;*tv}¹1_f<fl2k҈ѬaCveϪSA}B1v(fUW.u&Ԟ3Hβr+{^ܛj}@ٿWw _%}\>x8?繁\7ϪXC]y.u{՞P$?…q +/ZVKq/[KSVqͧ*u$KA'UIsXŞ27\S +%See7V{26+724UƧ: +ElO#GqA=|qΈ\+$P,sCAr ڣఌe*VNV p}5B6?LIOb-h^s=pE2E*dؔ%(F1Ƌk(ste`"" ma4oymyxppuў!OT0)0a$FQHVzx1c Mcq*ǘ:IBX=q[cB O|v!vSKIG?4q7N@q^@ 34H)E TGN3A|@򽙫j솿ExA!anM`-Vw8@ĎQcQD(bi26OBCH I$*Paւt1kuv[w٫Skwukmf۵ǹiNn~vk[ݭwfؙ&o>|`|Pv:yyK!2 "L,KQMTy+sh?>dnL˿9fE=]T;ټ7ٸl9t)t opBp? }#-Pf-q]uY ;Lo.*~8g4~9xB9I~.e6A;ӣX<YO8>WO2gѺgibq +e}TDȇ?WK4410" udzXm?oShۜi +#\[rBʱv`۽1:V`{ (-VM:?Y7ҿI)LB5 +^J'T%uc7@)4w`YhQ^{viP;Vǣ4hG7f) '{*ph6-=2Nlz@-hv6 +{OZaaoIr(l}Y."]:A\q}2A̞ɖl+ڞiصaץm `;Ǝ'M%c{&e#}whXC5EM_ w),_y y1/Ou¿ixW22r,}`!~D9j21PhWRQ)@QjZTm< eD UQUf}BN!9_(f}?<[5$n(4?C\YT!6l!U4mPb1.cZv8gesqPk2";'tum8&[DYdC"t|׀?!O59 r,SyGβZ9#*-M%!Y+VRqM2gTޥʯxYFyJƲkz.FNz Znx@(w娴^鐭R֪YeTY(7B'or|)˩;WqJW*f4Q~flZ}?OV2UTPS~MPy5Q ` Cy-Cb,FNPi3kZ;\ZM 2'@ h>jx{;ϊkd +d dA! p0Cףˆ0&s1֝'|Ob{ Idbw1M\A-f<YqE<iIIbp0ލH Ar^4MDG2KG"Ѐެ#v'FF {/psļ VaZh.1|񶳩DqUc|h 8!ۘby8DiWV8r]Jq ,1Ui'h4.|3&zXFz؏!}7/ 9A>I8ư?ںhMm .=;,/CCH4b1H,$q%y)~$"ɤ7`b蟣 CuM1c} «})KxIR$XF>LSXQb1FyqX96f2F= CCxc-g}m7\]MW?I;qۉ\'!HJ +)6\` ZXml-viٴ1RvN h?mզMHo* ="<'1ϡ % ^gťMЦ.vXs&sG.rE]8 ="!Cl-ve]:ܞJ9ī VŻ3N@`Ʌc~Ǐ ÙlE{ctz겛F${)|0gr쥭GZhV%Ԃ ҥ~cs-Vzupbt l~EY5DMl.ρ ͩm."1;WS?ǹ(>cAj?vse5]YMzUkB@-q8D.XXSq|[3vZK!6&99̋"`VM[O`qk:wQqn7׸sX2xYJ0 '3q{gs?or?'M]w ~bd ,Rq 'GPBEI6JN^!ofenz%|^RY'jĻ׈bJ +4PRb . +Up-ЯizdyZ>'w?_hl`W]=û4ʯhu3OIUQWH؛$ r5aq_' oum;.{/wug|3_cc4c?~Q=GiM4h :~Z|C|D~W84$ςgɸEo'Sholϳѿ{ ˳(0MAϼD@>'959̯s_)"yFBvt)3|sT-p8ҳɲ}.v_*=sیQp+A٬F&8i1211N4%&GSSv:s3JQSbnEL&Q%I8 j9?Ïqnڅ7*+dq;4"@5OuF8TOmpL>8sM5NmAA.c'uK+\d۹PFQZ\P̯6{Rρg8`ώ=7' Jlϖ/PИ~s.LtE?Wj$C.W33apQ*5{Ŋ=Avll:&8}+6a.ɞ<555V5A](ra8bpᨀʬ^v[dj>*(Ut\yG#ш-\URRZ[`ƾ V)7'Fᩀ{ ̇c1]WIQͦjb0jo|'kp]XoYZgI'w6pv ڸ[9<: . LxWx)_3MZyM#T^!ӧiP(?VAVu++KU󹖕J))Z$aJ.qS\yRLa)k#xZH +80&MxSTԷer3y2B}w@:W콠y+{9W?v2$jIDK撰敐|LZZkmSܶ>qHN~ɶ8iqZnHl#;[ +؂tꔄsEBN4 şo[2,wffV>GrZheXgD˚4;eܔĿv#Q#@5(%X^__3r +; +'|7+`GE2imb*"$3JEК14EB1c7B喊C ܒGoB%Y\YfIEL1-Mgˢ ء˘n mG"FJP7뎬DG^M)s!< g|g%Ts C4@-gpTXUUUR5QƫFT#`j}B%z%Jw>}$ye)v{w%(UFuJEBX Aj-*Ԋt\GEm; aDe2Bޗ3{>bdEQφOC|njIVú8@p ȇT0Ei qƸxnit,18('mͰ> ~|>q5f5ll^ 3x ^A=Cl8l5cNi46@PO-Xp.I#~:} 9We&KLyroǎ8ug|KWrcb]OHrOĒPYkFW?]^2XqQZ!% [~,{Ơ/ѝ_Z6çSB팛 ߵd{.ψ Jwaݩ}EMDœOaW3- ҶxSD't#RRPĭ7O n+*F)j-$j1[omD8oQUqCC[^G9| VFU{V?pxWC*`e#ےсb~p̜_AMyAvmtjx*" +(UTKʡr ձ]u+'$@D!$ $! %vvf 3<೸{ߔi3hg7YG!€! +l/vyfchPIcs2W3ܽx l?`$*CtQ7B3 kK[Z3l } 3L==ztR%\p?';K;޴ 0m3zF@cJ/\5`w;AFjoz7[ < =x0Hb㮙DazNB?gu .a0@ K8e^}-Vq\+N +|9 wʅG; kX4OhӼ]&n{](sY8qEͣfq(OiI")k +KҢ&bxp:˪IїMH\75<:6?tsAB| Kؗǵjz2z]ڕѻG8Kܨiuߔ,qӷD*i-F +:o{nq{opJP{&F[R|֣'ؚ̙t/{#pr][8J!9BR)#EQL[(%9܈ONʿѣO7sTÁkqȡ60_B-lRg(ҁ+M !n]ukO>uᙶ# VKMz{c7o T fE^ǥt.v;CɈ0P8(pݿvR?z_`}~3g^Uϴ75^w?[3p6?>?>$(>?pϰZ z}@Y )T\1ט.j}l*Ri5%IM~pז +W6_ԍI̾4`ik*V4M4$%3pm)]f[ ,fسvehzu鲼)`D,JJb$){& N:4 csg<P`1Rrw631=6^,̣_Θ纪y7G(kqYi\FJ|7Ӟ> O yZCɟ-;+u{#g#xzvU})i%*Y+ɜ*$;uQAEFsQi&%/GεA1B(NYީJV.-7N:~2ؽCە/&?x-f{(-]r8%ȖAYP,R.;%.;NO.5ggqNin;ΎKTP! "r)G@@Hr\ÙH$hp)?ݙ#}}{>{}&=+];_a]@L> K?A*/LA$}.%lݬ!T>Sȋ^y9/^9/Ręd9j˜-v#xm dFXQPP(j3=n~r|e|>q {kS(u!W@P:Ն;4wE|p/>t :!fIM^vωq/ +YOU7&~`  P(rp,oaq^K_m:ld4)c:@Oʊ %e}TB0AU&SLZtݘ[7rWꓹrZxMb2W;7s%1 L``Da6z-zER}MhGG$CfI;EXd#ψ +[%hdn?߮S_oF%Ěb’Bb$t`;ES$]ξAiםa쎩QzkZ2CgTI%%J ƂTOc$&v/:E;g&!l1j.}C+VznCTyH,фHvN`;f܄haO6?\+ב54¢4LSxTǼijP%x-'w#2y2(X.Av QOPmn5?K</=ړL-T%2 8(iu%Nq]S9X+7RЛ/M wۺJ!>CS +ĥ1Yon#R!/քVTQLU( R(\iN/{i#_ђ=:[[;یc]:j?8iqc/uj}ik_;NgjtD*CB$}_ a B$EY\n={7^C*3taݷu=XBw.;},SV ֻ=~iOnl>A[Œ/U{7cX(?'N3HRe7AF<v' 'v\G'kQס};)8:J\*xayr4͟mN=GKpx3c?;ȉs"Hn5iM Cܯֿ]cy N"?p['zYt"iBW] a.oU/)ut^&#W`ahn2>DL O9|x|MG=끇_98~ GgĬD]鲐ؠK>KK.+BaJ1s>~:WrPHX"9۴'3E7  mQ,vCH\$s$NvfgiDkJFLqdDzU)u5{kfV{ 8 ǔmWE7X).~zk% +D']ԶYA}+'pXu@t-0E "a̴BK['qNy4Āk_I"KIcjHh$ +Js-J(w+MM\joaZM\K +k3hq'@ߋw_hAF\Mߑ=GʯSܐ9)yfEcOu휢y&kQZSC, [ZDn/mQ] ʤ;NUz'k=T>n$-.V}<Z{?1A Ґ-Eh0fWDSe4uEy4"R̙ +Y2iHv)MuT[SͭA4"?ײmEpҋ{kQ Ivs"0?G5^۞(lJk!76Rfv͝D >}_ +j^P`fAY8f"YjQg+ +%ΆGUvKdyqm,QJ,S)߽^1~ :J'5ꇜMsy,7(mA컦Di(U1c%1k@wwnD_~ $'ٙ#[ޞk=|8t9JX>_tILR!q$AB@ A 5B A4kseN8vmgg;юn[3WS/- +c;Aubcf=賓)[YC7s)U=ė]//{F5.o}xYEyٝi[;f lWv?{/l.vz1ճr3tܹ7JgåUϷ5ri9M/`_|~,xyI|{gW;B$Q%Xj޷K7[)ya)ElDlbk\ÄRɋ>[W=FQ%^%"KQb0{{#?mY:'5X p5N&x*mՄ縘r]L.8iE k0g`MjY;5%ÇșL8gu&[K'ˆNE=CX8p>}Ӽiމueu8iQ̣_aZ[)aKy:쳎oυAG +r#7=(1IӪmPa"3ʕqqiQ:6a1Rؾ- _a[73G=/q/{8s\eIXt\PDY(& pd[.>'u1<0gFR__R3+3eEr E)efr,n$#/D2"Cp6(gyA|+ 7!p A o8A}; X;Hs$@4I)q9!ZD+Jt: ]k+MEJRi +՚()jcxhbѢdS< d_C.2 C2nE,bZWb8p&)2Ld|Gm$ꌁEu QZSg ֪i ꑰf`N٬ "C2!CAF:!\x%/f'Q3 43Z2$Q=_5LWO('ZA;٤j>nvZl\d!CA C.a<%.3X8HMGG u/&yMEM!M4U(S8US0>͂6 y9𐁋 | H_/b- H \r ;r.7Fk&iiMCHQ&i S놢4XNݏkѡ5 r7 [A |dAkPD"CWt'9C01X嶍ӊ&Huk_>Aږjkfڴ( K6 QْTOѫQ +,Y) "C;8A5 &M^p +gBE&A4?R0^֥KuiRe](9J*{T*( ! +A;xG3lƛ\C\%/*nvʃDq*M+g{lI-Hvɺ, xP Pwn5;mUu+'o:R|wLN/Ҵ:iiUUUE^![SȖv,ࣟ7P P (k>+j"uQ{3b'a9m4T^ʬǶWrS ߩdV +2EOU_OMx`]jvjzr}p+'D@%!6rrJ9Í 0@@A仿죍@2iVRE!盝6 EW@TYB]o x4S g^}->-am9y1D^4X۩%Ci)w?4I(1օ*;8 NfWR{Μ P;:uY5OD bWP4Q<xfZ2]!ڐ$^TcgFB|C(iWNkj~ %67P`]`dEGT:S:Y:Ƚ[&Gr@6H.~7ٚ[m溝dDWxϾ7WĴIH4tvgsx˿-ϯSXVU^R_GeW 6NBPezp7lxkߜo"!aZ"̞Jݛ{^xI-ogV= |X|o!EB m +цݣ[VY[|jyQ6l}nTfa;/;\oP8q%/#&HaJC@?'libK౿UĿA]Yv"6OjB䭦_KN\7mWXWq] RGz( %-d;T!a=a  +yр Ҿ^͟^ g'¯w ޴:\CqkFJ(U+v˱Yš\9U2edTBV5mX~~-ޅ#v$0b) , At6z>֟ V[&,- eeg2£,-wޣM"H h @۰CiM#$8f 'm u xs! r,(`fv(G7} H*ut!#R;do#IcW4h|_} _O  3&eua @m2邙X_6/EP ; F}hDj AzB \|I O_sMPff*BTQp/SI\#5g(Irjg;Zo֣']OVφ4@b556 $ LjNzOF)vfڐ$e)T]ԜJ\r1OʘMyġ =6pAc KgL Out%JLy9+< +HBV(sV(-9r<ƫ+{ʧ7T%Gn C{!mC8fC1LVGoWst29WL)* z½5GG Yo`ٛ;כ; q{v !mԻ\S+q!n^`&VQejBr@&@ȩkEzhё?̟w^ v@<6pц+`jgH!❴)rZ\5Mo4;xDQQw.juUkP<@AGr  B prB"$!X֣2Ңɇ̵\r-R%F%q3jb?0wg?dp;l 6`C׀zT_4@@CE,B{qr[,hZ&1_uS·CakC|zw"l |A7 +Ԡ@5& P#eٸKub\eBLp!S gu3ƲM]A)gP1 +5h ?$@q>jΟ  dP@)}GLbZ2 9 ¹ƞ8~\Z47rD\COArZ6Æ +@ U߁g@7@+&0oiҌ<<4F$#HSHƳs^b뤚| *dp=:@%l {@Wq`l4/Ǿ|SܘHJ.e=—dR{ogBVʕZHVA"-/ʭP (69;VwWШ5~d+^lBG"aN{eydWZZ%/RjaZŇk>e`P A3DzaP(<|E; AR$7kMU|])ATI EVPJ-k#4-Z ;[@ TxzB$a%i9YL3YBCaǎ <D+(%sJ "C+Qnhk"BF֗4 4Ppۺ42jQ }~5.'t_Xnby&:YjdtRLnA:zRK'nG6Tr. p]/B|f)Cd}}XMeLA\˿r%uE$ +y@i1P#rT.3rC Y ` 6aC=`ݞG 8D-?7] nE nIZG+?[Lmו\ ci"tw\'X T*mzhpp]ڐx^S{?1kB;O +>{/fVpjTC稒XtQiW&ƮJX2F Ff̥ro`>uzE#aV'N~ 2E'C?^.#íJM/OSHj}?GM)tmjϮtt-6 _SzX{~bGFs{'ml7y)ʿyP,w*(q0Ӏʍo8r,KK#~Eq}:i7I[ lC[A]nMqfK)'w3ܝ˗!_`<Kş?_5ޅ}&(G>nE=b'LۦAaz@tLG4L4& ~=慦.dj!Mh܂][p͒q7_u\[8w2ᖜvX;9|ދ2W8AF3г \~5zLG *zAAA/*7m's"+_Tn_7p>Nf2p24efĿ;}s(dك^.~P%仔W\.%"W䫎M[b!OX b6n6ƿ?}-p5pr!'O<8Nc;z* ,ř'#A tDD>iĒO n?V`k<Ο aL81p 6NܸTN.o9m{#ߚc;-񉞖DaYm .&Q93|nK3x]"m +H C` 6a[ý@ (x3tC0+"^ԇq . {Q;NaYV[x||X)˶~7V{:/w8a+\vm-:ÏAMS._%H?#3a#1+ 8,E!/VxX lކU[tv'n8JY e v[ ?`\>grDnA,yа.By 3?_jC +h&;@E^v[> {H2i1kTb CƬ>ðg3HC? ,",A`! .U@fT%O]R"Wi6)ކ (^_Dݗ?FѬH|_ mlj"2^@`e ,Q4z9Cc]Q[&!hZ$ BҐD,e<ܑ+(p"+@DBg5ӴӴJfs߇n95ehͶD$/ZioqD}J@b>pK-EЬ!ES©悩 +ӯݗKԭ1PÜ; iȘ?l' A0J;Ajf +5S e$h2x2xR<vhquTˤc-7\8@{{/z"ҐF,hz)ۡ" bzdIq(#d"\7V[:֪`׽)y+۴a`Pp78,dA.8azkCdԋ:ǂd=ؔ4&u'4v%71^L1Oem=F(1%ւ#(Hd: +n_ҧ-8ؚ'3+[mEJegA'UWN)o-Sv*ԤAE䤡K蝾B۲ck~;As|pt9vu GŠq!OZ.د>ԩ՜(\(T_<]t0r6 mVWH d?s%-mv?Cw|tu\h`_{TܕQ^v|y</զ{Ku9ݜ"I*[f`ac3cd86;E"K bZJ)>z߹Ox|?;7JoJݼ)ycSM)RϪZi6LQ`fRcTgoⴟEw~ ͒:d#ԊʨEl-vC\ͺ2Ml~KsvĜSenH<ޘZ ҩT!je6 l~?B;O;|L:^l=+ +jh^S}"lKɱCq œ'=tClޙqΪk !jH1{&fp}/ܧvd̼u*ϣ09i!M=۳"%DL RևU5W;QZ*l[.*_;d"P3a^f6u+uq_b,>sד]W\qI*nLm ٢6*euƑ5AM kj:kmGE!KO;%ck z.ٌ|dOXN@^pC~Ypa.E[؁1miҎ2EZ._*"b6Ȧ?F衆E^/zhszl+ǢK3oݏ}B%uD^](vnJ~aQ@Wހ{WoJطzIZ6تP4Etޝ2!]w ޙ 54AwOע\WMަ59+{;y۶ .ߙ/ro.mC;A Xr>Ott,,v0;4=;:{7UV ~nO&}M:4T]A>!3VZi#W"mD/ i#Nf#.y#+RGV' B"C/Oޛy[>ʶp?myFΗɜ-I_=Wmw WOȕQiHǕڸ6湰O=;*8H([}E37oǷ!zxpjs`sP,s> %!eإKj0Y `i+,G3K+a'ch2r7x)YW2d \IGb6]"JL Z! iMHcBJ0Aod&΍<+%Vc#>}1~L2&xV8fb̵a,L,fѱ9pL=<.K \LlVHhLHޥ?"$D/П㦬_gadʁLh0]3[, l/rGkpi8N d9թ6B$!yO 2@t%_@ AlLp#&ϱOsa/֘3 +Y|!-X%fgPa, s[3ZA>v BLd'^V:/`1X`0@O -W2h +AL钃OG=_|^> (g6p/ o! TkՐ"mjf_ +0`=|ث'3e{>ـ?/`k5TjAH[!Upku*PFQCQG +WU`>TQĈד^@@⥨_ѳr@#c0#CHfObl-!n=;"_j$B{C$QpE9 h0Q`\ۃGk@9 ! >D8GNDp:k$gH|}q028Ydoyaky>t<1G 2zNzN~f FG@s#$_7@8sp . 1ؿ/0ho3xIYo|Y.虿61_u0~ g,NgOh9`'fu?vݎ6 ,!ar26ž/XӸ ţ  q_K?Vs_],̇#Ƣcp;яyޝOklng຺@AHp[z@Ԉ_0)/P|;i(c6T8L1QʛFbfx}q2:0m әәә?R,-!i-Įwڽ Ady|N}Uz"3 @D'bԇ1t9ʄQC7}ž)a{¤%q"1i"n">y"'@gl368B vp}->  MQpQ9m +Agvņ8sM!nÎq1I~,RX.uLR:n,, 0Wց3HvyM}Eǜ$o:+5ML8D~mlVb9Vڈ#<"O ÅUFaiqDZN)0 x{[ L ڵ +mmk(]+C=" xm*%F*Wz]\kSR5^4( ť!Y e 8ΟANG(:mˊ;7;2Y1T +$ +q\2YXMV +jr|Et(K}J9_)+hR`:(7HK- 3HYxWd*(96-jOo}9?Vޫ n%zajfUPThB^]hU1+$r1,ѧʥ+rB +k Pbʯ_W[ssuNy~AxGia)z _."*1_*UvSݩ峻*nS.` }*Sll (Cf(rX~pKQSkgmk[w]]& +]Đ*e'$ :t C5)SKuiijSjl Yr7Yr?tl^\l8wf >(>:X'pKRKR6>+ԣ jjb:!P$& *.)@36Aom/kX>o<`1ݾoký[r|ՍHU$.6ŋh "VD+ҪR-LW,.Vu]Ln:>4/1e pu[rumfconuٲ;7ðHJ__SᔅUᗪamRdESFTхh˭ JWѯE7;!ƻ!כc@#(7g=lk}o t4W*ŏWg[}w+MFKBnCnrzp>3#%F #u#jg6 ʝEbgv`DW>VP)Oo(KGIbTKoPP_ +Nӄ2!?@vѪQq&йJňGU"6&4آހ=*:>U"7ѸRuR73k&` } beTuqC}F,:QHgG ; fv(Y!Ģa3 .}ws N%PIȶ>C0{^bx.KI d/8tBXx$ֆ#&b  dE@S +Fܥor4tP݄T 7=A)Yߍ aZ`*A -CJR! XK.w x!~`iH`LWB2leb0J[ Ȱ 1VJ /`")wL26=15,r .BzhƄ@WDS&XوQ@J~JrҨ&%. +p2pR yS2\jDO^BXJTO5` 5`Sթ{@䗪W ҙ9O(z&U]ꠠ:h[=bfiLӐ#&Nẽz>|HC#HN_i"f0{L+<FyP.[ !Auǭ(Bi% MH{4! &4i)0";$N3٨|خ3r i-̤_Lg}o}-1ft(G1ӡr涩G,-kv4m`7 Ɔ!/)$eP*0AXeѐ`Rp,Bx2,\m$m8iCv4lu? ΢\@\|ABuQ+%1PFFq:V>&ѬENWOJJN;_ /P.Svvk u/Z C%LCM9Ce/˯TB(5oa'ռ +qdJ2k6 im%*)wYޥ>UT{S\ڡ(m38 V|ovT^ k_ry0z/f7rjc{ L֊vEبX ߴ+kumojlګnX7]|WM~_}5g\&0.Bbl]:Y!SQ#;3m2MzYg-=yK=S}O9\xgjoZ6Y[j^?upc0CѩӢm"$%o5n,1ff`̂8"%D!u8Y,u[=N-|DƼLo}@xQGxqu 0JK n[!iLߧaΕ<_]><3u0NP\fod16^ױnEu:Y7cẌ́ꄅ̪ʄEj`44Dmփ);ta>]kb]hvxQe10c&iX6-V[m&TsZr5y^U<4Sqg!P6´:W +)^v܁y#0?;:NLj0kĜZb1 +:_E_&=䫒 +Di\9B4[]i=خ shC_ˊ?/;UsL== +LJg$gPiٕdv*Y T˄ +rrS()iAaL8e6_DCWcHdY۴`nɡuf^U4>iG(2OH jv)!Rsb1XR\:P(/Qa^ꔈ:-Sg + H~zH6Ԇ(إM~ґuҝ4V} += +[4b8&*V%4Q~:[KʳJ9^/gߑgeY )M{TȡM4P gM(ީ8\e~^g5Uoe0|i__egEs"4F*J8<ɐ3 +:SLc(RY] +*AYc1!gLJ2e?*\ Gam-PIgͯsM4osWG Q1W@гidmcFQ3F7\L6^j] TG9cӔ 9%)$TZP"SC- IhB?!NJ54!Yy((+ցh0ގ^S6[:lu0Y]2ѨobM0`Pui} TçJR{aq=Ю4[Towçzw ͻO ,lB&Bj y(E0@-d~? +4MAbDW࡝ gܩQ7/\h$x} +sG.IOtm $eWջ`*PKt9#uk {5+PUh^hgO#\|f=}fxhh'lۼ$Ym;a /Cf>F:}vHp}u S)~o?Pݚ·zv2?vFv_{ +^#;D@=;h@䓞Zg#4gFa#ʑs3gS>+֎+g8{ _ot ~TxZhߤ\|u9mU3rkmuCI +ł[0p> &>qhnm@8ANfC(w0*{x0= !>YHw35 TcixV'C=-ܼ! nwx +0gsVtwXWl!HHVH; P#K{:lźXJkUzjjE(T(twȃ\@G4cq?p]N܃?R^rST( 57Z R'QLak[:hp^ Og\\pu"WtW+X-&IҨk6iB&`"C$.ttr%eû2^\xq# s8..npAυ(GC0A8!`O t$\Me e`ـEs(D&Ⱥe<m |#Azoxa 5r!|&/G@ڙ9[kX`*ɺk#,}!D"l$?D$bZ!tR0M8D>"Mmm3hRHmpCy"b])^2j̰I>rJC'.'y?GM?z)z'̊^gſg܍F&#<+SDYBVH;#>3ɂAx:4vZ:ko-Vcᨡ҇1eҙe4T_F4FRc(LDPY1%K(%c"[auˆ1=q8jGx s\ދ=O7?-)qZq-i:JfӅt1^io<7S]'"ҤܑKin@L?N,U4vIܗqGdeWߕ7a@~'a΋fd#Ylj⛔w6$vꗤN.խ۪nXN}qfHՁȵC>w2Tk:*f:P.xZ Gӫ,HIȼIњۭؒw=eO#yWR]Nλ(MiջΌcGF H$I42FW~Xx!b>̡oMꄐ;ʚ.ecEe{yՎ%g2N^}2WݙR},{`HܑҽĞ&HAܒE0ABZ-@u4u"޵2͚TᵕY]E9gs+JNfYy"x抯sT9Vq$Bš[_彨؛?\];5A6̩ +[anڃ7xer-ұ%.Z6#Ly~VgIhaum5 +v|YpvO݅ݵEn/Z4XhzSPƢ5\[Ɇz(0Xj-4XΛjfVV߶1 lh]nI?Wu8\Y\jzꎒ[궕RrnSɕ u65z`Uk@&P )(֟UK|_s8p׺dp{;ړ'[ҥGW*Z^]q}ٮֲ-eW66kh*{V?4꽍=C,32YN0Dj0h>&k&)JVEQ='-R.%EzNyf^|//߬Ҭ)$MvUL%HhCX2bB}bt]8̮p51[rRHTmr}wDτ۹˶s_MMJ1rr \yXLVuܯ#m6[\ؿuJԵ;zmkm|xGrJmY:WXUXϫTꪳy-znVe=qs˳sd(h e)_~< u­ΥW]9g~@Q"vLLQ<[̭kuiڤ5IO+76 I49L|yHy]hִGtл[Z#qBklL(OȯI/e j˄u kbW8'JH(% +U$Dž`础FX%OPaUvI uc!wQ1OC{;v8!VДmLg-kyYYyTո0Z4.䔏ǖJdi%%0Qx­Tҫ ?aHWn?ܳz ⎘hޡ-܄}Ȧ҈}E͗ac=E5őUa,P+4S:2 +f2ulܛN׃®EƮjFkk%h.η 8|{?&, T 3 pAݤܑݏiP3+%P,~l6f7:ڵCBs"|Gx{?n |t6hff#<ͮd`d7 ;8K1hg4(ґb(rl4^M:ZM:LxLxNFLu6Uj=Vʩ+i$&w3'srſ)@ּ3FJi3⦭ §m+l]Vx}*x.+>pti^_9}}`O$. @0@@'9JW5oJoa,cY묽ʿ\bEm0m<[K\fZ` ֊_%F2K2t"G/6)MM@%(TU FͅkPWI5GKc[dJ3K`ПH3:& n(&M>qs?2+@2`sW_A*eס7.X +QSZd d2ZYOtu1HG9ښD Ա&MU<@2X{ISQoH!Ⱥ#(8|;-F%UQC55RsIqt^JH94ܤ&DE$IIK9v!;,GAPb!dl*(U5PUM-D5E4R!CMmTUʀ $Ay&hZfKuA <  L` QODL4h"ژhxFE&0!Mߙ#9!d 92Քњ@7DdZ ^M 4M9fhШk %DnK-ЬO1noYBYhy_+d)$;訣&ZѵЊl}d2B?Q]L$\BSN_7lfs33cٴflH.S%n)NW!%J?~ޟxޏ lR:`VX7 0Gp8ڃk{}ܜݜlN< , +j%cP<9]bv`;#Ob~uǫty?<02pF V J3pZXq +_D+ ۀ[$\.9_ݎaz\g/n|!t1<14N1"d <ȦK@P` THaxd10G"r/S-Ϟ{I 䋄 qgn#aoxIT ] [!$eff:y=gL/$OҤw{J5y̧Nz{׈_kCO=_y>&?ʽ5k>&F@&ja56J`x;"> <3'PR_6P_<yF;Fyr8:Q1Ꝑi4p&@56)/[ˍ ~$l<4fMeǒ_d0$Ahm཰aûn =菈A"GЧCkDe;'5?1D\R~ԇu_vn+Fu'lhߝH&=;ȂQ W"~gtF\fE__Eœba~><;<ĞcB 6XL2ӃtE қʴ5t^6$!z" +g $ +2.0)鍩bg5αvzbXgb{XX'dwpp:fvkX!Ɔ6Ѓԥ ]MvbވoL?@Iӕ4Ť GpSpS=={8{(2ww<#q7kM%} @X1Y:39tޫ*{TH\r+M<">OeMByN^%';(=359eR=#S)N64ŋ!y1:0ӞR~yg%c*ӫ{S<+#%fPd vm~]zM$8(.5 E5㢪镩4MT 5҆X8.B E:m+1FW,Eլպ^wbqĖ(lĨlaSzcZ!ΗKJ bqH|LV(Od*J6S%EUwU@(6 @yL!勐5 + {槫ydk˾Xj[!=/%ZV*E3PEZR̗T)s%JR.U$0lɈLT6S1ׇyj/@ *uȍȥf܂s'wWPKjU 4W&UdK2UQ%vgH{E;b`NƦa$u6d]G-?hh#n+ZvlwFm+jjPP.M(۔[*̋)ۙS~\,&g 2 wQA^}nfkvP *EM1*5EQPJ!PDѲ F˅5 r}n77}Ss ͹SֵXk ~aMV 澽Q9 +plZЏ>T[-q,QpZˋ?sִsMٳ˴kWٱ"5x)ז$i]}mR͖ :&[ +.PD5?ɇ;y'b5ʒM+Kӣ}xZVFIΜ R^\}ARɡyI%?Iŭ +_M5? vYs-}zpg3}jb:-5g|U'gV'L:9|ƴIJ k˿WQ4- *Z֛5H؃o㊺-> A13)_K[kϋUJ9\)lRdjmzbBMVZlͼI15cjE]w"%l}Rd]Kbë"?L,ժO{pz@m@%"!&t{S7~u^ε̆}j}l`+S#̎_ް)* 2jy0ՖtcY࿻. 2)/ eo3rG&&YM:{F EȻqưtl{KB6 ~P!SSo#Am PD=8] PVG3@]W6X} +? CgHFg(RZ -Ұ"%\КkilWh|;>PywV)_\S^t:PmC=sX@Kȿ5tz8lr7&[<>ەe~Ջ}ze^ rwS䚾o}ԣP+>)>т V F3HEFGS_[YͰxtl`8 K +'zTW` 's .sFXE&-8G3xg/ kȿ3 czG +qcq(`)C%K^cqdc<N8[NEXe7OYp 6uOO'\;@D D0xq8NȲ!߁R'tu~(4 D;k̴?pXv k `B@HX?/a#]F:q icvQ@^yU%8p&cP$e ߝB% yZgd9S3:ei!֛8Gsu %rsg{~6qpiMWY%0PD Ejgzsc&]5XI /|K=nx-61c׷DkURQRe7K 33!ӱ߇L>=Fy F BiI_Rr@Jo[AҶ?CW!~z6' DUgӴ4{d\ n"7FƍqӑÌۑQ'À1]0>phZ>P|FjO-~dnk/ _px!S,1naafAV9qUOd#{%N&rZ6a9InuD8sj=N)BS&zö#JDo~^0 }\^|fp#s˥ Κp:逞U.OHF[ek0 ++TbՂ +!(ؤ-,愅+AosF Yȵoa'g0c=lqtgOVDSIYUr5<ŘT*J6HZ!>$mۤQq*} H'H_$eK^%/w]h.R]w |kW)ϑK-Y-SBh}X3K5 +~R'3RrE^"ϑ;!Y~En[fK3dJ2dϰ dg kEN&@r;8Wo, Y|܆Jܔ +6'K'1Zڨ8TTtU&MUFҫ+ROdW3 E^[wnfp%/t`l{=haWq꣇b71+rE"ZneTH:AjjB۫ku2ZFS*O*3u^]׬ȹ +ؑs/*s8зN Y',t*ѨO1dņ"#f7&T^dxM?`9XX dtw= +sT . Z#>=LsyYܶ’ݖCDs^+"IRf)YDSg1p]megkN4)Y2Ɛ{j:>-UGCٛ>5Q6f3kJ>EVJ%Y|qQT%8fKy)-w^gOqbGbA1UȻP~//Gzw.]Jvti`rPCMBR5jQ\Mz2&?ZS%vckGy;\R|"╀l)$9h&̾h=(F`O{zm>9L=FڤL`Fp۸$FkP(rk.ZOjmŴݦ>jz$ԼMpf/N0ԂܳrК~^ oxaaV*6`/'A>&'{SH^З+'DFGDEzF=ݐujӕn$s9+jp֧fԏԗړ]g?%4 78绂/l?^ŕt8D(!wN2э#U-~qVpEJK.%85Za9 m1美[ztok#n>7hky:zg@[hv #O>OȘ)A:a#;?&vF(]ȮHmأr{: U='۸'AOzdn qm_@kyu Wl2C!SnBcX=Iu+bXj7*t߄l%/%d B=G_m>$n  / ra4"&J-Q I"W,FH } 5CMg2$! rRJHmBGxx/_ZB%T F P B7$ }* fS yˆL+h!^k$$GB\ Elω{ ]AS9o)} _Q[DAS@T@|!$/` _ ]"P&ġ8EQ!f d™R!H b $+$$] >1GΈ"Ǣ>_ 9Q/1%:4r ~VTJ(PQ&= Ň,`ZFfB#[)t'_%} O Bxtr rr0+``W7[C70Lk|PK+/y.꠼rQ,M> +e;-wCAC``J8*FPEjNQ TQ-Pd]z\4xI&UOvoݶZ声FEgX~xw'Wn 67l0  R礈 jD&`?{>Ac>[0b3S]GR݃i_تث1yNs٬nuvhGF A`QFѬrbXX$g1YGRcs^LN,S{\o-6ވ_η9akfSR Gx  T!tZ!FrB'NUgrNbUߚz R93˥-ߧ\Hp>mG@Csi'Ϧ7Lg=ZcIE~=oToK(QQj~Vbe: +#es]\sSFYŌ73B2ߵ͚c; T_e .:6gOxMNh9O'ѻܙAE ry|x5γajs8,CCAt^.ob~{q4^ /q,X_MނC1 *{W a3wC!F$B7Ώq=Rq}Lnv~@'ήsVΉfؓ:6 e^6 XPZ](Ui STzwX73DUrh%Y|$:;5/K$+$II56I|rD<*KV,J5N/I',0bsq\ͅsh!#[k2$"(}|kwyILt}qxυL`7Ρz?ԇ Ԝ(: y^RG- &-хmnf穖!#~>ÑapG=G[Ʊqڸ˭w^Xrz7vk3VNWebg1@y/Rqƍh@}?XI}hM}`no{aI[ ᥎O4qx/c}Gm|@#+>2H)?<@U ;!|&4cs -zN/^l]l?ƗaK6/Y:mE4瘡 \͛w$_Uc@@zW`c1ߠ +])+S n1v1Z=C5 2|6Il\\_YGG.~E+xQ6CG&Acֲ%F:kjRo%YoN6Giz:$LW#Jm Z@;@}FF̾ .)ΟQ@Y7 VV^Aẗ Yk3ɳM 2  0 a!("(-RW]WOZVlݫ.Jz<'9'뾟'9Dt:Xb' +XNG]yh@vb~W}eBԸۄD`ڟ2!D .L 4 3#{D!/(3KQoh>1_?EI`)Rq@j@1mٍZAQ7~ +}D;u8 <;l+E9Ը\- H1QsTutie (; +zTvQv]Fwz~h~#ZV~= +ჾt.s9@|}`,cDv 8{mCt.>o>ioy7|} 0W4Jb3>`j]` h<hA)Y5aod~6KIh`vovV|1xT 'b<`b!Q">Xek;'!X2\$ӨbVZgnbivm;1sSka}~{xAnځp80oNB..cbAn.|+x0qN5 470Ɨ'7p`mGܱwY`.?z?H6~1T^sw* n4nlK!Ao9 /Y/>`q,B|_|a\D#KO1WނaEUy&L-\c\ocHŐf zBzR|>l]Sa-Z +GC3;.\. !E8!u ^L{-cvx{{St'2KK7"Q~L?"1>$.![EkE!<σc$ԌݗP?vo& ;v%yH<ݒ-͉>M _>G=&Dbך@tޫ73uɯWcE<'3CiIN*9$Oݕ\#¿%y6`!`9Iy Qy4pB`^wAN D2܃TB 7E\Υ䛓nyAQ2թcO5=?hs̐MimH[&lmZ>mduZdUyImoW" $+RAR +aU:ܿAA(wk\ó~o!s )496EȴnkAJ&:`CFvIّUZutzC +jQUG/QZ.RA‰1>sx6yxΟ3No8Rf +7i&k*0%MdI&OZ3yFLuflyf|Y +̵E*3Zds\ysee[6 QpB +,:K7|^栳ԇshX 3]LMJ;IR5%'ziN|QV2<"kiRyV]RYVSRfoRhlMoRIbb&Ɇz {>S}us +;ތPAcibSmr\tUBMtE~^|ٔ(.L-]:3wC]SsI-ȹy4A٠@AUr ߃E٧c[@H[>ٷȚl_Iۼ0B*+wXQdNzpŬ iɴtmQzvJ_ӮU淨U.Ӡ(, ozETVE +*; H;(PAqDPhTPp#h .@M&qIJ$*ʢXj~< Ϲw{ҾM֣^f4]9á~dܡ>Dsfnh-)Y`mS]цIY4+3{AxT+fKN(HI$'e$'dθq/!>c0^)%.GUr#_^XTjt I/NU=ofvwvO6{kVmv7ç +=*kzԋר۷Q'^C٫AcaE3&Zmx4Ru$.pSHzr`B嬺 }}=|돺Է9uoG-NNAp~ 82 AG4? 2-.u$ o@b}N%j^F\h\i|ff?[|e38+x&ttWP ב[{28 Y6nc"]mn6o@mmjsn홊i̦WN8dh5r2|@> +s'_ @i+!Wv,0;N~ppxʁ )ckʎ-z'f/L^y}~_/_IrX@+cuk4SG)}_Yp!IM.iCoFz phMBGO#YD6H>3&P6M=H/)0r{]'o~FKǡ>yM +‘nD ytA>'.ʾZ{*wOVҺX9!K(0<_bzoL%AtQC (a'GV(EPJDQLB1a*j*8B'P)mUgO=y{9ZVrdQSo1BBՑ*DȤ:"a;jKԐh"Z ]a^kr z6(-GA ,R (TGձ(*T~dCN1C W73(^xIռ`y"C~$(fr44Tr+J?]:bƈOE.]5-NF{W j~Ot}%>˾_b{%7g{/'! G(x0 + P84T裙245 RF4fTL>\KAqwz1 {zw͟C;%vY޿,Q443})KV_e0@ ąŲ)DH $=!@Id kX ȾCAZV7ZZ:ں[vth7~)hJ.3ZB +ȷb,- `Le?}~ތ_ǭ\dhW]ܺȢ5 QkE;e9av9b:d;`M;Ͳ:cs>ʺì׮m ݧ@"b^ ,K>?p̯sm9ͳkO>町V6p_b=GaC^)}I#=ؿ&09zq(Sf` y+1r>)%G\]I+N +y.q3#LCm>ӂ>a3iRI+ذG4aBøhwLtwDtwn@>@DjDT!E8Z_P*CvkAL^G)-V51Yɖ:&NmK%O̞'d)&Ul})A0֔7&{(@k@~s?b1԰6u6[6Dq^e@}yudfjI +O]%NqqV\?(J O%ߋ |ȗXS^p eG׌ J힠kh VĬ14= +$~9ItuP! +RCDbh BQ_X>+(bbK!_ 1S~Q]@xe0m D/bGhhعѢ7tvUiN&6q]>&+ ꚹ~~2&~ū_bbϙw*cLyp)` yo7z"_Hf`ˢ>^cF7C%UvS417ED3ѹpc\ƴ?Z߅3aDT}=<߈v?4doP= aJF=~4"gfac.!:O8DssC8<8} R +"rz&Fgh.zgty"Gd"g}LwI!gq%ikǝm6bhM1Ԯ~}Sveq +IWk{5Ih{jH/v=ݮm74~ N\+B-5^mowU1gnFluIX5הPصйVsC&[*ڲw>`{@ k.wWiN|@02= ث.r^N55iY{h:v*v*6O١vwګrx#Єڶlm^Iw.39*-|=sBX#L4B&]]˹<7 w~|WxsaPMKXJ`vﻀw|ȡ;x ; M|`j ]SwhPwk6!kfAg"^b3%eC|s=tIuXx_m +Vq$ORH?—V>}s+a1M/>u0=!t;Os_W Cշs"^"F,=I //& MTJ~Pݏ } 5>y- +'A$ Yf$-2 +D H +d(S|" |Ffyk El<ƪ eşxm($+32C3g[#_%f S2& It֢x +`/(M+?6eIBb` :fp2=9&23̤*yy>7?a7?LC&EI#kg^F7B1C"c3-?LJ'/bԂi\BrzVӱMs u~ W*.(*h>a2Kx h'j5UX>[ ]-mkʕն}ʃ}vwa*؄2N* ^"x|IJYք@v|j\!&UuOuP#ԇ:AS0Es0K9}I{hw u%2]}c?UVO23$N^ADKZё{o7(@zݞ\IH QIՇe{ 9ܰ(䏍ۓ'R>7U0U.Oޖ%uwYۧ4ǝV1w]m'E¼*E]@F$Bi>e^z+P zK5 3į<]e ,͜WFLz|:GycرRfYr +Zh .p<Ҍ]ك^drwX +59!/^q&/h٘=ݺCJrƄZ3ٺ*gc-t. +[+p;K×9w/98zDnNKl,2Hnfߠ#f= e("XEv +a  H)Ȣd*u.*{֢S霞Nq9F>~znsi)ݧxS<O1;oWyy^Ca)/w?w/cOWN.q1$ׂO +lz㎛^K-̃dNE;I8â,߾\1`w@2 n +zCZ!Mj"^pZ8&gju ud*\CjV(BU^XpRd3^H2Ӕu3fv戃EV2YX(E賛h]!Zu4HHm|dE֗Y?4Y daH(B]5k)ǨX5P ̔nfTX#?ͧUQZ/)䨢t9U9Jq;\lbO0Kg*XS)[RRDD"k=y&瘃{{0x.%d.8#8v$*S AaG2zE^LZ*VǪb]$=.̵^esزYߙ2 -Q}`/<,cnUNJ;xNUa7_K`8i8΍FCH{7@o+h@NGSdƄ][fWOj0`G^HA1hC MฎA;Xóf F q jz͗8wpvB1= fT#Π%PmEClG`sT,/I6ǚ*YF?'44dn{0W/=iF;]" +}5O DQq}q Vȝt$5f˟`l枈wLbgČI\ccQ {F":>1ΰ.!ސ޿5gF&QjעvϠ3oqTp-DK-´g9o)4sSYf.jE:QB̳o8ݖ_O)b{">E=$I-ZC @Y y @RְT+6ؚhhlX(ֶ֪![_e_l#<%6ak g1ޓQ`aͿiH uo8=sCH dt낔wAMڳPOrY4v/Nع3iXgb*cM㝀n6n%*]]`].}v`%زD%l$F `|/[^q~"#jv%1f&{ 6@G}`5-c'|]6\ + +q9š~|\<{Yԟ9qwv Ƭ˜[w"P_c'_6?*+w + MaMHcԡ " +" QDAE(+ .F#ڢ$h YK4cy99s38sw}޻D?[=v!z s l/e@0?p5 畘"|G ߓUo :}1x1~+׶DoDp }&P|  e>шZK^.杊yG=s/G +5Ut>K? yaL 0\JX)u`dLBF֪\TM1 +0](K@l;j8Ko7+>^_x10DB 1 .#%bH+g)^V}^?h.GX # H1"1b0C  1LF ! pU RZeX݄Zn,U=(C&^|"0iïA ƈ1!)sL3B8J02_I?#}ŏ#+=z<t~;<^d&|L΄jj*d*&0Pe<+@7 %˂g>UIe=' UͥB.,ketETIEkh=]Tk~8B47#ni3:s\q1׺勘g<331зpiO[!t]CRA}g8:gRAgMY2k-tbIF9l{-%d*Le%Sn3߆̎8oƨPhn¹m4zR+$) n]!} C9*a5N Cͼ%_HNKHTwI^ vJpZZ0(r<;Zh%[K:0{jD~sQî\3_t//w_.+]-#6ڤE;AcOfON;|Z}hVhmU*0bl&#7ΏlծЩeZ&^; ~tw/.`k=3K]ώ!篹/td_6dV 6,PP>N>`~]Nڀ5g { V?7hʏȌ*&2!s0#k8^ÉNMEKM6`WAkL90P90`z.Љ=\ԢpV1^sc$0PYMh⨪t/BXV[ ))ZZi,duYH=6!lJ/, ~lSfA. +bVaXFr$z Bj5-q~CzO\dEDi+^1,G?{Y4/h>PgDs"G&DLS ORNQ KPMH}@"`{s޻2V=͹\5(1Dq ֭)_/k"{ղqiYIn 2g1; eij%IE wŧׇƥ mP'Ai"0v]>~W;Wߣy|kj=6k +][#[Xek8|NNGJ,+&d-ZU2)kspl&d|\Feeoys'9| +&BXuBKLH[aZ4jx.SS<'kyOҤeM+)9i\3uyץѭRi^mƣ{5)J6R?YO2}}p}YO:L(q,q8z_jw!ah{P Ğ.9{? 00{P?lOM`fX7GxX5e!,ZaR-5RUsM:F!өHz8{v +lf]Ɛu[/HzxHxÅݳ"> o8^fwϕo`]D& pz}7z " ^< yque〛<{r"Ő7[I/7t\Mwi  p?O3k@z~g^3=<C? >j$?/c)F}N?d^{7[w>wP|r<ЈKp{򜗴y0xOaW3<}W3=+߃N+yLE/+k@x^XE2,xr  +6|:e:F*&3dR@62B%}Z/gzЈ%~"zYP`,Y#kd !O'9zVҡoXGFtU1z ]9Oq-i`kNEت!y։?DJI?k0e Fv5hfMs]ɤ#OPH+k ~a/ً ǧ\&M..o7.m#wA}Pk>X[8ҳGCOF =驢c؏pn7qUuAHAF?cpMOaӘk=idғCO=Z~Bvc +2>×8 ?Ϯ}観tBF!dXf N K8:1zV+43q9|PoB!yfbt{4e"OE<\P$݃riZ!Z3+EY%̫qb/Z-ٲMm89)Y %G5D*>uo-\;J P e3?BM"}65N;.E˰hr)8\1]Am]WB/f5`@H@ 0?B$"@,b0,`ldn/cq8I{z6͌L3Mn&mƎדj?~#w9}7g%t5q mS7%ECySwh8$A} .D2?Abc{$&Iny\OhxJ´/Ycl{x}A:~t*&i#zOcWU6}{0_ ׾}CCODwt !Sz] +3Fia;p{]4}B4}\&rY]Y,)oANf<E&[ރ߻|[.eex>G{R;!6k怣΀UI_d$pY2$tJV$A7IH> ? rp23YC@Fe!d> |v?ţ-)sCׅb%+60VÉ5.by@66f3Szv1b1}1#~f0wFWbH}-`oؽ #E1h]FrZf5GOzevd̨l1fXc+8;Xp+alobkcyxt, +2/a^Ղl)h]iR<y󥒠0Gq΃Xrר>~DoSt% *vJhb-ڢt]O&*b)B<ͷpB #𗰞uxwLu4‚5 +(4E*u`_ZCUiʶ$'K9ܡNnS.XRKSK@o({TOtW%}3ug -BT='*3d;rZW!CSڦiNAFziV;&:N}iTcV>gVK*O<9rܷ݅ ;zֳ~h.M1cB[Mvp_U~ՠk׫i.i֚&mN1jjW~+- [[S*48͗2t=Asy?xl3|X2kFdߟa3 @k4Vj*Od긕ZxVN?ge|9ZY-{\liz3Qluž);_&f6* C`b^#yF@q +gyB1_4hDY0ņu6#%BzĶ=]Y͘ݶљODw +_X^/C۰k691"dt@A3Ѩl&f8LrtTAp$LFf9v;2ݑ"=\X 8N'oM~1,;"4} cnއ߆^#tp`;Aq0gR0*\CKE|3SwVe8́\g0q/n20I;_,Oݼu΂Q`OA Z@D|!9D5rLWĤtWUpizTW5%%hkDڇDʱ?{$3~[n{ XA׶PhWG*9tMX[D_; ϗ# $QA[ +IՈ [QhQQQAE)""TD"QQZU]muluU}@h;;3 {~U=k ,Co$ye Os"<̙p7yU'Zy C\DI1ֵT>AƠ*B+]50(gK_8XE {r Ma42 +H- 4ҁ|sQ75ת%7%;r?&7b7`-G)Qͮ7 -CclXxs-<P~^wjw)5@<15 0}I@ +6괌E8!Y$炁 E&"{\8Q;Ucfvy䦓ƒ;#@p On/S9SKe*mȡPŁvu"wh]^8ѱN372d/?zD ?u#ׁ^!FE1\gSg!ǃgz,D/3(^G1_uj ~=L1amOM2h>wI'T!FZt ͢bYE`1bŊNp㾫jn:]TMQ T23`=^#l!~eě xx Ӭ+(vakȷHh#m y BE7XDR#/|E<{;~FCR}.1T?S%2|.Ii6 nAχӿQhDz*Y1d#+d]yV!݊;mT4Zpm7SA7D>saE;Ћ6*Oއk&YsZH2rVL^spJ>*uhEO:h#I61.[x~q^OȚGb2gdd[ q;%8#zAd3` @3 +}g uPf5ĒORHH#g-99-< GQ(!~sˌ6H5P]e]|[,oO=@?+ie18.ġEGI8"K!Y:ZeaulFM),hE$]F=8IDe*DTiO>|o;M)kף! pe&)&XK+nisn\zc=PRu;UP#J^ +۽Da(xnu_)Yj, +u%Z]6jn.צiA9AAvYvvڛvOWi#iԇm +#[8:c:ڳKk*JFXo֍u}c>!GzB,}:*L}c>1]_F_锦orZkuN}眬{zaKHIaycuvq:G=fdf湮1$R\WEa"PLS\6rkţV.Fp%v{@q&~5k9WЮ-.(W>*;,.3tg\W#S{V'=UKY&"c*~nq-q!=

*pH5#N +iD"e=)8~_C ~vd/lVB#T?+A 2*%vʯL;bi>je9!ɥEaIeCK&6N(]P#(o{%901oϔLh#D*WȜwȬZm^mLoMxՓܦ-꙲0'iL€üx"~ mc 1i*YM#2vHm'!-!}@B}׸1sGWy?77&Nݣ_]w홚#UʀUjF|[ ױpWCmZn'-2%@D$D%sHX>yT8_Qc,q626}:Ҹψe/ _vyXs.MkDY9s׋ԁD%ZZӒ"K'n +q,>6qiawqzGqFG1pjs5,11DJ62fzOxc-"*=q=`/]nb5DlĦ..]\Bp@Γ-{(=I弮ɹSd)Eq@$䠈+"J_{X? \s ;?x't'j`5ȱ|].I_C. +ߖ6le?]W7\ӻD&9B qߋ84؈u9<Ӌ\.rr!|** +_K? k'uyKX8qY^pހ?[v7&0AH7qtn1ѷI7uG׈L)9H%=Op>OR[!"_Dab-q|D>>Ž.Ё{]|35 ߴsî>~r>Pfa[x@,h~Q*Spۃ"\y7},`2!P4O,d<| Qa.N7]R!ȯ/_?"},b`"̕3I9#-SI*R7؛{Kٿ)sG>eʾ?n?~bM vOb@YFOSqf,|sG5S@vKqPk-cSmWy29r$D>`t+OP='1"ۗ#qL™INy3GXiƱ{\)krsm%<""Eùm9x{ PrEn 8)ġ,ۣ-Y *mrQ6xn9FNkDt:Ɍp >s ̽9IU|ɸ#b _Ɋ+eu$@HBlFY&,K@Bb @lFHYl 68vܺn6IdI=4kL&vNI]0{sGsϻa8 +y'[p 71'^ټ&7vFȟ{ޅ]A]1 w==kWBQtDuD?=͂;TM^-F \g`y q; YGkÆ& ka%[8H‰@QOx캏P,O;p+ rZpRX \osm p; +kI8͝U2*xc(9_s<呔 ?,5&cً}.,q8ۡɇD-X%Z|]]rx$'qDx^"fSfP\)¯S N$]$ұ C&ة[X7p1! b%)r"IM]J.K1RRiGRZiNڜNhDөS=&D7<t{|9>L҇$m b{;zv+rY3KQ2{g*=g3Kŕt5-nzE5)vfZZg _e 3ŏ}ff~ 0ӷ +csP1>/l\NI,J`^H=,{NKsjƄT|Z1Y;,ec4.[`{]ҟm?k%mV juo/Ensv +-19RS<c,O;"װ~r]'{C]@|>]d_jɽd}?1iPC?Ŀ^Sl`.bz)Kяst8ɢxS-)0 +>Ua@4[Yܩ4t(-mJǪ(rӨ\W\U3?3!:yd\-'<| ylW[Ĺa\`BN],1\ѯ3z59be`{&ZT֬67"zu/V=5qK\C9=n L2V$9H/pG*lu=Jo\\ |:*`R{^r)˪l.U6hK#J\So,i2hz͐R3%(,tm E}+VHxq6`nd YgP5 F1n5H|uS&P^ί,3F5tZ]Fw0Xw$F[)mEJ(J?(Z(!#2c܇#3%d9j=>LJ𽯖uQO֥x4f19Ep(ܠibzk\@JUbr+ˮ H7_ܬ9"ug#:<-1؜HdҍMR_}C^0TST+Tfst%&#79s̳l)|'5)1}yDVYڀW-l{"BއZZ4C];L46 Ԛ.nQ4k8 +KER˱4en2oXVY69Yf6}<$д:VCVrBFv7j` }o$S=bzQgufB6#GbkdٺBŶL J`Z@ZS;~'j{2 Lj&ܼkpYFfۺho FAnB5Fsr־RL?fKEv+~7~'~co3.IݼՆudFz0݂n ޹Fzt2! O$$ )Lw*Rc$:::8'±˞ coxď=ō|;3HzG 7зه#B:bph? @\ rC+Ht){\9T_<.:9` ]tԱ4L%%2[3[Q 24vm2ˢCu=Hzo^<}~Q2W2|KI{DwHԗo$ ່c7C`}ᣅ C%Խ$~ߝcP ;| ]@jޏnz??#:H@9 /ZPRw= c0:BG ._{?Q}@w)FQtDZu#vQ4SЋ +t>N[nJoG~x*\^;E.tp_&i<Ѯu +N!/b\~ <үaPgCyܰ V<׏7A0,l{UuY*A5 /X7poZ1͐hNBg:g-^^STN X>ŕaP3D1+~)G;Y{!hrE}hM@#Cuk zwui,ИFϠڳNolOS&Fc3JF Tr= +udZux ~)s|,YR0g~JenJev~KN䳾3~}7K|bp3xG Əz"WU+E8-P״,$-ݒk>o}BdLys ggˬ5FkŚZiiwHTO<)^zgPƏtz׫1lEE;)PwÒA}O:.t89Y801ccb@## njssNwNs +pl + a+!熰Cvr8=0у~ x r|`?(ZU`+; +%+X Gk_.(+ & jPE4DDa(01UMms4$͢M$M,IkCHN[9p~NZ9ͯ1cv+=eh5#ƚ+*Li i̥iⴭ´}GyͶyͶl)׍P[|MyVA,ko-P,joX7շ>71&gЪlkHEvɑe7f:"3 -̞ȜYGfdaM*jfydMR +u-U@IJk_KP4P_4٧0Ҟ4`^pI~0// Ēk}D>*ikJmf3"%%䜳"d] O3=aK?p&=plbi54G F-pܤj$~ف%sslم {y^joN7HYnLm?cU9191cN5tvH^lV-eKu؄᪬RyU2Χ2?bNPNyZH4GADaIvXn+[lIrF#bcWxP̲㦄K4_1yL +x~D~>a54Vj-Pqbrˮ5 &e̐dg)Yjta3M ΝӝW>aS+6JX'z rt_pIE _dTnHe7N0d4y.J4!9 e >UkcrJ-Cec,֐2'%oFs|sv@\sa'7bW RAIM[˃F7xsݰaڍhW57"Y'IJt(b5ٝs;w7=wggLzѭۼoj=5jUW#y|,-~X,$\7>]v9UR߷Վ&tԸYkaTW!Umt-Qdg;{qTB^RhGZX + +]Mޥh笓歗ֱ^= +5-Sx{*w{S57WA[+4g|{vg6_{Ut{~jnu]AMRvuR]q/ݡꋒ_7x`cSQ><(8Fr}!mcv~n $7%ԻS*!lla25~4q4jWU9C~F68H-A-,;93=Aȴ^Lİ{`=hvnEO&мyN*Aa`Y#xG A8a{MvHw+pM;YІn%A 7nqJHKK')o" c`t2A:źGrgI,q>V/o9Is/4=iiO:/K0!: FWzy>hC;=9^>JY,E/Mp&P&A4tXn G31^9C&'?Ƌ[;sC@s5;g?0h u]U׽{ /ַڄW۪hZ,\sw}ʓ>}xy !0 +ba(ѩI +D l@g :(nw!n=]'|LA';@Z1h&W +yJ^SգehFc-,FWY 5T/PcNiQ&8}$2*랓hc+ +h.Ztگ8@~z$ :ʍ>'5&`4G9fM" S|\tO~];Y>9uqNby+v}_c|BUx)8ORA Z_E=ZOQYtXHY~=Qdp%vsQyI +r茢NX鄲+X\;^ZJфQ:ͩViVN3kVݥ)[4zƷ}JcX:B*ẏ DHCѠx6zNoE'vhXwJZLfOvl4Mgi"t(,RH"ߠ!/'́8dLb9\h1(q/!wCmtF7vHx&( RI}$5yN["iɜEc35euBi.*mӱ֫eeb-ec̥1[>W-lfVkpc`LUFl_áZu;vǑphDP].sTUv{[_n[c8~EiØBb ++>WB[PX8xpe4Jݴڝ{l^SSAD]Q\PmTT)q'/v⌎9eؽ1E<y^?yU vV}{ S`{/О +-mЦ8ZUB[9Bfv*L.WlSY5FcYE<ϵ)9HHr~/n,:e=A:<`m!0h;k:yT/j=TIc*=\>Y,4QhIVvݽ2{$Z>,uq_gw(/ԴN8JsT+<۰'2|3 ANDqm쉢ܓɘzx"W﵋tq]eDiƻ-H~?"ԝ0͊r)pL:n7.W17H`*smP |MNlS +79pMnL}fg߹;zX+ePq0 "g/ܭpكDf\ Db +œ&2BҞP!*eԡjNR034l]":ŏܤQ{)LlX \I2?ƒNrhwXBN Ru0mp9)un'C$ /x vFE}^q7 3,`QXe ʨ@W" AM FlR66m6ƚZIr1q9>;}{oqE'dYg}y?עhZ#ew +$#JERdZ*`2}|S>:#eqL9I' r6y < r keHKM8% +)\ +c\ dDR#uxQgIa>lh8(6!ߝl& +o0xlXu ĸx?x+ApJA i_Baf-ر&dmȚnŸ73nbȀE.0P.*cF4J`vّ1պ6 +z5[ hwҔ`G .].6ul<7M}fs>1y( +;[D44;h7zuS  +1""G9QlG]a|Uz>"S7I~0=6Y@:#ˠE`NА!GΑq!Rpu q2z8 I;EQ0CHOa2)t A{09G݃FDnҨ}tܸNoqE2bǾfi|=nQɎo=avfm㴶ͺ>BeH{]wϷ-ia} +>E?hAo0iY7z4zbH4l:3Y2cbf&r}+'j)$Ml5%~JC!f_`= n1~4Y0Xc0*pZW0MLg%a>"hy[Yݭ^?6Ĝ#sw3Wk"?[ )_2c^T>J|akm$5-4.7A>//a?a 1D֟i"0J`T} 1qBVvI)Kۆ}XF|k^$X8fű0&Y)04F^ƎJ9=D,6rluX~4a=VG"Z9v'''pxXqpc<f:je-Hn:Xc;QCռ.}u7UIU.ocGIe-a%y8O* UcXjcRUVҴVm*3 + .㚖YY75n\God5k֛{:(ZnU>EU!K~UW+T_bF-YKw+MŽwg]"AͼB+i+F?o漢NʧU%Ae]GkE-HVq@e<-)V%ZlB[~\qvA/nhvs2tYC\\sMa"u񵁴;6lO{OWIO0h +*?hS88] drC +RaYc +l e>f!-af 15erS҆6žV-!~*]46,`X6ژd jO5>87<ה^`/5 +5dJ iv4-=sr/S1O uyLy>{"Jz}=>jD5|*Ŷ~̞}}?@"B4?1>Ȕmjβ0gzd'y̶xgyEf[R#,#[E$[wX'Z'D&j{~.븾(emytպ աh|_>ЪQT֠0lGG#:1:Ñ5͑X5Q5QX=ޣNx;qmHw9iui6ZTA VBQ-/7ڬ'+͎}Ƙk7ψl339f1>b&.)z\11K}GGWnw C][.ށ\>/^ڞ@jT +n1,ɈRzREY&xMO7wl\R;K?<3 7H;RE,*dQ`XCP +AYq%**(`eܠZ"S9k[w˨ڱ3gTghmi3p{~3} I |j%NLᝐءxROS㜚8t @\g͖"2ijO,CebzK^z*'M`Hզ|R "]B`7,3<kr@;:&: M;qNmTJtj"tF Ir ;g4~N{fĬޒ=XrCYY#]'dqKLLH$edx'tcuzc.hc\mlFD_i<1gDmT&܀Rh4daB4X<1$'Fs"b5./=4^7MĘrMѦRmJ3T5Ԩ0m {}x?e8^ӖM/eD&勘m/1I*//U$G[<# rF6T ;XD;oH"@"O-qe/3xqxqrrjZv!^=W-3..l9P%5" ") w _*BJ+35o6ȣ`y4q5qֱDҍۆE`"/e^\d,~/m&Qpa{6x>!i&Dcylf=0G .V[+J݌x^d74=NYC5h*f {I{F ife+yPr=Ev=CA6ٓv{жُ]w +4ֱRS7n&zfm"jJP=r2 _@;CKM:dr?1)qW.X)RAͅo ho2..йk%Q0aaLnL3OF\}ġx <Ϣ/_zrv=t?9t>@#+f +K<%)&~5̒ǻvV5: ʵ\Mg||l''r!w v\\NsunIHB@nJ-v6UueĺJ6mZM6iNl|;Gw<9aǙq?m߻lIDkzYk}Y5ӂS +N*XVyq\ǒ؉cb M1La^ǜt `JSLH!{qO!K +58MI}N$plS%`1 [Z1̤!naS#L[DY]Ø5l`]D D8?N` =ekE\-y9Gˌxf$2Ոd:tc:ˋCY~Lfwb"rb8HγA8*r^`wП?BolYz_ [E>OmY$YءlV+T~T!VXF(jhQzH.> O ŋB)St[*zS=WtK^ +]rnX({>WvQ[y2FLb#B"&bU s2dP+{̓.2h^QU*[VӏU-%Uޝ ]AIUIW= y0)O+0VK"baZڕ!kڨ궶u+aYzBk=/z/]r_[]OmྍH)JbgK|F*0d߆~{&Eݦ;[l7kvf^m=m6״ڪk+$9+?O$G*K,#Nz5'hc<'Stt"XS許vVjn6;[uMΠٯw;Gu)}3w:q^v~MWx_km:]٪duPqТy snAw*7 eJo}vJ z׺:]IW$ik2:T:鬮7{ڿk˪?ӕ9'_!z=mF1ND=Dt*<|͛ݎo<^kUhjGWylpRgBo,vyV%umMIoĝ ?nYktɺ7}|r܎ڥҰH + +QG^ԄhrNdGa[(ң0DHހ~gErHFr,Ls["_~&܍Тi-Xb0L:QZl")PbEc4i?eC("Cq\iKob.uE(PNkRL}HAI8 L1r(,6q^8/R/3óI&=4} xd\" "1N0uH= `W&Eh3A`O  Zɜ&$"/4 4sGL8=~|(1{x{a>7cޏvQ}"kbkre 6ScMfoC]BV8vnr>2 %Òyb=65W&q+_%sqq#$fxuN[Z^!+yɹ\ tT7,B2ed$dM2!@$@E@6AieX"XA?0Qp/N|a&rR|z'oeyyȥctSM'fzX-cSa9?c+HH>>H:.wpuu 4dAr??F` `2(EUh҆6씿e/?A)usJC(֟H8wo^q;,xٯy; /љ$Inn1 8ߎ.B]Ъ+-D^D߽2{{xdW /8>| nαF|2 K?NUq?N~~&z|\sC4=_#m\p%ÕWvvYC#IF>*q*60N##d#TyoqGi<W +\YG zNG;Cw,~rq\DO5pWsVýS_8>T>a#A-#Y6ӧdbW<)*xji3Z鄧_c .$ r71_*8]p)@䔑Q<&=2x\Lץv+FDjHe=X<[λ>|Y:*P2ɢEH*']1-Ai .-Ylj٦y`Z"3M 5=*5Rm:&UAoTӧR|{#Y f7p5^gg+ɂ2α*b}bKsh-rV%3.YjJMxTRTR^WJBn+U3sJO-wON~4JZ#)2J2+.Nv)3KfRmQ̍Ts1/TW(eCÚW5M^mm^w:$& DoV( q&$8ؔjKʒj=r4muڦu[Ee:.ײMHN.3ߺ0³tkF?+r _A}Af$PJ6+][fsJm.V*[ekOuslKN[>ӶYk5-iHMMzMMI$|Oz7lw :88tf5K-Z6Z< RRESi j#W(2:* َ, \ñ`w6m~O'_U֔6!!k< + zyқE@+@-,8MR.ٱ˙ul}, HsV؝ )Ύdg!ѹʐܠd=ePc3[zk0y ;gϐ%+e94z0gHRwNЌ\U#rwMb$O$xb$(q&Ɠj#= MEe}gQE]aYDDFVHpv\A0PD״QcDMt14wu5%q4vlTin?kN{3 5"xd"k@2\9<ۭ7`ZેXgK2Q5x@c5;HP4rh.HKޮ +:ޙW +IWsZb-3dTN,ⷣr^ySQR3NQ2~JɕS +v.RP*7) o復n9*qM{2f{p5kM*9Y$JcT}JdrV{zWhuwTF)*C)%J W*F%5]_KλR ;wB> y4HdDddᲯ᢭ba0j|VgUJDc©E7[\} .Wb N{ +ўV+XӀ\Ȣ=׈mRiib5qК(n#f @՟"0$^-k8@ +~J)^ &$ḵ0242m3|K$C.VjYkPRVr:gԣe#"$\/ZJt=H:)ށ og`x<VG~Ə5= P Eܶkк?ۛ^MZJk8oT $,d+.uSRx`7:8l[HVrс/uJbvJz} 5 Jg\8 /efeRrUc? I>8oϩKsi#9 U`_` +#?-#,JGbwR A'NC|.*h2HkEv8C2 L N?o ",}r^.."wHIpNe;\c3=|qi&~߂}p1K>K\W&׹ kwC"@x\ߣ%CEBD_@)T7f¹ {FL|RED>ׇ>}ԅWs}6.:F7QѺ(+Q/U[>Ï ~|"B~~i>{~޷@'8?>ߪ1'x r9&y/~_EoC^l)AxN6гqp~mp\TOb g0<#ᙠz%ku9PG0j5AjrCƽ|뻩.an,b9\o4x5 KOqfsWНfkUh'tzs ܏pEn +"D3KᙈSᘁ};󴖺?Vӧmj*i3x*%Sg>?{CbM69M\k*SN +kSFFLf:> +١އ8 (V +լ-ʎ+uoJYTdUy*/|rç)'bʎR%_R,J,V9ͶWefDSbYM`fjCXφxVN~WZV/ES,gYQV &{heY'(:EDbԘJ)֬j͌YcVjz CSG5;%D_6$D1$ Cl3Ŭ>_onQ0e TF\lCG*m8 7et}(BnrMm#mJ۔Ph-,R@PBk (B(yȔL M(l,{Bs?53֧%M[©1g~f:%?O2\HdE)!R:X*Sc˜,e Ԙڍ68\+2UjLc-rMslR-ӸZj/jioƔUcw)ɧ > N]d{m7T#e Rs͉Rl1),Yj%O˳C-2:(Ri-stdyBK5oђ/hIjb - FOӊ4YLBL@-p#߇gRh"6kYS\YͱZ,knʰV[STl=ٺX7XWi j|56-%&S%:mf> ϣ9H!+R Y0 5`$1T$[/_ɵ [dْ-MͰekihتdK7&k YZET U/د ?*yHjxO -8Kt$PI> +"[AH.qVI1I=R b{dS%jRUc jQ/T"+dp&XOТ?KX5 8;\dpM ;sԂlJ+HR`IxG:2$a(G(! wLA2@B+ڥF|+{S+oKHO@=LYRrOXk@%({#=Hd'5"ᵺC{뎒A%m"vՅr!\ZDXDIi-mkV9; >7m-2݁T _Tâ0Ca=9Ap + ާnI\r<UnYcEnh/L5%b7coC xz8apX<8OQSx +s/|O<{4vb&^y ~`_ׯ7ax#R Fh:>#_Ы9.2EɕWz4`B-hTAu\EA|˕ : +* +K< }$rNNX:xD[@[]G\EK\E|," ɧ1~Ï ~fxN24'w@5Pc$(-߄k[:KLc>i3b# Fb-:wbE= Fn +ձ ؃7s*up-:݁Kovћ;~8 GlBD)+N?c uYc8zw5Y'+BѴS6: :0FGo>H_X,a#"8F1v=&rt4LrYDW.f_qYg5'HbHO6Q/euz7 r(#0311p rȱ +Fu5nS][n鱶vm?zMH4Mvlz2O}SO3mpXwkYZҜQE~]y-:c,/},Oc_B#‰)xR"|x{<5䃣Ȼ 1iOj(_jHnU1x8/{H%d<$#oq3Gc;fc34Ɨ;J] LlV{bԚ4"_Ҵʛt\IU>lp?#Ք(o6f6PU\FcTښ (  Ķa;j8lBkF^[Fn9UX"1f*p̙GLFs~,'Kal䭚$`Y:x|_k5UodK2TQnp: T38[MySsĔ5YF|VҊUjoRUk?S92 ɻ@+h + WJ+"UJP,۪Bwņ2rܻfa#=mlsVR\WuKIUBXw%>2O}2|{x+j|Ɏ4!K Ѳ4$*k6UixKX-J);XxU".)LuߔQSv}pϿfU^o 쇯4אZ4e6=|JnU?Y m*P\~>E(uTF+ub&R_}.5q?^no{H~2+JQm)*S 4 +``x.[fЁkG-"P'\${]NKÝ?&)!d/AW +P?AUpFǼ QI쟤Oc}w > +lb-K膟%Hwt02࢛OT141h4r < =۝&àmൊK9W o5b ~BC,p} i Ce!3vsx|O=fV3i>TO.:ɒ x {n6L;h3DX` v},d"/%8L=9L"qcه%Q:sE̎QN +[\SŐ+kG(K| +1q=]݀yC'#ipH~B?dOˇ6wc?Yؾ xc۫ƑK)9~?Ci چz;>9z4F"ӱ|"XaM.c'~Gc;~l?BadO6CވD,) ֡4)-ODJnbء,w)je?6XO~4~a 7#@[ +pRXN> ;P NV7>ӱ=]Y+?G>`קSt.u#WN _8|Ueb`d)'QwhY}b +v%"ٝeT5#zG>D_а9tg,qZ#i}b@qe\E`U:X! +oyT%DgNvh?mҏhݖ@;tZf9˩/ ^kë`mchVCꌚjZ$j5G y )tQ솻ke5UZUZTe,e8!奿!=Gଁ8ȿ;Q7;h?| dՐ,r +TcWRN[*PinJrg8wl+UIydTv~UY7QH{Y\2Vc2A3_>!WA ,Pea Tj+SFvPdk5l=tCm@Vre6*ӶKd.846ݔ9/LjFl7`f11@Ԋ|J{ re/VqI9*tT)`une;)1OoXԒJ)yRIP|R EX% iua^x\tԎQ#m 9QY9^AE*4)ҢKcwS^e|Rbq| _Z q;FrB;-Rpt SBdB`5uY,h]`/KC<pwT|5乂=Ĝ˩;W"8ڦN>/4gN!V.>T}|l-FP#&2b@.G[ ^ap|bVgG Ar!v>} I>@`Vgt/x""5s5.!ĜHG|}bǷ{\}\`XNK1zy̍s;@.0z^U5.ƅ: c׼шe7~jgq .hσi@*9y?`n\&9PoRKaY.;ܳ2FL;8;jqXHYӷ^75HO^g]c_?J 6 AE?a~ZSt jST8sXӴ؂B^eCz6+ =%}ɋ^Եo||>9:ghO#>R>d;x?Nu?.qH_/и)l/ל):S4=x[5'`jF8Ē O!>;߰ќÏlYg؂NI/t_ [c|EJzW^܆ ^5FW48ZM˕bqXCK61bb&x86{w~]`e))XGavggAwc3hYR'c7~ďLw0@&mrlb[x7zpF6~=b7}]q%c-/dbGUحgЎ.p?#tT/VQR^?+ {1#"#9H~>0x Gu؝{XxrZ%tA'좫;N#>8d嵜^rJNfa?ʻ1 د#N[3 Oc̶i YoNu1}ܾ1͸_ +]ϱp$a=l2_d-ܶ-G3oyPfT_G?#E.L3 +xl8I'$JUKQ%ʧx֏! M7ykw"v/[Ffg=YGMjI Qqp5Z 4*RW BM%RQTPbzT>εCHlB#jiN@|!YT\q0%N\YƃR&z9φHN' +x>=Gq"%j[ D@~4:\[?A{H"5=iM LV y$h&yTdJojSiƛzmڦ̠:*Wy]\ hqoA`(A1{>MCL ֔2Z%(wX&e0@3)| gn˼\iJ1)ɼ_Ǖ[9B*>s p_,n5` <%YO}A-Ej1 2nPs9x&36PaJTj]c,u(Q\1-rtX%K#߫q{^aW>1^m!l/I^JA(9= @*;)1)BcSө1 ٝy9')9]Ut6+¹XÝ= +snVHn Kਃ\ PN88Dz䎏<=@E16F JhcIMjkڔmdB6hgҦNFљdj\N<>pT#A13&d=O)0IFKM/zcǫaaaf>ΐlTcu#'-c%p"^yfszH2WKKN#\E=ìnE#?j> m= я2QluG>xu~Rk+)'y1V%%G.3[vm v V+Xd[7A S  v1. +^bNa=o Kڅ0{4Z/C@=x MMtS'D,w;jxA-"`!fƌ.1VPfAq h=#187t)CWi9\u}?51H] TH;\ G+ف۹@HфOyTE!2VcvImLvPPbt;Fۨ,h)-Փg/14P<IkʹlTވ*8G!Q$, "{81t?&4(A^mM]!I+8c;1go2q*k*<{*ƕe0r=&U1>h7!x p_+4)H)~x}޶k.7!uP8WcSVE8c&(D,!>J%WB]Y,,q?.rPoS3o/Nʅ;cNOkRhipZRs @ze#%Q> ʹ\6W W Va BgA B)e} zc#CObũ |m,΀S"}Kŗ)EO\e;*(1>dX?>aǏQe-9~%gU~u*1pT._gpYb}G.c>5~Ǐǯ5%~J>NӸl/4I + ^c|gS`_d|jmvG} دj(_F9L:i%>) /JD.KKFo oC__@~ ̀iPn/bÝ5E ^a5HF$PMi vFݾi0 LzBI9],jPQlcZ? :UOq.N:GXmgj4ي//iwgGCn b8Z -th3?xV%mkWzV\b6o1@Z5v\B):G̅rbvskv<bnm$6kPr(wm˝1@$ .~fT?Cb9_,sP.3G4![b:tfc .ahO'#S.XzgXCs^LIu;r6{}O}r:wae6VZgQ-_?7odx+3w`&Ynzc:(i:sD ; e_@NXS#67(6'qU|]؞ዧyL:xh= w0sMjWS Lޣ!hʙ?<WMM5I:o y^ec7| F@a[\}o +=v]@'%u߫eK</4p''8?׿DC;m'mϯۙQIJP4%Yz\ '%.#me1˽]i6> ^%x-q/^p˼:x =0tu=#q>9,Gq$Gһ Si*НhA1_ˏMd=Ow2Wj)ݶ<,.pe=*Vue{%ghIŭ1|XGv٭dwhf)_-׳m Z޸Ndn%{)ˬ}xw.Nz2Md(r'ĵ8Dkq*wՕrd?=.>׍.3,&[nIߚ6.m vxy $t2B!]EvUC 9Xgshpflb Du^i_+'  Bȇ+#*uq9RWNn1vٍ8|Y{qw_ IֺzFU2TM8(&X%OϢ +z,nqd K!sU| Rܒ@ʟ Lgl/|=xY\Jan3y-ƵgE;ϵhJl&Q3wYj;Y6س:uB@LrC;ťU/ew3},uePxԨjF%u|%N8zr&,ӻ%+\BEk sGUk2r\b|ZW"15Uzh*WESd}6EoAѶ*b~my3}/\686epD%Z|quExLUUM1K3*HW+2 +ţPnٻq>Ū\X`Զymzg5>79C*gDTᛀoRLIuLi9FQ򘐳u+DK*6'x]8Ν8uGU_a$dwIvͽwwsV·5a!O;٘goWo$h2Kh_CFQLqeIYRhiTLk%L{ŚqT,b(T-k#~J ˊ +|dJ5]k-9JTVZ%ɵvXl+dmmѶW2G%rR Y$5sZ  `0wg45 B +KAI^8Rg|Cɳ{%^!6GXM_2Hc:+ a 9 9luEp1P S(%wInQ؜buISYr19Òl6Iu!)NE'ñw y !<:sوa8zśc m>2HVYlpK%+)J%?`9Uv7 AN$*e8t%?}jXJJe<+Tg3f5G"V ` 6><]K7蠰o릌?>r15 Ľ(8]W7ܤKά,0 3tU;`y! @]䖬ƮAz=PGxx憳s;K~L5TиhbavZ*C83ʇu4uģ#,M,5,*5a0:T2Aȿ ]nd- +Ssp3 p0S"4:vhPXQNse׬g2gQad$!#|އ]m^ >tq"xf1"65 + jiPiɵdXyс/:uptpghaQlj~QMИAE~3թaA8={;Ϭצ$yASNpĤ> C2g2)tuĢ9:U5.nZ<(5"l]ߏ豄e,З/#C%1SE8+E>l5x>Hܡr&0<# +=Nƈ4aQ~bލ (=b)(ʯ6z8k"gތn;gpbÜ6PE1Њ'ODs3A݄/6bⱎ>vl3ܻ:A>Ow6U3F}۪NxMLv؝$cx<2JNl%/|&95|\fyWƹASmp7@|r8;@lG8POB>AG<&?vr+F-YSC{6-CVJ- /JPO($qWg%Xtm:|25fI x]U]~KEjrOcUx!G~'+ϲ[ !6)8OǓ O~&:? .i*h`;aݣU ik M%d e=2ܣńlE‡5ȍ95RFx i#p QZj|m<9ܠ xKrޖ6%[kW;($ɼjda\( rWRdD=^#E݌+8O{ڋ"Bk|HL߬+ɩѩ L蟎L8r(@~ ː 3+!" o&K:h}Iz"3XOh_ۯ6:6S+h&&q$.<8ʑUG=5+pT!*+HO+%Ul|0;9:6c.݉y%&Qr#JߨVj/p 7]3Zu^2C}(TB+tT( v6REBq?4, +gduatX\qD$ \1#MѪScVciS5.uZS[MҴq[5uS퓏yf?sy{Ϲi >kpЃFVxى bf`FvQ)vm4ߪ j:pxxeOJ[ڃ3hZ4(3i7DJ2!^"Rk] .$ӧQm'i>[qpXX\ݰ`Y2@HM,gNƈ8Ab5?6h(cDntݘ.6[ ]$D'V@ 2CsĤ{p xd*KY@@F`|A +h_bA4ϣ#~n9DjX$Ȝ),3ɯ@|ޏQd`n _{dc?a0d@cgnK(!b 2KPP-~D1YRג!>Nb_JY8ug(w|M&O~6v  R@">6r + 55GC|?$A#[mNۓDgdz٩(;&N:6< +#9+1/"~>1` Xt;%$(6)W~bâ#4TAA;(jL@᳝![2ߓX4qPC$ HK:q< +:⨾Xn9Dsc;Αѝ$?İd$KXN,)Z'X[_8z񒘭sM5Duȉn{_JYob=>48yM><+93C<9hb̘M"IP:_Lg?c:?sВL8$rH&yng$ qpyP3#C'Tshnrpݜ 77{H+ a'/"|;isyX>a 3޸\$ -:EgKg3ijH4/e1[eq&8&]!M$Lfɼd4 C\;ςxfjJv#R+g#[5z +=Cy%\0ۓ3 ]{κ@Yhky8V0ehg{2]ݵKQV@>џ=H#&@pOL6z1"{R9&bqcUڴ>3WvLD6yS) ødJٓR>󣡸bnB곀!Ap="N&G馐OlkٯqkfniFH3|T3c!Nl'hQƢe7yxh\Hj ݐ$fsNT{WT1K4USp ]ž#<6vZBqi`kyΙpNap{(2Vf15|Mʀ(CuH` "m@b_RKٓň^>GF'ۜOX髸y(ps+;(,m@c}|=V#:Dd8ڞNд8*]@RC5(Aqy'f9DO?N=JDl]$RS%v]i=I;CrbփR?,J^h=XVa9 NZ\'\|[\A=]~j<3}~A֐0{xD#:&и+9%iZz2Z۴mסc]>x=sd~ ISK 6tӣnj7aeS=;_sΫ|i _YoK._Uj 7}_fع={Cg<'?/_Sq^~ۛsk#+ƾr- ֑v$ż|{> $(@"%`dt()~3?SjG+=^S,FeJw&kWJȲYU 1|٭ُ8WS}P (.( 5-%ӽ#˕O{0?rD #455B"Qh(,0J4<"W镯JJ*T2d؈ƌ8Ͻ,\ڛ,[r5B$Kh0*\Ϝx Ɨ\W]oo޼u6ܽ{1Oug]+SƳW}ɰʫ;F-s;&|U;eG}T3~EC 94АCC 94АúGrؐܯW|gWQ=C*+]~Slb߸}v?vʗ[=Wis&䰉o}eWT^:2lũφ?qQ{w:趺'^د4㨝=gztN;A;HDa $,aMT6u\lk @ le kH$@ bلgpIny+k_V+?m0 VM0-o`L)E`Է:7T4vPk=Ӫcd (@2\Xc\jl;׃Z?0v:ZKkۭY(Ϙmh[_f.tH澣訾QlnU/C!85h rԺgz +e [Aɯ3tufy7ޘ MG$ eѹE]Wmv|Sk$ۥ;5 1\aꜛo -EF}o"' +1<,-ǡ)Wxѩ=ޭ[ր +B@WCYI7Jcx͛7j[0 [&Pm0y.{FXCm` VM֠1!"ej7ifƗ9=ѧ,b3G_% ْcjD8 p`y9۹A?ZbhrBׯx/Ι1{rY!P şkK"*kEvٽ^Ah@D״zÊE9k)&qqtRej*[`P<},fjϗ*T3~Yzh.7~0$IT,y:m2وKrKS4)ktA0A-j/q{͚x)m[γxڧnYU7†RJR=x>)mO yZP`Z̈́-.%C-FߎnuE(;'lyzDm1E,~22Yn@,`8qPSiW+ɳΗ[ L&$LG?6Đzh¾ab2e<Ƌݽv:Fkf_:G[/~PPNOMC6bB dPǏz :͝%|76\!6>ñܒvIvD02V&J'kRhk4>b48a.# +:UΜZb]0,X 1 lĐ-h~Gޥb1aXb;eS?I+Ssquq͎-݁,7?+ +Id1Đg5]U^34.iFGWڦPv{K8[ M6zbOnR9!1*~*Ǘfگ^g;X +ǬICg<=_[q 6<[ܛH"<ݐU^81֧{/Cu7/̙FŖOӢa\;=2N*GfsAѝ@ }˕Mim`DKc*/_K'c"A[|;S܋+!{}(GwMs(:>!_HDS*]Lfs&SAIG,S=DV$gmp9XS]vxeǽo://da<:svf,((JoRB I&CE&H ЂD MRB(BJ" |3gū=hQMiy &hǯ躇/#iח L8N|AHŏ05vԧ=2S}9r9%2P>gfI쿢21i,:8c{}M|mŭlA];m]ӌ +;pH*TePPPAݚNN:WmWI&>Vh_% ?|-}<%+Sr`s>2X8v|PY%`-{KsĀ9;d dP Gwni8ؿᨊ״P65 Ա&3m h&$@qw`}!IIR ]U !H#eA YNƿ aMGDOO.W>VRE"Wƙ_'m_ _ _ _ φmp10 +@Y56IM bOEGǔ=J ` +7Y1~~02đQ*ɹO p[_'6 #&b#YyVc}a8.'pYi!EIՃ}ݡ:BJfo{6in8{ڧE=[1l>|쀒4?13*Gr#u2=fgxgwsڥ X% B +b {ZHJ,$J}B[kG8ϷYnVx[󝨞;%C_Vɐ Bb(1ԅG.l…>- s_zrʄ9Pȫ_Ra %%njE'F ` J۟ J;!1i*Vh3-4aɳbTMhͭQ^W.t1soENMX[CJbVKt'>l|RJeù, =Yܰ0sԏJg JgC EY(PݷVy|Y1'1\Ɔ ='m%ڼ&r Σ#ZO+= d r>Y} 6b((Poл0+Lh8.Y4H--ka495lj\i5^~>/Afg1[zD @/Wݳ\Y䠑+c׾tHӤUR3BV~7l~lRo[^MFt]ctPDviLA ~ϫމ4U75ri}geofx RcǔJKCĹ1^xWꀳc=dmbBEv!SzfECgq 9e& rov  WȱŭALً#.cC}h3:'Ty\r;OKFԜHER<`uJm: l=! r{e'gʉg.Y2);}9Z:6Xap\۾K>{#Km[¦c?HUU^L7McUJܒ_[pY yn,h:}ԽFE9ͣHӖ1)|իK-_9ܶxu"u VsD'/|+\8e)%:(kD) ԉHCv`etJ\4 -bA ;`;`}1 %۷Ȇ{AA! +Ղᔞ7w+C8z֪QQZnh(PDM D CF !@ B F$`,D=ǧ΅^svt?=&b2|:d䊺- +2ɧ +wm]Rt ! \,~M; q0KMLlXgCu1{nT=ܬ \fS ;Sb4WҲ_u-@ԍ26As t1zo cqQ]!wux'L@Dv"YAdW"_d-^K.fᨥ8f,˙ ʧ-+J4}4|4|41d#tĐqHȏC5-H_z@Y $EdgHPztj*qp}FAgÝ6 y>; Ce? Tl,~bh‹xSBjddIxpnnߚF/Asw]= !1d"|u%(XFRK\λ,3d*1?A8~6x 꽸=վJA3&߷up[e + ke=VJ0"sd;F=Q4I$GҊH1'} M@` ",@U c +'_ fg=4נ5(+B!b(A \PeY{r _&?+NFpG e񝢤Ik\9..1%2jGLDhZ7CbU EjTϯ՘c +_ +\jSfC+2}؎DImR@uuFs{Dr{1MG(> UVk1fo)BQ>+-vżv +QHaȉ<#T~#FӺj?@ mUbel{DOPrq%z{uA4'q0#sY<~>H` &!1wS{j%wM&/ۭܞw:৻]S: 4rv.#7Š 6C9oF-zg fؐq$Ɉ3E0[Ȫ4yD A05pݏ&کo{vJRYޓǦ8MBǸ#vĵ-4u-W7EZSdti@ ~@9G&(@ E+`Ugvjv%f+j*)";M@|=7 P9{yzja mn[Pϗ&˘h%MEX8[OBpbx,lJN{[ӻ76>$8ϱ3NX;U[*"#@M=$@@! !%aHHpDQGiժHeQos{\[ZAkO5:z٠kg`x) L"5;;څ(5hUw܅U/?a5gIiBxUW~ƃC[kn +=Z'plX/\c0v+_G;pж?$ttKEE>Qe`*mmw;@@ֈp -@ ۃ-:YE],ܐ<>q[T:fS ؒv$}X {]g0pƶszp -Y X<>)(m!Ukd\Sm(5|7{p  bR3F^GЊVkv2FP-b$e!RQL\#P? / $Đ?CaC j~^ťd+XRëKYp~bx7fyHluƴX儏lPm#b o4Đ !P\ C1OXKN^!dQqEDV05//ºPqtQ;$W6 #Đ5dhAY;Be(Ƽ'EWri R =)Zu0;.ĒRPB?'ڨ*S E1"~6,u߷Y庺/lJ|ք%VTOӈ-T8-[ܝT$JfJ;q\i+ cDʆ uA`[gg6v%q |W5Ɉo$wud򯷤8鍲dƵ :z (1"b͝ Fc&8o?qBDUq艝r +;{."ɪWdd"[O (GUhFCZ-N5[vry70P2%M1͢ڵQz.i4%u#;5HjR dPOmگE6 ^p4M`S9f Qra֍<USXը )e*b}ni jOPv+}6&/NO]]N 2D,oGe$^*IF!LVN]-lPY\15ӻ{U␵[Wf<2qP9 91W̤ #G,W+&qlWlP_CVM:;?kreyq#(shz8VՓKx99\6̖19aee[7  +b`j| :;: ;lJYۏe]f^>1F05⁅-|6g]q< iR*j2 c2&3rS,@-j=!=X󏎯4.L/t0sT ē8ԜoZ,26$w63=O#lv5t%wծY6`K1`!A`.h?/@b!,<6NQ GUB{2bhx9BehW6lD'&p, ;X:=8ق-xۀrV⦪:ԋa +lژ[4@kW؏CϦpL,mล[YX8[w%/}Jh͐vpDkCU)2O@Zb$M8Z`YSI\'-a.bEs)z:K} UwmHW6dևb !l|f$C"WDZ-,b؛yoA0~{{!T+7Іܣ{nuΦ@ a3$&KB k.p6x)s|otuOѷc#%wBGJ 4͵l244"ou`DG-&ffљٜҙ ӉӉ]oOcxUO*9Ro ?t4hLtR8GmQ<,n6@.pl*+~ռ.MՍE+oG(.D D o eYgx[RGmT7-JHaH97xF \qB4ID4-{Q ؛UlXeU+kb?;v;w!"r:UJyM<˦2ư+ՒߒDєΖ -])W|%n^p] +`~ylPfxG_>#ޗޔP& +qrNhM|WzW.N^OkmDy(EX4Xiv( Vu^ӵo1IǜY5|/+tt!MK)b>_ +`) 4#mJPcSTCHQT E]94i;᜼Pْ%7g2O9?\-nR))'tבZymti 8YPl`jP.iLgQhg0jT2&!ߩM(*W,b[-'xd^_$+8+c::.*j`(zH.i/4yThDvOMjUk9AnbJ~L) +hW+NJ\o ,eCFiȏPos^l{`OgObﴣIq^NW k.f +X4#xQLr`&'ѡ +(&Bs˝L^ x8<ᏺNiaNN8mxmVlʊj;DŽ=cqߌ+5dC_TRʆMϣo]mTʸkEI729=ބB^_|Q}oT;Yљm !h!7fmạ-3VƂ.C}A;[/*՜SnK%uGeF )mm knDC̗ xߠFyUmm{8N.z^ fy ܆Q1=!էzk.todV4N +DhJጢ.*o\l`} !qQV}K^9z|JڙZ/'CCR;XJYL~ F]k+I(\BDV +p'6o_K 21n){AҜ>ƥ[,>=ё,jjnNkɧ]h%EQ$#2Y X+IV|1qx`o֍S E 2\9#g<똃!׼|pehB}c\Q{uo-+^[s_٦M9N8" ~kN}+Yg풾VgcEYIa 㙳3nosqyoSsؿ;{n>[}-_7~Kz/N;Ώ$VUdj#g&F0c-sIvs$۹$Dx0p+bi ҽbοkZUŏ2<(J:4C< 0QW;`dLY ^a_ #VV R)FN" ~AzԴc}-I_a6BfĀ96N0pVP-i7c&y!j)Nxc2!B%5-Ri1vH`TA8Ba7(:@݄msK[)(&acc G#)`B1B"uHu_Q,%9;[@^5{ GLih ]#CLևYd]P:'kX B!< IQ|q !RX:a<CN +*F8vJzPԁ6t4C-u` +K-PDIqIK!|V0܃P5yDQB1mDڛ fP* в@+ 2K!i +OG(w@ [y7M>QʔC:31 h!Rq'Uwi&H!ŝx?*VBXىSOK_gg͚a eO xޣ +24p1Ι f2>0 +30b+ІJR)INYZB4$m݀X!^qTv᤮<(:`]M,VW(']& [|c'2_3~ept%[ ÍPo#A6{6?C#Z"Ӕ rZJU%/w_#\Ziy=$S.&g FՁ+_!p7Ď\=oNݭ|>~1u[[Pәln &z(jI9-)-Kz%DUO󵁨j e.m:NzhRfTq'bhbKic0j2[/JHDIaaXĐxҜif^oo6A.:@zڷ[ͷ, + % OzM†p<72ZkĊRF U^ҟZv]]L.Ek(2\5Fuh ݧv|mgGoC}]s2f)ST.\UA?[$KvK)8 :_lY dõ@7ZCk? +m#vL9sw %t]awGЄv,МܑҘq=üfuD0#rQduj(T5Huu]7wj6Lۚ(+CË)(jAWLc ==EՖh17D üUuVi\5X k-z#=b|/'&flL?nf ̬ -Rn^]j$v`$zaRfGL*j  M@J(V5P VA4?vk |з,F^d˚FERsƃ(кHe8"%D|9N='hL8d 6HWJU %zN_xV.H4Xqwyy֜.^?13p(BcҨGhjFhtF=I1˵]}0IVʵ5 :#/ȽySmقiNվv(sq-6gz,*9 +lUT+br9V\g)jgwe7i@F[db; {ӵs2*o{)G/||y y$-5k9ܢ;^Z ]&| +ߣ)Z6YY>O_>~lq#1!ˮ%$ԧs.c:Hv:#H8 H[I=-2m)gw fp +N1[gwk{wgd N$:YA%`, U+s:)%ŒJ$BBQZS>13f1f u2#X"#"-*=I=.O7]y?>s>?|!(` 02 -UXeVú-?F׽y.pپ=|6vo7ps)2  $C:5f(0Yq ua`6{8:lgv.N.py.E@fk"F{@R4.BCpRgA"BPzaMw!Paw)w[C·Hk :XAV; pۀxt7 0^c LFp࿠Ө71xȗ"' c<[nDi P\l!{rVn{H ZLTPEр@i&bH;~4f2~M RLCߑ&4D! 1W^g+0@H"1L"3,&~D+cD}:/a;E1^1CGoO4bu%0s==2hL&)3|tD1Ww_\w +> +sn]}edtsc Ym +nY ea,8Cɉqb!^)x/Kצ_ģ!l/Ԁ Rp;ixHC@^kL; 8Y$fR'>pɄ&m,#Äb+|UA6kz$w1:OmK+>h4ˌvpA= NԱ=&Eq.>L +Hbs,)AP&Y+DlF.P~PJxuTKԀ1j0E,a!ĭY +Iv@d@/yGwOeHÏn75S{Ǫ<?ѠzTQ9"K9 +Jxr ',WUUW~R:*嬎|Vwi.Gú_5-A v0b5ޖ۳~D{u@{|snu$F!ۜGO c˫%ɢ3I$EMF. k29!:5RsP AhilA`j%Vپp~p~mXPG>ب184aE^|VrV\Hj8VKE@Ҽkf)Ɛml2l5}_e>ְ{`Gvݮ lnDJbS+ <*/_!jSSeԪzAگ\QNr{ Wة +k[A(7Tb2Yl䢯k^>tCl&25d]dqE2.ѱ2#C_kOk;5 ?iX.|PhU6m=҉͍(B]>:&"TN)PrɹH-Ց.4r[cNՒ2:*r}@h6F?^r_G]vnz?{8\JW'(DFȠqaoa%Bӑ6-ZNRZHqԱsJ:ՅtuU.TVy?p>_v%\Tj煮 ;N&)K+M?Yxdo#+:zZU|FuT؂*l#}6C݉ ++ݾZ[ݮzGVV;u + 9U/,CrݵO'ϪJ.I5d*]U_+5ѕ 'oG9]\ 6Q 9TC.|~J;mmjw3LK-I^vbSŞM):<62S ǥgKUwH+Ziz:bBc3ivVW y14i?9;|+ۙ%9‚zmaFMɦԦݪe>HRXܰHx?  +/^x rߡx$T"wHsVcԋ5v/ R D B?xI! CDn\yrA=6B +?񇄃>;?ʣp}* A*P8Bx6kMB!8,I&Ւosq5tT&}oeυ#g `*CD5D[́ I˭xbˁ4M8!Z/EDW(FgÒ!ɍ/1$ToDU/ѠxX  C5͍4A<-@R˱8g\,*Q1,U}UJ Қ>^YC'ݕdϓoRzR?%ޗ5ˆ j"F1җAB!+k"GWE U_ƤO> +Sˎ*W]Fv5[v;S֑T6یه[ޕM`mYH1Y&v5rc~ʒI?&{b֥uGC7}lfCȑsq1cs`f`f3r5UMzPv?=Km{|}{%G3g#6Tde6AxI\셽D-c:W(  vn[ux+hgi=o9!+_0(<1 dOyX6o41# nyW.c(s8$l]6 -,] ݎ/r^aB6GLD>GcH"Ueb89` 'Yi +1Gm_jlZfkǶvUSoAYx1&ez; |NWӑ'%Fs& 9Ic ʹ\=vk=pO&a%RjCέ,b˘Yjz:d9a)D@!s)gLAƁlg +L`Ǫ#f']lnw|}>ȣK& U|t "znJa()5Y9U @#T4̧%@Zm),73lL}aw.ךpdQ!BQ%6!0I2<-6=LIRZT^":,ESF>o06 o1H4|9g +(_.:/:1_^<{'g8b;!|7-`27 '0JaBy{ps73ү.y-4=߅:Jzt[Յ:G +:wN6w'o"|]>\r +[r OR`,k99 +)[V;1sx啥mdt@CPT×&`;$8]?} +r.r3h킿G׺_zh1a>RB/On~ +rs:5+k>|YTW?sD@D@ }C' l,A NDQqߩ˸TCt,V¸pZZwQDE@73xcF{ ny(uqBwB%AT<1tXt8IpHK*NV㰑}8ez :Lw n& ޏ_m #kl +^Y&"@Gb| RO<>y([ca VZ&J.ę];A4 1\;8:dUwO6)#0(D/F\x(Rax 2QM/P&:38{ Z~%}a! f3J7\̲asppMܼ"j0|H?*b/|_wȨnPdїw.>^X Ɇb3Al63lSyps(a?\ܩXo|)QNq3< c>N%F|;${CB3 +:#ɢ$E#U 4$! h0H$u/AjH#Q`OFM5A/ ,? _W)`-"5%tAH^XwƂq Sul'uĀ  짤4pFhӜI$qҧ/lH'R<^;ң|vz$Y1`%QfC"R%՜QRk"8!]L&n'L'Ly c<$ >#dX[8 O'!w$@s#͌KvM +^H;I:M}:6}28 c?O2` F$Sim-y9AŞȈ,<9Wu* l6pəN?șJ?ΙLq| +_s? + '/E`=i +X@H6!G3=pq1!N 'k[cf_YѰhH%?Iފ$/c AtP +)&C6TTT'CB#)E6s\VHFīC⦌AC%-wɅ~ɍ7ҞWWʧAe쓢GY~W>%)ȱ dv_h2hC\&%hG+d ?dTeV(^K6U==?^Q?+镾(푿/1ߕ9sC1y5kJf +dlrU vB$ܨ}(_:WQ\R.Q>ʭ*}hXv[Ew+k;+UsΏʛGNe?ն}(=7j7y T +u^֨6F:}ZnMjpA6JsG)ίYv35zμ3  tGnln6zOVGGƧtQLfm^_9P_ɩȼS_J]-(go1?gE1Nzfˊ`!!Sܦ%sYq'\H:PZCⒺK[utZUeRZyS1Am.k.Ⱦ՜O[ng=g>+ͣnq R++QӡI|ThsH⠳L%#}52l:14Zmcֲr:YaV&+#!+#w^A<'.Ib/#U05WCZc$.vwbϵ4Sk *YM m *),vr ;? E +NoD0UB eX+W|/qKfG8#~}]Qg˸/ԥS+3KsJJ:bK:be{m%M̵`<7C0K `>—.ywóIYx4)p)1#g:|#zbRsy٭%)iuu٭̶ƶְɖІк2^0QT|/[d`W +6iaXQ#4L[ _u68qk߻v8$d02ψLojig4;z:'j:+Z6n2y$n98W;83^+)\?Y}M~ fLgV_!M>~WW$5Mce+'\=|o{GD&|M;=5OU9MX~{1}e)ӿ%|_jֻܾ7`{"\ =Bdm4SfnXQRלbV\{F{/{,G$=NNr['V%uŻ0缾xɋXv"ybVG_\"U"\|#z)\,|k|8)Y+>/\_x s~$Mkۡ@w߯۽g_^~X{`v +s?G"nW降2udrJ|41`nb飻vשO?T|pt3˺#/<=e\н0T%'P(.K 55>kfK`CA[K =QjctVY! >i3}Wn\ i|G%_<P` jF-ӳC#C +[ S79n&܂v Oaqb#26ǀ#,ppzP@tG pG*6yuMk$C4'Z$]$p˚Fd i#SK kr*[=}!( vE$]QBX>S6?G{X!ܖCZml&yB@h[kAD;N'.'?EC|A C%6 ;M Zi.PzDy5B0 xb 3\\Ҍ9'njcFCoaFBcC1_1ac#H4.!WB$OM$&YcE::ܷ}VPxku 6q 4l7_Slex!|<9@|`8@r``FDOPFHa$}&m ' Dj!~$% '_!o"ސ?G AS*=AC` +d?(v4g 큏^ +5Poq1~4vHd%;7uSꢻ(PZc^Q~}I@'.Y+Gѣ1q'oF,f@ -֐$b_aA*/!+zM_D%<,a>a>ֳKma=c=>;&n3[5K :Y(KS Z{S&]fsAf?8 ǯF384惘,ν_1۱;xbx7譼qqxWx= Ӊ '$ AHC%WZc1!7pUW&㹌{(Hʼοz9^+Ux>al~ģS3̗ۢΤcIm!xA]Ym9pM@TKAts}O1v Qvr-xr:)SK#=*M֑W>$;>.;|U֖D(i +Cw^SFfbm +9^2W n0+G{Sۓ44 "!.9͑q\ w_kWWW6˨O3e ?JbM DVs n6.p@]akBafG;&&A~V4{`>A;jg)Ujj}OiA`0EE 2@0srO5k jQ&O|mV]:#tbTѧ4_͍mf閳 v.qF_꙯] ogmӥjʦAǴLA ݐ*SJ5gj |#Cȴ & \4q~r#~$Th[xa6WRLeYBYW.W(e(fF*^K2%,}45%&jl~vʃ7n2?x#ѥm7կAUbTWr%Bqn:]+QUU:JӤKroTsU/ Y]̷9@g[Nh:iᔻG]is7=u(`Q{K}={am"_*dZIPYhUUI :ValWXY;(EJ!$T#U)ǎ aUlbY,Xб8Vڊeul˨ 2θ*` s>_=oAjfqf٭ AX:Fѳf܌VHG\,9u*LPrX}2.8S֗>`Q2rm-ӊ +6'M[1~r/}e?2 Ըw)5̘1ڒR=rE+埏O\{*q)sM[R:MBɒ%rJcKfŖRv}US~x"&XolG!CDN-~W:uoZzC>j5 6D2wSOOK=P>{YE1Yy+/:{fi乺őEgD0?aXF&[^՗fݯuwwͨȝwU6[h]oz>9hqI gTJZQfAx'מmҙeȨ '] \Ct1ԛgЭOe9OԎ`ͬ #:[S!uӂ_&?r/.~=gwp(эsDDgo=0}Oh+kNCr^yg3}4i01**qzL91Mˣ7F5l1\Rmu=,/4 dwPiuDlDf$;|Em"mR +q{2NԦibS;2t5Z͇m~h>T\GKeng`;Owv<#mb=tYgcT-Sףizu +u[-ۻ/[їտF՟'K2x\$CAwX*.U CvDV15ZrD2ļc}\ᢆL T <<. ; t Pw'W\5+WN OT(ha 1r"c \Oxܠvrdq\r1Uvb-Rye:,~!vD(L@fQ0!` +-e'x!'і;.8lXVm`X>nVT2P2e`/Fbd64L )(O 0t,܊+k;Xۀ3 +*\>Pv; L[ CfP9>r.PD(|;V +QEAyPu |9C}yeL.$E:τ3LbB+8̅sp _9}n ҆,~_偈w8SIYvOR5BR#\}6,9b>`w2')9ږ +'S!@| }5+f}Y;m7aعI햊HR{9b9vfj7+#ɶ!vTJ3LD8V-34sgR/4] y>P9yc󾠻y1ew f$쑤iDuiyb*aQx:kz7a=RR\ +Ev-\o^ <>{.ZdCf!#,Fdwf +,=E$A£g^rlSN*ݮU*%RY*ɴH +fMS iKGk kYP/NwA.2x@CsQ xc T/#unkC9Wan1'E;Lj}:T+Y2|Fcreymv%G'?_(4W*|J){'tRSe6TAA1dd/4RkD9%qgy:`Z;`|;–tqZI匨Ē,B-ϒi5F&$iLS&v 5":D3dN]I>>Pޘix\=&Op[߲}V}صMkkhᶊdh,FY $:!ØsYiK67 ϳXLVFKxX-n`wnh|pUCa{Z˯fӲRGxAH)TyfK\k`-}94H6R8Z0<`&3Geܳp8c!sgЀȕ5-ͤc4l#sjDV!P&:zYvv͒`Q4>5b$Z1NIַ"W x,XxP0=/ݯ>]:gvu-ub7ZNBmHm #Nv LOBk))Y*rEEr*H6'?:"!:&$4T3%;vNp/p?S߷ͷgQkMgcv;)1V;Mk㦓Z%V0,s tᝓ|G6'+0`pA#\_^*lZiʬ1޸ 8ڹ]QMiѩCBBH I,@a ""KtXc[[;j設N]c((:V*(ygI?]b.&S l Zϩ , dqxWC^Mdg Zm !*q2>N1<gtsqCKC+_5ûeRHD=FzZB@ȆS|x Yx~{+A7 $\3#bE:"40Kb*Q"G*r,ɰB(Z_I/A#Gf4' Q̹IHc2/ˁo:6CQCS!&L0ZDH ᅡ<f>L&2QC3fB>>GۭToREHϤ$37@`%BB0$0EPZf( 3ꇲ_TOx+BoӳC_~ %>Q2J=ăLԀLV0_ L!0Mg78੐OBtxER AjA6П`To  9Qrb4 + q##BD9} + <ȶp!UkؐeCq6&o1ǀ1i3:y`A%@# .,&1Li0+_Q0.UbZ-6}99r0qIe~iCe}KPcteN2Db\J. H`͉~j3l}bY3`YȺJWFm{;}}^!ݔfeOJNm-COSy2oHa"`xՅm83)/KYu;u+uvfi;tҪ7r6;[ Ο tm#Kn/s>Jo5#baJ!(ְG +Eez=L7_OZx͵*ӵ&JFsG6s{ns>nyܒyr&פS# ͹04BאGS zpo0EfΎ ퟕ-Ko䨯$tfWX۳[\Zhq6{L&ǩ펓9UZGcnsj}ywGm|0NG 14._0/2&I'd2^y&Wyft{tr\ggQFgYFgDcGmq]7mx恂Kw28b$-5$~SP7/L+^O|br¸p~!m=M4sDqEƑ9uKr.ϫ)\W]]ї}E_{WyFMDg":vFcd[Tgdk7QÑMя + :3 Q@< 3 R3^Lb*I^LU#)>*"\cot[J72MFVYzvkiv_t-{(=]yŨ-Q1TC C?΁V +SheR5[ swi>e05='撚"ڙӼv Wͩs\=w[sOqu ~(⣰B>"--f5<_F#Wi=7^7-ܩ= +UB)\3% A$)7#|H7_f~:ev+%nk{ msCs"OԤG%s(EV.dK I,M/OTUFy\!'H%c%DD6$)MsYK>~*1rS +z{㫻Nmo) +9XGqT3uܔ,H * qDy\BW;"uP>'W&Dq CP2$O*#V\pFMpvYo핾֍}d|OI2Rb*LT(b*PSTs*JKy/|#&sc At -%tR)X%/ą*daf d@Z2*$L JqI,R$Gycçn6e-.;[Bg)^z0IưR>ZZTCjZxĚKQvp X G#V~d@9LT> p{X#V}2z|w)v?N"rh!-etPSlmPZG#NP)X ncG?@=ހ׭@7hk{"ڱIW=.폹tI F +N&JC}G}^,\@~t7V a@77] Vpw7A=IÎd߹lNm_{P[$4ߛ<_[Lo/FOϡG<^pt}+JC߆twGA5a _KM8aw2|mwИXa1Q148sD׉.  v \`=bf yG;ވf9uj* 'lzz|۔^)ݱg4cv{Nk>:4Ӿȋ_~gl0p!b^7WX^1!kYCs;afc?/~rہw[8ef6-.l065ap W:j"Ȗ}#!E($! ["HDq_jUZR9*ڊZ;(U;j]ں`U(Àsf~{: %HT1a`pDHa#OB@|9Vr#-,)Hq='?pɯ%WO +)*r01k dC +H +r桘 f*LT3PKg4F2I:#_J'ge\@kAyF;^~` `H e +drd"AC<&Odab%PzϾdRz_~c2wPTK%r&5AyAW?.i,0H?\/4OhLIrHd^r bA<iB|<1Yp z[ [& Cr4HA/RHO}uU*a|HcLAbAlBWR_B?7#BİJGb=qQbaRITMr+Ao;׍WLP]6Aq)) +z~d"G?lL+ݨ0e>6z4~FȻ呷M_D4m=6zk5WR[5^v;BZGԹ?mFhS2C Aɷx#b +߷%a]1g6aE}ǜ=9z+Kc/gTj/fTi6hϛiϙwkZtg,ͺ6KԄkǵf:8% QDzy4Xdy'eo>Q[k956' ?ZW'K895.=C٭˾xJ0o\h#)B +H;fp-vh9Ny<3Uzq0dnxc9s>3~t8gPӁܝMܣ);7FʞƆEcwC7|}5\nQw2j) v8ҭ ֯@PNZ,3#)Wz05KZ"ʐ֊ӥ-b8M:$J'ĩOSENe.D#Cy9|S;WR;Bl^uVw~k>ƪu]D%SH%99Jibv4![s!=6'I o<<xXF3IaR#]ѽf U5($(-) C'IeeQ#NiDioPd>̀zM򏜠ʄN9~9vgmmcMH51ʄ)yzjDIxI$A&僩1ahL2t>>LV^L=DYa4^v~rrsNv}qEUqKiK(Ԇи䨈I":/%ZRӐ\ӑT3T;X;T3/Y\a4_h?VLnw vS: ~F٤pǪ:/?黡3>$jL8 hN +7b1M QM}3aM!A0p9o2~. _={tl謃kK.Ct׺.AG9 ;[X<ݐ S oqͷwwػL횬5yb;6:߹it籥kKޭ%+޷(# ?MTA06m8m;1ekt:;~NYǛ]˛)5um4>{h+O|?࡯TCp@5x~D>SxYJ{z7nqo0h% "Ly~ :,q/s{E5X[ˀ~j !8tPȯbk_J͞jIOHzo%=ewC>GH|FHWIw|'nnvo4*2?..@B!BO b!Rk" 4{~|_3-XNTX bu+pտX]9hz< WoZ_ ~js1˳r/ꇣk \2$ql5_ǹ=c= +]ͳg;Ĩr ktx9ln}‡΄8F\s!Ɉi_2{& G2@Ԅ%UUV" E3B+Ntl?cXcQ|KtyZ3ROEmq?qKŞ+<5.GELx$>us)?i꿏#=SNo:Y \^ +u2׽D26^l]((.;"cΎuܟ]-M%J H kDlG "[-͂f~f`(j\T`"^2^9^A"G&@Ye(s.n*`WLrgc:Fu&xvf&C$&QIL:AW'j ˪ E#J vJJ 0*-1"0Y1.\7ѿv!/s1V B*C>[ð({lÆ7oR 0 V\PNQ*Ked'gfdg53 ӳziYCBiE$AJjĴEbB(c4?zF iBY l%fZmXYSWV"+(Hȗ效ya^$E%%ɲsblRϟ ~ [ +L6=,ưWQsͨ(sb}[,}[(J>:[CM6mgUr*Cde4('TP%M,,p + gDEw E˛;y]Ng-ںx3?ɘpv殌Ĭ4cV|cv[jbV_rb,4&eb»:a y4veP\)($+ |?nsQنU{RBNȘ<9)TcNVjBήr̋=67.iN܎>c\7,R{(WK;h!Pp؅_P"`YW$'K6o˜e  +g2*,-)l)l)苊cORG6"}A]U_VQ-5vƇY=Y*|ue#qI)_LI*O+[:3l]TLYVTtٮȨQ3χGO, <0Y!c; MTaG*5OiS'(8RxlaVMjPT5!37̨ ^S4ؤj ӎ«+񿸑E~%e@ ]z28M~ןe`m-l~h/8w&BglriHOGgׯZwjCbІjІs! Sw>=t +=r52CȽ9g6."rhgzH[5QӬ#ÚB;7/snԲqr>I-UvZj;M}pq6ԃ Pu{e=wȼvŴ\$8-;Ə0CMApDSmE@"5Zl_GڷJ/ iUx^<F5yiiLj6Rl?R `lͅ{*Vh wRп[6ȼ=s=dnJl>,<Gf,DsHR }%e 06@}"Ṛx:2nbǗA%PBׅp_3 w#O8C_A=hH/f" r,0+NءK`4(1D((!s`(0H4&ʈ(Kȿ)U0ep} `?,kAU Ą補! -Fnb*T-#67+QD +.*xmP"+rt)*Rm!lcv |D5YuD̐m"~ xFoQ?YZ{%S*POg W"?A4rVHQ"4c[(D^ȯ8s\dZ˿F^3y͌rwAheCO[:z5*C(UPYbPA~!˅8"@1Ugy/F?qշC3-ɯTm*y*H3h12P52~&EmQ]7{E#0VVGO/l ~?]?utG7!P5!FrtVnjt Ԣc퍚FV(^m"t!}/p*?u*?q=vfz71\/1]ۄݮ]»Ln&=o +tW[.E_ldDB͇=b_hܗ{SylV<.[~߻H}@S!S-uIiQzG*EoߓvLodW}Qv<tUQ/Ɖ1QA^W~-z_ بcآmءXxP>?diPgīj99}'nb@8DH8D"7"hPK]A-ꈺVP+:uwN;ڭgvߤ/>|3tg??>g/)-LR$Cg~;7$M A7$|,YU+2!pD<pp4pt:p<x<x|'pdͥ B(luzow4_žkމyCkkFcst"5{]>hV|V|||r>2p|ʘ ̘ ĸ:X|:|rβI1= )`-C+Tnr;No2׮'m\yjuvއsҰ˜Y5OGLFL#F Cw9'\F^h6gj?8s*w-|Y$ (=/4Dq܄ wZԉGND;DS'E1# 1ӿJ{F""0 Uϵ.+;x< vYx]Ӑ|gUi8|Jĝƴ>ށO8&`Xk֓8 %`؅>l>Ɇ{'vK.)BuҁLjo!s+XwvE8KaX,zDIRҔ~YUj>&:GevBA萝#ˮ[eI-ffLD5)`3A\2&K?Ki % +c: 7Q%sRU.ܡ4)(JҤZFeEyfV>UHLڐ $g {A14yB+́Hs֟*sC +{ml UּfUWu iVw2YS:Evzmm#ʹ?d@p% @pyo5/:aLX8)LPo(Hߢ$X9sv`V.[3eY榠\DXm~Gȁ(5<-`yZ!.nwyH۫XۏVZ˰F2PRcUy +m\{$T-.юsBuq~JFAܟEy9E6rNԃGȹ7!ALZ&̡1xVl7w943>U^P (/X":cݤ4K7'IO.StJjOP M5z1Np܊[c?z&}O}4RE*7hXEy¼b,[_)TL}\?-W/d2ywU1fC3P +>CwͿ҄2hFFZ@fwjajF뱸A_VUbJA./UH˛C32 RaI"XM* +ȕT@3?C]Ps?vp1l ^Mm-m5G+Ÿ,YwPEeq5cDl4IӍG$"S/&2tiQ$0= M9Bd9h'GF9L0\mn¦.nhY裂IB%Q٨a`<\*M"*[l|e˳pE5q͐mgVѻgEtK|r~:ׁcA2^?]el)c( r3U]rCMm%Lni286:}jIc/m$fk"R z>C]Dwp";5ky ']@c+uV,?A\8LqC2"XQ&g"n$2Vޛ°$})ַO}O8j"|'G;0c(ԟA7 QI9g>Smq1q$gTcf8::CQFGFgG>"9V#I'DzЊ2@_Dώ.2jL{s7l!!@Bʎ([ViGNksU;u +UC@\PY QW*ZAyO99Ϲ'y~~r?/XFgyNO1Q'L03S+byT)e6c3;`=sses%9;dsysMPgaչ?`J*mK_iux^eu@*Jr0j)1ɘDը**wRU1zwB^q5[uCj*<Wqjw930*r|5Wd/2ZiKS<{ F5 1H!$5b34D4@^@οLr S 1Y}'iyFiH,2(',gzy_&5Vw|zD!X89 9 rGI ;X@CtxE@/>f>z!wApQP)Sd %D drS 6Df( Q =jF(ƒj '# ,${b(#*)NH\_.^$OD/ fbHQ!Pr2ٔcXB9VQD>e($~$)q!i>h'G'CgyԒݛ0()GhajdTL.S_Pycr8l"}\TgzLtON%>! C== "&R765*)Q3]P>G֧X(}\*T{U|G,䞉{nmT{<ў<ҶJv0wz%nvG'roiOF?w5h>CD4ikn y,.|Y'Ba{{+߸X3};>MlMwݯbB Kŷ@?Th+1LT`AAjD}A5Oǫ:|^\Kem-͐epR+4[K.>6B4qE`Za2F.a&0uwd(|x7]M[UK둳W*oZ~)zbw 1b)ڭyPqřz({OձX_*E՛`?u$VT9#xL5JbTmC4k&6&$MP;)R8gO7 5v|H3~p|ٱ |#9Gu\8qTiTgoX( , +B aIB[ D’Bl ;"QhѺDbX8n9gTڙ)N[[7~yyw[:]I'TD4Xsiطdعr .I},Rm L>-s(5k=)E>Au@!G#w ȝaJE'8&l< jI%9_s +)18vNdǾm9+lIyQ+$ρtbrwZ~`g2C +nօ [BZf>jp4Ax&T+>+.4"T~Mx . +|)TiLA)ߟ^7 ΢eIBZ2 B22µ 4MF6c:c$*TDeƵHUHUM$PS\ s ;;kT\L ȎRbsOcL%/ ΡjeQqD"RTFWv3v0JER 8>X:Z&”D؅bʰk0=epr["̦ة亶%4ȅZYu$^+.JU1 +q#H[(b.YQs :*TD+b[VfPuլU:EeaFyNbY(-͗2'/9Q~?Kr%#̖Q92n&s>{Gj jz5K;j"wjqʓ}Kӂ +=(%)(DLyk|?>M~8^(:.E>O7FX@0 +HS]9T AG״7:(Vtz ˩VQ裬L+2vY%9iJe\bg@'*OJ& %/bKޱIJ"ToNzx3/.cat5̦Jq)O,%5TQUvR*&ԼxU#/NˉS'bx,9#*f%M.\C:ps`ų{)uu]!*wEٗk6J[d7 “xMQxF&WhFqt9c-^c x'6zl0P7E*룭(tp]r6w%wd¸텴vn ,D0Kw;<6Oa.-Df>3fp "'0={U5daw(fQL6ee[dt?N.9SQ} F/7rKds>>={`w +~'y CQg"I-EmI#5 lЃ:P{F=z&~=\?~k;nA} p.b![@vcXOm k}'WpN0S!y-͐> [j([jЬ:ׄ Vn;26H>ȘŘ٨':[ی'Vo^xٖs+|.~}5uFi;{p +MU^FU7I6S xӌ3k:˒ >Z MuyG=V\u d'`O ,aC{p\y\QHG=>I'yOrzZ `p=߃ݓ 3SG)~ }w +@5SA6;fּZNm38HK}K%ټ!-,R:c# =x7':N̻з}![l!l +9`-8,֒=L @=?*@ʖ𨝬@'/bGM'H*`ٞRK!)AB! x#Ne#|B(ddn"nRK'C#|yOSU<nT7*F#DGH:ҩTlaYBed5YOgL(y~ ܃#흼.h%p%E0ՠ^|IJ5R/TG>PD%GX| +ʭ픹yKpmT3zJ~!ONІhk/A%X!7J~ bՐS )`e0L;/-𜩆62'O +-7pLRtZJ2[1:Vh.F8'ɼ7t+D Lv$TZj2OG +桴i k1e4=[FGd$ | H%&W^!)F`{蕳VdFs9<}k'VK1ru F|;|vvipod껵z/{"'rϓs_C(FX|)a=w> +c/gkwIFߙ9qnpWrWpTq^ +<x{>L=ɠcA p +v1xhR^2N['%8Xp70F}aтkYa‹a φ/((X/:UtTOT8*>">-ޯxjO^GH";; pʏƳwjaZ]YMQQ}{ mNζ>j]c}H@bژ256d7fnAj9۝Fv[ToThWBM@<)ce;/HA\VJ%PoR?.{y;;Ŏ+d[5͚*>& Nh8Ӵ;ՠl?+`E=Kh3РNyu/$$9Lu{B˖LתI 3\7&̕.-Ӗj7VkW%\q_^}LQ^E-P li'Wg3pjGYJR;lR9`zH +ϵuY^+uVy{/Uxy/MYxgq⏾Eϼ>xЃt#PE=^z\&iLv#-b6.k IL+,etR}RTbE  +U O[ֿZyzuxJ=hN;hk{K>H=m)aT6kWx1,0GabÌE=V66T2 a6lQ4ûc '~>>E;'e_WL13hHÎtL]UteFV2AaA9w<9Y3ӍƊ\IQף?Gf߄eŞGg-4f@;߿)ڷh贈tW6ga}VN^VjO!Asɡ3DL3eDN1l{i^Sq,V8erL21#H( 6i4fMq[66t9"YvcpO5;82,tȑcz7g)3͹>>c+c2WŎ6ZFhJ +@:4P.wcղ.W+sͼ }d&zLHf 9vt2-%Oeb|ez@=R6[6[YΪZnd=܂HTC=\{Xǿ{ڵ*2)R)$]uHiJdKmM)#HrefJ3gʐNf$saϳ]ou:k!]l^]h.C%Yʂy*̨͉?gVD3RRB>IJL^6!8dMMau䫣S:ƥ "R[p}5,}(6Xg|GyfZf-=R3&xM3?qiqiť},,6m㨱{CcOD_ I?&M<~_4y}(axsY}PT.+a8 ,#?6-7oJv$fMI7-CujyљQWQoR9z^C@+v.LCsm@g5Ky/4|.-p ,(g*KTV)QI %DQ̭D0<,K>L5TP ΍T5бGUze]m]Uf9jWUٰCwc[bw*e x 啴fj L} DbT-B\0SW# VxՎ6ZoY;ģv,unu ]kw =n0R8F+?Ǿn-,S}H&j:(0k?lG#$d.(=g]nI7[˓:K?mKz%v'#!Fz~-p;8vH*z<8 ̤wq 8 8 A +6DfGX7ê-a0o$(/΅B(ZVðe7- ϠN@ucݷsܕtZ7;x4.̀% +`|C +[FݲV?n<@.7»۸}GS-zֻGJ?sg |kLz^ xdEbw6靷Tӿc_^НqJ@y/Jum^N/3sbg7ϑK_p O ߲{1f͓9#p瘝v?f>$u'w&;Ă8/ L)F+ּED_HP`@@L`T`D@E"fi+ G:t J?R{1;Л98*`UOw0~ dhw%NٟI'*aL005R #!g7sP180Y3%ϑIoEt-GؕZo~IC3pwf~{&\a$ +aT3;CaP 1 =NL

  • UBO9+-ng\5I#%=Vm\@%γX&c!9ka02{\[;ngf~&q&I{TQqS"\Ur% l;Zkp-dلַ8m%9i'i7{tF5ueq\H!򰠼IDH <HH $ \LH0;1;"*TԂJe`0ejkGl5:vf:egvZl?ʇ:~sw7BPID= ͍ןGk差WnYC=zi@yѧޭOvۧ{[n@V)Ku:B}-^X.^ 6APHYl %{AxBem_bi nyr-t#t=EZf$-1HטEIU,22yJ|-Y?Z !g,zzVЫ(qwYL*v7$m&Z WY/EZ/FZ_^losmso39ϙN۞^.Nsn=ܗvǸo즸$; ,HV4oR?rѝh/cy16$~1bgcg='cDž' w.:;Mv4*iX@qhYG0 t?"ZKpCK1vN$v8'Ju}H|BT|Llp97p\Fœ;Fgw w Ww}}"-. "2Z(/Aw)hA`q>%Tp29y*I$m\s{WR>"t%.CC%cf)^ɊWsN3zK$!6 BV<'We8t4IVG\FSS݇RpYwLcɪ|{d2_ϯC6.;F1f)mkV]Z)IoF x7J @{}wJ S\q.d٢:fF2ғ͊=>=iJJW!/Mڀ6yK@3Y>(? W['j*9Ae@>7xs\aN@9A8}DTv<֖hIћE:E{p\cV*N3 yV㐒= +)Q *Qa(@ `AdBt}PM廢|`^Y'pڗӤy{uAոYr]BDX>~1\G?2sq"('j,Eu>e] l9xh/bo.ok<ɩnbrBUEʈ|ecdShSlyF{n!l`iTsrȅ}9ޫ}K59as;C +-!(ZN}A{u^_NA/*YtzVS1F5&JSj25<\K|;'Cs8!@ϠA~Rqݫ:X*;W:-*96cMnWCԧ0-@3ypu~FNk"ߣx)ϣSt/8"9D_(@hFн܄-ේo +u~#kVQ%v)HԗiҌb/rGj&C'ndb%T_es3_C ށ<PPA0jvek?>uE7Qq^J׳vP"e꧃1uZ.+NCx}s/BU620}o8Yߚ%r;%i jI(61DrFg5 M4i"0܏ڏJP[~3x55%3FCꆵ~:# e,UVmC ۓ*<*Xs\cn᛻OGy=|ύܕ=p"<6 yw +yvL#tx|P {=E{'swsowK Z8S$^Y~=V*˪u̳1'f}N~W_NWQ>d߅B`BڀEbO *(q\ǥwE6=6B>6Qo}n-reFۊt] k] +j:|ʿ'\# WK%kībJ^U,^^eE\e'twW{T]I(NTOTyr=M`/P٫R*oB+Xo9e +`.}SJUj~stD;G4B&8,R# A9;X_G.[h2~Kjd7<\@tAbw{I 7;t hpqB sd(( 9|$`j%U\rzk +$;k@zOo~ `8ShwaD!B9l /_w {tcwFA? F}K: <<8opɏMq8N.}_StO{,k$5whwnt. J%AseOQ +s׽ d>#ȚYsfZ]T\wH~"%w} x CE8ڈ/-4@0QHP! 3T2, )$!kQG؊px3L*g&{  9C[Ѝ9aH>'1Aițc!)tѱ? +Tp{krv0+t7*OPү߃}d̡RItCx0 :XLr\JzYGG!c*\ڛp8'1b_yg!tZ\ZjJHCHw15Q>g,nϹ-p{':QʸvzD41#aळx'TW- /Yx(tR$;1tG4gqZ1 qRtCrr4kШއ͗ا=nwQpxҫd "D觸&]sE]_4i81G>aLd7 Cbag@5vA] };RU*b xCZ#%n+h ǩ8зmg>fKuHJ5iҶ5RuxTQ"UFTJTqHQyA)$\)d[P"^"X$^$$4xh4J_D%( Uu6VY*z\3]3GY(oIˌ+ԸAUlܬ*Q66~Ώ%(49$;%_Yؗc 4cT]=:+jLq\{֔z_S?QS(~0~vivi6ߔ]gӮ5rL[u٦5S뮫[[3Vi>+,|R- |YX2}X-e~,sEy;G|I+{pu7xxyg7uؘ¤7uYCy<'mpCu2븀 . \`MoMg c-m3ۺ߬3C2j ;K@X H%l {XKTAEE +PG2괂ӪxslSO3N0<' {kWq&2N56?cuWYLSaPfEzNq}OjSwԥ#9mKrfQ{ΣM*lNٔMc׋8YNWGvqn:1CUYsmie\΢aa;-&9%nmi9-bIҊ5^bwXFܳJ<Ոp+g|JSRV*a/"g1 y(D3'c-X->E鶼V[vBfi63S!q5r^ַB[&SIa~䊿B2|WH y<<@ ܁s3'ڌIp!%hW'wEX6%8˓ݪs9ܲ|_T/jҭA +i_P`\z"8Gz)8[ypy`-?[E Go!Uf`ⱻ̒zݨHWfޢn(.HrUyR"*zAL'ȒmHe Mv< N H1|=j[uȃyh$:oخ1NmZSmEUuY]J,I,,s + +RAF~MXz~[XZ~OXb04E10CO g9z S-5Ўu7 tZM 5U16*MCae{nywviD(V*)%U$e`r_P9JP +W~__/;ϗm}3D`=#ځ|K&kjh&*mԲuI5b*'jMP9(AoLjn6|SÍ)śU=At 硓kykovhT&[k"t44fp6iem/A٠ݻ*F{;Z{Ɏ>\WYǰ#k"seE- =D-D.#RuSq)YKӷ/O"rnNwxlcth]gcn:QH9k;Eyu+¸.rg63AcG==;#c~RQV/+/D3"iG҄屽ѽYz "{*hv8Dۯ9"]Xa +_مt2+;E>Ely$cD[@,sЈC+(eCICp(}V#2mmlBl[C, 8bwjI,wl,cyfPោΣ}0`ī1>ǍZP̨#EzSh +btqh`DhJgiP~GQނ琟ޟxpWmd0bFJeNO <0+cE'A wU$R"JÈDSD~07&g-9CZaXO dkȠe2Ta3Y'd2}͑d2L&s bp 1 }mvuNy D9c"ә%Ěq \ijgQ($6s:׸&=w?pj,5\$}Hu9h  2Egfh>mu% ͠K%zCQŗ>^-p +1?}%w3›m"?Y}7'zhfĝ#)gg(g(gܳGi{=O><89K 9,IY4 +hKj:zAzCoz}HN#5Wk 47=[xgB/:9(F5oi-kV'zx,(cv-d9ʇ/0 9ƒ57&KXм&ނX>qYK5a^3w$D.Blj%!&#Gt +:k2F'}\L0GmS1?B9/_`5qXgb^` ;SKzv(G7(7Ri,.kE}lBg,7GVtjE'qq:j;IGlШWt^02o`];1/p=qっǞGw- f#IE4ᢦt@MtңtLPOG=::IzCAwz ϟie9;փq=țAtW-!v>]x҄ :?NF1aJaF3~QWT͌b>Y 3B̠xrsz,o57!A\}t`::=w}3=3g-휕vHyvjVI OѬWkE2dy٧uIN(gAļM׃uSW/#kJ$zŸR;:4ן͝l(,ʼ?Lk-L 3{r=aEaM:.iFziE߲M:bN:f*j޵Z#}lں!?q~; +W0ۋ11Ϩ̂.򦝋s皿/[Ȣ6;e)2Md&+Y'im5ۮmm5ʆVˎحMn;ʾvh_wڟb;2}G;i{E1ۼ+rՆVyCJ$ojNsTF8kn1{1됃Y>=xA>6SK5ɴ*<(WSZ7h ˵&a,(E[׶'j{D ]xQQvR ϧX-~S|uS9r yi5rJF!SmxW<̢(5Δ钩W &$uiAlNW,Ոcukt1!ZwX$V>Qt0: S:\3F'1sF w k>ۑs<{(=sSB,CSzR`mrX/U+BɝKwD&_YWђo_ #l`d:\Bh?~}D둏UGU {SQ˛meo>%;5!S1TCRCXaX!44,1lEѠ "pÿ_/gj4b?RZE-a?ui) +J)42KgK)E N*ug)1 27]k +rLNp49 G *ej0.5CD0  b* y,SAvt5P#wUk/ϙ~=|3)9{b+.sBJGliULu-}FDU9Yvn~#BPswz:[x0?s}zv41+,aD)S3_˘r\2etǨ쑑Ͷ'mƦ_S ].dh:՜FW[\ @g ۣ%|F H^Ř[&XGkg)"oڄkڌjcY/i[j+B-7m&To-Zg/ pspo=@i .!B$3+E\䄉E>P,+Eƙ-bVhR8O[l[e4W붚~&߂22m?xo7E4'tf@s!a'PP4~N.~%S.ˣ%哤~hlm(r~S/qח +Υy=_P*E̱{Pͳq$YM!l͢j5۳Q48 7C\ Qp1La:iX: lr:XG!sòJC73z(#w/k@Rdzk6>̀s+0hFaj8ӝKڏG yZ0S $ş:V|ID_+~}NjYnNza=aw[^Oo +]@tzc!gOe@Rðㅘ[m/wY8/CY7}>&ǢDzoc^:'Ή7Ћ7| @.76#S ExaNE"Eag&†] @;*AǑidYDTI6|R@ xJ` V1X12$9я)lZ>:c=wq?4+_,#L[/@/c0c 182o>CD< ӵ>2rɣcn]chTq] 5:aF c a CTf3t%ӵutlcnrNnpN92߰_W 9nStm:k`l~8Fϼ忘-XCzYܖqsr :\tY/Єqg85N24~J:I0̟ro\= f~tNcNJg).`%KYӳ\zSDG)ǯl@;rU`$_<~)ɹ̹$`5#XxH%T B{BY@P! $| KvTH +{%6v6U]Y_M󐯺[_a3~G1h rE]ZTKs5}q$3$$*p$H p$r 3J(Z +U[vnw1n;q:|Cb朴yPZ˜60{SN椬咍eXdYc3Uaُ<eg> ^{b 8B? DKLz-Y@ a9+Og k\^On7zۼASWz)}z|w}O:_/I~ɳ^˲=6rr<-33qt{Z2wXY;,PV+w*mϿS9Ʊ+g8{9ʥV孀f_MFۘh1GEh9nz[1t\Y[]ٙYZ^ߢ16kLAMKp9^[3 h͙j[a&̓JVW@N z]sDŽE9 70z +X|w>cix9,Vk Va'ܤ iOJW%E߁e@*G o<{^ٍy 32YH=(lh+Nj.L/YA|ADX7q&1"EHDdrdH7KNXs@*E7Z3(bB\C"j]\.+M5fp*tbCPY`h7tD ha*:pJ>hw9x{#`NՉ6X`׌ElGSݵѥUvj9)d{/^K۸2{wԾ#a?o m|ĶV9\G$]m33b2&ez026R`#u0LLrjy>RgO'u`;psm֦b6`ov{w}Vy׎y/&?O_!}|'\L4!ĉM$w)mw[]XWkj`ntuzl]5~v][ 1c`F_xFa7k0pF͢a>L4 :1D% (96m 9 mL5" \C&Zl$IN |x^8?`E 1x)5X{#gבsDB..3c9F"q@MN ,_nxK(%L|L'X|5'hAc4h\"e%6Av(-k0י9 +m !YA7q`a 70Æk\B(&/b-@i3u2xsB$EĻCp +6oАߗ4F{a-&6~q^ tZhCSdh%/e7 Yx4?H !% ", +qAPUq츔:h:Q8uZe7 =?w}D/ +޿c8+FNκGN.]Ht%.' l@7&בk%pwuwm%Mf ,Ò}nҧtQW +2F/s,83!B1;:/3 K O>}6a.FVbx 9ڎ |W08F +wOsΎȫp2p +VGs0xi+Oh'V :oH +g0 5rF?9 +s Bጆ/ ɀ'bT[9<̃xڑp³X-+ V;[^s!Ruj8LpYϔO><%̄ +W/oD'\=p-ُom}<c0k8C1 Ml`W=ozI4Ci]PJ[fj&amz.Z縆j=Z|z\P+rcX>KlŖ4cJl /rUрGmigmJOsiw!Π5 +Z-^Y#Rl)u{KwR!T:|Q%)YVh6hQ3>5Y Htds9m%Yjns`wa`+wArnCP>ho~>^m׼炪@VP9̜k8VN?Cµ# w;e Le&pBxTQVߢT6UQUWTZu`I0W)R:T7;TfOgo +OE3Tr$щXA0`ס5ɊŴD3is[4/Ԅ;4hu6* U犪DsEjYFrMcǩTѩD۹XsԹPsC\y,~X;vCPnOFn^cn%Q[&4DL׆G:VjNYTrm TqvD[RRȥ@嚯]alU,W07\u4~8u`C? 9@]Mϣzo˩*u +gE;EK1Z +|=)ejrm,Z`K qLvMFKqޱ<ƒ᣷LU,3%ciQNNHW'.K>#( Mz!Ib!,BœZVl|^T*Zv%/ǝrrFRF`QBfؔs7zmIHM1ٖ*jEXz<4\{Teǿ r%njP IZQAaDKɠDR*ʬLUw;Y[ڳіi(?g y=m N4~ H% uLG-=z}AK]˰ahd 6i5YDMr477Dԃq.sə9㱻|gM1?){nls`zvAx64sTA)^d}/&>zcP`䟐?A  =)l[ >_H]2 z @s +#toaafASO1ݙ?gBqy~y~)yK|+ޑ'1wB~W|iS\eǯ{u ]q'-UR\u2b8TӊGjjqaT,X3%YJ<`3[yY*{r.z8qԟ{,txF8LNJaźV XÆ*fVJijLSJ54@K)4F)wJ]S⬳cXk1ƺ8Z6Z6Z:ºe]"V2DhVc2SF/TӏR&f%]]sM76lcTmmehmnc3Dr CmE0jVjHe*(`/\k)aXpqz?XfXM#kfKa4C|v/ۃjT=Vd')>C5Ⱦ@򱯐iz m{M6.P{zws;̶&Eje6ߌ{$(Iޭ&yɣ%R2&˵Nbs-4Z3D2M e#p! o w-mR !3@P*0f[Gro7"bp\NoiWhlmlv>we&6bhU]vofm^i9ZvHЄ}R3Rd%"]~6!.Ciѷ/`=\/Ӱ_>'"'};9d `s x `Q/\tIpéӠ.}B-CqGtg?v7lJ"p0SXc$2p6КvcOh- +t9ctW^Go_1|'#\rA%œ5|2h,E90(":IoQFXzMͬK/1"8D<;;@ފ|i09Gp9͆ C.9CQU +\AGݦgաNӬqS~R;=hw]>SMjqZ/8dyN!gUk +Xh_l翷SZf: S[N;@c_=oEMCFM9#Xڧd&EP +a-zt;=i-En1tpX]N3ٍWU~S5m+'}oc sQ3ҭuū#]{LNj3= m.VU}֪n`T;pj|;UwXNj_SeChS}(Fm~+#ח9rWmj 38~T]m +QMH6.QuhևVU: kڰ,VҡWr +S? c9-l WCdꆧv4mq6De*jlQ"*Wk +T>rh&3~# V$I$ ApI!\& )jhmԶ*X^:Sgv<;;uu[na9_|=}=/wN.Q5hH3\eE4X/Y}?irz5 W8B[;̆@ h;I+i4ڛړ^O/aݬZkT[ֶAm;k v.՝.su/yBZ< q݂2"&Sڗvg)qv8z7r~nMw~^~ש>o>f_fdL؜Ga_F=#lZė|Ǎ@ *<>4.ܛϦqv步tvĘ7ZxF?l$2T +j&a=Vhq\l< j4&ϋ덷%u%'E2/ʑ*{5T5,(tLAn<$`J/Hedq,yM4ZnqZl4H΄z@f<)KY%Vo&U?M5`i ѻ۵9XͰ1 1g_Naվ,Z6JlJk55$=ڶMViU=#r &[ +c[ieF"} q:B(tTQk:Mz^CI&9U +{kWmrGXYR{/'Nv_O.r|\x,t]YhgEE~0̶_zc=l +ŽݩLn&"R%+sV(g٥".U%u*u5z_irFir `E|ޅvxl:-hRzUY*20ʼROQy6O٪x̞d2;0xߓz-Uf9GnA_F0n{1g!hQM[GuZ=U',J%V_)L2׮4L?(O'e$&ff$eT12@?7Qc~%h=6h7sۤ w**kJe6ep-P MRcCURnCCRNC();ПĤY$#pE1c.H^Da3#Mcj{[ž/lCo܎z(LCK/ .U %Pqh9C)d iY`6'?hڊ9m.RV/h 7DP< <)HkOm{{W<͖ofFĈxyz8y^\w@=F1xO氒ëNp&K6r2Vp)O7iV^j|xt^}뗬՝x[W- +FЛ^@=":E`г6AG(#tu@ilJX-gk-50kUd22A+"Ҳ t=R }CK=ez6_pOC86o݃ zJƉ11ڱz,VŴ\,V +hY*I Prl+)bQHұ$9G;$9 Dă ]<8fycؑP!01yfh2M.'d +%LjIWAf14΂ $ d@+g o+΁Hye  h|P H00I"D7`yB~.a(0@gOh`7[ +n>fw=T$Oqtaw ]n@ = ݓ=@>FG#DxN g (2@UϴαcD}!|~ǻM7niHX ]M.7 =EB:(O0*/ i 9F `,c J߉ Ŗlq]F-.]@~ tmһ_y @0czTF5`4FYIҋ{8KC8.Gt +EFt /yNB~د/,30'@1V,G|:8N!8zQHi+=FWOX}:jߴw<1ݟh[c-!a,xz,r_AErpz:WkbFvPvTz;NhD aѣ }|y[^*X#x&"څ={*s+͈eK蚍vcڋy\$u**f4:z9x@-cql`u +༂!^t ZSQuCp5i:<\œ|PC %? +fxz2h3'6q i#<4z7Sz+GG[Y.v)KmL\߸N;f?Ɓ]0%3i46hc~&9wV?3V=SJݓiFZ>y-޽ὑڼwP[xIjr}>#_^ĕ~;xrs_4fYxQM2x֏L biմ$f.LZKK}]WLm~eį5SvZ8}%->@MӷQ5/PM]x© +`9U," اP=u-Ǝ8QEC3iHZ@m)A%(fSSURCP#/.NMp?*dS&<(4'$1o^˛Gu5}q3z {`f|duϚLF-ᱜ:p!ʭ sk s܊ZnYBnQ+Q+V)(?仕_ \ʟV8pVx 9 170XQAkP.ı$JF-ӨIL(NJíRy4~**QT%bUH$.tǬb^| rU VlקxRπyĎ}Gh+zRıP-jfP&[yZA(,Ύ D"qL\[%n]^y+K˦>'oJ-RK<;84AF}3v,8V6m1O:o*O'O,\]4oV#piE&q^U'riFmYu]2n,]]nEnҝ7DvL <=wf" .ıqb_JSg"cǕVOdӥ6}̢/g苙4}%c6,`R  ۘd[L 3|h etz58qmK C<qT"t/rOIS3Ŕ,I7fMjcRLszS"4_3w(>EyBcǨͧxuy>gbq"*bLE{O)rc>+Upg )?s +92);sǖK MV8Ś*[,$Z܊kBcmPL cmC24vMeAe`t9 bxN؀ݰE[я\X n|.eN"[/e9W5:bzGHgO$3j{,_e*G4+r('Ꭻ0_Y @;Џ}50V#ĒpIJF һ8:N(֙&V9%N$(]uqG, ur>23""Q\q սU*8ʀ #2( .ȦR%BdQc +Ԙi$5165*&j=`=was}}L3n9%{vw}VSK[` x/s~*.f 0E# C##_rcqm6;28M=[B{wAsn:~kww8FW=[sϠ&eeIIR,%r4sz⦁_EX[}, , aFe12b3Y ,CgPzuK|[ w &<2$My8w*KP>KsG\Y4[$S +T򷎔u[5V>օf5_V#o5:\ۢ'd7!52 r-X 'z4"K_?|l]eWIz6TrM-F.yrі+cv  mXZ,eܑ˰Įج +Rꑟ؊"znd!Ct,(/ d(` + (|8#Kyʕ\t +@-Q-+H9~xz K(^\`+e(e(.oidno|,N?Am67™ b⊃燙GE'<o?,=@!39K; q*}r!gҌW0t3½%(Md9`8Grh?dҟ+z::sz&}KgQzm[(H@K*t` &WZ1;-C@+Qh5uuut25 ./gpMo>C+k}3X~t=y$\c'Xbc)%;:"~\PPHlx^vr9M6R>R~Ï`r#] WeT8fr_"S)t/g)IW]p=ҀFs2z<n+r8shO4L$c6=Yr*JT*ߠվo2+ORZ(%` - \AEhnPOiv%5 +gcX&]χqs>9]&F(P-9JI J4Ei)ZM*4WDܰ4C\0;|aV&*ÌCƘ8D쎭x8=jŊӺ2n;#HekY6]Є&4M($mJ i)4Ȗ*[,@Uѩɢ"2:0(BuX93z 2B0y{S,Nnb:$ь2-#Cɰ*"fb٣55栲\oVˌ(+3Uc3TŪժҬ%Y;6Q_vfFڔRkDV[cU)rdKL lEbS WUZ +K:d)UY415ܹ@QUbko}AWd=^ {s~?/blx_74Ll#:6>i  c?i*ieՄi&ԁr!i=cڛ]x6lWM 63Ð] XTnwijwxXZSA%~8쌝H"FBM`8l:MC!!: !67I "kcB!j'8-ξ _9vS?w!npޣNNb ļ|@Cyoseq81{8չuvG;up7MYaϧK3g+_<-(@2~暄q "pJ r-NW8Kx/qB)) $So}|'a交bP|$pL/0n 4n]bqs}61Mq(0UZ/+a).4=}?[*zX +\C,mA|FX ĩ>^N98MN=yd^fF ew?hdH>&qԟD\G- [21xj5qL:G!bkQ$vz;Ǚ&czwX,b@~O6cy_`})-KQ֬y\♉UNKSOzUX-06k1-NcS,QaBZt1~k 봇1c}6de ,-H{8R20ǶlYLGzLEu"ՇuQX5g1dK  (c4-N)m6{3>g3>3lO-}[b16Sq&L.a2'k1# NcMB07#IK:N~]ɿBW?љrɚAy#Na_ܴ'[,m>NSNDJFSJ`(ӗc ҽdt`eF/2ѓ9iteDF*|EЬL^&z35.~79\n{ù#V5mV2WHV4R0` 9˩DON 2N_h +m#/wb.xsBh"6덿댟Jo\M5h9K?p =M9ʑcNL:?g ].T :ItM+!cM[:Ӭ.*,//zC2} ;MSg8 4uE۸ku09n(L3c<-*ciNCـIKf1zG3nK\cT[&jiݣTZ)KzK-\Y,,̬ޡ_#59~g)"!\D--d4ٲ u6XSZ&Jj[RekV+m],v&fZ-QKUulZlD-.JWl"Krz#j/kׁ)}?WXG VFG]ejBHt:J%!;JcjЕT묕#:sܭ9JJ}%%+]CUho;=K۫ WrL*줽jT\vҕ +WP沊rr)G-vE5+USͰZޠw*y}N6_r?KY/嚚Uޠop~c!~c3W +baQɃc=eS-x仉D]$ ͟ ^MoҤWiĿ0d}*cs\Fȥv*5w0v-+ ]z[@)&$@-!ֿ1X_wDwK5aI&ܤpb#r23 _Ϝ /?VyVK!X@iH >`² *<#*@dp [ B R r?~G X/lfNld2CZ4@._K.6r56#"J@d(BFBf +!7 ]ӔcT.- %>:=Üż>o$@fS:aa60o/臙a$;I~Xr8'1N#_P +?ϵ{s}Yoz/1yہ]QQW}ஸ@Fdf%숀QDA\qjDtbpE+1ĚQQS۴6Mml&i1'<|}>~)P,.pqֹ..Z4U-\KkHpMMd bn1l!l5yvA ߮K\mt0].7sx-F[ _@ Kv mC`4phX˫wrޣl+f#?$=p|^@փEmM$Ky72?6m~8u0d4f f& F6pm'~iU|C$$oϱLexWoflŏVgq @rFR[,=Tڱ25ʽ(y Ĵ݋.M >d>"z>=Bu- x%ɏc;89%p8[E)A:v uC8 +"68Nzp +,B\/Czr?bAHM.q/\x(-𭃫Jx8,X>.g9p\C-Nw-Vsvoܦ?=].w.*3N|Qx\1D +R>p#(5-EHҫGx-ЗR.z[~D HChݧR*Od&p|) Q҅;o((HB~N e kup |oF"U_u2X&uD=D9}ǏOP?P^~⼏μ%o.H$}No?Qo |Abp&a{|v?nnn0~!MplL)We;E u~A 9i%7΃/ 01ȥĤ_^I<)" /$RyWfUṗc1XDތ^Zǥ(Y165 ycy &# +qS0R1|%Y*i2G'UW+_*eF2ޣJz,=Ȏ).tOܐdR')}/3ϰ׍jw e,->en@꥗12E%e}ejl)7AJHRAπ?ItA4e[E6֓:곀uҷiCtH ⡉R44U +2e_L(vb_.y$:yidZddސL2VH2tπSUb?Ϻ |n6r +ʚ:ud0) ÆKA@>,$ox<,A$+hd/I"cBkFդ\$|I~$; rX">ֿԁutd^Wô2)dCt*Qrha)9b&#,GI ^I __J](#?Wjw02ki Kmg%ߔ^]+|(7ҳy刡2."P2#%=(c"4I4eTx%9ʮ$^U 3UKBJMޤGQcOk1ShdpjMQN/ךuCvVO־Hh2?G>~dXI)TM$cj(S:2&S5Ej\l6&n}׬ԨjD{>U/>$'(`&!Z§%QSN2-ZII'6$Ē&lVbj9C5F,,ejeaYMjUa=ZUS-_f IEV%#hD,dŏ +jS MH|Rd3hm([( rߑKCbxԓU + A\Aŵ(-56D<Ɠjb2&1iDMNMV63eĎKt7y@l(|HJ~C_vC!!xCaqBu9r9EḷUw,.[/8I"52"]C5(&DW Nj8oh2M2IeO*1%-WhRz%5($鰂.*(㻜&t9 MD!5x.q4je16Y1)S}/5Z}R+.= e,yg#'\J|1l1m1˯f.l0Cл;Bj%oÜGj&h:ɆHOǕLlIč+,;*и +.r[N,,erA++l: +!q|ԫpmeF=l,<ԃ9=BVrRe_ť_%SɅSp*YBk!!r2xv[ǛuIj2y?( +I@v䀍EԆ6B[/ȉF,l =8z»C C=oeYx/w2۞6ѺSu,&\ E'u>[Vr v5UJf'j$E`&80Á/@*tfUd7̒Lm''(w3y{mZ[K.VYZYΐ Y?s@}pm O2<##s A+` 0t\mej= Z*=rUùb&e=OIna?o. S`0w!/oyy D-}P& -f*{wAFu-&$:r7ѓ'tw+P4wwUߡuo)qvB|R5u*4hkhNK69p :u & 2z}TUTv\v츌kcp:{@,@usoZa:qpaC'`r%§3# ).s9]٥R_S軓zI ms\~~X>SWJ +bǍp$s~-2s9{6gЪ%_ +uoӫ +G?H! SD^;9`[p(m{[mU/o0\)ر4QNh Z i-@U ok ӊmx_ 51D7S? /YӉz<S +2ήR5_X'i1] +/Us0} urO| ã4_?“OcR(>ʴ +&HlIxUD `d.ׂuaBܣ\w-\K͓;^'qZbHZH},cRs|љT *.ȡoG;YN2J=gy1_͊֕T_,\CaOF2e+óA6c ǕihSNwRkY֯X}є[blVŞ*qBwe\ihpgeqi1]yXY,gҽ5ɫI&cJjDJ:3\\{є Hbk, ;@پ7\~cT{LT&g?KEX*%*!h⃎i|PA_@]:ur+ /ك{ {Pq{/`p;b_AW0_tT3MB3Q RaHCR5<ԡ +VvX'^̈:#+ݲJJa I8c"wS/vfac| / g1-kȾ* K,ʱ*˒(G]9Gc +#5z3Hi6l+؍F\lOSLL)6Hx<)guEHltLAG9Zl3kV_٭QJ+ŚaFR\a/56ք9Fш-7lo>#v]QSx|Gk~]{*G_"QJ2jq${)-qR![UII&gyFLrRnDTYFDB#,mA洷zRzJo +J8̚s"8s125h{5)V>}g*=T1hEmd+"#ie!2g*ȱ@ uc|'4$|3o/k1tQpnmM'R+l!9X&^I9l_EdМxsRB䎕hHsi@^Wܿ;{ Ⱦ'c?<oco-YWei4Z dzRA +*P@A bW!\8B PX!WT/YF} +wTD77Gyoe&l *hAK5Ur5=K`B+AqRgp˙y8]2&W_F'f{7er,EyخhMdzi*GK!#Ġ%Zqy5H@.Sąs.ĺX*aܞ8}H}vz| 4af-cJy)-hcyOL9@! +pTqWqTQ̕l1N&%L"SH]KV-AR lHM_bd8̲L\ \ԐrQ[C԰y3=MN_TM Mez^Lݬw+^lha^@^밅S2-їBn,êyIhbo xzz.$h:6x[|YuulYFOlXM_b~rRg^= b}hf.E C"{h&4^3DR!XKuX=k3#:8QJIh +_! @O6J>Zrt,gOZ9LZE+~,#-[C G&O&i> F%-Z'(>/X8<h>ڨ6.6zd=uN.H:$8R]{ +y`'mXA bكql'';wEfOpؽIӿI;O6Ky<LX]y4`l=p{[n{oNtٮj.z8U?Ojp$;;݆w`?8v.1Q.`:Ef=P{r.Y|7?<^YM` p xLG8۬? W o8op |t|^Zp!IYY8?g ;oo|ゾƅ}Jq\a.Pt IiG xqC}\)p'q'hwi(ů0lA 5 ȫXXy/:Ul]л~ Vg%߅=(Wd &=HTa_`sdKB)|/h:EML}q.ju8eX` oT`Snzn~%#R#:6G";qTa8pJ<=ĥW;.+S;pJ[1mMeZPF bnf~K+͝ܣJjj+i;k Om‹h7P t뱇˥{VF-*6è;wigV;e ,/X`UfZa~suDZKNTUd`%Yg'>Md! rg"/3S 62^`UjְYUr1J|h /gy#71?}h2%W;!jz-NQ͒LU/YJ+Vש$Y* +'pXAG2A7@AkEW>tȮ#\ƐCaF?U"8N!* IZ7PRW+?Qer-Rn~D*G)eG^Wf#~'{ʈx9}\<`.y\Dz!x ?F{UQ%Z%OrDYe;)WtrW)'RΘz9b*+v2e7M*tR)kWrgJ6}%ksYc q_$yYC.2[Yr ;gܦpLZaiJQv|]\\ts6+%al}JL(,weS7Zn+`N3|o}u xtzXt4fJRFbhWJRlIJN.UF֍ضl۫1RRbl+kE۾T!:gܼzAzdUn~{\ Gj+ {jRRɚTSS9ͭŊOޤX{31i-˸hW +Ea' +O3Wa9LM`4H1')%dʜ,L6fg*&ۥhG"p4*٦PnRPΔPK*0{N0#OƷ1YWI;7.E͉O} +Rtn"]&E+,/GK +W +pݭ\F nS$?gۘǰvը ^piBW' $0{bߓ*?C+-['vayE,k^/܃ +7 8wn U4|b'ZR,(-*H(rU2\ʷczIXp/aJC]G#6k:#s6Me $Yi Zv;ObV555I"YQ ;Vߥ5O.wk>8@064@oໍp7%f;ߍ~dlf43liM4&Ip=ai T=:c~{wXÎ i` + s |.с/p vHFѷ8C[kmRz܈mzK,'G0I=|jҩ.4Ҽ2{xI!1EEwA|'܁"~ǂ 78?ӅCp T'Пxd}q\Jq +' +~ooĈg6D~>O^6=Dp&:>O5|V'gLp +Gq1?C0xqD` _Sc0=)dA|>Ai }[̨7~s`xa7a/GN!c2EL3)i:Ń'/COћ(WRlNS|˫WF|1Kg^e,1HDR_$3G<N,!Uzx݂UcX*\$0ۥOj]ȍ ;].˃ӫBS;ƙ}َüX!9pcbL2rga)>H{D2?f?aZ}H<"GO5 ;FJrc~O +c_,/ur `a@`F"2TDToiF-oi^G-]M4m۳g3vsMۭsZ[]O{ǵ6=?f<}W|U,FiYAx{{\a9޸ʬ^cISl?CE-t7h3 3lgw5sjT G(Pi)؟Hֻ{Mq oo W?b/ogn1?Q-^C64{>~ѫ=Z*My= N?)yUs旤l@|'~ B3DW4A]FGG..ɭP&Poc~x<ΒWqUv} +2Ct~W/dGCس>qbK_B62Y@ .Wo$N|Zu{|C&xYX#=Tv7ێ}_bkרit)rq8"w WF|Ow#ۉYڋn.tji+o|.8볍$Ũw!N/ ?S)`LK$ѫ3z YGkjbѮm*6@ }^yߘ!c?M.3#(20_ Z]]᱊b&eVlb2Mz>s>#_O6QJ,QMpƁN+8xXd>ey.g6@W3-?\5xn' +n,%8S*il2 3AaRxjkn'SIt$i7&8BUA&U',$]#BrtH(Vq*a3+e,q2"N)-o(#UT3&VpY*5ڴQFVѬe*T1^d9"3BFdVveL-.մ\)MJ6SRIc>tK0Z5g[s5{ fc22F80)YqʌRF\K5%'NSyeJ*޼W&/k qw!4[#7b +?1~i@2TfI&ghlfS%I)IJNU -9y.S\Ŧ.UtFE1S&cwLω }h B1ިȌ6msnQh R *(cg|!:Fur3w_[zjSANLƜ=DqYQJPtv"3e+^0{Bs*$UAd]eeQaaK%z?;![Z9ѳ+axK9iK=\ʩ[9Icn#Ђ +)P#OGn;WX8-b.ZBV؇8ckɿ#Ӥ{.5N \Y}XWqѸS5m%MS9ϼ䆼' 0ywe/gK(}%s{ +In=|6M5*(Yqk"'!GhL}ACK1u4UAnpf0 +aP>Nqip9DwE;,p1RҬ i.f.f&&nxbx4X6-Aqx}[s FH%& .& >QY;ڲ 3\ w18Sh)4['k&!"'-\^v(>󉒭uzx&u|.b!/#o\4hJ/}1m}E_tquq̤g2\3 =@t?"owD}acFATT((@E +V.(֋jUmlScS趱m665kjulݮiibɆ<<{}{>xsO'I*ޯ2{*~G!1/9cNc;: h /E=SOXttsuqw+Wڅ;ORx&}_ihepBl oA>'g 0 \Ѓw~r:6,&Msx3g\ 8M~Zp1B~4sy< L=ڍY [ +13 MF]Șk!:Q/H/HLS#'lc-('sٽkrw.<.%'X#%|Y&>^V?o7q?+?6p>%;-&?3EIs߱Y|F 'l!S,>bq}>`%/. W8x | d%3|1bk.< Y Oح{lSWhVﰁ-tLAAb\y`I6I\F/@WpvkwW*E-f96+9G56f-aʙ](qp)ttCzMl$'<?:#|1%ÓDvK[ح"ErJ6bhDzG%!n^'#0Qu7!c$ۈKZ~ـuxQNxxTSmUTj.]b$(2usknι᠝:mFd!6$%sEZ?֡c-QC5߬GE%V`?L+'eTB)NƸ^NRz-\pq#B \1)3p&lʅ%((pnvANxS)ETp!_H< +4\b `:?8x,kmngǪ$77at!i)K[/Eb$`\[J+,f×"J~ f2'9"9nYƭaF%h5080_'ݕl`4-ZnJwOR{fyd*#OIJ4+P)K1^z*kLS>,^[=YVH=n/N-kWɛfҼdofX5.O5[(_V)¿V)sL?  +:ǘug\`=b=n[JȗM92$觘&Y+:ЦDE*;bD1"US,w5iZص8"+*I'Y"aR`d"c$ sm-BZybc~1Yy[R s}k@-[ѲV_|;#%]FcgWMDyƧݞ#7;δc2;d:C/FgzG{yb_7z'h)B|̢vb3>1&sFܒح)d(eC2IuLndn*i}c=3 6.Ѳ +-%Z29Z:" |bpp8hu$Ee0f'C{:qe*f)=A3z_zT3 gI(G̡g6ͦg'Y0ٵy>-e"%iٮફ; +I 1*(K,A6AEUEDDTDaPZwetڎ3utNt*N;M?!ϩ:swFu Kp麈 2\ʦj#[Ʀ)c1]zVifG( Z!‘Lj':fMjNKj9R8J˕E%AɌK¥;I=&D'&*O[5Ǭ0g+#֬ғbrseUx:[\s DHtUrQ%U*4=1M3M@[u`k}jvw5~w-3xqch%ۢI4'Llx"Of؎qqTo3 }qBOpS_;br{kC[]rͤ="[f\`.oow=C}ʜrV:Dw47/T﹄8$~EcHOr@' ۱oi7 { W}r|R _'Q/_ŧў +8~K M3CQcyx!/:^e~O 'xAJcxGg!ESÿ]gM;AJHM|s^OO''4r_em/OxH40?K`'NO ^q/%kIgcL3ׄǣ\^U#Ӷp>-\_ȷVn9mkq9 M^5yۅCxe9vޮǣN]ƪآ7ɓ`Q&M5|zĝ+x&Fo/+rPwܯ&uVy`PlYƎf hUʓ-g\O&]Wnuzt?8ePǐN]ZuE`] eO<9+b^.ÓLood3ݮusJ~L^g:[."X= k*aMu%8ǞiG +'AOR5,~gG˖<E9` 5$.5/Gf'+b{*NNAhdn$ 5]BPV``v|XEz:rPu&|Q'sNn5}߮yWJ-IŤ\9AM!MEfe7x=ΆU kO>9}Ul= ԗ8mKLdӱYqnS^k=$Z-w.""7dXR*L9́^ >PkorN^I#?>u1d7_,6q7w.@N%Ƒ#ȑtJR.'z+^ɥQ7ڗEQaDwy)"'薺$EVZ]d6Gc1d~,{زȋƑB/( e /lEiFZgE^gENs[Aixtθ422YՑH6:t4Er#)뗑Q2Mrngo!Ǘu=~3f~7B9gvr#';-"K^ddD~H64RsD)H5]Dy.Ku'zz9y샿k\̢x]&.d.aEizUꑡrr~\{DznfuE'(,洐Y-dz:mzotdS-tCK ōqv#(;;ڋ,+-H[0)ǷrCKoᲞ]v?uC_a/GxptC73w[fU/'̓䂼H`/.΋=9܋֋eыeɓŠ q+&%£D,f 4~:nrG ˕-KIsL +2(a =ը7tpҘCUэٕՕǥ @hpV$?!SP^B^bj~%b .f4R7OtI*[w|זܗ a9 c-}.zEo#cK6r'r` f Kewny]T,b ⛩CgL@'@]o 6&R%4(9.͍Me֟ //%L'}YTBQLtRh#z`qr ŧؽ:WudAGp$Fr'#pd8y1Q$P(9@!,s2:+5|#Ĭd?}fT+|iObdPc,&xƏhq4q $cb,EaE>GӧFm3}[-|"ek/M.8/QM:ݤӤ2q/qq4p1>bqUO$OsM2\$4VO Id=8`ɉYLzDe=dcB` <~9l&MSPߧI~dhE\,B 2mN,evCm6AkJre\.6/1-(< ">GNð +.V+/gZvRG{o~6{Xf:gIL \EAФkt0.KeIj> f;yH\熣}N8ױwMg%k4,[tr&3,J'FW􎃼G<'HBPh)UV^=]>W٥ 5~i-ZѪWv}:ԩ@nt+>}a9)R3s-ygUkֽGjJR!)dV$Q&q(^Hv\BW⟈[ {˃>DM4D_#c/c[h&OܿPj߾-wK=%9Enc&hJGv&'ڱ_v &O_Dc̚hɯo4};懻t#=D޽ǧT avfD'Pm[|ps/ב_6D6n:Sn(g^=9Ke{)#]ʀ}edM+گj(wE$*F6D+v˝75ZU3*QŢI6_QMckbv6ܟIe(ߎە%%KoqŊ ݘPQ=*WR+˿%@@%jHhsNм`#ƕ֕K +G7FsRewdBFf_tN 6hb!?Yv%?+a@U;5d/Xz%Y`_He]L-FfP|6W ;mC5߳ Yhc_l ]s,"~ +zx[n}6Sաv#/41#9i+6^pZp>y ``,PX\ b$q/b8 u֫)iĜGTXG'Ds "j"@D0:削-J N8}??<;B( VzQ +~T 7_l;oIRYW~WqWq#|G@.Dp((n+Gǟ/2v.;k0~6v>go1Ij p5If;pd| PMu>(YN$V|k.'.g`aN{+!8ژT +l H9"~s +Dۜiы)VD$f6>d (sb nck-_gMxE7m~@e9mբ֍̌y UoQ6=-;iբyǫXͶV+*K y6Hs5H07d6H|L{b+EF^S03!-sK275UجK{;'_/%2$nMHP`@`m1]V»tKu$^ ء٦"r`.Cl۠f P8r$`1Au5 <*ur$@2glY+vJCܟvhC$f]8}`=vFt:6-۶nָq&f[&4'9 b1Wq=)\Lڜ5R1]iMNY񾛏ҭmXͤ}ϡS}^*2d9mhůϟ>{.IXt񂹳= `q-=U᧨|Elw` $̀=KY+f ,@~o5:x" c0`y -g0W`;2 endstream endobj 9 0 obj <> endobj 18 0 obj <> endobj 19 0 obj <>stream +%!PS-Adobe-3.0 %%Creator: Adobe Illustrator(R) 15.0 %%AI8_CreatorVersion: 15.1.0 %%For: (Bachir Soussi Chiadmi) () %%Title: (search) %%CreationDate: 06/10/12 15:55 %%Canvassize: 16383 %%BoundingBox: -2 -12 12 2 %%HiResBoundingBox: -1.35205 -11.6582 11.3525 1.6582 %%DocumentProcessColors: Cyan Magenta Yellow Black %AI5_FileFormat 11.0 %AI12_BuildNumber: 39 %AI3_ColorUsage: Color %AI7_ImageSettings: 0 %%CMYKProcessColor: 1 1 1 1 ([Repérage]) %AI3_Cropmarks: -2.5 -12.5 12.5 2.5 %AI3_TemplateBox: 5.5 -5.5 5.5 -5.5 %AI3_TileBox: -274.5 -385 284.5 398 %AI3_DocumentPreview: None %AI5_ArtSize: 14400 14400 %AI5_RulerUnits: 6 %AI9_ColorModel: 2 %AI5_ArtFlags: 0 0 0 1 0 0 1 0 0 %AI5_TargetResolution: 800 %AI5_NumLayers: 1 %AI9_OpenToView: -44.75 22.25 16 1595 882 18 0 0 43 154 0 0 0 1 1 0 1 1 0 1 %AI5_OpenViewLayers: 7 %%PageOrigin:-301 -401 %AI7_GridSettings: 72 8 72 8 1 0 0.8 0.8 0.8 0.9 0.9 0.9 %AI9_Flatten: 1 %AI12_CMSettings: 00.MS %%EndComments endstream endobj 20 0 obj <>stream +%%BoundingBox: -2 -12 12 2 %%HiResBoundingBox: -1.35205 -11.6582 11.3525 1.6582 %AI7_Thumbnail: 124 128 8 %%BeginData: 7782 Hex Bytes %0000330000660000990000CC0033000033330033660033990033CC0033FF %0066000066330066660066990066CC0066FF009900009933009966009999 %0099CC0099FF00CC0000CC3300CC6600CC9900CCCC00CCFF00FF3300FF66 %00FF9900FFCC3300003300333300663300993300CC3300FF333300333333 %3333663333993333CC3333FF3366003366333366663366993366CC3366FF %3399003399333399663399993399CC3399FF33CC0033CC3333CC6633CC99 %33CCCC33CCFF33FF0033FF3333FF6633FF9933FFCC33FFFF660000660033 %6600666600996600CC6600FF6633006633336633666633996633CC6633FF %6666006666336666666666996666CC6666FF669900669933669966669999 %6699CC6699FF66CC0066CC3366CC6666CC9966CCCC66CCFF66FF0066FF33 %66FF6666FF9966FFCC66FFFF9900009900339900669900999900CC9900FF %9933009933339933669933999933CC9933FF996600996633996666996699 %9966CC9966FF9999009999339999669999999999CC9999FF99CC0099CC33 %99CC6699CC9999CCCC99CCFF99FF0099FF3399FF6699FF9999FFCC99FFFF %CC0000CC0033CC0066CC0099CC00CCCC00FFCC3300CC3333CC3366CC3399 %CC33CCCC33FFCC6600CC6633CC6666CC6699CC66CCCC66FFCC9900CC9933 %CC9966CC9999CC99CCCC99FFCCCC00CCCC33CCCC66CCCC99CCCCCCCCCCFF %CCFF00CCFF33CCFF66CCFF99CCFFCCCCFFFFFF0033FF0066FF0099FF00CC %FF3300FF3333FF3366FF3399FF33CCFF33FFFF6600FF6633FF6666FF6699 %FF66CCFF66FFFF9900FF9933FF9966FF9999FF99CCFF99FFFFCC00FFCC33 %FFCC66FFCC99FFCCCCFFCCFFFFFF33FFFF66FFFF99FFFFCC110000001100 %000011111111220000002200000022222222440000004400000044444444 %550000005500000055555555770000007700000077777777880000008800 %000088888888AA000000AA000000AAAAAAAABB000000BB000000BBBBBBBB %DD000000DD000000DDDDDDDDEE000000EE000000EEEEEEEE0000000000FF %00FF0000FFFFFF0000FF00FFFFFF00FFFFFF %524C45FD3FFFA8A852522727F805F827F8F8F827F827F827275253A8FD62 %FFA85252FD17F80027527DFD5BFFA84C27FD1FF82752A8FD54FFA85227FD %25F82752FD50FF7D52FD05F827F8F8F827F8F8F827F8F8F827F8F8F827F8 %F8F827F8F8F827F8F8F827F8F8F827FD05F852A8FD4BFF7D27FD2FF827FD %48FFA852FD33F87DFD45FF52FD36F8277DFD41FFA827F8F827F8F8F827F8 %F8F827F8F8F827F8F8F827F8F8F827F8F8F827F8F8F827F8F8F827F8F8F8 %27F8F8F827F8F8F827F8F8F827F8F8F827F8F852FD3FFF52FD3DF8A9FD3C %FF52FD3FF8A8FD37FFA8FFA827FD41F87DFFFFA9FD34FFA827F827F8F8F8 %27F8F8F827F8F8F827F8F8F827F8F8F827F8F8F827F8F8F827FD07F827F8 %F8F827F8F8F827F8F8F827F8F8F827F8F8F827F8F8F827FD05F852FD35FF %7D00FD45F852FD33FFA800FD1BF8272752527D7DA8A8A87DA27D772727FD %1DF852FD31FFA827FD19F827287EA8FD0FFF7D52FD1BF87DFD30FF27F8F8 %F827F8F8F827F8F8F827F8F8F827F8F8F827F8F8F82752A8FD16FFA852FD %05F827F8F8F827F8F8F827F8F8F827F8F8F827F8F8F8A8FD2EFF27FD17F8 %52A8FD1BFF5227FD17F8FD2DFF7DFD16F827FD20FF52FD16F827FD2BFFA8 %FD15F8007DFD22FFA8FD16F827FD2AFF00FD04F827F8F8F827F8F8F827F8 %F8F827F8F8F827CBFD25FF27FD04F827F8F8F827F8F8F827F8F8F827FD04 %F8A2FD28FF52FD14F852FD28FF52FD14F827FD27FFA8FD14F852FD2AFF52 %FD14F853FD26FF27FD13F852FD2CFF52FD14F8FD25FF7DF827F8F8F827F8 %F8F827F8F8F827F8F8F827F852FD2EFF52F8F827F8F8F827F8F8F827F8F8 %F827FD04F852FD24FF27FD12F827FD30FF27FD13F8A8FD22FF7DFD13F8A8 %FD31FF00FD12F852FD22FF27FD12F852FFA9FD30FFA8FD13F8A8FD20FFA8 %F827F8F8F827F8F8F827F8F8F827FD04F827FD34FF52F827F8F8F827F8F8 %F827F8F8F827FD04F852FD20FF27FD12F8A8FD34FFA8FD12F827A8FD1EFF %A827FD11F852FD36FF52FD12F87DFD1EFF52FD12F8A2FD37FFFD12F800FD %1EFF27FD04F827F8F8F827F8F8F827FD04F827FD38FF77F827F8F8F827F8 %F8F827F8F8F827F8F8F827A8FD1CFFA8FD12F8A8FD38FFA8FD12F87DFD1C %FF7DFD11F827FD3AFF27FD11F827FD1CFF27FD11F852FFA9FD38FF7DFD12 %F8A8FD1AFFA827F8F8F827F8F8F827F8F8F827FD05F8A9FD3BFF27F827F8 %F8F827F8F8F827F8F8F827F8F8F87DFD1AFFA8FD11F827FD3CFF27FD11F8 %27FD1AFF52FD11F852FD3CFF7DFD11F827FD1AFF28FD11F8A2FD3CFFA8FD %12F8FD1AFF27F8F827F8F8F827F8F8F827F8F8F827F827A8FD3DFF27F8F8 %27F8F8F827F8F8F827F8F8F827F8F8A8FD18FFA827FD10F827FD3EFF52FD %11F87DFD18FFA8FD11F852FD3EFF52FD11F852FD18FF7DFD11F852FD3EFF %7DFD11F852FD18FF7DF827F8F8F827F8F8F827F8F8F827F8F8F8A8FD1EFF %A9FD1FFFA827F8F8F827F8F8F827F8F8F827FD04F827FD18FF52FD11F8A8 %FD19FFA8520000F8F8F8527DFD1DFFFD11F827FD18FF52FD11F8FD19FF52 %00FD08F827FD1CFF27FD11F8FD18FF27FD10F827A8FD17FF27FD0BF800FD %1BFF27FD11F8FD18FF28F8F8F827F8F8F827F8F8F827FD04F827FD17FF52 %F8F827F8F8F827F8F8F827F8F827FD1AFF4CF827F8F8F827F8F8F827F8F8 %F827F8F8F8FD18FF27FD10F827FD16FFA8FD0FF87DFD19FF27FD11F8FD18 %FF27FD10F827FD16FF7DFD0FF852FD19FF52FD11F8FD18FFFD11F827FD16 %FF27FD10F8FD19FF27FD11F8FD18FF27F827F8F8F827F8F8F827F8F8F827 %F8F827FD16FF27F827F8F8F827F8F8F827F8F8F827F827A8FD18FF52F8F8 %F827F8F8F827F8F8F827F8F8F827F8FD18FFFD11F827FD16FF27FD10F8FD %19FF27FD11F8FD18FF27FD10F827FD16FF52FD0FF827FD19FF52FD11F8FD %18FFFD11F827FD16FF27FD0FF800FD19FF27FD11F8FD18FF28F8F8F827F8 %F8F827F8F8F827FD04F827FD16FFA8F8F8F827F8F8F827F8F8F827F8F8F8 %7DFD19FF52F827F8F8F827F8F8F827F8F8F827F8F8F8FD18FF27FD10F827 %FD17FF27FD0DF800A8FD19FF27FD11F8FD18FF28FD11F8FD17FFA827FD0C %F87DFD1AFF27FD11F8FD18FF27FD11F8A8FD17FFA827FD0AF87DFD1BFFFD %12F8FD18FF52F827F8F8F827F8F8F827F8F8F827F8F8F8FD1AFF77FD07F8 %52A8FD1CFF27F8F8F827F8F8F827F8F8F827FD04F805FD18FF52FD11F87D %FD1BFF7D7D52777DFD1EFFA8FD11F827FD18FF7DFD11F87DFD3EFF7DFD11 %F827FD18FF7DFD11F827FD3EFF7DFD11F852FD19FFF8F8F827F8F8F827F8 %F8F827F8F8F827F827FD3EFF4CF8F827F8F8F827F8F8F827F8F8F827F8F8 %7DFD19FF27FD11F8FD3EFF27FD11F8A8FD19FF27FD11F8A8FD3DFFFD11F8 %27FD1AFF52FD11F852FD3CFF7DFD12F8FD1AFF7DFD04F827F8F8F827F8F8 %F827FD04F827FD3CFF52F827F8F8F827F8F8F827F8F8F827F8F8F852FD1B %FFFD11F800A8FD3BFFFD12F852FD1BFF27FD11F87DFD3AFF7DFD12F8A8FD %1BFF52FD11F827FD3AFF52FD11F827FD1CFFA8F827F8F8F827F8F8F827F8 %F8F827F8F8F827A8FD39FFFD05F827F8F8F827F8F8F827FD04F852FD1DFF %27FD11F852FD38FF52FD12F8A8FD1DFF52FD12F8FD38FF27FD11F827FD1E %FFA8FD12F828FD36FF7DFD12F84CFD1FFF27F827F8F8F827F8F8F827F8F8 %F827F8F8F827A8FD35FFFD05F827F8F8F827F8F8F827FD05F8A8FD1FFF7D %FD12F852FD34FF52FD12F827FD21FF27FD12F87DFD32FFA8FD13F87DFD21 %FF7DFD13F8FD32FF27FD13F8FD23FF27F827F8F8F827F8F8F827F8F8F827 %FD04F827FD30FF52F827F8F8F827F8F8F827F8F8F827F8F8F827F87DFD23 %FF52FD13F84CFD2EFF7DFD13F827FD25FF27FD13F852FD2CFF7DFD14F87D %FD25FF7DFD14F852FD2AFF7DFD14F827FD27FF52F827F8F8F827F8F8F827 %F8F8F827F8F8F827F8F852FD28FF7DF8F8F827F8F8F827F8F8F827F8F8F8 %27FD05F8A8FD27FFA8FD15F827FD26FF52FD15F852FD28FF7DFD17F8A8FD %22FFA827FD15F827FD25FFA9FFFF52FD19F852A8FD1FFF52FD17F8A8FFA9 %FD25FF53FD05F827F8F8F827F8F8F827F8F8F827F8F8F827FD05F82752FD %1CFF7D27F8F827F8F8F827F8F8F827F8F8F827F8F8F827FD04F87DFD27FF %52FD1FF852A8FD17FF5227FD18F827FD27FF52FD21F800277DA8FD11FF7D %52FD1AF827FD27FF52FD27F827527D7DA87EA8A8A87D7D52522727FD1DF8 %FD27FF52F8F8F827F8F8F827F8F8F827F8F8F827F8F8F827F8F8F827F8F8 %F827F8F8F827F8F8F827FD0BF827FD0BF827F8F8F827F8F8F827F8F8F827 %F8F8F827F8F8F827F8F827FD27FF52FD52F827FD27FF52FD52F827FD24FF %A8FFFF52FD52F852FD27FF52F827F8F8F827F8F8F827F8F8F827FD04F852 %FF27FD04F827F8F8F827F8F8F827F8F8F827F8F8F827F8F8F827F8F8F827 %F8F8F827F8F8F827F8F8F827F8F8F827F8F8F827F8F8F827F8F8F827F8F8 %F8277DFD27FF52FD12F827FFFFFF52FD3AF827A8FD27FF52FD12F852FD05 %FFA827FD37F87DFD28FF52FD12F827FD08FF7DFD34F827A8FD28FF52F8F8 %F827F8F8F827F8F8F827F8F8F827F8F852FD0BFF5227F8F8F827F8F8F827 %F8F8F827F8F8F827F8F8F827F8F8F827F8F8F827F8F8F827F8F8F827F8F8 %F827F8F8F827F8F8F8287EFD29FF27FD12F852FD0DFFA853FD2CF827A2FD %2AFF52FD12F852FD11FF7D28FD26F80052A8FD28FFA8FFFF27FD12F852FD %14FFA85227FD21F8527DFD2DFF28F827F8F8F827F8F8F827F8F8F827FD04 %F852FD19FF7D522727FD17F827277DA8FD2FFF27FD12F852FD1DFFA8A852 %522727F800FD0BF827275277A8FD32FF27FD12F852FD25FFA8FFFD07A8FD %39FF27FD12F852FD67FF27F8F8F827F8F8F827F8F8F827F8F8F827F8F852 %FD67FF27FD12F852FD67FF27FD12F852FD64FFA8FFA827FD12F852FD67FF %27F827F8F8F827F8F8F827F8F8F827FD04F87DFD66FFA827FD12F852FD67 %FF27FD12F87DFD66FFA827FD12F853FD66FFA827F8F8F827F8F8F827F8F8 %F827F8F8F827F8F87DFD66FFA827FD12F87DFD67FF27FD12F87DFD68FF52 %FD11F87DFD6AFF7DF8F827F8F8F827F8F8F827F8F8F8277DFD6CFF7DFD0D %F87DFD6EFF7DFD0AF8057DFD70FF7DFD09F87DFD72FF7D27F8F8F827F805 %A8FD74FF7DFD05F87DFD76FF7DF8F805A8FD78FF7D057DFD70FFFF %%EndData endstream endobj 21 0 obj <>stream +F@1_@P(./Kuz|QDmtQAGXs=w._5;4l Nj[/%;R j0 G* \ʀ|U@PXv (޽J+r<'Oem ()}GT+B-Uyeӵe2OײӪ]z%&\2fҿSRP! ʸ D@K ΧsgrPP- 8\5fc'`(ſYjEmK ].1EęjW+IHMJzӍ_=Y6Rp_)y +UL Ie 8ïnMK'> +|?)nyz/>@6k=)>x'Xh{lZS?L#ZfV>8SoAyojKtzx{l/-7O @`t 4_uH{ůJcJv_|3QB%٨dSc~벏ѭߧP+z@M=;R'׿)t|5nei 2g/ *s3L[tn .ſe5rJ( w?=}lN >2751~S*|]X`Mpv?9[ip2OAoj{dוQ"!!).~4zlݚپWQ??c?Y|dէqϷKM=8Ks#YB.'j?aS'$pJᐃ4h0?>mwCSG36FoY2^{%7%dEqɞ"<X3_ ś۠9f~/SusXwzoƫ{ycgutk/?_]ڝ=!ΥGјg,?^~ZmR, *W#]ٙT8d|u^><$~6i]- 7y2lֳ|tOb<-MJωGVM@!QGG:o=#?\iU~[oo|F m>qk/ۼ-o:1#)SӅR7&fow-EَCb{1'?Ј:Ð$QӜџ6~XJ~"\V1̲VmW_e?SzY>n&kq{+N$7:wuHj?Cag7_G^|:dc7sR.Z8ԊMom.=*;um\O# 6q1?e\#x} \)׸9Y#{̃la( ;>Ic~~{0B(3]5kOb/8; )$(;>,o(bO 캫qۙ?!O3ׯvhL0Vnͱ}hCa֬~+dլq{`/.x!I/Aε5:=¶@rQxg*Eg$Qm(W/giކEg2FǪdNQ|-rx3ApF3z$N[\.()KT +I@%9zmV> QrrÝnh-0MY< c{yn쪌߬=-TY?$Ik_\px_8La5h>S3 E^)\ͷ ،7|޸M?ـϺ-A/9˵->vذk,g]v,̬mۤ3ݚn3.jʶV]gesZ)Ǧ +GTg믯Q5tޤP] {c+Zk]̛(̰2(OkB2􏷢u鲭)O._-ak-w׭46r-$( ӑ_SƜ[mR_ s.D8CߏYw n]j#^h8 y'5OQ+`R5&[3µ@j4Qo4(^4‘^)y?B,Ʀv񋽱C8`5gI# Q:^a}mhh}10u4{7< @ӰLL !#_HBmnpR_BWJ9$g@ h&h+p;żk5!q+ouݡ FF?6MvZK871 y)$2S&B/e@)2ggs[/#oVPΑ)sXhFI_l%W}I ]ue_>m}mNd݃}!-M@KF<쥵1<׷I|Q>˕>XȌ߾]cԷ̕/3m1L00LrdvE)&GӉ 0uvq:*D`ub4hR,v5)A_s>UDg%D U?$eq|[ ALA4zsZd +stx[C0FmyϞ125F5\"kN6AZX<Q'|}iAC.IB5fCo8ڨhxNcR9{6nrFBg;Iau!XzMKS5bOZ/Jf,2)T-=Vj~Jk svs[v\X|Iv7Wu +6澫-'K鮦,bqP6m9-tZ?{McjZNQYQO>jx& z;U}\~fF{-ln^g5ޣ6ftV n(AlqWm'[KH Egr4G-+\7>+c޿8:0>]гx@(u*[GA{ڳքrV{5尪4YaE.-`~1aFjgm|<R7kU牜0uEImDjp'G5qtf2 CnwkCruSsH)m>gDSYrQE;Ry gZڍvgԻ^2MaF͉KP -aK@r +C1,!LZieT/^kn=My+ tPw `xVBfd)N + EڣuE4`ꓖǵ j\Zhٺ2DmGǒ(Ux;[FGxnfӅ. +v# GtAҕ禬M1^ Tf͚jHn!e=Xl%^Ơ/^0:ƱD$\|_jU%?MbwA9ި3V*Zx7#0iȴ AŨLtR[32N1t~R,QF P/ w~O2B% (ͤS)Qװǝ(۴nYS=kn!gX2[aeM7GjkMTϱRdLj8H6T)`,tPv&`!0+~dhl6+&sN0c`u-0RLׁf9~\W|d͍T1HjHOC˶ W*^YRI.c/_ })@~r j}+J^< QL{Nѻ;㈚;T|bo`5$g>&N%U@)7!@T-+\I8 + H_rxۦύj 2O uHIfS#*񎞿Vs<C6~X8$Q(f$<#WM~KM.nM 7 x H0 \5`v{ %[(DdfEɪGP~oKXpv6eWE +qX#ݲP';8jF.,<,KV=kZ6EXt*Mlrv4Ю0E{cP9{R|b7gƯu%[x_%#ǁwk ôH} G JV.3uf|JS%[.1rg'пl)g<.G #{m5nn%ѯkk]YH=p\I9JǰvjkQAw _E3=l}S8<{uW&&`pHb=9PY(D̈́1,ij"!F!g\݂3Ҩmi[?D`1iiڼ쨨{At|J=)6ע!놟2zƻ oQ'L\ˣ +j Qs1\z5kGAJ\X:C(&Q(j+'ݮCW 2kVgu\Q_?=[n ?exi;[mZW/~usTYNW罒!CT ŗ7,vA|̥kNMٜ5G.4.'k:dl81](/@Cvg?HV9` }N j/je{g"E8Ip"])gUOW~~Z&E`P+ŰԚ=b=x]EA}G*ι+vPJ8,?8>/o©ϫ4Y{>o?Z.خdGg/CoF9 s<7xjp[g.]tTR s ^o}=GWȍ[m35d()@Jh/l[Z}9n|i,Τ}=7GYV  d..Z4 U/82( ʪC^~n=}zpR¶tnovkٺTX[]NnZژF橊 .hf|vi!W^hQ֘}X!r{\btTԓȣ4ŻG]ਾ 9%qRיC:#۰`ZkX;mNzWF9i'aXNH}Kb`wϼegQ15va(v!mȖ +~Oz$G}GS{ֶ9}r-i j{O&fv1U2HQ7Dò렽i?:#.ZNk$㖖S,q$uR3ګJanv2FӾXּ܂򖵬BYv;Z@Z%fw~m/%H3pY>XTMJ=I̹NkUF)(H)&'>y}"zšl#r3R <3 ]&㪙'WkDli^Hx̑!> +MէQQ-Z˰]Z0VהM47`-) :m[H`*Wk63z> ~D9~"*nid>f:!o頩Z;_Ӂw3U=&Z|Zyoϧ,yū|h\oܼ`/kGl$~Et[Wa~_l693]ï]֘Ey7Z^K+PQ;lqe/Ҽ4|6mpB$E@nÈ]OU^6K~j.@\11v^qS_d~EoE2WuPiZ~̻F=.TzեQWZma5Sgu$0opFbǣ:ظ=@}^%](ě}CsrU& &&w_^nz  ;Z˲k;b͈8o ]5d5}*+ mr" |e˝F|Hr*F{Ya/B">B-sX͡Β3]KJיz +%V.1SbP20>^-[ CרАj[D!Ԋ?6]+ilm6|H, +OW}Vl8rtcaz[~y$z&%.q ) 1E5VD;Xi ⰾ:O~XUcM5lX @hhXM +qic6w`IޠIeQzu~ snκb8C:E2R<]7E}oT&j A=cT̗T]>JGj2ɧ ƴFdL V9!AKC壇\ +Oognk =ѯFN? ߍW'^׎uS~F}Մj8R>G=[2\)y-dkOy*.;%{^>~[ f=uoW˳*3,΍ +/߄xjmNU7*Wd!ZNRfR#"_ buk",n d:zJiO'[I)~^]|5[[ $App|UT{.-l\\ AP"{8Sao^ElnI)~O5qkvPvE൮ >,v *l9$ njR{w99_ɛV3Ut[+.O;_Hܤ'0)9E cՏ<}9[^%@,4a0,ۺ6@:*5'gk_m M4Er܀˵}dUl"x# 3j'-ʡ $<-U"q+~}ImͿG_'7%?<֠i +Oа,R .)_%%o2=| +L?)6Dc"5x{b=j93Y'j>^2=DNV:X&>~H j]ٜ=]vvN)FDMcXkGv9Œ]sY)-|+EdcCyu6o׺ͺAmo1o͑|uʭ r,ҽcak`w^N.iN|g6:k\<0t+<;h&(gv>|yqwd1tƧyE-% !)Sæ'CMY^(j㻚;:d0dx0$#yy>C42iF͢pkRnL_@ɳƭ +.;RT}5<:Lj:ha虮"n"o؁NOOvhhVl[Mmo]c+] $ [e]M^L{ɮLى P9N4vw7z0[n2^`ٟ}??)C-_E:e,ۃ7|kp׮.r3~޷:;ԃ`/g|y^=/grcmhf7WT>u޽V2Yj$\F ;|37;&.\Em͌v,X{wt3_cq!xԠKY/_~"==hY ٭vT^rO{ VHZ3N1غ튐]Z8j&unhv<\%q5KM`@{w Mw?ZfbUUh}DRg~_ p4Ezh.u>8þ/;aG mbYFN=M#,f[>F?Hj,kq3Ƶ2&Z [ +ZzX6׆n"ؼc(66t;_-X|J%FqWp/7J^6WtI FxiҌu qZ>3vW BWVyěm$~ Gy=^ :]ԥ>ʸRvggF6 Gi"hܩxͲ/zmbrHoN=?W] =qK_VE4k]8>P$;ڸen&ʇչm`xT\nu̯F2}*ybDY%֔5" $*FŐ5"ٗ93cوұuO ‚=BiѼnt2fve\cZcŒϜYevwh/AΦx,B{R&'U -|Z4mTUA˴]'Gl(N}GBy>j%ko+2l\` |`.dӡ iݭQµRL}*b#+ea77VRhVegH3[44'asU\ϔ^[XURW숳?œ=63t7}7Pj! #"sNH45hGhvihQn8wf>nhfnxmozLzrkcU kO 㐔TTDC*b5r9L,I &twPb3'K:GzP#fۄ'(e/+ +\a鵌y4o2r?CiꛍվrQcZ՗jNƃgޒx==Dhԋ,,y-M[seRśɰٵGGIoDNX{NBQ%T0+<]MaVj[{bU9I- wc} C_AOΦ#}vm:[9ɽ +$ϓCGq3DŽ]FŅ"#Uڭ#Q"*HI(b΢Eg~_ӆ[ =fMַORUy?3Am|p_&$SQPʉwXY}D|T]7G0Mo'8mzY 3'|7elhE.Oo/x|@}yNΖl)0q=ը?_5q:ŠyX NŠR·; ݎ%Rn IhU_,_(zY{. |)\ІXW[czra{ +MwEQ<:evb&z^vD(ć &- +JBWj/o! Ot!uE5AV=@R/ǝ:ohXd,_LBsB)| ̆hzv)kKHV`bkljjusty6oh~"2!DX˞%G{:G bن5/hg [rECQQ/9RvNjɝ,f[&3uo0` +AD=0Ql[ѵ\sflI< D,Jz zNN |2v! +zfڲ-@nvcP,)TV*R衍 +U lLA]h(k\@ I fú6k9޺k탍5}b-g+ +X,Ôp ^?0L(YqEis@>Ad@9 + F T^Od8'28*Xj߀j#w}E-շw,y3u͢|joZ.jKmN?zr)*ia>@+ .g@"\`Q]JsPI o+f+;F\:5]Jit ̡ZdG6G윏Wt?h hm=À^BO 4f֋áXU0X4+tzpXUwVeb>uz싺uXrWA0tſ&=)2.1I؂3I57lz)VLVMvY8l8&;3_s}wg&$`Gm 7^z9v0J7YHwV +-[ˌ&O\oħ)xUcOd\Qaa7{{BFqS/G> _&XKTV\օb/붑TIķ"92~[1nў.x߬W_\VN{Pwݲv!?MoQ^٬I7c?A_WZoqLEuV/q1/Zh}V~`?rumG*vmT|u K|TYHiOWWcL=֧JFNpվ8 fqw3w@+B7IVM.b6r ƕŘiAwь@V#a++e)ب[=ldu g7^-9 o`A: 16lά1 5 +QkaU +San{j|lj9R+S8l{_ 56sLbIzkf̩NˤIPCL+Sj_ٶ K 9@㊥ΆȲYTch24ôiϹi0i +?0ab ZSa?k#tUGcva? ~ߦ: : JF<7K u?u ;eNh^ +pg [d{aݶ+N5DRͩDw9ٍI3kcew&ExXEŭ 1 &3@g횠HPlM@F P)yQb.b.1`.h`, +MkvR;{m^I7oH>,YɌL<8\c/LHd$=Rv~R"#Po% n@1 P(k}^yb%A3L]T0aܐE 5iBQ\NևE +[c@%j +`c Ā; MIhiz,$ qpòˀC@׬gvA4m%24.ly}|#:~Wl.gפ oS9_)9x@o+o1`z*\hXwKkh +YҩV--iAC-Chco; JK|Z|EngʏR Rd98]-]k0 +dIxd<@JG#Å2iRlbrFui&iO9S_|\4K'+Df`RvmvI?TH\Yؼ j][$eJnY7[$4p,jjw-o _ _~O,߭*_0aڤL4&[2%P[ }< +?QbMFc_u>(Q\~ȟZPLc 2c^޿r׏JZ][[d7XV~w-.^ʡGE1pqf-Sڗ--˙NqW^]]%?QA{o oVlz]DYٝ<ӵ% f 鄽ePO+Tۤ߿KqrHa'~br_eqg錪VIbFwB""iрVzww~q1x~HG ɶ||nu?eov6b59.+& Vv[Cv>f,k,ӯC]1bŝzFuj lLJp0u8:ըEaܔ.?#` wfcs,FfO+fߵzsaY G۩Z^&~fΕ03!:2c|(W` D;z;(r`B2LЍ,uEySsm>sɋ_*~աb?„-ѹ<5`wD=3v.!G{,>mrOs.s5[jĽKnHoj<ƃ}0(9@HN NÿZWcq5<j9" C}eƪEfjl-W~b^ŕGMڜ5R}ѐmL{ǥ7\"LYʾ;8T]5v̯u?|Lv0`! E +[bd+l:Wh;te Z>^e!]z<'hڮMXt4Cz0tk\1˲'` /qa>[Dww[]USR# Fg9;J1wSn̿{s7]ǜ $=]$ er cef٬Xީu0k5{CAһ$Фٯe棹滪O;4d R2t1ٕ!^w&o:ZV/En͎ m˔^k3ʐ,){ҥvx({)Q-nEdj+|BІZyj]ʪJqe'` +BmYؕ惬]#ž[.oٚe\ld~1jiA\w%Z݊ѯ`频 h1.(஽'x^JF͢?zBhgջ]ٵIn\y@xdQwhE`2Wt12ȋ|dgz|tg4+ +!ZVݩYezW9#n<'ԑ8(1(M}5b/-qZU[nJ[TwXĿBmv-tޤ3ysx,ۇ~=ӺFa + hKVXRgMUթ,>g.Tcζ2bp`Kڂ +0ڬ\b;7 '>6OJ:/[Bf޾0KipPsUNRtQ dmL8FHDRdPbkFtT;a,]Z{բңtþ=LPbVlWZgz GbyDv*Yj1(77^q9צ2!Ɩ 'q~(!f*fe:sH^8LiKM|tvN 릶k2|\n}a|ӸH}~$oe֑XNezq)+P.Q5^$QI\Ę39642x=?]b~fKyW]Z'Sثk-^[fgzC4рRTAȓ$7 y$ ã^KU|i~ʠs М !n#.廔wv쑗 *ގ[aR#LeTvSmқ>;#ѓ0W+{]1d1ot/gLL@>Hegg, (nN]ǻ]!Q;hW֬5r +ߢzS^WC@ ?G-1[p-wqŊ8;Ϥh4( +u3#su=Q.{] ҏH,nYzZr{#,YOց +Sc~S^f m%vF}Ho.٪8Pj>6QtJ +s;CXj=`̥}I.#%`iP񼚦f"vLe (&ro.e;6t>D!]*UVQeaCڌS WnTA#**gqއNr0*+3hU6ϩ9~rW&T@*;W4ȳy B a /Z{P'^-k +CeRW!3I +uV֜jpA=0@'XV| `zgYɹhFY6"_X|E`6~YmCjg +;IeLVМZ`r%p%P"CV)`\J A^p]^7ɯ )~w{ɻꏥ 5dmg^_ӷtW_d10qGJX*2%~[Er(vR"uY@  <D-@TV +=L3@ ?ec56ttʊh6Ts_o[1,&' (+Iq':ϗd$}R> ]Y@FB>A(r =@.MqOdXd[$1@R'39"]s4O䔔)he}\df5O %:{KN@[-@ZH:褲eGڂKZJwvjA1@c`WOBi4iNz@=OG@-74ƽJrs0mJb!:t'VfXf%*%5WH9o(D_׾ڦcI$`zS0{Kp=6[6:̪w̤cgIǷ'Ҡ^iƱ^qI#Y˯<+G:;՟j>5KW6c +8Xܰ;Hʐ;ˀ[OBm7BY\k$n,6\n&QU}"Y^`?0iZWWJw𿂀? +WEW~-f)q &];PF4J5JT续mlFw=/nr-O>_鬟cl>xHG%7j{XBn2]屵_IZm\/_atLl} kXi|&gly|~\?-RL]݅ zg겍Y)k2U-˳[+,[t)|=8R +ffJ~ͫ>^^+rvRd3=ו]Q/mVa}W/6K~]<Ӌ(ROt>hJ,3ӕ!XݪrSm~-t +*CV Z~%kr/eˢ>VnDli*3%7ٚO`_3>:W?LakCrmd}0n~^h::N}kU?J3zBdphL=ML8>8?`_IwLW  ~NtV.wt ha&̺pgj+%fKEM՛1֍2~B~c',i ͋JGXלч/g\.2֣+P.flwc8A!afY/fZXk7k&!蝿f6|b>OȤfnm^=4m?CZ!HzM}uwԩa^LuhvyU,{?Gvj>R[X z"0s _J_gmRZmDz݈c>ʥ? +:CH̬"[P}'eU=UCVFB^]^=澛σO*i[Q# VO旿/,WeFuF/d>e曕 Sʶ*>C&s +e*? ݕ!ta N~/Fm{G6y-OVXfԸ&+cUDԲEL?⚄!9:nj3:T=l\T\9,;?G[ܜy;ZME"6$dMth"kZnQ|ŠJYXbw[B^MN'atlT(VMvUby4/ NPvKyL2lh^Y&̨Ʀcocul4$K~GS/Шˆvg{ $;|{utң\kN)hŖt$}eAXsm4Ʉ1xYqTjn2K]mi-ShwrȤPg) InNk< iA&`'Emm/\1r"ɃIfD<J{e`[^* nX(åωtԔp͛\'u%p;kYX||3gFdKR!ĄF- E28Y\J051b#O챇nT> +l" Mf޴>y:keA|Hr:,78*pw`$/+Y @ѓ #h2HóC@!@qqU~+*(sTfq)q:_EF!2m&⵮I7+ [Tj'P OV'0GNK-gm;9DT%?#oꉿ.JaGO)W ko鯈 sw@W k&`t`3 +id%m#(`2 +ݱg +07QOǭKg;|z%X|o_ /o|¯l*e;0C\\ܸ-vW͞,5vG7͑t!yG4+ _5G|9Wzpnô Bk4* +k!6C 71Cm/QX.,/5B.Oj+~U!/Ȅ26r= +쁼c@+P((_6 iprS[ɄC*XuRCA33z Pj\CWdyMGzk*V+~}_1? +qs1ϨNW Z {ӹ ݌0Bz6F|o)?K˵7e Ub@ i_E3ֽ8Vsja_?Gy.ʤ] J$(IAE1b93{ږn-UVQXW_Y7xmI}nS{([zW-1!Y٧g+]NT6?dn* >Rc?m]o7bW}x(l(-+BC5NmY޳;)~3M_onk%=}fwb5]'}]w +=ʇX*w$+d%N?&~݌IjsWW& +/wpA0whjzfqVKu'YE5oIwMriԪ mOj&]%4ntiM?F9Gw•0{1AZ6݉ +fnjBZV*퀪5Zi ZlI52{_VڛO ģ*6XN~0xdq-OVY5WX^ ZMXm8!v@x_<-5B7GZW6̽?p ꤀V2] %[4nPܤmX2{3|u˒K-r~II@6~%9ߌpC}p..Yz.ÏgȌj,nS?Z"(r-) &q<0##&a-йe==yƂE[9 b`-uCrټ_z>=r9N15}JZy +9*/fFRiM~M˨#e{0m-PY#~;slz[n#3zDS 02?0 FAHBr\T@D;˼Ag1e|Ib鰀Ȓ9@H: d-J=emϳXFJJrEB-xrj f26ߓSr{ +*lӧ=#Um=ot} +F-fi +~,ȴbIʀUɌ;eJ^طH%n2Y@P d +PO#OR ۝zrLR_tJON7H=7J?4)`9@ZY@.[Q %ni6Pr +Ez_ {@>( % '1 +l,z;J/ @upH+a|mߚfPGeZ7u@z%@#kNv`tt}Ҡ=z&>8t _ԝXS&-_A+FdձhO4:/؀2/+6`r!`՗3`#|:f#433)Sk0dF*YY4čJe"ז)5n}q/Y>X\?y_x$k ,%.`g`ؽ.!lE8\Mnp&``=Sl)Z;iy|u9Căs36X?9&);E߽$>\|Q}=,/@}  de3|h֛tcc8ӛ}0'V+IyTYjXjJE#/BuZ.u*$q]䏁D OH)~.VeY@\ +"qYedyJ /i4B|5ߒɉ8AI)-+%6I*u@A((e +e,e{>1@q`Ć Tμ޶!n4Y¿JjM''oThuK@K2hjl-֭mH]O6>|>syu%Wn/l7w<޹3'yb|!jϢZXCu_!x/7pv:xyq%O^Y8k+wDg<7_]7 +6I+ۯtvCvpCg:^-[7(vs A'"ke2^ >ѿ&$rHDHpYnj:쐺p߬2gSzXzkJ*"$_`/ru{QËy3l? T>].CĵZnx8ۭ0.oƪc= qܦ|v@K-mK׍-ٳPROŋO3Qr? u-R(&Y@㉽_SBy_GvXg/ kC||8%ڤʪΪU*ɏWh=GЋls~fɅV0[ky:?%㽬S6;ކf ob!k9$*ma[Y)LKba '2h NʕnyAy?pQgBk{0)>d EB(KIK;PeV,\rQk5S 1e>Wь)yq߰TiZGϲN+yD纹.*eڒU@t<ASfȶ=h *{-m攴͆uհČJiR6O tݑ6|8T]]kgv/2s|e8le8|p%#CZ^ieJYbwrqX.o)*fCBMoڸ[`ʦ/7/.h#⾴l8=u$3[3&/XcD,$#]>:ڻ䵅G&꺭Un3Z*VW$e{;t˔l *>.LS~m ܢŨi?$ 8r@8>VKKوQ-* 5q4Yw#c-2E^25X4 %_WtOXzܝd^ WF@;G-Q)(Ue+O#S?zq&:2ubRsӼkɴ\P,!T2(gQj9+w]WzNPۅ"IdKq[5:um`lEOX3P9΄"A#UGS{ԒVUZҬӪ7 bk`+d傗93'BoAV ^PI޸|5\G樢OF2 +ՅG&2>iL =-HKK}H)xT\ٞע9]2 rIaNܞʧL]vUh]k0X~x~8٪՘l3>/{{Ng궺7uCdրib4uNJ8XQ17 07;X9 럫`-6 L5F;)/rw5pt3 Ź a ,߫LӴi8 Guߤ5"{Bf:nn_x m(3&qQf 7vn—6Ru)"Rse7 *f:3ld)9K{CY.7p4agW(@Sd/[%a^!g7 4~-ʼPHm3S`[CgyCF}AfZU5QuQ9ʜ~b֘ZTЖ./W=bSՂɡ"I1 d3M?7?>#u4ȫ=0wf![XaORPg3S+'}CCT) gI⾋}u*\n +7pl'uden˞xŨlo| +ϯw.M摣dqff6n9imԡ> PL~@I{|T2@mf%P פ~{L*낾Jҧb~4xdP_?0d8|^*P6(ѱ(F[kή0 m ƭ6g,s`a ?US^w[8VpXRл~J&⩌KUe8cqMSX:=p&C&~ +`6Rb-Kƭ8E^s]4e.e|O.˩Ɋ 2Cf5(g+oi +/$m6pW7$/&O_r|be>*N,x;J7 i +p"sq5JԪHe@ēP?Kw7)[ydiF +}F:LHe?xٹdU,@L[X @~, z+ "Q.I[ E g̦ҖN/F,F1P}[J??_94lQ""_BT$IM dVHm@G,'ڊ֌x/!a-@RKU$8o1R哿Rz$ߛN|,*lE*)ڸuD$hĈ nmW4ʃ\@En PYP/fKTrUojD->ě*=PN;>|JP8WAk~Pd:z*!ՙg6uעGڥv]MJpKmEVG0܊8)G0>sX0`ʄ;*FX{p= ЧL+HN5XV;ОkgϭM; +1R +%Ox~ݶ|5l8l𮞀cpV{| {*-`,g'jtEaJBI?0*5ޟqO=R_Cy| aɂi_ny>x>DjwN[{uWJklwt7cb8Ca˓N%߹o351&6i< Db@"ΰg" .7 z;[7U+ 5YIo;G?Pi/jomSpүU5(+uuu 5e @QY*;w>ʵ7zKjߢ~&Aw7o76F16Z.6AЬ[hc RWgu5Y},`b(%Oc\Dz? o9͙Z:6+~0_7>Dd:2/di~5;j+ayX,݊ZAa)P6ސD'Xl% {>U,D}e`=Te; 7xP&]`/G˳ۛ,`Pw<7N,wk>mL'?^9F~L-hD:?pw&oqLdo<7?yCjf ?okvKVXʋ5=VSoH3]L>q?z&V;]ڵͶ-8Ru=;KӇផZdI`RW&*^!$3_Ҽ8|{V&xl>Scc9 +~X'&~z@)thoT\ׁ9; dI:4E+li[R-jFoxeq<:[3~ C˸W#R{@AZĔf:YWZJfZuRКUsUd  +UZ+z.7Ǻ@ wX]Pa9Hj$~>>aZ׿8XK8_߃xM< /r=;,.} +*)8"{, WJu59!ÓX(. +ogf%]:wV'y~f;҈ ^ 0kg-_`QCdҪ[͇%cH|Bϝ$P9suHIqq]R֫:^da93% .ľ+L9S/ [=tAqx\c_5/=ف:sDpr-AgZ2c|<6"Ű< Rw$$41)>ѾXjeni bIuKBϒm4?к!W-kZVS4,2a\67I5g;7{ꎌ<44?Zj]U6 *vǏIv0aBr81:^P*⭺sԑΆ`>/ՌD4I57,֬k:rڼN5UouP 4+H)bܷSJOnUF/t;伬G{_gxm@\xYوRŤX0ZwI歌yUW];zSw rZrxH-z{z<FMeW,<w!@,﵃\K=><99Ńl\:Q/SwխV}Fd&ᤞ;=UܚoXVo_ +P#P^a!XƁ2S8( + :,mw,Mhd;^мKPcqpz]Q/lGZܠULM3|QJ#+#e [nߠfS̬$صeUTFؐ[Ғe> X*Yj!1 R[F,b.JYz%&\Htc"G1spmZiA'Lķd5(Eв0!18 ^ _y.9jحi,LGOBnM6DfdTa T19tPjأԤOq}U}˫"zVk Ls5?p_rx'i d;0y??ꮑA w#>2ߛ)KX닋A^ƌju=᥉[e~Ls̚ŘSuUHùbT ~`}BLq%Lzo RrYwrUd,7 J =&P'qx<@Vԭ7➒AyN]zIW229KQfI6l(M~8C rE)n电fCFgcieƏ5@ @+hK_;4v >xsU-fK&A,.Ze8}+Jc{rsy!wr[K6.c72`XERb)gcYM91`f@B,7~/G#^_@@؝uc +RE6A^D /?4Ciԁ5sѷncwMٸ6MF;.8j\ωXZ! qGRXcaNV0vV3<]Ј*QQ ̻G R˒vE` #soG$ p?ox /Og[^,I,a@}@% D8HUqst|@GXYd:]sE)TA*͖˯]{g<_/' ^J;W:'7 8,=O +Hڷ|@l;j _-X6 oR+qc |@tF%(NE|M,Qﭏa-tحr@J )O.(Uℊ7gq nuD"5d1qiG`0GW*N?<9)_(7ph۹X@: ŻR:lI@nQa;>}fw'>MM +cw/_r@FT $lZ|d6<4v9s@T@آZ_k6|fins6UAWga^O-H~CzE:(_} 5$աTef aIdG&3y'Ŵ;4}sNs B$IY47\8Dxs;>OX}^߭M0xVmm/phXoA>l!?Gɭ ^Nu'5uR2\_r'l{[ъCo!]4gR/MW2ğ]2|vBCgJݝ[ >\85 +Pqn;VkFߔqϨv}F{͂Ud-+U7z%|fyrMlXx?80M:GjM4QlO^?SJjkhMBI9!މLVZ.GEBbVCQ|.D+3M+MP3mXg@PwTG.6oojv0kJKy]Cj J$)N2{T v<q1s 2>ǰ 0MșbɪڼU~/[T_o3A rV=yq_ +0> ESh0|TԹhfry~,A"ߢ\RK9lSƈ`ߚWo~}U_}Uꅃ̶/ 2\++繫-b +KaI3Qm V&5'=# 75,-@ )M#Tӊ;^ߘ\Jfbrp->. P;*L8ŝCr)}X||\uZ0lF"+G^"e5v5sfö$j*#"?PsE12hQBJu3gqrv|fۯ}Z)TirG]'vb?w:Dn?iMc܂KSvU2l9d]1aXK]:ДRƑ! ^'KO#yf(̽HNKW][2&iTJ+gh$V7abO=Z󅆿1~⊕# ;OTZHQ`z;?v]"{q?c3AIaX+CIDI3G֗Y)X\Yŗ'f9I*+ ⧒{)tR?ڱf+yz܎y΍>]-g0ՙu Y)ćD +#Vqr^hi:" ȤP+we{& Ll<r7?5$<%E"Lj7)q:O, vpt ,\S~$#}! h!M_yakmނt>/ t8wHcx**jL 0Ԍ%Tt-~ZM0v{&'()Z;k2v򜰚LlCZz(X$xa29X^Z> %TYS^. mV+Ƅ9l lV`@C6sdrޔ0ee[+7#v'n*w+:8q$(C{Z\AQ ptwI>{+S>]`:0AJk @z2tCtBe7ZyNkDH0ݭB@/xT/EУrX:X2"hvE %9#bbœń &߂3oߞ=a6u x>RxWkē.<Wk ky6\)JMtԪ$.L#+OD.w;m\ +=U ai#oQ[-8@%MC TP!.VjT.E9RB/O ov,8OzWvz>9Nw d"UQڀX%sӀpSpe^ Bpa3z MxB7Qpm3t2VxVZmSr {0ABDPAJ!uɔN[K+@,@0Q!x: (vdd2sɡ 7lбR'L^{* p٠I |dޚʼ  9<3 ; +[ (zTթHR؂- PZTTa4R*NJ"}B9^\ Ys+ vy!Jф!D@E+w@@wG y@~-_9`xBdz 8Ehs@\y<d~ O ՋeN5բ#эKͤCqtQ }Wx18>݁>_DF +1+mt0r +0k d Y\s.mGN i' +.3`W In&||b#voe\fdž6>%Nx_mPg?[_TF@ ok wLY픀L/I[ BH$/ bSiIvyGWk[ +J$'"w m@J)D D:oD 6'n@$k="l H|&.\f3_,Ӂj۟ՀP|}m,ug1 &U݋X,FbE ^3 ]/ 橸'6lV`[]QGUm>} +7|Pw +n[!i: ! >a S 掺 v.@aA,f<Ȭw5>4&Iu=Sӆm`o56X_0'(Ndв%+( Ff|%D]DY6Rv|.IVΚ_4>&ZN- +ؖʰAi,𾲮^KMӻتʰs9s +^volPDJr/!;%R4kD?m2Wn^grrW^eG̜ܚUlj9*4UԘRum:Rc,Vul +1Hv.y9j;3(X!^~ {YgIfhO& /%gjJKGǧuC + gm22mAH^x(\` U(S5PsuLUq7QƨRYCئU1yL5ɭRN5\xN44~a<ֵNQj >QC +5|(ɉ~f2tgb$FNE9eJJF~kJ9>)+cSOe+%ױ8LIBD.nnG (j.jtv4sX~k}i>( anKQ1어J(N&hd V$n/rh͚|Ke&-*̊'=YN=w89)[>X +|?㛳GȄ_[ٲX< 3*O&E 23WBH$NT!3j$&n@ +;Vs襩xaq*ϩT{bOГtPy{[ݒ9{_F&l{33eΤ5=%`gjDVOh8{fZVI?Xz3GIw!éU? ^&w^eDrI +]$ꓔ -j&^c-r1ofbƌ7/~3+t` + _X$8Du|ÅcRbU"N<j).:`)}/zIL<|?^dSM)ۈDdo$o&5I_oǔ)t:VV;h,ܑaC g5f;ԘPjA&74@V@ 8Ar[~-08V*(!1!iKHǴuۖ1%=3ʬo rݮ k.q1kr O. T1f 8qV}z~ Ph>@f9 TZ3=iSVGS#Ĭ}z̑%1b[(Q09V>"z0 `p LyEb +iorab}AkB>:,A4=Y,^N-J< +QEQݺj7aR9#2M=d44\=WX]360W[{BՃ`; + qq vX%n,<}(3j -%ٌb)4%JÅf$r*7d;FYs8oM09͎;z` 1d j ^cx'1xx?x~o +7࢑8Y8U`7=߾eT +Lr$eq|I{\B0oyqiS^vw8g{CwSo_= " $C'QΗ 캀Ɨ`/Oߖ|C^ rèbB10Pξ/p#8/Wcw&[Tq:5_c1l@Һ4&qS {fWGē|"LlŝĢY;Jt%خ@Xu؂yjAe8k(-'S*/D„wjvhlŝc}xuh)| 4wlm*Ⱦ|ʦD PL˯ސ[OƎB0 O   H]CҰ n'bYf'QhT0ÇM ++?b<< 2e n/=@m(" heRa!@r+3 }/5oK1*3⇛$ 43S2H`ndkSTnO_t}=рy0kta1,ssi +Ie P$~ˀM@h$<[/^jYE]$\ܿ+P?IzN*c_| +8Zln_)kfq62`ߙ*`w TYL|w>*SW:d^>p6WA%O>߈߈] dt ( 3_ +{+SfprC$>r^bJiIY4YPJ}S?NݶN[˓ =Db "H`/ 2:^X @jU h|'&R"t)x[XJDASOɁ+9HoJ"YTmq@ﶽy=]v H$\֓CfUZ}̔pjY#aVڧn4om"R Z 1@"Z >@\A̋n@l@@,gBģ57䦤ev$k?x? 7F o?W$)nϲǶh@2_%AH@jLK E:Pj%P +T,@ &|FݶlK:m5¯s?WXv9:TkezFum9;np4=;Y.rjmHy5Pk1xOC ]NȡE4PGVvm=ȵ|PrtT>y?b۳FknyaI+YHw3mջVP8-Iᵰ +mf~(Y[?e6xC +Ea +2X>P +V;L-iQmcbMrӧs%>j!fU# " Mu\l\$d3By{#SݯR;F肶 ȴ/Q'{GyXH2i +fq2uÐ,9L|WCj8~إWIRvcR SYNo{ٻk aZ0^K&sMɻ/2^kk$s&;j*(8I>_`WFlF5SY\MZu}nPGC\G^:WVfDI\ W/94X#K(De*9iPV} ƺ}5t[:UgOu֐bMd'Q=]jřJan'^9CgYUޕTv▐cB,h`5,N}iVu՗C+tPI0bp؂жF},WsIAןEkujȄ*X9_`e4P~UsJK"-mfX?MAہ>J8cM9haU_F7fDBnqO-4!ܶ-IĵA_rF|֜=/˓aUxD9Zv -0zw^Xpc}bjGf8c4lo8gఁ*no +'YivF=m:.`> MQ7v5ql'[a9/ E]Lw)>5J͙.mBRBWGR]:CQPC|ıA>ǘ=Jsx +Pc^4lF$i_/zr؉x4.(9boޢ<:= :cY-V.)$],|Kz&6\AC^&3$°1V@ۗz[nHo搞֑D@Rj^.讔L7.{mXbrcEfAU&.=Ņsy|oV#F,5FL=q+'Yy}d(G +&w  F Rt`e9U+;K6qP9HIYk.gsszG-x\:I.5Jj5|Cװ5F]Y=?*Kd-$.qaӺaȁmAX-Ap@A8>)0?\0Jy._Q+Ze\r\Nx)}\*2X'r[v٫,z.^N&]C]q$kn(n) pkgߑG +(@6:Ia[D&/Pyo\ V$#|1lvRa ~b)[,F$^[Du4k?a6]VE`Y T k1M\Ch.@q +,G(ddF2^*ieVb$U 9Dhubtc--Z-7ЫF03|P*_hzh\chY>\az,@+n*?jh|dO@7lߋNVRLH#hS 6:aQ/w_n5u}H# [^4b 9FeȬa<=) +`}:˹ SwC 6c7b4 +p6akOTPl1qo샦L\}(޸-E^LQ= j+Z `l6PG `cN˃p%IVy=eX[y,ZUjXbg| N;}c9g@kF1md$ap{otok<\\63jCX<| vFnYw| ¤}t p8)5N\&YxF^QϚ~e2rs2~ D0;i@ 5 !w{Rb͹#Jq3 ~~>gt~m` $a+*AtقD&݂dbq +b@MLoI +}Q8}0߉ G-_O@B gE5)~*rP6bVA2QEf %-F5e 1R ;nIR2·ۖvn1|\_Hv`(sxQ1`wE˧#V^FFn}8Nv%M768Ttj2EE[aUm_Cwc7cֲ3sWח?S.?v;S}̉]̝nZM;m4-6S:lGcvKto$o\呿g7߽o }o'Q;qQ aߋۯпZѫg~j9" ձa:h%5?v}vTܝBĮsbF؊brM+#U֕V=9I")C]_ 1fEZB[!L떢^f\ڶKyz yµ>OadM{h=A( Iz8{ΐfפQ +TwB"ߐVTœvױ&C=olG/S}c b.bt:~{E +{vnuQӶ b(_E98/!Fƀ9?q$jή aXĸpPֹdi0)4Tzvm֘@Qv)=-aDG&ۇƦv,~-UR)SLn^< +C. R%M},ݾ-{Sjǚ+"2+?% \% !^ncmv~'Op}F0N=pu*&z}i=^Tc!&qB;b^uC¾_GO'cO{OGxOxݼH)r/%s{>v^Ϟ[9rg{'{t[dk{94(D~-?D-/4Of& a9_4CoN7M?5 ?O8)4\Q*o1Qa?M|!{Ep;]̈VT{q Ч%qo9-3mw0k`^fNիyB > l B_w-ۗV8y2a7jVH8nqOMa>!=θ[jʹR|B7;%Pa)g .DZãf'wMl~1M#J1ʺ^X4[c"=_ B| Eۑϑ{aw9jQqo^1^84Ut[/FWmZX-FJ◃[FeNy J17mˮQJ[T֝1{ڠ:WQM43F F7p1o!ݽ3NFD:=N!lQuޭdž$27ߧ9]:uzz@9ɴls/Cn/>1Z9{jHbaog2$W`:)H[`Ϻu9y)+$~˹]tll5ejxƟ<-GFG~)13!5fWCZaojqu]e[fE~6tˣ{.'nݶϗ:)!5 nivH[݊K9nV9^`m=u5R997oKay辈Ms{P[ :Y7YrXz$Xa/-A1VE#T2/J5UJ²#q]WEz_Yeb&=Z7 {+I+ wGѬ3D6#os)g2_)_*3 6p`u'"Kg&d_Αo-%sx +oM?3ݖߗ[xt<&K[<1)D/w1Htyb 'RUNMUqp]E@\SYqʻfқ{11#5/ღ/4['8EЅ'v?886ǣw4pWU(F7#熅/Rɦg жBDM&0$z9^Dj=?F[ct)zm9z'wV +T{ڸUlW>t3h=VrDis{2VKĖlySJw?_2M gxFwX͎QO4H1݋1L{\"nD1h`[/TTa6i-:?$ڄA> twm9(F¿<ۦA})2Ey(wR>\y-˜jbo&2zW`GK(Lo }o 67>9|(K2^N9`Zܜ'T'6{rγWS35lzcM¾?xgT*-_ji]W +no+O2O!&[x.OyDgW^haTNo۶t +afa&>gܸ{l:Yq(VWB7;u 0U ǯ0iFh ptte4 6Xi܍%6f~k<8T*^jZ9[Bmf9KX!{o%5ܗZqq;h C:VgO͂0jB<$,+ 2Hk56Nas+OC >}8ayGV(í;-)k9%W6|o6iMWsb(dc147XLaNmT{R=LFQX'y|ewY]OaRh^D0 ،;#w.)X:-?!tv)@Mcr2F3CȰ4̴{cT&_6A{1=4ڻP5SugI55b^O]=5K<Dj˯gM?b5?_O-5-Fhˆ\Qg&_g H{\u|w ''^=\rBٻ-({6wcc);(Wڬ=zq_O8#a+}!wpT<BY8oMT]_ =n=I@ +$zU3)A8ݶx<8n4-"}SQqHƏDF9ܻ;u6Q@^ =X^!{{Csa(MOd'61OTѮU'hǐv+\t 2xfžٷva(Znl]f!}n{|Q/v!ݞNL/hUzw;{#v&Bu|0nS/_yԲ{/\5ҟf?-~i>RoZco:=Ig'[3 ObpȲUeUWQFOi$%Rƥ[ld]RLL!/}e{<1|k{żK>htH`C;{ [LqWS&57]SĹu/&Vƿ|x|3#e +ż;'ɈC;^<ܟwN>ƣMZÄGQ3Hgz3>[f^zEڼp:i fLG B$/M <4"NZ#xZ~ӅTS 'B flG]s@nmj&k%?DwH$Ch9@WyP/l={TRp|qf|Vmnqa=:6qb0@jSUg-E q䞻c]17HbyJÎڷcl4 `ιpldՆ]_$ڂNpng2LG}0NMm'7l[V 9r#{8=9dxos@cNZ7ri}Z#_ZgwjH!Da<[qx DٝhN5d/-Vq"'2~45V\X"e­rw4KNvʽ Q?SW$$Z{8n9G~/6;xDW\K/R=.~9֛ U-s)A| E#uo3TޖZ Lixa-Wk<)I> ."}u5y3؁wFXޫbktҵ͸-W:PU^]QM.T UfaF?!/Augv'V_$ZCvnnԴ7o}=?H\_u +|52VJ.a-J Ř@7f)h 3 L]. =Wz{ Ɯ3tdyPTCXՖ^ ڢm4;uB!s'd(WC/ny޳WK3R2fvFݏ ;n.oX 7R튈n +rR:gk+RvZ=!_? +!{{=DwEyQ~|'9LlI&fK!u1:,л@=p;\tX1='-gϸ{'pC؎3 "8o mH|QJtT崑jm߷%G˹.(g﹝Mz,ۙdϤ6'ov€`΢FT@A$(rګ{?.ӋʪEl +3OO˰LS>hf6'Qsp\%7twfg#L,%799?f ע̐Koh9bP1俜?_/_1俜/O~u:{-=^*a}I :ܖK7.-H9,E*EC}۴E;$(pe_ mO/3#CEã^t¬B YIٙ"RPp ;O1!&[ߔg0#9bl> mϑ]; mҍ!7~_{X֊J}~] ^2ãf6%o ඒ(3=|҇,^JK$58xXSf%r:en +8 `Fg4J`rk%v?4\K}(Z$@nLWzz +/UgY.io^Us/Q~SqU5V-2+[b7SެC8.,*4aER/Piysȩe?{̹) DE!o {LmTV4{=?wC~*8G&e^A1 uo,O +}g%+I # Y#ˆƐU㖍*)nV i=.?`<_O7Dֿ~Z+$;u'=Cy;!WAEiy<8>mN'ho4!ΨixĐ +uF &! +l7KȮAx,Eln$%=x֍!!rO_|qZcsPַ*>fz+餸O +=:6[o!qqu~7xsw AM\I{E}J +9%+Ӯ74#I+fm}5E60EQc +bfKk>?  +RjP9QAqetzc"MO~p۾#2_#^~5d0*LB0#n0FtVݟC~U+mS]U.9ZNQ71p_XQ+Ltgv1Lb#(ھ#lq{ˏ3 2ė7w{z73(F3Nb,*ULjf? 9yؐ0F[Yg.95:.]nZ,ţP*;,HSȬ^IRd}!ݰ!@pPA<3S+CV{B#(ݮ2"ER^0nȒ%ӳ̣g$w>3{|=n{S7ѿs5]eD<Sp &۲rKbMͱ`j^*1F`y^ndC;;f:=&vXfrĐ{%%-nIJX*CG6I!"}z; / tu#3 mi2A4:+ƲRx[w~K]Fk"$YlWi||g6[d,Ʀoі SeNri}wnʙ[ScZsZ^ޛÿ?Ұ +_ͽq.vcl6By :vKSTsr_vz7fvk9-[6QcQ0Bp-NW˪^M/-yuK3 *'`.,5`^ ]{cZ!,O'JN9Q9"֩|=idSmg$۰~~C^˿үD G|VW7/Mx-Z_'Kf=P~i~oIP{$)P̈́E&O: bnF9AmWrDߋ0:E =T2F pο(gEW Jօ B#X\+~ Tj cF񛖅ZᏑ:e}kE ` +\*0T*-`\}77ü܃C<|WNh;|3+!htڈ}銔L&^;XZn0| EU>S ]`㇦"MJ+Jl.a?Om3ђu+ +EEV6)jr4dZVv}+*rte߼)N,S_OXaxmo="qBgPzdsmp7-o{KeKO{R)kzX{TrSZs$!o!|~}(BQJc{bϊ`#*Wl_7*lD⤸6F c4PO qm[ /%@-I}~G5 HZo&3۸ ,񐋨ں|vua{g(34^{:)4*;aRrNos?DĸkӪohp@Z/U34@72A7ǒ6ުVI1*qeMjڥW'Dq:S_Pg E5"(Ӎhkgf|ʫ]Zy]GjȡdH%ȳ=5t^]XbT'rn# +'(Pr}c=5K.8RC_r Fr UUd}K*kw7T*/p,FFimav_ڿD ˏE{נ ED1 Ѓ᤽ڷ^yӻMa֗ך= y;fwl+mӬb,/__"(CqxK-v7T}d]F|RB'sQgEnքSi{gբ5ܲm+gv1d&3{Vn)̡aΗGy59gC&k SD)r渽nVpF#fuTRk;&7N%b_~C<`mR>>(&g΃d"ZD*Q>rBo~l1zo:Q}Nali6m UCt"a] + +|5E;Gٓyw*0zjbdR3"f1a֟`֚^s\mG#83l˰y1W_PtAQ2WQl? ^ j쎲HτHty<:5^>[+oͥ+׈!k^9q^,WLUmq6W}^n$Cx/ +-ΏZrԎ!5T ҉w(V}Bh{&c{,տS U@$Z+n:]ו0I}<-f,f3=c?ǁܴi)20ovQL3>@Zfik&[u阞v]0Ӓ߿GNA-kw5O< Ϩ{u @U+]>Y09$ /Đ?ο@zT Ss|^}sɍ9zNSV#2ר2H{7"ˆRʪxW*vXa o;{X?v-+)9 VrȒ!Fm6ō{v8}tO%I1tϞ^MAu }[wj-uɓL puQn۴'⟷f\BǹRjYAq/>iEmx곧iMH䍯lӨmXniKYtW3; +65}TsnjJJer 1vSlvIEb$nyz1N}kBrť2R[J;ߌ֘8ysi~51lb B :o&Qy.Ԥ)5 eTkLWX5z65ENݎnćN?Bz!Z4`sXMLc}z j*;x $Z>f\)Lw k$o +ӹx<霓k{ 5F!(M\sOjm}kxԬ]o]~%RO!* 5a{ȿȧ$o=@Sh5K_4xYoٳ_>sfdGL:zEL}8'Oԙw+}SЄ=+ ϵKohؿf /'Kj4co=w 9S*ؙpEea +1/?n8I47F:O`U`EkP'Ⱦ_ e0fP^ හah ׆4zyɻtC!o`H:K|"Y@^[,xX&i=j,8z{gwaY$/14pA,W \ڟkȄ +{}l\gC\'zhY)gWO]Dyz=\8ȝ-/w7C2}ZCi$ WLM^:'YJ!*A<:AQ8~V#o;6z}Np[l5&q{/Ym\9wyݙCwoVcNͫsoI:15!]rV3;}=>{E˜8FAw3]?"hZL+ꭍo5IJԛQ Tޥ%B!ގL;=o`PZ1_m72 TVxm?P2nj-s9dz2׊!g9~A r߷Fzwr96|?6l/b_끻a+mnxx4me,ñYcСA>w޳Xlg3>!Þ*r5PL%{M-솶7C8l?#zQc~66$#jtBn}Jy]UiF 4FPU9+5,k?N%=9X͚ +oϚϰ +0ߝ"oI3h7gHalubamk=YzTT5C=gybmݿdASvuY;[R?f5ѺٵzL.% M6)S iN+`,lyw N_fkF1+(]ˆ+ց[V. <6ͷ #{vVle0zĐ +~%} +R:C%(-4ɀV^.*$Յ@SK)QmWA]Y/8JyNȸܬ#7tF@-Aben2oF`Bu@>-gY"eƇ3i:ؼɳ qac,|$YFwqeJ h[vFlΘ+zzk~3ywisG (&p#4eiq$~ړ.&.T湭^> Hw!Dt())P;c 8+O!*PԯCuyz ȘIcdZa75N ~k +v5X.*9/>raeKc[x> +pm^;J"_бCg^ٟp}9M}?>=cŚPZg;GAf3rկnrH}yO Y[n5r {zr2#SWd]2 1;Of&ؖKN}ܒG +W7v %]~[Ou,vrֲjK¯C#2]0Pء4^ _*u.tSR=ìZc``鳱0Djf⶷v䮸Wjhu>趓lwJm +bY(|:{B p;M8u #g^:K +"wML)B >9G|Hk6=Eַ +УN/y?ϼD'X`@YV8w JR4npvcB^sD45-&Ƨf!,1߫=+D7{qwzI=-RL +,NKֵ_"4Zyt AӾq=b,tD{wwCJ"LWrqDnc*|H㏶4Iyo1RQk\H[9 M7UʮTcRHef7zqABG=]QM ){"Tv2kK욘mIlBT[ҭj7 ]/g '[&]k xVK騧30[E 3ȉb()y 8;6Nk~-}lˠܩ|_' +T5U1V9D +C~*Pjwf~w#Y)mH'ڠxkdTNʛܣ4k߯ǰ펢jp-^[H+o-b+x9KҲU-@J _8 $@v+–?2 'Drjʃ N<Ȧ&<$Ș2+3hz_A6 D4!H쀸+՟.^;6}̐ڽp.~% Mx-Vr( '_UPtAAQY2ybVA 3B nCMk1llK>[褦Oۜ7C L 5}d ?g ^^qˢ ;Dq4;|ΌgZ\]o[-ؚtl0&rh}]ZEk*YWi _'!Lh] tx {exEqiEU' 9K|Da<}2QEO'XfMz<Yx<\۷>[﯅GMoѻ\ BXfDBp8Ung|:FTAQLHڀQ=,p Źp|:ĸWă |k{s4tѝu{r. =׾WIsv xy))(Q*p@KoRX+j*4Aͻy_^o B݃l^Pn@g,Ԑ<8vxluLZ.K`ʟ:'.!?ўÛ;( pr{c#R a߮büvp\y߈6qjqքGze_LK׏zWm endstream endobj 22 0 obj <>stream +.4?_6L<:zt6omXG +&cʹF& aV&ӽ[n6eqR.*s>ȀG[dwb8>]tMxnx#ɨ& rs>/Zo]*oәl 8aw.hv+Ӛl9%RA7O\m9ђR'|KEo +@Vgw,p?dH_wv{9^y?v' E.޴,;|)\Z QȾ.9a d% ޙ8/(vݩ|]>n_DBesIAuT[jgǃvjxa2(lAE?M4|[ю٠0m/Ӣ1~ x_ +ryTi 8{ahϜWܽVb6bȯJzԏhJ_`ΏBgγ6=f|Q`nauR|0_ +cDT.C"B"VDqռz/ni-}K~?4Gx1nj +֗zēwB.=cΌ-͝{)k\!<#&>v;d6Wn,b/ˋB^/v2Xlf :ٞ%ZwP@Ql?9&L0dxt%hj~b]U\Dw:(;br 8Xpk8K4ge.5l91a_"TP35o7=Ǩ| <&\TmUR{%d7V܋N|*o!c %E[;w4SśX~?4'@\(_M OzHr +kǩJMu Uyy9L{V?319sTpaf!=^-MSN [r]zGwXDr_k៖Wt; R& ߗ)^Ԏ{r~Yg9wc}s6~StjhTңT2T 9g#kw;g :*$U6x%ki%NrS\v2Z[=.l(/ ۑ&}գ0yܟX>Nޣ5ٮ+'\Pl :|Vt$H٩U?h$)؉}-)-j>L)8Зr7ˡVTt.GnFH6Y;`h)}ruz \b` dܚHY$ #W[]`tI62)~%G~oաB.wĎ|}،#`)wCRFB/t[a쀃ֱw03ί>B/kوkeC}Ka{y,;M|N7#w[ 21[¬qYnjZA9߅=/<ϝ9w9&Qvafqù6(Om% jOn7ڵ䳓))61jCPn.@[* FW79x2@Gͧ)+0z`A+dp:"5k ҥX6űz̙ږ/jf] .W(UҾ\no& 绸=r'lE.@ǖNJլ=3*ywoۍߖFrԖըr$%k +rE]X4om\.i-UN>NdIZ*t.߅ 3kQo76|m+0[dhnm{z_vƻn7~ط皘fR#"YV٭Z^c+$-V)mJm߇mKs/`$bȯJrd + 2z +d<Uf2@4 }l@Z% }vHg+392" 2- 9C8ϧ1A`wۯg'7g_~C^74[ohƐ_<Ewt +dIe 5 2wm#ɘ{~U5aw i2 :Q~>2ӉsX rU +~ k3-kgW3 +&rҟAfH>@-A 3Z7!l:Ul4hwէNa~XO.T<7^>b{q%Ϗb%35 d rprMܨYy?roK #h$zf)~n>)\+jXtЯ;Ӎ5PfQ2l_9xbOQQʄ }yby{D >>W}r2\zhaPM<TI !lv5V{9Y=wG5rԜPta(GMA‚x@> | SD M7+ w͍G G}W`zkIM%aQ~ p`P/d+ (k@@Ow +]Y*+ a;s:H; h TukZ\<}zZ7()a^ an-U[/YmsGPTJ@Q>q!@"'kífH=7f$`4mήW +Խ:B1عhh YQ&3JBt-iwnR +7ח+yZQGg+ciDa@n܋Vۓ;>ן- )%VJ]JE{^ԳD|{57Ώ!zŠ BhCώ5|Vq_asvI +&YwT3FtSr[au9d+idQi+msF3Ͷ'5l,s5 Lb!_0%01sa@OO=7kQEG-L?^Nvn _~(m ץ3S)SEq&ఊq1nW[pHNf78V<s7i-7CtT^f%p_4m?Y8!ΔSCpգ:ڥvH?[GsZ\cv2z|1ld)n>ĐdA b~hH&Zu3M9*8%S^\ꃻ#NmvEYx)ܓ\޹lw 9o2pE 6ivit Ҿ;} BCZB WyE{;@sDޜ4UyKᝇ;^ ok=dbIS[]HWI@l]*orƖSGeu'm`flNVМ"{u:X'7oQV65Vu@df> +f)2K#E؈'K!$na͙& Sx22pTibh. <쥧1љ1g;W/&}\pOfzneҾLk=JW9ܪ:[M:8!E 7O!?wPt|y@kbhsdfcHK<{p)w-TG.^~7|yFmu7q>JiH)z}U)S'5_@5My`ShE泴xzUξ|Lϳ|hr{':_-1#lAQ^EHH1C4% m}0ol[9w57a@P>פֿGO3#72}2k!f#ZN?kG_Sz}18׿1'?}P=Î{#{Z? 1Wm< K;rL6t~iN4=n2z0+R(217*I=3KzڛoV^ +KDZ@ZsbHWtcrUoKY2,{o3rbR-Z]OcN]:$l[{lyvv'UB҃*>i,j\{z/ݝ DsZMNG;Z>}[lcb[_!TڅUI2(~ldh/xȰv.uZa'p~sofOF0|7bp#>RhK:e"|mSU i,x#,aҊ'PbOGN22OdTz pg 5Ko]9;GDBS*w)'y^jZ1~^'s h[\m6j?O j4@?Ljtz+/ N$θF%r`E5{=s`Nz;~ +1\r`0k0B=}xx IJ"M)đ|Cq*Gc碸zEڣ=qI\oy.V?_7Gjx& +f%Y..ɳF&GvCP,4<X)|nuɻҘWn:G6T!s-H*Pf:엹3 KHeǀou|\eCM*㈍M-L#y+@rϬ\%rY0JD@Pb{rf@4:\iIT8ll5#B)%9}- (ժO|ɯQjfz)8^vYץNzZ,YfκmGmhc:ȎMw96/ ?; +e@,=To,A̾ˇW<2DiI~kU?}p$ VɚN r36v@6>5bf40N5?E7F4[lΓ+; >!}i*[^=sprxoԝk{d-۩qiR{U4HwзX` ˩&Z?#@TX΀lR@N}_h?6cp==rf)%QB9d+xܦgt|LƲ;ou/OUA#@.M ꗫAX׮+|# ʮu&l6W_z 2kWڲj`eIW϶C'BlzKUB;793~YNRcr(wu</ii䝧^-Gռ]efge|ܪej--e&Wm``Bdj % 6|2>L3B,=vUq#7?U?y@) Ըlum)+`+eWl6-v\YLp&lsv/kmX??T+8Prh9S~ݯu0,Lǥ +)7);n=+|sq`Þ,g[kL.3y}j t&1O(1};̹n=`@~Dv~WmMOYmiq?gJh҅[m1+LFvH+DNΖ9^ES/{:MޅpN٫?{ +67SO5y?ѝ ¹x5us]#-紫潁y%<%N2ƣ<F:Ug ǠXidF&ۿUrPد-lxdl-߅8'7bo:XNo +4;5cZmkdwKzN{9gRLtv֫_;}Q^N;!r~| @Yo=G/LG*.=>\Ỵ-KTZN[Axz+ì(l٩iSHKGxd]f?؟i{|W`-:EK nޱb׶և(CG.]G՛0R'jF91驣{KH.洧]&L}p|tmWf/Pi.y6 OWS^'vn*Kd,\9Bv]/Fg6.MNul雃&;Qt'DŽ*Ȳl'$‹@7w_pl5 ×ckЗ@JPƧƇ{j^W>;+[3Pm +LkݒߺR~5|pެ^@(߯K7Znnղ[ÔV#I[/m=]J5E4[|^$Zl)ϵ?vsksLp$8-^ݡya.]K: s93z"iҖ˞sӛ]83R, +Rh=g~Punooi?u*Դ6q8sxJ{Ϣz첎/a~&3fP)t."zxm,ݣQzh~P+ AnǥCeip\ƞc;`:Gr1F3Gx1͌8tH~QYZF.֠V٩,>Fpz#]4}ڟUU[T`U>W1I\7—zua|kG_{8鳒jtūQm+Y\l^>sc޼QIg?7RG+ekVʗZ)9K.)_t5gT3{wLawp൱"! (gϬtbRQA^Ǿ~jsڝn _-.kOZU`]sy,RےV]ybu>%=_E, 4k{. 7U}yt,Ϩz+1? o>yV +WU ѮWKY2["t0e/b*q+e|F%iA_I ?ؿKv\gRD;O:cW@\uh~P-n vb1cc +`t6@99T;JOq+k+sdb=Kz@ Տ @j&D /1Jp 0އ1 +֓S0JfgɡA?!δU\8sh6: '^`.l_~~lJ|&%xn!l!Viu~v@K)0 BQ1x3UAF*N/` 0 +K +$ְДVuBhʘ|%pl bim>X^ /A%Y´2l-|~U^š)RmNL>$}qvM:ߩhf_κK׸˥#Wɔv!zFC+2<38qpY[-\NL@R$OF +դnʵFZ|NX:(O!y=+4PA60YfͭߤVJia+~?R24fi Mh 6B0D;0G {F-ZYC!1kTg5,$$͎rf"?־3noȸ.TR=??5w"B{3P'n=@p~,wdTg-Ϫۨ< hGL6Zc~9@..=w|'-ur(^vwlw =pTy Sӫ2G51;譵% i, | 硲BzҔB>JFZunyNʙ%>U +/so)w2_JJyl 8n[@w6 +OΧ>,pܿT욯q|wjiZPj2J\bj㳴N=`d``ur$*7F }- -E;-yjlǺwn?Į +}YWәYDkin= /Sj׋3;.}͎RMjvYkaXR_En NT*ri)^ULxȧ:\]=(劙3yQSW*=Ayi7ZbtIz==S)?djfҒ?u1pPR>.}L,?+;sSrlOn癩y"T5,7Rbc"5iNǵGI1<4bx-l=ᑻ|@ 5yzV[Z_39]u˩{I0 vqm-a-32qeD,Th +pҿMlYz {^/uw@O wɞ$Ur.uM*;#;F[Y"s8erK_U_iE"ݿU=nN NyJz} ?ؿoP||@hxνپ/hޙIuQ͐DK81]j+Yìtir.?jB۸-v" 7;S@ek5E(s8H׺2]H\NR#j|35וyyʝ3-m#B$Kdnw>xybr\uNt91TaGD;gqm. }xStǾהG04gYF<$Q>WtZ6q+'[kkw&Bfٞ =ev)%϶7`g ˮMO9[ǯspX0wh(RɍysHiz[FB&诌G(O7L(cRZUܒߒܪ1E}jyUs9n^'.Ѓ]b30⼩ :~3Y͍QM(.`t4gUF85w8[v8Foa `vY,GUl \KάO)>|_GF2i\aij @"lvpiȂzg|mNMwf̾!;P" 3]ccRW`6 nr>'3n e#z55-PrCTghyѤ74i"t35G}^LҤdLΨAS+ӧ)^5όoGnwD<7l> +3";TIaxUbVuD| +-v]1cIZ`5/lڔ9i4!7]faꍹD{ +#35nq+b F}j;Sf\w9]?5?Ā;4")wJ{e _z0hTiVW@ +Vin5M'5`)#V7Tt;wq]:ZlKaNA)LJry4RSy}aLݢ@gRCCԞ;7WMV"ƷjA Xэ2O%gՎ nXQY0\MU +J}28~VY/zV;PsA6#v _F*w+ȼy`d*UKdaڊKRWqSʅs + ߂9RH^9f$w8j,aE9ϴc±ij^_W_MXq_Ȩ7)yaϮrJ/>OereLkgU) cׯY7J4V8q5Qj@t}P:T*O2D ~$` VsUN=)DO|,5uK9i=5 .v|>0M0|׃E^'(TmB gPT[P2, Bh߇?]ԡ) X<cxA+Cۭ }@fG>XUg"_yW},i8q> 8WA&b=t_00z~Cczo4nn[>3o`Ly^CypeM_x 7dsIƳڏ 外<ʭrXcS[ ܒ̠QY(Y@ 2b2gO52BNCn_.ûX,L6QQeڑ5͌ zC;d?`{^AgjQwANhe$閻Vkg6"DkçM=v_jqQ8"B%謲}jAwֈ+!/$^E:32=;u+W\A^[\r /rFt_m\vF~j0wqZP؉UYzxډ̔CYouc6L^Z-ztCwyp7kݐt} +g>uIu.Ϲ[SPol+JjUIHQ/b)A+LPo=56n)7wYN-.˳pMxLDlpjdw_v"[x=z;G \ +ntL2 j/?lk+1zkb0xOIy>Ó;N[}3//6䠞6hqTyƴDovC)=B/v;9RME@na[z Qkn[}?ii݊u_§lw r&M쾳NQ蛧ss{WZorOXpQCO8kgm'-ܜ[.":ۋkL;$0ESJ$??N\?ϝ3fm6KFx娙,K(7gp '5p`pV\;YxX[c>hYz3`a¼=Gyg.ԯ5{F'?^sMގ'a޺u'S/gN0_wdAi?lƼ FASC..6U6?a׀IRe0d7tQt=hCŵ_| FkڧӖBZB l%]b] uE\Vvh%gUo̒зv\?\B])ZC:2#&ݿ7ԈĶt{ns\fPY5ݰٸ6?u඀cٖ(ak3 戟wuM +۫pr}V>ҰfG2^vO T;G6Zdz9NS`B4l˾QfʷFzPn P?VGA򯸴b=wf#\cFU`d@\K\65|DKA6:uɦ<š!R'fMM*j2IU:UQs jCO nfŜGs>:A_q>ӜSAgw U;H[*-˛veW9Q{o֘!vg7Hͣjr^sTr+WVv^c0*>oOAZn_l'G<ȧ >"<_ xeبy%Y59bXʬK*UPJC;k2}Z)dTrJWXJ3}"^J,=lS нxlX8Z7RiTPBH$Q vh;"UQim!v z'˧Nj ^HOģ +P &H[ ^1A:vq`D…- @1T 7@fXlKy9cWweAH+}bct&H_>H?t$iDHds@ hk# Fנ}@JؽدhAN"-T*Pa;O3@HeRpdm: \eK9KMGa J(:$u$~ 6g<>l+ԟe~7~M*y#P?N:`Z^~MPdUhuh;=Htmf6TOsV쑏bR|R|(:@']Y-0Ebͪ"@ْaʑabO":a5拂f|Ѓ:,jv~ VQ!] yw 6 +:YB{t=읷N(g`KXI4>1< +/ٲU~S  zE +8#j.n+uq;f~ԯʷӆ. +by`r[jA% r +k67RV[A6G:NM +!{5*$5Fiv߷]HpT!]fz{9.aE+_+z>1Д(>@-dVd" 2g19,TL6-_w, ~>s[]67ѓFs]:v%$ 7we'sUO|\>Z ++l +X%<dL@1dzF [./ͭ GOr*u+K਼Y : Ԝk'"mOCqppt_U?JֽR`ԋئ}t͏Ѫ̤.$ыϺ4í +yq]؝>V>:!(fٌ㨓C&r:S`d_]f-6d +o.֊U~l Wf^Z 0PKBnFeNE[;<݊nwxQM[c8s}=[<3+ey؞:wלv5[}Egèƾ5chyx` ҝR<.8}2~!Kկ ]Z;g~mϱ~=n=F^?rȶ[r{eU7=iG80 ]5hva]> TB P3@K"uC h[}{K*,`WdP. ]F}r-wB֙V*S10m*IJӘԯF ++ߧ0^W(L/jp7:'506sKq]I߯Z-9?Tu^4BIy;CNT~Kv .0pTP̎S^PRI߅8 oO NGg>/gް#ۼ6mWun5[d0<+͏Oϓiu2Y^ .r|~E#w.vyq~fsHf~pf~+. U].}.){n?r]a?kD\%Rӕu-o+ w +lyNsA3cyaNt"=_{IZ $?&Iۻ +3 *wCR4ng{nxRvÙK*> 5mO7= 4w01zwr"9chc +HRF֢|T`dB-dB{C sŃ3Scْ)^qzuVxd}=i `d1懻Hh:cy1?{y A]@8 +8PaVI6C+?5=ۏ:ڧObM]& +(ARDWΖȘfdoֻ|}dɈƩ.zm N ^ĝ0LWL=YDzs6+eOڗv~un>.}j){ygK%2{SNL*Pj;#VP3ݺ/mBܗ)Yؠ%/juխxjz |2F;o W MW14f%_~0k^LD8yi)9c$5|S*h3?wͣ?+DpO})--ܵfϴ*[TlE.ynY\0Vy0Ze^YqE[k M ɞ܉W)Ӄ j^8sEBg<>6dzp眘n6u*ǃ)k'yVV'kVVK'z<7w 5K7NYy|/8_(%c.g6{B$%b8'bѵnOk5mqGzX]3o;1lbںbچ1mygcWEB. Riէis(MaT֥ ^Ra28^L=Cþ+ *F*u9^d V5 >-65u l{5MN +֡7bލcכ6 i#u+PCyjI-åz5RWiݷ2L׌ +tR#\4GTzJ0>˞+4uJm (w_q}P7d;3[jUSfa<U} bsBĄbBQPr_=F\U˦sNb=ղpPi0R̲2uI*F/jPv@g=͒xc/ѡ&Aee,Sc G&CI~y8q6"q-:f+zvۅiR9i#um=ofjպ):dseJ7$1Ɓj3b``Q^!_p¹o6ӭ,IqV/qokcÅ>>: o UבpZ#mwֹ 1%PRtWp^xܟ3TZ&|[r9<b/%ak15}1Vy[:2Wʌ{s.F^VW;XpNmQl(+PZqjuLr[na-@G=9_Hj*z68MY2"*y)Р>~ֶ jWWg{v?PcuBlŒ[ߘkP#O1}\SGX XUk bYjgW(1tbAlgqlpf4o #U"ʋCJç46$}hթ G ;wS-"|Xoч9}\(srbtO #s(gmCBiAxzA@@\ .PLo@@dcD&RO r   [ՂpO9<1^pERP_sl9/~>B?BQz6MDhY$r{94q;!UH-F@SiRgf# @}w <L+Qr\qOaݱPdVcߨ5s#wxQ;9y"TmQlX;k҅h7>%)ޫyF04-o$LfK`|܃h'\`Uv~"X_loCdX {/Ae 0̴#M`k%dl4wrLN7ȩW!}@_~z_!Cy:`,TVBq g +Nxaww+x `y`>bDܣAzGԧgC!ÑdÞ ܐi^ߏJ4sKעg-Od?v TDVO&,H\T|׋4&CP QU7>z-+e?Ԕ 'rxt?x=/|P聆Bwwwhx=qs☉RXǯ~?M0bhiζ6՘#{wo.7(Uޛ|8ħ, yvA:4@e'Rk7⑙)99cr{+jX섗31liΪtgZw}=c氍kћer*Ѫ,8 @e@K 7tBM|"M]RM/Ԯ5큪H3"l#/d|ܭKpY穧zcmiMRˈ31V?Y}nU5OB,b kޙ ؾ@վ| }ol{G^+m d[7k ֥PރbQ}Y{ujlVn-L6wiL&=@(3& ,<]ƙӼ)̮ +yw\TU[Yc,8=Wo~uTc=US.Mg&eYzBܷMn2m<,w}@b2Ar1 ςT%c>:D, )|p QC꧶t7hogꤍ\U]ŜKp}iXZQ +7-6S[m e1XqQ-rߥmۙ`H:K~}Cj:9B*;e7X?6Q{j~,A]vhHA٠zoԪ0_@*rYvplnpx^ؕIAIi]U^rB*Yc2^{W~v]UJ]<@z1O\F+S/W/olSnv(mY!nxr[)¡ +(yc_qEW!YgA!&+\83xI}LvjhQJeqaѵZ@v,Y|b qMBLt*rkUbs^/~{J*әȢ1ٜ̂>K t!;stjO64wNuPFi +Zi7)VCd-i4 z+ [qkj+ᰫ61̧ x1ŽfުHn]iU4 +l1yחnZ.{nI+`x5EͲAT-횯l b9ϔa<&ϼrrjI@~6t~?UVi%+YJOY. >oz]>r\{nmPۊ[>?S>3Uۭ漒gw7ٝXng\)<OrIs{QE;%.5Y}#͒Elx$nЏAkpCYVsFdO2U_W{+[ +CIxՕH +21PV>NͽN:vՙ1הE2u{toð,rCܞЛe>/3S46Gq\=tJWϔ:ؙ/{nPgQ/᱂{ҹZ/> Ϡ  =l ZBulm dX ++Pܱb>!HRiTc"4áUK]G {2r@%8U9P + J!@@<K5#( 0({VroƊw~Z?Ÿ?}j?Zh>KycId6 '5 `>,"#'.;o_ߌ//^1_h~4FqĞ-Dl3#KUV} ]ᢷ *s)\|􍏽" 1 .uJ* /y {{!yox6|" cev^AԖߏapX v\ILrX絅N;mGԘnF7 k)!9) F'n8ZO?hjhnrR_&[W~O;uw2>Ys;'/9D؇#2. N\n澡 HvLBSOJ> pzRHn>shqސ3ONey!,H89 ~߇r-:}3%[p]r +a]uG`8 &H]>|>ސ ]2}$Yur: /OS+$sP%u9m}q Q±8%[4f3E{)FVvbvئ葭;n PB#ݿ*_Fc}䝎}a4)dlOsJʮ݊_uxcJ83l+'=-]뎺Bt7ôeZLvrZ=;_@O9 +))5#|=(j,O 3;xw<!.cu=&s9|[݋wL"o.MʑC`t_vbWYm62\底v5c-k9b2 j"a|X0UΉw+U: \M8dG TiDuFBڒOOJk˵6B>6bA |mZ PȂt_}{ѽl;f`gӍ輦]zZh^[Svދ5bDJ{aQo6T,[=fn5}{Ӽjỳ΁Cod6K\#Ol&snEH6Uf KBnN՘PEm٨6^FPl9brgݤ/ʓJyg=~{{oh5@ExK׶m.u}S?ĥqG{)qL.XUCDMMjA΃LK|&祮]wVɘfr-П##PQ1 32bilO ,Hx)vͻ5]n1҈ltPފ $>8} ߓ<bi d5u\L$#HpdAbg֑A-fFzUDDBEgF*%#׋قd;Ea wKc_XX4~t9NwU*c7|P73oܭ\,.M&gE!uɛѥvc"k4SrYT(iBrW(bg5Pr1cXZKSݮOpi뇮֧o5E1y&pR +CR֡Gm/Df݆{;9i>!yf՛w=#B>EZ=R3666Liܼ o<"/F%ր8l C%.[YpIEF3J)fHTwS+Չn>qJFVzA~UFkr$^MN$ǩ~e53%I Щsgj2;b}h?Ěֈ0DW _z\6ixLq(^.%^EiDEf3=#"5Df`CSk![}8|^qDW{bI1aF2zh%G}Zʞ4y_꫱٣uwLbn2IJ$ř_)^QjcRmIHڲ>*>ZV3St-u?e?Hk'̓y!&52 ?һްxzk}<>SxPg,PMfj_V1iTm78}?_O8:[ve!c/VJ+$>ƽxa=ƒo3 +Jq;f ++#Sк( $[9=|z8ڮC;Փc%-LKY)Rr@K|A9f͏i8h:U=ZLL*y7B* w#w׵UivOtr~zq7=ʨ|@SK7:x1)ZNrHЕė K%wTd4RTBTbZqLΖq6?߼*̆7/yw¬ZU>e׵y#t+)R6ro8CyE9U?3Z%C`p![%0zkI"Jxu:ߝCRVoA/Ԍ$<~Іj}} U熨ܜ,+L& }Йjg.Qr駻^'5}5_G*ic$~TH,B5e'OT!U8AR1D',@+bpcpq11U&!y?~̯q 8BSWl3 "PT# XH*I&" N6L&g4T+U?az̽]M XƟM1lǟ/t{8IuB?B)hZhgI??z g<25\SP0Љ9 6>CD8Exy O8'u;NPqn'ljcS1tDfRt-evXA?'uT>d6"%i-N>SXʼn߆w( n($3kߎ[ ;I/˨ QJ7q=arUߓS~n{=s:[cj@ih%0Ydf]rEqZ`^4$ +ds8 .$BҦx!^{-^yAV#n ۿRP\*(z^`f ־] C!4"`\}Q;vyqŅW3 qK#jyTxwBߩ^֭*d(_Z .*_ 8w "MyЛȹBo/<ŗzm}FqwvT! + n9Fڸ]E}QlTFWjQqGG#ξ;Ǵ*xlmcP# +fqZۯR,f?L_z]-ބKh\JWzei]*nTiQ⸛%'!;{YcdS]CIyx.@ji@ +*  oY sXS>ɧs8C؞\YgD''X$8vi_IEzWi4hZL1SOtYX& 4R"9EVGSS^r};mOYzsr֢wolA6Wsap4um`MvKPQ̮'o,}1 =.}[\r e +5fA0R.A[|>i^ qy9cHnqqi1Q2.ෝ:Ӄ&Qk9 j#Zk +6#V^Wg{}U /IlEFhw@z ^9Y]|Ch j$uS'vuY44/$MZl%~Y +zQ"ej"ء-a"7RFX+C{nIqcxv J.腫ϡ2{]Bn), +WS(E8(Za޵yg9$]BUfCJgL p4LO}E8'C-u/Lt 7)R;|~ ZDolF*V)[tqm~DLxgA/LEZ[%kAitnTۆ#D$KV ^( S hֿpw |.%6'@v I \<M?t庿_P[wgH7c+a,Q\nz6 7rlװ8D8(ӛWl鹍.WlMZf:ɫ?o;^ +i )5ôyZQػU饻Z/nIU@%Z"\uM=v6LϾ"߰5_rW[&30l|jя~l 1~m+y6 P1bsg<8631!VB-/-~2.Е՛8G)ٝ]jeyؗ5SF6[ 9̽` % [ٍ?UB[@m\7b"6+,7ۜ)r.#V1>mo[~#@]z>d3'T,UH[,1D,ߜ8zmu?ğ3{s7ޫVh!k{Pw]y< <#5z|{a5uG?];plL|mĻ]E&5$kT{>[b*5ұj\ql&b|lȹ}.|0"s߻>O]Cnqy~wæes]Lhx9c\7==jٍ;ӼTE j g sCX")-a:dhBo'Yk[!' +v J`^jX3&_ Id5 &-uE25oq-X$}oam/'[!,XFa%*rbyTZ9.h8BEC^HV-zPEY:hd,%$߭V<߆ W*MD5PUU~NOcfH +y(>^o}ӭ,5&y]wGh䧣*~ԭWy^Ly-rrryʷ!ʓ+5 t3Üb[‹0g4B|4IMlmVCM͙{sSI]ŏՊU<_497Ӷi2>)#d|6̕JDW3s +eF)@UB5ڄ(u2umҠ]GOhDV+ V"\OfUjޖTG.Fa;9otХL|$ʜi{AN^~m7b9ޅ؃oH(ԫcj_-t ֖;F#uo1n+SAsY)WFZ[n3ϧziScH9ZF7AqƢ[A.@-^o EqəVZe/`ͻ}ğ-#=gKS4Q>[=я0зƅ| @X+\b\սRbM0Q=?cu"uA'7yB7?G?ZDPp.DZk~KY`W1ihR164#>-VYC藸~^ю?La7 0'P'T@P?G.'CadO)*}EI+RlEx)nKA /}#;G7ğep'eo' ^h|Ny'-Ǟ:OaZ􆊬uLV:v'Rpʘow4 +q_p {+©|_xeQ/'1V|tFn&{THl$q\hvd+'Bgn= BbANRoɿpUy=ʖCY +힡m{a#Iޫe趔[!Ō +CвQMqs*@UqМ4zMn\tk>z}"N?>{ly4.4/4vx0h{O_-{_wmsN+O)h3pK3/o' m&i\8<@?#iӿWv!~%3:do'CX#Z٢{RKo0o'ƌ4XĠW{,k޲ 5s?ŻdiܩC-iQ!U׀*wGYe,Ƣ[塀/r./Tͷ3B|6 US:>~Sx?$z!zzi(k\i/ll.tBySqHNh#l;̜lPgWl]﹠*mA*挀` (HTD̂`?;?WwksSUkݬ.K"Q m..-evwĎO/v]^)\!)8 ߧ G{5Fq|H^Ml}nׂ1kڛW k?e4gpZ铿,N<sXltU}ev1a7Y RAvgqlA]%׏v5 ͥƏ`sdj)zNIf- M bJ`qW޳ya.U(1c]NK;#+}V}aYgs~QA +vl+aꗰY;z^DRژ 1N,U=yĄլV *{5'7,HF)&O3/J^=2}AIǞ_=GCr8nb{)ÜGoZ=w+*$JvI~7|q_keu}VvlwQwŖzºMw=82Q0z;;pLԹxkwA6&܎WsoAUrZnhR{/*yy|۫ bZ rR%GXtI;&02msb H +Rȩ wkHd tAL$J{=:D enfI>(*JJ&V|oq'$ faVىx.F`YkX W9+j`?k5 =4@1hs j)À/lYAg#{(vF]XuRIɗf`..RO;fY +nLuL;nID25l2w%eA3ݞ3!=%oexU׬exw,k}=#?|N|$vkuG`%drt[iIҭsht|BGd9,G4h: 6޳SJ Sۅ^}WZCm0s>^G+m-WYޡvcA\5e,=W%jY0Gc+Pqe-+Tlb'<}'jL oOG?~\ ?}uo_܎q#q9I5U/a!ڬ7Lu>vP_ݡrZpY)~3gaU !OApk҅ٺ1Z؃Zn,'\jk70\2gE5s.¼8+WUN tƣTo o )I@*eo3c(k?|~8J~˾x7],ɭ|ʆq0?E*EbLF7}!#H[_-#%L@J.(u,nPu/* ko6ssX@gP<@Pwt[{Oʼ:9`1<,Ţ?:6%QYйf4Θ|#wtZpHP /ԿRP/.wCջ0w誌xu^n:l~sG@Ԓx|vYS1[˭T)5zHtn2y-|~==56KKbHҬfb$H|=f0`rn +-=c"S[34ڡY,hk{.C8Xd3 :M9![PE+lW [<Jnj@8Q0][8Ã̴npxfZ' Iۗm.snүb +T3IHp?$pp/'h eI2F ᚽ_wmW\8 -2I2AJL1?~y'>~"I}v$ʙddgd4 a1ӈv2L^ɰ2QE7C?;+JȎLy٩QO&}62x:dҤbڙ@gQ> \!y7 y?KޅW;'[KļGa{Lg>2X|6<*eBS&X%_NieR5䫐Gb:՚Y>op- .ze.Q2Rtd)IOVn$ "C%{y-&_X=',C#ˏo"9ݛ,8q= 3Ғx؝'qJ T Q7K> H>wYL>5MwJr}z(<˧}g3A-ݺ4^b +[z˺ω~,b y||. ; KkdnhJQi.?~ {h% JӛȖWYz70)zVc]<=x{UjAG#Gvn,9P lYk70u6>74<)X[r ǥs\Dy8_p7⡿=lg:s\ 6;n@VbFFAzNU ]Ӏ9xRa'WwG^r)`3PM?O!ع&LKJu#p|\ޖ=|܃W·|Dٷ `mv,ۘtL,'co qMps[zkdhYl^Z}PrdҼݧtJA_{ݥ#]cYްcӏ'70nOϴf6j4}jJn@C GeWx>-Z,_ER*]ϧ?2k(N;J>Ұ[*~Qr4i߮w+N +X{rt_ +f_t#uP45m: gKC[hCT=!y*MvG$ }m*.@;~,V)*(ԵAkyĭeUxbKSXp)Wa'ә:rp<_J=X?`MB [ҹa+2ʫGNUUN4JԊqKaoPr?l1 "Y- 2HrX|. +}p~ĝ5Z.TsOoؤaiM fxs{ +Eww1s 6Om.Dfqkptrf@cWfSf +lNscN+ۜvBm?M +Bl,ucל5^ra%׺$8S}[w*$4Xq!|6(`2t;wۛp^Z/LX? Q s4Ya~vz؃.4fYشt>>Y{CVY?Q=IxxKͪ7QrnLOڟǙ>bRWb<0p ɐBƛRE=3JD@ɦ*7x[+f*Fcum%\\peI:GOe3BΘ⚞ƜK^)Nk7̾F:(r2K7[n(7{FdPA#O!C`6^*rln@Cm5LUKjwj mo[ (lY'`usa6yC_zv jgh6]CFȓc-ŧVil}kIK׹K[רNd'V;8 +'hw^>7[;yu)@6hAޠTi0eMMO3^C.\y ;#ђɿ)n\_SagGKT]c.%N=Q:=0Ukp.Gdl |W|BvX\< neݪ& ٤ LoLv8|71{Г'{{H^|9- >BUZl9iV*À/WBɟY ͕&pi3*JK1C.sLـ׃%VU9EI3D>γ#& ]zh _5ro6ȃE;}u6kxxlL-,W?6Sm6'H産~yDe<!J{T{~֦}b h@ZݣmBj!f8f] ـG 粣ɽ,Yk* qI8x&B9ZxMfDu5*]Iuߥ&۽~:M(t$ k ΢]gϘXٿa}"ؾ2F4T2d^96wmz?ؑ o[ID/>n ^sCSm߰lf5>¾qq\5AE-~$pqj·BbՔ*LP%S7Y>; ԝ%ܚN.5o1+Z B(h^@P "C ^{ҕIӕa<Az?-V--wy~ͣ"ONGg01^e[qG1c_ +->̉:A=bq*t^Cy^y2v8/mwj\i9m{7U86vM ~޶՗T\K¸7H/h=\!8Q^Z dَNVmkT2y +Ztytn/wӗ fޛP?B}Z,Ԛ+.wߍc)Hz LeҊ{s3tI?~d=QQJ`5)OY;ViB5<̪Jj6{V^aT)UrG9EZ{rWyH :p?򼰹SSuTS9ȵנu6Ja殧]$V26Pٮ"i- +/,q?|טC9eM^KK)nVP&Pb)`\/$)wڳn=5]*ջ:]r(L] +*; + x$ bv|=,BS  -@  Hf.%旟UG#w+24w3;-17vԪ?`M1`脟b@©MrnQȭytf~]@ r.Ce9`Я7EnV2Pկ;5X{Ajj´h.p.tZ*W8(O.RtqlJ傹ÙH=a}^I*7rߣd`Lh+YX|=f[|ZLm /cHY'I0Ud]% K('7I9%$#[h`I2n 2}pږ 3 k[Jaz˪lje#$-m$mjd'6S;e>^=dJT̏o[N 3%0W_y=X?{c+CNBE=6Imt(I%Ir/[M+X;f_~}Ǿ,f8fCB孄˪w=|wܣ"˵;<"#њf0yoo-ycp :\xM3_2I]JR_Ȭw +I/kط2pYT)0-RX>gCzx[{LߘuӻۑEEi}C=b1cq^3yƋFw**$o 5&}y]'O$Cᒼx VWAw%iT,$mzҵ׊֗[4/(ܞ9XGlv!&W-$ +GV?88t+~u/_?;ד0W2B +}+‹,Kz\ uޥ ĬLǝ`O8QXE9%8'Gغ!p&wku +xG`m׀ZdoRuK4GZ^c*4g|wBly:!cCVm Sڣ9s{~+} } Hy|<]noâa8jgi{SZ544Ҽ^mqFHSSiz2mrmTwzuJ᪸unr}m!\!mٖuz4t.ダ;cB}[t*CAɁny :|~8[؍s1cS[*.m#ϙ}uRFJZJ U7_V.?B5muRKlf0Xi^Dn?*b}ᾚyuوeq>=tOܺlviXwFEv22FDm FV;,Pk\:D +͂-}^+YR'-4c{M_PuJ.`|[._@wI~1[)KTE2B̪\_T{Xdzo˼qBo{h$93&xi\A_ͥv?Aѧ;#C|%x"^EW~I= +MLxÌJ3/ٽ?/klfjʥ r+ϻ̖F57eVL[uYdW+ofW֦=?իu؛Ju4ô-ЇMU)&YGg⾵XGOLue|NI/)&}^aL}N,cQc2wPcZdE+"6UT{ݒ߿U7pWg5@twXB5}V&mӘHxW3)wOYp_._f_sFy͹8B.vB =nE$qpY4=Ẁ.zgk˄e,K? [j._ßu2{hdЪ_uhƩ iҲI% iLdtaKnO"lD6f{gԨ"o^R:RjLnL܎hYװ\NխC= +?`;Vtl;o6PN7ԮrgR;%j;5qU5X><+ǖ7fQ ?9?͵|s^-T=ʆ x!`몏E7͸ަSr'2Yk@8l8,<[t'0 ^rY;ё[;!b ڏsgΣVyxYY*AT*=բ [N*$Okv=t@HP/ +.v 迊[wO+2M+5 OqXX_dp0]< -yPݱRGr4L M P~jL\KNlE`}S2LO^v/L_WX +5W Vc$6P#F^s;G=_Syz4n0%!@ó`~{AwնNwKb\Bp˪×U쾆vϗ/g'u$V&sad}2d"g; 3ڮO[< .Nx}5?Wf%~R', +'ö||Lo1׏:3Iӽs8o !IR"zdfG*YYWL\.a(+ ALY{񤢒;%QJnXwxoGLOo-Tz*:Yx'up~t!,&IZʏD<ĀBo pL!dyn((q:۱_Zzv^xz=Q ywBi0IwPIRf$i%9^ày~-ygnyƿ)6.Q:?&y$N,&yZ4<|veEԽ+GE>ʹ͖!KͰքmʼn;;4GwH޻2y_N3N>sy"<^np=k~} '{%W#W[Q){@NӇK_f߳)wwxE 6?hMŭ^v_8fY^m~qGhR\r)1+Q?H + 6~X->tmnM4 CXyғ3/GKqz=t`ֈ `)yI1P6,7BGm^3MNF"۪%?ozu37@>4:0>Wht$'^ ?ON7ZF>}RZ|gSmW]ZS?z6%o6*4 +«@TJk+N𑶲bwr?d#X'T.msĆmLq{7jzlxZFa +6Y5<ѬS\BFCm0HA>X_~Z/uu^"{UygEU!b>g\7A_l;C;o7w.$h{O}s&qj9R!~ްj!tܮ;|T -c3d^2k[j~sj$d.9gvX68Y,0:2*[l/ 6 zRۖOZS:`jм>s\f".lL;byYN%՝4*XX'Ui/8w\tN)zKwdǖ݀Cξ7fQaLh}a0&C]K ǘo*{`B ~5֙ +?R]IM]u>ye\XXzx-pQ":ƾĘ%0cLc0C͝-zK3p6eҬҘ__lPy.PjJ2렒;6mEmXZ@PFQIgf/Z;^q}~z1>Tf:֜oO8p{QJDbX^0sh0C~&6B>8,UmXp/\kt&}E8`r": f㌪؅{TޙY﫻W>UT=0kZ|N[iyq0-n({:&W^(U' f-'b>ϛi# $$ +RoH~w3.;&݉Og+w,!Q=Gq^(q\/#V"G,}A~]ٱ\H&[͘3IZ6X0F3N3yГ)|#[a)>o  UtĐpc*FX.P_6g2h[[#8nyRdӲK _Kk!DVr95ODuRLoRj~._.qҦU5Oߟx:pqIUe<.UpN;Ը'N2֏y$ }x\&p&ޮt{-Ր+dBd/]k9~T۬TFx˚Ϣ4CuSz1q*,< +8|Rdw%: ^.R=J`&y"9Lo>/0s|n.]GRv0hoY8;J+Mz$R!tW2mT+zHh>lڹQ*t- }0ˠ7S>+=q."3E# A.C}pVͮ -Q#΅K_?P^zvuu՞T京a7ͱo/sMQk>>TL(9((Ib„PC{g߻cnz:YRPUŪ̫0+=:v`?^W^Wzo%w / +ޫ(xr.HQE;|ܠZS\Je5.!~.EY{׭Mr=pK[gYue¨AfɤA覰DCL@ _'H#= mswzL=vG*7C翤rak$ +I7PLZ A#31@#t.|O U@>@5h5E(DK +ez>HMX/ӑ7m_D#~_0XVϚX!4 +Eק}pۘxFr-@v1jtf~ht?"S@5Ŷ7C3!+7umҨx<&+3PnuX*Sd"•Lɱs.rgJ{4 Mw~E3SNeKs̈́1*-.Y=nh}M-̟@Aȫ&xW'8\BE]r}vpqCp ?%%GDݚ|0fnj3؁z}4ISa4oZL&Ф:HVv$DJ d~~FOcBs) }~L(-5oh;Z'?]&t><wxIem/ʶy|}L'ulDi@ Ű'Ank``p\;`wϏn71P׊\ֹW~}Jiҟ913O1<|ZQOxwͯz& #3I졜?ypFY\;v.e7D >aֹCK=ҧ;zuYFolc",'z{~ɫµ՟ɋ{ 938F6&bd#kvkPV^V}=svj +ncZ"]!lCS557UWY{q rbEcrO$])L;yB{}9ȗ}׋,(Ay[GBa-r%`c'~fng֝ڢRdύU\!Z:K7KDQM"}/x{ݹHU~r Wt{/QM^T6fw~N#غοU/6t^KXt?W\0qcvk̪,I]Jl7}25ԖpO47zo-٪Ô0 Y ?UKІWJ^7PKd9Dg3y[{$m5om{cI?0_8E]pyCtCF&VZ,B˄}F9[!گnRfW) Uۤ _a{ZQ&g%~ QWreue +*::r^olSk;HŽuyrYk͵:הYZߑ?DҘ拾on)8TfʍrfْLZ02p7uQa(Nz\YsrrZO7P[&^$fĨzQ AQEX-kO 5懳 +fA'ū{!s,S[np(i+{#Iz]m "lWfMa0`F|eaP'%EJ3"",sF}2JhL&vZS]3}h͎o}̞WsXBҮ`",MA3BqyLy9}i5ϔ^9GM'tY%U6V )n಄{D]޻_ko/{=8{sj#U5&?E* $:/kt]9lmK0'u$&9E!u3$Y"~Z$fTٲ# 84(._>\X~Ԡp;* ✳ُ:j? W6h۬e1MA&'!ޱ2 _R]/8:]6&+@wn`镼 +ќp7Gab7єֹ1cEeqDs~qitF Fp3d9f2uV6O.=cǚ~\da!BQaw / FD]Ymog-0R U;5[d`,N;lJlR"CoEBEf3p_۷! zX6*Z{G[?RBpL4~Fjhkh-֯fQ> l@;Y6zЅ1EV sEĪvfA߫G7"{+Lb0B="4s5t6BonpN6' ;Ƃz]R0q#r.Oyf-~҅({S޴řoTeѝ jrGl8hmNQEꏢԙӁ`7[g\*y@TWT&M*a3"X؅zQ}"Kb6X軎4.3h'…Ю;ٲsas0U^%X/OR-HN;KJ2RLRhqz + mlT/EV 6ׂa;wowİ5(%lG4兄y ܎t uED59߭ jշWD<F2+2YPp*,2yTη+5I.J|ϲ{?e1Uh"S_eL:3ʩd]Ԏ_lQꢻ\Pԥc](prj3}V -PCp=u2sS49psݤ_R9zqRw\p8^{ K_lX-6tT]pSJfdj~gѹwdÆq/[QV} h 4 + C j{{[$ dI|U ST/rp6Js7|1ze^ V}DA6ޔn r]9}Ʋ '| *@զ@u=@M@Xм3!\R<(V6){l +t:U۽*"s~?@բ%Nf,n yMjrrit33. s +g3W;VVQp +W*>{sI"&]k=?V-d>w$$Nc@ڤ{-/ư$-X0cB?DŽ?FџФ- &چ'gS_חO O/~>e9=GϣxmSQhຣ?մ-z')kG[͍ׄ>& m'g :wyp;}YORs{~.o~J\+z%ecGsbi6G*D +cBUc?zYǃw lx;u'SWAa+'UN J6[glMޓ=1=''[10Xt9| mV)ֆi[ǃ?sk?n1,lPnBP ^L4Oo9ih=v.a?8>PөaB%Cgi?$IZHە+|OAW>W+gk8q /x/L$?tpN||\"ׅw ޻CEG=PqCO&g\jq=ydujl J?$Oʫ'I('lVg'gM$N9foD6DW؉΃@>C9Y{x~<]^6۳4[['k3Vg`|)e;b',FA\̓{sPS-L:PuFh}sɫ'֍WB#. ìtE'7G]n`C +m~Oז%^o"r-gdGVGq^=plw`GZBt:_iz!<R:G e?ӧɕX:JF,`x0rn3>vNήSJn.{Gy'k7R4 ; ږo@je i=]iXC 7H^dc?$ p潏+ C e3 (]VV]&ߴgoXzd_ϖ/c:m41xpCcx:qW,>iu|?|wL<.F:ݙWy5j;.tcM8cYT g Ŕ1=M\gd6K㼈?:wqhd@O$jRf[K;9䗄rM\98*E=pq7s=_Wڃqf +~MrRr9mqUgk@7DK;jrj[uɒywocRnVhP*2J0hzqpg|@g(.;@Jd-A8 S'LrNm`0`hwgoӛrX,lՖ>KŊ-P=jtZ7u,,xۉ^a3:ؙ禒cDl錃6,$F;-[Z4J#Ct/'@~7"Uq aɤ̪[SG0XΙ8|n_]M2o+TJ/vT~[Wd7;$lSϯ[ [yLN/5Kt`,2A60xgܼ`#G|q(祹]qڸ2i4 ԍ} ,V3:xV VWsL&-\.Vi 쮭,90x1DitXZu/7*)\s#~M9,dLWq3tɎ 2zw bzȬA~h[l3a[+4%U)3 ]%[J_ bӑ:i|xppb\" BO-C<>M,Geyש-1=#= fM뉥/F՗Bۮ`>3yc,qq_ғn4 n5!ˣC2E'fD}M*ܽ> nB'rE[q2ֲV .D9Xͅi:g1ZY99R_ȇ/hc-8;W(KK+k{tKsh/) /vjR@eFDhRC} XL:C14j.1'.7>.큞qC}.N2ւ=q"jIO1Hٔv'gM5Kt /OM>y}zg 7&O~\oYr>:|:af^ Yv\k!+$s`}5Э8[զi~.*@AH S+Aft%.#oRD-l + WAtթ0jI::ī0{[k\Թײ[zƪJY͏V5\:XXkvoi|Gz֓ q<Ɔr딅 A2&?`HjvsQ=í|:̥XP jaiVzT)i %T Q( r&ZRnPB{WYjⓝ{͜EpcZĺS_=J svBFpfw*}N@a +Ǽ<2RaΥs0z,ѣ^SEp` .[V\qlwv[ꑹk+Gw֖!kcT<ķ5y&}66,y8%ÄzzLK]jxJ6ʂF(Wu+;0UJe<(+TX"[@@KȍH)֏/Ieg#P)t5yPdAH!7VPrm%786R>*z|=~˜4R\65u)5! hMۇ~XP@EEK]{!ޗ+g;4z "lg֑K"jx@ r + + O%QAj0@X;Ed1jB̲ҟA7WZM4;j蠟AW*՜AjOL:&9\Ϝmn4" ?Ry+uKYtz$c@#@&  P+S?/TI0aoټT,߹1_LUVq^#wѯT]el6:߆^Eg:`yՀd +&E|Kz eYQKyyy-6(E,7 ~Y@e6W*o"n׽yTtt cW%6mod±qRhfhb/hiO7 gһҨ$i.?j|,ԈZjCF$<>.F&*PokvJ?u:l w[p4뎚 |\OG5?}eq >?>% +A<7r2/=^nu-><#K;B?["*@iJ@loCO-+}jMLc6} 7*_+ ȏƈ7zNjRdaDmojxĝ1?gn /;n5"(͎i_ 4ݧ+GV|nQ]+Z2'wóoM@^!r!{Z;B7x >aV[vJimo*l㭾1U솊q_~ژ}]\v|s4ѭC4O^u*醻ӎwj6z-3p\P';ȴ~ jϝՒFg~H薗u,v⦱_$Tma.}n!VlU(ԡT=U7<:nrkkpQP-?*r]Mmwzkwm`!1.Op.&7I-6Oe +0>)0lS2!:kqa1'FoX, `}_ڲ!~@[Ӱ귁x-dRzc\VQ?7vxJrn2'XT!=Mg[ޛ{ܣIf( ]Y.8^kZ}4S=)28{#k?P{5^H-PsEj/>B}B fIg@s~Y}1z>* H*OяXtw`.BeBGB;=[<9LLf*/29~>~dw&s7 0ϟZA4J:z.zsDr% SG*(%eCa IRwQ D -)?(| +Fu1g|f]w 3ճFfcd6b59Fj|w[$~<0g:T sx[ lklOM#J:AdMA7<_ya\ӍVEЈtwR&LaW=W\:Zȭ[/>1y զPo) ̍t4"=*.U rzt8"A> ڈ<˥IJ:b},_^-0:hYchTփݘH ;jONK8/B?%jB@L` :Ԋ`Ÿ54[J# Gi<<ųsg\& Y[}+髗oq`` 8˽Vkb$`mwH~"B*fJov?ހ̨:,S􁑴sf xu )? >,>Wlm +pkRNPPi2dak12-3^QNXiLiܡ^=Pl(l9ܮgVoʴ u+V 7"|pvmc]cEm~h p!5ncu߳e:U6 Kdt>Tu CgfGF4V|WZ%f7+ngiDBM$Y:X+jg_-b=phlL5SrcW@ഩk]^O|C>V B f>es02\18MOW\TM5!9tz 1Лo`ϯSl/a]k ԸP]lOjgQ|uحWR*Dn_ )E&=Yp/=ǸJy8xFmTdå: FΓ8k gu[fR\^V^59_h??E!"Vx *P%oq #HiHB&1j2@A* @U_7uu},o/D[8@yEI}x%V/9:0=ć{~obn%]-_wdX(UuDŽ6?nQ ZrozCk[]+lK;A.+MµmIʴ;p|ø܉fp;=IbD0] a<ԳYQiY V`b-̅NB6'΍OIo%Gfp>y?Tlީ9ߦcrO~OҚU')UީK Z].*b +9CZ%Y<3<ʹ94Lllm>׿/'_t~;P6r UZ;ήaMy*d7glgxhM] \9ql=^[K˔Jt7dA256t])B`YGҽ}]a(N0,mkYK#oG[7+ZóhXʨU8ַ=QpgOq jԮHqź>3%F),f$h0~q#۳N9.^ ;\ɺP/g]DR<ӛ<RVa%YTdž'c\$W|fB')yLLiri]PikKjLuZapZN9Uo>2W$Wp+ObQʃrպ<4^lD@%*[ΛO0d Vb|VeKI-.v#L.RϑFPHK}bV-*ǿXRZ xʎK=s:kWjESbua05\X\]ZOug*I 4D?bD͆6o(]2 p/؅#ws,3S $IP_5ˬ3g1ASoF[T\`ZXX1J[`LAZ#@'D8I9hC}ĮvIՇMgkW̶Zochu@77}1:2֥QvoF,cf\-u3l~u@F-! 's7ߦx_8MgP,D5=+1UT zAQ6|LɆ[!J^brliCӛIW۴}Ue] GWշOgώEse|Ϝ.у1vW9gU^5;/U&˨|jQhCtRUpR6Vy}Dee1RO'#"DJS@q񔷢e #[_˼aA\ +q$^[V߆BuMj=Z{(CD{ʪ!*:пU*]lU8Fmuɿ<T?u'%^ARtYmwyX7"SVe=UIZ5opu20? "L-# +6Ĝ٠tۓw7Ř]Ϩ弌]/赞m,),4'5-Zysb^V|esP{ұ-t6Q^ !ي_H@kxX80B)|mQ}mV=m`~7?`rOɾ:\(_5_{}z=ypx0u4HWqT9JAߡicVעNYֺ{ +vjǀ= +vFؠD=B4fh2@U+CoeeRI2ĞNbg! m#0]fXQ:=5j[k2Tj\$1)uC)PvT(zzYɰe endstream endobj 23 0 obj <>stream +V53ElVn?{EL< *O Fs-/KD!!Q ˙ Gl 0J1892@ã ٍ6Hە:}>-fү C:P2|=t;2#r^Mf+n/+0Rɛ=J6WEg4p`,q<Xf'v}N`X5fmd3YUP wWfu?'nSJdO֖KrY+UQqAX8j@*2SJɿ~fD{W;Lnһ=^>: ͧb(Cl=tP&dEojsn'7REl[Nކו?R_z喿l ~ݶXpFvSZc48k0__d"e]FGfm7Gi]6yާ(տ+^춓ۂpyz(;[F?peFK }Jc(*7a nB% 8y?ңxV;7=5ஈ.[XOPulD6̻#b>|<$nw?G+K`D8&Gz$E̼OBp/:LvWċXT?g/BgÎq%+d 6yw*~ڵ kvfׄg?[sl^V[IUvYՅ ^ZJK33Ac\C\îukt"cc6 69bU\yUyy3ؒ;\م>yR#y>f2Y:k^wW)SXqo;8]lM^-`"&L3?Lb>“cbxnTڠF*#EÛ8CN) '&yQt!r N\~ͫd!{\0GkNֲ֚ >uM\DGE#%ÐgEF2~Z= t+49X[/~x/KzǧZLʁ. [yE1^h6ݴ]'c'8JUX䑌ޑcV>TwDѧ3Pպ^!Q` 4@voㇷwK粠Oڠ>A6ξ3/Qd]v.,6Ewͽ`x:n!^`*Aqͅbf"3}ҷR^V1R\{7y[Ids\ҝQqW_Oyy q~;*t5}vfpJ$+;(ð/:}<ݧY|ztNԻP7W5:#|g2;/.]\NJeŮeF +a~Nk;3a>1xP\~}W_ ЁOj>K.i5Us* j fԿyYm{BwUݼeNo +ߪuje-7"$w/HBI !<5Zkv}9_MZJg$u@(|đFD'硳 +-ՉSu= l,;*өbN~y}ݼe}Aΰ1t\+]]XBK,Vi- gP_ǽ{u8`y"I=G"{KPeZ]Dwfv:QϮrՍWs7o+5|׽O3!Qf9ZV$4:iwnG^FoNV+855oE5L,k]3lj:0ܿٵq;ʓ5۪ E<۸@q2ˎrj=mZn6Q֐RLVgZSʳ8!i+$ߏy+̩WVzBcWTdt! li?wyl}20߶R1dpIu=EQk'mMK jr\fZ[M]:>9,˒4]]@R.ѳ1n3̷T,Y]2V60jm阾nQ<걧rYsbZ}նXq|w2s ܥ[ϽYXhҩ(/^=ouHp~wh? ~.DòU(l{jzJ3Vioժ~\<siU8vZ8 ]fDZ)ƌ3f(IE'~"9:jwa9YK[633-z4~&GB' +b[ln + Cc-8ڐ5샰ༀ!QAq6 溷 +HiGIi$ɾ^g?OĎDDf 昲2k/bݪ!ބFcU4aϙu+^Av78Q0>|br7IOBHOj#k[!yb$2>a5ª%0`m8;A]dG><y3%hNyN2j~j;uxйtص[g"LR/N).b|<=iK)U!FHz'}j~7A;W]zRGHm6[sX6' pIUĴGV ;bx=q'CO%Z&ƫtxP?f\q!M|վEBlxTAdՅaw^e-)~&kծQܮV/5ighL#`<Vz^Z+:T2w29Qږ+aei.ixy5:eǃr%?a\98g)CП-ٿ7( +-Fb7pb2a͸*Ɠ by-1BJhcLbapE l;׺fe_J +D +D. Rڸ~K?VlL4-\@fi92vuK9>ۅY!6\:)΅JG!ʹBM)0[_uهz!0*]^K[u@Qdqڅ©8:w~&&:vAN֨ߍ DVoK.Ƴ(:8rk ġŴjޒ* +~D&1ZfWQhd(G9tP$V~v0A} lmz։XՇՅp"!jooΥ .4Y..2հ_L{wo87*4ɵMP~^ QAQ KӷƜR2A3 Z1éTpug?`t8~xA4^~T.x6e P8YN< +%BP|#:DߑljW3,᳷ 2@Xr |M2翢rܡ7B\:XJ3)}~@\F$w/ɲL% + vppȐr 9 W a]dHn9D<sxM2yҿLb[obqqς-%c){^MJp>8ɫo(s|ܱʣ- P2ɞ!Qv+Ѐ(tyf4gG+9ٻ>tshnPhh4aM}~%~ PDK+ p X}KT̛"(@9?!*:إۖ>Q5}iKOVTV/9^+fMCno+њG|8H'ٜlT_f5U/ȿUc1_3u +CQW懄複|]ϾXؒ0~_?ƯA}$ݧY/;p|ٱY>s*Ogf +Na ~r(lKX(|ed?Jؾ]Qm lvrI`3Z=X16ѯu5f ?ϥWgُ>Ͻ7W$,hif}'k)Zkݚ7;^m [EJtl*eXg6M-+Ay~0ӅԒ&F);c{IJ?:~e]5,qoWU,jͥ+̦۟)F8]4dݔd.6/#P[۝k‡YFdyȅ_zrgDVʎG1k鰈\JLi뽪NۥM@HQ{R_Q"9LS4lz!XW&0c'@߹޷)y؅k]52#kvțbQ{鶜rLY';vr)c-DIEES i +*^ %. mۘj{G ~@L'}"V>(Ggqⶨҳ'{/^ӚMi6Y7 +]͞qL-_Es ֭!@ԷG*}&za=Ǻpy$8rit:~wKng 2s1\E"u쎻G[yǔEvAd%u|l8yR'Zm{<7ڸqF{{d}8yg-5`^%.hn.2 ]0zK0hSŹvyvFX}4b*Y/6|Q7#Z{.}qTi9 f 4B;ޮDNjYp)`:hO kE9jcvt"ܷԖ̓cr59?8QX_=gw4#A 74)Ir%8Ū'k8@v=˺}&  ]t-:ڟ[i'jOFkgV)bVjehRP PQ*GWvw'{R\~p&7C># '!Y[wABz^",;a&e5{]}o{jD4;@/^ki͸-Ƿ֩Kbqܺwm!~4VMDds5ӕ;ߗl>]^L89{4 KԐ䑒*݈qdeUfl;ɝv u4k+*kkVM|tI!fI'^Y#3U);o3G[̹ +טPoB_LrކȼJ+nzl-;IQ)ChYP'7Pk +^kfj -h5-+m,zo)=v^U|Nq4"*b>pc25EpN->zwX22LzyW/@,,ޛDSwB{?F4W)jk]UwJMq>9Ʉ[U^Ss+WpOI$ICjQ*'aOvR}Mm:2]<97^9rRTA`) +чwڶGYL@7ۓM(ҔR^#;GVpKlv2aj~0[>a +qJ9U1_naR]eӸʡ/cV60[7$[T;hp}"j]CfKTcmɢ'EGRDitJj<;Y"m)* +Q*}ٕ-nKևyb8P㮰 ?3]~׺M%yšxg^ԂLѭ6ɵRE`{ +4!0}fBGרP캀>^>NYِ; +;U}[ [֕ͦZ뾧u}%3W 6KIBZur=$ٴ 0pWx8#3VoSFl }Izȕ'MsNl+ɀ T x^Vvv󸟭҄zuB$K̸ߩe[PM"#'o }b~}lT[OgPkQ`?Q&jsHa+$ҦK%ǖz^zܦq'C1ncuJU@{ +-^^:1Un[B^ +ݪ7n8z[~jL舩5\(jȄZ8xxJ*д*TZKQ +4xu+M$WhVۥJrC#VÐ]c~zc{KPM0\5Ƕ@\- U}2THѢ?Cl*Ԅ)#Jwc1dAF3qoVqܬ]ekB#ݔK痒p0e\en@1;Da#,r~pUpvx ؼ;ڿ>`n2-u?-N{[ȪrAԫG'/ %!кeX|Q*"I s IHadɐR O {gbDqL&DK4;lvTm;TC\_):Uirfv~ st@ƾPB]ԍMeǛ;u%u,j'jvjTq.u; +ʇWE8))Ӹ-!g ԁ2t ~eܮ7A 3?lEVMY%5Y3_w.W>p h`>wWؘ0y(F_V_ZBԢ<+u9 Ymgi4+z[ԚlkR3LaB|"o o|F?˝ n),ګHw^InvunV$jzUK8Im3cP37mL1>zܹ1iS|@௏ ъYeKno1~8O:χ{VzZ];&. yj#fOl++z.y!7V鸰bʒ.Ʌp\r?h̔Ǡ9]N|} ܱ [pou1|PD#94 T9 +?ZWN[E P4to,N[G:A&.>[A|f5I CFO/Y+DI(Eҭ3P n?W(0}\v{꧃g_?cF!lYy`?1+Ikm;qa1{y4<n6^`*ʷAq"~]lu[V}j>vY%B?Jo^(L(g3o 4' AwjaWJ}yxn5.٘.?Y 3"q!:;N8GL g'0sv޻>s}ztCp9$ +Y1iHիc2B3ʴbb/4CٛC=4t+nОM|=. 87w`_]Ys  7B$ȅ8rŸBYڭ6n*{w 4wRnT86cES$d zȶ_pGmkQQuzT^Np4(qX&/>>{]ϹSu +-Cn/7-kCL z?WK/ qQS+^+Π~گnfkk4-J^ +jY͚\f]c +KSws j+jyEkph@T+Rpd|lwGWr6 6ЮwK1NI:Xky2,$>n/fwe0_:߬];*fіNj~-:o)rndl26'LV:WqhM"p|T(4 +ױ%L( @}9Zp 6ˏ=}P3N}WkmynT[r`!0O +Rk&K#fË4&`?iJ׳yjRD[͘s#8a^ŲPJ:ɍ9`J?">iv;"9}VJ?[3’z(6ݘn]Yh&@Ĭ̴W҈ΰ9Až;G2r|j5> G~3ǒaGJ<(th|dygA)MawۜY?<]՝]}E^4 %+BkVNܝ1UJܱTjqdk)5&[lXn1ώZb픦h4)])[')Qia}+_jf5`cXv6QŽWRnz%W7M1¹\yYUcM_aĭ}\!?R[ݲR%fe <FgT~G>D#y4sŧ]r%OTfK' +Dѯƌ]8^Iڅ!VWJ2CtA)ut%~N=DDgw ߷-=dNI P}{? v«QtѦD1SXKQfJu*vT.WޟyɁ`n8IW\NYKVJo0u"H'K67z ߨ^ѴW9-(Ke\I_ȓѪ +DZ_b xη?+ưNx93BRܷ;:L.9=ipvQ- :[{KΈǝAvF] +Ģ$>䜑Z8-"b ]Nu}>%t U{$5nΓ5drMWºEEy+X*Dvj*vиcc WH~hBUmul^^ +SeG(ì.dk1e +g#кC|2q1]qSg=^6.^8{U"h|d +I.סZJe8XR#痗μSxSrImȞǐNrC_:n4:2)?޽To}~׃RW)H.5ךZwfmq Ջ-cGK!9˸`٦Z b +!#?XIpDE.ۊ:xYr3,ʣ-UPJhpdg$ ;BNo!>_YaDeav㼣zZXP VT2}K»FYZ.Y13~}洍. AW!@òoHC)ȁU9H-1Vf4sxjT*kqtPo o VlyhsZ˙9mJtW3j眩t#4F;w~nMVܬ RtFI$< Q W$`QĮ1T]dJGVݾU@m2h\srP=SZ%v + jfs!; (% @-AJ!"((qX @e1 'Fr)@Vb" a>)nqX`TWv\΋|auXPHud{km7S@ЬrJ>@+RМ':4X.yx h|$S+:hPcTc}Cy16e3BT٪FgLV4`_KZ2h,dSnO)sCf ys`w)X͂\;dA$J VZ ׁYL +Kr{rлmR;xwgQүV;s 8э)"j.-a=Z}97h+Ce7'=Y5_蟠gl`}CZq\?kl?^apl.%EnC9{{dm>rCݥL[b_;z/W;ΟG_9MOovH^f nƇm9?ovɢޘsU`m#du֯2nP>/ +Pr7G!~G_|bv54^ڗ.^zo*}1 ٮ qNG +KaP>Żk0Y@|^}Au%zO6?[8kf4ﴁPGSW =I/Wr/%, 甙#S ɖACqJ/%?j>=>ޚcG>Gj:z{H0,C$dxWnno€A?פ5,q}\Lٚ#.ΌOM^6F&E\.>CFa_itM0rsPvCM\=V$(;n{A㟴uK'+Ař_~jI>Zjc774<ڵGG8@wu J_~xs_ݦ{6s+ٍ;qzf:4ao3(ESgSggv]9\sx5@G{ַ3/l: `]K}@4'2V%_AiN1S~mԛ6NNJkQw#ц_sU]փ{;8աc[ݶž헏ct_ʳFmX?2]`rg?qdVD7VMdd{9a yN*MnH=J ڱZ&5W` 1wUrA}V:hS~3/0`?AI{2roάچ3ڴr&wSř􌉤7,%B}JΈ|YmԲxpq6CX9pTl+/DOp5?.vƮtrҨ BiT-]~y_\yAy|uK,KMKf/]9SoT.:\J# _mJ5:k731˃C3(%sݾCyWdT񩃤@vɔW3##.Ȉ$ ˉ.>Oۍ|pX]6Xg2?G']y-yU}?+Q+=N]ʕ㵔/&7S-%pMy6&ѩuč)NnE}1.H%>]{͓m ӧVT'ͪ_6f׶٤o孶y5Wΰ0t㲴ޥ1Ɇ*s)qN)k[QJEwV$*ĎF_D& n# ]U* +l +o]-~W`*<߷x +=+kު]X: 6r HvF\}GJ) Mu Z@XĥWIRδ%Lk^+t~)=r( 2 +SȏL:u6?|=YfLfY禯[6QW#3֌d5 }R5]i=}r6fs.ZN*SV0(nzU^&KF~iq|lUU.EQ¬6f׃iV{tTW[>;ho޻mTӺlB3dEJH(DWk(]܄_7"8<$y:8.e[0x#+=O騶6:6Iں)s@&#b$@ Zخ,CZۼh7fX5L-ⳋhWqDfGy?]}zrHtN~ƬcTbnV9S|%pH64'.o%(gdIw.Iw H"Xҭ#Ǚq5^}7_.`V| FJ+v$JEc%j!W%mG[vION̆&urMX _.v[yTH,Yb\D)#u ?0>,>%>ֹhQ/ =V_$3_p[uTσ=[.b;$kei~ƴ&w(T:./:U0<&yy(K=rz \:a&`mf=L]=].: \#vOؙͶ+3y: >!I4sB/|* u?Oh>XP:%gD}'&C!E:&fC GҐ-b%^*=\mmYs7Y:%@YjC[%&!G-6uB W<cb۳V|u2%Q>^6ϣGOy' q-qd`:~~b.F.GQf-gk;Dq\K?zvurXp8Hl<7c VC60|1ʏxUo\j2#z +4Bf.~|Q%T'҇xӹiii`6ij^ )©-˩L wSyLnJgoܐl߫tO3n'b +PzTHH/Z7*/@1ܓeQۘH; +ҩfqUv sv>*܅s Z +Owlw1-(xM!S`NɌv0\۾74{nWtPz>z~v؂m z$2_i g& ^Mo{ L̕{c@)\"FK$&s>I$oX I N5Ɨ Nb$ N Oo >vנ VxB BBiP-@A`w ԴLjH\9;/(qtоVi\ $ +_o𿛺#M~ۯj7v@aPD(e+zRE?cᇠb>l+̶Jt//[[ iP?K/h 8q:W`/(H7wa[7ր_9tvw;*e[:8$fvεy& ڞ#:=y}x.O=C9ɚ.MۅorIVչ+~,qGO';Iyr+_#뫉߽nՕt]:[q0taE g=҃-]Y\rmZA_ъd^E#Q thԘk`Fa055IanO{Gj<2vef'ΐ+~d)rtIUPϫ5zv֝`F/)Ly[6&p4{ǜ*5ϓߍk>b@O =uW|XBƒEo>ψIM%m'6Dc+f.<JhVR|2eAahXda5je&\k +2%х,.%͑'$#Lqn#_؁!2 #PN󽳭Iݸ]mKMNcl ;Z֞aLV& m#>vѢlD@ɼ)6Zo?j5ސ'N/</_{w0EpRbGH,:9QK;"Y~GH3lnb۠RkgՖ1a +V<*8MGyoRֽXϺJ:o 54jٟkaLiz$kKQnVdfvDH#`{N׎o]-5̰~= pmejmψl$~;|*Вri֒嚥6j:޶JOY5 +]tU..;MU~o\fّ7K٧ύVW{˞u}?!g+p2ê}ecH {TÊj\42bż(Uetʗ7, s+:$ܴ2VQ^)%_Fz;A+J#bnvh`ˉl>XCлd.f =2ן_WoQ-:~TDNc=e1]jXХ{/sYy/R:Jj j]T4XZu#AjK"ҭ]d} 9NBk1$/0FcsK7uSGt_m^y*w`+SIweٿȳ2ds+hVԸ)#n&'*D4T`#]-8<xJpB7d~%[v2~qv&^?OxS#e=j@f)kTa_ Gs}no${1ǬB25BvmAl&M?0/CVH6,7z+nbAfLsxr?6轘kghs|nX^gUMKI!y7;-^f;k*M`z}T9T*[ܒ6s;M_蚼'\倿%_8|S4 "yve6kZLrp|_A[efoF3CNwn e>ƕȾ۝۱?8N:-[ܤ7*h{yV%Atl#.vB4fr8`'zzcǕYYiZ6\F2}8 ڲͲ՛?0W89jeR,IR̿cR54udZ/o77ymWCAlkB#e%v qm-#=dQ0DQ rMDGACP"GQNɸH$lR“S'B~2{Z(*#e:?*Curhx]ᦎ +v2Tut-RPzɆ#drҘR@wʊrꁌvLJ9 ' g N- cȈlhP@Wo^m\|6u䔨VhɕrIg(yKMخԉ]i t2{ΰl}BW-BJl>2y/f)VGNg`G^9#dւ rυ8;aD"\9|wS6uj_'9+QY0PdAL؝9]}` +(:ٶ;YZȏ3ְdbc&3އEG'|K&ł0MN)B(TKU+/?5 OPz{ "} _ՎZopC3fP;S:r2P9f=3'm \Aλ +]~\vy-P)0dS@-`I^3<7s0z@5.N@mr EZ;~i('>|^6$*CvZzETM> ի<3iH6NІ8,-Y`kشlP V\e Rg.d5͏D2"U{5y[fفb j~k;CjQK:IxOк%x|z?эfT`Z {@=z/@Ŝ,JXSĆ^aUy_sZԖc\T"D\ +~w ?+M;܌~Fy ^}7 w/;<[诽+5~(?خcb6Q+'#ܗ.^Hrd Cͫw B*O3bJ6yUq6>;'&0F0vcO~R/165<ԲrMmu'7j޲_ut3b&.t(}vß'Wl9bT~I4QàC KC$k [.|8 άnqvl'ba=ŏoc^!_꿬86M/ҹ;vJ'pEw5X;czÉ:+ {'9dw4;,5s[{u4V:HsE8_|Uvu,3.OXب|sOu &Zu"i85{vv1= +`?UqcV/ ?0!S'm⌖[P7[^-`y8TsX98kO2} }%n?CzOyKNd9NV&]mm"Z;mfD`(B܈ !cRϢ`Y_Ձ[ ӹ8{h}ҿExd"7ܶǟۓ' nfWuKNvL {NZlējᖓ4iYWW ڇE 9Z-=5:sTv\1U +!rs =NCݛ-_YxfX?p؋]ӑcUW1dg2uhjjc5ń!!(Ze7Ԍ +{]&*FeVU\^KU)x6"|Ol_ydFYh :xsnC{7[+ʃ:ƥ\`3闤cj/g/ĴyXQԑ4\\|b*47w.;@\Prn;^5D3|_ f ;X rY\dcpShoqim1s4 n`;ۘ;Pz?4*ug)y9.dA^h(='yq0\l+,TKFߴJ^91elϋ#\EIɃWM`QaJi4j\](1鎷_R'y[N]?9̕n1'jNm )j 'k|CFi! eCu]=KAfgBH& GZ~ 펣qz~MJ`z+e쉠DؠOԋ%&Bܞ]M.jZI]Ǵ樃I2WygׯT5&(jȑ`'ҷ"wBR++y-Ŭ`!_{!x]w|dQ]LO(5Z M"%v6z}:Umb۷m-L$qVunu0hmpBѦU~`(*8|sqRlzX\༝>ֶ˷}["u]UE79.H9mϮѐz2d9(Tπ! *929| ȁt?.`}-ZʷGgחlpi4IJɫ^D㠒`Tl/ţ1oAGajHo>^=_:%5;mP@]Bk3\jHyMUwP%//𦃜^bthnvt:l׶cAcMF@BL2WHPiA ur%gM@Nj W&ٜANn Ǒ#@_'W@f@+ڟvF|2!뗚XКY-""4r^әS__.Fm700̪\Hp7sO +`B0ɘh\. {K\Uݘ2Rmc>bp2gQ3WFOtM_߯_9ۿ>2npf ۢ {G ܒ+nNu'quz<*1tEtTH pq%~GK|l^;^@ZxB͡P7+vRNvUBvᣀtR+F| }dVz n'_'Mmr?A b1 0 HR֒U@: ^ +}ma۽U7YZe'wzX?Wv:ϓ1>]2nDҥGD.,v--fW7:LVz~~Sɰ_nۻ_qHt3江S#zԇmHqc]Klm7R㰡gӚ aK@ar?l_( h\5~:}{du^`?9E. 96nOչqS)/ŝZ \y2@~Nl]3V3ba&}"oS;9[Qc_q J>D' 1X7\o׺ɮɿ=*ϫװ>[+n{jŽkӛ{c6Oʓcm7%4z< Jk:)7WGƘKz֏H];l8ݲi?x ڶeoݲgk]ɿoXW8zOa oknn[.:?؟\v7øOc管ÞR۞z| ߺzۏJJX~ZP8;vja;:}<=6x&bGK& y?eK#_Sv3biNVV +=]ڞWZ͵u1IװMtk38?tQQdھuAJ'(b}ߡdߟ'IqspL派ՓԹl7gkaXe`Wf+]B~ugOok./%JGMiv Ci`7YX!7/aJ}zhuGB ˀh7Uq6Bh|WSgj,_1IXxŷA>"+]b٫0/1[pO, GO[r,ro0Νw[:$r>R>QA>ce4l6V5MVTafy݅2Ò޾t$(zrQλ'jThk ʻksy[wm7 Q`Mxb,ͱ)mLx-*fagU4\f<^rryՏKPI.^B1ͬo]]-RC-h8[}qەT8R[*|v q>7rLμLJk8{ݻIA4㠻VW?U|PTӰxSWdC88Ou}^/׶A^ǂ_y]xzhA}=T yZ-#_U֣^a4([ X*AmnxԏD߭^K@N}V\66/myZX#.6PycCÃՠɣ $y\YpewW㳻flW<3#)ko%/&L kGzD+=MP}ѝ-~!%܌OjޘR[9jJnv{٦(2qnI#{"g+B$Ie ޮf^w2UBe䒜\a6j#b4rWRk1=GkXɭ*t92g79k=^O?Ο]5܌"}]SrN{a]W;3m_Lr8NEV_Sy:{b7UZh5A' +\җ=W 5~U#RU_wo;$Q"eJ,{ge%?pWb +!U;R ^]prxՒA jw</ȑ4P61P(Psz%FTE,٢ހ2 +]E[\\blX A:ʜyv*A2m_J:=bqhTi&bYl˚ZJ +tbIjZS$rZy:UVvD AõwB; G"jPDң X{U F(*Ez8 Gӻ6.Mg8Э\lK^W X#6b+r8;aAa4xAw7 U\\2WA/@E|! ʛÁ^~AC㖘u4aH$[f!džƾ.j.զɟ׸7UCٌPZ#i9v%yNSAθ cRZAW'sàpBjCcގ"wl gC<9/n?{5L[ Cy5nڕ^AA׮mQe$oF U},:/),OP!d=H0ۼRteb%GO>J|ȫGYJS lʸOP?^ppu:~ZuݯnʹxoEѡA4Τ f3$р Rn> H'z s@")A2 R'rb~ԃWž/׺t0A2ޡs~RVZ팒:xSاJ® Ր_{S%p\5&G|7L#@^9<4[6yv2d&fJNxcN.mmH"%P^ݛcOz!)z*&L@@ d J+I`a G@7S3j9sҦTi +;=^Uɶ6dZq’q^Nyu:G ȜU^0$X#&`$I < +ۏ8*Zt=-=ri@W5|L8鮕5nxMΘՀsi5j2%e% R|Y. p1glC)eU2TGYl.5MPKd `I +qk-fM&Oih|*Zg˅6c5'bmn Hj|(:kI( +6DJZZ#j R52L0Y$@b74HtFRr - W5%7Jf%su0;35վM:1JW6fWv;S b`Ζ|rtnίwpN9upKpN- u_\7\L~ٯ XrUr4eǶ,1J mc6Fn->bUHMX+A':@N Lz +C@$nZ,m_pafiXKVФCVn_U]59 _E >8{[:\R&x>3@/ӳmJ{hn rQ!W- +VQAOdB<Ln@>K $Ezkqr:4p3]3dvӢ>SDðkqoԿ\nV 9YWd|< $ë #Qš8cGcvԼȿ6zggZOQy?)[n]?CG ߙ>eFƁ n +c.vr1*X:[ՎAE h1 ⡸{{wdo2qG >e2ӥ/Y\ߝ~>ky1<ga^gب" !o#տr见Wz pyya쮛kZvZč>?֕6(!9N6",kNv=qjk­6Iv˜棋܍Tx>(Pǯр ~kFYEj,}ܙ,G4\0=NE27c$aԲѡr &2ݲ~ū_}z?ʡ6j#Ԇi ۤ;(àjMfKQ|r?%ڼz&":)r幢y⥔xzV[y:ngjQGiu]#]8wIw<'W;鶣8h+8v@V\ޓ5.-x޸7Cs Ml&ƺi jw]:s1^^%~U+Jj$o;W/G==7A:eH$rﳮꊭqmPkx_ob˙XvٰeO~ݑN:w3UMZ诪_Vk.hA4qr4 _KUc"*3xZBWoIÆ͌[j- Y>UU?` OlҮWݕr]r%Ќ^.DZȑJ i9[—|+od<@9Km9 +X%e=UƟ|"o푿"=&(_ym+$Co+[xV<JXyl]X]Ut.D3[X_WXnc[:a[9[ RցG)v)gylf\k5Ht"_v4'{MILSiϪuz]BT.5S5&jnEi]|ioPTMן|:Ue_MtwrV0odutNY*24ZZEGXcoPbc|!WEgʱ|b)sw~}JUTω?TWPYVbx)bS#^&PH =bʲ5rVM/ckr1 +gMh,yn_Ӿ1R;ۛn8mٴc?[>/8j~xe|XVt'^o^:P>Sh h-(HV(!āصB03 0?]dKKF6Th2/G tqT_j~+i9Jy鷣\/h,"@ɄAjiAJAt#@,{F3b &AkԤ0[FARuk3Gځͪ-r+o_,[ZoٞIviÔBpǎ#a؅D#`WHOPi$v˭c pt3#``<!b$]8nΟ]ڳFЪ۝uvA?,*~v'6gFlvVI:mh@C@4H")5Axq> {rV-c.x}vxy]|_j7$L+oq m2#Sn: y^I+&K^|Dm:RYxT1 & InI@P>A>q?5X''hrc -9ljNn`ppֶ͚ }]:c-8K%gH_Hb?`Ъ)8$  I*6=6& ~d["|+ze+vX&>m=t1"%rӵ%qj;GS\q| 8u=+T?Gas8S?N@J'6W W,$2(8vSLyԲyoӜl^ó6ϣ N6,m{] Ʒ ]RD^~; " NHa  l/kg1:c7rq]`MvR{u*rIxwCX8qo/U]YJՀ8O@ =dz*L-2\LjV +ߤ>N[,Z8K~=p)Y<dqZD@.uUn)/~rE7[#/8XԃӽUp?_팛 s@V {׀br[$QJkςdE{HJh[휩\9?/sT,Q8p pؙev>"uWMW/]*`du~=W[:IZ}Y?k +{3o\~pqÍcc-.eTۋmśљ=۟; az.Z>uӕZO~jMa?{|x][j\Gڝ"^y88-}ECIr ΨqnYj+;v:#}tȋǝ#Q;*|Ľ>P}9z$u*:,r{aBjs9*ۑ~nĸp%Ӄqj˦ehRibO-?El=CۂrVIzemƺiY0lD0mbʱv-`!\d[H<=UT}ZHW'x+ T܎<6H3,&Npui0[sb>UԲѯOuY񬲴4}4߫4[ B}cѵa)Xtu塃_W^arkס]G>wD.f±ծ:wn]m125/W{WTsMXe, s8sl9S^}aavnʫD[¨$Gzѳ&bBb_aTgf۞Hƾu_xw;' Q`L$̱/*a`{pH} N,|*99ӏKr6SB!GZPx3uzWQt>Z=y앏/6ZLÂk ٹi~}X"չS^U1,\+qAOwAPb l.^ jӳM#UTO7d-|9#bVnvӬcLn"dk˸ulLlSSڕԎֹ7eTQs81Wr2GU_^BKR\MչLCz;oHz/ASe= +vwYG/lHĝ= ~3rR'Ee)D1'i9|>-Bڱ$hmNX~L/Ors /%+>( Ւ)Bzi3qh:0c>4a$ +p\M 1ŔeDoUOPg7zހ_=Q`?hGՄBd`ќZ>]6Y;p8q2tޱiߎD)_dI.9q܉"u~1b:?(O[ ([)xgFmUVfcVg\updl*`Z\j~~duDuoJhj;bybRN]?q{|h$7=SҞ62K9L=iV&~.!gae$5 + JDv--Tvh}ʭ|=*,(nC`&$O|kN^}\S'6 \tKW*V.9E16{r!*pxrö}!Nϻ偗{"-VE^KV`[;7RgS*LX %u %=`[d(W(h|'#>%LnAq& Yc~b g-@zpD8 5BVvqcȰ(k&Q>^b@z3T7{N{:./V3%ƙ-. +sn:kxൣ +ۢv1n*1UC<ރ~\  +۰޻M œ6VyFƝo8{)j`ylf^uvfMclmƓdG]{tE. $d̢Nyg r^9-=@*5 + s_ݞu`jC8dGMբjb9m"8*&}d~xsy8pLpeIyd-{аֈ`G)PsYFG?@%6JJ°v~ Vx1uXCQoxҭӣYm Se巄v~Z?j?(w\$zL_ qq(m @P'1H$a> +yOpZ<DR 2@G>@l2:-}Rj~%溍˳52.6m}|B}f퉸vKd +qs݋ e}j0fŭk N[' +YX~>jZcG{wN׿̠V*I>$-/Ryaq9+5]G  < +(#*WȂl( u;[$\!&@Nӵ kJRl ЭW\_𧁛suP9OUj۔s=R̪̈bŵ@KS䕀ZLLt* 茤$u@h4 ̷Sqi2SZrZcހy@)PUj +I LʞSmt2kg+S,N`_9%892Ml|j&=Ca"`z_sȴke0U97:p3 B' 1~ƻb -Dۆ+ Z56Fo JKpִhWB& ]LZ'!CwZlN\)yZs""J [j[T1DI}( A,?t'A=HNl u]A*LpXTXd't{&ҰYtο~x~.M_&wm }RPPl:ee|o:oo%=D.};W=|~ߘ-3 +@o, +ӉJX8U}# 1 Dbm80_fQ>πn W-q`i'`Fb{دD5V¡Th^*m"wor[Qm- +HlH7i+m: ޞHZ:ZѴ?*GxTYD0Rin{ÿO=+m@F  K rG {i'Gu]mJgFB܌pM8+-w>~ +/-V^\1g79YX0_Oݒjm/y꧇?|XCq{Gٮiun-2O?3 ͋׉6 C} G;N8!9>}Zf=R)3-';9N9>)z,D:}*{6 /~^~Ho.~-~d_UcP”hRcAk6>2Ȫ]߀sJoa|쓋<[[%27JckS\ tv4pI)7(4`#^z~aCq&L`QGA1żOTge0j;:EsZsinMQ1Kvd_J<ڻ6:>Zj74(FpXmv aת=gnu]֓ЏjrjcwΥۑ7cܸ?\5˴#߂YJ[n΢zj8l7֍{A}צ:wgm1vokML5y5+kKc:4sl/60e +?c'ƣ./NKWkW}V-xZ6E!YvJ뻖LԹnF(Xt+ٚ*kUXԭ8,uu^=/*؉8VڄA,3foU+?o]kй47K7ȡfX2}\I5O٭[A)8yp3i` l23%'wTt K|)ɼx.or,WZv,U\$/q#-FW-KCf]^ v٭j٣DעW*< +Ѽ.2vV\͇W5_ܶ[μ#G F/)) aoJ++]sm*vmgwuCa?#᳉U7˴R.6Lz"|(2մP#A7|RZiF-^Z# jJ +:&GQLfKmɱ҄=1sVS&S^-hxROp#@~TIb&^M8u,Y2(i]@ +t {5\wȮvӲiqʩZFBqՖ|cZCQzO9H s$C:hPr%q'Ss+jGfw聈X2HzV60owz RQ,j9#޷_Th;B@IP2l +;5A=sè4)L)+w+؛xM]?T8i}["ch:AxH \&AHlH5L7@ e=9c&' "Yy;Gy.c\}$mWCL,V? Z9y6suӈ晜+xFOp? Q'ǹQr-ř;@y7ISA ET N{jmi6P(O-d^uƩܵXx_V5̊#Y=_dqQQjɶRH$ ܈=wCނ1@y; +( b + Cl +8wIp'zrOϔL~ھ]n;zv)86p5n@zŹю&|0^e +fK"O>V=Fs`c 䒣U` +n 4|,S*RR% 0yO~ =zڬG?h=UTU؜Vm2S<^$ SV)3SNciolHl>'G4xK[ nZqhx [ג_]N۵*hdaUuDySW˗i9Zī$3<|vK8,o*]qM)DT (  + OP< : y8B~+z}lAM89|kLy_îG0گ.\V *7}옆b@7 h2M- nˀn>``p'^C%B'g3wL`ݽ:Yo{iF#i4ieS+m2¯˷܀bA9gȎDcogR:4bnp1ĊU״ uC,1XK'b[%C,nmb%"78=sXbޤ_-#؜dž%͹ʧ՘F:#ݠnz7~Jzk*93OS݆:sG,spC΍`d^`/O֯\a:Z[Fb}s.koDF?3՟{C$E%/SdL +O2so=᭝veMZCJՐ@ ]ҍfl3mp W3Dx`0`Mj%#̵ik!1ӗL{Sqjzbn#h: B`]xM,G܆-{sLztH*+sz|@_o{S;b9{ZGu=|"vc˂(bSj@ݧnNjη}69Cɉ5M{Em~7d_{ܢm ! G8}6.=HJ"&_ +q9QuMG.NjbneNl%S}=ڎDeq_kFT~JI8qϗ |.mHpYw}D:ZXFjQ'QrAHO=FTu<&49rʧ7l\.t.r'*y[z8u9 "3 NCAP:*%|}6ڧ +zhF)!r0oϧ7nq7@-rK)Fk"LÁxC@ +!u&\Qٲ͝8H\TtkgMzmF K:5XҙnC5&u^t[cJou|A{OhA_^އa{v'KǓǐޢXwK[M`r^ۣ>{_mE +n|?jЪTӠRt{4DL5 UmP F56A,679ztGJ:83Qipk^VA̳6<[ +/P KW371Tti_!muRΨ`ߎHtãh)Ncsўk0'b YWY9W :|/T):-@4gY =ZkWlO\hM[8G-]˕E\}iSvt!a6O̽ŷg2Y̷#$:Juݖx{JnWKIc~˩18YF FK0y߭#f0)%ibI/^3ͭV38m9XiB + {y )<1kPr?vs0YƋi}Νɔ1B4a~ +V6n2rPX&i7,Ym9mU R24MӱKY[XP؃nȖl48i˯&]G-@.(Ҹέ,u_ hA]Y֭s +!rM3$^m}0bV@۸Ӣ[BW>cm:,5hm?iw爣!C?sij]ے2vџnωĦ L󸣙0pt݅yq+;k{e Nl77uL۾7`s(u #'ފm-Q^ +q!⼺[5SG ʴ=yP ,ѲstkMB}ټ93mи5;Y*jP):>T"1 :>g/X~b/0εPetEC6bbm?WiضLg*,,ym^l={d*uϪw/_,X~z}W0*iEX|V;Y@A[r^AOg! ]/xwn헪^5rb?N$rU1bԦ7bpd?/™ewdZ_깷їe_pֈ Y\o/; {e*c/x-ZʹY~t!/.6J(u,~ A]bT&މW%̓Y`믹4^W9Nbd LD7+֦>РH +[KotɃt7TɖښAu_; +v$#wi<{uG;ώ؛8 Z&Wx(յmFJ%P-nc&zqc0h%1TJ6X'*)4Ao֥%Ch,EhLɪ4ki,$Blm[#Je#;n.B{i^BYid),>kE^rKR_- X~4Oy2򡫻za=A|vau HMO2)ôli=X*36&:'@XeQ]KW*LeXz;)iP%g!gm D[i&SQn$a %֚~ަ=ƷfSm@J~4uhи:UĠ܆|\ȿH[G1H, 7-oDwcrW#S i9 +BP64^%@8eɼGT tD`8A ]2~0gE# Wt,YV5Jjm6/=aziPQpmd/ˤ/b'> ߿_~<iiMe[^LƩWα }cj>@ayJ[d+#LrmZ!3й2E} R+@̺}PNPJD!/HG+ HZkʺ( DZ}[f< +CLRF3iP]ՒfstŀqLwgaSn4xCXK˼- )sՅ&/,XݖyY&c<@5%8qf)ia(-O߬ T\O v.jK { a*؛e僋)!̞ BѪh%*26߆a!5f?u':Bqq_,E6֣zR!EaEg$6trͰ !YuǷ7[ Q7A˙45 ݶGv^.JΗڽ,jvݷ-fP29<ͲE< >K fBZvy|Uη 7kw&B +[.4͉fۅtgE:tﻳQ!iC1j- /GګT•Kzo˒MҩFEh.GHc$1& 9^/қmt +Hp+w,(y3Vx,Ȗ>Z5H@_e)FZyNҖ=ƌmv ~XeJK.$We8^:=Vṷ$ r+Yn}$q~)&6鬎o Kذ,?N=q|HM#֞0Epm">Զ4YQ ?ue+"ߘa$ ޓ V!FfdmÍ _ 5>O:ϸAq)6bn>J~/7&UHZ̉x5 Ev' ]Y= +/g({Ezc}u6[k|F}Ko^:k`_5^n% zd/ɷ^g{;_h/Pˍ'u"Y-'2mTy +Ssis)Y@CZXQ,9o^Bww' 5hOhATy7P(rOF Q9ozp*jJ$VAz!po区KahXb[#)oF(L‰#EȆA4k3tM].ڑSb#佴k>yf +Azh8KZW$W%;=O\bXr˝|Ys38=jK"^yWc["Wrd׿B~vqsss>6*Ur|f *½Rgiqּp YB{~{qvi!4I"oJ~ eL, uo`si]0Q;\R#!%h`tTځC|+?B%QGg +zbkr;:CJ +UFMR&8k)ROA_7W1Y +XX_/QZ6Ekh5FͶ>i5mdw#2§q+#J7υkv?jH=+|da-N@jO9.nfa$O͙߿^X( +KuSc}^OdA[pʦxҶjE^"Gp{ pz8acloJ덁36hEOC}y=+PX'}SEeQ:T{7%:n}4crkiRoA9ZL m)MY&V^S܁ʧ_73+~A1Hx,$eoFyy28 +, +? )a>G(bU&w1fǚ9^TEY;H(<, C,¨[2l͞"LR}`tAI:Q4e ;XїJq`@\X~R(csT(/? +G"$a M ٬=$ /W{0AqVoƲ_ۣ>B*xf6c#>ޢoA?}АqnfQZcS\NF:$<* k;9?:*cxpͮL9nEs̫-cZ>$PyFDO#=%CUTdnmkm7$e +ځ{]i O_f]ʫX~XVHuȵr}ea~zkm[_ +W2_>NGfr(YFw!ᓪꚬͥseW6] "+u,?pۓlIn >x6/qFu=&~ {4X +3G~^,j^6o~}3JXY@a{GcԞ +̿ gb/F Y\Ί~hM"E>@G~i"\n-dٌk~jV3 \j-0?{mn_:MӉFa&ZF!^;N)&|<|_REN>KBNLF-at|j E2D竰Y eF[78OR3f<_2ˍ!e,O>gS4A.+'rl-0}M^Ntddڦa։EA&P,!l5`-Zp7:p ׳ΐ;$Ӓ6n+w'j9󫻅ɞS[ǭiN j +RΗyO~uQ=.OL +9 5-g넣DqW,K=ob`g^i??.XXvg=,i'3w ݓ jS$Cq9Yvk'>< 0\G64 ]?ޣ5B tq/쎽7n>/u+GHS˟%ż us)T3b t'D9rAA/hF`A0 4RLΤ{MTW|' RNڙ2H[=<9-V/HA_8hSȳkHSi&K^ h1}v !ZxTM-ERZJy<"-.ײ p2~j2HC''$BҴS7>#ݽcRFZ[2/^q᳒%H#uZx҇%j3$_jP<&e֡U!&tACi +'&OFA>e3 *:,yo$iKb"Mݕh=!; Rγ'{rHxH! ßbEiH"M.j~gdžWfT_\zR&I j&QH5m) ?nZ)@'C~J{!p H DWv%v_)_}lIo^I#-~n/>/%@ +hJ;jEdxbJ"mZ$ܵ=B9=};eZh1hJ{".Hܞ~`'D_,C*)6+Bl Z)c +"Uֺ!"g(Bl,23 r4RE+ "gglW j~ n~uCo}*ˆ<=@"To 55vj#xtҽ63J>@ǰg] +(ֽhGiiCgN[ۺu~2N/X=[]I=g\ܺ>}Eӷ?pe~JE/OE[.נI', 6)VռĐy>MD +٧Y2%)AH/ԕ˩~ӓੵVއا1P*ӵA9w3N8xvՠJG[9iV[)D> =+ґE +1 +bA:6tFJ sOS_<z8@"`=) ]Y{u|LRZ̬rbIq;ȆXhrnA{:dq Ƴ./!_$F-|AMu i ?Hh1Ftxa,%gDdA/=/#x<&Ch~42+ RFXIYP5~"֓&κoFf8+tM)OF۾25X|Cɪ5Mev\#Q=Ҵ% X=Xc.,툕4Z6DVmI%폓ZK{{׸9*Ԩ:3 [b^MJv;"5X:$a\C۳r|`652ÄmޘH\~X['p2ԑF&;g"aR)K+Qq,uV'0xX9"єI 'w@ - пK$NR- r C!CrY!YajU»נ +2f:iI2)H֓S|=-A2*4Ε/=jL:$y4tTUaq +U4,nTiyp+R +B]^XKysK'VH1F]fى1o'-3h%'h2@1--aRmn-XHIB:-Al[ +ܟni0-P +r}{%!,'rE jM=!*3EuݹaMlJα=dwn8 dDlI!# eC(_[BPiY\|*HQGtpݟ!/ {}SDO]4/Nr#&AOvJXE\vCnq"NA} _/|\u_.ժ(B5J.Yd[2.Y5 $  +jU)#Z{;DGFKX TU-psu庯O +d5:nUћ7RWT$&o2+ 9+vIhл7)QS4g+ j夓osw^K6ugS}C>ՠPtdiQEJf1F/"_7Th4II &W/zł4*w kTh40jRfpnh"~ܿJQ ¢.CJYIVZAsm'V[57ݻ{_ƭRiŀߦfrՠj|ankiJ' +5APGi/ 8@PdԂp* 4G + l9L:VwjY߅lz}샅߶Rs᭳]ZY ¹Ǿ@9υ?h8UPy.5ِ74p!HPHas%/x!k w +C%%bټW-`J7]k@1Ui$!K*9W=z6 ++t&rsUSnMK1CպRDFc<5>h*}h[LvQPQ\@1m&L "ɾ]&#-[#4'Fp32#,*$Wrb[%[Tsr9tYLA'qrC'Π1N9-xOr#N9-xGrBM9tttrcsΡ ./3N9Ǯ2JƤ-/ $vQ$IOozE]TRFq0l\hJ8zz;qlq€cW~y7I|Nל(=>%`qXGeΩs%Dw$++&Iܔ4J$ ؞70c `wZ6r4*:iNc~ǘIv۶ᯒ%ɯO782 [^[$ Lau!Xx^|TɛT-{)ʛRLܷʬk{@,=&v]s.|[ UJXJ.UG#ǯ/'FZ,`u'F% dq"Wʑ\IsVIwHhy`GP~S䜝9NޑX*1ҕ9֑ψ:H?2j%"g6|0ti,pG$^>2hyCI|a>)ɩIד┚$<.2)Idi̝Qj֫Ȱ{|Ws~ g#;nHCGF-xG <2r7yd$Y9s`뜬.|rb,Ǎ1PݪS 9c"8u@+1j~Ν_`w1Qdർft^x=ż:NBu'hN*rlKP,RxODwy LzL>:|I>Tti|;,nȇSP}\>Z)*$NMy>/psGG]=%!p+?ˇu`&p{XL$ŏ-D6֪b"~Aki8صW GM,< Kɠ]:y8ޙSF&ٸ"+!BYoOq^8^{S2DȸC,v2iɅYz+-8ь}X0L` sF*ir (#uH"U:Ծq\I{HF1#2Ra#2R!u@ Rq}zsƎ>_ w NZ=:WyD*<<~K>Ŕ7+HAD'%p^ N?r}R2 {~RӇlX~eY6 r(p C`'hÈusRt:/PRSfa^ݛq8. aR1K\_>R_a?I>KւDq0͟<-lx؅#iw-GXԑEt~zXRYgp(uμe^dK| u}Xgd-al5YxUʰC_慡ҁҔA*[/0ȟ+ +R&d7.@ʯ˰st[M.٭uTΰ[jH XD_)4Qdɫ_QO}9e~=@`^ӿX>|I=ƫ{Wi.1Sg-aO`%P|*BnuGT2s=BU5cU$ξB^`V$'UvDL%Jr7y:q!W!3!oVDN1O=?])"'?o׊Z~Έ,;ǩDltʞޟdsk6:Tqt*χ3N'(r~(M'勗'GVf%+N +ԕB~Ml:}\l:\:z1tRt*c{nȦ*?.NjtiOC餌ncrdN#Nܤl:)T>:Nj$̦ZSGtrcSl:(~DsM'[l:)˃vK1ȦR#<(l:)b\Ge]zL6T.l=W_즣xT +ksL|^vkZ6?W'j<^uN&:]ċ9W ,KPzkIjUr5 R 4ꦲJM0 +tR(,2,_^"͕ʞs,Bwws$I;r9UJ*erKS |)twXZ5UfT](B]掵a ]}RN&sPPDy(mrǹJy+/ +yIjC~RN+qw{;k߶3Gn:nh:Lm% +3]`~aA2sh8?Л3" spukpsaILkLnoJbBo2*Zo*Ә$1=J3Icw<.iL~ ueY*&5R&X +7%1Eډ +3maT~a(qXbԀxDk.\Zr4)㎦jѻoqmMu 󾿩Jyr"z+hgW"w2`[:P/Xԑ}&٪Z`=TK6ߒcƙvr|/^^1T"iн*q]U:lX%gO~ixE.ϭ{*\ޛ,RmrCOuY̻}&W|Az"9Hi{p#H ͦPK +֜ \K2H:Y.>XaF\_iJG*RHo4/RTG0אGHԓ.Vc_lpG_=*˾ͯDD}H\ISht7kXo)ʰI@T U18bnĦ$qhl '7*&zbQYh,j=Iq*١Uf)e N#+J&C%:~lzڿ\eQI(-&MQZTQ~ۚ|Ql@]%ނuB\3gK ;+>^Q7lUd#)D{Id7-ε%~Y柢 =V8|kYq + i?hDbuށI>lW/)w"c19#E4U|EQ>ȏ,ʧ~=E^(lX]K wPG Άw[O)WPuB+I3P?wQO92칺ߵL9tiЛu&]!~?"YOCR?'tz¨Δ< uO:YOqѳ)o:JRW2 +u$/w_=TO +?F5{߅?'ajrq3w!ί;\jC)W;su9woIS& m>ԃYwz|w;C[9DuFNnlQOnowœ?$^kuQ?ǧpz|i{_OMӵıfW׏Uc2wNR+zw]?e3Gn\Sغ~wTS~Un,\y2<]uĮdnU?Sn%~\O9ISq]?qTS>N}]-=If]yG]⒪AA]?ETaȬ^맜wwRXOd>Ɋ_Obl+'Yʆw$8 +ٵ2)]OyrP|XB,3;$R+(+]y׮r mM'nD+zh\-_?jk0M׈*빹Lm߳EwᕻCF=eJi'1?tmge kb96ϔ1'(xmvif}zΙ5ka{Syְ؜OVu/".% a=@-p>+E,Jh4 Ѯ#i ka&i ++:'$k5Ozb5֤tU->}efuiϵ)EG9{}[f]/}a.,֎^Cᎃ %Nv/D{m<+Bq `>1ä# ^6[zLҙ ?bA.aOA+@2X(f|CFA/gg>h€E3Pk{P'_^O#Ə{Rrqo$I2{vʼ!eۙ1hWe;#8  ' vXVGF?%n25;78UE o+=a'I@`~yXV¡?[O;w,t&(Qܮ",۴:y;9|/N.CGݯvXv^\L%U'_N6ZȄyg3b@am9kǙo + {`nMryxa_nm'E4]Yan7fZ\Zk;mi #]z|aydq̛;3ts LlOTXs*8_:ųUZqT*Pi t)l/*I`=ϙK z`(i*)7Ca/A/Dn@}v+2GaG<7"OIK8v1:D9iG ȃ=xZ'9-mic-r7xg?0 '1}(q6O4ZdjP +nX[&d'ZC,E&b'09Z艷'q |sagu}8O?}39+-H lCS[ f/&%j,y2ʘ)uL MS =.G"E1p;X9ӱKb)5.5]]Yt&R6ŧe])+Kz&˙Mag+9BX{;K(bN!ۮ9DC9=$$`w)o`(Oy^,#n"kG!.$`/w}MxURArLE4b+lvYh\ +ؽ"=~v̀le` eL_4Xxj޳R +/dafJS\C'nyo1~dTXK4c3ШPO4h"գ~hKPjANv0uZל\gbsvXb9q.4Z^OzZ_xZmbD@mn_`_צ^BuKۭ7̺N4˖sa ޗ2_ Qzk8"fiuy)'V,nDὌ*(WI14.YoSF,WW[:R9c.D3}e@2Re) }l$Q-ﱓBCѡnϦzOzn{1yVf7EOM+*ꥼOyp'__^7vb&v!;M;G^F,z8"plH~/۶#v9|:EqI9iش䠀47 6(JF[քi:m^p"Ov!oXN} n-q|MLj(me^x-Fm0V_hcE["B߃FmW?7Bsew rkF>n{5Xɍecb +AK[c +w,@kyޱӻ-c⌀G\v}g<:@Je>OPAva?s +5( +T'G'*?NCaz|t.x71ņ_a_iо#;|jLrڃPAO_pvp?| ,48H?'_OOC .wrYjl}. +$nPv/9 x\vI[.;} /A9K#u>gqڝC )/=N7|D€vfy|>. ZtRNI\A m.;$*>">/t[8I6T9ߠXJn.7h +ihiPt,E%$n'0ƔД=\/Aiwv De܎ONiNyn0@;t0`|H +;׎SNiNynbev9|pӷ|vKI<' | q7GgwzI'ɐ <?ýq-8~BC8.lqn d \NAtHO̤8.}a3/~YNpP4I%P\NdBYs=eS9z@~qA< ߧYrP:$#7}tCSY l * 46 0G0n(~`N$P=|2l[N   +3"@7#7 <Lt,>/*$x p|nx OCl>1>K$CLr\n7Ay| +PPO ; n +ǶiAHnZ.z|~! _3D./gN  5Ą;rja)@g(^lG8͙N$ +2.$I_X*NrdC ;P,u0[BQ8IM/r r{nPN :UlL#nIW(*$'0%X^ bv#(]NE=ԥ-@Sߧs{ ;q/yA?a4toئ!y$; MN@d :Sm g4Ɗ$9+3o^̛ӭw/ Hy͇UҔ5?&&elF`Ap6/`A33\ևaOva ^KR2f4 endstream endobj 24 0 obj <>stream +%AI12_CompressedDataxr]ɕ0?:Frp/ +#iԭZr+z +6 M5,Rf/69@TrQP X;3wf%/^\}_pqxӇ?P߼{O"˰<߼'t~Ň|o_?z~zw71G]ݼ|i!iZϯY-`>]o?x.^"?o~e)CluGR/o>?͇ܿw>~󓋛?~׿[y}w>7rXPsן ~s?ݯS7/Y]^gÂӧ55O>Gq_n?~FVRPYgwkiu-<$xf} ֲK!?9m?m!>~O)!/?/߿f4m)~w? ^ +h큿w~xJ߽ӽlWW:\)RC5Ő#0tq.}IOڀwoEqm_|ն=] ~o6>ݿ'Ctݩ?n><|#(p&ʻ߬Ƿ_o~_yocO|_7w?~?'^'`u^K#>> 7J/bE7rn?^\/ÇwOɵno(xS_m3}߽/>|z[Ϗl?zÃݼ~:_/~L?=ӇwoyƟ~&/ͧ纓u_cUȤw/ ŋg@ wE.W/xLJ/xpW(?gǠ[\7;qw~ z~zo?&B\-Z uj#ծj7 VciZujcyW]v_j۴7RJyZMmXmծWYezm9d+j}jW]v^vo&(ɋERWծV^fZZT%''i뫍:KJj7j[im-j[eMgؿm6mvڵm/ZVZ]]t>{?t7MmWڮn +"ZvY[Ah { +͸9V{핷ۭͰkqQ[0rYk~G'b6K^T+sMqn*(*%Euba]+*CDDR(m•"˵ɭ"!GZJL OƩ>~opoq<b;vpqXpʡx!8tѮ]c]-_[2&CvIdὥ$bT|x;DP!:ݨ?=Eygd^#3w{DH%PS]Kl;Bw-#=q;whgniߩ]Ȕֱi ZHi IrVu+=za9r6 Sf׵WuuAj~xru;|tN^ѯ_ޞއwo?}8>a:msk?tCi3ƽ,646SlE Ktf/)ªL|QNX</3T= \=ek99j7> &YgCY"h5p5Ԗ|UՈhԔu/j2֕J!Ee.pA˰j Ki꥘5,aЧ/עq;/±"g .=2ĥؖ/2hF&mf4Y6ŶyuPPj*qRs4=BJ͟ŀ|u:j6o:A.<4<(?\x{'ލwm͙<ڴzpSn=sѵG瞺3|~>/k{_:gN+ +jM}[TO_i(jjOHb[5ܾTzݫVr׮2fi۾fS\lpyr,s޵5j Rhth@0/~۝ttslƚisJ=Xk;Gױ;SZ9"?.=K=yΧ~U8>T1z]xPLxn7{ۡy)4D树XXzP+8]=|z=byg"﷡BSXHwr.^cȶC1}=dbB\;'$_$ )|IexO~x =yA?<4=pie{ +۵'i:txX"u?q?q?q?q?q?qJBܓb܁r;AT;Ź3uPu{FƞD=KmѪqp?c6f;쌲G^G[7\Z#.-.0ߟqloX}lI ψ/.~8ݿ=A7_*AS}I;o Q"Ỿi!t?y?9 :O=iBX\3\oeט&V/ygӴsxz>?Xoϭ;9UOZ~s߼Us^#f}'_t}1>{yvz,.cT|e鎟~g}?s[]jQybn޽YA"/R.Fe̿g=p>׏(?.R?\}=/#^ۿ/Wa2p%Hn/9#%fKΈyA aK9nɸۖbA\gmڼrHlNǔ߱oҸlimHÚ GNZgD) > 냿q>0Փy&]}#@Z*eF_/B3c +>}3ߺ$ULdg߲70εNq6߳H?!s.8}q >}qWbs_Αwo%v9eH#g͇g ߆qf]`_ïw=5tVֺTx}s1챯E:gAH,qLcNq} @??qCL|?裂O/p[aP)L[vaA8{ |w8 s\O;9o7p0ǻf0;|߷ax+o%1H$=0! [L;ˌ”"Љ[Ek˭T3 O }DGDr9ĖBi-h9,q(|Y+M=‘8IzC>{5f刡>*MqK* ڹVr,6dieZK96%`5cuC'̫0bnPȧ~8#g-Nu*g⌸_Eᔸw~8'ީ\ws=Y˔?Kyo XkZ?>Ǖ_U}_ 5?!UQfd}x"\?^;?ˈ9'&z4\^$3`w1؍RVO{ +z(u0.f[T9/r6']RiZƤxS`trx烮?k<]/'tP*~:Tu| +NNuKB *yC}>ċy}.'tFlnUaOd8ٔa|u2:yEUtSwlpqӮvo:yK=o.?x>`]}/m-|4'_ %bnl;vo<>t3Ae z:y|2R#-$l |A8t٠''&ᧃ.1tIBgn޷N *3<]RĄ z:y|LYmg(pc n/MJ[bݑ%[~Pq*%Ph +mOi"ƁA=.-E`K.٦(O\"*X@Qm\Rta'ѓ\ +S]:4P;5[Kx{v\!2eJ=\X歃"j7x:X|OLg]gkfQ ʁ.i2#U,lzO. eaV8)C_EuK|[b (׽ׂXqY۲&Dby>aI,)ڥ|^(ޞmF^ Y;`(Lkr]eWɲ^-6!3UOR'O,S2ˈ;p-BifK]'!69j0 wy8vȶrMCPH!AV˴ 1p͈ Ǚխ\G>\j zz 16z ӵ4&-R̲!{ȕ]Ờ"= ?]9UIM!/TYn->ޫ}KJa֣0C3ƨPNB^y.qBI*0 ,rz X(aXY`1:p.`X L| 06Ԯtع`q8Do +,µ^auyjŞ Si=qV&9 N:_*0vac9U^6p{/X(`&<"-/`!>CP9_GU Y6` WT$d}*n7<' tmFRL& +hdUTQl15DRUjPb I7[(}6p\{[wAJ\[^R1}|VKVsRP/?i&lšFYK{waf`"THb1$x6ްVa,I#J2'&[7*e0TСq+HLQ Cy ./£G=X\=ɵ HR0`ɗQTKWA3=+(:S)Vu5CoT+ע`If"ڽ3[v!1a#-Su"Cg8!ӄv`!;#"iԉeTԀFNbVvp9\lsJ@*XHz488"^ARfqoE5JZ~Uss~=a\pu: +$V"/W~GE6aeO)q$Kq-Vf\R->P !P=~篁= jC*=HGV83W[qޠʈXt@ " +T̀5DL'Q&ngc. C-` B u@mڞ-!Gas-s9|ih%B7C$knCcVƠ"蚐kQtA=ћ2iP|F_h2RMe-(+u{Vԇ\S[A]LE:j0Vcظnt,@0wX; &ua*I%F>V{,c8Z-4lyuh@aVє|%DnB>t=2uy B?3 7޵'ŸDUbxן96SxD~>Ĝ7 +i jxiˈb\?l7]Y?iڊ +]tDXisHԘjpYS8DDRͦVcA6QJ嬂n\WQ$4*C"VB;DXٛjKgag+9H<0rp>/bXgLA)gȣ&f19<:Y"8͒).bVEà*]0By &=C J2'b'aN1͘iShGfc(!|pzہE]Ɓfi̾_2D_f fFӏ]5frGǦz;jH"J@RJ(p9"b֙&Z"5V jNĭU`Xɉ[Tx5G<#Sh[Vڅw Øxr缮TLd4_dX,"I©4,wB+"Y9~E0&Aۤ5b6_@/}!u۫("1hEob!%k6d.6%ldBq1Q+s.ɷC쏄If*qS( R4Mfh0 +=Pb e7X2^A0o&/RNX + & s)^\6(ƕ#GS 8EتNu[\ Vdc8Xc] qd nzjPz(!I6J[V:3QɁGewƟ-OmE6!9Ičc7[a1b$V$I!NoN,w'i XGL(x VfQyܷ>qu0ˇS.KH0!ʛhT,>E0;|vY)"< (+"/1Y }`EtOW"}ǴYk=bZ'?:!k +兰֚U2 ߝզGp)>Nz`Y#X-W+~u_I`My2`$GGgMCF#HiX +qE(32ub ʤN#$4:\|r.Xdi`1Pvx_vDR< U>ay< QL0%3bnuQ̐5Vԫ Z &\ O:7p*&I\PDA3R~%֭GID~~vyrF7ɀkHj1ɀ#Zƚ4&>Ȼ]ŸE/e^drBxΟ'Tț=&SQAiBBA i!9ѵ 11kGm] -heDwV3u+v$Bt!Ds0SV>ET$k3+gD|ebj%@iœP)RXP6ED8u%[ +QSr.]2l^WdzY^u*dOFD;$ߴπ\" h-^ ?}#rdC />2d1,̠i&yM3z&X,^:Dwj)VTg +=Iبe RJT0,RP6bk @!,B(Juc.K4s&[zKⱞF#q~NF[JUܡFj;_y|4Nc0 xWeP^hz#R77p&ѣy{7C'ARv<>=vSA^x |{fG}5xdy7Qnx +|4YѦy<>]jGAHTwЬuR.WI5uaWt%X|)o=iA|a&A$7۴Ο%,Mb,?EB2qEb>,h >q6AwVVu;I7 +i7O):dPqlMe;0]EAqiO>YO{A)=N{NNuyK"S['OT :~:} ˄3V\v1|8J +0?&"%aDli@QHpB]|jz=n-c@*xx0dc4!'(X- BDU79J)$h^VO{szQL k}$*)c ! 4/x(x6d ݜYfwsxIN9Z +!. *KH7gP|Q +[6(Eae:vF>w2=qG։ǵ5J'MH8GGrcQ zMQCF"W[HOMM4s6TX!tͽ,{Cl?з +16^;ID i'~&$pUK(4(8}]$)Q0O->8GZˤX=ija+6&͙ \1:zsaFt1 `q{eCe=|eVRv5ӊ^O_h +/?4"#S.9MT19rVXb&/X(%|e9ڡ>S 9hN[|c+[v&sA)&YjebsW V''VԘ$M:㪄mzL9$FE0`HȂԈ Yw"29&o .oep@ gt^eg 9%Dfx[,:/g%~'GgAG["jtP<( ׍ +<Ƴq^>J]B{2`ǸDNN; ᮸g,Al,czV{8:7gq66,y ܪLW*&HhR&Ůvc$[Ĝt f% +j.rU!tMPg73KU($^[%Oa,f'R:R5ʐ&X5酡|iFlʣߦ )]zsi=S}zhL 0D΂x/F&:Xa `aYMb3|Q+1A53]̃!Sf +ؓаߕEv;0[v;`95>XUbKpݝi )Z_A0rG&Х2'Y9[[ eiZ.1_H^Z, 0x`O}VsiEk"[gQEP 0Q+Y+'ovnvsrmI֐;ԴEDϼV.~l|Dc$U(6=uRƣ-*~': L/ +rµ` |uEyA'ǃn#Ie!X= +xrԢ2,B4D4y|nwv[/u77u7O?7޾?߿~".z?\\oß/y NjrӋ+y%ǥi]ɕAk$ҩzwMY `1;ؤſhXT8o7M` 68( +TpYoЁzm Gk%P)>ȀR"`XƤ3xt|]݅k4um`ՙmb8օR&gNcGܑdKDnOeКֱ汵R~66<ŝ3@H +SJ7zp}Tk5!GL9{I`Vfxp` :ѠcT.0-͘uNHvpmpܦKf2Lqn b~Ȇ>zXix빏m|NxVjc׻'n~6m#fd + +.S.] pJNFvLԀ.(uwƪp@bgCķyLWTRny.v=ae Vˍ.JP>v_]<^xvlҔs<$a'Ymij<@:RxhMhB5QKDtYbSkgmɰP} 4h쀁Øn=駭e0WUݡiֲf:O Q=?&Z8X,BP`?RJj@tu?&JS֜spn;0?{Y7֋> ,C ƍ ж^#ִ+>:F^X;F&WVFL4H;M\VQ6Ѕ -@^46>+:;NhNC& 7sq^&v9E\e,Dmdb?g( a(`fFUq +JiϝmąDg XFOCN."Pߛm|-Iѫ&%j,950 /ߜ͉NR4RvBɝ GJF"Ij#lM,>JԒ8}5 +0UQZ}`Za`Zџhl}BѯDYgaFکVV^AJv[iOҁ"5 %G[GIKY6Vj^t.`g3(]aLu$ۀjU8A_@)lcӊM]SȖ%sfWԶ|2} +(4#Y +F@bC rZ{Ki„<:v|! +,&agؼm-(SDޘ\6>UCm΂;쵞|dpɃ8nw}agp7l~ܕ~#nC;kcgFIE&'D*q'U3 2#րaS-'׻ Xl@&şu]5@z#D(l0QEzW_ Qv`F줃T܄hʯ5ZπNUynR*YlT1>IlSvm@ZSHph"(:jSQc*{0G M @Aű_~h͙B4&Ih܈ +ڌ=c:$e֨ dv (G94`a;Uy=π<>u}~ X5 gsjgO|/AQ=@v،gac3;(z3KA GZs3jPqj򣩸\BT|tх--ɗYMLM@3~U{6vn/RbPN$Z*prRM mYw7`b@>Z9`%].ܦ@z$4@ch~w4Sn\4W ۢ׆gK ydzD~kf!02MweiɜK 0')iaȁL`摐^'U!]`i9NCG Sm|,fulb oU<* w쫌NiWb'TXZ4uqQ+WK֍TstsZ +(0 ɰ ST=%Ѝ-"1ĻsZ _b7̣QP+y8UR= Ƴ!:;dtp<!CM9ghdAlbA(路A0ɷ[c+̀]3gKgsgbj{nhiZ3(CIVh-eSP7C@B~]Ҕ-|ɀ#80Z2Gp" .et3[=9aoꀃ"&h==e$&r@!4D!bHbRc P"]إSu3vJR=KA gW-qIQ ֔A!dz(jU3( w걸1%Y3 +0WO6B0tJEqb)(.5S6"l gT5Yէщa%&`r'$C'fθAO9:J`3bv>(Lp X@A:$}4O&Q;k!JLuhEwE&.DW 9 +DY7A3Χ2##?j0Gn-m!Xӓ #m!}ӑ0* vf=>$m1A>= bk +f|U ل[ y2g:1qJ&}kFɓD2u$R1h&."NJpۘ7sUp*4B d6߰W{ie +8Iձ; AE)y0ˉi<=+ {X)³gt=2'Q q uE5`neP7v>/5'ZVIzglyXy{rs|#73u//M =Ib%&3d@=gicRsـ'(k +(TsS<юn&;-o: +LoA$9ꁱځ% M,vIPa` cX`Uzxv1Q^mǝ/Rrq:[l\Kwgu}6Lm0[ƌu4d 9Q3zpTkr~uEaNcL3rڳ@k;lq~N~ 7?;urTG͐3\k "B|$pҕ)mnf,=zWf ],3qu#i `dj$FDmkv:;0*t6-Eձb0ܸ6` zh}T–!p#{(͍D/Wl[wMr56e7YT\M0bOv5څ`~t?_,l=G)w40A[&Fw>7xqTq}]-&ؙusB<jV^}Bbϰ_[Q04(JA1c,+ 'ؓ*P@OAP +0R* DXEfwW= HsGDiz۾Μ؁4**&nidZmܘ9"Jݻ,ftBіᶄNGGyp;W" ;H"xSaH"vQUnOuzT;`_f< Vc2{]}n^mb&CԂ 6X-!s*$R)CJы#@v{1#p!t aQ<\ZO33? +ј7NpD`U΋$H e=q(0Ҏ-q ,<1h@4RH`} bTG!\hoWԏ 3$i(e`x 70-lc쀡1;N (v5:.!z.Ջ vq:;p+-]I[6fUdz-,1<7Ӣ1EqEI0 +mVER +[\wRޗ(!LE&;FFl \LM$X2TÄvh:1Ԅ%7ҕ!Ճk5ȎD[neV:D +LzQQwӬm2R&&),\ RS8ɰ_wdX|pNQQφĴPgs ?b&>2P ʴj,ZSDn0O+Q3(i];r݇NouɊnveAً닖eKWǙMZNCP䣂Vl3zV +6mXC^ D!"}ۖ)(ϦLc⪮>]/NLr} 殰J0Ho ,DL{wǮ{kBƄj]Ch\0[؞-JV#-uK[T$ +7ρϓzMP3*6jQHnզGzNUCe6/ۑw:;ßuv@M08*4[H&Zi<Xm%GFa`J5!j(f*]Z־0"W`P`cmZ|9Y̖-GwI=m&21Lf]1Y]OuuR̗U{͔k|arkyX" [C$@z9"y"*`LBِ3d}pp$iAoltmq(lC\{!ܢLa&K 87c5+J\'Yi1}v|:.H_n̴KfyeA<@v (ԡa0_EZJM+?Z̰R@V)][d2X/dĨwXy(Db<Z՝v2$rb +Ӥ4DNϲ)Sz-s-KӰpt::'2PEݔD0٥HD1ߐNeg~j Yټ]ȜSa"9V^aדʞFZݕsf)BϔpDUAvS#TTRK>mXI)%X2kMqfY قz>*.yqل#V;=j:5Ȍzs|%yBgd2q,|:Lz:EϞ$|`"Z})v*t ȥжYGirUL&V'O2UKm'RQI:Z''բD2W.ݨuБL638]%wXZ\xZ>sUM-;2Qs,@,»V$+Q)&jN6Vc$/jEi4Wb7neZn>dj 5n2RG$YENEi6d\gB%8hLJ<\ jjlYk;?{ʎ+M c@0阇/)].T`.4dJb2%9n|kM$%픎KޱcXXUB>':+]j]oz`ǼNNu/OUpVG+dowYNoy涐ӊ2X![NQGW,9|(H#n-EqP=Tڶ\;&ͱ=|ZˢUc3]j~Q>Ws ͚a uVd:UUV.a۷Y0LS*йXF7qDrsV-{Ƞ;-5jbVc0k1;iJ35[I񜬄,T9_ZD֕s0#F'~~&l)F݄ PnN_PHoz;ePBP5#U8YdDͤ9[ ^A"BbI +58\UξنynxdV]żx<;˒0 +ԲY8jv6)%|,Q#`!e ( ?ί٥b \lWEȶvs vЂt[#͉8ѬO\NFu9h1٬yLt&0JtQJ&)8]~QDv3JY.`4"P׶dC W%-"_J3SAbVR F +%,}=v7T TGZU"r;ek-)v(%=+d+rA.NIʼoRZP9q2؎U_1'nc0=/#öhzG +V*`emeAz1У`_2"A=tucԫ8e"E(iVFM|(bf'QMATpYiPzEG48+a}Q#s:R0X8h} @[w츃uӀd@MPv*DaN꒹ę)lnGz[N~Cl:QpnZ ̷%gdv-E9:n7 +JZ}NF̬i,\7`Xߧ"Qu Z-,]iN\l%i[QY'XR1[w-ow)7l?^1R2&y琾>CˋJR8T!f5'9G84u^JGC$^iS]_.βd%>Eu-S>`F&52:r #flBꞝQPƃv{&pPѠWG[[C_IZ(լAk^5]14Eh'P9Nn/ U?/E„(b7I[jH6Uи=7Ue)cqդQ:rYQ JqU#G-+0HLp;DBbny|UMi08zSVUZ`0g'67P L>T-{Vt{ V *,Vbx68m`wtRNPA I7k%9{QMԈ +<[MDoInH j' Ef-V40-ݩͻgMUQXYY/d!}ͬI4iQ`m1uL&99j2Yv` R릌V7_n=y㩊]5Y8O~?/Eڮ%޶|K%׫q6 t& %FYwjQֿY#q,r٘-x}|glI^]JhTÃljVeª2 3\Em7SY!5^Tk {Ag6,ΨnM͊,Z/tY`nXB>[Cgow>9指i,R+R/5tuM#9޷pt0Qa}7/u%:{"`ߵiT-Igrs$E3Tub(Q;eQ`BC2v稗k[^7տ5Tb +hI{Ё:-,kA-IV3T̓gPAoZtQWA,FKv˒nieEQ,sI)S׉Meʹʔ~r 2ݤ[xrh1JXy ݚxnBv3Q5,p#Y5v ' ¢609YNK \, @~ݱO[,b oQ}'ɏpȯ)Xy$hc[ش>& +PU&hYO]ڗVIPphJ\ mv+TFG4J+pIIip#+?$Tx"iD)iиpU袤 <4w7(~UU)ԅmRtc̊^U/m!*kC [1 :M"f 0=T ^_g;VixVZOcNeg"Q-ԥ#[l_vT'XsPLh\;C5L@ᩞN@bJڹ$ +Z~V"-$Wh;FʛwyE9$}Ee}fOʼnUюޚ(d {^ 'Z‰y+*z^Jg%tyj"vڔ&ƤRgȳ! l_DHH_JcZp0Oz0*E0T#"Ih0XdUrv$Va~N *SmӴ,&渙.Jw`,YULGkYOlإaִepdM|K;֪i+2sʤrtW"X]c6Ԩˢ25)I֡ER% 0E T*Q3&ѳtvQ[-DXw,J(I\ٹ#9P~.PedkZfT*/lVts$?mݛ>KZ5gB].D[lЪS%0J^ld}љ򣮔A7٦kȤ-:\kN +3rfZ5Ludbg,O*}0yi]upBvNzNjsajزH;ݔƭm4$m#$ tsb:l$WV{=޺m:eڠi]4Ժjgm&_eoapPC5(M@qD)Ye둥MSK0iUF9-t%A,2PYRY3Lӳ|-k9eGujŬ˅$T3cDh[ءY++[Sr)׀f%ۃ+en};MEP6 nUS=1QjN:<+ u͍l Sr,{ X7Ptqʥ +":C܌uMX1 U T] ]C<9$eI C(]'&b1,ڻJOZ\IqjUdӓHǼZ} `2Bbys Ȫk88Di=6V+s3)Vd %_%KEDL@.]"yaZ Y9;+l,!Xn**%Kщ*ibK\5U۳%L6'%&yzkt4e]`l l.a&g hIqA6;nM]+/,1@j~-\T4:3Խ̥5Slj; DYVL$-נdL(H:%snj?::@ S_hٵ$z2ʕIR}!mnМI6UOaà~]~q͂ ,=0g<)Vُ5oȡܴfV̟:[rnlzpݩ;RѢ/\Eg\*AVeDHm =N j%f}b5jTE;Ukbj({eF37ŷ%jZ i&sqY=n c[tlU(5#B g e ƪjIY춐)cT-UԛӖrp3#jKivvS6kYdF!.ZR\'BY)JG,Dh +BƦ4by#9X*ee%,uc]ZI2ZlvAJX,7&B6u mZZ*E W7uIR;Ukd=T9EnGaIТRA*1ME J^ZHeq%DD8P83p?ꬕt)ϳ$jC|GG% fqMP$2Y#YB>Tz***d*՗9V h}aָ2κټq;`;I "P6 J9i4gG3K7& `!^dThbV?5ꃉ'Y,IWjz`4%Eh4q,E )>Gd'H5I3H!z[ ?^UXQ^6; -B`3Y7efӦyVBz(Uy(icԝ6[wE`9mu{'$C0q"-5/-*t;I&Iu|Z-ުN^2FtY(.ɗ*h\\Q-xHhDqȥx-wv+$fG +1*ugg YѳSdN]޲JvXydo ivJ;0W#'-i*!X3njf3H +ߕ/ re)v4[>N(.ߗD#5&Ii(J0@RD3@$*[2AV;Kh~ iܥ}1in@~{"C"xS2zE3)YHN]gyVeW/WYIG ~Xm +Sz0g7,// 7˛VQUAedb-i\0'[ 4! : waÿu,VX?R9j86Ksi-3qdTx*8 LE +Ȭ),q*/gF3`[t,v hz YdIgYԸ40 ݪYql[:iɫV&gRnw xܹ}j2C{+9js:MqqB Պ✥E6b82s\sAd85[Z| +UR0Ő0f, +im0e(F]t+[oJZ)0 vBГ}E[.,V/ +߉r]6zJZL+.+.QBJ-zȪME,8szDA҉y3qbCXQ;54ˢ9K_;YhL<#V|DCQ0Q y_3˪|W7+,"Awk፞5WKD9r1h_,.\Y_ +`V?G[n4Nz?Ʉn=jlUP4ǒp}l= 5Z-Ud**qNh1D3/=D#J +N[yD/̈́ sqj2R0kvho+exqϊS7{UL)ڪNEuՂդVY"+ݢNlDž φIZ/Iw!ntavHANⰪ2 kc՚kvV^l]3˛sx +Yh<]4,)ps  69 v kaYAt}IVA$M][" ^jjn?e-n1Dzɴg!!] HuunzP4Rr`d,\*UMbi%?roo3غȮI(x.5!2Ɲp-z8-[n{?v+0;qn~_w#Q6R^)ֽfYL+hѯypߛVY|ӦogVdIN N}_ X%tSZE^4R>-TdHZب!eAh\% jmwqTX7[4*Jd2ͷ +} ٴ\X ,"ѭqH9K`cgKVՂt00#H0-{ʩώA +pU^x*" +uZ R0Z}i +ti#_ X;V8˳5͢u6uQrj^PuɇLFx!I"cC~};Q&Fjмv&n/dPTBd'!n~̎C I%6qpA^ג3PȪL<VóբDĢ3`1~V.UjZUlOYr+3I^@\0{Ii)Zy3ЩDӼ!_ +FL'&='[8c9 +4DOC +q$fb\%jBP$)?QsATQ.Xthm"&jאM{0w#3-ETD +AoJ@}R8JmKE NPXtj(ִb& +xIotfibdTyzR(%լ&kbsyEˇĊu3)I;T6i| EUTpJf -5c/lu#W]է-KW(WOX~p+k%5jф*K2}wNDIæFHA-ȳk]y-ULé'|s=̷df4-R+?GgeSKA|]8ˡIL ;ԵvqѶxVmkU }8 bpbteY8Cݕ@1c Zs^Z6@>\T$H9s/+F* +dU$'Q{'jw4\!7zԈڭ5i ݴK풫@ߕDtvUVj>0)uSF䴥MQ*(?#&J*h%`j8&/at=d{(gl64dlU v')Jkj4<ԈT@JnuZ6_>jl\}4Xmwm?Y m@vg]7w;_RX5jԳQЉ5s4.u`jYA؃,5 +9m`Rhs*V:,`r& ʗDAr5?9"Hıꑅ&iEX-.܉EpU-??NLڒ%z#򁫬Ő,!y"ExrSFq-f>:A?ׇoWk_~zW>;f_^\ӫ=~}?oc=L8_ē98jE(i:͌ݭ:2A&)'y x1xr?ߧ!o G#iYiĐd+8dE`p#SihR:[Cd`dAFP@’gc %For)@ءyUGzM,t˓N5ŧ i"У:0Wn~ WpQswt^AEOTߛ5vFق͚P!P ]@LJ(OGQT]Sd-Z$M,!|1H<@a5T3yu`aP)yYT + +ꥦ &1gVwWj!LK Z +M+8h|c /A<>2hG"LRD ك`\r%\ +MtTZnUdfuFȠKy6$;F~'E#[ F@2NejNt&0*021BЊAE$8- T#zXB &=BW4A)O-MB9p=A2&FX9~qcpf PdzE`:ɳ&ڞ2/!kʳ7zo$'h{iTwt@+B$ [ ʡ-`o32 F\6@38!,Z5;AT;I;DH ƇE섻&ШT)Qf&W G>hB e }RkN/!E(UbqbѼ/^)F"`CEv~H%')Q@I`=HP,y܁փP^JpB!T s9Xx[kQ^`@K^$YTV]k8L"^tG =@:pnNhL B2Y c8p8FLr湸B)EJLTK2\{HnȔ԰*0@rqܲo %h $#P,Ll$F-XÀE! $JVfEb&L +t$^PTlaP)qȳW +6ml|8c} *5^TT[[Tv%3w+'EmT!󌠌~2CmѕI(MDsH6Q,$eEE%@ysr<;G^|/_~Wi/xsz~JຈiUk{pu: +p]^Pt?~͗;Dy]܇).]_XX Z,ie Y҂ֵ[ˋ7_.NQZݞ}m] 4meZhںiL'2S}[.SV޿Vq.w{'Iԥ=n]l{tsuu&;zt]8]1w<=;:+fQ;OWv.[\D׵'ZvRݺ#3|gg>Y6~˪G\t<x*kY;WZx +WZq\i]Εh P9qU+5>ׯ/N?|E^_\5W;۩{]*sHii^S|uU | Rvwz?A&~|z !a./Oq<͗//.uedJX/惴\aծU-'\ywxZ2|[UEv{EdxJ)u&Nџ;4>UwZjbY[)ѿ} + l]D +<5lj5}̇6!8ۙ=.3ά3<ʜO׵άKg3?;WZ{ +WZ\i]!g>p'?Ll| +XTb]ٻ?~#|,HкP}v?Xk}ktP y\ȴ*~P,үlIO*yzrGy] yz^>?nJWW|F"]k]x=^܅xK&{q{>4j1kqڕ=[;yhOVB%$oo^e=}ӷ5-m/=7}[ז| ]yuŰ<*?y}~nOKKTW&kDڝ%1.R$ݽ;'>l1bkD'N""pkj"/7"^Blȏ7;ޱHGnWXrӳA7_]}Ox]%{OG ]zNW!7W_߼XuK m)Hûĥ[W/o}%BdG]z r~*.^ߝ^ߝp]o%24~9c@YWbuWovrK?ehaxm]yZbW&\6ְ>{Du-/RddS[ݷ_SWplon_?./Qg_< ?*$~{g#=JXz-4Oou# L{!{|eEl_?._Àg{ +>gԿXڰFWWw+ e%1=B\^]*|Gʬo`+XB6#u  yRеJ7{6Aq=];~2zte y2z,ݗ.~ٕW~uiviK{N?Fu<\ҾO+jWax~ +3uX)=r/c;]&3ųs~2Ȫ |yF.j}I7SRdHumXh]q&<W[0'n) UyF[WI>^ .Bz{zOWuo{{+c$q4{'˶}o+6_ȶfd;p]z}GU'lQ+뚼OZuhܣg[{Q}slV.޷Uʎ;>jUO(x{՟-I&E;V cCإӿ^]pOo.ޡeYӘݮq~v͛Oowo=K7t:؝wJCo%n{4RG.;͏]DJ6t]巧߭kuzdЧ8CǿߏeŞ^fW__^\U2u!~u#ܯV:kmI2߼#l5XJ6;W7gͧOܝ~y ڇ yH$sug AZW$>il!H/GH\cCV +kD8Eg>d++Z^[#Y][bǭl!{=n}5q{=]qej|^jջ<ջ/ؼ|0UEQn P[WRV{tUuyTnU[! +=Nt+ӚA\ےl-l;rZ^ Eh?Ҟ]\WdZ^ ܫ{5pWurx_z(؏;!qp؏[.cĔq<V;x(;7&K0rv%p1|=%r=D9.02T{Mk0A=αzqC&j:NӘɋ?>[=!55Kc=cc=bb/#677v0_.8xurÿ_}$WW{YPO?rsgQ| z<ƙV >SimO>2xԎsKrvԏs yfOu<ݘ~8sXa9?p`8zK`~xrƌRx,sc))1}4^sݻm6x s|x[РC?Yt>Gi@'vǹ]bPXp < T<B@b 4.L>q31 ɞ=3$OiW<1&:6|4&(ı č-(f輹1{[N`,gdc|)@)&L<~ÿO ǁX !86j531B8pc0{_=VV]+xfLg;лg̮zˋq+XouSc)/hrArefic7J쉆*`ظq̄,t<^"Ѵ:\{,-G] + 8 Z^$>veJ=D0ۈ3$dR0 9f`Y59uDSKL;S֛DİgI3~q +b9Hi#A(qB4 8ؼk'҄%\X=Jh)c#כA(`\ͫy6pFo9mGq C +h:mb# +}n =pQx716H &Hbnuۏ] +%=̀9 ї|1WyBs :́AA0('% +WZ5[X"-3 ]#$KaWbJd]l#lo:ӳL*JLOMh>$?0,2b( ^X v!dq?34Z0 Pī^GV`,).(2hv$*.D:pas(u2tb!{"$tB inc{;! v-'׏92651x@ND O V CK}@^öԅ&8E~ tm2;B`(<;7Sq70y\J,G:v&3A$=i;Buy8'Q``G$GD{UҸ ı<㱉E^}@k'4tHEhRYO6បĤ6 PΪ$=$@EhFRvu(Q?CLC`Vm2+H$c 098Vpl-ȳ`0p n"ofI(?,qh1<A:Ӡ̳@p7~*{csm +,?K7E-.·4$=m4)nݘK6$CTkI!@0= h`ߐ;7uP;RV]"q`!<45B)j +T\;A@>Ǥ]Np_M`c^! +u{{Z`  PB)NdPSm 09@c|:~p6:I*,Y gH0wrAy?hwD&V7S{8۠!>fF<瀈1-?ӑ9f*nz쐺;b%/΢ 1P>&q>h6}o쬑`c]?ԮcX1a1Lh®ŒR7Ɲq-s^94I*EA-2e0(B`7Womۈ{[ $ l Lp]Y$=|t1s3׈+tFB&Ac)8t߆[Ƴ "ȂQxYpP@P)@ZC"0(w/, "<ܧ)`y=Sk6y($ AYcs32AI?=0Kz୿b 2p=x'%'0B}BoP^3MDLׄn*&&c ǘM(l C\?幦7rO[<38kK اo./Di֨/};re?c2f?yz =d/@B%EAavDoxM?5Gi|ŁՁ?o׈ |yˋCk\#xq9{O<` p5߇)ӫq㛟IIAy{qs}w7~CKH26!!avj1IhM5X%`080d\C +vF&B` 53"DdHt5c=I`R[YM%?xL:t%{)߈$ݐ pҍʸ%qS;Ɛ$2iJ'az%kWCXA]@L"@ v0؇a+סsx>N%ymc7SB>R аPOWS`qCqHccOpm +YL`di8kIa]pJ /yƵX8/`zV$XB5a*·pl`CS +Xc匰N}:5w_n1+޽+usgPi 80Kd !"F1tass4@(Rh# O?\h<nVه4!N2 F4\Q:Nc?n>l !Aa4Ld푽i LeC-^'8:̞c1rCtÀ`$|ԑ3r,',N1:" +8o9#8tز6j.c@:(ilKa2Sģa`ύP;\:gЕ%j`ιDbq":Îݥ}Ѕ{ +BL`2o= K!!{2a,rvJJ"P 9 xK$Pb98v0 w r. DrnC-c<8u- PE!~Pӧ@a^ "YW^eC_QP8Z, +2 2V= NwFA%- @xF@9 xr:,U(Ev  !WlqyDiL"4Ŕ)| Eȏ )XJ%UB+, ت4T8 9OH^AH`&`}2'x$^䣪 b<0Ց]lyN@H!лśqcb:XC80V̖q]‘ TAÊCR9@5% #QNad%/svEGw(ís L",} Bp .vR8ָu)klCY@TlRa5 ++"smr]hvC.\(+$48MTC_i0m0h.iܥ3BJlP黉 r`ŒɃ C131X@Bnlg\ F 1&6PԄ/ؔ0 <€"& 4y ȆT*b0ƶΒ] R +bqWWؑt'@118k "3@y`n4##h"ZNk NV>*yl5quz͠;,g7H1 #5.G6Ihir%`>׊%wK]o.@:zb] (iJ=8;EpTXK϶=JX설gJ+$qgyBjB%(ZGG PEjAn##ntl&[ӡ V|$ +vC2Ѷ!Y @F Hp@1OF""ЬMcbLOMN tmȤ" oA46t 1q(ՁѺޕL gȆHbX!EB^il5c7}`t0@ 7`J+^ +l++"Dp*x=0ͬ 5+19h\*q!}eh@ ϳwKT< ~d$f .OT޵$"Jȇ:ju&M 8m5t#4{2f^!bVqʤppd0WB$S8#lHc/= y $%6yְҨp=X&qi\㰢 `eݹ2Pq%͘ Eb`#v t +FWb Ղ-LA 1)IjS6Rs*VH#R]a+:D}dEFt:#E֛!@AX%@[3\47.| "^%%9!9Ȃ ĐA3Pԓd x+R; $ȃ}pb[;|(S_}<]xPy\ „0b!M5tn|#KFqD>B R)V1dq;jI|u)&J"@m$]zN"NS`(T̤ +$stRt"NA%KsjOAF,Ba 6(Ln|LKWsw H7 + l6@0w=yOA +鷔M2mB + +`.\{0VzP08v. E3,Qpɼ s$B=Pӑ,CLb=NAq,)'Ay,zS)b89c D))R C0恅H#,cnDT(d_b K+E"8-9e~3BQ:Vs^αr NL P ͶVTd;'ɥr1ǶgiLϔhyqB*pA +ј4ՌEfh80U7O %cy'!$Lzd]@mQxWjSx/0Sl"ȇslaTS7Á`&_.سV01dYQ*!{ $$<;Nkqq/Y>JOǼ4ŒRӃa\CX!!" .`d'$ANf F $80va%[q@݀ FgX`@ Y\,)5;6 %w=THđ#8PhC.E+҉hu߿+?U-wWY>ֈP;DgaNk`=%sƾf$w]ܝRr2'̽cOmO7%^o`$li]"!0h]mmwBC<(5R#k3J-vҜVs\μ2U1yiG>Sg&ssA$/yQcqP+Z|8r9XrD!9m49^<ƜizO_mpNF5`RE ӧ:RZn'`}冬D֛_lDC"hDp*]ѧTM𬏚 @8v{jQ}w;lt{0)fv̔PAI]']N#eߞ@ WS`g:kd{U{Z>RWmvJ;ݴ$yY0<5hD*cA1+$ P>!#燒zBrDrPܬ+䝏T." +A`R⥎)cҍŪuDѱZ`&Y5[2&&'S4ε&6h w(?3驟-W.XnDKԍ{Nfbm+}+s`kSfy@oT|AK^gnmP"Ue*~CADNGDQ ϟ|"}m_ F3"[ۤsYH':\#Fo΄B]Fē)-7;<Z'K9Dxp@|ۓ5 ]%"Y7d6c<2ivE5{![N&,J5( ǹjzd.OR฀zŻDNBh 7L?&䭜qH?ަ9spң6m)8=l!iיT=bP?yBbTеs~Ds˻&iuvFfv6'ב<;?9~/ljUa63̡zӎ\u;]#퓓zJW& w՞S -Q v(w`¡V$ /jg!01S[(bޥWߑ.-ZL+DYR%ٌҸmrxV}g>^/UxW[5'dAA@oIqx + Aǃ6"Lt˜1"oѳXvERE9AIgp&<+l  ^4Dﯳ Tx-Mf~+?K3}1yZAKz(>r `-Qe0G>C@5 +mTiq%E WCuHu',%Nc4+#Ss+i$H[^bՎZؗѵzG sbf@fN~Y~YC#|z9Z@CH(M!jQyG!BԚ' 6rǯ0 +')i#嘎uX] jӄ.q(E'QGCmJ89 C.Ou $54wj0͖'jmNUxDXp40fmժth o\ Gtэb;pStHZ0K*6$q^~,3m*݂rpT`mdg\m* Y3]ucdÅ(JO1/$q=VT`lEEW@#ә줒ߺ DlgV`9*Ӵ (+L`XNT)aC~<x!1+j]c3+[ #M1mrXXߒ!z ;%C}xD PCcDC"<*jC̔I)"В!|ix?Zͅ=CE(:H% o02j ų9խH:nB ]q %B@$dSE<!ሜg%+ jbmާǃ0UwMr*Pi ׂ~ 33 H~JQfcܷޢ";v>8w_fԑ8WMS'1YQ8@(% {W`9{~ݦqnX/jMhgt8\)Żm+ XZx^'j +86i8`hxg=bNISԨt[1=J" l愯$Y}rNH81pˑ!/wXͻ~o2߁/Je'|A?8tpQ.p!]2`@U F;[ JYU^R"O9Ytژyyd+v:RIi#7uBYWؘ=Y6:s&Ad󑸋 +u,W, (ݭ|N99Ezl k,ym$vGKO b ^U [##|,  BJH7̮IL ɮ0PQ.jT`URZ{{ו'mTe*bEI]"Ľw,hL=cHVfB#7 +p:UeAqb0k˝b٬yWkdD*o 7U( $@ 4V2hqhlYZrUpʹ1Salf֟ڌ,*:+J!u +th.N ck͹j<<:BGZSeJΣw,kl /|xÝw>}ӓ Oo~??O~?G]O?rC_L!2f9<6H]y8/ e Sw&Y @;GiKy8Kړwd7@fyV4SؠFI߿MYjt("fTiZ3wMw&?;XD_vzJl` ~ tfvNfuStzu1ah{ҞjqhgG>j;eJYyZv(3h;ʷ-~~=9rl8G68O yh*-;E(v}ŎB-YQP,[͈"rQXo`3*ؒwg| %tdwM@{&$xy$OKQ^Wв2DU~t7$;t?.DayAW<!0y~~q@&i%oWfz|=] +yQ57 *-AEd%$sGd1}pF !C$-OΔW|ͫ +-2bMRJA g0M,2˅L[J{_Bny)aQב.g)?BrDe pg!UΐvEIDS%z *GX,ÐJ@vĐњXPJt'#"+':U?fQ݉t xkN.5r6WzoH"WG9] +oHnE-HT6-IB˜IUfa|HF}r ©n#֠_{<>5ER,-!^L@ +;NՋ^ %́M(Vv2xW>S?W!/֘Dh K: B+B[Q +0Z9P9c8@n% +[!Ȇ^+R oER} q jFQ2H638!څ[T6,?وPQJнg):VU@5~/Eu|=\ +7!*BC4(U0-ڣѥ>@c/C1zIO2X{]@ W$p1aIW ܰ#ehpv/qi`>e=2SqS,QhU{*i4aCA"9{ro=.D׀tEG.1b&YMYIbzo+031 9\/l$ +Uq|-[={Ī򎏥$iKgRi]Aӛ nf`N +r4=+bȥz֏*M-j-S-x[z8?fO> ,rHMYjQKE7X_*Z$t⯻VM)8,M@߿A.BO>!զVwP,a]1%tJ5TcpW'^d;ӊ3&prsWE|׈Cm+w״U  -@:EbVf*"Tpo!d%,I1#[XGӀiUD ߸󈀅/zeȃf6/cTPboa'R9`Xf}$t~[2O5CDU/Ģ1p6I6dTbA.CJ^&uc^_QQڼ~؅^E' ވ ]YeML@3eQv65/c#(TS-nnBk忔r qx5WlG~z*@RU3#a9k_[V޹\FY͝,kHڇiq&0"̎ן|9aFiyOяK1Uӭ%tu$Xu) +V- Pc$1+{?@ժ\QwxȕkiZ2\)oL[O +>S(jؠw&8sn"<I?2!PL}-P]~ +=i0۷'gNv?OQx^Y_srn .\=ZaYa6 䗔o__ڠ$yJ8~fLEd"!,V>Aw:&uyJ 8On:7Aq@*tCQT*mg3Rl:bѕN/S& +GH)Ϥ|;Ybߦ<=htu^5Ady,~%O +PddLNg@twBē_+ǐ"+zo Xn䖥Ԙ}zt]Y7rdTrλ.=䙃RdlOjx}>stream +5O(1$*cv Lhe*39YjD?#W#ǣpl#SFvstY줼x7\EW2 `5yGFrJRspTUE'#*NųǮKx#ZV77ǩ#9Ns-fBb{ۗ*u$I!/(MDMH*I{X񩌼/bҢfCm}EŌ6ˏ[~Y Z +$BG8A^n!sa+b%''.2F2"!h7 Ap +Rb O]DjDl¡=(Pۿb!|Q9eValޥ4΄wpD15eKY`98j DbJPKU:8%CJ9xOq +o\rȇOQ#5em<Ռ4$% q#HcVAמ{Cz23μgs(bW8 +m%cwW0(f[8+= 7Eމ*EP \:5VtJ ՊPOPH1J +O,%s? u*x^I~܉p~!?67)^H1 \MG8w WEOggf-,c8fO`~T:ܱ +mZO^bc Us9s(rd<i<#y f(sG'"h״K[<Pֲ?[4;:"q `4Q8M^ze2`Hz"pi }FV*h=N1"i9rT;y"6`<ǯ.=7=5`g8A,}S!P@5#"b=[|@U-ڮo\NTpiA"`œ6E+RAB)GR- K-x+9{ǻZZ] m31l{XbLD!UPԺIv+"B^95A)yn1mlN[x<S*"GwZȏˌnҾcib$FTIrA=vIy4XGЂ})}h.hJr5i+[bEB*UR#H"B%,KvXw& +KC08{=5`7{FO4)&S)(gTz ZCJpu{RNT t;aŅ`gѶ VqO"De + m'@gI,,{J.GkZb +.DCoh*A^Sݶ}4s2YICm\!Q)#:Q.r^§8)3[ +څڽ6j6S\$W~Ht?YC?Y>=PF}?|z1YZt[8s5[)Gx,, gVs]9Mj0,iشc]0*쥺#aIi=DLiHn|ǚ}k+ 1$ˊ~QqȞvY0 ,2%f&&G:oLhkxA`oOafQi\uh~O%/ƾ.crjPŮ+r[TVW:$U:nbB.`Ƌ#lw\&Ih[֑ь\!I/qE<m- +Q8{2Q!6x*r9 L5 +> Ǥ"Y;H=XԔfVdU]'L_rL,7BDb>f%{݉C,[I| I\U(Ơ;[T4]>')|E6>=wʈPPMIxdśٜqStX%?ajk!u<"%F:4+]k }#Z}3(=x2RkDC)2͑z$ŒJJgKw7j~lR4TIQT?'{ +KVR:ǒ"IwWj&hH:i.^Q&9+yP +̺keS~+s%<[3C"`bn"Q^TS'h5;t H݂6+3=`C(0Nlh:SǂHef'iZ$ɠ4/!NWf~Z6b:7C-qh +KTnMmx(Дzb3~61EjvB +/E ηtL l:S@w GW)=V6+~>yt'#[yI8nhx!wT6q7LY dߥŪ_xTJ2'wbQT-ÉӜsHx6g|J=E.hdw ,vnCTf\= /U% +wu`x%G/̑8 4 S?xr7pi.Iq驿']^Xؗ9`! PjtPAI+,h0MOtEwuY"wTnkX'#VOw4VB;·(Qɕ5+2-%pGwׄfgk] ?;x]+@{|ąKIl'"M;5FWDplE׳s3 * GqrpgCHέ&kDeozj Q:g ǖ?#Ǖw5v//`2EY8c.G&NW.P#zd2ϓi+`99Ѫ`'].r}e/V5@=sJ0fMw%phA+Oӄ'}4<{yC%X [6SMEoѽ0fNܹZNwOނbPwj򙁺-ꗦ{/r{ʖ*x[EϯR~_.,]@^Û0:>u JqBG[wNTB,C ;%-3H'-g.nX 8\Ǚ!pP2Vq]4ޱ3,J3*)\Pa.c@b~ghi;mM-jDM?wܽusuˮ"8;yehHb +ضS%̧,ǯo +ߏC*;)JS;('ffзZTf"pӿl(kj6JFJޕpuc!ڤMr{i3aLҷ>x?ek{fWD`v;rY V +SY*) >YpdsL;a[忰Äi"ȃPo=vQe!%^6qRxYOH)9O- hD$ؕIѠ4&0ְTܹ6UiH3x3^?ydGĠy^Y :XR?8bh2н Xwp<WRNT/P5c`,1pNnM]%iKJ%_@ޱ "WDB xLj9}pD~(. /i9|`MZrZ:7Iu.fUj~~:]3'uptsMh'(5+G\+ǩ'B/eM/uBBhL{xM >!Q]%vQ +QThr.FLjЂm7BCfwDN84^(1cX#~qEr$Ӧm؊Dۡ Tq.z*8jwxDIG6e࢒:\h}ЂjnT?IaɗQ'%/iWaNac&OesK%"zFb, +S +٬{:c媕*#U(0a3Q00n~b*Uؐ%pcު, gi\磉L- .dYH-]LhKY[Z|7Վu_KbcEn^k+Mfh :|'YzgR){~ZjFi=BV W2wT@ ?|BY㙒<$rT~KhiS뀸g JX2Hoxɒ+/eSĭAMUζ>l_Q ! +Y 1H@.9;i#q-.7x:QxQ^lG3Q$h T~͊ufi"\.d(+ n7Q:Ɲ'O53fAd$nQ;H(WE\P 6/JeĹdO&zdHX:1`#oH,ե )9[e2T$A3Z + +95疳d:ʩEɾ#N/$YF3W4IOG! b$3QFЌihg)+ve+|gR3vXG7swq>Q{S[M/V2ʩ?dK^CV.-kNCWT +R$!@>Ğ9ExhT o$|<;=`K\"9 jI(]9}DCŲd.1GV}54QY1FrH cq 9c= 6jF(P'txQtP(a;A uBY;h4F.04GYvKD9Eҏk8VI_iROG`{#dz6¾j6S9džv2?bncѵ5 ܭVM .qffWxT\tTǂ +| ߛEpOTzX8Di_jGt0Q4CCJ_p|槿łJsⵄ@OPNDOwԪ"yIEWb? F8; 1BSХG.[&!dHdKUoaۃx@(?hZy!]BUW) gU\| +HXR^G)} +a=JP^ ser4%c)ҮH3#OJ(SLQ;!g<"yjJvYE{2 +#b/M<T/%{M QD*"ft p_[fnLn/'i^`@LȰ +1VCt/hzIRIסq[G(%OI[#)'@f`Vw<\h+At=!JpAEAԻR)ZvLq=r)]X@PDVkoUO[݃ qb4g,W]gF ucY"uvwƕ4(9~[$QVϴ8`:w:ݿb^Z[@f067ؒb\%墛x1:Y2lhXWMueu!ꗷW4 Js,܁6^v{S1lҷxh2\=*Ҡ{=f@q>侣@^0+4' ӳ\߹}r\bsyUz8dEAH~Oi̕xL=G=*d΁$Zus }(>l U&Zo"*/9YW~D)]$pL[i9Q0%]2iypTD>áB1s2]J| +`1LMlr̈S{)y3FIx\ΰWJ64lL[#RJyˏD6Zz!=լÖ|7> -^:LID){ǂ^~]v~Il5/ ^ zw I#3\t=7Rduʚkϯ6y9Msk~!ήEmY 몆]טywT/5 ʾfÏ@j!e9LhY@MWzS!FB_%?6eSAï.y[:ҡOqd>sNhPVD?Qn~hcR~YGjY3`${C#PqTCѣ(fK<%e~=3SNVW +Ɏ*;MQwڤ$̓L03( 2Eg.AJ"|i8WYZ.2:w>6,cA)ԮgGF=8YBtf[CCD!{վl{8*8wP"b[SP@_o:͸߈4|(2F<>{G 9*4[fq{{O3x7DvޑbR +;~$5+|hUw9"K6ݎ~fKDXi A0{&2Q4AͰ!I4 ~mCx:Ӫ~DI3>ލtu"LKwx}3kdÒq4fÈJ|pe j>65Nhj6T&R_"4 zZoicHhw̗\5m.oW +<$9?0 Ǯ4+~70%5aܑt#{+Q|Kbf%qH<l:yo +.grʼ\~lRѾ]-eHҴtuao~}%H?M6*>n(9.k;-]x@/ӾD} ׁHk=nQO 9c?i[%b ")?n5Wuuz|.m9ZPϥ3~uD]fp@p5bZro Ax>;BV y}+ / "hx@k'b[{p<-aOKr:'Cּћ64$h9Cd&Kλ|yqw> -YdjmMbmnW|_o9Q7tp t:qg|J!w^Ф?;YΩ1@O?woZ%Mt&@iÊ;ŸÖKVm'mil-$lZyFA<߮$I˹T8ׇ"m*yF׎\TJז-p׶ErQ|_̷FrCI@` Mdљw +uF PlѢ8#-)T݈L>#aOhm u2S6ҤàM#i +J5MK[$p۴F$*O67\yGo UO*Q!V2744IRq7"3elc>jk?Xq༡H^MjƊ k??U m$nO"fj:-9G-WUVyezX@RQu|a}Siju2mfM<O O̹:k +CMa5HQgl_5'Y.59}NNFlN9BZQyF[w1U'R׸K~Tuc%v϶ +O%+GJ,ljRS Oi{Gtl]R8M<#PǡE2H{@ +My:xUޮoҒj8m95HSgl=q8G e ; +UwPF;`6s(r[NAhTK^D}nTl +% Wb4}_Ŗ8 +]_Fڮ/[ pc,ɜQWaަGH)iy}B$%U5W;6/Qp(^a@Ȟ5:G}GZBQ .D]=.LQ{{-)~W[]6.6Q;#3 +W4\0F{ghV#"YK ђi s:I7G^(MwT s[#G 6S-}ھeot> +%Bp8$EPBJ9"gٞĤ`dNV[SRYtvI)Bu]ha \\4]ZVlXCE Ѣ'Yeh=.6"M6-66i0r؏(Csȕ=c{}5R۰ʗopSu){[xF7<1aDXtKt>%Ex_oIqxdzT'?~(/6 mܳߣz]f@{"y!c ':3l@{xPT^VvE+V`5%d) ~ +#A MގW  ~\Ćr=$ӜG-Sw~i&܋#YT3RnFEsNO/O8+3UcOõ;,B+eγvJ0|?r)Yr4$z$e;Y)A73Iir/|u`BZE[8sswG jY.@~ևԆHI.M!mgY-pҲj ZR"{"TTԄNzt5mSԐOw kdblY2⽨]U7%9TDMD{0QEN-Kӿ9><,j +O唦jQGԉ6kfĞ(d 8:J3 =׬ZT2cFDODSKv]tKt9$UX^kÙdiJ_bi(4CG-nF1 A 8= mUk$Yg:p࡛̠sQ/{;h%.?!i:zirP5zL~t3筙o52n3 +|5<)f (53ƞ.{HE2(5Kp7~Ր5!y5Zy V ؟I5*,GH%Ԭ٢26,əav'7UuܸW`]W|d|ٴM\q۸D߈_xZ~A'+ތ0O8m FL]Ѷp-ѐ~ɼ934H8 ]3~状n_펈)o%r1^wO|2*}Fg߿0ZKǃ}?v{ +[_oI=ׯBe WPGDxK{ǭ7++yw0_ԢoYEٓ/yvD17r]`bN߼N z8Enc豧{2 _q!;UF媗tSGv e +bTY]I"+vz(RQj@&2xh*1c0b!~c>5Z[6.gi ΁Ёus(EA-&Wpdը]Φk +8ulq @-]z KAb~?눝0U7j1MM6E"G#~W~>@uZ|@T[~ U3hD17]/A+-{GOl߅ݻ\tϚڂ9)p9SbGT xO'&9s0㼋z-VE]PԷY,\3◢GJ w@ɴjW{9>6YXw*53쀸b^]| ΨxH8X))=xRx|puX0*=;yW{_q&LuV}I~G%fxq#s]iL aB4ݵn^Z契-@ie9ՊvJ"}u@”hC\9tu?,ӫE Ac1-wj +cHƶ2L e;go$w6/h]lq + `!p&iK*@zqP$\^= `*t]Sd6FA z2\[}i-m|ҩJ&bNtg&0popΞotM3W;kSkQݒxu0X6LҌq +I%dGR1!+Sdm" +"yX[}*GcE2& yYnS"2`+fٽ-ӱ.L"h=b86@\C[x/q{qgyW4 C#S72zɊ ''bTu])z +ߧՐ6ecM,>TJySq}oMG`e U^),ŏHy!uŔo}P;5bŹGEwHbC`;ڽi=>)U3 i8>[,w~b]+Qzds{lWJY /cy;݋aSPT:J':3֧:A"9HB2";f fc6Fl!RUS,l);,>_̪&ٜTE;5a!>Z /i'5sPQʤts]u5)ѹ"zB9<){Ŗƺ5_҈gWsHTf+EZ4g)4N^]]ݒf}0v8JVjOUGԽ`EoF@+FVrV}V7`18U ޥVD6/ln^8Ħ^O"ٰu{$uҲeNwszY>&S{E4bk|BqFOk_GM>:OP5eP#}͸;cǖ\#*{h 3N-u}=#>> +;:P-q켮&y +H5_)5 1t1w(ATZ7+/ ~&>u5OBaaN uڃ +Bp0/ +kHC:{Q3iVEۖ[#5P>]u]gLG9c N1;?=KN^XP)Ye7iiwr J녊)G]-9X|e<;FR袳1w#$k0Uxr؊Iz?ծљy@:Prc}26h!Ye,~ȎK4kJXwvڥ[2(-2W5` (Ӈ>cDue tµէvJ~|,"{k岜pDI4"Ŧk3{/Un8jp[\e1,Kz)h<~iNEv@S 9w K;f$pkR/7lS:}dcsGe &00;0ƻ6YW'dCudBW/3!s WZvY 9gB^w*g\wF7&8O0<3$V;cL$1tw@o~YJ{x^= +«ӿcI[9ew,JXtj8cqR9k᷒瘜t<:-k{'gEi"V Z⸋@ ϣ2ӣeUҕT@v\WIpvC7&aqMI)506ҏBkHë$}GTcEREaV)Mk'kW##p=[ +IRej48SȤd32$Dn0XB6uT+ *f^ȤVv^)I?p;((9sø3M%71뿶ge.j|*^Y&RK?,vVw?5^#<)t#4ݓ0#NlQ-|*{I#d2jDY/4?ʧ;J'b4p/?2Y +$ t(yc Uá^C eڏ&Ƙ8mՏQh1 M+崣Mo5M-1)`&X w8Q 0Ц wvTw̜OC",˚ ß 3?tNLqJ(>}Kz0X#Z*^3+>w+5&Q3z~Vc+ AGSog_F>hβy +Wsj:guGNJ'ܻz[Z=G?rz\G@z3_ +J9?{t5.G;8ՅNxk{!yRBt<K;V`ztJ=Ϡ4W-U=Ρ> vF 4- FeT+^RIXG6I_S IH͒dF˘zX hv?z7iqړTGjڦ` t[l5Uj쉢Ƃ=DNǴ&z-p&Xi3[X"sgpJO7UI`I52^~g{=N޵U@O% +`-PwɚH5W=p6c!H oVuWn=52w{ʃ; $~=J2qݴl +X*kkKu +vŜd`p9+y޼Lo6"'[pӨ\vG/ZODһ-ɓO}/))a0DC* "R6Ԧl6F:M;6ھ^5ѡ堍MshW"'N4gRN-%0AUi<.+x"> D#>Q!⿃ m}*y"ɫ&ݼ ~9җi5L.Th||UTjQEWKBW" +!=TwKJ`Op{NH?.8Achx~X-zJ% G<>p#}fjZyYy Rf;>3e [{o%,==ٛwb4NJlEƓTAc&6}hKlƐj +7 T}ц'`ߕ73PXqop {0BA){~3Y\ +b~^{۫|6ac7@WQƈqKA F>2xw+Ha\ӥwABRn='xښOmλ%3V#u^ +Qnr$<%lGiNp1y<uS-}k6pۜ! p5st8N"63]C{r/̓ޓUŢ'@ ᤇyMUV!j? y0)oH;I ?.uDŽK|R +3I-Wɵ +J[#"iʏdU=ǽwGzy'=u. +,1z=%c=yNz+N`sX# <_pyji̷!Zy4:g~Vyك UF<6ZҴ 0\մ;V9WgM{\IAO)E`14*V.6y" +0y>N(M32ݺ48s!;RTȢZ=x{ɔ +\k0f[0(*,%;*>@czv br#oq ac# T~%(&$~qPF؞s]Lt&q^ eff< ^I&"hS9/T.֐S{H7'V1tyb Z79)Y T;ZWI^,&D^3N?9[-i32B ¶ys,;=:}:8KP Ȱ! J$VvשU*fŭ#u4>wLxjC~/"q*%㎳K3R`A~/(ЊS΂p/RABVXR#0B*$eQWpPFSHEiU)Cyfz) +Fw^a?<.}x +02w^B&2Z%2\APs%)V;_uYo%2Ͷ<:ݜnp"YOgth BBlP[( kEy<돇(`=\O|^:s(=-/cf#6 ;_X))JvZtp/ uz{5|bQYOFxKj{z4Wr8`}]UQ{S%Rh7;:h='4;DLt(;_|I,F]:- Mԩ7ƮvOfV:rBTB\_Ai22^DcQ' +ٓM}~*? 5K<_&Q>* .ƄTɋ}f6Q*'Ѹ DL3 +B̓^[jBSINP5Y"M*3 +̪<1Rdjnk5OJu. +ۗ*Ёyj/}i~9S;뼊?=H_;!) ~t*|ME~FnKH0IۣZ}%+6XWp١1hpq[O R佡9G\_ +SUAI ؼ,V'b]Rүc$3P&کZuwδ/=FuAo*7숇.N;ΰܐ|Q}~4(wJ/HNvh\L H{#a_l޶P, j.oKE 9srmu]m~rj{8{lW& UW19 <Ʒ7_H°Ull.SFC/vZ^͕~"&9B;(s +4/c⤺%yTǨ<=yfnd~Ds!Ԭn0 RӒ{Rs-UC!uIgCг';R1ʴՃl?yГqHO4lA1%o/{1 {RZ+(gyO΢=Q3̂5zfj% )Y RgCԩRni +F6URH4̈4+y8a $B=0ъ7fBaNT\]iZ-1ΦR"#P4:ˉ@Kġm~ eE-<)y0)>)+ߣǻ23!V176ubƙ2Z <\a>4 -z45z%jA?(92jRqPu}M@ʅrsS=ugPjCRN_Gz5Fe|{,c+r>H߫ (IUMhhFVUNs@ vwUEf"ʣ%z+pF390`ȑRjZIE,9K'Mc9mp,0㱔čg47LN8`1fOs4vƬ%N GY@)Pgz(U>}J*'P5o*WJ2: e ]U[W9"֖inT y vKU<A?}QTfVVt |KrJR d}:xp)@H,A<*j1w)RPǚB"%>5JFЈH]D0F%q +UǴI6E6Mcgiyl[z, a9E#0~#1 + ѕOKVpQ;}Q)GY )-!aj)<;ts|%Mkܸa椖6 B|cQ[*C K]2PEW3Ud@pPK3CA 4no[hdrx(qbFN=do!N/=N 9WRָ)jJ:WLUhj5J+qPLtx׷_6q |9WBX FYuk=[ 2yMWCNS +",%D#Qg +4-`nZu*rgf8j )#ZJ1)1!DAʜ܎~|&TZ%⃬( 41^M~ghTb8=PbИ=ڜ +-ilvQw/؎/!'!".#4.ώOׂYԧ%_z7gnֺ/ɃJ},j?W)nqvb_4u!6)Ue:и}kcea)þpj1;-B/k?{)M))LQ9}MT2[ή$@^7/AQ:Fv! fS3H(=}8k bTuԚQ~R|p! <3( +{u@mGWATJ }R.|isF e)niSxǒXrRAXo 37z+!NA7H^ t4-I1 $yVg!d +I@H8_?ZfoY5\9NY5O̶u?6U*ɣQAQcu\q/N/ÔwD 2C֢3BZjմN;YFΔ p1ﮱ?&_:^,z?1^/N ĸe~cLүo|ò:ӮSxWz'io]`.^_+٨5#3y3-~Ҭqte^j'Ec`Q2Ǩtp{1"9ZDH6n 7$)C:g`:iBE :b QHHZ'/is6P/x&9g83;VCoΫ$p .< +i <*$,K5eVT,XA'<L١BU?n} XBYiZ iOJ? p{u)ׂvm;;gFRfܔ]j(F渮, vzQҦddݾJݓhn^LDP'왆VlDIB,YoJfRǰeekNy yi;SI}W}&)"!P(*hb_y2o|d*k.U޷ڷPr+V's_,WсdD]N <,νU\=Z7 5+̲!>'4N1Zfq#j;<ɴ7C/;Ê`ЭZ/x灦usLuiU MS1fg\˔#SsYiJ5q +NN/%"_e.>/@Tܾر.pKo:)gFؖM! +-+}r?aT{Mh(,{O7a&"tc.ķM*di?fc̭U48)[NAN.UzS(j*? P; +uju#!DKɳI.gvǖnWQIΣ́8 +DfLoglm$H/g_|U+Ŀt˧ogO< +z /(fzC|#rdS _޶]+kBr1\u!)to%}&e8͞wDwWM~j\`bB2h:`mιhը]sxʗkMrwMk)n& +OjKZU!+/sR7B~aX&YgUR3#):($dU\}gL*&^) +-< FpL}t:Ķ%z_b<#?r4&(Jy%:Œ)VEm;TS?! 4d^Z:u"m`e:V=5݉asIiƿjd=2Hr"d\)08hcj(:ὨS$xrnVi& ~߲쯄&cUSX@UP_pK2)jBxJM:|_c<g?T#lWH.y~gw&"ʫ<5X57?qh ˆR/ыR%jdAȢssU!^1XOXP ]P3ٟט7km?ύƹ~ڜT{l,Y^ۋQ.7\5a:kI.)@,;fdWf!RZQx's#LuA ++Prk Zs2fDOu,qxN S ]-*ӳPf7(՛ +UG͙ 3RGF#ÞG/4.'¥/рI9E !2 qr8) +%5QDF9%B~7;$[! V{&M8kt0AeL9֓c`-L7-ţ⇛ʬ}梌79_sbgj1hq@6͊S"DzdbF̄#ǵFvcr.;=%c?h}ˋtV+-~,"]7:e<VZFJ=+JtyiC彠m^-RZ%C@T1DE9\KBV@aAw3qvmj92*. +Vrjjpzr0+^Kw*?/j;&Ic|lj;u4d4C:)IE`˧( x2l_At;URa/G0eèpYu)bϘ@bԣMx+}J0\H{fն&Qі,h ((e%N:QxwI@4kԌUDDJ`q {?dS &(ڔy{47['TԪY }z%arE Hv*w++?P(@!= E|ICYjm0Vwjr +ZF V`rgxR+ãpvK_'5W-C~[r Vb "3i <0ECB'jj< \ |J)sB}\Ś #>YqKSap٩6hszpegWbyR^,V< +9bƧGy>j%h>^zKXmc "^z+P\79K,lkc"7A# *G4pXj3tNBpI +sNK`+z(KUVq]O_+2"b U֬[~tṁ m <̊v*=$ۗM-i+R۸5bINbx`GA"*䐚sVcϙ"Tk>|٫A깨%ƁR"Ic=֖2oiJVJn7x<$4Tx#|e 0IvVU~ JhTAqS ~pi6i:Ol"N^,tlu SYV<ď0Mȣ7"E?MRxte#̭jͼ=P3TpV˄@y65cTG_Kzr&~2Z%1+}Q=~ uks6(au $ 'ffVY4Kb,R9 /ULd_fNF9%\8ӈةv?~YK\#PgJPe;HcU Tl2D'VĶ-, Ϯxdh7H۰&.V [;cm<Aw17*u y%E>e~#s.6Lj#k2Zv0iPxh~h"\a2Ur>nbPZjoԖo <b~{z-ןfz<0<%oxu]Ɗ[jjag33Gh)`ZLFCa;AT R1 90򡡄 hΊN&Ajj`Vd[|Qݼк6V782C +btuIkRvWZ X@'s&_%~[s7G$14P0!Y PZpt}?H6vFG#z6xmF) D]6eoY3y+tXt \E[=_?Kl|gfyDjf1Lef7I1uh?iu Zcͼ F38$$!iQ=3Syl1H˴:&v(`wpWGd Ƒ/IqLG7Rm0F`撿x?Q{͆$>f~o.R0+h< ]JQzFcsǢ{50c-jI 3ok `@rtZXi{Ӣ%%~ۂy$n"ƾ(Oo '"R곩C +V5R{mc4S˵k[Nm0QpTY+p) +=(HN :REGDWҤKU37:tхmUOWk8tå3ͽ$B#*őw65W8vU0 +ʚ9)r*BC?2^TSbdm5 tOX`Rbޚ`ݐvZ\ Qy*!Hwgq.=eeޤ NߟH5$Ӊ,]+$?m\ Cj^\B0`8E19F"_H۷8u'qq.;2HS% 3dNOTiӸMHF0i ,\aBL+ЪϰQO% > ,=0@Mz@i%"Ug}}|ڸա3[5`k,gPWSZsxgx-DyI'JcY mֹƹ;TOxvT1?;eye򧦐%0 %12ׄ_m~('#OI J䉣fX}4BMIkH"֛^KN i0Ȼ ޒՑ'.K +ʱ[}u?Y>"uQ W}kx$ 츰`>* ቢȬ x& +!dhDq%bȰzv36@cbW$i8ύ1/lDԤv12jE_+t鵭a4˶+,$s\UlOXsќVf$۵QO\]ݚcaXUC_cȽ㒬{ 7Z?Q *lp'csVSjujHQXcҺB|@]Y,htvԭ] Ji,=BNنeW$$j\rTkF}~YX 3 %1s AR~`W{i]tѣ&Ro$)^G'2} +86%K\F,)!1 4FGK?@,2y)͖Y-\ yy9 UQ+KR' +0%J̪>բ+Z:'}HXY"ڣ+Uwܙ_V'a3ӱŅVl+r ZPxjxŏ~orVY6n%RO(?EJ׸79*d~EL\'bC@t,AK4Q8jc"F$ZsΕ87S2Zh(Kt1Jmz(Fms1ast2#:!I))h#LERЏ!QD-S~p=Df38дۨ +Pҧ*H%CK2cfXL IPdAVҼ KNu֒;bIC:b@]!~xoy^ɩ]2EgmdD4+O4?;!f2fgCT]ΨtS<K3tGߛn=l{MB~Xݪh+Y?g +4JSZGO=Cя9& \a+SdPK@#@8R:;cozxzdJPvJ|(mh }4Mf"=^֗嶜4o|0(ZU9㱑CVGE4 ԐPK F3ԚupG_}a|a\/P-c06I7%(8GԶ{&&TF@>=_ ) oZj],Mψ +R/ tkB 7ScQ~'9sS%Pa^4q3'N3Yg009ꀩ +/<|*.]YQ$.%#J|E }AA+gS%#ЮPϨ!GvD%k|s/xFB:\7IQMs5XÝӣ +Xn!(Yl s}65)fkR8]zN;)dǢiTi#6@ + dPT5A/>ab9&q0&Od8PG8.T%dbeJ{,I9M.^AYMdk8Wݢ_݄ +#k][UMkoRna-? o/?Vg(4u(|3]'=jMQnSSf:7NDl)NdgH cĉ@p_<= SoC\>렂ZF;Y?=uIAZsaeD(BNt1A:(Yh>fϠ$ȝ!/P7=A4Ћz[(pfgZT 5dHዞo +m1M;h5>f3F/h<\}FAUו08gՎ{`q):+Jm 4Q\*>w9O`Pg'rrhT[7V TsZ%S#|b9# OW#l[Q^;[,J}Ré0覀ŢjCEJBgIM5FTE06c.]4}UdRFUf!DKrKY°E143`׫xp8U.wÌ +N>jbLtXg`%AVBZ*+HW$Gh!bM#PlàƍI>*pΙh?ih?o`OU$;7t$G1.>\Eu#Ia Bt3t|h.TA/}d *?3:e5 t*M +=Z`- +e΁/%~*̘Q7'v^tLߞҩJV#2CՐ p"#L.5%I䶌r7ڝ NbSnrKFV]PB(hN5XgFԢ7Tµ_l⧻ڗ%w0;0Y墴K8G):l^ܗ#%ۛ =V#poDk7h􆢥:swX_pܾ'l}ژ" 8 +H<өZmnMFbiZyZ|Ć %0=c]8b:vCDOŸF'o.,?!‹y 4&zPu!3TlˬJS1t6`K#AY^/Vm +8cpб2:3;{4^Q'*$(d㶔!C/IT$(%K2k;d YalP̎*LFl\/qsG粑v1跚ވ0f/mgUTqF˸/A/Zt`832=D^U|?W?{ӊJ?HKFp|hdqfph/6xf=] ü!!:bK=Arwh@&FS:DTRGcYkY)SH.Umǥ] +)j,!AnZJ434gp + ۴:QRB$00{i VshL^F {M DU[l _>~ïAbJ.$_\`r}~C:C>F3'>H D mkAcnf=e2^0^ľZpmNYqd" j j92V T/Y(9գw,XGbZI@C&Xγ]bۍF37$Sf$SE.x++cHeAoµSl[9$[^'hdbq)%̄/N2̹OM\:Tge~Il/zlk^kl=41p2>K:#ѮNˮ8 +4{֜֬~by% ݝ}0-#+[`7d1_$ҘBc[4{$r]Qݩdft*/H)Z۩cM$* +U2\r*G(hcQv-af_`Ghse7buZhcjS!4K\ s}:Pgƅ#} Y [b}QPN:vЩ6wGI˂b¹^hR͸y"Mc"1R+x)D쳙gJ:&j³svRK(j+RWi+t{dɌ;K +hH氩31[m{v Q8c?"Њ `?c^%v:X_1<$ +":,j;۠t +n!ugՑjR!t: MnW}:,iyt|$ֹ?to6Է;p| I=D'.0Au?7QmxR~oUp9;Vɬ)pdk#} mul_`)F7(.k{#C@s+ +J$K#8N39BJ5Ehƾr2H-{j?mQRdGC6as.|.A4C,XwSq]i˫Wtt,oWxOVMjTqaOG_l R+!se4/clK=zF)0axGӐ]]ҥEx(uۊ(\>B]2Ӕ?,g'^!)#/ fN f{1PʑDKF\d1кЅQrkcz# 7,60#7;BNًR>.w"XšH4a1Zg C{.>E -‹[vU9/"(Q3naEid0D÷gf+/z{) Vm$4fE$ eZi/qNOg[Ipwˢ˘`,EߥjLJ9ZT-/i.+  +z/dn>-zQѿ{$.bL(sjK^#s^/ +}R 8$aPݬd d\HJ2؍PE:sV +~$ GJH/lY _(~K$#'L , 5wq(@%oiȡƑqyRd,|f:[CdXS=L2%N&{FYaL> T{F^ qGi0g00)I:H#a +45Ɖ]S ]j-Oo?B1udVUXW;צbHe}EtuuO8E -7=4`+fָ +H;~Y} okDqJ/-Y%͊|V2$6 TA3w(nI鳛sưlwcPЏNK)05Tn=#ʌ +4SCKmAsB$)zc PW3H|,-Qَ9WF RL۝b mvVoŨ'bq L?YnJ'Z͇gu8Gl G8}N~$%dЏXx3w)TGhȼs?W!LՊh!k S-R}Le af6KT|?;mUiѕZ4z +pl_DDUIZ\T XiP%p&=&L[F+o6~c^ v]nn3}QvA/ XM0?9a{SS1BgO2zmiH[e?B—`r_GIgA1iG6~Dȼ%xݞg}{wYi {vtD*+_VC̛DS9sM6bu,@;Lziobv"d;=r#Yԃ2OTC]&18JUI%7Z$>|? +=_Q7 VJ`ayΟb=&H/T#1dQMM5&He/)ՅIR]9h^?Ey޻R\GrОAa# 8'Wmeԓo+ye`6;FJó[N6U3Gbh yOyQyXtu+J`+ja344:DHl)!clMu]@wP @ܾ_SZG!0~?~}0:bMBsY{=yJ+P859msoƄXH潉:{;_oz+]i=n1ݼ(F,kFFAcx;bEŵO'29JFbfDtIEVG}X%w`b +j=MT+Иf˸Oi$5EH0aO$O43_@>E,vy+ŋ_b^]>𓷘k{VM|Z7K%D0Yz.p/JffAOOI_=Rhý +T?DkèҿyŬ,}Z:ѵ ˖,w!B?O=i+_wҽ'Vcv6VDk~<ʞ´kQUWJ|mHֱ[ty&,t7aC B v#b77%bigB8F]r?'mÚ_ț5G D)}h;~%*.Ƈ ҃ gJI06o8{FTkF#,yƒ%(H1bm.ɨW [S=!r +bBS-SJG[G!>V2q@O<%g*xhm?%)s/*sx~M䖏H/ +\^S|MoM,>Òn| +3忦lxEkiqR׺Yig& Au![=W!5 TJ>2ҝtYp~/X ?W? +ȴqJ5GAqQ߈{29L ]/7? +#ͧfj_srj&Oԧ3uǏuC̓#KjImv0c?'@p(EN3L[DI$ +yn(@ucJ"f>D] WXˣtW +կf]4H!'%|)> Ln#;]MFAjrml[{>bˋ@cx^}y̪D}WA;U[ =NK }K_9<O*6[ [9B Sg[AXn9AV4YF/鵶bԺ/F>jJ| 80+z` !?b旂ϽT6;h-sac +uZFNfۘ;)4آ|)r<7<Κ9VlcAӣ+=a(jZ',/zI-]tb> YW t=02"#AڵD&8;l,69sU"Hh\:))vL%VڙEcd!7ʠ(qIPq"۸[E lsM7 nl9ib鎭vݓ.4wIcap1lw`dyfzçikx-j9;Vr;}%Y>?57ieYNkd:(7 +JբYQhVt }u8{rk%H+9jJuΒbJ("])Ұ-|. +D'8u*(П摱}??,߾>/Jɓry*ʇ^zek)"h*D(dqzb[UL4u->8[\K +#GY xeVβpIѺ=V,rԹnNWƷ  1 f+BgZ ذ0ڦZ&9H3]p`G26'JæXΓ \ORx'ЈxfD!lcpkԂ~:H4 +Hk6A,hf$:*(pgu> R=Ӹntn" +{ʅUU P )^Z+={WT ?|3\Mإx;H+k +rT\;cs۪ɢJi-t4PˎqkhY7)dQ/]uͱJBVI=&1 H6nm-B*S| K@B]g/ ͂XQU%:q0dKҧԭ1c~G )JW[̖a-x/}:JgU4@PhϊJw_lAEkRܪֹt*j|-@yS)Eڝ|o$bd%I".t-#5YeYfkߏ(ڐń 1*Bp#lvT'+jXC#~xkDH'_uY;6~>Žy.8͕#^8hPMBL޴i140FDfn ."U9vB=XwHDnqOhm6_!:DT .`})+$rjt&{Q(xX +83Uwɔҝ'ر/v=‰"EKBH 텖p!Dil#ӝBUPn 6F6zi4-ʆw_0n䈻麱B/.e4uEyT uf;|E™{?b HOH|DSǂI9Y-nNkhom2f#ycmxa5慟܆2+`eB92>+❗o]lH=/w 8;{u / $8$AXD$2?γg^cϋ{u/ɷ0^}{1.6$ntr)S P/ W.참*"Rhض0EU/.A3UF$&J/iaCpa=VA4PRIq#-> LQ)RP MB)yr" Oԩ؁RmQlN3M_\rƁ8MLI@i Qwjy]{%M;&!% 0S&X4 x&,nvy !v4>[DʝKbr1 0A=8nv1S25$'KξD).Țh*ɊʓuL08וR(Q +N^jV+fmc.')KF^y!~4-(*kG@ŸN/L +EѲMfmOIvLjhm:+NOu95I8[Kb2N뛱R᬴"72t=&^d-P"|)*Ghp)2.鶲P#:H`RS%}N "lA~ǹmˊr E`C) ȅDfxp9;5: n0Q>_n"vVO$YXKU:3k `M* ?gNZ*I* deH EJ bq|]nE_I>sr%.ÉP}QBcG4T5!}cb/+JH3K6GCYJ-*̌ks DYjƁJSU[J:z^PfZPdDڋs{CIdwPkx@//5'Cֳ`^[mbE?-R B%;p5(2k +en`xۑ \RgH<o&ՄP)F\džK`IZG!i Lq:9qTי +pO$]Cv=$-:t4#$g'Qpj玅tZ!zr!A8@&*}RfVX8\l2 +PB%* +OGHԒT"6t~?IպK)IA'!}f*߉RrB0$jdM#4(AQWU`8OntFt(N/6V*&4A/2i! VIW#. E&&E͘"$p +XBV8v&(^e\ߜ%dHhR몒bCj;Dy5פQhI)/]CI{XAkth5*TVq8))e1q-c|(j9uV{%%ȶTͩTըP&Bf(0# +^{̆@Omʐ(!HCDdAI"Iz)&wXT,QD>ފ&ָivVc {-y(Ǽ!חRЗxXDar *!|(s8,mpr{afy\KflՒwIȯZHPT)LGn}WV$㑤!$wm4FR@ qa<,30hV(m9N_s:gkEK9ڥɁD 1Jeǚ,/68,ÇB&<J,;K +WȡvT呖 WP +%..%;TP뗸:J(;`0Fu2ҿF2{r 7=d:tRDN! ʊ/4ϑ`BP;B|lHBJRCSmSTc\eiO@֔5}GT#ƚ6PjgØyIhfMeT欠J~ #%g.{B\K$3\Q29JI9*mc3(`§`LoP毱 Ɲf_`*B:l +R5.ņ?)AM 9uq+nbDHj +BLQWzbQ~KsbhQړ\*&\lnt^EZN-Br~㐁UuHo8Hh3ဈ|<€]ì`Fd%܈)~,B27la6\> 7S#2 ˃ wHJ +@`]譆 +C H2NkWR%"Cr:@C S"Ӛ{AI& +nf J<UˑKMOE#Azh8eٍpD3wMEpe9_Mw-G2!Ζ6ZQ,(Uaw,!saėgSVCN&\ijf@U:t _OJz~ɔ wŌ0KsTDK|`V&C1ʀ QaIre߁%y!8|'{))?[K7#VJRL%-EeRe_r<㄃9p$_5 +HȦ|nt|@&0TȞB?-T*"wJJ9 ai VSBS7TB0( `@n}ˤǪmHTksT^4wBxĩP)2O!Wc%?id0vZFQnaabw*Y /Z +!P_LVyJ +17P)1uD(h؃ +-r. ,%Azxc /YJ;G PsC3BN-dC"ptJХj +)RqL:լ[OƲxъvXsY}Q\/J8vkL=u0QV$ RPn¶@ȎadB U2#֪dw|SHp'(Sc̙Sq !X'E9?86d߷7t\sμ *^pnyiQN`6;d6p#<mEulkéf;Kt{ǚ,EjSFSL)G;5 +Jd%ْLtD@p&8l#جCB;mOvA|&e +lB伪2NG{$z-I)4j1WD5( {i -$ Z a1OR'2Hc[L-ֽ%'7 HOp| k@JXkH@Dq`3M4/7z5,il?f$v"]F9o(K+r@`8ARƩI o)kM%Oq +tamƱ"% +G{mn +\# *?Y8 +҄KǤ0A7"1g Mp1B\DHq$\X-9n##A0CCz  ,޲K18 bP.yŊBѠ_rLEeK:}U)qɕJ>uE\buN{tn&a%1z\K LJ0m҄5m0dl a)IՍ VS!J +&]/<`$&(ߑ^uPFܨ2nV`Ӱ9>#E:rngE"XRè3R>*Nr hǡw,8#_^pvq|6Wc  {Ɉw%IƸMy dukڝm==c/mQX m/[tt1]_Xp!|HkXm-$:J2Y*9ɡ}X(}Z.~pHK.+p۠'JC @@dkLK2yx1kZ45U")?+.bo%8=,2f+N1$ n+3`kБ:*̻&[@>&0 .TC8*$u Ug:S$Wb-sqe؇ԫG4âX2k2AoT⏞dH=P9z2hV +$YÐG&as3d;XQH]CYeD(Z*n( >!7< Yɟ0P#"#J% 9)0{#@\(%L*MG`4vZq."!EEÀoJxAhh.K#ՄDWDzGiuG/x7grR GYJdb!e'D >Ԋ0MPMJl)v8Us +|>#: +LQV#y*Nh +]c #+XVE"O6u z+4O'߽dtv3P\}ps ԰"cɦ#S_B1]rV]oF? B)T2 +䠢a68PQ +@ċGq9smsS*C +rF"E6v@@I+;9K;H_v80ϰM3(rHK Pfi4yUdV@^BY!*GD@s) ξn5!BSH;w*V;NQgYL'6 cP2`DjZ#ªX(U>+G\s4Fy!}]*7jDILw!E%`ed:%=-˂t,ri! kY`G=N@/9) O +\LD#?{7xKO:tjnIͯgNrR7G (.6όq[!@3s =W\_9׭ ss),5{5}2'I2~OaO8}BK8Pz )'ԓ]tBOX U^hkq$ +"}EH?7 YuaǕZ`R JHW\ۂIbbDG<sB 3ʧ[Jޙд!IJ3TJZ2URP> {VrBXSs5eᜨVbk>*='ieJ.:NʭsiR+ZH[H.Ҙ9_^撜'`Ex!Šʹ>;%}"]ߓ}> ,n9s50.t!^PU ̼?(YĐ"[s52~Ƀ;(,ٕ3}#.3Gk9BkM$L*5E f#70oa)3O% @Ec-G +_HHQ+(:N~j%-|?8 +$0@zD]TA/ء՜ܡd*E|T̎\)  +\_Rq$J_m6rtMhU;Sz&rFE)+GL!i9EGzȄ!f^C8fbb!oCӈo&Q`-s / +6>K}҅Zdb*9V+!4/{ ɤ"U Yo Pn>\ +p٣W ҘQ4<:6([g+%@4>TE I(Cf6M"Z0OBY!#`Y2n(ik'M`m 쭐QBGb{#aAc#^Id3rbpF$C +!{t2)R tH?[CI8A)zuY<N(*N^/B:3<@>ҙp;T(¢" ϕe ^'9&hA s(-'NIw!i9K*U)*&#!PƔZ\sN p" +(]z#?FT{rQURxu@2G7!8-) s#!ʅX(0,6ԭ0#Wp ѹW89<%Ke砖Fd{uM Mˎ}vf@D:)ϕOpp= 1WTO+把W8XoLëZ`ODi\EҖG(pβI4]/r܂gJTHC%WͲ׺8fABZ-lt! +I}ML|sG҅FH'#a>.OKtq.W)>;V;90+|nwP;mc7YRs%RMX%vjx{CI(S z 6)G_?ޓT!X7%i&pM"55[w4&q3:~j)&( mT V*~ͽG7 ^;3Η_Eu͝Y0g0;O~Jr PK.NBiaj)mYkgelinɟh 5ZsMn-PԬ_=_"7+4^r 9bT3T$ʍ`I^ߴ)rn= a W okrN)ƛ163Vd؍R;iE/X6/W*Rjҿք 0Vw;vW@$jz hhyE9_fb)8AZ!Hk4YDE?0#xWJ&hH)Q͑;=9S=YmaDU.o3cB7˩owz}ȡ9Ơȋ MzMJdqrQ^zg׉'c(g 储c B>vpS862Ғ ;[ + +}d< - +AF^ی =))qVC#{@#cv *lؾ0~l Lm7+Z!9 =S.aج$;Mtd ph =C5bc; ) y&.tMX + +B,ZMٷ䨭?zZ5N0$ Gq#X2kE79nũ(wuڦRb5i.N!rH> Ae~ܢ6w){0wNFTT/ѿ7RAց4ʵDkU9EkR"kԷ`f\o{F]:/on&D\ė0%]O>E=K-o֨g! EOž*y_"'feLn$B󻄷4ȋ_I !@fd)aeP xy@u- ӌaچD$ J~A"q$i~R@,PC\ 2ahUʄOjxJxQ(OxO `(XrU7|h$a~ 'ۥ$Y\̜"J/ۆd9L> @|ɽe,Z<@<7_B|E ֧!QH>80<_je1Ds`v[(RG+=,}oU\|D{}y{%HxӏkwcYK8wpP5s 7<2FD0/ÛÕJ*T!*"D@/7r5(\ۼn2JM> 3 5'n+1eO8@U-0_0gALԋWғ,y;\G~TTX,"@Fő{B L4LB)o@KK$ ;cǥ/>KU7 J?tIȊPUèp<b$OA`a[-;@VRIe:l7HEZ|xj v^r=.A_#TtBZ?:VP'8R L|*q;Z}qØH LCB ȰP +Z? wFljNð? l\,zm@~Ls$G'#Aj#\t&>^ L֤4X|I%Z.g;PL" $^}ᵑ@ +O yrRs'DI*8p=kM(>qg_!M88Yˢi+Un.)vtܒAH L$UKe>9y 2\N|<<(΀u,$ADTcr$5j"WRY <|KD =ɱ61|t&e9[=晤h(F3L Nσex5XOP) 0l*Q[rs(13ɡ{=(bM=Yy L"c[4W[\"]IUUV\3ڒs(Q \ʳhROܪ`'[-rm;>f N!7J\JdVƫ'BI {;k68D?.XNS%=&Hɢ$X +lXa[*s +y{s=\zզ/Zd_&!=/[\STLe~nf1jτPD@c×!_'T`Ju!p!Tb 2T-jb14n 1FP|$,!H2=-Υ[ +\o1آE;kQ侑:H%c$(aO<[;H$v# L0L+{oxS+%vm!NBz]Ac%s,x s,Pb"7Š7@D}n"KTY1$bsyNgȖMy"3*bG|نK0H%+lQRP@jczVȶ;\;HD@o1{5˼nZeaYP7 +v#9 M0g˭Da<S1)AJ(<_XGvϗD#bژʦwb\Fb@!&ko,b)a / $H,,u-1H3\@Q!QD@ir/4Xb܃LL`EV ś]GV PU{+(bϐIoȠy(VE |n=%3'L֟/%LJ+?bQ5 PB&KsO$aũKYG2-r(Pޫڴrjـ B +Vc+#3Cq *C-Q`hCIG@oМ?,p`H)ͨ +S*cd4 Ι}Kh\2b"HԹK"KFŖUB9H6R3V/)OeKj}8Kɾհ'ב>W6A"(\RHy4 +)NEbZymƹ1jFLL39v +Y|R3]pq60p@?b~1#TpQ7fĠ<& ~`s Oep+t(#@r SkΥwݢú5CbkFy֎}"D#9Q)CQE paByGdNi޵"nfBRFOJ:f4XA{X3'LINQmEϫSJpuy,eĀPM IN雬4&9Ao! +;SAYsiE9"VlT$iˈO#!d+# .#;W%PtJ$EJ/prx\(zX{7fn}̕*0DR<%J){EB^݅ o_,H v~!HpMMt_ +n`~(%jK@r%P?a% 1]@ϧQ_!eJV\cR. 90pC}/Q +-RHH `\@lX+AQ-*Idi,ٳ23F5# +NJsjNDV{ 3dű@STF oEWP&b2>|$~vp0jD&cPXuWT&IO*/܎yX5+5ApAcWZ ґ=Y(W-T^2By+ajzHia&P-ac\px=KTZ7lӊ( !U*IPޱVQޅ/&r 鈾[NE4yRylMo(+qIYYRF'z>8D'~8'?b,W8J+n%SaLyXQ֟2;BJ<bQ +Ժa_%Re hZ, ƐH@ueA~r\ +G,z\FO孏+.cP<@M9Gha(q @:k[{J"vuR'"'Aw'Z1BPx @J N5 sibXBZ^5 4{\H0,_l ƵB> o6%Ǹ^N6C#Ygde AL^LdwEJe^(8u:7R L"JyG+"r(]lQ]D]l%ׂRA-|\$_ḝ1 Q%^B.y^B@}IN{"!iʙ:ʗr#oD r۸TL@9 ,`=+T$d+*r)M$d#NJ'nslVy6fQ.^5J4 Uq&ѧPq֜=c IsN<甧\P KDQ %_U8J5$֤k9'5ywkJ&lud*xa(y-\Bj̒9#ѕۓ&m∽cʂ-oe;'{$\19巙oN7lrh1TF%CK1j{l0EĀ RlBg- (yEoFjfo3H$ϫ"-@Bc[3m2e&xls 3Pe<M8̿q ;'96΁rJP7CG[}rQy[(o#mP5io`8Si14a.}ʇ]W$@-jF}y㢋l|*a_7MZm@WYn ujϜˑiPFK9aS j&4nKf6rdv?LaH:ْm] *[94>ذ9PP c)Z ͔cB^JJ2Š#1Pv0f| #a5l@8R<1XcJѠah2%'z1i';U YҰ7%T e أ"yH#+/z+X)nebP>>ܛ +Z09{͉VNdIp*<1N4Vl c7ME4f ᱙Q܆J*YʮEǮ B>;iPK0of@h 2QL*댬2 gvLFh-EZO5{J011R S{L,6` GG 40!?;$J֋ڼm>J>E m 4 g@pxu7C'!:&.loD)sw-3'lh ckxStd2@#xݠr*e*C!i`eT)q,v Z``OaO3,^0kB5 Y +9[GQՕ¯4{_V*7j;,|DWY)~n|#$z{YGVz"kEo@Tr~he͖iT? 'utz:~U8Hjqzf8"TcMhVDіtt)(6Ǖetv{=3\۷zS#"v( ;R9"0kt]7 pɱJBcdE/1mN@Ũ*hgXl7fYtf}yrfd,= l_񋳯=\’ۻdWu$/4LK& Xb&H#?:ڴ'ůK3~&Ft#_c0*A( ),Rj|Eo=32o/hL+\ݘηp2N_t>r չ9:T~;hѰ?]|ȭni'iRtҹ[]0:^?tiO`4 a .zt8OfVoV.ٓn'_M M8Wrot}wAoџ:ӣ~NwNgڹ;O[OaOZ>tsyw4LMv8 endstream endobj 26 0 obj <>stream +_u\_mLqɗ}N<`ͬOYtD;(KٸdshowJ f+WO~2n'c׹ ;>ǁ]p,oqukrp89ݣIlw7`eCic~>Ά{x0l؋?N Fw1f'w}LvC||9/\tղY>vn^Jg5i3,o>f؟?M{J?lsM?ә gK2p䤎6ѯu]4tHb;:e9>A~5`NjMo6nmGx{i`F+yJ| lgh8? ~ 9D)dRb(kQ!׳~9aG-{]zG4Ca{YZ +F0YdʪKc^꼾zTS,ճ9`x^Nb:W.#JsYF+g1%a la3e .mvеZW)]{e1)5ѯU]е7N]{9FT lֶU l/<&/.a{ӄ l/G{; +.2f)2&rh]7E dҾZ6PmLe4\t01CSUVĆ wAѫ. +YQV z +y +]*sW橧>V7 wA8ѫ/K .6=fN2kg-)bVB loUa{YSj^ooM&eL.vg\n_.{ST"eٹvg87z>m7^ EߛhQZW"Z zuA?xiYflvXGUU:}zIΫ1ex.a{S"mkF%:ׯkWaa]SE˻|;LV%tk [Y鄮ckt е胗kT-QKG8*ʄ{o ]ot]DI^e,Wvǰe)TϾktϣkA/v4u48et7?6]е7@.^_k}*Yz@cBрjiHa loq/Mش- lxYZY'=Z(ؔ*u/]{t"oI +(^{L`.HןI.lXx~2{A<xA֔oIf[mluee1TZ kd퍓HW%{ʪ?Zt>m2%U޿,"]ko]DE6E_QL*fSi"/.2\P7O.b.8?SeϸI io]\?T*A3EU.%kөC ?}8ԭslMcw'/c^>5|2] =GzXPN츫痽L-|AV.dvh<茎oVw4>vhyPdJ55^ɛ 7nYm,OW Η+Kє W󎕗7黿N㧝p}Rk#sqiL? ͅW̄_PN|WK?k6/x0?{nyaIwu`v3=>HxVe={կ&N"gWuȥQ#: b ѳ,֋X?s= +V0v[WHc[8ȝOH?z:|~sEJ_S?q>iZU"4*ta}hb €in܊&h??љ4I[qM4*F4uӊ4{(O5,OƖK/0#p]Mܐsen|RbVX +Ni +0&-'6j 1ijm\M̢66[&gmsy[nFlXNU'HgjM@=XSK4r^벉hkWcضASvц+TdZ߰YpcCƴvLHh&4 ;*S(- S(hyB׏"އ+ǍK9a2l`{ov 3()37I>g̣1=0h2̧N?9 OeHOKKYFÉ{(O6mMtң||uc04eJt{OWxb:mFjY6+rY6lV6m3{6>Ocff1Wffqә;瓆 vI#ĝ؊]FUlS~6 +!Cme|S,f7=[01!VwyF8^3 U Ƃ&Þ'/O^NFq;sKݚvg30'{BJy4Qp>&GtrYz/ˈnx[6w{;:pDW.=wVwFR`~tq$qΝ{#_zDZ|$`|y8}޹λpBy|[ȗc1xt?kZ,AP?e<F}w$D_zݹ-9݄rgH RtI2C?p|@^.Ih荆 I\3u3-ГKo:NߠPao2;= o2d9R?; vk`ЛzY\%-A)0Gpnp :7ә|RTV7gqPƨrUC8ht`lU6`0T+cNoms2O >GG纤$O7PTg\Y{{P +Iڪ MNCDžvt{m|ux 4XQV:)ʹy+151 L tdGAR<ҥ F-128"Mj.weǐ|='grƙL=e|;,rKhmWhQЌyUx@'Cv~G\^Ufq;W}p[MCyFBRָBx%=|q88bcIl=m̈ߪ؋7Am;5- kGoLKp4Ow19AO;yӗc7,NOf,)pL\cwZ $;ZNz־Fp }fx^0lj[NIVyӷ~yzסw~Ӫ#ڸsI_T%IGhk:9ܘ%WdFc`5[BZˠ:ǜQ.[ +_u&\o9nWğ>7 7mzQ_6-~:=%xYd4yIӧxw4s4cGsoٖpW]óKbh{Fi4E~Kcw!?mw8UN,8-+_3nRo 8 { <\S:}QC2O産HG:tYQW,$wJ澸.hM†Xϰj[ JH"OC=/EVK^?h V4]ltzdQg.OmtqipxV]T78e4S.*խC~ow;J\,3?\^Da?qz67uNs1z,46 ; ƽSΝa|+\6k09`vZk &c +(gcIhi|Jjj9m ^)m?E8d8]#Gvo7Tfțk|MN|Li1],%A]D+xc^6x>;ڝ0jN&htYCMd;}6# OI 39;l1g}Ѭ: mY/@v'!7#w.ԝ=䴑JNx>zخ?#߆H&_/]w699 ~ܚe| mhuruן EQ`@>ͬD8Yn OmOOf?]Mp} +\+ǵL))77Qv|I̥kS| 3TghqxnW'ŭOǧtI@'~;[XyBg ZϿHhB'R}s@Ur'O-˓GRGLְy(K1MmrzR5鳗 D5:1a ڝgזn(Ҫ#)iі۾iC4S[&|s:9pm2}eA{tvϷD"MFÄ9v,\fO1,?Dnۓ;rSV9f†> +p g]ڗq+?H{GX׳È=N=ȗ5:H_qw8:Aptppvϧ V:߻m<~vgo{{I<!v3Pϱ#43Za׭z ;?X?3ÓE6 +D5.FlL@Muɷtf~: 9pj9a>w&Io$IIX[!:;ٜ~:ʹA9*M릸=ߡ߸Si=;FfkrKI+c[}w +B|g0 6znw}18>[4i[؝<),QIFٶt͉\8!x-=re,-R!=3Nmvkx@'L lS 8tB㫁 LX@\dƑ&߾z%Igwʵo>yo]ۼ>`wn|?Q?죝޿s}z+owKʘwl\_pv}r;L}ͧ_s53x5O+o^/?n>86n=_x7f^v{wig(?a}knx/\r ugG~]=hos_~qSm_ooVkyK/Wz7z[6.]ß\z[>}t{3ix>r: ]6v+o+x}c{'w>Zɰ,i#zmߞ=rV?(ɳGí]w'k6G^;oݺ77>̝˭w?-&?]GzKnAKG}M1ӧ.k;;W޻Ε4JA ʥln|ӛko}xgLo9}]Ϟ~"|ɵ|N2Lww(0 OS̾[L]Ko/W~nl_ww6m=z?zri| owEOԕGݛۿ|dkKq㽃KOon}~sYO|qw/on_{7qߝpW>{iQup_oϏhAxr[c]9盫{_od~/kmW>絕Kͺܪz{7olrXg]}C }66GGJƇ7>>S{QN +x O_0y'kRo{oG/khCFi>]|z8ysЍĽ%VэO~yiZu:/ ,Ƿf{b޵hƃoo_덟_bk5;ml<8zhcpp}=>~^gweeٗ7ܿٗ?S^a&p-ᗫO.pg7]~&G ӣFq?`E4gm O&^h^&zI]|0 (u{”ۃ\qa-}}{~kg_o[Ww?-|/?m4;FIjў ZF|7MTߧd;]+ 0F^1k9ˑ`QJhAr b߽AhekNLn*p#Zl`ر72^"MtIy J?}iN+=U;ꑛXvUBgtb$Pϻէ 1/p7| nHd1drq2x~l<|͟|w>XwX6?7~tkӓ7z~}{Nj31q3NKLtϘwH[ٻZon/݌dq}]?P(W ;|U6zrmRY۽e@Q1 TrI0ck3Z>}04[Uo|jn9]\d8T`4 [jRw6n_WP7m<<_ʲ1JRֱBN5y#!9;{j(o7>b(#r' >a/=$?7d"~Zy^wy]N D1#+~k>Nt Sl(&U\8|MgGCdFBg1naEGRK7 =v |=&f$F&o_wQ(׽~ a$Oǻ̍#FG 1ΤFkszY,qJ{|mөŵ%Jm"\"##@^LRh֭iVVRclbߝ'\|2>Kz]W:PE5Z'l#RrfHEfHn .ۭT| Uܓb2$gd]m>\s/tPUE] +S`܂P$Qҏ2x>G:kEv^#Xd[ O3zRbSR~SXޮU_?#hD! ؉/Ia=CFJ +:@5}4f_֤4#vNz_(+O5LIlkԅZKyw"=\%ʥQws}&Al)gĩ(؈䮷wtQ +E;IՉ72Bz ϙ~]:8?_>l9J"o7lޕȼ7kPʸHޖ?s_g/9zƣɤ 4?gHD>r m㿰_ 94i줗):.]RD1$ l3UϾ]82̿w߆ +ݚ~R~%$[f(JyiFXƓɆ&xa`gXOΪ;%s6 +_{N(E5͗p}%Xv֯RVi 6$Nn_~}jG2!2˦x˧sҋWzB5a$+)Gՠ~X.qǎf?p~34Ix$DfK3d'Kh-,RsK3|Hjg׿J?vaM^ i96&xnE:aAC03?LM?r9QӇ[r CG8À⠙E ˗ 7Ec2o=o-?57G\ls?1S0a<Rk~Ȟ^ d.+;DL\{Mb_v&GG֤D˥Vu%(!A/z\"]-pdd{])kx{?t}WwD^S_!'u?l uPQ[׫ D_yUFw#wI}ogߎv33No'A_O}R~lWIz͆遼P^-wӗG&?|UER6lL;>mQݿ5[m(SJ;_~<_#ètNo`4^FC}Z33rVLeV'j>'*LGT1N@!2Ո6CVyz#:_I>]+-9 j}b-ϼ/a6PVdRK>]2~7/__Dg5 H^t/z_&w2yp|^ꘟtb6JY}NpԖUGp}#]=Qu_v4mImRt°'T4(P҆Q^?s-'#[MO2}T} zk\(vY4'=_뷱SsPK-V7g)Rqi[݉ZFHxdnYڧC|)(f9(]h<Ҝ^/2Z̩m"YvTX<ѦZ$m[>ʦ"A\(Ĥ@~vl EJ 4(EC:.䃀 N->ݐ">kT%ONs2^&ʶZ3Wm#k0DGvU"/cQJȲ(KUFʮs'_dՠǺk7(Qxp:Nc*J젾#dR}*VW^w7vH*,+J;A8;_eO#>͑zхG5&`jy{CG6.{.77◽J6L~(d|_ueGeSN|h[klB +hpS JjCnq\^3^EJ4Zx*\=P<ӍgZz4r_ԇIW?g0Gd +~_4Dh7KmDiۼʖ#NCT93mZuݮ'e<$9 +^L0odp4TfBpԑIc wk\eE8b:SJgrc1deA; ~ڊ{jMY +z'U4#O!cES;^t#Wnd9 ޒk|փW +A(Ac6j2ѾX@쐦0!3y +Gx3Ws0, -iy8/o_ඹaSmכ; :C9{ؘC8ޖIwg`g._bUPyy]ܭnl޻31/B)v.A }e^H榏g:gͥ )[n"*y*[B"> /u^}i$__е!0FHF6)J\.JyZfQbV¼\-A5*Ia@Bd"S,l>pRngN6ˣڬisq-Ƌ25k:bwR\'Lɀ(vYГVllH^A(J\ܭ>B2\Rg(%iݒ=c5>ɖnk|' B갽q(kKGq~UpՍMnT2z `>hj;44g/'ׄ'=. |zs55er{(Mb( xՑ6Y=[\ldμv˴'\o?5Tu72` n[W헋=z>˹?0qڏY%;nzc-&½ARss&M4 B_,St`w)S̈ ̹Qf=-z"0=pgXnعӱuΟ!BYaT +wxre6/]v2D>3U'eeSQcW=SY*nW[x1Yyd]Ay;ɖyZ~!68iltByݷZ-Qoڹ¶]tjiY=A5pΙNI9<A)qH۝Gjoxİnl*+nz282K#[rYƳ8Y寤FjċNt}rɗ\Tj=2@&(/hn5NkNͪZ6Z3[bk\Z zuxx>l=U>4!*aB*O|!vQps\RG%:ZD + pZ|_<<>mM7z" I7Y}3I9ˊ s@+i[F>|6qH:zIjub Eu@̑#+s^VĂ[( +*. +5~Dž:\ۊ}*Y:]zR8).J0G=Ad2{KSHo㝝WQ^U!؇Q4% 6R{}c>E*q'HusAvԸe]!3 aZxd{{`v]O:M*!zҐn+Է}Q7J~B(gީh.#\I?g~Ɂ +xϔ}~N4.!gkW X1_"R+8a/کyt,]=2eSUq>&KTo8K3>F̓+!Q7BySzS CҦ1l'szT'"*a83mZܹ8e_>0AJX>ο*EL d *<2`Υr} V++MsҢ%Ug2 (UK~܏XуAEA+Y.3UnvҌjI4N\u ݮ6's +-7ZC~WnܴAN;Rt'h.0|?fbSԇ0Bd< 3da| b Ƴ*+7{Tms2n D~JDsWξIJLDlKcTyz=*iwQ*~+rGD+>Y>yu({ȭ9f^ʙ5J K"V$5$/x3^HT!hWz G1U^hw<`VΝ4G U1qvMm%rfVzU@̏ɜ[3PLYY)^z޸R5aTgFwu6hՖ#:}E aSaؖg⫇8 #Bþ% Ƽ* +?cfjqqbS]h n+)׈:T*s(eTOX?T@n^}2E>Ir_#φ~`ҮшWƕsC6gscuLr%FG"qXU'+A9";y>mwlBCey +mAL&F!u\0]iX pTz괥UHk͏ʥY@Ey&dvh"S5Z0]q(OHZZ0&IY%Y)WRh <%6?r+^݀]ܛ+CrfcQ#>)EU34#aҚ0=E, ´4s {fu6iʫ >~O+HL]ʏe/aԗD5 }l(䝻ּxɯJz +\ob׼0AܫJ.+ׂo[ KWViFG&u:2ZZpE_ʩ\,Ir365]倧FE-kl[F5!(a X[ :לFdәph`C3o^M3켅|]Pf7jn@Eh-J%SjܼM!t 6 ,L:'N888 ;HDpꭻq[E cv>Pr1ف 5TQ̟&=\eJ{'Joν.j,Z(qPT:)u}&3Qi[i]WzHP#}n[@ې;)l +ϝzuxЭql廋f=,rz~" 6X*lqM]DG ^7_$`n@0-5]k YŒ[1b>k\XI6CTU7Z2_*駪&.m218nρҰJ {UPUSEcu}8Êz#C&4ovmD4qNFeߓwG{f|TU7Z2Y?{6̽ouޓOEq厥nl.ثzK%܆hcQcø{ }Yz#U =U] (Pw6)݃~O5Qؑ}}Tmczl>pJzznJ653䧍:A4!M)q+V6ץG`yYdIvk)W0!KC]OUU>mY*n ēGM>Q+tv{Ծ3'_觉%Vj hmeB±ry.ڡ߭݊]ݫfk%'Đ?\i+:9)/x +dIDZgέnYbn݈^Iwm~_R7Fe R\s3>즄5}J 5sgƼACGiVЊm)^f]x2[:嗚\͉@-iD{A2)iؠ~tT&i(Nw|EOIZ"ּ̈́fĶOYZ)l'U2]y5cee7?uVfKrT*g_WCuQZKZ*Fz.k-( +\jI?4JfvM*&\wL!lIԨ{RL2M^$WptalZ*)hpUyܑ8us?Q&jfr\042H-6kXo5F R*BTuW2nvJRXw600d h7Aa1_eJYWJ$ØK;υp0gcV>(g4ʏ>vf}}}(M՗b$y :zJ*J7ggyzٓm|n< ZjMU_gXQ/+:uڬ X}j[aUcԢp$b:%9'\{%g-Cxz0hc0ʹ[y,͞F˂wu'BW!ޥ]AZwqʳnfTs:m?kZ9IXy>ں=_ +> +ZQ'-kMTM 7B`a@ZnfX l TOYJpʵFRl4ǁVfSR,F[Mt&Zdb٢a.J?k.U4^:Ϝ c)ok^|sN26Q;7DŸLmQpcSZVIVOѧNEiG%nkd՘ VqVtl??M0S6lI nѺU䅔l+Ϯjvi*{1T]rGЕ!Ls#^^J$4wqK@6&A"o 2j(D^{*>} r4܃p?95mGb g em/ݬUv1-F^3-&&K\xf-sCx x5Ml.n5 +n"/"$ǷOBM$j, n߭mj$mP|̌1dS~Ûbs יF&Wla&)X)x$*Ѳ8о2B(Nc8{XW*L D9zvsخC"ZZXU>ǩ;j!$Q Џ8gJRةfyM +WR@JE}Q\JE|6#i\D%ljv/nR@ƹxw+7cG*t=Q`oN9Ejǝֵf{Y Q.r էzCFkbGJ͇ 3W +$^cI0~J\cTwqg󆛢%w +C\٢; k {Xmj\%"fydRnY%*XI쫻aˇ $sĒơlNVeBjU?X x9l !۲jqw%O]W_UVw!mw +rwq;^{zw]Z,G7ѹyߪ婘RA^)޿+7(\}]pr%7.>7*56+fEvj:dN8HKDq`s>fӖPžjyv. ~FmX²xX@~^*[M @ĉ0eJJ/L=i*xh$ywCӌc +Z_x LY)U̵e8JZ.;95Wj؝lCcQ(k/:o~UYYk}PR(R3|YKw8k45 nc*[M[qk?ȐAUyLDy^eeQ*V叶ٓ`|lUҪ\%Hu"G+I\7ЗE{I4j?P B5_F)LKV3hbPo2T@N*G:#H9h l< w6$jMdb#vŮrf7idliR.@d'Q{#RLuMSΥN3/ l5Aog9FU4V6jRŅ +9luiR,a70 +vhxkHʋ*(E8CI9jU ˶qrF m9p8fByN E7} +ڐ^AFF x}ԛ!G2ȇr0hjg$eR; 콵U 0%͛YO7iB<;Gz{7I,eKf@.L +v6kE'q|[lI×Dy=|֦'ur(p4quAmE8G:2^8 ؓ-lϗH3 \Pgmb(T LwY3~vާm1p!9)aݣۄTwkեΜhEk %.rV,i2WNTPw̕B{Vv_3[k41zlDzǓ)jp=ʒC 58Pe=r8yjR꣞_h73+W"CꬎITp)/z{U'ao+6&tNz\,zю3n{_{G6O%.(˕Y_@:Qs6ᕹ2(.dTMӎ|]^=)Z'*cv߈6%8#Rjx}${ :bǹ-#;~ڢxq<ۛ4z@[d|X /܂XX yt6^ɑg3uŅϷǘiN{h+ukSM=U?i&-nv&ZxZdkt|}5FfM/vDTǽVYhLJ 0nLɴ슗rM>-%Cnw*T&koQU P}hm^]˽bk +SՕBɮV{h].>Z[;V7rR]8>Gs2~Ç_ER +&9_2/? g?Uv|lglѝ[\pYCf6Zpb)f[e/+Å~_- + 2Y&΅+Ilܴ6R ?,*ށ9Y8˽eRm;|TUԝ'<*_e։yeiMnpq:0.éHruM1#Q@H727s\TE܍:kG$xʑʈ W_լ YI0 EN^v0Zg s1JCyݪ_cg0zKpUSN#NЬ Uow.wry|l݅#:г +{7a~YLmKJ?:^qDcvB`Uue -6Y3a']k4ѰԬ}lsMhɀ_3c/4%T/]Lnlje\]eql0Rb=Ra{L^|r  7\F{k +cሪFMw2L蕈ӻ0{6؛/&F8ֆ6q\@Wj'nՑɗIܲvggYeqxWD%)LYO\6SJImvz>tfnr%Pibp:Ɇ/҆ |wB2^ :;~=LakRZ!%NbLJ(SF6-J}.#w.z=s{ oJBG!(wxKvs?JfmF('.FYJJ2Ëv&4N1@ٌrשh**7qQR?̛U ŝbm9)^wΊz *|UH)XVdxyL{X̧|gl9EKE6j+; QZx@K^0+c燣^S;+[†B4Yl=ܓQT5h?c<J/&!ĝr(UƺQ{/- +Wv5R0f9]m _ oJXO%G@ +Ѭ`8!f +ܻ.Vĝa;rR<7^B}JZ +u!|i~ޜ9]ٞa%K\Ѭ2t;"WW~vm%WueI~kj;,p(Pr#;qnqhU8RY\I$6+tp xz,ֵu' UHD;9I<<|0k|RRE +@Zϩ|<*7aWڢUK5)j2)AZ9:vXiT1-l-M|L$wE[uvaZ3MCycȳ b21} W$igSJ Gw"j$1sAquh[IҧwRMN}ghm=.._Uۺ JD4ؗIGς]TpFYYJJ]>J&.dzFM'д ]3 ++sMl葨&O +%~5gFUepo#`fRy*ͦw;C lCJH%lyq}݌0*z4(ۆB)j/g`[e8ղpxlg5𛊳 ^a +P2e^QtAͶJqm-Fze%%,9Mi2Z fd!X'U~h1pjkj׊&P9;$a<&m;Pg=֥$bAͬ5g`[hzġӹ<$#):*IZ,ccz-9s$1lDhwv{㠞~wmN 5$w.])UkF9Nw +62t +]JԘQk1LɲյyQZ}xaY;YD=،i[HZ|ZM(]u"L}~?y__jB۴a'gYq3i*g0s/sO{AX0;]!1z471}83t + ~{t ۤݡԇ +RT'"z,Z7/,g[yQjgFc޸i8YбBۙatS=cYfuZ Q6fx։eHko7䟨pu0:I{y*,zrӮb=JTk4oo{x! ^Xޝ<^^\}3pfXR_u w'ݺ, F}8#C) zgTznrd^{Ȍ㒱_Z4 z $; +ڮ 81iY ^,Z:; ՏfrfcXəZ2c0A +ap T˙fvqۀkj 5mܕ &gӴ?QUb魩~1fkv}{*.CZ]%ٔ&!<]-$R&Z@6*sh'1Ykv5'b0sWmίԻNZu'31qAn}CC Z[am}[a ʌVVm,7>f/~2ֿUL0܉^%誇ڱFE FBgk|u3u:ֱp}lUianYi53V+NGc'ZϺpU[5j<{o:'ZjW˲K밬fjog,(039=AcS r~-2"0`U~fW +M|nmTYIA}sLڀL+*#˛8]J/%>!"vZ%ylaלŭuwاQ[,ޠL{&d$Ul=Jɡb@ssÆ%>G+Ǚՙ,O; + mn 4`jUhe1^+۠\|ov뵮y5ݺSWNgƁki0K_J.+ tp}Yo֫yuuWpT;ݭM ++G#χ]6μJ ܨ5vبƗWi}jNWmo?S]jư\vUhez0EG+:]G[.}5>T9a8ANo͒UQad72B'q[_tjxsX_#鬼j^~&U1kxA]4L2"c Jyeo{w=6Zk\p@pe;@ѯfk #5le:z"zz[@u-K$˜*P-43~.M,[ [ fmmhꪄͶвIrZFbnĆ 58gW`?f+/z)W[vݦ +1mPJjSA+dAט)x*gЋP^8qȯ|h"ibZ)-n/4,PQ8}KR:Sg8 +Nv\D{>/9rրNsոAV@,ט'jeoªw1պipf7gj{g-^kSnq0_EZ$hފCC\>E_bGtnGIvq %-x&et4qhj8ZMK}*yXz=풡"g26$<qYH;ChpŸCJCN :ΦltQ_~"ftf[fv݀i5fƜܰdT5j*`v ;Y~7X9_ȤSl]fvTS?\Ss6M߆VT' 4(V#mT +fkmK* 0_kcA䀘#ސeF\C3o#k|ָ6RSs޹[@s/hN6P*Mjy~ RIANX%kǡBr +5tmD-Y&{+ސG19._;e9 h3jzU:f?_ F+)4NzUr,izM5;W%lГڃ1eζ:uoi!dIkbx)0vA,vW%'^هQHܑ%dt-Ewzf7Xx$oڑmA>#Z.T) ic+'6֨R π:Veq WuY%aΩu>(kL ʧ|>pܗ G4]ci3L%ml}r.ЄSMkToξiלI f陥Ž3?s1H7ƎĿz{9-0w_4[ErSF5;1~^/0^l|7Rwm#?49 nNyh*CKD"e4+܀&ifx4%cy.t%A{3q}G2DlsvX꛲UuٝV'3ދaΥ2Nf&[4l8R 8S(+@'z{[N. w`gZk@XuVrg/4 Pz*-&LMO+ӟ_;& ]G{dI%N?3TކnN +>[eĢ^۷6#%s`8g܈q$eSܥv{vfum3^l{SUO,^\IR*r+`;hL P$|Bৃj%!TLR> x[2j-G?¡I9] s;y}UX{CaT{+G& 9O4>O1݇ u|Mx}77```yZv#V/i0 4gwR*ͩib?+.I^O\2%$v/$k؁^0iÖoLl`Wjd) MUMn0Ѵu(IP;j~*?mJЗ#q 뭼kePwڬlO `l*6 `#C[؏bFҀ1p3$[խ>t? Cҥ=QU}~xmySF_T_e݋:-YnZe8u-XJ4QVstעNcc*XZ} 16 uMwU7t3GD/j|\]# M6pAJc?E{ԧ}k[o!oζ~(F Zob{./P_ +7' 4M+ѡfoS=J%opgRR)nۯ6j\,@ Mz% 8,& 8EP='dsj⬆&+Y网 ?nsJ{v(( Xw EZMƳuRvFVac[x7J䇭&!y2Zxtвʹ 3/.9U$* X}Fiw}ʗg3{燒Kُz/Z>Y+GZLla)/|&M%i%.;`e%xv8 Ԫ,Qj(?7?)aP Wbespq'u8a + ݷj=xjzh73)y$bz$NoѵRovY732jsaf3NT ѤGRTU_2b|B5xqLUUe,; }h [??]}aiaQ=.sMVRMl_j "o,+2}sx#F6m;RXO]Yq\tTP~5>p'IwXRՍ:1^ ޭךH6nM]:О7fH!_?%2#١-/\jNfȆIdӨvsmFevo$+T[RLMҶj%Z@J҂m75&}@Bqt̢4/~p$% ^VV N\>/sQ&:J=.'7FInmJR_REU柘7GrqW50,ڲvMmSvWR},f3;qq:wiyev&p| _e^c/n56DKr qet0YJkﳕ>^AZEK~>GJq N$v Vrәt"ʧ({R|PMH+3duU#ߑ +^[:|y^vtJs4yVsߏc"M} K2K~fIЗBS^6;))j[gu]N="eP@z|KOxmk{q.yq>r~++ILe+A|j jȄ.Y#-m8a%nDMhdճ҄5|bc V|r+Z` o*}*;8sw1.RLI,:#`5`쏼b V|Yjpc'1h+ /~[NKԤ4Խ-rg;sc)0,[k(_ˈʗ.n`DCbqZ0;ܽrD/:ht_<>{s6V%|;x;[!I8F=}νY"83O9]A[aʄѲY^22\LaёRֳX|*=]cD4ӜQfQM 6obO),n%kbI#;S%![\ qv>&=U f7h ;B?@yeڨE﷣6)0T,yvMW1c⣼jYVBT99_ꡬw_&M[|*TTT(S`$tp$3T=JyvvcRM4:zMt8u˘)+FZm] ߮&Ķ)@ue=I<J9N(z_N>4+8\!^gYF&1.ƕ-xU㾚ۡCq%,7GݣQ;Mb4W[_{k*/d ;Dq*kہC=sj} _ jI,[4U}c啲Zިh֮gBιmJYr-$RWƛ]ÔQpO3W^R{pS^-5|j;;@k hPc%dX2W1]_PZR_mΏA͵TCTS|'2yNrB-V7AzX){Qv.%½av[ƗFhJzМiJJ~M!妝/{RGe3R0FVJ~CўYUUNɊ렢0/pxqKQ +rt~T \mQ?z̿gz<絘܂Γ6)܇"2 R^[DKƨl[If6~vU_?2V/I¯7moԁ`hyxm7RGL(dy^֕ekU]GFQ/ ?& :! +ժ9BR=oPZP|*A!Bӡtkզz4[Uם_(Q3~o6|#(,iW~FK>JwHD8:,-zpA oMYuz3*h jٹ[#Ҵ3zl1o0Zef0)'62Kg&Q* Hv'p9okʯi \Y<8@s3"wP'&~ׁZul>a{h_\hgl 1WhxDtô[ /~<^oF]@NNԱ.vl\LT۶a8k4Ə#9]'rQ (k@m-P3P/(fXnޫB3t4esp{{@z+[[qgKzUU1 /^MTJ*&2ۭrs#B>mKfO:bk`dq>s͢PGvt׭օn^y>54+bntnv'$ș?n`֖*ulOޒT2x}yT="swY$<'6j2!V+e 7w_h\گ^ ?ǽb%ѽWm%d!gjv)_m9M͖DOUp#.+Jy"Or^tʋ9MecbXWZὟ2=Js*g }jUNUkk{M[aF.V% T*8:*˛c4~p?X=tGN་Ttݞ^ In>ݧwFHVEHiel"D,%S븻t-9k62Hq[Мo[)9Wn0knYX%mڧ[3YlM5V1h?c$GQt6kš6 2ԕCS/h砝hϹqUwKicx/D画vثȝ_G#kW B4_HB5Kd3%?&# 'o|a8`&h 9\pdq3RxYj(Ji +$Ӫc\s+ZLGB[z!5aK|In$ +aoڳ̋^_?Gnrv]tQ<.梢XoQklU~ARZmuҊ2MZ4.;dOqZ^Mn?=q&u 9OH"XϚ5 +4YAޞa]ʜd6Y̝'7Wީy˓ +{k7omiruޯiZy..: ux_2*"“ ˚k}K[7E;'%5 36>sU.gu_צ{xzZ?4&+ ؍Dwk,; s`{ZsAg۴J(/eB bMtܪtRo۽šf3Bi[E̡mvl*]E78@@X6EkiDWVg׉2^.+$WhhM;0NNXDZfsUֺ{F{m㹣S?۞ѶS b?ײɃ+uId{&^![Vy/?^{о9_CRhi\%`T>J2V^HiK# `k}^o44^ZD8Γ&ow3W +> |(y_]Qz53}ط"6nav~%m\߁c{t\Ѯt,9&ן3<N ˝%q=hySyςqLΖFtEB +qۇf?Wߜ޻Gq*Dii-$ϵe=KMS/KNЖ~ v4oxeOQxxk qW/k]#<ա "(Jc ܷdMrrОae`ʞU\R1ӀG`&gI hy>vZpvT[7'jkǽq|S䝥@{Oƞ^5V[|'IzTi- 7CaFHT)::_MƓCTG'Z]}`xRΞq~C\;݁f%?FO^ }1])ʫ#(ac=~fp!~ݪ)O`& UFV26ͫMBU6Ep-*;<&L\R es $NRc<&ܪcM0euZO!O}HT<,[!m)]_c2 +@@\E-NP%#T*ׅ*vF)$3۷Z:IAcN`ݜ?tNxWL?0`r?/H6FwR%ʪtôQP%n $e#Q=ڬylpf6+-Yl:ڇmN4)m*5?ў>&ܹ~AR +ua"b<^_#Y$|8Ѩ>99m}vjz0\Ph ݵIUުtyw){ 6s<VnٜY{\%0F!3(2#0!U4uPQ[J@nSp "/UG&/z An͜}g+!wJ]"cVԩDl7W(yg3l*3ўFBΖ]p[{Gk;uԪހVӽȧpJ-Xc򓥍>gOE`;'y k98WX:90 LrBĦ3hk,;li mgۚV=ğ݌{wo +MpF&EXl@y8֢]) 0(67O}Y44N/5˷썍=}%Bks֚#-L"aGGyhؓܬ}ˍnY;/IWfwpj;4SЉڛ]KBQο6ep`njjׄnV(>WLh\5CA<*OFZ֣NKSj6']d)u9eK=MFǒ%e7SfwNgj5j54~C=n뱊4ۿ}|i м.ڑ=RzQojcm=ZQB~*WwqPL6s1Ë9NOJeVR4->Au~SnԜ_Ltj 4 )xS- 8tSinޕ*frʫ9Us]V#&=;Vy>usF ?@Tg'&YM[ )R'v#0z>$2S9uy:y1`7N?XPns@0R;N6xd~6/dCp +uPrjjފo3+r39 +<0IeVgsz=vȥh%!7X*z$ZbףϸE1T rㅪrji]%G/I"U̔&u X,DpXEWlMo^kZ=q}'wˈ/3𩧲P`}Ox"ϮRk|m;j4)DdiTa~*v_yD5>#Ȩ,P_~$s8BeK 9^ qޫƽqc.؊xO?2BlJ=-}]Ň?_A2? |C۶uYK +tֵ2_gNl-s M̱m_Iw_H9v}G;QڏP7V^,Y?6gw ªF8ծ-5aj7I^^#/gJs*)mZÑ_2eB̊ #'^V3_mo -ܝOM"7mfB(ճ|G[|*xoް {74>qkDjνZ0l7"V]o8u; UH[֙fՆ<[徎]5{oܫNMRamG4zS܂ 8xCo)OUc68;ZC[j\͇f hUv + yx2W3%ϒæ!7xmWՎƗQ3Ź}DT. ~60Ax)n^X”#eTFIw6ez _\4vMiR*ʏ[)^02W@*?~)MqMK+ӗ~u+W)r_f.Ϳ7W}} +2L9{siqs9;&sPXiZC;±R$V[3W5ޟT?PlYwݩxmT_c$Q}bmwVx\e7Zbj }je)bm=;6r|;uʣڭKj;|cȩuy5F|}﹁̶Oߧ[1, 3{vSUdOlÕM$1A]u7(x&j'Vs +g 󖻙^ŊnnkspHFvd'=yhi)ZbD<Qj+m[R]R1?M>OipZ~$& 5̥76t-,亽*(hM3 +>q]؍ EEVF,% 5>QYH[wؗ<'h"?Twkz.Q( l)kh+,oխ:PY ޗv+/'o/-):QbsN[ }7RjQГ&jS ֖$E?P(ZHCu &% e"8z攇-EMi_8M@W//ZEx ZtIBP~k胯/7?b_3zsZQ"2ò*YdǤn +R0 mKӠO!VZݧ?U$ YS)KwJԒ\>ﴌ=ÉZS=Dj6ԕ:EjlB2'/s;R)*t^f̭<*Ykër6Hk NyI+7sjJ3#Tﹳ8_MUDNC\UAQ$WSl:nbGK*%/JpWbBAX5&J1gXT}*&j7GnmPityg(#a5wn_ˡ^۩&ge' EwtÃV}á蕽)ev<^߁,9KG;X']ْET,x> t6A/AV‘ذw>WktuT\ 0͖gT>5v`(WyV̿;u ޗЙD:C Ieh-p1s>K4^{tM3K˪p4 P_xuXI/*tɹb^[ZTϥ#ʪ|-kW e*hvynwCNV ޭ+iIaiƊlkjJz"yϜ'"v# VH<)&7Zmm-n e7f-DZNM%ԤT דz7zQ9~Ub"& =*RXW`>ns/Q>2TMr9jF <(`9wefgo6N +tJ{0~ ZDM<*SAJ0aTy̨ԝ4]9Na" h޻1)`wu7vW^iox>Ĥ_͌:-,t{F% $~_s#JRL6rh~tXuQߟ*۳I m(\10O(.vuvJc;2$/3s9HZAW%֑笩>ߓ4$Vk>UP6m:D@_gry'{Cgѳfh$5B7 +UKk0-#GSn`Ml^r3r_IP9,{=mV6[`R=~幞hʠPV%EM}ΞzT. 6XQTKg}WY/J> toWt4f6T4,uS_A3nu n qhl"s83tHY C/ah>PO6XlqD[*2lY+w(i_ыO~AAHJE~'d D|(*ûÓKʐ])x\n+1JW;Mn4~FFpň0i~PeKշWQ 9t=#vB8*gt>TM|%^gjjDZV1s8G9\q7 '`~$KjqMzì_FC#5HU㡋 5Xdu%ڴ=Ѵo*9ְ<`}N3? 8=U%0e}Zڇ}YXZ{r^WAk4CxA֞e#(B 1>zAůA6j?ﱺk)M?NAT7}F}p?(Y[(«0*7qlȴ?fϤadKNgtjլ| Q:nŷLk_W6;߅Q3m"oȖ]~~ղwq.L,O%<=C@n"=%ƳR&=+۩\u6~܌`M$~c*)7I48rKTaz]$LM4Kqǻ<,") PU+$2O|asI3jfiq Iwr(Ƨ8ЌDb,~҆.6m7N\T1Z@Gْa-7c];²yL$ƏnOLa崧i"g/D?Q`ib;eל09>m秡\4$s;lu7h ;"˛K u{7q@e/?ɣ>-UҜv6DW +lKaZE6Q~Ӕb剻u[ jQ:U[v2ٿC^ׄ+כ5.]Ʌ1Jˠ_rS97.W 2l/3;e^65)ku[r* +Rr4V!P1]U.ۆC|Ք"' 5: 錹oq٨_6P'mEԚi*k(a^_19hڒZ/hiZhۭ\Nj.GHDȆ0悛c,jbL2aW+='4Wdghp +ӇDA7f̩<{[~RAЕ:1Hk5O^F1qL(S՛P#Y4l6 ܈'-X3 a7!cLoQFe)[4m9X|E{y1fb,HRߩ}h~pҼ_qqqMQ=vZ9;T7UjYW Apc֥ +U.WꯤҮ)8-=3<Wf&y·>&FXE{myT Zi*p]8?yV|3gOٓb4([iYQ̓^͝)$Qڧ/*jbɺ}:(vOs/}Zu.Ū4IZYȃ~5t[)(@D_<,]Mi |n;t'qQeh&)+u*s, ,*TiyXhԟ(#[=JAk + VWcp dBPh<:H*Y4 [:-7o7\G1aO +[3*(=6T@m\|1f3i y|Fzyz΀%N;(܂#L׶|ccf=*[kΑT^uSWJzM}D j%4]\v5eݭ~vge0A^ =:-a/005^\rgu2m }W& [G +xu{Uڸ7L$:*ie~_2cOp_W/ڇMj9NݝDZpYdz7>|<Ͱ2;rdhOEt18򭓭}鮥ε +r6 5M}a)wkv1\ت6QL4 zW )7O`6δ>'5~`(t,?/d +wAtay 72qC:%ԮuH +tG?5_BX |!ĸoAz,`Y.mq(~f˻;&]OKD6?%#+Hh +_x2c y/q7,r 5-HDi]VwZ!:yxV˺ "9!zZw,`BS{m431nbp;#]5ooclt~kGɩY`gr'J /AXB dj.}B[Wk1_^m*]-UMv3ۛ-ŒQ+S>3*3G*i?57Q{!`TShgmI`~)Yޅv;]9m㯷jV41S"ma=@+ZK=Sz艆`W[WR p D<]VՋplG;2+oI,*E4ohP9nqU7iRK^b"{qԂen2ԩrtN?lRm(U P& (|8Kv/es,#0Yzj3@IemH?+9j ٴʌب&|OEjqkx/ *7b/8+=:i[85 D[Y"5n,2ù]3=P;ő07,Mu$Qs) u~4 TvvE6)ˋQp:q09ǪaFyy[̰; 膭q5Dڗãeʚ 䢋2/rmivvde~+hLl.Pa8Kx/CG$\nV>>sz +=l9"A$֨[v Um#Fcu"޲??,kGԏɱMW,RDY 10F0Kj7۽廉yi+hr YZn1Bݛ\_X7qVIŒAoD9{9i {ZȲ늬Hh e?|}%_>*qH1*hXj/cQ3g%PqS3A9";: +!;(wq$s*]++lrz[/ԙ3IQM RC^5[qd S۟H & B{X +۳<#3SٵN.u6 \Xv=Z *LhZF_G5!,;#ҥJL~[e2!mUVVŰ*ٸx)hHXȦߌqKȁ5K 3\-ꋴNЫ }&vwE4A#vE;|~jv?f+ƚ‹!p_ Ј߰{g TZb%5C#iB1ԭaY|\[Jfy lcBpGi cVxcTg9$?s%/Pz ;\pc o TNo"^7/XEGE^,cH]jt t >VW{2[!*FNRt(j|LGu2B#w:'I%Y@n+%t2n18Q2~iO^ pWWҡ-iKI(b9Be94VYV}$\k_1:\<qI"tj6~NCkargvFcu3rFqJ6')"B/oi 6i%ic(R˻R 8vo. .E{uIޟX_{UԞn(u^1KE]8_谄fQv#5΄R/$)h6k:`U9{a7Aab-ؚ[m}G(ZuIc٨?ZsQ )2z">LmנWg̀2_HpY>ŦGF> Kl 3 ^G*u=~M+^I'^ AE#A[N8R-@TFEk.b| PQ{(gZYͻΧ+\6uB C +]w*E?=u=#l_kR鿳\ qΪp_.5㯟/mﯞMUY/Mc݊nU +|~WZ#Nj!=yn!B/ʢyC_(Cc޾<4w~%Spy\K=*. ʠ𙍪 +u'QT:%D&Ɣ)ze zrRx3rwd6D[Ү^39橼$Ӂߞi=r>WLZ['-IO9x N9G nvx7O#أ6 5yZ:S T;xP׹dfuЗ$5 ct,fSi_Y Joڒe ^^ΓVvKjZ~\g/ҸF,%B= *$7!^6ZM'Ł0{a]ߧ*!lC6+k2[W)ŸuR*. <'B%pvե;eB!MlA9iE >֦-?ClxT䆳Z\3n7rmk̫HzuI@w;szM2 Z"#`f,*=g4nqKk%¾_Fz9DWNY RtMvtD.f .7I16'dp=bܥK+,E-sU M•bYB13EA6+a pU|€ -VNT6h'+wX|6UZgU2j8:|߀mk3)1ڐG399HsTdA:Cr;2b+JϭS!QښJƹEaTKYݶIgb3F?rU֡\;: t~2O$'߫'\3"4͊gxJt%F#l9ݵr2J$db|Ҕx8sՆfNe{#_tfڬ2ԟ%2),)cnuP>F- ^g} ϿKL\bVlպ:3C-gxg "ƚJG ãMbr{oHi:9'rcqnZٚ>5@FjGU +C +*H)]ؙdMSÙM&3{&!P5F5;,Y^Wc$ ^V<Ro5},^ϐan|!+gn­?+lxG\p-sua,R$S׵3V5+E{uZQQ4jq]MS\DII."kKH/Qu- +;Ar&E\而}mj#[ڗnU6P58}X*k\w;;d{@/k\㔮s#}#Yzr՜-EC*a/dts]dqs:F1,3±h5Ǧb-amҴj=-%"ѹ:Z>0FsDv[ZtXoz,t?Vx|x%]i07lYq]K4@? 7]>5lSoVHg5c Np͐{1y2dyscא%"l~jm^nf(| :ڻ^xhҌ*H9|~{#~\m~F]ΤX-ꠀuǡ ѓSC4XԎTJklYLe~Onm;f3}*cIXUc5 +d2tW'=zBNʦyfo$\J%d0 ?K?\|^uk[,W܎*;Soq&ZMvuc&Ϋ<7xu5ast q2x'qRzz>܍ş|Sb +;1_dghA[ڧwVX Mi5f*-6{E?;*hwzi9 #ETn.I[҅ى\W@F`ϢtXЯbX4oS}=n\Ȳ6ƞ1%̲zƂAݍ ՗|f< "3 74ۅ"lnv0!4;ju*d8%6\6izZ>~~K}m#Oۭ"{5k-\^xnKԗr 2Tج+a TZp_?W.8-w*"̞߾3Vֹ]h~*?2`pcbݺ> JW6X/TʀC۴?[|PE lC*r ߷^zV.7"N$ΩI __TOOoRkDS^S &Y3qSd&Q,gx^џmU߄ߞ7*gv ^ھ+Ev9)^s0:;.L +Gf)Bg޻B;W䕎h]_c/ |S^h8?9F6X=&dr7ͧF.}vԘ;~U +\)rvM͐=ѭR*iVa/?p^:ڴez!RF?iO7lհ zեn+2N9iiжntxͥmv׭K Eƃt惪ZdUU~ITϯl; *Ǯ;\~6[XGm7H%`ͯfňp}wsz+u /#v5OrW'-\*H6EVVQUUW{+Z{Y͚a^'7o[mol +p;~|'i%5\lrv5ia 2lEx6x;yWPͼ:Z٫)(MŢ$S1Rt?XQ)IO[< bu*k8]3<,! S]\+kⓨo)Ͻ0cgJS2<'~`=頾QK҂ekYePVc1 \ڪ֮D2}C\a<+$u35^{Z%c9gT +m<ϻ:.q帡կOmwatJ+Wj 1*g`VR]SI7$XG_U{EFo+xL& ?b8.˒y,j~Цsd;[,9b`9/lVR5}hxδZ}g*A@tj] ~ xrxƟ!MkAWy7BεZDf R_?7Pmcq%vVt2w~s,6y~$v&>Y YqZp+dqs*c\k2~Ӫ $'Ӻ;%j_b{{X0ōj@#DK[l2"{偔41*2!noUcUY* nVn>٫~aq2z60y 2Ar[MGLs8Z .#L5sM曔/撝c8"cMiPP.gm~&rASS~K<û~26C#pn toYG(U3$ +7uùݻ7IS8A;cۣhwRk]^F7Mt}L=3nP^|FVt @޽R1iҜ$N]{.;ZsQXe:irbY/:;UA?':Znv(p#nu>Cw\c(g/ xvW0:u@$%6zO/Rp7XvU&ư06s=W%i%*UKq4#8έ\zk9ޱ\qR )q<^ߝwο8hsƔ#خXu%Ua v r/p,M1_vvHr ʗr=忯܁rix# muWs] "(vvY,gzk_T_~L3xͪI@4,wZ.dA<L}+HY>L~UB!fB"Q~RFW*E$Ǐ}<ik3|[Q:YGaBD!%YBbNk;h>4&|G*z^/xM7MÚzWqP;2}lfDGy0[ҧ߂>d']؟BXلXk;N3R{<5%H.hPyndHs-d oobtₓNM2Kʡz3>E MB^\ZB--^sJ[~Hf> Y!a:ABmgNAƣ/R!>!6"yׂn/L),J=jxzƛzO[lkj:Ա_܉N-Ifv}0ʿߞ1Z2;1 FM37,@9H Ƚ٤[rtOm}jjq1ٰ١/tlDf V?r[A^&;5Jyh#ZڍI<#H'5o-{&RԽ鞆%a{恟ե SC%ֲL +lIVݏԊJID{[fSmroJ774LA_E^==k>dijisM̾=`;F dWoKZn0 %΃tKEynvȇS%fRrtԁ;DɹFҐKFΪFKR~ 6SMrCq+b J)+IG%"Z9-___pM|q(*Z؍uhz#ǎi>tH%|Uwj6e9=)?i73NKs#=MꟘviEP򽞓MRgDb+ÎؿoS򇅵&<\"N [u^dO (H6_` #ōʔ^96W/U6.Um#,tas+R+ǞX5[[֘]!?\_c(V(A% +TiZ< +6%p_GH@8{~gFrc円wt"=bili:veG_el04nP `dRxqu*8e|nXy'74n>Y%66ryR#%gfQS>7ʨ_3`dfg_~;TnxwX.( M`,΀@&5FS {7t{p1Z-tLC݌Au<+ Μt?=ܽ-Q̚dչg͹L"w-zjṂ"xmЉ<'߷Z[,10n#E_)o]f5jKj/ټSG\YM8w8,BC'ԉc5 spV_Az}h䖬et͝co}nķG+I:w2|#=Z쒨 +Ł*T58JI}EΏ)jVkU/׵uy7r9>3ݩ_m\zjZ+3ӆ >F{LOǀw퍭 +هZDM"]0_m4Z-uPOq֔`S$Kyf Y9L*v7<P×VI_\ 4n_iYPBMI`! -@Q'uPJ884^K-Y_>k9AvnѸlA~V:%`>kIqSi.~'h3Ԗ6_2ږ݋+TLy梡+fx0pĐγ|vϹ+}aЩW%mUDCY/_\_KV| /Y$*\-kӤmոDVz\v5Yt-=㑫r\;KâJ ߍvsL$h6pbёvթn1'/WW*[d=$_sm51N70)9_s53jt6=a )£4UGCeH["O u39qk#(eB)X>vyL?& +˟F/ÑI#s]e_fB;wt+:Y-+q_ɫSḥ Yl6zߍgxJ[X՜ZW81Vv +]jnN9gM4qѝ48s>?c̍{~tys;^S#\t{{#QJ~$dFA"tmg&cj۱tD03K| \u^&7˼`NZg {8j]5jҹa~-N7a?޶R!"^%NY}|# +ӯf 2x0e(6oҩKfK1.U5Z,F8UF x[? wuYpT%>;oe!ʙ"N̺tiO2DC= c _z3noYaR3l'+&~v(OڒuH62V;!ulyh=,z3%Ot\e68OmXut8xHt5W[; %'pK3]WA U/?> 3Y:{2[qq +O|3nZ3({=E,pK`W'2n 2+gEױ#kʰ`}-%:[#"rj2hg(Wa-hc偩o`a"e.H Pmrd-*m߼?Óv(2W~GpZbuX&ȗ&Wb1MS4 GGl$7CozLG) Bxf%gH%{*:]r KlF2۹?~tNGt])N$s8 ӄɈIhb0G ^-07DS^ҧV{?zWj#lcIURՓ[jrc(+8'f%.66RӪ ƈJƙ*Ry(JyYQzRXFfB M]tfوoS#);x]{W[CsjmtJN"%5"%xe:w9q+D_,9_H>m$m&@fƯXK1khL{㝤z,ϭy_bk;a\)*_]QqHFoGO$%gJeoz +f>n> ]Ǣfn+/%~YhP{[ڼ?}\+{~K +aV\6o}uK"yVt{ڬ _ן.7\s:̜d8NOA={Og/ya+ *gcIx37 1)C88qe*9Iݭn6\"/6C q%>!][p62v9L!LUT]T?4p.;!"WB`9\iG_'zo4ܩ7.P#pO2 -$??&/?~EJ=<838Wy1}tBNNazyDjc kҜ,IZ&0&H4.iI`ZN'b%:L o:0O}@f2X0\k鞖NP}P Jyǟp;v-wy:n6'b >~@-y+1x~XTB+ f nyAAP3N먋Y{ÕLjY߰6TH,n.^.oG4F}@͢s9Ttdo/5C͚9EiѾaV޲ѲiGew\w[g3Jx4`v"~)X1O3&X֪>s _:9iُCGmg۫Z5*gK8Tߥ['6C_E'.ԗ =yJ}I/tlAᰀqW'QZtxXk>:gMq<=7J+\+ .OartđݫΎTwj3g>^G6:+yV"d~RvA--jF;6:/<^R=lEbAFa_P! DWS]eO̓uw5j.)EY@nsLRВVPX9}3֏FXL/H̺?Zv?fNˤt1_j'#5؊ã;-6Yx~_6 +ױ]_L; Nݠ5Rƙ-1Xp+iɷԀow2Ì= D :zq-w~kc:|}Z#wS"V9jڰbJ~ڗnkCC=Ka$pQVʅY!{3'vt5k]h ]̗k#ţlBKSGw Cӟ-YPg,ΣǁnA!RZjәe.WrWjw]v(қ;[9:gLW">U5<OzEaxW-.E]~ZJe[Q祋kSC`fLG78*3HC„F1'ґlHy;\[;YڂdOz1"M?Qd~f].ޫ]e;h@TrKXC@rU-@tF$%4> (W +'S-f*Rڃzl"cEk@pi,;cNs{EH +?6Yҵ<˺}s ZDݒS-vqgDN3sC7zscV~B(]]qsS"Bɲѥ Dں (o{_\e;( fͻ5W+W4nDO#a_&tމ42:Pqmޮ[x`pc~f= +ciu=_] !C9ݘP"j2[i̐[8꽭ǟn 2±6ʂ}q,J01rP*5nқ7~` +К|6vd6xJ;=uP]Hp;TET2,nyTED^i}SeSy|%~UWاGF6ީj␀.yLa ?.4ry[jRA+GRy3UU+D+.PB;?ǽa[0j_.}m}@Cܣ^r?fmDfk0ڀFP)rғ+nls^3Nj=mH%3y*][WWjeL'eksVd-abg#BnrβlIQ E3m V˰BWv\q=x5ߟ y^2_EȓqN*/gmtfpi!w0,Zcm |,R3X)۱-~ +a_JvZQbݩ~rk)P)搑 PLʼn|?WPo벼wr89mk"j~dq(ڲŌ(*>v| ୻}rsK$rV endstream endobj 27 0 obj <>stream +ZIQQpሙ_nbtPc]ARq2/3, 1)oKuK(lg4ՊwQG1,dV!x1'!%=A#)"Ekd~ |܄fȱz}mjL{ou$7=Z5KImڠBv{:o,J)kxMq]Iܴ[$VAN Hc >ZZ_#H8DP +lL˘9nQ[UFw]\WYM%Ӄ}wB;ͣ:Hw=A| '# گL +cokJjqi]st6+)Y2c66 & l7P3K |,-le [ȡY-R놥Zg'UPw]h6ZeM^Jk[Wzwv/k[X{F#%:-fFmմc!RƴAMV۽i+h[OuN&gAˋ_"7# Oȴѭkt&/hT~>=Ʊ?)H4lƴn2bkZ0iF˯6)bҶ0ۈwXrq-{ڑmu~@1ci(էdLî0j~y:a Xcs!_`^dy[{zW;۽5]<^'[ԌZƸ")!5:đm!JC=?G3:Wp5CK75{Kf|\R\; kU{Պiz( +^.C޲K7ڮfȝΧ鉍IiB.> ؾte(gBgp\}3&),I?TLйL }/'N7ƚzxw8`]@@yjۇu3WQ+{d[@$Q)խѳuƝ㎑[n1wL#a7KhFWMB3Ln|$ +=$5~#[ɤ:ۇh3 ʂ|:n"mQTb{APc[Z&^evW K%7Cgڦ3gQfai4g*>jg=Hf4mwLg OF][6?#w3T֕Fw4Y|MSʏ'z^7ce'c>,=mj5^@̠. :C6֌][lm+5Ǎ<<+j%9a&󒂓6-FG=;{inȏSZ ҍ_+֭U,f1(JݝJڍVwfgL7VXRyvGn>rJ]z68Zߘw?4f.Wfc< !6Y=p6댦kgN5e`᫽WifG{r~x+!J?rIT5&`3y,},VZ l?;%ZWe*2MlX[ޘhMo 4-2e=qǯAY17Ept܇O㵿_az&.;?_f~꛹J=vOh_Z:izFS- 0m-Ժ)(EmuhP-4d֍(S/69Bs&Y+G{L\|X!Ezq%79N,U=#/RhԸ=H) ɺNj:Uv\v[xA((э+|9vRj9;1K~QjOCZ6mŕo +Eg>3jv.3TPz^@MG8*xo5An=6YoJHhRblsO*Ҿ5+Qa{WKp(jӽ+q=S pu|_R@Fd?sNng^F#51L 8JM;* >,}{eEV/xv.B$nWHvX|i.i3m.l ߾ +Us0:lMz̼`MhٿyGg1s.eҵjjIҳ.ZfuFo%}6ٻΎGc_J8/hR Qкyo,Q 4~SfXdKPrX>wQYO踳]4 5pjP'QB/v VB` 谲7QM7|H S8|v} H{|dJk#'7ccn"`V{MrT$}hOyŒrKQdv[.v8\?SSQ'6 zU%!?3#Pڔj1p U knv;Ua(޳dܩy6Eđz_x4W5bKXɶS!sjۙ"Zj]88#Svo + +1װ >_{;|WY8]w*vu\6׉mەb竑B!CMs Sw[; 2_Ge;qr*fܹWÑ%^lPV ;.R6Kuw9g XNh4⣧)eڶ? /Vx:V0j%"N/ۘ[҃v;8f}(^Z=bF{(r3)]0{M*AE .ۘ`@taIQ6l(NtwFvX]wՠ?epa^J庌<%rmdgFQo;5As,tj*>0\~ulř" emoafQ^42p)t]4BfN>χLV}frw8q@Nam/,gL:bND՚ѪjP?Ѓ֝2a0ZR{u23$o헗Lކuk잖C;/{;G!}N_̅ ^[2fwo + mzy%C>O탵R;oo(GZgtmtGm+q&׼W{&̂&J]쯟`sQ*ahS>Rõ۶/s9n\Ju{ǥ.l)op%Q;X1APNYZ)K'L;w-NVΡ2} !Z:6(MW?mps3 F:^>~#g32NI 4З:.= L?fet `'% R{77?$]Ļu,ҳk3}eHm=gM w)ׯJ4"g{Հt ]>1<g;Tez7ukPY^'H&EAgG%E&ҲI@K"WdTAwn60a$pN(o_ +[{?p+'y&jlȵOPWB78J:3wqY))'@:(n:vOSJӋi fz՘"ckvlmR:Tn0ހpvۿҺB܄U%)Nzm3pǒ_[(t?H6!c:s1q Z%~َŋ=Vy­nÚI%|50 /;,`:۰0!UV'%œk<.җ򭌲?ħE0`nVbu;[ r@>8OVJ{+g$6A.SI< Mv|?:v%J[j5bud4Џf>܊x[m-yb(9HlW}w'3 _:Y?|ogƁۛGdMU{Pŗ;g[OinRy[${UMXvRyjہ-18 +T~oMRc +'rxڊ5+@ztGzt<"J3T7+Y0AEV%A}I,]UJ%ӹJd1x]AqbU_@~qF m]NZ08AT==e(Y k԰KJ'3¬dq}$_[Q|DmpW9Mw@RʲrJ0)T:lA8zmUa7;ɋfF;!%{%2?_Jh@P'L%t02HDsBc&KtiĊDžvvlYܪ\;sY 6m8֜[itqijV"ߖ*qr)L=7*-ﱥ|fR1o}ͪ1vj[3 FNMc7c<}?PsGUJ!XFxx]\0u :s.VIX6]#L\1. mҊy_M?{ǰ7Yl'$-D%/ŵ*Egw +zhi7. vݴCO +i+9(ǫŸ@R0&^UކU\ +W\:>="(vG8aD.8$G4|Ġw}Z u?m45TZt>Iv' S:xk,M391ZHr%nE.'\&OW7K)/b"{‰ucuqDkY#n}E0TGNWK+?2gU~؎K-eZdXh*#(TCԷCd.c˿ PޱG>nbOIFYӕ@SC(w[zRmt,cvrikҋg[=8 +*K=?5u?U8VyWDݫT%!*Y%k*/?H`gۊwF$4'{&;Q :`LKt< +'`_Eg; +4S(,/9A-PIT.gWIU^>M%ܖ᯲'Md&$N.ik@υHli|/J{yp$Ro82Q;n縫kpK*t:}Lt|oXub HIƫZ^cպ/IavVw=M3c]mGoZ)ހ +s_8:;ゑyJltW9cQp#Y/կr'pX5 fU:kJ# osKPﴵ,Xg}8ҁeLcEĞEEYנ#e"NϚM{c}i"#:UnӋ>3@\Q5ʵ}g͏pcO}-t?`O_Ml vR%JޚOeUnjݼơA\ +NNM_'QDj~Ns}1& +{/HRYj*v &S|t7SebV˻68hkhׅ h_S ^ԃ\7qzOihUeӄxwC8{Uʭ`:k7/Ξg<<փWWGG8gzR2}_^]k7FUgI8^,Mθ"8t"ʎ_JXybF+0&4%szF8*~U.+SSymU~/wamf+kx#s5ى4Why4^ܜwo#3\= O?8HiuZ??;(+kZh&}ݼ ψrw߉{zN&VTIU Xl,9E%䡾enDл% +-2+R(Wof:mk{f5""2ZLFբ+Ypo܋bAӬe!WЕ.êl\3ku~n:^ *Nt(aW"D%yQ=WZk="@ɖ|5n:V&!U\*AL7Ϊ&mrd =.LN({dUrQ]}7$hα 2eIc?z߅"pH.^6H}{X(t]OeSpP]FSr{tw7e -m*mkh-ncۏ*h/⒳I#غNh| CZ90K6۫6x?:,w+҃:fJv/WkdT#&zU4҇ Jܰa~]T?<9&q V fT=:1kFl-iE%!1֖*v;I6e_\ŧb@$.8 z$&EN|qwy6Z}l϶hh4WR\ ]'Ry8y*w"`A\'m;k$-8ֆWc(Zߛ뤱 -2$)Z󢚣zg|Xǣƈ{ɨ&Qc1uЧiQkFh҂WgmvgckA\|]wAVZ ;<8CuOꚗ9e˜|+n_,WUm-'̂o1JGht`=+WY3lPB4l??]Z's 5\HkMTQ'*޸WRw\u&>!U'j:^0&f4CRwhMWY ទk}n ڑQ;u歋3pӉ]ֆO]Xw'[ӛrL#=z5a><d6Jr:Udv;igE^x A\ch&gWA[K%v,oMg -tM.KOڷ;[oJwRno[mYlvY.̜oB9 1o&;trTt[e7N`#M3lripqTF7Gn~SGMMDhd5>md^ '@9j6n/m[?4.-W[^ʏgw N,7j?YJ{l`vk'쯢jMW*[gfܵa+W]F;|{xC>|*;ARNmbv֖Ǯ!K` ,IUSm[,5I,Sڴ9dl0wJj*ʧ'N9%Xo T\?;o~u4E^rUpҒ{JNl75yfut19#Z6LX ؼfbU/mķYv)؃TעxY V9Ӧ_H`Si#X嚺C)s܃]3wwtכȥJŸQn똛gQʈĘFwLb}n +nmIn*y>sТ=uwcKnܓڢe< O'܏W֬mT1{mDEmH5lm"5l\ < bz<n^lceԓn߂}&-sGrEXuvqum4~-sˋ5Wrl S픱}YtW4YC|{\dK'֤հ_0{+ݽTl) X{;rҭ>-iߺ!^=~ b:ך w{Y=$)cEZ*l[%d댦| +Gڡ+ø†-":B`VrFX(c6K`Λ=PSpÿhЮ-YD1?7z#7 +vL)Dרx\+6Wԙ,<9c3ɶ'VEW?-3xGWp8b7n7Xo+m O_>;f(J־<6՚mnʳœ7m]Lij]Ogsjʭl}]@𥵍%[ņ +\Pl{O2tU7`~hQY/+8!X!"#y/`֖Pw_+]bL2P::;@7g[tjjJ[i>Z_{;=X[}-c tn!USHDμێYb|[POka\BI QOvA7~z`VlmQMwebmQx^ݾ5Yz᯾s +Qy`Z߾ęO(ڟ󧱳`!{ɗ&?3KU%#DAA@rI9W/-˳T&Q^.xP|? a:-2Jp~zm+D_8XDVZ\T>}/а3`T9)l)CaN&$o~BoRzطpz{HRb5]r +4Ib>_y Kvw]xdAA=r_Xd 6GaAyB4`V~d_*[!Y?j Ёs6Pg\췗#>/}7/C3:I~Zw؇m 1;kZ?y!i"o_۩t/&w{=YJoS}ѭmEoc3QmY08CB;&zym#r-)Xa6wF׺4UwxUcp)yZgH"Œxk\guT_ay +$~~6&T#v7sR\fHJ.W +rsF+}QpE[}UHd՚m= ưoIIVYv;Σ 8XHm&ҮNa +SLvRG8{,,|x[yu +KPh3X4 cd&کzL2nd+B[^glSkieV][ZbYpq0oBmI@bm@#5&66P w:iP=Ef=I9A[txſS WЫ/=<43.sβUDOt2*qCt8x6+rMCYXfR1@E~_3eq疍Wy .(kѽ1WLFs\|'_PO[i隺]MsY+ca&_m1Hշ$1SP&x +8Qu>jp 7ȿ',N'Ԇ-oɅ|^- +LƯv1_P dtA |hʓgE"^R[p'x.)\vv]̦I(571`yhHl 䓗};Q=O)uּ }vs˭g8(g!zǰ|א*Y2~̵W7چGoE~`CStk[ݒ_קXȻv.t-5lh|,:SGB~Vt]iF@qm%6_:apXgV Ppzr H|"k,pg?{);8tQsԱON ŷE6m`t9کը=J.MUEAOC&y~bVR5BypF|fuʌtFNtViϔ %nq鏧,<}s(? ԫM?< +إ&/5M}'%C,ۗm7*:AbLE^X oej2a߉arUc]j+X@GT𰏖asSe[/tr]TАT! s(R'F!_ka{/bX/O +(0Kjiְ'2=` ">K$1wEVA/I7 psU9Zp9%몳Cm2{U׍x۹4gsW.X WY֖_U[Ћڹr[Zn ]72L)8!O04`Ѭ1"kޭ7?zTح ʪc_Gra_4he92D;!^V"FΆ.iJE?PLڣɔP{j:oDݻf쑆FkI9&+ kؕ^0jw w訂>;^  R“=q+vS#novs[ӷwF]P!ILƛ}_qgZ;$WHz3y:X^#sv!-)8:! 1%ߖ9;L\N$.*5yDj' 0=-I`8Ϲs R["-Re YAJiol)yc1y?zJ>wyIN1ZoE)ջ!6 +^}bR[4qK& z Hm'/Ӡ B.21@ +rZU7(cq_hT\!3M& '-n4˩Op%Ҭ{H%ļyVMczq6?쪚16+b k9jq _LlTxAiJcu5-C=+-xX=:DA6]$I?:-HE}tlb܈G9s6^fE̬ߍ씜7w*bQMͲzBwV=Bup跒:߲W +*&o4?kvX>29VrUAk O3^tyKLĖ_,mdڸ2UuW{ZzYis|>eY_k ޸.4TFl +ZEF-pߕ9CL~%~cɻMeaE #,USu}΋r, 8Qn`6,Pc^I6'\;J՘K' ?Pis^ͺi:{qh:LPNNu1Z Sym7wf007_켚rӽ0Lb 7_j/XM'pT{ѵf;y=Y[39ߐB\*ON_.D-ن]v:s ) n7yo ߦσ s`i?.4(EkD״;Ũ3`8Ig?mG@Y]U:EqHlU<-\JR^ҖOjJD Nuy{鑸5.ү[_T,JlڸR˵mğ3!!#&sa!"֗kb uz$UmU-K'nsY}t6~`d6Q ^q1궖)ZhV"ǑfOJf4zru+^Sͪ}BKgks v HNۏ{;lJVw.2p +DνD^7JPUʜmU䵼t| C-}gFdIqVر)ýb'ݱw&~Vylk_;sFm[>$wUC)3L ꫄xh jQw/C>z!ai蚜Pu9?}8yNfߌudI h&ouϬ+zQQhi>Ho.c(($,07 2 a93dR>w2ZT$TuX+CO-Y5*6>g(Va4^-foMj\QT[fy}kZfkxJuVZnJ +$D W >Y 9 U>vzp}JI_v>Hmw,3fPkeLٳn21A P6L1oy-!|W-/+#v_Dt.lmξWnyezףrdr-V2 .5ޱ=M}_fML|7W}qC.C)N[`5G7*ټݻV8cn7<۾L̗ZVnx۰=eMnsy}Y;fmlm3gu>Ki6&o?ݍ]g%mv5.v.u F"uɛcQ[*+1Tה;fLqZyO8;l_+m_SęGլGeiBΨf* zFw7La5Cy&0{`oA5Ik* 9*Ż$OgKkl =M3SX=N+sNQBϾGӊ7 ~gbu[iӲBZ޵9h,][ļYSGZK+qp*/e6-mx9vUX4U/H>Qz7kea0.Y@v,Sby(Q7<|K@@>RW}(u̠pM?@X7ew3;E*۱2^T2^Zvw]{0FDn/GrG?ݮJb7fηﱹVLmr'H Zj`RU h=y_7ߚ;^=3я t!*gZɢєK`IPvo52ug6xbsfiF1 <_# T[cωO];}q8Y`9!qFhC}s3A:pr|Y#nAc q[jצJ4Xn9aN%7h_27eiw!S@^ +xς+A][~GA `fxC-IVXThA xsRܶamTnh}#52C䷾QBXD7R}:bկSPLj=Y!R\^F~[[1RQw,kFc&(y,6QkΒ,h<_1"Z&(NZ;ҼwhI+#\ԯu1> m3cWH3g!eɋS*Pj遶F$CϘڝ|}S ^GҠڸJǩ1xі|:y-f̰ζ^҃u<wtO=cU|ɖչ^X)}4Rwk'v&7vCz{"{۵"YxN[5|{b@X{ ;>m i RC?'ms{3LJ}gmGa-)l$5'>vưU$qSsjn}R͸نZ3j /Mض~EN{Ea^{=:N9@v6qgoEٚ,,IϭK{ +g4߈{~f zWYP|R.[{U—Vh@Ί%.Uw֦4uݎxz`{LpV_E&vN8Μ`톧캍۬\KK;KrYnEm#ۓNkWnXkz>ĉ-e:oe2.me"-\$isQFEaO)o Caۚ?Ƞ{AܟOC=@JR6fB;wGe`0xEs|Nh>_>?7j< +> Vn!30!Juegoư4պ|_V܂r\`:~{PuJ_U,"qPOʆtyw[htӽ~hܼ%tO7&@3\ndNv~0yeyx0Mj@UQ^ܽ6l%XNYJ}yy_C)cgj1%xT|ёsEEFkpt=7E20n~S)2۵\.Te5јs<VZѯj(8},(YGgPt/iOm;MթfDspR^ Fuy̘1Zw\DMra7e:\ +:]D#\6>mBT[Ɯ+&O3|e(t@Vpai!ۣf׷&lCچo&hAn\:;ҿ,:;6} fպt|Z/_$+rɻ+oc@S,wR8;\Bf0@o~ Bs{Ё>BxHO܌ [N*#OALK 7O8o^C5,դwSfg+w)ܚZ S#5QRJ5V*N+:d=D ИB u&ў߰c`M/|iwlb#_[p)Nv;lPи:2^mGlD"p0{zWل$k5;5Z5ş2d͗J)CK܏(68[])w\2矔r<>VNv9dX =junKԪg:yjD;?t8 Ӟ6\Oű +,d,;L@+xH$:2[pw"֘+&9vBuxvN.L㿣β_z+(_yx(K{CfQW9?c6*7v+\ !Rg|ʚ\Qu:jPJ'8 I֠D`7vK&0d#^!D3Iմgz\RtK('Y]7jX$#OUrv5| 5NR7һbf: TxnAr%|Ϛf29Fg!%-8M@1` Ncͯw Q#ˡPrzYˋs|ĺO`g?79:/է5P>Wx2K;ǘ#r/ҍ@Rs ԣ!&X׆LV-T%Hl :zdԸ^$t)?4ѣ4rkâL=-6d}|0crC t\n=.$Ce"x.4-e|kx%Y ~Л"y5Z @m}#]UO UzK tx@oCqwy "ۆ?a( +?:2&<*R 4F Va*Y_>ЌvI(X"!= 5)G%{S KI5 z.j>8(i}er +R.zѺ3Jjvvu{LU;GqҐ_!ȫvvkmgWamf%֌,3m.5jd3`pwUk~lyl/6)Ub +ڇ٩q [ެEg|H'O,{#Ibۮfp;)5ȫPGYuj졣1Y=jF˕dv22JOgAX]!;A7b˙9U`լ퇮'w~帯^r]#;!/B:}hYDxI)#j=~>vh܉<*ܙ.Z.-yY}>nUOK%ϟu<J/Ң]=-T< j))yw2FC B.Y)M7vIQU/H5Lc\݃˲߫!aت1XuQ@pvj1ۈ%ڞSnSF{@'/d- VA#("vԼz\GЌ_kǮY+bBaNjmȌiRڨjZe2E4]beT(4e*9|v..#Z Fbo$\I{wO9\:+8J.>7NWkf%(\&ut={mWүQR v0sd4Mz ߅XF6X{8sdXGx=ۛOM`y҈>Aᓮb{'l*w6Z4 Q~OkAO +3};!NQ^gڻj#D^m?M˫g[x)1cԄ>Wb&U;ϰz NQx`"C6?$d*[yhI0>v'YU)Q]_hҏw<4Syt ̼OFG}|\u&i@2?eСf' +s +92 #Iv*(k +CHiWIP$_K] ^b(^Q|FtR:Ҝer8Y4`ijG&оY9YOx#W\zy+MY?]Zypغ eE~/Iu؜4TV +H䩕ި;q4Uup N6zVվX@N>u]~ MnUֵX:8IDuƫFv|F+ElS樀j&ų-e-@^F&T5~8)lLx ">p:Tvq +\xC#j}>BαRWFԿ qe7Wɷ/yGPlر_CNMF¼yQ/};!׮҃^1) 6}C*ؾЛx\%>xۨyK+x=ەV{MRe^U{EЩI1L@ +pU8޷:RWAt[J;͙hYѨunpf0;]/O.bpg+*d6%,ƋeC+FIaWA5+6g A_JbJVRnN^M-:l6JDR<^aW>->LsOMI nș~*υOWY{txWY4&Sj"k)y8VrbA_]vq.ԉU >}mnMx.H=Ό㱁`!6$i++l`̦K~`o% +h{An`d)[=tf(}аd3"/b#?$6HN&O$g=PP5iD D%H$en-aekT413aƓ'LC=SڸFt6z5.^.r;l sض&HX>!+oyk~8W+^KY=dg<<HY=Xok +vN=ydb:UIP'.L[ǭ6Tq-A3/h1=[ 2Vkacv䃽;]k%#h_}3VD ++׿d 8yr40~k +XjUI@'I]G2-J3UI 'Oڞm&*Lz:s잴=8,׽3$Cx"EF3rUq🍘75Ll[-fBKs5Svd/_ZIv ^Ղ򗥒Nv=.3+ҩf̦YQ xotC6'ҳVs6ڹ6TXhcS"uӂ3;_O7RN.譣U?F|0˖e5X2<ˬ;c[[ eJc~h~Ӵ_Si(/c +Ű&W;)B^r;mG[=B j_F+JSS m)-<~tOp}*xLe%=eo?U>_=iL_ε6Uj$s3gݵI$BE J?6-Q?#tւ~CwWSvZ'1{~ +SYOڜ?awލ=4}-C-<8 'CAz[9?\C& ͷVl; QOuâ(O{!ӨEMMyمQoRu%UB6ԕ!Ym=L֫ ( n&)<9ޏuq9[/m7[\D.`,Jn X{Y) 1Nj3S9mǚ_A*q8gsteжB5ȭ_wsz{ _ckSVШA][*=Oh39sMwҔtTF9$恶&xXQ,yTJSH-/5DR)gknW`)s eǜU8c˘B +s2N1}<.q贕RSi?pxaVyrak"Ϧ#PY<"kְ[tE׊)Y{:9j˝ZݚL"iֆiUowI{ ~Ab^xѣ4__C=zv?Hc w3or >h~/͜5X^h|. }8>qM܂]>[N6[kAB, +fkF_; \3 e74NɓU~޾pKmڌtC31څ{6hI}vڕV&{7& EL.3upR:rnnL7,ղoC*R阴J^a"5Ym{SRrڑebχW_-B8.h}NZp +9gls31J#|n@Qs.f^Q׃]ຽd`=!b2ڇTcNuH0=rsLQ6muo]].b|%`r|&6+5{gL71x-uWzWS +Xat9k Tr%8*v54?Т3tE!{"mUIH{#cU-I.|rq`x%x#}@,!AM |\_Lb;cd] Oaz*YN[xo}mwwMoRM @norn*LoW$~aT3[Mu [rX%2 'e'>wlw"S%VCC<.jh~ednuL`֟ : OYhpσV:wa&{(>;/_F6,zm?#N u^/`UQDץmOA="nU-O{.IG ɬٸîܶDyyL4 AR,;׾TY쏾_-`Y TVM)a\%;y#|Py5(4sT6P +=6J +{'hܭ6g5e.j +v8n5P hr,ױ}ITJvɎaIG*tW:IQ:lRe WxDKyZ Qm8o)M9QecnZʄ]h|:1Ka]jn5t xℑ>.y,:e6 vm +sg1qO,!A a甅4[DpVn54,oK9XkeY+PZGNd7E5sI< Z%oǟ`>b=EN~j]?nR;^3&qGe7_x2+(~΃T="E - =~Bis{zOTkZG&EΎ7G]g<9H`CC)y␊,&:{ٜn0>\+-x p*CJϯ ~>r310Ge j|"@~CdTcq E +[sv^ +D-dR³~&6Rq/ᓝZ ‡ϛZg"C9YCMS$(oˈZy.':0[$iN/+W CA)o.!l(E:CėQy$8Cj)\l@I}O | a~Z QZ% p)8[fJC{74l<J ~, i=a;z:õ} +ߺ OU-k$\}TlTfojdk y4W% +\jll?{ߗ8RidYd~7(u8r}Lltjy U 8%m2 WbP*8텈?Br$[i9Oyd&O4~26Z vemRAeMb٪ﻖ6 pS׶ 66NREYl2sr^ZOÊKb[փ/ :ҫͫ䢏LTut7{k=ɧT;, g.QlK>-GF3ԽKU0dɍ8CX$j}g;y*h_N*RAr>uH 娤o>`=F$ 9sHn+IPm,vq1(#bn/hMz#-VA񿅇ܤC_e~ |qk ̈́/RݙC/g6m[x[( + 86!*? GxRgp oƄvX(eHX[Mu܃lo_' 6p##߰pqRvB "2+ C$!ub'8=1k;vC`}lgv}t& l2ڞ;W8{SuIם Xn3`_ynC0$tǣ=+miiT3k+7ks4M)E|$I'=(*5WfKAWK֓gcB{Sۓ6R c{⳱ږٿDHq4sy>NMOF"BO]`e3pX㍤A tUZfyJ Ix; ߩYgrbۡ:iuBueTg9VĨJ ġfр'-lwRf|a_ikܕӣ{ȷTo>y~'CuGl/uy$w"joк@W<^t׻bq.Lm2o뜤K{SՀFԄV {cJUЉU"~ofM0vj&񞀰JP_$2D^%^/ h':v\8QuUR0z u],N-׳S^l%kdz@)+WE8yb G#!=G#rou g5V;_hu +)› ei"1;<01b'BjoE ȴ8W(wqCˮU(-jk|DKF>͆l茹2?[Rr'4bC*Kc^㻫腲* W5RnLdF-(ɕ;[q9y`~SgQڝ=$nK5lC)m4O#N묜tW€]z֭+(psXm4plΘGQ~v^S¶猻>f ]D{zWFlbDV רnR)Wj7F!ttd ^--,*ߪ򰵠$> +bW+'NNG OGCDJKwU?F8w;_F'wyݓFwV +z, (kMǏ9jUf +1F40iekzF pƦ޶Kj4*tD J~$3eUe8T5m!-aq =Xr۱I9hOD띁t^7NMFozo!c=2ϠQR6βyNx3{C.%ucon- #CPx]>/eǿx`zX +-fv<?S5l^;/`<CCzjZ95׮-oK0 *=r*Uϡεh.tjmp(kf Ua[:@wa8'-E q65Zj2N[KtmIoo__m =WzU.`}q2d:ʲ!t͙?seXJRGZL*.UR,rTҞaD4<'TZs4r\Ak1jcFJ؇:ވ7>mef~7 )>X_ݕ~wL`Kj$dD 1U[W +sKYQbo⮂YRh goo6!~@iNk HFՆF5d5]r:Rz'м(/_POD{`m>9Wyqb]9fGtɞ^/-}6Jaw265m*щzVh7.S{-?L%^R'msvld)G .Λ%׉\OQ⦁DlAp 5*f:33 dn`/kK4j0niG[zBJsgOrԄm)0.fZt7[皦,qwdfR6'"qїjN`;j郿R{b4{T{c{b=ƒqT9' 9߯NU 07ÿ@R/˩N_D=O޼_\I"TL@ia/꾵|Sbp%RIYFK_1 dl<ƨU3|P:ڜ:aXm8z'߽5^3{ Av[L$%+]MЭwx]̊ MːкN%gHfveWnhp#g>*5rzιw{p۲Ko/1?pviG#32s::r-^d=CwPZ-jmd ۿwwmiA_3c q +E:o"r6XCvc8EJVYO[F`~Skvz\^NV+aΘ +b_٫6w+od;O#XK4zœQZȦ'$khIqB[ GuqR?ś]dxP$:CJns;0wBN2(ۿP8ƗY>mtZվI fxQrJю8TP>޲NdCqg{s.ʚ+UB}} ኘwk4.sSmDT W +HAU 㑾6T{4Կ*`!wŰ2H4 {{gBhgM}F7\g]y?.Xni|9;"/΍x&?_6ؑu#@+ (6PXL7Sw6>jznߓ˸HNMfnsT8!A.h,RN6 +%ġgI;@9-Q(ǻ(12JF(S{?hwFn O&CR>57Cf~\j 3y+XrGa͎<4Y}Sr+ۼ|IDZ]Y@P"SЏTlO{/l ]oW`Iry_A,\?^ +p{1OW!t_^B}ϖ;!8&<ti#sg>מy*E2[xo SѺVkfH1[V<<;cf]4P@`5YykEp`5}w{*[Z"jY7zxU(EqeAPj..3uAQyvKF) x_gh-V0"8 R%:I2&o]JGu:ގڇ|rtJ~uL2@+pHB^KP y!i3 U-ϖAg7\⃬΅{PJi ct辒ïqӃfe~ןsY{5b—]3ApQ̃ +3Eۉ1 dIVߊS&Ҋ5tߊ|Z\B+;  %%̓Wb祁`vAfʺEʳPh$nqoRyQүQyC,F fyf''e"]$Src߫ o)PnTfu>ֵOۅ޻NU[53c'qיƎ;{zN࿃qc; @ rg>W.O|cjjj4c*\< 4n_4eٴᓴ9t8Vܴx5R.z\ Yy +[D%QCOtz%&ɜ&_`>mZ3ڎu\.vN6ǃνޔKqFvE2n :\63d 8 1xc(.}/Ò(yT\e/nY|ìڦm v5|@_T܇}U9H(\-ݮ@Nc{A\da+^[_|,7"SPݡ;xR}_,J@? lUsmJh4jt^m=FCoZJrwSܧf.=u13`p~3LX%Fpm{H +hGE)#ݠ 7KԸgK9Ȟ[Em7zLQ,!)f « \7F35ǭuSOjMU΂Hz BKؑ81MRKTL/6t洵hobK=U L:rF+'՟nwp==j܋1M_$'30:6=#yvݻ y,q̞//V N Lۮr3wmᗢW9xHPHƧg̜Γ8meV}ynAZ;4lQ!". _OE#x1hd|x!$l}؛ 8s$ +2{b dJ+o"N4`*ƿs%4g;ƚ 5׾e$`PNyJ[,+5$@2\KJtڬOh9F 4]fmi('~dɵ_'K~k;A")餒4r'nJ}Ɣ ES !=WI`$ϖp0gݲn+!Su&run VH`q= #Ɨ{&I{j +5ơgV +!l#KWo]?&Nܯ"n,F Qy5ٔ4mL$AO?|'ŇEsĂKzV8WB\7g=r#BZts>~?QjGrs&vy +N W2TWqt^Y*Q?FQ9'1z-[ꜽRUmQzu޳|<ٙ~͸WWp6kٕG[~"4QYLffUfуT@ˀj7\g ?fE>24mF*z1woj^,f%9NAҤ/d5L4~$K] c])ñMcҷ"QkY:bR$ ҍHyL{ʳTMH\}hKꒉҪyW=r{v`Oѩ 9;? ]x3Z t9uU>yhayy]Vp +&]wW GQƍѾ*j +"Mg}mTӶfK@hx\x+O1K =aJe +kYnFk]Z.Dl5-4 +/|E$)7R)K/= +mW~uƿ +tW1*xGm}prwZC=T3{oJBW'K]CKfX?o9ӓ!I]xa 9Ӟ}-2gi-x.f nTwboT>ŧrUhdخж>E/Zsc-t[V#m e.'8,^b;ymhcEe9Ԑ;o<>8iêpN 36* 4K,/ +/]~i+5Q8h/Տc^N>JqMW,>K bnq2nK7.@@~mKH97;9A_DTX%'嵻r5c6h?ŠT] ./g& +[,id~ZK}}%I!XoڽK}y޾_xr*mRN455; %=__WJ8PKAAiwZmT9ML_jLU{̩}T ATE_fJwQ9W{}kbSu6NVF@CJgkaL/rh ݜDxKRF3z7<\zj`Q V{f{rZ7IֳfW0zD,U~ب6L ea<]Kj[u-Xt1w1++>ep,bWbBW +2A|m`=GڑDj{'V$Hd3+>[? V7Q, E͝.z~H4SH2(6lxTfiΊve)ʿ:rpa}2$H1E=7eGiD?.& l/um'#Jo(cm<~ +:hg8V^j_c raDe{5MaXKCH%}\帒>wyK qb"%/l̋Dn/%uRh9oxCIcq./h\ܾ|2!X`XAҍUN)H>EP>YHȼZ0PS cJM%%"pL7$C/C=Q >,VK`G=So +yiCa[s;o-Fr}Hb_-^Z<9wt +\*Tͧq!"mt|P%&{NmKlhP{ރ:i0;٬jM\u|+or`zk2o&nOz DڳP:F@j.22gLqQ {//3Yi˔ܜ@WK;zwEVJ=] u"wv4քivQ,e)śh:T?fw,ڰj,Yf[aDRlרsB^iG]OYP!JK*|wB45 ҋ\IrWzNLWC&U~\uY ~gmȾ>q)5+-ޛ uy ˘Rj4QQ VeRS!>xz;dP +3Ig:SԜ셓A`粶Kmc1買TyۻEQOd 7:K3٭j2V+?n  Y4dR&v1X~ty?pU=ا2WIDWuc&SIFzFJ&4Z%*7L͔L +Ѭ`ɛRL(e]ɐ+~e~Z;dUzi#ux(r1:ܔnm/kk- 3ne3:wM|!2許{Z6鯼n dkݡ/VPñ}]XZ:QNx6Ӳ.D*zyV#YcTy`2\IK,DEt+LzK>GnקBaxmւ7^4ѥHBtpx҃ l~)1GRjHPX4(g5pXW/@E3x 3\q*9qE^_{~;7ZIJaMJ 5ҭޅ/`ru,>FۓLn?`Yǩ%caC*;|݇zf/N7~g-ɘ7W1wM;+P(<%P3Z׎ӴvST iZqm}JUq.uƳ^”ndiI] gІ@ bO_aN`nnysx@kGZ;[9כhKn [0ǨڶlW&mb^4p{1+S89JW{ +$(* \)SdTkGiX߽ +C.GIUsV 7g,ū'>hTmT)ctQeY^{V[Uۥ'%pBD6R*g׌j4ƞ:՘>C* xWtFN& UP F.B+qf\qVV\/(Ӯ aLh5U +./EW?G3^6GmU՚[zn8c6vao頾U5Ux0ݴ~e#|ˇX0T%k]4?~&ݟ7SD-8w_υ=nc#[}Oh*xc]Z o*jZV"NNV8:Oysiq}۵R|=cLwnaD˜nB~e n#/&FhXRV;ND [?V+_c]6&PY.kT|CEnsVt)bǴpа?2(s*>rk鰜tEׇb/!F7l&=X]-[!:_NR! U'{ah4T`r+mE氠-*c +Kנ"zhojep4A9܆>Y! ƲCC$?'AH@s; ,#dVwnR8-@iݵ7dس&iZʽ<^!G=f)~yFv +=0bn>vJS2vC<63cJe Zu8i7\5tf%}{U`uVv<|kY+dKN|c9KX>'rQ!*`t҈;:B{>!nC{ʫQhڕyK%3׸t`kn(x#*Z2'4}ʊ \>t歶"v~~7C1%{#~`hxv?ބڋ> ?9+ڣ~ekR_5 U9-#'>͕ځyZEZa"\ ƽ$8KFҦ2ܜ1 G!=m(W;uVE;!Ꭴ<0;^WDQcu ? gw jlOMQ=Wf^Nζ_n5#=JPgf@}lӜiŜVP_}ǿRS_}P>9[MnO;-VSds,yr51 Ov{/7ng1zZH{^*e`4>?RTLTfiqs}P~B:R>)RR!}gA^DO{nNT[Uo;U_ ~݆zO)uޠٶ<{;z_fJ0n9 wq62،;s<^_D;L? *V.dL{...\s+o)F:3焁?Nƛ/ܑ~`U.dq7n=)b&E w?{h^; Rx70vA _筩۶6h5f…"h|S9KZ vOp;#Ո0X;Xl`dS蘾> ^x~nN=TZ#m$S2AvhJJ[K*յf)z5Ų~'bN&Zゅd!?xRm{/\A7}ۄ-rӸAkQ6ռm>UFtW7Vk>McźH+\,9]hu6˒t[~yT7Q`B&^2\_0%K$h:?13궞R ҖtXipt/gyJrJL6}BMaAPPh~w׹H}9KIQnWLNJD1)*Rn0oF}̳pM[v$0lLG \􊜲&rEzȦT)>df(z΅7PݜWE`fzWk]fuxS8?n~,ΧZ(wxn|'l~zu_@Vt!\^^_xl\߸+2TTAJ +砅ju9lU1G8Fm]}-ݓ.SAbBgZY>ϵM{eb}wdzDWVϕi\ FŖ6ھ&?@[ՆbJZt8S~{RNFR.1FF\p[N"C;F~.[feo~}v wvE$.֤xSAu;DnG}[ˉэhG|X|w*ԷQ+ <_E9a&oCe0f /5/ͩJOZ CvJ+CB,$`] v{eAu5YM)K>4Ui^nF[?<>Zx^Unb3c=m94;xʀsw[Bd֨`݀}SWM̒HN=8^oJF_UʨhkϷZWOvu:4D{~2*;pӾoyQxouyoE^BEJzR vP3?+(~^wyԣɴ +!9'`lcQKy+OGw%){_LjV@UR?*ɰ%Mtlhyue+]}T#)񘳯PnaP^&馍CS|Լ ~`2vƨR:LÄEFfScq7gl_w ե]8 ̲#Kڠ:%JYv(.=S9eVezXWPT&YAϺ[wy8TMCݡ`f,.bw\b[ -S;ګ5$E;#%QʺJlv;3V+ҁ6q_:Ӝ2ܳh +5!9FzovQE(BD@Sh,4%ԕMBmVVdSOYb̆q h';*ru'rKI>s;eB^jW4=G4g0{"oi:-阶}UȨE;FL5&a^ +ZG+@TA7_lA-

    t"xŊqU>Ϊ:cޕ,mX{n|FվMkf(ҫc z3 {=Ǒi>a՜q.2Ry|X\ʎT/w+B$LV=7E@l#ipY0϶85W8YN]͸b3oz@P%Q}UhrU[ڇ\֓T0`-ٔ?K_9?`IviJȄg/Wf}\_OU6Pi97_>JfQܖr˭޼ )|Qf 9YKB>`h'.'*> +u;ul?'bEqrBF2ׁFwY{iޮeR9w\5\;U @\?/R (> :VOP<[v7?~u9Cy.`CFT|P0ףgzYG7<}y n|ܼ+Pz>; hc0!aٹX +* >otdW0ALskz5#yqy5if*n\棶(oz\Tkwi׫ ,EDMF + (?i1ɤ, (4z.ccfǟڪ1|y qLJ +g04}hiMm&?bߕ}v'p[r}Ԫ]E{ xt{ 4#V-e!UP#F?=?.OKs$ni)v}]T#taӣS/)Rt:l#E63Y?/7Ҷq[l +5#_GIJ[wkn$!i7bTJ\ܔ;47R7'DneJ}3BHhExiNEaFm ϓ9n=}e>ύ`0˩0"H,[ޮDf!!{\4Œ)I@؉}^Ovo-,|[Y_-S˾gIXpp-{iW9BԞw9<ٶeR/s/judeѻ09ic"mO.mNMC%5ħce$<"i;Xɾmr}"R>9mG,u_59 \5h "{]mn8kے2DK`uKlU@pƈ']Ro1)ׁg+U$qw@4lZ$qƍiD=əd 7 %od&;Wfj[4]nu /iąB4˫ON/"ChR hK~UP򼞡 `{X'R( +z}F59y!$('~.W-9Ȫ^\]N~{cbEW.{uXVkk4.ǭ>c$y''R=I͟5 1*ԣ7My;:)$릌kƳX ¦Ӛo?My=nR=J'RˬjR-U98S nɻ: xuB{U'36?$2Z|tb4R>G$h[#vR ZD./LYNyb7sيH!%ފs>b)+dnwb5;Igp-ƝsOL%T-4s曢lħD pddk\NCyX]r/~xBnA?{Cfg O:U:M;,h܀cO([o_O uUUf8(Vy1>"uY .Tbc1re;Gj!jJ$xR -[[핻k1 V j;z2Y 0}fس\$?-o`PZ*RG5Ie$3=eꃮ +xR#W;H_uGSa9TpRuˇc3JknU(-%Hijr<3k6aޗܬY~y^7*:6E/;hG}BNBu~08i# Xc+X^gs].,5M6@d젂^\azSrsG*ܷk].I8G-RToGj%u۔ 92m im4H XUYJU| bVk\<:Z qaAHP' Gb=2N;Y.ߍBB:/l{%}hQˠ˪6_lYA}=;Q+eA2GziÆ4ɕ6]u-R_?NU=c)#mT\oBJ#M+L  q8KwEϴ!7YuA.YA=k""zj\R91Ң HYHA|[.*[|l3[۳Y;*|b*v0:s+`CH ǻ5=M!M\2ElܳY:8d`_*>warҾ @UaT?V^X7aŒLwI361(u|DǬ5{ trZE%g68d6s*[)@[UEz{jM+imBT[/߁O˝rIZ~bZ{,meŽ@o]^G(Bױiܝ;jw;s5f'lׅ̿=DȯzwIwxV)WN;fmq6)fppڙLuU8 +Ӌi^P;亶(}ԁe\&J01v5$f߯nf0:qtJw+ Mק3(;}JOD-^nyG@nOZm?:hkt(ׅ+րP$2d*ƥ{}j6yRݻ2T(W>D) qa]i79'EL(P((SI~uL%Rg&)hدߐs9slIw[8}y˗[>6? T(qt^YjQ?P%EŜ}nW#]Ȧ? m~yXiP,I/Y4Q=:s 8uc)}4ޘ%KEp#6a ֒,RHm:ӄ<7|zhiQԧ~מq9.3zt8\]ffܞT_?BjeȽKtzQ-BC6>YVĀr#NP(lqx&#,}04<~8欷Gzk`:s{Oݵ9"/cڧ tӛDʄ;ߢQtP4抜6M(^nuq$ԓɷ@qˑǏ尠 uwG( +Z +ccE$`zu:1^Wƺ>d|k .%U}JsS#WoUqʕ_km(3MFM땝Sך]J#ks9( n[{i5dy!]Ep X_5-oHq_.tqO56(70cqq.hu5}IB+ +|e^p+s_g~psYR_~6vkYfkxN +L(.u%1H\fI~أA%v +tr.[2YA458?پv^O9֯tTn"R\\1\KA(7?HʨdeK*k*t\ ._.ihRk+Y%! Iɓ{1)pSoL8=-֎ֆekF˾tj?@ 7Gj{?3,/R)cρ%i7CO+ S/1u|Qvn8FֵwP{~ +rk?( =z[qMΖm1)ah<^GDwvᾩ9 O4Z"pX5 }MhlF[X?& _$ѰCEzaxS2N i*t`91~/nx0v۞47ElR˘tQvg9r/ssH2!B$4ؤYt.([sv苣2\ޟj)h"j7 WP6RN2,DrLw6o"}z_WWExN kCw|IJWJK(^I$*? C.4\@dpɥޱƸ0QZ= vW9\b̨10gpX@ D@Q +{ю4zA!AWkaָJ:mZ*ElQ E ESWu*g0}`tՒǘϝ[gD>cG qn}·z0*]ܼ]k'>#\w}\X=@/:{sZe{eݡku/՘P˾$`Od CP77c290ߵX{,ߪgUV3iJ7 ?%ڣF/eeܵJ-vܻYa-ǡy݆O]}E%'N Zm.7⊗-M5q:P[lJ sڝqh@e6+{NL(qL@8",{ޗAq VdeǎL_|Y2 Tm9D59ӹ^"CAc6>RWØ|l pPGϯD ޘkF횃~B\x̼W<Bs["BNd:o1%"ÏUS[LˡA?TE1?&s`<' @`pYv +/(3T]q|^)(1& oz7tSFh.]0ZU2;߅ u~RS>`Q‘zDWo :2"$nϛдe-Hد) + _P*~WEH#ŕ3 +q߉%XapMGN#- ԓ7PP--FdmFrЃv[]XSZ.(>Ӟ|IXo@bɍ#S[klUn߿C?vjM!yh7YWeV'jÝ|e9.ұ#<,n`#yh6\h-7\IkzQ7xqk߲0`*@Q'H|6WU5l!gReoELVi\֤6de黐K3Cԕ~x^Cxh+2ZwHukؒ80Ǽ_[Ź9K Ƽᙰ3u9ᵓ~}<梫o' ?բR̗xWXkؽQg" ]C8[KY5mƚX;ޣc (}DEl3Jn#H`qc{ dV|˜%>f} .<ÚWLrSBmZ]>BԑJE!-u:XAIVkz\~f34h.GTOF +G1=B%kh).1HE)eޙZY(a¬nYyr5]|^>-icr݇u.^=[>ZyN æۋn5ƵS +f5Tg̶#Un1i*P@]iem Eȇ0-p㝵d?c6m0Ad}GA:eלvy,`?`IlT#$;gr gʲ}S_gї_ţ#܋ ip# ڨL8HJQmE5L Jlm7zO-Ǭ} #`SmjR}iҾzj^4S4^jZ=-}Z!UmnT3l.5'*SӲgu>ZNw33 ը8,=DT?`$[OE#\J>oQ n˸{r߰ux5F5骻NƄhF.͟*/ /׊l3 hoDZrbe!ۍT/h7\?#J>iv*"roLw9cttXPSB54V\lmtoi466D'F6kjTt̠}E;?i;Z:E5ߖUjr)iY&UMS* +M9'px^Iݴ.nBiy7c sg;sA5k{\}DeWo$askw]o ez.+hjRaZaLH^IE~1Z5ڀJ[{Grd?Z"T[;qU36&2/Zw&N9,GfeIkv5' +7[?k}YNs^G4YmA{bꃸ^"wVI,j3(Ee>Y$tP9Wj +1nID.&9ueg0/|9y[?VB0^R_ܺݑ +ZdW]Kkz\p<@C(g ;5 A!'6Îuygdc%Zev)ݐZ@R$/WtYd1N$Uwٷ!Eݟ:_v0~r|WMhOcz0q=XnP{Cd*tT\E}\j#et{Ks5ATuX3cycsbY?qbI>7^.7Z^+!@Rhv 1!7 @6fPsсB3jUi>hjg%tWu5z"tXkkG2/-L]?}ʌ +U>;-?3,8!e`p Yl;cƥ}hxɶ7/'.&JT-Me˒BY԰l%ۓ^ۅ*{⏮RU (-]#xkԙi X.vCSCf$̮xXک0xͣP%URKN/ki>~Mh#dD8}'P$’aG껹ʠy|&:SZ)^D Br.o|`@PHg>G}8j eZ[p췓(2Ԝ`+Z96onF;85;kcjL?w +EqW®bKI<LJ,=sN\Ց-a2=YLL6[^ϝAبqǠPeė*^#X+.99dۂݧY?A!t?/ޘbu멗kGBPT]9elD#c9 +o$$~ƃƻ +yH֖PXL=c7vqӿw&-qvN[p>eYw٘F{Up}ڰ>mK!+C/pMBowHJ +s,bcl*Iך`}Ӷ[NOrnr8Z/j)Dl0M?"ѝ~:{Ȑҡ=-Ef]SIn5{m[g 4𓁹ӱNġc+kH (Ol]EI7K,hVa~Oiyb:|mD_wfCh!4TlO']?OަWĐ)%>'.1EST4y[CtJ&:[LeT&i)j5>b tjY[Z]^z0k~w~ck,m62|mTX~u֫4HW4|2CuYuKxakJyv=\Ts`9E̹QGպRZq ҡMjl˽~?S;48eOJd4n!BD5͜,/TyNGiJܚ7NCC wA*ej[ͱSEϿ*p-{9zc(jѾi%3TJW+*!۬[HJ@Ak;beSuizjP LH(7^GF6/-%AiU&/kvYL쏛qoǓgq0kl?U]*oTïrëm~@ȹ-'e.?(n>_lΚ,AVxcmC%kAR5Uq8g)fDg#EkK: YdĹ53:Ap^Eat66;mvӵu$\hN9kax2@y^Tq}hmk"n=1YRz$g\kVk9-Aن@ynJ>,(*Lcά?w*.۷Q.zmճz#֕޸|kK2.@h1sK+ߢr'$Cefc&,2GR%Nz.#Q]zF8p{JyQ%IK%=DوjS]M= 0l]- 7?Q5|utG>q=L^dDUpc# z:,eЩ*@1k7&;E'vd;N=6%KmL {F,vx#m@ފ{A pS4f~j®UWCiխ 0I}*^:hkjAKb*r LoP|}mf Ct7Vu.I\̴ݘ&`V>Rq>?W PUPG񍮿Ro ﭺ3׏w5r0X???pI듒m^. "_':y .3Ny}ز¸k$!ixtb0Y^6\V.&Z_5$Ye !;+ό l~Sz6B ګMcz5;ګa{ +fΎިF0P[4c8-,8MTUܯz[y4h47uK؟jJ1/&HX, (aN5]ǽ̯I5.SBGu/|H ld) h"e3GwcD?2Ta"r*2;z7;X8%ux5owÅ:_ɪ$]oMsJVIR'W;/j;ٷX CIVG3} Wx ZBܖiϤv$g0_1rJZ$R`7 x@lk?L{m,' H+ @ +iy:9Zk~mWHL^ tPNA.W<=)+ E4NޘM$WCGdPzP?%"{J&^lJZŽ8gX,}tM y> k ed܎/F}19k?o:bsh)}ԟB`]+x̽[ؼǖ wpXkd9~"ajcvko܏gbs[R-I@%6Q0kݲ*FMu*Ҷ:_;h'zπF{ZB62Nrm< 6/) wp^P] )% |eebά{ж@hQ<߬p:hb.?bN &a(  endstream endobj 28 0 obj <>stream +Nĸm*TIٗlkԗd{.4>7NK"`^IDI(=Ȣo6'׬%DQ^f`mIY[32L\ܲ1pgwΪ͔()C;Ŷr<5VL2LFE.|eC,JA2ըIJv3*8U&<@?b  +/z-n@C'aO7ˌWE/W݌񃡬W6]T,h9,%b^x\cE xw".Jr|-l4YV\7{8,|zD!@w&S}mWر^/WqN֍sh4 3ktݴ %gغo5Wjtː7P5l\fS}x:V85(Od|vHW! _pcV`4F,rmn^yHC1 EB"Y4XJsyE,گ-]`7r +Aj9_\2b(@!0qʓ^.*aF))lnX6jBCpd0Dza/KD9J.< +3}%e' -Bt*\'{}۝Q G*l@!1)^K&b9|ƀybѶ % \ۆt|hخ62#%C nyM96-!Ҏzźs);ÖHf>6E6 {]Λ.w/n!{@5Vw-V lL;*~sVj{R_bUhʫOHItvyFёst_]hN<B 3KdBeVIڱd4QWX--f>ԖK8Dž {)ҫtN%BWgk]K. L<&H[@I .И:fIݽ ߰G4Ɋ + R1ܘ\6 YSV|DpR>.Zm~S|[Sf_?}S2 R+樏ǫ9V N=1X^pJTm?%-6̐{S4Xׯ`&Wj~TS`2ϮE~ơFh3a'{T>*P8㛫ݚ5>t$ +6''th; }T7hO/^{Jgls*hR *ca> T~#,σ%(P5_0\T +R4C7 shI ]pC}*yQf3{BDF=rr Jwe%ls%j|vlt:NFl![kzە~_d-aj,:Jm){[!2ϪL9θei@ehtYxw+K.ϾSt4]([M٦un35^E5N5`.uF>/ۦq_rkeWsezP.}ޣ:%+nnNwI-ګ:tY5 x}EE +EeK"u*Ԑ NvjA!@$4WC h;aązt Tfs-}ex0'C$~kEuGd4|<L_gj H K\?49 Ue.}MnalAeWFڹl~Aljg=̚/,` !7kMv l`y^G{k'0Ly:LZֆ +ە6'Z/lꙎs`qJ9lEDf*ʦ-}ljeP7ȠfD?Iٻ€M;Ŭ[AL$*( g-9o{Qz鑇x:Z=`wKbMۆyP_B 0,4 oF}6F/$IJx{e=d.gteh3Ѻ0ƿ5-$73w +Fdӟdly#GXk k%5Hl>[âDkfm?m=$bqSʞ>jCvL_K3F^? 9A4ɵk}7Y; fx7 +1Ymsehl=FC:`Sq_?ׇ"]:Owx% 3G`;dxⓨxB_p?s`4Qq8{ѯ<;X587/xeRo@V]ãn?Ja7<KCɴO(A>~^|l]֝!#TuB3?VMXxt}Ht12Ї@7{i0yN{RHcCsNIOxx+{akLCg)sH㼹"KE/٪_rٿOׇ ~BϽ+X6J*Wr;Py)nnׇ[VN$j8,9=~Ѿ^?^mЏt6rp&M$`0\'-~Ne"lC\$\G'^n, +8 j2+ 2ֻ+zp:>UQ(5}-ig=czT-͙v%7i=qV.gx" g1GRwwtu"hClޛg ˮ֭Om>WO_(^ER + ~sJajZ[iRTyOL^]s?xnQq7z‹:n,~@mj,P\p駔TL/wrWȲQ^H7{.h/rkE`-M<e]mRU4a,=fz"/bbu.zo UDHcu_rőu Vi˦ fe +X3+y7yedC<ey߳W^OO|s~j?`f[jH{wIo^J/TBG,}fѦ2g}Ϡ8W +wK*×}{y)\ĝ|*]osn+ o)CD7G\ȡZ#";@+k4ڠ-ym[7΢܆-Vƀd٦{t76'+94 kt/qz>cd铇 J?eίGm|6]2׉Z)9?%n\?sxk~+֬XGJ0=KW+&wgxپ2\V0-ErtjmAM6\Mhk$s&>;=T.6mNOWKHF>#gye5ɲ ]{"ڤ;_q5/gJylrDXgcw?yL =o`L>"G,3@B߃|y%&,ޯ}Q2gkw#3\陴xoټ/p={ףZ˛#]lAnNhBP)`p]8}(~.=D9fmm +}H=z\8T3J*> ڋ~1h ^jIjz|Yw^.qpuMԣ^Qu̓nǦ2b 6B'R>Wz77}2<)wo/XFLD>v ;#M,jJTk0(aqUh` \ ˉR<<ٛC>JJ[o<г`8mߓU>9Mj;ۓ}ؿ+/h9~'c3j Q[r9ScQGڰ*.)M*vPQiMXd +ӊl;$'e +OeBZ砺=^ݘ $.ާ`tWKv;P"+}[Hmgh?!;3d;S.({e=pu|HZyy? z|۬Z# 5Qyt, ^Ϧg̹ߓI0%/!gs73SR|ZtlA_JgEAObA[1.Ǖ0 vJOY!g={8':̘i-;bjNUXn")!6Z,ՑӍ+Lθ &#ګ_n݅-=||IV,>g#ʿmZ \ؾ¥.h.ž,?5r֒dðo;fw݊wϘiΰ;n>8t,{4n9ws~~zs5W*5TEi } +e,)40{oY7]i;A"zgNƷϏ_є",Ty4X0GG:27ˏ ?GhN$y2II ʌomRk85)':W BӃ9k%̡9+%{fid:Y^ѡ.Q2IcA 8Ԧ&}1EӵČ-Sj}Ywg6uCq_m {b>' 36ARG׽lNYތzm-oMAYQ0Tk -ǖ6]^-R)ۃZu.>noĢ%qo`cp )n*^2|yEa<1L/x`;E='k;VpEjqFg/ թ=/ÐrH~ +VZm,wjVޟAYt}Ǜ6QU~3pk)5[Z)&BoA*:KrBMϩR^,畾[3UV^"O؋#F뺅{g|qqԪN ع1֭Ur`\ғͪ D]"F)"Xp)lliZv |'K8խx甍ARO̹+h8FlzXI+Ģ`4xh>[;*ڥPuzF?5+:&N/ +NO1am +oNc%G͘=mH{ڗN*~Ox]^jxVްXXp*^yY#SMJZgtZF=6d>-rk\F8arc-婛>,njg= kgHK/ed_k=螏0نXźY ^FdNe^N0Me*Gݏn[>rCV +eF.uME]<~!FIʥڐl&ePw\[3E&-+nH6hwG.>QO&yMNhդJuS^HC+pWVTL}n ~80_O5Y}wKqW--,V~%{zGr?: +.qzmsГ:nweܫ3e4\ +r+~OuzV5'4>x\hdյ4^ͻf*4k=gF'?M!u0{`E:@_UydQ姜D`EYA +Ь J7TH[zj[Tynd*a?#?>cjaȑvܰ,Zf?*o9fr/֢NV3#Rð)m$TʜVٷگ-]734ye0|ބǜNvmt6-˥ێ{cі~(2F Q &ONKt|̝]Xoeih;eaLoO/ #nQ6r}m#9$ڭϊ}Dh㽚SGjkgޯ8Uo~S;qr*fܞfQsj^9w%:^v4kH.Q?LN\ ( b䛵FX^ShCFհKv3ӓ}wՋPoQSsi]݅uT_ЩsnESS8=cijzfћzl^~ueu栿ȵGmk}e葟SvU)u+xΟV)nԾ8&#~<銰J¹w|JCmK8aa  c]C %8r*{]N35?J4OM+z]Bhkʭbz\~X9;Yham;2#dȪ͘;J-NmO%Rݍ &o)۬5_qEe{dڞC7f C"$|U13oue>mˌ}'ݭo-cI)ִ>-`Mv +uIT{?75gz9?3`7輽m%y–ݞ]"EsA옉j;9N(;OEDB4&4{1Qqهn~C#ZsD3<{6pVf-n>P~ku/XX!|-gg8ɮC[p38$1czͼeчB EԹ5zB8Z 3'w_Z i^yfڟ",;tu2j^9~IX{뿍'X:m /3҄9*ɍj{NJߥ>?b0|<7sx{Რi}R!4ʶ$ոИUՠ[A:`.5? da3p`M ʭ5ˇ@l嗩xKsOT kiްNEا).7b +;[aa:]}ŨGPI#MEL _7AA&v]}ݖ2g* Dt;vrq],4aw:ꉍotguojqt 29<2՞׬ު2i?gln{7y1}eرΐwco^JQZrL`d"pdyIQAVhyN.^;/:]l6x/`WV7[$)&L" ~1ny)A ~M}|m-1u&b +Jg]6fh SkR{To+ ZػݵƌʰrW[cw8GԚV(G@}e/pAgV_v^E~ ?KN(}OGsJbIxH,ŽIVX Nz-\9Q~-խCJZmv[ o =P9w-t?άJ1;e>V#)[ua8hz ebϒV\D+ur7P)Qgx/blfڸ4;kp{?;coo|M2əߘqS9iro;xLVU\jjc\Ɣfoh1Ƿz0ߞl:y7ͫO2Uιf %x'1?Tͼ:(BfcwSnh,ڬ4v9bv2q>^fCCkuy-B.ZBNT2p#m$IUL+jR[xaE+AH"&+_`"S#E\/+mh/4xCkA_dVbsIɛ;*^o?;?geL(,/EnDټ<moӞipU$XV]Qk[lejڝQY8nyvRuKjTGʨ-#Hp Dk-_E46ڍ 3#s~8v@_mw7Ual{K&#@@ԓnj~V3*[L; ؽflNN-J-8Gqwq'lO|2la(oE5^~u3RoOVو {]R +6Smg+A:LnzTps._'u* B]+89=Hh|7~3 =KԃUig#-Eu=}0 8ys +cٛV.i:mQ{pR-/y[,?mOw [X'-=imqVe;Ѷ<፻־PjV=P@l+t}xoMQv KM혊ͽ7mx P^Fu2Id"5Xgלlz Sp5'WҲ;g6PqG mΒߑ1-Ӆl%{|"jgƔ=Μ"͵fi"裯km׆fYFڧcs8BlRF/Fm V;LﯳNALAֵ~3E[:2>nwj5]9lm$Xybͦ DCG;U?@_ufiu>Q{l~YJAE8u3PͺIp?UjO3TfVb{ VgqzIRU)nו]T{tFz<TEe:_r\r^BgpVpsX\17R;4Chc(Yۙ #@"MݹM].!\>Ë Z P? e kV\Yz]Ξ<^5_شe~-{c3neP/h#R[?LA@h/.e};KT o,. ϐ@Wxb!5mA\I\"d5]6͐o(*cgf"̺ZIJzCoh|+=q'ib K}e'Ȗϕo{a 3 p®k;|7xtf*ʣ[{fHIԼS#~%sC* f9wESpЍO  Z 䐔oԗӶ?[t1c +*~53%q,Gg^-|C l^#QVPKE+9V&yoONLBsJ'Zdɕ&uH.i.m+ovxlsU`ĤnXS1ݷ'u)w,]HNQ6FYzuҡ@|k@67CrhҐtўk8oeBXwq:)Q>9ʛSvѝJ4g;$~`|$X7c{>XY3N[u-{2yR/+OwI~.f4mװtG2lfh2]bm_r~>Wռ,ﲏL3dݕݕkxͽqw ?:dթco}E_e?< ͨ3teJGnZt|0bV[m+n6 b8}ԫЭxZ]Gsz;jݳ95/ 4|g&T5p}h:.#KpN ! 1W+SgI:й׭\픜q'*}wNwDW'E*BٖhgP=>rD}+ 2qBp}ڧ|ЯRgݵwlsKɡY2jS٩`ODI??۸$ݲŨ=8g\YY,q%lH!MɨЧvNjǂ"cv9̣^%^35Ůۚtb)~LϠvwONVx{`Ql_@ZVGEpYƻk#!4Wi"\Ðz$xIWDK<abyĜ9_e˲Ð&fRw@KY|A/^.SaO;uJ@x~jd3Yެsnu@!5@p ݤjI ֣fB ܵm%ҟG5Uc{Q|-|٫*OErX#2I~|KV#* Rk@Bv2 )ɪgi2Ki3֒^& XM\9Y,BO|9)_u~&|o"W +`UYPJ;E\Ly +A-Zd9r'l 0Y$|ӟq`a-eX_ 2Dc@}*A.8po~yzkG:*S&Wa'h&FQD㉂(wWPL|gثim>Rwd:MjQȉiC4=6љG1;F_1:;q='ָx`Ckyʽ#ma}GC> Y,m$%pȐ8#\uw* =`3׫qDfְ "6t$WGcn Q_×^|3Bwr' +;1'eTULJ:jlgQ1c ?.":y~H=Y 8 +ۍȹGt?^^p.ī&-cPst_TaM L%KƱ藮,~]kqg۞.#!z$||ٞ'+enaA3ogn}:E [_H^MP{`etϞTDX]ޙ +Um`r FV1QkM8r{mIdi?: GV3qa6`d^N?&}|aRhV1 O|6A*ۙ7NL'yv;u!Y; Rq,y_-C"hD)_bgڷxՏ +~|7ݮyKHɧo8?Ko.=kD ]I }&DSn$5핿A+"Ͽ;P/U: (WYq|}v% ?kkE\0Dlj49޵8],n=a+έ&nw/7p%9i'X(oY Mퟕ0яœ%b=zitҽE^UU,B, xL~=NJ(vgD?Ӽf^2ys\P4 ͟5xf,Fu5";oTŏղv"!ʃ~ǃSOѿ]'CV{g'.{/f|j\paVZ. )4(]5hB8ȧՁΡQo혬Urgm8ӺY2x궭Gz*U{ѣdARnJ +\lFcRUOp‚J*tH.eYkf &_dbeRwjiS g4i3%'RwwPS +i` 9<}bX&o3T(S#]h-9\>fjǭUYĖP-o::1i f8Lc %̓ĪoOV/dYc_2)EÙ9ciHm.2jZޜv_j:t=:#72w`{;G%Ac> ͝kRd2 ]gB_e3bfXi5ބtro&K.ie79gr4KIͻw2MVLӠvD%}jFi3]^Z~'mVe]7 뫍#`k:Bk"EGFQiua̍^jUNVqtBamw&h&tlؐ nխѡN,e!hkגn^ј G$^w,#rfZ?c7- zPgUD^ !6V=77rYpshG}-Uc !c7&fNb k oXcIg}9MˋcX2,7^q+:2ѵjSG:fhFwNViT?59`5y25];l,C}?uZFG xc-"P_gηzO + a/}=P[#Fh#S.iy ؜>] dj@Ӊf",(3?39IH6l]z*p[tSi 6~ +.`fBI-+jLQXpڶFraP[fdJ1 Q!o({K?pOR}dD9JJ1`lq5 =qLk)2TzmHέ1J $,.%dPMqa|Wn0XvΏ"7oUƙ֓r"uO& +:Ay_Xڞy0O*bcgv:,HY?6`Yޡ!V+ϗn\+(w^{:c zH63fR[ocZpny {OJt+$7 +^:SFz5%ch,}X0ن9hw$׃=k&?^ŀɥ[j/MOUbM/Tm80T%V!KNXUp82Xca aM>% >ƨ(֎"yDnƑo;;md.@5Vz}}O wK&8GvJ2FN)P?Uh:7Az C~75% J0 / tHiU/Jx1nv׬8V|z's{'(؞!ˠqԠq:Z?`M{~yѹ^gXQ` +c}_~BYF&V(sbJC#,{R+ibkm~ۙfጭbEԮ&HL?I'R,zp1@htVΩYRuǸIN=̵ٲj 0l9iӛkmz}:a)DۿdRE1 +?4ֈB:"nxJE{nَ]]Nx[v{zM @܋6MrU~_GOuQ4vD+ZǺ{[$JKW%K9軕jYMn*;[:D}ٜnOm/c M,FW +W +;۽~Wm@ u<^yp9ի{YG!94˜k~:)L7 +3^ UGQ٧7?ZWՃ',(G4t, +>(D4^)jݺ%q,U?>1>FذvN!7r ŗl;]@N^{0o)5u>BJw;6 +bqڌNwƊp10F8cpXk@LḊRE57 N>kn8~_v `:waQ`,&킎HB*|z` rݒ:3Ïk*5y,㾃qw΃{ ?XP}jFLŌ{w}Rf&AP~!*I0ۗIg7xr# JDx=0e{2&"*bku f)ɸP+{r~)VZJR*=o {2\{j##N6:ڨ+MgXknp}D}c'h),u pl=֤;|ӚyqCh~ݨLNћuf#@T)ځ7&; ECzӝd +譍g&+cM o_I@Qo6烃OvPiù{l

    s:(Lʳ]FmROb13Eyi|0oS̔zphNGJt/ҩ鑿V!sr'N4ߵMD3ZjIc +Z@rczϊZuwMV{?tԔŔM({SH+z>gp^&uEm9zMby> }=T2Qmz:t7Sjl0<Aߨ$#жc2ִK-Is"A)dYyB&S8hXܸkZR7|y 1?dKo5ު'Xt+qCQyv`ެxs۽=BJ,+]HHhC<d s?w݂WS5>0dwTj֏\~&uU˱3hNb5olP\~xI$X)f$4,t?`' 1#*H(&;Gu:{j6n- X'FidNgKh*Wjy t ,B6h}j5YzGwV!*2.S卋p_r!jUW+'F{ &2ijNMBy #k/ ^9ܱ*P8)@q/K Hb, \}N,^1)rݪζ]^XGMY,[SsMb'#:]VQ  +͋M} S~MB4~1iMfV+#[ZoOP]2}Ċɭ OӾtȖ6^Yk% ˘HX5|RndT)$o?_,шIt +S}0WvE+}:{H]9ېؖ;5RZ nJU:.a$%|:nXpzzZYiu +&n6c|Zy0=۠jeP&®%w~cj"ݵ\X%zT&yQ63y/Wo ӾSTs!Z$ߔ6*lya:gyX`kCӹ;m ͐XNm=`*&i/o%p̳\`ө180b]3[š +؋J 9UN: +}IaJ-TxA~3P߯>Vum*˧uf˰漹X蒚9 ukAG?t8s-p5nSc +7H'on:eާh?SJ;L.ْ`]xsy؏Oޙ(Y1TćsB lmVjp2;t&;a jS1f]YH 6Eo# 1F^ ?3KV-(/?,mmQ 1]}l%þs39j̣UO55SQ{=eN2U<{ᐷVKԾ!=c'_yKVow?++ >p`euhs JFz,?[ )f/uW}lv[RTv,V#}/f7 +oW[.{"noml AV;Y\ýVaznsWp^OA-f=wd0Ekwj/4Qܷͬb Z\M[% .7n-i~7tAgAd%Z`@sk?uFfG$côg]#N& 6ݨ[b߫r#kۖ,f+Ù))NA.3 FV56%.]e^sT^dӌf} 92\du~%O쏵hlߺ%p 3dZ;WjxqKs3Ԓu͗D@bKgl5Ase_aIEܣ3]e -$i{n\LuD pѼX-Ƥ;M>?dto>CH3Vdn QʸEߤG4`v+bdz{E<ͯڞstNU.,әz,imz5=HuA9 ŶFa>樯S3Nji).N(as*⿛Y`3{"!F5vӷ؍7kaTк#=GVֱQGvbsU{uƭ{Y_C0i֮AWy|#~,nri=pM[ rV~oHS +ed>gqv1nh|_ouw"e, +Ys/9V;@&jZSa,-'ul+rkW%'ZWϚ<?}{7-VᑋV!{L[4p?g:~"v{OJR\GEU]/v7IkhjyӔ>PXpVRoOi)ꞙ.=+rWYh"*0D&tW;ύΎ hb{sgI ֪?*b^8Q[kNyƺN k'Qm_*;\?2(OYIMWEyV$;.-PYsv%=nfl6Qxn%P|vxgf~{Eckm࣏ ~U7>k?>mot57%N`D,0^7uy<"m+~PB/fo~`;m0/Ժ|G'sLoD2E{ϬS-o|MwidvoݜaM6c` oϻ:S1/ rNO'+lNn3ny˪Ҵ4lJixjMsYhYLe%4~ō۩_^u+bwB̯}k_oHߵncWhNZ%m$Q+d[d'ef_v3O[L7gZ쩦q ZJڂC-X;L,r`ҷR+?HFz7M)Q=UJͮϒb*u'Tngo8iҠv%0Rw%?E6\X?wT*5:?~\TDZ/}9? o*R8rj"+Ru=fkw2x_ zL_lLv!d_"4 ᇟF钃EcA=xGex6HGZ[L4&`Չ9qܕggcRc*51ޮn=}R|K޴ -`oB4!2t=4},+[wk7@ Obuߒ*C=xnnVq2cHy% Vt "9+șoqRW7௩70Ԗ#{C/Jrdf{>V'}iU_L_x4[;NNpP7)?LɇR^&3[>3njuԢ2ikcqI#񶈅%wƝˆ7*1c-vLݭrv9:-ҘM2T6 +^OU-}k0U`Hrèٔ3q2*r_/-h4NwvSER +?dL$OSS||LXǹ8LT=ӋIǥ)6lF[ߧ ^2mО3}%^6CckeuNGst@^}]S74bktüzw hy&OJVípPz}{((}-R*+!Vzk2XRncF9Fr6)9TSAtvn֌=lxBC̚)kDaB@Nk[04Զu9Ho'-Lhqb|1ʁmv/K}2 6_:Cq{Y+GPE!V|`,Tw٥=E>\tq&LwL#.`b<"$r&> ?yku7TsATmfWp'3juKB5M4|եJ$RbA ŵ/\.!IiN:&j]|=:Sg4'ZczO*Owqr-2QmEk(ݬgTsپs[3WomS̯&)6Lӽ׮+7\&_󤽣(nWG{U[="煼dqKA_ec~81kO\1QtFI=Kq-ڪK5֑WT_=ƬYSj܏JĘ,yzQg6r){n??%{u GZv'yX诋ٜ54Kۗ--q''׷/{,.z׿]7(TqEC'f^b^o k ٽT[?/!Qmw v+]}9VwVāzDh5QÙBڤK{kI0~~,E2<3Xڻ^IB!+R04jųo0Lp/b6~Ǽ<[*5" 1쐤=) '窂4KwJ +(}j<ڛ?ψ>V`tki۪څ]jm9٤)Wq}]㋕VLq}x>tt2NTh#ۙ^Yn }@4ޚ9^ɑZ7TIږrQXKf{O~!KB.΄;Z + d*&AhJq`;ŹCUGU5g=eΦMur,,p66OGtA u:Oڧ,{z0T9ˤ :MDY&xyR7YIh(| OJ-3t5}}ϨF}!uO@^utk͚t?pyf硘KO7n{wiO=t6t+3[`mh hL Ry壞si]͉4m皋/2?nJoRuOYXWo3}E3OnΒQKcP]rCՕOE>ɏ`˷FsC`K;[9!~r0h7"K}WHO+jd>_W56[hl@TNҙtED+Aÿ] Z^ m(˃gJ7>ڃo?ުO_a3B-h[Shɠ?H}UN/ +FbZE¹aV>2|2MeD=Jv]Mrz.kߛ>(Ouq i;n>`rKhTX"!)3VojOkI̠Ͳ/TGK Q|x\hY [HX?53'ke(RiO)k\tc{nA +yPJjxMy­^L?yDL:l3,ڎ{-3#L/J1]۱zߏm[QuIT#o:'%EQit`6s C.<cWz±&_373y(ܛ4ˊ CefǨ +gKKQTAVHjr:A^U!’vɚ ?TaY +P Z Yi>`GpKkmV7 ;p材GCyVވ}DoGi M5XSZg1;MSIᏋofTfc8/)Ƹ1M[G: qƕZuK.5;gÊ$STvׯ19ݚh ;E۝t*z}>WVժl.8dwR'[q~; kV@Wʹs#X]$[~3|dɆ}ZNqk}m֘Z=2*(s1k\wΕ JX:saN>O1wL }geeP3.§ ZV‡ */ fc]\Wnlyd{84_1-Z c;>Hbn$3q'j}wTV3yigTاIU dXd98ouleT?>CJHT}3Nf-o}Ϟ )Ι:5>0$ئ|t#>kI[[ xM]pTeʫztٿjԪEWU6^,*vU =Im?ϏssE:D9?ZPgj=+|ԎAo<ʮjӲIN m3oXn +Y} SFh܍촥yymk\mt4KI\l3W\ZEPyv\ +$ݓ́;JհC`^VkuO8":] noM%S1=.p0r21NFq2wjkSfa:zܜ3;G^o抪⬙WR02ys X+^2xjSp(o\`BduЍ;. q?+J1J;CQs^ƭr{m(!ZU{_[K>ԬAs 6Һh݂GhQdg7RewD}VT'ͯ 8!i<0VYYzYR%U/wzmԍ;7 >0.Ȯ z_M.6̽f+_{r)n=Ϯ&`oꋢ?]fYSrqv&_-||yjbK/֝|굃%woKm'ɻ%|Ҫe0'a@^X4RU˷ZץܟG~$~_t~,GcC +<H%WZyeޘ=wW-pDp5}XZTV? hLP]R,ey;ʢWR#Fpq==}E򮦫 5T/2_ziRƿi\Bs!)k =].oμuP'q]z+A*A؄GM2.cpؒQ=FI]IcqjРvuw ,8嬒-[^uajC۪M/}nԊT/5m'dÕ6{Gmv]\}b@j]m##hNuȸ 0 ][?,wg(ଧ)Kz24ZB@l#g>/u欪 `ZWs_țgH/ND +X+h&A2<]n[=AD@ oG@ΰ ҿmfLTuILye8j{:!)b V2>v wsfPt`,ZFXjxʗ?)-f-&ڐi{d_0"WrUm딚?swDOr34dii|3˂I«RJrԨeܤ%)Jف6~U<2gVڜҁ_8B1BuhSA`F40Wq_}W5C)"@<$p/ݣ`lYXM @]ZϗHߗO::&g^*f0Ӹ\>f졊iw"jdֲPuz Of}RX ˫ -߶/.MϞHϊcՃj-zȈDzV Z + 8)?F :oe ƫߥ2A׉'x)V48 zJOQFd!ȍ3ߘYoW:ä`;7s<6AzMq?z- +nW&G*eU !{6 [;zl!.jz#W#gm(u9nc,XIEJڂۿŝF4ઙ[Pv6cZ9*8G%"-I0=a í>1E^)Tա7 7,T-omI-v컏y!z;|vmU UJZ`) +l}= ꠝ.*&#虏^%Fy2Y"#T˼덃iDAD㢣uS/xgE' jCsn&.+'`s>+GT}8-jb di2Ku;s74o +W.S%ѵR/\K+iRYiXz42/XTKMULq֒i% `B0j..ZIW5;O3q~i!W?9 m@g1_x{gt'R vmΞa>3ڇ_su3h=t6E+gȒF3lXs:,L:ȯ. *%Tؙqn~XQ:QMTU ! Qsb͕7 +Zm/tvp3 s)T镛e|6rT8V+kη*v0\>cl}Ŷ +={nXGcHt=E-uqס <8,`xS:C /;[,T~ssAW-lϚh9HeHh9֎m3\3|/_;I>qYoU6dy +U{Z.adM>卦YC10)[8,H_iޖ;Fp#~g庸k6*!=o`!4-~}{}FIL0mYc|_W~J0\tɃrMEO03,߼_Ղafci{;F]ֻFN6wӽ/ T8)C%8-!SފƵ,Xc}هϼ-: +d>K;N6"hބ(΃$:%Vg_yUfWtHqm$\pڽ{+ oJwԱTMǒۚ">Q]B,Er"y_+YG׽v]l:v՗}IBT +W]1kχ +sX.CJͬo"3yŏ,&o=fj>۾$M¨lj+l +~KbE {:5^h,D޺ʰm'vm~Nkr- C nUH/d|J!Jf}֪6Yƹqkd-]kgE +Pk.iYpDс Q\k38A2nMt6݂~O.Ъ"n^iݬSu8\ģ{i޺h߹6@*@nmcDx*5+7t|Vܮ~(B=#] ]ZIBG"TnGn-*w}cÊ;?IF-}vQ*UZ^7 kdHV}!樻Pjzpp*SA.{8|A.m/my eD;(<% Rj}зy "O7 PWE%;= &m>;*!v-49>+*Y`yk/38le[Bg ہaԕ_#q#gDT}ɻPHZJuV4ul*@o$1)?Y\G=Fc]j5i}Gخz|ު-Ɲk^pQP>ˤng9a򳷥 rgȯNҹL4 :z\titip.g)R| [rrY(zyKu,/#-*՜şE0s VR z8,LИqtȈ\Fe '#Qd>dYs h,6(ϕHI<,ܯ _!{m҃ʱV"o=P.ݟ;oøQ[mIC2 36[.-dNYwtn^EJ|W nRFDʧ{`$Oc60l}85NQ+vϞ| přl7p!*QV9ţq [y2Mʋh ePM ?i箳փmƽG61_7B'L76QV= w|#=D*$eG$1aye5.jb<6kmMXrpV(3WOO2 kf9K4N؏$^p)zh +LܽYdKmq'@8BSð[euWLcZMzt.hU/+|Iesy\YwäMj +>%ð7&O|''dv2CX'i8ɢm#b4wO+`~^ۄ|QSKh wUu&Yu.?%` +`8_eK!56]QC;T9bɢ *TYOQʏH4x7GaA{FǼ}js֭kI,y)p⯸p[ʁ zoƘZaB$[I"i3"#D^Sf>~IGndti>Cꮏƽ@nūe6=bz),U]t`..c2U@ᡩg-P_VKigR7U^7VSmp/n)E%W|W,AwpazGdqv'sd?^"kɵ!-p>#f&V\$-G1Lj,CZx=Zm|(N_^I?|7馿;GbNGnxOO 9`UkPh;jI,aImTnS|/ύh + D. dƫ4@V+QM_PR^g;/1: ^-|wC|X:3^1.[\_VEf75CW~V7V>حLQ?H/F0+h\ ZA4 zmTYJS#_qZ_2}W?sh~,ms 51IFŽrkԁhgd_o# |,@t ްq v~ WWͲz i(Gmn&7]B~qX&aP|푳negen<k{\zq 0wjJ0N^̒x+3, {aY,y4p,o=nU˖Bk[.аbVbuDhk{p;ރ XI}ly&GJE~cWOSӞS+KOe$ҥĭa6\KPxiu0qem!:'d{=p`~8xޛ{?h}bz*yauڹnC8+ekE%o4lRfˇ[˵ =|jWAy} + fgJ;YgSt%ဦV~ՌP.϶l46+QIgGJdHX|sa1 X=$9yNWa[l_~ eNY7h7b>*?e[մla/cMpӇoܕCEϞhf'xI%x5Δn;9lY1=;b0ѿuE`7+JXWm_zN5iZvM#,>dG!Q?p5)߼;TD>-$WMJ6a {я~0ǵh9@}c߅IO6碍Y AhO;Τ[/ p 2wX t)hlMV[kQZ<@n5qg'׽Uo0:~|' ^'[]Xj bUMw,w$ + d3qVYejܛ BtnGºz.7@<0Pn$Ÿ"\46=PO?L-Tns}[1܄vAS[ڽr@߭>ed 3v$8?#tܛNsS;;nr[S>~jkSC8}u[LBm&Y[\>n*jWP@7#c,A۶f*!gAB;޿2"ݭ,r4W}P텍gwJ4-u^$|]q9N,ׯvi/8W}3 h "k-vde HK3`>EhP/l,LIF0eșG u^=ER:6t#i3VkkzТJٝy0mMw>7 !K,jV窾b^|S6b3vŨL"oT2\qt0ޔeb zP(z6Zf{RHc>Ff:ARDQW`#/3VRpB-%mw.'hR_rEw½lE.'v^73B@AEp"YBW9=϶oa."zj* 6Og P#uq\%qpUɹOQ|^9;Go3?sÆY5gqwm.[`lzS"[_n1wUD1 +Oe_uUN\c8XCH%YTo+̕w($;IJ9rЄuuҩqOwЅ.99p8U\˘Vxdy +Žaв +b ðoIkVH^4 XٰZܻGGBײ͊읪'5]hQu&űy.m@߶ =r&=~+"8iq99jP~v=`!1S[&ƾϺ{<,gzS.Fd<PbmXG& /K\N!R?i &{]'Ѽ}weC.twҪڵFK<&;%F[ʉdѺowcLafvS#wX6R@cmk~azSCl]Ԕ^;M +J (}߀26aA^0aA'ol8piʘ8_Xj5 4W_Ƥܛ]XW]Zk^ +:K!Ż.-[jpgSH eenqע,^"߶{Id%ȵ](en3}*&'4jY4+xr'Wϔj$I.g=~喚Ű6o͹3MwЯz.9`;qQr+}zԇ܂,'q,}(1&g_ŏR+/c&9Rۗ=R3-|I9Ng~oٚ)<74Z tM3M ZZS}sbN`n Tȟwev0W|V̨T5myAZ{:tz7YC1^</*}9?zE pv9nIКM~ˏi{aKkuzH@X >aCR? JFeծپ_[2 Rbmqtڟ!sw-hBVi~ό[. N>>$+pVFtЭsv*Tû?oԋ]7VQ@ 9yJ0vH(:]D[%hC֤-f)_ } g P>z[i]V,TY\yB^Ef[LvR}jwhx1sh,NjGҠOI;I(7[0krKQ^:7ه>SXpHg+L*mE&M"$et KnOIhdǼ N82A'FbJzZUMPDiu֥WTmc/[?W~*Dbf{ld.5/vOn]]#+ _^ՁzND |u3IFտALo^X(xu-xyiI}5dO9'1٨ziw=n^cQbV5D꼓{ Z{?p_z D#h!L`NQ/of>o~~E׼tDbD 4oX&Rڃmŕ 5Ɔ菔?4‚tNG%rOÓwb4ΗuC tz,ޗã@T8L!S9C:o*ز 7-Xvi7J'*Y ]I_Zt)0un=+TɭK 售SǓz CԹOѻ[$w] iN*EvZT\/b1OWGP^ ñw'mXIt/^^CzUw[sFKf}ϙRc Tg +|}igob|Ko9Mni:Ʈ_CjP^&oJYs%HD嵦>#gv@U х4t`Y2ױiyeV*wyT}ycB·͌w;SH_h)vIa11_ƅ.lx̲k4Y8M _*o0ԟ7FᚮV?`Bxsynt4tj UAEξT.и!AJsKMɯ )~^ЯugX瓅}ٷ*4@gvv&BeY1 u0?\[7'fum=t wݤ@VynG#%ҙC[dB/Wl;pl2<>%HCnk9%bceLԣ <⤃#5/bhiA-9t +2Rvt +gm\j֑!L y'2Wś} ,A-j!Xr~q[$]7Xa>&CrGnu‡ܞΒJDTv@Zp\FV/|JZQeCpӯI7_('hbɗ}v^) rl,SI<3]liMkߓqxwY6Yʖ>j2:e>'-05˩Yx_Wҟ:rYNUGgZFǩ(ճ]VJl +6];Toz[P`a7]<;5 Su+P{/2_Crr\Ѕ؏a˙{ڋgՉW?mVQiĸDRZ)ӹ5zங#7+HώV;8F|v+ R. %wl3>Z)kvžʶ J}mدNxTދHg`%)|yM-)2:xt&DǛ(&WZK%!&_Ͷ_XZ6WYjKKuMhwdZ +~["M A^w A!=S]W#4o,nGmQIvPkX|s2[s/kր~lԒD//7ZT']s z706,{݃moK-qNaYpKFo]YItzZΨiTm<}Ӛ㭚aVy,;F + 7b;iX X8$WOAG+ú2s^A٢ڠ0bcN۾aN7x'<EkQ$mI=F/U+2Yju>?)4|g猯4wP肱Zh[&=lL`_~ZQ&-{rٟim&-j kWܽ~LA66Оo[WqbGRXG5ΏN9me\UA%գ E,>NzfLJ'W'Zoòg1d qxS˯aq':mѠ^r=vbQNXrg,tw7o{9_j`a\iz4O=toa}e]@Qz4!5HNgp=C*eL Bjf5*yv㋪p¢gNUP"aWdG_:یHTnZqMSBn5ᎊ:(Vws-q4Ay3FX-:atuq5rm-f4 *Bl( 쩹3uv>wy[MO7kf:49[քg>Gy]yj*a-?Dgm%n ޾5 ?D9JmܥgWO_`MLh ݠ:M1TځJwJ?탾=4VA cpIfVCcʳ[ŵE!iޛ~;Ǜۨ{}u'6ɽ ؙ߯hbcU2m_RTo9N ÄT{sXoE[lEQ, Yq"7ygDR>6;V_.[gRl'z3$= ]n!}wdߠ{L[BB نMq;B9Cux19B%y#:ZuԬ iźqvd H֕/+j/XQG,m`u =`4zYls*8uK9f/̟҇1h_ܐ̛)v*?a3ku$_+~'Tjјry}v}'ml=w0m}\ '8sXusP\ M= X~.D$ /Z{pvmm> 7ͅDރl#)J+m3=?' HߌQC68~Θ4_G6*bn*vp[k4(SA0x3~o%YD>3uK~أAn9>XwKFK$AFP=2Nr.Y٧^!֒,dB3fޔ{}hׂ[yf ٮ(O ;Ȉ2ߞ{NrPwE׳mϦxϖ8 +`eOù-t*{<ojCMJ2zNgݙ=` w[nAk}|6 ့^ÞWgjdd7zgH%ND ?KLo'd־4USYC A9AdxvEWh D3Ҹ$Z_M'!_w7FjWUeYWhԟS00߷jI$:Rzq+kds둹NWa_?wo˃u8۟]a؉T\VʹM43~iou*4Ͳk.C}x'R*P&wbM}o^?R;~.ҿ#W~Zș&"aܪ{s'{NYmrCRq{߸hv@8g<9 M?1W9 +/5 +3.7(I68O^Jy9 oVBt@:xnMۇ~Ya\aogw>0% rYz>?+jcVmmnXGO!7%nZ{%z`u;oIm,I^wg~ F+&5=ׁ#{5[(?cW%ݦz*ѿB +靵8Ĝ.XPط 6s5W)qza1ѺHv{I0hp?~xd}4lpӔ`c:}/0${fCݺ~= :&[ q\xg<}]kguDh7-V029 NOfج; +愂{iJK$%m&±*(!ߛfT \ /45˸;ILeu\P輟ē+H_0M"=kd7QC{`=^uh#+ٯF&!hO (/(f^^w <_r>%Xxs 9l|Sވi/njd#=ARʕyBy?όe]% >Yne,J":LFR6Du:,J^u=!A?ݸ]u+SX|giJL1p71Ƥ{NZ.[{n4/BD )ޤlBQ+2Ϸ8w?MOaq>dGEN4 /c?¢jJoC.>m{uV틔(ν]eʦs31!{)(Gv"jQkG)Ud +avkpi+eeRBpnp0Ol%\˰UYmwk3xY-"w\8vf5CߘvWndAKAKzfqLJ{5 l+/ksy:GyLy* /FOdg %(g2b'3݂ZYyW:4|BQ#77軛__àԾ-H݂^#a*< 6VC}ħɖXS +zB'a +JƜô}քp"cJ>֥pv|B=(4)Tn@4+itXX+>pV 4rg#*g:%0>웖l<– + J#~Wq-:l+֕z5`IcaM[.-;WWR`~nʹs96t,uTqntmD~7Zg/q}L]0D%LJ-LW,{evo)֯Ҥs%ie'JT^Vz=P I834i FEPp `y57I}rK( wd7sKDLpv0/%8nVe؝&1kYY.I6dFb7*6dz ȏ'6x-TyV=IIyMGW}1OQl5_ȸF8;͕9!?䇨k )gp1e04`;|F~n{ҡv;a {tޟíPaS#@o DuKb'Z`/++A懽9~&Byr+{Lڣvj^1զI6O*qǂ٫Epw&KvK;jpc)5<|I 4l2דaQquFvݖ|tͱxX>%6U@`, Z-Lâv=2OQ%(4Dۆ/!w* +^\GT;KԊBN)W A|X^:xoJz0~$]nw0Xn7í a0Şߣ*;(W,8cG?rZcG(a9yT8-/}/̅V=ږIF9LWo:SQ'z;=7zZA8\6#\}/W^R +vj=X:;S@I?7'UĸxÍWk=xjLU,6WՎd;H}{Q0k6Xզ\^F*Vxmhѭpu5l.\z\prrwi8!K^۪f5WP3nÃfh=XU.xY[|otؿ /=ZVd@a8BWhGߵnc*l47:sjG\&v0E?3`ɸ~DImXt> +uTor:_B'9vd ~uJw6=W_ӕ-cp7%JxzV &׸їCAϺ 7cMn[%V?;D|2&~ǔ-L W:TC]Xʑ[(́^m7w9T=j~ io5O,+Ub?Aϋt]FgqĦ{:>g8>e94GfP؞Gա[rdy9_5@&r}Y%d`=Rz8Kcvx;>B3V^juL|67#`,m`:Gyh0Y@dtb- T +0ѫGR%*n{7:ѿ![C`fjwYn(L;վLoyNU⸾O`*sU+*!;*$aAfU]o5VbךvJϹ3$?ia4֏`#)o._ُ'؉lUa^vJUױ=WLnja_){? b[K=fA5{iwFs>kY u:˸[G oEU#Ρ-ӵQj +GQhEa@.*mnQ!Pݵ )-8 /:mN0P\0;V9}߃I+;BI0)[дvawщ7{>%1p~VŘcC0"[{z&͈P^<:.Nů +J /-e_׬UrIr[JH~kNTGC{w^BK&"cұ۬U~g/MS[ngɞ1joVFbq^ߪj ie_6 {[Nbrο[WoKuok37AY"^ +8f?9 4t[U{ +K1);?>b8]]̩ku8RT +yf:G;I]&B^[ ?'~{F>UަZҢ,b=k$Zsw  `@Fto r$puI^~$> c~ #>OҌәFo틻Rw;;٫O6?qNS\v K[B9_+q|ݚw;⺕$W^R|[k% +e_9vzm3!wʏW?c rwmjP.vb,\/\N7.%|Ǘr* +[;(MKP;W.g4Vψ|t؟;9Y 082{O[]əT5ˬYQoZgVkdK@WpJbbʯ266n`o'$ (Y2FnհY 2Zk7{ei,gI;3ju<,3?5I6r2kJr;̭5+'Bu}gbcw*NDFc ޻cόÃoWqs՜{KO·+:wa;g_G +;I`|n⏋7Ygζ4>:֩1YS=mpC~v o ZE ⏷^r3< G0ӻ}ۗ[THo5JXsi^l&jgW:X)Mse q՗ 2 vBpEdm;.͋s +6YXo]"uѳ]z?bg{D[ >GdTrk^ ޓo8og~\ KK~uu`5ͤfL3y}I8v'9fav6^ݦjRj`AwW%nvY.%`V0b#ztƂ Wq +e$M|}S_O UN׶sOv; oW }Cc9wguS~nf^B2#(~NHCgRŨw< +H;Kv)s$h`<.,+F! -XyN> ؇-4g"w@ ut-SPs68F>ѨeU/ 2eJhOid{PA^T+[߾*TE~w~–mOUU4sFŮ%Ruz[=%hܜM/Pw^SǗ8N.G)RL=+{CS[9[|u˧'4ce1[!9~'2lgLsKvU&qjpmO-WQ+X#F~\"P[z+ioBA2 SqZ@{4\y;m5Ve׃}ݕ]"p:Dbʼ}ȏ4o5tX +ƑKܖJj +B o:4?sIvD r()wXm0sBWGmf*"7e!Պ$R +-a^EIÆ!oag  %BMa=eNTm rG>ʏ5zadxԓL9ǎ%!ܧu/ dmTՀ^*1,KQyVaO\jқ~@]FЀ~.ѝeck0D"xN +rl2p )j!`aCpNG +w8we $sdׯKK2|Y"xZp,޿ZaTCSn+DfÒeI3W< py6k +Gn8ZtsfgBu}t ΫgR0fJJfshU]q PBXu a+Tp[H<~ڥM-iz +gMQi [{ YCioTEH}2'3 fmN{V|5ps ) ]n[6W._ ˻z z}b^s,[Tw*dWz)O. >=gUQ*5jPA"Fdžc̛d}n2GWo:^Oh OX-ZxLX6z+LĺǴЩDz֑7RqZ;WH&uu"D3N]PٶD&;o^)Fr-)kV-'u(P*G)5tu[A~Mݛ*4Qn_Ά`Z+cc]e s}!ze'kDBz 0khl$*"ޚyEA]">ð Gv +WǼv;'h۔)a<-Q :] _•=ۓ^K\d9<#Ê&z5w +V@cC5-&nTȖB]iNXXxUzV3ԢƨV{> ,ЇO&D}Ŝh'ݲ_o"syۤ*4?]׷lEia11-:4|T#λ@,z2xݕMv:/ oU )7Rqd\cA$LF/J pGE/Q/ !c딘8MzrCLf]LQ93 iK8݀3P>﶑t7ByO9v#.o%Z6{A5r='͚QNf)l?qnR< +JVMPr.][0o..j2]-/e7:,AEĊ 멾 bWہ?\~C?>-M5+-sUMoZ|XrxpW L0' ;nq||葹SJ^30:!w,JI܇<Bp]zdoX Qmcs5A%l| VrsZU +?=7@_c~KT[PVPpk"wH'd^B~;h/Adggˡ{11k9bVT,Zg !F"~Wl׮:7abfQ s\X33'ST*x9":KǒO8f޾X@8F/m9KgMTLz}B bMyr8 +g tzjt&,=B[dTAm1)7hn9I'&P/KPՉ̙H5̞(KC5X"y? P o-|d5En"Q|:[zwM?3ǭ3QSng`ʑMDB {;6O8jB]e|pHֻeY^6.Dch2_[{>T2lB*YEM;οg&Z)daQo|Y)*s_<;=F=(3G` }`vV#R\O6g-xӻsa  +߁xҌ\~m_(m>**=v(=(أ9OYy>{Ycd3d +,(nhl} [ѢZlGub5|u膙KBlpevV!%i{мt]A7);Uq8JhT{wCl+f +n5 *|:u]'zܘ :wt./ŒwblcB ے!4 & +krȎ۔+Ò̥y}>A 8,@e꽳B'贂jnǐ /#g|{{LF;ш)s6؝`pfvZ,ʮzv5GGB){zk̍S]#dz ,,w}DBԤynhݼ4Jk$p W W+ͶL/.1(e#Ie%wu#+Rm!c|ϊf(a]. ыMhRtEךidž[Mn}oǞsɚ`n43&FhI䌒|h֘ϪS'4JiM4ۋ+ZK.$PNWxȥ+@yRjQ4>jDH~֭(ڭ Yc-BӺ>?ŒiP3K +';-lm +Zc<;7VZ#${+6>~iշ9+wa1NB*(uq2 fQwtZjq rD.W'{ +gLM+>޵ºs^zG bk\fOU?xս$+RO+c- +[*yӇE܇(;:=QM0CGƕdKJCt(1[H+7(r:=mYxk#eX#La;W,)IcAA[\L\㲪?mSfu=>ulѬvo(`}q3HK%hy3B8ժ&6%oEUԗ6FP^hi:nAL&X52Z~yOvDUSÆ6}s~(ټp6^x#t}нB|,U4[jˏcU~ŋeR,!n#4 +P[ ,'6(5<:DjN rxY맑S _gﳶF+4 ̃!`{SF$뵝ZyUXњnyvxٳ]jQz3iVeGՏbK&M  +5N*!I/JDvp?wl^f6'SI 5~nN},qLWjX9]rq +W֘k %-yGQߴuU>P:"R^mԨn;ɀ(q}ޭPzI{^|RPP`Z(deڝxDhO + ^W QA5AWu010/-Q?r'v9DQNY\>seB?;h,^Z\W}&瓡NWCg0Jkܢ+&6/#  Ii;gB,cIX%0^Z#kYhԃMhߴ4O*|0o#Jͪ9BsC06Gxv"mJS~)hy{H.4̐DOν}mz˾봭 `lCoDC n@< ?Pе 9GG4&wlB>@S"όrk:tUhCmۥ x|/[eWkFk5cHIf\ty"-[]XcӍgl6=e=(a-]7 +=fBrpTtMpCQjk_v {#sMdgdbhmBG+['+i0-/*jN}#*!ioI=MGdoJ+B颯Svh vN2?v-%R(LUpC.sdnit񞎴x(*.c8>3z)ey5՜k Z/9ЛQ]ot7?c lL}K(YI40ϡ, +&ܐYsjګl{O׮r((|czx=̵\Lv/&L^2`?_\ecX-xМ̎N˥aUvW޻`~b "g{AOf7DX6ԩe O+̠|a[Z^[r-iRXhti&}7-Q\OJ/>[Y>k̪}K:bI\G쵉Y=xGM;>Sn An1:(wǮJN$eER5,؝ZVO:^ ;sKI wZ 6CL3iÑle!_o 1`/K VWf |'/=`j%mo&vlx/ҫ9>Uǣ +cgnVZ+AşNJ;d$tB~b_X'55' Pk-p'DuH_PD)IwM`t]CٶtZ5եDKnOO~̘֨ݐ u2CabQ;\gCG⊑i[s9h^1Q(TyXl伔ø}n.P٢sI3T;&۩P\bj>hVsC./aEVVQ,B_ +殎ZD][Wʋ)@ R޹]Oa0M. +()=lfIL+aO^X%b4i_i#|FQ9Z^wZu<_辍BueVYU oXϐv//ҭWUzS\jqZ[Zu5%Z2UeJt3N60[\я7{Pрe,g@iJit6#+OO1nӹjo%y#7 y2/Om&7˕ +p7|رRCr&c6oa:*[9"n'#*;D) ѥ߬']e/#bUTUvΫj~O6@(BamԬՇ~Kcr~_:j-)39JYB*.N .[?i@NJ_=Lvi:Vqk < jM|DsOV*81Lq&v2Q-Gi`(;0@TPiOt1%Ǭ\FU+ON^İ҉l'y@I NV!Uz=iRheZk޸Ե eh'UAŕ5fC"ڽQ!u;\P%G&Q|^|zj*bNJ^Zuvۃ+y|o:b[]Ծ3 5=!p̎N5J#ivxV"0ZK2O4w(Diu繩Th^*H߬ cY0?T4;A4/G^l+ +6amZc4MYV%]睹~"3B 穱&y]0i^y|1l.kZbWj\+hhAȲ!7fçJoret̴܉s*\tOKT\_ oyX:juC3;}.z.}q|dzvD2_[x126^;uQȮҕ +w_::TA vW$|(YJ{c犚޷Z$]V6(8uVb^ rJd_~OnqBP+2x!:! 4ڷs+vKP[Iv +''xW=%l-{jylZ{zɇWZV.׃R:8B0#PSsu:*9el"E}mV ql0;| fl[t G4GǦ0u?셖)'%,$7yYqtjA\L,X_J8 g!o굯ab$Z( asVfZHW9Yʪ`͙Qv89XgÅU.IKؖVniF2ʕJ1Rcdܼ݆͈k =CȨ -ϫٳSTkzzl2M.':\Mה@ahC7>RhWizyij~1lLۊƘ'PZ.XF)az>ǁ),bfNnƕ=l3ĕSNGyFZY8h +;ry 4fS`Gyi4`& %o2;in2s/kB.wo&=-/JDMMIQf朱 g]ۡ4>s]_i=:U!OXicQk'UTefڃj)T/Z.0oa/g#!VP@fMqxXl7¤ͱ|٪jFO).&MKUc2ҨVgڛ(LBִg wO# 4or}F޺ 3~/F(Vmo~3Umw((V"Ħ;_"T`Y 8u{;4;ex.:6PrA)5w%isQ0̛(HRЮ9إ)SKաgg6[IvZLY7bG!Ñ#_]l[ ;>E;:.LfHOQs +R!X;of@@H7,*?*}k|zL,]Vj`JHFyˀ̯Þ-qZX͊1+'PhVuGRE]_o.VV cKk8~Z6?@S٩Lk+)?8I|e܏L 4:?AuGc_w/A>>+4n4/$ `u㚹 + (+Z,,㵆yk,#adp6+J'HSWځI3qG7p,Ͱo9/f:m}'"ϐ!M)SIі`co{ Cy >,W{lZCI|f~<^/wra6P?NMAf3:+6 +l^'aTxִ4}:8MӶ4WOcؾB˯#nl!ߕB٪;̚A!\c 9SY ::XcՄi[|UYc?WSǯqy*bZjVx#,Tz5&k7yf%5s1 .W|droӻēMɘ)aNŬj *C2ޢgCdĬii;Qlj U* t5{h䚠EПp2oW=`j` +&T44W4ic؞Xl Yo!Hk@q:ϝۈ-ָ;-+{~as5t:amSOhD*Ta;\@pk'YҊ%mnbOΕ@ʭ jdۓZː\U\ \Ng yES'OԋF}wM:9,aUF3~}ӐӱCH~{~O2o[im={В{u :?tr ƇS_4˔-\ +zq6_1+|ᐴzY}ٹo>F~6䛹 +g.k'KѪawJ5V}%KJxG 6RWzW탗IbGOzRf$ŞO2!dR}M֦07TMqk@oYkAc[\OuX¨7MmlNqYRs^wZ^x+XkF,ļ4)=+k|Lێye +ô_I0G8捻͈"9:;YK< V>8%9l,j9^4ƃYhkjP*7E_٦Xki[ Ia¥S5dhzwF5IZmdlaJ^/Xq+Fx0'$vWbIJŪy #\i>stream +xWBaTUwkhƑiv,4N iVywf+ 0H6yC^S>dVݯ"`sv!|dI+*wm#5p'5bȃkĶpˠfոԹ\8Zr[ +:PMu9FN:( OPp$eA„U\w=p=wU>^X_("] [>7֒Z›D&^W}{ܑysf6J]eWVj5_ًlw& G<`G _*8UsUAs.f'~f6A>4ƏD+ԓ%+ک#3Ps +:YY & +B;9٦:8p!w XZbfŜNzTR"?z9&qPՂ}o[^ *J]h +auٴimܣδVWiRoNfZћ< +1> n+[{ʹ^Mu:A@Kc,3eˎg]V81ֵe+!klLzh6e_ٙA#KJ8تnIA{MD_fڪXِp[=>MT (mV҃ qXWY5qA*S׶ӰjiSJrַ}'sY})O|LY^Va =*f5ZU}{>seYY_鞩YLܣ +VVе61u3/`A"ed޻Fyv3 oi.!1I[ +$; U XsQHҶ]|IBk{`(9iAv$[X ftj\Xε-7pzJ5HWQijgս3) C;56vx?Jm7Ѥ ҁ=9ǒ/G] veWx[]5笾8d +U6qЯ5>!6ȇCsF(;n1}eTGqQ ϑwZ,OEC_%DN盇wDf$w3G +,WK1!DȀqu Ft`GL^d5 +aJԮDGP3ҕJ +y ܔ(3nם"m1swQax(B\@iB +o7Gte6v:ɧ}?". ,q%>D=ztWLP~w GgC'EQXJ=,*Kiq'Aw};zJJ+cW2 3[K2yφX1`Bf_xRi#kosHCVn$WּMlS{ӵz``s3;\k-ُigẁ?L;~/g'f}--ma=3/6bA3Ֆ8 /oDnVNi!)MqG\u鷲yn ZNiaFú<=pkm ʖs̗I'!slruD}M>>Vv9.<,MMۯ,wC0”"dĽ;mk'F t@ g,^}Tr>M˅Qvӵ-p}\u} -64.q +_C/}:(ceoA>}Uuނ'ڎ߅bX/xqeK˙E]*|XiT)aȀѠyģTP(pM.f_{ȀQU[d_d~gimdQf{5y:Kat1EW+R Ṝxϥ,D,,EHn,C_!tDb3%r|oU`aD0qi0aOa#yDy07xX<~qzBDya>;:q(^m@9Wr$.#I{̀T/)E[.pX6|U# wLk%m9kF_j̀hO4oJLcmkoT՜' AbBeT_awaWGj*ۭ{?z&rogxaA{gHȀtOwF +7b[D|~N+W.Sr +2i|O͋+A̹?i_ҧffڑk/;[6wG\S9!%!F7Ji*_Cg}朞|vfv +MpsH)rwӄ^Z{e[KMik iw|{.}st-8Vɗ>T3OoƍYR;КèIP[m7ģNzY +k'?V^oѡ>+lܾN-y960${)O`CNSHUIߥy)Ѳ6x6?.&VZKl$qG$z +Y{Ɣ)F<c!~Ǘ(Q RK)Jc7'kwv} B\;9\ EWW@]=Κ6=T+az'Ö́?#UOZ5q3ӪO@d8;lFPo;)c]:ks00lK}[4n,>6D0`^aT$2B[Nz]Ժ>\hQ[c~Ltp + + ̾*!v"g_AV&!g/Ja^ixQ9QEZٓEGۛo)tWE8"󌈂#N(8Dͩ~yy2N/l;q?:bK7g.w%^2?`+74cȿY74cȿ&#wx=7,iƐr4c9M+`W}Ѹx$kl9%>, .?7'p`wG +SK,osq o&9Y1 +iVצQ8^/MOQ-U51/?St;OB[d9qbr(C>mx6.Y'XCq19"cf--)B\g9H ބ/F-UK7C4q8~ncE4̄S2NvZwv|zE<~7ֳ}puaDEE~כu}rT?/N )h<Wq?Z{*v37c66AHYmue3B5VRP\tL7C~ky1k[M'"ҥ{.OxՄy9\\%=)Wx@E؏C%1dA/:#)>us(\e 奺~}\0嚸63g:}oGd|ߏ3Eb֜2_!?ο HCAD>anU]nAj]su&ܨm[g>lon1_JΖNKw>%t!?52AQݨs(VbAs4m~WVݚ8yoKxIPk/ڋ!~̧Ƨ>ONF+oQ[Wmӧweinĭcl5s(? NS}|0=ȓ!wx9kV e1rܫ`Y$x~>䫛kno V"nr MG\$M,61[nau,;hi_Ib>[^ɼ433Fˎ +l~,15%dX$]L!Y6]=a]ݒXx~vm1۵-ƧxWSoh-*6ă1T l :>\k{N)-ih8̓b#7Q:CSGFw7+GW!iT,x(?r헩B%tnCMPj)m!jDb4RAh +wD1I7"=x/R_Vrxtp[dfS !5&ܔp;,vzbMYVA&V1_~C7~i~_M&7$01俜Z6BӀK艤Ga99X:+ujj֠&ѵ vDv}FBQ2#-ӼЧ_O"@Fm@s>\".n"3:9~ݺIVZɺOmh8tδk1䧆 . +}0(~~( jcZFo}AvMf?ovP,B͚4tSqԲrV~P/ E5vc:nu2nK! H [FE8nZ@ys[ ˹ngiϦkފl¼܂yf@'@YKj$seq0(BoX4qm䛬͇SͷwռѰNO6=s|zOscg9Stȍ;eY.6qWZF p֟𧨭s % eDŽnHxsS~I ږ+o(۾;n 1^`wa¹}K9zM,6)ک챗gOQgE/,gim+|JPÛGKpmYy +Ծzj?.,M?y#LE=kK,OMT$`Ηbjm{.} +}n?х7 {5qnh\Xrws75<պa8fCTRݎ+Đ  +\?UF~5J]J/Ƴ;R%JT*^#}?*!._Rj/wȶ EWQ +ߧ6[{fYGʸi$ǫJ[~S*}>bWN|ΦǗ( ф񜿠4p@?Oɷ~6!̽xz>l,甧ͩL}s̽s吳ܝ$=ɉpzo =4>x +=Up/W(0;q'25 +`RZ !kl?XmeAO6)8rQ=>V,7}XdmnZeBg30mYJ~B* A!B9L-NzJXwF,Cr)r%#˝xeM2 )p@U"ύz:r#ᓅy֬V?>2RH.!!|~7R<$=L<<񅛶:[sI1A֓jrܟܦVNe1*HB1!x6% [V#fGfR5:>ݝ-1u{A8g.q cGMo:M8up)?| G{mӝ~m8*554d>,o[4 ͡#˜R쮍~` '"> ĐZAy5APNb,uEd̛)N4:,DJj~:25dY}i{f=`Rp-̿s-|bA}5+-8|rs=Y>;>"þ©pb{,4vKo<"ʔêg9i+^/A)W\kx8! 17H1d@^Y&. Zw\^АOj5W<:k ޟ7au_k$̘|boݗ +IBLlbbَw؎<~0/sg8yDV2Nɺeyrv+ fN*B}ՄwH.KftX7e~X=u&bQKR"SbOZT# iq-:|?8΀r^Q:NG̿vAl,=n(8RԇTZc;'WF{ftXƙѱ2ۺ1䧆tdP߮:΄m3cFr~1@CyocuB[oԦw9Js:뮾ʊ]yi/) DwyaHj ̀fwf2wK\gec;!uWʌq:C8n :nÞv1!:kө-Nm?<>XfSMܒT ]D:vYz_e |a{aL; zZTZSTR+0Q{$C~QY'nwR;Ӌ;05 BA;Eqf5sCp/TB/SAۇ"hK +rG*b(}RWZj [ 7E4AKνGn]s_ԎXc鴓msk/FWs1dMUzxo<x^7 S [iؓfsݓaA۾P-8tzwJ[j honkp[Kڕ@)$d[ј>gI~B U|C1_~CSOЄ++ MG&/73'_x M[xGU .{zmnIw[sj yy4\D/وq+\d:1Oc e9 Rm b5"A;3sc}|n׋⚢w'ݤ⃔DWw&a`rG3ߎrKĐ_B f؋lje.1!8 q`ҡ縠G^P]N::cq4cӑBIܣ*#_~lh6[aׁv!\9'Oq=.E$Dy[+j?pF$:us:NWu݅i+f[hiQy} -Ő^eeA)*.̹X-S,O;Gy^!{!-]jݗ,bݍ^ =yy#sySgi]1X&AS +:bjSբ\.}.l+q@l+;=6a+ C~ݣkLyIݸ_9oOMϜIfS{?gЖ5K$js'S,L=_WvC%}\zkg#ʜ\yTZm"~ct8[{ eSTo ր4g7423fZ;#G`Y [?wmn~B ,/'JM}G9Z"bȏ?DD99& *#_AiVcS ڣKsbL&iܗ;3pCL~;"ZvfLҼ5ZTO|,ad{;s]Q]&wB~98d۫;[T_5&MOq4M޿Ws9BQ<D Pl /h)މ +RR^վW"\Ʃy,8Xmt%( )/)?= eA#ҳiaRMEv&qI7%qoӣRuni"룣Ç߂}NGXrgV[zV?5G ̎Ѡ,` }|LpX:!ZaH%ڹRzce%]i%=(/mne5: IOa 1W?XĊo8o>&A+ʝ_/zf1IU2/y*)>\3N2#5XX$y2(6:g[yP&f`, K8 |7֮)Oԯ !`!IOSTn.jUv䰄^l;q|D`'e 靲@cdY-bx6m|yb`(ck8sm1BVpo|c]M@ǬS ^K `pu5ǵf3.̨x0ڽМ졕-4yq,>k妎ZuFG$+ 2vG^҂uXj۸$PD`x?b3Ohpcs> ƻz3xW3}*aF^[dy%G'<&$ ]n<$U;Mw6v e#}ٛxŚ}gwu;v'B}ƀd6g|7f(/C~ +s*wkw\K+)bc1>yK[}?E{\'ȣ8 +BZ?uK?P8VVbfttWY-PfG{G~"UO,AM{¢k#*͹C:g5!S>";1=K$s [ycD =5{ aจp~9i8' {;8vM]c|ҕCکo%Zm[@;a 2В#F{Đ|EGZzWa/Tr<`\T{&*9#jMz.l/V 3We4:sի +r ZSݪMnrWpgOSV)M N%e/,}y~b)&/CnN;ijfuWUwqRlru}!bỸ6y"uE#L9閰@@wN{f;l>F OSfQuV [CԸm}]_:_UO5ST.ESj%!o 8Xx @_qwA>),@΋@nH;dyÃYz\ +T1 }Jq'U!zǺ!~NH[O2-.RSOЌ{ohƐ- 74??J| e,\ׅ뤆W +P{bmpJV>/&ǹؤw/z6q[ز VV8"ꦞ%|!8K &eskJN 0;ؕ?l @#$>B0SNU/O_fK/O{e1wk# uԺBgi{[&O(^V` f7ʧ$|nB =*+aPR^ܵP'C WТQ ԶnEo]Tr#ߊ/'笓Ҟ<&9(wCI!=GQ랗l1AiHYĽ;=#+mPR Q<]spF!#< }G۶HT.R:.OB U+tDp[VOI@ +Ul^6nRUL?5ծ%zDY7D&[Oz~m1d%O/qi#ysej}Th ԌƟ=212S  +9꽝 g(4zDcr皕&/{Dc*mB-_L{RuEqR A x^<~?~xviݤCxcj7PWQ`m)4isOD@R' +Kڢ~jA> KĐm.2C(P}@nFՌ|σ{yuGJF 13T2~ZH?8vΰڛTQs݆능'T Tj[McZ%q /`\ѥ'F>pGp=69wzGiͺvVIJWl={-fz[̒/}{Wڅ{+S70ɞ3;99(2gMnxFsyr̀rRλP[kܙvThJ3 I܂uE=O߹=®Cʱkp˘da6*G  OPsڧP^iT\6ɾ`O6k8\rFDha}$O+תnNN=]m+u.Qy0Zm<\0#3m2cHw\#]"uf}H?Ag)Q %=qReܘ$=F%1䮹Hxnx|| 2m;A :~{0*ў"m6g .]l>;O:NvnNB qKΙ|a}B[.מnL႒'3E$fxBZWv*D8*Xood,yoө_ +{ a;5z qujѥ#U]R 2狮>[,[<&? FfofJ"{Fސʌ51DW[QM@5(*n@5u6C5B5CRĐς<YsڢBՖfc~QbE5VN͓x2 &( \Ĺq}6+~bڝ|VlwS;vdv"NCĐ~ p]\t3%'_{KU'U}£ ڴl-՘|9W}b6oڇܶN0fKAtQ\ i YM<7Uʽ5D.*!k3̄厂o\][5\ :-HMKitGEBʹm)TUqjEohGؠ1Z^gW߅K6]NٕERDnU٩9._Cz@dTBV>sr6QcjK\;# lz>jV O!j9zii4[sZew֋u{K=.J´}P.AoO%qA?Z+í*tTZK<\/.ԍ!]+]|w /[r\z:dz%G Uv:qv9 VըC|fiV"*P&SM"2q ) _P} @l٫(4 yjdcT=D~G\oF\Tqb;86 tuGs⋄k57g 1W% E #oE w@jQ–z^ ^8@<gI[#7$񈛎sޕlSi!ˈG#B[O7ť:ߡԗkn^`bōoLV+Đ@.IBQE@ j`R'@5:s}#{zTŏM7B\!nY LW fkqNY|8E{@Of 5xɭS>ȹ32r~-{ E0C!], a~&SI/=$S#4ZcRϙPԮ>XQ?VX_o/5]Uiz1%uuWzU!_[tV5rD'}'2LJV6/?Ǣ@ywqVuL +Jk]]M~ChzhCX?k~G*z{Jz9nzӻJtn/5_g3lK {rZT_\)saw{{)zd.y+ ˬ;K^ 7]l:=q:|jt~)6#Cp|_[fTܕ@=.d-Hd0̖ oC +ww4-pRT]:)ǧN\顡krV?ex?hy7>L0b5A}/-h&ج7@>0a +`s\ĭ<5i8s%׭n){3p[~ݑpژNԪ}{:`u[v: C+txKTi(i =L3 gabO ?7;AR5\ܾjX |ARHZndz;ͳ(3_j󬞫St t=pqb7`! +mn Z~i~Z3*c5{dɔ/>rdo9#-A`cp([ S3:t]4#{dϜ!sb7mXxZ?qI~ZKrЌ_[oeML3,hɥ*ZjRwL?5=EWz*l:䱎Ij]lښw<2bO 3(^0 3dpvjrM%\TcB%}颔:%ayXRSe8owRtA ;K;egQV&4N'vo^y8õe)S7K392, +orwfOƨ$ ` hoPOr#j"ոtT".뽊!h>z^|@w!Zԋ}gTYI\?:B;fd|&]^cʥ5J\|,1Ԭqrf;nl-mZHuhݫ<{WUDfs%%bȏszg ӁAj[n^6%8J8Ή}]:`Dj q|UUW)nZ R:sZKl(vE=rt1^0@oZ8+oQJH7[o]f$W@z?_= +v:jSZ"I |3Rm6rYْ@lQV= [+ I `mAK?Ԥm")i? (}Myٓ6-!O2M足Rxc8sAVSgA&%A ;+= +ByH8阌mom?t#mgdo`mS D4w{({_#D d;I՜CkhT ~<8*c`Y0 6|$ܽ^Sև2Z-XwCяnZ{=|dbD6b4zBdԟ[`⑜꓌L=Rx]+ޥW0:Dj|~);cy?ؿn7=Wg D| rPfDZ 2~MOwyMk;3/ +_2&TDmfո>.T =]~/ިۭl[k]O:iZ̞l W\ g#rX  +m|dSp[Ĺ(lN54A!Xfqs'M9T}Z9֛[WN@dО659?|-w)qbٸ;wO [zRp*<8~̍Kew +wWnsV<~v%4(Mـ3\ ]8,zwS>XL3?ѻ`%n}J}f_W rn2e+8z(yes~5 1`_:fH5Π@Jb#;u1{'^^[Ί\;>Lc[Q $5V:][]Ε7L,![ {hOO1dq\ P1YrZdHi%pHDucȸr9ų9yY3T*9:%7Opвnl|knH ghdƹ@@@zyXHPg|It0_]a{v.qZtVc{z`f.~y?t:|H2dnPgfrsF Tk|mfHй$lq'm!R"`.ςR̈́1jGgEagv_nYK^nQW4i-֊zPۛoUu>CSQnke)ͻl<(g v5{},gqG~Ȳm6B7$.j|VgQ˪Ҁ_m)p(%TQ +~\U}Ӳѐf/3==))D0N,Glf;anpݙYm?֥bSZT]Ç0 aw,cʜ"(.S%nr\gP^u/ӣ@>.ZV +O+h#_)_<"*Bj 0_?B 5 +^p7N|@nt-/s:9ӝev\,b()d$yZwGgx,6ZjN^%JXmpJ/?F v.i=3hDYٍc790hoŒȯvB 2iA\8uawvǧJjvkCn!? +fmJTQ `-c݃pzSp-2)Ҵqz}-$cw%@NϢOSWʙsNzȕ)2)nDπ)Fm_SJHV⻥Վ۳ -\B_Թ +󃭩"6PF'w"dMc|GJFMgu:Je+B߱+4Їx5i=$sݓǙ-9ڶm'vS+@dsEjg5KjȹTO`IC<=y?A>H].Ȁgݪ j~m7 Jճ%>zguofX68~9$RnVT jW_iPF\i0#V{~?{靯N0[C-So)c<@18C]VE޸UXhS\ c6]{nk/Kd6NJ7LuYR߱ٲfgzZJꍗ_rr/5^y&dlZ.m1>f_YsI\ F2D0MqD6jlc=1`ݘa֦Tg!_w5u^E[hz9XfX}dyl^D[VSH"N[lRoPtY&)ޥr=[چnu7*&)jmM*Nn?u<~ӎtrF/&iRRW)HwMiȜ-6g0OdYGY aQ&W6ץ`}.:wRMu貲%uwo6c +kyt4kYJZ[)mܹ:Fv.~HGM^tJu{Z<ƛyKrx?y29LeSu/ +-Zӕ=4ꥆݶTvLƯqODR5~1Le;ӤseVN1FIsm!h'ڎۥw8lԺ[X 1ڪ ,o !ċx)'6mM +1)m}.Qˑ*>]5[ybwX0I?}[U]%us6[ȸX7zry iCME: 8s]ÈѴgcD/yY`"^FkBU[/s7с:6 {'«ӹ}\+GӨfuD0;ohpsMڶG/AMkTf$hl?X|֘54(7HUZUK"JYlc7k|W\/jkafsk +"q/`q^O!6z8ye1fD9s;CsɎ|vvftM@ >!7;_V.jwk~5˳N+@v\8\g_ +c(7l>2<43c, +eɩB] ԕWPxpZVS.{I.RFEg'?X>Ref 2T-һ3dlb( (O2ѪP BY P03WS |Pmb}%$8c1w*ύQ7`A +Mm?{)YԻJxK 2@.W[B0Mm!@@5eMNq'_u 63 ۂɌО 22 MBhV~slWژ(U&#@ >ݍ6@@eSF\Aˁh<\[qfg8&/#t@Yd@P[sz5*š<6 @3@c`Ɉ ߴ^DVƪ`ݗqtwUjuٙ(l<X)@&E'ÄE2֛$ί]^h`Q!$Gw_Ddtj +LBo (P:Lc<mk>KPM8Pzvnn!k'^aP +p㈰Y؆qCRpj8`y{=P7y1/MaG٢J)O{!+z^QM\0'l^5^ڗHߪ2י73^'f{:j|XXYׂ>W SKq+[DEzk5Ok򙟻s]?U'Qvv;f>( YI>ОM޽ 3.y9n[wS!ɄcV\S q14yv|=U}z fܵ}Ot} z>i-tɦ+wD=n:aeDžfEyFWyD6}b7υ$#zH[1_kidMP(ba|ߘ2֢V"'W#%K5 =Tt uM:hVt`]WQҵwi< ?I]5‘s9XsXY +@%lV E_,Je-pl ׍_ GHB{Y+o荷(kSyNG(]JzK6R^_l>AεkivRq{.\_Tx!~!7D475{1 u| +eyLq3z7S̺ ݛ檰-յ7YHB>#$Nh\k`$>'}_(Z["9CfR9!s> +( +.M^ʵ*2# ȼRYm94j{VaJL͌L8=`,%f~o`>_@z)5_2 !=h, 74乿kt +Y/I9VxkS|nNBx_w&؎HW,6" ☾bGxeF'Ѫ3wEݑ*͗ZAwwu!T*i[\aQ߼sa(Cea:$2؄lc$oCu"|޵AenmD]{oCI5o]Yy15w{}yn@[!'*-1!h=?;"WYNC?/?A]Ѷ{%e?6/ G)Phw9"0j:@I]$8i5g850lV efD5!A[byˎkb7{U~ڲ*'Z~&5;,F:z g܀ ^D^.ݘn[ *^?OM8ݫXmx]þhpޓz`:cq^I I}EcQcu##d1#Hc,T31WB[64vo],G},dY=?]#&5-0ך?˷80``ϨSs #|^S1/ -w=ۖ4xg#:Mw\O84C5^i U XB/~팷hM4s8>ڛ:> ԥˮ)TF4'eoZ}vu1lqo3u- jL&G6?=ӘasJ1LI+㒕\CfNvA{,JbЪθ2PsR¶;qzI*\@,0ƥ_pcs8c}Dcj}Hg,@wH؟άJ!-sÚm0_V+amVeF~Zl7Ep;a3NFi[Dm49\Hғ|b^]Vf[Qz&YiKܖ εUԐmUF퍢_uRmz*Ի(q8jav ؆fev'fOe/  +z9x57`wśwrJ5g4RxV.Q0˧ DWgPO a^ci7u.-:or$b I*M/f+!=pE>tvָci3)= +ݙvjlX8 k7IO~KiQWUc^%XQ3#.S0(*A5h!S{ϙh#br$n +b#t3?Xr-XUURVtR>'TuQAmmy,ˌUӄ}qkΙ4(F\wݻR{ήlͮ^9;Ս)MwϺTU"=rʇw +{~c`A0Zf[$w,f$l<ĥ[:!k+L ?,*a)}}]-_ƗY[`y'Pj^dEx`2Y%IG^|"zJFՋXD mn`y 6Tϖ^ė=|-6ft߬f'ґ~+j2㰍tq96C*=N1;nHΟGy2((3=4f׀\CuF$g-> +=ȽcQ4Z+䑧)Wի/;s?XfM3^XJAkו~ܗ\~.< N(LW-cN?b`ra78*`=w4/b|wzعy5&G,KٝLeTFlK2T£aQPp Zh>[E ^٧.A%Ͻgr;TA9e^ Vus2s3ՠ>N .`cw]̛K?VGAE{zC2e0eV\;\;ؽ8-Wi +ϗt^޽wֳV:[mt@|/EqLnZĩ&/u+Q،5pܻFi'3[6'c=͕??pB2:>ya@+ڑ>ل5;~8P.$?|b_wP8{{?v;-b.㈍3npɷ2qwEC{0NĀ]蟣(oi =vqn KkjEQ[q5]Y KcRHeZܷqkEhY묝 +ش4#^}g:jPA +R eE)NR2&F-REXc8Nu -jVO^v}لpEc䄱JQX'_Ta쩕T[5B jw]#waoa!H 萺q\\omtn;]rڮ\{ﴢ*8zGq +ѓNFJ4=H}+aȞ|Io$b,>jtx[$luӃh?ՑjzΖ`iI^% |v6\'mFJ}^簻3$2yPv;9Rg<|0:KkJevk[ι-*Ε{nkZf}P]l+ e=<},Q^Xdk'1=kԶsޞ2kԧf<-1"a%VAɭZUs~`嚾쟲e~+'2x l[J-?ր^0T0;JdfMW<ݦK]L:nӪ ,gMJmtrC0NթSS„}*g[\l9W8sJkt5~0AZ!1mJ-k^W4p+r&nF3uL$PlRQuU ۠Ѵz\Ԕj95*\Tkk-[wlmoqV{/Wz0.Eaڵ̗JUz]ёOmh-)Q䊌wNoPizUVwŔm&tsm*V( f|1Ղ}eB ?د1u߳a5]uq_gsrl145牳Ia8Ώ:ʂkId҈tHtUf<_iUVվکXGwVA|tu|y +wEXZ=1\׬ol>oMV;< V +AoW K&&vL#̸~t D$Nǀ|L8uqhȬeNۭJ5v#T-`^<3zwe%}=vSTqbWTlά06ܛ`d\ +w~+Z!}P5ڏ+VXB;ݜy~1uo0zEnz7jk^5``; +uP( 7ÑѸA].PwsL@~Og'7;ÅL `ۍǼv"e|}) F/M4ZE5/ +jL [CB. }ܧD3]pݵ vWxn\H~MiaEUTܩmwXm(W$+6[ɏ@V 8G^[: -v׍zo|EeeuIsrQbI=#&][ oG +'7kx-uQ Mt[Ŕ6JܞRGuȍaLSȪ~0ip[߱p}LHgDuѐ3+Zyq1?NLD &)qaџ 21x["*@=㥘q9fp:ҟoygh[Pu9djISbvbpH%I']AIy4n9_W7,2 eJf껰9-?sQKLw&1A4^Y>Kuskj;{_ aY#};ۑ4Qil0C\o9=.ϐ;!^:ʥ[ zL3ȟp8>βtfTճ"F8J\čfFjou~Ӭ71p~ +&JOrRBVCt>v3W5}nQ>gF 1 ( =}0Qm5^w~j˔^ϏԭQ+Cnh-.S g݌Eq;՟p:7Wc47nJg*+Ψ~0o2Fr΃SkB}kw&0m(_^NB3y2a5X-QC[V3gvVfk9CQ^X _;esPh@~C*xooZ-nt xlœ1 ̦5ISdB<+ItVKkGOPSjpɑ=;e=;^,1<,1 + ⟔Ş4Z@gfT,fwViZۚW8_T%[O 3&L/fA˜2}| +5`Xef̎Sa4L Сoe +y-~alRCf(kt#ML{eWWTnx+eEl\[(;PF6'k}lҌf{FCK+j=bWkV.Ő.K{EOI 2QH[pڨc}>3kܞʹ~]z/uuu;!{`˛m@5jMlrK3fw|39ku;mI0:c0 ѭ?}߭<`ak[QwV_h<=ӼЋ%ἓ}ow-6 +>v?hf۬| J d35_Ox-fb\nG +5BVS5pE?}Ѭ|-13FԂ-Қ|a!z#>j{>^I尦VYK.XyB/o0'ǜp{>1:b壙TIs*{u-%}=?ٸ [B(nu{1JB5[W9xRd^%X+~y_h.~pZ?B> FywVSΠAyCjm|M/#FJ 4ӓ ^eJBjUJwzȯv]h@ T5zm?hrBA^O|1 2 ʩ ` +Θ2fZ"q-naN'\)ᨒ#(ge1HAdm[k78R_*pf8Vt"fM+f8o/ +J|\Q㘜c?)҇w,/F7 7G;mYd%zBt%̟[:7/@r x9pn7߯ 9 +MPN7f>:FK]-9R߾8@]o5ba6UBB@ +A++ 69y-]!1 ;yԚُ9@.IG$ET.Uʈ+gIk0|+\qV[#Z^W\ lvv3} :->y&( p)j>\?=A0S&b*te2b}b0A5z!;5G b!}F;(B j)&BнA2&~Wf+^x,"NݘKƝWk =j[PW[>_m[+=;E^3}TsY}>Vm2z+3),yKE+\C0@Pw3g$]ݲR߷ލ 1~qxq +{~`h~}+޼y$ھ߅=ǡTx4r^ A/ig5I< tmԙA&o6Ol9w|^}t̙=PNyOC1ܿ|̀<65OKP'PT:>×i=FGݺ_9‚\ɩHuA?;=sg_&4a[k{+?`;Jk뱕INLu/y +QA=ޞѿfc)r9;ܮ 9q澯όC[Y-J0F>μJ?^ts,M9V5ڼCG& @a5,SJnv( #tAÑ8\I۶ UiWfml7s:sMuSjGGf +F&eX>T@ ͤsϛ鵑Rء`cy轘TEL/4\TTXDcu ٥<ezYPB׏qbhFiQAsG߿&0,zk,8+Rζ>_V/!&믽%h)KagATgm, N^He6x>eh9Ib6y]Y Bba?.:+]yظg%ͧ_sPw^$6˞㲧Ɋm6/L2/ +IiT)*'-//YZfh^ v>?) 'bQik;sRex6Z"fyCt&Dudڲ>3}_ =bJx[r㝤OvC.snHLn89{ ~P6v; Lc,wy"2p[=ybݞSfA7u?/H%t?,KKq9ZDos/ U9%Y؝};ae ,D#Ƽww\2_G +ӹ.j*]MkgREbHt +F"|_8aW s4y2sY kŠFCya⭩K1+Ja*֏&yjWm$i{,H(8n5w<6*d3q_vgDUbF$0m=R$];=yJv%yjJU5g8jv$ܾCxJcjdm"ne# ʱ󴾚y޵0n^PxPjRӮQx.W'7'o-I$Gj ]7h/~n{5'nxw jd|E24MVPW"_)[vL)RLX%MdE0N< W/{C<F8ݔo0p zȻA}ȁ '7u-i^-E0^F"lMQ'CaƎKrf)((~7 }@1~J:rz1g\{q yx= [Nb+bw=9wƗFe='qKοȂ@R0fsgX]m,GW𻞌dưa:0+Xi߱o):^əDdI4*f2{q3W8֢r?Ix}EǵZ:@ծg +:ڟ@JgǦlaK v+y=[x;X! +ʽF4L>|{F{1xxÄۣ{(KewG5?{wHWc Y +2ZO󇉥+:x;h"ܟ—jC2_-y领L:v'5dpz _5UIVͬ>zarGhyg(FWrٽ z5iySv԰aPÊyLXP9&Q>͘}gq#JV/ɱA^>v{-8>-bnNgwZxXyN4W-Bû(F>92of{Ʒ $m^ BVOO^{x +jupmW[h3] (WkWGl7q!2wb|nlk?u}xv<ӏrnX7"Tٳ2bqZ[593ޥv]!V/{A~5oEE2LYmޟfRggc7`V3?N}myzתz")˜k7@\/s̯jn<ށض^V~qg#'Z{ڻ~/l5VM}Y:VכkG~M9,Dc}򏹯BK%# Է,IuT'+ؕGfHnI퇗ky{uZ͌Nh}Ix:T⚊oٜ_c-Cvr +Yx/vꫜCzYb,[_tF*NqDb^s{vO2cަ{v0}jkڜ4nH *0Ҫ/tKˑ6h-y[_|*wgfnqɚ6ˬP;U(;Q !9=Nut9g*Nl :~j1Az՘U+t-Wy0jd^ٝxVt'-FJkkcӈr5YL𐡝'%V}ΙqYXr旲q5>)ڗ۶“u# +]]H 1!9k<4RBOLlIʚ)lɝBʰKN3<##9f|IևZ5P >u)\;M_WNe?t-a CN]p.Y\M!W3bb F…ecVRco]|epTi}7Y.&Hݿy| JdEIbwxa.]EOzK({7d묷R:B _/҉^7ǢfGҭ=4<$6PX}@B*>$?j!`WC7G!kNZ/fԼ̃8~(P'{JEvs.%-p36|kJW=mɽd\R{pg_d;O<>+z;5fNTл[해r>E}1[(֌8"2HOfcX>v;ȍƿkկޞEM?IX\ܫ9r\qx/iтJ9w_f=u?YB8Z"OƑ$(=|26oCB{V<⸰\XkkxgNM1Gku6nY"Ku",u[*Lͼ]53Cg8LtpxZpb7 qi5#a`8 ǚ.`ʕr._*ńD^?0RpZ8%$[I_$~~HܔVP=-bx-sV-U)f3xVFU',Hǟ|cv rsbۨ)nz*!{QL#o gky@jfqCs]l5DRk͹/ ~K[N Yq d4Vopϣs[*bwa')n^hDnlIכAUы G@X0^gHFϭ9Vm֪p?P[E;n%@\Ȧi7Y\I1f<ը$Z!lpso]ex, amp Yx: +jԦ [R];m:_|5yV +-ImW޵ v;/` +㱳ڥ6T Vz1=re v+tV|~_ rj +Uge]K9zx+f{XQUʰpa\[|}Pz tdRj1>./r!RSEvNEJʹGݞ[!.SZDPsj,^-c' [5+Qq#T=IsFGM;?y&vF js"͢/5F#oq5=5ͱ0 $/󾲕~tTFQ}]{.? +߁o;Xƣ ]2lZ ~2Z+=@vڻ.UƉE?扐-.vF17B*Lj4[WMg:e?,".0+ 0#<`)XLm߶s v 'iB#e_{bwѽlq[ b7lXE'lGS&xd9rpU6IMY^pH[2.K=9w,U =m0辒3J0?h%W+zC‹g4cMںmaDKd/ݫ'++Wz&[<rW{;[y6tV@WB\Metٷ\tӳ-a~0׬  >+J+ /M:ֻh5ϘXғ7JejVٍr ^ڬ{{9lK-pR:مp;'p.USC'ǥkQNV'iYtm[ԡ)˩wtvM7#kWjӷy{xiWϗʠy.SmϪ tGSKSU}h  ̭0asnhCE(}4+Jya~D{a4~utrå]2ѽUo .G>Le3Yqu?x\ztvn]lembnR:kww@&E +:?RaA!vL^M׸=GCT,]vgt㟽FB07kt5/#{e*/:e*Ur-O/:o@^.dZ;a{opMeĞ&׎Ջ~]lg.֛&MOH7éPLrcoĄc`$ r [e?|_ϊRmIک~ +p{Ch˻}R͎h~w?״ UX**gti#|j1FU~Q:.+cf?EXY6lJ324uf7YfaJa#d>\yɏYm:r߰Se']}J5#rj`Nh\0y)fҡ>kTBVYr`R6^~f6e37տhz5@#k\ +zdO1|Ҷ~Og?nmeS<0ԯK;x/$n[yg :puЖa莼O &9KB9xB*?~A/$7k7B+?r=<7x,=rnb[n79UQ;5k%xz}SH {N`F ұM$Te0eh#/DOMfi] 3X Xm/>R$>M=^/?=ӺjEؿ3%$Ha/M01Gyu@F&t8WdT/q:VTo Vˊ<"Q'` dz["Eև&xj`1O{Z%Psvg0GwSKla>:VV㳟-5p+gm<Š|?Ai/3aګN>~lvOCٸ=-G9{[PL~r/_CG^p9=Ι5w\ܯpN>10^*߻T왰~v7j3^O K5 +//qHgۍ҇Fѽg\r.9?`8[}[5Ru͘͝3 L^R*A/v}{:Vڒ'F !6cX;J)\AL>o,3bL(uCMJ,׻T‹z6&;ZZﻟvo,G՘t']x֜â&+N6nu J%5W\h;~P)ajNTiW~"uC{oтkޢnCn- mUlsEx0=fݥH]]B3nD{Mv]NtT5rJY{][Ðj"]Qt?hu|)Nj"4̙gM KV1xGC\moE}rcsF-kc%"zVB94ͰY7}lRNҗ'NlpGKmRkz.VrFy |ϵ'gj^N@{{.0g0e{Cd(A-ApkFW!͓HOٜ>Ht=/ʸ=~QEhX,mHq5n5=n)w[!7,19i<, +ZT][$Y"\>> Uڄ=w7#UgZm֩5A+9Kk\^CSL{s/LvbSa,st'M5w]Oos36 e +?{bkvzVIWt-u/m*npB0{qQcŨS̻^Mb| +7)~Y{}J A;9O&~43o^]=l +eD%V;(Aтr>[`1O + beL/6q<,ɮI&߲UXG* +l#p:pk>VM(TMhrк*؈9,2\sKET^ld'O,`AɐofHmH?>JA|d8L +Ҫ@6)VE~ + ~Bƥ~(f~ orYV̴ ~2$>JH\Rw^EXjD"O7"|猤C+Ͼ,uZ.~kGaGXggXEԘDm7~'Eartdƫ$O7Fu* rpBU @E-L\~y&Hk%.KT+Bm/i8闂ٽt7$E" B_mxC Zx-sջZF? lr/tO],`)pn?~o ճh* ]@[PPȦ}&XK}E*Ȼ*Xtw򐈨spY+ԹKc5EcHTԹ\pXN rw,ปh~^td1`Jt;]+NpW/I-(?7o-3 u=eSxsK&բbՄ>g^ں_PJ;fmY[1S;!jN׺}>;]<^:vgB^l(M2tV:Dj/h0GL"W/T7YTxӶ},=q ߍ7T[1>W-;wX+-6u0wUG*mp}HYiIN/N6֤s5,yp'EeS ;i ܤ[h mt9œ׳{p/'-zDžs(Nnyؘ~NKN[W,ZUnr{?4aax`Mw p\v` h\ylIt#rbǃLY4cK|72z͝MnҌ7asew.~]tܽ߼_>dy(ZO7*V}!.PS[]izjغa]PnfC{RTJoC>ىuAr+m= 78.s O[?Odo*ݿmC OHl{n8W^DL:!$RLQ:!?{ƾ?KWלS2HZ ++TQ{PYz4};P=L=ЖKo]gwpf@r ?a.#Z"=N/,Yid灦QJ[VR$[ R< PoD;L߮| (j䧈Te9mK*$ ?i8ɺ +'rRʞ5kS"+|En JX-7~Q{9xy /'g +Սo0S$mȪ9R@7i xT$lI8R]X΃w'ST=_ҖE;cuC,$!F0b,Ey:r)hƳu(de SQW@3z[o<}ruʈ ĜUyj'f_W9DZ{_&@|v*eN#_$yE2u`Ҳ;ols, L.OeYKy̋ |RxL~29qpeѵ]߼rA)C6P&^hx7>KWZ{Wţ|D<^O80t&U>PG.QBὭ$n;` +Fgd~x63툞b~H]Y]xoEGAoF5J504ʝx +mp ~u.gwi +ufLmFD)/룣 +JL]-<+ +yk}hzv`}͘jLT`y-e{Q;/),[ Bq!܌BJZo*2(:unjdO]->?\H ,bGj(΄*{lolVڲK+?^]#*ނG->}7߆q>O Z*"Lyz_ < Cp:_5do+3*ӊnic:%Omqqy]b\bB>Ul! e1vGR{ ۽-P㗧d s|8ܗt7E넮kjX$PN&3;l鲄Mbx Lxl(g 30'RYPZSP{ݍ !*Lrm )(zWͿL-eL$ѭn,&ȿ!!ե89±*TOx_y_<QE[ I.UNSDE?7|; )8茑L<"y6О:rR]/a8ykgһnfN^Y2ŝ h>D庞MZ…*#ZD$^;Bd|jmqب[8px|F S-Ϡ+}[VGm?C_;)yzUN+SC"2/|Q͒ᤝ1|ȡK9$dxhy> tdƖy]9"?zT=Aj?+C |8O;v}4)ܕ 1_ޮt2*|Ř|l)8_&z≟e^ʍjxUāhC4)Bϡ?CrȎڐmVqW<=enKgkl>`VfR~Q3rSWFkOnO +b\-j-ݐy1Gr zNp5N`H}y{Z`MmNqv>oB;WGnsŊhfӱ78O$ 7I9{xbȇtͤ@*sjORA{c%Z;c;vǝsmx +9ylzvMnۙ}/QXlLc.Rs +n| hVko Q׸ϳL;V;6w;v;U:U׽nnDnԲ~7fߚwC~=⡹%K;յK؏i  J\2|~ݒ1-GSxa½cNtˏTcUK)n6Gj鲾I6)l:5tޕRXG~ktQkFX[{9 XZӭ~J<7cɩkU0g^)7+v)HFhikRq7ʳKEj?*pBSv^\V!l,\G#Ǡ{MalV%~zzFpb4gK-LXt3FzGos۰cf$<sQ&vOcNÞChWi7,تɰ6ZN`B! \n~hnXQZOۜayۃNSZ9\ԨPȑ{yYҬiƁN-Vc9M=򙦢]LSӔ9}\_'ljIgTJ1t>֢toG*\" MBmɬq-RDj~/9G{O|\}[C^݆9ve3ԭd2= ?̀JP9a>R=j- EQ n%D+ .m+nh^oj؆W8Ýs{9*aEw:g@dUE +}G/@! 'X^P0wsQo^VͿvFk0 Jh&/b;'zV22+x8;v`z^ր/(& '+|GVܥhw?ګEo4_݂% DYEh~CsTqێlڞEى%M&otqCM4#*sa}ctB:RT!+47EJ쓁Tg}wZ1 \xF{%,l01.>݈Zzi+C +ʰA57<qVo.N]5h +;Cg^V-hu6 4VZl^k??~}w%:`/*99)u}U\m pizȭyh!+WIC{@?O?<+,6_hʬ`_>[([g+dHiq}yu,Xy i'Șw;`>mHmN-/4Jd`iڷ~3.Xfd_\xR{~CfWo4u3)5hJ+NcT/lkK"VY5˗:۷1/ #Ք~YFlG#*+uA{k"Փ;cOxjTڶ5e%4*ۚW햞2+;c/wvaI)~io1ܨ:IWiGk,@{fN/8 +ۍ 梽ݩ~lUX쩶eh>kҡD0:jmK,.Ӡ11Ѭzܨvۡڙ{@,_j!ݤpUYUAN9)Cj+*G}IY) ^wg@ja&"Tc۶ +ϔ}izA۵w;7WVW*PT^ҙ)%٧\HsJΣk~w +ydZr<3mij:c*1(;^)]t?% rYkl#g#ƴֳ՗ZURmC , ]Kg4f2ާjf/ZYim<.o7lZvhmF|4GQRFXR4 u'I=#6lnHOPg8&A̓%gjCL Caj't8gbShl UlpOx]u{yQb/i`86{nL0$^f >b\FvgUDhEbMfSMO5Y 7Χ&;~&m}mOfZzUփk 1ap]_$YU!%W|o&d6Fe1ÉᙎUL&u@~|`-bzdjcIő,EoɳՋ MTvQH Eĩt'R ƒD@0hОH$vE>&/@%xT#p!ٳYo.u]NI>Fqz [*ڭbhL`8M6:&ux\o>hKMmXy ߓ9| Lģ-b݌ʟ j'2o}ͽ5%9wߒ!7J3;Y{J +]eT$2=& ł? +uDwlAc:"ըZo9r/bbӆhwX#Wѻ z-UᇺolbۆEn7]gi|?WItAR< +#WjCM܀oF sv;^jL #bEu+NP ]95W`_mn}Ǝ$Iix,A[A39"F +e$C-e˃m(e#:^v 'f!??N1%}蛧JN7tәRRϰ =CRMd^0^[[ t(Mvz6XY܀]U6e>ZmnVHn -u_uڋ?ɠ;4U5/VOٲoFѢuC5~>)̀wԟ¼C6JM.~mcH֨Vh貣YWBě%}/J:D׆34>rE[Da r=)aATKgtg\FhqJV\ut~jI4EK+W ϫT h-0f9 1D^rpa|\IS}.#@bov +^rgΧ͹`i:k9o?mt^3SwSAciN5ߧӗ*e|%g6N-4.ijCgEf>*bsD=s'OWINRc9GVY,Ty]{zfw"Ph7{:=\F09C3Y*FQGαL,*)[!%UvE4cZANrfk7ٶ iV4x7T# }Čɻʘ³uA>fҚR=˃UEOI|^@l~Y:㷟\O󭤙o +Gڜ~O]ϦN?z^ޫg$lxpG  LKdDPpp w?su?u>q^{a,9nU.ateȿiͿl˥y\C={JW_ү|)řfͤU;qQXOSpI voN_nn5gM{\Yv|.u⡄dfon#ocbtc ߉UJ+Ə G89ĿTMo<翲`{o"T>gjyqWu'P{*Gږ{-YV[N*u7o~{/!f +eH<ŰQx7l\DN/)a=tj;I1Ιmoֶl+WZ('f6mf^ Geg88_2(y1-G|>2.ީݩ8}wd/ϣun [lṄO+|ݛf1{)_G9(Ro,)Ջ-*[^;+/׮b H*JV>ͬTo*bhnXj u߷YҳKZbShy9l0c4_WY~#JɛvR8eq-nUf+`Ozc_*~HzSS ߫?2 ++J2?{U1ֻ)A(ίSvѶ6 4-;}8>+q⼅Vn_&+vhS{M2?ʰTG2 kiUt QC@TNxA^tu0LO ,^7Vns}"jIjie4vd3M̂8qXCavݙi<J?֫]+l{ۋo߉pְ:^)8.[^޶Z?jp]]G=ޝ8X`ĂEI;T~>HrW6گ 'J-Ks +ϗ*zu/@w~1\}qYY{U~}OT[- $+_ +_kvqeo:י=vkˈڥ@tAsӊCV?*[@^t\Z=0v(9?̐5@ ?t +ìSBcK.ވcv{s/%4#><Ŭ r:}cMM]9S@?~;AX^LތT${sfq"Woj;`qꛯUfip|Z6Iz\q1DeoNuU O^% ͸%=9llg{NeG.yok!y7gFHcs^UJ7/\31 ~.jA3ʹk9ekPvIVFoqK̹GG2tb;huYTN9NR= ^7̔؈zx;/)Kqr񬽼.C30+ AOהf9Oz >:?O@}᙭fNKD;̳g-ѵwo+bh{uj%/wSy"&ß_GɎ*jsA-,;u\ ?dtmbb(l`,&UXݏˉ_kn>_eXۛo5o/:9)Cݑ IxbIFMX">'Ֆk9"+7&[ .rsη4zftR!1Y.xMt`jy y&Sƶt-9FZFŭ"E 8N-T7TmKi`anIG=X4+BmHʓ\c1rb&UehGFf#/o;"=Gw!@4q 6nH\ybmJMB)"]م7JuaydiWcɯkZ[ܔNTQèg}mGhm,kF'/-DM9Ǜll%mZ.-[}T{|j5k(yepGŰkC .!7K/N)?& | `ܴ`<ڴ1\{WH442S}$i:-90 )1i4S)n{zm_Hztz##9Cc;Y?KT{1`>D9'rNDV|/6i:~~k/c: rnY㰚맸egM_K>zIn9??:N˹bxyq߬Q<#W"- ^|6k oܵ4u;y\ZtfQGl2m0_W =uߵ>飳OPQLDtY>DZA spOi̹k-.w;lǾ@Ey/?/iΙ4v@"X;ݮYohiI*+$}V;H"p8T>vO>.(Qi qj.C;ZgwY{x5Id=ܝ+._G[:N<@6~Ϋ}k)_֓%Y~D't*'x#>r5r'f6/Ayq<4 //k[P`jlN~TwoC^.{Fhݧ-(WK5킗{}иq,YSCbmjiK>ɻi^rw s"+"=[5SQGDTW HXmCZPNT_(2Xyt,7Dbׇ'Wk?*4Sr<-͌eձX ;ϵjk4 ¢|"l2u@ƍ"<{!^yҺXyjr)PWPV}CYTDxv)h6YSkӰ i.t gL)I`u_ &n@;LAt(¨"zګ<73jL9FQ/篾lnW }Xȳ6Y9s_DYdɷٓ=7J2?ds,:DhHd~.ΤïV7iXQOpMjQR* +3-%1_Gn.A7{L ˜@@8C=Qaj(Hbp,mMwWmq =LmE޲¥ۼ>IO*.w΋h€oقW<'hXfҘDb+Bt5=cZ*irMKUDA_W/[vb?9NY}5k둒t-^y,La Njڪgfo a>=C/xԨi^e/'#Sg77 +~T&:{v{ma1Q+L%<{T$W囪 q|A xBo}A\YfGyfXc[Պ{]DɦgRyjx:-#|3vQ}8aZDó1fpaG#hv." +²Z2Viu]ǎx%]"nUsEN:''}kp$<9H\2;뵢W:$߅Tu.3[M^!Bڲj%&[\C B>8Ә~cyPtC%W| `͡AxL0(9x}K#%Qq#c?va{ j#1` (E PE|[N%NWj?!@NH^ +8|Lmɔx_&O0[`E^ݺEw1o=h]g!ƙw ##)=Kn`*2M۹Qt3S%Qr!>I8^*@0t6Jѡruw{*F:̋ Qh{WR+23(&@35J,~|u4 '(gt]Qt'F:+;JcsmDC;rA66;$+܋!{>ξ_`fEuHo+U{YJ +''"%}V:ٺ>`Ky21 "'^ItvUWC ibm?J#|Dظẽc +fe٘)cw@Ht` |J85ggCb|wLațmR^K*qMk̍rGW .~}*θN:Vs&Vj\IUO}XBftcBՋa*|!kp:MTkLڛСҩ +?`t~*I,c+=N"c ^mzuS mfg+7[.*VbJv}׫z)h.s"` +6f.="Q9L"iAq=w~u|PeжνD_VTbW%g G;T~]1_OIob&#Id̕'B@ԟs'%y\5|xQ-3[~#?qUG#uLAȰ PY޼V44SJ'ye$bFWa7[ϑa04؂>Iu^-]k==}N=?tPa uV12uqPy$UB@ҭ3mMq4sCGnV#nT"#;{3o *]/{MzÉkX'ީ{uͥ\#ns1Ej0Ifq?[y$b0y$};5 MN7b;YIp[=[/?5@G2 vv91 e,/Q/7b,w0w$MBsZeӼ'Pu/{mMnz7v +ncrqj7 ~9J`/:]uNwg#1URia_gķgs'KYnkbߪxEF(ڗm\/͊wCL-)('v}upt=0_|%?(;8foPX}Qo<dcĒt endstream endobj 30 0 obj <>stream +ZGTanrR:_{LEwtoY +JeĮ15p(qX0E >"ӽr;w WoגZښ5AFMck4u)\}JIAIS2s`ѭgW<;S+w_}w Svm,nV-8y]h.~m /X8.. H~UG cZ>}E-5:uퟩ-=fb_V.[}<6l_#v[ʚ(bȪ1&2%NdzbKƽm4b䞭/_QH_I_;J᪙/ol:l" 41qC +6NO'冧cǏ0|v$D9[³cK +h`6!s[M/O)w +D"}S~JF1ي6y_K~aԅu{^J|<zQ0XcޑQ9f|͎3#8|J)m2{=&1ʸQ\Q_T ԫ#}B1/\ispsu=Oisʽ~f{#4\_kc<x'l-%_{e~liFgtƑ4Ȝ תV>pj?.K ms%NꍍӬ%|tޱ,M#as[>r=7DZ?a@HaSnlk ص[=+|;zǵ7~ A7aE1kn\hn+lt1ٓpqnkشmJX:|Un`X~QyC0DF(~wC$z3{M}-[Wǥԅ/رhܩ=B A5M歡u[)9&_oM +p\)mbJC2i'sW-? {X^pz`ޱB#D}zuo7 6) +Mk 9< {˘ܶ?ȡ>;M^z:D--~vF$]X}i{a6NҜfd(qYQ{gH>$yA#e}δpV x?6`m;5dfΗg}[mh1:ӗ ,F{2xB {ٴ/2Zcላ܅X +MŐj_*jvkônuwӹP7*kZ2VF)9;-Xɲ"}j3KXBN8l_Kfq1>FOp В&TaUQ:V7-\[Jos(]SHIO58c-3Xҡ:Y{LmI|PaG'_{Ű/Ceʅ h} It5ڻ\ +>~wiۥ1spaV1)rTJj;E)jJpb&ZFj~dEsF9:QuA؟Wbkn)yǻ5)GYgn#7Ʊ:+y%AIU5]Lօz ݪRسcm~7s[CcfLeTol؃'sB!3S܀)O>PWEm9={ 5i;_nxt,V89/WhsXMe?ѭ,NDA-3TtF~, j;xmuYc0׺`(5Q[`}^s۴J 0b41&pfY2MdХ ex3>{o}"ӯI˸?6z/I%s۰&ejzQmX"ќr(l;Do}-[)rTnc{,GӺk%׶"j1W1 ,'&^tE +NVkdpW Xx$2; }҅=9vDȥQ0=3YmǬwZ ʵ2jď4P6g5gܫ'̌BNgdgT2a O 2tSe L>*uDrD}[5 jAU_*@*6u.XY1sY.;D[wk*A ھ\񳜊؉8>U`_MPKf]ԈkDz xkP0!r?2 RP=Ŧ/L)Y`j9q63JЏ鎖W6i{ʿֹ1%t\H=AB̪DPfUl cBs]devPI] +ZSu u|;w#Ğ'ġ돑ǨK׆So zd0}oJt{1;o<{8C6T= PQɘ//2CP P5R,[ŲfPy0#>ť 6sc,M4G']zV$*}ʓQ~yF|W//z\U->u~=J$wF*,m9 0Wdg veXv?᧻vw0oʣZP Q\ l+Dl; 0{ BY͓` \(8mx |N4cϸ~Ryۥgpd.݃2$"B0e(å/R"'_#1Y  +mlgMoW2>  q~ƈ&߀Qn= Ih)/EBAwTeoko݌[SUlvVj^Ë 9b:8L }Darʣ X%n]M*j (~o(]=W#OHb:K>+Z(l] }a\]y0nk4mk|ζ: f ߌZ~=l#Y@+wݸl}\ =xxLY>}?h_ϝ?5O[6;,obYK\+Uԃn9W,CH3) lEƆ89 k>j9Lwj$r  8i&uT)髬|n>3{P҇.رHWqGc{f}341ng1i? Lup=N$]mxU(Ux3d.85`%[Fl +sQX]Ռݪd ]ArkTטs4>\ׯ_ o?\cFn]krnnsJP6o6Pm<'c_6;j2Tէ*nFEGS\Vk ?W1uw`?gljLZ/PRF!adbAA{n(aOfX:Ѩ4Z(3G;>qLe#+rKR&>@mH5Jnd]u)uo<&yVU!b[8q@W58%c3AS݆r@Ki)O⦁BTxbpt(z6h$,.aF(4;a]apg*4p`3@ k#δ!>x*]Gg]$K`nfڔ(K5=0g}"[aZ'Ml^WK6 8^M;4XAGEnASD SwkN4o USCVWb2\fC{`|쳂3a`oTQr!bWcaܞ(*Ak`袬> i\#zGֺPg.7&I=cިS>0n>Ei'k|kN8ww}T<lOF-J~5^kE& +iv+SU1 lRcz*=Ykcsz+@ +{ywlv!;~UFz M4=DT=gIZyj&TٖjZJݜpg5aK]nݥ/bY^sE)ᠴ*8T:c$28^,Hu+TY X"WuѫZ|D+_$+StWqMb.Ea[y>E r[Ƶv5hL 8{!H~ +Q)CJy{A5q"}w{+ 0Xd 6' ݖ7| +`ptp^ lz!*Y#cTV'T*]9l\jkib f38sv扻d .NnmDMA~4( TGo߀oMBX}Pr +~|NUF`/z\!{nުSw㊌KsVϗ8gKsV'v9|L8ŷp y}mZ?٢e|o8rr2? +`qW͸ϟ+2C;?Jq>Z8Lc Sze{ܪ޾0;5-k|V2)~Zo}f|oتPqY~N 纣rEڭOwe}8v×aZO>{2+zǬ]du{f'uRe.] 0dj.L2z"\3}:o흿wǞt7}8.{ô6#̟[lWsIKǵ[/k<>̧+j˻e@K`1n2"Sz!A pxnʧŅi&F䗢"gV3j'gj+#TfvMnlv"MV2.fadq2 +ŧƋ)UX.W> D<JW6s1=C`{"?ŏUx['m #,A!u~oxVuaZ1;7H*SlgrSz̦GO/!mr5sށib"k07V0ak4|bͼ)XԛfvM %{ݜ E 776;C<0F = }ݝ0ޣzܥ^CT^p7ZmwRG'cB-̕|Ǖt?; +W& f*VGz 137ТJa{`i՝S ׇ%TmaV?pԑLNz!|Ѝ7DSDkħM&&w%fR־xUBK6r8WzC{&r=2Y{0tzlnje>o>l&Ϭ3ۙgAZCK]2gCҜވmҼm =Lʩͫ+M{<4^ȘCr=f\XNC{a鞍;[9][.}3G`HUAJJ-ʵ꘬}< X6ܥ #D9Y凾4ѻ[b؞,17rm5=> \feׅCeh _+~jAT )U%Oi4o68sRy!5QGl'XUQXUs$x+1fxoȋ5=錪L"ys]5^9֯uoā)7  {-!ZuW똿ҲkrE޼Y4W_-qaltª΅%[Fjn%%)׭V c=Ƣ>1.~jG;Nm37`g%Z!u +?%e1CwۡopG0ޭSo[?Xx{dAV],A?xfJ?VVkh{"Nҽ#$!7_N˥iXɤuK{ƋU-Q {%9NP{| HpI#F[-hk6DMtL^DzUh( 㥜TNX);v!7f|h7AW3i7{~g񔊷Gt%ums҃'p׳BMl;rA5C0NJʔ,գXV抭!ߝD k\#S}my/uk(7U6G5cܐBV@{/&U2߹ Gv%Yw9QA dmM3X"%8 ttv-ĭ X6>9nbY^AkܭɊ%5DcO<^=|Qi˕)E!l)b5!5 +.-'vNoq[8RDaI! nu'??33gX% IUߢӘR]JtMk#xLvIdrBړL.{] JTOw7#WR`.sbxJ/xzC/ɝR^k3Wdp^?~<Tt AdLP 4è+Jس\Zc&&=a}cA* q_O|r8|1ѫ#Qe~=?\p f{Q(XzhC|X&;GQ[cJ.5f7Im3ʒY~5uҨx=bk&D\5b=fyAoM<2j{D례uis}@mu!j`Ҁ2%0,_Pv+y1It5* MÜf=fDyL:Dw{6_۬Pϫ2/B l>y} u0OPU0V ˕*&V*ճNu/;@\vKڵt1p7J'zޢv?FNRju;{pڧKcٔTƃ78&:pz[k +';bߧn =òcMM<,^Xm6+fV㦴Gq +jW@9K#`s[!JTmIFB'\~1f#-jbRRgxyhAF={3Rȫ_ ^ʡp3АMn;9p^x,Xvl*Xג2^bV[~P$>19ec1e[sRMnH!]}W:L@jJU2TaJ dCC +@02@hӲOG/@`84SUe=K]\ HkZaz![XIe9g5 i 7$"G|y5 ઍhqyOY^z ō R38nҠ[2{dܬo{ MuZ- gx&(NЧUӃsjǙKY=nJEa6)T')Rf@9E 3 cPal OeOn" F]=jK WҷJ̴mh54Ixʡ9K:O.C/Os֙n, +"REEA^QiEP{5k}{?OY:%̈́Ȉ^Wuc ڛpy/ 'sBuS,G?V0GN6Fz0~BC{_.s-[gE&ep%`FzrK*_6S^pq@bۧ( _] QxF|UF2d?xziһnʮNB"J-ݐZ@S2󥮈g'׮eO9%Ao,T'Cvcf\DCQo[q(*""_-%so\cV=^bv4ptl(!k^> +!kWj.}6F.pc볎lx-Fl.U0hZUB)߱:SB93hb]ΗZu|JA>鸀C2sܾ]$XdFGfBt:A?VjGPΆi0,mVsVK͌.sYJ߁R烙0KYNI#C>d['郱ShGaZ&ivQ?zY}d%'*e~a-Ek9G֛@]p4π<)n?G]x|"Wx|1ԇFz8EAXP=m>}A_ɷY`"ETysdņ]Ͱȁn!4)7=O<u v/j\\&:|:e ;vevJӛu2?~983pΰC ;S?Mє=9"68N`/8v֪)SȅwF8z^":wI{w:$_gZuZd\ZU_2tb}ƟD~z&jƭqPpj\ɥ9 !J^+2{'} Yt[ׁ5?P4r5yW=na׋h&cS3uIzrNn"Q,R V+hR kƀ3]~5۟uvbG>f&f ieBw>F ehFSL_SI3ij;nR氻g0^-۳4YjjXmS5i 0g3صG@vN?>Nz+ڰ5%8S,sv)Sh/3Ir]>j f5 o¦?}OlH笢 9DͲ3$;cx&#mK?w]`LF`qV'l!};Dחn&L;{i<ʷm_^k; g}.u}l+jkgq`bTgFnx"5PnK;ʽ٤3?eJaF脷6R]3K_999m5Kٱcj80鑉~ҙS#\Z9U:*p7*YpOv([m8:H/-@ϛ7\UDzpUPq`nK +]aK8}LvX߿YgxZᣢh0{'BNB/5TP9ijO;\v[-a&NdcBm,~mӺn*Xekr5sdS9Ex}>AM^k3X?!7TA&ۅT5 UH}AQ<طKKB}Vr +90Se|ZB-OK%Woim3Q-YIuI]'U ne i( pВYV2+õ֑ 9W7w]C~G~N[%iXpip󨋕Gk9wK?PmDr|R-dH@pn 2z+p sz%GcmM͚s(Us<ȵURk{u?բp.H r-BW +Ġ̷iwnD憗͂Cnu3fI,Oԭv^ĶDH`~Ai׻y2œl_Ict 9&ZB论iNo⮯ʭ +g{@dbYmd^7[::)z[:)Vz +~`nɯB ǒ۾Z/R*@էAg][j%TSaL̹^z|='(p0n֭] *\GT? TZcd4oHzK2)ӦGĻTY>V 5MX^+y9x-0 1o,rb;R4r7*&9j-?Ti'ɭٮ8kN#L^R,˄u? +?} +82bZO +f޺wS ,~5Nk4'ZvnUaF蟑PK촣f“pGz؊e\a*K@ǤIM҂]n&i1WdYcs!A>ST=] e4#d7>H2HHMˡ,anZ}0vbW=> U+MXhTe&L$~s$o✌Xz+o\TmMhrBiytƐ"MHe~*}_% & +}B 6xć(;xS̘,s>|Vo^e^cz5[33ْy-1!6pHVO@6/9@H4Eyi#91)3@zB"|r*k( nJVNM@bMycl 鍯Z\yjdj 2 S&>q2Bz 2@ձ,^'k;PJ P3  O@gC9fꡯu,=q@Miտ 5@=zr(t㣼JHɥ:UmAkkFbB֮K-Lf?*WM @鑭G;vE@-@p 07|ݶ̄Aɀ9-`WM&6SX!2ںu1S>Ii>2Z!ƹcP)Rs(n@zk,`zwo񷀣3ӬxL7/|_%6Ӧb^ḤN7oQ>Ǡb^:UG![nk]kï jc +8= Ϝ|}A1?@132 Ġ`Ц)WVlk"Ok>-kd={-/! brS/WbR_}V_M[x'~O5i!_swi,-]ݢs&W -Gÿ❍=Y$>ѼED^c3XdsfQ|:z09|TuA{/!F}"q׿-.웛K01;Y'F|XQ ģWza!G+}R" Ϙˑ_g,g{h>x_LwjLWJ_oKf[݊yK*EFVAz㑴T޻"syԚHT̤cQBt{o?XG>L">/mj^ܳq:QQӏ+VQ\.fEXM x\ZfSͰ-^J| Z>si2<HSWr_S9$um^Adsi`M80[,..Bۇd e9li3lGU6ҟi2>]Ml;o۳'=IP'Ld9uhzYfQJ !oѓ3F)=ۋ92؎羃F%1mqD~Em_ے*I^vu aܣC(9yuрyi'^FFa{k{FOQIcp|N,Y4>=[IZLƋruy(=UQCjWdl` +lk&]SNd5J+'a*f9f2+org6bHN;\σ{GӟHl_U[F9 1ơifٻc&aĽ ~FIrSVڅ<8~*DU!:8 @IpH3fm+ìဿtg}]Akxj"W vͼ̤% 5㩫=k&U空4͔/dzwVMub>4|Wd~S_X k 8\迈M۞!7ZgehaܩsUoS?ռvԒ6p>X?Nmkcҙ /=pVifk G򜷺Md&և|4S +u= 3;:挞sMx ZZ˸0SgTzְG__'vv*W]deRfYӸ Trtۭ{[imāRi5ӈu`Ae" N/ֹTȯͷC]?vW\aH-{V acUYM7cEN핏!C߭BȶTC51eXWf^k\ +tGzduXL"O6Ӂ< +sYҨ,uğ'⮇ŏ/5LTh` E~i撗*^W~N'ﺓv,[1o?PrzwyƥԓNW*?FWA:PN,)Tg[*J?pVUN0vȹ<$=rbY2ΡF 5xo:lwcP6q) G~]N1Pܹb.6Z8KWTOjRR8ӒMȉ(zE2D4CyraV`=&c]Cgfr dubm 9dwƖNϱR̶>+ʽ`٨.,ͩ\k,[[rZ\mNsP>nJ*nq>Ҁb +:OkV޾sW6xʙLyJ;Rz:)ws͸kmJW 䛢oY^&)Hk{;M)~Ԑ֠6iSKf?n6"zXuNd1%Qu5qNFRkŽ1ͼ/yym0" \vi8ڷτ?ӷFM%|gdkWM"ԉ(CTd9j_{(X8Tz@X5y |VXK3v\eod%gnG`. +UZQ(ϪC0jscՀ3%6ӏOuIHFˎD /Pw|d&noN3vEeYK87"?r$KQ#*VNUt % }I:E.PhOv%=C)0ߨ++5B&+DHO'^,37]^ .&D_a"p3*CW&6T$JˢkPu"n+BEŒG ʫ"//uw/]3Y;f9^iYz(?P=CHVe̒rn/; aWW04ՊXgehv4k^H=ˡeyK_*~ %WO84m(pEj gfotM0V$0xge +st]fl AscBT@ +^^nxm suvR< SB0dO-?.Ӽΐwyw6Vpi@Λe߿o}wf{8lYԼאY{WV,^Q}!&Qxl"=0[/S-pb39ʋז\߇2&/UflS-Sq+o4?ۓgʅI}OŚLuf2}gݨ-G ظH{oK$Y9>jιܲd/jI b)n)v66 HDl`z,O^%`bӰe~;Vz}MFVsJSy"RG .}EPH\ePr|fRpx)V =? +CV* oht3I}TVMeze275*5‘RxYpqHPm"a?Jn6ť IPE@~ą} + @$b?bB3)@xhwoԞZUOmSxVSٕ+$|bM'N}uMyfWO@@I  +"Z -@9PXjM@gJ=J.ŞTM7t޵yܸ춡tܿ# -eR?&e1Փ5&PGG.VP h@W-@s00C|C= 0SIt|z;|2u)U6:׶ܟi"`b4ʆ?i^ Wu)WJ"g0@E~q_ $۽LsYn$jkp=^nh)=iKam@ZMһ !]o/BOnL͹zH#w{ ZnmF[lO"r57davyp?(T^I9&( ۽>Y,}D#jޯ1:}9d{{ܾV3XXgͥ%pkεWQN[.{9{VKg?u:GtI,nQ`g-0ua{WDq׺gޕޝ6؅cmX'iiuROr{RG戚a_zVw2Ml5u=q;ݷWgr'@E7 shх(5W)XWYg3`ko]}L\Bޙk?3p%d_t/OI IgB2f)a^u;NÅNwuEá%;[Ǧ!o#V ~xO|s^Yk>"].vq䤧~I7 N6^]/#$zeFءRr9䅣_'qϿז r] 볌VV6B{)dlVѯ_lC}Wbx_Y=W.}&pS&Wʚu[+R\Ve~7 0R7%:_{g\zLT֥FmRxNZW>p/g#,f?ï?2 >K9€Ú;mscL` fi zad[WIv1#&pRy {ӕƫA#JNVrj`^gdn @h(:ldNlzdg;M 9M44XSzzx.vtuhe9'Tw̳ B,4=8v6[묚K\͚"wiꮤіuO1bhs?oszZzsZ=u"3"OZ˹W6;{ЖrwSKT3QLnV_ILY1Vm-;vpkuPSWbvFtMF$s~ +\j|OD=qp4ֵu nr3l +ݾ%-ct=s}ZԸTIfix{W]lG5w}ԷP9Tr[?P, 426-׹V.zvBs̡ą꼪J9u֫sj%ɧt8޵j"F 6.yF=[lZ &tŪsf (NMkVV(?~,KR{N\{jYFVìVIVgaI0fD|jRi=W[kj](-*&V_v-Z$ت(*7[YFƮ}Ͱ&{I-[ͪ{ţ> UHLDfoQZW?v-ogY\txt'dh%ۢcA?יuMtWQ;݌#Rls^i89](WiQc|ڤ0M +%5D/8Hs\^2m1(w86<NkV+9v7ű +ę] 4(.1 v\+՝eO:S}j÷B%PJI^W]bXUD$-a_\.cG39=#O8Ya(1B0Սd3^@t}}IѹjE=͢wb08\ѻծS˦:´BBj~5!A,Z-bYJ*^z1v8P7q>d^0#dqqAnxZj):U,mr==ɮn]$.oJH!8T.i%ŎM۵n#hRrmgw%gzں@R$,t-r#`'eܠyЧNaB*Dn !OejX#z * ? +"gݞ6:iD "d Tsp1eV|toEPe 'R.ԙlԢ(ޛ]]bDoF&@> nͨ +N6\'L.ySVLb ҕ+Ű[k+깣f֦uSgp(0U$)SS4 _ɍs[ zjf>q cC/ǵA"m0ص[%cb0>[aJrɦ[s^0{×F˯ydCp54o'/W%8'3t8QFT&%A5GѴsc*nv^^Zq}`V?NFf챉u2Sʋ[Ynt-_wAV_([R%i[rB91L OTZ(d%`7AbܸWDVC߲Fk~X|RMyhr+>JKݍ-ZֆwQoJ3o=Bx-"#I4Mjp=%kW rO]^OArw!iPF9aʫ+Ee*:opGp/\/k_vwTf` +L$;ˏ3KW@R>@Md;9uS\զXftle7Z %n4ö'G81G./\>{an +*8¼ 7-ΨBzHھw t czMV68[?%J9|WlNr K{w̨``O)W9Q( +R`2fxCm`rTSTTVT>FJW zU%{xRFV+(z=aP^Ews B <_>:9K㘗L&^sGa^%o<1"b#"0}RK ,F +[y.)۞i:Oil +}Xe!lǒV10.vNe$V ~]) 2e8@%DB{t 28ů /5D=Sʭog:ɅD X O˿+ە'@t.1 x',9,L>?+8 [ I2y*o9-8@e[B4rFRl%@ڜfwVX4j=ΫLx3LsKJr(` BsBP3Fw@ƻ Ph\ =Q@2<&4]]KVݯK;ha1\Za)N("ֻe;6;W\soe y4ʟhGJTzWJa#W=V[,`c&N#`waGu$v/d;HZL|k|p@KfӃ="YR^NV )[_)WEY!WOmG[MWEK{axa>B j@g= s?}#\:6JLKV7-Ӳ7?;4ɉ_g_G Qr#Y+aۏ$C43ru#"7>,zL]?^+׺:h]޾sff'loy1*n'۫S;d?n~bs3"CqJ:{ii+>Wa,:~i߮$D +=i=OnN>*Y+'7Dةi5҉S8ŏNԏJx +pʎꆋG0נ6ۗ(W<ubK#ߡܬ? WuO +A&a ;>iwˍt]FyP bsjӤ/mՓ^$I=sj@›-䐢}?c`k>p%2NV6g2_tO+(OWIק =XOg|ML~/Y}a}7lS-GGH|{c ZWXZ`w|WO>_VɓWm RV.FsRB' 'i2nfq~|g]8GQ,Ұ2BSrKvSñ6 yԧd,$mOQv5xJuaVVsXv[)*> *al=i044(qfe}\e0}$w?q>jBl6|#XMk0N[#4dt3Ns4_q>:vi 58)dy߅\xH'fsky[d}O/? ; ^YA +E{^!Zml׮L#сQʢn/\Onk2̍(dAQ&9gG,(1h}| "[ga?^/rw[xU=zه=>pٝ݉Y8Ƕ9|Ik4ھ\k@&r(wЖQLu:DO^[FĖ^Q_jh x$~g +&drd^>ٗiVJQ*sm\9|i9i8عdgeRRK]˶G8|6q +WY6}KdpJ{5_,5Z K?g4YFR6; +r/ǿT {'vHxV,1楞GXn+nS8ܹ+LG}h6ێ%d."_?Oos=6p}9Gr`=Sfvx+V +W$bvPnxk$v'aO3rlJ9[s/=c׼ M):s|8ǣ 2gR-oy?ic,5CIRnQ3*J]Nk".1ѓۊ[񦨝^,r ^IoAU"CI- gW._0%/[z+6}vɜf,Ft^LؠY/F 89.;툤]IÔ^6ḫuToc"/SOo*c.d[˧%}7/eM* +TxqezSYq͊3$.~ךЍpN!BD^%vH^y=Ile:?o6K[{G7+wWqN? K*/أZ' O63YOt >]x8tFؕ%3r*MlՖ4TZm\]gIPg?L7~lrJڣV]CD|}nu$ ?++T`#ݎ8S!VQ9pH`0]tրڷLNv_7xB~_q*rpcx޸w}O]luPt&ם^9SM]!o}’ >_zu;g+&uɧn%e\ʄ~nCw91fT<4#g#b$,|h7S/KD+r_ԫH ^-$0 n +:0$(R\IV]I=T릇>*6./%*RiWj)}CJ|u{:=[%{ H.Vw:]fΛ AR-K 2{ORlYr{!|"7\ dV7Y1!5elhC5(C)%>-|Xit~!E䌐+Q:ZbFd"|LX#>4Pv3O +Fn{(z7?UF(oI;^ފS~) 9Qy 1@3^}LI_nl*xnsF:BWqĶ>| +R7ܮ9ׂqޅ|s 'j:wq4VRΠ[>Bx]%ģn`L T7]qۍƖR9>qF}XqޙYr +~2TKh̘ YT3~WQ={|&a& }D԰_wn}TIuKy=DbTi&yޭ_L^@dbX;ΗHxA qHjҰs@= 2  kRdMY?o +9&ð}D^g@#b5}[3G˷ )Clh?TR> y{?ݴ`6J.GOV PnTTDJb!ThjxjT^7eo;"j(k1EDRZq ځlYwRf'~_HK$;ұ(ƺSuh0D5 е u.nz}w=~)<΀ZE@E=t{@: []|۹n/ˍ0|d9,Uiـpc'3 FmA2^!,`>jnռ+`(apۀ5KW|KtVy/{P9BYcO[ À֗I$n0n[Ofvހٯ'2ؒu6-M4{a[{B ˬ: Wp'ӪpȜ n]!My1JŦjW%GZ My!G ?cѓpG؆o7j>q@ka6@% +J@ FҸ|5R6n,r㭍է_|~}aɗfG7\_G_p_7W~Bx_m % +Pp(IoxcO+jk3y7k9*o//>Ƥyڧ,w-m ϭ~@0GSZGf<׫R>NGowHX)T!1(DjǗ[vߠ\-scuU{+a-'{`L=/彿Z"aݾ57,U<3?ѼH:Og:JZW=ݍ`l=y`h*.ekW^C{'W!Ω2 \=5SdkݛPa8tsVZ1cv}F  ZE8UJr T?e"W܌3촟Z[΍Ki3yO4$,XUq˜(\m$֯`i#yuq>w'[߁F>>% K^οx"9k^oC ` +,pBͣΘ]ǣQL#a9 $7Ga`|@i~jTY_*4V4: ixcc^mL?:7N2]3f̮$~أrJ`,A>}TUymζ;.^;!1{v|̞}ڱ[>$F^|a,qf~uu7~ʮF;Rmo$,὞c۟ C /aC(?hѾֽk[KMWb/D=4V=Ś&}64d75J aiX8lTǯKm׭P~PQ NW_;$6lpLN%f\;f7h'տJ5&p6 +6U1 +> =Nס3tZ{p.AĿ i֏bըzZUwU)ͩ&5{)jkP=~qvw޾BĮuowѫ7<6Y6#y/VH[z@~?Pmd+95JVc' d%k|[T3k5MYV,Qriɷֺ;kδwRljep׻Mf0Y*77o~/ާx,yzBۗs"WE\TNxTonhofl:x\?{mq ~jvat2g ir41Nz|ELdNb!O\öoΪ>>;jŅ1]qAY#듄)+a[l˥joATאDOFW/6XH˖Tg8AEH* o7wֵ w8~},*@fDQSdE"o(3tPm4}ξ_Cՙɫj+(c`*Dk{vk%aOw jKo k [ՃJmecN MFٌOobEhcv +»n'6Q&f7:7Z]2fJUe3ԚJM~Fdj &^(; k#J''Jl%/$uwnE֛R?S٤u![ugN?-&;A4TK< .$L0iʼ4TM*R밬I|RYA<M *8*?&o|.l^Ad0a,zl^w:Z6S;L OoӦlͪ{e[]0{Mv8%nyˈ) d +*Qϣ`78.,v>duuA ɑtkcl$1z_lJ^^?B^melBq٭~-WsuWWQnOAY7z*畺M# +f W7Uθt45 j4 (]_E1)!8~b,K8y1]|c >)mP\GfH?'7.:cO#ZӫhŌk_%}\6w&RYI|:{z1RԘ+aꐭ99Go +dgijD׈rSmsI/6y69mjE A Ᏼ@ԭ6,>ndd1axwx(4Z^M_4sN/ۜړ2BA^ᣆsDcBΊꯍA5DuUhpdOćG6sH | W}pјJN_ʮ1#G/·|NX>~_ZtsЫSBkJ/!8xbW+Aˣ +H@X/ߠF*Kn,+[1*u";.8kY.6N)pם(0Q6+es^m: qn:3iS·fl<*Ա"umް :E*aP +xzbtݗ`1AeR:q< ?޲L~r2=U6 ?R PL%9JTcT?;e]ju|@S& +hy-Z 6+"hEZ-@s.17NsY2l9GO?~3)8^` q0m0,qge-g΀91}_/ur[qfv'hi.2}d]7a9ʸ}|6ۗ >H8բ\|;(\[\SJfyU4CծJ'؛œ d~(] Ы @~km?GUpuʸj)x-=/. J<ئ MP-2,@5FR6 vKmv?2&/L/f=_kWEW/'W Y` ^dĸrA+؊ŧ1'(5C1gwSڷz=po[BhwHvӫMk\6ԴXg7Ϛ] r7/ +_k~)1mB>F!AoϯXWOܯ{#Tt0[soPfJX]~i/^O1;6O{nf  +t{tm)IGj7|MAYf :?[E;Qݯ"}_ޫznZB=Vȹqٙ4k”tmWuwIX䯶zFp28}ڎ3zrn(gtJ~t06۷ oT詗Ql,}3K;Ia{lc|F1G19.ؔʗ5⣘$_g`|xnoQq=4t 6 +?P'ݿ l^-cI=v`أOzDgo[7:wgҭij,L>밤bgWӱNHVuh qv1{YK'iѼ%/5Qb~O%Ni_^*VQ1I8O_U-L!Wz'ě{qDFKk0mtnM[=|nɯ#J'rHXslY'/J#1pQoLC&9_Y$W5QFa`<:;򉏵w󀼶p-D@k@Qj^;jͱ4f!Yo8p؀W4\"6Dvs}?vmQDeܿGy2) Yt, 'oN^>uպg(Q&XpրzXI -4wj\O\V ij%e0_Wǩڳ밗Т~7;;w"Eפ}.ôPX){%yZѯjhPI뫴йE;߄vcuZ2:p+X,ʉO.)D=mX:1Ζ.]dm=zSil{i~kߠx%t>мh\^^a +߉y\ [3 +O㲿*F!jYu?;nM +Jߦk.Wt԰v- +=@ʼn[`egYP0_/Z{Y ǧd`j\G\?v^tߝ6/M7֘+jU-r[kՊOpиC]"fS~qfy6cc>tGB}X&-gZ&澟٤Z8gp71nN2 +?[5J^L'èg;@y¹hZvEvHy)SB(v7p 'yV/ch:I!_ۅ*_8C'+6% k==lM] t5/yjFgVUaH+|CG2u6qryI̡ePX7Zm2b,Ԕvo t5$Ih!6:1ؼ xkt . 4-MմìT˞ʟ(Ry*AP*цŲ.o٬2:0x QC-,ewpB!)6F?CnS;4_U2>kf}kHܥE5 r<_99R>q;E))+KQNipB]`vw(3\7GuRvMf﹅# 0ff痰"b8bһRoKS~rE5Eil<Vkx!!o;մOW{7Bםvݝ 쯞'MK-b=@$Ow~TPMN["m)z,G(œp t6> ln03 _Xh:/;h@Gy W+#@1]W5s3Svȭ?P-j/+JlJ{w3:yO-R^{Dc*,!Op/DޘϲAgUEE+X]V/CTAW6V17FZ?#2Rj1×rq 1ġ- TV]p{̦)midU1VŇFq\' I):k#B'|iKvRpJd$V.i#0>y] n.|MA{cr4zOκWVE-y$dJ7Fo)ɐhF] 9ụz KQζ2 |>_? JP/1\Z+?te.o;>?Fa3B<}` +1?|gϯ,Xo~oGDx1WY >AP까^p߆/n AN5 }忋6obK>(Pm4C V iaaH_#҄]>pܼv’Wg +_CuXlr$\{e}>ߤY5zd\],&r30D/j<܌yb|:y hd3xt'){o.2| 1@a}Pj%nl6*TqݨP|N7lP**#>Sf:ZՉ`5-fgf[ [ `/ey+ X 0 Lު sպDyVʗnyXvR7y,a,~j)ѽ PQB{3gCd*GѼpNuS&Caga&{~CBUq/B*b)m ]F?4h<i6]Oc@P! is}"A& Ԣ!@p3 0ܹ |'Qz Osܕ5  ʡd?^xy0 S;J[j.AA2nk8ٯۮۡ ؂ Ӗttr?e`r)0|8!آ 2]LƘ%5l1r+< !71W=/rkPՓw R5 \"9^@VeA1*87cPxATORͦ*9^V'_3x +?/oS(_w~|+ +/L9W@)?ѻY9K~kP"#GWFPՓKѓs s7:Q< ۇ@2L ZP7@WUǏ#-뎗K3k.l14u#:Zwon!XZ[|7;]Zo)]G0yX )[{Myd_\Mb[i|"ȴ.}ӯzQ]N|U{Fv n^ԋ +K=gy{եko+l|ԙafQg:][b@~sZc !:%£Q̗ſi_cWZxÓ岇NWm_$\qf?hOhX<}uSM? `(_$D}~ƃo¯&^vU;E߇Wco#k1t̾-I0kIG9G1 {␼ڋKO+ ?gկHɽ>^f(j _}M:I1GʌGcо7Ge]B5]bCSJU+T}H*'=d^tn'(7eՎf5W_z@ u8kvѦW (8v?PōISާEڳJU)}<\j@V3?Jh6l?:!VkH}=tѨϧC?P}nu|vMXH4}/||z5jVWڭ{3mϩkJ΢=q8;$3qǓa~o?zrK+lx~蕾zN:AďG븫˹O5%h.sǞB GUҚWґE{Ǿ떍?ᑵkvoq3;>5/j.Ƭ5NV)A^lZaqǕͯN_xǀ; 6~r֮-͠qfW2m #!ASUDWhiL^pk[ݪKh6i»9cˀȣjy^Œq*lWx!n۶vy|fV:E^yf+j%6iWN\vٲēf[hRYxI($aӯL\ՑOޖUu\Xcg/6iw kEdj ~?@Wnt@Ŀ*x\\92YbP$3Q-);[h4z]uy{j]ci2jc55 U's7~4oQ0,#-zRY9ͽ-gyۚdI4Jlgξ(pC ;zʿ3$}fNB"4y鰋O-OU1XVbdM1EվЌպNwqv.&NӚw}2RssJl/x/ + {M񉔒J'8v#.MXG,|E"2^@_ϘEbawA^|8yQ}'&߭R]3nEu/)<*ʻhHDt%(51Hͮ f'7٥Aa}X4:E3%Ɇ +hSSqRҜRV5-͐0[^W-^䊲qR] TNLk}3YћuNY)Syz&D'DZѱ c#ۖ#cITyiMmߵ:ue[+rIx\v]WǙQɠT0f ^ JV[|{'vt!'kSjW.*O=]kX;?4՞*MN>դJUa!_qH?!C[|мp#sZűd/cyXu^|p'yoUA}-pZ7K;vjh0T'׃fM:/yTt>J3S+:K^L + mCP33j?N_P~OA&Jbo%<%'{%5Y50OC~N*\WTۢ`^ g((bb?d^9ZSPN㝍6C^Ѷ;zM1˹jg3`bTxi}2t me +y~7ʔkyάڤm$Dtn {3ZąbŽDK#s^ ziUųIؾv~w*E›|ƻ*}=y$bIbhgЈLQ2eM{]|p-?(vtXS߯Ѷy:}?S~-S<(B8 SkuS=S_zzSϞs''[?NM50/RG(. '^F`/3^%E#'Kr '0~z]!=`)" -+>3">xbwDϼJvYg7j*Yf-֙K/-fB=E37xA]aC:Ȃ @%Tf, UxK<&3 +H r@Ɲ ^ R?1w(Ƚteg,S,-|+ $kꔄzf`m.h炓p[<5Vb| XZ,ӯCX +X6@^x< k2֌N } i,VvGv쐻LUA~I1/U;,ow_kuʤJN:Wfw +8.(oT耚X<PmP{KijEj+/@'@*T~_:Zn|N⪌5Qt\ZilHcj&c-̓rnIZ5R +-;*:U=VXjXV @Oc,-)RW! RDڬպ/BA|︻~\i١4v:;:s0eHڪ|@%0%F 31y8L0~0=1 +Ԍe&|oDc/gWoߺej^WJK[m<Y əcj'M^?yLXQlUlmlH-{[XPD%W~Xk.S/O%e˭*H>d'_֒ 5Rc}ޅA)X xTS''67tj/'%~|9>|y|%{|^fϥ}%OVJ:>i9QT_~kB1Q]^-?< oG1B\@5 7\,H1 Rq˘a @L@hH 3)=[-Mi9N<Ox[UMlko P Sz>b?zqK@\}Fb:ۼ*Fub˥ z0~"ZL&q7OE Ow+3ۿN3OH)$gd|V.rإu}miނ7δZ=b5FRlXUOx~[ ]a̡GnYU9K*@/M W|XNyt"+AeYJ$EN`;.?}ni}؂8y G{zUA)ur[+:O.QL۴,BOt}7iMheIcSQg6, p8*ƨ~(W fk57}O_ڣry-NtTѦ6-J~<閟y-TP͆M϶/ߺIgMǯ KwiS?[.=ҋ}JQ,nV,Ԫiɣyvq bcF뮫 7qޛS,KPSВu+ܕ=|g`++T*揢w.Y߳ idl28ii3zf:k#&zLz\[YiSdEW}˝"9<t[^ٺR{8vbgbŗpj&4D#3rirQKӫlAuv7h̺ cKm採*Xiwe]w9S١RXT|wSsNQ*&R05'Ai{⥎g17):K^̽ojZt^qVmG=SUy(kXRmѕ{B.g^ݎ4,φR>I⭈.ReNV7<-TBoC׆z5?RUnw|XU6Ψ%NldՊDf:ӾYh>1bI3Xro2H9d˩(bکZ`h#UZȡIn$0x"L$*A X>sLc$&TVed8w7pMiz#' ΥtDbFmpUUA!Z~.[/DR)CH-9%EsTp\ߎ*E޳:U^`7->dps69VuA>22z&mø];5znARA +jɝz)n[\qNv6KC2m}t MzUffh2Tةr6C +M4U6ITZħx\'3jM3݁ߐЃIߠM7ĀB!9+.$`|݂L|T=z{q+=mگj +)V6QϫiUW mu)?Za5J' :Ym=̑'(t!I?(9w4I\\Xem1}|(,pjm jBz-NC:vG37W6kv?q(=փ\\=u<ʣ24+b BIU/E7Y-Q""/ ^{{ #,!PD?n3Xp_cd(x :r@#(?WLkm],VfU\M}~e$S†mb;_c; QED {Vz@aEp]DvS_8 lV:4ڪ]9`J|y,/!c`G.xuH ZXaɜ, ń⫞f)NG&{Dx)` Z/x94?P@, :\ܗtX6 BbucY,Q'O_\@4xƤ?/7[@x)c<iLlyN|˖dEh +mFDd̈d)D&`_t4̉}Aa$@$ eMd|YʀY~, -2ud&T@D%yNfuQc{*zəb[ؕN<|uHDRة)CPs+2ck  +_l@eZ,6DrKm(fE=@14w/ӹ_4ɜ!"=}^6U R,!2tR&`gac!;~~J @Z\W.SQi@- H h͵< kBz|.WP` j<S^ѠBo:Ձڭۉ1=U[w &WLriyrXe!{5#-ifek.H +Gha`UP`0Y"\rB%0x=6~La@?+:&ɢrpRJ͑\|2HQå#`!R|\ %bSᩀ)_;f栔տ ?uN}#;32 Elɭ58&0;go1PH0cV,?(^ԄӠb)jeܿBJqz t||bx_C:nnlLd0N9\d!w3!]>~]N7.)/-_k߭ _ 5jEW t/=@ +@^ tzsSh ^23e=-ӶY$)hXq)@FQ{œjBRICoˁuۚ/=@u&X)@>!Rh~G uoKRjX# :Q!d䤨j'Sʿr/_OmҀ,-] g1u2[ְjud - aY>y;dڷP?[ +o)}5o]Hno|;&PE/4(ĺB)\[w{[61P/GXnV m+-r7C3Us/D{ ׅ/55ЌwUre^9rBsfsJgDNߥs$1@6HAFd䰺mqev3⊷3Q9O?|EycR9j9 9MzYҨ\KA6? Y~u\(D]{VzAL$IfmM\UVZQZY[s zN?/LPDӫgnǍ};Ƚ*b;c/MvR&O3*T yM,?- {{TTrSɩ)6e(6DJ$/ڬF| șike]zKğ~+A~$(j!jls<~sai1[7{4A~&CNϖ_#OQ?d-c!H/:S"Gl9psmgmHVJQyLeݮvtyn:vysV,n9U^ٰPN}g,8Qug~LR_n f|= 5̙-gG0?TxǔsDY%p?5E*CП8v~Pvf]֪+w;jXf|Pڻja7KH@2ة9^6tmx= +AU׶y94PQm:+AYk+*]a:VǛd2&~mQu^h__Y-M"ib<*:jRN6 k=k[^T.>P+uvhZ$b_#)| 9E5QEy1#B^kg8& ޣW)|^ +>~ e*%Ժ㫘7#veP1ŲHB/J@|c +93Bh*7R&2sTr67]?{K3Ť5$0b>EtRŸyIf ˝^Lů!UN+nϦ.\@qJrҮ35aF?4K? +ʏ76#dװŦdN#C.E6soRjlT/ikݤǸUhQ+ VI S U(Tщ\;QL)V9DdFKt"ݧFiCj3Srޤ-+{6=pF*r; GUm,Еw~6fQ8aЅEVUWd#Rx +n<:pn4O?(w9Oi\Q0NQuXH$.''6J#:t+4~OhC{@3 A Hj2,gx@  WR9mȑd0mpUjx'maKj$Y #՜>RkCNeS 3g*Mj{\RH?+\\ _)˓* RT75sE?ya_jUʯxi.ʲI@s%@aXށRĚH^1KKZcHSODM7N\(q5\)/7-〺@×UA[+^M@_:X_>Fo2W@OxK%hs2ʰHkbD/c=Pz+ Vx`K1) nj?a!?~_ߍO@m[8@+ d  ?X7"$D$k],ZcuA2,yrI |#I*Aj Y 7Y +@z+Զ"Hѣo +qj3^uFI: h;S“;bo4 @y 7!a2"fby4" -<ۘGԭY؟̉#"gz?99D;i} NM-rH5ހuP>&opctʓ̭kO|P\pyyܥ{O3湫Φ?a`:u@?h0st"H{a z['LBaj5]l%^<9./Ma dU-͹!M}Xd6 ϥ*c~GšrT}}g̡;O.(M~1www MRW{m/WtIdZolޮ=4lv4:>ٽm)[߸mQ:rܝfX׆T(\ЉO{'* +mj/ya ^nh) +2Ejo^&է/"O[{pϐSat ˻.P~c2SunAVrKݛaZρlk|&CaaB}Z:Ͻ5z֭\-L&3dY'8449:7g+hK9-xI[[4d']n,mXHހgV>-:a-*8;LEhWsm!PYOĺZ rU%ȣB+_ +W> ؼ7(CAXw, UT7'RUܐC]_xX 3)V-߆F9 ;s;&JJR'8g/Zі_j"8qR/u~QcC]*4*+C[IJ&b8\,(4r_6gEl%{=l?u|Y_h0&$ +%/r94DŽْEEls mƢucmXf3*06yO^s=;T>)=:\wk`m I$1jRBBjp:tiK|OxB# ,S~6,4QUee+6 K8ÙiIf#aLGCKGGFQ]&u,S3T[OHfo&McE;e4v*!ƨ6Q  >]R#cK haA|8S=+vtxh_8y%por^O&yS~(mYWzKH.Ȫ'X5ioAM,fp2 Ŏ_i`;hLP7u~I(diLÔ-{y)7**~ky؝%SF9җMsW⨇ci_pT.U-΄Kp;e"VB@ç*SH9#L JJQxh甜f?c9EqUZi7HaRXX Dp$Ph( P>ZD{>ZNY>Z};crq]H5a6yй\ P.IQN[9͌s$Snxx"|=j*=_d%&jw ó<Z\Mx{-Rh9#VoV,>3ul/Wklxfz +k]N]2Nb>,Ed^fN:O$Pu@}lq;4qBHGb:\fښF}={ _zSRYU#ѥH,6su7|W#m D24bbN0 +HZekU~K6q6;210h w3M3ŪN N< RD78R*/'/_JuUY]/\-Te“_􋅨t&`-lYr"9-:ڄNڂ1چz{ځ˷79)q y4d)jxyMciE +GC[FpTDZ]=D~J-.wOMeiS'!.;ƍߖǤ5L^н:>i@|D͂_6k4Nxwr0`4572AhyA~"÷ Â瑃+帕1#vNhiɨ*9X0'%sgZ3i;w]$CUU&ضXaۣ; 'wa4C/Q̞փ1vw] 譳GTL+(wc%c)g4|ya/g=LyFY9zLڅ.bQg N +Zd*LU \>HYtMx5@ +R,] w;+I"ߌhoy{ª}kOcD99 VCl7zBA4 SptKh)l\XjZJe$P/mͳڔczi,e,OL,_O_ݕ{ܭ#:U҆&x՜ǣWSz}h(Gcn+n},@o#('02=>x ^eʱ|*] 3@G|=0\I Rb+jBҞk+/ aphg>л F3U-ZK,o"6°Xr\,C `cԎX>X>xi],sL2Vƭ$8[;A)eI$ +#% +y:̯#^k}T~ +s\ +k<TbwP#px6=}ŕo4X`O.޿̾^y?Cv0F 䌲לf2ō*X {lʯ/Ϩ2v <^,ޝ{_߀:8 +7KՊXDZBF 'O# ډewf!@h=(b jVdeLNx'./ -2tTdoְ{oLRx ިB0J@"EP1K4kv2L3е57u +V:[OY&$MI" V;)niY vUC 2<W&o,nwYLBY,#`WVLdRM{GP9bM!fL-vր쯃{ʝÓ?iMIVDB NY7m7ǁ}*{W!JE-ep +nl>KVKÂ"͈oΝ +DwiOl~Yi~H,_oeklvSXuJbo-W}Nk_p2+.H]HHpI$cʾ'2`Aݪ{Pt\/O^э/?5 +Ȕfy7ܜ.(O ÷o]<5Ro}Y=2أl}Qs%)9DIIw"y mP@D|(X)TwRR_77guyY]ޟMgT)9.Q]`2'479uP9TA(JgUI72NZƫ(CW jQY|OW/iOZ 6\rm,-~'8& eKz#&8:2:6:7[oڮzmTO2>޻rCGqZP barHA~9&4K%V(bo +ͷ_E6y%ӡ nߎ||B/ON(cB>O&TiҨXKcٍK,%?u(b;l/vR&OYXUt~(yuZ~rsAs*βas1ې5M|_l#ٰVE=4:J]R^\+tN Gۙ.| +T\} EqCEE{oag~d|xd;>uUǒΜ-euηښ.@c ^TU=73OoOjRwQ`^N؈jX>oB~t*U\TW1 2n߯8/}ߠ/UB_ Vn30U-W +@jΨGj/m)j[dw`_YK_r3KKT\Hi~i7+_MP~5j _ *v GM.R=$0FnIJ?*5ADtrIdrEeʰ+.0`}RL\#W&n^yn-sṔi(ZQ.dwkkmg;jMVѦ¯ +-ҨtыnI,PW@yqsxO6g.{݋iL8LFMJrLSIӴ2l>KIt ڍAɻpU{Ey9.YtgL1o̒H& !h5E9v6N&;]0F q, Լ +h!=kC6+l*(!U.&] {rg}A8 ^ +'yZ:Y֌]IAτf|ylps]cbX6u=YL9YLsK B{4Aw96q>c +%:l')G~ؽZ k,xK;ӎ8*y׮ػbFivJbJẹ+EPI=\dS|o' DJ&0FIl\b8t:3Y<ۀFcZXԭHFɒM'^N:JL[66fSi<&GɣiΓ0v'8LăOa1)&Fl1%.zĞ-Guc"E%Z4xB-\j0{^YװkwQ5ÉV?2U":sP'=E9ej[IzGJ +NzD;[j00Ec$~U(lPXK*IDױף.X==R^Խ; {$OZcX*~gq40wq}Y*|/!^8H rP,v"Uc.p+p":EzQk(˫DzsY"L/oeorD>M"`\`/dU"9z.h0MY,Ǒ "»0m 53:ELEE ME!> +Esf >XW8`YRNK5Z)=#{}BUNo9 d'f}(26MpƩM#ûm5tPUn+(J!,@XPtP-GPJT~=xt<]oPSKfwZ=ȍ+0z7PJo51m$V)BԒE $Bjz:1lk pSrn36hk.Yg chP<xwAm؃j`0P/6qP-NC y>ű8wb q]wfzW#1ev+3d"?qE6Qj g&V=/\n~%p؂J$8%HV @3A9B .A 84fPbbɠ-aT4rF.o+Ӝ|IO^* Ώm>R5'o5/^LW(]o6Dӄd`E1 PҀfFEdT +Jh)@ 3CJD%yrҟ_Iڹ<46-RfY\kQ`M@H\.rPR!xsJW%Xm!.DԷ[@+aooLcM{0u@Mo+߂u.~\t޷%+]A'^M7g(g!R[ x5 +c\ IӮ + +ZIV~IuK仧ܾݒ[6|) AGQzlʥ*e:\P6x\۪z;`As(}߁y"n5 m+N"Th`MoQ ST+P$̡B| +?Tۍ{w & H$J*yTQ׈JIūiU^^ؙ6DN;eHk,X$٘9{ʳK-9?*'%Sj-i>" ln+n%vRq*NcП_!c %QpxL=kK_E˭bo-!.s^J̚A4s93yPL !\E}VN(=nZ_+Q'F_ygr4-{K/,H|WG;u 0'㷯_|2sbbۍ. +ǑKLobVw=藒lMÛ?Eѥg"JV[-_En绩FtX6xr +N^R2"Mi/aގZ2fE x>(eSHV]艭TTkɬ<5 k%~t6^{vQ(9il[ѯcig# 4Ft+ί(("0SXpBp7#E41\ P'9)^8&r0gK .XJb'tZ׼e,8p*Sj~%8vq̴z,LĹ0([ŏ'jLp6҇O0@lޥTO؄/ѩ/)pneGޡ66 Nʙhdi"!YAYw 8G)7fFuk*ǿEp ;!Gq|EtiS V23_{W .d +&@k(oq'^_5CC-$M_Tq[b'&?9LgC &wO[>%?? Og&۶|^j?9oZ⿴MpĿ-v +s+^ܼ>뇗hb4wߌ?i o>1SLOF߉3x<,@ԒdF!hPl/ "țk#ѬEt۱/酉ը TAgoºp7ӏ$'bbn(|P;Ͼ@4]Fe<nK z D0<5MiL >U|@sF/ (ptwbf`vܘ6Ab L3M:[łx*0$o4!bIٷ#oW6HWK:?S+ ? +|Yqj˫\h]\~X)WXaj-inCd-J绅z}d{UZU{Ս.*Yk5磚w~֏C6?&*.{[ g74End"g__*S˷StiCT+wV=bvOKEscu,Z+Ω uVZ[^rvEH(? +׍u~7d2tʰFfAmyOCy&Lν `7!"禨2ztFp2O8Uݝ#ޱT_P$;ISb4λpF@"5E[+Bw;~9]Σ&- +]fQ\Mqb20 ia&oa`ֹ/ t}f0KCwEߡ wN_!xsOMՖؑ޲iY?OM/򷯠g$ }}4Q9wM\h}fgLs|Ӂ`D__-Of(cٯs\ \:vh\bO$gW˟=4F}VzuT9wl/4͟d/G۶|#ZX$"@41[ˎdLKT*KOȾ['E +hsT +4n% +77mw+}!N( >O<'H|Rͯe',NDR7鄏D3kU":#"*p/wh; 4qIOAPÁUئNk:DM 5Q71p8 :H8aHwnU׶j5 ~hFE Yf4_ bi˛hx1q–Fvg)#rjPB@=LJcJcG/ Hc+f}9hηS 0Kjwya:O+@/}H/dߩ1;cαg.KWY6"s<Rlׂ +gS۽p]{:$s{[Xn֘yrϑb$Ѡ4/EnLJ`xEVn[@[Nm$08ǯP Kї(Εo;cVT]1ُcANoa]ۻ%BO;ZɊ'\3U|{U#=۝E|H3Ij<56řoh f$p9i9KFތޙcKDyRCX-gCOu;KhPe$YQJnKcD"eNB })oB˷EY+'*^ ]S*Fۨr*3J1)'z,8꼿I !볱90aobޗ_N8Oh sqյӾ-s ȕbV w)y4=1atڜx5V]R棕 O㾈GFU #cFX7 {K {D2sK3ݟA0o;WSj8fIW5>IH|x6`}Z&=/z G8@%0&C?'T݅uUZmr}hFNw%9̥6ڽ@XhL\7btϞgm=4{3zTQ$Ot]FR[dvY/LrU GY Rkt^%ϴG!Eߡ b*ǢmĿ4|n_!I=NߢUthQbWJh~*6\P' _?5)5hv^^uJ!Vr \ eK% cE[D$4"x+ I(ʑj]:x:šK}&牿k=4 EgoEQ [֤WB7ox{߁xhN G-0h)VK)Une,aD[K7?*-oXdpڙ>+Kg0=ο_oK]mtݻ;&m2>mc Y:_igRAdNI7^Lf+,ZEV$ol5FJX4~gk]#8MlQA>W}u-KԎzwلZ,\qk^GZ ˾ *x.hawl̎g7Mׁf'&Q+ۭ3Ƌ +3)OVj|}3Vݳ4=v^\W]wQE!։dJɘV҅4x:ٜ~Rb_6v[9\kS +GY-Qg#n:.ǁ^9`m*qk٥5l .@\6w9CM=r/Dj?y*GcI16x4> r5VX2B0 edo=7.N3Np`mXq2'8Ne]¸EDU-#^GppYKvD>M`HDy6mqP>z?{QCaLj}1ma:QM׋*.='|U$;JnJ+:K~s>n4ąȩC|oוOjGs)ob82#Yd)Ot]l<;i4)z&A)oṽ,{]f@xRyI8Kf^lz47gMq也"X /8fkîY-5GICSD~NuvciLig5!֘p:W˵qDǯF91H0`>-SLWCY 9Yy{)?Qb!rT NMr4^AlztaRdߒ[hnqq&ɱ'0줦kgQ q +ƨrFAvlEjWVFDaJy2v]֟G>Ωytn>#9R?$WZ'XB;_A8tM+ekٻ8:3n`%^-Wc:xIkʡ54,^"j[ 0qȵ1HXnzs\!b. ~mէ6"4odƨnI"Y"ËJi[zMDt Z|f +>A.> >uu)0 :^|Q2s¸PT6]"ozYvru[3>JOIϲ(#vRKA["{Eߡ *ǢE+g'in_A}SؑB''ml{[ o\kx\SsR]L#[)+Uw&W0,vxd|Kώk06Qo$9$Epyذ[Tݫv$Wmi*՜Ҩ+"ePnKr+5Pj9;R3nl___tL" lD%)` +"K]æ֢c0M%5?8Y#tl#)"7ij W!lW^MstbH}!?.Eё( yXw vdV"'7')[H \\HU|.r\,* 12b|9iO#8Y~}f7%д!'sV9A٠w7bIiZߜƾDs9Ҏ0lv6bw*W^8zvgTp5}'߉P'v̿+p$DgaNM0Ѵq +h-*YL")b`0]SaƺJ"ݝ+Tok)hK?Q_G=U fҖ(|6_ȑudW1Z)x+i+pqmzΞx߄O4 +4 cM]noIDԕ]=#Z䫁hYw$ɗ%UfpʣǞ>µGןoEq J_D7ǭWHUnzZ-TUe YO84]Py-,i<Ւz9%غCX&\(r)r9];s SmVW]Rƶ/7J*pUJǔ|z&icC/;8|bL]G*l +oԔY{+a&`^]Sbm%K7f(ȕ̅+e\k>S_>u,,>uC/|+DSVLtjX['j[Y]8 76`: BwC8 +cvÚΠ]orN>h}vWƼNҶřbL endstream endobj 31 0 obj <>stream +v>*pÆ{d˕̑Z`Ie/gZȁmv+N m t9ݰ]h~ڕ1_֍޼S'zSg(E_Di0qnW=x.;aI%z.[myxv I7_,- o=:Vxiþq]&$nhV)\ zO>VxD,AKgݯ%w&uƫYnEz[5V/T<|>!ʠɣKngϚPQKVrn!+0N]|Fӹ=:]Qjݎ\%~ߗ؈.垌RZ1ż.-? +:ͩ,{Ř^vv]1HiVJ=jڹf{lsTwS}DGwyl"մTHɹp1 S;-2ȴO#Y캚T >I,#G'|4]Vtwlsu>HpLV62֝|GXNʁʟof jYԾΪIЄB^ܳ} /\FXskgl/:78 @(e:3|K#Jy_9p&KiuMbBwʃqٜP R^v#~VqЌ.j} +Ř%L +i@;Nv/RTdsI\eFcMgq6XЫ}oegQԩKlZDea.HLl]^917*?vjh3Gf{À'&qYx׫lGQ}{( +Bw;~ Mw,>Xh+SdQlm:$h{PLjOOH #E2*{sdϝXapn_1cLweZo+?n϶esx3.9 ׅ~u9mMUF_4f +Q:L!6O̓>ғr Ϛax$Q8zih P<߄^;Г|%1\6|2ԜDl)t{fILʵ^U6r"fpj0I Os;޳.[+Nt`a;<0^0褓jf +,am*Z}NDu_;e 蒯}Zݬ_/>>]v}|[7}|~mx!11i_o\=YTSפf԰.驊C<B%z``tުz톷ȕ%ԓ9!ZTAEߡX"iĿ4sx}n}̟$P[6zfH*J^JXK%}`XhB\aغ"k> m{@s4GǩPqd=r̒|E I9P?4\DoOh-m1* GXX#]b°546~0! :gN@T>~(V*}y.蘪jgChO}4p'cj} Zryz5-jΥkMv C:ܽhe6맏s~}v|"So݀QD .up3]edU 7!+P=ejfcuuy{*xOG)W@iGf1[9tz!b%I2 +G3>-:ö#\'~Et6hs5USKO 'lr10sF~p7cFxV#qϭb3u'M :Nu[.l cIcֳF** nz&H +յ1>AiaھdJhS&wS1xd,EY-/FV[!b}zwZvoY䇜\r~.*,)nuBl9\^/ŷ-Md_A(JPeyV>n}9{iq#-xV`&挱4 +Ԣ]`mD`zKTqy]LKX|r*>?<^m:"{bBzmPelr§JRAL\N|YX eJN1]T RsQxG3W"^||#bzD,sԼ{v\WoUAsC+Ot58%QLX&)հc0bZv3EOl[t/c +l OطO6GLvai?wIIr3B4'I'WD*IPI~^>U7amV]_`J+wW]/#jiְ,'[:NIMZl#=͐HQv:)6qhc F|{ +p؅Oօ%4aopV_Mb*Ĵ/%Gr 8ӧ"sdUpEz-x .?C;%hshm`}f0]rEnnqЄ/k|vIAiG9p3.%#9maHSZ^dA O磅*I sUw-~jQll?U?.Wtm+ۛNddm%jf>.eg{n +@ʐȮ"n6ɂk=y(ܨn3˦k?GnEߡ *MpSwh'b}f'(n|fS޴Ckkm7ͺI}ࠚfagWIQ1 hIC u}. >zR>>|tjُ>J>wL{jXssEo3Ԫ!ܫ6G4+8L81$QqfEC]Kry}K;D5>Ο>z9(ׄV;1,tݜjlk«q2 2b +x3bM+rYJb\V"׋AIX]5Ua(VS7ަ.{3ZOFt>ZP;':_::6P˶U[H%/ *s1Dc +>]+նʉ1SO]Mkk{V]9̨xr$=7YדГlVOz捺`ZWVU39{m.Bh|lY C#}-\Yn'1/&^!>N]w5k]99e}$X9-펡 p{ԤhFJXC棖R 8YHͮKzL;>H@`ynGga} Pz9"8Щ`b {hjiXU+lWw_0C0'JEȎ([գy1'|ݾi$(/k@ cgas:]~[Q}c"]{۴Np2$lԓ;b[ ߆^,Gc˟V}Mg¶q٩չlc!uՃ#,F@/:;ܩAbY-ALxn6ߔβOz믭d<4-iLǷO}=XfMкW`6 RQcg rNIIRQ>  @Ʀ6a`:Ntd?/9/K== 3yzt|Vq+n?>r2tkX퐧-Nɕ5HݣM\yvN< +EbT) qԑ?oQ'=E+x/sNEAQ{6g:mPۚq@ӽ %M#h;Uަ-u8[髓ǩf6Z^Ѥ~Ai=O[8cS:cQwׅlbz>O=,82(7܄|HS c V7fXҶxE-m-,Zb6Ҥ& g>=ikρ:> d_a@Q6AA)@; CYqv/~iڍ(oau6GK/ĖN:CZ/oȳY<㲉vp:\ < sWǯ=õtծmjg=s͵/k^hx63#*1W*qA.6^`(,/Fj`Ѹk kW )HQ +gB.vZ=ˍ`X6y:1ld(076u> (7azVeg-Xha}F}bQD9X|U,6ùm߆ևSÉ6~ J!l:i3:zt`0SܼD6БA:;BFHقU0b<$Ƕ4]`ߗF qp!@җC%pJ| uSB-O8Y/`HI->i9=A]!?wޚ~̻Yu=@.m /|[=d9.m{&Sm/gYdxL.4Rk|ȕ\j^6j#gþQƛm?rgOjugV"`Fͷ *l)`}IޓMΰjPHSrEJ&R~cؠ1}O>u>;ڌљi ++=6]itsYwI>3[+|a3` hJP_*ď\2xʼn olZGМIsz; : uRLw- oȽG<\/ޤ}m1ؼ]ǖ&Z|~o}`CzUp^ԴiVOb54p0RmZINCE'$Z R$ޣa׀ȞC2O\T&t2Q%*vG l(u!QCY]B)^ef ~r9*?'Jh{ߊ^4+y:7c +цeK.&&-PDJ)q[h1ށ}hxZ?x&s }Y )jxvf%@| Q ٰADl`\<14h.A?q7 "y҄E0f271_mefsZU@# Eƒ j@TԡH2Dd_DLkT[a u>PAq%9'}4y9T6oͣ ڹ?4wE)n$|6r)+Z]/Ae: +̏vY7ӏN͏؏sh{k㖕 7_ɕEbqOȻEqB +HTNQ O(|wXЃV~ʜG +}*ۓ.1qR,\7ra'2P 5@J(3jMRP[vK/vQy067yࣜ7*O9ѕ[neF^F =!9)dh>T[92D=*R@-fQIAxk +77P=S>E%ޞ0)*,ɵ)/4G7bD\-SG4A45*" O}W_ȯ3y-?H" ZE_xkoύ^z;^zx]?D>Y%Lg!euqSL0rB&  +*A[&QZK y*|v1rY<"36`uYϡW{X, +@5g*Ej02 `F}WG9 +|.$n589eӒK>}Ijk]mmؙ{~;VSz>GpUF6\W-tц`PU7:©  Q^Ixj?;kGBon{y[Wgu>)YiԂ~Jr]F:jX9}E6MW n3F6jvv]EIui/5 @cQzB&a.T߉p]ɇ4\쪫ӟ?Cj[m eim;Dj2~l_^}}tK2Z.C?3W_B%)ywtHkuOdK_A:Wj:Gt3HLP Xr=z]c'ޝhRݫ&,scN{B۲B=io+N.*K40{׀cW!x@|{%:3a 5E49*CyX$ҽFQ/kU3,zovu1BC|Jf͊WJ\L%ezG/l\Z.v(G|5-h]IJR.^={ߓM\9sX:Uo1WۚghI<9΄˳Aiwr̐\#t x/}Oԁ!P4PΠDžy-hz|97*`LLe!9Lm+7cgq)Q&+ql_Ei}Lbvj>+m5 o5?V)KdBoPLKUFrɁa⽴f<v  +@]0 i +Ć9_Ѷ{gae_t4~6^\'r;הD~F{2&ت8bBf7/o F2}1K[uAF6:^-N^{˽7˿?\(0(y ,k 7[!mo]'N,{60Gox-fjԴdpl>3LD1!ESc{1r(];PWư0(Fn>]/,>#a sū{2wR+QpriHn0m(7mk\=Um5> +-Qp\Yy +bb=:?LL䴜ez ?J_j2X +e{,%;K;OKhݫ_>lɽt ץm'{lj>G##'oS٭dbF|PQGl5۽.׬W^r7{ӍbFTFtuyݍV6#;z@|F!IN0Gh +6(\ ʅٚf.4b7 ݯV7J^QG[?f^Yuz:t@lt^h ?.f+Ib6p 6GAOqXg@slC^˹e^2QIR呂aw",C]?ɃYWNԖZYZnڋҤ^ξ!,TS]jYvӌ[M9Z= +TQ-{ umnW{uڰg玛볨N)% 1:ME9-hVRӫ9ꌔLပF3UB+]ruހBJx_|8An 96rrh2(mJ|.q{b٘@L &C%DzME +{)=\{߈^I_,ܾi93:QZEm +Yh{CG|E'PYAͺe@^<4P|7w|#= /PxG'x`dg 0-7 ]aM v2xII'\3i%\9JNĺ/ω|cx,S ^OX> +TՇ p'>~;qxX{v#Ȋ&T탄یr N+e8[eg.}J:[F5ztby'~V P@MYj1_.cھN '_i9$|6*Wjɹ<xJcbFjNQc'kz?x E05-lQ#@ %@,w < 0$YMSEĔ90"SS/- :Gaϼ@%۪v~|Spj"?Sq-ƀLmˀ|Aۅ mq2%H<5BtH &Ht 1#(YfNFRa0ksHLjxq%3=KBV\S RhċE"'IL]ȏ2kERIM_1b1wǻTNYrpU1T-`{]@& %8 /o6p_K$oL6xF g=nZ#{y\i2k'Ӝ{al~n<\|Cѩ!UT1:ig4uT7 túbYxמ9!(m\-N8yO?#^>7nX%I[מ3w͖ť͏ϩqjqtROg(i@bmZ۰j߷7cP&~y:L"H%WoTkl׃7{{ ɝ~۔"^CY`)T[{HtQ+F mKz쨛m- + K w33PSŘVH&_ʫw ^9O+X+Ckڹ굔in[m[- Q7[CTo[kNOAv!l +`3 /YFY6jҒo6kʔJV9^.XK6X..m"ϥo]Ds!>VFzeeUyn%\ad{A=~( (M=]̷a{Ͻmܢjw5ݸpjnyHY? +Xa#$wI*8,#>gQ|0Y +w 0Aѹ54׮N0X'͟U_9A. w>; ZaezW|-V۽?C5;`hmlyd&M`w ]0gtGFK]8ɧSRL3տ^՘bPt7Ww6h&2E!S9]?䔣SF nfݟ +z\ʀ< tU^W: |:t8J՜]'5Ig{>NuEwpAN~ Di.G 3Տێ󃢸k~.JxMz172Swͽ6Jɒ>f3RzNC(o]ߖ;h?zxEf@Sfs{2Q\y|E7wgգf2sZBMsh ͵Tu1u;HBrr{˧CU__[ FC6!QayMz]Hq,aӷpj隹׋Ӳh==z9<&!ݴ ]\<ֶ jՓOP3!0z"~|#>v[Z`cx kx{juC^wIc؇_@*w?Kz4' 5;^ `?ͱ +&WګMVں~ϖ{tzM=66UZ\wZ1zQlamԼl7A~Ok9? #s?532\ *1Tx9et13h> '/VD&tbo͉T- r- zr"LØАc+a| 5d;&95:RV/vGg6z-1 4:6hKmV/<(MjBȪ ߵ_7u~68 6j0^oV>--KcN8 ;Q \3@ ?HsZBmK-Qyhյ0;BqELKɲ>jm6ϬM&Z Fu\6KZ8 t:hTh{x^t :HrbWkڬ*C[I,tq+SeVҨœ|ufՃUDpU 괚ȅ`(;\ Pʝ۶e橸]U[EegvS~y@IQw ug"_EcU+)m@OUkl +K#%m /;LX049\8PEVĂ'?U y  +,`@Ah ivy [QS!~2~[Q3K=~qZX06K {/!$iP~ȁ[KS_WT%zz#_Wt +d/g(ZI6e| +j婕1oAv`;z`R|GNA[@jkw z‰:'q`a.E0}p6vWX.6 +ý e{x ;r{rhRPlP 3 +e†92Ȟ0l$VD*X\Dm_`IJI&#ߢʉryƮĿ r` ל:1&F=̾P}B[2ad {A[Sw-g8{=W|tpL-@NLJX#ܤ cCxt|&&1)&9)bѼE# TBqgv²T^w jҽOǿꎭٹimC,~i2#g`nb. r+aQD+yn8wvP=_R^"l)Oes-[ٗ~570ӯYG[,k^ٙhf-[g0`5RDC" 0.ʥi(ҏuUz{| ?'ǵr#0֜wJ1KE+f꧇Xd*m*ݭ$6K],ub;Eu@!bf!f.? aKj8cWpNi9/{x\=l랑N&{4-,)Uf3{asPw +::Ӛ3]5Ӛ'Vb p\Y9~+9OnS*mܣƪtjyiuYcX|:qOLN8T(ǓƩ:!cY~]@TO@ 06c=eT-ǑըñT5aǙ_8Dk\^A)0j)ݐl4 +A'|RsrD" K](೜_+.mq圜vz /d{'лuKmmb4h.?ܘ Wmf\chh`2[0 ʵQk1(c-YЖ}ޫ+G:d[bYq~ҁzt2.u֝S>/a[ĬX< 'ح48u!SJZ[1=L0ר7{/b}l}T!yƣ&)f:uŷ.Vt 58z9% ,/BmR7];LX=b Y N>{qu}2~{m#;?%&MJOvmg9y61ͮ'㮷nzŗk{rIwZ ޘK*o.|=h2_rG+XUƿj(3Gy?J4^3p /i.[%X.Kv:DdIg[QfYVh ?_l_׏(;.]fR:uQTi&5]"Ŋ~0zީt3WvvX:2wAͷ ]5:7=]lB6S*/!/Y GƱ4KNmSX$%E-yv1bΣλ;:5WmKQZuۘSp\jLJ=U{c>B̬}{Pv}L6MVv4&))VJ0~@xfD6z]rUnla +Uedu*UvtӸyijfA~%]aj|Z3}"=T |L޸_idpljϝkaޤ^XZ\kj̸SgyܐҨB)6%ؐ.2{8igO.x1|lnX]OvKW'iٱc#}Oc&Z -<,UP)d.|iT"_Sx'zSnAsӼ?Hyrr8֧lfQ_ޜR82k^mFP:d{lB|LPOn8{/4)TX!YR:8dΟ5!YW=elpOwLm&QO۵Y~aTd0vRhwnF/nD53TT6Ŕ3Op\@Ni%8槼#vXL*ҍHn +ח{]̩?ZVGmu)S8Hcsҗ,im.5j+3Δd) ^ĽESќ.N)/53 2<-EfDv|c0SqبsG_@o@d2Cg +V 2`,=L} UJt8˃ylH { ҏ b'i@ #' F t7˭^ w + 딠ADZ&Cv E2K~5m4A:* +"A:n^A CIW dFdncqy%*T}%xчϪ+e@)%4,ad@2 b;l˵@ @fՀ_le +2y] +=@fz|b. [O o y1G~/ +žSC3C(j:<zgR) MAAAW21Z>-Y/ #2 +J ) A:K lw~`w~yrBg[ճPs~(" +:‚\*wr7A, n% 9c,@D =~Avr0~Cu}Nnsh. 7-2U %@Y9仼< +{1?2f@6ravȊy u(/~I&R"ؙk 2 wOb-OP50xuPe ?0wY#/~go3|yq/ü+19 \m}d=C8֦2,>) .c=Q1qX*^g}}*i44D7RO{.<w豲XyBXW,AM{+kHc)i9^,ZM3ȩ ڵuYO$lD2Ko~hTOK-~oTܿ`5q`Ol #wjZF~J4/ɇ㧫Ҥq47-tFuZ̖;Y3fbmTy 8,9VcI{9W,AQYņow@L( yfO}ŋ_.y* 7k\t5hڱt3rCGcUo}F<]Ɲi`IjU[WTw=WrOV +ǖK~=dMdy:%vn0:\lQ1;a]h̷5q)ΣU\GΒп-?߇i @-(jU=.Zfw>I\V a Ls&)Q{鐫H-&N‰ 9(9V,uf'x j%io$KxWB:"Td4l}Zgwrq!dꔩ+üxt\~h +jvfs´׏Ǣ=P/Yjar'oS" l-S\G%{h b׮6?~q6OUDS8^,= +2> s15 [}%:+|xe-M=qbpo +J5SVfgt;J\d.|_sB'&'D%YlSLJY ö88sʢ(.2̯fӿ  ?EKUZOPME xGEA yW}E̐dIlQq}kSaoK|J{!\6uqěOk>2Nxv^Hz(  FCy'0[mI j:8>W)?C8ػky7z*Ї90V5a<&{, +8cG{Oƽs0oxV_Ɠ|r͉6. ~| +ޣXi~Tl^jNl8 pT@(TJƇy_:F>mN|rСhZK'um㝼tb!] Ὕ~se#a}y|T+:tfyi&TbI%xwr`O»i}m`lo2X#Rעh+nKS|CXشaܠc^sXZ-{-59: L}LXjIx8*]\<] ]$̢]H]4jҡݧ:VjPQo] h%q*<]/R^ +ś%6Zk^L{#--Mm0bv)jщQ3Q2\u%l1"w;h0)y,UR]WJdgm5!d/Ι۴'fΦu\aXQ٠] #vI~hcͭxSHG&B1%;e5ˤu={f[Iw؇oy7d5W< jժf^Q%Ӻ]6 XNIU|j=G7yo3)ȩYEV$dw?ԼWSSZV(~VhBIզ ovg;5sNgc]Ir?0p~]fل*@mU`'+u%D6 +@TCBY$)*5}Bz`)hOH*@R=rP}PFw#늡bo!\1@P茇j]2:BJ 1C&\i(lƵt @t,ݠW:@-vח}ov4Ռ 4ׄ"{;'i-gړ{3}擋@9;XS-=/ø7@+E<K֞m&W^jć 轝.G9|jC+wV]]n!+@C[Hq@{iSA@:X^DZ㤶oj:9G.+w*C z|!Gzݗg\~N793:ZqdFvۚd񯀺^ ?ox_DtAfa /O^S5C ZAlomPx{x*y$i܇{sK&? +k۶`LiY\~xwGhwGg.oW4!y$7iwqo<%Z-v^g`?ozs+&wݹEYSlOznϪNw5_KGm5|ccY@JqJ߄ݿj~7>@{lDZ"l;f}U˅win|26q:oI90W%7"ڦ:b G7?Vl +xa--27[nYoQyu*Vە}_8ۀ ݠM6Qwe}9 ߕ(gI=wc^킽^#|V-s~1| `u ۘU -Rr47ʹs3}*W4@v : WmUA:;JMgR<}[}<;"\qx}h{k{rk +g~:VnZߓ\L]. QHMV k *#S^Ä|+a_O7ͽFB`rs58l7u\W'.;JdXc6\+>|A~!'s]lx>?Fh Ctllf_,[gЇ oGHnsig9`\ʻ^]f뺰t5> Ώ%gdЪuônA/Cؿ-~  ӽ+JGW#4Sx6Bӗ󮜳@-SNb¬:\9yHHwZ7%@^sh ٝmF +jjإi7$MTԻu+#[}mځBe|]#vpX/pab5=+e06 +!;Fa67jW@p'/pzߗ㇐{]m{9[logLλ +5IP棡GC1kz}Wuq(:irC_-0:sB_Uʜ##:[oVm$EZL,:GK쫫e'JgkoJ6zi\ԫo=CWiWvŨ۵}wM[|zZXc6ψ.'e«[dS9ģ\4/u9bs|fAƢf͑mD"V"iKCtA]/r_ny݂hq'v{AXojBQH^WfU#6_ahtIu"{CS +!x[(%Tv+AÐ +*"nv`do>{kƉ2dO0ۛ=YeiԤoC#rezx՚e%p'g 6K?m~3A;x@Jc%3 ْ)/_H6nvj~ SqA/n~8jv8Wz<5wRN=x{M^RG|Y-="2x˜zg܌䚹Z۠0@qg3DݹajXu P쯦\&gZZ2,w\w5esw8p[~rtޝתL3dO.Y2l*Pٿ)?xVtYĬBcWM@0uwl=iA3ݬ:T#xU.L:ivTUvTmhӧ>"39K4Vp:8O*tϗZpʬ˞3;kȒۛ|2-VPZe.I/iXtæ&p}i:^t=JA=,.hZշLu=|zժecWZٶrecbQz3cu#Y7 +[8Qr |*00j?ɡY>:5$LE:jDըLʎQ:7R%GJ}}-R"S'os ޖ9 ԸU7l%0ɇbB6ȷO~5FauZo nyb|vwM.'ws)8gJ曈O*#qj&v⓿b&;ACΫ5'[ 5 OwV9ӡgIxVePPx&iIl|1(r73Uy$pNzXaL1P}NVN' =EiN'IL? + hnxR`ޫB +Rϋ!m[Jmf#$)#՘kKłsS B yD` @*.t8)DbXYh'  qt*qb\2r<+ O hs2B j<@DQl 1@.Hqq`6e. +@t`] ƒa L+;=HoQRm(-@  mpۇ ?y@`_$Efo߶4C&ax} 5v'Ph4CzPU_@^ kk1<3_B<@ 5d<@;<ف'vUV@7b;nm4{kHS)(@)!+!(4¥ mK]f`3Ru/+.P[". +2Nm??sWG +a6E 8 h`s"6Q^Cqn 0o8 v`#Z(#dkR;SSӤf廟_#vF!.>L$IIK%7K+4XlCK'Fn`O#> +ގ +ޤ&Qy)n&$geR ~>p6*2!+%8es}ܜ0e;e5bv^oZZx0'@7  g}(sn>kyp~O-k糝^4 +7!h;͐z]ڨpGu^Ju?v;{o&Ck^y@r?mfBuM!*;SN`~??L<2uSˬmJc5]Uܼ^q2KxJfN]Oa*_psV0 e;t 7٥fwRڛm>o :L #~O@}nգǍMK3.Y5܇|m{6ݑ~3S=\_Gt=V3o)wG- f:%$QG. P4`ATK֋˧/w9_ףdgyPzN7. +Yv x^ B[%xu+F*N|93aUNZʰʇ)w~jz@`Sjwiy$b)s2xO6ԘW3UQ(\(z;i עwI=!fwl0o `>hY.B{ꕚћl1>(?n\!zoK1Td8>?}P +E-v9m.n>q)UjU7ƺ7ͯwivyjjmp; ;u^}(zV;&*CO7~k,!\TG۴?e65ߘBaEkR*f +-]SfyԪ4CkּVzZޡEQErZ);m7=.HE+hQ+Fϑۺ-{鲛/˧S+&)xT6(Y)8Rd x}fܕ6&4gz;{\[TOs, ~j3'` ZׯcV&.Ư1-LT~fjާ7rUް6K/xخ2Gn/=ڃKSnDE3/S[V_߄ģ4}/B~krJt&Ipq~\Գt|ދҽ| +KVWLu/Շ_4"_#ƒN0{|sy6:% VO!<إӱw\>֘nFG9u7 [;=dSNfUC,IЭ,ѬɇSgŰ]?zCtǁWkl(.Ng='Ʒs~τ?tnO\2%nRڔlқ 4R)?9,8/7"5oQ5 b~'p =pЮsh/+q뇨/*wTǒţު,E?JLُ밻oa6/W SJ%$>E=F1rqWI9Gk$#!0_Hh5v*nSm:]?Q6+'uH%y^&fz +<@wԡJFK.-aYZ\{Ի7Ìc1:4#3#S*S,LvGKLmbܫf+l qܯq9iN~fn;Ў]T L$/J}GV ?+&;y=Y;@@V_]Qe\*yE+#+ȩNzlw)LBENYk': $kgG!Er[) .XOقWTp[Wעrl'rgKv$K=Jd3-+Uf\[;rb?Ju[Dv_jz`_i;-_%&/J\ta>>r\> A@Nm]GNdG{qfpX >E|SAhe)/GjX(Lv%kb{bV(d*˙figSgRyb # u +#&7CT5b)+xP'Xl* FTУwSY*t]*q.J{G#UߙTy!D)%jvCā#"ZBDgDco!6e^?ӂ{)9>9n^ 'ۜtԫߗ]Cq%<Sr7yN3QTM + 1:_nF!7elK& Hxt(\8~ 7:N#"6> $cmsGQyoT&NRU'N$q)8BL8Y:DyGE' z + )8'n !\x[k8SY9N7kik8m!Nk(NV)4s;K2/"RM":fR|B&ӭVg'j v$|WV:b ޠx2<@Vcfa)f+KX^du)U(b? 5 h|Yc34cu33te;qKK8װ<^#8@ 7uM)'48m.@]XsJC7 6J"nMLl-o:^΋ޙ(N:~ %J$sៜ`yAqJk|Qj7k֍+{/;OI#)ca򶽜:=bH5#*|'-TB 穲fD?SWN?{ yo~`pvXxXX~7.y'гdֽ'S{(V)ƣ{} JYA~|ϾF[\^RxѲy4Uڃ,krM4n2HeJk@|F0~Fe M:=c|S>O^+j!\v XzyeA˚rfxaikʯ^Ƕ +NVAo20^^ ]8|݃-{Y''TxÝ.(/q9}6gh7 uK~2 m;=!l*8YEtf9תsgO 7򜅦S0%0-Ν _eʰ`tB{>;B` osȴ{37:Vuz>SۦZrq? v*^%IyMhs OÑ^`S/)Yi~emqޘw\]eiҮأ2߰&TwPJl{}-;.vNmne 74>;൚f+vWg_[Dߦ`+F=/>,Hld:7"ߧԲ>}pAr՗-'s3_[ɧFJz0ֵv/:5\q9lxSuvlY}УeO͎ۄ_g˯Du F](tsQ0~N˧eO=$VogڏsSp_*WXr.kaPXGpV$$eZ!d1RI-rF%w0)y>}b<*#D(0^ذE͊qAK 7:MsܩX͜VN:lI|U>![˽u$!6>F\{RZӑ> =k[5oocAY)7qt8ەOd +JjqɅ]-LQCVkԢsӳsԝzJ*VtM +[wp*ݦ^ql~C( 2dՎm^Jmaz>}E ]4[\2O}le|޾ RpTt#*7jsSbO']I{$7FxSh>u;~_uvW|I.2==1 K v7Gʪb?${dTYA%,`Nh bP=R}_]c[UܰT'Od␖vg=(6"W@gl{c^~DH-'\JW2ZKeMsnjSکvSgmJXZZjuh |to_>/A.+9,1c?8]%Zlܚy5Z"J r7fZ(άr",#,aU}CA}3FQsZGat%vUbÊ8m*BW,c:F[첇P W>b W2{ްT|Hڹp׬o$YʙdǼP'V]-W|ٟw\.Y^qxX1U~uB +2w + K$_`=oJ~qSzTw3U`8? +WFCcffw /$S6rJiW6&dN+LG]VE2Q!kL~V(2 J S1b6٪o3$ +?!-^?98>{ؔFl[wmӽ4rRY0OzMGÖSIY,.~NBS~S!r8IHQNcN c괓˜r`Le: `U+<;5E'58 ꦳;עIGXu(jexR۱H f sYpWz 51jWf囲 ;R!b 74%Y}$Һ>FVʓ + gl89)Ns('[%SʤB:C(^ %4r}Dte +1!Bm_ LjŻۖ-I?ƟL IO>DcXCTB qՏR%1A hX`8@cbp-cQɍCGtDE9fRv8ɖZ\H=bp2t !lZF5g>\xzyQcs7ӂQGzwXM8qbT#(/e9(TqRs?'y/Jb}?+4T?Lيb3IYIpD"8R!A /GK/rSG#$Ggqq5>'8(4$II݃<'>lƝɢ_D3"NvR\\8yxDzGл}(W?h01SyguvI"P\ ʌ KD7|d7d/;m +mmj;mg)|&<_F48©W%DKh=Vn}}J(6GoqEp**bZྻg܊H4.",[ҳAAx*σ墻zĘ}l'y;)g!tݔt^=d^gf{|-VZe&>Qv})нeԍ0QOdŸ}~IՅ⥞{owl}p3dO3jٻ0:edl? NRN_jҀ2?\ogfC`3˕=#bz]?Urxv8D^"Vp8ƽ5FSsrP/Z)؞_ tVc:]n.2Wd+ôrSǔ1~OwkT$dGSuj1yuL9ǽpJg_ [d+\Zhw{5>9w7ts3cW0#~ssmwOi^mz#LhYJq̸9|`3S;}~]y^Ƿ+[2aAbΑ FP J$*Q_FwvM&7>7o |8%ݛ0S 9ط6ҪZ{|wA5щX""cKjǖܘMroГʡvZװm-#Fөͫ,V>}Մr O|_@q6sgLc}uh $(ewt"ѩ^^{/;.Cx<,ػAwFKG_W'[^xvV'.kx׽-Ͳ9yv9#ʷ[c!XGl@6<[Ma熱`V]7=*r>#a?qܹL kDlK8 +ǂu6fP&i-O9%0E6)%D]cfM(mTYtp A`rA#Sȃ쭑Ǩ۵iޞc_2>u#ݾ |!ڼݒݔS/:=^wn`OJZE!IvsyZuoo`'tYAY +&k`ҳ7:~r/p- +i}#J>QCkdL9\uU?2;Qv;jYC}x>ٴ-R8&Q7 ch14Mw8audU{^uq҉#&?N<6yL'S.v#RrwOkuv$_Y ^ԭ. TJ?NiETI +""zFte6lwA}nA׳ij<,-blU\U2J%i6O@!-K! +ۥWe? 5lo*e8{婊&q8i:]ZM + 3'k"O 3!n zluu LM/Weؾ+Sidda]_mxIk$ٟ$A jL(+YLly!d9eX2h 1$Z1ì&>$!'O,f7Gv_@";2w~dG\.3& O}L!L3q-&Vp13]e7Ih$=)ĂIK$$/RBs7[G/$ /msv=;_H.Sޅ[7¯lfjwgnBNv,I+fG=MR\&S%&UԽeOE\?MR]Ӿ4IFǹ{xP]-3w'L>k|Ax$'ocLRK޳9{.>y#{{iWtk6W!?r$v,c# +iֽ/;[7)7x@?$o4L1" +;Zz"䳗ggg5Sܜ^N$FG?x4 q8?|jyz]8ښo2Q!yh@pC:rL/yz1 pʏ^@zH>3t}_B37۶|x +صgE(`+Y8E=`Ej:t)~톒]i"}4\fy1!^Fxal<rK +reAaO?H>%L&LA*Ms\5p?u6#mK7> +䏷 _XT6i13>ey\͌3COn.:J 9;NKZ |yQidx!ʄE#3XEc%C j|-'l^ K,.n +q<sΕp&B8!z>8:hQb9n^ݱٝ?GFT F=u?HAZ*inS"AY%v6^Jf~pZ7L#V'y<}ɻq},XlJ*l +W3(w&]#+o.HI{;\aj7x?5{?HA ǙШL30;7oتfW@Y8S=`AsZavT?19xbƑ1owR1$v` +&#s}j4UvߜWV\Tj8hӲKɝUg$!d> & n̸^A{qZ۹Ĭ"Y< %)9t5~1yvS֧7Z˕!)ʜ^T?isOplAn{t-|6"zDlE{n2Kv߻ }~%VMÓΏU45YAj~Qhg +62{+¾րYjRF_W O썏se_,E5ew|<]<.Zkg;V‘eEz.D[}?B5XNW^ڇ~Y#9w[.SrIgc/&{ife +j"9dlp3}{lV/E,6#D)Cϵv)&q( k}E+hu{/Df3bm[/yp~Lk0?0.2mgņ_wNewmZFzTm1gkJh+% %W\$XfNaxXv7t}Bx-^lf"y" fԛM_7*;y- F6^/w ri|8"7K7nweFy4v$'L]*[ٕΏX܃v?Y1ש~Y55E|\X4~,m> N~xlƦw 9@/nq}qЈnylVAI/3YqE^.2+s&D89{#~њsQ]a~|1f1fc vF^!i/KvRW$FX/OFtN9Qճ_(D'W˛50q{׾%Hڈ8P+hYvV&aR{y~9d!b`*\DuQΩ\}^6]91CiS1CDuϮ rُ`j758<^XD~A]  ~DkN;[pqme'4ttlٲ(ȱQp^啳H5pO΀>?bحNE 4'1zr<՝&#L:594X?̵Ͻ?$q0[73Y;W}-.*;:4 xE+S +6AWnا/f*l  ;W~+}=kCј²ԇ?yt{BX_A6!C=d`꼶XJkӋp卹9YbMIf ^wശH{\;R5^[κWjbv='~r[q?pL j%ZՍ]>y}lEOlbj6).,IG1xyMzsTFaߌgG:vwq/7N{zG[k -P)f;w|l.w'^:t?&%]yE\P=j+/' 5v<¼rc;O48ۀ@-+i%iK.\CT o56دSͻ :?30 g}]"Tvl;qp\/B 㘝*@>#agdAVk&HMV Mx]6gsAջ~T?._ܩN-qb>٣wiR?0 V/ /P,zx#3UXx(^?輤SsQkw[7W>-MHާ*<+PQ@MNC6E;n~7x7Px~ LE R[.n^iI>tټwݝD 14QnyV VE mW0ʓ6@}-(@nR8X߼U"0ֿY00B*0BK`?ط}Yf6=n¹aFbwT6Ɂݮm}VN T2)Q$vbíAQ5A7kugLkf}-Se2M+$7 7+a>?[a> h$ _0ecjL%i␉_1S8}k`` "_cdY;nLz+W}^&s>+~5G{cGsvޭ~J"IlaOrfjL#Gd/];Sظde3~}pn!#:*f22f8MԂ'~}zυ+GφOW44dy|rFLwqu_N4(Y_vГ5IIjSA.gY|$aLi$*M6ʧ_Eq~E'"n@ҁH#!{&Z]|]v|2qC+yߗfdɧ|=' +J'6; ʩ.[?WOZ~yY4߉6hGOvyםֹɔno0QIy|g%4/,ϠUHə4RVfQvj +# j2gYuhsw17y įkWU+Pd~o|z6(Nk ȫsxr|0 (00vF%L)Ոo-*){\mh5ѸGv\0{a Augz8wf#v CC{hѓ:b} Nøʴvu4Kx8vW]ŜufEQRzZ))W44g?މ +qs^.].FtƓNDzqz0sS\ g yo\>G.Hl@u ]Z>g(EƝk}Xju*hƅ~ Mh?Hk hin9~34ogR;?.3BO;jZcqa&P6@¡s{_ͮ 17"2ҵ)j}O48mTB񿐂=2kVlyƋ}b֟x;m<{hKymz +tfrH6"(ZKw2rtk=s Cͨ.b_-HYJ;g'9ܞuSՊm+bMJηu%9^JB fa}x$h,=ՕjoijovqE]bIYv^FPgؓn8l-+#`РkXgX5~Hsۘ3z.8POmdg6V|7b׀4Wm S'Oη+J;FE0S) C11y\_Oֶظi}? _֋'-vΙU/X:wCxDޮsi'nLBGhn۬>E>q0ئ>\eУtQ?Hy}`WֽV]Vֵz/Q40Wy#Y΀擺%c[)!f\Xߚ?Y19՘n-wdO+A!rypZe_@U Ftw|)-~H ,W!7qo[_~W[`-r[zSDE/Uf{O ';C![Vao jU]փ,-El+wuY)doM7J3ӈUWim @$y4nzqβH1fz(SGoYe5WEm&8-P"Zt^kZT@y>SKFS59A]jOVwkU tyq ?/w KJ)5 +?&YEEpYvת9*AfхȂ^g>y6WT~"RT0c|#GԬgVdHtS +O(lZl// NbkԲ6]E[AoӑL|N ^ST&Z՟ O=VGeo_?:ˏS|gZQq@.4P {q~n+0i ٘.6MMբM};U88QC5a/b{f ;/ 3h*#w*]gt'AwTЎyPB;\˅?ɲ|5Z#DZ2M6F6--5Cu'RjܮWDA쐍 ^|fN n3YaD/.@3A"!b5?B?OO  9αg`&ok*V2o.cNChE<I txqk'9D|M5d" +T'(5aF4WC|;X:!-e[RQ.m ̍C"4Z _p(eL7|wu}cj0Fb'% cƎC2P `8WہUBVH \a9lswdy{t Ƃ*̕)隵5mrNdb-edcNuUkwȮ щN.X~;1v vo揸3(Ywޚa]%pBxz._=lE=2WfWVU3>T_wi^V{{:p1Irٍaj uw_UrzJM;3jn=潆]~έc$o 4j*t!on hCerٜ=ZQZ.љ#ɓdx/\G{}`b*?i0n)v}~u:\k⹕,KKy>3a&Bp{wWCʆZVd#"5OsEA6|k2>=XJo&^GFNۻ)Mzcz +HV 7q,ZM#nPb7Hk'lRIp}hUy*}ք[e-[́71 ov^* _Pn[Ew>ޯ[9$6 ׫8s?@u/uk֛{G1TkMRujHe1L?0@6TT @cF7n]/g䍠=$|+U5qI"^IT.g~eH%DY62QFFaIS`)E<_ G-{| VTVaAg~h =UңNمQú:z Rc|K = 7RRBQj?%-.܊sK +N+nB^2$r0*oq:Wd +16bcAt@xN 7@,c#*1SMnZ&Rr48ϰ^zy+r[#> ׷=##=oeHQSo~8˽wй %p$$me]K^δa |ZwYjdL\ &bD'5ov>P>o#WK y6?Z>G~"I}WH޵6;Z-3HT䝧Ir$-9'vOkcTۍޯpzn-@m!.]rE~lqh4B8yEp"+IɻsCS[_[m21=>?א75L>)|lZOy;:㯨Mbc8\Ϊsy +rm2n!km9SrPP7柴.*tFqRm +2em:u +E%LI>+%<5YLÂ|oog[bƴ70 }Ҋ"tR:x T9 3NY73ۍk\C582t% MA.S9OK(b"@_xg/X.']L@ag;.w(Ě]f'(C@[vD Pt}TLqv +~]0̨F, ;Q)F,z㼰{jyUΈ+־yiInxmg9IAm厥xXsCYو;ENI=hX^d]mɾԋ( 8|Y`/XP̙8 o n븹-fU~35YJqLHLUYY;n]}Yhn3%|hSt}UgˇH(:v ~szk1%Wh[r17+ymjzgd.J򘾽;|_$?/#-}|t=w0Gc/ݗ-w&"w"7M[[n<=!If.#gH Q1Y|SiZ]aWsJV9z\f~J;ϛ± +njŅuBV$Td? + %\QͩhFB'A]YS2kr=(kuW&mx,8!QٮXnZk$`2T_.b]2,bkgϛ}'4'.u+\4I/={J[=rhSkh֔3&^[ܜ&m=cm~aVB)ZNmIz8w[𢽰GGOb=E{0K>y<Ż/6w|1M⻬ qX)m}vHAP J$# V,eAIŹ +5"\t&m4ҫIYGV!ӜߞQkm/%u8<q!ﰆ +0?w6}aRN:ry/eq*ްt!swm ۪dOE;њ>NxdT`ޭhDtC6ڙPY#;F "}#qCn>i` 2Qo3RUYC b(} )`kS{?509ҦlɅrDt̬¯&:a +CYh, +!wt=+F"z6lVa{r {T6jw h02p~y <Lct.{/oQCm^2H=OS[avI*J} +n ̧g-K)`N6@Q-@ @i"@Ys +PxP B;B4 +R,F]ژrxJqvi)Eդˬe/ߙFwh ܹ㞊6V`XSzV辱Q Лi%1M4yoC 8- +`ª0`.<\W +/Ώ7D279sč@[K~kc?W 85gGmf[;J1Ф返kxT/MDڽJM"&bV,(pm=\ԽtlKҠ//Yj> Z)OOY(8WQ?v1ѡ`>q`|#iPGX&v 6wO=X$n[L~zRP}6߅1W>q)ILDŽ)+ǃf꧅1B® ;(ӻ_waAނF|goű]dMү.E);բ'F)E ~|S{TwYGzNZi2$Ny) >Jÿ &1#^Oc{5~|pzb< M. σ]q62/<<3Tu/v˖6ѐѠliy=y݉?dϡ*e`e[~ Z *:Siy(ǩ.u瞯e'>uwX[ Lw/96 A𴫄Deb +ZRrmeZ+Ѣ5O-Z4I;a^zsl>_VQ.sxݖ|jZdbvk<(ѫbTF󝇎2%ex#v+> l؟r+<y'qU2=U>:[&[/yn o0\qFnqk=5op7δ *!VY6k/2NBqȩ4 m}4pTӝTbkQLg xl$g%Bs[y4) +yh錸Ϋ 伳ٕgV>gvLkȫVF tQϣKivVVY."\^} %R_^Nt>;;16S\N\{եq̪àڸw%go?>\g&IgPvTu:Z>d SH`IՖ(#nw7nj]::coSܶX&4K?X-qq!~iC` ZUsλZ$ifZƊzy~ `^kZa>1_+F/0n#CBp{ِ۴vyL9^ljsgX->p9{La=vK4o0ڒ8"-<×QKں98\=YѾĂ/gٶg1:ۏnPoON#3Vl-ɌfׇtKfوʶRc6)YX/Nqs];"9I(2LS+qOixDaF2f8vuww*c;rYJo6*[632`˝Ӵ1k%}b͢) +YYy`]J[єLcOǤNmCIQ)I>f| }|M>^aK~}zyd3[e1RuXOy6rvmAUףq!`Uw\4?7e`b-qYS7խSf~ :r=216cގ=]b[l6ڔ=zk:_۩6-cVI}V5p֒yN|,IxB3ف0 ϓv{\!M4vq\>z\X!"AP < _2ww@7^Wb;Q'"f +[NGumLV C<,gwՎx6>a5k(^QN͙X'>28_a޽T`MmlGl*X2=Z!{G:h{- +N}{۠ sV}uM'#|YS2$ƘPCul +"7M&Hș^Էg,Ċ&]2VY| mU_] ;Aq:%H +XGq ̐Jɘd^Nt/OOaI|.~/9%=,&!9C=WJ %Zr +W䨚b\kI7= LBi",(@m/V -W;E]-+w7FtN+|kPj^7g+5䡄TfZ;F(R}aDHj M«WTgK698M0ͻpfMLk xwA*j8 BoŸ,+,6Mإ 4#Q#U^^b )ܻ 圻[l'pmy tw L|'n[ATJ٬+ܸUY*5\G<GrX҅fxTq lqt s*NIxm/dh}Ż˭AWp 2AjuDok%2`U? R:]/K?CC?0̈́Ȳ^^Lh1@8 +rܢ$]sr.BXlf7$_<΃kgVf}ng:k4vfEj3*Sq]hRXЅ3vHlP` +g_9n9?#)Ռ̭~ N*)N @ +@^ + +o @#kJ1|1߂tl_'~tͺ_}IՀ0YnW4V%]$+LV ; HvdqH}Oc$ǻP"wI? U +8yyry?}/mXrK fquB ;߸TCٖ*\IdPe)J59y:75R pCS[_|ezҙTOK̯Tnɰ^%*ذwޫV%]gaT[* n5'=4 +% `gm4s& 4*{ +BJe& FDȻ^ ܷD5K.(i;P +o,&?5T׏[mJ( S<>wߟW@|f@6iw7cB?q1PcBI2ÃV?b;ҷ4HĆn]w/v$\4|a&^Tv+byZ5 [d>:ڦ?k uS >Oˁv }w̃۬(]zw +waAuΫ}OMVݵbܽ1Wun,e.U_qN|x?j7؟9uv -v.Z1!݋4 &g 3⵭:ǛT8lj|vml\tz?pQwv./ҠO=,EBC?A?~5yfke.tx;_6p:s~4tu'DotlW@.fwШh{ኌw9mF۰U~oV:-9$of"O>MWpt`/xHMFi8ԟ{<w1 98s49zٜ%@;bivm5 HFZ`gzvʥ}f=-3C4IwJɓ5gޤs} ttn*(fr. ̣]E- +\9j B!]4] س\$V|/}.uvTZI=}/Oz< <N^K^iž|E8pvդ+F i +,>Zg ZU36]W\YS ~.m$ja 鞖P1-8676߯ _|h^w86x>?^m5 O+aS➲| .(\A'tmso%$+lá5?͛b{`ƴΖ0]݆ѓ%? ު/iLbj&H h9-qmipj7cͽlosOޞ+J-SۋہP<^Ƭ`T!´H<9dTz c2ntѣFt~Ek‰~ˣhU(mzxif3Uo毘W1\m͊na<dۂYeq_[w4GvU،mp~5J亳0( šp/>\*r@[y7z&|Ι}Қ4^\?xO-~Nk4juz^4;FW=,s nVO15=5n/> +`7;.dT +Bo7Ƚ{*S:Mwq4O&1=S[ ('#Mzr2z~- SmXɁBbORчP&hQ˸+Ok$ӫ^;aw{ca=٥@GUÜܛ]/ڸ]4G>9?ƋЀT/Ű?lk{(i,h%WOWQK!EO~_c4߭oRЂmi/jIC٬[wCՍ;Qg:[.΋pq{Te.'s4- #˴uQ\]j';8PGud\  LlA&>d#ztݶrUnlK(P\U Y+Z~Sҳap3 =\2 _{Pp)m+}2oxbO>&,QbJw@v`AH,U} J|{lq5ew x{Ȼ-f-T#^uiUV{QTt''n*mm'޳{1lB򯮺+@ިt oTy~Ϯ{ӥ<<-9qJ + _Ӷ]p HB~,LcɃ}c*YiUƓ~E碬֟D]qoiаۢr -_l?P+Fau^fSJSLbPcn #btC-c[ʏKatF[qN^*gPa!-̄.nz9X Wk3}+Y:7V)fL=1hm +Cb^}jB{/8 E>5~WC\m>X6r0=܋e`(bHvcq_RܑE,_IkApBI3 'uEjr9r7݋Z11(]b6Y*k\ݶsᾠWS +Av;Ũ,r^6M7?>y{;ո\T7lGyM@&۝d*DkrpgtN&@d ZCϨ/~^5x!^{41uf`%H @wï?;ĮYW%5^.thIbp5BGӄ3uW;UQuy>-W֧-[鏍I9:ЧRFҞ¿X0父8t&FuaPi=(W +(m`'գeVrUq_ҽٲzP*Η Ϥ=+wT5Wz~ {yo3ɳ{/v6&ռQ:) N$8/ń=# E8q.%TŜ(=1flɫH?X=:AfdF.`]йhzpJ5^xIzђzJ{@!!c֮X:C; 7v_\[vfQ̨Wyb'uXrؓxPܥ&)"##Ѳ"Z8R|KȤ~zXvxU,T#od=*"K{lg_JsR,Gy_-.,I8cBÿLh/$iħQ$64veOoџ=b>@9\ޅ}&[qאW?vd;WqR /f{2o?~ݢ|LG0J Og#%M{Ҁ wi-{M<9n3OgaΝ*z&UaUɽOxD +UqxmU+v *^*7+WŞd~~/``Gz>3uc ۻqtƶW37*4(!G*Dݿ3W_Ng0{F[~:x̯olxM\亳̭.C"BVPPf=ݹLRy~v cnծ tiPhS/>U>ʵ[y%za[C軻S(h*rcJ~j8iy wq8UtL:?Ψ?p67=랟 n> 2;g +5wb0<ыTu>/8YtT<K&5]ګv~xI `u׾o,]zp?,7lzN#tzvcު6T`Ӳ-CK1vLNr5(_ilcQF3U4^0^22ۼ WF1džVH նN '9^hH U}`0*}Y LDzWV|?(ae[-  ptܾ90,.\5W5-{]T}1 +>b_ȷVis!6Qq|󄲲sbZ96.& +v#{"#F$.\l۫_4;żvrɏX$k3\.RSj$ȾO>O_\&N'OjZ༭7O~@&Nc;n\ջ5a}Y۫RUK(S>w{ yۆ}Yh$X\7HgjX2! r{9]6ǓY­ Zvgkpk'W@rp7 #W_J-|;Ѱnk90Bf>NeķOޫ@ #@gRz${=+B+[hxux7 c{KP3AYpMv\lk]aa,lOC=6._9mkL?ѰI< ]2EJ'^)^J~aUvUq$,>Hwf1 +"6T+[r'!M%Sg}QclbBPgn}Ty/~ϻ"ް0U/f`Lut&gj4/ֽ_NsbM;ƼL +$y>4הQ7}2uP?RjFs;"uNz$=9j=s,*A/{i/eO4Vep"뮜QX.{;}6Lg!+ɠ:, vs٥>[kTx圵)_# gh)nox6:A%@>h|+7<Yn@kFUi:\wz*[pifyn/Mɱ, =R}*f$ '{DfCB_p@85c"bX!c[DW-:Zf!edgnG}v몚aUWwƴC mcϻrnج61AqLf@|V}9';_a=Ѝ2Fî^E"Ȣpa kOi9ԾXwkMjÆ"5Jdw:њidpn^רYBWQe".RӦU'&Ndj3`SF4B~E BoBȃD.ԆoYLu^2ōI֫2w|4noMlZEm,Cj]r[I ›VD/1ЊhS6Fyj`ݪ~SݬY䲈OӠe_,ZHA%bFu/ZeU׭r5[Z];TOs)͔;ޠ;:"qG4FnsN5ЁksX{ҹܽcJUڕA+VUTXNLu`2̰eEк\Mnha8bc } 9 [{ >I1XӾ `m )pp9p+|~_ Q;AMA@0S+ @#(aJ)\ FG*[>O^r6K +vnyLPwXOܛ96@8| NŢ Hd|(Tݠjj@@@m#@|-E|?Iet٦0,:+,بlng +cp_(}21}ky o= y;_z;O c922X-L-U)`˕eJJ[5:-贆A^CVe9cɷ9h +_ O<_A_[rmuK7mY>L&>?MB~ߕF(O#j?q))jL$i_&4?TK|®J݇[,I~r^꧂44Eǻ'}}+5otcso?]Wj{o%_(Əȋ(Zܧ&4t+myIX +<52|v5&!b{ +t!R:WA{=x#1Pl.L_?;%) O-2 ~xW鼽]v 8L \X<~X=Z~;,Ng*f1{xIs?>ƙm؜rE;aC~W~Lh[u+iӝܒMЂ.u֌>B\™OvLg]qʀ[E]4U`_B=?7_Թ$ [ JJWF-Vp̟j:+Of&:G{Nmޘ-PVY\<\뛼=$-`O +n8] {L,='܉o9wu}P6H4TXz]QmS٨M.6ZTV|iCU6sQ6l}}3_=ŌGʇ_hכq~[p~{Z~øq˻z*:g*180[Xa:gdfޣ0]j{V?Lf]g]:Xr06*nw2g~@Y{7sιks:Fpiy)˳k{ f#bE]&UEwy[ksq$9gD"Plz@fF De./6ko[;^-Ю .6tl\;!i~?_ c&gW-Vn+.7]' +oXlO7>nɈY{JdtWkCԁճKs۰я?*˴C@G'4'?P?ru\@5N7ӻ88xȍfK{̴`3qjr5^'xtd_ޞ^zu}<$LW;wp4tZzAݝT-#YkSơ}`aiW p#Xj[V+/3q.c 3G97msb%0+w⏸3˩M]˃ì:!>r QYۉu-k'o$_ڧ@nS(=}v0J4!9^_\<5*\ל@f| bN&5vC6j: +f?,M4pPsKVr'*8pTo6h626˃Q;6u͐o&0FG >.=:]mJTZfEs%˙LݮYcC'#F#{]]:ϩ9bvqm'cۮSszȵѦfmrf.h_Cgz|j]f̩㽦)2ܝmimb5VAf)_>Qf4^Yz$-K@OoQ&r_E}4>W#ӤrŇ, 2 Wu5ݱkQͪhb+H+&ڶqyPL[%ޚr4efU#mKsI<qR=Dz뭣@ *3E TxEH,rILH+ aґ+5~:!1-c gk84bjѕ檕zL˺&z" +%e 64qi]^]eq8o^q3Ss븖b=cOv/; ɋq]@7 G)Xsg}+(9#FCCKu}u-;?MsDk!Nwz4cl#fnȹ{bNpf;c4&1,<˫<ks@uzWAf=-V1c\wjkK.QrB^tkw=nZrb/9J01ǣŖA@mLg  އcFO2̅-urњ(7@8V1/?`kM*Kf-ǹVoqvu]V}D9kQl&bMzXt}M+rCEWllXTt:2 VLN2,`> m^#my+:-bՅ5YQAC¬Pr{r*.~/p 37WcX(yBbY`?whvݨ%ULQz6mۺ%%znLJ /Od)RT5;FZ^WX1_Ah78UM"/!7kopj"kiVk4gv.h"x~ڼ=MbTQj?iP+_'hWHlQ'>2! + 2uc5%?*ƼZW34<.aCJ=> endobj xref 0 33 0000000000 65535 f +0000000016 00000 n +0000000144 00000 n +0000050570 00000 n +0000000000 00000 f +0000052559 00000 n +0001274596 00000 n +0000050621 00000 n +0000050976 00000 n +0000545561 00000 n +0000052857 00000 n +0000052746 00000 n +0000051844 00000 n +0000051998 00000 n +0000052046 00000 n +0000052630 00000 n +0000052661 00000 n +0000052892 00000 n +0000545634 00000 n +0000546032 00000 n +0000547038 00000 n +0000555015 00000 n +0000620603 00000 n +0000686191 00000 n +0000749892 00000 n +0000815480 00000 n +0000881068 00000 n +0000946656 00000 n +0001012244 00000 n +0001077832 00000 n +0001143420 00000 n +0001209008 00000 n +0001274619 00000 n +trailer <<41798DF308A846DABE561D45CD550936>]>> startxref 1274791 %%EOF \ No newline at end of file diff --git a/images/search.png b/images/search.png new file mode 100644 index 00000000..9fc55471 Binary files /dev/null and b/images/search.png differ diff --git a/js/libraries/balupton-history.js-e84ad00.zip b/js/libraries/balupton-history.js-e84ad00.zip new file mode 100644 index 00000000..a2df40c4 Binary files /dev/null and b/js/libraries/balupton-history.js-e84ad00.zip differ diff --git a/js/libraries/balupton-history/.gitignore b/js/libraries/balupton-history/.gitignore new file mode 100755 index 00000000..b7f13992 --- /dev/null +++ b/js/libraries/balupton-history/.gitignore @@ -0,0 +1 @@ +.build \ No newline at end of file diff --git a/js/libraries/balupton-history/History.md b/js/libraries/balupton-history/History.md new file mode 100755 index 00000000..7a2d9ff4 --- /dev/null +++ b/js/libraries/balupton-history/History.md @@ -0,0 +1,76 @@ +## History + +- v1.7.1 - October 4 2011 + - Added a new native adapter which is framework agnostic (can be used with, or without any framework) + - Provided bundled files + - Added RightJS adapter + - Updated supported browser listing + - Added sessionStorage support in core instead of optional Amplify.js Store support + - Fixed issue with state id generation growing slower over time + - Closes #104, #95, #102, #92, #81, #90, #94, #93, #91, #67, #83, #54, #45 + +- v1.7.0 - April 1 2011 + - Added `History.enabled` property (refer to usage section). This reflects whether or not History.js is enabled for our particular browser. For instance, if we have not included support for a HTML4 browser and we are accessing through a HTML4 browser then `History.enabled` will be `false`. + - Added (optional but recommended) Data Persistance and Synchronisation Support thanks to [AppendTo's](http://appendto.com/) [Amplify.js](http://amplifyjs.com/) (refer to installation and compatibility sections for details) + - Made HTML5 SUIDs more transparent - [Reported](https://github.com/balupton/history.js/issues#issue/34) by [azago](https://github.com/azago) and [Mark Jaquith](http://markjaquith.com/) + - Fixed Session Storage Issue - Reported by a whole bunch of different people; [one](https://github.com/balupton/history.js/issues#issue/36), [two](https://github.com/balupton/history.js/issues#issue/37), [three](http://getsatisfaction.com/balupton/topics/history_js_1_6_losing_state_after_manual_page_reload) + - Fixed URL Encoding Issue - [Reported](https://github.com/balupton/history.js/issues/#issue/33) by [Rob Madole](http://robmadole.com/) + - Disabled support for IE6,7,8 when using the Prototype Adapter (there is nothing we can do about this, it is due to a bug in the prototype library) - [Reported](https://github.com/balupton/history.js/issues#issue/39) by [Sindre Wimberger](http://sindre.at/) + - URLs in the State Hashes for HTML4 Browsers are now even shorter - [Discussion](https://github.com/balupton/history.js/issues#issue/28) + - Fixed a issue with the MooTools Adapter and JSON with IE7 and IE8 + +- v1.6.0 - March 22 2011 + - Added Zepto adapter thanks to [Matt Garrett](http://twitter.com/#!/matthewgarrett) + - The readme now references the supported versions of the libraries we use + - Updated vendors to the most recent versions. jQuery 1.5.1 and Mootools 1.3.1 + - Reverted versions of Safari iOS prior to version 4.3 to be HTML4 browsers, Safari iOS 4.3 is a HTML5 browser + - Refined code in History.js and its adapters + - Fixed issue with extra state being inserted on Safari 5 requiring an extra click on the back button to go home - [Reported](https://github.com/balupton/history.js/issues#issue/17) by [Rob Madole](http://robmadole.com/) + - Fixed issue with Safari 5 and Safari iOS 4 sometimes failing to apply the state change under busy conditions - Solution conceived with [Matt Garrett](http://twitter.com/matthewgarrett) + - Fixed issue with HTML4 browsers requiring a query-string in the urls of states - [Reported](https://github.com/balupton/history.js/issues#issue/26) by [azago](https://github.com/azago) + - Fixed issue with HTML4 browsers requiring title in the states in order to use state data - [Reported](https://github.com/balupton/history.js/issues#issue/25) by [Jonathan McLaughlin](http://system-werks.com/) + - Fixed issue with HTML4 browsers failing is a state is pushed/replaced twice in a row - [Reported](https://github.com/balupton/history.js/issues#issue/17) by [Joey Baker](http://byjoeybaker.com/) + - **B/C BREAK:** The `statechange` event now only fires if the state has changed; it no longer fires on page initialisation. This is following the [Firefox 4 History API Changes](http://hacks.mozilla.org/2011/03/history-api-changes-in-firefox-4/) which we agree with - this breaks standard, but makes more sense. + +- v1.5.0 - February 12 2011 + - Moved to UglifyJS instead of Google Closure + - Split HTML4 functionality from HTML5 functionality + - Installation details have changed (the filenames are different) + +- v1.4.1 - February 10 2011 + - Added HTML History API Support for Safari 5 and Safari iOS 4.2.1 + - Cleaned code a bit (mostly with unit tests) + +- v1.4.0 - February 10 2011 + - Unit Testing now uses [QUnit](http://docs.jquery.com/Qunit) + - Corrected Safari 5 Support + - Now uses queues instead of timeouts + - This means the API works exactly as expected, no more need to wrap calls in timeouts + - Included a Subscribe Form in the Demo for Version Updates via Email + - Small updates to Documentation + +- v1.3.1 - February 4 2011 + - Improved Documentation + +- v1.3.0 - January 31 2011 + - Support for cleaner HTML4 States + +- v1.2.1 - January 30 2011 + - Fixed History.log always being called - [reported by dlee](https://github.com/balupton/history.js/issues/#issue/2) + - Re-Added `History.go(index)` support + +- v1.2.0 - January 25 2011 + - Support for HTML4 States in HTML5 Browsers (added test) + - Updates of Documentation + +- v1.1.0 - January 24 2011 + - Developed a series of automated test cases + - Fixed issue with traditional anchors + - Fixed issue with differing replaceState functionality in HTML4 Browsers + - Fixed issue with Google Chrome artefacts being carried over to the initial state + - Provided `onstatechange` and `onanchorchange` events + +- v1.0.0 - January 22 2011 + - Supported `History.pushState` and `History.replaceState` degradation + - Supported jQuery, MooTools and Prototype Frameworks + diff --git a/js/libraries/balupton-history/README.md b/js/libraries/balupton-history/README.md new file mode 100755 index 00000000..05678c56 --- /dev/null +++ b/js/libraries/balupton-history/README.md @@ -0,0 +1,245 @@ +Welcome to History.js (v1.7.1 - October 4 2011) +================== + +[![Flattr this project](http://api.flattr.com/button/flattr-badge-large.png)](https://flattr.com/submit/auto?user_id=balupton&url=https://github.com/balupton/history.js&title=History.js&language=&tags=github&category=software) + + +This project is the successor of [jQuery History](http://balupton.com/projects/jquery-history), it aims to: + +- Follow the [HTML5 History API](https://developer.mozilla.org/en/DOM/Manipulating_the_browser_history) as much as possible +- Provide a cross-compatible experience for all HTML5 Browsers (they all implement the HTML5 History API a little bit differently causing different behaviours and sometimes bugs - History.js fixes this ensuring the experience is as expected / the same / great throughout the HTML5 browsers) +- Provide a backwards-compatible experience for all HTML4 Browsers using a hash-fallback (including continued support for the HTML5 History API's `data`, `title`, `pushState` and `replaceState`) with the option to [remove HTML4 support if it is not right for your application](https://github.com/balupton/history.js/wiki/Intelligent-State-Handling) +- Provide a forwards-compatible experience for HTML4 States to HTML5 States (so if a hash-fallbacked url is accessed by a HTML5 browser it is naturally transformed into its non-hashed url equivalent) +- Provide support for as many javascript frameworks as possible via adapters; especially [jQuery](http://jquery.com/), [MooTools](http://mootools.net/), [Prototype](http://www.prototypejs.org/) and [Zepto](http://zeptojs.com/) + + +## Usage + +### Working with History.js: + +``` javascript +(function(window,undefined){ + + // Prepare + var History = window.History; // Note: We are using a capital H instead of a lower h + if ( !History.enabled ) { + // History.js is disabled for this browser. + // This is because we can optionally choose to support HTML4 browsers or not. + return false; + } + + // Bind to StateChange Event + History.Adapter.bind(window,'statechange',function(){ // Note: We are using statechange instead of popstate + var State = History.getState(); // Note: We are using History.getState() instead of event.state + History.log(State.data, State.title, State.url); + }); + + // Change our States + History.pushState({state:1}, "State 1", "?state=1"); // logs {state:1}, "State 1", "?state=1" + History.pushState({state:2}, "State 2", "?state=2"); // logs {state:2}, "State 2", "?state=2" + History.replaceState({state:3}, "State 3", "?state=3"); // logs {state:3}, "State 3", "?state=3" + History.pushState(null, null, "?state=4"); // logs {}, '', "?state=4" + History.back(); // logs {state:3}, "State 3", "?state=3" + History.back(); // logs {state:1}, "State 1", "?state=1" + History.back(); // logs {}, "Home Page", "?" + History.go(2); // logs {state:3}, "State 3", "?state=3" + +})(window); +``` + +To ajaxify your entire website with the HTML5 History API, History.js and jQuery [this snippet of code](https://gist.github.com/854622) is all you need. It's that easy. + +### How would the above operations look in a HTML5 Browser? + +1. www.mysite.com +1. www.mysite.com/?state=1 +1. www.mysite.com/?state=2 +1. www.mysite.com/?state=3 +1. www.mysite.com/?state=4 +1. www.mysite.com/?state=3 +1. www.mysite.com/?state=1 +1. www.mysite.com +1. www.mysite.com/?state=3 + +> Note: These urls also work in HTML4 browsers and Search Engines. So no need for the hashbang (`#!`) fragment-identifier that google ["recommends"](https://github.com/balupton/history.js/wiki/Intelligent-State-Handling). + +### How would they look in a HTML4 Browser? + +1. www.mysite.com +1. www.mysite.com/#?state=1&_suid=1 +1. www.mysite.com/#?state=2&_suid=2 +1. www.mysite.com/#?state=3&_suid=3 +1. www.mysite.com/#?state=4 +1. www.mysite.com/#?state=3&_suid=3 +1. www.mysite.com/#?state=1&_suid=1 +1. www.mysite.com +1. www.mysite.com/#?state=3&_suid=3 + +> Note 1: These urls also work in HTML5 browsers - we use `replaceState` to transform these HTML4 states into their HTML5 equivalents so the user won't even notice :-) +> +> Note 2: These urls will be automatically url-encoded in IE6 to prevent certain browser-specific bugs. +> +> Note 3: Support for HTML4 browsers (this hash fallback) is optional [- why supporting HTML4 browsers could be either good or bad based on my app's use cases](https://github.com/balupton/history.js/wiki/Intelligent-State-Handling) + +### What's the deal with the SUIDs used in the HTML4 States? + +- SUIDs (State Unique Identifiers) are used when we utilise a `title` and/or `data` in our state. Adding a SUID allows us to associate particular states with data and titles while keeping the urls as simple as possible (don't worry it's all tested, working and a lot smarter than I'm making it out to be). +- If you aren't utilising `title` or `data` then we don't even include a SUID (as there is no need for it) - as seen by State 4 above :-) +- We also shrink the urls to make sure that the smallest url will be used. For instance we will adjust `http://www.mysite.com/#http://www.mysite.com/projects/History.js` to become `http://www.mysite.com/#/projects/History.js` automatically. (again tested, working, and smarter). +- It works with domains, subdomains, subdirectories, whatever - doesn't matter where you put it. It's smart. +- Safari 5 will also have a SUID appended to the URL, it is entirely transparent but just a visible side-effect. It is required to fix a bug with Safari 5. + +### Is there a working demo? + +- Sure is, give it a download and navigate to the demo directory in your browser :-) +- If you are after something a bit more adventurous than a end-user demo, open up the tests directory in your browser and editor - it'll rock your world and show all the vast use cases that History.js supports. + + +## Download & Installation + +- Download History.js and upload it to your webserver. Download links: [tar.gz](https://github.com/balupton/history.js/tarball/master) or [zip](https://github.com/balupton/history.js/zipball/master) + +- Include History.js + + - For [jQuery](http://jquery.com/) v1.3+ + + ``` html + + ``` + + - For [Mootools](http://mootools.net/) v1.3+ + + ``` html + + ``` + + - For [Right.js](http://rightjs.org/) v2.2+ + + ``` html + + ``` + + - For [Zepto](http://zeptojs.com/) v0.5+ + + ``` html + + ``` + + - For everything else + + ``` html + + ``` + +> Note: If you want to only support HTML5 Browsers and not HTML4 Browsers (so no hash fallback support) then just change the `/html4+html5/` part in the urls to just `/html5/`. [Why supporting HTML4 browsers could be either good or bad based on my app's use cases](https://github.com/balupton/history.js/wiki/Intelligent-State-Handling) + + +## Get Updates + +- For Commit RSS/Atom Updates: + - You can subscribe via the [GitHub Commit Atom Feed](http://feeds.feedburner.com/historyjs) +- For GitHub News Feed Updates: + - You can click the "watch" button up the top right of History.js's [GitHub Project Page](https://github.com/balupton/history.js) + + +## Get Support + +- History.js is maintained by people like you. If you find a bug, report it to the [GitHub Issue Tracker](https://github.com/balupton/history.js/issues). If you've fixed a bug submit a [Pull Request](https://github.com/balupton/history.js/pulls) and add your fork to the [Network Wiki Page](https://github.com/balupton/history.js/wiki/Network). + +- If you would like paid support and trainings, or have job offers, then refer to the [Network Wiki Page](https://github.com/balupton/history.js/wiki/Network). If you are qualified with History.js, then be sure to add your details to that page too. + +- If your company uses History.js on your projects, and would like to see it grow and prosper (better documentation, bugfixes, upgrades, maintenance, etc.) and would love to become a corporate sponsor then do email sponsor@bevry.me + +- If you would like free support for History.js, then [post your question](http://stackoverflow.com/questions/ask) on [Stackoverflow](http://stackoverflow.com/about) and be sure to use the `history.js` tag when asking your question. + +- If you've created a website that uses History.js, or know of one. Then be sure to add it to the [Showcase Wiki Page](https://github.com/balupton/history.js/wiki/Showcase). + +- If you'd love to +1 or like this project, then be sure to tweet about it and click the "watch" button up the top of its [Project Page](https://github.com/balupton/history.js). + +- For anything else, refer to the [History.js GitHub Wiki Site](https://github.com/balupton/history.js/wiki). + +Thanks! every bit of help really does make a difference! + + +## Browsers: Tested and Working In + +### HTML5 Browsers + +- Firefox 4+ +- Chrome 8+ +- Opera 11.5 +- Safari 5.0+ +- Safari iOS 4.3+ + +### HTML4 Browsers + +- IE 6, 7, 8, 9 +- Firefox 3 +- Opera 10, 11.0 +- Safari 4 +- Safari iOS 4.2, 4.1, 4.0, 3.2 + + +## Exposed API + +### Functions + +- `History.pushState(data,title,url)`
    Pushes a new state to the browser; `data` can be null or an object, `title` can be null or a string, `url` must be a string +- `History.replaceState(data,title,url)`
    Replaces the existing state with a new state to the browser; `data` can be null or an object, `title` can be null or a string, `url` must be a string +- `History.getState()`
    Gets the current state of the browser, returns an object with `data`, `title` and `url` +- `History.getHash()`
    Gets the current hash of the browser +- `History.Adapter.bind(element,event,callback)`
    A framework independent event binder, you may either use this or your framework's native event binder. +- `History.Adapter.trigger(element,event)`
    A framework independent event trigger, you may either use this or your framework's native event trigger. +- `History.Adapter.onDomLoad(callback)`
    A framework independent onDomLoad binder, you may either use this or your framework's native onDomLoad binder. +- `History.back()`
    Go back once through the history (same as hitting the browser's back button) +- `History.forward()`
    Go forward once through the history (same as hitting the browser's forward button) +- `History.go(X)`
    If X is negative go back through history X times, if X is positive go forwards through history X times +- `History.log(...)`
    Logs messages to the console, the log element, and fallbacks to alert if neither of those two exist +- `History.debug(...)`
    Same as `History.log` but only runs if `History.debug.enable === true` + +### Events + +- `window.onstatechange`
    Fired when the state of the page changes (does not include hash changes) +- `window.onanchorchange`
    Fired when the anchor of the page changes (does not include state hashes) + + +## Notes on Compatibility + +- History.js **solves** the following browser bugs: + - HTML5 Browsers + - Chrome 8 sometimes does not contain the correct state data when traversing back to the initial state + - Safari 5, Safari iOS 4 and Firefox 3 and 4 do not fire the `onhashchange` event when the page is loaded with a hash + - Safari 5 and Safari iOS 4 do not fire the `onpopstate` event when the hash has changed unlike the other browsers + - Safari 5 and Safari iOS 4 fail to return to the correct state once a hash is replaced by a `replaceState` call / [bug report](https://bugs.webkit.org/show_bug.cgi?id=56249) + - Safari 5 and Safari iOS 4 sometimes fail to apply the state change under busy conditions / [bug report](https://bugs.webkit.org/show_bug.cgi?id=42940) + - Google Chrome 8,9,10 and Firefox 4 prior to the RC will always fire `onpopstate` once the page has loaded / [change recommendation](http://hacks.mozilla.org/2011/03/history-api-changes-in-firefox-4/) + - Safari iOS 4.0, 4.1, 4.2 have a working HTML5 History API - although the actual back buttons of the browsers do not work, therefore we treat them as HTML4 browsers + - None of the HTML5 browsers actually utilise the `title` argument to the `pushState` and `replaceState` calls + - HTML4 Browsers + - Old browsers like MSIE 6,7 and Firefox 2 do not have a `onhashchange` event + - MSIE 6 and 7 sometimes do not apply a hash even it was told to (requiring a second call to the apply function) + - Non-Opera HTML4 browsers sometimes do not apply the hash when the hash is not `urlencoded` + - All Browsers + - State data and titles do not persist once the site is left and then returned (includes page refreshes) + - State titles are never applied to the `document.title` +- ReplaceState functionality is emulated in HTML4 browsers by discarding the replaced state, so when the discarded state is accessed it is skipped using the appropriate `History.back()` / `History.forward()` call +- Data persistance and synchronisation works like so: Every second or so, the SUIDs and URLs of the states will synchronise between the store and the local session. When a new session opens a familiar state (via the SUID or the URL) and it is not found locally then it will attempt to load the last known stored state with that information. +- URLs will be unescaped to the maximum, so for instance the URL `?key=a%20b%252c` will become `?key=a b c`. This is to ensure consistency between browser url encodings. +- Changing the hash of the page causes `onpopstate` to fire (this is expected/standard functionality). To ensure correct compatibility between HTML5 and HTML4 browsers the following events have been created: + - `window.onstatechange`: this is the same as the `onpopstate` event except it does not fire for traditional anchors + - `window.onanchorchange`: this is the same as the `onhashchange` event except it does not fire for states +- Known Issues + - Opera 11 fails to create history entries when under stressful loads (events fire perfectly, just the history events fail) - there is nothing we can do about this + - Mercury iOS fails to apply url changes (hashes and HTML5 History API states) - there is nothing we can do about this + + + +## History + +You can discover the history inside the [History.md](https://github.com/balupton/history.js/blob/master/History.md#files) file + + +## License + +Licensed under the [New BSD License](http://opensource.org/licenses/BSD-3-Clause) +
    Copyright © 2011-2012 [Benjamin Arthur Lupton](http://balupton.com) \ No newline at end of file diff --git a/js/libraries/balupton-history/buildr.coffee b/js/libraries/balupton-history/buildr.coffee new file mode 100755 index 00000000..60910ae7 --- /dev/null +++ b/js/libraries/balupton-history/buildr.coffee @@ -0,0 +1,281 @@ +# Requires +buildr = require 'buildr' +util = require 'util' + +# Options +options = + watch: false + compress: true + +# Configs +configs = + standard: + # Options + name: 'standard' + watch: options.watch + + # Paths + srcPath: __dirname+'/scripts/uncompressed' + outPath: __dirname+'/scripts/compressed' + + # Checking + checkScripts: true + jshintOptions: + browser: true + laxbreak: true + boss: true + undef: true + onevar: true + strict: true + noarg: true + + # Compression (without outPath only the generated bundle files are compressed) + compressScripts: options.compress # Array or true or false + + other: [ + + # ----------------------------- + # JQUERY + + { + # Options + name: 'html4+html5+jquery' + watch: options.watch + + # Paths + srcPath: __dirname+'/scripts/uncompressed' + + # Compression (without outPath only the generated bundle files are compressed) + compressScripts: options.compress # Array or true or false + + # Order + scriptsOrder: [ + 'json2.js' + 'history.adapter.jquery.js' + 'history.html4.js' + 'history.js' + ] + + # Bundling + bundleScriptPath: __dirname+'/scripts/bundled/html4+html5/jquery.history.js' + } + { + # Options + name: 'html5+jquery' + watch: options.watch + + # Paths + srcPath: __dirname+'/scripts/uncompressed' + + # Compression (without outPath only the generated bundle files are compressed) + compressScripts: options.compress # Array or true or false + + # Order + scriptsOrder: [ + 'history.adapter.jquery.js' + 'history.js' + ] + + # Bundling + bundleScriptPath: __dirname+'/scripts/bundled/html5/jquery.history.js' + } + + + # ----------------------------- + # MOOTOOLS + + { + # Options + name: 'html4+html5+mootools' + watch: options.watch + + # Paths + srcPath: __dirname+'/scripts/uncompressed' + + # Compression (without outPath only the generated bundle files are compressed) + compressScripts: options.compress # Array or true or false + + # Order + scriptsOrder: [ + 'json2.js' + 'history.adapter.mootools.js' + 'history.html4.js' + 'history.js' + ] + + # Bundling + bundleScriptPath: __dirname+'/scripts/bundled/html4+html5/mootools.history.js' + } + { + # Options + name: 'html5+mootools' + watch: options.watch + + # Paths + srcPath: __dirname+'/scripts/uncompressed' + + # Compression (without outPath only the generated bundle files are compressed) + compressScripts: options.compress # Array or true or false + + # Order + scriptsOrder: [ + 'history.adapter.mootools.js' + 'history.js' + ] + + # Bundling + bundleScriptPath: __dirname+'/scripts/bundled/html5/mootools.history.js' + } + + + # ----------------------------- + # NATIVE + + { + # Options + name: 'html4+html5+native' + watch: options.watch + + # Paths + srcPath: __dirname+'/scripts/uncompressed' + + # Compression (without outPath only the generated bundle files are compressed) + compressScripts: options.compress # Array or true or false + + # Order + scriptsOrder: [ + 'json2.js' + 'history.adapter.native.js' + 'history.html4.js' + 'history.js' + ] + + # Bundling + bundleScriptPath: __dirname+'/scripts/bundled/html4+html5/native.history.js' + } + { + # Options + name: 'html5+native' + watch: options.watch + + # Paths + srcPath: __dirname+'/scripts/uncompressed' + + # Compression (without outPath only the generated bundle files are compressed) + compressScripts: options.compress # Array or true or false + + # Order + scriptsOrder: [ + 'history.adapter.native.js' + 'history.js' + ] + + # Bundling + bundleScriptPath: __dirname+'/scripts/bundled/html5/native.history.js' + } + + + # ----------------------------- + # RIGHT.JS + + { + # Options + name: 'html4+html5+right' + watch: options.watch + + # Paths + srcPath: __dirname+'/scripts/uncompressed' + + # Compression (without outPath only the generated bundle files are compressed) + compressScripts: options.compress # Array or true or false + + # Order + scriptsOrder: [ + 'json2.js' + 'history.adapter.right.js' + 'history.html4.js' + 'history.js' + ] + + # Bundling + bundleScriptPath: __dirname+'/scripts/bundled/html4+html5/right.history.js' + } + { + # Options + name: 'html5+right' + watch: options.watch + + # Paths + srcPath: __dirname+'/scripts/uncompressed' + + # Compression (without outPath only the generated bundle files are compressed) + compressScripts: options.compress # Array or true or false + + # Order + scriptsOrder: [ + 'history.adapter.right.js' + 'history.js' + ] + + # Bundling + bundleScriptPath: __dirname+'/scripts/bundled/html5/right.history.js' + } + + + # ----------------------------- + # ZEPTO + + { + # Options + name: 'html4+html5+zepto' + watch: options.watch + + # Paths + srcPath: __dirname+'/scripts/uncompressed' + + # Compression (without outPath only the generated bundle files are compressed) + compressScripts: options.compress # Array or true or false + + # Order + scriptsOrder: [ + 'json2.js' + 'history.adapter.zepto.js' + 'history.html4.js' + 'history.js' + ] + + # Bundling + bundleScriptPath: __dirname+'/scripts/bundled/html4+html5/zepto.history.js' + } + { + # Options + name: 'html5+zepto' + watch: options.watch + + # Paths + srcPath: __dirname+'/scripts/uncompressed' + + # Compression (without outPath only the generated bundle files are compressed) + compressScripts: options.compress # Array or true or false + + # Order + scriptsOrder: [ + 'history.adapter.zepto.js' + 'history.js' + ] + + # Bundling + bundleScriptPath: __dirname+'/scripts/bundled/html5/zepto.history.js' + } + ] + +# Standard +standardConfig = configs.standard +standardConfig.successHandler = -> + for config in configs.other + buildrInstance = buildr.createInstance config + buildrInstance.process() + +# Process +standardBuildr = buildr.createInstance configs.standard +standardBuildr.process() diff --git a/js/libraries/balupton-history/demo/bcherry-orig.html b/js/libraries/balupton-history/demo/bcherry-orig.html new file mode 100755 index 00000000..43672f49 --- /dev/null +++ b/js/libraries/balupton-history/demo/bcherry-orig.html @@ -0,0 +1,58 @@ + + + + + + + WebKit is Dropping HTML5 "popstate" Events + + + + + + + + + + + + + +

    +

    There's a bug in the HTML5 "popstate" event, as implemented in WebKit (Safari and Chrome). View this page in one of those browsers. Your browser has had history entries added from #0 to #19 (you should start at #19). Hitting back/forward will navigate through these. On each URL, the large number above should reflect the hash value. If you hit back/forward quickly, you'll notice that your number gets out of sync with the URL. This is because WebKit is dropping popstate events (they are not firing). It seems to happen when outbound network requests are in progress when the user navigates in their browser happens. In this case, your browser is downloading an image that takes 1s to serve on every popstate, so you'll have to wait 1s between backs/forwards to have the feature work correctly. You could also cause constant network traffic by putting an image download in a setInterval, in which case your popstate events will never fire. This implementation simulates an AJAX application that makes a network request when you navigate between URLs using pushState/popstate. View the source for more info.

    +

    This was filed as Bug 42940 with WebKit on July 24, 2010. The Firefox 4 beta does not have this bug, which is good news.

    +

    This is put together by Ben Cherry. Ben is a front-end engineer at Twitter, and you can follow him at @bcherry.

    + + + diff --git a/js/libraries/balupton-history/demo/bcherry.html b/js/libraries/balupton-history/demo/bcherry.html new file mode 100755 index 00000000..309f4d44 --- /dev/null +++ b/js/libraries/balupton-history/demo/bcherry.html @@ -0,0 +1,62 @@ + + + + + + + WebKit is Dropping HTML5 "popstate" Events + + + + + + + + + + + + + +
    +

    There's a bug in the HTML5 "popstate" event, as implemented in WebKit (Safari and Chrome). View this page in one of those browsers. Your browser has had history entries added from #0 to #19 (you should start at #19). Hitting back/forward will navigate through these. On each URL, the large number above should reflect the hash value. If you hit back/forward quickly, you'll notice that your number gets out of sync with the URL. This is because WebKit is dropping popstate events (they are not firing). It seems to happen when outbound network requests are in progress when the user navigates in their browser happens. In this case, your browser is downloading an image that takes 1s to serve on every popstate, so you'll have to wait 1s between backs/forwards to have the feature work correctly. You could also cause constant network traffic by putting an image download in a setInterval, in which case your popstate events will never fire. This implementation simulates an AJAX application that makes a network request when you navigate between URLs using pushState/popstate. View the source for more info.

    +

    This was filed as Bug 42940 with WebKit on July 24, 2010. The Firefox 4 beta does not have this bug, which is good news.

    +

    This is put together by Ben Cherry. Ben is a front-end engineer at Twitter, and you can follow him at @bcherry.

    +

    This bug was fixed in History.js by Benjamin Lupton. Benjamin is a freelance web 2.0 consultant, and you can follow him at @balupton.

    + + + diff --git a/js/libraries/balupton-history/demo/chrome.html b/js/libraries/balupton-history/demo/chrome.html new file mode 100755 index 00000000..a2791a31 --- /dev/null +++ b/js/libraries/balupton-history/demo/chrome.html @@ -0,0 +1,37 @@ + + + Chrome History API Data Artifact + + +

    This demo demonstrates an issue with Google Chrome versions 8-10 (possibly 11) where if you push a state with data, then do history.back to the initial state, the event.state will contain the pushed states data instead of being null.

    +

    Note: The issue requires a clean history list, as such this should always be opened in a new tab/window where there are no prior history items.

    +

    Reported by Benjamin Lupton author of History.js

    + + + + + + diff --git a/js/libraries/balupton-history/demo/index.html b/js/libraries/balupton-history/demo/index.html new file mode 100755 index 00000000..e13510ef --- /dev/null +++ b/js/libraries/balupton-history/demo/index.html @@ -0,0 +1,86 @@ + + + + + + + History.js + + + + + + + + + +
    + +

    History.js by Benjamin Lupton

    +

    History.js gracefully supports the HTML5 History/State APIs (pushState, replaceState, onPopState) in all browsers. Including continued support for data, titles, replaceState. Supports jQuery, MooTools and Prototype. For HTML5 browsers this means that you can modify the URL directly, without needing to use hashes anymore. For HTML4 browsers it will revert back to using the old onhashchange functionality.

    + + + + + +

    Click through the buttons in order and you'll get the results demonstrated in the README.md file.

    + + +
      +
    + + + +
    + + + diff --git a/js/libraries/balupton-history/demo/native-auto.html b/js/libraries/balupton-history/demo/native-auto.html new file mode 100755 index 00000000..1ea10ffa --- /dev/null +++ b/js/libraries/balupton-history/demo/native-auto.html @@ -0,0 +1,43 @@ + + + + + + + diff --git a/js/libraries/balupton-history/demo/native.html b/js/libraries/balupton-history/demo/native.html new file mode 100755 index 00000000..010f89a0 --- /dev/null +++ b/js/libraries/balupton-history/demo/native.html @@ -0,0 +1,62 @@ + + + HTML5 History API Demo + + + +
    +
    + + + diff --git a/js/libraries/balupton-history/demo/navigator.html b/js/libraries/balupton-history/demo/navigator.html new file mode 100755 index 00000000..f9b15844 --- /dev/null +++ b/js/libraries/balupton-history/demo/navigator.html @@ -0,0 +1,23 @@ + + + + + + Navigator Output + + + + + + + + diff --git a/js/libraries/balupton-history/demo/safari.html b/js/libraries/balupton-history/demo/safari.html new file mode 100755 index 00000000..5da17755 --- /dev/null +++ b/js/libraries/balupton-history/demo/safari.html @@ -0,0 +1,61 @@ + + + Safari Hash ReplaceState History Traversal Bug + + +

    This demo demonstrates an issue with Safari 5.0.4 (6533.20.27) handing of hashes and replace state. When a hash is set, and then replaced using replaceState the history list are then broken, when traversing back the hash does not change.

    +

    Note: The issue requires a clean history list, as such this should always be opened in a new tab/window where there are no prior history items.

    +

    Reported by Benjamin Lupton author of History.js

    + + + + + + + diff --git a/js/libraries/balupton-history/license.txt b/js/libraries/balupton-history/license.txt new file mode 100755 index 00000000..647bfd26 --- /dev/null +++ b/js/libraries/balupton-history/license.txt @@ -0,0 +1,10 @@ +Copyright (c) 2011, Benjamin Arthur Lupton +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + + • Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + • Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + • Neither the name of Benjamin Arthur Lupton nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. \ No newline at end of file diff --git a/js/libraries/balupton-history/package.json b/js/libraries/balupton-history/package.json new file mode 100755 index 00000000..ce50c66b --- /dev/null +++ b/js/libraries/balupton-history/package.json @@ -0,0 +1,57 @@ +{ + "name": "history.js", + "version": "1.7.1-r2", + "description": "History.js gracefully supports the HTML5 History/State APIs (pushState, replaceState, onPopState) in all browsers. Including continued support for data, titles, replaceState. Supports jQuery, MooTools and Prototype. For HTML5 browsers this means that you can modify the URL directly, without needing to use hashes anymore. For HTML4 browsers it will revert back to using the old onhashchange functionality.", + "homepage": "https://github.com/balupton/history.js", + "keywords": [ + "javascript", + "html5 history api", + "hashchange", + "popstate", + "pushstate", + "replacestate", + "hashes", + "hashbang" + ], + "author": { + "name": "Benjamin Lupton", + "email": "b@lupton.cc", + "web": "http://balupton.com" + }, + "maintainers": [ + { + "name": "Benjamin Lupton", + "email": "b@lupton.cc", + "web": "http://balupton.com" + } + ], + "contributors": [ + { + "name": "Benjamin Lupton", + "email": "b@lupton.cc", + "web": "http://balupton.com" + } + ], + "bugs": { + "web": "https://github.com/balupton/history.js/issues" + }, + "licenses": [ + { + "type": "New-BSD", + "url": "http://creativecommons.org/licenses/BSD/" + } + ], + "repository": { + "type": "git", + "url": "http://github.com/balupton/history.js.git" + }, + "dependencies": { + "buildr": "0.8.x" + }, + "engines": { + }, + "directories": { + "out": "./scripts/compressed", + "src": "./scripts/uncompressed" + } +} \ No newline at end of file diff --git a/js/libraries/balupton-history/scripts/bundled/html4+html5/jquery.history.js b/js/libraries/balupton-history/scripts/bundled/html4+html5/jquery.history.js new file mode 100755 index 00000000..8d4edcd2 --- /dev/null +++ b/js/libraries/balupton-history/scripts/bundled/html4+html5/jquery.history.js @@ -0,0 +1 @@ +window.JSON||(window.JSON={}),function(){function f(a){return a<10?"0"+a:a}function quote(a){return escapable.lastIndex=0,escapable.test(a)?'"'+a.replace(escapable,function(a){var b=meta[a];return typeof b=="string"?b:"\\u"+("0000"+a.charCodeAt(0).toString(16)).slice(-4)})+'"':'"'+a+'"'}function str(a,b){var c,d,e,f,g=gap,h,i=b[a];i&&typeof i=="object"&&typeof i.toJSON=="function"&&(i=i.toJSON(a)),typeof rep=="function"&&(i=rep.call(b,a,i));switch(typeof i){case"string":return quote(i);case"number":return isFinite(i)?String(i):"null";case"boolean":case"null":return String(i);case"object":if(!i)return"null";gap+=indent,h=[];if(Object.prototype.toString.apply(i)==="[object Array]"){f=i.length;for(c=0;c")&&c[0]);return a>4?a:!1}();return a},m.isInternetExplorer=function(){var a=m.isInternetExplorer.cached=typeof m.isInternetExplorer.cached!="undefined"?m.isInternetExplorer.cached:Boolean(m.getInternetExplorerMajorVersion());return a},m.emulated={pushState:!Boolean(a.history&&a.history.pushState&&a.history.replaceState&&!/ Mobile\/([1-7][a-z]|(8([abcde]|f(1[0-8]))))/i.test(e.userAgent)&&!/AppleWebKit\/5([0-2]|3[0-2])/i.test(e.userAgent)),hashChange:Boolean(!("onhashchange"in a||"onhashchange"in d)||m.isInternetExplorer()&&m.getInternetExplorerMajorVersion()<8)},m.enabled=!m.emulated.pushState,m.bugs={setHash:Boolean(!m.emulated.pushState&&e.vendor==="Apple Computer, Inc."&&/AppleWebKit\/5([0-2]|3[0-3])/.test(e.userAgent)),safariPoll:Boolean(!m.emulated.pushState&&e.vendor==="Apple Computer, Inc."&&/AppleWebKit\/5([0-2]|3[0-3])/.test(e.userAgent)),ieDoubleCheck:Boolean(m.isInternetExplorer()&&m.getInternetExplorerMajorVersion()<8),hashEscape:Boolean(m.isInternetExplorer()&&m.getInternetExplorerMajorVersion()<7)},m.isEmptyObject=function(a){for(var b in a)return!1;return!0},m.cloneObject=function(a){var b,c;return a?(b=k.stringify(a),c=k.parse(b)):c={},c},m.getRootUrl=function(){var a=d.location.protocol+"//"+(d.location.hostname||d.location.host);if(d.location.port||!1)a+=":"+d.location.port;return a+="/",a},m.getBaseHref=function(){var a=d.getElementsByTagName("base"),b=null,c="";return a.length===1&&(b=a[0],c=b.href.replace(/[^\/]+$/,"")),c=c.replace(/\/+$/,""),c&&(c+="/"),c},m.getBaseUrl=function(){var a=m.getBaseHref()||m.getBasePageUrl()||m.getRootUrl();return a},m.getPageUrl=function(){var a=m.getState(!1,!1),b=(a||{}).url||d.location.href,c;return c=b.replace(/\/+$/,"").replace(/[^\/]+$/,function(a,b,c){return/\./.test(a)?a:a+"/"}),c},m.getBasePageUrl=function(){var a=d.location.href.replace(/[#\?].*/,"").replace(/[^\/]+$/,function(a,b,c){return/[^\/]$/.test(a)?"":a}).replace(/\/+$/,"")+"/";return a},m.getFullUrl=function(a,b){var c=a,d=a.substring(0,1);return b=typeof b=="undefined"?!0:b,/[a-z]+\:\/\//.test(a)||(d==="/"?c=m.getRootUrl()+a.replace(/^\/+/,""):d==="#"?c=m.getPageUrl().replace(/#.*/,"")+a:d==="?"?c=m.getPageUrl().replace(/[\?#].*/,"")+a:b?c=m.getBaseUrl()+a.replace(/^(\.\/)+/,""):c=m.getBasePageUrl()+a.replace(/^(\.\/)+/,"")),c.replace(/\#$/,"")},m.getShortUrl=function(a){var b=a,c=m.getBaseUrl(),d=m.getRootUrl();return m.emulated.pushState&&(b=b.replace(c,"")),b=b.replace(d,"/"),m.isTraditionalAnchor(b)&&(b="./"+b),b=b.replace(/^(\.\/)+/g,"./").replace(/\#$/,""),b},m.store={},m.idToState=m.idToState||{},m.stateToId=m.stateToId||{},m.urlToId=m.urlToId||{},m.storedStates=m.storedStates||[],m.savedStates=m.savedStates||[],m.normalizeStore=function(){m.store.idToState=m.store.idToState||{},m.store.urlToId=m.store.urlToId||{},m.store.stateToId=m.store.stateToId||{}},m.getState=function(a,b){typeof a=="undefined"&&(a=!0),typeof b=="undefined"&&(b=!0);var c=m.getLastSavedState();return!c&&b&&(c=m.createStateObject()),a&&(c=m.cloneObject(c),c.url=c.cleanUrl||c.url),c},m.getIdByState=function(a){var b=m.extractId(a.url),c;if(!b){c=m.getStateString(a);if(typeof m.stateToId[c]!="undefined")b=m.stateToId[c];else if(typeof m.store.stateToId[c]!="undefined")b=m.store.stateToId[c];else{for(;;){b=(new Date).getTime()+String(Math.random()).replace(/\D/g,"");if(typeof m.idToState[b]=="undefined"&&typeof m.store.idToState[b]=="undefined")break}m.stateToId[c]=b,m.idToState[b]=a}}return b},m.normalizeState=function(a){var b,c;if(!a||typeof a!="object")a={};if(typeof a.normalized!="undefined")return a;if(!a.data||typeof a.data!="object")a.data={};b={},b.normalized=!0,b.title=a.title||"",b.url=m.getFullUrl(m.unescapeString(a.url||d.location.href)),b.hash=m.getShortUrl(b.url),b.data=m.cloneObject(a.data),b.id=m.getIdByState(b),b.cleanUrl=b.url.replace(/\??\&_suid.*/,""),b.url=b.cleanUrl,c=!m.isEmptyObject(b.data);if(b.title||c)b.hash=m.getShortUrl(b.url).replace(/\??\&_suid.*/,""),/\?/.test(b.hash)||(b.hash+="?"),b.hash+="&_suid="+b.id;return b.hashedUrl=m.getFullUrl(b.hash),(m.emulated.pushState||m.bugs.safariPoll)&&m.hasUrlDuplicate(b)&&(b.url=b.hashedUrl),b},m.createStateObject=function(a,b,c){var d={data:a,title:b,url:c};return d=m.normalizeState(d),d},m.getStateById=function(a){a=String(a);var c=m.idToState[a]||m.store.idToState[a]||b;return c},m.getStateString=function(a){var b,c,d;return b=m.normalizeState(a),c={data:b.data,title:a.title,url:a.url},d=k.stringify(c),d},m.getStateId=function(a){var b,c;return b=m.normalizeState(a),c=b.id,c},m.getHashByState=function(a){var b,c;return b=m.normalizeState(a),c=b.hash,c},m.extractId=function(a){var b,c,d;return c=/(.*)\&_suid=([0-9]+)$/.exec(a),d=c?c[1]||a:a,b=c?String(c[2]||""):"",b||!1},m.isTraditionalAnchor=function(a){var b=!/[\/\?\.]/.test(a);return b},m.extractState=function(a,b){var c=null,d,e;return b=b||!1,d=m.extractId(a),d&&(c=m.getStateById(d)),c||(e=m.getFullUrl(a),d=m.getIdByUrl(e)||!1,d&&(c=m.getStateById(d)),!c&&b&&!m.isTraditionalAnchor(a)&&(c=m.createStateObject(null,null,e))),c},m.getIdByUrl=function(a){var c=m.urlToId[a]||m.store.urlToId[a]||b;return c},m.getLastSavedState=function(){return m.savedStates[m.savedStates.length-1]||b},m.getLastStoredState=function(){return m.storedStates[m.storedStates.length-1]||b},m.hasUrlDuplicate=function(a){var b=!1,c;return c=m.extractState(a.url),b=c&&c.id!==a.id,b},m.storeState=function(a){return m.urlToId[a.url]=a.id,m.storedStates.push(m.cloneObject(a)),a},m.isLastSavedState=function(a){var b=!1,c,d,e;return m.savedStates.length&&(c=a.id,d=m.getLastSavedState(),e=d.id,b=c===e),b},m.saveState=function(a){return m.isLastSavedState(a)?!1:(m.savedStates.push(m.cloneObject(a)),!0)},m.getStateByIndex=function(a){var b=null;return typeof a=="undefined"?b=m.savedStates[m.savedStates.length-1]:a<0?b=m.savedStates[m.savedStates.length+a]:b=m.savedStates[a],b},m.getHash=function(){var a=m.unescapeHash(d.location.hash);return a},m.unescapeString=function(b){var c=b,d;for(;;){d=a.unescape(c);if(d===c)break;c=d}return c},m.unescapeHash=function(a){var b=m.normalizeHash(a);return b=m.unescapeString(b),b},m.normalizeHash=function(a){var b=a.replace(/[^#]*#/,"").replace(/#.*/,"");return b},m.setHash=function(a,b){var c,e,f;return b!==!1&&m.busy()?(m.pushQueue({scope:m,callback:m.setHash,args:arguments,queue:b}),!1):(c=m.escapeHash(a),m.busy(!0),e=m.extractState(a,!0),e&&!m.emulated.pushState?m.pushState(e.data,e.title,e.url,!1):d.location.hash!==c&&(m.bugs.setHash?(f=m.getPageUrl(),m.pushState(null,null,f+"#"+c,!1)):d.location.hash=c),m)},m.escapeHash=function(b){var c=m.normalizeHash(b);return c=a.escape(c),m.bugs.hashEscape||(c=c.replace(/\%21/g,"!").replace(/\%26/g,"&").replace(/\%3D/g,"=").replace(/\%3F/g,"?")),c},m.getHashByUrl=function(a){var b=String(a).replace(/([^#]*)#?([^#]*)#?(.*)/,"$2");return b=m.unescapeHash(b),b},m.setTitle=function(a){var b=a.title,c;b||(c=m.getStateByIndex(0),c&&c.url===a.url&&(b=c.title||m.options.initialTitle));try{d.getElementsByTagName("title")[0].innerHTML=b.replace("<","<").replace(">",">").replace(" & "," & ")}catch(e){}return d.title=b,m},m.queues=[],m.busy=function(a){typeof a!="undefined"?m.busy.flag=a:typeof m.busy.flag=="undefined"&&(m.busy.flag=!1);if(!m.busy.flag){h(m.busy.timeout);var b=function(){var a,c,d;if(m.busy.flag)return;for(a=m.queues.length-1;a>=0;--a){c=m.queues[a];if(c.length===0)continue;d=c.shift(),m.fireQueueItem(d),m.busy.timeout=g(b,m.options.busyDelay)}};m.busy.timeout=g(b,m.options.busyDelay)}return m.busy.flag},m.busy.flag=!1,m.fireQueueItem=function(a){return a.callback.apply(a.scope||m,a.args||[])},m.pushQueue=function(a){return m.queues[a.queue||0]=m.queues[a.queue||0]||[],m.queues[a.queue||0].push(a),m},m.queue=function(a,b){return typeof a=="function"&&(a={callback:a}),typeof b!="undefined"&&(a.queue=b),m.busy()?m.pushQueue(a):m.fireQueueItem(a),m},m.clearQueue=function(){return m.busy.flag=!1,m.queues=[],m},m.stateChanged=!1,m.doubleChecker=!1,m.doubleCheckComplete=function(){return m.stateChanged=!0,m.doubleCheckClear(),m},m.doubleCheckClear=function(){return m.doubleChecker&&(h(m.doubleChecker),m.doubleChecker=!1),m},m.doubleCheck=function(a){return m.stateChanged=!1,m.doubleCheckClear(),m.bugs.ieDoubleCheck&&(m.doubleChecker=g(function(){return m.doubleCheckClear(),m.stateChanged||a(),!0},m.options.doubleCheckInterval)),m},m.safariStatePoll=function(){var b=m.extractState(d.location.href),c;if(!m.isLastSavedState(b))c=b;else return;return c||(c=m.createStateObject()),m.Adapter.trigger(a,"popstate"),m},m.back=function(a){return a!==!1&&m.busy()?(m.pushQueue({scope:m,callback:m.back,args:arguments,queue:a}),!1):(m.busy(!0),m.doubleCheck(function(){m.back(!1)}),n.go(-1),!0)},m.forward=function(a){return a!==!1&&m.busy()?(m.pushQueue({scope:m,callback:m.forward,args:arguments,queue:a}),!1):(m.busy(!0),m.doubleCheck(function(){m.forward(!1)}),n.go(1),!0)},m.go=function(a,b){var c;if(a>0)for(c=1;c<=a;++c)m.forward(b);else{if(!(a<0))throw new Error("History.go: History.go requires a positive or negative integer passed.");for(c=-1;c>=a;--c)m.back(b)}return m};if(m.emulated.pushState){var o=function(){};m.pushState=m.pushState||o,m.replaceState=m.replaceState||o}else m.onPopState=function(b,c){var e=!1,f=!1,g,h;return m.doubleCheckComplete(),g=m.getHash(),g?(h=m.extractState(g||d.location.href,!0),h?m.replaceState(h.data,h.title,h.url,!1):(m.Adapter.trigger(a,"anchorchange"),m.busy(!1)),m.expectedStateId=!1,!1):(e=m.Adapter.extractEventData("state",b,c)||!1,e?f=m.getStateById(e):m.expectedStateId?f=m.getStateById(m.expectedStateId):f=m.extractState(d.location.href),f||(f=m.createStateObject(null,null,d.location.href)),m.expectedStateId=!1,m.isLastSavedState(f)?(m.busy(!1),!1):(m.storeState(f),m.saveState(f),m.setTitle(f),m.Adapter.trigger(a,"statechange"),m.busy(!1),!0))},m.Adapter.bind(a,"popstate",m.onPopState),m.pushState=function(b,c,d,e){if(m.getHashByUrl(d)&&m.emulated.pushState)throw new Error("History.js does not support states with fragement-identifiers (hashes/anchors).");if(e!==!1&&m.busy())return m.pushQueue({scope:m,callback:m.pushState,args:arguments,queue:e}),!1;m.busy(!0);var f=m.createStateObject(b,c,d);return m.isLastSavedState(f)?m.busy(!1):(m.storeState(f),m.expectedStateId=f.id,n.pushState(f.id,f.title,f.url),m.Adapter.trigger(a,"popstate")),!0},m.replaceState=function(b,c,d,e){if(m.getHashByUrl(d)&&m.emulated.pushState)throw new Error("History.js does not support states with fragement-identifiers (hashes/anchors).");if(e!==!1&&m.busy())return m.pushQueue({scope:m,callback:m.replaceState,args:arguments,queue:e}),!1;m.busy(!0);var f=m.createStateObject(b,c,d);return m.isLastSavedState(f)?m.busy(!1):(m.storeState(f),m.expectedStateId=f.id,n.replaceState(f.id,f.title,f.url),m.Adapter.trigger(a,"popstate")),!0};if(f){try{m.store=k.parse(f.getItem("History.store"))||{}}catch(p){m.store={}}m.normalizeStore()}else m.store={},m.normalizeStore();m.Adapter.bind(a,"beforeunload",m.clearAllIntervals),m.Adapter.bind(a,"unload",m.clearAllIntervals),m.saveState(m.storeState(m.extractState(d.location.href,!0))),f&&(m.onUnload=function(){var a,b;try{a=k.parse(f.getItem("History.store"))||{}}catch(c){a={}}a.idToState=a.idToState||{},a.urlToId=a.urlToId||{},a.stateToId=a.stateToId||{};for(b in m.idToState){if(!m.idToState.hasOwnProperty(b))continue;a.idToState[b]=m.idToState[b]}for(b in m.urlToId){if(!m.urlToId.hasOwnProperty(b))continue;a.urlToId[b]=m.urlToId[b]}for(b in m.stateToId){if(!m.stateToId.hasOwnProperty(b))continue;a.stateToId[b]=m.stateToId[b]}m.store=a,m.normalizeStore(),f.setItem("History.store",k.stringify(a))},m.intervalList.push(i(m.onUnload,m.options.storeInterval)),m.Adapter.bind(a,"beforeunload",m.onUnload),m.Adapter.bind(a,"unload",m.onUnload));if(!m.emulated.pushState){m.bugs.safariPoll&&m.intervalList.push(i(m.safariStatePoll,m.options.safariPollInterval));if(e.vendor==="Apple Computer, Inc."||(e.appCodeName||"")==="Mozilla")m.Adapter.bind(a,"hashchange",function(){m.Adapter.trigger(a,"popstate")}),m.getHash()&&m.Adapter.onDomLoad(function(){m.Adapter.trigger(a,"hashchange")})}},m.init()}(window) \ No newline at end of file diff --git a/js/libraries/balupton-history/scripts/bundled/html4+html5/mootools.history.js b/js/libraries/balupton-history/scripts/bundled/html4+html5/mootools.history.js new file mode 100755 index 00000000..e82ec7d9 --- /dev/null +++ b/js/libraries/balupton-history/scripts/bundled/html4+html5/mootools.history.js @@ -0,0 +1 @@ +window.JSON||(window.JSON={}),function(){function f(a){return a<10?"0"+a:a}function quote(a){return escapable.lastIndex=0,escapable.test(a)?'"'+a.replace(escapable,function(a){var b=meta[a];return typeof b=="string"?b:"\\u"+("0000"+a.charCodeAt(0).toString(16)).slice(-4)})+'"':'"'+a+'"'}function str(a,b){var c,d,e,f,g=gap,h,i=b[a];i&&typeof i=="object"&&typeof i.toJSON=="function"&&(i=i.toJSON(a)),typeof rep=="function"&&(i=rep.call(b,a,i));switch(typeof i){case"string":return quote(i);case"number":return isFinite(i)?String(i):"null";case"boolean":case"null":return String(i);case"object":if(!i)return"null";gap+=indent,h=[];if(Object.prototype.toString.apply(i)==="[object Array]"){f=i.length;for(c=0;c")&&c[0]);return a>4?a:!1}();return a},m.isInternetExplorer=function(){var a=m.isInternetExplorer.cached=typeof m.isInternetExplorer.cached!="undefined"?m.isInternetExplorer.cached:Boolean(m.getInternetExplorerMajorVersion());return a},m.emulated={pushState:!Boolean(a.history&&a.history.pushState&&a.history.replaceState&&!/ Mobile\/([1-7][a-z]|(8([abcde]|f(1[0-8]))))/i.test(e.userAgent)&&!/AppleWebKit\/5([0-2]|3[0-2])/i.test(e.userAgent)),hashChange:Boolean(!("onhashchange"in a||"onhashchange"in d)||m.isInternetExplorer()&&m.getInternetExplorerMajorVersion()<8)},m.enabled=!m.emulated.pushState,m.bugs={setHash:Boolean(!m.emulated.pushState&&e.vendor==="Apple Computer, Inc."&&/AppleWebKit\/5([0-2]|3[0-3])/.test(e.userAgent)),safariPoll:Boolean(!m.emulated.pushState&&e.vendor==="Apple Computer, Inc."&&/AppleWebKit\/5([0-2]|3[0-3])/.test(e.userAgent)),ieDoubleCheck:Boolean(m.isInternetExplorer()&&m.getInternetExplorerMajorVersion()<8),hashEscape:Boolean(m.isInternetExplorer()&&m.getInternetExplorerMajorVersion()<7)},m.isEmptyObject=function(a){for(var b in a)return!1;return!0},m.cloneObject=function(a){var b,c;return a?(b=k.stringify(a),c=k.parse(b)):c={},c},m.getRootUrl=function(){var a=d.location.protocol+"//"+(d.location.hostname||d.location.host);if(d.location.port||!1)a+=":"+d.location.port;return a+="/",a},m.getBaseHref=function(){var a=d.getElementsByTagName("base"),b=null,c="";return a.length===1&&(b=a[0],c=b.href.replace(/[^\/]+$/,"")),c=c.replace(/\/+$/,""),c&&(c+="/"),c},m.getBaseUrl=function(){var a=m.getBaseHref()||m.getBasePageUrl()||m.getRootUrl();return a},m.getPageUrl=function(){var a=m.getState(!1,!1),b=(a||{}).url||d.location.href,c;return c=b.replace(/\/+$/,"").replace(/[^\/]+$/,function(a,b,c){return/\./.test(a)?a:a+"/"}),c},m.getBasePageUrl=function(){var a=d.location.href.replace(/[#\?].*/,"").replace(/[^\/]+$/,function(a,b,c){return/[^\/]$/.test(a)?"":a}).replace(/\/+$/,"")+"/";return a},m.getFullUrl=function(a,b){var c=a,d=a.substring(0,1);return b=typeof b=="undefined"?!0:b,/[a-z]+\:\/\//.test(a)||(d==="/"?c=m.getRootUrl()+a.replace(/^\/+/,""):d==="#"?c=m.getPageUrl().replace(/#.*/,"")+a:d==="?"?c=m.getPageUrl().replace(/[\?#].*/,"")+a:b?c=m.getBaseUrl()+a.replace(/^(\.\/)+/,""):c=m.getBasePageUrl()+a.replace(/^(\.\/)+/,"")),c.replace(/\#$/,"")},m.getShortUrl=function(a){var b=a,c=m.getBaseUrl(),d=m.getRootUrl();return m.emulated.pushState&&(b=b.replace(c,"")),b=b.replace(d,"/"),m.isTraditionalAnchor(b)&&(b="./"+b),b=b.replace(/^(\.\/)+/g,"./").replace(/\#$/,""),b},m.store={},m.idToState=m.idToState||{},m.stateToId=m.stateToId||{},m.urlToId=m.urlToId||{},m.storedStates=m.storedStates||[],m.savedStates=m.savedStates||[],m.normalizeStore=function(){m.store.idToState=m.store.idToState||{},m.store.urlToId=m.store.urlToId||{},m.store.stateToId=m.store.stateToId||{}},m.getState=function(a,b){typeof a=="undefined"&&(a=!0),typeof b=="undefined"&&(b=!0);var c=m.getLastSavedState();return!c&&b&&(c=m.createStateObject()),a&&(c=m.cloneObject(c),c.url=c.cleanUrl||c.url),c},m.getIdByState=function(a){var b=m.extractId(a.url),c;if(!b){c=m.getStateString(a);if(typeof m.stateToId[c]!="undefined")b=m.stateToId[c];else if(typeof m.store.stateToId[c]!="undefined")b=m.store.stateToId[c];else{for(;;){b=(new Date).getTime()+String(Math.random()).replace(/\D/g,"");if(typeof m.idToState[b]=="undefined"&&typeof m.store.idToState[b]=="undefined")break}m.stateToId[c]=b,m.idToState[b]=a}}return b},m.normalizeState=function(a){var b,c;if(!a||typeof a!="object")a={};if(typeof a.normalized!="undefined")return a;if(!a.data||typeof a.data!="object")a.data={};b={},b.normalized=!0,b.title=a.title||"",b.url=m.getFullUrl(m.unescapeString(a.url||d.location.href)),b.hash=m.getShortUrl(b.url),b.data=m.cloneObject(a.data),b.id=m.getIdByState(b),b.cleanUrl=b.url.replace(/\??\&_suid.*/,""),b.url=b.cleanUrl,c=!m.isEmptyObject(b.data);if(b.title||c)b.hash=m.getShortUrl(b.url).replace(/\??\&_suid.*/,""),/\?/.test(b.hash)||(b.hash+="?"),b.hash+="&_suid="+b.id;return b.hashedUrl=m.getFullUrl(b.hash),(m.emulated.pushState||m.bugs.safariPoll)&&m.hasUrlDuplicate(b)&&(b.url=b.hashedUrl),b},m.createStateObject=function(a,b,c){var d={data:a,title:b,url:c};return d=m.normalizeState(d),d},m.getStateById=function(a){a=String(a);var c=m.idToState[a]||m.store.idToState[a]||b;return c},m.getStateString=function(a){var b,c,d;return b=m.normalizeState(a),c={data:b.data,title:a.title,url:a.url},d=k.stringify(c),d},m.getStateId=function(a){var b,c;return b=m.normalizeState(a),c=b.id,c},m.getHashByState=function(a){var b,c;return b=m.normalizeState(a),c=b.hash,c},m.extractId=function(a){var b,c,d;return c=/(.*)\&_suid=([0-9]+)$/.exec(a),d=c?c[1]||a:a,b=c?String(c[2]||""):"",b||!1},m.isTraditionalAnchor=function(a){var b=!/[\/\?\.]/.test(a);return b},m.extractState=function(a,b){var c=null,d,e;return b=b||!1,d=m.extractId(a),d&&(c=m.getStateById(d)),c||(e=m.getFullUrl(a),d=m.getIdByUrl(e)||!1,d&&(c=m.getStateById(d)),!c&&b&&!m.isTraditionalAnchor(a)&&(c=m.createStateObject(null,null,e))),c},m.getIdByUrl=function(a){var c=m.urlToId[a]||m.store.urlToId[a]||b;return c},m.getLastSavedState=function(){return m.savedStates[m.savedStates.length-1]||b},m.getLastStoredState=function(){return m.storedStates[m.storedStates.length-1]||b},m.hasUrlDuplicate=function(a){var b=!1,c;return c=m.extractState(a.url),b=c&&c.id!==a.id,b},m.storeState=function(a){return m.urlToId[a.url]=a.id,m.storedStates.push(m.cloneObject(a)),a},m.isLastSavedState=function(a){var b=!1,c,d,e;return m.savedStates.length&&(c=a.id,d=m.getLastSavedState(),e=d.id,b=c===e),b},m.saveState=function(a){return m.isLastSavedState(a)?!1:(m.savedStates.push(m.cloneObject(a)),!0)},m.getStateByIndex=function(a){var b=null;return typeof a=="undefined"?b=m.savedStates[m.savedStates.length-1]:a<0?b=m.savedStates[m.savedStates.length+a]:b=m.savedStates[a],b},m.getHash=function(){var a=m.unescapeHash(d.location.hash);return a},m.unescapeString=function(b){var c=b,d;for(;;){d=a.unescape(c);if(d===c)break;c=d}return c},m.unescapeHash=function(a){var b=m.normalizeHash(a);return b=m.unescapeString(b),b},m.normalizeHash=function(a){var b=a.replace(/[^#]*#/,"").replace(/#.*/,"");return b},m.setHash=function(a,b){var c,e,f;return b!==!1&&m.busy()?(m.pushQueue({scope:m,callback:m.setHash,args:arguments,queue:b}),!1):(c=m.escapeHash(a),m.busy(!0),e=m.extractState(a,!0),e&&!m.emulated.pushState?m.pushState(e.data,e.title,e.url,!1):d.location.hash!==c&&(m.bugs.setHash?(f=m.getPageUrl(),m.pushState(null,null,f+"#"+c,!1)):d.location.hash=c),m)},m.escapeHash=function(b){var c=m.normalizeHash(b);return c=a.escape(c),m.bugs.hashEscape||(c=c.replace(/\%21/g,"!").replace(/\%26/g,"&").replace(/\%3D/g,"=").replace(/\%3F/g,"?")),c},m.getHashByUrl=function(a){var b=String(a).replace(/([^#]*)#?([^#]*)#?(.*)/,"$2");return b=m.unescapeHash(b),b},m.setTitle=function(a){var b=a.title,c;b||(c=m.getStateByIndex(0),c&&c.url===a.url&&(b=c.title||m.options.initialTitle));try{d.getElementsByTagName("title")[0].innerHTML=b.replace("<","<").replace(">",">").replace(" & "," & ")}catch(e){}return d.title=b,m},m.queues=[],m.busy=function(a){typeof a!="undefined"?m.busy.flag=a:typeof m.busy.flag=="undefined"&&(m.busy.flag=!1);if(!m.busy.flag){h(m.busy.timeout);var b=function(){var a,c,d;if(m.busy.flag)return;for(a=m.queues.length-1;a>=0;--a){c=m.queues[a];if(c.length===0)continue;d=c.shift(),m.fireQueueItem(d),m.busy.timeout=g(b,m.options.busyDelay)}};m.busy.timeout=g(b,m.options.busyDelay)}return m.busy.flag},m.busy.flag=!1,m.fireQueueItem=function(a){return a.callback.apply(a.scope||m,a.args||[])},m.pushQueue=function(a){return m.queues[a.queue||0]=m.queues[a.queue||0]||[],m.queues[a.queue||0].push(a),m},m.queue=function(a,b){return typeof a=="function"&&(a={callback:a}),typeof b!="undefined"&&(a.queue=b),m.busy()?m.pushQueue(a):m.fireQueueItem(a),m},m.clearQueue=function(){return m.busy.flag=!1,m.queues=[],m},m.stateChanged=!1,m.doubleChecker=!1,m.doubleCheckComplete=function(){return m.stateChanged=!0,m.doubleCheckClear(),m},m.doubleCheckClear=function(){return m.doubleChecker&&(h(m.doubleChecker),m.doubleChecker=!1),m},m.doubleCheck=function(a){return m.stateChanged=!1,m.doubleCheckClear(),m.bugs.ieDoubleCheck&&(m.doubleChecker=g(function(){return m.doubleCheckClear(),m.stateChanged||a(),!0},m.options.doubleCheckInterval)),m},m.safariStatePoll=function(){var b=m.extractState(d.location.href),c;if(!m.isLastSavedState(b))c=b;else return;return c||(c=m.createStateObject()),m.Adapter.trigger(a,"popstate"),m},m.back=function(a){return a!==!1&&m.busy()?(m.pushQueue({scope:m,callback:m.back,args:arguments,queue:a}),!1):(m.busy(!0),m.doubleCheck(function(){m.back(!1)}),n.go(-1),!0)},m.forward=function(a){return a!==!1&&m.busy()?(m.pushQueue({scope:m,callback:m.forward,args:arguments,queue:a}),!1):(m.busy(!0),m.doubleCheck(function(){m.forward(!1)}),n.go(1),!0)},m.go=function(a,b){var c;if(a>0)for(c=1;c<=a;++c)m.forward(b);else{if(!(a<0))throw new Error("History.go: History.go requires a positive or negative integer passed.");for(c=-1;c>=a;--c)m.back(b)}return m};if(m.emulated.pushState){var o=function(){};m.pushState=m.pushState||o,m.replaceState=m.replaceState||o}else m.onPopState=function(b,c){var e=!1,f=!1,g,h;return m.doubleCheckComplete(),g=m.getHash(),g?(h=m.extractState(g||d.location.href,!0),h?m.replaceState(h.data,h.title,h.url,!1):(m.Adapter.trigger(a,"anchorchange"),m.busy(!1)),m.expectedStateId=!1,!1):(e=m.Adapter.extractEventData("state",b,c)||!1,e?f=m.getStateById(e):m.expectedStateId?f=m.getStateById(m.expectedStateId):f=m.extractState(d.location.href),f||(f=m.createStateObject(null,null,d.location.href)),m.expectedStateId=!1,m.isLastSavedState(f)?(m.busy(!1),!1):(m.storeState(f),m.saveState(f),m.setTitle(f),m.Adapter.trigger(a,"statechange"),m.busy(!1),!0))},m.Adapter.bind(a,"popstate",m.onPopState),m.pushState=function(b,c,d,e){if(m.getHashByUrl(d)&&m.emulated.pushState)throw new Error("History.js does not support states with fragement-identifiers (hashes/anchors).");if(e!==!1&&m.busy())return m.pushQueue({scope:m,callback:m.pushState,args:arguments,queue:e}),!1;m.busy(!0);var f=m.createStateObject(b,c,d);return m.isLastSavedState(f)?m.busy(!1):(m.storeState(f),m.expectedStateId=f.id,n.pushState(f.id,f.title,f.url),m.Adapter.trigger(a,"popstate")),!0},m.replaceState=function(b,c,d,e){if(m.getHashByUrl(d)&&m.emulated.pushState)throw new Error("History.js does not support states with fragement-identifiers (hashes/anchors).");if(e!==!1&&m.busy())return m.pushQueue({scope:m,callback:m.replaceState,args:arguments,queue:e}),!1;m.busy(!0);var f=m.createStateObject(b,c,d);return m.isLastSavedState(f)?m.busy(!1):(m.storeState(f),m.expectedStateId=f.id,n.replaceState(f.id,f.title,f.url),m.Adapter.trigger(a,"popstate")),!0};if(f){try{m.store=k.parse(f.getItem("History.store"))||{}}catch(p){m.store={}}m.normalizeStore()}else m.store={},m.normalizeStore();m.Adapter.bind(a,"beforeunload",m.clearAllIntervals),m.Adapter.bind(a,"unload",m.clearAllIntervals),m.saveState(m.storeState(m.extractState(d.location.href,!0))),f&&(m.onUnload=function(){var a,b;try{a=k.parse(f.getItem("History.store"))||{}}catch(c){a={}}a.idToState=a.idToState||{},a.urlToId=a.urlToId||{},a.stateToId=a.stateToId||{};for(b in m.idToState){if(!m.idToState.hasOwnProperty(b))continue;a.idToState[b]=m.idToState[b]}for(b in m.urlToId){if(!m.urlToId.hasOwnProperty(b))continue;a.urlToId[b]=m.urlToId[b]}for(b in m.stateToId){if(!m.stateToId.hasOwnProperty(b))continue;a.stateToId[b]=m.stateToId[b]}m.store=a,m.normalizeStore(),f.setItem("History.store",k.stringify(a))},m.intervalList.push(i(m.onUnload,m.options.storeInterval)),m.Adapter.bind(a,"beforeunload",m.onUnload),m.Adapter.bind(a,"unload",m.onUnload));if(!m.emulated.pushState){m.bugs.safariPoll&&m.intervalList.push(i(m.safariStatePoll,m.options.safariPollInterval));if(e.vendor==="Apple Computer, Inc."||(e.appCodeName||"")==="Mozilla")m.Adapter.bind(a,"hashchange",function(){m.Adapter.trigger(a,"popstate")}),m.getHash()&&m.Adapter.onDomLoad(function(){m.Adapter.trigger(a,"hashchange")})}},m.init()}(window) \ No newline at end of file diff --git a/js/libraries/balupton-history/scripts/bundled/html4+html5/native.history.js b/js/libraries/balupton-history/scripts/bundled/html4+html5/native.history.js new file mode 100755 index 00000000..3d341662 --- /dev/null +++ b/js/libraries/balupton-history/scripts/bundled/html4+html5/native.history.js @@ -0,0 +1 @@ +window.JSON||(window.JSON={}),function(){function f(a){return a<10?"0"+a:a}function quote(a){return escapable.lastIndex=0,escapable.test(a)?'"'+a.replace(escapable,function(a){var b=meta[a];return typeof b=="string"?b:"\\u"+("0000"+a.charCodeAt(0).toString(16)).slice(-4)})+'"':'"'+a+'"'}function str(a,b){var c,d,e,f,g=gap,h,i=b[a];i&&typeof i=="object"&&typeof i.toJSON=="function"&&(i=i.toJSON(a)),typeof rep=="function"&&(i=rep.call(b,a,i));switch(typeof i){case"string":return quote(i);case"number":return isFinite(i)?String(i):"null";case"boolean":case"null":return String(i);case"object":if(!i)return"null";gap+=indent,h=[];if(Object.prototype.toString.apply(i)==="[object Array]"){f=i.length;for(c=0;c")&&c[0]);return a>4?a:!1}();return a},m.isInternetExplorer=function(){var a=m.isInternetExplorer.cached=typeof m.isInternetExplorer.cached!="undefined"?m.isInternetExplorer.cached:Boolean(m.getInternetExplorerMajorVersion());return a},m.emulated={pushState:!Boolean(a.history&&a.history.pushState&&a.history.replaceState&&!/ Mobile\/([1-7][a-z]|(8([abcde]|f(1[0-8]))))/i.test(e.userAgent)&&!/AppleWebKit\/5([0-2]|3[0-2])/i.test(e.userAgent)),hashChange:Boolean(!("onhashchange"in a||"onhashchange"in d)||m.isInternetExplorer()&&m.getInternetExplorerMajorVersion()<8)},m.enabled=!m.emulated.pushState,m.bugs={setHash:Boolean(!m.emulated.pushState&&e.vendor==="Apple Computer, Inc."&&/AppleWebKit\/5([0-2]|3[0-3])/.test(e.userAgent)),safariPoll:Boolean(!m.emulated.pushState&&e.vendor==="Apple Computer, Inc."&&/AppleWebKit\/5([0-2]|3[0-3])/.test(e.userAgent)),ieDoubleCheck:Boolean(m.isInternetExplorer()&&m.getInternetExplorerMajorVersion()<8),hashEscape:Boolean(m.isInternetExplorer()&&m.getInternetExplorerMajorVersion()<7)},m.isEmptyObject=function(a){for(var b in a)return!1;return!0},m.cloneObject=function(a){var b,c;return a?(b=k.stringify(a),c=k.parse(b)):c={},c},m.getRootUrl=function(){var a=d.location.protocol+"//"+(d.location.hostname||d.location.host);if(d.location.port||!1)a+=":"+d.location.port;return a+="/",a},m.getBaseHref=function(){var a=d.getElementsByTagName("base"),b=null,c="";return a.length===1&&(b=a[0],c=b.href.replace(/[^\/]+$/,"")),c=c.replace(/\/+$/,""),c&&(c+="/"),c},m.getBaseUrl=function(){var a=m.getBaseHref()||m.getBasePageUrl()||m.getRootUrl();return a},m.getPageUrl=function(){var a=m.getState(!1,!1),b=(a||{}).url||d.location.href,c;return c=b.replace(/\/+$/,"").replace(/[^\/]+$/,function(a,b,c){return/\./.test(a)?a:a+"/"}),c},m.getBasePageUrl=function(){var a=d.location.href.replace(/[#\?].*/,"").replace(/[^\/]+$/,function(a,b,c){return/[^\/]$/.test(a)?"":a}).replace(/\/+$/,"")+"/";return a},m.getFullUrl=function(a,b){var c=a,d=a.substring(0,1);return b=typeof b=="undefined"?!0:b,/[a-z]+\:\/\//.test(a)||(d==="/"?c=m.getRootUrl()+a.replace(/^\/+/,""):d==="#"?c=m.getPageUrl().replace(/#.*/,"")+a:d==="?"?c=m.getPageUrl().replace(/[\?#].*/,"")+a:b?c=m.getBaseUrl()+a.replace(/^(\.\/)+/,""):c=m.getBasePageUrl()+a.replace(/^(\.\/)+/,"")),c.replace(/\#$/,"")},m.getShortUrl=function(a){var b=a,c=m.getBaseUrl(),d=m.getRootUrl();return m.emulated.pushState&&(b=b.replace(c,"")),b=b.replace(d,"/"),m.isTraditionalAnchor(b)&&(b="./"+b),b=b.replace(/^(\.\/)+/g,"./").replace(/\#$/,""),b},m.store={},m.idToState=m.idToState||{},m.stateToId=m.stateToId||{},m.urlToId=m.urlToId||{},m.storedStates=m.storedStates||[],m.savedStates=m.savedStates||[],m.normalizeStore=function(){m.store.idToState=m.store.idToState||{},m.store.urlToId=m.store.urlToId||{},m.store.stateToId=m.store.stateToId||{}},m.getState=function(a,b){typeof a=="undefined"&&(a=!0),typeof b=="undefined"&&(b=!0);var c=m.getLastSavedState();return!c&&b&&(c=m.createStateObject()),a&&(c=m.cloneObject(c),c.url=c.cleanUrl||c.url),c},m.getIdByState=function(a){var b=m.extractId(a.url),c;if(!b){c=m.getStateString(a);if(typeof m.stateToId[c]!="undefined")b=m.stateToId[c];else if(typeof m.store.stateToId[c]!="undefined")b=m.store.stateToId[c];else{for(;;){b=(new Date).getTime()+String(Math.random()).replace(/\D/g,"");if(typeof m.idToState[b]=="undefined"&&typeof m.store.idToState[b]=="undefined")break}m.stateToId[c]=b,m.idToState[b]=a}}return b},m.normalizeState=function(a){var b,c;if(!a||typeof a!="object")a={};if(typeof a.normalized!="undefined")return a;if(!a.data||typeof a.data!="object")a.data={};b={},b.normalized=!0,b.title=a.title||"",b.url=m.getFullUrl(m.unescapeString(a.url||d.location.href)),b.hash=m.getShortUrl(b.url),b.data=m.cloneObject(a.data),b.id=m.getIdByState(b),b.cleanUrl=b.url.replace(/\??\&_suid.*/,""),b.url=b.cleanUrl,c=!m.isEmptyObject(b.data);if(b.title||c)b.hash=m.getShortUrl(b.url).replace(/\??\&_suid.*/,""),/\?/.test(b.hash)||(b.hash+="?"),b.hash+="&_suid="+b.id;return b.hashedUrl=m.getFullUrl(b.hash),(m.emulated.pushState||m.bugs.safariPoll)&&m.hasUrlDuplicate(b)&&(b.url=b.hashedUrl),b},m.createStateObject=function(a,b,c){var d={data:a,title:b,url:c};return d=m.normalizeState(d),d},m.getStateById=function(a){a=String(a);var c=m.idToState[a]||m.store.idToState[a]||b;return c},m.getStateString=function(a){var b,c,d;return b=m.normalizeState(a),c={data:b.data,title:a.title,url:a.url},d=k.stringify(c),d},m.getStateId=function(a){var b,c;return b=m.normalizeState(a),c=b.id,c},m.getHashByState=function(a){var b,c;return b=m.normalizeState(a),c=b.hash,c},m.extractId=function(a){var b,c,d;return c=/(.*)\&_suid=([0-9]+)$/.exec(a),d=c?c[1]||a:a,b=c?String(c[2]||""):"",b||!1},m.isTraditionalAnchor=function(a){var b=!/[\/\?\.]/.test(a);return b},m.extractState=function(a,b){var c=null,d,e;return b=b||!1,d=m.extractId(a),d&&(c=m.getStateById(d)),c||(e=m.getFullUrl(a),d=m.getIdByUrl(e)||!1,d&&(c=m.getStateById(d)),!c&&b&&!m.isTraditionalAnchor(a)&&(c=m.createStateObject(null,null,e))),c},m.getIdByUrl=function(a){var c=m.urlToId[a]||m.store.urlToId[a]||b;return c},m.getLastSavedState=function(){return m.savedStates[m.savedStates.length-1]||b},m.getLastStoredState=function(){return m.storedStates[m.storedStates.length-1]||b},m.hasUrlDuplicate=function(a){var b=!1,c;return c=m.extractState(a.url),b=c&&c.id!==a.id,b},m.storeState=function(a){return m.urlToId[a.url]=a.id,m.storedStates.push(m.cloneObject(a)),a},m.isLastSavedState=function(a){var b=!1,c,d,e;return m.savedStates.length&&(c=a.id,d=m.getLastSavedState(),e=d.id,b=c===e),b},m.saveState=function(a){return m.isLastSavedState(a)?!1:(m.savedStates.push(m.cloneObject(a)),!0)},m.getStateByIndex=function(a){var b=null;return typeof a=="undefined"?b=m.savedStates[m.savedStates.length-1]:a<0?b=m.savedStates[m.savedStates.length+a]:b=m.savedStates[a],b},m.getHash=function(){var a=m.unescapeHash(d.location.hash);return a},m.unescapeString=function(b){var c=b,d;for(;;){d=a.unescape(c);if(d===c)break;c=d}return c},m.unescapeHash=function(a){var b=m.normalizeHash(a);return b=m.unescapeString(b),b},m.normalizeHash=function(a){var b=a.replace(/[^#]*#/,"").replace(/#.*/,"");return b},m.setHash=function(a,b){var c,e,f;return b!==!1&&m.busy()?(m.pushQueue({scope:m,callback:m.setHash,args:arguments,queue:b}),!1):(c=m.escapeHash(a),m.busy(!0),e=m.extractState(a,!0),e&&!m.emulated.pushState?m.pushState(e.data,e.title,e.url,!1):d.location.hash!==c&&(m.bugs.setHash?(f=m.getPageUrl(),m.pushState(null,null,f+"#"+c,!1)):d.location.hash=c),m)},m.escapeHash=function(b){var c=m.normalizeHash(b);return c=a.escape(c),m.bugs.hashEscape||(c=c.replace(/\%21/g,"!").replace(/\%26/g,"&").replace(/\%3D/g,"=").replace(/\%3F/g,"?")),c},m.getHashByUrl=function(a){var b=String(a).replace(/([^#]*)#?([^#]*)#?(.*)/,"$2");return b=m.unescapeHash(b),b},m.setTitle=function(a){var b=a.title,c;b||(c=m.getStateByIndex(0),c&&c.url===a.url&&(b=c.title||m.options.initialTitle));try{d.getElementsByTagName("title")[0].innerHTML=b.replace("<","<").replace(">",">").replace(" & "," & ")}catch(e){}return d.title=b,m},m.queues=[],m.busy=function(a){typeof a!="undefined"?m.busy.flag=a:typeof m.busy.flag=="undefined"&&(m.busy.flag=!1);if(!m.busy.flag){h(m.busy.timeout);var b=function(){var a,c,d;if(m.busy.flag)return;for(a=m.queues.length-1;a>=0;--a){c=m.queues[a];if(c.length===0)continue;d=c.shift(),m.fireQueueItem(d),m.busy.timeout=g(b,m.options.busyDelay)}};m.busy.timeout=g(b,m.options.busyDelay)}return m.busy.flag},m.busy.flag=!1,m.fireQueueItem=function(a){return a.callback.apply(a.scope||m,a.args||[])},m.pushQueue=function(a){return m.queues[a.queue||0]=m.queues[a.queue||0]||[],m.queues[a.queue||0].push(a),m},m.queue=function(a,b){return typeof a=="function"&&(a={callback:a}),typeof b!="undefined"&&(a.queue=b),m.busy()?m.pushQueue(a):m.fireQueueItem(a),m},m.clearQueue=function(){return m.busy.flag=!1,m.queues=[],m},m.stateChanged=!1,m.doubleChecker=!1,m.doubleCheckComplete=function(){return m.stateChanged=!0,m.doubleCheckClear(),m},m.doubleCheckClear=function(){return m.doubleChecker&&(h(m.doubleChecker),m.doubleChecker=!1),m},m.doubleCheck=function(a){return m.stateChanged=!1,m.doubleCheckClear(),m.bugs.ieDoubleCheck&&(m.doubleChecker=g(function(){return m.doubleCheckClear(),m.stateChanged||a(),!0},m.options.doubleCheckInterval)),m},m.safariStatePoll=function(){var b=m.extractState(d.location.href),c;if(!m.isLastSavedState(b))c=b;else return;return c||(c=m.createStateObject()),m.Adapter.trigger(a,"popstate"),m},m.back=function(a){return a!==!1&&m.busy()?(m.pushQueue({scope:m,callback:m.back,args:arguments,queue:a}),!1):(m.busy(!0),m.doubleCheck(function(){m.back(!1)}),n.go(-1),!0)},m.forward=function(a){return a!==!1&&m.busy()?(m.pushQueue({scope:m,callback:m.forward,args:arguments,queue:a}),!1):(m.busy(!0),m.doubleCheck(function(){m.forward(!1)}),n.go(1),!0)},m.go=function(a,b){var c;if(a>0)for(c=1;c<=a;++c)m.forward(b);else{if(!(a<0))throw new Error("History.go: History.go requires a positive or negative integer passed.");for(c=-1;c>=a;--c)m.back(b)}return m};if(m.emulated.pushState){var o=function(){};m.pushState=m.pushState||o,m.replaceState=m.replaceState||o}else m.onPopState=function(b,c){var e=!1,f=!1,g,h;return m.doubleCheckComplete(),g=m.getHash(),g?(h=m.extractState(g||d.location.href,!0),h?m.replaceState(h.data,h.title,h.url,!1):(m.Adapter.trigger(a,"anchorchange"),m.busy(!1)),m.expectedStateId=!1,!1):(e=m.Adapter.extractEventData("state",b,c)||!1,e?f=m.getStateById(e):m.expectedStateId?f=m.getStateById(m.expectedStateId):f=m.extractState(d.location.href),f||(f=m.createStateObject(null,null,d.location.href)),m.expectedStateId=!1,m.isLastSavedState(f)?(m.busy(!1),!1):(m.storeState(f),m.saveState(f),m.setTitle(f),m.Adapter.trigger(a,"statechange"),m.busy(!1),!0))},m.Adapter.bind(a,"popstate",m.onPopState),m.pushState=function(b,c,d,e){if(m.getHashByUrl(d)&&m.emulated.pushState)throw new Error("History.js does not support states with fragement-identifiers (hashes/anchors).");if(e!==!1&&m.busy())return m.pushQueue({scope:m,callback:m.pushState,args:arguments,queue:e}),!1;m.busy(!0);var f=m.createStateObject(b,c,d);return m.isLastSavedState(f)?m.busy(!1):(m.storeState(f),m.expectedStateId=f.id,n.pushState(f.id,f.title,f.url),m.Adapter.trigger(a,"popstate")),!0},m.replaceState=function(b,c,d,e){if(m.getHashByUrl(d)&&m.emulated.pushState)throw new Error("History.js does not support states with fragement-identifiers (hashes/anchors).");if(e!==!1&&m.busy())return m.pushQueue({scope:m,callback:m.replaceState,args:arguments,queue:e}),!1;m.busy(!0);var f=m.createStateObject(b,c,d);return m.isLastSavedState(f)?m.busy(!1):(m.storeState(f),m.expectedStateId=f.id,n.replaceState(f.id,f.title,f.url),m.Adapter.trigger(a,"popstate")),!0};if(f){try{m.store=k.parse(f.getItem("History.store"))||{}}catch(p){m.store={}}m.normalizeStore()}else m.store={},m.normalizeStore();m.Adapter.bind(a,"beforeunload",m.clearAllIntervals),m.Adapter.bind(a,"unload",m.clearAllIntervals),m.saveState(m.storeState(m.extractState(d.location.href,!0))),f&&(m.onUnload=function(){var a,b;try{a=k.parse(f.getItem("History.store"))||{}}catch(c){a={}}a.idToState=a.idToState||{},a.urlToId=a.urlToId||{},a.stateToId=a.stateToId||{};for(b in m.idToState){if(!m.idToState.hasOwnProperty(b))continue;a.idToState[b]=m.idToState[b]}for(b in m.urlToId){if(!m.urlToId.hasOwnProperty(b))continue;a.urlToId[b]=m.urlToId[b]}for(b in m.stateToId){if(!m.stateToId.hasOwnProperty(b))continue;a.stateToId[b]=m.stateToId[b]}m.store=a,m.normalizeStore(),f.setItem("History.store",k.stringify(a))},m.intervalList.push(i(m.onUnload,m.options.storeInterval)),m.Adapter.bind(a,"beforeunload",m.onUnload),m.Adapter.bind(a,"unload",m.onUnload));if(!m.emulated.pushState){m.bugs.safariPoll&&m.intervalList.push(i(m.safariStatePoll,m.options.safariPollInterval));if(e.vendor==="Apple Computer, Inc."||(e.appCodeName||"")==="Mozilla")m.Adapter.bind(a,"hashchange",function(){m.Adapter.trigger(a,"popstate")}),m.getHash()&&m.Adapter.onDomLoad(function(){m.Adapter.trigger(a,"hashchange")})}},m.init()}(window) \ No newline at end of file diff --git a/js/libraries/balupton-history/scripts/bundled/html4+html5/right.history.js b/js/libraries/balupton-history/scripts/bundled/html4+html5/right.history.js new file mode 100755 index 00000000..770b4657 --- /dev/null +++ b/js/libraries/balupton-history/scripts/bundled/html4+html5/right.history.js @@ -0,0 +1 @@ +window.JSON||(window.JSON={}),function(){function f(a){return a<10?"0"+a:a}function quote(a){return escapable.lastIndex=0,escapable.test(a)?'"'+a.replace(escapable,function(a){var b=meta[a];return typeof b=="string"?b:"\\u"+("0000"+a.charCodeAt(0).toString(16)).slice(-4)})+'"':'"'+a+'"'}function str(a,b){var c,d,e,f,g=gap,h,i=b[a];i&&typeof i=="object"&&typeof i.toJSON=="function"&&(i=i.toJSON(a)),typeof rep=="function"&&(i=rep.call(b,a,i));switch(typeof i){case"string":return quote(i);case"number":return isFinite(i)?String(i):"null";case"boolean":case"null":return String(i);case"object":if(!i)return"null";gap+=indent,h=[];if(Object.prototype.toString.apply(i)==="[object Array]"){f=i.length;for(c=0;c")&&c[0]);return a>4?a:!1}();return a},m.isInternetExplorer=function(){var a=m.isInternetExplorer.cached=typeof m.isInternetExplorer.cached!="undefined"?m.isInternetExplorer.cached:Boolean(m.getInternetExplorerMajorVersion());return a},m.emulated={pushState:!Boolean(a.history&&a.history.pushState&&a.history.replaceState&&!/ Mobile\/([1-7][a-z]|(8([abcde]|f(1[0-8]))))/i.test(e.userAgent)&&!/AppleWebKit\/5([0-2]|3[0-2])/i.test(e.userAgent)),hashChange:Boolean(!("onhashchange"in a||"onhashchange"in d)||m.isInternetExplorer()&&m.getInternetExplorerMajorVersion()<8)},m.enabled=!m.emulated.pushState,m.bugs={setHash:Boolean(!m.emulated.pushState&&e.vendor==="Apple Computer, Inc."&&/AppleWebKit\/5([0-2]|3[0-3])/.test(e.userAgent)),safariPoll:Boolean(!m.emulated.pushState&&e.vendor==="Apple Computer, Inc."&&/AppleWebKit\/5([0-2]|3[0-3])/.test(e.userAgent)),ieDoubleCheck:Boolean(m.isInternetExplorer()&&m.getInternetExplorerMajorVersion()<8),hashEscape:Boolean(m.isInternetExplorer()&&m.getInternetExplorerMajorVersion()<7)},m.isEmptyObject=function(a){for(var b in a)return!1;return!0},m.cloneObject=function(a){var b,c;return a?(b=k.stringify(a),c=k.parse(b)):c={},c},m.getRootUrl=function(){var a=d.location.protocol+"//"+(d.location.hostname||d.location.host);if(d.location.port||!1)a+=":"+d.location.port;return a+="/",a},m.getBaseHref=function(){var a=d.getElementsByTagName("base"),b=null,c="";return a.length===1&&(b=a[0],c=b.href.replace(/[^\/]+$/,"")),c=c.replace(/\/+$/,""),c&&(c+="/"),c},m.getBaseUrl=function(){var a=m.getBaseHref()||m.getBasePageUrl()||m.getRootUrl();return a},m.getPageUrl=function(){var a=m.getState(!1,!1),b=(a||{}).url||d.location.href,c;return c=b.replace(/\/+$/,"").replace(/[^\/]+$/,function(a,b,c){return/\./.test(a)?a:a+"/"}),c},m.getBasePageUrl=function(){var a=d.location.href.replace(/[#\?].*/,"").replace(/[^\/]+$/,function(a,b,c){return/[^\/]$/.test(a)?"":a}).replace(/\/+$/,"")+"/";return a},m.getFullUrl=function(a,b){var c=a,d=a.substring(0,1);return b=typeof b=="undefined"?!0:b,/[a-z]+\:\/\//.test(a)||(d==="/"?c=m.getRootUrl()+a.replace(/^\/+/,""):d==="#"?c=m.getPageUrl().replace(/#.*/,"")+a:d==="?"?c=m.getPageUrl().replace(/[\?#].*/,"")+a:b?c=m.getBaseUrl()+a.replace(/^(\.\/)+/,""):c=m.getBasePageUrl()+a.replace(/^(\.\/)+/,"")),c.replace(/\#$/,"")},m.getShortUrl=function(a){var b=a,c=m.getBaseUrl(),d=m.getRootUrl();return m.emulated.pushState&&(b=b.replace(c,"")),b=b.replace(d,"/"),m.isTraditionalAnchor(b)&&(b="./"+b),b=b.replace(/^(\.\/)+/g,"./").replace(/\#$/,""),b},m.store={},m.idToState=m.idToState||{},m.stateToId=m.stateToId||{},m.urlToId=m.urlToId||{},m.storedStates=m.storedStates||[],m.savedStates=m.savedStates||[],m.normalizeStore=function(){m.store.idToState=m.store.idToState||{},m.store.urlToId=m.store.urlToId||{},m.store.stateToId=m.store.stateToId||{}},m.getState=function(a,b){typeof a=="undefined"&&(a=!0),typeof b=="undefined"&&(b=!0);var c=m.getLastSavedState();return!c&&b&&(c=m.createStateObject()),a&&(c=m.cloneObject(c),c.url=c.cleanUrl||c.url),c},m.getIdByState=function(a){var b=m.extractId(a.url),c;if(!b){c=m.getStateString(a);if(typeof m.stateToId[c]!="undefined")b=m.stateToId[c];else if(typeof m.store.stateToId[c]!="undefined")b=m.store.stateToId[c];else{for(;;){b=(new Date).getTime()+String(Math.random()).replace(/\D/g,"");if(typeof m.idToState[b]=="undefined"&&typeof m.store.idToState[b]=="undefined")break}m.stateToId[c]=b,m.idToState[b]=a}}return b},m.normalizeState=function(a){var b,c;if(!a||typeof a!="object")a={};if(typeof a.normalized!="undefined")return a;if(!a.data||typeof a.data!="object")a.data={};b={},b.normalized=!0,b.title=a.title||"",b.url=m.getFullUrl(m.unescapeString(a.url||d.location.href)),b.hash=m.getShortUrl(b.url),b.data=m.cloneObject(a.data),b.id=m.getIdByState(b),b.cleanUrl=b.url.replace(/\??\&_suid.*/,""),b.url=b.cleanUrl,c=!m.isEmptyObject(b.data);if(b.title||c)b.hash=m.getShortUrl(b.url).replace(/\??\&_suid.*/,""),/\?/.test(b.hash)||(b.hash+="?"),b.hash+="&_suid="+b.id;return b.hashedUrl=m.getFullUrl(b.hash),(m.emulated.pushState||m.bugs.safariPoll)&&m.hasUrlDuplicate(b)&&(b.url=b.hashedUrl),b},m.createStateObject=function(a,b,c){var d={data:a,title:b,url:c};return d=m.normalizeState(d),d},m.getStateById=function(a){a=String(a);var c=m.idToState[a]||m.store.idToState[a]||b;return c},m.getStateString=function(a){var b,c,d;return b=m.normalizeState(a),c={data:b.data,title:a.title,url:a.url},d=k.stringify(c),d},m.getStateId=function(a){var b,c;return b=m.normalizeState(a),c=b.id,c},m.getHashByState=function(a){var b,c;return b=m.normalizeState(a),c=b.hash,c},m.extractId=function(a){var b,c,d;return c=/(.*)\&_suid=([0-9]+)$/.exec(a),d=c?c[1]||a:a,b=c?String(c[2]||""):"",b||!1},m.isTraditionalAnchor=function(a){var b=!/[\/\?\.]/.test(a);return b},m.extractState=function(a,b){var c=null,d,e;return b=b||!1,d=m.extractId(a),d&&(c=m.getStateById(d)),c||(e=m.getFullUrl(a),d=m.getIdByUrl(e)||!1,d&&(c=m.getStateById(d)),!c&&b&&!m.isTraditionalAnchor(a)&&(c=m.createStateObject(null,null,e))),c},m.getIdByUrl=function(a){var c=m.urlToId[a]||m.store.urlToId[a]||b;return c},m.getLastSavedState=function(){return m.savedStates[m.savedStates.length-1]||b},m.getLastStoredState=function(){return m.storedStates[m.storedStates.length-1]||b},m.hasUrlDuplicate=function(a){var b=!1,c;return c=m.extractState(a.url),b=c&&c.id!==a.id,b},m.storeState=function(a){return m.urlToId[a.url]=a.id,m.storedStates.push(m.cloneObject(a)),a},m.isLastSavedState=function(a){var b=!1,c,d,e;return m.savedStates.length&&(c=a.id,d=m.getLastSavedState(),e=d.id,b=c===e),b},m.saveState=function(a){return m.isLastSavedState(a)?!1:(m.savedStates.push(m.cloneObject(a)),!0)},m.getStateByIndex=function(a){var b=null;return typeof a=="undefined"?b=m.savedStates[m.savedStates.length-1]:a<0?b=m.savedStates[m.savedStates.length+a]:b=m.savedStates[a],b},m.getHash=function(){var a=m.unescapeHash(d.location.hash);return a},m.unescapeString=function(b){var c=b,d;for(;;){d=a.unescape(c);if(d===c)break;c=d}return c},m.unescapeHash=function(a){var b=m.normalizeHash(a);return b=m.unescapeString(b),b},m.normalizeHash=function(a){var b=a.replace(/[^#]*#/,"").replace(/#.*/,"");return b},m.setHash=function(a,b){var c,e,f;return b!==!1&&m.busy()?(m.pushQueue({scope:m,callback:m.setHash,args:arguments,queue:b}),!1):(c=m.escapeHash(a),m.busy(!0),e=m.extractState(a,!0),e&&!m.emulated.pushState?m.pushState(e.data,e.title,e.url,!1):d.location.hash!==c&&(m.bugs.setHash?(f=m.getPageUrl(),m.pushState(null,null,f+"#"+c,!1)):d.location.hash=c),m)},m.escapeHash=function(b){var c=m.normalizeHash(b);return c=a.escape(c),m.bugs.hashEscape||(c=c.replace(/\%21/g,"!").replace(/\%26/g,"&").replace(/\%3D/g,"=").replace(/\%3F/g,"?")),c},m.getHashByUrl=function(a){var b=String(a).replace(/([^#]*)#?([^#]*)#?(.*)/,"$2");return b=m.unescapeHash(b),b},m.setTitle=function(a){var b=a.title,c;b||(c=m.getStateByIndex(0),c&&c.url===a.url&&(b=c.title||m.options.initialTitle));try{d.getElementsByTagName("title")[0].innerHTML=b.replace("<","<").replace(">",">").replace(" & "," & ")}catch(e){}return d.title=b,m},m.queues=[],m.busy=function(a){typeof a!="undefined"?m.busy.flag=a:typeof m.busy.flag=="undefined"&&(m.busy.flag=!1);if(!m.busy.flag){h(m.busy.timeout);var b=function(){var a,c,d;if(m.busy.flag)return;for(a=m.queues.length-1;a>=0;--a){c=m.queues[a];if(c.length===0)continue;d=c.shift(),m.fireQueueItem(d),m.busy.timeout=g(b,m.options.busyDelay)}};m.busy.timeout=g(b,m.options.busyDelay)}return m.busy.flag},m.busy.flag=!1,m.fireQueueItem=function(a){return a.callback.apply(a.scope||m,a.args||[])},m.pushQueue=function(a){return m.queues[a.queue||0]=m.queues[a.queue||0]||[],m.queues[a.queue||0].push(a),m},m.queue=function(a,b){return typeof a=="function"&&(a={callback:a}),typeof b!="undefined"&&(a.queue=b),m.busy()?m.pushQueue(a):m.fireQueueItem(a),m},m.clearQueue=function(){return m.busy.flag=!1,m.queues=[],m},m.stateChanged=!1,m.doubleChecker=!1,m.doubleCheckComplete=function(){return m.stateChanged=!0,m.doubleCheckClear(),m},m.doubleCheckClear=function(){return m.doubleChecker&&(h(m.doubleChecker),m.doubleChecker=!1),m},m.doubleCheck=function(a){return m.stateChanged=!1,m.doubleCheckClear(),m.bugs.ieDoubleCheck&&(m.doubleChecker=g(function(){return m.doubleCheckClear(),m.stateChanged||a(),!0},m.options.doubleCheckInterval)),m},m.safariStatePoll=function(){var b=m.extractState(d.location.href),c;if(!m.isLastSavedState(b))c=b;else return;return c||(c=m.createStateObject()),m.Adapter.trigger(a,"popstate"),m},m.back=function(a){return a!==!1&&m.busy()?(m.pushQueue({scope:m,callback:m.back,args:arguments,queue:a}),!1):(m.busy(!0),m.doubleCheck(function(){m.back(!1)}),n.go(-1),!0)},m.forward=function(a){return a!==!1&&m.busy()?(m.pushQueue({scope:m,callback:m.forward,args:arguments,queue:a}),!1):(m.busy(!0),m.doubleCheck(function(){m.forward(!1)}),n.go(1),!0)},m.go=function(a,b){var c;if(a>0)for(c=1;c<=a;++c)m.forward(b);else{if(!(a<0))throw new Error("History.go: History.go requires a positive or negative integer passed.");for(c=-1;c>=a;--c)m.back(b)}return m};if(m.emulated.pushState){var o=function(){};m.pushState=m.pushState||o,m.replaceState=m.replaceState||o}else m.onPopState=function(b,c){var e=!1,f=!1,g,h;return m.doubleCheckComplete(),g=m.getHash(),g?(h=m.extractState(g||d.location.href,!0),h?m.replaceState(h.data,h.title,h.url,!1):(m.Adapter.trigger(a,"anchorchange"),m.busy(!1)),m.expectedStateId=!1,!1):(e=m.Adapter.extractEventData("state",b,c)||!1,e?f=m.getStateById(e):m.expectedStateId?f=m.getStateById(m.expectedStateId):f=m.extractState(d.location.href),f||(f=m.createStateObject(null,null,d.location.href)),m.expectedStateId=!1,m.isLastSavedState(f)?(m.busy(!1),!1):(m.storeState(f),m.saveState(f),m.setTitle(f),m.Adapter.trigger(a,"statechange"),m.busy(!1),!0))},m.Adapter.bind(a,"popstate",m.onPopState),m.pushState=function(b,c,d,e){if(m.getHashByUrl(d)&&m.emulated.pushState)throw new Error("History.js does not support states with fragement-identifiers (hashes/anchors).");if(e!==!1&&m.busy())return m.pushQueue({scope:m,callback:m.pushState,args:arguments,queue:e}),!1;m.busy(!0);var f=m.createStateObject(b,c,d);return m.isLastSavedState(f)?m.busy(!1):(m.storeState(f),m.expectedStateId=f.id,n.pushState(f.id,f.title,f.url),m.Adapter.trigger(a,"popstate")),!0},m.replaceState=function(b,c,d,e){if(m.getHashByUrl(d)&&m.emulated.pushState)throw new Error("History.js does not support states with fragement-identifiers (hashes/anchors).");if(e!==!1&&m.busy())return m.pushQueue({scope:m,callback:m.replaceState,args:arguments,queue:e}),!1;m.busy(!0);var f=m.createStateObject(b,c,d);return m.isLastSavedState(f)?m.busy(!1):(m.storeState(f),m.expectedStateId=f.id,n.replaceState(f.id,f.title,f.url),m.Adapter.trigger(a,"popstate")),!0};if(f){try{m.store=k.parse(f.getItem("History.store"))||{}}catch(p){m.store={}}m.normalizeStore()}else m.store={},m.normalizeStore();m.Adapter.bind(a,"beforeunload",m.clearAllIntervals),m.Adapter.bind(a,"unload",m.clearAllIntervals),m.saveState(m.storeState(m.extractState(d.location.href,!0))),f&&(m.onUnload=function(){var a,b;try{a=k.parse(f.getItem("History.store"))||{}}catch(c){a={}}a.idToState=a.idToState||{},a.urlToId=a.urlToId||{},a.stateToId=a.stateToId||{};for(b in m.idToState){if(!m.idToState.hasOwnProperty(b))continue;a.idToState[b]=m.idToState[b]}for(b in m.urlToId){if(!m.urlToId.hasOwnProperty(b))continue;a.urlToId[b]=m.urlToId[b]}for(b in m.stateToId){if(!m.stateToId.hasOwnProperty(b))continue;a.stateToId[b]=m.stateToId[b]}m.store=a,m.normalizeStore(),f.setItem("History.store",k.stringify(a))},m.intervalList.push(i(m.onUnload,m.options.storeInterval)),m.Adapter.bind(a,"beforeunload",m.onUnload),m.Adapter.bind(a,"unload",m.onUnload));if(!m.emulated.pushState){m.bugs.safariPoll&&m.intervalList.push(i(m.safariStatePoll,m.options.safariPollInterval));if(e.vendor==="Apple Computer, Inc."||(e.appCodeName||"")==="Mozilla")m.Adapter.bind(a,"hashchange",function(){m.Adapter.trigger(a,"popstate")}),m.getHash()&&m.Adapter.onDomLoad(function(){m.Adapter.trigger(a,"hashchange")})}},m.init()}(window) \ No newline at end of file diff --git a/js/libraries/balupton-history/scripts/bundled/html4+html5/zepto.history.js b/js/libraries/balupton-history/scripts/bundled/html4+html5/zepto.history.js new file mode 100755 index 00000000..c1e0baf9 --- /dev/null +++ b/js/libraries/balupton-history/scripts/bundled/html4+html5/zepto.history.js @@ -0,0 +1 @@ +window.JSON||(window.JSON={}),function(){function f(a){return a<10?"0"+a:a}function quote(a){return escapable.lastIndex=0,escapable.test(a)?'"'+a.replace(escapable,function(a){var b=meta[a];return typeof b=="string"?b:"\\u"+("0000"+a.charCodeAt(0).toString(16)).slice(-4)})+'"':'"'+a+'"'}function str(a,b){var c,d,e,f,g=gap,h,i=b[a];i&&typeof i=="object"&&typeof i.toJSON=="function"&&(i=i.toJSON(a)),typeof rep=="function"&&(i=rep.call(b,a,i));switch(typeof i){case"string":return quote(i);case"number":return isFinite(i)?String(i):"null";case"boolean":case"null":return String(i);case"object":if(!i)return"null";gap+=indent,h=[];if(Object.prototype.toString.apply(i)==="[object Array]"){f=i.length;for(c=0;c")&&c[0]);return a>4?a:!1}();return a},m.isInternetExplorer=function(){var a=m.isInternetExplorer.cached=typeof m.isInternetExplorer.cached!="undefined"?m.isInternetExplorer.cached:Boolean(m.getInternetExplorerMajorVersion());return a},m.emulated={pushState:!Boolean(a.history&&a.history.pushState&&a.history.replaceState&&!/ Mobile\/([1-7][a-z]|(8([abcde]|f(1[0-8]))))/i.test(e.userAgent)&&!/AppleWebKit\/5([0-2]|3[0-2])/i.test(e.userAgent)),hashChange:Boolean(!("onhashchange"in a||"onhashchange"in d)||m.isInternetExplorer()&&m.getInternetExplorerMajorVersion()<8)},m.enabled=!m.emulated.pushState,m.bugs={setHash:Boolean(!m.emulated.pushState&&e.vendor==="Apple Computer, Inc."&&/AppleWebKit\/5([0-2]|3[0-3])/.test(e.userAgent)),safariPoll:Boolean(!m.emulated.pushState&&e.vendor==="Apple Computer, Inc."&&/AppleWebKit\/5([0-2]|3[0-3])/.test(e.userAgent)),ieDoubleCheck:Boolean(m.isInternetExplorer()&&m.getInternetExplorerMajorVersion()<8),hashEscape:Boolean(m.isInternetExplorer()&&m.getInternetExplorerMajorVersion()<7)},m.isEmptyObject=function(a){for(var b in a)return!1;return!0},m.cloneObject=function(a){var b,c;return a?(b=k.stringify(a),c=k.parse(b)):c={},c},m.getRootUrl=function(){var a=d.location.protocol+"//"+(d.location.hostname||d.location.host);if(d.location.port||!1)a+=":"+d.location.port;return a+="/",a},m.getBaseHref=function(){var a=d.getElementsByTagName("base"),b=null,c="";return a.length===1&&(b=a[0],c=b.href.replace(/[^\/]+$/,"")),c=c.replace(/\/+$/,""),c&&(c+="/"),c},m.getBaseUrl=function(){var a=m.getBaseHref()||m.getBasePageUrl()||m.getRootUrl();return a},m.getPageUrl=function(){var a=m.getState(!1,!1),b=(a||{}).url||d.location.href,c;return c=b.replace(/\/+$/,"").replace(/[^\/]+$/,function(a,b,c){return/\./.test(a)?a:a+"/"}),c},m.getBasePageUrl=function(){var a=d.location.href.replace(/[#\?].*/,"").replace(/[^\/]+$/,function(a,b,c){return/[^\/]$/.test(a)?"":a}).replace(/\/+$/,"")+"/";return a},m.getFullUrl=function(a,b){var c=a,d=a.substring(0,1);return b=typeof b=="undefined"?!0:b,/[a-z]+\:\/\//.test(a)||(d==="/"?c=m.getRootUrl()+a.replace(/^\/+/,""):d==="#"?c=m.getPageUrl().replace(/#.*/,"")+a:d==="?"?c=m.getPageUrl().replace(/[\?#].*/,"")+a:b?c=m.getBaseUrl()+a.replace(/^(\.\/)+/,""):c=m.getBasePageUrl()+a.replace(/^(\.\/)+/,"")),c.replace(/\#$/,"")},m.getShortUrl=function(a){var b=a,c=m.getBaseUrl(),d=m.getRootUrl();return m.emulated.pushState&&(b=b.replace(c,"")),b=b.replace(d,"/"),m.isTraditionalAnchor(b)&&(b="./"+b),b=b.replace(/^(\.\/)+/g,"./").replace(/\#$/,""),b},m.store={},m.idToState=m.idToState||{},m.stateToId=m.stateToId||{},m.urlToId=m.urlToId||{},m.storedStates=m.storedStates||[],m.savedStates=m.savedStates||[],m.normalizeStore=function(){m.store.idToState=m.store.idToState||{},m.store.urlToId=m.store.urlToId||{},m.store.stateToId=m.store.stateToId||{}},m.getState=function(a,b){typeof a=="undefined"&&(a=!0),typeof b=="undefined"&&(b=!0);var c=m.getLastSavedState();return!c&&b&&(c=m.createStateObject()),a&&(c=m.cloneObject(c),c.url=c.cleanUrl||c.url),c},m.getIdByState=function(a){var b=m.extractId(a.url),c;if(!b){c=m.getStateString(a);if(typeof m.stateToId[c]!="undefined")b=m.stateToId[c];else if(typeof m.store.stateToId[c]!="undefined")b=m.store.stateToId[c];else{for(;;){b=(new Date).getTime()+String(Math.random()).replace(/\D/g,"");if(typeof m.idToState[b]=="undefined"&&typeof m.store.idToState[b]=="undefined")break}m.stateToId[c]=b,m.idToState[b]=a}}return b},m.normalizeState=function(a){var b,c;if(!a||typeof a!="object")a={};if(typeof a.normalized!="undefined")return a;if(!a.data||typeof a.data!="object")a.data={};b={},b.normalized=!0,b.title=a.title||"",b.url=m.getFullUrl(m.unescapeString(a.url||d.location.href)),b.hash=m.getShortUrl(b.url),b.data=m.cloneObject(a.data),b.id=m.getIdByState(b),b.cleanUrl=b.url.replace(/\??\&_suid.*/,""),b.url=b.cleanUrl,c=!m.isEmptyObject(b.data);if(b.title||c)b.hash=m.getShortUrl(b.url).replace(/\??\&_suid.*/,""),/\?/.test(b.hash)||(b.hash+="?"),b.hash+="&_suid="+b.id;return b.hashedUrl=m.getFullUrl(b.hash),(m.emulated.pushState||m.bugs.safariPoll)&&m.hasUrlDuplicate(b)&&(b.url=b.hashedUrl),b},m.createStateObject=function(a,b,c){var d={data:a,title:b,url:c};return d=m.normalizeState(d),d},m.getStateById=function(a){a=String(a);var c=m.idToState[a]||m.store.idToState[a]||b;return c},m.getStateString=function(a){var b,c,d;return b=m.normalizeState(a),c={data:b.data,title:a.title,url:a.url},d=k.stringify(c),d},m.getStateId=function(a){var b,c;return b=m.normalizeState(a),c=b.id,c},m.getHashByState=function(a){var b,c;return b=m.normalizeState(a),c=b.hash,c},m.extractId=function(a){var b,c,d;return c=/(.*)\&_suid=([0-9]+)$/.exec(a),d=c?c[1]||a:a,b=c?String(c[2]||""):"",b||!1},m.isTraditionalAnchor=function(a){var b=!/[\/\?\.]/.test(a);return b},m.extractState=function(a,b){var c=null,d,e;return b=b||!1,d=m.extractId(a),d&&(c=m.getStateById(d)),c||(e=m.getFullUrl(a),d=m.getIdByUrl(e)||!1,d&&(c=m.getStateById(d)),!c&&b&&!m.isTraditionalAnchor(a)&&(c=m.createStateObject(null,null,e))),c},m.getIdByUrl=function(a){var c=m.urlToId[a]||m.store.urlToId[a]||b;return c},m.getLastSavedState=function(){return m.savedStates[m.savedStates.length-1]||b},m.getLastStoredState=function(){return m.storedStates[m.storedStates.length-1]||b},m.hasUrlDuplicate=function(a){var b=!1,c;return c=m.extractState(a.url),b=c&&c.id!==a.id,b},m.storeState=function(a){return m.urlToId[a.url]=a.id,m.storedStates.push(m.cloneObject(a)),a},m.isLastSavedState=function(a){var b=!1,c,d,e;return m.savedStates.length&&(c=a.id,d=m.getLastSavedState(),e=d.id,b=c===e),b},m.saveState=function(a){return m.isLastSavedState(a)?!1:(m.savedStates.push(m.cloneObject(a)),!0)},m.getStateByIndex=function(a){var b=null;return typeof a=="undefined"?b=m.savedStates[m.savedStates.length-1]:a<0?b=m.savedStates[m.savedStates.length+a]:b=m.savedStates[a],b},m.getHash=function(){var a=m.unescapeHash(d.location.hash);return a},m.unescapeString=function(b){var c=b,d;for(;;){d=a.unescape(c);if(d===c)break;c=d}return c},m.unescapeHash=function(a){var b=m.normalizeHash(a);return b=m.unescapeString(b),b},m.normalizeHash=function(a){var b=a.replace(/[^#]*#/,"").replace(/#.*/,"");return b},m.setHash=function(a,b){var c,e,f;return b!==!1&&m.busy()?(m.pushQueue({scope:m,callback:m.setHash,args:arguments,queue:b}),!1):(c=m.escapeHash(a),m.busy(!0),e=m.extractState(a,!0),e&&!m.emulated.pushState?m.pushState(e.data,e.title,e.url,!1):d.location.hash!==c&&(m.bugs.setHash?(f=m.getPageUrl(),m.pushState(null,null,f+"#"+c,!1)):d.location.hash=c),m)},m.escapeHash=function(b){var c=m.normalizeHash(b);return c=a.escape(c),m.bugs.hashEscape||(c=c.replace(/\%21/g,"!").replace(/\%26/g,"&").replace(/\%3D/g,"=").replace(/\%3F/g,"?")),c},m.getHashByUrl=function(a){var b=String(a).replace(/([^#]*)#?([^#]*)#?(.*)/,"$2");return b=m.unescapeHash(b),b},m.setTitle=function(a){var b=a.title,c;b||(c=m.getStateByIndex(0),c&&c.url===a.url&&(b=c.title||m.options.initialTitle));try{d.getElementsByTagName("title")[0].innerHTML=b.replace("<","<").replace(">",">").replace(" & "," & ")}catch(e){}return d.title=b,m},m.queues=[],m.busy=function(a){typeof a!="undefined"?m.busy.flag=a:typeof m.busy.flag=="undefined"&&(m.busy.flag=!1);if(!m.busy.flag){h(m.busy.timeout);var b=function(){var a,c,d;if(m.busy.flag)return;for(a=m.queues.length-1;a>=0;--a){c=m.queues[a];if(c.length===0)continue;d=c.shift(),m.fireQueueItem(d),m.busy.timeout=g(b,m.options.busyDelay)}};m.busy.timeout=g(b,m.options.busyDelay)}return m.busy.flag},m.busy.flag=!1,m.fireQueueItem=function(a){return a.callback.apply(a.scope||m,a.args||[])},m.pushQueue=function(a){return m.queues[a.queue||0]=m.queues[a.queue||0]||[],m.queues[a.queue||0].push(a),m},m.queue=function(a,b){return typeof a=="function"&&(a={callback:a}),typeof b!="undefined"&&(a.queue=b),m.busy()?m.pushQueue(a):m.fireQueueItem(a),m},m.clearQueue=function(){return m.busy.flag=!1,m.queues=[],m},m.stateChanged=!1,m.doubleChecker=!1,m.doubleCheckComplete=function(){return m.stateChanged=!0,m.doubleCheckClear(),m},m.doubleCheckClear=function(){return m.doubleChecker&&(h(m.doubleChecker),m.doubleChecker=!1),m},m.doubleCheck=function(a){return m.stateChanged=!1,m.doubleCheckClear(),m.bugs.ieDoubleCheck&&(m.doubleChecker=g(function(){return m.doubleCheckClear(),m.stateChanged||a(),!0},m.options.doubleCheckInterval)),m},m.safariStatePoll=function(){var b=m.extractState(d.location.href),c;if(!m.isLastSavedState(b))c=b;else return;return c||(c=m.createStateObject()),m.Adapter.trigger(a,"popstate"),m},m.back=function(a){return a!==!1&&m.busy()?(m.pushQueue({scope:m,callback:m.back,args:arguments,queue:a}),!1):(m.busy(!0),m.doubleCheck(function(){m.back(!1)}),n.go(-1),!0)},m.forward=function(a){return a!==!1&&m.busy()?(m.pushQueue({scope:m,callback:m.forward,args:arguments,queue:a}),!1):(m.busy(!0),m.doubleCheck(function(){m.forward(!1)}),n.go(1),!0)},m.go=function(a,b){var c;if(a>0)for(c=1;c<=a;++c)m.forward(b);else{if(!(a<0))throw new Error("History.go: History.go requires a positive or negative integer passed.");for(c=-1;c>=a;--c)m.back(b)}return m};if(m.emulated.pushState){var o=function(){};m.pushState=m.pushState||o,m.replaceState=m.replaceState||o}else m.onPopState=function(b,c){var e=!1,f=!1,g,h;return m.doubleCheckComplete(),g=m.getHash(),g?(h=m.extractState(g||d.location.href,!0),h?m.replaceState(h.data,h.title,h.url,!1):(m.Adapter.trigger(a,"anchorchange"),m.busy(!1)),m.expectedStateId=!1,!1):(e=m.Adapter.extractEventData("state",b,c)||!1,e?f=m.getStateById(e):m.expectedStateId?f=m.getStateById(m.expectedStateId):f=m.extractState(d.location.href),f||(f=m.createStateObject(null,null,d.location.href)),m.expectedStateId=!1,m.isLastSavedState(f)?(m.busy(!1),!1):(m.storeState(f),m.saveState(f),m.setTitle(f),m.Adapter.trigger(a,"statechange"),m.busy(!1),!0))},m.Adapter.bind(a,"popstate",m.onPopState),m.pushState=function(b,c,d,e){if(m.getHashByUrl(d)&&m.emulated.pushState)throw new Error("History.js does not support states with fragement-identifiers (hashes/anchors).");if(e!==!1&&m.busy())return m.pushQueue({scope:m,callback:m.pushState,args:arguments,queue:e}),!1;m.busy(!0);var f=m.createStateObject(b,c,d);return m.isLastSavedState(f)?m.busy(!1):(m.storeState(f),m.expectedStateId=f.id,n.pushState(f.id,f.title,f.url),m.Adapter.trigger(a,"popstate")),!0},m.replaceState=function(b,c,d,e){if(m.getHashByUrl(d)&&m.emulated.pushState)throw new Error("History.js does not support states with fragement-identifiers (hashes/anchors).");if(e!==!1&&m.busy())return m.pushQueue({scope:m,callback:m.replaceState,args:arguments,queue:e}),!1;m.busy(!0);var f=m.createStateObject(b,c,d);return m.isLastSavedState(f)?m.busy(!1):(m.storeState(f),m.expectedStateId=f.id,n.replaceState(f.id,f.title,f.url),m.Adapter.trigger(a,"popstate")),!0};if(f){try{m.store=k.parse(f.getItem("History.store"))||{}}catch(p){m.store={}}m.normalizeStore()}else m.store={},m.normalizeStore();m.Adapter.bind(a,"beforeunload",m.clearAllIntervals),m.Adapter.bind(a,"unload",m.clearAllIntervals),m.saveState(m.storeState(m.extractState(d.location.href,!0))),f&&(m.onUnload=function(){var a,b;try{a=k.parse(f.getItem("History.store"))||{}}catch(c){a={}}a.idToState=a.idToState||{},a.urlToId=a.urlToId||{},a.stateToId=a.stateToId||{};for(b in m.idToState){if(!m.idToState.hasOwnProperty(b))continue;a.idToState[b]=m.idToState[b]}for(b in m.urlToId){if(!m.urlToId.hasOwnProperty(b))continue;a.urlToId[b]=m.urlToId[b]}for(b in m.stateToId){if(!m.stateToId.hasOwnProperty(b))continue;a.stateToId[b]=m.stateToId[b]}m.store=a,m.normalizeStore(),f.setItem("History.store",k.stringify(a))},m.intervalList.push(i(m.onUnload,m.options.storeInterval)),m.Adapter.bind(a,"beforeunload",m.onUnload),m.Adapter.bind(a,"unload",m.onUnload));if(!m.emulated.pushState){m.bugs.safariPoll&&m.intervalList.push(i(m.safariStatePoll,m.options.safariPollInterval));if(e.vendor==="Apple Computer, Inc."||(e.appCodeName||"")==="Mozilla")m.Adapter.bind(a,"hashchange",function(){m.Adapter.trigger(a,"popstate")}),m.getHash()&&m.Adapter.onDomLoad(function(){m.Adapter.trigger(a,"hashchange")})}},m.init()}(window) \ No newline at end of file diff --git a/js/libraries/balupton-history/scripts/bundled/html5/jquery.history.js b/js/libraries/balupton-history/scripts/bundled/html5/jquery.history.js new file mode 100755 index 00000000..628d41d1 --- /dev/null +++ b/js/libraries/balupton-history/scripts/bundled/html5/jquery.history.js @@ -0,0 +1 @@ +(function(a,b){"use strict";var c=a.History=a.History||{},d=a.jQuery;if(typeof c.Adapter!="undefined")throw new Error("History.js Adapter has already been loaded...");c.Adapter={bind:function(a,b,c){d(a).bind(b,c)},trigger:function(a,b,c){d(a).trigger(b,c)},extractEventData:function(a,c,d){var e=c&&c.originalEvent&&c.originalEvent[a]||d&&d[a]||b;return e},onDomLoad:function(a){d(a)}},typeof c.init!="undefined"&&c.init()})(window),function(a,b){"use strict";var c=a.console||b,d=a.document,e=a.navigator,f=a.sessionStorage||!1,g=a.setTimeout,h=a.clearTimeout,i=a.setInterval,j=a.clearInterval,k=a.JSON,l=a.alert,m=a.History=a.History||{},n=a.history;k.stringify=k.stringify||k.encode,k.parse=k.parse||k.decode;if(typeof m.init!="undefined")throw new Error("History.js Core has already been loaded...");m.init=function(){return typeof m.Adapter=="undefined"?!1:(typeof m.initCore!="undefined"&&m.initCore(),typeof m.initHtml4!="undefined"&&m.initHtml4(),!0)},m.initCore=function(){if(typeof m.initCore.initialized!="undefined")return!1;m.initCore.initialized=!0,m.options=m.options||{},m.options.hashChangeInterval=m.options.hashChangeInterval||100,m.options.safariPollInterval=m.options.safariPollInterval||500,m.options.doubleCheckInterval=m.options.doubleCheckInterval||500,m.options.storeInterval=m.options.storeInterval||1e3,m.options.busyDelay=m.options.busyDelay||250,m.options.debug=m.options.debug||!1,m.options.initialTitle=m.options.initialTitle||d.title,m.intervalList=[],m.clearAllIntervals=function(){var a,b=m.intervalList;if(typeof b!="undefined"&&b!==null){for(a=0;a")&&c[0]);return a>4?a:!1}();return a},m.isInternetExplorer=function(){var a=m.isInternetExplorer.cached=typeof m.isInternetExplorer.cached!="undefined"?m.isInternetExplorer.cached:Boolean(m.getInternetExplorerMajorVersion());return a},m.emulated={pushState:!Boolean(a.history&&a.history.pushState&&a.history.replaceState&&!/ Mobile\/([1-7][a-z]|(8([abcde]|f(1[0-8]))))/i.test(e.userAgent)&&!/AppleWebKit\/5([0-2]|3[0-2])/i.test(e.userAgent)),hashChange:Boolean(!("onhashchange"in a||"onhashchange"in d)||m.isInternetExplorer()&&m.getInternetExplorerMajorVersion()<8)},m.enabled=!m.emulated.pushState,m.bugs={setHash:Boolean(!m.emulated.pushState&&e.vendor==="Apple Computer, Inc."&&/AppleWebKit\/5([0-2]|3[0-3])/.test(e.userAgent)),safariPoll:Boolean(!m.emulated.pushState&&e.vendor==="Apple Computer, Inc."&&/AppleWebKit\/5([0-2]|3[0-3])/.test(e.userAgent)),ieDoubleCheck:Boolean(m.isInternetExplorer()&&m.getInternetExplorerMajorVersion()<8),hashEscape:Boolean(m.isInternetExplorer()&&m.getInternetExplorerMajorVersion()<7)},m.isEmptyObject=function(a){for(var b in a)return!1;return!0},m.cloneObject=function(a){var b,c;return a?(b=k.stringify(a),c=k.parse(b)):c={},c},m.getRootUrl=function(){var a=d.location.protocol+"//"+(d.location.hostname||d.location.host);if(d.location.port||!1)a+=":"+d.location.port;return a+="/",a},m.getBaseHref=function(){var a=d.getElementsByTagName("base"),b=null,c="";return a.length===1&&(b=a[0],c=b.href.replace(/[^\/]+$/,"")),c=c.replace(/\/+$/,""),c&&(c+="/"),c},m.getBaseUrl=function(){var a=m.getBaseHref()||m.getBasePageUrl()||m.getRootUrl();return a},m.getPageUrl=function(){var a=m.getState(!1,!1),b=(a||{}).url||d.location.href,c;return c=b.replace(/\/+$/,"").replace(/[^\/]+$/,function(a,b,c){return/\./.test(a)?a:a+"/"}),c},m.getBasePageUrl=function(){var a=d.location.href.replace(/[#\?].*/,"").replace(/[^\/]+$/,function(a,b,c){return/[^\/]$/.test(a)?"":a}).replace(/\/+$/,"")+"/";return a},m.getFullUrl=function(a,b){var c=a,d=a.substring(0,1);return b=typeof b=="undefined"?!0:b,/[a-z]+\:\/\//.test(a)||(d==="/"?c=m.getRootUrl()+a.replace(/^\/+/,""):d==="#"?c=m.getPageUrl().replace(/#.*/,"")+a:d==="?"?c=m.getPageUrl().replace(/[\?#].*/,"")+a:b?c=m.getBaseUrl()+a.replace(/^(\.\/)+/,""):c=m.getBasePageUrl()+a.replace(/^(\.\/)+/,"")),c.replace(/\#$/,"")},m.getShortUrl=function(a){var b=a,c=m.getBaseUrl(),d=m.getRootUrl();return m.emulated.pushState&&(b=b.replace(c,"")),b=b.replace(d,"/"),m.isTraditionalAnchor(b)&&(b="./"+b),b=b.replace(/^(\.\/)+/g,"./").replace(/\#$/,""),b},m.store={},m.idToState=m.idToState||{},m.stateToId=m.stateToId||{},m.urlToId=m.urlToId||{},m.storedStates=m.storedStates||[],m.savedStates=m.savedStates||[],m.normalizeStore=function(){m.store.idToState=m.store.idToState||{},m.store.urlToId=m.store.urlToId||{},m.store.stateToId=m.store.stateToId||{}},m.getState=function(a,b){typeof a=="undefined"&&(a=!0),typeof b=="undefined"&&(b=!0);var c=m.getLastSavedState();return!c&&b&&(c=m.createStateObject()),a&&(c=m.cloneObject(c),c.url=c.cleanUrl||c.url),c},m.getIdByState=function(a){var b=m.extractId(a.url),c;if(!b){c=m.getStateString(a);if(typeof m.stateToId[c]!="undefined")b=m.stateToId[c];else if(typeof m.store.stateToId[c]!="undefined")b=m.store.stateToId[c];else{for(;;){b=(new Date).getTime()+String(Math.random()).replace(/\D/g,"");if(typeof m.idToState[b]=="undefined"&&typeof m.store.idToState[b]=="undefined")break}m.stateToId[c]=b,m.idToState[b]=a}}return b},m.normalizeState=function(a){var b,c;if(!a||typeof a!="object")a={};if(typeof a.normalized!="undefined")return a;if(!a.data||typeof a.data!="object")a.data={};b={},b.normalized=!0,b.title=a.title||"",b.url=m.getFullUrl(m.unescapeString(a.url||d.location.href)),b.hash=m.getShortUrl(b.url),b.data=m.cloneObject(a.data),b.id=m.getIdByState(b),b.cleanUrl=b.url.replace(/\??\&_suid.*/,""),b.url=b.cleanUrl,c=!m.isEmptyObject(b.data);if(b.title||c)b.hash=m.getShortUrl(b.url).replace(/\??\&_suid.*/,""),/\?/.test(b.hash)||(b.hash+="?"),b.hash+="&_suid="+b.id;return b.hashedUrl=m.getFullUrl(b.hash),(m.emulated.pushState||m.bugs.safariPoll)&&m.hasUrlDuplicate(b)&&(b.url=b.hashedUrl),b},m.createStateObject=function(a,b,c){var d={data:a,title:b,url:c};return d=m.normalizeState(d),d},m.getStateById=function(a){a=String(a);var c=m.idToState[a]||m.store.idToState[a]||b;return c},m.getStateString=function(a){var b,c,d;return b=m.normalizeState(a),c={data:b.data,title:a.title,url:a.url},d=k.stringify(c),d},m.getStateId=function(a){var b,c;return b=m.normalizeState(a),c=b.id,c},m.getHashByState=function(a){var b,c;return b=m.normalizeState(a),c=b.hash,c},m.extractId=function(a){var b,c,d;return c=/(.*)\&_suid=([0-9]+)$/.exec(a),d=c?c[1]||a:a,b=c?String(c[2]||""):"",b||!1},m.isTraditionalAnchor=function(a){var b=!/[\/\?\.]/.test(a);return b},m.extractState=function(a,b){var c=null,d,e;return b=b||!1,d=m.extractId(a),d&&(c=m.getStateById(d)),c||(e=m.getFullUrl(a),d=m.getIdByUrl(e)||!1,d&&(c=m.getStateById(d)),!c&&b&&!m.isTraditionalAnchor(a)&&(c=m.createStateObject(null,null,e))),c},m.getIdByUrl=function(a){var c=m.urlToId[a]||m.store.urlToId[a]||b;return c},m.getLastSavedState=function(){return m.savedStates[m.savedStates.length-1]||b},m.getLastStoredState=function(){return m.storedStates[m.storedStates.length-1]||b},m.hasUrlDuplicate=function(a){var b=!1,c;return c=m.extractState(a.url),b=c&&c.id!==a.id,b},m.storeState=function(a){return m.urlToId[a.url]=a.id,m.storedStates.push(m.cloneObject(a)),a},m.isLastSavedState=function(a){var b=!1,c,d,e;return m.savedStates.length&&(c=a.id,d=m.getLastSavedState(),e=d.id,b=c===e),b},m.saveState=function(a){return m.isLastSavedState(a)?!1:(m.savedStates.push(m.cloneObject(a)),!0)},m.getStateByIndex=function(a){var b=null;return typeof a=="undefined"?b=m.savedStates[m.savedStates.length-1]:a<0?b=m.savedStates[m.savedStates.length+a]:b=m.savedStates[a],b},m.getHash=function(){var a=m.unescapeHash(d.location.hash);return a},m.unescapeString=function(b){var c=b,d;for(;;){d=a.unescape(c);if(d===c)break;c=d}return c},m.unescapeHash=function(a){var b=m.normalizeHash(a);return b=m.unescapeString(b),b},m.normalizeHash=function(a){var b=a.replace(/[^#]*#/,"").replace(/#.*/,"");return b},m.setHash=function(a,b){var c,e,f;return b!==!1&&m.busy()?(m.pushQueue({scope:m,callback:m.setHash,args:arguments,queue:b}),!1):(c=m.escapeHash(a),m.busy(!0),e=m.extractState(a,!0),e&&!m.emulated.pushState?m.pushState(e.data,e.title,e.url,!1):d.location.hash!==c&&(m.bugs.setHash?(f=m.getPageUrl(),m.pushState(null,null,f+"#"+c,!1)):d.location.hash=c),m)},m.escapeHash=function(b){var c=m.normalizeHash(b);return c=a.escape(c),m.bugs.hashEscape||(c=c.replace(/\%21/g,"!").replace(/\%26/g,"&").replace(/\%3D/g,"=").replace(/\%3F/g,"?")),c},m.getHashByUrl=function(a){var b=String(a).replace(/([^#]*)#?([^#]*)#?(.*)/,"$2");return b=m.unescapeHash(b),b},m.setTitle=function(a){var b=a.title,c;b||(c=m.getStateByIndex(0),c&&c.url===a.url&&(b=c.title||m.options.initialTitle));try{d.getElementsByTagName("title")[0].innerHTML=b.replace("<","<").replace(">",">").replace(" & "," & ")}catch(e){}return d.title=b,m},m.queues=[],m.busy=function(a){typeof a!="undefined"?m.busy.flag=a:typeof m.busy.flag=="undefined"&&(m.busy.flag=!1);if(!m.busy.flag){h(m.busy.timeout);var b=function(){var a,c,d;if(m.busy.flag)return;for(a=m.queues.length-1;a>=0;--a){c=m.queues[a];if(c.length===0)continue;d=c.shift(),m.fireQueueItem(d),m.busy.timeout=g(b,m.options.busyDelay)}};m.busy.timeout=g(b,m.options.busyDelay)}return m.busy.flag},m.busy.flag=!1,m.fireQueueItem=function(a){return a.callback.apply(a.scope||m,a.args||[])},m.pushQueue=function(a){return m.queues[a.queue||0]=m.queues[a.queue||0]||[],m.queues[a.queue||0].push(a),m},m.queue=function(a,b){return typeof a=="function"&&(a={callback:a}),typeof b!="undefined"&&(a.queue=b),m.busy()?m.pushQueue(a):m.fireQueueItem(a),m},m.clearQueue=function(){return m.busy.flag=!1,m.queues=[],m},m.stateChanged=!1,m.doubleChecker=!1,m.doubleCheckComplete=function(){return m.stateChanged=!0,m.doubleCheckClear(),m},m.doubleCheckClear=function(){return m.doubleChecker&&(h(m.doubleChecker),m.doubleChecker=!1),m},m.doubleCheck=function(a){return m.stateChanged=!1,m.doubleCheckClear(),m.bugs.ieDoubleCheck&&(m.doubleChecker=g(function(){return m.doubleCheckClear(),m.stateChanged||a(),!0},m.options.doubleCheckInterval)),m},m.safariStatePoll=function(){var b=m.extractState(d.location.href),c;if(!m.isLastSavedState(b))c=b;else return;return c||(c=m.createStateObject()),m.Adapter.trigger(a,"popstate"),m},m.back=function(a){return a!==!1&&m.busy()?(m.pushQueue({scope:m,callback:m.back,args:arguments,queue:a}),!1):(m.busy(!0),m.doubleCheck(function(){m.back(!1)}),n.go(-1),!0)},m.forward=function(a){return a!==!1&&m.busy()?(m.pushQueue({scope:m,callback:m.forward,args:arguments,queue:a}),!1):(m.busy(!0),m.doubleCheck(function(){m.forward(!1)}),n.go(1),!0)},m.go=function(a,b){var c;if(a>0)for(c=1;c<=a;++c)m.forward(b);else{if(!(a<0))throw new Error("History.go: History.go requires a positive or negative integer passed.");for(c=-1;c>=a;--c)m.back(b)}return m};if(m.emulated.pushState){var o=function(){};m.pushState=m.pushState||o,m.replaceState=m.replaceState||o}else m.onPopState=function(b,c){var e=!1,f=!1,g,h;return m.doubleCheckComplete(),g=m.getHash(),g?(h=m.extractState(g||d.location.href,!0),h?m.replaceState(h.data,h.title,h.url,!1):(m.Adapter.trigger(a,"anchorchange"),m.busy(!1)),m.expectedStateId=!1,!1):(e=m.Adapter.extractEventData("state",b,c)||!1,e?f=m.getStateById(e):m.expectedStateId?f=m.getStateById(m.expectedStateId):f=m.extractState(d.location.href),f||(f=m.createStateObject(null,null,d.location.href)),m.expectedStateId=!1,m.isLastSavedState(f)?(m.busy(!1),!1):(m.storeState(f),m.saveState(f),m.setTitle(f),m.Adapter.trigger(a,"statechange"),m.busy(!1),!0))},m.Adapter.bind(a,"popstate",m.onPopState),m.pushState=function(b,c,d,e){if(m.getHashByUrl(d)&&m.emulated.pushState)throw new Error("History.js does not support states with fragement-identifiers (hashes/anchors).");if(e!==!1&&m.busy())return m.pushQueue({scope:m,callback:m.pushState,args:arguments,queue:e}),!1;m.busy(!0);var f=m.createStateObject(b,c,d);return m.isLastSavedState(f)?m.busy(!1):(m.storeState(f),m.expectedStateId=f.id,n.pushState(f.id,f.title,f.url),m.Adapter.trigger(a,"popstate")),!0},m.replaceState=function(b,c,d,e){if(m.getHashByUrl(d)&&m.emulated.pushState)throw new Error("History.js does not support states with fragement-identifiers (hashes/anchors).");if(e!==!1&&m.busy())return m.pushQueue({scope:m,callback:m.replaceState,args:arguments,queue:e}),!1;m.busy(!0);var f=m.createStateObject(b,c,d);return m.isLastSavedState(f)?m.busy(!1):(m.storeState(f),m.expectedStateId=f.id,n.replaceState(f.id,f.title,f.url),m.Adapter.trigger(a,"popstate")),!0};if(f){try{m.store=k.parse(f.getItem("History.store"))||{}}catch(p){m.store={}}m.normalizeStore()}else m.store={},m.normalizeStore();m.Adapter.bind(a,"beforeunload",m.clearAllIntervals),m.Adapter.bind(a,"unload",m.clearAllIntervals),m.saveState(m.storeState(m.extractState(d.location.href,!0))),f&&(m.onUnload=function(){var a,b;try{a=k.parse(f.getItem("History.store"))||{}}catch(c){a={}}a.idToState=a.idToState||{},a.urlToId=a.urlToId||{},a.stateToId=a.stateToId||{};for(b in m.idToState){if(!m.idToState.hasOwnProperty(b))continue;a.idToState[b]=m.idToState[b]}for(b in m.urlToId){if(!m.urlToId.hasOwnProperty(b))continue;a.urlToId[b]=m.urlToId[b]}for(b in m.stateToId){if(!m.stateToId.hasOwnProperty(b))continue;a.stateToId[b]=m.stateToId[b]}m.store=a,m.normalizeStore(),f.setItem("History.store",k.stringify(a))},m.intervalList.push(i(m.onUnload,m.options.storeInterval)),m.Adapter.bind(a,"beforeunload",m.onUnload),m.Adapter.bind(a,"unload",m.onUnload));if(!m.emulated.pushState){m.bugs.safariPoll&&m.intervalList.push(i(m.safariStatePoll,m.options.safariPollInterval));if(e.vendor==="Apple Computer, Inc."||(e.appCodeName||"")==="Mozilla")m.Adapter.bind(a,"hashchange",function(){m.Adapter.trigger(a,"popstate")}),m.getHash()&&m.Adapter.onDomLoad(function(){m.Adapter.trigger(a,"hashchange")})}},m.init()}(window) \ No newline at end of file diff --git a/js/libraries/balupton-history/scripts/bundled/html5/mootools.history.js b/js/libraries/balupton-history/scripts/bundled/html5/mootools.history.js new file mode 100755 index 00000000..9213b325 --- /dev/null +++ b/js/libraries/balupton-history/scripts/bundled/html5/mootools.history.js @@ -0,0 +1 @@ +(function(a,b){"use strict";var c=a.History=a.History||{},d=a.MooTools,e=a.Element;if(typeof c.Adapter!="undefined")throw new Error("History.js Adapter has already been loaded...");Object.append(e.NativeEvents,{popstate:2,hashchange:2}),c.Adapter={bind:function(a,b,c){var d=typeof a=="string"?document.id(a):a;d.addEvent(b,c)},trigger:function(a,b,c){var d=typeof a=="string"?document.id(a):a;d.fireEvent(b,c)},extractEventData:function(a,c){var d=c&&c.event&&c.event[a]||c&&c[a]||b;return d},onDomLoad:function(b){a.addEvent("domready",b)}},typeof c.init!="undefined"&&c.init()})(window),function(a,b){"use strict";var c=a.console||b,d=a.document,e=a.navigator,f=a.sessionStorage||!1,g=a.setTimeout,h=a.clearTimeout,i=a.setInterval,j=a.clearInterval,k=a.JSON,l=a.alert,m=a.History=a.History||{},n=a.history;k.stringify=k.stringify||k.encode,k.parse=k.parse||k.decode;if(typeof m.init!="undefined")throw new Error("History.js Core has already been loaded...");m.init=function(){return typeof m.Adapter=="undefined"?!1:(typeof m.initCore!="undefined"&&m.initCore(),typeof m.initHtml4!="undefined"&&m.initHtml4(),!0)},m.initCore=function(){if(typeof m.initCore.initialized!="undefined")return!1;m.initCore.initialized=!0,m.options=m.options||{},m.options.hashChangeInterval=m.options.hashChangeInterval||100,m.options.safariPollInterval=m.options.safariPollInterval||500,m.options.doubleCheckInterval=m.options.doubleCheckInterval||500,m.options.storeInterval=m.options.storeInterval||1e3,m.options.busyDelay=m.options.busyDelay||250,m.options.debug=m.options.debug||!1,m.options.initialTitle=m.options.initialTitle||d.title,m.intervalList=[],m.clearAllIntervals=function(){var a,b=m.intervalList;if(typeof b!="undefined"&&b!==null){for(a=0;a")&&c[0]);return a>4?a:!1}();return a},m.isInternetExplorer=function(){var a=m.isInternetExplorer.cached=typeof m.isInternetExplorer.cached!="undefined"?m.isInternetExplorer.cached:Boolean(m.getInternetExplorerMajorVersion());return a},m.emulated={pushState:!Boolean(a.history&&a.history.pushState&&a.history.replaceState&&!/ Mobile\/([1-7][a-z]|(8([abcde]|f(1[0-8]))))/i.test(e.userAgent)&&!/AppleWebKit\/5([0-2]|3[0-2])/i.test(e.userAgent)),hashChange:Boolean(!("onhashchange"in a||"onhashchange"in d)||m.isInternetExplorer()&&m.getInternetExplorerMajorVersion()<8)},m.enabled=!m.emulated.pushState,m.bugs={setHash:Boolean(!m.emulated.pushState&&e.vendor==="Apple Computer, Inc."&&/AppleWebKit\/5([0-2]|3[0-3])/.test(e.userAgent)),safariPoll:Boolean(!m.emulated.pushState&&e.vendor==="Apple Computer, Inc."&&/AppleWebKit\/5([0-2]|3[0-3])/.test(e.userAgent)),ieDoubleCheck:Boolean(m.isInternetExplorer()&&m.getInternetExplorerMajorVersion()<8),hashEscape:Boolean(m.isInternetExplorer()&&m.getInternetExplorerMajorVersion()<7)},m.isEmptyObject=function(a){for(var b in a)return!1;return!0},m.cloneObject=function(a){var b,c;return a?(b=k.stringify(a),c=k.parse(b)):c={},c},m.getRootUrl=function(){var a=d.location.protocol+"//"+(d.location.hostname||d.location.host);if(d.location.port||!1)a+=":"+d.location.port;return a+="/",a},m.getBaseHref=function(){var a=d.getElementsByTagName("base"),b=null,c="";return a.length===1&&(b=a[0],c=b.href.replace(/[^\/]+$/,"")),c=c.replace(/\/+$/,""),c&&(c+="/"),c},m.getBaseUrl=function(){var a=m.getBaseHref()||m.getBasePageUrl()||m.getRootUrl();return a},m.getPageUrl=function(){var a=m.getState(!1,!1),b=(a||{}).url||d.location.href,c;return c=b.replace(/\/+$/,"").replace(/[^\/]+$/,function(a,b,c){return/\./.test(a)?a:a+"/"}),c},m.getBasePageUrl=function(){var a=d.location.href.replace(/[#\?].*/,"").replace(/[^\/]+$/,function(a,b,c){return/[^\/]$/.test(a)?"":a}).replace(/\/+$/,"")+"/";return a},m.getFullUrl=function(a,b){var c=a,d=a.substring(0,1);return b=typeof b=="undefined"?!0:b,/[a-z]+\:\/\//.test(a)||(d==="/"?c=m.getRootUrl()+a.replace(/^\/+/,""):d==="#"?c=m.getPageUrl().replace(/#.*/,"")+a:d==="?"?c=m.getPageUrl().replace(/[\?#].*/,"")+a:b?c=m.getBaseUrl()+a.replace(/^(\.\/)+/,""):c=m.getBasePageUrl()+a.replace(/^(\.\/)+/,"")),c.replace(/\#$/,"")},m.getShortUrl=function(a){var b=a,c=m.getBaseUrl(),d=m.getRootUrl();return m.emulated.pushState&&(b=b.replace(c,"")),b=b.replace(d,"/"),m.isTraditionalAnchor(b)&&(b="./"+b),b=b.replace(/^(\.\/)+/g,"./").replace(/\#$/,""),b},m.store={},m.idToState=m.idToState||{},m.stateToId=m.stateToId||{},m.urlToId=m.urlToId||{},m.storedStates=m.storedStates||[],m.savedStates=m.savedStates||[],m.normalizeStore=function(){m.store.idToState=m.store.idToState||{},m.store.urlToId=m.store.urlToId||{},m.store.stateToId=m.store.stateToId||{}},m.getState=function(a,b){typeof a=="undefined"&&(a=!0),typeof b=="undefined"&&(b=!0);var c=m.getLastSavedState();return!c&&b&&(c=m.createStateObject()),a&&(c=m.cloneObject(c),c.url=c.cleanUrl||c.url),c},m.getIdByState=function(a){var b=m.extractId(a.url),c;if(!b){c=m.getStateString(a);if(typeof m.stateToId[c]!="undefined")b=m.stateToId[c];else if(typeof m.store.stateToId[c]!="undefined")b=m.store.stateToId[c];else{for(;;){b=(new Date).getTime()+String(Math.random()).replace(/\D/g,"");if(typeof m.idToState[b]=="undefined"&&typeof m.store.idToState[b]=="undefined")break}m.stateToId[c]=b,m.idToState[b]=a}}return b},m.normalizeState=function(a){var b,c;if(!a||typeof a!="object")a={};if(typeof a.normalized!="undefined")return a;if(!a.data||typeof a.data!="object")a.data={};b={},b.normalized=!0,b.title=a.title||"",b.url=m.getFullUrl(m.unescapeString(a.url||d.location.href)),b.hash=m.getShortUrl(b.url),b.data=m.cloneObject(a.data),b.id=m.getIdByState(b),b.cleanUrl=b.url.replace(/\??\&_suid.*/,""),b.url=b.cleanUrl,c=!m.isEmptyObject(b.data);if(b.title||c)b.hash=m.getShortUrl(b.url).replace(/\??\&_suid.*/,""),/\?/.test(b.hash)||(b.hash+="?"),b.hash+="&_suid="+b.id;return b.hashedUrl=m.getFullUrl(b.hash),(m.emulated.pushState||m.bugs.safariPoll)&&m.hasUrlDuplicate(b)&&(b.url=b.hashedUrl),b},m.createStateObject=function(a,b,c){var d={data:a,title:b,url:c};return d=m.normalizeState(d),d},m.getStateById=function(a){a=String(a);var c=m.idToState[a]||m.store.idToState[a]||b;return c},m.getStateString=function(a){var b,c,d;return b=m.normalizeState(a),c={data:b.data,title:a.title,url:a.url},d=k.stringify(c),d},m.getStateId=function(a){var b,c;return b=m.normalizeState(a),c=b.id,c},m.getHashByState=function(a){var b,c;return b=m.normalizeState(a),c=b.hash,c},m.extractId=function(a){var b,c,d;return c=/(.*)\&_suid=([0-9]+)$/.exec(a),d=c?c[1]||a:a,b=c?String(c[2]||""):"",b||!1},m.isTraditionalAnchor=function(a){var b=!/[\/\?\.]/.test(a);return b},m.extractState=function(a,b){var c=null,d,e;return b=b||!1,d=m.extractId(a),d&&(c=m.getStateById(d)),c||(e=m.getFullUrl(a),d=m.getIdByUrl(e)||!1,d&&(c=m.getStateById(d)),!c&&b&&!m.isTraditionalAnchor(a)&&(c=m.createStateObject(null,null,e))),c},m.getIdByUrl=function(a){var c=m.urlToId[a]||m.store.urlToId[a]||b;return c},m.getLastSavedState=function(){return m.savedStates[m.savedStates.length-1]||b},m.getLastStoredState=function(){return m.storedStates[m.storedStates.length-1]||b},m.hasUrlDuplicate=function(a){var b=!1,c;return c=m.extractState(a.url),b=c&&c.id!==a.id,b},m.storeState=function(a){return m.urlToId[a.url]=a.id,m.storedStates.push(m.cloneObject(a)),a},m.isLastSavedState=function(a){var b=!1,c,d,e;return m.savedStates.length&&(c=a.id,d=m.getLastSavedState(),e=d.id,b=c===e),b},m.saveState=function(a){return m.isLastSavedState(a)?!1:(m.savedStates.push(m.cloneObject(a)),!0)},m.getStateByIndex=function(a){var b=null;return typeof a=="undefined"?b=m.savedStates[m.savedStates.length-1]:a<0?b=m.savedStates[m.savedStates.length+a]:b=m.savedStates[a],b},m.getHash=function(){var a=m.unescapeHash(d.location.hash);return a},m.unescapeString=function(b){var c=b,d;for(;;){d=a.unescape(c);if(d===c)break;c=d}return c},m.unescapeHash=function(a){var b=m.normalizeHash(a);return b=m.unescapeString(b),b},m.normalizeHash=function(a){var b=a.replace(/[^#]*#/,"").replace(/#.*/,"");return b},m.setHash=function(a,b){var c,e,f;return b!==!1&&m.busy()?(m.pushQueue({scope:m,callback:m.setHash,args:arguments,queue:b}),!1):(c=m.escapeHash(a),m.busy(!0),e=m.extractState(a,!0),e&&!m.emulated.pushState?m.pushState(e.data,e.title,e.url,!1):d.location.hash!==c&&(m.bugs.setHash?(f=m.getPageUrl(),m.pushState(null,null,f+"#"+c,!1)):d.location.hash=c),m)},m.escapeHash=function(b){var c=m.normalizeHash(b);return c=a.escape(c),m.bugs.hashEscape||(c=c.replace(/\%21/g,"!").replace(/\%26/g,"&").replace(/\%3D/g,"=").replace(/\%3F/g,"?")),c},m.getHashByUrl=function(a){var b=String(a).replace(/([^#]*)#?([^#]*)#?(.*)/,"$2");return b=m.unescapeHash(b),b},m.setTitle=function(a){var b=a.title,c;b||(c=m.getStateByIndex(0),c&&c.url===a.url&&(b=c.title||m.options.initialTitle));try{d.getElementsByTagName("title")[0].innerHTML=b.replace("<","<").replace(">",">").replace(" & "," & ")}catch(e){}return d.title=b,m},m.queues=[],m.busy=function(a){typeof a!="undefined"?m.busy.flag=a:typeof m.busy.flag=="undefined"&&(m.busy.flag=!1);if(!m.busy.flag){h(m.busy.timeout);var b=function(){var a,c,d;if(m.busy.flag)return;for(a=m.queues.length-1;a>=0;--a){c=m.queues[a];if(c.length===0)continue;d=c.shift(),m.fireQueueItem(d),m.busy.timeout=g(b,m.options.busyDelay)}};m.busy.timeout=g(b,m.options.busyDelay)}return m.busy.flag},m.busy.flag=!1,m.fireQueueItem=function(a){return a.callback.apply(a.scope||m,a.args||[])},m.pushQueue=function(a){return m.queues[a.queue||0]=m.queues[a.queue||0]||[],m.queues[a.queue||0].push(a),m},m.queue=function(a,b){return typeof a=="function"&&(a={callback:a}),typeof b!="undefined"&&(a.queue=b),m.busy()?m.pushQueue(a):m.fireQueueItem(a),m},m.clearQueue=function(){return m.busy.flag=!1,m.queues=[],m},m.stateChanged=!1,m.doubleChecker=!1,m.doubleCheckComplete=function(){return m.stateChanged=!0,m.doubleCheckClear(),m},m.doubleCheckClear=function(){return m.doubleChecker&&(h(m.doubleChecker),m.doubleChecker=!1),m},m.doubleCheck=function(a){return m.stateChanged=!1,m.doubleCheckClear(),m.bugs.ieDoubleCheck&&(m.doubleChecker=g(function(){return m.doubleCheckClear(),m.stateChanged||a(),!0},m.options.doubleCheckInterval)),m},m.safariStatePoll=function(){var b=m.extractState(d.location.href),c;if(!m.isLastSavedState(b))c=b;else return;return c||(c=m.createStateObject()),m.Adapter.trigger(a,"popstate"),m},m.back=function(a){return a!==!1&&m.busy()?(m.pushQueue({scope:m,callback:m.back,args:arguments,queue:a}),!1):(m.busy(!0),m.doubleCheck(function(){m.back(!1)}),n.go(-1),!0)},m.forward=function(a){return a!==!1&&m.busy()?(m.pushQueue({scope:m,callback:m.forward,args:arguments,queue:a}),!1):(m.busy(!0),m.doubleCheck(function(){m.forward(!1)}),n.go(1),!0)},m.go=function(a,b){var c;if(a>0)for(c=1;c<=a;++c)m.forward(b);else{if(!(a<0))throw new Error("History.go: History.go requires a positive or negative integer passed.");for(c=-1;c>=a;--c)m.back(b)}return m};if(m.emulated.pushState){var o=function(){};m.pushState=m.pushState||o,m.replaceState=m.replaceState||o}else m.onPopState=function(b,c){var e=!1,f=!1,g,h;return m.doubleCheckComplete(),g=m.getHash(),g?(h=m.extractState(g||d.location.href,!0),h?m.replaceState(h.data,h.title,h.url,!1):(m.Adapter.trigger(a,"anchorchange"),m.busy(!1)),m.expectedStateId=!1,!1):(e=m.Adapter.extractEventData("state",b,c)||!1,e?f=m.getStateById(e):m.expectedStateId?f=m.getStateById(m.expectedStateId):f=m.extractState(d.location.href),f||(f=m.createStateObject(null,null,d.location.href)),m.expectedStateId=!1,m.isLastSavedState(f)?(m.busy(!1),!1):(m.storeState(f),m.saveState(f),m.setTitle(f),m.Adapter.trigger(a,"statechange"),m.busy(!1),!0))},m.Adapter.bind(a,"popstate",m.onPopState),m.pushState=function(b,c,d,e){if(m.getHashByUrl(d)&&m.emulated.pushState)throw new Error("History.js does not support states with fragement-identifiers (hashes/anchors).");if(e!==!1&&m.busy())return m.pushQueue({scope:m,callback:m.pushState,args:arguments,queue:e}),!1;m.busy(!0);var f=m.createStateObject(b,c,d);return m.isLastSavedState(f)?m.busy(!1):(m.storeState(f),m.expectedStateId=f.id,n.pushState(f.id,f.title,f.url),m.Adapter.trigger(a,"popstate")),!0},m.replaceState=function(b,c,d,e){if(m.getHashByUrl(d)&&m.emulated.pushState)throw new Error("History.js does not support states with fragement-identifiers (hashes/anchors).");if(e!==!1&&m.busy())return m.pushQueue({scope:m,callback:m.replaceState,args:arguments,queue:e}),!1;m.busy(!0);var f=m.createStateObject(b,c,d);return m.isLastSavedState(f)?m.busy(!1):(m.storeState(f),m.expectedStateId=f.id,n.replaceState(f.id,f.title,f.url),m.Adapter.trigger(a,"popstate")),!0};if(f){try{m.store=k.parse(f.getItem("History.store"))||{}}catch(p){m.store={}}m.normalizeStore()}else m.store={},m.normalizeStore();m.Adapter.bind(a,"beforeunload",m.clearAllIntervals),m.Adapter.bind(a,"unload",m.clearAllIntervals),m.saveState(m.storeState(m.extractState(d.location.href,!0))),f&&(m.onUnload=function(){var a,b;try{a=k.parse(f.getItem("History.store"))||{}}catch(c){a={}}a.idToState=a.idToState||{},a.urlToId=a.urlToId||{},a.stateToId=a.stateToId||{};for(b in m.idToState){if(!m.idToState.hasOwnProperty(b))continue;a.idToState[b]=m.idToState[b]}for(b in m.urlToId){if(!m.urlToId.hasOwnProperty(b))continue;a.urlToId[b]=m.urlToId[b]}for(b in m.stateToId){if(!m.stateToId.hasOwnProperty(b))continue;a.stateToId[b]=m.stateToId[b]}m.store=a,m.normalizeStore(),f.setItem("History.store",k.stringify(a))},m.intervalList.push(i(m.onUnload,m.options.storeInterval)),m.Adapter.bind(a,"beforeunload",m.onUnload),m.Adapter.bind(a,"unload",m.onUnload));if(!m.emulated.pushState){m.bugs.safariPoll&&m.intervalList.push(i(m.safariStatePoll,m.options.safariPollInterval));if(e.vendor==="Apple Computer, Inc."||(e.appCodeName||"")==="Mozilla")m.Adapter.bind(a,"hashchange",function(){m.Adapter.trigger(a,"popstate")}),m.getHash()&&m.Adapter.onDomLoad(function(){m.Adapter.trigger(a,"hashchange")})}},m.init()}(window) \ No newline at end of file diff --git a/js/libraries/balupton-history/scripts/bundled/html5/native.history.js b/js/libraries/balupton-history/scripts/bundled/html5/native.history.js new file mode 100755 index 00000000..c2f0153d --- /dev/null +++ b/js/libraries/balupton-history/scripts/bundled/html5/native.history.js @@ -0,0 +1 @@ +(function(a,b){"use strict";var c=a.History=a.History||{};if(typeof c.Adapter!="undefined")throw new Error("History.js Adapter has already been loaded...");c.Adapter={handlers:{},_uid:1,uid:function(a){return a._uid||(a._uid=c.Adapter._uid++)},bind:function(a,b,d){var e=c.Adapter.uid(a);c.Adapter.handlers[e]=c.Adapter.handlers[e]||{},c.Adapter.handlers[e][b]=c.Adapter.handlers[e][b]||[],c.Adapter.handlers[e][b].push(d),a["on"+b]=function(a,b){return function(d){c.Adapter.trigger(a,b,d)}}(a,b)},trigger:function(a,b,d){d=d||{};var e=c.Adapter.uid(a),f,g;c.Adapter.handlers[e]=c.Adapter.handlers[e]||{},c.Adapter.handlers[e][b]=c.Adapter.handlers[e][b]||[];for(f=0,g=c.Adapter.handlers[e][b].length;f")&&c[0]);return a>4?a:!1}();return a},m.isInternetExplorer=function(){var a=m.isInternetExplorer.cached=typeof m.isInternetExplorer.cached!="undefined"?m.isInternetExplorer.cached:Boolean(m.getInternetExplorerMajorVersion());return a},m.emulated={pushState:!Boolean(a.history&&a.history.pushState&&a.history.replaceState&&!/ Mobile\/([1-7][a-z]|(8([abcde]|f(1[0-8]))))/i.test(e.userAgent)&&!/AppleWebKit\/5([0-2]|3[0-2])/i.test(e.userAgent)),hashChange:Boolean(!("onhashchange"in a||"onhashchange"in d)||m.isInternetExplorer()&&m.getInternetExplorerMajorVersion()<8)},m.enabled=!m.emulated.pushState,m.bugs={setHash:Boolean(!m.emulated.pushState&&e.vendor==="Apple Computer, Inc."&&/AppleWebKit\/5([0-2]|3[0-3])/.test(e.userAgent)),safariPoll:Boolean(!m.emulated.pushState&&e.vendor==="Apple Computer, Inc."&&/AppleWebKit\/5([0-2]|3[0-3])/.test(e.userAgent)),ieDoubleCheck:Boolean(m.isInternetExplorer()&&m.getInternetExplorerMajorVersion()<8),hashEscape:Boolean(m.isInternetExplorer()&&m.getInternetExplorerMajorVersion()<7)},m.isEmptyObject=function(a){for(var b in a)return!1;return!0},m.cloneObject=function(a){var b,c;return a?(b=k.stringify(a),c=k.parse(b)):c={},c},m.getRootUrl=function(){var a=d.location.protocol+"//"+(d.location.hostname||d.location.host);if(d.location.port||!1)a+=":"+d.location.port;return a+="/",a},m.getBaseHref=function(){var a=d.getElementsByTagName("base"),b=null,c="";return a.length===1&&(b=a[0],c=b.href.replace(/[^\/]+$/,"")),c=c.replace(/\/+$/,""),c&&(c+="/"),c},m.getBaseUrl=function(){var a=m.getBaseHref()||m.getBasePageUrl()||m.getRootUrl();return a},m.getPageUrl=function(){var a=m.getState(!1,!1),b=(a||{}).url||d.location.href,c;return c=b.replace(/\/+$/,"").replace(/[^\/]+$/,function(a,b,c){return/\./.test(a)?a:a+"/"}),c},m.getBasePageUrl=function(){var a=d.location.href.replace(/[#\?].*/,"").replace(/[^\/]+$/,function(a,b,c){return/[^\/]$/.test(a)?"":a}).replace(/\/+$/,"")+"/";return a},m.getFullUrl=function(a,b){var c=a,d=a.substring(0,1);return b=typeof b=="undefined"?!0:b,/[a-z]+\:\/\//.test(a)||(d==="/"?c=m.getRootUrl()+a.replace(/^\/+/,""):d==="#"?c=m.getPageUrl().replace(/#.*/,"")+a:d==="?"?c=m.getPageUrl().replace(/[\?#].*/,"")+a:b?c=m.getBaseUrl()+a.replace(/^(\.\/)+/,""):c=m.getBasePageUrl()+a.replace(/^(\.\/)+/,"")),c.replace(/\#$/,"")},m.getShortUrl=function(a){var b=a,c=m.getBaseUrl(),d=m.getRootUrl();return m.emulated.pushState&&(b=b.replace(c,"")),b=b.replace(d,"/"),m.isTraditionalAnchor(b)&&(b="./"+b),b=b.replace(/^(\.\/)+/g,"./").replace(/\#$/,""),b},m.store={},m.idToState=m.idToState||{},m.stateToId=m.stateToId||{},m.urlToId=m.urlToId||{},m.storedStates=m.storedStates||[],m.savedStates=m.savedStates||[],m.normalizeStore=function(){m.store.idToState=m.store.idToState||{},m.store.urlToId=m.store.urlToId||{},m.store.stateToId=m.store.stateToId||{}},m.getState=function(a,b){typeof a=="undefined"&&(a=!0),typeof b=="undefined"&&(b=!0);var c=m.getLastSavedState();return!c&&b&&(c=m.createStateObject()),a&&(c=m.cloneObject(c),c.url=c.cleanUrl||c.url),c},m.getIdByState=function(a){var b=m.extractId(a.url),c;if(!b){c=m.getStateString(a);if(typeof m.stateToId[c]!="undefined")b=m.stateToId[c];else if(typeof m.store.stateToId[c]!="undefined")b=m.store.stateToId[c];else{for(;;){b=(new Date).getTime()+String(Math.random()).replace(/\D/g,"");if(typeof m.idToState[b]=="undefined"&&typeof m.store.idToState[b]=="undefined")break}m.stateToId[c]=b,m.idToState[b]=a}}return b},m.normalizeState=function(a){var b,c;if(!a||typeof a!="object")a={};if(typeof a.normalized!="undefined")return a;if(!a.data||typeof a.data!="object")a.data={};b={},b.normalized=!0,b.title=a.title||"",b.url=m.getFullUrl(m.unescapeString(a.url||d.location.href)),b.hash=m.getShortUrl(b.url),b.data=m.cloneObject(a.data),b.id=m.getIdByState(b),b.cleanUrl=b.url.replace(/\??\&_suid.*/,""),b.url=b.cleanUrl,c=!m.isEmptyObject(b.data);if(b.title||c)b.hash=m.getShortUrl(b.url).replace(/\??\&_suid.*/,""),/\?/.test(b.hash)||(b.hash+="?"),b.hash+="&_suid="+b.id;return b.hashedUrl=m.getFullUrl(b.hash),(m.emulated.pushState||m.bugs.safariPoll)&&m.hasUrlDuplicate(b)&&(b.url=b.hashedUrl),b},m.createStateObject=function(a,b,c){var d={data:a,title:b,url:c};return d=m.normalizeState(d),d},m.getStateById=function(a){a=String(a);var c=m.idToState[a]||m.store.idToState[a]||b;return c},m.getStateString=function(a){var b,c,d;return b=m.normalizeState(a),c={data:b.data,title:a.title,url:a.url},d=k.stringify(c),d},m.getStateId=function(a){var b,c;return b=m.normalizeState(a),c=b.id,c},m.getHashByState=function(a){var b,c;return b=m.normalizeState(a),c=b.hash,c},m.extractId=function(a){var b,c,d;return c=/(.*)\&_suid=([0-9]+)$/.exec(a),d=c?c[1]||a:a,b=c?String(c[2]||""):"",b||!1},m.isTraditionalAnchor=function(a){var b=!/[\/\?\.]/.test(a);return b},m.extractState=function(a,b){var c=null,d,e;return b=b||!1,d=m.extractId(a),d&&(c=m.getStateById(d)),c||(e=m.getFullUrl(a),d=m.getIdByUrl(e)||!1,d&&(c=m.getStateById(d)),!c&&b&&!m.isTraditionalAnchor(a)&&(c=m.createStateObject(null,null,e))),c},m.getIdByUrl=function(a){var c=m.urlToId[a]||m.store.urlToId[a]||b;return c},m.getLastSavedState=function(){return m.savedStates[m.savedStates.length-1]||b},m.getLastStoredState=function(){return m.storedStates[m.storedStates.length-1]||b},m.hasUrlDuplicate=function(a){var b=!1,c;return c=m.extractState(a.url),b=c&&c.id!==a.id,b},m.storeState=function(a){return m.urlToId[a.url]=a.id,m.storedStates.push(m.cloneObject(a)),a},m.isLastSavedState=function(a){var b=!1,c,d,e;return m.savedStates.length&&(c=a.id,d=m.getLastSavedState(),e=d.id,b=c===e),b},m.saveState=function(a){return m.isLastSavedState(a)?!1:(m.savedStates.push(m.cloneObject(a)),!0)},m.getStateByIndex=function(a){var b=null;return typeof a=="undefined"?b=m.savedStates[m.savedStates.length-1]:a<0?b=m.savedStates[m.savedStates.length+a]:b=m.savedStates[a],b},m.getHash=function(){var a=m.unescapeHash(d.location.hash);return a},m.unescapeString=function(b){var c=b,d;for(;;){d=a.unescape(c);if(d===c)break;c=d}return c},m.unescapeHash=function(a){var b=m.normalizeHash(a);return b=m.unescapeString(b),b},m.normalizeHash=function(a){var b=a.replace(/[^#]*#/,"").replace(/#.*/,"");return b},m.setHash=function(a,b){var c,e,f;return b!==!1&&m.busy()?(m.pushQueue({scope:m,callback:m.setHash,args:arguments,queue:b}),!1):(c=m.escapeHash(a),m.busy(!0),e=m.extractState(a,!0),e&&!m.emulated.pushState?m.pushState(e.data,e.title,e.url,!1):d.location.hash!==c&&(m.bugs.setHash?(f=m.getPageUrl(),m.pushState(null,null,f+"#"+c,!1)):d.location.hash=c),m)},m.escapeHash=function(b){var c=m.normalizeHash(b);return c=a.escape(c),m.bugs.hashEscape||(c=c.replace(/\%21/g,"!").replace(/\%26/g,"&").replace(/\%3D/g,"=").replace(/\%3F/g,"?")),c},m.getHashByUrl=function(a){var b=String(a).replace(/([^#]*)#?([^#]*)#?(.*)/,"$2");return b=m.unescapeHash(b),b},m.setTitle=function(a){var b=a.title,c;b||(c=m.getStateByIndex(0),c&&c.url===a.url&&(b=c.title||m.options.initialTitle));try{d.getElementsByTagName("title")[0].innerHTML=b.replace("<","<").replace(">",">").replace(" & "," & ")}catch(e){}return d.title=b,m},m.queues=[],m.busy=function(a){typeof a!="undefined"?m.busy.flag=a:typeof m.busy.flag=="undefined"&&(m.busy.flag=!1);if(!m.busy.flag){h(m.busy.timeout);var b=function(){var a,c,d;if(m.busy.flag)return;for(a=m.queues.length-1;a>=0;--a){c=m.queues[a];if(c.length===0)continue;d=c.shift(),m.fireQueueItem(d),m.busy.timeout=g(b,m.options.busyDelay)}};m.busy.timeout=g(b,m.options.busyDelay)}return m.busy.flag},m.busy.flag=!1,m.fireQueueItem=function(a){return a.callback.apply(a.scope||m,a.args||[])},m.pushQueue=function(a){return m.queues[a.queue||0]=m.queues[a.queue||0]||[],m.queues[a.queue||0].push(a),m},m.queue=function(a,b){return typeof a=="function"&&(a={callback:a}),typeof b!="undefined"&&(a.queue=b),m.busy()?m.pushQueue(a):m.fireQueueItem(a),m},m.clearQueue=function(){return m.busy.flag=!1,m.queues=[],m},m.stateChanged=!1,m.doubleChecker=!1,m.doubleCheckComplete=function(){return m.stateChanged=!0,m.doubleCheckClear(),m},m.doubleCheckClear=function(){return m.doubleChecker&&(h(m.doubleChecker),m.doubleChecker=!1),m},m.doubleCheck=function(a){return m.stateChanged=!1,m.doubleCheckClear(),m.bugs.ieDoubleCheck&&(m.doubleChecker=g(function(){return m.doubleCheckClear(),m.stateChanged||a(),!0},m.options.doubleCheckInterval)),m},m.safariStatePoll=function(){var b=m.extractState(d.location.href),c;if(!m.isLastSavedState(b))c=b;else return;return c||(c=m.createStateObject()),m.Adapter.trigger(a,"popstate"),m},m.back=function(a){return a!==!1&&m.busy()?(m.pushQueue({scope:m,callback:m.back,args:arguments,queue:a}),!1):(m.busy(!0),m.doubleCheck(function(){m.back(!1)}),n.go(-1),!0)},m.forward=function(a){return a!==!1&&m.busy()?(m.pushQueue({scope:m,callback:m.forward,args:arguments,queue:a}),!1):(m.busy(!0),m.doubleCheck(function(){m.forward(!1)}),n.go(1),!0)},m.go=function(a,b){var c;if(a>0)for(c=1;c<=a;++c)m.forward(b);else{if(!(a<0))throw new Error("History.go: History.go requires a positive or negative integer passed.");for(c=-1;c>=a;--c)m.back(b)}return m};if(m.emulated.pushState){var o=function(){};m.pushState=m.pushState||o,m.replaceState=m.replaceState||o}else m.onPopState=function(b,c){var e=!1,f=!1,g,h;return m.doubleCheckComplete(),g=m.getHash(),g?(h=m.extractState(g||d.location.href,!0),h?m.replaceState(h.data,h.title,h.url,!1):(m.Adapter.trigger(a,"anchorchange"),m.busy(!1)),m.expectedStateId=!1,!1):(e=m.Adapter.extractEventData("state",b,c)||!1,e?f=m.getStateById(e):m.expectedStateId?f=m.getStateById(m.expectedStateId):f=m.extractState(d.location.href),f||(f=m.createStateObject(null,null,d.location.href)),m.expectedStateId=!1,m.isLastSavedState(f)?(m.busy(!1),!1):(m.storeState(f),m.saveState(f),m.setTitle(f),m.Adapter.trigger(a,"statechange"),m.busy(!1),!0))},m.Adapter.bind(a,"popstate",m.onPopState),m.pushState=function(b,c,d,e){if(m.getHashByUrl(d)&&m.emulated.pushState)throw new Error("History.js does not support states with fragement-identifiers (hashes/anchors).");if(e!==!1&&m.busy())return m.pushQueue({scope:m,callback:m.pushState,args:arguments,queue:e}),!1;m.busy(!0);var f=m.createStateObject(b,c,d);return m.isLastSavedState(f)?m.busy(!1):(m.storeState(f),m.expectedStateId=f.id,n.pushState(f.id,f.title,f.url),m.Adapter.trigger(a,"popstate")),!0},m.replaceState=function(b,c,d,e){if(m.getHashByUrl(d)&&m.emulated.pushState)throw new Error("History.js does not support states with fragement-identifiers (hashes/anchors).");if(e!==!1&&m.busy())return m.pushQueue({scope:m,callback:m.replaceState,args:arguments,queue:e}),!1;m.busy(!0);var f=m.createStateObject(b,c,d);return m.isLastSavedState(f)?m.busy(!1):(m.storeState(f),m.expectedStateId=f.id,n.replaceState(f.id,f.title,f.url),m.Adapter.trigger(a,"popstate")),!0};if(f){try{m.store=k.parse(f.getItem("History.store"))||{}}catch(p){m.store={}}m.normalizeStore()}else m.store={},m.normalizeStore();m.Adapter.bind(a,"beforeunload",m.clearAllIntervals),m.Adapter.bind(a,"unload",m.clearAllIntervals),m.saveState(m.storeState(m.extractState(d.location.href,!0))),f&&(m.onUnload=function(){var a,b;try{a=k.parse(f.getItem("History.store"))||{}}catch(c){a={}}a.idToState=a.idToState||{},a.urlToId=a.urlToId||{},a.stateToId=a.stateToId||{};for(b in m.idToState){if(!m.idToState.hasOwnProperty(b))continue;a.idToState[b]=m.idToState[b]}for(b in m.urlToId){if(!m.urlToId.hasOwnProperty(b))continue;a.urlToId[b]=m.urlToId[b]}for(b in m.stateToId){if(!m.stateToId.hasOwnProperty(b))continue;a.stateToId[b]=m.stateToId[b]}m.store=a,m.normalizeStore(),f.setItem("History.store",k.stringify(a))},m.intervalList.push(i(m.onUnload,m.options.storeInterval)),m.Adapter.bind(a,"beforeunload",m.onUnload),m.Adapter.bind(a,"unload",m.onUnload));if(!m.emulated.pushState){m.bugs.safariPoll&&m.intervalList.push(i(m.safariStatePoll,m.options.safariPollInterval));if(e.vendor==="Apple Computer, Inc."||(e.appCodeName||"")==="Mozilla")m.Adapter.bind(a,"hashchange",function(){m.Adapter.trigger(a,"popstate")}),m.getHash()&&m.Adapter.onDomLoad(function(){m.Adapter.trigger(a,"hashchange")})}},m.init()}(window) \ No newline at end of file diff --git a/js/libraries/balupton-history/scripts/bundled/html5/right.history.js b/js/libraries/balupton-history/scripts/bundled/html5/right.history.js new file mode 100755 index 00000000..ebec1e47 --- /dev/null +++ b/js/libraries/balupton-history/scripts/bundled/html5/right.history.js @@ -0,0 +1 @@ +(function(a,b){"use strict";var c=a.History=a.History||{},d=a.document,e=a.RightJS,f=e.$;if(typeof c.Adapter!="undefined")throw new Error("History.js Adapter has already been loaded...");c.Adapter={bind:function(a,b,c){f(a).on(b,c)},trigger:function(a,b,c){f(a).fire(b,c)},extractEventData:function(a,c){var d=c&&c._&&c._[a]||b;return d},onDomLoad:function(a){f(d).onReady(a)}},typeof c.init!="undefined"&&c.init()})(window),function(a,b){"use strict";var c=a.console||b,d=a.document,e=a.navigator,f=a.sessionStorage||!1,g=a.setTimeout,h=a.clearTimeout,i=a.setInterval,j=a.clearInterval,k=a.JSON,l=a.alert,m=a.History=a.History||{},n=a.history;k.stringify=k.stringify||k.encode,k.parse=k.parse||k.decode;if(typeof m.init!="undefined")throw new Error("History.js Core has already been loaded...");m.init=function(){return typeof m.Adapter=="undefined"?!1:(typeof m.initCore!="undefined"&&m.initCore(),typeof m.initHtml4!="undefined"&&m.initHtml4(),!0)},m.initCore=function(){if(typeof m.initCore.initialized!="undefined")return!1;m.initCore.initialized=!0,m.options=m.options||{},m.options.hashChangeInterval=m.options.hashChangeInterval||100,m.options.safariPollInterval=m.options.safariPollInterval||500,m.options.doubleCheckInterval=m.options.doubleCheckInterval||500,m.options.storeInterval=m.options.storeInterval||1e3,m.options.busyDelay=m.options.busyDelay||250,m.options.debug=m.options.debug||!1,m.options.initialTitle=m.options.initialTitle||d.title,m.intervalList=[],m.clearAllIntervals=function(){var a,b=m.intervalList;if(typeof b!="undefined"&&b!==null){for(a=0;a")&&c[0]);return a>4?a:!1}();return a},m.isInternetExplorer=function(){var a=m.isInternetExplorer.cached=typeof m.isInternetExplorer.cached!="undefined"?m.isInternetExplorer.cached:Boolean(m.getInternetExplorerMajorVersion());return a},m.emulated={pushState:!Boolean(a.history&&a.history.pushState&&a.history.replaceState&&!/ Mobile\/([1-7][a-z]|(8([abcde]|f(1[0-8]))))/i.test(e.userAgent)&&!/AppleWebKit\/5([0-2]|3[0-2])/i.test(e.userAgent)),hashChange:Boolean(!("onhashchange"in a||"onhashchange"in d)||m.isInternetExplorer()&&m.getInternetExplorerMajorVersion()<8)},m.enabled=!m.emulated.pushState,m.bugs={setHash:Boolean(!m.emulated.pushState&&e.vendor==="Apple Computer, Inc."&&/AppleWebKit\/5([0-2]|3[0-3])/.test(e.userAgent)),safariPoll:Boolean(!m.emulated.pushState&&e.vendor==="Apple Computer, Inc."&&/AppleWebKit\/5([0-2]|3[0-3])/.test(e.userAgent)),ieDoubleCheck:Boolean(m.isInternetExplorer()&&m.getInternetExplorerMajorVersion()<8),hashEscape:Boolean(m.isInternetExplorer()&&m.getInternetExplorerMajorVersion()<7)},m.isEmptyObject=function(a){for(var b in a)return!1;return!0},m.cloneObject=function(a){var b,c;return a?(b=k.stringify(a),c=k.parse(b)):c={},c},m.getRootUrl=function(){var a=d.location.protocol+"//"+(d.location.hostname||d.location.host);if(d.location.port||!1)a+=":"+d.location.port;return a+="/",a},m.getBaseHref=function(){var a=d.getElementsByTagName("base"),b=null,c="";return a.length===1&&(b=a[0],c=b.href.replace(/[^\/]+$/,"")),c=c.replace(/\/+$/,""),c&&(c+="/"),c},m.getBaseUrl=function(){var a=m.getBaseHref()||m.getBasePageUrl()||m.getRootUrl();return a},m.getPageUrl=function(){var a=m.getState(!1,!1),b=(a||{}).url||d.location.href,c;return c=b.replace(/\/+$/,"").replace(/[^\/]+$/,function(a,b,c){return/\./.test(a)?a:a+"/"}),c},m.getBasePageUrl=function(){var a=d.location.href.replace(/[#\?].*/,"").replace(/[^\/]+$/,function(a,b,c){return/[^\/]$/.test(a)?"":a}).replace(/\/+$/,"")+"/";return a},m.getFullUrl=function(a,b){var c=a,d=a.substring(0,1);return b=typeof b=="undefined"?!0:b,/[a-z]+\:\/\//.test(a)||(d==="/"?c=m.getRootUrl()+a.replace(/^\/+/,""):d==="#"?c=m.getPageUrl().replace(/#.*/,"")+a:d==="?"?c=m.getPageUrl().replace(/[\?#].*/,"")+a:b?c=m.getBaseUrl()+a.replace(/^(\.\/)+/,""):c=m.getBasePageUrl()+a.replace(/^(\.\/)+/,"")),c.replace(/\#$/,"")},m.getShortUrl=function(a){var b=a,c=m.getBaseUrl(),d=m.getRootUrl();return m.emulated.pushState&&(b=b.replace(c,"")),b=b.replace(d,"/"),m.isTraditionalAnchor(b)&&(b="./"+b),b=b.replace(/^(\.\/)+/g,"./").replace(/\#$/,""),b},m.store={},m.idToState=m.idToState||{},m.stateToId=m.stateToId||{},m.urlToId=m.urlToId||{},m.storedStates=m.storedStates||[],m.savedStates=m.savedStates||[],m.normalizeStore=function(){m.store.idToState=m.store.idToState||{},m.store.urlToId=m.store.urlToId||{},m.store.stateToId=m.store.stateToId||{}},m.getState=function(a,b){typeof a=="undefined"&&(a=!0),typeof b=="undefined"&&(b=!0);var c=m.getLastSavedState();return!c&&b&&(c=m.createStateObject()),a&&(c=m.cloneObject(c),c.url=c.cleanUrl||c.url),c},m.getIdByState=function(a){var b=m.extractId(a.url),c;if(!b){c=m.getStateString(a);if(typeof m.stateToId[c]!="undefined")b=m.stateToId[c];else if(typeof m.store.stateToId[c]!="undefined")b=m.store.stateToId[c];else{for(;;){b=(new Date).getTime()+String(Math.random()).replace(/\D/g,"");if(typeof m.idToState[b]=="undefined"&&typeof m.store.idToState[b]=="undefined")break}m.stateToId[c]=b,m.idToState[b]=a}}return b},m.normalizeState=function(a){var b,c;if(!a||typeof a!="object")a={};if(typeof a.normalized!="undefined")return a;if(!a.data||typeof a.data!="object")a.data={};b={},b.normalized=!0,b.title=a.title||"",b.url=m.getFullUrl(m.unescapeString(a.url||d.location.href)),b.hash=m.getShortUrl(b.url),b.data=m.cloneObject(a.data),b.id=m.getIdByState(b),b.cleanUrl=b.url.replace(/\??\&_suid.*/,""),b.url=b.cleanUrl,c=!m.isEmptyObject(b.data);if(b.title||c)b.hash=m.getShortUrl(b.url).replace(/\??\&_suid.*/,""),/\?/.test(b.hash)||(b.hash+="?"),b.hash+="&_suid="+b.id;return b.hashedUrl=m.getFullUrl(b.hash),(m.emulated.pushState||m.bugs.safariPoll)&&m.hasUrlDuplicate(b)&&(b.url=b.hashedUrl),b},m.createStateObject=function(a,b,c){var d={data:a,title:b,url:c};return d=m.normalizeState(d),d},m.getStateById=function(a){a=String(a);var c=m.idToState[a]||m.store.idToState[a]||b;return c},m.getStateString=function(a){var b,c,d;return b=m.normalizeState(a),c={data:b.data,title:a.title,url:a.url},d=k.stringify(c),d},m.getStateId=function(a){var b,c;return b=m.normalizeState(a),c=b.id,c},m.getHashByState=function(a){var b,c;return b=m.normalizeState(a),c=b.hash,c},m.extractId=function(a){var b,c,d;return c=/(.*)\&_suid=([0-9]+)$/.exec(a),d=c?c[1]||a:a,b=c?String(c[2]||""):"",b||!1},m.isTraditionalAnchor=function(a){var b=!/[\/\?\.]/.test(a);return b},m.extractState=function(a,b){var c=null,d,e;return b=b||!1,d=m.extractId(a),d&&(c=m.getStateById(d)),c||(e=m.getFullUrl(a),d=m.getIdByUrl(e)||!1,d&&(c=m.getStateById(d)),!c&&b&&!m.isTraditionalAnchor(a)&&(c=m.createStateObject(null,null,e))),c},m.getIdByUrl=function(a){var c=m.urlToId[a]||m.store.urlToId[a]||b;return c},m.getLastSavedState=function(){return m.savedStates[m.savedStates.length-1]||b},m.getLastStoredState=function(){return m.storedStates[m.storedStates.length-1]||b},m.hasUrlDuplicate=function(a){var b=!1,c;return c=m.extractState(a.url),b=c&&c.id!==a.id,b},m.storeState=function(a){return m.urlToId[a.url]=a.id,m.storedStates.push(m.cloneObject(a)),a},m.isLastSavedState=function(a){var b=!1,c,d,e;return m.savedStates.length&&(c=a.id,d=m.getLastSavedState(),e=d.id,b=c===e),b},m.saveState=function(a){return m.isLastSavedState(a)?!1:(m.savedStates.push(m.cloneObject(a)),!0)},m.getStateByIndex=function(a){var b=null;return typeof a=="undefined"?b=m.savedStates[m.savedStates.length-1]:a<0?b=m.savedStates[m.savedStates.length+a]:b=m.savedStates[a],b},m.getHash=function(){var a=m.unescapeHash(d.location.hash);return a},m.unescapeString=function(b){var c=b,d;for(;;){d=a.unescape(c);if(d===c)break;c=d}return c},m.unescapeHash=function(a){var b=m.normalizeHash(a);return b=m.unescapeString(b),b},m.normalizeHash=function(a){var b=a.replace(/[^#]*#/,"").replace(/#.*/,"");return b},m.setHash=function(a,b){var c,e,f;return b!==!1&&m.busy()?(m.pushQueue({scope:m,callback:m.setHash,args:arguments,queue:b}),!1):(c=m.escapeHash(a),m.busy(!0),e=m.extractState(a,!0),e&&!m.emulated.pushState?m.pushState(e.data,e.title,e.url,!1):d.location.hash!==c&&(m.bugs.setHash?(f=m.getPageUrl(),m.pushState(null,null,f+"#"+c,!1)):d.location.hash=c),m)},m.escapeHash=function(b){var c=m.normalizeHash(b);return c=a.escape(c),m.bugs.hashEscape||(c=c.replace(/\%21/g,"!").replace(/\%26/g,"&").replace(/\%3D/g,"=").replace(/\%3F/g,"?")),c},m.getHashByUrl=function(a){var b=String(a).replace(/([^#]*)#?([^#]*)#?(.*)/,"$2");return b=m.unescapeHash(b),b},m.setTitle=function(a){var b=a.title,c;b||(c=m.getStateByIndex(0),c&&c.url===a.url&&(b=c.title||m.options.initialTitle));try{d.getElementsByTagName("title")[0].innerHTML=b.replace("<","<").replace(">",">").replace(" & "," & ")}catch(e){}return d.title=b,m},m.queues=[],m.busy=function(a){typeof a!="undefined"?m.busy.flag=a:typeof m.busy.flag=="undefined"&&(m.busy.flag=!1);if(!m.busy.flag){h(m.busy.timeout);var b=function(){var a,c,d;if(m.busy.flag)return;for(a=m.queues.length-1;a>=0;--a){c=m.queues[a];if(c.length===0)continue;d=c.shift(),m.fireQueueItem(d),m.busy.timeout=g(b,m.options.busyDelay)}};m.busy.timeout=g(b,m.options.busyDelay)}return m.busy.flag},m.busy.flag=!1,m.fireQueueItem=function(a){return a.callback.apply(a.scope||m,a.args||[])},m.pushQueue=function(a){return m.queues[a.queue||0]=m.queues[a.queue||0]||[],m.queues[a.queue||0].push(a),m},m.queue=function(a,b){return typeof a=="function"&&(a={callback:a}),typeof b!="undefined"&&(a.queue=b),m.busy()?m.pushQueue(a):m.fireQueueItem(a),m},m.clearQueue=function(){return m.busy.flag=!1,m.queues=[],m},m.stateChanged=!1,m.doubleChecker=!1,m.doubleCheckComplete=function(){return m.stateChanged=!0,m.doubleCheckClear(),m},m.doubleCheckClear=function(){return m.doubleChecker&&(h(m.doubleChecker),m.doubleChecker=!1),m},m.doubleCheck=function(a){return m.stateChanged=!1,m.doubleCheckClear(),m.bugs.ieDoubleCheck&&(m.doubleChecker=g(function(){return m.doubleCheckClear(),m.stateChanged||a(),!0},m.options.doubleCheckInterval)),m},m.safariStatePoll=function(){var b=m.extractState(d.location.href),c;if(!m.isLastSavedState(b))c=b;else return;return c||(c=m.createStateObject()),m.Adapter.trigger(a,"popstate"),m},m.back=function(a){return a!==!1&&m.busy()?(m.pushQueue({scope:m,callback:m.back,args:arguments,queue:a}),!1):(m.busy(!0),m.doubleCheck(function(){m.back(!1)}),n.go(-1),!0)},m.forward=function(a){return a!==!1&&m.busy()?(m.pushQueue({scope:m,callback:m.forward,args:arguments,queue:a}),!1):(m.busy(!0),m.doubleCheck(function(){m.forward(!1)}),n.go(1),!0)},m.go=function(a,b){var c;if(a>0)for(c=1;c<=a;++c)m.forward(b);else{if(!(a<0))throw new Error("History.go: History.go requires a positive or negative integer passed.");for(c=-1;c>=a;--c)m.back(b)}return m};if(m.emulated.pushState){var o=function(){};m.pushState=m.pushState||o,m.replaceState=m.replaceState||o}else m.onPopState=function(b,c){var e=!1,f=!1,g,h;return m.doubleCheckComplete(),g=m.getHash(),g?(h=m.extractState(g||d.location.href,!0),h?m.replaceState(h.data,h.title,h.url,!1):(m.Adapter.trigger(a,"anchorchange"),m.busy(!1)),m.expectedStateId=!1,!1):(e=m.Adapter.extractEventData("state",b,c)||!1,e?f=m.getStateById(e):m.expectedStateId?f=m.getStateById(m.expectedStateId):f=m.extractState(d.location.href),f||(f=m.createStateObject(null,null,d.location.href)),m.expectedStateId=!1,m.isLastSavedState(f)?(m.busy(!1),!1):(m.storeState(f),m.saveState(f),m.setTitle(f),m.Adapter.trigger(a,"statechange"),m.busy(!1),!0))},m.Adapter.bind(a,"popstate",m.onPopState),m.pushState=function(b,c,d,e){if(m.getHashByUrl(d)&&m.emulated.pushState)throw new Error("History.js does not support states with fragement-identifiers (hashes/anchors).");if(e!==!1&&m.busy())return m.pushQueue({scope:m,callback:m.pushState,args:arguments,queue:e}),!1;m.busy(!0);var f=m.createStateObject(b,c,d);return m.isLastSavedState(f)?m.busy(!1):(m.storeState(f),m.expectedStateId=f.id,n.pushState(f.id,f.title,f.url),m.Adapter.trigger(a,"popstate")),!0},m.replaceState=function(b,c,d,e){if(m.getHashByUrl(d)&&m.emulated.pushState)throw new Error("History.js does not support states with fragement-identifiers (hashes/anchors).");if(e!==!1&&m.busy())return m.pushQueue({scope:m,callback:m.replaceState,args:arguments,queue:e}),!1;m.busy(!0);var f=m.createStateObject(b,c,d);return m.isLastSavedState(f)?m.busy(!1):(m.storeState(f),m.expectedStateId=f.id,n.replaceState(f.id,f.title,f.url),m.Adapter.trigger(a,"popstate")),!0};if(f){try{m.store=k.parse(f.getItem("History.store"))||{}}catch(p){m.store={}}m.normalizeStore()}else m.store={},m.normalizeStore();m.Adapter.bind(a,"beforeunload",m.clearAllIntervals),m.Adapter.bind(a,"unload",m.clearAllIntervals),m.saveState(m.storeState(m.extractState(d.location.href,!0))),f&&(m.onUnload=function(){var a,b;try{a=k.parse(f.getItem("History.store"))||{}}catch(c){a={}}a.idToState=a.idToState||{},a.urlToId=a.urlToId||{},a.stateToId=a.stateToId||{};for(b in m.idToState){if(!m.idToState.hasOwnProperty(b))continue;a.idToState[b]=m.idToState[b]}for(b in m.urlToId){if(!m.urlToId.hasOwnProperty(b))continue;a.urlToId[b]=m.urlToId[b]}for(b in m.stateToId){if(!m.stateToId.hasOwnProperty(b))continue;a.stateToId[b]=m.stateToId[b]}m.store=a,m.normalizeStore(),f.setItem("History.store",k.stringify(a))},m.intervalList.push(i(m.onUnload,m.options.storeInterval)),m.Adapter.bind(a,"beforeunload",m.onUnload),m.Adapter.bind(a,"unload",m.onUnload));if(!m.emulated.pushState){m.bugs.safariPoll&&m.intervalList.push(i(m.safariStatePoll,m.options.safariPollInterval));if(e.vendor==="Apple Computer, Inc."||(e.appCodeName||"")==="Mozilla")m.Adapter.bind(a,"hashchange",function(){m.Adapter.trigger(a,"popstate")}),m.getHash()&&m.Adapter.onDomLoad(function(){m.Adapter.trigger(a,"hashchange")})}},m.init()}(window) \ No newline at end of file diff --git a/js/libraries/balupton-history/scripts/bundled/html5/zepto.history.js b/js/libraries/balupton-history/scripts/bundled/html5/zepto.history.js new file mode 100755 index 00000000..d00681e4 --- /dev/null +++ b/js/libraries/balupton-history/scripts/bundled/html5/zepto.history.js @@ -0,0 +1 @@ +(function(a,b){"use strict";var c=a.History=a.History||{},d=a.Zepto;if(typeof c.Adapter!="undefined")throw new Error("History.js Adapter has already been loaded...");c.Adapter={bind:function(a,b,c){(new d(a)).bind(b,c)},trigger:function(a,b){(new d(a)).trigger(b)},extractEventData:function(a,c){var d=c&&c[a]||b;return d},onDomLoad:function(a){new d(a)}},typeof c.init!="undefined"&&c.init()})(window),function(a,b){"use strict";var c=a.console||b,d=a.document,e=a.navigator,f=a.sessionStorage||!1,g=a.setTimeout,h=a.clearTimeout,i=a.setInterval,j=a.clearInterval,k=a.JSON,l=a.alert,m=a.History=a.History||{},n=a.history;k.stringify=k.stringify||k.encode,k.parse=k.parse||k.decode;if(typeof m.init!="undefined")throw new Error("History.js Core has already been loaded...");m.init=function(){return typeof m.Adapter=="undefined"?!1:(typeof m.initCore!="undefined"&&m.initCore(),typeof m.initHtml4!="undefined"&&m.initHtml4(),!0)},m.initCore=function(){if(typeof m.initCore.initialized!="undefined")return!1;m.initCore.initialized=!0,m.options=m.options||{},m.options.hashChangeInterval=m.options.hashChangeInterval||100,m.options.safariPollInterval=m.options.safariPollInterval||500,m.options.doubleCheckInterval=m.options.doubleCheckInterval||500,m.options.storeInterval=m.options.storeInterval||1e3,m.options.busyDelay=m.options.busyDelay||250,m.options.debug=m.options.debug||!1,m.options.initialTitle=m.options.initialTitle||d.title,m.intervalList=[],m.clearAllIntervals=function(){var a,b=m.intervalList;if(typeof b!="undefined"&&b!==null){for(a=0;a")&&c[0]);return a>4?a:!1}();return a},m.isInternetExplorer=function(){var a=m.isInternetExplorer.cached=typeof m.isInternetExplorer.cached!="undefined"?m.isInternetExplorer.cached:Boolean(m.getInternetExplorerMajorVersion());return a},m.emulated={pushState:!Boolean(a.history&&a.history.pushState&&a.history.replaceState&&!/ Mobile\/([1-7][a-z]|(8([abcde]|f(1[0-8]))))/i.test(e.userAgent)&&!/AppleWebKit\/5([0-2]|3[0-2])/i.test(e.userAgent)),hashChange:Boolean(!("onhashchange"in a||"onhashchange"in d)||m.isInternetExplorer()&&m.getInternetExplorerMajorVersion()<8)},m.enabled=!m.emulated.pushState,m.bugs={setHash:Boolean(!m.emulated.pushState&&e.vendor==="Apple Computer, Inc."&&/AppleWebKit\/5([0-2]|3[0-3])/.test(e.userAgent)),safariPoll:Boolean(!m.emulated.pushState&&e.vendor==="Apple Computer, Inc."&&/AppleWebKit\/5([0-2]|3[0-3])/.test(e.userAgent)),ieDoubleCheck:Boolean(m.isInternetExplorer()&&m.getInternetExplorerMajorVersion()<8),hashEscape:Boolean(m.isInternetExplorer()&&m.getInternetExplorerMajorVersion()<7)},m.isEmptyObject=function(a){for(var b in a)return!1;return!0},m.cloneObject=function(a){var b,c;return a?(b=k.stringify(a),c=k.parse(b)):c={},c},m.getRootUrl=function(){var a=d.location.protocol+"//"+(d.location.hostname||d.location.host);if(d.location.port||!1)a+=":"+d.location.port;return a+="/",a},m.getBaseHref=function(){var a=d.getElementsByTagName("base"),b=null,c="";return a.length===1&&(b=a[0],c=b.href.replace(/[^\/]+$/,"")),c=c.replace(/\/+$/,""),c&&(c+="/"),c},m.getBaseUrl=function(){var a=m.getBaseHref()||m.getBasePageUrl()||m.getRootUrl();return a},m.getPageUrl=function(){var a=m.getState(!1,!1),b=(a||{}).url||d.location.href,c;return c=b.replace(/\/+$/,"").replace(/[^\/]+$/,function(a,b,c){return/\./.test(a)?a:a+"/"}),c},m.getBasePageUrl=function(){var a=d.location.href.replace(/[#\?].*/,"").replace(/[^\/]+$/,function(a,b,c){return/[^\/]$/.test(a)?"":a}).replace(/\/+$/,"")+"/";return a},m.getFullUrl=function(a,b){var c=a,d=a.substring(0,1);return b=typeof b=="undefined"?!0:b,/[a-z]+\:\/\//.test(a)||(d==="/"?c=m.getRootUrl()+a.replace(/^\/+/,""):d==="#"?c=m.getPageUrl().replace(/#.*/,"")+a:d==="?"?c=m.getPageUrl().replace(/[\?#].*/,"")+a:b?c=m.getBaseUrl()+a.replace(/^(\.\/)+/,""):c=m.getBasePageUrl()+a.replace(/^(\.\/)+/,"")),c.replace(/\#$/,"")},m.getShortUrl=function(a){var b=a,c=m.getBaseUrl(),d=m.getRootUrl();return m.emulated.pushState&&(b=b.replace(c,"")),b=b.replace(d,"/"),m.isTraditionalAnchor(b)&&(b="./"+b),b=b.replace(/^(\.\/)+/g,"./").replace(/\#$/,""),b},m.store={},m.idToState=m.idToState||{},m.stateToId=m.stateToId||{},m.urlToId=m.urlToId||{},m.storedStates=m.storedStates||[],m.savedStates=m.savedStates||[],m.normalizeStore=function(){m.store.idToState=m.store.idToState||{},m.store.urlToId=m.store.urlToId||{},m.store.stateToId=m.store.stateToId||{}},m.getState=function(a,b){typeof a=="undefined"&&(a=!0),typeof b=="undefined"&&(b=!0);var c=m.getLastSavedState();return!c&&b&&(c=m.createStateObject()),a&&(c=m.cloneObject(c),c.url=c.cleanUrl||c.url),c},m.getIdByState=function(a){var b=m.extractId(a.url),c;if(!b){c=m.getStateString(a);if(typeof m.stateToId[c]!="undefined")b=m.stateToId[c];else if(typeof m.store.stateToId[c]!="undefined")b=m.store.stateToId[c];else{for(;;){b=(new Date).getTime()+String(Math.random()).replace(/\D/g,"");if(typeof m.idToState[b]=="undefined"&&typeof m.store.idToState[b]=="undefined")break}m.stateToId[c]=b,m.idToState[b]=a}}return b},m.normalizeState=function(a){var b,c;if(!a||typeof a!="object")a={};if(typeof a.normalized!="undefined")return a;if(!a.data||typeof a.data!="object")a.data={};b={},b.normalized=!0,b.title=a.title||"",b.url=m.getFullUrl(m.unescapeString(a.url||d.location.href)),b.hash=m.getShortUrl(b.url),b.data=m.cloneObject(a.data),b.id=m.getIdByState(b),b.cleanUrl=b.url.replace(/\??\&_suid.*/,""),b.url=b.cleanUrl,c=!m.isEmptyObject(b.data);if(b.title||c)b.hash=m.getShortUrl(b.url).replace(/\??\&_suid.*/,""),/\?/.test(b.hash)||(b.hash+="?"),b.hash+="&_suid="+b.id;return b.hashedUrl=m.getFullUrl(b.hash),(m.emulated.pushState||m.bugs.safariPoll)&&m.hasUrlDuplicate(b)&&(b.url=b.hashedUrl),b},m.createStateObject=function(a,b,c){var d={data:a,title:b,url:c};return d=m.normalizeState(d),d},m.getStateById=function(a){a=String(a);var c=m.idToState[a]||m.store.idToState[a]||b;return c},m.getStateString=function(a){var b,c,d;return b=m.normalizeState(a),c={data:b.data,title:a.title,url:a.url},d=k.stringify(c),d},m.getStateId=function(a){var b,c;return b=m.normalizeState(a),c=b.id,c},m.getHashByState=function(a){var b,c;return b=m.normalizeState(a),c=b.hash,c},m.extractId=function(a){var b,c,d;return c=/(.*)\&_suid=([0-9]+)$/.exec(a),d=c?c[1]||a:a,b=c?String(c[2]||""):"",b||!1},m.isTraditionalAnchor=function(a){var b=!/[\/\?\.]/.test(a);return b},m.extractState=function(a,b){var c=null,d,e;return b=b||!1,d=m.extractId(a),d&&(c=m.getStateById(d)),c||(e=m.getFullUrl(a),d=m.getIdByUrl(e)||!1,d&&(c=m.getStateById(d)),!c&&b&&!m.isTraditionalAnchor(a)&&(c=m.createStateObject(null,null,e))),c},m.getIdByUrl=function(a){var c=m.urlToId[a]||m.store.urlToId[a]||b;return c},m.getLastSavedState=function(){return m.savedStates[m.savedStates.length-1]||b},m.getLastStoredState=function(){return m.storedStates[m.storedStates.length-1]||b},m.hasUrlDuplicate=function(a){var b=!1,c;return c=m.extractState(a.url),b=c&&c.id!==a.id,b},m.storeState=function(a){return m.urlToId[a.url]=a.id,m.storedStates.push(m.cloneObject(a)),a},m.isLastSavedState=function(a){var b=!1,c,d,e;return m.savedStates.length&&(c=a.id,d=m.getLastSavedState(),e=d.id,b=c===e),b},m.saveState=function(a){return m.isLastSavedState(a)?!1:(m.savedStates.push(m.cloneObject(a)),!0)},m.getStateByIndex=function(a){var b=null;return typeof a=="undefined"?b=m.savedStates[m.savedStates.length-1]:a<0?b=m.savedStates[m.savedStates.length+a]:b=m.savedStates[a],b},m.getHash=function(){var a=m.unescapeHash(d.location.hash);return a},m.unescapeString=function(b){var c=b,d;for(;;){d=a.unescape(c);if(d===c)break;c=d}return c},m.unescapeHash=function(a){var b=m.normalizeHash(a);return b=m.unescapeString(b),b},m.normalizeHash=function(a){var b=a.replace(/[^#]*#/,"").replace(/#.*/,"");return b},m.setHash=function(a,b){var c,e,f;return b!==!1&&m.busy()?(m.pushQueue({scope:m,callback:m.setHash,args:arguments,queue:b}),!1):(c=m.escapeHash(a),m.busy(!0),e=m.extractState(a,!0),e&&!m.emulated.pushState?m.pushState(e.data,e.title,e.url,!1):d.location.hash!==c&&(m.bugs.setHash?(f=m.getPageUrl(),m.pushState(null,null,f+"#"+c,!1)):d.location.hash=c),m)},m.escapeHash=function(b){var c=m.normalizeHash(b);return c=a.escape(c),m.bugs.hashEscape||(c=c.replace(/\%21/g,"!").replace(/\%26/g,"&").replace(/\%3D/g,"=").replace(/\%3F/g,"?")),c},m.getHashByUrl=function(a){var b=String(a).replace(/([^#]*)#?([^#]*)#?(.*)/,"$2");return b=m.unescapeHash(b),b},m.setTitle=function(a){var b=a.title,c;b||(c=m.getStateByIndex(0),c&&c.url===a.url&&(b=c.title||m.options.initialTitle));try{d.getElementsByTagName("title")[0].innerHTML=b.replace("<","<").replace(">",">").replace(" & "," & ")}catch(e){}return d.title=b,m},m.queues=[],m.busy=function(a){typeof a!="undefined"?m.busy.flag=a:typeof m.busy.flag=="undefined"&&(m.busy.flag=!1);if(!m.busy.flag){h(m.busy.timeout);var b=function(){var a,c,d;if(m.busy.flag)return;for(a=m.queues.length-1;a>=0;--a){c=m.queues[a];if(c.length===0)continue;d=c.shift(),m.fireQueueItem(d),m.busy.timeout=g(b,m.options.busyDelay)}};m.busy.timeout=g(b,m.options.busyDelay)}return m.busy.flag},m.busy.flag=!1,m.fireQueueItem=function(a){return a.callback.apply(a.scope||m,a.args||[])},m.pushQueue=function(a){return m.queues[a.queue||0]=m.queues[a.queue||0]||[],m.queues[a.queue||0].push(a),m},m.queue=function(a,b){return typeof a=="function"&&(a={callback:a}),typeof b!="undefined"&&(a.queue=b),m.busy()?m.pushQueue(a):m.fireQueueItem(a),m},m.clearQueue=function(){return m.busy.flag=!1,m.queues=[],m},m.stateChanged=!1,m.doubleChecker=!1,m.doubleCheckComplete=function(){return m.stateChanged=!0,m.doubleCheckClear(),m},m.doubleCheckClear=function(){return m.doubleChecker&&(h(m.doubleChecker),m.doubleChecker=!1),m},m.doubleCheck=function(a){return m.stateChanged=!1,m.doubleCheckClear(),m.bugs.ieDoubleCheck&&(m.doubleChecker=g(function(){return m.doubleCheckClear(),m.stateChanged||a(),!0},m.options.doubleCheckInterval)),m},m.safariStatePoll=function(){var b=m.extractState(d.location.href),c;if(!m.isLastSavedState(b))c=b;else return;return c||(c=m.createStateObject()),m.Adapter.trigger(a,"popstate"),m},m.back=function(a){return a!==!1&&m.busy()?(m.pushQueue({scope:m,callback:m.back,args:arguments,queue:a}),!1):(m.busy(!0),m.doubleCheck(function(){m.back(!1)}),n.go(-1),!0)},m.forward=function(a){return a!==!1&&m.busy()?(m.pushQueue({scope:m,callback:m.forward,args:arguments,queue:a}),!1):(m.busy(!0),m.doubleCheck(function(){m.forward(!1)}),n.go(1),!0)},m.go=function(a,b){var c;if(a>0)for(c=1;c<=a;++c)m.forward(b);else{if(!(a<0))throw new Error("History.go: History.go requires a positive or negative integer passed.");for(c=-1;c>=a;--c)m.back(b)}return m};if(m.emulated.pushState){var o=function(){};m.pushState=m.pushState||o,m.replaceState=m.replaceState||o}else m.onPopState=function(b,c){var e=!1,f=!1,g,h;return m.doubleCheckComplete(),g=m.getHash(),g?(h=m.extractState(g||d.location.href,!0),h?m.replaceState(h.data,h.title,h.url,!1):(m.Adapter.trigger(a,"anchorchange"),m.busy(!1)),m.expectedStateId=!1,!1):(e=m.Adapter.extractEventData("state",b,c)||!1,e?f=m.getStateById(e):m.expectedStateId?f=m.getStateById(m.expectedStateId):f=m.extractState(d.location.href),f||(f=m.createStateObject(null,null,d.location.href)),m.expectedStateId=!1,m.isLastSavedState(f)?(m.busy(!1),!1):(m.storeState(f),m.saveState(f),m.setTitle(f),m.Adapter.trigger(a,"statechange"),m.busy(!1),!0))},m.Adapter.bind(a,"popstate",m.onPopState),m.pushState=function(b,c,d,e){if(m.getHashByUrl(d)&&m.emulated.pushState)throw new Error("History.js does not support states with fragement-identifiers (hashes/anchors).");if(e!==!1&&m.busy())return m.pushQueue({scope:m,callback:m.pushState,args:arguments,queue:e}),!1;m.busy(!0);var f=m.createStateObject(b,c,d);return m.isLastSavedState(f)?m.busy(!1):(m.storeState(f),m.expectedStateId=f.id,n.pushState(f.id,f.title,f.url),m.Adapter.trigger(a,"popstate")),!0},m.replaceState=function(b,c,d,e){if(m.getHashByUrl(d)&&m.emulated.pushState)throw new Error("History.js does not support states with fragement-identifiers (hashes/anchors).");if(e!==!1&&m.busy())return m.pushQueue({scope:m,callback:m.replaceState,args:arguments,queue:e}),!1;m.busy(!0);var f=m.createStateObject(b,c,d);return m.isLastSavedState(f)?m.busy(!1):(m.storeState(f),m.expectedStateId=f.id,n.replaceState(f.id,f.title,f.url),m.Adapter.trigger(a,"popstate")),!0};if(f){try{m.store=k.parse(f.getItem("History.store"))||{}}catch(p){m.store={}}m.normalizeStore()}else m.store={},m.normalizeStore();m.Adapter.bind(a,"beforeunload",m.clearAllIntervals),m.Adapter.bind(a,"unload",m.clearAllIntervals),m.saveState(m.storeState(m.extractState(d.location.href,!0))),f&&(m.onUnload=function(){var a,b;try{a=k.parse(f.getItem("History.store"))||{}}catch(c){a={}}a.idToState=a.idToState||{},a.urlToId=a.urlToId||{},a.stateToId=a.stateToId||{};for(b in m.idToState){if(!m.idToState.hasOwnProperty(b))continue;a.idToState[b]=m.idToState[b]}for(b in m.urlToId){if(!m.urlToId.hasOwnProperty(b))continue;a.urlToId[b]=m.urlToId[b]}for(b in m.stateToId){if(!m.stateToId.hasOwnProperty(b))continue;a.stateToId[b]=m.stateToId[b]}m.store=a,m.normalizeStore(),f.setItem("History.store",k.stringify(a))},m.intervalList.push(i(m.onUnload,m.options.storeInterval)),m.Adapter.bind(a,"beforeunload",m.onUnload),m.Adapter.bind(a,"unload",m.onUnload));if(!m.emulated.pushState){m.bugs.safariPoll&&m.intervalList.push(i(m.safariStatePoll,m.options.safariPollInterval));if(e.vendor==="Apple Computer, Inc."||(e.appCodeName||"")==="Mozilla")m.Adapter.bind(a,"hashchange",function(){m.Adapter.trigger(a,"popstate")}),m.getHash()&&m.Adapter.onDomLoad(function(){m.Adapter.trigger(a,"hashchange")})}},m.init()}(window) \ No newline at end of file diff --git a/js/libraries/balupton-history/scripts/compressed/history.adapter.jquery.js b/js/libraries/balupton-history/scripts/compressed/history.adapter.jquery.js new file mode 100755 index 00000000..4eb82aea --- /dev/null +++ b/js/libraries/balupton-history/scripts/compressed/history.adapter.jquery.js @@ -0,0 +1 @@ +(function(a,b){"use strict";var c=a.History=a.History||{},d=a.jQuery;if(typeof c.Adapter!="undefined")throw new Error("History.js Adapter has already been loaded...");c.Adapter={bind:function(a,b,c){d(a).bind(b,c)},trigger:function(a,b,c){d(a).trigger(b,c)},extractEventData:function(a,c,d){var e=c&&c.originalEvent&&c.originalEvent[a]||d&&d[a]||b;return e},onDomLoad:function(a){d(a)}},typeof c.init!="undefined"&&c.init()})(window) \ No newline at end of file diff --git a/js/libraries/balupton-history/scripts/compressed/history.adapter.mootools.js b/js/libraries/balupton-history/scripts/compressed/history.adapter.mootools.js new file mode 100755 index 00000000..806937d0 --- /dev/null +++ b/js/libraries/balupton-history/scripts/compressed/history.adapter.mootools.js @@ -0,0 +1 @@ +(function(a,b){"use strict";var c=a.History=a.History||{},d=a.MooTools,e=a.Element;if(typeof c.Adapter!="undefined")throw new Error("History.js Adapter has already been loaded...");Object.append(e.NativeEvents,{popstate:2,hashchange:2}),c.Adapter={bind:function(a,b,c){var d=typeof a=="string"?document.id(a):a;d.addEvent(b,c)},trigger:function(a,b,c){var d=typeof a=="string"?document.id(a):a;d.fireEvent(b,c)},extractEventData:function(a,c){var d=c&&c.event&&c.event[a]||c&&c[a]||b;return d},onDomLoad:function(b){a.addEvent("domready",b)}},typeof c.init!="undefined"&&c.init()})(window) \ No newline at end of file diff --git a/js/libraries/balupton-history/scripts/compressed/history.adapter.native.js b/js/libraries/balupton-history/scripts/compressed/history.adapter.native.js new file mode 100755 index 00000000..67ba7af2 --- /dev/null +++ b/js/libraries/balupton-history/scripts/compressed/history.adapter.native.js @@ -0,0 +1 @@ +(function(a,b){"use strict";var c=a.History=a.History||{};if(typeof c.Adapter!="undefined")throw new Error("History.js Adapter has already been loaded...");c.Adapter={handlers:{},_uid:1,uid:function(a){return a._uid||(a._uid=c.Adapter._uid++)},bind:function(a,b,d){var e=c.Adapter.uid(a);c.Adapter.handlers[e]=c.Adapter.handlers[e]||{},c.Adapter.handlers[e][b]=c.Adapter.handlers[e][b]||[],c.Adapter.handlers[e][b].push(d),a["on"+b]=function(a,b){return function(d){c.Adapter.trigger(a,b,d)}}(a,b)},trigger:function(a,b,d){d=d||{};var e=c.Adapter.uid(a),f,g;c.Adapter.handlers[e]=c.Adapter.handlers[e]||{},c.Adapter.handlers[e][b]=c.Adapter.handlers[e][b]||[];for(f=0,g=c.Adapter.handlers[e][b].length;f")&&c[0]);return a>4?a:!1}();return a},m.isInternetExplorer=function(){var a=m.isInternetExplorer.cached=typeof m.isInternetExplorer.cached!="undefined"?m.isInternetExplorer.cached:Boolean(m.getInternetExplorerMajorVersion());return a},m.emulated={pushState:!Boolean(a.history&&a.history.pushState&&a.history.replaceState&&!/ Mobile\/([1-7][a-z]|(8([abcde]|f(1[0-8]))))/i.test(e.userAgent)&&!/AppleWebKit\/5([0-2]|3[0-2])/i.test(e.userAgent)),hashChange:Boolean(!("onhashchange"in a||"onhashchange"in d)||m.isInternetExplorer()&&m.getInternetExplorerMajorVersion()<8)},m.enabled=!m.emulated.pushState,m.bugs={setHash:Boolean(!m.emulated.pushState&&e.vendor==="Apple Computer, Inc."&&/AppleWebKit\/5([0-2]|3[0-3])/.test(e.userAgent)),safariPoll:Boolean(!m.emulated.pushState&&e.vendor==="Apple Computer, Inc."&&/AppleWebKit\/5([0-2]|3[0-3])/.test(e.userAgent)),ieDoubleCheck:Boolean(m.isInternetExplorer()&&m.getInternetExplorerMajorVersion()<8),hashEscape:Boolean(m.isInternetExplorer()&&m.getInternetExplorerMajorVersion()<7)},m.isEmptyObject=function(a){for(var b in a)return!1;return!0},m.cloneObject=function(a){var b,c;return a?(b=k.stringify(a),c=k.parse(b)):c={},c},m.getRootUrl=function(){var a=d.location.protocol+"//"+(d.location.hostname||d.location.host);if(d.location.port||!1)a+=":"+d.location.port;return a+="/",a},m.getBaseHref=function(){var a=d.getElementsByTagName("base"),b=null,c="";return a.length===1&&(b=a[0],c=b.href.replace(/[^\/]+$/,"")),c=c.replace(/\/+$/,""),c&&(c+="/"),c},m.getBaseUrl=function(){var a=m.getBaseHref()||m.getBasePageUrl()||m.getRootUrl();return a},m.getPageUrl=function(){var a=m.getState(!1,!1),b=(a||{}).url||d.location.href,c;return c=b.replace(/\/+$/,"").replace(/[^\/]+$/,function(a,b,c){return/\./.test(a)?a:a+"/"}),c},m.getBasePageUrl=function(){var a=d.location.href.replace(/[#\?].*/,"").replace(/[^\/]+$/,function(a,b,c){return/[^\/]$/.test(a)?"":a}).replace(/\/+$/,"")+"/";return a},m.getFullUrl=function(a,b){var c=a,d=a.substring(0,1);return b=typeof b=="undefined"?!0:b,/[a-z]+\:\/\//.test(a)||(d==="/"?c=m.getRootUrl()+a.replace(/^\/+/,""):d==="#"?c=m.getPageUrl().replace(/#.*/,"")+a:d==="?"?c=m.getPageUrl().replace(/[\?#].*/,"")+a:b?c=m.getBaseUrl()+a.replace(/^(\.\/)+/,""):c=m.getBasePageUrl()+a.replace(/^(\.\/)+/,"")),c.replace(/\#$/,"")},m.getShortUrl=function(a){var b=a,c=m.getBaseUrl(),d=m.getRootUrl();return m.emulated.pushState&&(b=b.replace(c,"")),b=b.replace(d,"/"),m.isTraditionalAnchor(b)&&(b="./"+b),b=b.replace(/^(\.\/)+/g,"./").replace(/\#$/,""),b},m.store={},m.idToState=m.idToState||{},m.stateToId=m.stateToId||{},m.urlToId=m.urlToId||{},m.storedStates=m.storedStates||[],m.savedStates=m.savedStates||[],m.normalizeStore=function(){m.store.idToState=m.store.idToState||{},m.store.urlToId=m.store.urlToId||{},m.store.stateToId=m.store.stateToId||{}},m.getState=function(a,b){typeof a=="undefined"&&(a=!0),typeof b=="undefined"&&(b=!0);var c=m.getLastSavedState();return!c&&b&&(c=m.createStateObject()),a&&(c=m.cloneObject(c),c.url=c.cleanUrl||c.url),c},m.getIdByState=function(a){var b=m.extractId(a.url),c;if(!b){c=m.getStateString(a);if(typeof m.stateToId[c]!="undefined")b=m.stateToId[c];else if(typeof m.store.stateToId[c]!="undefined")b=m.store.stateToId[c];else{for(;;){b=(new Date).getTime()+String(Math.random()).replace(/\D/g,"");if(typeof m.idToState[b]=="undefined"&&typeof m.store.idToState[b]=="undefined")break}m.stateToId[c]=b,m.idToState[b]=a}}return b},m.normalizeState=function(a){var b,c;if(!a||typeof a!="object")a={};if(typeof a.normalized!="undefined")return a;if(!a.data||typeof a.data!="object")a.data={};b={},b.normalized=!0,b.title=a.title||"",b.url=m.getFullUrl(m.unescapeString(a.url||d.location.href)),b.hash=m.getShortUrl(b.url),b.data=m.cloneObject(a.data),b.id=m.getIdByState(b),b.cleanUrl=b.url.replace(/\??\&_suid.*/,""),b.url=b.cleanUrl,c=!m.isEmptyObject(b.data);if(b.title||c)b.hash=m.getShortUrl(b.url).replace(/\??\&_suid.*/,""),/\?/.test(b.hash)||(b.hash+="?"),b.hash+="&_suid="+b.id;return b.hashedUrl=m.getFullUrl(b.hash),(m.emulated.pushState||m.bugs.safariPoll)&&m.hasUrlDuplicate(b)&&(b.url=b.hashedUrl),b},m.createStateObject=function(a,b,c){var d={data:a,title:b,url:c};return d=m.normalizeState(d),d},m.getStateById=function(a){a=String(a);var c=m.idToState[a]||m.store.idToState[a]||b;return c},m.getStateString=function(a){var b,c,d;return b=m.normalizeState(a),c={data:b.data,title:a.title,url:a.url},d=k.stringify(c),d},m.getStateId=function(a){var b,c;return b=m.normalizeState(a),c=b.id,c},m.getHashByState=function(a){var b,c;return b=m.normalizeState(a),c=b.hash,c},m.extractId=function(a){var b,c,d;return c=/(.*)\&_suid=([0-9]+)$/.exec(a),d=c?c[1]||a:a,b=c?String(c[2]||""):"",b||!1},m.isTraditionalAnchor=function(a){var b=!/[\/\?\.]/.test(a);return b},m.extractState=function(a,b){var c=null,d,e;return b=b||!1,d=m.extractId(a),d&&(c=m.getStateById(d)),c||(e=m.getFullUrl(a),d=m.getIdByUrl(e)||!1,d&&(c=m.getStateById(d)),!c&&b&&!m.isTraditionalAnchor(a)&&(c=m.createStateObject(null,null,e))),c},m.getIdByUrl=function(a){var c=m.urlToId[a]||m.store.urlToId[a]||b;return c},m.getLastSavedState=function(){return m.savedStates[m.savedStates.length-1]||b},m.getLastStoredState=function(){return m.storedStates[m.storedStates.length-1]||b},m.hasUrlDuplicate=function(a){var b=!1,c;return c=m.extractState(a.url),b=c&&c.id!==a.id,b},m.storeState=function(a){return m.urlToId[a.url]=a.id,m.storedStates.push(m.cloneObject(a)),a},m.isLastSavedState=function(a){var b=!1,c,d,e;return m.savedStates.length&&(c=a.id,d=m.getLastSavedState(),e=d.id,b=c===e),b},m.saveState=function(a){return m.isLastSavedState(a)?!1:(m.savedStates.push(m.cloneObject(a)),!0)},m.getStateByIndex=function(a){var b=null;return typeof a=="undefined"?b=m.savedStates[m.savedStates.length-1]:a<0?b=m.savedStates[m.savedStates.length+a]:b=m.savedStates[a],b},m.getHash=function(){var a=m.unescapeHash(d.location.hash);return a},m.unescapeString=function(b){var c=b,d;for(;;){d=a.unescape(c);if(d===c)break;c=d}return c},m.unescapeHash=function(a){var b=m.normalizeHash(a);return b=m.unescapeString(b),b},m.normalizeHash=function(a){var b=a.replace(/[^#]*#/,"").replace(/#.*/,"");return b},m.setHash=function(a,b){var c,e,f;return b!==!1&&m.busy()?(m.pushQueue({scope:m,callback:m.setHash,args:arguments,queue:b}),!1):(c=m.escapeHash(a),m.busy(!0),e=m.extractState(a,!0),e&&!m.emulated.pushState?m.pushState(e.data,e.title,e.url,!1):d.location.hash!==c&&(m.bugs.setHash?(f=m.getPageUrl(),m.pushState(null,null,f+"#"+c,!1)):d.location.hash=c),m)},m.escapeHash=function(b){var c=m.normalizeHash(b);return c=a.escape(c),m.bugs.hashEscape||(c=c.replace(/\%21/g,"!").replace(/\%26/g,"&").replace(/\%3D/g,"=").replace(/\%3F/g,"?")),c},m.getHashByUrl=function(a){var b=String(a).replace(/([^#]*)#?([^#]*)#?(.*)/,"$2");return b=m.unescapeHash(b),b},m.setTitle=function(a){var b=a.title,c;b||(c=m.getStateByIndex(0),c&&c.url===a.url&&(b=c.title||m.options.initialTitle));try{d.getElementsByTagName("title")[0].innerHTML=b.replace("<","<").replace(">",">").replace(" & "," & ")}catch(e){}return d.title=b,m},m.queues=[],m.busy=function(a){typeof a!="undefined"?m.busy.flag=a:typeof m.busy.flag=="undefined"&&(m.busy.flag=!1);if(!m.busy.flag){h(m.busy.timeout);var b=function(){var a,c,d;if(m.busy.flag)return;for(a=m.queues.length-1;a>=0;--a){c=m.queues[a];if(c.length===0)continue;d=c.shift(),m.fireQueueItem(d),m.busy.timeout=g(b,m.options.busyDelay)}};m.busy.timeout=g(b,m.options.busyDelay)}return m.busy.flag},m.busy.flag=!1,m.fireQueueItem=function(a){return a.callback.apply(a.scope||m,a.args||[])},m.pushQueue=function(a){return m.queues[a.queue||0]=m.queues[a.queue||0]||[],m.queues[a.queue||0].push(a),m},m.queue=function(a,b){return typeof a=="function"&&(a={callback:a}),typeof b!="undefined"&&(a.queue=b),m.busy()?m.pushQueue(a):m.fireQueueItem(a),m},m.clearQueue=function(){return m.busy.flag=!1,m.queues=[],m},m.stateChanged=!1,m.doubleChecker=!1,m.doubleCheckComplete=function(){return m.stateChanged=!0,m.doubleCheckClear(),m},m.doubleCheckClear=function(){return m.doubleChecker&&(h(m.doubleChecker),m.doubleChecker=!1),m},m.doubleCheck=function(a){return m.stateChanged=!1,m.doubleCheckClear(),m.bugs.ieDoubleCheck&&(m.doubleChecker=g(function(){return m.doubleCheckClear(),m.stateChanged||a(),!0},m.options.doubleCheckInterval)),m},m.safariStatePoll=function(){var b=m.extractState(d.location.href),c;if(!m.isLastSavedState(b))c=b;else return;return c||(c=m.createStateObject()),m.Adapter.trigger(a,"popstate"),m},m.back=function(a){return a!==!1&&m.busy()?(m.pushQueue({scope:m,callback:m.back,args:arguments,queue:a}),!1):(m.busy(!0),m.doubleCheck(function(){m.back(!1)}),n.go(-1),!0)},m.forward=function(a){return a!==!1&&m.busy()?(m.pushQueue({scope:m,callback:m.forward,args:arguments,queue:a}),!1):(m.busy(!0),m.doubleCheck(function(){m.forward(!1)}),n.go(1),!0)},m.go=function(a,b){var c;if(a>0)for(c=1;c<=a;++c)m.forward(b);else{if(!(a<0))throw new Error("History.go: History.go requires a positive or negative integer passed.");for(c=-1;c>=a;--c)m.back(b)}return m};if(m.emulated.pushState){var o=function(){};m.pushState=m.pushState||o,m.replaceState=m.replaceState||o}else m.onPopState=function(b,c){var e=!1,f=!1,g,h;return m.doubleCheckComplete(),g=m.getHash(),g?(h=m.extractState(g||d.location.href,!0),h?m.replaceState(h.data,h.title,h.url,!1):(m.Adapter.trigger(a,"anchorchange"),m.busy(!1)),m.expectedStateId=!1,!1):(e=m.Adapter.extractEventData("state",b,c)||!1,e?f=m.getStateById(e):m.expectedStateId?f=m.getStateById(m.expectedStateId):f=m.extractState(d.location.href),f||(f=m.createStateObject(null,null,d.location.href)),m.expectedStateId=!1,m.isLastSavedState(f)?(m.busy(!1),!1):(m.storeState(f),m.saveState(f),m.setTitle(f),m.Adapter.trigger(a,"statechange"),m.busy(!1),!0))},m.Adapter.bind(a,"popstate",m.onPopState),m.pushState=function(b,c,d,e){if(m.getHashByUrl(d)&&m.emulated.pushState)throw new Error("History.js does not support states with fragement-identifiers (hashes/anchors).");if(e!==!1&&m.busy())return m.pushQueue({scope:m,callback:m.pushState,args:arguments,queue:e}),!1;m.busy(!0);var f=m.createStateObject(b,c,d);return m.isLastSavedState(f)?m.busy(!1):(m.storeState(f),m.expectedStateId=f.id,n.pushState(f.id,f.title,f.url),m.Adapter.trigger(a,"popstate")),!0},m.replaceState=function(b,c,d,e){if(m.getHashByUrl(d)&&m.emulated.pushState)throw new Error("History.js does not support states with fragement-identifiers (hashes/anchors).");if(e!==!1&&m.busy())return m.pushQueue({scope:m,callback:m.replaceState,args:arguments,queue:e}),!1;m.busy(!0);var f=m.createStateObject(b,c,d);return m.isLastSavedState(f)?m.busy(!1):(m.storeState(f),m.expectedStateId=f.id,n.replaceState(f.id,f.title,f.url),m.Adapter.trigger(a,"popstate")),!0};if(f){try{m.store=k.parse(f.getItem("History.store"))||{}}catch(p){m.store={}}m.normalizeStore()}else m.store={},m.normalizeStore();m.Adapter.bind(a,"beforeunload",m.clearAllIntervals),m.Adapter.bind(a,"unload",m.clearAllIntervals),m.saveState(m.storeState(m.extractState(d.location.href,!0))),f&&(m.onUnload=function(){var a,b;try{a=k.parse(f.getItem("History.store"))||{}}catch(c){a={}}a.idToState=a.idToState||{},a.urlToId=a.urlToId||{},a.stateToId=a.stateToId||{};for(b in m.idToState){if(!m.idToState.hasOwnProperty(b))continue;a.idToState[b]=m.idToState[b]}for(b in m.urlToId){if(!m.urlToId.hasOwnProperty(b))continue;a.urlToId[b]=m.urlToId[b]}for(b in m.stateToId){if(!m.stateToId.hasOwnProperty(b))continue;a.stateToId[b]=m.stateToId[b]}m.store=a,m.normalizeStore(),f.setItem("History.store",k.stringify(a))},m.intervalList.push(i(m.onUnload,m.options.storeInterval)),m.Adapter.bind(a,"beforeunload",m.onUnload),m.Adapter.bind(a,"unload",m.onUnload));if(!m.emulated.pushState){m.bugs.safariPoll&&m.intervalList.push(i(m.safariStatePoll,m.options.safariPollInterval));if(e.vendor==="Apple Computer, Inc."||(e.appCodeName||"")==="Mozilla")m.Adapter.bind(a,"hashchange",function(){m.Adapter.trigger(a,"popstate")}),m.getHash()&&m.Adapter.onDomLoad(function(){m.Adapter.trigger(a,"hashchange")})}},m.init()})(window) \ No newline at end of file diff --git a/js/libraries/balupton-history/scripts/compressed/json2.js b/js/libraries/balupton-history/scripts/compressed/json2.js new file mode 100755 index 00000000..8ae5a757 --- /dev/null +++ b/js/libraries/balupton-history/scripts/compressed/json2.js @@ -0,0 +1 @@ +window.JSON||(window.JSON={}),function(){function f(a){return a<10?"0"+a:a}function quote(a){return escapable.lastIndex=0,escapable.test(a)?'"'+a.replace(escapable,function(a){var b=meta[a];return typeof b=="string"?b:"\\u"+("0000"+a.charCodeAt(0).toString(16)).slice(-4)})+'"':'"'+a+'"'}function str(a,b){var c,d,e,f,g=gap,h,i=b[a];i&&typeof i=="object"&&typeof i.toJSON=="function"&&(i=i.toJSON(a)),typeof rep=="function"&&(i=rep.call(b,a,i));switch(typeof i){case"string":return quote(i);case"number":return isFinite(i)?String(i):"null";case"boolean":case"null":return String(i);case"object":if(!i)return"null";gap+=indent,h=[];if(Object.prototype.toString.apply(i)==="[object Array]"){f=i.length;for(c=0;c + * @copyright 2010-2011 Benjamin Arthur Lupton + * @license New BSD License + */ + +// Closure +(function(window,undefined){ + "use strict"; + + // Localise Globals + var + History = window.History = window.History||{}, + jQuery = window.jQuery; + + // Check Existence + if ( typeof History.Adapter !== 'undefined' ) { + throw new Error('History.js Adapter has already been loaded...'); + } + + // Add the Adapter + History.Adapter = { + /** + * History.Adapter.bind(el,event,callback) + * @param {Element|string} el + * @param {string} event - custom and standard events + * @param {function} callback + * @return {void} + */ + bind: function(el,event,callback){ + jQuery(el).bind(event,callback); + }, + + /** + * History.Adapter.trigger(el,event) + * @param {Element|string} el + * @param {string} event - custom and standard events + * @param {Object=} extra - a object of extra event data (optional) + * @return {void} + */ + trigger: function(el,event,extra){ + jQuery(el).trigger(event,extra); + }, + + /** + * History.Adapter.extractEventData(key,event,extra) + * @param {string} key - key for the event data to extract + * @param {string} event - custom and standard events + * @param {Object=} extra - a object of extra event data (optional) + * @return {mixed} + */ + extractEventData: function(key,event,extra){ + // jQuery Native then jQuery Custom + var result = (event && event.originalEvent && event.originalEvent[key]) || (extra && extra[key]) || undefined; + + // Return + return result; + }, + + /** + * History.Adapter.onDomLoad(callback) + * @param {function} callback + * @return {void} + */ + onDomLoad: function(callback) { + jQuery(callback); + } + }; + + // Try and Initialise History + if ( typeof History.init !== 'undefined' ) { + History.init(); + } + +})(window); + diff --git a/js/libraries/balupton-history/scripts/uncompressed/history.adapter.mootools.js b/js/libraries/balupton-history/scripts/uncompressed/history.adapter.mootools.js new file mode 100755 index 00000000..404425c4 --- /dev/null +++ b/js/libraries/balupton-history/scripts/uncompressed/history.adapter.mootools.js @@ -0,0 +1,84 @@ +/** + * History.js MooTools Adapter + * @author Benjamin Arthur Lupton + * @copyright 2010-2011 Benjamin Arthur Lupton + * @license New BSD License + */ + +// Closure +(function(window,undefined){ + "use strict"; + + // Localise Globals + var + History = window.History = window.History||{}, + MooTools = window.MooTools, + Element = window.Element; + + // Check Existence + if ( typeof History.Adapter !== 'undefined' ) { + throw new Error('History.js Adapter has already been loaded...'); + } + + // Make MooTools aware of History.js Events + Object.append(Element.NativeEvents,{ + 'popstate':2, + 'hashchange':2 + }); + + // Add the Adapter + History.Adapter = { + /** + * History.Adapter.bind(el,event,callback) + * @param {Element|string} el + * @param {string} event - custom and standard events + * @param {function} callback + * @return {void} + */ + bind: function(el,event,callback){ + var El = typeof el === 'string' ? document.id(el) : el; + El.addEvent(event,callback); + }, + + /** + * History.Adapter.trigger(el,event) + * @param {Element|string} el + * @param {string} event - custom and standard events + * @param {Object=} extra - a object of extra event data (optional) + * @return void + */ + trigger: function(el,event,extra){ + var El = typeof el === 'string' ? document.id(el) : el; + El.fireEvent(event,extra); + }, + + /** + * History.Adapter.extractEventData(key,event,extra) + * @param {string} key - key for the event data to extract + * @param {string} event - custom and standard events + * @return {mixed} + */ + extractEventData: function(key,event){ + // MooTools Native then MooTools Custom + var result = (event && event.event && event.event[key]) || (event && event[key]) || undefined; + + // Return + return result; + }, + + /** + * History.Adapter.onDomLoad(callback) + * @param {function} callback + * @return {void} + */ + onDomLoad: function(callback) { + window.addEvent('domready',callback); + } + }; + + // Try and Initialise History + if ( typeof History.init !== 'undefined' ) { + History.init(); + } + +})(window); diff --git a/js/libraries/balupton-history/scripts/uncompressed/history.adapter.native.js b/js/libraries/balupton-history/scripts/uncompressed/history.adapter.native.js new file mode 100755 index 00000000..6797f1dd --- /dev/null +++ b/js/libraries/balupton-history/scripts/uncompressed/history.adapter.native.js @@ -0,0 +1,121 @@ +/** + * History.js Native Adapter + * @author Benjamin Arthur Lupton + * @copyright 2010-2011 Benjamin Arthur Lupton + * @license New BSD License + */ + +// Closure +(function(window,undefined){ + "use strict"; + + // Localise Globals + var History = window.History = window.History||{}; + + // Check Existence + if ( typeof History.Adapter !== 'undefined' ) { + throw new Error('History.js Adapter has already been loaded...'); + } + + // Add the Adapter + History.Adapter = { + /** + * History.Adapter.handlers[uid][eventName] = Array + */ + handlers: {}, + + /** + * History.Adapter._uid + * The current element unique identifier + */ + _uid: 1, + + /** + * History.Adapter.uid(element) + * @param {Element} element + * @return {String} uid + */ + uid: function(element){ + return element._uid || (element._uid = History.Adapter._uid++); + }, + + /** + * History.Adapter.bind(el,event,callback) + * @param {Element} element + * @param {String} eventName - custom and standard events + * @param {Function} callback + * @return + */ + bind: function(element,eventName,callback){ + // Prepare + var uid = History.Adapter.uid(element); + + // Apply Listener + History.Adapter.handlers[uid] = History.Adapter.handlers[uid] || {}; + History.Adapter.handlers[uid][eventName] = History.Adapter.handlers[uid][eventName] || []; + History.Adapter.handlers[uid][eventName].push(callback); + + // Bind Global Listener + element['on'+eventName] = (function(element,eventName){ + return function(event){ + History.Adapter.trigger(element,eventName,event); + }; + })(element,eventName); + }, + + /** + * History.Adapter.trigger(el,event) + * @param {Element} element + * @param {String} eventName - custom and standard events + * @param {Object} event - a object of event data + * @return + */ + trigger: function(element,eventName,event){ + // Prepare + event = event || {}; + var uid = History.Adapter.uid(element), + i,n; + + // Apply Listener + History.Adapter.handlers[uid] = History.Adapter.handlers[uid] || {}; + History.Adapter.handlers[uid][eventName] = History.Adapter.handlers[uid][eventName] || []; + + // Fire Listeners + for ( i=0,n=History.Adapter.handlers[uid][eventName].length; i + * @copyright 2010-2011 Benjamin Arthur Lupton + * @license New BSD License + */ + +// Closure +(function(window,undefined){ + "use strict"; + + // Localise Globals + var + History = window.History = window.History||{}, + document = window.document, + RightJS = window.RightJS, + $ = RightJS.$; + + // Check Existence + if ( typeof History.Adapter !== 'undefined' ) { + throw new Error('History.js Adapter has already been loaded...'); + } + + // Add the Adapter + History.Adapter = { + /** + * History.Adapter.bind(el,event,callback) + * @param {Element|Selector} el + * @param {String} event - custom and standard events + * @param {Function} callback + * @return + */ + bind: function(el,event,callback){ + $(el).on(event,callback); + }, + + /** + * History.Adapter.trigger(el,event) + * @param {Element|Selector} el + * @param {String} event - custom and standard events + * @param {Object} extraEventData - a object of extra event data + * @return + */ + trigger: function(el,event,extraEventData){ + $(el).fire(event,extraEventData); + }, + + /** + * History.Adapter.extractEventData(key,event,extra) + * @param {String} key - key for the event data to extract + * @param {String} event - custom and standard events + * @return {mixed} + */ + extractEventData: function(key,event){ + // Right.js Native + // Right.js Custom + var result = (event && event._ && event._[key]) || undefined; + + // Return + return result; + }, + + /** + * History.Adapter.onDomLoad(callback) + * @param {Function} callback + * @return + */ + onDomLoad: function(callback) { + $(document).onReady(callback); + } + }; + + // Try and Initialise History + if ( typeof History.init !== 'undefined' ) { + History.init(); + } + +})(window); diff --git a/js/libraries/balupton-history/scripts/uncompressed/history.adapter.zepto.js b/js/libraries/balupton-history/scripts/uncompressed/history.adapter.zepto.js new file mode 100755 index 00000000..f1295f9d --- /dev/null +++ b/js/libraries/balupton-history/scripts/uncompressed/history.adapter.zepto.js @@ -0,0 +1,74 @@ +/** + * History.js Zepto Adapter + * @author Benjamin Arthur Lupton + * @copyright 2010-2011 Benjamin Arthur Lupton + * @license New BSD License + */ + +// Closure +(function(window,undefined){ + "use strict"; + + // Localise Globals + var + History = window.History = window.History||{}, + Zepto = window.Zepto; + + // Check Existence + if ( typeof History.Adapter !== 'undefined' ) { + throw new Error('History.js Adapter has already been loaded...'); + } + + // Add the Adapter + History.Adapter = { + /** + * History.Adapter.bind(el,event,callback) + * @param {Element|string} el + * @param {string} event - custom and standard events + * @param {function} callback + * @return {void} + */ + bind: function(el,event,callback){ + new Zepto(el).bind(event,callback); + }, + + /** + * History.Adapter.trigger(el,event) + * @param {Element|string} el + * @param {string} event - custom and standard events + * @return {void} + */ + trigger: function(el,event){ + new Zepto(el).trigger(event); + }, + + /** + * History.Adapter.extractEventData(key,event,extra) + * @param {string} key - key for the event data to extract + * @param {string} event - custom and standard events + * @return {mixed} + */ + extractEventData: function(key,event){ + // Zepto Native + var result = (event && event[key]) || undefined; + + // Return + return result; + }, + + /** + * History.Adapter.onDomLoad(callback) + * @param {function} callback + * @return {void} + */ + onDomLoad: function(callback) { + new Zepto(callback); + } + }; + + // Try and Initialise History + if ( typeof History.init !== 'undefined' ) { + History.init(); + } + +})(window); diff --git a/js/libraries/balupton-history/scripts/uncompressed/history.html4.js b/js/libraries/balupton-history/scripts/uncompressed/history.html4.js new file mode 100755 index 00000000..6d8d4274 --- /dev/null +++ b/js/libraries/balupton-history/scripts/uncompressed/history.html4.js @@ -0,0 +1,621 @@ +/** + * History.js HTML4 Support + * Depends on the HTML5 Support + * @author Benjamin Arthur Lupton + * @copyright 2010-2011 Benjamin Arthur Lupton + * @license New BSD License + */ + +(function(window,undefined){ + "use strict"; + + // ======================================================================== + // Initialise + + // Localise Globals + var + document = window.document, // Make sure we are using the correct document + setTimeout = window.setTimeout||setTimeout, + clearTimeout = window.clearTimeout||clearTimeout, + setInterval = window.setInterval||setInterval, + History = window.History = window.History||{}; // Public History Object + + // Check Existence + if ( typeof History.initHtml4 !== 'undefined' ) { + throw new Error('History.js HTML4 Support has already been loaded...'); + } + + + // ======================================================================== + // Initialise HTML4 Support + + // Initialise HTML4 Support + History.initHtml4 = function(){ + // Initialise + if ( typeof History.initHtml4.initialized !== 'undefined' ) { + // Already Loaded + return false; + } + else { + History.initHtml4.initialized = true; + } + + + // ==================================================================== + // Properties + + /** + * History.enabled + * Is History enabled? + */ + History.enabled = true; + + + // ==================================================================== + // Hash Storage + + /** + * History.savedHashes + * Store the hashes in an array + */ + History.savedHashes = []; + + /** + * History.isLastHash(newHash) + * Checks if the hash is the last hash + * @param {string} newHash + * @return {boolean} true + */ + History.isLastHash = function(newHash){ + // Prepare + var oldHash = History.getHashByIndex(), + isLast; + + // Check + isLast = newHash === oldHash; + + // Return isLast + return isLast; + }; + + /** + * History.saveHash(newHash) + * Push a Hash + * @param {string} newHash + * @return {boolean} true + */ + History.saveHash = function(newHash){ + // Check Hash + if ( History.isLastHash(newHash) ) { + return false; + } + + // Push the Hash + History.savedHashes.push(newHash); + + // Return true + return true; + }; + + /** + * History.getHashByIndex() + * Gets a hash by the index + * @param {integer} index + * @return {string} + */ + History.getHashByIndex = function(index){ + // Prepare + var hash = null; + + // Handle + if ( typeof index === 'undefined' ) { + // Get the last inserted + hash = History.savedHashes[History.savedHashes.length-1]; + } + else if ( index < 0 ) { + // Get from the end + hash = History.savedHashes[History.savedHashes.length+index]; + } + else { + // Get from the beginning + hash = History.savedHashes[index]; + } + + // Return hash + return hash; + }; + + + // ==================================================================== + // Discarded States + + /** + * History.discardedHashes + * A hashed array of discarded hashes + */ + History.discardedHashes = {}; + + /** + * History.discardedStates + * A hashed array of discarded states + */ + History.discardedStates = {}; + + /** + * History.discardState(State) + * Discards the state by ignoring it through History + * @param {object} State + * @return {true} + */ + History.discardState = function(discardedState,forwardState,backState){ + //History.debug('History.discardState', arguments); + // Prepare + var discardedStateHash = History.getHashByState(discardedState), + discardObject; + + // Create Discard Object + discardObject = { + 'discardedState': discardedState, + 'backState': backState, + 'forwardState': forwardState + }; + + // Add to DiscardedStates + History.discardedStates[discardedStateHash] = discardObject; + + // Return true + return true; + }; + + /** + * History.discardHash(hash) + * Discards the hash by ignoring it through History + * @param {string} hash + * @return {true} + */ + History.discardHash = function(discardedHash,forwardState,backState){ + //History.debug('History.discardState', arguments); + // Create Discard Object + var discardObject = { + 'discardedHash': discardedHash, + 'backState': backState, + 'forwardState': forwardState + }; + + // Add to discardedHash + History.discardedHashes[discardedHash] = discardObject; + + // Return true + return true; + }; + + /** + * History.discardState(State) + * Checks to see if the state is discarded + * @param {object} State + * @return {bool} + */ + History.discardedState = function(State){ + // Prepare + var StateHash = History.getHashByState(State), + discarded; + + // Check + discarded = History.discardedStates[StateHash]||false; + + // Return true + return discarded; + }; + + /** + * History.discardedHash(hash) + * Checks to see if the state is discarded + * @param {string} State + * @return {bool} + */ + History.discardedHash = function(hash){ + // Check + var discarded = History.discardedHashes[hash]||false; + + // Return true + return discarded; + }; + + /** + * History.recycleState(State) + * Allows a discarded state to be used again + * @param {object} data + * @param {string} title + * @param {string} url + * @return {true} + */ + History.recycleState = function(State){ + //History.debug('History.recycleState', arguments); + // Prepare + var StateHash = History.getHashByState(State); + + // Remove from DiscardedStates + if ( History.discardedState(State) ) { + delete History.discardedStates[StateHash]; + } + + // Return true + return true; + }; + + + // ==================================================================== + // HTML4 HashChange Support + + if ( History.emulated.hashChange ) { + /* + * We must emulate the HTML4 HashChange Support by manually checking for hash changes + */ + + /** + * History.hashChangeInit() + * Init the HashChange Emulation + */ + History.hashChangeInit = function(){ + // Define our Checker Function + History.checkerFunction = null; + + // Define some variables that will help in our checker function + var lastDocumentHash = '', + iframeId, iframe, + lastIframeHash, checkerRunning; + + // Handle depending on the browser + if ( History.isInternetExplorer() ) { + // IE6 and IE7 + // We need to use an iframe to emulate the back and forward buttons + + // Create iFrame + iframeId = 'historyjs-iframe'; + iframe = document.createElement('iframe'); + + // Adjust iFarme + iframe.setAttribute('id', iframeId); + iframe.style.display = 'none'; + + // Append iFrame + document.body.appendChild(iframe); + + // Create initial history entry + iframe.contentWindow.document.open(); + iframe.contentWindow.document.close(); + + // Define some variables that will help in our checker function + lastIframeHash = ''; + checkerRunning = false; + + // Define the checker function + History.checkerFunction = function(){ + // Check Running + if ( checkerRunning ) { + return false; + } + + // Update Running + checkerRunning = true; + + // Fetch + var documentHash = History.getHash()||'', + iframeHash = History.unescapeHash(iframe.contentWindow.document.location.hash)||''; + + // The Document Hash has changed (application caused) + if ( documentHash !== lastDocumentHash ) { + // Equalise + lastDocumentHash = documentHash; + + // Create a history entry in the iframe + if ( iframeHash !== documentHash ) { + //History.debug('hashchange.checker: iframe hash change', 'documentHash (new):', documentHash, 'iframeHash (old):', iframeHash); + + // Equalise + lastIframeHash = iframeHash = documentHash; + + // Create History Entry + iframe.contentWindow.document.open(); + iframe.contentWindow.document.close(); + + // Update the iframe's hash + iframe.contentWindow.document.location.hash = History.escapeHash(documentHash); + } + + // Trigger Hashchange Event + History.Adapter.trigger(window,'hashchange'); + } + + // The iFrame Hash has changed (back button caused) + else if ( iframeHash !== lastIframeHash ) { + //History.debug('hashchange.checker: iframe hash out of sync', 'iframeHash (new):', iframeHash, 'documentHash (old):', documentHash); + + // Equalise + lastIframeHash = iframeHash; + + // Update the Hash + History.setHash(iframeHash,false); + } + + // Reset Running + checkerRunning = false; + + // Return true + return true; + }; + } + else { + // We are not IE + // Firefox 1 or 2, Opera + + // Define the checker function + History.checkerFunction = function(){ + // Prepare + var documentHash = History.getHash(); + + // The Document Hash has changed (application caused) + if ( documentHash !== lastDocumentHash ) { + // Equalise + lastDocumentHash = documentHash; + + // Trigger Hashchange Event + History.Adapter.trigger(window,'hashchange'); + } + + // Return true + return true; + }; + } + + // Apply the checker function + History.intervalList.push(setInterval(History.checkerFunction, History.options.hashChangeInterval)); + + // Done + return true; + }; // History.hashChangeInit + + // Bind hashChangeInit + History.Adapter.onDomLoad(History.hashChangeInit); + + } // History.emulated.hashChange + + + // ==================================================================== + // HTML5 State Support + + // Non-Native pushState Implementation + if ( History.emulated.pushState ) { + /* + * We must emulate the HTML5 State Management by using HTML4 HashChange + */ + + /** + * History.onHashChange(event) + * Trigger HTML5's window.onpopstate via HTML4 HashChange Support + */ + History.onHashChange = function(event){ + //History.debug('History.onHashChange', arguments); + + // Prepare + var currentUrl = ((event && event.newURL) || document.location.href), + currentHash = History.getHashByUrl(currentUrl), + currentState = null, + currentStateHash = null, + currentStateHashExits = null, + discardObject; + + // Check if we are the same state + if ( History.isLastHash(currentHash) ) { + // There has been no change (just the page's hash has finally propagated) + //History.debug('History.onHashChange: no change'); + History.busy(false); + return false; + } + + // Reset the double check + History.doubleCheckComplete(); + + // Store our location for use in detecting back/forward direction + History.saveHash(currentHash); + + // Expand Hash + if ( currentHash && History.isTraditionalAnchor(currentHash) ) { + //History.debug('History.onHashChange: traditional anchor', currentHash); + // Traditional Anchor Hash + History.Adapter.trigger(window,'anchorchange'); + History.busy(false); + return false; + } + + // Create State + currentState = History.extractState(History.getFullUrl(currentHash||document.location.href,false),true); + + // Check if we are the same state + if ( History.isLastSavedState(currentState) ) { + //History.debug('History.onHashChange: no change'); + // There has been no change (just the page's hash has finally propagated) + History.busy(false); + return false; + } + + // Create the state Hash + currentStateHash = History.getHashByState(currentState); + + // Check if we are DiscardedState + discardObject = History.discardedState(currentState); + if ( discardObject ) { + // Ignore this state as it has been discarded and go back to the state before it + if ( History.getHashByIndex(-2) === History.getHashByState(discardObject.forwardState) ) { + // We are going backwards + //History.debug('History.onHashChange: go backwards'); + History.back(false); + } else { + // We are going forwards + //History.debug('History.onHashChange: go forwards'); + History.forward(false); + } + return false; + } + + // Push the new HTML5 State + //History.debug('History.onHashChange: success hashchange'); + History.pushState(currentState.data,currentState.title,currentState.url,false); + + // End onHashChange closure + return true; + }; + History.Adapter.bind(window,'hashchange',History.onHashChange); + + /** + * History.pushState(data,title,url) + * Add a new State to the history object, become it, and trigger onpopstate + * We have to trigger for HTML4 compatibility + * @param {object} data + * @param {string} title + * @param {string} url + * @return {true} + */ + History.pushState = function(data,title,url,queue){ + //History.debug('History.pushState: called', arguments); + + // Check the State + if ( History.getHashByUrl(url) ) { + throw new Error('History.js does not support states with fragement-identifiers (hashes/anchors).'); + } + + // Handle Queueing + if ( queue !== false && History.busy() ) { + // Wait + Push to Queue + //History.debug('History.pushState: we must wait', arguments); + History.pushQueue({ + scope: History, + callback: History.pushState, + args: arguments, + queue: queue + }); + return false; + } + + // Make Busy + History.busy(true); + + // Fetch the State Object + var newState = History.createStateObject(data,title,url), + newStateHash = History.getHashByState(newState), + oldState = History.getState(false), + oldStateHash = History.getHashByState(oldState), + html4Hash = History.getHash(); + + // Store the newState + History.storeState(newState); + History.expectedStateId = newState.id; + + // Recycle the State + History.recycleState(newState); + + // Force update of the title + History.setTitle(newState); + + // Check if we are the same State + if ( newStateHash === oldStateHash ) { + //History.debug('History.pushState: no change', newStateHash); + History.busy(false); + return false; + } + + // Update HTML4 Hash + if ( newStateHash !== html4Hash && newStateHash !== History.getShortUrl(document.location.href) ) { + //History.debug('History.pushState: update hash', newStateHash, html4Hash); + History.setHash(newStateHash,false); + return false; + } + + // Update HTML5 State + History.saveState(newState); + + // Fire HTML5 Event + //History.debug('History.pushState: trigger popstate'); + History.Adapter.trigger(window,'statechange'); + History.busy(false); + + // End pushState closure + return true; + }; + + /** + * History.replaceState(data,title,url) + * Replace the State and trigger onpopstate + * We have to trigger for HTML4 compatibility + * @param {object} data + * @param {string} title + * @param {string} url + * @return {true} + */ + History.replaceState = function(data,title,url,queue){ + //History.debug('History.replaceState: called', arguments); + + // Check the State + if ( History.getHashByUrl(url) ) { + throw new Error('History.js does not support states with fragement-identifiers (hashes/anchors).'); + } + + // Handle Queueing + if ( queue !== false && History.busy() ) { + // Wait + Push to Queue + //History.debug('History.replaceState: we must wait', arguments); + History.pushQueue({ + scope: History, + callback: History.replaceState, + args: arguments, + queue: queue + }); + return false; + } + + // Make Busy + History.busy(true); + + // Fetch the State Objects + var newState = History.createStateObject(data,title,url), + oldState = History.getState(false), + previousState = History.getStateByIndex(-2); + + // Discard Old State + History.discardState(oldState,newState,previousState); + + // Alias to PushState + History.pushState(newState.data,newState.title,newState.url,false); + + // End replaceState closure + return true; + }; + + } // History.emulated.pushState + + + + // ==================================================================== + // Initialise + + // Non-Native pushState Implementation + if ( History.emulated.pushState ) { + /** + * Ensure initial state is handled correctly + */ + if ( History.getHash() && !History.emulated.hashChange ) { + History.Adapter.onDomLoad(function(){ + History.Adapter.trigger(window,'hashchange'); + }); + } + + } // History.emulated.pushState + + }; // History.initHtml4 + + // Try and Initialise History + if ( typeof History.init !== 'undefined' ) { + History.init(); + } + +})(window); diff --git a/js/libraries/balupton-history/scripts/uncompressed/history.js b/js/libraries/balupton-history/scripts/uncompressed/history.js new file mode 100755 index 00000000..0e7cb1ec --- /dev/null +++ b/js/libraries/balupton-history/scripts/uncompressed/history.js @@ -0,0 +1,1943 @@ +/** + * History.js Core + * @author Benjamin Arthur Lupton + * @copyright 2010-2011 Benjamin Arthur Lupton + * @license New BSD License + */ + +(function(window,undefined){ + "use strict"; + + // ======================================================================== + // Initialise + + // Localise Globals + var + console = window.console||undefined, // Prevent a JSLint complain + document = window.document, // Make sure we are using the correct document + navigator = window.navigator, // Make sure we are using the correct navigator + sessionStorage = window.sessionStorage||false, // sessionStorage + setTimeout = window.setTimeout, + clearTimeout = window.clearTimeout, + setInterval = window.setInterval, + clearInterval = window.clearInterval, + JSON = window.JSON, + alert = window.alert, + History = window.History = window.History||{}, // Public History Object + history = window.history; // Old History Object + + // MooTools Compatibility + JSON.stringify = JSON.stringify||JSON.encode; + JSON.parse = JSON.parse||JSON.decode; + + // Check Existence + if ( typeof History.init !== 'undefined' ) { + throw new Error('History.js Core has already been loaded...'); + } + + // Initialise History + History.init = function(){ + // Check Load Status of Adapter + if ( typeof History.Adapter === 'undefined' ) { + return false; + } + + // Check Load Status of Core + if ( typeof History.initCore !== 'undefined' ) { + History.initCore(); + } + + // Check Load Status of HTML4 Support + if ( typeof History.initHtml4 !== 'undefined' ) { + History.initHtml4(); + } + + // Return true + return true; + }; + + + // ======================================================================== + // Initialise Core + + // Initialise Core + History.initCore = function(){ + // Initialise + if ( typeof History.initCore.initialized !== 'undefined' ) { + // Already Loaded + return false; + } + else { + History.initCore.initialized = true; + } + + + // ==================================================================== + // Options + + /** + * History.options + * Configurable options + */ + History.options = History.options||{}; + + /** + * History.options.hashChangeInterval + * How long should the interval be before hashchange checks + */ + History.options.hashChangeInterval = History.options.hashChangeInterval || 100; + + /** + * History.options.safariPollInterval + * How long should the interval be before safari poll checks + */ + History.options.safariPollInterval = History.options.safariPollInterval || 500; + + /** + * History.options.doubleCheckInterval + * How long should the interval be before we perform a double check + */ + History.options.doubleCheckInterval = History.options.doubleCheckInterval || 500; + + /** + * History.options.storeInterval + * How long should we wait between store calls + */ + History.options.storeInterval = History.options.storeInterval || 1000; + + /** + * History.options.busyDelay + * How long should we wait between busy events + */ + History.options.busyDelay = History.options.busyDelay || 250; + + /** + * History.options.debug + * If true will enable debug messages to be logged + */ + History.options.debug = History.options.debug || false; + + /** + * History.options.initialTitle + * What is the title of the initial state + */ + History.options.initialTitle = History.options.initialTitle || document.title; + + + // ==================================================================== + // Interval record + + /** + * History.intervalList + * List of intervals set, to be cleared when document is unloaded. + */ + History.intervalList = []; + + /** + * History.clearAllIntervals + * Clears all setInterval instances. + */ + History.clearAllIntervals = function(){ + var i, il = History.intervalList; + if (typeof il !== "undefined" && il !== null) { + for (i = 0; i < il.length; i++) { + clearInterval(il[i]); + } + History.intervalList = null; + } + }; + + + // ==================================================================== + // Debug + + /** + * History.debug(message,...) + * Logs the passed arguments if debug enabled + */ + History.debug = function(){ + if ( (History.options.debug||false) ) { + History.log.apply(History,arguments); + } + }; + + /** + * History.log(message,...) + * Logs the passed arguments + */ + History.log = function(){ + // Prepare + var + consoleExists = !(typeof console === 'undefined' || typeof console.log === 'undefined' || typeof console.log.apply === 'undefined'), + textarea = document.getElementById('log'), + message, + i,n, + args,arg + ; + + // Write to Console + if ( consoleExists ) { + args = Array.prototype.slice.call(arguments); + message = args.shift(); + if ( typeof console.debug !== 'undefined' ) { + console.debug.apply(console,[message,args]); + } + else { + console.log.apply(console,[message,args]); + } + } + else { + message = ("\n"+arguments[0]+"\n"); + } + + // Write to log + for ( i=1,n=arguments.length; i + * @author James Padolsey + */ + History.getInternetExplorerMajorVersion = function(){ + var result = History.getInternetExplorerMajorVersion.cached = + (typeof History.getInternetExplorerMajorVersion.cached !== 'undefined') + ? History.getInternetExplorerMajorVersion.cached + : (function(){ + var v = 3, + div = document.createElement('div'), + all = div.getElementsByTagName('i'); + while ( (div.innerHTML = '') && all[0] ) {} + return (v > 4) ? v : false; + })() + ; + return result; + }; + + /** + * History.isInternetExplorer() + * Are we using Internet Explorer? + * @return {boolean} + * @license Public Domain + * @author Benjamin Arthur Lupton + */ + History.isInternetExplorer = function(){ + var result = + History.isInternetExplorer.cached = + (typeof History.isInternetExplorer.cached !== 'undefined') + ? History.isInternetExplorer.cached + : Boolean(History.getInternetExplorerMajorVersion()) + ; + return result; + }; + + /** + * History.emulated + * Which features require emulating? + */ + History.emulated = { + pushState: !Boolean( + window.history && window.history.pushState && window.history.replaceState + && !( + (/ Mobile\/([1-7][a-z]|(8([abcde]|f(1[0-8]))))/i).test(navigator.userAgent) /* disable for versions of iOS before version 4.3 (8F190) */ + || (/AppleWebKit\/5([0-2]|3[0-2])/i).test(navigator.userAgent) /* disable for the mercury iOS browser, or at least older versions of the webkit engine */ + ) + ), + hashChange: Boolean( + !(('onhashchange' in window) || ('onhashchange' in document)) + || + (History.isInternetExplorer() && History.getInternetExplorerMajorVersion() < 8) + ) + }; + + /** + * History.enabled + * Is History enabled? + */ + History.enabled = !History.emulated.pushState; + + /** + * History.bugs + * Which bugs are present + */ + History.bugs = { + /** + * Safari 5 and Safari iOS 4 fail to return to the correct state once a hash is replaced by a `replaceState` call + * https://bugs.webkit.org/show_bug.cgi?id=56249 + */ + setHash: Boolean(!History.emulated.pushState && navigator.vendor === 'Apple Computer, Inc.' && /AppleWebKit\/5([0-2]|3[0-3])/.test(navigator.userAgent)), + + /** + * Safari 5 and Safari iOS 4 sometimes fail to apply the state change under busy conditions + * https://bugs.webkit.org/show_bug.cgi?id=42940 + */ + safariPoll: Boolean(!History.emulated.pushState && navigator.vendor === 'Apple Computer, Inc.' && /AppleWebKit\/5([0-2]|3[0-3])/.test(navigator.userAgent)), + + /** + * MSIE 6 and 7 sometimes do not apply a hash even it was told to (requiring a second call to the apply function) + */ + ieDoubleCheck: Boolean(History.isInternetExplorer() && History.getInternetExplorerMajorVersion() < 8), + + /** + * MSIE 6 requires the entire hash to be encoded for the hashes to trigger the onHashChange event + */ + hashEscape: Boolean(History.isInternetExplorer() && History.getInternetExplorerMajorVersion() < 7) + }; + + /** + * History.isEmptyObject(obj) + * Checks to see if the Object is Empty + * @param {Object} obj + * @return {boolean} + */ + History.isEmptyObject = function(obj) { + for ( var name in obj ) { + return false; + } + return true; + }; + + /** + * History.cloneObject(obj) + * Clones a object and eliminate all references to the original contexts + * @param {Object} obj + * @return {Object} + */ + History.cloneObject = function(obj) { + var hash,newObj; + if ( obj ) { + hash = JSON.stringify(obj); + newObj = JSON.parse(hash); + } + else { + newObj = {}; + } + return newObj; + }; + + + // ==================================================================== + // URL Helpers + + /** + * History.getRootUrl() + * Turns "http://mysite.com/dir/page.html?asd" into "http://mysite.com" + * @return {String} rootUrl + */ + History.getRootUrl = function(){ + // Create + var rootUrl = document.location.protocol+'//'+(document.location.hostname||document.location.host); + if ( document.location.port||false ) { + rootUrl += ':'+document.location.port; + } + rootUrl += '/'; + + // Return + return rootUrl; + }; + + /** + * History.getBaseHref() + * Fetches the `href` attribute of the `` element if it exists + * @return {String} baseHref + */ + History.getBaseHref = function(){ + // Create + var + baseElements = document.getElementsByTagName('base'), + baseElement = null, + baseHref = ''; + + // Test for Base Element + if ( baseElements.length === 1 ) { + // Prepare for Base Element + baseElement = baseElements[0]; + baseHref = baseElement.href.replace(/[^\/]+$/,''); + } + + // Adjust trailing slash + baseHref = baseHref.replace(/\/+$/,''); + if ( baseHref ) baseHref += '/'; + + // Return + return baseHref; + }; + + /** + * History.getBaseUrl() + * Fetches the baseHref or basePageUrl or rootUrl (whichever one exists first) + * @return {String} baseUrl + */ + History.getBaseUrl = function(){ + // Create + var baseUrl = History.getBaseHref()||History.getBasePageUrl()||History.getRootUrl(); + + // Return + return baseUrl; + }; + + /** + * History.getPageUrl() + * Fetches the URL of the current page + * @return {String} pageUrl + */ + History.getPageUrl = function(){ + // Fetch + var + State = History.getState(false,false), + stateUrl = (State||{}).url||document.location.href, + pageUrl; + + // Create + pageUrl = stateUrl.replace(/\/+$/,'').replace(/[^\/]+$/,function(part,index,string){ + return (/\./).test(part) ? part : part+'/'; + }); + + // Return + return pageUrl; + }; + + /** + * History.getBasePageUrl() + * Fetches the Url of the directory of the current page + * @return {String} basePageUrl + */ + History.getBasePageUrl = function(){ + // Create + var basePageUrl = document.location.href.replace(/[#\?].*/,'').replace(/[^\/]+$/,function(part,index,string){ + return (/[^\/]$/).test(part) ? '' : part; + }).replace(/\/+$/,'')+'/'; + + // Return + return basePageUrl; + }; + + /** + * History.getFullUrl(url) + * Ensures that we have an absolute URL and not a relative URL + * @param {string} url + * @param {Boolean} allowBaseHref + * @return {string} fullUrl + */ + History.getFullUrl = function(url,allowBaseHref){ + // Prepare + var fullUrl = url, firstChar = url.substring(0,1); + allowBaseHref = (typeof allowBaseHref === 'undefined') ? true : allowBaseHref; + + // Check + if ( /[a-z]+\:\/\//.test(url) ) { + // Full URL + } + else if ( firstChar === '/' ) { + // Root URL + fullUrl = History.getRootUrl()+url.replace(/^\/+/,''); + } + else if ( firstChar === '#' ) { + // Anchor URL + fullUrl = History.getPageUrl().replace(/#.*/,'')+url; + } + else if ( firstChar === '?' ) { + // Query URL + fullUrl = History.getPageUrl().replace(/[\?#].*/,'')+url; + } + else { + // Relative URL + if ( allowBaseHref ) { + fullUrl = History.getBaseUrl()+url.replace(/^(\.\/)+/,''); + } else { + fullUrl = History.getBasePageUrl()+url.replace(/^(\.\/)+/,''); + } + // We have an if condition above as we do not want hashes + // which are relative to the baseHref in our URLs + // as if the baseHref changes, then all our bookmarks + // would now point to different locations + // whereas the basePageUrl will always stay the same + } + + // Return + return fullUrl.replace(/\#$/,''); + }; + + /** + * History.getShortUrl(url) + * Ensures that we have a relative URL and not a absolute URL + * @param {string} url + * @return {string} url + */ + History.getShortUrl = function(url){ + // Prepare + var shortUrl = url, baseUrl = History.getBaseUrl(), rootUrl = History.getRootUrl(); + + // Trim baseUrl + if ( History.emulated.pushState ) { + // We are in a if statement as when pushState is not emulated + // The actual url these short urls are relative to can change + // So within the same session, we the url may end up somewhere different + shortUrl = shortUrl.replace(baseUrl,''); + } + + // Trim rootUrl + shortUrl = shortUrl.replace(rootUrl,'/'); + + // Ensure we can still detect it as a state + if ( History.isTraditionalAnchor(shortUrl) ) { + shortUrl = './'+shortUrl; + } + + // Clean It + shortUrl = shortUrl.replace(/^(\.\/)+/g,'./').replace(/\#$/,''); + + // Return + return shortUrl; + }; + + + // ==================================================================== + // State Storage + + /** + * History.store + * The store for all session specific data + */ + History.store = {}; + + /** + * History.idToState + * 1-1: State ID to State Object + */ + History.idToState = History.idToState||{}; + + /** + * History.stateToId + * 1-1: State String to State ID + */ + History.stateToId = History.stateToId||{}; + + /** + * History.urlToId + * 1-1: State URL to State ID + */ + History.urlToId = History.urlToId||{}; + + /** + * History.storedStates + * Store the states in an array + */ + History.storedStates = History.storedStates||[]; + + /** + * History.savedStates + * Saved the states in an array + */ + History.savedStates = History.savedStates||[]; + + /** + * History.noramlizeStore() + * Noramlize the store by adding necessary values + */ + History.normalizeStore = function(){ + History.store.idToState = History.store.idToState||{}; + History.store.urlToId = History.store.urlToId||{}; + History.store.stateToId = History.store.stateToId||{}; + }; + + /** + * History.getState() + * Get an object containing the data, title and url of the current state + * @param {Boolean} friendly + * @param {Boolean} create + * @return {Object} State + */ + History.getState = function(friendly,create){ + // Prepare + if ( typeof friendly === 'undefined' ) { friendly = true; } + if ( typeof create === 'undefined' ) { create = true; } + + // Fetch + var State = History.getLastSavedState(); + + // Create + if ( !State && create ) { + State = History.createStateObject(); + } + + // Adjust + if ( friendly ) { + State = History.cloneObject(State); + State.url = State.cleanUrl||State.url; + } + + // Return + return State; + }; + + /** + * History.getIdByState(State) + * Gets a ID for a State + * @param {State} newState + * @return {String} id + */ + History.getIdByState = function(newState){ + + // Fetch ID + var id = History.extractId(newState.url), + str; + + if ( !id ) { + // Find ID via State String + str = History.getStateString(newState); + if ( typeof History.stateToId[str] !== 'undefined' ) { + id = History.stateToId[str]; + } + else if ( typeof History.store.stateToId[str] !== 'undefined' ) { + id = History.store.stateToId[str]; + } + else { + // Generate a new ID + while ( true ) { + id = (new Date()).getTime() + String(Math.random()).replace(/\D/g,''); + if ( typeof History.idToState[id] === 'undefined' && typeof History.store.idToState[id] === 'undefined' ) { + break; + } + } + + // Apply the new State to the ID + History.stateToId[str] = id; + History.idToState[id] = newState; + } + } + + // Return ID + return id; + }; + + /** + * History.normalizeState(State) + * Expands a State Object + * @param {object} State + * @return {object} + */ + History.normalizeState = function(oldState){ + // Variables + var newState, dataNotEmpty; + + // Prepare + if ( !oldState || (typeof oldState !== 'object') ) { + oldState = {}; + } + + // Check + if ( typeof oldState.normalized !== 'undefined' ) { + return oldState; + } + + // Adjust + if ( !oldState.data || (typeof oldState.data !== 'object') ) { + oldState.data = {}; + } + + // ---------------------------------------------------------------- + + // Create + newState = {}; + newState.normalized = true; + newState.title = oldState.title||''; + newState.url = History.getFullUrl(History.unescapeString(oldState.url||document.location.href)); + newState.hash = History.getShortUrl(newState.url); + newState.data = History.cloneObject(oldState.data); + + // Fetch ID + newState.id = History.getIdByState(newState); + + // ---------------------------------------------------------------- + + // Clean the URL + newState.cleanUrl = newState.url.replace(/\??\&_suid.*/,''); + newState.url = newState.cleanUrl; + + // Check to see if we have more than just a url + dataNotEmpty = !History.isEmptyObject(newState.data); + + // Apply + if ( newState.title || dataNotEmpty ) { + // Add ID to Hash + newState.hash = History.getShortUrl(newState.url).replace(/\??\&_suid.*/,''); + if ( !/\?/.test(newState.hash) ) { + newState.hash += '?'; + } + newState.hash += '&_suid='+newState.id; + } + + // Create the Hashed URL + newState.hashedUrl = History.getFullUrl(newState.hash); + + // ---------------------------------------------------------------- + + // Update the URL if we have a duplicate + if ( (History.emulated.pushState || History.bugs.safariPoll) && History.hasUrlDuplicate(newState) ) { + newState.url = newState.hashedUrl; + } + + // ---------------------------------------------------------------- + + // Return + return newState; + }; + + /** + * History.createStateObject(data,title,url) + * Creates a object based on the data, title and url state params + * @param {object} data + * @param {string} title + * @param {string} url + * @return {object} + */ + History.createStateObject = function(data,title,url){ + // Hashify + var State = { + 'data': data, + 'title': title, + 'url': url + }; + + // Expand the State + State = History.normalizeState(State); + + // Return object + return State; + }; + + /** + * History.getStateById(id) + * Get a state by it's UID + * @param {String} id + */ + History.getStateById = function(id){ + // Prepare + id = String(id); + + // Retrieve + var State = History.idToState[id] || History.store.idToState[id] || undefined; + + // Return State + return State; + }; + + /** + * Get a State's String + * @param {State} passedState + */ + History.getStateString = function(passedState){ + // Prepare + var State, cleanedState, str; + + // Fetch + State = History.normalizeState(passedState); + + // Clean + cleanedState = { + data: State.data, + title: passedState.title, + url: passedState.url + }; + + // Fetch + str = JSON.stringify(cleanedState); + + // Return + return str; + }; + + /** + * Get a State's ID + * @param {State} passedState + * @return {String} id + */ + History.getStateId = function(passedState){ + // Prepare + var State, id; + + // Fetch + State = History.normalizeState(passedState); + + // Fetch + id = State.id; + + // Return + return id; + }; + + /** + * History.getHashByState(State) + * Creates a Hash for the State Object + * @param {State} passedState + * @return {String} hash + */ + History.getHashByState = function(passedState){ + // Prepare + var State, hash; + + // Fetch + State = History.normalizeState(passedState); + + // Hash + hash = State.hash; + + // Return + return hash; + }; + + /** + * History.extractId(url_or_hash) + * Get a State ID by it's URL or Hash + * @param {string} url_or_hash + * @return {string} id + */ + History.extractId = function ( url_or_hash ) { + // Prepare + var id,parts,url; + + // Extract + parts = /(.*)\&_suid=([0-9]+)$/.exec(url_or_hash); + url = parts ? (parts[1]||url_or_hash) : url_or_hash; + id = parts ? String(parts[2]||'') : ''; + + // Return + return id||false; + }; + + /** + * History.isTraditionalAnchor + * Checks to see if the url is a traditional anchor or not + * @param {String} url_or_hash + * @return {Boolean} + */ + History.isTraditionalAnchor = function(url_or_hash){ + // Check + var isTraditional = !(/[\/\?\.]/.test(url_or_hash)); + + // Return + return isTraditional; + }; + + /** + * History.extractState + * Get a State by it's URL or Hash + * @param {String} url_or_hash + * @return {State|null} + */ + History.extractState = function(url_or_hash,create){ + // Prepare + var State = null, id, url; + create = create||false; + + // Fetch SUID + id = History.extractId(url_or_hash); + if ( id ) { + State = History.getStateById(id); + } + + // Fetch SUID returned no State + if ( !State ) { + // Fetch URL + url = History.getFullUrl(url_or_hash); + + // Check URL + id = History.getIdByUrl(url)||false; + if ( id ) { + State = History.getStateById(id); + } + + // Create State + if ( !State && create && !History.isTraditionalAnchor(url_or_hash) ) { + State = History.createStateObject(null,null,url); + } + } + + // Return + return State; + }; + + /** + * History.getIdByUrl() + * Get a State ID by a State URL + */ + History.getIdByUrl = function(url){ + // Fetch + var id = History.urlToId[url] || History.store.urlToId[url] || undefined; + + // Return + return id; + }; + + /** + * History.getLastSavedState() + * Get an object containing the data, title and url of the current state + * @return {Object} State + */ + History.getLastSavedState = function(){ + return History.savedStates[History.savedStates.length-1]||undefined; + }; + + /** + * History.getLastStoredState() + * Get an object containing the data, title and url of the current state + * @return {Object} State + */ + History.getLastStoredState = function(){ + return History.storedStates[History.storedStates.length-1]||undefined; + }; + + /** + * History.hasUrlDuplicate + * Checks if a Url will have a url conflict + * @param {Object} newState + * @return {Boolean} hasDuplicate + */ + History.hasUrlDuplicate = function(newState) { + // Prepare + var hasDuplicate = false, + oldState; + + // Fetch + oldState = History.extractState(newState.url); + + // Check + hasDuplicate = oldState && oldState.id !== newState.id; + + // Return + return hasDuplicate; + }; + + /** + * History.storeState + * Store a State + * @param {Object} newState + * @return {Object} newState + */ + History.storeState = function(newState){ + // Store the State + History.urlToId[newState.url] = newState.id; + + // Push the State + History.storedStates.push(History.cloneObject(newState)); + + // Return newState + return newState; + }; + + /** + * History.isLastSavedState(newState) + * Tests to see if the state is the last state + * @param {Object} newState + * @return {boolean} isLast + */ + History.isLastSavedState = function(newState){ + // Prepare + var isLast = false, + newId, oldState, oldId; + + // Check + if ( History.savedStates.length ) { + newId = newState.id; + oldState = History.getLastSavedState(); + oldId = oldState.id; + + // Check + isLast = (newId === oldId); + } + + // Return + return isLast; + }; + + /** + * History.saveState + * Push a State + * @param {Object} newState + * @return {boolean} changed + */ + History.saveState = function(newState){ + // Check Hash + if ( History.isLastSavedState(newState) ) { + return false; + } + + // Push the State + History.savedStates.push(History.cloneObject(newState)); + + // Return true + return true; + }; + + /** + * History.getStateByIndex() + * Gets a state by the index + * @param {integer} index + * @return {Object} + */ + History.getStateByIndex = function(index){ + // Prepare + var State = null; + + // Handle + if ( typeof index === 'undefined' ) { + // Get the last inserted + State = History.savedStates[History.savedStates.length-1]; + } + else if ( index < 0 ) { + // Get from the end + State = History.savedStates[History.savedStates.length+index]; + } + else { + // Get from the beginning + State = History.savedStates[index]; + } + + // Return State + return State; + }; + + + // ==================================================================== + // Hash Helpers + + /** + * History.getHash() + * Gets the current document hash + * @return {string} + */ + History.getHash = function(){ + var hash = History.unescapeHash(document.location.hash); + return hash; + }; + + /** + * History.unescapeString() + * Unescape a string + * @param {String} str + * @return {string} + */ + History.unescapeString = function(str){ + // Prepare + var result = str, + tmp; + + // Unescape hash + while ( true ) { + tmp = window.unescape(result); + if ( tmp === result ) { + break; + } + result = tmp; + } + + // Return result + return result; + }; + + /** + * History.unescapeHash() + * normalize and Unescape a Hash + * @param {String} hash + * @return {string} + */ + History.unescapeHash = function(hash){ + // Prepare + var result = History.normalizeHash(hash); + + // Unescape hash + result = History.unescapeString(result); + + // Return result + return result; + }; + + /** + * History.normalizeHash() + * normalize a hash across browsers + * @return {string} + */ + History.normalizeHash = function(hash){ + // Prepare + var result = hash.replace(/[^#]*#/,'').replace(/#.*/, ''); + + // Return result + return result; + }; + + /** + * History.setHash(hash) + * Sets the document hash + * @param {string} hash + * @return {History} + */ + History.setHash = function(hash,queue){ + // Prepare + var adjustedHash, State, pageUrl; + + // Handle Queueing + if ( queue !== false && History.busy() ) { + // Wait + Push to Queue + //History.debug('History.setHash: we must wait', arguments); + History.pushQueue({ + scope: History, + callback: History.setHash, + args: arguments, + queue: queue + }); + return false; + } + + // Log + //History.debug('History.setHash: called',hash); + + // Prepare + adjustedHash = History.escapeHash(hash); + + // Make Busy + Continue + History.busy(true); + + // Check if hash is a state + State = History.extractState(hash,true); + if ( State && !History.emulated.pushState ) { + // Hash is a state so skip the setHash + //History.debug('History.setHash: Hash is a state so skipping the hash set with a direct pushState call',arguments); + + // PushState + History.pushState(State.data,State.title,State.url,false); + } + else if ( document.location.hash !== adjustedHash ) { + // Hash is a proper hash, so apply it + + // Handle browser bugs + if ( History.bugs.setHash ) { + // Fix Safari Bug https://bugs.webkit.org/show_bug.cgi?id=56249 + + // Fetch the base page + pageUrl = History.getPageUrl(); + + // Safari hash apply + History.pushState(null,null,pageUrl+'#'+adjustedHash,false); + } + else { + // Normal hash apply + document.location.hash = adjustedHash; + } + } + + // Chain + return History; + }; + + /** + * History.escape() + * normalize and Escape a Hash + * @return {string} + */ + History.escapeHash = function(hash){ + // Prepare + var result = History.normalizeHash(hash); + + // Escape hash + result = window.escape(result); + + // IE6 Escape Bug + if ( !History.bugs.hashEscape ) { + // Restore common parts + result = result + .replace(/\%21/g,'!') + .replace(/\%26/g,'&') + .replace(/\%3D/g,'=') + .replace(/\%3F/g,'?'); + } + + // Return result + return result; + }; + + /** + * History.getHashByUrl(url) + * Extracts the Hash from a URL + * @param {string} url + * @return {string} url + */ + History.getHashByUrl = function(url){ + // Extract the hash + var hash = String(url) + .replace(/([^#]*)#?([^#]*)#?(.*)/, '$2') + ; + + // Unescape hash + hash = History.unescapeHash(hash); + + // Return hash + return hash; + }; + + /** + * History.setTitle(title) + * Applies the title to the document + * @param {State} newState + * @return {Boolean} + */ + History.setTitle = function(newState){ + // Prepare + var title = newState.title, + firstState; + + // Initial + if ( !title ) { + firstState = History.getStateByIndex(0); + if ( firstState && firstState.url === newState.url ) { + title = firstState.title||History.options.initialTitle; + } + } + + // Apply + try { + document.getElementsByTagName('title')[0].innerHTML = title.replace('<','<').replace('>','>').replace(' & ',' & '); + } + catch ( Exception ) { } + document.title = title; + + // Chain + return History; + }; + + + // ==================================================================== + // Queueing + + /** + * History.queues + * The list of queues to use + * First In, First Out + */ + History.queues = []; + + /** + * History.busy(value) + * @param {boolean} value [optional] + * @return {boolean} busy + */ + History.busy = function(value){ + // Apply + if ( typeof value !== 'undefined' ) { + //History.debug('History.busy: changing ['+(History.busy.flag||false)+'] to ['+(value||false)+']', History.queues.length); + History.busy.flag = value; + } + // Default + else if ( typeof History.busy.flag === 'undefined' ) { + History.busy.flag = false; + } + + // Queue + if ( !History.busy.flag ) { + // Execute the next item in the queue + clearTimeout(History.busy.timeout); + var fireNext = function(){ + var i, queue, item; + if ( History.busy.flag ) return; + for ( i=History.queues.length-1; i >= 0; --i ) { + queue = History.queues[i]; + if ( queue.length === 0 ) continue; + item = queue.shift(); + History.fireQueueItem(item); + History.busy.timeout = setTimeout(fireNext,History.options.busyDelay); + } + }; + History.busy.timeout = setTimeout(fireNext,History.options.busyDelay); + } + + // Return + return History.busy.flag; + }; + + /** + * History.busy.flag + */ + History.busy.flag = false; + + /** + * History.fireQueueItem(item) + * Fire a Queue Item + * @param {Object} item + * @return {Mixed} result + */ + History.fireQueueItem = function(item){ + return item.callback.apply(item.scope||History,item.args||[]); + }; + + /** + * History.pushQueue(callback,args) + * Add an item to the queue + * @param {Object} item [scope,callback,args,queue] + */ + History.pushQueue = function(item){ + // Prepare the queue + History.queues[item.queue||0] = History.queues[item.queue||0]||[]; + + // Add to the queue + History.queues[item.queue||0].push(item); + + // Chain + return History; + }; + + /** + * History.queue (item,queue), (func,queue), (func), (item) + * Either firs the item now if not busy, or adds it to the queue + */ + History.queue = function(item,queue){ + // Prepare + if ( typeof item === 'function' ) { + item = { + callback: item + }; + } + if ( typeof queue !== 'undefined' ) { + item.queue = queue; + } + + // Handle + if ( History.busy() ) { + History.pushQueue(item); + } else { + History.fireQueueItem(item); + } + + // Chain + return History; + }; + + /** + * History.clearQueue() + * Clears the Queue + */ + History.clearQueue = function(){ + History.busy.flag = false; + History.queues = []; + return History; + }; + + + // ==================================================================== + // IE Bug Fix + + /** + * History.stateChanged + * States whether or not the state has changed since the last double check was initialised + */ + History.stateChanged = false; + + /** + * History.doubleChecker + * Contains the timeout used for the double checks + */ + History.doubleChecker = false; + + /** + * History.doubleCheckComplete() + * Complete a double check + * @return {History} + */ + History.doubleCheckComplete = function(){ + // Update + History.stateChanged = true; + + // Clear + History.doubleCheckClear(); + + // Chain + return History; + }; + + /** + * History.doubleCheckClear() + * Clear a double check + * @return {History} + */ + History.doubleCheckClear = function(){ + // Clear + if ( History.doubleChecker ) { + clearTimeout(History.doubleChecker); + History.doubleChecker = false; + } + + // Chain + return History; + }; + + /** + * History.doubleCheck() + * Create a double check + * @return {History} + */ + History.doubleCheck = function(tryAgain){ + // Reset + History.stateChanged = false; + History.doubleCheckClear(); + + // Fix IE6,IE7 bug where calling history.back or history.forward does not actually change the hash (whereas doing it manually does) + // Fix Safari 5 bug where sometimes the state does not change: https://bugs.webkit.org/show_bug.cgi?id=42940 + if ( History.bugs.ieDoubleCheck ) { + // Apply Check + History.doubleChecker = setTimeout( + function(){ + History.doubleCheckClear(); + if ( !History.stateChanged ) { + //History.debug('History.doubleCheck: State has not yet changed, trying again', arguments); + // Re-Attempt + tryAgain(); + } + return true; + }, + History.options.doubleCheckInterval + ); + } + + // Chain + return History; + }; + + + // ==================================================================== + // Safari Bug Fix + + /** + * History.safariStatePoll() + * Poll the current state + * @return {History} + */ + History.safariStatePoll = function(){ + // Poll the URL + + // Get the Last State which has the new URL + var + urlState = History.extractState(document.location.href), + newState; + + // Check for a difference + if ( !History.isLastSavedState(urlState) ) { + newState = urlState; + } + else { + return; + } + + // Check if we have a state with that url + // If not create it + if ( !newState ) { + //History.debug('History.safariStatePoll: new'); + newState = History.createStateObject(); + } + + // Apply the New State + //History.debug('History.safariStatePoll: trigger'); + History.Adapter.trigger(window,'popstate'); + + // Chain + return History; + }; + + + // ==================================================================== + // State Aliases + + /** + * History.back(queue) + * Send the browser history back one item + * @param {Integer} queue [optional] + */ + History.back = function(queue){ + //History.debug('History.back: called', arguments); + + // Handle Queueing + if ( queue !== false && History.busy() ) { + // Wait + Push to Queue + //History.debug('History.back: we must wait', arguments); + History.pushQueue({ + scope: History, + callback: History.back, + args: arguments, + queue: queue + }); + return false; + } + + // Make Busy + Continue + History.busy(true); + + // Fix certain browser bugs that prevent the state from changing + History.doubleCheck(function(){ + History.back(false); + }); + + // Go back + history.go(-1); + + // End back closure + return true; + }; + + /** + * History.forward(queue) + * Send the browser history forward one item + * @param {Integer} queue [optional] + */ + History.forward = function(queue){ + //History.debug('History.forward: called', arguments); + + // Handle Queueing + if ( queue !== false && History.busy() ) { + // Wait + Push to Queue + //History.debug('History.forward: we must wait', arguments); + History.pushQueue({ + scope: History, + callback: History.forward, + args: arguments, + queue: queue + }); + return false; + } + + // Make Busy + Continue + History.busy(true); + + // Fix certain browser bugs that prevent the state from changing + History.doubleCheck(function(){ + History.forward(false); + }); + + // Go forward + history.go(1); + + // End forward closure + return true; + }; + + /** + * History.go(index,queue) + * Send the browser history back or forward index times + * @param {Integer} queue [optional] + */ + History.go = function(index,queue){ + //History.debug('History.go: called', arguments); + + // Prepare + var i; + + // Handle + if ( index > 0 ) { + // Forward + for ( i=1; i<=index; ++i ) { + History.forward(queue); + } + } + else if ( index < 0 ) { + // Backward + for ( i=-1; i>=index; --i ) { + History.back(queue); + } + } + else { + throw new Error('History.go: History.go requires a positive or negative integer passed.'); + } + + // Chain + return History; + }; + + + // ==================================================================== + // HTML5 State Support + + // Non-Native pushState Implementation + if ( History.emulated.pushState ) { + /* + * Provide Skeleton for HTML4 Browsers + */ + + // Prepare + var emptyFunction = function(){}; + History.pushState = History.pushState||emptyFunction; + History.replaceState = History.replaceState||emptyFunction; + } // History.emulated.pushState + + // Native pushState Implementation + else { + /* + * Use native HTML5 History API Implementation + */ + + /** + * History.onPopState(event,extra) + * Refresh the Current State + */ + History.onPopState = function(event,extra){ + // Prepare + var stateId = false, newState = false, currentHash, currentState; + + // Reset the double check + History.doubleCheckComplete(); + + // Check for a Hash, and handle apporiatly + currentHash = History.getHash(); + if ( currentHash ) { + // Expand Hash + currentState = History.extractState(currentHash||document.location.href,true); + if ( currentState ) { + // We were able to parse it, it must be a State! + // Let's forward to replaceState + //History.debug('History.onPopState: state anchor', currentHash, currentState); + History.replaceState(currentState.data, currentState.title, currentState.url, false); + } + else { + // Traditional Anchor + //History.debug('History.onPopState: traditional anchor', currentHash); + History.Adapter.trigger(window,'anchorchange'); + History.busy(false); + } + + // We don't care for hashes + History.expectedStateId = false; + return false; + } + + // Ensure + stateId = History.Adapter.extractEventData('state',event,extra) || false; + + // Fetch State + if ( stateId ) { + // Vanilla: Back/forward button was used + newState = History.getStateById(stateId); + } + else if ( History.expectedStateId ) { + // Vanilla: A new state was pushed, and popstate was called manually + newState = History.getStateById(History.expectedStateId); + } + else { + // Initial State + newState = History.extractState(document.location.href); + } + + // The State did not exist in our store + if ( !newState ) { + // Regenerate the State + newState = History.createStateObject(null,null,document.location.href); + } + + // Clean + History.expectedStateId = false; + + // Check if we are the same state + if ( History.isLastSavedState(newState) ) { + // There has been no change (just the page's hash has finally propagated) + //History.debug('History.onPopState: no change', newState, History.savedStates); + History.busy(false); + return false; + } + + // Store the State + History.storeState(newState); + History.saveState(newState); + + // Force update of the title + History.setTitle(newState); + + // Fire Our Event + History.Adapter.trigger(window,'statechange'); + History.busy(false); + + // Return true + return true; + }; + History.Adapter.bind(window,'popstate',History.onPopState); + + /** + * History.pushState(data,title,url) + * Add a new State to the history object, become it, and trigger onpopstate + * We have to trigger for HTML4 compatibility + * @param {object} data + * @param {string} title + * @param {string} url + * @return {true} + */ + History.pushState = function(data,title,url,queue){ + //History.debug('History.pushState: called', arguments); + + // Check the State + if ( History.getHashByUrl(url) && History.emulated.pushState ) { + throw new Error('History.js does not support states with fragement-identifiers (hashes/anchors).'); + } + + // Handle Queueing + if ( queue !== false && History.busy() ) { + // Wait + Push to Queue + //History.debug('History.pushState: we must wait', arguments); + History.pushQueue({ + scope: History, + callback: History.pushState, + args: arguments, + queue: queue + }); + return false; + } + + // Make Busy + Continue + History.busy(true); + + // Create the newState + var newState = History.createStateObject(data,title,url); + + // Check it + if ( History.isLastSavedState(newState) ) { + // Won't be a change + History.busy(false); + } + else { + // Store the newState + History.storeState(newState); + History.expectedStateId = newState.id; + + // Push the newState + history.pushState(newState.id,newState.title,newState.url); + + // Fire HTML5 Event + History.Adapter.trigger(window,'popstate'); + } + + // End pushState closure + return true; + }; + + /** + * History.replaceState(data,title,url) + * Replace the State and trigger onpopstate + * We have to trigger for HTML4 compatibility + * @param {object} data + * @param {string} title + * @param {string} url + * @return {true} + */ + History.replaceState = function(data,title,url,queue){ + //History.debug('History.replaceState: called', arguments); + + // Check the State + if ( History.getHashByUrl(url) && History.emulated.pushState ) { + throw new Error('History.js does not support states with fragement-identifiers (hashes/anchors).'); + } + + // Handle Queueing + if ( queue !== false && History.busy() ) { + // Wait + Push to Queue + //History.debug('History.replaceState: we must wait', arguments); + History.pushQueue({ + scope: History, + callback: History.replaceState, + args: arguments, + queue: queue + }); + return false; + } + + // Make Busy + Continue + History.busy(true); + + // Create the newState + var newState = History.createStateObject(data,title,url); + + // Check it + if ( History.isLastSavedState(newState) ) { + // Won't be a change + History.busy(false); + } + else { + // Store the newState + History.storeState(newState); + History.expectedStateId = newState.id; + + // Push the newState + history.replaceState(newState.id,newState.title,newState.url); + + // Fire HTML5 Event + History.Adapter.trigger(window,'popstate'); + } + + // End replaceState closure + return true; + }; + + } // !History.emulated.pushState + + + // ==================================================================== + // Initialise + + /** + * Load the Store + */ + if ( sessionStorage ) { + // Fetch + try { + History.store = JSON.parse(sessionStorage.getItem('History.store'))||{}; + } + catch ( err ) { + History.store = {}; + } + + // Normalize + History.normalizeStore(); + } + else { + // Default Load + History.store = {}; + History.normalizeStore(); + } + + /** + * Clear Intervals on exit to prevent memory leaks + */ + History.Adapter.bind(window,"beforeunload",History.clearAllIntervals); + History.Adapter.bind(window,"unload",History.clearAllIntervals); + + /** + * Create the initial State + */ + History.saveState(History.storeState(History.extractState(document.location.href,true))); + + /** + * Bind for Saving Store + */ + if ( sessionStorage ) { + // When the page is closed + History.onUnload = function(){ + // Prepare + var currentStore, item; + + // Fetch + try { + currentStore = JSON.parse(sessionStorage.getItem('History.store'))||{}; + } + catch ( err ) { + currentStore = {}; + } + + // Ensure + currentStore.idToState = currentStore.idToState || {}; + currentStore.urlToId = currentStore.urlToId || {}; + currentStore.stateToId = currentStore.stateToId || {}; + + // Sync + for ( item in History.idToState ) { + if ( !History.idToState.hasOwnProperty(item) ) { + continue; + } + currentStore.idToState[item] = History.idToState[item]; + } + for ( item in History.urlToId ) { + if ( !History.urlToId.hasOwnProperty(item) ) { + continue; + } + currentStore.urlToId[item] = History.urlToId[item]; + } + for ( item in History.stateToId ) { + if ( !History.stateToId.hasOwnProperty(item) ) { + continue; + } + currentStore.stateToId[item] = History.stateToId[item]; + } + + // Update + History.store = currentStore; + History.normalizeStore(); + + // Store + sessionStorage.setItem('History.store',JSON.stringify(currentStore)); + }; + + // For Internet Explorer + History.intervalList.push(setInterval(History.onUnload,History.options.storeInterval)); + + // For Other Browsers + History.Adapter.bind(window,'beforeunload',History.onUnload); + History.Adapter.bind(window,'unload',History.onUnload); + + // Both are enabled for consistency + } + + // Non-Native pushState Implementation + if ( !History.emulated.pushState ) { + // Be aware, the following is only for native pushState implementations + // If you are wanting to include something for all browsers + // Then include it above this if block + + /** + * Setup Safari Fix + */ + if ( History.bugs.safariPoll ) { + History.intervalList.push(setInterval(History.safariStatePoll, History.options.safariPollInterval)); + } + + /** + * Ensure Cross Browser Compatibility + */ + if ( navigator.vendor === 'Apple Computer, Inc.' || (navigator.appCodeName||'') === 'Mozilla' ) { + /** + * Fix Safari HashChange Issue + */ + + // Setup Alias + History.Adapter.bind(window,'hashchange',function(){ + History.Adapter.trigger(window,'popstate'); + }); + + // Initialise Alias + if ( History.getHash() ) { + History.Adapter.onDomLoad(function(){ + History.Adapter.trigger(window,'hashchange'); + }); + } + } + + } // !History.emulated.pushState + + + }; // History.initCore + + // Try and Initialise History + History.init(); + +})(window); diff --git a/js/libraries/balupton-history/scripts/uncompressed/json2.js b/js/libraries/balupton-history/scripts/uncompressed/json2.js new file mode 100755 index 00000000..47bcc320 --- /dev/null +++ b/js/libraries/balupton-history/scripts/uncompressed/json2.js @@ -0,0 +1,480 @@ +/* + http://www.JSON.org/json2.js + 2011-01-18 + + Public Domain. + + NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK. + + See http://www.JSON.org/js.html + + + This code should be minified before deployment. + See http://javascript.crockford.com/jsmin.html + + USE YOUR OWN COPY. IT IS EXTREMELY UNWISE TO LOAD CODE FROM SERVERS YOU DO + NOT CONTROL. + + + This file creates a global JSON object containing two methods: stringify + and parse. + + JSON.stringify(value, replacer, space) + value any JavaScript value, usually an object or array. + + replacer an optional parameter that determines how object + values are stringified for objects. It can be a + function or an array of strings. + + space an optional parameter that specifies the indentation + of nested structures. If it is omitted, the text will + be packed without extra whitespace. If it is a number, + it will specify the number of spaces to indent at each + level. If it is a string (such as '\t' or ' '), + it contains the characters used to indent at each level. + + This method produces a JSON text from a JavaScript value. + + When an object value is found, if the object contains a toJSON + method, its toJSON method will be called and the result will be + stringified. A toJSON method does not serialize: it returns the + value represented by the name/value pair that should be serialized, + or undefined if nothing should be serialized. The toJSON method + will be passed the key associated with the value, and this will be + bound to the value + + For example, this would serialize Dates as ISO strings. + + Date.prototype.toJSON = function (key) { + function f(n) { + // Format integers to have at least two digits. + return n < 10 ? '0' + n : n; + } + + return this.getUTCFullYear() + '-' + + f(this.getUTCMonth() + 1) + '-' + + f(this.getUTCDate()) + 'T' + + f(this.getUTCHours()) + ':' + + f(this.getUTCMinutes()) + ':' + + f(this.getUTCSeconds()) + 'Z'; + }; + + You can provide an optional replacer method. It will be passed the + key and value of each member, with this bound to the containing + object. The value that is returned from your method will be + serialized. If your method returns undefined, then the member will + be excluded from the serialization. + + If the replacer parameter is an array of strings, then it will be + used to select the members to be serialized. It filters the results + such that only members with keys listed in the replacer array are + stringified. + + Values that do not have JSON representations, such as undefined or + functions, will not be serialized. Such values in objects will be + dropped; in arrays they will be replaced with null. You can use + a replacer function to replace those with JSON values. + JSON.stringify(undefined) returns undefined. + + The optional space parameter produces a stringification of the + value that is filled with line breaks and indentation to make it + easier to read. + + If the space parameter is a non-empty string, then that string will + be used for indentation. If the space parameter is a number, then + the indentation will be that many spaces. + + Example: + + text = JSON.stringify(['e', {pluribus: 'unum'}]); + // text is '["e",{"pluribus":"unum"}]' + + + text = JSON.stringify(['e', {pluribus: 'unum'}], null, '\t'); + // text is '[\n\t"e",\n\t{\n\t\t"pluribus": "unum"\n\t}\n]' + + text = JSON.stringify([new Date()], function (key, value) { + return this[key] instanceof Date ? + 'Date(' + this[key] + ')' : value; + }); + // text is '["Date(---current time---)"]' + + + JSON.parse(text, reviver) + This method parses a JSON text to produce an object or array. + It can throw a SyntaxError exception. + + The optional reviver parameter is a function that can filter and + transform the results. It receives each of the keys and values, + and its return value is used instead of the original value. + If it returns what it received, then the structure is not modified. + If it returns undefined then the member is deleted. + + Example: + + // Parse the text. Values that look like ISO date strings will + // be converted to Date objects. + + myData = JSON.parse(text, function (key, value) { + var a; + if (typeof value === 'string') { + a = +/^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*)?)Z$/.exec(value); + if (a) { + return new Date(Date.UTC(+a[1], +a[2] - 1, +a[3], +a[4], + +a[5], +a[6])); + } + } + return value; + }); + + myData = JSON.parse('["Date(09/09/2001)"]', function (key, value) { + var d; + if (typeof value === 'string' && + value.slice(0, 5) === 'Date(' && + value.slice(-1) === ')') { + d = new Date(value.slice(5, -1)); + if (d) { + return d; + } + } + return value; + }); + + + This is a reference implementation. You are free to copy, modify, or + redistribute. +*/ + +/*jslint evil: true, strict: false, regexp: false */ + +/*members "", "\b", "\t", "\n", "\f", "\r", "\"", JSON, "\\", apply, + call, charCodeAt, getUTCDate, getUTCFullYear, getUTCHours, + getUTCMinutes, getUTCMonth, getUTCSeconds, hasOwnProperty, join, + lastIndex, length, parse, prototype, push, replace, slice, stringify, + test, toJSON, toString, valueOf +*/ + + +// Create a JSON object only if one does not already exist. We create the +// methods in a closure to avoid creating global variables. + +if (!window.JSON) { + window.JSON = {}; +} + +(function () { + "use strict"; + + function f(n) { + // Format integers to have at least two digits. + return n < 10 ? '0' + n : n; + } + + if (typeof Date.prototype.toJSON !== 'function') { + + Date.prototype.toJSON = function (key) { + + return isFinite(this.valueOf()) ? + this.getUTCFullYear() + '-' + + f(this.getUTCMonth() + 1) + '-' + + f(this.getUTCDate()) + 'T' + + f(this.getUTCHours()) + ':' + + f(this.getUTCMinutes()) + ':' + + f(this.getUTCSeconds()) + 'Z' : null; + }; + + String.prototype.toJSON = + Number.prototype.toJSON = + Boolean.prototype.toJSON = function (key) { + return this.valueOf(); + }; + } + + var JSON = window.JSON, + cx = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g, + escapable = /[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g, + gap, + indent, + meta = { // table of character substitutions + '\b': '\\b', + '\t': '\\t', + '\n': '\\n', + '\f': '\\f', + '\r': '\\r', + '"' : '\\"', + '\\': '\\\\' + }, + rep; + + + function quote(string) { + +// If the string contains no control characters, no quote characters, and no +// backslash characters, then we can safely slap some quotes around it. +// Otherwise we must also replace the offending characters with safe escape +// sequences. + + escapable.lastIndex = 0; + return escapable.test(string) ? '"' + string.replace(escapable, function (a) { + var c = meta[a]; + return typeof c === 'string' ? c : + '\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4); + }) + '"' : '"' + string + '"'; + } + + + function str(key, holder) { + +// Produce a string from holder[key]. + + var i, // The loop counter. + k, // The member key. + v, // The member value. + length, + mind = gap, + partial, + value = holder[key]; + +// If the value has a toJSON method, call it to obtain a replacement value. + + if (value && typeof value === 'object' && + typeof value.toJSON === 'function') { + value = value.toJSON(key); + } + +// If we were called with a replacer function, then call the replacer to +// obtain a replacement value. + + if (typeof rep === 'function') { + value = rep.call(holder, key, value); + } + +// What happens next depends on the value's type. + + switch (typeof value) { + case 'string': + return quote(value); + + case 'number': + +// JSON numbers must be finite. Encode non-finite numbers as null. + + return isFinite(value) ? String(value) : 'null'; + + case 'boolean': + case 'null': + +// If the value is a boolean or null, convert it to a string. Note: +// typeof null does not produce 'null'. The case is included here in +// the remote chance that this gets fixed someday. + + return String(value); + +// If the type is 'object', we might be dealing with an object or an array or +// null. + + case 'object': + +// Due to a specification blunder in ECMAScript, typeof null is 'object', +// so watch out for that case. + + if (!value) { + return 'null'; + } + +// Make an array to hold the partial results of stringifying this object value. + + gap += indent; + partial = []; + +// Is the value an array? + + if (Object.prototype.toString.apply(value) === '[object Array]') { + +// The value is an array. Stringify every element. Use null as a placeholder +// for non-JSON values. + + length = value.length; + for (i = 0; i < length; i += 1) { + partial[i] = str(i, value) || 'null'; + } + +// Join all of the elements together, separated with commas, and wrap them in +// brackets. + + v = partial.length === 0 ? '[]' : gap ? + '[\n' + gap + partial.join(',\n' + gap) + '\n' + mind + ']' : + '[' + partial.join(',') + ']'; + gap = mind; + return v; + } + +// If the replacer is an array, use it to select the members to be stringified. + + if (rep && typeof rep === 'object') { + length = rep.length; + for (i = 0; i < length; i += 1) { + k = rep[i]; + if (typeof k === 'string') { + v = str(k, value); + if (v) { + partial.push(quote(k) + (gap ? ': ' : ':') + v); + } + } + } + } else { + +// Otherwise, iterate through all of the keys in the object. + + for (k in value) { + if (Object.hasOwnProperty.call(value, k)) { + v = str(k, value); + if (v) { + partial.push(quote(k) + (gap ? ': ' : ':') + v); + } + } + } + } + +// Join all of the member texts together, separated with commas, +// and wrap them in braces. + + v = partial.length === 0 ? '{}' : gap ? + '{\n' + gap + partial.join(',\n' + gap) + '\n' + mind + '}' : + '{' + partial.join(',') + '}'; + gap = mind; + return v; + } + } + +// If the JSON object does not yet have a stringify method, give it one. + + if (typeof JSON.stringify !== 'function') { + JSON.stringify = function (value, replacer, space) { + +// The stringify method takes a value and an optional replacer, and an optional +// space parameter, and returns a JSON text. The replacer can be a function +// that can replace values, or an array of strings that will select the keys. +// A default replacer method can be provided. Use of the space parameter can +// produce text that is more easily readable. + + var i; + gap = ''; + indent = ''; + +// If the space parameter is a number, make an indent string containing that +// many spaces. + + if (typeof space === 'number') { + for (i = 0; i < space; i += 1) { + indent += ' '; + } + +// If the space parameter is a string, it will be used as the indent string. + + } else if (typeof space === 'string') { + indent = space; + } + +// If there is a replacer, it must be a function or an array. +// Otherwise, throw an error. + + rep = replacer; + if (replacer && typeof replacer !== 'function' && + (typeof replacer !== 'object' || + typeof replacer.length !== 'number')) { + throw new Error('JSON.stringify'); + } + +// Make a fake root object containing our value under the key of ''. +// Return the result of stringifying the value. + + return str('', {'': value}); + }; + } + + +// If the JSON object does not yet have a parse method, give it one. + + if (typeof JSON.parse !== 'function') { + JSON.parse = function (text, reviver) { + +// The parse method takes a text and an optional reviver function, and returns +// a JavaScript value if the text is a valid JSON text. + + var j; + + function walk(holder, key) { + +// The walk method is used to recursively walk the resulting structure so +// that modifications can be made. + + var k, v, value = holder[key]; + if (value && typeof value === 'object') { + for (k in value) { + if (Object.hasOwnProperty.call(value, k)) { + v = walk(value, k); + if (v !== undefined) { + value[k] = v; + } else { + delete value[k]; + } + } + } + } + return reviver.call(holder, key, value); + } + + +// Parsing happens in four stages. In the first stage, we replace certain +// Unicode characters with escape sequences. JavaScript handles many characters +// incorrectly, either silently deleting them, or treating them as line endings. + + text = String(text); + cx.lastIndex = 0; + if (cx.test(text)) { + text = text.replace(cx, function (a) { + return '\\u' + + ('0000' + a.charCodeAt(0).toString(16)).slice(-4); + }); + } + +// In the second stage, we run the text against regular expressions that look +// for non-JSON patterns. We are especially concerned with '()' and 'new' +// because they can cause invocation, and '=' because it can cause mutation. +// But just to be safe, we want to reject all unexpected forms. + +// We split the second stage into 4 regexp operations in order to work around +// crippling inefficiencies in IE's and Safari's regexp engines. First we +// replace the JSON backslash pairs with '@' (a non-JSON character). Second, we +// replace all simple value tokens with ']' characters. Third, we delete all +// open brackets that follow a colon or comma or that begin the text. Finally, +// we look to see that the remaining characters are only whitespace or ']' or +// ',' or ':' or '{' or '}'. If that is so, then the text is safe for eval. + + if (/^[\],:{}\s]*$/ + .test(text.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, '@') + .replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']') + .replace(/(?:^|:|,)(?:\s*\[)+/g, ''))) { + +// In the third stage we use the eval function to compile the text into a +// JavaScript structure. The '{' operator is subject to a syntactic ambiguity +// in JavaScript: it can begin a block or an object literal. We wrap the text +// in parens to eliminate the ambiguity. + + j = eval('(' + text + ')'); + +// In the optional fourth stage, we recursively walk the new structure, passing +// each name/value pair to a reviver function for possible transformation. + + return typeof reviver === 'function' ? + walk({'': j}, '') : j; + } + +// If the text is not JSON parseable, then a SyntaxError is thrown. + + throw new SyntaxError('JSON.parse'); + }; + } +}()); diff --git a/js/libraries/balupton-history/tests.src/_header.php b/js/libraries/balupton-history/tests.src/_header.php new file mode 100755 index 00000000..9b085101 --- /dev/null +++ b/js/libraries/balupton-history/tests.src/_header.php @@ -0,0 +1,22 @@ + + + + History.js Test Suite + + + +

    History.js Test Suite

    +

    HTML5 Browsers must pass the HTML4+HTML5 tests

    +

    HTML4 Browsers must pass the HTML4 tests and should fail the HTML5 tests

    + '; + foreach ( $adapters as $adapter ) : + echo '
    '; + # Url + $url = "${browser}.${adapter}.html"; + + # Title + $Browser = ucwords($browser); + $Adapter = ucwords($adapter); + $title = "History.js ${Browser} ${Adapter} Test Suite"; + + # Render + ?>'; + endforeach; + echo '
    '; + endforeach; + ?> + + diff --git a/js/libraries/balupton-history/tests.src/each.php b/js/libraries/balupton-history/tests.src/each.php new file mode 100755 index 00000000..22f7b683 --- /dev/null +++ b/js/libraries/balupton-history/tests.src/each.php @@ -0,0 +1,51 @@ + + + + + + + + <?=$title?> + + + + + + + + + + + + + +

    +

    +
    +

    +
      +
      test markup
      + + + + + + + + + + \ No newline at end of file diff --git a/js/libraries/balupton-history/tests.src/index.php b/js/libraries/balupton-history/tests.src/index.php new file mode 100755 index 00000000..44495d3e --- /dev/null +++ b/js/libraries/balupton-history/tests.src/index.php @@ -0,0 +1,23 @@ +Tests diff --git a/js/libraries/balupton-history/tests/.htaccess b/js/libraries/balupton-history/tests/.htaccess new file mode 100755 index 00000000..2f7dbdde --- /dev/null +++ b/js/libraries/balupton-history/tests/.htaccess @@ -0,0 +1,13 @@ +Options +FollowSymlinks +RewriteEngine On + +# Clean Adapter +RewriteCond %{REQUEST_FILENAME} !-f +RewriteCond %{REQUEST_FILENAME} !-d +RewriteRule ([^\.]+)$ $1.html [NC,L,QSA] + +# Can someone smarter than me make it so: +# http://localhost/history.js/tests/uncompressed-html5-persistant-jquery +# Does not redirect to: +# http://localhost/history.js/tests/uncompressed-html5-persistant-jquery.html +# But still accesses that url diff --git a/js/libraries/balupton-history/tests/html4+html5.jquery.html b/js/libraries/balupton-history/tests/html4+html5.jquery.html new file mode 100755 index 00000000..a99b9569 --- /dev/null +++ b/js/libraries/balupton-history/tests/html4+html5.jquery.html @@ -0,0 +1,43 @@ + + + + + + + + History.js HTML4+HTML5 Jquery Test Suite + + + + + + + + + + + + + +

      History.js HTML4+HTML5 Jquery Test Suite

      +

      +
      +

      +
        +
        test markup
        + + + + + + + + + + \ No newline at end of file diff --git a/js/libraries/balupton-history/tests/html4+html5.mootools.html b/js/libraries/balupton-history/tests/html4+html5.mootools.html new file mode 100755 index 00000000..792f9752 --- /dev/null +++ b/js/libraries/balupton-history/tests/html4+html5.mootools.html @@ -0,0 +1,43 @@ + + + + + + + + History.js HTML4+HTML5 Mootools Test Suite + + + + + + + + + + + + + +

        History.js HTML4+HTML5 Mootools Test Suite

        +

        +
        +

        +
          +
          test markup
          + + + + + + + + + + \ No newline at end of file diff --git a/js/libraries/balupton-history/tests/html4+html5.native.html b/js/libraries/balupton-history/tests/html4+html5.native.html new file mode 100755 index 00000000..c4fd8522 --- /dev/null +++ b/js/libraries/balupton-history/tests/html4+html5.native.html @@ -0,0 +1,43 @@ + + + + + + + + History.js HTML4+HTML5 Native Test Suite + + + + + + + + + + + + + +

          History.js HTML4+HTML5 Native Test Suite

          +

          +
          +

          +
            +
            test markup
            + + + + + + + + + + \ No newline at end of file diff --git a/js/libraries/balupton-history/tests/html4+html5.right.html b/js/libraries/balupton-history/tests/html4+html5.right.html new file mode 100755 index 00000000..ae4fb036 --- /dev/null +++ b/js/libraries/balupton-history/tests/html4+html5.right.html @@ -0,0 +1,43 @@ + + + + + + + + History.js HTML4+HTML5 Right Test Suite + + + + + + + + + + + + + +

            History.js HTML4+HTML5 Right Test Suite

            +

            +
            +

            +
              +
              test markup
              + + + + + + + + + + \ No newline at end of file diff --git a/js/libraries/balupton-history/tests/html4+html5.zepto.html b/js/libraries/balupton-history/tests/html4+html5.zepto.html new file mode 100755 index 00000000..71a6b7c9 --- /dev/null +++ b/js/libraries/balupton-history/tests/html4+html5.zepto.html @@ -0,0 +1,43 @@ + + + + + + + + History.js HTML4+HTML5 Zepto Test Suite + + + + + + + + + + + + + +

              History.js HTML4+HTML5 Zepto Test Suite

              +

              +
              +

              +
                +
                test markup
                + + + + + + + + + + \ No newline at end of file diff --git a/js/libraries/balupton-history/tests/html5.jquery.html b/js/libraries/balupton-history/tests/html5.jquery.html new file mode 100755 index 00000000..977b8fed --- /dev/null +++ b/js/libraries/balupton-history/tests/html5.jquery.html @@ -0,0 +1,43 @@ + + + + + + + + History.js HTML5 Jquery Test Suite + + + + + + + + + + + + + +

                History.js HTML5 Jquery Test Suite

                +

                +
                +

                +
                  +
                  test markup
                  + + + + + + + + + + \ No newline at end of file diff --git a/js/libraries/balupton-history/tests/html5.mootools.html b/js/libraries/balupton-history/tests/html5.mootools.html new file mode 100755 index 00000000..30ee7892 --- /dev/null +++ b/js/libraries/balupton-history/tests/html5.mootools.html @@ -0,0 +1,43 @@ + + + + + + + + History.js HTML5 Mootools Test Suite + + + + + + + + + + + + + +

                  History.js HTML5 Mootools Test Suite

                  +

                  +
                  +

                  +
                    +
                    test markup
                    + + + + + + + + + + \ No newline at end of file diff --git a/js/libraries/balupton-history/tests/html5.native.html b/js/libraries/balupton-history/tests/html5.native.html new file mode 100755 index 00000000..8ffc4c34 --- /dev/null +++ b/js/libraries/balupton-history/tests/html5.native.html @@ -0,0 +1,43 @@ + + + + + + + + History.js HTML5 Native Test Suite + + + + + + + + + + + + + +

                    History.js HTML5 Native Test Suite

                    +

                    +
                    +

                    +
                      +
                      test markup
                      + + + + + + + + + + \ No newline at end of file diff --git a/js/libraries/balupton-history/tests/html5.right.html b/js/libraries/balupton-history/tests/html5.right.html new file mode 100755 index 00000000..7a2c08b5 --- /dev/null +++ b/js/libraries/balupton-history/tests/html5.right.html @@ -0,0 +1,43 @@ + + + + + + + + History.js HTML5 Right Test Suite + + + + + + + + + + + + + +

                      History.js HTML5 Right Test Suite

                      +

                      +
                      +

                      +
                        +
                        test markup
                        + + + + + + + + + + \ No newline at end of file diff --git a/js/libraries/balupton-history/tests/html5.zepto.html b/js/libraries/balupton-history/tests/html5.zepto.html new file mode 100755 index 00000000..d6657091 --- /dev/null +++ b/js/libraries/balupton-history/tests/html5.zepto.html @@ -0,0 +1,43 @@ + + + + + + + + History.js HTML5 Zepto Test Suite + + + + + + + + + + + + + +

                        History.js HTML5 Zepto Test Suite

                        +

                        +
                        +

                        +
                          +
                          test markup
                          + + + + + + + + + + \ No newline at end of file diff --git a/js/libraries/balupton-history/tests/image.php b/js/libraries/balupton-history/tests/image.php new file mode 100755 index 00000000..5e7bfc9e --- /dev/null +++ b/js/libraries/balupton-history/tests/image.php @@ -0,0 +1,3 @@ + + + + History.js Test Suite + + + +

                          History.js Test Suite

                          +

                          HTML5 Browsers must pass the HTML4+HTML5 tests

                          +

                          HTML4 Browsers must pass the HTML4 tests and should fail the HTML5 tests

                          + + diff --git a/js/libraries/balupton-history/tests/tests.js b/js/libraries/balupton-history/tests/tests.js new file mode 100755 index 00000000..47a16eeb --- /dev/null +++ b/js/libraries/balupton-history/tests/tests.js @@ -0,0 +1,254 @@ +(function(){ + +var + History = window.History, + document = window.document, + test = window.test, + same = window.same; + +// Check +if ( !History.enabled ) { + throw new Error('History.js is disabled'); +} + +// Prepare +History.options.debug = false; + +// Variables +var + States = { + // Home + 0: { + 'url': document.location.href.replace(/#.*$/,''), + 'title': '' + }, + // One + 1: { + 'data': { + 'state': 1, + 'rand': Math.random() + }, + 'title': 'State 1', + 'url': '?state=1' + }, + // Two + 2: { + 'data': { + 'state': 2, + 'rand': Math.random() + }, + 'title': 'State 2', + 'url': '?state=2&asd=%20asd%2520asd' + }, + // Three + 3: { + 'url': '?state=3' + }, + // Four + 4: { + 'data': { + 'state': 4, + 'trick': true, + 'rand': Math.random() + }, + 'title': 'State 4', + 'url': '?state=3' + }, + // Log + 5: { + 'url': '?state=1#log' + }, + // Six + 6: { + 'data': { + 'state': 6, + 'rand': Math.random() + }, + 'url': 'six.html' + }, + // Seven + 7: { + 'url': 'seven' + }, + // Eight + 8: { + 'url': '/eight' + } + }, + stateOrder = [0,1,2,3,4,3,1,0,1,3,4,3,1,0,6,7,8,1,8,7,6,0], + currentTest = 0; + +// Original Title +var title = document.title; + +var banner; + +var checkStatus = function(){ + banner = banner || document.getElementById('qunit-banner'); + var status = banner.className !== 'qunit-fail'; + return status; +}; + +// Check State +var checkState = function(){ + if ( !checkStatus() ) { + throw new Error('A test has failed'); + } + + var + stateIndex = stateOrder[currentTest], + expectedState = History.normalizeState(States[stateIndex]), + actualState = History.getState(false); + + ++currentTest; + + document.title = title+': '+actualState.url; + + var + testName = 'Test '+currentTest, + stateName = 'State '+stateIndex; + + test(testName,function(){ + History.log('Completed: '+testName +' / '+ stateName); + same(actualState,expectedState,stateName); + }); + + // Image Load to Stress Test Safari and Opera + (new Image()).src = "image.php"; +}; + +// Check the Initial State +checkState(); + +// State Change +History.Adapter.bind(window,'statechange',checkState); + +// Log +var addLog = function(){ + var args = arguments; + History.queue(function(){ + History.log.apply(History,args); + }); +}; + +// Dom Load +History.Adapter.onDomLoad(function(){ + setTimeout(function(){ + + // ---------------------------------------------------------------------- + // Test State Functionality: Adding + + // Test 2 / State 1 (0 -> 1) + // Tests HTML4 -> HTML5 Graceful Upgrade + addLog('Test 2',History.queues.length,History.busy.flag); + History.setHash(History.getHashByState(States[1])); + + // Test 3 / State 2 (1 -> 2) + addLog('Test 3',History.queues.length,History.busy.flag); + History.pushState(States[2].data, States[2].title, States[2].url); + + // Test 3-2 / State 2 (2 -> 2) / No Change + addLog('Test 3-2',History.queues.length,History.busy.flag); + History.pushState(States[2].data, States[2].title, States[2].url); + + // Test 3-3 / State 2 (2 -> 2) / No Change + addLog('Test 3-3',History.queues.length,History.busy.flag); + History.replaceState(States[2].data, States[2].title, States[2].url); + + // Test 4 / State 3 (2 -> 3) + addLog('Test 4',History.queues.length,History.busy.flag); + History.replaceState(States[3].data, States[3].title, States[3].url); + + // Test 5 / State 4 (3 -> 4) + addLog('Test 5',History.queues.length,History.busy.flag); + History.pushState(States[4].data, States[4].title, States[4].url); + + // ---------------------------------------------------------------------- + // Test State Functionality: Traversing + + // Test 6 / State 3 (4 -> 3) + // Test 7 / State 1 (3 -> 2 -> 1) + addLog('Test 6,7',History.queues.length,History.busy.flag); + History.go(-2); + + // Test 8 / State 0 (1 -> 0) + // Tests Default State + addLog('Test 8',History.queues.length,History.busy.flag); + History.back(); + + // Test 9 / State 1 (0 -> 1) + // Test 10 / State 3 (1 -> 2 -> 3) + addLog('Test 9,10',History.queues.length,History.busy.flag); + History.go(2); + + // Test 11 / State 4 (3 -> 4) + addLog('Test 11',History.queues.length,History.busy.flag); + History.forward(); + + // Test 12 / State 3 (4 -> 3) + addLog('Test 12',History.queues.length,History.busy.flag); + History.back(); + + // Test 13 / State 1 (3 -> 2 -> 1) + addLog('Test 13',History.queues.length,History.busy.flag); + History.back(); + + // ---------------------------------------------------------------------- + // Test State Functionality: Traditional Anchors + + // Test 13-2 / State 1 (1 -> #log) / No Change + addLog('Test 13-2',History.queues.length,History.busy.flag); + History.setHash('log'); + + // Test 13-3 / State 1 (#log -> 1) / No Change + addLog('Test 13-3',History.queues.length,History.busy.flag); + History.back(); + + // Test 14 / State 0 (1 -> 0) + addLog('Test 14',History.queues.length,History.busy.flag); + History.back(); + + // ---------------------------------------------------------------------- + // Test URL Handling: Adding + + // Test 15 / State 6 (1 -> 6) + // Also tests data with no title + addLog('Test 15',History.queues.length,History.busy.flag); + History.pushState(States[6].data, States[6].title, States[6].url); + + // Test 16 / State 7 (6 -> 7) + addLog('Test 16',History.queues.length,History.busy.flag); + History.pushState(States[7].data, States[7].title, States[7].url); + + // Test 17 / State 7 (7 -> 8) + addLog('Test 17',History.queues.length,History.busy.flag); + History.pushState(States[8].data, States[8].title, States[8].url); + + // Test 18 / State 1 (8 -> 1) + // Should be /eight?state=1 + addLog('Test 18',History.queues.length,History.busy.flag); + History.pushState(States[1].data, States[1].title, States[1].url); + + // ---------------------------------------------------------------------- + // Test URL Handling: Traversing + + // Test 19 / State 8 (1 -> 8) + addLog('Test 19',History.queues.length,History.busy.flag); + History.back(); + + // Test 20 / State 7 (8 -> 7) + addLog('Test 20',History.queues.length,History.busy.flag); + History.back(); + + // Test 21 / State 6 (7 -> 6) + addLog('Test 21',History.queues.length,History.busy.flag); + History.back(); + + // Test 22 / State 0 (6 -> 0) + addLog('Test 22',History.queues.length,History.busy.flag); + History.back(); + + },1000); // wait for test one to complete +}); + +})(); diff --git a/js/libraries/balupton-history/vendor/jquery.js b/js/libraries/balupton-history/vendor/jquery.js new file mode 100755 index 00000000..719e1d4e --- /dev/null +++ b/js/libraries/balupton-history/vendor/jquery.js @@ -0,0 +1,9046 @@ +/*! + * jQuery JavaScript Library v1.6.4 + * http://jquery.com/ + * + * Copyright 2011, John Resig + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * Includes Sizzle.js + * http://sizzlejs.com/ + * Copyright 2011, The Dojo Foundation + * Released under the MIT, BSD, and GPL Licenses. + * + * Date: Mon Sep 12 18:54:48 2011 -0400 + */ +(function( window, undefined ) { + +// Use the correct document accordingly with window argument (sandbox) +var document = window.document, + navigator = window.navigator, + location = window.location; +var jQuery = (function() { + +// Define a local copy of jQuery +var jQuery = function( selector, context ) { + // The jQuery object is actually just the init constructor 'enhanced' + return new jQuery.fn.init( selector, context, rootjQuery ); + }, + + // Map over jQuery in case of overwrite + _jQuery = window.jQuery, + + // Map over the $ in case of overwrite + _$ = window.$, + + // A central reference to the root jQuery(document) + rootjQuery, + + // A simple way to check for HTML strings or ID strings + // Prioritize #id over to avoid XSS via location.hash (#9521) + quickExpr = /^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/, + + // Check if a string has a non-whitespace character in it + rnotwhite = /\S/, + + // Used for trimming whitespace + trimLeft = /^\s+/, + trimRight = /\s+$/, + + // Check for digits + rdigit = /\d/, + + // Match a standalone tag + rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>)?$/, + + // JSON RegExp + rvalidchars = /^[\],:{}\s]*$/, + rvalidescape = /\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, + rvalidtokens = /"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, + rvalidbraces = /(?:^|:|,)(?:\s*\[)+/g, + + // Useragent RegExp + rwebkit = /(webkit)[ \/]([\w.]+)/, + ropera = /(opera)(?:.*version)?[ \/]([\w.]+)/, + rmsie = /(msie) ([\w.]+)/, + rmozilla = /(mozilla)(?:.*? rv:([\w.]+))?/, + + // Matches dashed string for camelizing + rdashAlpha = /-([a-z]|[0-9])/ig, + rmsPrefix = /^-ms-/, + + // Used by jQuery.camelCase as callback to replace() + fcamelCase = function( all, letter ) { + return ( letter + "" ).toUpperCase(); + }, + + // Keep a UserAgent string for use with jQuery.browser + userAgent = navigator.userAgent, + + // For matching the engine and version of the browser + browserMatch, + + // The deferred used on DOM ready + readyList, + + // The ready event handler + DOMContentLoaded, + + // Save a reference to some core methods + toString = Object.prototype.toString, + hasOwn = Object.prototype.hasOwnProperty, + push = Array.prototype.push, + slice = Array.prototype.slice, + trim = String.prototype.trim, + indexOf = Array.prototype.indexOf, + + // [[Class]] -> type pairs + class2type = {}; + +jQuery.fn = jQuery.prototype = { + constructor: jQuery, + init: function( selector, context, rootjQuery ) { + var match, elem, ret, doc; + + // Handle $(""), $(null), or $(undefined) + if ( !selector ) { + return this; + } + + // Handle $(DOMElement) + if ( selector.nodeType ) { + this.context = this[0] = selector; + this.length = 1; + return this; + } + + // The body element only exists once, optimize finding it + if ( selector === "body" && !context && document.body ) { + this.context = document; + this[0] = document.body; + this.selector = selector; + this.length = 1; + return this; + } + + // Handle HTML strings + if ( typeof selector === "string" ) { + // Are we dealing with HTML string or an ID? + if ( selector.charAt(0) === "<" && selector.charAt( selector.length - 1 ) === ">" && selector.length >= 3 ) { + // Assume that strings that start and end with <> are HTML and skip the regex check + match = [ null, selector, null ]; + + } else { + match = quickExpr.exec( selector ); + } + + // Verify a match, and that no context was specified for #id + if ( match && (match[1] || !context) ) { + + // HANDLE: $(html) -> $(array) + if ( match[1] ) { + context = context instanceof jQuery ? context[0] : context; + doc = (context ? context.ownerDocument || context : document); + + // If a single string is passed in and it's a single tag + // just do a createElement and skip the rest + ret = rsingleTag.exec( selector ); + + if ( ret ) { + if ( jQuery.isPlainObject( context ) ) { + selector = [ document.createElement( ret[1] ) ]; + jQuery.fn.attr.call( selector, context, true ); + + } else { + selector = [ doc.createElement( ret[1] ) ]; + } + + } else { + ret = jQuery.buildFragment( [ match[1] ], [ doc ] ); + selector = (ret.cacheable ? jQuery.clone(ret.fragment) : ret.fragment).childNodes; + } + + return jQuery.merge( this, selector ); + + // HANDLE: $("#id") + } else { + elem = document.getElementById( match[2] ); + + // Check parentNode to catch when Blackberry 4.6 returns + // nodes that are no longer in the document #6963 + if ( elem && elem.parentNode ) { + // Handle the case where IE and Opera return items + // by name instead of ID + if ( elem.id !== match[2] ) { + return rootjQuery.find( selector ); + } + + // Otherwise, we inject the element directly into the jQuery object + this.length = 1; + this[0] = elem; + } + + this.context = document; + this.selector = selector; + return this; + } + + // HANDLE: $(expr, $(...)) + } else if ( !context || context.jquery ) { + return (context || rootjQuery).find( selector ); + + // HANDLE: $(expr, context) + // (which is just equivalent to: $(context).find(expr) + } else { + return this.constructor( context ).find( selector ); + } + + // HANDLE: $(function) + // Shortcut for document ready + } else if ( jQuery.isFunction( selector ) ) { + return rootjQuery.ready( selector ); + } + + if (selector.selector !== undefined) { + this.selector = selector.selector; + this.context = selector.context; + } + + return jQuery.makeArray( selector, this ); + }, + + // Start with an empty selector + selector: "", + + // The current version of jQuery being used + jquery: "1.6.4", + + // The default length of a jQuery object is 0 + length: 0, + + // The number of elements contained in the matched element set + size: function() { + return this.length; + }, + + toArray: function() { + return slice.call( this, 0 ); + }, + + // Get the Nth element in the matched element set OR + // Get the whole matched element set as a clean array + get: function( num ) { + return num == null ? + + // Return a 'clean' array + this.toArray() : + + // Return just the object + ( num < 0 ? this[ this.length + num ] : this[ num ] ); + }, + + // Take an array of elements and push it onto the stack + // (returning the new matched element set) + pushStack: function( elems, name, selector ) { + // Build a new jQuery matched element set + var ret = this.constructor(); + + if ( jQuery.isArray( elems ) ) { + push.apply( ret, elems ); + + } else { + jQuery.merge( ret, elems ); + } + + // Add the old object onto the stack (as a reference) + ret.prevObject = this; + + ret.context = this.context; + + if ( name === "find" ) { + ret.selector = this.selector + (this.selector ? " " : "") + selector; + } else if ( name ) { + ret.selector = this.selector + "." + name + "(" + selector + ")"; + } + + // Return the newly-formed element set + return ret; + }, + + // Execute a callback for every element in the matched set. + // (You can seed the arguments with an array of args, but this is + // only used internally.) + each: function( callback, args ) { + return jQuery.each( this, callback, args ); + }, + + ready: function( fn ) { + // Attach the listeners + jQuery.bindReady(); + + // Add the callback + readyList.done( fn ); + + return this; + }, + + eq: function( i ) { + return i === -1 ? + this.slice( i ) : + this.slice( i, +i + 1 ); + }, + + first: function() { + return this.eq( 0 ); + }, + + last: function() { + return this.eq( -1 ); + }, + + slice: function() { + return this.pushStack( slice.apply( this, arguments ), + "slice", slice.call(arguments).join(",") ); + }, + + map: function( callback ) { + return this.pushStack( jQuery.map(this, function( elem, i ) { + return callback.call( elem, i, elem ); + })); + }, + + end: function() { + return this.prevObject || this.constructor(null); + }, + + // For internal use only. + // Behaves like an Array's method, not like a jQuery method. + push: push, + sort: [].sort, + splice: [].splice +}; + +// Give the init function the jQuery prototype for later instantiation +jQuery.fn.init.prototype = jQuery.fn; + +jQuery.extend = jQuery.fn.extend = function() { + var options, name, src, copy, copyIsArray, clone, + target = arguments[0] || {}, + i = 1, + length = arguments.length, + deep = false; + + // Handle a deep copy situation + if ( typeof target === "boolean" ) { + deep = target; + target = arguments[1] || {}; + // skip the boolean and the target + i = 2; + } + + // Handle case when target is a string or something (possible in deep copy) + if ( typeof target !== "object" && !jQuery.isFunction(target) ) { + target = {}; + } + + // extend jQuery itself if only one argument is passed + if ( length === i ) { + target = this; + --i; + } + + for ( ; i < length; i++ ) { + // Only deal with non-null/undefined values + if ( (options = arguments[ i ]) != null ) { + // Extend the base object + for ( name in options ) { + src = target[ name ]; + copy = options[ name ]; + + // Prevent never-ending loop + if ( target === copy ) { + continue; + } + + // Recurse if we're merging plain objects or arrays + if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) { + if ( copyIsArray ) { + copyIsArray = false; + clone = src && jQuery.isArray(src) ? src : []; + + } else { + clone = src && jQuery.isPlainObject(src) ? src : {}; + } + + // Never move original objects, clone them + target[ name ] = jQuery.extend( deep, clone, copy ); + + // Don't bring in undefined values + } else if ( copy !== undefined ) { + target[ name ] = copy; + } + } + } + } + + // Return the modified object + return target; +}; + +jQuery.extend({ + noConflict: function( deep ) { + if ( window.$ === jQuery ) { + window.$ = _$; + } + + if ( deep && window.jQuery === jQuery ) { + window.jQuery = _jQuery; + } + + return jQuery; + }, + + // Is the DOM ready to be used? Set to true once it occurs. + isReady: false, + + // A counter to track how many items to wait for before + // the ready event fires. See #6781 + readyWait: 1, + + // Hold (or release) the ready event + holdReady: function( hold ) { + if ( hold ) { + jQuery.readyWait++; + } else { + jQuery.ready( true ); + } + }, + + // Handle when the DOM is ready + ready: function( wait ) { + // Either a released hold or an DOMready/load event and not yet ready + if ( (wait === true && !--jQuery.readyWait) || (wait !== true && !jQuery.isReady) ) { + // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443). + if ( !document.body ) { + return setTimeout( jQuery.ready, 1 ); + } + + // Remember that the DOM is ready + jQuery.isReady = true; + + // If a normal DOM Ready event fired, decrement, and wait if need be + if ( wait !== true && --jQuery.readyWait > 0 ) { + return; + } + + // If there are functions bound, to execute + readyList.resolveWith( document, [ jQuery ] ); + + // Trigger any bound ready events + if ( jQuery.fn.trigger ) { + jQuery( document ).trigger( "ready" ).unbind( "ready" ); + } + } + }, + + bindReady: function() { + if ( readyList ) { + return; + } + + readyList = jQuery._Deferred(); + + // Catch cases where $(document).ready() is called after the + // browser event has already occurred. + if ( document.readyState === "complete" ) { + // Handle it asynchronously to allow scripts the opportunity to delay ready + return setTimeout( jQuery.ready, 1 ); + } + + // Mozilla, Opera and webkit nightlies currently support this event + if ( document.addEventListener ) { + // Use the handy event callback + document.addEventListener( "DOMContentLoaded", DOMContentLoaded, false ); + + // A fallback to window.onload, that will always work + window.addEventListener( "load", jQuery.ready, false ); + + // If IE event model is used + } else if ( document.attachEvent ) { + // ensure firing before onload, + // maybe late but safe also for iframes + document.attachEvent( "onreadystatechange", DOMContentLoaded ); + + // A fallback to window.onload, that will always work + window.attachEvent( "onload", jQuery.ready ); + + // If IE and not a frame + // continually check to see if the document is ready + var toplevel = false; + + try { + toplevel = window.frameElement == null; + } catch(e) {} + + if ( document.documentElement.doScroll && toplevel ) { + doScrollCheck(); + } + } + }, + + // See test/unit/core.js for details concerning isFunction. + // Since version 1.3, DOM methods and functions like alert + // aren't supported. They return false on IE (#2968). + isFunction: function( obj ) { + return jQuery.type(obj) === "function"; + }, + + isArray: Array.isArray || function( obj ) { + return jQuery.type(obj) === "array"; + }, + + // A crude way of determining if an object is a window + isWindow: function( obj ) { + return obj && typeof obj === "object" && "setInterval" in obj; + }, + + isNaN: function( obj ) { + return obj == null || !rdigit.test( obj ) || isNaN( obj ); + }, + + type: function( obj ) { + return obj == null ? + String( obj ) : + class2type[ toString.call(obj) ] || "object"; + }, + + isPlainObject: function( obj ) { + // Must be an Object. + // Because of IE, we also have to check the presence of the constructor property. + // Make sure that DOM nodes and window objects don't pass through, as well + if ( !obj || jQuery.type(obj) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) { + return false; + } + + try { + // Not own constructor property must be Object + if ( obj.constructor && + !hasOwn.call(obj, "constructor") && + !hasOwn.call(obj.constructor.prototype, "isPrototypeOf") ) { + return false; + } + } catch ( e ) { + // IE8,9 Will throw exceptions on certain host objects #9897 + return false; + } + + // Own properties are enumerated firstly, so to speed up, + // if last one is own, then all properties are own. + + var key; + for ( key in obj ) {} + + return key === undefined || hasOwn.call( obj, key ); + }, + + isEmptyObject: function( obj ) { + for ( var name in obj ) { + return false; + } + return true; + }, + + error: function( msg ) { + throw msg; + }, + + parseJSON: function( data ) { + if ( typeof data !== "string" || !data ) { + return null; + } + + // Make sure leading/trailing whitespace is removed (IE can't handle it) + data = jQuery.trim( data ); + + // Attempt to parse using the native JSON parser first + if ( window.JSON && window.JSON.parse ) { + return window.JSON.parse( data ); + } + + // Make sure the incoming data is actual JSON + // Logic borrowed from http://json.org/json2.js + if ( rvalidchars.test( data.replace( rvalidescape, "@" ) + .replace( rvalidtokens, "]" ) + .replace( rvalidbraces, "")) ) { + + return (new Function( "return " + data ))(); + + } + jQuery.error( "Invalid JSON: " + data ); + }, + + // Cross-browser xml parsing + parseXML: function( data ) { + var xml, tmp; + try { + if ( window.DOMParser ) { // Standard + tmp = new DOMParser(); + xml = tmp.parseFromString( data , "text/xml" ); + } else { // IE + xml = new ActiveXObject( "Microsoft.XMLDOM" ); + xml.async = "false"; + xml.loadXML( data ); + } + } catch( e ) { + xml = undefined; + } + if ( !xml || !xml.documentElement || xml.getElementsByTagName( "parsererror" ).length ) { + jQuery.error( "Invalid XML: " + data ); + } + return xml; + }, + + noop: function() {}, + + // Evaluates a script in a global context + // Workarounds based on findings by Jim Driscoll + // http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context + globalEval: function( data ) { + if ( data && rnotwhite.test( data ) ) { + // We use execScript on Internet Explorer + // We use an anonymous function so that context is window + // rather than jQuery in Firefox + ( window.execScript || function( data ) { + window[ "eval" ].call( window, data ); + } )( data ); + } + }, + + // Convert dashed to camelCase; used by the css and data modules + // Microsoft forgot to hump their vendor prefix (#9572) + camelCase: function( string ) { + return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase ); + }, + + nodeName: function( elem, name ) { + return elem.nodeName && elem.nodeName.toUpperCase() === name.toUpperCase(); + }, + + // args is for internal usage only + each: function( object, callback, args ) { + var name, i = 0, + length = object.length, + isObj = length === undefined || jQuery.isFunction( object ); + + if ( args ) { + if ( isObj ) { + for ( name in object ) { + if ( callback.apply( object[ name ], args ) === false ) { + break; + } + } + } else { + for ( ; i < length; ) { + if ( callback.apply( object[ i++ ], args ) === false ) { + break; + } + } + } + + // A special, fast, case for the most common use of each + } else { + if ( isObj ) { + for ( name in object ) { + if ( callback.call( object[ name ], name, object[ name ] ) === false ) { + break; + } + } + } else { + for ( ; i < length; ) { + if ( callback.call( object[ i ], i, object[ i++ ] ) === false ) { + break; + } + } + } + } + + return object; + }, + + // Use native String.trim function wherever possible + trim: trim ? + function( text ) { + return text == null ? + "" : + trim.call( text ); + } : + + // Otherwise use our own trimming functionality + function( text ) { + return text == null ? + "" : + text.toString().replace( trimLeft, "" ).replace( trimRight, "" ); + }, + + // results is for internal usage only + makeArray: function( array, results ) { + var ret = results || []; + + if ( array != null ) { + // The window, strings (and functions) also have 'length' + // The extra typeof function check is to prevent crashes + // in Safari 2 (See: #3039) + // Tweaked logic slightly to handle Blackberry 4.7 RegExp issues #6930 + var type = jQuery.type( array ); + + if ( array.length == null || type === "string" || type === "function" || type === "regexp" || jQuery.isWindow( array ) ) { + push.call( ret, array ); + } else { + jQuery.merge( ret, array ); + } + } + + return ret; + }, + + inArray: function( elem, array ) { + if ( !array ) { + return -1; + } + + if ( indexOf ) { + return indexOf.call( array, elem ); + } + + for ( var i = 0, length = array.length; i < length; i++ ) { + if ( array[ i ] === elem ) { + return i; + } + } + + return -1; + }, + + merge: function( first, second ) { + var i = first.length, + j = 0; + + if ( typeof second.length === "number" ) { + for ( var l = second.length; j < l; j++ ) { + first[ i++ ] = second[ j ]; + } + + } else { + while ( second[j] !== undefined ) { + first[ i++ ] = second[ j++ ]; + } + } + + first.length = i; + + return first; + }, + + grep: function( elems, callback, inv ) { + var ret = [], retVal; + inv = !!inv; + + // Go through the array, only saving the items + // that pass the validator function + for ( var i = 0, length = elems.length; i < length; i++ ) { + retVal = !!callback( elems[ i ], i ); + if ( inv !== retVal ) { + ret.push( elems[ i ] ); + } + } + + return ret; + }, + + // arg is for internal usage only + map: function( elems, callback, arg ) { + var value, key, ret = [], + i = 0, + length = elems.length, + // jquery objects are treated as arrays + isArray = elems instanceof jQuery || length !== undefined && typeof length === "number" && ( ( length > 0 && elems[ 0 ] && elems[ length -1 ] ) || length === 0 || jQuery.isArray( elems ) ) ; + + // Go through the array, translating each of the items to their + if ( isArray ) { + for ( ; i < length; i++ ) { + value = callback( elems[ i ], i, arg ); + + if ( value != null ) { + ret[ ret.length ] = value; + } + } + + // Go through every key on the object, + } else { + for ( key in elems ) { + value = callback( elems[ key ], key, arg ); + + if ( value != null ) { + ret[ ret.length ] = value; + } + } + } + + // Flatten any nested arrays + return ret.concat.apply( [], ret ); + }, + + // A global GUID counter for objects + guid: 1, + + // Bind a function to a context, optionally partially applying any + // arguments. + proxy: function( fn, context ) { + if ( typeof context === "string" ) { + var tmp = fn[ context ]; + context = fn; + fn = tmp; + } + + // Quick check to determine if target is callable, in the spec + // this throws a TypeError, but we will just return undefined. + if ( !jQuery.isFunction( fn ) ) { + return undefined; + } + + // Simulated bind + var args = slice.call( arguments, 2 ), + proxy = function() { + return fn.apply( context, args.concat( slice.call( arguments ) ) ); + }; + + // Set the guid of unique handler to the same of original handler, so it can be removed + proxy.guid = fn.guid = fn.guid || proxy.guid || jQuery.guid++; + + return proxy; + }, + + // Mutifunctional method to get and set values to a collection + // The value/s can optionally be executed if it's a function + access: function( elems, key, value, exec, fn, pass ) { + var length = elems.length; + + // Setting many attributes + if ( typeof key === "object" ) { + for ( var k in key ) { + jQuery.access( elems, k, key[k], exec, fn, value ); + } + return elems; + } + + // Setting one attribute + if ( value !== undefined ) { + // Optionally, function values get executed if exec is true + exec = !pass && exec && jQuery.isFunction(value); + + for ( var i = 0; i < length; i++ ) { + fn( elems[i], key, exec ? value.call( elems[i], i, fn( elems[i], key ) ) : value, pass ); + } + + return elems; + } + + // Getting an attribute + return length ? fn( elems[0], key ) : undefined; + }, + + now: function() { + return (new Date()).getTime(); + }, + + // Use of jQuery.browser is frowned upon. + // More details: http://docs.jquery.com/Utilities/jQuery.browser + uaMatch: function( ua ) { + ua = ua.toLowerCase(); + + var match = rwebkit.exec( ua ) || + ropera.exec( ua ) || + rmsie.exec( ua ) || + ua.indexOf("compatible") < 0 && rmozilla.exec( ua ) || + []; + + return { browser: match[1] || "", version: match[2] || "0" }; + }, + + sub: function() { + function jQuerySub( selector, context ) { + return new jQuerySub.fn.init( selector, context ); + } + jQuery.extend( true, jQuerySub, this ); + jQuerySub.superclass = this; + jQuerySub.fn = jQuerySub.prototype = this(); + jQuerySub.fn.constructor = jQuerySub; + jQuerySub.sub = this.sub; + jQuerySub.fn.init = function init( selector, context ) { + if ( context && context instanceof jQuery && !(context instanceof jQuerySub) ) { + context = jQuerySub( context ); + } + + return jQuery.fn.init.call( this, selector, context, rootjQuerySub ); + }; + jQuerySub.fn.init.prototype = jQuerySub.fn; + var rootjQuerySub = jQuerySub(document); + return jQuerySub; + }, + + browser: {} +}); + +// Populate the class2type map +jQuery.each("Boolean Number String Function Array Date RegExp Object".split(" "), function(i, name) { + class2type[ "[object " + name + "]" ] = name.toLowerCase(); +}); + +browserMatch = jQuery.uaMatch( userAgent ); +if ( browserMatch.browser ) { + jQuery.browser[ browserMatch.browser ] = true; + jQuery.browser.version = browserMatch.version; +} + +// Deprecated, use jQuery.browser.webkit instead +if ( jQuery.browser.webkit ) { + jQuery.browser.safari = true; +} + +// IE doesn't match non-breaking spaces with \s +if ( rnotwhite.test( "\xA0" ) ) { + trimLeft = /^[\s\xA0]+/; + trimRight = /[\s\xA0]+$/; +} + +// All jQuery objects should point back to these +rootjQuery = jQuery(document); + +// Cleanup functions for the document ready method +if ( document.addEventListener ) { + DOMContentLoaded = function() { + document.removeEventListener( "DOMContentLoaded", DOMContentLoaded, false ); + jQuery.ready(); + }; + +} else if ( document.attachEvent ) { + DOMContentLoaded = function() { + // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443). + if ( document.readyState === "complete" ) { + document.detachEvent( "onreadystatechange", DOMContentLoaded ); + jQuery.ready(); + } + }; +} + +// The DOM ready check for Internet Explorer +function doScrollCheck() { + if ( jQuery.isReady ) { + return; + } + + try { + // If IE is used, use the trick by Diego Perini + // http://javascript.nwbox.com/IEContentLoaded/ + document.documentElement.doScroll("left"); + } catch(e) { + setTimeout( doScrollCheck, 1 ); + return; + } + + // and execute any waiting functions + jQuery.ready(); +} + +return jQuery; + +})(); + + +var // Promise methods + promiseMethods = "done fail isResolved isRejected promise then always pipe".split( " " ), + // Static reference to slice + sliceDeferred = [].slice; + +jQuery.extend({ + // Create a simple deferred (one callbacks list) + _Deferred: function() { + var // callbacks list + callbacks = [], + // stored [ context , args ] + fired, + // to avoid firing when already doing so + firing, + // flag to know if the deferred has been cancelled + cancelled, + // the deferred itself + deferred = { + + // done( f1, f2, ...) + done: function() { + if ( !cancelled ) { + var args = arguments, + i, + length, + elem, + type, + _fired; + if ( fired ) { + _fired = fired; + fired = 0; + } + for ( i = 0, length = args.length; i < length; i++ ) { + elem = args[ i ]; + type = jQuery.type( elem ); + if ( type === "array" ) { + deferred.done.apply( deferred, elem ); + } else if ( type === "function" ) { + callbacks.push( elem ); + } + } + if ( _fired ) { + deferred.resolveWith( _fired[ 0 ], _fired[ 1 ] ); + } + } + return this; + }, + + // resolve with given context and args + resolveWith: function( context, args ) { + if ( !cancelled && !fired && !firing ) { + // make sure args are available (#8421) + args = args || []; + firing = 1; + try { + while( callbacks[ 0 ] ) { + callbacks.shift().apply( context, args ); + } + } + finally { + fired = [ context, args ]; + firing = 0; + } + } + return this; + }, + + // resolve with this as context and given arguments + resolve: function() { + deferred.resolveWith( this, arguments ); + return this; + }, + + // Has this deferred been resolved? + isResolved: function() { + return !!( firing || fired ); + }, + + // Cancel + cancel: function() { + cancelled = 1; + callbacks = []; + return this; + } + }; + + return deferred; + }, + + // Full fledged deferred (two callbacks list) + Deferred: function( func ) { + var deferred = jQuery._Deferred(), + failDeferred = jQuery._Deferred(), + promise; + // Add errorDeferred methods, then and promise + jQuery.extend( deferred, { + then: function( doneCallbacks, failCallbacks ) { + deferred.done( doneCallbacks ).fail( failCallbacks ); + return this; + }, + always: function() { + return deferred.done.apply( deferred, arguments ).fail.apply( this, arguments ); + }, + fail: failDeferred.done, + rejectWith: failDeferred.resolveWith, + reject: failDeferred.resolve, + isRejected: failDeferred.isResolved, + pipe: function( fnDone, fnFail ) { + return jQuery.Deferred(function( newDefer ) { + jQuery.each( { + done: [ fnDone, "resolve" ], + fail: [ fnFail, "reject" ] + }, function( handler, data ) { + var fn = data[ 0 ], + action = data[ 1 ], + returned; + if ( jQuery.isFunction( fn ) ) { + deferred[ handler ](function() { + returned = fn.apply( this, arguments ); + if ( returned && jQuery.isFunction( returned.promise ) ) { + returned.promise().then( newDefer.resolve, newDefer.reject ); + } else { + newDefer[ action + "With" ]( this === deferred ? newDefer : this, [ returned ] ); + } + }); + } else { + deferred[ handler ]( newDefer[ action ] ); + } + }); + }).promise(); + }, + // Get a promise for this deferred + // If obj is provided, the promise aspect is added to the object + promise: function( obj ) { + if ( obj == null ) { + if ( promise ) { + return promise; + } + promise = obj = {}; + } + var i = promiseMethods.length; + while( i-- ) { + obj[ promiseMethods[i] ] = deferred[ promiseMethods[i] ]; + } + return obj; + } + }); + // Make sure only one callback list will be used + deferred.done( failDeferred.cancel ).fail( deferred.cancel ); + // Unexpose cancel + delete deferred.cancel; + // Call given func if any + if ( func ) { + func.call( deferred, deferred ); + } + return deferred; + }, + + // Deferred helper + when: function( firstParam ) { + var args = arguments, + i = 0, + length = args.length, + count = length, + deferred = length <= 1 && firstParam && jQuery.isFunction( firstParam.promise ) ? + firstParam : + jQuery.Deferred(); + function resolveFunc( i ) { + return function( value ) { + args[ i ] = arguments.length > 1 ? sliceDeferred.call( arguments, 0 ) : value; + if ( !( --count ) ) { + // Strange bug in FF4: + // Values changed onto the arguments object sometimes end up as undefined values + // outside the $.when method. Cloning the object into a fresh array solves the issue + deferred.resolveWith( deferred, sliceDeferred.call( args, 0 ) ); + } + }; + } + if ( length > 1 ) { + for( ; i < length; i++ ) { + if ( args[ i ] && jQuery.isFunction( args[ i ].promise ) ) { + args[ i ].promise().then( resolveFunc(i), deferred.reject ); + } else { + --count; + } + } + if ( !count ) { + deferred.resolveWith( deferred, args ); + } + } else if ( deferred !== firstParam ) { + deferred.resolveWith( deferred, length ? [ firstParam ] : [] ); + } + return deferred.promise(); + } +}); + + + +jQuery.support = (function() { + + var div = document.createElement( "div" ), + documentElement = document.documentElement, + all, + a, + select, + opt, + input, + marginDiv, + support, + fragment, + body, + testElementParent, + testElement, + testElementStyle, + tds, + events, + eventName, + i, + isSupported; + + // Preliminary tests + div.setAttribute("className", "t"); + div.innerHTML = "
                          a"; + + + all = div.getElementsByTagName( "*" ); + a = div.getElementsByTagName( "a" )[ 0 ]; + + // Can't get basic test support + if ( !all || !all.length || !a ) { + return {}; + } + + // First batch of supports tests + select = document.createElement( "select" ); + opt = select.appendChild( document.createElement("option") ); + input = div.getElementsByTagName( "input" )[ 0 ]; + + support = { + // IE strips leading whitespace when .innerHTML is used + leadingWhitespace: ( div.firstChild.nodeType === 3 ), + + // Make sure that tbody elements aren't automatically inserted + // IE will insert them into empty tables + tbody: !div.getElementsByTagName( "tbody" ).length, + + // Make sure that link elements get serialized correctly by innerHTML + // This requires a wrapper element in IE + htmlSerialize: !!div.getElementsByTagName( "link" ).length, + + // Get the style information from getAttribute + // (IE uses .cssText instead) + style: /top/.test( a.getAttribute("style") ), + + // Make sure that URLs aren't manipulated + // (IE normalizes it by default) + hrefNormalized: ( a.getAttribute( "href" ) === "/a" ), + + // Make sure that element opacity exists + // (IE uses filter instead) + // Use a regex to work around a WebKit issue. See #5145 + opacity: /^0.55$/.test( a.style.opacity ), + + // Verify style float existence + // (IE uses styleFloat instead of cssFloat) + cssFloat: !!a.style.cssFloat, + + // Make sure that if no value is specified for a checkbox + // that it defaults to "on". + // (WebKit defaults to "" instead) + checkOn: ( input.value === "on" ), + + // Make sure that a selected-by-default option has a working selected property. + // (WebKit defaults to false instead of true, IE too, if it's in an optgroup) + optSelected: opt.selected, + + // Test setAttribute on camelCase class. If it works, we need attrFixes when doing get/setAttribute (ie6/7) + getSetAttribute: div.className !== "t", + + // Will be defined later + submitBubbles: true, + changeBubbles: true, + focusinBubbles: false, + deleteExpando: true, + noCloneEvent: true, + inlineBlockNeedsLayout: false, + shrinkWrapBlocks: false, + reliableMarginRight: true + }; + + // Make sure checked status is properly cloned + input.checked = true; + support.noCloneChecked = input.cloneNode( true ).checked; + + // Make sure that the options inside disabled selects aren't marked as disabled + // (WebKit marks them as disabled) + select.disabled = true; + support.optDisabled = !opt.disabled; + + // Test to see if it's possible to delete an expando from an element + // Fails in Internet Explorer + try { + delete div.test; + } catch( e ) { + support.deleteExpando = false; + } + + if ( !div.addEventListener && div.attachEvent && div.fireEvent ) { + div.attachEvent( "onclick", function() { + // Cloning a node shouldn't copy over any + // bound event handlers (IE does this) + support.noCloneEvent = false; + }); + div.cloneNode( true ).fireEvent( "onclick" ); + } + + // Check if a radio maintains it's value + // after being appended to the DOM + input = document.createElement("input"); + input.value = "t"; + input.setAttribute("type", "radio"); + support.radioValue = input.value === "t"; + + input.setAttribute("checked", "checked"); + div.appendChild( input ); + fragment = document.createDocumentFragment(); + fragment.appendChild( div.firstChild ); + + // WebKit doesn't clone checked state correctly in fragments + support.checkClone = fragment.cloneNode( true ).cloneNode( true ).lastChild.checked; + + div.innerHTML = ""; + + // Figure out if the W3C box model works as expected + div.style.width = div.style.paddingLeft = "1px"; + + body = document.getElementsByTagName( "body" )[ 0 ]; + // We use our own, invisible, body unless the body is already present + // in which case we use a div (#9239) + testElement = document.createElement( body ? "div" : "body" ); + testElementStyle = { + visibility: "hidden", + width: 0, + height: 0, + border: 0, + margin: 0, + background: "none" + }; + if ( body ) { + jQuery.extend( testElementStyle, { + position: "absolute", + left: "-1000px", + top: "-1000px" + }); + } + for ( i in testElementStyle ) { + testElement.style[ i ] = testElementStyle[ i ]; + } + testElement.appendChild( div ); + testElementParent = body || documentElement; + testElementParent.insertBefore( testElement, testElementParent.firstChild ); + + // Check if a disconnected checkbox will retain its checked + // value of true after appended to the DOM (IE6/7) + support.appendChecked = input.checked; + + support.boxModel = div.offsetWidth === 2; + + if ( "zoom" in div.style ) { + // Check if natively block-level elements act like inline-block + // elements when setting their display to 'inline' and giving + // them layout + // (IE < 8 does this) + div.style.display = "inline"; + div.style.zoom = 1; + support.inlineBlockNeedsLayout = ( div.offsetWidth === 2 ); + + // Check if elements with layout shrink-wrap their children + // (IE 6 does this) + div.style.display = ""; + div.innerHTML = "
                          "; + support.shrinkWrapBlocks = ( div.offsetWidth !== 2 ); + } + + div.innerHTML = "
                          t
                          "; + tds = div.getElementsByTagName( "td" ); + + // Check if table cells still have offsetWidth/Height when they are set + // to display:none and there are still other visible table cells in a + // table row; if so, offsetWidth/Height are not reliable for use when + // determining if an element has been hidden directly using + // display:none (it is still safe to use offsets if a parent element is + // hidden; don safety goggles and see bug #4512 for more information). + // (only IE 8 fails this test) + isSupported = ( tds[ 0 ].offsetHeight === 0 ); + + tds[ 0 ].style.display = ""; + tds[ 1 ].style.display = "none"; + + // Check if empty table cells still have offsetWidth/Height + // (IE < 8 fail this test) + support.reliableHiddenOffsets = isSupported && ( tds[ 0 ].offsetHeight === 0 ); + div.innerHTML = ""; + + // Check if div with explicit width and no margin-right incorrectly + // gets computed margin-right based on width of container. For more + // info see bug #3333 + // Fails in WebKit before Feb 2011 nightlies + // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right + if ( document.defaultView && document.defaultView.getComputedStyle ) { + marginDiv = document.createElement( "div" ); + marginDiv.style.width = "0"; + marginDiv.style.marginRight = "0"; + div.appendChild( marginDiv ); + support.reliableMarginRight = + ( parseInt( ( document.defaultView.getComputedStyle( marginDiv, null ) || { marginRight: 0 } ).marginRight, 10 ) || 0 ) === 0; + } + + // Remove the body element we added + testElement.innerHTML = ""; + testElementParent.removeChild( testElement ); + + // Technique from Juriy Zaytsev + // http://thinkweb2.com/projects/prototype/detecting-event-support-without-browser-sniffing/ + // We only care about the case where non-standard event systems + // are used, namely in IE. Short-circuiting here helps us to + // avoid an eval call (in setAttribute) which can cause CSP + // to go haywire. See: https://developer.mozilla.org/en/Security/CSP + if ( div.attachEvent ) { + for( i in { + submit: 1, + change: 1, + focusin: 1 + } ) { + eventName = "on" + i; + isSupported = ( eventName in div ); + if ( !isSupported ) { + div.setAttribute( eventName, "return;" ); + isSupported = ( typeof div[ eventName ] === "function" ); + } + support[ i + "Bubbles" ] = isSupported; + } + } + + // Null connected elements to avoid leaks in IE + testElement = fragment = select = opt = body = marginDiv = div = input = null; + + return support; +})(); + +// Keep track of boxModel +jQuery.boxModel = jQuery.support.boxModel; + + + + +var rbrace = /^(?:\{.*\}|\[.*\])$/, + rmultiDash = /([A-Z])/g; + +jQuery.extend({ + cache: {}, + + // Please use with caution + uuid: 0, + + // Unique for each copy of jQuery on the page + // Non-digits removed to match rinlinejQuery + expando: "jQuery" + ( jQuery.fn.jquery + Math.random() ).replace( /\D/g, "" ), + + // The following elements throw uncatchable exceptions if you + // attempt to add expando properties to them. + noData: { + "embed": true, + // Ban all objects except for Flash (which handle expandos) + "object": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000", + "applet": true + }, + + hasData: function( elem ) { + elem = elem.nodeType ? jQuery.cache[ elem[jQuery.expando] ] : elem[ jQuery.expando ]; + + return !!elem && !isEmptyDataObject( elem ); + }, + + data: function( elem, name, data, pvt /* Internal Use Only */ ) { + if ( !jQuery.acceptData( elem ) ) { + return; + } + + var thisCache, ret, + internalKey = jQuery.expando, + getByName = typeof name === "string", + + // We have to handle DOM nodes and JS objects differently because IE6-7 + // can't GC object references properly across the DOM-JS boundary + isNode = elem.nodeType, + + // Only DOM nodes need the global jQuery cache; JS object data is + // attached directly to the object so GC can occur automatically + cache = isNode ? jQuery.cache : elem, + + // Only defining an ID for JS objects if its cache already exists allows + // the code to shortcut on the same path as a DOM node with no cache + id = isNode ? elem[ jQuery.expando ] : elem[ jQuery.expando ] && jQuery.expando; + + // Avoid doing any more work than we need to when trying to get data on an + // object that has no data at all + if ( (!id || (pvt && id && (cache[ id ] && !cache[ id ][ internalKey ]))) && getByName && data === undefined ) { + return; + } + + if ( !id ) { + // Only DOM nodes need a new unique ID for each element since their data + // ends up in the global cache + if ( isNode ) { + elem[ jQuery.expando ] = id = ++jQuery.uuid; + } else { + id = jQuery.expando; + } + } + + if ( !cache[ id ] ) { + cache[ id ] = {}; + + // TODO: This is a hack for 1.5 ONLY. Avoids exposing jQuery + // metadata on plain JS objects when the object is serialized using + // JSON.stringify + if ( !isNode ) { + cache[ id ].toJSON = jQuery.noop; + } + } + + // An object can be passed to jQuery.data instead of a key/value pair; this gets + // shallow copied over onto the existing cache + if ( typeof name === "object" || typeof name === "function" ) { + if ( pvt ) { + cache[ id ][ internalKey ] = jQuery.extend(cache[ id ][ internalKey ], name); + } else { + cache[ id ] = jQuery.extend(cache[ id ], name); + } + } + + thisCache = cache[ id ]; + + // Internal jQuery data is stored in a separate object inside the object's data + // cache in order to avoid key collisions between internal data and user-defined + // data + if ( pvt ) { + if ( !thisCache[ internalKey ] ) { + thisCache[ internalKey ] = {}; + } + + thisCache = thisCache[ internalKey ]; + } + + if ( data !== undefined ) { + thisCache[ jQuery.camelCase( name ) ] = data; + } + + // TODO: This is a hack for 1.5 ONLY. It will be removed in 1.6. Users should + // not attempt to inspect the internal events object using jQuery.data, as this + // internal data object is undocumented and subject to change. + if ( name === "events" && !thisCache[name] ) { + return thisCache[ internalKey ] && thisCache[ internalKey ].events; + } + + // Check for both converted-to-camel and non-converted data property names + // If a data property was specified + if ( getByName ) { + + // First Try to find as-is property data + ret = thisCache[ name ]; + + // Test for null|undefined property data + if ( ret == null ) { + + // Try to find the camelCased property + ret = thisCache[ jQuery.camelCase( name ) ]; + } + } else { + ret = thisCache; + } + + return ret; + }, + + removeData: function( elem, name, pvt /* Internal Use Only */ ) { + if ( !jQuery.acceptData( elem ) ) { + return; + } + + var thisCache, + + // Reference to internal data cache key + internalKey = jQuery.expando, + + isNode = elem.nodeType, + + // See jQuery.data for more information + cache = isNode ? jQuery.cache : elem, + + // See jQuery.data for more information + id = isNode ? elem[ jQuery.expando ] : jQuery.expando; + + // If there is already no cache entry for this object, there is no + // purpose in continuing + if ( !cache[ id ] ) { + return; + } + + if ( name ) { + + thisCache = pvt ? cache[ id ][ internalKey ] : cache[ id ]; + + if ( thisCache ) { + + // Support interoperable removal of hyphenated or camelcased keys + if ( !thisCache[ name ] ) { + name = jQuery.camelCase( name ); + } + + delete thisCache[ name ]; + + // If there is no data left in the cache, we want to continue + // and let the cache object itself get destroyed + if ( !isEmptyDataObject(thisCache) ) { + return; + } + } + } + + // See jQuery.data for more information + if ( pvt ) { + delete cache[ id ][ internalKey ]; + + // Don't destroy the parent cache unless the internal data object + // had been the only thing left in it + if ( !isEmptyDataObject(cache[ id ]) ) { + return; + } + } + + var internalCache = cache[ id ][ internalKey ]; + + // Browsers that fail expando deletion also refuse to delete expandos on + // the window, but it will allow it on all other JS objects; other browsers + // don't care + // Ensure that `cache` is not a window object #10080 + if ( jQuery.support.deleteExpando || !cache.setInterval ) { + delete cache[ id ]; + } else { + cache[ id ] = null; + } + + // We destroyed the entire user cache at once because it's faster than + // iterating through each key, but we need to continue to persist internal + // data if it existed + if ( internalCache ) { + cache[ id ] = {}; + // TODO: This is a hack for 1.5 ONLY. Avoids exposing jQuery + // metadata on plain JS objects when the object is serialized using + // JSON.stringify + if ( !isNode ) { + cache[ id ].toJSON = jQuery.noop; + } + + cache[ id ][ internalKey ] = internalCache; + + // Otherwise, we need to eliminate the expando on the node to avoid + // false lookups in the cache for entries that no longer exist + } else if ( isNode ) { + // IE does not allow us to delete expando properties from nodes, + // nor does it have a removeAttribute function on Document nodes; + // we must handle all of these cases + if ( jQuery.support.deleteExpando ) { + delete elem[ jQuery.expando ]; + } else if ( elem.removeAttribute ) { + elem.removeAttribute( jQuery.expando ); + } else { + elem[ jQuery.expando ] = null; + } + } + }, + + // For internal use only. + _data: function( elem, name, data ) { + return jQuery.data( elem, name, data, true ); + }, + + // A method for determining if a DOM node can handle the data expando + acceptData: function( elem ) { + if ( elem.nodeName ) { + var match = jQuery.noData[ elem.nodeName.toLowerCase() ]; + + if ( match ) { + return !(match === true || elem.getAttribute("classid") !== match); + } + } + + return true; + } +}); + +jQuery.fn.extend({ + data: function( key, value ) { + var data = null; + + if ( typeof key === "undefined" ) { + if ( this.length ) { + data = jQuery.data( this[0] ); + + if ( this[0].nodeType === 1 ) { + var attr = this[0].attributes, name; + for ( var i = 0, l = attr.length; i < l; i++ ) { + name = attr[i].name; + + if ( name.indexOf( "data-" ) === 0 ) { + name = jQuery.camelCase( name.substring(5) ); + + dataAttr( this[0], name, data[ name ] ); + } + } + } + } + + return data; + + } else if ( typeof key === "object" ) { + return this.each(function() { + jQuery.data( this, key ); + }); + } + + var parts = key.split("."); + parts[1] = parts[1] ? "." + parts[1] : ""; + + if ( value === undefined ) { + data = this.triggerHandler("getData" + parts[1] + "!", [parts[0]]); + + // Try to fetch any internally stored data first + if ( data === undefined && this.length ) { + data = jQuery.data( this[0], key ); + data = dataAttr( this[0], key, data ); + } + + return data === undefined && parts[1] ? + this.data( parts[0] ) : + data; + + } else { + return this.each(function() { + var $this = jQuery( this ), + args = [ parts[0], value ]; + + $this.triggerHandler( "setData" + parts[1] + "!", args ); + jQuery.data( this, key, value ); + $this.triggerHandler( "changeData" + parts[1] + "!", args ); + }); + } + }, + + removeData: function( key ) { + return this.each(function() { + jQuery.removeData( this, key ); + }); + } +}); + +function dataAttr( elem, key, data ) { + // If nothing was found internally, try to fetch any + // data from the HTML5 data-* attribute + if ( data === undefined && elem.nodeType === 1 ) { + + var name = "data-" + key.replace( rmultiDash, "-$1" ).toLowerCase(); + + data = elem.getAttribute( name ); + + if ( typeof data === "string" ) { + try { + data = data === "true" ? true : + data === "false" ? false : + data === "null" ? null : + !jQuery.isNaN( data ) ? parseFloat( data ) : + rbrace.test( data ) ? jQuery.parseJSON( data ) : + data; + } catch( e ) {} + + // Make sure we set the data so it isn't changed later + jQuery.data( elem, key, data ); + + } else { + data = undefined; + } + } + + return data; +} + +// TODO: This is a hack for 1.5 ONLY to allow objects with a single toJSON +// property to be considered empty objects; this property always exists in +// order to make sure JSON.stringify does not expose internal metadata +function isEmptyDataObject( obj ) { + for ( var name in obj ) { + if ( name !== "toJSON" ) { + return false; + } + } + + return true; +} + + + + +function handleQueueMarkDefer( elem, type, src ) { + var deferDataKey = type + "defer", + queueDataKey = type + "queue", + markDataKey = type + "mark", + defer = jQuery.data( elem, deferDataKey, undefined, true ); + if ( defer && + ( src === "queue" || !jQuery.data( elem, queueDataKey, undefined, true ) ) && + ( src === "mark" || !jQuery.data( elem, markDataKey, undefined, true ) ) ) { + // Give room for hard-coded callbacks to fire first + // and eventually mark/queue something else on the element + setTimeout( function() { + if ( !jQuery.data( elem, queueDataKey, undefined, true ) && + !jQuery.data( elem, markDataKey, undefined, true ) ) { + jQuery.removeData( elem, deferDataKey, true ); + defer.resolve(); + } + }, 0 ); + } +} + +jQuery.extend({ + + _mark: function( elem, type ) { + if ( elem ) { + type = (type || "fx") + "mark"; + jQuery.data( elem, type, (jQuery.data(elem,type,undefined,true) || 0) + 1, true ); + } + }, + + _unmark: function( force, elem, type ) { + if ( force !== true ) { + type = elem; + elem = force; + force = false; + } + if ( elem ) { + type = type || "fx"; + var key = type + "mark", + count = force ? 0 : ( (jQuery.data( elem, key, undefined, true) || 1 ) - 1 ); + if ( count ) { + jQuery.data( elem, key, count, true ); + } else { + jQuery.removeData( elem, key, true ); + handleQueueMarkDefer( elem, type, "mark" ); + } + } + }, + + queue: function( elem, type, data ) { + if ( elem ) { + type = (type || "fx") + "queue"; + var q = jQuery.data( elem, type, undefined, true ); + // Speed up dequeue by getting out quickly if this is just a lookup + if ( data ) { + if ( !q || jQuery.isArray(data) ) { + q = jQuery.data( elem, type, jQuery.makeArray(data), true ); + } else { + q.push( data ); + } + } + return q || []; + } + }, + + dequeue: function( elem, type ) { + type = type || "fx"; + + var queue = jQuery.queue( elem, type ), + fn = queue.shift(), + defer; + + // If the fx queue is dequeued, always remove the progress sentinel + if ( fn === "inprogress" ) { + fn = queue.shift(); + } + + if ( fn ) { + // Add a progress sentinel to prevent the fx queue from being + // automatically dequeued + if ( type === "fx" ) { + queue.unshift("inprogress"); + } + + fn.call(elem, function() { + jQuery.dequeue(elem, type); + }); + } + + if ( !queue.length ) { + jQuery.removeData( elem, type + "queue", true ); + handleQueueMarkDefer( elem, type, "queue" ); + } + } +}); + +jQuery.fn.extend({ + queue: function( type, data ) { + if ( typeof type !== "string" ) { + data = type; + type = "fx"; + } + + if ( data === undefined ) { + return jQuery.queue( this[0], type ); + } + return this.each(function() { + var queue = jQuery.queue( this, type, data ); + + if ( type === "fx" && queue[0] !== "inprogress" ) { + jQuery.dequeue( this, type ); + } + }); + }, + dequeue: function( type ) { + return this.each(function() { + jQuery.dequeue( this, type ); + }); + }, + // Based off of the plugin by Clint Helfers, with permission. + // http://blindsignals.com/index.php/2009/07/jquery-delay/ + delay: function( time, type ) { + time = jQuery.fx ? jQuery.fx.speeds[time] || time : time; + type = type || "fx"; + + return this.queue( type, function() { + var elem = this; + setTimeout(function() { + jQuery.dequeue( elem, type ); + }, time ); + }); + }, + clearQueue: function( type ) { + return this.queue( type || "fx", [] ); + }, + // Get a promise resolved when queues of a certain type + // are emptied (fx is the type by default) + promise: function( type, object ) { + if ( typeof type !== "string" ) { + object = type; + type = undefined; + } + type = type || "fx"; + var defer = jQuery.Deferred(), + elements = this, + i = elements.length, + count = 1, + deferDataKey = type + "defer", + queueDataKey = type + "queue", + markDataKey = type + "mark", + tmp; + function resolve() { + if ( !( --count ) ) { + defer.resolveWith( elements, [ elements ] ); + } + } + while( i-- ) { + if (( tmp = jQuery.data( elements[ i ], deferDataKey, undefined, true ) || + ( jQuery.data( elements[ i ], queueDataKey, undefined, true ) || + jQuery.data( elements[ i ], markDataKey, undefined, true ) ) && + jQuery.data( elements[ i ], deferDataKey, jQuery._Deferred(), true ) )) { + count++; + tmp.done( resolve ); + } + } + resolve(); + return defer.promise(); + } +}); + + + + +var rclass = /[\n\t\r]/g, + rspace = /\s+/, + rreturn = /\r/g, + rtype = /^(?:button|input)$/i, + rfocusable = /^(?:button|input|object|select|textarea)$/i, + rclickable = /^a(?:rea)?$/i, + rboolean = /^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i, + nodeHook, boolHook; + +jQuery.fn.extend({ + attr: function( name, value ) { + return jQuery.access( this, name, value, true, jQuery.attr ); + }, + + removeAttr: function( name ) { + return this.each(function() { + jQuery.removeAttr( this, name ); + }); + }, + + prop: function( name, value ) { + return jQuery.access( this, name, value, true, jQuery.prop ); + }, + + removeProp: function( name ) { + name = jQuery.propFix[ name ] || name; + return this.each(function() { + // try/catch handles cases where IE balks (such as removing a property on window) + try { + this[ name ] = undefined; + delete this[ name ]; + } catch( e ) {} + }); + }, + + addClass: function( value ) { + var classNames, i, l, elem, + setClass, c, cl; + + if ( jQuery.isFunction( value ) ) { + return this.each(function( j ) { + jQuery( this ).addClass( value.call(this, j, this.className) ); + }); + } + + if ( value && typeof value === "string" ) { + classNames = value.split( rspace ); + + for ( i = 0, l = this.length; i < l; i++ ) { + elem = this[ i ]; + + if ( elem.nodeType === 1 ) { + if ( !elem.className && classNames.length === 1 ) { + elem.className = value; + + } else { + setClass = " " + elem.className + " "; + + for ( c = 0, cl = classNames.length; c < cl; c++ ) { + if ( !~setClass.indexOf( " " + classNames[ c ] + " " ) ) { + setClass += classNames[ c ] + " "; + } + } + elem.className = jQuery.trim( setClass ); + } + } + } + } + + return this; + }, + + removeClass: function( value ) { + var classNames, i, l, elem, className, c, cl; + + if ( jQuery.isFunction( value ) ) { + return this.each(function( j ) { + jQuery( this ).removeClass( value.call(this, j, this.className) ); + }); + } + + if ( (value && typeof value === "string") || value === undefined ) { + classNames = (value || "").split( rspace ); + + for ( i = 0, l = this.length; i < l; i++ ) { + elem = this[ i ]; + + if ( elem.nodeType === 1 && elem.className ) { + if ( value ) { + className = (" " + elem.className + " ").replace( rclass, " " ); + for ( c = 0, cl = classNames.length; c < cl; c++ ) { + className = className.replace(" " + classNames[ c ] + " ", " "); + } + elem.className = jQuery.trim( className ); + + } else { + elem.className = ""; + } + } + } + } + + return this; + }, + + toggleClass: function( value, stateVal ) { + var type = typeof value, + isBool = typeof stateVal === "boolean"; + + if ( jQuery.isFunction( value ) ) { + return this.each(function( i ) { + jQuery( this ).toggleClass( value.call(this, i, this.className, stateVal), stateVal ); + }); + } + + return this.each(function() { + if ( type === "string" ) { + // toggle individual class names + var className, + i = 0, + self = jQuery( this ), + state = stateVal, + classNames = value.split( rspace ); + + while ( (className = classNames[ i++ ]) ) { + // check each className given, space seperated list + state = isBool ? state : !self.hasClass( className ); + self[ state ? "addClass" : "removeClass" ]( className ); + } + + } else if ( type === "undefined" || type === "boolean" ) { + if ( this.className ) { + // store className if set + jQuery._data( this, "__className__", this.className ); + } + + // toggle whole className + this.className = this.className || value === false ? "" : jQuery._data( this, "__className__" ) || ""; + } + }); + }, + + hasClass: function( selector ) { + var className = " " + selector + " "; + for ( var i = 0, l = this.length; i < l; i++ ) { + if ( this[i].nodeType === 1 && (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) > -1 ) { + return true; + } + } + + return false; + }, + + val: function( value ) { + var hooks, ret, + elem = this[0]; + + if ( !arguments.length ) { + if ( elem ) { + hooks = jQuery.valHooks[ elem.nodeName.toLowerCase() ] || jQuery.valHooks[ elem.type ]; + + if ( hooks && "get" in hooks && (ret = hooks.get( elem, "value" )) !== undefined ) { + return ret; + } + + ret = elem.value; + + return typeof ret === "string" ? + // handle most common string cases + ret.replace(rreturn, "") : + // handle cases where value is null/undef or number + ret == null ? "" : ret; + } + + return undefined; + } + + var isFunction = jQuery.isFunction( value ); + + return this.each(function( i ) { + var self = jQuery(this), val; + + if ( this.nodeType !== 1 ) { + return; + } + + if ( isFunction ) { + val = value.call( this, i, self.val() ); + } else { + val = value; + } + + // Treat null/undefined as ""; convert numbers to string + if ( val == null ) { + val = ""; + } else if ( typeof val === "number" ) { + val += ""; + } else if ( jQuery.isArray( val ) ) { + val = jQuery.map(val, function ( value ) { + return value == null ? "" : value + ""; + }); + } + + hooks = jQuery.valHooks[ this.nodeName.toLowerCase() ] || jQuery.valHooks[ this.type ]; + + // If set returns undefined, fall back to normal setting + if ( !hooks || !("set" in hooks) || hooks.set( this, val, "value" ) === undefined ) { + this.value = val; + } + }); + } +}); + +jQuery.extend({ + valHooks: { + option: { + get: function( elem ) { + // attributes.value is undefined in Blackberry 4.7 but + // uses .value. See #6932 + var val = elem.attributes.value; + return !val || val.specified ? elem.value : elem.text; + } + }, + select: { + get: function( elem ) { + var value, + index = elem.selectedIndex, + values = [], + options = elem.options, + one = elem.type === "select-one"; + + // Nothing was selected + if ( index < 0 ) { + return null; + } + + // Loop through all the selected options + for ( var i = one ? index : 0, max = one ? index + 1 : options.length; i < max; i++ ) { + var option = options[ i ]; + + // Don't return options that are disabled or in a disabled optgroup + if ( option.selected && (jQuery.support.optDisabled ? !option.disabled : option.getAttribute("disabled") === null) && + (!option.parentNode.disabled || !jQuery.nodeName( option.parentNode, "optgroup" )) ) { + + // Get the specific value for the option + value = jQuery( option ).val(); + + // We don't need an array for one selects + if ( one ) { + return value; + } + + // Multi-Selects return an array + values.push( value ); + } + } + + // Fixes Bug #2551 -- select.val() broken in IE after form.reset() + if ( one && !values.length && options.length ) { + return jQuery( options[ index ] ).val(); + } + + return values; + }, + + set: function( elem, value ) { + var values = jQuery.makeArray( value ); + + jQuery(elem).find("option").each(function() { + this.selected = jQuery.inArray( jQuery(this).val(), values ) >= 0; + }); + + if ( !values.length ) { + elem.selectedIndex = -1; + } + return values; + } + } + }, + + attrFn: { + val: true, + css: true, + html: true, + text: true, + data: true, + width: true, + height: true, + offset: true + }, + + attrFix: { + // Always normalize to ensure hook usage + tabindex: "tabIndex" + }, + + attr: function( elem, name, value, pass ) { + var nType = elem.nodeType; + + // don't get/set attributes on text, comment and attribute nodes + if ( !elem || nType === 3 || nType === 8 || nType === 2 ) { + return undefined; + } + + if ( pass && name in jQuery.attrFn ) { + return jQuery( elem )[ name ]( value ); + } + + // Fallback to prop when attributes are not supported + if ( !("getAttribute" in elem) ) { + return jQuery.prop( elem, name, value ); + } + + var ret, hooks, + notxml = nType !== 1 || !jQuery.isXMLDoc( elem ); + + // Normalize the name if needed + if ( notxml ) { + name = jQuery.attrFix[ name ] || name; + + hooks = jQuery.attrHooks[ name ]; + + if ( !hooks ) { + // Use boolHook for boolean attributes + if ( rboolean.test( name ) ) { + hooks = boolHook; + + // Use nodeHook if available( IE6/7 ) + } else if ( nodeHook ) { + hooks = nodeHook; + } + } + } + + if ( value !== undefined ) { + + if ( value === null ) { + jQuery.removeAttr( elem, name ); + return undefined; + + } else if ( hooks && "set" in hooks && notxml && (ret = hooks.set( elem, value, name )) !== undefined ) { + return ret; + + } else { + elem.setAttribute( name, "" + value ); + return value; + } + + } else if ( hooks && "get" in hooks && notxml && (ret = hooks.get( elem, name )) !== null ) { + return ret; + + } else { + + ret = elem.getAttribute( name ); + + // Non-existent attributes return null, we normalize to undefined + return ret === null ? + undefined : + ret; + } + }, + + removeAttr: function( elem, name ) { + var propName; + if ( elem.nodeType === 1 ) { + name = jQuery.attrFix[ name ] || name; + + jQuery.attr( elem, name, "" ); + elem.removeAttribute( name ); + + // Set corresponding property to false for boolean attributes + if ( rboolean.test( name ) && (propName = jQuery.propFix[ name ] || name) in elem ) { + elem[ propName ] = false; + } + } + }, + + attrHooks: { + type: { + set: function( elem, value ) { + // We can't allow the type property to be changed (since it causes problems in IE) + if ( rtype.test( elem.nodeName ) && elem.parentNode ) { + jQuery.error( "type property can't be changed" ); + } else if ( !jQuery.support.radioValue && value === "radio" && jQuery.nodeName(elem, "input") ) { + // Setting the type on a radio button after the value resets the value in IE6-9 + // Reset value to it's default in case type is set after value + // This is for element creation + var val = elem.value; + elem.setAttribute( "type", value ); + if ( val ) { + elem.value = val; + } + return value; + } + } + }, + // Use the value property for back compat + // Use the nodeHook for button elements in IE6/7 (#1954) + value: { + get: function( elem, name ) { + if ( nodeHook && jQuery.nodeName( elem, "button" ) ) { + return nodeHook.get( elem, name ); + } + return name in elem ? + elem.value : + null; + }, + set: function( elem, value, name ) { + if ( nodeHook && jQuery.nodeName( elem, "button" ) ) { + return nodeHook.set( elem, value, name ); + } + // Does not return so that setAttribute is also used + elem.value = value; + } + } + }, + + propFix: { + tabindex: "tabIndex", + readonly: "readOnly", + "for": "htmlFor", + "class": "className", + maxlength: "maxLength", + cellspacing: "cellSpacing", + cellpadding: "cellPadding", + rowspan: "rowSpan", + colspan: "colSpan", + usemap: "useMap", + frameborder: "frameBorder", + contenteditable: "contentEditable" + }, + + prop: function( elem, name, value ) { + var nType = elem.nodeType; + + // don't get/set properties on text, comment and attribute nodes + if ( !elem || nType === 3 || nType === 8 || nType === 2 ) { + return undefined; + } + + var ret, hooks, + notxml = nType !== 1 || !jQuery.isXMLDoc( elem ); + + if ( notxml ) { + // Fix name and attach hooks + name = jQuery.propFix[ name ] || name; + hooks = jQuery.propHooks[ name ]; + } + + if ( value !== undefined ) { + if ( hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) { + return ret; + + } else { + return (elem[ name ] = value); + } + + } else { + if ( hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ) { + return ret; + + } else { + return elem[ name ]; + } + } + }, + + propHooks: { + tabIndex: { + get: function( elem ) { + // elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set + // http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/ + var attributeNode = elem.getAttributeNode("tabindex"); + + return attributeNode && attributeNode.specified ? + parseInt( attributeNode.value, 10 ) : + rfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ? + 0 : + undefined; + } + } + } +}); + +// Add the tabindex propHook to attrHooks for back-compat +jQuery.attrHooks.tabIndex = jQuery.propHooks.tabIndex; + +// Hook for boolean attributes +boolHook = { + get: function( elem, name ) { + // Align boolean attributes with corresponding properties + // Fall back to attribute presence where some booleans are not supported + var attrNode; + return jQuery.prop( elem, name ) === true || ( attrNode = elem.getAttributeNode( name ) ) && attrNode.nodeValue !== false ? + name.toLowerCase() : + undefined; + }, + set: function( elem, value, name ) { + var propName; + if ( value === false ) { + // Remove boolean attributes when set to false + jQuery.removeAttr( elem, name ); + } else { + // value is true since we know at this point it's type boolean and not false + // Set boolean attributes to the same name and set the DOM property + propName = jQuery.propFix[ name ] || name; + if ( propName in elem ) { + // Only set the IDL specifically if it already exists on the element + elem[ propName ] = true; + } + + elem.setAttribute( name, name.toLowerCase() ); + } + return name; + } +}; + +// IE6/7 do not support getting/setting some attributes with get/setAttribute +if ( !jQuery.support.getSetAttribute ) { + + // Use this for any attribute in IE6/7 + // This fixes almost every IE6/7 issue + nodeHook = jQuery.valHooks.button = { + get: function( elem, name ) { + var ret; + ret = elem.getAttributeNode( name ); + // Return undefined if nodeValue is empty string + return ret && ret.nodeValue !== "" ? + ret.nodeValue : + undefined; + }, + set: function( elem, value, name ) { + // Set the existing or create a new attribute node + var ret = elem.getAttributeNode( name ); + if ( !ret ) { + ret = document.createAttribute( name ); + elem.setAttributeNode( ret ); + } + return (ret.nodeValue = value + ""); + } + }; + + // Set width and height to auto instead of 0 on empty string( Bug #8150 ) + // This is for removals + jQuery.each([ "width", "height" ], function( i, name ) { + jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], { + set: function( elem, value ) { + if ( value === "" ) { + elem.setAttribute( name, "auto" ); + return value; + } + } + }); + }); +} + + +// Some attributes require a special call on IE +if ( !jQuery.support.hrefNormalized ) { + jQuery.each([ "href", "src", "width", "height" ], function( i, name ) { + jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], { + get: function( elem ) { + var ret = elem.getAttribute( name, 2 ); + return ret === null ? undefined : ret; + } + }); + }); +} + +if ( !jQuery.support.style ) { + jQuery.attrHooks.style = { + get: function( elem ) { + // Return undefined in the case of empty string + // Normalize to lowercase since IE uppercases css property names + return elem.style.cssText.toLowerCase() || undefined; + }, + set: function( elem, value ) { + return (elem.style.cssText = "" + value); + } + }; +} + +// Safari mis-reports the default selected property of an option +// Accessing the parent's selectedIndex property fixes it +if ( !jQuery.support.optSelected ) { + jQuery.propHooks.selected = jQuery.extend( jQuery.propHooks.selected, { + get: function( elem ) { + var parent = elem.parentNode; + + if ( parent ) { + parent.selectedIndex; + + // Make sure that it also works with optgroups, see #5701 + if ( parent.parentNode ) { + parent.parentNode.selectedIndex; + } + } + return null; + } + }); +} + +// Radios and checkboxes getter/setter +if ( !jQuery.support.checkOn ) { + jQuery.each([ "radio", "checkbox" ], function() { + jQuery.valHooks[ this ] = { + get: function( elem ) { + // Handle the case where in Webkit "" is returned instead of "on" if a value isn't specified + return elem.getAttribute("value") === null ? "on" : elem.value; + } + }; + }); +} +jQuery.each([ "radio", "checkbox" ], function() { + jQuery.valHooks[ this ] = jQuery.extend( jQuery.valHooks[ this ], { + set: function( elem, value ) { + if ( jQuery.isArray( value ) ) { + return (elem.checked = jQuery.inArray( jQuery(elem).val(), value ) >= 0); + } + } + }); +}); + + + + +var rnamespaces = /\.(.*)$/, + rformElems = /^(?:textarea|input|select)$/i, + rperiod = /\./g, + rspaces = / /g, + rescape = /[^\w\s.|`]/g, + fcleanup = function( nm ) { + return nm.replace(rescape, "\\$&"); + }; + +/* + * A number of helper functions used for managing events. + * Many of the ideas behind this code originated from + * Dean Edwards' addEvent library. + */ +jQuery.event = { + + // Bind an event to an element + // Original by Dean Edwards + add: function( elem, types, handler, data ) { + if ( elem.nodeType === 3 || elem.nodeType === 8 ) { + return; + } + + if ( handler === false ) { + handler = returnFalse; + } else if ( !handler ) { + // Fixes bug #7229. Fix recommended by jdalton + return; + } + + var handleObjIn, handleObj; + + if ( handler.handler ) { + handleObjIn = handler; + handler = handleObjIn.handler; + } + + // Make sure that the function being executed has a unique ID + if ( !handler.guid ) { + handler.guid = jQuery.guid++; + } + + // Init the element's event structure + var elemData = jQuery._data( elem ); + + // If no elemData is found then we must be trying to bind to one of the + // banned noData elements + if ( !elemData ) { + return; + } + + var events = elemData.events, + eventHandle = elemData.handle; + + if ( !events ) { + elemData.events = events = {}; + } + + if ( !eventHandle ) { + elemData.handle = eventHandle = function( e ) { + // Discard the second event of a jQuery.event.trigger() and + // when an event is called after a page has unloaded + return typeof jQuery !== "undefined" && (!e || jQuery.event.triggered !== e.type) ? + jQuery.event.handle.apply( eventHandle.elem, arguments ) : + undefined; + }; + } + + // Add elem as a property of the handle function + // This is to prevent a memory leak with non-native events in IE. + eventHandle.elem = elem; + + // Handle multiple events separated by a space + // jQuery(...).bind("mouseover mouseout", fn); + types = types.split(" "); + + var type, i = 0, namespaces; + + while ( (type = types[ i++ ]) ) { + handleObj = handleObjIn ? + jQuery.extend({}, handleObjIn) : + { handler: handler, data: data }; + + // Namespaced event handlers + if ( type.indexOf(".") > -1 ) { + namespaces = type.split("."); + type = namespaces.shift(); + handleObj.namespace = namespaces.slice(0).sort().join("."); + + } else { + namespaces = []; + handleObj.namespace = ""; + } + + handleObj.type = type; + if ( !handleObj.guid ) { + handleObj.guid = handler.guid; + } + + // Get the current list of functions bound to this event + var handlers = events[ type ], + special = jQuery.event.special[ type ] || {}; + + // Init the event handler queue + if ( !handlers ) { + handlers = events[ type ] = []; + + // Check for a special event handler + // Only use addEventListener/attachEvent if the special + // events handler returns false + if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) { + // Bind the global event handler to the element + if ( elem.addEventListener ) { + elem.addEventListener( type, eventHandle, false ); + + } else if ( elem.attachEvent ) { + elem.attachEvent( "on" + type, eventHandle ); + } + } + } + + if ( special.add ) { + special.add.call( elem, handleObj ); + + if ( !handleObj.handler.guid ) { + handleObj.handler.guid = handler.guid; + } + } + + // Add the function to the element's handler list + handlers.push( handleObj ); + + // Keep track of which events have been used, for event optimization + jQuery.event.global[ type ] = true; + } + + // Nullify elem to prevent memory leaks in IE + elem = null; + }, + + global: {}, + + // Detach an event or set of events from an element + remove: function( elem, types, handler, pos ) { + // don't do events on text and comment nodes + if ( elem.nodeType === 3 || elem.nodeType === 8 ) { + return; + } + + if ( handler === false ) { + handler = returnFalse; + } + + var ret, type, fn, j, i = 0, all, namespaces, namespace, special, eventType, handleObj, origType, + elemData = jQuery.hasData( elem ) && jQuery._data( elem ), + events = elemData && elemData.events; + + if ( !elemData || !events ) { + return; + } + + // types is actually an event object here + if ( types && types.type ) { + handler = types.handler; + types = types.type; + } + + // Unbind all events for the element + if ( !types || typeof types === "string" && types.charAt(0) === "." ) { + types = types || ""; + + for ( type in events ) { + jQuery.event.remove( elem, type + types ); + } + + return; + } + + // Handle multiple events separated by a space + // jQuery(...).unbind("mouseover mouseout", fn); + types = types.split(" "); + + while ( (type = types[ i++ ]) ) { + origType = type; + handleObj = null; + all = type.indexOf(".") < 0; + namespaces = []; + + if ( !all ) { + // Namespaced event handlers + namespaces = type.split("."); + type = namespaces.shift(); + + namespace = new RegExp("(^|\\.)" + + jQuery.map( namespaces.slice(0).sort(), fcleanup ).join("\\.(?:.*\\.)?") + "(\\.|$)"); + } + + eventType = events[ type ]; + + if ( !eventType ) { + continue; + } + + if ( !handler ) { + for ( j = 0; j < eventType.length; j++ ) { + handleObj = eventType[ j ]; + + if ( all || namespace.test( handleObj.namespace ) ) { + jQuery.event.remove( elem, origType, handleObj.handler, j ); + eventType.splice( j--, 1 ); + } + } + + continue; + } + + special = jQuery.event.special[ type ] || {}; + + for ( j = pos || 0; j < eventType.length; j++ ) { + handleObj = eventType[ j ]; + + if ( handler.guid === handleObj.guid ) { + // remove the given handler for the given type + if ( all || namespace.test( handleObj.namespace ) ) { + if ( pos == null ) { + eventType.splice( j--, 1 ); + } + + if ( special.remove ) { + special.remove.call( elem, handleObj ); + } + } + + if ( pos != null ) { + break; + } + } + } + + // remove generic event handler if no more handlers exist + if ( eventType.length === 0 || pos != null && eventType.length === 1 ) { + if ( !special.teardown || special.teardown.call( elem, namespaces ) === false ) { + jQuery.removeEvent( elem, type, elemData.handle ); + } + + ret = null; + delete events[ type ]; + } + } + + // Remove the expando if it's no longer used + if ( jQuery.isEmptyObject( events ) ) { + var handle = elemData.handle; + if ( handle ) { + handle.elem = null; + } + + delete elemData.events; + delete elemData.handle; + + if ( jQuery.isEmptyObject( elemData ) ) { + jQuery.removeData( elem, undefined, true ); + } + } + }, + + // Events that are safe to short-circuit if no handlers are attached. + // Native DOM events should not be added, they may have inline handlers. + customEvent: { + "getData": true, + "setData": true, + "changeData": true + }, + + trigger: function( event, data, elem, onlyHandlers ) { + // Event object or event type + var type = event.type || event, + namespaces = [], + exclusive; + + if ( type.indexOf("!") >= 0 ) { + // Exclusive events trigger only for the exact event (no namespaces) + type = type.slice(0, -1); + exclusive = true; + } + + if ( type.indexOf(".") >= 0 ) { + // Namespaced trigger; create a regexp to match event type in handle() + namespaces = type.split("."); + type = namespaces.shift(); + namespaces.sort(); + } + + if ( (!elem || jQuery.event.customEvent[ type ]) && !jQuery.event.global[ type ] ) { + // No jQuery handlers for this event type, and it can't have inline handlers + return; + } + + // Caller can pass in an Event, Object, or just an event type string + event = typeof event === "object" ? + // jQuery.Event object + event[ jQuery.expando ] ? event : + // Object literal + new jQuery.Event( type, event ) : + // Just the event type (string) + new jQuery.Event( type ); + + event.type = type; + event.exclusive = exclusive; + event.namespace = namespaces.join("."); + event.namespace_re = new RegExp("(^|\\.)" + namespaces.join("\\.(?:.*\\.)?") + "(\\.|$)"); + + // triggerHandler() and global events don't bubble or run the default action + if ( onlyHandlers || !elem ) { + event.preventDefault(); + event.stopPropagation(); + } + + // Handle a global trigger + if ( !elem ) { + // TODO: Stop taunting the data cache; remove global events and always attach to document + jQuery.each( jQuery.cache, function() { + // internalKey variable is just used to make it easier to find + // and potentially change this stuff later; currently it just + // points to jQuery.expando + var internalKey = jQuery.expando, + internalCache = this[ internalKey ]; + if ( internalCache && internalCache.events && internalCache.events[ type ] ) { + jQuery.event.trigger( event, data, internalCache.handle.elem ); + } + }); + return; + } + + // Don't do events on text and comment nodes + if ( elem.nodeType === 3 || elem.nodeType === 8 ) { + return; + } + + // Clean up the event in case it is being reused + event.result = undefined; + event.target = elem; + + // Clone any incoming data and prepend the event, creating the handler arg list + data = data != null ? jQuery.makeArray( data ) : []; + data.unshift( event ); + + var cur = elem, + // IE doesn't like method names with a colon (#3533, #8272) + ontype = type.indexOf(":") < 0 ? "on" + type : ""; + + // Fire event on the current element, then bubble up the DOM tree + do { + var handle = jQuery._data( cur, "handle" ); + + event.currentTarget = cur; + if ( handle ) { + handle.apply( cur, data ); + } + + // Trigger an inline bound script + if ( ontype && jQuery.acceptData( cur ) && cur[ ontype ] && cur[ ontype ].apply( cur, data ) === false ) { + event.result = false; + event.preventDefault(); + } + + // Bubble up to document, then to window + cur = cur.parentNode || cur.ownerDocument || cur === event.target.ownerDocument && window; + } while ( cur && !event.isPropagationStopped() ); + + // If nobody prevented the default action, do it now + if ( !event.isDefaultPrevented() ) { + var old, + special = jQuery.event.special[ type ] || {}; + + if ( (!special._default || special._default.call( elem.ownerDocument, event ) === false) && + !(type === "click" && jQuery.nodeName( elem, "a" )) && jQuery.acceptData( elem ) ) { + + // Call a native DOM method on the target with the same name name as the event. + // Can't use an .isFunction)() check here because IE6/7 fails that test. + // IE<9 dies on focus to hidden element (#1486), may want to revisit a try/catch. + try { + if ( ontype && elem[ type ] ) { + // Don't re-trigger an onFOO event when we call its FOO() method + old = elem[ ontype ]; + + if ( old ) { + elem[ ontype ] = null; + } + + jQuery.event.triggered = type; + elem[ type ](); + } + } catch ( ieError ) {} + + if ( old ) { + elem[ ontype ] = old; + } + + jQuery.event.triggered = undefined; + } + } + + return event.result; + }, + + handle: function( event ) { + event = jQuery.event.fix( event || window.event ); + // Snapshot the handlers list since a called handler may add/remove events. + var handlers = ((jQuery._data( this, "events" ) || {})[ event.type ] || []).slice(0), + run_all = !event.exclusive && !event.namespace, + args = Array.prototype.slice.call( arguments, 0 ); + + // Use the fix-ed Event rather than the (read-only) native event + args[0] = event; + event.currentTarget = this; + + for ( var j = 0, l = handlers.length; j < l; j++ ) { + var handleObj = handlers[ j ]; + + // Triggered event must 1) be non-exclusive and have no namespace, or + // 2) have namespace(s) a subset or equal to those in the bound event. + if ( run_all || event.namespace_re.test( handleObj.namespace ) ) { + // Pass in a reference to the handler function itself + // So that we can later remove it + event.handler = handleObj.handler; + event.data = handleObj.data; + event.handleObj = handleObj; + + var ret = handleObj.handler.apply( this, args ); + + if ( ret !== undefined ) { + event.result = ret; + if ( ret === false ) { + event.preventDefault(); + event.stopPropagation(); + } + } + + if ( event.isImmediatePropagationStopped() ) { + break; + } + } + } + return event.result; + }, + + props: "altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode layerX layerY metaKey newValue offsetX offsetY pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "), + + fix: function( event ) { + if ( event[ jQuery.expando ] ) { + return event; + } + + // store a copy of the original event object + // and "clone" to set read-only properties + var originalEvent = event; + event = jQuery.Event( originalEvent ); + + for ( var i = this.props.length, prop; i; ) { + prop = this.props[ --i ]; + event[ prop ] = originalEvent[ prop ]; + } + + // Fix target property, if necessary + if ( !event.target ) { + // Fixes #1925 where srcElement might not be defined either + event.target = event.srcElement || document; + } + + // check if target is a textnode (safari) + if ( event.target.nodeType === 3 ) { + event.target = event.target.parentNode; + } + + // Add relatedTarget, if necessary + if ( !event.relatedTarget && event.fromElement ) { + event.relatedTarget = event.fromElement === event.target ? event.toElement : event.fromElement; + } + + // Calculate pageX/Y if missing and clientX/Y available + if ( event.pageX == null && event.clientX != null ) { + var eventDocument = event.target.ownerDocument || document, + doc = eventDocument.documentElement, + body = eventDocument.body; + + event.pageX = event.clientX + (doc && doc.scrollLeft || body && body.scrollLeft || 0) - (doc && doc.clientLeft || body && body.clientLeft || 0); + event.pageY = event.clientY + (doc && doc.scrollTop || body && body.scrollTop || 0) - (doc && doc.clientTop || body && body.clientTop || 0); + } + + // Add which for key events + if ( event.which == null && (event.charCode != null || event.keyCode != null) ) { + event.which = event.charCode != null ? event.charCode : event.keyCode; + } + + // Add metaKey to non-Mac browsers (use ctrl for PC's and Meta for Macs) + if ( !event.metaKey && event.ctrlKey ) { + event.metaKey = event.ctrlKey; + } + + // Add which for click: 1 === left; 2 === middle; 3 === right + // Note: button is not normalized, so don't use it + if ( !event.which && event.button !== undefined ) { + event.which = (event.button & 1 ? 1 : ( event.button & 2 ? 3 : ( event.button & 4 ? 2 : 0 ) )); + } + + return event; + }, + + // Deprecated, use jQuery.guid instead + guid: 1E8, + + // Deprecated, use jQuery.proxy instead + proxy: jQuery.proxy, + + special: { + ready: { + // Make sure the ready event is setup + setup: jQuery.bindReady, + teardown: jQuery.noop + }, + + live: { + add: function( handleObj ) { + jQuery.event.add( this, + liveConvert( handleObj.origType, handleObj.selector ), + jQuery.extend({}, handleObj, {handler: liveHandler, guid: handleObj.handler.guid}) ); + }, + + remove: function( handleObj ) { + jQuery.event.remove( this, liveConvert( handleObj.origType, handleObj.selector ), handleObj ); + } + }, + + beforeunload: { + setup: function( data, namespaces, eventHandle ) { + // We only want to do this special case on windows + if ( jQuery.isWindow( this ) ) { + this.onbeforeunload = eventHandle; + } + }, + + teardown: function( namespaces, eventHandle ) { + if ( this.onbeforeunload === eventHandle ) { + this.onbeforeunload = null; + } + } + } + } +}; + +jQuery.removeEvent = document.removeEventListener ? + function( elem, type, handle ) { + if ( elem.removeEventListener ) { + elem.removeEventListener( type, handle, false ); + } + } : + function( elem, type, handle ) { + if ( elem.detachEvent ) { + elem.detachEvent( "on" + type, handle ); + } + }; + +jQuery.Event = function( src, props ) { + // Allow instantiation without the 'new' keyword + if ( !this.preventDefault ) { + return new jQuery.Event( src, props ); + } + + // Event object + if ( src && src.type ) { + this.originalEvent = src; + this.type = src.type; + + // Events bubbling up the document may have been marked as prevented + // by a handler lower down the tree; reflect the correct value. + this.isDefaultPrevented = (src.defaultPrevented || src.returnValue === false || + src.getPreventDefault && src.getPreventDefault()) ? returnTrue : returnFalse; + + // Event type + } else { + this.type = src; + } + + // Put explicitly provided properties onto the event object + if ( props ) { + jQuery.extend( this, props ); + } + + // timeStamp is buggy for some events on Firefox(#3843) + // So we won't rely on the native value + this.timeStamp = jQuery.now(); + + // Mark it as fixed + this[ jQuery.expando ] = true; +}; + +function returnFalse() { + return false; +} +function returnTrue() { + return true; +} + +// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding +// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html +jQuery.Event.prototype = { + preventDefault: function() { + this.isDefaultPrevented = returnTrue; + + var e = this.originalEvent; + if ( !e ) { + return; + } + + // if preventDefault exists run it on the original event + if ( e.preventDefault ) { + e.preventDefault(); + + // otherwise set the returnValue property of the original event to false (IE) + } else { + e.returnValue = false; + } + }, + stopPropagation: function() { + this.isPropagationStopped = returnTrue; + + var e = this.originalEvent; + if ( !e ) { + return; + } + // if stopPropagation exists run it on the original event + if ( e.stopPropagation ) { + e.stopPropagation(); + } + // otherwise set the cancelBubble property of the original event to true (IE) + e.cancelBubble = true; + }, + stopImmediatePropagation: function() { + this.isImmediatePropagationStopped = returnTrue; + this.stopPropagation(); + }, + isDefaultPrevented: returnFalse, + isPropagationStopped: returnFalse, + isImmediatePropagationStopped: returnFalse +}; + +// Checks if an event happened on an element within another element +// Used in jQuery.event.special.mouseenter and mouseleave handlers +var withinElement = function( event ) { + + // Check if mouse(over|out) are still within the same parent element + var related = event.relatedTarget, + inside = false, + eventType = event.type; + + event.type = event.data; + + if ( related !== this ) { + + if ( related ) { + inside = jQuery.contains( this, related ); + } + + if ( !inside ) { + + jQuery.event.handle.apply( this, arguments ); + + event.type = eventType; + } + } +}, + +// In case of event delegation, we only need to rename the event.type, +// liveHandler will take care of the rest. +delegate = function( event ) { + event.type = event.data; + jQuery.event.handle.apply( this, arguments ); +}; + +// Create mouseenter and mouseleave events +jQuery.each({ + mouseenter: "mouseover", + mouseleave: "mouseout" +}, function( orig, fix ) { + jQuery.event.special[ orig ] = { + setup: function( data ) { + jQuery.event.add( this, fix, data && data.selector ? delegate : withinElement, orig ); + }, + teardown: function( data ) { + jQuery.event.remove( this, fix, data && data.selector ? delegate : withinElement ); + } + }; +}); + +// submit delegation +if ( !jQuery.support.submitBubbles ) { + + jQuery.event.special.submit = { + setup: function( data, namespaces ) { + if ( !jQuery.nodeName( this, "form" ) ) { + jQuery.event.add(this, "click.specialSubmit", function( e ) { + // Avoid triggering error on non-existent type attribute in IE VML (#7071) + var elem = e.target, + type = jQuery.nodeName( elem, "input" ) || jQuery.nodeName( elem, "button" ) ? elem.type : ""; + + if ( (type === "submit" || type === "image") && jQuery( elem ).closest("form").length ) { + trigger( "submit", this, arguments ); + } + }); + + jQuery.event.add(this, "keypress.specialSubmit", function( e ) { + var elem = e.target, + type = jQuery.nodeName( elem, "input" ) || jQuery.nodeName( elem, "button" ) ? elem.type : ""; + + if ( (type === "text" || type === "password") && jQuery( elem ).closest("form").length && e.keyCode === 13 ) { + trigger( "submit", this, arguments ); + } + }); + + } else { + return false; + } + }, + + teardown: function( namespaces ) { + jQuery.event.remove( this, ".specialSubmit" ); + } + }; + +} + +// change delegation, happens here so we have bind. +if ( !jQuery.support.changeBubbles ) { + + var changeFilters, + + getVal = function( elem ) { + var type = jQuery.nodeName( elem, "input" ) ? elem.type : "", + val = elem.value; + + if ( type === "radio" || type === "checkbox" ) { + val = elem.checked; + + } else if ( type === "select-multiple" ) { + val = elem.selectedIndex > -1 ? + jQuery.map( elem.options, function( elem ) { + return elem.selected; + }).join("-") : + ""; + + } else if ( jQuery.nodeName( elem, "select" ) ) { + val = elem.selectedIndex; + } + + return val; + }, + + testChange = function testChange( e ) { + var elem = e.target, data, val; + + if ( !rformElems.test( elem.nodeName ) || elem.readOnly ) { + return; + } + + data = jQuery._data( elem, "_change_data" ); + val = getVal(elem); + + // the current data will be also retrieved by beforeactivate + if ( e.type !== "focusout" || elem.type !== "radio" ) { + jQuery._data( elem, "_change_data", val ); + } + + if ( data === undefined || val === data ) { + return; + } + + if ( data != null || val ) { + e.type = "change"; + e.liveFired = undefined; + jQuery.event.trigger( e, arguments[1], elem ); + } + }; + + jQuery.event.special.change = { + filters: { + focusout: testChange, + + beforedeactivate: testChange, + + click: function( e ) { + var elem = e.target, type = jQuery.nodeName( elem, "input" ) ? elem.type : ""; + + if ( type === "radio" || type === "checkbox" || jQuery.nodeName( elem, "select" ) ) { + testChange.call( this, e ); + } + }, + + // Change has to be called before submit + // Keydown will be called before keypress, which is used in submit-event delegation + keydown: function( e ) { + var elem = e.target, type = jQuery.nodeName( elem, "input" ) ? elem.type : ""; + + if ( (e.keyCode === 13 && !jQuery.nodeName( elem, "textarea" ) ) || + (e.keyCode === 32 && (type === "checkbox" || type === "radio")) || + type === "select-multiple" ) { + testChange.call( this, e ); + } + }, + + // Beforeactivate happens also before the previous element is blurred + // with this event you can't trigger a change event, but you can store + // information + beforeactivate: function( e ) { + var elem = e.target; + jQuery._data( elem, "_change_data", getVal(elem) ); + } + }, + + setup: function( data, namespaces ) { + if ( this.type === "file" ) { + return false; + } + + for ( var type in changeFilters ) { + jQuery.event.add( this, type + ".specialChange", changeFilters[type] ); + } + + return rformElems.test( this.nodeName ); + }, + + teardown: function( namespaces ) { + jQuery.event.remove( this, ".specialChange" ); + + return rformElems.test( this.nodeName ); + } + }; + + changeFilters = jQuery.event.special.change.filters; + + // Handle when the input is .focus()'d + changeFilters.focus = changeFilters.beforeactivate; +} + +function trigger( type, elem, args ) { + // Piggyback on a donor event to simulate a different one. + // Fake originalEvent to avoid donor's stopPropagation, but if the + // simulated event prevents default then we do the same on the donor. + // Don't pass args or remember liveFired; they apply to the donor event. + var event = jQuery.extend( {}, args[ 0 ] ); + event.type = type; + event.originalEvent = {}; + event.liveFired = undefined; + jQuery.event.handle.call( elem, event ); + if ( event.isDefaultPrevented() ) { + args[ 0 ].preventDefault(); + } +} + +// Create "bubbling" focus and blur events +if ( !jQuery.support.focusinBubbles ) { + jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) { + + // Attach a single capturing handler while someone wants focusin/focusout + var attaches = 0; + + jQuery.event.special[ fix ] = { + setup: function() { + if ( attaches++ === 0 ) { + document.addEventListener( orig, handler, true ); + } + }, + teardown: function() { + if ( --attaches === 0 ) { + document.removeEventListener( orig, handler, true ); + } + } + }; + + function handler( donor ) { + // Donor event is always a native one; fix it and switch its type. + // Let focusin/out handler cancel the donor focus/blur event. + var e = jQuery.event.fix( donor ); + e.type = fix; + e.originalEvent = {}; + jQuery.event.trigger( e, null, e.target ); + if ( e.isDefaultPrevented() ) { + donor.preventDefault(); + } + } + }); +} + +jQuery.each(["bind", "one"], function( i, name ) { + jQuery.fn[ name ] = function( type, data, fn ) { + var handler; + + // Handle object literals + if ( typeof type === "object" ) { + for ( var key in type ) { + this[ name ](key, data, type[key], fn); + } + return this; + } + + if ( arguments.length === 2 || data === false ) { + fn = data; + data = undefined; + } + + if ( name === "one" ) { + handler = function( event ) { + jQuery( this ).unbind( event, handler ); + return fn.apply( this, arguments ); + }; + handler.guid = fn.guid || jQuery.guid++; + } else { + handler = fn; + } + + if ( type === "unload" && name !== "one" ) { + this.one( type, data, fn ); + + } else { + for ( var i = 0, l = this.length; i < l; i++ ) { + jQuery.event.add( this[i], type, handler, data ); + } + } + + return this; + }; +}); + +jQuery.fn.extend({ + unbind: function( type, fn ) { + // Handle object literals + if ( typeof type === "object" && !type.preventDefault ) { + for ( var key in type ) { + this.unbind(key, type[key]); + } + + } else { + for ( var i = 0, l = this.length; i < l; i++ ) { + jQuery.event.remove( this[i], type, fn ); + } + } + + return this; + }, + + delegate: function( selector, types, data, fn ) { + return this.live( types, data, fn, selector ); + }, + + undelegate: function( selector, types, fn ) { + if ( arguments.length === 0 ) { + return this.unbind( "live" ); + + } else { + return this.die( types, null, fn, selector ); + } + }, + + trigger: function( type, data ) { + return this.each(function() { + jQuery.event.trigger( type, data, this ); + }); + }, + + triggerHandler: function( type, data ) { + if ( this[0] ) { + return jQuery.event.trigger( type, data, this[0], true ); + } + }, + + toggle: function( fn ) { + // Save reference to arguments for access in closure + var args = arguments, + guid = fn.guid || jQuery.guid++, + i = 0, + toggler = function( event ) { + // Figure out which function to execute + var lastToggle = ( jQuery.data( this, "lastToggle" + fn.guid ) || 0 ) % i; + jQuery.data( this, "lastToggle" + fn.guid, lastToggle + 1 ); + + // Make sure that clicks stop + event.preventDefault(); + + // and execute the function + return args[ lastToggle ].apply( this, arguments ) || false; + }; + + // link all the functions, so any of them can unbind this click handler + toggler.guid = guid; + while ( i < args.length ) { + args[ i++ ].guid = guid; + } + + return this.click( toggler ); + }, + + hover: function( fnOver, fnOut ) { + return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver ); + } +}); + +var liveMap = { + focus: "focusin", + blur: "focusout", + mouseenter: "mouseover", + mouseleave: "mouseout" +}; + +jQuery.each(["live", "die"], function( i, name ) { + jQuery.fn[ name ] = function( types, data, fn, origSelector /* Internal Use Only */ ) { + var type, i = 0, match, namespaces, preType, + selector = origSelector || this.selector, + context = origSelector ? this : jQuery( this.context ); + + if ( typeof types === "object" && !types.preventDefault ) { + for ( var key in types ) { + context[ name ]( key, data, types[key], selector ); + } + + return this; + } + + if ( name === "die" && !types && + origSelector && origSelector.charAt(0) === "." ) { + + context.unbind( origSelector ); + + return this; + } + + if ( data === false || jQuery.isFunction( data ) ) { + fn = data || returnFalse; + data = undefined; + } + + types = (types || "").split(" "); + + while ( (type = types[ i++ ]) != null ) { + match = rnamespaces.exec( type ); + namespaces = ""; + + if ( match ) { + namespaces = match[0]; + type = type.replace( rnamespaces, "" ); + } + + if ( type === "hover" ) { + types.push( "mouseenter" + namespaces, "mouseleave" + namespaces ); + continue; + } + + preType = type; + + if ( liveMap[ type ] ) { + types.push( liveMap[ type ] + namespaces ); + type = type + namespaces; + + } else { + type = (liveMap[ type ] || type) + namespaces; + } + + if ( name === "live" ) { + // bind live handler + for ( var j = 0, l = context.length; j < l; j++ ) { + jQuery.event.add( context[j], "live." + liveConvert( type, selector ), + { data: data, selector: selector, handler: fn, origType: type, origHandler: fn, preType: preType } ); + } + + } else { + // unbind live handler + context.unbind( "live." + liveConvert( type, selector ), fn ); + } + } + + return this; + }; +}); + +function liveHandler( event ) { + var stop, maxLevel, related, match, handleObj, elem, j, i, l, data, close, namespace, ret, + elems = [], + selectors = [], + events = jQuery._data( this, "events" ); + + // Make sure we avoid non-left-click bubbling in Firefox (#3861) and disabled elements in IE (#6911) + if ( event.liveFired === this || !events || !events.live || event.target.disabled || event.button && event.type === "click" ) { + return; + } + + if ( event.namespace ) { + namespace = new RegExp("(^|\\.)" + event.namespace.split(".").join("\\.(?:.*\\.)?") + "(\\.|$)"); + } + + event.liveFired = this; + + var live = events.live.slice(0); + + for ( j = 0; j < live.length; j++ ) { + handleObj = live[j]; + + if ( handleObj.origType.replace( rnamespaces, "" ) === event.type ) { + selectors.push( handleObj.selector ); + + } else { + live.splice( j--, 1 ); + } + } + + match = jQuery( event.target ).closest( selectors, event.currentTarget ); + + for ( i = 0, l = match.length; i < l; i++ ) { + close = match[i]; + + for ( j = 0; j < live.length; j++ ) { + handleObj = live[j]; + + if ( close.selector === handleObj.selector && (!namespace || namespace.test( handleObj.namespace )) && !close.elem.disabled ) { + elem = close.elem; + related = null; + + // Those two events require additional checking + if ( handleObj.preType === "mouseenter" || handleObj.preType === "mouseleave" ) { + event.type = handleObj.preType; + related = jQuery( event.relatedTarget ).closest( handleObj.selector )[0]; + + // Make sure not to accidentally match a child element with the same selector + if ( related && jQuery.contains( elem, related ) ) { + related = elem; + } + } + + if ( !related || related !== elem ) { + elems.push({ elem: elem, handleObj: handleObj, level: close.level }); + } + } + } + } + + for ( i = 0, l = elems.length; i < l; i++ ) { + match = elems[i]; + + if ( maxLevel && match.level > maxLevel ) { + break; + } + + event.currentTarget = match.elem; + event.data = match.handleObj.data; + event.handleObj = match.handleObj; + + ret = match.handleObj.origHandler.apply( match.elem, arguments ); + + if ( ret === false || event.isPropagationStopped() ) { + maxLevel = match.level; + + if ( ret === false ) { + stop = false; + } + if ( event.isImmediatePropagationStopped() ) { + break; + } + } + } + + return stop; +} + +function liveConvert( type, selector ) { + return (type && type !== "*" ? type + "." : "") + selector.replace(rperiod, "`").replace(rspaces, "&"); +} + +jQuery.each( ("blur focus focusin focusout load resize scroll unload click dblclick " + + "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " + + "change select submit keydown keypress keyup error").split(" "), function( i, name ) { + + // Handle event binding + jQuery.fn[ name ] = function( data, fn ) { + if ( fn == null ) { + fn = data; + data = null; + } + + return arguments.length > 0 ? + this.bind( name, data, fn ) : + this.trigger( name ); + }; + + if ( jQuery.attrFn ) { + jQuery.attrFn[ name ] = true; + } +}); + + + +/*! + * Sizzle CSS Selector Engine + * Copyright 2011, The Dojo Foundation + * Released under the MIT, BSD, and GPL Licenses. + * More information: http://sizzlejs.com/ + */ +(function(){ + +var chunker = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g, + done = 0, + toString = Object.prototype.toString, + hasDuplicate = false, + baseHasDuplicate = true, + rBackslash = /\\/g, + rNonWord = /\W/; + +// Here we check if the JavaScript engine is using some sort of +// optimization where it does not always call our comparision +// function. If that is the case, discard the hasDuplicate value. +// Thus far that includes Google Chrome. +[0, 0].sort(function() { + baseHasDuplicate = false; + return 0; +}); + +var Sizzle = function( selector, context, results, seed ) { + results = results || []; + context = context || document; + + var origContext = context; + + if ( context.nodeType !== 1 && context.nodeType !== 9 ) { + return []; + } + + if ( !selector || typeof selector !== "string" ) { + return results; + } + + var m, set, checkSet, extra, ret, cur, pop, i, + prune = true, + contextXML = Sizzle.isXML( context ), + parts = [], + soFar = selector; + + // Reset the position of the chunker regexp (start from head) + do { + chunker.exec( "" ); + m = chunker.exec( soFar ); + + if ( m ) { + soFar = m[3]; + + parts.push( m[1] ); + + if ( m[2] ) { + extra = m[3]; + break; + } + } + } while ( m ); + + if ( parts.length > 1 && origPOS.exec( selector ) ) { + + if ( parts.length === 2 && Expr.relative[ parts[0] ] ) { + set = posProcess( parts[0] + parts[1], context ); + + } else { + set = Expr.relative[ parts[0] ] ? + [ context ] : + Sizzle( parts.shift(), context ); + + while ( parts.length ) { + selector = parts.shift(); + + if ( Expr.relative[ selector ] ) { + selector += parts.shift(); + } + + set = posProcess( selector, set ); + } + } + + } else { + // Take a shortcut and set the context if the root selector is an ID + // (but not if it'll be faster if the inner selector is an ID) + if ( !seed && parts.length > 1 && context.nodeType === 9 && !contextXML && + Expr.match.ID.test(parts[0]) && !Expr.match.ID.test(parts[parts.length - 1]) ) { + + ret = Sizzle.find( parts.shift(), context, contextXML ); + context = ret.expr ? + Sizzle.filter( ret.expr, ret.set )[0] : + ret.set[0]; + } + + if ( context ) { + ret = seed ? + { expr: parts.pop(), set: makeArray(seed) } : + Sizzle.find( parts.pop(), parts.length === 1 && (parts[0] === "~" || parts[0] === "+") && context.parentNode ? context.parentNode : context, contextXML ); + + set = ret.expr ? + Sizzle.filter( ret.expr, ret.set ) : + ret.set; + + if ( parts.length > 0 ) { + checkSet = makeArray( set ); + + } else { + prune = false; + } + + while ( parts.length ) { + cur = parts.pop(); + pop = cur; + + if ( !Expr.relative[ cur ] ) { + cur = ""; + } else { + pop = parts.pop(); + } + + if ( pop == null ) { + pop = context; + } + + Expr.relative[ cur ]( checkSet, pop, contextXML ); + } + + } else { + checkSet = parts = []; + } + } + + if ( !checkSet ) { + checkSet = set; + } + + if ( !checkSet ) { + Sizzle.error( cur || selector ); + } + + if ( toString.call(checkSet) === "[object Array]" ) { + if ( !prune ) { + results.push.apply( results, checkSet ); + + } else if ( context && context.nodeType === 1 ) { + for ( i = 0; checkSet[i] != null; i++ ) { + if ( checkSet[i] && (checkSet[i] === true || checkSet[i].nodeType === 1 && Sizzle.contains(context, checkSet[i])) ) { + results.push( set[i] ); + } + } + + } else { + for ( i = 0; checkSet[i] != null; i++ ) { + if ( checkSet[i] && checkSet[i].nodeType === 1 ) { + results.push( set[i] ); + } + } + } + + } else { + makeArray( checkSet, results ); + } + + if ( extra ) { + Sizzle( extra, origContext, results, seed ); + Sizzle.uniqueSort( results ); + } + + return results; +}; + +Sizzle.uniqueSort = function( results ) { + if ( sortOrder ) { + hasDuplicate = baseHasDuplicate; + results.sort( sortOrder ); + + if ( hasDuplicate ) { + for ( var i = 1; i < results.length; i++ ) { + if ( results[i] === results[ i - 1 ] ) { + results.splice( i--, 1 ); + } + } + } + } + + return results; +}; + +Sizzle.matches = function( expr, set ) { + return Sizzle( expr, null, null, set ); +}; + +Sizzle.matchesSelector = function( node, expr ) { + return Sizzle( expr, null, null, [node] ).length > 0; +}; + +Sizzle.find = function( expr, context, isXML ) { + var set; + + if ( !expr ) { + return []; + } + + for ( var i = 0, l = Expr.order.length; i < l; i++ ) { + var match, + type = Expr.order[i]; + + if ( (match = Expr.leftMatch[ type ].exec( expr )) ) { + var left = match[1]; + match.splice( 1, 1 ); + + if ( left.substr( left.length - 1 ) !== "\\" ) { + match[1] = (match[1] || "").replace( rBackslash, "" ); + set = Expr.find[ type ]( match, context, isXML ); + + if ( set != null ) { + expr = expr.replace( Expr.match[ type ], "" ); + break; + } + } + } + } + + if ( !set ) { + set = typeof context.getElementsByTagName !== "undefined" ? + context.getElementsByTagName( "*" ) : + []; + } + + return { set: set, expr: expr }; +}; + +Sizzle.filter = function( expr, set, inplace, not ) { + var match, anyFound, + old = expr, + result = [], + curLoop = set, + isXMLFilter = set && set[0] && Sizzle.isXML( set[0] ); + + while ( expr && set.length ) { + for ( var type in Expr.filter ) { + if ( (match = Expr.leftMatch[ type ].exec( expr )) != null && match[2] ) { + var found, item, + filter = Expr.filter[ type ], + left = match[1]; + + anyFound = false; + + match.splice(1,1); + + if ( left.substr( left.length - 1 ) === "\\" ) { + continue; + } + + if ( curLoop === result ) { + result = []; + } + + if ( Expr.preFilter[ type ] ) { + match = Expr.preFilter[ type ]( match, curLoop, inplace, result, not, isXMLFilter ); + + if ( !match ) { + anyFound = found = true; + + } else if ( match === true ) { + continue; + } + } + + if ( match ) { + for ( var i = 0; (item = curLoop[i]) != null; i++ ) { + if ( item ) { + found = filter( item, match, i, curLoop ); + var pass = not ^ !!found; + + if ( inplace && found != null ) { + if ( pass ) { + anyFound = true; + + } else { + curLoop[i] = false; + } + + } else if ( pass ) { + result.push( item ); + anyFound = true; + } + } + } + } + + if ( found !== undefined ) { + if ( !inplace ) { + curLoop = result; + } + + expr = expr.replace( Expr.match[ type ], "" ); + + if ( !anyFound ) { + return []; + } + + break; + } + } + } + + // Improper expression + if ( expr === old ) { + if ( anyFound == null ) { + Sizzle.error( expr ); + + } else { + break; + } + } + + old = expr; + } + + return curLoop; +}; + +Sizzle.error = function( msg ) { + throw "Syntax error, unrecognized expression: " + msg; +}; + +var Expr = Sizzle.selectors = { + order: [ "ID", "NAME", "TAG" ], + + match: { + ID: /#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/, + CLASS: /\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/, + NAME: /\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/, + ATTR: /\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(?:(['"])(.*?)\3|(#?(?:[\w\u00c0-\uFFFF\-]|\\.)*)|)|)\s*\]/, + TAG: /^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/, + CHILD: /:(only|nth|last|first)-child(?:\(\s*(even|odd|(?:[+\-]?\d+|(?:[+\-]?\d*)?n\s*(?:[+\-]\s*\d+)?))\s*\))?/, + POS: /:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/, + PSEUDO: /:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/ + }, + + leftMatch: {}, + + attrMap: { + "class": "className", + "for": "htmlFor" + }, + + attrHandle: { + href: function( elem ) { + return elem.getAttribute( "href" ); + }, + type: function( elem ) { + return elem.getAttribute( "type" ); + } + }, + + relative: { + "+": function(checkSet, part){ + var isPartStr = typeof part === "string", + isTag = isPartStr && !rNonWord.test( part ), + isPartStrNotTag = isPartStr && !isTag; + + if ( isTag ) { + part = part.toLowerCase(); + } + + for ( var i = 0, l = checkSet.length, elem; i < l; i++ ) { + if ( (elem = checkSet[i]) ) { + while ( (elem = elem.previousSibling) && elem.nodeType !== 1 ) {} + + checkSet[i] = isPartStrNotTag || elem && elem.nodeName.toLowerCase() === part ? + elem || false : + elem === part; + } + } + + if ( isPartStrNotTag ) { + Sizzle.filter( part, checkSet, true ); + } + }, + + ">": function( checkSet, part ) { + var elem, + isPartStr = typeof part === "string", + i = 0, + l = checkSet.length; + + if ( isPartStr && !rNonWord.test( part ) ) { + part = part.toLowerCase(); + + for ( ; i < l; i++ ) { + elem = checkSet[i]; + + if ( elem ) { + var parent = elem.parentNode; + checkSet[i] = parent.nodeName.toLowerCase() === part ? parent : false; + } + } + + } else { + for ( ; i < l; i++ ) { + elem = checkSet[i]; + + if ( elem ) { + checkSet[i] = isPartStr ? + elem.parentNode : + elem.parentNode === part; + } + } + + if ( isPartStr ) { + Sizzle.filter( part, checkSet, true ); + } + } + }, + + "": function(checkSet, part, isXML){ + var nodeCheck, + doneName = done++, + checkFn = dirCheck; + + if ( typeof part === "string" && !rNonWord.test( part ) ) { + part = part.toLowerCase(); + nodeCheck = part; + checkFn = dirNodeCheck; + } + + checkFn( "parentNode", part, doneName, checkSet, nodeCheck, isXML ); + }, + + "~": function( checkSet, part, isXML ) { + var nodeCheck, + doneName = done++, + checkFn = dirCheck; + + if ( typeof part === "string" && !rNonWord.test( part ) ) { + part = part.toLowerCase(); + nodeCheck = part; + checkFn = dirNodeCheck; + } + + checkFn( "previousSibling", part, doneName, checkSet, nodeCheck, isXML ); + } + }, + + find: { + ID: function( match, context, isXML ) { + if ( typeof context.getElementById !== "undefined" && !isXML ) { + var m = context.getElementById(match[1]); + // Check parentNode to catch when Blackberry 4.6 returns + // nodes that are no longer in the document #6963 + return m && m.parentNode ? [m] : []; + } + }, + + NAME: function( match, context ) { + if ( typeof context.getElementsByName !== "undefined" ) { + var ret = [], + results = context.getElementsByName( match[1] ); + + for ( var i = 0, l = results.length; i < l; i++ ) { + if ( results[i].getAttribute("name") === match[1] ) { + ret.push( results[i] ); + } + } + + return ret.length === 0 ? null : ret; + } + }, + + TAG: function( match, context ) { + if ( typeof context.getElementsByTagName !== "undefined" ) { + return context.getElementsByTagName( match[1] ); + } + } + }, + preFilter: { + CLASS: function( match, curLoop, inplace, result, not, isXML ) { + match = " " + match[1].replace( rBackslash, "" ) + " "; + + if ( isXML ) { + return match; + } + + for ( var i = 0, elem; (elem = curLoop[i]) != null; i++ ) { + if ( elem ) { + if ( not ^ (elem.className && (" " + elem.className + " ").replace(/[\t\n\r]/g, " ").indexOf(match) >= 0) ) { + if ( !inplace ) { + result.push( elem ); + } + + } else if ( inplace ) { + curLoop[i] = false; + } + } + } + + return false; + }, + + ID: function( match ) { + return match[1].replace( rBackslash, "" ); + }, + + TAG: function( match, curLoop ) { + return match[1].replace( rBackslash, "" ).toLowerCase(); + }, + + CHILD: function( match ) { + if ( match[1] === "nth" ) { + if ( !match[2] ) { + Sizzle.error( match[0] ); + } + + match[2] = match[2].replace(/^\+|\s*/g, ''); + + // parse equations like 'even', 'odd', '5', '2n', '3n+2', '4n-1', '-n+6' + var test = /(-?)(\d*)(?:n([+\-]?\d*))?/.exec( + match[2] === "even" && "2n" || match[2] === "odd" && "2n+1" || + !/\D/.test( match[2] ) && "0n+" + match[2] || match[2]); + + // calculate the numbers (first)n+(last) including if they are negative + match[2] = (test[1] + (test[2] || 1)) - 0; + match[3] = test[3] - 0; + } + else if ( match[2] ) { + Sizzle.error( match[0] ); + } + + // TODO: Move to normal caching system + match[0] = done++; + + return match; + }, + + ATTR: function( match, curLoop, inplace, result, not, isXML ) { + var name = match[1] = match[1].replace( rBackslash, "" ); + + if ( !isXML && Expr.attrMap[name] ) { + match[1] = Expr.attrMap[name]; + } + + // Handle if an un-quoted value was used + match[4] = ( match[4] || match[5] || "" ).replace( rBackslash, "" ); + + if ( match[2] === "~=" ) { + match[4] = " " + match[4] + " "; + } + + return match; + }, + + PSEUDO: function( match, curLoop, inplace, result, not ) { + if ( match[1] === "not" ) { + // If we're dealing with a complex expression, or a simple one + if ( ( chunker.exec(match[3]) || "" ).length > 1 || /^\w/.test(match[3]) ) { + match[3] = Sizzle(match[3], null, null, curLoop); + + } else { + var ret = Sizzle.filter(match[3], curLoop, inplace, true ^ not); + + if ( !inplace ) { + result.push.apply( result, ret ); + } + + return false; + } + + } else if ( Expr.match.POS.test( match[0] ) || Expr.match.CHILD.test( match[0] ) ) { + return true; + } + + return match; + }, + + POS: function( match ) { + match.unshift( true ); + + return match; + } + }, + + filters: { + enabled: function( elem ) { + return elem.disabled === false && elem.type !== "hidden"; + }, + + disabled: function( elem ) { + return elem.disabled === true; + }, + + checked: function( elem ) { + return elem.checked === true; + }, + + selected: function( elem ) { + // Accessing this property makes selected-by-default + // options in Safari work properly + if ( elem.parentNode ) { + elem.parentNode.selectedIndex; + } + + return elem.selected === true; + }, + + parent: function( elem ) { + return !!elem.firstChild; + }, + + empty: function( elem ) { + return !elem.firstChild; + }, + + has: function( elem, i, match ) { + return !!Sizzle( match[3], elem ).length; + }, + + header: function( elem ) { + return (/h\d/i).test( elem.nodeName ); + }, + + text: function( elem ) { + var attr = elem.getAttribute( "type" ), type = elem.type; + // IE6 and 7 will map elem.type to 'text' for new HTML5 types (search, etc) + // use getAttribute instead to test this case + return elem.nodeName.toLowerCase() === "input" && "text" === type && ( attr === type || attr === null ); + }, + + radio: function( elem ) { + return elem.nodeName.toLowerCase() === "input" && "radio" === elem.type; + }, + + checkbox: function( elem ) { + return elem.nodeName.toLowerCase() === "input" && "checkbox" === elem.type; + }, + + file: function( elem ) { + return elem.nodeName.toLowerCase() === "input" && "file" === elem.type; + }, + + password: function( elem ) { + return elem.nodeName.toLowerCase() === "input" && "password" === elem.type; + }, + + submit: function( elem ) { + var name = elem.nodeName.toLowerCase(); + return (name === "input" || name === "button") && "submit" === elem.type; + }, + + image: function( elem ) { + return elem.nodeName.toLowerCase() === "input" && "image" === elem.type; + }, + + reset: function( elem ) { + var name = elem.nodeName.toLowerCase(); + return (name === "input" || name === "button") && "reset" === elem.type; + }, + + button: function( elem ) { + var name = elem.nodeName.toLowerCase(); + return name === "input" && "button" === elem.type || name === "button"; + }, + + input: function( elem ) { + return (/input|select|textarea|button/i).test( elem.nodeName ); + }, + + focus: function( elem ) { + return elem === elem.ownerDocument.activeElement; + } + }, + setFilters: { + first: function( elem, i ) { + return i === 0; + }, + + last: function( elem, i, match, array ) { + return i === array.length - 1; + }, + + even: function( elem, i ) { + return i % 2 === 0; + }, + + odd: function( elem, i ) { + return i % 2 === 1; + }, + + lt: function( elem, i, match ) { + return i < match[3] - 0; + }, + + gt: function( elem, i, match ) { + return i > match[3] - 0; + }, + + nth: function( elem, i, match ) { + return match[3] - 0 === i; + }, + + eq: function( elem, i, match ) { + return match[3] - 0 === i; + } + }, + filter: { + PSEUDO: function( elem, match, i, array ) { + var name = match[1], + filter = Expr.filters[ name ]; + + if ( filter ) { + return filter( elem, i, match, array ); + + } else if ( name === "contains" ) { + return (elem.textContent || elem.innerText || Sizzle.getText([ elem ]) || "").indexOf(match[3]) >= 0; + + } else if ( name === "not" ) { + var not = match[3]; + + for ( var j = 0, l = not.length; j < l; j++ ) { + if ( not[j] === elem ) { + return false; + } + } + + return true; + + } else { + Sizzle.error( name ); + } + }, + + CHILD: function( elem, match ) { + var type = match[1], + node = elem; + + switch ( type ) { + case "only": + case "first": + while ( (node = node.previousSibling) ) { + if ( node.nodeType === 1 ) { + return false; + } + } + + if ( type === "first" ) { + return true; + } + + node = elem; + + case "last": + while ( (node = node.nextSibling) ) { + if ( node.nodeType === 1 ) { + return false; + } + } + + return true; + + case "nth": + var first = match[2], + last = match[3]; + + if ( first === 1 && last === 0 ) { + return true; + } + + var doneName = match[0], + parent = elem.parentNode; + + if ( parent && (parent.sizcache !== doneName || !elem.nodeIndex) ) { + var count = 0; + + for ( node = parent.firstChild; node; node = node.nextSibling ) { + if ( node.nodeType === 1 ) { + node.nodeIndex = ++count; + } + } + + parent.sizcache = doneName; + } + + var diff = elem.nodeIndex - last; + + if ( first === 0 ) { + return diff === 0; + + } else { + return ( diff % first === 0 && diff / first >= 0 ); + } + } + }, + + ID: function( elem, match ) { + return elem.nodeType === 1 && elem.getAttribute("id") === match; + }, + + TAG: function( elem, match ) { + return (match === "*" && elem.nodeType === 1) || elem.nodeName.toLowerCase() === match; + }, + + CLASS: function( elem, match ) { + return (" " + (elem.className || elem.getAttribute("class")) + " ") + .indexOf( match ) > -1; + }, + + ATTR: function( elem, match ) { + var name = match[1], + result = Expr.attrHandle[ name ] ? + Expr.attrHandle[ name ]( elem ) : + elem[ name ] != null ? + elem[ name ] : + elem.getAttribute( name ), + value = result + "", + type = match[2], + check = match[4]; + + return result == null ? + type === "!=" : + type === "=" ? + value === check : + type === "*=" ? + value.indexOf(check) >= 0 : + type === "~=" ? + (" " + value + " ").indexOf(check) >= 0 : + !check ? + value && result !== false : + type === "!=" ? + value !== check : + type === "^=" ? + value.indexOf(check) === 0 : + type === "$=" ? + value.substr(value.length - check.length) === check : + type === "|=" ? + value === check || value.substr(0, check.length + 1) === check + "-" : + false; + }, + + POS: function( elem, match, i, array ) { + var name = match[2], + filter = Expr.setFilters[ name ]; + + if ( filter ) { + return filter( elem, i, match, array ); + } + } + } +}; + +var origPOS = Expr.match.POS, + fescape = function(all, num){ + return "\\" + (num - 0 + 1); + }; + +for ( var type in Expr.match ) { + Expr.match[ type ] = new RegExp( Expr.match[ type ].source + (/(?![^\[]*\])(?![^\(]*\))/.source) ); + Expr.leftMatch[ type ] = new RegExp( /(^(?:.|\r|\n)*?)/.source + Expr.match[ type ].source.replace(/\\(\d+)/g, fescape) ); +} + +var makeArray = function( array, results ) { + array = Array.prototype.slice.call( array, 0 ); + + if ( results ) { + results.push.apply( results, array ); + return results; + } + + return array; +}; + +// Perform a simple check to determine if the browser is capable of +// converting a NodeList to an array using builtin methods. +// Also verifies that the returned array holds DOM nodes +// (which is not the case in the Blackberry browser) +try { + Array.prototype.slice.call( document.documentElement.childNodes, 0 )[0].nodeType; + +// Provide a fallback method if it does not work +} catch( e ) { + makeArray = function( array, results ) { + var i = 0, + ret = results || []; + + if ( toString.call(array) === "[object Array]" ) { + Array.prototype.push.apply( ret, array ); + + } else { + if ( typeof array.length === "number" ) { + for ( var l = array.length; i < l; i++ ) { + ret.push( array[i] ); + } + + } else { + for ( ; array[i]; i++ ) { + ret.push( array[i] ); + } + } + } + + return ret; + }; +} + +var sortOrder, siblingCheck; + +if ( document.documentElement.compareDocumentPosition ) { + sortOrder = function( a, b ) { + if ( a === b ) { + hasDuplicate = true; + return 0; + } + + if ( !a.compareDocumentPosition || !b.compareDocumentPosition ) { + return a.compareDocumentPosition ? -1 : 1; + } + + return a.compareDocumentPosition(b) & 4 ? -1 : 1; + }; + +} else { + sortOrder = function( a, b ) { + // The nodes are identical, we can exit early + if ( a === b ) { + hasDuplicate = true; + return 0; + + // Fallback to using sourceIndex (in IE) if it's available on both nodes + } else if ( a.sourceIndex && b.sourceIndex ) { + return a.sourceIndex - b.sourceIndex; + } + + var al, bl, + ap = [], + bp = [], + aup = a.parentNode, + bup = b.parentNode, + cur = aup; + + // If the nodes are siblings (or identical) we can do a quick check + if ( aup === bup ) { + return siblingCheck( a, b ); + + // If no parents were found then the nodes are disconnected + } else if ( !aup ) { + return -1; + + } else if ( !bup ) { + return 1; + } + + // Otherwise they're somewhere else in the tree so we need + // to build up a full list of the parentNodes for comparison + while ( cur ) { + ap.unshift( cur ); + cur = cur.parentNode; + } + + cur = bup; + + while ( cur ) { + bp.unshift( cur ); + cur = cur.parentNode; + } + + al = ap.length; + bl = bp.length; + + // Start walking down the tree looking for a discrepancy + for ( var i = 0; i < al && i < bl; i++ ) { + if ( ap[i] !== bp[i] ) { + return siblingCheck( ap[i], bp[i] ); + } + } + + // We ended someplace up the tree so do a sibling check + return i === al ? + siblingCheck( a, bp[i], -1 ) : + siblingCheck( ap[i], b, 1 ); + }; + + siblingCheck = function( a, b, ret ) { + if ( a === b ) { + return ret; + } + + var cur = a.nextSibling; + + while ( cur ) { + if ( cur === b ) { + return -1; + } + + cur = cur.nextSibling; + } + + return 1; + }; +} + +// Utility function for retreiving the text value of an array of DOM nodes +Sizzle.getText = function( elems ) { + var ret = "", elem; + + for ( var i = 0; elems[i]; i++ ) { + elem = elems[i]; + + // Get the text from text nodes and CDATA nodes + if ( elem.nodeType === 3 || elem.nodeType === 4 ) { + ret += elem.nodeValue; + + // Traverse everything else, except comment nodes + } else if ( elem.nodeType !== 8 ) { + ret += Sizzle.getText( elem.childNodes ); + } + } + + return ret; +}; + +// Check to see if the browser returns elements by name when +// querying by getElementById (and provide a workaround) +(function(){ + // We're going to inject a fake input element with a specified name + var form = document.createElement("div"), + id = "script" + (new Date()).getTime(), + root = document.documentElement; + + form.innerHTML = ""; + + // Inject it into the root element, check its status, and remove it quickly + root.insertBefore( form, root.firstChild ); + + // The workaround has to do additional checks after a getElementById + // Which slows things down for other browsers (hence the branching) + if ( document.getElementById( id ) ) { + Expr.find.ID = function( match, context, isXML ) { + if ( typeof context.getElementById !== "undefined" && !isXML ) { + var m = context.getElementById(match[1]); + + return m ? + m.id === match[1] || typeof m.getAttributeNode !== "undefined" && m.getAttributeNode("id").nodeValue === match[1] ? + [m] : + undefined : + []; + } + }; + + Expr.filter.ID = function( elem, match ) { + var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id"); + + return elem.nodeType === 1 && node && node.nodeValue === match; + }; + } + + root.removeChild( form ); + + // release memory in IE + root = form = null; +})(); + +(function(){ + // Check to see if the browser returns only elements + // when doing getElementsByTagName("*") + + // Create a fake element + var div = document.createElement("div"); + div.appendChild( document.createComment("") ); + + // Make sure no comments are found + if ( div.getElementsByTagName("*").length > 0 ) { + Expr.find.TAG = function( match, context ) { + var results = context.getElementsByTagName( match[1] ); + + // Filter out possible comments + if ( match[1] === "*" ) { + var tmp = []; + + for ( var i = 0; results[i]; i++ ) { + if ( results[i].nodeType === 1 ) { + tmp.push( results[i] ); + } + } + + results = tmp; + } + + return results; + }; + } + + // Check to see if an attribute returns normalized href attributes + div.innerHTML = ""; + + if ( div.firstChild && typeof div.firstChild.getAttribute !== "undefined" && + div.firstChild.getAttribute("href") !== "#" ) { + + Expr.attrHandle.href = function( elem ) { + return elem.getAttribute( "href", 2 ); + }; + } + + // release memory in IE + div = null; +})(); + +if ( document.querySelectorAll ) { + (function(){ + var oldSizzle = Sizzle, + div = document.createElement("div"), + id = "__sizzle__"; + + div.innerHTML = "

                          "; + + // Safari can't handle uppercase or unicode characters when + // in quirks mode. + if ( div.querySelectorAll && div.querySelectorAll(".TEST").length === 0 ) { + return; + } + + Sizzle = function( query, context, extra, seed ) { + context = context || document; + + // Only use querySelectorAll on non-XML documents + // (ID selectors don't work in non-HTML documents) + if ( !seed && !Sizzle.isXML(context) ) { + // See if we find a selector to speed up + var match = /^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec( query ); + + if ( match && (context.nodeType === 1 || context.nodeType === 9) ) { + // Speed-up: Sizzle("TAG") + if ( match[1] ) { + return makeArray( context.getElementsByTagName( query ), extra ); + + // Speed-up: Sizzle(".CLASS") + } else if ( match[2] && Expr.find.CLASS && context.getElementsByClassName ) { + return makeArray( context.getElementsByClassName( match[2] ), extra ); + } + } + + if ( context.nodeType === 9 ) { + // Speed-up: Sizzle("body") + // The body element only exists once, optimize finding it + if ( query === "body" && context.body ) { + return makeArray( [ context.body ], extra ); + + // Speed-up: Sizzle("#ID") + } else if ( match && match[3] ) { + var elem = context.getElementById( match[3] ); + + // Check parentNode to catch when Blackberry 4.6 returns + // nodes that are no longer in the document #6963 + if ( elem && elem.parentNode ) { + // Handle the case where IE and Opera return items + // by name instead of ID + if ( elem.id === match[3] ) { + return makeArray( [ elem ], extra ); + } + + } else { + return makeArray( [], extra ); + } + } + + try { + return makeArray( context.querySelectorAll(query), extra ); + } catch(qsaError) {} + + // qSA works strangely on Element-rooted queries + // We can work around this by specifying an extra ID on the root + // and working up from there (Thanks to Andrew Dupont for the technique) + // IE 8 doesn't work on object elements + } else if ( context.nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) { + var oldContext = context, + old = context.getAttribute( "id" ), + nid = old || id, + hasParent = context.parentNode, + relativeHierarchySelector = /^\s*[+~]/.test( query ); + + if ( !old ) { + context.setAttribute( "id", nid ); + } else { + nid = nid.replace( /'/g, "\\$&" ); + } + if ( relativeHierarchySelector && hasParent ) { + context = context.parentNode; + } + + try { + if ( !relativeHierarchySelector || hasParent ) { + return makeArray( context.querySelectorAll( "[id='" + nid + "'] " + query ), extra ); + } + + } catch(pseudoError) { + } finally { + if ( !old ) { + oldContext.removeAttribute( "id" ); + } + } + } + } + + return oldSizzle(query, context, extra, seed); + }; + + for ( var prop in oldSizzle ) { + Sizzle[ prop ] = oldSizzle[ prop ]; + } + + // release memory in IE + div = null; + })(); +} + +(function(){ + var html = document.documentElement, + matches = html.matchesSelector || html.mozMatchesSelector || html.webkitMatchesSelector || html.msMatchesSelector; + + if ( matches ) { + // Check to see if it's possible to do matchesSelector + // on a disconnected node (IE 9 fails this) + var disconnectedMatch = !matches.call( document.createElement( "div" ), "div" ), + pseudoWorks = false; + + try { + // This should fail with an exception + // Gecko does not error, returns false instead + matches.call( document.documentElement, "[test!='']:sizzle" ); + + } catch( pseudoError ) { + pseudoWorks = true; + } + + Sizzle.matchesSelector = function( node, expr ) { + // Make sure that attribute selectors are quoted + expr = expr.replace(/\=\s*([^'"\]]*)\s*\]/g, "='$1']"); + + if ( !Sizzle.isXML( node ) ) { + try { + if ( pseudoWorks || !Expr.match.PSEUDO.test( expr ) && !/!=/.test( expr ) ) { + var ret = matches.call( node, expr ); + + // IE 9's matchesSelector returns false on disconnected nodes + if ( ret || !disconnectedMatch || + // As well, disconnected nodes are said to be in a document + // fragment in IE 9, so check for that + node.document && node.document.nodeType !== 11 ) { + return ret; + } + } + } catch(e) {} + } + + return Sizzle(expr, null, null, [node]).length > 0; + }; + } +})(); + +(function(){ + var div = document.createElement("div"); + + div.innerHTML = "
                          "; + + // Opera can't find a second classname (in 9.6) + // Also, make sure that getElementsByClassName actually exists + if ( !div.getElementsByClassName || div.getElementsByClassName("e").length === 0 ) { + return; + } + + // Safari caches class attributes, doesn't catch changes (in 3.2) + div.lastChild.className = "e"; + + if ( div.getElementsByClassName("e").length === 1 ) { + return; + } + + Expr.order.splice(1, 0, "CLASS"); + Expr.find.CLASS = function( match, context, isXML ) { + if ( typeof context.getElementsByClassName !== "undefined" && !isXML ) { + return context.getElementsByClassName(match[1]); + } + }; + + // release memory in IE + div = null; +})(); + +function dirNodeCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) { + for ( var i = 0, l = checkSet.length; i < l; i++ ) { + var elem = checkSet[i]; + + if ( elem ) { + var match = false; + + elem = elem[dir]; + + while ( elem ) { + if ( elem.sizcache === doneName ) { + match = checkSet[elem.sizset]; + break; + } + + if ( elem.nodeType === 1 && !isXML ){ + elem.sizcache = doneName; + elem.sizset = i; + } + + if ( elem.nodeName.toLowerCase() === cur ) { + match = elem; + break; + } + + elem = elem[dir]; + } + + checkSet[i] = match; + } + } +} + +function dirCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) { + for ( var i = 0, l = checkSet.length; i < l; i++ ) { + var elem = checkSet[i]; + + if ( elem ) { + var match = false; + + elem = elem[dir]; + + while ( elem ) { + if ( elem.sizcache === doneName ) { + match = checkSet[elem.sizset]; + break; + } + + if ( elem.nodeType === 1 ) { + if ( !isXML ) { + elem.sizcache = doneName; + elem.sizset = i; + } + + if ( typeof cur !== "string" ) { + if ( elem === cur ) { + match = true; + break; + } + + } else if ( Sizzle.filter( cur, [elem] ).length > 0 ) { + match = elem; + break; + } + } + + elem = elem[dir]; + } + + checkSet[i] = match; + } + } +} + +if ( document.documentElement.contains ) { + Sizzle.contains = function( a, b ) { + return a !== b && (a.contains ? a.contains(b) : true); + }; + +} else if ( document.documentElement.compareDocumentPosition ) { + Sizzle.contains = function( a, b ) { + return !!(a.compareDocumentPosition(b) & 16); + }; + +} else { + Sizzle.contains = function() { + return false; + }; +} + +Sizzle.isXML = function( elem ) { + // documentElement is verified for cases where it doesn't yet exist + // (such as loading iframes in IE - #4833) + var documentElement = (elem ? elem.ownerDocument || elem : 0).documentElement; + + return documentElement ? documentElement.nodeName !== "HTML" : false; +}; + +var posProcess = function( selector, context ) { + var match, + tmpSet = [], + later = "", + root = context.nodeType ? [context] : context; + + // Position selectors must be done after the filter + // And so must :not(positional) so we move all PSEUDOs to the end + while ( (match = Expr.match.PSEUDO.exec( selector )) ) { + later += match[0]; + selector = selector.replace( Expr.match.PSEUDO, "" ); + } + + selector = Expr.relative[selector] ? selector + "*" : selector; + + for ( var i = 0, l = root.length; i < l; i++ ) { + Sizzle( selector, root[i], tmpSet ); + } + + return Sizzle.filter( later, tmpSet ); +}; + +// EXPOSE +jQuery.find = Sizzle; +jQuery.expr = Sizzle.selectors; +jQuery.expr[":"] = jQuery.expr.filters; +jQuery.unique = Sizzle.uniqueSort; +jQuery.text = Sizzle.getText; +jQuery.isXMLDoc = Sizzle.isXML; +jQuery.contains = Sizzle.contains; + + +})(); + + +var runtil = /Until$/, + rparentsprev = /^(?:parents|prevUntil|prevAll)/, + // Note: This RegExp should be improved, or likely pulled from Sizzle + rmultiselector = /,/, + isSimple = /^.[^:#\[\.,]*$/, + slice = Array.prototype.slice, + POS = jQuery.expr.match.POS, + // methods guaranteed to produce a unique set when starting from a unique set + guaranteedUnique = { + children: true, + contents: true, + next: true, + prev: true + }; + +jQuery.fn.extend({ + find: function( selector ) { + var self = this, + i, l; + + if ( typeof selector !== "string" ) { + return jQuery( selector ).filter(function() { + for ( i = 0, l = self.length; i < l; i++ ) { + if ( jQuery.contains( self[ i ], this ) ) { + return true; + } + } + }); + } + + var ret = this.pushStack( "", "find", selector ), + length, n, r; + + for ( i = 0, l = this.length; i < l; i++ ) { + length = ret.length; + jQuery.find( selector, this[i], ret ); + + if ( i > 0 ) { + // Make sure that the results are unique + for ( n = length; n < ret.length; n++ ) { + for ( r = 0; r < length; r++ ) { + if ( ret[r] === ret[n] ) { + ret.splice(n--, 1); + break; + } + } + } + } + } + + return ret; + }, + + has: function( target ) { + var targets = jQuery( target ); + return this.filter(function() { + for ( var i = 0, l = targets.length; i < l; i++ ) { + if ( jQuery.contains( this, targets[i] ) ) { + return true; + } + } + }); + }, + + not: function( selector ) { + return this.pushStack( winnow(this, selector, false), "not", selector); + }, + + filter: function( selector ) { + return this.pushStack( winnow(this, selector, true), "filter", selector ); + }, + + is: function( selector ) { + return !!selector && ( typeof selector === "string" ? + jQuery.filter( selector, this ).length > 0 : + this.filter( selector ).length > 0 ); + }, + + closest: function( selectors, context ) { + var ret = [], i, l, cur = this[0]; + + // Array + if ( jQuery.isArray( selectors ) ) { + var match, selector, + matches = {}, + level = 1; + + if ( cur && selectors.length ) { + for ( i = 0, l = selectors.length; i < l; i++ ) { + selector = selectors[i]; + + if ( !matches[ selector ] ) { + matches[ selector ] = POS.test( selector ) ? + jQuery( selector, context || this.context ) : + selector; + } + } + + while ( cur && cur.ownerDocument && cur !== context ) { + for ( selector in matches ) { + match = matches[ selector ]; + + if ( match.jquery ? match.index( cur ) > -1 : jQuery( cur ).is( match ) ) { + ret.push({ selector: selector, elem: cur, level: level }); + } + } + + cur = cur.parentNode; + level++; + } + } + + return ret; + } + + // String + var pos = POS.test( selectors ) || typeof selectors !== "string" ? + jQuery( selectors, context || this.context ) : + 0; + + for ( i = 0, l = this.length; i < l; i++ ) { + cur = this[i]; + + while ( cur ) { + if ( pos ? pos.index(cur) > -1 : jQuery.find.matchesSelector(cur, selectors) ) { + ret.push( cur ); + break; + + } else { + cur = cur.parentNode; + if ( !cur || !cur.ownerDocument || cur === context || cur.nodeType === 11 ) { + break; + } + } + } + } + + ret = ret.length > 1 ? jQuery.unique( ret ) : ret; + + return this.pushStack( ret, "closest", selectors ); + }, + + // Determine the position of an element within + // the matched set of elements + index: function( elem ) { + + // No argument, return index in parent + if ( !elem ) { + return ( this[0] && this[0].parentNode ) ? this.prevAll().length : -1; + } + + // index in selector + if ( typeof elem === "string" ) { + return jQuery.inArray( this[0], jQuery( elem ) ); + } + + // Locate the position of the desired element + return jQuery.inArray( + // If it receives a jQuery object, the first element is used + elem.jquery ? elem[0] : elem, this ); + }, + + add: function( selector, context ) { + var set = typeof selector === "string" ? + jQuery( selector, context ) : + jQuery.makeArray( selector && selector.nodeType ? [ selector ] : selector ), + all = jQuery.merge( this.get(), set ); + + return this.pushStack( isDisconnected( set[0] ) || isDisconnected( all[0] ) ? + all : + jQuery.unique( all ) ); + }, + + andSelf: function() { + return this.add( this.prevObject ); + } +}); + +// A painfully simple check to see if an element is disconnected +// from a document (should be improved, where feasible). +function isDisconnected( node ) { + return !node || !node.parentNode || node.parentNode.nodeType === 11; +} + +jQuery.each({ + parent: function( elem ) { + var parent = elem.parentNode; + return parent && parent.nodeType !== 11 ? parent : null; + }, + parents: function( elem ) { + return jQuery.dir( elem, "parentNode" ); + }, + parentsUntil: function( elem, i, until ) { + return jQuery.dir( elem, "parentNode", until ); + }, + next: function( elem ) { + return jQuery.nth( elem, 2, "nextSibling" ); + }, + prev: function( elem ) { + return jQuery.nth( elem, 2, "previousSibling" ); + }, + nextAll: function( elem ) { + return jQuery.dir( elem, "nextSibling" ); + }, + prevAll: function( elem ) { + return jQuery.dir( elem, "previousSibling" ); + }, + nextUntil: function( elem, i, until ) { + return jQuery.dir( elem, "nextSibling", until ); + }, + prevUntil: function( elem, i, until ) { + return jQuery.dir( elem, "previousSibling", until ); + }, + siblings: function( elem ) { + return jQuery.sibling( elem.parentNode.firstChild, elem ); + }, + children: function( elem ) { + return jQuery.sibling( elem.firstChild ); + }, + contents: function( elem ) { + return jQuery.nodeName( elem, "iframe" ) ? + elem.contentDocument || elem.contentWindow.document : + jQuery.makeArray( elem.childNodes ); + } +}, function( name, fn ) { + jQuery.fn[ name ] = function( until, selector ) { + var ret = jQuery.map( this, fn, until ), + // The variable 'args' was introduced in + // https://github.com/jquery/jquery/commit/52a0238 + // to work around a bug in Chrome 10 (Dev) and should be removed when the bug is fixed. + // http://code.google.com/p/v8/issues/detail?id=1050 + args = slice.call(arguments); + + if ( !runtil.test( name ) ) { + selector = until; + } + + if ( selector && typeof selector === "string" ) { + ret = jQuery.filter( selector, ret ); + } + + ret = this.length > 1 && !guaranteedUnique[ name ] ? jQuery.unique( ret ) : ret; + + if ( (this.length > 1 || rmultiselector.test( selector )) && rparentsprev.test( name ) ) { + ret = ret.reverse(); + } + + return this.pushStack( ret, name, args.join(",") ); + }; +}); + +jQuery.extend({ + filter: function( expr, elems, not ) { + if ( not ) { + expr = ":not(" + expr + ")"; + } + + return elems.length === 1 ? + jQuery.find.matchesSelector(elems[0], expr) ? [ elems[0] ] : [] : + jQuery.find.matches(expr, elems); + }, + + dir: function( elem, dir, until ) { + var matched = [], + cur = elem[ dir ]; + + while ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) { + if ( cur.nodeType === 1 ) { + matched.push( cur ); + } + cur = cur[dir]; + } + return matched; + }, + + nth: function( cur, result, dir, elem ) { + result = result || 1; + var num = 0; + + for ( ; cur; cur = cur[dir] ) { + if ( cur.nodeType === 1 && ++num === result ) { + break; + } + } + + return cur; + }, + + sibling: function( n, elem ) { + var r = []; + + for ( ; n; n = n.nextSibling ) { + if ( n.nodeType === 1 && n !== elem ) { + r.push( n ); + } + } + + return r; + } +}); + +// Implement the identical functionality for filter and not +function winnow( elements, qualifier, keep ) { + + // Can't pass null or undefined to indexOf in Firefox 4 + // Set to 0 to skip string check + qualifier = qualifier || 0; + + if ( jQuery.isFunction( qualifier ) ) { + return jQuery.grep(elements, function( elem, i ) { + var retVal = !!qualifier.call( elem, i, elem ); + return retVal === keep; + }); + + } else if ( qualifier.nodeType ) { + return jQuery.grep(elements, function( elem, i ) { + return (elem === qualifier) === keep; + }); + + } else if ( typeof qualifier === "string" ) { + var filtered = jQuery.grep(elements, function( elem ) { + return elem.nodeType === 1; + }); + + if ( isSimple.test( qualifier ) ) { + return jQuery.filter(qualifier, filtered, !keep); + } else { + qualifier = jQuery.filter( qualifier, filtered ); + } + } + + return jQuery.grep(elements, function( elem, i ) { + return (jQuery.inArray( elem, qualifier ) >= 0) === keep; + }); +} + + + + +var rinlinejQuery = / jQuery\d+="(?:\d+|null)"/g, + rleadingWhitespace = /^\s+/, + rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig, + rtagName = /<([\w:]+)/, + rtbody = /", "" ], + legend: [ 1, "
                          ", "
                          " ], + thead: [ 1, "", "
                          " ], + tr: [ 2, "", "
                          " ], + td: [ 3, "", "
                          " ], + col: [ 2, "", "
                          " ], + area: [ 1, "", "" ], + _default: [ 0, "", "" ] + }; + +wrapMap.optgroup = wrapMap.option; +wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; +wrapMap.th = wrapMap.td; + +// IE can't serialize and + + + + + +
                          test markup
                          + + diff --git a/js/libraries/balupton-history/vendor/qunit/test/index.html b/js/libraries/balupton-history/vendor/qunit/test/index.html new file mode 100755 index 00000000..64ccfcce --- /dev/null +++ b/js/libraries/balupton-history/vendor/qunit/test/index.html @@ -0,0 +1,19 @@ + + + + + QUnit Test Suite + + + + + + +

                          QUnit Test Suite

                          +

                          +
                          +

                          +
                            +
                            test markup
                            + + diff --git a/js/libraries/balupton-history/vendor/qunit/test/logs.html b/js/libraries/balupton-history/vendor/qunit/test/logs.html new file mode 100755 index 00000000..bd135074 --- /dev/null +++ b/js/libraries/balupton-history/vendor/qunit/test/logs.html @@ -0,0 +1,17 @@ + + + + QUnit Test Suite + + + + + +

                            QUnit Test Suite

                            +

                            +
                            +

                            +
                              +
                              test markup
                              + + diff --git a/js/libraries/balupton-history/vendor/qunit/test/logs.js b/js/libraries/balupton-history/vendor/qunit/test/logs.js new file mode 100755 index 00000000..64dc203b --- /dev/null +++ b/js/libraries/balupton-history/vendor/qunit/test/logs.js @@ -0,0 +1,150 @@ +// TODO disable reordering for this suite! + + +var begin = 0, + moduleStart = 0, + moduleDone = 0, + testStart = 0, + testDone = 0, + log = 0, + moduleContext, + moduleDoneContext, + testContext, + testDoneContext, + logContext; + +QUnit.begin = function() { + begin++; +}; +QUnit.done = function() { +}; +QUnit.moduleStart = function(context) { + moduleStart++; + moduleContext = context; +}; +QUnit.moduleDone = function(context) { + moduleDone++; + moduleDoneContext = context; +}; +QUnit.testStart = function(context) { + testStart++; + testContext = context; +}; +QUnit.testDone = function(context) { + testDone++; + testDoneContext = context; +}; +QUnit.log = function(context) { + log++; + logContext = context; +}; + +var logs = ["begin", "testStart", "testDone", "log", "moduleStart", "moduleDone", "done"]; +for (var i = 0; i < logs.length; i++) { + (function() { + var log = logs[i], + logger = QUnit[log]; + QUnit[log] = function() { + console.log(log, arguments); + logger.apply(this, arguments); + }; + })(); +} + +module("logs1"); + +test("test1", 13, function() { + equal(begin, 1); + equal(moduleStart, 1); + equal(testStart, 1); + equal(testDone, 0); + equal(moduleDone, 0); + + deepEqual(logContext, { + result: true, + message: undefined, + actual: 0, + expected: 0 + }); + equal("foo", "foo", "msg"); + deepEqual(logContext, { + result: true, + message: "msg", + actual: "foo", + expected: "foo" + }); + strictEqual(testDoneContext, undefined); + deepEqual(testContext, { + name: "test1" + }); + strictEqual(moduleDoneContext, undefined); + deepEqual(moduleContext, { + name: "logs1" + }); + + equal(log, 12); +}); +test("test2", 10, function() { + equal(begin, 1); + equal(moduleStart, 1); + equal(testStart, 2); + equal(testDone, 1); + equal(moduleDone, 0); + + deepEqual(testDoneContext, { + name: "test1", + failed: 0, + passed: 13, + total: 13 + }); + deepEqual(testContext, { + name: "test2" + }); + strictEqual(moduleDoneContext, undefined); + deepEqual(moduleContext, { + name: "logs1" + }); + + equal(log, 22); +}); + +module("logs2"); + +test("test1", 9, function() { + equal(begin, 1); + equal(moduleStart, 2); + equal(testStart, 3); + equal(testDone, 2); + equal(moduleDone, 1); + + deepEqual(testContext, { + name: "test1" + }); + deepEqual(moduleDoneContext, { + name: "logs1", + failed: 0, + passed: 23, + total: 23 + }); + deepEqual(moduleContext, { + name: "logs2" + }); + + equal(log, 31); +}); +test("test2", 8, function() { + equal(begin, 1); + equal(moduleStart, 2); + equal(testStart, 4); + equal(testDone, 3); + equal(moduleDone, 1); + + deepEqual(testContext, { + name: "test2" + }); + deepEqual(moduleContext, { + name: "logs2" + }); + + equal(log, 39); +}); diff --git a/js/libraries/balupton-history/vendor/qunit/test/same.js b/js/libraries/balupton-history/vendor/qunit/test/same.js new file mode 100755 index 00000000..fa7e3eb9 --- /dev/null +++ b/js/libraries/balupton-history/vendor/qunit/test/same.js @@ -0,0 +1,1421 @@ +module("equiv"); + + +test("Primitive types and constants", function () { + equals(QUnit.equiv(null, null), true, "null"); + equals(QUnit.equiv(null, {}), false, "null"); + equals(QUnit.equiv(null, undefined), false, "null"); + equals(QUnit.equiv(null, 0), false, "null"); + equals(QUnit.equiv(null, false), false, "null"); + equals(QUnit.equiv(null, ''), false, "null"); + equals(QUnit.equiv(null, []), false, "null"); + + equals(QUnit.equiv(undefined, undefined), true, "undefined"); + equals(QUnit.equiv(undefined, null), false, "undefined"); + equals(QUnit.equiv(undefined, 0), false, "undefined"); + equals(QUnit.equiv(undefined, false), false, "undefined"); + equals(QUnit.equiv(undefined, {}), false, "undefined"); + equals(QUnit.equiv(undefined, []), false, "undefined"); + equals(QUnit.equiv(undefined, ""), false, "undefined"); + + // Nan usually doest not equal to Nan using the '==' operator. + // Only isNaN() is able to do it. + equals(QUnit.equiv(0/0, 0/0), true, "NaN"); // NaN VS NaN + equals(QUnit.equiv(1/0, 2/0), true, "Infinity"); // Infinity VS Infinity + equals(QUnit.equiv(-1/0, 2/0), false, "-Infinity, Infinity"); // -Infinity VS Infinity + equals(QUnit.equiv(-1/0, -2/0), true, "-Infinity, -Infinity"); // -Infinity VS -Infinity + equals(QUnit.equiv(0/0, 1/0), false, "NaN, Infinity"); // Nan VS Infinity + equals(QUnit.equiv(1/0, 0/0), false, "NaN, Infinity"); // Nan VS Infinity + equals(QUnit.equiv(0/0, null), false, "NaN"); + equals(QUnit.equiv(0/0, undefined), false, "NaN"); + equals(QUnit.equiv(0/0, 0), false, "NaN"); + equals(QUnit.equiv(0/0, false), false, "NaN"); + equals(QUnit.equiv(0/0, function () {}), false, "NaN"); + equals(QUnit.equiv(1/0, null), false, "NaN, Infinity"); + equals(QUnit.equiv(1/0, undefined), false, "NaN, Infinity"); + equals(QUnit.equiv(1/0, 0), false, "NaN, Infinity"); + equals(QUnit.equiv(1/0, 1), false, "NaN, Infinity"); + equals(QUnit.equiv(1/0, false), false, "NaN, Infinity"); + equals(QUnit.equiv(1/0, true), false, "NaN, Infinity"); + equals(QUnit.equiv(1/0, function () {}), false, "NaN, Infinity"); + + equals(QUnit.equiv(0, 0), true, "number"); + equals(QUnit.equiv(0, 1), false, "number"); + equals(QUnit.equiv(1, 0), false, "number"); + equals(QUnit.equiv(1, 1), true, "number"); + equals(QUnit.equiv(1.1, 1.1), true, "number"); + equals(QUnit.equiv(0.0000005, 0.0000005), true, "number"); + equals(QUnit.equiv(0, ''), false, "number"); + equals(QUnit.equiv(0, '0'), false, "number"); + equals(QUnit.equiv(1, '1'), false, "number"); + equals(QUnit.equiv(0, false), false, "number"); + equals(QUnit.equiv(1, true), false, "number"); + + equals(QUnit.equiv(true, true), true, "boolean"); + equals(QUnit.equiv(true, false), false, "boolean"); + equals(QUnit.equiv(false, true), false, "boolean"); + equals(QUnit.equiv(false, 0), false, "boolean"); + equals(QUnit.equiv(false, null), false, "boolean"); + equals(QUnit.equiv(false, undefined), false, "boolean"); + equals(QUnit.equiv(true, 1), false, "boolean"); + equals(QUnit.equiv(true, null), false, "boolean"); + equals(QUnit.equiv(true, undefined), false, "boolean"); + + equals(QUnit.equiv('', ''), true, "string"); + equals(QUnit.equiv('a', 'a'), true, "string"); + equals(QUnit.equiv("foobar", "foobar"), true, "string"); + equals(QUnit.equiv("foobar", "foo"), false, "string"); + equals(QUnit.equiv('', 0), false, "string"); + equals(QUnit.equiv('', false), false, "string"); + equals(QUnit.equiv('', null), false, "string"); + equals(QUnit.equiv('', undefined), false, "string"); + + // Short annotation VS new annotation + equals(QUnit.equiv(0, new Number()), true, "short annotation VS new annotation"); + equals(QUnit.equiv(new Number(), 0), true, "short annotation VS new annotation"); + equals(QUnit.equiv(1, new Number(1)), true, "short annotation VS new annotation"); + equals(QUnit.equiv(new Number(1), 1), true, "short annotation VS new annotation"); + equals(QUnit.equiv(new Number(0), 1), false, "short annotation VS new annotation"); + equals(QUnit.equiv(0, new Number(1)), false, "short annotation VS new annotation"); + + equals(QUnit.equiv(new String(), ""), true, "short annotation VS new annotation"); + equals(QUnit.equiv("", new String()), true, "short annotation VS new annotation"); + equals(QUnit.equiv(new String("My String"), "My String"), true, "short annotation VS new annotation"); + equals(QUnit.equiv("My String", new String("My String")), true, "short annotation VS new annotation"); + equals(QUnit.equiv("Bad String", new String("My String")), false, "short annotation VS new annotation"); + equals(QUnit.equiv(new String("Bad String"), "My String"), false, "short annotation VS new annotation"); + + equals(QUnit.equiv(false, new Boolean()), true, "short annotation VS new annotation"); + equals(QUnit.equiv(new Boolean(), false), true, "short annotation VS new annotation"); + equals(QUnit.equiv(true, new Boolean(true)), true, "short annotation VS new annotation"); + equals(QUnit.equiv(new Boolean(true), true), true, "short annotation VS new annotation"); + equals(QUnit.equiv(true, new Boolean(1)), true, "short annotation VS new annotation"); + equals(QUnit.equiv(false, new Boolean(false)), true, "short annotation VS new annotation"); + equals(QUnit.equiv(new Boolean(false), false), true, "short annotation VS new annotation"); + equals(QUnit.equiv(false, new Boolean(0)), true, "short annotation VS new annotation"); + equals(QUnit.equiv(true, new Boolean(false)), false, "short annotation VS new annotation"); + equals(QUnit.equiv(new Boolean(false), true), false, "short annotation VS new annotation"); + + equals(QUnit.equiv(new Object(), {}), true, "short annotation VS new annotation"); + equals(QUnit.equiv({}, new Object()), true, "short annotation VS new annotation"); + equals(QUnit.equiv(new Object(), {a:1}), false, "short annotation VS new annotation"); + equals(QUnit.equiv({a:1}, new Object()), false, "short annotation VS new annotation"); + equals(QUnit.equiv({a:undefined}, new Object()), false, "short annotation VS new annotation"); + equals(QUnit.equiv(new Object(), {a:undefined}), false, "short annotation VS new annotation"); +}); + +test("Objects Basics.", function() { + equals(QUnit.equiv({}, {}), true); + equals(QUnit.equiv({}, null), false); + equals(QUnit.equiv({}, undefined), false); + equals(QUnit.equiv({}, 0), false); + equals(QUnit.equiv({}, false), false); + + // This test is a hard one, it is very important + // REASONS: + // 1) They are of the same type "object" + // 2) [] instanceof Object is true + // 3) Their properties are the same (doesn't exists) + equals(QUnit.equiv({}, []), false); + + equals(QUnit.equiv({a:1}, {a:1}), true); + equals(QUnit.equiv({a:1}, {a:"1"}), false); + equals(QUnit.equiv({a:[]}, {a:[]}), true); + equals(QUnit.equiv({a:{}}, {a:null}), false); + equals(QUnit.equiv({a:1}, {}), false); + equals(QUnit.equiv({}, {a:1}), false); + + // Hard ones + equals(QUnit.equiv({a:undefined}, {}), false); + equals(QUnit.equiv({}, {a:undefined}), false); + equals(QUnit.equiv( + { + a: [{ bar: undefined }] + }, + { + a: [{ bat: undefined }] + } + ), false); +}); + + +test("Arrays Basics.", function() { + + equals(QUnit.equiv([], []), true); + + // May be a hard one, can invoke a crash at execution. + // because their types are both "object" but null isn't + // like a true object, it doesn't have any property at all. + equals(QUnit.equiv([], null), false); + + equals(QUnit.equiv([], undefined), false); + equals(QUnit.equiv([], false), false); + equals(QUnit.equiv([], 0), false); + equals(QUnit.equiv([], ""), false); + + // May be a hard one, but less hard + // than {} with [] (note the order) + equals(QUnit.equiv([], {}), false); + + equals(QUnit.equiv([null],[]), false); + equals(QUnit.equiv([undefined],[]), false); + equals(QUnit.equiv([],[null]), false); + equals(QUnit.equiv([],[undefined]), false); + equals(QUnit.equiv([null],[undefined]), false); + equals(QUnit.equiv([[]],[[]]), true); + equals(QUnit.equiv([[],[],[]],[[],[],[]]), true); + equals(QUnit.equiv( + [[],[],[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]], + [[],[],[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]), + true); + equals(QUnit.equiv( + [[],[],[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]], + [[],[],[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]), // shorter + false); + equals(QUnit.equiv( + [[],[],[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[{}]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]], + [[],[],[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]), // deepest element not an array + false); + + // same multidimensional + equals(QUnit.equiv( + [1,2,3,4,5,6,7,8,9, [ + 1,2,3,4,5,6,7,8,9, [ + 1,2,3,4,5,[ + [6,7,8,9, [ + [ + 1,2,3,4,[ + 2,3,4,[ + 1,2,[ + 1,2,3,4,[ + 1,2,3,4,5,6,7,8,9,[ + 0 + ],1,2,3,4,5,6,7,8,9 + ],5,6,7,8,9 + ],4,5,6,7,8,9 + ],5,6,7,8,9 + ],5,6,7 + ] + ] + ] + ] + ]]], + [1,2,3,4,5,6,7,8,9, [ + 1,2,3,4,5,6,7,8,9, [ + 1,2,3,4,5,[ + [6,7,8,9, [ + [ + 1,2,3,4,[ + 2,3,4,[ + 1,2,[ + 1,2,3,4,[ + 1,2,3,4,5,6,7,8,9,[ + 0 + ],1,2,3,4,5,6,7,8,9 + ],5,6,7,8,9 + ],4,5,6,7,8,9 + ],5,6,7,8,9 + ],5,6,7 + ] + ] + ] + ] + ]]]), + true, "Multidimensional"); + + // different multidimensional + equals(QUnit.equiv( + [1,2,3,4,5,6,7,8,9, [ + 1,2,3,4,5,6,7,8,9, [ + 1,2,3,4,5,[ + [6,7,8,9, [ + [ + 1,2,3,4,[ + 2,3,4,[ + 1,2,[ + 1,2,3,4,[ + 1,2,3,4,5,6,7,8,9,[ + 0 + ],1,2,3,4,5,6,7,8,9 + ],5,6,7,8,9 + ],4,5,6,7,8,9 + ],5,6,7,8,9 + ],5,6,7 + ] + ] + ] + ] + ]]], + [1,2,3,4,5,6,7,8,9, [ + 1,2,3,4,5,6,7,8,9, [ + 1,2,3,4,5,[ + [6,7,8,9, [ + [ + 1,2,3,4,[ + 2,3,4,[ + 1,2,[ + '1',2,3,4,[ // string instead of number + 1,2,3,4,5,6,7,8,9,[ + 0 + ],1,2,3,4,5,6,7,8,9 + ],5,6,7,8,9 + ],4,5,6,7,8,9 + ],5,6,7,8,9 + ],5,6,7 + ] + ] + ] + ] + ]]]), + false, "Multidimensional"); + + // different multidimensional + equals(QUnit.equiv( + [1,2,3,4,5,6,7,8,9, [ + 1,2,3,4,5,6,7,8,9, [ + 1,2,3,4,5,[ + [6,7,8,9, [ + [ + 1,2,3,4,[ + 2,3,4,[ + 1,2,[ + 1,2,3,4,[ + 1,2,3,4,5,6,7,8,9,[ + 0 + ],1,2,3,4,5,6,7,8,9 + ],5,6,7,8,9 + ],4,5,6,7,8,9 + ],5,6,7,8,9 + ],5,6,7 + ] + ] + ] + ] + ]]], + [1,2,3,4,5,6,7,8,9, [ + 1,2,3,4,5,6,7,8,9, [ + 1,2,3,4,5,[ + [6,7,8,9, [ + [ + 1,2,3,4,[ + 2,3,[ // missing an element (4) + 1,2,[ + 1,2,3,4,[ + 1,2,3,4,5,6,7,8,9,[ + 0 + ],1,2,3,4,5,6,7,8,9 + ],5,6,7,8,9 + ],4,5,6,7,8,9 + ],5,6,7,8,9 + ],5,6,7 + ] + ] + ] + ] + ]]]), + false, "Multidimensional"); +}); + +test("Functions.", function() { + var f0 = function () {}; + var f1 = function () {}; + + // f2 and f3 have the same code, formatted differently + var f2 = function () {var i = 0;}; + var f3 = function () { + var i = 0 // this comment and no semicoma as difference + }; + + equals(QUnit.equiv(function() {}, function() {}), false, "Anonymous functions"); // exact source code + equals(QUnit.equiv(function() {}, function() {return true;}), false, "Anonymous functions"); + + equals(QUnit.equiv(f0, f0), true, "Function references"); // same references + equals(QUnit.equiv(f0, f1), false, "Function references"); // exact source code, different references + equals(QUnit.equiv(f2, f3), false, "Function references"); // equivalent source code, different references + equals(QUnit.equiv(f1, f2), false, "Function references"); // different source code, different references + equals(QUnit.equiv(function() {}, true), false); + equals(QUnit.equiv(function() {}, undefined), false); + equals(QUnit.equiv(function() {}, null), false); + equals(QUnit.equiv(function() {}, {}), false); +}); + + +test("Date instances.", function() { + // Date, we don't need to test Date.parse() because it returns a number. + // Only test the Date instances by setting them a fix date. + // The date use is midnight January 1, 1970 + + var d1 = new Date(); + d1.setTime(0); // fix the date + + var d2 = new Date(); + d2.setTime(0); // fix the date + + var d3 = new Date(); // The very now + + // Anyway their types differs, just in case the code fails in the order in which it deals with date + equals(QUnit.equiv(d1, 0), false); // d1.valueOf() returns 0, but d1 and 0 are different + // test same values date and different instances equality + equals(QUnit.equiv(d1, d2), true); + // test different date and different instances difference + equals(QUnit.equiv(d1, d3), false); +}); + + +test("RegExp.", function() { + // Must test cases that imply those traps: + // var a = /./; + // a instanceof Object; // Oops + // a instanceof RegExp; // Oops + // typeof a === "function"; // Oops, false in IE and Opera, true in FF and Safari ("object") + + // Tests same regex with same modifiers in different order + var r = /foo/; + var r5 = /foo/gim; + var r6 = /foo/gmi; + var r7 = /foo/igm; + var r8 = /foo/img; + var r9 = /foo/mig; + var r10 = /foo/mgi; + var ri1 = /foo/i; + var ri2 = /foo/i; + var rm1 = /foo/m; + var rm2 = /foo/m; + var rg1 = /foo/g; + var rg2 = /foo/g; + + equals(QUnit.equiv(r5, r6), true, "Modifier order"); + equals(QUnit.equiv(r5, r7), true, "Modifier order"); + equals(QUnit.equiv(r5, r8), true, "Modifier order"); + equals(QUnit.equiv(r5, r9), true, "Modifier order"); + equals(QUnit.equiv(r5, r10), true, "Modifier order"); + equals(QUnit.equiv(r, r5), false, "Modifier"); + + equals(QUnit.equiv(ri1, ri2), true, "Modifier"); + equals(QUnit.equiv(r, ri1), false, "Modifier"); + equals(QUnit.equiv(ri1, rm1), false, "Modifier"); + equals(QUnit.equiv(r, rm1), false, "Modifier"); + equals(QUnit.equiv(rm1, ri1), false, "Modifier"); + equals(QUnit.equiv(rm1, rm2), true, "Modifier"); + equals(QUnit.equiv(rg1, rm1), false, "Modifier"); + equals(QUnit.equiv(rm1, rg1), false, "Modifier"); + equals(QUnit.equiv(rg1, rg2), true, "Modifier"); + + // Different regex, same modifiers + var r11 = /[a-z]/gi; + var r13 = /[0-9]/gi; // oops! different + equals(QUnit.equiv(r11, r13), false, "Regex pattern"); + + var r14 = /0/ig; + var r15 = /"0"/ig; // oops! different + equals(QUnit.equiv(r14, r15), false, "Regex pattern"); + + var r1 = /[\n\r\u2028\u2029]/g; + var r2 = /[\n\r\u2028\u2029]/g; + var r3 = /[\n\r\u2028\u2028]/g; // differs from r1 + var r4 = /[\n\r\u2028\u2029]/; // differs from r1 + + equals(QUnit.equiv(r1, r2), true, "Regex pattern"); + equals(QUnit.equiv(r1, r3), false, "Regex pattern"); + equals(QUnit.equiv(r1, r4), false, "Regex pattern"); + + // More complex regex + var regex1 = "^[-_.a-z0-9]+@([-_a-z0-9]+\\.)+([A-Za-z][A-Za-z]|[A-Za-z][A-Za-z][A-Za-z])|(([0-9][0-9]?|[0-1][0-9][0-9]|[2][0-4][0-9]|[2][5][0-5]))$"; + var regex2 = "^[-_.a-z0-9]+@([-_a-z0-9]+\\.)+([A-Za-z][A-Za-z]|[A-Za-z][A-Za-z][A-Za-z])|(([0-9][0-9]?|[0-1][0-9][0-9]|[2][0-4][0-9]|[2][5][0-5]))$"; + // regex 3 is different: '.' not escaped + var regex3 = "^[-_.a-z0-9]+@([-_a-z0-9]+.)+([A-Za-z][A-Za-z]|[A-Za-z][A-Za-z][A-Za-z])|(([0-9][0-9]?|[0-1][0-9][0-9]|[2][0-4][0-9]|[2][5][0-5]))$"; + + var r21 = new RegExp(regex1); + var r22 = new RegExp(regex2); + var r23 = new RegExp(regex3); // diff from r21, not same pattern + var r23a = new RegExp(regex3, "gi"); // diff from r23, not same modifier + var r24a = new RegExp(regex3, "ig"); // same as r23a + + equals(QUnit.equiv(r21, r22), true, "Complex Regex"); + equals(QUnit.equiv(r21, r23), false, "Complex Regex"); + equals(QUnit.equiv(r23, r23a), false, "Complex Regex"); + equals(QUnit.equiv(r23a, r24a), true, "Complex Regex"); + + // typeof r1 is "function" in some browsers and "object" in others so we must cover this test + var re = / /; + equals(QUnit.equiv(re, function () {}), false, "Regex internal"); + equals(QUnit.equiv(re, {}), false, "Regex internal"); +}); + + +test("Complex Objects.", function() { + + function fn1() { + return "fn1"; + } + function fn2() { + return "fn2"; + } + + // Try to invert the order of some properties to make sure it is covered. + // It can failed when properties are compared between unsorted arrays. + equals(QUnit.equiv( + { + a: 1, + b: null, + c: [{}], + d: { + a: 3.14159, + b: false, + c: { + e: fn1, + f: [[[]]], + g: { + j: { + k: { + n: { + r: "r", + s: [1,2,3], + t: undefined, + u: 0, + v: { + w: { + x: { + y: "Yahoo!", + z: null + } + } + } + }, + q: [], + p: 1/0, + o: 99 + }, + l: undefined, + m: null + } + }, + d: 0, + i: true, + h: "false" + } + }, + e: undefined, + g: "", + h: "h", + f: {}, + i: [] + }, + { + a: 1, + b: null, + c: [{}], + d: { + b: false, + a: 3.14159, + c: { + d: 0, + e: fn1, + f: [[[]]], + g: { + j: { + k: { + n: { + r: "r", + t: undefined, + u: 0, + s: [1,2,3], + v: { + w: { + x: { + z: null, + y: "Yahoo!" + } + } + } + }, + o: 99, + p: 1/0, + q: [] + }, + l: undefined, + m: null + } + }, + i: true, + h: "false" + } + }, + e: undefined, + g: "", + f: {}, + h: "h", + i: [] + } + ), true); + + equals(QUnit.equiv( + { + a: 1, + b: null, + c: [{}], + d: { + a: 3.14159, + b: false, + c: { + d: 0, + e: fn1, + f: [[[]]], + g: { + j: { + k: { + n: { + //r: "r", // different: missing a property + s: [1,2,3], + t: undefined, + u: 0, + v: { + w: { + x: { + y: "Yahoo!", + z: null + } + } + } + }, + o: 99, + p: 1/0, + q: [] + }, + l: undefined, + m: null + } + }, + h: "false", + i: true + } + }, + e: undefined, + f: {}, + g: "", + h: "h", + i: [] + }, + { + a: 1, + b: null, + c: [{}], + d: { + a: 3.14159, + b: false, + c: { + d: 0, + e: fn1, + f: [[[]]], + g: { + j: { + k: { + n: { + r: "r", + s: [1,2,3], + t: undefined, + u: 0, + v: { + w: { + x: { + y: "Yahoo!", + z: null + } + } + } + }, + o: 99, + p: 1/0, + q: [] + }, + l: undefined, + m: null + } + }, + h: "false", + i: true + } + }, + e: undefined, + f: {}, + g: "", + h: "h", + i: [] + } + ), false); + + equals(QUnit.equiv( + { + a: 1, + b: null, + c: [{}], + d: { + a: 3.14159, + b: false, + c: { + d: 0, + e: fn1, + f: [[[]]], + g: { + j: { + k: { + n: { + r: "r", + s: [1,2,3], + t: undefined, + u: 0, + v: { + w: { + x: { + y: "Yahoo!", + z: null + } + } + } + }, + o: 99, + p: 1/0, + q: [] + }, + l: undefined, + m: null + } + }, + h: "false", + i: true + } + }, + e: undefined, + f: {}, + g: "", + h: "h", + i: [] + }, + { + a: 1, + b: null, + c: [{}], + d: { + a: 3.14159, + b: false, + c: { + d: 0, + e: fn1, + f: [[[]]], + g: { + j: { + k: { + n: { + r: "r", + s: [1,2,3], + //t: undefined, // different: missing a property with an undefined value + u: 0, + v: { + w: { + x: { + y: "Yahoo!", + z: null + } + } + } + }, + o: 99, + p: 1/0, + q: [] + }, + l: undefined, + m: null + } + }, + h: "false", + i: true + } + }, + e: undefined, + f: {}, + g: "", + h: "h", + i: [] + } + ), false); + + equals(QUnit.equiv( + { + a: 1, + b: null, + c: [{}], + d: { + a: 3.14159, + b: false, + c: { + d: 0, + e: fn1, + f: [[[]]], + g: { + j: { + k: { + n: { + r: "r", + s: [1,2,3], + t: undefined, + u: 0, + v: { + w: { + x: { + y: "Yahoo!", + z: null + } + } + } + }, + o: 99, + p: 1/0, + q: [] + }, + l: undefined, + m: null + } + }, + h: "false", + i: true + } + }, + e: undefined, + f: {}, + g: "", + h: "h", + i: [] + }, + { + a: 1, + b: null, + c: [{}], + d: { + a: 3.14159, + b: false, + c: { + d: 0, + e: fn1, + f: [[[]]], + g: { + j: { + k: { + n: { + r: "r", + s: [1,2,3], + t: undefined, + u: 0, + v: { + w: { + x: { + y: "Yahoo!", + z: null + } + } + } + }, + o: 99, + p: 1/0, + q: {} // different was [] + }, + l: undefined, + m: null + } + }, + h: "false", + i: true + } + }, + e: undefined, + f: {}, + g: "", + h: "h", + i: [] + } + ), false); + + var same1 = { + a: [ + "string", null, 0, "1", 1, { + prop: null, + foo: [1,2,null,{}, [], [1,2,3]], + bar: undefined + }, 3, "Hey!", "Κάνε πάντα γνωρίζουμε ας των, μηχανής επιδιόρθωσης επιδιορθώσεις ώς μια. Κλπ ας" + ], + unicode: "老 汉语中存在 港澳和海外的华人圈中 贵州 我去了书店 现在尚有争", + b: "b", + c: fn1 + }; + + var same2 = { + a: [ + "string", null, 0, "1", 1, { + prop: null, + foo: [1,2,null,{}, [], [1,2,3]], + bar: undefined + }, 3, "Hey!", "Κάνε πάντα γνωρίζουμε ας των, μηχανής επιδιόρθωσης επιδιορθώσεις ώς μια. Κλπ ας" + ], + unicode: "老 汉语中存在 港澳和海外的华人圈中 贵州 我去了书店 现在尚有争", + b: "b", + c: fn1 + }; + + var diff1 = { + a: [ + "string", null, 0, "1", 1, { + prop: null, + foo: [1,2,null,{}, [], [1,2,3,4]], // different: 4 was add to the array + bar: undefined + }, 3, "Hey!", "Κάνε πάντα γνωρίζουμε ας των, μηχανής επιδιόρθωσης επιδιορθώσεις ώς μια. Κλπ ας" + ], + unicode: "老 汉语中存在 港澳和海外的华人圈中 贵州 我去了书店 现在尚有争", + b: "b", + c: fn1 + }; + + var diff2 = { + a: [ + "string", null, 0, "1", 1, { + prop: null, + foo: [1,2,null,{}, [], [1,2,3]], + newprop: undefined, // different: newprop was added + bar: undefined + }, 3, "Hey!", "Κάνε πάντα γνωρίζουμε ας των, μηχανής επιδιόρθωσης επιδιορθώσεις ώς μια. Κλπ ας" + ], + unicode: "老 汉语中存在 港澳和海外的华人圈中 贵州 我去了书店 现在尚有争", + b: "b", + c: fn1 + }; + + var diff3 = { + a: [ + "string", null, 0, "1", 1, { + prop: null, + foo: [1,2,null,{}, [], [1,2,3]], + bar: undefined + }, 3, "Hey!", "Κάνε πάντα γνωρίζουμε ας των, μηχανής επιδιόρθωσης επιδιορθώσεις ώς μια. Κλπ α" // different: missing last char + ], + unicode: "老 汉语中存在 港澳和海外的华人圈中 贵州 我去了书店 现在尚有争", + b: "b", + c: fn1 + }; + + var diff4 = { + a: [ + "string", null, 0, "1", 1, { + prop: null, + foo: [1,2,undefined,{}, [], [1,2,3]], // different: undefined instead of null + bar: undefined + }, 3, "Hey!", "Κάνε πάντα γνωρίζουμε ας των, μηχανής επιδιόρθωσης επιδιορθώσεις ώς μια. Κλπ ας" + ], + unicode: "老 汉语中存在 港澳和海外的华人圈中 贵州 我去了书店 现在尚有争", + b: "b", + c: fn1 + }; + + var diff5 = { + a: [ + "string", null, 0, "1", 1, { + prop: null, + foo: [1,2,null,{}, [], [1,2,3]], + bat: undefined // different: property name not "bar" + }, 3, "Hey!", "Κάνε πάντα γνωρίζουμε ας των, μηχανής επιδιόρθωσης επιδιορθώσεις ώς μια. Κλπ ας" + ], + unicode: "老 汉语中存在 港澳和海外的华人圈中 贵州 我去了书店 现在尚有争", + b: "b", + c: fn1 + }; + + equals(QUnit.equiv(same1, same2), true); + equals(QUnit.equiv(same2, same1), true); + equals(QUnit.equiv(same2, diff1), false); + equals(QUnit.equiv(diff1, same2), false); + + equals(QUnit.equiv(same1, diff1), false); + equals(QUnit.equiv(same1, diff2), false); + equals(QUnit.equiv(same1, diff3), false); + equals(QUnit.equiv(same1, diff3), false); + equals(QUnit.equiv(same1, diff4), false); + equals(QUnit.equiv(same1, diff5), false); + equals(QUnit.equiv(diff5, diff1), false); +}); + + +test("Complex Arrays.", function() { + + function fn() { + } + + equals(QUnit.equiv( + [1, 2, 3, true, {}, null, [ + { + a: ["", '1', 0] + }, + 5, 6, 7 + ], "foo"], + [1, 2, 3, true, {}, null, [ + { + a: ["", '1', 0] + }, + 5, 6, 7 + ], "foo"]), + true); + + equals(QUnit.equiv( + [1, 2, 3, true, {}, null, [ + { + a: ["", '1', 0] + }, + 5, 6, 7 + ], "foo"], + [1, 2, 3, true, {}, null, [ + { + b: ["", '1', 0] // not same property name + }, + 5, 6, 7 + ], "foo"]), + false); + + var a = [{ + b: fn, + c: false, + "do": "reserved word", + "for": { + ar: [3,5,9,"hey!", [], { + ar: [1,[ + 3,4,6,9, null, [], [] + ]], + e: fn, + f: undefined + }] + }, + e: 0.43445 + }, 5, "string", 0, fn, false, null, undefined, 0, [ + 4,5,6,7,8,9,11,22,33,44,55,"66", null, [], [[[[[3]]]], "3"], {}, 1/0 + ], [], [[[], "foo", null, { + n: 1/0, + z: { + a: [3,4,5,6,"yep!", undefined, undefined], + b: {} + } + }, {}]]]; + + equals(QUnit.equiv(a, + [{ + b: fn, + c: false, + "do": "reserved word", + "for": { + ar: [3,5,9,"hey!", [], { + ar: [1,[ + 3,4,6,9, null, [], [] + ]], + e: fn, + f: undefined + }] + }, + e: 0.43445 + }, 5, "string", 0, fn, false, null, undefined, 0, [ + 4,5,6,7,8,9,11,22,33,44,55,"66", null, [], [[[[[3]]]], "3"], {}, 1/0 + ], [], [[[], "foo", null, { + n: 1/0, + z: { + a: [3,4,5,6,"yep!", undefined, undefined], + b: {} + } + }, {}]]]), true); + + equals(QUnit.equiv(a, + [{ + b: fn, + c: false, + "do": "reserved word", + "for": { + ar: [3,5,9,"hey!", [], { + ar: [1,[ + 3,4,6,9, null, [], [] + ]], + e: fn, + f: undefined + }] + }, + e: 0.43445 + }, 5, "string", 0, fn, false, null, undefined, 0, [ + 4,5,6,7,8,9,11,22,33,44,55,"66", null, [], [[[[[2]]]], "3"], {}, 1/0 // different: [[[[[2]]]]] instead of [[[[[3]]]]] + ], [], [[[], "foo", null, { + n: 1/0, + z: { + a: [3,4,5,6,"yep!", undefined, undefined], + b: {} + } + }, {}]]]), false); + + equals(QUnit.equiv(a, + [{ + b: fn, + c: false, + "do": "reserved word", + "for": { + ar: [3,5,9,"hey!", [], { + ar: [1,[ + 3,4,6,9, null, [], [] + ]], + e: fn, + f: undefined + }] + }, + e: 0.43445 + }, 5, "string", 0, fn, false, null, undefined, 0, [ + 4,5,6,7,8,9,11,22,33,44,55,"66", null, [], [[[[[3]]]], "3"], {}, 1/0 + ], [], [[[], "foo", null, { + n: -1/0, // different, -Infinity instead of Infinity + z: { + a: [3,4,5,6,"yep!", undefined, undefined], + b: {} + } + }, {}]]]), false); + + equals(QUnit.equiv(a, + [{ + b: fn, + c: false, + "do": "reserved word", + "for": { + ar: [3,5,9,"hey!", [], { + ar: [1,[ + 3,4,6,9, null, [], [] + ]], + e: fn, + f: undefined + }] + }, + e: 0.43445 + }, 5, "string", 0, fn, false, null, undefined, 0, [ + 4,5,6,7,8,9,11,22,33,44,55,"66", null, [], [[[[[3]]]], "3"], {}, 1/0 + ], [], [[[], "foo", { // different: null is missing + n: 1/0, + z: { + a: [3,4,5,6,"yep!", undefined, undefined], + b: {} + } + }, {}]]]), false); + + equals(QUnit.equiv(a, + [{ + b: fn, + c: false, + "do": "reserved word", + "for": { + ar: [3,5,9,"hey!", [], { + ar: [1,[ + 3,4,6,9, null, [], [] + ]], + e: fn + // different: missing property f: undefined + }] + }, + e: 0.43445 + }, 5, "string", 0, fn, false, null, undefined, 0, [ + 4,5,6,7,8,9,11,22,33,44,55,"66", null, [], [[[[[3]]]], "3"], {}, 1/0 + ], [], [[[], "foo", null, { + n: 1/0, + z: { + a: [3,4,5,6,"yep!", undefined, undefined], + b: {} + } + }, {}]]]), false); +}); + + +test("Prototypal inheritance", function() { + function Gizmo(id) { + this.id = id; + } + + function Hoozit(id) { + this.id = id; + } + Hoozit.prototype = new Gizmo(); + + var gizmo = new Gizmo("ok"); + var hoozit = new Hoozit("ok"); + + // Try this test many times after test on instances that hold function + // to make sure that our code does not mess with last object constructor memoization. + equals(QUnit.equiv(function () {}, function () {}), false); + + // Hoozit inherit from Gizmo + // hoozit instanceof Hoozit; // true + // hoozit instanceof Gizmo; // true + equals(QUnit.equiv(hoozit, gizmo), true); + + Gizmo.prototype.bar = true; // not a function just in case we skip them + + // Hoozit inherit from Gizmo + // They are equivalent + equals(QUnit.equiv(hoozit, gizmo), true); + + // Make sure this is still true !important + // The reason for this is that I forgot to reset the last + // caller to where it were called from. + equals(QUnit.equiv(function () {}, function () {}), false); + + // Make sure this is still true !important + equals(QUnit.equiv(hoozit, gizmo), true); + + Hoozit.prototype.foo = true; // not a function just in case we skip them + + // Gizmo does not inherit from Hoozit + // gizmo instanceof Gizmo; // true + // gizmo instanceof Hoozit; // false + // They are not equivalent + equals(QUnit.equiv(hoozit, gizmo), false); + + // Make sure this is still true !important + equals(QUnit.equiv(function () {}, function () {}), false); +}); + + +test("Instances", function() { + function A() {} + var a1 = new A(); + var a2 = new A(); + + function B() { + this.fn = function () {}; + } + var b1 = new B(); + var b2 = new B(); + + equals(QUnit.equiv(a1, a2), true, "Same property, same constructor"); + + // b1.fn and b2.fn are functions but they are different references + // But we decided to skip function for instances. + equals(QUnit.equiv(b1, b2), true, "Same property, same constructor"); + equals(QUnit.equiv(a1, b1), false, "Same properties but different constructor"); // failed + + function Car(year) { + var privateVar = 0; + this.year = year; + this.isOld = function() { + return year > 10; + }; + } + + function Human(year) { + var privateVar = 1; + this.year = year; + this.isOld = function() { + return year > 80; + }; + } + + var car = new Car(30); + var carSame = new Car(30); + var carDiff = new Car(10); + var human = new Human(30); + + var diff = { + year: 30 + }; + + var same = { + year: 30, + isOld: function () {} + }; + + equals(QUnit.equiv(car, car), true); + equals(QUnit.equiv(car, carDiff), false); + equals(QUnit.equiv(car, carSame), true); + equals(QUnit.equiv(car, human), false); +}); + + +test("Complex Instances Nesting (with function value in literals and/or in nested instances)", function() { + function A(fn) { + this.a = {}; + this.fn = fn; + this.b = {a: []}; + this.o = {}; + this.fn1 = fn; + } + function B(fn) { + this.fn = fn; + this.fn1 = function () {}; + this.a = new A(function () {}); + } + + function fnOutside() { + } + + function C(fn) { + function fnInside() { + } + this.x = 10; + this.fn = fn; + this.fn1 = function () {}; + this.fn2 = fnInside; + this.fn3 = { + a: true, + b: fnOutside // ok make reference to a function in all instances scope + }; + this.o1 = {}; + + // This function will be ignored. + // Even if it is not visible for all instances (e.g. locked in a closures), + // it is from a property that makes part of an instance (e.g. from the C constructor) + this.b1 = new B(function () {}); + this.b2 = new B({ + x: { + b2: new B(function() {}) + } + }); + } + + function D(fn) { + function fnInside() { + } + this.x = 10; + this.fn = fn; + this.fn1 = function () {}; + this.fn2 = fnInside; + this.fn3 = { + a: true, + b: fnOutside, // ok make reference to a function in all instances scope + + // This function won't be ingored. + // It isn't visible for all C insances + // and it is not in a property of an instance. (in an Object instances e.g. the object literal) + c: fnInside + }; + this.o1 = {}; + + // This function will be ignored. + // Even if it is not visible for all instances (e.g. locked in a closures), + // it is from a property that makes part of an instance (e.g. from the C constructor) + this.b1 = new B(function () {}); + this.b2 = new B({ + x: { + b2: new B(function() {}) + } + }); + } + + function E(fn) { + function fnInside() { + } + this.x = 10; + this.fn = fn; + this.fn1 = function () {}; + this.fn2 = fnInside; + this.fn3 = { + a: true, + b: fnOutside // ok make reference to a function in all instances scope + }; + this.o1 = {}; + + // This function will be ignored. + // Even if it is not visible for all instances (e.g. locked in a closures), + // it is from a property that makes part of an instance (e.g. from the C constructor) + this.b1 = new B(function () {}); + this.b2 = new B({ + x: { + b1: new B({a: function() {}}), + b2: new B(function() {}) + } + }); + } + + + var a1 = new A(function () {}); + var a2 = new A(function () {}); + equals(QUnit.equiv(a1, a2), true); + + equals(QUnit.equiv(a1, a2), true); // different instances + + var b1 = new B(function () {}); + var b2 = new B(function () {}); + equals(QUnit.equiv(b1, b2), true); + + var c1 = new C(function () {}); + var c2 = new C(function () {}); + equals(QUnit.equiv(c1, c2), true); + + var d1 = new D(function () {}); + var d2 = new D(function () {}); + equals(QUnit.equiv(d1, d2), false); + + var e1 = new E(function () {}); + var e2 = new E(function () {}); + equals(QUnit.equiv(e1, e2), false); + +}); + + +test('object with references to self wont loop', function(){ + var circularA = { + abc:null + }, circularB = { + abc:null + }; + circularA.abc = circularA; + circularB.abc = circularB; + equals(QUnit.equiv(circularA, circularB), true, "Should not repeat test on object (ambigous test)"); + + circularA.def = 1; + circularB.def = 1; + equals(QUnit.equiv(circularA, circularB), true, "Should not repeat test on object (ambigous test)"); + + circularA.def = 1; + circularB.def = 0; + equals(QUnit.equiv(circularA, circularB), false, "Should not repeat test on object (unambigous test)"); +}); + +test('array with references to self wont loop', function(){ + var circularA = [], + circularB = []; + circularA.push(circularA); + circularB.push(circularB); + equals(QUnit.equiv(circularA, circularB), true, "Should not repeat test on array (ambigous test)"); + + circularA.push( 'abc' ); + circularB.push( 'abc' ); + equals(QUnit.equiv(circularA, circularB), true, "Should not repeat test on array (ambigous test)"); + + circularA.push( 'hello' ); + circularB.push( 'goodbye' ); + equals(QUnit.equiv(circularA, circularB), false, "Should not repeat test on array (unambigous test)"); +}); + +test('mixed object/array with references to self wont loop', function(){ + var circularA = [{abc:null}], + circularB = [{abc:null}]; + circularA[0].abc = circularA; + circularB[0].abc = circularB; + + circularA.push(circularA); + circularB.push(circularB); + equals(QUnit.equiv(circularA, circularB), true, "Should not repeat test on object/array (ambigous test)"); + + circularA[0].def = 1; + circularB[0].def = 1; + equals(QUnit.equiv(circularA, circularB), true, "Should not repeat test on object/array (ambigous test)"); + + circularA[0].def = 1; + circularB[0].def = 0; + equals(QUnit.equiv(circularA, circularB), false, "Should not repeat test on object/array (unambigous test)"); +}); + +test("Test that must be done at the end because they extend some primitive's prototype", function() { + // Try that a function looks like our regular expression. + // This tests if we check that a and b are really both instance of RegExp + Function.prototype.global = true; + Function.prototype.multiline = true; + Function.prototype.ignoreCase = false; + Function.prototype.source = "my regex"; + var re = /my regex/gm; + equals(QUnit.equiv(re, function () {}), false, "A function that looks that a regex isn't a regex"); + // This test will ensures it works in both ways, and ALSO especially that we can make differences + // between RegExp and Function constructor because typeof on a RegExpt instance is "function" + equals(QUnit.equiv(function () {}, re), false, "Same conversely, but ensures that function and regexp are distinct because their constructor are different"); +}); diff --git a/js/libraries/balupton-history/vendor/qunit/test/test.js b/js/libraries/balupton-history/vendor/qunit/test/test.js new file mode 100755 index 00000000..3f942d2d --- /dev/null +++ b/js/libraries/balupton-history/vendor/qunit/test/test.js @@ -0,0 +1,324 @@ +test("module without setup/teardown (default)", function() { + expect(1); + ok(true); +}); + +test("expect in test", 3, function() { + ok(true); + ok(true); + ok(true); +}); + +test("expect in test", 1, function() { + ok(true); +}); + +module("setup test", { + setup: function() { + ok(true); + } +}); + +test("module with setup", function() { + expect(2); + ok(true); +}); + +test("module with setup, expect in test call", 2, function() { + ok(true); +}); + +var state; + +module("setup/teardown test", { + setup: function() { + state = true; + ok(true); + }, + teardown: function() { + ok(true); + } +}); + +test("module with setup/teardown", function() { + expect(3); + ok(true); +}); + +module("setup/teardown test 2"); + +test("module without setup/teardown", function() { + expect(1); + ok(true); +}); + +if (typeof setTimeout !== 'undefined') { +state = 'fail'; + +module("teardown and stop", { + teardown: function() { + equal(state, "done", "Test teardown."); + } +}); + +test("teardown must be called after test ended", function() { + expect(1); + stop(); + setTimeout(function() { + state = "done"; + start(); + }, 13); +}); + +module("async setup test", { + setup: function() { + stop(); + setTimeout(function(){ + ok(true); + start(); + }, 500); + } +}); + +asyncTest("module with async setup", function() { + expect(2); + ok(true); + start(); +}); + +module("async teardown test", { + teardown: function() { + stop(); + setTimeout(function(){ + ok(true); + start(); + }, 500); + } +}); + +asyncTest("module with async teardown", function() { + expect(2); + ok(true); + start(); +}); + +module("asyncTest"); + +asyncTest("asyncTest", function() { + expect(2); + ok(true); + setTimeout(function() { + state = "done"; + ok(true); + start(); + }, 13); +}); + +asyncTest("asyncTest", 2, function() { + ok(true); + setTimeout(function() { + state = "done"; + ok(true); + start(); + }, 13); +}); + +test("sync", 2, function() { + stop(); + setTimeout(function() { + ok(true); + start(); + }, 13); + stop(); + setTimeout(function() { + ok(true); + start(); + }, 125); +}); +} + +module("save scope", { + setup: function() { + this.foo = "bar"; + }, + teardown: function() { + deepEqual(this.foo, "bar"); + } +}); +test("scope check", function() { + expect(2); + deepEqual(this.foo, "bar"); +}); + +module("simple testEnvironment setup", { + foo: "bar", + bugid: "#5311" // example of meta-data +}); +test("scope check", function() { + deepEqual(this.foo, "bar"); +}); +test("modify testEnvironment",function() { + this.foo="hamster"; +}); +test("testEnvironment reset for next test",function() { + deepEqual(this.foo, "bar"); +}); + +module("testEnvironment with object", { + options:{ + recipe:"soup", + ingredients:["hamster","onions"] + } +}); +test("scope check", function() { + deepEqual(this.options, {recipe:"soup",ingredients:["hamster","onions"]}) ; +}); +test("modify testEnvironment",function() { + // since we do a shallow copy, the testEnvironment can be modified + this.options.ingredients.push("carrots"); +}); +test("testEnvironment reset for next test",function() { + deepEqual(this.options, {recipe:"soup",ingredients:["hamster","onions","carrots"]}, "Is this a bug or a feature? Could do a deep copy") ; +}); + + +module("testEnvironment tests"); + +function makeurl() { + var testEnv = QUnit.current_testEnvironment; + var url = testEnv.url || 'http://example.com/search'; + var q = testEnv.q || 'a search test'; + return url + '?q='+encodeURIComponent(q); +} + +test("makeurl working",function() { + equal( QUnit.current_testEnvironment, this, 'The current testEnvironment is global'); + equal( makeurl(), 'http://example.com/search?q=a%20search%20test', 'makeurl returns a default url if nothing specified in the testEnvironment'); +}); + +module("testEnvironment with makeurl settings", { + url: 'http://google.com/', + q: 'another_search_test' +}); +test("makeurl working with settings from testEnvironment", function() { + equal( makeurl(), 'http://google.com/?q=another_search_test', 'rather than passing arguments, we use test metadata to form the url'); +}); +test("each test can extend the module testEnvironment", { + q:'hamstersoup' +}, function() { + equal( makeurl(), 'http://google.com/?q=hamstersoup', 'url from module, q from test'); +}); + +module("jsDump"); +test("jsDump output", function() { + equals( QUnit.jsDump.parse([1, 2]), "[\n 1,\n 2\n]" ); + equals( QUnit.jsDump.parse({top: 5, left: 0}), "{\n \"top\": 5,\n \"left\": 0\n}" ); + if (typeof document !== 'undefined' && document.getElementById("qunit-header")) { + equals( QUnit.jsDump.parse(document.getElementById("qunit-header")), "

                              " ); + equals( QUnit.jsDump.parse(document.getElementsByTagName("h1")), "[\n

                              \n]" ); + } +}); + +module("assertions"); +test("raises",function() { + function CustomError( message ) { + this.message = message; + } + + CustomError.prototype.toString = function() { + return this.message; + }; + + raises( + function() { + throw "error" + } + ); + + raises( + function() { + throw "error" + }, + 'raises with just a message, no expected' + ); + + raises( + function() { + throw new CustomError(); + }, + CustomError, + 'raised error is an instance of CustomError' + ); + + raises( + function() { + throw new CustomError("some error description"); + }, + /description/, + "raised error message contains 'description'" + ); + + raises( + function() { + throw new CustomError("some error description"); + }, + function( err ) { + if ( (err instanceof CustomError) && /description/.test(err) ) { + return true; + } + }, + "custom validation function" + ); + +}); + +if (typeof document !== "undefined") { + +module("fixture"); +test("setup", function() { + document.getElementById("qunit-fixture").innerHTML = "foobar"; +}); +test("basics", function() { + equal( document.getElementById("qunit-fixture").innerHTML, "test markup", "automatically reset" ); +}); + +} + +module("custom assertions"); +(function() { + function mod2(value, expected, message) { + var actual = value % 2; + QUnit.push(actual == expected, actual, expected, message); + } + test("mod2", function() { + mod2(2, 0, "2 % 2 == 0"); + mod2(3, 1, "3 % 2 == 1"); + }) +})(); + +(function() { + var reset = QUnit.reset; + function afterTest() { + ok( false, "reset should not modify test status" ); + } + module("reset"); + test("reset runs assertions", function() { + QUnit.reset = function() { + afterTest(); + reset.apply( this, arguments ); + }; + }); + test("reset runs assertions2", function() { + QUnit.reset = reset; + }); +})(); + +module("noglobals", { + teardown: function() { + delete window.badGlobalVariableIntroducedInTest; + } +}); +test("let teardown clean up globals", function() { + // this test will always pass if run without ?noglobals=true + window.badGlobalVariableIntroducedInTest = true; +}); diff --git a/js/libraries/balupton-history/vendor/right.js b/js/libraries/balupton-history/vendor/right.js new file mode 100755 index 00000000..8c91d9f5 --- /dev/null +++ b/js/libraries/balupton-history/vendor/right.js @@ -0,0 +1,6014 @@ +/** + * RightJS v2.2.3 - http://rightjs.org + * Released under the terms of MIT license + * + * Copyright (C) 2008-2011 Nikolay Nemshilov + */ +/** + * The basic layout for RightJS builds + * + * Copyright (C) 2008-2011 Nikolay Nemshilov + */ +var RightJS = (function(window, document, Object, Array, String, Function, Number, Math, undefined) { + +/** + * The framework description object + * + * Copyright (C) 2008-2011 Nikolay Nemshilov + */ +var RightJS = function(value) { + return value; // <- a dummy method to emulate the safe-mode +}; + +RightJS.version = "2.2.3"; +RightJS.modules =["core", "dom", "form", "events", "xhr", "fx", "cookie"]; + + + +/** + * There are some util methods + * + * Credits: + * Some of the functionality and names are inspired or copied from + * - Prototype (http://prototypejs.org) Copyright (C) Sam Stephenson + * - MooTools (http://mootools.net) Copyright (C) Valerio Proietti + * + * Copyright (C) 2008-2011 Nikolay V. Nemshilov + */ + +/** + * Some top-level variables to shortify the things + */ +var A_proto = Array.prototype, +to_s = Object.prototype.toString, slice = A_proto.slice, +HTML = document.documentElement, UID = 1, // !#server +Wrappers_Cache = [], UID_KEY = 'uniqueNumber', // DON'T change the UID_KEY! + +/** + * extends the first object with the keys and values of the second one + * + * NOTE: the third optional argument tells if the existing values + * of the first object should _NOT_ get updated by the values of the second object + * + * @param oritinal Object destintation object + * @param source Object source object + * @param Boolean flag if the function should not overwrite intersecting values + * @return Object extended destination object + */ +$ext = RightJS.$ext = function(dest, source, dont_overwrite) { + var src = source || {}, key; + + for (key in src) { + if (!dont_overwrite || !(key in dest)) { + dest[key] = src[key]; + } + } + + return dest; +}, + +/** !#server + * evals the given javascript text in the context of the current window + * + * @param String javascript + * @return void + */ +$eval = RightJS.$eval = function(text) { + if (text) { + if ('execScript' in window) { + current_Document.win()._.execScript(text); + } else { + $E('script', {text: text}).insertTo(HTML); + } + } +}, + +/** + * throws an exception to break iterations throw a callback + * + * @return void + * @throws Break + */ +$break = RightJS.$break = function() { + throw new Break(); +}, + +/** + * generates aliases for the object properties + * + * @param object Object object + * @param names Object aliases hash + * @return Object the extended objects + */ +$alias = RightJS.$alias = function(object, names) { + for (var new_name in names) { + object[new_name] = object[names[new_name]]; + } + return object; +}, + +/** + * checks if the given value or a reference points + * to a really defined value + * + * NOTE: will return true for variables equal to null, false, 0, and so one. + * + * EXAMPLE: + * + * var smth = null; + * defined(smth); <- will return true + * + * var obj = {}; + * defined(obj['smth']); <- will return false + * + * @param mixed value + * @return boolean check result + */ +defined = RightJS.defined = function(value) { + return typeof(value) !== 'undefined'; +}, + + +/** + * checks if the given value is a function + * + * @param mixed value + * @return boolean check result + */ +isFunction = RightJS.isFunction = function(value) { + return typeof(value) === 'function'; +}, + +/** + * checks if the given value is a string + * + * @param mixed value + * @return boolean check result + */ +isString = RightJS.isString = function(value) { + return typeof(value) === 'string'; +}, + + +/** + * checks if the given value is a number + * + * @param mixed value to check + * @return boolean check result + */ +isNumber = RightJS.isNumber = function(value) { + return typeof(value) === 'number'; +}, + +/** + * checks if the given value is a hash-like object + * + * @param mixed value + * @return boolean check result + */ +isHash = RightJS.isHash = function(value) { + return to_s.call(value) === '[object Object]'; +}, + +/** + * checks if the given value is an array + * + * @param mixed value to check + * @return boolean check result + */ +isArray = RightJS.isArray = function(value) { + return to_s.call(value) === '[object Array]'; +}, + +/** !#server + * checks if the given value is an element + * + * @param mixed value to check + * @return boolean check result + */ +isElement = RightJS.isElement = function(value) { + return value != null && value.nodeType === 1; +}, + +/** !#server + * checks if the given value is a DOM-node + * + * @param mixed value to check + * @return boolean check result + */ +isNode = RightJS.isNode = function(value) { + return value != null && value.nodeType != null; +}, + +/** !#server + * searches an element by id and/or extends it with the framework extentions + * + * @param String element id or Element to extend + * @return Element or null + */ +$ = RightJS.$ = function(object) { + if (object instanceof Wrapper) { + return object; + } else if (typeof object === 'string') { + object = document.getElementById(object); + } + + return wrap(object); +}, + +/** !#server + * Finds all the elements in the document by the given css_rule + * + * @param String element + * @param Boolean raw search marker + * @return Array search result + */ +$$ = RightJS.$$ = function(css_rule, raw) { + return current_Document.find(css_rule, raw); +}, + +/** !#server + * shortcut to instance new elements + * + * @param String tag name + * @param object options + * @return Element instance + */ +$E = RightJS.$E = function(tag_name, options) { + return new Element(tag_name, options); +}, + +/** + * shortcut, generates an array of words from a given string + * + * @param String string + * @return Array of words + */ +$w = RightJS.$w = function(string) { + return string.trim().split(/\s+/); +}, + +/** + * generates an unique id for an object + * + * @param Object object + * @return Integer uniq id + */ +$uid = RightJS.$uid = function(item) { + return UID_KEY in item ? item[UID_KEY] : (item[UID_KEY] = UID++); +}, + +/** + * converts any iterables into an array + * + * @param Object iterable + * @return Array list + */ +$A = RightJS.$A = function(it) { + return slice.call(it, 0); +}; + +/** !#server + * IE needs a patch for the $A function + * because it doesn't handle all the cases + */ +if (!A_proto.map) { + $A = RightJS.$A = function(it) { + try { + return slice.call(it, 0); + } catch(e) { + for (var a=[], i=0, length = it.length; i < length; i++) { + a[i] = it[i]; + } + return a; + } + }; +} + +/** !#server + * Internet Explorer needs some additional mumbo-jumbo in here + */ +if (isHash(HTML)) { + isHash = RightJS.isHash = function(value) { + return to_s.call(value) === '[object Object]' && + value != null && value.hasOwnProperty != null; + }; +} + + +/** + * Generating methods for native units extending + */ +// adds a standard '.include' method to the native unit +function extend_native(klass) { + return $ext(klass, { + Methods: {}, + include: function() { + for (var i=0, l = arguments.length; i < l; i++) { + if (isHash(arguments[i])) { + $ext(klass.prototype, arguments[i]); + $ext(klass.Methods, arguments[i]); + } + } + } + }); +} + +for (var i=0, natives = 'Array Function Number String Date RegExp'.split(' '); i < natives.length; i++) { + RightJS[natives[i]] = extend_native(new Function('return '+ natives[i])()); +} + +// referring those two as well +RightJS.Object = Object; +RightJS.Math = Math; + + +/** + * Checks if the data is an array and if not, + * then makes an array out of it + * + * @param mixed in data + * @return Array data + */ +function ensure_array(data) { + return isArray(data) ? data : [data]; +} + + +/** + * The Object class extentions + * + * Credits: + * Some functionality is inspired by + * - Prototype (http://prototypejs.org) Copyright (C) Sam Stephenson + * + * Copyright (C) 2008-2011 Nikolay V. Nemshilov + */ +$ext(Object, { + /** + * extracts the list of the attribute names of the given object + * + * @param Object object + * @return Array keys list + */ + keys: function(object) { + var keys = [], key; + for (key in object) { + keys.push(key); + } + return keys; + }, + + /** + * extracts the list of the attribute values of the given object + * + * @param Object object + * @return Array values list + */ + values: function(object) { + var values = [], key; + for (key in object) { + values.push(object[key]); + } + return values; + }, + + /** + * Calls the function with every key/value pair on the hash + * + * @param in Object the data hash + * @param Function the callback + * @param scope Object an optional scope + * @return Object the original hash + */ + each: function(object, callback, scope) { + for (var key in object) { + callback.call(scope, key, object[key]); + } + + return object; + }, + + /** + * checks if the object-hash has no keys + * + * @param Object object + * @return check result + */ + empty: function(object) { + for (var key in object) { return false; } + return true; + }, + + /** + * A simple cloning method + * NOTE: does not clone the things recoursively! + * + * @param Object object + * @return Object clone + */ + clone: function(object) { + return Object.merge(object); + }, + + /** + * returns a copy of the object which contains + * all the same keys/values except the key-names + * passed the the method arguments + * + * @param Object object + * @param String key-name to exclude + * ..... + * @return Object filtered copy + */ + without: function() { + var filter = $A(arguments), object = filter.shift(), copy = {}, key; + + for (key in object) { + if (!filter.include(key)) { + copy[key] = object[key]; + } + } + + return copy; + }, + + /** + * returns a copy of the object which contains all the + * key/value pairs from the specified key-names list + * + * NOTE: if some key does not exists in the original object, it will be just skipped + * + * @param Object object + * @param String key name to exclude + * ..... + * @return Object filtered copy + */ + only: function() { + var filter = $A(arguments), object = filter.shift(), copy = {}, + i=0, length = filter.length; + + for (; i < length; i++) { + if (filter[i] in object) { + copy[filter[i]] = object[filter[i]]; + } + } + + return copy; + }, + + /** + * merges the given objects and returns the result + * + * NOTE this method _DO_NOT_ change the objects, it creates a new object + * which conatins all the given ones. + * if there is some keys introspections, the last object wins. + * all non-object arguments will be omitted + * + * @param first Object object + * @param second Object mixing + * ...... + * @return Object merged object + */ + merge: function() { + var object = {}, i=0, args=arguments, key; + for (l = args.length; i < l; i++) { + if (isHash(args[i])) { + for (key in args[i]) { + object[key] = isHash(args[i][key]) && !(args[i][key] instanceof Class) ? + Object.merge(key in object ? object[key] : {}, args[i][key]) : args[i][key]; + } + } + } + return object; + }, + + /** + * converts a hash-object into an equivalent url query string + * + * @param Object object + * @return String query + */ + toQueryString: function(object) { + var tokens = [], key, value, encode = encodeURIComponent; + for (key in object) { + value = ensure_array(object[key]); + for (var i=0, l = value.length; i < l; i++) { + tokens.push(encode(key) +'='+ encode(value[i])); + } + } + return tokens.join('&'); + } +}, true); + + +/** + * here are the starndard Math object extends + * + * Credits: + * The idea of random mehtod is taken from + * - Ruby (http://www.ruby-lang.org) Copyright (C) Yukihiro Matsumoto + * + * Copyright (C) 2008-2010 Nikolay Nemshilov + */ +var Math_old_random = Math.random; + +/** + * the standard random method replacement, to make it more useful + * + * USE: + * Math.random(); // original functionality, returns a float between 0 and 1 + * Math.random(10); // returns an integer between 0 and 10 + * Math.random(1,4); // returns an integer between 1 and 4 + * + * @param min Integer minimum value if there's two arguments and maximum value if there's only one + * @param max Integer maximum value + * @return Float random between 0 and 1 if there's no arguments or an integer in the given range + */ +Math.random = function(min, max) { + + if (arguments.length === 0) { + return Math_old_random(); + } else if (arguments.length === 1) { + max = min; + min = 0; + } + + return ~~(Math_old_random() * (max-min+1) + ~~min); +}; + + +/** + * The Array class extentions + * + * Credits: + * Some of the functionality is inspired by + * - Prototype (http://prototypejs.org) Copyright (C) Sam Stephenson + * - Ruby (http://www.ruby-lang.org) Copyright (C) Yukihiro Matsumoto + * + * Copyright (C) 2008-2010 Nikolay Nemshilov + */ +var original_sort = A_proto.sort, + +// JavaScript 1.6 methods recatching up or faking +for_each = A_proto.forEach || function(callback, scope) { + for (var i=0, l=this.length; i < l; i++) { + callback.call(scope, this[i], i, this); + } +}, + +filter = A_proto.filter || function(callback, scope) { + for (var result=[], j=0, i=0, l=this.length; i < l; i++) { + if (callback.call(scope, this[i], i, this)) { + result[j++] = this[i]; + } + } + return result; +}, + +reject = function(callback, scope) { + for (var result=[], j=0, i=0, l=this.length; i < l; i++) { + if (!callback.call(scope, this[i], i, this)) { + result[j++] = this[i]; + } + } + return result; +}, + +map = A_proto.map || function(callback, scope) { + for (var result=[], i=0, l=this.length; i < l; i++) { + result[i] = callback.call(scope, this[i], i, this); + } + return result; +}, + +some = A_proto.some || function(callback, scope) { + for (var i=0, l=this.length; i < l; i++) { + if (callback.call(scope, this[i], i, this)) { + return true; + } + } + return false; +}, + +every = A_proto.every || function(callback, scope) { + for (var i=0, l=this.length; i < l; i++) { + if (!callback.call(scope, this[i], i, this)) { + return false; + } + } + return true; +}, + +first = function(callback, scope) { + for (var i=0, l=this.length; i < l; i++) { + if (callback.call(scope, this[i], i, this)) { + return this[i]; + } + } + return undefined; +}, + +last = function(callback, scope) { + for (var i=this.length-1; i > -1; i--) { + if (callback.call(scope, this[i], i, this)) { + return this[i]; + } + } + return undefined; +}; + + +// +// RightJS callbacks magick preprocessing +// + +// prepares a correct callback function +function guess_callback(argsi, array) { + var callback = argsi[0], args = slice.call(argsi, 1), scope = array, attr; + + if (typeof(callback) === 'string') { + attr = callback; + if (array.length !== 0 && typeof(array[0][attr]) === 'function') { + callback = function(object) { return object[attr].apply(object, args); }; + } else { + callback = function(object) { return object[attr]; }; + } + } else { + scope = args[0]; + } + + return [callback, scope]; +} + +// defining the manual break errors class +function Break() {} + +// calls the given method with preprocessing the arguments +function call_method(func, scope, args) { + try { + return func.apply(scope, guess_callback(args, scope)); + } catch(e) { if (!(e instanceof Break)) { throw(e); } } + + return undefined; +} + +// checks the value as a boolean +function boolean_check(i) { + return !!i; +} + +// default sorting callback +function default_sort(a, b) { + return a > b ? 1 : a < b ? -1 : 0; +} + +Array.include({ + /** + * IE fix + * returns the index of the value in the array + * + * @param mixed value + * @param Integer optional offset + * @return Integer index or -1 if not found + */ + indexOf: A_proto.indexOf || function(value, from) { + for (var i=(from<0) ? Math.max(0, this.length+from) : from || 0, l=this.length; i < l; i++) { + if (this[i] === value) { + return i; + } + } + return -1; + }, + + /** + * IE fix + * returns the last index of the value in the array + * + * @param mixed value + * @return Integer index or -1 if not found + */ + lastIndexOf: A_proto.lastIndexOf || function(value) { + for (var i=this.length-1; i > -1; i--) { + if (this[i] === value) { + return i; + } + } + return -1; + }, + + /** + * returns the first element of the array + * + * @return mixed first element of the array + */ + first: function() { + return arguments.length ? call_method(first, this, arguments) : this[0]; + }, + + /** + * returns the last element of the array + * + * @return mixed last element of the array + */ + last: function() { + return arguments.length ? call_method(last, this, arguments) : this[this.length-1]; + }, + + /** + * returns a random item of the array + * + * @return mixed a random item + */ + random: function() { + return this.length === 0 ? undefined : this[Math.random(this.length-1)]; + }, + + /** + * returns the array size + * + * @return Integer the array size + */ + size: function() { + return this.length; + }, + + /** + * cleans the array + * @return Array this + */ + clean: function() { + this.length = 0; + return this; + }, + + /** + * checks if the array has no elements in it + * + * @return boolean check result + */ + empty: function() { + return this.length === 0; + }, + + /** + * creates a copy of the given array + * + * @return Array copy of the array + */ + clone: function() { + return this.slice(0); + }, + + /** + * calls the given callback function in the given scope for each element of the array + * + * @param Function callback + * @param Object scope + * @return Array this + */ + each: function() { + call_method(for_each, this, arguments); + return this; + }, + forEach: for_each, + + /** + * creates a list of the array items converted in the given callback function + * + * @param Function callback + * @param Object optional scope + * @return Array collected + */ + map: function() { + return call_method(map, this, arguments); + }, + + /** + * creates a list of the array items which are matched in the given callback function + * + * @param Function callback + * @param Object optional scope + * @return Array filtered copy + */ + filter: function() { + return call_method(filter, this, arguments); + }, + + /** + * creates a list of the array items that are not matching the give callback function + * + * @param Function callback + * @param Object optionl scope + * @return Array filtered copy + */ + reject: function() { + return call_method(reject, this, arguments); + }, + + /** + * checks if any of the array elements is logically true + * + * @param Function optional callback for checks + * @param Object optional scope for the callback + * @return boolean check result + */ + some: function(value) { + return call_method(some, this, value ? arguments : [boolean_check]); + }, + + /** + * checks if all the array elements are logically true + * + * @param Function optional callback for checks + * @param Object optional scope for the callback + * @return Boolean check result + */ + every: function(value) { + return call_method(every, this, value ? arguments : [boolean_check]); + }, + + /** + * applies the given lambda to each element in the array + * + * NOTE: changes the array by itself + * + * @param Function callback + * @param Object optional scope + * @return Array this + */ + walk: function() { + this.map.apply(this, arguments).forEach(function(value, i) { this[i] = value; }, this); + return this; + }, + + /** + * similar to the concat function but it adds only the values which are not on the list yet + * + * @param Array to merge + * .................... + * @return Array new merged + */ + merge: function() { + for (var copy = this.clone(), arg, i=0; i < arguments.length; i++) { + arg = ensure_array(arguments[i]); + + for (var j=0; j < arg.length; j++) { + if (copy.indexOf(arg[j]) == -1) { + copy.push(arg[j]); + } + } + } + return copy; + }, + + /** + * flats out complex array into a single dimension array + * + * @return Array flatten copy + */ + flatten: function() { + var copy = []; + this.forEach(function(value) { + if (isArray(value)) { + copy = copy.concat(value.flatten()); + } else { + copy.push(value); + } + }); + return copy; + }, + + /** + * returns a copy of the array whithout any null or undefined values + * + * @return Array filtered version + */ + compact: function() { + return this.without(null, undefined); + }, + + /** + * returns a copy of the array which contains only the unique values + * + * @return Array filtered copy + */ + uniq: function() { + return [].merge(this); + }, + + /** + * checks if all of the given values + * exists in the given array + * + * @param mixed value + * .... + * @return boolean check result + */ + includes: function() { + for (var i=0; i < arguments.length; i++) { + if (this.indexOf(arguments[i]) === -1) { + return false; + } + } + return true; + }, + + /** + * returns a copy of the array without the items passed as the arguments + * + * @param mixed value + * ...... + * @return Array filtered copy + */ + without: function() { + var filter = slice.call(arguments); + return this.filter(function(value) { + return filter.indexOf(value) === -1; + }); + }, + + /** + * Shuffles the array items in a random order + * + * @return Array shuffled version + */ + shuffle: function() { + var shuff = this.clone(), j, x, i = shuff.length; + + for (; i > 0; j = Math.random(i-1), x = shuff[--i], shuff[i] = shuff[j], shuff[j] = x) {} + + return shuff; + }, + + /** + * Default sort fix for numeric values + * + * @param Function callback + * @return Array self + */ + sort: function(callback) { + return original_sort.apply(this, (callback || !isNumber(this[0])) ? arguments : [default_sort]); + }, + + /** + * sorts the array by running its items though a lambda or calling their attributes + * + * @param Function callback or attribute name + * @param Object scope or attribute argument + * @return Array sorted copy + */ + sortBy: function() { + var pair = guess_callback(arguments, this); + + return this.sort(function(a, b) { + return default_sort( + pair[0].call(pair[1], a), + pair[0].call(pair[1], b) + ); + }); + }, + + /** + * Returns the minimal value on the list + * + * @return Number minimal value + */ + min: function() { + return Math.min.apply(Math, this); + }, + + /** + * Returns the maximal value + * + * @return Number maximal value + */ + max: function() { + return Math.max.apply(Math, this); + }, + + /** + * Returns a summ of all the items on the list + * + * @return Number a summ of values on the list + */ + sum: function() { + for(var sum=0, i=0, l=this.length; i < l; sum += this[i++]) {} + return sum; + } +}); + +A_proto.include = A_proto.includes; + + +/** + * The String class extentions + * + * Credits: + * Some of the functionality inspired by + * - Prototype (http://prototypejs.org) Copyright (C) Sam Stephenson + * The trim function taken from work of Steven Levithan + * - http://blog.stevenlevithan.com/archives/faster-trim-javascript + * + * Copyright (C) 2008-2011 Nikolay V. Nemshilov + */ +String.include({ + /** + * checks if the string is an empty string + * + * @return boolean check result + */ + empty: function() { + return this == ''; + }, + + /** + * checks if the string contains only white-spaces + * + * @return boolean check result + */ + blank: function() { + return this == false; + }, + + /** + * removes trailing whitespaces + * + * @return String trimmed version + */ + trim: String.prototype.trim || function() { + var str = this.replace(/^\s\s*/, ''), i = str.length; + while ((/\s/).test(str.charAt(--i))) {} + return str.slice(0, i + 1); + }, + + /** + * returns a copy of the string with all the tags removed + * @return String without tags + */ + stripTags: function() { + return this.replace(/<\/?[^>]+>/ig, ''); + }, + + /** + * removes all the scripts declarations out of the string + * @param mixed option. If it equals true the scrips will be executed, + * if a function the scripts will be passed in it + * @return String without scripts + */ + stripScripts: function(option) { + var scripts = '', text = this.replace( + /]*>([\s\S]*?)<\/script>/img, + function(match, source) { + scripts += source + "\n"; + return ''; + } + ); + + if (option === true) { + $eval(scripts); + } else if (isFunction(option)) { + option(scripts, text); + } + + return text; + }, + + /** + * extracts all the scripts out of the string + * + * @return String the extracted stcripts + */ + extractScripts: function() { + var scripts = ''; + this.stripScripts(function(s) { scripts = s; }); + return scripts; + }, + + /** + * evals all the scripts in the string + * + * @return String self (unchanged version with scripts still in their place) + */ + evalScripts: function() { + this.stripScripts(true); + return this; + }, + + /** + * converts underscored or dasherized string to a camelized one + * @returns String camelized version + */ + camelize: function() { + return this.replace(/(\-|_)+(.)?/g, function(match, dash, chr) { + return chr ? chr.toUpperCase() : ''; + }); + }, + + /** + * converts a camelized or dasherized string into an underscored one + * @return String underscored version + */ + underscored: function() { + return this.replace(/([a-z\d])([A-Z]+)/g, '$1_$2').replace(/\-/g, '_').toLowerCase(); + }, + + /** + * returns a capitalised version of the string + * + * @return String captialised version + */ + capitalize: function() { + return this.charAt(0).toUpperCase() + this.substring(1).toLowerCase(); + }, + + /** + * checks if the string contains the given substring + * + * @param String string + * @return boolean check result + */ + includes: function(string) { + return this.indexOf(string) != -1; + }, + + /** + * checks if the string starts with the given substring + * + * @param String string + * @param boolean ignore the letters case + * @return boolean check result + */ + startsWith: function(string, ignorecase) { + return (ignorecase !== true ? this.indexOf(string) : + this.toLowerCase().indexOf(string.toLowerCase()) + ) === 0; + }, + + /** + * checks if the string ends with the given substring + * + * @param String substring + * @param boolean ignore the letters case + * @return boolean check result + */ + endsWith: function(string, ignorecase) { + return this.length - ( + ignorecase !== true ? this.lastIndexOf(string) : + this.toLowerCase().lastIndexOf(string.toLowerCase()) + ) === string.length; + }, + + /** + * converts the string to an integer value + * @param Integer base + * @return Integer or NaN + */ + toInt: function(base) { + return parseInt(this, base === undefined ? 10 : base); + }, + + /** + * converts the string to a float value + * @param boolean flat if the method should not use a flexible matching + * @return Float or NaN + */ + toFloat: function(strict) { + return parseFloat(strict === true ? this : + this.replace(',', '.').replace(/(\d)-(\d)/, '$1.$2')); + } + +}); + +String.prototype.include = String.prototype.includes; + + +/** + * The Function class extentions + * + * Credits: + * Some of the functionality inspired by + * - Prototype (http://prototypejs.org) Copyright (C) Sam Stephenson + * + * Copyright (C) 2008-2011 Nikolay V. Nemshilov + */ +Function.include({ + /** + * binds the function to be executed in the given scope + * + * @param Object scope + * @param mixed optional curry (left) argument + * .... + * @return Function binded function + */ + bind: function() { + var args = $A(arguments), scope = args.shift(), func = this; + return function() { + return func.apply(scope, + (args.length !== 0 || arguments.length !== 0) ? + args.concat($A(arguments)) : args + ); + }; + }, + + /** + * binds the function as an event listener to the given scope object + * + * @param Object scope + * @param mixed optional curry (left) argument + * ....... + * @return Function binded function + */ + bindAsEventListener: function() { + var args = $A(arguments), scope = args.shift(), func = this; + return function(event) { + return func.apply(scope, [event].concat(args).concat($A(arguments))); + }; + }, + + /** + * allows you to put some curry in your cookery + * + * @param mixed value to curry + * .... + * @return Function curried function + */ + curry: function() { + return this.bind.apply(this, [this].concat($A(arguments))); + }, + + /** + * The right side curry feature + * + * @param mixed value to curry + * .... + * @return Function curried function + */ + rcurry: function() { + var curry = $A(arguments), func = this; + return function() { + return func.apply(func, $A(arguments).concat(curry)); + }; + }, + + /** + * delays the function execution + * + * @param Integer delay ms + * @param mixed value to curry + * ..... + * @return Integer timeout marker + */ + delay: function() { + var args = $A(arguments), timeout = args.shift(), + timer = new Number(setTimeout(this.bind.apply(this, [this].concat(args)), timeout)); + + timer.cancel = function() { clearTimeout(this); }; + + return timer; + }, + + /** + * creates a periodical execution of the function with the given timeout + * + * @param Integer delay ms + * @param mixed value to curry + * ... + * @return Ineger interval marker + */ + periodical: function() { + var args = $A(arguments), timeout = args.shift(), + timer = new Number(setInterval(this.bind.apply(this, [this].concat(args)), timeout)); + + timer.stop = function() { clearInterval(this); }; + + return timer; + }, + + /** + * Chains the given function after the current one + * + * @param Function the next function + * @param mixed optional value to curry + * ...... + * @return Function chained function + */ + chain: function() { + var args = $A(arguments), func = args.shift(), current = this; + return function() { + var result = current.apply(current, arguments); + func.apply(func, args); + return result; + }; + } +}); + + +/** + * The Number class extentions + * + * Credits: + * Some methods inspired by + * - Ruby (http://www.ruby-lang.org) Copyright (C) Yukihiro Matsumoto + * + * Copyright (C) 2008-2010 Nikolay V. Nemshilov + */ +Number.include({ + /** + * executes the given callback the given number of times + * + * @param Function callback + * @param Object optional callback execution scope + * @return void + */ + times: function(callback, scope) { + for (var i=0; i < this; i++) { + callback.call(scope, i); + } + return this; + }, + + upto: function(number, callback, scope) { + for (var i=this+0; i <= number; i++) { + callback.call(scope, i); + } + return this; + }, + + downto: function(number, callback, scope) { + for (var i=this+0; i >= number; i--) { + callback.call(scope, i); + } + return this; + }, + + abs: function() { + return Math.abs(this); + }, + + round: function(size) { + return size ? parseFloat(this.toFixed(size)) : Math.round(this); + }, + + ceil: function() { + return Math.ceil(this); + }, + + floor: function() { + return Math.floor(this); + }, + + min: function(value) { + return this < value ? value : this + 0; + }, + + max: function(value) { + return this > value ? value : this + 0; + } +}); + + +/** + * The Regexp class extentions + * + * Credits: + * Inspired by + * - Prototype (http://prototypejs.org) Copyright (C) Sam Stephenson + * + * Copyright (C) 2008-2010 Nikolay V. Nemshilov + */ + + + /** + * Escapes the string for safely use as a regular expression + * + * @param String raw string + * @return String escaped string + */ +RegExp.escape = function(string) { + return (''+string).replace(/([.*+?\^=!:${}()|\[\]\/\\])/g, '\\$1'); +}; + + +/** + * The basic Class unit + * + * Credits: + * The Class unit is inspired by its implementation in + * - Prototype (http://prototypejs.org) Copyright (C) Sam Stephenson + * - MooTools (http://mootools.net) Copyright (C) Valerio Proietti + * - Ruby (http://www.ruby-lang.org) Copyright (C) Yukihiro Matsumoto + * + * Copyright (C) 2008-2011 Nikolay Nemshilov + */ +var Class = RightJS.Class = function() { + var args = $A(arguments).slice(0,2), + props = args.pop() || {}, + parent = args.pop(), + klass = arguments[2], // you can send your own klass as the third argument + SKlass = function() {}; + + // if the parent class only was specified + if (!args.length && !isHash(props)) { + parent = props; props = {}; + } + +// !#server:begin + if (!klass && parent && (parent === Wrapper || parent.ancestors.include(Wrapper))) { + klass = Wrapper_makeKlass(); + } +// !#server:end + + // defining the basic klass function + klass = $ext(klass || function() { + Class_checkPrebind(this); + return 'initialize' in this ? + this.initialize.apply(this, arguments) : + this; + }, Class_Methods); + + // handling the inheritance + parent = parent || Class; + + SKlass.prototype = parent.prototype; + klass.prototype = new SKlass(); + klass.parent = parent; + klass.prototype.constructor = klass; + + // collecting the list of ancestors + klass.ancestors = []; + while (parent) { + klass.ancestors.push(parent); + parent = parent.parent; + } + + // handling the module injections + ['extend', 'include'].each(function(name) { + if (name in props) { + klass[name].apply(klass, ensure_array(props[name])); + } + }); + + return klass.include(props); +}, + +/** + * Class utility methods + * + * Copyright (C) 2008-2011 Nikolay Nemshilov + */ +Class_Methods = { + /** + * this method will extend the class-level with the given objects + * + * NOTE: this method _WILL_OVERWRITE_ the existing itercecting entries + * + * NOTE: this method _WILL_NOT_OVERWRITE_ the class prototype and + * the class 'name' and 'parent' attributes. If one of those + * exists in one of the received modeuls, the attribute will be + * skipped + * + * @param Object module to extend + * .... + * @return Class the klass + */ + extend: function() { + $A(arguments).filter(isHash).each(function(module) { + $ext(this, Class_clean_module(module, true)); + Class_handle_module_callbacks(this, module, true); + }, this); + + return this; + }, + + /** + * extends the class prototype with the given objects + * NOTE: this method _WILL_OVERWRITE_ the existing itercecting entries + * NOTE: this method _WILL_NOT_OVERWRITE_ the 'klass' attribute of the klass.prototype + * + * @param Object module to include + * .... + * @return Class the klass + */ + include: function() { + var klasses = [this].concat(this.ancestors); + + $A(arguments).filter(isHash).each(function(module) { + Object.each(Class_clean_module(module, false), function(name, method) { + // searching for the super-method + for (var super_method, i=0, l = klasses.length; i < l; i++) { + if (name in klasses[i].prototype) { + super_method = klasses[i].prototype[name]; + break; + } + } + + this.prototype[name] = isFunction(method) && isFunction(super_method) ? + function() { + this.$super = super_method; + return method.apply(this, arguments); + } : method; + }, this); + + Class_handle_module_callbacks(this, module, false); + }, this); + + return this; + } +}, + +Class_module_callback_names = $w( + 'selfExtended self_extended selfIncluded self_included extend include' +); + +// hooking up the class-methods to the root class +$ext(Class, Class_Methods); +Class.prototype.$super = undefined; + +function Class_clean_module(module, extend) { + return Object.without.apply(Object, [module].concat( + Class_module_callback_names.concat( extend ? + $w('prototype parent ancestors') : ['constructor'] + ) + )); +} + +function Class_handle_module_callbacks(klass, module, extend) { + (module[Class_module_callback_names[extend ? 0 : 2]] || + module[Class_module_callback_names[extend ? 1 : 3]] || + function() {} + ).call(module, klass); +} + +/** + * This method gets through a list of the object its class and all the ancestors + * and finds a hash named after property, used for configuration purposes with + * the Observer and Options modules + * + * NOTE: this method will look for capitalized and uppercased versions of the + * property name + * + * @param Object a class instance + * @param String property name + * @return Object hash or null if nothing found + */ +function Class_findSet(object, property) { + var upcased = property.toUpperCase(), + constructor = object.constructor, + candidates = [object, constructor].concat(constructor.ancestors || []), + i = 0; + + for (l = candidates.length; i < l; i++) { + if (upcased in candidates[i]) { + return candidates[i][upcased]; + } else if (property in candidates[i]) { + return candidates[i][property]; + } + } + + return null; +} + +/** + * Handles the 'prebind' feature for Class instances + * + * @param Class instance + * @return void + */ +function Class_checkPrebind(object) { + if ('prebind' in object && isArray(object.prebind)) { + object.prebind.each(function(method) { + object[method] = object[method].bind(object); + }); + } +} + +/** + * This is a simple mix-in module to be included in other classes + * + * Basically it privdes the setOptions method which processes + * an instance options assigment and merging with the default options + * + * Credits: + * The idea of the module is inspired by + * - MooTools (http://mootools.net) Copyright (C) Valerio Proietti + * + * Copyright (C) 2008-2011 Nikolay V. Nemshilov + */ +var Options = RightJS.Options = { + /** + * assigns the options by merging them with the default ones + * + * @param Object options + * @return Object current instance + */ + setOptions: function(opts) { + var options = this.options = $ext($ext({}, + Object.clone(Class_findSet(this, 'Options'))), opts + ), match, key; + + // hooking up the observer options + if (isFunction(this.on)) { + for (key in options) { + if ((match = key.match(/on([A-Z][A-Za-z]+)/))) { + this.on(match[1].toLowerCase(), options[key]); + delete(options[key]); + } + } + } + + return this; + }, + + /** + * Cuts of an options hash from the end of the arguments list + * assigns them using the #setOptions method and then + * returns the list of other arguments as an Array instance + * + * @param mixed iterable + * @return Array of the arguments + */ + cutOptions: function(in_args) { + var args = $A(in_args); + this.setOptions(isHash(args.last()) ? args.pop() : {}); + return args; + } +}; + + +/** + * standard Observer class. + * + * Might be used as a usual class or as a builder over another objects + * + * Credits: + * The naming principle is inspired by + * - Prototype (http://prototypejs.org) Copyright (C) Sam Stephenson + * + * Copyright (C) 2008-2011 Nikolay Nemshilov + */ +var Observer = RightJS.Observer = new Class({ + include: Options, + + /** + * general constructor + * + * @param Object options + */ + initialize: function(options) { + this.setOptions(options); + Observer_createShortcuts(this, Class_findSet(this, 'Events')); + return this; + }, + + /** + * binds an event listener + * + * USAGE: + * on(String event, Function callback[, arguments, ...]); + * on(String event, String method_name[, arguments, ...]); + * on(Object events_hash); + * + * @return Observer self + */ + on: function() { + Observer_on(this, arguments, function(h) { return h; }); + return this; + }, + + /** + * checks if the observer observes given event and/or callback + * + * USAGE: + * observes(String event) + * observes(Function callback) + * observes(String event, Function callback) + * + * @retun boolean check result + */ + observes: function(event, callback) { + if (!isString(event)) { callback = event; event = null; } + if (isString(callback)) { callback = callback in this ? this[callback] : null; } + + return (this.$listeners || []).some(function(i) { + return (event && callback) ? i.e === event && i.f === callback : + event ? i.e === event : i.f === callback; + }); + }, + + /** + * stops observing an event or/and function + * + * USAGE: + * stopObserving(String event) + * stopObserving(Function callback) + * stopObserving(String event, Function callback) + * + * @return Observer self + */ + stopObserving: function(event, callback) { + Observer_stopObserving(this, event, callback, function() {}); + return this; + }, + + /** + * returns the listeners list for the event + * + * NOTE: if no event was specified the method will return _all_ + * event listeners for _all_ the events + * + * @param String event name + * @return Array of listeners + */ + listeners: function(event) { + return (this.$listeners || []).filter(function(i) { + return !event || i.e === event; + }).map(function(i) { return i.f; }).uniq(); + }, + + /** + * initiates the event handling + * + * @param String event name + * @param mixed optional argument + * ........ + * @return Observer self + */ + fire: function() { + var args = $A(arguments), event = args.shift(); + + (this.$listeners || []).each(function(i) { + if (i.e === event) { + i.f.apply(this, i.a.concat(args)); + } + }, this); + + return this; + } +}), + +/** + * adds an observer functionality to any object + * + * @param Object object + * @param Array optional events list to build shortcuts + * @return Object extended object + */ +Observer_create = Observer.create = function(object, events) { + $ext(object, Object.without(Observer.prototype, 'initialize', 'setOptions'), true); + return Observer_createShortcuts(object, events || Class_findSet(object, 'Events')); +}, + +/** + * builds shortcut methods to wire/fire events on the object + * + * @param Object object to extend + * @param Array list of event names + * @return Object extended object + */ +Observer_createShortcuts = Observer.createShortcuts = function(object, names) { + (names || []).each(function(name) { + var method_name = 'on'+name.replace(/(^|_|:)([a-z])/g, + function(match, pre, chr) { return chr.toUpperCase(); } + ); + + if (!(method_name in object)) { + object[method_name] = function() { + return this.on.apply(this, [name].concat($A(arguments))); + }; + } + }); + + return object; +}; + +function Observer_on(object, o_args, preprocess) { + var args = slice.call(o_args, 2), + event = o_args[0], + callback = o_args[1], + name = false; + + if (isString(event)) { + switch (typeof callback) { + case "string": + name = callback; + callback = callback in object ? object[callback] : function() {}; + + case "function": + ('$listeners' in object ? object.$listeners : ( + object.$listeners = [] + )).push(preprocess({ + e: event, f: callback, a: args, r: name || false, t: object + })); + break; + + default: + if (isArray(callback)) { + for (var i=0; i < callback.length; i++) { + object.on.apply(object, [event].concat( + ensure_array(callback[i]) + ).concat(args)); + } + } + } + + } else { + // assuming it's a hash of key-value pairs + args = slice.call(o_args, 1); + + for (name in event) { + object.on.apply(object, [name].concat( + ensure_array(event[name]) + ).concat(args)); + } + } +} + +function Observer_stopObserving(object, event, callback, preprocess) { + if (isHash(event)) { + for (var key in event) { + object.stopObserving(key, event[key]); + } + } else { + if (!isString(event)) { callback = event; event = null; } + if (isString(callback)){ callback = object[callback]; } + + object.$listeners = (object.$listeners || []).filter(function(i) { + var result = (event && callback) ? + (i.e !== event || i.f !== callback) : + (event ? i.e !== event : i.f !== callback); + + if (!result) { preprocess(i); } + + return result; + }); + } +} + + +/** + * this object will contain info about the current browser + * + * Copyright (C) 2008-2011 Nikolay V. Nemshilov + */ +var agent = navigator.userAgent, + Browser_Opera = 'opera' in window, + Browser_IE = 'attachEvent' in window && !Browser_Opera, + +Browser = RightJS.Browser = { + IE: Browser_IE, + Opera: Browser_Opera, + WebKit: agent.include('AppleWebKit/'), + Gecko: agent.include('Gecko') && !agent.include('KHTML'), + MobileSafari: /Apple.*Mobile.*Safari/.test(agent), + Konqueror: agent.include('Konqueror'), + + // internal marker for the browsers which require the olds module + OLD: !document.querySelector, + // internal marker for IE browsers version <= 8 + IE8L: false +}, + +IE8_OR_LESS = false, +IE_OPACITY = !('opacity' in HTML.style) && ('filter' in HTML.style); + +try { + // checking if that an IE version <= 8 + document.createElement(''); + Browser.OLD = Browser.IE8L = IE8_OR_LESS = true; +} catch(e) {} + + +/** + * The dom-wrapper main unit + * + * This unit is basically for the internal use + * so that we could control the common functionality + * among all the wrappers + * + * Copyright (C) 2010-2011 Nikolay Nemshilov + */ + +var Wrapper = RightJS.Wrapper = new Class({ + // predefining the property in the prototype + _: undefined, + + /** + * Default constructor + * + * @param mixed raw dom unit + * @return void + */ + initialize: function(raw_object) { + this._ = raw_object; + } +}); + +// exposing the cache so it could be manupulated externally +Wrapper.Cache = Wrappers_Cache; + +// instantiating the actual class object for a wrapper +function Wrapper_makeKlass() { + /** + * Default wrappers Klass function + * + * @param mixed the raw object + * @param Object options + * @return void + */ + return function(object, options) { + Class_checkPrebind(this); + + this.initialize.apply(this, arguments); // <- there might be a different number of args in a subclass + + var item = this._, uid = UID_KEY in item ? item[UID_KEY] : + // NOTE we use positive indexes for dom-elements and negative for everything else + (item[UID_KEY] = (item.nodeType === 1 ? 1 : -1) * UID++); + + Wrappers_Cache[uid] = this; + }; +} + +/** + * Element's own Klass function + * we need that because it does some dynamic typecasting mumbo jumbo + * plus we would like to optimize some stuff here and there + * + * @param raw dom element or the tag name + * @param Object options + * @return Element instance + */ +function Element_Klass(element, options) { + Element_initialize(this, element, options); + + var inst = this, raw = inst._, cast = Wrapper.Cast(raw), + uid = UID_KEY in raw ? raw[UID_KEY] : (raw[UID_KEY] = UID++); + + if (cast !== undefined) { + inst = new cast(raw, options); + if ('$listeners' in this) { + inst.$listeners = this.$listeners; + } + } + + Wrappers_Cache[uid] = inst; + + return inst; +} + +// searches for a suitable class for dynamic typecasting +Wrapper.Cast = function(unit) { + return unit.tagName in Element_wrappers ? Element_wrappers[unit.tagName] : undefined; +}; + +/** + * Event's own Klass function, we don't need to check + * nothing in here, don't need to hit the wrappers cache and so one + * + * @param raw dom-event or a string event-name + * @param bounding element or an object with options + * @return void + */ +function Event_Klass(event, bound_element) { + if (typeof(event) === 'string') { + event = $ext({type: event}, bound_element); + this.stopped = event.bubbles === false; + + if (isHash(bound_element)) { + $ext(this, bound_element); + } + } + + this._ = event; + this.type = event.type; + + this.which = event.which; + this.keyCode = event.keyCode; + + this.target = wrap( + // Webkit throws events on textual nodes as well, gotta fix that + event.target != null && 'nodeType' in event.target && event.target.nodeType === 3 ? + event.target.parentNode : event.target + ); + + this.currentTarget = wrap(event.currentTarget); + this.relatedTarget = wrap(event.relatedTarget); + + this.pageX = event.pageX; + this.pageY = event.pageY; + + // making old IE attrs looks like w3c standards + if (IE8_OR_LESS && 'srcElement' in event) { + this.which = event.button === 2 ? 3 : event.button === 4 ? 2 : 1; + + this.target = wrap(event.srcElement) || bound_element; + this.relatedTarget = this.target._ === event.fromElement ? wrap(event.toElement) : this.target; + this.currentTarget = bound_element; + + var scrolls = this.target.win().scrolls(); + + this.pageX = event.clientX + scrolls.x; + this.pageY = event.clientY + scrolls.y; + } +} + + +/** + * Private quick wrapping function, unlike `$` + * it doesn't search by ID and handle double-wrapps + * just pure dom-wrapping functionality + * + * @param raw dom unit + * @return Wrapper dom-wrapper + */ +function wrap(object) { + if (object != null) { + var wrapper = UID_KEY in object ? Wrappers_Cache[object[UID_KEY]] : undefined; + + if (wrapper !== undefined) { + return wrapper; + } else if (object.nodeType === 1) { + return new Element(object); + } else if (object.nodeType === 9) { + return new Document(object); + } else if (object.window == object) { + return new Window(object); + } else if (isElement(object.target) || isElement(object.srcElement)) { + return new Event(object); + } + } + + return object; +} + +/** + * A simple document wrapper + * + * Copyright (C) 2010-2011 Nikolay Nemshilov + */ +var Document = RightJS.Document = new Class(Wrapper, { + // returns the window reference + win: function() { + return wrap(this._.defaultView || this._.parentWindow); + } +}), + +// a common local wrapped document reference +current_Document = wrap(document); + + +/** + * the window object extensions + * + * Copyright (C) 2008-2011 Nikolay Nemshilov + */ +var Window = RightJS.Window = new Class(Wrapper, { + /** + * Selfreference to have a common interface with the rest of the wrappers + * in case of events handling + * + * @return Window + */ + win: function() { + return this; + }, + + /** + * returns the inner-size of the window + * + * @return Object x: d+, y: d+ + */ + size: function() { + var win = this._, html = win.document.documentElement; + return win.innerWidth ? {x: win.innerWidth, y: win.innerHeight} : + {x: html.clientWidth, y: html.clientHeight}; + }, + + /** + * returns the scrolls for the window + * + * @return Object x: d+, y: d+ + */ + scrolls: function() { + var win = this._, doc = win.document, body = doc.body, html = doc.documentElement; + + return (win.pageXOffset || win.pageYOffset) ? {x: win.pageXOffset, y: win.pageYOffset} : + (body && (body.scrollLeft || body.scrollTop)) ? {x: body.scrollLeft, y: body.scrollTop} : + {x: html.scrollLeft, y: html.scrollTop}; + }, + + /** + * overloading the native scrollTo method to support hashes and element references + * + * @param mixed number left position, a hash position, element or a string element id + * @param number top position + * @param Object fx options + * @return window self + */ + scrollTo: function(left, top, fx_options) { + var left_pos = left, top_pos = top, + element = isNumber(left) ? null : $(left); + + if(element instanceof Element) { + left = element.position(); + } + + if (isHash(left)) { + top_pos = left.y; + left_pos = left.x; + } + + // checking if a smooth scroll was requested + if (isHash(fx_options = fx_options || top) && RightJS.Fx) { + new Fx.Scroll(this, fx_options).start({x: left_pos, y: top_pos}); + } else { + this._.scrollTo(left_pos, top_pos); + } + + return this; + } +}); + + +/** + * represents some additional functionality for the Event class + * + * NOTE: there more additional functionality for the Event class in the rightjs-goods project + * + * Credits: + * The additional method names are inspired by + * - Prototype (http://prototypejs.org) Copyright (C) Sam Stephenson + * + * Copyright (C) 2008-2011 Nikolay Nemshilov + */ +var Event = RightJS.Event = new Class(Wrapper, { + // predefining the keys to spped up the assignments + type: null, + + which: null, + keyCode: null, + + target: null, + currentTarget: null, + relatedTarget: null, + + pageX: null, + pageY: null, + + /** + * the class constructor + * + * @param raw dom-event + * @param HTMLElement the bound element + * @return void + */ + initialize: Event_Klass, // the actual initialization happens in the Klass function + + /** + * Stops the event bubbling process + * + * @return RightJS.Event this + */ + stopPropagation: function() { + if (this._.stopPropagation) { + this._.stopPropagation(); + } else { + this._.cancelBubble = true; + } + + this.stopped = true; + return this; + }, + + /** + * Prevents the default browser action on the event + * + * @return RightJS.Event this + */ + preventDefault: function() { + if (this._.preventDefault) { + this._.preventDefault(); + } else { + this._.returnValue = false; + } + + return this; + }, + + /** + * Fully stops the event + * + * @return RightJS.Event this + */ + stop: function() { + return this.stopPropagation().preventDefault(); + }, + + /** + * Returns the event position + * + * @return Object {x: ..., y: ...} + */ + position: function() { + return {x: this.pageX, y: this.pageY}; + }, + + /** + * Returns the event's offset relative to the target element + * + * @return Object {x: ..., y: ...} or null + */ + offset: function() { + if(this.target instanceof Element) { + var element_position = this.target.position(); + + return { + x: this.pageX - element_position.x, + y: this.pageY - element_position.y + }; + } + + // triggered outside browser window (at toolbar etc.) + return null; + }, + + /** + * Finds the element between the event target + * and the boundary element that matches the + * css-rule + * + * @param String css-rule + * @return Element element or null + */ + find: function(css_rule) { + if (this.target instanceof Wrapper && this.currentTarget instanceof Wrapper) { + var target = this.target._, + search = this.currentTarget.find(css_rule, true); + + while (target) { + if (search.indexOf(target) !== -1) { + return wrap(target); + } + target = target.parentNode; + } + } + + return undefined; + } +}, Event_Klass), + +Event_delegation_shortcuts = []; + + +/** + * The DOM Element unit handling + * + * Copyright (C) 2008-2011 Nikolay Nemshilov + */ + +var Element = RightJS.Element = new Class(Wrapper, { + /** + * constructor + * + * NOTE: this constructor will dynamically typecast + * the wrappers depending on the element tag-name + * + * @param String element tag name or an HTMLElement instance + * @param Object options + * @return Element element + */ + initialize: function(element, options) { + Element_initialize(this, element, options); + } + +}, Element_Klass), + +Element_wrappers = Element.Wrappers = {}, +elements_cache = {}, + +/** + * bulds dom-elements + * + * @param String element tag name + * @param Object options + * @return HTMLElement + */ +make_element = function (tag, options) { + return (tag in elements_cache ? elements_cache[tag] : ( + elements_cache[tag] = document.createElement(tag) + )).cloneNode(false); +}; + +// +// IE 6,7,8 (not 9!) browsers have a bug with checkbox and radio input elements +// it doesn't place the 'checked' property correctly, plus there are some issues +// with clonned SELECT objects, so we are replaceing the elements maker in here +// +if (IE8_OR_LESS) { + make_element = function(tag, options) { + if (tag === 'input' && options !== undefined) { + tag = ''; + } + + return document.createElement(tag); + }; +} + +/** + * Basic element's constructor + * + * @param Element wrapper instance + * @param mixed raw dom element of a string tag name + * @param Object options + * @return void + */ +function Element_initialize(inst, element, options) { + if (typeof element === 'string') { + inst._ = make_element(element, options); + + if (options !== undefined) { + for (var key in options) { + switch (key) { + case 'id': inst._.id = options[key]; break; + case 'html': inst._.innerHTML = options[key]; break; + case 'class': inst._.className = options[key]; break; + case 'on': inst.on(options[key]); break; + default: inst.set(key, options[key]); + } + } + } + } else { + inst._ = element; + } +} + + +/** + * The DOM Element unit structures handling module + * + * NOTE: all the methods will process and return only the Element nodes + * all the textual nodes will be skipped + * + * NOTE: if a css-rule was specified then the result of the method + * will be filtered/adjusted depends on the rule + * + * Credits: + * The naming principle and most of the names are taken from + * - Prototype (http://prototypejs.org) Copyright (C) Sam Stephenson + * The insertions system implementation is inspired by + * - MooTools (http://mootools.net) Copyright (C) Valerio Proietti + * + * Copyright (C) 2008-2011 Nikolay Nemshilov + */ + +Element.include({ + parent: function(css_rule) { + var parent = this._.parentNode, parent_type = parent && parent.nodeType; + + return css_rule ? this.parents(css_rule)[0] : + (parent_type === 1 || parent_type === 9) ? // <- IE6 sometimes has a fragment node in there + wrap(parent) : null; + }, + + parents: function(css_rule) { + return recursively_collect(this, 'parentNode', css_rule); + }, + + children: function(css_rule) { + return this.find(css_rule).filter(function(element) { + return element._.parentNode === this._; + }, this); + }, + + siblings: function(css_rule) { + return this.prevSiblings(css_rule).reverse().concat(this.nextSiblings(css_rule)); + }, + + nextSiblings: function(css_rule) { + return recursively_collect(this, 'nextSibling', css_rule); + }, + + prevSiblings: function(css_rule) { + return recursively_collect(this, 'previousSibling', css_rule); + }, + + next: function(css_rule) { + return !css_rule && this._.nextElementSibling !== undefined ? + wrap(this._.nextElementSibling) : this.nextSiblings(css_rule)[0]; + }, + + prev: function(css_rule) { + return !css_rule && this._.previousElementSibling !== undefined ? + wrap(this._.previousElementSibling) : this.prevSiblings(css_rule)[0]; + }, + + /** + * removes the elemnt out of this parent node + * + * @return Element self + */ + remove: function() { + var element = this._, parent = element.parentNode; + if (parent) { + parent.removeChild(element); + } + return this; + }, + + /** + * handles the elements insertion functionality + * + * The content might be one of the following data + * + * o) an element instance + * o) a String (all the scripts will be parsed out and executed) + * o) a list of Elements + * o) a hash like {position: content} + * + * @param mixed data to insert + * @param String position to insert top/bottom/before/after/instead + * @return Element self + */ + insert: function(content, position) { + var scripts = null, element = this._; + position = position === undefined ? 'bottom' : position; + + if (typeof(content) !== 'object') { + scripts = content = (''+content); + } else if (content instanceof Element) { + content = content._; + } + + Element_insertions[position](element, + content.nodeType === undefined ? + Element_createFragment( + (position === 'bottom' || position === 'top') ? + element : element.parentNode, content + ) : content + ); + + if (scripts !== null) { scripts.evalScripts(); } + + return this; + }, + + /** + * Inserts the element inside the given one at the given position + * + * @param mixed destination element reference + * @param String optional position + * @return Element this + */ + insertTo: function(element, position) { + $(element).insert(this, position); + return this; + }, + + /** + * A shortcut to uppend several units into the element + * + * @param mixed data + * .................. + * @return Element this + */ + append: function(first) { + return this.insert(isString(first) ? $A(arguments).join('') : arguments); + }, + + /** + * updates the content of the element by the given content + * + * @param mixed content (a String, an Element or a list of elements) + * @return Element self + */ + update: function(content) { + if (typeof(content) !== 'object') { + content = '' + content; + + try { + this._.innerHTML = content; + } catch(e) { + return this.clean().insert(content); + } + + content.evalScripts(); + + return this; + } else { + return this.clean().insert(content); + } + }, + + /** + * Works with the Element's innerHTML property + * This method works both ways! if a content is provided + * then it will be assigned, otherwise will return + * the innerHTML property + * + * @param String html content + * @return String html content or Element this + */ + html: function(content) { + return content === undefined ? this._.innerHTML : this.update(content); + }, + + /** + * Works with the Element's innerHTML property as a text + * when set something, it will appear as is with everything quoted + * when get, will return a string without any tags in it + * + * @param String text content + * @return String text content or Element this + */ + text: function(text) { + return text === undefined ? (this._.textContent || this._.innerText) : + this.update(this.doc()._.createTextNode(text)); + }, + + /** + * replaces the current element by the given content + * + * @param mixed content (a String, an Element or a list of elements) + * @return Element self + */ + replace: function(content) { + return this.insert(content, 'instead'); + }, + + /** + * wraps the element with the given element + * + * @param Element wrapper + * @return Element self + */ + wrap: function(wrapper) { + var element = this._, parent = element.parentNode; + if (parent) { + wrapper = $(wrapper)._; + parent.replaceChild(wrapper, element); + wrapper.appendChild(element); + } + return this; + }, + + /** + * removes all the child nodes out of the element + * + * @return Element self + */ + clean: function() { + while (this._.firstChild) { + this._.removeChild(this._.firstChild); + } + + return this; + }, + + /** + * checks if the element has no child nodes + * + * @return boolean check result + */ + empty: function() { + return this.html().blank(); + }, + + /** + * Creates a clean clone of the element without any events attached to it + * + * @return Element new clone + */ + clone: function() { + return new Element(this._.cloneNode(true)); + }, + + /** + * Returns an index of the element among the other child elements + * + * NOTE: doesn't count the textual nodes! + * + * @return Integer index + */ + index: function() { + var node = this._, + sibling = node.parentNode.firstChild, + index = 0; + + while (sibling !== node) { + if (sibling.nodeType === 1) { // counting elements only + index ++; + } + sibling = sibling.nextSibling; + } + + return index; + } +}); + +/** + * Recursively collects the target element's related nodes + * + * @param Element context + * @param name String pointer attribute name + * @param rule String optional css-atom rule + * @return Array found elements + */ +function recursively_collect(where, attr, css_rule) { + var node = where._, result = [], i=0, no_rule = !css_rule; + + while ((node = node[attr])) { + if (node.nodeType === 1 && (no_rule || wrap(node).match(css_rule))) { + result[i++] = wrap(node); + } + } + + return result; +} + +// list of insertions handling functions +// NOTE: each of the methods will be called in the contects of the current element +var Element_insertions = { + bottom: function(target, content) { + target.appendChild(content); + }, + + top: function(target, content) { + if (target.firstChild !== null) { + target.insertBefore(content, target.firstChild); + } else { + target.appendChild(content); + } + }, + + after: function(target, content) { + var parent = target.parentNode, sibling = target.nextSibling; + if (sibling !== null) { + parent.insertBefore(content, sibling); + } else { + parent.appendChild(content); + } + }, + + before: function(target, content) { + target.parentNode.insertBefore(content, target); + }, + + instead: function(target, content) { + target.parentNode.replaceChild(content, target); + } +}, + +// the element insertion wrappers list +Element_wraps = { + TBODY: ['', '
                              ', 2], + TR: ['', '
                              ', 3], + TD: ['', '
                              ', 4], + COL: ['', '
                              ', 2], + LEGEND: ['
                              ', '
                              ', 2], + AREA: ['', '', 2], + OPTION: ['', 2] +}; + +$alias(Element_wraps, { + OPTGROUP: 'OPTION', + THEAD: 'TBODY', + TFOOT: 'TBODY', + TH: 'TD' +}); + +// converts any data into a html fragment unit +var fragment = document.createDocumentFragment(), + tmp_cont = document.createElement('DIV'); + +function Element_createFragment(context, content) { + if (typeof(content) === 'string') { + var tag = context.tagName, + tmp = tmp_cont, + wrap = tag in Element_wraps ? Element_wraps[tag] : ['', '', 1], + depth = wrap[2]; + + tmp.innerHTML = wrap[0] + '<'+ tag + '>' + content + '' + wrap[1]; + + while (depth-- !== 0) { + tmp = tmp.firstChild; + } + + content = tmp.childNodes; + + while (content.length !== 0) { + fragment.appendChild(content[0]); + } + + } else { + for (var i=0, length = content.length, node; i < length; i++) { + node = content[content.length === length ? i : 0]; + fragment.appendChild(node instanceof Element ? node._ : node); + } + } + + return fragment; +} + + +/** + * this module contains the element unit styles related methods + * + * Credits: + * Some of the functionality is inspired by + * - Prototype (http://prototypejs.org) Copyright (C) Sam Stephenson + * - MooTools (http://mootools.net) Copyright (C) Valerio Proietti + * - Dojo (www.dojotoolkit.org) Copyright (C) The Dojo Foundation + * + * Copyright (C) 2008-2011 Nikolay V. Nemshilov + */ +Element.include({ + /** + * assigns styles out of the hash to the element + * + * NOTE: the style keys might be camelized or dasherized, both cases should work + * + * @param Object styles list or String style name + * @param String style value in case of the first param a string style name + * @return Element self + */ + setStyle: function(hash, value) { + var key, c_key, style = {}, element_style = this._.style; + + if (value !== undefined) { style[hash] = value; hash = style; } + else if(isString(hash)) { + hash.split(';').each(function(option) { + var els = option.split(':').map('trim'); + if (els[0] && els[1]) { + style[els[0]] = els[1]; + } + }); + hash = style; + } + + + for (key in hash) { + c_key = key.indexOf('-') < 0 ? key : key.camelize(); + + if (IE_OPACITY && key === 'opacity') { + element_style.filter = 'alpha(opacity='+ hash[key] * 100 +')'; + } else if (key === 'float') { + c_key = Browser_IE ? 'styleFloat' : 'cssFloat'; + } + + element_style[c_key] = hash[key]; + } + + return this; + }, + + /** + * returns style of the element + * + * NOTE: will include the CSS level definitions + * + * @param String style key + * @return String style value or null if not set + */ + getStyle: function(key) { + return clean_style(this._.style, key) || clean_style(this.computedStyles(), key); + }, + + /** + * returns the hash of computed styles for the element + * + * @return Object/CSSDefinition computed styles + */ + computedStyles: HTML.currentStyle ? function() { + return this._.currentStyle || {}; + } : HTML.runtimeStyle ? function() { + return this._.runtimeStyle || {}; + } : function() { + return this._.ownerDocument.defaultView.getComputedStyle(this._, null); + }, + + /** + * checks if the element has the given class name + * + * @param String class name + * @return boolean check result + */ + hasClass: function(name) { + return (' '+this._.className+' ').indexOf(' '+name+' ') != -1; + }, + + /** + * sets the whole class-name string for the element + * + * @param String class-name + * @return Element self + */ + setClass: function(class_name) { + this._.className = class_name; + return this; + }, + + /** + * Returns the current class-name + * + * @return String class-name + */ + getClass: function() { + return this._.className; + }, + + /** + * adds the given class name to the element + * + * @param String class name + * @return Element self + */ + addClass: function(name) { + var testee = ' '+this._.className+' '; + if (testee.indexOf(' '+name+' ') == -1) { + this._.className += (testee === ' ' ? '' : ' ') + name; + } + return this; + }, + + /** + * removes the given class name + * + * @param String class name + * @return Element self + */ + removeClass: function(name) { + this._.className = (' '+this._.className+' ').replace(' '+name+' ', ' ').trim(); + return this; + }, + + /** + * toggles the given class name on the element + * + * @param String class name + * @return Element self + */ + toggleClass: function(name) { + return this[this.hasClass(name) ? 'removeClass' : 'addClass'](name); + }, + + /** + * adds the given class-name to the element + * and removes it from all the element siblings + * + * @param String class name + * @return Element self + */ + radioClass: function(name) { + this.siblings().each('removeClass', name); + return this.addClass(name); + } +}); + +/** + * cleans up a style value + * + * @param Object styles hash + * @param String style-key + * @return String clean style + */ +function clean_style(style, key) { + key = key.camelize(); + + if (key === 'opacity') { + return IE_OPACITY ? ( + (/opacity=(\d+)/i.exec(style.filter || '') || + ['', '100'])[1].toInt() / 100 + )+'' :style[key].replace(',', '.'); + } + + if (key === 'float') { + key = Browser_IE ? 'styleFloat' : 'cssFloat'; + } + + var value = style[key]; + + // Opera returns named colors with quotes + if (Browser_Opera && /color/i.test(key) && value) { + value = value.replace(/"/g, ''); + } + + return value; +} + + +/** + * Common DOM Element unit methods + * + * Credits: + * Most of the naming system in the module inspired by + * - Prototype (http://prototypejs.org) Copyright (C) Sam Stephenson + * + * Copyright (C) 2008-2011 Nikolay V. Nemshilov + */ +Element.include({ + /** + * sets the element attributes + * + * @param String attr name or Object attributes hash + * @param mixed attribute value + * @return Element self + */ + set: function(hash, value) { + if (typeof(hash) === 'string') { var val = {}; val[hash] = value; hash = val; } + + var key, element = this._; + + for (key in hash) { + if (key === 'style') { + this.setStyle(hash[key]); + } else { + // some attributes are not available as properties + if (!(key in element)) { + element.setAttribute(key, ''+hash[key]); + } + element[key] = hash[key]; + } + } + + return this; + }, + + /** + * returns the attribute value for the name + * + * @param String attr name + * @return mixed value + */ + get: function(name) { + var element = this._, value = element[name] || element.getAttribute(name); + return value === '' ? null : value; + }, + + /** + * checks if the element has that attribute + * + * @param String attr name + * @return Boolean check result + */ + has: function(name) { + return this.get(name) !== null; + }, + + /** + * erases the given attribute of the element + * + * @param String attr name + * @return Element self + */ + erase: function(name) { + this._.removeAttribute(name); + return this; + }, + + /** + * checks if the elemnt is hidden + * + * NOTE: will check css level computed styles too + * + * @return boolean check result + */ + hidden: function() { + return this.getStyle('display') === 'none'; + }, + + /** + * checks if the element is visible + * + * @return boolean check result + */ + visible: function() { + return !this.hidden(); + }, + + /** + * hides the element + * + * @param String optional effect name + * @param Object the optional effect options + * @return Element self + */ + hide: function(effect, options) { + if (this.visible()) { + this._d = this.getStyle('display'); + this._.style.display = 'none'; + } + + return this; + }, + + /** + * shows the element + * + * @return Element self + */ + show: function() { + if (this.hidden()) { + var element = this._, value = this._d, dummy; + + // trying to guess the default 'style.display' for this kind of elements + if (!value || value === 'none') { + dummy = $E(element.tagName).insertTo(HTML); + value = dummy.getStyle('display'); + dummy.remove(); + } + + // failsafe in case the user been naughty + if (value === 'none') { + value = 'block'; + } + + element.style.display = value; + } + + return this; + }, + + /** + * toggles the visibility state of the element + * + * @return Element self + */ + toggle: function() { + return this[this.visible() ? 'hide' : 'show'](); + }, + + /** + * shows the element and hides all the sibligns + * + * @param String optional effect name + * @param Object the optional effect options + * @return Element self + */ + radio: function(effect, options) { + this.siblings().each('hide', effect, options); + return this.show(); + } +}); + + +/** + * this module contains the Element's part of functionality + * responsible for the dimensions and positions getting/setting + * + * Copyright (C) 2008-2011 Nikolay Nemshilov + */ +Element.include({ + /** + * Returns the reference to this element document + * + * @return RightJS.Document + */ + doc: function() { + return wrap(this._.ownerDocument); + }, + + /** + * Returns the reference to this elements window + * + * @return RightJS.Window + */ + win: function() { + return this.doc().win(); + }, + + /** + * Returns the element size as a hash + * + * @return Object {x: NNN, y: NNN} + */ + size: function() { + return { x: this._.offsetWidth, y: this._.offsetHeight }; + }, + + /** + * Returns the element absolute position + * + * NOTE: see the konq.js file for the manual version of the method + * + * @return Object {x: NNN, y: NNN} + */ + position: function() { + var rect = this._.getBoundingClientRect(), + html = this.doc()._.documentElement, + scrolls = this.win().scrolls(); + + return { + x: rect.left + scrolls.x - html.clientLeft, + y: rect.top + scrolls.y - html.clientTop + }; + }, + + /** + * Returns the element scrolls + * + * @return Object {x: NNN, y: NNN} + */ + scrolls: function() { + return { x: this._.scrollLeft, y: this._.scrollTop }; + }, + + /** + * returns the element dimensions hash + * + * @return Object dimensions (top, left, width, height, scrollLeft, scrollTop) + */ + dimensions: function() { + var size = this.size(), + scrolls = this.scrolls(), + position = this.position(); + + return { + top: position.y, + left: position.x, + width: size.x, + height: size.y, + scrollLeft: scrolls.x, + scrollTop: scrolls.y + }; + }, + + /** + * Checks if the element overlaps the given position + * + * @param Object position {x: NNN, y: NNN} + * @return boolean check result + */ + overlaps: function(target) { + var pos = this.position(), size = this.size(); + + return target.x > pos.x && target.x < (pos.x + size.x) && + target.y > pos.y && target.y < (pos.y + size.y); + }, + + /** + * sets the width of the element in pixels + * + * NOTE: will double assign the size of the element, so it match the exact + * size including any possible borders and paddings + * + * @param Integer width in pixels + * @return Element self + */ + setWidth: function(width_px) { + var style = this._.style; + style.width = width_px + 'px'; + style.width = (2 * width_px - this._.offsetWidth) + 'px'; + return this; + }, + + /** + * sets the width of the element in pixels + * + * NOTE: will double assign the size of the element, so it match the exact + * size including any possible borders and paddings + * + * @param Integer height in pixels + * @return Element self + */ + setHeight: function(height_px) { + var style = this._.style; + style.height = height_px + 'px'; + style.height = (2 * height_px - this._.offsetHeight) + 'px'; + return this; + }, + + /** + * sets the size of the element in pixels + * + * NOTE: will double assign the size of the element, so it match the exact + * size including any possible borders and paddings + * + * @param width Integer width in pixels or {x: 10, y: 20} like object + * @param height Integer height + * @return Element self + */ + resize: function(width, height) { + if (isHash(width)) { + height = width.y; + width = width.x; + } + return this.setWidth(width).setHeight(height); + }, + + /** + * sets the element position (against the window corner) + * + * @param left Number left position in pixels or an object like {x: 10, y: 20} + * @param top Number top position in pixels + * @return Element self + */ + moveTo: function(left, top) { + if (isHash(left)) { + top = left.y; + left = left.x; + } + + return this.setStyle({ + left: left + 'px', + top: top + 'px' + }); + }, + + /** + * sets the scroll position + * + * @param left Integer left scroll px or an object like {x: 22, y: 33} + * @param top Integer top scroll px + * @return Element self + */ + scrollTo: function(left, top) { + if (isHash(left)) { + top = left.y; + left = left.x; + } + + this._.scrollLeft = left; + this._.scrollTop = top; + + return this; + }, + + /** + * makes the window be scrolled to the element + * + * @param Object fx options + * @return Element self + */ + scrollThere: function(options) { + this.win().scrollTo(this, options); + return this; + } +}); + + +/** + * DOM Element events handling methods + * + * Copyright (C) 2008-2011 Nikolay Nemshilov + */ +[Element, Document, Window].each('include', $ext(Observer_create({}), { + /** + * The basic events handling attachment method + * SEE Observer#on for more details about supported arguments + * + * @returnt this + */ + on: function() { + Observer_on(this, arguments, function(hash) { + + if (hash.e === 'mouseenter' || hash.e === 'mouseleave') { + mouse_io_activate(); + hash.n = hash.e; + hash.w = function() {}; + // NOTE: we don't attach this listener to the actual element! + // so it didn't screw with IE's native enter/leave handlers + } else { + if (hash.e === 'contextmenu' && Browser.Konqueror) { + hash.n = 'rightclick'; + } else if (hash.e === 'mousewheel' && Browser.Gecko) { + hash.n = 'DOMMouseScroll'; + } else { + hash.n = hash.e; + } + + hash.w = function(event) { + event = new Event(event, hash.t); + if (hash.f.apply(hash.t, (hash.r?[]:[event]).concat(hash.a)) === false) { + event.stop(); + } + }; + + if (IE8_OR_LESS) { + hash.t._.attachEvent('on'+hash.n, hash.w); + } else { + hash.t._.addEventListener(hash.n, hash.w, false); + } + } + + return hash; + }); + + return this; + }, + + /** + * Stops an event handling + * + * @param String event name or a function callback + * @param function callback or nothing + * @return this + */ + stopObserving: function(event, callback) { + Observer_stopObserving(this, event, callback, function(hash) { + if (IE8_OR_LESS) { + hash.t._.detachEvent('on'+ hash.n, hash.w); + } else { + hash.t._.removeEventListener(hash.n, hash.w, false); + } + }); + + return this; + }, + + /** + * Artificially trigers the event on the element + * + * @param string event name or an Event instance + * @param Object options + * @return this + */ + fire: function(event, options) { + var parent = this.parent && this.parent(); + + if (!(event instanceof Event)) { + event = new Event(event, $ext({target: this._}, options)); + } + + // setting up the currentTarget reference + event.currentTarget = this; + + (this.$listeners || []).each(function(hash) { + if (hash.e === event.type && + hash.f.apply(this, (hash.r?[]:[event]).concat(hash.a)) === false + ) { + event.stop(); + } + }, this); + + // manually bypassing the event to the parent one if it should bubble + if (parent && parent.fire && !event.stopped) { + parent.fire(event); + } + + return this; + }, + + /** + * a simple events terminator method to be hooked like this.onClick('stopEvent'); + * + * @return false + */ + stopEvent: function() { return false; } +})); + +// couple more shortcuts for the window +Observer_createShortcuts(Window.prototype, $w('blur focus scroll resize load')); + +/** + * Registers a list of event-binding shortcuts like + * $(element).onClick + * $(element).onMouseover + * + * @param String space separated event names + * @return void + */ +function Element_add_event_shortcuts(tokens) { + tokens = $w(tokens); + Event_delegation_shortcuts = Event_delegation_shortcuts.concat(tokens); + + Observer_createShortcuts(Element.prototype, tokens); + Observer_createShortcuts(Document.prototype, tokens); +} + +Element_add_event_shortcuts( + 'click rightclick contextmenu mousedown mouseup '+ + 'mouseover mouseout mousemove keypress keydown keyup' +); + + +/** + * The DOM elements selection handling + * + * NOTE: this module is just a wrap over the native CSS-selectors feature + * see the olds/css.js file for the manual selector code + * + * Copyright (C) 2008-2011 Nikolay Nemshilov + */ + +[Element, Document].each('include', { + /** + * Extracts the first element matching the css-rule, + * or just any first element if no css-rule was specified + * + * @param String css-rule + * @return Element matching node or null + */ + first: function(css_rule) { + return wrap( + css_rule === undefined && this._.firstElementChild !== undefined ? + this._.firstElementChild : this._.querySelector(css_rule || '*') + ); + }, + + /** + * Finds a list of matching nodes, or all the descendant nodes if no css-rule provided + * + * @param String css-rule + * @param boolean raw-search + * @return Array of elements + */ + find: function(css_rule, raw) { + var query = this._.querySelectorAll(css_rule || '*'), result, i=0, l = query.length; + + if (raw === true) { + result = $A(query); + } else { + for (result = []; i < l; i++) { + result[i] = wrap(query[i]); + } + } + + return result; + }, + + /** + * checks if the element matches this css-rule + * + * NOTE: the element should be attached to the page + * + * @param String css-rule + * @return Boolean check result + */ + match: function(css_rule) { + // finding the top parent element (the element might not be on the document) + var element = this._, parent = element, result, faking = false; + + while (parent.parentNode !== null && parent.parentNode.nodeType !== 11) { + parent = parent.parentNode; + } + + // creating a fake context when needed + if (element === parent) { + parent = document.createElement('div'); + parent.appendChild(element); + faking = true; + } + + result = wrap(parent).find(css_rule, true).indexOf(element) !== -1; + + if (faking) { + parent.removeChild(element); + } + + return result; + } +}); + + +/** + * The dom-ready event handling code + * + * Credits: + * The basic principles of the module are originated from + * - MooTools (http://mootools.net) Copyright (C) Valerio Proietti + * + * Copyright (C) 2009-2011 Nikolay Nemshilov + */ +Document.include({ + on: function(name) { + if (name === 'ready' && !this._iR) { + var document = this._, ready = this.fire.bind(this, 'ready'); + + // IE and Konqueror browsers + if ('readyState' in document) { + (function() { + if (['loaded','complete'].include(document.readyState)) { + ready(); + } else { + arguments.callee.delay(50); + } + })(); + } else { + document.addEventListener('DOMContentLoaded', ready, false); + } + + this._iR = true; + } + + return this.$super.apply(this, arguments); + } +}); + +Observer_createShortcuts(Document.prototype, ['ready']); + +/** + * The form unit class and extensions + * + * Credits: + * The basic principles of the module are inspired by + * - Prototype (http://prototypejs.org) Copyright (C) Sam Stephenson + * + * Copyright (C) 2009-2011 Nikolay Nemshilov + */ + +var Form = RightJS.Form = Element_wrappers.FORM = new Class(Element, { + /** + * constructor + * + * NOTE: this constructor can be called as a normal Element constructor + * or with the options only, which will make a FORM element + * + * var form = new Form(raw_form_object_element); + * var form = new Form({method: 'post', action: '/boo/hoo'}); + * + * @param Object options or HTMLFormElement object + * @return void + */ + initialize: function(in_options) { + var options = in_options || {}, remote = 'remote' in options, element = options; + + if (isHash(options) && !isElement(options)) { + element = 'form'; + options = Object.without(options, 'remote'); + } + + this.$super(element, options); + + if (remote) { + this.remotize(); + } + }, + + /** + * returns the form elements as an array of extended units + * + * @return Array of elements + */ + elements: function() { + return this.find('input,button,select,textarea'); + }, + + /** + * returns the list of all the input elements on the form + * + * @return Array of elements + */ + inputs: function() { + return this.elements().filter(function(input) { + return !['submit', 'button', 'reset', 'image', null].include(input._.type); + }); + }, + + /** + * Accessing an input by name + * + * @param String name + * @return Input field + */ + input: function(name) { + return wrap(this._[name]); + }, + + /** + * focuses on the first input element on the form + * + * @return Form this + */ + focus: function() { + var element = this.inputs().first(function(input) { + return input._.type !== 'hidden'; + }); + + if (element) { element.focus(); } + + return this; + }, + + /** + * removes focus out of all the form elements + * + * @return Form this + */ + blur: function() { + this.elements().each('blur'); + return this; + }, + + /** + * disables all the elements on the form + * + * @return Form this + */ + disable: function() { + this.elements().each('disable'); + return this; + }, + + /** + * enables all the elements on the form + * + * @return Form this + */ + enable: function() { + this.elements().each('enable'); + return this; + }, + + /** + * returns the list of the form values + * + * @return Object values + */ + values: function() { + var values = {}, value, name, element, input; + + this.inputs().each(function(element) { + input = element._; + name = input.name; + if (!input.disabled && name && ( + !['checkbox', 'radio'].include(input.type) || input.checked + )) { + value = element.getValue(); + if (name.endsWith('[]')) { + value = (values[name] || []).concat([value]); + } + + values[name] = value; + } + }); + + return values; + }, + + /** + * returns the key/values organized ready to be sent via a get request + * + * @return String serialized values + */ + serialize: function() { + return Object.toQueryString(this.values()); + }, + + /** + * Delegating the submit method + * + * @return Form this + */ + submit: function() { + this._.submit(); + return this; + }, + + /** + * Delegating the 'reset' method + * + * @return Form this + */ + reset: function() { + this._.reset(); + return this; + } +}); + +// creating the event shortcuts +Element_add_event_shortcuts('submit reset focus blur disable enable change'); + + +/** + * The form input element class + * + * Copyright (C) 2010-2011 Nikolay Nemshilov + */ +var Input = RightJS.Input = + +// retgistering the typecasted wrappers +Element_wrappers.INPUT = +Element_wrappers.BUTTON = +Element_wrappers.SELECT = +Element_wrappers.TEXTAREA = +Element_wrappers.OPTGROUP = + +new Class(Element, { + /** + * Constructor + * + * NOTE: this constructor can be called in several ways + * + * Like normal Element + * var input = new Input('texarea', {...}); + * var input = new Input(document.createElement('select')); + * + * Or with options only which will make an INPUT element by default + * var input = new Input({type: 'password', name: 'password'}); + * + * @param HTMLElement or a String tag name or Options for default 'input' tag + * @param Object options + * @return void + */ + initialize: function(element, options) { + // type to tag name conversion + if (!element || (isHash(element) && !isElement(element))) { + options = element || {}; + + if (/textarea|select/.test(options.type || '')) { + element = options.type; + delete(options.type); + } else { + element = 'input'; + } + } + + this.$super(element, options); + }, + + /** + * Returns a reference to the input's form + * + * @return Form wrapped form + */ + form: function() { + return wrap(this._.form); + }, + + /** + * Overloading the method to fix some issues with IE and FF + * + * @param mixed content + * @param string optional position + * @return Input this + */ + insert: function(content, position) { + this.$super(content, position); + + // manually resetting the selected option in here + this.find('option').each(function(option) { + option._.selected = !!option.get('selected'); + }); + + return this; + }, + + /** + * Overloading the method so it always called the '#insert' method + * + * @param mixed content + * @return Input this + */ + update: function(content) { + return this.clean().insert(content); + }, + + /** + * uniform access to the element values + * + * @return String element value + */ + getValue: function() { + if (this._.type == 'select-multiple') { + return this.find('option').map(function(option) { + return option._.selected ? option._.value : null; + }).compact(); + } else { + return this._.value; + } + }, + + /** + * uniform accesss to set the element value + * + * @param String value + * @return Element this + */ + setValue: function(value) { + if (this._.type == 'select-multiple') { + value = ensure_array(value).map(String); + this.find('option').each(function(option) { + option._.selected = value.include(option._.value); + }); + } else { + this._.value = value; + } + return this; + }, + + /** + * Both ways getter/setter for the value parameter + * + * @param mixed value + * @return mixed this or the value + */ + value: function(value) { + return this[value === undefined ? 'getValue' : 'setValue'](value); + }, + + /** + * focuses on the first input element on the form + * + * @return Form this + */ + focus: function() { + this._.focus(); + this.focused = true; + if (Browser_IE) { this.fire('focus', {bubbles: false}); } + return this; + }, + + /** + * removes focus out of all the form elements + * + * @return Form this + */ + blur: function() { + this._.blur(); + this.focused = false; + if (Browser_IE) { this.fire('blur', {bubbles: false}); } + return this; + }, + + /** + * focuses on the element and selects its content + * + * @return Element this + */ + select: function() { + this._.select(); + return this.focus(); + }, + + /** + * disables all the elements on the form + * + * @return Form this + */ + disable: function() { + this._.disabled = true; + return this.fire('disable'); + }, + + /** + * enables all the elements on the form + * + * @return Form this + */ + enable: function() { + this._.disabled = false; + return this.fire('enable'); + }, + + /** + * A bidirectional method to set/get the disabled status of the input field + * + * @param boolean optional value + * @return Input in setter mode boolean in getter + */ + disabled: function(value) { + return value === undefined ? this._.disabled : this[value ? 'disable' : 'enable'](); + }, + + /** + * A bidirectional method to set/get the checked status of the input field + * + * @param boolean optional value + * @return Input in setter mode boolean in getter + */ + checked: function(value) { + if (value === undefined) { + value = this._.checked; + } else { + this._.checked = value; + value = this; + } + + return value; + } +}); + + +/** + * This module provides correct focus/blur events bubbling + * + * Copyright (C) 2010-2011 Nikolay Nemshilov + */ + +/** + * Triggers a manual focus/blur events bubbling + * + * @param raw dom-event + * @return void + */ +function focus_boobler(raw_event) { + var event = new Event(raw_event), + target = event.target, + parent = target.parent && target.parent(); + + event.type = raw_event.type === 'focusin' || raw_event.type === 'focus' ? 'focus' : 'blur'; + + if (parent) { parent.fire(event); } +} + +/** + * Hooking up the 'focus' and 'blur' events + * at the document level and then rebooble them + * manually like they were normal events + * + */ +if (IE8_OR_LESS) { + document.attachEvent('onfocusin', focus_boobler); + document.attachEvent('onfocusout', focus_boobler); +} else { + document.addEventListener('focus', focus_boobler, true); + document.addEventListener('blur', focus_boobler, true); +} + + +/** + * Provides the mouse enter/leave events handling emulation + * + * Copyright (C) 2010-2011 Nikolay Nemshilov + */ +var mouse_io_index = [], mouse_io_inactive = true; + +/** + * Fires the actual mouseenter/mouseleave event + * + * @param original event + * @param raw dom element + * @param integer uid + * @param boolean mouseenter or mouseleave + * @return void + */ +function mouse_io_fire(raw, element, uid, enter) { + var event = new Event(raw); + event.type = enter === true ? 'mouseenter' : 'mouseleave'; + event.bubbles = false; + event.stopped = true; + event.target = wrap(element); + + // replacing the #find method so that UJS didn't + // get broke with trying to find nested elements + event.find = function(css_rule) { + return $$(css_rule, true) + .indexOf(this.target._) === -1 ? + undefined : this.target; + }; + + event.target.fire(event); + current_Document.fire(event); +} + +/** + * Figures out the enter/leave events by listening the + * mouseovers in the document + * + * @param raw dom event + * @return void + */ +function mouse_io_handler(e) { + var target = e.target || e.srcElement, + from = e.relatedTarget || e.fromElement, + element = target, + passed = false, + parents = [], + uid, event; + + while (element.nodeType === 1) { + uid = $uid(element); + + if (mouse_io_index[uid] === undefined) { + mouse_io_fire(e, element, uid, + mouse_io_index[uid] = true + ); + } + + if (element === from) { + passed = true; + } + + parents.push(element); + + element = element.parentNode; + } + + if (from && !passed) { + while (from !== null && from.nodeType === 1 && parents.indexOf(from) === -1) { + uid = $uid(from); + if (mouse_io_index[uid] !== undefined) { + mouse_io_fire(e, from, uid, + mouse_io_index[uid] = undefined + ); + } + + from = from.parentNode; + } + } +} + +/** + * Calling 'mouseleave' for all currently active elements on the page + * + * @return void + */ +function mouse_io_reset(e) { + mouse_io_index.each(function(value, uid) { + if (value && Wrappers_Cache[uid]) { + mouse_io_fire(e, Wrappers_Cache[uid]._, uid, false); + } + }); +} + +/** + * Activating the mouse-io events emulation + * + * @return void + */ +function mouse_io_activate() { + if (mouse_io_inactive) { + mouse_io_inactive = false; + + if (Browser_IE) { + document.attachEvent('onmouseover', mouse_io_handler); + window.attachEvent('blur', mouse_io_reset); + } else { + document.addEventListener('mouseover', mouse_io_handler, false); + window.addEventListener('blur', mouse_io_reset, false); + } + } +} + +Element_add_event_shortcuts('mouseenter mouseleave'); + +/** + * This module the standard events delegation interface + * + * Copyright (C) 2010-2011 Nikolay Nemshilov + */ +[Element, Document].each('include', { + /** + * Attaches a delegative event listener to the element/document + * + * USAGE: + * $(element).delegate('click', '#css.rule', function() {...}); + * $(element).delegate('click', '#css.rule', [func1, func2, ...]); + * $(element).delegate('click', '#css.rule', 'addClass', 'boo'); + * $(element).delegate('click', '#css.rule', 'hide'); + * + * $(element).delegate('click', { + * '#css.rule1': function() {}, + * '#css.rule2': [func1, func2, ...], + * '#css.rule3': ['addClass', 'boo'], + * '#css.rule4': 'hide' + * }); + * + * @param event name + * @param css-rule a hash or rules + * @param callback + * @return this + */ + delegate: function(event) { + var rules = delegation_rules(arguments), css_rule, i, j, list; + for (css_rule in rules) { + for (i=0, list = rules[css_rule]; i < list.length; i++) { + // registering the delegative listener + this.on(event, build_delegative_listener(css_rule, list[i], this)); + + // adding the css-rule and callback references to the store + $ext(this.$listeners.last(), { dr: css_rule, dc: list[i][0] }); + } + } + + return this; + }, + + /** + * Removes a delegative event listener from the element + * + * USAGE: + * $(element).undelegate('click'); + * $(element).undelegate('click', '#css.rule'); + * $(element).undelegate('click', '#css.rule', function() {}); + * $(element).undelegate('click', '#css.rule', [func1, func2, ...]); + * $(element).undelegate('click', '#css.rule', 'addClass', 'boo'); + * $(element).undelegate('click', '#css.rule', 'hide'); + * + * $(element).undelegate('click', { + * '#css.rule1': function() {}, + * '#css.rule2': [func1, func2, ...], + * '#css.rule3': ['addClass', 'boo'], + * '#css.rule4': 'hide' + * }); + * + * @param event name + * @param css-rule or a hash or rules + * @param callback + * @return this + */ + undelegate: function(event) { + delegation_listeners(arguments, this).each(function(h) { + this.stopObserving(h.n, h.f); + }, this); + + return this; + }, + + /** + * Checks if there is sucha delegative event listener + * + * USAGE: + * $(element).delegates('click'); + * $(element).delegates('click', '#css.rule'); + * $(element).delegates('click', '#css.rule', function() {}); + * $(element).delegates('click', '#css.rule', [func1, func2, ...]); + * $(element).delegates('click', '#css.rule', 'addClass', 'boo'); + * $(element).delegates('click', '#css.rule', 'hide'); + * + * $(element).delegates('click', { + * '#css.rule1': function() {}, + * '#css.rule2': [func1, func2, ...], + * '#css.rule3': ['addClass', 'boo'], + * '#css.rule4': 'hide' + * }); + * + * NOTE: + * if several rules are specified then it will check if + * _any_ of them are delegateed + * + * @param event name + * @param css-rule or a hash of rules + * @param callback + * @return boolean check result + */ + delegates: function() { + return !!delegation_listeners(arguments, this).length; + } +}); + +/** + * Builds the actual event listener that will delegate stuff + * to other elements as they reach the element where the listener + * attached + * + * @param String css rule + * @param Arguments the original arguments list + * @param Object scope + * @return Function the actual event listener + */ +function build_delegative_listener(css_rule, entry, scope) { + var args = $A(entry), callback = args.shift(); + return function(event) { + var target = event.find(css_rule); + return target === undefined ? target : + typeof(callback) === 'string' ? + target[callback].apply(target, args) : + callback.apply(target, [event].concat(args)); + }; +} + +/** + * Converts the events-delegation api arguments + * into a systematic hash of rules + * + * @param Arguments arguments + * @return Object hash of rules + */ +function delegation_rules(raw_args) { + var args = $A(raw_args), rules = args[1] || {}, hash = {}, css_rule; + + if (isString(rules)) { + hash[rules] = args.slice(2); + if (isArray(hash[rules][0])) { + hash[rules] = hash[rules][0].map(ensure_array); + } + } else { + hash = rules; + } + + // converting everything into a hash of lists of callbacks + for (css_rule in hash) { + hash[css_rule] = ensure_array(hash[css_rule]); + hash[css_rule] = isArray(hash[css_rule][0]) ? hash[css_rule] : [hash[css_rule]]; + } + + return hash; +} + +/** + * Returns the list of delegative listeners that match the conditions + * + * @param Arguments raw-arguments + * @param Element the element + * @return Array list of matching listeners + */ +function delegation_listeners(args, object) { + var event = args[0], i, list, + rules = delegation_rules(args), + rules_are_empty = !Object.keys(rules).length; + + return (object.$listeners || []).filter(function(hash) { + return hash.dr && hash.n === event && ( + rules_are_empty || (function() { + for (var css_rule in rules) { + if (hash.dr === css_rule) { + for (i=0, list = rules[css_rule]; i < list.length; i++) { + if (!list[i].length || list[i][0] === hash.dc) { + return true; + } + } + } + } + + return false; + })() + ); + }); +} + + +/** + * Some String level shortcuts to handle collections of elements + * + * Copyright (C) 2011 Nikolay Nemshilov + */ + +/** + * Some nice shortcuts for the document-level events delegation handling + * + * USAGE: + * + * "ul#main-menu li".on("click", function() { alert('clicked'); }); + * "ul#main-menu li".on("mouseover", "addClass", "hovered"); + * "ul#main-menu li".on("mouseout", "removeClass", "hovered"); + * + * // or like that in a shash + * "ul#main-menu li".on({ + * click: function() { alert('clicked'); }, + * mouseover: ['addClass', 'hovered'], + * mouseout: ['removeClass', 'hovered'], + * dblclick: 'hide' + * }); + * + * + * "#css.rule".observes('click'); + * "#css.rule".observes('click', function() {}); + * "#css.rule".observes('click', 'method_name'); + * .... + * + * "#css.rule".stopObserving('click'); + * "#css.rule".stopObserving('click', function() {}); + * "#css.rule".stopObserving('click', 'method_name'); + * .... + */ +Object.each({ + on: 'delegate', + stopObserving: 'undelegate', + observes: 'delegates' +}, function(name, method) { + String.prototype[name] = function() { + var args = $A(arguments), result; + + args.splice(1,0,''+this); + result = current_Document[method].apply(current_Document, args); + + return result === current_Document ? this : result; + }; +}); +var old_on = String.prototype.on; +String.prototype.on = function(hash) { + if (isHash(hash)) { + for (var key in hash) { + old_on.apply(this, [key].concat([hash[key]])); + } + } else { + old_on.apply(this, arguments); + } + return this; +}; + +/** + * building the list of String#onEvent shortucts + * + * USAGE: + * + * "#css.rule".onClick(function() {...}); + * "#css.rule".onMouseover('method_name'); + */ +Event_delegation_shortcuts.each(function(name) { + String.prototype['on'+name.capitalize()] = function() { + return this.on.apply(this, [name].concat($A(arguments))); + }; +}); + +/** + * The rest of the DOM methods access + * + * USAGE: + * "#css.rule".addClass('boo-hoo'); + * "#css.rule".setStyle({color: 'red'}); + * + */ +$w('Element Input Form').each(function(klass) { + Object.each(klass in RightJS ? RightJS[klass].prototype : {}, function(name, method) { + if (isFunction(method) && !(name in String.prototype)) { + String.prototype[name] = function() { + var nodes = $$(this, true), i=0, l = nodes.length, first=true, element, result; + for (; i < l; i++) { + element = wrap(nodes[i]); + result = element[name].apply(element, arguments); + + // checking if that's a data-retrieving call + if (first) { + if (result !== element) { + return result; + } + first = false; + } + } + + // don't return the string itself in here, + // it will screw with data-retrieving calls on empty collections + return null; + }; + } + }); +}); + +/** + * XMLHttpRequest wrapper + * + * Credits: + * Some of the functionality inspired by + * - Prototype (http://prototypejs.org) Copyright (C) Sam Stephenson + * - MooTools (http://mootools.net) Copyright (C) Valerio Proietti + * - jQuery (http://jquery.com) Copyright (C) John Resig + * + * Copyright (C) 2008-2011 Nikolay V. Nemshilov + */ +var Xhr = RightJS.Xhr = new Class(Observer, { + extend: { + // supported events list + EVENTS: $w('success failure complete request cancel create'), + + // default options + Options: { + headers: { + 'X-Requested-With': 'XMLHttpRequest', + 'Accept': 'text/javascript,text/html,application/xml,text/xml,*/*' + }, + method: 'post', + encoding: 'utf-8', + async: true, + evalScripts: false, + evalResponse: false, + evalJS: true, + evalJSON: true, + secureJSON: true, + urlEncoded: true, + spinner: null, + spinnerFx: 'fade', + params: null, + iframed: false, + jsonp: false + }, + + /** + * Shortcut to initiate and send an XHR in a single call + * + * @param String url + * @param Object options + * @return Xhr request + */ + load: function(url, options) { + return new this(url, $ext({method: 'get'}, options)).send(); + } + }, + + /** + * basic constructor + * + * @param String url + * @param Object options + */ + initialize: function(url, options) { + this.initCallbacks(); // system level callbacks should be initialized before the user callbacks + + this.url = url; + + // copying some options to the instance level attributes + $ext(this.$super(options), this.options); + + // merging in the global params + if (this.params != Xhr.Options.params) { + this.params = this.prepareData(Xhr.Options.params, this.params); + } + + // removing the local spinner if it's the same as the global one + if (Xhr.Options.spinner && $(this.spinner) === $(Xhr.Options.spinner)) { + this.spinner = null; + } + }, + + /** + * sets a header + * + * @param name String header name + * @param value String header value + * @return Xhr self + */ + setHeader: function(name, value) { + this.headers[name] = value; + return this; + }, + + /** + * tries to get a response header + * + * @return mixed String header value or undefined + */ + getHeader: function(name) { + var value; + try { + value = this.xhr.getResponseHeader(name); + } catch(e) {} + return value; + }, + + /** + * checks if the request was successful + * + * @return boolean check result + */ + successful: function() { + return (this.status >= 200) && (this.status < 300); + }, + + /** + * performs the actual request sending + * + * @param Object options + * @return Xhr self + */ + send: function(params) { + var add_params = {}, + url = this.url, + method = this.method.toLowerCase(), + headers = this.headers, + key, xhr; + + if (method == 'put' || method == 'delete') { + add_params._method = method; + method = 'post'; + } + + var data = this.prepareData(this.params, this.prepareParams(params), add_params); + + if (this.urlEncoded && method == 'post' && !headers['Content-type']) { + this.setHeader('Content-type', 'application/x-www-form-urlencoded;charset='+this.encoding); + } + + if (method == 'get') { + if (data) { url += (url.include('?') ? '&' : '?') + data; } + data = null; + } + + xhr = this.xhr = this.createXhr(); + this.fire('create'); + + xhr.open(method, url, this.async); + + xhr.onreadystatechange = this.stateChanged.bind(this); + + for (key in headers) { + xhr.setRequestHeader(key, headers[key]); + } + + xhr.send(data); + this.fire('request'); + + if (!this.async) { this.stateChanged(); } + + return this; + }, + + /** + * elements automaticall update method, creates an Xhr request + * and updates the element innerHTML value onSuccess. + * + * @param Element element + * @param Object optional request params + * @return Xhr self + */ + update: function(element, params) { + return this.onSuccess(function(r) { element.update(r.text); }).send(params); + }, + + /** + * stops the request processing + * + * @return Xhr self + */ + cancel: function() { + var xhr = this.xhr; + + if (!xhr || xhr.canceled) { return this; } + + xhr.abort(); + xhr.onreadystatechange = function() {}; + xhr.canceled = true; + + return this.fire('cancel'); + }, + +// protected + // wrapping the original method to send references to the xhr objects + fire: function(name) { + return this.$super(name, this, this.xhr); + }, + + // creates new request instance + createXhr: function() { + if (this.jsonp) { + return new Xhr.JSONP(this); + } else if (this.form && this.form.first('input[type=file]')) { + return new Xhr.IFramed(this.form); + } else if ('ActiveXObject' in window){ + return new ActiveXObject('MSXML2.XMLHTTP'); + } else { + return new XMLHttpRequest(); + } + }, + + // prepares user sending params + prepareParams: function(params) { + if (params && params instanceof Form) { + this.form = params; + params = params.values(); + } + return params; + }, + + // converts all the params into a url params string + prepareData: function() { + return $A(arguments).map(function(param) { + if (!isString(param)) { + param = Object.toQueryString(param); + } + return param.blank() ? null : param; + }).compact().join('&'); + }, + + // handles the state change + stateChanged: function() { + var xhr = this.xhr; + + if (xhr.readyState != 4 || xhr.canceled) { return; } + + try { this.status = xhr.status; + } catch(e) { this.status = 0; } + + this.text = this.responseText = xhr.responseText; + this.xml = this.responseXML = xhr.responseXML; + + this.fire('complete').fire(this.successful() ? 'success' : 'failure'); + }, + + // called on success + tryScripts: function(response) { + var content_type = this.getHeader('Content-type'); + + if (this.evalResponse || (this.evalJS && /(ecma|java)script/i.test(content_type))) { + $eval(this.text); + } else if (/json/.test(content_type) && this.evalJSON) { + this.json = this.responseJSON = this.sanitizedJSON(); + } else if (this.evalScripts) { + this.text.evalScripts(); + } + }, + + // sanitizes the json-response texts + sanitizedJSON: function() { + if (!(/^[,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]*$/).test( + this.text.replace(/\\./g, '@').replace(/"[^"\\\n\r]*"/g, '') + )) { + if (this.secureJSON) { + throw "JSON error: "+this.text; + } + return null; + } + + return 'JSON' in window ? JSON.parse(this.text) : + (new Function("return "+this.text))(); + }, + + // initializes the request callbacks + initCallbacks: function() { + // connecting basic callbacks + this.on({ + success: 'tryScripts', + create: 'showSpinner', + complete: 'hideSpinner', + cancel: 'hideSpinner' + }); + + // wiring the global xhr callbacks + Xhr.EVENTS.each(function(name) { + this.on(name, function() { Xhr.fire(name, this, this.xhr); }); + }, this); + }, + + showSpinner: function() { Xhr.showSpinner.call(this, this); }, + hideSpinner: function() { Xhr.hideSpinner.call(this, this); } +}); + +// attaching the common spinner handling +$ext(Observer_create(Xhr), { + counter: 0, + + // shows the spinner + showSpinner: function(context) { + Xhr.trySpinner(context, 'show'); + }, + + // hides the spinner + hideSpinner: function(context) { + Xhr.trySpinner(context, 'hide'); + }, + + trySpinner: function(context, method) { + var object = context || Xhr.Options, spinner = $(object.spinner); + if (spinner) { spinner[method](object.spinnerFx, {duration: 100}); } + }, + + // counts a request in + countIn: function() { + Xhr.counter ++; + Xhr.showSpinner(); + }, + + // counts a request out + countOut: function() { + Xhr.counter --; + if (Xhr.counter < 1) { + Xhr.hideSpinner(); + } + } +}).on({ + create: 'countIn', + complete: 'countOut', + cancel: 'countOut' +}); + + +/** + * Here are the Form unit Xhr extensions + * + * Credits: + * Some of the functionality inspired by + * - Prototype (http://prototypejs.org) Copyright (C) Sam Stephenson + * - jQuery (http://jquery.com) Copyright (C) John Resig + * + * Copyright (C) 2009-2011 Nikolay V. Nemshilov + */ +Form.include({ + /** + * sends the form via xhr request + * + * @param Options xhr request options + * @return Form this + */ + send: function(options) { + options = options || {}; + options.method = options.method || this._.method || 'post'; + + this.xhr = new Xhr( + this._.action || document.location.href, + $ext({spinner: this.first('.spinner')}, options) + ) + .onComplete(this.enable.bind(this)) + .onCancel(this.enable.bind(this)) + .send(this); + + this.disable.bind(this).delay(1); // webkit needs this async call with iframed calls + return this; + }, + + /** + * Cancels current Xhr request (if there are any) + * + * @return Form this + */ + cancelXhr: function() { + if (this.xhr instanceof Xhr) { + this.xhr.cancel(); + } + + return this; + }, + + /** + * makes the form be remote by default + * + * @param Object default options + * @return Form this + */ + remotize: function(options) { + if (!this.remote) { + this.on('submit', Form_remote_send, options); + this.remote = true; + } + + return this; + }, + + /** + * removes the remote call hook + * + * @return Form this + */ + unremotize: function() { + this.stopObserving('submit', Form_remote_send); + this.remote = false; + return this; + } +}); + +/** + * Catches the form submit events and sends the form remotely + * + * @param Event submit + * @param Object xhr options + * @return void + */ +function Form_remote_send(event, options) { + event.stop(); + this.send(options); +} + + +/** + * this module contains the Element unit XHR related extensions + * + * Credits: + * - jQuery (http://jquery.com) Copyright (C) John Resig + * + * Copyright (C) 2008-2011 Nikolay V. Nemshilov + */ +Element.include({ + /** + * performs an Xhr request to the given url + * and updates the element internals with the responseText + * + * @param String url address + * @param Object xhr options + * @return Element this + */ + load: function(url, options) { + new Xhr(url, $ext({method: 'get'}, options)).update(this); + return this; + } +}); + + +/** + * A dummy XmlHTTPRequest interface to be used in other + * fake requests + * + * Copyright (C) 2010-2011 Nikolay Nemshilov + */ +Xhr.Dummy = { + open: function() {}, + setRequestHeader: function() {}, + onreadystatechange: function() {} +}; + + +/** + * This unit presents a fake drop in replacement for the XmlHTTPRequest unit + * but works with an iframe targeting in the background + * + * Copyright (C) 2008-2011 Nikolay Nemshilov + */ +Xhr.IFramed = new Class({ + include: Xhr.Dummy, + + /** + * constructor + * + * @param Form form which will be submitted via the frame + * @return void + */ + initialize: function(form) { + this.form = form; + this.id = 'xhr_'+ new Date().getTime(); + + this.form.doc().first('body').append('', + 'after'); + + $(this.id).on('load', this.onLoad.bind(this)); + }, + + send: function() { + this.form.set('target', this.id).submit(); + }, + + onLoad: function() { + this.status = 200; + this.readyState = 4; + + this.form.set('target', ''); + + try { + this.responseText = window[this.id].document.documentElement.innerHTML; + } catch(e) { } + + this.onreadystatechange(); + }, + + abort: function() { + $(this.id).set('src', 'about:blank'); + } +}); + + +/** + * The JSONP Xhr request tonnel + * + * Copyright (C) 2010-2011 Nikolay Nemshilov + */ +Xhr.JSONP = new Class({ + include: Xhr.Dummy, + + prefix: 'jsonp', + + /** + * Constructor + * + * @param Xhr the actual xhr request object + * @return void + */ + initialize: function(xhr) { + this.xhr = xhr; + this.name = this.prefix + new Date().getTime(); + this.param = (isString(xhr.jsonp) ? + xhr.jsonp : 'callback') + "=" + this.name; + + this.script = $E('script', { + charset: xhr.encoding, + async: xhr.async + }); + }, + + /** + * saving the url and method for the further use + * + * @param method String request method + * @param address String request url address + * @param Boolean async request marker + * @return void + */ + open: function(method, url, async) { + this.url = url; + this.method = method; + }, + + /** + * Sends the actual request by inserting the script into the document body + * + * @param String data + * @return void + */ + send: function(data) { + window[this.name] = this.finish.bind(this); + + this.script.set('src', this.url + (this.url.include('?') ? '&' : '?') + this.param + "&" + data) + .insertTo($$('script').last(), 'after'); + }, + + /** + * Receives the actual JSON data from the server + * + * @param Object JSON data + * @return void + */ + finish: function(data) { + this.status = 200; + this.readyState = 4; + + this.xhr.json = this.xhr.responseJSON = data; + + this.onreadystatechange(); + }, + + /** + * We can't really cancel a JSONP request + * but we can prevent the default handler to ckick in + * + * @return void + */ + abort: function() { + window[this.name] = function() {}; + } +}); + + +/** + * Basic visual effects class + * + * Credits: + * The basic principles, structures and naming system are inspired by + * - MooTools (http://mootools.net) Copyright (C) Valerio Proietti + * + * Copyright (C) 2008-2011 Nikolay V. Nemshilov + */ +var Fx = RightJS.Fx = new Class(Observer, { + extend: { + EVENTS: $w('start finish cancel'), + + // named durations + Durations: { + 'short': 200, + 'normal': 400, + 'long': 800 + }, + + // default options + Options: { + fps: IE8_OR_LESS ? 40 : 60, + duration: 'normal', + transition: 'Sin', + queue: true + }, + + // list of basic transitions + Transitions: { + Sin: function(i) { + return -(Math.cos(Math.PI * i) - 1) / 2; + }, + + Cos: function(i) { + return Math.asin((i-0.5) * 2)/Math.PI + 0.5; + }, + + Exp: function(i) { + return Math.pow(2, 8 * (i - 1)); + }, + + Log: function(i) { + return 1 - Math.pow(2, - 8 * i); + }, + + Lin: function(i) { + return i; + } + } + }, + + /** + * Basic constructor + * + * @param Object options + */ + initialize: function(element, options) { + this.$super(options); + this.element = $(element); + fx_register(this); + }, + + /** + * starts the transition + * + * @return Fx this + */ + start: function() { + if (fx_add_to_queue(this, arguments)) { return this; } + + var options = this.options, + duration = Fx.Durations[options.duration] || options.duration, + transition = Fx.Transitions[options.transition] || options.transition, + steps = (duration / 1000 * this.options.fps).ceil(), + interval = (1000 / this.options.fps).round(); + + fx_mark_current(this); + + this.prepare.apply(this, arguments); + + fx_start_timer(this, transition, interval, steps); + + return this.fire('start', this); + }, + + /** + * finishes the transition + * + * @return Fx this + */ + finish: function() { + fx_stop_timer(this); + fx_remove_from_queue(this); + this.fire('finish'); + fx_run_next(this); + return this; + }, + + /** + * interrupts the transition + * + * NOTE: + * this method cancels all the scheduled effects + * in the element chain + * + * @return Fx this + */ + cancel: function() { + fx_stop_timer(this); + fx_remove_from_queue(this); + return this.fire('cancel'); + }, + +// protected + // dummy method, should be implemented in a subclass + prepare: function() {}, + + // dummy method, processes the element properties + render: function() {} +}), + +// global effects registry +scheduled_fx = [], running_fx = []; + +/** + * Registers the element in the effects queue + * + * @param Fx effect + * @return void + */ +function fx_register(fx) { + var uid = $uid((fx.element || {})._ || {}); + fx.ch = (scheduled_fx[uid] = scheduled_fx[uid] || []); + fx.cr = (running_fx[uid] = running_fx[uid] || []); +} + +/** + * Registers the effect in the effects queue + * + * @param Fx fx + * @param Arguments original arguments list + * @return boolean true if it queued and false if it's ready to go + */ +function fx_add_to_queue(fx, args) { + var chain = fx.ch, queue = fx.options.queue; + + if (!chain || fx.$ch) { + return (fx.$ch = false); + } + + if (queue) { + chain.push([args, fx]); + } + + return queue && chain[0][1] !== fx; +} + +/** + * Puts the fx into the list of currently running effects + * + * @param Fx fx + * @return void + */ +function fx_mark_current(fx) { + if (fx.cr) { + fx.cr.push(fx); + } +} + +/** + * Removes the fx from the queue + * + * @param Fx fx + * @return void + */ +function fx_remove_from_queue(fx) { + var currents = fx.cr; + if (currents) { + currents.splice(currents.indexOf(fx), 1); + } +} + +/** + * Tries to invoke the next effect in the queue + * + * @param Fx fx + * @return void + */ +function fx_run_next(fx) { + var chain = fx.ch, next = chain.shift(); + if ((next = chain[0])) { + next[1].$ch = true; + next[1].start.apply(next[1], next[0]); + } +} + +/** + * Cancels all currently running and scheduled effects + * on the element + * + * @param Element element + * @return void + */ +function fx_cancel_all(element) { + var uid = $uid(element._); + + (running_fx[uid] || []).each('cancel'); + (scheduled_fx[uid] || []).splice(0); +} + +/** + * Initializes the fx rendering timer + * + * @param Fx fx + * @param Function transition stops calculator + * @param Float interval + * @param Integer number of steps + * @return void + */ +function fx_start_timer(fx, transition, interval, steps) { + var number = 1; + fx._timer = setInterval(function() { + if (number > steps) { + fx.finish(); + } else { + fx.render(transition(number/steps)); + number ++; + } + }, interval); +} + +/** + * Cancels the Fx rendering timer (if any) + * + * @param Fx fx + * @return void + */ +function fx_stop_timer(fx) { + if (fx._timer) { + clearInterval(fx._timer); + } +} + + +/** + * There are the String unit extensions for the effects library + * + * Copyright (C) 2008-2009 Nikolay V. Nemshilov + */ +String.COLORS = { + maroon: '#800000', + red: '#ff0000', + orange: '#ffA500', + yellow: '#ffff00', + olive: '#808000', + purple: '#800080', + fuchsia: '#ff00ff', + white: '#ffffff', + lime: '#00ff00', + green: '#008000', + navy: '#000080', + blue: '#0000ff', + aqua: '#00ffff', + teal: '#008080', + black: '#000000', + silver: '#c0c0c0', + gray: '#808080', + brown: '#a52a2a' +}; + +String.include({ + /** + * converts a #XXX or rgb(X, X, X) sring into standard #XXXXXX color string + * + * @return String hex color + */ + toHex: function() { + var match = /^#(\w)(\w)(\w)$/.exec(this); + + if (match) { + match = "#"+ match[1]+match[1]+match[2]+match[2]+match[3]+match[3]; + } else if ((match = /^rgb\((\d+),\s*(\d+),\s*(\d+)\)$/.exec(this))) { + match = "#"+ match.slice(1).map(function(bit) { + bit = (bit-0).toString(16); + return bit.length == 1 ? '0'+bit : bit; + }).join(''); + } else { + match = String.COLORS[this] || this; + } + + return match; + }, + + /** + * converts a hex string into an rgb array + * + * @param boolean flag if need an array + * @return String rgb(R,G,B) or Array [R,G,B] + */ + toRgb: function(array) { + var match = /#([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})/i.exec(this.toHex()||''); + + if (match) { + match = match.slice(1).map('toInt', 16); + match = array ? match : 'rgb('+match+')'; + } + + return match; + } +}); + + +/** + * This block contains additional Element shortcuts for effects easy handling + * + * Credits: + * Some ideas are inspired by + * - MooTools (http://mootools.net) Copyright (C) Valerio Proietti + * + * Copyright (C) 2008-2011 Nikolay V. Nemshilov + */ +Element.include({ + /** + * Stops all the visual effects on the element + * + * @return Element this + */ + stop: function() { + fx_cancel_all(this); + return this; + }, + + /** + * hides the element with given visual effect + * + * @param String fx name + * @param Object fx options + * @return Element this + */ + hide: function(fx, options) { + return (fx && this.visible()) ? call_fx(this, fx, ['out', options]) : this.$super(); + }, + + /** + * shows the element with the given visual effect + * + * @param String fx name + * @param Object fx options + * @return Element this + */ + show: function(fx, options) { + return (fx && !this.visible()) ? call_fx(this, fx, ['in', options]) : this.$super(); + }, + + /** + * Toggles the element state with visual effect + * + * @param String fx name + * @param Object fx options + * @return Element this + */ + toggle: function(fx, options) { + return fx ? call_fx(this, fx, ['toggle', options]) : this.$super(); + }, + + /** + * Removes the element out of the DOM structure + * + * @param String fx name + * @param Object fx options + * @return Element this + */ + remove: function(fx, options) { + return (fx && this.visible()) ? call_fx(this, fx, ['out', $ext(options || {}, { + onFinish: this.$super.bind(this) + })]) : this.$super(); + }, + + /** + * runs the Fx.Morth effect to the given style + * + * @param style Object style + * @param options Object optional effect options + * @return Element self + */ + morph: function(style, options) { + return call_fx(this, 'morph', [style, options || {}]); // <- don't replace with arguments + }, + + /** + * highlights the element + * + * @param start String start color + * @param end String optional end color + * @param Object effect options + * @return Element self + */ + highlight: function() { + return call_fx(this, 'highlight', arguments); + }, + + /** + * runs the Fx.Fade effect on the element + * + * @param mixed fade direction 'in' 'out' or a float number + * @return Element self + */ + fade: function() { + return call_fx(this, 'fade', arguments); + }, + + /** + * runs the Fx.Slide effect on the element + * + * @param String 'in' or 'out' + * @param Object effect options + * @return Element self + */ + slide: function() { + return call_fx(this, 'slide', arguments); + }, + + /** + * Starts the smooth scrolling effect + * + * @param position Object {x: NNN, y: NNN} where to scroll + * @param options Object fx-options + * @return Element this + */ + scroll: function(value, options) { + return call_fx(this, 'scroll', [value, options||{}]); + }, + + /** + * wraps the old scroll to be able to run it with fxes + * + * If you send two hashes then will start a smooth scrolling + * otherwise will just jump over with the usual method + * + * @return Element this + */ + scrollTo: function(value, options) { + return isHash(options) ? this.scroll(value, options) : this.$super.apply(this, arguments); + } +}); + +/** + * Calls the visual effect on the element + * + * @param Element context + * @param String fx-name + * @param Object fx-options + * @return Element context + */ +function call_fx(element, name, params) { + var args = $A(params).compact(), + options = isHash(args.last()) ? args.pop() : {}, + fx = new Fx[name.capitalize()](element, options); + + fx.start.apply(fx, args); + + return element; +} + + +/** + * This class provides the basic effect for styles manipulation + * + * Copyright (C) 2008-2011 Nikolay Nemshilov + */ + +///////////////////////////////////////////////////////////////////////////// +// Native css-transitions based implementation +///////////////////////////////////////////////////////////////////////////// + +var native_fx_prefix = ['WebkitT', 'OT', 'MozT', 'MsT', 't'].first(function(name) { + return name + 'ransition' in HTML.style; +}), +native_fx_transition = native_fx_prefix + 'ransition', +native_fx_property = native_fx_transition + 'Property', +native_fx_duration = native_fx_transition + 'Duration', +native_fx_function = native_fx_transition + 'TimingFunction', + +// basic transition algorithm replacements +native_fx_functions = { + Sin: 'cubic-bezier(.3,0,.6,1)', + Cos: 'cubic-bezier(0,.3,.6,0)', + Log: 'cubic-bezier(0.6,.3,.8)', + Exp: 'cubic-bezier(.6,0,.8,.3)', + Lin: 'cubic-bezier(0,0,1,1)' +}; + +function native_fx_prepare(style) { + var options = this.options, + element = this.element, + element_style = element._.style, + old_style = Object.only( + element.computedStyles(), + native_fx_property, + native_fx_duration, + native_fx_function + ); + + function reset_transitions_style() { + for (var key in old_style) { + element_style[key] = old_style[key]; + } + } + + this + .onFinish(reset_transitions_style) + .onCancel(function() { + element_style[native_fx_property] = 'none'; + setTimeout(reset_transitions_style, 1); + }); + + // setting up the transition + element_style[native_fx_property] = 'all'; + element_style[native_fx_duration] = (Fx.Durations[options.duration] || options.duration) +'ms'; + element_style[native_fx_function] = native_fx_functions[options.transition] || options.transition; + + setTimeout(function() { element.setStyle(style); }, 0); +} + +// NOTE: OPERA's css-transitions are a bit jerky so we disable them by default +Fx.Options.engine = native_fx_prefix === undefined || Browser_Opera ? 'javascript' : 'native'; + +//////////////////////////////////////////////////////////////////////////// +// Manual version +//////////////////////////////////////////////////////////////////////////// + +Fx.Morph = new Class(Fx, { +// protected + + // parepares the effect + prepare: function(style) { + if (this.options.engine === 'native' && native_fx_prefix !== undefined) { + this.render = this.transition = function() {}; + native_fx_prepare.call(this, style); + } else { + var keys = style_keys(style), + before = clone_style(this.element, keys), + after = end_style(this.element, style, keys); + + clean_styles(this.element, before, after); + + this.before = parse_style(before); + this.after = parse_style(after); + } + }, + + render: function(delta) { + var before, after, value, style = this.element._.style, key, i, l; + for (key in this.after) { + before = this.before[key]; + after = this.after[key]; + + for (i=0, l = after.length; i < l; i++) { + value = before[i] + (after[i] - before[i]) * delta; + if (after.r) { + value = Math.round(value); + } + after.t[i*2 + 1] = value; + } + + style[key] = after.t.join(''); + } + } +}); + +// a list of common style names to compact the code a bit +var directions = $w('Top Left Right Bottom'); + +// adds variants to the style names list +function add_variants(keys, key, variants) { + for (var i=0; i < variants.length; i++) { + keys.push(key + variants[i]); + } +} + +// creates an appropriate style-keys list out of the user styles +function style_keys(style) { + var keys = [], border_types = ['Style', 'Color', 'Width'], key, i, j; + + for (key in style) { + if (key.startsWith('border')) { + for (i=0; i < 3; i++) { + for (j=0; j < 4; j++) { + keys.push('border' + directions[j] + border_types[i]); + } + } + } else if (key === 'margin' || key === 'padding') { + add_variants(keys, key, directions); + } else if (key.startsWith('background')) { + add_variants(keys, 'background', ['Color', 'Position', 'PositionX', 'PositionY']); + } else if (key === 'opacity' && IE_OPACITY) { + keys.push('filter'); + } else { + keys.push(key); + } + } + + return keys; +} + + +// checks if the color is transparent +function is_transparent(color) { + return color === 'transparent' || color === 'rgba(0, 0, 0, 0)'; +} + +// adjusts the border-styles +function check_border_styles(element, before, after) { + for (var i=0; i < 4; i++) { + var + bd_style = 'border' + directions[i] + 'Style', + bd_width = 'border' + directions[i] + 'Width', + bd_color = 'border' + directions[i] + 'Color'; + + if (bd_style in before && before[bd_style] != after[bd_style]) { + var style = element._.style; + + if (before[bd_style] == 'none') { + style[bd_width] = '0px'; + } + + style[bd_style] = after[bd_style]; + if (is_transparent(before[bd_color])) { + style[bd_color] = element.getStyle('Color'); + } + } + } +} + +// parses the style hash into a processable format +function parse_style(values) { + var result = {}, re = /[\d\.\-]+/g, m, key, value, i; + + for (key in values) { + m = values[key].match(re); + value = m.map('toFloat'); + value.t = values[key].split(re); + value.r = value.t[0] === 'rgb('; + + if (value.t.length == 1) { value.t.unshift(''); } + + for (i=0; i < value.length; i++) { + value.t.splice(i*2 + 1, 0, value[i]); + } + result[key] = value; + } + + return result; +} + +// cleans up and optimizies the styles +function clean_styles(element, before, after) { + var key; + + for (key in after) { + // checking the height/width options + if ((key == 'width' || key == 'height') && before[key] == 'auto') { + before[key] = element._['offset'+key.capitalize()] + 'px'; + } + } + + // IE opacity filter fix + if (IE_OPACITY && after.filter && !before.filter) { + before.filter = 'alpha(opacity=100)'; + } + + // adjusting the border style + check_border_styles(element, before, after); + + // cleaing up the list + for (key in after) { + // proprocessing colors + if (after[key] !== before[key] && /color/i.test(key)) { + if (Browser_Opera) { + after[key] = after[key].replace(/"/g, ''); + before[key] = before[key].replace(/"/g, ''); + } + + if (!is_transparent(after[key])) { after[key] = after[key].toRgb(); } + if (!is_transparent(before[key])) { before[key] = before[key].toRgb(); } + + if (!after[key] || !before[key]) { after[key] = before[key] = ''; } + } + + // filling up the missing size + if (/\d/.test(after[key]) && !/\d/.test(before[key])) { + before[key] = after[key].replace(/[\d\.\-]+/g, '0'); + } + + // removing unprocessable keys + if (after[key] === before[key] || !/\d/.test(before[key]) || !/\d/.test(after[key])) { + delete(after[key]); + delete(before[key]); + } + } +} + +// cloning the element current styles hash +function clone_style(element, keys) { + var i=0, len = keys.length, style = element.computedStyles(), clean = {}, key; + + for (; i < len; i++) { + key = keys[i]; + + if (key in style) { + clean[key] = ''+ style[key]; + + // libwebkit bug fix for in case of languages pack applied + if (key === 'opacity') { + clean[key] = clean[key].replace(',', '.'); + } + } + } + + return clean; +} + +// calculating the end styles hash +function end_style(element, style, keys) { + var dummy = element.clone() + .setStyle('position:absolute;z-index:-1;visibility:hidden') + .setWidth(element.size().x) + .setStyle(style), after; + + if (element.parent()) { + element.insert(dummy, 'before'); + } + + after = clone_style(dummy, keys); + dummy.remove(); + + return after; +} + + +/** + * the elements hightlighting effect + * + * Copyright (C) 2008-2011 Nikolay V. Nemshilov + */ +Fx.Highlight = new Class(Fx.Morph, { + extend: { + Options: Object.merge(Fx.Options, { + color: '#FF8', + transition: 'Exp' + }) + }, + +// protected + + /** + * starts the transition + * + * @param high String the hightlight color + * @param back String optional fallback color + * @return self + */ + prepare: function(start, end) { + var element = this.element, + element_style = element._.style, + style_name = 'backgroundColor', + end_color = end || element.getStyle(style_name); + + if (is_transparent(end_color)) { + this.onFinish(function() { element_style[style_name] = 'transparent'; }); + + // trying to find the end color + end_color = [element].concat(element.parents()) + .map('getStyle', style_name) + .reject(is_transparent) + .compact().first() || '#FFF'; + } + + element_style[style_name] = (start || this.options.color); + + return this.$super({backgroundColor: end_color}); + } +}); + + +/** + * this is a superclass for the bidirectional effects + * + * Copyright (C) 2008-2011 Nikolay V. Nemshilov + */ +Fx.Twin = new Class(Fx.Morph, { + + /** + * hides the element if it meant to be switched off + * + * @return Fx self + */ + finish: function() { + if (this.how === 'out') { + // calling 'prototype' to prevent circular calls from subclasses + Element.prototype.hide.call(this.element); + } + + return this.$super(); + }, + +// protected + + /** + * assigns the direction of the effect in or out + * + * @param String 'in', 'out' or 'toggle', 'toggle' by default + */ + setHow: function(how) { + this.how = how || 'toggle'; + + if (this.how === 'toggle') { + this.how = this.element.visible() ? 'out' : 'in'; + } + } + +}); + + +/** + * the slide effects wrapper + * + * Copyright (C) 2008-2011 Nikolay V. Nemshilov + */ +Fx.Slide = new Class(Fx.Twin, { + extend: { + Options: Object.merge(Fx.Options, { + direction: 'top' + }) + }, + +// protected + prepare: function(how) { + this.setHow(how); + + // calling 'prototype' to prevent circular calls from subclasses + var element = Element.prototype.show.call(this.element), + element_style = element._.style, + old_styles = Object.only( + element_style, + 'overflow', 'width', 'height', + 'marginTop', 'marginLeft' + ); + + function restore_styles() { + for (var key in old_styles) { + element_style[key] = old_styles[key]; + } + } + + this.onFinish(restore_styles).onCancel(restore_styles); + + element_style.overflow = 'hidden'; + + return this.$super(fx_slide_prepare_styles( + element_style, + element.size(), + this.options.direction, + this.how + )); + } +}); + +function fx_slide_prepare_styles(element_style, size, direction, how) { + var style = {}, + margin_left = element_style.marginLeft.toFloat() || 0, + margin_top = element_style.marginTop.toFloat() || 0, + to_right = direction === 'right', + to_bottom = direction === 'bottom', + vertical = direction === 'top' || to_bottom; + + if (how === 'out') { + style[vertical ? 'height' : 'width'] = '0px'; + + if (to_right) { + style.marginLeft = margin_left + size.x+'px'; + } else if (to_bottom) { + style.marginTop = margin_top + size.y +'px'; + } + } else { + if (vertical) { + style.height = size.y + 'px'; + element_style.height = '0px'; + } else { + style.width = size.x + 'px'; + element_style.width = '0px'; + } + + if (to_right) { + style.marginLeft = margin_left + 'px'; + element_style.marginLeft = margin_left + size.x + 'px'; + } else if (to_bottom) { + style.marginTop = margin_top + 'px'; + element_style.marginTop = margin_top + size.y + 'px'; + } + } + + return style; +} + + +/** + * The opacity effects wrapper + * + * Copyright (C) 2008-2011 Nikolay V. Nemshilov + */ +Fx.Fade = new Class(Fx.Twin, { + prepare: function(how) { + this.setHow(how); + + if (this.how === 'in') { + // calling 'prototype' to prevent circular calls from subclasses + Element.prototype.show.call(this.element.setStyle({opacity: 0})); + } + + return this.$super({opacity: this.how === 'in' ? 1 : 0}); + } +}); + + +/** + * An abstract attributes based Fx + * + * Copyright (C) 2010 Nikolay Nemshilov + */ +Fx.Attr = new Class(Fx, { + + prepare: function(attrs) { + this.before = {}; + this.after = attrs; + var key, element = this.element._; + + for (key in attrs) { + this.before[key] = element[key]; + } + }, + + render: function(delta) { + var key, element = this.element._, before = this.before; + for (key in before) { + element[key] = before[key] + (this.after[key] - before[key]) * delta; + } + } + +}); + +/** + * A smooth scrolling visual effect + * + * Copyright (C) 2009-2011 Nikolay Nemshilov + */ +Fx.Scroll = new Class(Fx.Attr, { + + initialize: function(element, options) { + element = $(element); + // swapping the actual scrollable when it's the window + this.$super( + element instanceof Window ? + element._.document[ + 'body' in element._.document ? 'body' : 'documentElement' + ] : element, + options + ); + }, + + prepare: function(value) { + var attrs = {}; + + if ('x' in value) { attrs.scrollLeft = value.x; } + if ('y' in value) { attrs.scrollTop = value.y; } + + this.$super(attrs); + } + +}); + + +/** + * this module handles the work with cookies + * + * Credits: + * Most things in the unit are take from + * - MooTools (http://mootools.net) Copyright (C) Valerio Proietti + * + * Copyright (C) 2008-2010 Nikolay V. Nemshilov + */ +var Cookie = RightJS.Cookie = new Class({ + include: Options, + + extend: { + // sets the cookie + set: function(name, value, options) { + return new this(name, options).set(value); + }, + // gets the cookie + get: function(name) { + return new this(name).get(); + }, + // deletes the cookie + remove: function(name) { + return new this(name).remove(); + }, + + // checks if the cookies are enabled + enabled: function() { + document.cookie = "__t=1"; + return document.cookie.indexOf("__t=1")!=-1; + }, + + // some basic options + Options: { + secure: false, + document: document + } + }, + + /** + * constructor + * @param String cookie name + * @param Object options + * @return void + */ + initialize: function(name, options) { + this.name = name; + this.setOptions(options); + }, + + /** + * sets the cookie with the name + * + * @param mixed value + * @return Cookie this + */ + set: function(data) { + var value = encodeURIComponent(data), options = this.options; + if (options.domain) { value += '; domain=' + options.domain; } + if (options.path) { value += '; path=' + options.path; } + if (options.duration) { + var date = new Date(); + date.setTime(date.getTime() + options.duration * 24 * 60 * 60 * 1000); + value += '; expires=' + date.toGMTString(); + } + if (options.secure) { value += '; secure'; } + options.document.cookie = this.name + '=' + value; + return this; + }, + + /** + * searches for a cookie with the name + * + * @return mixed saved value or null if nothing found + */ + get: function() { + var value = this.options.document.cookie.match( + '(?:^|;)\\s*' + RegExp.escape(this.name) + '=([^;]*)' + ); + return value ? decodeURIComponent(value[1]) : null; + }, + + /** + * removes the cookie + * + * @return Cookie this + */ + remove: function() { + this.options.duration = -1; + return this.set(''); + } +}); + + +// globalizing the top-level variables +$ext(window, Object.without(RightJS, 'version', 'modules')); + +return RightJS; +})(window, document, Object, Array, String, Function, Number, Math); +/** + * The old browsers support patch loading script + * will be included in the core file when it's built + * with the no-olds option + * + * Basically it just checks all the script tags on the page + * finds the core inclusion tag and uses it's src attribute + * to dynamically load the olds patch + * + * Copyright (C) 2009-2011 Nikolay V. Nemshilov + */ +if (RightJS.Browser.OLD) { + (function(d) { + var script = d.createElement('script'), + scripts = d.getElementsByTagName('script'), + rjs_spt = scripts[scripts.length - 1]; + + script.src = rjs_spt.src.replace(/(^|\/)(right)([^\/]+)$/, '$1$2-olds$3'); + + rjs_spt.parentNode.appendChild(script); + })(document); +} diff --git a/js/libraries/balupton-history/vendor/zepto.js b/js/libraries/balupton-history/vendor/zepto.js new file mode 100755 index 00000000..01e7cb26 --- /dev/null +++ b/js/libraries/balupton-history/vendor/zepto.js @@ -0,0 +1,1193 @@ +// Zepto.js +// (c) 2010, 2011 Thomas Fuchs +// Zepto.js may be freely distributed under the MIT license. + +(function(undefined){ + if (String.prototype.trim === undefined) // fix for iOS 3.2 + String.prototype.trim = function(){ return this.replace(/^\s+/, '').replace(/\s+$/, '') }; + + // For iOS 3.x + // from https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/reduce + if (Array.prototype.reduce === undefined) + Array.prototype.reduce = function(fun){ + if(this === void 0 || this === null) throw new TypeError(); + var t = Object(this), len = t.length >>> 0, k = 0, accumulator; + if(typeof fun != 'function') throw new TypeError(); + if(len == 0 && arguments.length == 1) throw new TypeError(); + + if(arguments.length >= 2) + accumulator = arguments[1]; + else + do{ + if(k in t){ + accumulator = t[k++]; + break; + } + if(++k >= len) throw new TypeError(); + } while (true); + + while (k < len){ + if(k in t) accumulator = fun.call(undefined, accumulator, t[k], k, t); + k++; + } + return accumulator; + }; + +})(); +// Zepto.js +// (c) 2010, 2011 Thomas Fuchs +// Zepto.js may be freely distributed under the MIT license. + +var Zepto = (function() { + var undefined, key, $$, classList, emptyArray = [], slice = emptyArray.slice, + document = window.document, + elementDisplay = {}, classCache = {}, + getComputedStyle = document.defaultView.getComputedStyle, + cssNumber = { 'column-count': 1, 'columns': 1, 'font-weight': 1, 'line-height': 1,'opacity': 1, 'z-index': 1, 'zoom': 1 }, + fragmentRE = /^\s*<(\w+)[^>]*>/, + elementTypes = [1, 9, 11], + adjacencyOperators = ['prepend', 'after', 'before', 'append'], + reverseAdjacencyOperators = ['append', 'prepend'], + table = document.createElement('table'), + tableRow = document.createElement('tr'), + containers = { + 'tr': document.createElement('tbody'), + 'tbody': table, 'thead': table, 'tfoot': table, + 'td': tableRow, 'th': tableRow, + '*': document.createElement('div') + }; + + function isF(value) { return ({}).toString.call(value) == "[object Function]" } + function isO(value) { return value instanceof Object } + function isA(value) { return value instanceof Array } + function likeArray(obj) { return typeof obj.length == 'number' } + + function compact(array) { return array.filter(function(item){ return item !== undefined && item !== null }) } + function flatten(array) { return array.length > 0 ? [].concat.apply([], array) : array } + function camelize(str) { return str.replace(/-+(.)?/g, function(match, chr){ return chr ? chr.toUpperCase() : '' }) } + function dasherize(str){ + return str.replace(/::/g, '/') + .replace(/([A-Z]+)([A-Z][a-z])/g, '$1_$2') + .replace(/([a-z\d])([A-Z])/g, '$1_$2') + .replace(/_/g, '-') + .toLowerCase(); + } + function uniq(array) { return array.filter(function(item,index,array){ return array.indexOf(item) == index }) } + + function classRE(name){ + return name in classCache ? + classCache[name] : (classCache[name] = new RegExp('(^|\\s)' + name + '(\\s|$)')); + } + + function maybeAddPx(name, value) { return (typeof value == "number" && !cssNumber[dasherize(name)]) ? value + "px" : value; } + + function defaultDisplay(nodeName) { + var element, display; + if (!elementDisplay[nodeName]) { + element = document.createElement(nodeName); + document.body.appendChild(element); + display = getComputedStyle(element, '').getPropertyValue("display"); + element.parentNode.removeChild(element); + display == "none" && (display = "block"); + elementDisplay[nodeName] = display; + } + return elementDisplay[nodeName]; + } + + function fragment(html, name) { + if (name === undefined) fragmentRE.test(html) && RegExp.$1; + if (!(name in containers)) name = '*'; + var container = containers[name]; + container.innerHTML = '' + html; + return slice.call(container.childNodes); + } + + function Z(dom, selector){ + dom = dom || emptyArray; + dom.__proto__ = Z.prototype; + dom.selector = selector || ''; + return dom; + } + + function $(selector, context){ + if (!selector) return Z(); + if (context !== undefined) return $(context).find(selector); + else if (isF(selector)) return $(document).ready(selector); + else if (selector instanceof Z) return selector; + else { + var dom; + if (isA(selector)) dom = compact(selector); + else if (elementTypes.indexOf(selector.nodeType) >= 0 || selector === window) + dom = [selector], selector = null; + else if (fragmentRE.test(selector)) + dom = fragment(selector, RegExp.$1), selector = null; + else if (selector.nodeType && selector.nodeType == 3) dom = [selector]; + else dom = $$(document, selector); + return Z(dom, selector); + } + } + + $.extend = function(target){ + slice.call(arguments, 1).forEach(function(source) { + for (key in source) target[key] = source[key]; + }) + return target; + } + $.qsa = $$ = function(element, selector){ return slice.call(element.querySelectorAll(selector)) } + + function filtered(nodes, selector){ + return selector === undefined ? $(nodes) : $(nodes).filter(selector); + } + + function funcArg(context, arg, idx, payload){ + return isF(arg) ? arg.call(context, idx, payload) : arg; + } + + $.isFunction = isF; + $.isObject = isO; + $.isArray = isA; + + $.map = function(elements, callback) { + var value, values = [], i, key; + if (likeArray(elements)) + for (i = 0; i < elements.length; i++) { + value = callback(elements[i], i); + if (value != null) values.push(value); + } + else + for (key in elements) { + value = callback(elements[key], key); + if (value != null) values.push(value); + } + return flatten(values); + } + + $.each = function(elements, callback) { + var i, key; + if (likeArray(elements)) + for(i = 0; i < elements.length; i++) { + if(callback(i, elements[i]) === false) return elements; + } + else + for(key in elements) { + if(callback(key, elements[key]) === false) return elements; + } + return elements; + } + + $.fn = { + forEach: emptyArray.forEach, + reduce: emptyArray.reduce, + push: emptyArray.push, + indexOf: emptyArray.indexOf, + concat: emptyArray.concat, + map: function(fn){ + return $.map(this, function(el, i){ return fn.call(el, i, el) }); + }, + slice: function(){ + return $(slice.apply(this, arguments)); + }, + ready: function(callback){ + if (document.readyState == 'complete' || document.readyState == 'loaded') callback(); + document.addEventListener('DOMContentLoaded', callback, false); + return this; + }, + get: function(idx){ return idx === undefined ? this : this[idx] }, + size: function(){ return this.length }, + remove: function () { + return this.each(function () { + if (this.parentNode != null) { + this.parentNode.removeChild(this); + } + }); + }, + each: function(callback){ + this.forEach(function(el, idx){ callback.call(el, idx, el) }); + return this; + }, + filter: function(selector){ + return $([].filter.call(this, function(element){ + return $$(element.parentNode, selector).indexOf(element) >= 0; + })); + }, + end: function(){ + return this.prevObject || $(); + }, + add:function(selector,context){ + return $(uniq(this.concat($(selector,context)))); + }, + is: function(selector){ + return this.length > 0 && $(this[0]).filter(selector).length > 0; + }, + not: function(selector){ + var nodes=[]; + if (isF(selector) && selector.call !== undefined) + this.each(function(idx){ + if (!selector.call(this,idx)) nodes.push(this); + }); + else { + var excludes = typeof selector == 'string' ? this.filter(selector) : + (likeArray(selector) && isF(selector.item)) ? slice.call(selector) : $(selector); + this.forEach(function(el){ + if (excludes.indexOf(el) < 0) nodes.push(el); + }); + } + return $(nodes); + }, + eq: function(idx){ + return idx === -1 ? this.slice(idx) : this.slice(idx, + idx + 1); + }, + first: function(){ return $(this[0]) }, + last: function(){ return $(this[this.length - 1]) }, + find: function(selector){ + var result; + if (this.length == 1) result = $$(this[0], selector); + else result = this.map(function(){ return $$(this, selector) }); + return $(result); + }, + closest: function(selector, context){ + var node = this[0], nodes = $$(context !== undefined ? context : document, selector); + if (nodes.length === 0) node = null; + while(node && node !== document && nodes.indexOf(node) < 0) node = node.parentNode; + return $(node !== document && node); + }, + parents: function(selector){ + var ancestors = [], nodes = this; + while (nodes.length > 0) + nodes = $.map(nodes, function(node){ + if ((node = node.parentNode) && node !== document && ancestors.indexOf(node) < 0) { + ancestors.push(node); + return node; + } + }); + return filtered(ancestors, selector); + }, + parent: function(selector){ + return filtered(uniq(this.pluck('parentNode')), selector); + }, + children: function(selector){ + return filtered(this.map(function(){ return slice.call(this.children) }), selector); + }, + siblings: function(selector){ + return filtered(this.map(function(i, el){ + return slice.call(el.parentNode.children).filter(function(child){ return child!==el }); + }), selector); + }, + empty: function(){ return this.each(function(){ this.innerHTML = '' }) }, + pluck: function(property){ return this.map(function(){ return this[property] }) }, + show: function(){ + return this.each(function() { + this.style.display == "none" && (this.style.display = null); + if (getComputedStyle(this, '').getPropertyValue("display") == "none") { + this.style.display = defaultDisplay(this.nodeName) + } + }) + }, + replaceWith: function(newContent) { + return this.each(function() { + var par=this.parentNode,next=this.nextSibling; + $(this).remove(); + next ? $(next).before(newContent) : $(par).append(newContent); + }); + }, + wrap: function(newContent) { + return this.each(function() { + $(this).wrapAll($(newContent)[0].cloneNode(false)); + }); + }, + wrapAll: function(newContent) { + if (this[0]) { + $(this[0]).before(newContent = $(newContent)); + newContent.append(this); + } + return this; + }, + unwrap: function(){ + this.parent().each(function(){ + $(this).replaceWith($(this).children()); + }); + return this; + }, + hide: function(){ + return this.css("display", "none") + }, + toggle: function(setting){ + return (setting === undefined ? this.css("display") == "none" : setting) ? this.show() : this.hide(); + }, + prev: function(){ return $(this.pluck('previousElementSibling')) }, + next: function(){ return $(this.pluck('nextElementSibling')) }, + html: function(html){ + return html === undefined ? + (this.length > 0 ? this[0].innerHTML : null) : + this.each(function (idx) { + var originHtml = this.innerHTML; + $(this).empty().append( funcArg(this, html, idx, originHtml) ); + }); + }, + text: function(text){ + return text === undefined ? + (this.length > 0 ? this[0].textContent : null) : + this.each(function(){ this.textContent = text }); + }, + attr: function(name, value){ + return (typeof name == 'string' && value === undefined) ? + (this.length > 0 && this[0].nodeName == 'INPUT' && this[0].type == 'text' && name == 'value') ? (this.val()) : + (this.length > 0 ? this[0].getAttribute(name) || (name in this[0] ? this[0][name] : undefined) : undefined) : + this.each(function(idx){ + if (isO(name)) for (key in name) this.setAttribute(key, name[key]) + else this.setAttribute(name, funcArg(this, value, idx, this.getAttribute(name))); + }); + }, + removeAttr: function(name) { + return this.each(function() { this.removeAttribute(name); }); + }, + data: function(name, value){ + return this.attr('data-' + name, value); + }, + val: function(value){ + return (value === undefined) ? + (this.length > 0 ? this[0].value : null) : + this.each(function(){ + this.value = value; + }); + }, + offset: function(){ + if(this.length==0) return null; + var obj = this[0].getBoundingClientRect(); + return { + left: obj.left + document.body.scrollLeft, + top: obj.top + document.body.scrollTop, + width: obj.width, + height: obj.height + }; + }, + css: function(property, value){ + if (value === undefined && typeof property == 'string') + return this[0].style[camelize(property)] || getComputedStyle(this[0], '').getPropertyValue(property); + var css = ''; + for (key in property) css += dasherize(key) + ':' + maybeAddPx(key, property[key]) + ';'; + if (typeof property == 'string') css = dasherize(property) + ":" + maybeAddPx(property, value); + return this.each(function() { this.style.cssText += ';' + css }); + }, + index: function(element){ + return element ? this.indexOf($(element)[0]) : this.parent().children().indexOf(this[0]); + }, + hasClass: function(name){ + if (this.length < 1) return false; + else return classRE(name).test(this[0].className); + }, + addClass: function(name){ + return this.each(function(idx) { + classList = []; + var cls = this.className, newName = funcArg(this, name, idx, cls); + newName.split(/\s+/g).forEach(function(klass) { + if (!$(this).hasClass(klass)) { + classList.push(klass) + } + }, this); + classList.length && (this.className += (cls ? " " : "") + classList.join(" ")) + }); + }, + removeClass: function(name){ + return this.each(function(idx) { + if(name === undefined) + return this.className = ''; + classList = this.className; + funcArg(this, name, idx, classList).split(/\s+/g).forEach(function(klass) { + classList = classList.replace(classRE(klass), " ") + }); + this.className = classList.trim() + }); + }, + toggleClass: function(name, when){ + return this.each(function(idx){ + var cls = this.className, newName = funcArg(this, name, idx, cls); + ((when !== undefined && !when) || $(this).hasClass(newName)) ? + $(this).removeClass(newName) : $(this).addClass(newName) + }); + } + }; + + 'filter,add,not,eq,first,last,find,closest,parents,parent,children,siblings'.split(',').forEach(function(property){ + var fn = $.fn[property]; + $.fn[property] = function() { + var ret = fn.apply(this, arguments); + ret.prevObject = this; + return ret; + } + }); + + ['width', 'height'].forEach(function(property){ + $.fn[property] = function(value) { + var offset; + if (value === undefined) { return (offset = this.offset()) && offset[property] } + else return this.css(property, value); + } + }); + + function insert(operator, target, node) { + var parent = (!operator || operator == 3) ? target : target.parentNode; + parent.insertBefore(node, + !operator ? parent.firstChild : // prepend + operator == 1 ? target.nextSibling : // after + operator == 2 ? target : // before + null); // append + } + + function traverseNode (node, fun) { + fun(node); + for (key in node.childNodes) { + traverseNode(node.childNodes[key], fun); + } + } + + adjacencyOperators.forEach(function(key, operator) { + $.fn[key] = function(html){ + var nodes = typeof(html) == 'object' ? html : fragment(html); + if (!('length' in nodes)) nodes = [nodes]; + if (nodes.length < 1) return this; + var size = this.length, copyByClone = size > 1, inReverse = operator < 2; + + return this.each(function(index, target){ + for (var i = 0; i < nodes.length; i++) { + var node = nodes[inReverse ? nodes.length-i-1 : i]; + traverseNode(node, function (node) { + if (node.nodeName != null && node.nodeName.toUpperCase() === 'SCRIPT') { + window['eval'].call(window, node.innerHTML); + } + }); + if (copyByClone && index < size - 1) node = node.cloneNode(true); + insert(operator, target, node); + } + }); + }; + }); + + reverseAdjacencyOperators.forEach(function(key) { + $.fn[key+'To'] = function(html){ + if (typeof(html) != 'object') html = $(html); + html[key](this); + return this; + }; + }); + + Z.prototype = $.fn; + + return $; +})(); + +'$' in window || (window.$ = Zepto); +// Zepto.js +// (c) 2010, 2011 Thomas Fuchs +// Zepto.js may be freely distributed under the MIT license. + +(function($){ + var $$ = $.qsa, handlers = {}, _zid = 1; + function zid(element) { + return element._zid || (element._zid = _zid++); + } + function findHandlers(element, event, fn, selector) { + event = parse(event); + if (event.ns) var matcher = matcherFor(event.ns); + return (handlers[zid(element)] || []).filter(function(handler) { + return handler + && (!event.e || handler.e == event.e) + && (!event.ns || matcher.test(handler.ns)) + && (!fn || handler.fn == fn) + && (!selector || handler.sel == selector); + }); + } + function parse(event) { + var parts = ('' + event).split('.'); + return {e: parts[0], ns: parts.slice(1).sort().join(' ')}; + } + function matcherFor(ns) { + return new RegExp('(?:^| )' + ns.replace(' ', ' .* ?') + '(?: |$)'); + } + + function add(element, events, fn, selector, delegate){ + var id = zid(element), set = (handlers[id] || (handlers[id] = [])); + events.split(/\s/).forEach(function(event){ + var callback = delegate || fn; + var proxyfn = function (event) { + var result = callback.apply(element, [event].concat(event.data)); + if (result === false) { + event.preventDefault(); + } + return result; + }; + var handler = $.extend(parse(event), {fn: fn, proxy: proxyfn, sel: selector, del: delegate, i: set.length}); + set.push(handler); + element.addEventListener(handler.e, proxyfn, false); + }); + } + function remove(element, events, fn, selector){ + var id = zid(element); + (events || '').split(/\s/).forEach(function(event){ + findHandlers(element, event, fn, selector).forEach(function(handler){ + delete handlers[id][handler.i]; + element.removeEventListener(handler.e, handler.proxy, false); + }); + }); + } + + $.event = { add: add, remove: remove } + + $.fn.bind = function(event, callback){ + return this.each(function(){ + add(this, event, callback); + }); + }; + $.fn.unbind = function(event, callback){ + return this.each(function(){ + remove(this, event, callback); + }); + }; + $.fn.one = function(event, callback){ + return this.each(function(){ + var self = this; + add(this, event, function wrapper(evt){ + callback.call(self, evt); + remove(self, event, arguments.callee); + }); + }); + }; + + var returnTrue = function(){return true}, + returnFalse = function(){return false}, + eventMethods = { + preventDefault: 'isDefaultPrevented', + stopImmediatePropagation: 'isImmediatePropagationStopped', + stopPropagation: 'isPropagationStopped' + }; + function createProxy(event) { + var proxy = $.extend({originalEvent: event}, event); + $.each(eventMethods, function(name, predicate) { + proxy[name] = function(){ + this[predicate] = returnTrue; + return event[name].apply(event, arguments); + }; + proxy[predicate] = returnFalse; + }) + return proxy; + } + + $.fn.delegate = function(selector, event, callback){ + return this.each(function(i, element){ + add(element, event, callback, selector, function(e, data){ + var target = e.target, nodes = $$(element, selector); + while (target && nodes.indexOf(target) < 0) target = target.parentNode; + if (target && !(target === element) && !(target === document)) { + callback.call(target, $.extend(createProxy(e), { + currentTarget: target, liveFired: element + }), data); + } + }); + }); + }; + $.fn.undelegate = function(selector, event, callback){ + return this.each(function(){ + remove(this, event, callback, selector); + }); + } + + $.fn.live = function(event, callback){ + $(document.body).delegate(this.selector, event, callback); + return this; + }; + $.fn.die = function(event, callback){ + $(document.body).undelegate(this.selector, event, callback); + return this; + }; + + $.fn.trigger = function(event, data){ + if (typeof event == 'string') event = $.Event(event); + event.data = data; + return this.each(function(){ this.dispatchEvent(event) }); + }; + + // triggers event handlers on current element just as if an event occurred, + // doesn't trigger an actual event, doesn't bubble + $.fn.triggerHandler = function(event, data){ + var e, result; + this.each(function(i, element){ + e = createProxy(typeof event == 'string' ? $.Event(event) : event); + e.data = data; e.target = element; + $.each(findHandlers(element, event.type || event), function(i, handler){ + result = handler.proxy(e); + if (e.isImmediatePropagationStopped()) return false; + }); + }); + return result; + }; + + // shortcut methods for `.bind(event, fn)` for each event type + ('focusin focusout load resize scroll unload click dblclick '+ + 'mousedown mouseup mousemove mouseover mouseout '+ + 'change select keydown keypress keyup error').split(' ').forEach(function(event) { + $.fn[event] = function(callback){ return this.bind(event, callback) }; + }); + + ['focus', 'blur'].forEach(function(name) { + $.fn[name] = function(callback) { + if (callback) this.bind(name, callback); + else if (this.length) try { this.get(0)[name]() } catch(e){}; + return this; + }; + }); + + $.Event = function(type, props) { + var event = document.createEvent('Events'); + if (props) $.extend(event, props); + event.initEvent(type, !(props && props.bubbles === false), true); + return event; + }; + +})(Zepto); +// Zepto.js +// (c) 2010, 2011 Thomas Fuchs +// Zepto.js may be freely distributed under the MIT license. + +(function($){ + function detect(ua){ + var ua = ua, os = {}, + android = ua.match(/(Android)\s+([\d.]+)/), + ipad = ua.match(/(iPad).*OS\s([\d_]+)/), + iphone = !ipad && ua.match(/(iPhone\sOS)\s([\d_]+)/), + webos = ua.match(/(webOS|hpwOS)[\s\/]([\d.]+)/), + touchpad = webos && ua.match(/TouchPad/), + blackberry = ua.match(/(BlackBerry).*Version\/([\d.]+)/); + if (android) os.android = true, os.version = android[2]; + if (iphone) os.ios = true, os.version = iphone[2].replace(/_/g, '.'), os.iphone = true; + if (ipad) os.ios = true, os.version = ipad[2].replace(/_/g, '.'), os.ipad = true; + if (webos) os.webos = true, os.version = webos[2]; + if (touchpad) os.touchpad = true; + if (blackberry) os.blackberry = true, os.version = blackberry[2]; + return os; + } + + // ### $.os + // + // Object contains information about running environmental + // + // *Example:* + // + // $.os.ios // => true if running on Apple iOS + // $.os.android // => true if running on Android + // $.os.webos // => true if running on HP/Palm WebOS + // $.os.touchpad // => true if running on a HP TouchPad + // $.os.version // => string with version number, + // "4.0", "3.1.1", "2.1", etc. + // $.os.iphone // => true if running on iPhone + // $.os.ipad // => true if running on iPad + // $.os.blackberry // => true if running on BlackBerry + // + $.os = detect(navigator.userAgent); + $.__detect = detect; + + var v = navigator.userAgent.match(/WebKit\/([\d.]+)/); + $.browser = v ? { webkit: true, version: v[1] } : { webkit: false }; + +})(Zepto); +// Zepto.js +// (c) 2010, 2011 Thomas Fuchs +// Zepto.js may be freely distributed under the MIT license. + +(function($, undefined){ + var supportedTransforms = [ + 'scale', 'scaleX', 'scaleY', + 'translate', 'translateX', 'translateY', 'translate3d', + 'skew', 'skewX', 'skewY', + 'rotate', 'rotateX', 'rotateY', 'rotateZ', 'rotate3d', + 'matrix' + ]; + + $.fn.anim = function(properties, duration, ease, callback){ + var transforms = [], cssProperties = {}, key, that = this, wrappedCallback; + + for (key in properties) + if (supportedTransforms.indexOf(key)>=0) + transforms.push(key + '(' + properties[key] + ')'); + else + cssProperties[key] = properties[key]; + + wrappedCallback = function(){ + that.css({'-webkit-transition':'none'}); + callback && callback(); + } + + if (duration > 0) + this.one('webkitTransitionEnd', wrappedCallback); + else + setTimeout(wrappedCallback, 0); + + if (transforms.length > 0) { + cssProperties['-webkit-transform'] = transforms.join(' ') + } + + cssProperties['-webkit-transition'] = 'all ' + (duration !== undefined ? duration : 0.5) + 's ' + (ease || ''); + + setTimeout(function () { + that.css(cssProperties); + }, 0); + + return this; + } +})(Zepto); +// Zepto.js +// (c) 2010, 2011 Thomas Fuchs +// Zepto.js may be freely distributed under the MIT license. + +(function($){ + var jsonpID = 0, + isObject = $.isObject, + key; + + // Empty function, used as default callback + function empty() {} + + // ### $.ajaxJSONP + // + // Load JSON from a server in a different domain (JSONP) + // + // *Arguments:* + // + // options — object that configure the request, + // see avaliable options below + // + // *Avaliable options:* + // + // url — url to which the request is sent + // success — callback that is executed if the request succeeds + // + // *Example:* + // + // $.ajaxJSONP({ + // url: 'http://example.com/projects?callback=?', + // success: function (data) { + // projects.push(json); + // } + // }); + // + $.ajaxJSONP = function(options){ + var jsonpString = 'jsonp' + ++jsonpID, + script = document.createElement('script'); + window[jsonpString] = function(data){ + options.success(data); + delete window[jsonpString]; + }; + script.src = options.url.replace(/=\?/, '=' + jsonpString); + $('head').append(script); + }; + + // ### $.ajaxSettings + // + // AJAX settings + // + $.ajaxSettings = { + // Default type of request + type: 'GET', + // Callback that is executed before request + beforeSend: empty, + // Callback that is executed if the request succeeds + success: empty, + // Callback that is executed the the server drops error + error: empty, + // Callback that is executed on request complete (both: error and success) + complete: empty, + // MIME types mapping + accepts: { + script: 'text/javascript, application/javascript', + json: 'application/json', + xml: 'application/xml, text/xml', + html: 'text/html', + text: 'text/plain' + } + }; + + // ### $.ajax + // + // Perform AJAX request + // + // *Arguments:* + // + // options — object that configure the request, + // see avaliable options below + // + // *Avaliable options:* + // + // type ('GET') — type of request GET / POST + // url (window.location) — url to which the request is sent + // data — data to send to server, + // can be string or object + // dataType ('json') — what response type you accept from + // the server: + // 'json', 'xml', 'html', or 'text' + // success — callback that is executed if + // the request succeeds + // error — callback that is executed if + // the server drops error + // + // *Example:* + // + // $.ajax({ + // type: 'POST', + // url: '/projects', + // data: { name: 'Zepto.js' }, + // dataType: 'html', + // success: function (data) { + // $('body').append(data); + // }, + // error: function (xhr, type) { + // alert('Error!'); + // } + // }); + // + $.ajax = function(options){ + options = options || {}; + var settings = $.extend({}, options); + for (key in $.ajaxSettings) if (!settings[key]) settings[key] = $.ajaxSettings[key]; + + if (/=\?/.test(settings.url)) return $.ajaxJSONP(settings); + + if (!settings.url) settings.url = window.location.toString(); + if (settings.data && !settings.contentType) settings.contentType = 'application/x-www-form-urlencoded'; + if (isObject(settings.data)) settings.data = $.param(settings.data); + + if (settings.type.match(/get/i) && settings.data) { + var queryString = settings.data; + if (settings.url.match(/\?.*=/)) { + queryString = '&' + queryString; + } else if (queryString[0] != '?') { + queryString = '?' + queryString; + } + settings.url += queryString; + } + + var mime = settings.accepts[settings.dataType], + xhr = new XMLHttpRequest(); + + settings.headers = $.extend({'X-Requested-With': 'XMLHttpRequest'}, settings.headers || {}); + if (mime) settings.headers['Accept'] = mime; + + xhr.onreadystatechange = function(){ + if (xhr.readyState == 4) { + var result, error = false; + if ((xhr.status >= 200 && xhr.status < 300) || xhr.status == 0) { + if (mime == 'application/json' && !(xhr.responseText == '')) { + try { result = JSON.parse(xhr.responseText); } + catch (e) { error = e; } + } + else result = xhr.responseText; + if (error) settings.error(xhr, 'parsererror', error); + else settings.success(result, 'success', xhr); + } else { + error = true; + settings.error(xhr, 'error'); + } + settings.complete(xhr, error ? 'error' : 'success'); + } + }; + + xhr.open(settings.type, settings.url, true); + if (settings.beforeSend(xhr, settings) === false) { + xhr.abort(); + return false; + } + + if (settings.contentType) settings.headers['Content-Type'] = settings.contentType; + for (name in settings.headers) xhr.setRequestHeader(name, settings.headers[name]); + xhr.send(settings.data); + + return xhr; + }; + + // ### $.get + // + // Load data from the server using a GET request + // + // *Arguments:* + // + // url — url to which the request is sent + // success — callback that is executed if the request succeeds + // + // *Example:* + // + // $.get( + // '/projects/42', + // function (data) { + // $('body').append(data); + // } + // ); + // + $.get = function(url, success){ $.ajax({ url: url, success: success }) }; + + // ### $.post + // + // Load data from the server using POST request + // + // *Arguments:* + // + // url — url to which the request is sent + // [data] — data to send to server, can be string or object + // [success] — callback that is executed if the request succeeds + // [dataType] — type of expected response + // 'json', 'xml', 'html', or 'text' + // + // *Example:* + // + // $.post( + // '/projects', + // { name: 'Zepto.js' }, + // function (data) { + // $('body').append(data); + // }, + // 'html' + // ); + // + $.post = function(url, data, success, dataType){ + if ($.isFunction(data)) dataType = dataType || success, success = data, data = null; + $.ajax({ type: 'POST', url: url, data: data, success: success, dataType: dataType }); + }; + + // ### $.getJSON + // + // Load JSON from the server using GET request + // + // *Arguments:* + // + // url — url to which the request is sent + // success — callback that is executed if the request succeeds + // + // *Example:* + // + // $.getJSON( + // '/projects/42', + // function (json) { + // projects.push(json); + // } + // ); + // + $.getJSON = function(url, success){ $.ajax({ url: url, success: success, dataType: 'json' }) }; + + // ### $.fn.load + // + // Load data from the server into an element + // + // *Arguments:* + // + // url — url to which the request is sent + // [success] — callback that is executed if the request succeeds + // + // *Examples:* + // + // $('#project_container').get( + // '/projects/42', + // function () { + // alert('Project was successfully loaded'); + // } + // ); + // + // $('#project_comments').get( + // '/projects/42 #comments', + // function () { + // alert('Comments was successfully loaded'); + // } + // ); + // + $.fn.load = function(url, success){ + if (!this.length) return this; + var self = this, parts = url.split(/\s/), selector; + if (parts.length > 1) url = parts[0], selector = parts[1]; + $.get(url, function(response){ + self.html(selector ? + $(document.createElement('div')).html(response).find(selector).html() + : response); + success && success(); + }); + return this; + }; + + // ### $.param + // + // Encode object as a string for submission + // + // *Arguments:* + // + // obj — object to serialize + // [v] — root node + // + // *Example:* + // + // $.param( { name: 'Zepto.js', version: '0.6' } ); + // + $.param = function(obj, v){ + var result = [], add = function(key, value){ + result.push(encodeURIComponent(v ? v + '[' + key + ']' : key) + + '=' + encodeURIComponent(value)); + }, + isObjArray = $.isArray(obj); + + for(key in obj) + if(isObject(obj[key])) + result.push($.param(obj[key], (v ? v + '[' + key + ']' : key))); + else + add(isObjArray ? '' : key, obj[key]); + + return result.join('&').replace('%20', '+'); + }; +})(Zepto); +// Zepto.js +// (c) 2010, 2011 Thomas Fuchs +// Zepto.js may be freely distributed under the MIT license. + +(function ($) { + + // ### $.fn.serializeArray + // + // Encode a set of form elements as an array of names and values + // + // *Example:* + // + // $('#login_form').serializeArray(); + // + // returns + // + // [ + // { + // name: 'email', + // value: 'koss@nocorp.me' + // }, + // { + // name: 'password', + // value: '123456' + // } + // ] + // + $.fn.serializeArray = function () { + var result = [], el; + $( Array.prototype.slice.call(this.get(0).elements) ).each(function () { + el = $(this); + if ( (el.attr('type') !== 'radio' || el.is(':checked')) && !(el.attr('type') === 'checkbox' && !el.is(':checked'))) { + result.push({ + name: el.attr('name'), + value: el.val() + }); + } + }); + return result; + }; + + // ### $.fn.serialize + // + // + // Encode a set of form elements as a string for submission + // + // *Example:* + // + // $('#login_form').serialize(); + // + // returns + // + // "email=koss%40nocorp.me&password=123456" + // + $.fn.serialize = function () { + var result = []; + this.serializeArray().forEach(function (elm) { + result.push( encodeURIComponent(elm.name) + '=' + encodeURIComponent(elm.value) ); + }); + return result.join('&'); + }; + + // ### $.fn.submit + // + // Bind or trigger the submit event for a form + // + // *Examples:* + // + // To bind a handler for the submit event: + // + // $('#login_form').submit(function (e) { + // alert('Form was submitted!'); + // e.preventDefault(); + // }); + // + // To trigger form submit: + // + // $('#login_form').submit(); + // + $.fn.submit = function (callback) { + if (callback) this.bind('submit', callback) + else if (this.length) { + var event = $.Event('submit'); + this.eq(0).trigger(event); + if (!event.defaultPrevented) this.get(0).submit() + } + return this; + } + +})(Zepto); +// Zepto.js +// (c) 2010, 2011 Thomas Fuchs +// Zepto.js may be freely distributed under the MIT license. + +(function($){ + var touch = {}, touchTimeout; + + function parentIfText(node){ + return 'tagName' in node ? node : node.parentNode; + } + + function swipeDirection(x1, x2, y1, y2){ + var xDelta = Math.abs(x1 - x2), yDelta = Math.abs(y1 - y2); + if (xDelta >= yDelta) { + return (x1 - x2 > 0 ? 'Left' : 'Right'); + } else { + return (y1 - y2 > 0 ? 'Up' : 'Down'); + } + } + + var longTapDelay = 750; + function longTap(){ + if (touch.last && (Date.now() - touch.last >= longTapDelay)) { + $(touch.target).trigger('longTap'); + touch = {}; + } + } + + $(document).ready(function(){ + $(document.body).bind('touchstart', function(e){ + var now = Date.now(), delta = now - (touch.last || now); + touch.target = parentIfText(e.touches[0].target); + touchTimeout && clearTimeout(touchTimeout); + touch.x1 = e.touches[0].pageX; + touch.y1 = e.touches[0].pageY; + if (delta > 0 && delta <= 250) touch.isDoubleTap = true; + touch.last = now; + setTimeout(longTap, longTapDelay); + }).bind('touchmove', function(e){ + touch.x2 = e.touches[0].pageX; + touch.y2 = e.touches[0].pageY; + }).bind('touchend', function(e){ + if (touch.isDoubleTap) { + $(touch.target).trigger('doubleTap'); + touch = {}; + } else if (touch.x2 > 0 || touch.y2 > 0) { + (Math.abs(touch.x1 - touch.x2) > 30 || Math.abs(touch.y1 - touch.y2) > 30) && + $(touch.target).trigger('swipe') && + $(touch.target).trigger('swipe' + (swipeDirection(touch.x1, touch.x2, touch.y1, touch.y2))); + touch.x1 = touch.x2 = touch.y1 = touch.y2 = touch.last = 0; + } else if ('last' in touch) { + touchTimeout = setTimeout(function(){ + touchTimeout = null; + $(touch.target).trigger('tap') + touch = {}; + }, 250); + } + }).bind('touchcancel', function(){ touch = {} }); + }); + + ['swipe', 'swipeLeft', 'swipeRight', 'swipeUp', 'swipeDown', 'doubleTap', 'tap', 'longTap'].forEach(function(m){ + $.fn[m] = function(callback){ return this.bind(m, callback) } + }); +})(Zepto); diff --git a/js/libraries/jquery.history.js b/js/libraries/jquery.history.js new file mode 100755 index 00000000..8d4edcd2 --- /dev/null +++ b/js/libraries/jquery.history.js @@ -0,0 +1 @@ +window.JSON||(window.JSON={}),function(){function f(a){return a<10?"0"+a:a}function quote(a){return escapable.lastIndex=0,escapable.test(a)?'"'+a.replace(escapable,function(a){var b=meta[a];return typeof b=="string"?b:"\\u"+("0000"+a.charCodeAt(0).toString(16)).slice(-4)})+'"':'"'+a+'"'}function str(a,b){var c,d,e,f,g=gap,h,i=b[a];i&&typeof i=="object"&&typeof i.toJSON=="function"&&(i=i.toJSON(a)),typeof rep=="function"&&(i=rep.call(b,a,i));switch(typeof i){case"string":return quote(i);case"number":return isFinite(i)?String(i):"null";case"boolean":case"null":return String(i);case"object":if(!i)return"null";gap+=indent,h=[];if(Object.prototype.toString.apply(i)==="[object Array]"){f=i.length;for(c=0;c")&&c[0]);return a>4?a:!1}();return a},m.isInternetExplorer=function(){var a=m.isInternetExplorer.cached=typeof m.isInternetExplorer.cached!="undefined"?m.isInternetExplorer.cached:Boolean(m.getInternetExplorerMajorVersion());return a},m.emulated={pushState:!Boolean(a.history&&a.history.pushState&&a.history.replaceState&&!/ Mobile\/([1-7][a-z]|(8([abcde]|f(1[0-8]))))/i.test(e.userAgent)&&!/AppleWebKit\/5([0-2]|3[0-2])/i.test(e.userAgent)),hashChange:Boolean(!("onhashchange"in a||"onhashchange"in d)||m.isInternetExplorer()&&m.getInternetExplorerMajorVersion()<8)},m.enabled=!m.emulated.pushState,m.bugs={setHash:Boolean(!m.emulated.pushState&&e.vendor==="Apple Computer, Inc."&&/AppleWebKit\/5([0-2]|3[0-3])/.test(e.userAgent)),safariPoll:Boolean(!m.emulated.pushState&&e.vendor==="Apple Computer, Inc."&&/AppleWebKit\/5([0-2]|3[0-3])/.test(e.userAgent)),ieDoubleCheck:Boolean(m.isInternetExplorer()&&m.getInternetExplorerMajorVersion()<8),hashEscape:Boolean(m.isInternetExplorer()&&m.getInternetExplorerMajorVersion()<7)},m.isEmptyObject=function(a){for(var b in a)return!1;return!0},m.cloneObject=function(a){var b,c;return a?(b=k.stringify(a),c=k.parse(b)):c={},c},m.getRootUrl=function(){var a=d.location.protocol+"//"+(d.location.hostname||d.location.host);if(d.location.port||!1)a+=":"+d.location.port;return a+="/",a},m.getBaseHref=function(){var a=d.getElementsByTagName("base"),b=null,c="";return a.length===1&&(b=a[0],c=b.href.replace(/[^\/]+$/,"")),c=c.replace(/\/+$/,""),c&&(c+="/"),c},m.getBaseUrl=function(){var a=m.getBaseHref()||m.getBasePageUrl()||m.getRootUrl();return a},m.getPageUrl=function(){var a=m.getState(!1,!1),b=(a||{}).url||d.location.href,c;return c=b.replace(/\/+$/,"").replace(/[^\/]+$/,function(a,b,c){return/\./.test(a)?a:a+"/"}),c},m.getBasePageUrl=function(){var a=d.location.href.replace(/[#\?].*/,"").replace(/[^\/]+$/,function(a,b,c){return/[^\/]$/.test(a)?"":a}).replace(/\/+$/,"")+"/";return a},m.getFullUrl=function(a,b){var c=a,d=a.substring(0,1);return b=typeof b=="undefined"?!0:b,/[a-z]+\:\/\//.test(a)||(d==="/"?c=m.getRootUrl()+a.replace(/^\/+/,""):d==="#"?c=m.getPageUrl().replace(/#.*/,"")+a:d==="?"?c=m.getPageUrl().replace(/[\?#].*/,"")+a:b?c=m.getBaseUrl()+a.replace(/^(\.\/)+/,""):c=m.getBasePageUrl()+a.replace(/^(\.\/)+/,"")),c.replace(/\#$/,"")},m.getShortUrl=function(a){var b=a,c=m.getBaseUrl(),d=m.getRootUrl();return m.emulated.pushState&&(b=b.replace(c,"")),b=b.replace(d,"/"),m.isTraditionalAnchor(b)&&(b="./"+b),b=b.replace(/^(\.\/)+/g,"./").replace(/\#$/,""),b},m.store={},m.idToState=m.idToState||{},m.stateToId=m.stateToId||{},m.urlToId=m.urlToId||{},m.storedStates=m.storedStates||[],m.savedStates=m.savedStates||[],m.normalizeStore=function(){m.store.idToState=m.store.idToState||{},m.store.urlToId=m.store.urlToId||{},m.store.stateToId=m.store.stateToId||{}},m.getState=function(a,b){typeof a=="undefined"&&(a=!0),typeof b=="undefined"&&(b=!0);var c=m.getLastSavedState();return!c&&b&&(c=m.createStateObject()),a&&(c=m.cloneObject(c),c.url=c.cleanUrl||c.url),c},m.getIdByState=function(a){var b=m.extractId(a.url),c;if(!b){c=m.getStateString(a);if(typeof m.stateToId[c]!="undefined")b=m.stateToId[c];else if(typeof m.store.stateToId[c]!="undefined")b=m.store.stateToId[c];else{for(;;){b=(new Date).getTime()+String(Math.random()).replace(/\D/g,"");if(typeof m.idToState[b]=="undefined"&&typeof m.store.idToState[b]=="undefined")break}m.stateToId[c]=b,m.idToState[b]=a}}return b},m.normalizeState=function(a){var b,c;if(!a||typeof a!="object")a={};if(typeof a.normalized!="undefined")return a;if(!a.data||typeof a.data!="object")a.data={};b={},b.normalized=!0,b.title=a.title||"",b.url=m.getFullUrl(m.unescapeString(a.url||d.location.href)),b.hash=m.getShortUrl(b.url),b.data=m.cloneObject(a.data),b.id=m.getIdByState(b),b.cleanUrl=b.url.replace(/\??\&_suid.*/,""),b.url=b.cleanUrl,c=!m.isEmptyObject(b.data);if(b.title||c)b.hash=m.getShortUrl(b.url).replace(/\??\&_suid.*/,""),/\?/.test(b.hash)||(b.hash+="?"),b.hash+="&_suid="+b.id;return b.hashedUrl=m.getFullUrl(b.hash),(m.emulated.pushState||m.bugs.safariPoll)&&m.hasUrlDuplicate(b)&&(b.url=b.hashedUrl),b},m.createStateObject=function(a,b,c){var d={data:a,title:b,url:c};return d=m.normalizeState(d),d},m.getStateById=function(a){a=String(a);var c=m.idToState[a]||m.store.idToState[a]||b;return c},m.getStateString=function(a){var b,c,d;return b=m.normalizeState(a),c={data:b.data,title:a.title,url:a.url},d=k.stringify(c),d},m.getStateId=function(a){var b,c;return b=m.normalizeState(a),c=b.id,c},m.getHashByState=function(a){var b,c;return b=m.normalizeState(a),c=b.hash,c},m.extractId=function(a){var b,c,d;return c=/(.*)\&_suid=([0-9]+)$/.exec(a),d=c?c[1]||a:a,b=c?String(c[2]||""):"",b||!1},m.isTraditionalAnchor=function(a){var b=!/[\/\?\.]/.test(a);return b},m.extractState=function(a,b){var c=null,d,e;return b=b||!1,d=m.extractId(a),d&&(c=m.getStateById(d)),c||(e=m.getFullUrl(a),d=m.getIdByUrl(e)||!1,d&&(c=m.getStateById(d)),!c&&b&&!m.isTraditionalAnchor(a)&&(c=m.createStateObject(null,null,e))),c},m.getIdByUrl=function(a){var c=m.urlToId[a]||m.store.urlToId[a]||b;return c},m.getLastSavedState=function(){return m.savedStates[m.savedStates.length-1]||b},m.getLastStoredState=function(){return m.storedStates[m.storedStates.length-1]||b},m.hasUrlDuplicate=function(a){var b=!1,c;return c=m.extractState(a.url),b=c&&c.id!==a.id,b},m.storeState=function(a){return m.urlToId[a.url]=a.id,m.storedStates.push(m.cloneObject(a)),a},m.isLastSavedState=function(a){var b=!1,c,d,e;return m.savedStates.length&&(c=a.id,d=m.getLastSavedState(),e=d.id,b=c===e),b},m.saveState=function(a){return m.isLastSavedState(a)?!1:(m.savedStates.push(m.cloneObject(a)),!0)},m.getStateByIndex=function(a){var b=null;return typeof a=="undefined"?b=m.savedStates[m.savedStates.length-1]:a<0?b=m.savedStates[m.savedStates.length+a]:b=m.savedStates[a],b},m.getHash=function(){var a=m.unescapeHash(d.location.hash);return a},m.unescapeString=function(b){var c=b,d;for(;;){d=a.unescape(c);if(d===c)break;c=d}return c},m.unescapeHash=function(a){var b=m.normalizeHash(a);return b=m.unescapeString(b),b},m.normalizeHash=function(a){var b=a.replace(/[^#]*#/,"").replace(/#.*/,"");return b},m.setHash=function(a,b){var c,e,f;return b!==!1&&m.busy()?(m.pushQueue({scope:m,callback:m.setHash,args:arguments,queue:b}),!1):(c=m.escapeHash(a),m.busy(!0),e=m.extractState(a,!0),e&&!m.emulated.pushState?m.pushState(e.data,e.title,e.url,!1):d.location.hash!==c&&(m.bugs.setHash?(f=m.getPageUrl(),m.pushState(null,null,f+"#"+c,!1)):d.location.hash=c),m)},m.escapeHash=function(b){var c=m.normalizeHash(b);return c=a.escape(c),m.bugs.hashEscape||(c=c.replace(/\%21/g,"!").replace(/\%26/g,"&").replace(/\%3D/g,"=").replace(/\%3F/g,"?")),c},m.getHashByUrl=function(a){var b=String(a).replace(/([^#]*)#?([^#]*)#?(.*)/,"$2");return b=m.unescapeHash(b),b},m.setTitle=function(a){var b=a.title,c;b||(c=m.getStateByIndex(0),c&&c.url===a.url&&(b=c.title||m.options.initialTitle));try{d.getElementsByTagName("title")[0].innerHTML=b.replace("<","<").replace(">",">").replace(" & "," & ")}catch(e){}return d.title=b,m},m.queues=[],m.busy=function(a){typeof a!="undefined"?m.busy.flag=a:typeof m.busy.flag=="undefined"&&(m.busy.flag=!1);if(!m.busy.flag){h(m.busy.timeout);var b=function(){var a,c,d;if(m.busy.flag)return;for(a=m.queues.length-1;a>=0;--a){c=m.queues[a];if(c.length===0)continue;d=c.shift(),m.fireQueueItem(d),m.busy.timeout=g(b,m.options.busyDelay)}};m.busy.timeout=g(b,m.options.busyDelay)}return m.busy.flag},m.busy.flag=!1,m.fireQueueItem=function(a){return a.callback.apply(a.scope||m,a.args||[])},m.pushQueue=function(a){return m.queues[a.queue||0]=m.queues[a.queue||0]||[],m.queues[a.queue||0].push(a),m},m.queue=function(a,b){return typeof a=="function"&&(a={callback:a}),typeof b!="undefined"&&(a.queue=b),m.busy()?m.pushQueue(a):m.fireQueueItem(a),m},m.clearQueue=function(){return m.busy.flag=!1,m.queues=[],m},m.stateChanged=!1,m.doubleChecker=!1,m.doubleCheckComplete=function(){return m.stateChanged=!0,m.doubleCheckClear(),m},m.doubleCheckClear=function(){return m.doubleChecker&&(h(m.doubleChecker),m.doubleChecker=!1),m},m.doubleCheck=function(a){return m.stateChanged=!1,m.doubleCheckClear(),m.bugs.ieDoubleCheck&&(m.doubleChecker=g(function(){return m.doubleCheckClear(),m.stateChanged||a(),!0},m.options.doubleCheckInterval)),m},m.safariStatePoll=function(){var b=m.extractState(d.location.href),c;if(!m.isLastSavedState(b))c=b;else return;return c||(c=m.createStateObject()),m.Adapter.trigger(a,"popstate"),m},m.back=function(a){return a!==!1&&m.busy()?(m.pushQueue({scope:m,callback:m.back,args:arguments,queue:a}),!1):(m.busy(!0),m.doubleCheck(function(){m.back(!1)}),n.go(-1),!0)},m.forward=function(a){return a!==!1&&m.busy()?(m.pushQueue({scope:m,callback:m.forward,args:arguments,queue:a}),!1):(m.busy(!0),m.doubleCheck(function(){m.forward(!1)}),n.go(1),!0)},m.go=function(a,b){var c;if(a>0)for(c=1;c<=a;++c)m.forward(b);else{if(!(a<0))throw new Error("History.go: History.go requires a positive or negative integer passed.");for(c=-1;c>=a;--c)m.back(b)}return m};if(m.emulated.pushState){var o=function(){};m.pushState=m.pushState||o,m.replaceState=m.replaceState||o}else m.onPopState=function(b,c){var e=!1,f=!1,g,h;return m.doubleCheckComplete(),g=m.getHash(),g?(h=m.extractState(g||d.location.href,!0),h?m.replaceState(h.data,h.title,h.url,!1):(m.Adapter.trigger(a,"anchorchange"),m.busy(!1)),m.expectedStateId=!1,!1):(e=m.Adapter.extractEventData("state",b,c)||!1,e?f=m.getStateById(e):m.expectedStateId?f=m.getStateById(m.expectedStateId):f=m.extractState(d.location.href),f||(f=m.createStateObject(null,null,d.location.href)),m.expectedStateId=!1,m.isLastSavedState(f)?(m.busy(!1),!1):(m.storeState(f),m.saveState(f),m.setTitle(f),m.Adapter.trigger(a,"statechange"),m.busy(!1),!0))},m.Adapter.bind(a,"popstate",m.onPopState),m.pushState=function(b,c,d,e){if(m.getHashByUrl(d)&&m.emulated.pushState)throw new Error("History.js does not support states with fragement-identifiers (hashes/anchors).");if(e!==!1&&m.busy())return m.pushQueue({scope:m,callback:m.pushState,args:arguments,queue:e}),!1;m.busy(!0);var f=m.createStateObject(b,c,d);return m.isLastSavedState(f)?m.busy(!1):(m.storeState(f),m.expectedStateId=f.id,n.pushState(f.id,f.title,f.url),m.Adapter.trigger(a,"popstate")),!0},m.replaceState=function(b,c,d,e){if(m.getHashByUrl(d)&&m.emulated.pushState)throw new Error("History.js does not support states with fragement-identifiers (hashes/anchors).");if(e!==!1&&m.busy())return m.pushQueue({scope:m,callback:m.replaceState,args:arguments,queue:e}),!1;m.busy(!0);var f=m.createStateObject(b,c,d);return m.isLastSavedState(f)?m.busy(!1):(m.storeState(f),m.expectedStateId=f.id,n.replaceState(f.id,f.title,f.url),m.Adapter.trigger(a,"popstate")),!0};if(f){try{m.store=k.parse(f.getItem("History.store"))||{}}catch(p){m.store={}}m.normalizeStore()}else m.store={},m.normalizeStore();m.Adapter.bind(a,"beforeunload",m.clearAllIntervals),m.Adapter.bind(a,"unload",m.clearAllIntervals),m.saveState(m.storeState(m.extractState(d.location.href,!0))),f&&(m.onUnload=function(){var a,b;try{a=k.parse(f.getItem("History.store"))||{}}catch(c){a={}}a.idToState=a.idToState||{},a.urlToId=a.urlToId||{},a.stateToId=a.stateToId||{};for(b in m.idToState){if(!m.idToState.hasOwnProperty(b))continue;a.idToState[b]=m.idToState[b]}for(b in m.urlToId){if(!m.urlToId.hasOwnProperty(b))continue;a.urlToId[b]=m.urlToId[b]}for(b in m.stateToId){if(!m.stateToId.hasOwnProperty(b))continue;a.stateToId[b]=m.stateToId[b]}m.store=a,m.normalizeStore(),f.setItem("History.store",k.stringify(a))},m.intervalList.push(i(m.onUnload,m.options.storeInterval)),m.Adapter.bind(a,"beforeunload",m.onUnload),m.Adapter.bind(a,"unload",m.onUnload));if(!m.emulated.pushState){m.bugs.safariPoll&&m.intervalList.push(i(m.safariStatePoll,m.options.safariPollInterval));if(e.vendor==="Apple Computer, Inc."||(e.appCodeName||"")==="Mozilla")m.Adapter.bind(a,"hashchange",function(){m.Adapter.trigger(a,"popstate")}),m.getHash()&&m.Adapter.onDomLoad(function(){m.Adapter.trigger(a,"hashchange")})}},m.init()}(window) \ No newline at end of file diff --git a/js/materio_search_api_ajax-ck.js b/js/materio_search_api_ajax-ck.js new file mode 100644 index 00000000..d7ad7af5 --- /dev/null +++ b/js/materio_search_api_ajax-ck.js @@ -0,0 +1,5 @@ +// * date 2011/10/19 * +/** +* misc +*/// ------ TRACE ------ +function trace(e,t){window.console&&window.console.debug&&(arguments.length===2?window.console.debug(e,t):window.console.debug(e))}function Timeout(e,t){var n=setTimeout(e,t);this.cleared=!1;this.clear=function(){this.cleared=!0;clearTimeout(n)}}function HexToRGB(e){if(e.charAt(0)=="#"){var t=e.substring(1,7),n=parseInt(t.substring(0,2),16),r=parseInt(t.substring(2,4),16),i=parseInt(t.substring(4,6),16);return"rgb("+n+", "+r+", "+i+")"}return null}function pair(e){return typeof e=="number"?e%2==0?!0:!1:null}function random(e,t){return arguments.length===1&&typeof e=="number"?Math.random()*e:arguments.length===2&&typeof e==typeof t&&typeof e=="number"?e+Math.random()*(t-e):NaN}function round(e,t){if(arguments.length==1)e=Math.round(e);else{t=t.toString();t=t.replace(/./gi,0);t=t.replace(/^./gi,1);t=parseInt(t);e=Math.round(e*t)/t}return e}function floor(e,t){if(arguments.length==1)e=Math.floor(e);else{t=t.toString();t=t.replace(/./gi,0);t=t.replace(/^./gi,1);t=parseInt(t);e=Math.floor(e*t)/t}return e}function ceil(e,t){if(arguments.length==1)e=Math.ceil(e);else{t=t.toString();t=t.replace(/./gi,0);t=t.replace(/^./gi,1);t=parseInt(t);e=Math.ceil(e*t)/t}return e}function array_subtract(e,t){var n=new Array;for(var r=e.length-1;r>=0;r--)t.contains(e[r])||n.push(e[r]);return n}function objectSize(e){var t=e.length?--e.length:0;for(var n in e)t++;return t}function objectIsEmpty(e){for(var t in e)if(e.hasOwnProperty(t))return!1;return!0}function objectGetKey(e,t){var n=0;for(var r in e){if(r==="length"||!e.hasOwnProperty(r))continue;if(n==t)return r;n++}}function objectSort(e,t){var n=new Array;for(var r=objectSize(e)-1;r>=0;r--){var i=objectGetKey(e,r);for(var s=objectSize(e[i].wit)-1;s>=0;s--){var o=objectGetKey(e[i].wit,s);if(o==t){var u=parseFloat(e[i].wit[o]);n.push({wit:u,nid:i})}}}n.sort(function(e,t){return t.wit-e.wit});var a={};for(var r=n.length-1;r>=0;r--)a[n[r].nid]=e[n[r].nid];return a}function getElementAngle(e,t,n,r){var i=n-e,s=r-t,o=Math.abs(Math.atan(s/i)*180/Math.PI);i>0&&s<0?o=90-o:i>=0&&s>=0?o+=90:i<0&&s>=0?o=180+(90-o):o+=270;return o}String.prototype.trim=function(){return this.replace(/(^\s*)|(\s*$)/gi,"").replace(/[ ]{2,}/gi," ").replace(/\n /,"\n")};var Latinise={};Latinise.latin_map={"Á":"A","Ă":"A","Ắ":"A","Ặ":"A","Ằ":"A","Ẳ":"A","Ẵ":"A","Ǎ":"A","Â":"A","Ấ":"A","Ậ":"A","Ầ":"A","Ẩ":"A","Ẫ":"A","Ä":"A","Ǟ":"A","Ȧ":"A","Ǡ":"A","Ạ":"A","Ȁ":"A","À":"A","Ả":"A","Ȃ":"A","Ā":"A","Ą":"A","Å":"A","Ǻ":"A","Ḁ":"A","Ⱥ":"A","Ã":"A","Ꜳ":"AA","Æ":"AE","Ǽ":"AE","Ǣ":"AE","Ꜵ":"AO","Ꜷ":"AU","Ꜹ":"AV","Ꜻ":"AV","Ꜽ":"AY","Ḃ":"B","Ḅ":"B","Ɓ":"B","Ḇ":"B","Ƀ":"B","Ƃ":"B","Ć":"C","Č":"C","Ç":"C","Ḉ":"C","Ĉ":"C","Ċ":"C","Ƈ":"C","Ȼ":"C","Ď":"D","Ḑ":"D","Ḓ":"D","Ḋ":"D","Ḍ":"D","Ɗ":"D","Ḏ":"D","Dz":"D","Dž":"D","Đ":"D","Ƌ":"D","DZ":"DZ","DŽ":"DZ","É":"E","Ĕ":"E","Ě":"E","Ȩ":"E","Ḝ":"E","Ê":"E","Ế":"E","Ệ":"E","Ề":"E","Ể":"E","Ễ":"E","Ḙ":"E","Ë":"E","Ė":"E","Ẹ":"E","Ȅ":"E","È":"E","Ẻ":"E","Ȇ":"E","Ē":"E","Ḗ":"E","Ḕ":"E","Ę":"E","Ɇ":"E","Ẽ":"E","Ḛ":"E","Ꝫ":"ET","Ḟ":"F","Ƒ":"F","Ǵ":"G","Ğ":"G","Ǧ":"G","Ģ":"G","Ĝ":"G","Ġ":"G","Ɠ":"G","Ḡ":"G","Ǥ":"G","Ḫ":"H","Ȟ":"H","Ḩ":"H","Ĥ":"H","Ⱨ":"H","Ḧ":"H","Ḣ":"H","Ḥ":"H","Ħ":"H","Í":"I","Ĭ":"I","Ǐ":"I","Î":"I","Ï":"I","Ḯ":"I","İ":"I","Ị":"I","Ȉ":"I","Ì":"I","Ỉ":"I","Ȋ":"I","Ī":"I","Į":"I","Ɨ":"I","Ĩ":"I","Ḭ":"I","Ꝺ":"D","Ꝼ":"F","Ᵹ":"G","Ꞃ":"R","Ꞅ":"S","Ꞇ":"T","Ꝭ":"IS","Ĵ":"J","Ɉ":"J","Ḱ":"K","Ǩ":"K","Ķ":"K","Ⱪ":"K","Ꝃ":"K","Ḳ":"K","Ƙ":"K","Ḵ":"K","Ꝁ":"K","Ꝅ":"K","Ĺ":"L","Ƚ":"L","Ľ":"L","Ļ":"L","Ḽ":"L","Ḷ":"L","Ḹ":"L","Ⱡ":"L","Ꝉ":"L","Ḻ":"L","Ŀ":"L","Ɫ":"L","Lj":"L","Ł":"L","LJ":"LJ","Ḿ":"M","Ṁ":"M","Ṃ":"M","Ɱ":"M","Ń":"N","Ň":"N","Ņ":"N","Ṋ":"N","Ṅ":"N","Ṇ":"N","Ǹ":"N","Ɲ":"N","Ṉ":"N","Ƞ":"N","Nj":"N","Ñ":"N","NJ":"NJ","Ó":"O","Ŏ":"O","Ǒ":"O","Ô":"O","Ố":"O","Ộ":"O","Ồ":"O","Ổ":"O","Ỗ":"O","Ö":"O","Ȫ":"O","Ȯ":"O","Ȱ":"O","Ọ":"O","Ő":"O","Ȍ":"O","Ò":"O","Ỏ":"O","Ơ":"O","Ớ":"O","Ợ":"O","Ờ":"O","Ở":"O","Ỡ":"O","Ȏ":"O","Ꝋ":"O","Ꝍ":"O","Ō":"O","Ṓ":"O","Ṑ":"O","Ɵ":"O","Ǫ":"O","Ǭ":"O","Ø":"O","Ǿ":"O","Õ":"O","Ṍ":"O","Ṏ":"O","Ȭ":"O","Ƣ":"OI","Ꝏ":"OO","Ɛ":"E","Ɔ":"O","Ȣ":"OU","Ṕ":"P","Ṗ":"P","Ꝓ":"P","Ƥ":"P","Ꝕ":"P","Ᵽ":"P","Ꝑ":"P","Ꝙ":"Q","Ꝗ":"Q","Ŕ":"R","Ř":"R","Ŗ":"R","Ṙ":"R","Ṛ":"R","Ṝ":"R","Ȑ":"R","Ȓ":"R","Ṟ":"R","Ɍ":"R","Ɽ":"R","Ꜿ":"C","Ǝ":"E","Ś":"S","Ṥ":"S","Š":"S","Ṧ":"S","Ş":"S","Ŝ":"S","Ș":"S","Ṡ":"S","Ṣ":"S","Ṩ":"S","Ť":"T","Ţ":"T","Ṱ":"T","Ț":"T","Ⱦ":"T","Ṫ":"T","Ṭ":"T","Ƭ":"T","Ṯ":"T","Ʈ":"T","Ŧ":"T","Ɐ":"A","Ꞁ":"L","Ɯ":"M","Ʌ":"V","Ꜩ":"TZ","Ú":"U","Ŭ":"U","Ǔ":"U","Û":"U","Ṷ":"U","Ü":"U","Ǘ":"U","Ǚ":"U","Ǜ":"U","Ǖ":"U","Ṳ":"U","Ụ":"U","Ű":"U","Ȕ":"U","Ù":"U","Ủ":"U","Ư":"U","Ứ":"U","Ự":"U","Ừ":"U","Ử":"U","Ữ":"U","Ȗ":"U","Ū":"U","Ṻ":"U","Ų":"U","Ů":"U","Ũ":"U","Ṹ":"U","Ṵ":"U","Ꝟ":"V","Ṿ":"V","Ʋ":"V","Ṽ":"V","Ꝡ":"VY","Ẃ":"W","Ŵ":"W","Ẅ":"W","Ẇ":"W","Ẉ":"W","Ẁ":"W","Ⱳ":"W","Ẍ":"X","Ẋ":"X","Ý":"Y","Ŷ":"Y","Ÿ":"Y","Ẏ":"Y","Ỵ":"Y","Ỳ":"Y","Ƴ":"Y","Ỷ":"Y","Ỿ":"Y","Ȳ":"Y","Ɏ":"Y","Ỹ":"Y","Ź":"Z","Ž":"Z","Ẑ":"Z","Ⱬ":"Z","Ż":"Z","Ẓ":"Z","Ȥ":"Z","Ẕ":"Z","Ƶ":"Z","IJ":"IJ","Œ":"OE","ᴀ":"A","ᴁ":"AE","ʙ":"B","ᴃ":"B","ᴄ":"C","ᴅ":"D","ᴇ":"E","ꜰ":"F","ɢ":"G","ʛ":"G","ʜ":"H","ɪ":"I","ʁ":"R","ᴊ":"J","ᴋ":"K","ʟ":"L","ᴌ":"L","ᴍ":"M","ɴ":"N","ᴏ":"O","ɶ":"OE","ᴐ":"O","ᴕ":"OU","ᴘ":"P","ʀ":"R","ᴎ":"N","ᴙ":"R","ꜱ":"S","ᴛ":"T","ⱻ":"E","ᴚ":"R","ᴜ":"U","ᴠ":"V","ᴡ":"W","ʏ":"Y","ᴢ":"Z","á":"a","ă":"a","ắ":"a","ặ":"a","ằ":"a","ẳ":"a","ẵ":"a","ǎ":"a","â":"a","ấ":"a","ậ":"a","ầ":"a","ẩ":"a","ẫ":"a","ä":"a","ǟ":"a","ȧ":"a","ǡ":"a","ạ":"a","ȁ":"a","à":"a","ả":"a","ȃ":"a","ā":"a","ą":"a","ᶏ":"a","ẚ":"a","å":"a","ǻ":"a","ḁ":"a","ⱥ":"a","ã":"a","ꜳ":"aa","æ":"ae","ǽ":"ae","ǣ":"ae","ꜵ":"ao","ꜷ":"au","ꜹ":"av","ꜻ":"av","ꜽ":"ay","ḃ":"b","ḅ":"b","ɓ":"b","ḇ":"b","ᵬ":"b","ᶀ":"b","ƀ":"b","ƃ":"b","ɵ":"o","ć":"c","č":"c","ç":"c","ḉ":"c","ĉ":"c","ɕ":"c","ċ":"c","ƈ":"c","ȼ":"c","ď":"d","ḑ":"d","ḓ":"d","ȡ":"d","ḋ":"d","ḍ":"d","ɗ":"d","ᶑ":"d","ḏ":"d","ᵭ":"d","ᶁ":"d","đ":"d","ɖ":"d","ƌ":"d","ı":"i","ȷ":"j","ɟ":"j","ʄ":"j","dz":"dz","dž":"dz","é":"e","ĕ":"e","ě":"e","ȩ":"e","ḝ":"e","ê":"e","ế":"e","ệ":"e","ề":"e","ể":"e","ễ":"e","ḙ":"e","ë":"e","ė":"e","ẹ":"e","ȅ":"e","è":"e","ẻ":"e","ȇ":"e","ē":"e","ḗ":"e","ḕ":"e","ⱸ":"e","ę":"e","ᶒ":"e","ɇ":"e","ẽ":"e","ḛ":"e","ꝫ":"et","ḟ":"f","ƒ":"f","ᵮ":"f","ᶂ":"f","ǵ":"g","ğ":"g","ǧ":"g","ģ":"g","ĝ":"g","ġ":"g","ɠ":"g","ḡ":"g","ᶃ":"g","ǥ":"g","ḫ":"h","ȟ":"h","ḩ":"h","ĥ":"h","ⱨ":"h","ḧ":"h","ḣ":"h","ḥ":"h","ɦ":"h","ẖ":"h","ħ":"h","ƕ":"hv","í":"i","ĭ":"i","ǐ":"i","î":"i","ï":"i","ḯ":"i","ị":"i","ȉ":"i","ì":"i","ỉ":"i","ȋ":"i","ī":"i","į":"i","ᶖ":"i","ɨ":"i","ĩ":"i","ḭ":"i","ꝺ":"d","ꝼ":"f","ᵹ":"g","ꞃ":"r","ꞅ":"s","ꞇ":"t","ꝭ":"is","ǰ":"j","ĵ":"j","ʝ":"j","ɉ":"j","ḱ":"k","ǩ":"k","ķ":"k","ⱪ":"k","ꝃ":"k","ḳ":"k","ƙ":"k","ḵ":"k","ᶄ":"k","ꝁ":"k","ꝅ":"k","ĺ":"l","ƚ":"l","ɬ":"l","ľ":"l","ļ":"l","ḽ":"l","ȴ":"l","ḷ":"l","ḹ":"l","ⱡ":"l","ꝉ":"l","ḻ":"l","ŀ":"l","ɫ":"l","ᶅ":"l","ɭ":"l","ł":"l","lj":"lj","ſ":"s","ẜ":"s","ẛ":"s","ẝ":"s","ḿ":"m","ṁ":"m","ṃ":"m","ɱ":"m","ᵯ":"m","ᶆ":"m","ń":"n","ň":"n","ņ":"n","ṋ":"n","ȵ":"n","ṅ":"n","ṇ":"n","ǹ":"n","ɲ":"n","ṉ":"n","ƞ":"n","ᵰ":"n","ᶇ":"n","ɳ":"n","ñ":"n","nj":"nj","ó":"o","ŏ":"o","ǒ":"o","ô":"o","ố":"o","ộ":"o","ồ":"o","ổ":"o","ỗ":"o","ö":"o","ȫ":"o","ȯ":"o","ȱ":"o","ọ":"o","ő":"o","ȍ":"o","ò":"o","ỏ":"o","ơ":"o","ớ":"o","ợ":"o","ờ":"o","ở":"o","ỡ":"o","ȏ":"o","ꝋ":"o","ꝍ":"o","ⱺ":"o","ō":"o","ṓ":"o","ṑ":"o","ǫ":"o","ǭ":"o","ø":"o","ǿ":"o","õ":"o","ṍ":"o","ṏ":"o","ȭ":"o","ƣ":"oi","ꝏ":"oo","ɛ":"e","ᶓ":"e","ɔ":"o","ᶗ":"o","ȣ":"ou","ṕ":"p","ṗ":"p","ꝓ":"p","ƥ":"p","ᵱ":"p","ᶈ":"p","ꝕ":"p","ᵽ":"p","ꝑ":"p","ꝙ":"q","ʠ":"q","ɋ":"q","ꝗ":"q","ŕ":"r","ř":"r","ŗ":"r","ṙ":"r","ṛ":"r","ṝ":"r","ȑ":"r","ɾ":"r","ᵳ":"r","ȓ":"r","ṟ":"r","ɼ":"r","ᵲ":"r","ᶉ":"r","ɍ":"r","ɽ":"r","ↄ":"c","ꜿ":"c","ɘ":"e","ɿ":"r","ś":"s","ṥ":"s","š":"s","ṧ":"s","ş":"s","ŝ":"s","ș":"s","ṡ":"s","ṣ":"s","ṩ":"s","ʂ":"s","ᵴ":"s","ᶊ":"s","ȿ":"s","ɡ":"g","ᴑ":"o","ᴓ":"o","ᴝ":"u","ť":"t","ţ":"t","ṱ":"t","ț":"t","ȶ":"t","ẗ":"t","ⱦ":"t","ṫ":"t","ṭ":"t","ƭ":"t","ṯ":"t","ᵵ":"t","ƫ":"t","ʈ":"t","ŧ":"t","ᵺ":"th","ɐ":"a","ᴂ":"ae","ǝ":"e","ᵷ":"g","ɥ":"h","ʮ":"h","ʯ":"h","ᴉ":"i","ʞ":"k","ꞁ":"l","ɯ":"m","ɰ":"m","ᴔ":"oe","ɹ":"r","ɻ":"r","ɺ":"r","ⱹ":"r","ʇ":"t","ʌ":"v","ʍ":"w","ʎ":"y","ꜩ":"tz","ú":"u","ŭ":"u","ǔ":"u","û":"u","ṷ":"u","ü":"u","ǘ":"u","ǚ":"u","ǜ":"u","ǖ":"u","ṳ":"u","ụ":"u","ű":"u","ȕ":"u","ù":"u","ủ":"u","ư":"u","ứ":"u","ự":"u","ừ":"u","ử":"u","ữ":"u","ȗ":"u","ū":"u","ṻ":"u","ų":"u","ᶙ":"u","ů":"u","ũ":"u","ṹ":"u","ṵ":"u","ᵫ":"ue","ꝸ":"um","ⱴ":"v","ꝟ":"v","ṿ":"v","ʋ":"v","ᶌ":"v","ⱱ":"v","ṽ":"v","ꝡ":"vy","ẃ":"w","ŵ":"w","ẅ":"w","ẇ":"w","ẉ":"w","ẁ":"w","ⱳ":"w","ẘ":"w","ẍ":"x","ẋ":"x","ᶍ":"x","ý":"y","ŷ":"y","ÿ":"y","ẏ":"y","ỵ":"y","ỳ":"y","ƴ":"y","ỷ":"y","ỿ":"y","ȳ":"y","ẙ":"y","ɏ":"y","ỹ":"y","ź":"z","ž":"z","ẑ":"z","ʑ":"z","ⱬ":"z","ż":"z","ẓ":"z","ȥ":"z","ẕ":"z","ᵶ":"z","ᶎ":"z","ʐ":"z","ƶ":"z","ɀ":"z","ff":"ff","ffi":"ffi","ffl":"ffl","fi":"fi","fl":"fl","ij":"ij","œ":"oe","st":"st","ₐ":"a","ₑ":"e","ᵢ":"i","ⱼ":"j","ₒ":"o","ᵣ":"r","ᵤ":"u","ᵥ":"v","ₓ":"x"};String.prototype.latinise=function(){return this.replace(/[^A-Za-z0-9\[\] ]/g,function(e){return Latinise.latin_map[e]||e})};String.prototype.latinize=String.prototype.latinise;String.prototype.isLatin=function(){return this==this.latinise()};array_unique=function(e){var t=new Array;e:for(var n=0,r=e.length;n $index) { + if($index->status == 1) + $index_options[$index->machine_name] = $index->name; + } + + $form['mainsearchindex'] = array( + '#type'=>'select', + '#options'=>$index_options, + '#default_value' => variable_get('mainsearchindex', -1), + '#title' => t('Main search api index'), + ); + + $form['autocompletesearchindex'] = array( + '#type'=>'select', + '#options'=>$index_options, + '#default_value' => variable_get('autocompletesearchindex', -1), + '#title' => t('Autocomplete search api index'), + ); + + // TODO: select the activated viewmodes for change view mode and selected view mode + $entity_infos = entity_get_info(); + // dsm($entity_infos, 'entity_infos'); + foreach ($entity_infos['node']['view modes'] as $viewmode => $value) { + $viewmode_options[$viewmode] = $value['label']; + } + + $form['availableviewmodes'] = array( + '#type'=>'select', + '#options'=>$viewmode_options, + '#default_value' => variable_get('availableviewmodes', -1), + '#title' => t('Availble View modes'), + '#multiple' => true, + ); + + $form['defaultviewmode'] = array( + '#type'=>'select', + '#options'=>$viewmode_options, + '#default_value' => variable_get('defaultviewmode', 'full'), + '#title' => t('Defalut View mode'), + ); + + return system_settings_form($form); +} \ No newline at end of file diff --git a/materiobasemod.info b/materio_search_api.info similarity index 52% rename from materiobasemod.info rename to materio_search_api.info index b20231fc..0f32d8b4 100644 --- a/materiobasemod.info +++ b/materio_search_api.info @@ -1,5 +1,5 @@ -name = materiobasemod -description = "Materio base module" +name = materio_search_api +description = "Materio Search Api module" ; Core version (required) core = 7.x @@ -11,17 +11,19 @@ package = Materio ; php = 5.2 ; Loadable code files -;files[] = materiobasemod.theme.inc -;files[] = materiobasemod.forms.inc -files[] = materiobasemod.pages.inc -files[] = materiobasemod.module +;files[] = materio_search_api.theme.inc +;files[] = materio_search_api.forms.inc +files[] = materio_search_api.pages.inc +files[] = materio_search_api.admin.inc +files[] = materio_search_api.module ; Module dependencies -dependencies[] = taxonomy +;dependencies[] = taxonomy +dependencies[] = search_api +dependencies[] = search_api_solr ; Configuration page ; configure = admin/config/materiobasemod - ; For further information about configuration options, see ; - http://drupal.org/node/542202 diff --git a/materio_search_api.module b/materio_search_api.module new file mode 100644 index 00000000..4855ddb8 --- /dev/null +++ b/materio_search_api.module @@ -0,0 +1,362 @@ + array( + 'title' => t('Use materio search api'), + 'description' => t('Use materio search api.'), + ), + 'use materio search api autocomplete' => array( + 'title' => t('Use materio search api autocomplete'), + 'description' => t('Use materio search api autocomplete.'), + ), + 'use materio search api viewmode selection' => array( + 'title' => t('Use materio search api viewmode selection'), + 'description' => t('Use materio search api viewmode selection.'), + ), + 'administer materio_search_api' => array( + 'title' => t('administer Materio search api'), + 'description' => t('Administer materio search api.'), + ), + ); +} + +/** + * Implements hook_menu(). + */ +function materio_search_api_menu() { + $items = array(); + + $base = array( + 'type' => MENU_CALLBACK, + 'file' => 'materio_search_api.pages.inc', + ); + + $items['admin/config/search/search_api/materiosearchapi'] = array( + 'title' => 'Materio Search Api', + 'page callback' => 'drupal_get_form', + 'page arguments' => array('materio_search_api_settings'), + 'access arguments' => array('administer materio_search_api'), + 'file' => 'materio_search_api.admin.inc', + 'type' => MENU_LOCAL_TASK, + ); + + $items['materiosearchapi/autocomplete/dbselect'] = $base+array( + 'access arguments' => array('use materio search api autocomplete'), + 'page callback' => 'materio_search_api_autocomplete_dbselect', + ); + + $items['materiosearchapi/autocomplete/searchapi'] = $base+array( + 'access arguments' => array('use materio search api autocomplete'), + 'page callback' => 'materio_search_api_autocomplete_searchapi', + ); + + $items['explore'] = $base+array( + 'access arguments' => array('use materio search api'), + 'page callback' => 'materio_search_api_results_search', + //'page argument' => array(1,2,3), + ); + + $items['materiosearchapi/viewmode/change'] = $base+array( + 'access arguments' => array('use materio search api'), + 'page callback' => 'materio_search_api_viewmode_change', + 'page argument' => array(3), + ); + + return $items; +} + +/** + * Implements hook_block_info(). + */ +function materio_search_api_block_info() { + // This example comes from node.module. + $blocks['materio_search_api_search'] = array( + 'info' => t('Materio search api search'), + 'cache' => DRUPAL_NO_CACHE + ); + + $blocks['materio_search_api_viewmode'] = array( + 'info' => t('Materio search api view mode selection'), + 'cache' => DRUPAL_NO_CACHE + ); + + return $blocks; +} + +/** + * Implements hook_block_view(). + */ +function materio_search_api_block_view($delta = '') { + // This example comes from node.module. Note that you can also return a + // renderable array rather than rendered HTML for 'content'. + $block = array(); + + switch ($delta) { + case 'materio_search_api_search': + if (user_access('use materio search api')) { + $block['subject'] = t('Search'); + $block['content'] = theme('materio_search_api_search_block', array()); + } + break; + case 'materio_search_api_viewmode': + if (user_access('use materio search api viewmode selection')) { + $block['subject'] = t('View mode'); + $block['content'] = theme('materio_search_api_select_viewmode_block', array()); + } + break; + } + return $block; +} + +/** + * Implements hook_entity_info_alter(). + */ +function materio_search_api_entity_info_alter(&$entity_info) { + $entity_info['node']['view modes']['cardsmall'] = array( + 'label' => t('Small cards'), + 'custom settings' => TRUE, + ); + + $entity_info['node']['view modes']['cardmedium'] = array( + 'label' => t('Medium cards'), + 'custom settings' => TRUE, + ); + + $entity_info['node']['view modes']['cardbig'] = array( + 'label' => t('Big cards'), + 'custom settings' => TRUE, + ); + + $entity_info['node']['view modes']['cardfull'] = array( + 'label' => t('Full cards'), + 'custom settings' => TRUE, + ); +} + +/** +* Implements hook_preprocess_node(). +*/ +function materio_search_api_preprocess_node(&$vars) { + // $vars['theme_hook_suggestions'][] = 'node__'.$vars['view_mode']; + // $vars['theme_hook_suggestions'][] = 'node__' . $vars['type'] . '__' . $vars['view_mode']; + // dsm($vars, '$vars'); +} + +/** +* Implements hook_preprocess_field(). +*/ +function materio_search_api_preprocess_field(&$vars) { + //$vars['theme_hook_suggestions'][] = 'field__' . $vars['element']['#view_mode']; + //$vars['theme_hook_suggestions'][] = 'field__' . $vars['element']['#field_type'] . '__' . $vars['element']['#view_mode']; + //$vars['theme_hook_suggestions'][] = 'field__' . $vars['element']['#field_name'] . '__' . $vars['element']['#view_mode']; + // dsm($vars, '$vars'); +} + +/** + * materiobase_search_form() + */ +function materio_search_api_search_form($form, &$form_state){ + $form = array(); + + $args = arg(); + $path = array_shift($args); + $keys = implode('/', $args); + + $form['searchfield'] = array( + '#type' => 'textfield', + '#default_value' => $path == 'explore' ? $keys : "", // TODO: set the search page path global or a variable in settings + // '#value' => $keys, + '#autocomplete_path' => 'materiosearchapi/autocomplete/searchapi', + //'#autocomplete_path' => 'materiosearchapi/autocomplete/dbselect', + '#size' => 30, + '#maxlength' => 1024, + ); + + $form['create'] = array( + '#type' => 'image_button', + '#src' => drupal_get_path('module', 'materio_search_api') . '/images/search.png', + '#value' => t('Search'), + ); + return $form; +} + +function materio_search_api_search_form_validate($form, &$form_state){ + // dsm($form, '$form'); + // dsm($form_state, '$form_state'); + // dsm(strlen($form_state['values']['searchfield'])); + if (strlen(trim($form_state['values']['searchfield'])) <= 1) { + form_set_error('searchfield', 'Please enter at least 2 characters keyword.'); + } +} + +function materio_search_api_search_form_submit($form, &$form_state){ + $keys = $form_state['values']['searchfield']; + // drupal_go_to('base/explore/'.$keys); + $form_state['redirect'] = 'explore/'.$keys; +} + + +/** + * Implements hook_form_alter(). + * + * Adds language fields to user forms. + */ +// TODO: user can choose preferred view mode +// function materio_search_api_form_alter(&$form, &$form_state, $form_id) { +// if (user_access('use materio search api viewmode selection')) { +// if ($form_id == 'user_register_form' || ($form_id == 'user_profile_form' && $form['#user_category'] == 'account')) { +// materio_search_api_viewmode_selector_form($form, $form_state, $form['#user']); +// } +// } +// } + +// function materio_search_api_viewmode_selector_form(&$form, &$form_state, $user) { + +// } + +/** +* - - - - - - - - - - - - THEME - - - - - - - - - - - - +*/ + +/** + * Implements hook_theme(). + */ +function materio_search_api_theme($existing, $type, $theme, $path) { + return array( + 'materio_search_api_search_block' => array( + 'arguments' => array(), + 'template' => 'materio-search-api-search-block', + 'path' => drupal_get_path('module', 'materio_search_api').'/templates', + ), + 'materio_search_api_select_viewmode_block' => array( + 'arguments' => array(), + 'template' => 'materio-search-api-select-viewmode-block', + 'path' => drupal_get_path('module', 'materio_search_api').'/templates', + ), + 'materio_search_api_results' => array( + 'arguments' => array(), + 'template' => 'materio-search-api-results', + 'path' => drupal_get_path('module', 'materio_search_api').'/templates', + 'variables' => array( + 'index' => NULL, + 'results' => array('result count' => 0), + 'items' => array(), + 'view_mode' => 'teaser', + 'keys' => '', + // 'page_machine_name' => NULL, + 'spellcheck' => NULL, + 'pager' => NULL, + ), + ), + ); +} + +/** + * template_preprocess_materiobase_search_block(); + */ +function template_preprocess_materio_search_api_search_block(&$vars){ + // dsm($vars, '$vars'); + $vars['searchform'] = drupal_get_form("materio_search_api_search_form"); +} + +function template_preprocess_materio_search_api_select_viewmode_block(&$vars){ + global $user; + + $active = isset($user->data['materiosearchapi_viewmode']) ? $user->data['materiosearchapi_viewmode'] : variable_get('defaultviewmode', 'full'); + + $availableviewmodes = variable_get('availableviewmodes', -1); + // dsm($availableviewmodes); + + $entity_infos = entity_get_info(); + // dsm($entity_infos, 'entity_infos'); + + $content = '
                              '; + foreach ($entity_infos['node']['view modes'] as $viewmode => $value) { + if(in_array($viewmode, $availableviewmodes)){ + $content .= ''; + } + } + $content .= '
                              '; + $vars['content'] = $content; +} + +/** + * Function for preprocessing the variables for the search_api_page_results + * template. + * + * @param array $variables + * An associative array containing: + * - $index: The index this search was executed on. + * - $results: An array of search results, as returned by + * SearchApiQueryInterface::execute(). + * - $keys: The keywords of the executed search. + * + * @see materio-search-api-results.tpl.php + */ +function template_preprocess_materio_search_api_results(array &$variables) { + // dsm($variables, '$variables'); + $results = $variables['results']; + $keys = $variables['keys']; + + $variables['items'] = $variables['index']->loadItems(array_keys($variables['results']['results'])); + $variables['result_count'] = $results['result count']; + $variables['sec'] = round($results['performance']['complete'], 3); + $variables['search_performance'] = array( + '#theme' => 'search_performance', + '#markup' => format_plural( + $results['result count'], + 'The search found 1 result in @sec seconds.', + 'The search found @count results in @sec seconds.', + array('@sec' => $variables['sec']) + ), + '#prefix' => '

                              ', + '#suffix' => '

                              ', + ); + + // $variables['search_results'] = array( + // '#theme' => 'search_results_list', + // 'results' => $variables['results']['results'], + // 'items' => $variables['items'], + // 'index' => $variables['index'], + // 'type' => 'ul', + // ); + + // dsm($variables, 'variables'); +} + + +/** +* - - - - - - - - - - - - SEARCH API PAGE - - - - - - - - - - - - +*/ + +/** + * Implements hook_block_view_alter(). + */ +function materio_search_api_block_view_alter(&$data, $block) { + // this alter prepopulate the search form provide by search_api_page + if ($block->module == 'search_api_page') { + $page = search_api_page_load($block->delta); + $item = menu_get_item(); + + if (isset($page->path) && $page->path == $item['path']) { + $keys = arg(count(arg(NULL, $page->path))); + if ($keys) { + $data['content']['keys_' . $page->id]['#default_value'] = $keys; + $data['content']['keys_' . $page->id]['#value'] = $keys; + } + } + } +} \ No newline at end of file diff --git a/materio_search_api.pages.inc b/materio_search_api.pages.inc new file mode 100644 index 00000000..47637cab --- /dev/null +++ b/materio_search_api.pages.inc @@ -0,0 +1,252 @@ +vid; + } + + $query = db_select('taxonomy_term_data', 't'); + $query->addTag('translatable'); + $query->addTag('term_access'); + + // Select rows that match by term name. + $tags_return = $query + ->fields('t', array('tid', 'name')) + ->condition('t.vid', $vids) + ->condition('t.name', '%' . db_like($typed) . '%', 'LIKE') + ->range(0, 10) + ->execute() + ->fetchAllKeyed(); + + $term_matches = array(); + foreach ($tags_return as $tid => $name) { + $n = $name; + // Term names containing commas or quotes must be wrapped in quotes. + // if (strpos($name, ',') !== FALSE || strpos($name, '"') !== FALSE) { + // $n = '"' . str_replace('"', '""', $name) . '"'; + // } + $term_matches[$n] = check_plain($name); + } + } + + drupal_json_output($term_matches); + +} + +/** +* materio_search_api_autocomplete_searchapi($typed = '') +* +* GOOD one using searchapi (SOLR) +*/ +function materio_search_api_autocomplete_searchapi($typed = ''){ + // If the request has a '/' in the search text, then the menu system will have + // split it into multiple arguments, recover the intended $tags_typed. + $args = func_get_args(); + $typed = implode('/', $args); + + // dsm($typed, 'typed'); + if ($typed != '') { + + // search for patterns like key -another key +lastkey + // and provide auto completion for the last key + preg_match_all('/\s?[\+|-]?[^\s]+/', $typed, $adv_search_q); + preg_match('/^(\+|-)?(.*)$/', trim(array_pop($adv_search_q[0])), $last); + $tosearch = isset($last[2]) ? $last[2] : $typed; + + // build the query + $index_machine_name = variable_get('autocompletesearchindex', -1); + $query = search_api_query($index_machine_name); + $query_filter = $query->createFilter(); + $query_filter->condition('name', $tosearch); + // $query_filter->condition('type', 'article'); + $query->filter($query_filter); + $tags_return = $query->execute(); + // dsm($tags_return, '$tags_return'); + + if($tags_return['result count']){ + $term_matches = array(); + $index = search_api_index_load($index_machine_name); + $delta = 0; + foreach ($index->loadItems(array_keys($tags_return['results'])) as $item) { + // dsm($item, '$item'); + //$term_matches[$item->tid] = check_plain($item->name); + // $term_matches[check_plain($item->name)] = check_plain($item->name); + // TODO: leave tags with nodes + $term_matches[ trim(implode(' ', $adv_search_q[0]).' '.$last[1].$item->name)] = check_plain($item->name); + + $delta++; + if($delta > 7) + break; + } + drupal_json_output($term_matches); + }else{ + drupal_json_output(array()); + } + }else{ + return; + } + + + // dsm($term_matches, 'term_matches'); + // return 'debug mode of materio_search_api_autocomplete_searchapi'; + +} + +/** +* materio_search_api_results_search() +* +* +*/ +function materio_search_api_results_search(){//, $limit = 20, $page = 0 + global $user; + + //dsm("materio_search_api_results_search"); + $args = func_get_args(); + $typed = implode('/', $args); + + preg_match_all('/\?page=([0-9]+)/', $typed, $pages); + //dsm($pages, '$pages'); + if($pages[0]){ + $typed = str_replace($pages[0][0], '', $typed); + // $page = $pages[1][0]; + } + // else{ + // $page = 0; + // } + + + preg_match_all('/\s?[^\s]+\s?/', $typed, $words); + // dsm($words, "words"); + + // $escaper = array("+", "-", "&&", "||", "!", "(", ")", "{", "}", "[", "]", "^", '"', "~", "*", "?", ":", '\\'); + foreach ($words[0] as $word) { + + // $word = preg_replace('/\b-/', '\-', trim($word)); + // dsm($word); + + $keys[] = $word; + } + + if ($keys) { + try { + $limit = 15; + $offset = pager_find_page() * $limit; //$page*$limit;// + + $index_machine_name = variable_get('mainsearchindex', -1); + $query = search_api_query($index_machine_name, array('parse mode'=>'direct')) + ->keys(implode(' ', $keys)) + ->range($offset, $limit); + + $results = $query->execute(); + } + catch (SearchApiException $e) { + $ret['message'] = t('An error occurred while executing the search. Please try again or contact the site administrator if the problem persists.'); + watchdog('materiobasemod', 'An error occurred while executing a search: !msg.', array('!msg' => $e->getMessage()), WATCHDOG_ERROR, l(t('search page'), $_GET['q'])); + } + + // dsm($results, 'results'); + + # Load spellcheck. + // if (isset($results['search_api_spellcheck'])) { + // $ret['results']['#spellcheck'] = array( + // '#theme' => 'search_api_spellcheck', + // '#spellcheck' => $results['search_api_spellcheck'], + // // Let the theme function know where the key is stored by passing its arg + // // number. We can work this out from the number of args in the page path. + // '#options' => array( + // 'arg' => array(count(arg(NULL, $page->path))), + // ), + // '#prefix' => '

                              ', + // '#suffix' => '

                              ', + // ); + + // } + + + $ret['results']['#theme'] = 'materio_search_api_results'; + /* + TODO choose index in module settings + */ + $ret['results']['#index'] = search_api_index_load('materiaux_breves'); + $ret['results']['#results'] = $results; + /* + TODO choose view mode from user data + */ + + $ret['results']['#view_mode'] = isset($user->data['materiosearchapi_viewmode']) ? $user->data['materiosearchapi_viewmode'] : variable_get('defaultviewmode', 'full'); + $ret['results']['#keys'] = $keys; + + + // Load pager. + // if ($results['result count'] > $page->options['per_page']) { + /* + TODO set per page limit as module settings + */ + pager_default_initialize($results['result count'], $limit); + $ret['results']['#pager'] = theme('pager'); + // } + + if (!empty($results['ignored'])) { + drupal_set_message( + t('The following search keys are too short or too common and were therefore ignored: "@list".', + array( '@list' => implode(t('", "'), $results['ignored']) ) ), + 'warning' + ); + } + if (!empty($results['warnings'])) { + foreach ($results['warnings'] as $warning) { + drupal_set_message($warning, 'warning'); + } + } + + } + + return $ret; +} + + + +function materio_search_api_viewmode_change($vm){ + // dsm($vm); + + global $user; + // dsm($user, 'user'); + + $entity_infos = entity_get_info(); + // dsm($entity_infos, 'entity_infos'); + + if (in_array($vm, variable_get('availableviewmodes', array()))) { + user_save($user, array("data"=>array('materiosearchapi_viewmode' => $vm))); + $rep = array('statut'=>'saved'); + }else{ + $rep = array('statut'=>'viewmode not allowed'); + } + + //return 'debug mode for materio_search_api_viewmode_change'; + drupal_json_output($rep); +} + + + diff --git a/materiobaseajax.info b/materio_search_api_ajax.info similarity index 66% rename from materiobaseajax.info rename to materio_search_api_ajax.info index 89d8e5cc..147cc405 100644 --- a/materiobaseajax.info +++ b/materio_search_api_ajax.info @@ -1,4 +1,4 @@ -name = Materiobaseajax +name = Materio Search API Ajax description = "The description of this module" ; Core version (required) @@ -11,18 +11,18 @@ package = Materio ; php = 5.2 ; Loadable code files - files[] = materiobaseajax.module -; files[] = materiobaseajax.admin.inc -; files[] = materiobaseajax.class.inc + files[] = materio_search_api_ajax.module +; files[] = materio_search_api_ajax.admin.inc +; files[] = materio_search_api_ajax.class.inc ; Module dependencies -; dependencies[] = mymodule +; dependencies[] = materio_search_api ; dependencies[] = theirmodule (1.2) ; dependencies[] = anothermodule (>=2.4) ; dependencies[] = views (3.x) ; Configuration page -; configure = admin/config/materiobaseajax +; configure = admin/config/materio_search_api_ajax ; For further information about configuration options, see diff --git a/materio_search_api_ajax.module b/materio_search_api_ajax.module new file mode 100644 index 00000000..5907b7bb --- /dev/null +++ b/materio_search_api_ajax.module @@ -0,0 +1,37 @@ + 'Matrio base ajax', + 'page callback' => 'materio_search_api_ajax_search', + 'page arguments' => array(2,3), + 'access callback' => TRUE, + 'access arguments' => array('use materio search api'), + 'file' => 'materio_search_api_ajax.pages.inc', + 'type' => MENU_CALLBACK, + ); + + + return $items; +} diff --git a/materio_search_api_ajax.pages.inc b/materio_search_api_ajax.pages.inc new file mode 100644 index 00000000..6f131f20 --- /dev/null +++ b/materio_search_api_ajax.pages.inc @@ -0,0 +1,60 @@ +$id, + 'keys'=>$keys, + 'search_path'=>$search_path, + 'return'=>$return, + ); + + if ($debug) { + dsm($rep, 'rep'); + return "debug display"; + }else{ + drupal_json_output($rep); + } + + } + +} \ No newline at end of file diff --git a/materiobaseajax-ck.js b/materiobaseajax-ck.js deleted file mode 100644 index 5214dd84..00000000 --- a/materiobaseajax-ck.js +++ /dev/null @@ -1,5 +0,0 @@ -// * date 2011/10/19 * -/** -* misc -*/// ------ TRACE ------ -function trace(e,t){window.console&&window.console.debug&&(arguments.length===2?window.console.debug(e,t):window.console.debug(e))}function Timeout(e,t){var n=setTimeout(e,t);this.cleared=!1;this.clear=function(){this.cleared=!0;clearTimeout(n)}}function HexToRGB(e){if(e.charAt(0)=="#"){var t=e.substring(1,7),n=parseInt(t.substring(0,2),16),r=parseInt(t.substring(2,4),16),i=parseInt(t.substring(4,6),16);return"rgb("+n+", "+r+", "+i+")"}return null}function pair(e){return typeof e=="number"?e%2==0?!0:!1:null}function random(e,t){return arguments.length===1&&typeof e=="number"?Math.random()*e:arguments.length===2&&typeof e==typeof t&&typeof e=="number"?e+Math.random()*(t-e):NaN}function round(e,t){if(arguments.length==1)e=Math.round(e);else{t=t.toString();t=t.replace(/./gi,0);t=t.replace(/^./gi,1);t=parseInt(t);e=Math.round(e*t)/t}return e}function floor(e,t){if(arguments.length==1)e=Math.floor(e);else{t=t.toString();t=t.replace(/./gi,0);t=t.replace(/^./gi,1);t=parseInt(t);e=Math.floor(e*t)/t}return e}function ceil(e,t){if(arguments.length==1)e=Math.ceil(e);else{t=t.toString();t=t.replace(/./gi,0);t=t.replace(/^./gi,1);t=parseInt(t);e=Math.ceil(e*t)/t}return e}function ArraySubtract(e,t){var n=new Array;for(var r=e.length-1;r>=0;r--)t.contains(e[r])||n.push(e[r]);return n}function objectSize(e){var t=e.length?--e.length:0;for(var n in e)t++;return t}function objectGetKey(e,t){var n=0;for(var r in e){if(r==="length"||!e.hasOwnProperty(r))continue;if(n==t)return r;n++}}function objectSort(e,t){var n=new Array;for(var r=objectSize(e)-1;r>=0;r--){var i=objectGetKey(e,r);for(var s=objectSize(e[i].wit)-1;s>=0;s--){var o=objectGetKey(e[i].wit,s);if(o==t){var u=parseFloat(e[i].wit[o]);n.push({wit:u,nid:i})}}}n.sort(function(e,t){return t.wit-e.wit});var a={};for(var r=n.length-1;r>=0;r--)a[n[r].nid]=e[n[r].nid];return a}function getElementAngle(e,t,n,r){var i=n-e,s=r-t,o=Math.abs(Math.atan(s/i)*180/Math.PI);i>0&&s<0?o=90-o:i>=0&&s>=0?o+=90:i<0&&s>=0?o=180+(90-o):o+=270;return o}String.prototype.trim=function(){return this.replace(/(^\s*)|(\s*$)/gi,"").replace(/[ ]{2,}/gi," ").replace(/\n /,"\n")};Array.prototype.unique=function(){var e=new Array;e:for(var t=0,n=this.length;t 'Matrio base ajax', - 'page callback' => 'materiobaseajax_search_ajax', - 'page arguments' => array(2, 3), - // 'access callback' => TRUE, - 'access arguments' => array('access search_api_page'), - 'file' => 'materiobaseajax.pages.inc', - 'type' => MENU_CALLBACK, - ); - - return $items; -} - - - -/** - * Implements hook_search_api_ajax_settings(). - */ -function materiobaseajax_search_api_ajax_settings() { - $settings = array( - - // CSS id for main content (search results html) - // format: content => CSS id - 'content' => '#content', - - // CSS id's for regions containing search blocks - // check your region names in mytheme.info - // format: region_name => CSS id - 'regions' => array( - 'headerblock_left' => '#headerblock-left', - // 'sidebar_second' => '#sidebar-second', - ), - - // OPTIONAL: if you want to provide an AJAX spinner - // this paht is for a default spinner path provided with this module - // @note: see the search_api_ajax.css - 'spinner' => drupal_get_path('module', 'search_api_ajax') .'/spinner.gif', - - // OPTIONAL: if you want to use scroll-to-top functionality when paging - // scroll target div - // 'scrolltarget' => '#main-content', - // 'scrollspeed' => 1000, - - // OPTIONAL: if you want to fade search results when Ajaxing - // please set to 1 for TRUE - 'fade' => 1, - 'opacity' => 0.3, - ); - - return $settings; -} diff --git a/materiobaseajax.pages.inc b/materiobaseajax.pages.inc deleted file mode 100644 index eb6a2f9a..00000000 --- a/materiobaseajax.pages.inc +++ /dev/null @@ -1,22 +0,0 @@ -path . '/' . $keys, FALSE); - - if (is_array($return)) { - $return = drupal_render($return); - } - - $rep = array( - 'id'=>$id, - 'keys'=>$keys, - 'page'=>$page, - 'return'=>$return, - ); - - return drupal_json_output($rep); -} \ No newline at end of file diff --git a/materiobasemod.module b/materiobasemod.module deleted file mode 100644 index eed10ac6..00000000 --- a/materiobasemod.module +++ /dev/null @@ -1,176 +0,0 @@ - array( - 'title' => t('Materio base search'), - 'description' => t('Use materiobasemod search.'), - ), - ); -} - -/** - * Implements hook_menu(). - */ -function materiobasemod_menu() { - $items = array(); - $items['materiobase/search/autocomplete/dbselect'] = array( - 'title' => 'Autocomplete materiobase search', - 'page callback' => 'materiobase_search_autocomplete_dbselect', - 'access arguments' => array('access content'), - 'type' => MENU_CALLBACK, - 'file' => 'materiobasemod.pages.inc', - ); - $items['materiobase/search/autocomplete/searchapi'] = array( - 'title' => 'Autocomplete materiobase search', - 'page callback' => 'materiobase_search_autocomplete_searchapi', - 'access arguments' => array('access content'), - 'type' => MENU_CALLBACK, - 'file' => 'materiobasemod.pages.inc', - ); - - return $items; -} - -/** - * Implements hook_block_info(). - */ -function materiobasemod_block_info() { - // This example comes from node.module. - $blocks['base_search'] = array( - 'info' => t('Materio base search'), - 'cache' => DRUPAL_NO_CACHE - ); - - return $blocks; -} - -/** - * Implements hook_theme(). - */ -function materiobasemod_theme($existing, $type, $theme, $path) { - return array( - 'materiobase_search_block' => array( - 'arguments' => array(), - 'template' => 'materiobase-search-block', - 'path' => drupal_get_path('module', 'materiobasemod').'/templates', - ), - ); -} - -/** - * Implements hook_block_view(). - */ -function materiobasemod_block_view($delta = '') { - // This example comes from node.module. Note that you can also return a - // renderable array rather than rendered HTML for 'content'. - $block = array(); - - switch ($delta) { - case 'base_search': - if (user_access('use materiobase search')) { - $block['subject'] = t('Search'); - $block['content'] = theme('materiobase_search_block', array()); - } - break; - } - return $block; -} - -/** - * Implements hook_block_view_alter(). - */ -function materiobasemod_block_view_alter(&$data, $block) { - if ($block->module == 'search_api_page') { - $page = search_api_page_load($block->delta); - $item = menu_get_item(); - - if (isset($page->path) && $page->path == $item['path']) { - $keys = arg(count(arg(NULL, $page->path))); - if ($keys) { - $data['content']['keys_' . $page->id]['#default_value'] = $keys; - $data['content']['keys_' . $page->id]['#value'] = $keys; - } - } - } -} - -/** - * Implements hook_entity_info_alter(). - */ -function materiobasemod_entity_info_alter(&$entity_info) { - $entity_info['node']['view modes']['cardsmall'] = array( - 'label' => t('Small card for the grid'), - 'custom settings' => TRUE, - ); - - $entity_info['node']['view modes']['cardmedium'] = array( - 'label' => t('Medium card for the grid'), - 'custom settings' => TRUE, - ); - - $entity_info['node']['view modes']['cardbig'] = array( - 'label' => t('Big card for the grid'), - 'custom settings' => TRUE, - ); -} - -/** -* Implements hook_preprocess_node(). -*/ -function materiobasemod_preprocess_node(&$vars) { - $vars['theme_hook_suggestions'][] = 'node__'.$vars['view_mode']; - $vars['theme_hook_suggestions'][] = 'node__' . $vars['type'] . '__' . $vars['view_mode']; - // dsm($vars, '$vars'); -} - -function materiobasemod_preprocess_field(&$vars) { - $vars['theme_hook_suggestions'][] = 'field__' . $vars['element']['#view_mode']; - $vars['theme_hook_suggestions'][] = 'field__' . $vars['element']['#field_type'] . '__' . $vars['element']['#view_mode']; - $vars['theme_hook_suggestions'][] = 'field__' . $vars['element']['#field_name'] . '__' . $vars['element']['#view_mode']; - // dsm($vars, '$vars'); -} - - -/** - * materiobase_search_form() - */ -function materiobase_search_form(){ - $form = array(); - $form['searchfield'] = array( - '#type' => 'textfield', - '#default_value' => '', - // '#autocomplete_path' => 'materiobase/search/autocomplete/searchapi', - '#autocomplete_path' => 'materiobase/search/autocomplete/dbselect', - '#size' => 30, - '#maxlength' => 1024, - // '#element_validate' => array('taxonomy_autocomplete_validate'), - ); - $form['create'] = array( - '#type' => 'submit', - '#value' => t('Search'), - ); - return $form; -} - -/** - * template_preprocess_materiobase_search_block(); - */ -function template_preprocess_materiobase_search_block(&$vars){ - - $vars['searchform'] = drupal_get_form("materiobase_search_form"); - - -} diff --git a/materiobasemod.pages.inc b/materiobasemod.pages.inc deleted file mode 100644 index 54eccddf..00000000 --- a/materiobasemod.pages.inc +++ /dev/null @@ -1,100 +0,0 @@ -vid; - } - - $query = db_select('taxonomy_term_data', 't'); - $query->addTag('translatable'); - $query->addTag('term_access'); - - // Select rows that match by term name. - $tags_return = $query - ->fields('t', array('tid', 'name')) - ->condition('t.vid', $vids) - ->condition('t.name', '%' . db_like($typed) . '%', 'LIKE') - ->range(0, 10) - ->execute() - ->fetchAllKeyed(); - - $term_matches = array(); - foreach ($tags_return as $tid => $name) { - $n = $name; - // Term names containing commas or quotes must be wrapped in quotes. - // if (strpos($name, ',') !== FALSE || strpos($name, '"') !== FALSE) { - // $n = '"' . str_replace('"', '""', $name) . '"'; - // } - $term_matches[$n] = check_plain($name); - } - } - - drupal_json_output($term_matches); - -} - -function materiobase_search_autocomplete_searchapi($typed = ''){ - // If the request has a '/' in the search text, then the menu system will have - // split it into multiple arguments, recover the intended $tags_typed. - $args = func_get_args(); - $typed = implode('/', $args); - - /* - TODO riche serach engine + \\ etc gmail like - */ - - if ($typed != '') { - - - $query = search_api_query('referencement'); - - $query_filter = $query->createFilter(); - $query_filter->condition('name', $typed); - // $query_filter->condition('type', 'article'); - - $query->filter($query_filter); - - $tags_return = $query->execute(); - - dsm($tags_return, '$tags_return'); - - $term_matches = array(); - $index = search_api_index_load('referencement'); - foreach ($index->loadItems(array_keys($tags_return['results'])) as $item) { - dsm($item, '$item'); - } - - // - // foreach ($tags_return as $tid => $name) { - // $n = $name; - // // Term names containing commas or quotes must be wrapped in quotes. - // // if (strpos($name, ',') !== FALSE || strpos($name, '"') !== FALSE) { - // // $n = '"' . str_replace('"', '""', $name) . '"'; - // // } - // $term_matches[$n] = check_plain($name); - // } - } - - drupal_json_output($term_matches); - -} \ No newline at end of file diff --git a/templates/materio-search-api-results.tpl.php b/templates/materio-search-api-results.tpl.php new file mode 100644 index 00000000..b3107e13 --- /dev/null +++ b/templates/materio-search-api-results.tpl.php @@ -0,0 +1,57 @@ + + +
                              + + + +
                              + item_type, $items, $variables['view_mode']); ?> + + + item_type] as $entity){ + // $renders[] = render($entity); + // } + // dsm($renders, 'renders'); + + // print implode('', $renders); + ?> +
                              + + +

                              + +
                              + diff --git a/templates/materio-search-api-search-block.tpl.php b/templates/materio-search-api-search-block.tpl.php new file mode 100644 index 00000000..b4c0f557 --- /dev/null +++ b/templates/materio-search-api-search-block.tpl.php @@ -0,0 +1,3 @@ +