diff --git a/.gitignore b/.gitignore index 6401af0..51ac8ea 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,15 @@ .DS_Store inc/.DS_Store + +# +# from https://github.com/github/gitignore/blob/master/Global/Linux.gitignore +# + +*~ + +# KDE directory preferences +.directory + +# Linux trash folder which might appear on any partition or disk +.Trash-* diff --git a/demo.mov b/demo.mov deleted file mode 100644 index ce01388..0000000 Binary files a/demo.mov and /dev/null differ diff --git a/img/Untitled-3.png b/img/Untitled-3.png deleted file mode 100644 index aeeb8d7..0000000 Binary files a/img/Untitled-3.png and /dev/null differ diff --git a/img/controls.png b/img/controls.png deleted file mode 100644 index a44bb1e..0000000 Binary files a/img/controls.png and /dev/null differ diff --git a/img/controls.svg b/img/controls.svg deleted file mode 100644 index 57de21b..0000000 --- a/img/controls.svg +++ /dev/null @@ -1,159 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/img/controls.svgz b/img/controls.svgz deleted file mode 100644 index bbbb07c..0000000 Binary files a/img/controls.svgz and /dev/null differ diff --git a/img/numbers.ai b/img/numbers.ai deleted file mode 100644 index 88c4e58..0000000 --- a/img/numbers.ai +++ /dev/null @@ -1,3508 +0,0 @@ -%PDF-1.5 % -1 0 obj <>/OCGs[6 0 R 29 0 R 51 0 R 73 0 R 95 0 R 117 0 R 139 0 R 161 0 R 183 0 R 205 0 R 227 0 R 249 0 R 271 0 R 293 0 R 315 0 R 337 0 R 359 0 R 381 0 R 403 0 R 431 0 R 459 0 R 487 0 R 515 0 R 543 0 R 571 0 R 595 0 R 596 0 R 655 0 R 656 0 R 719 0 R 720 0 R 783 0 R 784 0 R 850 0 R 851 0 R 917 0 R 918 0 R 984 0 R 985 0 R]>>/Pages 3 0 R/Type/Catalog>> endobj 2 0 obj <>stream - - - - - application/pdf - - - Print - - - - - 2012-03-20T10:39:54-07:00 - 2012-03-20T10:39:54-07:00 - 2012-03-19T21:33:08-07:00 - Adobe Illustrator CS5.1 - - - - 256 - 232 - JPEG - /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgA6AEAAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A4xirsVdirsVdirsVdirs VdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsV dirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVd irsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdi rsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir sVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirs VdirsVdirsVdirsVZRrHlO1sfIXl7zIk8j3OsT3kU0DAcEW2dVTjTepqa1xVi+KuxV2KuxV2KuxV 2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxVnXkPyt5Q806Lf6VN ffozzijm40qe5kCWdxCqCtuxP2XqGNf10OKom4udM1zyD5H8s29/BDqSX98l367FEt1uJUKSSsRQ JQ1riqT/AJh6f5K0vVYdL8rXMuoLZRelqOpuQYri5B+JoAOiDoP1nqVWKYq7FXYq4kAEnYDqcVUP rkPv92Kad9ch9/uxWm1u4SQNxXxxWl8k8cdOR3PYYoU/rkPv92Kad9ch9/uxWlSOaNwSD061xQsN 5DXufoxTTX1yH3+7FabF3CTTcfRitL5Jo4wCx69AMUKf1yH3+7FNO+uQ+/3YrSpHPHJXienY4oWG 7hBpufcYppr65D7/AHYrTheQ+/3YrSuCCKjpih2KuxV2KuxV2KuxVk3kzzF5U0Y3R1/yynmL1uH1 fndSWvo8a8vsK4blUdelMVZlp+s+TfNTT6N5b/K4SarPBJ6MkWpTt6J40Erco0WiEj7TCp274q85 07y/rN7e2dtb2bySXtz9UteVI4pZwVBiErFUr8Qr8W1cVei6p5s/LzRb+bS9V/KxLbULQ+ncQyap cBgwHX+7NQeoIJBG9cVYL5v1ny9q2pJc6FoS6BaLEEe0S4kueTgkmTnIFpUECgHbFUixV2Kr4LYX V3DbMaJI3xEeCipGKQ+vPIenWUHknSI7e3iiBtI2ACCnJlqWIFK1Jqd8UJPYNq0f5nHT7+7S5g/R xlWCGIwQAlwB+6Ly1b/KJriqV/nzpNld+XbCJ4kVnu+CyBRyXlG3Q/MDFXl35AadaXPnO1uriJZp E9ZY+YDBSkJIYV779cUvb/Ok2lWmo2LXuoTRwlWCaJp6OLm6kNaH1ImRwPAbCvfFCv5GsdcWO/k1 aBorOWUNplrdMJriOPfkJJDVjX4aBjUYq+cvzU0q2i866g0AESz38sUiqAPtSE1FMUvoP8tbDTLH 8uLAxRx20awzSSTcAxBDvWRtviIp3xQkXmMSaXodprGmanJeQG4T1dV+tPJI4ZmDRpYsFtmAFO4P t3xVGfnbY2N15IjDQKFe5ioSoVhyR/aoOKvGfyY0e0n892D3SLcCG4eONHUFQY42YNQ13rSmKX0P 5t1O+sRBZ6XpzvPdV5agttJcQ2yDqzLCkjM/8q0p44oSb8r7xrn9MWl5LcXssF7KIp7mKWnppxWl XXjG1d/TqCPDFXiv52aXbJ501CeBVhZrmKFgigA+rEGLECm9QfvxS9n/ACU03TrTyLGqQxqBPKZJ Cq1Yig5M3fYYoS8NPZ6Ne69qQXU7VruRzJaaxPHwjdgFjijgPonhXpzBxVNPzTh0+8/LiaYW49Kc Wzosi0cK7qRyruGod8VfLlxbC1vLq0Dclt5pIlY9wjEYqsxV2KuxV2KuxV2KuxVkmh+fte0Py3qW g6V6NrHqzg3l8iEXbRhePoiXltGd9qV3O++Ksh1lmX8j/LLKSGGr3pBGxBCjFWM+afO2ueaE0/8A TLRz3OnQ/VkvQlLiWOtV9eSvxlex+fc4qkGKuxV2Kpj5bs2vPMWn2isFad2RWPQFkIFcVfQGheY/ Pej6Xb6YNMtrqO1X04pjLxJUE0rv2G3TFUR/izzZ9c+vf4bsfrvD0/rPqL6vCtePP7VPauKpR5nv PN3meK3h1Gxg0+ztHNw7LIJGYqp6ULdq4qwH8nrTW7W1XX9IWOae1u5oWt5TxBDQoK9R/vw98UvT r7Xdev5hNfeU9Mu5lUIJJzHIwUEkLVgTSpOKG7PzJ5l03mdO8qadamWgkNu0cVeP2eXEpWlcVeW/ mBpGovq2k3eqFEvNY1Jmlji3VAzL0/4M9/pxS9L8t6z538vaXHpMWnW15b25b0ZjLxNHYue/i3hi hUi1nW4rkXUXlHS47oHkJ19MSV8eQFa4qhfMl/5x81WkOm3unwafZrMsssyyCRjxBG1Gb+bwxS85 /K+y1YXFxq+lCN7rTr8t6MhoHDDpXb3B3xV7APPXnugrolqT3Inp/HFCHg83ebrP1DaeWrKIzuZJ vRlRC7t1d6FeTHxOKvLPzSs9XlEesaqscVzqGoxfuIjUKFjYdd+1O+KXofli/wDOfliyk0y1sba+ tRK0kcrScG+Km1K9Nq9MUIj9M619Z+tf4R0r61Xl6/7v1K9K8qVxVQ8yax528yaa2kz6ZbWVvK6t JP6oc0RuQpRj3HhirwTXovS8w6vFWvp31wtfGkpGKoHFXYq7FXYq7FXYq7FXYqmtx5k1W48u2nl6 R1Om2M8t1AgUBhJMAGq3Uj4dvn8sVSrFXYq7FXYqidL1KbStWs9ThjEr2kok9M7BgOorirPv+V53 3/VlX/kc3/NGKu/5Xnff9WVf+Rzf80YqpzfnffyQyRjRkUupUN6rGlRStOAxVIvJX5iXvlbTZtPT T1u45ZjOHLlCCyqpGyt/IMUsh/5Xnff9WVf+Rzf80Yod/wArzvv+rKv/ACOb/mjFWPeafzDvtfut LuP0etsdLm9dF5lw7VUgHZf5MUsh/wCV533/AFZV/wCRzf8ANGKHf8rzvv8Aqyr/AMjm/wCaMVd/ yvO+/wCrKv8AyOb/AJoxVjfk38wL3ywl6i2C3S3sgmoXKFTvXoGr1xSyT/led9/1ZV/5HN/zRih3 /K877/qyr/yOb/mjFWPecvzEvfM1ra2509bUWswuA3MvyKggDcL44pZAPzy1CgroqE9yJm/5oxQ3 /wArzvv+rKv/ACOb/mjFXf8AK877/qyr/wAjm/5oxV59e3kl9qF5fyII3vJ5LhoxuFMrFiBXwriq jirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVd irsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdi rsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir sVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirs VdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsV dirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVd irsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdi rsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVVGgmWJJmRhFISqSEHiStOQB9qjFVPFXYq 7FU4g0q1fyrdaoeX1mG7it0Ffh4OjMainWq4qk+KuxVlf5e+U7PzHqc8V5I6W9tFzZYiAzMzUAqQ 1Bir0D/lT/lP+e6/5GL/AM0Yq7/lT/lP+e6/5GL/AM0YqlnmT8qdBs9CvbyxmnS4tInnX1GVlIjU sykBR1AxVR8oflfompaBa6hqEs7T3QMgWJlVVWpCjdWJO2+Kpw35QeUlFWkugB1JlX/mjFW/+VP+ U/57r/kYv/NGKsT81/l5p+m6/o1jZ3EgttWkMTepR2QqyBiKBa7SYqywfk95Tp9u6Pv6i/8ANGKu /wCVP+U6053Vf+Mi/wDNGKtH8nvKhBAkugex9Rf+aMVYp5O/L3T9U1XWba/nkMWlzm2X0iFLsGde RJDbfB0xVln/ACp/yn/Pdf8AIxf+aMVWp+Ufk+QEpLcsASpKyodwaEbJ2OKpH53/AC10TR/L0+p2 Es4ltmj5JKyurK7rHTZVoRyriqP0L8pvL9xo9nc3k1w9zcQpLIY3VUBkUNRQVPSuKo4/lB5SBoZL qtK09Veg/wBhirf/ACp/yn/Pdf8AIxf+aMVedef/ACtbeXdZjtrSR5LaeITR+pQuvxFSpIAr9muK sZxV2KuxV2KuxV2KvWvy80LTtb8hT2N9Hyja6kKOPto/BKOh7EYq8+80eV9R8vaibW6HKJqm2uQP gkTxHgR3HbFUmxVM9H0YX0N5dzTfVrGwjWS5mC+o1XbgiIlUqzN0qwHviqfWflqWTTJVXU3Hl+a1 k1RHWBWkd7VhE6NGZF4uvP8A34RiqSa5okWnRWNxBcG4ttQh9eEvGIpFAYqQyBpB22IbFUpxV6R+ Sv8Ax1NS/wCMCf8AE8Vet4qo2sUcYlVCprI7Px/mY8t/ffFUD5q/5RfWP+YG5/5MtiqF8h/8ofpX /GAfrOKppqMMctv+8nNsiMGMoIWnbq23fFURGqqgC/ZA274qwnz3/wApZ5P/AOYqX/iUOKs4xVBr bRDVXuPrBaYxcPq1VoqEg8qU5dR1xVGYqwf8vf8Ajvebv+2i3/JyXFWcYqgNHsFsoZYVlWVfVZgq igStPh3LH8cVSX8zv+UH1L/nh/1ER4qnXl//AI4Om/8AMLB/ybXFV98tqhWWWZLeQ/CsjmlaVIG5 XpXFUVFX00q/M0FX2+Lbrt44q8g/Oj/jvWP/ADC/8zGxV57irsVdirsVdirsVeleQfO+k6HoVtY3 BL3F1esHANBFEwRfUc/wxVDfm5e65Hq4sLifnpUqrcWkfBBxIHFhzC8qhge/Q4q8+xVM9H1kWMN5 aTQ/WbDUI1juYQ3ptVG5I6PR+LK3Sqke2KsgtPNOpW2lS3FhZNBpVrbSaZayLOBLDNdMJjKzgKzu THX4VUfLFUi1zX5dXhsPrCMbu0hMM12783mHIspaor8INNycVSnFXpH5K/8AHU1L/jAn/E8VetOo ZSprRgQaEg7+BFCMVSbyxp7WKalCUkSNr6V4TKzuzIyp8XNyzNU13JxVW81f8ovrH/MDc/8AJlsV QvkP/lD9K/4wD9ZxVf5poILU/UWvpBKfTX03lijJRlMssaA8woOw8fDqFUZoVrHa6PZ20ZkZIYlR TMpR9tt0O6/LtirFvPf/AClnk/8A5ipf+JQ4qzjFWMPbcvM9rNBYSRyRXErXUjRHiytCyLOLnow+ yoir9GwxVk+KsH/L3/jvebv+2i3/ACclxVmN8L02cwsuAuypEBlJCBuxYgMfwxVJvJ9lqFnFqMV5 biANePJGRI0pfkq8m5MkfIEj7Xc12GKob8zv+UH1L/nh/wBREeKp15f/AOODpv8AzCwf8m1xVK/N du7zW8yx3DPFDOLcwQJcJ6zmMqsissnHlwpyoBSvxDbFU9tPX+qQ/WEWOf019VE+yr0HIL7A4q8k /Oj/AI71j/zC/wDMxsVee4q7FXYq7FXYq7FXYqm+ueadV1q3soL5kZLBPThZVoxqACzMakk8RXFU oxV2KpvDq1snle50oq/1ia7juFcAcOCIykE1rWreGKpRirsVZR5B83W/lvU5prqF5ra4j9OT0qc1 INQQGKg/firPv+VzeV/+WW+/5Fw/9VcVd/yubyv/AMst9/yLh/6q4qlvmP8ANrRr7RLyxsbW59e6 ieDlMsaoqyAqx+F3NaHbbFVDyl+amk6XoNtp2oW1w01qCiyQBGVlqSCeTpQ70xVOf+VzeV/+WW+/ 5Fw/9VcVd/yubyv/AMst9/yLh/6q4qxTzT+YtrqevaRf2drILfSpPVCzUV5GZlLCilwBRBTfFWVD 85vLFBW1vQe4CRH/AJm4q3/yubyv/wAst9/yLh/6q4q035z+WeJ42l6WpsCkQFfn6pxVivlD8xbT SdU1e6v7aRotUmNxSDizIxZm40coCPj8cVZX/wArm8r/APLLff8AIuH/AKq4q7/lc3lf/llvv+Rc P/VXFUi86/mdpOtaBPpdja3CvclOck4RQqo6ybcWepJWmKo/Qvzd0S10i0tb20uRcW8SROYVjZDw UKGBZ0O9OlMVR3/K5vK//LLff8i4f+quKu/5XN5X/wCWW+/5Fw/9VcVee+fPNUPmTWEureFobaGI QxCSnM/EWLMASB9rpXFWN4q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq 7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7 FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FWV/8qq/Mn/qWdR/6R5P6Yq7 /lVX5k/9SzqP/SPJ/TFXf8qq/Mn/AKlnUf8ApHk/pirv+VVfmT/1LOo/9I8n9MVd/wAqq/Mn/qWd R/6R5P6Yq7/lVX5k/wDUs6j/ANI8n9MVd/yqr8yf+pZ1H/pHk/pirv8AlVX5k/8AUs6j/wBI8n9M Vd/yqr8yf+pZ1H/pHk/pirv+VVfmT/1LOo/9I8n9MVd/yqr8yf8AqWdR/wCkeT+mKu/5VV+ZP/Us 6j/0jyf0xV3/ACqr8yf+pZ1H/pHk/pirv+VVfmT/ANSzqP8A0jyf0xV3/KqvzJ/6lnUf+keT+mKu /wCVVfmT/wBSzqP/AEjyf0xV3/KqvzJ/6lnUf+keT+mKu/5VV+ZP/Us6j/0jyf0xV3/KqvzJ/wCp Z1H/AKR5P6Yq7/lVX5k/9SzqP/SPJ/TFXf8AKqvzJ/6lnUf+keT+mKu/5VV+ZP8A1LOo/wDSPJ/T FXf8qq/Mn/qWdR/6R5P6Yq7/AJVV+ZP/AFLOo/8ASPJ/TFXf8qq/Mn/qWdR/6R5P6Yq7/lVX5k/9 SzqP/SPJ/TFXf8qq/Mn/AKlnUf8ApHk/pirv+VVfmT/1LOo/9I8n9MVd/wAqq/Mn/qWdR/6R5P6Y q7/lVX5k/wDUs6j/ANI8n9MVd/yqr8yf+pZ1H/pHk/pirv8AlVX5k/8AUs6j/wBI8n9MVf/Z - - - - - - uuid:02b7e024-4a7a-8e43-a010-e2b2ebc74740 - xmp.did:F77F1174072068118C14F9A1C22E04E8 - uuid:5D20892493BFDB11914A8590D31508C8 - proof:pdf - - uuid:ae9148ef-3000-a144-9ee3-ddb3557e196e - xmp.did:8AF5709C0E20681188C6A12CE4B46A4D - uuid:5D20892493BFDB11914A8590D31508C8 - proof:pdf - - - - - saved - xmp.iid:F77F1174072068118C14F9A1C22E04E8 - 2012-03-19T21:33:09-07:00 - Adobe Illustrator CS5.1 - / - - - - - - Document - Print - - - False - True - 1 - - 706.000000 - 636.000000 - Pixels - - - - - HelveticaNeue-Bold - Helvetica Neue - Bold - TrueType - 7.0d27e1 - False - HelveticaNeue.dfont - - - - - - Cyan - Magenta - Yellow - Black - - - - - - Default Swatch Group - 0 - - - - White - RGB - PROCESS - 255 - 255 - 255 - - - Black - RGB - PROCESS - 35 - 31 - 32 - - - CMYK Red - RGB - PROCESS - 237 - 28 - 36 - - - CMYK Yellow - RGB - PROCESS - 255 - 242 - 0 - - - CMYK Green - RGB - PROCESS - 0 - 166 - 81 - - - CMYK Cyan - RGB - PROCESS - 0 - 174 - 239 - - - CMYK Blue - RGB - PROCESS - 46 - 49 - 146 - - - CMYK Magenta - RGB - PROCESS - 236 - 0 - 140 - - - C=15 M=100 Y=90 K=10 - RGB - PROCESS - 190 - 30 - 45 - - - C=0 M=90 Y=85 K=0 - RGB - PROCESS - 239 - 65 - 54 - - - C=0 M=80 Y=95 K=0 - RGB - PROCESS - 241 - 90 - 41 - - - C=0 M=50 Y=100 K=0 - RGB - PROCESS - 247 - 148 - 30 - - - C=0 M=35 Y=85 K=0 - RGB - PROCESS - 251 - 176 - 64 - - - C=5 M=0 Y=90 K=0 - RGB - PROCESS - 249 - 237 - 50 - - - C=20 M=0 Y=100 K=0 - RGB - PROCESS - 215 - 223 - 35 - - - C=50 M=0 Y=100 K=0 - RGB - PROCESS - 141 - 198 - 63 - - - C=75 M=0 Y=100 K=0 - RGB - PROCESS - 57 - 181 - 74 - - - C=85 M=10 Y=100 K=10 - RGB - PROCESS - 0 - 148 - 68 - - - C=90 M=30 Y=95 K=30 - RGB - PROCESS - 0 - 104 - 56 - - - C=75 M=0 Y=75 K=0 - RGB - PROCESS - 43 - 182 - 115 - - - C=80 M=10 Y=45 K=0 - RGB - PROCESS - 0 - 167 - 157 - - - C=70 M=15 Y=0 K=0 - RGB - PROCESS - 39 - 170 - 225 - - - C=85 M=50 Y=0 K=0 - RGB - PROCESS - 28 - 117 - 188 - - - C=100 M=95 Y=5 K=0 - RGB - PROCESS - 43 - 57 - 144 - - - C=100 M=100 Y=25 K=25 - RGB - PROCESS - 38 - 34 - 98 - - - C=75 M=100 Y=0 K=0 - RGB - PROCESS - 102 - 45 - 145 - - - C=50 M=100 Y=0 K=0 - RGB - PROCESS - 146 - 39 - 143 - - - C=35 M=100 Y=35 K=10 - RGB - PROCESS - 158 - 31 - 99 - - - C=10 M=100 Y=50 K=0 - RGB - PROCESS - 218 - 28 - 92 - - - C=0 M=95 Y=20 K=0 - RGB - PROCESS - 238 - 42 - 123 - - - C=25 M=25 Y=40 K=0 - RGB - PROCESS - 194 - 181 - 155 - - - C=40 M=45 Y=50 K=5 - RGB - PROCESS - 155 - 133 - 121 - - - C=50 M=50 Y=60 K=25 - RGB - PROCESS - 114 - 102 - 88 - - - C=55 M=60 Y=65 K=40 - RGB - PROCESS - 89 - 74 - 66 - - - C=25 M=40 Y=65 K=0 - RGB - PROCESS - 196 - 154 - 108 - - - C=30 M=50 Y=75 K=10 - RGB - PROCESS - 169 - 124 - 80 - - - C=35 M=60 Y=80 K=25 - RGB - PROCESS - 139 - 94 - 60 - - - C=40 M=65 Y=90 K=35 - RGB - PROCESS - 117 - 76 - 41 - - - C=40 M=70 Y=100 K=50 - RGB - PROCESS - 96 - 57 - 19 - - - C=50 M=70 Y=80 K=70 - RGB - PROCESS - 60 - 36 - 21 - - - - - - Grays - 1 - - - - C=0 M=0 Y=0 K=100 - RGB - PROCESS - 35 - 31 - 32 - - - C=0 M=0 Y=0 K=90 - RGB - PROCESS - 65 - 64 - 66 - - - C=0 M=0 Y=0 K=80 - RGB - PROCESS - 88 - 89 - 91 - - - C=0 M=0 Y=0 K=70 - RGB - PROCESS - 109 - 110 - 113 - - - C=0 M=0 Y=0 K=60 - RGB - PROCESS - 128 - 130 - 133 - - - C=0 M=0 Y=0 K=50 - RGB - PROCESS - 147 - 149 - 152 - - - C=0 M=0 Y=0 K=40 - RGB - PROCESS - 167 - 169 - 172 - - - C=0 M=0 Y=0 K=30 - RGB - PROCESS - 188 - 190 - 192 - - - C=0 M=0 Y=0 K=20 - RGB - PROCESS - 209 - 211 - 212 - - - C=0 M=0 Y=0 K=10 - RGB - PROCESS - 230 - 231 - 232 - - - C=0 M=0 Y=0 K=5 - RGB - PROCESS - 241 - 242 - 242 - - - - - - Brights - 1 - - - - C=0 M=100 Y=100 K=0 - RGB - PROCESS - 237 - 28 - 36 - - - C=0 M=75 Y=100 K=0 - RGB - PROCESS - 242 - 101 - 34 - - - C=0 M=10 Y=95 K=0 - RGB - PROCESS - 255 - 222 - 23 - - - C=85 M=10 Y=100 K=0 - RGB - PROCESS - 0 - 161 - 75 - - - C=100 M=90 Y=0 K=0 - RGB - PROCESS - 33 - 64 - 154 - - - C=60 M=90 Y=0 K=0 - RGB - PROCESS - 127 - 63 - 152 - - - - - - - - - Adobe PDF library 9.90 - - - - - - - - - - - - - - - - - - - - - - - - - endstream endobj 3 0 obj <> endobj 8 0 obj <>/Resources<>/ExtGState<>/Properties<>/XObject<>>>/Thumb 1011 0 R/TrimBox[0.0 0.0 706.0 636.0]/Type/Page>> endobj 987 0 obj <>stream -HtKn1 s -^@2H8mWAat tH}HñD93^OgN кntV&$߯m$I>jT{me:}}Cx;]>iw4ˈk<"2iM#jap~ >]" ,ovl Y388dي`E5AvXTXM$ZNȕ.ZÙ]r?ҏ_ 6m\/^'qFL뾊'Oh\bP%l|&3[CD3?2kz967@iۗX2:[w9N;"d01k d.Ss4 -hF;#hh?A"Yc0|ldS\?u -S [NVdL,b^'USD -S-/6ڏkW^-ۋJMQA޵zOj0$5IWrn 7=>s-'l}>o]g[N귮_,L: endstream endobj 988 0 obj <> endobj 1011 0 obj <>stream -8;Z]!;3&O:$q**Lq_a/NTC:h;pc_qq#=?!e+k^NBWN,kEMDY_#$&V+Oa)RV&-/Ra1 -POU6=1l_#0kI=D_U!1)3dRLBQS\s\HoBhJK9e72(&69EtdT0p2Xr=KkDLWnrD%I@_ ->*(3D@qAf,OIJRWA_=AhD:;L*hM%(--3@hQ"qb!_PAcWL[6<\.Mjo2j?E@X51#&Xq -=uWBjq"iE?I/1M)R;MC3TW4k-nB=tA-hk+%6D^5`[,A;_]D-k_YN%U&j*V9=o30 endstream endobj 1013 0 obj [/Indexed/DeviceRGB 255 1014 0 R] endobj 1014 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 993 0 obj <>/ExtGState<>>>/Subtype/Form>>stream -/CS0 cs 1 1 1 scn -/GS0 gs -q 1 0 0 1 333.2734 469.7349 cm -0 0 m -0 3.626 -7.178 15.042 -10.804 15.042 c --63.981 15.042 l --67.607 15.042 -75.491 3.626 -75.491 0 c --75.491 -40.698 l --75.491 -44.324 -72.551 -47.263 -68.926 -47.263 c --6.564 -47.263 l --2.938 -47.263 0 -44.324 0 -40.698 c -h -f -Q -0.137 0.122 0.125 scn -q 1 0 0 1 335.9229 470.7065 cm -0 0 m --0.467 5.572 -6.564 17.125 -12.772 17.993 c --16.658 18.536 -20.889 18.068 -24.8 18.068 c --65.639 18.068 l --71.832 18.068 -76.125 10.384 -78.762 5.696 c --81.305 1.175 -80.85 -3.405 -80.85 -8.378 c --80.85 -31.603 l --80.85 -36.105 -81.883 -42.852 -79.639 -46.985 c --77.115 -51.635 -73.142 -52.232 -68.466 -52.232 c --52.216 -52.232 l --13.092 -52.232 l --8.641 -52.232 -5.1 -52.048 -1.953 -48.234 c -0.945 -44.721 0.061 -38.497 0.061 -34.263 c -0.061 -1.066 l -0.061 3.839 -5.359 4.082 -5.359 -0.877 c --5.359 -37.592 l --5.359 -41.575 l --5.359 -44.603 -9.508 -44.237 -11.437 -44.237 c --29.509 -44.237 l --70.157 -44.237 l --76.125 -44.237 -75.431 -40.267 -75.431 -35.771 c --75.431 -12.803 l --75.431 -2.136 l --75.431 1.55 -71.735 5.678 -69.251 8.223 c --67.238 10.287 -66.161 10.073 -63.54 10.073 c --50.873 10.073 l --20.458 10.073 l --13.617 10.073 l --10.243 10.073 -5.536 0.886 -5.299 -1.943 c --4.856 -7.231 0.356 -4.251 0 0 c -f -Q - endstream endobj 994 0 obj <>/ExtGState<>>>/Subtype/Form>>stream -/CS0 cs 1 1 1 scn -/GS0 gs -q 1 0 0 1 325.6289 453.6816 cm -0 0 m -0 -3.837 -3.11 -6.948 -6.947 -6.948 c --54.188 -6.948 l --58.025 -6.948 -61.137 -3.837 -61.137 0 c --61.137 24.315 l --61.137 28.152 -58.025 31.263 -54.188 31.263 c --6.947 31.263 l --3.11 31.263 0 28.152 0 24.315 c -h -f -Q -0.137 0.122 0.125 scn -q 1 0 0 1 322.1699 453.9688 cm -0 0 m --0.549 -6.123 -10.109 -4.156 -14.25 -4.156 c --38.15 -4.156 l --47.104 -4.156 l --48.662 -4.156 -50.961 -4.49 -52.435 -3.79 c --54.885 -2.626 -54.219 1.629 -54.219 3.794 c --54.219 15.932 l --54.219 20.525 -55.576 27.897 -49.1 27.897 c --29.635 27.897 l --7.694 27.897 l --3.551 27.897 l -0.558 27.897 0 23.467 0 20.7 c -0 0 l -0 -3.895 6.918 -4.719 6.918 -0.574 c -6.918 17.727 l -6.918 24.599 6.807 31.532 -1.287 33.754 c --5.499 34.911 -10.832 34.054 -15.114 34.054 c --39.035 34.054 l --43.608 34.054 -48.271 34.321 -52.834 33.913 c --61.132 33.169 -61.136 24.432 -61.136 18.302 c --61.136 0 l --61.136 -7.364 -54.511 -10.313 -48.217 -10.313 c --15.184 -10.313 l --6.733 -10.313 5.866 -12.302 6.918 -0.574 c -7.265 3.301 0.37 4.129 0 0 c -f -Q - endstream endobj 995 0 obj <>/ExtGState<>>>/Subtype/Form>>stream -/CS0 cs 1 1 1 scn -/GS0 gs -q 1 0 0 1 560.0781 453.6816 cm -0 0 m -0 -3.837 -3.109 -6.948 -6.945 -6.948 c --54.188 -6.948 l --58.024 -6.948 -61.135 -3.837 -61.135 0 c --61.135 24.315 l --61.135 28.152 -58.024 31.263 -54.188 31.263 c --6.945 31.263 l --3.109 31.263 0 28.152 0 24.315 c -h -f -Q -0.137 0.122 0.125 scn -q 1 0 0 1 556.6191 453.9688 cm -0 0 m --0.549 -6.124 -10.107 -4.156 -14.248 -4.156 c --38.149 -4.156 l --47.102 -4.156 l --48.66 -4.156 -50.959 -4.49 -52.433 -3.79 c --54.884 -2.626 -54.217 1.629 -54.217 3.794 c --54.217 15.932 l --54.217 20.525 -55.575 27.897 -49.099 27.897 c --29.633 27.897 l --7.692 27.897 l --3.549 27.897 l -0.559 27.897 0 23.465 0 20.7 c -0 0 l -0 -3.895 6.918 -4.719 6.918 -0.574 c -6.918 17.727 l -6.918 24.599 6.808 31.532 -1.286 33.754 c --5.497 34.911 -10.83 34.054 -15.112 34.054 c --39.033 34.054 l --43.607 34.054 -48.271 34.321 -52.833 33.913 c --61.131 33.169 -61.135 24.432 -61.135 18.302 c --61.135 0 l --61.135 -7.364 -54.51 -10.313 -48.216 -10.313 c --15.182 -10.313 l --6.731 -10.313 5.867 -12.302 6.918 -0.574 c -7.265 3.301 0.37 4.129 0 0 c -f -Q - endstream endobj 996 0 obj <>/ExtGState<>/Font<>/ProcSet[/PDF/Text]>>/Subtype/Form>>stream -BT -/CS0 cs 0 0 0 scn -/GS0 gs -/TT0 1 Tf -0 Tc 0 Tw 0 Ts 100 Tz 0 Tr 50.8829 0 0 29.7657 516.1143 455.5918 Tm -(4)Tj -ET - endstream endobj 997 0 obj <>/ExtGState<>>>/Subtype/Form>>stream -/CS0 cs 1 1 1 scn -/GS0 gs -q 1 0 0 1 645.3174 469.7349 cm -0 0 m -0 3.626 -7.178 15.042 -10.804 15.042 c --63.982 15.042 l --67.606 15.042 -75.491 3.626 -75.491 0 c --75.491 -40.698 l --75.491 -44.324 -72.552 -47.263 -68.927 -47.263 c --6.564 -47.263 l --2.94 -47.263 0 -44.324 0 -40.698 c -h -f -Q -0.137 0.122 0.125 scn -q 1 0 0 1 647.9668 470.7065 cm -0 0 m --0.467 5.572 -6.564 17.125 -12.772 17.993 c --16.658 18.536 -20.889 18.068 -24.8 18.068 c --65.64 18.068 l --71.832 18.068 -76.125 10.384 -78.762 5.696 c --81.305 1.175 -80.851 -3.405 -80.851 -8.378 c --80.851 -31.603 l --80.851 -36.105 -81.883 -42.852 -79.64 -46.985 c --77.115 -51.635 -73.143 -52.232 -68.468 -52.232 c --52.217 -52.232 l --13.092 -52.232 l --8.641 -52.232 -5.101 -52.047 -1.954 -48.234 c -0.945 -44.722 0.061 -38.497 0.061 -34.263 c -0.061 -1.066 l -0.061 3.839 -5.359 4.082 -5.359 -0.877 c --5.359 -37.592 l --5.359 -41.575 l --5.359 -44.603 -9.509 -44.237 -11.437 -44.237 c --29.509 -44.237 l --70.158 -44.237 l --76.126 -44.237 -75.431 -40.266 -75.431 -35.771 c --75.431 -12.803 l --75.431 -2.136 l --75.431 1.55 -71.734 5.678 -69.251 8.223 c --67.238 10.287 -66.162 10.073 -63.541 10.073 c --50.874 10.073 l --20.458 10.073 l --13.617 10.073 l --10.243 10.073 -5.536 0.886 -5.299 -1.943 c --4.856 -7.231 0.356 -4.251 0 0 c -f -Q - endstream endobj 998 0 obj <>/ExtGState<>>>/Subtype/Form>>stream -/CS0 cs 1 1 1 scn -/GS0 gs -q 1 0 0 1 637.6729 453.6816 cm -0 0 m -0 -3.837 -3.11 -6.948 -6.946 -6.948 c --54.188 -6.948 l --58.026 -6.948 -61.136 -3.837 -61.136 0 c --61.136 24.315 l --61.136 28.152 -58.026 31.263 -54.188 31.263 c --6.946 31.263 l --3.11 31.263 0 28.152 0 24.315 c -h -f -Q -0.137 0.122 0.125 scn -q 1 0 0 1 634.2139 453.9688 cm -0 0 m --0.549 -6.124 -10.108 -4.156 -14.249 -4.156 c --38.15 -4.156 l --47.103 -4.156 l --48.662 -4.156 -50.96 -4.49 -52.435 -3.79 c --54.885 -2.626 -54.218 1.629 -54.218 3.794 c --54.218 15.932 l --54.218 20.525 -55.576 27.897 -49.1 27.897 c --29.634 27.897 l --7.693 27.897 l --3.55 27.897 l -0.558 27.897 0 23.466 0 20.7 c -0 0 l -0 -3.895 6.918 -4.719 6.918 -0.574 c -6.918 17.727 l -6.918 24.599 6.807 31.532 -1.287 33.754 c --5.498 34.911 -10.831 34.054 -15.113 34.054 c --39.034 34.054 l --43.608 34.054 -48.271 34.321 -52.834 33.913 c --61.132 33.169 -61.136 24.431 -61.136 18.302 c --61.136 0 l --61.136 -7.364 -54.511 -10.313 -48.217 -10.313 c --15.183 -10.313 l --6.732 -10.313 5.866 -12.302 6.918 -0.574 c -7.265 3.301 0.37 4.129 0 0 c -f -Q - endstream endobj 999 0 obj <>/ExtGState<>/Font<>/ProcSet[/PDF/Text]>>/Subtype/Form>>stream -BT -/CS0 cs 0 0 0 scn -/GS0 gs -/TT0 1 Tf -0 Tc 0 Tw 0 Ts 100 Tz 0 Tr 50.8829 0 0 29.7657 593.707 455.5918 Tm -(5)Tj -ET - endstream endobj 1000 0 obj <>/ExtGState<>>>/Subtype/Form>>stream -/CS0 cs 1 1 1 scn -/GS0 gs -q 1 0 0 1 294.668 197.6094 cm -0 0 m --4.182 0 l --4.182 13.368 l --9.363 13.368 l --9.363 16.518 l --8.639 16.498 -7.936 16.553 -7.258 16.68 c --6.581 16.808 -5.974 17.034 -5.434 17.357 c --4.894 17.682 -4.438 18.109 -4.064 18.638 c --3.691 19.169 -3.445 19.826 -3.328 20.611 c -0 20.611 l -h --3.951 32.089 2.696 -2.645 re --3.883 41.708 m --1.342 41.708 l --1.342 38.41 l --2.011 33.121 l --3.23 33.121 l --3.883 38.41 l -h -24.691 55.617 m --30.925 55.617 l --35.442 55.617 -39.104 51.956 -39.104 47.438 c --39.104 -8.179 l --39.104 -12.695 -35.442 -16.358 -30.925 -16.358 c -24.691 -16.358 l -29.209 -16.358 32.871 -12.695 32.871 -8.179 c -32.871 47.438 l -32.871 51.956 29.209 55.617 24.691 55.617 c -f -Q -q 1 0 0 1 379.8506 197.6094 cm -0 0 m --15.135 0 l --15.135 1.197 -14.963 2.237 -14.619 3.122 c --14.276 4.005 -13.81 4.794 -13.221 5.491 c --12.631 6.188 -11.939 6.831 -11.145 7.42 c --10.35 8.009 -9.511 8.607 -8.628 9.216 c --8.176 9.53 -7.695 9.85 -7.185 10.173 c --6.675 10.497 -6.208 10.855 -5.786 11.247 c --5.363 11.641 -5.011 12.082 -4.726 12.572 c --4.441 13.063 -4.299 13.623 -4.299 14.251 c --4.299 15.252 -4.589 16.032 -5.167 16.592 c --5.747 17.152 -6.488 17.432 -7.391 17.432 c --8 17.432 -8.515 17.289 -8.937 17.004 c --9.359 16.719 -9.697 16.346 -9.953 15.885 c --10.207 15.423 -10.39 14.914 -10.497 14.354 c --10.604 13.795 -10.659 13.24 -10.659 12.69 c --14.663 12.69 l --14.703 13.868 -14.565 14.962 -14.251 15.973 c --13.938 16.985 -13.466 17.868 -12.837 18.624 c --12.209 19.379 -11.42 19.968 -10.468 20.39 c --9.516 20.812 -8.422 21.023 -7.185 21.023 c --6.242 21.023 -5.345 20.876 -4.49 20.582 c --3.636 20.288 -2.886 19.865 -2.237 19.315 c --1.59 18.766 -1.075 18.089 -0.691 17.283 c --0.31 16.479 -0.117 15.576 -0.117 14.576 c --0.117 13.534 -0.284 12.642 -0.618 11.896 c --0.952 11.149 -1.394 10.487 -1.943 9.907 c --2.493 9.329 -3.116 8.804 -3.813 8.332 c --4.51 7.861 -5.212 7.395 -5.918 6.935 c --6.625 6.473 -7.313 5.978 -7.979 5.447 c --8.647 4.917 -9.236 4.299 -9.746 3.593 c -0 3.593 l -h --12.983 38.928 m --12.641 39.712 -12.171 40.391 -11.574 40.963 c --10.979 41.535 -10.287 41.988 -9.496 42.32 c --8.706 42.652 -7.865 42.818 -6.972 42.818 c --6.193 42.818 -5.443 42.692 -4.722 42.44 c --4 42.188 -3.364 41.836 -2.814 41.384 c --2.266 40.932 -1.825 40.382 -1.493 39.735 c --1.161 39.088 -0.994 38.37 -0.994 37.58 c --0.994 36.697 -1.151 35.941 -1.467 35.312 c --1.782 34.682 -2.16 34.167 -2.601 33.767 c --3.042 33.366 -3.488 33.07 -3.94 32.882 c --4.393 32.693 -4.756 32.598 -5.03 32.598 c --5.397 32.598 -5.692 32.689 -5.916 32.873 c --6.139 33.057 -6.263 33.292 -6.285 33.578 c --6.319 33.578 l --6.524 33.233 -6.794 32.981 -7.127 32.822 c --7.459 32.662 -7.808 32.581 -8.174 32.581 c --8.541 32.581 -8.887 32.658 -9.214 32.813 c --9.539 32.968 -9.826 33.179 -10.072 33.448 c --10.318 33.717 -10.514 34.03 -10.655 34.385 c --10.799 34.739 -10.871 35.117 -10.871 35.519 c --10.871 36.057 -10.782 36.588 -10.604 37.116 c --10.427 37.642 -10.175 38.112 -9.849 38.524 c --9.523 38.936 -9.127 39.269 -8.663 39.52 c --8.2 39.772 -7.688 39.898 -7.127 39.898 c --6.76 39.898 -6.383 39.809 -5.993 39.631 c --5.604 39.454 -5.312 39.143 -5.117 38.696 c --4.842 39.623 l --3.434 39.623 l --4.516 35.192 l --4.55 35.077 -4.582 34.955 -4.61 34.823 c --4.639 34.69 -4.653 34.568 -4.653 34.453 c --4.653 34.338 -4.631 34.244 -4.584 34.169 c --4.539 34.095 -4.464 34.058 -4.361 34.058 c --4.121 34.058 -3.877 34.135 -3.632 34.29 c --3.385 34.445 -3.167 34.663 -2.979 34.942 c --2.79 35.224 -2.635 35.558 -2.515 35.948 c --2.395 36.336 -2.334 36.761 -2.334 37.219 c --2.334 37.906 -2.455 38.51 -2.694 39.031 c --2.936 39.552 -3.265 39.992 -3.683 40.353 c --4.101 40.714 -4.593 40.986 -5.16 41.168 c --5.726 41.352 -6.337 41.444 -6.989 41.444 c --7.721 41.444 -8.389 41.315 -8.99 41.058 c --9.591 40.799 -10.104 40.444 -10.527 39.992 c --10.951 39.54 -11.277 39.002 -11.506 38.378 c --11.734 37.753 -11.85 37.082 -11.85 36.36 c --11.85 35.604 -11.724 34.92 -11.472 34.308 c --11.22 33.695 -10.871 33.168 -10.425 32.727 c --9.978 32.287 -9.443 31.946 -8.818 31.706 c --8.194 31.464 -7.516 31.345 -6.782 31.345 c --6.062 31.345 -5.378 31.468 -4.73 31.714 c --4.084 31.959 -3.537 32.306 -3.09 32.753 c --1.647 32.753 l --2.23 31.859 -2.981 31.175 -3.897 30.7 c --4.813 30.226 -5.81 29.988 -6.886 29.988 c --7.802 29.988 -8.66 30.148 -9.462 30.469 c --10.264 30.789 -10.966 31.236 -11.566 31.809 c --12.167 32.38 -12.641 33.059 -12.983 33.843 c --13.327 34.628 -13.499 35.478 -13.499 36.394 c --13.499 37.299 -13.327 38.143 -12.983 38.928 c -19.665 55.617 m --35.953 55.617 l --40.471 55.617 -44.133 51.956 -44.133 47.438 c --44.133 -8.179 l --44.133 -12.695 -40.471 -16.358 -35.953 -16.358 c -19.665 -16.358 l -24.182 -16.358 27.844 -12.695 27.844 -8.179 c -27.844 47.438 l -27.844 51.956 24.182 55.617 19.665 55.617 c -f -Q -q 1 0 0 1 372.8613 235.8765 cm -0 0 m --0.31 0 -0.595 -0.078 -0.858 -0.233 c --1.122 -0.387 -1.348 -0.588 -1.537 -0.833 c --1.726 -1.08 -1.872 -1.352 -1.975 -1.649 c --2.078 -1.948 -2.129 -2.24 -2.129 -2.526 c --2.129 -2.984 -2.006 -3.353 -1.76 -3.633 c --1.515 -3.914 -1.19 -4.055 -0.79 -4.055 c --0.48 -4.055 -0.197 -3.974 0.06 -3.814 c -0.318 -3.653 0.541 -3.451 0.73 -3.204 c -0.919 -2.957 1.064 -2.68 1.168 -2.371 c -1.271 -2.062 1.323 -1.758 1.323 -1.46 c -1.323 -1.037 1.194 -0.688 0.937 -0.413 c -0.68 -0.138 0.367 0 0 0 c -f -Q -q 1 0 0 1 458.6426 201.084 cm -0 0 m --0.423 -0.845 -0.987 -1.551 -1.692 -2.12 c --2.399 -2.69 -3.214 -3.122 -4.137 -3.416 c --5.061 -3.71 -6.021 -3.857 -7.022 -3.857 c --8.181 -3.857 -9.236 -3.69 -10.188 -3.356 c --11.14 -3.023 -11.949 -2.537 -12.617 -1.899 c --13.285 -1.262 -13.8 -0.481 -14.162 0.441 c --14.526 1.364 -14.698 2.424 -14.678 3.621 c --10.703 3.621 l --10.685 3.071 -10.596 2.547 -10.438 2.046 c --10.281 1.546 -10.056 1.113 -9.761 0.75 c --9.467 0.388 -9.099 0.098 -8.657 -0.118 c --8.216 -0.334 -7.69 -0.441 -7.082 -0.441 c --6.14 -0.441 -5.345 -0.151 -4.697 0.426 c --4.049 1.006 -3.725 1.795 -3.725 2.798 c --3.725 3.581 -3.878 4.18 -4.181 4.593 c --4.485 5.006 -4.873 5.304 -5.345 5.491 c --5.814 5.678 -6.331 5.785 -6.89 5.814 c --7.449 5.845 -7.984 5.859 -8.495 5.859 c --8.495 8.804 l --8.043 8.764 -7.563 8.764 -7.052 8.804 c --6.542 8.843 -6.065 8.955 -5.624 9.142 c --5.183 9.329 -4.818 9.599 -4.535 9.952 c --4.25 10.306 -4.106 10.776 -4.106 11.366 c --4.106 12.249 -4.402 12.925 -4.99 13.397 c --5.579 13.868 -6.257 14.104 -7.022 14.104 c --8.083 14.104 -8.883 13.755 -9.422 13.058 c --9.962 12.361 -10.223 11.483 -10.202 10.424 c --14.178 10.424 l --14.138 11.483 -13.946 12.45 -13.604 13.324 c --13.26 14.197 -12.779 14.947 -12.161 15.576 c --11.542 16.203 -10.802 16.689 -9.938 17.034 c --9.074 17.376 -8.112 17.549 -7.052 17.549 c --6.228 17.549 -5.402 17.426 -4.579 17.181 c --3.754 16.935 -3.014 16.567 -2.355 16.076 c --1.698 15.585 -1.163 14.987 -0.751 14.28 c --0.339 13.574 -0.133 12.759 -0.133 11.837 c --0.133 10.835 -0.374 9.952 -0.854 9.187 c --1.335 8.421 -2.057 7.9 -3.018 7.626 c --3.018 7.566 l --1.88 7.312 -0.987 6.762 -0.339 5.918 c -0.309 5.073 0.633 4.063 0.633 2.885 c -0.633 1.806 0.422 0.844 0 0 c --11.369 31.734 m --9.737 31.734 l --9.429 33.864 l --10.854 33.864 l --10.854 35.41 l --9.222 35.41 l --8.741 38.811 l --7.075 38.811 l --7.557 35.41 l --5.891 35.41 l --5.427 38.811 l --3.761 38.811 l --4.225 35.41 l --2.953 35.41 l --2.953 33.864 l --4.447 33.864 l --4.74 31.734 l --3.47 31.734 l --3.47 30.189 l --4.963 30.189 l --5.427 26.787 l --7.093 26.787 l --6.629 30.189 l --8.278 30.189 l --8.759 26.787 l --10.426 26.787 l --9.944 30.189 l --11.369 30.189 l -h -21.027 52.143 m --34.591 52.143 l --39.107 52.143 -42.769 48.481 -42.769 43.963 c --42.769 -11.653 l --42.769 -16.17 -39.107 -19.833 -34.591 -19.833 c -21.027 -19.833 l -25.544 -19.833 29.206 -16.17 29.206 -11.653 c -29.206 43.963 l -29.206 48.481 25.544 52.143 21.027 52.143 c -f -Q -q 1 0 0 1 452.5293 234.9482 cm -0 0 m --1.649 0 l --1.959 -2.13 l --0.292 -2.13 l -h -f -Q -q 1 0 0 1 533.5742 238.4175 cm -0 0 m --0.195 0 -0.384 -0.028 -0.567 -0.085 c --0.75 -0.143 -0.916 -0.231 -1.064 -0.352 c --1.215 -0.472 -1.332 -0.621 -1.417 -0.799 c --1.504 -0.977 -1.546 -1.185 -1.546 -1.425 c --1.546 -1.803 -1.426 -2.094 -1.186 -2.301 c --0.944 -2.507 -0.55 -2.673 0 -2.799 c -h -f -Q -q 1 0 0 1 535.833 230.0537 cm -0 0 m -0.177 0.136 0.323 0.305 0.438 0.506 c -0.552 0.707 0.609 0.944 0.609 1.22 c -0.609 1.666 0.469 2 0.188 2.224 c --0.092 2.447 -0.57 2.65 -1.245 2.833 c --1.245 -0.464 l --1.039 -0.442 -0.824 -0.393 -0.602 -0.318 c --0.377 -0.243 -0.178 -0.138 0 0 c -f -Q -q 1 0 0 1 528.1758 205.8242 cm -0 0 m -5.418 0 l -5.418 7.155 l -5.329 7.155 l -h -f -Q -q 1 0 0 1 540.3076 202.3799 cm -0 0 m --2.738 0 l --2.738 -4.771 l --6.714 -4.771 l --6.714 0 l --15.43 0 l --15.43 3.827 l --6.479 15.841 l --2.738 15.841 l --2.738 3.444 l -0 3.444 l -h --6.966 30.876 m --7.063 30.905 -7.169 30.931 -7.283 30.954 c --7.707 31.068 -8.125 31.203 -8.537 31.357 c --8.949 31.512 -9.318 31.718 -9.645 31.977 c --9.972 32.233 -10.232 32.554 -10.426 32.938 c --10.621 33.321 -10.719 33.799 -10.719 34.372 c --10.719 34.956 -10.606 35.472 -10.384 35.917 c --10.16 36.364 -9.865 36.74 -9.499 37.043 c --9.133 37.346 -8.709 37.581 -8.229 37.747 c --7.747 37.913 -7.248 38.013 -6.733 38.047 c --6.733 39.37 l --5.72 39.37 l --5.72 38.047 l --5.205 37.991 -4.722 37.878 -4.269 37.713 c --3.817 37.546 -3.418 37.318 -3.075 37.026 c --2.731 36.734 -2.45 36.37 -2.233 35.935 c --2.016 35.5 -1.89 34.984 -1.855 34.389 c --4.294 34.389 l --4.306 34.847 -4.449 35.237 -4.724 35.557 c --4.999 35.877 -5.331 36.038 -5.72 36.038 c --5.72 32.998 l --5.583 32.963 -5.442 32.929 -5.299 32.894 c --5.155 32.86 -5.004 32.82 -4.845 32.774 c --3.997 32.546 -3.344 32.262 -2.886 31.925 c --2.428 31.586 -2.09 31.234 -1.872 30.868 c --1.655 30.501 -1.526 30.135 -1.486 29.768 c --1.445 29.402 -1.426 29.076 -1.426 28.79 c --1.426 28.538 -1.488 28.22 -1.615 27.837 c --1.741 27.453 -1.968 27.078 -2.294 26.711 c --2.619 26.345 -3.058 26.019 -3.607 25.733 c --4.157 25.446 -4.861 25.275 -5.72 25.217 c --5.72 23.757 l --6.733 23.757 l --6.733 25.217 l --8.016 25.309 -9.018 25.704 -9.739 26.402 c --10.461 27.101 -10.879 28.126 -10.993 29.477 c --8.571 29.477 l --8.583 28.825 -8.411 28.309 -8.056 27.931 c --7.701 27.553 -7.261 27.313 -6.733 27.209 c --6.733 30.799 l --6.791 30.822 -6.869 30.848 -6.966 30.876 c -19.517 50.847 m --36.101 50.847 l --40.618 50.847 -44.28 47.185 -44.28 42.667 c --44.28 -12.949 l --44.28 -17.466 -40.618 -21.129 -36.101 -21.129 c -19.517 -21.129 l -24.034 -21.129 27.695 -17.466 27.695 -12.949 c -27.695 42.667 l -27.695 47.185 24.034 50.847 19.517 50.847 c -f -Q -q 1 0 0 1 615.7842 229.6836 cm -0 0 m -0.068 -0.211 0.178 -0.393 0.326 -0.541 c -0.475 -0.689 0.688 -0.764 0.962 -0.764 c -1.226 -0.764 1.435 -0.689 1.589 -0.541 c -1.744 -0.393 1.857 -0.211 1.933 0 c -2.007 0.212 2.053 0.436 2.07 0.67 c -2.087 0.905 2.096 1.114 2.096 1.296 c -2.096 1.469 2.087 1.672 2.07 1.907 c -2.053 2.142 2.01 2.364 1.94 2.577 c -1.872 2.789 1.767 2.972 1.623 3.127 c -1.479 3.28 1.282 3.358 1.031 3.358 c -0.755 3.358 0.541 3.289 0.386 3.152 c -0.232 3.015 0.114 2.842 0.034 2.637 c --0.046 2.431 -0.095 2.208 -0.111 1.968 c --0.129 1.726 -0.138 1.509 -0.138 1.314 c --0.138 1.131 -0.132 0.918 -0.12 0.679 c --0.109 0.438 -0.068 0.212 0 0 c -f -Q -q 1 0 0 1 619.7842 201.6582 cm -0 0 m --0.411 -0.913 -0.967 -1.704 -1.663 -2.371 c --2.36 -3.038 -3.171 -3.554 -4.092 -3.916 c --5.016 -4.279 -5.996 -4.451 -7.037 -4.432 c --8.038 -4.432 -8.995 -4.3 -9.907 -4.034 c --10.821 -3.77 -11.63 -3.362 -12.337 -2.813 c --13.043 -2.264 -13.608 -1.581 -14.03 -0.766 c --14.452 0.049 -14.673 0.996 -14.692 2.076 c --10.512 2.076 l --10.413 1.134 -10.061 0.383 -9.451 -0.177 c --8.843 -0.736 -8.067 -1.016 -7.125 -1.016 c --6.576 -1.016 -6.08 -0.903 -5.639 -0.678 c --5.196 -0.452 -4.823 -0.157 -4.52 0.206 c --4.215 0.569 -3.979 0.991 -3.813 1.472 c --3.646 1.953 -3.563 2.448 -3.563 2.959 c --3.563 3.488 -3.641 3.99 -3.799 4.461 c --3.955 4.932 -4.191 5.344 -4.505 5.697 c --4.819 6.051 -5.191 6.325 -5.623 6.521 c --6.055 6.718 -6.557 6.816 -7.125 6.816 c --7.872 6.816 -8.479 6.684 -8.951 6.419 c --9.422 6.154 -9.863 5.736 -10.275 5.167 c --14.045 5.167 l --12.013 16.563 l --0.5 16.563 l --0.5 13.117 l --9.01 13.117 l --9.834 8.436 l --9.775 8.376 l --9.206 8.945 -8.598 9.354 -7.95 9.599 c --7.303 9.844 -6.565 9.968 -5.741 9.968 c --4.721 9.968 -3.818 9.78 -3.032 9.408 c --2.247 9.034 -1.585 8.534 -1.045 7.906 c --0.505 7.277 -0.093 6.536 0.192 5.684 c -0.476 4.828 0.619 3.921 0.619 2.959 c -0.619 1.898 0.413 0.913 0 0 c --14.58 36.398 m --14.466 36.811 -14.289 37.171 -14.048 37.48 c --13.808 37.79 -13.505 38.033 -13.138 38.211 c --12.771 38.388 -12.337 38.478 -11.833 38.478 c --11.295 38.478 -10.848 38.386 -10.492 38.203 c --10.138 38.019 -9.849 37.77 -9.624 37.456 c --9.402 37.141 -9.245 36.771 -9.152 36.347 c --9.062 35.924 -9.016 35.478 -9.016 35.008 c --9.016 34.538 -9.073 34.106 -9.188 33.711 c --9.301 33.316 -9.477 32.975 -9.711 32.689 c --9.946 32.403 -10.246 32.179 -10.613 32.019 c --10.979 31.859 -11.414 31.779 -11.918 31.779 c --12.445 31.779 -12.889 31.861 -13.249 32.027 c --13.609 32.194 -13.902 32.422 -14.125 32.715 c --14.349 33.007 -14.51 33.355 -14.606 33.763 c --14.703 34.168 -14.752 34.606 -14.752 35.076 c --14.752 35.545 -14.695 35.986 -14.58 36.398 c --3.106 38.615 m --10.184 25.853 l --11.678 25.853 l --4.566 38.615 l -h --1.63 32.405 m --1.274 32.228 -0.985 31.987 -0.762 31.684 c --0.54 31.38 -0.382 31.023 -0.29 30.611 c --0.198 30.198 -0.152 29.757 -0.152 29.288 c --0.152 28.818 -0.21 28.383 -0.325 27.983 c --0.438 27.582 -0.614 27.232 -0.849 26.935 c --1.083 26.638 -1.383 26.405 -1.75 26.239 c --2.116 26.073 -2.551 25.991 -3.055 25.991 c --3.582 25.991 -4.025 26.077 -4.387 26.248 c --4.747 26.42 -5.04 26.657 -5.263 26.961 c --5.485 27.264 -5.646 27.623 -5.743 28.035 c --5.84 28.446 -5.89 28.887 -5.89 29.356 c --5.89 29.826 -5.833 30.261 -5.718 30.663 c --5.604 31.063 -5.426 31.412 -5.185 31.709 c --4.944 32.008 -4.642 32.243 -4.274 32.415 c --3.908 32.586 -3.474 32.672 -2.969 32.672 c --2.432 32.672 -1.985 32.583 -1.63 32.405 c -20.194 51.568 m --35.423 51.568 l --39.939 51.568 -43.602 47.907 -43.602 43.389 c --43.602 -12.228 l --43.602 -16.744 -39.939 -20.407 -35.423 -20.407 c -20.194 -20.407 l -24.712 -20.407 28.374 -16.744 28.374 -12.228 c -28.374 43.389 l -28.374 47.907 24.712 51.568 20.194 51.568 c -f -Q -q 1 0 0 1 606.9219 235.438 cm -0 0 m -0.067 -0.2 0.177 -0.369 0.326 -0.507 c -0.475 -0.645 0.687 -0.712 0.961 -0.712 c -1.225 -0.712 1.434 -0.645 1.588 -0.507 c -1.743 -0.369 1.857 -0.2 1.932 0 c -2.007 0.2 2.052 0.413 2.069 0.635 c -2.086 0.858 2.095 1.062 2.095 1.246 c -2.095 1.417 2.086 1.625 2.069 1.872 c -2.052 2.119 2.009 2.356 1.94 2.584 c -1.871 2.814 1.766 3.009 1.622 3.169 c -1.479 3.329 1.282 3.409 1.029 3.409 c -0.755 3.409 0.541 3.335 0.386 3.187 c -0.231 3.037 0.113 2.854 0.034 2.636 c --0.046 2.419 -0.095 2.184 -0.112 1.932 c --0.129 1.68 -0.138 1.456 -0.138 1.262 c --0.138 1.078 -0.133 0.873 -0.12 0.644 c --0.109 0.415 -0.069 0.2 0 0 c -f -Q - endstream endobj 1001 0 obj <>/ExtGState<>>>/Subtype/Form>>stream -/CS0 cs 1 1 1 scn -/GS0 gs -q 1 0 0 1 96.4873 241.7026 cm -0 0 m -0 -0.76 l -0 -42.907 l -7.458 -33.453 8.954 -33.906 v -10.044 -34.236 17.858 -54.548 y -19.838 -54.797 22.068 -53.87 v -24.501 -52.856 25.479 -51.416 y -17.234 -32.056 17.234 -30.968 v -17.234 -29.847 29.215 -28.858 y -h -f -Q - endstream endobj 1002 0 obj <>/Font<>/ProcSet[/PDF/Text]>>/Subtype/Form>>stream -BT -1 g -/GS0 gs -/TT0 1 Tf -0 Tc 0 Tw 0 Ts 100 Tz 0 Tr 29.4446 0 0 29.4446 165.0234 205.6152 Tm -(OR)Tj -ET -1 G -5 w 10 M 0 j 0 J []0 d -q 1 0 0 1 188.4927 252.9888 cm -0 0 m -0 -18.502 l -B -Q -q 1 0 0 1 188.4927 199.9902 cm -0 0 m -0 -18.501 l -B -Q - endstream endobj 1003 0 obj <>/ExtGState<>/Font<>/ProcSet[/PDF/Text]>>/Subtype/Form>>stream -BT -/CS0 cs 0 0 0 scn -/GS0 gs -/TT0 1 Tf -0 Tc 0 Tw 0 Ts 100 Tz 0 Tr 50.8829 0 0 29.7657 281.6646 455.5918 Tm -(1)Tj -ET - endstream endobj 1004 0 obj <>/ExtGState<>>>/Subtype/Form>>stream -/CS0 cs 1 1 1 scn -/GS0 gs -q 1 0 0 1 411.7012 469.7349 cm -0 0 m -0 3.626 -7.177 15.042 -10.804 15.042 c --63.98 15.042 l --67.606 15.042 -75.491 3.626 -75.491 0 c --75.491 -40.698 l --75.491 -44.324 -72.551 -47.263 -68.926 -47.263 c --6.564 -47.263 l --2.938 -47.263 0 -44.324 0 -40.698 c -h -f -Q -0.137 0.122 0.125 scn -q 1 0 0 1 414.3506 470.7065 cm -0 0 m --0.467 5.572 -6.563 17.125 -12.772 17.993 c --16.658 18.536 -20.889 18.068 -24.8 18.068 c --65.638 18.068 l --71.831 18.068 -76.124 10.385 -78.762 5.696 c --81.305 1.175 -80.851 -3.405 -80.851 -8.378 c --80.851 -31.603 l --80.851 -36.104 -81.883 -42.853 -79.64 -46.985 c --77.115 -51.634 -73.143 -52.232 -68.467 -52.232 c --52.216 -52.232 l --13.091 -52.232 l --8.641 -52.232 -5.1 -52.048 -1.953 -48.234 c -0.944 -44.721 0.061 -38.497 0.061 -34.263 c -0.061 -1.066 l -0.061 3.839 -5.359 4.082 -5.359 -0.877 c --5.359 -37.592 l --5.359 -41.575 l --5.359 -44.603 -9.508 -44.237 -11.437 -44.237 c --29.509 -44.237 l --70.157 -44.237 l --76.126 -44.237 -75.431 -40.267 -75.431 -35.771 c --75.431 -12.803 l --75.431 -2.136 l --75.431 1.55 -71.734 5.678 -69.251 8.223 c --67.237 10.287 -66.16 10.073 -63.539 10.073 c --50.872 10.073 l --20.457 10.073 l --13.617 10.073 l --10.243 10.073 -5.536 0.886 -5.299 -1.943 c --4.856 -7.231 0.356 -4.251 0 0 c -f -Q - endstream endobj 1005 0 obj <>/ExtGState<>>>/Subtype/Form>>stream -/CS0 cs 1 1 1 scn -/GS0 gs -q 1 0 0 1 404.0566 453.6816 cm -0 0 m -0 -3.837 -3.109 -6.948 -6.946 -6.948 c --54.188 -6.948 l --58.024 -6.948 -61.136 -3.837 -61.136 0 c --61.136 24.315 l --61.136 28.152 -58.024 31.263 -54.188 31.263 c --6.946 31.263 l --3.109 31.263 0 28.152 0 24.315 c -h -f -Q -0.137 0.122 0.125 scn -q 1 0 0 1 400.5977 453.9688 cm -0 0 m --0.549 -6.124 -10.108 -4.156 -14.25 -4.156 c --38.15 -4.156 l --47.103 -4.156 l --48.661 -4.156 -50.96 -4.49 -52.434 -3.79 c --54.885 -2.626 -54.218 1.628 -54.218 3.794 c --54.218 15.932 l --54.218 20.525 -55.576 27.897 -49.1 27.897 c --29.634 27.897 l --7.693 27.897 l --3.55 27.897 l -0.559 27.897 0 23.466 0 20.7 c -0 0 l -0 -3.895 6.918 -4.719 6.918 -0.574 c -6.918 17.727 l -6.918 24.599 6.808 31.532 -1.286 33.754 c --5.498 34.911 -10.831 34.054 -15.113 34.054 c --39.034 34.054 l --43.608 34.054 -48.271 34.321 -52.834 33.913 c --61.132 33.168 -61.136 24.432 -61.136 18.302 c --61.136 0 l --61.136 -7.363 -54.51 -10.313 -48.217 -10.313 c --15.183 -10.313 l --6.732 -10.313 5.867 -12.302 6.918 -0.574 c -7.265 3.301 0.37 4.129 0 0 c -f -Q - endstream endobj 1006 0 obj <>/ExtGState<>/Font<>/ProcSet[/PDF/Text]>>/Subtype/Form>>stream -BT -/CS0 cs 0 0 0 scn -/GS0 gs -/TT0 1 Tf -0 Tc 0 Tw 0 Ts 100 Tz 0 Tr 50.8829 0 0 29.7657 360.0918 455.5918 Tm -(2)Tj -ET - endstream endobj 1007 0 obj <>/ExtGState<>>>/Subtype/Form>>stream -/CS0 cs 1 1 1 scn -/GS0 gs -q 1 0 0 1 489.2959 469.7349 cm -0 0 m -0 3.626 -7.178 15.042 -10.805 15.042 c --63.982 15.042 l --67.606 15.042 -75.492 3.626 -75.492 0 c --75.492 -40.698 l --75.492 -44.324 -72.552 -47.263 -68.927 -47.263 c --6.565 -47.263 l --2.939 -47.263 0 -44.324 0 -40.698 c -h -f -Q -0.137 0.122 0.125 scn -q 1 0 0 1 491.9453 470.7065 cm -0 0 m --0.467 5.572 -6.564 17.125 -12.773 17.993 c --16.659 18.536 -20.89 18.068 -24.801 18.068 c --65.64 18.068 l --71.833 18.068 -76.125 10.384 -78.763 5.696 c --81.306 1.175 -80.852 -3.405 -80.852 -8.378 c --80.852 -31.603 l --80.852 -36.104 -81.884 -42.853 -79.641 -46.985 c --77.116 -51.634 -73.144 -52.232 -68.468 -52.232 c --52.217 -52.232 l --13.092 -52.232 l --8.642 -52.232 -5.101 -52.048 -1.953 -48.234 c -0.945 -44.722 0.061 -38.497 0.061 -34.263 c -0.061 -1.066 l -0.061 3.839 -5.359 4.082 -5.359 -0.877 c --5.359 -37.592 l --5.359 -41.575 l --5.359 -44.603 -9.509 -44.237 -11.438 -44.237 c --29.51 -44.237 l --70.158 -44.237 l --76.127 -44.237 -75.432 -40.267 -75.432 -35.771 c --75.432 -12.803 l --75.432 -2.136 l --75.432 1.55 -71.735 5.678 -69.252 8.223 c --67.238 10.287 -66.162 10.073 -63.541 10.073 c --50.874 10.073 l --20.459 10.073 l --13.618 10.073 l --10.244 10.073 -5.536 0.887 -5.299 -1.943 c --4.856 -7.231 0.356 -4.251 0 0 c -f -Q - endstream endobj 1008 0 obj <>/ExtGState<>>>/Subtype/Form>>stream -/CS0 cs 1 1 1 scn -/GS0 gs -q 1 0 0 1 481.6504 453.6816 cm -0 0 m -0 -3.837 -3.109 -6.948 -6.946 -6.948 c --54.188 -6.948 l --58.025 -6.948 -61.137 -3.837 -61.137 0 c --61.137 24.315 l --61.137 28.152 -58.025 31.263 -54.188 31.263 c --6.946 31.263 l --3.109 31.263 0 28.152 0 24.315 c -h -f -Q -0.137 0.122 0.125 scn -q 1 0 0 1 478.1914 453.9688 cm -0 0 m --0.549 -6.124 -10.108 -4.156 -14.25 -4.156 c --38.15 -4.156 l --47.103 -4.156 l --48.662 -4.156 -50.96 -4.49 -52.435 -3.79 c --54.886 -2.626 -54.219 1.628 -54.219 3.794 c --54.219 15.932 l --54.219 20.526 -55.577 27.897 -49.1 27.897 c --29.634 27.897 l --7.693 27.897 l --3.55 27.897 l -0.559 27.897 0 23.466 0 20.7 c -0 0 l -0 -3.895 6.918 -4.719 6.918 -0.574 c -6.918 17.727 l -6.918 24.599 6.808 31.532 -1.286 33.754 c --5.498 34.911 -10.831 34.054 -15.113 34.054 c --39.034 34.054 l --43.608 34.054 -48.271 34.321 -52.834 33.913 c --61.133 33.168 -61.137 24.432 -61.137 18.302 c --61.137 0 l --61.137 -7.364 -54.511 -10.313 -48.217 -10.313 c --15.183 -10.313 l --6.732 -10.313 5.867 -12.302 6.918 -0.574 c -7.265 3.301 0.37 4.129 0 0 c -f -Q - endstream endobj 1009 0 obj <>/ExtGState<>/Font<>/ProcSet[/PDF/Text]>>/Subtype/Form>>stream -BT -/CS0 cs 0 0 0 scn -/GS0 gs -/TT0 1 Tf -0 Tc 0 Tw 0 Ts 100 Tz 0 Tr 50.8829 0 0 29.7657 437.6846 455.5918 Tm -(3)Tj -ET - endstream endobj 1010 0 obj <>/ExtGState<>>>/Subtype/Form>>stream -/CS0 cs 1 1 1 scn -/GS0 gs -q 1 0 0 1 567.7236 469.7349 cm -0 0 m -0 3.626 -7.178 15.042 -10.805 15.042 c --63.981 15.042 l --67.606 15.042 -75.492 3.626 -75.492 0 c --75.492 -40.698 l --75.492 -44.324 -72.551 -47.263 -68.927 -47.263 c --6.565 -47.263 l --2.939 -47.263 0 -44.324 0 -40.698 c -h -f -Q -0.137 0.122 0.125 scn -q 1 0 0 1 570.373 470.7065 cm -0 0 m --0.467 5.572 -6.564 17.125 -12.773 17.993 c --16.659 18.536 -20.89 18.068 -24.801 18.068 c --65.639 18.068 l --71.832 18.068 -76.125 10.384 -78.763 5.696 c --81.306 1.175 -80.852 -3.405 -80.852 -8.378 c --80.852 -31.603 l --80.852 -36.104 -81.884 -42.853 -79.64 -46.985 c --77.115 -51.634 -73.144 -52.232 -68.468 -52.232 c --52.217 -52.232 l --13.092 -52.232 l --8.642 -52.232 -5.101 -52.048 -1.953 -48.234 c -0.945 -44.722 0.061 -38.497 0.061 -34.263 c -0.061 -1.066 l -0.061 3.839 -5.359 4.082 -5.359 -0.877 c --5.359 -37.592 l --5.359 -41.575 l --5.359 -44.603 -9.509 -44.237 -11.438 -44.237 c --29.51 -44.237 l --70.158 -44.237 l --76.127 -44.237 -75.432 -40.266 -75.432 -35.771 c --75.432 -12.803 l --75.432 -2.136 l --75.432 1.55 -71.734 5.678 -69.251 8.223 c --67.238 10.287 -66.161 10.073 -63.54 10.073 c --50.873 10.073 l --20.459 10.073 l --13.618 10.073 l --10.244 10.073 -5.536 0.887 -5.299 -1.943 c --4.856 -7.231 0.356 -4.251 0 0 c -f -Q - endstream endobj 1032 0 obj <> endobj 991 0 obj <> endobj 990 0 obj [/ICCBased 1033 0 R] endobj 1033 0 obj <>stream -HyTSwoɞc [5laQIBHADED2mtFOE.c}08׎8GNg9w߽'0 ֠Jb  - 2y.-;!KZ ^i"L0- @8(r;q7Ly&Qq4j|9 -V)gB0iW8#8wթ8_٥ʨQQj@&A)/g>'Kt;\ ӥ$պFZUn(4T%)뫔0C&Zi8bxEB;Pӓ̹A om?W= -x-[0}y)7ta>jT7@tܛ`q2ʀ&6ZLĄ?_yxg)˔zçLU*uSkSeO4?׸c. R ߁-25 S>ӣVd`rn~Y&+`;A4 A9=-tl`;~p Gp| [`L`< "A YA+Cb(R,*T2B- -ꇆnQt}MA0alSx k&^>0|>_',G!"F$H:R!zFQd?r 9\A&G rQ hE]a4zBgE#H *B=0HIpp0MxJ$D1D, VĭKĻYdE"EI2EBGt4MzNr!YK ?%_&#(0J:EAiQ(()ӔWT6U@P+!~mD eԴ!hӦh/']B/ҏӿ?a0nhF!X8܌kc&5S6lIa2cKMA!E#ƒdV(kel }}Cq9 -N')].uJr - wG xR^[oƜchg`>b$*~ :Eb~,m,-ݖ,Y¬*6X[ݱF=3뭷Y~dó ti zf6~`{v.Ng#{}}jc1X6fm;'_9 r:8q:˜O:ϸ8uJqnv=MmR 4 -n3ܣkGݯz=[==<=GTB(/S,]6*-W:#7*e^YDY}UjAyT`#D="b{ų+ʯ:!kJ4Gmt}uC%K7YVfFY .=b?SƕƩȺy چ k5%4m7lqlioZlG+Zz͹mzy]?uuw|"űNwW&e֥ﺱ*|j5kyݭǯg^ykEklD_p߶7Dmo꿻1ml{Mś nLl<9O[$h՛BdҞ@iءG&vVǥ8nRĩ7u\ЭD-u`ֲK³8%yhYѹJº;.! -zpg_XQKFAǿ=ȼ:ɹ8ʷ6˶5̵5͵6ζ7ϸ9к<Ѿ?DINU\dlvۀ܊ݖޢ)߯6DScs 2F[p(@Xr4Pm8Ww)Km endstream endobj 1031 0 obj <> endobj 983 0 obj <> endobj 1034 0 obj <> endobj 1035 0 obj <>stream -HwTTW{QQz{ͨX@4h[lKłŬBsP&1&*hTHfBAjΞ;}3PҀQ!aCUa1 ol0ZM̬$g5{&&L<;uyIL ;q=Z}~I] 8:O.7OJ $wYi3b!@qSC}zuzt|쒬BD$̘t>j@xqBblBlHOh}" \iʵ0x #9'iүπcĊDtdEpiN=pu iig:Ӯ3A6lw_v;a=r+| >pr!C>@!#S3"(_W'\wZ `2050u7܃#x JxJ{a XA mJ ]zzz/?` ʨbCl1`Sl[`Kl! ŷv  cFbO셽w8{Cp(>8 -G0c NX0'0 L1gb&,)8?y p1.U׸ *`>gXf-H/)R4D!͐HK\tB:),]HW.̑91WVg̛ ֔fX7"@l d`;!Y;>'|)_7m|7G%~[OT9MDN?FsP~$?U<@%R WF(#>%WS+JrL9)+Jr[U)bQjMP=U_O TeUU5V RCNj5BMP{8i5^oVii ьԌѤj%SqƧUT*6EF46#[^k䛿4r%#gj{) -#U/i6Vc 12#Fd$WQ2x+_0Fd)9#ҡ#Fٓg̃4dMX#HHYFFֲdd##x>'Yd$#k$W#FFiƽȄZ#X -OE0:Ї$aƽB!mF`h#nGm!+8{b8+6Ȧ*6B'ւȣUp9bKköl%5b/Ջbȇbt"t$'QO8Aq;t2V>LH].٫C{yLЃ:1oSN9dBl (l@N^e1r[lLSNȂzځt\Eu-e5tƮJ&Am \1R)RFx)FPInc:P_\}PH @A 9.!z`,ep:Xh},nZ9Q,Έ"z,oU?bnER8[p4?\*,W=ru5sYgE䚋gDiq1ݘWM/Lu2mj*J -2Rc1afZdZhloJ7F/Sho)Z6\EB[?QM?YX_\k20XېT:; .fS,ݗL^KߝZ)d]G.8;гySޔ7?)T8Uv/-yZn= =<}|eEh6jԤi-Z - m֦[w]-{ȞznzopԐÆ?⃑F;.z|̄X8)nH0qfR)s>܏祦} -^YeW\zu7lYǿM4Mڤ?BڤiI4I[J)4W` X@=;ԝْ;sN&@&l -X*e 28y*)IR3^?y>}侧_3}:r;~"u2~ӗ~3g_9ʫ߼ۋ_/y*>/Гא%=W3dg4Ec{,bGRySgfn$=Lta)۲Һlm%l[elM7KĽ$Ƕ=9̚}S"H?8<{!=-,R=%wE,HbۢSc䩈cf6Sm\50r^.D;S%JÞb@bM1yka aG|{FcQdbhRQZQLUHJ+ۡ(5M9N û`} |0æb$C p [s`x,Ã$3;Nrb6.nl)/TJ. k3%kUuInٍj&3Xƌoxk9?!kZ)>MZrq =Kpɼi.nt)`dS8$n +G3}'I/͛9Ⱥ."uO,`(zq`;<Dם*' kP "8Y- ij7u{M5z^WL}@ vwqGNU4Zݵkg5DF{]K-2hcZ{mvCSEn y} Wk{ݫ>3dUiS G*T ~ Ȼ@/ہ 0p8 TN*CiEUdtsx#׏~#qG\?׏~#qzx ~+w(R[a M$ɀӂFn8ˡic讎PlOpof*mE47Ȃz`<u6T`oЧ -MSEK+ "e쯙ɏK*-]2%@L.~39զ@0tzRǔɉefƍWx=g^i?&IMA#]A#4a頑頑頑頑頑NjA5bZ vԇJ`Jzt9Y$є.i Ʀ17 wXcKvCVKMo{,p"{YoO#N_:Ί#EI (7ˀ6Aq%rT^qU#ڈ-88ւc-8ւc-8ւc-8ւc-8ւc-8ւc-8=c*+l8iAS^Sh\hZ 2} ߽۰{||X=vGuۻur؞m}}H8 ⹊QXEjbXE**VQUTbXE**VeW PF+zTqZV=(,m? rk0¬md.ŅipH-.h*UT:?h  -*h ux݇rgDCUz嚘>>tsϴmYyzfD=X򖤏Pe]dU|zv\=8bS3m›cuCvw%׳6fmd1ɵ[LSwȏF_s|t ?rMQ ?}(JN ʧ5?r[y%7<*F-͏R%-f$I{ng-[E3F 1%{ υ0:10Z`;/81s/>1/+G{c=4^Jz)Edf7 c4$uO$yȯ 9f~bx}Z h;4?F{A 01vʅȳY Sg^K?gGTj*59ߟ R[$#O߰m94u vLi+OISnnaDPv#bU@l),ϗ|8SET+{)r0S`V9þoRQͿrrA:{}|:!stxNa9dL1}Y5{,f)lNzsd#]\3ff2%3ɒKdAfVw$aO^%!}*?uj^^ #oɘȀjW6=F|\Nz?̪mc0HfK٠ #ΰmebW`~6pȫKb.|}-"YS=vzJ8'VXZl?>!J1~u[tȃ zxz5/ZzeuLt`~DQ*e$;߃8hԴ ȫ\POTW-o>{܁1j3ES ^AA|iđ-j9&]znф>>ˠ/4ֆO~Cxyx_.¡#Cƪoœ[9ᾋ=Zy>Q[O{~"#sމC{D8?SU -R -\% ) UR; _&ng<ozԋ}A$DKߐ?6W3ੇƽƽ>u+Yq򉢡?/MDX+p YmA |؎p7j>}vbI ~nri3kKr!Krkl23?]k:yBAσgǹ< -xNɒ徹r^Ue@YK9\a~R\\kJ*QS9c4u+Sv2C'E:·澍s^=yxt6-V"/yh 2"{g";P'/*SAω -]_>.JU@]yTfQTh3@k}o{. Z({.gPO{dj>*+(U7Po7v>ugLu3a@%G1pkX -knz_.^pg{#_f_%^DBkBEsx NхYg6;_I}8գ @ @ @_ $DxDI"(~V#4z+P?Sry|H1Y%ZZ򚘢|XLV|(W$?IV.P5 j;%_ E)P;,yUܤ%yMkgpzHH h#&5 !\uX/l` -[/ pe<|9_`~ -=G IOf D|q1EDcuvHXG [u#ӊ6+n&vptѭTR7::ehf^:3#vwˆ[fr|^Rw̤EEwzRF,֧&FˊhD'TzNL8v4z -aFL1+bƓX>;[I=n$,INO;u5ci:j'yHyq}Z2vubaH&y s1qkt3%X0ػLjʻʄ-doWDmH{__2ev'['a;d%zָ׷,co0J;;R}fR}aCcc}Cs¦q&2M=; efqFXf 9}?Y&zy!4J!&AQHQ lM솼MB fEf"XP,X(JBa @⼛%~?{̝{S -B},{d]FV˽܌C˩lv*X~I";p1Ol 빾[<[ADh(UU_q,kbn #\ ,SL?Sg;-ri)mUY|a۾o */gq? /^^^v(!|6/P԰ʼn`$cL݈F{QD䠵3L6n_me&$Y BX)ɶBvWw96$Ŵq[]2YOmmfl -Mc"8"&f +Ї]<]CL`u `"}'2MȢ)t߬G5%b,g<MO=$Yvhr?z様e|V/pڅyOKj9[RפIY1SNJL!w>vl7?;Nh$ְs ;%D-6  Zp#qS{+XqNI82mpXI tř8 ݌^mq:~oع@c{E`.eW`8F$UVP# --QW1\-/eV-Wj5z pn-v܁񘀉ɸwn܃{q~G[ >g[1b~w -_'o=Gl.|/YYu_ـ ولMٌق-y8iY|>89y|O>縐.|/.| .R.rɷ+k|=nFnf!?O)?m۹;%-{#>7%yJR %jꨮS=W5T#5V5U35W :BG(cJ):VxuN)j6:Uj4+CjꠎYYuLn^ꭳG稯\:_hk.P]uR]ukBVrVUFJHQTQ*JUrVktt&ݬ[tnC5A5IuݺG>Mz@Sifhf!=GzBOjh)=gB=H/%WX57DKL -*:zG=mFmf>ڢO>ڪmB۵C;FAG{~>E7ClFlflg_K|؆ w~O vcbWoqqGq q'q -_88qKx)ARLcE+2^*W*^kx-_7FVe5Vg d-fMllƼMؔom̠N覇^UllYr[d2,fنmٮ[=;#;nvfve7{ٝ=ؓ؛}x|Qeٌs؟ >e@> X"`P>a|>'3Q1q|yN$NN49388s8/ey\W_|oq mwq9\\k?'\ s~/r7{n;?g/=}_yw!1 ) y^?.ѥ()MJt -]tѵNA7jjꨮnR=W5T#5jEtnSr%<'jjuZNe*,VDFmNw::nuVuU7ݣ{]=S[}tzPQULيr_ =U@= -T" ` P=azT='3Q1qzVyM$MM45]34S4[s4W/eyZWH^zSoimwiZZZkV>'Z TIEs}/j7V{mQ;S?g/ڭ=ګ}گ_u@w!1 )Sy]?WUH$41MiibT2MԺkY -v)/I.J%sRAX^h$T%R~!%˅JyX*_7da4sYv"$ -sT"?^ٿ(?'*ˍ\"*ىh 7̏(N$sEx*7:xU΀'=64uQ[%f:Mu֠T.VwFFhD‘t%&M忺mgߦ@YZa!Rr-aiKsXw۱v}:-itZӒd%,ee.pY:\umnp[Gmnp;v>ە⳽l/>KYϒ}d%~[:uoXG:u#+7=gQN+s9Sg3\6mg&lzʞ ú {8뽙5nt(}Yg|TfoYLK hqB53T0+y_3LS /2æA ^g{7h ~4,2, YO2}7d~1'2'2dacC61da3Y†1DÏ~#1Hu<]MmAa& otl^ФpN+++NRxgwI%6.X \ n54o|U6]6C=>G,bRBYH H1)f#l;w/bVRC 7o!|Cw0zVky˘|nC/oGn47ysgaeZP2Gq)&=.d=Ͳ[12B((%Wz#R"fEE -|5 2;տݯ4l=W -N,.>=91@ чM^GGG㓭|͊=N|mI~yy[ymM$n|M/ݝx.[t}|7i3IY-V$yzjU*~ͳ[l!ǪyZU͖a^Xx$ϞfFwj{ݜ̓]ȓ"I7d-]ɳǃɪ2-4 _m~*.~Wɷd%b/6xڄ<=+Bؐ;8. ɴ1m\iw;[ڔv%-mcIJmqz\^7:,:^͵WKG,γYp.񏽏__.ػXB dSU#jFlmĴ# zWCwUăh2>HN'ӑU&]9YIiNCf3gf E~с{}77c'˭?5Rs,>"ZdB:垻#{ns\GK񼤜fi>>-l^3z=N -OtV΢z֤f88>)'IYk];snw^ ׫W +7'!7np^K|QZAEV l-v?|G4ҩF,z˴,kƟR㣜?]?]?~?ULLk'n\=׶knj7Guٴw[?7ҹ:t*74۪[6i8ۮ]?'SX'<ߠFj~v?xtuln\p!{^ſ{W[fmd|؊g}W\qPЯ^C~-yĿ/˹ƔsiÛMr.,v]v&T-JNN8-nh[qE-&A#Y[3r}vrk6$k&'uCTzRzRדջԻg[­-b1ݚ.VX)&guäދދK^Ťދދ ^E\j(2D[D+%F'jNVLFz.։SW։SWU9VV9uUn]JJV%ގvK4Wn)i}#ϴ6x^O7+>,5{ljx[u6d={ٮ۠``CEXЃ߃߃߃߃߃߃σσσσσ'O~>}Y|||||||֧W+ -~_W+ -~_!w!a}x:?$H!C'7!]wOwF CQ-P2 +Ackq}~Jhf{onsk67nŞQ]{U^.c?MUqߪt7,ojL6*=+orLרMh6,܈ԦgHDhX#Rn5fyڕgUyY.hԖGDh%5ml5u/u[6z gk~t ŵ.=ٴ)ެ~fJwꡃlJ^4[v]{ 5 9L4 }KKxIOZ^x*]$I/Ie,2xI/ckx'^H&ױH5I%^Gk/:x'^Gk?:x&~&ޓL=O<4l^C=tCyxW1w?sIrn(a{;>M].ί}DgmƗhA \ I+֨:WZX;yr6gţ*v뗣T|ǹǧ'Jߎ==5z<7!e f9{ؔmͺfuWٰ^W>^ၽ{k;T`|0 endstream endobj 1030 0 obj <> endobj 1029 0 obj <> endobj 1028 0 obj <> endobj 1027 0 obj <> endobj 1026 0 obj <> endobj 1025 0 obj <> endobj 1024 0 obj <> endobj 1023 0 obj <> endobj 1022 0 obj <> endobj 1021 0 obj <> endobj 1020 0 obj <> endobj 1019 0 obj <> endobj 1018 0 obj <> endobj 1017 0 obj <> endobj 1016 0 obj <> endobj 1015 0 obj <> endobj 984 0 obj <> endobj 985 0 obj <> endobj 1038 0 obj [/View/Design] endobj 1039 0 obj <>>> endobj 1036 0 obj [/View/Design] endobj 1037 0 obj <>>> endobj 992 0 obj <> endobj 989 0 obj <> endobj 1040 0 obj <> endobj 1041 0 obj <>stream -%!PS-Adobe-3.0 %%Creator: Adobe Illustrator(R) 15.0 %%AI8_CreatorVersion: 15.1.0 %%For: (Daniel Christopher) () %%Title: (numbers.ai) %%CreationDate: 3/20/12 10:39 AM %%Canvassize: 16383 %%BoundingBox: -213 -262 493 374 %%HiResBoundingBox: -213 -262 493 374 %%DocumentProcessColors: Cyan Magenta Yellow Black %AI5_FileFormat 11.0 %AI12_BuildNumber: 39 %AI3_ColorUsage: Color %AI7_ImageSettings: 0 %%RGBProcessColor: 0 0 0 ([Registration]) %AI3_Cropmarks: -213 -262 493 374 %AI3_TemplateBox: 50.5 -50.5 50.5 -50.5 %AI3_TileBox: -238 -232 496 344 %AI3_DocumentPreview: None %AI5_ArtSize: 14400 14400 %AI5_RulerUnits: 6 %AI9_ColorModel: 1 %AI5_ArtFlags: 0 0 0 1 0 0 1 0 0 %AI5_TargetResolution: 800 %AI5_NumLayers: 2 %AI9_OpenToView: -920.3608 533.3804 0.6667 1246 732 18 0 0 43 154 0 0 0 1 1 0 1 1 0 1 %AI5_OpenViewLayers: 73 %%PageOrigin:-256 -446 %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 1042 0 obj <>stream -%%BoundingBox: -213 -262 493 374 %%HiResBoundingBox: -213 -262 493 374 %AI7_Thumbnail: 128 116 8 %%BeginData: 6610 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 %524C45FDFC27FDFC27FDFC27FDFC27FDFC27FDFC27FDFC27FDFC27FDFC27 %FDFC27FDC12752FD7F27A852FD7E27A8FD7E2752A852FD7927F87D7D2727 %FF522752A8FD772752FF7D27A85252FF52FD7427F827F82727A82752277D %5227F827F8FD0F27F827F827F8272027F827F8272727F827F82720272727 %F827F8272727F827F8FD0527F827F8272727F8272027F8272727F827F827 %F827F827F827272721272027F8FD1F27FD0552FD0527FD0552FD0E272052 %A8A8A8FF7D7DA8A8A87D27272052A8A8A8FD047DA8A87D202727277DFFA8 %FD047DA8A87DFD04277DA8A8FFA87D7DA8A8A8FD04277DFFA8A8527D7DA8 %A8A8FD1F27A8FFA8FFFF7DF827F827A8FFA8FFFF7DF8FD0B27F8277DFFA8 %AE7D5252FFA8FF7D27F82752FFA8A852A87D52A8FF7D27F82752FFA8A852 %A85252A8FF7D52F82727A8A8FFA87D277DA8FFA852202727A8A8FF527D7D %A8A8FFA852FD202752FD07275227522752FD0F277DA8FFA8FF527DA8FFA8 %7D2727277DA8FFA8FF7D527DFFA8A85227277DA8FFA8FFA87D52FFFFA827 %272752A8FFA8527D7D52FFA8A852522752A8FFA87D7D7D52A8FFA85252FD %1F27F82752A82752277DA827F827F8FD0D27202752FFA8A8A87D52FFA8FF %5252F82752A8A8A827527DA8A8FF7D52272752A8A8A852A87D527DFF7D52 %27274CA8A8A87D7D5252A8FF7D52272727A8A8A87DA8A8527DFFA852FD21 %2752FF7D27A87D27FFA8FD12277DFFFFA8FFA8A8A8FFFF7D27272776A8FF %A87D7DA87DFFFFA852272752A8FFA8A87DA8A8FFFFA827272752A8FD04FF %A8A8FFA8FF52522752A8FFA8A87DA8A8FFFFA85252FD1F27F852522727A8 %5227277DFD11275227A17DA87DA87DA87DA85252F84B4B7D7DA8A8A87DA8 %7DA852522727277D7DA87DA87DA87DA852522727277D7DA87DA87DA87DA8 %52522727277D7DA87DA87DA87DA87D52FD2527A87D2727F8FD1127527DFD %08524B7D7D27527DFD0A527D27527DFD085227527D27277DFD0A527D5227 %7DFD08524B527D52F8FD2327A852FD1327F8FD0D7DF852FD0C7D2052FD0B %7DA827277DA8FD097DA82727FD0B7DA852FD2427A87DFD14277DA87DA87D %A87DA87DA87DA87D2752A87DA87DA87DA87DA87DA87D2752A87DA87DA87D %A87DA87DA87D2727A8A8A87DA87DA87DA87DA8A85227A87DA87DA87DA87D %A87DA8A877F8FD232752FD1427F852FD0C7DF852FD0C7DF852FD0C7D2727 %FD0C7D2727FD0C7DFD3B2720FD1B2720FD1B2720FD4827F827F827F827F8 %27F827F8272727F827F827F827F827F827F8272727F827F827F827F827F8 %27F827F8272027F827F827F827F827F8272727F827F827F827F827F827F8 %27F8FDFC27FDFC27FDFC27FDFC27FDFC27FDFC27FDFC27FDFC27FDFC27FD %FC27FDFC27FDFC27FDFC27FDFC27FDE4275252FD0C277D527D527D527D52 %7D527D52272752527D527D527D527D527D5252F827527D527D527D527D52 %7D527D2727277D527D527D527D527D527D27272752527D527D527D527D52 %7D52FD2C27527DFD0B277DA8A87DA87DA8A8A87DA8A8A852527DA87DA87D %A87DA87DA87DA87D2752A87DA87DA8A8A87DA87DA8A85227A87DA87DA87D %A8A8A87DA8A8A8277DA8A87DA8A8A87DA87DA87DA852FD1A27F852FD0E27 %F85252FD0927F82752A87DA8FD077DA87D5227A87D7D7DA87D7D7DA8FD04 %7D27527DA87D7D7DA87D7D7DA87DA852277D7D7DA8FD077DA87D2752A8FD %077DA8FD047DF8FD1A277D7DFD0E27527DFD0B277D7DA87DA87D7D7DA87D %A87DA852527DA87DA87D7D52A87DA87DA87D2752A87DA87DA87D7D7DA87D %A87D7D27A87DA87DA87D7D7DA87DA87DA8277DA8A87DA87D7D7DA87DA87D %A852FD1A27F87DA87DFD1A2752A87DA8FD077DA87D5227A87D7D7DA87D7D %7DA8FD047D27527DA8FD057DA87DA87DA852277D7D7DA87D7D52FD047DA8 %7D2752A87D7D7DA87D7D7DA8FD047DFD1B2752A8A87DFD092752527D277D %7D7D52FD08277D7DA87DA87DA87DA87DA87DA852527DA87DA87DA87DA87D %A87DA87D2752A87DA87DA87DA87DA87DA8A85227A87DA87DA87DA87DA87D %A87DA8277D7DA87DA87DA87DA87DA87DA852FD1A27F8527DA87D7DFD0827 %7D27277D5252277DF8FD072752A87D7D7DA87D7D7DA87D7D7D52277D7DA8 %FD077DA87D7DF8FD047DA87D7D7DA87D7D7DA852277DA87D7D7DA87D7D7D %A87D7D7D2752A87DA87D7D52FD047DA87D52F8FD1A2752A87DA87D7DFD07 %277D2727FD047D52FD08277D7DA87DA87D5252A87DA87DA852527DA87DA8 %7D7D52527DA87DA87D2752A87DA87D7D527D7DA87DA8A85227A87DA87DA8 %7D5252A87DA87DA8277D7DA87DA87D5252A87DA87DA852FD1B277D7DA87D %FD0A277DFD0452277DFD082752A87D7D7DA852527DA87D7D7D5227A87DA8 %FD047D52A87DA87D7D27FD047DA87D7D52FD047DA852277DA8FD047D5252 %7DA87DA87D2752A87DA87D7D527D7DA87DA87D7DF8FD1A27525252A852FD %0A2752FD0D277D7DA87DA87D7D52A87DA87DA852527DA87DA87D7D527D7D %A87DA87D2752A87DA87D7D7D527DA87DA87D5227A87DA87DA8525252A87D %A87DA8277D7DA87DA87D7D527D7DA87DA852FD1C27F8277D7DFD0A27F852 %52FD0927F82752A87DA8FD077DA87D5227A87D7D7DA8525252A8FD047D27 %527DA8FD047D527D7DA87DA852277D7D7DA87DA8FD057DA87D2752A87D7D %7DA8527D7DA8FD047DF8FD1D277DA852FD0A27527DFD0B277D7DA87DA87D %A87DA87DA87DA852527DA87DA87DA87DA87DA87DA87D2752A87DA87DA8A8 %A87DA87DA87D7D27A87DA87DA87DA87DA87DA87DA8277DA8A87DA87DA87D %A87DA87DA852FD1F2752FD0A27F85252FD0B2752A87DA87DA87DA87DA87D %A87D5227A87DA87DA87DA87DA87DA87D7D27527DA87DA87DA87DA87DA87D %A827277DA87DA87DA87DA87DA87DA87D2752A87DA87DA87DA87DA87DA87D %52FD2C2752FD0B2752527D527D5252527DFD04522727277D5252527D5252 %527D527D27272752527D5252527D5252527D522727FD04527D5252527DFD %04522727527D5252527D5252527D5252FD2D27F8FD0B27F827F827F827F8 %27F827F827F8272727F827F827F827F827F827F8272727F827F827F827F8 %27F827F8272727F827F827F827F827F827F827F8272727F827F827F827F8 %27F827F8FDFC27FDFC27FDFC27FDFC27FDFC27FDFC27FDFC27FDFC27FDFC %27FDFC27FDFC27FDFC27FDFC27FDFC27FDFC27FDC7277D7D7DA87D7D7DA8 %7D7D7DA87D7D7DA87D7D7DA87D7D7DA87D7D7DA87D7D7DA87D7D7DA87D7D %7DA87D7D7DA87D7D7DA87D7D7DA87D7D7DA87D7D7DA87D7D7DA87D7D7DA8 %7D7D7DA87D7D7DA87D7D7DA87D7D7DA87D7D7DA87D7D7DA87D7D7DA87D7D %7DA87D7D7DA87D7D7DA87D7D7DA87D7D7DA87D7D7DA87D7D7DA87D7D7DA8 %%EndData endstream endobj 1043 0 obj <>stream -%AI12_CompressedDataxy\Ǖ' w{0}1 dfeQhe$655"%׬ĬS7#v9=ۿx3av~v|}w/wDݛbgㅁ*_˃{/Ox˻/߼}z_~ _={q,su/ng/}>͛l/hw/^>~{x_9B;<_>u/_?={t/wowrv:|-{y74P0(kWocG򻻷oU!a|' R{KUT}9H^@Fsw<" I;>w}y_~xðw_b\κv^j-x us;X+֩e\_}/Ŵ{By/_inWRe{oel`5=,sAǧ7`]<’>_^M|wOo@]w.}};r55wo.tU-?rK]>7w~y۟Rϵ;ty_z׾ϼyٞy'~}}j>qWw]{޽||}{|7wq)^Wq^}w x}|{״eϟ^}K廷_ᦽ>.޾rFzw!ˇwKzN}z;~~}=]Zwwo%_<ߟ>GX]pڷ]qݍo0{x/_᛿yurϓ&.p<.]=?aR:/^%.6hm>}gvJ7FM߼-_v^/oZxwO.= 2Ns'_1WrU{WC}___|z3r6O׸nӆ-;z㷷=߾{ XĿ^>M?A߿F'd}f[ϗ^n|Wwӟmw6K{w{˗vy q8CA_&[,E8 ޾o.]c_zs8)^BõKdk|y -ҋZ.Aq6bM۹`{X_<}<0 %r7& -O^,Fv8@Bw/ށ0L?o@_gwOjܾ~UyxzGVK_;*rj O@Mwi?\zwxw?=ݷjj 6/<~nIXrV-+~NB[ l1 oz(_w߃8p4 NۧW~;wZx>{ךq?" -5ȈObZNԜ\9:K>d_c"R1PׇC5;f촚VjvR ht?a7? 9˧]vj3=}76* -#4E(G;+ !0 @A?+}"J0G&_ G -:QaL5s SSE`)7^Ӑc`Ԙ'X;!O2 -sOa`YڅEja ^JacbkXxjeåHIR1\쵔+)){./@ %>]_s\˾5?0PZי -5o;H&Q^ȟc+O&&lEѵK3HTd44pW@<L -@~qUzBa'bmKZpE;j,?NRrD%K\&z%,F34X0pU)d$%.JXMpj`O+`%rʧt!0OWWpWzU211'FaC"/«]`n'a?\@O +` xC˼fpጏ|ad, ܑC%?x8K-qqB!I' -©qJ p\CʁtO8pGZ8 -I^2luEhO'Rq4Yҟ,HRRRRT,8I^K RmY:T\I9Iv]ܰI9,I X}km\# .u^J`OUYrrr%$E٠2 Eގ%% % vPC9r5P{f' %4KJ~(B$ri(׽veġ䡔ԡ{X Xy7On2~5*bf?X$G(C~\ݤeDV-84&ɫpX$e2ٵV%<ų'5xVӊN&jd:*T,qo>BfR!GGPIsܣs܊I{jSl\E ->he+*G)WC96Y^U*oMT~CtE0'PQ'䟿 -yiU6qUƑkdA[*yUt%J(~UcJo2释Ӈʤ>H >L"p7>PfeYSSnr(W,k:.ĘV,oKE Y״$\Q9ň5e:)V2ɻVL YѺs a~VDe4ג&^O}EM`u+k#7W״X^絝AyBͨ鰞ZRY+8Ki7KF4 ޓ›PJR HW]|4r5sy<%DGzOA%uNٿjOA^"˱GL9چCm;jÿsՌ>_9c4"D<ًfv#1+<}yr2>WޟyI&M$Y r( ]N'8f ʖhu"Zrh)6+%JQgA!Pq{H;8hr*+T25<Ȍ@@m?*ϪJ}"}7֩+HRKI|E<\siUzX}k̰j 偟hp焅Zuk[][&[ v]vHa"ZKZc%ҍ(?IZT@nfn][WnݨMk'%oCo}=(]|tSsi -2)3g8g8g8g8+,b>Y>Y>E,,,|0e֐5e kY[6(* -o. ]i -t4Xx똗DB^f&Fz6тL͈xY䥩x=IE)/@•5hsyQ3۞:UHшHRUlvQA*Obz$yQQV*\'1sB 757:Kм@8%`7W@s躲gѬ?ֈ<7507vz= W7iC9,bcuȟ̄K,Y\Y>L[C? Bm4DD5 6Ƿ($c3]_۟j_㳖}t9>"Y̊eT\>͖|ΧJ'8εY޷|A6HOBw}]@%mj_yE~>7"RlVş[fAh?Lg - WxN \~Me%?L,&y~p>ocf91O~US?͚::kZx@A&WZew0o}*W`SCp {Xĩx7I܆V 8b?xԋmκcsVQPd X~U̫@]q-7,+#` -VUjlj[v26`YuiG{O --PT객(]#)R!DL0f.lSаvպ'GeeMke4RwD,maS#ʴi_O8 {.۸ݱk,Ϳ< J\G$xǂw4xCO3P ᲱFħXgs"gyAG8T!3 X%|=֥YGQF SR\gKik}o@9LW*C]O3 ')=!A l \08R!02CP4(qS 3 &ig05,e:a -FVVXFGg|f8b e۫2mEܧ}mA3>Vu;|1-MxFZXH2|p5X[$2'ق2^C%[غt;__A+zmH6}JN))4zP7rQ`[S#S?GxȟlBs'7o>nl9:>z\}F5_{n[ bZu!{g k+d8"ClUB3#Z ^K`+YڱAukד s{\qߛ_na4Dsyq -z^!lĮ^N H]Oh] hE7@W ߝ{hD|)f1zU Da&) AE.ݸ/de3ȸ,`a-qVfJ/`H9[yYc'󰊾dWYׁ }@ii5GcA9u9I$l;X&?ܷyC 5p$kHs'1 48G'dSC<"{Dβز- p -bPP§ /"^T#~MLj?hq4ΪE 7Zŏ[^(S?M'M[볦k2!gQݬ=cڟfUs)JJs_N4cht.ILsӊ#L%!cd n3nj!:"igZ؈ܰDS$c/~20,XIg'=v{zx˩9@ԁ!1i>ʁFn9>]ӌQf 6 Fa?{5n-nbGf6"# ,dy‡Phs!j,]o 1v߽{=}󖯛巏wo]eypf!1Od@gډRCD'e촚VjvZNk<. <|i|d)Z"I{Q\/r[$qc|Jf[!, <|L΂9-t<e:`ld|gPSc -WZ3DU]G&DN4mj31%v'ϵ' Q0-XYv@Ӓ*%Q%${Aq$C%SKth*Ocr?QG$4uhO&Thç!Aԅ -7 BYZ rP}1F#%u?RN jMw|*NQl|  ԖG!ݓP??+L'ʝЖ?<TW9! -gRJiW$5Q^:K}Lt+ҝ4#7 )CNΝHRTsY |=H>![Ps D4yb%1 t)X+Xh(*b7ƒe -U9MN՚*lsM 6ZBLuy$MYmlw] ?z]sT1V(I@UL.;I-\)C*sN^cB1ψ)P1pe:'x.@]qu(e/s~7ƕ,e44K4-0FV(32e<3k̴-lZAK~氿eR!ӆ^'cT]/;a? z 6G956'}P$4+AҨk5"n9ǰӶ5'ss%<cs'|j@}jp f$tTU3.uV;chd5~–X@0+a{:jPLu >?Чq~ @1 :'rFgԏ{ /Gk9jm\uL0&OHӐa acAh4Ř !i\,ULc&Ӟ%xH~lje*3*|hnG(Ool8qg(]7\O,!dj<9ESBj*PR"feYLyVr*6 - -Ս+q5hO\-=Iq:C_lK$DiŦј7\lڰ4v̓rMǵ$%' ׃\i+ץ+ o~ UKDKN#a&'fB0+WӪ,­ 9[l> -073Gn%H1y;t2m#\y$h'ڭ1LS --MijOs ZG~;C Ρ*?ejfQ~;tC{LO wt0D/˟vBOq} |/fq?2mz;PW]ɛba5_/%=RYYiS[>gZ?L_FgX*FG+Kjg|&Nu@bH\16LJÛɊi]hA{s>u^$ʛ-Pg`zay+Ԇ3Zim5s:>Ҏ6?Iz=`)2 oDDsr(n9(.r$ s0d̯vSwQC_wpR378&#q(48ۥXW<ֈ i$H|  I۟<('2MPGC~9!v~$h~kLGJ+r_zb^XNڑ=ʫ!?vkDPp`'b~E b/00mK; -r2tq:iEM-Ʒ(gLq|זYNZԋk%ݭtyٺ=e8lywrDF=ʇ -v}4p!7@i(^0φ?χ?:K~ቇ0~.qUE`8Xf</qzt.<~ïfq%_ =3(J>^|sΝ9q\3 U7'c2 -VlyQ'skH'ąvfI扰6Sb څogӬX+n kЌp Zf+94%Y~y -Yi-T2::5ԐIo鹎[u~cqqǴ oVX]tu403t.n fa0p-Yz y BS)JVKwlObD5@Yo -v&P[%{[eZ(#A*0LزiE3J>9Ey.vq"w(ԯ_m9)${*Wqы^=-pyq8V@@l9C:+rrXoU̮⥧51B+U -]S#}[|y[M}&_h^]kܓ<rlvAIN\Y%l2ouj6s_-{C͆c Bx޼F%-{d[.ݑ5q(PNMan@LJz]d=ުMP9A~s C6Ϝ@1OU2>?.n6ʿ)ќsf}؃Whq7OJmG#ܵYE^x-w߹k]7/ә??z?v6 [C.18ġqE왋6[ʳB'+|_,ӭx!K}̠>fMiȍ>fCӝyոHT>G>9>-m|͒Lo*lPS~ʺs?le5 ,3N[܅1wÔ;m\e]껼7(EcٺܵRg:얅se~‡޺{cb쪔Ч1<=|g'eBrOIn-kRNפa:cH%DAKR%AmMoH )]rGYߐe.HW R~()qGϐߏ2 FX_8%(DXv?ʰ駭hc/n"%)gn޷A?n E†,ΊC MS|նxx]<ێ4ޮobh5Ǝ/i}  [vu۹}I$m×-keGa>{2UFSF={ѹ=:Щm]<7Mn!̞~ĵEGD݃MpO:b'7;KʦRؤ1ձӨ104*J՘4:x>i<=~ۗ>{68?Ly/o߾{on}xI? \N+\-;M+Ŀ׻?ٽ KH] ״_H#\8h9Efw9_61BA-s- NJmM(}cαticNr.TktM/4LHZz4NHz1cdƵ?:v $hƝ0_DMZAH6_atp]&9~Eh\$U8ɤ`=ᐵgm}lѤ/Ztu2e.<qWt|C{`Ƕ4M3{)Ӻ/_h=U*IկJ^ p4k(c]>䊃\/מ:C;&}io)}]=KŅ{*MߡC_ r}{bx6#ٞW:yF*˷ѷd/ -`ܪ+;GН/8q3 Z>hCx;O;($l}(I6~ߴ6L~A{ޫT4_.-:zaUW|}&;GН팻O{؞huC;&}io)}]=ݧ}T{$;U!;53>b{F^աfIzҪ.FDY>pM d?/=v `]Jփp×S(aU,ǰTZl&i@ևP@ -CBH-)Ml}𘺕"IfډAu~9_k`i -a0)β>|J^ Oa^3x9(B++d2e (EKbeβheR{=y1vI\4ιIg})Z}Y>鬟ӼNf/jO ݛﴞo;ߦwLVIVp)P`_DTӁVϑ+7c=7ㄊ= ɡ`G -QjS ,A#1' -xaѓN}x,c/+98VC߬ji7@_XSΒ7\F5b) TêgRvFah6iIos,l׽nQj?CJ6rx^^G"p8!K%me RVsM*M67x7UZhC\n#/G-_D9E4%'h%,<w,WV!$0 8|CseUyPrCpx-'g}镜!Jxm7EUW6g}镜!/ Mu;yV{ y(էUWv^Q8_/vv^Q(ڲlԡ.eyV{ y(ɮTs|jg[WrhhWԁbX5ɳ{%gȋ36s1`Wsɳq앜!Xip&}>N,>'tΑ7PI@T4D4z9*_ID8XlJ,R]VţB\RI 4\".C#AuDQ#Čf>sOGWa&"Z̳徢PzPv ?dKZ`h'1:睵h+N/n9OQAgId(-Lo\Rv -2~|"U[ -U7W*xv`z|缻G?<6LӯL6q/K Q -K]]|/,`2 rzq.K*B,81u2ޖD.K\HeD\MEO47W$4aLͲN)"8hNdA>2ַYh$//c+΍ Huf!D\3ѥDQ*0>'֘7 0֫Cd_n*'CVHdw&bLN|EE,T'!/ XBa )r > +<Zr8yaغxŚs5$:S -2]cm*`l# d)'+VY>(1T9t= -2>Tat22|Jٯp%ew$W#iTS䞁ak -#ЅKX!{5ʶ >kc)EE4B JpH`k!#-^2oϟQicrD۟ Wh"c&#>;>'C_s"&B <$&'dL P F[B3Ƃ=X|;_pSKVZ:43rqv#%fʆ%,U\`dsS"/'l "c }DeNꅦ|:Js&Ĭ!3Tx#r>:[2bAf>X]\.^ - -Q'n%6;(0, c# FǢV@bT"PGQ/b*m6X L#HN_dCgb ,cK5V)) -9T[s.9Q2.9%&mdN"jOjX򾍼Y*li콏"T",Rukw`mggpHg L.g‡ #ȹL2hoG ,Pm;{P38aD9 aW&z*! -@3nB$XfbIvgY.Afs\rW2Zc6yIiFĊ64! jYLOrœУ9?B"9sga/l: -Am\h -f7GWTRHoNE yccѡl%GgAMe=l -@ -9΃dڞ%WE -HK P񅝁Xk|aRjGʘRFdC+3V%Mn -@SC#ZIN6 bfQΞadD'ALE61RɘD%7 ٦(~caUN2 B@XN>s6~&{|ۮJ1g56?3 GѪ +jIIz5;T,R,;Wdo^ -XeIAe"f&"x.+`Xlb ONYq #v=4rPȊY^Z "mH}ƎȯtZ ߑ]^̶JjHf ulZ=ؔm21"/狳L&A5-/'?|"%ANT -yY_]ԅ2>:v2 O~#H%\ h8 4&'7كP֗ :X:^j|?JAۃhI3Ɉ>ITxH(L0u79KIcbd7ZIn -,dV8!`0 `U|%gH=(fqC)T%{dgjowH!,T9ENBDE!@ 9ȁVPuh. .$CYIXgQZEČVM1JuejN#G ؐ@n)ͯ - lY^ -1&-:1wCJhgbmJ"YW7]Rm33Œ@e~ޠL=5b\ۀ&AFƸYY AUen5S|.#@g(~x[t.@yzO,yx+ZBo` -w(XÝGhIϼ qouEËǚKUL W+DcjL&p+D+0df+o` `>x^%#(>_jXpj2\𬼡 -GJPj`᳐ ҺOƘ=BgYf&QeljkE8ZI-":Nq|8gF{EgHc:&\NgKБ`fEx}yL6or%0 ϳBf=PT&-뼜ԔPD}g=->@*GDF'8T\#:+M 1|YԞlob$yhL۔W 0Z)%xrdESKjcY*QXlȁ8 } "4iTzKe_|R2tra$բa\ wP1ré E<٧I&j, -3V#~L=21C[BekPchMr V蓾5[PeR s'|SD^SZhI:Q{() UF܍̾E ]>9LjA#3TVXγ,jGF|큷,ұG+JMڃ 7]%Ց:`C7ܥ#Pq-u<n`I= `4Y5穵=;%;SzH +> Z?Y&üd*jnR3 Q71Nm>]!(e}TC"* _ )h20E1CBYbࣵ;ћiVj"d#L.U*(˳j{bp -,=CnS&fu68UG6(GD;| vDWxwR@iL4U!˳IT![Ф #[x@HV[ |ev=Qk-X/5 ʼ=#U4:4tmY$ J*./PdR7SehREɗF8DsCȉV{;U]Yc"$\H$ Y_fiZ Y.zDKĪ{Y}UQ,uqDŽoÑ>M,դ0(юD]Ɏ%C ]RLT1i/U3uTk#+'FL1؇z8VYT=E]DrGc)«cQj -"-h4mi$qhe6X)m勦 *V,1D͑1vʲ,{9QPqZQZs{EseQ,P(r%Q)Y@(6ؔ4P -i*܅ iD9'0"pJ\Ac%\ -^5jDNW70=8j!Ȩe FƊ2% xb<> +_:%v'&Cd)MdoVT*AG,bgF9U -0a T4mu "AJwSlK%C4WS?yOr8~@l!#N z DZޯYRH(%2ڵLxS<`:O(BIK+\ ȧJ1'IA%4 ":Plz(@$!KdH8b Ю`I. ˫%, 0&WrJcȒcyj "N 3p"*撄D Ml}Ė:H("5Z9)Y_J&'ga{ mQm+$@HWRB˙) w "Dve`}.2;gM*Jުx#` ;co^#Ab-3UԀŮ( -磐D͵ZYY͢h/xs FALt U BpbYAD:ѡ=ڒy: -t`NBa02UPXT 6aSBRCrlg%ɕ=^g `U )j^ ,G/Vi|8$M҅ ҞoM -uN?SY'G66&q UTÈdfY9m Ag{#$62 ږٴUPBS+6(!/n=wuĢci*cOG[NdYESGo9%Zas9śAqa64r33GsCCJXST/^A%Ak*Zj[=p&*e0a)$FCفC=A!C_s)*hm\NεABgT!6ZT _YTHP0UKVYJ -QG/oFFEiR&Xbl&8𘺗9Tl-]~PDcW˛Vgi$͉FoN$HYDՉ((^lS@g -T3 e,]F/\sKV谋N[t6˻.8 RK0>v.bEz+iyVApx'#HBrD[1[["n.p475TIu75jgvEu4Nm\ 7^L^^jFa f\3/WmD4 DtBēCw|n\a_%a {hcԽY"91I$ҪuW -CRHYFE#rU윸QmUm"Q75\ -OW6SJQ ʟs,b\ F*8&_ɌH'F (ݨ -1Xx_P'rVF(3ꕉ2ш|ag5rP -MC_]pjq(Ůd=dP2IEJ$Xo%DK0dG)*"$oH!ɭ9JQa g&sr"b HIֱɧ!')kmZtNB )U| #>>^p(< -2x+x9*9FUyc y&m dNEdgtEBɔ9Tj)L`Wzx/1.ݪDAt\l :UwALoc6?_\RL%H24S펣^{A^n1LKӬV7 rLidr/Yؐd+Q\csB^!]\*u11g)&E9^JrQ,{!e/*croσ4kPU4Mj;!)'ciދFYu dx 4Vzň,6žh !/{/M%9a$BP/&i\ޮ27ɾd}9s`겒3d \k*`9hS47lUbYf*Г;iVo4G Nc>H.!-iuz1tCeVo) Yߌu!庐7rl9fdThrᆸ`T*`gNF+]K\& 0:܊ d͖17(:0 i*i*i ^4'CV ;)gGw`k -Ě| HUow]eH$NI.'+zG<- ^gdװ~6⼇|˜b%3ԟS5J DB|ܠ(&'5*5Iz3d͡: D8ܱANc7 ya{XIn ل B KQ55ToycA>܄WS~((!0 91 AZalĠJ3sU< ]MQ`>E)`JR0hEz{܁!L(K;pѲtc4$)AsuJh[^c9EH\s`Fq@ păP ^24Nlq-8D.U |lQtJ)4B|?Ts\bIrP2麮-|N߰Ǡ!1o! K <3jJu0Wh0z?F밣xf@YSk޽0ʫZU| )#9edA`-1dI/)Q`2F+8}hoE0ʚU3*+WԷacd%9H(Ln3JA]n,#)AhV:LA&4i{XMCj'[c笆>i E/yT/K'5yLX[D٪Tۍ -r^RJ"Q.V>YCȟWMYBQ(?VAOJ٣IRNkf =e4ǧ - !11OM` ()\D6%iUN^,}xԞx -6J|/}H1<|[!:2hkπwKcP*I^łzLRY4OsWAN}EϑgFphg ynm%7ɳڋ$#?K5_e=yV{3#F8vX;( -D-n Ig8a.2g-yfL1=aJÂXTx&~|99Bt<$/wa -WeU6Jd5}W=.7]YR͊LvnV!K%F1r%6}SP@C[:FϨ2OsdIJh4 -,R !ȉ}R _7DV/D^5^m87mI+GR+IBJ{siu)yٽܲ{+;fՕ& U-ȷ%LjX7Bw\kgg:Ji g| 1ɜJuYnCV -_ˢq)QoÐI'Dd9(BT.`_C>1':4J̒ - -D?Q,HVSz`ԱF6&̱cBMOQIQ v#62P<'$c.K]E8껙yd7tqBfC7$nWhlq׃JëdŒᚣDkF_@JQnR>t?#?H8.vF֑ɢx҇gիx fll)8#dɹ'YqmbqY3fּi=Jmdp.?NfD2_ȷꨌ겨yDA+RɫRaL+јNyn(iݩ.etT[DSEUG4d%S,J(l"CeقD -5cbm e!Ʋ2l_Nz2:?i%˳$O<>]SkBp N )An9ȭ(=Y UFPaL# zw@R)% omFD"n$|VޮuuUB. ')3dJJTHyv_!|Prh[Waxn~v]sȚMB-<HCb%9F -!(*dL.IN/dUacD\DduD^E\!rP?/?k9'ɯK(]d֔qLFg9^.u {:TBA4 ~aI^빑9Kd4M,YL$(MTbX($y1 -x;IѫQ8Dig2jd*$"lκ۬W̜va`xReoVhKl`e"WDheB^8"S&Fi + ^^ufb˜z^'dDraL1$.d:`>kyWЙp<~aNjs%J!8K3Ax*`"]AU$(2E#Z lB+5 s[9]_/=}Tst&Jb -sl^t N{K)-ؤgzD?Jbe[Ϸe"(mvWs~#!LZ >Ͳ*Wayk=M?/ڋU/1xyLJOQIjl+Hɘ(b=2PePVz$Y,ٲ1Zge!;Q9ӓ&qWdԣF9Y%lyi'+4r0L֓y1!3'tmOZVDSuVRi{Er{|ӊHz5UqL+E$) 9[7mJ<%/Jj{$w ˱gP;bcIƗ+vD$ަ^Dx`T9ܭ$QwCRmK@"ڒc,K"j?ـ͛JD|±BtEj p٨|Z`n>6;RD@ܸM> )77ij݌(+ϝ¸<&¹XuamKqU[P8.L,"6VrQ >ȿkuz^YکN>T -tfg,*"0R8&ryf,DfXix݂LmDEѯW -^jRdtCk[5l#zVuVێHwQOa̢& $%ΝODJ0iwJđhV]cbeޮJU?ڋ1rNqHV*4|Es"tcrj  - :HVdP]U, W 1$dܔ#41SlML:ȂM*,aK=TI9[9ӜaXuZK.DhQ-:eb"p1f]^ŸV=P&hfJdoRbgKՓx\fP1Y#3 -93gH6_@LrǑ\SbؒUKIx))YďD$T>"&!6i2rHK1Q/j,z~eb9 tQd[Y4|,~e!@$VD*dx辠( ؅$EMv,g"AJ4҂mUd5Ev65d$.!1KSYd 4ʴ3!߿Ɲ\Vj5-&)*µ `̺$7 mL HvƑE0t'i#W=b,bJT|3Pw+S2p.- @ v:4'*mn]tb5*(Sڡ|0eɍD"+ͬ`,{hx߾o%orhC՝`j&q75itZ1+2"7`XŭȵQ/ &pʼn0!m3"qt8n).U0|iYXGtwwb#AbNv#dN qE[^j>#)*q|axX=(BDuy=UAţN4Q1e$MfDB̂{o[q _$BVF0$탃(>۹z7IJ,ծUk|V^l$e|'"ځo1Qv)HF8YF"C`OۖMJM ݯGU=~K[yAg9>)[2ՙ _ǂ9(NAusszѫQ y /wY̯∬]i\~Lh%D:,nyCw DSG_S$J', -bD -o`銕K g^hՆ5@9zS|JFם~10?Qhs""j/JqH%[b91$Xgb>蒰(,(E=KFϵVf)h\}ٟ!78ByM~$0{<,!UEC4\2#\tȜ{Ĺ8 ID;Ǡ $4TS6:F8fѠ&dW-Җ, *F-OTKXG]TKVNֵ;T-A޳ -&ȰRMxh V5wxr4\H!c5qhUl\(1kXgBh`.ClB7S(cAE9yU8?oWNf30&C,\ -ߪk8t(B@ή.}ܡqeSY&N~3TG]5-xC֡ Q^MFGTya(ʐaDL*ffn -Dz$.;F'GIW/"Rѣѵ -ƲbB cz6w`hBYLM~,X]Sm'*j%r@)5Q_6kP#<[qoaJѨc6YU,%j+ V twԢ5ZEUlsVЦNSmżCdMb-+sqetb\@c(QrPA>C[X}q1M++;BSqdxr "5$bv2;:,9Yp,w #sZB^"'Ek2g֫a NK5i0خU঎cgFVqE/Bu8.j=VGfB/7 6wteа/O@Kc'Wý8ʮM,9B4_@஥癨q_dy ]z̷#xk+Yce cjq3Eye;l!bB*;NK# gQDV8MTNC3 -:oqI"MjUWƻ~C*#:Bbd&.nE|"`Jj<*KIH yR ]sd,Fƈ9#NXLTf#D=9/S.H"ɰ4+Q1UdL RcE D,G %[^2_rabK$UNa.B.8טF8nʣ>BYFGà/}ѐ,2wRMX]\}fU5Wfs}%'!" k-Z /sӿG@A)U\g"G CTɍcBוD%ffiL;ΖZزRM%=pQ%v{$D$e"x\m~ /&P!«$J~OO:.Tjd\-yOR1 -KZǹ6)xF9y.X*DfMV"DFBGBG3s3Xy%zIR8_q6䥇MC p5@2UVe8A#&BZn.Q"g m"']߀(mr04<$(zp~MWjB$TEh YZdHW̕D ip8+YPtF S#o RP0&g1%fu(@s$)v4;iHR[!p5PM袝r -Wl68y˚1x -o܎>FAdjp1q &5y=,bZ}}s Mw3UxؤF]#Jg +8s(Up aAerU94IE=QgT2F[;V./Ukbn%ʔAQ%Qأ<( f?2tA r#jƁ% -;K] 9A$Se}ٔgꢖ?G&+jEla8T:IJbJW}9$O@&b2p;b1Q0xV5%1%I8ug$ -̨FϠ,RQz>`Ey8X!!"D1Hh𙞒#`3c&%9om)EfE#& HN1XXY";:)!Z495sF.PGf ;R1ׯې K4bԫlĂ`-hʊ:qZS9]Ty<>߲9Hm7AXuMrýMAE)/[Jf E6 Q8رRZ`ec%Ia#Y˳:TȮ &EevQ{mKWa&-VMIBHՇd1±ajSu0QM -^P<A}Ggi+ :BۯiO@>^ʪiUIS9@XjK,El8C1EaXL# -e(-z^kP3vTA dTjy #xǹ`CMsŬH1 񢭃^| ǀ!u m+BK.#c`!d&Wu *40م/k;H\`TĂ4h::,%uå([\ &\אoၡjPJ9 0 Gj?W)w(`Gs8#$!;BpekB3D,<o -Z9 xW }3޴.4~s ]f$HЂ$j5U. Cμs4D@kjOK,GjY^d3M"`xMx 0, -̮DYq?&f7hpTK%9Ocw^Ep -PRG%G[ ?疵ްH}ѺkQIvju4Y5"1Y"}APHtK6C@Dk5)+'Mj^\6L®iuNf%WH& v0[U&2p9+G|M:R$2j - o% $ >V241boLOӱF_ r; -C2gY,,N {taeldžGu|4H8N/jh% ̩!vtkUlgXV3[pm:3VmXF|^Ayӧ'8+>޽6"3Dy%d .D?3_6+tKՍÅɡ`^.mZM. )'Mcmw:֟z] Oޛ`@9H18p9^/R6ڹ|M!(Xl(-P6- -5=ndY5 P^;"۵O>Vс+%9#P'ybp k( ᭌ<*$`:T%&X Uk)5U>44qA|(A+ߪ4Hxh`X7Z -)!\m4Q`!3'x d,2O f4*],=Ӎ*{(pR-d"LZhB#gdc -_Õl^CzÙM\aC^0?rZDLSڵ|ӭ\)%1LWR73W St87FuxLxA. /hQ֠QLRZ!P%dH&.b'eE -@yi't %$P9 ,svٹ2 ^])G"8LL!sHi@i[kbpR -jZaR -n\.,A\q u*1,DgZ7S"tdcI`ikBD/ %%'[([>+q󫆌n -AXn1$r}~NR uiLbڲ"Y6|L{>w{Z/$0C$0{ fbeb!R%$.Pшl:7@Zr=*T(ձncXMDr :dEdچN b*@Ʋ9r5¾B?p2d+GÀ2Щl]Ví~OҜwia $ Jȋ&'BQrgpa @/.e1oIzaA"o=vЫh£8|2ܦ{ ϰҨT݆)sU!ő%6rS d5D|S_T*3̻pH`_'T [i`%)/٠3a˃~(7H[G}eGp֨{;/"k]CK*Dm CM~^ -Nm`ozP"|iL1&|q!Se7\vzk - 2ƌh#zguY| p^@#P[Csám'q02(~29BT,*kcl!tfnǥ@OP+FhepRvZFϛ ÿ` -dR q*٠-xuCF% -uycyO4JA+Z5 B1`Yg8Y+k5#0}} c)Ĥ؊S v3 P4X5C 9.DZ<|mL:$>j/kS3IE{ei{0*&}%ZrVd5Wx&4 -HKȠ vb>[o(w`2V.7g!\S$|7Y͑\ݤ;xf Sáb$A 醔j0NdޱtQ\ -J]d&8iC06Q-Xk@s)X㑂 *0Q٬dOpdt5xFM hZ"A'8sbApe:L..v,{94*o t f skLGOE80dG4-EJ B$# .dPj8P4EK*]ƙ`#BDh ǢA80' cs~頏rDȻ& caQFn98g$&B!j 3ZI_g#v~IQV֥:Esߩ(Pe4)<^rmʙH;L-})y9~U4/@2" [ -y>(0ͪ]XH b5Jfo6~c=nVh|(X$ yӃp-4,(qrI% z{m~-&v&z%65x%5VTSo&iʖWÛ_M3{ĮYtMhV7@ar1V#wLg&8fZQ&cnJNB^䴩nt\;r~L- 'HHbbEuF't^) - -vLnԊ'&oW%yšyApmדdc*6ҡ3חZZ%jeG4,w02NѤNRr3`"f|%tqL{u6KạC $rf@ib"g\P]ګˋ`$ -%"т!-CYpUP 3k@w=r)J 7bx2,\$5(KHMU<`+F -"Pهif2=V&Cýz(Si~-B֫Xn1NnG86C5gI4"pFubq"N|G [=\dFwrj̀9>EWUՅ-hjcWB Q=ZyhUɗul_+7\Rk!im0H觰I*f]S -C}ǃ36 -:+Odsڃj;$ ӈ`ɝuQms"iD3Y6b#Էj2@KLFV?"g<fQMP*:P`2.U]uY<%pVQ;OL#\vlY 9+\iYp%[KxJD噌;F4gl`>"刚p C]E:Sd0nf(W  o1D!r+ʧ -§$EiT/lvP*/*Uć\ҨQ_zikC:EgzJJݢ'hI\`N"5 >Kh7},&4,vVr^h:(~TphFV[Z 6*R(qsL 0&-Z͒R fx!7I F$^&i5[~| |L]W=|bfIZ'h5^`-ǦB@- -Qb$9dP:IaC" _~E -vd5COvxItpV_h lٔy6A&$'Fl X 3R!KE V,Ixj`pe֖F -{0W} ymsL2W`tiBٺP, -c^ T0AXE2x{鲌P;s R(v$d*m5jǴ30k:M ҘF30B!y0fH2CX{ 5$-3- }y<@'1JVÒfY4 -ْ`olP%[K!#2ea!vj.Q-z",8A5k#Bt5Qb7"9wƍVVt{5T-A)N [Y -Ū91<6Yew<ByTz-KMT_I_kTJh9&xlN[@E1H 0B& 8%YdhbWҖJlV- 3cCˉ@]dr -lcujEb ^֗ `>ê*Fr'NSt^C.ǥ$;M> Iq],jRU;MA>Z3= OR -J䩵h* ƩB[6tbb`:"d %2dY˖cT%X[R/*,(4@-JU:YT3YjW -<߹RΛ+OTFeo앴:5ㄾ -Ȃ/ᬀ).8uYIQPʃykctx)C4u -l[͊hצlŮ&toz<4NyRxx,$qDysG|6kE( ïřϿway@p}2.!0$':a`v )*r>fx*AEa$ÈaV4ﭣ3;J1F0mF6_0.w" J” %)zlpGMfMnXYaP4#RQKhÄȞ "ncx) -ф%SSԀ;7p^lWTrg%V<#Qh`(G[f0E{I_2U{_7Su"p(*جhh{\M_Q[glY -*;,r{7PFK;lrKW-JF:YDeY|R1f x$@HVr> A RCCڞ"gQU__XTCr@e8B{hPl„p4 Gk@1WP. bȴhq )BK87:PM #W1oaFxv8Ҭ:9c|. -osw]! es3 -Y3{~ftKŀ۬-G\685WKHꦭjU/7_p.6~MdS@( -مbLB $ ,B4I%L0~fb5i!H E=4A:JEy*s"J}E_tI&!o.**-.Jpve !]ZNK[Tg~؛c%G+ȋALI,s.F <#"obw,-LKN[OgWKhB}7 6-OhZg\U؅V@loB)^ۯB!閩ӴxEv伢\[^ oc8׭JtCT~q/SE*ORt_*(pNrTlnqE,,?_iaN,uu5ŋ3lYAN[&'N7X3!4!ɆMr+t0=o.;zV2~&ӌ ХE1 P0ҝ.\8rEPg ,b ߥ h1HmڈoVښe1(gK-%)˅qBzpܺE.Lm6bNY%ˈ."Ժ!DT"-*ΌACf.fd!,SBbC[U\ ےOY#SXUUhi\| %l%CEg8tKsy5/H `Mg咉׵Un&a|Y-"M% d-sЉlwd]pFOBN v̥,l *ia(emn~̭J/0Rf,Ɉ$ OV3gn׻dDbc7ħ7/ U( `cfNw)Dfza)Uh%j16eB0%%wq~Y5xєc7.˅ NLU2 PUgoӫz,㚦y} >&!n71²8a jVX9@8;!ka`; ކZ#Q36@ `(6e-?e+=ȋB.Y"^gH'O.:&NG q̑$D|U%ml?8dt@z4XpYQ.ODCeeݣozC?T2})5]ZA+2Ԡl|ru {?Qf b`zP̺@c Q;j'L5o 4Ya6 r`IC6tr\֪aaJa%dRɈtIhR,I6Ԃ].RP'IP^ָ1$r[NBHwsVP58iUb%,yxw8aVd(:>fwy?_-~()1#k xXCmxkPFp|b <Ki~{:{% RFLex2hՈ+M1I1CFE˘0$*9V2 - Dsq'f!"rG@dJ,_jDh)yNĄƣp:0 -[zSZDHuTr~/,0m+VyEY %,"O!iX~ KH q##Y jB [-V‹ Bh_V"ZM~mcSo;$ggŹUw6h!`/{x` OyӳY^Gl`hƭa=*"w,`Z@&Eh2ݝLwbSr _`PAMS1, -^aS@]=KiZk`筫ջMLǻI*/i8d"i jMְL!6[aZꬃ`i%-7RI_9}"s虍x:aBoLAG DnF 3N0HZK %(U: -c o(ҬMM٢c+BA"kkWd 9j-kj $YC璨&:PܻTd[Shݳމ||Z5Y&Ծ D\+2Q-a%X4YXh] ^brxy4PDu qY]"mcFiQe r]7J!'&$C;oތI -Id 8A3Q+Z$ppj 8R JvS_dI3[@hDa?JֲImhe^X&=I(.: H! -3<\ S,ɒKYũ@Yޞ%Q\n%V]*F4 ==إtq667('-ƴwG+1:]a?2JFônc7Xtn5%uL;DPjg/Bڴr2H=aYf C3), tphgx -oǎM}:2b˥oBQd1PˀzfnBJnJa}Kn c54\!^'gx;Ɉ_T T2P<eirą GLJ -i\HLl@`>I7P:zfyGJl+zHz-Rf{0#bpf[MUbhs`c`R/he")RuNrRX4HF;,]ߞ_~_ڗzWJ}}~A߮N.^0`3w/{z?p/~?g;H8?yv8^&&W3=Vw/E*@L٥*Fj|OُmA;qY ܋(e΅),3_<Rɸ^HAԞ(ӌq8Qy-2 b"H=t}HGʧ40`ƯRd.zOBpLdS\S#1] Lts')Șᶜd|YB?0S5&)#G$> PC9P&?dzƘ,[)N9D!f>jT)œw@ƦDSU=70U^A&vb)2' b͓L.1aqZ+:p@ >-m!=1q.DKEB(okW^y'{8B踕mǛڕ 6,Dg#I>K%EO{P0gPF2VQSQrv t \%t0$E2LؐA+=^ LRLdQ&x/egXO_آ+<,$ l5ĢW UY2L+=hې6чDvY~\2&]K֥p)wfQaAqL&2:E. DM^L'l#76S9@vɥ\@>UK;P!pZo{ n_X]ȨMQg=\GHE2dA=!{ ?9lة bJ ښL Rwն7ǢN:jWE\Ie"#Q_rյ7'AydU&:ȱz!K &N#'g9T |\'tdt13#A0t^^Q8QW.zЇ)/$m~:Hd4p!%5i+۲ׄβ ?%&ryz]QzNNJMN -ƆNq#r DP%"qKNx?,% XSWU"`O, w:W+FT1dqU!b37gbb--{f=Ȅ8BuSԢ,*'$L.NL5(܌$ǘ\e3DzD118$?*3ah3^x9{W\ pHD,x0pn@ѡTSA#[NhmE4%kҁhD&peoXe;Z[SpBABb ^$4RX,BIKP s -M尨\FՏID5A89^2]$%05~QJ~x --Q "E HA]YCMf`#g,6PIaE2q1l+肇crr-G#¸^F+-q}㯬}}2(_nzzh86IDN  C2Iz8dUަC61*K9R(()ǀm,Id:xƅdPxhGD>w^6O'yCw,$Cmt,2vN;Erqh&o9@ t j74fwA>&RcSR+Y]^ 4'E\i-P"{5 -XTդֆOfT'V vHBqaZ(*t{ʞ7"F&àǜ!dYa~xk\߱!F!gՇi$ +cX$LfTCi~H`*̎3 -(a\=D1xBF?fcX!+:cL-lOԌ-{J܂Ȫ$.3)L+#dQ+R0f`Z(,ȏ#qJiEɃEߙG{ք Ůڤ@a,P\W>@$JaD<ᯪFPcFk.- 1vhȉ!DŽ,  -yvL0z7A z2}$̔fd )$U2=+]d{.*; V'0-%rT#k|qrM2$z#ȵ$;vb].8$/1kӑm{Tn*t;A*[U_E-ڔXE;$X8`5yvIk9I}GlVc!cW}nԾYBw&F{j̈p[`בPrVAtTDă@¯8 -LI rutIlygx2r$yQ"vU7kMW0.}DV dVI -j#?K,za E -J`]\*_O!6/laɎJV#&'EjJ0ب]lhtqq :3 xARyZI!m@_nacQg -`̫o^S:.$@܄{O cb LaP(ȉ\NQ 4 b'mI & K!|bU#  ] -%mbAObED1z+cq,꧜ ДDZ#DLd&`?t0?xLf!rg&(I.pC38rm{uR׈ȵ'`aUpdܭwٓW4˙sFgѴ$䱎fy u`Qiv7Iu7B-я=bTsҽ rJcF…A,b;݌zuG97d"~?ߜ_ݞ_}}x(dYó?~Kߟ_n>WQѯ~l5?]nӛ~쯯oz}qvuz3|ߜ_9I~yȏFوY9+j6z\NoOI4)-9W/naF9N^GNUM$6g_<<^]οY7k;<ׯoWϯ)_9=ϛo9?]Μ_=rWr l=9yџyBs\GoοИ~u7NI9k.ߝǃuc9>q3OO/KC#}dq~vh=g|~[g/>k{?d >{iUS{>)G{uoսW^[ߞT6'+١lrH֪%#?|vC_u][/$+ȖHޯ=닓cRGWǪJ<fܪN[kC[\x:["^~~}6U$q_߼<9=^u%mN;ww{}u\ޞ]S޻ }O/ooĀd r=+[5N) >V/{ q6] -:#+ DجuGDV#[\QO߯ X7˳ەm[8x7w|_ڕL}w{o1Qie* &jmSzRLaXlާ]\gg<߭2 ͷ\_\\֕7?A#[U샎zdeΙβe߿w/wlmlm])Odk+){fhfĤ,sKxZԘUMfY|]{d+e2!kfa۽J+cOxu,շ'ggW8voӫGEls_]?󳋳ӇnY̶'quvtUܞSuͧgYߎyc39eCd4~#KLb=K=!,0벗>wKl}:{'=B7[ee7 6a[A"_ah@9ڞ=9ڿs7MՏd/^B$YWH}YZY͵:k6Z|HZ7g쑴2HZz-OjZO+ۨ=}>R%=? O?p91cOu~x=W/^_˵Ǟ.apGS0`kۢH}:ժǥJa&z}Oޯk35YhoGey?I&Um {sq;}y4;!I[y( [َlq~45UxF o7g+ - gW?!zi٥4Ow/fC .|q×+;-;yN޻?ZF{wޝ.w26P9{ޅ ]{e[l^n[@|1D8[ո7qwp5wpvqq'_ߜ]}2ɳO}'<8'7'W_kJ^[Vc.]puv1 +Vm뚖]\z}r?&׺7'K#yW5Ż#m -{[sxIZ>0ڜָ=6;}nvzow۝vv'2IPl~۝=B;H۝mwz+MӇoDSvu,~TSlviÕpkl8DUMm2a֖a!:]~;}nefU14zƺ=&4 ?'_q\s+cp{j\פxR xʻ^zvq~~]'cN40{̩dbN} {5iH)O/_:[elЋ몢H\pN'k>Xęo^|z۝~WfY oN^\ޫfj"{l^5kځ'f+^5{^5۫f{l=ba9?nưDU)Fy;ȴ)7gPufK|xOw$^\_>4h]2ᑞr#}u7g`'kG~0XWEivtG;Cю-`8/oNNoO.x}$7q1ח烣WC,ۧRv[Vм3 ==>WןoV5Ǎi3teyKZz4Sa~V {ܕbժ&[oO֖7MO׏P#nYy'JĺbޑAyK-ՈщO{Z[Vbk6'֬l.oYy]\ڿkTFQ߫|+GڱƷ^k|{ohOeYk|>@u{֛VZۤGh}b{,B} -a^ Xl~q}}oh~xpח4 _]!]{rz~Ͱ{x@uu0lnBV ZQ{w{A~ߊӽb@;wzZg|u,b|1Js\ sOu~.c-/v_Yf7뛗'goN`+5rcSPn|)f7kK;;!yy__ ^ Py܋{{qcV5D^ۓ#b뫳ຘ,>BQZ+4G @Z5{>{Ĺ}4u= 3y]['laI[y([D֣΋?'_{ws''7\ ~;W\;׶#Sst4=@+,bVt#vsDSo꾂gu;@=?wQbnG<.op2}KLb=g_FYդ1'Cyu*YJ߲Gs=PO>#ժCi=*}_q..D?ۨDy}A|4ڗ gmS*+ PV++D%[Wj۽כW/ }u5GXnOZKƣc,m`]<pmܟUz5'l̿WSoֵCR^'63doǘ>-q]45bU2Y]U++?mJOtW6]~}T?]2PDDW3bC!v[#?}W~wz>w^#RSHG!9Sɇw9j|ql}k?A:}/Qh>rrrR+1kaC9(GyP!N\G)G"O&AlGq>v菊a4Jc^>Xbh_OY8>xÑԣP8nEJ?c2} J|o|Vr|XvTjq5?u|<ǸX hjt4X.Q*qLj 8~LSd굹VhClg/qo7N/h|}<~fPʘ@;-B[k -(1gMo1ɞiyC_ $=6!<{=ꥇĴix̢a<})L 8uYƽ<8yh8cޅ][c;DZ;gjXqǡ5χNKg| # ǩjlSBcLGD1H ;-8)ti#1>{ڸZZDY{S㸘cxhǬ)C7&s;q,ac'z$?q{m-ب14sp })q]ߞ_G-88N<-c)]c4f;5/ڐi:Lw6)n|hc2: ʥ2/tv}$Nrv{|d0qݱJ3|ckcVƚ||MV>(GMl_EJl*ereWi\0fW}9x+ 8$%8et[bEOuꥧmƖI}ticâ8GG$y(W#@܈)&3&ެAs1KW Jc>ׅ݌s<(.+6^q ˘^?BєU4'١} yM]':P6꛾7č@>4( J(:1oZVGrBCL:g5]x]CH6i1A<.~yZqdSYܧ%<-1 M>̛26LyޝdT3C{⇐vg1E5aIgyG͑XplbhүQZ,4d2 $qH$7\+}m~][u ͮ5D,rt~ -nt= )դ!}$y|Lyzt=][qؒ(9G +m/^o&:8U'4oS,ml"G Df,P͛p@w\c;U"OF c}8ߝxa#^>7y.땧KI-Vy ?n)Cc%)!S }e=ɱ>R^vѳ)ǥU}\Dx ŵ0)zH3,[lODCC j]7h3Vx$QMј"B,89^ULG4|ii=$ے'·gۮ.u*gDd}%Fô!}h_5-ڤ7">:բ(yZȈ0Ƙ-+qO>F㽶sm,ξcw ~{  - ؓ9|HKO>= s1`9 90?X*4[Kk=ƂjM~h^_mon};t%t/6L}e>|-q{9oSCbrV7mW+OEF};.~u.1~q1pֽ"/w͇ҮaN]-$_\5f',WpmڱJ/+4Ͼɞ(ѓғFL(xxfb=[A7Bh☨Ng윷cG+y8KϤmn==ikW4l\R3B`oOy{}\k xOf{NM[bF>@F5|ڛd T?ϟj.H{Z'\a(yXri錕(}/x)J@A(;=`28sH\;p-5naP. K-b4-0t"yxuwK4B8^kKgHhӧ~~NA'4[wmzw@i]˂d긃O%\Oq}5?}9?foyVMY6L伾*u/ErɗU;lѷk,LkG)un||oܿS{F>ٯ쓱wGNRK[m7/I.}k3_Ff7eflSZ{^+Ťq߯#9`Žsy.D#ԸXeؒVC-/hyN#[N/ {ndi䔼?wb9o4ɏ5 d[ts|\fٙ}S+BkjI.;$`x]|1pͯ W3t.|i׃ lc C^@;^|1:@T~v^.njΪϿ7mŽG`ݟnJ7ilWehXH#:N˯?\5yxO0~ڻX¹5 p.,̗f7YrJ%߾-wU vL7=+yCMov7'@XTpxlg%?9{˯zQpeHy?n޼''%~p/ ]<Ͽn|3MgV:U)FO$gK_|3[W);~n k:g~`}^G6o{Ǐ?{8g߾3o}3)?u |&]Js}7ӽoO?w2ٗ^ߛFwWEIuzB/ԽC u7Ug?W|?U=>QȉU(_w@=K[ܸ?Vs//?~W˿}]9?o~Qw˿O_կ~k)z3<'>~[_~}~z/A?Y![ +x}oˀr!\@Cjw(\^=ڹL:BN( -ڗs׎\vRE_AHTxg?[ Ӓd]d@) sXVH-p_5A 2r/̄/(WmP9a # 槣U]dk(~_[ -Vl֍j$IELckJ3B}JzAld10)a  x3tZҴFyw -YJg,:.ҤG8 fGW ԽVoU'0;y 60ͣXDv~pw0o^߷W9ƞ:e~fj#:?ۚoiI[:k$zum^P jBCy|[?⠲6Ca` -SĹ枨]s -W+ PkS=|op;H{%f,EApAqOv8X-'?$ݧ=["|{ݟ.!ii>_+\NK`^$!Nw4{Ʈ{&8~HG0OO{}'ר\=w uf.1p : n{ӋFbLG-W}.{. n,:  k@{萲4b|YM1@ -C'Լ2{~I!L=yU&|% CwO i\ȣnK P p2{`H)`nR?5K{"qߌm"iZ u*`bL>÷pe;ڣ@x+[ظ"M^Dk* -7_u>knb -E^Cj뼯]C.M|fĿ  -D۠[WOn)syE'CbA5Kp佲ݏtO4%/`ud>J ´W9ܕ0}rܧ)'1}/(B\sK( ɩqk@Ws``_c_8YBdq=1`YwRA=}1L vm4*tfKW -7 |JrHX\;l!:N_5pF mNS6+=Ea E>8Ȧ -x!4+P-=d}~7:LCWFҺݽ%j4z$d#-,EŅ(_Ki PϞ >J)]}"TIÜ"oRAEM4cÒK1 ]C2x ֿMA[W1#Cyqb _b qR3LXvK/s<\;6)@+<,{aںSmZ{]wF,jIM:{Žxr>Q}YM&Ei+1^2w"}Ve-ؔSPפ8=Uб:#8Tg G]LO׿ozAv~Sl'Df*!xzޛ{nsx۱#k$Vk=NNj2f䕪7&`b˜лRp,5Qc,$)a+yRJ%bn9IUU~cԋе3 ɹmaW{2Z}s&pQRvm}\++:ID~( !@+qA\) OnnR?s4y)kg&d%*?a= dы*…"J9{|lCG_wG-V0<@ Oq[;p% {Ξ?Hg^j^k-vۗ>) ^@:LX0;LzHힾ-!f)&~Y2VI)y5>+nvҘ( -(Z?P}W_;tkAwIbZ|m,: DZ`[bջ,5 -oh$:*L0]Bkns9Sq65Z ГX+b 9֕mXA)q[^Q=jE#0HzvGy\frBҽO {̸) W@uD\4n/QOR'(qLTWt/Idhm8(Fl]jXd]+b359dF+ .pB͡vߵi^dֱ@\U{݋HYd JrRl{"x/(krb49{7\,EqbeIŻfPفa@tj` XA,݇c`%.IO%fS_56sbL+ ӛi!ܱ!Lt X5R>;Ikx< FQј]&U?by'[v$32]gNy^Fǚ+L$ޛwo2} K-p]\%#!>{P$-􈓑\58=\JMXڟAkMo=rJ`+,A%8;Y,e< as IrdZH{*d$80q::IT1ܢu?,n#*4𤀃޹9^F{'!P'#^HMT=Fl@]3-&nƁtᬓ&7l=#e%CcjLsڀ}ᙎu[tm;K1%e'5-b+~S$>#K_ O~7iYs%_*,T="F |&EI+'hhȶS0=0feg;0-w # <_X|2 p0Q.lڐ|0kĮn }_+ɝ@NT)9`ɚQMn^S,|*1vQPfĒ -V!xRYԋ2`ŏiRa@ $fMQ@8D@}]_cpr%JRzvƸa 5 -rck,5`+q,<^x_WRT,C@)7lЅlṔm>60o}Pi@s(O'`/RJFIebڬ 8/z{0:11L~ck+ȼq)~K; B%׃N%YM&q$ K^DT9*\xܗӁ|88r , H>y;!8]mfJ+4$y[nL'eHe0#B<[cҶ|vY-zp2;׶xGOJNgl<&6Kѝ彸D\[5w) ?lX f|}\稩ș*ǘ'@m/ވG6')% --Ye8NviCwr8SK(y^GW;noFL+ݱ]9ꏝ}z-^6IOj[Z'mtpɂiْAۃ6"Lt˜1"dyOk')_ \$)G>1(,h2-_8uwՋҐ5{3[V . 4(^[ A gỏ~y:C;mS;~.WW[0.‘.MGnBfa}Gycuw8Ks.㛦M8jC8CmkӠ2SknY xHFٛ -gtu?T{w0oj - u2G 6IvPMtXskRjZhbģOI"2NV9Tb qSuDEt{.BXp{<^p] 1 endstream endobj 1044 0 obj <>stream -GƱ6!?:$xN]koة-E& - {8SzUpwZ{.Ei]`'c'G~-A`ʹ*]'p2؜VE)+/-= :`D,Hۭ.8{AzlHPF â=SvL7ʠaOlj֮);Uq6H6owSyTU3hkFhVS)圈[z%ȄHUqK<ȭΗoLOgzFޕ |J'zqW+ - {V:RJI |%N/yDZ猷9)-x&ݮ- ~n<|~ʓq66e۠o=J,ujN4c [#Bg '<+< X&y8\#q -Wj= -.3]n?ʒUYkKO Fr&g"{qg;*ތ$6V }pZթ$C+ ȧt,.\7*-, -th_,酉:aG7ٙ[sD>5LPW¾Lk2(Ȑ٪ggQ'? xؿia,\+a1H´ځSDgtQԸD(V/ - 0bG$9 tU`~$\ PJM*~E.S@nhr,Ԭ9WDpq>y--ֻ$`#mw$);8}Ooe2<f$W$ARmtk%]56Gh%_[%IK8/?o3c\O{AQ9:3zML3^>\eb;9{(D3.LQ ^F퍘IY`avWˏpB0X]E ECәߪ DtzWlNfXH{ sbӆ6MǓ5Ҙ̈́])$iX`Eb}I T/B+[Xobqi68EA)"F,VV;Gu8gr슮"3xRr -$~I\0Vbz$;跢h\RoyW7,&@ϑV"w8m4ƻ>%0| Nu\aB -?O/5jP8F*67@OGb05r ܵ1֙<<X4n+5C|iT,u|Wh1{-~eUǨDW!|nTD#wbOU -/>=Yސ -37%0`Žr$E>rȗ- $f[91^S2"&䗊ر`^Sd5ѓ{ -}=N)969EWF:. hvʀ<` :LqQs%.-{ dB| R&ޔn!l_oF}:[`LyG{Ԝ` rlF!>B v3 dA" yl-&Е51ΦI :L=ꮻ&h(4: -"7 - -, P2jD6*ؑ ^uͨ#=CpMxƐ+c+Em_,dCf)uvD?-;d8y]=,}'anqqCXLãaCsR~l.o:FJH7̩3ۙIl ɮs!uJCRM]^6z&mXlTk+}ΖO"ז2 z6B Pe22,)T0N΀=/]7EvEY)A@'j"oZ|d%կ]j׀HQ"zqH>P ZF'8ӭyn -*QDCrhawaGr^aɌ7,y:T44XӁ31=!)r3ty 0IJ#9ҿr6I?5y,h](>|w)ԩ4 ~ "MH3^1'lbkͶ!YwJwT1[Èx~l֫_?nm/_췿Ͽ/~Ïoۭzo?VUՕ g{>>pmO}~?oee~׿ޚ]"t<6H]y?F/Jm|a' )'N**]>컉1'iB}P-2V4 =ڏ٠錉z>BD辩LZY>A? `tlsBStQϭ%U.dѷ"G1>Uw&YM!sQKC\O}oҏe6[ Kp \3n ƘkkU}=;U(2V_=RRd/5Mba\Oo7Dܒi/4SSpB[ȝCc SBf<#!zm$ιAԚ~67ч9y(ZG:/: e]XqD)& wH2Qr߼'kiB݄Ӎ&ria߱;^<lފdZu2o -sE-IM+8Rf{koa_AJo nЌ؝B@q}8bfܛ_۩32^3瓃:؇Xߖ$4Fn4/8c;ݰ#G26:m -mW\Wf'7Tӯ7i[O{YFNqRLoguQ<);ĬIIp4EIOXE!0C60xNNc=\kGĕЧi7ا !T j"~ʒs-JLSZTGڿsp#a;TDTdft;fV9BdQ|Kk@=ukL(NIϥ&5֟["H_jkLՎz٪*g%]!D-GOid;=grɄkҘ[du 2T¦TcI]J -O -< -MS_'$' 榤pom1)jB-^5Ћ8s}d^1J;s>2ƿp(Mݢ#a!Ț2tlsɆ캵): m5&,m#Aw% i2 -Um'tNjq|57jnǣl) jˁ- H4S)?(a]=Ҳ(u;bF-1/n_D:6֛DhuD(.(,?pQqȐ*V}`i};>\+YRO d< '[Q^+DJ|hV2DJtz"&4X5%h$4q>Њd9C| -mx0ޞ{ZC漘n[ -yQ5o@[#h3L{V9#2It{DL'*)(<\Vp$dHqəO5yU<]vJ`MRJA g0Mrdt1&?W3Bjny)aQב.g)?rD Bŝ&imEIDS%=ZpW*l0$tDJ~\0``rRhm=S[WfyN -6vw%_,?aC.*IP亢D5hdc&?^Z-~[gHQC9("3|mlזF]u[ʉ(ntXO\ SXU^$ÕX aE V.J9=Uԓ -sZq_s>@ 1slm܋7Ν&S!2)L'VG&#E;ʃ$џ"T -WIΞDxއ(LCP@ʎ;mYC7%ɽ sվS8L8Qf`Q9Req,%d&ۋj c%DW~4fi.";njKf TlP}ݼ{s>@3ϩHv財䶷XlDSYlUluUp)BS[X&S[$pϭ ċ\oXrbn GV[GP&L&+v2x+EPG:Qw!̏wM9[Ӝ'me@퀹}IB.$6š,4>\ejT(!Sa'BŽRҒ*olNȩ|ൔ!4^ˌxœ5.Ucx=(z8 {8p3g֕38!^Qnnޞ -Pz"TJ]3[/ 5rZUqdM&dQ:0>M|e@閯ѷk.5sZo|:g#9񀵛 Ƚ"#n96 ( 9 0RV7wKs SQ߳(7d2@鹧ƭƭ n>"OxP8CW#NH9#PAċ o]_)g7l{HL"txv)ȊT.>֘cst#_R%ݗĢp1Gq;&X?I;E2BEpǔ`3@:+$K<~6BDpmyI"<#2 5A~ -H' ~ [e$%be 996U0H܋D̆iakS\0>ԄќD9{roMo٢k"}ŏnUki&YH.l'e M5doݾQg&t]/;Tc?\ԢVk1UۂGyHHJp*G0|fMf1󏄔:=́^Ztsl@ ;2e -Td e7[\Ÿv4E:G3T[Qi%m}I,` Y {Wݪ+ATSq<µK/>4Qu7޶"l[8*U|рգb%Mء xb"]6v -@E>%eTDa -@ȐK4oYb![XG@ڵqKyFaw픘[8TNEf)(v r3g?[2OCDU/Ģ>p[mcC#2(/ -Ccc눺^_:y>赶I"f\m:˃}$FS ,ʎ¦z2#EXGKjC赥mrSmWЁHX;歽R$_iVH/z#sVDcT!WQ!o*qu FJxcF|_moo?Έ z%3gen8/A FTd]}i\. U#fDG)?E~< (o*\)h=Rca6 -䗔7חmJ -]jn_O=53͞S¿*T 'ƊX;]^kπpGNT -kC]Ic_Ϟ4@OAMO^r$l9 Ks |dmla`tI -"i21hZAx,"f{W\cRwa_ĩ|rC~dw n(['_U)6,7A)ŒLn"ecH)C;h1oSxz5m+(t:^۠G҄@_ (3LNeAL+wBē聯cȋG=ӷ[, ɇZX7rPԘ}: 5n.##Qٯה_GlgJ3y^#7sF,[) Xi[*ۗSԑgaW,Huŀa: tmղADcČRv#RiA㿨N 4/WgI+$6{}"[loBO A%iܾݗ&3K#?U"_ɦCFM"{ؗsl9ƑS_KĶ/YM^FC3794(H=pUo0-pb4zn/,f+'E6`Ux\'iU;ޓ6@ő^N`S/bӢfCm=O5~i0g!DJ2I((A.|䐉t88oɉK! {0M?1_ IRD"5"6`rдe~ -P^WTN2Vzkθ犒Vspk%+Dm#jmJΗ rpV=j_c'toVZzPǮ.>ױ궐#!0U >Ңf6C4$u 8t-Hc2]{ -VՓ) -gf+bIƱcW:0] VqV#z7y'C`R(ycCpUߴG]2PI jrhE@@&p9\IS( x5'cʀ϶ #@{8E -i~d Eρִ8(gQu'bZ1>Ҭu ,lLXԀݞy'eT`*WD׾zNK}6QUEJ|9Q=H !E;mK!j9Imж HmWzC#R fN8&s7K>V#:D;sl;FjU$!'<ncD4*OPy@UTE/=IJ#HgX#6b?WI/Q(N|oKSg͍DGwi-\Jrno5*V+F0g^TZ=F$EK#,Y8|mqu6 -K38g3wC3JHpB)=biRLvzm]tOS%h )oFr /]f6y3ӧ@2ggI_WX{J.^GהBŪl^{CSi -Ȭ&0;H: 3x+d4*wWBg86度>i"?3YPCC"TmăʹO.$G}~参Rց?X{>ݿPF~}>=Ft3}+eX G$8d]v$:2vy·sK &ؚJ$p< ^CF@h ;} -m69Vϻw۽y5ne۴q{+S9r_izHҘx諻L++␍vsY0 2ez{ٗ}1nl:oLhkxAlYKOffUnӴ>v|o[_H5ooZKH;n(vNQ$H#]E}%pd5^D`e2xeenW2 -.h%Lץv⩀[ҥae>'HȊ.#}x1*^ DOE!UsTQkF"G %]Td`yvV4c~CͶX<Խonp[q,!M'680t87ybYW/̫,m{l*X-W]'֬,VKj0𰔋2`qJ&ߋHMFҀ'J"5 dfY)Ύt;u0q -aD&G{)[D is{2:FrmoG0G#U_)"rgRx -ɶ#GtsT$Ժ5d1q&0w:M=iDCXT.I4:`e`sgn#%ITm+lg찉h'A$@9g=ks*V%:RA*)9G߳3)o'!KcDU%ވi[!4=줴Wi#N - -"69Flθ(/_?njbm!="%Fv)V -+FZ=pzP&ZWCHΥ&6Ȳ7Jzl s Xǖ?-Gzh}}iE̽rWrQ /V5q@=gqVa>MJ$0ns7oFF<0SwmJiD?lLɏmҦxiȕZ{x-({E/L-h:]bSCZH r=UeKE @9ύMϯ:֥\Xy'$d@p2F..H0/?ߝJ@z.1qu+L/9}`rUv\dGlV9GN״R-[?)ȑ͕HĹMXʉ;I>+T$U+P%ɽ(wL-Qvnk7rϾoe1s絿=yUReItdJ\[_6F؎N1ssk85Wgy&!94dsEcS )npA=JR˙>B+mNa|86+!kZt4p{SO վB&'}ٙ^ԍj1+(s7"K7qXZ ȬshMq@`9G*c JseZhz_N~;嗇xE!/OZ^61#5#:nt#5+\8 l!0U9:IrQMmIu JsMm[XwʬT]BҦUi3s>\vfu -cs]l=pT?R)>`%b8Ě,t-~.cC.?:TfI(rngLwo9Wu늂eU\Y I@0cc6g>Ųw_ӡhyi -BlZqsJkfRٛRv ~=FQ n[eDkƚ3C6C@DYh[.mfiX6Y\vn+FJ -τV sq~۱eI_0g0aH87vQe!%El:nVB -Mq}jY@C' ELҎ:/;bf\r5vHDM~/{d[Ġy^Y ̊:XR 3qPD@IJ`]Qp^jnc<*йlwmw(ovi6YC.ʂYQʒ-\ 4uy[BMfwYDN4^dQb@]=XnG (xN]g$Q"lmٿQ -bM^Ϩ5 **+__!ַHJ4} -A-<r-[GQ -(Ȣ\TRcw>RhA. ~ĝ’/OJ4/)kc#1ǎu)vKTsKy晛;` -M>Ϧ)Ol<[QfdYtB#._|\ƾաֹ]6랮4YV*TelOE!, %E~*ؙ[w}%?+-ȱi/UHg*i4R&]trC`KqƢ5v)FR8Ē AJS]Io[X[kf7tyO26}H%#V[G7(Ҟe~a)}+yNz-&{R'l"3jo`$/)}@O;(_, s!Fֲ 4t^4 !_sG*'Gz,Z3gmW+/UJ0n3Up*5ex s1h.H>$zSzG ],Q - R^G)B{=Mar4@Ka)-E]f>sEz5 z=}+K+8O+{G2CGGxTcXQw(١ffVH嗗tl%{껃K^@& QD*"fɲacQ}Iޣ` qmtt[N6+.=h`-2h" & 6?ǖrx1:Y2l+Tbjr&u伔u]!/o0W4uJs5{@^vyS1,ҷxh2\i{=բCq>c<yo@hbL"8 r˝Sړ?Qv'#b!ׇ;:pE16A= }5Gnfn[.Yʝ(Ny:?:MO0$_载>\bg_؊z晩8l!,ɋSMAH~Mixf6SO3vА#n!5m6v U&`Zo"*/Qa\F |HgQI*&yŢxM2d=? *gSϔ<*ƖDCl - ad*h%5mu\S\q\OSVBIɽ[j&oQ O ʵʠ -m94ɂ -9;9tWB.#6$n][˓!H}Gw_= |:r|qůޚIqShAfx7.,%=gٻϋx}ݡܜOn~d?5v#B^+@_Rا &m&}pH9ABER3pXlM2 PwEɾ|${_`@G>8EK6xOEp͐%v=]3o)4dHD5No\Qk6K$q>= -w5DK U=yb',ۇPPCg `Υ`{C%$, rl^Sd.ё3lcg2N5hsmYP萣7. "J(6o -\Xs{}!P,73й+oChj=SJ&"xaFMRD4[i:}gՈKw@iC_䆷ڧ{K5+LMM툙f,HPi4ӄN ۤcj돰`PQ^Lތ=5 *#oVR*vMÌ+w_7\n,x+V -m6lUV^V8e&9fچOG@ &){XvB\!Gf @ܼ|dKHkL5(=rzפy~/uR l=(j=03jukdMer3"=JHY.Sܳ@C+)쏋콑}$|/Me ->>_53]&)򾧪:2O5EX4t $`"pwm!E*~}-^5ВaqTCQ(fK<%mC(%z4g.m;[])x&3 F萒80OΕ`fP@Deȋ\ԣE22p쁺p?}"sxc8fjle!+p;[a%ddV5 Dڗ#+o3Ҏka_ @_>ezmFЇ"۬%scOoo?4!Rߗз6۽Hr]pR6}GBΊɆQx@RC8O:;"K]~fKD `(f8gzXW!lUߢd3>ލtT 06D6*/}=17Fv/3,jm U~+|,_R1r5ԥ c71AM[&~-ﭞ_P[`d3)ZwJ{"9X @WFOljGaƌ"@i) i(-gk>R:wk0yw:T?;Uc4D@w5:,uu@14{BtUO]mߛ;Q22D)>!eF WMxrs`J0IΨ~֚{W,$ [ta:H?F^}@kv}3W743*:<ހvkeĐ']^;4?3`f},As+7rwog$MwL@Ê1bynɊqdL:cR^o(q -hHźQ"wRd伎T8cȘ -$<c?28zƴpDCW݈D´V:+wt#_C=LKPbbeh(sÐ?S=I#& VdyFCbRG_㺟K,8x^yC\Cjϥ-Asŏ -Cw[~ӿȻ:#O#+ZM-sIzfJ~a^5!>3Ԟ.ˌY ] sVO̘s JçoPo D:s{4{gVv!Ngt5b3;,F")(3b:8.AS~S(Q|Px<,9p+yKO5+<%qߒG1:#y}zD(:_/ ~#XN{;w- 2^q8m 6 wPF0TTzùn?# eT{^D}nTl& -% Wb6%M*)@/}ןu#c'Be}?>ޏ3'x>7<66۴,̔ӈXhZX葉X#srUwYsGH E낸!uNaFBkQMZ]cu٬wIZݹ>wFኆhjD8{|!F:|΃tFH#/;# X^Жm?3bے5:BIE8g|JU")Jw OfbR[[0 -_ -o1ЯV[KRtR )w \zL~TpqtjV۽ayEw3Dbػ8p2tuFف~g`?F#JP0r%~O؞_νt6|GX)zΟSn7zɧ9 #CG!N|֧H9@73)T_!ʋc mv_n[V@"yr s ':3]/AKPy _]ìi3,F<\/W -  % 1 Iv^|ir5F./DtY{q&+jyF͈h< gUFz,];\YgZ:ھry;tc8SgyJS)$d~&#%KoEM2xg?%K_VV-)u$wvpQ~{䟺!u Rw@ rȬ -VإZD9"0G:OOEIMPޫ$EMԪ`l)uJ#WLg{/jWma䧒k;T6D{0QEN-K|lfh)tş)M?c̎QQ>Rqt|gAzjDR=ʚo ?M-{.뢝?ZCRU|#ak8s37l׃KA+ -|@ˁQ{LPNϭˁvnHT7uf`G7̠sQ/{;h%ѐ4zirP5zLo~t3,ƷZj [6?LJiUZ sO=HE*(ۿYyɫks5g[1l~e?jFw TXQ<%Ԭ٢26{4W*:NZn+|c._,1Y?@Klڦ]tFVn\oDÉL5Z>]%&)暋h-!WpE=tѫQѻBΡ/0֔2pL V#li/ȁZw%\Dx *sVb;a.pCo.b!!>H[lzOE!G#~lej:^PN>;$+(b?4滋Һg`t]Q@.]BE^G0'0n48aQ.>ߑה -őĢz:=9'j 3λhb5YԵI}+ŖkFR4bH]ixw` L[[S2u;l'VVNxЭ/u9%>h9NIBM#;|!J`T6LXN^{0SRX1MUBfl Г9F纔Ӑ<Vq7 ݽn.w2ď-@ie9ÎPc$x@\k!HQ:ڢ%gcimT[#-U̻|o ==cFŭY-DJWd* -8f}( !7Yl⛀q*1j+,TgPעo ^XrfSZ=6 $A^7 InXe$%*fj\-wSkfṹ#{vEbġ7 -WtF gԞ&e<yH9g e`c_ YucFf^!v&ѕgJt {ZrtdGJ@K,nf1H<3xV17$Cѽpm-m5Uf։$y < eP4WtB w]ʔӃ -HT_pAKN)o0xEyā6~d"O"̨ 1[z6P[,Pbr X<>yvavt3=#Q2fw1 \m)6,)Q%W`h钺smJfg-Ӹ:<޹Kb;adQ0_?#|~"[j%r@$eYg>gI9OnzܵaͲr - W6}h!s "271N䰿rE9q, ~B#3B^KtD68# !e Aڒ^t f'r:aܳPn@5eHecTani1[*WxMIH*G<;ҝ8H:gxskyvjp3$^]6 bܫyRaIb)ّzLȊԧGY(HeV@"I{#3/_?5("Rje9%71]#c8 5WwW^z{aVavxܻ`+,^"8I؆&U#mѮ}Z[ i^;C@|* b*k?)/e^L#3yۙhuq}uZ[TBwൻ {~Sgn1p|[[v -W"IR.@^ƽv݋aSPT:J'3ק:A"9HB2:~(ދ,01kg q84ԫ(U–»#fY~~XTzoBݵ 3 bx)O;DE펕E#exwiX<^ -lk1NE81''YٱxS㭟Zln]i\tF]^M8#RY40>d`Nq:u~-eW/<^^?~^~ȕivd7# AnqlL X Np,AUwk/n!-ҋ3 $ Q0nõNQZbN_jVdzO,#-^O9''G# -#556wGke`&s72<0od B=z',{Gs|wtZ(y]/*L6,x/Sj^i5٠0}Wv1;PETZw&Pj(@o?5}v:D -`oP+fjVEۖ[5P>]]uϻrLGIETxчQn}v'RW@÷1U5J1<5]}֊P;`VâҺPY½zjyȬⳠ(1RB9ةDK!0ۮ 9l$>Sj謼h -Dqcg9 y#}|s}+yЈ2?#D5>5<"{2$֝-UpnSr3a_lݘugL(Z+{{6?:Uٶ)(QN2A^=ʖ}O{Dᔉ z0E%8ȲpDI4"Ŧk3{/Un8jp[\e1,Kc= vo -`(;Csnjn\juƜwz~~-ҹٮ-qnNwȪ׼=VԞ`jYlDcjЀcsCh"T1bC(ӟq÷18?u?i{Ϙ0KAd>sCf.gCyrFA#b(Xb|2Qahe|ǰPu`a̎v@@L`iva6:F.J:2G{vg !s Mg-h8S9ˌ3 Fs - MO0= ܩgA"1tw@o~߯Y<{^ΊU߱b@I;X"j%]L5g`!]ߩI'MN9S3Âئ4bW ZRKiq@ ϣ2ӣarUѕ G;$K8@&c~5%XkYWB5'>hg1 5a=W_˸d?~_hӺe[P̿3i.s%l#TPD̠X avW5G t![x%ETKuT~lVsG՟ 2Ĉ݊C0) fbU4"j]&R[пXcwvwu#~j(|I '~NOWW5pb ޏj豗8B%ӫFN3|:_|:F#JBn3LmEZrblwhՐԫzhA' 1K5}d/_-n| t,{:0?f !;LqJQ|aFT\3;>?sVjCg\#Z]Q0n(:z+6GYꜚͳ穈Nɍ+auܾȶVwZ -S]D89/QgXh9@.t[ { 9PL=߱BW G J*%Z³G5ս= gTEg̚&-w>]H2 cj?qJص-2qAC""tcٮzNT;#Kcӭ2DpJ *W*)ļ e/ѩE:Ge>&AJ?nv@+q=hP&j.(Ј &>=;rNc聝htcw -_%]xE=d1w-Dy9;[MA<-qz2G,NjT;baЯm+ -4˽4*-9(m;<ܝo?,I0m9 `cy9GďCybu$-&,Jሖ:@ T۴lnm"S3QXg0`RG -I:m|T4=).vسdo]%ا*@b۔G/s?潌'gp*ֻ`-P+aoŀ3~vK'oߪ]g#)?l?b;_IV#1wM+99s&x|'\ 7 TPh=PaȎы$>4TDJmD%k[hƮj(C{雷.Q6Ez5: xD)YR "eHHY>K"bX%COtc@߃+ m}F"׻JMetR$pѦc0)K\:vhfkZrLު*s%6&JD^]Bz* -Qŧ|H n?[.=n5Z4* )=vƖ"{~đ=>@aYy],4eP/VFg IuN/$߷֯OѿZXFq <>ϑ8"1L*@4E=i4iZaҥaAp9XX0psx!8 -brd.慓QK5/{{6w -|΍$Xt@>N6/2yՓr&SŲΓ@"0' -FGN߷Lg޳v2jO8]8&Șs_Ex=#SF?ubIJ 4Wi\5ϞvR -`15*՘1!QBqRpg׳ܜGn8kM3<3U-A"4A<\ #/cGd(uR 9$?mtN%br)o T4x0cZ&.L$~8c?&e$ YT&lW47yY -}VtqL^~@i9kHA#snQ00%fD4yؓW#o@JhūO!y1%I 1ZЯ\GIz+#]4}2 ʁb"Bp*杹RaMi=_ROy:s£&;!%8! - O;jS½J6J)Hz) a9wi/x؇o{n -ZOѪ#WK$̀+}GT4Cr#xY@|[/4+htntxr6_Y6S*bzn4+lh]P[* s*ѬD aϼc 21^"gTpGEnhy*G#6^LH]x'U+ܭ2A,G'H-S>Q#g>%G1 -(z6Wds łNQ{Y5f+p Z?;l{ׯ4̮Nd"j9ew+`1*W_pү# so,Q> "{%3λvB3e@Dc؁d]nkX:IDx|@-(@0os6Ǹqqr:1a#0 oƅJD:3B!l+OV5zT4.HˊUї -ԍhO0FtEfSskJ\c|Y+«^w'}WwGP{[X -M;AC_;rȹ.V]w j>6l~?zkV; -XBWbzIԙ3Bڪxq#E-kuROg}8/\M`XsJůHg ェju**}n , Hf=#'+nu"nc48-D8òrcՠϨ>?rUš*!r;9}9q޶Y,Ć~IG}]urmOOUm0ig:vĮ GTWc8 7HUΨl.5d.{;T  Ԏ LTkD;&wI#rCWc);(. #M-/VeRYc|##}obpy3r~ivBz - ^߼S~:V< igcz9zEq} "CC"NH(3QVO&CT?b;X@15no{:Í绫TJ2aϳ&X)QtF_Y^WfVLJsU3|:#SBoSã~~=JЬ2A:Łt}:K,4?À8zF-e*ίĆew4 @ɦG>3H˼_̷Ͱ{ #-+]­X~vIIn; Ϯ8ڗv5H [yuٱ/)!FVf\5#uu -1-n'ӈz)ޮ2zs}JK k;H__ѪށŮ㪝3o|ksd(R2x2{XulCz]V9w/o R<= Sc@PB^ $ҙCHҢz Lmvp-5dͺ왭ڞYZvkfj)Ds-щ-zSKٰ`k%{h9s2QS}aSU^ v\^NBuCR<ctgGŐDMp S43lb$//!9XrQO'ly_H>YbMBqyJ|uo)O4iey&=y"^fq tHugO dzDɧ LrUuj/|'*w-];H|k/܉Wi_%peY+PlpiW]4}u>}8Qk|QګV=OdOZ$ܸbd5G"ȝs E@[Yj䁢$hkKO=? mrs)F&RvꏟNdEg̵83OiޒUZ -7sZ8%*=(NHo9= -{ZA*bos,B4 =@i˭j- OC[Z̬R]gQ~WR |Z#<#P -㘉̯f<ڄC3*M(V$V9k~٭{wa!JO7vX-O7`l K^OX -bCX^ZuCڪF]:0zU&q SﱞG=m#$Ħׄ;.# -n\BGuJeFUJrՅ=y (uKS -JL)%^oH@~;#Q" 7Q^XӮ X%:bu9f{l%|`_t!]ӝLEnקӰ%pŢE=%c!xx`NI2NhkX/Y(9tw \#?sǪMh=YFPo=rgTvRR_*4͈X>ƥ"2ɡ0hKe3(nE 'հTxC&ؙڣ_.P)q*+:'aR[\U)J}>Jx<6|CZ<}mB|Y 7[9$I/*<|# -{碌KQs~Њ^ըz2 -?e#[^~.9(PJXQ_ -ʎd.s}Sr35qly,h}:p]U-7܍uWB^-T+N؁Nlr íM3#;l<!-}eu]--"0mnrDW4lܡ Q y(vkj^ LdSXVK_Z0wai -Dx2z~;jŠWтhlVBZY_- ȀG&p"k 9V"%V8 vA@ PvwD4*tҴIlT{ -MնYnuYK\x/)S7CM(^9S]BXm"Anh(!Ć m -[qIś#u3\iD":͜h yp@3x\+,1Y: -vemP6$j="2zfzǃ{ZR Sa?ܟ  - fHN'Ww*i?OQ5ᰒo; XqP:2=1{nGy?WaRHt|~~ni˽RŠ91d gԿ%(Y282}M)GUA Dkx:E@-SLv6U~A)n~ 9w"ipUSgHP1jT?_a r)bppv c~CXg]uI|0hi*T婯K۹{^v;v4I=;^-sg|?ɗbVģߟmK}Ĺc'g#jP!}$CTm -ԇ$J<}ik+$!*u,D)QXEmCq>\<諭6Zj|]#m G%NPc`Q'U=.2;?tARdv@HS_tFJ(E=:!pϋCrr,},ksD>爋m.FX3@G~sN~{%E˰/]fzؘ͆P1 Z[NExr~EzRӺ%dЎ "QG"X否1Fﻊ Ɖh6Z+sGh>4\ ->1)gDqW:@ԤlbŚlZZBIH7;/6"T߷o'x"ZÒX -#vz[}i.E q_2{@s0" *M(_O\" ^jK5 ጼ"Us@-Ǿtdb73F [&P5gJy 4^&W`]zQe܍+lg:au8hQ;-Ud/i8m2>kPvVĩGHZ| ˆZk/mt/Y)%+l!Q~X0sogac.k5v:vMYB9ŝ-(8p4N O$"!uM%o4>RRX:uA\ׂQXJ)q]/CWwP9#ܚ}𵪽}8#=RaG\m'R2&(lT:#GBɚsw\˼WW`wTM )<.Daz rDP^oHpWT„t0,mLAOW_'?ZkU@Dm AZvIZ@6u1 ٌxtL ~QoEzq%Q[m2%GPs`P+CvdjwW_J䉰AΔVfZr*B#2Ne^T$TI9?!SMd1AdI1:7DaEJWK7e[,(謹1 -qF"Lq`B-'&ډuC^Mعڞ c-f2Kx%< yy<Lm\Ȳ$+^}OXV5hSΚ|KYĦ[*4gS0,ݝTv&)Y,@cj^٥.mPdz %M~n3‹|?)R(J _Z~b]Aol@;v' -g9DJFK/ijUK: c/m j Q2XEMB&cV% rۥ""jGmȘفc`E.4'31{oG{>c.ү|\wx=oX/C=?A0M M YCn-`293Ju0Oݸ+SBzdJ) -D5۫Q)l7h*ɏq=-PINS$p8n޽9s<(U -8)>p=ѿUd@ON,Ugž]ף$G _BIܕG?`ReF.һJ,⎊ªK˖tRC 1VvkkoU -V}ĻŇP -lİIzW_S)φZqvs2{V٥Wq*bF# a}()Yn[ŏxN=,3hWAUY=cj˃hܑDԟ XD{,s0`uLfdd+©LΫ"JEW#*y%3R_Z9gyoڷRrK.\[ .~1.ЁdY']N nL^RVw{C:# -2bHJgSzQXJMx)x4u;18c]dԭa޹i=1f$Z ;i&K*2Bw?dd-Ӽjtw\:9gK-Q -˖S>@UҾcpK$o$uD|fے -}MVR(x>wg QA P -If-i&UE+ŖR.o)yҷ7 ҟ-[j)[t'ҠKQ~UAmCV|>B1RynNCM3|`F`g˛b2w*#*Փԝe" wz@CmJtIͻk~SlVw%pj?R*xpz6O_ 0H$lzn;. lX.!1V y87twhbk\pQ@2b2USǨϜk>Dz g~*pR>R+yDڋU|ƽ_ڋT,Y77|Q#tV8K&,;v3k2FU1;ԈK`&;w015O< Qwaq +'PADZke#>QqkWM͔9]euf1wUUs̀70sB'EZD٘:R<qy)\ O l2ˎ) -JR/74X+9ߎVH+=Cpt3Yoݕ&Ly"v,'(iYVons -,4$7c(x_rh19(kR fE,H5IJ#3aB)Kvir?"@_7Ӿ[Ece˟&TG7H@5a8BS,=F0Z`.J>4pFTyoh+רB}/ e)w ]ePž8a#,,@a;UBV]j2qޓ}GSدGOom(9k[vH`wXc[</6T̍|Dptu2c<^D!oO+%@"&֣ttݦv}lBx :GdIUD18V4(JG`D1*oNhw/t:g>>g*8r(%"\ՎU@W];tFwDvիYQaoG0egU}Rĺ E#Zv=˺oSU;5j,Eږ+d=+"PKH4FJ'gR_8k4]ޑѨGﺢxp*% {?dGD)ǥ?qW+mJt!tϑ -Ɖ,Z5H+Fo -BҸ _ddG4u08HG.Rޡf"  `ܖFyɭG(ֲ: _5>WXhWZL>`dz645'ʃkVp@Hi.'V`-+_AJ|I{>VB)Ihɷ- {=B:*tcx=6&(=A/G*_Al#P)n;jM[?0Vl%-}RXu}K<#bF~~ Vg sP埚zkLO2_6(n3@U<+gQU8wImb&?_4ӠŲ阏pq)CSm\S0H(B!$֞W܅i?K0`^qi90tsBBĹB7>:*qy($Ur9mZ&fRƝlь~ >"靾)F- -*h"̸W2YPB}F8Թtu:aɇ4)a'jŚgDX DRWR/P'c*Kumd#}\xk̝%^7֦lR#yc 9ߥK0b Ŝٻ<2'ɍmb- [U[څ%Bm㷊/o`n(uH Დp|"'9pnIMp$dlW. j“ˑy".M}_J";G]:QM&9gb%LJ]~ޔUӸsj> 7]yZT#&]x8b6y"KofĹG+MMO>,q\59(9L2~g A[ZÁIr -4 v1a\hU61Ty؊p4/׮vӍNKd([}@K |#v[wZz -XH}U -)>_}ts )p)50]@.^kCyFJxPgq= z6}cR*3##= %,{S-ʞ="Yt $X]E[oH:9UN ~f(?oJ_$|-h@m.~vyoe}M}%ޙ)ЪY$O=ñq9Q(Ⱦw>۸E-İL}p5+/cuFx^T`r8r3?#_?)>#؟rFfҵ3VG*n@/IfBYorH8 =O~ㄴ{b$y"D"x[lzo=Kgc_ -Q56 4wSYʵ,o9tt rǻ(z'tDEf&T%Ϝ9br#"! mT- ⬦ XԄ+[$UGLUtT.P|XjFaYs& E[ڞ<\Axw9Js:x˜?TL~X-@A݌5nZ{gطR3@Q6 -t1V->@{TVRu!9舫}n%W&Km_6Ux%NuUAj}XkB: [mgWN3YëI&Lt|sc0(g۩s?ӻTBI\Si< Kco?YB.L>:Ή= 2v+[ϲDrԬ !pm<[J v>4-3c|66YLGmrkwaew4%!kxoRq4E-.Rk ԞH2!EygA&*rTa6MVxF$ǩA]uvCme0*k]ʙܳQܗ>A9ŷ<-O֠!{O]@goml;"1K4:N8}shPŢs+$}z]\F2R $ɲyh2y -ALGO:' Y3Kطu=2PxQyTQ9! դp5#W$ FR88yakHDܞ# uU+KIzRiL!v/-Tv-j =!eeAW1Uwݙz_ -wfHϞN;nsFȩ@Xlb*< =ʏ6qV;KVRdlZaKmp(,%,SW3ڌDIIBw]\+| -%fCd[ԡcbߞ\zù!;uf NE>#Y1|.ã~ #LRC/iyR|w8]V =}[$SYuj cN'4VPg}pHTkDP0)xb%oA<šJB7tlޭ_^dd#܏h.,(\W"$XuԲ z1{g9.Ngtg+~9&jv_BQCRt.t w8qzi.>Z*̽X60c4@a@BD~RY)+[.w<k 7g!י-ȋiw-1IV5 Sg(ʾy>SLTY3bW#G1]aׁHYWg4)NJ?n#6}CB~nUizя,@J(@|GjB~0VX޺XDs Q7L5' -xE2lA(*H)7j;>QޏSCjh^)VA -8!hAALmW//G -a;iXsz4肏yEt-!l b@P*1} -@9.G.u<'.`R-\^d0?hW 4xJj9bR˔ 9 "{b/.G0]_֭0/VTOT.z>}qʊ60Xf‴#{k(EgAz]/wrh|0g(Tw1#Z~iA  ]4S̠5U¾Y[ t[,s#p_P(PCx$݈o–Xl3 8Nm޹+-XԅBdܗϒ˘Ef߾H, -,a[z$ Sp[@c -#e?Q㎣)fHKӯ@Z zhAlrSgPgA)Cl(\#3 Hz @>D|8D,ބZ=XIg:tHq3sX=Y2l?`Xܡ~E5*xfp";hvoG4\0ߡ65u P'3wdb<`2`xᙋXtQDH\#B_Y_<-X ]PϪb C. -a)8:̪ \'ITJ]0̳3ۣ]%=ٝ| rcMa6WʳWѕ@hE׋F\*]UVq,9j '\ej"5,DENh} dl!w-QSIY#B/%)[Wddsly%~{&Гjάѿmy7 uT)~@߬_,9j$6຿W\' ݣ)*p3i &S#f.:fhGo=$+g5/X{5S8U0=gW#gO;rҡA<!RD'd Z*ST.9ڧ"3,EMpQ9$ ߺ6F‚Ur1ç.W @I2\%&_$x|÷N -O뎚xO#?]E3kIҩHup}o8٥]fvƚ>rE{Pv]Ge8;rV]B؁Q JեQ?ejq8]¹mO !3&o;S!Sքa֪dӅ{y=ę0Ѹ~@;`FkYW%M2?g.}ob]/~1"{B{9Dפɫ! {CSZ4i8z}vl?Mm?,H[.zc-Nɑ8K!V-(-G~%vvnD@U9UQ iSoƻܮ AvIؽimV/&LCzuP?U5lmÔ罊hO_ #2,;Bܖ~zHWhkR4|3x`KMi8<ʧ۞Mc3+] -%۩5HN>]n:y+7x6`_`,mYTٲrVsN2ڶ)L,jgh幠zL>H3QWϔb5<S\x͎~oO a,__)1%i7M$?d ]zd,TO5 !ʐMs~arʐ]wӍw'NI5ر~&kq%+!62앸UHzBSiT+4F2⊄OYC59.t -7*NIWi7)ݪ:R;5Hg[O+;U xg O YֈKT׌Vnb.{FA(*̚lN"05}UG)g'x!GP)pޮu^;`DrP0A`4 -״O;jЮZEyiA1l\:8Z1ObQ\Ѽpig{' -70(_+µ_b{WkK;w9evсK,av#{F4Aqar_T>؞e5"' -Xk$c[-;:?2sʅ:a!ict/k.2?,πz h/wsu;َ}ljbKq=,kAXf -[uz?7=~;xwQu(NmC!Nx:]:ACD8B44mdS,ye}*VeQK:q-:VHRBD;gۈ´^:I#%sxv8k0Ot= - "eR)=" $ClM/hknW|_gT -Lg Q }rzQ7 -˩dqT'*D2{T_vC򕫬\T#> 7 6}r#wS"jU P݅_b_|ȇ=)2HʙJ"<Sm#\Vp M@bOWi/}gZ H Cyfؾ+R[)reIC% `cqT3}>jDw Cܼ%QL-[V,eyV -<3.*} {/zѪ&9ť!_~{cG$./ҙO 1Αj? -u$x%ETl4l8hUp(&FS.Q;RP\V-ǘKOTS4^@<دs<~3Dg -;؝ڝ#RHt0;遃TktV[eZ{&A9E4N$ذ~ڡN@dU?63|i/1K+gwk~C -Liϐj"wh )/w : y5VMuϢ<Ye2_ -^Ĺ,j|sV'g0J̮1kx9:WTo{9կaHSse{f'f 0,K#5Gm$!SXνRj=Vw/IdW5 SetW<#rp=H"}\T>'ۖvIR0ψ=x`1I)-]5TO->6u):&w(ؼ/zksoieڳ& VXtEVU9`]&bFbܞ k\Wh;´r2]LG T;|]xјRcRZ<Yӧ9G:JV@,rVh53Gض{BBlEb#E+zAj#=cUDKjyHiX毹2˩x}dsCU,8h*v%'d#m f9#}'k<(&0wj QKB`u{vJ;즛>G`*!D}N?v]2W̨:rSM*eH/nM& 6< -ˁ^O*rgw<:<555p5V΋е;tuGR?\YbW ׃UCQM!g쳢&T2nQ[; c[uX_۷x/x2w)_u%m#}ȯk줲 -]e *_EP%~GZ(ywt h;"Ԅ bi`>\a* *gyG! -ܬ_?axjCU~,:JKݟʖS-u|%]_"- 0W(s}'dK0KՏVofx,ִaxqjQW{f)>WzGXNK~G׏v?v?E )<6덯tBsxN@)>ᖽWD ;vt lSFm@Q.uYrπ -z=5q5%z+qZU5}N̮jI/e`TeIv(EhK `X8*ʜ)K=TDj,Jp509XqPfg8XjՃXIYQ$#4O,jc|[ [)k -'`Yݐ?x{@{:gL̥s1ؑLaAdRuDŽ*[S84$eAx -]RfwOBNlrT3e6DSZ|CIvAunm\uLb^9BBCFeUhgJyhJ}4|C xL5 $G֫F# @QSKn[wUmEzfE5 b%iMϦX1IZLXݧ -%?#\#*"Д%H&ɨ'PV%CQKhfyP!|RVo>LX⌸͙qTNo7vm6jk(Գ JYT ^}B\EF0/V f0H|-\#,l&l-;ޑ$T1<ц@8H|GRUH;v883F/ZN*T m%|6(MVHF!XwsVU:5d}xLfQ+ǣBJ$K6FHX1 kD6Ybk>}u~ɲ&a dVeP92 =w.+#/Hwz*tY`$3˔6p딌ⰄUmU6+=D;!X+Y+6|'$,*KM4zqN9{*sxZR{J{i+=,K;sxD@[!8\-o(ϟUy". 2(bͬj z"s&#{DHr4,B),0!v89@"!s9J8Hi -l9lb~"=Yɷ9vLϝfXGH`T>0PNY ^fzeNw,WXjaM إs^[hS0˝܋oLҌ"Q vMkR8&$@)UJ=7d"Lq3CP/M " 'f-}Ь|$^e[4Y(#K9:Ջda)Vhdf~WjYԛ9s`bV -ޅbI9q& VHoi-I -/Iy,~'.@n -c(Ǖƍ -zCrn\09V3\C`&#q0~kb@MB2R0C؍2ƈo"#A]8*€|0#2(Ϟ#M:Y@"V~>&"78RPK#$s!b0'53C'5r$t& -{j- COJ>uG]sm^kmBFO>tX/W:ɍ`!GfyFO X,+%d4p4K&Co 5,Ge!t"EZ8-Us(ġYCY`W,F EY`dc6ԷLtNa 0d%YbYYL& c!kTaR&>=Ge\9 6Y -`4 vp!̬0YN1yX(*l7$=%LTN(% - 3zE#﹗pMH̃ VKlNfę*DEEd%J U'q Q3ɪAfg;!W6΂џ*fѷ`zJȲQ<6:*spٷ*ϻQ *aS{E؁MVyD n@ᆸ$|o1B1i6U"iP)Mx]'\Ko8(i ? & -I8\}}$d| -$5f5!I}lA"}Bg _ -1G BBkg&%ݓ`P]":Jy<87O Ģ f'+Jk4vY&EژIpPhT}wk s:hH;EdF] ċ /2K(iez@&q݉ )RJ'-+-'e&{^ Grϐ!1KAX@]L&Shc$ϒLI!4q}ಁ 0KBhzFq6ܩH&|ƍ@N5YD'u{|/ٲ4bV>)6tj+Iݣ$ }lEi%0Sl>̯ڳ҄g!ye^*6Q)?xck/[b &)_{v~"͉]"$ Ĩm72ݴA o -1D ),Y\-z$;VQ,ڌ%ᢢ{I&[𾔌Y, -Jmʛ5ƔmYqiէr$5Hh`@UVDހLy [wQqR ]ӊkg&$ kJX.MgK?o~78ϋh&&Ϻ|Zܚ)!'0VL )Q%*Ț7"ȩżtqSLA&b!YWU5^;M"7K}(a< CGl$ⲢD_K LS^^0/gumKJVt'Ttߴm$%<8˧0݈v1ƍhq]LZrxb;y\dnc(ͽ) |KmM6kHYŸCI"FogI"`ʼ]I&ՌV]F(J䁈5 -F dBpRq#uII`fVk9CQ/D*) Nn upT/QJHVOS}u`8/H@5 QK@p*@PKY(]4>oVeMQTurU/\b aͨ`ېyĢŧٸUz[3Q !o$X'D=!+A4kF_^H ,% lV"ncX 2o -4Gy *5%#oddJP -gdt 3mזGÈbЩ =@6,O2[dU?ac1R>1 _k( b`D26Ws E”u-%AaLĬ|T5O() © -jK Tl X_Nfh-q,TZ-f\A.ƚZ}^%* -n);`ڙqJ!yvʜmI `b\YXX}-8UcenL(DreBk)%7ePb&lD0$#^خ3b轲_!]楗4jf J%b&" ĵϨ4fF9@JW40ql,,,6ͨLMV$#=EJhpxw4\!>F'1]%(cZiy"Ӵdrf]%s֜86%(+'oc7*ӄ S?jпb̾0#6֔J74,&gf3N"QO=qQDafyJJd,EtZFoIé -4 -+ [/+a0AmCbZ 1C9(ryfA$i63ZѮ l/H8w0N4 8!|jHH#7*"Op - oYJc"YVI!yD\  E"k`(ən%BjE}p0W -[-a=xi@J 4-*d`I~c\~:k* 1{88>Un=S4^Ҵ`DIRf3# s|X&-(:QQoqJQ|lӆd[S^5ݾ{'P) MI؍4854_P(.Ŧ -ĝSDȥD3+՟hca͒=Oi?8Lcwj4!RjME&1p-U64Vb'zqۭa3 -\1A=O`-476In!sygf֕S!tin>iQI1-oWkOTLxbl"9U9vxD/^ -H!A֬~pEςLV9%3ك%13 $RT -Z%`KvLjOvd+ufCqՉ )~ ->I$8e\6o -aS+Vk!Å1̭,+d(xLT b%W=dVk7(\ :(Pt_0>^S^*ٍ9# #ë3t8-ovVH ;5Ų\UYd9y88OPmIEq>sZ[C&%U~?aDbݘmTAm3HNlygJf&maیڽ'%eIe4)Y%'uFxgMߖ5+)+ 10w&;X -PHd7Ԭ9O%Hε;EGvL:A Onm!0٭]EdHtU<7n "Q y[ː,fswB2KS:Hu/ٸ0 ,-ӆFfH. -}Y&qPއ`FZ &Fn ]"HJ.V#,VYmsN2%1Cb$hI {,٤ttű07h&f]qn˨>Ch>BM\Y^ QwEE#IEun R -ݑPQi1,΍WG'~ %(aPrZF;`x*ݗTYipVP3QF{ާ)ర&͓1gh'(I^A).>͌b̟{=KsK3d.gL[J(ǪPDrp" 8i!d Iȏ[),[-_lQ $-$]*r4RED93[Eā'mm ږNvYۂ rE,|k" -V|!^bD5X$a6J9HB5L$4$sRQrXrT Ka[@ȻPo)Zmꆨn(O(YFG)X잌 Dy &UVl0TJ :fkNMM0̻{:B=Z0T^ePIZWz;]E\Qh>gj2މD{̸+u9x, -O(ZBNCbܑ<6-'SےZYӑg( 9oM0"QiűZU[ [p$E@$6nm75-H3P uk }VWKԒpuي1/?$5 J[[ -liQ%3* - JP$Q5+2YHwҊ/R*P5f@y@dtIݹT;S|I o#b6-^&̨x\ĩ -]#5ӣdHL[a 4|TLIX2`/%G%s5[fNzDuûBT,<ED(,*VӪ̵Y({1G,IEh:4PvAM* `Hfx jO^uҞNdFAa\.j' 3H%xœXNT}&.*{h{H'^eᅞd -=4NcرU! %‰dEdA$+2%"UP.!03n64k`e*y<4%e<#,W'lTaTladUE*\f=n[(&7v"Gvb$oGT`IEuHI I!EJ^GjtN$pmnhfH߄<qL䲷1~)$F4F浶H}0,Pai,0 @zh2l" !{t2Ӑ-(kBDH 挈Ye"p#z^E a2@T5l@'k<ۅ\@:[,,A e+D^[6Q'͡k ; -1b8ؓH[1 R,RRD5khSDP[Lv&_gVDShcVcL0xmN?rƵ mV$^8w9@\)*JKQ+rheQp$BE%ٌ)EE1 ҕ1JO~u$ԍ[<ͶXݗ~B.p,,f|aG,?qۖYuBI -]IfV P#rSي%grT`?H3E ZUEpmKV$n ; ,s"jA>)UPH! +w K0Q I3ޑŮ |c. W+U -c%0G<]5 <";dv;;`*^L%t=KQlsaNʮ Qxh9P"7 T -T`Nr B3kV(AXC5X @3ğ̳^fYXЮ&V34n 1.C9yQ -d -Gd-Eb! m YqDc3 -Cm3&=N!ͫJ`-\6ہt 4hq>.SV?3 -'~]V-Z. G.EńDtހށX;BR-jH -LsK!9=dHYtf%~%ґDfD- K,'u+E`X:@IߘuPHw!pAۄ&4($`hLݢt'K:"x,*⭈wLFJ`NiH L"5ʽF tU=Ed&fEof60h?)i:95AY,IѬZliɺةW@1U(/uı\7dJyGYO -oE!yDBGdZWފ 5Gq͍ꊆPZ2F!2L2LgzHVU@U06+-f3 -n`YLߤ? -+&_O(AXZT˪Tef2CT]Y@Ff(T *i"Q¤$Rb@%U=IzA?(A ˬ$gځ!6קze]n;7I{pҨQ;zzɢCki2x<'%3b x4ggg _Ufip] -<.Gc -'kFe -&!#3"X,Ea;,KWhDO"JE%>^pEg'Ȃꢊ ߗt.P#K@̠:B$h0=2;h - :Y *DL HKV⣘(g6e'>*yj?zlzX#1>y4fu5m Fj@'dMgTYVtKkvs(i8Yx^aIΑyd'3KIjP\C 7%_ԧcĦ~O}'`dhD,&Utt;N\/t1`7:)N |<8آq9 -g)g%AIVBŝQ$D7fdt>k:*tJI} e1Ž d$8̝Os-)ܸ< v>E{ -nXRƝ@:R I"xf2D]s # B1g+fJ{&{ U6i̮Gd'NJ~b-Z9?1h c@eª*3|$-KpYdvGTMXR/fd1[ I~Q0p0T+w#BկE 8d FgaJQW[MFp2|<~ - Ľ -[d'+zCP)ߩ&&H4y @4H ZI -TlY2 aJƢ71+">wK%vꐃ{ȬԬEfq%"i#h’)oQ& F!W`aY$ZȲ ֗"X:)hlg+JǺW` 4!pF /(ObF'D\- -S*Lԯ@fBVAH?R2Pɳ@d ,clܚ"Lm&PT A-cADR8Mh(АmN쨖6iq7tTG+mno,LVv#gB!"M-'NLĂ=Z!kes=ûKs\a`IE -U$ɩ3(xcgnY\_U$j҄[c=%c`e$8-d( f6Ũb\ϭ -@@<%8PntQ^w22xlpA_:r`&#CrIGTH=3)C%<,F2'YWSE`_"(jeyH qw;ַYq,@c)+qtZ' ^LG Mإ>29\ B8] Nt+?-B~vN95iV ћdIR3$~.<Ȓ\!RI88)/HҮiw1 FEy`(`| n#t'tbIq2h{.Gd'La(6 -œFdܬLo71J#\DFУh8# oj'0\Gky(tKxTO :b -*LYA;7 xR2 -9!7fJhŐg{<S}n$Xg\%2 {8^@z< o:3} /pG1"$*PI LBu*_cKӶwJ;-=ƛ -#(a[,7MT~-.}vop~v仫]?':Q'`9/  #=]&>;|vz{{~s]\^?9;\ܞ=]sC$C }~ŋ~=7;yvd?\8}ppyI.ͽ:o|,^.Qh/n,?".~vO˿eBWxX0ytb4GF1ÚNxrd\dBQ1Ov"%0=(E G^ V*<`O}Hnt))t1jz4{њ`uU9x2uЍbU>}{rW4a1NԎ}{|w N8]ќM_ ce8pD/2%}0m8x t pH"wHx/4sj\Nu&sFXzs0$#nw:dELt+w#džwr؇&: bRyAMV<<|4\!2]=pdo7"4n(jNgx8sQw/ۃTyc;EEp3I2FfN%2w/u "tY8$( h&sq/=, 8rU : R5ro -A iLD/2c i-K\d"h`oXrB1i!PH_x(#93\Ud~ a7335U ~-)U1Fp g$YQEKv -g ,1&h1jK*Kpd ;d~s^ZT怨Xz6 \dnV%b BeXU* Ew389H0(5D|=@t1ddl\HCmg8P4Wtbb# -lV!Y씗JC3(.#ҝXe4}Z7A>7@GXUDQZDfc4f~w6 -J\+Uq̈:g! 18 a@5U3kJ4P;#9I66ws[hYBU;m/ɠ{5,s@kֱTN: @B*ݒmsFMNx-9in; sۭlW*<5C@e8n(:'DbIAqlfߨRm9 nfG4MTS^DMMȼw4,D7'2EX W-_,*M\EO D"3ƨb ͧ$;VuLa-hԘ).i= .=(j,l\qHⲚ ԣ!۫#ľ.EHV}JIh1͆F8=Z FDeE lŸ|FpngRcf!x`J -(P4H;##N>-f‚ = += 7x!1TG3T`Ui)dT -#Tpc쎹ӹ8-RWCiҦnc8@ۑ?k;p~<O)KF!N}}/HhXz gyc$ RXow0'dJK+ցK߭ K3fMt(\Dw A<Dtt2/1Fsjb\q9wݰ-zT<84% YXLcoy.P{u>L0a*8!ݲaX 7D>@Q-:G4ۃp1cL0J)L - geΕU$~WKYVQ.$DIf(?.ܘ>]B= -`/kzrT`#`x{UJ?= >F> erumƙٜsV OJ7ClL<&ulDndxd(9vd-6L࠳N4bᙊ,duXֵ֛rc}@>[eld3Ǎ:*g ȏ 0o]E>.r]MiD4˰wj9<`<}Fn&>8vCJαB*ysc; >n0"2 rgvR o{O Hǰ7ZB-: ^nNgWϟ~{ճcOH%jUZ7oOob#~ ϗ?zuw]FԪlޏkejL.pmOmyc{;4Xsf#/~t3c))UEAoW?v\۳oÏLf( PTȟ"|73MBon޾ ?oN~d -&T$O䡞_㏃\%={F 7zs -3`ˣ<qIy9anOrζζ፮n/_ށ,,N\ مʗ6:نOaٿ -{8`pb H]/+]ʔzקT+Ss OmO}Txma2e`<}@qXH W}3U 6PAoBA;:#)+ ȇ pz(%h)yf2a&`TICe"Qeבa6>n׫3V;z{.2w Kq,vQ)$`?&!6eյ[Vw2A.G59fv\ \Y麉X\c>Z ZTBU-/"ˆmuvk*aUOCT՚*Gsau$x#ڄmE /uno7kaU]WD,lS}:kכ2oPfU#=z[QP_e:\{ -Fwf15Sh3|q)Z؋kɌVLzTqlNһ|nFQߕFm^Qhq"06(m5*u'3Q:y>֗o{:*77+":Ѡ{^>jĉ|Q4k"VU@4 ہ ?,|&T;>stream -sp!!HzkWddryPHծlHX 8hIqV9C K&kYhMJi-7ҞfdaͷFXYUsp 5ՅE"\l5.+ 4ԖeE0f2^EQWdLf4ƹᕶjb{ZhǶj!eזm)`(!XR|`Rv+DLEm-X3 ŦZ&x<҄>罛ۖLUolIa bgw]9<Llp+(zy4:}+34EoԖ{BEP"S'{ tTzgUޗ-Z"u,uǮ1WRh`oVܝľm&\3uݳkD>,~xA0*6d=K1ytY)$L5-lܪKiMdV\ ~Cx"hTTiF˙"a ֈ ~]ZK{E i$&jǷ@4_𭡿1k?'d&=O;ft"2S澰[}@>Ge~{&(7N#l1Q4̨.\gf~<Af>&b6K嚇ͺTzІYx۵RnsZЦIƠM5N`A5፶FKx!hq !h6jc㺯B=}|y\aK}^*]wOkQjאεa{6J/RXxsz6A#vcNimkt`f"JxA/*KӢ2SYBeМ"`ޘ랐/2ɂ b@C,EJj$|`eLS-^ 4v*U4UW2M, -XYHaW1LjNfo~"}=ϟ@HT2IQ uM2:h]2j&lQRV`V[ȢI֤|&jӋ&Qv3CWY\"yOTqZdE8B!9kdN<7%֦ˁdRiA٦Izs3ǒa6!bR^H"ZkMvPw. "y{6קɳՍ@_ur0}'[M,B6g5] #,6n,&i yS,ZLk( KJ(潩,w蘆j]UpaY޼ -QmxöATiA4v* *Fqj6UA1}l\U(p0F'Q.y{Rv )2m=w񌢾ABȒEʇΘ2b2faL6dWϸC' ܬ`$NndHZ{߿e>ٺĜj` S!0apo||3IE^g()]B$4y)Q%'h}#aVxVn,9)" Q7| _AVqۓFqG:ռ7F8.fs/lV*dզ-gf;Lܞ&9:tDߏi:±h@3VQZ18pnV7{/{3Z܊vx ]zJLܲUlެ`\êcbN}B)!o`aȚWgذR7'kaBP61>2 - w޼X&ŦyGׯ]KG>YEC %&ۚ5^~ޗퟰh& V^vk[͛-S -QyO(슼=uu2qT}3@4|8%.PQ G]ݺd˷gw,L_쬙i0 \< $aMvkc|܄t\pŏ >pŧOwWMm[OwW|:t\O+8q"_S ŧOwW|:\rK:t\l\!r"W|:t\O+>\pŧ;+\+>W|l\+MԼ1u{Yx\cnW|<x\Jri"qn+>WO|cct8p}wW|<x\teW|<N-NhwW|<x\+>\\Xͷ6+>\ipŧ;+>W|:tpŧO57W|:t'pYSz>Z\SF5)g/98y);N9&ڜқpsJܬS:5JăSaS)}vJߌ∇&8mSzmNҶνSOڜ!;c; Jp=CtpJ=sUmOMtS*/)?3t~QwJ7CNÐS0D)}3'mupJ߻е6͋I)}:}odS:Gb{Jo)}3O{Ji=a1sw>ټSz0F)}a8 m?7%t od^`x4$9]H@ 8"ĭ!-xfOl2I}c;5I :DN5VENB;'#fqa8`Hne)QdUo20rԓaIQlJ ZM0S)A\d0,BK ^oܒpPѐ:1RYZ/?_lI7;w郰sOkt>szM7휾<BMVŽ뒘 ҽszRJ -c 06ezs9ۚl,Tggda}+ݜѣH@{waa3XlmTw#'HUecXC͙vĠL`:=2g̈́^Euv20Us܃nKg۬gwy+ݲ#='ߔ ͍RٴzS{;iw44DX%㱲 W60|20֍h`Sz7u7rz5jtn`ĂLͱ)\5 7.)ōL]4WaC  j5MUuQoo-ff-4+ `6H ƂGv/LTm)B+6DL鶤`݈Y[Yp -67kQ=eaH -fb -C, hR]Nv&hʓ DB͚ d%2.t-2&co2E#dp6t}nQh"asnU]'noa n :m96.թ_wa 4ׅ4Ҵ𒬻ƈ8-;hp!ufPaIil/9*f@ -[k0=icUH1|1 Loa.xcfªI̛fLwb!хk4?lF!q-T )tq F Qm6ȵQ^ :D -S:n%bTSZ*;Q%ޯ21Rl.r`Audd9icC{Qj?B1MyA5'Mˁ<'>n'CY1pIɧ:ujfTф 찦]֬7'k7l:*Љ=[~.jcKl kO[U?vTq;J <χϻC;XWB6Po -׊`! R햔}a/II`l06iH;jIC;d\'"o*ωՄm)qnn6fFp9IsSDߺh.\A"6G|fd<6gF 7M̕'k4Xؾro5iL^Oḧ́ -w; zlVdaԛ;]\TtJ׈ ZOE~lՍA$᣾E9\j`8ٖ:UT$}9TS;uٰsҾڦ}ȼ{;VuθCoP5oAH -fɴW# D]cZG?&AIC3.wD=L׉Ƨ~UeV՜E/3iBnrmנԚVq"n7X)rE {&Z߈ voXX̟Yd -)֎ gbOXv1a߇n7n޵}ZWS_A d-3.Og4}?5`W$A5O=3 !~;xGxj^[EWl,D-qti_3/7N4վ?E=?{o7yMQJO..^L[^=Nhi;ӶӰ<.v 3i;Ƕ Ө44_8̡d;~N};!w*.Gn;ÀovA7;oJB&k,A =:.}-:L>ylg_met[4<~7۟zzeƏqs+fe.t!Έчͭks 8!;co9Oq7io'H}&D{]KG(nvS6`mgLqh|ǃc{8?o:a;'709`rm8L9VY7 ;N7irkZJ]쫞=3,r9~~zۛ,~ ޞ\'gON//>ݯ>{vק__*vs_|?n_X_rկ>g=ׯg7׷K{=se_>|_탇<}Û/ݧ7OoǓˋonN{qfW~t;{~xN/}ohyx}︔>ϟ~Շtx2)?^ͣO=Y#|vsz{r{~՞TW#6xGg0% 3!5GI!ox7rKid,^~ >Ûe%]O.^W'O 0:a7W̊C_1E_xgM?~_k_w@Xo({/{'1 ڴSV~_{,8Q^j{xod'u\w)]ﮯOΟO[aց{|E#պ>]ܱTUʹ`bAJ/t;{OyՊ7;._]}?ρӗ/yiew?x;kfy^}׺Waǖ7wɳ//n0}S_?a;'t~ӧǟcٗ~BǻmGϾ?<~}>l|>h /g/ -ޥ2v9Am[o>\t|2/>~.Uőg}o=uOFM 3k\k98Jkߟ^<_{#'^ޜL~>txyX 4Bu}Jjso*EwmA$W_\޿6{?j{w^8jz)y^wbna~j.^]:؎Ql^W5rQߩ_sr-^;Szk0;@r̓Fn-:&P[J{'pTlG*_VpRlq ֽ鵄 -w57is7kv׎jVk^WT=k9T_=uS]TUBu^K!Q#Jo>*=NJg&0bS݁GwTzҫGXr:ߣo[H\ -`9w掊UltTlJ sOot5o+q!n?sm7W֜2U |kU;Z>bn } ڣa]uxmҠ˽2hn[ܿiC[x>=Z{G1^3"u!yi3үzvx׎۠ܖA65Z8@h_6>KFQUڢҎ4jnŷQT֎j>|yuq}z{gkޟ%{鳯w'ܜ>lX{W|r˹ Ç/}qq:{27?_ҋOP鏧wTf| kW9`nm7~_/ô{~xO~'ϱ@[zt|8{ty7]x~y~յwu{, m -|yŲx6sL/62t^ޟ7=i?r۸Oeo^[ -V &a-g,2g-),%PT7Oe~+Q'v߯ u967n>[n#Lz/n-j\&?G Qq5޽>8,^ﮯa~[VӋ4YM}Tl~pYnßp&z'ɛ$M%L J~-8%qt1z/*-˱4X΅yNnPwOϣUΣOgXo0¾E9u?vt㋛xvsNܹwms9.mnzoOgK6g_}S==˻7^?}vuc7M{/la`ן=lߏ7?]=r~<cɳ)kw'no^}oSc߹6mxSm?n͹u/ +gq9ny|VmqP׽y֏nFӳ)f4~q;ג}Yҹ$œ -X%ԔB*AKƲ~08dngi˛O w7+t/^<}vsGO%8G^) qi~:'<=}sj>?̼4GiO|>:Gt?3۳O.1<į.G>bGRN->9ߺyW?Wcǹ'ˌΊW9:l4 [wm0.N?e_2evoܜ_P}zsza7\`_-,x 9sEz?Γ -? -]llQv÷ׯ~}[$ g7XgMupΕ̇y0{ I6gEz}I͙&*qN/e루{߄F;i0E>hc'ߝ{.jN/$4Mi)TE]:}JX>˗ssK)<$O`En -C {ZLuSc˛~?iˏmv=a)# wC9 MN̬ط$gco5}KRU$E.4pB"`AA(@|?z+XMR 0B#=:rJ%sٌS ^@="3w^8T - q 8^/X‚˂ry1H0 D9wPCT0|,l7PJ IxNț$@ItHxڟ#u}'@P 8peNHRTOI'D# -% -#HƁ4<y 4𞋙H9åps8)>?8Hf;DAqznD A4 V3EZ/356 -1n |Ee;D`#\ |h.X A58=]H -C?NvtzHs0eMUE -<'0qηƃԋOYDCʝ0 MʉTLࢀ\sˏp)9zEr Ŏn ᚡ$1w;Z_ -6$(J i ;0&Cr'wNZnKH.? G#sڦ"t H v@zX8yn:vñ=i`^(?@(>䶛$sBè*/S@[^4ha!frڙ[hR!2d7[ &lFP@S|G/T/H+a70ق/G%# }Z+n@0\`cZA -"- -`>$J2 ?p~n?B3H[ Ղy>+ .𓦘j>@?F"rUyF .P+} z5}F< l dGHNdDКB;.d|z~ms?:NwKOD_26w[ChqݍL}r|o/HqKSy|w̏{HEueƓ5\!8bEK~,s` ]Nu܁86PH3rEnҒc9$_hCN)c%HQOjJQ28hKP?72<r}zcvD<\ Út20I]^1I [/Gp:ًdEp5.@z>'GZ1Ȳ~J~tttd<`8nE94Yi}@yPHND 顜KzM䠗iZ,/B}>a,L[ yx< r.8xsGEZdh{Ҏҋ"s v` N\8Z`n`nd4Ji!E/<| yt& 5xk+d"t rcuDOcyupCLxbMmI#`'nSdN>jg;o u )]-7ٟV0ލ?$lx3Cڎvo-2:o_ƀYMf_&  RL'lwI.#n蠿7N@~Up~1jT[ӛ.gv lqrPBd }|ρzʜg$vv;)EԜA !dLOF ||lv.%1|0y8/mH1gdpK /e|xoU ; 6z6~7C=z8:e&ponn -} ͋E!s? mZѶ:o` Mrdp(_@)"-C~"@m6\\; 7LHp`-mZ :J\t9%79Lʸ3&<6TIAw;f Èw'*4$Χd\IipF&)XӧݜM QNlV ĿZqfje x<3o!!MCi [zvVl +t7mI5KDPP{і5U_0i.A6$u[W&t,1D.gŜ\*[~#+ ,Ua+5T^ۭ囑gQ; tJzG@&,,lt<:A4Mpjv: B'e<86GFjj]7wChԳ]-?bhHFg`Vܱ`P_6u`b? +vsٌH4xmW3}ٞ(;#x˧Sf}z0 x:MM ,)X>|ifDs5,ֻ`ahBOMk|ZS85 6iK-xL)¼#*q]rSVc+;;||AKi3Nv"rr~'"lVc*U-ok -z}6:|Ao3oIT"l83(F5!18 r(p vZ@Q,)Ja Bl h1dc88EΠ̅%^T ! J' D M቏bzαcP,I!O̬Nٯ$2̬XV,9IdEșC#6!URU:4 bѤwSA]uU,ע bFXcɤ\RTs / 쨘DScclBb,t S}"@(HA0NiZrC˱Mu]8;^,N/O2cNpm8:Tఔ^0Lޔ/Q&\km YEܗYt)vts{IgƮN4/mRvO7x@wu -cJ֠ CYW[b -0L9Ɔ/4i7b#]<$x=:@qiP#N]<(J9j ,XosXJ)0%3ҹow!:f8)$enyےr:vr"O)aZj]o&]OQ?l:>I`.;_DɦMS{=[_5\XYsp~]R/,hC퀂Rr]Ӿ6glFZɵ3@n78T"lx|"}gRz.݃nuFG/*}\b|D37t6@4@d9zXly""@^#u 8j ӳQoA h6F: *]`ϥ8`ZpE; }z5^@]NΚjP6pZo-D^>lz%-^򪳻g;4L .P@5LnQxǻ;Y>s4wZv`<"傓W8w[r_hڏvjT;H͒Pt:>6!y׉VzD$7~wZxZ q$ Ȥ Mh[МSHfu#o˥Scz) &¤QK  (5c@+{`vh%oM ͷ, ޳~()H}nVHz_RJev/Hky&=6t)Mlvj > _R) M5gif1L44AF [o$&']mt7gS3|7,Ku -HK -[~6_q3[ ¶;'X9 c~Xh"K_7:PX&˯wM6]4lw%?Z 5^Ԥxf7s0Xe\kLNvxCAB`4IiAS2eV*b{e|&v Q3_WNK9 "SQB;eõQu5^`uofcht-8o͝)7sfCV5Wm󬱔 px60'EWHn_d -|zh^[9 pTti  7*ӲFܴMxiw3:9 -1{J8`uw3SPC@ļL;=zY0KIO㓣&[HP{fӅi.Y Z F=5^b,eƞ4SwD<r%x\Xe -gၚ%@E@||9qUmn8W|vxeYE 0cP9n[A\ʌ[nzѯҋ\b4)(d-T:Z~D-~V=?4@#=Ii1]Yc^0IԤ V|3 u(0Cb ak5%0]g˔\6@@\׼l) )uuc: 4)ܵ}=\8i3$-Ek0=qo-$##y8T0-0}b@DI4$::/vm+m# kq 9H%due_Pi x,XDהOatDgS U=WVe-Ck'(  6Ojஷ7dKgW} wSasd 9]6e" utѢp{\:Y]guCE}vMR!:vF}beGBqx軝 --"v;h`@^Ԧ``|İIR鹇%0mT<HQPUcGKr| Ș")žR;f*YV;$$j<ETT QM -OuHǤ%>*hCZ)7,Q_sߡT-SĆaXCҎj>ʎtH9hʮ;8w`5~ u"~f61XTt~O9S9z'}/6d|C/sO}4k}MZ%>&Au&u|0!p_ORr{ ->a#u#[';|;Z[ ԓ7lgFt_-=$ }Es y=[y65q Wgk*̮VKg]64;ߙ6vLӥkPa=|KB-邫Lk?Oh=oBDۨJ"CGS Fx яmsLP+:S';ZdD.h$Ә>qhp$>qoI -|53ƭDJZ@*x|Jn<1L0 ^=[Z< N6X8_tR -IJ`a4SOϞR+^8Lo5fz1s0`F< -ZP+ iƽ۵m,iᇏl1=15i1󁥫T= A<cO̔i1s)d,uuvc s,V q0\׶Ek 01Ji]%gakD{ej{IXtw}TM]nY_*I㺾 6n~?5a>ȭ7u]=>uH*aT9o;}Ko?깱~ߥvf`9zwnC_di6ͩ+0.+o1l˅᲎ǀ3D#>ހ7h/L63VT4vMk41NqĽK6ɑLr9j vS>j+=V2-Ћ{̺b?5fwhksޥfe^?͗b2--N~h cK[ޭ鍥[,#Yg햋Sơ&iuf ְmi͜+kurX5uXuצ޵6.j-~J|l?_݊mmo,mn$?+v~ǗЋ1vrXky8EWak4Tq8chLqW[cQ/^jHwqw_BW0U:x79HӴ$ -#B>'1&R{bu*tF gt8KA3sNhDz2;mqN岡tpд[4.#ƍO8]kI!<O"Qy-'aG[WԚ+;^2Ï -~:c6[jcCe0 -՜# Qŧ! sLDwѝ'~ e^&6Y: $EKͮTYK15:im:MtjDSif*MȬ~=gCe >[ÂHcr;%TrGT>];e&ߚ7U&o9I~Stu3l-,Z2V?ϥǠSFեlЙTMC\^v>+&Tdjd{7h߷t^Ɇ~16ԜˑV}]kRǾ׺?W׫N-^Sፘ]l:fv3h_ jAcmi'?KG3^oZu32Z߮)ttb~ui^b ʤo`#,>Zc1?Yr-8eLn5>Do^zom|ȫT`3v;3, p[Z~L'#?d-Fx;ךkVڸ3'1_:*ݤy&>'Ra4Z?MO]=Z#9ۤB+̫u] UXTb}cKW}Zr>V/ShUo?W2>Ie:Lםt·>Fplmx` v8_ż_j簷`EzH}\)nf_lM\؝Fje5ɫᱻ3򬹿guaX-?9z<3Ѓ+ֺ$@n4"GNK]bOVz}`=Z&a -k=Zl̨4F9pc՟()04씼f,r7]*`Miz ~ZH5"Utl~{Ҵ7SLg>,#œ5AN-z0`-5Q#N%:OM,ugw-1@Ө:}~гJ!y@9W7^rv?MO|>BwVKirehߋd^);u`RO+{Ҥi6eNϚvu߮#ީԳ&ՊXOhօS`0Y<ԫCD/}MEة uobtP5R +[u -V8[;}w [^=]8D;Z&ݲ݆1;%FMgCOHt^0t5rsu-V|ȣ9zNld;tSU{bxvjwFٲ-)c#ކٗdu^l[z7[|AJ'kMuڷ3yNI:U/'~ԭfd?~ZfxEn\KA9a -d͊#)X/4qmthvDΒvu -|۹V-4ch@S_u@X;}oAݻU7DBr;,f\HuZ2x6]A$N6 5ױ$X49";/9L -;tZL/VT9 j Vu,T7TQd(Cϼ`6S Umڝ+T.Bg2vӘ1cBB$6*BKtܪrN"&s&K`.>Y2c$]VFT-ŜXUۃSy,I=?f$kx&\͐Ool^)X7#17z.4%^~Sc ^Rofj}xiś &zi+FO~b>魜61&\h"Yb۷OxWHH=}ǻLJg ſ{f_>wnz !8>O'n.y$DYXC$&QO'{}\Iblj"%۞ -_>ğ:5`*NCԘ?MҞGBly\8mY;)Hmm@|7KRZ,kgwpbHe[1_?gSI$J:JѸ8=k\%HAO瓕}gO aS8V !uk+?!(t38Jz1@Jkix0xdC6>KuGnyT0gUdzx0Tj^$[kKHOoy̏/yI#,8#H Ŭ0$$qoHuj10YJ1ڌ|nN UѪ+&我֐W`=! -!+26 z`PG(>(ƚ2CJx -Z+kXh\ -1ca5# -a`|r\iyln8^;v#/Ø@=1*Ea.ѣqu&{I!$Yۘ.|E/gЊ+<_1-j+ /Zy RzQ6IPrW\Pv}") PkaR2{R@u|' D Gqueg6%)/I3߱Al0xA }a[|xCh -~6͒+F [P.w0Y -Buژ1}! w^:YRYS'O( *cȒ]bBPT:1d=y/p;xK|[/q 'ntɥ J"$mQϻ ",a2Pp/p?$ 5r0<&]N"95K8τ7ȵ_tOOHS91X(L+_+p DD(HsF<7cE`Jbm&@>;*kLPz(f҉2UM,!5HJKPX;bz'JB0`=΄T:yNc}"PtpHTFe!v֬35V,YuQ^Yj[^}'xzQo"  l,Rd@hDKfűacS0͇ٟP~tRZO0]V7p\Me{|JT<TNcH4[P;#w,^iʇ,x9@H42#$!&n)7/Xy|+/W 0Y^LJ`!?\j+H]yp>tt w! u!Զǵ. aPzI)0 Ib0$P("TDphWږ*Z>ƼT) BZvXb'N#xqKIs&{}@- 2'ē%Zf9&&Z\8ȶ S^SCgT =UCML |[-\ S -:NS5ttjgj+dV >SC'_Aǯ{ |Ş: -:r.eޘvϮ:*H/Խ^8'Ha?|Dfx(\z31Ot]6ӌr%1?a͈9F@PL{+!vEsȚAV?==^SAHBA2H晽9&t -LK#hbGSAD}XpvBi2/^TIi # '7r --%)Xѱs/0!PN25v^EHC}Bɕ0>81HL&ҵ$9 ?4iƩJST3'\8Y^u|fnJ4m&Y#4r &|~T߽xu|ܚ{̀2")Q:.#wS&{)y cgD'TtzF-|o+Ů^NFZHtMܕ΋'ٻ3 _1t="GWR8W('A!q$kD+ETl^܍z\܂ +T~c$>/.b(XH N󡰅c)#u+D~ +]*E+IrCbyXxGrX@W*dq!1'ꡈ̐`FkI."Ü٥lPEd^?#2$陈 c6hԊq\ m(>ŧ#2`jntv24PڳXT!"STQ)ϓ(*Ρmsd$cSX.I&Hʄݔ$p#siߤup|_{u=ܳ)c#OV=GNy3p;Sz'N&65_PG*Hj́VĽNpԶNAe=TpwrDP2RAN$|n*ر58WMf;y;8 t=B-9w%b92!5 a+%@2O2?u(,<5prL25pT\N*mRfkNFp-{Ep\ZeؑԅҧiIYwnwEF0"DEHݐ/󔾀^VM'^<QPM'Fឪ>̣tb1AtbtpNsT/ZN,BUQ|M5>3t|t;#{}u5t+sd5'񞩥x/SF*^tbCVNNƜ'ǜ j:1P jDjF+UӉ=1tbt5VOTӉYބWTӉ t|{,3j:.j:qR 1%+ZM'6!DRF)ԓ ow&\=ry5鮴[u"ՉYtf[pwᕱB\5w*%㧯C{),{O]sǭ┼Ny5wFx͝hDQx݃Jݜ.v=^sJ/8^sZ7Kt-OI>Ʉ[H'{`5W$s*w/NPZަ, Ƨ%om2):/~ +.NuGȆB6kP<$JA B*B}pQy]ΟV ޯVpi:&}؅3Ma^¯ߙ+Eیn̬Hqt$*;{Zmue7ܩ ktÝSs_ǧ )̈́Ή k ={Pya-~tǙڋtu3\!8Y9Ws -ҕveυC]H}Mr66oh\K7e`S4Ij12&"t:O- -vU JEL=仿Ưx_)FL.]PU-cz0^8 ֧M9 o{5eγcExgˮ{ Xj6LS5ޔ*Tj/ HP\ʮި폢@|:9/Z*+1^e})TgwZtzƨOҴәНN!'aS;zZ/Ywإ@/aBx眅Mv=JC/ڿ{SS=QN:Jtg{ə+4YΤQef*3q88%;ų]SF:btp2-iӑ03lJXgltnG1NU:/mk: ݣO!LVIuJ^qUB,)$,JN6#¸d'i(:i'.~%ike;VRd.ټb)Dۍ.tʟǣM ¹"7($}^fBԪ;UifI걪4 M9,-89J-^WfS=0(o\/![]k0_p%2*g[2:^GGw/<{)WR>ѨLRMd;w6V?-f8JV+$POrj/8<%Wݽl(tgC)OQ} ep)0HX%_rV?a_'7POH{e^?Trd_5.,?z^?yE'|/EV'N':zѽ~9^q~'}c^?>~'>|t:kP!ɖWUI'{~4P^?kɊ&({1=[W>ué^?bU*\f n{>>U29W"I|^?2{b6[H9~NȂ}~n;<nfKYqVa Dx1ֶ `ЛÆzbNtڇNWbQNסx6$h\`mjS恝`9萤В 4&|j4o.i> 2`nP; $G8ĝ#vBf . -N1Pbj8VF|mk늵v$&Dѯ_§>U;ŕ4O-jr9>@@v#:5,<8 ێS>ZJD+=r48Mފ&|etzyH.}e+CX-a(²i'fٙp塁.@>Q/< |Gmj~z`'䧑6F9hT:81-0sb,-Ά3_#`W;umrˍO#䶄*ZOq_.3ٷdQ&=ם[pNzFY[@"RW.Қ55zޘ&+Ťis'3(M{1r4XH+w@GV&r޳2E J]3BL1;Y |uFb~ Z`M@24BcwpF0SǎHFv#wHljqd;3.=d)GV" d(H|r'[ïKɧ~։)!=$DH\k{Q=ZO&\ιm."7QDޖ% .|;wΒsΟL,J˖)rKҶf_@# -팀#!8DQ~9]zs]{'սzP]Uwug˵\OـǜjgEҼV Iu}S^Ooӿ8+GZ9q靱Ǿk9{|G3={IOV;Ond}>.^Mʫ^j M~/՝%s9.<vyCf@Z|Yn[?]ijƎGKcU^;qqRWGٌ?~ο[zzJxʕZE{ܭURb2b^ƯgɳO{֗ ř($H n}؃?CGܾ(uk-o7P~_)5^?TZy\>qIF1I7L~,ե./˝0LP;a.X73w9{''K9slmc _?c+96^ 1ޕ{;jWnBc=6L|cfZ9ȊbؼQcGWvm/!/mfZ;-|̠}z#e}FK8*ZZ(7i9#,acyᮢM2_^ixo3!(˱3C?w-f_OjZ;kkzŞ[ޞ'ΥL=eZ`AKl|!L.d*_t䯝77GvԸȚRsv2δc:oϼ||Yj5-~, G\ɍwW^{o.9jų/nF궓{m<ٗcUΚ?~n4,'P?\ =Wgdo|q=ķ479I=jY=)~o~ڸs ٷL=X>u^_n~miN]4p_WΓsWqTK7K;9l&T-E86_=+3/v_fK\Miۆzzb[>K?ǖ:~7K==b_X/Ҍ-Ӌ}lo RoS,fu1ѿz׉57^}DsoN ďVp_j {ϳo{<oRKv7^! >128j⼼r{vzi_ޔ-Y 췏XLGDn_nQimJkʑп- 3?>H^*oy·N??#"vn.S#׀N4nwMW -0*H,sX^GL@l|;.zŒ:Cgh>G}Q"&YywW[$C3"W{%s.||:ݬ;uwӽ5)Ě>uqfIb*QԵ ;ޮ;V܉|LάDC P=:մi%_ΓC|uJɁHkcЋ[gǤΊ)Or멊zayN-}|gx??֙VN&JAV4ʴo. -Û'ї{,;[ۭDMX[{> C#m9p2/O:AEKz뉿V ]`Z\{"Gw9`Ey])pM/2 _'A/Ȇ7W0sseFV]0g;<a]s ؞ $lbձ_8{J_^(d -rSԥbny ^E3Zw~\8uq*rԜ8qÜ\Ku_fcݴٗ?&@z|}7)Gg@Y9s~Z.g!`}Rr(aCw_&d?P׆S}WO _?fjr?~ٙJ=xݕw{o?͞]Yiww޽ܝKEʤl^`Wýu.{ON]õ;cK[/[W~:6~}$0Za}om2X_%5i˻.||un㛤ӥOݻ4ߜ}?wVoߓz3BB3gNwR^==tퟌj މVnz.&ߚy͛i=5"HkӲʞ~3_;j[I`ݹteh8 xo޹"pH~}.cwC?+Hڣͪ=oIfv$8/"41\p7W.ڽ~cLCUUH !k۶9LH^\_\#Y-],Q&N6'^OR[m_9B5^!U[ꤒ -x Nl;wS2H}8aN|+W|҇/zo:v^9[O9YZOrpҳ"l {{0ly٫jBBZL؟OÓX -<Ńɡ3bș{z3Q"8EF^KOM`WN3Ch͟ @.M;6%n:@t;;dIX!Cg.|v,ݾؔdxo*8/k u2P:$$U|߷A:c< 8ߎF,㨷kg6W8^A˧:k?ȟzrc[ipzt Re> ̱\m?qNṈ>ݯhk)sK=qѨ4tz mXhW ]U2bW.8ڤZh7ɮ<ޅv@r v:Gik -_lSMφSvb_nCّ'[1 uVUZ.dV}Nyy6A_1>QsM&w]IՋ83Ջ#~FՋXRi}?b"b|+?b};?bO?b"};?b"&qw'#?"}_:?`rj5"b9 -DvS9yV^?4Jҙ8i%IL^<s{$8X *ğ[zzfo XRPDV^}ec?ĥ,zKpPL}?f́.x -gixm]}w?̨Y5?:/fY0vfnkeç;^{ῳg=Yyv=;;Oi-jru}*~yO?ܞF>ڠgFG+ -<ܞɍKܠ ?5i7o7c]^,k~ޔMoG6ڌ#uE6gy+bZ׊ ߾6!QgfUf^}_b6 GƸ -/-57Hzڔ>ܘ"[r1g{\ۛ-2=Oyюj{JUL=PmMaG)҂Axag#C -V_} VvdQvGQHm #l?>{ݻ7 P=AhjuF~]ֵ0Wյh;OuYi-rXF*z7Wz_CiO>~jVZō}ugښՑoON;:?guu+{ohp߾z{KRjWWz{oϡ'|/~XNƍ_wӿL6]jiwOowvַ?mo]_ߺ~qkww>['A,:0FR)%{ HYy^:k3#S*H ~mJ/} SjPDpxbC҂)H3}iI{EFЪI PI(#A/vU egTzR_X/,*h4,BdtPm!ںySwK%}9E.t*K,VD0 iTPh;fQzْ* dxLj>E1:̰ n4QM!`cS(€ԪJ4&ߖFGɶOQ`ZMa9244u0魡 Kб uX\$la5E߅^Y[LP9-bPI.4w"V m9hΣ5*)Vsݚ>E:(4`Sq 1tR -uAW -}mn22WB^ 4zRo;o g_bV:Nr!@vWV-/ `|LRjl sag̑Zh) 1U DUMkē1߬ s2V㽹jHWll7݀? {&iG6!) `?D2?76ͮQ>ۗK[݇ߩPno^oDq$p|@p6(=`z -VLirmLiػ֔&iO[J׷2C5u߫!Ɗ.H1rCֈX߷6tQjTg2e0ZpA%  <`|=LϟqF*#֫38 Cm((T+3z-WC<ǡx%SBQA8(eĶ~^=0?p:upO>')k!|{0 {} -4 )jeJK҈SPUڧza98].JJvaȞ3X IÓv7+XiT,?OAb(OA'c)Hf -а?+OEST,?$=I Cu#rВ AM* -Flv;(+ʶ#DHa*ijPA Re2tx] ,.M_ lDJS n1ɡr63)RhQVBfW$4~P:w2-Q;(GS,kxJ N#{  Dž7Bӭ?<}95Ds@4>Yں`yQ]$nGXMIO1;TDD%AzrZ(7ՒKDo}krHZpa19,@60C3@38Tp=Mcl*Mφ>7 SdSH@PA&7rH`Q}ʀq-B2:5(G6Hq~՛*FUdS$[t7 -\"qbEhtv@Wo&F?|: TTT -`BS1SH)W)hw -ҐRF*TJ!L($OΙJ!1S)L!K Mz0.D6 Fb 3jRaSy%To8Z. *%9IzVlR:bO*H!^RL"E*AD&!%yZ zSA1X4|XB"S+Jb ;;R -4ef~!5ZN1}{|CI.yŲ٬}8LM;ea5˱e\k1Cl0wT`Y`hn[ &UUk\kk7{Z{EI>_ԙ6(-zaS# JN=P)=Mf5a[ʔ?)dI{OC"DUҖ3]!AL -QF74#;_ - IqM9U58r#rNa#hd rƱkuH%2V P&%Q#t$qIkY!l:[}J+:La91{ۧg{EfXVCE_(,K8Q8# t!]ETT"`*H!2QDBBH% -V$"X&D(DT $q`VfHCTr8'.6 HL,Gkaєof+FH*yjCP Rxe -UeĤePr[$LDlË;8!s5,f(?CfBؖfw{x3 jD@P RotVjGsc0BZGqWi$im9 /hAxO"4O{̧?5H*f&irf6 -)SE*`*HOtSG -]3giB لAr$m0td5ԒF隣Orz=(GŅ}b+}b͍OU t'2$+ }Xf -RاCWtEr@rqE cxb L!'Js)<=7O8Mt>"Vi;46jwNN!X2՚6-u"iVuZ$XvxA)c-Tl!#M t>"%'`#sWWߓ liҢZS# \3@5 qhtTɸ.)v2֒ZBd,5Maɴ1)11d 07π%HSٶFe -B r - 캯V+r8-SN R(ʩ"rH(QNw)Z1QNO'Z)Qǎ2D/!յHgͺ"Z7pArL\S#@hhSNӌѮRN)!o('Bk~2 rX*)4S2vv$ʩ"r*X*( -TʩbrjQPN &j9D*(Gב 1d ܡo$Q3`_L:c@VjTvHq:}J%oG RIҩ"t*@C:U,NSE*TB:ќ!7iJ;ŜN$|hj)HkLP{ IkAhpɨ\aa曣I|ڭ-G#b{ >1cG\iImm4cxN͕i',^3hm;4R} ;Y'Gv5eoQB8@)TF]Iv -97 -OњRwX;U,9rא8*JS7EΕ7@RLַΦ InP J&hC3@38z{Bی>Ӣ50V'{N渓ё6c5ơAG gQSc,41׵toLHŘ}1S9^J[ɛ }Xf2R٧T`Z!q)J|3g1q𔆍jI}2MgL+)Ѿ}D{خ+H*f&&irn6 -*SE*`*HO˽͢1 -'zPCl& !A -crt97eH!ŦUheKe' -Xx̖dzX0P T -@U2P -f(,C -fpɨ^"QSd*+oHaL>ZVi;5>w۳PP dXI'9b Wӿ7Vr\Uޑ _j11_Vjbr[t$kk|3mHZpB wrXm`z2<@4@zg4'9URPʱ' eHzz,@+dUHZr,/QDrdj%R)` (]K[r%e< 1 -%thRP7pLA8VPP+TE2UBA5Pi Bs(?78ܶd ]5CR ZIleLspLN\%#`Y]qb%U0>' N'POSA - 7,X6[-BrH0k'J!(3j@YaJ۠b%K)'qO,CsӴizf|Wq;Sg?ffwvv - @8+;IT -Y-YX[qpkf&CЗ 7R1^gm(>F"V ݸW6c-֝tHvԻ8X+8i}u]i\%hĵgqN>/TT] f@E2\psHRl R76)8*[p6l*P -9[%4z~\ - !-=< I8Up @.VjA0G83B"mjFgY̴r[& Lbrp|!,}X{ Z4#Ӹ:J׳e tAk F3DZBH?<#gr ߙLPH%@3|R.DX8-2!77:tZ;RJk\Sffh!QpsfNa1 @ob0%w ~ - MZ2BEdj.w1ZnO󸄆FF9%%Ir+Jz86Q߱1}bv9U!T_i28v6J7VJK`&ii{#l)æn@P+p')K*ЖVo)ea6K0FsT,pFko<#2j}wr/k yɤW*&"X)kXpM4x臐fV u2zwfYm^T HƷ8K !dE\|mR@b;<"&Gl7(lJ9a]H։" o\Je^^ -y.!9*, yDb6,B!صNuX\Nqf5ҵ8 ->/B0{8UZE1)%K҆n f+NچILe 2Sޢ *Vˍ9-őG+s3 ]P$@ XA p:,;h n27#Un+=)rn[@h̨z^HDx~HTo 6 -TL0i e4l${  e+Z[%Fu=K9>"JoB<0S\弱5&DZFlMEA184DTvreg|1exPv̦RHO eI攽%yEFSǛNLr*c@^lᝎpli0d Yqp(XCb:KـEzBHMjF gcN"ަ `Q-KOvm|ޙ8뗦KڈRHe8Dk\j`u`sL~=6+2xy:y )0lRuDo6Ln|Wr( -NvC[ĥݰM^*w/6'"O SK -(lJ̺R+{_o{|eXW# -/$n -tKBo,#ݴ2{i}b j)UtO篝FX'eW<8Z/>+N0gVvaa9[e2:Xz.{JId!HSPW$V/: j{ɦ|0S1ZLKY1XT.JҔxorHxPv̨5AY1 %mF(}J 18q ˼ݲ`FFΩ-u(H>yV0k3q&4-Y?;*B`ظI} -g(7rm{u 8`& r]-5FW5R '4xef0Yc 1š:Qd(S4`2c|#^=- "!G Xc?&)K@ {dAk7!C̅IR (<2Kp~NI?qjO Ҹ䧰xa/!|) /]= -) -3/@xceR  -)%sA$0"+;ФS!P6ӻ: -JaShҷZhx3>(Fu>&`uXe$)!k3 J30b?sZRls[K9i;;9%1R=+؈CۑCa/0+$|b:Z`k)9 -b`A.T*aDa`AN8\)|7B>neOFdyʃbQyL:췺Ki!r2t]ZV\cdi0|/K5!VC6#{Pi/\9 )Sg=Ya1Jc$;~DnQŜf#Wc-:y>Xem ueQ[gK6LD}4B[ػcYZ A(WY|z5:n숡FFwQ͵1 lXqr -^?{ G1 *@$#]煏^c$J""W Sa)$Oa[F`vR31JX(Ouؼ 5 T.c$nCb^[pxi1fr9q;% -`aslz3צ0 HV` D (){~)H&HR\tA55+(I+Q9>P'qriZϳd[(#10A;h\0@LH3K`3:]k 34XcFOLV%l 4dm(cJ,~-Dc#7m7'#8[#LH5 ˦y=Yoڙm~4 f66i*OSsviR]7ܲFoINbWtʥgTcq#/  p-PlcÏ^\L:"e6Ϋ 1DS@X>nDҁ\ -BC,\$ g g - @@H/:?"9E1U-RT!-H<ȍL1|!,,T$-)#b;VX>N " v(61)gI:R@GyS`:85 UI` yG -Ey-fGB$lE!H[.FS tDV-tnBZuڊ#;|w)4Y|W l1摍[\Kьؔ]qC>yybV(8,JNgt0ˍ  xs P zJMHp:oNbtD05"t`x1IщǴ3 ń饕Bm#4 =i<{0p͢_`Xxp'gkyPvFq>9bp甽T,dQ/HKEDĖq,g+fЙ1MN/kF6 m -:׀x,5$wGvi\:fŮ->(&]i ̭-(bMH׳(AĶUOm6Xn4 k*>D(DNZ5|4)$̹˕j&9# -- v!hcFL:Ay פ<۲|WA9&9⡬mmm(N{`xR=|YD!|6 1@M 4׳M=w}Y'a*\KfBm)ʈl-|MJIDWxSQ )G:-!a)c+^ -X+/*Lo 8a{ PƁ1$=YI`D6`m萃@ -o VR1Ѯ^ ě(qHq("$۠+9?.Tp8 &Y|D>d|/,%31 yց0j Y$V},F8,zSJD'$VShn59A\E]MB=24;p)1y/I} Iq˄p䵏Ski[ #& -F}ʁΝ43IFAtuH199FTNB !ɖ?@Ҭ XһUӁt1JȘ S6/^xL;H6TA =^)~APmIe7ǾĨʑgraײ$<&/:|T@DūuRFFf9@df:Iva%t^AHh%ba@H*I9Qr&O/-M`,qQp9ԧQ,[X@nnħD31c?*"ilnxA`heQ8i'6QԝIHnylgT |Wfap/aX;Z4 ]a8!]e8[gdG[1"58:b -l早dQf]r3N *eKs3Bend`*cډ#6"`4FT$g6ה|lxKOOjOמlSX ),: " ZxG=r,&8 dGzEN?d;w xjD Yt g*?|3xbzfOdOɝX4isLa725TDImHhD -ef{uLrԇtJZbO<sGl1#!b,3T€oh m*ŁpD:Wo!ç]ڤpN%;%H8Bш -"8S#"t-ٜ{-D9uGTk .' $.abpK(T8$ME'.X<ނ8^ID4JjB*vw5rX@t3>E"cu/C$ThHB<rB# -3N)tDsEK y{IZΗM񉰆΂f*ӗY}`>!E yKwşOԼw[1Cpc|zLы( ~&Ӕߓ yDK;Y~D.t>~ I=6dȴ2Bг "8p8!e\}|kV] -mf,Hj rl֥[G - dFfd/„6V6VvmRr(;M6yl9tfns9y6]8 a&'i?.)Ys/q3ET|Lkfyo w M>Fk7\ڢv\NDfi,! -sHH!.+)tWV@T;!2ޒ}*(ٽI\*'tymu)£ _Grbpbdvd7}729Й:fP:Ŧ$x)h1`1T:X\0,SNr 6q5u: yrH[8[ 7'g0opNڃ0}H?Pq,t4㓘b8ckl)HT*"[M1.JtVT%_Oe]%Ou) >! HT@q$Y|rCi8a ZMMٔO8%2 -+ك-u5_28D#l6UfXo_M^)^Ԅ)}=8F> endobj 29 0 obj <> endobj 51 0 obj <> endobj 73 0 obj <> endobj 95 0 obj <> endobj 117 0 obj <> endobj 139 0 obj <> endobj 161 0 obj <> endobj 183 0 obj <> endobj 205 0 obj <> endobj 227 0 obj <> endobj 249 0 obj <> endobj 271 0 obj <> endobj 293 0 obj <> endobj 315 0 obj <> endobj 337 0 obj <> endobj 359 0 obj <> endobj 381 0 obj <> endobj 403 0 obj <> endobj 431 0 obj <> endobj 459 0 obj <> endobj 487 0 obj <> endobj 515 0 obj <> endobj 543 0 obj <> endobj 571 0 obj <> endobj 595 0 obj <> endobj 596 0 obj <> endobj 655 0 obj <> endobj 656 0 obj <> endobj 719 0 obj <> endobj 720 0 obj <> endobj 783 0 obj <> endobj 784 0 obj <> endobj 850 0 obj <> endobj 851 0 obj <> endobj 917 0 obj <> endobj 918 0 obj <> endobj 974 0 obj [/View/Design] endobj 975 0 obj <>>> endobj 972 0 obj [/View/Design] endobj 973 0 obj <>>> endobj 907 0 obj [/View/Design] endobj 908 0 obj <>>> endobj 905 0 obj [/View/Design] endobj 906 0 obj <>>> endobj 840 0 obj [/View/Design] endobj 841 0 obj <>>> endobj 838 0 obj [/View/Design] endobj 839 0 obj <>>> endobj 773 0 obj [/View/Design] endobj 774 0 obj <>>> endobj 771 0 obj [/View/Design] endobj 772 0 obj <>>> endobj 709 0 obj [/View/Design] endobj 710 0 obj <>>> endobj 707 0 obj [/View/Design] endobj 708 0 obj <>>> endobj 645 0 obj [/View/Design] endobj 646 0 obj <>>> endobj 643 0 obj [/View/Design] endobj 644 0 obj <>>> endobj 582 0 obj [/View/Design] endobj 583 0 obj <>>> endobj 559 0 obj [/View/Design] endobj 560 0 obj <>>> endobj 531 0 obj [/View/Design] endobj 532 0 obj <>>> endobj 503 0 obj [/View/Design] endobj 504 0 obj <>>> endobj 475 0 obj [/View/Design] endobj 476 0 obj <>>> endobj 447 0 obj [/View/Design] endobj 448 0 obj <>>> endobj 419 0 obj [/View/Design] endobj 420 0 obj <>>> endobj 390 0 obj [/View/Design] endobj 391 0 obj <>>> endobj 368 0 obj [/View/Design] endobj 369 0 obj <>>> endobj 346 0 obj [/View/Design] endobj 347 0 obj <>>> endobj 324 0 obj [/View/Design] endobj 325 0 obj <>>> endobj 302 0 obj [/View/Design] endobj 303 0 obj <>>> endobj 280 0 obj [/View/Design] endobj 281 0 obj <>>> endobj 258 0 obj [/View/Design] endobj 259 0 obj <>>> endobj 236 0 obj [/View/Design] endobj 237 0 obj <>>> endobj 214 0 obj [/View/Design] endobj 215 0 obj <>>> endobj 192 0 obj [/View/Design] endobj 193 0 obj <>>> endobj 170 0 obj [/View/Design] endobj 171 0 obj <>>> endobj 148 0 obj [/View/Design] endobj 149 0 obj <>>> endobj 126 0 obj [/View/Design] endobj 127 0 obj <>>> endobj 104 0 obj [/View/Design] endobj 105 0 obj <>>> endobj 82 0 obj [/View/Design] endobj 83 0 obj <>>> endobj 60 0 obj [/View/Design] endobj 61 0 obj <>>> endobj 38 0 obj [/View/Design] endobj 39 0 obj <>>> endobj 16 0 obj [/View/Design] endobj 17 0 obj <>>> endobj 986 0 obj [985 0 R 984 0 R] endobj 1046 0 obj <> endobj xref 0 1047 0000000004 65535 f -0000000016 00000 n -0000000746 00000 n -0000043523 00000 n -0000000005 00000 f -0000000007 00000 f -0000291084 00000 n -0000000009 00000 f -0000043574 00000 n -0000000010 00000 f -0000000011 00000 f -0000000012 00000 f -0000000013 00000 f -0000000014 00000 f -0000000015 00000 f -0000000018 00000 f -0000298050 00000 n -0000298081 00000 n -0000000019 00000 f -0000000020 00000 f -0000000021 00000 f -0000000022 00000 f -0000000023 00000 f -0000000024 00000 f -0000000025 00000 f -0000000026 00000 f -0000000027 00000 f -0000000028 00000 f -0000000030 00000 f -0000291154 00000 n -0000000031 00000 f -0000000032 00000 f -0000000033 00000 f -0000000034 00000 f -0000000035 00000 f -0000000036 00000 f -0000000037 00000 f -0000000040 00000 f -0000297934 00000 n -0000297965 00000 n -0000000041 00000 f -0000000042 00000 f -0000000043 00000 f -0000000044 00000 f -0000000045 00000 f -0000000046 00000 f -0000000047 00000 f -0000000048 00000 f -0000000049 00000 f -0000000050 00000 f -0000000052 00000 f -0000291225 00000 n -0000000053 00000 f -0000000054 00000 f -0000000055 00000 f -0000000056 00000 f -0000000057 00000 f -0000000058 00000 f -0000000059 00000 f -0000000062 00000 f -0000297818 00000 n -0000297849 00000 n -0000000063 00000 f -0000000064 00000 f -0000000065 00000 f -0000000066 00000 f -0000000067 00000 f -0000000068 00000 f -0000000069 00000 f -0000000070 00000 f -0000000071 00000 f -0000000072 00000 f -0000000074 00000 f -0000291296 00000 n -0000000075 00000 f -0000000076 00000 f -0000000077 00000 f -0000000078 00000 f -0000000079 00000 f -0000000080 00000 f -0000000081 00000 f -0000000084 00000 f -0000297702 00000 n -0000297733 00000 n -0000000085 00000 f -0000000086 00000 f -0000000087 00000 f -0000000088 00000 f -0000000089 00000 f -0000000090 00000 f -0000000091 00000 f -0000000092 00000 f -0000000093 00000 f -0000000094 00000 f -0000000096 00000 f -0000291367 00000 n -0000000097 00000 f -0000000098 00000 f -0000000099 00000 f -0000000100 00000 f -0000000101 00000 f -0000000102 00000 f -0000000103 00000 f -0000000106 00000 f -0000297584 00000 n -0000297616 00000 n -0000000107 00000 f -0000000108 00000 f -0000000109 00000 f -0000000110 00000 f -0000000111 00000 f -0000000112 00000 f -0000000113 00000 f -0000000114 00000 f -0000000115 00000 f -0000000116 00000 f -0000000118 00000 f -0000291440 00000 n -0000000119 00000 f -0000000120 00000 f -0000000121 00000 f -0000000122 00000 f -0000000123 00000 f -0000000124 00000 f -0000000125 00000 f -0000000128 00000 f -0000297466 00000 n -0000297498 00000 n -0000000129 00000 f -0000000130 00000 f -0000000131 00000 f -0000000132 00000 f -0000000133 00000 f -0000000134 00000 f -0000000135 00000 f -0000000136 00000 f -0000000137 00000 f -0000000138 00000 f -0000000140 00000 f -0000291514 00000 n -0000000141 00000 f -0000000142 00000 f -0000000143 00000 f -0000000144 00000 f -0000000145 00000 f -0000000146 00000 f -0000000147 00000 f -0000000150 00000 f -0000297348 00000 n -0000297380 00000 n -0000000151 00000 f -0000000152 00000 f -0000000153 00000 f -0000000154 00000 f -0000000155 00000 f -0000000156 00000 f -0000000157 00000 f -0000000158 00000 f -0000000159 00000 f -0000000160 00000 f -0000000162 00000 f -0000291588 00000 n -0000000163 00000 f -0000000164 00000 f -0000000165 00000 f -0000000166 00000 f -0000000167 00000 f -0000000168 00000 f -0000000169 00000 f -0000000172 00000 f -0000297230 00000 n -0000297262 00000 n -0000000173 00000 f -0000000174 00000 f -0000000175 00000 f -0000000176 00000 f -0000000177 00000 f -0000000178 00000 f -0000000179 00000 f -0000000180 00000 f -0000000181 00000 f -0000000182 00000 f -0000000184 00000 f -0000291662 00000 n -0000000185 00000 f -0000000186 00000 f -0000000187 00000 f -0000000188 00000 f -0000000189 00000 f -0000000190 00000 f -0000000191 00000 f -0000000194 00000 f -0000297112 00000 n -0000297144 00000 n -0000000195 00000 f -0000000196 00000 f -0000000197 00000 f -0000000198 00000 f -0000000199 00000 f -0000000200 00000 f -0000000201 00000 f -0000000202 00000 f -0000000203 00000 f -0000000204 00000 f -0000000206 00000 f -0000291736 00000 n -0000000207 00000 f -0000000208 00000 f -0000000209 00000 f -0000000210 00000 f -0000000211 00000 f -0000000212 00000 f -0000000213 00000 f -0000000216 00000 f -0000296994 00000 n -0000297026 00000 n -0000000217 00000 f -0000000218 00000 f -0000000219 00000 f -0000000220 00000 f -0000000221 00000 f -0000000222 00000 f -0000000223 00000 f -0000000224 00000 f -0000000225 00000 f -0000000226 00000 f -0000000228 00000 f -0000291810 00000 n -0000000229 00000 f -0000000230 00000 f -0000000231 00000 f -0000000232 00000 f -0000000233 00000 f -0000000234 00000 f -0000000235 00000 f -0000000238 00000 f -0000296876 00000 n -0000296908 00000 n -0000000239 00000 f -0000000240 00000 f -0000000241 00000 f -0000000242 00000 f -0000000243 00000 f -0000000244 00000 f -0000000245 00000 f -0000000246 00000 f -0000000247 00000 f -0000000248 00000 f -0000000250 00000 f -0000291884 00000 n -0000000251 00000 f -0000000252 00000 f -0000000253 00000 f -0000000254 00000 f -0000000255 00000 f -0000000256 00000 f -0000000257 00000 f -0000000260 00000 f -0000296758 00000 n -0000296790 00000 n -0000000261 00000 f -0000000262 00000 f -0000000263 00000 f -0000000264 00000 f -0000000265 00000 f -0000000266 00000 f -0000000267 00000 f -0000000268 00000 f -0000000269 00000 f -0000000270 00000 f -0000000272 00000 f -0000291958 00000 n -0000000273 00000 f -0000000274 00000 f -0000000275 00000 f -0000000276 00000 f -0000000277 00000 f -0000000278 00000 f -0000000279 00000 f -0000000282 00000 f -0000296640 00000 n -0000296672 00000 n -0000000283 00000 f -0000000284 00000 f -0000000285 00000 f -0000000286 00000 f -0000000287 00000 f -0000000288 00000 f -0000000289 00000 f -0000000290 00000 f -0000000291 00000 f -0000000292 00000 f -0000000294 00000 f -0000292032 00000 n -0000000295 00000 f -0000000296 00000 f -0000000297 00000 f -0000000298 00000 f -0000000299 00000 f -0000000300 00000 f -0000000301 00000 f -0000000304 00000 f -0000296522 00000 n -0000296554 00000 n -0000000305 00000 f -0000000306 00000 f -0000000307 00000 f -0000000308 00000 f -0000000309 00000 f -0000000310 00000 f -0000000311 00000 f -0000000312 00000 f -0000000313 00000 f -0000000314 00000 f -0000000316 00000 f -0000292106 00000 n -0000000317 00000 f -0000000318 00000 f -0000000319 00000 f -0000000320 00000 f -0000000321 00000 f -0000000322 00000 f -0000000323 00000 f -0000000326 00000 f -0000296404 00000 n -0000296436 00000 n -0000000327 00000 f -0000000328 00000 f -0000000329 00000 f -0000000330 00000 f -0000000331 00000 f -0000000332 00000 f -0000000333 00000 f -0000000334 00000 f -0000000335 00000 f -0000000336 00000 f -0000000338 00000 f -0000292180 00000 n -0000000339 00000 f -0000000340 00000 f -0000000341 00000 f -0000000342 00000 f -0000000343 00000 f -0000000344 00000 f -0000000345 00000 f -0000000348 00000 f -0000296286 00000 n -0000296318 00000 n -0000000349 00000 f -0000000350 00000 f -0000000351 00000 f -0000000352 00000 f -0000000353 00000 f -0000000354 00000 f -0000000355 00000 f -0000000356 00000 f -0000000357 00000 f -0000000358 00000 f -0000000360 00000 f -0000292254 00000 n -0000000361 00000 f -0000000362 00000 f -0000000363 00000 f -0000000364 00000 f -0000000365 00000 f -0000000366 00000 f -0000000367 00000 f -0000000370 00000 f -0000296168 00000 n -0000296200 00000 n -0000000371 00000 f -0000000372 00000 f -0000000373 00000 f -0000000374 00000 f -0000000375 00000 f -0000000376 00000 f -0000000377 00000 f -0000000378 00000 f -0000000379 00000 f -0000000380 00000 f -0000000382 00000 f -0000292328 00000 n -0000000383 00000 f -0000000384 00000 f -0000000385 00000 f -0000000386 00000 f -0000000387 00000 f -0000000388 00000 f -0000000389 00000 f -0000000392 00000 f -0000296050 00000 n -0000296082 00000 n -0000000393 00000 f -0000000394 00000 f -0000000395 00000 f -0000000396 00000 f -0000000397 00000 f -0000000398 00000 f -0000000399 00000 f -0000000400 00000 f -0000000401 00000 f -0000000402 00000 f -0000000404 00000 f -0000292402 00000 n -0000000405 00000 f -0000000406 00000 f -0000000407 00000 f -0000000408 00000 f -0000000409 00000 f -0000000410 00000 f -0000000411 00000 f -0000000412 00000 f -0000000413 00000 f -0000000414 00000 f -0000000415 00000 f -0000000416 00000 f -0000000417 00000 f -0000000418 00000 f -0000000421 00000 f -0000295932 00000 n -0000295964 00000 n -0000000422 00000 f -0000000423 00000 f -0000000424 00000 f -0000000425 00000 f -0000000426 00000 f -0000000427 00000 f -0000000428 00000 f -0000000429 00000 f -0000000430 00000 f -0000000432 00000 f -0000292476 00000 n -0000000433 00000 f -0000000434 00000 f -0000000435 00000 f -0000000436 00000 f -0000000437 00000 f -0000000438 00000 f -0000000439 00000 f -0000000440 00000 f -0000000441 00000 f -0000000442 00000 f -0000000443 00000 f -0000000444 00000 f -0000000445 00000 f -0000000446 00000 f -0000000449 00000 f -0000295814 00000 n -0000295846 00000 n -0000000450 00000 f -0000000451 00000 f -0000000452 00000 f -0000000453 00000 f -0000000454 00000 f -0000000455 00000 f -0000000456 00000 f -0000000457 00000 f -0000000458 00000 f -0000000460 00000 f -0000292550 00000 n -0000000461 00000 f -0000000462 00000 f -0000000463 00000 f -0000000464 00000 f -0000000465 00000 f -0000000466 00000 f -0000000467 00000 f -0000000468 00000 f -0000000469 00000 f -0000000470 00000 f -0000000471 00000 f -0000000472 00000 f -0000000473 00000 f -0000000474 00000 f -0000000477 00000 f -0000295696 00000 n -0000295728 00000 n -0000000478 00000 f -0000000479 00000 f -0000000480 00000 f -0000000481 00000 f -0000000482 00000 f -0000000483 00000 f -0000000484 00000 f -0000000485 00000 f -0000000486 00000 f -0000000488 00000 f -0000292624 00000 n -0000000489 00000 f -0000000490 00000 f -0000000491 00000 f -0000000492 00000 f -0000000493 00000 f -0000000494 00000 f -0000000495 00000 f -0000000496 00000 f -0000000497 00000 f -0000000498 00000 f -0000000499 00000 f -0000000500 00000 f -0000000501 00000 f -0000000502 00000 f -0000000505 00000 f -0000295578 00000 n -0000295610 00000 n -0000000506 00000 f -0000000507 00000 f -0000000508 00000 f -0000000509 00000 f -0000000510 00000 f -0000000511 00000 f -0000000512 00000 f -0000000513 00000 f -0000000514 00000 f -0000000516 00000 f -0000292698 00000 n -0000000517 00000 f -0000000518 00000 f -0000000519 00000 f -0000000520 00000 f -0000000521 00000 f -0000000522 00000 f -0000000523 00000 f -0000000524 00000 f -0000000525 00000 f -0000000526 00000 f -0000000527 00000 f -0000000528 00000 f -0000000529 00000 f -0000000530 00000 f -0000000533 00000 f -0000295460 00000 n -0000295492 00000 n -0000000534 00000 f -0000000535 00000 f -0000000536 00000 f -0000000537 00000 f -0000000538 00000 f -0000000539 00000 f -0000000540 00000 f -0000000541 00000 f -0000000542 00000 f -0000000544 00000 f -0000292772 00000 n -0000000545 00000 f -0000000546 00000 f -0000000547 00000 f -0000000548 00000 f -0000000549 00000 f -0000000550 00000 f -0000000551 00000 f -0000000552 00000 f -0000000553 00000 f -0000000554 00000 f -0000000555 00000 f -0000000556 00000 f -0000000557 00000 f -0000000558 00000 f -0000000561 00000 f -0000295342 00000 n -0000295374 00000 n -0000000562 00000 f -0000000563 00000 f -0000000564 00000 f -0000000565 00000 f -0000000566 00000 f -0000000567 00000 f -0000000568 00000 f -0000000569 00000 f -0000000570 00000 f -0000000572 00000 f -0000292846 00000 n -0000000573 00000 f -0000000574 00000 f -0000000575 00000 f -0000000576 00000 f -0000000577 00000 f -0000000578 00000 f -0000000579 00000 f -0000000580 00000 f -0000000581 00000 f -0000000584 00000 f -0000295224 00000 n -0000295256 00000 n -0000000585 00000 f -0000000586 00000 f -0000000587 00000 f -0000000588 00000 f -0000000589 00000 f -0000000590 00000 f -0000000591 00000 f -0000000592 00000 f -0000000593 00000 f -0000000594 00000 f -0000000597 00000 f -0000292920 00000 n -0000292994 00000 n -0000000598 00000 f -0000000599 00000 f -0000000600 00000 f -0000000601 00000 f -0000000602 00000 f -0000000603 00000 f -0000000604 00000 f -0000000605 00000 f -0000000606 00000 f -0000000607 00000 f -0000000608 00000 f -0000000609 00000 f -0000000610 00000 f -0000000611 00000 f -0000000612 00000 f -0000000613 00000 f -0000000614 00000 f -0000000615 00000 f -0000000616 00000 f -0000000617 00000 f -0000000618 00000 f -0000000619 00000 f -0000000620 00000 f -0000000621 00000 f -0000000622 00000 f -0000000623 00000 f -0000000624 00000 f -0000000625 00000 f -0000000626 00000 f -0000000627 00000 f -0000000628 00000 f -0000000629 00000 f -0000000630 00000 f -0000000631 00000 f -0000000632 00000 f -0000000633 00000 f -0000000634 00000 f -0000000635 00000 f -0000000636 00000 f -0000000637 00000 f -0000000638 00000 f -0000000639 00000 f -0000000640 00000 f -0000000641 00000 f -0000000642 00000 f -0000000647 00000 f -0000295106 00000 n -0000295138 00000 n -0000294988 00000 n -0000295020 00000 n -0000000648 00000 f -0000000649 00000 f -0000000650 00000 f -0000000651 00000 f -0000000652 00000 f -0000000653 00000 f -0000000654 00000 f -0000000657 00000 f -0000293068 00000 n -0000293142 00000 n -0000000658 00000 f -0000000659 00000 f -0000000660 00000 f -0000000661 00000 f -0000000662 00000 f -0000000663 00000 f -0000000664 00000 f -0000000665 00000 f -0000000666 00000 f -0000000667 00000 f -0000000668 00000 f -0000000669 00000 f -0000000670 00000 f -0000000671 00000 f -0000000672 00000 f -0000000673 00000 f -0000000674 00000 f -0000000675 00000 f -0000000676 00000 f -0000000677 00000 f -0000000678 00000 f -0000000679 00000 f -0000000680 00000 f -0000000681 00000 f -0000000682 00000 f -0000000683 00000 f -0000000684 00000 f -0000000685 00000 f -0000000686 00000 f -0000000687 00000 f -0000000688 00000 f -0000000689 00000 f -0000000690 00000 f -0000000691 00000 f -0000000692 00000 f -0000000693 00000 f -0000000694 00000 f -0000000695 00000 f -0000000696 00000 f -0000000697 00000 f -0000000698 00000 f -0000000699 00000 f -0000000700 00000 f -0000000701 00000 f -0000000702 00000 f -0000000703 00000 f -0000000704 00000 f -0000000705 00000 f -0000000706 00000 f -0000000711 00000 f -0000294870 00000 n -0000294902 00000 n -0000294752 00000 n -0000294784 00000 n -0000000712 00000 f -0000000713 00000 f -0000000714 00000 f -0000000715 00000 f -0000000716 00000 f -0000000717 00000 f -0000000718 00000 f -0000000721 00000 f -0000293216 00000 n -0000293290 00000 n -0000000722 00000 f -0000000723 00000 f -0000000724 00000 f -0000000725 00000 f -0000000726 00000 f -0000000727 00000 f -0000000728 00000 f -0000000729 00000 f -0000000730 00000 f -0000000731 00000 f -0000000732 00000 f -0000000733 00000 f -0000000734 00000 f -0000000735 00000 f -0000000736 00000 f -0000000737 00000 f -0000000738 00000 f -0000000739 00000 f -0000000740 00000 f -0000000741 00000 f -0000000742 00000 f -0000000743 00000 f -0000000744 00000 f -0000000745 00000 f -0000000746 00000 f -0000000747 00000 f -0000000748 00000 f -0000000749 00000 f -0000000750 00000 f -0000000751 00000 f -0000000752 00000 f -0000000753 00000 f -0000000754 00000 f -0000000755 00000 f -0000000756 00000 f -0000000757 00000 f -0000000758 00000 f -0000000759 00000 f -0000000760 00000 f -0000000761 00000 f -0000000762 00000 f -0000000763 00000 f -0000000764 00000 f -0000000765 00000 f -0000000766 00000 f -0000000767 00000 f -0000000768 00000 f -0000000769 00000 f -0000000770 00000 f -0000000775 00000 f -0000294634 00000 n -0000294666 00000 n -0000294516 00000 n -0000294548 00000 n -0000000776 00000 f -0000000777 00000 f -0000000778 00000 f -0000000779 00000 f -0000000780 00000 f -0000000781 00000 f -0000000782 00000 f -0000000785 00000 f -0000293364 00000 n -0000293438 00000 n -0000000786 00000 f -0000000787 00000 f -0000000788 00000 f -0000000789 00000 f -0000000790 00000 f -0000000791 00000 f -0000000792 00000 f -0000000793 00000 f -0000000794 00000 f -0000000795 00000 f -0000000796 00000 f -0000000797 00000 f -0000000798 00000 f -0000000799 00000 f -0000000800 00000 f -0000000801 00000 f -0000000802 00000 f -0000000803 00000 f -0000000804 00000 f -0000000805 00000 f -0000000806 00000 f -0000000807 00000 f -0000000808 00000 f -0000000809 00000 f -0000000810 00000 f -0000000811 00000 f -0000000812 00000 f -0000000813 00000 f -0000000814 00000 f -0000000815 00000 f -0000000816 00000 f -0000000817 00000 f -0000000818 00000 f -0000000819 00000 f -0000000820 00000 f -0000000821 00000 f -0000000822 00000 f -0000000823 00000 f -0000000824 00000 f -0000000825 00000 f -0000000826 00000 f -0000000827 00000 f -0000000828 00000 f -0000000829 00000 f -0000000830 00000 f -0000000831 00000 f -0000000832 00000 f -0000000833 00000 f -0000000834 00000 f -0000000835 00000 f -0000000836 00000 f -0000000837 00000 f -0000000842 00000 f -0000294398 00000 n -0000294430 00000 n -0000294280 00000 n -0000294312 00000 n -0000000843 00000 f -0000000844 00000 f -0000000845 00000 f -0000000846 00000 f -0000000847 00000 f -0000000848 00000 f -0000000849 00000 f -0000000852 00000 f -0000293512 00000 n -0000293586 00000 n -0000000853 00000 f -0000000854 00000 f -0000000855 00000 f -0000000856 00000 f -0000000857 00000 f -0000000858 00000 f -0000000859 00000 f -0000000860 00000 f -0000000861 00000 f -0000000862 00000 f -0000000863 00000 f -0000000864 00000 f -0000000865 00000 f -0000000866 00000 f -0000000867 00000 f -0000000868 00000 f -0000000869 00000 f -0000000870 00000 f -0000000871 00000 f -0000000872 00000 f -0000000873 00000 f -0000000874 00000 f -0000000875 00000 f -0000000876 00000 f -0000000877 00000 f -0000000878 00000 f -0000000879 00000 f -0000000880 00000 f -0000000881 00000 f -0000000882 00000 f -0000000883 00000 f -0000000884 00000 f -0000000885 00000 f -0000000886 00000 f -0000000887 00000 f -0000000888 00000 f -0000000889 00000 f -0000000890 00000 f -0000000891 00000 f -0000000892 00000 f -0000000893 00000 f -0000000894 00000 f -0000000895 00000 f -0000000896 00000 f -0000000897 00000 f -0000000898 00000 f -0000000899 00000 f -0000000900 00000 f -0000000901 00000 f -0000000902 00000 f -0000000903 00000 f -0000000904 00000 f -0000000909 00000 f -0000294162 00000 n -0000294194 00000 n -0000294044 00000 n -0000294076 00000 n -0000000910 00000 f -0000000911 00000 f -0000000912 00000 f -0000000913 00000 f -0000000914 00000 f -0000000915 00000 f -0000000000 00000 f -0000000000 00000 f -0000293660 00000 n -0000293734 00000 n -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000293926 00000 n -0000293958 00000 n -0000293808 00000 n -0000293840 00000 n -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000080660 00000 n -0000096930 00000 n -0000097006 00000 n -0000298166 00000 n -0000044217 00000 n -0000044970 00000 n -0000097446 00000 n -0000077907 00000 n -0000077793 00000 n -0000097322 00000 n -0000046117 00000 n -0000047599 00000 n -0000048879 00000 n -0000050161 00000 n -0000050536 00000 n -0000052023 00000 n -0000053302 00000 n -0000053676 00000 n -0000068610 00000 n -0000069107 00000 n -0000069575 00000 n -0000069951 00000 n -0000071437 00000 n -0000072717 00000 n -0000073093 00000 n -0000074583 00000 n -0000075864 00000 n -0000076240 00000 n -0000045035 00000 n -0000291045 00000 n -0000045550 00000 n -0000045602 00000 n -0000096865 00000 n -0000096800 00000 n -0000096735 00000 n -0000096670 00000 n -0000096605 00000 n -0000096540 00000 n -0000096475 00000 n -0000096410 00000 n -0000096345 00000 n -0000096280 00000 n -0000096215 00000 n -0000096150 00000 n -0000096085 00000 n -0000096020 00000 n -0000095955 00000 n -0000095890 00000 n -0000080595 00000 n -0000077728 00000 n -0000077945 00000 n -0000080908 00000 n -0000081184 00000 n -0000097202 00000 n -0000097235 00000 n -0000097082 00000 n -0000097115 00000 n -0000097523 00000 n -0000097753 00000 n -0000098764 00000 n -0000105562 00000 n -0000171152 00000 n -0000236742 00000 n -0000298201 00000 n -trailer <]>> startxref 298374 %%EOF \ No newline at end of file diff --git a/img/speech.png b/img/speech.png deleted file mode 100644 index 1d206ba..0000000 Binary files a/img/speech.png and /dev/null differ diff --git a/inc/Event.js b/inc/Event.js deleted file mode 100644 index 545a927..0000000 --- a/inc/Event.js +++ /dev/null @@ -1,253 +0,0 @@ -/* - - Event.js : v1.2 : 2012.02.22 - ----------------------------- - /// calling "Event" with "new" provides additional support; - Event(syntax.area, "click", function(event, self) { - self.stop().prevent().remove(); - }); - - /// calling "Event" without "new" also works, but requires more work (and is faster); - var click = Event.add(syntax.area, "click", function(event) { - Event.stop(event); - Event.prevent(event); - Event.remove(syntax.area, "click", click); - }); - - /// multiple event-types bound to one function - var binding = Event(window, "click,mousemove,mousemove,mouseup", function(event, self) { - self.stop().prevent(); // stopPropagation and preventDefault - binding.remove(); // removes all the listeners - }); - - /// multiple events bound to one element - var binding = Event(window, { - "mousedown": function(event, self) { - self.remove(); // remove all the listeners - }, - "mouseup": function(event, self) { - binding.remove(); // just remove this listener - } - }); - - /// on-element-is-ready (loads before onload) - Event("document.body", "ready", function(event, state, wheelData, self) { - self.stop.prevent.remove(); - }); - - /// easier mousewheel events - Event.mousewheel(window, function(event, state, wheelData, self) { - self.stop.prevent.remove(); - }); - -*/ - -var Event = (function(root) { "use strict"; - var add = document.addEventListener ? 'addEventListener' : 'attachEvent'; - var remove = document.removeEventListener ? 'removeEventListener' : 'detachEvent'; - var isEvent = (function () { - var events = {}; - var types = [ - 'abort', 'beforeunload', 'blur', 'broadcast', 'change', 'click', 'close', - 'command', 'commandupdate', 'contextmenu', 'dblclick', 'dragdrop', - 'dragenter', 'dragexit', 'draggesture', 'dragover', 'error', 'focus', - 'input', 'keydown', 'keypress', 'keyup', 'load', 'mousedown', - 'mousewheel', 'mouseenter', 'mouseleave', 'mousemove', 'mouseout', 'mouseover', - 'mouseup', 'move', 'overflow', 'overflowchanged', 'popuphidden', - 'popuphiding', 'popupshowing', 'popupshown', 'select', 'scroll', - 'syncfrompreference', 'synctopreference', 'readystatechange', - 'reset', 'resize', 'select', 'submit', 'underflow', 'unload' - ]; - for (var n = 0, length = types.length; n < length; n ++) { - events[types[n]] = true; - } - return events; - })(); - // event wrappers, and associated variables - var wrappers = {}; - var counter = 0; - var testElement = document.createElement("div"); - var getEventID = function(object) { - if (object === window) return "#window"; - if (object === document) return "#document"; - if (!object) object = {}; // FIXME: Happens in iOS - if (!object.uniqueID) { - object.uniqueID = "id" + counter ++; - } - return object.uniqueID; - }; - // function to create new Events - root = {}; // double type the root function as object + function - root = function(target, type, listener, scope) { - // find the where function was called from (window is undefined) - var that = typeof(this) !== "undefined" ? this : {}; - // check for multiple events in one string - if (type.indexOf && type.indexOf(",") !== -1) { - type = type.split(","); - } - // check for element to load on interval (sometimes before onload) - if (typeof(target) === "string" && type === "ready") { - var interval = window.setInterval(function() { - if (eval(target)) { - window.clearInterval(interval); - listener(); - } - }, 10); - return that; - } - // check type for multipel events - if (typeof(type) !== "string") { // has multiple events - that.events = {}; - if (typeof(type.length) === "undefined") { // has multiple listeners (object) - for (var key in type) { - if (isEvent[key] && typeof(type[key]) === "function") { - that.events[key] = Event(target, key, type[key], scope); - } - } - } else { // has multiple listeners glued together (array) - if (typeof(listener) !== "function") return "missing listener"; - for (var n = 0, length = type.length; n < length; n ++) { - that.events[type[n]] = Event(target, type[n], listener, scope); - } - } - that.remove = function() { // remove multiple events - for (var key in that.events) { - that.events[key].remove(); - } - return that; - }; - that.add = function() { // add multiple events - for (var key in that.events) { - that.events[key].add(); - } - return that; - }; - return that; - } else { // is single call - if (!(target && type && listener)) return "missing listener."; - type = standardize(type); - } - // the wrapped unique id - var wrapperID = type + getEventID(target) + "." + getEventID(listener); - if (!wrappers[wrapperID]) { // create new wrapper - wrappers[wrapperID] = function(event) { - return listener.call(scope, that.event = event, that); - }; - } - // the wrapped listener - var wrapper = wrappers[wrapperID]; - target[add](type, wrapper, false); - // - that.stop = function(event) { - event = event || that.event; - if (event.stopPropagation) { - event.stopPropagation(); - } else { // <= IE8 - event.cancelBubble = true; - } - return that; - }; - that.prevent = function(event) { - event = event || that.event; - if (event.preventDefault) { - event.preventDefault(); - } else { // <= IE8 - event.returnValue = false; - } - return that; - }; - that.add = function() { // so you can add it back - target[add](type, wrapper, false); - return that; - }; - that.remove = function() { - target[remove](type, wrapper, false); - return that; - }; - return that; - }; - - //////////////// LEGACY SUPPORT ////////////////// - - root.add = function(target, type, listener, scope) { - if (typeof(type) !== "string") { - var config = type; - for (var type in config) { - if (isEvent[type] && typeof(config[type]) === "function") { - root.add(target, type, config[type]); - } - } - return config; - } - target[add](standardize(type), wrap(type, target, listener, scope || target), false); - return listener; - }; - - root.remove = function(target, type, listener, scope) { - type = standardize(type); - target[remove](type, wrap(type, target, listener, scope || target), false); - return listener; - }; - - root.stop = - root.stopPropagation = function(event) { - if (event.stopPropagation) { - event.stopPropagation(); - } else { // <= IE8 - event.cancelBubble = true; - } - return root; - }; - - root.prevent = - root.preventDefault = function(event) { - if (event.preventDefault) { - event.preventDefault(); - } else { // <= IE8 - event.returnValue = false; - } - return root; - }; - - ///////////// - - var standardize = function(type) { // fix any browser discrepancies - if (!document.addEventListener) { - return "on" + type; - } else if (type === "mousewheel" && !("onmousewheel" in testElement)) { - return "DOMMouseScroll"; - } else { // - return type; - } - }; - - var wrap = function(type, target, listener, scope) { // un-tracked wrapper - var wrapperID = type + getEventID(target) + "." + getEventID(listener); - if (!wrappers[wrapperID]) { - wrappers[wrapperID] = function(event) { - return listener.call(scope, event); - }; - } - return wrappers[wrapperID]; - }; - - //////////////// MouseWheel //////////////// - - root.mousewheel = function(target, listener, timeout) { - var interval = 0; - var self = Event(target, "mousewheel", function(event) { - event = event || window.event; - var wheelData = event.detail ? event.detail * -1 : event.wheelDelta / 40; - listener(event, "wheel", wheelData); - window.clearInterval(interval); - interval = window.setInterval(function() { - window.clearInterval(interval); - listener(event, "wheelup", wheelData, self); - }, timeout || 150); - }); - return self; - }; - // - return root; - // -})({}); \ No newline at end of file diff --git a/inc/Loader.js b/inc/Loader.js deleted file mode 100644 index 25b9f53..0000000 --- a/inc/Loader.js +++ /dev/null @@ -1,181 +0,0 @@ -/* - var loader = new widgets.Loader({ - id: "loader", - bars: 12, - radius: 20, - lineWidth: 3, - lineHeight: 10 - }); - loader.stop(); - - loader.message("New loading message..."); - -*/ - -if (typeof(widgets) === "undefined") widgets = {}; - -(function(root) { - -var PI = Math.PI; -var defaultConfig = { - id: "loader", - bars: 12, - radius: 0, - lineWidth: 20, - lineHeight: 70 -}; - -root.Loader = function (config) { - var that = this; - if (!document.body) return; - if (!config) config = {}; - for (var key in defaultConfig) { - if (typeof(config[key]) === "undefined") { - config[key] = defaultConfig[key]; - } - } - // - var canvas = document.getElementById(config.id); - if (!canvas) { - var div = document.createElement("div"); - div.style.cssText = "color: #fff; pointer-events: none; -webkit-transition-property: opacity; -webkit-transition-duration: .5s; position: fixed; left: 0; top: 0; width: 100%; height: 100%; z-index: 10000; background: rgba(0,0,0,0.5); opacity: 1"; - if (config.message) { - var span = document.createElement("span"); - span.style.cssText = "font-family: courier; opacity: 1; display: inline-block;background: rgba(0,0,0,0.65); border-radius: 10px; padding: 10px; width: 200px; text-align: center; position: absolute; z-index: 1000;"; - div.appendChild(span); - that.span = span; - } - var canvas = document.createElement("canvas"); - document.body.appendChild(canvas); - canvas.id = config.id; - canvas.style.cssText = "opacity: 1; position: absolute; z-index: 1000;"; - div.appendChild(canvas); - document.body.appendChild(div); - } - if (window.innerWidth && window.innerHeight) { - var width = window.innerWidth; - var height = window.innerHeight; - } else if (document.body && document.body.offsetWidth) { - var width = document.body.offsetWidth; - var height = document.body.offsetHeight; - } else if (document.compatMode === "CSS1Compat" && document.documentElement && document.documentElement.offsetWidth ) { - var width = document.documentElement.offsetWidth; - var height = document.documentElement.offsetHeight; - } - var max = config.lineHeight + 20; - var size = max * 2 + config.radius; - width -= size; - height -= size; - canvas.width = size; - canvas.height = size; - canvas.style.left = (width / 2) + "px"; - canvas.style.top = (height / 2) + "px"; - if (config.message) { - that.span.style.left = ((width + size) / 2 - that.span.offsetWidth/2) + "px"; - that.span.style.top = (height / 2 + size - 10) + "px"; - } - var that = this; - var interval = 0; - var offset = 0; - var delay = config.delay; - var bars = config.bars; - var radius = config.radius; - var ctx = canvas.getContext('2d'); - ctx.globalCompositeOperation = "lighter"; - ctx.shadowOffsetX = 1; - ctx.shadowOffsetY = 1; - ctx.shadowBlur = 1; - ctx.shadowColor = 'rgba(0, 0, 0, 0.5)'; - // - function animate() { - ctx.save(); - ctx.clearRect(0, 0, size, size); - ctx.translate(size / 2, size / 2); - var hues = 360 - 360 / bars; - for (var i = 0; i < bars; i++) { - var angle = (i / bars * 2 * PI) + offset; - ctx.save(); - ctx.translate(radius * Math.sin(-angle), radius * Math.cos(-angle)); - ctx.rotate(angle); - // round-rect properties - var x = -config.lineWidth / 2; - var y = 0; - var width = config.lineWidth; - var height = config.lineHeight; - var curve = width / 2; - // round-rect path - ctx.beginPath(); - ctx.moveTo(x + curve, y); - ctx.lineTo(x + width - curve, y); - ctx.quadraticCurveTo(x + width, y, x + width, y + curve); - ctx.lineTo(x + width, y + height - curve); - ctx.quadraticCurveTo(x + width, y + height, x + width - curve, y + height); - ctx.lineTo(x + curve, y + height); - ctx.quadraticCurveTo(x, y + height, x, y + height - curve); - ctx.lineTo(x, y + curve); - ctx.quadraticCurveTo(x, y, x + curve, y); - // round-rect fill - var hue = ((i / (bars - 1)) * hues); - ctx.fillStyle = "hsla(" + hue + ", 100%, 50%, 0.85)"; - ctx.fill(); - ctx.restore(); - } - ctx.restore(); - offset += 0.07; - // - if (config.messageAnimate) { - var iteration = offset / 0.07 >> 0; - if (iteration % 10 == 0) { - var length = config.messageAnimate.length; - var n = iteration / 10 % length; - that.span.innerHTML = config.message + config.messageAnimate[n]; - } - } - }; - // - this.message = function(message) { - if (!interval) this.start(); - config.message = message; - if (message.substr(-3) === "...") { - config.message = message.substr(0, message.length - 3); - config.messageAnimate = [ ".  ",".. ","..." ].reverse(); - } else { - config.messageAnimate = false; - } - that.span.innerHTML = config.message + (config.messageAnimate[0] || ""); - }; - // - this.stop = function () { - if (interval) { - window.clearInterval(interval); - interval = 0; - } - if (canvas && canvas.style) { - canvas.parentNode.style.opacity = 0; - window.setTimeout(function () { - canvas.parentNode.style.display = "none"; - ctx.clearRect(0, 0, size, size); - }, 500); - } - }; - // - this.start = function (max) { - if (interval) return; - canvas.parentNode.style.top = document.body.scrollTop + "px"; - canvas.parentNode.style.opacity = 1; - canvas.parentNode.style.display = "block"; - canvas.style.left = (width / 2) + "px"; - canvas.style.top = (height / 2) + "px"; - if (!config.delay) animate(); - interval = window.setInterval(animate, 30); - if (config.message) { - this.message(config.message); - } - }; - // - this.start(30 * 1000); - // - return this; -}; - -})(widgets); \ No newline at end of file diff --git a/inc/MIDI.js/LICENSE.txt b/inc/MIDI.js/LICENSE.txt deleted file mode 100644 index 6c8c604..0000000 --- a/inc/MIDI.js/LICENSE.txt +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License - -Copyright (c) 2011-2012 MIDI.js Authors. All rights reserved. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. \ No newline at end of file diff --git a/inc/MIDI.js/MIDIPlayer.css b/inc/MIDI.js/MIDIPlayer.css deleted file mode 100644 index 4c4912e..0000000 --- a/inc/MIDI.js/MIDIPlayer.css +++ /dev/null @@ -1,164 +0,0 @@ -body { - font-family: Andada; - font-size: 1.2em; - line-height: 2em; - background: #fcfae9; - color: #907d62; - margin: 0 50px; -} -div.player { - background-image: -webkit-gradient(linear,left top,left bottom,from(rgba(66,66,66,1)),to(rgba(22,22,22,1))); - background-image: -webkit-linear-gradient(top, rgba(66, 66, 66, 1) 0%, rgba(22, 22, 22, 1) 100%); - background-image: -moz-linear-gradient(top, rgba(66, 66, 66, 1) 0%, rgba(22, 22, 22, 1) 100%); - background-image: -ms-gradient(top, rgba(66, 66, 66, 1) 0%, rgba(22, 22, 22, 1) 100%); - background-image: -o-gradient(top, rgba(66, 66, 66, 1) 0%, rgba(22, 22, 22, 1) 100%); - background-image: linear-gradient(top, rgba(66, 66, 66, 1) 0%, rgba(22, 22, 22, 1) 100%); - padding: 15px 20px; - border: 1px solid #000; - box-shadow: 0 0 10px #fff; - -moz-box-shadow: 0 0 10px #fff; - -webkit-box-shadow: 0 0 10px #fff; - border-radius: 10px; - -moz-border-radius: 10px; - -webkit-border-radius: 10px; - color: #FFFFFF; - color: rgba(255, 255, 255, 0.8); - text-shadow: 1px 1px 2px #000; - -moz-text-shadow: 1px 1px 2px #000; - margin-bottom: 15px; -} -div.player #capsule { - border: 1px solid #000; - box-shadow: 0 0 10px #555; - -moz-box-shadow: 0 0 10px #555; - -webkit-box-shadow: 0 0 10px #555; - background: #000; - background-image: -webkit-gradient(linear, left top, left bottom, color-stop(1, rgba(0,0,0,0.5)), color-stop(0, #333)); - background-image: -webkit-linear-gradient(top, rgba(0, 0, 0, 0.5) 1, #333 0); - background-image: -moz-linear-gradient(top, rgba(0, 0, 0, 0.5) 1, #333 0); - background-image: -ms-gradient(top, rgba(0, 0, 0, 0.5) 1, #333 0); - background-image: -o-gradient(top, rgba(0, 0, 0, 0.5) 1, #333 0); - background-image: linear-gradient(top, rgba(0, 0, 0, 0.5) 1, #333 0); - overflow: hidden; - border-radius: 5px; - -moz-border-radius: 5px; - -webkit-border-radius: 5px; - width: 420px; - display: inline-block; - height: 30px; -} -div.player #capsule #cursor { - border-radius: 5px; - -moz-border-radius: 5px; - -webkit-border-radius: 5px; - border-top-right-radius: 0; - border-bottom-right-radius: 0; - background: #003b96; - background-image: -webkit-gradient(linear, left top, left bottom, color-stop(1, #003b96), color-stop(0, #0088e9)); - background-image: -webkit-linear-gradient(top, #003b96 1, #0088e9 0); - background-image: -moz-linear-gradient(top, #003b96 1, #0088e9 0); - background-image: -ms-gradient(top, #003b96 1, #0088e9 0); - background-image: -o-gradient(top, #003b96 1, #0088e9 0); - background-image: linear-gradient(top, #003b96 1, #0088e9 0); - width: 0; - display: inline-block; - height: 100%; -} -div.player span.time { - position: relative; - top: -9px; - padding: 0 10px; - width: 40px; - display: inline-block; - text-align: right; -} -div.player div.time-controls { - width: 560px; - margin: 10px auto 0; -} -input[type="image"]:hover { - opacity: 1; -} -input[type="image"]:active { - opacity: 0.85; -} -input[type="image"] { - opacity: 0.7; -} -p { - margin: 15px 0 0 15px; - color: #403522; -} - li { - color: #403522; -} -li { - margin-bottom: 20px; - color: #000; - background: rgba(255, 0, 0, 0); - border-radius: 10px; - -moz-border-radius: 10px; - -webkit-border-radius: 10px; - list-style-type: none; - padding: 2px 10px; -} -pre { - width: 90%; - overflow-x: scroll; - padding: 0; - margin: 0; -} -pre b { - color: #fff; - background: rgba(255, 0, 0, 0.5); - padding: 2px 5px; -} -li.indent { - color: #403522; - background: none; - position: relative; - left: 50px; - list-style-type: none; -} -li.indent.square { - background: none; - list-style-type: square; -} -h3 { - background-image: -webkit-gradient(linear, left top, left bottom, color-stop(1, rgba(0, 200, 255, 0.35)), color-stop(0, rgba(0,88,127,0.42))); - color: #fff; - text-shadow: 1px 1px #000; - padding: 2px 10px; - border-bottom: 1px solid rgba(0,0,0,0.3); - border-top: 1px solid rgba(0,0,0,0.6); -} -li a { - color: #000; -} -h3 a { - color: #fff; -} -a, li.indent.demos a { - color: #06f; -} -li a:hover, a:hover, li.indent.demos a:hover { - color: #c09; -} -h3 a:hover { - color: #ff0; -} -h3 { - font-family: Oswald; -} -h1 { - font-family: Oswald; font-size: 2em; font-weight: bold; z-index: 2; padding-left: 15px; position: relative; color: rgba(0,0,0,0.5); text-shadow: 0 0 7px rgba(255,255,0,0.50); -} - - -#colors div { - -webkit-transition-property: background, color; - -webkit-transition-duration: .25s; -padding: 1px 0 1px 5px; font-family: arial; font-size: 9px; line-height: 9px; color: #aaa; width: 30px; height: 9px; - background-image: -webkit-gradient(linear,left top,left bottom,from(rgba(66,66,66,0.75)),to(rgba(0,0,0,1))); -border-bottom: 1px solid rgba(5,5,5,0.7); -} \ No newline at end of file diff --git a/inc/MIDI.js/MIDIPlayer.html b/inc/MIDI.js/MIDIPlayer.html deleted file mode 100644 index 712bf76..0000000 --- a/inc/MIDI.js/MIDIPlayer.html +++ /dev/null @@ -1,362 +0,0 @@ - - - - - MIDI.js - Sequencing in Javascript. - - - - - - - - - - - - - - - - - - - - - - - - - -

MIDI.js - Sequencing in Javascript.

-
-
-
-
- - - - -
-
- 0:00 - - - - -0:00 -
-
-
Loading API...
-

What’s all this hubub?

-

MIDI.js (on github) ties together, and builds upon frameworks that bring MIDI generation to the browser. - Combine it with jasmid to create a web-radio MIDI stream similar to this demo... - or with Three.js, Sparks.js, or GLSL to create Audio/visual experiments. - Piano/guitar simulations, Drum machines, MIDI recording, and all kinds of certified funkitude is within your grasps! -

Google Chrome is recommended for best listening experience, it’s timing perfection! Firefox and Safari can both perform a bit more like the piano has been drinking, arrr.

-

Carpe beerum, and commandeer yer own copy!

-

Description of package;

-
  • MIDI.loadPlugin.js:  Decides which framework is best to use, and sends request.
  • -
  • -
    -// interface to download soundfont, then execute callback;
    -MIDI.loadPlugin(callback, soundfont);
    -// simple example to get started;
    -MIDI.loadPlugin(function() {
    -	MIDI.noteOn(0, 100, 127, 0); // plays note once loaded
    -}, "soundfont/soundfont-ogg-guitar.js");
    -
    -
  • -
  • MIDI.Soundfont.js:  Customizable base64 Soundfont.
  • -
  • Encode your own soundfonts, Drums, Guitars, and so on.
  • -
  • You are listening to Fluid (R3) General MIDI SoundFont (GM).
  • -
  • MIDI.Plugin.js:  Ties together the following frameworks;
  • -
  • -MIDI.noteOn(channel, note, velocity, delay);
    -MIDI.noteOff(channel, note, delay);
    -MIDI.chordOn(channel, chord, velocity, delay);
    -MIDI.chordOff(channel, chord, delay);
    -MIDI.keyToNote = object; // A0 => 21
    -MIDI.noteToKey = object; // 21 => A0
    -
  • -
  • MIDI.Player.js:  Streams the MIDI to the browser. -
  • -
    -MIDI.Player.currentTime = integer; // time we are at now within the song.
    -MIDI.Player.endTime = integer; // time when song ends.
    -MIDI.Player.playing = boolean; // are we playing? yes or no.
    -MIDI.Player.loadFile(file, callback); // load .MIDI from base64 or binary XML request.
    -MIDI.Player.start(); // start the MIDI track (you can put this in the loadFile callback)
    -MIDI.Player.resume(); // resume the MIDI track from pause.
    -MIDI.Player.pause(); // pause the MIDI track.
    -MIDI.Player.stop(); // stops all audio being played, and resets currentTime to 0.
    -Callback whenever a note is played;
    -MIDI.Player.removeListener(); // removes current listener.
    -MIDI.Player.addListener(function(data) { // set it to your own function!
    -	var now = data.now; // where we are now
    -	var end = data.end; // time when song ends
    -	var channel = data.channel; // channel note is playing on
    -	var message = data.message; // 128 is noteOff, 144 is noteOn
    -	var note = data.note; // the note
    -	var velocity = data.velocity; // the velocity of the note
    -	// then do whatever you want with the information!
    -});
    -Smooth animation, interpolates between onMidiEvent calls;
    -MIDI.Player.clearAnimation(); // clears current animation.
    -MIDI.Player.setAnimation(function(data) {
    -	var now = data.now; // where we are now
    -	var end = data.end; // time when song ends
    -	var events = data.events; // all the notes currently being processed
    -	// then do what you want with the information!
    -});
  • - -
  • Color.js:  Color conversions, music isn’t complete without!
  • -
  • Color.Space(0xff0000, "HEX>RGB>HSL");
  • -
  • DOMLoader.script.js:  Loads scripts in synchronously, or asynchronously.
  • -
  • DOMLoader.script.add(src, callback);
  • -
  • DOMLoader.XMLHttp.js:  Cross-browser XMLHttpd request.
  • -
  • DOMLoader.sendRequest(src, callback);
  • -
  • MusicTheory.Synesthesia.js:  Note-to-color mappings (from Isaac Newton onwards).
  • -

    Many thanks to the authors of these libraries;

    -
  • <audio>:  HTML5 specs
  • -
  • WebAudioAPI:  W3C proposal by Google
  • -
  • Java package:  MIDIBridge by Daniel van der Meer
  • -
  • Use this to hook up a MIDI keyboard to your browser!
  • -
  • Access to 128 General MIDI instruments.
  • -
  • Flash package:  SoundManager2 by Scott Schiller
  • -
  • jasmid:  Reads MIDI file byte-code, and translats into a Javascript array.
  • -
  • base642binary.js:  Cleans up XML base64-requests for Web Audio API.
  • -

    Example(s):  Tweet me your app to be included!

    -
  • - Color Piano
    Learn piano songs without reading sheet music. -
    Coded by mud.
  • -
    -
  • - Guitar Player
    Learn how to play chords on the guitar. -
    Coded by mud.
  • -
    -
  • - Whitney Music Box
    Beautiful HTML5 simulation of a Whitney Music Box. -
    Coded by KrazyDad.
  • -
    - - - \ No newline at end of file diff --git a/inc/MIDI.js/README.html b/inc/MIDI.js/README.html deleted file mode 100644 index c43bd4e..0000000 --- a/inc/MIDI.js/README.html +++ /dev/null @@ -1,142 +0,0 @@ - -

    Description of package;

    -
  • MIDI.loadPlugin.js:  Decides which framework is best to use, and sends request.
  • -
  • -
    -// interface to download soundfont, then execute callback;
    -MIDI.loadPlugin(callback, soundfont);
    -// simple example to get started;
    -MIDI.loadPlugin(function() {
    -	MIDI.noteOn(0, 100, 127, 0); // plays note once loaded
    -}, "soundfont/soundfont-ogg-guitar.js");
    -
    -
  • -
  • MIDI.Soundfont.js:  Customizable base64 Soundfont.
  • -
  • Encode your own soundfonts, Drums, Guitars, and so on.
  • -
  • Share them with the community!
  • -
  • MIDI.Plugin.js:  Ties together the following frameworks;
  • -
  • -MIDI.noteOn(channel, note, velocity, delay);
    -MIDI.noteOff(channel, note, delay);
    -MIDI.chordOn(channel, chord, velocity, delay);
    -MIDI.chordOff(channel, chord, delay);
    -MIDI.keyToNote = object; // A0 => 21
    -MIDI.noteToKey = object; // 21 => A0
    -
  • -
  • MIDI.Player.js:  Streams the MIDI to the browser. -
  • -
    -MIDI.Player.currentTime = integer; // time we are at now within the song.
    -MIDI.Player.endTime = integer; // time when song ends.
    -MIDI.Player.playing = boolean; // are we playing? yes or no.
    -MIDI.Player.loadFile(file, callback); // load .MIDI from base64 or binary XML request.
    -MIDI.Player.start(); // start the MIDI track (you can put this in the loadFile callback)
    -MIDI.Player.resume(); // resume the MIDI track from pause.
    -MIDI.Player.pause(); // pause the MIDI track.
    -MIDI.Player.stop(); // stops all audio being played, and resets currentTime to 0.
    -Callback whenever a note is played;
    -MIDI.Player.removeListener(); // removes current listener.
    -MIDI.Player.addListener(function(data) { // set it to your own function!
    -	var now = data.now; // where we are now
    -	var end = data.end; // time when song ends
    -	var channel = data.channel; // channel note is playing on
    -	var message = data.message; // 128 is noteOff, 144 is noteOn
    -	var note = data.note; // the note
    -	var velocity = data.velocity; // the velocity of the note
    -	// then do whatever you want with the information!
    -});
    -Smooth animation, interpolates between onMidiEvent calls;
    -MIDI.Player.clearAnimation(); // clears current animation.
    -MIDI.Player.setAnimation(function(data) {
    -	var now = data.now; // where we are now
    -	var end = data.end; // time when song ends
    -	var events = data.events; // all the notes currently being processed
    -	// then do what you want with the information!
    -});
  • - -
  • Color.js:  Color conversions, music isn’t complete without!
  • -
  • Color.Space(0xff0000, "HEX>RGB>HSL");
  • -
  • DOMLoader.script.js:  Loads scripts in synchronously, or asynchronously.
  • -
  • DOMLoader.script.add(src, callback);
  • -
  • DOMLoader.XMLHttp.js:  Cross-browser XMLHttpd request.
  • -
  • DOMLoader.sendRequest(src, callback);
  • -
  • MusicTheory.Synesthesia.js:  Note-to-color mappings (from Isaac Newton onwards).
  • -

    Many thanks to the authors of these libraries;

    -
  • <audio>:  HTML5 specs
  • -
  • WebAudioAPI:  W3C proposal by Google
  • -
  • Java package:  MIDIBridge by Daniel van der Meer
  • -
  • Use this to hook up a MIDI keyboard to your browser!
  • -
  • Access to 128 General MIDI instruments.
  • -
  • Flash package:  SoundManager2 by Scott Schiller
  • -
  • jasmid:  Reads MIDI file byte-code, and translats into a Javascript array.
  • -
  • base642binary.js:  Cleans up XML base64-requests for Web Audio API.
  • - diff --git a/inc/MIDI.js/WhitneyMusicBox.html b/inc/MIDI.js/WhitneyMusicBox.html deleted file mode 100644 index f06ccad..0000000 --- a/inc/MIDI.js/WhitneyMusicBox.html +++ /dev/null @@ -1,112 +0,0 @@ - - - -Whitney Music Box in HTML5 - - - - - - - - - - - - - - - - - - -Whitney Music Box animation in HTML5.
    -Graphics code by Jim Bumgardner.
    -Audio created with MIDI.js
    - - - - \ No newline at end of file diff --git a/inc/MIDI.js/images/backward.png b/inc/MIDI.js/images/backward.png deleted file mode 100644 index e021903..0000000 Binary files a/inc/MIDI.js/images/backward.png and /dev/null differ diff --git a/inc/MIDI.js/images/forward.png b/inc/MIDI.js/images/forward.png deleted file mode 100644 index 3046db3..0000000 Binary files a/inc/MIDI.js/images/forward.png and /dev/null differ diff --git a/inc/MIDI.js/images/pause.png b/inc/MIDI.js/images/pause.png deleted file mode 100644 index 4bd7b58..0000000 Binary files a/inc/MIDI.js/images/pause.png and /dev/null differ diff --git a/inc/MIDI.js/images/play.png b/inc/MIDI.js/images/play.png deleted file mode 100644 index d4cda72..0000000 Binary files a/inc/MIDI.js/images/play.png and /dev/null differ diff --git a/inc/MIDI.js/images/shiverMeTimbers.gif b/inc/MIDI.js/images/shiverMeTimbers.gif deleted file mode 100644 index 3b65c20..0000000 Binary files a/inc/MIDI.js/images/shiverMeTimbers.gif and /dev/null differ diff --git a/inc/MIDI.js/images/stop.png b/inc/MIDI.js/images/stop.png deleted file mode 100644 index 515ca60..0000000 Binary files a/inc/MIDI.js/images/stop.png and /dev/null differ diff --git a/inc/MIDI.js/images/tuna.png b/inc/MIDI.js/images/tuna.png deleted file mode 100644 index 3df32a8..0000000 Binary files a/inc/MIDI.js/images/tuna.png and /dev/null differ diff --git a/inc/MIDI.js/js/VersionControl.Base64.js b/inc/MIDI.js/inc/Base64.js similarity index 100% rename from inc/MIDI.js/js/VersionControl.Base64.js rename to inc/MIDI.js/inc/Base64.js diff --git a/inc/MIDI.js/inc/SoundManager2/license.txt b/inc/MIDI.js/inc/SoundManager2/license.txt deleted file mode 100755 index 1a17182..0000000 --- a/inc/MIDI.js/inc/SoundManager2/license.txt +++ /dev/null @@ -1,29 +0,0 @@ -Software License Agreement (BSD License) - -Copyright (c) 2007, Scott Schiller (schillmania.com) -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 schillmania.com nor the names of its contributors may be - used to endorse or promote products derived from this software without - specific prior written permission from schillmania.com. - -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 OWNER 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/inc/MIDI.js/inc/SoundManager2/script/soundmanager2-jsmin.js b/inc/MIDI.js/inc/SoundManager2/script/soundmanager2-jsmin.js deleted file mode 100755 index e8b14ae..0000000 --- a/inc/MIDI.js/inc/SoundManager2/script/soundmanager2-jsmin.js +++ /dev/null @@ -1,104 +0,0 @@ -/** @license - - - SoundManager 2: JavaScript Sound for the Web - ---------------------------------------------- - http://schillmania.com/projects/soundmanager2/ - - Copyright (c) 2007, Scott Schiller. All rights reserved. - Code provided under the BSD License: - http://schillmania.com/projects/soundmanager2/license.txt - - V2.97a.20111220 -*/ -(function(G){function W(W,la){function l(b){return function(a){var d=this._t;return!d||!d._a?(d&&d.sID?c._wD(k+"ignoring "+a.type+": "+d.sID):c._wD(k+"ignoring "+a.type),null):b.call(this,a)}}this.flashVersion=8;this.debugMode=!0;this.debugFlash=!1;this.consoleOnly=this.useConsole=!0;this.waitForWindowLoad=!1;this.bgColor="#ffffff";this.useHighPerformance=!1;this.html5PollingInterval=this.flashPollingInterval=null;this.flashLoadTimeout=1E3;this.wmode=null;this.allowScriptAccess="always";this.useFlashBlock= -!1;this.useHTML5Audio=!0;this.html5Test=/^(probably|maybe)$/i;this.preferFlash=!0;this.noSWFCache=!1;this.audioFormats={mp3:{type:['audio/mpeg; codecs="mp3"',"audio/mpeg","audio/mp3","audio/MPA","audio/mpa-robust"],required:!0},mp4:{related:["aac","m4a"],type:['audio/mp4; codecs="mp4a.40.2"',"audio/aac","audio/x-m4a","audio/MP4A-LATM","audio/mpeg4-generic"],required:!1},ogg:{type:["audio/ogg; codecs=vorbis"],required:!1},wav:{type:['audio/wav; codecs="1"',"audio/wav","audio/wave","audio/x-wav"],required:!1}}; -this.defaultOptions={autoLoad:!1,autoPlay:!1,from:null,loops:1,onid3:null,onload:null,whileloading:null,onplay:null,onpause:null,onresume:null,whileplaying:null,onposition:null,onstop:null,onfailure:null,onfinish:null,multiShot:!0,multiShotEvents:!1,position:null,pan:0,stream:!0,to:null,type:null,usePolicyFile:!1,volume:100};this.flash9Options={isMovieStar:null,usePeakData:!1,useWaveformData:!1,useEQData:!1,onbufferchange:null,ondataerror:null};this.movieStarOptions={bufferTime:3,serverURL:null,onconnect:null, -duration:null};this.movieID="sm2-container";this.id=la||"sm2movie";this.debugID="soundmanager-debug";this.debugURLParam=/([#?&])debug=1/i;this.versionNumber="V2.97a.20111220";this.movieURL=this.version=null;this.url=W||null;this.altURL=null;this.enabled=this.swfLoaded=!1;this.oMC=null;this.sounds={};this.soundIDs=[];this.didFlashBlock=this.muted=!1;this.filePattern=null;this.filePatterns={flash8:/\.mp3(\?.*)?$/i,flash9:/\.mp3(\?.*)?$/i};this.features={buffering:!1,peakData:!1,waveformData:!1,eqData:!1, -movieStar:!1};this.sandbox={type:null,types:{remote:"remote (domain-based) rules",localWithFile:"local with file access (no internet access)",localWithNetwork:"local with network (internet access only, no local access)",localTrusted:"local, trusted (local+internet access)"},description:null,noRemote:null,noLocal:null};var ma;try{ma="undefined"!==typeof Audio&&"undefined"!==typeof(new Audio).canPlayType}catch(fb){ma=!1}this.hasHTML5=ma;this.html5={usingFlash:null};this.flash={};this.ignoreFlash=this.html5Only= -!1;var Ea,c=this,i=null,k="HTML5::",u,p=navigator.userAgent,j=G,O=j.location.href.toString(),h=document,na,X,m,B=[],oa=!0,w,P=!1,Q=!1,n=!1,y=!1,Y=!1,o,Za=0,R,v,pa,H,I,Z,Fa,qa,E,$,aa,J,ra,sa,ba,ca,K,Ga,ta,$a=["log","info","warn","error"],Ha,da,Ia,S=null,ua=null,q,va,L,Ja,ea,fa,wa,s,ga=!1,xa=!1,Ka,La,Ma,ha=0,T=null,ia,z=null,Na,ja,U,C,ya,za,Oa,r,Pa=Array.prototype.slice,F=!1,t,ka,Qa,A,Ra,Aa=p.match(/(ipad|iphone|ipod)/i),ab=p.match(/firefox/i),bb=p.match(/droid/i),D=p.match(/msie/i),cb=p.match(/webkit/i), -V=p.match(/safari/i)&&!p.match(/chrome/i),db=p.match(/opera/i),Ba=p.match(/(mobile|pre\/|xoom)/i)||Aa,Ca=!O.match(/usehtml5audio/i)&&!O.match(/sm2\-ignorebadua/i)&&V&&!p.match(/silk/i)&&p.match(/OS X 10_6_([3-7])/i),Sa="undefined"!==typeof console&&"undefined"!==typeof console.log,Da="undefined"!==typeof h.hasFocus?h.hasFocus():null,M=V&&"undefined"===typeof h.hasFocus,Ta=!M,Ua=/(mp3|mp4|mpa)/i,N=h.location?h.location.protocol.match(/http/i):null,Va=!N?"http://":"",Wa=/^\s*audio\/(?:x-)?(?:mpeg4|aac|flv|mov|mp4||m4v|m4a|mp4v|3gp|3g2)\s*(?:$|;)/i, -Xa="mpeg4,aac,flv,mov,mp4,m4v,f4v,m4a,mp4v,3gp,3g2".split(","),eb=RegExp("\\.("+Xa.join("|")+")(\\?.*)?$","i");this.mimePattern=/^\s*audio\/(?:x-)?(?:mp(?:eg|3))\s*(?:$|;)/i;this.useAltURL=!N;this._global_a=null;if(Ba&&(c.useHTML5Audio=!0,c.preferFlash=!1,Aa))F=c.ignoreFlash=!0;this.supported=this.ok=function(){return z?n&&!y:c.useHTML5Audio&&c.hasHTML5};this.getMovie=function(c){return u(c)||h[c]||j[c]};this.createSound=function(b){function a(){f=ea(f);c.sounds[e.id]=new Ea(e);c.soundIDs.push(e.id); -return c.sounds[e.id]}var d,f=null,e=d=null;d="soundManager.createSound(): "+q(!n?"notReady":"notOK");if(!n||!c.ok())return wa(d),!1;2===arguments.length&&(b={id:arguments[0],url:arguments[1]});f=v(b);f.url=ia(f.url);e=f;e.id.toString().charAt(0).match(/^[0-9]$/)&&c._wD("soundManager.createSound(): "+q("badID",e.id),2);c._wD("soundManager.createSound(): "+e.id+" ("+e.url+")",1);if(s(e.id,!0))return c._wD("soundManager.createSound(): "+e.id+" exists",1),c.sounds[e.id];if(ja(e))d=a(),c._wD("Loading sound "+ -e.id+" via HTML5"),d._setup_html5(e);else{if(8=b)return!1;for(;b--;)if(c=x[b],!c.fired&&a.position>=c.position)c.fired=!0,l++,c.method.apply(c.scope,[c.position]);return!0};this._resetOnPosition=function(a){var b,c;b=x.length;if(!b)return!1;for(;b--;)if(c=x[b],c.fired&&a<=c.position)c.fired=!1,l--;return!0};r=function(){var b=a._iO,d=b.from,e=b.to,f,g;g=function(){c._wD(a.sID+': "to" time of '+e+" reached.");a.clearOnPosition(e,g);a.stop()};f=function(){c._wD(a.sID+ -': playing "from" '+d);if(null!==e&&!isNaN(e))a.onPosition(e,g)};if(null!==d&&!isNaN(d))b.position=d,b.multiShot=!1,f();return b};Ya=function(){var b=a._iO.onposition;if(b)for(var c in b)if(b.hasOwnProperty(c))a.onPosition(parseInt(c,10),b[c])};n=function(){var b=a._iO.onposition;if(b)for(var c in b)b.hasOwnProperty(c)&&a.clearOnPosition(parseInt(c,10))};g=function(){a.isHTML5&&Ka(a)};h=function(){a.isHTML5&&La(a)};d=function(){x=[];l=0;j=!1;a._hasTimer=null;a._a=null;a._html5_canplay=!1;a.bytesLoaded= -null;a.bytesTotal=null;a.duration=a._iO&&a._iO.duration?a._iO.duration:null;a.durationEstimate=null;a.eqData=[];a.eqData.left=[];a.eqData.right=[];a.failures=0;a.isBuffering=!1;a.instanceOptions={};a.instanceCount=0;a.loaded=!1;a.metadata={};a.readyState=0;a.muted=!1;a.paused=!1;a.peakData={left:0,right:0};a.waveformData={left:[],right:[]};a.playState=0;a.position=null};d();this._onTimer=function(b){var c,d=!1,e={};if(a._hasTimer||b){if(a._a&&(b||(0f.duration?a.duration:f.duration:parseInt(a.bytesTotal/a.bytesLoaded*a.duration,10),void 0===a.durationEstimate)a.durationEstimate=a.duration;3!==a.readyState&&f.whileloading&&f.whileloading.apply(a)};this._whileplaying=function(b,c,d,e,f){var g=a._iO;if(isNaN(b)|| -null===b)return!1;a.position=b;a._processOnPosition();if(!a.isHTML5&&8m)c._wD(q("needfl9")),c.flashVersion=m=9;c.version=c.versionNumber+(c.html5Only?" (HTML5-only mode)":9===m?" (AS3/Flash 9)":" (AS2/Flash 8)");8'}if(P&&Q)return!1;if(c.html5Only)return qa(),d(),c.oMC=u(c.movieID),X(),Q=P=!0,!1;var e=a||c.url,i=c.altURL||e,g;g=ba();var j,m,k=L(),l,n=null,n=(n=h.getElementsByTagName("html")[0])&&n.dir&&n.dir.match(/rtl/i),b="undefined"===typeof b?c.id:b;qa();c.url=Ia(N?e:i);a=c.url;c.wmode=!c.wmode&&c.useHighPerformance?"transparent":c.wmode;if(null!==c.wmode&&(p.match(/msie 8/i)||!D&&!c.useHighPerformance)&&navigator.platform.match(/win32|win64/i))o("spcWmode"), -c.wmode=null;g={name:b,id:b,src:a,width:"auto",height:"auto",quality:"high",allowScriptAccess:c.allowScriptAccess,bgcolor:c.bgColor,pluginspage:Va+"www.macromedia.com/go/getflashplayer",title:"JS/Flash audio component (SoundManager 2)",type:"application/x-shockwave-flash",wmode:c.wmode,hasPriority:"true"};if(c.debugFlash)g.FlashVars="debug=1";c.wmode||delete g.wmode;if(D)e=h.createElement("div"),m=['',f("movie",a),f("AllowScriptAccess",c.allowScriptAccess),f("quality",g.quality),c.wmode?f("wmode",c.wmode):"",f("bgcolor",c.bgColor),f("hasPriority","true"),c.debugFlash?f("FlashVars",g.FlashVars):"",""].join("");else for(j in e=h.createElement("embed"),g)g.hasOwnProperty(j)&&e.setAttribute(j,g[j]);ta();k=L();if(g=ba())if(c.oMC=u(c.movieID)||h.createElement("div"), -c.oMC.id){l=c.oMC.className;c.oMC.className=(l?l+" ":"movieContainer")+(k?" "+k:"");c.oMC.appendChild(e);if(D)j=c.oMC.appendChild(h.createElement("div")),j.className="sm2-object-box",j.innerHTML=m;Q=!0}else{c.oMC.id=c.movieID;c.oMC.className="movieContainer "+k;j=k=null;if(!c.useFlashBlock)if(c.useHighPerformance)k={position:"fixed",width:"8px",height:"8px",bottom:"0px",left:"0px",overflow:"hidden"};else if(k={position:"absolute",width:"6px",height:"6px",top:"-9999px",left:"-9999px"},n)k.left=Math.abs(parseInt(k.left, -10))+"px";if(cb)c.oMC.style.zIndex=1E4;if(!c.debugFlash)for(l in k)k.hasOwnProperty(l)&&(c.oMC.style[l]=k[l]);try{D||c.oMC.appendChild(e);g.appendChild(c.oMC);if(D)j=c.oMC.appendChild(h.createElement("div")),j.className="sm2-object-box",j.innerHTML=m;Q=!0}catch(r){throw Error(q("domError")+" \n"+r.toString());}}P=!0;d();c._wD("soundManager::createMovie(): Trying to load "+a+(!N&&c.altURL?" (alternate URL)":""),1);return!0};aa=function(){if(c.html5Only)return ca(),!1;if(i)return!1;i=c.getMovie(c.id); -if(!i)S?(D?c.oMC.innerHTML=ua:c.oMC.appendChild(S),S=null,P=!0):ca(c.id,c.url),i=c.getMovie(c.id);i&&o("waitEI");c.oninitmovie instanceof Function&&setTimeout(c.oninitmovie,1);return!0};Z=function(){setTimeout(Fa,1E3)};Fa=function(){if(ga)return!1;ga=!0;r.remove(j,"load",Z);if(M&&!Da)return o("waitFocus"),!1;var b;n||(b=c.getMoviePercent(),c._wD(q("waitImpatient",100===b?" (SWF loaded)":0=b)return!1;for(;b--;)if(c=t[b],!c.fired&&a.position>=c.position)c.fired=!0,l++,c.method.apply(c.scope,[c.position]);return!0};this._resetOnPosition=function(a){var b,c;b=t.length;if(!b)return!1;for(;b--;)if(c=t[b],c.fired&&a<=c.position)c.fired=!1,l--;return!0};p=function(){var b=a._iO,c=b.from,d=b.to,e,f;f=function(){a.clearOnPosition(d,f);a.stop()};e= -function(){if(null!==d&&!isNaN(d))a.onPosition(d,f)};if(null!==c&&!isNaN(c))b.position=c,b.multiShot=!1,e();return b};j=function(){var b=a._iO.onposition;if(b)for(var c in b)if(b.hasOwnProperty(c))a.onPosition(parseInt(c,10),b[c])};n=function(){var b=a._iO.onposition;if(b)for(var c in b)b.hasOwnProperty(c)&&a.clearOnPosition(parseInt(c,10))};z=function(){a.isHTML5&&Fa(a)};g=function(){a.isHTML5&&Ga(a)};e=function(){t=[];l=0;k=!1;a._hasTimer=null;a._a=null;a._html5_canplay=!1;a.bytesLoaded=null;a.bytesTotal= -null;a.duration=a._iO&&a._iO.duration?a._iO.duration:null;a.durationEstimate=null;a.eqData=[];a.eqData.left=[];a.eqData.right=[];a.failures=0;a.isBuffering=!1;a.instanceOptions={};a.instanceCount=0;a.loaded=!1;a.metadata={};a.readyState=0;a.muted=!1;a.paused=!1;a.peakData={left:0,right:0};a.waveformData={left:[],right:[]};a.playState=0;a.position=null};e();this._onTimer=function(b){var c,d=!1,e={};if(a._hasTimer||b){if(a._a&&(b||(0f.duration?a.duration:f.duration:parseInt(a.bytesTotal/a.bytesLoaded*a.duration,10),void 0===a.durationEstimate)a.durationEstimate=a.duration;3!==a.readyState&&f.whileloading&&f.whileloading.apply(a)};this._whileplaying=function(b,c,d,e,f){var g=a._iO;if(isNaN(b)||null===b)return!1;a.position=b;a._processOnPosition();if(!a.isHTML5&&8i)c.flashVersion=i=9;c.version=c.versionNumber+(c.html5Only?" (HTML5-only mode)":9===i?" (AS3/Flash 9)":" (AS2/Flash 8)");8'}if(K&&L)return!1;if(c.html5Only)return ka(),c.oMC=S(c.movieID),T(),L=K=!0,!1;var f=a||c.url,d=c.altURL||f,g;g=na();var h,j,i=H(),l,m=null,m=(m=k.getElementsByTagName("html")[0])&&m.dir&&m.dir.match(/rtl/i),b="undefined"===typeof b?c.id:b;ka();c.url=Ea(za?f:d);a=c.url;c.wmode=!c.wmode&&c.useHighPerformance?"transparent": -c.wmode;if(null!==c.wmode&&(p.match(/msie 8/i)||!y&&!c.useHighPerformance)&&navigator.platform.match(/win32|win64/i))c.wmode=null;g={name:b,id:b,src:a,width:"auto",height:"auto",quality:"high",allowScriptAccess:c.allowScriptAccess,bgcolor:c.bgColor,pluginspage:Oa+"www.macromedia.com/go/getflashplayer",title:"JS/Flash audio component (SoundManager 2)",type:"application/x-shockwave-flash",wmode:c.wmode,hasPriority:"true"};if(c.debugFlash)g.FlashVars="debug=1";c.wmode||delete g.wmode;if(y)f=k.createElement("div"), -j=['',e("movie",a),e("AllowScriptAccess",c.allowScriptAccess),e("quality",g.quality),c.wmode?e("wmode",c.wmode):"",e("bgcolor",c.bgColor),e("hasPriority","true"),c.debugFlash?e("FlashVars",g.FlashVars):"",""].join("");else for(h in f= -k.createElement("embed"),g)g.hasOwnProperty(h)&&f.setAttribute(h,g[h]);oa();i=H();if(g=na())if(c.oMC=S(c.movieID)||k.createElement("div"),c.oMC.id){l=c.oMC.className;c.oMC.className=(l?l+" ":"movieContainer")+(i?" "+i:"");c.oMC.appendChild(f);if(y)h=c.oMC.appendChild(k.createElement("div")),h.className="sm2-object-box",h.innerHTML=j;L=!0}else{c.oMC.id=c.movieID;c.oMC.className="movieContainer "+i;h=i=null;if(!c.useFlashBlock)if(c.useHighPerformance)i={position:"fixed",width:"8px",height:"8px",bottom:"0px", -left:"0px",overflow:"hidden"};else if(i={position:"absolute",width:"6px",height:"6px",top:"-9999px",left:"-9999px"},m)i.left=Math.abs(parseInt(i.left,10))+"px";if(Ua)c.oMC.style.zIndex=1E4;if(!c.debugFlash)for(l in i)i.hasOwnProperty(l)&&(c.oMC.style[l]=i[l]);try{y||c.oMC.appendChild(f);g.appendChild(c.oMC);if(y)h=c.oMC.appendChild(k.createElement("div")),h.className="sm2-object-box",h.innerHTML=j;L=!0}catch(n){throw Error(G("domError")+" \n"+n.toString());}}return K=!0};V=function(){if(c.html5Only)return W(), -!1;if(h)return!1;h=c.getMovie(c.id);if(!h)N?(y?c.oMC.innerHTML=pa:c.oMC.appendChild(N),N=null,K=!0):W(c.id,c.url),h=c.getMovie(c.id);c.oninitmovie instanceof Function&&setTimeout(c.oninitmovie,1);return!0};U=function(){setTimeout(Ba,1E3)};Ba=function(){if($)return!1;$=!0;n.remove(j,"load",U);if(I&&!ya)return!1;var b;m||(b=c.getMoviePercent());setTimeout(function(){b=c.getMoviePercent();!m&&Ma&&(null===b?c.useFlashBlock||0===c.flashLoadTimeout?c.useFlashBlock&&qa():X(!0):0!==c.flashLoadTimeout&&X(!0))}, -c.flashLoadTimeout)};A=function(){function b(){n.remove(j,"focus",A);n.remove(j,"load",A)}if(ya||!I)return b(),!0;ya=Ma=!0;Q&&I&&n.remove(j,"mousemove",A);$=!1;b();return!0};La=function(){var b,a=[];if(c.useHTML5Audio&&c.hasHTML5)for(b in c.audioFormats)c.audioFormats.hasOwnProperty(b)&&a.push(b+": "+c.html5[b]+(!c.html5[b]&&r&&c.flash[b]?" (using flash)":c.preferFlash&&c.flash[b]&&r?" (preferring flash)":!c.html5[b]?" ("+(c.audioFormats[b].required?"required, ":"")+"and no flash support)":""))}; -M=function(b){if(m)return!1;if(c.html5Only)return m=!0,D(),!0;var a;if(!c.useFlashBlock||!c.flashLoadTimeout||c.getMoviePercent())m=!0,w&&(a={type:!r&&s?"NO_FLASH":"INIT_TIMEOUT"});if(w||b){if(c.useFlashBlock&&c.oMC)c.oMC.className=H()+" "+(null===c.getMoviePercent()?"swf_timedout":"swf_error");C({type:"ontimeout",error:a});F(a);return!1}if(c.waitForWindowLoad&&!ia)return n.add(j,"load",D),!1;D();return!0};T=function(){if(m)return!1;if(c.html5Only){if(!m)n.remove(j,"load",c.beginDelayedInit),c.enabled= -!0,M();return!0}V();try{h._externalInterfaceTest(!1),Ca(!0,c.flashPollingInterval||(c.useHighPerformance?10:50)),c.debugMode||h._disableDebug(),c.enabled=!0,c.html5Only||n.add(j,"unload",ha)}catch(b){return F({type:"JS_TO_FLASH_EXCEPTION",fatal:!0}),X(!0),M(),!1}M();n.remove(j,"load",c.beginDelayedInit);return!0};E=function(){if(ma)return!1;ma=!0;oa();if(!r&&c.hasHTML5)c.useHTML5Audio=!0,c.preferFlash=!1;Ja();c.html5.usingFlash=Ia();s=c.html5.usingFlash;La();if(!r&&s)c.flashLoadTimeout=1;k.removeEventListener&& -k.removeEventListener("DOMContentLoaded",E,!1);V();return!0};ua=function(){"complete"===k.readyState&&(E(),k.detachEvent("onreadystatechange",ua));return!0};la=function(){ia=!0;n.remove(j,"load",la)};da();n.add(j,"focus",A);n.add(j,"load",A);n.add(j,"load",U);n.add(j,"load",la);Q&&I&&n.add(j,"mousemove",A);k.addEventListener?k.addEventListener("DOMContentLoaded",E,!1):k.attachEvent?k.attachEvent("onreadystatechange",ua):F({type:"NO_DOM2_EVENTS",fatal:!0});"complete"===k.readyState&&setTimeout(E,100)} -var ea=null;if("undefined"===typeof SM2_DEFER||!SM2_DEFER)ea=new R;J.SoundManager=R;J.soundManager=ea})(window); \ No newline at end of file diff --git a/inc/MIDI.js/inc/SoundManager2/script/soundmanager2-nodebug.js b/inc/MIDI.js/inc/SoundManager2/script/soundmanager2-nodebug.js deleted file mode 100755 index ba81243..0000000 --- a/inc/MIDI.js/inc/SoundManager2/script/soundmanager2-nodebug.js +++ /dev/null @@ -1,2377 +0,0 @@ -/** @license - * - * SoundManager 2: JavaScript Sound for the Web - * ---------------------------------------------- - * http://schillmania.com/projects/soundmanager2/ - * - * Copyright (c) 2007, Scott Schiller. All rights reserved. - * Code provided under the BSD License: - * http://schillmania.com/projects/soundmanager2/license.txt - * - * V2.97a.20111220 - */ - -/*global window, SM2_DEFER, sm2Debugger, console, document, navigator, setTimeout, setInterval, clearInterval, Audio */ -/* jslint regexp: true, sloppy: true, white: true, nomen: true, plusplus: true */ - -(function(window) { -var soundManager = null; -function SoundManager(smURL, smID) { - this.flashVersion = 8; - this.debugMode = false; - this.debugFlash = false; - this.useConsole = true; - this.consoleOnly = true; - this.waitForWindowLoad = false; - this.bgColor = '#ffffff'; - this.useHighPerformance = false; - this.flashPollingInterval = null; - this.html5PollingInterval = null; - this.flashLoadTimeout = 1000; - this.wmode = null; - this.allowScriptAccess = 'always'; - this.useFlashBlock = false; - this.useHTML5Audio = true; - this.html5Test = /^(probably|maybe)$/i; - this.preferFlash = true; - this.noSWFCache = false; - this.audioFormats = { - 'mp3': { - 'type': ['audio/mpeg; codecs="mp3"', 'audio/mpeg', 'audio/mp3', 'audio/MPA', 'audio/mpa-robust'], - 'required': true - }, - 'mp4': { - 'related': ['aac','m4a'], - 'type': ['audio/mp4; codecs="mp4a.40.2"', 'audio/aac', 'audio/x-m4a', 'audio/MP4A-LATM', 'audio/mpeg4-generic'], - 'required': false - }, - 'ogg': { - 'type': ['audio/ogg; codecs=vorbis'], - 'required': false - }, - 'wav': { - 'type': ['audio/wav; codecs="1"', 'audio/wav', 'audio/wave', 'audio/x-wav'], - 'required': false - } - }; - this.defaultOptions = { - 'autoLoad': false, - 'autoPlay': false, - 'from': null, - 'loops': 1, - 'onid3': null, - 'onload': null, - 'whileloading': null, - 'onplay': null, - 'onpause': null, - 'onresume': null, - 'whileplaying': null, - 'onposition': null, - 'onstop': null, - 'onfailure': null, - 'onfinish': null, - 'multiShot': true, - 'multiShotEvents': false, - 'position': null, - 'pan': 0, - 'stream': true, - 'to': null, - 'type': null, - 'usePolicyFile': false, - 'volume': 100 - }; - this.flash9Options = { - 'isMovieStar': null, - 'usePeakData': false, - 'useWaveformData': false, - 'useEQData': false, - 'onbufferchange': null, - 'ondataerror': null - }; - this.movieStarOptions = { - 'bufferTime': 3, - 'serverURL': null, - 'onconnect': null, - 'duration': null - }; - this.movieID = 'sm2-container'; - this.id = (smID || 'sm2movie'); - this.debugID = 'soundmanager-debug'; - this.debugURLParam = /([#?&])debug=1/i; - this.versionNumber = 'V2.97a.20111220'; - this.version = null; - this.movieURL = null; - this.url = (smURL || null); - this.altURL = null; - this.swfLoaded = false; - this.enabled = false; - this.oMC = null; - this.sounds = {}; - this.soundIDs = []; - this.muted = false; - this.didFlashBlock = false; - this.filePattern = null; - this.filePatterns = { - 'flash8': /\.mp3(\?.*)?$/i, - 'flash9': /\.mp3(\?.*)?$/i - }; - this.features = { - 'buffering': false, - 'peakData': false, - 'waveformData': false, - 'eqData': false, - 'movieStar': false - }; - this.sandbox = { - }; - this.hasHTML5 = (function() { - try { - return (typeof Audio !== 'undefined' && typeof new Audio().canPlayType !== 'undefined'); - } catch(e) { - return false; - } - }()); - this.html5 = { - 'usingFlash': null - }; - this.flash = {}; - this.html5Only = false; - this.ignoreFlash = false; - var SMSound, - _s = this, _flash = null, _sm = 'soundManager', _smc = _sm+'::', _h5 = 'HTML5::', _id, _ua = navigator.userAgent, _win = window, _wl = _win.location.href.toString(), _doc = document, _doNothing, _init, _fV, _on_queue = [], _debugOpen = true, _debugTS, _didAppend = false, _appendSuccess = false, _didInit = false, _disabled = false, _windowLoaded = false, _wDS, _wdCount = 0, _initComplete, _mixin, _addOnEvent, _processOnEvents, _initUserOnload, _delayWaitForEI, _waitForEI, _setVersionInfo, _handleFocus, _strings, _initMovie, _domContentLoaded, _winOnLoad, _didDCLoaded, _getDocument, _createMovie, _catchError, _setPolling, _initDebug, _debugLevels = ['log', 'info', 'warn', 'error'], _defaultFlashVersion = 8, _disableObject, _failSafely, _normalizeMovieURL, _oRemoved = null, _oRemovedHTML = null, _str, _flashBlockHandler, _getSWFCSS, _swfCSS, _toggleDebug, _loopFix, _policyFix, _complain, _idCheck, _waitingForEI = false, _initPending = false, _smTimer, _onTimer, _startTimer, _stopTimer, _timerExecute, _h5TimerCount = 0, _h5IntervalTimer = null, _parseURL, - _needsFlash = null, _featureCheck, _html5OK, _html5CanPlay, _html5Ext, _html5Unload, _domContentLoadedIE, _testHTML5, _event, _slice = Array.prototype.slice, _useGlobalHTML5Audio = false, _hasFlash, _detectFlash, _badSafariFix, _html5_events, _showSupport, - _is_iDevice = _ua.match(/(ipad|iphone|ipod)/i), _is_firefox = _ua.match(/firefox/i), _is_android = _ua.match(/droid/i), _isIE = _ua.match(/msie/i), _isWebkit = _ua.match(/webkit/i), _isSafari = (_ua.match(/safari/i) && !_ua.match(/chrome/i)), _isOpera = (_ua.match(/opera/i)), - _likesHTML5 = (_ua.match(/(mobile|pre\/|xoom)/i) || _is_iDevice), - _isBadSafari = (!_wl.match(/usehtml5audio/i) && !_wl.match(/sm2\-ignorebadua/i) && _isSafari && !_ua.match(/silk/i) && _ua.match(/OS X 10_6_([3-7])/i)), - _hasConsole = (typeof console !== 'undefined' && typeof console.log !== 'undefined'), _isFocused = (typeof _doc.hasFocus !== 'undefined'?_doc.hasFocus():null), _tryInitOnFocus = (_isSafari && typeof _doc.hasFocus === 'undefined'), _okToDisable = !_tryInitOnFocus, _flashMIME = /(mp3|mp4|mpa)/i, - _emptyURL = 'about:blank', - _overHTTP = (_doc.location?_doc.location.protocol.match(/http/i):null), - _http = (!_overHTTP ? 'http:/'+'/' : ''), - _netStreamMimeTypes = /^\s*audio\/(?:x-)?(?:mpeg4|aac|flv|mov|mp4||m4v|m4a|mp4v|3gp|3g2)\s*(?:$|;)/i, - _netStreamTypes = ['mpeg4', 'aac', 'flv', 'mov', 'mp4', 'm4v', 'f4v', 'm4a', 'mp4v', '3gp', '3g2'], - _netStreamPattern = new RegExp('\\.(' + _netStreamTypes.join('|') + ')(\\?.*)?$', 'i'); - this.mimePattern = /^\s*audio\/(?:x-)?(?:mp(?:eg|3))\s*(?:$|;)/i; - this.useAltURL = !_overHTTP; - this._global_a = null; - _swfCSS = { - 'swfBox': 'sm2-object-box', - 'swfDefault': 'movieContainer', - 'swfError': 'swf_error', - 'swfTimedout': 'swf_timedout', - 'swfLoaded': 'swf_loaded', - 'swfUnblocked': 'swf_unblocked', - 'sm2Debug': 'sm2_debug', - 'highPerf': 'high_performance', - 'flashDebug': 'flash_debug' - }; - if (_likesHTML5) { - _s.useHTML5Audio = true; - _s.preferFlash = false; - if (_is_iDevice) { - _s.ignoreFlash = true; - _useGlobalHTML5Audio = true; - } - } - this.ok = function() { - return (_needsFlash?(_didInit && !_disabled):(_s.useHTML5Audio && _s.hasHTML5)); - }; - this.supported = this.ok; - this.getMovie = function(smID) { - return _id(smID) || _doc[smID] || _win[smID]; - }; - this.createSound = function(oOptions) { - var _cs, _cs_string, - thisOptions = null, oSound = null, _tO = null; - if (!_didInit || !_s.ok()) { - _complain(_cs_string); - return false; - } - if (arguments.length === 2) { - oOptions = { - 'id': arguments[0], - 'url': arguments[1] - }; - } - thisOptions = _mixin(oOptions); - thisOptions.url = _parseURL(thisOptions.url); - _tO = thisOptions; - if (_idCheck(_tO.id, true)) { - return _s.sounds[_tO.id]; - } - function make() { - thisOptions = _loopFix(thisOptions); - _s.sounds[_tO.id] = new SMSound(_tO); - _s.soundIDs.push(_tO.id); - return _s.sounds[_tO.id]; - } - if (_html5OK(_tO)) { - oSound = make(); - oSound._setup_html5(_tO); - } else { - if (_fV > 8) { - if (_tO.isMovieStar === null) { - _tO.isMovieStar = (_tO.serverURL || (_tO.type ? _tO.type.match(_netStreamMimeTypes) : false) || _tO.url.match(_netStreamPattern)); - } - if (_tO.isMovieStar) { - if (_tO.usePeakData) { - _tO.usePeakData = false; - } - } - } - _tO = _policyFix(_tO, _cs); - oSound = make(); - if (_fV === 8) { - _flash._createSound(_tO.id, _tO.loops||1, _tO.usePolicyFile); - } else { - _flash._createSound(_tO.id, _tO.url, _tO.usePeakData, _tO.useWaveformData, _tO.useEQData, _tO.isMovieStar, (_tO.isMovieStar?_tO.bufferTime:false), _tO.loops||1, _tO.serverURL, _tO.duration||null, _tO.autoPlay, true, _tO.autoLoad, _tO.usePolicyFile); - if (!_tO.serverURL) { - oSound.connected = true; - if (_tO.onconnect) { - _tO.onconnect.apply(oSound); - } - } - } - if (!_tO.serverURL && (_tO.autoLoad || _tO.autoPlay)) { - oSound.load(_tO); - } - } - if (!_tO.serverURL && _tO.autoPlay) { - oSound.play(); - } - return oSound; - }; - this.destroySound = function(sID, _bFromSound) { - if (!_idCheck(sID)) { - return false; - } - var oS = _s.sounds[sID], i; - oS._iO = {}; - oS.stop(); - oS.unload(); - for (i = 0; i < _s.soundIDs.length; i++) { - if (_s.soundIDs[i] === sID) { - _s.soundIDs.splice(i, 1); - break; - } - } - if (!_bFromSound) { - oS.destruct(true); - } - oS = null; - delete _s.sounds[sID]; - return true; - }; - this.load = function(sID, oOptions) { - if (!_idCheck(sID)) { - return false; - } - return _s.sounds[sID].load(oOptions); - }; - this.unload = function(sID) { - if (!_idCheck(sID)) { - return false; - } - return _s.sounds[sID].unload(); - }; - this.onPosition = function(sID, nPosition, oMethod, oScope) { - if (!_idCheck(sID)) { - return false; - } - return _s.sounds[sID].onposition(nPosition, oMethod, oScope); - }; - this.onposition = this.onPosition; - this.clearOnPosition = function(sID, nPosition, oMethod) { - if (!_idCheck(sID)) { - return false; - } - return _s.sounds[sID].clearOnPosition(nPosition, oMethod); - }; - this.play = function(sID, oOptions) { - if (!_didInit || !_s.ok()) { - _complain(_sm+'.play(): ' + _str(!_didInit?'notReady':'notOK')); - return false; - } - if (!_idCheck(sID)) { - if (!(oOptions instanceof Object)) { - oOptions = { - url: oOptions - }; - } - if (oOptions && oOptions.url) { - oOptions.id = sID; - return _s.createSound(oOptions).play(); - } else { - return false; - } - } - return _s.sounds[sID].play(oOptions); - }; - this.start = this.play; - this.setPosition = function(sID, nMsecOffset) { - if (!_idCheck(sID)) { - return false; - } - return _s.sounds[sID].setPosition(nMsecOffset); - }; - this.stop = function(sID) { - if (!_idCheck(sID)) { - return false; - } - return _s.sounds[sID].stop(); - }; - this.stopAll = function() { - var oSound; - for (oSound in _s.sounds) { - if (_s.sounds.hasOwnProperty(oSound)) { - _s.sounds[oSound].stop(); - } - } - }; - this.pause = function(sID) { - if (!_idCheck(sID)) { - return false; - } - return _s.sounds[sID].pause(); - }; - this.pauseAll = function() { - var i; - for (i = _s.soundIDs.length; i--;) { - _s.sounds[_s.soundIDs[i]].pause(); - } - }; - this.resume = function(sID) { - if (!_idCheck(sID)) { - return false; - } - return _s.sounds[sID].resume(); - }; - this.resumeAll = function() { - var i; - for (i = _s.soundIDs.length; i--;) { - _s.sounds[_s.soundIDs[i]].resume(); - } - }; - this.togglePause = function(sID) { - if (!_idCheck(sID)) { - return false; - } - return _s.sounds[sID].togglePause(); - }; - this.setPan = function(sID, nPan) { - if (!_idCheck(sID)) { - return false; - } - return _s.sounds[sID].setPan(nPan); - }; - this.setVolume = function(sID, nVol) { - if (!_idCheck(sID)) { - return false; - } - return _s.sounds[sID].setVolume(nVol); - }; - this.mute = function(sID) { - var i = 0; - if (typeof sID !== 'string') { - sID = null; - } - if (!sID) { - for (i = _s.soundIDs.length; i--;) { - _s.sounds[_s.soundIDs[i]].mute(); - } - _s.muted = true; - } else { - if (!_idCheck(sID)) { - return false; - } - return _s.sounds[sID].mute(); - } - return true; - }; - this.muteAll = function() { - _s.mute(); - }; - this.unmute = function(sID) { - var i; - if (typeof sID !== 'string') { - sID = null; - } - if (!sID) { - for (i = _s.soundIDs.length; i--;) { - _s.sounds[_s.soundIDs[i]].unmute(); - } - _s.muted = false; - } else { - if (!_idCheck(sID)) { - return false; - } - return _s.sounds[sID].unmute(); - } - return true; - }; - this.unmuteAll = function() { - _s.unmute(); - }; - this.toggleMute = function(sID) { - if (!_idCheck(sID)) { - return false; - } - return _s.sounds[sID].toggleMute(); - }; - this.getMemoryUse = function() { - var ram = 0; - if (_flash && _fV !== 8) { - ram = parseInt(_flash._getMemoryUse(), 10); - } - return ram; - }; - this.disable = function(bNoDisable) { - var i; - if (typeof bNoDisable === 'undefined') { - bNoDisable = false; - } - if (_disabled) { - return false; - } - _disabled = true; - for (i = _s.soundIDs.length; i--;) { - _disableObject(_s.sounds[_s.soundIDs[i]]); - } - _initComplete(bNoDisable); - _event.remove(_win, 'load', _initUserOnload); - return true; - }; - this.canPlayMIME = function(sMIME) { - var result; - if (_s.hasHTML5) { - result = _html5CanPlay({type:sMIME}); - } - if (!_needsFlash || result) { - return result; - } else { - return (sMIME ? !!((_fV > 8 ? sMIME.match(_netStreamMimeTypes) : null) || sMIME.match(_s.mimePattern)) : null); - } - }; - this.canPlayURL = function(sURL) { - var result; - if (_s.hasHTML5) { - result = _html5CanPlay({url: sURL}); - } - if (!_needsFlash || result) { - return result; - } else { - return (sURL ? !!(sURL.match(_s.filePattern)) : null); - } - }; - this.canPlayLink = function(oLink) { - if (typeof oLink.type !== 'undefined' && oLink.type) { - if (_s.canPlayMIME(oLink.type)) { - return true; - } - } - return _s.canPlayURL(oLink.href); - }; - this.getSoundById = function(sID, _suppressDebug) { - if (!sID) { - throw new Error(_sm+'.getSoundById(): sID is null/undefined'); - } - var result = _s.sounds[sID]; - return result; - }; - this.onready = function(oMethod, oScope) { - var sType = 'onready'; - if (oMethod && oMethod instanceof Function) { - if (!oScope) { - oScope = _win; - } - _addOnEvent(sType, oMethod, oScope); - _processOnEvents(); - return true; - } else { - throw _str('needFunction', sType); - } - }; - this.ontimeout = function(oMethod, oScope) { - var sType = 'ontimeout'; - if (oMethod && oMethod instanceof Function) { - if (!oScope) { - oScope = _win; - } - _addOnEvent(sType, oMethod, oScope); - _processOnEvents({type:sType}); - return true; - } else { - throw _str('needFunction', sType); - } - }; - this._writeDebug = function(sText, sType, _bTimestamp) { - return true; - }; - this._wD = this._writeDebug; - this._debug = function() { - }; - this.reboot = function() { - var i, j; - for (i = _s.soundIDs.length; i--;) { - _s.sounds[_s.soundIDs[i]].destruct(); - } - try { - if (_isIE) { - _oRemovedHTML = _flash.innerHTML; - } - _oRemoved = _flash.parentNode.removeChild(_flash); - } catch(e) { - } - _oRemovedHTML = _oRemoved = _needsFlash = null; - _s.enabled = _didDCLoaded = _didInit = _waitingForEI = _initPending = _didAppend = _appendSuccess = _disabled = _s.swfLoaded = false; - _s.soundIDs = _s.sounds = []; - _flash = null; - for (i in _on_queue) { - if (_on_queue.hasOwnProperty(i)) { - for (j = _on_queue[i].length; j--;) { - _on_queue[i][j].fired = false; - } - } - } - _win.setTimeout(_s.beginDelayedInit, 20); - }; - this.getMoviePercent = function() { - return (_flash && typeof _flash.PercentLoaded !== 'undefined' ? _flash.PercentLoaded() : null); - }; - this.beginDelayedInit = function() { - _windowLoaded = true; - _domContentLoaded(); - setTimeout(function() { - if (_initPending) { - return false; - } - _createMovie(); - _initMovie(); - _initPending = true; - return true; - }, 20); - _delayWaitForEI(); - }; - this.destruct = function() { - _s.disable(true); - }; - SMSound = function(oOptions) { - var _t = this, _resetProperties, _add_html5_events, _remove_html5_events, _stop_html5_timer, _start_html5_timer, _attachOnPosition, _onplay_called = false, _onPositionItems = [], _onPositionFired = 0, _detachOnPosition, _applyFromTo, _lastURL = null; - var _lastHTML5State = { - duration: null, - time: null - }; - this.sID = oOptions.id; - this.url = oOptions.url; - this.options = _mixin(oOptions); - this.instanceOptions = this.options; - this._iO = this.instanceOptions; - this.pan = this.options.pan; - this.volume = this.options.volume; - this.isHTML5 = false; - this._a = null; - this.id3 = {}; - this._debug = function() { - }; - this.load = function(oOptions) { - var oS = null, _iO; - if (typeof oOptions !== 'undefined') { - _t._iO = _mixin(oOptions, _t.options); - _t.instanceOptions = _t._iO; - } else { - oOptions = _t.options; - _t._iO = oOptions; - _t.instanceOptions = _t._iO; - if (_lastURL && _lastURL !== _t.url) { - _t._iO.url = _t.url; - _t.url = null; - } - } - if (!_t._iO.url) { - _t._iO.url = _t.url; - } - _t._iO.url = _parseURL(_t._iO.url); - if (_t._iO.url === _t.url && _t.readyState !== 0 && _t.readyState !== 2) { - if (_t.readyState === 3 && _t._iO.onload) { - _t._iO.onload.apply(_t, [(!!_t.duration)]); - } - return _t; - } - _iO = _t._iO; - _lastURL = _t.url; - _t.loaded = false; - _t.readyState = 1; - _t.playState = 0; - if (_html5OK(_iO)) { - oS = _t._setup_html5(_iO); - if (!oS._called_load) { - _t._html5_canplay = false; - _t._a.autobuffer = 'auto'; - _t._a.preload = 'auto'; - oS.load(); - oS._called_load = true; - if (_iO.autoPlay) { - _t.play(); - } - } else { - } - } else { - try { - _t.isHTML5 = false; - _t._iO = _policyFix(_loopFix(_iO)); - _iO = _t._iO; - if (_fV === 8) { - _flash._load(_t.sID, _iO.url, _iO.stream, _iO.autoPlay, (_iO.whileloading?1:0), _iO.loops||1, _iO.usePolicyFile); - } else { - _flash._load(_t.sID, _iO.url, !!(_iO.stream), !!(_iO.autoPlay), _iO.loops||1, !!(_iO.autoLoad), _iO.usePolicyFile); - } - } catch(e) { - _catchError({type:'SMSOUND_LOAD_JS_EXCEPTION', fatal:true}); - } - } - return _t; - }; - this.unload = function() { - if (_t.readyState !== 0) { - if (!_t.isHTML5) { - if (_fV === 8) { - _flash._unload(_t.sID, _emptyURL); - } else { - _flash._unload(_t.sID); - } - } else { - _stop_html5_timer(); - if (_t._a) { - _t._a.pause(); - _html5Unload(_t._a); - } - } - _resetProperties(); - } - return _t; - }; - this.destruct = function(_bFromSM) { - if (!_t.isHTML5) { - _t._iO.onfailure = null; - _flash._destroySound(_t.sID); - } else { - _stop_html5_timer(); - if (_t._a) { - _t._a.pause(); - _html5Unload(_t._a); - if (!_useGlobalHTML5Audio) { - _remove_html5_events(); - } - _t._a._t = null; - _t._a = null; - } - } - if (!_bFromSM) { - _s.destroySound(_t.sID, true); - } - }; - this.play = function(oOptions, _updatePlayState) { - var fN, allowMulti, a, onready; - _updatePlayState = _updatePlayState === undefined ? true : _updatePlayState; - if (!oOptions) { - oOptions = {}; - } - _t._iO = _mixin(oOptions, _t._iO); - _t._iO = _mixin(_t._iO, _t.options); - _t._iO.url = _parseURL(_t._iO.url); - _t.instanceOptions = _t._iO; - if (_t._iO.serverURL && !_t.connected) { - if (!_t.getAutoPlay()) { - _t.setAutoPlay(true); - } - return _t; - } - if (_html5OK(_t._iO)) { - _t._setup_html5(_t._iO); - _start_html5_timer(); - } - if (_t.playState === 1 && !_t.paused) { - allowMulti = _t._iO.multiShot; - if (!allowMulti) { - return _t; - } else { - } - } - if (!_t.loaded) { - if (_t.readyState === 0) { - if (!_t.isHTML5) { - _t._iO.autoPlay = true; - } - _t.load(_t._iO); - } else if (_t.readyState === 2) { - return _t; - } else { - } - } else { - } - if (!_t.isHTML5 && _fV === 9 && _t.position > 0 && _t.position === _t.duration) { - oOptions.position = 0; - } - if (_t.paused && _t.position && _t.position > 0) { - _t.resume(); - } else { - _t._iO = _mixin(oOptions, _t._iO); - if (_t._iO.from !== null && _t._iO.to !== null && _t.instanceCount === 0 && _t.playState === 0 && !_t._iO.serverURL) { - onready = function() { - _t._iO = _mixin(oOptions, _t._iO); - _t.play(_t._iO); - }; - if (_t.isHTML5 && !_t._html5_canplay) { - _t.load({ - _oncanplay: onready - }); - return false; - } else if (!_t.isHTML5 && !_t.loaded && (!_t.readyState || _t.readyState !== 2)) { - _t.load({ - onload: onready - }); - return false; - } - _t._iO = _applyFromTo(); - } - if (!_t.instanceCount || _t._iO.multiShotEvents || (!_t.isHTML5 && _fV > 8 && !_t.getAutoPlay())) { - _t.instanceCount++; - } - if (_t.playState === 0 && _t._iO.onposition) { - _attachOnPosition(_t); - } - _t.playState = 1; - _t.paused = false; - _t.position = (typeof _t._iO.position !== 'undefined' && !isNaN(_t._iO.position) ? _t._iO.position : 0); - if (!_t.isHTML5) { - _t._iO = _policyFix(_loopFix(_t._iO)); - } - if (_t._iO.onplay && _updatePlayState) { - _t._iO.onplay.apply(_t); - _onplay_called = true; - } - _t.setVolume(_t._iO.volume, true); - _t.setPan(_t._iO.pan, true); - if (!_t.isHTML5) { - _flash._start(_t.sID, _t._iO.loops || 1, (_fV === 9?_t._iO.position:_t._iO.position / 1000)); - } else { - _start_html5_timer(); - a = _t._setup_html5(); - _t.setPosition(_t._iO.position); - a.play(); - } - } - return _t; - }; - this.start = this.play; - this.stop = function(bAll) { - var _iO = _t._iO, _oP; - if (_t.playState === 1) { - _t._onbufferchange(0); - _t._resetOnPosition(0); - _t.paused = false; - if (!_t.isHTML5) { - _t.playState = 0; - } - _detachOnPosition(); - if (_iO.to) { - _t.clearOnPosition(_iO.to); - } - if (!_t.isHTML5) { - _flash._stop(_t.sID, bAll); - if (_iO.serverURL) { - _t.unload(); - } - } else { - if (_t._a) { - _oP = _t.position; - _t.setPosition(0); - _t.position = _oP; - _t._a.pause(); - _t.playState = 0; - _t._onTimer(); - _stop_html5_timer(); - } - } - _t.instanceCount = 0; - _t._iO = {}; - if (_iO.onstop) { - _iO.onstop.apply(_t); - } - } - return _t; - }; - this.setAutoPlay = function(autoPlay) { - _t._iO.autoPlay = autoPlay; - if (!_t.isHTML5) { - _flash._setAutoPlay(_t.sID, autoPlay); - if (autoPlay) { - if (!_t.instanceCount && _t.readyState === 1) { - _t.instanceCount++; - } - } - } - }; - this.getAutoPlay = function() { - return _t._iO.autoPlay; - }; - this.setPosition = function(nMsecOffset) { - if (nMsecOffset === undefined) { - nMsecOffset = 0; - } - var original_pos, - position, position1K, - offset = (_t.isHTML5 ? Math.max(nMsecOffset,0) : Math.min(_t.duration || _t._iO.duration, Math.max(nMsecOffset, 0))); - original_pos = _t.position; - _t.position = offset; - position1K = _t.position/1000; - _t._resetOnPosition(_t.position); - _t._iO.position = offset; - if (!_t.isHTML5) { - position = (_fV === 9 ? _t.position : position1K); - if (_t.readyState && _t.readyState !== 2) { - _flash._setPosition(_t.sID, position, (_t.paused || !_t.playState)); - } - } else if (_t._a) { - if (_t._html5_canplay) { - if (_t._a.currentTime !== position1K) { - try { - _t._a.currentTime = position1K; - if (_t.playState === 0 || _t.paused) { - _t._a.pause(); - } - } catch(e) { - } - } - } else { - } - } - if (_t.isHTML5) { - if (_t.paused) { - _t._onTimer(true); - } - } - return _t; - }; - this.pause = function(_bCallFlash) { - if (_t.paused || (_t.playState === 0 && _t.readyState !== 1)) { - return _t; - } - _t.paused = true; - if (!_t.isHTML5) { - if (_bCallFlash || _bCallFlash === undefined) { - _flash._pause(_t.sID); - } - } else { - _t._setup_html5().pause(); - _stop_html5_timer(); - } - if (_t._iO.onpause) { - _t._iO.onpause.apply(_t); - } - return _t; - }; - this.resume = function() { - var _iO = _t._iO; - if (!_t.paused) { - return _t; - } - _t.paused = false; - _t.playState = 1; - if (!_t.isHTML5) { - if (_iO.isMovieStar && !_iO.serverURL) { - _t.setPosition(_t.position); - } - _flash._pause(_t.sID); - } else { - _t._setup_html5().play(); - _start_html5_timer(); - } - if (_onplay_called && _iO.onplay) { - _iO.onplay.apply(_t); - _onplay_called = true; - } else if (_iO.onresume) { - _iO.onresume.apply(_t); - } - return _t; - }; - this.togglePause = function() { - if (_t.playState === 0) { - _t.play({ - position: (_fV === 9 && !_t.isHTML5 ? _t.position : _t.position / 1000) - }); - return _t; - } - if (_t.paused) { - _t.resume(); - } else { - _t.pause(); - } - return _t; - }; - this.setPan = function(nPan, bInstanceOnly) { - if (typeof nPan === 'undefined') { - nPan = 0; - } - if (typeof bInstanceOnly === 'undefined') { - bInstanceOnly = false; - } - if (!_t.isHTML5) { - _flash._setPan(_t.sID, nPan); - } - _t._iO.pan = nPan; - if (!bInstanceOnly) { - _t.pan = nPan; - _t.options.pan = nPan; - } - return _t; - }; - this.setVolume = function(nVol, _bInstanceOnly) { - if (typeof nVol === 'undefined') { - nVol = 100; - } - if (typeof _bInstanceOnly === 'undefined') { - _bInstanceOnly = false; - } - if (!_t.isHTML5) { - _flash._setVolume(_t.sID, (_s.muted && !_t.muted) || _t.muted?0:nVol); - } else if (_t._a) { - _t._a.volume = Math.max(0, Math.min(1, nVol/100)); - } - _t._iO.volume = nVol; - if (!_bInstanceOnly) { - _t.volume = nVol; - _t.options.volume = nVol; - } - return _t; - }; - this.mute = function() { - _t.muted = true; - if (!_t.isHTML5) { - _flash._setVolume(_t.sID, 0); - } else if (_t._a) { - _t._a.muted = true; - } - return _t; - }; - this.unmute = function() { - _t.muted = false; - var hasIO = typeof _t._iO.volume !== 'undefined'; - if (!_t.isHTML5) { - _flash._setVolume(_t.sID, hasIO?_t._iO.volume:_t.options.volume); - } else if (_t._a) { - _t._a.muted = false; - } - return _t; - }; - this.toggleMute = function() { - return (_t.muted?_t.unmute():_t.mute()); - }; - this.onPosition = function(nPosition, oMethod, oScope) { - _onPositionItems.push({ - position: nPosition, - method: oMethod, - scope: (typeof oScope !== 'undefined' ? oScope : _t), - fired: false - }); - return _t; - }; - this.onposition = this.onPosition; - this.clearOnPosition = function(nPosition, oMethod) { - var i; - nPosition = parseInt(nPosition, 10); - if (isNaN(nPosition)) { - return false; - } - for (i=0; i < _onPositionItems.length; i++) { - if (nPosition === _onPositionItems[i].position) { - if (!oMethod || (oMethod === _onPositionItems[i].method)) { - if (_onPositionItems[i].fired) { - _onPositionFired--; - } - _onPositionItems.splice(i, 1); - } - } - } - }; - this._processOnPosition = function() { - var i, item, j = _onPositionItems.length; - if (!j || !_t.playState || _onPositionFired >= j) { - return false; - } - for (i=j; i--;) { - item = _onPositionItems[i]; - if (!item.fired && _t.position >= item.position) { - item.fired = true; - _onPositionFired++; - item.method.apply(item.scope, [item.position]); - } - } - return true; - }; - this._resetOnPosition = function(nPosition) { - var i, item, j = _onPositionItems.length; - if (!j) { - return false; - } - for (i=j; i--;) { - item = _onPositionItems[i]; - if (item.fired && nPosition <= item.position) { - item.fired = false; - _onPositionFired--; - } - } - return true; - }; - _applyFromTo = function() { - var _iO = _t._iO, - f = _iO.from, - t = _iO.to, - start, end; - end = function() { - _t.clearOnPosition(t, end); - _t.stop(); - }; - start = function() { - if (t !== null && !isNaN(t)) { - _t.onPosition(t, end); - } - }; - if (f !== null && !isNaN(f)) { - _iO.position = f; - _iO.multiShot = false; - start(); - } - return _iO; - }; - _attachOnPosition = function() { - var op = _t._iO.onposition; - if (op) { - var item; - for (item in op) { - if (op.hasOwnProperty(item)) { - _t.onPosition(parseInt(item, 10), op[item]); - } - } - } - }; - _detachOnPosition = function() { - var op = _t._iO.onposition; - if (op) { - var item; - for (item in op) { - if (op.hasOwnProperty(item)) { - _t.clearOnPosition(parseInt(item, 10)); - } - } - } - }; - _start_html5_timer = function() { - if (_t.isHTML5) { - _startTimer(_t); - } - }; - _stop_html5_timer = function() { - if (_t.isHTML5) { - _stopTimer(_t); - } - }; - _resetProperties = function() { - _onPositionItems = []; - _onPositionFired = 0; - _onplay_called = false; - _t._hasTimer = null; - _t._a = null; - _t._html5_canplay = false; - _t.bytesLoaded = null; - _t.bytesTotal = null; - _t.duration = (_t._iO && _t._iO.duration ? _t._iO.duration : null); - _t.durationEstimate = null; - _t.eqData = []; - _t.eqData.left = []; - _t.eqData.right = []; - _t.failures = 0; - _t.isBuffering = false; - _t.instanceOptions = {}; - _t.instanceCount = 0; - _t.loaded = false; - _t.metadata = {}; - _t.readyState = 0; - _t.muted = false; - _t.paused = false; - _t.peakData = { - left: 0, - right: 0 - }; - _t.waveformData = { - left: [], - right: [] - }; - _t.playState = 0; - _t.position = null; - }; - _resetProperties(); - this._onTimer = function(bForce) { - var duration, isNew = false, time, x = {}; - if (_t._hasTimer || bForce) { - if (_t._a && (bForce || ((_t.playState > 0 || _t.readyState === 1) && !_t.paused))) { - duration = _t._get_html5_duration(); - if (duration !== _lastHTML5State.duration) { - _lastHTML5State.duration = duration; - _t.duration = duration; - isNew = true; - } - _t.durationEstimate = _t.duration; - time = (_t._a.currentTime * 1000 || 0); - if (time !== _lastHTML5State.time) { - _lastHTML5State.time = time; - isNew = true; - } - if (isNew || bForce) { - _t._whileplaying(time,x,x,x,x); - } - return isNew; - } else { - return false; - } - } - }; - this._get_html5_duration = function() { - var _iO = _t._iO, - d = (_t._a ? _t._a.duration*1000 : (_iO ? _iO.duration : undefined)), - result = (d && !isNaN(d) && d !== Infinity ? d : (_iO ? _iO.duration : null)); - return result; - }; - this._setup_html5 = function(oOptions) { - var _iO = _mixin(_t._iO, oOptions), d = decodeURI, - _a = _useGlobalHTML5Audio ? _s._global_a : _t._a, - _dURL = d(_iO.url), - _oldIO = (_a && _a._t ? _a._t.instanceOptions : null); - if (_a) { - if (_a._t) { - if (!_useGlobalHTML5Audio && _dURL === d(_lastURL)) { - return _a; - } else if (_useGlobalHTML5Audio && _oldIO.url === _iO.url && (!_lastURL || (_lastURL === _oldIO.url))) { - return _a; - } - } - if (_useGlobalHTML5Audio && _a._t && _a._t.playState && _iO.url !== _oldIO.url) { - _a._t.stop(); - } - _resetProperties(); - _a.src = _iO.url; - _t.url = _iO.url; - _lastURL = _iO.url; - _a._called_load = false; - } else { - _a = new Audio(_iO.url); - _a._called_load = false; - if (_is_android) { - _a._called_load = true; - } - if (_useGlobalHTML5Audio) { - _s._global_a = _a; - } - } - _t.isHTML5 = true; - _t._a = _a; - _a._t = _t; - _add_html5_events(); - _a.loop = (_iO.loops>1?'loop':''); - if (_iO.autoLoad || _iO.autoPlay) { - _t.load(); - } else { - _a.autobuffer = false; - _a.preload = 'none'; - } - _a.loop = (_iO.loops > 1 ? 'loop' : ''); - return _a; - }; - _add_html5_events = function() { - if (_t._a._added_events) { - return false; - } - var f; - function add(oEvt, oFn, bCapture) { - return _t._a ? _t._a.addEventListener(oEvt, oFn, bCapture||false) : null; - } - _t._a._added_events = true; - for (f in _html5_events) { - if (_html5_events.hasOwnProperty(f)) { - add(f, _html5_events[f]); - } - } - return true; - }; - _remove_html5_events = function() { - var f; - function remove(oEvt, oFn, bCapture) { - return (_t._a ? _t._a.removeEventListener(oEvt, oFn, bCapture||false) : null); - } - _t._a._added_events = false; - for (f in _html5_events) { - if (_html5_events.hasOwnProperty(f)) { - remove(f, _html5_events[f]); - } - } - }; - this._onload = function(nSuccess) { - var fN, loadOK = !!(nSuccess); - _t.loaded = loadOK; - _t.readyState = loadOK?3:2; - _t._onbufferchange(0); - if (_t._iO.onload) { - _t._iO.onload.apply(_t, [loadOK]); - } - return true; - }; - this._onbufferchange = function(nIsBuffering) { - if (_t.playState === 0) { - return false; - } - if ((nIsBuffering && _t.isBuffering) || (!nIsBuffering && !_t.isBuffering)) { - return false; - } - _t.isBuffering = (nIsBuffering === 1); - if (_t._iO.onbufferchange) { - _t._iO.onbufferchange.apply(_t); - } - return true; - }; - this._onsuspend = function() { - if (_t._iO.onsuspend) { - _t._iO.onsuspend.apply(_t); - } - return true; - }; - this._onfailure = function(msg, level, code) { - _t.failures++; - if (_t._iO.onfailure && _t.failures === 1) { - _t._iO.onfailure(_t, msg, level, code); - } else { - } - }; - this._onfinish = function() { - var _io_onfinish = _t._iO.onfinish; - _t._onbufferchange(0); - _t._resetOnPosition(0); - if (_t.instanceCount) { - _t.instanceCount--; - if (!_t.instanceCount) { - _detachOnPosition(); - _t.playState = 0; - _t.paused = false; - _t.instanceCount = 0; - _t.instanceOptions = {}; - _t._iO = {}; - _stop_html5_timer(); - } - if (!_t.instanceCount || _t._iO.multiShotEvents) { - if (_io_onfinish) { - _io_onfinish.apply(_t); - } - } - } - }; - this._whileloading = function(nBytesLoaded, nBytesTotal, nDuration, nBufferLength) { - var _iO = _t._iO; - _t.bytesLoaded = nBytesLoaded; - _t.bytesTotal = nBytesTotal; - _t.duration = Math.floor(nDuration); - _t.bufferLength = nBufferLength; - if (!_iO.isMovieStar) { - if (_iO.duration) { - _t.durationEstimate = (_t.duration > _iO.duration) ? _t.duration : _iO.duration; - } else { - _t.durationEstimate = parseInt((_t.bytesTotal / _t.bytesLoaded) * _t.duration, 10); - } - if (_t.durationEstimate === undefined) { - _t.durationEstimate = _t.duration; - } - if (_t.readyState !== 3 && _iO.whileloading) { - _iO.whileloading.apply(_t); - } - } else { - _t.durationEstimate = _t.duration; - if (_t.readyState !== 3 && _iO.whileloading) { - _iO.whileloading.apply(_t); - } - } - }; - this._whileplaying = function(nPosition, oPeakData, oWaveformDataLeft, oWaveformDataRight, oEQData) { - var _iO = _t._iO; - if (isNaN(nPosition) || nPosition === null) { - return false; - } - _t.position = nPosition; - _t._processOnPosition(); - if (!_t.isHTML5 && _fV > 8) { - if (_iO.usePeakData && typeof oPeakData !== 'undefined' && oPeakData) { - _t.peakData = { - left: oPeakData.leftPeak, - right: oPeakData.rightPeak - }; - } - if (_iO.useWaveformData && typeof oWaveformDataLeft !== 'undefined' && oWaveformDataLeft) { - _t.waveformData = { - left: oWaveformDataLeft.split(','), - right: oWaveformDataRight.split(',') - }; - } - if (_iO.useEQData) { - if (typeof oEQData !== 'undefined' && oEQData && oEQData.leftEQ) { - var eqLeft = oEQData.leftEQ.split(','); - _t.eqData = eqLeft; - _t.eqData.left = eqLeft; - if (typeof oEQData.rightEQ !== 'undefined' && oEQData.rightEQ) { - _t.eqData.right = oEQData.rightEQ.split(','); - } - } - } - } - if (_t.playState === 1) { - if (!_t.isHTML5 && _fV === 8 && !_t.position && _t.isBuffering) { - _t._onbufferchange(0); - } - if (_iO.whileplaying) { - _iO.whileplaying.apply(_t); - } - } - return true; - }; - this._onmetadata = function(oMDProps, oMDData) { - var oData = {}, i, j; - for (i = 0, j = oMDProps.length; i < j; i++) { - oData[oMDProps[i]] = oMDData[i]; - } - _t.metadata = oData; - if (_t._iO.onmetadata) { - _t._iO.onmetadata.apply(_t); - } - }; - this._onid3 = function(oID3Props, oID3Data) { - var oData = [], i, j; - for (i = 0, j = oID3Props.length; i < j; i++) { - oData[oID3Props[i]] = oID3Data[i]; - } - _t.id3 = _mixin(_t.id3, oData); - if (_t._iO.onid3) { - _t._iO.onid3.apply(_t); - } - }; - this._onconnect = function(bSuccess) { - bSuccess = (bSuccess === 1); - _t.connected = bSuccess; - if (bSuccess) { - _t.failures = 0; - if (_idCheck(_t.sID)) { - if (_t.getAutoPlay()) { - _t.play(undefined, _t.getAutoPlay()); - } else if (_t._iO.autoLoad) { - _t.load(); - } - } - if (_t._iO.onconnect) { - _t._iO.onconnect.apply(_t, [bSuccess]); - } - } - }; - this._ondataerror = function(sError) { - if (_t.playState > 0) { - if (_t._iO.ondataerror) { - _t._iO.ondataerror.apply(_t); - } - } - }; - }; - _getDocument = function() { - return (_doc.body || _doc._docElement || _doc.getElementsByTagName('div')[0]); - }; - _id = function(sID) { - return _doc.getElementById(sID); - }; - _mixin = function(oMain, oAdd) { - var o1 = {}, i, o2, o; - for (i in oMain) { - if (oMain.hasOwnProperty(i)) { - o1[i] = oMain[i]; - } - } - o2 = (typeof oAdd === 'undefined'?_s.defaultOptions:oAdd); - for (o in o2) { - if (o2.hasOwnProperty(o) && typeof o1[o] === 'undefined') { - o1[o] = o2[o]; - } - } - return o1; - }; - _event = (function() { - var old = (_win.attachEvent), - evt = { - add: (old?'attachEvent':'addEventListener'), - remove: (old?'detachEvent':'removeEventListener') - }; - function getArgs(oArgs) { - var args = _slice.call(oArgs), len = args.length; - if (old) { - args[1] = 'on' + args[1]; - if (len > 3) { - args.pop(); - } - } else if (len === 3) { - args.push(false); - } - return args; - } - function apply(args, sType) { - var element = args.shift(), - method = [evt[sType]]; - if (old) { - element[method](args[0], args[1]); - } else { - element[method].apply(element, args); - } - } - function add() { - apply(getArgs(arguments), 'add'); - } - function remove() { - apply(getArgs(arguments), 'remove'); - } - return { - 'add': add, - 'remove': remove - }; - }()); - function _html5_event(oFn) { - return function(e) { - var t = this._t; - if (!t || !t._a) { - return null; - } else { - return oFn.call(this, e); - } - }; - } - _html5_events = { - abort: _html5_event(function(e) { - }), - canplay: _html5_event(function(e) { - var t = this._t; - if (t._html5_canplay) { - return true; - } - t._html5_canplay = true; - t._onbufferchange(0); - var position1K = (!isNaN(t.position)?t.position/1000:null); - if (t.position && this.currentTime !== position1K) { - try { - this.currentTime = position1K; - } catch(ee) { - } - } - if (t._iO._oncanplay) { - t._iO._oncanplay(); - } - }), - load: _html5_event(function(e) { - var t = this._t; - if (!t.loaded) { - t._onbufferchange(0); - t._whileloading(t.bytesTotal, t.bytesTotal, t._get_html5_duration()); - t._onload(true); - } - }), - emptied: _html5_event(function(e) { - }), - ended: _html5_event(function(e) { - var t = this._t; - t._onfinish(); - }), - error: _html5_event(function(e) { - this._t._onload(false); - }), - loadeddata: _html5_event(function(e) { - var t = this._t, - bytesTotal = t.bytesTotal || 1; - if (!t._loaded && !_isSafari) { - t.duration = t._get_html5_duration(); - t._whileloading(bytesTotal, bytesTotal, t._get_html5_duration()); - t._onload(true); - } - }), - loadedmetadata: _html5_event(function(e) { - }), - loadstart: _html5_event(function(e) { - this._t._onbufferchange(1); - }), - play: _html5_event(function(e) { - this._t._onbufferchange(0); - }), - playing: _html5_event(function(e) { - this._t._onbufferchange(0); - }), - progress: _html5_event(function(e) { - var t = this._t; - if (t.loaded) { - return false; - } - var i, j, str, buffered = 0, - isProgress = (e.type === 'progress'), - ranges = e.target.buffered, - loaded = (e.loaded||0), - total = (e.total||1); - if (ranges && ranges.length) { - for (i=ranges.length; i--;) { - buffered = (ranges.end(i) - ranges.start(i)); - } - loaded = buffered/e.target.duration; - } - if (!isNaN(loaded)) { - t._onbufferchange(0); - t._whileloading(loaded, total, t._get_html5_duration()); - if (loaded && total && loaded === total) { - _html5_events.load.call(this, e); - } - } - }), - ratechange: _html5_event(function(e) { - }), - suspend: _html5_event(function(e) { - var t = this._t; - _html5_events.progress.call(this, e); - t._onsuspend(); - }), - stalled: _html5_event(function(e) { - }), - timeupdate: _html5_event(function(e) { - this._t._onTimer(); - }), - waiting: _html5_event(function(e) { - var t = this._t; - t._onbufferchange(1); - }) - }; - _html5OK = function(iO) { - return (!iO.serverURL && (iO.type?_html5CanPlay({type:iO.type}):_html5CanPlay({url:iO.url})||_s.html5Only)); - }; - _html5Unload = function(oAudio) { - if (oAudio) { - oAudio.src = (_is_firefox ? '' : _emptyURL); - } - }; - _html5CanPlay = function(o) { - if (!_s.useHTML5Audio || !_s.hasHTML5) { - return false; - } - var url = (o.url || null), - mime = (o.type || null), - aF = _s.audioFormats, - result, - offset, - fileExt, - item; - function preferFlashCheck(kind) { - return (_s.preferFlash && _hasFlash && !_s.ignoreFlash && (typeof _s.flash[kind] !== 'undefined' && _s.flash[kind])); - } - if (mime && _s.html5[mime] !== 'undefined') { - return (_s.html5[mime] && !preferFlashCheck(mime)); - } - if (!_html5Ext) { - _html5Ext = []; - for (item in aF) { - if (aF.hasOwnProperty(item)) { - _html5Ext.push(item); - if (aF[item].related) { - _html5Ext = _html5Ext.concat(aF[item].related); - } - } - } - _html5Ext = new RegExp('\\.('+_html5Ext.join('|')+')(\\?.*)?$','i'); - } - fileExt = (url ? url.toLowerCase().match(_html5Ext) : null); - if (!fileExt || !fileExt.length) { - if (!mime) { - return false; - } else { - offset = mime.indexOf(';'); - fileExt = (offset !== -1?mime.substr(0,offset):mime).substr(6); - } - } else { - fileExt = fileExt[1]; - } - if (fileExt && typeof _s.html5[fileExt] !== 'undefined') { - return (_s.html5[fileExt] && !preferFlashCheck(fileExt)); - } else { - mime = 'audio/'+fileExt; - result = _s.html5.canPlayType({type:mime}); - _s.html5[fileExt] = result; - return (result && _s.html5[mime] && !preferFlashCheck(mime)); - } - }; - _testHTML5 = function() { - if (!_s.useHTML5Audio || typeof Audio === 'undefined') { - return false; - } - var a = (typeof Audio !== 'undefined' ? (_isOpera ? new Audio(null) : new Audio()) : null), - item, support = {}, aF, i; - function _cp(m) { - var canPlay, i, j, isOK = false; - if (!a || typeof a.canPlayType !== 'function') { - return false; - } - if (m instanceof Array) { - for (i=0, j=m.length; i 1 && sOpt.stream) { - sOpt.stream = false; - } - return sOpt; - }; - _policyFix = function(sOpt, sPre) { - if (sOpt && !sOpt.usePolicyFile && (sOpt.onid3 || sOpt.usePeakData || sOpt.useWaveformData || sOpt.useEQData)) { - sOpt.usePolicyFile = true; - } - return sOpt; - }; - _complain = function(sMsg) { - }; - _doNothing = function() { - return false; - }; - _disableObject = function(o) { - var oProp; - for (oProp in o) { - if (o.hasOwnProperty(oProp) && typeof o[oProp] === 'function') { - o[oProp] = _doNothing; - } - } - oProp = null; - }; - _failSafely = function(bNoDisable) { - if (typeof bNoDisable === 'undefined') { - bNoDisable = false; - } - if (_disabled || bNoDisable) { - _s.disable(bNoDisable); - } - }; - _normalizeMovieURL = function(smURL) { - var urlParams = null, url; - if (smURL) { - if (smURL.match(/\.swf(\?.*)?$/i)) { - urlParams = smURL.substr(smURL.toLowerCase().lastIndexOf('.swf?') + 4); - if (urlParams) { - return smURL; - } - } else if (smURL.lastIndexOf('/') !== smURL.length - 1) { - smURL += '/'; - } - } - url = (smURL && smURL.lastIndexOf('/') !== - 1 ? smURL.substr(0, smURL.lastIndexOf('/') + 1) : './') + _s.movieURL; - if (_s.noSWFCache) { - url += ('?ts=' + new Date().getTime()); - } - return url; - }; - _setVersionInfo = function() { - _fV = parseInt(_s.flashVersion, 10); - if (_fV !== 8 && _fV !== 9) { - _s.flashVersion = _fV = _defaultFlashVersion; - } - var isDebug = (_s.debugMode || _s.debugFlash?'_debug.swf':'.swf'); - if (_s.useHTML5Audio && !_s.html5Only && _s.audioFormats.mp4.required && _fV < 9) { - _s.flashVersion = _fV = 9; - } - _s.version = _s.versionNumber + (_s.html5Only?' (HTML5-only mode)':(_fV === 9?' (AS3/Flash 9)':' (AS2/Flash 8)')); - if (_fV > 8) { - _s.defaultOptions = _mixin(_s.defaultOptions, _s.flash9Options); - _s.features.buffering = true; - _s.defaultOptions = _mixin(_s.defaultOptions, _s.movieStarOptions); - _s.filePatterns.flash9 = new RegExp('\\.(mp3|' + _netStreamTypes.join('|') + ')(\\?.*)?$', 'i'); - _s.features.movieStar = true; - } else { - _s.features.movieStar = false; - } - _s.filePattern = _s.filePatterns[(_fV !== 8?'flash9':'flash8')]; - _s.movieURL = (_fV === 8?'soundmanager2.swf':'soundmanager2_flash9.swf').replace('.swf', isDebug); - _s.features.peakData = _s.features.waveformData = _s.features.eqData = (_fV > 8); - }; - _setPolling = function(bPolling, bHighPerformance) { - if (!_flash) { - return false; - } - _flash._setPolling(bPolling, bHighPerformance); - }; - _initDebug = function() { - if (_s.debugURLParam.test(_wl)) { - _s.debugMode = true; - } - }; - _idCheck = this.getSoundById; - _getSWFCSS = function() { - var css = []; - if (_s.debugMode) { - css.push(_swfCSS.sm2Debug); - } - if (_s.debugFlash) { - css.push(_swfCSS.flashDebug); - } - if (_s.useHighPerformance) { - css.push(_swfCSS.highPerf); - } - return css.join(' '); - }; - _flashBlockHandler = function() { - var name = _str('fbHandler'), - p = _s.getMoviePercent(), - css = _swfCSS, - error = {type:'FLASHBLOCK'}; - if (_s.html5Only) { - return false; - } - if (!_s.ok()) { - if (_needsFlash) { - _s.oMC.className = _getSWFCSS() + ' ' + css.swfDefault + ' ' + (p === null?css.swfTimedout:css.swfError); - } - _s.didFlashBlock = true; - _processOnEvents({type:'ontimeout', ignoreInit:true, error:error}); - _catchError(error); - } else { - if (_s.oMC) { - _s.oMC.className = [_getSWFCSS(), css.swfDefault, css.swfLoaded + (_s.didFlashBlock?' '+css.swfUnblocked:'')].join(' '); - } - } - }; - _addOnEvent = function(sType, oMethod, oScope) { - if (typeof _on_queue[sType] === 'undefined') { - _on_queue[sType] = []; - } - _on_queue[sType].push({ - 'method': oMethod, - 'scope': (oScope || null), - 'fired': false - }); - }; - _processOnEvents = function(oOptions) { - if (!oOptions) { - oOptions = { - type: 'onready' - }; - } - if (!_didInit && oOptions && !oOptions.ignoreInit) { - return false; - } - if (oOptions.type === 'ontimeout' && _s.ok()) { - return false; - } - var status = { - success: (oOptions && oOptions.ignoreInit?_s.ok():!_disabled) - }, - srcQueue = (oOptions && oOptions.type?_on_queue[oOptions.type]||[]:[]), - queue = [], i, j, - args = [status], - canRetry = (_needsFlash && _s.useFlashBlock && !_s.ok()); - if (oOptions.error) { - args[0].error = oOptions.error; - } - for (i = 0, j = srcQueue.length; i < j; i++) { - if (srcQueue[i].fired !== true) { - queue.push(srcQueue[i]); - } - } - if (queue.length) { - for (i = 0, j = queue.length; i < j; i++) { - if (queue[i].scope) { - queue[i].method.apply(queue[i].scope, args); - } else { - queue[i].method.apply(this, args); - } - if (!canRetry) { - queue[i].fired = true; - } - } - } - return true; - }; - _initUserOnload = function() { - _win.setTimeout(function() { - if (_s.useFlashBlock) { - _flashBlockHandler(); - } - _processOnEvents(); - if (_s.onload instanceof Function) { - _s.onload.apply(_win); - } - if (_s.waitForWindowLoad) { - _event.add(_win, 'load', _initUserOnload); - } - },1); - }; - _detectFlash = function() { - if (_hasFlash !== undefined) { - return _hasFlash; - } - var hasPlugin = false, n = navigator, nP = n.plugins, obj, type, types, AX = _win.ActiveXObject; - if (nP && nP.length) { - type = 'application/x-shockwave-flash'; - types = n.mimeTypes; - if (types && types[type] && types[type].enabledPlugin && types[type].enabledPlugin.description) { - hasPlugin = true; - } - } else if (typeof AX !== 'undefined') { - try { - obj = new AX('ShockwaveFlash.ShockwaveFlash'); - } catch(e) { - } - hasPlugin = (!!obj); - } - _hasFlash = hasPlugin; - return hasPlugin; - }; - _featureCheck = function() { - var needsFlash, item, - isSpecial = (_is_iDevice && !!(_ua.match(/os (1|2|3_0|3_1)/i))); - if (isSpecial) { - _s.hasHTML5 = false; - _s.html5Only = true; - if (_s.oMC) { - _s.oMC.style.display = 'none'; - } - return false; - } - if (_s.useHTML5Audio) { - if (!_s.html5 || !_s.html5.canPlayType) { - _s.hasHTML5 = false; - return true; - } else { - _s.hasHTML5 = true; - } - if (_isBadSafari) { - if (_detectFlash()) { - return true; - } - } - } else { - return true; - } - for (item in _s.audioFormats) { - if (_s.audioFormats.hasOwnProperty(item)) { - if ((_s.audioFormats[item].required && !_s.html5.canPlayType(_s.audioFormats[item].type)) || _s.flash[item] || _s.flash[_s.audioFormats[item].type]) { - needsFlash = true; - } - } - } - if (_s.ignoreFlash) { - needsFlash = false; - } - _s.html5Only = (_s.hasHTML5 && _s.useHTML5Audio && !needsFlash); - return (!_s.html5Only); - }; - _parseURL = function(url) { - var i, j, result = 0; - if (url instanceof Array) { - for (i=0, j=url.length; i'; - } - _setVersionInfo(); - _s.url = _normalizeMovieURL(_overHTTP?remoteURL:localURL); - smURL = _s.url; - _s.wmode = (!_s.wmode && _s.useHighPerformance ? 'transparent' : _s.wmode); - if (_s.wmode !== null && (_ua.match(/msie 8/i) || (!_isIE && !_s.useHighPerformance)) && navigator.platform.match(/win32|win64/i)) { - _s.wmode = null; - } - oEmbed = { - 'name': smID, - 'id': smID, - 'src': smURL, - 'width': side, - 'height': side, - 'quality': 'high', - 'allowScriptAccess': _s.allowScriptAccess, - 'bgcolor': _s.bgColor, - 'pluginspage': _http+'www.macromedia.com/go/getflashplayer', - 'title': swfTitle, - 'type': 'application/x-shockwave-flash', - 'wmode': _s.wmode, - 'hasPriority': 'true' - }; - if (_s.debugFlash) { - oEmbed.FlashVars = 'debug=1'; - } - if (!_s.wmode) { - delete oEmbed.wmode; - } - if (_isIE) { - oMovie = _doc.createElement('div'); - movieHTML = [ - '', - param('movie', smURL), - param('AllowScriptAccess', _s.allowScriptAccess), - param('quality', oEmbed.quality), - (_s.wmode? param('wmode', _s.wmode): ''), - param('bgcolor', _s.bgColor), - param('hasPriority', 'true'), - (_s.debugFlash ? param('FlashVars', oEmbed.FlashVars) : ''), - '' - ].join(''); - } else { - oMovie = _doc.createElement('embed'); - for (tmp in oEmbed) { - if (oEmbed.hasOwnProperty(tmp)) { - oMovie.setAttribute(tmp, oEmbed[tmp]); - } - } - } - _initDebug(); - extraClass = _getSWFCSS(); - oTarget = _getDocument(); - if (oTarget) { - _s.oMC = (_id(_s.movieID) || _doc.createElement('div')); - if (!_s.oMC.id) { - _s.oMC.id = _s.movieID; - _s.oMC.className = _swfCSS.swfDefault + ' ' + extraClass; - s = null; - oEl = null; - if (!_s.useFlashBlock) { - if (_s.useHighPerformance) { - s = { - 'position': 'fixed', - 'width': '8px', - 'height': '8px', - 'bottom': '0px', - 'left': '0px', - 'overflow': 'hidden' - }; - } else { - s = { - 'position': 'absolute', - 'width': '6px', - 'height': '6px', - 'top': '-9999px', - 'left': '-9999px' - }; - if (isRTL) { - s.left = Math.abs(parseInt(s.left,10))+'px'; - } - } - } - if (_isWebkit) { - _s.oMC.style.zIndex = 10000; - } - if (!_s.debugFlash) { - for (x in s) { - if (s.hasOwnProperty(x)) { - _s.oMC.style[x] = s[x]; - } - } - } - try { - if (!_isIE) { - _s.oMC.appendChild(oMovie); - } - oTarget.appendChild(_s.oMC); - if (_isIE) { - oEl = _s.oMC.appendChild(_doc.createElement('div')); - oEl.className = _swfCSS.swfBox; - oEl.innerHTML = movieHTML; - } - _appendSuccess = true; - } catch(e) { - throw new Error(_str('domError')+' \n'+e.toString()); - } - } else { - sClass = _s.oMC.className; - _s.oMC.className = (sClass?sClass+' ':_swfCSS.swfDefault) + (extraClass?' '+extraClass:''); - _s.oMC.appendChild(oMovie); - if (_isIE) { - oEl = _s.oMC.appendChild(_doc.createElement('div')); - oEl.className = _swfCSS.swfBox; - oEl.innerHTML = movieHTML; - } - _appendSuccess = true; - } - } - _didAppend = true; - _initMsg(); - return true; - }; - _initMovie = function() { - if (_s.html5Only) { - _createMovie(); - return false; - } - if (_flash) { - return false; - } - _flash = _s.getMovie(_s.id); - if (!_flash) { - if (!_oRemoved) { - _createMovie(_s.id, _s.url); - } else { - if (!_isIE) { - _s.oMC.appendChild(_oRemoved); - } else { - _s.oMC.innerHTML = _oRemovedHTML; - } - _oRemoved = null; - _didAppend = true; - } - _flash = _s.getMovie(_s.id); - } - if (_s.oninitmovie instanceof Function) { - setTimeout(_s.oninitmovie, 1); - } - return true; - }; - _delayWaitForEI = function() { - setTimeout(_waitForEI, 1000); - }; - _waitForEI = function() { - if (_waitingForEI) { - return false; - } - _waitingForEI = true; - _event.remove(_win, 'load', _delayWaitForEI); - if (_tryInitOnFocus && !_isFocused) { - return false; - } - var p; - if (!_didInit) { - p = _s.getMoviePercent(); - } - setTimeout(function() { - p = _s.getMoviePercent(); - if (!_didInit && _okToDisable) { - if (p === null) { - if (_s.useFlashBlock || _s.flashLoadTimeout === 0) { - if (_s.useFlashBlock) { - _flashBlockHandler(); - } - } else { - _failSafely(true); - } - } else { - if (_s.flashLoadTimeout === 0) { - } else { - _failSafely(true); - } - } - } - }, _s.flashLoadTimeout); - }; - _handleFocus = function() { - function cleanup() { - _event.remove(_win, 'focus', _handleFocus); - _event.remove(_win, 'load', _handleFocus); - } - if (_isFocused || !_tryInitOnFocus) { - cleanup(); - return true; - } - _okToDisable = true; - _isFocused = true; - if (_isSafari && _tryInitOnFocus) { - _event.remove(_win, 'mousemove', _handleFocus); - } - _waitingForEI = false; - cleanup(); - return true; - }; - _showSupport = function() { - var item, tests = []; - if (_s.useHTML5Audio && _s.hasHTML5) { - for (item in _s.audioFormats) { - if (_s.audioFormats.hasOwnProperty(item)) { - tests.push(item + ': ' + _s.html5[item] + (!_s.html5[item] && _hasFlash && _s.flash[item] ? ' (using flash)' : (_s.preferFlash && _s.flash[item] && _hasFlash ? ' (preferring flash)': (!_s.html5[item] ? ' (' + (_s.audioFormats[item].required ? 'required, ':'') + 'and no flash support)' : '')))); - } - } - } - }; - _initComplete = function(bNoDisable) { - if (_didInit) { - return false; - } - if (_s.html5Only) { - _didInit = true; - _initUserOnload(); - return true; - } - var wasTimeout = (_s.useFlashBlock && _s.flashLoadTimeout && !_s.getMoviePercent()), - error; - if (!wasTimeout) { - _didInit = true; - if (_disabled) { - error = {type: (!_hasFlash && _needsFlash ? 'NO_FLASH' : 'INIT_TIMEOUT')}; - } - } - if (_disabled || bNoDisable) { - if (_s.useFlashBlock && _s.oMC) { - _s.oMC.className = _getSWFCSS() + ' ' + (_s.getMoviePercent() === null?_swfCSS.swfTimedout:_swfCSS.swfError); - } - _processOnEvents({type:'ontimeout', error:error}); - _catchError(error); - return false; - } else { - } - if (_s.waitForWindowLoad && !_windowLoaded) { - _event.add(_win, 'load', _initUserOnload); - return false; - } else { - _initUserOnload(); - } - return true; - }; - _init = function() { - if (_didInit) { - return false; - } - function _cleanup() { - _event.remove(_win, 'load', _s.beginDelayedInit); - } - if (_s.html5Only) { - if (!_didInit) { - _cleanup(); - _s.enabled = true; - _initComplete(); - } - return true; - } - _initMovie(); - try { - _flash._externalInterfaceTest(false); - _setPolling(true, (_s.flashPollingInterval || (_s.useHighPerformance ? 10 : 50))); - if (!_s.debugMode) { - _flash._disableDebug(); - } - _s.enabled = true; - if (!_s.html5Only) { - _event.add(_win, 'unload', _doNothing); - } - } catch(e) { - _catchError({type:'JS_TO_FLASH_EXCEPTION', fatal:true}); - _failSafely(true); - _initComplete(); - return false; - } - _initComplete(); - _cleanup(); - return true; - }; - _domContentLoaded = function() { - if (_didDCLoaded) { - return false; - } - _didDCLoaded = true; - _initDebug(); - if (!_hasFlash && _s.hasHTML5) { - _s.useHTML5Audio = true; - _s.preferFlash = false; - } - _testHTML5(); - _s.html5.usingFlash = _featureCheck(); - _needsFlash = _s.html5.usingFlash; - _showSupport(); - if (!_hasFlash && _needsFlash) { - _s.flashLoadTimeout = 1; - } - if (_doc.removeEventListener) { - _doc.removeEventListener('DOMContentLoaded', _domContentLoaded, false); - } - _initMovie(); - return true; - }; - _domContentLoadedIE = function() { - if (_doc.readyState === 'complete') { - _domContentLoaded(); - _doc.detachEvent('onreadystatechange', _domContentLoadedIE); - } - return true; - }; - _winOnLoad = function() { - _windowLoaded = true; - _event.remove(_win, 'load', _winOnLoad); - }; - _detectFlash(); - _event.add(_win, 'focus', _handleFocus); - _event.add(_win, 'load', _handleFocus); - _event.add(_win, 'load', _delayWaitForEI); - _event.add(_win, 'load', _winOnLoad); - if (_isSafari && _tryInitOnFocus) { - _event.add(_win, 'mousemove', _handleFocus); - } - if (_doc.addEventListener) { - _doc.addEventListener('DOMContentLoaded', _domContentLoaded, false); - } else if (_doc.attachEvent) { - _doc.attachEvent('onreadystatechange', _domContentLoadedIE); - } else { - _catchError({type:'NO_DOM2_EVENTS', fatal:true}); - } - if (_doc.readyState === 'complete') { - setTimeout(_domContentLoaded,100); - } -} -// SM2_DEFER details: http://www.schillmania.com/projects/soundmanager2/doc/getstarted/#lazy-loading -if (typeof SM2_DEFER === 'undefined' || !SM2_DEFER) { - soundManager = new SoundManager(); -} -window.SoundManager = SoundManager; -window.soundManager = soundManager; -}(window)); \ No newline at end of file diff --git a/inc/MIDI.js/inc/SoundManager2/script/soundmanager2.js b/inc/MIDI.js/inc/SoundManager2/script/soundmanager2.js deleted file mode 100755 index 4b115c3..0000000 --- a/inc/MIDI.js/inc/SoundManager2/script/soundmanager2.js +++ /dev/null @@ -1,5019 +0,0 @@ -/** @license - * - * SoundManager 2: JavaScript Sound for the Web - * ---------------------------------------------- - * http://schillmania.com/projects/soundmanager2/ - * - * Copyright (c) 2007, Scott Schiller. All rights reserved. - * Code provided under the BSD License: - * http://schillmania.com/projects/soundmanager2/license.txt - * - * V2.97a.20111220 - */ - -/*global window, SM2_DEFER, sm2Debugger, console, document, navigator, setTimeout, setInterval, clearInterval, Audio */ -/* jslint regexp: true, sloppy: true, white: true, nomen: true, plusplus: true */ - -/** - * About this file - * --------------- - * This is the fully-commented source version of the SoundManager 2 API, - * recommended for use during development and testing. - * - * See soundmanager2-nodebug-jsmin.js for an optimized build (~10KB with gzip.) - * http://schillmania.com/projects/soundmanager2/doc/getstarted/#basic-inclusion - * Alternately, serve this file with gzip for 75% compression savings (~30KB over HTTP.) - * - * You may notice and comments in this source; these are delimiters for - * debug blocks which are removed in the -nodebug builds, further optimizing code size. - * - * Also, as you may note: Whoa, reliable cross-platform/device audio support is hard! ;) - */ - -(function(window) { - -var soundManager = null; - -/** - * The SoundManager constructor. - * - * @constructor - * @param {string} smURL Optional: Path to SWF files - * @param {string} smID Optional: The ID to use for the SWF container element - * @this {SoundManager} - * @return {SoundManager} The new SoundManager instance - */ - -function SoundManager(smURL, smID) { - // Top-level configuration options - - this.flashVersion = 8; // flash build to use (8 or 9.) Some API features require 9. - this.debugMode = true; // enable debugging output (console.log() with HTML fallback) - this.debugFlash = false; // enable debugging output inside SWF, troubleshoot Flash/browser issues - this.useConsole = true; // use console.log() if available (otherwise, writes to #soundmanager-debug element) - this.consoleOnly = true; // if console is being used, do not create/write to #soundmanager-debug - this.waitForWindowLoad = false; // force SM2 to wait for window.onload() before trying to call soundManager.onload() - this.bgColor = '#ffffff'; // SWF background color. N/A when wmode = 'transparent' - this.useHighPerformance = false; // position:fixed flash movie can help increase js/flash speed, minimize lag - this.flashPollingInterval = null; // msec affecting whileplaying/loading callback frequency. If null, default of 50 msec is used. - this.html5PollingInterval = null; // msec affecting whileplaying() for HTML5 audio, excluding mobile devices. If null, native HTML5 update events are used. - this.flashLoadTimeout = 1000; // msec to wait for flash movie to load before failing (0 = infinity) - this.wmode = null; // flash rendering mode - null, 'transparent', or 'opaque' (last two allow z-index to work) - this.allowScriptAccess = 'always'; // for scripting the SWF (object/embed property), 'always' or 'sameDomain' - this.useFlashBlock = false; // *requires flashblock.css, see demos* - allow recovery from flash blockers. Wait indefinitely and apply timeout CSS to SWF, if applicable. - this.useHTML5Audio = true; // use HTML5 Audio() where API is supported (most Safari, Chrome versions), Firefox (no MP3/MP4.) Ideally, transparent vs. Flash API where possible. - this.html5Test = /^(probably|maybe)$/i; // HTML5 Audio() format support test. Use /^probably$/i; if you want to be more conservative. - this.preferFlash = true; // overrides useHTML5audio. if true and flash support present, will try to use flash for MP3/MP4 as needed since HTML5 audio support is still quirky in browsers. - this.noSWFCache = false; // if true, appends ?ts={date} to break aggressive SWF caching. - - this.audioFormats = { - - /** - * determines HTML5 support + flash requirements. - * if no support (via flash and/or HTML5) for a "required" format, SM2 will fail to start. - * flash fallback is used for MP3 or MP4 if HTML5 can't play it (or if preferFlash = true) - * multiple MIME types may be tested while trying to get a positive canPlayType() response. - */ - - 'mp3': { - 'type': ['audio/mpeg; codecs="mp3"', 'audio/mpeg', 'audio/mp3', 'audio/MPA', 'audio/mpa-robust'], - 'required': true - }, - - 'mp4': { - 'related': ['aac','m4a'], // additional formats under the MP4 container - 'type': ['audio/mp4; codecs="mp4a.40.2"', 'audio/aac', 'audio/x-m4a', 'audio/MP4A-LATM', 'audio/mpeg4-generic'], - 'required': false - }, - - 'ogg': { - 'type': ['audio/ogg; codecs=vorbis'], - 'required': false - }, - - 'wav': { - 'type': ['audio/wav; codecs="1"', 'audio/wav', 'audio/wave', 'audio/x-wav'], - 'required': false - } - - }; - - this.defaultOptions = { - - /** - * the default configuration for sound objects made with createSound() and related methods - * eg., volume, auto-load behaviour and so forth - */ - - 'autoLoad': false, // enable automatic loading (otherwise .load() will be called on demand with .play(), the latter being nicer on bandwidth - if you want to .load yourself, you also can) - 'autoPlay': false, // enable playing of file as soon as possible (much faster if "stream" is true) - 'from': null, // position to start playback within a sound (msec), default = beginning - 'loops': 1, // how many times to repeat the sound (position will wrap around to 0, setPosition() will break out of loop when >0) - 'onid3': null, // callback function for "ID3 data is added/available" - 'onload': null, // callback function for "load finished" - 'whileloading': null, // callback function for "download progress update" (X of Y bytes received) - 'onplay': null, // callback for "play" start - 'onpause': null, // callback for "pause" - 'onresume': null, // callback for "resume" (pause toggle) - 'whileplaying': null, // callback during play (position update) - 'onposition': null, // object containing times and function callbacks for positions of interest - 'onstop': null, // callback for "user stop" - 'onfailure': null, // callback function for when playing fails - 'onfinish': null, // callback function for "sound finished playing" - 'multiShot': true, // let sounds "restart" or layer on top of each other when played multiple times, rather than one-shot/one at a time - 'multiShotEvents': false, // fire multiple sound events (currently onfinish() only) when multiShot is enabled - 'position': null, // offset (milliseconds) to seek to within loaded sound data. - 'pan': 0, // "pan" settings, left-to-right, -100 to 100 - 'stream': true, // allows playing before entire file has loaded (recommended) - 'to': null, // position to end playback within a sound (msec), default = end - 'type': null, // MIME-like hint for file pattern / canPlay() tests, eg. audio/mp3 - 'usePolicyFile': false, // enable crossdomain.xml request for audio on remote domains (for ID3/waveform access) - 'volume': 100 // self-explanatory. 0-100, the latter being the max. - - }; - - this.flash9Options = { - - /** - * flash 9-only options, - * merged into defaultOptions if flash 9 is being used - */ - - 'isMovieStar': null, // "MovieStar" MPEG4 audio mode. Null (default) = auto detect MP4, AAC etc. based on URL. true = force on, ignore URL - 'usePeakData': false, // enable left/right channel peak (level) data - 'useWaveformData': false, // enable sound spectrum (raw waveform data) - NOTE: May increase CPU load. - 'useEQData': false, // enable sound EQ (frequency spectrum data) - NOTE: May increase CPU load. - 'onbufferchange': null, // callback for "isBuffering" property change - 'ondataerror': null // callback for waveform/eq data access error (flash playing audio in other tabs/domains) - - }; - - this.movieStarOptions = { - - /** - * flash 9.0r115+ MPEG4 audio options, - * merged into defaultOptions if flash 9+movieStar mode is enabled - */ - - 'bufferTime': 3, // seconds of data to buffer before playback begins (null = flash default of 0.1 seconds - if AAC playback is gappy, try increasing.) - 'serverURL': null, // rtmp: FMS or FMIS server to connect to, required when requesting media via RTMP or one of its variants - 'onconnect': null, // rtmp: callback for connection to flash media server - 'duration': null // rtmp: song duration (msec) - - }; - - // HTML attributes (id + class names) for the SWF container - - this.movieID = 'sm2-container'; - this.id = (smID || 'sm2movie'); - - this.debugID = 'soundmanager-debug'; - this.debugURLParam = /([#?&])debug=1/i; - - // dynamic attributes - - this.versionNumber = 'V2.97a.20111220'; - this.version = null; - this.movieURL = null; - this.url = (smURL || null); - this.altURL = null; - this.swfLoaded = false; - this.enabled = false; - this.oMC = null; - this.sounds = {}; - this.soundIDs = []; - this.muted = false; - this.didFlashBlock = false; - this.filePattern = null; - - this.filePatterns = { - - 'flash8': /\.mp3(\?.*)?$/i, - 'flash9': /\.mp3(\?.*)?$/i - - }; - - // support indicators, set at init - - this.features = { - - 'buffering': false, - 'peakData': false, - 'waveformData': false, - 'eqData': false, - 'movieStar': false - - }; - - // flash sandbox info, used primarily in troubleshooting - - this.sandbox = { - - // - 'type': null, - 'types': { - 'remote': 'remote (domain-based) rules', - 'localWithFile': 'local with file access (no internet access)', - 'localWithNetwork': 'local with network (internet access only, no local access)', - 'localTrusted': 'local, trusted (local+internet access)' - }, - 'description': null, - 'noRemote': null, - 'noLocal': null - // - - }; - - /** - * basic HTML5 Audio() support test - * try...catch because of IE 9 "not implemented" nonsense - * https://github.com/Modernizr/Modernizr/issues/224 - */ - - this.hasHTML5 = (function() { - try { - return (typeof Audio !== 'undefined' && typeof new Audio().canPlayType !== 'undefined'); - } catch(e) { - return false; - } - }()); - - /** - * format support (html5/flash) - * stores canPlayType() results based on audioFormats. - * eg. { mp3: boolean, mp4: boolean } - * treat as read-only. - */ - - this.html5 = { - 'usingFlash': null // set if/when flash fallback is needed - }; - - this.flash = {}; // file type support hash - - this.html5Only = false; // determined at init time - this.ignoreFlash = false; // used for special cases (eg. iPad/iPhone/palm OS?) - - /** - * a few private internals (OK, a lot. :D) - */ - - var SMSound, - _s = this, _flash = null, _sm = 'soundManager', _smc = _sm+'::', _h5 = 'HTML5::', _id, _ua = navigator.userAgent, _win = window, _wl = _win.location.href.toString(), _doc = document, _doNothing, _init, _fV, _on_queue = [], _debugOpen = true, _debugTS, _didAppend = false, _appendSuccess = false, _didInit = false, _disabled = false, _windowLoaded = false, _wDS, _wdCount = 0, _initComplete, _mixin, _addOnEvent, _processOnEvents, _initUserOnload, _delayWaitForEI, _waitForEI, _setVersionInfo, _handleFocus, _strings, _initMovie, _domContentLoaded, _winOnLoad, _didDCLoaded, _getDocument, _createMovie, _catchError, _setPolling, _initDebug, _debugLevels = ['log', 'info', 'warn', 'error'], _defaultFlashVersion = 8, _disableObject, _failSafely, _normalizeMovieURL, _oRemoved = null, _oRemovedHTML = null, _str, _flashBlockHandler, _getSWFCSS, _swfCSS, _toggleDebug, _loopFix, _policyFix, _complain, _idCheck, _waitingForEI = false, _initPending = false, _smTimer, _onTimer, _startTimer, _stopTimer, _timerExecute, _h5TimerCount = 0, _h5IntervalTimer = null, _parseURL, - _needsFlash = null, _featureCheck, _html5OK, _html5CanPlay, _html5Ext, _html5Unload, _domContentLoadedIE, _testHTML5, _event, _slice = Array.prototype.slice, _useGlobalHTML5Audio = false, _hasFlash, _detectFlash, _badSafariFix, _html5_events, _showSupport, - _is_iDevice = _ua.match(/(ipad|iphone|ipod)/i), _is_firefox = _ua.match(/firefox/i), _is_android = _ua.match(/droid/i), _isIE = _ua.match(/msie/i), _isWebkit = _ua.match(/webkit/i), _isSafari = (_ua.match(/safari/i) && !_ua.match(/chrome/i)), _isOpera = (_ua.match(/opera/i)), - _likesHTML5 = (_ua.match(/(mobile|pre\/|xoom)/i) || _is_iDevice), - _isBadSafari = (!_wl.match(/usehtml5audio/i) && !_wl.match(/sm2\-ignorebadua/i) && _isSafari && !_ua.match(/silk/i) && _ua.match(/OS X 10_6_([3-7])/i)), // Safari 4 and 5 (excluding Kindle Fire, "Silk") occasionally fail to load/play HTML5 audio on Snow Leopard 10.6.3 through 10.6.7 due to bug(s) in QuickTime X and/or other underlying frameworks. :/ Confirmed bug. https://bugs.webkit.org/show_bug.cgi?id=32159 - _hasConsole = (typeof console !== 'undefined' && typeof console.log !== 'undefined'), _isFocused = (typeof _doc.hasFocus !== 'undefined'?_doc.hasFocus():null), _tryInitOnFocus = (_isSafari && typeof _doc.hasFocus === 'undefined'), _okToDisable = !_tryInitOnFocus, _flashMIME = /(mp3|mp4|mpa)/i, - _emptyURL = 'about:blank', // safe URL to unload, or load nothing from (flash 8 + most HTML5 UAs) - _overHTTP = (_doc.location?_doc.location.protocol.match(/http/i):null), - _http = (!_overHTTP ? 'http:/'+'/' : ''), - // mp3, mp4, aac etc. - _netStreamMimeTypes = /^\s*audio\/(?:x-)?(?:mpeg4|aac|flv|mov|mp4||m4v|m4a|mp4v|3gp|3g2)\s*(?:$|;)/i, - // Flash v9.0r115+ "moviestar" formats - _netStreamTypes = ['mpeg4', 'aac', 'flv', 'mov', 'mp4', 'm4v', 'f4v', 'm4a', 'mp4v', '3gp', '3g2'], - _netStreamPattern = new RegExp('\\.(' + _netStreamTypes.join('|') + ')(\\?.*)?$', 'i'); - - this.mimePattern = /^\s*audio\/(?:x-)?(?:mp(?:eg|3))\s*(?:$|;)/i; // default mp3 set - - // use altURL if not "online" - this.useAltURL = !_overHTTP; - this._global_a = null; - - _swfCSS = { - - 'swfBox': 'sm2-object-box', - 'swfDefault': 'movieContainer', - 'swfError': 'swf_error', // SWF loaded, but SM2 couldn't start (other error) - 'swfTimedout': 'swf_timedout', - 'swfLoaded': 'swf_loaded', - 'swfUnblocked': 'swf_unblocked', // or loaded OK - 'sm2Debug': 'sm2_debug', - 'highPerf': 'high_performance', - 'flashDebug': 'flash_debug' - - }; - - if (_likesHTML5) { - - // prefer HTML5 for mobile + tablet-like devices, probably more reliable vs. flash at this point. - _s.useHTML5Audio = true; - _s.preferFlash = false; - - if (_is_iDevice) { - // by default, use global feature. iOS onfinish() -> next may fail otherwise. - _s.ignoreFlash = true; - _useGlobalHTML5Audio = true; - } - - } - - /** - * Public SoundManager API - * ----------------------- - */ - - this.ok = function() { - - return (_needsFlash?(_didInit && !_disabled):(_s.useHTML5Audio && _s.hasHTML5)); - - }; - - this.supported = this.ok; // legacy - - this.getMovie = function(smID) { - - // safety net: some old browsers differ on SWF references, possibly related to ExternalInterface / flash version - return _id(smID) || _doc[smID] || _win[smID]; - - }; - - /** - * Creates a SMSound sound object instance. - * - * @param {object} oOptions Sound options (at minimum, id and url are required.) - * @return {object} SMSound The new SMSound object. - */ - - this.createSound = function(oOptions) { - - var _cs, _cs_string, - thisOptions = null, oSound = null, _tO = null; - - // - _cs = _sm+'.createSound(): '; - _cs_string = _cs + _str(!_didInit?'notReady':'notOK'); - // - - if (!_didInit || !_s.ok()) { - _complain(_cs_string); - return false; - } - - if (arguments.length === 2) { - // function overloading in JS! :) ..assume simple createSound(id,url) use case - oOptions = { - 'id': arguments[0], - 'url': arguments[1] - }; - } - - // inherit from defaultOptions - thisOptions = _mixin(oOptions); - - thisOptions.url = _parseURL(thisOptions.url); - - // local shortcut - _tO = thisOptions; - - // - if (_tO.id.toString().charAt(0).match(/^[0-9]$/)) { - _s._wD(_cs + _str('badID', _tO.id), 2); - } - - _s._wD(_cs + _tO.id + ' (' + _tO.url + ')', 1); - // - - if (_idCheck(_tO.id, true)) { - _s._wD(_cs + _tO.id + ' exists', 1); - return _s.sounds[_tO.id]; - } - - function make() { - - thisOptions = _loopFix(thisOptions); - _s.sounds[_tO.id] = new SMSound(_tO); - _s.soundIDs.push(_tO.id); - return _s.sounds[_tO.id]; - - } - - if (_html5OK(_tO)) { - - oSound = make(); - _s._wD('Loading sound '+_tO.id+' via HTML5'); - oSound._setup_html5(_tO); - - } else { - - if (_fV > 8) { - if (_tO.isMovieStar === null) { - // attempt to detect MPEG-4 formats - _tO.isMovieStar = (_tO.serverURL || (_tO.type ? _tO.type.match(_netStreamMimeTypes) : false) || _tO.url.match(_netStreamPattern)); - } - // - if (_tO.isMovieStar) { - _s._wD(_cs + 'using MovieStar handling'); - } - // - if (_tO.isMovieStar) { - if (_tO.usePeakData) { - _wDS('noPeak'); - _tO.usePeakData = false; - } - // - if (_tO.loops > 1) { - _wDS('noNSLoop'); - } - // - } - } - - _tO = _policyFix(_tO, _cs); - oSound = make(); - - if (_fV === 8) { - _flash._createSound(_tO.id, _tO.loops||1, _tO.usePolicyFile); - } else { - _flash._createSound(_tO.id, _tO.url, _tO.usePeakData, _tO.useWaveformData, _tO.useEQData, _tO.isMovieStar, (_tO.isMovieStar?_tO.bufferTime:false), _tO.loops||1, _tO.serverURL, _tO.duration||null, _tO.autoPlay, true, _tO.autoLoad, _tO.usePolicyFile); - if (!_tO.serverURL) { - // We are connected immediately - oSound.connected = true; - if (_tO.onconnect) { - _tO.onconnect.apply(oSound); - } - } - } - - if (!_tO.serverURL && (_tO.autoLoad || _tO.autoPlay)) { - // call load for non-rtmp streams - oSound.load(_tO); - } - - } - - // rtmp will play in onconnect - if (!_tO.serverURL && _tO.autoPlay) { - oSound.play(); - } - - return oSound; - - }; - - /** - * Destroys a SMSound sound object instance. - * - * @param {string} sID The ID of the sound to destroy - */ - - this.destroySound = function(sID, _bFromSound) { - - // explicitly destroy a sound before normal page unload, etc. - - if (!_idCheck(sID)) { - return false; - } - - var oS = _s.sounds[sID], i; - - // Disable all callbacks while the sound is being destroyed - oS._iO = {}; - - oS.stop(); - oS.unload(); - - for (i = 0; i < _s.soundIDs.length; i++) { - if (_s.soundIDs[i] === sID) { - _s.soundIDs.splice(i, 1); - break; - } - } - - if (!_bFromSound) { - // ignore if being called from SMSound instance - oS.destruct(true); - } - - oS = null; - delete _s.sounds[sID]; - - return true; - - }; - - /** - * Calls the load() method of a SMSound object by ID. - * - * @param {string} sID The ID of the sound - * @param {object} oOptions Optional: Sound options - */ - - this.load = function(sID, oOptions) { - - if (!_idCheck(sID)) { - return false; - } - return _s.sounds[sID].load(oOptions); - - }; - - /** - * Calls the unload() method of a SMSound object by ID. - * - * @param {string} sID The ID of the sound - */ - - this.unload = function(sID) { - - if (!_idCheck(sID)) { - return false; - } - return _s.sounds[sID].unload(); - - }; - - /** - * Calls the onPosition() method of a SMSound object by ID. - * - * @param {string} sID The ID of the sound - * @param {number} nPosition The position to watch for - * @param {function} oMethod The relevant callback to fire - * @param {object} oScope Optional: The scope to apply the callback to - * @return {SMSound} The SMSound object - */ - - this.onPosition = function(sID, nPosition, oMethod, oScope) { - - if (!_idCheck(sID)) { - return false; - } - return _s.sounds[sID].onposition(nPosition, oMethod, oScope); - - }; - - // legacy/backwards-compability: lower-case method name - this.onposition = this.onPosition; - - /** - * Calls the clearOnPosition() method of a SMSound object by ID. - * - * @param {string} sID The ID of the sound - * @param {number} nPosition The position to watch for - * @param {function} oMethod Optional: The relevant callback to fire - * @return {SMSound} The SMSound object - */ - - this.clearOnPosition = function(sID, nPosition, oMethod) { - - if (!_idCheck(sID)) { - return false; - } - return _s.sounds[sID].clearOnPosition(nPosition, oMethod); - - }; - - /** - * Calls the play() method of a SMSound object by ID. - * - * @param {string} sID The ID of the sound - * @param {object} oOptions Optional: Sound options - * @return {SMSound} The SMSound object - */ - - this.play = function(sID, oOptions) { - - if (!_didInit || !_s.ok()) { - _complain(_sm+'.play(): ' + _str(!_didInit?'notReady':'notOK')); - return false; - } - - if (!_idCheck(sID)) { - if (!(oOptions instanceof Object)) { - // overloading use case: play('mySound','/path/to/some.mp3'); - oOptions = { - url: oOptions - }; - } - if (oOptions && oOptions.url) { - // overloading use case, create+play: .play('someID',{url:'/path/to.mp3'}); - _s._wD(_sm+'.play(): attempting to create "' + sID + '"', 1); - oOptions.id = sID; - return _s.createSound(oOptions).play(); - } else { - return false; - } - } - - return _s.sounds[sID].play(oOptions); - - }; - - this.start = this.play; // just for convenience - - /** - * Calls the setPosition() method of a SMSound object by ID. - * - * @param {string} sID The ID of the sound - * @param {number} nMsecOffset Position (milliseconds) - * @return {SMSound} The SMSound object - */ - - this.setPosition = function(sID, nMsecOffset) { - - if (!_idCheck(sID)) { - return false; - } - return _s.sounds[sID].setPosition(nMsecOffset); - - }; - - /** - * Calls the stop() method of a SMSound object by ID. - * - * @param {string} sID The ID of the sound - * @return {SMSound} The SMSound object - */ - - this.stop = function(sID) { - - if (!_idCheck(sID)) { - return false; - } - - _s._wD(_sm+'.stop(' + sID + ')', 1); - return _s.sounds[sID].stop(); - - }; - - /** - * Stops all currently-playing sounds. - */ - - this.stopAll = function() { - - var oSound; - _s._wD(_sm+'.stopAll()', 1); - - for (oSound in _s.sounds) { - if (_s.sounds.hasOwnProperty(oSound)) { - // apply only to sound objects - _s.sounds[oSound].stop(); - } - } - - }; - - /** - * Calls the pause() method of a SMSound object by ID. - * - * @param {string} sID The ID of the sound - * @return {SMSound} The SMSound object - */ - - this.pause = function(sID) { - - if (!_idCheck(sID)) { - return false; - } - return _s.sounds[sID].pause(); - - }; - - /** - * Pauses all currently-playing sounds. - */ - - this.pauseAll = function() { - - var i; - for (i = _s.soundIDs.length; i--;) { - _s.sounds[_s.soundIDs[i]].pause(); - } - - }; - - /** - * Calls the resume() method of a SMSound object by ID. - * - * @param {string} sID The ID of the sound - * @return {SMSound} The SMSound object - */ - - this.resume = function(sID) { - - if (!_idCheck(sID)) { - return false; - } - return _s.sounds[sID].resume(); - - }; - - /** - * Resumes all currently-paused sounds. - */ - - this.resumeAll = function() { - - var i; - for (i = _s.soundIDs.length; i--;) { - _s.sounds[_s.soundIDs[i]].resume(); - } - - }; - - /** - * Calls the togglePause() method of a SMSound object by ID. - * - * @param {string} sID The ID of the sound - * @return {SMSound} The SMSound object - */ - - this.togglePause = function(sID) { - - if (!_idCheck(sID)) { - return false; - } - return _s.sounds[sID].togglePause(); - - }; - - /** - * Calls the setPan() method of a SMSound object by ID. - * - * @param {string} sID The ID of the sound - * @param {number} nPan The pan value (-100 to 100) - * @return {SMSound} The SMSound object - */ - - this.setPan = function(sID, nPan) { - - if (!_idCheck(sID)) { - return false; - } - return _s.sounds[sID].setPan(nPan); - - }; - - /** - * Calls the setVolume() method of a SMSound object by ID. - * - * @param {string} sID The ID of the sound - * @param {number} nVol The volume value (0 to 100) - * @return {SMSound} The SMSound object - */ - - this.setVolume = function(sID, nVol) { - - if (!_idCheck(sID)) { - return false; - } - return _s.sounds[sID].setVolume(nVol); - - }; - - /** - * Calls the mute() method of either a single SMSound object by ID, or all sound objects. - * - * @param {string} sID Optional: The ID of the sound (if omitted, all sounds will be used.) - */ - - this.mute = function(sID) { - - var i = 0; - - if (typeof sID !== 'string') { - sID = null; - } - - if (!sID) { - _s._wD(_sm+'.mute(): Muting all sounds'); - for (i = _s.soundIDs.length; i--;) { - _s.sounds[_s.soundIDs[i]].mute(); - } - _s.muted = true; - } else { - if (!_idCheck(sID)) { - return false; - } - _s._wD(_sm+'.mute(): Muting "' + sID + '"'); - return _s.sounds[sID].mute(); - } - - return true; - - }; - - /** - * Mutes all sounds. - */ - - this.muteAll = function() { - - _s.mute(); - - }; - - /** - * Calls the unmute() method of either a single SMSound object by ID, or all sound objects. - * - * @param {string} sID Optional: The ID of the sound (if omitted, all sounds will be used.) - */ - - this.unmute = function(sID) { - - var i; - - if (typeof sID !== 'string') { - sID = null; - } - - if (!sID) { - - _s._wD(_sm+'.unmute(): Unmuting all sounds'); - for (i = _s.soundIDs.length; i--;) { - _s.sounds[_s.soundIDs[i]].unmute(); - } - _s.muted = false; - - } else { - - if (!_idCheck(sID)) { - return false; - } - _s._wD(_sm+'.unmute(): Unmuting "' + sID + '"'); - return _s.sounds[sID].unmute(); - - } - - return true; - - }; - - /** - * Unmutes all sounds. - */ - - this.unmuteAll = function() { - - _s.unmute(); - - }; - - /** - * Calls the toggleMute() method of a SMSound object by ID. - * - * @param {string} sID The ID of the sound - * @return {SMSound} The SMSound object - */ - - this.toggleMute = function(sID) { - - if (!_idCheck(sID)) { - return false; - } - return _s.sounds[sID].toggleMute(); - - }; - - /** - * Retrieves the memory used by the flash plugin. - * - * @return {number} The amount of memory in use - */ - - this.getMemoryUse = function() { - - // flash-only - var ram = 0; - - if (_flash && _fV !== 8) { - ram = parseInt(_flash._getMemoryUse(), 10); - } - - return ram; - - }; - - /** - * Undocumented: NOPs soundManager and all SMSound objects. - */ - - this.disable = function(bNoDisable) { - - // destroy all functions - var i; - - if (typeof bNoDisable === 'undefined') { - bNoDisable = false; - } - - if (_disabled) { - return false; - } - - _disabled = true; - _wDS('shutdown', 1); - - for (i = _s.soundIDs.length; i--;) { - _disableObject(_s.sounds[_s.soundIDs[i]]); - } - - // fire "complete", despite fail - _initComplete(bNoDisable); - _event.remove(_win, 'load', _initUserOnload); - - return true; - - }; - - /** - * Determines playability of a MIME type, eg. 'audio/mp3'. - */ - - this.canPlayMIME = function(sMIME) { - - var result; - - if (_s.hasHTML5) { - result = _html5CanPlay({type:sMIME}); - } - - if (!_needsFlash || result) { - // no flash, or OK - return result; - } else { - // if flash 9, test netStream (movieStar) types as well. - return (sMIME ? !!((_fV > 8 ? sMIME.match(_netStreamMimeTypes) : null) || sMIME.match(_s.mimePattern)) : null); - } - - }; - - /** - * Determines playability of a URL based on audio support. - * - * @param {string} sURL The URL to test - * @return {boolean} URL playability - */ - - this.canPlayURL = function(sURL) { - - var result; - - if (_s.hasHTML5) { - result = _html5CanPlay({url: sURL}); - } - - if (!_needsFlash || result) { - // no flash, or OK - return result; - } else { - return (sURL ? !!(sURL.match(_s.filePattern)) : null); - } - - }; - - /** - * Determines playability of an HTML DOM <a> object (or similar object literal) based on audio support. - * - * @param {object} oLink an HTML DOM <a> object or object literal including href and/or type attributes - * @return {boolean} URL playability - */ - - this.canPlayLink = function(oLink) { - - if (typeof oLink.type !== 'undefined' && oLink.type) { - if (_s.canPlayMIME(oLink.type)) { - return true; - } - } - - return _s.canPlayURL(oLink.href); - - }; - - /** - * Retrieves a SMSound object by ID. - * - * @param {string} sID The ID of the sound - * @return {SMSound} The SMSound object - */ - - this.getSoundById = function(sID, _suppressDebug) { - - if (!sID) { - throw new Error(_sm+'.getSoundById(): sID is null/undefined'); - } - - var result = _s.sounds[sID]; - - // - if (!result && !_suppressDebug) { - _s._wD('"' + sID + '" is an invalid sound ID.', 2); - } - // - - return result; - - }; - - /** - * Queues a callback for execution when SoundManager has successfully initialized. - * - * @param {function} oMethod The callback method to fire - * @param {object} oScope Optional: The scope to apply to the callback - */ - - this.onready = function(oMethod, oScope) { - - var sType = 'onready'; - - if (oMethod && oMethod instanceof Function) { - - // - if (_didInit) { - _s._wD(_str('queue', sType)); - } - // - - if (!oScope) { - oScope = _win; - } - - _addOnEvent(sType, oMethod, oScope); - _processOnEvents(); - - return true; - - } else { - - throw _str('needFunction', sType); - - } - - }; - - /** - * Queues a callback for execution when SoundManager has failed to initialize. - * - * @param {function} oMethod The callback method to fire - * @param {object} oScope Optional: The scope to apply to the callback - */ - - this.ontimeout = function(oMethod, oScope) { - - var sType = 'ontimeout'; - - if (oMethod && oMethod instanceof Function) { - - // - if (_didInit) { - _s._wD(_str('queue', sType)); - } - // - - if (!oScope) { - oScope = _win; - } - - _addOnEvent(sType, oMethod, oScope); - _processOnEvents({type:sType}); - - return true; - - } else { - - throw _str('needFunction', sType); - - } - - }; - - /** - * Writes console.log()-style debug output to a console or in-browser element. - * Applies when SoundManager.debugMode = true - * - * @param {string} sText The console message - * @param {string} sType Optional: Log type of 'info', 'warn' or 'error' - * @param {object} Optional: The scope to apply to the callback - */ - - this._writeDebug = function(sText, sType, _bTimestamp) { - - // pseudo-private console.log()-style output - // - - var sDID = 'soundmanager-debug', o, oItem, sMethod; - - if (!_s.debugMode) { - return false; - } - - if (typeof _bTimestamp !== 'undefined' && _bTimestamp) { - sText = sText + ' | ' + new Date().getTime(); - } - - if (_hasConsole && _s.useConsole) { - sMethod = _debugLevels[sType]; - if (typeof console[sMethod] !== 'undefined') { - console[sMethod](sText); - } else { - console.log(sText); - } - if (_s.consoleOnly) { - return true; - } - } - - try { - - o = _id(sDID); - - if (!o) { - return false; - } - - oItem = _doc.createElement('div'); - - if (++_wdCount % 2 === 0) { - oItem.className = 'sm2-alt'; - } - - if (typeof sType === 'undefined') { - sType = 0; - } else { - sType = parseInt(sType, 10); - } - - oItem.appendChild(_doc.createTextNode(sText)); - - if (sType) { - if (sType >= 2) { - oItem.style.fontWeight = 'bold'; - } - if (sType === 3) { - oItem.style.color = '#ff3333'; - } - } - - // top-to-bottom - // o.appendChild(oItem); - - // bottom-to-top - o.insertBefore(oItem, o.firstChild); - - } catch(e) { - // oh well - } - - o = null; - // - - return true; - - }; - - // alias - this._wD = this._writeDebug; - - /** - * Provides debug / state information on all SMSound objects. - */ - - this._debug = function() { - - // - var i, j; - _wDS('currentObj', 1); - - for (i = 0, j = _s.soundIDs.length; i < j; i++) { - _s.sounds[_s.soundIDs[i]]._debug(); - } - // - - }; - - /** - * Restarts and re-initializes the SoundManager instance. - */ - - this.reboot = function() { - - // attempt to reset and init SM2 - _s._wD(_sm+'.reboot()'); - - // - if (_s.soundIDs.length) { - _s._wD('Destroying ' + _s.soundIDs.length + ' SMSound objects...'); - } - // - - var i, j; - - for (i = _s.soundIDs.length; i--;) { - _s.sounds[_s.soundIDs[i]].destruct(); - } - - // trash ze flash - - try { - if (_isIE) { - _oRemovedHTML = _flash.innerHTML; - } - _oRemoved = _flash.parentNode.removeChild(_flash); - _s._wD('Flash movie removed.'); - } catch(e) { - // uh-oh. - _wDS('badRemove', 2); - } - - // actually, force recreate of movie. - _oRemovedHTML = _oRemoved = _needsFlash = null; - - _s.enabled = _didDCLoaded = _didInit = _waitingForEI = _initPending = _didAppend = _appendSuccess = _disabled = _s.swfLoaded = false; - _s.soundIDs = _s.sounds = []; - _flash = null; - - for (i in _on_queue) { - if (_on_queue.hasOwnProperty(i)) { - for (j = _on_queue[i].length; j--;) { - _on_queue[i][j].fired = false; - } - } - } - - _s._wD(_sm + ': Rebooting...'); - _win.setTimeout(_s.beginDelayedInit, 20); - - }; - - /** - * Undocumented: Determines the SM2 flash movie's load progress. - * - * @return {number or null} Percent loaded, or if invalid/unsupported, null. - */ - - this.getMoviePercent = function() { - - return (_flash && typeof _flash.PercentLoaded !== 'undefined' ? _flash.PercentLoaded() : null); - - }; - - /** - * Additional helper for manually invoking SM2's init process after DOM Ready / window.onload(). - */ - - this.beginDelayedInit = function() { - - _windowLoaded = true; - _domContentLoaded(); - - setTimeout(function() { - - if (_initPending) { - return false; - } - - _createMovie(); - _initMovie(); - _initPending = true; - - return true; - - }, 20); - - _delayWaitForEI(); - - }; - - /** - * Destroys the SoundManager instance and all SMSound instances. - */ - - this.destruct = function() { - - _s._wD(_sm+'.destruct()'); - _s.disable(true); - - }; - - /** - * SMSound() (sound object) constructor - * ------------------------------------ - * - * @param {object} oOptions Sound options (id and url are required attributes) - * @return {SMSound} The new SMSound object - */ - - SMSound = function(oOptions) { - - var _t = this, _resetProperties, _add_html5_events, _remove_html5_events, _stop_html5_timer, _start_html5_timer, _attachOnPosition, _onplay_called = false, _onPositionItems = [], _onPositionFired = 0, _detachOnPosition, _applyFromTo, _lastURL = null; - - var _lastHTML5State = { - // tracks duration + position (time) - duration: null, - time: null - }; - - this.sID = oOptions.id; - this.url = oOptions.url; - this.options = _mixin(oOptions); - - // per-play-instance-specific options - this.instanceOptions = this.options; - - // short alias - this._iO = this.instanceOptions; - - // assign property defaults - this.pan = this.options.pan; - this.volume = this.options.volume; - this.isHTML5 = false; - this._a = null; - - /** - * SMSound() public methods - * ------------------------ - */ - - this.id3 = {}; - - /** - * Writes SMSound object parameters to debug console - */ - - this._debug = function() { - - // - // pseudo-private console.log()-style output - - if (_s.debugMode) { - - var stuff = null, msg = [], sF, sfBracket, maxLength = 64; - - for (stuff in _t.options) { - if (_t.options[stuff] !== null) { - if (_t.options[stuff] instanceof Function) { - // handle functions specially - sF = _t.options[stuff].toString(); - // normalize spaces - sF = sF.replace(/\s\s+/g, ' '); - sfBracket = sF.indexOf('{'); - msg.push(' ' + stuff + ': {' + sF.substr(sfBracket + 1, (Math.min(Math.max(sF.indexOf('\n') - 1, maxLength), maxLength))).replace(/\n/g, '') + '... }'); - } else { - msg.push(' ' + stuff + ': ' + _t.options[stuff]); - } - } - } - - _s._wD('SMSound() merged options: {\n' + msg.join(', \n') + '\n}'); - - } - // - - }; - - // - this._debug(); - // - - /** - * Begins loading a sound per its *url*. - * - * @param {object} oOptions Optional: Sound options - * @return {SMSound} The SMSound object - */ - - this.load = function(oOptions) { - - var oS = null, _iO; - - if (typeof oOptions !== 'undefined') { - _t._iO = _mixin(oOptions, _t.options); - _t.instanceOptions = _t._iO; - } else { - oOptions = _t.options; - _t._iO = oOptions; - _t.instanceOptions = _t._iO; - if (_lastURL && _lastURL !== _t.url) { - _wDS('manURL'); - _t._iO.url = _t.url; - _t.url = null; - } - } - - if (!_t._iO.url) { - _t._iO.url = _t.url; - } - - _t._iO.url = _parseURL(_t._iO.url); - - _s._wD('SMSound.load(): ' + _t._iO.url, 1); - - if (_t._iO.url === _t.url && _t.readyState !== 0 && _t.readyState !== 2) { - _wDS('onURL', 1); - // if loaded and an onload() exists, fire immediately. - if (_t.readyState === 3 && _t._iO.onload) { - // assume success based on truthy duration. - _t._iO.onload.apply(_t, [(!!_t.duration)]); - } - return _t; - } - - // local shortcut - _iO = _t._iO; - - _lastURL = _t.url; - _t.loaded = false; - _t.readyState = 1; - _t.playState = 0; - - // TODO: If switching from HTML5 -> flash (or vice versa), stop currently-playing audio. - - if (_html5OK(_iO)) { - - oS = _t._setup_html5(_iO); - - if (!oS._called_load) { - - _s._wD(_h5+'load: '+_t.sID); - _t._html5_canplay = false; - - // given explicit load call, try to get whole file. - // early HTML5 implementation (non-standard) - _t._a.autobuffer = 'auto'; - // standard - _t._a.preload = 'auto'; - - oS.load(); - oS._called_load = true; - - if (_iO.autoPlay) { - _t.play(); - } - - } else { - _s._wD(_h5+'ignoring request to load again: '+_t.sID); - } - - } else { - - try { - _t.isHTML5 = false; - _t._iO = _policyFix(_loopFix(_iO)); - // re-assign local shortcut - _iO = _t._iO; - if (_fV === 8) { - _flash._load(_t.sID, _iO.url, _iO.stream, _iO.autoPlay, (_iO.whileloading?1:0), _iO.loops||1, _iO.usePolicyFile); - } else { - _flash._load(_t.sID, _iO.url, !!(_iO.stream), !!(_iO.autoPlay), _iO.loops||1, !!(_iO.autoLoad), _iO.usePolicyFile); - } - } catch(e) { - _wDS('smError', 2); - _debugTS('onload', false); - _catchError({type:'SMSOUND_LOAD_JS_EXCEPTION', fatal:true}); - - } - - } - - return _t; - - }; - - /** - * Unloads a sound, canceling any open HTTP requests. - * - * @return {SMSound} The SMSound object - */ - - this.unload = function() { - - // Flash 8/AS2 can't "close" a stream - fake it by loading an empty URL - // Flash 9/AS3: Close stream, preventing further load - // HTML5: Most UAs will use empty URL - - if (_t.readyState !== 0) { - - _s._wD('SMSound.unload(): "' + _t.sID + '"'); - - if (!_t.isHTML5) { - if (_fV === 8) { - _flash._unload(_t.sID, _emptyURL); - } else { - _flash._unload(_t.sID); - } - } else { - _stop_html5_timer(); - if (_t._a) { - _t._a.pause(); - _html5Unload(_t._a); - } - } - - // reset load/status flags - _resetProperties(); - - } - - return _t; - - }; - - /** - * Unloads and destroys a sound. - */ - - this.destruct = function(_bFromSM) { - - _s._wD('SMSound.destruct(): "' + _t.sID + '"'); - - if (!_t.isHTML5) { - - // kill sound within Flash - // Disable the onfailure handler - _t._iO.onfailure = null; - _flash._destroySound(_t.sID); - - } else { - - _stop_html5_timer(); - - if (_t._a) { - _t._a.pause(); - _html5Unload(_t._a); - if (!_useGlobalHTML5Audio) { - _remove_html5_events(); - } - // break obvious circular reference - _t._a._t = null; - _t._a = null; - } - - } - - if (!_bFromSM) { - // ensure deletion from controller - _s.destroySound(_t.sID, true); - - } - - }; - - /** - * Begins playing a sound. - * - * @param {object} oOptions Optional: Sound options - * @return {SMSound} The SMSound object - */ - - this.play = function(oOptions, _updatePlayState) { - - var fN, allowMulti, a, onready; - - // - fN = 'SMSound.play(): '; - // - - _updatePlayState = _updatePlayState === undefined ? true : _updatePlayState; // default to true - - if (!oOptions) { - oOptions = {}; - } - - _t._iO = _mixin(oOptions, _t._iO); - _t._iO = _mixin(_t._iO, _t.options); - _t._iO.url = _parseURL(_t._iO.url); - _t.instanceOptions = _t._iO; - - // RTMP-only - if (_t._iO.serverURL && !_t.connected) { - if (!_t.getAutoPlay()) { - _s._wD(fN+' Netstream not connected yet - setting autoPlay'); - _t.setAutoPlay(true); - } - // play will be called in _onconnect() - return _t; - } - - if (_html5OK(_t._iO)) { - _t._setup_html5(_t._iO); - _start_html5_timer(); - } - - if (_t.playState === 1 && !_t.paused) { - allowMulti = _t._iO.multiShot; - if (!allowMulti) { - _s._wD(fN + '"' + _t.sID + '" already playing (one-shot)', 1); - return _t; - } else { - _s._wD(fN + '"' + _t.sID + '" already playing (multi-shot)', 1); - } - } - - if (!_t.loaded) { - - if (_t.readyState === 0) { - - _s._wD(fN + 'Attempting to load "' + _t.sID + '"', 1); - - // try to get this sound playing ASAP - if (!_t.isHTML5) { - // assign directly because setAutoPlay() increments the instanceCount - _t._iO.autoPlay = true; - } - - _t.load(_t._iO); - - } else if (_t.readyState === 2) { - - _s._wD(fN + 'Could not load "' + _t.sID + '" - exiting', 2); - return _t; - - } else { - - _s._wD(fN + '"' + _t.sID + '" is loading - attempting to play..', 1); - - } - - } else { - - _s._wD(fN + '"' + _t.sID + '"'); - - } - - if (!_t.isHTML5 && _fV === 9 && _t.position > 0 && _t.position === _t.duration) { - // flash 9 needs a position reset if play() is called while at the end of a sound. - _s._wD(fN + '"' + _t.sID + '": Sound at end, resetting to position:0'); - oOptions.position = 0; - } - - /** - * Streams will pause when their buffer is full if they are being loaded. - * In this case paused is true, but the song hasn't started playing yet. - * If we just call resume() the onplay() callback will never be called. - * So only call resume() if the position is > 0. - * Another reason is because options like volume won't have been applied yet. - */ - - if (_t.paused && _t.position && _t.position > 0) { - - // https://gist.github.com/37b17df75cc4d7a90bf6 - _s._wD(fN + '"' + _t.sID + '" is resuming from paused state',1); - _t.resume(); - - } else { - - _t._iO = _mixin(oOptions, _t._iO); - - // apply from/to parameters, if they exist (and not using RTMP) - if (_t._iO.from !== null && _t._iO.to !== null && _t.instanceCount === 0 && _t.playState === 0 && !_t._iO.serverURL) { - - onready = function() { - // sound "canplay" or onload() - // re-apply from/to to instance options, and start playback - _t._iO = _mixin(oOptions, _t._iO); - _t.play(_t._iO); - }; - - // HTML5 needs to at least have "canplay" fired before seeking. - if (_t.isHTML5 && !_t._html5_canplay) { - - // this hasn't been loaded yet. load it first, and then do this again. - _s._wD(fN+'Beginning load of "'+ _t.sID+'" for from/to case'); - - _t.load({ - _oncanplay: onready - }); - - return false; - - } else if (!_t.isHTML5 && !_t.loaded && (!_t.readyState || _t.readyState !== 2)) { - - // to be safe, preload the whole thing in Flash. - - _s._wD(fN+'Preloading "'+ _t.sID+'" for from/to case'); - - _t.load({ - onload: onready - }); - - return false; - - } - - // otherwise, we're ready to go. re-apply local options, and continue - - _t._iO = _applyFromTo(); - - } - - _s._wD(fN+'"'+ _t.sID+'" is starting to play'); - - if (!_t.instanceCount || _t._iO.multiShotEvents || (!_t.isHTML5 && _fV > 8 && !_t.getAutoPlay())) { - _t.instanceCount++; - } - - // if first play and onposition parameters exist, apply them now - if (_t.playState === 0 && _t._iO.onposition) { - _attachOnPosition(_t); - } - - _t.playState = 1; - _t.paused = false; - - _t.position = (typeof _t._iO.position !== 'undefined' && !isNaN(_t._iO.position) ? _t._iO.position : 0); - - if (!_t.isHTML5) { - _t._iO = _policyFix(_loopFix(_t._iO)); - } - - if (_t._iO.onplay && _updatePlayState) { - _t._iO.onplay.apply(_t); - _onplay_called = true; - } - - _t.setVolume(_t._iO.volume, true); - _t.setPan(_t._iO.pan, true); - - if (!_t.isHTML5) { - - _flash._start(_t.sID, _t._iO.loops || 1, (_fV === 9?_t._iO.position:_t._iO.position / 1000)); - - } else { - - _start_html5_timer(); - a = _t._setup_html5(); - _t.setPosition(_t._iO.position); - a.play(); - - } - - } - - return _t; - - }; - - // just for convenience - this.start = this.play; - - /** - * Stops playing a sound (and optionally, all sounds) - * - * @param {boolean} bAll Optional: Whether to stop all sounds - * @return {SMSound} The SMSound object - */ - - this.stop = function(bAll) { - - var _iO = _t._iO, _oP; - - if (_t.playState === 1) { - - _t._onbufferchange(0); - _t._resetOnPosition(0); - _t.paused = false; - - if (!_t.isHTML5) { - _t.playState = 0; - } - - // remove onPosition listeners, if any - _detachOnPosition(); - - // and "to" position, if set - if (_iO.to) { - _t.clearOnPosition(_iO.to); - } - - if (!_t.isHTML5) { - - _flash._stop(_t.sID, bAll); - - // hack for netStream: just unload - if (_iO.serverURL) { - _t.unload(); - } - - } else { - - if (_t._a) { - - _oP = _t.position; - - // act like Flash, though - _t.setPosition(0); - - // hack: reflect old position for onstop() (also like Flash) - _t.position = _oP; - - // html5 has no stop() - // NOTE: pausing means iOS requires interaction to resume. - _t._a.pause(); - - _t.playState = 0; - - // and update UI - _t._onTimer(); - - _stop_html5_timer(); - - } - - } - - _t.instanceCount = 0; - _t._iO = {}; - - if (_iO.onstop) { - _iO.onstop.apply(_t); - } - - } - - return _t; - - }; - - /** - * Undocumented/internal: Sets autoPlay for RTMP. - * - * @param {boolean} autoPlay state - */ - - this.setAutoPlay = function(autoPlay) { - - _s._wD('sound '+_t.sID+' turned autoplay ' + (autoPlay ? 'on' : 'off')); - _t._iO.autoPlay = autoPlay; - - if (!_t.isHTML5) { - _flash._setAutoPlay(_t.sID, autoPlay); - if (autoPlay) { - // only increment the instanceCount if the sound isn't loaded (TODO: verify RTMP) - if (!_t.instanceCount && _t.readyState === 1) { - _t.instanceCount++; - _s._wD('sound '+_t.sID+' incremented instance count to '+_t.instanceCount); - } - } - } - - }; - - /** - * Undocumented/internal: Returns the autoPlay boolean. - * - * @return {boolean} The current autoPlay value - */ - - this.getAutoPlay = function() { - - return _t._iO.autoPlay; - - }; - - /** - * Sets the position of a sound. - * - * @param {number} nMsecOffset Position (milliseconds) - * @return {SMSound} The SMSound object - */ - - this.setPosition = function(nMsecOffset) { - - if (nMsecOffset === undefined) { - nMsecOffset = 0; - } - - var original_pos, - position, position1K, - // Use the duration from the instance options, if we don't have a track duration yet. - // position >= 0 and <= current available (loaded) duration - offset = (_t.isHTML5 ? Math.max(nMsecOffset,0) : Math.min(_t.duration || _t._iO.duration, Math.max(nMsecOffset, 0))); - - original_pos = _t.position; - _t.position = offset; - position1K = _t.position/1000; - _t._resetOnPosition(_t.position); - _t._iO.position = offset; - - if (!_t.isHTML5) { - - position = (_fV === 9 ? _t.position : position1K); - if (_t.readyState && _t.readyState !== 2) { - // if paused or not playing, will not resume (by playing) - _flash._setPosition(_t.sID, position, (_t.paused || !_t.playState)); - } - - } else if (_t._a) { - - // Set the position in the canplay handler if the sound is not ready yet - if (_t._html5_canplay) { - if (_t._a.currentTime !== position1K) { - /** - * DOM/JS errors/exceptions to watch out for: - * if seek is beyond (loaded?) position, "DOM exception 11" - * "INDEX_SIZE_ERR": DOM exception 1 - */ - _s._wD('setPosition('+position1K+'): setting position'); - try { - _t._a.currentTime = position1K; - if (_t.playState === 0 || _t.paused) { - // allow seek without auto-play/resume - _t._a.pause(); - } - } catch(e) { - _s._wD('setPosition('+position1K+'): setting position failed: '+e.message, 2); - } - } - } else { - _s._wD('setPosition('+position1K+'): delaying, sound not ready'); - } - - } - - if (_t.isHTML5) { - if (_t.paused) { - // if paused, refresh UI right away - // force update - _t._onTimer(true); - } - } - - return _t; - - }; - - /** - * Pauses sound playback. - * - * @return {SMSound} The SMSound object - */ - - this.pause = function(_bCallFlash) { - - if (_t.paused || (_t.playState === 0 && _t.readyState !== 1)) { - return _t; - } - - _s._wD('SMSound.pause()'); - _t.paused = true; - - if (!_t.isHTML5) { - if (_bCallFlash || _bCallFlash === undefined) { - _flash._pause(_t.sID); - } - } else { - _t._setup_html5().pause(); - _stop_html5_timer(); - } - - if (_t._iO.onpause) { - _t._iO.onpause.apply(_t); - } - - return _t; - - }; - - /** - * Resumes sound playback. - * - * @return {SMSound} The SMSound object - */ - - /** - * When auto-loaded streams pause on buffer full they have a playState of 0. - * We need to make sure that the playState is set to 1 when these streams "resume". - * When a paused stream is resumed, we need to trigger the onplay() callback if it - * hasn't been called already. In this case since the sound is being played for the - * first time, I think it's more appropriate to call onplay() rather than onresume(). - */ - - this.resume = function() { - - var _iO = _t._iO; - - if (!_t.paused) { - return _t; - } - - _s._wD('SMSound.resume()'); - _t.paused = false; - _t.playState = 1; - - if (!_t.isHTML5) { - if (_iO.isMovieStar && !_iO.serverURL) { - // Bizarre Webkit bug (Chrome reported via 8tracks.com dudes): AAC content paused for 30+ seconds(?) will not resume without a reposition. - _t.setPosition(_t.position); - } - // flash method is toggle-based (pause/resume) - _flash._pause(_t.sID); - } else { - _t._setup_html5().play(); - _start_html5_timer(); - } - - if (_onplay_called && _iO.onplay) { - _iO.onplay.apply(_t); - _onplay_called = true; - } else if (_iO.onresume) { - _iO.onresume.apply(_t); - } - - return _t; - - }; - - /** - * Toggles sound playback. - * - * @return {SMSound} The SMSound object - */ - - this.togglePause = function() { - - _s._wD('SMSound.togglePause()'); - - if (_t.playState === 0) { - _t.play({ - position: (_fV === 9 && !_t.isHTML5 ? _t.position : _t.position / 1000) - }); - return _t; - } - - if (_t.paused) { - _t.resume(); - } else { - _t.pause(); - } - - return _t; - - }; - - /** - * Sets the panning (L-R) effect. - * - * @param {number} nPan The pan value (-100 to 100) - * @return {SMSound} The SMSound object - */ - - this.setPan = function(nPan, bInstanceOnly) { - - if (typeof nPan === 'undefined') { - nPan = 0; - } - - if (typeof bInstanceOnly === 'undefined') { - bInstanceOnly = false; - } - - if (!_t.isHTML5) { - _flash._setPan(_t.sID, nPan); - } // else { no HTML5 pan? } - - _t._iO.pan = nPan; - - if (!bInstanceOnly) { - _t.pan = nPan; - _t.options.pan = nPan; - } - - return _t; - - }; - - /** - * Sets the volume. - * - * @param {number} nVol The volume value (0 to 100) - * @return {SMSound} The SMSound object - */ - - this.setVolume = function(nVol, _bInstanceOnly) { - - /** - * Note: Setting volume has no effect on iOS "special snowflake" devices. - * Hardware volume control overrides software, and volume - * will always return 1 per Apple docs. (iOS 4 + 5.) - * http://developer.apple.com/library/safari/documentation/AudioVideo/Conceptual/HTML-canvas-guide/AddingSoundtoCanvasAnimations/AddingSoundtoCanvasAnimations.html - */ - - if (typeof nVol === 'undefined') { - nVol = 100; - } - - if (typeof _bInstanceOnly === 'undefined') { - _bInstanceOnly = false; - } - - if (!_t.isHTML5) { - _flash._setVolume(_t.sID, (_s.muted && !_t.muted) || _t.muted?0:nVol); - } else if (_t._a) { - // valid range: 0-1 - _t._a.volume = Math.max(0, Math.min(1, nVol/100)); - } - - _t._iO.volume = nVol; - - if (!_bInstanceOnly) { - _t.volume = nVol; - _t.options.volume = nVol; - } - - return _t; - - }; - - /** - * Mutes the sound. - * - * @return {SMSound} The SMSound object - */ - - this.mute = function() { - - _t.muted = true; - - if (!_t.isHTML5) { - _flash._setVolume(_t.sID, 0); - } else if (_t._a) { - _t._a.muted = true; - } - - return _t; - - }; - - /** - * Unmutes the sound. - * - * @return {SMSound} The SMSound object - */ - - this.unmute = function() { - - _t.muted = false; - var hasIO = typeof _t._iO.volume !== 'undefined'; - - if (!_t.isHTML5) { - _flash._setVolume(_t.sID, hasIO?_t._iO.volume:_t.options.volume); - } else if (_t._a) { - _t._a.muted = false; - } - - return _t; - - }; - - /** - * Toggles the muted state of a sound. - * - * @return {SMSound} The SMSound object - */ - - this.toggleMute = function() { - - return (_t.muted?_t.unmute():_t.mute()); - - }; - - /** - * Registers a callback to be fired when a sound reaches a given position during playback. - * - * @param {number} nPosition The position to watch for - * @param {function} oMethod The relevant callback to fire - * @param {object} oScope Optional: The scope to apply the callback to - * @return {SMSound} The SMSound object - */ - - this.onPosition = function(nPosition, oMethod, oScope) { - - // TODO: basic dupe checking? - - _onPositionItems.push({ - position: nPosition, - method: oMethod, - scope: (typeof oScope !== 'undefined' ? oScope : _t), - fired: false - }); - - return _t; - - }; - - // legacy/backwards-compability: lower-case method name - this.onposition = this.onPosition; - - /** - * Removes registered callback(s) from a sound, by position and/or callback. - * - * @param {number} nPosition The position to clear callback(s) for - * @param {function} oMethod Optional: Identify one callback to be removed when multiple listeners exist for one position - * @return {SMSound} The SMSound object - */ - - this.clearOnPosition = function(nPosition, oMethod) { - - var i; - - nPosition = parseInt(nPosition, 10); - - if (isNaN(nPosition)) { - // safety check - return false; - } - - for (i=0; i < _onPositionItems.length; i++) { - - if (nPosition === _onPositionItems[i].position) { - // remove this item if no method was specified, or, if the method matches - if (!oMethod || (oMethod === _onPositionItems[i].method)) { - if (_onPositionItems[i].fired) { - // decrement "fired" counter, too - _onPositionFired--; - } - _onPositionItems.splice(i, 1); - } - } - - } - - }; - - this._processOnPosition = function() { - - var i, item, j = _onPositionItems.length; - - if (!j || !_t.playState || _onPositionFired >= j) { - return false; - } - - for (i=j; i--;) { - item = _onPositionItems[i]; - if (!item.fired && _t.position >= item.position) { - item.fired = true; - _onPositionFired++; - item.method.apply(item.scope, [item.position]); - } - } - - return true; - - }; - - this._resetOnPosition = function(nPosition) { - - // reset "fired" for items interested in this position - var i, item, j = _onPositionItems.length; - - if (!j) { - return false; - } - - for (i=j; i--;) { - item = _onPositionItems[i]; - if (item.fired && nPosition <= item.position) { - item.fired = false; - _onPositionFired--; - } - } - - return true; - - }; - - /** - * SMSound() private internals - * -------------------------------- - */ - - _applyFromTo = function() { - - var _iO = _t._iO, - f = _iO.from, - t = _iO.to, - start, end; - - end = function() { - - // end has been reached. - _s._wD(_t.sID + ': "to" time of ' + t + ' reached.'); - - // detach listener - _t.clearOnPosition(t, end); - - // stop should clear this, too - _t.stop(); - - }; - - start = function() { - - _s._wD(_t.sID + ': playing "from" ' + f); - - // add listener for end - if (t !== null && !isNaN(t)) { - _t.onPosition(t, end); - } - - }; - - if (f !== null && !isNaN(f)) { - - // apply to instance options, guaranteeing correct start position. - _iO.position = f; - - // multiShot timing can't be tracked, so prevent that. - _iO.multiShot = false; - - start(); - - } - - // return updated instanceOptions including starting position - return _iO; - - }; - - _attachOnPosition = function() { - - var op = _t._iO.onposition; - - // attach onposition things, if any, now. - - if (op) { - - var item; - - for (item in op) { - if (op.hasOwnProperty(item)) { - _t.onPosition(parseInt(item, 10), op[item]); - } - } - - } - - }; - - _detachOnPosition = function() { - - var op = _t._iO.onposition; - - // detach any onposition()-style listeners. - - if (op) { - - var item; - - for (item in op) { - if (op.hasOwnProperty(item)) { - _t.clearOnPosition(parseInt(item, 10)); - } - } - - } - - }; - - _start_html5_timer = function() { - - if (_t.isHTML5) { - _startTimer(_t); - } - - }; - - _stop_html5_timer = function() { - - if (_t.isHTML5) { - _stopTimer(_t); - } - - }; - - _resetProperties = function() { - - _onPositionItems = []; - _onPositionFired = 0; - _onplay_called = false; - - _t._hasTimer = null; - _t._a = null; - _t._html5_canplay = false; - _t.bytesLoaded = null; - _t.bytesTotal = null; - _t.duration = (_t._iO && _t._iO.duration ? _t._iO.duration : null); - _t.durationEstimate = null; - - // legacy: 1D array - _t.eqData = []; - - _t.eqData.left = []; - _t.eqData.right = []; - - _t.failures = 0; - _t.isBuffering = false; - _t.instanceOptions = {}; - _t.instanceCount = 0; - _t.loaded = false; - _t.metadata = {}; - - // 0 = uninitialised, 1 = loading, 2 = failed/error, 3 = loaded/success - _t.readyState = 0; - - _t.muted = false; - _t.paused = false; - - _t.peakData = { - left: 0, - right: 0 - }; - - _t.waveformData = { - left: [], - right: [] - }; - - _t.playState = 0; - _t.position = null; - - }; - - _resetProperties(); - - /** - * Pseudo-private SMSound internals - * -------------------------------- - */ - - this._onTimer = function(bForce) { - - /** - * HTML5-only _whileplaying() etc. - * called from both HTML5 native events, and polling/interval-based timers - * mimics flash and fires only when time/duration change, so as to be polling-friendly - */ - - var duration, isNew = false, time, x = {}; - - if (_t._hasTimer || bForce) { - - // TODO: May not need to track readyState (1 = loading) - - if (_t._a && (bForce || ((_t.playState > 0 || _t.readyState === 1) && !_t.paused))) { - - duration = _t._get_html5_duration(); - - if (duration !== _lastHTML5State.duration) { - - _lastHTML5State.duration = duration; - _t.duration = duration; - isNew = true; - - } - - // TODO: investigate why this goes wack if not set/re-set each time. - _t.durationEstimate = _t.duration; - - time = (_t._a.currentTime * 1000 || 0); - - if (time !== _lastHTML5State.time) { - - _lastHTML5State.time = time; - isNew = true; - - } - - if (isNew || bForce) { - - _t._whileplaying(time,x,x,x,x); - - } - - return isNew; - - } else { - - // _s._wD('_onTimer: Warn for "'+_t.sID+'": '+(!_t._a?'Could not find element. ':'')+(_t.playState === 0?'playState bad, 0?':'playState = '+_t.playState+', OK')); - - return false; - - } - - } - - }; - - this._get_html5_duration = function() { - - var _iO = _t._iO, - d = (_t._a ? _t._a.duration*1000 : (_iO ? _iO.duration : undefined)), - result = (d && !isNaN(d) && d !== Infinity ? d : (_iO ? _iO.duration : null)); - - return result; - - }; - - this._setup_html5 = function(oOptions) { - - var _iO = _mixin(_t._iO, oOptions), d = decodeURI, - _a = _useGlobalHTML5Audio ? _s._global_a : _t._a, - _dURL = d(_iO.url), - _oldIO = (_a && _a._t ? _a._t.instanceOptions : null); - - if (_a) { - - if (_a._t) { - - if (!_useGlobalHTML5Audio && _dURL === d(_lastURL)) { - // same url, ignore request - return _a; - } else if (_useGlobalHTML5Audio && _oldIO.url === _iO.url && (!_lastURL || (_lastURL === _oldIO.url))) { - // iOS-type reuse case - return _a; - } - - } - - _s._wD('setting new URL on existing object: ' + _dURL + (_lastURL ? ', old URL: ' + _lastURL : '')); - - /** - * "First things first, I, Poppa.." (reset the previous state of the old sound, if playing) - * Fixes case with devices that can only play one sound at a time - * Otherwise, other sounds in mid-play will be terminated without warning and in a stuck state - */ - - if (_useGlobalHTML5Audio && _a._t && _a._t.playState && _iO.url !== _oldIO.url) { - _a._t.stop(); - } - - // new URL, so reset load/playstate and so on - _resetProperties(); - - _a.src = _iO.url; - _t.url = _iO.url; - _lastURL = _iO.url; - _a._called_load = false; - - } else { - - _s._wD('creating HTML5 Audio() element with URL: '+_dURL); - _a = new Audio(_iO.url); - - _a._called_load = false; - - // android (seen in 2.3/Honeycomb) sometimes fails first .load() -> .play(), results in playback failure and ended() events? - if (_is_android) { - _a._called_load = true; - } - - if (_useGlobalHTML5Audio) { - _s._global_a = _a; - } - - } - - _t.isHTML5 = true; - - // store a ref on the track - _t._a = _a; - - // store a ref on the audio - _a._t = _t; - - _add_html5_events(); - _a.loop = (_iO.loops>1?'loop':''); - - if (_iO.autoLoad || _iO.autoPlay) { - - _t.load(); - - } else { - - // early HTML5 implementation (non-standard) - _a.autobuffer = false; - - // standard - _a.preload = 'none'; - - } - - // boolean instead of "loop", for webkit? - spec says string. http://www.w3.org/TR/html-markup/audio.html#audio.attrs.loop - _a.loop = (_iO.loops > 1 ? 'loop' : ''); - - return _a; - - }; - - _add_html5_events = function() { - - if (_t._a._added_events) { - return false; - } - - var f; - - function add(oEvt, oFn, bCapture) { - return _t._a ? _t._a.addEventListener(oEvt, oFn, bCapture||false) : null; - } - - _s._wD(_h5+'adding event listeners: '+_t.sID); - _t._a._added_events = true; - - for (f in _html5_events) { - if (_html5_events.hasOwnProperty(f)) { - add(f, _html5_events[f]); - } - } - - return true; - - }; - - _remove_html5_events = function() { - - // Remove event listeners - - var f; - - function remove(oEvt, oFn, bCapture) { - return (_t._a ? _t._a.removeEventListener(oEvt, oFn, bCapture||false) : null); - } - - _s._wD(_h5+'removing event listeners: '+_t.sID); - _t._a._added_events = false; - - for (f in _html5_events) { - if (_html5_events.hasOwnProperty(f)) { - remove(f, _html5_events[f]); - } - } - - }; - - /** - * Pseudo-private event internals - * ------------------------------ - */ - - this._onload = function(nSuccess) { - - - var fN, loadOK = !!(nSuccess); - _s._wD(fN + '"' + _t.sID + '"' + (loadOK?' loaded.':' failed to load? - ' + _t.url), (loadOK?1:2)); - - // - fN = 'SMSound._onload(): '; - if (!loadOK && !_t.isHTML5) { - if (_s.sandbox.noRemote === true) { - _s._wD(fN + _str('noNet'), 1); - } - if (_s.sandbox.noLocal === true) { - _s._wD(fN + _str('noLocal'), 1); - } - } - // - - _t.loaded = loadOK; - _t.readyState = loadOK?3:2; - _t._onbufferchange(0); - - if (_t._iO.onload) { - _t._iO.onload.apply(_t, [loadOK]); - } - - return true; - - }; - - this._onbufferchange = function(nIsBuffering) { - - if (_t.playState === 0) { - // ignore if not playing - return false; - } - - if ((nIsBuffering && _t.isBuffering) || (!nIsBuffering && !_t.isBuffering)) { - return false; - } - - _t.isBuffering = (nIsBuffering === 1); - if (_t._iO.onbufferchange) { - _s._wD('SMSound._onbufferchange(): ' + nIsBuffering); - _t._iO.onbufferchange.apply(_t); - } - - return true; - - }; - - /** - * Notify Mobile Safari that user action is required - * to continue playing / loading the audio file. - */ - - this._onsuspend = function() { - - if (_t._iO.onsuspend) { - _s._wD('SMSound._onsuspend()'); - _t._iO.onsuspend.apply(_t); - } - - return true; - - }; - - /** - * flash 9/movieStar + RTMP-only method, should fire only once at most - * at this point we just recreate failed sounds rather than trying to reconnect - */ - - this._onfailure = function(msg, level, code) { - - _t.failures++; - _s._wD('SMSound._onfailure(): "'+_t.sID+'" count '+_t.failures); - - if (_t._iO.onfailure && _t.failures === 1) { - _t._iO.onfailure(_t, msg, level, code); - } else { - _s._wD('SMSound._onfailure(): ignoring'); - } - - }; - - this._onfinish = function() { - - // store local copy before it gets trashed.. - var _io_onfinish = _t._iO.onfinish; - - _t._onbufferchange(0); - _t._resetOnPosition(0); - - // reset some state items - if (_t.instanceCount) { - - _t.instanceCount--; - - if (!_t.instanceCount) { - - // remove onPosition listeners, if any - _detachOnPosition(); - - // reset instance options - _t.playState = 0; - _t.paused = false; - _t.instanceCount = 0; - _t.instanceOptions = {}; - _t._iO = {}; - _stop_html5_timer(); - - } - - if (!_t.instanceCount || _t._iO.multiShotEvents) { - // fire onfinish for last, or every instance - if (_io_onfinish) { - _s._wD('SMSound._onfinish(): "' + _t.sID + '"'); - _io_onfinish.apply(_t); - } - } - - } - - }; - - this._whileloading = function(nBytesLoaded, nBytesTotal, nDuration, nBufferLength) { - - var _iO = _t._iO; - - _t.bytesLoaded = nBytesLoaded; - _t.bytesTotal = nBytesTotal; - _t.duration = Math.floor(nDuration); - _t.bufferLength = nBufferLength; - - if (!_iO.isMovieStar) { - - if (_iO.duration) { - // use options, if specified and larger - _t.durationEstimate = (_t.duration > _iO.duration) ? _t.duration : _iO.duration; - } else { - _t.durationEstimate = parseInt((_t.bytesTotal / _t.bytesLoaded) * _t.duration, 10); - - } - - if (_t.durationEstimate === undefined) { - _t.durationEstimate = _t.duration; - } - - if (_t.readyState !== 3 && _iO.whileloading) { - _iO.whileloading.apply(_t); - } - - } else { - - _t.durationEstimate = _t.duration; - if (_t.readyState !== 3 && _iO.whileloading) { - _iO.whileloading.apply(_t); - } - - } - - }; - - this._whileplaying = function(nPosition, oPeakData, oWaveformDataLeft, oWaveformDataRight, oEQData) { - - var _iO = _t._iO; - - if (isNaN(nPosition) || nPosition === null) { - // flash safety net - return false; - } - - _t.position = nPosition; - _t._processOnPosition(); - - if (!_t.isHTML5 && _fV > 8) { - - if (_iO.usePeakData && typeof oPeakData !== 'undefined' && oPeakData) { - _t.peakData = { - left: oPeakData.leftPeak, - right: oPeakData.rightPeak - }; - } - - if (_iO.useWaveformData && typeof oWaveformDataLeft !== 'undefined' && oWaveformDataLeft) { - _t.waveformData = { - left: oWaveformDataLeft.split(','), - right: oWaveformDataRight.split(',') - }; - } - - if (_iO.useEQData) { - if (typeof oEQData !== 'undefined' && oEQData && oEQData.leftEQ) { - var eqLeft = oEQData.leftEQ.split(','); - _t.eqData = eqLeft; - _t.eqData.left = eqLeft; - if (typeof oEQData.rightEQ !== 'undefined' && oEQData.rightEQ) { - _t.eqData.right = oEQData.rightEQ.split(','); - } - } - } - - } - - if (_t.playState === 1) { - - // special case/hack: ensure buffering is false if loading from cache (and not yet started) - if (!_t.isHTML5 && _fV === 8 && !_t.position && _t.isBuffering) { - _t._onbufferchange(0); - } - - if (_iO.whileplaying) { - // flash may call after actual finish - _iO.whileplaying.apply(_t); - } - - } - - return true; - - }; - - this._onmetadata = function(oMDProps, oMDData) { - - /** - * internal: flash 9 + NetStream (MovieStar/RTMP-only) feature - * RTMP may include song title, MovieStar content may include encoding info - * - * @param {array} oMDProps (names) - * @param {array} oMDData (values) - */ - - _s._wD('SMSound._onmetadata(): "' + this.sID + '" metadata received.'); - - var oData = {}, i, j; - - for (i = 0, j = oMDProps.length; i < j; i++) { - oData[oMDProps[i]] = oMDData[i]; - } - _t.metadata = oData; - - if (_t._iO.onmetadata) { - _t._iO.onmetadata.apply(_t); - } - - }; - - this._onid3 = function(oID3Props, oID3Data) { - - /** - * internal: flash 8 + flash 9 ID3 feature - * may include artist, song title etc. - * - * @param {array} oID3Props (names) - * @param {array} oID3Data (values) - */ - - _s._wD('SMSound._onid3(): "' + this.sID + '" ID3 data received.'); - - var oData = [], i, j; - - for (i = 0, j = oID3Props.length; i < j; i++) { - oData[oID3Props[i]] = oID3Data[i]; - } - _t.id3 = _mixin(_t.id3, oData); - - if (_t._iO.onid3) { - _t._iO.onid3.apply(_t); - } - - }; - - // flash/RTMP-only - - this._onconnect = function(bSuccess) { - - bSuccess = (bSuccess === 1); - _s._wD('SMSound._onconnect(): "'+_t.sID+'"'+(bSuccess?' connected.':' failed to connect? - '+_t.url), (bSuccess?1:2)); - _t.connected = bSuccess; - - if (bSuccess) { - - _t.failures = 0; - - if (_idCheck(_t.sID)) { - if (_t.getAutoPlay()) { - // only update the play state if auto playing - _t.play(undefined, _t.getAutoPlay()); - } else if (_t._iO.autoLoad) { - _t.load(); - } - } - - if (_t._iO.onconnect) { - _t._iO.onconnect.apply(_t, [bSuccess]); - } - - } - - }; - - this._ondataerror = function(sError) { - - // flash 9 wave/eq data handler - // hack: called at start, and end from flash at/after onfinish() - if (_t.playState > 0) { - _s._wD('SMSound._ondataerror(): ' + sError); - if (_t._iO.ondataerror) { - _t._iO.ondataerror.apply(_t); - } - } - - }; - - }; // SMSound() - - /** - * Private SoundManager internals - * ------------------------------ - */ - - _getDocument = function() { - - return (_doc.body || _doc._docElement || _doc.getElementsByTagName('div')[0]); - - }; - - _id = function(sID) { - - return _doc.getElementById(sID); - - }; - - _mixin = function(oMain, oAdd) { - - // non-destructive merge - var o1 = {}, i, o2, o; - - // clone c1 - for (i in oMain) { - if (oMain.hasOwnProperty(i)) { - o1[i] = oMain[i]; - } - } - - o2 = (typeof oAdd === 'undefined'?_s.defaultOptions:oAdd); - for (o in o2) { - if (o2.hasOwnProperty(o) && typeof o1[o] === 'undefined') { - o1[o] = o2[o]; - } - } - return o1; - - }; - - _event = (function() { - - var old = (_win.attachEvent), - evt = { - add: (old?'attachEvent':'addEventListener'), - remove: (old?'detachEvent':'removeEventListener') - }; - - function getArgs(oArgs) { - - var args = _slice.call(oArgs), len = args.length; - - if (old) { - // prefix - args[1] = 'on' + args[1]; - if (len > 3) { - // no capture - args.pop(); - } - } else if (len === 3) { - args.push(false); - } - - return args; - - } - - function apply(args, sType) { - - var element = args.shift(), - method = [evt[sType]]; - - if (old) { - element[method](args[0], args[1]); - } else { - element[method].apply(element, args); - } - - } - - function add() { - - apply(getArgs(arguments), 'add'); - - } - - function remove() { - - apply(getArgs(arguments), 'remove'); - - } - - return { - 'add': add, - 'remove': remove - }; - - }()); - - /** - * Internal HTML5 event handling - * ----------------------------- - */ - - function _html5_event(oFn) { - - // wrap html5 event handlers so we don't call them on destroyed sounds - - return function(e) { - - var t = this._t; - - if (!t || !t._a) { - // - if (t && t.sID) { - _s._wD(_h5+'ignoring '+e.type+': '+t.sID); - } else { - _s._wD(_h5+'ignoring '+e.type); - } - // - return null; - } else { - return oFn.call(this, e); - } - - }; - - } - - _html5_events = { - - // HTML5 event-name-to-handler map - - abort: _html5_event(function(e) { - - _s._wD(_h5+'abort: '+this._t.sID); - - }), - - // enough has loaded to play - - canplay: _html5_event(function(e) { - - var t = this._t; - - if (t._html5_canplay) { - // this event has already fired. ignore. - return true; - } - - t._html5_canplay = true; - _s._wD(_h5+'canplay: '+t.sID+', '+t.url); - t._onbufferchange(0); - var position1K = (!isNaN(t.position)?t.position/1000:null); - - // set the position if position was set before the sound loaded - if (t.position && this.currentTime !== position1K) { - _s._wD(_h5+'canplay: setting position to '+position1K); - try { - this.currentTime = position1K; - } catch(ee) { - _s._wD(_h5+'setting position failed: '+ee.message, 2); - } - } - - // hack for HTML5 from/to case - if (t._iO._oncanplay) { - t._iO._oncanplay(); - } - - }), - - load: _html5_event(function(e) { - - var t = this._t; - - if (!t.loaded) { - t._onbufferchange(0); - // should be 1, and the same - t._whileloading(t.bytesTotal, t.bytesTotal, t._get_html5_duration()); - t._onload(true); - } - - }), - - emptied: _html5_event(function(e) { - - _s._wD(_h5+'emptied: '+this._t.sID); - - }), - - ended: _html5_event(function(e) { - - var t = this._t; - - _s._wD(_h5+'ended: '+t.sID); - t._onfinish(); - - }), - - error: _html5_event(function(e) { - - _s._wD(_h5+'error: '+this.error.code); - // call load with error state? - this._t._onload(false); - - }), - - loadeddata: _html5_event(function(e) { - - var t = this._t, - // at least 1 byte, so math works - bytesTotal = t.bytesTotal || 1; - - _s._wD(_h5+'loadeddata: '+this._t.sID); - - // safari seems to nicely report progress events, eventually totalling 100% - if (!t._loaded && !_isSafari) { - t.duration = t._get_html5_duration(); - // fire whileloading() with 100% values - t._whileloading(bytesTotal, bytesTotal, t._get_html5_duration()); - t._onload(true); - } - - }), - - loadedmetadata: _html5_event(function(e) { - - _s._wD(_h5+'loadedmetadata: '+this._t.sID); - - }), - - loadstart: _html5_event(function(e) { - - _s._wD(_h5+'loadstart: '+this._t.sID); - // assume buffering at first - this._t._onbufferchange(1); - - }), - - play: _html5_event(function(e) { - - _s._wD(_h5+'play: '+this._t.sID+', '+this._t.url); - // once play starts, no buffering - this._t._onbufferchange(0); - - }), - - playing: _html5_event(function(e) { - - _s._wD(_h5+'playing: '+this._t.sID); - - // once play starts, no buffering - this._t._onbufferchange(0); - - }), - - progress: _html5_event(function(e) { - - var t = this._t; - - if (t.loaded) { - return false; - } - - var i, j, str, buffered = 0, - isProgress = (e.type === 'progress'), - ranges = e.target.buffered, - - // firefox 3.6 implements e.loaded/total (bytes) - loaded = (e.loaded||0), - - total = (e.total||1); - - if (ranges && ranges.length) { - - // if loaded is 0, try TimeRanges implementation as % of load - // https://developer.mozilla.org/en/DOM/TimeRanges - - for (i=ranges.length; i--;) { - buffered = (ranges.end(i) - ranges.start(i)); - } - - // linear case, buffer sum; does not account for seeking and HTTP partials / byte ranges - loaded = buffered/e.target.duration; - - // - if (isProgress && ranges.length > 1) { - str = []; - j = ranges.length; - for (i=0; i - - } - - if (!isNaN(loaded)) { - - // if progress, likely not buffering - t._onbufferchange(0); - t._whileloading(loaded, total, t._get_html5_duration()); - if (loaded && total && loaded === total) { - // in case "onload" doesn't fire (eg. gecko 1.9.2) - _html5_events.load.call(this, e); - } - - } - - }), - - ratechange: _html5_event(function(e) { - - _s._wD(_h5+'ratechange: '+this._t.sID); - - }), - - suspend: _html5_event(function(e) { - - // download paused/stopped, may have finished (eg. onload) - var t = this._t; - - _s._wD(_h5+'suspend: '+t.sID); - _html5_events.progress.call(this, e); - t._onsuspend(); - - }), - - stalled: _html5_event(function(e) { - - _s._wD(_h5+'stalled: '+this._t.sID); - - }), - - timeupdate: _html5_event(function(e) { - - this._t._onTimer(); - - }), - - waiting: _html5_event(function(e) { - - var t = this._t; - - // see also: seeking - _s._wD(_h5+'waiting: '+t.sID); - - // playback faster than download rate, etc. - t._onbufferchange(1); - - }) - - }; - - _html5OK = function(iO) { - - // Use type, if specified. If HTML5-only mode, no other options, so just give 'er - return (!iO.serverURL && (iO.type?_html5CanPlay({type:iO.type}):_html5CanPlay({url:iO.url})||_s.html5Only)); - - }; - - _html5Unload = function(oAudio) { - - /** - * Internal method: Unload media, and cancel any current/pending network requests. - * Firefox can load an empty URL, which allegedly destroys the decoder and stops the download. - * https://developer.mozilla.org/En/Using_audio_and_video_in_Firefox#Stopping_the_download_of_media - * Other UA behaviour is unclear, so everyone else gets an about:blank-style URL. - */ - - if (oAudio) { - // Firefox likes '' for unload, most other UAs don't and fail to unload. - oAudio.src = (_is_firefox ? '' : _emptyURL); - } - - }; - - _html5CanPlay = function(o) { - - /** - * Try to find MIME, test and return truthiness - * o = { - * url: '/path/to/an.mp3', - * type: 'audio/mp3' - * } - */ - - if (!_s.useHTML5Audio || !_s.hasHTML5) { - return false; - } - - var url = (o.url || null), - mime = (o.type || null), - aF = _s.audioFormats, - result, - offset, - fileExt, - item; - - function preferFlashCheck(kind) { - - // whether flash should play a given type - return (_s.preferFlash && _hasFlash && !_s.ignoreFlash && (typeof _s.flash[kind] !== 'undefined' && _s.flash[kind])); - - } - - // account for known cases like audio/mp3 - - if (mime && _s.html5[mime] !== 'undefined') { - return (_s.html5[mime] && !preferFlashCheck(mime)); - } - - if (!_html5Ext) { - _html5Ext = []; - for (item in aF) { - if (aF.hasOwnProperty(item)) { - _html5Ext.push(item); - if (aF[item].related) { - _html5Ext = _html5Ext.concat(aF[item].related); - } - } - } - _html5Ext = new RegExp('\\.('+_html5Ext.join('|')+')(\\?.*)?$','i'); - } - - // TODO: Strip URL queries, etc. - fileExt = (url ? url.toLowerCase().match(_html5Ext) : null); - - if (!fileExt || !fileExt.length) { - if (!mime) { - return false; - } else { - // audio/mp3 -> mp3, result should be known - offset = mime.indexOf(';'); - // strip "audio/X; codecs.." - fileExt = (offset !== -1?mime.substr(0,offset):mime).substr(6); - } - } else { - // match the raw extension name - "mp3", for example - fileExt = fileExt[1]; - } - - if (fileExt && typeof _s.html5[fileExt] !== 'undefined') { - // result known - return (_s.html5[fileExt] && !preferFlashCheck(fileExt)); - } else { - mime = 'audio/'+fileExt; - result = _s.html5.canPlayType({type:mime}); - _s.html5[fileExt] = result; - // _s._wD('canPlayType, found result: '+result); - return (result && _s.html5[mime] && !preferFlashCheck(mime)); - } - - }; - - _testHTML5 = function() { - - if (!_s.useHTML5Audio || typeof Audio === 'undefined') { - return false; - } - - // double-whammy: Opera 9.64 throws WRONG_ARGUMENTS_ERR if no parameter passed to Audio(), and Webkit + iOS happily tries to load "null" as a URL. :/ - var a = (typeof Audio !== 'undefined' ? (_isOpera ? new Audio(null) : new Audio()) : null), - item, support = {}, aF, i; - - function _cp(m) { - - var canPlay, i, j, isOK = false; - - if (!a || typeof a.canPlayType !== 'function') { - return false; - } - - if (m instanceof Array) { - // iterate through all mime types, return any successes - for (i=0, j=m.length; i - notReady: 'Not loaded yet - wait for soundManager.onload()/onready()', - notOK: 'Audio support is not available.', - domError: _smc + 'createMovie(): appendChild/innerHTML call failed. DOM not ready or other error.', - spcWmode: _smc + 'createMovie(): Removing wmode, preventing known SWF loading issue(s)', - swf404: _sm + ': Verify that %s is a valid path.', - tryDebug: 'Try ' + _sm + '.debugFlash = true for more security details (output goes to SWF.)', - checkSWF: 'See SWF output for more debug info.', - localFail: _sm + ': Non-HTTP page (' + _doc.location.protocol + ' URL?) Review Flash player security settings for this special case:\nhttp://www.macromedia.com/support/documentation/en/flashplayer/help/settings_manager04.html\nMay need to add/allow path, eg. c:/sm2/ or /users/me/sm2/', - waitFocus: _sm + ': Special case: Waiting for focus-related event..', - waitImpatient: _sm + ': Getting impatient, still waiting for Flash%s...', - waitForever: _sm + ': Waiting indefinitely for Flash (will recover if unblocked)...', - needFunction: _sm + ': Function object expected for %s', - badID: 'Warning: Sound ID "%s" should be a string, starting with a non-numeric character', - currentObj: '--- ' + _sm + '._debug(): Current sound objects ---', - waitEI: _smc + 'initMovie(): Waiting for ExternalInterface call from Flash..', - waitOnload: _sm + ': Waiting for window.onload()', - docLoaded: _sm + ': Document already loaded', - onload: _smc + 'initComplete(): calling soundManager.onload()', - onloadOK: _sm + '.onload() complete', - init: _smc + 'init()', - didInit: _smc + 'init(): Already called?', - flashJS: _sm + ': Attempting to call Flash from JS..', - secNote: 'Flash security note: Network/internet URLs will not load due to security restrictions. Access can be configured via Flash Player Global Security Settings Page: http://www.macromedia.com/support/documentation/en/flashplayer/help/settings_manager04.html', - badRemove: 'Warning: Failed to remove flash movie.', - noPeak: 'Warning: peakData features unsupported for movieStar formats', - shutdown: _sm + '.disable(): Shutting down', - queue: _sm + ': Queueing %s handler', - smFail: _sm + ': Failed to initialise.', - smError: 'SMSound.load(): Exception: JS-Flash communication failed, or JS error.', - fbTimeout: 'No flash response, applying .'+_swfCSS.swfTimedout+' CSS..', - fbLoaded: 'Flash loaded', - fbHandler: _smc+'flashBlockHandler()', - manURL: 'SMSound.load(): Using manually-assigned URL', - onURL: _sm + '.load(): current URL already assigned.', - badFV: _sm + '.flashVersion must be 8 or 9. "%s" is invalid. Reverting to %s.', - as2loop: 'Note: Setting stream:false so looping can work (flash 8 limitation)', - noNSLoop: 'Note: Looping not implemented for MovieStar formats', - needfl9: 'Note: Switching to flash 9, required for MP4 formats.', - mfTimeout: 'Setting flashLoadTimeout = 0 (infinite) for off-screen, mobile flash case', - mfOn: 'mobileFlash::enabling on-screen flash repositioning', - policy: 'Enabling usePolicyFile for data access' - // - - }; - - _str = function() { - - // internal string replace helper. - // arguments: o [,items to replace] - // - - // real array, please - var args = _slice.call(arguments), - - // first arg - o = args.shift(), - - str = (_strings && _strings[o]?_strings[o]:''), i, j; - if (str && args && args.length) { - for (i = 0, j = args.length; i < j; i++) { - str = str.replace('%s', args[i]); - } - } - - return str; - // - - }; - - _loopFix = function(sOpt) { - - // flash 8 requires stream = false for looping to work - if (_fV === 8 && sOpt.loops > 1 && sOpt.stream) { - _wDS('as2loop'); - sOpt.stream = false; - } - - return sOpt; - - }; - - _policyFix = function(sOpt, sPre) { - - if (sOpt && !sOpt.usePolicyFile && (sOpt.onid3 || sOpt.usePeakData || sOpt.useWaveformData || sOpt.useEQData)) { - _s._wD((sPre || '') + _str('policy')); - sOpt.usePolicyFile = true; - } - - return sOpt; - - }; - - _complain = function(sMsg) { - - // - if (typeof console !== 'undefined' && typeof console.warn !== 'undefined') { - console.warn(sMsg); - } else { - _s._wD(sMsg); - } - // - - }; - - _doNothing = function() { - - return false; - - }; - - _disableObject = function(o) { - - var oProp; - - for (oProp in o) { - if (o.hasOwnProperty(oProp) && typeof o[oProp] === 'function') { - o[oProp] = _doNothing; - } - } - - oProp = null; - - }; - - _failSafely = function(bNoDisable) { - - // general failure exception handler - - if (typeof bNoDisable === 'undefined') { - bNoDisable = false; - } - - if (_disabled || bNoDisable) { - _wDS('smFail', 2); - _s.disable(bNoDisable); - } - - }; - - _normalizeMovieURL = function(smURL) { - - var urlParams = null, url; - - if (smURL) { - if (smURL.match(/\.swf(\?.*)?$/i)) { - urlParams = smURL.substr(smURL.toLowerCase().lastIndexOf('.swf?') + 4); - if (urlParams) { - // assume user knows what they're doing - return smURL; - } - } else if (smURL.lastIndexOf('/') !== smURL.length - 1) { - // append trailing slash, if needed - smURL += '/'; - } - } - - url = (smURL && smURL.lastIndexOf('/') !== - 1 ? smURL.substr(0, smURL.lastIndexOf('/') + 1) : './') + _s.movieURL; - - if (_s.noSWFCache) { - url += ('?ts=' + new Date().getTime()); - } - - return url; - - }; - - _setVersionInfo = function() { - - // short-hand for internal use - - _fV = parseInt(_s.flashVersion, 10); - - if (_fV !== 8 && _fV !== 9) { - _s._wD(_str('badFV', _fV, _defaultFlashVersion)); - _s.flashVersion = _fV = _defaultFlashVersion; - } - - // debug flash movie, if applicable - - var isDebug = (_s.debugMode || _s.debugFlash?'_debug.swf':'.swf'); - - if (_s.useHTML5Audio && !_s.html5Only && _s.audioFormats.mp4.required && _fV < 9) { - _s._wD(_str('needfl9')); - _s.flashVersion = _fV = 9; - } - - _s.version = _s.versionNumber + (_s.html5Only?' (HTML5-only mode)':(_fV === 9?' (AS3/Flash 9)':' (AS2/Flash 8)')); - - // set up default options - if (_fV > 8) { - // +flash 9 base options - _s.defaultOptions = _mixin(_s.defaultOptions, _s.flash9Options); - _s.features.buffering = true; - // +moviestar support - _s.defaultOptions = _mixin(_s.defaultOptions, _s.movieStarOptions); - _s.filePatterns.flash9 = new RegExp('\\.(mp3|' + _netStreamTypes.join('|') + ')(\\?.*)?$', 'i'); - _s.features.movieStar = true; - } else { - _s.features.movieStar = false; - } - - // regExp for flash canPlay(), etc. - _s.filePattern = _s.filePatterns[(_fV !== 8?'flash9':'flash8')]; - - // if applicable, use _debug versions of SWFs - _s.movieURL = (_fV === 8?'soundmanager2.swf':'soundmanager2_flash9.swf').replace('.swf', isDebug); - - _s.features.peakData = _s.features.waveformData = _s.features.eqData = (_fV > 8); - - }; - - _setPolling = function(bPolling, bHighPerformance) { - - if (!_flash) { - return false; - } - - _flash._setPolling(bPolling, bHighPerformance); - - }; - - _initDebug = function() { - - // starts debug mode, creating output
    for UAs without console object - - // allow force of debug mode via URL - if (_s.debugURLParam.test(_wl)) { - _s.debugMode = true; - } - - // - if (_id(_s.debugID)) { - return false; - } - - var oD, oDebug, oTarget, oToggle, tmp; - - if (_s.debugMode && !_id(_s.debugID) && (!_hasConsole || !_s.useConsole || !_s.consoleOnly)) { - - oD = _doc.createElement('div'); - oD.id = _s.debugID + '-toggle'; - - oToggle = { - 'position': 'fixed', - 'bottom': '0px', - 'right': '0px', - 'width': '1.2em', - 'height': '1.2em', - 'lineHeight': '1.2em', - 'margin': '2px', - 'textAlign': 'center', - 'border': '1px solid #999', - 'cursor': 'pointer', - 'background': '#fff', - 'color': '#333', - 'zIndex': 10001 - }; - - oD.appendChild(_doc.createTextNode('-')); - oD.onclick = _toggleDebug; - oD.title = 'Toggle SM2 debug console'; - - if (_ua.match(/msie 6/i)) { - oD.style.position = 'absolute'; - oD.style.cursor = 'hand'; - } - - for (tmp in oToggle) { - if (oToggle.hasOwnProperty(tmp)) { - oD.style[tmp] = oToggle[tmp]; - } - } - - oDebug = _doc.createElement('div'); - oDebug.id = _s.debugID; - oDebug.style.display = (_s.debugMode?'block':'none'); - - if (_s.debugMode && !_id(oD.id)) { - try { - oTarget = _getDocument(); - oTarget.appendChild(oD); - } catch(e2) { - throw new Error(_str('domError')+' \n'+e2.toString()); - } - oTarget.appendChild(oDebug); - } - - } - - oTarget = null; - // - - }; - - _idCheck = this.getSoundById; - - // - _wDS = function(o, errorLevel) { - - if (!o) { - return ''; - } else { - return _s._wD(_str(o), errorLevel); - } - - }; - - // last-resort debugging option - - if (_wl.indexOf('sm2-debug=alert') + 1 && _s.debugMode) { - _s._wD = function(sText) {window.alert(sText);}; - } - - _toggleDebug = function() { - - var o = _id(_s.debugID), - oT = _id(_s.debugID + '-toggle'); - - if (!o) { - return false; - } - - if (_debugOpen) { - // minimize - oT.innerHTML = '+'; - o.style.display = 'none'; - } else { - oT.innerHTML = '-'; - o.style.display = 'block'; - } - - _debugOpen = !_debugOpen; - - }; - - _debugTS = function(sEventType, bSuccess, sMessage) { - - // troubleshooter debug hooks - - if (typeof sm2Debugger !== 'undefined') { - try { - sm2Debugger.handleEvent(sEventType, bSuccess, sMessage); - } catch(e) { - // oh well - } - } - - return true; - - }; - // - - _getSWFCSS = function() { - - var css = []; - - if (_s.debugMode) { - css.push(_swfCSS.sm2Debug); - } - - if (_s.debugFlash) { - css.push(_swfCSS.flashDebug); - } - - if (_s.useHighPerformance) { - css.push(_swfCSS.highPerf); - } - - return css.join(' '); - - }; - - _flashBlockHandler = function() { - - // *possible* flash block situation. - - var name = _str('fbHandler'), - p = _s.getMoviePercent(), - css = _swfCSS, - error = {type:'FLASHBLOCK'}; - - if (_s.html5Only) { - return false; - } - - if (!_s.ok()) { - - if (_needsFlash) { - // make the movie more visible, so user can fix - _s.oMC.className = _getSWFCSS() + ' ' + css.swfDefault + ' ' + (p === null?css.swfTimedout:css.swfError); - _s._wD(name+': '+_str('fbTimeout')+(p?' ('+_str('fbLoaded')+')':'')); - } - - _s.didFlashBlock = true; - - // fire onready(), complain lightly - _processOnEvents({type:'ontimeout', ignoreInit:true, error:error}); - _catchError(error); - - } else { - - // SM2 loaded OK (or recovered) - - // - if (_s.didFlashBlock) { - _s._wD(name+': Unblocked'); - } - // - - if (_s.oMC) { - _s.oMC.className = [_getSWFCSS(), css.swfDefault, css.swfLoaded + (_s.didFlashBlock?' '+css.swfUnblocked:'')].join(' '); - } - - } - - }; - - _addOnEvent = function(sType, oMethod, oScope) { - - if (typeof _on_queue[sType] === 'undefined') { - _on_queue[sType] = []; - } - - _on_queue[sType].push({ - 'method': oMethod, - 'scope': (oScope || null), - 'fired': false - }); - - }; - - _processOnEvents = function(oOptions) { - - // assume onready, if unspecified - - if (!oOptions) { - oOptions = { - type: 'onready' - }; - } - - if (!_didInit && oOptions && !oOptions.ignoreInit) { - // not ready yet. - return false; - } - - if (oOptions.type === 'ontimeout' && _s.ok()) { - // invalid case - return false; - } - - var status = { - success: (oOptions && oOptions.ignoreInit?_s.ok():!_disabled) - }, - - // queue specified by type, or none - srcQueue = (oOptions && oOptions.type?_on_queue[oOptions.type]||[]:[]), - - queue = [], i, j, - args = [status], - canRetry = (_needsFlash && _s.useFlashBlock && !_s.ok()); - - if (oOptions.error) { - args[0].error = oOptions.error; - } - - for (i = 0, j = srcQueue.length; i < j; i++) { - if (srcQueue[i].fired !== true) { - queue.push(srcQueue[i]); - } - } - - if (queue.length) { - _s._wD(_sm + ': Firing ' + queue.length + ' '+oOptions.type+'() item' + (queue.length === 1?'':'s')); - for (i = 0, j = queue.length; i < j; i++) { - if (queue[i].scope) { - queue[i].method.apply(queue[i].scope, args); - } else { - queue[i].method.apply(this, args); - } - if (!canRetry) { - // flashblock case doesn't count here - queue[i].fired = true; - } - } - } - - return true; - - }; - - _initUserOnload = function() { - - _win.setTimeout(function() { - - if (_s.useFlashBlock) { - _flashBlockHandler(); - } - - _processOnEvents(); - - // call user-defined "onload", scoped to window - - if (_s.onload instanceof Function) { - _wDS('onload', 1); - _s.onload.apply(_win); - _wDS('onloadOK', 1); - } - - if (_s.waitForWindowLoad) { - _event.add(_win, 'load', _initUserOnload); - } - - },1); - - }; - - _detectFlash = function() { - - // hat tip: Flash Detect library (BSD, (C) 2007) by Carl "DocYes" S. Yestrau - http://featureblend.com/javascript-flash-detection-library.html / http://featureblend.com/license.txt - - if (_hasFlash !== undefined) { - // this work has already been done. - return _hasFlash; - } - - var hasPlugin = false, n = navigator, nP = n.plugins, obj, type, types, AX = _win.ActiveXObject; - - if (nP && nP.length) { - type = 'application/x-shockwave-flash'; - types = n.mimeTypes; - if (types && types[type] && types[type].enabledPlugin && types[type].enabledPlugin.description) { - hasPlugin = true; - } - } else if (typeof AX !== 'undefined') { - try { - obj = new AX('ShockwaveFlash.ShockwaveFlash'); - } catch(e) { - // oh well - } - hasPlugin = (!!obj); - } - - _hasFlash = hasPlugin; - - return hasPlugin; - - }; - - _featureCheck = function() { - - var needsFlash, item, - - // iPhone <= 3.1 has broken HTML5 audio(), but firmware 3.2 (iPad) + iOS4 works. - isSpecial = (_is_iDevice && !!(_ua.match(/os (1|2|3_0|3_1)/i))); - - if (isSpecial) { - - // has Audio(), but is broken; let it load links directly. - _s.hasHTML5 = false; - - // ignore flash case, however - _s.html5Only = true; - - if (_s.oMC) { - _s.oMC.style.display = 'none'; - } - - return false; - - } - - if (_s.useHTML5Audio) { - - if (!_s.html5 || !_s.html5.canPlayType) { - _s._wD('SoundManager: No HTML5 Audio() support detected.'); - _s.hasHTML5 = false; - return true; - } else { - _s.hasHTML5 = true; - } - if (_isBadSafari) { - _s._wD(_smc+'Note: Buggy HTML5 Audio in Safari on this OS X release, see https://bugs.webkit.org/show_bug.cgi?id=32159 - '+(!_hasFlash?' would use flash fallback for MP3/MP4, but none detected.':'will use flash fallback for MP3/MP4, if available'),1); - if (_detectFlash()) { - return true; - } - } - } else { - - // flash needed (or, HTML5 needs enabling.) - return true; - - } - - for (item in _s.audioFormats) { - if (_s.audioFormats.hasOwnProperty(item)) { - if ((_s.audioFormats[item].required && !_s.html5.canPlayType(_s.audioFormats[item].type)) || _s.flash[item] || _s.flash[_s.audioFormats[item].type]) { - // flash may be required, or preferred for this format - needsFlash = true; - } - } - } - - // sanity check.. - if (_s.ignoreFlash) { - needsFlash = false; - } - - _s.html5Only = (_s.hasHTML5 && _s.useHTML5Audio && !needsFlash); - - return (!_s.html5Only); - - }; - - _parseURL = function(url) { - - /** - * Internal: Finds and returns the first playable URL (or failing that, the first URL.) - * @param {string or array} url A single URL string, OR, an array of URL strings or {url:'/path/to/resource', type:'audio/mp3'} objects. - */ - - var i, j, result = 0; - - if (url instanceof Array) { - - // find the first good one - for (i=0, j=url.length; i - var sb = _s.sandbox; - - sb.type = sandboxType; - sb.description = sb.types[(typeof sb.types[sandboxType] !== 'undefined'?sandboxType:'unknown')]; - - _s._wD('Flash security sandbox type: ' + sb.type); - - if (sb.type === 'localWithFile') { - - sb.noRemote = true; - sb.noLocal = false; - _wDS('secNote', 2); - - } else if (sb.type === 'localWithNetwork') { - - sb.noRemote = false; - sb.noLocal = true; - - } else if (sb.type === 'localTrusted') { - - sb.noRemote = false; - sb.noLocal = false; - - } - // - - }; - - this._externalInterfaceOK = function(flashDate, swfVersion) { - - // flash callback confirming flash loaded, EI working etc. - // flashDate = approx. timing/delay info for JS/flash bridge - // swfVersion: SWF build string - - if (_s.swfLoaded) { - return false; - } - - var e, eiTime = new Date().getTime(); - - _s._wD(_smc+'externalInterfaceOK()' + (flashDate?' (~' + (eiTime - flashDate) + ' ms)':'')); - _debugTS('swf', true); - _debugTS('flashtojs', true); - _s.swfLoaded = true; - _tryInitOnFocus = false; - - if (_isBadSafari) { - _badSafariFix(); - } - - // complain if JS + SWF build/version strings don't match, excluding +DEV builds - // - if (!swfVersion || swfVersion.replace(/\+dev/i,'') !== _s.versionNumber.replace(/\+dev/i, '')) { - - e = _sm + ': Fatal: JavaScript file build "' + _s.versionNumber + '" does not match Flash SWF build "' + swfVersion + '" at ' + _s.url + '. Ensure both are up-to-date.'; - - // escape flash -> JS stack so this error fires in window. - setTimeout(function versionMismatch() { - throw new Error(e); - }, 0); - - // exit, init will fail with timeout - return false; - - } - // - - if (_isIE) { - // IE needs a timeout OR delay until window.onload - may need TODO: investigating - setTimeout(_init, 100); - } else { - _init(); - } - - }; - - /** - * Private initialization helpers - * ------------------------------ - */ - - _createMovie = function(smID, smURL) { - - if (_didAppend && _appendSuccess) { - // ignore if already succeeded - return false; - } - - function _initMsg() { - _s._wD('-- SoundManager 2 ' + _s.version + (!_s.html5Only && _s.useHTML5Audio?(_s.hasHTML5?' + HTML5 audio':', no HTML5 audio support'):'') + (!_s.html5Only ? (_s.useHighPerformance?', high performance mode, ':', ') + (( _s.flashPollingInterval ? 'custom (' + _s.flashPollingInterval + 'ms)' : 'normal') + ' polling') + (_s.wmode?', wmode: ' + _s.wmode:'') + (_s.debugFlash?', flash debug mode':'') + (_s.useFlashBlock?', flashBlock mode':'') : '') + ' --', 1); - } - - if (_s.html5Only) { - - // 100% HTML5 mode - _setVersionInfo(); - - _initMsg(); - _s.oMC = _id(_s.movieID); - _init(); - - // prevent multiple init attempts - _didAppend = true; - - _appendSuccess = true; - - return false; - - } - - // flash path - var remoteURL = (smURL || _s.url), - localURL = (_s.altURL || remoteURL), - swfTitle = 'JS/Flash audio component (SoundManager 2)', - oEmbed, oMovie, oTarget = _getDocument(), tmp, movieHTML, oEl, extraClass = _getSWFCSS(), - s, x, sClass, side = 'auto', isRTL = null, - html = _doc.getElementsByTagName('html')[0]; - - isRTL = (html && html.dir && html.dir.match(/rtl/i)); - smID = (typeof smID === 'undefined'?_s.id:smID); - - function param(name, value) { - return ''; - } - - // safety check for legacy (change to Flash 9 URL) - _setVersionInfo(); - _s.url = _normalizeMovieURL("inc/SoundManager2/swf/"); - smURL = _s.url; - - _s.wmode = (!_s.wmode && _s.useHighPerformance ? 'transparent' : _s.wmode); - - if (_s.wmode !== null && (_ua.match(/msie 8/i) || (!_isIE && !_s.useHighPerformance)) && navigator.platform.match(/win32|win64/i)) { - /** - * extra-special case: movie doesn't load until scrolled into view when using wmode = anything but 'window' here - * does not apply when using high performance (position:fixed means on-screen), OR infinite flash load timeout - * wmode breaks IE 8 on Vista + Win7 too in some cases, as of January 2011 (?) - */ - _wDS('spcWmode'); - _s.wmode = null; - } - - oEmbed = { - 'name': smID, - 'id': smID, - 'src': smURL, - 'width': side, - 'height': side, - 'quality': 'high', - 'allowScriptAccess': _s.allowScriptAccess, - 'bgcolor': _s.bgColor, - 'pluginspage': _http+'www.macromedia.com/go/getflashplayer', - 'title': swfTitle, - 'type': 'application/x-shockwave-flash', - 'wmode': _s.wmode, - // http://help.adobe.com/en_US/as3/mobile/WS4bebcd66a74275c36cfb8137124318eebc6-7ffd.html - 'hasPriority': 'true' - }; - - if (_s.debugFlash) { - oEmbed.FlashVars = 'debug=1'; - } - - if (!_s.wmode) { - // don't write empty attribute - delete oEmbed.wmode; - } - - if (_isIE) { - - // IE is "special". - oMovie = _doc.createElement('div'); - movieHTML = [ - '', - param('movie', smURL), - param('AllowScriptAccess', _s.allowScriptAccess), - param('quality', oEmbed.quality), - (_s.wmode? param('wmode', _s.wmode): ''), - param('bgcolor', _s.bgColor), - param('hasPriority', 'true'), - (_s.debugFlash ? param('FlashVars', oEmbed.FlashVars) : ''), - '' - ].join(''); - - } else { - - oMovie = _doc.createElement('embed'); - for (tmp in oEmbed) { - if (oEmbed.hasOwnProperty(tmp)) { - oMovie.setAttribute(tmp, oEmbed[tmp]); - } - } - - } - - _initDebug(); - extraClass = _getSWFCSS(); - oTarget = _getDocument(); - - if (oTarget) { - - _s.oMC = (_id(_s.movieID) || _doc.createElement('div')); - - if (!_s.oMC.id) { - - _s.oMC.id = _s.movieID; - _s.oMC.className = _swfCSS.swfDefault + ' ' + extraClass; - s = null; - oEl = null; - - if (!_s.useFlashBlock) { - if (_s.useHighPerformance) { - // on-screen at all times - s = { - 'position': 'fixed', - 'width': '8px', - 'height': '8px', - // >= 6px for flash to run fast, >= 8px to start up under Firefox/win32 in some cases. odd? yes. - 'bottom': '0px', - 'left': '0px', - 'overflow': 'hidden' - }; - } else { - // hide off-screen, lower priority - s = { - 'position': 'absolute', - 'width': '6px', - 'height': '6px', - 'top': '-9999px', - 'left': '-9999px' - }; - if (isRTL) { - s.left = Math.abs(parseInt(s.left,10))+'px'; - } - } - } - - if (_isWebkit) { - // soundcloud-reported render/crash fix, safari 5 - _s.oMC.style.zIndex = 10000; - } - - if (!_s.debugFlash) { - for (x in s) { - if (s.hasOwnProperty(x)) { - _s.oMC.style[x] = s[x]; - } - } - } - - try { - if (!_isIE) { - _s.oMC.appendChild(oMovie); - } - oTarget.appendChild(_s.oMC); - if (_isIE) { - oEl = _s.oMC.appendChild(_doc.createElement('div')); - oEl.className = _swfCSS.swfBox; - oEl.innerHTML = movieHTML; - } - _appendSuccess = true; - } catch(e) { - throw new Error(_str('domError')+' \n'+e.toString()); - } - - } else { - - // SM2 container is already in the document (eg. flashblock use case) - sClass = _s.oMC.className; - _s.oMC.className = (sClass?sClass+' ':_swfCSS.swfDefault) + (extraClass?' '+extraClass:''); - _s.oMC.appendChild(oMovie); - if (_isIE) { - oEl = _s.oMC.appendChild(_doc.createElement('div')); - oEl.className = _swfCSS.swfBox; - oEl.innerHTML = movieHTML; - } - _appendSuccess = true; - - } - - } - - _didAppend = true; - _initMsg(); - _s._wD(_smc+'createMovie(): Trying to load ' + smURL + (!_overHTTP && _s.altURL?' (alternate URL)':''), 1); - - return true; - - }; - - _initMovie = function() { - - if (_s.html5Only) { - _createMovie(); - return false; - } - - // attempt to get, or create, movie - // may already exist - if (_flash) { - return false; - } - - // inline markup case - _flash = _s.getMovie(_s.id); - - if (!_flash) { - if (!_oRemoved) { - // try to create - _createMovie(_s.id, _s.url); - } else { - // try to re-append removed movie after reboot() - if (!_isIE) { - _s.oMC.appendChild(_oRemoved); - } else { - _s.oMC.innerHTML = _oRemovedHTML; - } - _oRemoved = null; - _didAppend = true; - } - _flash = _s.getMovie(_s.id); - } - - // - if (_flash) { - _wDS('waitEI'); - } - // - - if (_s.oninitmovie instanceof Function) { - setTimeout(_s.oninitmovie, 1); - } - - return true; - - }; - - _delayWaitForEI = function() { - - setTimeout(_waitForEI, 1000); - - }; - - _waitForEI = function() { - - if (_waitingForEI) { - return false; - } - - _waitingForEI = true; - _event.remove(_win, 'load', _delayWaitForEI); - - if (_tryInitOnFocus && !_isFocused) { - // giant Safari 3.1 hack - assume mousemove = focus given lack of focus event - _wDS('waitFocus'); - return false; - } - - var p; - if (!_didInit) { - p = _s.getMoviePercent(); - _s._wD(_str('waitImpatient', (p === 100?' (SWF loaded)':(p > 0?' (SWF ' + p + '% loaded)':'')))); - } - - setTimeout(function() { - - p = _s.getMoviePercent(); - - // - if (!_didInit) { - _s._wD(_sm + ': No Flash response within expected time.\nLikely causes: ' + (p === 0?'Loading ' + _s.movieURL + ' may have failed (and/or Flash ' + _fV + '+ not present?), ':'') + 'Flash blocked or JS-Flash security error.' + (_s.debugFlash?' ' + _str('checkSWF'):''), 2); - if (!_overHTTP && p) { - _wDS('localFail', 2); - if (!_s.debugFlash) { - _wDS('tryDebug', 2); - } - } - if (p === 0) { - // if 0 (not null), probably a 404. - _s._wD(_str('swf404', _s.url)); - } - _debugTS('flashtojs', false, ': Timed out' + _overHTTP?' (Check flash security or flash blockers)':' (No plugin/missing SWF?)'); - } - // - - // give up / time-out, depending - - if (!_didInit && _okToDisable) { - if (p === null) { - // SWF failed. Maybe blocked. - if (_s.useFlashBlock || _s.flashLoadTimeout === 0) { - if (_s.useFlashBlock) { - _flashBlockHandler(); - } - _wDS('waitForever'); - } else { - // old SM2 behaviour, simply fail - _failSafely(true); - } - } else { - // flash loaded? Shouldn't be a blocking issue, then. - if (_s.flashLoadTimeout === 0) { - _wDS('waitForever'); - } else { - _failSafely(true); - } - } - } - - }, _s.flashLoadTimeout); - - }; - - _handleFocus = function() { - - function cleanup() { - _event.remove(_win, 'focus', _handleFocus); - _event.remove(_win, 'load', _handleFocus); - } - - if (_isFocused || !_tryInitOnFocus) { - cleanup(); - return true; - } - - _okToDisable = true; - _isFocused = true; - _s._wD(_smc+'handleFocus()'); - - if (_isSafari && _tryInitOnFocus) { - _event.remove(_win, 'mousemove', _handleFocus); - } - - // allow init to restart - _waitingForEI = false; - - cleanup(); - return true; - - }; - - _showSupport = function() { - - var item, tests = []; - - if (_s.useHTML5Audio && _s.hasHTML5) { - for (item in _s.audioFormats) { - if (_s.audioFormats.hasOwnProperty(item)) { - tests.push(item + ': ' + _s.html5[item] + (!_s.html5[item] && _hasFlash && _s.flash[item] ? ' (using flash)' : (_s.preferFlash && _s.flash[item] && _hasFlash ? ' (preferring flash)': (!_s.html5[item] ? ' (' + (_s.audioFormats[item].required ? 'required, ':'') + 'and no flash support)' : '')))); - } - } - _s._wD('-- SoundManager 2: HTML5 support tests ('+_s.html5Test+'): '+tests.join(', ')+' --',1); - } - - }; - - _initComplete = function(bNoDisable) { - - if (_didInit) { - return false; - } - - if (_s.html5Only) { - // all good. - _s._wD('-- SoundManager 2: loaded --'); - _didInit = true; - _initUserOnload(); - _debugTS('onload', true); - return true; - } - - var wasTimeout = (_s.useFlashBlock && _s.flashLoadTimeout && !_s.getMoviePercent()), - error; - - if (!wasTimeout) { - _didInit = true; - if (_disabled) { - error = {type: (!_hasFlash && _needsFlash ? 'NO_FLASH' : 'INIT_TIMEOUT')}; - } - } - - _s._wD('-- SoundManager 2 ' + (_disabled?'failed to load':'loaded') + ' (' + (_disabled?'security/load error':'OK') + ') --', 1); - - if (_disabled || bNoDisable) { - if (_s.useFlashBlock && _s.oMC) { - _s.oMC.className = _getSWFCSS() + ' ' + (_s.getMoviePercent() === null?_swfCSS.swfTimedout:_swfCSS.swfError); - } - _processOnEvents({type:'ontimeout', error:error}); - _debugTS('onload', false); - _catchError(error); - return false; - } else { - _debugTS('onload', true); - } - - if (_s.waitForWindowLoad && !_windowLoaded) { - _wDS('waitOnload'); - _event.add(_win, 'load', _initUserOnload); - return false; - } else { - // - if (_s.waitForWindowLoad && _windowLoaded) { - _wDS('docLoaded'); - } - // - _initUserOnload(); - } - - return true; - - }; - - _init = function() { - - _wDS('init'); - - // called after onload() - - if (_didInit) { - _wDS('didInit'); - return false; - } - - function _cleanup() { - _event.remove(_win, 'load', _s.beginDelayedInit); - } - - if (_s.html5Only) { - if (!_didInit) { - // we don't need no steenking flash! - _cleanup(); - _s.enabled = true; - _initComplete(); - } - return true; - } - - // flash path - _initMovie(); - - try { - - _wDS('flashJS'); - - // attempt to talk to Flash - _flash._externalInterfaceTest(false); - - // apply user-specified polling interval, OR, if "high performance" set, faster vs. default polling - // (determines frequency of whileloading/whileplaying callbacks, effectively driving UI framerates) - _setPolling(true, (_s.flashPollingInterval || (_s.useHighPerformance ? 10 : 50))); - - if (!_s.debugMode) { - // stop the SWF from making debug output calls to JS - _flash._disableDebug(); - } - - _s.enabled = true; - _debugTS('jstoflash', true); - - if (!_s.html5Only) { - // prevent browser from showing cached page state (or rather, restoring "suspended" page state) via back button, because flash may be dead - // http://www.webkit.org/blog/516/webkit-page-cache-ii-the-unload-event/ - _event.add(_win, 'unload', _doNothing); - } - - } catch(e) { - - _s._wD('js/flash exception: ' + e.toString()); - _debugTS('jstoflash', false); - _catchError({type:'JS_TO_FLASH_EXCEPTION', fatal:true}); - // don't disable, for reboot() - _failSafely(true); - _initComplete(); - - return false; - - } - - _initComplete(); - - // disconnect events - _cleanup(); - - return true; - - }; - - _domContentLoaded = function() { - - if (_didDCLoaded) { - return false; - } - - _didDCLoaded = true; - _initDebug(); - - /** - * Temporary feature: allow force of HTML5 via URL params: sm2-usehtml5audio=0 or 1 - * Ditto for sm2-preferFlash, too. - */ - // - (function(){ - - var a = 'sm2-usehtml5audio=', l = _wl.toLowerCase(), b = null, - a2 = 'sm2-preferflash=', b2 = null, hasCon = (typeof console !== 'undefined' && typeof console.log !== 'undefined'); - - if (l.indexOf(a) !== -1) { - b = (l.charAt(l.indexOf(a)+a.length) === '1'); - if (hasCon) { - console.log((b?'Enabling ':'Disabling ')+'useHTML5Audio via URL parameter'); - } - _s.useHTML5Audio = b; - } - - if (l.indexOf(a2) !== -1) { - b2 = (l.charAt(l.indexOf(a2)+a2.length) === '1'); - if (hasCon) { - console.log((b2?'Enabling ':'Disabling ')+'preferFlash via URL parameter'); - } - _s.preferFlash = b2; - } - - }()); - // - - if (!_hasFlash && _s.hasHTML5) { - _s._wD('SoundManager: No Flash detected'+(!_s.useHTML5Audio?', enabling HTML5.':'. Trying HTML5-only mode.')); - _s.useHTML5Audio = true; - // make sure we aren't preferring flash, either - // TODO: preferFlash should not matter if flash is not installed. Currently, stuff breaks without the below tweak. - _s.preferFlash = false; - } - - _testHTML5(); - _s.html5.usingFlash = _featureCheck(); - _needsFlash = _s.html5.usingFlash; - _showSupport(); - - if (!_hasFlash && _needsFlash) { - _s._wD('SoundManager: Fatal error: Flash is needed to play some required formats, but is not available.'); - // TODO: Fatal here vs. timeout approach, etc. - // hack: fail sooner. - _s.flashLoadTimeout = 1; - } - - if (_doc.removeEventListener) { - _doc.removeEventListener('DOMContentLoaded', _domContentLoaded, false); - } - - _initMovie(); - return true; - - }; - - _domContentLoadedIE = function() { - - if (_doc.readyState === 'complete') { - _domContentLoaded(); - _doc.detachEvent('onreadystatechange', _domContentLoadedIE); - } - - return true; - - }; - - _winOnLoad = function() { - // catch edge case of _initComplete() firing after window.load() - _windowLoaded = true; - _event.remove(_win, 'load', _winOnLoad); - }; - - // sniff up-front - _detectFlash(); - - // focus and window load, init (primarily flash-driven) - _event.add(_win, 'focus', _handleFocus); - _event.add(_win, 'load', _handleFocus); - _event.add(_win, 'load', _delayWaitForEI); - _event.add(_win, 'load', _winOnLoad); - - - if (_isSafari && _tryInitOnFocus) { - // massive Safari 3.1 focus detection hack - _event.add(_win, 'mousemove', _handleFocus); - } - - if (_doc.addEventListener) { - - _doc.addEventListener('DOMContentLoaded', _domContentLoaded, false); - - } else if (_doc.attachEvent) { - - _doc.attachEvent('onreadystatechange', _domContentLoadedIE); - - } else { - - // no add/attachevent support - safe to assume no JS -> Flash either - _debugTS('onload', false); - _catchError({type:'NO_DOM2_EVENTS', fatal:true}); - - } - - if (_doc.readyState === 'complete') { - // DOMReady has already happened. - setTimeout(_domContentLoaded,100); - } - -} // SoundManager() - -// SM2_DEFER details: http://www.schillmania.com/projects/soundmanager2/doc/getstarted/#lazy-loading - -if (typeof SM2_DEFER === 'undefined' || !SM2_DEFER) { - soundManager = new SoundManager(); -} - -/** - * SoundManager public interfaces - * ------------------------------ - */ - -window.SoundManager = SoundManager; // constructor -window.soundManager = soundManager; // public API, flash callbacks etc. - -}(window)); \ No newline at end of file diff --git a/inc/MIDI.js/inc/SoundManager2/swf/soundmanager2.swf b/inc/MIDI.js/inc/SoundManager2/swf/soundmanager2.swf deleted file mode 100755 index 14850f2..0000000 Binary files a/inc/MIDI.js/inc/SoundManager2/swf/soundmanager2.swf and /dev/null differ diff --git a/inc/MIDI.js/inc/SoundManager2/swf/soundmanager2_debug.swf b/inc/MIDI.js/inc/SoundManager2/swf/soundmanager2_debug.swf deleted file mode 100755 index aa4750a..0000000 Binary files a/inc/MIDI.js/inc/SoundManager2/swf/soundmanager2_debug.swf and /dev/null differ diff --git a/inc/MIDI.js/inc/SoundManager2/swf/soundmanager2_flash9.swf b/inc/MIDI.js/inc/SoundManager2/swf/soundmanager2_flash9.swf deleted file mode 100755 index 2705986..0000000 Binary files a/inc/MIDI.js/inc/SoundManager2/swf/soundmanager2_flash9.swf and /dev/null differ diff --git a/inc/MIDI.js/inc/SoundManager2/swf/soundmanager2_flash9_debug.swf b/inc/MIDI.js/inc/SoundManager2/swf/soundmanager2_flash9_debug.swf deleted file mode 100755 index 243d649..0000000 Binary files a/inc/MIDI.js/inc/SoundManager2/swf/soundmanager2_flash9_debug.swf and /dev/null differ diff --git a/inc/MIDI.js/inc/SoundManager2/swf/soundmanager2_flash_xdomain.zip b/inc/MIDI.js/inc/SoundManager2/swf/soundmanager2_flash_xdomain.zip deleted file mode 100755 index 29737aa..0000000 Binary files a/inc/MIDI.js/inc/SoundManager2/swf/soundmanager2_flash_xdomain.zip and /dev/null differ diff --git a/inc/MIDI.js/inc/WebMIDIAPI.js b/inc/MIDI.js/inc/WebMIDIAPI.js new file mode 100644 index 0000000..a320b0f --- /dev/null +++ b/inc/MIDI.js/inc/WebMIDIAPI.js @@ -0,0 +1,419 @@ +/// http://cwilso.github.com/WebMIDIAPIShim + +// Initialize the MIDI library. +(function (global, exports, perf) { + 'use strict'; + var midiIO, + debug = false; + if (debug) { + window.console.warn('Debuggin enabled'); + } + +//init: create plugin + if (!window.navigator.requestMIDIAccess) { + window.navigator.requestMIDIAccess = _requestMIDIAccess; + if (!window.navigator.getMIDIAccess) + window.navigator.getMIDIAccess = _getMIDIAccess; + } + + function _JazzInstance() { + this.inputInUse = false; + this.outputInUse = false; + + // load the Jazz plugin + var o1 = document.createElement("object"); + o1.style.cssText = "top: -500px; position: absolute;"; + o1.id = "_Jazz" + Math.random() + "ie"; + o1.classid = "CLSID:1ACE1618-1C7D-4561-AEE1-34842AA85E90"; + + this.activeX = o1; + + var o2 = document.createElement("object"); + o2.id = "_Jazz" + Math.random; + o2.type="audio/x-jazz"; + o1.appendChild(o2); + + this.objRef = o2; + + var e = document.createElement("p"); + e.appendChild(document.createTextNode("This page requires the ")); + + var a = document.createElement("a"); + a.appendChild(document.createTextNode("Jazz plugin")); + a.href = "http://jazz-soft.net/"; + + e.appendChild(a); + e.appendChild(document.createTextNode(".")); + o2.appendChild(e); + + var insertionPoint = document.getElementById("MIDIPlugin"); + if (!insertionPoint) + insertionPoint = document.body; + insertionPoint.appendChild(o1); + + if (this.objRef.isJazz) + this._Jazz = this.objRef; + else if (this.activeX.isJazz) + this._Jazz = this.activeX; + else + this._Jazz = null; + if (this._Jazz) { + this._Jazz._jazzTimeZero = this._Jazz.Time(); + this._Jazz._perfTimeZero = window.performance.now(); + } + } + + function _requestMIDIAccess( successCallback, errorCallback ) { + new MIDIAccess( successCallback, errorCallback ); + } + + function _getMIDIAccess( successCallback, errorCallback ) { + var message = "getMIDIAccess has been renamed to requestMIDIAccess. Please update your code."; + + if (console.warn) + console.warn( message ); + else + console.log( message ); + new MIDIAccess( successCallback, errorCallback ); + } + + // API Methods + + function MIDIAccess( successCallback, errorCallback ) { + this._jazzInstances = new Array(); + this._jazzInstances.push( new _JazzInstance() ); + + if (this._jazzInstances[0]._Jazz) { + this._Jazz = this._jazzInstances[0]._Jazz; + this._successCallback = successCallback; + window.setTimeout( _onReady.bind(this), 3 ); + } else { + if (errorCallback) + errorCallback( { code: 1 } ); + } + } + + function _onReady() { + if (this._successCallback) + this._successCallback( this ); + } + + MIDIAccess.prototype.getInputs = function( ) { + if (!this._Jazz) + return null; + var list=this._Jazz.MidiInList(); + var inputs = new Array( list.length ); + + for ( var i=0; i1)) { + var sendObj = new Object; + sendObj.jazz = this._jazzInstance; + sendObj.data = data; + + window.setTimeout( _sendLater.bind(sendObj), delayBeforeSend ); + } else { + this._jazzInstance.MidiOutLong( data ); + } + return true; + } + +}(window)); + +// Polyfill window.performance.now() if necessary. +(function (exports) { + var perf = {}, + props; + + function findAlt() { + var prefix = "moz,webkit,opera,ms".split(","), + i = prefix.length, + //worst case, we use Date.now() + props = { + value: function (start) { + return function () { + return Date.now() - start; + } + }(Date.now()) + }; + + //seach for vendor prefixed version + for (; i >= 0; i--) { + if ((prefix[i] + "Now") in exports.performance) { + props.value = function (method) { + return function () { + exports.performance[method](); + } + }(prefix[i] + "Now"); + return props; + } + } + + //otherwise, try to use connectionStart + if ("timing" in exports.performance && + "connectStart" in exports.performance.timing) { + //this pretty much approximates performance.now() to the millisecond + props.value = function (start) { + return function(){Date.now() - start;} + }(exports.performance.timing.connectStart); + } + return props; + } + + //if already defined, bail + if (("performance" in exports) && ("now" in exports.performance)) { + return; + } + if (!("performance" in exports)) { + Object.defineProperty(exports, "performance", { + get: function () { + return perf; + } + }); + //otherwise, perforance is there, but not "now()" + } + props = findAlt(); + Object.defineProperty(exports.performance, "now", props); +}(window)); + + + diff --git a/inc/MIDI.js/js/lib/base64binary.js b/inc/MIDI.js/inc/base64binary.js similarity index 100% rename from inc/MIDI.js/js/lib/base64binary.js rename to inc/MIDI.js/inc/base64binary.js diff --git a/inc/MIDI.js/inc/midibridge/README b/inc/MIDI.js/inc/midibridge/README deleted file mode 100644 index 7a71651..0000000 --- a/inc/MIDI.js/inc/midibridge/README +++ /dev/null @@ -1,39 +0,0 @@ -The midibridge is a Javascript API for interacting with the midi devices on your computer. - -It provides methods for detecting the midi devices and for connecting these devices with each other. - -The midibridge itself is considered a midi device as well, so it can be connected to the detected devices. - -The midibridge can generate and send midi events to midi output devices, and receive midi events from midi input devices. - -The midibridge can also filter and alter midi events. - -Recording and playing back midi events with a sequencer will be added in later versions. - -A midi output device is a physical output port on your computer, a virtual output port or a software synthesizer. It can also be a sequencer, a file or a function. - -A midi input device is a physical or virtual input port, a sequencer, a file or a function. - -A midi device can be both in- and output. The midibridge itself for instance is both in- and output because it can send and receive midi events. - -The actual interaction with the midi devices on your computer is done by a Java applet. The midibridge automatically adds the applet to your webpage. - -The midibridge has no visual parts, it is 'headless' code. You could say the midibridge enables you to write a 'front-end' on top of the applet. - -Midi Devices -> Java Applet -> Javascript Midibridge API -> a GUI in Javascript, Flash, SVG, C# (Silverlight) - -Because the midibridge is written in native Javascript, you can use it conflict-free with any Javascript framework. - - -The only files you need to get started are: - -/lib/midibridge-0.5.1.min.js -/java/midiapplet.jar - - -/lib/MidiBridge.js is the non-minified version of /lib/midibridge-0.5.1.min.js - -The other files and notably the files in the /js folder are code snippets that i have used in the quick start guide and the documentation on my blogpost, see: - -http://www.abumarkub.net/abublog/?p=399 - diff --git a/inc/MIDI.js/inc/midibridge/index.html b/inc/MIDI.js/inc/midibridge/index.html deleted file mode 100644 index 0808ae1..0000000 --- a/inc/MIDI.js/inc/midibridge/index.html +++ /dev/null @@ -1,83 +0,0 @@ - - - - - - - - - - \ No newline at end of file diff --git a/inc/MIDI.js/inc/midibridge/java/midiapplet.jar b/inc/MIDI.js/inc/midibridge/java/midiapplet.jar deleted file mode 100644 index ea4e6e9..0000000 Binary files a/inc/MIDI.js/inc/midibridge/java/midiapplet.jar and /dev/null differ diff --git a/inc/MIDI.js/inc/midibridge/lib/MidiBridge.js b/inc/MIDI.js/inc/midibridge/lib/MidiBridge.js deleted file mode 100644 index fe9f8e2..0000000 --- a/inc/MIDI.js/inc/midibridge/lib/MidiBridge.js +++ /dev/null @@ -1,502 +0,0 @@ -/** - * This version is supported by all browsers that support native JSON parsing: - * - Firefox 3.5+ - * - Chrome 4.0+ - * - Safari 4.0+ - * - Opera 10.5+ - * - Internet Explorer 8.0+ - * - * If you want this version to work with other browsers, you can use the JSON parsing methods of your favorite Javascript - * framework (e.g. jQuery, Dojo, YUI, Mootools, etc.) - * - * Note for IE8 users: if you include MidiBridge.js (or preferably the minified version of it: midibridge-0.5.min.js) in your html, - * the method addEventListener will be added to the window object. In fact this method is just a wrapper around the attachEvent method, - * see code at the bottom of this file. - */ - -(function() { - var midiBridge = { - NOTE_OFF : 0x80, //128 - NOTE_ON : 0x90, //144 - POLY_PRESSURE : 0xA0, //160 - CONTROL_CHANGE : 0xB0, //176 - PROGRAM_CHANGE : 0xC0, //192 - CHANNEL_PRESSURE : 0xD0, //208 - PITCH_BEND : 0xE0, //224 - SYSTEM_EXCLUSIVE : 0xF0, //240 - NOTE_NAMES_SHARP : "sharp", - NOTE_NAMES_FLAT : "flat", - NOTE_NAMES_SOUNDFONT : "soundfont", - NOTE_NAMES_ENHARMONIC_SHARP : "enh-sharp", - NOTE_NAMES_ENHARMONIC_FLAT : "enh-flat" - - }; - //human readable representation of status byte midi data - var status = []; - status[0x80] = "NOTE OFF"; - status[0x90] = "NOTE ON"; - status[0xA0] = "POLY PRESSURE"; - status[0xB0] = "CONTROL CHANGE"; - status[0xC0] = "PROGRAM CHANGE"; - status[0xD0] = "CHANNEL PRESSURE"; - status[0xE0] = "PITCH BEND"; - status[0xF0] = "SYSTEM EXCLUSIVE"; - //notenames in different modi - var noteNames = { - "sharp" : ["C", "C#", "D", "D#", "E", "F", "F#", "G", "G#", "A", "A#", "B"], - "flat" : ["C", "Dâ™­", "D", "Eâ™­", "E", "F", "Gâ™­", "G", "Aâ™­", "A", "Bâ™­", "B"], - "soundfont" : ["C", "Db", "D", "Eb", "E", "F", "Gb", "G", "Ab", "A", "Bb", "B"], - "enh-sharp" : ["B#", "C#", "C##", "D#", "D##", "E#", "F#", "F##", "G#", "G##", "A#", "A##"], - "enh-flat" : ["Dâ™­â™­", "Dâ™­", "Eâ™­â™­", "Eâ™­", "Fâ™­", "Gâ™­â™­", "Gâ™­", "Aâ™­â™­", "Aâ™­", "Bâ™­", "Bâ™­", "Câ™­"] - } - //variable that holds a reference to the JSON parser method of your liking, defaults to native JSON parsing - var parseJSON = JSON.parse; - //method that gets called when midi note events arrive from the applet - var ondata = null; - var onerror = null; - var onready = null; - //the applet object - var applet = null; - var connectAllInputs = false; - var connectFirstInput = false; - var connectFirstOutput = false; - var connectAllInputsToFirstOutput = true; - var javaDir = "java"; - var devices = {}; - midiBridge.version = "0.5.1"; - midiBridge.ready = false; - midiBridge.noteNameModus = midiBridge.NOTE_NAMES_SHARP; - - /** - * static method called to initialize the MidiBridge - * possible arguments: - * 1) callback [function] callback when midi data has arrived - * 2) config object - * - ready : [function] callback when midibridge is ready/initialized - * - error : [function] callback in case of an error - * - data : [function] callback when midi data has arrived - * - connectAllInputs : [true,false] all found midi input devices get connected automatically - * - connectFirstInput : [true,false] the first found midi input device gets connected automatically - * - connectFirstOutput : [true,false] the first found midi output device gets connected automatically - * - connectAllInputsToFirstOutput : [true,false] all found midi input devices will be automatically connected to the first found midi output device - * - javaDir : [string] the folder where you store the midiapplet.jar on your webserver, defaults to "java" - */ - midiBridge.init = function(arg) { - - //var args = Array.prototype.slice.call(arguments); - if( typeof arg === "function") { - ondata = arg; - } else if( typeof arg === "object") { - var config = arg; - connectAllInputs = config.connectAllInputs; - connectFirstInput = config.connectFirstInput; - connectFirstOutput = config.connectFirstOutput; - connectAllInputsToFirstOutput = config.connectAllInputsToFirstOutput; - ondata = config.data; - onready = config.ready; - onerror = config.error; - switch(true) { - case connectAllInputs && connectFirstOutput: - connectAllInputs = false; - connectFirstInput = false; - connectFirstOutput = false; - connectAllInputsToFirstOutput = true; - break; - case connectAllInputsToFirstOutput: - connectAllInputs = false; - connectFirstInput = false; - connectFirstInput = false; - connectFirstOutput = false; - break; - case connectFirstInput: - connectAllInputs = false; - connectAllInputsToFirstOutput = false; - break; - case connectFirstOutput: - connectAllInputs = false; - connectAllInputsToFirstOutput = false; - break; - case connectAllInputs: - connectFirstInput = false; - connectFirstOutput = false; - connectAllInputsToFirstOutput = false; - break; - } - } - - /** - * Very simple java plugin detection - */ - if(!navigator.javaEnabled()) { - if(onerror) { - onerror("no java plugin found; install or enable the java plugin") - } else { - console.log("no java plugin found; install or enable the java plugin"); - } - return; - } - - /** - * If you are using the JSON parse method of your favorite Javascript framework replace the followingn lines by onlu: - * - * loadJava(); - */ - - loadJava(); - - }; - - /** - * static method called by the applet - */ - midiBridge.msgFromJava = function(jsonString) { - var data = parseJSON(jsonString); - var msgId = data.msgId; - //console.log(jsonString); - //console.log(msgId); - switch(msgId) { - case "upgrade-java": - if(onerror) { - onerror("please upgrade your java plugin!") - } else { - console.log("please upgrade your java plugin!"); - } - break; - case "midi-started": - getApplet(); - if(applet) { - devices = data.devices; - midiBridge.ready = true; - if(connectAllInputs) { - midiBridge.connectAllInputs(); - } - if(connectFirstInput) { - midiBridge.connectFirstInput(); - } - if(connectFirstOutput) { - midiBridge.connectFirstOutput(); - } - if(connectAllInputsToFirstOutput) { - midiBridge.connectAllInputsToFirstOutput(); - } - if(onready) { - onready("midibridge started"); - } - } - //console.log("applet:",applet); - break; - case "midi-data": - if(ondata) { - ondata(new MidiMessage(data)); - } - break; - case "error": - if(onerror) { - onerror(data.code); - } - break; - } - }; - - /** - * Send a midi event from javascript to java - * @param status : the midi status byte, e.g. NOTE ON, NOTE OFF, PITCH BEND and so on - * @param channel : the midi channel that this event will be sent to 0 - 15 - * @param data1 : the midi note number - * @param data2 : the second data byte, when the status byte is NOTE ON or NOTE OFF, data2 is the velocity - */ - midiBridge.sendMidiEvent = function(status, channel, data1, data2) { - if(checkIfReady()) { - return parseJSON(applet.processMidiEvent(status, channel, data1, data2)); - } - }; - - /** - * Get the list of all currently connected midi devices - */ - midiBridge.getDevices = function() { - return devices; - }; - - /** - * Refresh the list of all currently connected midi devices - */ - midiBridge.refreshDevices = function() { - if(checkIfReady()) { - return parseJSON(applet.getDevices()); - } - }; - - /** - * Connect all found midi inputs to the midibridge right after the midibridge has been initialized - */ - midiBridge.connectAllInputs = function() { - if(checkIfReady()) { - return parseJSON(applet.connectAllInputs()); - } - }; - - /** - * Connect the first found midi input to the midibridge right after the midibridge has been initialized - */ - midiBridge.connectFirstInput = function() { - if(checkIfReady()) { - return parseJSON(applet.connectFirstInput()); - } - }; - - /** - * Connect the first found midi output to the midibridge right after the midibridge has been initialized - */ - midiBridge.connectFirstOutput = function() { - if(checkIfReady()) { - return parseJSON(applet.connectFirstOutput()); - } - }; - - /** - * Connect the first found midi output to all connected midi inputs right after the midibridge has been initialized - */ - midiBridge.connectAllInputsToFirstOutput = function() { - if(checkIfReady()) { - return parseJSON(applet.connectAllInputsToFirstOutput()); - } - }; - - /** - * Connect midi a midi input to the bridge, and/or a midi input to a midi output - * @param midiInId : [int] id of the midi input that will be connected to the bridge, use the ids as retrieved by getDevices() - * @param midiOutId : [int] optional, the id of the midi output that will be connected to the chosen midi input - * @param filter : [array] an array containing status codes that will *not* be sent from the chosen midi input to the chosen midi output - * e.g. if you supply the array [midiBridge.PITCH_BEND, midiBridge.POLY_PRESSURE], pitch bend and poly pressure midi messages will not be forwarded to the output - */ - midiBridge.addConnection = function(midiInId, midiOutId, filter) { - if(checkIfReady()) { - midiOutId = midiOutId == undefined ? -1 : midiOutId; - filter = filter == undefined ? [] : filter; - return parseJSON(applet.addConnection(midiInId, midiOutId, filter)); - } - }; - - /** - * Remove a midi connection between between an input and the midibridge, and/or the given in- and output - * @param midiIdIn : [int] the midi input - * @param midiIdOut : [int] optional, the midi output - */ - midiBridge.removeConnection = function(midiInId, midiOutId) { - if(checkIfReady()) { - return parseJSON(applet.removeConnection(midiInId, midiOutId)); - } - }; - - /** - * All previously setup midi connections will be disconnected - */ - midiBridge.disconnectAll = function() { - if(checkIfReady()) { - return parseJSON(applet.disconnectAll()); - } - }; - - midiBridge.loadBase64String = function(data){ - return parseJSON(applet.loadBase64String(data)); - } - - midiBridge.playBase64String = function(data){ - return parseJSON(applet.playBase64String(data)); - } - - midiBridge.loadMidiFile = function(url){ - return parseJSON(applet.loadMidiFile(url)); - } - - midiBridge.playMidiFile = function(url){ - return parseJSON(applet.playMidiFile(url)); - } - - midiBridge.startSequencer = function(){ - applet.startSequencer(); - } - - midiBridge.pauseSequencer = function(){ - applet.pauseSequencer(); - } - - midiBridge.stopSequencer = function(){ - applet.stopSequencer(); - } - - midiBridge.closeSequencer = function(){ - applet.closeSequencer(); - } - - midiBridge.getSequencerPosition = function(){ - return applet.getSequencerPosition(); - } - - midiBridge.setSequencerPosition = function(pos){ - applet.setSequencerPosition(pos); - } - - /** - * Check if a midiBridge function is called before initialization - */ - function checkIfReady() { - if(!midiBridge.ready) { - if(onerror) { - onerror("midibridge not ready!"); - } - return "midibridge not ready!"; - } - return true; - } - - /** - * A div with the applet object is added to the body of your html document - */ - function loadJava() { - //console.log("loadJava"); - var javaDiv = document.createElement("div"); - javaDiv.setAttribute("id", "midibridge-java"); - var html = ""; - html += ''; - html += ''; - html += ''; - html += ''; - html += ''; - html += ''; - //html += 'Your browser needs the Java plugin to use the midibridge. You can download it here'; - html += ''; - javaDiv.innerHTML = html; - document.body.appendChild(javaDiv); - } - - /** - * class MidiMessage is used to wrap the midi note data that arrives from the applet - */ - var MidiMessage = (function()//constructor - { - var _constructor = function(data) { - this.data1 = data.data1; - this.data2 = data.data2; - this.status = data.status; - this.status = this.data2 == 0 && this.status == midiBridge.NOTE_ON ? midiBridge.NOTE_OFF : this.status; - this.channel = data.channel; - this.noteName = midiBridge.getNoteName(this.data1, midiBridge.noteNameModus); - this.statusCode = midiBridge.getStatus(this.status); - this.microsecond = data.microsecond; - this.time = midiBridge.getNiceTime(this.microsecond); - }; - - _constructor.prototype = { - toString : function() { - var s = ""; - s += this.noteName + " " + this.statusCode + " " + this.data1 + " " + this.data2 + " " + this.status; - s += this.microsecond ? this.microsecond + " " + this.time : ""; - //console.log(s); - return s; - }, - toJSONString : function() { - var s; - if(this.microsecond){ - s= "{'notename':" + this.noteName + ", 'status':" + this.status + ", 'data1':" + this.data1 + ", 'data2':" + this.data2 + ", 'microsecond':" + this.microsecond + ", 'time':" + this.time + "}"; - }else{ - s= "{'notename':" + this.noteName + ", 'status':" + this.status + ", 'data1':" + this.data1 + ", 'data2':" + this.data2 + "}"; - } - //console.log(s); - return s; - } - } - - return _constructor; - })(); - - - midiBridge.getNoteName = function(noteNumber, mode) { - - var octave = Math.floor(((noteNumber) / 12) - 1); - var noteName = noteNames[mode][noteNumber % 12]; - return noteName + "" + octave; - }; - - - midiBridge.getNoteNumber = function(noteName, octave) { - var index = -1; - noteName = noteName.toUpperCase(); - for(var key in noteNames) { - var modus = noteNames[key]; - for(var i = 0, max = modus.length; i < max; i++) { - if(modus[i] === noteName) { - index = i; - break; - } - } - } - if(index === -1) { - return "invalid note name"; - } - noteNumber = (12 + index) + (octave * 12); - return noteNumber; - } - - - midiBridge.getStatus = function($statusCode) { - return status[$statusCode]; - }; - - midiBridge.getNiceTime = function(microseconds) - { - //console.log(microseconds); - var r = ""; - - var t = (microseconds / 1000 / 1000) >> 0; - var h = (t / (60 * 60)) >> 0; - var m = ((t % (60 * 60)) / 60) >> 0; - var s = t % (60); - var ms = (((microseconds /1000) - (h * 3600000) - (m * 60000) - (s * 1000)) + 0.5) >> 0; - - //console.log(t,h,m,s,ms); - - r += h > 0 ? h + ":" : ""; - r += h > 0 ? m < 10 ? "0" + m : m : m; - r += ":"; - r += s < 10 ? "0" + s : s; - r += ":"; - r += ms == 0 ? "000" : ms < 10 ? "00" + ms : ms < 100 ? "0" + ms : ms; - - return r; - } - - - function getApplet() { - try { - applet = midiBridge.getObject("midibridge-applet"); - } catch(e) { - //console.log(e) - //Firefox needs more time to initialize the Applet - setTimeout(getApplet, 25); - return; - } - } - - midiBridge.getObject = function(objectName) { - var ua = navigator.userAgent.toLowerCase(); - //console.log(ua); - if(ua.indexOf("msie") !== -1 || ua.indexOf("webkit") !== -1) { - return window[objectName]; - } else { - return document[objectName]; - } - } - - //add addEventListener to IE8 - if(!window.addEventListener) { - window.addEventListener = function($id, $callback, $bubble) { - window.attachEvent('onload', $callback); - } - - } - - window.midiBridge = midiBridge; - -})(window); \ No newline at end of file diff --git a/inc/MIDI.js/js/Color.js b/inc/MIDI.js/js/Color.js deleted file mode 100644 index 11428b2..0000000 --- a/inc/MIDI.js/js/Color.js +++ /dev/null @@ -1,154 +0,0 @@ -/* - - Color.Space : 0.3 : mudcu.be - ----------------------------- - STRING <-> HEX <-> RGB <-> HSL - ----------------------------- - var HEX = 0xFF0000; - var HSL = Color.Space(HEX, "HEX>RGB>HSL"); - -*/ - -if (!window.Color) Color = {}; -if (!window.Color.Space) Color.Space = {}; - -(function () { - -var DEG_RAD = Math.PI / 180; -var RAD_DEG = 1 / DEG_RAD; - -var shortcuts = { }; -var root = Color.Space = function(color, route) { - if (shortcuts[route]) { - route = shortcuts[route]; - } - var arr = route.split(">"); - var key = ""; - for (var n = 0; n < arr.length; n ++) { - if (n > 1) { - key = key.split("_"); - key.shift(); - key = key.join("_"); - } - key += (n == 0 ? "" : "_") + arr[n]; - if (n > 0) color = root[key](color); - } - return color; -}; - -// STRING = 'FFFFFF' | 'FFFFFFFF' - -root.STRING_HEX = function (o) { - return parseInt('0x' + o); -}; - -// HEX = 0x000000 -> 0xFFFFFF - -root.HEX_STRING = function (o, maxLength) { - if (!maxLength) maxLength = 6; - if (!o) o = 0; - var z = o.toString(16); - // when string is lesser than maxLength - var n = z.length; - while (n < maxLength) { - z = '0' + z; - n++; - } - // when string is greater than maxLength - var n = z.length; - while (n > maxLength) { - z = z.substr(1); - n--; - } - return z; -}; - -root.HEX_RGB = function (o) { - return { - R: (o >> 16), - G: (o >> 8) & 0xFF, - B: o & 0xFF - }; -}; - -// RGB = R: Red / G: Green / B: Blue - -root.RGB_HEX = function (o) { - if (o.R < 0) o.R = 0; - if (o.G < 0) o.G = 0; - if (o.B < 0) o.B = 0; - if (o.R > 255) o.R = 255; - if (o.G > 255) o.G = 255; - if (o.B > 255) o.B = 255; - return o.R << 16 | o.G << 8 | o.B; -}; - -root.RGB_HSL = function (o) { // RGB from 0 to 1 - // http://www.easyrgb.com/index.php?X=MATH&H=18#text18 - var _R = o.R / 255, - _G = o.G / 255, - _B = o.B / 255, - min = Math.min(_R, _G, _B), - max = Math.max(_R, _G, _B), - D = max - min, - H, - S, - L = (max + min) / 2; - if (D == 0) { // No chroma - H = 0; - S = 0; - } else { // Chromatic data - if (L < 0.5) S = D / (max + min); - else S = D / (2 - max - min); - var DR = (((max - _R) / 6) + (D / 2)) / D; - var DG = (((max - _G) / 6) + (D / 2)) / D; - var DB = (((max - _B) / 6) + (D / 2)) / D; - if (_R == max) H = DB - DG; - else if (_G == max) H = (1 / 3) + DR - DB; - else if (_B == max) H = (2 / 3) + DG - DR; - if (H < 0) H += 1; - if (H > 1) H -= 1; - } - return { - H: H * 360, - S: S * 100, - L: L * 100 - }; -}; - -// HSL (1978) = H: Hue / S: Saturation / L: Lightess - -root.HSL_RGB = function (o) { - // http://www.easyrgb.com/index.php?X=MATH&H=19 - var H = o.H / 360, - S = o.S / 100, - L = o.L / 100, - R, G, B, _1, _2; - function Hue_2_RGB(v1, v2, vH) { - if (vH < 0) vH += 1; - if (vH > 1) vH -= 1; - if ((6 * vH) < 1) return v1 + (v2 - v1) * 6 * vH; - if ((2 * vH) < 1) return v2; - if ((3 * vH) < 2) return v1 + (v2 - v1) * ((2 / 3) - vH) * 6; - return v1; - } - if (S == 0) { // HSL from 0 to 1 - R = L * 255; - G = L * 255; - B = L * 255; - } else { - if (L < 0.5) _2 = L * (1 + S); - else _2 = (L + S) - (S * L); - _1 = 2 * L - _2; - R = 255 * Hue_2_RGB(_1, _2, H + (1 / 3)); - G = 255 * Hue_2_RGB(_1, _2, H); - B = 255 * Hue_2_RGB(_1, _2, H - (1 / 3)); - } - return { - R: R, - G: G, - B: B - }; -}; - -})(); \ No newline at end of file diff --git a/inc/MIDI.js/js/Event.Mouse.js b/inc/MIDI.js/js/Event.Mouse.js deleted file mode 100644 index fdf5e0f..0000000 --- a/inc/MIDI.js/js/Event.Mouse.js +++ /dev/null @@ -1,155 +0,0 @@ -/* - - Event.Mouse : 0.3.1 : mudcu.be - ------------------------------------- - Event.add(document, "mousedown", function(event) { - Event.drag({ - type: "absolute", - event: event, - element: document, - callback: function (event, coords, state, self) { - Event.stopPropagation(event); - Event.preventDefault(event); - console.log(coords); - } - }); - }); - - // this does the same thing - Event.drag({ - type: "absolute", - element: document, - callback: function (event, coords, state, self) { - console.log(coords); - } - }); - - /// easier mousewheel events - Event.mousewheel(window, function(event, state, wheelData, self) { - self.stop.prevent.remove(); - }); - -*/ - -if (typeof(Event) === "undefined") var Event = {}; - -Event.drag = -Event.dragElement = function(props) { - var el = props.element || document.body; - var doc = el.ownerDocument; // could be within an iframe - if (typeof(props.event) === "undefined") { // create event - Event.add(el, "mousedown", function(event) { - props.event = event; - Event.dragElement(props); - Event.preventDefault(event); - Event.stopPropagation(event); - }); - return; - } - // functions accessible externally - var self = { - cancel: function() { - Event.remove(doc, "mousemove", mouseMove); - Event.remove(doc, "mouseup", mouseUp); - } - }; - // event move - var mouseMove = function (event, state) { - if (typeof(state) === "undefined") state = "move"; - var coord = Event.coords(event); - switch (props.type) { - case "move": // move - props.callback(event, { - x: coord.x + oX - eX, - y: coord.y + oY - eY - }, state, self); - break; - case "difference": // relative, from position within element - props.callback(event, { - x: coord.x - oX, - y: coord.y - oY - }, state, self); - break; - case "relative": // eveything is relative from origin - props.callback(event, { - x: coord.x - eX, - y: coord.y - eY - }, state, self); - break; - default: // "absolute", origin is 0x0 - props.callback(event, { - x: coord.x, - y: coord.y - }, state, self); - break; - } - }; - // event up - var mouseUp = function(event) { - self.cancel(); - mouseMove(event, "up"); - }; - // current element position - var origin = abPos(el); - var oX = origin.x; - var oY = origin.y; - // current mouse position - var event = props.event; - var coord = Event.coords(event); - var eX = coord.x; - var eY = coord.y; - // events - Event.add(doc, "mousemove", mouseMove); - Event.add(doc, "mouseup", mouseUp); - mouseMove(event, "down"); // run mouse-down - // - return self; -}; - -Event.coords = (function() { - if (window.ActiveXObject) { - return function(event) { - return { - x: event.clientX + document.documentElement.scrollLeft, - y: event.clientY + document.documentElement.scrollTop - }; - }; - } else { - return function(event) { - return { - x: event.pageX, - y: event.pageY - }; - }; - } -})(); - -//////////////// MouseWheel //////////////// - -Event.mousewheel = function(target, listener, timeout) { - var interval = 0; - var self = Event(target, "mousewheel", function(event) { - event = event || window.event; - var wheelData = event.detail ? event.detail * -1 : event.wheelDelta / 40; - listener(event, "wheel", wheelData); - window.clearInterval(interval); - interval = window.setInterval(function() { - window.clearInterval(interval); - listener(event, "wheelup", wheelData, self); - }, timeout || 150); - }); - return self; -}; - -///// DOM.absPos - -var abPos = function(o) { - o = typeof(o) === 'object' ? o : document.getElementById(o); - var offset = { x: 0, y: 0 }; - while(o != null) { - offset.x += o.offsetLeft; - offset.y += o.offsetTop; - o = o.offsetParent; - }; - return offset; -}; \ No newline at end of file diff --git a/inc/MIDI.js/js/Event.js b/inc/MIDI.js/js/Event.js deleted file mode 100644 index b5b37e3..0000000 --- a/inc/MIDI.js/js/Event.js +++ /dev/null @@ -1,203 +0,0 @@ -/* - - Event.js : v1.1 : mudcu.be - ----------------------- - /// calling "Event" with "new" provides additional support; - Event(syntax.area, "click", function(event, self) { - self.stop().prevent().remove(); - }); - - /// calling "Event" without "new" also works, but requires more work (and is faster); - var click = Event.add(syntax.area, "click", function(event) { - Event.stop(event); - Event.prevent(event); - Event.remove(syntax.area, "click", click); - }); - - /// multiple event-types bound to one function - var binding = Event(window, "click,mousemove,mousemove,mouseup", function(event, self) { - self.stop().prevent(); // stopPropagation and preventDefault - binding.remove(); // removes all the listeners - }); - - /// multiple events bound to one element - var binding = Event(window, { - "mousedown": function(event, self) { - self.remove(); // remove all the listeners - }, - "mouseup": function(event, self) { - binding.remove(); // just remove this listener - } - }); - -*/ - -var Event = (function(root) { "use strict"; - var add = document.addEventListener ? 'addEventListener' : 'attachEvent'; - var remove = document.removeEventListener ? 'removeEventListener' : 'detachEvent'; - var isEvent = (function () { - var events = {}; - var types = [ - 'abort', 'beforeunload', 'blur', 'broadcast', 'change', 'click', 'close', - 'command', 'commandupdate', 'contextmenu', 'dblclick', 'dragdrop', - 'dragenter', 'dragexit', 'draggesture', 'dragover', 'error', 'focus', - 'input', 'keydown', 'keypress', 'keyup', 'load', 'mousedown', - 'mousewheel', 'mouseenter', 'mouseleave', 'mousemove', 'mouseout', 'mouseover', - 'mouseup', 'move', 'overflow', 'overflowchanged', 'popuphidden', - 'popuphiding', 'popupshowing', 'popupshown', 'select', 'scroll', - 'syncfrompreference', 'synctopreference', 'readystatechange', - 'reset', 'resize', 'select', 'submit', 'underflow', 'unload' - ]; - for (var n = 0, length = types.length; n < length; n ++) { - events[types[n]] = true; - } - return events; - })(); - // event wrappers, and associated variables - var wrappers = {}; - var counter = 0; - var testElement = document.createElement("div"); - var getEventID = function(object) { - if (object === window) return "#window"; - if (object === document) return "#document"; - if (!object) object = {}; // FIXME: Happens in iOS - if (!object.uniqueID) { - object.uniqueID = "id" + counter ++; - } - return object.uniqueID; - }; - // function to create new Events - root = {}; // double type the root function as object + function - root = function(target, type, listener, scope) { - // find the where function was called from (window is undefined) - var that = typeof(this) !== "undefined" ? this : {}; - // check for multiple events in one string - if (type.indexOf && type.indexOf(",") !== -1) { - type = type.split(","); - } - // check type for multipel events - if (typeof(type) !== "string") { // has multiple events - that.events = {}; - if (typeof(type.length) === "undefined") { // has multiple listeners (object) - for (var key in type) { - if (isEvent[key] && typeof(type[key]) === "function") { - that.events[key] = Event(target, key, type[key], scope); - } - } - } else { // has multiple listeners glued together (array) - for (var n = 0, length = type.length; n < length; n ++) { - that.events[type[n]] = Event(target, type[n], listener, scope); - } - } - that.remove = function() { // remove multiple events - for (var key in that.events) { - that.events[key].remove(); - } - return that; - }; - that.add = function() { // add multiple events - for (var key in that.events) { - that.events[key].add(); - } - return that; - }; - return that; - } else { // is single call - if (!(target && type && listener)) return "missing data."; - type = standardize(type); - } - // tracked wrapper - var wrapperID = type + getEventID(target) + "." + getEventID(listener); - if (!wrappers[wrapperID]) { // create new wrapper - wrappers[wrapperID] = function(event) { - return listener.call(scope, that.event = event, that); - }; - } - // the wrapped listener - var wrapper = wrappers[wrapperID]; - target[add](type, wrapper, false); - // - that.stop = function(event) { - event = event || that.event; - if (event.stopPropagation) { - event.stopPropagation(); - } else { // <= IE8 - event.cancelBubble = true; - } - return that; - }; - that.prevent = function(event) { - event = event || that.event; - if (event.preventDefault) { - event.preventDefault(); - } else { // <= IE8 - event.returnValue = false; - } - return that; - }; - that.add = function() { // so you can add it back - target[add](type, wrapper, false); - return that; - }; - that.remove = function() { - target[remove](type, wrapper, false); - return that; - }; - return that; - }; - - root.add = function(target, type, listener, scope) { - type = standardize(type); - target[add](type, wrap(type, target, listener, scope || target), false); - return listener; - }; - - root.remove = function(target, type, listener, scope) { - type = standardize(type); - target[remove](type, wrap(type, target, listener, scope || target), false); - return listener; - }; - - root.stop = - root.stopPropagation = function(event) { - if (event.stopPropagation) { - event.stopPropagation(); - } else { // <= IE8 - event.cancelBubble = true; - } - }; - - root.prevent = - root.preventDefault = function(event) { - if (event.preventDefault) { - event.preventDefault(); - } else { // <= IE8 - event.returnValue = false; - } - }; - - ///////////// - - var standardize = function(type) { // fix any browser discrepancies - if (!document.addEventListener) { - return "on" + type; - } else if (type === "mousewheel" && !("onmousewheel" in testElement)) { - return "DOMMouseScroll"; - } else { // - return type; - } - }; - - var wrap = function(type, target, listener, scope) { // un-tracked wrapper - var wrapperID = type + getEventID(target) + "." + getEventID(listener); - if (!wrappers[wrapperID]) { - wrappers[wrapperID] = function(event) { - return listener.call(scope, event); - }; - } - return wrappers[wrapperID]; - }; - // - return root; - // -})(Event); \ No newline at end of file diff --git a/inc/MIDI.js/js/MIDI.Plugin.js b/inc/MIDI.js/js/MIDI.Plugin.js deleted file mode 100644 index 9d26203..0000000 --- a/inc/MIDI.js/js/MIDI.Plugin.js +++ /dev/null @@ -1,486 +0,0 @@ -/* - - MIDI.Plugin : 0.3 - ------------------------------------- - https://github.com/mudx/MIDI.js - ------------------------------------- - MIDI.WebAudioAPI - MIDI.Flash - MIDI.HTML5 - MIDI.instruments - MIDI.channels - MIDI.keyToNote - MIDI.noteToKey - - setMute? - getInstruments? - -*/ - -if (typeof (MIDI) === "undefined") var MIDI = {}; -if (typeof (MIDI.Plugin) === "undefined") MIDI.Plugin = {}; - -(function() { "use strict"; - -/* - Web Audio API - OGG or MPEG Soundbank - -------------------------------------- - https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html -*/ - -if (typeof (MIDI.WebAudioAPI) === "undefined") MIDI.WebAudioAPI = {}; - -if (window.AudioContext || window.webkitAudioContext) (function () { - - var AudioContext = window.AudioContext || window.webkitAudioContext; - var root = MIDI.WebAudioAPI; - var ctx; - var sources = {}; - var masterVolume = 1; - var audioBuffers = {}; - var audioLoader = function (urlList, index, bufferList, oncomplete) { - var url = urlList[index]; - var base64 = MIDI.Soundfont[url].split(",")[1]; - var buffer = Base64Binary.decodeArrayBuffer(base64); - ctx.decodeAudioData(buffer, function (buffer) { - var msg = url; while(msg.length < 3) msg += " "; - if (typeof(loader) !== "undefined") { - loader.message("Downloading: 100%
    Processing: "+(index/87 * 100 >> 0)+"%
    " + msg); - } - buffer.id = url; - bufferList[index] = buffer; - // - if (bufferList.length === urlList.length) { - while (bufferList.length) { - buffer = bufferList.pop(); - var nodeId = MIDI.keyToNote[buffer.id]; - audioBuffers[nodeId] = buffer; - } - oncomplete(); - } - }); - }; - - root.setVolume = function (n) { - masterVolume = n; - }; - - root.programChange = function (instrument) { - - }; - - root.noteOn = function (channel, note, velocity, delay) { - /// check whether the note exists - if (!audioBuffers[note]) return; - /// convert relative delay to absolute delay - if (delay < ctx.currentTime) delay += ctx.currentTime; - /// crate audio buffer - var source = ctx.createBufferSource(); - sources[channel + "" + note] = source; - source.buffer = audioBuffers[note]; - source.connect(ctx.destination); - // - var gainNode = ctx.createGainNode(); - var value = -0.5 + (velocity / 100) * 2; - var minus = (1 - masterVolume) * 2; - gainNode.connect(ctx.destination); - gainNode.gain.value = Math.max(-1, value - minus); - source.connect(gainNode); - // -// source.playbackRate.value = 2; - /// - source.noteOn(delay || 0); - return source; - }; - - root.chordOn = function (channel, chord, velocity, delay) { - var ret = {}, note; - for (var n = 0, length = chord.length; n < length; n ++) { - ret[note = chord[n]] = root.noteOn(channel, note, velocity, delay); - } - return ret; - }; - - // FIX: needs some way to fade out smoothly.. - root.noteOff = function (channel, note, delay) { -// var source = sources[channel+""+note]; -// if (!source) return; -// source.noteOff(delay || 0); -// return source; - }; - - root.chordOff = function (channel, chord, delay) { - - }; - - root.connect = function (callback) { - - MIDI.lang = 'WebAudioAPI'; - MIDI.setVolume = root.setVolume; - MIDI.programChange = root.programChange; - MIDI.noteOn = root.noteOn; - MIDI.noteOff = root.noteOff; - MIDI.chordOn = root.chordOn; - MIDI.chordOff = root.chordOff; - // - MIDI.Player.ctx = ctx = new AudioContext(); - /// - var urlList = []; - var keyToNote = MIDI.keyToNote; - for (var key in keyToNote) urlList.push(key); - var bufferList = []; - for (var i = 0; i < urlList.length; i++) { - audioLoader(urlList, i, bufferList, callback); - } - }; - -})(); - -/* - HTML5