[kune-commits] r985 - in trunk/src:
main/java/org/ourproject/kune/app/public/css
main/java/org/ourproject/kune/blogs/client
main/java/org/ourproject/kune/blogs/client/cnt
main/java/org/ourproject/kune/chat/client
main/java/org/ourproject/kune/chat/client/cnt
main/java/org/ourproject/kune/docs/client
main/java/org/ourproject/kune/docs/client/cnt
main/java/org/ourproject/kune/gallery/client
main/java/org/ourproject/kune/gallery/client/cnt
main/java/org/ourproject/kune/platf/client/dto
main/java/org/ourproject/kune/platf/client/services
main/java/org/ourproject/kune/platf/client/ui
main/java/org/ourproject/kune/platf/server
main/java/org/ourproject/kune/platf/server/domain
main/java/org/ourproject/kune/platf/server/manager/file
main/java/org/ourproject/kune/platf/server/utils
main/java/org/ourproject/kune/wiki/client
main/java/org/ourproject/kune/wiki/client/cnt
main/java/org/ourproject/kune/workspace/client/cnt
main/java/org/ourproject/kune/workspace/client/ctxnav
main/java/org/ourproject/kune/workspace/client/editor main/resources
test/java/org/ourproject/kune/platf/server/manager/file
vjrj
vjrj at ourproject.org
Fri Dec 5 18:53:54 CET 2008
Author: vjrj
Date: 2008-12-05 18:53:45 +0100 (Fri, 05 Dec 2008)
New Revision: 985
Added:
trunk/src/main/java/org/ourproject/kune/platf/server/utils/
trunk/src/main/java/org/ourproject/kune/platf/server/utils/StringW.java
trunk/src/main/java/org/ourproject/kune/platf/server/utils/XmlW.java
trunk/src/test/java/org/ourproject/kune/platf/server/manager/file/orig.pdf
Modified:
trunk/src/main/java/org/ourproject/kune/app/public/css/all.css
trunk/src/main/java/org/ourproject/kune/app/public/css/kune-new.css
trunk/src/main/java/org/ourproject/kune/blogs/client/BlogClientModule.java
trunk/src/main/java/org/ourproject/kune/blogs/client/cnt/BlogFolderContentPresenter.java
trunk/src/main/java/org/ourproject/kune/blogs/client/cnt/BlogViewerPresenter.java
trunk/src/main/java/org/ourproject/kune/blogs/client/cnt/BlogViewerView.java
trunk/src/main/java/org/ourproject/kune/chat/client/ChatClientModule.java
trunk/src/main/java/org/ourproject/kune/chat/client/cnt/ChatRoomPresenter.java
trunk/src/main/java/org/ourproject/kune/docs/client/DocumentClientActions.java
trunk/src/main/java/org/ourproject/kune/docs/client/DocumentClientModule.java
trunk/src/main/java/org/ourproject/kune/docs/client/DocumentClientTool.java
trunk/src/main/java/org/ourproject/kune/docs/client/cnt/DocFolderContentPanel.java
trunk/src/main/java/org/ourproject/kune/docs/client/cnt/DocFolderContentPresenter.java
trunk/src/main/java/org/ourproject/kune/docs/client/cnt/DocumentViewerPresenter.java
trunk/src/main/java/org/ourproject/kune/docs/client/cnt/DocumentViewerView.java
trunk/src/main/java/org/ourproject/kune/gallery/client/GalleryClientModule.java
trunk/src/main/java/org/ourproject/kune/gallery/client/GalleryClientTool.java
trunk/src/main/java/org/ourproject/kune/gallery/client/cnt/GalleryFolderContentPanel.java
trunk/src/main/java/org/ourproject/kune/gallery/client/cnt/GalleryFolderContentPresenter.java
trunk/src/main/java/org/ourproject/kune/gallery/client/cnt/GalleryViewerPresenter.java
trunk/src/main/java/org/ourproject/kune/gallery/client/cnt/GalleryViewerView.java
trunk/src/main/java/org/ourproject/kune/platf/client/dto/BasicMimeTypeDTO.java
trunk/src/main/java/org/ourproject/kune/platf/client/services/KuneModule.java
trunk/src/main/java/org/ourproject/kune/platf/client/ui/KuneUiUtils.java
trunk/src/main/java/org/ourproject/kune/platf/server/domain/BasicMimeType.java
trunk/src/main/java/org/ourproject/kune/platf/server/manager/file/FileDownloadManager.java
trunk/src/main/java/org/ourproject/kune/platf/server/manager/file/FileUploadManager.java
trunk/src/main/java/org/ourproject/kune/platf/server/manager/file/ImageUtilsDefault.java
trunk/src/main/java/org/ourproject/kune/wiki/client/WikiClientActions.java
trunk/src/main/java/org/ourproject/kune/wiki/client/WikiClientModule.java
trunk/src/main/java/org/ourproject/kune/wiki/client/WikiClientTool.java
trunk/src/main/java/org/ourproject/kune/wiki/client/cnt/WikiFolderContentPresenter.java
trunk/src/main/java/org/ourproject/kune/wiki/client/cnt/WikiViewerPresenter.java
trunk/src/main/java/org/ourproject/kune/wiki/client/cnt/WikiViewerView.java
trunk/src/main/java/org/ourproject/kune/workspace/client/cnt/AbstractContentPresenter.java
trunk/src/main/java/org/ourproject/kune/workspace/client/cnt/AbstractContentView.java
trunk/src/main/java/org/ourproject/kune/workspace/client/cnt/FoldableContentPanel.java
trunk/src/main/java/org/ourproject/kune/workspace/client/cnt/FoldableContentPresenter.java
trunk/src/main/java/org/ourproject/kune/workspace/client/ctxnav/ContextNavigatorPresenter.java
trunk/src/main/java/org/ourproject/kune/workspace/client/editor/TextEditorPanel.java
trunk/src/main/java/org/ourproject/kune/workspace/client/editor/TextEditorToolbar.java
trunk/src/main/resources/kune.properties
trunk/src/test/java/org/ourproject/kune/platf/server/manager/file/ImageUtilsDefaultTest.java
Log:
Preview of uploaded files (different than images).
Complete - task pdf to img for previews
Complete - task Text files preview
Modified: trunk/src/main/java/org/ourproject/kune/app/public/css/all.css
===================================================================
--- trunk/src/main/java/org/ourproject/kune/app/public/css/all.css 2008-12-05 16:22:07 UTC (rev 984)
+++ trunk/src/main/java/org/ourproject/kune/app/public/css/all.css 2008-12-05 17:53:45 UTC (rev 985)
@@ -41,4 +41,4 @@
padding: 1px 0px 1px 1px;
text-decoration:none;
}
-*/.k-textlinethrough{text-decoration:line-through;color:red;}.k-textnormal{text-decoration:inherit;color:green;}.k-textunderline{text-decoration:underline;color:gray;}.x-tool-kmenu{background-position:0 -75px;}.x-tool-kmenu-over{background-position:-15px -75px;}.k-border-openbox{border-bottom:1px #D0D0D0 solid;border-right:1px #D0D0D0 solid;border-left:1px #D0D0D0 solid;}/* SiteToastMessages */.k-stm-info-icon{background-image:url(img/info.gif)!important;}.k-stm-imp-icon{background-image:url(img/alert.gif)!important;}.k-stm-verimp-icon{background-image:url(img/important.gif)!important;}.k-stm-error-icon{background-image:url(img/error.gif)!important;}.k-error-tb{background:#FFB380 none repeat scroll 0 50%;color:#250;}.k-infod-head{font-size:108%;margin-bottom:10px;}.gwt-DisclosurePanel{}.gwt-DisclosurePanel-open{}.gwt-DisclosurePanel-closed{}.gwt-DisclosurePanel .header,.gwt-DisclosurePanel .header a,.gwt-DisclosurePanel .header td{text-decoration:none;/* Remove underline from header */color:#000;cursor:pointer;cursor:hand;}.gwt-DisclosurePanel .content{border-left:3px solid #e8eef7;padding:4px 0 4px 8px;margin-left:6px;}.k-basic-thumb{background:#FAFAFA none repeat scroll 0 50%;border:1px solid #EBEBEB;padding:3px;margin:3px;}.k-basic-thumb td{padding:2px 3px;border:none;}.k-text-gray{color:gray;}.k-elp-limg{margin-top:4px;margin-left:5px;cursor:pointer;}.k-tsp-tag{float:right;margin-right:5px;cursor:pointer;color:#00F;}.k-tsp-cloud{vertical-align:bottom;}.k-options-icon{background-image:url(img/emblem-system.gif)!important;}.x-toolbar-body table{width:100%;}
\ No newline at end of file
+*/.k-textlinethrough{text-decoration:line-through;color:red;}.k-textnormal{text-decoration:inherit;color:green;}.k-textunderline{text-decoration:underline;color:gray;}.x-tool-kmenu{background-position:0 -75px;}.x-tool-kmenu-over{background-position:-15px -75px;}.k-border-openbox{border-bottom:1px #D0D0D0 solid;border-right:1px #D0D0D0 solid;border-left:1px #D0D0D0 solid;}/* SiteToastMessages */.k-stm-info-icon{background-image:url(img/info.gif)!important;}.k-stm-imp-icon{background-image:url(img/alert.gif)!important;}.k-stm-verimp-icon{background-image:url(img/important.gif)!important;}.k-stm-error-icon{background-image:url(img/error.gif)!important;}.k-error-tb{background:#FFB380 none repeat scroll 0 50%;color:#250;}.k-infod-head{font-size:108%;margin-bottom:10px;}.gwt-DisclosurePanel{}.gwt-DisclosurePanel-open{}.gwt-DisclosurePanel-closed{}.gwt-DisclosurePanel .header,.gwt-DisclosurePanel .header a,.gwt-DisclosurePanel .header td{text-decoration:none;/* Remove underline from header */color:#000;cursor:pointer;cursor:hand;}.gwt-DisclosurePanel .content{border-left:3px solid #e8eef7;padding:4px 0 4px 8px;margin-left:6px;}.k-basic-thumb{background:#FAFAFA none repeat scroll 0 50%;border:1px solid #EBEBEB;padding:3px;margin:3px;}.k-basic-thumb td{padding:2px 3px;border:none;}.k-text-gray{color:gray;}.k-elp-limg{margin-top:4px;margin-left:5px;cursor:pointer;}.k-tsp-tag{float:right;margin-right:5px;cursor:pointer;color:#00F;}.k-tsp-cloud{vertical-align:bottom;}.k-options-icon{background-image:url(img/emblem-system.gif)!important;}.x-toolbar-body table{/* width: 100%; */}.k-preview-msg{background:#FCA;}.k-preview-msg-lab{background:#FCA;padding:0 5px;}
\ No newline at end of file
Modified: trunk/src/main/java/org/ourproject/kune/app/public/css/kune-new.css
===================================================================
--- trunk/src/main/java/org/ourproject/kune/app/public/css/kune-new.css 2008-12-05 16:22:07 UTC (rev 984)
+++ trunk/src/main/java/org/ourproject/kune/app/public/css/kune-new.css 2008-12-05 17:53:45 UTC (rev 985)
@@ -816,6 +816,15 @@
}
.x-toolbar-body table {
- width: 100%;
+ /* width: 100%; */
}
+.k-preview-msg
+ {
+ background: #FFCCAA;
+}
+.k-preview-msg-lab
+ {
+ background: #FFCCAA;
+ padding: 0 5px;
+}
Modified: trunk/src/main/java/org/ourproject/kune/blogs/client/BlogClientModule.java
===================================================================
--- trunk/src/main/java/org/ourproject/kune/blogs/client/BlogClientModule.java 2008-12-05 16:22:07 UTC (rev 984)
+++ trunk/src/main/java/org/ourproject/kune/blogs/client/BlogClientModule.java 2008-12-05 17:53:45 UTC (rev 985)
@@ -108,7 +108,7 @@
public BlogFolderContent create() {
final BlogFolderContentPresenter presenter = new BlogFolderContentPresenter($(StateManager.class),
$(Session.class), $(ActionContentToolbar.class), $(ContentActionRegistry.class),
- $(I18nTranslationService.class));
+ $(I18nTranslationService.class), $$(FileDownloadUtils.class));
final BlogFolderContentView view = new BlogFolderContentPanel($(WorkspaceSkeleton.class),
$(I18nTranslationService.class));
presenter.init(view);
Modified: trunk/src/main/java/org/ourproject/kune/blogs/client/cnt/BlogFolderContentPresenter.java
===================================================================
--- trunk/src/main/java/org/ourproject/kune/blogs/client/cnt/BlogFolderContentPresenter.java 2008-12-05 16:22:07 UTC (rev 984)
+++ trunk/src/main/java/org/ourproject/kune/blogs/client/cnt/BlogFolderContentPresenter.java 2008-12-05 17:53:45 UTC (rev 985)
@@ -27,16 +27,20 @@
import org.ourproject.kune.platf.client.services.I18nTranslationService;
import org.ourproject.kune.platf.client.state.Session;
import org.ourproject.kune.platf.client.state.StateManager;
+import org.ourproject.kune.platf.client.ui.download.FileDownloadUtils;
import org.ourproject.kune.workspace.client.cnt.FoldableContentPresenter;
+import com.calclab.suco.client.ioc.Provider;
+
public class BlogFolderContentPresenter extends FoldableContentPresenter implements BlogFolderContent {
private BlogFolderContentView view;
private final I18nTranslationService i18n;
public BlogFolderContentPresenter(StateManager stateManager, Session session, ActionContentToolbar toolbar,
- final ActionRegistry<StateToken> actionRegistry, I18nTranslationService i18n) {
- super(BlogClientTool.NAME, stateManager, session, toolbar, actionRegistry);
+ final ActionRegistry<StateToken> actionRegistry, I18nTranslationService i18n,
+ Provider<FileDownloadUtils> downloadProvider) {
+ super(BlogClientTool.NAME, stateManager, session, toolbar, actionRegistry, downloadProvider);
this.i18n = i18n;
}
Modified: trunk/src/main/java/org/ourproject/kune/blogs/client/cnt/BlogViewerPresenter.java
===================================================================
--- trunk/src/main/java/org/ourproject/kune/blogs/client/cnt/BlogViewerPresenter.java 2008-12-05 16:22:07 UTC (rev 984)
+++ trunk/src/main/java/org/ourproject/kune/blogs/client/cnt/BlogViewerPresenter.java 2008-12-05 17:53:45 UTC (rev 985)
@@ -22,62 +22,31 @@
import org.ourproject.kune.blogs.client.BlogClientTool;
import org.ourproject.kune.platf.client.actions.ContentActionRegistry;
import org.ourproject.kune.platf.client.actions.toolbar.ActionContentToolbar;
-import org.ourproject.kune.platf.client.dto.BasicMimeTypeDTO;
import org.ourproject.kune.platf.client.dto.StateContentDTO;
-import org.ourproject.kune.platf.client.dto.StateToken;
import org.ourproject.kune.platf.client.state.Session;
import org.ourproject.kune.platf.client.state.StateManager;
import org.ourproject.kune.platf.client.ui.download.FileDownloadUtils;
-import org.ourproject.kune.platf.client.ui.download.ImageSize;
import org.ourproject.kune.workspace.client.cnt.FoldableContentPresenter;
import org.ourproject.kune.workspace.client.i18n.I18nUITranslationService;
import com.calclab.suco.client.ioc.Provider;
public class BlogViewerPresenter extends FoldableContentPresenter implements BlogViewer {
- private BlogViewerView view;
- private final Provider<FileDownloadUtils> downloadProvider;
public BlogViewerPresenter(StateManager stateManager, Session session, I18nUITranslationService i18n,
ActionContentToolbar toolbar, ContentActionRegistry actionRegistry,
Provider<FileDownloadUtils> downloadProvider) {
- super(BlogClientTool.NAME, stateManager, session, toolbar, actionRegistry);
- this.downloadProvider = downloadProvider;
+ super(BlogClientTool.NAME, stateManager, session, toolbar, actionRegistry, downloadProvider);
}
public void init(BlogViewerView view) {
super.init(view);
- this.view = view;
}
@Override
protected void setState(StateContentDTO state) {
super.setState(state);
- setContent(state, BlogClientTool.TYPE_UPLOADEDFILE);
+ super.setContent(state, BlogClientTool.TYPE_UPLOADEDFILE);
}
- private void setContent(StateContentDTO state, String uploadedfileType) {
- String typeId = state.getTypeId();
- String contentBody = state.getContent();
- StateToken token = state.getStateToken();
- BasicMimeTypeDTO mimeType = state.getMimeType();
- if (typeId.equals(uploadedfileType)) {
- if (mimeType != null) {
- FileDownloadUtils fileDownloadUtils = downloadProvider.get();
- if (mimeType.getType().equals("image")) {
- view.showImage(fileDownloadUtils.getImageUrl(token), fileDownloadUtils.getImageResizedUrl(token,
- ImageSize.sized));
- } else if (mimeType.toString().equals("text/plain") || mimeType.toString().equals("application/pdf")) {
- view.setContent(contentBody);
- } else {
- view.setContent("");
- }
- } else {
- view.setContent("");
- }
- } else {
- view.setContent(contentBody);
- }
- view.attach();
- }
}
Modified: trunk/src/main/java/org/ourproject/kune/blogs/client/cnt/BlogViewerView.java
===================================================================
--- trunk/src/main/java/org/ourproject/kune/blogs/client/cnt/BlogViewerView.java 2008-12-05 16:22:07 UTC (rev 984)
+++ trunk/src/main/java/org/ourproject/kune/blogs/client/cnt/BlogViewerView.java 2008-12-05 17:53:45 UTC (rev 985)
@@ -23,8 +23,4 @@
public interface BlogViewerView extends AbstractContentView {
- void setContent(String content);
-
- void showImage(String imageUrl, String imageResizedUrl);
-
}
Modified: trunk/src/main/java/org/ourproject/kune/chat/client/ChatClientModule.java
===================================================================
--- trunk/src/main/java/org/ourproject/kune/chat/client/ChatClientModule.java 2008-12-05 16:22:07 UTC (rev 984)
+++ trunk/src/main/java/org/ourproject/kune/chat/client/ChatClientModule.java 2008-12-05 17:53:45 UTC (rev 985)
@@ -37,6 +37,7 @@
import org.ourproject.kune.platf.client.state.Session;
import org.ourproject.kune.platf.client.state.StateManager;
import org.ourproject.kune.platf.client.tool.ToolSelector;
+import org.ourproject.kune.platf.client.ui.download.FileDownloadUtils;
import org.ourproject.kune.workspace.client.ctxnav.ContextNavigator;
import org.ourproject.kune.workspace.client.i18n.I18nUITranslationService;
import org.ourproject.kune.workspace.client.skel.WorkspaceSkeleton;
@@ -91,7 +92,7 @@
public ChatRoom create() {
final ChatRoomPresenter presenter = new ChatRoomPresenter($(StateManager.class), $(Session.class),
$(I18nUITranslationService.class), $(ActionContentToolbar.class),
- $(ContentActionRegistry.class));
+ $(ContentActionRegistry.class), $$(FileDownloadUtils.class));
final ChatRoomPanel panel = new ChatRoomPanel($(WorkspaceSkeleton.class),
$(I18nTranslationService.class));
presenter.init(panel);
Modified: trunk/src/main/java/org/ourproject/kune/chat/client/cnt/ChatRoomPresenter.java
===================================================================
--- trunk/src/main/java/org/ourproject/kune/chat/client/cnt/ChatRoomPresenter.java 2008-12-05 16:22:07 UTC (rev 984)
+++ trunk/src/main/java/org/ourproject/kune/chat/client/cnt/ChatRoomPresenter.java 2008-12-05 17:53:45 UTC (rev 985)
@@ -26,18 +26,22 @@
import org.ourproject.kune.platf.client.dto.StateToken;
import org.ourproject.kune.platf.client.state.Session;
import org.ourproject.kune.platf.client.state.StateManager;
+import org.ourproject.kune.platf.client.ui.download.FileDownloadUtils;
import org.ourproject.kune.workspace.client.cnt.FoldableContentPresenter;
import org.ourproject.kune.workspace.client.i18n.I18nUITranslationService;
import org.ourproject.kune.workspace.client.site.Site;
+import com.calclab.suco.client.ioc.Provider;
+
public class ChatRoomPresenter extends FoldableContentPresenter implements ChatRoom {
private ChatRoomView view;
private final I18nUITranslationService i18n;
public ChatRoomPresenter(StateManager stateManager, Session session, I18nUITranslationService i18n,
- ActionContentToolbar toolbar, final ActionRegistry<StateToken> actionRegistry) {
- super(ChatClientTool.NAME, stateManager, session, toolbar, actionRegistry);
+ ActionContentToolbar toolbar, final ActionRegistry<StateToken> actionRegistry,
+ Provider<FileDownloadUtils> downloadProvider) {
+ super(ChatClientTool.NAME, stateManager, session, toolbar, actionRegistry, downloadProvider);
this.i18n = i18n;
}
Modified: trunk/src/main/java/org/ourproject/kune/docs/client/DocumentClientActions.java
===================================================================
--- trunk/src/main/java/org/ourproject/kune/docs/client/DocumentClientActions.java 2008-12-05 16:22:07 UTC (rev 984)
+++ trunk/src/main/java/org/ourproject/kune/docs/client/DocumentClientActions.java 2008-12-05 17:53:45 UTC (rev 985)
@@ -100,7 +100,7 @@
createEditAction(TYPE_DOCUMENT);
- createTranslateAction(TYPE_DOCUMENT, TYPE_FOLDER, TYPE_UPLOADEDFILE);
+ createTranslateAction(TYPE_DOCUMENT, TYPE_FOLDER);
createDelContainerAction("Delete folder", parentMenuTitleCtx, containersNoRoot);
createDelContentAction(parentMenuTitle, i18n.t("Delete"), contents);
Modified: trunk/src/main/java/org/ourproject/kune/docs/client/DocumentClientModule.java
===================================================================
--- trunk/src/main/java/org/ourproject/kune/docs/client/DocumentClientModule.java 2008-12-05 16:22:07 UTC (rev 984)
+++ trunk/src/main/java/org/ourproject/kune/docs/client/DocumentClientModule.java 2008-12-05 17:53:45 UTC (rev 985)
@@ -76,8 +76,8 @@
$(Session.class), $(StateManager.class), $(DeferredCommandWrapper.class),
$$(ContentServiceAsync.class), $$(GroupServiceAsync.class), $$(FileUploader.class),
$(ContentActionRegistry.class), $(ContextActionRegistry.class), $$(FileDownloadUtils.class),
- $(EntityHeader.class), $$(TextEditor.class), $(KuneErrorHandler.class), $(DocumentViewer.class),
- $$(ContextPropEditor.class));
+ $(EntityHeader.class), $$(TextEditor.class), $(KuneErrorHandler.class),
+ $(DocumentViewer.class), $$(ContextPropEditor.class));
}
});
@@ -107,7 +107,8 @@
@Override
public DocFolderContent create() {
final DocFolderContentPresenter presenter = new DocFolderContentPresenter($(StateManager.class),
- $(Session.class), $(ActionContentToolbar.class), $(ContentActionRegistry.class));
+ $(Session.class), $(ActionContentToolbar.class), $(ContentActionRegistry.class),
+ $$(FileDownloadUtils.class));
final DocFolderContentView view = new DocFolderContentPanel($(WorkspaceSkeleton.class),
$(I18nTranslationService.class));
presenter.init(view);
Modified: trunk/src/main/java/org/ourproject/kune/docs/client/DocumentClientTool.java
===================================================================
--- trunk/src/main/java/org/ourproject/kune/docs/client/DocumentClientTool.java 2008-12-05 16:22:07 UTC (rev 984)
+++ trunk/src/main/java/org/ourproject/kune/docs/client/DocumentClientTool.java 2008-12-05 17:53:45 UTC (rev 985)
@@ -46,7 +46,7 @@
registerRateableTypes(TYPE_DOCUMENT, TYPE_UPLOADEDFILE);
registerRenamableTypes(TYPE_DOCUMENT, TYPE_FOLDER, TYPE_UPLOADEDFILE);
registerTageableTypes(TYPE_DOCUMENT, TYPE_UPLOADEDFILE);
- registerTranslatableTypes(TYPE_DOCUMENT, TYPE_FOLDER, TYPE_UPLOADEDFILE);
+ registerTranslatableTypes(TYPE_DOCUMENT, TYPE_FOLDER);
registerIcons();
}
Modified: trunk/src/main/java/org/ourproject/kune/docs/client/cnt/DocFolderContentPanel.java
===================================================================
--- trunk/src/main/java/org/ourproject/kune/docs/client/cnt/DocFolderContentPanel.java 2008-12-05 16:22:07 UTC (rev 984)
+++ trunk/src/main/java/org/ourproject/kune/docs/client/cnt/DocFolderContentPanel.java 2008-12-05 17:53:45 UTC (rev 985)
@@ -21,13 +21,11 @@
import org.ourproject.kune.platf.client.services.I18nTranslationService;
import org.ourproject.kune.workspace.client.cnt.FoldableContentPanel;
-import org.ourproject.kune.workspace.client.site.Site;
import org.ourproject.kune.workspace.client.skel.WorkspaceSkeleton;
public class DocFolderContentPanel extends FoldableContentPanel implements DocFolderContentView {
public DocFolderContentPanel(WorkspaceSkeleton ws, I18nTranslationService i18n) {
super(ws, i18n);
- super.setLabel("Folder properties, translations ..." + Site.IN_DEVELOPMENT);
}
}
Modified: trunk/src/main/java/org/ourproject/kune/docs/client/cnt/DocFolderContentPresenter.java
===================================================================
--- trunk/src/main/java/org/ourproject/kune/docs/client/cnt/DocFolderContentPresenter.java 2008-12-05 16:22:07 UTC (rev 984)
+++ trunk/src/main/java/org/ourproject/kune/docs/client/cnt/DocFolderContentPresenter.java 2008-12-05 17:53:45 UTC (rev 985)
@@ -25,13 +25,16 @@
import org.ourproject.kune.platf.client.dto.StateToken;
import org.ourproject.kune.platf.client.state.Session;
import org.ourproject.kune.platf.client.state.StateManager;
+import org.ourproject.kune.platf.client.ui.download.FileDownloadUtils;
import org.ourproject.kune.workspace.client.cnt.FoldableContentPresenter;
+import com.calclab.suco.client.ioc.Provider;
+
public class DocFolderContentPresenter extends FoldableContentPresenter implements DocFolderContent {
public DocFolderContentPresenter(StateManager stateManager, Session session, ActionContentToolbar toolbar,
- final ActionRegistry<StateToken> actionRegistry) {
- super(DocumentClientTool.NAME, stateManager, session, toolbar, actionRegistry);
+ final ActionRegistry<StateToken> actionRegistry, Provider<FileDownloadUtils> downloadProvider) {
+ super(DocumentClientTool.NAME, stateManager, session, toolbar, actionRegistry, downloadProvider);
}
public void init(final DocFolderContentView view) {
Modified: trunk/src/main/java/org/ourproject/kune/docs/client/cnt/DocumentViewerPresenter.java
===================================================================
--- trunk/src/main/java/org/ourproject/kune/docs/client/cnt/DocumentViewerPresenter.java 2008-12-05 16:22:07 UTC (rev 984)
+++ trunk/src/main/java/org/ourproject/kune/docs/client/cnt/DocumentViewerPresenter.java 2008-12-05 17:53:45 UTC (rev 985)
@@ -22,32 +22,25 @@
import org.ourproject.kune.docs.client.DocumentClientTool;
import org.ourproject.kune.platf.client.actions.ContentActionRegistry;
import org.ourproject.kune.platf.client.actions.toolbar.ActionContentToolbar;
-import org.ourproject.kune.platf.client.dto.BasicMimeTypeDTO;
import org.ourproject.kune.platf.client.dto.StateContentDTO;
-import org.ourproject.kune.platf.client.dto.StateToken;
import org.ourproject.kune.platf.client.state.Session;
import org.ourproject.kune.platf.client.state.StateManager;
import org.ourproject.kune.platf.client.ui.download.FileDownloadUtils;
-import org.ourproject.kune.platf.client.ui.download.ImageSize;
import org.ourproject.kune.workspace.client.cnt.FoldableContentPresenter;
import org.ourproject.kune.workspace.client.i18n.I18nUITranslationService;
import com.calclab.suco.client.ioc.Provider;
public class DocumentViewerPresenter extends FoldableContentPresenter implements DocumentViewer {
- private DocumentViewerView view;
- private final Provider<FileDownloadUtils> downloadProvider;
public DocumentViewerPresenter(StateManager stateManager, Session session, I18nUITranslationService i18n,
ActionContentToolbar toolbar, ContentActionRegistry actionRegistry,
Provider<FileDownloadUtils> downloadProvider) {
- super(DocumentClientTool.NAME, stateManager, session, toolbar, actionRegistry);
- this.downloadProvider = downloadProvider;
+ super(DocumentClientTool.NAME, stateManager, session, toolbar, actionRegistry, downloadProvider);
}
public void init(DocumentViewerView view) {
super.init(view);
- this.view = view;
}
@Override
@@ -55,29 +48,4 @@
super.setState(state);
setContent(state, DocumentClientTool.TYPE_UPLOADEDFILE);
}
-
- private void setContent(StateContentDTO state, String uploadedfileType) {
- String typeId = state.getTypeId();
- String contentBody = state.getContent();
- StateToken token = state.getStateToken();
- BasicMimeTypeDTO mimeType = state.getMimeType();
- if (typeId.equals(uploadedfileType)) {
- if (mimeType != null) {
- FileDownloadUtils fileDownloadUtils = downloadProvider.get();
- if (mimeType.getType().equals("image")) {
- view.showImage(fileDownloadUtils.getImageUrl(token), fileDownloadUtils.getImageResizedUrl(token,
- ImageSize.sized));
- } else if (mimeType.toString().equals("text/plain") || mimeType.toString().equals("application/pdf")) {
- view.setContent(contentBody);
- } else {
- view.setContent("");
- }
- } else {
- view.setContent("");
- }
- } else {
- view.setContent(contentBody);
- }
- view.attach();
- }
}
Modified: trunk/src/main/java/org/ourproject/kune/docs/client/cnt/DocumentViewerView.java
===================================================================
--- trunk/src/main/java/org/ourproject/kune/docs/client/cnt/DocumentViewerView.java 2008-12-05 16:22:07 UTC (rev 984)
+++ trunk/src/main/java/org/ourproject/kune/docs/client/cnt/DocumentViewerView.java 2008-12-05 17:53:45 UTC (rev 985)
@@ -22,9 +22,4 @@
import org.ourproject.kune.workspace.client.cnt.AbstractContentView;
public interface DocumentViewerView extends AbstractContentView {
-
- void setContent(String content);
-
- void showImage(String imageUrl, String imageResizedUrl);
-
}
Modified: trunk/src/main/java/org/ourproject/kune/gallery/client/GalleryClientModule.java
===================================================================
--- trunk/src/main/java/org/ourproject/kune/gallery/client/GalleryClientModule.java 2008-12-05 16:22:07 UTC (rev 984)
+++ trunk/src/main/java/org/ourproject/kune/gallery/client/GalleryClientModule.java 2008-12-05 17:53:45 UTC (rev 985)
@@ -108,9 +108,10 @@
public GalleryFolderContent create() {
final GalleryFolderContentPresenter presenter = new GalleryFolderContentPresenter(
$(StateManager.class), $(Session.class), $(ActionContentToolbar.class),
- $(ContentActionRegistry.class), $(I18nTranslationService.class), $$(FileDownloadUtils.class));
+ $(ContentActionRegistry.class), $(I18nTranslationService.class), $$(FileDownloadUtils.class),
+ $$(FileDownloadUtils.class));
final GalleryFolderContentView view = new GalleryFolderContentPanel($(WorkspaceSkeleton.class),
- $(I18nTranslationService.class), $(StateManager.class));
+ $(I18nTranslationService.class), $(StateManager.class), $(Session.class));
presenter.init(view);
return presenter;
}
Modified: trunk/src/main/java/org/ourproject/kune/gallery/client/GalleryClientTool.java
===================================================================
--- trunk/src/main/java/org/ourproject/kune/gallery/client/GalleryClientTool.java 2008-12-05 16:22:07 UTC (rev 984)
+++ trunk/src/main/java/org/ourproject/kune/gallery/client/GalleryClientTool.java 2008-12-05 17:53:45 UTC (rev 985)
@@ -45,7 +45,7 @@
registerRateableTypes(TYPE_UPLOADEDFILE);
registerRenamableTypes(TYPE_ALBUM, TYPE_UPLOADEDFILE);
registerTageableTypes(TYPE_UPLOADEDFILE);
- registerTranslatableTypes(TYPE_ALBUM, TYPE_UPLOADEDFILE);
+ // registerTranslatableTypes();
registerIcons();
}
Modified: trunk/src/main/java/org/ourproject/kune/gallery/client/cnt/GalleryFolderContentPanel.java
===================================================================
--- trunk/src/main/java/org/ourproject/kune/gallery/client/cnt/GalleryFolderContentPanel.java 2008-12-05 16:22:07 UTC (rev 984)
+++ trunk/src/main/java/org/ourproject/kune/gallery/client/cnt/GalleryFolderContentPanel.java 2008-12-05 17:53:45 UTC (rev 985)
@@ -21,6 +21,7 @@
import org.ourproject.kune.platf.client.dto.StateToken;
import org.ourproject.kune.platf.client.services.I18nTranslationService;
+import org.ourproject.kune.platf.client.state.Session;
import org.ourproject.kune.platf.client.state.StateManager;
import org.ourproject.kune.platf.client.ui.BasicThumb;
import org.ourproject.kune.workspace.client.cnt.FoldableContentPanel;
@@ -37,20 +38,24 @@
private static final int TEXT_MAX_LENGHT = 15;
private FlowPanel flowPanel;
private final StateManager stateManager;
+ private final Session session;
- public GalleryFolderContentPanel(WorkspaceSkeleton ws, I18nTranslationService i18n, StateManager stateManager) {
+ public GalleryFolderContentPanel(WorkspaceSkeleton ws, I18nTranslationService i18n, StateManager stateManager,
+ Session session) {
super(ws, i18n);
this.stateManager = stateManager;
+ this.session = session;
}
public void addThumb(final StateToken token, final String title, final String imgUrl) {
DeferredCommand.addCommand(new Command() {
public void execute() {
- BasicThumb thumb = new BasicThumb(imgUrl, 85, title, TEXT_MAX_LENGHT, true, new ClickListener() {
- public void onClick(Widget sender) {
- stateManager.gotoToken(token);
- }
- });
+ BasicThumb thumb = new BasicThumb(imgUrl, session.getImgCropsize(), title, TEXT_MAX_LENGHT, true,
+ new ClickListener() {
+ public void onClick(Widget sender) {
+ stateManager.gotoToken(token);
+ }
+ });
thumb.setHeight("100");
thumb.setWidth("100");
if (title.length() > TEXT_MAX_LENGHT) {
@@ -67,6 +72,6 @@
} else {
flowPanel.clear();
}
- super.setContent(flowPanel);
+ super.setWidgetAsContent(flowPanel, true);
}
}
Modified: trunk/src/main/java/org/ourproject/kune/gallery/client/cnt/GalleryFolderContentPresenter.java
===================================================================
--- trunk/src/main/java/org/ourproject/kune/gallery/client/cnt/GalleryFolderContentPresenter.java 2008-12-05 16:22:07 UTC (rev 984)
+++ trunk/src/main/java/org/ourproject/kune/gallery/client/cnt/GalleryFolderContentPresenter.java 2008-12-05 17:53:45 UTC (rev 985)
@@ -43,8 +43,8 @@
public GalleryFolderContentPresenter(StateManager stateManager, Session session, ActionContentToolbar toolbar,
final ActionRegistry<StateToken> actionRegistry, I18nTranslationService i18n,
- Provider<FileDownloadUtils> downloadUtils) {
- super(GalleryClientTool.NAME, stateManager, session, toolbar, actionRegistry);
+ Provider<FileDownloadUtils> downloadUtils, Provider<FileDownloadUtils> downloadProvider) {
+ super(GalleryClientTool.NAME, stateManager, session, toolbar, actionRegistry, downloadProvider);
this.i18n = i18n;
this.downloadUtils = downloadUtils;
}
Modified: trunk/src/main/java/org/ourproject/kune/gallery/client/cnt/GalleryViewerPresenter.java
===================================================================
--- trunk/src/main/java/org/ourproject/kune/gallery/client/cnt/GalleryViewerPresenter.java 2008-12-05 16:22:07 UTC (rev 984)
+++ trunk/src/main/java/org/ourproject/kune/gallery/client/cnt/GalleryViewerPresenter.java 2008-12-05 17:53:45 UTC (rev 985)
@@ -22,32 +22,25 @@
import org.ourproject.kune.gallery.client.GalleryClientTool;
import org.ourproject.kune.platf.client.actions.ContentActionRegistry;
import org.ourproject.kune.platf.client.actions.toolbar.ActionContentToolbar;
-import org.ourproject.kune.platf.client.dto.BasicMimeTypeDTO;
import org.ourproject.kune.platf.client.dto.StateContentDTO;
-import org.ourproject.kune.platf.client.dto.StateToken;
import org.ourproject.kune.platf.client.state.Session;
import org.ourproject.kune.platf.client.state.StateManager;
import org.ourproject.kune.platf.client.ui.download.FileDownloadUtils;
-import org.ourproject.kune.platf.client.ui.download.ImageSize;
import org.ourproject.kune.workspace.client.cnt.FoldableContentPresenter;
import org.ourproject.kune.workspace.client.i18n.I18nUITranslationService;
import com.calclab.suco.client.ioc.Provider;
public class GalleryViewerPresenter extends FoldableContentPresenter implements GalleryViewer {
- private GalleryViewerView view;
- private final Provider<FileDownloadUtils> downloadProvider;
public GalleryViewerPresenter(StateManager stateManager, Session session, I18nUITranslationService i18n,
ActionContentToolbar toolbar, ContentActionRegistry actionRegistry,
Provider<FileDownloadUtils> downloadProvider) {
- super(GalleryClientTool.NAME, stateManager, session, toolbar, actionRegistry);
- this.downloadProvider = downloadProvider;
+ super(GalleryClientTool.NAME, stateManager, session, toolbar, actionRegistry, downloadProvider);
}
public void init(GalleryViewerView view) {
super.init(view);
- this.view = view;
}
@Override
@@ -56,28 +49,4 @@
setContent(state, GalleryClientTool.TYPE_UPLOADEDFILE);
}
- private void setContent(StateContentDTO state, String uploadedfileType) {
- String typeId = state.getTypeId();
- String contentBody = state.getContent();
- StateToken token = state.getStateToken();
- BasicMimeTypeDTO mimeType = state.getMimeType();
- if (typeId.equals(uploadedfileType)) {
- if (mimeType != null) {
- FileDownloadUtils fileDownloadUtils = downloadProvider.get();
- if (mimeType.getType().equals("image")) {
- view.showImage(fileDownloadUtils.getImageUrl(token), fileDownloadUtils.getImageResizedUrl(token,
- ImageSize.sized));
- } else if (mimeType.toString().equals("text/plain") || mimeType.toString().equals("application/pdf")) {
- view.setContent(contentBody);
- } else {
- view.setContent("");
- }
- } else {
- view.setContent("");
- }
- } else {
- view.setContent(contentBody);
- }
- view.attach();
- }
}
Modified: trunk/src/main/java/org/ourproject/kune/gallery/client/cnt/GalleryViewerView.java
===================================================================
--- trunk/src/main/java/org/ourproject/kune/gallery/client/cnt/GalleryViewerView.java 2008-12-05 16:22:07 UTC (rev 984)
+++ trunk/src/main/java/org/ourproject/kune/gallery/client/cnt/GalleryViewerView.java 2008-12-05 17:53:45 UTC (rev 985)
@@ -22,9 +22,4 @@
import org.ourproject.kune.workspace.client.cnt.AbstractContentView;
public interface GalleryViewerView extends AbstractContentView {
-
- void setContent(String content);
-
- void showImage(String imageUrl, String imageResizedUrl);
-
}
Modified: trunk/src/main/java/org/ourproject/kune/platf/client/dto/BasicMimeTypeDTO.java
===================================================================
--- trunk/src/main/java/org/ourproject/kune/platf/client/dto/BasicMimeTypeDTO.java 2008-12-05 16:22:07 UTC (rev 984)
+++ trunk/src/main/java/org/ourproject/kune/platf/client/dto/BasicMimeTypeDTO.java 2008-12-05 17:53:45 UTC (rev 985)
@@ -52,10 +52,33 @@
return type;
}
+ /**
+ * Duplicate code in BMT
+ *
+ * @return
+ */
public boolean isImage() {
- return getType().equals("image");
+ return type != null && type.equals("image");
}
+ /**
+ * Duplicate code in BMT
+ *
+ * @return
+ */
+ public boolean isPdf() {
+ return type != null && subtype != null && type.equals("application") && subtype.equals("pdf");
+ }
+
+ /**
+ * Duplicate code in BMTDTO
+ *
+ * @return
+ */
+ public boolean isText() {
+ return type != null && subtype != null && type.equals("text") && subtype.equals("plain");
+ }
+
public void setSubtype(final String subtype) {
this.subtype = subtype;
}
Modified: trunk/src/main/java/org/ourproject/kune/platf/client/services/KuneModule.java
===================================================================
--- trunk/src/main/java/org/ourproject/kune/platf/client/services/KuneModule.java 2008-12-05 16:22:07 UTC (rev 984)
+++ trunk/src/main/java/org/ourproject/kune/platf/client/services/KuneModule.java 2008-12-05 17:53:45 UTC (rev 985)
@@ -384,7 +384,7 @@
$(I18nUITranslationService.class), $(StateManager.class), $(SiteSignOutLink.class),
$(DeferredCommandWrapper.class));
final TextEditorPanel panel = new TextEditorPanel(presenter, $(I18nTranslationService.class),
- $(WorkspaceSkeleton.class), $(ColorWebSafePalette.class));
+ $(WorkspaceSkeleton.class), $(ColorWebSafePalette.class), false);
presenter.init(panel);
return presenter;
}
Modified: trunk/src/main/java/org/ourproject/kune/platf/client/ui/KuneUiUtils.java
===================================================================
--- trunk/src/main/java/org/ourproject/kune/platf/client/ui/KuneUiUtils.java 2008-12-05 16:22:07 UTC (rev 984)
+++ trunk/src/main/java/org/ourproject/kune/platf/client/ui/KuneUiUtils.java 2008-12-05 17:53:45 UTC (rev 985)
@@ -77,7 +77,7 @@
return tipHtml;
}
- public static String genQuickTipWithImage(String imageResizedUrl) {
+ public static String genQuickTipWithImage(String imageResizedUrl, int size) {
return new Image(imageResizedUrl).toString();
}
Modified: trunk/src/main/java/org/ourproject/kune/platf/server/domain/BasicMimeType.java
===================================================================
--- trunk/src/main/java/org/ourproject/kune/platf/server/domain/BasicMimeType.java 2008-12-05 16:22:07 UTC (rev 984)
+++ trunk/src/main/java/org/ourproject/kune/platf/server/domain/BasicMimeType.java 2008-12-05 17:53:45 UTC (rev 985)
@@ -53,6 +53,33 @@
return type;
}
+ /**
+ * Duplicate code in BMTDTO
+ *
+ * @return
+ */
+ public boolean isImage() {
+ return type != null && type.equals("image");
+ }
+
+ /**
+ * Duplicate code in BMTDTO
+ *
+ * @return
+ */
+ public boolean isPdf() {
+ return type != null && subtype != null && type.equals("application") && subtype.equals("pdf");
+ }
+
+ /**
+ * Duplicate code in BMTDTO
+ *
+ * @return
+ */
+ public boolean isText() {
+ return type != null && subtype != null && type.equals("text") && subtype.equals("plain");
+ }
+
public void setSubtype(final String subtype) {
this.subtype = subtype;
}
@@ -61,6 +88,7 @@
this.type = type;
}
+ @Override
public String toString() {
return subtype == null ? type : type + "/" + subtype;
}
Modified: trunk/src/main/java/org/ourproject/kune/platf/server/manager/file/FileDownloadManager.java
===================================================================
--- trunk/src/main/java/org/ourproject/kune/platf/server/manager/file/FileDownloadManager.java 2008-12-05 16:22:07 UTC (rev 984)
+++ trunk/src/main/java/org/ourproject/kune/platf/server/manager/file/FileDownloadManager.java 2008-12-05 17:53:45 UTC (rev 985)
@@ -75,16 +75,24 @@
String extension = FileUtils.getFileNameExtension(filename, true);
BasicMimeType mimeType = cnt.getMimeType();
- if (mimeType.getType().equals("image")) {
+ boolean isPdfAndNotDownload = mimeType.isPdf() && !download;
+ if (mimeType.isImage() || isPdfAndNotDownload) {
String imgsizePrefix = imgsize == null ? "" : "." + imgsize;
String filenameWithoutExtension = FileUtils.getFileNameWithoutExtension(filename, extension);
- String filenameResized = filenameWithoutExtension + imgsizePrefix + extension;
+ String filenameResized = filenameWithoutExtension + imgsizePrefix
+ + (isPdfAndNotDownload ? ".png" : extension);
if (new File(absDir + filenameResized).exists()) {
// thumb can fail
filename = filenameResized;
}
}
+ // We will send the pdf thumb not the real pdf
+ if (isPdfAndNotDownload) {
+ extension = ".png";
+ mimeType = new BasicMimeType("image", "png");
+ }
+
final String absFilename = absDir + filename;
doBuildResp(resp, absFilename, cnt.getTitle(), mimeType, extension, download);
@@ -98,7 +106,7 @@
resp.setContentLength((int) file.length());
if (mimeType == null || download) {
resp.setContentType("application/x-download");
- } else if (mimeType.getType().equals("image")) {
+ } else if (mimeType.isImage()) {
resp.setContentType(mimeType.toString());
} else {
resp.setContentType("application/x-download");
Modified: trunk/src/main/java/org/ourproject/kune/platf/server/manager/file/FileUploadManager.java
===================================================================
--- trunk/src/main/java/org/ourproject/kune/platf/server/manager/file/FileUploadManager.java 2008-12-05 16:22:07 UTC (rev 984)
+++ trunk/src/main/java/org/ourproject/kune/platf/server/manager/file/FileUploadManager.java 2008-12-05 17:53:45 UTC (rev 985)
@@ -42,6 +42,7 @@
import org.ourproject.kune.platf.server.domain.User;
import org.ourproject.kune.platf.server.manager.FileManager;
import org.ourproject.kune.platf.server.properties.KuneProperties;
+import org.ourproject.kune.platf.server.utils.StringW;
import com.google.inject.Inject;
import com.google.inject.servlet.RequestScoped;
@@ -116,15 +117,21 @@
log.info("Mimetype: " + basicMimeType);
final String extension = FileUtils.getFileNameExtension(file.getName(), false);
- if (basicMimeType.getType().equals("image")) {
- generateThumbs(absDir, file.getName(), extension);
+ String preview = "";
+
+ if (basicMimeType.isImage()) {
+ generateThumbs(absDir, file.getName(), extension, false);
+ } else if (basicMimeType.isPdf()) {
+ generateThumbs(absDir, file.getName(), "png", true);
+ } else if (basicMimeType.isText()) {
+ String textPreview = new String(FileUtils.getBytesFromFile(file));
+ preview = "<pre>" + StringW.wordWrap(textPreview) + "</pre>";
}
// Persist
final User user = userSession.getUser();
final Container container = accessService.accessToContainer(ContentUtils.parseId(stateToken.getFolder()),
user, AccessRol.Editor);
- final String preview = "Preview of this file (in development)";
final Content content = contentManager.createContent(FileUtils.getFileNameWithoutExtension(file.getName(),
extension), preview, user, container, typeId);
content.setMimeType(basicMimeType);
@@ -138,7 +145,7 @@
}
}
- private void generateThumbs(String absDir, String filename, String extension) {
+ private void generateThumbs(String absDir, String filename, String extension, boolean isPdf) {
try {
String fileOrig = absDir + filename;
String withoutExtension = FileUtils.getFileNameWithoutExtension(filename, extension);
@@ -146,6 +153,7 @@
String resizeName = absDir + withoutExtension + "." + ImageSize.sized + "." + extension;
String thumbName = absDir + withoutExtension + "." + ImageSize.thumb + "." + extension;
String iconName = absDir + withoutExtension + "." + ImageSize.ico + "." + extension;
+ String previewName = absDir + withoutExtension + "." + extension;
int resizeWidth = Integer.parseInt(kuneProperties.get(KuneProperties.IMAGES_RESIZEWIDTH));
int thumbSize = Integer.parseInt(kuneProperties.get(KuneProperties.IMAGES_THUMBSIZE));
@@ -155,6 +163,9 @@
ImageUtilsDefault.scaleImageToMax(fileOrig, resizeName, resizeWidth);
ImageUtilsDefault.createThumb(fileOrig, thumbName, thumbSize, cropSize);
ImageUtilsDefault.createThumb(fileOrig, iconName, iconSize);
+ if (isPdf) {
+ ImageUtilsDefault.createThumbFromPdf(fileOrig, previewName);
+ }
} catch (NumberFormatException e) {
log.error("Image sizes in kune.properties are not integers");
Modified: trunk/src/main/java/org/ourproject/kune/platf/server/manager/file/ImageUtilsDefault.java
===================================================================
--- trunk/src/main/java/org/ourproject/kune/platf/server/manager/file/ImageUtilsDefault.java 2008-12-05 16:22:07 UTC (rev 984)
+++ trunk/src/main/java/org/ourproject/kune/platf/server/manager/file/ImageUtilsDefault.java 2008-12-05 17:53:45 UTC (rev 985)
@@ -46,7 +46,7 @@
if (thumbDimension < cropDimension) {
throw new IndexOutOfBoundsException("Thumb dimension must be bigger than crop dimension");
}
- MagickImage imageOrig = createImage(fileOrig);
+ MagickImage imageOrig = readImage(fileOrig);
Dimension origDimension = imageOrig.getDimension();
int origHeight = origDimension.height;
int origWidth = origDimension.width;
@@ -57,6 +57,12 @@
cropImage(scaled, fileDest, x, y, cropDimension, cropDimension);
}
+ static public boolean createThumbFromPdf(String pdfFile, String newPngFile) throws MagickException {
+ MagickImage pdf = readImage(pdfFile);
+ MagickImage pdf1 = pdf.breakFrames()[0];
+ return writeImage(pdf1, newPngFile);
+ }
+
public static boolean cropImage(String fileOrig, String fileDest, int x, int y, int width, int height)
throws MagickException, FileNotFoundException {
Rectangle rectangle = new Rectangle(x, y, width, height);
@@ -66,32 +72,42 @@
public static boolean cropImage(String fileOrig, String fileDest, Rectangle rectangle) throws MagickException,
FileNotFoundException {
checkExist(fileOrig);
- return cropImage(createImage(fileOrig), fileDest, rectangle);
+ return cropImage(readImage(fileOrig), fileDest, rectangle);
}
public static Dimension getDimension(String file) throws MagickException {
- MagickImage imageOrig = createImage(file);
+ MagickImage imageOrig = readImage(file);
return imageOrig.getDimension();
}
+ /**
+ * FIXME: Not working, returns null always (bug)
+ *
+ */
+ public static String getPage(String file) throws MagickException {
+ ImageInfo imageInfo = new ImageInfo(file);
+ new MagickImage(imageInfo);
+ return imageInfo.getPage();
+ }
+
public static boolean scaleImage(String fileOrig, String fileDest, Dimension dimension) throws MagickException,
FileNotFoundException {
checkExist(fileOrig);
- MagickImage imageOrig = createImage(fileOrig);
+ MagickImage imageOrig = readImage(fileOrig);
return scaleImage(imageOrig, fileDest, (int) dimension.getWidth(), (int) dimension.getHeight());
}
public static boolean scaleImage(String fileOrig, String fileDest, int width, int height) throws MagickException,
FileNotFoundException {
checkExist(fileOrig);
- MagickImage imageOrig = createImage(fileOrig);
+ MagickImage imageOrig = readImage(fileOrig);
return scaleImage(imageOrig, fileDest, width, height);
}
public static boolean scaleImageToMax(String fileOrig, String fileDest, int maxSize) throws MagickException,
FileNotFoundException {
checkExist(fileOrig);
- MagickImage imageOrig = createImage(fileOrig);
+ MagickImage imageOrig = readImage(fileOrig);
Dimension origDimension = imageOrig.getDimension();
int origHeight = origDimension.height;
int origWidth = origDimension.width;
@@ -130,12 +146,14 @@
}
private static ImageInfo createEmptyImageInfo() throws MagickException {
- ImageInfo info = new ImageInfo();
- return info;
+ ImageInfo imageInfo = new ImageInfo();
+ return imageInfo;
}
- private static MagickImage createImage(String file) throws MagickException {
- return new MagickImage(new ImageInfo(file));
+ private static ImageInfo createEmptyImageInfoWithNoPage() throws MagickException {
+ ImageInfo imageInfo = createEmptyImageInfo();
+ imageInfo.setPage("0x0+0+0");
+ return imageInfo;
}
private static boolean cropImage(MagickImage fileOrig, String fileDest, int x, int y, int width, int height)
@@ -146,9 +164,16 @@
private static boolean cropImage(MagickImage fileOrig, String fileDest, Rectangle rectangle) throws MagickException {
MagickImage cropped = fileOrig.cropImage(rectangle);
- return writeImage(cropped, fileDest);
+ cropped.setFileName(fileDest);
+ ImageInfo imageInfo = createEmptyImageInfoWithNoPage();
+ return cropped.writeImage(imageInfo);
}
+ private static MagickImage readImage(String file) throws MagickException {
+ ImageInfo imageInfo = new ImageInfo(file);
+ return new MagickImage(imageInfo);
+ }
+
private static MagickImage scaleImage(MagickImage imageOrig, int width, int height) throws MagickException {
return imageOrig.scaleImage(width, height);
}
Added: trunk/src/main/java/org/ourproject/kune/platf/server/utils/StringW.java
===================================================================
--- trunk/src/main/java/org/ourproject/kune/platf/server/utils/StringW.java 2008-12-05 16:22:07 UTC (rev 984)
+++ trunk/src/main/java/org/ourproject/kune/platf/server/utils/StringW.java 2008-12-05 17:53:45 UTC (rev 985)
@@ -0,0 +1,305 @@
+/*
+ * Copyright 1999,2004 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+// Copied from GenerationJava Core Library.
+//package com.generationjava.lang;
+// copied in kune from:
+// http://svn.apache.org/repos/asf/jakarta/taglibs/proper/string/trunk/src/org/apache/taglibs/string/util/StringW.java
+package org.ourproject.kune.platf.server.utils;
+
+import org.apache.commons.lang.StringUtils;
+
+/**
+ * A set of String library static methods. While extending String or
+ * StringBuffer would have been the nicest solution, that is not possible, so a
+ * simple set of static methods seems the most workable.
+ *
+ * Method ideas have so far been taken from the PHP4, Ruby and .NET languages.
+ *
+ * @author bayard at generationjava.com
+ * @version 0.4 20010812
+ */
+final public class StringW {
+
+ /**
+ * Quote a string so that it may be used in a regular expression without any
+ * parts of the string being considered as a part of the regular
+ * expression's control characters.
+ */
+ static public String quoteRegularExpression(String str) {
+ // replace ? + * / . ^ $ as long as they're not in character
+ // class. so must be done by hand
+ char[] chrs = str.toCharArray();
+ int sz = chrs.length;
+ StringBuffer buffer = new StringBuffer(2 * sz);
+ for (int i = 0; i < sz; i++) {
+ switch (chrs[i]) {
+ case '[':
+ case ']':
+ case '?':
+ case '+':
+ case '*':
+ case '/':
+ case '.':
+ case '^':
+ case '$':
+ buffer.append("\\");
+ default:
+ buffer.append(chrs[i]);
+ }
+ }
+ return buffer.toString();
+ }
+
+ /**
+ * Truncates a string nicely. It will search for the first space after the
+ * lower limit and truncate the string there. It will also append any string
+ * passed as a parameter to the end of the string. The hard limit can be
+ * specified to forcibily truncate a string (in the case of an extremely
+ * long word or such). All HTML/XML markup will be stripped from the string
+ * prior to processing for truncation.
+ *
+ * @param str
+ * String the string to be truncated.
+ * @param lower
+ * int value of the lower limit.
+ * @param upper
+ * int value of the upper limit, -1 if no limit is desired. If
+ * the uppper limit is lower than the lower limit, it will be
+ * adjusted to be same as the lower limit.
+ * @param appendToEnd
+ * String to be appended to the end of the truncated string. This
+ * is appended ONLY if the string was indeed truncated. The
+ * append is does not count towards any lower/upper limits.
+ *
+ * @author timster at mac.com
+ */
+ public static String truncateNicely(String str, int lower, int upper, String appendToEnd) {
+ // strip markup from the string
+ str = XmlW.removeXml(str);
+
+ // unescape temporarily for length handling
+ str = XmlW.unescapeXml(str);
+
+ // quickly adjust the upper if it is set lower than 'lower'
+ if (upper < lower) {
+ upper = lower;
+ }
+
+ // now determine if the string fits within the upper limit
+ // if it does, go straight to return, do not pass 'go' and collect $200
+ if (str.length() > upper) {
+ // the magic location int
+ int loc;
+
+ // first we determine where the next space appears after lower
+ loc = str.lastIndexOf(' ', upper);
+
+ // now we'll see if the location is greater than the lower limit
+ if (loc >= lower) {
+ // yes it was, so we'll cut it off here
+ str = str.substring(0, loc);
+ } else {
+ // no it wasnt, so we'll cut it off at the upper limit
+ str = str.substring(0, upper);
+ }
+
+ // the string was truncated, so we append the appendToEnd String
+ str = str + appendToEnd;
+ }
+
+ // escape after finished processing string
+ str = XmlW.escapeXml(str);
+
+ return str;
+ }
+
+ /**
+ * Create a word-wrapped version of a String. Wrap at 80 characters and use
+ * newlines as the delimiter. If a word is over 80 characters long use a -
+ * sign to split it.
+ */
+ static public String wordWrap(String str) {
+ return wordWrap(str, 80, "\n", "-", true);
+ }
+
+ /**
+ * Create a word-wrapped version of a String. Wrap at a specified width and
+ * use newlines as the delimiter. If a word is over the width in lenght use
+ * a - sign to split it.
+ */
+ static public String wordWrap(String str, int width) {
+ return wordWrap(str, width, "\n", "-", true);
+ }
+
+ /**
+ * Word-wrap a string.
+ *
+ * @param str
+ * String to word-wrap
+ * @param width
+ * int to wrap at
+ * @param delim
+ * String to use to separate lines
+ * @param split
+ * String to use to split a word greater than width long
+ *
+ * @return String that has been word wrapped (with the delim inside width
+ * boundaries)
+ */
+ static public String wordWrap(String str, int width, String delim, String split) {
+ return wordWrap(str, width, delim, split, true);
+ }
+
+ /**
+ * Word-wrap a string.
+ *
+ * @param str
+ * String to word-wrap
+ * @param width
+ * int to wrap at
+ * @param delim
+ * String to use to separate lines
+ * @param split
+ * String to use to split a word greater than width long
+ * @param delimInside
+ * wheter or not delim should be included in chunk before length
+ * reaches width.
+ *
+ * @return String that has been word wrapped
+ */
+ static public String wordWrap(String str, int width, String delim, String split, boolean delimInside) {
+ int sz = str.length();
+
+ // System.err.println( ">>>> inside: " + delimInside + " sz : " + sz );
+
+ // / shift width up one. mainly as it makes the logic easier
+ width++;
+
+ // our best guess as to an initial size
+ StringBuffer buffer = new StringBuffer(sz / width * delim.length() + sz);
+
+ // every line might include a delim on the end
+ // System.err.println( "width before: "+ width );
+ if (delimInside) {
+ width = width - delim.length();
+ } else {
+ width--;
+ }
+ // System.err.println( "width after: "+ width );
+
+ int idx = -1;
+ String substr = null;
+
+ // beware: i is rolled-back inside the loop
+ for (int i = 0; i < sz; i += width) {
+
+ // on the last line
+ if (i > sz - width) {
+ buffer.append(str.substring(i));
+ // System.err.print("LAST-LINE: "+str.substring(i));
+ break;
+ }
+
+ // System.err.println("loop[i] is: "+i);
+ // the current line
+ substr = str.substring(i, i + width);
+ // System.err.println( "substr: " + substr );
+
+ // is the delim already on the line
+ idx = substr.indexOf(delim);
+ // System.err.println( "i: " + i + " idx : " + idx );
+ if (idx != -1) {
+ buffer.append(substr.substring(0, idx));
+ // System.err.println("Substr: '"substr.substring(0,idx)+"'");
+ buffer.append(delim);
+ i -= width - idx - delim.length();
+
+ // System.err.println("loop[i] is now: "+i);
+ // System.err.println("ounfd-whitespace: '"+substr.charAt(idx+1)+"'.");
+ // Erase a space after a delim. Is this too obscure?
+ if (substr.length() > idx + 1) {
+ if (substr.charAt(idx + 1) != '\n') {
+ if (Character.isWhitespace(substr.charAt(idx + 1))) {
+ i++;
+ }
+ }
+ }
+ // System.err.println("i -= "+width+"-"+idx);
+ continue;
+ }
+
+ idx = -1;
+
+ // figure out where the last space is
+ char[] chrs = substr.toCharArray();
+ for (int j = width; j > 0; j--) {
+ if (Character.isWhitespace(chrs[j - 1])) {
+ idx = j;
+ // System.err.println("Found whitespace: "+idx);
+ break;
+ }
+ }
+
+ // idx is the last whitespace on the line.
+ // System.err.println("idx is "+idx);
+ if (idx == -1) {
+ for (int j = width; j > 0; j--) {
+ if (chrs[j - 1] == '-') {
+ idx = j;
+ // System.err.println("Found Dash: "+idx);
+ break;
+ }
+ }
+ if (idx == -1) {
+ buffer.append(substr);
+ buffer.append(delim);
+ // System.err.print(substr);
+ // System.err.print(delim);
+ } else {
+ if (idx != width) {
+ idx++;
+ }
+ buffer.append(substr.substring(0, idx));
+ buffer.append(delim);
+ // System.err.print(substr.substring(0,idx));
+ // System.err.print(delim);
+ i -= width - idx;
+ }
+ } else {
+ /*
+ * if(force) { if(idx == width-1) { buffer.append(substr);
+ * buffer.append(delim); } else { // stick a split in. int
+ * splitsz = split.length();
+ * buffer.append(substr.substring(0,width-splitsz));
+ * buffer.append(split); buffer.append(delim); i -= splitsz; } }
+ * else {
+ */
+ // insert spaces
+ buffer.append(substr.substring(0, idx));
+ buffer.append(StringUtils.repeat(" ", width - idx));
+ // System.err.print(substr.substring(0,idx));
+ // System.err.print(StringUtils.repeat(" ",width-idx));
+ buffer.append(delim);
+ // System.err.print(delim);
+ // System.err.println("i -= "+width+"-"+idx);
+ i -= width - idx;
+ // }
+ }
+ }
+ // System.err.println("\n*************");
+ return buffer.toString();
+ }
+}
Added: trunk/src/main/java/org/ourproject/kune/platf/server/utils/XmlW.java
===================================================================
--- trunk/src/main/java/org/ourproject/kune/platf/server/utils/XmlW.java 2008-12-05 16:22:07 UTC (rev 984)
+++ trunk/src/main/java/org/ourproject/kune/platf/server/utils/XmlW.java 2008-12-05 17:53:45 UTC (rev 985)
@@ -0,0 +1,161 @@
+/*
+ * Copyright 1999,2004 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+// Copied from GenerationJava Core Library.
+//package com.generationjava.web;
+// Copied in kune from:
+// http://svn.apache.org/repos/asf/jakarta/taglibs/proper/string/trunk/src/org/apache/taglibs/string/util/XmlW.java
+package org.ourproject.kune.platf.server.utils;
+
+import org.apache.commons.lang.StringUtils;
+
+/**
+ * XML helping static methods.
+ *
+ * @author bayard at generationjava.com
+ * @version 0.4 20010812
+ */
+final public class XmlW {
+
+ static public String escapeXml(String str) {
+ str = StringUtils.replace(str, "&", "&");
+ str = StringUtils.replace(str, "<", "<");
+ str = StringUtils.replace(str, ">", ">");
+ str = StringUtils.replace(str, "\"", """);
+ str = StringUtils.replace(str, "'", "'");
+ return str;
+ }
+
+ static public String getAttribute(String attribute, String text) {
+ return getAttribute(attribute, text, 0);
+ }
+
+ static public String getAttribute(String attribute, String text, int idx) {
+ int close = text.indexOf(">", idx);
+ int attrIdx = text.indexOf(attribute + "=\"", idx);
+ if (attrIdx == -1) {
+ return null;
+ }
+ if (attrIdx > close) {
+ return null;
+ }
+ int attrStartIdx = attrIdx + attribute.length() + 2;
+ int attrCloseIdx = text.indexOf("\"", attrStartIdx);
+ if (attrCloseIdx > close) {
+ return null;
+ }
+ return unescapeXml(text.substring(attrStartIdx, attrCloseIdx));
+ }
+
+ static public String getContent(String tag, String text) {
+ int idx = XmlW.getIndexOpeningTag(tag, text);
+ if (idx == -1) {
+ return "";
+ }
+ text = text.substring(idx);
+ int end = XmlW.getIndexClosingTag(tag, text);
+ idx = text.indexOf('>');
+ if (idx == -1) {
+ return "";
+ }
+ return text.substring(idx + 1, end);
+ }
+
+ // Pass in "para" and a string that starts with
+ // <para> and it will return the index of the matching </para>
+ // It assumes well-formed xml. Or well enough.
+ static public int getIndexClosingTag(String tag, String text) {
+ return getIndexClosingTag(tag, text, 0);
+ }
+
+ static public int getIndexClosingTag(String tag, String text, int start) {
+ String open = "<" + tag;
+ String close = "</" + tag + ">";
+ // System.err.println("OPEN: "+open);
+ // System.err.println("CLOSE: "+close);
+ int closeSz = close.length();
+ int nextCloseIdx = text.indexOf(close, start);
+ // System.err.println("first close: "+nextCloseIdx);
+ if (nextCloseIdx == -1) {
+ return -1;
+ }
+ int count = StringUtils.countMatches(text.substring(start, nextCloseIdx), open);
+ // System.err.println("count: "+count);
+ if (count == 0) {
+ return -1; // tag is never opened
+ }
+ int expected = 1;
+ while (count != expected) {
+ nextCloseIdx = text.indexOf(close, nextCloseIdx + closeSz);
+ if (nextCloseIdx == -1) {
+ return -1;
+ }
+ count = StringUtils.countMatches(text.substring(start, nextCloseIdx), open);
+ expected++;
+ }
+ return nextCloseIdx;
+ }
+
+ static public int getIndexOpeningTag(String tag, String text) {
+ return getIndexOpeningTag(tag, text, 0);
+ }
+
+ /**
+ * Remove any xml tags from a String. Same as HtmlW's method.
+ */
+ static public String removeXml(String str) {
+ int sz = str.length();
+ StringBuffer buffer = new StringBuffer(sz);
+ // boolean inString = false;
+ boolean inTag = false;
+ for (int i = 0; i < sz; i++) {
+ char ch = str.charAt(i);
+ if (ch == '<') {
+ inTag = true;
+ } else if (ch == '>') {
+ inTag = false;
+ continue;
+ }
+ if (!inTag) {
+ buffer.append(ch);
+ }
+ }
+ return buffer.toString();
+ }
+
+ static public String unescapeXml(String str) {
+ str = StringUtils.replace(str, "&", "&");
+ str = StringUtils.replace(str, "<", "<");
+ str = StringUtils.replace(str, ">", ">");
+ str = StringUtils.replace(str, """, "\"");
+ str = StringUtils.replace(str, "'", "'");
+ return str;
+ }
+
+ static private int getIndexOpeningTag(String tag, String text, int start) {
+ // consider whitespace?
+ int idx = text.indexOf("<" + tag, start);
+ if (idx == -1) {
+ return -1;
+ }
+ char next = text.charAt(idx + 1 + tag.length());
+ if ((next == '>') || Character.isWhitespace(next)) {
+ return idx;
+ } else {
+ return getIndexOpeningTag(tag, text, idx + 1);
+ }
+ }
+
+}
Modified: trunk/src/main/java/org/ourproject/kune/wiki/client/WikiClientActions.java
===================================================================
--- trunk/src/main/java/org/ourproject/kune/wiki/client/WikiClientActions.java 2008-12-05 16:22:07 UTC (rev 984)
+++ trunk/src/main/java/org/ourproject/kune/wiki/client/WikiClientActions.java 2008-12-05 17:53:45 UTC (rev 985)
@@ -100,7 +100,7 @@
createEditAction(TYPE_WIKIPAGE);
- createTranslateAction(TYPE_FOLDER, TYPE_UPLOADEDFILE, TYPE_WIKIPAGE);
+ createTranslateAction(TYPE_FOLDER, TYPE_WIKIPAGE);
createDelContainerAction("Delete folder", parentMenuTitleCtx, containersNoRoot);
createDelContentAction(parentMenuTitle, i18n.t("Delete"), contents);
Modified: trunk/src/main/java/org/ourproject/kune/wiki/client/WikiClientModule.java
===================================================================
--- trunk/src/main/java/org/ourproject/kune/wiki/client/WikiClientModule.java 2008-12-05 16:22:07 UTC (rev 984)
+++ trunk/src/main/java/org/ourproject/kune/wiki/client/WikiClientModule.java 2008-12-05 17:53:45 UTC (rev 985)
@@ -108,7 +108,7 @@
public WikiFolderContent create() {
final WikiFolderContentPresenter presenter = new WikiFolderContentPresenter($(StateManager.class),
$(Session.class), $(ActionContentToolbar.class), $(ContentActionRegistry.class),
- $(I18nTranslationService.class));
+ $(I18nTranslationService.class), $$(FileDownloadUtils.class));
final WikiFolderContentView view = new WikiFolderContentPanel($(WorkspaceSkeleton.class),
$(I18nTranslationService.class));
presenter.init(view);
Modified: trunk/src/main/java/org/ourproject/kune/wiki/client/WikiClientTool.java
===================================================================
--- trunk/src/main/java/org/ourproject/kune/wiki/client/WikiClientTool.java 2008-12-05 16:22:07 UTC (rev 984)
+++ trunk/src/main/java/org/ourproject/kune/wiki/client/WikiClientTool.java 2008-12-05 17:53:45 UTC (rev 985)
@@ -46,7 +46,7 @@
registerRateableTypes(TYPE_UPLOADEDFILE, TYPE_WIKIPAGE);
registerRenamableTypes(TYPE_FOLDER, TYPE_UPLOADEDFILE, TYPE_WIKIPAGE);
registerTageableTypes(TYPE_UPLOADEDFILE, TYPE_WIKIPAGE);
- registerTranslatableTypes(TYPE_FOLDER, TYPE_UPLOADEDFILE, TYPE_WIKIPAGE);
+ registerTranslatableTypes(TYPE_FOLDER, TYPE_WIKIPAGE);
registerIcons();
}
Modified: trunk/src/main/java/org/ourproject/kune/wiki/client/cnt/WikiFolderContentPresenter.java
===================================================================
--- trunk/src/main/java/org/ourproject/kune/wiki/client/cnt/WikiFolderContentPresenter.java 2008-12-05 16:22:07 UTC (rev 984)
+++ trunk/src/main/java/org/ourproject/kune/wiki/client/cnt/WikiFolderContentPresenter.java 2008-12-05 17:53:45 UTC (rev 985)
@@ -27,17 +27,21 @@
import org.ourproject.kune.platf.client.services.I18nTranslationService;
import org.ourproject.kune.platf.client.state.Session;
import org.ourproject.kune.platf.client.state.StateManager;
+import org.ourproject.kune.platf.client.ui.download.FileDownloadUtils;
import org.ourproject.kune.wiki.client.WikiClientTool;
import org.ourproject.kune.workspace.client.cnt.FoldableContentPresenter;
+import com.calclab.suco.client.ioc.Provider;
+
public class WikiFolderContentPresenter extends FoldableContentPresenter implements WikiFolderContent {
private WikiFolderContentView view;
private final I18nTranslationService i18n;
public WikiFolderContentPresenter(StateManager stateManager, Session session, ActionContentToolbar toolbar,
- final ActionRegistry<StateToken> actionRegistry, I18nTranslationService i18n) {
- super(WikiClientTool.NAME, stateManager, session, toolbar, actionRegistry);
+ final ActionRegistry<StateToken> actionRegistry, I18nTranslationService i18n,
+ Provider<FileDownloadUtils> downloadProvider) {
+ super(WikiClientTool.NAME, stateManager, session, toolbar, actionRegistry, downloadProvider);
this.i18n = i18n;
}
Modified: trunk/src/main/java/org/ourproject/kune/wiki/client/cnt/WikiViewerPresenter.java
===================================================================
--- trunk/src/main/java/org/ourproject/kune/wiki/client/cnt/WikiViewerPresenter.java 2008-12-05 16:22:07 UTC (rev 984)
+++ trunk/src/main/java/org/ourproject/kune/wiki/client/cnt/WikiViewerPresenter.java 2008-12-05 17:53:45 UTC (rev 985)
@@ -19,35 +19,28 @@
*/
package org.ourproject.kune.wiki.client.cnt;
-import org.ourproject.kune.wiki.client.WikiClientTool;
import org.ourproject.kune.platf.client.actions.ContentActionRegistry;
import org.ourproject.kune.platf.client.actions.toolbar.ActionContentToolbar;
-import org.ourproject.kune.platf.client.dto.BasicMimeTypeDTO;
import org.ourproject.kune.platf.client.dto.StateContentDTO;
-import org.ourproject.kune.platf.client.dto.StateToken;
import org.ourproject.kune.platf.client.state.Session;
import org.ourproject.kune.platf.client.state.StateManager;
import org.ourproject.kune.platf.client.ui.download.FileDownloadUtils;
-import org.ourproject.kune.platf.client.ui.download.ImageSize;
+import org.ourproject.kune.wiki.client.WikiClientTool;
import org.ourproject.kune.workspace.client.cnt.FoldableContentPresenter;
import org.ourproject.kune.workspace.client.i18n.I18nUITranslationService;
import com.calclab.suco.client.ioc.Provider;
public class WikiViewerPresenter extends FoldableContentPresenter implements WikiViewer {
- private WikiViewerView view;
- private final Provider<FileDownloadUtils> downloadProvider;
public WikiViewerPresenter(StateManager stateManager, Session session, I18nUITranslationService i18n,
ActionContentToolbar toolbar, ContentActionRegistry actionRegistry,
Provider<FileDownloadUtils> downloadProvider) {
- super(WikiClientTool.NAME, stateManager, session, toolbar, actionRegistry);
- this.downloadProvider = downloadProvider;
+ super(WikiClientTool.NAME, stateManager, session, toolbar, actionRegistry, downloadProvider);
}
public void init(WikiViewerView view) {
super.init(view);
- this.view = view;
}
@Override
@@ -55,29 +48,4 @@
super.setState(state);
setContent(state, WikiClientTool.TYPE_UPLOADEDFILE);
}
-
- private void setContent(StateContentDTO state, String uploadedfileType) {
- String typeId = state.getTypeId();
- String contentBody = state.getContent();
- StateToken token = state.getStateToken();
- BasicMimeTypeDTO mimeType = state.getMimeType();
- if (typeId.equals(uploadedfileType)) {
- if (mimeType != null) {
- FileDownloadUtils fileDownloadUtils = downloadProvider.get();
- if (mimeType.getType().equals("image")) {
- view.showImage(fileDownloadUtils.getImageUrl(token), fileDownloadUtils.getImageResizedUrl(token,
- ImageSize.sized));
- } else if (mimeType.toString().equals("text/plain") || mimeType.toString().equals("application/pdf")) {
- view.setContent(contentBody);
- } else {
- view.setContent("");
- }
- } else {
- view.setContent("");
- }
- } else {
- view.setContent(contentBody);
- }
- view.attach();
- }
}
Modified: trunk/src/main/java/org/ourproject/kune/wiki/client/cnt/WikiViewerView.java
===================================================================
--- trunk/src/main/java/org/ourproject/kune/wiki/client/cnt/WikiViewerView.java 2008-12-05 16:22:07 UTC (rev 984)
+++ trunk/src/main/java/org/ourproject/kune/wiki/client/cnt/WikiViewerView.java 2008-12-05 17:53:45 UTC (rev 985)
@@ -22,9 +22,4 @@
import org.ourproject.kune.workspace.client.cnt.AbstractContentView;
public interface WikiViewerView extends AbstractContentView {
-
- void setContent(String content);
-
- void showImage(String imageUrl, String imageResizedUrl);
-
}
Modified: trunk/src/main/java/org/ourproject/kune/workspace/client/cnt/AbstractContentPresenter.java
===================================================================
--- trunk/src/main/java/org/ourproject/kune/workspace/client/cnt/AbstractContentPresenter.java 2008-12-05 16:22:07 UTC (rev 984)
+++ trunk/src/main/java/org/ourproject/kune/workspace/client/cnt/AbstractContentPresenter.java 2008-12-05 17:53:45 UTC (rev 985)
@@ -2,7 +2,7 @@
public abstract class AbstractContentPresenter {
- private AbstractContentView view;
+ protected AbstractContentView view;
public AbstractContentPresenter() {
}
Modified: trunk/src/main/java/org/ourproject/kune/workspace/client/cnt/AbstractContentView.java
===================================================================
--- trunk/src/main/java/org/ourproject/kune/workspace/client/cnt/AbstractContentView.java 2008-12-05 16:22:07 UTC (rev 984)
+++ trunk/src/main/java/org/ourproject/kune/workspace/client/cnt/AbstractContentView.java 2008-12-05 17:53:45 UTC (rev 985)
@@ -1,11 +1,22 @@
package org.ourproject.kune.workspace.client.cnt;
+import com.google.gwt.user.client.ui.Widget;
+
public interface AbstractContentView {
+ public void setRawContent(final String content);
+
void attach();
void detach();
+ void setContent(String content, boolean showPreviewMsg);
+
void setInfo(String info);
+ void setNoPreview();
+
+ void setWidgetAsContent(final Widget widget, boolean setDefMargins);
+
+ void showImage(String imageUrl, String imageResizedUrl, boolean showPreviewMsg);
}
Modified: trunk/src/main/java/org/ourproject/kune/workspace/client/cnt/FoldableContentPanel.java
===================================================================
--- trunk/src/main/java/org/ourproject/kune/workspace/client/cnt/FoldableContentPanel.java 2008-12-05 16:22:07 UTC (rev 984)
+++ trunk/src/main/java/org/ourproject/kune/workspace/client/cnt/FoldableContentPanel.java 2008-12-05 17:53:45 UTC (rev 985)
@@ -1,35 +1,43 @@
package org.ourproject.kune.workspace.client.cnt;
import org.ourproject.kune.platf.client.services.I18nTranslationService;
+import org.ourproject.kune.platf.client.services.Images;
+import org.ourproject.kune.platf.client.ui.IconLabel;
import org.ourproject.kune.platf.client.ui.KuneUiUtils;
+import org.ourproject.kune.platf.client.ui.RoundedPanel;
import org.ourproject.kune.workspace.client.skel.WorkspaceSkeleton;
import com.google.gwt.user.client.ui.ClickListener;
import com.google.gwt.user.client.ui.HTML;
import com.google.gwt.user.client.ui.Image;
import com.google.gwt.user.client.ui.Label;
+import com.google.gwt.user.client.ui.VerticalPanel;
import com.google.gwt.user.client.ui.Widget;
-public abstract class FoldableContentPanel extends AbstractContentPanel {
+public abstract class FoldableContentPanel extends AbstractContentPanel implements AbstractContentView {
+ private static final String DEF_CONTENT_MARGINS_STYLE = "kune-Margin-7-trbl";
private final I18nTranslationService i18n;
+ private final RoundedPanel previewPanel;
+ private final IconLabel previewLabel;
public FoldableContentPanel(final WorkspaceSkeleton ws, I18nTranslationService i18n) {
super(ws);
this.i18n = i18n;
+ previewLabel = new IconLabel(Images.App.getInstance().info(), "");
+ previewLabel.addStyleName("k-preview-msg-lab");
+ previewPanel = new RoundedPanel(previewLabel, RoundedPanel.ALL, 2);
+ previewPanel.setCornerStyleName("k-preview-msg");
+ previewPanel.addStyleName("kune-Margin-7-b");
}
- public void setContent(final String content) {
+ public void setContent(String content, boolean showPreviewMsg) {
+ final VerticalPanel vp = createPreviewVp(showPreviewMsg);
final HTML html = new HTML(content);
- setContent(html);
+ vp.add(html);
+ setWidgetAsContent(vp, true);
}
- public void setContent(final Widget widget) {
- setDefStyle(widget);
- setWidget(widget);
- attach();
- }
-
public void setInfo(String info) {
setLabel(info);
}
@@ -40,7 +48,27 @@
setWidget(label);
}
- public void showImage(String imageUrl, String imageResizedUrl) {
+ public void setNoPreview() {
+ VerticalPanel vp = createPreviewVp(true);
+ setNoPreviewLabelMsg();
+ setWidgetAsContent(vp, true);
+ }
+
+ public void setRawContent(final String content) {
+ final HTML html = new HTML(content);
+ setDefStyle(html);
+ setContent(html);
+ }
+
+ public void setWidgetAsContent(final Widget widget, boolean setDefMargins) {
+ if (setDefMargins) {
+ widget.addStyleName(DEF_CONTENT_MARGINS_STYLE);
+ }
+ setContent(widget);
+ }
+
+ public void showImage(String imageUrl, String imageResizedUrl, boolean showPreviewMsg) {
+ final VerticalPanel vp = createPreviewVp(showPreviewMsg);
final Image imgOrig = new Image(imageUrl);
final Image imgResized = new Image(imageResizedUrl);
KuneUiUtils.setQuickTip(imgOrig, i18n.t("Click to zoom out"));
@@ -51,25 +79,45 @@
imgResized.addStyleName("kune-pointer");
imgResized.addClickListener(new ClickListener() {
public void onClick(Widget sender) {
- detach();
- setWidget(imgOrig);
- attach();
+ imgResized.removeFromParent();
+ vp.add(imgOrig);
}
});
imgOrig.addClickListener(new ClickListener() {
public void onClick(Widget sender) {
- detach();
- setWidget(imgResized);
- attach();
+ imgOrig.removeFromParent();
+ vp.add(imgResized);
}
});
- setWidget(imgResized);
- attach();
+ vp.add(imgResized);
+ setWidgetAsContent(vp, true);
Image.prefetch(imageUrl);
}
+ private VerticalPanel createPreviewVp(boolean showPreviewMsg) {
+ final VerticalPanel vp = new VerticalPanel();
+ if (showPreviewMsg) {
+ setDefPreviewMsg();
+ vp.add(previewPanel);
+ }
+ return vp;
+ }
+
+ private void setContent(final Widget widget) {
+ setWidget(widget);
+ attach();
+ }
+
+ private void setDefPreviewMsg() {
+ previewLabel.setText(i18n.t("This is only a preview, download it to get the complete file"));
+ }
+
private void setDefStyle(final Widget widget) {
widget.setStyleName("kune-Content-Main");
- widget.addStyleName("kune-Margin-7-trbl");
+ widget.addStyleName(DEF_CONTENT_MARGINS_STYLE);
}
+
+ private void setNoPreviewLabelMsg() {
+ previewLabel.setText(i18n.t("Preview not available"));
+ }
}
Modified: trunk/src/main/java/org/ourproject/kune/workspace/client/cnt/FoldableContentPresenter.java
===================================================================
--- trunk/src/main/java/org/ourproject/kune/workspace/client/cnt/FoldableContentPresenter.java 2008-12-05 16:22:07 UTC (rev 984)
+++ trunk/src/main/java/org/ourproject/kune/workspace/client/cnt/FoldableContentPresenter.java 2008-12-05 17:53:45 UTC (rev 985)
@@ -4,13 +4,17 @@
import org.ourproject.kune.platf.client.actions.ActionRegistry;
import org.ourproject.kune.platf.client.actions.toolbar.ActionContentToolbar;
import org.ourproject.kune.platf.client.dto.AccessRightsDTO;
+import org.ourproject.kune.platf.client.dto.BasicMimeTypeDTO;
import org.ourproject.kune.platf.client.dto.StateAbstractDTO;
import org.ourproject.kune.platf.client.dto.StateContainerDTO;
import org.ourproject.kune.platf.client.dto.StateContentDTO;
import org.ourproject.kune.platf.client.dto.StateToken;
import org.ourproject.kune.platf.client.state.Session;
import org.ourproject.kune.platf.client.state.StateManager;
+import org.ourproject.kune.platf.client.ui.download.FileDownloadUtils;
+import org.ourproject.kune.platf.client.ui.download.ImageSize;
+import com.calclab.suco.client.ioc.Provider;
import com.calclab.suco.client.listener.Listener;
public abstract class FoldableContentPresenter extends AbstractContentPresenter implements FoldableContent {
@@ -19,13 +23,16 @@
private final ActionRegistry<StateToken> actionRegistry;
protected final Session session;
private final ActionContentToolbar toolbar;
+ private final Provider<FileDownloadUtils> downloadProvider;
public FoldableContentPresenter(final String toolName, StateManager stateManager, Session session,
- final ActionContentToolbar toolbar, ActionRegistry<StateToken> actionRegistry) {
+ final ActionContentToolbar toolbar, ActionRegistry<StateToken> actionRegistry,
+ Provider<FileDownloadUtils> downloadProvider) {
this.toolName = toolName;
this.session = session;
this.toolbar = toolbar;
this.actionRegistry = actionRegistry;
+ this.downloadProvider = downloadProvider;
stateManager.onStateChanged(new Listener<StateAbstractDTO>() {
public void onEvent(final StateAbstractDTO state) {
setState(state);
@@ -41,6 +48,34 @@
setState(session.getContentState());
}
+ protected void setContent(StateContentDTO state, String uploadedfileType) {
+ String typeId = state.getTypeId();
+ String contentBody = state.getContent();
+ StateToken token = state.getStateToken();
+ BasicMimeTypeDTO mimeType = state.getMimeType();
+ if (typeId.equals(uploadedfileType)) {
+ if (mimeType != null) {
+ FileDownloadUtils fileDownloadUtils = downloadProvider.get();
+ if (mimeType.isImage()) {
+ view.showImage(fileDownloadUtils.getImageUrl(token), fileDownloadUtils.getImageResizedUrl(token,
+ ImageSize.sized), false);
+ } else if (mimeType.isPdf()) {
+ view.showImage(fileDownloadUtils.getImageUrl(token), fileDownloadUtils.getImageResizedUrl(token,
+ ImageSize.sized), true);
+ } else if (mimeType.isText()) {
+ view.setContent(contentBody, true);
+ } else {
+ view.setNoPreview();
+ }
+ } else {
+ view.setNoPreview();
+ }
+ } else {
+ view.setRawContent(contentBody);
+ }
+ view.attach();
+ }
+
protected void setState(StateAbstractDTO state) {
toolbar.detach();
if (state instanceof StateContainerDTO) {
Modified: trunk/src/main/java/org/ourproject/kune/workspace/client/ctxnav/ContextNavigatorPresenter.java
===================================================================
--- trunk/src/main/java/org/ourproject/kune/workspace/client/ctxnav/ContextNavigatorPresenter.java 2008-12-05 16:22:07 UTC (rev 984)
+++ trunk/src/main/java/org/ourproject/kune/workspace/client/ctxnav/ContextNavigatorPresenter.java 2008-12-05 17:53:45 UTC (rev 985)
@@ -332,9 +332,9 @@
}
private String getTooltip(StateToken token, BasicMimeTypeDTO mimeType) {
- if (mimeType != null && mimeType.getType().equals("image")) {
+ if (mimeType != null && (mimeType.isImage() || mimeType.isPdf())) {
return KuneUiUtils.genQuickTipWithImage(downloadUtilsProvider.get().getImageResizedUrl(token,
- ImageSize.thumb));
+ ImageSize.thumb), session.getImgCropsize());
} else {
return null;
}
Modified: trunk/src/main/java/org/ourproject/kune/workspace/client/editor/TextEditorPanel.java
===================================================================
--- trunk/src/main/java/org/ourproject/kune/workspace/client/editor/TextEditorPanel.java 2008-12-05 16:22:07 UTC (rev 984)
+++ trunk/src/main/java/org/ourproject/kune/workspace/client/editor/TextEditorPanel.java 2008-12-05 17:53:45 UTC (rev 985)
@@ -45,7 +45,7 @@
private final WorkspaceSkeleton ws;
public TextEditorPanel(final TextEditorPresenter presenter, final I18nTranslationService i18n,
- final WorkspaceSkeleton ws, final ColorWebSafePalette colorPalette) {
+ final WorkspaceSkeleton ws, final ColorWebSafePalette colorPalette, boolean permitHtmlButton) {
this.presenter = presenter;
this.i18n = i18n;
this.ws = ws;
@@ -53,14 +53,14 @@
mainPanel.setWidth("100%");
gwtRTarea = new RichTextArea();
- gwtRTarea.setWidth("97%");
+ gwtRTarea.setWidth("96%");
gwtRTarea.setHeight("100%");
gwtRTarea.addStyleName("kune-TexEditorPanel-TextArea");
gwtRTarea.ensureDebugId(TEXT_AREA);
final Toolbar editorTopBar = new Toolbar();
editorTopBar.getPanel().setWidth("auto");
- textEditorToolbar = new TextEditorToolbar(gwtRTarea, presenter, colorPalette, i18n);
+ textEditorToolbar = new TextEditorToolbar(gwtRTarea, presenter, colorPalette, i18n, permitHtmlButton);
editorTopBar.add(textEditorToolbar);
editorTopBar.addStyleName("k-toolbar-bottom-line");
Modified: trunk/src/main/java/org/ourproject/kune/workspace/client/editor/TextEditorToolbar.java
===================================================================
--- trunk/src/main/java/org/ourproject/kune/workspace/client/editor/TextEditorToolbar.java 2008-12-05 16:22:07 UTC (rev 984)
+++ trunk/src/main/java/org/ourproject/kune/workspace/client/editor/TextEditorToolbar.java 2008-12-05 17:53:45 UTC (rev 985)
@@ -115,6 +115,8 @@
colorPalette.hide();
}
});
+ } else if (sender == editHtml) {
+ presenter.onEditHTML();
} else if (sender == fontColor) {
colorPalette.show(sender.getAbsoluteLeft(), sender.getAbsoluteTop() + 20, new Listener<String>() {
public void onEvent(final String color) {
@@ -264,6 +266,7 @@
private ToggleButton subscript;
private ToggleButton superscript;
private ToggleButton strikethrough;
+ private ToggleButton editHtml;
private PushButton indent;
private PushButton outdent;
private PushButton justifyLeft;
@@ -291,7 +294,7 @@
* the rich text area to be controlled
*/
public TextEditorToolbar(final RichTextArea richText, final TextEditorPresenter presenter,
- final ColorWebSafePalette colorPalette, final I18nTranslationService i18n) {
+ final ColorWebSafePalette colorPalette, final I18nTranslationService i18n, boolean permitEditHtml) {
this.richText = richText;
this.colorPalette = colorPalette;
this.i18n = i18n;
@@ -348,10 +351,9 @@
richText.addClickListener(listener);
}
- // if (basic != null) {
- // topPanel.add(editHtml = createToggleButton(images.editHtml(),
- // i18n.t("Edit HTML")));
- // }
+ if (basic != null && permitEditHtml) {
+ topPanel.add(editHtml = createToggleButton(images.edithtml(), i18n.t("Edit HTML")));
+ }
// super.setVisible(false);
}
@@ -359,28 +361,28 @@
public void editHTML(final boolean edit) {
final boolean enable = !edit;
if (basic != null) {
- bold.setEnabled(enable);
- italic.setEnabled(enable);
- underline.setEnabled(enable);
- subscript.setEnabled(enable);
- superscript.setEnabled(enable);
- justifyLeft.setEnabled(enable);
- justifyCenter.setEnabled(enable);
- justifyRight.setEnabled(enable);
- backColor.setEnabled(enable);
- fontColor.setEnabled(enable);
+ bold.setVisible(enable);
+ italic.setVisible(enable);
+ underline.setVisible(enable);
+ subscript.setVisible(enable);
+ superscript.setVisible(enable);
+ justifyLeft.setVisible(enable);
+ justifyCenter.setVisible(enable);
+ justifyRight.setVisible(enable);
+ backColor.setVisible(enable);
+ fontColor.setVisible(enable);
}
if (extended != null) {
- strikethrough.setEnabled(enable);
- indent.setEnabled(enable);
- outdent.setEnabled(enable);
- insertImage.setEnabled(enable);
- createLink.setEnabled(enable);
- removeLink.setEnabled(enable);
- ol.setEnabled(enable);
- ul.setEnabled(enable);
- hr.setEnabled(enable);
- removeFormat.setEnabled(enable);
+ strikethrough.setVisible(enable);
+ indent.setVisible(enable);
+ outdent.setVisible(enable);
+ insertImage.setVisible(enable);
+ createLink.setVisible(enable);
+ removeLink.setVisible(enable);
+ ol.setVisible(enable);
+ ul.setVisible(enable);
+ hr.setVisible(enable);
+ removeFormat.setVisible(enable);
fonts.setVisible(enable);
fontSizes.setVisible(enable);
}
@@ -416,8 +418,7 @@
KuneUiUtils.setQuickTip(menu, i18n.t("Font Type"));
menu.addItem(images.charfontname().getHTML(), true, submenu);
- for (int i = 0; i < fontName.length; i++) {
- final String f = fontName[i];
+ for (final String f : fontName) {
submenu.addItem("<span style=\"font-family: " + f + "\">" + f + "</span>", true, new Command() {
public void execute() {
basic.setFontName(f);
Modified: trunk/src/main/resources/kune.properties
===================================================================
--- trunk/src/main/resources/kune.properties 2008-12-05 16:22:07 UTC (rev 984)
+++ trunk/src/main/resources/kune.properties 2008-12-05 17:53:45 UTC (rev 985)
@@ -30,6 +30,7 @@
kune.upload.gallerypermittedextensions = jpg,jpeg,png,gif,bmp,svg,avi,mpg,mpeg,ogg,mov,tif,tiff,mp3,wav
kune.upload.maxfilesizeinmegas = 10
# Images are resized to thumbsize pixels and later cropped (centered) to cropsize
+# (integer values)
kune.images.resizewidth = 400
kune.images.thumbsize = 100
kune.images.cropsize = 85
Modified: trunk/src/test/java/org/ourproject/kune/platf/server/manager/file/ImageUtilsDefaultTest.java
===================================================================
--- trunk/src/test/java/org/ourproject/kune/platf/server/manager/file/ImageUtilsDefaultTest.java 2008-12-05 16:22:07 UTC (rev 984)
+++ trunk/src/test/java/org/ourproject/kune/platf/server/manager/file/ImageUtilsDefaultTest.java 2008-12-05 17:53:45 UTC (rev 985)
@@ -26,8 +26,9 @@
public class ImageUtilsDefaultTest {
private static final String IMG_PATH = "src/test/java/org/ourproject/kune/platf/server/manager/file/";
- private static String[] images = { "orig.png", "orig.gif", "orig.jpg", "orig.tiff" };
+ private static String[] images = { "orig.png", "orig.gif", "orig.jpg", "orig.tiff", "orig.pdf" };
private static String imageDest;
+ private static String pdf = "orig.pdf";
@AfterClass
public static void after() {
@@ -37,10 +38,15 @@
@BeforeClass
public static void before() {
- imageDest = IMG_PATH + "output";
+ imageDest = IMG_PATH + "output.png";
}
@Test
+ public void convertPdfToPng() throws MagickException {
+ ImageUtilsDefault.createThumbFromPdf(IMG_PATH + pdf, imageDest);
+ }
+
+ @Test
public void generateIcon() throws MagickException, FileNotFoundException {
for (String image : images) {
ImageUtilsDefault.createThumb(IMG_PATH + image, imageDest, 16, 16);
@@ -164,9 +170,11 @@
@Test
public void testSize() throws MagickException {
for (String image : images) {
- Dimension dimension = ImageUtilsDefault.getDimension(IMG_PATH + image);
- assertEquals(400, (int) dimension.getHeight());
- assertEquals(300, (int) dimension.getWidth());
+ if (!image.equals(pdf)) {
+ Dimension dimension = ImageUtilsDefault.getDimension(IMG_PATH + image);
+ assertEquals(400, (int) dimension.getHeight());
+ assertEquals(300, (int) dimension.getWidth());
+ }
}
}
Added: trunk/src/test/java/org/ourproject/kune/platf/server/manager/file/orig.pdf
===================================================================
--- trunk/src/test/java/org/ourproject/kune/platf/server/manager/file/orig.pdf 2008-12-05 16:22:07 UTC (rev 984)
+++ trunk/src/test/java/org/ourproject/kune/platf/server/manager/file/orig.pdf 2008-12-05 17:53:45 UTC (rev 985)
@@ -0,0 +1,445 @@
+%PDF-1.4
+%µí®û
+3 0 obj
+<< /Length 4 0 R
+ /Filter /FlateDecode
+>>
+stream
+xí½M¯d9%¸¿¿ÂÖøë«o ø¢AÌ¢¹Kä"Ã"¢
óEÍ,òïxxHÉ®½p÷ÙÌT"Êhºú (:¢¨ÿ:ÂMþ÷ýÏÛûûyûÿ÷Loã£Ê=8òíü÷[xë¹ÆÐoÿ<ÎÛÌÿþ×ñ׿Íçí§#ßþÏÛÍBÎù¿OòOÏ3{-×ÛýËâÛ(éVÆÛêíË´üë0ÂcÚ[Ý¥·ÇÎO5½Å:tJñ¥¼
R½ÀÛÛY×xá~c£ð¸¥ÙÙU#ÌÚH^¢'µÊãn¶êái4
±Cϸßþñ¿ýçq¾ÕÜÎ2&SsùG,yQF'ó-Í[o©ÍOphÇ[K{*ç¡IôoHY³¤Ñ5Kn¬ Ù'áÔBbÏ3Ýßza1JÓ"bJødR?I¼íÙs
ýüóÏ ùË[ 9càZÍo#~Ké-ÍÎÊáímRÂ[BB>ßÂü£Mf.ý²t}+sÌï%±PQÂ[ü>¼áaïø$¿5Éç¨6éH{H×7
¦ï³YÚHyˤïóÃ0¹ÊìÐ,ZÒc¶rV1Û
Ðg3¥Ò9ý&a2»'42t£ÉÛn6¦ÈI¡2>3KÒJYë,c¶.VÆSÊдOKÝ)Ò/
+I·:t<4cÙÎOæÈRmÁ2%^!ÌZi)
s0¢¤2âx¢)ým:¬½)H|×îç·Z3D¥t¶ô%þÏÓCæØÔ 2MÚ¾Ü
ÞisJ{PæÔVz!N1DBOoçß!¬BzyK}/vÈÌÞ>S8RßË3EjÂ3¥~1sÔ\t@Ýôɾ2vÂ,\fwÆÛaÃ(äÈêþq©ÇÖ¶
XYUEk$¹0«a²~ªÈ*é
+ý6ÍZSHç½ç ¶i4Gì.zÃ)Ö#©bÞHNq6ùg¯Éº:
+r(,
:g(©ÙØR
+D/d4¦¼å30f/éqr¬
+T×[Z>²ûÊ1Hqé~4uNV¬¢óIéÐßSßOEæ"lBxº9[´ºæÔwsÐó¬wªNðYÆì\-hicÒÔ!2}çÐÌ©M1à{¬AÛyª¤)7fßr¬»Ö¿ÈÈÑ%Ñûr3L!-sÂȹ£ÏE¦@IS
Yk¦Æ
èºÚÌÎsÊÝ´VS¸ç¬*çM'³OMB%Ì3E©åB¸m4g^÷fç@*ÓV2m½¸;aÒó"ÊF>̳
[&ÑàRì9t&KZgsõ¤§¾¶ãNQMUwi«ûLË's>åHt-bì9E ç§JæXG¥*3ϪÍÍÓÞûÊâݽ<,¬à,´ÖK
dQçªT"
+ÕS'Ô¡uDif³`}9ºìß·¥ÉfÃ!$e´èÏÕMT
+
`ÌzkW¦©DHË"¬
iÔÄÕòKßîïö÷c³êÂs½?zNSåLóî^Õ*Ä|bü¥¯ñ=Ç'ÿæùbk'þð×ÊfOW¼MÍ<ù¦PEsy9ç<eúóÓ÷°ûK96:;°Ú0ðáêûTStŬÕK:£úPXý·Øó«¿þþ¦ÍáGtÔ\¦*öO|\vÈÀüÞJ
ýUª9G±á(²MÜßÇoË\²KÛÄ@i*hÛæ§HGgÉë-KSlϤÇrÚãuv@·_Ù1Qe·$b[D^gqsYMNyà/ÙgÚ´çº+ÿÊÒ}8¡ë*{÷,²W<[G¤ô9³§®ae² Nkì°Z0wh¥ç¾3ÂZ6l±æ?VÕx75êá6åY¯Ùpf¹rFEe.}6t Eþ2í`Ñe-eóÊü:vYùÿùÕËßÜëN+Ï<:ÅÄ(³'3GoÅ\ï·:÷^cÖÉäQóÔëCgRZ
0=wzÙk]vÝ+´ôddé9jS[þÉP±IY¥P×ÝÒÞQ¬¹Zõå©ó
gnü1sâó!ÄÙȶù`F0ÑãMvÇ"M¶ùľÃvrQ¦8O«ÝæXRõäóÁ6,íóÁ&Ý,ÏæÕèóÁõXm6˳^=³a36Í¢èØDhéε,Î-Ü9yõE6bÀHöOÀNÔ#D#@ <¦|À¹%MkLµ2ÔËKgÅ¿¬ÏlQæ¶.`So:À]+ÏZí Åô¸9AÛÌò¬G`¯}åê¥ÿ»~Á2ÿþ¹·k¨0ÌÏ>'ø¸Íµìmê:7Jùrü·_>fÛ_~9~8Ï3Ìÿ"ÿKÿò¿ÿã/ëjK!ÿø#Ç:M1Mc<¢Wa2Ì5ß(ÓsKÖ%ÌÁ"ÍÓÆ9a¢bÊylÉEAT¬Ì¹ÓÎ+EÃV!Á¦?sàd[a%1yX]wÏ y¬´6×
+co.88ÔÏLùÈPÏquM+qvòÝ¡þ«uÿù_ÿµù_ÿùßßç?Îÿîó¿æ?Ïÿ~añùSøAÅ$C3ÂÒü7Êù3þÝ~øÛ_þCÄé«rÃMñ[ø¬½òTî³ïÔÜ[Ô³µ)ÐÚµðÔ5ãtí¦6f6þ©ìu$¹6~¯cé\ ëSò4&û»ÌdøõîßVõïmåë³-c¬*°5ÝRKTXOlß|º-§|º-N/S§WÊéæÍâ|K!BÇi:X
+«,$· glÂyZì¥YXÛa¼pƹß0_=¨©C¶kån#0æå
£ÑN>N°0§kV&GÀ*µ°fÙÄs@ +®ÂÞÇÀ²ø 8£`%ºXiÏ£ðÂ?iÒàúï£0C¦m¦áZ¢¤¹htl°FÁ)dÉQ°Jm¬Y6
+Iaa´ñ`øjzËâ£à袥5>Âwxv6y±²Ã¯Íµå5üdÝMLz15ÕoÁ [oØ¢¡-;S¦¦Yý¬MºÂOC}¤ÕV¶²æ¿çè^Óf³æâv¸°[yÔêÜð¹)`
¶òØK÷7K`qäCFìÕ¨KüÑ*Wʾ|¿Ý¸ÿÆ4×qÍeÆÆi$Ϻ7ë>N+:EÓÈüÜlåcÌÀ7ʲðEMr+Ôz«×ÓlÔ¦-#?-Õ¦ùIÃ"E0;ß(ËÎ_m<Ë´¾]ùhóÊ¢zâó3K*á÷,i³ÔÜß,?moBÛζuNàb1îÖø N"h° Î>þ`ão5þ¢e
úø[½Ûø³m L«`Ôµ£>8Á%MB `¡K.<¼ðéCB0
¬:3e¿K9~n"} CP*L|C%Äi Lg× I¸ì:a.du,JLr¼Ô7à× ¤l:Á)Ô ,téÖ»dÂÚ¶d"Në2
Eg*ôX £,Xm¾ê2qåÈÄ+>"qþÿÙÙ6wOßÐA
¡þÀuáÒß1pZµ)ÉàXÇÙE#>±bbp+R6Åà*ºë]BÀ¦-çFEM*ó\ HYãï"VZãYϬ &ðÂý,5Íد½Aõ_aÈÆY?¶)/CíS¾¨OùÒv,OyR¶)ïNyº¦<ëݦ<Û¶MùÙöV%Nyä²My'ø'eòNág¡kÊ_x)ÿ§Myáy¨²Õþö¸± 8öÿ[?V´m3mÓ qzXÖþ4}gC%¦HûùX3ùâFÿ¢r·BiÅ^¯[þÞ6·ücªzIâKVV¡Ç"õï·þEï
²{/<¼ðéCPÅ ¢9sãàW~ÿXPXHCï¾õ vvÐt°_#¡Äª¦Xã3²ÿýs¨[Ù*ù_ÀåÙ÷þS ÄímÛû]X¡ö9ÁöþFX{§p»nerïoÚÞße{ÿl8 öþâ!!gÄ$hzßû[ßû;{+Ñ;¥5>ïý_¸óû{¾µÔüVRÙ×!Oæßð«ñµ@ÜjÚÖ'øZ@ʶ8
k]këÝÖ¶m[j¯â[ÖÒ¶8Á×R¶µÀ)\XèZ.<QMpåÓÇ4A|K¹ü-óOQñϺð OÏ'¿NÓ?
s ,âÃZW\Ý\YIÍ5ÌèX`ãÐÞW$t»|¥Ó*3ê§ëÕàÇCFXÀ óh±F¬Qb³8öêÂýh1ç·Cõ/þsJûÂó¿ûv@òw]²m?°*|ý¬ÿü´ ÖÈ¿bß1û
uM«$¾§5nê'Ée
£ÂñúHxÚ K÷8AµèªÇê\ªÇÚµ©Ñy¬LÕ#Û[êq«R6Õãªêªçʬ
+/<úê*Zõð
Õ#FÂÏ´ìö¯9]÷=¸©î{aQ`\Æ
\R6Yp
+
.a`½0°mKÉß°ªÞ¤,,ÉQ,,¶e.Q¸pD®\ú(H
ÓLß'Ç2BN¦·óãvÞwQ\BüãDÚ5Ë
+* r0eâñK
+̽ɻóÄÎáé»g³Ý)Ø0É-+0·úÃê4ÂZwHXë ¶°D_xXåZxبµð°Õ,Ïútaþð,ÖüÆ
翺ðü¢¿=íDt±¸ëúÅð)?]ßä%6WoñÿçñפöÓão7¹÷©zW$ÌýaÁu39ÿ;åñ±y2-4º 6s¼
\ÃYßU^ñsyv·Ð=í|]ýcL7?~7ñ;&R6gÊHÇ4£.
+§(+7uà^ØMFp"¸¯,µ¿"<Â*TlVyHÂ'$|ISÁJ°$«X§yÖ<ÖP+ý¸t};ùÙµô»]¸æ¦lL1¨½ÌåùþÌ9¯F
¯¾ó¸çï:¡ÿésUSÿÌ®ãºëÎÞe'ì¤Ér]¢Øú6páTµ:÷zImì{ã«
âîcQf'áw¹(<äÚLÞ5ÂáUçúV£Ve³LôÊ
¡÷(¬êXÕ£xºËWNüòoG=ÞhwlsäBü{½d©tN¤;Nñæ8Ÿãï»Øúw¼uþ.Mw)Χxsb}xî6¸såÄäÎw{·Í®"üUîÍ%$wç)Àm¬nöÊÜk4ñÌ?óÜôÛ_~zõzT7BÿÜÓP¹_3úfLMMtÙ{Vq Ù=Z{Ú{xÚ<°x,px°Îí$íÚNBq5uQä2(Oí ÔÒ~ªíÔ<eëô¾ðçC§ "¹ßs
+ªGw@6e÷«÷@f¥rRÓ®-" âx#³fZ¼¿BÐObé](ÿ¸p» =uÔôäZ,ùÝ8ý4IÉ]Ò"F¾pT^ï.rÈYa`âʤCùäÂ'çzN¸4iÿødÆáåËL at v¹s3æáÈ÷ÓéLJî©Ã3øáÉçU@îã`e*x4^n$TéÌÿ*Üø<<ím7BÆUC|-;¯2U´tñ\¬Ñë¯ón¶.çÅØ'ÆÃ9^HEÈÝÏ/øDn ÉT[³üÒQÃ]HiËTO\¿ûè\½!A®É~,hÓ¼ÇHS¬8>ÎùmÌðR3¦hÓÄãIî}5É;ÆJ.búï
@&È8w£ó×ì3¤úªrð!ÜÅkñþuÁÅH.JÉ9ÃK´³®ê~ÖøúÄ÷wb.+FðsÎ6*ÕAx W«I¤\^h½W2 Ò[ÉLó÷èe2çÈ9ݳ¼ã±¡³¯ê
Ù-!7øïΰ%UpbU|±n7&9õ¤·JxÜ.Ý_Ã)ÿ
+|'û:y$áHÐ&Ë^ô)j2TO"âF4AB(qð5æ¨Dp]¥Im4ªWÂãvm·QÜ02¤
ã´ÑÓV§ £8D µOÇDvÍøR>ɸ
+FͶ֦¼Û:H^£Ë³KÞ¾ÞÆ):Hu%²Á;âÇÛhB4ÍÛÊíGñ!xÊ
8¼ü§=8cÚv½| óöËm#Øîê»[×B´.? 3~+æ¶øZÈ»åJ².:kÌYÏÞ¨Çs¦δ|¦/yîÝS]+dPâ\ Ú×|yä·X,Iæ!ÆåQê®Å×GiYòÑZ¾ÖǬJÍ×ÇÜmÕõQîïËãP%Íõ±ÈÕÖ±ÖGK{Û`ë£^ªöõq®£îéÚç\Clçëß¡3Ý0}} ù¦I4Zñk¶r`Íòrèå;[!\cAòõX+dÖå¤ÄÍȬºÝÀln¦¶@"NKY+dÖË̶BæϵBæ¤}å
+õÜßVHK®ÆÀR¾Ö%*-Û9²³&SJwE;k}âü»¹Õ!FÄS%é#ÐB1 ¥t-T´·&Iüx)!wn¶V2!È}"2àóNpò¬Ir<%#(ÃÁOÖ_.uWæÐôJy(ö³VeQUyÀmù\ÕºÔä,}`òáÒÄgU$>9!ËÒ;8eE
+¯¸'@øVjÇíËPÓso6Ö¯¡¹%öÒØ´K%ª¬q!"meyL¨ÇËðJGG¯ÈÞB(¥Ms"Qñ.w¥ÍÿÖ"¦MA rF[S6}jôAuZr×?4¡<ù¹+O+ߧTª+O6à' ºQÛ¾tgÁq«ÎÒ°1ÕY¢#-ÝYºÜvÕ9°rÍ©ÉÕpMSoʧ-ºÞ¢å<e±¥¡%ζ*[$çéÎr½qu}r¥)wpÛÚó{(NüYzJ»í< ¢·Mi_¦4-¹úB¦`Cç¶âqÇ´&ª_ÛRèt©J_ZS"HÌ,ÏtÑ ÖÞ¸mkZS¶í=¹ÖÜ\kZrµjM|½öRz}âÔÖ,ôö3Ö>±þÝÑ)±³Ì.×YG4Âcz=nüà9yxþAÃlhü'¨³ø<<ÿKÒêªóeÍnW×ìøC¹øì®Hâã:óÉóF~ÎKúÐA'>/ÁfØòá[m3PêO>A«¦o}ì;"Þÿ®L7Ô¬«>{4Õ"óSHÏáé}@ÍeS¯Yé5§vƻٸºûÄxHÕ,õ¿ HµßCÖDPs_¤r%³J8tVH² )#ûânÔHfr3gøU¹»¡3Y/1ìlÆJ<¸|ÂWúкB¨Ôíæ&$«.«2®fÅlN!¥¸¨;Â@uB &qù©¾Â]oÍÚö¸/ãë\×ôÁ/"&
´ûMWvêPÁ-Lî%rkhûJÓ=» ÔÕ ´&D0áAº±dR[θ~Ï8ÎǦ{TOË7X~ÄlARQ-Þ% ä#ÊæÌ®ã
(Óëì q¯xV`'U2àÜÉ^´EñÙ±I#Ô
b-BRHs|2%3zÁ"ó¦h%[éª,fÀÅ÷hDjbkkò
+aȣ2
to2ä²)F1ø>ì3ø¾ªy,A1±Qäͤ¢¨àfµàÎAÚA¶t`êÊUáίi+ç¢ãlxLQ©è)6¯3ÎHÀB2|Kª¼Ò껼F,Zæ÷SÎÌüC7B}XË2õu´Ñ1up%ÑPÆÀ>a0UuSsf»~³¤ì(,y<é~î,uÊT½u¡h³íÂRtiPaB{ ÐLÖdñþxþòs,ë&ÝEïHK,|ªb¥ü[ÝqTzn·æþ®ÞqÕ
Úæùç rH4Î(;¥OIÁEÀÿòB¼LæHÝÜÆñbÐ1wÔýO[
Q+H<æè
ãtf,I6¬'ÂWOÏÍ¡]Úb@àï¸Åºú±PôÀä °z±@b'E¡4ØÆ%Bô¿HÐ8MHÏS²çAÐaMAsJºËFA(@³ix(ùX"æ©ë?%1aáp®Á´äñÔû©I%%ûÖ-GèûGIÊ`Óø8GÃï]'\åkA%v§Dæ»)ÁKCóD/!áw-:XNÔcÓ¬ÈÒ2«ÛßE5°mo7ºÒáÛ\ij$í¬B8$r]²"%»QI¢%
@6`¥
MS3Jb7tl/õ)ð]â@ìM¬Ä ABWlÅnL¸Ñ`ËЬ¼ä^<kÜÐÅBgðY9UÓLo_<¤XÒ ´K*ÍG[B½²-3rXTFÜ«É(n"«ÆXÃJ צ»`BsDÆ
xÄó¿@~&>MçdMc\´ù ¦$e¡@;!£Q}$'Å,]¤
+b&n$2#x&.3 É ÖISWFa~_`W{jneMqs$kÖì×Lu$+VAòÞxGoD¦ + 'À°N®´9¢ fOIwDoeG+ãS7h-iEë É
ó´¾A
IôG¤Hj¨(WÏ´#úIÐAC¯0Jar±/ª[µ-rÄɹ$âB J2äNÆ°*!¾,1D
tøÈéÕå11õbB ÝVUåͲó´T ¶MâpJ×ÙTUTÇ_ѱ9A~
X$;Eªt2$R@ÐC3@*5³Iµ}gFkDm*3içÜ:^@)NÓâdò5ýÚ§3;ßÎvàRQ7Q£vÍ®ê ë!~ÏÊiYä×®ÃÒzFcéÉ>í0Ñ
c0?¹©nH'/\DY º4BxCÛDÔй*`úkVhiØ0J¢ÀM¯$êthN/ÃÍÞ8cZ¥·òkÔÙtMÖ
êçÐuYþõkU]û{|?^~4âA+ÁVÞ0ß·kWAKø©ýäôCNAQy«Iºg·R£ê¿ë,¨ùY»ÜUM¨ÖqVè÷¦A%æz ¥%->²)8@vq ´:ÙüeP3j¡¨£"o$dýý¤ZÒæÈVZµV£HT´·áÉ´uÀ×+ÆxÖæ-®ÇrÖÏôLêâRg¾kÈw´~
+¤d'¯êü]
+˱âãÙ¼|p# zYÂýóWûBYeTþ :0»<VRnMµ¢É-s#Ù!PèÇã"
+b&_N×%ºQ¬¤jQ at p$
59° Vò7NÆÀà°5õsÈ~ÓKà0Pl)=1·°hn»´VifN}ÑéÉlDS<"ØâO¦Ô¢µ>edÎisÂb./RdÍu±©Ý-
+
+)öM1QêâHßi4Í SY4æÇÔô¥ÉGÓÆg3-¢tô.è]»[BÐXar D],ñ©UCµÙl|}ªÐÁ¦Ð ý/QMÃdM?)r$$ó;r±3H^ÍÁÆxÞM⨨HÂwÒN¥x&µßScáqù=Óæn(<R½ÊR¨nPæ5²-ÚÅÀIÐ]²°½F|×A+ rÅ4Ì1,fV.Ô¢k$a&àAÒ·Åp8µ<cÀU-¦3ä5`Ä q#á¥åÄãrI:ë¯@Ó BPS=c[x!ãYØ©zTX¦ÙdçhUzØ2w('£ÉOÒAy)FÁÄ s/fs£ ¡Èá]t~Ý$Ä-)E(ħ²kö®C×
AÄæ"´ïÉ'hvUT.qÕHSVTçÝQv°d¡tÑϳz£ëN'àyÕèKzÇ0FþÞU-Hfçßrz!?µ K.UIzªØ2l¤gEäwbÑáûÊ]¸,3ò'
Mo¯`Ò~tuhª
+¯ª:(ºfÜ® ¡(#qLE ïÌj¢*L!i#ß.ZoàÜÅ~ÁÁ¤úòÛ:3sß¡ë
È9-}ûAfFnºN%¼#A
ÔÕ¨*:l{ÝAe- |y+®
+aèW.®õ5ç#³©¾Wês_ at o4£*r¢ú®ó©®³Zu1-Z³<°âÛàqÅÊ]8(s£DSUUcÑýÖ¸j)GµO]¼÷áØ.i æxÔ¸ïs´°U Z@RÐXóºÂmàµà-ÛÞº zþöù^ß] æòó3lvÔÜæØi³
+rá6p~Î)o¶9àÖ¸èãFh¯Kúè§:1´zÄÈ" ùãæ¦îT)îÖ}RS³ÙòrûÛ6T>×æÊ!Ò¥6tª g²Àtµ--ë2¯»X!]]b6KavÝÕµXJâ|¯"id5Ø£_°ü"f²¾:w1 Ï9aqO\¸Ö@·<°è¹ø»Ö¨2Vaº|ñ5»Bj¦l¸Ã>ζk}UÕpÔùYÕä{.[ªÐ¨ºë!ìið{[¨¤w|
+jtÕ<nJZí`E.*âb\ÀA
¹óÂ¥UÚÐÆA£B yÁ6tµá8°q><zh¨íÚôq9¤¨dt/RÚ:
zd-â$$.Û?àªË§6Ö*}éõN¢A.´®B"«cx)zÒM
ë\â5±3Ü{dzB«-*MA!J
+?(Xf¤iåkÐJ¡´Örô3Ü7½VaÕn¥h
+ãr
+J«7N/ß<PLÃøÂNA!ö9ÐüN8FÑS¤â-(Dm^ÃO
b& *rho®:
+ÎsNÈÎMªTÍKÚÖ h©l8Oãèª`0*Æö»YA8[®ØJé$Σ*%ø!®u©H÷ÌeÑ"%W;bï ¯ tÒ%@U¡ÈÃ@U!¨9¦¨ª4"S
Y<eÛVRõ*fPq;=ØFÖUÉA¨U, at U'7CVÑËS!
V!pÙ`®M2hWΨ
_E'ÒÂW>Éew¦`Ä* ]ÜçxXô²c¡¬AÑ;Õz¶©ITÛT U(pw3¤=éÐ!ðzi±V/%g^h«»-âBÂ"û©Ì+ìWÄ%ííu§nTT+·´¹®C1Wèÿ³YVvÔU5Ê»àTÊ«Á®:Â58/µD êOßÐ"1g³vkWi¡¯ÐDU
+ìI_>QüUURX¬A±g~¢¢¥¬¤uÏ®,(´ªJ¥a¥¶-(<æñ´îE!*xº±2ÜÃjn_Óî!'³ÓVB±HwÅF½ah«ÀQHVZØ¡Ðuu:©¡JÅc%)Þni<t²Ù=@²{¡õ쬵ޡ©=©²Y)F7²</x¬sV¸
+U¢KiyµÄ{Vá»Gõ¶iA´Ê9U²ÚÓöRçUAZÞfSÛÔY«Â´_MQÙPé- VÚ|,¼HtâQXb:©EJÖf¸T®H
+Öêð±ÈU [m
+v7Úö¬¶:Àjo÷ÄùÔuXhµ¢»Jµñ¨-æyÔiËîD÷¶ÅrÍ
ò@+O¸ÅïÜuèÎdßRÕ öÝ®LééÊ9¬x«Åj&é|©v;¶õ[ pl+ÚZ¶ÒBV¥cÁ¸ 5¯Q
ºrÒªõvµ¼ø
uF \ÍbP¨<Ê
6cÔ.ÐTËUUsä¶ëôf°D3C[.ºÂ°ÉËwæ¥â¹rN^çJ2èë.ºº¼É 'K
+dHZOÒêJRéæS.ÂgpÁº(CFÃ&"ÎA»÷NÚøͶ{pj=î"µû
yóf ¯$3-xvAYa/²pÐô
+í¼HWnÒ± ÌæÛ%¨6CÙ^)û#ÒkÛ"½0¹òõ"C\X¯Z}ÉÁ^ Uíh/½íEâl÷Âè¸9Ú«FfT¬xÐj7 Uñ^ÈL&BÜ´S*¶øâx¹ÇHÜû*æ+é¦Õªb¦3¾D×÷E8ĦàÅ=ÓÀ¬G¢¨¤Ó-ìW%ºßüª§¢Ãº¯<¦3øW(=³ÎAmP¶&Udã
FY
+k5CA]5/
´#÷%¥èy¶®e@óa80i»G+ñÑ!L=dzêT)Ѽv&®p0Q?ÕH6ñ÷8!Ây³Nx'ÖP7Ün>`1²Lí^O§GÔ«Ä)0iRaÕ!7¡A2w&ÏføaR
Ôk<KrÙÐݵòáYj(<!æ¨]u;« ±jÓ¨pÈ6t`Ô/ùG^M7
+¬F2ZPxVͬb`êµ8.ì
+DWöNøBgÿax±îKTe/
UÒùÜ9+ëÂ͵yt¦ 1ó¨»@A©<Q^¦u¦>ÕÝd'âWçtÇeNÚÝvï;¶÷}x.ÒCÑãµTüWÒÜ+Èeh?Þö^
+,dÚ«½Ò;b>OâêfV
ÞLç½`¥Sc²Ñ¶ªÃ²ûÀ8*4m;¼çZ%Céâ
¾) JX²ß)Ãðí\ÍSF´@e¬|©ÕQ¯D$VÃ2±`R6÷îÎ
+-?Á^Åì(k¥p/o`r2Kl¯UYh¾¬ë?Ï« º4Vp¡ó±4bÌ{¡)ÄÛµ;+6G
Ý @3ÒÙµÔØ¡f-ö>EíwÞÚô½Ô×ÆUáfïKØð;Gp³XñÄ
nN§$<VÔÝ÷¨IäFÔÑæh»'C±¨N¸4JÛ9Ã&Úgª!iúËâÊÑгê
lÞrà«A !ÖÉ^ภfdÐ#_
·5GÛµjhÝi¾vâ°uÝAhæ¥@³t«4µ¤qf¡tÉlg?µ ÍÏ5h¥ãÌ0¼7 Y#úwìDõdÞæhÃ+9y h¾Ôaâ¶Ãz;qeE£9UÒ|ù5î;F¨Iä:}Ù 5Ï´riAÍétá&ÔN"%GÞ°fùCnX³\jÄNÔ»Ö8ÜP!t¨Üײqtíh@³|h<QÎ~±PcÛ7æ8Ü?@3f5ñ;±A¢í 4KZUã:ÌÁÓ¸s½ó 4G=WY at s4ONÍ°v^4«+ò %×À}þ8Ð}4ýmêe0¡f±=íÅ¥VsÝEèö¶#Í¢¶é= H3ýqvU²O¬:×Õ§&Qf>X竳MQfÌ´n¾º
+ tüTÙ5U]6zð¹7¯ºÆ.@úÀck«í>Ü>>þþаö-Y
+$LY>¡¤dÆòFûQé+ìõcùõî f˱ ªâM3c¥ JϪ2Ôn!ÌíÖÃÌPÚuàQë4]ɹ©_è!qfQót0Î,Bí`Ff9qdØð¢:Ìl«LÄE4âþ4#}°3K@4qf¹-IåYHl ͺF±"D=®m4´qæ¤Ï4Añ8Ç%KÝ°fÜÊl7Çå|UÓ/ÌÂÖÌJktÑc>bÍBé}9þ¢´íÞ<6{36ã¶9v·xæ`3³8ؼ
+°m
^)AËT7E¢ÍÞ}µHj ÍèÙͱæ¨G]
9{7K 0, çθZEdìÑ¥ºc'µ¸és
+<¶hÞpµÒ7§À-¤ãÍ";r±!/²¶x³·Û!çH
ÖåCΣºAÎBá;Sõ¤³Øâî,9>U¢*g/Âgòá3vú@UÐ[_BÎé$òÝý81g!°bÎÉü¶9KzÐw8êl=³¹¬*ìk9AgjÄO¤çLu7u8>l¦11ghÐÛ8.¿
+8ÓÆ:®@غªª×ýÎB¡gnÔµb4¶Ãz1Àôî¤ 7K²þͺd5&O¡èæÈÀYÄè¦ØÎXF¿×S"ÎÑüB9cå%ÒÄ9V7WO}Õ¶f;sRR! æ,qv4«sÔ§Ç9é$Ãw3dzIg ç
¿pÌ9V^i8å7ºqd×8Ë¡ÛbÎîÏ
+9§È
+G
Ò¸chÅs9cRcM1g¡4¾rv´MÈ92¬Ï9˨ÒáWM§®n 91vÈYDm6P¬]Ã!7)ìs¤bÎÂ#¢Üfsl¡ÛæebåÑQgD¡_túu.cÛb s¬îÊк_YSy@êcu,¨³ UZ@çhC
+: õ69)î!LÐY³(ÈÐ9¡'èBpÔ9ºtæÂHÐYÖc0¸y,nrtÆ2¯{µ637VÄc&k3
+9é«
rGºhZ·t:ËÔjÕNÎÜÖvdì]Ëv»
};ÃJ"Ý1Ë°³ØVÝÐ6$q2ÁtO¸Ïh
äå¥ÜYûB
È30Rì}íNøƦÒó°UÊéYÛ±
+î·zFÍqYP CQHâÙªËU÷S<cóÒé¹}BuÍ!r
+×EØ~±Ò
Ì gLRú;ÃÐûtQÞ¶^ûSé+õ}¢z"ópPUɱvIDei?µ]°°fÆÛ>':Ç*ö|,<೤M6ûbMsûä±bÏ
+;¨M
+|ÇMÇ/¸°
+a3ýç =ð»mȳo, ¦Ëë"úÏ gØq¼ÄYthéócìuès§¾ò÷6ºþ`
®»ø¨AxPWF at 89L Ö#ÏZ½ UzÁ
+=§àw=%nÈs²WGaG¯[µ(ò|©Ômù ÃÎ"åÝ@d]áh¯)ì¬X\.ÍX2Óq :q{êªpä7
Õè àµ-¦pvFÀ9f¿VÀù¹í7ORnv«p³¤C4µ,7G»±B¸ë
ߪ@~ç6OBÉø}lÎÍ9¸±¡ÍB"-z ñWÀ¤Ûosîu¬hs\yn¶38vH´9Ïp#GjÀÍæ7ïYðd_ðɼYÒáÉ·9´Õ·YÚa×yÃÓÄ`&E]a8g
®¾|/=ÑÞE
*³ çlè
+9Kn´¡%}>cÎ9úå\`ήsó¥}óÒ!èO®óéw2!Bùt_eCóé»*Ëbç<@/XÅ{1¬ØnG*ê,yns¾|©ÏLsÎp$1gÉ6÷fýJÙ0ç©·sÎÑdzùÎqTq¹ÈK§
+¢ne¹dó1ÈYFg%ÃØ}¥ªrÉ+Fo³¼\}
d. Ñ8ØèG 8Ópk
sË
WËÔßXKÒت¢i:UrNÃnÔr6ßf<È÷äÛO^6«6¥rÏäôäÜ,³RÕÊÌ ³tz2ËÂÜ»6ÉÔ"ÀÄÁ$8'»:e¨3Ð;ê<Ó6;:§áwt¥3Îê,Màpty6ßfÆwØYÒjnêíb<Qç4ÅdÄݵYzj2 ± ½©;§á~ 1^+:BóüTÞ¥gÐÜsÆk ºÑPI58É1g]/ä,_C%¤´'Ïf×
¢ßçlwær%ë¨Sù)ç9ËmOs^7(a»g»³HÄ9'?"ÎP%iCsZ·Ó ¸æcçsN,"ÎO¸×
qõɳ9'Æ1qÄY($µß
%(m\1&Ns3¾¨;à,9ê
+3a8à,¿ó@sÆmÛ
7KÚ`ï¢i3Ü7£Us³ä°"4v{¦ãÍȲâMì
of¥Þx¼ÜSeÎX¡'ÌOÎÍB yÃsò04a7!²·ªÇB[6ÀyU·VmþÍ`åèéoÎÉ/ky3bQß6¸9'ÃÞ7çDtx³7ÛñfaxÞ\%s«à,¡Ós6C³¤ÃG¡cØ çl±¬»COÀÙpÀü çÜݪÐ<¢oñæý®~MÂ7!<ù8Ë¢ËM1ðæVüxsv;ÅÑc_È7K´ÔÔ)ë`ç~DÝ:&àçPhLq?W\
i`OFs@¡'$åY±ù8Ã&ëæ|1¿ø :ç* ³,%À7½e5a¨ÖÎV3/³:æ4°Êá^βÖÔÍËYÖ(ÌGÈY^cîä,aÞ6¸95Vopsj#A¸YÃ.gIã mN[Gåõ²98ËôÚªuÉÑfyÍ3Dm¦ÊEpsª.psªv8R½Hxs2¸Óñf>dìx3s,¼Y4r7'Ãë7§Fõ@¼9é£z;Þ=ÈðflÜ,ý7ÁÁðf>Çìx³@o;Þ,c.@¥âÍmáÍáhnNÜ:=] 7'»cp3°Øðæd7oN*xsâ)ÁÍÉnWªf!Ü:gñfIÓ?YñföøBQÁñf¡sj<÷5¼YD:*DM¼9gñæd1Ø7ópR{òrzô(BíÌÆMñæd×hÞ,¤Á,Ø)4¿¿(Bê¸mhsZî.ú,Ï>¢Í2_T®ä6ã}ÞìFòÉG´9U:9Ú,Yh1mN§ÒÉ9UÛIÙAy}£åC°YcsræóCîäÚÁD°9Ùg'!Ú¥¨tissNzIîØÀæÔý `³o<é³]Ås7çÔ×¢;YD¿ñ|rn0²ÑfXûmãùnÎDù:ÚãÑz¬=áµ_xÔK=¥
Y¢¶£û'KBÇK0XÑf1ðëæë,»Ý²brܹ~¯ð7!?ù:g»P7[;Vµ¥;ÍGF.!ÞìãÍLBÑÕAÃÀñædÞpö=%ñb<»FáÜ»+3glÆ,UÙvQÒØ«½³)ÀÞ±`[±v³¤Ë³s²{l¥¦MuÀ]®låÞkUð&ÓýÆ!g±ó^Pȳz× rvcÜ0çl§cÎ¥l·¥²y;_ªuÌâ^(î,K9'Ó¤²tµ'Åm¹;fÁ2̢ʻ36©OîÎZUR*íAGá ú*q<¢ÏÉ"E,ôYtk Ï(tsw¾TrgÅëfdÅje4·Tfùþ̺Nv=øó¥Ô+«wÇõ]oCìÄBGc Úi»No ´Â t!ÌM ZgÐòÁæÜ\ôȱ¶6i33!Ç'Å2è(Ù±0àÏ%ÛéÁÏÅC ?K ø¹Ø},KöP´
+?ìÑ+Û¾ S²û´A?I»Ùy
/±ÎYXÂÏÅP~.Wj?KÎd?2±3
÷?_êÐz£_Î$üÌ×d~.ô;=ÈÁÏòô
ÉCÄM,áçK%Vñ^+6/
8ÖG®ÅÂÎ: - è l@BV. ºqÐ¥¸ -9xû ôL§çø¥øEl=Ë:ÍÇÒP,*
Ð
×ALkß0h!$]Öá¾ ¼ÿcÕ.ÙöA÷uA[/A`¤ nÛè²X°´È[23ØMssº¨ÜB .ÑCÀFUé$á"Ð>iÖyTåTêJØ %÷¶{=±¦ ´´ÊÙKÉ»J¶Gd?ë1ÂsVv¢Ä KðØêXùÈ»Ã@h4¨Ýu]5_¤31è¢W"
BÉ6°9(¼Â|Æyw}.
+îû,ÐkC=V2!hù²
+ZF´0.@èb.Bo
.´
.-:]ìª*aèñé>tCZtD¡Ó60¸ÝÜ%Ë3«ÄÑojÁ¹Í-óv,+ï®sÛB*n3
+ùI$ºzû,/Cµ
n%Õéa Z²ðÄ 842ðÜó´:ìà¶q)6,D¢KeüÑÅ¢Kõö ¢Ç@%]V,-¢%GW Úë ]^Oqè_T«CLv÷¦0ö ÇÖ
+¢!Ðc\±X,C¯¡
%]ô
¢
&ÅaèR=xJRõ»cÄ¡KåAaèRi
txººáÌ%
Þ*«YônÚ*%âÆI¡É\ÝQ4o·]pklYx¡§b&30×âh .Ë0t©îÀÝÉÿBÀ8áz®¼vFmKºØ³¡íê Cû
+BJ|ªÁÔ¨îFJÚt)æOºXÌG¡K±KÂö
+71èRì ÉAèk ´¤îBKþ*D^#=¦&YªOÖ'v&B¸òá ´¨B:ÛB(BÃÌÚÍ®H×R/5®§¯#&.><ѯºØôjÐÝÖ'¢õÕ§¡±,×gý"%uÑs$3²ah,`ì-M"uÔqt.´gZphy2qÅÚ©ÌÛå²1´Q ÔèbÁ:(-IIT$úoÎÃáEV19"Ñ3%YáEa}`;ÉKµ¼õ
+$:Û¶#ѹ/#±E``¶¾l7ĦDKNuÜS2ð
+
h}ÖèÂÃzâÐ
~-C:¤}áжk0 º06Ä¢K´ÀÚØeáÐ
!-vÃ%SJòXEïL¡aägÑb144èÂ-¶Qø×Càñ8¸ãÜ
+.§cÛª O»«è@t1÷-¢ËÉè.Q£^ ¼´:-âÊÐÉ¢
è-@´<jÖ]Îiö®ÑÅîk.|k8tt[ô`å¼}¨+C:ÓÏt2q6²ÅéWò®Ê´TÉÍD¡e¢Ñp
+·4¹YDÿÂ\sBKÞìÜXQáå-¡15o-^1è<ü|GL¹¥GZÊ á:Û8¡óà aЪBÚlCW©Ôâ=éj@ÚÔAÐäÉPÀ ñVlñ,>ú?+=?°%OÐHó´Ì
+:.æGZf
Ó)´8]Ì´âR¯¢/Úl
+ ä
+À?i\X_^*Äü¬«>¯hÍî]²Gl
Û@ta§sÐÿzÊ_7+»ÒåAw
;6 ³C6úJ(Pa7ó.Q¶ö%ácÑrö¶7øK"ÐØV(ªÕêîô|©öΦô`nÂMQCtÙÏ°Ô' zË :,Pë¥
TN±bKö^©ò¤r¡v Z(v
ZhØÌ:5@»n t©~# 4¬húðDî¾TëH¹5+ -kOì4»^½þ¼á`Å)C¬ukßx/øó¥Rå;ÁRÇs_n"ÀÏ;MmâÏÙ^ÇZø³ë3âÏ(T?þ|©äηÄÝr þ»]
-jWÓÁÏÙÞå"üûºÕ´å{w<PXåÿÚm*²Û;]ÎâDÊÓxòDÞ)åMó?þ»<Í» ÿ<þk~!Ï~º¸)ö!PãýËÅSfê Ï/N°Ã©%}*/ä~ Gñ÷¥v,æEimÉ«<±· 6h¤ÿ´¤bÖåÛ
+ñ4«ÌuÛòXØ\/ݹ²@|eË¿ßþó+¯DJ|°È×sqFEí²NEùÎÛòæ#^hôGùRbÐ!Akü÷§ÏþbÒg=]ÞN|1j³ë#ãù9Åhb¶Ä20gWß 3G¹Ö±ÒO.Êj6Y /'R°ØóÈs³O y/×(WÅEë²öÏ:à»÷(¬ëXÕ£x':.×¾ðâûþ秣²Wî³´ëØÛ{ÿÉXý,ã&olJX±4wå6ûOíÍw=CÇ[¢¼îûW)Zcí*Po¼¡.ê;Öôuu.µ'ÐS]`Û(EijF
_9å¥ áüká:é>Ò
Sô.,P¡èQ» þä¡â
«Ç"½K,çfþñNIl/ß)Ó6îòrii5·(íüõ.µ>¶ÖÃ[Hz=Ü(ÉCi᩸±)|,BÆñÑ}eé >R nz¡]#å^/ ÷5ÇmèÛ=Fêt`%2yXwÏÀf=Anå±_V¢¼_Øó»åkhз§Wm1i¸ð5Q<oâ¢Ä|ÅÇÂÓ6Fðp²Í´ð:} ¼]>1ÀYÏ×+ôX§øh,¶Ýµ¸ò«é>´±ªsÍE[>iÛ»j\¦¯~úÏßßQ³£¾1%eÉ3(æõìªÚQà)jG c1ÀÙ2áw'èeÂûÊB¿ÉÇFåeÒañðjIPs
+M#E,"E"ÿ¥Ï2ÖZï+[öØ(Úx/{áUÏ\ú¨YÕâÜc[=%lóÂeõÃn!´½¬-Ä%r®´Ú´6DüqéIÈã;#M#4|]0ä )XªâÊEWãQ_'L-ÛasBÙ×òLkÝc.ÉÜWP 9¬ÈÂ'(N¦ñÐZEÂã&õöEU×*+ÉÞýw6é±Úh+}º0Zú
1}m*¡¤ó«*á¯_,§O9o5<óçÏ»Q§Ëþ~üüéÝØâù=²ö5{,;#ã!Zsn*KÄÁDÌ)&b "aEy¥.cÞ0²Sï%e)'1;ræ´EѶ{&[W~¬½òH
íÏÔ¹=õ!=è÷!kuÙ3>|LâcâébÕ®A±¦AIEm ¤×^Ö 8ÁÅkPÂA±2}P.Á ¼péÏ¢7Ä·A£ÀçA)ïÞEöXLmPàb'pP¬L«v
5m
O³|¬O§¯Aq
Ö 8
beú \8AyáÒGWè2'`h]5æ.ø}½¼ëàwÿÞDðê&Ó]®bæsÚÜ
ÏoȾµÙS/ÇÏm¢ÑÏÁÜ®Õu·ñ7~þTm¯.%W~»°À1VYf¶m¹¹¬"aNha,ß»4üê¯Þ¶ÃîêqÛ¶emÛÃy]ÛöEy)h߶¯Â¿gSß¿,OæÃÚÄ*'ïkå¶1lÖëWO»øUÔG$> '9ýÌí¨ÊYâ;6i¥M*Ä}»ï5EM!\kó·*ýc6ò=òÇE¥k0ÌMTHY¢N½´DeQ^
+z/\xý±n|@8údmÂ1ò6áç-pð«gáð¢¾
+Iý;É04èÑÚ#Åt÷dLRFzCÐ7¶}¤|éìø¼<Û²Æcí"½Y¾|FºÇ2-y¬]¤çð]ä¢h˽LvÌj=ö]ä+>2c¬ ß&@ï7Î\Ý5b[õ¡þðÿéÀ_Õ¹¤ùÇ[ß?¼íò×4¤âBþàÈQòç"V¨#V¯NÞ6gsJÈz Õ§E0ÀÉ)8-6ß5ÀéÊHÈ>"!¡|à$øGâKAO.Ovô2G]î¤9
+þÌ?üLÙjf at 8*ñ{´÷ýU¦ªÆµýñ·Ù¹¾®v:|9üq$±P[s(I£ê(·Ì û®p#»¯U/ú<6.^dÓà<×Jh
¶Õ<Ò7ÂÐÝy,V{ß² eEЦ[ìØ7Tí\9ô!¡â,äQmu{³÷LãiÚàÏËöÂY¯ç·Î{¾.7¿IXj§öbE+º`XÂ2gî %
/dÂâiE0aYX/ÒÅk]Âb-[ÂRôò¡KKÑKZàÒâ#PZ¬H? ./<ú¿ß(.S%ùS¿n,~DüM~ûºdô¿<µµx}Ár[«&/Ï~RF bAÇ2ÓYßZ[À÷¥«çòc£è[º^hWWÑêeú~³ð¸õt#ôÞIV Uy÷lÕc´ÝV»ua Ïæ|D"æÇa.p
÷°0_;áþµ<Ù'¿O ¾e«§ôXßÄÝBÆòK¬1J ßV.6òNð7Jõw
+GÞ
+y¯·ÚÐ{Ûª}àËPF ò¤£%=Áß)ÅÆQ´ù^(»÷Âh
>}H+S.
}U^|K~§|Ïз¡o/Cß.Cß®Cß^¾¿}¿}¿}úþ2ôý2ôý:ôýeèÛËзËзëзwþ7Mÿ}è¿>ÿüü)ëöbM°RÿLh>ÔôèW/"0^D`\D _E ¿µm@UO@Úp¥q\²DÀ)+ÔEàÂÀ>$M<â¿C|bä;Äþ´§Æ\=->ø%mÅ@Zn0úÈ/¼S|äEɵ÷z}ä½m>òS#â2ü4ÄÀ\#ïy£¬w6ßµ¿ò'ß/|ú®~Bì¿cò¿o{ÌÁrys^îlÑB§¹D½$ .FYáJêaõ.°¶-Ûµ¹8%òV¶KÄ"D8Å%bQ(V¨KÄ
'>}H"
+.~X"Ê~fb§!¿wð5iãÒK9|^ m[4è¶2,IS\EÎ5iðz4XÛ4²¸KÃ(ipKQ48
Ò`
º4\xixáÓ¤aIû·ç1JÉ/û´)8â#;4¸Äal«8³Àÿ±Q:³ZN½åâ`%FYâ`Y+ôXw¶m6ßÅÝ{áÉ88~«8$Üúº¡`PÒÿçuÅmàIÙç¢@×ÀÏ=Øém(¾¨zßÜöêV«éM(aSJðñcK°ÎmÐÙ®mÐÙt/]{áÇÓ ;~ë 7¹¨ü«:Nä<Äx Æoy©@Gÿyà?å¡¥ûÄ1ørûë né1I¥#X> /ïËåÈcQä¢-,R=á|øØI®«äªÁQU=)R5¤YÐì<*6Ò$ r|,V~_YØÂÇ¢°«Töó?" ï0írîø^jzE)äwðXGÎwIAÄ ¹Á(Jòv_RJÕ¯ eð
+ª19Pã¡bØ ¶÷¤$Ñ4dàÉÊÛ?$ÖQ¬,˺qé8ܯ¼ø[¢¬½iäÙ'¼|ÏAõÿeWÆtÊgÅß/·p'=ËSÔ@©>c9&Aî^Ã)¡r¶,ñ¦ºä²yÚK5ÂÁÓÐàEÕ4Ë24HÍ;«æpµÄ ÖØKÅ-á
¿üÛ^\Ä GW½mæ¼ò²B¯oÉ´(ÖìE±¢?VÿbÐjãú¬ÂÁá=óhV²:òÜ}aÓ+KO=]Ú¸HPÓÜg>µü,CäróÉ)Þ=/zñõo|ò6úg=\DiQä-rwäÒ}ðé
%O1^1\ùÃO1¼ði¬UbM_ëÞ*Úùdõ/>6úgñʧEq>-·(^ùtí>nÚ½°DøÔôõ Ou`EßøTÎÄU¼ ÷Ïón¼UNq>9Å»çE/>±þOÞFÿ¬éÒ÷(ONò9Å;ré>øôÂɧÃ
B»ði®>>¥P®|Z$kÕ¢XÓź·v>YýO«ë³qáÓ¢8iµh\øtí>¼Ë^Xò«Õ¶|âU§oYÏe»çü·m³õ½8·Í°l3£UämÚmÅ7Û¬ÈæÉ6+Ucº{¡U´
»§ÝF3ÛiF åeifUº±fz,¶ÛÊc·.86cm1ç·k$krÐÌa8vÿAï báïz£7HÒggëL¶[¡ævÖõDzÎdþ%ø¦Oz¹Ò²ni-ÂáÜJß³ÄÙ'"ël¥Á³Sä¤/;je¡¥õÁª9b-q5öÒáÍ:[<u6.Ä0÷õÏ xqqgYÞ,5iQ¬Ùb=[E;¼~gÐjãú¬]X´(ΣEZ-j.]»¯ÖÙ%u¶ñɬ£Å'P[ñ4³v>9É[åçS¼{^ôâÕ¿øämôÏhf½GY|r·È)ÞK÷wëìOf,¢[GÎ'3¡Vaffm|Z$kÕ¢XÓź·v>yýΧÕFÿ,^ù´(ΧEòÅ+®Ýß³g>ÑÙødÖÑâM¨xY;äróÉ)Þ=/zñÉê_|ò6úg4³Þ£,>9É[äïÈ¥û»uöÄ'3EÑ#çP«03³6>-µjQ¬ébÝ[E;¼~çÓjãúl\ø´(ΧEZ->]»¿[gO|ú¸uìù-ÖÙ´®N þgÝÛUùE·ÛAÿ{<¦ÆrÑÐFQ죹Í$ÄÏÃÝf°ÜfRÎå6cúL°P9Õ ÛC2W·£,·£z,ÂÛÌxq·quï¸Íßä3±¹Í¤o¹Í
¾°´§Â"?±´ÍÁì×+Y`âYô¼vÎS×i'þQÝ_'q]ÀRþØ/·Âtò}PÒ(EÞ<lz6¢Q§Ð¯l8¥xQó±Q¢°Y¡=#íáõp¿yÛHyLJÁóFÉ5!t®z,Ö{_YضǢ°ù^(»÷§W>}å
+Ò74®z',¢C#·F"\
¹k¶c:îAÜ=@b¿¿(YC¨Ù;XúxûaÕ2£t\ Jk8]-ðXóîY¬]¢M·2k/ü°ayæÎòÃ(viÉF¯ËÚGGçWϧ¬Gc26ê=]9jAÏIc¥ªq+ô r3
+}ýØ([çûon<vRÅ=U²¨YíJc%k¢RäX)Øy"(4lóR¢Uß·Llàc'i/VÁìç+p>õÊ4®bs(º>îÊt5̹,Gjò ÖÔ8¾\¼ÛeÛütG÷½
\r;²î)m%çmKd×?ÿ¥¤k¦ÄLòßýzWóõþ3øóö÷/hªÓIÍ©B(Ý
ÓÐAøÌõůËÏÁÒh´òï¯7¿§´×¯2sQ¯ì
.C?òßö«ÿê9µVCCì¶5u4ÂXiAD¶¬/³w÷Rýºù¬~·]"9R¸ð½ï3;2µÉrÇUã[roå+dæ)¬v
öâNúo<iGü©f©ÄÍbpëó_¦9Ó(85ûQDÅüV§
G!á)ûÊä±ay9h
+ÂS^+ s¹cÃHEFÈ}©Þýg6é±Úh+}º°hãk>bJ¸:DðùÄ'á_w}ã&ʧ8ôõ±QÖe.qZ^Ö¹XÄÖ²®Ð=æ%cÜó¾eêxæ±S¬Un/xôðXu"åXI¾±a¤Ièp±Úï[6ñ±´«`íèw°¾pì÷ÛßbiZeöAiéB÷g£Ì´FÅÇÈ)kT}bcdåV#V]×Yóê"ñ'mªú6YÁÇFñ!2JYCä$"+8Û=óFèʯß1Dß5.õ:.õe\êe\Ú˸´×qé/ãÒ¯ãÒ¯ãÒ_Ç¥¿K¿Kþ2.íu\Úu\êu\ê;ãòL¯Åhú¶DrwÎçZ&OÒ÷î¹
+äþ%ç¹yEØ®J9¡t2rÊ\ØϬ
"a×ÄÉß
+í£àõp¿yÛHyLJÄûFIíDìp+ôp뽯,lÛcQØ|/Ý{á bþ¼ðéÏ8Îmµ¤Ö0¯Ñ[I¢%uÌÑpQ;qê>ÀB[+x_í°zp¿iË,ý¸Á£oeµùf2yXw£¬q0ÛÍò¬[ÏmqåÍGLeÒj(-
%yý»î]ãÉß}^]õ¡ìZ5ü¿ ßVò .aô¢ì©µéA0¥Õhq0ç+ÌV+g«5bJË0G¹áá#Tµ#Y SÕx75ê±Úlg½º0BGùÊ
s³sC;y6ªÁó÷% O@] ò^$6¾í¡þ÷Þù4íBÓµ¬æø¼ªÊë¶Û¢Ê÷Ñ}1búØTËâ+ª¸ Z¶0jǶZ«Öj:·Lý®HµÉô±R˱VR§°íV&»ÆJ}½²çO²n¬qâqÞ5$lã@3uDÝ
-B~ÃÊe¹KX:;)cëg¥NBdv°b'¬ÁpÒ
'k½àc£híÛh·a|@ØǾ<
óêO ³ÏMo#¢çÑ}Õx*î3kØاFMpèY³Ìvö55Þ¦)ÛÔ°o«V¦O
VȦ
µÞ
+eç|nhúi A6ìÝ9»q´ö)8\1ä3:é!$yi>
¼eO§np8÷--Ç(òèÎVnÈÞu¬ÊIb¬$I9s¿+ÇoFú$Xç`ÉÇNée#±'öÄË>Vg/<Âð¼2îOÚÈѹ´Ë|<v Ew çX+^Õ2ñEë,BCÚݳ4ÏBôJmrk¹ ×ӤѦAìVyF ;%ÉõÕ¼Ìc´Ú»g±¦=6¶Þ
+µÞ]9ûÿʤµÅ©q%Ü´JÒ¯Ggÿúëÿóìÿã7ÏþøÉ/½ixo:söÏÕÝ2o³\Ï2LcÙ§·Âw)¡06Sª
^ij"«Æá=¬ÎêYÕ#õJóæÔõ)Zx¬´Åéu
+õØ(Úr+{á
Íûgþ|lâãqµ(
+ Ò#ïR~ÏÓ=é§(¯+ÂM|DSmç7/^·?-¼ªháÑ,Ä/7/W\u#O§b7éûÏãÿÿàx
+endstream
+endobj
+4 0 obj
+ 22398
+endobj
+2 0 obj
+<<
+ /ExtGState <<
+ /a0 << /CA 1 /ca 1 >>
+ >>
+ /Font <<
+ /f-0-0 5 0 R
+ /f-1-0 6 0 R
+ /f-2-0 7 0 R
+ >>
+>>
+endobj
+8 0 obj
+<< /Type /Page
+ /Parent 1 0 R
+ /MediaBox [ 0 0 595.275586 841.889746 ]
+ /Contents 3 0 R
+ /Group <<
+ /Type /Group
+ /S /Transparency
+ /CS /DeviceRGB
+ >>
+ /Resources 2 0 R
+>>
+endobj
+10 0 obj
+<< /Length 11 0 R
+ /Filter /FlateDecode
+>>
+stream
+x+ä
+ä ×
+endstream
+endobj
+11 0 obj
+ 13
+endobj
+9 0 obj
+<<
+>>
+endobj
+12 0 obj
+<< /Type /Page
+ /Parent 1 0 R
+ /MediaBox [ 0 0 595.275586 841.889746 ]
+ /Contents 10 0 R
+ /Group <<
+ /Type /Group
+ /S /Transparency
+ /CS /DeviceRGB
+ >>
+ /Resources 9 0 R
+>>
+endobj
+13 0 obj
+<< /Length 14 0 R
+ /Filter /FlateDecode
+ /Length1 7884
+>>
+stream
+xY XSçþþs² ûaH@""e È( ,EAEàEK¥nmåVE[»L§½Úö6Ô¶ÖÑj®Õéííí}:]çÎÌÓ}:s{;UÂ|ÿ9IL°}f ÆärN¾÷[Þ÷ý Ukwófråú(@Ï>ØÚ·-6&ûÆãí®ïÀ÷' "û;Û׿ҬhÎÀsYx"Ô!ÇãxÐÙ½ïAùxü ?½qSkóHåCÄÐÏ×t7÷oÕäm<ÞDZ{Û6/ÛÇ'ñ8°«âZN
+¦X±a%Ri¹çÒ§ïM§¶àÓF±¹ß×þ|Ê&úþïF` [÷â`34$-×ÉáeNë5cÌiµ*X©bCTÜt®!*P¹s Æ(ãªPèÇ´ª«WµÆ`,{ÐwhUð¡-"S+NÓpÙZSK§¤ÞAõ1f¾5ΤΰͦxT¢WÔ6u-3èÙÚ)£¶ÌT©Ojh|¬k5y½?Ýh¶3¶¹óĵÓ?X:ÏQ,37 µè1аS&MËPÈ%bÓ6$N ¦
+U©X1ÆgÄjM6á]rÙ-d<6gÂsédhTÂÊTܧÂ.RmhUbV$¡ )Fo¶íjS¦
±Øô&µÎÀ1ê®Á¬æèÑ©³g«»¬ëÞ&ó.ûêE÷µ*z³z7Ç~Äö¡ÏI¼ÅpéuX O¼N¥NuÙ¡:
¯Tz)G^×®!3è· ÙX £@]ÅiL¸\¨VeÇ>ý:)ÖÃoQkã±.:Î`K·geb¥ê£[ÚÏîÙ¿²êª²}ý×7/ZV²n{cÕbQ1¼¯¨Õ:¼çþnktãô[¢GªKÛ¶8V4o«ÈÃhì3ÿž½÷XÝþXããAçÁñëXùbýV"c¼XeNã¨uBsfµ
}9:¹ ÁîÝçûC_¹cUÙÚe-×ÞtyÀÞûª Én¬YÜÜW_Us±==xÇ°¶F0CÅs¬1"\§Ô´´Tú §f "ÜslB¸·ä®P"ñ0q¡Ñ$ OÝøÂILqÁ.ûÑîh¨[ýüðáåå'ÏíÎtdGç»"íXbßµtéN#¬Í[dØwi³°ûÞ¬=ÙKæ+W·ü½tUM
£q|u3 >§ÁW7$¼=ª X·ÈHâíQRX7r[ÝL@ÝTHd#§â8Q@zèÁ¯CqÚ2g7éTÿ¾GËRÒÊ{×vß¹;JNÎõç¯ZÜ°©²xY1ÒÇí¹õëÚ7wÙSÖ?¹}lù¢¦9KJ:6U8x¼k0ÚU¢Ïo5Ðîd/ªñá
E¼ ²P>Ì«^,ïò â%H( ¾»¬ÅKEJï¥<ÚXÏüâùÖ$©©¶¬%Ñ^ÀvætsB¹Í`ñö×ËØ_´.½³ëâö¯ÉÄSH¿ºÌîjBD·&"Sù×$Îéwh}ÈmÃt{QÜ%´%m´46väÖ5µßªYÅØ\^¸¬¸i°2xÝêBݪD¬á°BÐp\TÕlÍòé2ux(¯GÀ«Î©óî×ÅñxÆÕV$'Wèâ¦e¯ù}OZyvvlrRlÆ»|÷øzGÉ°½¿U3gæ3ñ¤x$C3
+Ø'IáêÂeHüî8O×øj INø LpàCÎÎÖ¹ôä)C¢<(J®`¸tlb-fõZHÍqXO1²ìq!͵ËOuuíöî7<~ãæT× ÷Í?Ü¿¨jäкasÏg¾\T]ùNõpãòujlruÑÕ+¶þëHñùÖ7=ÿÖc3_zÅm 6A2}PÆå2
êÜqTú»] 8rÚ
+¹§©{ÐÉüÜ+Ä'o~òP![º#jQoÂÜê9îà+QóJScÉ÷âÚ
)YÕìó7£D¯[òççÞlao1ïù7Ñ:ä²Hì`¥Ì.Ôz%í£È©÷¡!íÄ,@#UFê2´µtréÖâËÎ ÁW#++S-ZÇe<04z|÷ƶç%/ÜaÑ¡¼¼¸³ä©æúÆÊw³7Oí.Ë).²Ï[Î.0Dâwþ÷VóÊ« ^¦åçõÎ÷|«ØH$£þÚBZC+ÞKý*a*d¾|`Ø"/Ý·Lô[$âÛ9N¸D&øÁW&h¤´u8khh"âX»}`Íd´±_tÏ9GN«d»pÎÛ
çÝ_ny¨à@o«gîýê£cn}_IøúPåÕÅO~R¥ßä³]îzaö3ï&nMàìK±.cìAÐR RÈ1b·@Þ±B.ÌxBÄz5}à¨dâ@$²XÖ¤emÝÆ2úÈýüôÓ'÷~ù=Ñ»¿&ȳ?þè®â*ùyÝ®kµS§Åt&ÒÄQÁÈNVÂÅÆ[´ô[q|¾Õe"jBÕL¨)(}R®ñª4f1óaöj²³¡«7¿tndÏye[jvíy¬{(kÍìáö»û
+ç§X´A±±É6Ôäg¼SQoN0ç,lªY4GÐrí%Ê,yûCé'ϺðvýQÊöHC }>&=r$±Mµ¬~4$~ÓRy¹©¹$i¤¹ÓÍ\g~æk=AK
+~EÂÃYE<MÂ' Øp¨¶ÙÂÚ´Zæçï¸ìù©«O³]ÓÊò;lX2ý2SÂת{æ:éi
i.èkñÈnù»Ï3þ!ßd±Û,)æéó,K¢Éi¡~aæ;Ô¢¯ hèÇS ='¥Ï}FD(eÔ/à·i"
Np »A04´ap)
~yÉ7pFb¸±àÀio¤ã¼igÅOòâÓRF´W·ÚÑúÓfê}n.èÏl'mdß ;©JHÌ Fï ÑÞgßåT«UÁ]{]¥¢Ä!ªä³ÂxTN
<©cPc:D!e¤¾qE N¡óAÄE!uí}5ÿÊ¿ìñ¢#S[îÈÚÖ;¥Yõû¡êî0'VL
/G§ÿÖ¯I»¯¦&Ïz`«oíp 1©!ìÎQZ¿ QÊ¿1u)ðÄÁ)4L¤ÿO/7˳ûön]ßsqÏ®¶?½¥º º¬ý®ª¥lßÞá×û»:ï°Ý7<þÁýÍW.nî.+nX\¿µÜ!ð=³
ÖhU(O^®`tg
JÏæLâB¼LHSoös6}<
fàÒmÌÑy²v--ÜÒ{.rù¼ÒÔ¼É--© h}vµïzq×ÝÁÌë!¬Å
=%ñatàè¾F
êXNN3$ØW{¥*Ø[ë3tÅH¬Ô]%â
a¨ñ6µg#XéecúÎÇÆg(û[dÍüJÌn#,õñ5?¿©/øݺß"ÆÊsìÜõß¹ÛÝVkëe_ÅÚZ0CÎè(o¬A
+U7VÆéÊÈRx¼û\¥oE ¸I
àqZTh ,G°Á V.8ãÄ\·E&álΣ~þv^è\¿Õòl[Ïe± ÇÞmêyàwUÎsb÷ØpÏfÓ¼ìÕu-Ã_ [ÊÖwU4TU§µf¥.®[¹¡pu}Ë=ËËþô¤»oã^ǹ)ì§KÛî®È,_¼~û²;°·¬3×Ew²÷ ¥§9ö
¹Mò¸|QIYÅÔC0>¶°¬)JVtçnµ=ºf]xCJºúã×ö7
·6s;5ùÇÈ+nË@z.«~üypÐÉw/äñ>,ÿWVÿ§5¡°ú#ySSx/z_ ]d=ÚæÜW1KÞ<ç 碫Ì8²Þ}¬']£@ïßsÙí±ø½hÞ¿5Æ;~L¯Q%¾ý1§Rº ¤Y«fïù¾zR¯cVäÛóÃ:(¡P¼:¨Æãq2mü¦EMO)S/¤~êàÁ¨Ìûwê:ÌØÅíÍæe^*ª¹H¹×D¶'ÛEãQ*eZjÚ´ÙQ^mäÕ ¿Rå'½¸t¥Û@ø¹0W1Y3gk¿fÿ2
)f»ýºÒ8qíǾk¿0HA§Å§é¾â¥¼{ÇUϽb§#Xóè ¼n1êÆýW_¨ÑòQs¢z-^<k¾¬¹éû?Ù¼7I×кõXßÚfÌíز=?snWT"ù;),x±jÍ%cîC£ùYkÊ®õcË×Xê}Èݺµ²ÒKLùýöâaÝF"6´ø-ù«ßýu@÷cÀ¯3PÀEÊZ% `¾=IOmmöV¹üÄÀ¡®ýé²æ§W{*ë¶U5³
ûßÿ§{¼g95ݹ´¼}{UnméÚþê<
å3ÿ"îAI*Ø<QDÁÓ~a~ÞtUu
+§ßQ-^0G,küYÆùyi¹è*HEaAú|«$Ï»1æR"C¢aQ·Iô¬=-^9
+P°³Vo2éâîPä0zDâ]áÛÒÙóÏ=×PÕÙá<6öæ©çVWw¶~Øé~©&5µ¾nthää¡ßVÖÝnÔmmYP߶¼ðñj¶1%~Ñ¢»ÔjqÏÎcϽ
w©îìp;9uêdcÕzgÍ-;Æ®.j¨?¾ûÐóG~»4ÿæÄA¢ÍpÞy°cEáA" ùMå`
UØÀÿ¶ü/Jÿ_¼¸åÃ=¼Ûï0gB*ȳS+Æ0Ü'1ô·T+Òæ[õ¼ÑÀĪx«¡7äÝú|éÄÃû
+ÓÿåÙÊGM'O4t¬{¡êê½÷L;ÐýøÀåQµä}í¼='î¾óÉÌ0>ëL-FSþé~%N¢ÌÚß¡t¾UlÂ8ÌÝ&2jÖ@¦lX]üÂèîÄÞæSíç¶Ç¡oÈkÇÇÝ_¸ßwÿ³ûëF~]ìf× ×2ÃÃΨÈ}hU$&v\¯£-.s¢»
Gb+£#}ð0GGÍVN§2z a Hðüò/&R¸üã1+tr<Ç©8ñ¬uïfÚ<]ëqm5üìê¾Ã=¿yåÒÛ;lQ«VÝT64oÅÒ:tùU-5w?®PYVÖ¦6mN=Úúù£ÛÜlwô´¿bêgjóÿs~@3D×÷F¯c¤¦,»FbÍõþ)·H íµíî×ã^9'á$
¤}£Àè,}Õd|dbñU?xæ?ffðQçà/d¾?èõ"ãY)²»èN¸ú
+A%S!
hñÞz0 ûA8D@$D¡ÁEß&HÀU»b¸«n6Âø3|?ï6x®ÀKpð6ôÁZè
à <aîÇà4Ã!"É&ØEÖ¥àð(Ý
p
Æ`ÙIj`FÞMꡬÂù}Ú`Þ
gá(Øn¯ Áü 5OBJ¾»·¬®)4÷oÀÊxècï6mò¼îÂÙE©ÿë*¯þo<eÀß)»èÉÝG2~ÔÆ^mÌÂ"5ÔãÓÎ~
+vúLÀþøtÑ[¿±>½Ì4D²)pÿÝ· e¾R&ºXèÈgo|æÈÇ?¹÷¨m"-Þ÷X¶õXô`égÙ¿A>$É°á=Ç Y Vö=¼÷J [+fÌõwh´>f
+³¬ÝÍ~À~ ªýN,§ûÄïKb%{%ç%?J¤JUÊ˾ï¿#ÿI£R¼´8èEeò^å;ÁLðÞàs|&¡û¥;Á§ð%j<"A,r&/ V8KÊöÖCqg©ïþæ : Æ
+endstream
+endobj
+14 0 obj
+ 4938
+endobj
+15 0 obj
+<< /Length 16 0 R
+ /Filter /FlateDecode
+>>
+stream
+x]Ïj0ï>EÛâ®vA²½xèjû 1·B7Jtûöù
[¨ ðg¾8IOísëÆU¤ï~2bõ´LWoHôt]"°£YâÓ\ô¤!¹»-+]Z7LI]ô#,.«¿ÝzzHé·äGw»¯SWÝuèBnYÒ4ÂÒ>÷¢çW}!Æä}kÃú¸Þö!í/âó6P%Z2¥eÖ¼vgJê,\¨p5 9ûo½ÈÖæ[û.CxM$©*@9(äµè *A
+T GAÒWè#È8ÒF:p=BÞ i"É]#R¯d¿Ä~èZ¯*AðS¨.ÙOØÏؽHöã
+ð+{üJøIøULð+Ùý¸üJt¦à£¿;¨às$ü4þ_Á¿}*ø)ì_ÅðSÇ8P<9Ûhmçà>·æê}ÙxXâ¬nS::º§y·¬xÿÛ6Ý£
+endstream
+endobj
+16 0 obj
+ 394
+endobj
+17 0 obj
+<< /Type /FontDescriptor
+ /FontName /HoratioDMed
+ /Flags 4
+ /FontBBox [ -136 -250 1094 898 ]
+ /ItalicAngle 0
+ /Ascent 946
+ /Descent -253
+ /CapHeight 898
+ /StemV 80
+ /StemH 80
+ /FontFile2 13 0 R
+>>
+endobj
+18 0 obj
+<< /Type /Font
+ /Subtype /CIDFontType2
+ /BaseFont /HoratioDMed
+ /CIDSystemInfo
+ << /Registry (Adobe)
+ /Ordering (Identity)
+ /Supplement 0
+ >>
+ /FontDescriptor 17 0 R
+ /W [0 [ 250 468 282 508 508 483 508 212 508 464 250 740 629 612 373 395 464 365 363 261 382 237 211 624 496 343 416 509 574 211 173 264 237 494 494 770 253 457 291 477 291 ]]
+>>
+endobj
+5 0 obj
+<< /Type /Font
+ /Subtype /Type0
+ /BaseFont /HoratioDMed
+ /Encoding /Identity-H
+ /DescendantFonts [ 18 0 R]
+ /ToUnicode 15 0 R
+>>
+endobj
+19 0 obj
+<< /Length 20 0 R
+ /Filter /FlateDecode
+ /Length1 2432
+>>
+stream
+xuVLU÷?ç{_÷_õ>®å½WPFµòú0dAFØy@TôuºVC;ÖÐFÆjZÒ,4Ä6¸+aY²
TÄÆdf³kØFüXÓEø²s_q]»ôûÞ÷~ï9÷ûÎù|Ïùó. èðsÀhéÆÀ÷ é9ÒV·¼|Ìpndü+ ôîíï`îËQ Ù"ù¯ûØ·öÏÙ´w@l{1Ú{¾n @=Eºâ6RdýÐyäq×·u;þ*õ(Éÿ¶åCGZÈVꦼ¡#z<&.©$lÄ~òbìï_$¹äB`,VB«@v(³É ¥ ÂÄÓÒiAfZàßþBÛçΣÉ@
ð7t¸aíÕûoÝ+SÚVµ¼`BI(èÁtÓ©£ÊÐ0e
É WGÍ¥%c
+Æ épNÖsÈ:/+ó>nYMÁíBðmJKMKö¡|"»]i©>£¤XÛÊ·»ÍÓù4Å<ÜÍZÃ{U¼Ìwñ.~ÏON^ÅdÔ'ǽ]SMÁßáü>¶×Õý
GàøËÉiþO>7}íÚ$áG\Gyi"üIB²SOÐ5
Ð1EGÝ.BZVV_B®È)_Ç·Ij:÷ãÝ]Ï7òíxþ$®=¥òíÏÔíé[ìUÃwÐ$ûv|Tìû ÊqKY£¹1Åtè¢êÃ5¦¨¹(F¤÷ÎPABÓß_ßã)7/×|M%Å%ªÕ·¸Èo/ÁÇøM,ÀJæÀmßú¿ÒÜyfß 8ÖÉSÍ8õioÖc^Á?b_è뺷0°kÏäU>Ãg'¯ÕÔ¼c¡è£ËüR¶2¢Ã¡k¨Qê@r`LMPe§FÙjò\`fC<(îââ"Üê /.ÌòY
+Íå?¸
µøwq SQæwø£&}t©ûì:.òNÛ7C'Ñéà¬
yEîÒ@þcIn¯ÞÇ*D/%;/wËæâ"â@~VQ~d_UÕÃûwVeØ>µ»«vî¬:xàlUÕçÕ°Æ)ñùH¦\¬w eSÕu:aí;ÑEþ$|)A[+aJR<ía}^nÚÇËÒ&Þæ½½C#Ã?a¨9|`ôÝßàV¡Í]˵|÷Ò5¼=^'CT'mÄtbBahª0´59^Ô¼êR®êO}ªÒpáWd $>oZj,}´¢Í
+b¤¢µ=Ü|ubÛîãkàßù/Þ¤¬¿º|·êÜÐÌÇ綯Ïbå{'{ÿ|/_GóÞÏ:»ºçm>w(tTÛ¡'Ù"Dªg]Q¤®Á×L .}FØòBqtÛGDáó£üªÐ¼y7oíÃ+ ^Ãï/.¢ÅéGMòoß!ÎêLöðÆ×Í A«HÒÜUWVè
+++.XÝ!CV|ÕlÇ/DZ
ZLÓ xªóV¦åaµSÕJ¥<+U©@l¦÷
z¡Hð³y6ÇÆXeà¿ðü§ð"5w°OàO±_ öS~jC&¦¡¨ÄÃ4A4B8étÒÄ©ÄþÄj½NêùEuRP{Õ£j³ºK-U]ªªòòå#å=¥_yM)QtyN®KÕÒs)O \ÞNMBµP@ÙÖÈ\Òø!û^gïÇ÷Ý[ø:á{ðUR^KcÁQê07aC©)ÞdÛäLtP³SY¡ÿ°ÑÓÜc÷Õ#ù ÚãøëÓJâ˶øbéù
F\ßR~úZ,?øêÍáK(ä
+£-Új 9´1£Fë¥P¨§¶ÞGãø²ªëí1Ǩh³ò¨»ë}ù^Cf´µáGõfù0³À'ßþï¶mýÎRN¸lþÿ~\ö0®r{ÒJ :6q(bØ {Ê-!moÚÑÊ
K0Ã#ȤÈË3ÒcÒK4ÃéV}V²^Þn
¢F·õl&ÝÛ·VE¦UÙÐ`IfL n·¶ùéÁQÞ¶#ø=¸AZ·öjÐ6-+(`¡Úz+ÔÔ`ûèQÄ!¸!x*Ê,o~0^
4¯ôwìMÚö%.øöàÃKĦxÕ°Õú¡k¼t ¹óÏÀªþë¡9h³¾º¥Z\§y [û-®]è4ê²åÕ½ôÞ¨Ói¥ùúû1*á
ö;NܺG¨2Ë©R8½±#¬Á®ñPnâFÁ/ä±\f²ìdC1bÎÄÌ;ÌJíRKÞ^9{:±Þ¶½¹ÆïÿA)?'
+endstream
+endobj
+20 0 obj
+ 1898
+endobj
+21 0 obj
+<< /Length 22 0 R
+ /Filter /FlateDecode
+>>
+stream
+x]Ïnà Æï<
Ý¡"I6¢HS{Éa´l@ÀÉ@òö#¸ê¤YéÇçlÃ/íµ5: ÿðVv`ÐFyíâ%B£6,/@iîv9 Çx4wëpjÍ`Y]ÿâü
+»e{|b Àß½B¯Í»ïKGGÝâÜ
'42Ö4 p×½
+÷&&ÌûVE]um_«C(çT´
+g'$zaFdu£zÑ04ê^«äð);ÙYvÊDE¢sAt í@t$ªJ¢g¢ùDgÒJ¢´2Õsy«lã£m¹x;N³NnMjïpÖm®´~P3
+endstream
+endobj
+22 0 obj
+ 263
+endobj
+23 0 obj
+<< /Type /FontDescriptor
+ /FontName /Emblem
+ /Flags 4
+ /FontBBox [ -83 -210 1162 835 ]
+ /ItalicAngle 0
+ /Ascent 688
+ /Descent -215
+ /CapHeight 835
+ /StemV 80
+ /StemH 80
+ /FontFile2 19 0 R
+>>
+endobj
+24 0 obj
+<< /Type /Font
+ /Subtype /CIDFontType2
+ /BaseFont /Emblem
+ /CIDSystemInfo
+ << /Registry (Adobe)
+ /Ordering (Identity)
+ /Supplement 0
+ >>
+ /FontDescriptor 23 0 R
+ /W [0 [ 750 646 333 566 606 253 312 627 606 ]]
+>>
+endobj
+6 0 obj
+<< /Type /Font
+ /Subtype /Type0
+ /BaseFont /Emblem
+ /Encoding /Identity-H
+ /DescendantFonts [ 24 0 R]
+ /ToUnicode 21 0 R
+>>
+endobj
+25 0 obj
+<< /Length 26 0 R
+ /Filter /FlateDecode
+ /Length1 7972
+>>
+stream
+xÍYy|U¶¾·NÝ®ê½zOwÒIw¶ÎÒYìB `É& 2h!t!²$ÆÄ
EI(ÎàBÀ-Bp".ãÌ"Ou¾7?Iåê¨ó{óþ}¯/ª{ëVݳ}ç|· ¢#oѲ+Èûo Äñ®Z´z¯¥à©K8o n_¼bɲ¯ÿÞEëS¼¿yIÕºÅÿ±¯Æg·/ÛIH\
¯ÀÓKâ&ìïÇ~jŲUkï|XûöÿýªªêE3âýˬ]Á¯'`_ï[ñëÛWܱNó=öqMváÈb¥_Ìö£´ñÈþu¢y¬ãI^×Ùkt¶çlO¾Íâ·¤ù-þÅ<é_ ñý_(méòýZI(Y9ø9áÇLr^¾.%Kõ1è8¯oÞ ¦7øü¼>Nö²óqÇ^Oµ)PåÓü^Ñãð1ÇÄT.ÇL&dIºzÎv÷H½R¯ÅZ?¡»¿ç|ßkqçOU*H¦x)DÿÎM>â˦´L.
$| 92O7O?Ï0Ï8/io^riʤ
¾
þ
ÉRÚÚ|mþ¶ä¶I|ü¤xåììCöCCÎC®CqÜ'í''']'ãNºMe¤¬¨° KÏ£¹´pØðÓåHÉ¥)ÉÝD©Ã®IIN_á¸óù¯¿¿îýWf]á7ݱjͼ[w¬ÿêÍ%]£.¯Y]6wâkr÷-Þz õõU3g»)+'¯¹zÇ3Atúe
+þ)g=qɲ´ÖZûnÉPk" 1
9hÉwJºCýݪòzBý=gßÊ?ÒâBSЩíÙ¥¯ç`'úÇMa)1×;&§Àá/,°¤ú_;nl^Þ¸ÿ|vàövZÁjrÇÏÍ;öÇHfVâ;F¡¬¸H
ìuédl±ó"©Õp»íåqd¡A- É.ôºÏ¾ó^wIJ¥¸8
2ªBÅ_Gâ;£BÉ&0Ñ!8Ät!]Ìs7¸[Ü{ܺ2[
+W`ñ;ü»M_T`Bc§~¼oßËtr`ØÄIc¹ÍâÖ=÷ÁñJ:Ey±r lã
7ÏoÝÐü;Õ?çç`\ÚI<.'r¢£³C\yÄÚd(Oµ§sVt©'¡þV,Úz$¥[êµçËVWö6xáò}{ÇñN<+Cû?#!"DAàçôµï±u$m^<uAù:ÿöwÊÕ´njØ*qD<÷aCý¡vZ ôÓaʹÃG_9ñ²êsJPÞù q;ädEc0Ú¹õÚ8cìÖó$èBéHSP
+ò<(q÷%´p7z?jh©7dQ£ZZ¯ZÚµ´x,ý|C|{<w5:<Ñèð¨Ó¢·©ß¢ÆDÌÊj`ÄìÜ{´ôYeWÁ¾ÊÃO óç×6nØËúÇEGªÏã+zõÁãÏÑÏ£z`ì»h÷8ò,jms
0gQ[kÙ×\V1`òÝÄjÀôH]¨HooH9}ÁÚRlAóD%NäKËóÈD¦2'ÌËl¼CvÊ.9ÎKsêdõq²PàêéÆ6¤§e¶«pAp;áÝ>uSë{o@?X³ÏT¾¿qúñvÅP½ôêJS4¶bþsÔ1Éb¹ HÌÔ&%ø Ôz3·ÛÄÇC²ÝÝd+çõîÎÑæA_9@
+Ó=B3+GUc.q1×ÓQ'õþõËhÞscæS£OKr¥ÜÜö\Õ±DqÊD£©ê(®pUÍD¨ËEªÏøþK;KËê÷íþd]×_«{r8PvnkÚÒÚº¥iï¿åÒÓ?©(©«%<õõÑáóÃ*¦o|úñG;ÓI®à(ºêýÙ²´4-*|âÀã¯Eð æQr¤Þüç}îj7GËÒ¢é2&ë
+HvÂUlß±cûö;·}|IÝ.P·òÕÄoº»/\èîþf"C¡!墼]2ïÀõ
$
Ü,)±xÁÈo÷ 0k}ºíö&O¹ïóîÔ¤ <hSÐ+1?UZ8Å£û'#l\ÿ|CZ{JJ¬6p%¬;§<&tÿ¶¦æÖÖæ¦méRÕ¤/w¡I¸p´´óÌß>úøÓ7^¨<¯¼ÑקVâ+ÕÜ©ÚÏò{H¡ì!»ZÀ¸Ãð¥EÛåñ¦Ø=¬xõì[gÌدf ü#Õ j6娶\-9jú὿¶«Vô|}ûn¯t4ßûÐÎmk¶xèµ !É ½&/_ù®©ñ«/¿üúÎú+øä{Q/Y!ç
+F»êZ¯Z¶;ÞjZ«ke´-!¨1mãH>èÑHËOaÔZ4¯¤·×êj¬Ì/æ%5$µ'ÁOÐKB/[z?ÛüÅb;³UÔ<QÕ~`¿Âï)_YF-?¯T-ãýÓG~ßzì9Db,_Âੱ-e«¦V¬áI-G$ @åëbÅq¨4baÔÿ¬0ê¢ré°ÅäJ» è~Õ¡èáH$ÂäºÎ>å×ëIlDScÒ8t©¿+ëKͺéE²94êÉÅ5ÿãòåìÚ°arj=OÑ0=¿laDiPPö+
C:ü¾Iz[#7j1Hgû»¦¶Ûn*}^µ/)JJæ^CÚrHì£ b÷ò~VÔOÝP\4}zQñ
#¦OQ4}ºF+Ê_?^65&½E ¼I:Ûê¹"¾p¸Õ"qB§zjݵqã®K/+§FèÝôV4ÝÝ
˲[yT Deãúöɤyl÷Iú!â'~"~
$Ì
°g¹uéOÄÏìàÌDÌt©ÞLbæþgâwIEB¯ò¯ÄOºÂü¤(óÓû²ó³gd¯ÈnÌfª³ÑL³oÚn}z;+Z³HÖƱ*C©Ï4d32}þÌäÚbÝHýHÃHc±©8qdÒHßHqòɺÉú)ÉÆII}ýçêæêçæçúæúç&G´Uº*}¡ÒXTå«òW%/M©ÓÕéëuÆu¦º¤:_¿.y]JÑÞìölNe×/Ydê/!c¼?9ýÄJvìäc5/¾öþ!jºTq¹©Ærø
Ç~sçß|FùF¹X78ΦhÞXµªhÔu¯þîÄ_r²Wk¾»®²¶¤hô+{ÎÆØ`â½y
tÈÅ:-'î1Â`ÂÓQ@ÛðÓ¡LAdj
+ÝÄdÔ§DkÖsféì[hrR
;ØEWHıCí¡SDêIÁ)0KX$¬Qµñ|<shº4Åg±,m.Ë4äKÈõÆëM¿"¥¦%¤Â´_ÍÖhÖkµkuk h8?U³F6v¢´OY·^8H³iöÚ²FY°r û°²²<¦
AÜc±Ù{X=¬äù&A
ãÂÓhÕÂIa
3G$Â ¢@%Q0á¡7pFI
iÆTM$|µf¡,ÙdÔ£1GѦÛUkt£5ÎöXnvQý7dá'±h«j§Ùd6ó,CaÌ0-ÙV
ªJýZÕÀºKUz&ÝËÙË9¶
|v ~ ©~?çåNÿè°Ê¾":Iéù¹êï
+ò\ºÃuâ8Ùc6ô:N»Çd6{»âH9Ê40ãè4ÑË=s:pfÔj«Õó»z9IÁLN4pËf /&³=bÒ4µ´F£Bê}?ÊÛ,ÖW,ª¶Lª-湤¹t)]KyÁì2Y¦ÃB0ÌéR)ÅÝÌf°534³9º9ú
+ÆQ¹&,¬&kèZî.¸_ÅViÖi×Ö"ìî0ß!¶¬ö¬_ödE¿(½½B¢èÑÊÊ_D;T[·(t¦¸¤hÜïïÄÕ³ï¼E2¿9~ÔhÔ¢)Âø'©d<I¯ÓAAây&ò$øjý½)¶jÇB¯6kwW/ò>ÏÀí$>¹M©ÉmR«?Må+ÝNX^;;Õ,hA¨ÖVK4ÖzC¡ï ãÆDmWL¬ÑlÙÃ¥në ÕùÜFC?ÆoüðÞÄÛ3ο¨ì½0nÅÂOÞØâ÷Ïÿ¸øÌ@-
ìxðÁÊyîÛ-3 úá7
<eTþéä®Ãé-mm[tgnÔ]DF=Nöjǽ¡Ú´Ð¥«Ö
+ÔaæãR°¸`ü¤:Eï÷\UêKK,çõÆÔÈ?2?^-ÊWD£CòòSÔÍí£âC»w?¤\VÖ ¯~J5JߧÊë_qßùðÞ¾6U¶ÏOuv|<TOW~ÎöcMòr¼g9©Á¶/7,
òDÙî
I¨!Î-1§¶JIÕI*Ôðj¤sȸP¡ô¬uq±ýc3½[û¬XF·ÒɵԾ§&í3ß~ÿý·O~O7ÿù\xÁ
+ê}KæSòuÊoQQ^R:gö<¦rAB3h»8j¯·
1÷XÃpFÐØ%AÐLsجOuP-²
NÉ ´ÚD°6ØpæT+Õa±Sµ©z>Õa&©?ºê>ÛÝFMwqtó
WèFÌÕÊ©
+?tD3Ù£¢oVf«[³&Y3¬yÖL[¦}õZk±Ø>Yd½Ñ:Å6Å^*Zç[çÙæÙ
+ÖjëRÛRû¡Á¤Ñ è"ØD»S°v[º*¦ÛÒíÃ
±ÐVh(LÇÛ&Úof7ÛfÛÃBXÛÙW w«l+í=CTÄê=Ôâö:e(~iÉ5'ÎÐç8g ;_?9ÐqB!Í
+9¡zÿÇó| òGð÷üø-oùñ®ÈÕ=Ëfä¸:Aîóâýz7æsZëÞ&¶Øü[R[Òqof¨5qnFü9ÉÆ ÇLzæIvfeF©Hlo¦PØn¥÷û/£ b ÌS¥¬ê¬µY|mF'íä:¡ïb].G³ËÕ×éîôÕmháU¾nûÙY?¶áR
+cÛϼ÷oØ´jesÇ~eÿè½ÿÔ{rÛÖ/¿G_þ¿¢Ó?[][}Ïz|à/S&ßû'¯[^x.3óÃØw#¢ØtѲ;Kár*&êÇ¿cìÁ-R·ù®]®=.Ün¦ø2ÊXöE)o(br&½Rf ¡¥7ÐáØ&ÅP©¬VWö*«¾Ô ÿL 5rºà$V]Høwd¨µ»MZ#Í!F½ Ãmæ Ãï.tºûKºÐ±¡æ÷Oãæ
ýd>ñgdÞ%ó^l12ÿR9)§ÜµT¦1nå¥êg¤+±`èóÔ, ³n\2f*çznooù¹qÆ2÷Ôé5÷Wö?ýúµþÈqîuA=;¡Ñó0Âyl8ògpÿÁAÍÐ ñTñÑܤ>Ï£úG±©Ç=yà
ßí NÜgÇanõPYOu7±½W7zx#Ù×_ºèø)^TgêÜwIÍÄyÚh^Tîø¼÷Î_ý½daô~¼m»àmn
á`^Í>±tÀ(¬doÇèSoÑä(9¨^³·IÎIÎaoBóô^²¾GêI3YÉ«z{©c1m!{/Ú¾#·FWVÇ"ì=½$zÇ·ïÓL:Êa1-E
9z&áèzá˱¢m|T¿WëéKÞænå2ù =ë¨k¼ï?HF£¼QÒIxpªüpìJèf§ÈaÆ@5B=wë îÒxI9©Ùøé8ÖL¦Ós¸
+ºçE
ãY`Ð'µsiÃíòM¥¾?Ìõçÿ¥ë_;Ñn\çëQÌwn;Kh4±OKùìßÝü,'8uF©¯ýÌñCoP>Çfâ¥ÚÃa0>'eLìîo.ù'I£áÖ5ïÏ7\9ÿðÁÀHcµö;ìäJ\â_aâ%ÄøÉô¯0VÿôçÑb|<Yɵ)PDFñÇÉb Eð.ÂðÞ±ãuÑñ)8o$}Üfr
+Ϭ<ͯìc¯^RÏ
©aI&¬¯Áç_#5ÍÜ÷j~þ¸Ó¨PaÎhBhÍÆ|6Ç~:r{ñ8!ɶnBt%èñlø u:Káñ'B,+±â¸
¯íaõÿU¢ÚÆsZMv9âTÀÕôì6ìó\£üéë
+¶Ák]©ìµ0¼&ó]©ð{#¼z*À^
é tÁÉz8®cz8ú²
ÁËvèÁK
+¼¨À
+<§À·_Ï÷AûõpHgëá6ÁS
ì);4ÀïBðÛ0<ûCðľ0{B}ax¼ÍÄO½kuloì
+Iðh.ìÞÈv+ðÈ.=â
]<¼ÓÄN8o§ vÊü|pv4òm&hùÒ`û}ùl»Û¶Úض4ØÚjd[m°µÊ²o}PÇZÐÚA<Pvò-Õõ¬ål¹[϶X`Ì7ãUóHhÚ|5)°ù2¶ùlnä¸?=PÈüý(×ýi°i£
mJMò ¿Ñëqéõa¸/îuÂ=mp·ÃaÖ¨@CÄÜpW½ÝzÜYgfwÚ Îµm°Îku°fµéÕw$°Õ>¸#VáC«a¥¿V f
Õ(°Â+d¾º/ÃW²1PUi`UT5ò¨ù.é¥ÇØR*±cPÑÈ/YÆÁ_·ã¤Ûû EX¨ÀÊçç²ræçÂm
+)pëT¸¥æ)0w<*ð+æv¸)3n4³õp£¦_'
ô0%E6¹
&
àzØõ6h
MpÃøq66¾ÆØ8½NÏÆJp¬e×éAÖ¬ÚqmásØi0ºÄÎFO
Q:Vb¥ÅV6²GXX±FX ÈÃ(fg
++°±av(éX
B×hYH¡®ÑB~^Ëy¹y|n¢å: ·ÏÑYN³í,8²Ql;dË|Ì|yd `ùÀS@ôfciebe©³ K±BÌ'à÷Å1ø,̾N> K²@R#¨D÷¦@âSÁãÎgYàÆ·ºó!N.êRÀ)ÃngJ°ÛlÌn»ÌÛl`ÅyÖc`AóZð$3ÊonÞ3)`ÄãÀ(óôØÑË#*Astõ
(XhÁbz`øáNÂ+Àr: ³(@;hx}3Íþû#ÿ×ü¯?¬:ÿ
ÿ?
+endstream
+endobj
+26 0 obj
+ 6009
+endobj
+27 0 obj
+<< /Length 28 0 R
+ /Filter /FlateDecode
+>>
+stream
+x]Mn0
÷bé" ªtâ?*íÀ¤b,CܾÆÏJ¥ZéãÍó<_êZÅv
/ÔZY§»L_Ô @þ-ÇÖD±KnÖyá±Öý%ÅN»ÒîYM?ED¿[ÅvÐWÚ}_|jîÆüðÈz¡$ª*RÜ»r¯ykG¦Ø'ïkåôaY÷.í/âk5L©gä¤x6dÛê+GeâNEeïN±Vÿô´@Z×Ë[k}¸páIr<TROÅt2h9(¨ ¥ #" ¨ZháïA$AÊSz1(Dö t-O9j௠Á_&@Á_È¿üåèSÀ_jÂ_¦@Á_¨ îL
F¸õm,Û=f.ïÖºqûEósÞ&<h~ì¢Ìå_>zµ»
+endstream
+endobj
+28 0 obj
+ 336
+endobj
+29 0 obj
+<< /Type /FontDescriptor
+ /FontName /DejaVuSerif
+ /Flags 4
+ /FontBBox [ -769 -346 1679 1242 ]
+ /ItalicAngle 0
+ /Ascent 928
+ /Descent -235
+ /CapHeight 1242
+ /StemV 80
+ /StemH 80
+ /FontFile2 25 0 R
+>>
+endobj
+30 0 obj
+<< /Type /Font
+ /Subtype /CIDFontType2
+ /BaseFont /DejaVuSerif
+ /CIDSystemInfo
+ << /Registry (Adobe)
+ /Ordering (Identity)
+ /Supplement 0
+ >>
+ /FontDescriptor 29 0 R
+ /W [0 [ 600 513 319 401 591 644 478 640 602 640 560 644 319 390 317 390 685 564 722 564 752 672 765 1023 596 801 370 ]]
+>>
+endobj
+7 0 obj
+<< /Type /Font
+ /Subtype /Type0
+ /BaseFont /DejaVuSerif
+ /Encoding /Identity-H
+ /DescendantFonts [ 30 0 R]
+ /ToUnicode 27 0 R
+>>
+endobj
+1 0 obj
+<< /Type /Pages
+ /Kids [ 8 0 R 12 0 R ]
+ /Count 2
+>>
+endobj
+31 0 obj
+<< /Creator (cairo 1.8.0 (http://cairographics.org))
+ /Producer (cairo 1.8.0 (http://cairographics.org))
+>>
+endobj
+32 0 obj
+<< /Type /Catalog
+ /Pages 1 0 R
+>>
+endobj
+xref
+0 33
+0000000000 65535 f
+0000039841 00000 n
+0000022513 00000 n
+0000000015 00000 n
+0000022489 00000 n
+0000029394 00000 n
+0000032408 00000 n
+0000039687 00000 n
+0000022660 00000 n
+0000022987 00000 n
+0000022874 00000 n
+0000022965 00000 n
+0000023008 00000 n
+0000023224 00000 n
+0000028257 00000 n
+0000028281 00000 n
+0000028753 00000 n
+0000028776 00000 n
+0000029009 00000 n
+0000029548 00000 n
+0000031541 00000 n
+0000031565 00000 n
+0000031906 00000 n
+0000031929 00000 n
+0000032156 00000 n
+0000032557 00000 n
+0000038661 00000 n
+0000038685 00000 n
+0000039099 00000 n
+0000039122 00000 n
+0000039357 00000 n
+0000039913 00000 n
+0000040039 00000 n
+trailer
+<< /Size 33
+ /Root 32 0 R
+ /Info 31 0 R
+>>
+startxref
+40092
+%%EOF
More information about the kune-commits
mailing list