From 4ada688fa1cf10b2675c479f7b9ccde5d874fb1c Mon Sep 17 00:00:00 2001 From: sweinreuter Date: Fri, 3 Feb 2012 16:45:36 +0100 Subject: [PATCH 001/215] IDEA-80760: XSLT forward referenced global variables and templates appear in IDEA as errors --- .../xslt/context/XsltVariableContext.java | 30 ++++++++++++++----- .../lang/xpath/xslt/XsltResolveTest.java | 4 +++ .../xslt/resolve/resolveForwardVariable.xsl | 5 ++++ 3 files changed, 32 insertions(+), 7 deletions(-) create mode 100644 plugins/xpath/xpath-lang/testData/xslt/resolve/resolveForwardVariable.xsl diff --git a/plugins/xpath/xpath-lang/src/org/intellij/lang/xpath/xslt/context/XsltVariableContext.java b/plugins/xpath/xpath-lang/src/org/intellij/lang/xpath/xslt/context/XsltVariableContext.java index 120fd516d802..e52487221e03 100644 --- a/plugins/xpath/xpath-lang/src/org/intellij/lang/xpath/xslt/context/XsltVariableContext.java +++ b/plugins/xpath/xpath-lang/src/org/intellij/lang/xpath/xslt/context/XsltVariableContext.java @@ -61,6 +61,7 @@ public class XsltVariableContext implements VariableContext { final VariantsProcessor processor = new VariantsProcessor(context); ResolveUtil.treeWalkUp(processor, context); + processForwardGlobals(context, processor); return processor.getResult(); } @@ -76,20 +77,33 @@ public class XsltVariableContext implements VariableContext { final XPathVariable variable = (XPathVariable)ResolveUtil.treeWalkUp(processor, context); if (variable == null) { + if (!processForwardGlobals(context, processor)) { final XmlFile file = PsiTreeUtil.getParentOfType(context, XmlFile.class, true); if (file != null) { - XsltIncludeIndex.processBackwardDependencies(file, new Processor() { - public boolean process(XmlFile xmlFile) { - processor.processExternalFile(xmlFile, context); - return processor.shouldContinue(); - } - }); - return (XPathVariable)processor.getResult(); + XsltIncludeIndex.processBackwardDependencies(file, new Processor() { + public boolean process(XmlFile xmlFile) { + processor.processExternalFile(xmlFile, context); + return processor.shouldContinue(); + } + }); + return (XPathVariable)processor.getResult(); } + } } return variable; } + private static boolean processForwardGlobals(XmlTag context, VariableProcessor processor) { + while (context != null && !XsltSupport.isTopLevelElement(context)) { + context = context.getParentTag(); + } + while (context != null && processor.shouldContinue()) { + processor.process(context); + context = PsiTreeUtil.getNextSiblingOfType(context, XmlTag.class); + } + return processor.shouldContinue(); + } + @Nullable protected XmlTag getContextTagImpl(XPathElement element) { return PsiTreeUtil.getContextOfType(element, XmlTag.class, true); @@ -141,6 +155,8 @@ public class XsltVariableContext implements VariableContext { processVarOrParamImpl(tag); } } + + protected abstract boolean shouldContinue(); } static class VariantsProcessor extends VariableProcessor { diff --git a/plugins/xpath/xpath-lang/test/org/intellij/lang/xpath/xslt/XsltResolveTest.java b/plugins/xpath/xpath-lang/test/org/intellij/lang/xpath/xslt/XsltResolveTest.java index e0234af216c8..08f6041879b4 100644 --- a/plugins/xpath/xpath-lang/test/org/intellij/lang/xpath/xslt/XsltResolveTest.java +++ b/plugins/xpath/xpath-lang/test/org/intellij/lang/xpath/xslt/XsltResolveTest.java @@ -40,6 +40,10 @@ public class XsltResolveTest extends TestBase { doVariableResolveTest(true); } + public void testResolveForwardVariable() throws Throwable { + doVariableResolveTest(true); + } + public void testResolveSingleVariable() throws Throwable { doVariableResolveTest(false); } diff --git a/plugins/xpath/xpath-lang/testData/xslt/resolve/resolveForwardVariable.xsl b/plugins/xpath/xpath-lang/testData/xslt/resolve/resolveForwardVariable.xsl new file mode 100644 index 000000000000..2ccc54fdc968 --- /dev/null +++ b/plugins/xpath/xpath-lang/testData/xslt/resolve/resolveForwardVariable.xsl @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file From 9e99a6d7e26ed8509e8a1e3f6699fe6b5ad4f6bc Mon Sep 17 00:00:00 2001 From: Konstantin Bulenkov Date: Sun, 5 Feb 2012 20:22:12 +0100 Subject: [PATCH 002/215] annoying problem with --- .../ide/navigationToolbar/NavBarItem.java | 2 +- .../NavBarListCellRenderer.java | 2 +- .../ide/navigationToolbar/NavBarModel.java | 16 ++++++++++++++++ .../ide/navigationToolbar/NavBarPanel.java | 3 ++- .../ide/navigationToolbar/NavBarPopup.java | 2 +- .../navigationToolbar/NavBarPresentation.java | 6 ++++-- 6 files changed, 25 insertions(+), 6 deletions(-) diff --git a/platform/lang-impl/src/com/intellij/ide/navigationToolbar/NavBarItem.java b/platform/lang-impl/src/com/intellij/ide/navigationToolbar/NavBarItem.java index e8385b9da65a..47cdf243c920 100644 --- a/platform/lang-impl/src/com/intellij/ide/navigationToolbar/NavBarItem.java +++ b/platform/lang-impl/src/com/intellij/ide/navigationToolbar/NavBarItem.java @@ -59,7 +59,7 @@ public class NavBarItem extends SimpleColoredComponent implements Disposable { openIcon = closedIcon = EmptyIcon.create(5); } final NavBarPresentation presentation = myPanel.getPresentation(); - myText = NavBarPresentation.getPresentableText(object, myPanel.getWindow()); + myText = NavBarPresentation.getPresentableText(object); myIcon = wrapIcon(openIcon, closedIcon, idx); myAttributes = presentation.getTextAttributes(object, false); } else { diff --git a/platform/lang-impl/src/com/intellij/ide/navigationToolbar/NavBarListCellRenderer.java b/platform/lang-impl/src/com/intellij/ide/navigationToolbar/NavBarListCellRenderer.java index 3f6c87c8fc45..6bb72e0a405f 100644 --- a/platform/lang-impl/src/com/intellij/ide/navigationToolbar/NavBarListCellRenderer.java +++ b/platform/lang-impl/src/com/intellij/ide/navigationToolbar/NavBarListCellRenderer.java @@ -47,7 +47,7 @@ public class NavBarListCellRenderer extends ColoredListCellRenderer { protected void customizeCellRenderer(JList list, Object value, int index, boolean selected, boolean hasFocus) { setFocusBorderAroundIcon(false); - final String name = NavBarPresentation.getPresentableText(value, myPanel.getWindow()); + final String name = NavBarPresentation.getPresentableText(value); Color color = list.getForeground(); boolean isProblemFile = false; diff --git a/platform/lang-impl/src/com/intellij/ide/navigationToolbar/NavBarModel.java b/platform/lang-impl/src/com/intellij/ide/navigationToolbar/NavBarModel.java index a356f92abcf9..8bb0189b8481 100644 --- a/platform/lang-impl/src/com/intellij/ide/navigationToolbar/NavBarModel.java +++ b/platform/lang-impl/src/com/intellij/ide/navigationToolbar/NavBarModel.java @@ -159,6 +159,22 @@ public class NavBarModel { setModel(updatedModel); } + void revalidate() { + final List objects = new ArrayList(); + boolean update = false; + for (Object o : myModel) { + if (isValid(o)) { + objects.add(o); + } else { + update = true; + break; + } + } + if (update) { + setModel(objects); + } + } + private void setModel(List model) { if (!model.equals(myModel)) { myModel = model; diff --git a/platform/lang-impl/src/com/intellij/ide/navigationToolbar/NavBarPanel.java b/platform/lang-impl/src/com/intellij/ide/navigationToolbar/NavBarPanel.java index a6d8f607482a..abfa5435a815 100644 --- a/platform/lang-impl/src/com/intellij/ide/navigationToolbar/NavBarPanel.java +++ b/platform/lang-impl/src/com/intellij/ide/navigationToolbar/NavBarPanel.java @@ -336,6 +336,7 @@ public class NavBarPanel extends JPanel implements DataProvider, PopupOwner, Dis } boolean isRebuildUiNeeded() { + myModel.revalidate(); if (myList.size() == myModel.size()) { int index = 0; for (NavBarItem eachLabel : myList) { @@ -344,7 +345,7 @@ public class NavBarPanel extends JPanel implements DataProvider, PopupOwner, Dis return true; } - if (!StringUtil.equals(eachLabel.getText(), NavBarPresentation.getPresentableText(eachElement, null))) { + if (!StringUtil.equals(eachLabel.getText(), NavBarPresentation.getPresentableText(eachElement))) { return true; } diff --git a/platform/lang-impl/src/com/intellij/ide/navigationToolbar/NavBarPopup.java b/platform/lang-impl/src/com/intellij/ide/navigationToolbar/NavBarPopup.java index f131e966b4fc..c592df43b92b 100644 --- a/platform/lang-impl/src/com/intellij/ide/navigationToolbar/NavBarPopup.java +++ b/platform/lang-impl/src/com/intellij/ide/navigationToolbar/NavBarPopup.java @@ -160,7 +160,7 @@ public class NavBarPopup extends LightweightHint implements Disposable{ final JComponent component = ListWithFilter.wrap(list, new NavBarListWrapper(list), new Function() { @Override public String fun(Object o) { - return NavBarPresentation.getPresentableText(o, panel.getWindow()); + return NavBarPresentation.getPresentableText(o); } }); component.putClientProperty(JBLIST_KEY, list); diff --git a/platform/lang-impl/src/com/intellij/ide/navigationToolbar/NavBarPresentation.java b/platform/lang-impl/src/com/intellij/ide/navigationToolbar/NavBarPresentation.java index 7726804491ae..50526eba63e9 100644 --- a/platform/lang-impl/src/com/intellij/ide/navigationToolbar/NavBarPresentation.java +++ b/platform/lang-impl/src/com/intellij/ide/navigationToolbar/NavBarPresentation.java @@ -91,8 +91,10 @@ public class NavBarPresentation { } @NotNull - protected static String getPresentableText(final Object object, @Nullable Window window) { - if (!NavBarModel.isValid(object)) return IdeBundle.message("node.structureview.invalid"); + protected static String getPresentableText(final Object object) { + if (!NavBarModel.isValid(object)) { + return IdeBundle.message("node.structureview.invalid"); + } for (NavBarModelExtension modelExtension : Extensions.getExtensions(NavBarModelExtension.EP_NAME)) { String text = modelExtension.getPresentableText(object); if (text != null) { From 1d61e0a5d908267427fb1d277ed79c6ddbdd49c3 Mon Sep 17 00:00:00 2001 From: Konstantin Bulenkov Date: Sun, 5 Feb 2012 20:41:54 +0100 Subject: [PATCH 003/215] move focus back correctly on delete --- .../impl/FileEditorManagerImpl.java | 20 ++++++++++++++++++- .../src/com/intellij/ui/FocusTrackback.java | 3 +-- 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/platform/platform-impl/src/com/intellij/openapi/fileEditor/impl/FileEditorManagerImpl.java b/platform/platform-impl/src/com/intellij/openapi/fileEditor/impl/FileEditorManagerImpl.java index f1881c6cb742..b99f84e8751e 100644 --- a/platform/platform-impl/src/com/intellij/openapi/fileEditor/impl/FileEditorManagerImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/fileEditor/impl/FileEditorManagerImpl.java @@ -31,6 +31,7 @@ import com.intellij.openapi.components.ProjectComponent; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.editor.ex.EditorEx; +import com.intellij.openapi.editor.impl.EditorComponentImpl; import com.intellij.openapi.extensions.Extensions; import com.intellij.openapi.fileEditor.*; import com.intellij.openapi.fileEditor.ex.FileEditorManagerEx; @@ -58,6 +59,8 @@ import com.intellij.openapi.wm.IdeFocusManager; import com.intellij.openapi.wm.ToolWindowManager; import com.intellij.openapi.wm.WindowManager; import com.intellij.openapi.wm.ex.StatusBarEx; +import com.intellij.openapi.wm.impl.IdeFrameImpl; +import com.intellij.ui.FocusTrackback; import com.intellij.ui.docking.DockContainer; import com.intellij.ui.docking.DockManager; import com.intellij.ui.tabs.impl.JBTabsImpl; @@ -1419,11 +1422,14 @@ public class FileEditorManagerImpl extends FileEditorManagerEx implements Projec private final class MyVirtualFileListener extends VirtualFileAdapter { public void beforeFileDeletion(VirtualFileEvent e) { assertDispatchThread(); + + boolean moveFocus = moveFocusOnDelete(); + final VirtualFile file = e.getFile(); final VirtualFile[] openFiles = getOpenFiles(); for (int i = openFiles.length - 1; i >= 0; i--) { if (VfsUtilCore.isAncestor(file, openFiles[i], false)) { - closeFile(openFiles[i], true, true); + closeFile(openFiles[i], moveFocus, true); } } } @@ -1469,6 +1475,18 @@ public class FileEditorManagerImpl extends FileEditorManagerEx implements Projec } } + private static boolean moveFocusOnDelete() { + final Window window = KeyboardFocusManager.getCurrentKeyboardFocusManager().getFocusedWindow(); + if (window != null) { + final Component component = FocusTrackback.getFocusFor(window); + if (component != null) { + return component instanceof EditorComponentImpl; + } + return window instanceof IdeFrameImpl; + } + return true; + } + public boolean isInsideChange() { return getSplitters().isInsideChange(); } diff --git a/platform/platform-impl/src/com/intellij/ui/FocusTrackback.java b/platform/platform-impl/src/com/intellij/ui/FocusTrackback.java index 583474d1ed5f..26bb96bcf27d 100644 --- a/platform/platform-impl/src/com/intellij/ui/FocusTrackback.java +++ b/platform/platform-impl/src/com/intellij/ui/FocusTrackback.java @@ -22,7 +22,6 @@ import com.intellij.openapi.application.Application; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.project.Project; -import com.intellij.openapi.ui.DialogWrapper; import com.intellij.openapi.ui.popup.JBPopup; import com.intellij.openapi.util.ActionCallback; import com.intellij.openapi.util.ExpirableRunnable; @@ -136,7 +135,7 @@ public class FocusTrackback { myLocalFocusOwner = component; } - private static Component getFocusFor(Window parent) { + public static Component getFocusFor(Window parent) { final WeakReference ref = ourRootWindowToFocusedMap.get(parent); return ref != null ? ref.get() : null; } From fc939bb1ebff1d07e934ef0cf85037b88dcf2d64 Mon Sep 17 00:00:00 2001 From: "Maxim.Medvedev" Date: Sun, 5 Feb 2012 22:20:59 +0400 Subject: [PATCH 004/215] enter handler for strings --- .../plugins/groovy/GroovyFileType.java | 8 +-- .../highlighter/GroovyEditorHighlighter.java | 4 +- .../editor/actions/GroovyEnterHandler.java | 68 ++++++++++++------- .../lang/folding/GroovyFoldingBuilder.java | 21 +----- .../groovy/lang/psi/util/GrStringUtil.java | 21 ++++++ .../lang/formatter/EnterActionTest.groovy | 8 ++- .../groovy/enterAction/gstring14.test | 4 ++ .../groovy/enterAction/gstring15.test | 4 ++ .../groovy/enterAction/gstring16.test | 4 ++ .../testdata/groovy/enterAction/string10.test | 8 +++ .../testdata/groovy/enterAction/string7.test | 8 +++ .../testdata/groovy/enterAction/string8.test | 8 +++ .../testdata/groovy/enterAction/string9.test | 8 +++ 13 files changed, 121 insertions(+), 53 deletions(-) create mode 100644 plugins/groovy/testdata/groovy/enterAction/gstring14.test create mode 100644 plugins/groovy/testdata/groovy/enterAction/gstring15.test create mode 100644 plugins/groovy/testdata/groovy/enterAction/gstring16.test create mode 100644 plugins/groovy/testdata/groovy/enterAction/string10.test create mode 100644 plugins/groovy/testdata/groovy/enterAction/string7.test create mode 100644 plugins/groovy/testdata/groovy/enterAction/string8.test create mode 100644 plugins/groovy/testdata/groovy/enterAction/string9.test diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/GroovyFileType.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/GroovyFileType.java index 8e9a333abfd1..69a1382f00e0 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/GroovyFileType.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/GroovyFileType.java @@ -16,15 +16,15 @@ package org.jetbrains.plugins.groovy; +import com.intellij.lang.Language; +import com.intellij.openapi.editor.colors.EditorColorsScheme; +import com.intellij.openapi.editor.highlighter.EditorHighlighter; import com.intellij.openapi.fileTypes.EditorHighlighterProvider; import com.intellij.openapi.fileTypes.FileType; import com.intellij.openapi.fileTypes.FileTypeEditorHighlighterProviders; import com.intellij.openapi.fileTypes.LanguageFileType; -import com.intellij.openapi.editor.highlighter.EditorHighlighter; -import com.intellij.openapi.editor.colors.EditorColorsScheme; import com.intellij.openapi.project.Project; import com.intellij.openapi.vfs.VirtualFile; -import com.intellij.lang.Language; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -50,7 +50,7 @@ public class GroovyFileType extends LanguageFileType { public EditorHighlighter getEditorHighlighter(@Nullable Project project, @NotNull FileType fileType, @Nullable VirtualFile virtualFile, @NotNull EditorColorsScheme colors) { - return new GroovyEditorHighlighter(colors, project, virtualFile); + return new GroovyEditorHighlighter(colors); } }); } diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/highlighter/GroovyEditorHighlighter.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/highlighter/GroovyEditorHighlighter.java index abdc14186e73..c0a235eb0211 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/highlighter/GroovyEditorHighlighter.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/highlighter/GroovyEditorHighlighter.java @@ -20,8 +20,6 @@ import com.intellij.openapi.editor.colors.EditorColorsScheme; import com.intellij.openapi.editor.ex.util.LayerDescriptor; import com.intellij.openapi.editor.ex.util.LayeredLexerEditorHighlighter; import com.intellij.openapi.fileTypes.SyntaxHighlighter; -import com.intellij.openapi.project.Project; -import com.intellij.openapi.vfs.VirtualFile; import org.jetbrains.plugins.groovy.lang.groovydoc.highlighter.GroovyDocSyntaxHighlighter; import org.jetbrains.plugins.groovy.lang.groovydoc.parser.GroovyDocElementTypes; @@ -30,7 +28,7 @@ import org.jetbrains.plugins.groovy.lang.groovydoc.parser.GroovyDocElementTypes; */ public class GroovyEditorHighlighter extends LayeredLexerEditorHighlighter { - public GroovyEditorHighlighter(EditorColorsScheme scheme, Project project, VirtualFile virtualFile) { + public GroovyEditorHighlighter(EditorColorsScheme scheme) { super(new GroovySyntaxHighlighter(), scheme); registerGroovydocHighlighter(); } diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/editor/actions/GroovyEnterHandler.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/editor/actions/GroovyEnterHandler.java index 8e3748d4d660..b7df458df553 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/editor/actions/GroovyEnterHandler.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/editor/actions/GroovyEnterHandler.java @@ -33,15 +33,17 @@ import com.intellij.openapi.project.Project; import com.intellij.openapi.util.Ref; import com.intellij.openapi.util.TextRange; import com.intellij.openapi.util.text.StringUtil; +import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.*; import com.intellij.psi.codeStyle.CodeStyleManager; import com.intellij.psi.codeStyle.CodeStyleSettingsManager; +import com.intellij.psi.tree.IElementType; import com.intellij.psi.tree.TokenSet; import org.jetbrains.annotations.NotNull; import org.jetbrains.plugins.groovy.formatter.GeeseUtil; import org.jetbrains.plugins.groovy.formatter.GroovyCodeStyleSettings; import org.jetbrains.plugins.groovy.lang.editor.HandlerUtils; -import org.jetbrains.plugins.groovy.lang.lexer.GroovyTokenTypes; +import org.jetbrains.plugins.groovy.lang.lexer.GroovyLexer; import org.jetbrains.plugins.groovy.lang.psi.api.statements.blocks.GrClosableBlock; import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrExpression; import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrReferenceExpression; @@ -152,9 +154,7 @@ public class GroovyEnterHandler extends EnterHandlerDelegateAdapter { if (element == null || !GeeseUtil.isClosureRBrace(element)) return false; element = GeeseUtil.getNextNonWhitespaceToken(element); - if (element == null || - element.getNode().getElementType() != GroovyTokenTypes.mNLS || - StringUtil.countChars(element.getText(), '\n') > 1) { + if (element == null || element.getNode().getElementType() != mNLS || StringUtil.countChars(element.getText(), '\n') > 1) { return false; } @@ -206,8 +206,10 @@ public class GroovyEnterHandler extends EnterHandlerDelegateAdapter { private static final TokenSet AFTER_DOLLAR = TokenSet.create(mLCURLY, mIDENT, mGSTRING_CONTENT, mDOLLAR, mGSTRING_END); - private static final TokenSet ALL_STRINGS = - TokenSet.create(mSTRING_LITERAL, mGSTRING_LITERAL, mGSTRING_BEGIN, mGSTRING_END, mGSTRING_CONTENT, mRCURLY, mIDENT, mDOLLAR); + private static final TokenSet ALL_STRINGS = TokenSet + .create(mSTRING_LITERAL, mGSTRING_LITERAL, mGSTRING_BEGIN, mGSTRING_END, mGSTRING_CONTENT, mRCURLY, mIDENT, mDOLLAR, mREGEX_BEGIN, + mREGEX_CONTENT, mREGEX_END, mDOLLAR_SLASH_REGEX_BEGIN, mDOLLAR_SLASH_REGEX_CONTENT, mDOLLAR_SLASH_REGEX_END, mREGEX_LITERAL, + mDOLLAR_SLASH_REGEX_LITERAL); private static final TokenSet BEFORE_DOLLAR = TokenSet.create(mGSTRING_BEGIN, mGSTRING_CONTENT); @@ -222,7 +224,9 @@ public class GroovyEnterHandler extends EnterHandlerDelegateAdapter { Project project = PlatformDataKeys.PROJECT.getData(dataContext); if (project == null) return false; - PsiFile file = PsiManager.getInstance(project).findFile(FileDocumentManager.getInstance().getFile(editor.getDocument())); + final VirtualFile vfile = FileDocumentManager.getInstance().getFile(editor.getDocument()); + assert vfile != null; + PsiFile file = PsiManager.getInstance(project).findFile(vfile); Document document = editor.getDocument(); String fileText = document.getText(); @@ -241,7 +245,14 @@ public class GroovyEnterHandler extends EnterHandlerDelegateAdapter { if (mSTRING_LITERAL == node.getElementType()) { if (GroovyEditorActionUtil.isPlainStringLiteral(node)) { TextRange literalRange = stringElement.getTextRange(); - document.insertString(literalRange.getEndOffset(), "''"); + + //the case of print '\' + if (fileText.charAt(caretOffset) == '\'' && caretOffset > 0 && fileText.charAt(caretOffset - 1) == '\\') { + convertEndToMultiline(caretOffset, document, fileText); + } + else { + convertEndToMultiline(literalRange.getEndOffset(), document, fileText); + } document.insertString(literalRange.getStartOffset(), "''"); editor.getCaretModel().moveToOffset(caretOffset + 2); EditorModificationUtil.insertStringAtCaret(editor, "\n"); @@ -292,30 +303,37 @@ public class GroovyEnterHandler extends EnterHandlerDelegateAdapter { return false; } - private static boolean checkStringApplicable(Editor editor, int caret) { - final EditorHighlighter highlighter = ((EditorEx)editor).getHighlighter(); - HighlighterIterator iteratorLeft = highlighter.createIterator(caret - 1); - HighlighterIterator iteratorRight = highlighter.createIterator(caret); + private static void convertEndToMultiline(int caretOffset, Document document, String fileText) { + if (caretOffset < fileText.length() && fileText.charAt(caretOffset) == '\'' || + caretOffset > 0 && fileText.charAt(caretOffset - 1) == '\'') { + document.insertString(caretOffset, "''"); + } + else { + document.insertString(caretOffset, "'''"); + } + } - if (iteratorLeft != null && !(ALL_STRINGS.contains(iteratorLeft.getTokenType()))) { + private static boolean checkStringApplicable(Editor editor, int caret) { + final GroovyLexer lexer = new GroovyLexer(); + lexer.start(editor.getDocument().getText()); + + while (lexer.getTokenEnd() < caret) { + lexer.advance(); + } + final IElementType leftToken = lexer.getTokenType(); + if (lexer.getTokenEnd() <= caret) lexer.advance(); + final IElementType rightToken = lexer.getTokenType(); + + if (!(ALL_STRINGS.contains(leftToken))) { return false; } - if (iteratorLeft != null && - BEFORE_DOLLAR.contains(iteratorLeft.getTokenType()) && - iteratorRight != null && - !AFTER_DOLLAR.contains(iteratorRight.getTokenType())) { + if (BEFORE_DOLLAR.contains(leftToken) && !AFTER_DOLLAR.contains(rightToken)) { return false; } - if (iteratorLeft != null && - EXPR_END.contains(iteratorLeft.getTokenType()) && - iteratorRight != null && - !AFTER_EXPR_END.contains(iteratorRight.getTokenType())) { + if (EXPR_END.contains(leftToken) && !AFTER_EXPR_END.contains(rightToken)) { return false; } - if (iteratorLeft != null && - STRING_END.contains(iteratorLeft.getTokenType()) && - iteratorRight != null && - !STRING_END.contains(iteratorRight.getTokenType())) { + if (STRING_END.contains(leftToken) && !STRING_END.contains(rightToken)) { return false; } return true; diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/folding/GroovyFoldingBuilder.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/folding/GroovyFoldingBuilder.java index 38f77425389c..ef7a8c26f90f 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/folding/GroovyFoldingBuilder.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/folding/GroovyFoldingBuilder.java @@ -209,25 +209,6 @@ public class GroovyFoldingBuilder implements FoldingBuilder, GroovyElementTypes, return element.getText().endsWith("*/"); } - private static boolean isWellEndedString(PsiElement element) { - final String text = element.getText(); - - if (!text.endsWith("'''") && !text.endsWith("\"\"\"") && !text.endsWith("/") && !text.endsWith("/$")) return false; - - - final IElementType type = element.getNode().getElementType(); - if (TokenSets.STRING_LITERAL_SET.contains(type)) return true; - - final PsiElement lastChild = element.getLastChild(); - if (lastChild == null) return false; - - final IElementType lastType = lastChild.getNode().getElementType(); - if (type == GSTRING) return lastType == mGSTRING_END; - if (type == REGEX) return lastType == mREGEX_END || lastType == mDOLLAR_SLASH_REGEX_END; - - return false; - } - private static boolean isMultiline(PsiElement element) { String text = element.getText(); return text.contains("\n") || text.contains("\r") || text.contains("\r\n"); @@ -297,6 +278,6 @@ public class GroovyFoldingBuilder implements FoldingBuilder, GroovyElementTypes, node.getElementType().equals(GSTRING) || node.getElementType().equals(REGEX)) && isMultiline(node.getPsi()) && - isWellEndedString(node.getPsi()); + GrStringUtil.isWellEndedString(node.getPsi()); } } diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/util/GrStringUtil.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/util/GrStringUtil.java index b340263d6b7e..edb3b8798b1f 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/util/GrStringUtil.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/util/GrStringUtil.java @@ -8,6 +8,8 @@ import com.intellij.psi.tree.IElementType; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import org.jetbrains.plugins.groovy.lang.lexer.TokenSets; +import org.jetbrains.plugins.groovy.lang.parser.GroovyElementTypes; import org.jetbrains.plugins.groovy.lang.psi.GroovyPsiElementFactory; import org.jetbrains.plugins.groovy.lang.psi.api.statements.GrStatement; import org.jetbrains.plugins.groovy.lang.psi.api.statements.blocks.GrClosableBlock; @@ -801,4 +803,23 @@ public class GrStringUtil { final IElementType elementType = literal.getFirstChild().getNode().getElementType(); return elementType == mREGEX_LITERAL || elementType == mDOLLAR_SLASH_REGEX_LITERAL; } + + public static boolean isWellEndedString(PsiElement element) { + final String text = element.getText(); + + if (!text.endsWith("'''") && !text.endsWith("\"\"\"") && !text.endsWith("/") && !text.endsWith("/$")) return false; + + + final IElementType type = element.getNode().getElementType(); + if (TokenSets.STRING_LITERAL_SET.contains(type)) return true; + + final PsiElement lastChild = element.getLastChild(); + if (lastChild == null) return false; + + final IElementType lastType = lastChild.getNode().getElementType(); + if (type == GroovyElementTypes.GSTRING) return lastType == mGSTRING_END; + if (type == GroovyElementTypes.REGEX) return lastType == mREGEX_END || lastType == mDOLLAR_SLASH_REGEX_END; + + return false; + } } diff --git a/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/formatter/EnterActionTest.groovy b/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/formatter/EnterActionTest.groovy index 1de81cbf2f45..f6ac881554e1 100644 --- a/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/formatter/EnterActionTest.groovy +++ b/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/formatter/EnterActionTest.groovy @@ -69,6 +69,9 @@ public class EnterActionTest extends GroovyFormatterTestCase { public void testGstring11() throws Throwable { doTest(); } public void testGstring12() throws Throwable { doTest(); } public void testGstring13() throws Throwable { doTest(); } + public void testGstring14() throws Throwable { doTest(); } + public void testGstring15() throws Throwable { doTest(); } + public void testGstring16() throws Throwable { doTest(); } public void testGstring2() throws Throwable { doTest(); } public void testGstring3() throws Throwable { doTest(); } public void testGstring4() throws Throwable { doTest(); } @@ -85,6 +88,10 @@ public class EnterActionTest extends GroovyFormatterTestCase { public void testString4() throws Throwable { doTest(); } public void testString5() throws Throwable { doTest(); } public void testString6() throws Throwable { doTest(); } + public void testString7() throws Throwable { doTest(); } + public void testString8() throws Throwable { doTest(); } + public void testString9() throws Throwable { doTest(); } + public void testString10() throws Throwable { doTest(); } def doTest(String before, String after) { myFixture.configureByText("a.groovy", before) @@ -287,7 +294,6 @@ foo { } } ''' - } } diff --git a/plugins/groovy/testdata/groovy/enterAction/gstring14.test b/plugins/groovy/testdata/groovy/enterAction/gstring14.test new file mode 100644 index 000000000000..8a40d015ca8e --- /dev/null +++ b/plugins/groovy/testdata/groovy/enterAction/gstring14.test @@ -0,0 +1,4 @@ +"p\nreved $id medved" +----- +"""p +\nreved $id medved""" \ No newline at end of file diff --git a/plugins/groovy/testdata/groovy/enterAction/gstring15.test b/plugins/groovy/testdata/groovy/enterAction/gstring15.test new file mode 100644 index 000000000000..7be49c36622a --- /dev/null +++ b/plugins/groovy/testdata/groovy/enterAction/gstring15.test @@ -0,0 +1,4 @@ +"p\nreved $id medved" +----- +"""p\ +nreved $id medved""" \ No newline at end of file diff --git a/plugins/groovy/testdata/groovy/enterAction/gstring16.test b/plugins/groovy/testdata/groovy/enterAction/gstring16.test new file mode 100644 index 000000000000..077cf356371e --- /dev/null +++ b/plugins/groovy/testdata/groovy/enterAction/gstring16.test @@ -0,0 +1,4 @@ +"p\nreved $id medved" +----- +"""p\n +reved $id medved""" \ No newline at end of file diff --git a/plugins/groovy/testdata/groovy/enterAction/string10.test b/plugins/groovy/testdata/groovy/enterAction/string10.test new file mode 100644 index 000000000000..62ac00930273 --- /dev/null +++ b/plugins/groovy/testdata/groovy/enterAction/string10.test @@ -0,0 +1,8 @@ +def cl = { + print ('foo\n') +} +----- +def cl = { + print ('''foo +\n''') +} \ No newline at end of file diff --git a/plugins/groovy/testdata/groovy/enterAction/string7.test b/plugins/groovy/testdata/groovy/enterAction/string7.test new file mode 100644 index 000000000000..ef77526f024f --- /dev/null +++ b/plugins/groovy/testdata/groovy/enterAction/string7.test @@ -0,0 +1,8 @@ +def cl = { + print ('foo\') +} +----- +def cl = { + print ('''foo\ +''') +} \ No newline at end of file diff --git a/plugins/groovy/testdata/groovy/enterAction/string8.test b/plugins/groovy/testdata/groovy/enterAction/string8.test new file mode 100644 index 000000000000..6ba93cb02352 --- /dev/null +++ b/plugins/groovy/testdata/groovy/enterAction/string8.test @@ -0,0 +1,8 @@ +def cl = { + print ('foo\') +} +----- +def cl = { + print ('''foo +\')''' +} \ No newline at end of file diff --git a/plugins/groovy/testdata/groovy/enterAction/string9.test b/plugins/groovy/testdata/groovy/enterAction/string9.test new file mode 100644 index 000000000000..cd1288e6a2c0 --- /dev/null +++ b/plugins/groovy/testdata/groovy/enterAction/string9.test @@ -0,0 +1,8 @@ +def cl = { + print ('foo\n') +} +----- +def cl = { + print ('''foo\ +n''') +} \ No newline at end of file From 896e13d0cd988a157fe27fc221c04cec902997a4 Mon Sep 17 00:00:00 2001 From: nik Date: Mon, 6 Feb 2012 12:36:37 +0400 Subject: [PATCH 005/215] transfer artifact names to compile server --- .../compiler/CompileServerManager.java | 11 +-- .../intellij/compiler/impl/CompileDriver.java | 15 +++- jps/jps-builders/proto/gen_proto.sh | 2 + jps/jps-builders/proto/jps_remote_proto.proto | 1 + .../org/jetbrains/jps/api/JpsRemoteProto.java | 78 +++++++++++++++++++ .../src/org/jetbrains/jps/api/ProtoUtil.java | 23 ++++-- .../jps/client/CompileServerClient.java | 7 +- .../artifacts/ArtifactSourceFilesState.java | 32 +++++--- .../artifacts/ArtifactsBuildData.java | 7 +- .../jps/server/ServerMessageHandler.java | 4 +- 10 files changed, 145 insertions(+), 35 deletions(-) create mode 100755 jps/jps-builders/proto/gen_proto.sh diff --git a/java/compiler/impl/src/com/intellij/compiler/CompileServerManager.java b/java/compiler/impl/src/com/intellij/compiler/CompileServerManager.java index b207b8d4a5e2..f97ad79d2de0 100644 --- a/java/compiler/impl/src/com/intellij/compiler/CompileServerManager.java +++ b/java/compiler/impl/src/com/intellij/compiler/CompileServerManager.java @@ -271,9 +271,8 @@ public class CompileServerManager implements ApplicationComponent{ if (!config.useCompileServer() || !config.MAKE_PROJECT_ON_SAVE) { continue; } - final RequestFuture future = submitCompilationTask( - project, false, true, Collections.emptyList(), Collections.emptyList(), new AutoMakeResponseHandler(project) - ); + final RequestFuture future = submitCompilationTask(project, false, true, Collections.emptyList(), Collections.emptyList(), + Collections.emptyList(), new AutoMakeResponseHandler(project)); if (future != null) { futures.add(future); synchronized (myAutomakeFutures) { @@ -311,7 +310,9 @@ public class CompileServerManager implements ApplicationComponent{ } @Nullable - public RequestFuture submitCompilationTask(final Project project, final boolean isRebuild, final boolean isMake, final Collection modules, final Collection paths, final JpsServerResponseHandler handler) { + public RequestFuture submitCompilationTask(final Project project, final boolean isRebuild, final boolean isMake, + final Collection modules, final Collection artifacts, + final Collection paths, final JpsServerResponseHandler handler) { final String projectId = project.getLocation(); final Ref futureRef = new Ref(null); final RunnableFuture future = myTaskExecutor.submit(new Runnable() { @@ -321,7 +322,7 @@ public class CompileServerManager implements ApplicationComponent{ if (client != null) { final RequestFuture requestFuture = isRebuild ? client.sendRebuildRequest(projectId, handler) : - client.sendCompileRequest(isMake, projectId, modules, paths, handler); + client.sendCompileRequest(isMake, projectId, modules, artifacts, paths, handler); futureRef.set(requestFuture); } else { diff --git a/java/compiler/impl/src/com/intellij/compiler/impl/CompileDriver.java b/java/compiler/impl/src/com/intellij/compiler/impl/CompileDriver.java index 87198ba9d5e7..5751811c903b 100644 --- a/java/compiler/impl/src/com/intellij/compiler/impl/CompileDriver.java +++ b/java/compiler/impl/src/com/intellij/compiler/impl/CompileDriver.java @@ -414,19 +414,25 @@ public class CompileDriver { } @Nullable - private RequestFuture compileOnServer(final CompileContextImpl compileContext, Collection modules, final Collection paths, @Nullable final CompileStatusNotification callback) + private RequestFuture compileOnServer(final @NotNull CompileContextImpl compileContext, @NotNull Collection modules, @NotNull Collection artifacts, + final @NotNull Collection paths, @Nullable final CompileStatusNotification callback) throws Exception { Collection moduleNames = Collections.emptyList(); - if (modules != null && modules.size() > 0) { + if (modules.size() > 0) { moduleNames = new ArrayList(modules.size()); for (Module module : modules) { moduleNames.add(module.getName()); } } + List artifactNames = new ArrayList(); + for (Artifact artifact : artifacts) { + artifactNames.add(artifact.getName()); + } + final CompileServerManager csManager = CompileServerManager.getInstance(); final MessageBus messageBus = myProject.getMessageBus(); csManager.cancelAutoMakeTasks(myProject); - return csManager.submitCompilationTask(myProject, compileContext.isRebuild(), compileContext.isMake(), moduleNames, paths, new JpsServerResponseHandler() { + return csManager.submitCompilationTask(myProject, compileContext.isRebuild(), compileContext.isMake(), moduleNames, artifactNames, paths, new JpsServerResponseHandler() { @Override public void handleCompileMessage(JpsRemoteProto.Message.Response.CompileMessage compilerMessage) { @@ -584,7 +590,8 @@ public class CompileDriver { } final Collection paths = fetchFiles(compileContext); final List modules = paths.isEmpty()? Arrays.asList(compileContext.getCompileScope().getAffectedModules()) : Collections.emptyList(); - final RequestFuture future = compileOnServer(compileContext, modules, paths, callback); + final Set artifacts = ArtifactCompileScope.getArtifactsToBuild(myProject, compileContext.getCompileScope(), true); + final RequestFuture future = compileOnServer(compileContext, modules, artifacts, paths, callback); if (future != null) { try { startCancelWatcher(indicator, future); diff --git a/jps/jps-builders/proto/gen_proto.sh b/jps/jps-builders/proto/gen_proto.sh new file mode 100755 index 000000000000..0a2ba92d332e --- /dev/null +++ b/jps/jps-builders/proto/gen_proto.sh @@ -0,0 +1,2 @@ +protoc -I=. --java_out=../src javac_remote_proto.proto +protoc -I=. --java_out=../src jps_remote_proto.proto \ No newline at end of file diff --git a/jps/jps-builders/proto/jps_remote_proto.proto b/jps/jps-builders/proto/jps_remote_proto.proto index 4f9cbb27b579..2b9e0b9001aa 100644 --- a/jps/jps-builders/proto/jps_remote_proto.proto +++ b/jps/jps-builders/proto/jps_remote_proto.proto @@ -43,6 +43,7 @@ message Message { optional string project_id = 2; repeated string module_name = 3; repeated string file_path = 4; + repeated string artifact_name = 5; } message ShutdownCommand { diff --git a/jps/jps-builders/src/org/jetbrains/jps/api/JpsRemoteProto.java b/jps/jps-builders/src/org/jetbrains/jps/api/JpsRemoteProto.java index 42191910cc47..ebde9bb6ee3d 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/api/JpsRemoteProto.java +++ b/jps/jps-builders/src/org/jetbrains/jps/api/JpsRemoteProto.java @@ -857,6 +857,18 @@ public final class JpsRemoteProto { return filePath_.get(index); } + // repeated string artifact_name = 5; + public static final int ARTIFACT_NAME_FIELD_NUMBER = 5; + private java.util.List artifactName_ = + java.util.Collections.emptyList(); + public java.util.List getArtifactNameList() { + return artifactName_; + } + public int getArtifactNameCount() { return artifactName_.size(); } + public java.lang.String getArtifactName(int index) { + return artifactName_.get(index); + } + private void initFields() { commandType_ = org.jetbrains.jps.api.JpsRemoteProto.Message.Request.CompilationRequest.Type.REBUILD; } @@ -880,6 +892,9 @@ public final class JpsRemoteProto { for (java.lang.String element : getFilePathList()) { output.writeString(4, element); } + for (java.lang.String element : getArtifactNameList()) { + output.writeString(5, element); + } } private int memoizedSerializedSize = -1; @@ -914,6 +929,15 @@ public final class JpsRemoteProto { size += dataSize; size += 1 * getFilePathList().size(); } + { + int dataSize = 0; + for (java.lang.String element : getArtifactNameList()) { + dataSize += com.google.protobuf.CodedOutputStream + .computeStringSizeNoTag(element); + } + size += dataSize; + size += 1 * getArtifactNameList().size(); + } memoizedSerializedSize = size; return size; } @@ -1059,6 +1083,10 @@ public final class JpsRemoteProto { result.filePath_ = java.util.Collections.unmodifiableList(result.filePath_); } + if (result.artifactName_ != java.util.Collections.EMPTY_LIST) { + result.artifactName_ = + java.util.Collections.unmodifiableList(result.artifactName_); + } org.jetbrains.jps.api.JpsRemoteProto.Message.Request.CompilationRequest returnMe = result; result = null; return returnMe; @@ -1084,6 +1112,12 @@ public final class JpsRemoteProto { } result.filePath_.addAll(other.filePath_); } + if (!other.artifactName_.isEmpty()) { + if (result.artifactName_.isEmpty()) { + result.artifactName_ = new java.util.ArrayList(); + } + result.artifactName_.addAll(other.artifactName_); + } return this; } @@ -1122,6 +1156,10 @@ public final class JpsRemoteProto { addFilePath(input.readString()); break; } + case 42: { + addArtifactName(input.readString()); + break; + } } } } @@ -1249,6 +1287,46 @@ public final class JpsRemoteProto { return this; } + // repeated string artifact_name = 5; + public java.util.List getArtifactNameList() { + return java.util.Collections.unmodifiableList(result.artifactName_); + } + public int getArtifactNameCount() { + return result.getArtifactNameCount(); + } + public java.lang.String getArtifactName(int index) { + return result.getArtifactName(index); + } + public Builder setArtifactName(int index, java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + result.artifactName_.set(index, value); + return this; + } + public Builder addArtifactName(java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + if (result.artifactName_.isEmpty()) { + result.artifactName_ = new java.util.ArrayList(); + } + result.artifactName_.add(value); + return this; + } + public Builder addAllArtifactName( + java.lang.Iterable values) { + if (result.artifactName_.isEmpty()) { + result.artifactName_ = new java.util.ArrayList(); + } + super.addAll(values, result.artifactName_); + return this; + } + public Builder clearArtifactName() { + result.artifactName_ = java.util.Collections.emptyList(); + return this; + } + // @@protoc_insertion_point(builder_scope:org.jetbrains.jpsservice.Message.Request.CompilationRequest) } diff --git a/jps/jps-builders/src/org/jetbrains/jps/api/ProtoUtil.java b/jps/jps-builders/src/org/jetbrains/jps/api/ProtoUtil.java index 681baf46a0d8..e2646765706d 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/api/ProtoUtil.java +++ b/jps/jps-builders/src/org/jetbrains/jps/api/ProtoUtil.java @@ -28,20 +28,23 @@ public class ProtoUtil { return builder.build(); } - public static JpsRemoteProto.Message.Request createMakeRequest(String project, Collection modules) { - return createCompileRequest(JpsRemoteProto.Message.Request.CompilationRequest.Type.MAKE, project, modules, Collections.emptyList()); + public static JpsRemoteProto.Message.Request createMakeRequest(String project, Collection modules, Collection artifacts) { + return createCompileRequest(JpsRemoteProto.Message.Request.CompilationRequest.Type.MAKE, project, modules, artifacts, Collections.emptyList()); } - public static JpsRemoteProto.Message.Request createForceCompileRequest(String project, Collection modules, Collection paths) { - return createCompileRequest(JpsRemoteProto.Message.Request.CompilationRequest.Type.FORCED_COMPILATION, project, modules, paths); + public static JpsRemoteProto.Message.Request createForceCompileRequest(String project, + Collection modules, + Collection artifacts, Collection paths) { + return createCompileRequest(JpsRemoteProto.Message.Request.CompilationRequest.Type.FORCED_COMPILATION, project, modules, artifacts, paths); } public static JpsRemoteProto.Message.Request createRebuildRequest(String project) { - return createCompileRequest(JpsRemoteProto.Message.Request.CompilationRequest.Type.REBUILD, project, Collections.emptyList(), Collections.emptyList()); + return createCompileRequest(JpsRemoteProto.Message.Request.CompilationRequest.Type.REBUILD, project, Collections.emptyList(), + Collections.emptyList(), Collections.emptyList()); } - public static JpsRemoteProto.Message.Request createCleanRequest(String project, Collection modules) { - return createCompileRequest(JpsRemoteProto.Message.Request.CompilationRequest.Type.CLEAN, project, modules, Collections.emptyList()); + public static JpsRemoteProto.Message.Request createCleanRequest(String project, Collection modules, Collection artifacts) { + return createCompileRequest(JpsRemoteProto.Message.Request.CompilationRequest.Type.CLEAN, project, modules, artifacts, Collections.emptyList()); } public static JpsRemoteProto.Message.Request createCancelRequest(UUID compileSessionId) { @@ -50,13 +53,17 @@ public class ProtoUtil { return JpsRemoteProto.Message.Request.newBuilder().setRequestType(JpsRemoteProto.Message.Request.Type.CANCEL_BUILD_COMMAND).setCancelBuildCommand(builder.build()).build(); } - public static JpsRemoteProto.Message.Request createCompileRequest(final JpsRemoteProto.Message.Request.CompilationRequest.Type command, String project, Collection modules, Collection paths) { + public static JpsRemoteProto.Message.Request createCompileRequest(final JpsRemoteProto.Message.Request.CompilationRequest.Type command, String project, Collection modules, + Collection artifacts, Collection paths) { final JpsRemoteProto.Message.Request.CompilationRequest.Builder builder = JpsRemoteProto.Message.Request.CompilationRequest.newBuilder().setCommandType( command); builder.setProjectId(project); if (modules.size() > 0) { builder.addAllModuleName(modules); } + if (artifacts.size() > 0) { + builder.addAllArtifactName(artifacts); + } if (paths.size() > 0) { builder.addAllFilePath(paths); } diff --git a/jps/jps-builders/src/org/jetbrains/jps/client/CompileServerClient.java b/jps/jps-builders/src/org/jetbrains/jps/client/CompileServerClient.java index 474227367a40..139eaa703e74 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/client/CompileServerClient.java +++ b/jps/jps-builders/src/org/jetbrains/jps/client/CompileServerClient.java @@ -27,11 +27,12 @@ public class CompileServerClient extends SimpleProtobufClient modules, Collection paths, JpsServerResponseHandler handler) throws Exception{ + public RequestFuture sendCompileRequest(boolean isMake, String projectId, Collection modules, final Collection artifacts, + Collection paths, JpsServerResponseHandler handler) throws Exception{ checkConnected(); final JpsRemoteProto.Message.Request request = isMake? - ProtoUtil.createMakeRequest(projectId, modules) : - ProtoUtil.createForceCompileRequest(projectId, modules, paths); + ProtoUtil.createMakeRequest(projectId, modules, artifacts) : + ProtoUtil.createForceCompileRequest(projectId, modules, artifacts, paths); return sendRequest(request, handler); } diff --git a/jps/jps-builders/src/org/jetbrains/jps/incremental/artifacts/ArtifactSourceFilesState.java b/jps/jps-builders/src/org/jetbrains/jps/incremental/artifacts/ArtifactSourceFilesState.java index 5adc718077ec..cd7e73175785 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/incremental/artifacts/ArtifactSourceFilesState.java +++ b/jps/jps-builders/src/org/jetbrains/jps/incremental/artifacts/ArtifactSourceFilesState.java @@ -2,6 +2,7 @@ package org.jetbrains.jps.incremental.artifacts; import com.intellij.openapi.util.io.FileUtil; import com.intellij.util.ArrayUtil; +import org.jetbrains.annotations.NotNull; import org.jetbrains.jps.Project; import org.jetbrains.jps.ProjectPaths; import org.jetbrains.jps.artifacts.Artifact; @@ -37,13 +38,13 @@ public class ArtifactSourceFilesState { public ArtifactSourceFilesState(Artifact artifact, int artifactId, Project project, ModuleRootsIndex rootsIndex, ArtifactSourceTimestampStorage timestampStorage, - File artifactsDataDir) { + File mappingsDir) { myProject = project; myArtifact = artifact; myRootsIndex = rootsIndex; myTimestampStorage = timestampStorage; myArtifactId = artifactId; - myMappingsFile = new File(artifactsDataDir, "mappings" + File.separator + artifactId); + myMappingsFile = new File(mappingsDir, String.valueOf(artifactId)); } public ArtifactSourceToOutputMapping getOrCreateMapping() throws Exception { @@ -161,20 +162,29 @@ public class ArtifactSourceFilesState { } for (String filePath : changedFiles) { final ArtifactSourceTimestampStorage.PerArtifactTimestamp[] state = myTimestampStorage.getState(filePath); - if (state == null) continue; - for (int i = 0, length = state.length; i < length; i++) { - if (state[i].myArtifactId == myArtifactId) { - File file = new File(FileUtil.toSystemDependentName(filePath)); - state[i] = new ArtifactSourceTimestampStorage.PerArtifactTimestamp(myArtifactId, file.lastModified()); - myTimestampStorage.update(filePath, state); - break; - } - } + File file = new File(FileUtil.toSystemDependentName(filePath)); + final long timestamp = file.lastModified(); + myTimestampStorage.update(filePath, updateTimestamp(state, timestamp)); } myDeletedFiles.clear(); myChangedFiles.clear(); } + @NotNull + private ArtifactSourceTimestampStorage.PerArtifactTimestamp[] updateTimestamp(ArtifactSourceTimestampStorage.PerArtifactTimestamp[] oldState, long timestamp) { + final ArtifactSourceTimestampStorage.PerArtifactTimestamp newItem = new ArtifactSourceTimestampStorage.PerArtifactTimestamp(myArtifactId, timestamp); + if (oldState == null) { + return new ArtifactSourceTimestampStorage.PerArtifactTimestamp[]{newItem}; + } + for (int i = 0, length = oldState.length; i < length; i++) { + if (oldState[i].myArtifactId == myArtifactId) { + oldState[i] = newItem; + return oldState; + } + } + return ArrayUtil.append(oldState, newItem); + } + public void close() throws IOException { if (myMapping != null) { myMapping.close(); diff --git a/jps/jps-builders/src/org/jetbrains/jps/incremental/artifacts/ArtifactsBuildData.java b/jps/jps-builders/src/org/jetbrains/jps/incremental/artifacts/ArtifactsBuildData.java index 7722afe014be..00ac633bb22f 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/incremental/artifacts/ArtifactsBuildData.java +++ b/jps/jps-builders/src/org/jetbrains/jps/incremental/artifacts/ArtifactsBuildData.java @@ -18,19 +18,21 @@ public class ArtifactsBuildData { private final ArtifactSourceTimestampStorage myTimestampStorage; private ArtifactCompilerPersistentData myPersistentData; private final File myArtifactsDataDir; + private final File myMappingsDir; public ArtifactsBuildData(File artifactsDataDir) throws Exception { myArtifactsDataDir = artifactsDataDir; myTimestampStorage = new ArtifactSourceTimestampStorage(new File(artifactsDataDir, "timestamps")); myArtifactState = new HashMap(); myPersistentData = new ArtifactCompilerPersistentData(artifactsDataDir); + myMappingsDir = new File(myArtifactsDataDir, "mappings"); } public ArtifactSourceFilesState getOrCreateState(Artifact artifact, Project project, ModuleRootsIndex index) { ArtifactSourceFilesState state = myArtifactState.get(artifact); if (state == null) { final int artifactId = myPersistentData.getId(artifact.getName()); - state = new ArtifactSourceFilesState(artifact, artifactId, project, index, myTimestampStorage, myArtifactsDataDir); + state = new ArtifactSourceFilesState(artifact, artifactId, project, index, myTimestampStorage, myMappingsDir); myArtifactState.put(artifact, state); } return state; @@ -42,7 +44,8 @@ public class ArtifactsBuildData { for (ArtifactSourceFilesState state : myArtifactState.values()) { state.clean(); } - FileUtil.delete(myArtifactsDataDir); + myArtifactState.clear(); + FileUtil.delete(myMappingsDir); } public void close() throws IOException { diff --git a/jps/jps-builders/src/org/jetbrains/jps/server/ServerMessageHandler.java b/jps/jps-builders/src/org/jetbrains/jps/server/ServerMessageHandler.java index cf00e51af4b0..d2aa631fc435 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/server/ServerMessageHandler.java +++ b/jps/jps-builders/src/org/jetbrains/jps/server/ServerMessageHandler.java @@ -187,8 +187,8 @@ class ServerMessageHandler extends SimpleChannelHandler { case REBUILD: { channelContext.setAttachment(sessionId); final BuildType buildType = convertCompileType(compileType); - final CompilationTask task = new CompilationTask( - sessionId, channelContext, projectId, buildType, compileRequest.getModuleNameList(), Collections.emptySet(), compileRequest.getFilePathList()); + final CompilationTask task = new CompilationTask(sessionId, channelContext, projectId, buildType, compileRequest.getModuleNameList(), + compileRequest.getArtifactNameList(), compileRequest.getFilePathList()); final RunnableFuture future = getCompileTaskExecutor(projectId).submit(task); myBuildsInProgress.add(new Pair(future, task)); return null; From aace22a3d5de4f12f16f2c4862985ebe7b2c0f03 Mon Sep 17 00:00:00 2001 From: "Maxim.Medvedev" Date: Mon, 6 Feb 2012 13:20:32 +0400 Subject: [PATCH 006/215] enter handler for regexes. --- .../processors/GroovyIndentProcessor.java | 9 +- .../actions/GroovyEditorActionUtil.java | 24 +-- .../editor/actions/GroovyEnterHandler.java | 140 ++++++++++++++---- .../lang/formatter/EnterActionTest.groovy | 11 ++ .../groovy/enterAction/multilineIndent2.test | 16 ++ .../testdata/groovy/enterAction/regex1.test | 8 + .../testdata/groovy/enterAction/regex10.test | 8 + .../testdata/groovy/enterAction/regex2.test | 10 ++ .../testdata/groovy/enterAction/regex3.test | 8 + .../testdata/groovy/enterAction/regex4.test | 8 + .../testdata/groovy/enterAction/regex5.test | 8 + .../testdata/groovy/enterAction/regex6.test | 8 + .../testdata/groovy/enterAction/regex7.test | 10 ++ .../testdata/groovy/enterAction/regex8.test | 8 + .../testdata/groovy/enterAction/regex9.test | 8 + 15 files changed, 230 insertions(+), 54 deletions(-) create mode 100644 plugins/groovy/testdata/groovy/enterAction/multilineIndent2.test create mode 100644 plugins/groovy/testdata/groovy/enterAction/regex1.test create mode 100644 plugins/groovy/testdata/groovy/enterAction/regex10.test create mode 100644 plugins/groovy/testdata/groovy/enterAction/regex2.test create mode 100644 plugins/groovy/testdata/groovy/enterAction/regex3.test create mode 100644 plugins/groovy/testdata/groovy/enterAction/regex4.test create mode 100644 plugins/groovy/testdata/groovy/enterAction/regex5.test create mode 100644 plugins/groovy/testdata/groovy/enterAction/regex6.test create mode 100644 plugins/groovy/testdata/groovy/enterAction/regex7.test create mode 100644 plugins/groovy/testdata/groovy/enterAction/regex8.test create mode 100644 plugins/groovy/testdata/groovy/enterAction/regex9.test diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/formatter/processors/GroovyIndentProcessor.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/formatter/processors/GroovyIndentProcessor.java index 1ae7a5e18634..3272fd5d8b92 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/formatter/processors/GroovyIndentProcessor.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/formatter/processors/GroovyIndentProcessor.java @@ -22,10 +22,10 @@ import com.intellij.psi.PsiElement; import com.intellij.psi.codeStyle.CodeStyleSettingsManager; import com.intellij.psi.codeStyle.CommonCodeStyleSettings; import com.intellij.psi.tree.IElementType; +import com.intellij.psi.tree.TokenSet; import org.jetbrains.annotations.NotNull; import org.jetbrains.plugins.groovy.GroovyFileType; import org.jetbrains.plugins.groovy.formatter.GroovyBlock; -import org.jetbrains.plugins.groovy.lang.editor.actions.GroovyEditorActionUtil; import org.jetbrains.plugins.groovy.lang.groovydoc.psi.api.GrDocComment; import org.jetbrains.plugins.groovy.lang.groovydoc.psi.api.GrDocTag; import org.jetbrains.plugins.groovy.lang.parser.GroovyElementTypes; @@ -50,6 +50,7 @@ import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.members.GrMe */ public abstract class GroovyIndentProcessor implements GroovyElementTypes { public static final int GDOC_COMMENT_INDENT = 1; + private static TokenSet GSTRING_TOKENS_INNER = TokenSet.create(mGSTRING_BEGIN,mGSTRING_CONTENT,mGSTRING_END,mDOLLAR); /** * Calculates indent, based on code style, between parent block and child node @@ -72,14 +73,12 @@ public abstract class GroovyIndentProcessor implements GroovyElementTypes { return Indent.getContinuationIndent(); } - if (GroovyEditorActionUtil.GSTRING_TOKENS_INNER.contains(child.getElementType()) && - mGSTRING_BEGIN != child.getElementType()) { + if (GSTRING_TOKENS_INNER.contains(child.getElementType()) && mGSTRING_BEGIN != child.getElementType()) { return Indent.getAbsoluteNoneIndent(); } if (psiParent instanceof GrListOrMap) { - if (mLBRACK.equals(child.getElementType()) || - mRBRACK.equals(child.getElementType())) { + if (mLBRACK.equals(child.getElementType()) || mRBRACK.equals(child.getElementType())) { return Indent.getNoneIndent(); } else { return Indent.getContinuationWithoutFirstIndent(); diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/editor/actions/GroovyEditorActionUtil.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/editor/actions/GroovyEditorActionUtil.java index 0af2055bc353..9cb94a190826 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/editor/actions/GroovyEditorActionUtil.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/editor/actions/GroovyEditorActionUtil.java @@ -23,12 +23,13 @@ import com.intellij.openapi.project.Project; import com.intellij.openapi.util.text.StringUtil; import com.intellij.psi.PsiElement; import com.intellij.psi.codeStyle.CodeStyleSettingsManager; -import com.intellij.psi.tree.TokenSet; import org.jetbrains.plugins.groovy.GroovyFileType; -import org.jetbrains.plugins.groovy.lang.lexer.GroovyTokenTypes; import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.literals.GrLiteral; import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.literals.GrString; +import static org.jetbrains.plugins.groovy.lang.lexer.GroovyTokenTypes.mGSTRING_LITERAL; +import static org.jetbrains.plugins.groovy.lang.lexer.GroovyTokenTypes.mSTRING_LITERAL; + /** * @author ilyas */ @@ -66,7 +67,7 @@ public class GroovyEditorActionUtil { if (child != null && child.getNode() != null) { ASTNode node = child.getNode(); assert node != null; - return node.getElementType() == GroovyTokenTypes.mSTRING_LITERAL; + return node.getElementType() == mSTRING_LITERAL; } return false; } @@ -76,23 +77,8 @@ public class GroovyEditorActionUtil { if (child != null && child.getNode() != null) { ASTNode node = child.getNode(); assert node != null; - return node.getElementType() == GroovyTokenTypes.mGSTRING_LITERAL; + return node.getElementType() == mGSTRING_LITERAL; } return false; } - - public static TokenSet GSTRING_TOKENS = TokenSet.create( - GroovyTokenTypes.mGSTRING_BEGIN, - GroovyTokenTypes.mGSTRING_CONTENT, - GroovyTokenTypes.mGSTRING_END, - GroovyTokenTypes.mGSTRING_LITERAL, - GroovyTokenTypes.mDOLLAR - ); - - public static TokenSet GSTRING_TOKENS_INNER = TokenSet.create( - GroovyTokenTypes.mGSTRING_BEGIN, - GroovyTokenTypes.mGSTRING_CONTENT, - GroovyTokenTypes.mGSTRING_END, - GroovyTokenTypes.mDOLLAR - ); } diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/editor/actions/GroovyEnterHandler.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/editor/actions/GroovyEnterHandler.java index b7df458df553..d615a8774470 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/editor/actions/GroovyEnterHandler.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/editor/actions/GroovyEnterHandler.java @@ -50,13 +50,64 @@ import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrRefere import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.literals.GrLiteral; import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.literals.GrStringInjection; -import static org.jetbrains.plugins.groovy.lang.lexer.GroovyTokenTypes.*; +import static org.jetbrains.plugins.groovy.lang.lexer.GroovyTokenTypes.mCLOSABLE_BLOCK_OP; +import static org.jetbrains.plugins.groovy.lang.lexer.GroovyTokenTypes.mDOLLAR; +import static org.jetbrains.plugins.groovy.lang.lexer.GroovyTokenTypes.mDOLLAR_SLASH_REGEX_BEGIN; +import static org.jetbrains.plugins.groovy.lang.lexer.GroovyTokenTypes.mDOLLAR_SLASH_REGEX_CONTENT; +import static org.jetbrains.plugins.groovy.lang.lexer.GroovyTokenTypes.mDOLLAR_SLASH_REGEX_END; +import static org.jetbrains.plugins.groovy.lang.lexer.GroovyTokenTypes.mDOLLAR_SLASH_REGEX_LITERAL; +import static org.jetbrains.plugins.groovy.lang.lexer.GroovyTokenTypes.mGSTRING_BEGIN; +import static org.jetbrains.plugins.groovy.lang.lexer.GroovyTokenTypes.mGSTRING_CONTENT; +import static org.jetbrains.plugins.groovy.lang.lexer.GroovyTokenTypes.mGSTRING_END; +import static org.jetbrains.plugins.groovy.lang.lexer.GroovyTokenTypes.mGSTRING_LITERAL; +import static org.jetbrains.plugins.groovy.lang.lexer.GroovyTokenTypes.mIDENT; +import static org.jetbrains.plugins.groovy.lang.lexer.GroovyTokenTypes.mLBRACK; +import static org.jetbrains.plugins.groovy.lang.lexer.GroovyTokenTypes.mLCURLY; +import static org.jetbrains.plugins.groovy.lang.lexer.GroovyTokenTypes.mNLS; +import static org.jetbrains.plugins.groovy.lang.lexer.GroovyTokenTypes.mRBRACK; +import static org.jetbrains.plugins.groovy.lang.lexer.GroovyTokenTypes.mRCURLY; +import static org.jetbrains.plugins.groovy.lang.lexer.GroovyTokenTypes.mREGEX_BEGIN; +import static org.jetbrains.plugins.groovy.lang.lexer.GroovyTokenTypes.mREGEX_CONTENT; +import static org.jetbrains.plugins.groovy.lang.lexer.GroovyTokenTypes.mREGEX_END; +import static org.jetbrains.plugins.groovy.lang.lexer.GroovyTokenTypes.mREGEX_LITERAL; +import static org.jetbrains.plugins.groovy.lang.lexer.GroovyTokenTypes.mSTRING_LITERAL; +import static org.jetbrains.plugins.groovy.lang.parser.GroovyElementTypes.*; /** * @author ilyas */ public class GroovyEnterHandler extends EnterHandlerDelegateAdapter { + private static final TokenSet GSTRING_TOKENS = TokenSet.create(mGSTRING_BEGIN, mGSTRING_CONTENT, mGSTRING_END, mGSTRING_LITERAL); + + private static final TokenSet REGEX_TOKENS = TokenSet.create(mREGEX_BEGIN, mREGEX_CONTENT, mREGEX_END, mDOLLAR_SLASH_REGEX_BEGIN, + mDOLLAR_SLASH_REGEX_CONTENT, mDOLLAR_SLASH_REGEX_END); + + private static final TokenSet AFTER_DOLLAR = TokenSet.create(mLCURLY, mIDENT, mGSTRING_CONTENT, mDOLLAR, mGSTRING_END, mREGEX_CONTENT, + mDOLLAR_SLASH_REGEX_CONTENT, mREGEX_END, mDOLLAR_SLASH_REGEX_END); + + private static final TokenSet ALL_STRINGS = TokenSet.create(mSTRING_LITERAL, mGSTRING_LITERAL, mGSTRING_BEGIN, mGSTRING_END, + mGSTRING_CONTENT, mRCURLY, mIDENT, mDOLLAR, mREGEX_BEGIN, mREGEX_CONTENT, + mREGEX_END, mDOLLAR_SLASH_REGEX_BEGIN, mDOLLAR_SLASH_REGEX_CONTENT, + mDOLLAR_SLASH_REGEX_END, mREGEX_LITERAL, mDOLLAR_SLASH_REGEX_LITERAL); + + private static final TokenSet BEFORE_DOLLAR =TokenSet.create(mGSTRING_BEGIN, mGSTRING_CONTENT, mREGEX_BEGIN, mREGEX_CONTENT, + mDOLLAR_SLASH_REGEX_BEGIN, mDOLLAR_SLASH_REGEX_CONTENT); + + private static final TokenSet EXPR_END = TokenSet.create(mRCURLY, mIDENT); + + private static final TokenSet AFTER_EXPR_END = TokenSet.create(mGSTRING_END, mGSTRING_CONTENT, mDOLLAR, mREGEX_END, mREGEX_CONTENT, + mDOLLAR_SLASH_REGEX_END, mDOLLAR_SLASH_REGEX_CONTENT); + + private static final TokenSet STRING_END = TokenSet.create(mSTRING_LITERAL, mGSTRING_LITERAL, mGSTRING_END, mREGEX_END, + mDOLLAR_SLASH_REGEX_END, mREGEX_LITERAL, mDOLLAR_SLASH_REGEX_LITERAL); + + private static final TokenSet INNER_STRING_TOKENS = TokenSet.create(mGSTRING_BEGIN, mGSTRING_CONTENT, mGSTRING_END, mREGEX_BEGIN, + mREGEX_CONTENT, mREGEX_END, mDOLLAR_SLASH_REGEX_BEGIN, + mDOLLAR_SLASH_REGEX_CONTENT, mDOLLAR_SLASH_REGEX_END, + GSTRING_INJECTION); + + public Result preprocessEnter(@NotNull PsiFile file, @NotNull Editor editor, @NotNull Ref caretOffset, @@ -204,22 +255,6 @@ public class GroovyEnterHandler extends EnterHandlerDelegateAdapter { return false; } - private static final TokenSet AFTER_DOLLAR = TokenSet.create(mLCURLY, mIDENT, mGSTRING_CONTENT, mDOLLAR, mGSTRING_END); - - private static final TokenSet ALL_STRINGS = TokenSet - .create(mSTRING_LITERAL, mGSTRING_LITERAL, mGSTRING_BEGIN, mGSTRING_END, mGSTRING_CONTENT, mRCURLY, mIDENT, mDOLLAR, mREGEX_BEGIN, - mREGEX_CONTENT, mREGEX_END, mDOLLAR_SLASH_REGEX_BEGIN, mDOLLAR_SLASH_REGEX_CONTENT, mDOLLAR_SLASH_REGEX_END, mREGEX_LITERAL, - mDOLLAR_SLASH_REGEX_LITERAL); - - private static final TokenSet BEFORE_DOLLAR = TokenSet.create(mGSTRING_BEGIN, mGSTRING_CONTENT); - - private static final TokenSet EXPR_END = TokenSet.create(mRCURLY, mIDENT); - - private static final TokenSet AFTER_EXPR_END = TokenSet.create(mGSTRING_END, mGSTRING_CONTENT, mDOLLAR); - - private static final TokenSet STRING_END = TokenSet.create(mSTRING_LITERAL, mGSTRING_LITERAL, mGSTRING_END); - - private static boolean handleInString(Editor editor, int caretOffset, DataContext dataContext, EditorActionHandler originalHandler) { Project project = PlatformDataKeys.PROJECT.getData(dataContext); if (project == null) return false; @@ -241,6 +276,16 @@ public class GroovyEnterHandler extends EnterHandlerDelegateAdapter { ASTNode node = stringElement.getNode(); if (node == null) return false; + // For expression injection in GString like "abc ${} abc" + if (!INNER_STRING_TOKENS.contains(node.getElementType()) && checkGStringInjection(stringElement)) { + stringElement = stringElement.getParent().getParent().getNextSibling(); + if (stringElement == null) return false; + node = stringElement.getNode(); + if (node == null) return false; + } + + boolean isInsertIndent = isInsertIndent(caretOffset, stringElement.getTextRange().getStartOffset(), fileText); + // For simple String literals like 'abcdef' if (mSTRING_LITERAL == node.getElementType()) { if (GroovyEditorActionUtil.isPlainStringLiteral(node)) { @@ -258,20 +303,13 @@ public class GroovyEnterHandler extends EnterHandlerDelegateAdapter { EditorModificationUtil.insertStringAtCaret(editor, "\n"); } else { - originalHandler.execute(editor, dataContext); + insertLineFeedInString(editor, dataContext, originalHandler, isInsertIndent); } return true; } - // For expression injection in GString like "abc ${} abc" - if (!GroovyEditorActionUtil.GSTRING_TOKENS.contains(node.getElementType()) && checkGStringInnerExpression(stringElement)) { - stringElement = stringElement.getParent().getParent().getNextSibling(); - if (stringElement == null) return false; - node = stringElement.getNode(); - if (node == null) return false; - } - - if (GroovyEditorActionUtil.GSTRING_TOKENS.contains(node.getElementType())) { + if (GSTRING_TOKENS.contains(node.getElementType()) || + node.getElementType() == mDOLLAR && node.getTreeParent().getTreeParent().getElementType() == GSTRING) { PsiElement parent = stringElement.getParent(); if (node.getElementType() == mGSTRING_LITERAL) { parent = stringElement; @@ -296,13 +334,55 @@ public class GroovyEnterHandler extends EnterHandlerDelegateAdapter { } } else { - originalHandler.execute(editor, dataContext); + insertLineFeedInString(editor, dataContext, originalHandler, isInsertIndent); } return true; } + + if (REGEX_TOKENS.contains(node.getElementType()) || + node.getElementType() == mDOLLAR && node.getTreeParent().getTreeParent().getElementType() == REGEX) { + PsiElement parent = stringElement.getParent(); + if (node.getElementType() == mREGEX_LITERAL || node.getElementType() == mDOLLAR_SLASH_REGEX_LITERAL) { + parent = stringElement; + } + else { + while (parent != null && !(parent instanceof GrLiteral)) { + parent = parent.getParent(); + } + } + if (parent == null || parent.getLastChild() instanceof PsiErrorElement) return false; + PsiElement exprSibling = stringElement.getNextSibling(); + boolean rightFromDollar = exprSibling instanceof GrExpression && exprSibling.getTextRange().getStartOffset() == caretOffset; + if (rightFromDollar) { + editor.getCaretModel().moveToOffset(caretOffset - 1); + } + insertLineFeedInString(editor, dataContext, originalHandler, isInsertIndent); + if (rightFromDollar) { + editor.getCaretModel().moveCaretRelatively(1, 0, false, false, true); + } + return true; + } + return false; } + private static void insertLineFeedInString(Editor editor, + DataContext dataContext, + EditorActionHandler originalHandler, + boolean isInsertIndent) { + if (isInsertIndent) { + originalHandler.execute(editor, dataContext); + } + else { + EditorModificationUtil.insertStringAtCaret(editor, "\n"); + } + } + + private static boolean isInsertIndent(int caret, int stringOffset, String text) { + final int i = text.indexOf('\n', stringOffset); + return stringOffset < i && i < caret; + } + private static void convertEndToMultiline(int caretOffset, Document document, String fileText) { if (caretOffset < fileText.length() && fileText.charAt(caretOffset) == '\'' || caretOffset > 0 && fileText.charAt(caretOffset - 1) == '\'') { @@ -339,13 +419,13 @@ public class GroovyEnterHandler extends EnterHandlerDelegateAdapter { return true; } - private static boolean checkGStringInnerExpression(PsiElement element) { + private static boolean checkGStringInjection(PsiElement element) { if (element != null && (element.getParent() instanceof GrReferenceExpression || element.getParent() instanceof GrClosableBlock)) { final PsiElement parent = element.getParent().getParent(); if (!(parent instanceof GrStringInjection)) return false; PsiElement nextSibling = parent.getNextSibling(); if (nextSibling == null) return false; - return GroovyEditorActionUtil.GSTRING_TOKENS_INNER.contains(nextSibling.getNode().getElementType()); + return INNER_STRING_TOKENS.contains(nextSibling.getNode().getElementType()); } return false; } diff --git a/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/formatter/EnterActionTest.groovy b/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/formatter/EnterActionTest.groovy index f6ac881554e1..7403202ad786 100644 --- a/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/formatter/EnterActionTest.groovy +++ b/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/formatter/EnterActionTest.groovy @@ -81,6 +81,7 @@ public class EnterActionTest extends GroovyFormatterTestCase { public void testGstring8() throws Throwable { doTest(); } public void testGstring9() throws Throwable { doTest(); } public void testMultilineIndent() throws Throwable { doTest(); } + public void testMultilineIndent2() throws Throwable { doTest(); } public void testSpaces1() throws Throwable { doTest(); } public void testString1() throws Throwable { doTest(); } public void testString2() throws Throwable { doTest(); } @@ -92,6 +93,16 @@ public class EnterActionTest extends GroovyFormatterTestCase { public void testString8() throws Throwable { doTest(); } public void testString9() throws Throwable { doTest(); } public void testString10() throws Throwable { doTest(); } + public void testRegex1() {doTest()} + public void testRegex2() {doTest()} + public void testRegex3() {doTest()} + public void testRegex4() {doTest()} + public void testRegex5() {doTest()} + public void testRegex6() {doTest()} + public void testRegex7() {doTest()} + public void testRegex8() {doTest()} + public void testRegex9() {doTest()} + public void testRegex10() {doTest()} def doTest(String before, String after) { myFixture.configureByText("a.groovy", before) diff --git a/plugins/groovy/testdata/groovy/enterAction/multilineIndent2.test b/plugins/groovy/testdata/groovy/enterAction/multilineIndent2.test new file mode 100644 index 000000000000..e4504d8a5828 --- /dev/null +++ b/plugins/groovy/testdata/groovy/enterAction/multilineIndent2.test @@ -0,0 +1,16 @@ +def foo() { + ''' +class Foo { + void foo() {} +} +''' +} +----- +def foo() { + ''' + +class Foo { + void foo() {} +} +''' +} \ No newline at end of file diff --git a/plugins/groovy/testdata/groovy/enterAction/regex1.test b/plugins/groovy/testdata/groovy/enterAction/regex1.test new file mode 100644 index 000000000000..ce149fef825a --- /dev/null +++ b/plugins/groovy/testdata/groovy/enterAction/regex1.test @@ -0,0 +1,8 @@ +cl { + /abc/ +} +----- +cl { + /a +bc/ +} \ No newline at end of file diff --git a/plugins/groovy/testdata/groovy/enterAction/regex10.test b/plugins/groovy/testdata/groovy/enterAction/regex10.test new file mode 100644 index 000000000000..20bd1f184d11 --- /dev/null +++ b/plugins/groovy/testdata/groovy/enterAction/regex10.test @@ -0,0 +1,8 @@ +cl { + $/a${}bc/$ +} +----- +cl { + $/a +${}bc/$ +} \ No newline at end of file diff --git a/plugins/groovy/testdata/groovy/enterAction/regex2.test b/plugins/groovy/testdata/groovy/enterAction/regex2.test new file mode 100644 index 000000000000..582ae04d4943 --- /dev/null +++ b/plugins/groovy/testdata/groovy/enterAction/regex2.test @@ -0,0 +1,10 @@ +cl { + /a + bbc/ +} +----- +cl { + /a + b + bc/ +} \ No newline at end of file diff --git a/plugins/groovy/testdata/groovy/enterAction/regex3.test b/plugins/groovy/testdata/groovy/enterAction/regex3.test new file mode 100644 index 000000000000..8229dff4652c --- /dev/null +++ b/plugins/groovy/testdata/groovy/enterAction/regex3.test @@ -0,0 +1,8 @@ +cl { + /a${}bc/ +} +----- +cl { + /a${} +bc/ +} \ No newline at end of file diff --git a/plugins/groovy/testdata/groovy/enterAction/regex4.test b/plugins/groovy/testdata/groovy/enterAction/regex4.test new file mode 100644 index 000000000000..639854265834 --- /dev/null +++ b/plugins/groovy/testdata/groovy/enterAction/regex4.test @@ -0,0 +1,8 @@ +cl { + /a${}bc/ +} +----- +cl { + /a +${}bc/ +} \ No newline at end of file diff --git a/plugins/groovy/testdata/groovy/enterAction/regex5.test b/plugins/groovy/testdata/groovy/enterAction/regex5.test new file mode 100644 index 000000000000..858a5220a76c --- /dev/null +++ b/plugins/groovy/testdata/groovy/enterAction/regex5.test @@ -0,0 +1,8 @@ +cl { + /a${}bc/ +} +----- +cl { + /a +${}bc/ +} \ No newline at end of file diff --git a/plugins/groovy/testdata/groovy/enterAction/regex6.test b/plugins/groovy/testdata/groovy/enterAction/regex6.test new file mode 100644 index 000000000000..cc1d0448e268 --- /dev/null +++ b/plugins/groovy/testdata/groovy/enterAction/regex6.test @@ -0,0 +1,8 @@ +cl { + $/abc/$ +} +----- +cl { + $/a +bc/$ +} \ No newline at end of file diff --git a/plugins/groovy/testdata/groovy/enterAction/regex7.test b/plugins/groovy/testdata/groovy/enterAction/regex7.test new file mode 100644 index 000000000000..5697e7e7a742 --- /dev/null +++ b/plugins/groovy/testdata/groovy/enterAction/regex7.test @@ -0,0 +1,10 @@ +cl { + $/a + bbc/$ +} +----- +cl { + $/a + b + bc/$ +} \ No newline at end of file diff --git a/plugins/groovy/testdata/groovy/enterAction/regex8.test b/plugins/groovy/testdata/groovy/enterAction/regex8.test new file mode 100644 index 000000000000..5b2bfc9de036 --- /dev/null +++ b/plugins/groovy/testdata/groovy/enterAction/regex8.test @@ -0,0 +1,8 @@ +cl { + $/a${}bc/$ +} +----- +cl { + $/a${} +bc/$ +} \ No newline at end of file diff --git a/plugins/groovy/testdata/groovy/enterAction/regex9.test b/plugins/groovy/testdata/groovy/enterAction/regex9.test new file mode 100644 index 000000000000..7c61b1a3a30f --- /dev/null +++ b/plugins/groovy/testdata/groovy/enterAction/regex9.test @@ -0,0 +1,8 @@ +cl { + $/a${}bc/$ +} +----- +cl { + $/a +${}bc/$ +} \ No newline at end of file From cea1d3ab7167b4bf9f26eefd1e3f43bd904c7e9e Mon Sep 17 00:00:00 2001 From: anna Date: Mon, 6 Feb 2012 10:49:40 +0100 Subject: [PATCH 007/215] IRV: IDEA-80843 removal entries removes more than you expect --- .../ex/DescriptorProviderInspection.java | 19 +++++++++++++++++++ .../ui/ProblemDescriptionNode.java | 4 ++-- 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/platform/lang-impl/src/com/intellij/codeInspection/ex/DescriptorProviderInspection.java b/platform/lang-impl/src/com/intellij/codeInspection/ex/DescriptorProviderInspection.java index 2d8d5ec100a3..6503e871fc90 100644 --- a/platform/lang-impl/src/com/intellij/codeInspection/ex/DescriptorProviderInspection.java +++ b/platform/lang-impl/src/com/intellij/codeInspection/ex/DescriptorProviderInspection.java @@ -187,6 +187,14 @@ public abstract class DescriptorProviderInspection extends InspectionTool implem getIgnoredElements().put(refEntity, problemDescriptors); } + public void ignoreCurrentElementProblem(RefEntity refEntity, CommonProblemDescriptor descriptor) { + CommonProblemDescriptor[] descriptors = getIgnoredElements().get(refEntity); + if (descriptors == null) { + descriptors = new CommonProblemDescriptor[0]; + } + getIgnoredElements().put(refEntity, ArrayUtil.append(descriptors, descriptor)); + } + private static boolean isIgnoreProblem(QuickFix[] problemFixes, Set fixes, int idx){ if (problemFixes == null || fixes == null) { return true; @@ -451,6 +459,17 @@ public abstract class DescriptorProviderInspection extends InspectionTool implem return false; } + public boolean isProblemResolved(RefEntity refEntity, CommonProblemDescriptor descriptor) { + if (getIgnoredElements() == null) return false; + for (RefEntity entity : getIgnoredElements().keySet()) { + if (Comparing.equal(entity, refEntity)) { + final CommonProblemDescriptor[] descriptors = getIgnoredElements().get(refEntity); + return ArrayUtil.contains(descriptor, descriptors); + } + } + return false; + } + public FileStatus getProblemStatus(final CommonProblemDescriptor descriptor) { final GlobalInspectionContextImpl context = getContext(); if (context != null && context.getUIOptions().SHOW_DIFF_WITH_PREVIOUS_RUN){ diff --git a/platform/lang-impl/src/com/intellij/codeInspection/ui/ProblemDescriptionNode.java b/platform/lang-impl/src/com/intellij/codeInspection/ui/ProblemDescriptionNode.java index 2610ab6d0fb5..b92dab9a6384 100644 --- a/platform/lang-impl/src/com/intellij/codeInspection/ui/ProblemDescriptionNode.java +++ b/platform/lang-impl/src/com/intellij/codeInspection/ui/ProblemDescriptionNode.java @@ -95,11 +95,11 @@ public class ProblemDescriptionNode extends InspectionTreeNode { public boolean isResolved() { - return myElement instanceof RefElement && myTool.isElementIgnored(myElement); + return myElement instanceof RefElement && myTool.isProblemResolved(myElement, getDescriptor()); } public void ignoreElement() { - myTool.ignoreCurrentElement(getElement()); + myTool.ignoreCurrentElementProblem(getElement(), getDescriptor()); } public void amnesty() { From 1208dff07a4269d2fd06d2d159b4d4ae6e9219a0 Mon Sep 17 00:00:00 2001 From: anna Date: Mon, 6 Feb 2012 11:00:51 +0100 Subject: [PATCH 008/215] EA-33492 - IAE: AnnotationUtil.isAnnotated --- .../intellij/codeInspection/ex/EntryPointsManagerImpl.java | 2 +- .../unusedParameters/UnusedParametersInspection.java | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/java/java-impl/src/com/intellij/codeInspection/ex/EntryPointsManagerImpl.java b/java/java-impl/src/com/intellij/codeInspection/ex/EntryPointsManagerImpl.java index c1d316ff0914..0b0c60e7395d 100644 --- a/java/java-impl/src/com/intellij/codeInspection/ex/EntryPointsManagerImpl.java +++ b/java/java-impl/src/com/intellij/codeInspection/ex/EntryPointsManagerImpl.java @@ -432,7 +432,7 @@ public class EntryPointsManagerImpl implements PersistentStateComponent myAddNonJavaEntries = addNonJavaEntries; } - public boolean isEntryPoint(PsiModifierListOwner element) { + public boolean isEntryPoint(@NotNull PsiModifierListOwner element) { return AnnotationUtil.isAnnotated(element, ADDITIONAL_ANNOTATIONS) || AnnotationUtil.isAnnotated(element, getAdditionalAnnotations()); } diff --git a/java/java-impl/src/com/intellij/codeInspection/unusedParameters/UnusedParametersInspection.java b/java/java-impl/src/com/intellij/codeInspection/unusedParameters/UnusedParametersInspection.java index aed39b1e7802..2e32ea1a744d 100644 --- a/java/java-impl/src/com/intellij/codeInspection/unusedParameters/UnusedParametersInspection.java +++ b/java/java-impl/src/com/intellij/codeInspection/unusedParameters/UnusedParametersInspection.java @@ -74,7 +74,9 @@ public class UnusedParametersInspection extends GlobalJavaInspectionTool { if ((refMethod.isAbstract() || refMethod.getOwnerClass().isInterface()) && refMethod.getDerivedMethods().isEmpty()) return null; if (RefUtil.isEntryPoint(refMethod)) return null; - if (EntryPointsManagerImpl.getInstance(manager.getProject()).isEntryPoint(refMethod.getElement())) return null; + + final PsiModifierListOwner element = refMethod.getElement(); + if (element != null && EntryPointsManagerImpl.getInstance(manager.getProject()).isEntryPoint(element)) return null; if (refMethod.isAppMain()) return null; From cf0954606186683d1c7fe4e544568b4dd3c075b2 Mon Sep 17 00:00:00 2001 From: anna Date: Mon, 6 Feb 2012 11:34:43 +0100 Subject: [PATCH 009/215] accept qualified package names --- .../extractSuperclass/JavaExtractSuperBaseDialog.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/java/java-impl/src/com/intellij/refactoring/extractSuperclass/JavaExtractSuperBaseDialog.java b/java/java-impl/src/com/intellij/refactoring/extractSuperclass/JavaExtractSuperBaseDialog.java index 2e9b83218969..674b6b16fe65 100644 --- a/java/java-impl/src/com/intellij/refactoring/extractSuperclass/JavaExtractSuperBaseDialog.java +++ b/java/java-impl/src/com/intellij/refactoring/extractSuperclass/JavaExtractSuperBaseDialog.java @@ -125,7 +125,7 @@ public abstract class JavaExtractSuperBaseDialog extends ExtractSuperBaseDialog< protected void preparePackage() throws OperationFailedException { final String targetPackageName = getTargetPackageName(); final JavaPsiFacade psiFacade = JavaPsiFacade.getInstance(myProject); - if (!psiFacade.getNameHelper().isIdentifier(targetPackageName)) { + if (!psiFacade.getNameHelper().isQualifiedName(targetPackageName)) { throw new OperationFailedException("Invalid package name: " + targetPackageName); } final PsiPackage aPackage = psiFacade.findPackage(targetPackageName); From 06a603eec06832df90d1db5ef40e5269ea679e69 Mon Sep 17 00:00:00 2001 From: "Maxim.Medvedev" Date: Mon, 6 Feb 2012 14:37:12 +0400 Subject: [PATCH 010/215] IDEA-80287 Incorrect cursor placement on Ctrl-Shift-Enter in Groovy code --- .../smartEnter/fixers/GrMethodBodyFixer.java | 14 ++++---- .../processors/GroovyPlainEnterProcessor.java | 35 +++++++++++++------ .../lang/smartEnter/SmartEnterTest.java | 8 ++++- .../smartEnter/methodBodyAtNextLine.test | 6 ++++ 4 files changed, 45 insertions(+), 18 deletions(-) create mode 100644 plugins/groovy/testdata/groovy/actions/smartEnter/methodBodyAtNextLine.test diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/completion/smartEnter/fixers/GrMethodBodyFixer.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/completion/smartEnter/fixers/GrMethodBodyFixer.java index 5af20679a58b..eddfea2a46d3 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/completion/smartEnter/fixers/GrMethodBodyFixer.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/completion/smartEnter/fixers/GrMethodBodyFixer.java @@ -15,16 +15,17 @@ */ package org.jetbrains.plugins.groovy.lang.completion.smartEnter.fixers; -import com.intellij.openapi.editor.Editor; import com.intellij.openapi.editor.Document; +import com.intellij.openapi.editor.Editor; import com.intellij.openapi.util.text.StringUtil; -import com.intellij.util.IncorrectOperationException; +import com.intellij.psi.PsiClass; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiModifier; +import com.intellij.util.IncorrectOperationException; import org.jetbrains.plugins.groovy.lang.completion.smartEnter.GroovySmartEnterProcessor; -import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.members.GrMethod; -import org.jetbrains.plugins.groovy.lang.psi.api.statements.blocks.GrCodeBlock; import org.jetbrains.plugins.groovy.lang.psi.api.statements.GrStatement; +import org.jetbrains.plugins.groovy.lang.psi.api.statements.blocks.GrCodeBlock; +import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.members.GrMethod; /** * User: Dmitry.Krasilschikov @@ -34,13 +35,14 @@ public class GrMethodBodyFixer implements GrFixer { public void apply(Editor editor, GroovySmartEnterProcessor processor, PsiElement psiElement) throws IncorrectOperationException { if (!(psiElement instanceof GrMethod)) return; GrMethod method = (GrMethod) psiElement; - if (method.getContainingClass().isInterface() || method.hasModifierProperty(PsiModifier.ABSTRACT)) return; + final PsiClass aClass = method.getContainingClass(); + if (aClass != null && aClass.isInterface() || method.hasModifierProperty(PsiModifier.ABSTRACT)) return; final GrCodeBlock body = method.getBlock(); final Document doc = editor.getDocument(); if (body != null) { // See IDEADEV-1093. This is quite hacky heuristic but it seem to be best we can do. String bodyText = body.getText(); - if (bodyText.startsWith("{")) { + if (StringUtil.startsWithChar(bodyText, '{')) { final GrStatement[] statements = body.getStatements(); if (statements.length > 0) { // [todo] diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/completion/smartEnter/processors/GroovyPlainEnterProcessor.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/completion/smartEnter/processors/GroovyPlainEnterProcessor.java index 8ddab9bcce21..c8068ea98a05 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/completion/smartEnter/processors/GroovyPlainEnterProcessor.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/completion/smartEnter/processors/GroovyPlainEnterProcessor.java @@ -15,14 +15,16 @@ */ package org.jetbrains.plugins.groovy.lang.completion.smartEnter.processors; -import com.intellij.psi.PsiElement; import com.intellij.codeInsight.editorActions.smartEnter.EnterProcessor; +import com.intellij.openapi.actionSystem.IdeActions; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.editor.actionSystem.EditorActionManager; import com.intellij.openapi.editor.ex.EditorEx; -import com.intellij.openapi.actionSystem.IdeActions; -import org.jetbrains.plugins.groovy.lang.psi.api.statements.blocks.GrCodeBlock; +import com.intellij.psi.PsiElement; +import org.jetbrains.annotations.Nullable; import org.jetbrains.plugins.groovy.lang.psi.api.statements.*; +import org.jetbrains.plugins.groovy.lang.psi.api.statements.blocks.GrCodeBlock; +import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.members.GrMethod; /** * User: Dmitry.Krasilschikov @@ -45,19 +47,30 @@ public class GroovyPlainEnterProcessor implements EnterProcessor { return true; } + @Nullable private static GrCodeBlock getControlStatementBlock(int caret, PsiElement element) { GrStatement body = null; + + if (element instanceof GrMethod) return ((GrMethod)element).getBlock(); + if (element instanceof GrIfStatement) { - body = ((GrIfStatement) element).getThenBranch(); - if (caret > body.getTextRange().getEndOffset()) { - body = ((GrIfStatement) element).getElseBranch(); + body = ((GrIfStatement)element).getThenBranch(); + if (body != null && caret > body.getTextRange().getEndOffset()) { + body = ((GrIfStatement)element).getElseBranch(); } - } else if (element instanceof GrWhileStatement) { - body = ((GrWhileStatement) element).getBody(); - } else if (element instanceof GrForStatement) { - body = ((GrForStatement) element).getBody(); + } + else if (element instanceof GrWhileStatement) { + body = ((GrWhileStatement)element).getBody(); + } + else if (element instanceof GrForStatement) { + body = ((GrForStatement)element).getBody(); } - return body instanceof GrBlockStatement ? ((GrBlockStatement) body).getBlock() : null; + if (body instanceof GrBlockStatement) { + return ((GrBlockStatement)body).getBlock(); + } + + + return null; } } diff --git a/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/smartEnter/SmartEnterTest.java b/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/smartEnter/SmartEnterTest.java index c0636a8c06b6..d7e9e97d4412 100644 --- a/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/smartEnter/SmartEnterTest.java +++ b/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/smartEnter/SmartEnterTest.java @@ -1,6 +1,8 @@ package org.jetbrains.plugins.groovy.lang.smartEnter; import com.intellij.openapi.actionSystem.IdeActions; +import com.intellij.psi.codeStyle.CodeStyleSettingsManager; +import com.intellij.psi.codeStyle.CommonCodeStyleSettings; import com.intellij.testFramework.fixtures.LightCodeInsightFixtureTestCase; import org.jetbrains.plugins.groovy.GroovyFileType; import org.jetbrains.plugins.groovy.util.TestUtils; @@ -37,8 +39,12 @@ public class SmartEnterTest extends LightCodeInsightFixtureTestCase { public void testListFixer() throws Throwable {doTest();} public void testSwitchBraces() throws Throwable {doTest();} public void testCatchClause() throws Throwable {doTest();} + public void testMethodBodyAtNextLine() { + CodeStyleSettingsManager.getSettings(myFixture.getProject()).getCommonSettings(GroovyFileType.GROOVY_LANGUAGE).METHOD_BRACE_STYLE = CommonCodeStyleSettings.NEXT_LINE; + doTest(); + } - public void doTest() throws Exception { + public void doTest() { final List data = TestUtils.readInput(getTestDataPath() + getTestName(true) + ".test"); myFixture.configureByText(GroovyFileType.GROOVY_FILE_TYPE, data.get(0)); diff --git a/plugins/groovy/testdata/groovy/actions/smartEnter/methodBodyAtNextLine.test b/plugins/groovy/testdata/groovy/actions/smartEnter/methodBodyAtNextLine.test new file mode 100644 index 000000000000..c2560671ba12 --- /dev/null +++ b/plugins/groovy/testdata/groovy/actions/smartEnter/methodBodyAtNextLine.test @@ -0,0 +1,6 @@ +def foo() +------ +def foo() +{ + +} \ No newline at end of file From 80ff0d2f2245b000d00de2cb42cdfad677d594c5 Mon Sep 17 00:00:00 2001 From: "Maxim.Mossienko" Date: Mon, 6 Feb 2012 13:56:05 +0400 Subject: [PATCH 011/215] less garbage and Map.Entry's when copying indexstate --- .../roots/impl/DirectoryIndexImpl.java | 29 ++++++++++++------- 1 file changed, 19 insertions(+), 10 deletions(-) diff --git a/platform/lang-impl/src/com/intellij/openapi/roots/impl/DirectoryIndexImpl.java b/platform/lang-impl/src/com/intellij/openapi/roots/impl/DirectoryIndexImpl.java index 78a20effa8ad..6ce8a7e99644 100644 --- a/platform/lang-impl/src/com/intellij/openapi/roots/impl/DirectoryIndexImpl.java +++ b/platform/lang-impl/src/com/intellij/openapi/roots/impl/DirectoryIndexImpl.java @@ -44,6 +44,7 @@ import com.intellij.util.containers.MultiMap; import com.intellij.util.messages.MessageBusConnection; import gnu.trove.THashMap; import gnu.trove.THashSet; +import gnu.trove.TObjectObjectProcedure; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.TestOnly; @@ -409,10 +410,10 @@ public class DirectoryIndexImpl extends DirectoryIndex implements ProjectCompone } private class IndexState { - final Map> myExcludeRootsMap = new THashMap>(); + final THashMap> myExcludeRootsMap = new THashMap>(); final Set myProjectExcludeRoots = new THashSet(); final Map myDirToInfoMap = new THashMap(); - final Map> myPackageNameToDirsMap = new THashMap>(); + final THashMap> myPackageNameToDirsMap = new THashMap>(); final Map myDirToPackageName = new THashMap(); public IndexState() { @@ -864,7 +865,7 @@ public class DirectoryIndexImpl extends DirectoryIndex implements ProjectCompone while (true) { Set set = map.get(file); if (set == null) { - set = new HashSet(); + set = new THashSet(); map.put(file, set); } set.add(value); @@ -887,18 +888,26 @@ public class DirectoryIndexImpl extends DirectoryIndex implements ProjectCompone } public IndexState copy() { - IndexState copy = new IndexState(); + final IndexState copy = new IndexState(); - for (Map.Entry> entry : myExcludeRootsMap.entrySet()) { - copy.myExcludeRootsMap.put(entry.getKey(), new HashSet(entry.getValue())); - } + myExcludeRootsMap.forEachEntry(new TObjectObjectProcedure>() { + @Override + public boolean execute(VirtualFile key, Set value) { + copy.myExcludeRootsMap.put(key, new THashSet(value)); + return true; + } + }); copy.myProjectExcludeRoots.addAll(myProjectExcludeRoots); copy.myDirToInfoMap.putAll(myDirToInfoMap); - for (Map.Entry> entry : myPackageNameToDirsMap.entrySet()) { - copy.myPackageNameToDirsMap.put(entry.getKey(), new SmartList(entry.getValue())); - } + myPackageNameToDirsMap.forEachEntry(new TObjectObjectProcedure>() { + @Override + public boolean execute(String key, List value) { + copy.myPackageNameToDirsMap.put(key, new SmartList(value)); + return true; + } + }); copy.myDirToPackageName.putAll(myDirToPackageName); From ab29eecad082d8d93404b60346097765172be883 Mon Sep 17 00:00:00 2001 From: Eugene Kudelevsky Date: Fri, 3 Feb 2012 19:10:06 +0400 Subject: [PATCH 012/215] add resource folder to sdk roots if necessary --- .../jetbrains/android/facet/AndroidFacet.java | 46 +++++++++++++++++-- 1 file changed, 42 insertions(+), 4 deletions(-) diff --git a/plugins/android/src/org/jetbrains/android/facet/AndroidFacet.java b/plugins/android/src/org/jetbrains/android/facet/AndroidFacet.java index 7b03bcc7f15c..3cc952f36ebc 100644 --- a/plugins/android/src/org/jetbrains/android/facet/AndroidFacet.java +++ b/plugins/android/src/org/jetbrains/android/facet/AndroidFacet.java @@ -45,10 +45,9 @@ import com.intellij.openapi.project.DumbService; import com.intellij.openapi.project.IndexNotReadyException; import com.intellij.openapi.project.Project; import com.intellij.openapi.projectRoots.Sdk; -import com.intellij.openapi.roots.CompilerModuleExtension; -import com.intellij.openapi.roots.ModuleRootEvent; -import com.intellij.openapi.roots.ModuleRootListener; -import com.intellij.openapi.roots.ModuleRootManager; +import com.intellij.openapi.projectRoots.SdkAdditionalData; +import com.intellij.openapi.projectRoots.SdkModificator; +import com.intellij.openapi.roots.*; import com.intellij.openapi.startup.StartupManager; import com.intellij.openapi.ui.Messages; import com.intellij.openapi.util.Comparing; @@ -368,6 +367,9 @@ public class AndroidFacet extends Facet { if (ApplicationManager.getApplication().isUnitTestMode()) { return; } + + addResourceFolderToSdkRootsIfNecessary(); + ApplicationManager.getApplication().executeOnPooledThread(new Runnable() { public void run() { Module module = getModule(); @@ -441,6 +443,42 @@ public class AndroidFacet extends Facet { } }); } + + private void addResourceFolderToSdkRootsIfNecessary() { + final Sdk sdk = ModuleRootManager.getInstance(getModule()).getSdk(); + if (sdk == null || !(sdk.getSdkType() instanceof AndroidSdkType)) { + return; + } + + final SdkAdditionalData data = sdk.getSdkAdditionalData(); + if (!(data instanceof AndroidSdkAdditionalData)) { + return; + } + + final AndroidPlatform platform = ((AndroidSdkAdditionalData)data).getAndroidPlatform(); + if (platform == null) { + return; + } + + final String resFolderPath = platform.getTarget().getPath(IAndroidTarget.RESOURCES); + if (resFolderPath == null) { + return; + } + + final VirtualFile resFolder = LocalFileSystem.getInstance().findFileByPath(resFolderPath); + if (resFolder == null) { + return; + } + + for (VirtualFile root : sdk.getRootProvider().getFiles(OrderRootType.CLASSES)) { + if (root == resFolder) { + return; + } + } + final SdkModificator modificator = sdk.getSdkModificator(); + modificator.addRoot(resFolder, OrderRootType.CLASSES); + modificator.commitChanges(); + } private static void updateDependenciesInPropertyFile(@NotNull final PropertiesFile projectProperties, @Nullable final Pair localProperties, From 382d28e5226a2f9eec59fc96ff75c0f90ff7ee6c Mon Sep 17 00:00:00 2001 From: Eugene Kudelevsky Date: Fri, 3 Feb 2012 19:24:26 +0400 Subject: [PATCH 013/215] remove obsolete code: merge AndroidSdk and AndroidSdkImpl classes --- .../jetbrains/android/facet/AndroidFacet.java | 4 +- .../newProject/AndroidModuleWizardStep.java | 26 +- .../run/AndroidRunConfigurationBase.java | 27 +- .../android/run/AndroidRunningState.java | 30 +- .../org/jetbrains/android/sdk/AndroidSdk.java | 296 +++++++++++++++-- .../jetbrains/android/sdk/AndroidSdkImpl.java | 308 ------------------ 6 files changed, 306 insertions(+), 385 deletions(-) delete mode 100644 plugins/android/src/org/jetbrains/android/sdk/AndroidSdkImpl.java diff --git a/plugins/android/src/org/jetbrains/android/facet/AndroidFacet.java b/plugins/android/src/org/jetbrains/android/facet/AndroidFacet.java index 3cc952f36ebc..6e918c914c17 100644 --- a/plugins/android/src/org/jetbrains/android/facet/AndroidFacet.java +++ b/plugins/android/src/org/jetbrains/android/facet/AndroidFacet.java @@ -324,8 +324,8 @@ public class AndroidFacet extends Facet { AndroidPlatform platform = getConfiguration().getAndroidPlatform(); AndroidSdk sdk = platform != null ? platform.getSdk() : null; Project project = getModule().getProject(); - if (sdk instanceof AndroidSdkImpl) { - SdkManager sdkManager = ((AndroidSdkImpl)sdk).getSdkManager(); + if (sdk != null) { + SdkManager sdkManager = sdk.getSdkManager(); myAvdManager = new AvdManager(sdkManager, AndroidUtils.getSdkLog(project)); } else { diff --git a/plugins/android/src/org/jetbrains/android/newProject/AndroidModuleWizardStep.java b/plugins/android/src/org/jetbrains/android/newProject/AndroidModuleWizardStep.java index 47942f407f1e..b4b88f75be4a 100644 --- a/plugins/android/src/org/jetbrains/android/newProject/AndroidModuleWizardStep.java +++ b/plugins/android/src/org/jetbrains/android/newProject/AndroidModuleWizardStep.java @@ -391,22 +391,20 @@ public class AndroidModuleWizardStep extends ModuleWizardStep { @NotNull private static String[] getAvds(@NotNull AndroidPlatform androidPlatform) { final AndroidSdk sdkObject = androidPlatform.getSdk(); - if (sdkObject instanceof AndroidSdkImpl) { - final SdkManager sdkManager = ((AndroidSdkImpl)sdkObject).getSdkManager(); - try { - final AvdManager avdManager = new AvdManager(sdkManager, new MessageBuildingSdkLog()); - final AvdInfo[] validAvds = avdManager.getValidAvds(); + final SdkManager sdkManager = sdkObject.getSdkManager(); + try { + final AvdManager avdManager = new AvdManager(sdkManager, new MessageBuildingSdkLog()); + final AvdInfo[] validAvds = avdManager.getValidAvds(); - final String[] avdNames = new String[validAvds.length]; - for (int i = 0; i < validAvds.length; i++) { - avdNames[i] = validAvds[i].getName(); - } - return avdNames; - } - catch (AndroidLocation.AndroidLocationException e) { - LOG.info(e); + final String[] avdNames = new String[validAvds.length]; + for (int i = 0; i < validAvds.length; i++) { + avdNames[i] = validAvds[i].getName(); } + return avdNames; + } + catch (AndroidLocation.AndroidLocationException e) { + LOG.info(e); + return ArrayUtil.EMPTY_STRING_ARRAY; } - return ArrayUtil.EMPTY_STRING_ARRAY; } } diff --git a/plugins/android/src/org/jetbrains/android/run/AndroidRunConfigurationBase.java b/plugins/android/src/org/jetbrains/android/run/AndroidRunConfigurationBase.java index 54e28b8b1012..9cd023bc9b39 100644 --- a/plugins/android/src/org/jetbrains/android/run/AndroidRunConfigurationBase.java +++ b/plugins/android/src/org/jetbrains/android/run/AndroidRunConfigurationBase.java @@ -51,8 +51,6 @@ import org.jetbrains.android.facet.AndroidFacetConfiguration; import org.jetbrains.android.logcat.AndroidLogFilterModel; import org.jetbrains.android.logcat.AndroidLogcatFiltersPreferences; import org.jetbrains.android.sdk.AndroidPlatform; -import org.jetbrains.android.sdk.AndroidSdk; -import org.jetbrains.android.sdk.AndroidSdkImpl; import org.jetbrains.android.util.AndroidBundle; import org.jetbrains.android.util.AndroidUtils; import org.jetbrains.annotations.NotNull; @@ -108,22 +106,17 @@ public abstract class AndroidRunConfigurationBase extends ModuleBasedConfigurati if (PREFERRED_AVD.length() > 0) { AvdManager avdManager = facet.getAvdManagerSilently(); if (avdManager == null) { - AndroidSdk sdk = facet.getConfiguration().getAndroidSdk(); - if (sdk instanceof AndroidSdkImpl) { - throw new RuntimeConfigurationError(AndroidBundle.message("avd.cannot.be.loaded.error")); - } + throw new RuntimeConfigurationError(AndroidBundle.message("avd.cannot.be.loaded.error")); } - if (avdManager != null) { - AvdInfo avdInfo = avdManager.getAvd(PREFERRED_AVD, false); - if (avdInfo == null) { - throw new RuntimeConfigurationError(AndroidBundle.message("avd.not.found.error", PREFERRED_AVD)); - } - if (!facet.isCompatibleAvd(avdInfo)) { - throw new RuntimeConfigurationError(AndroidBundle.message("avd.not.compatible.error", PREFERRED_AVD)); - } - if (avdInfo.getStatus() != AvdInfo.AvdStatus.OK) { - throw new RuntimeConfigurationError(AndroidBundle.message("avd.not.valid.error", PREFERRED_AVD)); - } + AvdInfo avdInfo = avdManager.getAvd(PREFERRED_AVD, false); + if (avdInfo == null) { + throw new RuntimeConfigurationError(AndroidBundle.message("avd.not.found.error", PREFERRED_AVD)); + } + if (!facet.isCompatibleAvd(avdInfo)) { + throw new RuntimeConfigurationError(AndroidBundle.message("avd.not.compatible.error", PREFERRED_AVD)); + } + if (avdInfo.getStatus() != AvdInfo.AvdStatus.OK) { + throw new RuntimeConfigurationError(AndroidBundle.message("avd.not.valid.error", PREFERRED_AVD)); } } checkConfiguration(facet); diff --git a/plugins/android/src/org/jetbrains/android/run/AndroidRunningState.java b/plugins/android/src/org/jetbrains/android/run/AndroidRunningState.java index 976b7eb14a90..5c6e736d7662 100644 --- a/plugins/android/src/org/jetbrains/android/run/AndroidRunningState.java +++ b/plugins/android/src/org/jetbrains/android/run/AndroidRunningState.java @@ -54,7 +54,6 @@ import com.intellij.xdebugger.DefaultDebugProcessHandler; import org.jetbrains.android.actions.AndroidEnableDdmsAction; import org.jetbrains.android.facet.AndroidFacet; import org.jetbrains.android.facet.AvdsNotSupportedException; -import org.jetbrains.android.sdk.AndroidSdkImpl; import org.jetbrains.android.util.AndroidBundle; import org.jetbrains.android.util.AndroidOutputReceiver; import org.jetbrains.android.util.AndroidUtils; @@ -426,22 +425,17 @@ public abstract class AndroidRunningState implements RunProfileState, AndroidDeb myTargetDevices = targetDevices; } else if (myTargetChooser instanceof EmulatorTargetChooser) { - if (isAndroidSdk15OrHigher()) { - if (myAvdName == null) { - chooseAvd(); - } - if (myAvdName != null) { - myFacet.launchEmulator(myAvdName, myCommandLine, getProcessHandler()); - } - else if (getProcessHandler().isStartNotified()) { - message("Canceled", STDERR); - getProcessHandler().destroyProcess(); - return false; - } + if (myAvdName == null) { + chooseAvd(); } - else { + if (myAvdName != null) { myFacet.launchEmulator(myAvdName, myCommandLine, getProcessHandler()); } + else if (getProcessHandler().isStartNotified()) { + message("Canceled", STDERR); + getProcessHandler().destroyProcess(); + return false; + } } else { message("USB device not found", STDERR); @@ -485,10 +479,6 @@ public abstract class AndroidRunningState implements RunProfileState, AndroidDeb getProcessHandler().notifyTextAvailable(message + '\n', outputKey); } - private boolean isAndroidSdk15OrHigher() { - return myFacet.getConfiguration().getAndroidSdk() instanceof AndroidSdkImpl; - } - public void clientChanged(Client client, int changeMask) { synchronized (myDebugLock) { if (myDebugLauncher == null) { @@ -529,10 +519,6 @@ public abstract class AndroidRunningState implements RunProfileState, AndroidDeb @Nullable private Boolean isCompatibleDevice(@NotNull IDevice device) { - if (!isAndroidSdk15OrHigher()) { - return true; - } - if (myTargetChooser instanceof EmulatorTargetChooser) { if (device.isEmulator()) { String avdName = device.isEmulator() ? device.getAvdName() : null; diff --git a/plugins/android/src/org/jetbrains/android/sdk/AndroidSdk.java b/plugins/android/src/org/jetbrains/android/sdk/AndroidSdk.java index 58f9fbbd139e..16cbe8ae5be0 100644 --- a/plugins/android/src/org/jetbrains/android/sdk/AndroidSdk.java +++ b/plugins/android/src/org/jetbrains/android/sdk/AndroidSdk.java @@ -18,10 +18,8 @@ package org.jetbrains.android.sdk; import com.android.ddmlib.AndroidDebugBridge; import com.android.ddmlib.DdmPreferences; -import com.android.sdklib.IAndroidTarget; -import com.android.sdklib.ISdkLog; -import com.android.sdklib.SdkConstants; -import com.android.sdklib.SdkManager; +import com.android.sdklib.*; +import com.android.sdklib.internal.project.ProjectProperties; import com.intellij.CommonBundle; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.diagnostic.Logger; @@ -33,8 +31,10 @@ import com.intellij.openapi.ui.Messages; import com.intellij.openapi.util.io.FileUtil; import com.intellij.reference.SoftReference; import com.intellij.util.containers.HashMap; +import gnu.trove.TIntObjectHashMap; import org.jetbrains.android.actions.AndroidEnableDdmsAction; import org.jetbrains.android.util.AndroidUtils; +import org.jetbrains.android.util.BufferingFileWrapper; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -45,13 +45,9 @@ import java.util.Map; import static org.jetbrains.android.util.AndroidUtils.ADB; /** - * Created by IntelliJ IDEA. - * User: Eugene.Kudelevsky - * Date: Jun 2, 2009 - * Time: 2:35:49 PM - * To change this template use File | Settings | File Templates. + * @author Eugene.Kudelevsky */ -public abstract class AndroidSdk { +public class AndroidSdk { private static final Logger LOG = Logger.getInstance("#org.jetbrains.android.sdk.AndroidSdk"); private static volatile boolean myDdmLibInitialized = false; @@ -63,11 +59,58 @@ public abstract class AndroidSdk { private final Map> myTargetDatas = new HashMap>(); - @NotNull - public abstract String getLocation(); + private final SdkManager mySdkManager; + private IAndroidTarget[] myTargets = null; + + private final int myPlatformToolsRevision; + + public AndroidSdk(@NotNull SdkManager sdkManager, @NotNull String sdkDirOsPath) { + mySdkManager = sdkManager; + + final File platformToolsPropFile = + new File(sdkDirOsPath + File.separatorChar + SdkConstants.FD_PLATFORM_TOOLS + File.separatorChar + SdkConstants.FN_SOURCE_PROP); + int platformToolsRevision = -1; + if (platformToolsPropFile.exists() && platformToolsPropFile.isFile()) { + final Map map = + ProjectProperties.parsePropertyFile(new BufferingFileWrapper(platformToolsPropFile), new MessageBuildingSdkLog()); + final String revision = map.get("Pkg.Revision"); + if (revision != null) { + try { + platformToolsRevision = Integer.parseInt(revision); + } + catch (NumberFormatException e) { + LOG.info(e); + } + } + } + myPlatformToolsRevision = platformToolsRevision > 0 ? platformToolsRevision : -1; + } @NotNull - public abstract IAndroidTarget[] getTargets(); + public String getLocation() { + String location = mySdkManager.getLocation(); + if (location.length() > 0) { + char lastChar = location.charAt(location.length() - 1); + if (lastChar == '/' || lastChar == File.separatorChar) { + return location.substring(0, location.length() - 1); + } + } + return location; + } + + @NotNull + public IAndroidTarget[] getTargets() { + if (myTargets == null) { + IAndroidTarget[] targets = mySdkManager.getTargets(); + if (targets != null) { + myTargets = new IAndroidTarget[targets.length]; + for (int i = 0; i < targets.length; i++) { + myTargets[i] = new MyTargetWrapper(targets[i]); + } + } + } + return myTargets; + } // be careful! target name is NOT unique @@ -108,18 +151,19 @@ public abstract class AndroidSdk { return null; } - public abstract IAndroidTarget findTargetByHashString(@NotNull String hashString); + public IAndroidTarget findTargetByHashString(@NotNull String hashString) { + final IAndroidTarget target = mySdkManager.getTargetFromHashString(hashString); + return target != null ? new MyTargetWrapper(target) : null; + } - public abstract int getPlatformToolsRevision(); + public int getPlatformToolsRevision() { + return myPlatformToolsRevision; + } @Nullable public static AndroidSdk parse(@NotNull String path, @NotNull ISdkLog log) { final SdkManager manager = AndroidSdkUtils.createSdkManager(path, log); - - if (manager != null) { - return new AndroidSdkImpl(manager, path); - } - return null; + return manager != null ? new AndroidSdk(manager, path) : null; } @Nullable @@ -181,8 +225,9 @@ public abstract class AndroidSdk { if (!finished) { int result = Messages - .showOkCancelDialog(project, "ADB not responding. Please, kill \"" + SdkConstants.FN_ADB + "\" process manually and click 'Retry'", - CommonBundle.getErrorTitle(), "&Retry", "&Cancel", Messages.getErrorIcon()); + .showOkCancelDialog(project, + "ADB not responding. Please, kill \"" + SdkConstants.FN_ADB + "\" process manually and click 'Retry'", + CommonBundle.getErrorTitle(), "&Retry", "&Cancel", Messages.getErrorIcon()); if (result == 1) { forceInterrupt(t); @@ -286,6 +331,11 @@ public abstract class AndroidSdk { return AndroidDebugBridge.getBridge(); } + @NotNull + public SdkManager getSdkManager() { + return mySdkManager; + } + @Nullable public AndroidTargetData getTargetData(@NotNull IAndroidTarget target) { final SoftReference targetDataRef = myTargetDatas.get(target); @@ -356,4 +406,206 @@ public abstract class AndroidSdk { } } } + + private static class MyTargetWrapper implements IAndroidTarget { + private final TIntObjectHashMap myAlternativePaths; + private final IAndroidTarget myWrapee; + + private MyTargetWrapper(@NotNull IAndroidTarget wrapee) { + myWrapee = wrapee; + myAlternativePaths = new TIntObjectHashMap(); + String oldPlatformToolsFolderPath = getOldPlatformToolsFolderPath(); + if (!canFindTool(AAPT)) { + myAlternativePaths.put(AAPT, oldPlatformToolsFolderPath + SdkConstants.FN_AAPT); + } + if (!canFindTool(AIDL)) { + myAlternativePaths.put(AIDL, oldPlatformToolsFolderPath + SdkConstants.FN_AIDL); + } + if (!canFindTool(DX)) { + myAlternativePaths.put(DX, oldPlatformToolsFolderPath + SdkConstants.FN_DX); + } + if (!canFindTool(DX_JAR)) { + myAlternativePaths.put(DX_JAR, oldPlatformToolsFolderPath + SdkConstants.FD_LIB + File.separator + SdkConstants.FN_DX_JAR); + } + } + + @Nullable + private String getOldPlatformToolsFolderPath() { + String platformLocation; + if (myWrapee.isPlatform()) { + platformLocation = myWrapee.getLocation(); + } + else { + IAndroidTarget parent = myWrapee.getParent(); + platformLocation = parent != null ? parent.getLocation() : null; + } + if (platformLocation == null) { + return null; + } + return platformLocation + SdkConstants.FD_TOOLS + File.separator; + } + + private boolean canFindTool(int pathId) { + String path = myWrapee.getPath(pathId); + return path != null && new File(path).exists(); + } + + @Override + public String getLocation() { + return myWrapee.getLocation(); + } + + @Override + public String getVendor() { + return myWrapee.getVendor(); + } + + @Override + public String getName() { + return myWrapee.getName(); + } + + @Override + public String getFullName() { + return myWrapee.getFullName(); + } + + @Override + public String getClasspathName() { + return myWrapee.getClasspathName(); + } + + @Override + public String getShortClasspathName() { + return myWrapee.getShortClasspathName(); + } + + @Override + public String getDescription() { + return myWrapee.getDescription(); + } + + @Override + public AndroidVersion getVersion() { + return myWrapee.getVersion(); + } + + @Override + public String getVersionName() { + return myWrapee.getVersionName(); + } + + @Override + public int getRevision() { + return myWrapee.getRevision(); + } + + @Override + public boolean isPlatform() { + return myWrapee.isPlatform(); + } + + @Override + public IAndroidTarget getParent() { + return myWrapee.getParent(); + } + + @Override + public String getPath(int pathId) { + String path = myAlternativePaths.get(pathId); + if (path != null) { + return path; + } + return myWrapee.getPath(pathId); + } + + @Override + public boolean hasRenderingLibrary() { + return myWrapee.hasRenderingLibrary(); + } + + @Override + public String[] getSkins() { + return myWrapee.getSkins(); + } + + @Override + public String getDefaultSkin() { + return myWrapee.getDefaultSkin(); + } + + @Override + public IOptionalLibrary[] getOptionalLibraries() { + return myWrapee.getOptionalLibraries(); + } + + @Override + public String[] getPlatformLibraries() { + return myWrapee.getPlatformLibraries(); + } + + @Override + public String getProperty(String name) { + return myWrapee.getProperty(name); + } + + @Override + public Integer getProperty(String name, Integer defaultValue) { + return myWrapee.getProperty(name, defaultValue); + } + + @Override + public Boolean getProperty(String name, Boolean defaultValue) { + return myWrapee.getProperty(name, defaultValue); + } + + @Override + public Map getProperties() { + return myWrapee.getProperties(); + } + + @Override + public int getUsbVendorId() { + return myWrapee.getUsbVendorId(); + } + + @Override + public ISystemImage[] getSystemImages() { + return myWrapee.getSystemImages(); + } + + @Override + public ISystemImage getSystemImage(String abiType) { + return myWrapee.getSystemImage(abiType); + } + + @Override + public boolean canRunOn(IAndroidTarget target) { + return myWrapee.canRunOn(target); + } + + @Override + public String hashString() { + return myWrapee.hashString(); + } + + @Override + public int compareTo(IAndroidTarget o) { + return myWrapee.compareTo(o); + } + + @Override + public boolean equals(Object obj) { + if (!(obj instanceof MyTargetWrapper)) { + return false; + } + MyTargetWrapper other = (MyTargetWrapper)obj; + return myWrapee.equals(other.myWrapee); + } + + @Override + public int hashCode() { + return myWrapee.hashCode(); + } + } } diff --git a/plugins/android/src/org/jetbrains/android/sdk/AndroidSdkImpl.java b/plugins/android/src/org/jetbrains/android/sdk/AndroidSdkImpl.java deleted file mode 100644 index f3911830d763..000000000000 --- a/plugins/android/src/org/jetbrains/android/sdk/AndroidSdkImpl.java +++ /dev/null @@ -1,308 +0,0 @@ -/* - * Copyright 2000-2010 JetBrains s.r.o. - * - * 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. - */ - -package org.jetbrains.android.sdk; - -import com.android.sdklib.*; -import com.android.sdklib.internal.project.ProjectProperties; -import com.intellij.openapi.diagnostic.Logger; -import gnu.trove.TIntObjectHashMap; -import org.jetbrains.android.util.BufferingFileWrapper; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -import java.io.File; -import java.util.Map; - -/** - * Created by IntelliJ IDEA. - * User: Eugene.Kudelevsky - * Date: Jun 2, 2009 - * Time: 2:37:00 PM - * To change this template use File | Settings | File Templates. - */ -public class AndroidSdkImpl extends AndroidSdk { - private static final Logger LOG = Logger.getInstance("#org.jetbrains.android.sdk.AndroidSdkImpl"); - private final SdkManager mySdkManager; - private IAndroidTarget[] myTargets = null; - - private final int myPlatformToolsRevision; - - public AndroidSdkImpl(@NotNull SdkManager sdkManager, @NotNull String sdkDirOsPath) { - mySdkManager = sdkManager; - - final File platformToolsPropFile = - new File(sdkDirOsPath + File.separatorChar + SdkConstants.FD_PLATFORM_TOOLS + File.separatorChar + SdkConstants.FN_SOURCE_PROP); - int platformToolsRevision = -1; - if (platformToolsPropFile.exists() && platformToolsPropFile.isFile()) { - final Map map = - ProjectProperties.parsePropertyFile(new BufferingFileWrapper(platformToolsPropFile), new MessageBuildingSdkLog()); - final String revision = map.get("Pkg.Revision"); - if (revision != null) { - try { - platformToolsRevision = Integer.parseInt(revision); - } - catch (NumberFormatException e) { - LOG.info(e); - } - } - } - myPlatformToolsRevision = platformToolsRevision > 0 ? platformToolsRevision : -1; - } - - @NotNull - public String getLocation() { - String location = mySdkManager.getLocation(); - if (location.length() > 0) { - char lastChar = location.charAt(location.length() - 1); - if (lastChar == '/' || lastChar == File.separatorChar) { - return location.substring(0, location.length() - 1); - } - } - return location; - } - - @NotNull - public IAndroidTarget[] getTargets() { - if (myTargets == null) { - IAndroidTarget[] targets = mySdkManager.getTargets(); - if (targets != null) { - myTargets = new IAndroidTarget[targets.length]; - for (int i = 0; i < targets.length; i++) { - myTargets[i] = new MyTargetWrapper(targets[i]); - } - } - } - return myTargets; - } - - @Override - public IAndroidTarget findTargetByHashString(@NotNull String hashString) { - final IAndroidTarget target = mySdkManager.getTargetFromHashString(hashString); - return target != null ? new MyTargetWrapper(target) : null; - } - - @NotNull - public SdkManager getSdkManager() { - return mySdkManager; - } - - public int getPlatformToolsRevision() { - return myPlatformToolsRevision; - } - - private static class MyTargetWrapper implements IAndroidTarget { - private final TIntObjectHashMap myAlternativePaths; - private final IAndroidTarget myWrapee; - - private MyTargetWrapper(@NotNull IAndroidTarget wrapee) { - myWrapee = wrapee; - myAlternativePaths = new TIntObjectHashMap(); - String oldPlatformToolsFolderPath = getOldPlatformToolsFolderPath(); - if (!canFindTool(AAPT)) { - myAlternativePaths.put(AAPT, oldPlatformToolsFolderPath + SdkConstants.FN_AAPT); - } - if (!canFindTool(AIDL)) { - myAlternativePaths.put(AIDL, oldPlatformToolsFolderPath + SdkConstants.FN_AIDL); - } - if (!canFindTool(DX)) { - myAlternativePaths.put(DX, oldPlatformToolsFolderPath + SdkConstants.FN_DX); - } - if (!canFindTool(DX_JAR)) { - myAlternativePaths.put(DX_JAR, oldPlatformToolsFolderPath + SdkConstants.FD_LIB + File.separator + SdkConstants.FN_DX_JAR); - } - } - - @Nullable - private String getOldPlatformToolsFolderPath() { - String platformLocation; - if (myWrapee.isPlatform()) { - platformLocation = myWrapee.getLocation(); - } - else { - IAndroidTarget parent = myWrapee.getParent(); - platformLocation = parent != null ? parent.getLocation() : null; - } - if (platformLocation == null) { - return null; - } - return platformLocation + SdkConstants.FD_TOOLS + File.separator; - } - - private boolean canFindTool(int pathId) { - String path = myWrapee.getPath(pathId); - return path != null && new File(path).exists(); - } - - @Override - public String getLocation() { - return myWrapee.getLocation(); - } - - @Override - public String getVendor() { - return myWrapee.getVendor(); - } - - @Override - public String getName() { - return myWrapee.getName(); - } - - @Override - public String getFullName() { - return myWrapee.getFullName(); - } - - @Override - public String getClasspathName() { - return myWrapee.getClasspathName(); - } - - @Override - public String getShortClasspathName() { - return myWrapee.getShortClasspathName(); - } - - @Override - public String getDescription() { - return myWrapee.getDescription(); - } - - @Override - public AndroidVersion getVersion() { - return myWrapee.getVersion(); - } - - @Override - public String getVersionName() { - return myWrapee.getVersionName(); - } - - @Override - public int getRevision() { - return myWrapee.getRevision(); - } - - @Override - public boolean isPlatform() { - return myWrapee.isPlatform(); - } - - @Override - public IAndroidTarget getParent() { - return myWrapee.getParent(); - } - - @Override - public String getPath(int pathId) { - String path = myAlternativePaths.get(pathId); - if (path != null) { - return path; - } - return myWrapee.getPath(pathId); - } - - @Override - public boolean hasRenderingLibrary() { - return myWrapee.hasRenderingLibrary(); - } - - @Override - public String[] getSkins() { - return myWrapee.getSkins(); - } - - @Override - public String getDefaultSkin() { - return myWrapee.getDefaultSkin(); - } - - @Override - public IOptionalLibrary[] getOptionalLibraries() { - return myWrapee.getOptionalLibraries(); - } - - @Override - public String[] getPlatformLibraries() { - return myWrapee.getPlatformLibraries(); - } - - @Override - public String getProperty(String name) { - return myWrapee.getProperty(name); - } - - @Override - public Integer getProperty(String name, Integer defaultValue) { - return myWrapee.getProperty(name, defaultValue); - } - - @Override - public Boolean getProperty(String name, Boolean defaultValue) { - return myWrapee.getProperty(name, defaultValue); - } - - @Override - public Map getProperties() { - return myWrapee.getProperties(); - } - - @Override - public int getUsbVendorId() { - return myWrapee.getUsbVendorId(); - } - - @Override - public ISystemImage[] getSystemImages() { - return myWrapee.getSystemImages(); - } - - @Override - public ISystemImage getSystemImage(String abiType) { - return myWrapee.getSystemImage(abiType); - } - - @Override - public boolean canRunOn(IAndroidTarget target) { - return myWrapee.canRunOn(target); - } - - @Override - public String hashString() { - return myWrapee.hashString(); - } - - @Override - public int compareTo(IAndroidTarget o) { - return myWrapee.compareTo(o); - } - - @Override - public boolean equals(Object obj) { - if (!(obj instanceof MyTargetWrapper)) { - return false; - } - MyTargetWrapper other = (MyTargetWrapper)obj; - return myWrapee.equals(other.myWrapee); - } - - @Override - public int hashCode() { - return myWrapee.hashCode(); - } - } -} From a8e0e4513c9086ec6cc806d9ff63383a65b9a49b Mon Sep 17 00:00:00 2001 From: Eugene Kudelevsky Date: Fri, 3 Feb 2012 19:30:54 +0400 Subject: [PATCH 014/215] clean up --- .../jetbrains/android/run/AndroidRunningState.java | 2 +- .../src/org/jetbrains/android/sdk/AndroidSdk.java | 12 ++---------- 2 files changed, 3 insertions(+), 11 deletions(-) diff --git a/plugins/android/src/org/jetbrains/android/run/AndroidRunningState.java b/plugins/android/src/org/jetbrains/android/run/AndroidRunningState.java index 5c6e736d7662..a54a188a3fc1 100644 --- a/plugins/android/src/org/jetbrains/android/run/AndroidRunningState.java +++ b/plugins/android/src/org/jetbrains/android/run/AndroidRunningState.java @@ -733,7 +733,7 @@ public abstract class AndroidRunningState implements RunProfileState, AndroidDeb private boolean uploadApp(IDevice device, String remotePath, String localPath) throws IOException { if (myStopped) return false; message("Uploading file\n\tlocal path: " + localPath + "\n\tremote path: " + remotePath, STDOUT); - String exceptionMessage = null; + String exceptionMessage; String errorMessage; try { SyncService service = device.getSyncService(); diff --git a/plugins/android/src/org/jetbrains/android/sdk/AndroidSdk.java b/plugins/android/src/org/jetbrains/android/sdk/AndroidSdk.java index 16cbe8ae5be0..877dc802f84c 100644 --- a/plugins/android/src/org/jetbrains/android/sdk/AndroidSdk.java +++ b/plugins/android/src/org/jetbrains/android/sdk/AndroidSdk.java @@ -141,16 +141,6 @@ public class AndroidSdk { } @Nullable - public IAndroidTarget findTargetByLocation(@NotNull String location) { - for (IAndroidTarget target : getTargets()) { - String targetPath = FileUtil.toSystemIndependentName(target.getLocation()); - if (FileUtil.pathsEqual(location + '/', targetPath) || FileUtil.pathsEqual(location, targetPath)) { - return target; - } - } - return null; - } - public IAndroidTarget findTargetByHashString(@NotNull String hashString) { final IAndroidTarget target = mySdkManager.getTargetFromHashString(hashString); return target != null ? new MyTargetWrapper(target) : null; @@ -216,6 +206,7 @@ public class AndroidSdk { boolean finished = task.isFinished(); + //noinspection AssignmentToStaticFieldFromInstanceMethod myAdbCrashed = !finished; if (task.isCanceled()) { @@ -268,6 +259,7 @@ public class AndroidSdk { synchronized (myDdmsLock) { String adbPath = getAdbPath(); if (!myDdmLibInitialized) { + //noinspection AssignmentToStaticFieldFromInstanceMethod myDdmLibInitialized = true; DdmPreferences.setTimeOut(AndroidUtils.TIMEOUT); AndroidDebugBridge.init(AndroidEnableDdmsAction.isDdmsEnabled()); From e051e1bb0c68bc837123ae96fc683329023db7b4 Mon Sep 17 00:00:00 2001 From: Eugene Kudelevsky Date: Fri, 3 Feb 2012 19:54:57 +0400 Subject: [PATCH 015/215] android lint: typography tests --- .../android/inspections/lint/TypographyQuickFix.java | 9 ++++++++- plugins/android/testData/lint/typographyDashes_after.xml | 2 +- plugins/android/testData/lint/typographyQuotes_after.xml | 2 +- .../testSrc/org/jetbrains/android/AndroidLintTest.java | 4 ++-- 4 files changed, 12 insertions(+), 5 deletions(-) diff --git a/plugins/android/src/org/jetbrains/android/inspections/lint/TypographyQuickFix.java b/plugins/android/src/org/jetbrains/android/inspections/lint/TypographyQuickFix.java index 74e7e737cdc8..a290b68ee61d 100644 --- a/plugins/android/src/org/jetbrains/android/inspections/lint/TypographyQuickFix.java +++ b/plugins/android/src/org/jetbrains/android/inspections/lint/TypographyQuickFix.java @@ -2,6 +2,7 @@ package org.jetbrains.android.inspections.lint; import com.android.tools.lint.checks.TypographyDetector; import com.android.tools.lint.detector.api.Issue; +import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.editor.Editor; import com.intellij.psi.PsiElement; import com.intellij.psi.util.PsiTreeUtil; @@ -42,7 +43,13 @@ class TypographyQuickFix implements AndroidLintQuickFix { final StringBuilder builder = new StringBuilder(value); for (TypographyDetector.ReplaceEdit edit : edits) { - builder.replace(edit.offset, edit.offset + edit.length, edit.replaceWith); + String with = edit.replaceWith; + + if (ApplicationManager.getApplication().isUnitTestMode()) { + with = with.replace('\u2013', '~').replace('\u2018', '{').replace('\u2019', '}'); + } + + builder.replace(edit.offset, edit.offset + edit.length, with); } final String newValue = builder.toString(); diff --git a/plugins/android/testData/lint/typographyDashes_after.xml b/plugins/android/testData/lint/typographyDashes_after.xml index 35404e3362b2..978f0b9e719d 100644 --- a/plugins/android/testData/lint/typographyDashes_after.xml +++ b/plugins/android/testData/lint/typographyDashes_after.xml @@ -1,4 +1,4 @@ - 10–20 + 10~20 \ No newline at end of file diff --git a/plugins/android/testData/lint/typographyQuotes_after.xml b/plugins/android/testData/lint/typographyQuotes_after.xml index f0539ff7ece6..782ef948f2e4 100644 --- a/plugins/android/testData/lint/typographyQuotes_after.xml +++ b/plugins/android/testData/lint/typographyQuotes_after.xml @@ -1,5 +1,5 @@ untitled303 - aba ‘aba’ + aba {aba} diff --git a/plugins/android/testSrc/org/jetbrains/android/AndroidLintTest.java b/plugins/android/testSrc/org/jetbrains/android/AndroidLintTest.java index dfcd39e34d20..186b291dd2b4 100644 --- a/plugins/android/testSrc/org/jetbrains/android/AndroidLintTest.java +++ b/plugins/android/testSrc/org/jetbrains/android/AndroidLintTest.java @@ -140,7 +140,7 @@ public class AndroidLintTest extends AndroidTestCase { "/res/layout/layout.xml", "xml"); } - /*public void testTypographyDashes() throws Exception { + public void testTypographyDashes() throws Exception { doTestWithFix(new AndroidLintInspectionToolProvider.AndroidLintTypographyDashesInspection(), AndroidBundle.message("android.lint.inspections.replace.with.suggested.characters"), "/res/values/typography.xml", "xml"); @@ -150,7 +150,7 @@ public class AndroidLintTest extends AndroidTestCase { doTestWithFix(new AndroidLintInspectionToolProvider.AndroidLintTypographyQuotesInspection(), AndroidBundle.message("android.lint.inspections.replace.with.suggested.characters"), "/res/values/typography.xml", "xml"); - }*/ + } private void doTestNoFix(@NotNull AndroidLintInspectionBase inspection, @NotNull String copyTo, @NotNull String extension) throws IOException { From c2a480052c8affa27b8b898d2788bf36dccbd487 Mon Sep 17 00:00:00 2001 From: Eugene Kudelevsky Date: Fri, 3 Feb 2012 21:28:44 +0400 Subject: [PATCH 016/215] remove useless marker --- .../android/inspections/lint/AndroidLintInspectionBase.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/android/src/org/jetbrains/android/inspections/lint/AndroidLintInspectionBase.java b/plugins/android/src/org/jetbrains/android/inspections/lint/AndroidLintInspectionBase.java index af7f059585a4..13fdf69d297d 100644 --- a/plugins/android/src/org/jetbrains/android/inspections/lint/AndroidLintInspectionBase.java +++ b/plugins/android/src/org/jetbrains/android/inspections/lint/AndroidLintInspectionBase.java @@ -164,7 +164,7 @@ public abstract class AndroidLintInspectionBase extends GlobalInspectionTool { final PsiElement endElement = psiFile.findElementAt(range.getEndOffset() - 1); if (startElement != null && endElement != null) { - result.add(manager.createProblemDescriptor(startElement, endElement, message + "#loc", + result.add(manager.createProblemDescriptor(startElement, endElement, message, ProblemHighlightType.GENERIC_ERROR_OR_WARNING, false, getLocalQuickFixes(startElement, endElement, message))); } From d6a94bef2dccd240457b1f80a12f844d5cb58b91 Mon Sep 17 00:00:00 2001 From: Eugene Kudelevsky Date: Fri, 3 Feb 2012 21:29:43 +0400 Subject: [PATCH 017/215] android lint: some test for batch-mode-only inspections --- .../lint/global/duplicateIcons/dup1.png | Bin 0 -> 3609 bytes .../lint/global/duplicateIcons/dup2.png | Bin 0 -> 3609 bytes .../lint/global/duplicateIcons/expected.xml | 8 +++ .../lint/global/duplicateIcons/other.png | Bin 0 -> 209 bytes .../global/manifestOrder/AndroidManifest.xml | 10 ++++ .../lint/global/manifestOrder/expected.xml | 8 +++ .../lint/global/proguard/expected.xml | 8 +++ .../lint/global/proguard/proguard.cfg | 3 ++ .../jetbrains/android/AndroidLintTest.java | 50 +++++++++++++++++- 9 files changed, 86 insertions(+), 1 deletion(-) create mode 100644 plugins/android/testData/lint/global/duplicateIcons/dup1.png create mode 100644 plugins/android/testData/lint/global/duplicateIcons/dup2.png create mode 100644 plugins/android/testData/lint/global/duplicateIcons/expected.xml create mode 100644 plugins/android/testData/lint/global/duplicateIcons/other.png create mode 100644 plugins/android/testData/lint/global/manifestOrder/AndroidManifest.xml create mode 100644 plugins/android/testData/lint/global/manifestOrder/expected.xml create mode 100644 plugins/android/testData/lint/global/proguard/expected.xml create mode 100644 plugins/android/testData/lint/global/proguard/proguard.cfg diff --git a/plugins/android/testData/lint/global/duplicateIcons/dup1.png b/plugins/android/testData/lint/global/duplicateIcons/dup1.png new file mode 100644 index 0000000000000000000000000000000000000000..3779d4d33dc0c8b5c7db7e1d8f5cadca4d94f21d GIT binary patch literal 3609 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 literal 0 HcmV?d00001 diff --git a/plugins/android/testData/lint/global/duplicateIcons/dup2.png b/plugins/android/testData/lint/global/duplicateIcons/dup2.png new file mode 100644 index 0000000000000000000000000000000000000000..3779d4d33dc0c8b5c7db7e1d8f5cadca4d94f21d GIT binary patch literal 3609 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 literal 0 HcmV?d00001 diff --git a/plugins/android/testData/lint/global/duplicateIcons/expected.xml b/plugins/android/testData/lint/global/duplicateIcons/expected.xml new file mode 100644 index 000000000000..f52bc6d402b0 --- /dev/null +++ b/plugins/android/testData/lint/global/duplicateIcons/expected.xml @@ -0,0 +1,8 @@ + + + + dup2.png + 1 + The following unrelated icon files have identical contents: dup1.png, dup2.png + + \ No newline at end of file diff --git a/plugins/android/testData/lint/global/duplicateIcons/other.png b/plugins/android/testData/lint/global/duplicateIcons/other.png new file mode 100644 index 0000000000000000000000000000000000000000..6adea85766473cb4f9ac2e3dfa64be54af90b9b8 GIT binary patch literal 209 zcmeAS@N?(olHy`uVBq!ia0vp^>>$j+1|*LJg(*Z7pzScqpCXQGk7BR*`%ML~X2b~C& z%MBG~Am)on3fAEVEf^SEbTavlET0g{#3I3 + + + + + + \ No newline at end of file diff --git a/plugins/android/testData/lint/global/manifestOrder/expected.xml b/plugins/android/testData/lint/global/manifestOrder/expected.xml new file mode 100644 index 000000000000..616700c5539d --- /dev/null +++ b/plugins/android/testData/lint/global/manifestOrder/expected.xml @@ -0,0 +1,8 @@ + + + + AndroidManifest.xml + 9 + <uses-sdk> tag appears after <application> tag + + \ No newline at end of file diff --git a/plugins/android/testData/lint/global/proguard/expected.xml b/plugins/android/testData/lint/global/proguard/expected.xml new file mode 100644 index 000000000000..81e12d62c562 --- /dev/null +++ b/plugins/android/testData/lint/global/proguard/expected.xml @@ -0,0 +1,8 @@ + + + + proguard.cfg + 1 + Obsolete proguard file; use -keepclasseswithmembers instead of -keepclasseswithmembernames + + \ No newline at end of file diff --git a/plugins/android/testData/lint/global/proguard/proguard.cfg b/plugins/android/testData/lint/global/proguard/proguard.cfg new file mode 100644 index 000000000000..160247cd3fac --- /dev/null +++ b/plugins/android/testData/lint/global/proguard/proguard.cfg @@ -0,0 +1,3 @@ +-keepclasseswithmembernames class * { + public (android."); +} \ No newline at end of file diff --git a/plugins/android/testSrc/org/jetbrains/android/AndroidLintTest.java b/plugins/android/testSrc/org/jetbrains/android/AndroidLintTest.java index 186b291dd2b4..004f2ea099f6 100644 --- a/plugins/android/testSrc/org/jetbrains/android/AndroidLintTest.java +++ b/plugins/android/testSrc/org/jetbrains/android/AndroidLintTest.java @@ -1,11 +1,20 @@ package org.jetbrains.android; +import com.intellij.analysis.AnalysisScope; import com.intellij.codeInsight.intention.IntentionAction; +import com.intellij.codeInspection.InspectionManager; +import com.intellij.codeInspection.ex.GlobalInspectionContextImpl; import com.intellij.codeInspection.ex.GlobalInspectionToolWrapper; +import com.intellij.codeInspection.ex.InspectionManagerEx; import com.intellij.openapi.application.Result; import com.intellij.openapi.command.WriteCommandAction; import com.intellij.openapi.vfs.VirtualFile; -import org.jetbrains.android.inspections.lint.*; +import com.intellij.testFramework.InspectionTestUtil; +import com.intellij.testFramework.fixtures.impl.CodeInsightTestFixtureImpl; +import org.jetbrains.android.inspections.lint.AndroidAddStringResourceQuickFix; +import org.jetbrains.android.inspections.lint.AndroidLintExternalAnnotator; +import org.jetbrains.android.inspections.lint.AndroidLintInspectionBase; +import org.jetbrains.android.inspections.lint.AndroidLintInspectionToolProvider; import org.jetbrains.android.util.AndroidBundle; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; @@ -18,6 +27,7 @@ import java.io.IOException; */ public class AndroidLintTest extends AndroidTestCase { @NonNls private static final String BASE_PATH = "/lint/"; + @NonNls private static final String BASE_PATH_GLOBAL = BASE_PATH + "global/"; public AndroidLintTest() { super(false); @@ -152,6 +162,44 @@ public class AndroidLintTest extends AndroidTestCase { "/res/values/typography.xml", "xml"); } + public void testProguard() throws Exception { + createManifest(); + myFixture.copyFileToProject(getGlobalTestDir() + "/proguard.cfg", "proguard.cfg"); + doGlobalInspectionTest(new AndroidLintInspectionToolProvider.AndroidLintProguardInspection()); + } + + public void testManifestOrder() throws Exception { + myFixture.copyFileToProject(getGlobalTestDir() + "/AndroidManifest.xml", "AndroidManifest.xml"); + doGlobalInspectionTest(new AndroidLintInspectionToolProvider.AndroidLintManifestOrderInspection()); + } + + public void testDuplicateIcons() throws Exception { + createManifest(); + myFixture.copyFileToProject(getGlobalTestDir() + "/dup1.png", "res/drawable/dup1.png"); + myFixture.copyFileToProject(getGlobalTestDir() + "/dup2.png", "res/drawable/dup2.png"); + myFixture.copyFileToProject(getGlobalTestDir() + "/other.png", "res/drawable/other.png"); + doGlobalInspectionTest(new AndroidLintInspectionToolProvider.AndroidLintIconDuplicatesInspection()); + } + + private void doGlobalInspectionTest(@NotNull AndroidLintInspectionBase inspection) { + final GlobalInspectionToolWrapper wrapper = new GlobalInspectionToolWrapper(inspection); + myFixture.enableInspections(wrapper); + + final AnalysisScope scope = new AnalysisScope(myModule); + scope.invalidate(); + + final InspectionManagerEx inspectionManager = (InspectionManagerEx)InspectionManager.getInstance(getProject()); + final GlobalInspectionContextImpl globalContext = + CodeInsightTestFixtureImpl.createGlobalContextForTool(scope, getProject(), inspectionManager, wrapper); + + InspectionTestUtil.runTool(wrapper, scope, globalContext, inspectionManager); + InspectionTestUtil.compareToolResults(wrapper, false, getTestDataPath() + getGlobalTestDir()); + } + + private String getGlobalTestDir() { + return BASE_PATH_GLOBAL + getTestName(true); + } + private void doTestNoFix(@NotNull AndroidLintInspectionBase inspection, @NotNull String copyTo, @NotNull String extension) throws IOException { doTestHighlighting(inspection, copyTo, extension); From 38df6fd147392f803877088708718fd23f0dbb02 Mon Sep 17 00:00:00 2001 From: "Ekaterina.Tuzova" Date: Mon, 6 Feb 2012 15:29:33 +0400 Subject: [PATCH 018/215] added UI for creation virtual environment --- .../openapi/projectRoots/impl/SdkConfigurationUtil.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platform/lang-impl/src/com/intellij/openapi/projectRoots/impl/SdkConfigurationUtil.java b/platform/lang-impl/src/com/intellij/openapi/projectRoots/impl/SdkConfigurationUtil.java index 30db6d35e0e9..2d612d830f29 100644 --- a/platform/lang-impl/src/com/intellij/openapi/projectRoots/impl/SdkConfigurationUtil.java +++ b/platform/lang-impl/src/com/intellij/openapi/projectRoots/impl/SdkConfigurationUtil.java @@ -354,7 +354,7 @@ public class SdkConfigurationUtil { popup.showUnderneathOf(popupOwner); } - private static List filterExistingPaths(SdkType sdkType, Collection sdkHomes, final Sdk[] sdks) { + public static List filterExistingPaths(SdkType sdkType, Collection sdkHomes, final Sdk[] sdks) { List result = new ArrayList(); for (String sdkHome : sdkHomes) { if (findByPath(sdkType, sdks, sdkHome) == null) { From cbb5f8f5043df7ba24e123b579d92d5dc0edd22e Mon Sep 17 00:00:00 2001 From: Dmitry Avdeev Date: Mon, 6 Feb 2012 15:40:57 +0400 Subject: [PATCH 019/215] IDEA-60923: CDATA error in inspection --- .../impl/analysis/XmlHighlightVisitor.java | 26 ++++++++++--------- .../src/com/intellij/xml/XmlExtension.java | 2 +- 2 files changed, 15 insertions(+), 13 deletions(-) diff --git a/xml/impl/src/com/intellij/codeInsight/daemon/impl/analysis/XmlHighlightVisitor.java b/xml/impl/src/com/intellij/codeInsight/daemon/impl/analysis/XmlHighlightVisitor.java index 30465e7a79ca..669b0d42c469 100644 --- a/xml/impl/src/com/intellij/codeInsight/daemon/impl/analysis/XmlHighlightVisitor.java +++ b/xml/impl/src/com/intellij/codeInsight/daemon/impl/analysis/XmlHighlightVisitor.java @@ -136,21 +136,23 @@ public class XmlHighlightVisitor extends XmlElementVisitor implements HighlightV } } else if (tokenType == XmlTokenType.XML_DATA_CHARACTERS && token.getParent() instanceof XmlText) { if (token.textContains(']') && token.textContains('>')) { + String s = token.getText(); String marker = "]]>"; int i = s.indexOf(marker); - - if (i != -1) { // TODO: fix - TextRange textRange = token.getTextRange(); - int start = textRange.getStartOffset() + i; - HighlightInfoType type = PsiTreeUtil.getParentOfType(token, XmlTag.class) instanceof HtmlTag ? - HighlightInfoType.WARNING : HighlightInfoType.ERROR; - HighlightInfo info = HighlightInfo.createHighlightInfo( - type, - start, start + marker.length(), - XmlErrorMessages.message("cdata.end.should.not.appear.in.content.unless.to.mark.end.of.cdata.section") - ); - addToResults(info); + + if (i != -1 ) { // TODO: fix + XmlTag tag = PsiTreeUtil.getParentOfType(token, XmlTag.class); + if (tag != null && XmlExtension.getExtensionByElement(tag).shouldBeHighlightedAsTag(tag) && !skipValidation(tag)) { + TextRange textRange = token.getTextRange(); + int start = textRange.getStartOffset() + i; + HighlightInfo info = HighlightInfo.createHighlightInfo( + tag instanceof HtmlTag ? HighlightInfoType.WARNING : HighlightInfoType.ERROR, + start, start + marker.length(), + XmlErrorMessages.message("cdata.end.should.not.appear.in.content.unless.to.mark.end.of.cdata.section") + ); + addToResults(info); + } } } } diff --git a/xml/impl/src/com/intellij/xml/XmlExtension.java b/xml/impl/src/com/intellij/xml/XmlExtension.java index 7dcc882d230b..cddc55479e31 100644 --- a/xml/impl/src/com/intellij/xml/XmlExtension.java +++ b/xml/impl/src/com/intellij/xml/XmlExtension.java @@ -59,7 +59,7 @@ public abstract class XmlExtension { return DEFAULT_EXTENSION; } - @Nullable + @SuppressWarnings("ConstantConditions") public static XmlExtension getExtensionByElement(PsiElement element) { final PsiFile psiFile = element.getContainingFile(); if (psiFile != null) { From 4106728643cdf22cfe747f95a74323a32be8e30b Mon Sep 17 00:00:00 2001 From: Sergey Evdokimov Date: Mon, 6 Feb 2012 15:42:49 +0400 Subject: [PATCH 020/215] IDEA-80868 (Grails: When using inplace plugin, plugin is prioritized over project in Grails View) --- .../src/org/jetbrains/plugins/groovy/mvc/MvcFramework.java | 4 ++++ .../plugins/groovy/mvc/projectView/MvcProjectNode.java | 5 ++++- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/mvc/MvcFramework.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/mvc/MvcFramework.java index d18ad53521ba..c92d5b61b675 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/mvc/MvcFramework.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/mvc/MvcFramework.java @@ -102,6 +102,10 @@ public abstract class MvcFramework { return module.getName().endsWith(getCommonPluginSuffix()); } + public List reorderModulesForMvcView(List modules) { + return modules; + } + public abstract String getApplicationDirectoryName(); public void syncSdkAndLibrariesInPluginsModule(@NotNull Module module) { diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/mvc/projectView/MvcProjectNode.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/mvc/projectView/MvcProjectNode.java index e43430267187..8159c2993e8a 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/mvc/projectView/MvcProjectNode.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/mvc/projectView/MvcProjectNode.java @@ -43,7 +43,10 @@ public class MvcProjectNode extends AbstractProjectNode { @NotNull public Collection getChildren() { - final List modules = MvcModuleStructureUtil.getAllModulesWithSupport(myProject, myDescriptor.getFramework()); + List modules = MvcModuleStructureUtil.getAllModulesWithSupport(myProject, myDescriptor.getFramework()); + + modules = myDescriptor.getFramework().reorderModulesForMvcView(modules); + final ArrayList nodes = new ArrayList(); for (Module module : modules) { nodes.add(new MvcModuleNode(module, getSettings(), myDescriptor)); From 1d0b5e90d533b5a78356fc27aa59c90c6d7d6d5c Mon Sep 17 00:00:00 2001 From: Roman Shevchenko Date: Mon, 6 Feb 2012 12:39:14 +0100 Subject: [PATCH 021/215] SVN tests on it's own class path --- plugins/svn4ideaOld/svn4idea-testsOld.iml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/plugins/svn4ideaOld/svn4idea-testsOld.iml b/plugins/svn4ideaOld/svn4idea-testsOld.iml index 0408c596ec62..1135812c57d2 100644 --- a/plugins/svn4ideaOld/svn4idea-testsOld.iml +++ b/plugins/svn4ideaOld/svn4idea-testsOld.iml @@ -34,6 +34,8 @@ + + From a95ecad61365a174c64eebfe0f85bb6566909c70 Mon Sep 17 00:00:00 2001 From: Roman Shevchenko Date: Mon, 6 Feb 2012 12:42:18 +0100 Subject: [PATCH 022/215] Fix library paths --- .idea/libraries/Mac.xml | 22 +++++++++++----------- .idea/libraries/Mocks.xml | 2 +- .idea/libraries/tcServiceMessages.xml | 20 ++++++++++---------- 3 files changed, 22 insertions(+), 22 deletions(-) diff --git a/.idea/libraries/Mac.xml b/.idea/libraries/Mac.xml index dae0b732f5d2..256d4c9e54a9 100644 --- a/.idea/libraries/Mac.xml +++ b/.idea/libraries/Mac.xml @@ -1,12 +1,12 @@ - - - - - - - - - - - + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Mocks.xml b/.idea/libraries/Mocks.xml index ab3be1d54be9..7e4ee7018f4e 100644 --- a/.idea/libraries/Mocks.xml +++ b/.idea/libraries/Mocks.xml @@ -6,7 +6,7 @@ - + diff --git a/.idea/libraries/tcServiceMessages.xml b/.idea/libraries/tcServiceMessages.xml index 2f8bf99242e5..e7fb38a05d50 100644 --- a/.idea/libraries/tcServiceMessages.xml +++ b/.idea/libraries/tcServiceMessages.xml @@ -1,11 +1,11 @@ - - - - - - - - - - + + + + + + + + + + \ No newline at end of file From 14f5a60023474fdae804a817a6f89212a309bc67 Mon Sep 17 00:00:00 2001 From: Eugene Zhuravlev Date: Mon, 6 Feb 2012 13:27:07 +0100 Subject: [PATCH 023/215] IDEA-75922 Debugging lazy loaded JPA entity attributes: added option to suppress auto expressions sin Variables view --- .../DebuggerDataViewsConfigurable.java | 8 ++- .../settings/ViewsGeneralSettings.java | 1 + .../debugger/ui/impl/FrameVariablesTree.java | 62 +++++++++++-------- .../src/messages/DebuggerBundle.properties | 1 + 4 files changed, 45 insertions(+), 27 deletions(-) diff --git a/java/debugger/impl/src/com/intellij/debugger/settings/DebuggerDataViewsConfigurable.java b/java/debugger/impl/src/com/intellij/debugger/settings/DebuggerDataViewsConfigurable.java index 0cb9987c79e7..6d5a9bd4b73a 100644 --- a/java/debugger/impl/src/com/intellij/debugger/settings/DebuggerDataViewsConfigurable.java +++ b/java/debugger/impl/src/com/intellij/debugger/settings/DebuggerDataViewsConfigurable.java @@ -53,6 +53,7 @@ public class DebuggerDataViewsConfigurable implements SearchableConfigurable { private StateRestoringCheckBox myCbShowStaticFinalFields; private final ArrayRendererConfigurable myArrayRendererConfigurable; + private JCheckBox myCbEnableAutoExpressions; private JCheckBox myCbEnableAlternateViews; private JCheckBox myCbEnableToString; @@ -92,6 +93,7 @@ public class DebuggerDataViewsConfigurable implements SearchableConfigurable { myCbShowStatic = new JCheckBox(DebuggerBundle.message("label.base.renderer.configurable.show.static.fields")); myCbShowStaticFinalFields = new StateRestoringCheckBox(DebuggerBundle.message("label.base.renderer.configurable.show.static.final.fields")); myCbEnableAlternateViews = new JCheckBox(DebuggerBundle.message("label.base.renderer.configurable.alternate.view")); + myCbEnableAutoExpressions = new JCheckBox(DebuggerBundle.message("label.base.renderer.configurable.auto.expressions")); myCbShowStatic.addChangeListener(new ChangeListener(){ public void stateChanged(ChangeEvent e) { if(myCbShowStatic.isSelected()) { @@ -163,7 +165,8 @@ public class DebuggerDataViewsConfigurable implements SearchableConfigurable { arraysPanel.setBorder(IdeBorderFactory.createTitledBorder("Arrays", false, true, true)); panel.add(arraysPanel, new GridBagConstraints(0, GridBagConstraints.RELATIVE, 3, 1, 1.0, 0.0, GridBagConstraints.NORTH, GridBagConstraints.HORIZONTAL, new Insets(0, 0, 0, 0), 0, 0)); - panel.add(myCbEnableAlternateViews, new GridBagConstraints(0, GridBagConstraints.RELATIVE, 1, 1, 0.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0, 0, 0, 10), 0, 0)); + panel.add(myCbEnableAutoExpressions, new GridBagConstraints(0, GridBagConstraints.RELATIVE, 1, 1, 0.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0, 0, 0, 10), 0, 0)); + panel.add(myCbEnableAlternateViews, new GridBagConstraints(0, GridBagConstraints.RELATIVE, 1, 1, 0.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(4, 0, 0, 10), 0, 0)); // starting 4-th row panel.add(myCbEnableToString, new GridBagConstraints(0, GridBagConstraints.RELATIVE, 3, 1, 1.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(4, 0, 0, 0), 0, 0)); panel.add(myRbAllThatOverride, new GridBagConstraints(0, GridBagConstraints.RELATIVE, 3, 1, 1.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0, 12, 0, 0), 0, 0)); @@ -189,6 +192,7 @@ public class DebuggerDataViewsConfigurable implements SearchableConfigurable { generalSettings.AUTOSCROLL_TO_NEW_LOCALS = myCbAutoscroll.isSelected(); rendererSettings.setAlternateCollectionViewsEnabled(myCbEnableAlternateViews.isSelected()); generalSettings.HIDE_NULL_ARRAY_ELEMENTS = myCbHideNullArrayElements.isSelected(); + generalSettings.ENABLE_AUTO_EXPRESSIONS = myCbEnableAutoExpressions.isSelected(); final ClassRenderer classRenderer = rendererSettings.getClassRenderer(); classRenderer.SORT_ASCENDING = myCbSort.isSelected(); @@ -219,6 +223,7 @@ public class DebuggerDataViewsConfigurable implements SearchableConfigurable { myCbAutoscroll.setSelected(generalSettings.AUTOSCROLL_TO_NEW_LOCALS); myCbHideNullArrayElements.setSelected(generalSettings.HIDE_NULL_ARRAY_ELEMENTS); myCbEnableAlternateViews.setSelected(rendererSettings.areAlternateCollectionViewsEnabled()); + myCbEnableAutoExpressions.setSelected(generalSettings.ENABLE_AUTO_EXPRESSIONS); ClassRenderer classRenderer = rendererSettings.getClassRenderer(); @@ -264,6 +269,7 @@ public class DebuggerDataViewsConfigurable implements SearchableConfigurable { ViewsGeneralSettings generalSettings = ViewsGeneralSettings.getInstance(); return (generalSettings.AUTOSCROLL_TO_NEW_LOCALS != myCbAutoscroll.isSelected()) || + (generalSettings.ENABLE_AUTO_EXPRESSIONS != myCbEnableAutoExpressions.isSelected()) || (generalSettings.HIDE_NULL_ARRAY_ELEMENTS != myCbHideNullArrayElements.isSelected()) || myAutoTooltip.isChanged(); } diff --git a/java/debugger/impl/src/com/intellij/debugger/settings/ViewsGeneralSettings.java b/java/debugger/impl/src/com/intellij/debugger/settings/ViewsGeneralSettings.java index 6558a3f97422..21d717b66c7b 100644 --- a/java/debugger/impl/src/com/intellij/debugger/settings/ViewsGeneralSettings.java +++ b/java/debugger/impl/src/com/intellij/debugger/settings/ViewsGeneralSettings.java @@ -35,6 +35,7 @@ public class ViewsGeneralSettings implements PersistentStateComponent { public boolean SHOW_OBJECTID = true; public boolean HIDE_NULL_ARRAY_ELEMENTS = true; public boolean AUTOSCROLL_TO_NEW_LOCALS = true; + public boolean ENABLE_AUTO_EXPRESSIONS = true; public ViewsGeneralSettings() { } diff --git a/java/debugger/impl/src/com/intellij/debugger/ui/impl/FrameVariablesTree.java b/java/debugger/impl/src/com/intellij/debugger/ui/impl/FrameVariablesTree.java index 4cea2454b898..9afbfde4d121 100644 --- a/java/debugger/impl/src/com/intellij/debugger/ui/impl/FrameVariablesTree.java +++ b/java/debugger/impl/src/com/intellij/debugger/ui/impl/FrameVariablesTree.java @@ -128,29 +128,35 @@ public class FrameVariablesTree extends DebuggerTree { return; } try { - final Map visibleVariables = getVisibleVariables(stackDescriptor); - final EvaluationContextImpl evalContext = debuggerContext.createEvaluationContext(); - final Pair, Set> usedVars = - ApplicationManager.getApplication().runReadAction(new Computable, Set>>() { - public Pair, Set> compute() { - return findReferencedVars(visibleVariables.keySet(), sourcePosition, evalContext); - } - }); - // add locals - if (myAutoWatchMode) { - for (String var : usedVars.first) { - final LocalVariableDescriptorImpl descriptor = myNodeManager.getLocalVariableDescriptor(stackDescriptor, visibleVariables.get(var)); - myChildren.add(myNodeManager.createNode(descriptor, evaluationContext)); - } - } - else { + if (!ViewsGeneralSettings.getInstance().ENABLE_AUTO_EXPRESSIONS && !myAutoWatchMode) { + // optimization super.buildVariables(stackDescriptor, evaluationContext); } - // add expressions - final EvaluationContextImpl evalContextCopy = evaluationContext.createEvaluationContext(evaluationContext.getThisObject()); - evalContextCopy.setAutoLoadClasses(false); - for (TextWithImports text : usedVars.second) { - myChildren.add(myNodeManager.createNode(myNodeManager.getWatchItemDescriptor(stackDescriptor, text, null), evalContextCopy)); + else { + final Map visibleVariables = getVisibleVariables(stackDescriptor); + final EvaluationContextImpl evalContext = debuggerContext.createEvaluationContext(); + final Pair, Set> usedVars = + ApplicationManager.getApplication().runReadAction(new Computable, Set>>() { + public Pair, Set> compute() { + return findReferencedVars(visibleVariables.keySet(), sourcePosition, evalContext); + } + }); + // add locals + if (myAutoWatchMode) { + for (String var : usedVars.first) { + final LocalVariableDescriptorImpl descriptor = myNodeManager.getLocalVariableDescriptor(stackDescriptor, visibleVariables.get(var)); + myChildren.add(myNodeManager.createNode(descriptor, evaluationContext)); + } + } + else { + super.buildVariables(stackDescriptor, evaluationContext); + } + // add expressions + final EvaluationContextImpl evalContextCopy = evaluationContext.createEvaluationContext(evaluationContext.getThisObject()); + evalContextCopy.setAutoLoadClasses(false); + for (TextWithImports text : usedVars.second) { + myChildren.add(myNodeManager.createNode(myNodeManager.getWatchItemDescriptor(stackDescriptor, text, null), evalContextCopy)); + } } } catch (EvaluateException e) { @@ -450,6 +456,7 @@ public class FrameVariablesTree extends DebuggerTree { private final Set myVars; private final SourcePosition myPosition; private final EvaluationContextImpl myEvalContext; + private final boolean myCollectExpressions; public VariablesCollector(final Set visibleLocals, final TextRange lineRange, @@ -462,6 +469,7 @@ public class FrameVariablesTree extends DebuggerTree { myVars = vars; myPosition = position; myEvalContext = evalContext; + myCollectExpressions = ViewsGeneralSettings.getInstance().ENABLE_AUTO_EXPRESSIONS; } @Override @@ -473,9 +481,11 @@ public class FrameVariablesTree extends DebuggerTree { @Override public void visitMethodCallExpression(final PsiMethodCallExpression expression) { - final PsiMethod psiMethod = expression.resolveMethod(); - if (psiMethod != null && !DebuggerUtils.hasSideEffectsOrReferencesMissingVars(expression, myVisibleLocals)) { - myExpressions.add(new TextWithImportsImpl(expression)); + if (myCollectExpressions) { + final PsiMethod psiMethod = expression.resolveMethod(); + if (psiMethod != null && !DebuggerUtils.hasSideEffectsOrReferencesMissingVars(expression, myVisibleLocals)) { + myExpressions.add(new TextWithImportsImpl(expression)); + } } super.visitMethodCallExpression(expression); } @@ -487,7 +497,7 @@ public class FrameVariablesTree extends DebuggerTree { if (psiElement instanceof PsiVariable) { final PsiVariable var = (PsiVariable)psiElement; if (var instanceof PsiField) { - if (!DebuggerUtils.hasSideEffectsOrReferencesMissingVars(reference, myVisibleLocals)) { + if (myCollectExpressions && !DebuggerUtils.hasSideEffectsOrReferencesMissingVars(reference, myVisibleLocals)) { /* if (var instanceof PsiEnumConstant && reference.getQualifier() == null) { final PsiClass enumClass = ((PsiEnumConstant)var).getContainingClass(); @@ -532,7 +542,7 @@ public class FrameVariablesTree extends DebuggerTree { @Override public void visitArrayAccessExpression(final PsiArrayAccessExpression expression) { - if (!DebuggerUtils.hasSideEffectsOrReferencesMissingVars(expression, myVisibleLocals)) { + if (myCollectExpressions && !DebuggerUtils.hasSideEffectsOrReferencesMissingVars(expression, myVisibleLocals)) { myExpressions.add(new TextWithImportsImpl(expression)); } super.visitArrayAccessExpression(expression); diff --git a/resources-en/src/messages/DebuggerBundle.properties b/resources-en/src/messages/DebuggerBundle.properties index 1e872a490d1e..dfa2fa8b5b58 100644 --- a/resources-en/src/messages/DebuggerBundle.properties +++ b/resources-en/src/messages/DebuggerBundle.properties @@ -183,6 +183,7 @@ label.base.renderer.configurable.show.static.final.fields=Static &final fields label.base.renderer.configurable.show.declared.type=Declared &type label.base.renderer.configurable.show.fq.names=Fully &qualified names label.base.renderer.configurable.show.object.id=Object &id +label.base.renderer.configurable.auto.expressions=Enable auto expressions in Variables view label.base.renderer.configurable.alternate.view=Enable alternative view for Coll&ections classes label.base.renderer.configurable.enable.tostring=Enable 't&oString()' object view: label.base.renderer.configurable.all.overridding=For all classes that override 'toString()' method From f6fe5a32b60e0aa1035ea1c42d69e6ef0c8c42f5 Mon Sep 17 00:00:00 2001 From: Eugene Kudelevsky Date: Mon, 6 Feb 2012 16:49:11 +0400 Subject: [PATCH 024/215] override isToolEnabled(HighlightDisplayKey) --- .../fixtures/impl/CodeInsightTestFixtureImpl.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/platform/testFramework/src/com/intellij/testFramework/fixtures/impl/CodeInsightTestFixtureImpl.java b/platform/testFramework/src/com/intellij/testFramework/fixtures/impl/CodeInsightTestFixtureImpl.java index 5c5a7f2a0fae..35d852f8cacd 100644 --- a/platform/testFramework/src/com/intellij/testFramework/fixtures/impl/CodeInsightTestFixtureImpl.java +++ b/platform/testFramework/src/com/intellij/testFramework/fixtures/impl/CodeInsightTestFixtureImpl.java @@ -1113,6 +1113,10 @@ public class CodeInsightTestFixtureImpl extends BaseFixture implements CodeInsig @Override public boolean isToolEnabled(HighlightDisplayKey key, PsiElement element) { + return isToolEnabled(key); + } + + public boolean isToolEnabled(HighlightDisplayKey key) { return key != null && key.toString() != null && myAvailableTools.containsKey(key.toString()); } From 40907e3e9ffc99569402ebf0133bcaa4f8126daa Mon Sep 17 00:00:00 2001 From: nik Date: Mon, 6 Feb 2012 16:56:45 +0400 Subject: [PATCH 025/215] transfer 'user.home' path variable to compile server --- .../compiler/CompileServerManager.java | 5 +++-- .../impl/ModulePathMacroManager.java | 3 ++- .../application/options/PathMacrosImpl.java | 14 ++++++++++++++ .../components/impl/BasePathMacroManager.java | 18 ++++++------------ 4 files changed, 25 insertions(+), 15 deletions(-) diff --git a/java/compiler/impl/src/com/intellij/compiler/CompileServerManager.java b/java/compiler/impl/src/com/intellij/compiler/CompileServerManager.java index f97ad79d2de0..d69e06a1298c 100644 --- a/java/compiler/impl/src/com/intellij/compiler/CompileServerManager.java +++ b/java/compiler/impl/src/com/intellij/compiler/CompileServerManager.java @@ -462,8 +462,9 @@ public class CompileServerManager implements ApplicationComponent{ private static RequestFuture sendSetupRequest(final @NotNull CompileServerClient client) throws Exception { final Map data = new HashMap(); - // need this for tests and when this macro is missing from PathMacros registry - data.put(PathMacrosImpl.APPLICATION_HOME_MACRO_NAME, FileUtil.toSystemIndependentName(PathManager.getHomePath())); + for (Map.Entry entry : PathMacrosImpl.getGlobalSystemMacros().entrySet()) { + data.put(entry.getKey(), FileUtil.toSystemIndependentName(entry.getValue())); + } final PathMacros pathVars = PathMacros.getInstance(); for (String name : pathVars.getAllMacroNames()) { diff --git a/platform/lang-impl/src/com/intellij/openapi/components/impl/ModulePathMacroManager.java b/platform/lang-impl/src/com/intellij/openapi/components/impl/ModulePathMacroManager.java index ebb4c9358668..693ebd26d06a 100644 --- a/platform/lang-impl/src/com/intellij/openapi/components/impl/ModulePathMacroManager.java +++ b/platform/lang-impl/src/com/intellij/openapi/components/impl/ModulePathMacroManager.java @@ -43,7 +43,8 @@ public class ModulePathMacroManager extends BasePathMacroManager { public ReplacePathToMacroMap getReplacePathMap() { ReplacePathToMacroMap result = super.getReplacePathMap(); if (!myModule.isDisposed()) { - addFileHierarchyReplacements(result, PathMacrosImpl.MODULE_DIR_MACRO_NAME, getModuleDir(myModule.getModuleFilePath()), getUserHome()); + addFileHierarchyReplacements(result, PathMacrosImpl.MODULE_DIR_MACRO_NAME, getModuleDir(myModule.getModuleFilePath()), PathMacrosImpl + .getUserHome()); } return result; } diff --git a/platform/platform-impl/src/com/intellij/application/options/PathMacrosImpl.java b/platform/platform-impl/src/com/intellij/application/options/PathMacrosImpl.java index bdf488d99fc6..27e2c6448614 100644 --- a/platform/platform-impl/src/com/intellij/application/options/PathMacrosImpl.java +++ b/platform/platform-impl/src/com/intellij/application/options/PathMacrosImpl.java @@ -18,6 +18,7 @@ package com.intellij.application.options; import com.google.common.collect.ImmutableSet; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.application.PathMacros; +import com.intellij.openapi.application.PathManager; import com.intellij.openapi.components.ApplicationComponent; import com.intellij.openapi.components.ExpandMacroToPathMap; import com.intellij.openapi.diagnostic.Logger; @@ -25,6 +26,8 @@ import com.intellij.openapi.util.InvalidDataException; import com.intellij.openapi.util.NamedJDOMExternalizable; import com.intellij.openapi.util.RoamingTypeDisabled; import com.intellij.openapi.util.WriteExternalException; +import com.intellij.openapi.util.text.StringUtil; +import com.intellij.util.SystemProperties; import com.intellij.util.concurrency.JBReentrantReadWriteLock; import com.intellij.util.concurrency.LockFactory; import com.intellij.util.containers.ContainerUtil; @@ -181,6 +184,13 @@ public class PathMacrosImpl extends PathMacros implements ApplicationComponent, if (!myIgnoredMacros.contains(name)) myIgnoredMacros.add(name); } + public static Map getGlobalSystemMacros() { + final Map map = new HashMap(); + map.put(APPLICATION_HOME_MACRO_NAME, PathManager.getHomePath()); + map.put(USER_HOME_MACRO_NAME, getUserHome()); + return map; + } + @Override public boolean isIgnoredMacroName(@NotNull String macro) { return myIgnoredMacros.contains(macro); @@ -348,4 +358,8 @@ public class PathMacrosImpl extends PathMacros implements ApplicationComponent, myLock.readLock().unlock(); } } + + public static String getUserHome() { + return StringUtil.trimEnd(SystemProperties.getUserHome(), "/"); + } } diff --git a/platform/platform-impl/src/com/intellij/openapi/components/impl/BasePathMacroManager.java b/platform/platform-impl/src/com/intellij/openapi/components/impl/BasePathMacroManager.java index d29b0c7b035a..c2bd7334b432 100644 --- a/platform/platform-impl/src/com/intellij/openapi/components/impl/BasePathMacroManager.java +++ b/platform/platform-impl/src/com/intellij/openapi/components/impl/BasePathMacroManager.java @@ -17,14 +17,12 @@ package com.intellij.openapi.components.impl; import com.intellij.application.options.PathMacrosImpl; import com.intellij.application.options.ReplacePathToMacroMap; -import com.intellij.openapi.application.PathManager; import com.intellij.openapi.components.ExpandMacroToPathMap; import com.intellij.openapi.components.PathMacroManager; import com.intellij.openapi.components.PathMacroMap; import com.intellij.openapi.components.TrackingPathMacroSubstitutor; import com.intellij.openapi.util.SystemInfo; import com.intellij.openapi.util.text.StringUtil; -import com.intellij.util.SystemProperties; import com.intellij.util.containers.FactoryMap; import org.jdom.Element; import org.jetbrains.annotations.NonNls; @@ -74,22 +72,18 @@ public class BasePathMacroManager extends PathMacroManager { public ExpandMacroToPathMap getExpandMacroMap() { ExpandMacroToPathMap result = new ExpandMacroToPathMap(); - result.addMacroExpand(PathMacrosImpl.APPLICATION_HOME_MACRO_NAME, PathManager.getHomePath()); - result.addMacroExpand(PathMacrosImpl.USER_HOME_MACRO_NAME, getUserHome()); + for (Map.Entry entry : PathMacrosImpl.getGlobalSystemMacros().entrySet()) { + result.addMacroExpand(entry.getKey(), entry.getValue()); + } getPathMacros().addMacroExpands(result); return result; } - protected static String getUserHome() { - return StringUtil.trimEnd(SystemProperties.getUserHome(), "/"); - } - - public ReplacePathToMacroMap getReplacePathMap() { ReplacePathToMacroMap result = new ReplacePathToMacroMap(); - - result.addMacroReplacement(PathManager.getHomePath(), PathMacrosImpl.APPLICATION_HOME_MACRO_NAME); - result.addMacroReplacement(getUserHome(), PathMacrosImpl.USER_HOME_MACRO_NAME); + for (Map.Entry entry : PathMacrosImpl.getGlobalSystemMacros().entrySet()) { + result.addMacroReplacement(entry.getValue(), entry.getKey()); + } getPathMacros().addMacroReplacements(result); return result; } From f0f0264e6db15f68f3781c9315714da799b659ea Mon Sep 17 00:00:00 2001 From: nik Date: Mon, 6 Feb 2012 16:59:18 +0400 Subject: [PATCH 026/215] support for 'extracted directory' elements in artifacts on compile server --- .../artifacts/IncArtifactBuilder.java | 24 +------ .../artifacts/impl/JarsBuilder.java | 38 ++++++---- .../ArtifactInstructionsBuilderImpl.java | 14 ++-- .../instructions/ArtifactSourceRoot.java | 4 ++ .../FileBasedArtifactSourceRoot.java | 23 ++++++ .../JarBasedArtifactSourceRoot.java | 71 ++++++++++++++++++- 6 files changed, 128 insertions(+), 46 deletions(-) diff --git a/jps/jps-builders/src/org/jetbrains/jps/incremental/artifacts/IncArtifactBuilder.java b/jps/jps-builders/src/org/jetbrains/jps/incremental/artifacts/IncArtifactBuilder.java index 6ca0a195981d..971eec712f40 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/incremental/artifacts/IncArtifactBuilder.java +++ b/jps/jps-builders/src/org/jetbrains/jps/incremental/artifacts/IncArtifactBuilder.java @@ -6,7 +6,6 @@ import com.intellij.util.ArrayUtil; import com.intellij.util.SmartList; import com.intellij.util.containers.ContainerUtil; import gnu.trove.THashSet; -import org.jetbrains.jps.PathUtil; import org.jetbrains.jps.artifacts.Artifact; import org.jetbrains.jps.incremental.CompileContext; import org.jetbrains.jps.incremental.ProjectBuildException; @@ -21,7 +20,6 @@ import org.jetbrains.jps.incremental.messages.UptoDateFilesSavedEvent; import org.jetbrains.jps.incremental.storage.BuildDataManager; import java.io.File; -import java.io.IOException; import java.util.*; /** @@ -97,7 +95,7 @@ public class IncArtifactBuilder extends ProjectLevelBuilder { public void process(ArtifactSourceRoot root, Collection destinations) throws Exception { for (DestinationInfo destination : destinations) { if (destination instanceof ExplodedDestinationInfo) { - copyFromRoot(root, filePath, destination.getOutputPath(), outputs); + root.copyFromRoot(filePath, destination.getOutputPath(), outputs); } else { outputs.add(destination.getOutputFilePath()); @@ -126,26 +124,6 @@ public class IncArtifactBuilder extends ProjectLevelBuilder { } } - private static void copyFromRoot(ArtifactSourceRoot root, String path, String outputPath, List outputs) throws IOException { - if (root instanceof FileBasedArtifactSourceRoot) { - final File file = new File(FileUtil.toSystemDependentName(path)); - String targetPath; - if (!file.equals(root.getRootFile())) { - final String relativePath = FileUtil.getRelativePath(FileUtil.toSystemIndependentName(root.getRootFile().getPath()), path, '/'); - targetPath = PathUtil.appendToPath(outputPath, relativePath); - } - else { - targetPath = outputPath; - } - final File targetFile = new File(FileUtil.toSystemDependentName(targetPath)); - FileUtil.copyContent(file, targetFile); - outputs.add(outputPath); - } - else { - //todo[nik] - } - } - private static Set deleteOutdatedFiles(Set deletedFiles, CompileContext context, ArtifactSourceToOutputMapping mapping) throws Exception { if (deletedFiles.isEmpty()) return Collections.emptySet(); diff --git a/jps/jps-builders/src/org/jetbrains/jps/incremental/artifacts/impl/JarsBuilder.java b/jps/jps-builders/src/org/jetbrains/jps/incremental/artifacts/impl/JarsBuilder.java index 4b570e9717c6..1aa7c878c77c 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/incremental/artifacts/impl/JarsBuilder.java +++ b/jps/jps-builders/src/org/jetbrains/jps/incremental/artifacts/impl/JarsBuilder.java @@ -29,6 +29,7 @@ import gnu.trove.THashSet; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import org.jetbrains.jps.PathUtil; import org.jetbrains.jps.incremental.CompileContext; import org.jetbrains.jps.incremental.artifacts.IncArtifactBuilder; import org.jetbrains.jps.incremental.artifacts.instructions.*; @@ -182,22 +183,29 @@ public class JarsBuilder { } } - private void extractFileAndAddToJar(JarOutputStream jarOutputStream, JarBasedArtifactSourceRoot root, String relativePath, THashSet writtenPaths) + private static void extractFileAndAddToJar(final JarOutputStream jarOutputStream, final JarBasedArtifactSourceRoot root, + final String relativeOutputPath, final THashSet writtenPaths) throws IOException { - //todo[nik] - /* - relativePath = addParentDirectories(jarOutputStream, writtenPaths, relativePath); - if (!writtenPaths.add(relativePath)) return; + final long timestamp = root.getRootFile().lastModified(); + root.processEntries(new JarBasedArtifactSourceRoot.EntryProcessor() { + @Override + public void process(@Nullable InputStream inputStream, @NotNull String relativePath) throws IOException { + String pathInJar = addParentDirectories(jarOutputStream, writtenPaths, PathUtil.appendToPath(relativeOutputPath, relativePath)); + if (!writtenPaths.add(pathInJar)) return; - final BufferedInputStream input = ArtifactCompilerUtil.getJarEntryInputStream(root, myContext); - if (input == null) return; + if (inputStream != null) { + ZipEntry entry = new ZipEntry(pathInJar); + entry.setTime(timestamp); + jarOutputStream.putNextEntry(entry); + FileUtil.copy(inputStream, jarOutputStream); + jarOutputStream.closeEntry(); + } + else { + addDirectoryEntry(jarOutputStream, pathInJar + "/"); + } + } + }); - ZipEntry entry = new ZipEntry(relativePath); - entry.setTime(root.getRootFile().lastModified()); - jarOutputStream.putNextEntry(entry); - FileUtil.copy(input, jarOutputStream); - jarOutputStream.closeEntry(); - */ } private void addFileToJar(final @NotNull JarOutputStream jarOutputStream, final @NotNull File jarFile, @NotNull File file, @@ -218,7 +226,7 @@ public class JarsBuilder { while (i != -1) { String prefix = relativePath.substring(0, i+1); if (!writtenPaths.contains(prefix) && prefix.length() > 1) { - addEntry(jarOutputStream, prefix); + addDirectoryEntry(jarOutputStream, prefix); writtenPaths.add(prefix); } i = relativePath.indexOf('/', i + 1); @@ -226,7 +234,7 @@ public class JarsBuilder { return relativePath; } - private static void addEntry(final ZipOutputStream output, @NonNls final String relativePath) throws IOException { + private static void addDirectoryEntry(final ZipOutputStream output, @NonNls final String relativePath) throws IOException { ZipEntry e = new ZipEntry(relativePath); e.setMethod(ZipEntry.STORED); e.setSize(0); diff --git a/jps/jps-builders/src/org/jetbrains/jps/incremental/artifacts/instructions/ArtifactInstructionsBuilderImpl.java b/jps/jps-builders/src/org/jetbrains/jps/incremental/artifacts/instructions/ArtifactInstructionsBuilderImpl.java index 32aa1ffe4568..564c5a5c0056 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/incremental/artifacts/instructions/ArtifactInstructionsBuilderImpl.java +++ b/jps/jps-builders/src/org/jetbrains/jps/incremental/artifacts/instructions/ArtifactInstructionsBuilderImpl.java @@ -46,17 +46,17 @@ public class ArtifactInstructionsBuilderImpl implements ArtifactInstructionsBuil public boolean checkOutputPath(final String outputPath, final ArtifactSourceRoot sourceFile) { //todo[nik] combine intersecting roots - ArtifactSourceRoot old = mySourceByOutput.get(outputPath); - if (old == null) { - mySourceByOutput.put(outputPath, sourceFile); - return true; - } + //ArtifactSourceRoot old = mySourceByOutput.get(outputPath); + //if (old == null) { + // mySourceByOutput.put(outputPath, sourceFile); + // return true; + //} //todo[nik] show warning? - return false; + return true; } public boolean registerJarFile(@NotNull JarInfo jarInfo, @NotNull String outputPath) { - if (mySourceByOutput.containsKey(outputPath) || myJarByPath.containsKey(outputPath)) { + if (myJarByPath.containsKey(outputPath)) { return false; } myJarByPath.put(outputPath, jarInfo); diff --git a/jps/jps-builders/src/org/jetbrains/jps/incremental/artifacts/instructions/ArtifactSourceRoot.java b/jps/jps-builders/src/org/jetbrains/jps/incremental/artifacts/instructions/ArtifactSourceRoot.java index b0bbf9e79d51..5f57da302b7d 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/incremental/artifacts/instructions/ArtifactSourceRoot.java +++ b/jps/jps-builders/src/org/jetbrains/jps/incremental/artifacts/instructions/ArtifactSourceRoot.java @@ -3,6 +3,8 @@ package org.jetbrains.jps.incremental.artifacts.instructions; import org.jetbrains.annotations.NotNull; import java.io.File; +import java.io.IOException; +import java.util.List; /** * @author nik @@ -19,6 +21,8 @@ public abstract class ArtifactSourceRoot { public abstract boolean containsFile(String filePath); + public abstract void copyFromRoot(String filePath, String outputPath, List outputs) throws IOException; + public SourceFileFilter getFilter() { return myFilter; } diff --git a/jps/jps-builders/src/org/jetbrains/jps/incremental/artifacts/instructions/FileBasedArtifactSourceRoot.java b/jps/jps-builders/src/org/jetbrains/jps/incremental/artifacts/instructions/FileBasedArtifactSourceRoot.java index 51df48f08dd8..e07e0305c3e9 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/incremental/artifacts/instructions/FileBasedArtifactSourceRoot.java +++ b/jps/jps-builders/src/org/jetbrains/jps/incremental/artifacts/instructions/FileBasedArtifactSourceRoot.java @@ -2,8 +2,11 @@ package org.jetbrains.jps.incremental.artifacts.instructions; import com.intellij.openapi.util.io.FileUtil; import org.jetbrains.annotations.NotNull; +import org.jetbrains.jps.PathUtil; import java.io.File; +import java.io.IOException; +import java.util.List; /** * @author nik @@ -36,8 +39,28 @@ public class FileBasedArtifactSourceRoot extends ArtifactSourceRoot { return myFile.equals(((FileBasedArtifactSourceRoot)o).myFile); } + @Override + public String toString() { + return myFile.getPath(); + } + @Override public int hashCode() { return 31 * super.hashCode() + myFile.hashCode(); } + + public void copyFromRoot(String filePath, String outputPath, List outputs) throws IOException { + final File file = new File(FileUtil.toSystemDependentName(filePath)); + String targetPath; + if (!file.equals(getRootFile())) { + final String relativePath = FileUtil.getRelativePath(FileUtil.toSystemIndependentName(getRootFile().getPath()), filePath, '/'); + targetPath = PathUtil.appendToPath(outputPath, relativePath); + } + else { + targetPath = outputPath; + } + final File targetFile = new File(FileUtil.toSystemDependentName(targetPath)); + FileUtil.copyContent(file, targetFile); + outputs.add(outputPath); + } } diff --git a/jps/jps-builders/src/org/jetbrains/jps/incremental/artifacts/instructions/JarBasedArtifactSourceRoot.java b/jps/jps-builders/src/org/jetbrains/jps/incremental/artifacts/instructions/JarBasedArtifactSourceRoot.java index 7e8784b1774f..5505f62c7758 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/incremental/artifacts/instructions/JarBasedArtifactSourceRoot.java +++ b/jps/jps-builders/src/org/jetbrains/jps/incremental/artifacts/instructions/JarBasedArtifactSourceRoot.java @@ -1,9 +1,17 @@ package org.jetbrains.jps.incremental.artifacts.instructions; import com.intellij.openapi.util.io.FileUtil; +import com.intellij.openapi.util.text.StringUtil; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import org.jetbrains.jps.PathUtil; +import org.jetbrains.jps.incremental.artifacts.JarPathUtil; -import java.io.File; +import java.io.*; +import java.util.Enumeration; +import java.util.List; +import java.util.zip.ZipEntry; +import java.util.zip.ZipFile; /** * @author nik @@ -43,4 +51,65 @@ public class JarBasedArtifactSourceRoot extends ArtifactSourceRoot { public int hashCode() { return 31 * (31 * super.hashCode() + myJarFile.hashCode()) + myPathInJar.hashCode(); } + + @Override + public String toString() { + return myJarFile.getPath() + JarPathUtil.JAR_SEPARATOR + myPathInJar; + } + + public void processEntries(EntryProcessor processor) throws IOException { + String prefix = StringUtil.trimStart(myPathInJar, "/"); + if (!StringUtil.endsWithChar(prefix, '/')) prefix += "/"; + if (prefix.equals("/")) { + prefix = ""; + } + + ZipFile zipFile = new ZipFile(myJarFile); + try { + final Enumeration entries = zipFile.entries(); + + while (entries.hasMoreElements()) { + ZipEntry entry = entries.nextElement(); + final String name = entry.getName(); + if (name.startsWith(prefix)) { + String relativePath = name.substring(prefix.length()); + processor.process(entry.isDirectory() ? null : zipFile.getInputStream(entry), relativePath); + } + } + } + finally { + zipFile.close(); + } + } + + public void copyFromRoot(String filePath, final String outputPath, final List outputs) throws IOException { + processEntries(new EntryProcessor() { + @Override + public void process(@Nullable InputStream inputStream, @NotNull String relativePath) throws IOException { + final String fullOutputPath = FileUtil.toSystemDependentName(PathUtil.appendToPath(outputPath, relativePath)); + final File outputFile = new File(fullOutputPath); + + FileUtil.createParentDirs(outputFile); + if (inputStream == null) { + outputFile.mkdir(); + } + else { + final BufferedInputStream from = new BufferedInputStream(inputStream); + final BufferedOutputStream to = new BufferedOutputStream(new FileOutputStream(outputFile)); + try { + FileUtil.copy(from, to); + } + finally { + from.close(); + to.close(); + } + } + outputs.add(fullOutputPath); + } + }); + } + + public interface EntryProcessor { + void process(@Nullable InputStream inputStream, @NotNull String relativePath) throws IOException; + } } From a264c250656788378553f561dd4d17a73841e940 Mon Sep 17 00:00:00 2001 From: Shaverdova Elena Date: Mon, 6 Feb 2012 16:56:00 +0400 Subject: [PATCH 027/215] WI-8540 Recursive compare: update data in ui when new data was obtained from refresh before copy --- .../intellij/openapi/diff/impl/dir/DirDiffElement.java | 8 ++++++++ .../intellij/openapi/diff/impl/dir/DirDiffTableModel.java | 5 +++++ 2 files changed, 13 insertions(+) diff --git a/platform/vcs-impl/src/com/intellij/openapi/diff/impl/dir/DirDiffElement.java b/platform/vcs-impl/src/com/intellij/openapi/diff/impl/dir/DirDiffElement.java index 77673fecef21..08f327c3ab49 100644 --- a/platform/vcs-impl/src/com/intellij/openapi/diff/impl/dir/DirDiffElement.java +++ b/platform/vcs-impl/src/com/intellij/openapi/diff/impl/dir/DirDiffElement.java @@ -74,6 +74,14 @@ public class DirDiffElement { return myTarget == null ? "" : getLastModification(myTarget); } + public void updateTargetData() { + if (myTarget != null && !myTarget.isContainer()) { + myTargetLength = myTarget.getSize(); + } else { + myTargetLength = -1; + } + } + private static String getLastModification(DiffElement file) { final long timeStamp = file.getTimeStamp(); return timeStamp < 0 ? "" : DateFormatUtil.formatDateTime(timeStamp); diff --git a/platform/vcs-impl/src/com/intellij/openapi/diff/impl/dir/DirDiffTableModel.java b/platform/vcs-impl/src/com/intellij/openapi/diff/impl/dir/DirDiffTableModel.java index 7dcc9af542d5..8c948b46cff0 100644 --- a/platform/vcs-impl/src/com/intellij/openapi/diff/impl/dir/DirDiffTableModel.java +++ b/platform/vcs-impl/src/com/intellij/openapi/diff/impl/dir/DirDiffTableModel.java @@ -531,6 +531,11 @@ public class DirDiffTableModel extends AbstractTableModel implements DirDiffMode ApplicationManager.getApplication().assertIsDispatchThread(); if (!Disposer.isDisposed(DirDiffTableModel.this)) { DiffElement newElement = diff.get(); + if (newElement == null && element.getTarget() != null) { + final int row = myElements.indexOf(element); + element.updateTargetData(); + fireTableRowsUpdated(row, row); + } refreshElementAfterCopyTo(newElement, element); if (!errorMessage.isNull()) { reportException(errorMessage.get()); From d903b2c9cc11ef5e3b8209be549da02dff0b185e Mon Sep 17 00:00:00 2001 From: peter Date: Mon, 6 Feb 2012 14:14:50 +0100 Subject: [PATCH 028/215] IDEA-64443 'Custom' filetype options don't support Fortran comments --- .../custom/CustomFileTypeLexer.java | 3 +- .../custom/tokens/LineCommentParser.java | 22 +-- .../custom/tokens/PrefixedTokenParser.java | 2 +- .../ide/highlighter/custom/SyntaxTable.java | 2 + .../custom/impl/CustomFileTypeEditor.java | 151 ++++++++---------- .../fileTypes/impl/AbstractFileType.java | 5 + .../src/messages/IdeBundle.properties | 1 - .../custom/CustomFileTypeLexerTest.groovy | 14 +- 8 files changed, 106 insertions(+), 94 deletions(-) diff --git a/platform/lang-impl/src/com/intellij/ide/highlighter/custom/CustomFileTypeLexer.java b/platform/lang-impl/src/com/intellij/ide/highlighter/custom/CustomFileTypeLexer.java index 79731c9373cf..0163a24f0cab 100644 --- a/platform/lang-impl/src/com/intellij/ide/highlighter/custom/CustomFileTypeLexer.java +++ b/platform/lang-impl/src/com/intellij/ide/highlighter/custom/CustomFileTypeLexer.java @@ -17,6 +17,7 @@ package com.intellij.ide.highlighter.custom; import com.intellij.ide.highlighter.custom.tokens.*; +import com.intellij.openapi.util.text.StringUtil; import com.intellij.psi.CustomHighlighterTokenType; import java.util.ArrayList; @@ -36,7 +37,7 @@ public final class CustomFileTypeLexer extends AbstractCustomLexer { } private static List buildTokenParsers(SyntaxTable table, boolean forHighlighting) { - final LineCommentParser lineCommentParser = LineCommentParser.create(table.getLineComment()); + final LineCommentParser lineCommentParser = StringUtil.isEmpty(table.getLineComment()) ? null : new LineCommentParser(table.getLineComment(), table.lineCommentOnlyAtStart); final MultilineCommentParser multilineCommentParser = MultilineCommentParser.create(table.getStartComment(), table.getEndComment()); final NumberParser numberParser = new NumberParser(table.getNumPostfixChars(), table.isIgnoreCase()); diff --git a/platform/lang-impl/src/com/intellij/ide/highlighter/custom/tokens/LineCommentParser.java b/platform/lang-impl/src/com/intellij/ide/highlighter/custom/tokens/LineCommentParser.java index 0dd023de50be..0f358da64732 100644 --- a/platform/lang-impl/src/com/intellij/ide/highlighter/custom/tokens/LineCommentParser.java +++ b/platform/lang-impl/src/com/intellij/ide/highlighter/custom/tokens/LineCommentParser.java @@ -23,8 +23,20 @@ import com.intellij.psi.CustomHighlighterTokenType; * @author dsl */ public class LineCommentParser extends PrefixedTokenParser { - private LineCommentParser(String prefix) { + private final boolean myAtStartOnly; + + public LineCommentParser(String prefix, boolean atStartOnly) { super(prefix, CustomHighlighterTokenType.LINE_COMMENT); + myAtStartOnly = atStartOnly; + } + + @Override + public boolean hasToken(int position) { + if (myAtStartOnly && position > 0 && myBuffer.charAt(position - 1) != '\n') { + return false; + } + + return super.hasToken(position); } protected int getTokenEnd(int position) { @@ -34,12 +46,4 @@ public class LineCommentParser extends PrefixedTokenParser { return position; } - public static LineCommentParser create(String prefix) { - final String trimmedPrefix = prefix.trim(); - if (!"".equals(trimmedPrefix)) { - return new LineCommentParser(prefix); - } else { - return null; - } - } } diff --git a/platform/lang-impl/src/com/intellij/ide/highlighter/custom/tokens/PrefixedTokenParser.java b/platform/lang-impl/src/com/intellij/ide/highlighter/custom/tokens/PrefixedTokenParser.java index 2bdc1972a3c2..c80015baa874 100644 --- a/platform/lang-impl/src/com/intellij/ide/highlighter/custom/tokens/PrefixedTokenParser.java +++ b/platform/lang-impl/src/com/intellij/ide/highlighter/custom/tokens/PrefixedTokenParser.java @@ -30,7 +30,7 @@ public abstract class PrefixedTokenParser extends TokenParser { myPrefix = prefix.toCharArray(); } - public final boolean hasToken(int position) { + public boolean hasToken(int position) { final int start = position; int i; for (i = 0; i < myPrefix.length && position < myEndOffset; i++, position++) { diff --git a/platform/platform-impl/src/com/intellij/ide/highlighter/custom/SyntaxTable.java b/platform/platform-impl/src/com/intellij/ide/highlighter/custom/SyntaxTable.java index e17ef844993d..8301a92cb953 100644 --- a/platform/platform-impl/src/com/intellij/ide/highlighter/custom/SyntaxTable.java +++ b/platform/platform-impl/src/com/intellij/ide/highlighter/custom/SyntaxTable.java @@ -29,6 +29,7 @@ public class SyntaxTable implements Cloneable { private Set myKeywords4; private String myLineComment; + public boolean lineCommentOnlyAtStart; private String myStartComment; private String myEndComment; @@ -175,6 +176,7 @@ public class SyntaxTable implements Cloneable { if (myHasBrackets != syntaxTable.myHasBrackets) return false; if (myHasParens != syntaxTable.myHasParens) return false; if (myHasStringEscapes != syntaxTable.myHasStringEscapes) return false; + if (lineCommentOnlyAtStart != syntaxTable.lineCommentOnlyAtStart) return false; return true; } diff --git a/platform/platform-impl/src/com/intellij/ide/highlighter/custom/impl/CustomFileTypeEditor.java b/platform/platform-impl/src/com/intellij/ide/highlighter/custom/impl/CustomFileTypeEditor.java index eed78729f8fe..6dd5efeeba2c 100644 --- a/platform/platform-impl/src/com/intellij/ide/highlighter/custom/impl/CustomFileTypeEditor.java +++ b/platform/platform-impl/src/com/intellij/ide/highlighter/custom/impl/CustomFileTypeEditor.java @@ -21,42 +21,57 @@ import com.intellij.ide.highlighter.custom.SyntaxTable; import com.intellij.openapi.fileTypes.impl.AbstractFileType; import com.intellij.openapi.options.ConfigurationException; import com.intellij.openapi.options.SettingsEditor; +import com.intellij.openapi.util.text.StringUtil; import com.intellij.ui.*; import com.intellij.ui.components.JBList; +import com.intellij.util.ui.GridBag; +import com.intellij.util.ui.UIUtil; import org.jetbrains.annotations.NotNull; import javax.swing.*; +import javax.swing.event.DocumentEvent; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; -import java.util.Iterator; /** * @author Yura Cangea, dsl */ public class CustomFileTypeEditor extends SettingsEditor { - private final JTextField myFileTypeName = new JTextField(26); - private final JTextField myFileTypeDescr = new JTextField(26); + private final JTextField myFileTypeName = new JTextField(); + private final JTextField myFileTypeDescr = new JTextField(); private final JCheckBox myIgnoreCase = new JCheckBox(IdeBundle.message("checkbox.customfiletype.ignore.case")); private final JCheckBox mySupportBraces = new JCheckBox(IdeBundle.message("checkbox.customfiletype.support.paired.braces")); private final JCheckBox mySupportBrackets = new JCheckBox(IdeBundle.message("checkbox.customfiletype.support.paired.brackets")); private final JCheckBox mySupportParens = new JCheckBox(IdeBundle.message("checkbox.customfiletype.support.paired.parens")); private final JCheckBox mySupportEscapes = new JCheckBox(IdeBundle.message("checkbox.customfiletype.support.string.escapes")); - private final JTextField myLineComment = new JTextField(20); - private final JTextField myBlockCommentStart = new JTextField(20); - private final JTextField myBlockCommentEnd = new JTextField(20); - private final JTextField myHexPrefix = new JTextField(20); - private final JTextField myNumPostfixes = new JTextField(20); + private final JTextField myLineComment = new JTextField(5); + private final JCheckBox myCommentAtLineStart = new JCheckBox(UIUtil.replaceMnemonicAmpersand("&Only at line start")); + private final JTextField myBlockCommentStart = new JTextField(5); + private final JTextField myBlockCommentEnd = new JTextField(5); + private final JTextField myHexPrefix = new JTextField(5); - private final JList[] myKeywordsLists = new JList[]{new JBList(), new JBList(), new JBList(), new JBList()}; + private final JTextField myNumPostfixes = new JTextField(5); + private final JBList[] myKeywordsLists = new JBList[]{new JBList(), new JBList(), new JBList(), new JBList()}; private final DefaultListModel[] myKeywordModels = new DefaultListModel[]{new DefaultListModel(), new DefaultListModel(), new DefaultListModel(), new DefaultListModel()}; private final JButton[] myAddKeywordButtons = new JButton[4]; private final JButton[] myRemoveKeywordButtons = new JButton[4]; public CustomFileTypeEditor() { + myLineComment.getDocument().addDocumentListener(new DocumentAdapter() { + @Override + protected void textChanged(DocumentEvent e) { + boolean enabled = StringUtil.isNotEmpty(myLineComment.getText()); + myCommentAtLineStart.setEnabled(enabled); + if (!enabled) { + myCommentAtLineStart.setSelected(false); + } + } + }); + myCommentAtLineStart.setEnabled(false); } public void resetEditorFrom(AbstractFileType fileType) { @@ -72,23 +87,24 @@ public class CustomFileTypeEditor extends SettingsEditor { myHexPrefix.setText(table.getHexPrefix()); myNumPostfixes.setText(table.getNumPostfixChars()); myIgnoreCase.setSelected(table.isIgnoreCase()); + myCommentAtLineStart.setSelected(table.lineCommentOnlyAtStart); mySupportBraces.setSelected(table.isHasBraces()); mySupportBrackets.setSelected(table.isHasBrackets()); mySupportParens.setSelected(table.isHasParens()); mySupportEscapes.setSelected(table.isHasStringEscapes()); - for (Iterator i = table.getKeywords1().iterator(); i.hasNext();) { - myKeywordModels[0].addElement(i.next()); + for (String s : table.getKeywords1()) { + myKeywordModels[0].addElement(s); } - for (Iterator i = table.getKeywords2().iterator(); i.hasNext();) { - myKeywordModels[1].addElement(i.next()); + for (String s : table.getKeywords2()) { + myKeywordModels[1].addElement(s); } - for (Iterator i = table.getKeywords3().iterator(); i.hasNext();) { - myKeywordModels[2].addElement(i.next()); + for (String s : table.getKeywords3()) { + myKeywordModels[2].addElement(s); } - for (Iterator i = table.getKeywords4().iterator(); i.hasNext();) { - myKeywordModels[3].addElement(i.next()); + for (String s : table.getKeywords4()) { + myKeywordModels[3].addElement(s); } } } @@ -122,83 +138,56 @@ public class CustomFileTypeEditor extends SettingsEditor { JPanel panel = new JPanel(new BorderLayout()); JPanel fileTypePanel = new JPanel(new BorderLayout()); - JPanel _panel0 = new JPanel(new BorderLayout()); JPanel info = new JPanel(new GridBagLayout()); GridBagConstraints gc = new GridBagConstraints(); gc.gridx = 0; gc.gridy = 0; gc.anchor = GridBagConstraints.WEST; - gc.fill = GridBagConstraints.HORIZONTAL; + gc.fill = GridBagConstraints.BOTH; info.add(new JLabel(IdeBundle.message("editbox.customfiletype.name")), gc); gc.gridx = 1; gc.gridy = 0; - info.add(myFileTypeName); + gc.weightx = 1; + info.add(myFileTypeName, gc); + + gc.weightx = 0; gc.gridx = 0; - gc.gridy = 2; + gc.gridy = 1; info.add(new JLabel(IdeBundle.message("editbox.customfiletype.description")), gc); gc.gridx = 1; - gc.gridy = 2; info.add(myFileTypeDescr, gc); - gc.gridx = 0; - gc.gridy = 3; - _panel0.setBorder(BorderFactory.createEmptyBorder(5, 0, 5, 5)); - _panel0.add(info, BorderLayout.WEST); - fileTypePanel.add(_panel0, BorderLayout.NORTH); + info.setBorder(BorderFactory.createEmptyBorder(5, 0, 5, 5)); + fileTypePanel.add(info, BorderLayout.NORTH); - JPanel panel1 = new JPanel(); - panel1.setBorder(IdeBorderFactory.createTitledBorder(IdeBundle.message("group.customfiletype.syntax.highlighting"), false, false, true)); - JPanel highlighterPanel = panel1; + JPanel highlighterPanel = new JPanel(); + highlighterPanel.setBorder(IdeBorderFactory.createTitledBorder(IdeBundle.message("group.customfiletype.syntax.highlighting"), false, false, true)); highlighterPanel.setLayout(new BorderLayout()); - JPanel panel2 = new JPanel(); - panel2.setBorder(IdeBorderFactory.createTitledBorder(IdeBundle.message("group.customfiletype.options"), false, true, true)); - JPanel commentsAndNumbersPanel = panel2; + JPanel commentsAndNumbersPanel = new JPanel(); commentsAndNumbersPanel.setLayout(new GridBagLayout()); JPanel _panel1 = new JPanel(new BorderLayout()); - gc = new GridBagConstraints(); - gc.fill = GridBagConstraints.HORIZONTAL; - gc.anchor = GridBagConstraints.WEST; - gc.gridx = 0; - gc.gridy = 0; - commentsAndNumbersPanel.add(new JLabel(IdeBundle.message("editbox.customfiletype.line.comment")), gc); - gc.gridx = 1; - commentsAndNumbersPanel.add(myLineComment, gc); - gc.gridx = 0; - gc.gridy++; - commentsAndNumbersPanel.add(new JLabel(IdeBundle.message("editbox.customfiletype.block.comment.start")), gc); - gc.gridx = 1; - commentsAndNumbersPanel.add(myBlockCommentStart, gc); - gc.gridx = 0; - gc.gridy++; - commentsAndNumbersPanel.add(new JLabel(IdeBundle.message("editbox.customfiletype.block.comment.end")), gc); - gc.gridx = 1; - commentsAndNumbersPanel.add(myBlockCommentEnd, gc); - gc.gridx = 0; - gc.gridy++; - commentsAndNumbersPanel.add(new JLabel(IdeBundle.message("editbox.customfiletype.hex.prefix")), gc); - gc.gridx = 1; - commentsAndNumbersPanel.add(myHexPrefix, gc); - gc.gridx = 0; - gc.gridy++; - commentsAndNumbersPanel.add(new JLabel(IdeBundle.message("editbox.customfiletype.number.postfixes")), gc); - gc.gridx = 1; - commentsAndNumbersPanel.add(myNumPostfixes, gc); + GridBag gb = new GridBag().setDefaultFill(GridBagConstraints.HORIZONTAL).setDefaultAnchor(GridBagConstraints.WEST).setDefaultInsets(1, + 5, + 1, + 5); + commentsAndNumbersPanel.add(new JLabel(IdeBundle.message("editbox.customfiletype.line.comment")), gb.nextLine().next()); + commentsAndNumbersPanel.add(myLineComment, gb.next()); + commentsAndNumbersPanel.add(myCommentAtLineStart, gb.next().coverLine(2)); - gc.gridx = 0; - gc.gridy++; - commentsAndNumbersPanel.add(mySupportBraces, gc); + commentsAndNumbersPanel.add(new JLabel(IdeBundle.message("editbox.customfiletype.block.comment.start")), gb.nextLine().next()); + commentsAndNumbersPanel.add(myBlockCommentStart, gb.next()); + commentsAndNumbersPanel.add(new JLabel(IdeBundle.message("editbox.customfiletype.block.comment.end")), gb.next()); + commentsAndNumbersPanel.add(myBlockCommentEnd, gb.next()); - gc.gridx = 0; - gc.gridy++; - commentsAndNumbersPanel.add(mySupportBrackets, gc); + commentsAndNumbersPanel.add(new JLabel(IdeBundle.message("editbox.customfiletype.hex.prefix")), gb.nextLine().next()); + commentsAndNumbersPanel.add(myHexPrefix, gb.next()); + commentsAndNumbersPanel.add(new JLabel(IdeBundle.message("editbox.customfiletype.number.postfixes")), gb.next()); + commentsAndNumbersPanel.add(myNumPostfixes, gb.next()); - gc.gridx = 0; - gc.gridy++; - commentsAndNumbersPanel.add(mySupportParens, gc); - - gc.gridx = 0; - gc.gridy++; - commentsAndNumbersPanel.add(mySupportEscapes, gc); + commentsAndNumbersPanel.add(mySupportBraces, gb.nextLine().next().coverLine(2)); + commentsAndNumbersPanel.add(mySupportBrackets, gb.next().next().coverLine(2)); + commentsAndNumbersPanel.add(mySupportParens, gb.nextLine().next().coverLine(2)); + commentsAndNumbersPanel.add(mySupportEscapes, gb.next().next().coverLine(2)); _panel1.add(commentsAndNumbersPanel, BorderLayout.WEST); @@ -206,10 +195,11 @@ public class CustomFileTypeEditor extends SettingsEditor { highlighterPanel.add(_panel1, BorderLayout.NORTH); TabbedPaneWrapper tabbedPaneWrapper = new TabbedPaneWrapper(this); - tabbedPaneWrapper.addTab("1", createKeywordsPanel(0)); - tabbedPaneWrapper.addTab("2", createKeywordsPanel(1)); - tabbedPaneWrapper.addTab("3", createKeywordsPanel(2)); - tabbedPaneWrapper.addTab("4", createKeywordsPanel(3)); + tabbedPaneWrapper.getComponent().setBorder(IdeBorderFactory.createTitledBorder(IdeBundle.message("listbox.customfiletype.keywords"), false, false, true)); + tabbedPaneWrapper.addTab(" 1 ", createKeywordsPanel(0)); + tabbedPaneWrapper.addTab(" 2 ", createKeywordsPanel(1)); + tabbedPaneWrapper.addTab(" 3 ", createKeywordsPanel(2)); + tabbedPaneWrapper.addTab(" 4 ", createKeywordsPanel(3)); highlighterPanel.add(tabbedPaneWrapper.getComponent(), BorderLayout.CENTER); highlighterPanel.add(myIgnoreCase, BorderLayout.SOUTH); @@ -232,9 +222,7 @@ public class CustomFileTypeEditor extends SettingsEditor { } private JPanel createKeywordsPanel(final int index) { - JPanel panel = new JPanel(); - panel.setBorder(IdeBorderFactory.createTitledBorder(IdeBundle.message("listbox.customfiletype.keywords"), false, false, true)); - JPanel keywordsPanel = panel; + JPanel keywordsPanel = new JPanel(); keywordsPanel.setLayout(new BorderLayout()); keywordsPanel.add(ScrollPaneFactory.createScrollPane(myKeywordsLists[index]), BorderLayout.CENTER); @@ -284,6 +272,7 @@ public class CustomFileTypeEditor extends SettingsEditor { syntaxTable.setEndComment(myBlockCommentEnd.getText()); syntaxTable.setHexPrefix(myHexPrefix.getText()); syntaxTable.setNumPostfixChars(myNumPostfixes.getText()); + syntaxTable.lineCommentOnlyAtStart = myCommentAtLineStart.isSelected(); boolean ignoreCase = myIgnoreCase.isSelected(); syntaxTable.setIgnoreCase(ignoreCase); diff --git a/platform/platform-impl/src/com/intellij/openapi/fileTypes/impl/AbstractFileType.java b/platform/platform-impl/src/com/intellij/openapi/fileTypes/impl/AbstractFileType.java index e71e53459c11..8d0fb3ca0383 100644 --- a/platform/platform-impl/src/com/intellij/openapi/fileTypes/impl/AbstractFileType.java +++ b/platform/platform-impl/src/com/intellij/openapi/fileTypes/impl/AbstractFileType.java @@ -55,6 +55,7 @@ public class AbstractFileType extends UserFileType implements @NonNls private static final String VALUE_HAS_BRACKETS = "HAS_BRACKETS"; @NonNls private static final String VALUE_HAS_PARENS = "HAS_PARENS"; @NonNls private static final String VALUE_HAS_STRING_ESCAPES = "HAS_STRING_ESCAPES"; + @NonNls private static final String VALUE_LINE_COMMENT_AT_START = "LINE_COMMENT_AT_START"; @NonNls private static final String ELEMENT_KEYWORDS = "keywords"; @NonNls private static final String ATTRIBUTE_IGNORE_CASE = "ignore_case"; @NonNls private static final String ELEMENT_KEYWORD = "keyword"; @@ -139,6 +140,9 @@ public class AbstractFileType extends UserFileType implements else if (VALUE_NUM_POSTFIXES.equals(name)) { table.setNumPostfixChars(value); } + else if (VALUE_LINE_COMMENT_AT_START.equals(name)) { + table.lineCommentOnlyAtStart = Boolean.valueOf(value).booleanValue(); + } else if (VALUE_HAS_BRACES.equals(name)) { table.setHasBraces(Boolean.valueOf(value).booleanValue()); } @@ -218,6 +222,7 @@ public class AbstractFileType extends UserFileType implements addElementOption(optionsElement, VALUE_HAS_BRACES, table.isHasBraces()); addElementOption(optionsElement, VALUE_HAS_PARENS, table.isHasParens()); addElementOption(optionsElement, VALUE_HAS_STRING_ESCAPES, table.isHasStringEscapes()); + addElementOption(optionsElement, VALUE_LINE_COMMENT_AT_START, table.lineCommentOnlyAtStart); highlightingElement.addContent(optionsElement); diff --git a/platform/platform-resources-en/src/messages/IdeBundle.properties b/platform/platform-resources-en/src/messages/IdeBundle.properties index d8e07adae612..e7945d13d573 100644 --- a/platform/platform-resources-en/src/messages/IdeBundle.properties +++ b/platform/platform-resources-en/src/messages/IdeBundle.properties @@ -201,7 +201,6 @@ button.add=&Add... editbox.customfiletype.name=Name: editbox.customfiletype.description=Description: group.customfiletype.syntax.highlighting=Syntax Highlighting -group.customfiletype.options=Options checkbox.customfiletype.ignore.case=&Ignore case checkbox.customfiletype.support.paired.braces=Support paired b&races checkbox.customfiletype.support.paired.brackets=Support paired bra&ckets diff --git a/platform/platform-tests/testSrc/com/intellij/ide/highlighter/custom/CustomFileTypeLexerTest.groovy b/platform/platform-tests/testSrc/com/intellij/ide/highlighter/custom/CustomFileTypeLexerTest.groovy index b6f0c53e3a68..7311244aae15 100644 --- a/platform/platform-tests/testSrc/com/intellij/ide/highlighter/custom/CustomFileTypeLexerTest.groovy +++ b/platform/platform-tests/testSrc/com/intellij/ide/highlighter/custom/CustomFileTypeLexerTest.groovy @@ -26,7 +26,8 @@ class CustomFileTypeLexerTest extends CustomFileTypeLexerTestBase { protected SyntaxTable createSyntaxTable() { SyntaxTable table = new SyntaxTable(); - table.lineComment = '' + table.lineComment = ';' + table.lineCommentOnlyAtStart = true table.addKeyword1("if"); table.addKeyword1("then"); @@ -44,4 +45,15 @@ class CustomFileTypeLexerTest extends CustomFileTypeLexerTestBase { ['if', ' ', 'length', '(', 'variable', ')', 'then', ' ', 'return', ' ', '1'] as String[]) } + + public void testFortranComments() { + checkTypesAndTokens(''' +foo;noncomment +;comment + ;noncomment +''', + [WHITESPACE, IDENTIFIER, PUNCTUATION, IDENTIFIER, WHITESPACE, LINE_COMMENT, WHITESPACE, PUNCTUATION, IDENTIFIER, WHITESPACE] as IElementType[], + ['\n', 'foo', ';', 'noncomment', '\n', ';comment', '\n ', ';', 'noncomment', '\n'] as String[]) + + } } From 1f8a9e368b574f4a8bcbd0948c320f51c1d9ca61 Mon Sep 17 00:00:00 2001 From: "Maxim.Mossienko" Date: Mon, 6 Feb 2012 17:23:29 +0400 Subject: [PATCH 029/215] info severity transformed into weak_warning --- .../openapi/options/colors/pages/GeneralColorsPage.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platform/lang-impl/src/com/intellij/openapi/options/colors/pages/GeneralColorsPage.java b/platform/lang-impl/src/com/intellij/openapi/options/colors/pages/GeneralColorsPage.java index 9c00557dfbc4..755d819d6627 100644 --- a/platform/lang-impl/src/com/intellij/openapi/options/colors/pages/GeneralColorsPage.java +++ b/platform/lang-impl/src/com/intellij/openapi/options/colors/pages/GeneralColorsPage.java @@ -58,7 +58,7 @@ public class GeneralColorsPage implements ColorSettingsPage, InspectionColorSett "Code Inspections:\n" + " Error\n" + " Warning\n" + - " Info\n" + + " Weak warning\n" + " Deprecated symbol\n" + " Unused symbol\n"+ " Unknown symbol\n" + From f4b55f94e3894f6a3f56c085fc6c8b0015d971e7 Mon Sep 17 00:00:00 2001 From: "Maxim.Mossienko" Date: Mon, 6 Feb 2012 17:24:25 +0400 Subject: [PATCH 030/215] proper message for unresolved doc reference --- .../src/com/intellij/codeInspection/ProblemsHolder.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/platform/lang-api/src/com/intellij/codeInspection/ProblemsHolder.java b/platform/lang-api/src/com/intellij/codeInspection/ProblemsHolder.java index d768bc49e2fe..9d1a226294f3 100644 --- a/platform/lang-api/src/com/intellij/codeInspection/ProblemsHolder.java +++ b/platform/lang-api/src/com/intellij/codeInspection/ProblemsHolder.java @@ -136,6 +136,10 @@ public class ProblemsHolder { } public void registerProblem(@NotNull PsiReference reference) { + registerProblem(reference, inresolvedReferenceMessage(reference), ProblemHighlightType.LIKE_UNKNOWN_SYMBOL); + } + + public static String inresolvedReferenceMessage(PsiReference reference) { String message; if (reference instanceof EmptyResolveMessageProvider) { String pattern = ((EmptyResolveMessageProvider)reference).getUnresolvedMessagePattern(); @@ -144,7 +148,7 @@ public class ProblemsHolder { else { message = CodeInsightBundle.message("error.cannot.resolve.default.message", reference.getCanonicalText()); } - registerProblem(reference, message, ProblemHighlightType.LIKE_UNKNOWN_SYMBOL); + return message; } /** From f4efce92e8c129d49a76414473aecd05b104d248 Mon Sep 17 00:00:00 2001 From: Dmitry Jemerov Date: Mon, 6 Feb 2012 12:46:58 +0100 Subject: [PATCH 031/215] typo --- .../intellij/openapi/options/newEditor/OptionsEditor.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/platform/platform-impl/src/com/intellij/openapi/options/newEditor/OptionsEditor.java b/platform/platform-impl/src/com/intellij/openapi/options/newEditor/OptionsEditor.java index 4e6a613cb055..f126a810cb8d 100644 --- a/platform/platform-impl/src/com/intellij/openapi/options/newEditor/OptionsEditor.java +++ b/platform/platform-impl/src/com/intellij/openapi/options/newEditor/OptionsEditor.java @@ -104,7 +104,7 @@ public class OptionsEditor extends JPanel implements DataProvider, Place.Navigat private final Wrapper mySearchWrapper = new Wrapper(); private final JPanel myLeftSide; - private boolean myFilterFocumentWasChanged; + private boolean myFilterDocumentWasChanged; //[back/forward] private ActionToolbar myToolbar; private Window myWindow; private final PropertiesComponent myProperties; @@ -142,12 +142,12 @@ public class OptionsEditor extends JPanel implements DataProvider, Place.Navigat myTree = new OptionsTree(myProject, groups, getContext()) { @Override protected void onTreeKeyEvent(final KeyEvent e) { - myFilterFocumentWasChanged = false; + myFilterDocumentWasChanged = false; try { mySearch.keyEventToTextField(e); } finally { - if (myFilterFocumentWasChanged && !isFilterFieldVisible()) { + if (myFilterDocumentWasChanged && !isFilterFieldVisible()) { setFilterFieldVisible(true, false, false); } } @@ -883,7 +883,7 @@ public class OptionsEditor extends JPanel implements DataProvider, Place.Navigat final ActionCallback callback = fireUpdate(adjustSelection ? myTree.findNodeFor(toSelect) : null, adjustSelection, now); - myFilterFocumentWasChanged = true; + myFilterDocumentWasChanged = true; return callback; } From a3fb093bcc95e09ef73fc7c20a68771ec1d91f6f Mon Sep 17 00:00:00 2001 From: Dmitry Jemerov Date: Mon, 6 Feb 2012 13:21:08 +0100 Subject: [PATCH 032/215] correctly reset cached version string after changing "Internal Java Platform" in IDEA SDK --- .../openapi/projectRoots/impl/ProjectJdkImpl.java | 10 +++++++++- .../devkit/src/projectRoots/IdeaJdkConfigurable.java | 2 ++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/platform/lang-impl/src/com/intellij/openapi/projectRoots/impl/ProjectJdkImpl.java b/platform/lang-impl/src/com/intellij/openapi/projectRoots/impl/ProjectJdkImpl.java index 97fe325586f1..876484fa60bc 100644 --- a/platform/lang-impl/src/com/intellij/openapi/projectRoots/impl/ProjectJdkImpl.java +++ b/platform/lang-impl/src/com/intellij/openapi/projectRoots/impl/ProjectJdkImpl.java @@ -103,6 +103,11 @@ public class ProjectJdkImpl extends UserDataHolderBase implements JDOMExternaliz return myVersionString; } + public final void resetVersionString() { + myVersionDefined = false; + myVersionString = null; + } + public String getHomePath() { return myHomePath; } @@ -228,13 +233,16 @@ public class ProjectJdkImpl extends UserDataHolderBase implements JDOMExternaliz return myRootProvider; } - public void copyTo(ProjectJdkImpl dest){ + public void copyTo(ProjectJdkImpl dest) { final String name = getName(); dest.setName(name); dest.setHomePath(getHomePath()); if (myVersionDefined) { dest.setVersionString(getVersionString()); } + else { + dest.resetVersionString(); + } dest.setSdkAdditionalData(getSdkAdditionalData()); dest.myRootContainer.startChange(); dest.myRootContainer.removeAllRoots(); diff --git a/plugins/devkit/src/projectRoots/IdeaJdkConfigurable.java b/plugins/devkit/src/projectRoots/IdeaJdkConfigurable.java index 131689a805ca..324693e97f5e 100644 --- a/plugins/devkit/src/projectRoots/IdeaJdkConfigurable.java +++ b/plugins/devkit/src/projectRoots/IdeaJdkConfigurable.java @@ -22,6 +22,7 @@ import com.intellij.openapi.fileChooser.FileChooserDescriptor; import com.intellij.openapi.fileChooser.FileChooserDescriptorFactory; import com.intellij.openapi.options.ConfigurationException; import com.intellij.openapi.projectRoots.*; +import com.intellij.openapi.projectRoots.impl.ProjectJdkImpl; import com.intellij.openapi.roots.OrderRootType; import com.intellij.openapi.util.Comparing; import com.intellij.openapi.util.io.FileUtil; @@ -211,6 +212,7 @@ public class IdeaJdkConfigurable implements AdditionalDataConfigurable { modificator.commitChanges(); } }); + ((ProjectJdkImpl) myIdeaJdk).resetVersionString(); myModified = false; } From a65b0fc2f0c18b490677b209129aa4723eb55027 Mon Sep 17 00:00:00 2001 From: Dmitry Jemerov Date: Mon, 6 Feb 2012 13:53:14 +0100 Subject: [PATCH 033/215] correctly cancel drag of debugger contents by Esc --- .../com/intellij/execution/ui/layout/impl/RunnerContentUi.java | 1 + 1 file changed, 1 insertion(+) diff --git a/platform/lang-impl/src/com/intellij/execution/ui/layout/impl/RunnerContentUi.java b/platform/lang-impl/src/com/intellij/execution/ui/layout/impl/RunnerContentUi.java index d7cdcf4eb107..23ce51a8eddf 100644 --- a/platform/lang-impl/src/com/intellij/execution/ui/layout/impl/RunnerContentUi.java +++ b/platform/lang-impl/src/com/intellij/execution/ui/layout/impl/RunnerContentUi.java @@ -1609,6 +1609,7 @@ public class RunnerContentUi implements ContentUI, Disposable, CellTransform.Fac @Override public void dragOutCancelled(TabInfo source) { + source.setHidden(false); mySession.cancel(); mySession = null; } From 29f8f5dfef1427a01d80c662b7ba229a7d25ecdb Mon Sep 17 00:00:00 2001 From: Dmitry Jemerov Date: Mon, 6 Feb 2012 14:14:03 +0100 Subject: [PATCH 034/215] cancel toolwindow button drag on Esc (IDEA-61032) --- .../openapi/wm/impl/StripeButton.java | 27 ++++++++++++++++--- 1 file changed, 23 insertions(+), 4 deletions(-) diff --git a/platform/platform-impl/src/com/intellij/openapi/wm/impl/StripeButton.java b/platform/platform-impl/src/com/intellij/openapi/wm/impl/StripeButton.java index bd9f76961f24..3d055759b555 100644 --- a/platform/platform-impl/src/com/intellij/openapi/wm/impl/StripeButton.java +++ b/platform/platform-impl/src/com/intellij/openapi/wm/impl/StripeButton.java @@ -34,10 +34,7 @@ import org.jetbrains.annotations.Nullable; import javax.swing.*; import javax.swing.border.Border; import java.awt.*; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.awt.event.MouseEvent; -import java.awt.event.MouseMotionAdapter; +import java.awt.event.*; import java.awt.image.BufferedImage; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; @@ -63,6 +60,8 @@ public final class StripeButton extends AnchoredButton implements ActionListener private JLabel myDragButtonImage; private Point myPressedPoint; private Stripe myLastStripe; + private KeyEventDispatcher myDragKeyEventDispatcher; + private boolean myDragCancelled = false; StripeButton(@NotNull final InternalDecorator decorator, ToolWindowsPane pane) { myDecorator = decorator; @@ -172,6 +171,7 @@ public final class StripeButton extends AnchoredButton implements ActionListener } private void processDrag(final MouseEvent e) { + if (myDragCancelled) return; if (!isDraggingNow()) { if (myPressedPoint == null) return; if (isWithinDeadZone(e)) return; @@ -190,6 +190,8 @@ public final class StripeButton extends AnchoredButton implements ActionListener myDragButtonImage.setSize(myDragButtonImage.getPreferredSize()); setVisible(false); myPane.startDrag(); + myDragKeyEventDispatcher = new DragKeyEventDispatcher(); + KeyboardFocusManager.getCurrentKeyboardFocusManager().addKeyEventDispatcher(myDragKeyEventDispatcher); } if (!isDraggingNow()) return; @@ -217,6 +219,18 @@ public final class StripeButton extends AnchoredButton implements ActionListener myLastStripe = stripe; } + private class DragKeyEventDispatcher implements KeyEventDispatcher { + @Override + public boolean dispatchKeyEvent(KeyEvent e) { + if (isDraggingNow() && e.getKeyCode() == KeyEvent.VK_ESCAPE && e.getID() == KeyEvent.KEY_PRESSED) { + myDragCancelled = true; + finishDragging(); + return true; + } + return false; + } + } + private boolean isWithinDeadZone(final MouseEvent e) { return Math.abs(myPressedPoint.x - e.getPoint().x) < MouseDragHelper.DRAG_START_DEADZONE && Math.abs(myPressedPoint.y - e.getPoint().y) < MouseDragHelper .DRAG_START_DEADZONE; @@ -244,6 +258,7 @@ public final class StripeButton extends AnchoredButton implements ActionListener if (MouseEvent.MOUSE_PRESSED == e.getID()) { myPressedPoint = e.getPoint(); myPressedWhenSelected = isSelected(); + myDragCancelled = false; } else if (MouseEvent.MOUSE_RELEASED == e.getID()) { finishDragging(); @@ -361,6 +376,10 @@ public final class StripeButton extends AnchoredButton implements ActionListener myLastStripe.finishDrop(); myLastStripe = null; } + if (myDragKeyEventDispatcher != null) { + KeyboardFocusManager.getCurrentKeyboardFocusManager().removeKeyEventDispatcher(myDragKeyEventDispatcher); + myDragKeyEventDispatcher = null; + } } From f24cd2886165aaa25e649e8a0f5f146af0c48344 Mon Sep 17 00:00:00 2001 From: Dmitry Jemerov Date: Mon, 6 Feb 2012 15:14:08 +0100 Subject: [PATCH 035/215] more flexible API for customizing PathEditor toolbar --- .../JavadocOrderRootTypeUIFactory.java | 26 ++++++++++++--- .../openapi/projectRoots/ui/PathEditor.java | 33 ++++--------------- 2 files changed, 28 insertions(+), 31 deletions(-) diff --git a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/libraryEditor/JavadocOrderRootTypeUIFactory.java b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/libraryEditor/JavadocOrderRootTypeUIFactory.java index 728fd1617933..1ca685dd606b 100644 --- a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/libraryEditor/JavadocOrderRootTypeUIFactory.java +++ b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/libraryEditor/JavadocOrderRootTypeUIFactory.java @@ -20,6 +20,8 @@ */ package com.intellij.openapi.roots.ui.configuration.libraryEditor; +import com.intellij.openapi.actionSystem.AnActionEvent; +import com.intellij.openapi.actionSystem.CustomShortcutSet; import com.intellij.openapi.fileChooser.FileChooserDescriptorFactory; import com.intellij.openapi.project.ProjectBundle; import com.intellij.openapi.projectRoots.JavaSdk; @@ -31,6 +33,10 @@ import com.intellij.openapi.roots.JavadocOrderRootType; import com.intellij.openapi.roots.ui.OrderRootTypeUIFactory; import com.intellij.openapi.util.IconLoader; import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.ui.AnActionButton; +import com.intellij.ui.AnActionButtonUpdater; +import com.intellij.ui.ToolbarDecorator; +import com.intellij.util.PlatformIcons; import javax.swing.*; @@ -62,12 +68,24 @@ public class JavadocOrderRootTypeUIFactory implements OrderRootTypeUIFactory { } @Override - protected boolean isShowUrlButton() { - return true; + protected void addToolbarButtons(ToolbarDecorator toolbarDecorator) { + AnActionButton specifyUrlButton = new AnActionButton(ProjectBundle.message("sdk.paths.specify.url.button"), PlatformIcons.TABLE_URL) { + @Override + public void actionPerformed(AnActionEvent e) { + onSpecifyUrlButtonClicked(); + } + }; + specifyUrlButton.setShortcut(CustomShortcutSet.fromString("alt S")); + specifyUrlButton.addCustomUpdater(new AnActionButtonUpdater() { + @Override + public boolean isEnabled(AnActionEvent e) { + return myEnabled && !isUrlInserted(); + } + }); + toolbarDecorator.addExtraAction(specifyUrlButton); } - @Override - protected void onSpecifyUrlButtonClicked() { + private void onSpecifyUrlButtonClicked() { VirtualFile virtualFile = Util.showSpecifyJavadocUrlDialog(myPanel, getInitialValue()); if(virtualFile != null){ addElement(virtualFile); diff --git a/platform/lang-api/src/com/intellij/openapi/projectRoots/ui/PathEditor.java b/platform/lang-api/src/com/intellij/openapi/projectRoots/ui/PathEditor.java index bf285be9c8a4..26732a0f1817 100644 --- a/platform/lang-api/src/com/intellij/openapi/projectRoots/ui/PathEditor.java +++ b/platform/lang-api/src/com/intellij/openapi/projectRoots/ui/PathEditor.java @@ -17,7 +17,6 @@ package com.intellij.openapi.projectRoots.ui; import com.intellij.ide.DataManager; import com.intellij.openapi.actionSystem.AnActionEvent; -import com.intellij.openapi.actionSystem.CustomShortcutSet; import com.intellij.openapi.actionSystem.PlatformDataKeys; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.diagnostic.Logger; @@ -26,7 +25,6 @@ import com.intellij.openapi.fileChooser.FileChooserDescriptor; import com.intellij.openapi.fileChooser.FileChooserDialog; import com.intellij.openapi.fileTypes.FileTypes; import com.intellij.openapi.project.Project; -import com.intellij.openapi.project.ProjectBundle; import com.intellij.openapi.util.Computable; import com.intellij.openapi.util.IconLoader; import com.intellij.openapi.vfs.JarFileSystem; @@ -61,7 +59,7 @@ public class PathEditor { private DefaultListModel myModel; private final Set myAllFiles = new HashSet(); private boolean myModified = false; - private boolean myEnabled = false; + protected boolean myEnabled = false; private static final Icon ICON_INVALID = IconLoader.getIcon("/nodes/ppInvalid.png"); private static final Icon ICON_EMPTY = IconLoader.getIcon("/nodes/emptyNode.png"); private final FileChooserDescriptor myDescriptor; @@ -81,13 +79,6 @@ public class PathEditor { myEnabled = enabled; } - protected boolean isShowUrlButton() { - return false; - } - - protected void onSpecifyUrlButtonClicked() { - } - protected void setModified(boolean modified) { myModified = modified; } @@ -143,22 +134,7 @@ public class PathEditor { } }); - if (isShowUrlButton()) { - AnActionButton specifyUrlButton = new AnActionButton(ProjectBundle.message("sdk.paths.specify.url.button"), PlatformIcons.TABLE_URL) { - @Override - public void actionPerformed(AnActionEvent e) { - onSpecifyUrlButtonClicked(); - } - }; - specifyUrlButton.setShortcut(CustomShortcutSet.fromString("alt S")); - specifyUrlButton.addCustomUpdater(new AnActionButtonUpdater() { - @Override - public boolean isEnabled(AnActionEvent e) { - return myEnabled && !isUrlInserted(); - } - }); - toolbarDecorator.addExtraAction(specifyUrlButton); - } + addToolbarButtons(toolbarDecorator); myPanel = toolbarDecorator.createPanel(); myPanel.setBorder(null); @@ -180,6 +156,9 @@ public class PathEditor { return myPanel; } + protected void addToolbarButtons(ToolbarDecorator toolbarDecorator) { + } + protected void doRemoveItems(int[] idxs, JList list) { List removedItems = ListUtil.removeIndices(list, idxs); itemsRemoved(removedItems); @@ -234,7 +213,7 @@ public class PathEditor { return files; } - private boolean isUrlInserted() { + protected boolean isUrlInserted() { if (getRowCount() > 0) { return ((VirtualFile)getListModel().lastElement()).getFileSystem() instanceof HttpFileSystem; } From 60cf27f6f120d21469141d82b3b967eb72fae6b5 Mon Sep 17 00:00:00 2001 From: peter Date: Mon, 6 Feb 2012 15:22:25 +0100 Subject: [PATCH 036/215] unread notifications number closer to the icon --- .../com/intellij/notification/impl/IdeNotificationArea.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/platform/platform-impl/src/com/intellij/notification/impl/IdeNotificationArea.java b/platform/platform-impl/src/com/intellij/notification/impl/IdeNotificationArea.java index ae7d7140ab17..99dfd4cea7e8 100644 --- a/platform/platform-impl/src/com/intellij/notification/impl/IdeNotificationArea.java +++ b/platform/platform-impl/src/com/intellij/notification/impl/IdeNotificationArea.java @@ -170,7 +170,7 @@ public class IdeNotificationArea extends JLabel implements CustomStatusBarWidget public TextIcon(IdeNotificationArea component, String str) { myStr = str; myComponent = component; - myWidth = myComponent.getFontMetrics(calcFont()).stringWidth(myStr) + 2; + myWidth = myComponent.getFontMetrics(calcFont()).stringWidth(myStr) + 5; } @Override @@ -181,7 +181,7 @@ public class IdeNotificationArea extends JLabel implements CustomStatusBarWidget y += getIconHeight() - g.getFontMetrics().getDescent(); g.setColor(Color.BLACK); - g.drawString(myStr, x + 1, y); + g.drawString(myStr, x, y); g.setFont(originalFont); g.setColor(originalColor); From 2fc406718852a051894227cff7fe3434acab09b6 Mon Sep 17 00:00:00 2001 From: Konstantin Bulenkov Date: Mon, 6 Feb 2012 15:18:51 +0100 Subject: [PATCH 037/215] ability to override standard actions --- .../src/com/intellij/openapi/ui/DialogWrapper.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/platform/platform-api/src/com/intellij/openapi/ui/DialogWrapper.java b/platform/platform-api/src/com/intellij/openapi/ui/DialogWrapper.java index 093a628d51a7..ae9ed058fe81 100644 --- a/platform/platform-api/src/com/intellij/openapi/ui/DialogWrapper.java +++ b/platform/platform-api/src/com/intellij/openapi/ui/DialogWrapper.java @@ -108,9 +108,9 @@ public abstract class DialogWrapper { private boolean myCrossClosesWindow = true; private Insets myButtonMargins = new Insets(2, 16, 2, 16); - private Action myOKAction; - private Action myCancelAction; - private Action myHelpAction; + protected Action myOKAction; + protected Action myCancelAction; + protected Action myHelpAction; private JButton[] myButtons; private boolean myClosed = false; @@ -1468,8 +1468,8 @@ public abstract class DialogWrapper { protected abstract void doAction(ActionEvent e); } - private class OkAction extends DialogWrapperAction { - private OkAction() { + protected class OkAction extends DialogWrapperAction { + protected OkAction() { super(CommonBundle.getOkButtonText()); putValue(DEFAULT_ACTION, Boolean.TRUE); } @@ -1484,7 +1484,7 @@ public abstract class DialogWrapper { } } - private class CancelAction extends DialogWrapperAction { + protected class CancelAction extends DialogWrapperAction { private CancelAction() { super(CommonBundle.getCancelButtonText()); } From d2567ee7efbfea29105e0706a5603a85fef796dd Mon Sep 17 00:00:00 2001 From: Konstantin Bulenkov Date: Mon, 6 Feb 2012 15:19:37 +0100 Subject: [PATCH 038/215] Ctrl+Enter in evaluate expression adds it into watches --- .../ui/ExpressionEvaluationDialog.java | 53 ++++++++++++++++--- 1 file changed, 46 insertions(+), 7 deletions(-) diff --git a/java/debugger/impl/src/com/intellij/debugger/ui/ExpressionEvaluationDialog.java b/java/debugger/impl/src/com/intellij/debugger/ui/ExpressionEvaluationDialog.java index eab6dd027d74..c3b76db7be21 100644 --- a/java/debugger/impl/src/com/intellij/debugger/ui/ExpressionEvaluationDialog.java +++ b/java/debugger/impl/src/com/intellij/debugger/ui/ExpressionEvaluationDialog.java @@ -28,10 +28,14 @@ import com.intellij.openapi.actionSystem.AnActionEvent; import com.intellij.openapi.actionSystem.CustomShortcutSet; import com.intellij.openapi.help.HelpManager; import com.intellij.openapi.project.Project; +import com.intellij.openapi.util.SystemInfo; +import com.intellij.ui.IdeBorderFactory; +import com.intellij.util.ui.UIUtil; import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; +import java.awt.event.InputEvent; import java.awt.event.KeyEvent; public class ExpressionEvaluationDialog extends EvaluationDialog { @@ -77,15 +81,25 @@ public class ExpressionEvaluationDialog extends EvaluationDialog { } protected JComponent createCenterPanel() { - final JPanel panel = new JPanel(new GridBagLayout()); + final JPanel panel = new JPanel(new BorderLayout()); - final JLabel expressionLabel = new JLabel(DebuggerBundle.message("label.evaluate.dialog.expression")); - panel.add(expressionLabel, new GridBagConstraints(0, GridBagConstraints.RELATIVE, 1, 1, 0.0, 0.0, GridBagConstraints.BASELINE_LEADING, GridBagConstraints.NONE, new Insets(0, 0, 0, 0), 0, 0)); - panel.add(getExpressionCombo(), new GridBagConstraints(1, GridBagConstraints.RELATIVE, 1, 1, 1.0, 0.0, GridBagConstraints.BASELINE_LEADING, GridBagConstraints.HORIZONTAL, new Insets(0, 10, 0, 0), 0, 0)); + final JPanel exprPanel = new JPanel(new BorderLayout()); + exprPanel.add(new JLabel(DebuggerBundle.message("label.evaluate.dialog.expression")), BorderLayout.WEST); + exprPanel.add(getExpressionCombo(), BorderLayout.CENTER); + final JLabel help = new JLabel( + String.format("Press Enter to Evaluate or %s+Enter to evaluate and add to the Watches", SystemInfo.isMac ? "Meta" : "Control"), SwingConstants.RIGHT); + help.setBorder(IdeBorderFactory.createEmptyBorder(2,0,6,0)); + UIUtil.applyStyle(UIUtil.ComponentStyle.MINI, help); + help.setForeground(UIUtil.getInactiveTextColor()); + exprPanel.add(help, BorderLayout.SOUTH); - final JLabel resultLabel = new JLabel(DebuggerBundle.message("label.evaluate.dialog.result")); - panel.add(resultLabel, new GridBagConstraints(0, GridBagConstraints.RELATIVE, 2, 1, 1.0, 0.0, GridBagConstraints.NORTHWEST, GridBagConstraints.NONE, new Insets(5, 0, 0, 0), 0, 0)); - panel.add(getEvaluationPanel(), new GridBagConstraints(0, GridBagConstraints.RELATIVE, 2, 1, 1.0, 1.0, GridBagConstraints.NORTHWEST, GridBagConstraints.BOTH, new Insets(5, 0, 0, 0), 0, 0)); + + final JPanel resultPanel = new JPanel(new BorderLayout()); + //resultPanel.add(new JLabel(DebuggerBundle.message("label.evaluate.dialog.result")), BorderLayout.NORTH); + resultPanel.add(getEvaluationPanel(), BorderLayout.CENTER); + + panel.add(exprPanel, BorderLayout.NORTH); + panel.add(resultPanel, BorderLayout.CENTER); return panel; } @@ -103,6 +117,31 @@ public class ExpressionEvaluationDialog extends EvaluationDialog { return new Action[] { getOKAction(), getCancelAction(), new SwitchAction(), getHelpAction() } ; } + @Override + protected void createDefaultActions() { + super.createDefaultActions(); + myOKAction = new OkAction(){ + @Override + public void actionPerformed(ActionEvent e) { + super.actionPerformed(e); + final int mask = SystemInfo.isMac ? InputEvent.META_MASK : InputEvent.CTRL_MASK; + if ((e.getModifiers() & mask) != 0) { + addCurrentExpressionToWatches(); + } + } + }; + } + + private void addCurrentExpressionToWatches() { + final DebuggerSessionTab tab = DebuggerPanelsManager.getInstance(getProject()).getSessionTab(); + if (tab != null) { + final TextWithImports evaluate = getCodeToEvaluate(); + if (evaluate != null) { + tab.getWatchPanel().getWatchTree().addWatch(evaluate); + } + } + } + protected void doHelpAction() { HelpManager.getInstance().invokeHelp(HelpID.EVALUATE); } From f3dc6d77e92f77eed4f90e77f380472d952d64ff Mon Sep 17 00:00:00 2001 From: Konstantin Bulenkov Date: Mon, 6 Feb 2012 15:21:55 +0100 Subject: [PATCH 039/215] NPE fix --- .../com/intellij/ide/util/treeView/AbstractTreeUi.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/platform/platform-api/src/com/intellij/ide/util/treeView/AbstractTreeUi.java b/platform/platform-api/src/com/intellij/ide/util/treeView/AbstractTreeUi.java index 2e21403db49b..b892cd36e489 100644 --- a/platform/platform-api/src/com/intellij/ide/util/treeView/AbstractTreeUi.java +++ b/platform/platform-api/src/com/intellij/ide/util/treeView/AbstractTreeUi.java @@ -4811,9 +4811,13 @@ public class AbstractTreeUi { public boolean isInStructure(@Nullable Object element) { Object eachParent = element; + final AbstractTreeStructure structure = getTreeStructure(); + + if (structure == null) return false; + while (eachParent != null) { - if (getTreeStructure().getRootElement().equals(eachParent)) return true; - eachParent = getTreeStructure().getParentElement(eachParent); + if (Comparing.equal(structure.getRootElement(), eachParent)) return true; + eachParent = structure.getParentElement(eachParent); } return false; From 3a8482e21a3a3532b5b078309ea3dc52d2b938af Mon Sep 17 00:00:00 2001 From: "kirill.safonov" Date: Mon, 6 Feb 2012 18:55:19 +0400 Subject: [PATCH 040/215] Project view: custom validation for Flex build configurations - step 1 --- .../daemon/ModuleProjectStructureElement.java | 11 +++-- .../ProjectStructureDaemonAnalyzer.java | 2 +- .../daemon/ProjectStructureValidator.java | 41 +++++++++++++++++++ resources/src/idea/RichPlatformPlugin.xml | 3 ++ 4 files changed, 53 insertions(+), 4 deletions(-) create mode 100644 java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/projectRoot/daemon/ProjectStructureValidator.java diff --git a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/projectRoot/daemon/ModuleProjectStructureElement.java b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/projectRoot/daemon/ModuleProjectStructureElement.java index 6f3b39a5893c..bd4dd49ce2f9 100644 --- a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/projectRoot/daemon/ModuleProjectStructureElement.java +++ b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/projectRoot/daemon/ModuleProjectStructureElement.java @@ -32,8 +32,7 @@ public class ModuleProjectStructureElement extends ProjectStructureElement { return myModule; } - @Override - public void check(ProjectStructureProblemsHolder problemsHolder) { + public void checkModulesNames(ProjectStructureProblemsHolder problemsHolder) { final ModifiableModuleModel moduleModel = myContext.getModulesConfigurator().getModuleModel(); final Module[] all = moduleModel.getModules(); if (!ArrayUtil.contains(myModule, all)) { @@ -42,11 +41,17 @@ public class ModuleProjectStructureElement extends ProjectStructureElement { for (Module each : all) { if (each != myModule && myContext.getRealName(each).equals(myContext.getRealName(myModule))) { - problemsHolder.registerProblem(ProjectBundle.message("project.roots.module.duplicate.name.message"), null, ProjectStructureProblemType.error("duplicate-module-name"), createPlace(), + problemsHolder.registerProblem(ProjectBundle.message("project.roots.module.duplicate.name.message"), null, + ProjectStructureProblemType.error("duplicate-module-name"), createPlace(), null); break; } } + } + + @Override + public void check(ProjectStructureProblemsHolder problemsHolder) { + checkModulesNames(problemsHolder); final ModuleRootModel rootModel = myContext.getModulesConfigurator().getRootModel(myModule); if (rootModel == null) return; //already disposed diff --git a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/projectRoot/daemon/ProjectStructureDaemonAnalyzer.java b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/projectRoot/daemon/ProjectStructureDaemonAnalyzer.java index 53e1f541d54a..a10dae160a8e 100644 --- a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/projectRoot/daemon/ProjectStructureDaemonAnalyzer.java +++ b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/projectRoot/daemon/ProjectStructureDaemonAnalyzer.java @@ -59,7 +59,7 @@ public class ProjectStructureDaemonAnalyzer implements Disposable { if (LOG.isDebugEnabled()) { LOG.debug("checking " + element); } - element.check(problemsHolder); + ProjectStructureValidator.check(element, problemsHolder); } }.execute(); invokeLater(new Runnable() { diff --git a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/projectRoot/daemon/ProjectStructureValidator.java b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/projectRoot/daemon/ProjectStructureValidator.java new file mode 100644 index 000000000000..45505a8645d1 --- /dev/null +++ b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/projectRoot/daemon/ProjectStructureValidator.java @@ -0,0 +1,41 @@ +/* + * Copyright 2000-2012 JetBrains s.r.o. + * + * 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. + */ +package com.intellij.openapi.roots.ui.configuration.projectRoot.daemon; + +import com.intellij.openapi.extensions.ExtensionPointName; + +/** + * User: ksafonov + */ +public abstract class ProjectStructureValidator { + + private static final ExtensionPointName EP_NAME = + ExtensionPointName.create("com.intellij.projectStructureValidator"); + + public static void check(ProjectStructureElement element, ProjectStructureProblemsHolder problemsHolder) { + for (ProjectStructureValidator validator : EP_NAME.getExtensions()) { + if (validator.checkElement(element, problemsHolder)) { + return; + } + } + element.check(problemsHolder); + } + + protected boolean checkElement(ProjectStructureElement element, ProjectStructureProblemsHolder problemsHolder) { + return false; + } + +} diff --git a/resources/src/idea/RichPlatformPlugin.xml b/resources/src/idea/RichPlatformPlugin.xml index 4d0722c1aa5b..86586c9f7d83 100644 --- a/resources/src/idea/RichPlatformPlugin.xml +++ b/resources/src/idea/RichPlatformPlugin.xml @@ -86,6 +86,9 @@ + + From cf5fcfc39b6bd585a87ce2601b1c5c3562b3db8b Mon Sep 17 00:00:00 2001 From: Oleg Shpynov Date: Mon, 6 Feb 2012 18:57:47 +0400 Subject: [PATCH 041/215] Another check for corrupted indexes. Infinite loop fix [author = max mossienko] --- .../com/intellij/util/io/PersistentHashMapValueStorage.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/platform/util/src/com/intellij/util/io/PersistentHashMapValueStorage.java b/platform/util/src/com/intellij/util/io/PersistentHashMapValueStorage.java index 26daa4379a9c..d555b7fa414c 100644 --- a/platform/util/src/com/intellij/util/io/PersistentHashMapValueStorage.java +++ b/platform/util/src/com/intellij/util/io/PersistentHashMapValueStorage.java @@ -173,6 +173,9 @@ public class PersistentHashMapValueStorage { chunk = prevChunkAddress; chunkCount++; + if (result.length > mySize) { + throw new PersistentEnumeratorBase.CorruptedException(myFile); + } } } finally { From f37ea5c2060edd470b90b896390a9324f09d1378 Mon Sep 17 00:00:00 2001 From: peter Date: Mon, 6 Feb 2012 16:01:31 +0100 Subject: [PATCH 042/215] more tweaks about event log icon --- .../notification/impl/IdeNotificationArea.java | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/platform/platform-impl/src/com/intellij/notification/impl/IdeNotificationArea.java b/platform/platform-impl/src/com/intellij/notification/impl/IdeNotificationArea.java index 99dfd4cea7e8..6d8ead14ade1 100644 --- a/platform/platform-impl/src/com/intellij/notification/impl/IdeNotificationArea.java +++ b/platform/platform-impl/src/com/intellij/notification/impl/IdeNotificationArea.java @@ -30,7 +30,7 @@ import com.intellij.openapi.wm.CustomStatusBarWidget; import com.intellij.openapi.wm.IconLikeCustomStatusBarWidget; import com.intellij.openapi.wm.StatusBar; import com.intellij.openapi.wm.ToolWindow; -import com.intellij.ui.RowIcon; +import com.intellij.ui.LayeredIcon; import com.intellij.util.Alarm; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -110,11 +110,12 @@ public class IdeNotificationArea extends JLabel implements CustomStatusBarWidget } boolean stripesVisible = !UISettings.getInstance().HIDE_TOOL_STRIPES; ArrayList notifications = logModel.getNotifications(); - RowIcon icon = new RowIcon(2); - icon.setIcon(getPendingNotificationsIcon(EMPTY_ICON, getMaximumType(notifications)), 0); + LayeredIcon icon = new LayeredIcon(2); + Icon statusIcon = getPendingNotificationsIcon(EMPTY_ICON, getMaximumType(notifications)); + icon.setIcon(statusIcon, 0); final int count = notifications.size(); if (count > 0) { - icon.setIcon(new TextIcon(this, String.valueOf(count)), 1); + icon.setIcon(new TextIcon(this, String.valueOf(count)), 1, statusIcon.getIconWidth() - 2, 0); } if (stripesVisible && eventLog != null) { eventLog.setIcon(icon); @@ -170,7 +171,7 @@ public class IdeNotificationArea extends JLabel implements CustomStatusBarWidget public TextIcon(IdeNotificationArea component, String str) { myStr = str; myComponent = component; - myWidth = myComponent.getFontMetrics(calcFont()).stringWidth(myStr) + 5; + myWidth = myComponent.getFontMetrics(calcFont()).stringWidth(myStr) + 1; } @Override @@ -188,7 +189,7 @@ public class IdeNotificationArea extends JLabel implements CustomStatusBarWidget } private Font calcFont() { - return myComponent.getFont().deriveFont(Font.BOLD).deriveFont((float) getIconHeight() * 2 / 3); + return myComponent.getFont().deriveFont(Font.BOLD).deriveFont((float) getIconHeight() * 3 / 5); } @Override From 603892bab2d1b02bcb0e0829672466df567ce291 Mon Sep 17 00:00:00 2001 From: peter Date: Mon, 6 Feb 2012 16:03:57 +0100 Subject: [PATCH 043/215] make file history toolbar buttons available independently of the focus --- .../openapi/ui/PanelWithActionsAndCloseButton.java | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/platform/platform-api/src/com/intellij/openapi/ui/PanelWithActionsAndCloseButton.java b/platform/platform-api/src/com/intellij/openapi/ui/PanelWithActionsAndCloseButton.java index 9471a3f8fb53..c0758be537f4 100644 --- a/platform/platform-api/src/com/intellij/openapi/ui/PanelWithActionsAndCloseButton.java +++ b/platform/platform-api/src/com/intellij/openapi/ui/PanelWithActionsAndCloseButton.java @@ -59,9 +59,12 @@ public abstract class PanelWithActionsAndCloseButton extends JPanel implements D myToolbarGroup.add(ActionManager.getInstance().getAction(IdeActions.ACTION_CONTEXT_HELP)); - add(ActionManager.getInstance().createActionToolbar(ActionPlaces.FILEHISTORY_VIEW_TOOLBAR, myToolbarGroup, false) - .getComponent(), BorderLayout.WEST); - add(createCenterPanel(), BorderLayout.CENTER); + ActionToolbar toolbar = ActionManager.getInstance().createActionToolbar(ActionPlaces.FILEHISTORY_VIEW_TOOLBAR, myToolbarGroup, false); + JComponent centerPanel = createCenterPanel(); + toolbar.setTargetComponent(centerPanel); + + add(toolbar.getComponent(), BorderLayout.WEST); + add(centerPanel, BorderLayout.CENTER); } public Object getData(String dataId) { From 4b6a10ee8bde36cf020c06d0909ef4f0b6763759 Mon Sep 17 00:00:00 2001 From: peter Date: Mon, 6 Feb 2012 16:13:46 +0100 Subject: [PATCH 044/215] remove strange assertion --- .../com/intellij/codeInsight/completion/JavaAutoPopupTest.groovy | 1 - 1 file changed, 1 deletion(-) diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/completion/JavaAutoPopupTest.groovy b/java/java-tests/testSrc/com/intellij/codeInsight/completion/JavaAutoPopupTest.groovy index e8b463fa0575..ef778329e358 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/completion/JavaAutoPopupTest.groovy +++ b/java/java-tests/testSrc/com/intellij/codeInsight/completion/JavaAutoPopupTest.groovy @@ -750,7 +750,6 @@ class Foo { joinCommit() myFixture.type 'a.' myFixture.checkResult(" class Foo { { int iteraaa; iteraaa. } } ") - assert !lookup } public void testRestartWithInvisibleLookup() { From 71e7e41b7cea8cb257e34adbdbaf7e095909cd9a Mon Sep 17 00:00:00 2001 From: Maxim Shafirov Date: Mon, 6 Feb 2012 19:42:48 +0400 Subject: [PATCH 045/215] Don't check .isFile() too often, don't call .list() too often --- .../intellij/core/CoreJavaFileManager.java | 26 ++++++++++++------- .../vfs/local/CoreLocalVirtualFile.java | 17 ++++++++---- 2 files changed, 28 insertions(+), 15 deletions(-) diff --git a/java/java-psi-impl/src/com/intellij/core/CoreJavaFileManager.java b/java/java-psi-impl/src/com/intellij/core/CoreJavaFileManager.java index 845339e66d7a..06b1eb6a65f5 100644 --- a/java/java-psi-impl/src/com/intellij/core/CoreJavaFileManager.java +++ b/java/java-psi-impl/src/com/intellij/core/CoreJavaFileManager.java @@ -27,14 +27,12 @@ import com.intellij.psi.impl.file.impl.JavaFileManager; import com.intellij.psi.search.GlobalSearchScope; import com.intellij.util.CollectionQuery; import com.intellij.util.Query; +import com.intellij.util.containers.ConcurrentFactoryMap; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.io.File; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.List; +import java.util.*; /** * @author yole @@ -45,6 +43,19 @@ public class CoreJavaFileManager extends PackageIndex implements JavaFileManager private final CoreLocalFileSystem myLocalFileSystem; private final CoreJarFileSystem myJarFileSystem; private final List myClasspath = new ArrayList(); + + private final Map myClasspathRoots = new ConcurrentFactoryMap() { + @Override + protected VirtualFile create(File key) { + if (key.isFile()) { + return myJarFileSystem.findFileByPath(key.getPath() + "!/"); + } + else { + return myLocalFileSystem.findFileByPath(key.getPath()); + } + } + }; + private final PsiManager myPsiManager; public CoreJavaFileManager(PsiManager psiManager, CoreLocalFileSystem localFileSystem, CoreJarFileSystem jarFileSystem) { @@ -94,12 +105,7 @@ public class CoreJavaFileManager extends PackageIndex implements JavaFileManager @Nullable private VirtualFile findRootInClassPathEntry(File classpathEntry) { - if (classpathEntry.isFile()) { - return myJarFileSystem.findFileByPath(classpathEntry.getPath() + "!/"); - } - else { - return myLocalFileSystem.findFileByPath(classpathEntry.getPath()); - } + return myClasspathRoots.get(classpathEntry); } @Override diff --git a/platform/core-impl/src/com/intellij/openapi/vfs/local/CoreLocalVirtualFile.java b/platform/core-impl/src/com/intellij/openapi/vfs/local/CoreLocalVirtualFile.java index 067fe61a8266..5b330f4c3772 100644 --- a/platform/core-impl/src/com/intellij/openapi/vfs/local/CoreLocalVirtualFile.java +++ b/platform/core-impl/src/com/intellij/openapi/vfs/local/CoreLocalVirtualFile.java @@ -31,6 +31,7 @@ import java.util.List; public class CoreLocalVirtualFile extends VirtualFile { private final CoreLocalFileSystem myFileSystem; private final File myIoFile; + private VirtualFile[] myChildren; public CoreLocalVirtualFile(CoreLocalFileSystem fileSystem, File ioFile) { myFileSystem = fileSystem; @@ -77,12 +78,18 @@ public class CoreLocalVirtualFile extends VirtualFile { @Override public VirtualFile[] getChildren() { - List result = new ArrayList(); - final File[] files = myIoFile.listFiles(); - for (File file : files) { - result.add(new CoreLocalVirtualFile(myFileSystem, file)); + VirtualFile[] answer = myChildren; + if (answer == null) { + List result = new ArrayList(); + final File[] files = myIoFile.listFiles(); + for (File file : files) { + result.add(new CoreLocalVirtualFile(myFileSystem, file)); + } + answer = result.toArray(new VirtualFile[result.size()]); + + myChildren = answer; } - return result.toArray(new VirtualFile[result.size()]); + return answer; } @NotNull From 8472bfa712907cbd2209d663bc5233204c794517 Mon Sep 17 00:00:00 2001 From: Maxim Shafirov Date: Mon, 6 Feb 2012 20:27:34 +0400 Subject: [PATCH 046/215] less io access --- .../intellij/openapi/vfs/local/CoreLocalVirtualFile.java | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/platform/core-impl/src/com/intellij/openapi/vfs/local/CoreLocalVirtualFile.java b/platform/core-impl/src/com/intellij/openapi/vfs/local/CoreLocalVirtualFile.java index 5b330f4c3772..59d9441f8dc9 100644 --- a/platform/core-impl/src/com/intellij/openapi/vfs/local/CoreLocalVirtualFile.java +++ b/platform/core-impl/src/com/intellij/openapi/vfs/local/CoreLocalVirtualFile.java @@ -32,10 +32,12 @@ public class CoreLocalVirtualFile extends VirtualFile { private final CoreLocalFileSystem myFileSystem; private final File myIoFile; private VirtualFile[] myChildren; + private final boolean isDirectory; public CoreLocalVirtualFile(CoreLocalFileSystem fileSystem, File ioFile) { myFileSystem = fileSystem; myIoFile = ioFile; + isDirectory = ioFile.isDirectory(); } @NotNull @@ -57,17 +59,17 @@ public class CoreLocalVirtualFile extends VirtualFile { @Override public boolean isWritable() { - return myIoFile.canWrite(); + return false; // Core VFS isn't writable. } @Override public boolean isDirectory() { - return myIoFile.isDirectory(); + return isDirectory; } @Override public boolean isValid() { - return myIoFile.exists(); + return true; // Core VFS cannot change, doesn't refresh so once found, any file is writable } @Override From e2f1cf67b1867a9d36b358855d06d836a1b0d664 Mon Sep 17 00:00:00 2001 From: Maxim Shafirov Date: Mon, 6 Feb 2012 20:40:37 +0400 Subject: [PATCH 047/215] Arrays hopefully have faster iteration --- .../intellij/core/CoreJavaFileManager.java | 75 +++++++++---------- 1 file changed, 37 insertions(+), 38 deletions(-) diff --git a/java/java-psi-impl/src/com/intellij/core/CoreJavaFileManager.java b/java/java-psi-impl/src/com/intellij/core/CoreJavaFileManager.java index 06b1eb6a65f5..a4a26f9f3f5e 100644 --- a/java/java-psi-impl/src/com/intellij/core/CoreJavaFileManager.java +++ b/java/java-psi-impl/src/com/intellij/core/CoreJavaFileManager.java @@ -27,7 +27,6 @@ import com.intellij.psi.impl.file.impl.JavaFileManager; import com.intellij.psi.search.GlobalSearchScope; import com.intellij.util.CollectionQuery; import com.intellij.util.Query; -import com.intellij.util.containers.ConcurrentFactoryMap; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -43,18 +42,7 @@ public class CoreJavaFileManager extends PackageIndex implements JavaFileManager private final CoreLocalFileSystem myLocalFileSystem; private final CoreJarFileSystem myJarFileSystem; private final List myClasspath = new ArrayList(); - - private final Map myClasspathRoots = new ConcurrentFactoryMap() { - @Override - protected VirtualFile create(File key) { - if (key.isFile()) { - return myJarFileSystem.findFileByPath(key.getPath() + "!/"); - } - else { - return myLocalFileSystem.findFileByPath(key.getPath()); - } - } - }; + private VirtualFile[] myClasspathRoots = null; private final PsiManager myPsiManager; @@ -64,6 +52,35 @@ public class CoreJavaFileManager extends PackageIndex implements JavaFileManager myJarFileSystem = jarFileSystem; } + private VirtualFile[] roots() { + VirtualFile[] answer = myClasspathRoots; + + if (answer == null) { + ArrayList answerList = new ArrayList(myClasspath.size()); + for (File root : myClasspath) { + VirtualFile rootVfs = calcRoot(root); + if (rootVfs != null) { + answerList.add(rootVfs); + } + } + + answer = answerList.toArray(new VirtualFile[answerList.size()]); + myClasspathRoots = answer; + } + + return answer; + } + + @Nullable + private VirtualFile calcRoot(File root) { + if (root.isFile()) { + return myJarFileSystem.findFileByPath(root.getPath() + "!/"); + } + else { + return myLocalFileSystem.findFileByPath(root.getPath()); + } + } + @Override public PsiPackage findPackage(@NotNull String packageName) { final List files = findDirectoriesByPackageName(packageName); @@ -76,8 +93,8 @@ public class CoreJavaFileManager extends PackageIndex implements JavaFileManager private List findDirectoriesByPackageName(String packageName) { List result = new ArrayList(); String dirName = packageName.replace(".", "/"); - for (File file : myClasspath) { - VirtualFile classDir = findUnderClasspathEntry(file, dirName); + for (VirtualFile root : roots()) { + VirtualFile classDir = root.findFileByRelativePath(dirName); if (classDir != null) { result.add(classDir); } @@ -96,17 +113,6 @@ public class CoreJavaFileManager extends PackageIndex implements JavaFileManager } return null; } - - @Nullable - private VirtualFile findUnderClasspathEntry(File classpathEntry, String relativeName) { - VirtualFile root = findRootInClassPathEntry(classpathEntry); - return root != null ? root.findFileByRelativePath(relativeName) : null; - } - - @Nullable - private VirtualFile findRootInClassPathEntry(File classpathEntry) { - return myClasspathRoots.get(classpathEntry); - } @Override public VirtualFile[] getDirectoriesByPackageName(@NotNull String packageName, boolean includeLibrarySources) { @@ -120,8 +126,8 @@ public class CoreJavaFileManager extends PackageIndex implements JavaFileManager @Override public PsiClass findClass(@NotNull String qName, @NotNull GlobalSearchScope scope) { - for (File file : myClasspath) { - final PsiClass psiClass = findClassInClasspathEntry(qName, file); + for (VirtualFile root : roots()) { + final PsiClass psiClass = findClassInClasspathRoot(qName, root, myPsiManager); if (psiClass != null) { return psiClass; } @@ -129,14 +135,6 @@ public class CoreJavaFileManager extends PackageIndex implements JavaFileManager return null; } - @Nullable - private PsiClass findClassInClasspathEntry(String qName, File rootEntry) { - VirtualFile root = findRootInClassPathEntry(rootEntry); - if (root == null) return null; - - return findClassInClasspathRoot(qName, root, myPsiManager); - } - @Nullable public static PsiClass findClassInClasspathRoot(String qName, VirtualFile root, PsiManager psiManager) { String pathRest = qName; @@ -207,8 +205,8 @@ public class CoreJavaFileManager extends PackageIndex implements JavaFileManager @Override public PsiClass[] findClasses(@NotNull String qName, @NotNull GlobalSearchScope scope) { List result = new ArrayList(); - for (File file : myClasspath) { - final PsiClass psiClass = findClassInClasspathEntry(qName, file); + for (VirtualFile file : roots()) { + final PsiClass psiClass = findClassInClasspathRoot(qName, file, myPsiManager); if (psiClass != null) { result.add(psiClass); } @@ -227,5 +225,6 @@ public class CoreJavaFileManager extends PackageIndex implements JavaFileManager public void addToClasspath(File path) { myClasspath.add(path); + myClasspathRoots = null; } } From 6d7dfd6ed025b6c998aed586f07a8a3bbb60a738 Mon Sep 17 00:00:00 2001 From: Maxim Shafirov Date: Mon, 6 Feb 2012 21:07:21 +0400 Subject: [PATCH 048/215] NPE --- .../com/intellij/openapi/vfs/local/CoreLocalVirtualFile.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platform/core-impl/src/com/intellij/openapi/vfs/local/CoreLocalVirtualFile.java b/platform/core-impl/src/com/intellij/openapi/vfs/local/CoreLocalVirtualFile.java index 59d9441f8dc9..f7c8749da965 100644 --- a/platform/core-impl/src/com/intellij/openapi/vfs/local/CoreLocalVirtualFile.java +++ b/platform/core-impl/src/com/intellij/openapi/vfs/local/CoreLocalVirtualFile.java @@ -37,7 +37,7 @@ public class CoreLocalVirtualFile extends VirtualFile { public CoreLocalVirtualFile(CoreLocalFileSystem fileSystem, File ioFile) { myFileSystem = fileSystem; myIoFile = ioFile; - isDirectory = ioFile.isDirectory(); + isDirectory = ioFile == null || ioFile.isDirectory(); } @NotNull From db992d1261bcc2decb2bc375667fbcc989f23491 Mon Sep 17 00:00:00 2001 From: Dmitry Jemerov Date: Mon, 6 Feb 2012 18:30:42 +0100 Subject: [PATCH 049/215] Alt-click on editor tab close button works as Close Others (IDEA-80874) --- .../src/com/intellij/ui/tabs/impl/ActionButton.java | 10 +++++----- .../ide/actions/CloseAllEditorsButActiveAction.java | 8 +------- .../fileEditor/impl/EditorTabbedContainer.java | 11 +++++++++-- .../openapi/fileEditor/impl/EditorWindow.java | 9 +++++++++ 4 files changed, 24 insertions(+), 14 deletions(-) diff --git a/platform/platform-api/src/com/intellij/ui/tabs/impl/ActionButton.java b/platform/platform-api/src/com/intellij/ui/tabs/impl/ActionButton.java index 2a82c3e3de12..3dc1fe1f2b56 100644 --- a/platform/platform-api/src/com/intellij/ui/tabs/impl/ActionButton.java +++ b/platform/platform-api/src/com/intellij/ui/tabs/impl/ActionButton.java @@ -72,7 +72,7 @@ class ActionButton extends IconButton implements ActionListener { } public boolean update() { - AnActionEvent event = createAnEvent(null); + AnActionEvent event = createAnEvent(null, 0); if (event == null) return false; @@ -107,17 +107,17 @@ class ActionButton extends IconButton implements ActionListener { } public void actionPerformed(final ActionEvent e) { - AnActionEvent event = createAnEvent(null); + AnActionEvent event = createAnEvent(null, e.getModifiers()); if (event != null && ActionUtil.lastUpdateAndCheckDumb(myAction, event, true)) { myAction.actionPerformed(event); } } @Nullable - private AnActionEvent createAnEvent(InputEvent e) { - Presentation presentation = (Presentation)myAction.getTemplatePresentation().clone(); + private AnActionEvent createAnEvent(InputEvent e, final int modifiers) { + Presentation presentation = myAction.getTemplatePresentation().clone(); DataContext context = DataManager.getInstance().getDataContext(myTabInfo.getComponent()); - return new AnActionEvent(e, context, myPlace != null ? myPlace : ActionPlaces.UNKNOWN, presentation, myTabs.myActionManager, 0); + return new AnActionEvent(e, context, myPlace != null ? myPlace : ActionPlaces.UNKNOWN, presentation, myTabs.myActionManager, modifiers); } public void setAutoHide(final boolean autoHide) { diff --git a/platform/platform-impl/src/com/intellij/ide/actions/CloseAllEditorsButActiveAction.java b/platform/platform-impl/src/com/intellij/ide/actions/CloseAllEditorsButActiveAction.java index be19cd8f24e2..443a10030ec2 100644 --- a/platform/platform-impl/src/com/intellij/ide/actions/CloseAllEditorsButActiveAction.java +++ b/platform/platform-impl/src/com/intellij/ide/actions/CloseAllEditorsButActiveAction.java @@ -33,13 +33,7 @@ public class CloseAllEditorsButActiveAction extends AnAction implements DumbAwar VirtualFile selectedFile; final EditorWindow window = e.getData(EditorWindow.DATA_KEY); if (window != null){ - selectedFile = e.getData(PlatformDataKeys.VIRTUAL_FILE); - final VirtualFile[] files = window.getFiles(); - for (final VirtualFile file : files) { - if (file != selectedFile && !window.isFilePinned(file)) { - window.closeFile(file); - } - } + window.closeAllExcept(e.getData(PlatformDataKeys.VIRTUAL_FILE)); return; } selectedFile = fileEditorManager.getSelectedFiles()[0]; diff --git a/platform/platform-impl/src/com/intellij/openapi/fileEditor/impl/EditorTabbedContainer.java b/platform/platform-impl/src/com/intellij/openapi/fileEditor/impl/EditorTabbedContainer.java index a5e49d3bacb1..20a19762b1b8 100644 --- a/platform/platform-impl/src/com/intellij/openapi/fileEditor/impl/EditorTabbedContainer.java +++ b/platform/platform-impl/src/com/intellij/openapi/fileEditor/impl/EditorTabbedContainer.java @@ -57,6 +57,7 @@ import org.jetbrains.annotations.Nullable; import javax.swing.*; import java.awt.*; +import java.awt.event.InputEvent; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.util.ArrayList; @@ -385,6 +386,7 @@ final class EditorTabbedContainer implements Disposable, CloseAction.CloseTarget e.getPresentation().setIcon(myTabs.isEditorTabs() ? myNewIcon : myIcon); e.getPresentation().setHoveredIcon(myTabs.isEditorTabs()? myNewHoveredIcon : myHoveredIcon); e.getPresentation().setVisible(UISettings.getInstance().SHOW_CLOSE_BUTTON); + e.getPresentation().setText("Close. Alt-click to close others."); } public void actionPerformed(final AnActionEvent e) { @@ -399,8 +401,13 @@ final class EditorTabbedContainer implements Disposable, CloseAction.CloseTarget } if (window != null) { - if (window.findFileComposite(file) != null) { - mgr.closeFile(file, window); + if ((e.getModifiers() & InputEvent.ALT_MASK) != 0) { + window.closeAllExcept(file); + } + else { + if (window.findFileComposite(file) != null) { + mgr.closeFile(file, window); + } } } } diff --git a/platform/platform-impl/src/com/intellij/openapi/fileEditor/impl/EditorWindow.java b/platform/platform-impl/src/com/intellij/openapi/fileEditor/impl/EditorWindow.java index fa53d26b2443..0f1e765f909b 100644 --- a/platform/platform-impl/src/com/intellij/openapi/fileEditor/impl/EditorWindow.java +++ b/platform/platform-impl/src/com/intellij/openapi/fileEditor/impl/EditorWindow.java @@ -103,6 +103,15 @@ public class EditorWindow { return myPanel.isShowing(); } + public void closeAllExcept(final VirtualFile selectedFile) { + final VirtualFile[] files = getFiles(); + for (final VirtualFile file : files) { + if (file != selectedFile && !isFilePinned(file)) { + closeFile(file); + } + } + } + private static class AdaptiveBorder implements Border { @Override public void paintBorder(Component c, Graphics g, int x, int y, int width, int height) { From 94b0cd0d91e5ddb4d29dc126981dbb39694ca9cb Mon Sep 17 00:00:00 2001 From: Eugene Zhuravlev Date: Mon, 6 Feb 2012 18:33:49 +0100 Subject: [PATCH 050/215] pass sdk type and externalized additional data to compile server --- .../compiler/CompileServerManager.java | 19 +++- jps/jps-builders/proto/jps_remote_proto.proto | 4 +- .../org/jetbrains/jps/api/JpsRemoteProto.java | 92 ++++++++++++++++++- .../src/org/jetbrains/jps/api/ProtoUtil.java | 8 +- .../src/org/jetbrains/jps/api/SdkLibrary.java | 22 ++++- .../jps/server/ServerMessageHandler.java | 2 +- .../org/jetbrains/jps/server/ServerState.java | 14 ++- 7 files changed, 148 insertions(+), 13 deletions(-) diff --git a/java/compiler/impl/src/com/intellij/compiler/CompileServerManager.java b/java/compiler/impl/src/com/intellij/compiler/CompileServerManager.java index d69e06a1298c..3681465f1778 100644 --- a/java/compiler/impl/src/com/intellij/compiler/CompileServerManager.java +++ b/java/compiler/impl/src/com/intellij/compiler/CompileServerManager.java @@ -35,9 +35,7 @@ import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.project.Project; import com.intellij.openapi.project.ProjectManager; import com.intellij.openapi.project.ProjectManagerAdapter; -import com.intellij.openapi.projectRoots.JavaSdkType; -import com.intellij.openapi.projectRoots.ProjectJdkTable; -import com.intellij.openapi.projectRoots.Sdk; +import com.intellij.openapi.projectRoots.*; import com.intellij.openapi.projectRoots.impl.JavaAwareProjectJdkTableImpl; import com.intellij.openapi.roots.ModuleRootEvent; import com.intellij.openapi.roots.ModuleRootListener; @@ -45,6 +43,7 @@ import com.intellij.openapi.roots.OrderRootType; import com.intellij.openapi.roots.libraries.Library; import com.intellij.openapi.roots.libraries.LibraryTablesRegistrar; import com.intellij.openapi.ui.MessageType; +import com.intellij.openapi.util.JDOMUtil; import com.intellij.openapi.util.Key; import com.intellij.openapi.util.Ref; import com.intellij.openapi.util.ShutDownTracker; @@ -61,6 +60,7 @@ import com.intellij.util.Alarm; import com.intellij.util.concurrency.Semaphore; import com.intellij.util.messages.MessageBusConnection; import com.intellij.util.net.NetUtils; +import org.jdom.Element; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.jps.api.*; @@ -489,8 +489,19 @@ public class CompileServerManager implements ApplicationComponent{ if (homePath == null) { continue; } + final SdkAdditionalData data = sdk.getSdkAdditionalData(); + final String additionalDataXml; + final SdkType sdkType = sdk.getSdkType(); + if (data == null) { + additionalDataXml = null; + } + else { + final Element element = new Element("additional"); + sdkType.saveAdditionalData(data, element); + additionalDataXml = JDOMUtil.writeElement(element, "\n"); + } final List paths = convertToLocalPaths(sdk.getRootProvider().getFiles(OrderRootType.CLASSES)); - globals.add(new SdkLibrary(name, homePath, paths)); + globals.add(new SdkLibrary(name, sdkType.getName(), homePath, paths, additionalDataXml)); } } diff --git a/jps/jps-builders/proto/jps_remote_proto.proto b/jps/jps-builders/proto/jps_remote_proto.proto index 2b9e0b9001aa..03eabce9567f 100644 --- a/jps/jps-builders/proto/jps_remote_proto.proto +++ b/jps/jps-builders/proto/jps_remote_proto.proto @@ -64,7 +64,9 @@ message Message { message GlobalLibrary { required string name = 1; optional string homePath = 2; - repeated string path = 3; + optional string type_name = 3; + optional string additional_data_xml = 4; + repeated string path = 5; } repeated PathVariable path_variable = 1; diff --git a/jps/jps-builders/src/org/jetbrains/jps/api/JpsRemoteProto.java b/jps/jps-builders/src/org/jetbrains/jps/api/JpsRemoteProto.java index ebde9bb6ee3d..cf6dd424fbba 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/api/JpsRemoteProto.java +++ b/jps/jps-builders/src/org/jetbrains/jps/api/JpsRemoteProto.java @@ -1986,8 +1986,22 @@ public final class JpsRemoteProto { public boolean hasHomePath() { return hasHomePath; } public java.lang.String getHomePath() { return homePath_; } - // repeated string path = 3; - public static final int PATH_FIELD_NUMBER = 3; + // optional string type_name = 3; + public static final int TYPE_NAME_FIELD_NUMBER = 3; + private boolean hasTypeName; + private java.lang.String typeName_ = ""; + public boolean hasTypeName() { return hasTypeName; } + public java.lang.String getTypeName() { return typeName_; } + + // optional string additional_data_xml = 4; + public static final int ADDITIONAL_DATA_XML_FIELD_NUMBER = 4; + private boolean hasAdditionalDataXml; + private java.lang.String additionalDataXml_ = ""; + public boolean hasAdditionalDataXml() { return hasAdditionalDataXml; } + public java.lang.String getAdditionalDataXml() { return additionalDataXml_; } + + // repeated string path = 5; + public static final int PATH_FIELD_NUMBER = 5; private java.util.List path_ = java.util.Collections.emptyList(); public java.util.List getPathList() { @@ -2014,8 +2028,14 @@ public final class JpsRemoteProto { if (hasHomePath()) { output.writeString(2, getHomePath()); } + if (hasTypeName()) { + output.writeString(3, getTypeName()); + } + if (hasAdditionalDataXml()) { + output.writeString(4, getAdditionalDataXml()); + } for (java.lang.String element : getPathList()) { - output.writeString(3, element); + output.writeString(5, element); } } @@ -2033,6 +2053,14 @@ public final class JpsRemoteProto { size += com.google.protobuf.CodedOutputStream .computeStringSize(2, getHomePath()); } + if (hasTypeName()) { + size += com.google.protobuf.CodedOutputStream + .computeStringSize(3, getTypeName()); + } + if (hasAdditionalDataXml()) { + size += com.google.protobuf.CodedOutputStream + .computeStringSize(4, getAdditionalDataXml()); + } { int dataSize = 0; for (java.lang.String element : getPathList()) { @@ -2196,6 +2224,12 @@ public final class JpsRemoteProto { if (other.hasHomePath()) { setHomePath(other.getHomePath()); } + if (other.hasTypeName()) { + setTypeName(other.getTypeName()); + } + if (other.hasAdditionalDataXml()) { + setAdditionalDataXml(other.getAdditionalDataXml()); + } if (!other.path_.isEmpty()) { if (result.path_.isEmpty()) { result.path_ = new java.util.ArrayList(); @@ -2229,6 +2263,14 @@ public final class JpsRemoteProto { break; } case 26: { + setTypeName(input.readString()); + break; + } + case 34: { + setAdditionalDataXml(input.readString()); + break; + } + case 42: { addPath(input.readString()); break; } @@ -2279,7 +2321,49 @@ public final class JpsRemoteProto { return this; } - // repeated string path = 3; + // optional string type_name = 3; + public boolean hasTypeName() { + return result.hasTypeName(); + } + public java.lang.String getTypeName() { + return result.getTypeName(); + } + public Builder setTypeName(java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + result.hasTypeName = true; + result.typeName_ = value; + return this; + } + public Builder clearTypeName() { + result.hasTypeName = false; + result.typeName_ = getDefaultInstance().getTypeName(); + return this; + } + + // optional string additional_data_xml = 4; + public boolean hasAdditionalDataXml() { + return result.hasAdditionalDataXml(); + } + public java.lang.String getAdditionalDataXml() { + return result.getAdditionalDataXml(); + } + public Builder setAdditionalDataXml(java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + result.hasAdditionalDataXml = true; + result.additionalDataXml_ = value; + return this; + } + public Builder clearAdditionalDataXml() { + result.hasAdditionalDataXml = false; + result.additionalDataXml_ = getDefaultInstance().getAdditionalDataXml(); + return this; + } + + // repeated string path = 5; public java.util.List getPathList() { return java.util.Collections.unmodifiableList(result.path_); } diff --git a/jps/jps-builders/src/org/jetbrains/jps/api/ProtoUtil.java b/jps/jps-builders/src/org/jetbrains/jps/api/ProtoUtil.java index e2646765706d..5df797fd4519 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/api/ProtoUtil.java +++ b/jps/jps-builders/src/org/jetbrains/jps/api/ProtoUtil.java @@ -114,7 +114,13 @@ public class ProtoUtil { JpsRemoteProto.Message.Request.SetupCommand.GlobalLibrary.newBuilder(); libBuilder.setName(lib.getName()).addAllPath(lib.getPaths()); if (lib instanceof SdkLibrary) { - libBuilder.setHomePath(((SdkLibrary)lib).getHomePath()); + final SdkLibrary sdk = (SdkLibrary)lib; + libBuilder.setHomePath(sdk.getHomePath()); + libBuilder.setTypeName(sdk.getTypeName()); + final String additional = sdk.getAdditionalDataXml(); + if (additional != null) { + libBuilder.setAdditionalDataXml(additional); + } } cmdBuilder.addGlobalLibrary(libBuilder.build()); } diff --git a/jps/jps-builders/src/org/jetbrains/jps/api/SdkLibrary.java b/jps/jps-builders/src/org/jetbrains/jps/api/SdkLibrary.java index 891d87d490d9..8fc12ba8cd10 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/api/SdkLibrary.java +++ b/jps/jps-builders/src/org/jetbrains/jps/api/SdkLibrary.java @@ -1,5 +1,7 @@ package org.jetbrains.jps.api; +import org.jetbrains.annotations.Nullable; + import java.util.List; /** @@ -8,14 +10,32 @@ import java.util.List; */ public class SdkLibrary extends GlobalLibrary { + private final String myTypeName; private final String myHomePath; + @Nullable + private final String myAdditionalDataXml; - public SdkLibrary(String name, String homePath, List paths) { + public SdkLibrary(String name, final String typeName, String homePath, List paths) { + this(name, typeName, homePath, paths, null); + } + + public SdkLibrary(String name, String typeName, String homePath, List paths, @Nullable String additionalDataXml) { super(name, paths); + myTypeName = typeName; myHomePath = homePath; + myAdditionalDataXml = additionalDataXml; + } + + public String getTypeName() { + return myTypeName; } public String getHomePath() { return myHomePath; } + + @Nullable + public String getAdditionalDataXml() { + return myAdditionalDataXml; + } } diff --git a/jps/jps-builders/src/org/jetbrains/jps/server/ServerMessageHandler.java b/jps/jps-builders/src/org/jetbrains/jps/server/ServerMessageHandler.java index d2aa631fc435..2dc966b51c51 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/server/ServerMessageHandler.java +++ b/jps/jps-builders/src/org/jetbrains/jps/server/ServerMessageHandler.java @@ -76,7 +76,7 @@ class ServerMessageHandler extends SimpleChannelHandler { for (JpsRemoteProto.Message.Request.SetupCommand.GlobalLibrary library : setupCommand.getGlobalLibraryList()) { libs.add( library.hasHomePath()? - new SdkLibrary(library.getName(), library.getHomePath(), library.getPathList()) : + new SdkLibrary(library.getName(), library.getTypeName(), library.getHomePath(), library.getPathList(), library.hasAdditionalDataXml()? library.getAdditionalDataXml() : null) : new GlobalLibrary(library.getName(), library.getPathList()) ); } diff --git a/jps/jps-builders/src/org/jetbrains/jps/server/ServerState.java b/jps/jps-builders/src/org/jetbrains/jps/server/ServerState.java index ba7bd3963f74..e02a0432f25c 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/server/ServerState.java +++ b/jps/jps-builders/src/org/jetbrains/jps/server/ServerState.java @@ -3,6 +3,8 @@ package org.jetbrains.jps.server; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.util.text.StringUtil; +import groovy.util.Node; +import groovy.util.XmlParser; import org.codehaus.groovy.runtime.MethodClosure; import org.jetbrains.annotations.Nullable; import org.jetbrains.jps.Library; @@ -295,7 +297,17 @@ class ServerState { for (GlobalLibrary library : myGlobalLibraries) { if (library instanceof SdkLibrary) { final SdkLibrary sdk = (SdkLibrary)library; - final Sdk jdk = project.createSdk("JavaSDK", sdk.getName(), sdk.getHomePath(), null); + Node additionalData = null; + final String additionalXml = sdk.getAdditionalDataXml(); + if (additionalXml != null) { + try { + additionalData = new XmlParser(false, false).parseText(additionalXml); + } + catch (Exception e) { + LOG.info(e); + } + } + final Sdk jdk = project.createSdk(/*"JavaSDK"*/sdk.getTypeName(), sdk.getName(), sdk.getHomePath(), additionalData); jdk.setClasspath(sdk.getPaths()); } else { From 44bc423d60d2a6029a757f73768e92dd5e9e1704 Mon Sep 17 00:00:00 2001 From: peter Date: Mon, 6 Feb 2012 16:43:03 +0100 Subject: [PATCH 051/215] more debug info for tests --- .../openapi/vcs/changes/LastUnchangedContentTracker.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/LastUnchangedContentTracker.java b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/LastUnchangedContentTracker.java index cea2eed4b04b..8fbbf7f86fe5 100644 --- a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/LastUnchangedContentTracker.java +++ b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/LastUnchangedContentTracker.java @@ -81,6 +81,11 @@ public class LastUnchangedContentTracker { LOG.assertTrue(contentId > 0, contentId); + if (ChangeListManagerImpl.DEBUG) { + System.out.println("LastUnchangedContentTracker.saveContentReference"); + System.out.println("file = " + file); + } + long stamp = file.getModificationStamp(); try { final DataOutputStream contentStream = ACQUIRED_CONTENT_ATTR.writeAttribute(file); From b02629d386360bff50f50357a8ccc38b9efd22f2 Mon Sep 17 00:00:00 2001 From: peter Date: Mon, 6 Feb 2012 18:28:43 +0100 Subject: [PATCH 052/215] IDEA-79787 Perforce: text in Repository Tab is overlapped on resizing --- .../CommittedChangeListRenderer.java | 24 ++++++++----------- 1 file changed, 10 insertions(+), 14 deletions(-) diff --git a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/committed/CommittedChangeListRenderer.java b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/committed/CommittedChangeListRenderer.java index 098086524ea1..c25ce3516530 100644 --- a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/committed/CommittedChangeListRenderer.java +++ b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/committed/CommittedChangeListRenderer.java @@ -17,6 +17,7 @@ package com.intellij.openapi.vcs.changes.committed; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.Pair; +import com.intellij.openapi.util.text.StringUtil; import com.intellij.openapi.vcs.AbstractVcs; import com.intellij.openapi.vcs.CachingCommittedChangesProvider; import com.intellij.openapi.vcs.VcsBundle; @@ -33,7 +34,6 @@ import javax.swing.plaf.basic.BasicTreeUI; import javax.swing.tree.DefaultMutableTreeNode; import java.awt.*; import java.util.Date; -import java.util.List; public class CommittedChangeListRenderer extends ColoredTreeCellRenderer { private static final SimpleTextAttributes LINK_ATTRIBUTES = new SimpleTextAttributes(SimpleTextAttributes.STYLE_UNDERLINE, Color.blue); @@ -148,18 +148,21 @@ public class CommittedChangeListRenderer extends ColoredTreeCellRenderer { myRenderer.appendTextWithLinks(description); } else if (descWidth < descMaxWidth && !truncated) { - final List pieces = myRenderer.appendTextWithLinks(description); + myRenderer.appendTextWithLinks(description); appendAlign(descMaxWidth); } else { final String moreMarker = VcsBundle.message("changes.browser.details.marker"); int moreWidth = fontMetrics.stringWidth(moreMarker); - description = truncateDescription(description, fontMetrics, (descMaxWidth - moreWidth - numberWidth)); + int remainingWidth = descMaxWidth - moreWidth - numberWidth; + description = truncateDescription(description, fontMetrics, remainingWidth); myRenderer.appendTextWithLinks(description); - // we don't have place for changelist number in this case - final int addWidth = fontMetrics.stringWidth(description + " "); - append(" ", SimpleTextAttributes.REGULAR_ATTRIBUTES); - append(moreMarker, LINK_ATTRIBUTES, new CommittedChangesTreeBrowser.MoreLauncher(myProject, changeList)); + if (!StringUtil.isEmpty(description)) { + append(" ", SimpleTextAttributes.REGULAR_ATTRIBUTES); + append(moreMarker, LINK_ATTRIBUTES, new CommittedChangesTreeBrowser.MoreLauncher(myProject, changeList)); + } else if (remainingWidth > 0) { + append(moreMarker, LINK_ATTRIBUTES, new CommittedChangesTreeBrowser.MoreLauncher(myProject, changeList)); + } // align value is for the latest added piece appendAlign(descMaxWidth); } @@ -168,13 +171,6 @@ public class CommittedChangeListRenderer extends ColoredTreeCellRenderer { append(date, SimpleTextAttributes.REGULAR_ATTRIBUTES); } - private void appendDescriptionAndNumber(final String description, final String number) { - myRenderer.appendTextWithLinks(description); - if (number != null) { - append(number, SimpleTextAttributes.GRAY_ATTRIBUTES); - } - } - private static String trimLastWord(final String description) { int pos = description.trim().lastIndexOf(' '); if (pos >= 0) { From e4cec8512f45b919bfa898db1fb1437256a35602 Mon Sep 17 00:00:00 2001 From: peter Date: Mon, 6 Feb 2012 18:49:20 +0100 Subject: [PATCH 053/215] CodeFragmentFactory -> abstract class --- .../CodeFragmentFactoryContextWrapper.java | 2 +- .../evaluation/DefaultCodeFragmentFactory.java | 2 +- .../engine/evaluation/CodeFragmentFactory.java | 14 +++++++------- .../groovy/debugger/GroovyCodeFragmentFactory.java | 2 +- 4 files changed, 10 insertions(+), 10 deletions(-) diff --git a/java/debugger/impl/src/com/intellij/debugger/engine/evaluation/CodeFragmentFactoryContextWrapper.java b/java/debugger/impl/src/com/intellij/debugger/engine/evaluation/CodeFragmentFactoryContextWrapper.java index 2afe7c61bd74..4249138bdf29 100644 --- a/java/debugger/impl/src/com/intellij/debugger/engine/evaluation/CodeFragmentFactoryContextWrapper.java +++ b/java/debugger/impl/src/com/intellij/debugger/engine/evaluation/CodeFragmentFactoryContextWrapper.java @@ -43,7 +43,7 @@ import java.util.Map; * @author Eugene Zhuravlev * Date: Aug 30, 2010 */ -public class CodeFragmentFactoryContextWrapper implements CodeFragmentFactory{ +public class CodeFragmentFactoryContextWrapper extends CodeFragmentFactory { public static final Key LABEL_VARIABLE_VALUE_KEY = Key.create("_label_variable_value_key_"); public static final String DEBUG_LABEL_SUFFIX = "_DebugLabel"; diff --git a/java/debugger/impl/src/com/intellij/debugger/engine/evaluation/DefaultCodeFragmentFactory.java b/java/debugger/impl/src/com/intellij/debugger/engine/evaluation/DefaultCodeFragmentFactory.java index ddefef449570..99a93876bf4e 100644 --- a/java/debugger/impl/src/com/intellij/debugger/engine/evaluation/DefaultCodeFragmentFactory.java +++ b/java/debugger/impl/src/com/intellij/debugger/engine/evaluation/DefaultCodeFragmentFactory.java @@ -41,7 +41,7 @@ import java.util.concurrent.atomic.AtomicReference; * @author Eugene Zhuravlev * Date: Jun 7, 2005 */ -public class DefaultCodeFragmentFactory implements CodeFragmentFactory { +public class DefaultCodeFragmentFactory extends CodeFragmentFactory { private static final class SingletonHolder { public static final DefaultCodeFragmentFactory ourInstance = new DefaultCodeFragmentFactory(); } diff --git a/java/debugger/openapi/src/com/intellij/debugger/engine/evaluation/CodeFragmentFactory.java b/java/debugger/openapi/src/com/intellij/debugger/engine/evaluation/CodeFragmentFactory.java index e820d8748ed2..f7ceafc23355 100644 --- a/java/debugger/openapi/src/com/intellij/debugger/engine/evaluation/CodeFragmentFactory.java +++ b/java/debugger/openapi/src/com/intellij/debugger/engine/evaluation/CodeFragmentFactory.java @@ -22,21 +22,21 @@ import com.intellij.openapi.project.Project; import com.intellij.psi.JavaCodeFragment; import com.intellij.psi.PsiElement; -public interface CodeFragmentFactory { - ExtensionPointName EXTENSION_POINT_NAME = ExtensionPointName.create("com.intellij.debugger.codeFragmentFactory"); +public abstract class CodeFragmentFactory { + public static final ExtensionPointName EXTENSION_POINT_NAME = ExtensionPointName.create("com.intellij.debugger.codeFragmentFactory"); - JavaCodeFragment createCodeFragment(TextWithImports item, PsiElement context, Project project); + public abstract JavaCodeFragment createCodeFragment(TextWithImports item, PsiElement context, Project project); - JavaCodeFragment createPresentationCodeFragment(TextWithImports item, PsiElement context, Project project); + public abstract JavaCodeFragment createPresentationCodeFragment(TextWithImports item, PsiElement context, Project project); - boolean isContextAccepted(PsiElement contextElement); + public abstract boolean isContextAccepted(PsiElement contextElement); - LanguageFileType getFileType(); + public abstract LanguageFileType getFileType(); /** * In case if createCodeFragment returns java code use * com.intellij.debugger.engine.evaluation.expression.EvaluatorBuilderImpl#getInstance() * @return builder, which can evaluate expression for your code fragment */ - EvaluatorBuilder getEvaluatorBuilder(); + public abstract EvaluatorBuilder getEvaluatorBuilder(); } diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/debugger/GroovyCodeFragmentFactory.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/debugger/GroovyCodeFragmentFactory.java index 3f85a1e6649b..17c9260260f6 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/debugger/GroovyCodeFragmentFactory.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/debugger/GroovyCodeFragmentFactory.java @@ -55,7 +55,7 @@ import java.util.regex.Pattern; /** * @author ven */ -public class GroovyCodeFragmentFactory implements CodeFragmentFactory { +public class GroovyCodeFragmentFactory extends CodeFragmentFactory { private static final String EVAL_NAME = "_JETGROOVY_EVAL_"; private static final String IMPORTS = "___$$IMPORTS$$___"; private static final String TEXT = "___$$TEXT$$___"; From 41119f53c106642c5ae929fabb2db4adc4aea9a0 Mon Sep 17 00:00:00 2001 From: Roman Shevchenko Date: Mon, 6 Feb 2012 18:47:15 +0100 Subject: [PATCH 054/215] Skip /tmp check on Macs --- .../platform-impl/src/com/intellij/idea/StartupUtil.java | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/platform/platform-impl/src/com/intellij/idea/StartupUtil.java b/platform/platform-impl/src/com/intellij/idea/StartupUtil.java index e30f09e9611a..4280c9bcf27d 100644 --- a/platform/platform-impl/src/com/intellij/idea/StartupUtil.java +++ b/platform/platform-impl/src/com/intellij/idea/StartupUtil.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2011 JetBrains s.r.o. + * Copyright 2000-2012 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -129,16 +129,17 @@ public class StartupUtil { } private static boolean checkTmpIsAccessible() { - if (!SystemInfo.isUnix) return true; + if (!SystemInfo.isUnix || SystemInfo.isMac) return true; final File tmp; try { - tmp = File.createTempFile("idea_check_", ".tmp"); + tmp = FileUtil.createTempFile("idea_check_", ".tmp"); FileUtil.writeToFile(tmp, "#!/bin/sh\n" + "exit 0"); } catch (IOException e) { - showError("Inaccessible Temp Directory", e.getMessage() + ".\nTemp directory is not accessible.\n" + + showError("Inaccessible Temp Directory", e.getMessage() + " (" + FileUtil.getTempDirectory() + ").\n" + + "Temp directory is not accessible.\n" + "Please set 'java.io.tmpdir' system property to point to a writable directory."); return false; } From 8d067ac17b6ca7e0776317de0246b5d90f06e42a Mon Sep 17 00:00:00 2001 From: anna Date: Mon, 6 Feb 2012 11:56:51 +0100 Subject: [PATCH 055/215] IDEA-78375: do not suggest to turn refs to super when classes are invalid --- .../refactoring/extractInterface/ExtractClassUtil.java | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/java/java-impl/src/com/intellij/refactoring/extractInterface/ExtractClassUtil.java b/java/java-impl/src/com/intellij/refactoring/extractInterface/ExtractClassUtil.java index cac66668c83c..30f6d3491c6b 100644 --- a/java/java-impl/src/com/intellij/refactoring/extractInterface/ExtractClassUtil.java +++ b/java/java-impl/src/com/intellij/refactoring/extractInterface/ExtractClassUtil.java @@ -15,15 +15,14 @@ */ package com.intellij.refactoring.extractInterface; -import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.application.ApplicationNamesInfo; import com.intellij.openapi.project.Project; import com.intellij.psi.PsiClass; import com.intellij.psi.PsiElement; import com.intellij.psi.SmartPointerManager; import com.intellij.psi.SmartPsiElementPointer; -import com.intellij.refactoring.RefactoringBundle; import com.intellij.refactoring.JavaRefactoringSettings; +import com.intellij.refactoring.RefactoringBundle; import com.intellij.refactoring.turnRefsToSuper.TurnRefsToSuperProcessor; import com.intellij.refactoring.ui.YesNoPreviewUsagesDialog; @@ -36,7 +35,7 @@ public class ExtractClassUtil { final SmartPsiElementPointer interfacePointer = SmartPointerManager.getInstance(project).createSmartPsiElementPointer(aSuperClass); final PsiElement classElement = classPointer.getElement(); final PsiElement interfaceElement = interfacePointer.getElement(); - if (classElement instanceof PsiClass && interfaceElement instanceof PsiClass) { + if (classElement instanceof PsiClass && classElement.isValid() && interfaceElement instanceof PsiClass && interfaceElement.isValid()) { final PsiClass superClass = (PsiClass) interfaceElement; String superClassName = superClass.getName(); String className = ((PsiClass) classElement).getName(); @@ -56,7 +55,7 @@ public class ExtractClassUtil { final boolean isPreviewUsages = dialog.isPreviewUsages(); JavaRefactoringSettings.getInstance().EXTRACT_INTERFACE_PREVIEW_USAGES = isPreviewUsages; TurnRefsToSuperProcessor processor = - new TurnRefsToSuperProcessor(project, (PsiClass) classElement, (PsiClass) interfaceElement, true); + new TurnRefsToSuperProcessor(project, (PsiClass) classElement, superClass, true); processor.setPreviewUsages(isPreviewUsages); processor.run(); } From a31de9b4d28e104cb61d24af38ff31853c90dbbf Mon Sep 17 00:00:00 2001 From: anna Date: Mon, 6 Feb 2012 12:49:37 +0100 Subject: [PATCH 056/215] IDEA-80899 fix copy from default dir --- .../moveClassesOrPackages/MultipleRootsMoveDestination.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/java/java-impl/src/com/intellij/refactoring/move/moveClassesOrPackages/MultipleRootsMoveDestination.java b/java/java-impl/src/com/intellij/refactoring/move/moveClassesOrPackages/MultipleRootsMoveDestination.java index b24013958510..c27309dd11c1 100644 --- a/java/java-impl/src/com/intellij/refactoring/move/moveClassesOrPackages/MultipleRootsMoveDestination.java +++ b/java/java-impl/src/com/intellij/refactoring/move/moveClassesOrPackages/MultipleRootsMoveDestination.java @@ -45,7 +45,7 @@ public class MultipleRootsMoveDestination extends AutocreatingMoveDestination { public PsiDirectory getTargetDirectory(PsiDirectory source) throws IncorrectOperationException { - if (JavaDirectoryService.getInstance().isSourceRoot(source)) return null; + //if (JavaDirectoryService.getInstance().isSourceRoot(source)) return null; return getOrCreateDirectoryForSource(source.getVirtualFile()); } From 9f32b379b2960daa889424622e9f611c20d03522 Mon Sep 17 00:00:00 2001 From: anna Date: Mon, 6 Feb 2012 13:28:53 +0100 Subject: [PATCH 057/215] IDEA-76659: create method from usage: show chooser when hierarchy is available --- .../impl/quickfix/CreateFromUsageBaseFix.java | 29 ++++++++++++++++--- 1 file changed, 25 insertions(+), 4 deletions(-) diff --git a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/CreateFromUsageBaseFix.java b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/CreateFromUsageBaseFix.java index b8743cc13044..fc7fefb43761 100644 --- a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/CreateFromUsageBaseFix.java +++ b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/CreateFromUsageBaseFix.java @@ -130,7 +130,12 @@ public abstract class CreateFromUsageBaseFix extends BaseIntentionAction { int index = list.getSelectedIndex(); if (index < 0) return; final PsiClass aClass = (PsiClass) list.getSelectedValue(); - doInvoke(project, aClass); + CommandProcessor.getInstance().executeCommand(project, new Runnable() { + @Override + public void run() { + doInvoke(project, aClass); + } + }, getText(), null); } }; @@ -321,10 +326,15 @@ public abstract class CreateFromUsageBaseFix extends BaseIntentionAction { return Collections.emptyList(); } - if (!allowOuterClasses || - !isAllowOuterTargetClass() || - ApplicationManager.getApplication().isUnitTestMode()) + if (ApplicationManager.getApplication().isUnitTestMode()) { return Collections.singletonList(psiClass); + } + + if (!allowOuterClasses || !isAllowOuterTargetClass()) { + final ArrayList classes = new ArrayList(); + collectSupers(psiClass, classes); + return classes; + } List result = new ArrayList(); @@ -337,6 +347,17 @@ public abstract class CreateFromUsageBaseFix extends BaseIntentionAction { } } + private static void collectSupers(PsiClass psiClass, ArrayList classes) { + classes.add(psiClass); + + final PsiClass[] supers = psiClass.getSupers(); + for (PsiClass aSuper : supers) { + if (aSuper.getManager().isInProject(aSuper)) { + collectSupers(aSuper, classes); + } + } + } + protected static void startTemplate (@NotNull Editor editor, final Template template, @NotNull final Project project) { startTemplate(editor, template, project, null); } From adcc43e953d41a857eeb1cfa161a62e79a4b47b4 Mon Sep 17 00:00:00 2001 From: anna Date: Mon, 6 Feb 2012 19:13:03 +0100 Subject: [PATCH 058/215] forbid to use suite method during rerun failed tests --- .../junit4/JUnit46ClassesRequestBuilder.java | 25 +++++++++++++++++-- .../intellij/junit4/JUnit4TestRunnerUtil.java | 2 +- 2 files changed, 24 insertions(+), 3 deletions(-) diff --git a/plugins/junit_rt/src/com/intellij/junit4/JUnit46ClassesRequestBuilder.java b/plugins/junit_rt/src/com/intellij/junit4/JUnit46ClassesRequestBuilder.java index 4dfe3ac733fa..5f2ed3fefa1a 100644 --- a/plugins/junit_rt/src/com/intellij/junit4/JUnit46ClassesRequestBuilder.java +++ b/plugins/junit_rt/src/com/intellij/junit4/JUnit46ClassesRequestBuilder.java @@ -25,12 +25,17 @@ import org.junit.runner.Request; import org.junit.runner.Runner; import org.junit.runners.model.InitializationError; +import java.util.Iterator; +import java.util.Map; +import java.util.Set; + public class JUnit46ClassesRequestBuilder { private JUnit46ClassesRequestBuilder() {} - public static Request getClassesRequest(final String suiteName, Class[] classes) { + public static Request getClassesRequest(final String suiteName, Class[] classes, Map classMethods) { + boolean canUseSuiteMethod = canUseSuiteMethod(classMethods); try { - final AllDefaultPossibilitiesBuilder builder = new AllDefaultPossibilitiesBuilder(true); + final AllDefaultPossibilitiesBuilder builder = new AllDefaultPossibilitiesBuilder(canUseSuiteMethod); final Runner suite = new IdeaSuite(builder, classes, suiteName); return Request.runner(suite); } @@ -39,4 +44,20 @@ public class JUnit46ClassesRequestBuilder { } } + private static boolean canUseSuiteMethod(Map classMethods) { + for (Iterator iterator = classMethods.keySet().iterator(); iterator.hasNext(); ) { + Object className = iterator.next(); + Set methods = (Set) classMethods.get(className); + if (methods == null) { + return true; + } + for (Iterator iterator1 = methods.iterator(); iterator1.hasNext(); ) { + String methodName = (String)iterator1.next(); + if ("suite".equals(methodName)) { + return true; + } + } + } + return false; + } } \ No newline at end of file diff --git a/plugins/junit_rt/src/com/intellij/junit4/JUnit4TestRunnerUtil.java b/plugins/junit_rt/src/com/intellij/junit4/JUnit4TestRunnerUtil.java index 864e51a87373..fc75268f3598 100644 --- a/plugins/junit_rt/src/com/intellij/junit4/JUnit4TestRunnerUtil.java +++ b/plugins/junit_rt/src/com/intellij/junit4/JUnit4TestRunnerUtil.java @@ -79,7 +79,7 @@ public class JUnit4TestRunnerUtil { Request allClasses; try { Class.forName("org.junit.runner.Computer"); - allClasses = JUnit46ClassesRequestBuilder.getClassesRequest(suiteName, classes); + allClasses = JUnit46ClassesRequestBuilder.getClassesRequest(suiteName, classes, classMethods); } catch (ClassNotFoundException e) { allClasses = getClassRequestsUsing44API(suiteName, classes); From e030942b9d9ba09068f804186ad660e05b458aaf Mon Sep 17 00:00:00 2001 From: anna Date: Mon, 6 Feb 2012 19:26:46 +0100 Subject: [PATCH 059/215] copy: suggest to override/skip non-java files with the existing names (IDEA-80912) --- .../refactoring/copy/CopyClassesHandler.java | 33 ++++++++++++++----- 1 file changed, 25 insertions(+), 8 deletions(-) diff --git a/java/java-impl/src/com/intellij/refactoring/copy/CopyClassesHandler.java b/java/java-impl/src/com/intellij/refactoring/copy/CopyClassesHandler.java index 16768174d072..c0c8328a9820 100644 --- a/java/java-impl/src/com/intellij/refactoring/copy/CopyClassesHandler.java +++ b/java/java-impl/src/com/intellij/refactoring/copy/CopyClassesHandler.java @@ -41,6 +41,7 @@ import com.intellij.util.IncorrectOperationException; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import java.io.IOException; import java.util.*; public class CopyClassesHandler extends CopyHandlerDelegateBase { @@ -310,13 +311,14 @@ public class CopyClassesHandler extends CopyHandlerDelegateBase { } } } - final PsiFile[] createdFiles = new PsiFile[fileToClasses.size()]; + final List createdFiles = new ArrayList(fileToClasses.size()); int foIdx = 0; + List files = new ArrayList(); for (final Map.Entry entry : fileToClasses.entrySet()) { - final PsiFile createdFile = copy(entry.getKey(), targetDirectory, copyClassName, map == null ? null : map.get(entry.getKey())); - final PsiClass[] sources = entry.getValue(); - - if (createdFile instanceof PsiClassOwner) { + final PsiFile psiFile = entry.getKey(); + if (psiFile instanceof PsiClassOwner) { + final PsiFile createdFile = copy(psiFile, targetDirectory, copyClassName, map == null ? null : map.get(psiFile)); + final PsiClass[] sources = entry.getValue(); for (final PsiClass destination : ((PsiClassOwner)createdFile).getClasses()) { if (destination instanceof SyntheticElement) { continue; @@ -331,9 +333,24 @@ public class CopyClassesHandler extends CopyHandlerDelegateBase { destination.delete(); } } + createdFiles.add(createdFile); + } else { + files.add(psiFile); } + } - createdFiles[foIdx++] = createdFile; + int[] choice = files.size() > 1 ? new int[]{-1} : null; + for (PsiFile file : files) { + try { + final PsiFile fileCopy = + CopyFilesOrDirectoriesHandler.copyToDirectory(file, getNewFileName(file, copyClassName), targetDirectory, choice); + if (fileCopy != null) { + createdFiles.add(fileCopy); + } + } + catch (IOException e) { + throw new IncorrectOperationException(e.getMessage()); + } } final Set rebindExpressions = new HashSet(); @@ -354,8 +371,8 @@ public class CopyClassesHandler extends CopyHandlerDelegateBase { for (PsiElement expression : rebindExpressions) { codeStyleManager.shortenClassReferences(expression); } - new OptimizeImportsProcessor(project, createdFiles, null).run(); - return newElement != null ? newElement : createdFiles.length > 0 ? createdFiles[0] : null; + new OptimizeImportsProcessor(project, createdFiles.toArray(new PsiFile[createdFiles.size()]), null).run(); + return newElement != null ? newElement : createdFiles.size() > 0 ? createdFiles.get(0) : null; } private static PsiFile copy(@NotNull PsiFile file, PsiDirectory directory, String name, String relativePath) { From 0a864b89b1ac28a2817a71881b678597ca264437 Mon Sep 17 00:00:00 2001 From: Eugene Zhuravlev Date: Mon, 6 Feb 2012 20:35:43 +0100 Subject: [PATCH 060/215] fix possible NPE --- .../src/org/jetbrains/jps/server/ServerState.java | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/jps/jps-builders/src/org/jetbrains/jps/server/ServerState.java b/jps/jps-builders/src/org/jetbrains/jps/server/ServerState.java index e02a0432f25c..444918206990 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/server/ServerState.java +++ b/jps/jps-builders/src/org/jetbrains/jps/server/ServerState.java @@ -308,11 +308,21 @@ class ServerState { } } final Sdk jdk = project.createSdk(/*"JavaSDK"*/sdk.getTypeName(), sdk.getName(), sdk.getHomePath(), additionalData); - jdk.setClasspath(sdk.getPaths()); + if (jdk != null) { + jdk.setClasspath(sdk.getPaths()); + } + else { + LOG.info("Failed to load SDK " + sdk.getName() + ", type: " + sdk.getTypeName()); + } } else { final Library lib = project.createGlobalLibrary(library.getName(), fakeClosure); - lib.setClasspath(library.getPaths()); + if (lib != null) { + lib.setClasspath(library.getPaths()); + } + else { + LOG.info("Failed to load global library " + lib.getName()); + } } } From 2b11f13afca9ac86e404ed72c776335a26c544f8 Mon Sep 17 00:00:00 2001 From: anna Date: Mon, 6 Feb 2012 20:56:33 +0100 Subject: [PATCH 061/215] IDEA-80889 AE at com.intellij.psi.impl.PsiDocumentManagerImpl.a --- .../impl/quickfix/CreateClassFromNewFix.java | 27 ++++++++++++++----- 1 file changed, 20 insertions(+), 7 deletions(-) diff --git a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/CreateClassFromNewFix.java b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/CreateClassFromNewFix.java index 3165e7e01aad..49b37d9b9b2a 100644 --- a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/CreateClassFromNewFix.java +++ b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/CreateClassFromNewFix.java @@ -89,7 +89,7 @@ public class CreateClassFromNewFix extends CreateFromUsageBaseFix { setupInheritance(newExpression, aClass); PsiExpressionList argList = newExpression.getArgumentList(); - Project project = aClass.getProject(); + final Project project = aClass.getProject(); if (argList != null && argList.getExpressions().length > 0) { PsiMethod constructor = elementFactory.createConstructor(); constructor = (PsiMethod) aClass.add(constructor); @@ -101,14 +101,27 @@ public class CreateClassFromNewFix extends CreateFromUsageBaseFix { getReferenceElement(newExpression).bindToElement(aClass); aClass = CodeInsightUtilBase.forcePsiPostprocessAndRestoreElement(aClass); - Template template = templateBuilder.buildTemplate(); + final Template template = templateBuilder.buildTemplate(); template.setToReformat(true); - Editor editor = positionCursor(project, aClass.getContainingFile(), aClass); - TextRange textRange = aClass.getTextRange(); - editor.getDocument().deleteString(textRange.getStartOffset(), textRange.getEndOffset()); - - startTemplate(editor, template, project, null, getText()); + final Editor editor = positionCursor(project, aClass.getContainingFile(), aClass); + final TextRange textRange = aClass.getTextRange(); + final Runnable runnable = new Runnable() { + public void run() { + new WriteCommandAction(project, getText(), getText()) { + @Override + protected void run(Result result) throws Throwable { + editor.getDocument().deleteString(textRange.getStartOffset(), textRange.getEndOffset()); + } + }.execute(); + startTemplate(editor, template, project, null, getText()); + } + }; + if (ApplicationManager.getApplication().isUnitTestMode()) { + runnable.run(); + } else { + ApplicationManager.getApplication().invokeLater(runnable); + } } else { positionCursor(project, aClass.getContainingFile(), aClass); From 76bb17e76630c919395f5dc144413b33e78e2934 Mon Sep 17 00:00:00 2001 From: peter Date: Mon, 6 Feb 2012 22:01:56 +0100 Subject: [PATCH 062/215] call method isn't unused --- .../plugins/groovy/lang/completion/GroovyCompletionUtil.java | 2 +- .../groovy/testdata/highlighting/GloballyUnusedSymbols.groovy | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/completion/GroovyCompletionUtil.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/completion/GroovyCompletionUtil.java index e9188299ceee..2ea9dd45cc24 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/completion/GroovyCompletionUtil.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/completion/GroovyCompletionUtil.java @@ -446,7 +446,7 @@ public class GroovyCompletionUtil { public static final Set OPERATOR_METHOD_NAMES = CollectionFactory.newSet( "plus", "minus", "multiply", "power", "div", "mod", "or", "and", "xor", "next", "previous", "getAt", "putAt", "leftShift", "rightShift", - "isCase", "bitwiseNegate", "negative", "positive" + "isCase", "bitwiseNegate", "negative", "positive", "call" ); public static boolean skipDefGroovyMethod(GrGdkMethod gdkMethod, PsiSubstitutor substitutor, @Nullable PsiType type) { diff --git a/plugins/groovy/testdata/highlighting/GloballyUnusedSymbols.groovy b/plugins/groovy/testdata/highlighting/GloballyUnusedSymbols.groovy index 06a58af451d1..210f013905b7 100644 --- a/plugins/groovy/testdata/highlighting/GloballyUnusedSymbols.groovy +++ b/plugins/groovy/testdata/highlighting/GloballyUnusedSymbols.groovy @@ -9,6 +9,9 @@ class BarUnused> { Bar usedMethod() { this } Object getAt(int key) {} + Object call() {} + Object call(String param) {} + Bar getUsedPropertyGetter() {} public static void main(String[] args) { usedPrivately() } From 981fad55076d033f530f42754fd5f878d0471d72 Mon Sep 17 00:00:00 2001 From: "Denis.Zhdanov" Date: Thu, 2 Feb 2012 12:57:35 +0400 Subject: [PATCH 063/215] IDEA-76142: Gradle support - cannot update IDEA projects once one of build.gradle files changes Removed static dependency to the Application from the 'sync project changes' code. The reason is to avoid global setup changes during the tests processing --- .../GradleProjectStructureChangesModelTest.groovy | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/plugins/gradle/testSources/org/jetbrains/plugins/gradle/sync/GradleProjectStructureChangesModelTest.groovy b/plugins/gradle/testSources/org/jetbrains/plugins/gradle/sync/GradleProjectStructureChangesModelTest.groovy index a1028db5d50c..8db99f475a4b 100644 --- a/plugins/gradle/testSources/org/jetbrains/plugins/gradle/sync/GradleProjectStructureChangesModelTest.groovy +++ b/plugins/gradle/testSources/org/jetbrains/plugins/gradle/sync/GradleProjectStructureChangesModelTest.groovy @@ -1,16 +1,13 @@ package org.jetbrains.plugins.gradle.sync; -import com.intellij.openapi.Disposable import com.intellij.openapi.project.Project -import com.intellij.openapi.util.Disposer import com.intellij.testFramework.SkipInHeadlessEnvironment import com.intellij.util.containers.ContainerUtil import org.jetbrains.plugins.gradle.testutil.ChangeBuilder import org.jetbrains.plugins.gradle.testutil.GradleProjectBuilder import org.jetbrains.plugins.gradle.testutil.IntellijProjectBuilder import org.jetbrains.plugins.gradle.testutil.ProjectStructureChecker -import org.junit.After import org.junit.Before import org.junit.Test import org.picocontainer.defaults.DefaultPicoContainer @@ -31,7 +28,6 @@ public class GradleProjectStructureChangesModelTest { def changes def treeChecker def container - Disposable disposable = [dispose: { }] as Disposable @Before public void setUp() { @@ -51,13 +47,8 @@ public class GradleProjectStructureChangesModelTest { changesModel = container.getComponentInstance(GradleProjectStructureChangesModel) as GradleProjectStructureChangesModel } - @After - public void tearDown() { - Disposer.dispose(disposable) - } - @Test - public void mergeGradleLocalToIntellij() { + public void processObsoleteGradleLocalChange() { // Configure initial projects state. init( gradle { From bd47cf8aa7f4b487f69873ed766b137bc82e8d0e Mon Sep 17 00:00:00 2001 From: "Denis.Zhdanov" Date: Thu, 2 Feb 2012 13:24:56 +0400 Subject: [PATCH 064/215] IDEA-76142: Gradle support - cannot update IDEA projects once one of build.gradle files changes Expanding 'dependencies' node by default --- .../sync/GradleProjectStructureChangesPanel.java | 13 +++++++++++++ .../sync/GradleProjectStructureTreeModel.java | 13 ++++++++----- 2 files changed, 21 insertions(+), 5 deletions(-) diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/sync/GradleProjectStructureChangesPanel.java b/plugins/gradle/src/org/jetbrains/plugins/gradle/sync/GradleProjectStructureChangesPanel.java index d2bc50a5ff41..28a389e9aeed 100644 --- a/plugins/gradle/src/org/jetbrains/plugins/gradle/sync/GradleProjectStructureChangesPanel.java +++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/sync/GradleProjectStructureChangesPanel.java @@ -11,6 +11,8 @@ import org.jetbrains.plugins.gradle.diff.PlatformFacade; import org.jetbrains.plugins.gradle.util.GradleConstants; import javax.swing.*; +import javax.swing.tree.DefaultMutableTreeNode; +import javax.swing.tree.TreePath; import java.awt.*; import java.util.Collection; @@ -50,6 +52,7 @@ public class GradleProjectStructureChangesPanel extends GradleToolWindowPanel { myContent = new JPanel(new GridBagLayout()); myTreeModel = new GradleProjectStructureTreeModel(getProject(), getProjectStructureHelper()); Tree tree = new Tree(myTreeModel); + applyInitialAppearance(tree, (DefaultMutableTreeNode)myTreeModel.getRoot()); GridBagConstraints constraints = new GridBagConstraints(); constraints.fill = GridBagConstraints.BOTH; @@ -71,4 +74,14 @@ public class GradleProjectStructureChangesPanel extends GradleToolWindowPanel { int i = 1; } + private static void applyInitialAppearance(@NotNull Tree tree, @NotNull DefaultMutableTreeNode node) { + if (node.getUserObject() == GradleProjectStructureTreeModel.DEPENDENCIES_NODE_DESCRIPTOR) { + tree.expandPath(new TreePath(node.getPath())); + return; + } + + for (int i = 0; i < node.getChildCount(); i++) { + applyInitialAppearance(tree, (DefaultMutableTreeNode)node.getChildAt(i)); + } + } } diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/sync/GradleProjectStructureTreeModel.java b/plugins/gradle/src/org/jetbrains/plugins/gradle/sync/GradleProjectStructureTreeModel.java index 5327468b119c..e841df3cd0fd 100644 --- a/plugins/gradle/src/org/jetbrains/plugins/gradle/sync/GradleProjectStructureTreeModel.java +++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/sync/GradleProjectStructureTreeModel.java @@ -36,7 +36,12 @@ import java.util.Map; * @since 1/30/12 4:20 PM */ public class GradleProjectStructureTreeModel extends DefaultTreeModel { - + + public static final GradleProjectStructureNodeDescriptor DEPENDENCIES_NODE_DESCRIPTOR = buildDescriptor( + GradleBundle.message("gradle.project.structure.tree.node.dependencies"), + null + ); + /** *
    *     ...
@@ -136,12 +141,10 @@ public class GradleProjectStructureTreeModel extends DefaultTreeModel {
       myModules.put(moduleName, moduleNode);
     }
 
-    DefaultMutableTreeNode result = new DefaultMutableTreeNode(buildDescriptor(
-      GradleBundle.message("gradle.project.structure.tree.node.dependencies"),
-      null
-    ));
+    DefaultMutableTreeNode result = new DefaultMutableTreeNode(DEPENDENCIES_NODE_DESCRIPTOR);
     moduleNode.add(result);
     myModuleDependencies.put(moduleName, result);
+    
     return result;
   }
 

From bc66b65e21023dc3b0f32168983d6eaf10bb300b Mon Sep 17 00:00:00 2001
From: "Denis.Zhdanov" 
Date: Thu, 2 Feb 2012 13:55:00 +0400
Subject: [PATCH 065/215] IDEA-76142: Gradle support - cannot update IDEA
 projects once one of build.gradle files changes

Forcing node repaint on its attribute change
---
 .../plugins/gradle/sync/GradleProjectStructureTreeModel.java     | 1 +
 1 file changed, 1 insertion(+)

diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/sync/GradleProjectStructureTreeModel.java b/plugins/gradle/src/org/jetbrains/plugins/gradle/sync/GradleProjectStructureTreeModel.java
index e841df3cd0fd..31d500edce33 100644
--- a/plugins/gradle/src/org/jetbrains/plugins/gradle/sync/GradleProjectStructureTreeModel.java
+++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/sync/GradleProjectStructureTreeModel.java
@@ -206,6 +206,7 @@ public class GradleProjectStructureTreeModel extends DefaultTreeModel {
             GradleProjectStructureNodeDescriptor d = (GradleProjectStructureNodeDescriptor)child.getUserObject();
             if (missingEntity.equals(d.getElement())) {
               d.setAttributes(descriptor.getAttributes());
+              nodeStructureChanged(child);
               return;
             }
           }

From f9fa4ebd4ccc9567492d0fd79aa44fa4e42dc1e0 Mon Sep 17 00:00:00 2001
From: "Denis.Zhdanov" 
Date: Tue, 7 Feb 2012 10:31:42 +0400
Subject: [PATCH 066/215] IDEA-76142: Gradle support - cannot update IDEA
 projects once one of build.gradle files changes

1. Changes infrastructure is re-written in order to not hold references to the changed entities (Module, LibraryOrderEntry etc). Reason: their hash code may be changed on state change (e.g. new binary file registered for the library changes its hash code);
2. Added support for showing conflict nodes at the gradle project structure tree;
3. Corresponding tests have been added;
---
 .../resources/i18n/GradleBundle.properties    |   5 +
 plugins/gradle/src/META-INF/plugin.xml        |   6 +-
 .../gradle/bootstrap/GradleBootstrap.java     |  12 +-
 .../gradle/config/GradleToolWindowPanel.java  |  15 +-
 ...dleAbstractConflictingPropertyChange.java} |  29 ++-
 .../plugins/gradle/diff/GradleDiffUtil.java   |  19 +-
 .../diff/GradleEntityPresenceChange.java      |  24 +-
 .../diff/GradleLanguageLevelChange.java       |   7 +-
 ...GradleLibraryDependencyPresenceChange.java |  12 +-
 ...yDependencyStructureChangesCalculator.java |  16 +-
 ...adleLibraryStructureChangesCalculator.java |  56 +++++
 .../GradleMismatchedLibraryPathChange.java    |  52 ++++
 .../diff/GradleModulePresenceChange.java      |  11 +-
 .../diff/GradleProjectRenameChange.java       |  22 ++
 .../GradleProjectStructureChangeVisitor.java  |   5 +-
 ...eProjectStructureChangeVisitorAdapter.java |   8 +-
 ...adleProjectStructureChangesCalculator.java |   6 +-
 .../gradle/diff/GradleRenameChange.java       |  48 ----
 .../plugins/gradle/diff/PlatformFacade.java   |  13 +
 ...elperImpl.java => PlatformFacadeImpl.java} |  17 +-
 .../GradleAdjustImportSettingsStep.java       |   2 +-
 .../adjust/GradleProjectStructureFactory.java |   8 +-
 .../plugins/gradle/model/GradleLibrary.java   |   4 +
 .../model/GradleLibraryDependencyId.java      |  78 ++++++
 .../GradleProjectStructureChangesModel.java   |  16 +-
 .../GradleProjectStructureChangesPanel.java   |   9 +-
 .../sync/GradleProjectStructureHelper.java    |  92 +++++++
 .../sync/GradleProjectStructureTreeModel.java | 230 ++++++++----------
 .../gradle/ui/GradleProjectStructureNode.java | 126 +++++++++-
 .../GradleProjectStructureNodeDescriptor.java |   8 +-
 ...dleProjectStructureChangesModelTest.groovy | 124 +++++++++-
 .../testutil/AbstractProjectBuilder.groovy    |  34 ++-
 .../gradle/testutil/ChangeBuilder.groovy      |  37 ++-
 .../testutil/GradleProjectBuilder.groovy      |  12 +-
 .../testutil/IntellijProjectBuilder.groovy    |  31 ++-
 .../testutil/ProjectStructureChecker.groovy   |   5 +-
 36 files changed, 931 insertions(+), 268 deletions(-)
 rename plugins/gradle/src/org/jetbrains/plugins/gradle/diff/{GradleAbstractPropertyValueChange.java => GradleAbstractConflictingPropertyChange.java} (65%)
 create mode 100644 plugins/gradle/src/org/jetbrains/plugins/gradle/diff/GradleLibraryStructureChangesCalculator.java
 create mode 100644 plugins/gradle/src/org/jetbrains/plugins/gradle/diff/GradleMismatchedLibraryPathChange.java
 create mode 100644 plugins/gradle/src/org/jetbrains/plugins/gradle/diff/GradleProjectRenameChange.java
 delete mode 100644 plugins/gradle/src/org/jetbrains/plugins/gradle/diff/GradleRenameChange.java
 rename plugins/gradle/src/org/jetbrains/plugins/gradle/diff/{GradleProjectStructureHelperImpl.java => PlatformFacadeImpl.java} (71%)
 create mode 100644 plugins/gradle/src/org/jetbrains/plugins/gradle/model/GradleLibraryDependencyId.java
 create mode 100644 plugins/gradle/src/org/jetbrains/plugins/gradle/sync/GradleProjectStructureHelper.java

diff --git a/plugins/gradle/resources/i18n/GradleBundle.properties b/plugins/gradle/resources/i18n/GradleBundle.properties
index 0491c6ce225e..205b4ac96bb6 100644
--- a/plugins/gradle/resources/i18n/GradleBundle.properties
+++ b/plugins/gradle/resources/i18n/GradleBundle.properties
@@ -54,6 +54,11 @@ gradle.sync.change.type.intellij={0} local setting
 gradle.sync.change.type.conflict=Settings conflict
 gradle.sync.change.type.unchanged=Unchanged setting
 gradle.sync.change.type.confirmed=Confirmed settings diff
+gradle.sync.change.entity.type.module=module
+gradle.sync.change.entity.type.library.dependency=library dependency
+gradle.sync.change.library.path=library ''{0}'' binary path
+gradle.sync.change.project.name.text=project name
+gradle.sync.change.project.language.level.text=project language level change
 
 gradle.library.resolve.progress.text=Resolving gradle libraries
 
diff --git a/plugins/gradle/src/META-INF/plugin.xml b/plugins/gradle/src/META-INF/plugin.xml
index e347b9db2348..ac0f7b331fd5 100644
--- a/plugins/gradle/src/META-INF/plugin.xml
+++ b/plugins/gradle/src/META-INF/plugin.xml
@@ -39,9 +39,10 @@
     
     
+    
     
     
+                        serviceImplementation="org.jetbrains.plugins.gradle.diff.PlatformFacadeImpl"/>
     
 
@@ -62,6 +63,9 @@
     
       org.jetbrains.plugins.gradle.sync.GradleProjectStructureChangesModel
     
+    
+      org.jetbrains.plugins.gradle.sync.GradleProjectStructureHelper
+    
   
   
   
diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/bootstrap/GradleBootstrap.java b/plugins/gradle/src/org/jetbrains/plugins/gradle/bootstrap/GradleBootstrap.java
index 6472130b5019..d44f8088e683 100644
--- a/plugins/gradle/src/org/jetbrains/plugins/gradle/bootstrap/GradleBootstrap.java
+++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/bootstrap/GradleBootstrap.java
@@ -12,6 +12,7 @@ import org.jetbrains.annotations.NotNull;
 import org.jetbrains.plugins.gradle.diff.PlatformFacade;
 import org.jetbrains.plugins.gradle.sync.GradleProjectStructureChangesModel;
 import org.jetbrains.plugins.gradle.sync.GradleProjectStructureChangesPanel;
+import org.jetbrains.plugins.gradle.sync.GradleProjectStructureHelper;
 import org.jetbrains.plugins.gradle.ui.GradleIcons;
 import org.jetbrains.plugins.gradle.util.GradleBundle;
 
@@ -24,15 +25,18 @@ import org.jetbrains.plugins.gradle.util.GradleBundle;
 public class GradleBootstrap extends AbstractProjectComponent {
 
   private static final String GRADLE_TOOL_WINDOW_ID = GradleBundle.message("gradle.name");
-  
+
   private final GradleProjectStructureChangesModel myChangesModel;
-  private final PlatformFacade myProjectStructureHelper;
+  private final PlatformFacade                     myPlatformFacade;
+  private final GradleProjectStructureHelper       myProjectStructureHelper;
   
   public GradleBootstrap(@NotNull Project project,
                          @NotNull GradleProjectStructureChangesModel changesModel,
-                         @NotNull PlatformFacade projectStructureHelper) {
+                         @NotNull PlatformFacade platformFacade,
+                         @NotNull GradleProjectStructureHelper projectStructureHelper) {
     super(project);
     myChangesModel = changesModel;
+    myPlatformFacade = platformFacade;
     myProjectStructureHelper = projectStructureHelper;
   }
 
@@ -52,7 +56,7 @@ public class GradleBootstrap extends AbstractProjectComponent {
     toolWindow.setIcon(GradleIcons.GRADLE_ICON);
     String syncTitle = GradleBundle.message("gradle.sync.title.tab");
     final GradleProjectStructureChangesPanel projectStructureChanges
-      = new GradleProjectStructureChangesPanel(myProject, myChangesModel, myProjectStructureHelper);
+      = new GradleProjectStructureChangesPanel(myProject, myChangesModel, myPlatformFacade, myProjectStructureHelper);
     toolWindow.getContentManager().addContent(new ContentImpl(projectStructureChanges, syncTitle, true)); 
   }
 }
diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/config/GradleToolWindowPanel.java b/plugins/gradle/src/org/jetbrains/plugins/gradle/config/GradleToolWindowPanel.java
index 7db8c237d79d..7cc983906126 100644
--- a/plugins/gradle/src/org/jetbrains/plugins/gradle/config/GradleToolWindowPanel.java
+++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/config/GradleToolWindowPanel.java
@@ -10,6 +10,7 @@ import com.intellij.util.messages.MessageBusConnection;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
 import org.jetbrains.plugins.gradle.diff.PlatformFacade;
+import org.jetbrains.plugins.gradle.sync.GradleProjectStructureHelper;
 import org.jetbrains.plugins.gradle.util.GradleBundle;
 import org.jetbrains.plugins.gradle.ui.RichTextControlBuilder;
 
@@ -43,14 +44,17 @@ public abstract class GradleToolWindowPanel extends SimpleToolWindowPanel {
   private final JPanel     myContent = new JPanel(myLayout);
 
   private final Project                      myProject;
-  private final PlatformFacade myProjectStructureHelper;
+  private final PlatformFacade               myProjectFacade;
+  private final GradleProjectStructureHelper myProjectStructureHelper;
   
   protected GradleToolWindowPanel(@NotNull Project project,
-                                  @Nullable PlatformFacade projectStructureHelper,
+                                  @Nullable PlatformFacade projectFacade,
+                                  @NotNull GradleProjectStructureHelper projectStructureHelper,
                                   @NotNull String place)
   {
     super(true);
     myProject = project;
+    myProjectFacade = projectFacade;
     myProjectStructureHelper = projectStructureHelper;
     final ActionManager actionManager = ActionManager.getInstance();
     final ActionGroup actionGroup = (ActionGroup)actionManager.getAction(TOOL_WINDOW_TOOLBAR_ID);
@@ -98,7 +102,12 @@ public abstract class GradleToolWindowPanel extends SimpleToolWindowPanel {
   }
 
   @NotNull
-  public PlatformFacade getProjectStructureHelper() {
+  public PlatformFacade getProjectFacade() {
+    return myProjectFacade;
+  }
+
+  @NotNull
+  public GradleProjectStructureHelper getProjectStructureHelper() {
     return myProjectStructureHelper;
   }
 
diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/diff/GradleAbstractPropertyValueChange.java b/plugins/gradle/src/org/jetbrains/plugins/gradle/diff/GradleAbstractConflictingPropertyChange.java
similarity index 65%
rename from plugins/gradle/src/org/jetbrains/plugins/gradle/diff/GradleAbstractPropertyValueChange.java
rename to plugins/gradle/src/org/jetbrains/plugins/gradle/diff/GradleAbstractConflictingPropertyChange.java
index f822b7c8df74..cad6ff1eada3 100644
--- a/plugins/gradle/src/org/jetbrains/plugins/gradle/diff/GradleAbstractPropertyValueChange.java
+++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/diff/GradleAbstractConflictingPropertyChange.java
@@ -19,19 +19,25 @@ import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
 
 /**
- * Defines contract for change that points to particular property value change.
+ * Defines general contract for a change that encapsulates information about conflicting property value of the matched gradle
+ * and intellij entities.
+ * 

+ * For example we may match particular gradle library to an intellij library but they may have different set of attached binaries. + *

+ * Thread-safe. * * @author Denis Zhdanov * @since 11/15/11 7:57 PM + * @param target property value type */ -public abstract class GradleAbstractPropertyValueChange extends GradleAbstractProjectStructureChange { +public abstract class GradleAbstractConflictingPropertyChange extends GradleAbstractProjectStructureChange { + + private final String myPropertyDescription; + private final T myGradleValue; + private final T myIntellijValue; - private final String myProperyName; - private final T myGradleValue; - private final T myIntellijValue; - - public GradleAbstractPropertyValueChange(@NotNull String propertyName, @Nullable T gradleValue, @Nullable T intellijValue) { - myProperyName = propertyName; + public GradleAbstractConflictingPropertyChange(@NotNull String propertyDescription, @Nullable T gradleValue, @Nullable T intellijValue) { + myPropertyDescription = propertyDescription; myGradleValue = gradleValue; myIntellijValue = intellijValue; } @@ -56,7 +62,7 @@ public abstract class GradleAbstractPropertyValueChange extends GradleAbstrac public int hashCode() { int result = super.hashCode(); result = 31 * result + (myGradleValue != null ? myGradleValue.hashCode() : 0); - return 31 * result + (myIntellijValue != null ? myIntellijValue.hashCode() : 0); + return 31 * result + (myIntellijValue != null ? myIntellijValue.hashCode() : 0); } @Override @@ -65,16 +71,15 @@ public abstract class GradleAbstractPropertyValueChange extends GradleAbstrac if (o == null || getClass() != o.getClass()) return false; if (!super.equals(o)) return false; - GradleAbstractPropertyValueChange that = (GradleAbstractPropertyValueChange)o; + GradleAbstractConflictingPropertyChange that = (GradleAbstractConflictingPropertyChange)o; if (myGradleValue != null ? !myGradleValue.equals(that.myGradleValue) : that.myGradleValue != null) return false; if (myIntellijValue != null ? !myIntellijValue.equals(that.myIntellijValue) : that.myIntellijValue != null) return false; - return true; } @Override public String toString() { - return String.format("%s change: gradle='%s', intellij='%s'", myProperyName, myGradleValue, myIntellijValue); + return String.format("%s change: gradle='%s', intellij='%s'", myPropertyDescription, myGradleValue, myIntellijValue); } } diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/diff/GradleDiffUtil.java b/plugins/gradle/src/org/jetbrains/plugins/gradle/diff/GradleDiffUtil.java index a6b51a7b8204..1f6d92224729 100644 --- a/plugins/gradle/src/org/jetbrains/plugins/gradle/diff/GradleDiffUtil.java +++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/diff/GradleDiffUtil.java @@ -37,7 +37,7 @@ public class GradleDiffUtil { @Override public void visit(@NotNull GradleModule module) { - currentChanges.add(new GradleModulePresenceChange(module, null)); + currentChanges.add(new GradleModulePresenceChange(module.getName(), null)); for (GradleDependency dependency : module.getDependencies()) { dependency.invite(this); } @@ -68,11 +68,14 @@ public class GradleDiffUtil { /** * Analogues to {@link #buildLocalChanges} but targets intellij entity. * + * @param gradleProject gradle project which structure is being compared to the intellij one * @param module target intellij-local module that doesn't present at the gradle side * @param currentChanges holder for the changes built during the current call */ - public static void buildLocalChanges(@NotNull Module module, @NotNull Set currentChanges) { - currentChanges.add(new GradleModulePresenceChange(null, module)); + public static void buildLocalChanges(@NotNull Module module, + @NotNull Set currentChanges) + { + currentChanges.add(new GradleModulePresenceChange(null, module.getName())); // TODO den process module sub-entities here (content roots and dependencies). } @@ -85,18 +88,20 @@ public class GradleDiffUtil { public static void buildLocalChanges(@NotNull LibraryOrderEntry libraryDependency, @NotNull Set currentChanges) { - currentChanges.add(new GradleLibraryDependencyPresenceChange(null, libraryDependency)); + final String libraryName = libraryDependency.getLibraryName(); + if (libraryName != null) { + currentChanges.add(new GradleLibraryDependencyPresenceChange(null, libraryDependency)); + } } /** * Performs argument type-based dispatch and delegates to one of strongly typed 'buildLocalChanges()' methods. * + * @param gradleProject gradle project which structure is being compared to the intellij one * @param entity target intellij-local entity that doesn't present at the gradle side * @param currentChanges holder for the changes built during the current call */ - public static void buildLocalChanges(@NotNull Object entity, - @NotNull Set currentChanges) - { + public static void buildLocalChanges(@NotNull Object entity, @NotNull Set currentChanges) { if (entity instanceof GradleEntity) { buildLocalChanges((GradleEntity)entity, currentChanges); } diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/diff/GradleEntityPresenceChange.java b/plugins/gradle/src/org/jetbrains/plugins/gradle/diff/GradleEntityPresenceChange.java index 9e7aedbff9c5..f0d06a4047dc 100644 --- a/plugins/gradle/src/org/jetbrains/plugins/gradle/diff/GradleEntityPresenceChange.java +++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/diff/GradleEntityPresenceChange.java @@ -15,6 +15,7 @@ */ package org.jetbrains.plugins.gradle.diff; +import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; /** @@ -22,13 +23,13 @@ import org.jetbrains.annotations.Nullable; * * @author Denis Zhdanov * @since 11/17/11 12:43 PM - * @param entity type at Gradle side - * @param entity type at IntelliJ IDEA side + * @param entity type */ -public abstract class GradleEntityPresenceChange extends GradleAbstractProjectStructureChange { +public abstract class GradleEntityPresenceChange extends GradleAbstractProjectStructureChange { - private final G myGradleEntity; - private final I myIntellijEntity; + private final T myGradleEntity; + private final T myIntellijEntity; + private final String myEntityName; /** * Creates new GradleEntityPresenceChange project. @@ -40,7 +41,11 @@ public abstract class GradleEntityPresenceChange extends GradleAbstractPro * @throws IllegalArgumentException if both of the given entities are defined or undefined. Expecting this constructor to be * called with one null argument and one non-null argument */ - public GradleEntityPresenceChange(@Nullable G gradleEntity, @Nullable I intellijEntity) throws IllegalArgumentException { + public GradleEntityPresenceChange(@NotNull String entityName, + @Nullable T gradleEntity, + @Nullable T intellijEntity) + throws IllegalArgumentException + { if (!(gradleEntity == null ^ intellijEntity == null)) { throw new IllegalArgumentException(String.format( "Can't construct %s object. Reason: expected that only gradle or intellij entity is null, actual: gradle='%s'; intellij='%s'", @@ -49,15 +54,16 @@ public abstract class GradleEntityPresenceChange extends GradleAbstractPro } myGradleEntity = gradleEntity; myIntellijEntity = intellijEntity; + myEntityName = entityName; } @Nullable - public G getGradleEntity() { + public T getGradleEntity() { return myGradleEntity; } @Nullable - public I getIntellijEntity() { + public T getIntellijEntity() { return myIntellijEntity; } @@ -83,6 +89,6 @@ public abstract class GradleEntityPresenceChange extends GradleAbstractPro @Override public String toString() { - return String.format("entity presence change: gradle='%s', intellij='%s'", myGradleEntity, myIntellijEntity); + return String.format("%s presence change: gradle='%s', intellij='%s'", myEntityName, myGradleEntity, myIntellijEntity); } } diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/diff/GradleLanguageLevelChange.java b/plugins/gradle/src/org/jetbrains/plugins/gradle/diff/GradleLanguageLevelChange.java index 02ad57dad14e..b65d4f21ab65 100644 --- a/plugins/gradle/src/org/jetbrains/plugins/gradle/diff/GradleLanguageLevelChange.java +++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/diff/GradleLanguageLevelChange.java @@ -18,15 +18,16 @@ package org.jetbrains.plugins.gradle.diff; import com.intellij.pom.java.LanguageLevel; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import org.jetbrains.plugins.gradle.util.GradleBundle; /** * @author Denis Zhdanov * @since 11/15/11 8:05 PM */ -public class GradleLanguageLevelChange extends GradleAbstractPropertyValueChange { - +public class GradleLanguageLevelChange extends GradleAbstractConflictingPropertyChange { + public GradleLanguageLevelChange(@Nullable LanguageLevel gradleValue, @Nullable LanguageLevel intellijValue) { - super("project language level", gradleValue, intellijValue); + super(GradleBundle.message("gradle.sync.change.project.language.level.text"), gradleValue, intellijValue); } @Override diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/diff/GradleLibraryDependencyPresenceChange.java b/plugins/gradle/src/org/jetbrains/plugins/gradle/diff/GradleLibraryDependencyPresenceChange.java index e89823d2ef92..f01b816e4dd4 100644 --- a/plugins/gradle/src/org/jetbrains/plugins/gradle/diff/GradleLibraryDependencyPresenceChange.java +++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/diff/GradleLibraryDependencyPresenceChange.java @@ -4,17 +4,21 @@ import com.intellij.openapi.roots.LibraryOrderEntry; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.plugins.gradle.model.GradleLibraryDependency; +import org.jetbrains.plugins.gradle.model.GradleLibraryDependencyId; +import org.jetbrains.plugins.gradle.util.GradleBundle; + +import static org.jetbrains.plugins.gradle.model.GradleLibraryDependencyId.of; /** * @author Denis Zhdanov * @since 1/24/12 9:48 AM */ -public class GradleLibraryDependencyPresenceChange extends GradleEntityPresenceChange { +public class GradleLibraryDependencyPresenceChange extends GradleEntityPresenceChange { - public GradleLibraryDependencyPresenceChange(@Nullable GradleLibraryDependency gradleEntity, @Nullable LibraryOrderEntry intellijEntity) - throws IllegalArgumentException + public GradleLibraryDependencyPresenceChange(@Nullable GradleLibraryDependency gradleDependency, + @Nullable LibraryOrderEntry intellijDependency) throws IllegalArgumentException { - super(gradleEntity, intellijEntity); + super(GradleBundle.message("gradle.sync.change.entity.type.library.dependency"), of(gradleDependency), of(intellijDependency)); } @Override diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/diff/GradleLibraryDependencyStructureChangesCalculator.java b/plugins/gradle/src/org/jetbrains/plugins/gradle/diff/GradleLibraryDependencyStructureChangesCalculator.java index 077f58b88e90..805783254879 100644 --- a/plugins/gradle/src/org/jetbrains/plugins/gradle/diff/GradleLibraryDependencyStructureChangesCalculator.java +++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/diff/GradleLibraryDependencyStructureChangesCalculator.java @@ -1,6 +1,7 @@ package org.jetbrains.plugins.gradle.diff; import com.intellij.openapi.roots.LibraryOrderEntry; +import com.intellij.openapi.roots.libraries.Library; import org.jetbrains.annotations.NotNull; import org.jetbrains.plugins.gradle.model.GradleLibraryDependency; @@ -13,6 +14,12 @@ import java.util.Set; public class GradleLibraryDependencyStructureChangesCalculator implements GradleStructureChangesCalculator { + + private final GradleLibraryStructureChangesCalculator myLibraryCalculator; + + public GradleLibraryDependencyStructureChangesCalculator(@NotNull GradleLibraryStructureChangesCalculator libraryCalculator) { + myLibraryCalculator = libraryCalculator; + } @Override public void calculate(@NotNull GradleLibraryDependency gradleEntity, @@ -20,7 +27,11 @@ public class GradleLibraryDependencyStructureChangesCalculator @NotNull Set knownChanges, @NotNull Set currentChanges) { - // TODO den implement + final Library library = intellijEntity.getLibrary(); + if (library == null) { + return; + } + myLibraryCalculator.calculate(gradleEntity.getTarget(), library, knownChanges, currentChanges); } @NotNull @@ -33,7 +44,6 @@ public class GradleLibraryDependencyStructureChangesCalculator @NotNull @Override public Object getGradleKey(@NotNull GradleLibraryDependency entity, @NotNull Set knownChanges) { - // TODO den consider the known changes - return entity.getName(); + return myLibraryCalculator.getGradleKey(entity.getTarget(), knownChanges); } } diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/diff/GradleLibraryStructureChangesCalculator.java b/plugins/gradle/src/org/jetbrains/plugins/gradle/diff/GradleLibraryStructureChangesCalculator.java new file mode 100644 index 000000000000..f95d2d0c1dbf --- /dev/null +++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/diff/GradleLibraryStructureChangesCalculator.java @@ -0,0 +1,56 @@ +package org.jetbrains.plugins.gradle.diff; + +import com.intellij.openapi.roots.OrderRootType; +import com.intellij.openapi.roots.libraries.Library; +import com.intellij.openapi.vfs.VirtualFile; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.plugins.gradle.model.GradleLibrary; +import org.jetbrains.plugins.gradle.model.LibraryPathType; + +import java.util.HashSet; +import java.util.Set; + +/** + * @author Denis Zhdanov + * @since 2/3/12 11:17 AM + */ +public class GradleLibraryStructureChangesCalculator implements GradleStructureChangesCalculator { + + private final PlatformFacade myPlatformFacade; + + public GradleLibraryStructureChangesCalculator(@NotNull PlatformFacade platformFacade) { + myPlatformFacade = platformFacade; + } + + @Override + public void calculate(@NotNull GradleLibrary gradleEntity, + @NotNull Library intellijEntity, + @NotNull Set knownChanges, + @NotNull Set currentChanges) + { + final Set gradleBinaryPaths = new HashSet(gradleEntity.getPaths(LibraryPathType.BINARY)); + for (VirtualFile file : intellijEntity.getFiles(OrderRootType.CLASSES)) { + final String path = myPlatformFacade.getLocalFileSystemPath(file); + if (!gradleBinaryPaths.remove(path)) { + currentChanges.add(new GradleMismatchedLibraryPathChange(intellijEntity, null, path)); + } + } + + for (String binaryPath : gradleBinaryPaths) { + currentChanges.add(new GradleMismatchedLibraryPathChange(intellijEntity, binaryPath, null)); + } + } + + @NotNull + @Override + public Object getIntellijKey(@NotNull Library entity) { + return entity.getName(); + } + + @NotNull + @Override + public Object getGradleKey(@NotNull GradleLibrary entity, @NotNull Set knownChanges) { + // TODO den consider the known changes + return entity.getName(); + } +} diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/diff/GradleMismatchedLibraryPathChange.java b/plugins/gradle/src/org/jetbrains/plugins/gradle/diff/GradleMismatchedLibraryPathChange.java new file mode 100644 index 000000000000..c6dbdbcf2d9b --- /dev/null +++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/diff/GradleMismatchedLibraryPathChange.java @@ -0,0 +1,52 @@ +package org.jetbrains.plugins.gradle.diff; + +import com.intellij.openapi.roots.libraries.Library; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import org.jetbrains.plugins.gradle.util.GradleBundle; + +/** + * @author Denis Zhdanov + * @since 2/2/12 1:32 PM + */ +public class GradleMismatchedLibraryPathChange extends GradleAbstractConflictingPropertyChange { + + private final String myLibraryName; + + public GradleMismatchedLibraryPathChange(@NotNull Library entity, + @Nullable String gradleValue, + @Nullable String intellijValue) + throws IllegalArgumentException + { + super(GradleBundle.message("gradle.sync.change.library.path", entity.getName()), gradleValue, intellijValue); + myLibraryName = entity.getName(); + if (myLibraryName == null) { + throw new IllegalArgumentException(String.format("Can't create %s instance. Reason: given library has no name (%s)", + getClass().getName(), entity)); + } + } + + @NotNull + public String getLibraryName() { + return myLibraryName; + } + + @Override + public void invite(@NotNull GradleProjectStructureChangeVisitor visitor) { + visitor.visit(this); + } + + @Override + public int hashCode() { + return 31 * super.hashCode() + myLibraryName.hashCode(); + } + + @Override + public boolean equals(Object o) { + if (!super.equals(o)) { + return false; + } + GradleMismatchedLibraryPathChange that = (GradleMismatchedLibraryPathChange)o; + return myLibraryName.equals(that.myLibraryName); + } +} diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/diff/GradleModulePresenceChange.java b/plugins/gradle/src/org/jetbrains/plugins/gradle/diff/GradleModulePresenceChange.java index 15fb4bcc1d8a..da7cbb4fdeb1 100644 --- a/plugins/gradle/src/org/jetbrains/plugins/gradle/diff/GradleModulePresenceChange.java +++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/diff/GradleModulePresenceChange.java @@ -15,19 +15,20 @@ */ package org.jetbrains.plugins.gradle.diff; -import com.intellij.openapi.module.Module; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import org.jetbrains.plugins.gradle.model.GradleModule; +import org.jetbrains.plugins.gradle.util.GradleBundle; /** * @author Denis Zhdanov * @since 11/17/11 12:50 PM */ -public class GradleModulePresenceChange extends GradleEntityPresenceChange { +public class GradleModulePresenceChange extends GradleEntityPresenceChange { - public GradleModulePresenceChange(@Nullable GradleModule gradleEntity, @Nullable Module intellijEntity) throws IllegalArgumentException { - super(gradleEntity, intellijEntity); + public GradleModulePresenceChange(@Nullable String gradleModuleName, @Nullable String intellijModuleName) + throws IllegalArgumentException + { + super(GradleBundle.message("gradle.sync.change.entity.type.module"), gradleModuleName, intellijModuleName); } @Override diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/diff/GradleProjectRenameChange.java b/plugins/gradle/src/org/jetbrains/plugins/gradle/diff/GradleProjectRenameChange.java new file mode 100644 index 000000000000..1894ae972b28 --- /dev/null +++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/diff/GradleProjectRenameChange.java @@ -0,0 +1,22 @@ +package org.jetbrains.plugins.gradle.diff; + +import org.jetbrains.annotations.NotNull; +import org.jetbrains.plugins.gradle.util.GradleBundle; + +/** + * Describes project name change. + * + * @author Denis Zhdanov + * @since 11/3/11 3:54 PM + */ +public class GradleProjectRenameChange extends GradleAbstractConflictingPropertyChange { + + public GradleProjectRenameChange(@NotNull String gradleName, @NotNull String intellijName) { + super(GradleBundle.message("gradle.sync.change.project.name.text"), gradleName, intellijName); + } + + @Override + public void invite(@NotNull GradleProjectStructureChangeVisitor visitor) { + visitor.visit(this); + } +} diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/diff/GradleProjectStructureChangeVisitor.java b/plugins/gradle/src/org/jetbrains/plugins/gradle/diff/GradleProjectStructureChangeVisitor.java index 65310da6673c..0a41c198a88b 100644 --- a/plugins/gradle/src/org/jetbrains/plugins/gradle/diff/GradleProjectStructureChangeVisitor.java +++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/diff/GradleProjectStructureChangeVisitor.java @@ -24,8 +24,9 @@ import org.jetbrains.annotations.NotNull; * @since 11/16/11 8:48 PM */ public interface GradleProjectStructureChangeVisitor { - void visit(@NotNull GradleRenameChange change); - void visit(@NotNull GradleProjectStructureChange change); + void visit(@NotNull GradleProjectRenameChange change); + void visit(@NotNull GradleLanguageLevelChange change); void visit(@NotNull GradleModulePresenceChange change); void visit(@NotNull GradleLibraryDependencyPresenceChange change); + void visit(@NotNull GradleMismatchedLibraryPathChange change); } diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/diff/GradleProjectStructureChangeVisitorAdapter.java b/plugins/gradle/src/org/jetbrains/plugins/gradle/diff/GradleProjectStructureChangeVisitorAdapter.java index 76a108393c04..6e963b8ea895 100644 --- a/plugins/gradle/src/org/jetbrains/plugins/gradle/diff/GradleProjectStructureChangeVisitorAdapter.java +++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/diff/GradleProjectStructureChangeVisitorAdapter.java @@ -24,11 +24,11 @@ import org.jetbrains.annotations.NotNull; public class GradleProjectStructureChangeVisitorAdapter implements GradleProjectStructureChangeVisitor { @Override - public void visit(@NotNull GradleRenameChange change) { + public void visit(@NotNull GradleProjectRenameChange change) { } @Override - public void visit(@NotNull GradleProjectStructureChange change) { + public void visit(@NotNull GradleLanguageLevelChange change) { } @Override @@ -38,4 +38,8 @@ public class GradleProjectStructureChangeVisitorAdapter implements GradleProject @Override public void visit(@NotNull GradleLibraryDependencyPresenceChange change) { } + + @Override + public void visit(@NotNull GradleMismatchedLibraryPathChange change) { + } } diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/diff/GradleProjectStructureChangesCalculator.java b/plugins/gradle/src/org/jetbrains/plugins/gradle/diff/GradleProjectStructureChangesCalculator.java index c8f3236b71de..a8262463f61a 100644 --- a/plugins/gradle/src/org/jetbrains/plugins/gradle/diff/GradleProjectStructureChangesCalculator.java +++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/diff/GradleProjectStructureChangesCalculator.java @@ -70,13 +70,13 @@ public class GradleProjectStructureChangesCalculator implements GradleStructureC String gradleName = gradleProject.getName(); String intellijName = intellijProject.getName(); if (!gradleName.equals(intellijName)) { - currentChanges.add(new GradleRenameChange(GradleRenameChange.Entity.PROJECT, gradleName, intellijName)); + currentChanges.add(new GradleProjectRenameChange(gradleName, intellijName)); } } private void checkLanguageLevel(@NotNull GradleProject gradleProject, - @NotNull Project intellijProject, - @NotNull Set currentChanges) + @NotNull Project intellijProject, + @NotNull Set currentChanges) { LanguageLevel gradleLevel = gradleProject.getLanguageLevel(); LanguageLevel intellijLevel = myStructureHelper.getLanguageLevel(intellijProject); diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/diff/GradleRenameChange.java b/plugins/gradle/src/org/jetbrains/plugins/gradle/diff/GradleRenameChange.java deleted file mode 100644 index 6aaacfe104c6..000000000000 --- a/plugins/gradle/src/org/jetbrains/plugins/gradle/diff/GradleRenameChange.java +++ /dev/null @@ -1,48 +0,0 @@ -package org.jetbrains.plugins.gradle.diff; - -import org.jetbrains.annotations.NotNull; - -/** - * Describes particular entity name change. - * - * @author Denis Zhdanov - * @since 11/3/11 3:54 PM - */ -public class GradleRenameChange extends GradleAbstractPropertyValueChange { - - public enum Entity { PROJECT, MODULE, LIBRARY } - - private final Entity myEntity; - - public GradleRenameChange(@NotNull Entity entity, @NotNull String gradleName, @NotNull String intellijName) { - super(entity.toString().toLowerCase(), gradleName, intellijName); - myEntity = entity; - } - - @NotNull - public Entity getEntity() { - return myEntity; - } - - @Override - public int hashCode() { - return 31 * super.hashCode() + myEntity.hashCode(); - } - - @Override - public boolean equals(Object o) { - if (!super.equals(o)) { - return false; - } - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - - GradleRenameChange that = (GradleRenameChange)o; - return myEntity.equals(that.myEntity); - } - - @Override - public void invite(@NotNull GradleProjectStructureChangeVisitor visitor) { - visitor.visit(this); - } -} diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/diff/PlatformFacade.java b/plugins/gradle/src/org/jetbrains/plugins/gradle/diff/PlatformFacade.java index c03c12035d59..529fea913a98 100644 --- a/plugins/gradle/src/org/jetbrains/plugins/gradle/diff/PlatformFacade.java +++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/diff/PlatformFacade.java @@ -3,6 +3,7 @@ package org.jetbrains.plugins.gradle.diff; import com.intellij.openapi.module.Module; import com.intellij.openapi.project.Project; import com.intellij.openapi.roots.OrderEntry; +import com.intellij.openapi.vfs.VirtualFile; import com.intellij.pom.java.LanguageLevel; import org.jetbrains.annotations.NotNull; @@ -41,4 +42,16 @@ public interface PlatformFacade { */ @NotNull Icon getProjectIcon(); + + /** + * Allows to derive from the given VFS file path that may be compared to the path used by the gradle api. + *

+ * Generally, this method is necessary for processing binary library paths - they point to jar files and VFS uses + * '!' marks in their paths internally. + * + * @param file target file + * @return given file's path that may be compared to the one used by the gradle api + */ + @NotNull + String getLocalFileSystemPath(@NotNull VirtualFile file); } diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/diff/GradleProjectStructureHelperImpl.java b/plugins/gradle/src/org/jetbrains/plugins/gradle/diff/PlatformFacadeImpl.java similarity index 71% rename from plugins/gradle/src/org/jetbrains/plugins/gradle/diff/GradleProjectStructureHelperImpl.java rename to plugins/gradle/src/org/jetbrains/plugins/gradle/diff/PlatformFacadeImpl.java index ff3fb2ada17a..b4a82429a169 100644 --- a/plugins/gradle/src/org/jetbrains/plugins/gradle/diff/GradleProjectStructureHelperImpl.java +++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/diff/PlatformFacadeImpl.java @@ -1,6 +1,7 @@ package org.jetbrains.plugins.gradle.diff; import com.intellij.openapi.application.ex.ApplicationInfoEx; +import com.intellij.openapi.fileTypes.FileTypes; import com.intellij.openapi.module.Module; import com.intellij.openapi.module.ModuleManager; import com.intellij.openapi.project.Project; @@ -8,6 +9,8 @@ import com.intellij.openapi.roots.LanguageLevelProjectExtension; import com.intellij.openapi.roots.ModuleRootManager; import com.intellij.openapi.roots.OrderEntry; import com.intellij.openapi.util.IconLoader; +import com.intellij.openapi.vfs.JarFileSystem; +import com.intellij.openapi.vfs.VirtualFile; import com.intellij.pom.java.LanguageLevel; import org.jetbrains.annotations.NotNull; @@ -19,7 +22,7 @@ import java.util.Collection; * @author Denis Zhdanov * @since 1/26/12 11:54 AM */ -public class GradleProjectStructureHelperImpl implements PlatformFacade { +public class PlatformFacadeImpl implements PlatformFacade { @NotNull @Override @@ -44,4 +47,16 @@ public class GradleProjectStructureHelperImpl implements PlatformFacade { public Icon getProjectIcon() { return IconLoader.getIcon(ApplicationInfoEx.getInstanceEx().getSmallIconUrl()); } + + @NotNull + @Override + public String getLocalFileSystemPath(@NotNull VirtualFile file) { + if (file.getFileType() == FileTypes.ARCHIVE) { + final VirtualFile jar = JarFileSystem.getInstance().getVirtualFileForJar(file); + if (jar != null) { + return jar.getPath(); + } + } + return file.getPath(); + } } diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/importing/wizard/adjust/GradleAdjustImportSettingsStep.java b/plugins/gradle/src/org/jetbrains/plugins/gradle/importing/wizard/adjust/GradleAdjustImportSettingsStep.java index e504101aa38a..4d6fb05e6100 100644 --- a/plugins/gradle/src/org/jetbrains/plugins/gradle/importing/wizard/adjust/GradleAdjustImportSettingsStep.java +++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/importing/wizard/adjust/GradleAdjustImportSettingsStep.java @@ -260,7 +260,7 @@ public class GradleAdjustImportSettingsStep extends AbstractImportFromGradleWiza // We build tree node, its settings control and map them altogether. The only trick here is that nodes can reuse the same // settings control (e.g. more than one node may have the same library as a dependency, so, library dependency node for // every control will use the same settings control). - GradleProjectStructureNode result = new GradleProjectStructureNode(myFactory.buildDescriptor(entity)); + GradleProjectStructureNode result = new GradleProjectStructureNode(myFactory.buildDescriptor(entity)); Pair> pair = processed.get(entity); if (pair == null) { String cardName = String.valueOf(counter); diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/importing/wizard/adjust/GradleProjectStructureFactory.java b/plugins/gradle/src/org/jetbrains/plugins/gradle/importing/wizard/adjust/GradleProjectStructureFactory.java index a488a328071b..95989623ae96 100644 --- a/plugins/gradle/src/org/jetbrains/plugins/gradle/importing/wizard/adjust/GradleProjectStructureFactory.java +++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/importing/wizard/adjust/GradleProjectStructureFactory.java @@ -30,9 +30,9 @@ public class GradleProjectStructureFactory { /** Shared instance of the current (stateless) class. */ public static final GradleProjectStructureFactory INSTANCE = new GradleProjectStructureFactory(); - @SuppressWarnings("MethodMayBeStatic") + @SuppressWarnings({"MethodMayBeStatic", "unchecked"}) @NotNull - public GradleProjectStructureNodeDescriptor buildDescriptor(@NotNull T entity) { + public GradleProjectStructureNodeDescriptor buildDescriptor(@NotNull T entity) { final Ref> result = new Ref>(); entity.invite(new GradleEntityVisitor() { @Override @@ -70,7 +70,7 @@ public class GradleProjectStructureFactory { visit(dependency.getTarget()); } }); - return result.get(); + return (GradleProjectStructureNodeDescriptor)result.get(); } @SuppressWarnings("MethodMayBeStatic") @@ -138,7 +138,7 @@ public class GradleProjectStructureFactory { return; } for (GradleProjectStructureNode node : treeNodes) { - node.getDescriptor().setName(evt.getNewValue().toString()); + node.getDescriptor().setText(evt.getNewValue().toString()); model.nodeChanged(node); } } diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/model/GradleLibrary.java b/plugins/gradle/src/org/jetbrains/plugins/gradle/model/GradleLibrary.java index 55f39878e9e9..cfd267d41064 100644 --- a/plugins/gradle/src/org/jetbrains/plugins/gradle/model/GradleLibrary.java +++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/model/GradleLibrary.java @@ -39,6 +39,10 @@ public class GradleLibrary extends AbstractNamedGradleEntity implements Named { paths.add(GradleUtil.toCanonicalPath(path)); } + public void forgetAllPaths() { + myPaths.clear(); + } + @Override public void invite(@NotNull GradleEntityVisitor visitor) { visitor.visit(this); diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/model/GradleLibraryDependencyId.java b/plugins/gradle/src/org/jetbrains/plugins/gradle/model/GradleLibraryDependencyId.java new file mode 100644 index 000000000000..e42cc70130de --- /dev/null +++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/model/GradleLibraryDependencyId.java @@ -0,0 +1,78 @@ +package org.jetbrains.plugins.gradle.model; + +import com.intellij.openapi.roots.LibraryOrderEntry; +import com.intellij.openapi.util.text.StringUtil; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +/** + * This class serves as an id for any library dependency. We can't use library object itself because its hashCode()/equals() may + * be changed over time (e.g. source root is added). + *

+ * Thread-safe. + * + * @author Denis Zhdanov + * @since 2/6/12 12:09 PM + */ +public class GradleLibraryDependencyId { + + private final String myLibraryName; + private final String myModuleName; + + public GradleLibraryDependencyId(@NotNull String libraryName, @NotNull String moduleName) { + myLibraryName = libraryName; + myModuleName = moduleName; + } + + @Nullable + public static GradleLibraryDependencyId of(@Nullable GradleLibraryDependency dependency) { + return dependency == null ? null : new GradleLibraryDependencyId(dependency.getName(), dependency.getOwnerModule().getName()); + } + + @Nullable + public static GradleLibraryDependencyId of(@Nullable LibraryOrderEntry dependency) { + if (dependency == null) { + return null; + } + final String libraryName = dependency.getLibraryName(); + if (libraryName == null || StringUtil.isEmpty(libraryName)) { + return null; + } + return new GradleLibraryDependencyId(libraryName, dependency.getOwnerModule().getName()); + } + + @NotNull + public String getLibraryName() { + return myLibraryName; + } + + @NotNull + public String getModuleName() { + return myModuleName; + } + + @Override + public int hashCode() { + int result = myLibraryName.hashCode(); + result = 31 * result + myModuleName.hashCode(); + return result; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + GradleLibraryDependencyId id = (GradleLibraryDependencyId)o; + + if (!myLibraryName.equals(id.myLibraryName)) return false; + if (!myModuleName.equals(id.myModuleName)) return false; + + return true; + } + + @Override + public String toString() { + return String.format("library dependency: library='%s', module='%s'", myLibraryName, myModuleName); + } +} diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/sync/GradleProjectStructureChangesModel.java b/plugins/gradle/src/org/jetbrains/plugins/gradle/sync/GradleProjectStructureChangesModel.java index f1ee0022e65d..66934ce49864 100644 --- a/plugins/gradle/src/org/jetbrains/plugins/gradle/sync/GradleProjectStructureChangesModel.java +++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/sync/GradleProjectStructureChangesModel.java @@ -3,6 +3,7 @@ package org.jetbrains.plugins.gradle.sync; import com.intellij.openapi.components.AbstractProjectComponent; import com.intellij.openapi.project.Project; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import org.jetbrains.plugins.gradle.diff.GradleProjectStructureChange; import org.jetbrains.plugins.gradle.diff.GradleStructureChangesCalculator; import org.jetbrains.plugins.gradle.model.GradleProject; @@ -13,7 +14,7 @@ import java.util.concurrent.CopyOnWriteArraySet; import java.util.concurrent.atomic.AtomicReference; /** - * // TODO den add doc + * Manages information about the changes between the gradle and intellij project structures. *

* Thread-safe. * @@ -25,7 +26,9 @@ public class GradleProjectStructureChangesModel extends AbstractProjectComponent private final Set myListeners = new CopyOnWriteArraySet(); private final AtomicReference> myChanges = new AtomicReference>(new HashSet()); - + + private final AtomicReference myGradleProject = new AtomicReference(); + private final GradleStructureChangesCalculator myChangesCalculator; public GradleProjectStructureChangesModel(@NotNull Project project, @@ -54,6 +57,7 @@ public class GradleProjectStructureChangesModel extends AbstractProjectComponent * @param gradleProject gradle project to sync with */ public void update(@NotNull GradleProject gradleProject) { + myGradleProject.set(gradleProject); Set knownChanges = new HashSet(myChanges.get()); Set currentChanges = new HashSet(); myChangesCalculator.calculate(gradleProject, myProject, knownChanges, currentChanges); @@ -66,6 +70,14 @@ public class GradleProjectStructureChangesModel extends AbstractProjectComponent } } + /** + * @return last known gradle project state + */ + @Nullable + public GradleProject getGradleProject() { + return myGradleProject.get(); + } + /** * Registers given listener within the current model. * diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/sync/GradleProjectStructureChangesPanel.java b/plugins/gradle/src/org/jetbrains/plugins/gradle/sync/GradleProjectStructureChangesPanel.java index 28a389e9aeed..72c5e424f100 100644 --- a/plugins/gradle/src/org/jetbrains/plugins/gradle/sync/GradleProjectStructureChangesPanel.java +++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/sync/GradleProjectStructureChangesPanel.java @@ -29,9 +29,10 @@ public class GradleProjectStructureChangesPanel extends GradleToolWindowPanel { public GradleProjectStructureChangesPanel(@NotNull Project project, @NotNull GradleProjectStructureChangesModel model, - @NotNull PlatformFacade projectStructureHelper) + @NotNull PlatformFacade platformFacade, + @NotNull GradleProjectStructureHelper projectStructureHelper) { - super(project, projectStructureHelper, GradleConstants.TOOL_WINDOW_TOOLBAR_PLACE); + super(project, platformFacade, projectStructureHelper, GradleConstants.TOOL_WINDOW_TOOLBAR_PLACE); model.addListener(new GradleProjectStructureChangeListener() { @Override public void onChanges(@NotNull final Collection oldChanges, @@ -41,7 +42,7 @@ public class GradleProjectStructureChangesPanel extends GradleToolWindowPanel { @Override public void run() { myTreeModel.update(currentChanges); - myTreeModel.pruneObsoleteNodes(ContainerUtil.subtract(oldChanges, currentChanges)); + myTreeModel.processObsoleteChanges(ContainerUtil.subtract(oldChanges, currentChanges)); } }); } @@ -50,7 +51,7 @@ public class GradleProjectStructureChangesPanel extends GradleToolWindowPanel { private void init() { myContent = new JPanel(new GridBagLayout()); - myTreeModel = new GradleProjectStructureTreeModel(getProject(), getProjectStructureHelper()); + myTreeModel = new GradleProjectStructureTreeModel(getProject(), getProjectFacade(), getProjectStructureHelper()); Tree tree = new Tree(myTreeModel); applyInitialAppearance(tree, (DefaultMutableTreeNode)myTreeModel.getRoot()); diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/sync/GradleProjectStructureHelper.java b/plugins/gradle/src/org/jetbrains/plugins/gradle/sync/GradleProjectStructureHelper.java new file mode 100644 index 000000000000..96b2c8d8ece0 --- /dev/null +++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/sync/GradleProjectStructureHelper.java @@ -0,0 +1,92 @@ +package org.jetbrains.plugins.gradle.sync; + +import com.intellij.openapi.components.AbstractProjectComponent; +import com.intellij.openapi.module.Module; +import com.intellij.openapi.project.Project; +import com.intellij.openapi.roots.LibraryOrderEntry; +import com.intellij.openapi.roots.OrderEntry; +import com.intellij.openapi.roots.RootPolicy; +import com.intellij.openapi.util.Ref; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.plugins.gradle.diff.PlatformFacade; +import org.jetbrains.plugins.gradle.model.*; + +/** + * @author Denis Zhdanov + * @since 2/6/12 3:28 PM + */ +public class GradleProjectStructureHelper extends AbstractProjectComponent { + + private final GradleProjectStructureChangesModel myModel; + private final PlatformFacade myFacade; + + public GradleProjectStructureHelper(@NotNull Project project, + @NotNull GradleProjectStructureChangesModel model, + @NotNull PlatformFacade facade) + { + super(project); + myModel = model; + myFacade = facade; + } + + /** + * Allows to answer if target library dependency is still available at the target project. + * + * @param id target library id + * @return true if target library dependency is still available at the target project; + * false otherwise + */ + public boolean isIntellijLibraryDependencyExist(@NotNull final GradleLibraryDependencyId id) { + for (Module module : myFacade.getModules(myProject)) { + if (!id.getModuleName().equals(module.getName())) { + continue; + } + RootPolicy visitor = new RootPolicy() { + @Override + public Boolean visitLibraryOrderEntry(LibraryOrderEntry libraryOrderEntry, Boolean value) { + return id.getLibraryName().equals(libraryOrderEntry.getLibraryName()); + } + }; + for (OrderEntry entry : myFacade.getOrderEntries(module)) { + if (entry.accept(visitor, false)) { + return true; + } + } + } + return false; + } + + /** + * Allows to answer if target library dependency is still available at the target project. + * + * @param id target library id + * @return true if target library dependency is still available at the target project; + * false otherwise + */ + public boolean isGradleLibraryDependencyExist(@NotNull final GradleLibraryDependencyId id) { + final GradleProject project = myModel.getGradleProject(); + if (project == null) { + return false; + } + final Ref matched = new Ref(); + GradleEntityVisitor visitor = new GradleEntityVisitorAdapter() { + @Override + public void visit(@NotNull GradleLibraryDependency dependency) { + matched.set(id.getLibraryName().equals(dependency.getName())); + } + }; + for (GradleModule module : project.getModules()) { + if (!id.getModuleName().equals(module.getName())) { + continue; + } + for (GradleDependency dependency : module.getDependencies()) { + dependency.invite(visitor); + if (matched.get()) { + return true; + } + } + return false; + } + return false; + } +} diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/sync/GradleProjectStructureTreeModel.java b/plugins/gradle/src/org/jetbrains/plugins/gradle/sync/GradleProjectStructureTreeModel.java index 31d500edce33..9374826609b2 100644 --- a/plugins/gradle/src/org/jetbrains/plugins/gradle/sync/GradleProjectStructureTreeModel.java +++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/sync/GradleProjectStructureTreeModel.java @@ -1,26 +1,23 @@ package org.jetbrains.plugins.gradle.sync; +import com.intellij.openapi.editor.colors.TextAttributesKey; import com.intellij.openapi.module.Module; import com.intellij.openapi.project.Project; import com.intellij.openapi.roots.LibraryOrderEntry; import com.intellij.openapi.roots.OrderEntry; import com.intellij.openapi.roots.RootPolicy; -import com.intellij.openapi.util.text.StringUtil; import com.intellij.util.containers.hash.HashMap; import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; import org.jetbrains.plugins.gradle.config.GradleTextAttributes; import org.jetbrains.plugins.gradle.diff.*; -import org.jetbrains.plugins.gradle.model.GradleLibraryDependency; -import org.jetbrains.plugins.gradle.model.Named; +import org.jetbrains.plugins.gradle.model.GradleLibraryDependencyId; import org.jetbrains.plugins.gradle.ui.GradleIcons; +import org.jetbrains.plugins.gradle.ui.GradleProjectStructureNode; import org.jetbrains.plugins.gradle.ui.GradleProjectStructureNodeDescriptor; import org.jetbrains.plugins.gradle.util.GradleBundle; import javax.swing.*; -import javax.swing.tree.DefaultMutableTreeNode; import javax.swing.tree.DefaultTreeModel; -import javax.swing.tree.MutableTreeNode; import javax.swing.tree.TreeNode; import java.util.ArrayList; import java.util.Collection; @@ -37,7 +34,9 @@ import java.util.Map; */ public class GradleProjectStructureTreeModel extends DefaultTreeModel { - public static final GradleProjectStructureNodeDescriptor DEPENDENCIES_NODE_DESCRIPTOR = buildDescriptor( + public static final GradleProjectStructureNodeDescriptor DEPENDENCIES_NODE_DESCRIPTOR + = new GradleProjectStructureNodeDescriptor( + GradleBundle.message("gradle.project.structure.tree.node.dependencies"), GradleBundle.message("gradle.project.structure.tree.node.dependencies"), null ); @@ -52,27 +51,33 @@ public class GradleProjectStructureTreeModel extends DefaultTreeModel { * |_dependency2 * */ - private final Map myModuleDependencies = new HashMap(); - private final Map myModules = new HashMap(); + private final Map> myModuleDependencies + = new HashMap>(); + private final Map> myModules + = new HashMap>(); private final TreeNode[] myNodeHolder = new TreeNode[1]; private final int[] myIndexHolder = new int[1]; - private final Project myProject; - private final PlatformFacade myPlatformFacade; + private final Project myProject; + private final PlatformFacade myPlatformFacade; + private final GradleProjectStructureHelper myProjectStructureHelper; - public GradleProjectStructureTreeModel(@NotNull Project project, @NotNull PlatformFacade platformFacade) { + public GradleProjectStructureTreeModel(@NotNull Project project, + @NotNull PlatformFacade platformFacade, + @NotNull GradleProjectStructureHelper projectStructureHelper) { super(null); myProject = project; myPlatformFacade = platformFacade; + myProjectStructureHelper = projectStructureHelper; rebuild(); } public void rebuild() { myModuleDependencies.clear(); myModules.clear(); - - DefaultMutableTreeNode root = new DefaultMutableTreeNode(buildDescriptor(getProject())); + + GradleProjectStructureNode root = buildNode(getProject(), getProject().getName(), myPlatformFacade.getProjectIcon()); final Collection modules = myPlatformFacade.getModules(getProject()); RootPolicy policy = new RootPolicy() { @Override @@ -81,19 +86,21 @@ public class GradleProjectStructureTreeModel extends DefaultTreeModel { } }; for (Module module : modules) { - final DefaultMutableTreeNode moduleNode = new DefaultMutableTreeNode(buildDescriptor(module)); + final GradleProjectStructureNode moduleNode = buildNode(module.getName(), GradleIcons.MODULE_ICON); myModules.put(module.getName(), moduleNode); // Assuming that module names are unique. List libraryDependencies = new ArrayList(); for (OrderEntry orderEntry : myPlatformFacade.getOrderEntries(module)) { final LibraryOrderEntry libraryDependency = orderEntry.accept(policy, null); - if (libraryDependency != null && !StringUtil.isEmpty(libraryDependency.getLibraryName())) { - libraryDependencies.add(libraryDependency); - } + libraryDependencies.add(libraryDependency); } if (!libraryDependencies.isEmpty()) { - DefaultMutableTreeNode dependenciesNode = getDependenciesNode(module.getName()); + GradleProjectStructureNode dependenciesNode = getDependenciesNode(module.getName()); for (LibraryOrderEntry dependency : libraryDependencies) { - dependenciesNode.add(new DefaultMutableTreeNode(buildDescriptor(dependency))); + GradleLibraryDependencyId id = GradleLibraryDependencyId.of(dependency); + if (id == null) { + continue; + } + dependenciesNode.add(buildNode(id, id.getLibraryName(), GradleIcons.LIB_ICON)); } moduleNode.add(dependenciesNode); } @@ -108,40 +115,30 @@ public class GradleProjectStructureTreeModel extends DefaultTreeModel { return myProject; } - private static GradleProjectStructureNodeDescriptor buildDescriptor(@NotNull String name, @Nullable Icon icon) { - return new GradleProjectStructureNodeDescriptor(new Object(), name, icon); + private static GradleProjectStructureNodeDescriptor buildDescriptor(@NotNull T entity, @NotNull String name, @NotNull Icon icon) { + return new GradleProjectStructureNodeDescriptor(entity, name, icon); } - private static GradleProjectStructureNodeDescriptor buildDescriptor(@NotNull Named entity, @NotNull Icon icon) { - return new GradleProjectStructureNodeDescriptor(entity, entity.getName(), icon); + private static GradleProjectStructureNode buildNode(@NotNull String name, @NotNull Icon icon) { + return buildNode(name, name, icon); } - private GradleProjectStructureNodeDescriptor buildDescriptor(@NotNull Project project) { - return new GradleProjectStructureNodeDescriptor(project, project.getName(), myPlatformFacade.getProjectIcon()); + private static GradleProjectStructureNode buildNode(@NotNull T entity, @NotNull String name, @NotNull Icon icon) { + return new GradleProjectStructureNode(buildDescriptor(entity, name, icon)); } - - private static GradleProjectStructureNodeDescriptor buildDescriptor(@NotNull Module module) { - return new GradleProjectStructureNodeDescriptor(module, module.getName(), GradleIcons.MODULE_ICON); - } - - private static GradleProjectStructureNodeDescriptor buildDescriptor(@NotNull LibraryOrderEntry library) { - final String name = library.getLibraryName(); - assert name != null; - return new GradleProjectStructureNodeDescriptor(library, name, GradleIcons.LIB_ICON); - } - - private DefaultMutableTreeNode getDependenciesNode(@NotNull String moduleName) { - final DefaultMutableTreeNode cached = myModuleDependencies.get(moduleName); + + private GradleProjectStructureNode getDependenciesNode(@NotNull String moduleName) { + final GradleProjectStructureNode cached = myModuleDependencies.get(moduleName); if (cached != null) { return cached; } - DefaultMutableTreeNode moduleNode = myModules.get(moduleName); + GradleProjectStructureNode moduleNode = myModules.get(moduleName); if (moduleNode == null) { - moduleNode = new DefaultMutableTreeNode(buildDescriptor(moduleName, GradleIcons.MODULE_ICON)); + moduleNode = buildNode(moduleName, GradleIcons.MODULE_ICON); myModules.put(moduleName, moduleNode); } - DefaultMutableTreeNode result = new DefaultMutableTreeNode(DEPENDENCIES_NODE_DESCRIPTOR); + GradleProjectStructureNode result = new GradleProjectStructureNode(DEPENDENCIES_NODE_DESCRIPTOR); moduleNode.add(result); myModuleDependencies.put(moduleName, result); @@ -155,62 +152,40 @@ public class GradleProjectStructureTreeModel extends DefaultTreeModel { */ public void update(@NotNull Collection changes) { for (GradleProjectStructureChange change : changes) { - change.invite(new GradleProjectStructureChangeVisitor() { + change.invite(new GradleProjectStructureChangeVisitorAdapter() { @Override - public void visit(@NotNull GradleRenameChange change) { - // TODO den implement - } - - @Override - public void visit(@NotNull GradleProjectStructureChange change) { - // TODO den implement - } - - @Override - public void visit(@NotNull GradleModulePresenceChange change) { - // TODO den implement + public void visit(@NotNull GradleMismatchedLibraryPathChange change) { + for (GradleProjectStructureNode holder : myModuleDependencies.values()) { + for (GradleProjectStructureNode dependencyNode : holder.getChildren(GradleLibraryDependencyId.class)) { + final GradleLibraryDependencyId id = dependencyNode.getDescriptor().getElement(); + if (change.getLibraryName().equals(id.getLibraryName())) { + dependencyNode.addConflictChange(change); + break; + } + } + } } @Override public void visit(@NotNull GradleLibraryDependencyPresenceChange change) { - String moduleName; - GradleProjectStructureNodeDescriptor descriptor; - final GradleLibraryDependency gradleEntity = change.getGradleEntity(); - final LibraryOrderEntry intellijEntity = change.getIntellijEntity(); - final Object missingEntity; - if (gradleEntity == null && intellijEntity == null) { - // Never expect to be here. - assert false; + GradleLibraryDependencyId id = change.getGradleEntity(); + TextAttributesKey attributes = GradleTextAttributes.GRADLE_LOCAL_CHANGE; + if (id == null) { + id = change.getIntellijEntity(); + attributes = GradleTextAttributes.INTELLIJ_LOCAL_CHANGE; } - - if (gradleEntity == null) { - // Particular library dependency is added at the intellij side. - moduleName = intellijEntity.getOwnerModule().getName(); - if (intellijEntity.getLibraryName() == null) { - return; - } - descriptor = buildDescriptor(intellijEntity); - descriptor.setAttributes(GradleTextAttributes.INTELLIJ_LOCAL_CHANGE); - missingEntity = intellijEntity; - } - else { - // Particular library dependency is added at the gradle side. - moduleName = gradleEntity.getOwnerModule().getName(); - descriptor = buildDescriptor(gradleEntity, GradleIcons.LIB_ICON); - descriptor.setAttributes(GradleTextAttributes.GRADLE_LOCAL_CHANGE); - missingEntity = gradleEntity; - } - final DefaultMutableTreeNode dependenciesNode = getDependenciesNode(moduleName); - for (int i = 0, max = dependenciesNode.getChildCount(); i < max; i++) { - final DefaultMutableTreeNode child = (DefaultMutableTreeNode)dependenciesNode.getChildAt(i); - GradleProjectStructureNodeDescriptor d = (GradleProjectStructureNodeDescriptor)child.getUserObject(); - if (missingEntity.equals(d.getElement())) { - d.setAttributes(descriptor.getAttributes()); - nodeStructureChanged(child); + assert id != null; + final GradleProjectStructureNode dependenciesNode = getDependenciesNode(id.getModuleName()); + for (GradleProjectStructureNode node : dependenciesNode.getChildren(GradleLibraryDependencyId.class)) { + GradleProjectStructureNodeDescriptor d = node.getDescriptor(); + if (id.equals(d.getElement())) { + d.setAttributes(attributes); + nodeStructureChanged(node); return; } } - DefaultMutableTreeNode newNode = new DefaultMutableTreeNode(descriptor); + GradleProjectStructureNode newNode = buildNode(id, id.getLibraryName(), GradleIcons.LIB_ICON); + newNode.getDescriptor().setAttributes(attributes); dependenciesNode.add(newNode); nodeStructureChanged(dependenciesNode); } @@ -219,7 +194,7 @@ public class GradleProjectStructureTreeModel extends DefaultTreeModel { } /** - * Asks current model to remove all obsolete nodes for the considering that the given changes are obsolete. + * Asks current model to process given changes assuming that they are obsolete. *

* Example: *

@@ -231,63 +206,72 @@ public class GradleProjectStructureTreeModel extends DefaultTreeModel {
    * 
    * 
*/ - public void pruneObsoleteNodes(Collection changes) { + public void processObsoleteChanges(Collection changes) { for (GradleProjectStructureChange change : changes) { - change.invite(new GradleProjectStructureChangeVisitor() { + change.invite(new GradleProjectStructureChangeVisitorAdapter() { @Override - public void visit(@NotNull GradleRenameChange change) { - // TODO den implement - } - - @Override - public void visit(@NotNull GradleProjectStructureChange change) { - // TODO den implement - } - - @Override - public void visit(@NotNull GradleModulePresenceChange change) { - // TODO den implement + public void visit(@NotNull GradleMismatchedLibraryPathChange change) { + for (GradleProjectStructureNode holder : myModuleDependencies.values()) { + for (GradleProjectStructureNode node : holder.getChildren(GradleLibraryDependencyId.class)) { + final GradleLibraryDependencyId id = node.getDescriptor().getElement(); + if (id.getLibraryName().equals(change.getLibraryName())) { + node.removeConflictChange(change); + nodeChanged(node); + break; + } + } + } } @Override public void visit(@NotNull GradleLibraryDependencyPresenceChange change) { // We need to remove the corresponding node then. - String moduleName; - Object library; - final GradleLibraryDependency gradleEntity = change.getGradleEntity(); - final LibraryOrderEntry intellijEntity = change.getIntellijEntity(); - assert gradleEntity != null || intellijEntity != null; - if (gradleEntity == null) { - moduleName = intellijEntity.getOwnerModule().getName(); - library = intellijEntity; + GradleLibraryDependencyId id = change.getGradleEntity(); + boolean removeNode; + if (id == null) { + id = change.getIntellijEntity(); + assert id != null; + removeNode = !myProjectStructureHelper.isIntellijLibraryDependencyExist(id); } else { - moduleName = gradleEntity.getOwnerModule().getName(); - library = gradleEntity; + removeNode = !myProjectStructureHelper.isGradleLibraryDependencyExist(id); } - final DefaultMutableTreeNode holder = myModuleDependencies.get(moduleName); + final GradleProjectStructureNode holder = myModuleDependencies.get(id.getModuleName()); if (holder == null) { return; } - for (DefaultMutableTreeNode node = holder.getFirstLeaf(); node != null; node = node.getNextSibling()) { - GradleProjectStructureNodeDescriptor descriptor = (GradleProjectStructureNodeDescriptor)node.getUserObject(); - if (descriptor.getElement().equals(library)) { - removeNode(node); - return; + + // There are two possible cases why 'local library dependency' change is obsolete: + // 1. Corresponding dependency has been added at the counterparty; + // 2. The 'local dependency' has been removed; + // We should distinguish between those situations because we need to mark the node as 'synced' at one case and + // completely removed at another one. + + for (GradleProjectStructureNode node : holder.getChildren(GradleLibraryDependencyId.class)) { + GradleProjectStructureNodeDescriptor descriptor = node.getDescriptor(); + if (!id.equals(descriptor.getElement())) { + continue; } + if (removeNode) { + removeNode(node); + } + else { + descriptor.setAttributes(GradleTextAttributes.GRADLE_NO_CHANGE); + } + return; } } }); } } - private void removeNode(@NotNull TreeNode node) { - final MutableTreeNode parent = (MutableTreeNode)node.getParent(); + private void removeNode(@NotNull GradleProjectStructureNode node) { + final GradleProjectStructureNode parent = node.getParent(); if (parent == null) { return; } int i = parent.getIndex(node); - if (i <= 0) { + if (i < 0) { assert false : node; return; } diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/ui/GradleProjectStructureNode.java b/plugins/gradle/src/org/jetbrains/plugins/gradle/ui/GradleProjectStructureNode.java index 06e7285d2861..2551a3162a2e 100644 --- a/plugins/gradle/src/org/jetbrains/plugins/gradle/ui/GradleProjectStructureNode.java +++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/ui/GradleProjectStructureNode.java @@ -1,24 +1,140 @@ package org.jetbrains.plugins.gradle.ui; import org.jetbrains.annotations.NotNull; +import org.jetbrains.plugins.gradle.config.GradleTextAttributes; +import org.jetbrains.plugins.gradle.diff.GradleProjectStructureChange; import javax.swing.tree.DefaultMutableTreeNode; +import javax.swing.tree.MutableTreeNode; +import java.util.*; /** * @author Denis Zhdanov * @since 8/23/11 3:50 PM + * @param type of the target entity {@link GradleProjectStructureNodeDescriptor#getElement() associated} with the current node */ -public class GradleProjectStructureNode extends DefaultMutableTreeNode { - - private final GradleProjectStructureNodeDescriptor myDescriptor; +public class GradleProjectStructureNode extends DefaultMutableTreeNode implements Iterable> { - public GradleProjectStructureNode(@NotNull GradleProjectStructureNodeDescriptor descriptor) { + private final Set myConflictChanges = new HashSet(); + private final GradleProjectStructureNodeDescriptor myDescriptor; + + public GradleProjectStructureNode(@NotNull GradleProjectStructureNodeDescriptor descriptor) { super(descriptor); myDescriptor = descriptor; } @NotNull - public GradleProjectStructureNodeDescriptor getDescriptor() { + public GradleProjectStructureNodeDescriptor getDescriptor() { return myDescriptor; } + + @Override + public GradleProjectStructureNode getChildAt(int index) { + return (GradleProjectStructureNode)super.getChildAt(index); + } + + @Override + public GradleProjectStructureNode getParent() { + return (GradleProjectStructureNode)super.getParent(); + } + + @Override + public void add(MutableTreeNode newChild) { + GradleProjectStructureNode child = (GradleProjectStructureNode)newChild; + final String newText = child.getDescriptor().getText(); + for (int i = 0; i < getChildCount(); i++) { + GradleProjectStructureNode node = getChildAt(i); + if (newText.compareTo(node.getDescriptor().getText()) < 0) { + insert(newChild, i); + return; + } + } + super.add(newChild); + } + + /** + * Registers given change within the given node assuming that it is + * {@link GradleTextAttributes#GRADLE_CHANGE_CONFLICT 'conflict change'}. We need to track number of such changes per-node because + * of the following possible situation: + *
+   * 
    + *
  1. There are two 'conflict changes' for particular node;
  2. + *
  3. + * One of those changes is resolved but the node still should be marked as 'conflict' because there is still one conflict change; + *
  4. + *
  5. The second conflict change is removed. The node should be marked as 'no change' now;
  6. + *
+ *
+ * + * @param change conflict change to register for the current node + */ + public void addConflictChange(@NotNull GradleProjectStructureChange change) { + myConflictChanges.add(change); + myDescriptor.setAttributes(GradleTextAttributes.GRADLE_CHANGE_CONFLICT); + } + + /** + * Performs reverse operation to {@link #addConflictChange(GradleProjectStructureChange)}. + * + * @param change conflict change to de-register from the current node + */ + public void removeConflictChange(@NotNull GradleProjectStructureChange change) { + myConflictChanges.remove(change); + if (myConflictChanges.isEmpty()) { + myDescriptor.setAttributes(GradleTextAttributes.GRADLE_NO_CHANGE); + } + } + + /** + * Allows to query current node for all children that are associated with the entity of the given type. + * + * @param clazz target entity type + * @param target entity type + * @return all children nodes that are associated with the entity of the given type if any; + * empty collection otherwise + */ + @SuppressWarnings("unchecked") + @NotNull + public Collection> getChildren(@NotNull Class clazz) { + List> result = null; + for (int i = 0; i < getChildCount(); i++) { + final GradleProjectStructureNode child = getChildAt(i); + final Object element = child.getDescriptor().getElement(); + if (!clazz.isInstance(element)) { + continue; + } + if (result == null) { + result = new ArrayList>(); + } + result.add((GradleProjectStructureNode)child); + } + if (result == null) { + result = Collections.emptyList(); + } + return result; + } + + @NotNull + @Override + public Iterator> iterator() { + return new Iterator>() { + + private int i; + + @Override + public boolean hasNext() { + return i < getChildCount(); + } + + @Override + public GradleProjectStructureNode next() { + return getChildAt(i++); + } + + @Override + public void remove() { + throw new UnsupportedOperationException(); + } + }; + } } diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/ui/GradleProjectStructureNodeDescriptor.java b/plugins/gradle/src/org/jetbrains/plugins/gradle/ui/GradleProjectStructureNodeDescriptor.java index f68a833439fe..6fe8baa490f0 100644 --- a/plugins/gradle/src/org/jetbrains/plugins/gradle/ui/GradleProjectStructureNodeDescriptor.java +++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/ui/GradleProjectStructureNodeDescriptor.java @@ -40,12 +40,18 @@ public class GradleProjectStructureNodeDescriptor extends PresentableNodeDesc presentation.setClosedIcon(myClosedIcon); } + @NotNull @Override public T getElement() { return myData; } - public void setName(@NotNull String name) { + @NotNull + public String getText() { + return myName; + } + + public void setText(@NotNull String name) { myName = name; } diff --git a/plugins/gradle/testSources/org/jetbrains/plugins/gradle/sync/GradleProjectStructureChangesModelTest.groovy b/plugins/gradle/testSources/org/jetbrains/plugins/gradle/sync/GradleProjectStructureChangesModelTest.groovy index 8db99f475a4b..178bd46bf6b2 100644 --- a/plugins/gradle/testSources/org/jetbrains/plugins/gradle/sync/GradleProjectStructureChangesModelTest.groovy +++ b/plugins/gradle/testSources/org/jetbrains/plugins/gradle/sync/GradleProjectStructureChangesModelTest.groovy @@ -42,7 +42,9 @@ public class GradleProjectStructureChangesModelTest { container.registerComponentImplementation(GradleStructureChangesCalculator, GradleProjectStructureChangesCalculator) container.registerComponentImplementation(GradleModuleStructureChangesCalculator) container.registerComponentImplementation(GradleLibraryDependencyStructureChangesCalculator) + container.registerComponentImplementation(GradleLibraryStructureChangesCalculator) container.registerComponentImplementation(GradleProjectStructureTreeModel) + container.registerComponentImplementation(GradleProjectStructureHelper) changesModel = container.getComponentInstance(GradleProjectStructureChangesModel) as GradleProjectStructureChangesModel } @@ -56,6 +58,7 @@ public class GradleProjectStructureChangesModelTest { dependencies { lib(name: "lib1") lib(name: "lib2") + lib(name: "lib3") } } }, intellij { @@ -69,46 +72,157 @@ public class GradleProjectStructureChangesModelTest { checkChanges { presence { lib(gradle: gradle.modules.dependencies.flatten().findAll { it.name == "lib2" }) + lib(gradle: gradle.modules.dependencies.flatten().findAll { it.name == "lib3" }) } } checkTree { project { - module("xxx") { + module() { dependencies { lib1() lib2('gradle') + lib3('gradle') } } } } - // Define changed project state. + // Add the same library at intellij side. Expecting to have the only change now. + intellij { + module { + dependencies { + lib(name: "lib1") + lib(name: "lib2") + } } } + changesModel.update(gradle.project) + checkChanges { + presence { + lib(gradle: gradle.modules.dependencies.flatten().findAll { it.name == "lib3" }) + } } + checkTree { + project { + module() { + dependencies { + lib1() + lib2() + lib3('gradle') + } } } } + + // Remove the 'gradle local' dependency. gradle { module { dependencies { lib(name: "lib1") + lib(name: "lib2") } } } // Apply the changed project state and check if it's correctly parsed. changesModel.update(gradle.project) + checkChanges { } // no changes. assertEquals([].toSet(), changesModel.changes) checkTree { project { module { dependencies { lib1() + lib2() } } } } } - + + @Test + public void libraryDependenciesWithDifferentPaths() { + // Let the model has two differences in a library setup initially. + init( + gradle { + module { + dependencies { + lib(name: "lib1") + lib(name: "lib2", bin: ['1', '2']) + } } }, + intellij { + module { + dependencies { + lib(name: "lib1") + lib(name: "lib2", bin: ['2', '3']) + }}} + ) + + checkChanges { + libraryConflict(entity: intellij.libraries['lib2']) { + binaryPath(gradle: '1', intellij: null) + binaryPath(gradle: null, intellij: '3') + } } + checkTree { + project { + module { + dependencies { + lib1() + lib2('conflict') + } } } } + + // Remove one difference from the library setup and check that the corresponding node is still marked as conflicted + gradle { + module { + dependencies { + lib(name: "lib1") + lib(name: "lib2", bin: ['2']) + } } } + intellij { + module { + dependencies { + lib(name: "lib1") + lib(name: "lib2", bin: ['2', '3']) + }}} + changesModel.update(gradle.project) + checkChanges { + libraryConflict(entity: intellij.dependencies.values().flatten().find {it.library.name == 'lib2' }.library) { + binaryPath(gradle: null, intellij: '3') + } } + checkTree { + project { + module { + dependencies { + lib1() + lib2('conflict') + } } } } + + // Match the remaining change and check that the corresponding node is not marked as conflicted anymore. + gradle { + module { + dependencies { + lib(name: "lib1") + lib(name: "lib2", bin: ['2', '3']) + } } } + intellij { + module { + dependencies { + lib(name: "lib1") + lib(name: "lib2", bin: ['2', '3']) + }}} + changesModel.update(gradle.project) + checkChanges { } // No changes + checkTree { + project { + module { + dependencies { + lib1() + lib2() + } } } } + } + @SuppressWarnings("GroovyAssignabilityCheck") private def init(gradleProjectInit, intellijProjectInit) { treeModel = container.getComponentInstance(GradleProjectStructureTreeModel) as GradleProjectStructureTreeModel changesModel.addListener({ old, current -> treeModel.update(current) - treeModel.pruneObsoleteNodes(ContainerUtil.subtract(old, current)); + treeModel.processObsoleteChanges(ContainerUtil.subtract(old, current)); } as GradleProjectStructureChangeListener) changesModel.update(gradle.project) } private def checkChanges(c) { c.delegate = changes - assertEquals(c(), changesModel.changes) + def expected = c() + if (!expected) { + expected = [].toSet() + } + assertEquals(expected, changesModel.changes) } private def checkTree(c) { diff --git a/plugins/gradle/testSources/org/jetbrains/plugins/gradle/testutil/AbstractProjectBuilder.groovy b/plugins/gradle/testSources/org/jetbrains/plugins/gradle/testutil/AbstractProjectBuilder.groovy index 6e4d1f3fd140..a42abe160332 100644 --- a/plugins/gradle/testSources/org/jetbrains/plugins/gradle/testutil/AbstractProjectBuilder.groovy +++ b/plugins/gradle/testSources/org/jetbrains/plugins/gradle/testutil/AbstractProjectBuilder.groovy @@ -1,19 +1,26 @@ package org.jetbrains.plugins.gradle.testutil -import com.intellij.pom.java.LanguageLevel; +import com.intellij.pom.java.LanguageLevel /** * @author Denis Zhdanov * @since 1/25/12 4:06 PM */ -public abstract class AbstractProjectBuilder extends BuilderSupport { +public abstract class AbstractProjectBuilder extends BuilderSupport { - private static final def SAME_TOKEN = "same" + public static final def SAME_TOKEN = "same" private static int COUNTER def project def modules = [] - def libraries = [:].withDefault { createLibrary(it.name?: same, it.paths?: [:]) } + /** Holds (library name; library) pairs for the active configuration. */ + def libraries = [:] + /** + * Holds (library name; library) pairs for the whole test. I.e. there is a possible case that we define particular configuration + * initially and the adjust it. We need to use the same library instance then in order to pass hashCode()/equals() checks then. + * This map works as a test-wide storage. + */ + def librariesCache = [:] def dependencies = [:].withDefault {[]} @Override @@ -43,7 +50,7 @@ public abstract class AbstractProjectBuilder extends BuilderSupport { case "module": def module = createModule(attributes.name?: same); modules << module; return module case "lib": def module = getCurrent() - def dep = createLibraryDependency(module, libraries[attributes]) + def dep = createLibraryDependency(module, getLibrary(attributes)) dependencies[module] << dep return dep } @@ -57,10 +64,27 @@ public abstract class AbstractProjectBuilder extends BuilderSupport { protected abstract def createProject(String name, LanguageLevel languageLevel) protected abstract def createModule(String name) protected abstract def createLibrary(String name, Map paths) + protected abstract def applyLibraryPaths(library, Map paths) protected abstract def createLibraryDependency(module, library) protected String getUnique() { "./${COUNTER++}" } protected String getSame() { SAME_TOKEN } + + private def getLibrary(Map attributes) { + def name = attributes.name?: same + def result = libraries[name] + if (result) return result + result = librariesCache[name] + if (result) { + applyLibraryPaths(result, attributes) + } + else { + result = createLibrary(name, attributes.withDefault { /* empty paths*/ [] }) + librariesCache[name] = result + } + libraries[name] = result + result + } private def reset() { [modules, dependencies, libraries]*.clear() diff --git a/plugins/gradle/testSources/org/jetbrains/plugins/gradle/testutil/ChangeBuilder.groovy b/plugins/gradle/testSources/org/jetbrains/plugins/gradle/testutil/ChangeBuilder.groovy index 700bcac3111a..b8ebd3b713d0 100644 --- a/plugins/gradle/testSources/org/jetbrains/plugins/gradle/testutil/ChangeBuilder.groovy +++ b/plugins/gradle/testSources/org/jetbrains/plugins/gradle/testutil/ChangeBuilder.groovy @@ -2,6 +2,9 @@ package org.jetbrains.plugins.gradle.testutil; import org.jetbrains.plugins.gradle.diff.GradleLibraryDependencyPresenceChange +import org.jetbrains.plugins.gradle.diff.GradleMismatchedLibraryPathChange +import com.intellij.openapi.roots.libraries.Library +import org.jetbrains.plugins.gradle.util.GradleUtil /** * @author Denis Zhdanov @@ -17,10 +20,7 @@ public class ChangeBuilder extends BuilderSupport { @Override protected Object createNode(Object name) { - if (current == null) { - changes = [] - } - changes + createNode(name, [:]) } @Override @@ -28,13 +28,31 @@ public class ChangeBuilder extends BuilderSupport { @Override protected Object createNode(Object name, Map attributes) { + if (current == null) { + changes = [] + } switch (name) { case "presence": return changes case "lib": changes.addAll attributes.gradle.collect { new GradleLibraryDependencyPresenceChange(it, null)} changes.addAll attributes.intellij.collect { new GradleLibraryDependencyPresenceChange(null, it)} - return + return changes + case "libraryConflict": + def library = attributes.entity + if (!library) { + throw new IllegalArgumentException("No entity is defined for the library conflict change. Known attributes: $attributes") + } + if (attributes.gradle) { + return register(new GradleMismatchedLibraryPathChange(library, attributes.gradle, attributes.intellij)) + } + return library + case "binaryPath": + // Assuming that we're processing library binary path conflict here + register(new GradleMismatchedLibraryPathChange( + current as Library, toCanonicalPath(attributes.gradle), toCanonicalPath(attributes.intellij) + )) } + changes } @Override @@ -44,4 +62,13 @@ public class ChangeBuilder extends BuilderSupport { protected Object postNodeCompletion(Object parent, Object node) { parent == null ? changes.toSet() : node } + + protected def register(change) { + changes << change + change + } + + private def toCanonicalPath(String path) { + path ? GradleUtil.toCanonicalPath(path) : path + } } diff --git a/plugins/gradle/testSources/org/jetbrains/plugins/gradle/testutil/GradleProjectBuilder.groovy b/plugins/gradle/testSources/org/jetbrains/plugins/gradle/testutil/GradleProjectBuilder.groovy index e889543406fa..348e0842c973 100644 --- a/plugins/gradle/testSources/org/jetbrains/plugins/gradle/testutil/GradleProjectBuilder.groovy +++ b/plugins/gradle/testSources/org/jetbrains/plugins/gradle/testutil/GradleProjectBuilder.groovy @@ -31,9 +31,7 @@ class GradleProjectBuilder extends AbstractProjectBuilder { @Override protected createLibrary(String name, Map paths) { def result = new GradleLibrary(name) - (paths.bin?: [same]).each { result.addPath(LibraryPathType.BINARY, it) } - (paths.src?: [same]).each { result.addPath(LibraryPathType.SOURCE, it) } - (paths.doc?: [same]).each { result.addPath(LibraryPathType.DOC, it) } + applyLibraryPaths(result, paths) result } @@ -43,4 +41,12 @@ class GradleProjectBuilder extends AbstractProjectBuilder { module.addDependency(result) result } + + @Override + protected applyLibraryPaths(library, Map paths) { + library.forgetAllPaths() + ['bin': LibraryPathType.BINARY, 'src': LibraryPathType.SOURCE, 'doc': LibraryPathType.DOC].each { + key, type -> paths[key]?.each { library.addPath(type, it) } + } + } } diff --git a/plugins/gradle/testSources/org/jetbrains/plugins/gradle/testutil/IntellijProjectBuilder.groovy b/plugins/gradle/testSources/org/jetbrains/plugins/gradle/testutil/IntellijProjectBuilder.groovy index 4948c10dd0cb..d8ff3e8436e3 100644 --- a/plugins/gradle/testSources/org/jetbrains/plugins/gradle/testutil/IntellijProjectBuilder.groovy +++ b/plugins/gradle/testSources/org/jetbrains/plugins/gradle/testutil/IntellijProjectBuilder.groovy @@ -9,19 +9,29 @@ import com.intellij.openapi.roots.LibraryOrderEntry import com.intellij.openapi.project.Project import com.intellij.openapi.util.IconLoader +import com.intellij.openapi.vfs.VirtualFile +import com.intellij.openapi.roots.OrderRootType +import org.jetbrains.plugins.gradle.util.GradleUtil + /** * @author Denis Zhdanov * @since 1/25/12 3:09 PM */ class IntellijProjectBuilder extends AbstractProjectBuilder { + + static def LIBRARY_ENTRY_TYPES = [(OrderRootType.CLASSES) : "bin"] + static VirtualFile[] DUMMY_VIRTUAL_FILE_ARRAY = new VirtualFile[0] def projectStub = [:] def project = projectStub as Project def platformFacade = [ getModules: { modules }, getOrderEntries: { dependencies[it] }, - getProjectIcon: { IconLoader.getIcon("/nodes/ideaProject.png") } + getProjectIcon: { IconLoader.getIcon("/nodes/ideaProject.png") }, + getLocalFileSystemPath: { it.path } ] + /** (library name - (library root type - paths)). */ + def libraryPaths = [:].withDefault { [:] } @Override protected createProject(String name, LanguageLevel languageLevel) { @@ -37,7 +47,17 @@ class IntellijProjectBuilder extends AbstractProjectBuilder { @Override protected createLibrary(String name, Map paths) { - [ getName: { name }, getPresentableName: { name } ] as Library + libraryPaths[name] = paths + [ + getName: { name }, + getPresentableName: { name }, + getFiles: { + type -> (libraryPaths[name])[LIBRARY_ENTRY_TYPES[type]].findAll { it }.collect { + String path = it + [getPath: { GradleUtil.toCanonicalPath(path) }] as VirtualFile + }.toArray(DUMMY_VIRTUAL_FILE_ARRAY) + } + ] as Library } @Override @@ -46,6 +66,13 @@ class IntellijProjectBuilder extends AbstractProjectBuilder { def result = stub as LibraryOrderEntry stub.accept = { policy, defaultValue -> policy.visitLibraryOrderEntry(result, defaultValue) } stub.getLibraryName = { library.name } + stub.getLibrary = { library } + stub.getOwnerModule = { module } result } + + @Override + protected applyLibraryPaths(library, Map paths) { + libraryPaths[library.name] = paths + } } diff --git a/plugins/gradle/testSources/org/jetbrains/plugins/gradle/testutil/ProjectStructureChecker.groovy b/plugins/gradle/testSources/org/jetbrains/plugins/gradle/testutil/ProjectStructureChecker.groovy index 88decefa8a00..62d8ed0c9191 100644 --- a/plugins/gradle/testSources/org/jetbrains/plugins/gradle/testutil/ProjectStructureChecker.groovy +++ b/plugins/gradle/testSources/org/jetbrains/plugins/gradle/testutil/ProjectStructureChecker.groovy @@ -35,6 +35,9 @@ class ProjectStructureChecker { check it as Node, actual.getChildAt(childIndex++) as DefaultMutableTreeNode } for (it in expected.children().findAll { it instanceof Node}) { + if (childIndex >= actual.childCount) { + fail "Expected node is not matched: $expected" + } check it as Node, actual.getChildAt(childIndex++) as DefaultMutableTreeNode } if (childIndex < actual.childCount) { @@ -43,7 +46,7 @@ class ProjectStructureChecker { } private void checkName(Node expected, GradleProjectStructureNodeDescriptor actual) { - if (expected.name() == actual.toString()) { + if (AbstractProjectBuilder.SAME_TOKEN == actual.toString() || expected.name() == actual.toString()) { return } def clazz = BUILT_IN[expected.name()] From 0678dc85f2f75d93cb59502cc60b853f24f90a48 Mon Sep 17 00:00:00 2001 From: nik Date: Tue, 7 Feb 2012 10:18:44 +0400 Subject: [PATCH 067/215] Exception -> IOException --- .../jps/incremental/CompileContext.java | 19 ++++++++++--------- .../jetbrains/jps/incremental/FSState.java | 9 +++++---- .../jps/incremental/FileProcessor.java | 3 ++- .../jps/incremental/FilesCollector.java | 3 ++- .../jps/incremental/IncProjectBuilder.java | 2 +- .../jps/incremental/ModuleLevelBuilder.java | 4 ++-- .../artifacts/ArtifactSourceFilesState.java | 10 +++++----- .../ArtifactSourceTimestampStorage.java | 4 ++-- .../ArtifactSourceToOutputMapping.java | 2 +- .../artifacts/ArtifactsBuildData.java | 2 +- .../artifacts/IncArtifactBuilder.java | 5 +++-- .../ArtifactInstructionsBuilder.java | 6 ++++-- .../ArtifactInstructionsBuilderImpl.java | 5 +++-- .../instructions/ArtifactRootProcessor.java | 3 ++- .../jps/incremental/groovy/GroovyBuilder.java | 8 ++++---- .../jps/incremental/java/JavaBuilder.java | 2 +- .../resources/ResourcesBuilder.java | 4 ++-- .../storage/AbstractStateStorage.java | 18 +++++++++--------- .../incremental/storage/BuildDataManager.java | 4 ++-- .../storage/ProjectTimestamps.java | 2 +- .../storage/SourceToFormMapping.java | 11 ++++++----- .../storage/SourceToOutputMapping.java | 14 +++++++------- .../incremental/storage/TimestampStorage.java | 8 ++++---- 23 files changed, 79 insertions(+), 69 deletions(-) diff --git a/jps/jps-builders/src/org/jetbrains/jps/incremental/CompileContext.java b/jps/jps-builders/src/org/jetbrains/jps/incremental/CompileContext.java index baf4d2552cb1..6b1ac2a438ea 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/incremental/CompileContext.java +++ b/jps/jps-builders/src/org/jetbrains/jps/incremental/CompileContext.java @@ -15,6 +15,7 @@ import org.jetbrains.jps.incremental.storage.SourceToOutputMapping; import org.jetbrains.jps.incremental.storage.TimestampStorage; import java.io.File; +import java.io.IOException; import java.util.*; /** @@ -80,14 +81,14 @@ public class CompileContext extends UserDataHolderBase implements MessageHandler return myIsProjectRebuild; } - public void markDirty(final File file) throws Exception { + public void markDirty(final File file) throws IOException { final RootDescriptor descriptor = getModuleAndRoot(file); if (descriptor != null) { myFsState.markDirty(file, descriptor, myTsStorage); } } - public void markDirty(final ModuleChunk chunk) throws Exception { + public void markDirty(final ModuleChunk chunk) throws IOException { myFsState.clearContextRoundData(); final Set modules = chunk.getModules(); for (Module module : modules) { @@ -95,7 +96,7 @@ public class CompileContext extends UserDataHolderBase implements MessageHandler } } - public void markDirtyRecursively(ModuleChunk chunk) throws Exception { + public void markDirtyRecursively(ModuleChunk chunk) throws IOException { final Set modules = chunk.getModules(); final Set dirtyModules = new HashSet(modules); @@ -170,7 +171,7 @@ public class CompileContext extends UserDataHolderBase implements MessageHandler myFsState.beforeNextRoundStart(); } - void onChunkBuildComplete(@NotNull ModuleChunk chunk) throws Exception { + void onChunkBuildComplete(@NotNull ModuleChunk chunk) throws IOException { myDataManager.flush(true); try { @@ -225,13 +226,13 @@ public class CompileContext extends UserDataHolderBase implements MessageHandler myDelegateMessageHandler.processMessage(msg); } - public void processFilesToRecompile(ModuleChunk chunk, FileProcessor processor) throws Exception { + public void processFilesToRecompile(ModuleChunk chunk, FileProcessor processor) throws IOException { for (Module module : chunk.getModules()) { myFsState.processFilesToRecompile(this, module, processor); } } - final void ensureFSStateInitialized(ModuleChunk chunk) throws Exception { + final void ensureFSStateInitialized(ModuleChunk chunk) throws IOException { for (Module module : chunk.getModules()) { if (isProjectRebuild()) { markDirtyFiles(module, myTsStorage, true, isCompilingTests() ? DirtyMarkScope.TESTS : DirtyMarkScope.PRODUCTION, null); @@ -252,7 +253,7 @@ public class CompileContext extends UserDataHolderBase implements MessageHandler } } - private void initModuleFSState(Module module) throws Exception { + private void initModuleFSState(Module module) throws IOException { final HashSet currentFiles = new HashSet(); markDirtyFiles(module, myTsStorage, false, isCompilingTests() ? DirtyMarkScope.TESTS : DirtyMarkScope.PRODUCTION, currentFiles); @@ -296,7 +297,7 @@ public class CompileContext extends UserDataHolderBase implements MessageHandler PRODUCTION, TESTS, BOTH } - private void markDirtyFiles(Module module, final TimestampStorage tsStorage, final boolean forceMarkDirty, @NotNull final DirtyMarkScope scope, @Nullable final Set currentFiles) throws Exception { + private void markDirtyFiles(Module module, final TimestampStorage tsStorage, final boolean forceMarkDirty, @NotNull final DirtyMarkScope scope, @Nullable final Set currentFiles) throws IOException { final Set excludes = new HashSet(); for (String excludePath : module.getExcludes()) { excludes.add(new File(excludePath)); @@ -323,7 +324,7 @@ public class CompileContext extends UserDataHolderBase implements MessageHandler } } - private void traverseRecursively(final RootDescriptor rd, final File file, Set excludes, @NotNull final TimestampStorage tsStorage, final boolean forceDirty, @Nullable Set currentFiles) throws Exception { + private void traverseRecursively(final RootDescriptor rd, final File file, Set excludes, @NotNull final TimestampStorage tsStorage, final boolean forceDirty, @Nullable Set currentFiles) throws IOException { if (file.isDirectory()) { if (!PathUtil.isUnder(excludes, file)) { final File[] children = file.listFiles(); diff --git a/jps/jps-builders/src/org/jetbrains/jps/incremental/FSState.java b/jps/jps-builders/src/org/jetbrains/jps/incremental/FSState.java index a2ec11bd1ba7..1c2874f47004 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/incremental/FSState.java +++ b/jps/jps-builders/src/org/jetbrains/jps/incremental/FSState.java @@ -9,6 +9,7 @@ import org.jetbrains.jps.ModuleChunk; import org.jetbrains.jps.incremental.storage.TimestampStorage; import java.io.File; +import java.io.IOException; import java.util.*; /** @@ -66,7 +67,7 @@ public class FSState { getDelta(rd.module).clearRecompile(rd.root, rd.isTestRoot); } - public void markDirty(final File file, final RootDescriptor rd, final @Nullable TimestampStorage tsStorage) throws Exception { + public void markDirty(final File file, final RootDescriptor rd, final @Nullable TimestampStorage tsStorage) throws IOException { final FilesDelta roundDelta = myCurrentRoundDelta; if (roundDelta != null) { if (myContextModules.contains(rd.module)) { @@ -83,7 +84,7 @@ public class FSState { /** * @return true if marked something, false otherwise */ - public boolean markAllUpToDate(CompileScope scope, final RootDescriptor rd, final TimestampStorage tsStorage, final long compilationStartStamp) throws Exception { + public boolean markAllUpToDate(CompileScope scope, final RootDescriptor rd, final TimestampStorage tsStorage, final long compilationStartStamp) throws IOException { boolean marked = false; final FilesDelta delta = getDelta(rd.module); final Set files = delta.clearRecompile(rd.root, rd.isTestRoot); @@ -115,7 +116,7 @@ public class FSState { return marked; } - public boolean processFilesToRecompile(CompileContext context, final Module module, final FileProcessor processor) throws Exception { + public boolean processFilesToRecompile(CompileContext context, final Module module, final FileProcessor processor) throws IOException { final FilesDelta lastRoundDelta = myLastRoundDelta; final FilesDelta delta = lastRoundDelta != null? lastRoundDelta : getDelta(module); final Map> data = delta.getSourcesToRecompile(context.isCompilingTests()); @@ -140,7 +141,7 @@ public class FSState { return true; } - public void registerDeleted(final Module module, final File file, final boolean isTest, @Nullable TimestampStorage tsStorage) throws Exception { + public void registerDeleted(final Module module, final File file, final boolean isTest, @Nullable TimestampStorage tsStorage) throws IOException { getDelta(module).addDeleted(file, isTest); if (tsStorage != null) { tsStorage.remove(file); diff --git a/jps/jps-builders/src/org/jetbrains/jps/incremental/FileProcessor.java b/jps/jps-builders/src/org/jetbrains/jps/incremental/FileProcessor.java index b021673496cf..aa2b800c6633 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/incremental/FileProcessor.java +++ b/jps/jps-builders/src/org/jetbrains/jps/incremental/FileProcessor.java @@ -3,6 +3,7 @@ package org.jetbrains.jps.incremental; import org.jetbrains.jps.Module; import java.io.File; +import java.io.IOException; /** * @author Eugene Zhuravlev @@ -12,5 +13,5 @@ public interface FileProcessor { /** * @return true if processing should continue, false if should stop */ - boolean apply(Module module, File file, String sourceRoot) throws Exception; + boolean apply(Module module, File file, String sourceRoot) throws IOException; } diff --git a/jps/jps-builders/src/org/jetbrains/jps/incremental/FilesCollector.java b/jps/jps-builders/src/org/jetbrains/jps/incremental/FilesCollector.java index ad0c324e33a1..620bcaf846e0 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/incremental/FilesCollector.java +++ b/jps/jps-builders/src/org/jetbrains/jps/incremental/FilesCollector.java @@ -4,6 +4,7 @@ import org.jetbrains.jps.Module; import java.io.File; import java.io.FileFilter; +import java.io.IOException; import java.util.ArrayList; import java.util.Collection; @@ -37,7 +38,7 @@ public class FilesCollector implements FileProcessor{ return myContainer; } - public boolean apply(Module module, File file, String sourceRoot) throws Exception { + public boolean apply(Module module, File file, String sourceRoot) throws IOException { if (myFilter.accept(file)) { myContainer.add(file); } diff --git a/jps/jps-builders/src/org/jetbrains/jps/incremental/IncProjectBuilder.java b/jps/jps-builders/src/org/jetbrains/jps/incremental/IncProjectBuilder.java index 1396d301ac03..de7c5fde53b0 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/incremental/IncProjectBuilder.java +++ b/jps/jps-builders/src/org/jetbrains/jps/incremental/IncProjectBuilder.java @@ -460,7 +460,7 @@ public class IncProjectBuilder { private final Map storageMap = new HashMap(); @Override - public boolean apply(Module module, File file, String sourceRoot) throws Exception { + public boolean apply(Module module, File file, String sourceRoot) throws IOException { SourceToOutputMapping srcToOut = storageMap.get(module); if (srcToOut == null) { srcToOut = dataManager.getSourceToOutputMap(module.getName().toLowerCase(Locale.US), compilingTests); diff --git a/jps/jps-builders/src/org/jetbrains/jps/incremental/ModuleLevelBuilder.java b/jps/jps-builders/src/org/jetbrains/jps/incremental/ModuleLevelBuilder.java index 8fb35f7c1a9a..102f62297c8f 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/incremental/ModuleLevelBuilder.java +++ b/jps/jps-builders/src/org/jetbrains/jps/incremental/ModuleLevelBuilder.java @@ -43,7 +43,7 @@ public abstract class ModuleLevelBuilder extends Builder { * @return true if additional compilation pass is required, false otherwise * @throws Exception */ - public final boolean updateMappings(CompileContext context, final Mappings delta, ModuleChunk chunk, Collection filesToCompile, Collection successfullyCompiled) throws Exception { + public final boolean updateMappings(CompileContext context, final Mappings delta, ModuleChunk chunk, Collection filesToCompile, Collection successfullyCompiled) throws IOException { try { boolean additionalPassRequired = false; @@ -115,7 +115,7 @@ public abstract class ModuleLevelBuilder extends Builder { } } - private static boolean chunkContainsAffectedFiles(CompileContext context, ModuleChunk chunk, final Set affected) throws Exception { + private static boolean chunkContainsAffectedFiles(CompileContext context, ModuleChunk chunk, final Set affected) throws IOException { final Set chunkModules = new HashSet(chunk.getModules()); if (!chunkModules.isEmpty()) { for (File file : affected) { diff --git a/jps/jps-builders/src/org/jetbrains/jps/incremental/artifacts/ArtifactSourceFilesState.java b/jps/jps-builders/src/org/jetbrains/jps/incremental/artifacts/ArtifactSourceFilesState.java index cd7e73175785..c8831e095f5c 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/incremental/artifacts/ArtifactSourceFilesState.java +++ b/jps/jps-builders/src/org/jetbrains/jps/incremental/artifacts/ArtifactSourceFilesState.java @@ -47,7 +47,7 @@ public class ArtifactSourceFilesState { myMappingsFile = new File(mappingsDir, String.valueOf(artifactId)); } - public ArtifactSourceToOutputMapping getOrCreateMapping() throws Exception { + public ArtifactSourceToOutputMapping getOrCreateMapping() throws IOException { if (myMapping == null) { myMapping = new ArtifactSourceToOutputMapping(myMappingsFile); } @@ -68,7 +68,7 @@ public class ArtifactSourceFilesState { return myDeletedFiles; } - public void initState() throws Exception { + public void initState() throws IOException { /* if (!myInitialized.compareAndSet(false, true)) { return; @@ -80,7 +80,7 @@ public class ArtifactSourceFilesState { myDeletedFiles.clear(); getOrCreateInstructions().processRoots(new ArtifactRootProcessor() { @Override - public void process(ArtifactSourceRoot root, Collection destinations) throws Exception { + public void process(ArtifactSourceRoot root, Collection destinations) throws IOException { final File rootFile = root.getRootFile(); if (rootFile.exists()) { processRecursively(rootFile, root.getFilter(), currentPaths); @@ -101,7 +101,7 @@ public class ArtifactSourceFilesState { return myTimestampStorage; } - private void processRecursively(File file, SourceFileFilter filter, Set currentPaths) throws Exception { + private void processRecursively(File file, SourceFileFilter filter, Set currentPaths) throws IOException { final String filePath = FileUtil.toSystemIndependentName(FileUtil.toCanonicalPath(file.getPath())); if (!filter.accept(filePath)) return; @@ -148,7 +148,7 @@ public class ArtifactSourceFilesState { return instructionsBuilder; } - public void updateTimestamps(Set deletedFiles, Set changedFiles) throws Exception { + public void updateTimestamps(Set deletedFiles, Set changedFiles) throws IOException { for (String filePath : deletedFiles) { final ArtifactSourceTimestampStorage.PerArtifactTimestamp[] state = myTimestampStorage.getState(filePath); if (state == null) continue; diff --git a/jps/jps-builders/src/org/jetbrains/jps/incremental/artifacts/ArtifactSourceTimestampStorage.java b/jps/jps-builders/src/org/jetbrains/jps/incremental/artifacts/ArtifactSourceTimestampStorage.java index 8f5bab766b6c..e0e903c0f5f9 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/incremental/artifacts/ArtifactSourceTimestampStorage.java +++ b/jps/jps-builders/src/org/jetbrains/jps/incremental/artifacts/ArtifactSourceTimestampStorage.java @@ -37,11 +37,11 @@ public class ArtifactSourceTimestampStorage extends AbstractStateStorage(); diff --git a/jps/jps-builders/src/org/jetbrains/jps/incremental/artifacts/IncArtifactBuilder.java b/jps/jps-builders/src/org/jetbrains/jps/incremental/artifacts/IncArtifactBuilder.java index 971eec712f40..c158090774ad 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/incremental/artifacts/IncArtifactBuilder.java +++ b/jps/jps-builders/src/org/jetbrains/jps/incremental/artifacts/IncArtifactBuilder.java @@ -20,6 +20,7 @@ import org.jetbrains.jps.incremental.messages.UptoDateFilesSavedEvent; import org.jetbrains.jps.incremental.storage.BuildDataManager; import java.io.File; +import java.io.IOException; import java.util.*; /** @@ -92,7 +93,7 @@ public class IncArtifactBuilder extends ProjectLevelBuilder { final List outputs = new SmartList(); instructions.processContainingRoots(filePath, new ArtifactRootProcessor() { @Override - public void process(ArtifactSourceRoot root, Collection destinations) throws Exception { + public void process(ArtifactSourceRoot root, Collection destinations) throws IOException { for (DestinationInfo destination : destinations) { if (destination instanceof ExplodedDestinationInfo) { root.copyFromRoot(filePath, destination.getOutputPath(), outputs); @@ -125,7 +126,7 @@ public class IncArtifactBuilder extends ProjectLevelBuilder { } private static Set deleteOutdatedFiles(Set deletedFiles, CompileContext context, - ArtifactSourceToOutputMapping mapping) throws Exception { + ArtifactSourceToOutputMapping mapping) throws IOException { if (deletedFiles.isEmpty()) return Collections.emptySet(); context.processMessage(new ProgressMessage("Deleting outdated files...")); diff --git a/jps/jps-builders/src/org/jetbrains/jps/incremental/artifacts/instructions/ArtifactInstructionsBuilder.java b/jps/jps-builders/src/org/jetbrains/jps/incremental/artifacts/instructions/ArtifactInstructionsBuilder.java index 990c62f9d043..4f2a935ecbc0 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/incremental/artifacts/instructions/ArtifactInstructionsBuilder.java +++ b/jps/jps-builders/src/org/jetbrains/jps/incremental/artifacts/instructions/ArtifactInstructionsBuilder.java @@ -2,13 +2,15 @@ package org.jetbrains.jps.incremental.artifacts.instructions; import org.jetbrains.annotations.Nullable; +import java.io.IOException; + /** * @author nik */ public interface ArtifactInstructionsBuilder { - void processRoots(ArtifactRootProcessor processor) throws Exception; + void processRoots(ArtifactRootProcessor processor) throws IOException; - void processContainingRoots(String filePath, ArtifactRootProcessor processor) throws Exception; + void processContainingRoots(String filePath, ArtifactRootProcessor processor) throws IOException; @Nullable JarInfo getJarInfo(String outputPath); diff --git a/jps/jps-builders/src/org/jetbrains/jps/incremental/artifacts/instructions/ArtifactInstructionsBuilderImpl.java b/jps/jps-builders/src/org/jetbrains/jps/incremental/artifacts/instructions/ArtifactInstructionsBuilderImpl.java index 564c5a5c0056..affd9f3a097f 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/incremental/artifacts/instructions/ArtifactInstructionsBuilderImpl.java +++ b/jps/jps-builders/src/org/jetbrains/jps/incremental/artifacts/instructions/ArtifactInstructionsBuilderImpl.java @@ -7,6 +7,7 @@ import org.jetbrains.annotations.Nullable; import org.jetbrains.jps.incremental.ModuleRootsIndex; import java.io.File; +import java.io.IOException; import java.util.Collection; import java.util.HashMap; import java.util.Map; @@ -70,14 +71,14 @@ public class ArtifactInstructionsBuilderImpl implements ArtifactInstructionsBuil } @Override - public void processRoots(ArtifactRootProcessor processor) throws Exception { + public void processRoots(ArtifactRootProcessor processor) throws IOException { for (Map.Entry> entry : myInstructions.entrySet()) { processor.process(entry.getKey(), entry.getValue()); } } @Override - public void processContainingRoots(String filePath, ArtifactRootProcessor processor) throws Exception { + public void processContainingRoots(String filePath, ArtifactRootProcessor processor) throws IOException { //todo[nik] improve? for (Map.Entry> entry : myInstructions.entrySet()) { final ArtifactSourceRoot root = entry.getKey(); diff --git a/jps/jps-builders/src/org/jetbrains/jps/incremental/artifacts/instructions/ArtifactRootProcessor.java b/jps/jps-builders/src/org/jetbrains/jps/incremental/artifacts/instructions/ArtifactRootProcessor.java index c90152dff468..2d048dfbfeeb 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/incremental/artifacts/instructions/ArtifactRootProcessor.java +++ b/jps/jps-builders/src/org/jetbrains/jps/incremental/artifacts/instructions/ArtifactRootProcessor.java @@ -1,10 +1,11 @@ package org.jetbrains.jps.incremental.artifacts.instructions; +import java.io.IOException; import java.util.Collection; /** * @author nik */ public interface ArtifactRootProcessor { - void process(ArtifactSourceRoot root, Collection destinations) throws Exception; + void process(ArtifactSourceRoot root, Collection destinations) throws IOException; } diff --git a/jps/jps-builders/src/org/jetbrains/jps/incremental/groovy/GroovyBuilder.java b/jps/jps-builders/src/org/jetbrains/jps/incremental/groovy/GroovyBuilder.java index 2a156ddbb253..5565703430b4 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/incremental/groovy/GroovyBuilder.java +++ b/jps/jps-builders/src/org/jetbrains/jps/incremental/groovy/GroovyBuilder.java @@ -140,11 +140,11 @@ public class GroovyBuilder extends ModuleLevelBuilder { return FileUtil.toCanonicalPath(dir.getPath()); } - private static List collectChangedFiles(CompileContext context, ModuleChunk chunk) throws Exception { + private static List collectChangedFiles(CompileContext context, ModuleChunk chunk) throws IOException { final List toCompile = new ArrayList(); context.processFilesToRecompile(chunk, new FileProcessor() { @Override - public boolean apply(Module module, File file, String sourceRoot) throws Exception { + public boolean apply(Module module, File file, String sourceRoot) throws IOException { final String path = file.getPath(); if (isGroovyFile(path)) { //todo file type check toCompile.add(file); @@ -159,7 +159,7 @@ public class GroovyBuilder extends ModuleLevelBuilder { ModuleChunk chunk, List toCompile, String moduleOutputPath, - List successfullyCompiled) throws Exception { + List successfullyCompiled) throws IOException { final Mappings delta = context.createDelta(); final List successfullyCompiledFiles = new ArrayList(); if (!successfullyCompiled.isEmpty()) { @@ -207,7 +207,7 @@ public class GroovyBuilder extends ModuleLevelBuilder { return path.endsWith(".groovy") || path.endsWith(".gpp"); } - private static Map buildClassToSourceMap(ModuleChunk chunk, CompileContext context, Set toCompilePaths, String moduleOutputPath) throws Exception { + private static Map buildClassToSourceMap(ModuleChunk chunk, CompileContext context, Set toCompilePaths, String moduleOutputPath) throws IOException { final Map class2Src = new HashMap(); for (Module module : chunk.getModules()) { final String moduleName = module.getName().toLowerCase(Locale.US); diff --git a/jps/jps-builders/src/org/jetbrains/jps/incremental/java/JavaBuilder.java b/jps/jps-builders/src/org/jetbrains/jps/incremental/java/JavaBuilder.java index cda2b4094bbb..8a80242794ef 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/incremental/java/JavaBuilder.java +++ b/jps/jps-builders/src/org/jetbrains/jps/incremental/java/JavaBuilder.java @@ -132,7 +132,7 @@ public class JavaBuilder extends ModuleLevelBuilder { final Set formsToCompile = new HashSet(); context.processFilesToRecompile(chunk, new FileProcessor() { - public boolean apply(Module module, File file, String sourceRoot) throws Exception { + public boolean apply(Module module, File file, String sourceRoot) throws IOException { if (JAVA_SOURCES_FILTER.accept(file)) { filesToCompile.add(file); } diff --git a/jps/jps-builders/src/org/jetbrains/jps/incremental/resources/ResourcesBuilder.java b/jps/jps-builders/src/org/jetbrains/jps/incremental/resources/ResourcesBuilder.java index a318f8ef4dd7..8a36c1ec7b9d 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/incremental/resources/ResourcesBuilder.java +++ b/jps/jps-builders/src/org/jetbrains/jps/incremental/resources/ResourcesBuilder.java @@ -51,7 +51,7 @@ public class ResourcesBuilder extends ModuleLevelBuilder { // todo: process all files in case of rebuild or wholeModuleDirty // todo: otherwise avoid traverwing the whole module and use dirty file list taken from params context.processFilesToRecompile(chunk, new FileProcessor() { - public boolean apply(final Module module, final File file, final String sourceRoot) throws Exception { + public boolean apply(final Module module, final File file, final String sourceRoot) throws IOException { if (finalPatterns.isResourceFile(file, sourceRoot)) { try { context.processMessage(new ProgressMessage("Copying " + file.getPath())); @@ -79,7 +79,7 @@ public class ResourcesBuilder extends ModuleLevelBuilder { Module module, File file, String sourceRoot, - final SourceToOutputMapping outputToSourceMapping) throws Exception { + final SourceToOutputMapping outputToSourceMapping) throws IOException { final String outputRoot = context.isCompilingTests() ? module.getTestOutputPath() : module.getOutputPath(); final String relativePath = FileUtil.getRelativePath(sourceRoot, FileUtil.toSystemIndependentName(file.getPath()), '/'); final String prefix = module.getSourceRootPrefixes().get(sourceRoot); diff --git a/jps/jps-builders/src/org/jetbrains/jps/incremental/storage/AbstractStateStorage.java b/jps/jps-builders/src/org/jetbrains/jps/incremental/storage/AbstractStateStorage.java index 4ab0d58eb54a..cefe772c13c5 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/incremental/storage/AbstractStateStorage.java +++ b/jps/jps-builders/src/org/jetbrains/jps/incremental/storage/AbstractStateStorage.java @@ -20,7 +20,7 @@ public abstract class AbstractStateStorage { private final DataExternalizer myStateExternalizer; protected final Object myDataLock = new Object(); - public AbstractStateStorage(@NonNls File storePath, KeyDescriptor keyDescriptor, DataExternalizer stateExternalizer) throws Exception { + public AbstractStateStorage(@NonNls File storePath, KeyDescriptor keyDescriptor, DataExternalizer stateExternalizer) throws IOException { myBaseFile = storePath; myKeyDescriptor = keyDescriptor; myStateExternalizer = stateExternalizer; @@ -58,14 +58,14 @@ public abstract class AbstractStateStorage { try { myMap = createMap(myBaseFile); } - catch (Exception ignored) { + catch (IOException ignored) { return false; } return true; } } - public void update(Key key, @Nullable T state) throws Exception { + public void update(Key key, @Nullable T state) throws IOException { if (state != null) { synchronized (myDataLock) { myMap.put(key, state); @@ -76,7 +76,7 @@ public abstract class AbstractStateStorage { } } - public void appendData(final Key key, final T data) throws Exception { + public void appendData(final Key key, final T data) throws IOException { synchronized (myDataLock) { myMap.appendData(key, new PersistentHashMap.ValueDataAppender() { public void append(DataOutput out) throws IOException { @@ -86,32 +86,32 @@ public abstract class AbstractStateStorage { } } - public void remove(Key key) throws Exception { + public void remove(Key key) throws IOException { synchronized (myDataLock) { myMap.remove(key); } } - public T getState(Key key) throws Exception { + public T getState(Key key) throws IOException { synchronized (myDataLock) { return myMap.get(key); } } - public Collection getKeys() throws Exception { + public Collection getKeys() throws IOException { synchronized (myDataLock) { return myMap.getAllKeysWithExistingMapping(); } } - public Iterator getKeysIterator() throws Exception { + public Iterator getKeysIterator() throws IOException { synchronized (myDataLock) { return myMap.getAllKeysWithExistingMapping().iterator(); } } - private PersistentHashMap createMap(final File file) throws Exception { + private PersistentHashMap createMap(final File file) throws IOException { FileUtil.createIfDoesntExist(file); return new PersistentHashMap(file, myKeyDescriptor, myStateExternalizer); } diff --git a/jps/jps-builders/src/org/jetbrains/jps/incremental/storage/BuildDataManager.java b/jps/jps-builders/src/org/jetbrains/jps/incremental/storage/BuildDataManager.java index a6935dbcd70f..2d8c0516570f 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/incremental/storage/BuildDataManager.java +++ b/jps/jps-builders/src/org/jetbrains/jps/incremental/storage/BuildDataManager.java @@ -31,7 +31,7 @@ public class BuildDataManager { private final ArtifactsBuildData myArtifactsBuildData; private final Mappings myMappings; - public BuildDataManager(String projectName, final boolean useMemoryTempCaches) throws Exception { + public BuildDataManager(String projectName, final boolean useMemoryTempCaches) throws IOException { myProjectName = projectName; mySrcToFormMap = new SourceToFormMapping(new File(getSourceToFormsRoot(), "data")); myMappings = new Mappings(getMappingsRoot(), useMemoryTempCaches); @@ -39,7 +39,7 @@ public class BuildDataManager { myArtifactsBuildData = new ArtifactsBuildData(artifactsDataDir); } - public SourceToOutputMapping getSourceToOutputMap(String moduleName, boolean testSources) throws Exception { + public SourceToOutputMapping getSourceToOutputMap(String moduleName, boolean testSources) throws IOException { final Map storageMap = testSources? myTestSourceToOutputs : myProductionSourceToOutputs; SourceToOutputMapping mapping; synchronized (mySourceToOutputLock) { diff --git a/jps/jps-builders/src/org/jetbrains/jps/incremental/storage/ProjectTimestamps.java b/jps/jps-builders/src/org/jetbrains/jps/incremental/storage/ProjectTimestamps.java index f4c362460ac9..702992bcef16 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/incremental/storage/ProjectTimestamps.java +++ b/jps/jps-builders/src/org/jetbrains/jps/incremental/storage/ProjectTimestamps.java @@ -17,7 +17,7 @@ public class ProjectTimestamps { private final String myProjectName; private final TimestampStorage myTimestamps; - public ProjectTimestamps(String projectName) throws Exception { + public ProjectTimestamps(String projectName) throws IOException { myProjectName = projectName; myTimestamps = new TimestampStorage(new File(getTimestampsRoot(projectName), "data")); } diff --git a/jps/jps-builders/src/org/jetbrains/jps/incremental/storage/SourceToFormMapping.java b/jps/jps-builders/src/org/jetbrains/jps/incremental/storage/SourceToFormMapping.java index 4cefda66eff1..03381e5ae836 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/incremental/storage/SourceToFormMapping.java +++ b/jps/jps-builders/src/org/jetbrains/jps/incremental/storage/SourceToFormMapping.java @@ -4,6 +4,7 @@ import com.intellij.openapi.util.io.FileUtil; import com.intellij.util.io.EnumeratorStringDescriptor; import java.io.File; +import java.io.IOException; /** * @author Eugene Zhuravlev @@ -11,23 +12,23 @@ import java.io.File; */ public class SourceToFormMapping extends AbstractStateStorage{ - public SourceToFormMapping(File storePath) throws Exception { + public SourceToFormMapping(File storePath) throws IOException { super(storePath, new EnumeratorStringDescriptor(), new EnumeratorStringDescriptor()); } - public void update(String srcPath, String formPath) throws Exception { + public void update(String srcPath, String formPath) throws IOException { super.update(FileUtil.toSystemIndependentName(srcPath), FileUtil.toSystemIndependentName(formPath)); } - public final void appendData(String srcPath, String formPath) throws Exception { + public final void appendData(String srcPath, String formPath) throws IOException { update(srcPath, formPath); } - public void remove(String srcPath) throws Exception { + public void remove(String srcPath) throws IOException { super.remove(FileUtil.toSystemIndependentName(srcPath)); } - public String getState(String srcPath) throws Exception { + public String getState(String srcPath) throws IOException { return super.getState(FileUtil.toSystemIndependentName(srcPath)); } } diff --git a/jps/jps-builders/src/org/jetbrains/jps/incremental/storage/SourceToOutputMapping.java b/jps/jps-builders/src/org/jetbrains/jps/incremental/storage/SourceToOutputMapping.java index 7812fcf9fcad..af699e81ed42 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/incremental/storage/SourceToOutputMapping.java +++ b/jps/jps-builders/src/org/jetbrains/jps/incremental/storage/SourceToOutputMapping.java @@ -20,34 +20,34 @@ import java.util.List; */ public final class SourceToOutputMapping extends AbstractStateStorage> { - public SourceToOutputMapping(File storePath) throws Exception { + public SourceToOutputMapping(File storePath) throws IOException { super(storePath, new EnumeratorStringDescriptor(), new StringCollectionExternalizer()); } @Override - public void update(@NotNull String srcPath, @NotNull Collection outputs) throws Exception { + public void update(@NotNull String srcPath, @NotNull Collection outputs) throws IOException { super.update(FileUtil.toSystemIndependentName(srcPath), normalizePaths(outputs)); } - public void update(@NotNull String srcPath, @NotNull String outputPath) throws Exception { + public void update(@NotNull String srcPath, @NotNull String outputPath) throws IOException { super.update(FileUtil.toSystemIndependentName(srcPath), Collections.singleton(FileUtil.toSystemIndependentName(outputPath))); } - public void appendData(String srcPath, String outputPath) throws Exception { + public void appendData(String srcPath, String outputPath) throws IOException { super.appendData(FileUtil.toSystemIndependentName(srcPath), Collections.singleton(FileUtil.toSystemIndependentName(outputPath))); } - public void appendData(String srcPath, Collection data) throws Exception { + public void appendData(String srcPath, Collection data) throws IOException { super.appendData(FileUtil.toSystemIndependentName(srcPath), normalizePaths(data)); } @Override - public void remove(@NotNull String srcPath) throws Exception { + public void remove(@NotNull String srcPath) throws IOException { super.remove(FileUtil.toSystemIndependentName(srcPath)); } @Override - public Collection getState(@NotNull String srcPath) throws Exception { + public Collection getState(@NotNull String srcPath) throws IOException { return super.getState(FileUtil.toSystemIndependentName(srcPath)); } diff --git a/jps/jps-builders/src/org/jetbrains/jps/incremental/storage/TimestampStorage.java b/jps/jps-builders/src/org/jetbrains/jps/incremental/storage/TimestampStorage.java index c02947082364..5e8b8fa89afc 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/incremental/storage/TimestampStorage.java +++ b/jps/jps-builders/src/org/jetbrains/jps/incremental/storage/TimestampStorage.java @@ -15,20 +15,20 @@ import java.io.IOException; */ public class TimestampStorage extends AbstractStateStorage { - public TimestampStorage(File storePath) throws Exception { + public TimestampStorage(File storePath) throws IOException { super(storePath, new FileKeyDescriptor(), new StateExternalizer()); } - public long getStamp(File file) throws Exception { + public long getStamp(File file) throws IOException { final TimestampValidityState state = getState(file); return state != null? state.getTimestamp() : -1L; } - public void saveStamp(File file, long timestamp) throws Exception { + public void saveStamp(File file, long timestamp) throws IOException { update(file, new TimestampValidityState(timestamp)); } - public void markDirty(File file) throws Exception { + public void markDirty(File file) throws IOException { update(file, null); } From b54dd41ed05b337096665f701ca8d6d4eff5b379 Mon Sep 17 00:00:00 2001 From: anna Date: Mon, 6 Feb 2012 21:58:37 +0100 Subject: [PATCH 068/215] IDEA-78597 Refactoring introduce field introduce silly assignment --- .../introduceField/BaseExpressionToFieldHandler.java | 4 ++-- .../afterUnresolvedReferenceToLocalVar.java | 12 ++++++++++++ .../beforeUnresolvedReferenceToLocalVar.java | 10 ++++++++++ .../refactoring/IntroduceFieldInSameClassTest.java | 6 ++++++ 4 files changed, 30 insertions(+), 2 deletions(-) create mode 100644 java/java-tests/testData/refactoring/introduceField/afterUnresolvedReferenceToLocalVar.java create mode 100644 java/java-tests/testData/refactoring/introduceField/beforeUnresolvedReferenceToLocalVar.java diff --git a/java/java-impl/src/com/intellij/refactoring/introduceField/BaseExpressionToFieldHandler.java b/java/java-impl/src/com/intellij/refactoring/introduceField/BaseExpressionToFieldHandler.java index c628f9454cc5..56a465861857 100644 --- a/java/java-impl/src/com/intellij/refactoring/introduceField/BaseExpressionToFieldHandler.java +++ b/java/java-impl/src/com/intellij/refactoring/introduceField/BaseExpressionToFieldHandler.java @@ -689,11 +689,11 @@ public abstract class BaseExpressionToFieldHandler extends IntroduceHandlerBase InitializationPlace initializerPlace = mySettings.getInitializerPlace(); final PsiLocalVariable localVariable = mySettings.getLocalVariable(); final boolean deleteLocalVariable = mySettings.isDeleteLocalVariable(); - @Nullable PsiExpression initializer; + @Nullable PsiExpression initializer = null; if (localVariable != null) { initializer = localVariable.getInitializer(); } - else { + else if (!(mySelectedExpr instanceof PsiReferenceExpression && ((PsiReferenceExpression)mySelectedExpr).resolve() == null)){ initializer = mySelectedExpr; } diff --git a/java/java-tests/testData/refactoring/introduceField/afterUnresolvedReferenceToLocalVar.java b/java/java-tests/testData/refactoring/introduceField/afterUnresolvedReferenceToLocalVar.java new file mode 100644 index 000000000000..5dc141e72462 --- /dev/null +++ b/java/java-tests/testData/refactoring/introduceField/afterUnresolvedReferenceToLocalVar.java @@ -0,0 +1,12 @@ +import java.util.ArrayList; + +public class Test +{ + public final ArrayList arrayList; + + public Test() + { + arrayList = new ArrayList(); + } + +} diff --git a/java/java-tests/testData/refactoring/introduceField/beforeUnresolvedReferenceToLocalVar.java b/java/java-tests/testData/refactoring/introduceField/beforeUnresolvedReferenceToLocalVar.java new file mode 100644 index 000000000000..bd34a5d54bd2 --- /dev/null +++ b/java/java-tests/testData/refactoring/introduceField/beforeUnresolvedReferenceToLocalVar.java @@ -0,0 +1,10 @@ +import java.util.ArrayList; + +public class Test +{ + public Test() + { + arrayList = new ArrayList(); + } + +} diff --git a/java/java-tests/testSrc/com/intellij/refactoring/IntroduceFieldInSameClassTest.java b/java/java-tests/testSrc/com/intellij/refactoring/IntroduceFieldInSameClassTest.java index dd6e9734be1c..28a6c6ce2c83 100644 --- a/java/java-tests/testSrc/com/intellij/refactoring/IntroduceFieldInSameClassTest.java +++ b/java/java-tests/testSrc/com/intellij/refactoring/IntroduceFieldInSameClassTest.java @@ -71,6 +71,12 @@ public class IntroduceFieldInSameClassTest extends LightCodeInsightTestCase { } //------------------------------------------------------------------------------------------------- + public void testUnresolvedReferenceToLocalVar() throws Exception { + configureByFile("/refactoring/introduceField/beforeUnresolvedReferenceToLocalVar.java"); + performRefactoring(BaseExpressionToFieldHandler.InitializationPlace.IN_CURRENT_METHOD, false); + checkResultByFile("/refactoring/introduceField/afterUnresolvedReferenceToLocalVar.java"); + } + private static void performRefactoring(final BaseExpressionToFieldHandler.InitializationPlace initializationPlace, final boolean declareStatic) { new MockIntroduceFieldHandler(initializationPlace, declareStatic).invoke(getProject(), myEditor, myFile, null); } From f5e8164b351c45b1c183b16193abe0195f7be20a Mon Sep 17 00:00:00 2001 From: anna Date: Mon, 6 Feb 2012 22:06:59 +0100 Subject: [PATCH 069/215] redundant suppression false positives: do not trigger inspection on unfair inspections as well as on unused declaration (IDEA-79546) --- .../RedundantSuppressInspection.java | 27 +++++++++++++------ 1 file changed, 19 insertions(+), 8 deletions(-) diff --git a/java/java-impl/src/com/intellij/codeInspection/RedundantSuppressInspection.java b/java/java-impl/src/com/intellij/codeInspection/RedundantSuppressInspection.java index f2e52e81a203..6d2efd17fbb9 100644 --- a/java/java-impl/src/com/intellij/codeInspection/RedundantSuppressInspection.java +++ b/java/java-impl/src/com/intellij/codeInspection/RedundantSuppressInspection.java @@ -40,10 +40,7 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import javax.swing.*; -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; -import java.util.Map; +import java.util.*; /** * @author cdr @@ -162,11 +159,25 @@ public class RedundantSuppressInspection extends GlobalInspectionTool{ Collection suppressedTools = new THashSet(); InspectionTool[] tools = getInspectionTools(psiElement, manager); for (Collection ids : suppressedScopes.values()) { - for (String id : ids) { - String shortName = id.trim(); + for (Iterator iterator = ids.iterator(); iterator.hasNext(); ) { + final String shortName = iterator.next().trim(); for (InspectionTool tool : tools) { - if (tool instanceof LocalInspectionToolWrapper && ((LocalInspectionToolWrapper)tool).getTool().getID().equals(shortName) || tool.getShortName().equals(shortName)) { - suppressedTools.add(tool); + if (tool instanceof LocalInspectionToolWrapper && ((LocalInspectionToolWrapper)tool).getTool().getID().equals(shortName)) { + if (!((LocalInspectionToolWrapper)tool).isUnfair()) { + suppressedTools.add(tool); + } else { + iterator.remove(); + if (ids.isEmpty()) break; + } + } + else if (tool.getShortName().equals(shortName)) { + //ignore global unused as it won't be checked anyway + if (!(tool instanceof LocalInspectionToolWrapper) && !(tool instanceof GlobalInspectionToolWrapper)) { + iterator.remove(); + if (ids.isEmpty()) break; + } else { + suppressedTools.add(tool); + } } } } From 25f2995cb7e1bfcbf36e5c5ce14f4f755b4d76bb Mon Sep 17 00:00:00 2001 From: Sergey Evdokimov Date: Tue, 7 Feb 2012 12:52:46 +0400 Subject: [PATCH 070/215] Since 11.1 IDEA has idea66.vmoptions file. --- .../platform-impl/src/com/intellij/diagnostic/VMOptions.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platform/platform-impl/src/com/intellij/diagnostic/VMOptions.java b/platform/platform-impl/src/com/intellij/diagnostic/VMOptions.java index 21ffe2f297a1..03774ed51f10 100644 --- a/platform/platform-impl/src/com/intellij/diagnostic/VMOptions.java +++ b/platform/platform-impl/src/com/intellij/diagnostic/VMOptions.java @@ -226,7 +226,7 @@ public class VMOptions { } final String productName = ApplicationNamesInfo.getInstance().getProductName().toLowerCase(); - final String platformSuffix = (SystemInfo.is64Bit && !SystemInfo.isLinux) ? "64" : ""; + final String platformSuffix = SystemInfo.is64Bit ? "64" : ""; final String osSuffix = SystemInfo.isWindows ? ".exe" : ""; return PathManager.getBinPath() + File.separatorChar + productName + platformSuffix + osSuffix + ".vmoptions"; } From 8766496f26a0f6a1354e28ebbbcf1298e57b2246 Mon Sep 17 00:00:00 2001 From: irengrig Date: Mon, 6 Feb 2012 12:09:21 +0400 Subject: [PATCH 071/215] SVN 1.7: resolve conflict (as merged) - to work --- .../org/jetbrains/idea/svn17/actions/MarkResolvedAction.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/plugins/svn4idea/src/org/jetbrains/idea/svn17/actions/MarkResolvedAction.java b/plugins/svn4idea/src/org/jetbrains/idea/svn17/actions/MarkResolvedAction.java index a8fb65a03d36..14c7e6ccd36a 100644 --- a/plugins/svn4idea/src/org/jetbrains/idea/svn17/actions/MarkResolvedAction.java +++ b/plugins/svn4idea/src/org/jetbrains/idea/svn17/actions/MarkResolvedAction.java @@ -33,6 +33,7 @@ import org.jetbrains.idea.svn17.SvnBundle; import org.jetbrains.idea.svn17.SvnStatusUtil; import org.jetbrains.idea.svn17.SvnVcs17; import org.jetbrains.idea.svn17.dialogs.SelectFilesDialog; +import org.tmatesoft.svn.core.SVNDepth; import org.tmatesoft.svn.core.SVNException; import org.tmatesoft.svn.core.wc.*; @@ -90,7 +91,7 @@ public class MarkResolvedAction extends BasicAction { SVNWCClient wcClient = vcs.createWCClient(); for (String path : pathsArray) { File ioFile = new File(path); - wcClient.doResolve(ioFile, false); + wcClient.doResolve(ioFile, SVNDepth.EMPTY, SVNConflictChoice.MERGED); } } catch (SVNException e) { From 2d743657336c20294d0c16a4f0fc808a01c44031 Mon Sep 17 00:00:00 2001 From: irengrig Date: Mon, 6 Feb 2012 15:25:47 +0400 Subject: [PATCH 072/215] SVN: assertion in case there was no authentication and user tries to select revision to update to --- .../SvnRevisionsNavigationMediator.java | 47 +++++++++++++------ 1 file changed, 32 insertions(+), 15 deletions(-) diff --git a/plugins/svn4idea/src/org/jetbrains/idea/svn17/history/SvnRevisionsNavigationMediator.java b/plugins/svn4idea/src/org/jetbrains/idea/svn17/history/SvnRevisionsNavigationMediator.java index 677ef50f7cc8..8f3d687be18a 100644 --- a/plugins/svn4idea/src/org/jetbrains/idea/svn17/history/SvnRevisionsNavigationMediator.java +++ b/plugins/svn4idea/src/org/jetbrains/idea/svn17/history/SvnRevisionsNavigationMediator.java @@ -15,7 +15,10 @@ */ package org.jetbrains.idea.svn17.history; +import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.diagnostic.Logger; +import com.intellij.openapi.progress.ProcessCanceledException; +import com.intellij.openapi.progress.ProgressManager; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.Ref; import com.intellij.openapi.vcs.RepositoryLocation; @@ -53,21 +56,35 @@ public class SvnRevisionsNavigationMediator implements CommittedChangesNavigatio myChunks = new LinkedList>(); - SVNRepository repository = null; - final SVNURL repositoryRoot; - final long youngRevision; - try { - repository = vcs.createRepository(location.getURL()); - youngRevision = repository.getLatestRevision(); - repositoryRoot = repository.getRepositoryRoot(false); - } - catch (SVNException e) { - throw new VcsException(e); - } - finally { - if (repository != null) { - repository.closeSession(); + final SVNURL[] repositoryRoot = new SVNURL[1]; + final long[] youngRevision = new long[1]; + final SVNException[] exception = new SVNException[1]; + + final boolean succeeded = ProgressManager.getInstance().runProcessWithProgressSynchronously(new Runnable() { + @Override + public void run() { + SVNRepository repository = null; + try { + repository = vcs.createRepository(location.getURL()); + youngRevision[0] = repository.getLatestRevision(); + repositoryRoot[0] = repository.getRepositoryRoot(false); + } + catch (SVNException e) { + exception[0] = e; + } + finally { + if (repository != null) { + repository.closeSession(); + } + } } + }, "Getting latest repository revision", true, myProject); + + if (exception[0] != null) { + throw new VcsException(exception[0]); + } + if (! succeeded) { + throw new ProcessCanceledException(); } final Iterator visualIterator = project.isDefault() ? null : @@ -78,7 +95,7 @@ public class SvnRevisionsNavigationMediator implements CommittedChangesNavigatio myVisuallyCached = (visualIterator == null) ? null : new VisuallyCachedProvider(visualIterator, myProject, location); myChunkFactory = new BunchFactory(myInternallyCached, myVisuallyCached, - new LiveProvider(vcs, location, youngRevision, new SvnLogUtil(myProject, vcs, location, repositoryRoot))); + new LiveProvider(vcs, location, youngRevision[0], new SvnLogUtil(myProject, vcs, location, repositoryRoot[0]))); myCurrentIdx = -1; // init first screen From e3ffc95c822ea7deb5118212d8a228ae27a2c017 Mon Sep 17 00:00:00 2001 From: irengrig Date: Mon, 6 Feb 2012 18:32:20 +0400 Subject: [PATCH 073/215] SVN 1.7: wc-locked attribute --- .../idea/svn17/commandLine/SvnStatusHandler.java | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/plugins/svn4idea/src/org/jetbrains/idea/svn17/commandLine/SvnStatusHandler.java b/plugins/svn4idea/src/org/jetbrains/idea/svn17/commandLine/SvnStatusHandler.java index 3ff4c027b40c..65fe6819bae3 100644 --- a/plugins/svn4idea/src/org/jetbrains/idea/svn17/commandLine/SvnStatusHandler.java +++ b/plugins/svn4idea/src/org/jetbrains/idea/svn17/commandLine/SvnStatusHandler.java @@ -339,6 +339,12 @@ public class SvnStatusHandler extends DefaultHandler { super(new String[]{"commit"}, new String[]{}); } + /**/ + @Override protected void updateStatus(Attributes attributes, PortableStatus status) throws SAXException { final String props = attributes.getValue("props"); @@ -355,6 +361,10 @@ public class SvnStatusHandler extends DefaultHandler { } // optional + final String locked = attributes.getValue("wc-locked"); + if (locked != null && Boolean.parseBoolean(locked)) { + status.setIsLocked(true); + } final String copied = attributes.getValue("copied"); if (copied != null && Boolean.parseBoolean(copied)) { status.setIsCopied(true); From 32a8880610b96b9035e377c6eddbf5a587606e66 Mon Sep 17 00:00:00 2001 From: irengrig Date: Mon, 6 Feb 2012 19:00:51 +0400 Subject: [PATCH 074/215] SVN: possible NPE fix --- .../src/org/jetbrains/idea/svn17/RootsToWorkingCopies.java | 1 + 1 file changed, 1 insertion(+) diff --git a/plugins/svn4idea/src/org/jetbrains/idea/svn17/RootsToWorkingCopies.java b/plugins/svn4idea/src/org/jetbrains/idea/svn17/RootsToWorkingCopies.java index 6282ab342321..3a2ccdb3677d 100644 --- a/plugins/svn4idea/src/org/jetbrains/idea/svn17/RootsToWorkingCopies.java +++ b/plugins/svn4idea/src/org/jetbrains/idea/svn17/RootsToWorkingCopies.java @@ -73,6 +73,7 @@ public class RootsToWorkingCopies implements VcsListener { @CalledInBackground public WorkingCopy getMatchingCopy(final SVNURL url) { assert ! ApplicationManager.getApplication().isDispatchThread(); + if (url == null) return null; final VirtualFile[] roots = ProjectLevelVcsManager.getInstance(myProject).getRootsUnderVcs(SvnVcs17.getInstance(myProject)); synchronized (myLock) { From aa82cbdb36e663429ae99d4a44d7f07522326533 Mon Sep 17 00:00:00 2001 From: irengrig Date: Tue, 7 Feb 2012 13:04:54 +0400 Subject: [PATCH 075/215] SVN+SSH: fingerprints: avoid deadlock (asked from background threadlead thread, but we might have ex update options dialog box showing modal simultaneously + auth progress) --- .../SvnInteractiveAuthenticationProvider.java | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/plugins/svn4idea/src/org/jetbrains/idea/svn17/dialogs/SvnInteractiveAuthenticationProvider.java b/plugins/svn4idea/src/org/jetbrains/idea/svn17/dialogs/SvnInteractiveAuthenticationProvider.java index 7323a2ae2628..34cb4dff294c 100644 --- a/plugins/svn4idea/src/org/jetbrains/idea/svn17/dialogs/SvnInteractiveAuthenticationProvider.java +++ b/plugins/svn4idea/src/org/jetbrains/idea/svn17/dialogs/SvnInteractiveAuthenticationProvider.java @@ -17,6 +17,8 @@ package org.jetbrains.idea.svn17.dialogs; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.diagnostic.Logger; +import com.intellij.openapi.progress.ProgressIndicator; +import com.intellij.openapi.progress.ProgressManager; import com.intellij.openapi.project.Project; import com.intellij.openapi.ui.MessageType; import com.intellij.openapi.vcs.ui.VcsBalloonProblemNotifier; @@ -31,7 +33,9 @@ import org.tmatesoft.svn.core.SVNErrorMessage; import org.tmatesoft.svn.core.SVNURL; import org.tmatesoft.svn.core.auth.*; +import javax.swing.*; import java.io.File; +import java.lang.reflect.InvocationTargetException; import java.security.cert.X509Certificate; public class SvnInteractiveAuthenticationProvider implements ISVNAuthenticationProvider { @@ -200,7 +204,20 @@ public class SvnInteractiveAuthenticationProvider implements ISVNAuthenticationP MessageType.ERROR); return REJECTED; } - WaitForProgressToShow.runOrInvokeAndWaitAboveProgress(command); + final ProgressIndicator pi = ProgressManager.getInstance().getProgressIndicator(); + if (pi != null) { + WaitForProgressToShow.runOrInvokeAndWaitAboveProgress(command, pi.getModalityState()); + } else { + try { + SwingUtilities.invokeAndWait(command); + } + catch (InterruptedException e) { + // + } + catch (InvocationTargetException e) { + // + } + } return result[0]; } From dc1b51d7ce25547cd146e19c8d182e7fc31875b5 Mon Sep 17 00:00:00 2001 From: irengrig Date: Tue, 7 Feb 2012 13:06:03 +0400 Subject: [PATCH 076/215] SVN 1.7: command line client - to be used for update (not switch) + http protocol --- .../idea/svn17/ProxySvnAuthentication.java | 10 +- .../idea/svn17/SvnAuthenticationManager.java | 34 ++- .../idea/svn17/SvnAuthenticationNotifier.java | 11 +- .../idea/svn17/SvnConfiguration17.java | 14 + .../auth/SvnAuthenticationInteraction.java | 2 + .../svn17/auth/SvnAuthenticationListener.java | 3 + .../commandLine/CommandLineAuthenticator.java | 200 +++++++++++++ .../SvnCommandLineUpdateClient.java | 270 ++++++++++++++++++ .../UpdateOutputLineConverter.java | 199 +++++++++++++ .../dialogs/SvnAuthenticationProvider.java | 5 + .../svn17/portable/SvnSvnkitUpdateClient.java | 206 +++++++++++++ .../idea/svn17/portable/SvnUpdateClientI.java | 75 +++++ .../svn17/update/SvnUpdateEnvironment17.java | 47 +-- .../idea/svn17/SvnAuthenticationTest.java | 8 + 14 files changed, 1057 insertions(+), 27 deletions(-) create mode 100644 plugins/svn4idea/src/org/jetbrains/idea/svn17/commandLine/CommandLineAuthenticator.java create mode 100644 plugins/svn4idea/src/org/jetbrains/idea/svn17/commandLine/SvnCommandLineUpdateClient.java create mode 100644 plugins/svn4idea/src/org/jetbrains/idea/svn17/commandLine/UpdateOutputLineConverter.java create mode 100644 plugins/svn4idea/src/org/jetbrains/idea/svn17/portable/SvnSvnkitUpdateClient.java create mode 100644 plugins/svn4idea/src/org/jetbrains/idea/svn17/portable/SvnUpdateClientI.java diff --git a/plugins/svn4idea/src/org/jetbrains/idea/svn17/ProxySvnAuthentication.java b/plugins/svn4idea/src/org/jetbrains/idea/svn17/ProxySvnAuthentication.java index 74b0a9e3bf31..25d49e231fa4 100644 --- a/plugins/svn4idea/src/org/jetbrains/idea/svn17/ProxySvnAuthentication.java +++ b/plugins/svn4idea/src/org/jetbrains/idea/svn17/ProxySvnAuthentication.java @@ -26,9 +26,15 @@ public class ProxySvnAuthentication { private ProxySvnAuthentication() { } - public static SVNAuthentication proxy(final SVNAuthentication in, final boolean storeAuth) { - if (in.isStorageAllowed() == storeAuth || (! in.isStorageAllowed())) return in; + public static SVNAuthentication proxy(final SVNAuthentication in, final boolean storeAuth, boolean forceSaving) { + if (forceSaving && storeAuth) { + return putPassedValueAsSave(in, forceSaving); + } + if (in.isStorageAllowed() == storeAuth || ( ! in.isStorageAllowed())) return in; + return putPassedValueAsSave(in, storeAuth); + } + private static SVNAuthentication putPassedValueAsSave(SVNAuthentication in, boolean storeAuth) { final String userName = in.getUserName(); if (in instanceof SVNPasswordAuthentication) { return new SVNPasswordAuthentication(userName, ((SVNPasswordAuthentication)in).getPassword(), diff --git a/plugins/svn4idea/src/org/jetbrains/idea/svn17/SvnAuthenticationManager.java b/plugins/svn4idea/src/org/jetbrains/idea/svn17/SvnAuthenticationManager.java index f14dc7d2c1d0..71d7bd24a02d 100644 --- a/plugins/svn4idea/src/org/jetbrains/idea/svn17/SvnAuthenticationManager.java +++ b/plugins/svn4idea/src/org/jetbrains/idea/svn17/SvnAuthenticationManager.java @@ -18,6 +18,7 @@ package org.jetbrains.idea.svn17; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.application.ModalityState; import com.intellij.openapi.diagnostic.Logger; +import com.intellij.openapi.progress.ProcessCanceledException; import com.intellij.openapi.progress.ProgressIndicator; import com.intellij.openapi.progress.ProgressManager; import com.intellij.openapi.project.Project; @@ -67,6 +68,7 @@ public class SvnAuthenticationManager extends DefaultSVNAuthenticationManager im private IdeaSVNHostOptionsProvider myLocalHostOptionsProvider; private final ThreadLocalSavePermissions mySavePermissions; private final Map myKeyAlgorithm; + private boolean myArtificialSaving; public SvnAuthenticationManager(final Project project, final File configDirectory) { super(configDirectory, true, null, null); @@ -82,6 +84,10 @@ public class SvnAuthenticationManager extends DefaultSVNAuthenticationManager im myInteraction = new MySvnAuthenticationInteraction(myProject); } + public void setArtificialSaving(boolean artificialSaving) { + myArtificialSaving = artificialSaving; + } + private void ensureListenerCreated() { if (myListener == null) { myListener = EventDispatcher.create(SvnAuthenticationListener.class); @@ -115,6 +121,11 @@ public class SvnAuthenticationManager extends DefaultSVNAuthenticationManager im myListener.getMulticaster().saveAttemptFinished(type, url, realm, kind); } + @Override + public void acknowledge(boolean accepted, String kind, String realm, SVNErrorMessage message, SVNAuthentication authentication) { + myListener.getMulticaster().acknowledge(accepted, kind, realm, message, authentication); + } + @Override public void requested(ProviderType type, SVNURL url, String realm, String kind, boolean canceled) { if (ProviderType.interactive.equals(type) && (! canceled)) { @@ -137,12 +148,18 @@ public class SvnAuthenticationManager extends DefaultSVNAuthenticationManager im String realm, SVNErrorMessage errorMessage, SVNAuthentication authentication) throws SVNException { + boolean successSaving = false; + myListener.getMulticaster().acknowledge(accepted, kind, realm, errorMessage, authentication); try { final boolean authStorageEnabled = getHostOptionsProvider().getHostOptions(authentication.getURL()).isAuthStorageEnabled(); - final SVNAuthentication proxy = ProxySvnAuthentication.proxy(authentication, authStorageEnabled); + final SVNAuthentication proxy = ProxySvnAuthentication.proxy(authentication, authStorageEnabled, myArtificialSaving); super.acknowledgeAuthentication(accepted, kind, realm, errorMessage, proxy); + successSaving = true; } finally { mySavePermissions.remove(); + if (myArtificialSaving) { + throw new CredentialsSavedException(successSaving); + } } } @@ -229,11 +246,10 @@ public class SvnAuthenticationManager extends DefaultSVNAuthenticationManager im public void saveAuthentication(final SVNAuthentication auth, final String kind, final String realm) throws SVNException { final Boolean fromInteractive = ourJustEntered.get(); ourJustEntered.set(null); - if (! Boolean.TRUE.equals(fromInteractive)) { + if (! myArtificialSaving && ! Boolean.TRUE.equals(fromInteractive)) { // not what user entered return; } - myListener.getMulticaster().saveAttemptStarted(ProviderType.persistent, auth.getURL(), realm, auth.getKind()); ((ISVNPersistentAuthenticationProvider) myDelegate).saveAuthentication(auth, kind, realm); myListener.getMulticaster().saveAttemptFinished(ProviderType.persistent, auth.getURL(), realm, auth.getKind()); @@ -822,4 +838,16 @@ public class SvnAuthenticationManager extends DefaultSVNAuthenticationManager im return s[0]; } } + + public static class CredentialsSavedException extends RuntimeException { + private final boolean mySuccess; + + public CredentialsSavedException(boolean success) { + mySuccess = success; + } + + public boolean isSuccess() { + return mySuccess; + } + } } diff --git a/plugins/svn4idea/src/org/jetbrains/idea/svn17/SvnAuthenticationNotifier.java b/plugins/svn4idea/src/org/jetbrains/idea/svn17/SvnAuthenticationNotifier.java index a494e24a237b..ffc2d4002b47 100644 --- a/plugins/svn4idea/src/org/jetbrains/idea/svn17/SvnAuthenticationNotifier.java +++ b/plugins/svn4idea/src/org/jetbrains/idea/svn17/SvnAuthenticationNotifier.java @@ -178,7 +178,7 @@ public class SvnAuthenticationNotifier extends GenericNotifierImpl { return myOptions; } + public static SvnAuthenticationManager createForTmpDir(final Project project, final File dir) { + final SvnVcs17 vcs = SvnVcs17.getInstance(project); + //final SvnAuthenticationManager manager = new SvnAuthenticationManager(project, dir); + + final SvnAuthenticationManager interactive = new SvnAuthenticationManager(project, dir); + interactive.setRuntimeStorage(RUNTIME_AUTH_CACHE); + final SvnInteractiveAuthenticationProvider interactiveProvider = new SvnInteractiveAuthenticationProvider(vcs, interactive); + interactive.setAuthenticationProvider(interactiveProvider); + + //manager.setAuthenticationProvider(new SvnAuthenticationProvider(vcs, interactiveProvider, RUNTIME_AUTH_CACHE)); + //manager.setRuntimeStorage(RUNTIME_AUTH_CACHE); + return interactive; + } + public SvnAuthenticationManager getAuthenticationManager(final SvnVcs17 svnVcs) { if (myAuthManager == null) { // reloaded when configuration directory changes diff --git a/plugins/svn4idea/src/org/jetbrains/idea/svn17/auth/SvnAuthenticationInteraction.java b/plugins/svn4idea/src/org/jetbrains/idea/svn17/auth/SvnAuthenticationInteraction.java index 568a72ff41d9..2d43bddd06a8 100644 --- a/plugins/svn4idea/src/org/jetbrains/idea/svn17/auth/SvnAuthenticationInteraction.java +++ b/plugins/svn4idea/src/org/jetbrains/idea/svn17/auth/SvnAuthenticationInteraction.java @@ -15,7 +15,9 @@ */ package org.jetbrains.idea.svn17.auth; +import org.tmatesoft.svn.core.SVNErrorMessage; import org.tmatesoft.svn.core.SVNURL; +import org.tmatesoft.svn.core.auth.SVNAuthentication; import java.io.File; diff --git a/plugins/svn4idea/src/org/jetbrains/idea/svn17/auth/SvnAuthenticationListener.java b/plugins/svn4idea/src/org/jetbrains/idea/svn17/auth/SvnAuthenticationListener.java index dc556ec452e1..7f3558494b91 100644 --- a/plugins/svn4idea/src/org/jetbrains/idea/svn17/auth/SvnAuthenticationListener.java +++ b/plugins/svn4idea/src/org/jetbrains/idea/svn17/auth/SvnAuthenticationListener.java @@ -15,7 +15,9 @@ */ package org.jetbrains.idea.svn17.auth; +import org.tmatesoft.svn.core.SVNErrorMessage; import org.tmatesoft.svn.core.SVNURL; +import org.tmatesoft.svn.core.auth.SVNAuthentication; import java.util.EventListener; @@ -24,4 +26,5 @@ public interface SvnAuthenticationListener extends EventListener { void actualSaveWillBeTried(final ProviderType type, final SVNURL url, String realm, String kind); void saveAttemptStarted(final ProviderType type, final SVNURL url, String realm, String kind); void saveAttemptFinished(final ProviderType type, final SVNURL url, String realm, String kind); + void acknowledge(boolean accepted, String kind, String realm, SVNErrorMessage message, SVNAuthentication authentication); } diff --git a/plugins/svn4idea/src/org/jetbrains/idea/svn17/commandLine/CommandLineAuthenticator.java b/plugins/svn4idea/src/org/jetbrains/idea/svn17/commandLine/CommandLineAuthenticator.java new file mode 100644 index 000000000000..1cffdfb64c79 --- /dev/null +++ b/plugins/svn4idea/src/org/jetbrains/idea/svn17/commandLine/CommandLineAuthenticator.java @@ -0,0 +1,200 @@ +/* + * Copyright 2000-2012 JetBrains s.r.o. + * + * 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. + */ +package org.jetbrains.idea.svn17.commandLine; + +import com.intellij.openapi.diagnostic.Logger; +import com.intellij.openapi.project.Project; +import com.intellij.openapi.ui.MessageType; +import com.intellij.openapi.util.Trinity; +import com.intellij.openapi.util.io.FileUtil; +import com.intellij.openapi.vcs.ui.VcsBalloonProblemNotifier; +import org.jetbrains.idea.svn17.SvnAuthenticationManager; +import org.jetbrains.idea.svn17.SvnConfiguration17; +import org.jetbrains.idea.svn17.SvnVcs17; +import org.jetbrains.idea.svn17.auth.ProviderType; +import org.jetbrains.idea.svn17.auth.SvnAuthenticationListener; +import org.tmatesoft.svn.core.SVNErrorCode; +import org.tmatesoft.svn.core.SVNErrorMessage; +import org.tmatesoft.svn.core.SVNException; +import org.tmatesoft.svn.core.SVNURL; +import org.tmatesoft.svn.core.auth.SVNAuthentication; +import org.tmatesoft.svn.core.wc.SVNRevision; +import org.tmatesoft.svn.core.wc.SVNWCClient; + +import java.io.File; +import java.io.IOException; +import java.util.HashSet; +import java.util.Set; + +/** + * Created with IntelliJ IDEA. + * User: Irina.Chernushina + * Date: 2/1/12 + * Time: 12:28 PM + */ +public class CommandLineAuthenticator { + private static final Logger LOG = Logger.getInstance("#org.jetbrains.idea.svn17.commandLine.CommandLineAuthenticator"); + private final Project myProject; + private final AuthenticationRequiringCommand myCommand; + private final SvnConfiguration17 myConfiguration17; + private final File myConfigDir; + + public CommandLineAuthenticator(Project project, AuthenticationRequiringCommand command) { + myProject = project; + myCommand = command; + myConfiguration17 = SvnConfiguration17.getInstance(project); + final String configurationDirectory = myConfiguration17.getConfigurationDirectory(); + myConfigDir = new File(configurationDirectory); + } + + public void doWithAuthentication() throws SVNException { + try { + myCommand.run(myConfigDir); + return; + } catch (SVNException e) { + if (! e.getErrorMessage().getErrorCode().isAuthentication()) throw e; + } + File tempDirectory = null; + try { + tempDirectory = FileUtil.createTempDirectory("tmp", "Subversion"); + final SvnAuthenticationManager authenticationManager = SvnConfiguration17.createForTmpDir(myProject, tempDirectory); + //authenticationManager.setAuthenticationForced(true); + authenticationManager.setArtificialSaving(true); + myCommand.cleanup(); + tryGetCredentials(authenticationManager, tempDirectory); + + myCommand.cleanup(); + myCommand.run(tempDirectory); + } + catch (IOException e) { + throw new SVNException(SVNErrorMessage.create(SVNErrorCode.IO_ERROR), e); + } finally { + if (tempDirectory != null) { + FileUtil.delete(tempDirectory); + } + } + } + + private void tryGetCredentials(SvnAuthenticationManager manager, final File tempDirectory) throws SVNException { + final StoreListener storeListener = new StoreListener(); + manager.addListener(storeListener); + final SVNURL svnurl = myCommand.sampleUrl(); + try { + myCommand.runWithSvnkitClient(tempDirectory, manager); + LOG.assertTrue(false, "Credentials not asked"); // todo? + } catch (SvnAuthenticationManager.CredentialsSavedException e) { + // ok, check result? + if (e.isSuccess()) { + final SvnAuthenticationManager realManager = myConfiguration17.getAuthenticationManager(SvnVcs17.getInstance(myProject)); + storeListener.reStore(myProject, realManager, svnurl); + } + } + //final SVNWCClient client = new SVNWCClient(manager, myConfiguration17.getOptions(myProject)); + //client.doInfo(svnurl, SVNRevision.UNDEFINED, SVNRevision.UNDEFINED); + } + + public interface AuthenticationRequiringCommand { + void run(final File configDir) throws SVNException; + void runWithSvnkitClient(final File configDir, SvnAuthenticationManager manager) throws SVNException; + SVNURL sampleUrl(); + void cleanup() throws SVNException; + } + + private static class StoreListener implements SvnAuthenticationListener { + private final Set myData; + private final Set> myAuthRequested; + + private StoreListener() { + myData = new HashSet(); + myAuthRequested = new HashSet>(); + } + + @Override + public void requested(ProviderType type, SVNURL url, String realm, String kind, boolean canceled) { + if (ProviderType.interactive.equals(type)) { + myAuthRequested.add(create(kind, realm, url)); + } + } + + private Trinity create(String kind, String realm, SVNURL url) { + return new Trinity(kind, realm, url); + } + + @Override + public void actualSaveWillBeTried(ProviderType type, SVNURL url, String realm, String kind) { + } + @Override + public void saveAttemptStarted(ProviderType type, SVNURL url, String realm, String kind) { + } + @Override + public void saveAttemptFinished(ProviderType type, SVNURL url, String realm, String kind) { + } + @Override + public void acknowledge(boolean accepted, String kind, String realm, SVNErrorMessage message, SVNAuthentication authentication) { + if (accepted && authentication.isStorageAllowed()) { + final Trinity trinity = create(kind, realm, authentication.getURL()); + if (myAuthRequested.contains(trinity)) { + myData.add(new StoreData(kind, realm, authentication)); + } + } + } + + public void reStore(final Project project, final SvnAuthenticationManager realManager, final SVNURL svnurl) { + for (StoreData data : myData) { + if (data.myAuthentication == null) continue; + realManager.requested(ProviderType.interactive, svnurl, data.myRealm, data.myKind, false); + try { + realManager.acknowledgeAuthentication(true, data.myKind, data.myRealm, null, data.myAuthentication); + } + catch (SVNException e) { + VcsBalloonProblemNotifier.showOverChangesView(project, "Wasn't able to store credentials: " + e.getMessage(), MessageType.ERROR); + } + } + } + } + + private static class StoreData { + public String myKind; + public String myRealm; + public SVNAuthentication myAuthentication; + + private StoreData(String kind, String realm, SVNAuthentication authentication) { + myKind = kind; + myRealm = realm; + myAuthentication = authentication; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + StoreData data = (StoreData)o; + + if (myKind != null ? !myKind.equals(data.myKind) : data.myKind != null) return false; + if (myRealm != null ? !myRealm.equals(data.myRealm) : data.myRealm != null) return false; + + return true; + } + + @Override + public int hashCode() { + int result = myKind != null ? myKind.hashCode() : 0; + result = 31 * result + (myRealm != null ? myRealm.hashCode() : 0); + return result; + } + } +} diff --git a/plugins/svn4idea/src/org/jetbrains/idea/svn17/commandLine/SvnCommandLineUpdateClient.java b/plugins/svn4idea/src/org/jetbrains/idea/svn17/commandLine/SvnCommandLineUpdateClient.java new file mode 100644 index 000000000000..87f54e9b53eb --- /dev/null +++ b/plugins/svn4idea/src/org/jetbrains/idea/svn17/commandLine/SvnCommandLineUpdateClient.java @@ -0,0 +1,270 @@ +/* + * Copyright 2000-2012 JetBrains s.r.o. + * + * 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. + */ +package org.jetbrains.idea.svn17.commandLine; + +import com.intellij.execution.process.ProcessOutputTypes; +import com.intellij.openapi.project.Project; +import com.intellij.openapi.util.Key; +import com.intellij.openapi.vcs.LineProcessEventListener; +import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.util.concurrency.Semaphore; +import org.jetbrains.idea.svn17.SvnAuthenticationManager; +import org.jetbrains.idea.svn17.SvnConfiguration17; +import org.jetbrains.idea.svn17.SvnVcs17; +import org.jetbrains.idea.svn17.portable.SvnExceptionWrapper; +import org.jetbrains.idea.svn17.portable.SvnSvnkitUpdateClient; +import org.tmatesoft.svn.core.*; +import org.tmatesoft.svn.core.wc.*; + +import java.io.File; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * Created with IntelliJ IDEA. + * User: Irina.Chernushina + * Date: 2/1/12 + * Time: 12:13 PM + */ +public class SvnCommandLineUpdateClient extends SvnSvnkitUpdateClient { + private static final Pattern ourExceptionPattern = Pattern.compile("svn: E(\\d{6}): .+"); + private static final String ourAuthenticationRealm = "Authentication realm:"; + private final Project myProject; + private final VirtualFile myCommonAncestor; + + public SvnCommandLineUpdateClient(final Project project, VirtualFile commonAncestor) { + super(SvnVcs17.getInstance(project).createUpdateClient()); + myProject = project; + myCommonAncestor = commonAncestor; + } + + @Override + public long doUpdate(File file, SVNRevision revision, boolean recursive) throws SVNException { + final long[] longs = doUpdate(new File[]{file}, revision, SVNDepth.fromRecurse(recursive), false, false, false); + return longs[0]; + } + + @Override + public long doUpdate(File file, SVNRevision revision, boolean recursive, boolean force) throws SVNException { + final long[] longs = doUpdate(new File[]{file}, revision, SVNDepth.fromRecurse(recursive), force, false, false); + return longs[0]; + } + + @Override + public long[] doUpdate(File[] paths, SVNRevision revision, SVNDepth depth, boolean allowUnversionedObstructions, boolean depthIsSticky) + throws SVNException { + return doUpdate(paths, revision, depth, allowUnversionedObstructions, depthIsSticky, false); + } + + @Override + public long[] doUpdate(final File[] paths, final SVNRevision revision, final SVNDepth depth, final boolean allowUnversionedObstructions, + final boolean depthIsSticky, final boolean makeParents) throws SVNException { + // since one revision is passed -> I assume same repository here + final SvnCommandLineInfoClient infoClient = new SvnCommandLineInfoClient(myProject); + final SVNInfo info = infoClient.doInfo(paths[0], SVNRevision.UNDEFINED); + if (info == null || info.getURL() == null) { + throw new SVNException(SVNErrorMessage.create(SVNErrorCode.WC_NOT_WORKING_COPY, paths[0].getPath())); + } + final long[] result = new long[paths.length]; + + new CommandLineAuthenticator(myProject, new CommandLineAuthenticator.AuthenticationRequiringCommand() { + @Override + public void run(File configDir) throws SVNException { + final File base = myCommonAncestor == null ? paths[0] : new File(myCommonAncestor.getPath()); + final SvnLineCommand command = new SvnLineCommand(myProject, base, SvnCommandName.up); + if (revision != null && ! SVNRevision.UNDEFINED.equals(revision) && ! SVNRevision.WORKING.equals(revision)) { + command.addParameters("-r", revision.toString()); + } + // unknown depth is not used any more for 1.7 -> why? + if (depth != null && ! SVNDepth.UNKNOWN.equals(depth)) { + command.addParameters("--depth", depth.toString()); + } + if (allowUnversionedObstructions) { + command.addParameters("--force"); + } + if (depthIsSticky && depth != null) {// !!! not sure, but not used + command.addParameters("--set-depth", depth.toString()); + } + if (makeParents) { + command.addParameters("--parents"); + } + command.addParameters("--accept", "postpone"); + command.addParameters("--config-dir", configDir.getPath()); + + for (File path : paths) { + command.addParameters(path.getPath()); + } + + final StringBuffer sbError = new StringBuffer(); + final Semaphore semaphore = new Semaphore(); + semaphore.down(); + final ISVNEventHandler handler = getEventHandler(); + final UpdateOutputLineConverter converter = new UpdateOutputLineConverter(base); + final SVNException[] innerException = new SVNException[1]; + command.addListener(new LineProcessEventListener() { + @Override + public void onLineAvailable(String line, Key outputType) { + if (ProcessOutputTypes.STDOUT.equals(outputType)) { + final SVNEvent event = converter.convert(line); + if (event != null) { + checkForUpdateCompleted(event); + try { + handler.handleEvent(event, 0.5); + } + catch (SVNException e) { + command.cancel(); + semaphore.up(); + innerException[0] = e; + } + } + } else if (ProcessOutputTypes.STDERR.equals(outputType)) { + sbError.append(line); + if (line.contains(ourAuthenticationRealm)) { + command.cancel(); + semaphore.up(); + } + } + } + + @Override + public void processTerminated(int exitCode) { + semaphore.up(); + } + + @Override + public void startFailed(Throwable exception) { + semaphore.up(); + } + }); + try { + command.start(); + semaphore.waitFor(); + + checkForException(sbError); + } catch (SvnExceptionWrapper e){ + throw (SVNException) e.getCause(); + } + } + + @Override + public void runWithSvnkitClient(File configDir, SvnAuthenticationManager manager) throws SVNException { + final SVNUpdateClient client = new SVNUpdateClient(manager, SvnConfiguration17.getInstance(myProject).getOptions(myProject)); + client.doUpdate(paths, revision, depth, allowUnversionedObstructions, depthIsSticky, makeParents); + } + + private void checkForUpdateCompleted(SVNEvent event) { + if (SVNEventAction.UPDATE_COMPLETED.equals(event.getAction())) { + final long eventRevision = event.getRevision(); + for (int i = 0; i < paths.length; i++) { + final File path = paths[i]; + if (path.equals(event.getFile())) { + result[i] = eventRevision; + break; + } + } + } + } + + @Override + public SVNURL sampleUrl() { + return info.getURL(); + } + + @Override + public void cleanup() throws SVNException { + final SvnVcs17 vcs17 = SvnVcs17.getInstance(myProject); + final SVNWCClient client = vcs17.createWCClient(); + for (File path : paths) { + client.doCleanup(path); + } + } + }).doWithAuthentication(); + return result; + } + + private void checkForException(final StringBuffer sbError) throws SVNException { + if (sbError.length() == 0) return; + final String message = sbError.toString(); + final Matcher matcher = ourExceptionPattern.matcher(message); + if (matcher.matches()) { + final String group = matcher.group(1); + if (group != null) { + try { + final int code = Integer.parseInt(group); + throw new SVNException(SVNErrorMessage.create(SVNErrorCode.getErrorCode(code), message)); + } catch (NumberFormatException e) { + // + } + } + } + if (message.contains(ourAuthenticationRealm)) { + throw new SVNException(SVNErrorMessage.create(SVNErrorCode.AUTHN_CREDS_UNAVAILABLE, message)); + } + throw new SVNException(SVNErrorMessage.create(SVNErrorCode.UNKNOWN, message)); + } + + @Override + public long doUpdate(File path, SVNRevision revision, SVNDepth depth, boolean allowUnversionedObstructions, boolean depthIsSticky) + throws SVNException { + final long[] longs = doUpdate(new File[]{path}, revision, depth, allowUnversionedObstructions, depthIsSticky, false); + return longs[0]; + } + + @Override + public long doSwitch(File file, SVNURL url, SVNRevision revision, boolean recursive) throws SVNException { + throw new UnsupportedOperationException(); + //return super.doSwitch(file, url, revision, recursive); + } + + @Override + public long doSwitch(File file, SVNURL url, SVNRevision pegRevision, SVNRevision revision, boolean recursive) throws SVNException { + throw new UnsupportedOperationException(); + //return super.doSwitch(file, url, pegRevision, revision, recursive); + } + + @Override + public long doSwitch(File file, SVNURL url, SVNRevision pegRevision, SVNRevision revision, boolean recursive, boolean force) + throws SVNException { + throw new UnsupportedOperationException(); + //return super.doSwitch(file, url, pegRevision, revision, recursive, force); + } + + @Override + public long doSwitch(File path, + SVNURL url, + SVNRevision pegRevision, + SVNRevision revision, + SVNDepth depth, + boolean allowUnversionedObstructions, + boolean depthIsSticky) throws SVNException { + throw new UnsupportedOperationException(); + //return super.doSwitch(path, url, pegRevision, revision, depth, allowUnversionedObstructions, depthIsSticky); + } + + @Override + public long doSwitch(File path, + SVNURL url, + SVNRevision pegRevision, + SVNRevision revision, + SVNDepth depth, + boolean allowUnversionedObstructions, + boolean depthIsSticky, + boolean ignoreAncestry) throws SVNException { + throw new UnsupportedOperationException(); + // todo MAIN + //return super.doSwitch(path, url, pegRevision, revision, depth, allowUnversionedObstructions, depthIsSticky, ignoreAncestry); + } +} diff --git a/plugins/svn4idea/src/org/jetbrains/idea/svn17/commandLine/UpdateOutputLineConverter.java b/plugins/svn4idea/src/org/jetbrains/idea/svn17/commandLine/UpdateOutputLineConverter.java new file mode 100644 index 000000000000..80c50ea9c7dc --- /dev/null +++ b/plugins/svn4idea/src/org/jetbrains/idea/svn17/commandLine/UpdateOutputLineConverter.java @@ -0,0 +1,199 @@ +/* + * Copyright 2000-2012 JetBrains s.r.o. + * + * 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. + */ +package org.jetbrains.idea.svn17.commandLine; + +import com.intellij.openapi.util.text.StringUtil; +import org.jetbrains.annotations.Nullable; +import org.tmatesoft.svn.core.SVNErrorCode; +import org.tmatesoft.svn.core.SVNErrorMessage; +import org.tmatesoft.svn.core.SVNNodeKind; +import org.tmatesoft.svn.core.wc.SVNEvent; +import org.tmatesoft.svn.core.wc.SVNEventAction; +import org.tmatesoft.svn.core.wc.SVNStatusType; + +import java.io.File; +import java.util.*; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * Created with IntelliJ IDEA. + * User: Irina.Chernushina + * Date: 2/1/12 + * Time: 5:13 PM + */ +public class UpdateOutputLineConverter { + private final static String UPDATING = "Updating"; + private final static String AT_REVISION = "At revision (\\d+)\\."; + private final static String UPDATED_TO_REVISION = "Updated to revision (\\d+)\\."; + private final static String SKIPPED = "Skipped"; + private final static String RESTORED = "Restored"; + + private final static String FETCHING_EXTERNAL = "Fetching external"; + private final static String EXTERNAL = "External at (\\d+)\\."; + private final static String UPDATED_EXTERNAL = "Updated external to revision (\\d+)\\."; + + private final static Pattern ourAtRevision = Pattern.compile(AT_REVISION); + private final static Pattern ourUpdatedToRevision = Pattern.compile(UPDATED_TO_REVISION); + + private final static Pattern ourExternal = Pattern.compile(EXTERNAL); + private final static Pattern ourUpdatedExternal = Pattern.compile(UPDATED_EXTERNAL); + + private final static Pattern[] ourCompletePatterns = new Pattern[] {ourAtRevision, ourUpdatedToRevision, ourExternal, ourUpdatedExternal}; + + private final File myBase; + private File myCurrentFile; + + public UpdateOutputLineConverter(File base) { + myBase = base; + } + + public SVNEvent convert(final String line) { + if (StringUtil.isEmptyOrSpaces(line)) return null; + + if (line.startsWith(UPDATING)) { + myCurrentFile = parseForPath(line); + return new SVNEvent(myCurrentFile, myCurrentFile == null ? null : (myCurrentFile.isDirectory() ? SVNNodeKind.DIR : SVNNodeKind.FILE), + null, -1, null, null, null, null, SVNEventAction.UPDATE_NONE, SVNEventAction.UPDATE_NONE, null, null, null, null, null); + } else if (line.startsWith(RESTORED)) { + myCurrentFile = parseForPath(line); + return new SVNEvent(myCurrentFile, myCurrentFile == null ? null : (myCurrentFile.isDirectory() ? SVNNodeKind.DIR : SVNNodeKind.FILE), + null, -1, null, null, null, null, SVNEventAction.RESTORE, SVNEventAction.RESTORE, null, null, null, null, null); + } else if (line.startsWith(SKIPPED)) { + myCurrentFile = parseForPath(line); + final String comment = parseComment(line); + return new SVNEvent(myCurrentFile, myCurrentFile == null ? null : (myCurrentFile.isDirectory() ? SVNNodeKind.DIR : SVNNodeKind.FILE), + null, -1, null, null, null, null, SVNEventAction.SKIP, SVNEventAction.SKIP, + comment == null ? null : SVNErrorMessage.create(SVNErrorCode.WC_OBSTRUCTED_UPDATE, comment), null, null, null, null); + } else if (line.startsWith(FETCHING_EXTERNAL)) { + myCurrentFile = parseForPath(line); + return new SVNEvent(myCurrentFile, myCurrentFile == null ? null : (myCurrentFile.isDirectory() ? SVNNodeKind.DIR : SVNNodeKind.FILE), + null, -1, null, null, null, null, SVNEventAction.UPDATE_EXTERNAL, SVNEventAction.UPDATE_EXTERNAL, null, null, null, null, null); + } + + for (int i = 0; i < ourCompletePatterns.length; i++) { + final Pattern pattern = ourCompletePatterns[i]; + final long revision = matchAndGetRevision(pattern, line); + if (revision != -1) { + return new SVNEvent(myCurrentFile, myCurrentFile == null ? null : (myCurrentFile.isDirectory() ? SVNNodeKind.DIR : SVNNodeKind.FILE), + null, revision, null, null, null, null, SVNEventAction.UPDATE_COMPLETED, SVNEventAction.UPDATE_COMPLETED, null, null, null, null, null); + } + } + + return parseNormalString(line); + } + + private final static Set ourActions = new HashSet(Arrays.asList(new Character[] {'A', 'D', 'U', 'C', 'G', 'E', 'R'})); + + @Nullable + private SVNEvent parseNormalString(final String line) { + if (line.length() < 5) return null; + final char first = line.charAt(0); + if (' ' != first && ! ourActions.contains(first)) return null; + final SVNStatusType contentsStatus = getStatusType(first); + final char second = line.charAt(1); + final SVNStatusType propertiesStatus = getStatusType(second); + final char lock = line.charAt(2); // dont know what to do with stolen lock info + if (' ' != lock && 'B' != lock) return null; + final char treeConflict = line.charAt(3); + if (' ' != treeConflict && 'C' != treeConflict) return null; + final boolean haveTreeConflict = 'C' == treeConflict; + + final String path = line.substring(4).trim(); + if (StringUtil.isEmptyOrSpaces(path)) return null; + final File file = new File(myBase, path); + if (SVNStatusType.STATUS_OBSTRUCTED.equals(contentsStatus)) { + // obstructed + return new SVNEvent(file, file.isDirectory() ? SVNNodeKind.DIR : SVNNodeKind.FILE, + null, -1, contentsStatus, propertiesStatus, null, null, SVNEventAction.UPDATE_SKIP_OBSTRUCTION, SVNEventAction.UPDATE_ADD, + null, null, null, null, null); + } + + SVNEventAction action; + SVNEventAction expectedAction; + if (SVNStatusType.STATUS_ADDED.equals(contentsStatus)) { + expectedAction = SVNEventAction.UPDATE_ADD; + } else if (SVNStatusType.STATUS_DELETED.equals(contentsStatus)) { + expectedAction = SVNEventAction.UPDATE_DELETE; + } else { + expectedAction = SVNEventAction.UPDATE_UPDATE; + } + action = expectedAction; + if (haveTreeConflict) { + action = SVNEventAction.TREE_CONFLICT; + } + + return new SVNEvent(file, file.isDirectory() ? SVNNodeKind.DIR : SVNNodeKind.FILE, null, -1, contentsStatus, propertiesStatus, null, + null, action, expectedAction, null, null, null, null, null); + } + + private SVNStatusType getStatusType(char first) { + final SVNStatusType contentsStatus; + if ('A' == first) { + contentsStatus = SVNStatusType.STATUS_ADDED; + } else if ('D' == first) { + contentsStatus = SVNStatusType.STATUS_DELETED; + } else if ('U' == first) { + contentsStatus = SVNStatusType.CHANGED; + } else if ('C' == first) { + contentsStatus = SVNStatusType.CONFLICTED; + } else if ('G' == first) { + contentsStatus = SVNStatusType.MERGED; + } else if ('R' == first) { + contentsStatus = SVNStatusType.STATUS_REPLACED; + } else if ('E' == first) { + contentsStatus = SVNStatusType.STATUS_OBSTRUCTED; + } else { + contentsStatus = SVNStatusType.STATUS_NORMAL; + } + return contentsStatus; + } + + @Nullable + private long matchAndGetRevision(final Pattern pattern, final String line) { + final Matcher matcher = pattern.matcher(line); + if (matcher.matches()) { + final String group = matcher.group(1); + if (group == null) return -1; + try { + return Long.parseLong(group); + } catch (NumberFormatException e) { + // + } + } + return -1; + } + + @Nullable + private String parseComment(final String line) { + final int idx = line.lastIndexOf("--"); + if (idx != -1 && idx < (line.length() - 2)) { + return line.substring(idx + 2).trim(); + } + return null; + } + + @Nullable + private File parseForPath(final String line) { + final int idx1 = line.indexOf('\''); + if (idx1 == -1) return null; + final int idx2 = line.indexOf('\'', idx1 + 1); + if (idx2 == -1) return null; + final String substring = line.substring(idx1 + 1, idx2); + if (".".equals(substring)) return myBase; + return new File(myBase, substring); + } +} diff --git a/plugins/svn4idea/src/org/jetbrains/idea/svn17/dialogs/SvnAuthenticationProvider.java b/plugins/svn4idea/src/org/jetbrains/idea/svn17/dialogs/SvnAuthenticationProvider.java index 44a35487ccee..93a5383534d6 100644 --- a/plugins/svn4idea/src/org/jetbrains/idea/svn17/dialogs/SvnAuthenticationProvider.java +++ b/plugins/svn4idea/src/org/jetbrains/idea/svn17/dialogs/SvnAuthenticationProvider.java @@ -17,11 +17,14 @@ package org.jetbrains.idea.svn17.dialogs; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.diagnostic.Logger; +import com.intellij.openapi.progress.ProgressManager; import com.intellij.openapi.project.Project; import com.intellij.util.SystemProperties; import org.jetbrains.idea.svn17.SvnAuthenticationNotifier; +import org.jetbrains.idea.svn17.SvnConfiguration17; import org.jetbrains.idea.svn17.SvnVcs17; import org.tmatesoft.svn.core.SVNErrorMessage; +import org.tmatesoft.svn.core.SVNException; import org.tmatesoft.svn.core.SVNURL; import org.tmatesoft.svn.core.auth.ISVNAuthenticationManager; import org.tmatesoft.svn.core.auth.ISVNAuthenticationProvider; @@ -40,11 +43,13 @@ public class SvnAuthenticationProvider implements ISVNAuthenticationProvider { private final Project myProject; private final SvnAuthenticationNotifier myAuthenticationNotifier; private final ISVNAuthenticationProvider mySvnInteractiveAuthenticationProvider; + private final SvnVcs17 mySvnVcs; private final ISVNAuthenticationStorage myAuthenticationStorage; private static final Set ourForceInteractive = new HashSet(); public SvnAuthenticationProvider(final SvnVcs17 svnVcs, final ISVNAuthenticationProvider provider, final ISVNAuthenticationStorage authenticationStorage) { + mySvnVcs = svnVcs; myAuthenticationStorage = authenticationStorage; myProject = svnVcs.getProject(); myAuthenticationNotifier = svnVcs.getAuthNotifier(); diff --git a/plugins/svn4idea/src/org/jetbrains/idea/svn17/portable/SvnSvnkitUpdateClient.java b/plugins/svn4idea/src/org/jetbrains/idea/svn17/portable/SvnSvnkitUpdateClient.java new file mode 100644 index 000000000000..dfc26591277b --- /dev/null +++ b/plugins/svn4idea/src/org/jetbrains/idea/svn17/portable/SvnSvnkitUpdateClient.java @@ -0,0 +1,206 @@ +/* + * Copyright 2000-2012 JetBrains s.r.o. + * + * 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. + */ +package org.jetbrains.idea.svn17.portable; + +import org.tmatesoft.svn.core.SVNDepth; +import org.tmatesoft.svn.core.SVNException; +import org.tmatesoft.svn.core.SVNURL; +import org.tmatesoft.svn.core.wc.ISVNEventHandler; +import org.tmatesoft.svn.core.wc.SVNRevision; +import org.tmatesoft.svn.core.wc.SVNUpdateClient; + +import java.io.File; + +/** + * Created with IntelliJ IDEA. + * User: Irina.Chernushina + * Date: 2/1/12 + * Time: 12:11 PM + */ +public class SvnSvnkitUpdateClient implements SvnUpdateClientI { + private final SVNUpdateClient myClient; + private ISVNEventHandler myDispatcher; + + public SvnSvnkitUpdateClient(SVNUpdateClient client) { + myClient = client; + } + + @Override + public long doUpdate(File file, SVNRevision revision, boolean recursive) throws SVNException { + return myClient.doUpdate(file, revision, recursive); + } + + @Override + public long doUpdate(File file, SVNRevision revision, boolean recursive, boolean force) throws SVNException { + return myClient.doUpdate(file, revision, recursive, force); + } + + @Override + public long[] doUpdate(File[] paths, + SVNRevision revision, + SVNDepth depth, + boolean allowUnversionedObstructions, + boolean depthIsSticky) throws SVNException { + return myClient.doUpdate(paths, revision, depth, allowUnversionedObstructions, depthIsSticky); + } + + @Override + public long[] doUpdate(File[] paths, + SVNRevision revision, + SVNDepth depth, + boolean allowUnversionedObstructions, + boolean depthIsSticky, + boolean makeParents) throws SVNException { + return myClient.doUpdate(paths, revision, depth, allowUnversionedObstructions, depthIsSticky, makeParents); + } + + @Override + public long doUpdate(File path, SVNRevision revision, SVNDepth depth, boolean allowUnversionedObstructions, boolean depthIsSticky) + throws SVNException { + return myClient.doUpdate(path, revision, depth, allowUnversionedObstructions, depthIsSticky); + } + + @Override + public void setUpdateLocksOnDemand(boolean locksOnDemand) { + myClient.setUpdateLocksOnDemand(locksOnDemand); + } + + @Override + public long doSwitch(File file, SVNURL url, SVNRevision revision, boolean recursive) throws SVNException { + return myClient.doSwitch(file, url, revision, recursive); + } + + @Override + public long doSwitch(File file, SVNURL url, SVNRevision pegRevision, SVNRevision revision, boolean recursive) throws SVNException { + return myClient.doSwitch(file, url, pegRevision, revision, recursive); + } + + @Override + public long doSwitch(File file, SVNURL url, SVNRevision pegRevision, SVNRevision revision, boolean recursive, boolean force) + throws SVNException { + return myClient.doSwitch(file, url, pegRevision, revision, recursive, force); + } + + @Override + public long doSwitch(File path, + SVNURL url, + SVNRevision pegRevision, + SVNRevision revision, + SVNDepth depth, + boolean allowUnversionedObstructions, boolean depthIsSticky) throws SVNException { + return myClient.doSwitch(path, url, pegRevision, revision, depth, allowUnversionedObstructions, depthIsSticky); + } + + @Override + public long doSwitch(File path, + SVNURL url, + SVNRevision pegRevision, + SVNRevision revision, + SVNDepth depth, + boolean allowUnversionedObstructions, boolean depthIsSticky, boolean ignoreAncestry) throws SVNException { + return myClient.doSwitch(path, url, pegRevision, revision, depth, allowUnversionedObstructions, depthIsSticky, ignoreAncestry); + } + + @Override + public long doCheckout(SVNURL url, File dstPath, SVNRevision pegRevision, SVNRevision revision, boolean recursive) throws SVNException { + return myClient.doCheckout(url, dstPath, pegRevision, revision, recursive); + } + + @Override + public long doCheckout(SVNURL url, File dstPath, SVNRevision pegRevision, SVNRevision revision, boolean recursive, boolean force) + throws SVNException { + return myClient.doCheckout(url, dstPath, pegRevision, revision, recursive, force); + } + + @Override + public long doCheckout(SVNURL url, + File dstPath, + SVNRevision pegRevision, + SVNRevision revision, + SVNDepth depth, + boolean allowUnversionedObstructions) throws SVNException { + return myClient.doCheckout(url, dstPath, pegRevision, revision, depth, allowUnversionedObstructions); + } + + @Override + public long doExport(SVNURL url, + File dstPath, + SVNRevision pegRevision, + SVNRevision revision, + String eolStyle, + boolean force, + boolean recursive) throws SVNException { + return myClient.doExport(url, dstPath, pegRevision, revision, eolStyle, force, recursive); + } + + @Override + public long doExport(SVNURL url, + File dstPath, + SVNRevision pegRevision, + SVNRevision revision, + String eolStyle, + boolean overwrite, + SVNDepth depth) throws SVNException { + return myClient.doExport(url, dstPath, pegRevision, revision, eolStyle, overwrite, depth); + } + + @Override + public long doExport(File srcPath, + File dstPath, + SVNRevision pegRevision, + SVNRevision revision, + String eolStyle, + boolean force, + boolean recursive) throws SVNException { + return myClient.doExport(srcPath, dstPath, pegRevision, revision, eolStyle, force, recursive); + } + + @Override + public long doExport(File srcPath, + File dstPath, + SVNRevision pegRevision, + SVNRevision revision, + String eolStyle, + boolean overwrite, + SVNDepth depth) throws SVNException { + return myClient.doExport(srcPath, dstPath, pegRevision, revision, eolStyle, overwrite, depth); + } + + @Override + public void doRelocate(File dst, SVNURL oldURL, SVNURL newURL, boolean recursive) throws SVNException { + myClient.doRelocate(dst, oldURL, newURL, recursive); + } + + @Override + public void doCanonicalizeURLs(File dst, boolean omitDefaultPort, boolean recursive) throws SVNException { + myClient.doCanonicalizeURLs(dst, omitDefaultPort, recursive); + } + + @Override + public void setExportExpandsKeywords(boolean expand) { + myClient.setExportExpandsKeywords(expand); + } + + @Override + public void setEventHandler(ISVNEventHandler dispatcher) { + myDispatcher = dispatcher; + myClient.setEventHandler(dispatcher); + } + + public ISVNEventHandler getEventHandler() { + return myDispatcher; + } +} diff --git a/plugins/svn4idea/src/org/jetbrains/idea/svn17/portable/SvnUpdateClientI.java b/plugins/svn4idea/src/org/jetbrains/idea/svn17/portable/SvnUpdateClientI.java new file mode 100644 index 000000000000..434f657d61b9 --- /dev/null +++ b/plugins/svn4idea/src/org/jetbrains/idea/svn17/portable/SvnUpdateClientI.java @@ -0,0 +1,75 @@ +/* + * Copyright 2000-2012 JetBrains s.r.o. + * + * 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. + */ +package org.jetbrains.idea.svn17.portable; + +import org.tmatesoft.svn.core.SVNDepth; +import org.tmatesoft.svn.core.SVNException; +import org.tmatesoft.svn.core.SVNURL; +import org.tmatesoft.svn.core.wc.ISVNEventHandler; +import org.tmatesoft.svn.core.wc.SVNRevision; + +import java.io.File; + +/** + * Created with IntelliJ IDEA. + * User: Irina.Chernushina + * Date: 2/1/12 + * Time: 11:59 AM + */ +public interface SvnUpdateClientI { + long doUpdate(File file, SVNRevision revision, boolean recursive) throws SVNException; + + long doUpdate(File file, SVNRevision revision, boolean recursive, boolean force) throws SVNException; + + long[] doUpdate(File[] paths, SVNRevision revision, SVNDepth depth, boolean allowUnversionedObstructions, boolean depthIsSticky) throws SVNException; + + long[] doUpdate(File[] paths, SVNRevision revision, SVNDepth depth, boolean allowUnversionedObstructions, boolean depthIsSticky, boolean makeParents) throws SVNException; + + long doUpdate(File path, SVNRevision revision, SVNDepth depth, boolean allowUnversionedObstructions, boolean depthIsSticky) throws SVNException; + + void setUpdateLocksOnDemand(boolean locksOnDemand); + + long doSwitch(File file, SVNURL url, SVNRevision revision, boolean recursive) throws SVNException; + + long doSwitch(File file, SVNURL url, SVNRevision pegRevision, SVNRevision revision, boolean recursive) throws SVNException; + + long doSwitch(File file, SVNURL url, SVNRevision pegRevision, SVNRevision revision, boolean recursive, boolean force) throws SVNException; + + long doSwitch(File path, SVNURL url, SVNRevision pegRevision, SVNRevision revision, SVNDepth depth, boolean allowUnversionedObstructions, boolean depthIsSticky) throws SVNException; + + long doSwitch(File path, SVNURL url, SVNRevision pegRevision, SVNRevision revision, SVNDepth depth, boolean allowUnversionedObstructions, boolean depthIsSticky, boolean ignoreAncestry) throws SVNException; + + long doCheckout(SVNURL url, File dstPath, SVNRevision pegRevision, SVNRevision revision, boolean recursive) throws SVNException; + + long doCheckout(SVNURL url, File dstPath, SVNRevision pegRevision, SVNRevision revision, boolean recursive, boolean force) throws SVNException; + + long doCheckout(SVNURL url, File dstPath, SVNRevision pegRevision, SVNRevision revision, SVNDepth depth, boolean allowUnversionedObstructions) throws SVNException; + + long doExport(SVNURL url, File dstPath, SVNRevision pegRevision, SVNRevision revision, String eolStyle, boolean force, boolean recursive) throws SVNException; + + long doExport(SVNURL url, File dstPath, SVNRevision pegRevision, SVNRevision revision, String eolStyle, boolean overwrite, SVNDepth depth) throws SVNException; + + long doExport(File srcPath, File dstPath, SVNRevision pegRevision, SVNRevision revision, String eolStyle, boolean force, boolean recursive) throws SVNException; + + long doExport(File srcPath, File dstPath, SVNRevision pegRevision, SVNRevision revision, String eolStyle, boolean overwrite, SVNDepth depth) throws SVNException; + + void doRelocate(File dst, SVNURL oldURL, SVNURL newURL, boolean recursive) throws SVNException; + + void doCanonicalizeURLs(File dst, boolean omitDefaultPort, boolean recursive) throws SVNException; + + void setExportExpandsKeywords(boolean expand); + void setEventHandler(ISVNEventHandler dispatcher); +} diff --git a/plugins/svn4idea/src/org/jetbrains/idea/svn17/update/SvnUpdateEnvironment17.java b/plugins/svn4idea/src/org/jetbrains/idea/svn17/update/SvnUpdateEnvironment17.java index 1f9155c6719c..db44c0a19478 100644 --- a/plugins/svn4idea/src/org/jetbrains/idea/svn17/update/SvnUpdateEnvironment17.java +++ b/plugins/svn4idea/src/org/jetbrains/idea/svn17/update/SvnUpdateEnvironment17.java @@ -23,10 +23,10 @@ import com.intellij.openapi.vcs.FilePath; import com.intellij.openapi.vcs.VcsException; import com.intellij.openapi.vcs.update.UpdatedFiles; import org.jetbrains.annotations.Nullable; -import org.jetbrains.idea.svn17.SvnBundle; -import org.jetbrains.idea.svn17.SvnConfiguration17; -import org.jetbrains.idea.svn17.SvnRevisionNumber; -import org.jetbrains.idea.svn17.SvnVcs17; +import org.jetbrains.idea.svn17.*; +import org.jetbrains.idea.svn17.commandLine.SvnCommandLineUpdateClient; +import org.jetbrains.idea.svn17.portable.SvnSvnkitUpdateClient; +import org.jetbrains.idea.svn17.portable.SvnUpdateClientI; import org.tmatesoft.svn.core.SVNException; import org.tmatesoft.svn.core.SVNURL; import org.tmatesoft.svn.core.io.SVNRepository; @@ -82,25 +82,16 @@ public class SvnUpdateEnvironment17 extends AbstractSvnUpdateIntegrateEnvironmen final SvnConfiguration17 configuration = SvnConfiguration17.getInstance(myVcs.getProject()); final UpdateRootInfo rootInfo = configuration.getUpdateRootInfo(root, myVcs); - final SVNUpdateClient updateClient = myVcs.createUpdateClient(); - updateClient.setEventHandler(myHandler); - updateClient.setUpdateLocksOnDemand(configuration.UPDATE_LOCK_ON_DEMAND); - if (rootInfo != null) { - final SVNURL url = rootInfo.getUrl(); - if (url != null && url.equals(getSourceUrl(myVcs, root))) { - if (rootInfo.isUpdateToRevision()) { - rev = updateClient.doUpdate(root, rootInfo.getRevision(), configuration.UPDATE_DEPTH, configuration.FORCE_UPDATE, false); - } else { - rev = updateClient.doUpdate(root, SVNRevision.HEAD, configuration.UPDATE_DEPTH, configuration.FORCE_UPDATE, false); - } + final SVNURL sourceUrl = getSourceUrl(myVcs, root); + final boolean isSwitch = rootInfo != null && rootInfo.getUrl() != null && ! rootInfo.getUrl().equals(sourceUrl); + final SVNRevision updateTo = rootInfo != null && rootInfo.isUpdateToRevision() ? rootInfo.getRevision() : SVNRevision.HEAD; - } else if (url != null) { - rev = updateClient.doSwitch(root, url, SVNRevision.UNDEFINED, rootInfo.getRevision(), configuration.UPDATE_DEPTH, configuration.FORCE_UPDATE, false); - } else { - rev = updateClient.doUpdate(root, SVNRevision.HEAD, configuration.UPDATE_DEPTH, configuration.FORCE_UPDATE, false); - } + if (isSwitch) { + final SvnUpdateClientI updateClient = createUpdateClient(configuration, root, true, sourceUrl); + rev = updateClient.doSwitch(root, rootInfo.getUrl(), SVNRevision.UNDEFINED, rootInfo.getRevision(), configuration.UPDATE_DEPTH, configuration.FORCE_UPDATE, false); } else { - rev = updateClient.doUpdate(root, SVNRevision.HEAD, configuration.UPDATE_DEPTH, configuration.FORCE_UPDATE, false); + final SvnUpdateClientI updateClient = createUpdateClient(configuration, root, false, sourceUrl); + rev = updateClient.doUpdate(root, updateTo, configuration.UPDATE_DEPTH, configuration.FORCE_UPDATE, false); } myPostUpdateFiles.setRevisions(root.getAbsolutePath(), myVcs, new SvnRevisionNumber(SVNRevision.create(rev))); @@ -108,6 +99,20 @@ public class SvnUpdateEnvironment17 extends AbstractSvnUpdateIntegrateEnvironmen return rev; } + private SvnUpdateClientI createUpdateClient(SvnConfiguration17 configuration, File root, boolean isSwitch, SVNURL sourceUrl) { + final SvnUpdateClientI updateClient; + // do not do from command line for switch now + if (! isSwitch && SvnConfiguration17.UseAcceleration.commandLine.equals(configuration.myUseAcceleration) && + Svn17Detector.is17(myVcs.getProject(), root) && SvnAuthenticationManager.HTTP.equals(sourceUrl.getProtocol())) { + updateClient = new SvnCommandLineUpdateClient(myVcs.getProject(), null); + } else { + updateClient = new SvnSvnkitUpdateClient(myVcs.createUpdateClient()); + } + updateClient.setEventHandler(myHandler); + updateClient.setUpdateLocksOnDemand(configuration.UPDATE_LOCK_ON_DEMAND); + return updateClient; + } + protected boolean isMerge() { return false; } diff --git a/plugins/svn4idea/testSource/org/jetbrains/idea/svn17/SvnAuthenticationTest.java b/plugins/svn4idea/testSource/org/jetbrains/idea/svn17/SvnAuthenticationTest.java index 86bc1b019921..3e4d91df96bf 100644 --- a/plugins/svn4idea/testSource/org/jetbrains/idea/svn17/SvnAuthenticationTest.java +++ b/plugins/svn4idea/testSource/org/jetbrains/idea/svn17/SvnAuthenticationTest.java @@ -1054,6 +1054,10 @@ public class SvnAuthenticationTest extends PlatformTestCase { return myCnt; } + @Override + public void acknowledge(boolean accepted, String kind, String realm, SVNErrorMessage message, SVNAuthentication authentication) { + } + @Override public void saveAttemptStarted(ProviderType type, SVNURL url, String realm, String kind) { mySaved = false; @@ -1119,6 +1123,10 @@ public class SvnAuthenticationTest extends PlatformTestCase { mySaved = new HashSet>(); } + @Override + public void acknowledge(boolean accepted, String kind, String realm, SVNErrorMessage message, SVNAuthentication authentication) { + } + public void reset() { mySaved.clear(); myClientRequested.clear(); From 7817391f730544f5ee3dbb0cc9a23d932293533f Mon Sep 17 00:00:00 2001 From: peter Date: Tue, 7 Feb 2012 10:20:35 +0100 Subject: [PATCH 077/215] walk only the necessary files when searching for string in a custom scope --- .../com/intellij/find/impl/FindInProjectUtil.java | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/platform/lang-impl/src/com/intellij/find/impl/FindInProjectUtil.java b/platform/lang-impl/src/com/intellij/find/impl/FindInProjectUtil.java index 14d7b9b9c5e5..1e5bdc1ddfd6 100644 --- a/platform/lang-impl/src/com/intellij/find/impl/FindInProjectUtil.java +++ b/platform/lang-impl/src/com/intellij/find/impl/FindInProjectUtil.java @@ -386,7 +386,7 @@ public class FindInProjectUtil { public boolean processFile(VirtualFile virtualFile) { if (!virtualFile.isDirectory() && (fileMaskRegExp == null || fileMaskRegExp.matcher(virtualFile.getName()).matches()) && - (customScope == null || customScope.contains(virtualFile))) { + customScope.contains(virtualFile)) { final PsiFile psiFile = psiManager.findFile(virtualFile); if (psiFile != null && !filesForFastWordSearch.contains(psiFile)) { myFiles.add(psiFile); @@ -403,10 +403,10 @@ public class FindInProjectUtil { if (psiDirectory == null) { boolean success = fileIndex.iterateContent(iterator); - if (success && customScope instanceof GlobalSearchScope && ((GlobalSearchScope)customScope).isSearchInLibraries()) { + if (success && customScope.isSearchInLibraries()) { OrderEnumerator enumerator = module == null ? OrderEnumerator.orderEntries(project) : OrderEnumerator.orderEntries(module); final VirtualFile[] librarySources = enumerator.withoutModuleSourceEntries().withoutDepModules().getSourceRoots(); - iterateAll(librarySources, (GlobalSearchScope)customScope, iterator); + iterateAll(librarySources, customScope, iterator); } } else { @@ -440,11 +440,14 @@ public class FindInProjectUtil { return true; } - @Nullable + @NotNull private static GlobalSearchScope toGlobal(Project project, @Nullable SearchScope scope) { - if (scope instanceof GlobalSearchScope || scope == null) { + if (scope instanceof GlobalSearchScope) { return (GlobalSearchScope)scope; } + if (scope == null) { + return GlobalSearchScope.projectScope(project); + } Set files = new HashSet(); for (PsiElement element : ((LocalSearchScope)scope).getScope()) { PsiFile file = element.getContainingFile(); @@ -472,7 +475,7 @@ public class FindInProjectUtil { ? moduleContentScope(module) : customScope instanceof GlobalSearchScope ? (GlobalSearchScope)customScope - : GlobalSearchScope.projectScope(project); + : toGlobal(project, customScope); Set keys = new THashSet(30); Set resultFiles = new THashSet(); From 622a36b4dade6e397a5c0943c767517a99e3b888 Mon Sep 17 00:00:00 2001 From: "Rustam.Vishnyakov" Date: Tue, 7 Feb 2012 13:21:15 +0400 Subject: [PATCH 078/215] Groovy custom folding regions --- .../lang/folding/GroovyFoldingBuilder.java | 40 +++++++++++++------ 1 file changed, 27 insertions(+), 13 deletions(-) diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/folding/GroovyFoldingBuilder.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/folding/GroovyFoldingBuilder.java index ef7a8c26f90f..574c5c9d4e1b 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/folding/GroovyFoldingBuilder.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/folding/GroovyFoldingBuilder.java @@ -18,7 +18,7 @@ package org.jetbrains.plugins.groovy.lang.folding; import com.intellij.codeInsight.folding.JavaCodeFoldingSettings; import com.intellij.lang.ASTNode; -import com.intellij.lang.folding.FoldingBuilder; +import com.intellij.lang.folding.CustomFoldingBuilder; import com.intellij.lang.folding.FoldingDescriptor; import com.intellij.openapi.editor.Document; import com.intellij.openapi.editor.FoldingGroup; @@ -33,6 +33,7 @@ import com.intellij.psi.tree.IElementType; import com.intellij.util.containers.hash.HashSet; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import org.jetbrains.plugins.groovy.lang.lexer.GroovyTokenTypes; import org.jetbrains.plugins.groovy.lang.lexer.TokenSets; import org.jetbrains.plugins.groovy.lang.parser.GroovyElementTypes; import org.jetbrains.plugins.groovy.lang.psi.GroovyFile; @@ -43,23 +44,23 @@ import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.GrTypeDefini import org.jetbrains.plugins.groovy.lang.psi.api.toplevel.imports.GrImportStatement; import org.jetbrains.plugins.groovy.lang.psi.util.GrStringUtil; -import java.util.ArrayList; import java.util.List; import java.util.Set; /** * @author ilyas */ -public class GroovyFoldingBuilder implements FoldingBuilder, GroovyElementTypes, DumbAware { +public class GroovyFoldingBuilder extends CustomFoldingBuilder implements GroovyElementTypes, DumbAware { - @NotNull - public FoldingDescriptor[] buildFoldRegions(@NotNull ASTNode node, @NotNull Document document) { - List descriptors = new ArrayList(); - appendDescriptors(node.getPsi(), descriptors, new HashSet()); - return descriptors.toArray(new FoldingDescriptor[descriptors.size()]); + @Override + protected void buildLanguageFoldRegions(@NotNull List descriptors, + @NotNull PsiElement root, + @NotNull Document document, + boolean quick) { + appendDescriptors(root, descriptors, new HashSet()); } - private static void appendDescriptors(PsiElement element, List descriptors, Set usedComments) { + private void appendDescriptors(PsiElement element, List descriptors, Set usedComments) { ASTNode node = element.getNode(); if (node == null) return; IElementType type = node.getElementType(); @@ -70,13 +71,13 @@ public class GroovyFoldingBuilder implements FoldingBuilder, GroovyElementTypes, } } // comments - if ((type.equals(mML_COMMENT) || type.equals(GROOVY_DOC_COMMENT)) && + if (((type.equals(mML_COMMENT) && !isCustomRegionStart(node)) || type.equals(GROOVY_DOC_COMMENT)) && isMultiline(element) && isWellEndedComment(element)) { descriptors.add(new FoldingDescriptor(node, node.getTextRange())); } - if (type.equals(mSL_COMMENT) && !usedComments.contains(element)) { + if (type.equals(mSL_COMMENT) && !isCustomRegionStart(node) && !usedComments.contains(element)) { usedComments.add(element); PsiElement end = null; for (PsiElement current = element.getNextSibling(); current != null; current = current.getNextSibling()) { @@ -214,7 +215,8 @@ public class GroovyFoldingBuilder implements FoldingBuilder, GroovyElementTypes, return text.contains("\n") || text.contains("\r") || text.contains("\r\n"); } - public String getPlaceholderText(@NotNull ASTNode node) { + @Override + protected String getLanguagePlaceholderText(@NotNull ASTNode node, @NotNull TextRange range) { final IElementType elemType = node.getElementType(); if (BLOCK_SET.contains(elemType) || elemType == CLOSABLE_BLOCK) { return "{...}"; @@ -236,7 +238,8 @@ public class GroovyFoldingBuilder implements FoldingBuilder, GroovyElementTypes, return null; } - public boolean isCollapsedByDefault(@NotNull ASTNode node) { + @Override + protected boolean isRegionCollapsedByDefault(@NotNull ASTNode node) { final JavaCodeFoldingSettings settings = JavaCodeFoldingSettings.getInstance(); if ( node.getElementType() == IMPORT_STATEMENT ){ return settings.isCollapseImports(); @@ -280,4 +283,15 @@ public class GroovyFoldingBuilder implements FoldingBuilder, GroovyElementTypes, isMultiline(node.getPsi()) && GrStringUtil.isWellEndedString(node.getPsi()); } + + @Override + protected boolean isCustomFoldingCandidate(ASTNode node) { + return node.getElementType() == GroovyTokenTypes.mSL_COMMENT; + } + + @Override + protected boolean isCustomFoldingRoot(ASTNode node) { + IElementType nodeType = node.getElementType(); + return nodeType == GroovyElementTypes.CLASS_DEFINITION || nodeType == GroovyElementTypes.OPEN_BLOCK; + } } From df89e0c0f5096628dbc4caf41690608fa36473a4 Mon Sep 17 00:00:00 2001 From: nik Date: Tue, 7 Feb 2012 13:50:49 +0400 Subject: [PATCH 079/215] added extension to contribute to compile server classpath; jps-javaee plugin moved to JavaEE plugin --- .idea/modules.xml | 1 - .../compiler/CompileServerManager.java | 3 + .../compiler/server/CompileServerPlugin.java | 37 ++++++++++ .../impl/CompileServerClasspathManager.java | 74 +++++++++++++++++++ .../jps/server/ClasspathBootstrap.java | 6 +- jps/plugins/gwt/jps-gwt.iml | 1 - jps/plugins/javaee/jps-javaee.iml | 14 ---- ...ins.jps.artifacts.LayoutElementTypeService | 2 - .../org.jetbrains.jps.idea.FacetTypeService | 3 - .../jetbrains/jps/javaee/EjbFacetType.groovy | 10 --- .../jps/javaee/JavaeeAppFacetType.groovy | 10 --- .../jetbrains/jps/javaee/JavaeeFacet.groovy | 11 --- .../JavaeeFacetClassesElementType.groovy | 24 ------ .../javaee/JavaeeFacetResourcesElement.groovy | 32 -------- .../JavaeeFacetResourcesElementType.groovy | 22 ------ .../jps/javaee/JavaeeFacetTypeBase.groovy | 40 ---------- .../jetbrains/jps/javaee/WebFacetType.groovy | 18 ----- resources/src/idea/RichPlatformPlugin.xml | 1 + 18 files changed, 116 insertions(+), 193 deletions(-) create mode 100644 java/compiler/impl/src/com/intellij/compiler/server/CompileServerPlugin.java create mode 100644 java/compiler/impl/src/com/intellij/compiler/server/impl/CompileServerClasspathManager.java delete mode 100644 jps/plugins/javaee/jps-javaee.iml delete mode 100644 jps/plugins/javaee/src/META-INF/services/org.jetbrains.jps.artifacts.LayoutElementTypeService delete mode 100644 jps/plugins/javaee/src/META-INF/services/org.jetbrains.jps.idea.FacetTypeService delete mode 100644 jps/plugins/javaee/src/org/jetbrains/jps/javaee/EjbFacetType.groovy delete mode 100644 jps/plugins/javaee/src/org/jetbrains/jps/javaee/JavaeeAppFacetType.groovy delete mode 100644 jps/plugins/javaee/src/org/jetbrains/jps/javaee/JavaeeFacet.groovy delete mode 100644 jps/plugins/javaee/src/org/jetbrains/jps/javaee/JavaeeFacetClassesElementType.groovy delete mode 100644 jps/plugins/javaee/src/org/jetbrains/jps/javaee/JavaeeFacetResourcesElement.groovy delete mode 100644 jps/plugins/javaee/src/org/jetbrains/jps/javaee/JavaeeFacetResourcesElementType.groovy delete mode 100644 jps/plugins/javaee/src/org/jetbrains/jps/javaee/JavaeeFacetTypeBase.groovy delete mode 100644 jps/plugins/javaee/src/org/jetbrains/jps/javaee/WebFacetType.groovy diff --git a/.idea/modules.xml b/.idea/modules.xml index c95d45fbe908..9e15d0263725 100644 --- a/.idea/modules.xml +++ b/.idea/modules.xml @@ -60,7 +60,6 @@ - diff --git a/java/compiler/impl/src/com/intellij/compiler/CompileServerManager.java b/java/compiler/impl/src/com/intellij/compiler/CompileServerManager.java index 3681465f1778..ffbcdd9586d9 100644 --- a/java/compiler/impl/src/com/intellij/compiler/CompileServerManager.java +++ b/java/compiler/impl/src/com/intellij/compiler/CompileServerManager.java @@ -17,6 +17,7 @@ package com.intellij.compiler; import com.intellij.ProjectTopics; import com.intellij.application.options.PathMacrosImpl; +import com.intellij.compiler.server.impl.CompileServerClasspathManager; import com.intellij.execution.ExecutionException; import com.intellij.execution.configurations.GeneralCommandLine; import com.intellij.execution.process.OSProcessHandler; @@ -99,6 +100,7 @@ public class CompileServerManager implements ApplicationComponent{ private final ProjectManager myProjectManager; private static final int MAKE_TRIGGER_DELAY = 5 * 1000 /*5 seconds*/; private final Map myAutomakeFutures = new HashMap(); + private final CompileServerClasspathManager myClasspathManager = new CompileServerClasspathManager(); public CompileServerManager(final ProjectManager projectManager) { myProjectManager = projectManager; @@ -595,6 +597,7 @@ public class CompileServerManager implements ApplicationComponent{ cmdLine.addParameter("-classpath"); final List cp = ClasspathBootstrap.getCompileServerApplicationClasspath(); + cp.addAll(myClasspathManager.getCompileServerPluginsClasspath()); cmdLine.addParameter(classpathToString(cp)); diff --git a/java/compiler/impl/src/com/intellij/compiler/server/CompileServerPlugin.java b/java/compiler/impl/src/com/intellij/compiler/server/CompileServerPlugin.java new file mode 100644 index 000000000000..8a1775d27ab9 --- /dev/null +++ b/java/compiler/impl/src/com/intellij/compiler/server/CompileServerPlugin.java @@ -0,0 +1,37 @@ +package com.intellij.compiler.server; + +import com.intellij.openapi.extensions.ExtensionPointName; +import com.intellij.openapi.extensions.PluginAware; +import com.intellij.openapi.extensions.PluginDescriptor; +import com.intellij.util.xmlb.annotations.Attribute; + +/** + * @author nik + */ +public class CompileServerPlugin implements PluginAware { + public static final ExtensionPointName EP_NAME = ExtensionPointName.create("com.intellij.compileServer.plugin"); + private PluginDescriptor myPluginDescriptor; + private String myJarPath; + + /** + * Specifies path to a jar file which should be added to the classpath of the compile server. The path is relative to the plugin 'lib' directory. + * In the development node the name of this file without extension is treated as a module name and the output directory of the module is added to the classpath. + */ + @Attribute("jar-path") + public String getJarPath() { + return myJarPath; + } + + public void setJarPath(String jarPath) { + myJarPath = jarPath; + } + + @Override + public final void setPluginDescriptor(PluginDescriptor pluginDescriptor) { + myPluginDescriptor = pluginDescriptor; + } + + public PluginDescriptor getPluginDescriptor() { + return myPluginDescriptor; + } +} diff --git a/java/compiler/impl/src/com/intellij/compiler/server/impl/CompileServerClasspathManager.java b/java/compiler/impl/src/com/intellij/compiler/server/impl/CompileServerClasspathManager.java new file mode 100644 index 000000000000..f1bd0abfc030 --- /dev/null +++ b/java/compiler/impl/src/com/intellij/compiler/server/impl/CompileServerClasspathManager.java @@ -0,0 +1,74 @@ +/* + * Copyright 2000-2012 JetBrains s.r.o. + * + * 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. + */ +package com.intellij.compiler.server.impl; + +import com.intellij.compiler.server.CompileServerPlugin; +import com.intellij.ide.plugins.IdeaPluginDescriptor; +import com.intellij.ide.plugins.PluginManager; +import com.intellij.openapi.diagnostic.Logger; +import com.intellij.openapi.extensions.PluginId; +import com.intellij.openapi.util.io.FileUtil; +import com.intellij.util.PathUtil; + +import java.io.File; +import java.util.ArrayList; +import java.util.List; + +/** + * @author nik + */ +public class CompileServerClasspathManager { + private static final Logger LOG = Logger.getInstance("#com.intellij.compiler.server.impl.CompileServerClasspathManager"); + private List myCompileServerPluginsClasspath; + + public List getCompileServerPluginsClasspath() { + if (myCompileServerPluginsClasspath == null) { + myCompileServerPluginsClasspath = computeCompileServerPluginsClasspath(); + } + return myCompileServerPluginsClasspath; + } + + private static List computeCompileServerPluginsClasspath() { + final List classpath = new ArrayList(); + for (CompileServerPlugin serverPlugin : CompileServerPlugin.EP_NAME.getExtensions()) { + final PluginId pluginId = serverPlugin.getPluginDescriptor().getPluginId(); + final IdeaPluginDescriptor plugin = PluginManager.getPlugin(pluginId); + LOG.assertTrue(plugin != null, pluginId); + final File baseFile = plugin.getPath(); + if (baseFile.isFile()) { + classpath.add(baseFile); + } + else if (baseFile.isDirectory()) { + final String relativePath = serverPlugin.getJarPath(); + File jarFile = new File(new File(baseFile, "lib"), relativePath); + if (jarFile.exists()) { + classpath.add(jarFile); + } + else { + //development mode: add directory out/classes/production/ to classpath, assuming that jar-name is equal to module name + final String moduleName = FileUtil.getNameWithoutExtension(PathUtil.getFileName(relativePath)); + final File dir = new File(baseFile.getParentFile(), moduleName); + if (!dir.exists()) { + LOG.warn("Cannot add plugin " + pluginId + " to compile server classpath: " + jarFile.getAbsolutePath() + " and " + + dir.getAbsolutePath() + " don't exist"); + } + classpath.add(dir); + } + } + } + return classpath; + } +} diff --git a/jps/jps-builders/src/org/jetbrains/jps/server/ClasspathBootstrap.java b/jps/jps-builders/src/org/jetbrains/jps/server/ClasspathBootstrap.java index d95a41544503..f520c8128d28 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/server/ClasspathBootstrap.java +++ b/jps/jps-builders/src/org/jetbrains/jps/server/ClasspathBootstrap.java @@ -82,11 +82,7 @@ public class ClasspathBootstrap { cp.add(getResourcePath(FileMonitor.class)); // jna-utils.jar cp.add(getResourcePath(ClassWriter.class)); // asm cp.add(getResourcePath(org.objectweb.asm.commons.EmptyVisitor.class)); // asm-commons - final File jpsModel = getResourcePath(MacroExpander.class); - cp.add(jpsModel); // jps-model - cp.add(new File(jpsModel.getParentFile(), "jps-javaee")); - cp.add(new File(jpsModel.getParentFile(), "jps-gwt")); - cp.add(new File(jpsModel.getParentFile(), "jps-jpa")); + cp.add(getResourcePath(MacroExpander.class)); // jps-model cp.add(getResourcePath(AlienFormFileException.class)); // forms-compiler cp.add(getResourcePath(GroovyException.class)); // groovy cp.add(getResourcePath(org.jdom.input.SAXBuilder.class)); // jdom diff --git a/jps/plugins/gwt/jps-gwt.iml b/jps/plugins/gwt/jps-gwt.iml index 621daa2f0ea8..704ab03cf56b 100644 --- a/jps/plugins/gwt/jps-gwt.iml +++ b/jps/plugins/gwt/jps-gwt.iml @@ -10,7 +10,6 @@ - diff --git a/jps/plugins/javaee/jps-javaee.iml b/jps/plugins/javaee/jps-javaee.iml deleted file mode 100644 index d67aceeddab5..000000000000 --- a/jps/plugins/javaee/jps-javaee.iml +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - - - - diff --git a/jps/plugins/javaee/src/META-INF/services/org.jetbrains.jps.artifacts.LayoutElementTypeService b/jps/plugins/javaee/src/META-INF/services/org.jetbrains.jps.artifacts.LayoutElementTypeService deleted file mode 100644 index 45b2dc247bd9..000000000000 --- a/jps/plugins/javaee/src/META-INF/services/org.jetbrains.jps.artifacts.LayoutElementTypeService +++ /dev/null @@ -1,2 +0,0 @@ -org.jetbrains.jps.javaee.JavaeeFacetResourcesElementType -org.jetbrains.jps.javaee.JavaeeFacetClassesElementType \ No newline at end of file diff --git a/jps/plugins/javaee/src/META-INF/services/org.jetbrains.jps.idea.FacetTypeService b/jps/plugins/javaee/src/META-INF/services/org.jetbrains.jps.idea.FacetTypeService deleted file mode 100644 index 4b60ca861db8..000000000000 --- a/jps/plugins/javaee/src/META-INF/services/org.jetbrains.jps.idea.FacetTypeService +++ /dev/null @@ -1,3 +0,0 @@ -org.jetbrains.jps.javaee.WebFacetType -org.jetbrains.jps.javaee.EjbFacetType -org.jetbrains.jps.javaee.JavaeeAppFacetType \ No newline at end of file diff --git a/jps/plugins/javaee/src/org/jetbrains/jps/javaee/EjbFacetType.groovy b/jps/plugins/javaee/src/org/jetbrains/jps/javaee/EjbFacetType.groovy deleted file mode 100644 index 96fa9b90232e..000000000000 --- a/jps/plugins/javaee/src/org/jetbrains/jps/javaee/EjbFacetType.groovy +++ /dev/null @@ -1,10 +0,0 @@ -package org.jetbrains.jps.javaee - -/** - * @author nik - */ -class EjbFacetType extends JavaeeFacetTypeBase { - EjbFacetType() { - super("ejb") - } -} diff --git a/jps/plugins/javaee/src/org/jetbrains/jps/javaee/JavaeeAppFacetType.groovy b/jps/plugins/javaee/src/org/jetbrains/jps/javaee/JavaeeAppFacetType.groovy deleted file mode 100644 index 20dff7d7e44d..000000000000 --- a/jps/plugins/javaee/src/org/jetbrains/jps/javaee/JavaeeAppFacetType.groovy +++ /dev/null @@ -1,10 +0,0 @@ -package org.jetbrains.jps.javaee - -/** - * @author nik - */ -public class JavaeeAppFacetType extends JavaeeFacetTypeBase { - JavaeeAppFacetType() { - super("javaeeApplication") - } -} diff --git a/jps/plugins/javaee/src/org/jetbrains/jps/javaee/JavaeeFacet.groovy b/jps/plugins/javaee/src/org/jetbrains/jps/javaee/JavaeeFacet.groovy deleted file mode 100644 index 844d2108deda..000000000000 --- a/jps/plugins/javaee/src/org/jetbrains/jps/javaee/JavaeeFacet.groovy +++ /dev/null @@ -1,11 +0,0 @@ -package org.jetbrains.jps.javaee - -import org.jetbrains.jps.idea.Facet - -/** - * @author nik - */ -class JavaeeFacet extends Facet { - final List> descriptors = [] - final List> webRoots = [] -} diff --git a/jps/plugins/javaee/src/org/jetbrains/jps/javaee/JavaeeFacetClassesElementType.groovy b/jps/plugins/javaee/src/org/jetbrains/jps/javaee/JavaeeFacetClassesElementType.groovy deleted file mode 100644 index c63ff6f18e4d..000000000000 --- a/jps/plugins/javaee/src/org/jetbrains/jps/javaee/JavaeeFacetClassesElementType.groovy +++ /dev/null @@ -1,24 +0,0 @@ -package org.jetbrains.jps.javaee; - - -import org.jetbrains.jps.MacroExpander -import org.jetbrains.jps.Project -import org.jetbrains.jps.artifacts.LayoutElement -import org.jetbrains.jps.artifacts.LayoutElementTypeService -import org.jetbrains.jps.artifacts.ModuleOutputElement -import org.jetbrains.jps.idea.ProjectLoadingErrorReporter - -/** - * @author nik - */ -class JavaeeFacetClassesElementType extends LayoutElementTypeService { - JavaeeFacetClassesElementType() { - super("javaee-facet-classes") - } - - @Override - LayoutElement createElement(Project project, Node tag, MacroExpander macroExpander, ProjectLoadingErrorReporter errorReporter) { - String facetId = tag."@facet" - return new ModuleOutputElement(moduleName: facetId.substring(0, facetId.indexOf('/'))) - } -} diff --git a/jps/plugins/javaee/src/org/jetbrains/jps/javaee/JavaeeFacetResourcesElement.groovy b/jps/plugins/javaee/src/org/jetbrains/jps/javaee/JavaeeFacetResourcesElement.groovy deleted file mode 100644 index 7298d28c8ac1..000000000000 --- a/jps/plugins/javaee/src/org/jetbrains/jps/javaee/JavaeeFacetResourcesElement.groovy +++ /dev/null @@ -1,32 +0,0 @@ -package org.jetbrains.jps.javaee - -import org.jetbrains.jps.Project -import org.jetbrains.jps.idea.Facet -import org.jetbrains.jps.idea.IdeaProjectLoadingUtil -import org.jetbrains.jps.idea.ProjectLoadingErrorReporter -import org.jetbrains.jps.artifacts.* - -/** - * @author nik - */ -class JavaeeFacetResourcesElement extends ComplexLayoutElement { - String facetId - ProjectLoadingErrorReporter errorReporter - - List getSubstitution(Project project) { - Facet facet = IdeaProjectLoadingUtil.findFacetByIdWithAssertion(project, facetId, errorReporter) - - if (!(facet instanceof JavaeeFacet)) { - errorReporter.error("$facetId facet is not JavaEE facet") - } - - List result = [] - facet.descriptors.each {Map descriptor -> - result << LayoutElementFactory.createParentDirectories(descriptor.outputPath, new FileCopyElement(filePath: descriptor.path)) - } - facet.webRoots.each {Map webRoot -> - result << LayoutElementFactory.createParentDirectories(webRoot.outputPath, new DirectoryCopyElement(dirPath: webRoot.path)) - } - return result - } -} diff --git a/jps/plugins/javaee/src/org/jetbrains/jps/javaee/JavaeeFacetResourcesElementType.groovy b/jps/plugins/javaee/src/org/jetbrains/jps/javaee/JavaeeFacetResourcesElementType.groovy deleted file mode 100644 index 527c536a21f2..000000000000 --- a/jps/plugins/javaee/src/org/jetbrains/jps/javaee/JavaeeFacetResourcesElementType.groovy +++ /dev/null @@ -1,22 +0,0 @@ -package org.jetbrains.jps.javaee - -import org.jetbrains.jps.MacroExpander -import org.jetbrains.jps.Project -import org.jetbrains.jps.artifacts.LayoutElement -import org.jetbrains.jps.artifacts.LayoutElementTypeService -import org.jetbrains.jps.idea.ProjectLoadingErrorReporter - -/** - * @author nik - */ -class JavaeeFacetResourcesElementType extends LayoutElementTypeService { - JavaeeFacetResourcesElementType() { - super("javaee-facet-resources") - } - - @Override - LayoutElement createElement(Project project, Node tag, MacroExpander macroExpander, ProjectLoadingErrorReporter errorReporter) { - return new JavaeeFacetResourcesElement(facetId: tag."@facet", errorReporter: errorReporter) - } - -} diff --git a/jps/plugins/javaee/src/org/jetbrains/jps/javaee/JavaeeFacetTypeBase.groovy b/jps/plugins/javaee/src/org/jetbrains/jps/javaee/JavaeeFacetTypeBase.groovy deleted file mode 100644 index 657a6ed2b9f7..000000000000 --- a/jps/plugins/javaee/src/org/jetbrains/jps/javaee/JavaeeFacetTypeBase.groovy +++ /dev/null @@ -1,40 +0,0 @@ -package org.jetbrains.jps.javaee - -import org.jetbrains.jps.MacroExpander -import org.jetbrains.jps.Module -import org.jetbrains.jps.idea.Facet -import org.jetbrains.jps.idea.FacetTypeService - -import org.jetbrains.jps.idea.IdeaProjectLoadingUtil - -/** - * @author nik - */ -public abstract class JavaeeFacetTypeBase extends FacetTypeService { - protected JavaeeFacetTypeBase(String typeId) { - super(typeId) - } - - protected String getDescriptorOutputPath(String descriptorId) { - return "META-INF" - } - - @Override - public Facet createFacet(Module module, String name, Node facetConfiguration, MacroExpander macroExpander) { - def facet = new JavaeeFacet(name: name) - facetConfiguration?.descriptors?.deploymentDescriptor?.each {Node tag -> - def outputPath = getDescriptorOutputPath(tag."@name") - String path = urlToPath(tag."@url", macroExpander) - facet.descriptors << [path: path, outputPath: outputPath] - } - facetConfiguration?.webroots?.root?.each {Node tag -> - String path = urlToPath(tag."@url", macroExpander) - facet.webRoots << [path: path, outputPath: tag."@relative"] - } - return facet - } - - def urlToPath(String url, MacroExpander macroExpander) { - return macroExpander.expandMacros(IdeaProjectLoadingUtil.pathFromUrl(url)) - } -} diff --git a/jps/plugins/javaee/src/org/jetbrains/jps/javaee/WebFacetType.groovy b/jps/plugins/javaee/src/org/jetbrains/jps/javaee/WebFacetType.groovy deleted file mode 100644 index d6e7f972eb5a..000000000000 --- a/jps/plugins/javaee/src/org/jetbrains/jps/javaee/WebFacetType.groovy +++ /dev/null @@ -1,18 +0,0 @@ -package org.jetbrains.jps.javaee - -/** - * @author nik - */ -public class WebFacetType extends JavaeeFacetTypeBase { - public WebFacetType() { - super("web"); - } - - @Override - protected String getDescriptorOutputPath(String descriptorId) { - if (descriptorId == "context.xml") return "META-INF" - return "WEB-INF" - } - - -} diff --git a/resources/src/idea/RichPlatformPlugin.xml b/resources/src/idea/RichPlatformPlugin.xml index 86586c9f7d83..2d976d81609a 100644 --- a/resources/src/idea/RichPlatformPlugin.xml +++ b/resources/src/idea/RichPlatformPlugin.xml @@ -72,6 +72,7 @@ + From f6320a11c01ef3f079818607e36813763ea3225c Mon Sep 17 00:00:00 2001 From: Maxim Shafirov Date: Tue, 7 Feb 2012 14:26:00 +0400 Subject: [PATCH 080/215] Allow "core" and "normal" environments to co-exist --- .../src/com/intellij/core/CoreEnvironment.java | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/platform/core-impl/src/com/intellij/core/CoreEnvironment.java b/platform/core-impl/src/com/intellij/core/CoreEnvironment.java index e754d84607d6..8957f43309fe 100644 --- a/platform/core-impl/src/com/intellij/core/CoreEnvironment.java +++ b/platform/core-impl/src/com/intellij/core/CoreEnvironment.java @@ -83,10 +83,12 @@ public class CoreEnvironment { myEncodingRegistry = new CoreEncodingRegistry(); myApplication = new MockApplication(parentDisposable); - ApplicationManager.setApplication(myApplication, - new StaticGetter(myFileTypeRegistry), - new StaticGetter(myEncodingRegistry), - parentDisposable); + if (ApplicationManager.getApplication() == null) { + ApplicationManager.setApplication(myApplication, + new StaticGetter(myFileTypeRegistry), + new StaticGetter(myEncodingRegistry), + parentDisposable); + } myLocalFileSystem = new CoreLocalFileSystem(); myJarFileSystem = new CoreJarFileSystem(); From 2fff1209da8ade1626a7445f4a98871448fbc878 Mon Sep 17 00:00:00 2001 From: nik Date: Tue, 7 Feb 2012 14:29:46 +0400 Subject: [PATCH 081/215] removed obsolete modules from artifacts --- .idea/artifacts/jps_plugins.xml | 1 - .idea/artifacts/jps_sources.xml | 1 - 2 files changed, 2 deletions(-) diff --git a/.idea/artifacts/jps_plugins.xml b/.idea/artifacts/jps_plugins.xml index fee03eee74f7..ef658048f36c 100644 --- a/.idea/artifacts/jps_plugins.xml +++ b/.idea/artifacts/jps_plugins.xml @@ -4,7 +4,6 @@ - diff --git a/.idea/artifacts/jps_sources.xml b/.idea/artifacts/jps_sources.xml index 2cd42352db97..2b7c6fd1e0b7 100644 --- a/.idea/artifacts/jps_sources.xml +++ b/.idea/artifacts/jps_sources.xml @@ -6,7 +6,6 @@ - From d4d168582886e617c213c5ae42f954202029c5d7 Mon Sep 17 00:00:00 2001 From: anna Date: Tue, 7 Feb 2012 11:42:54 +0100 Subject: [PATCH 082/215] EA-33530 - AIOOBE: ExtractMethodProcessor.doExtract --- .../extractMethod/ExtractMethodProcessor.java | 6 ++++ .../extractMethod/DisabledParam.java | 6 ++++ .../extractMethod/DisabledParam_after.java | 11 +++++++ .../refactoring/ExtractMethodTest.java | 30 ++++++++++++++++++- 4 files changed, 52 insertions(+), 1 deletion(-) create mode 100644 java/java-tests/testData/refactoring/extractMethod/DisabledParam.java create mode 100644 java/java-tests/testData/refactoring/extractMethod/DisabledParam_after.java diff --git a/java/java-impl/src/com/intellij/refactoring/extractMethod/ExtractMethodProcessor.java b/java/java-impl/src/com/intellij/refactoring/extractMethod/ExtractMethodProcessor.java index f1a0966c1dc6..123463734811 100644 --- a/java/java-impl/src/com/intellij/refactoring/extractMethod/ExtractMethodProcessor.java +++ b/java/java-impl/src/com/intellij/refactoring/extractMethod/ExtractMethodProcessor.java @@ -509,6 +509,11 @@ public class ExtractMethodProcessor implements MatchProvider { myVariableDatum[i] = myInputVariables.getInputVariables().get(i); } } + + @TestOnly + public void doNotPassParameter(int i) { + myVariableDatum[i].passAsParameter = false; + } /** * Invoked in command and in atomic action @@ -760,6 +765,7 @@ public class ExtractMethodProcessor implements MatchProvider { for (int i = 0, length = myVariableDatum.length; i < length; i++) { ParameterTablePanel.VariableData data = myVariableDatum[i]; + if (!data.passAsParameter) continue; final PsiVariable variable = data.variable; final PsiParameter psiParameter = newMethod.getParameterList().getParameters()[i]; if (!TypeConversionUtil.isAssignable(variable.getType(), psiParameter.getType())) { diff --git a/java/java-tests/testData/refactoring/extractMethod/DisabledParam.java b/java/java-tests/testData/refactoring/extractMethod/DisabledParam.java new file mode 100644 index 000000000000..64406a7febeb --- /dev/null +++ b/java/java-tests/testData/refactoring/extractMethod/DisabledParam.java @@ -0,0 +1,6 @@ +class Fest { + public static void main(String[] args) { + String f = ""; + System.out.println(f); + } +} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/extractMethod/DisabledParam_after.java b/java/java-tests/testData/refactoring/extractMethod/DisabledParam_after.java new file mode 100644 index 000000000000..c25ade46e4d5 --- /dev/null +++ b/java/java-tests/testData/refactoring/extractMethod/DisabledParam_after.java @@ -0,0 +1,11 @@ +class Fest { + public static void main(String[] args) { + String f = ""; + newMethod(); + } + + private static void newMethod() { + String f = ; + System.out.println(f); + } +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/refactoring/ExtractMethodTest.java b/java/java-tests/testSrc/com/intellij/refactoring/ExtractMethodTest.java index cf4e75003a50..dd534625c829 100644 --- a/java/java-tests/testSrc/com/intellij/refactoring/ExtractMethodTest.java +++ b/java/java-tests/testSrc/com/intellij/refactoring/ExtractMethodTest.java @@ -9,6 +9,7 @@ import com.intellij.psi.PsiExpression; import com.intellij.psi.PsiFile; import com.intellij.psi.codeStyle.CodeStyleSettings; import com.intellij.psi.codeStyle.CodeStyleSettingsManager; +import com.intellij.refactoring.extractMethod.ExtractMethodHandler; import com.intellij.refactoring.extractMethod.ExtractMethodProcessor; import com.intellij.refactoring.extractMethod.PrepareFailedException; import com.intellij.refactoring.introduceVariable.IntroduceVariableBase; @@ -500,6 +501,16 @@ public class ExtractMethodTest extends LightCodeInsightTestCase { public void testRedundantCast() throws Exception { doTest(); } + + public void testDisabledParam() throws Exception { + final CodeStyleSettings settings = CodeStyleSettingsManager.getSettings(getProject()); + settings.ELSE_ON_NEW_LINE = true; + settings.CATCH_ON_NEW_LINE = myCatchOnNewLine; + configureByFile(BASE_PATH + getTestName(false) + ".java"); + boolean success = performExtractMethod(true, true, getEditor(), getFile(), getProject(), false, 0); + assertTrue(success); + checkResultByFile(BASE_PATH + getTestName(false) + "_after.java"); + } private void doPrepareErrorTest(final String expectedMessage) throws Exception { String expectedError = null; @@ -545,6 +556,17 @@ public class ExtractMethodTest extends LightCodeInsightTestCase { public static boolean performExtractMethod(boolean doRefactor, boolean replaceAllDuplicates, Editor editor, PsiFile file, Project project, final boolean extractChainedConstructor) throws PrepareFailedException, IncorrectOperationException { + return performExtractMethod(doRefactor, replaceAllDuplicates, editor, file, project, extractChainedConstructor, null); + } + + public static boolean performExtractMethod(boolean doRefactor, + boolean replaceAllDuplicates, + Editor editor, + PsiFile file, + Project project, + final boolean extractChainedConstructor, + int... disabledParams) + throws PrepareFailedException, IncorrectOperationException { int startOffset = editor.getSelectionModel().getSelectionStart(); int endOffset = editor.getSelectionModel().getSelectionEnd(); @@ -574,7 +596,13 @@ public class ExtractMethodTest extends LightCodeInsightTestCase { } if (doRefactor) { - processor.testRun(); + processor.testPrepare(); + if (disabledParams != null) { + for (int param : disabledParams) { + processor.doNotPassParameter(param); + } + } + ExtractMethodHandler.run(project, editor, processor); } if (replaceAllDuplicates) { From 2103c2098aeb955fef05effead211ed830290193 Mon Sep 17 00:00:00 2001 From: nik Date: Tue, 7 Feb 2012 14:37:54 +0400 Subject: [PATCH 083/215] cleanup and javadoc --- .../src/org/jetbrains/jps/incremental/Builder.java | 7 +++---- .../org/jetbrains/jps/incremental/ProjectLevelBuilder.java | 1 + .../jps/incremental/artifacts/IncArtifactBuilder.java | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/jps/jps-builders/src/org/jetbrains/jps/incremental/Builder.java b/jps/jps-builders/src/org/jetbrains/jps/incremental/Builder.java index bf1265d0ca4a..aa154c937595 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/incremental/Builder.java +++ b/jps/jps-builders/src/org/jetbrains/jps/incremental/Builder.java @@ -1,14 +1,13 @@ package org.jetbrains.jps.incremental; /** + * @see ModuleLevelBuilder + * @see ProjectLevelBuilder + * * @author nik */ public abstract class Builder { public abstract String getName(); public abstract String getDescription(); - - public static enum ExitCode { - OK, ABORT, ADDITIONAL_PASS_REQUIRED - } } diff --git a/jps/jps-builders/src/org/jetbrains/jps/incremental/ProjectLevelBuilder.java b/jps/jps-builders/src/org/jetbrains/jps/incremental/ProjectLevelBuilder.java index dadd38cc9928..3ef9b038d1c3 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/incremental/ProjectLevelBuilder.java +++ b/jps/jps-builders/src/org/jetbrains/jps/incremental/ProjectLevelBuilder.java @@ -1,6 +1,7 @@ package org.jetbrains.jps.incremental; /** + * @see ProjectLevelBuilderService * @author nik */ public abstract class ProjectLevelBuilder extends Builder { diff --git a/jps/jps-builders/src/org/jetbrains/jps/incremental/artifacts/IncArtifactBuilder.java b/jps/jps-builders/src/org/jetbrains/jps/incremental/artifacts/IncArtifactBuilder.java index c158090774ad..83a60f1cda2b 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/incremental/artifacts/IncArtifactBuilder.java +++ b/jps/jps-builders/src/org/jetbrains/jps/incremental/artifacts/IncArtifactBuilder.java @@ -120,7 +120,7 @@ public class IncArtifactBuilder extends ProjectLevelBuilder { } context.processMessage(UptoDateFilesSavedEvent.INSTANCE); } - catch (Exception e) { + catch (IOException e) { throw new ProjectBuildException(e); } } From bbb6e954063a80652fc58f5fe183b13fbec9d792 Mon Sep 17 00:00:00 2001 From: nik Date: Tue, 7 Feb 2012 15:02:30 +0400 Subject: [PATCH 084/215] compile server: api for registering module level builders --- ...g.jetbrains.jps.incremental.BuilderService | 1 + .../jps/incremental/BuilderRegistry.java | 20 ++++++---------- .../jps/incremental/BuilderService.java | 22 +++++++++++++++++ .../jps/incremental/JavaBuilderService.java | 24 +++++++++++++++++++ .../jps/incremental/ModuleLevelBuilder.java | 12 ++++++++++ .../jps/incremental/ProjectLevelBuilder.java | 2 +- .../ProjectLevelBuilderService.java | 11 --------- .../artifacts/ArtifactBuilderService.java | 11 +++++---- .../jps/incremental/groovy/GroovyBuilder.java | 1 + .../jps/incremental/java/JavaBuilder.java | 1 + .../resources/ResourcesBuilder.java | 12 +--------- 11 files changed, 77 insertions(+), 40 deletions(-) create mode 100644 jps/jps-builders/src/META-INF/services/org.jetbrains.jps.incremental.BuilderService create mode 100644 jps/jps-builders/src/org/jetbrains/jps/incremental/BuilderService.java create mode 100644 jps/jps-builders/src/org/jetbrains/jps/incremental/JavaBuilderService.java delete mode 100644 jps/jps-builders/src/org/jetbrains/jps/incremental/ProjectLevelBuilderService.java diff --git a/jps/jps-builders/src/META-INF/services/org.jetbrains.jps.incremental.BuilderService b/jps/jps-builders/src/META-INF/services/org.jetbrains.jps.incremental.BuilderService new file mode 100644 index 000000000000..128f95ade09d --- /dev/null +++ b/jps/jps-builders/src/META-INF/services/org.jetbrains.jps.incremental.BuilderService @@ -0,0 +1 @@ +org.jetbrains.jps.incremental.JavaBuilderService diff --git a/jps/jps-builders/src/org/jetbrains/jps/incremental/BuilderRegistry.java b/jps/jps-builders/src/org/jetbrains/jps/incremental/BuilderRegistry.java index 7956d9210086..62b2c1fd2cb4 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/incremental/BuilderRegistry.java +++ b/jps/jps-builders/src/org/jetbrains/jps/incremental/BuilderRegistry.java @@ -1,9 +1,6 @@ package org.jetbrains.jps.incremental; import org.jetbrains.jps.idea.OwnServiceLoader; -import org.jetbrains.jps.incremental.groovy.GroovyBuilder; -import org.jetbrains.jps.incremental.java.JavaBuilder; -import org.jetbrains.jps.incremental.resources.ResourcesBuilder; import java.util.*; import java.util.concurrent.ExecutorService; @@ -37,18 +34,15 @@ public class BuilderRegistry { } }); - final OwnServiceLoader loader = OwnServiceLoader.load(ProjectLevelBuilderService.class); + final OwnServiceLoader loader = OwnServiceLoader.load(BuilderService.class); - for (ProjectLevelBuilderService service : loader) { - myProjectLevelBuilders.add(service.createBuilder()); + for (BuilderService service : loader) { + myProjectLevelBuilders.addAll(service.createProjectLevelBuilders()); + final List moduleLevelBuilders = service.createModuleLevelBuilders(myTasksExecutor); + for (ModuleLevelBuilder builder : moduleLevelBuilders) { + myModuleLevelBuilders.get(builder.getCategory()).add(builder); + } } - // todo: some builder registration mechanism for plugins needed - - myModuleLevelBuilders.get(BuilderCategory.TRANSLATOR).add(new GroovyBuilder(true)); - myModuleLevelBuilders.get(BuilderCategory.TRANSLATOR).add(new JavaBuilder(myTasksExecutor)); - myModuleLevelBuilders.get(BuilderCategory.TRANSLATOR).add(new ResourcesBuilder()); - myModuleLevelBuilders.get(BuilderCategory.TRANSLATOR).add(new GroovyBuilder(false)); - } public int getModuleLevelBuilderCount() { diff --git a/jps/jps-builders/src/org/jetbrains/jps/incremental/BuilderService.java b/jps/jps-builders/src/org/jetbrains/jps/incremental/BuilderService.java new file mode 100644 index 000000000000..e4df2b9d7a8a --- /dev/null +++ b/jps/jps-builders/src/org/jetbrains/jps/incremental/BuilderService.java @@ -0,0 +1,22 @@ +package org.jetbrains.jps.incremental; + +import org.jetbrains.annotations.NotNull; + +import java.util.Collections; +import java.util.List; +import java.util.concurrent.ExecutorService; + +/** + * @author nik + */ +public abstract class BuilderService { + @NotNull + public List createModuleLevelBuilders(ExecutorService executorService) { + return Collections.emptyList(); + } + + @NotNull + public List createProjectLevelBuilders() { + return Collections.emptyList(); + } +} diff --git a/jps/jps-builders/src/org/jetbrains/jps/incremental/JavaBuilderService.java b/jps/jps-builders/src/org/jetbrains/jps/incremental/JavaBuilderService.java new file mode 100644 index 000000000000..9f8bff5fac8c --- /dev/null +++ b/jps/jps-builders/src/org/jetbrains/jps/incremental/JavaBuilderService.java @@ -0,0 +1,24 @@ +package org.jetbrains.jps.incremental; + +import org.jetbrains.annotations.NotNull; +import org.jetbrains.jps.incremental.groovy.GroovyBuilder; +import org.jetbrains.jps.incremental.java.JavaBuilder; +import org.jetbrains.jps.incremental.resources.ResourcesBuilder; + +import java.util.Arrays; +import java.util.List; +import java.util.concurrent.ExecutorService; + +/** + * @author nik + */ +public class JavaBuilderService extends BuilderService { + @NotNull + @Override + public List createModuleLevelBuilders(ExecutorService executorService) { + return Arrays.asList(new GroovyBuilder(true), + new JavaBuilder(executorService), + new ResourcesBuilder(), + new GroovyBuilder(false)); + } +} diff --git a/jps/jps-builders/src/org/jetbrains/jps/incremental/ModuleLevelBuilder.java b/jps/jps-builders/src/org/jetbrains/jps/incremental/ModuleLevelBuilder.java index 102f62297c8f..56c67f167d7f 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/incremental/ModuleLevelBuilder.java +++ b/jps/jps-builders/src/org/jetbrains/jps/incremental/ModuleLevelBuilder.java @@ -14,6 +14,8 @@ import java.util.HashSet; import java.util.Set; /** + * Use {@link BuilderService} to register implementations of this class + * * @author Eugene Zhuravlev * Date: 9/17/11 */ @@ -23,12 +25,22 @@ public abstract class ModuleLevelBuilder extends Builder { private static final Key> ALL_AFFECTED_FILES_KEY = Key.create("_all_affected_files_"); private static final Key> ALL_COMPILED_FILES_KEY = Key.create("_all_compiled_files_"); + private final BuilderCategory myCategory; + + protected ModuleLevelBuilder(BuilderCategory category) { + myCategory = category; + } + public static enum ExitCode { OK, ABORT, ADDITIONAL_PASS_REQUIRED, CHUNK_REBUILD_REQUIRED } public abstract ExitCode build(CompileContext context, ModuleChunk chunk) throws ProjectBuildException; + public final BuilderCategory getCategory() { + return myCategory; + } + public void cleanupResources(CompileContext context, ModuleChunk chunk) { ALL_AFFECTED_FILES_KEY.set(context, null); ALL_COMPILED_FILES_KEY.set(context, null); diff --git a/jps/jps-builders/src/org/jetbrains/jps/incremental/ProjectLevelBuilder.java b/jps/jps-builders/src/org/jetbrains/jps/incremental/ProjectLevelBuilder.java index 3ef9b038d1c3..a3e95a39c409 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/incremental/ProjectLevelBuilder.java +++ b/jps/jps-builders/src/org/jetbrains/jps/incremental/ProjectLevelBuilder.java @@ -1,7 +1,7 @@ package org.jetbrains.jps.incremental; /** - * @see ProjectLevelBuilderService + * Use {@link BuilderService} to register implementations of this class * @author nik */ public abstract class ProjectLevelBuilder extends Builder { diff --git a/jps/jps-builders/src/org/jetbrains/jps/incremental/ProjectLevelBuilderService.java b/jps/jps-builders/src/org/jetbrains/jps/incremental/ProjectLevelBuilderService.java deleted file mode 100644 index fb6dc5eeda14..000000000000 --- a/jps/jps-builders/src/org/jetbrains/jps/incremental/ProjectLevelBuilderService.java +++ /dev/null @@ -1,11 +0,0 @@ -package org.jetbrains.jps.incremental; - -import org.jetbrains.annotations.NotNull; - -/** - * @author nik - */ -public abstract class ProjectLevelBuilderService { - @NotNull - public abstract ProjectLevelBuilder createBuilder(); -} diff --git a/jps/jps-builders/src/org/jetbrains/jps/incremental/artifacts/ArtifactBuilderService.java b/jps/jps-builders/src/org/jetbrains/jps/incremental/artifacts/ArtifactBuilderService.java index 6c4b8b19cd95..9d0622b67b18 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/incremental/artifacts/ArtifactBuilderService.java +++ b/jps/jps-builders/src/org/jetbrains/jps/incremental/artifacts/ArtifactBuilderService.java @@ -1,16 +1,19 @@ package org.jetbrains.jps.incremental.artifacts; import org.jetbrains.annotations.NotNull; +import org.jetbrains.jps.incremental.BuilderService; import org.jetbrains.jps.incremental.ProjectLevelBuilder; -import org.jetbrains.jps.incremental.ProjectLevelBuilderService; + +import java.util.Collections; +import java.util.List; /** * @author nik */ -public class ArtifactBuilderService extends ProjectLevelBuilderService { +public class ArtifactBuilderService extends BuilderService { @NotNull @Override - public ProjectLevelBuilder createBuilder() { - return new IncArtifactBuilder(); + public List createProjectLevelBuilders() { + return Collections.singletonList(new IncArtifactBuilder()); } } diff --git a/jps/jps-builders/src/org/jetbrains/jps/incremental/groovy/GroovyBuilder.java b/jps/jps-builders/src/org/jetbrains/jps/incremental/groovy/GroovyBuilder.java index 5565703430b4..0fbd21881c8d 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/incremental/groovy/GroovyBuilder.java +++ b/jps/jps-builders/src/org/jetbrains/jps/incremental/groovy/GroovyBuilder.java @@ -38,6 +38,7 @@ public class GroovyBuilder extends ModuleLevelBuilder { private final String myBuilderName; public GroovyBuilder(boolean forStubs) { + super(BuilderCategory.TRANSLATOR); myForStubs = forStubs; myBuilderName = BUILDER_NAME + (forStubs ? "-stubs" : "-classes"); } diff --git a/jps/jps-builders/src/org/jetbrains/jps/incremental/java/JavaBuilder.java b/jps/jps-builders/src/org/jetbrains/jps/incremental/java/JavaBuilder.java index 8a80242794ef..ac1d7e09b598 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/incremental/java/JavaBuilder.java +++ b/jps/jps-builders/src/org/jetbrains/jps/incremental/java/JavaBuilder.java @@ -73,6 +73,7 @@ public class JavaBuilder extends ModuleLevelBuilder { private final List myClassProcessors = new ArrayList(); public JavaBuilder(ExecutorService tasksExecutor) { + super(BuilderCategory.TRANSLATOR); myTaskRunner = tasksExecutor; //add here class processors in the sequence they should be executed myClassProcessors.add(new ClassPostProcessor() { diff --git a/jps/jps-builders/src/org/jetbrains/jps/incremental/resources/ResourcesBuilder.java b/jps/jps-builders/src/org/jetbrains/jps/incremental/resources/ResourcesBuilder.java index 8a36c1ec7b9d..e964a0284036 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/incremental/resources/ResourcesBuilder.java +++ b/jps/jps-builders/src/org/jetbrains/jps/incremental/resources/ResourcesBuilder.java @@ -2,7 +2,6 @@ package org.jetbrains.jps.incremental.resources; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.util.io.FileUtil; -import org.jetbrains.jps.CompilerConfiguration; import org.jetbrains.jps.Module; import org.jetbrains.jps.ModuleChunk; import org.jetbrains.jps.incremental.*; @@ -24,6 +23,7 @@ public class ResourcesBuilder extends ModuleLevelBuilder { public static final String BUILDER_NAME = "resources"; public ResourcesBuilder() { + super(BuilderCategory.TRANSLATOR); } @Override @@ -32,16 +32,6 @@ public class ResourcesBuilder extends ModuleLevelBuilder { } public ExitCode build(final CompileContext context, ModuleChunk chunk) throws ProjectBuildException { - CompilerConfiguration config = null; - for (Module module : chunk.getModules()) { - config = module.getProject().getCompilerConfiguration(); - break; - } - - if (config == null) { - return ExitCode.OK; - } - ResourcePatterns patterns = ResourcePatterns.KEY.get(context); if (patterns == null) { ResourcePatterns.KEY.set(context, patterns = new ResourcePatterns(context.getProject())); From 56dabbf37902f221783f8c6d6a7113f5fb5de917 Mon Sep 17 00:00:00 2001 From: peter Date: Tue, 7 Feb 2012 11:00:55 +0100 Subject: [PATCH 085/215] relax whole word criterion --- .../lang-impl/src/com/intellij/find/impl/FindManagerImpl.java | 1 + 1 file changed, 1 insertion(+) diff --git a/platform/lang-impl/src/com/intellij/find/impl/FindManagerImpl.java b/platform/lang-impl/src/com/intellij/find/impl/FindManagerImpl.java index 8b4ef8400f58..4047bd1c4e07 100644 --- a/platform/lang-impl/src/com/intellij/find/impl/FindManagerImpl.java +++ b/platform/lang-impl/src/com/intellij/find/impl/FindManagerImpl.java @@ -316,6 +316,7 @@ public class FindManagerImpl extends FindManager implements PersistentStateCompo private static boolean isWholeWord(CharSequence text, int startOffset, int endOffset) { boolean isWordStart = startOffset == 0 || !Character.isJavaIdentifierPart(text.charAt(startOffset - 1)) || + !Character.isJavaIdentifierPart(text.charAt(startOffset)) || startOffset > 1 && text.charAt(startOffset - 2) == '\\'; boolean isWordEnd = endOffset == text.length() || From 466e61a43d21f310709299d7a552c12fd623f5da Mon Sep 17 00:00:00 2001 From: peter Date: Tue, 7 Feb 2012 11:17:17 +0100 Subject: [PATCH 086/215] present a correct scope in show usages action, not just 'project files' always --- .../find/actions/ShowUsagesAction.java | 28 ++++++++++--------- .../find/findUsages/FindUsagesManager.java | 13 ++------- 2 files changed, 17 insertions(+), 24 deletions(-) diff --git a/platform/lang-impl/src/com/intellij/find/actions/ShowUsagesAction.java b/platform/lang-impl/src/com/intellij/find/actions/ShowUsagesAction.java index fa52ac698e9b..80ead536ae99 100644 --- a/platform/lang-impl/src/com/intellij/find/actions/ShowUsagesAction.java +++ b/platform/lang-impl/src/com/intellij/find/actions/ShowUsagesAction.java @@ -20,11 +20,9 @@ import com.intellij.codeInsight.hint.HintManager; import com.intellij.codeInsight.hint.HintUtil; import com.intellij.featureStatistics.FeatureUsageTracker; import com.intellij.find.FindManager; -import com.intellij.find.findUsages.AbstractFindUsagesDialog; -import com.intellij.find.findUsages.FindUsagesHandler; -import com.intellij.find.findUsages.FindUsagesManager; -import com.intellij.find.findUsages.PsiElement2UsageTargetAdapter; +import com.intellij.find.findUsages.*; import com.intellij.find.impl.FindManagerImpl; +import com.intellij.ide.DataManager; import com.intellij.openapi.Disposable; import com.intellij.openapi.actionSystem.*; import com.intellij.openapi.actionSystem.ex.ActionManagerEx; @@ -225,14 +223,15 @@ public class ShowUsagesAction extends AnAction implements PopupAction { } }; FindUsagesManager findUsagesManager = ((FindManagerImpl)FindManager.getInstance(handler.getProject())).getFindUsagesManager(); - presentation = findUsagesManager.processUsages(handler, collect); + FindUsagesOptions options = handler.getFindUsagesOptions(DataManager.getInstance().getDataContext()); + presentation = findUsagesManager.processUsages(handler, collect, options); if (presentation == null) { Disposer.dispose(usageView); return; } final String title = presentation.getTabText(); - JBPopup popup = createUsagePopup(usages, visibleNodes, title, handler, editor, popupPosition, maxUsages, usageView); + JBPopup popup = createUsagePopup(usages, visibleNodes, title, handler, editor, popupPosition, maxUsages, usageView, options); if (popup == null) { Disposer.dispose(usageView); } @@ -301,9 +300,9 @@ public class ShowUsagesAction extends AnAction implements PopupAction { } } - private static String searchScopePresentableName(final FindUsagesHandler handler) { - SearchScope searchScope = FindUsagesManager.getCurrentSearchScope(handler); - if (searchScope == null) searchScope = ProjectScope.getAllScope(handler.getProject()); + private static String searchScopePresentableName(FindUsagesOptions options, Project project) { + SearchScope searchScope = options.searchScope; + if (searchScope == null) searchScope = ProjectScope.getAllScope(project); return searchScope.getDisplayName(); } @@ -314,14 +313,15 @@ public class ShowUsagesAction extends AnAction implements PopupAction { final Editor editor, final RelativePoint popupPosition, final int maxUsages, - final UsageViewImpl usageView) { + final UsageViewImpl usageView, FindUsagesOptions options) { boolean hasMore = visibleNodes.remove(UsageViewImpl.NULL_NODE); final Project project = handler.getProject(); if (visibleNodes.isEmpty()) { if (usages.isEmpty()) { - String text = UsageViewBundle.message("no.usages.found.in", searchScopePresentableName(handler)); + String text = UsageViewBundle.message("no.usages.found.in", searchScopePresentableName(options, + project)); showHint(text, editor, popupPosition, handler, maxUsages); return null; } @@ -332,7 +332,8 @@ public class ShowUsagesAction extends AnAction implements PopupAction { if (visibleNodes.size() == 1 && usages.size() == 1) { //the only usage Usage usage = visibleNodes.iterator().next().getUsage(); - navigateAndHint(usage, UsageViewBundle.message("show.usages.only.usage", searchScopePresentableName(handler)), handler, popupPosition, + navigateAndHint(usage, UsageViewBundle.message("show.usages.only.usage", + searchScopePresentableName(options, project)), handler, popupPosition, maxUsages); return null; } @@ -340,7 +341,8 @@ public class ShowUsagesAction extends AnAction implements PopupAction { // usage view can filter usages down to one Usage usage = visibleNodes.iterator().next().getUsage(); if (areAllUsagesInThisLine(usage, usages)) { - String hint = UsageViewBundle.message("all.usages.are.in.this.line", usages.size(), searchScopePresentableName(handler)); + String hint = UsageViewBundle.message("all.usages.are.in.this.line", usages.size(), + searchScopePresentableName(options, project)); navigateAndHint(usage, hint, handler, popupPosition, maxUsages); return null; } diff --git a/platform/lang-impl/src/com/intellij/find/findUsages/FindUsagesManager.java b/platform/lang-impl/src/com/intellij/find/findUsages/FindUsagesManager.java index 2103f229738b..1682455dfe00 100644 --- a/platform/lang-impl/src/com/intellij/find/findUsages/FindUsagesManager.java +++ b/platform/lang-impl/src/com/intellij/find/findUsages/FindUsagesManager.java @@ -20,7 +20,6 @@ import com.intellij.codeInsight.hint.HintManager; import com.intellij.codeInsight.hint.HintManagerImpl; import com.intellij.codeInsight.hint.HintUtil; import com.intellij.find.FindBundle; -import com.intellij.ide.DataManager; import com.intellij.lang.findUsages.LanguageFindUsages; import com.intellij.navigation.NavigationItem; import com.intellij.openapi.actionSystem.ActionManager; @@ -273,13 +272,6 @@ public class FindUsagesManager implements JDOMExternalizable { } } - @Nullable - public static SearchScope getCurrentSearchScope(FindUsagesHandler handler) { - if (handler == null) return null; - FindUsagesOptions findUsagesOptions = handler.getFindUsagesOptions(); - return findUsagesOptions.searchScope; - } - public boolean isUsed(@NotNull PsiElement element, @NotNull FindUsagesOptions findUsagesOptions) { FindUsagesHandler handler = getFindUsagesHandler(element, true); if (handler == null) return false; @@ -298,11 +290,10 @@ public class FindUsagesManager implements JDOMExternalizable { // return null on failure or cancel @Nullable - public UsageViewPresentation processUsages(FindUsagesHandler handler, @NotNull final Processor processor) { + public UsageViewPresentation processUsages(FindUsagesHandler handler, + @NotNull final Processor processor, FindUsagesOptions findUsagesOptions) { if (handler == null) return null; - FindUsagesOptions findUsagesOptions = handler.getFindUsagesOptions(DataManager.getInstance().getDataContext()); - PsiElement element = handler.getPsiElement(); LOG.assertTrue(element.isValid()); final UsageInfoToUsageConverter.TargetElementsDescriptor descriptor = From 92826cc037c33c2426d009ad51144d16162cc11a Mon Sep 17 00:00:00 2001 From: peter Date: Tue, 7 Feb 2012 12:03:03 +0100 Subject: [PATCH 087/215] make comm&it mnemonic in todo checkin handler work --- .../platform-api/src/com/intellij/openapi/ui/Messages.java | 2 +- .../platform-resources-en/src/messages/VcsBundle.properties | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/platform/platform-api/src/com/intellij/openapi/ui/Messages.java b/platform/platform-api/src/com/intellij/openapi/ui/Messages.java index c8fd287a42f5..e6c97ca5db6a 100644 --- a/platform/platform-api/src/com/intellij/openapi/ui/Messages.java +++ b/platform/platform-api/src/com/intellij/openapi/ui/Messages.java @@ -906,7 +906,7 @@ public class Messages { for (int i = 0; i < myOptions.length; i++) { String option = myOptions[i]; final int exitCode = i; - actions[i] = new AbstractAction(option) { + actions[i] = new AbstractAction(UIUtil.replaceMnemonicAmpersand(option)) { public void actionPerformed(ActionEvent e) { close(exitCode, true); } diff --git a/platform/platform-resources-en/src/messages/VcsBundle.properties b/platform/platform-resources-en/src/messages/VcsBundle.properties index 18c5c7972d28..335d1dcfe0d3 100644 --- a/platform/platform-resources-en/src/messages/VcsBundle.properties +++ b/platform/platform-resources-en/src/messages/VcsBundle.properties @@ -92,7 +92,7 @@ action.name.checkin.directory={0} Directory action.name.checkin.file={0} File action.name.checkin.directories={0} Directories action.name.checkin.files={0} Files -action.name.commit.project=Comm_it Changes +action.name.commit.project=Comm&it Changes column.name.revision.list.author=Author column.name.revisions.list.filter=Date column.name.revisions.list.branch=Branch @@ -269,7 +269,7 @@ changes.newchangelist.warning.already.exists.title=Wrong Changelist Name commit.dialog.no.changes.detected.text=No changes detected commit.dialog.no.changes.detected.title=Nothing to commit commit.dialog.title=Commit Changes -commit.dialog.default.commit.operation.name=Comm_it +commit.dialog.default.commit.operation.name=Comm&it commit.dialog.include.action.name=Include into commit commit.dialog.failed.commit.template=Failed commit: {0} commit.dialog.completed.successfully=Completed successfully From 7a2328f863d58ddc69ff9456c1a64c0f451110e8 Mon Sep 17 00:00:00 2001 From: irengrig Date: Tue, 7 Feb 2012 15:18:39 +0400 Subject: [PATCH 088/215] SVN 1.7: up to 114.999 --- plugins/svn4idea/src/META-INF/plugin.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/svn4idea/src/META-INF/plugin.xml b/plugins/svn4idea/src/META-INF/plugin.xml index 64653a3b78f4..5d762cdd1cc5 100644 --- a/plugins/svn4idea/src/META-INF/plugin.xml +++ b/plugins/svn4idea/src/META-INF/plugin.xml @@ -3,7 +3,7 @@ Subversion 1.7 1.0.1 VCS Integration - + Version 1.0.1 - Added an option for a status operation to be executed with command line client. (for performance reasons) This plugin provides only basic support for Subversion 1.7. Some operations are not implemented. From d8e83a1fdbfde3d13750b7ccca880f4646174d10 Mon Sep 17 00:00:00 2001 From: Konstantin Bulenkov Date: Tue, 7 Feb 2012 12:22:30 +0100 Subject: [PATCH 089/215] don't set focus to preferred component on every activation --- .../com/intellij/openapi/ui/impl/DialogWrapperPeerImpl.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/platform/platform-impl/src/com/intellij/openapi/ui/impl/DialogWrapperPeerImpl.java b/platform/platform-impl/src/com/intellij/openapi/ui/impl/DialogWrapperPeerImpl.java index d3e4871fe115..e4d4b75d5fb6 100644 --- a/platform/platform-impl/src/com/intellij/openapi/ui/impl/DialogWrapperPeerImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/ui/impl/DialogWrapperPeerImpl.java @@ -491,6 +491,7 @@ public class DialogWrapperPeerImpl extends DialogWrapperPeer implements FocusTra private Dimension myInitialSize; private String myDimensionServiceKey; private boolean myOpened = false; + private boolean myActivated = false; private FocusTrackback myFocusTrackback; private MyDialog.MyWindowListener myWindowListener; @@ -896,7 +897,10 @@ public class DialogWrapperPeerImpl extends DialogWrapperPeer implements FocusTra return; } - + if (myActivated) { + return; + } + myActivated = true; JComponent toFocus = wrapper == null ? null : wrapper.getPreferredFocusedComponent(); if (toFocus == null) { toFocus = getRootPane().getDefaultButton(); From cf3d60eb8ba163127f1851e97aa29229ca17f7c7 Mon Sep 17 00:00:00 2001 From: Dmitry Jemerov Date: Mon, 6 Feb 2012 19:44:41 +0100 Subject: [PATCH 090/215] toolbar button to clear console contents (IDEA-80849) --- .../intellij/execution/impl/ConsoleViewImpl.java | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/platform/lang-impl/src/com/intellij/execution/impl/ConsoleViewImpl.java b/platform/lang-impl/src/com/intellij/execution/impl/ConsoleViewImpl.java index 39e3f980d4df..e9c60bb92039 100644 --- a/platform/lang-impl/src/com/intellij/execution/impl/ConsoleViewImpl.java +++ b/platform/lang-impl/src/com/intellij/execution/impl/ConsoleViewImpl.java @@ -985,7 +985,7 @@ public class ConsoleViewImpl extends JPanel implements ConsoleView, ObservableCo public static class ClearAllAction extends DumbAwareAction { public ClearAllAction() { - super(ExecutionBundle.message("clear.all.from.console.action.name")); + super(ExecutionBundle.message("clear.all.from.console.action.name"), "Clear the contents of the console", IconLoader.findIcon("/actions/gc.png")); } @Override @@ -1356,21 +1356,20 @@ public class ConsoleViewImpl extends JPanel implements ConsoleView, ObservableCo final AnAction autoScrollToTheEndAction = new ScrollToTheEndToolbarAction(myEditor); //Initializing custom actions - final AnAction[] consoleActions = new AnAction[4 + customActions.size()]; + final AnAction[] consoleActions = new AnAction[5 + customActions.size()]; consoleActions[0] = prevAction; consoleActions[1] = nextAction; consoleActions[2] = switchSoftWrapsAction; consoleActions[3] = autoScrollToTheEndAction; + consoleActions[4] = new ClearAllAction(); //consoleActions[4] = new ShowRecentlyChanged(); for (int i = 0; i < customActions.size(); ++i) { - consoleActions[i + 4] = customActions.get(i); + consoleActions[i + 5] = customActions.get(i); } ConsoleActionsPostProcessor[] postProcessors = Extensions.getExtensions(ConsoleActionsPostProcessor.EP_NAME); AnAction[] result = consoleActions; - if (postProcessors != null) { - for (ConsoleActionsPostProcessor postProcessor : postProcessors) { - result = postProcessor.postProcess(this, result); - } + for (ConsoleActionsPostProcessor postProcessor : postProcessors) { + result = postProcessor.postProcess(this, result); } return result; } From fe3b2801ac53180c9b68044c8d5b0f5e95f03faa Mon Sep 17 00:00:00 2001 From: anna Date: Tue, 7 Feb 2012 12:34:26 +0100 Subject: [PATCH 091/215] enable installed dependant plugins (IDEA-77377) --- .../ide/plugins/ActionInstallPlugin.java | 77 ++++++++++++++++--- 1 file changed, 67 insertions(+), 10 deletions(-) diff --git a/platform/platform-impl/src/com/intellij/ide/plugins/ActionInstallPlugin.java b/platform/platform-impl/src/com/intellij/ide/plugins/ActionInstallPlugin.java index 292b75d536f8..cad6d94b8e2a 100644 --- a/platform/platform-impl/src/com/intellij/ide/plugins/ActionInstallPlugin.java +++ b/platform/platform-impl/src/com/intellij/ide/plugins/ActionInstallPlugin.java @@ -32,15 +32,14 @@ import com.intellij.openapi.project.DumbAware; import com.intellij.openapi.ui.DialogWrapper; import com.intellij.openapi.ui.Messages; import com.intellij.openapi.util.IconLoader; +import com.intellij.openapi.util.text.StringUtil; +import com.intellij.util.Function; import com.intellij.util.net.IOExceptionDialog; import org.jetbrains.annotations.NotNull; import javax.swing.event.HyperlinkEvent; import java.io.IOException; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.HashSet; -import java.util.Set; +import java.util.*; /** * @author lloix @@ -121,19 +120,23 @@ public class ActionInstallPlugin extends AnAction implements DumbAware { getPluginTable().updateUI(); final InstalledPluginsTableModel pluginsModel = (InstalledPluginsTableModel)installed.getPluginsModel(); final Set disabled = new HashSet(); + final Set disabledDependants = new HashSet(); for (PluginNode node : list) { final PluginId pluginId = node.getPluginId(); if (pluginsModel.isDisabled(pluginId)) { disabled.add(node); } - } - if (!disabled.isEmpty()) { - String message = "Updated plugin" + (disabled.size() > 1 ? "s are " : " is ") + "disabled. Would you like to enable " + (disabled.size() > 1 ? "them" : "it") + "?"; - if (Messages.showOkCancelDialog(host.pluginTable, message, CommonBundle.getWarningTitle(), Messages.getQuestionIcon()) == - DialogWrapper.OK_EXIT_CODE) { - pluginsModel.enableRows(disabled.toArray(new IdeaPluginDescriptor[disabled.size()]), true); + final List depends = node.getDepends(); + if (depends != null) { + for (PluginId dependantId : depends) { + final IdeaPluginDescriptor pluginDescriptor = PluginManager.getPlugin(dependantId); + if (pluginDescriptor != null && pluginsModel.isDisabled(dependantId)) { + disabledDependants.add(pluginDescriptor); + } + } } } + suggestToEnableInstalledPlugins(pluginsModel, disabled, disabledDependants, list); } else { notifyPluginsWereInstalled(); @@ -150,6 +153,60 @@ public class ActionInstallPlugin extends AnAction implements DumbAware { } } + private static void suggestToEnableInstalledPlugins(final InstalledPluginsTableModel pluginsModel, + final Set disabled, + final Set disabledDependants, + final ArrayList list) { + if (!disabled.isEmpty() || !disabledDependants.isEmpty()) { + String message = ""; + if (disabled.size() == 1) { + message = "Updated plugin '" + disabled.iterator().next().getName() + "' is disabled"; + } else if (!disabled.isEmpty()) { + message = "Updated plugins " + StringUtil.join(disabled, new Function() { + @Override + public String fun(IdeaPluginDescriptor pluginDescriptor) { + return pluginDescriptor.getName(); + } + }, ", ") + " are disabled."; + } + + if (!disabledDependants.isEmpty()) { + if (!message.isEmpty()) { + message += "\n"; + } + message += "Updated plugin" + (list.size() > 1 ? "s depend " : " depends ") + "on disabled"; + if (disabledDependants.size() == 1) { + message += " plugin '" + disabledDependants.iterator().next().getName() + "'."; + } else { + message += " plugins " + StringUtil.join(disabledDependants, new Function() { + @Override + public String fun(IdeaPluginDescriptor pluginDescriptor) { + return pluginDescriptor.getName(); + } + }, ", ") + "."; + } + } + message += "\nWould you like to enable plugins with dependencies?"; + + int result; + if (!disabled.isEmpty() && !disabledDependants.isEmpty()) { + result = + Messages.showYesNoCancelDialog(message, CommonBundle.getWarningTitle(), "Enable all", + "Enable updated plugin" + (disabled.size() > 1 ? "s" : ""), CommonBundle.getCancelButtonText(), + Messages.getQuestionIcon()); + } else { + result = Messages.showOkCancelDialog(message, CommonBundle.getWarningTitle(), "Enable", CommonBundle.getCancelButtonText(), Messages.getQuestionIcon()); + } + + if (result == DialogWrapper.OK_EXIT_CODE) { + disabled.addAll(disabledDependants); + pluginsModel.enableRows(disabled.toArray(new IdeaPluginDescriptor[disabled.size()]), true); + } else if (result == DialogWrapper.CANCEL_EXIT_CODE && !disabled.isEmpty()) { + pluginsModel.enableRows(disabled.toArray(new IdeaPluginDescriptor[disabled.size()]), true); + } + } + } + private void installedPluginsToModel(ArrayList list) { for (PluginNode pluginNode : list) { final String idString = pluginNode.getPluginId().getIdString(); From 1c66c3318fe1e0716ce2d4b46c4561fb392ebb8b Mon Sep 17 00:00:00 2001 From: anna Date: Tue, 7 Feb 2012 13:21:41 +0100 Subject: [PATCH 092/215] should not highlight stacktraces with vcs annotations when settings is off --- .../src/com/intellij/execution/filters/CompositeFilter.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platform/lang-api/src/com/intellij/execution/filters/CompositeFilter.java b/platform/lang-api/src/com/intellij/execution/filters/CompositeFilter.java index 335b039546b4..4c77cbbf99ee 100644 --- a/platform/lang-api/src/com/intellij/execution/filters/CompositeFilter.java +++ b/platform/lang-api/src/com/intellij/execution/filters/CompositeFilter.java @@ -70,7 +70,7 @@ public class CompositeFilter implements Filter, FilterMixin { //noinspection ForLoopReplaceableByForEach for (int i = 0; i < count; i++) { Filter filter = filters.get(i); - if (! (filter instanceof FilterMixin)) continue; + if (! (filter instanceof FilterMixin) || !((FilterMixin)filter).shouldRunHeavy()) continue; if (!dumb || DumbService.isDumbAware(filter)) { ((FilterMixin) filter).applyHeavyFilter(copiedFragment, startOffset, startLineNumber, consumer); } From 50c3584fe64eb2f37e5d2d5e4c387817b3fe5481 Mon Sep 17 00:00:00 2001 From: Dmitry Avdeev Date: Tue, 7 Feb 2012 16:24:10 +0400 Subject: [PATCH 093/215] IDEA-80841: "Organize import" deletes xsi:schemeLocation mark as unsed because xmlns redefine for element --- .../impl/analysis/XmlUnusedNamespaceInspection.java | 8 +++++--- .../src/com/intellij/xml/util/XmlRefCountHolder.java | 11 +++++++++++ 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/xml/impl/src/com/intellij/codeInsight/daemon/impl/analysis/XmlUnusedNamespaceInspection.java b/xml/impl/src/com/intellij/codeInsight/daemon/impl/analysis/XmlUnusedNamespaceInspection.java index c49be1b8653f..ca59bb366f21 100644 --- a/xml/impl/src/com/intellij/codeInsight/daemon/impl/analysis/XmlUnusedNamespaceInspection.java +++ b/xml/impl/src/com/intellij/codeInsight/daemon/impl/analysis/XmlUnusedNamespaceInspection.java @@ -127,9 +127,11 @@ public class XmlUnusedNamespaceInspection extends XmlSuppressableInspectionTool private static void checkUnusedLocations(XmlAttribute attribute, ProblemsHolder holder) { if (XmlUtil.XML_SCHEMA_INSTANCE_URI.equals(attribute.getNamespace())) { + XmlRefCountHolder refCountHolder = XmlRefCountHolder.getRefCountHolder(attribute); + if (refCountHolder == null) return; + if (XmlUtil.NO_NAMESPACE_SCHEMA_LOCATION_ATT.equals(attribute.getLocalName())) { - XmlRefCountHolder refCountHolder = XmlRefCountHolder.getRefCountHolder(attribute); - if (refCountHolder == null || refCountHolder.isInUse("")) return; + if (refCountHolder.isInUse("")) return; holder.registerProblem(attribute, NAMESPACE_LOCATION_IS_NEVER_USED, ProblemHighlightType.LIKE_UNUSED_SYMBOL, new RemoveNamespaceLocationFix("")); } @@ -141,7 +143,7 @@ public class XmlUnusedNamespaceInspection extends XmlSuppressableInspectionTool PsiReference reference = references[i]; if (reference instanceof URLReference) { String ns = getNamespaceFromReference(reference); - if (ArrayUtil.indexOf(attribute.getParent().knownNamespaces(), ns) == -1) { + if (ArrayUtil.indexOf(attribute.getParent().knownNamespaces(), ns) == -1 && !refCountHolder.isUsedNamespace(ns)) { if (!XmlHighlightVisitor.hasBadResolve(reference, false)) { holder.registerProblemForReference(reference, ProblemHighlightType.LIKE_UNUSED_SYMBOL, NAMESPACE_LOCATION_IS_NEVER_USED, new RemoveNamespaceLocationFix(ns)); diff --git a/xml/impl/src/com/intellij/xml/util/XmlRefCountHolder.java b/xml/impl/src/com/intellij/xml/util/XmlRefCountHolder.java index abc213158bb1..0a43ad190e36 100644 --- a/xml/impl/src/com/intellij/xml/util/XmlRefCountHolder.java +++ b/xml/impl/src/com/intellij/xml/util/XmlRefCountHolder.java @@ -68,6 +68,7 @@ public class XmlRefCountHolder { private final Set myAdditionallyDeclaredIds = new HashSet(); private final Set myDoNotValidateParentsList = new HashSet(); private final Set myUsedPrefixes = new HashSet(); + private final Set myUsedNamespaces = new HashSet(); @Nullable public static XmlRefCountHolder getRefCountHolder(final XmlElement element) { @@ -140,6 +141,10 @@ public class XmlRefCountHolder { return myUsedPrefixes.contains(prefix); } + public boolean isUsedNamespace(String ns) { + return myUsedNamespaces.contains(ns); + } + private static class IdGatheringRecursiveVisitor extends XmlRecursiveElementVisitor { private final XmlRefCountHolder myHolder; @@ -192,6 +197,7 @@ public class XmlRefCountHolder { @Override public void visitXmlTag(XmlTag tag) { myHolder.addUsedPrefix(tag.getNamespacePrefix()); + myHolder.addUsedNamespace(tag.getNamespace()); String text = tag.getValue().getTrimmedText(); detectPrefix(text); super.visitXmlTag(tag); @@ -202,6 +208,7 @@ public class XmlRefCountHolder { if (!attribute.isNamespaceDeclaration()) { myHolder.addUsedPrefix(attribute.getNamespacePrefix()); } + myHolder.addUsedNamespace(attribute.getNamespace()); super.visitXmlAttribute(attribute); } @@ -269,4 +276,8 @@ public class XmlRefCountHolder { private void addUsedPrefix(String prefix) { myUsedPrefixes.add(prefix); } + + private void addUsedNamespace(String ns) { + myUsedNamespaces.add(ns); + } } From c57106d068174ccdb0fd4e3b8eedcc50961a5a69 Mon Sep 17 00:00:00 2001 From: Dmitry Jemerov Date: Tue, 7 Feb 2012 13:34:41 +0100 Subject: [PATCH 094/215] cleanup --- .../com/intellij/openapi/updateSettings/impl/UpdateChecker.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platform/platform-impl/src/com/intellij/openapi/updateSettings/impl/UpdateChecker.java b/platform/platform-impl/src/com/intellij/openapi/updateSettings/impl/UpdateChecker.java index 4df44f1f95c7..476dde4d0714 100644 --- a/platform/platform-impl/src/com/intellij/openapi/updateSettings/impl/UpdateChecker.java +++ b/platform/platform-impl/src/com/intellij/openapi/updateSettings/impl/UpdateChecker.java @@ -175,7 +175,7 @@ public final class UpdateChecker { if (installedPlugin != null) { if (StringUtil.compareVersionNumbers(loadedPlugin.getVersion(), installedPlugin.getVersion()) > 0) { updateSettings.myOutdatedPlugins.add(idString); - if (((IdeaPluginDescriptorImpl)installedPlugin).isEnabled()) { + if (installedPlugin.isEnabled()) { final PluginDownloader downloader = PluginDownloader.createDownloader(loadedPlugin); if (downloader.prepareToInstall()) { downloaded.add(downloader); From e169f65fb0ea42322dfa9f709ebf0d4a757635f8 Mon Sep 17 00:00:00 2001 From: Sergey Evdokimov Date: Tue, 7 Feb 2012 16:45:10 +0400 Subject: [PATCH 095/215] IDEA-80779 (Understand Spock mocks) --- .../groovy/spock/SpockMemberContributor.java | 37 ++++++++++++------- .../plugins/groovy/spock/SpockTest.groovy | 32 ++++++++++++++++ 2 files changed, 55 insertions(+), 14 deletions(-) diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/spock/SpockMemberContributor.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/spock/SpockMemberContributor.java index 3cad6a8569de..9061beb5ff0b 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/spock/SpockMemberContributor.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/spock/SpockMemberContributor.java @@ -8,6 +8,7 @@ import com.intellij.psi.util.PsiTreeUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.plugins.groovy.lang.psi.GroovyPsiElement; import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.members.GrMethod; +import org.jetbrains.plugins.groovy.lang.psi.impl.synthetic.GrLightMethodBuilder; import org.jetbrains.plugins.groovy.lang.resolve.NonCodeMembersContributor; import org.jetbrains.plugins.groovy.lang.resolve.ResolveUtil; import org.jetbrains.plugins.groovy.lang.resolve.processors.ClassHint; @@ -26,25 +27,33 @@ public class SpockMemberContributor extends NonCodeMembersContributor { GroovyPsiElement place, ResolveState state) { ClassHint classHint = processor.getHint(ClassHint.KEY); - if (classHint != null && !classHint.shouldProcess(ClassHint.ResolveKind.PROPERTY)) return; + if (classHint == null || classHint.shouldProcess(ClassHint.ResolveKind.PROPERTY)) { + GrMethod method = PsiTreeUtil.getParentOfType(place, GrMethod.class); + if (method == null) return; - GrMethod method = PsiTreeUtil.getParentOfType(place, GrMethod.class); - if (method == null) return; + if (aClass != method.getContainingClass()) return; - if (aClass != method.getContainingClass()) return; + Map cachedValue = SpockUtils.getVariableMap(method); - Map cachedValue = SpockUtils.getVariableMap(method); - - String nameHint = ResolveUtil.getNameHint(processor); - if (nameHint == null) { - for (SpockVariableDescriptor spockVar : cachedValue.values()) { - if (!processor.execute(spockVar.getVariable(), state)) return; + String nameHint = ResolveUtil.getNameHint(processor); + if (nameHint == null) { + for (SpockVariableDescriptor spockVar : cachedValue.values()) { + if (!processor.execute(spockVar.getVariable(), state)) return; + } + } + else { + SpockVariableDescriptor spockVar = cachedValue.get(nameHint); + if (spockVar != null && spockVar.getNavigationElement() != place) { + if (!processor.execute(spockVar.getVariable(), state)) return; + } } } - else { - SpockVariableDescriptor spockVar = cachedValue.get(nameHint); - if (spockVar != null && spockVar.getNavigationElement() != place) { - if (!processor.execute(spockVar.getVariable(), state)) return; + + if (classHint == null || classHint.shouldProcess(ClassHint.ResolveKind.METHOD)) { + if ("get_".equals(ResolveUtil.getNameHint(processor))) { + GrLightMethodBuilder m = new GrLightMethodBuilder(aClass.getManager(), "get_"); + m.setReturnType(null); + if (!processor.execute(m, state)) return; } } } diff --git a/plugins/groovy/test/org/jetbrains/plugins/groovy/spock/SpockTest.groovy b/plugins/groovy/test/org/jetbrains/plugins/groovy/spock/SpockTest.groovy index af6500eb819d..526c9ba3825c 100644 --- a/plugins/groovy/test/org/jetbrains/plugins/groovy/spock/SpockTest.groovy +++ b/plugins/groovy/test/org/jetbrains/plugins/groovy/spock/SpockTest.groovy @@ -7,6 +7,8 @@ import com.intellij.psi.PsiFile import com.intellij.psi.PsiVariable import com.intellij.psi.CommonClassNames +import org.jetbrains.plugins.groovy.codeInspection.assignment.GroovyAssignabilityCheckInspection +import org.jetbrains.plugins.groovy.codeInspection.untypedUnresolvedAccess.GroovyUnresolvedAccessInspection /** * @author Sergey Evdokimov @@ -198,5 +200,35 @@ class FooSpec extends spock.lang.Specification { assertEmpty("Some completion variants are missed", missedVariants); } + public void testVariable_resolved() { + myFixture.enableInspections(GroovyAssignabilityCheckInspection, GroovyUnresolvedAccessInspection) + + myFixture.configureByText("FooSpec.groovy", """ +class FooSpec extends spock.lang.Specification { + def "foo test"() { + String subscriber = Mock() + then: (0.._) * subscriber.concat(_) + subscriber.concat(asdasdasd) + subscriber.concat(23) + } +} +""") + + myFixture.checkHighlighting(true, false, true) + } + + public void testVariable_NotExistingInCompletion() { + myFixture.configureByText("FooSpec.groovy", """ +class FooSpec extends spock.lang.Specification { + def "foo test"() { + String subscriber = Mock() + then: (0.._) * subscriber.concat() + } +} +""") + myFixture.completeBasic() + def elements = myFixture.getLookupElementStrings() + assert !elements.contains("_") + } } From 75654a3490c8383b01fd27479c19f99b5f7e9b95 Mon Sep 17 00:00:00 2001 From: Serega Vasiliev Date: Tue, 7 Feb 2012 13:44:01 +0100 Subject: [PATCH 096/215] fixed NPE --- .../com/intellij/execution/ui/RunContentManagerImpl.java | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/platform/lang-impl/src/com/intellij/execution/ui/RunContentManagerImpl.java b/platform/lang-impl/src/com/intellij/execution/ui/RunContentManagerImpl.java index 0a6f6b508feb..7cbabe09b65e 100644 --- a/platform/lang-impl/src/com/intellij/execution/ui/RunContentManagerImpl.java +++ b/platform/lang-impl/src/com/intellij/execution/ui/RunContentManagerImpl.java @@ -48,6 +48,7 @@ import com.intellij.openapi.wm.ToolWindowManager; import com.intellij.openapi.wm.ex.ToolWindowManagerAdapter; import com.intellij.openapi.wm.ex.ToolWindowManagerEx; import com.intellij.ui.content.*; +import com.intellij.ui.content.impl.ContentImpl; import com.intellij.ui.docking.DockManager; import com.intellij.util.concurrency.Semaphore; import com.intellij.util.containers.ContainerUtil; @@ -279,13 +280,11 @@ public class RunContentManagerImpl implements RunContentManager, Disposable { getSyncPublisher().contentRemoved(oldDescriptor, executor); oldDescriptor.dispose(); // is of the same category, can be reused } - else if (descriptor.getAttachedContent() == null) { + else { content = createNewContent(contentManager, descriptor, executor); final Icon icon = descriptor.getIcon(); content.setIcon(icon == null ? executor.getToolWindowIcon() : icon); - } else { - content = descriptor.getAttachedContent(); - } + } content.setComponent(descriptor.getComponent()); content.putUserData(DESCRIPTOR_KEY, descriptor); From 9e26fb03b38c3fc59eb1fa748fbc43489e6ed8b6 Mon Sep 17 00:00:00 2001 From: Serega Vasiliev Date: Tue, 7 Feb 2012 14:13:04 +0100 Subject: [PATCH 097/215] Hibernate 4 Console --- .../com/intellij/execution/ui/RunContentManagerImpl.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/platform/lang-impl/src/com/intellij/execution/ui/RunContentManagerImpl.java b/platform/lang-impl/src/com/intellij/execution/ui/RunContentManagerImpl.java index 7cbabe09b65e..a9db26f1d957 100644 --- a/platform/lang-impl/src/com/intellij/execution/ui/RunContentManagerImpl.java +++ b/platform/lang-impl/src/com/intellij/execution/ui/RunContentManagerImpl.java @@ -280,11 +280,13 @@ public class RunContentManagerImpl implements RunContentManager, Disposable { getSyncPublisher().contentRemoved(oldDescriptor, executor); oldDescriptor.dispose(); // is of the same category, can be reused } - else { + else if (descriptor.getAttachedContent() == null || !descriptor.getAttachedContent().isValid() ) { content = createNewContent(contentManager, descriptor, executor); final Icon icon = descriptor.getIcon(); content.setIcon(icon == null ? executor.getToolWindowIcon() : icon); - } + } else { + content = descriptor.getAttachedContent(); + } content.setComponent(descriptor.getComponent()); content.putUserData(DESCRIPTOR_KEY, descriptor); From ff04f2e32a19ac4a66b4f258055a9997c8fa3942 Mon Sep 17 00:00:00 2001 From: "Gregory.Shrago" Date: Tue, 7 Feb 2012 17:25:46 +0300 Subject: [PATCH 098/215] EA-33560 - PIEAE: PsiElementBase.getContainingFile --- .../org/intellij/lang/regexp/psi/impl/RegExpElementImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/RegExpSupport/src/org/intellij/lang/regexp/psi/impl/RegExpElementImpl.java b/RegExpSupport/src/org/intellij/lang/regexp/psi/impl/RegExpElementImpl.java index 9b96b95d7b5f..f0befa3c0287 100644 --- a/RegExpSupport/src/org/intellij/lang/regexp/psi/impl/RegExpElementImpl.java +++ b/RegExpSupport/src/org/intellij/lang/regexp/psi/impl/RegExpElementImpl.java @@ -49,7 +49,7 @@ public abstract class RegExpElementImpl extends ASTWrapperPsiElement implements } public String toString() { - return getClass().getSimpleName() + ": <" + getUnescapedText() + ">"; + return getClass().getSimpleName() + ": <" + getText() + ">"; } public void accept(@NotNull PsiElementVisitor visitor) { From 381599fbac1960f2938cd3c7b863162c3ec81eb4 Mon Sep 17 00:00:00 2001 From: Sergey Simonchik Date: Tue, 7 Feb 2012 18:02:29 +0400 Subject: [PATCH 099/215] method isToolEnabled(HighlightDisplayKey key) for tests --- .../intellij/codeInsight/daemon/DaemonAnalyzerTestCase.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/java/testFramework/src/com/intellij/codeInsight/daemon/DaemonAnalyzerTestCase.java b/java/testFramework/src/com/intellij/codeInsight/daemon/DaemonAnalyzerTestCase.java index 968bc4192614..53f1c6b6583e 100644 --- a/java/testFramework/src/com/intellij/codeInsight/daemon/DaemonAnalyzerTestCase.java +++ b/java/testFramework/src/com/intellij/codeInsight/daemon/DaemonAnalyzerTestCase.java @@ -147,6 +147,11 @@ public abstract class DaemonAnalyzerTestCase extends CodeInsightTestCase { @Override public boolean isToolEnabled(HighlightDisplayKey key, PsiElement element) { + return isToolEnabled(key); + } + + @Override + public boolean isToolEnabled(HighlightDisplayKey key) { return key != null && myAvailableTools.containsKey(key.toString()); } From 08605431fdd1eebe661f985cc955104dd69a1cee Mon Sep 17 00:00:00 2001 From: Konstantin Bulenkov Date: Tue, 7 Feb 2012 15:15:22 +0100 Subject: [PATCH 100/215] timeout stuff --- .../intellij/util/FunctionWithTimeout.java | 36 ++++++++++++ .../src/com/intellij/util/TimeoutUtil.java | 57 +++++++++++++++++++ 2 files changed, 93 insertions(+) create mode 100644 platform/util/src/com/intellij/util/FunctionWithTimeout.java create mode 100644 platform/util/src/com/intellij/util/TimeoutUtil.java diff --git a/platform/util/src/com/intellij/util/FunctionWithTimeout.java b/platform/util/src/com/intellij/util/FunctionWithTimeout.java new file mode 100644 index 000000000000..a712f6482d3c --- /dev/null +++ b/platform/util/src/com/intellij/util/FunctionWithTimeout.java @@ -0,0 +1,36 @@ +/* + * Copyright 2000-2012 JetBrains s.r.o. + * + * 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. + */ +package com.intellij.util; + +import org.jetbrains.annotations.NotNull; + +/** + * @author Konstantin Bulenkov + */ +public abstract class FunctionWithTimeout { + protected abstract void updateValue(T initialValue); + + @NotNull + public T calculate(long timeout, @NotNull final T initialValue) { + TimeoutUtil.executeWithTimeout(timeout, new Runnable() { + @Override + public void run() { + updateValue(initialValue); + } + }); + return initialValue; + } +} diff --git a/platform/util/src/com/intellij/util/TimeoutUtil.java b/platform/util/src/com/intellij/util/TimeoutUtil.java new file mode 100644 index 000000000000..ac9b66d8e240 --- /dev/null +++ b/platform/util/src/com/intellij/util/TimeoutUtil.java @@ -0,0 +1,57 @@ +/* + * Copyright 2000-2012 JetBrains s.r.o. + * + * 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. + */ +package com.intellij.util; + +import org.jetbrains.annotations.NotNull; + +import java.util.concurrent.atomic.AtomicBoolean; + +/** + * + * + * @author Konstantin Bulenkov + */ +public final class TimeoutUtil { + public static void executeWithTimeout(long timeout, long sleep, @NotNull final Runnable run) { + final long start = System.currentTimeMillis(); + final AtomicBoolean done = new AtomicBoolean(false); + final Thread thread = new Thread("Fast Function Thread@" + run.hashCode()) { + @Override + public void run() { + run.run(); + done.set(true); + } + }; + thread.start(); + + while (!done.get() && System.currentTimeMillis() - start < timeout) { + try { + //noinspection BusyWait + Thread.sleep(sleep); + } catch (InterruptedException e) { + break; + } + } + if (!thread.isInterrupted()) { + //noinspection deprecation + thread.stop(); + } + } + + public static void executeWithTimeout(long timeout, @NotNull final Runnable run) { + executeWithTimeout(timeout, 50, run); + } +} From bbbe3c31f5f04dd729ff7fb97b0df0ec367c9e77 Mon Sep 17 00:00:00 2001 From: Dmitry Jemerov Date: Tue, 7 Feb 2012 15:29:15 +0100 Subject: [PATCH 101/215] IDEA 11.1 --- community-resources/src/idea/IdeaApplicationInfo.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/community-resources/src/idea/IdeaApplicationInfo.xml b/community-resources/src/idea/IdeaApplicationInfo.xml index 1e8dbaf004d0..c70c794af50f 100644 --- a/community-resources/src/idea/IdeaApplicationInfo.xml +++ b/community-resources/src/idea/IdeaApplicationInfo.xml @@ -1,5 +1,5 @@ - + From dadb5a3bccac06e3a4fa651d2a101ac65f617dbb Mon Sep 17 00:00:00 2001 From: Dmitry Jemerov Date: Tue, 7 Feb 2012 15:40:33 +0100 Subject: [PATCH 102/215] separate update channel for this EAP --- community-resources/src/idea/IdeaApplicationInfo.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/community-resources/src/idea/IdeaApplicationInfo.xml b/community-resources/src/idea/IdeaApplicationInfo.xml index c70c794af50f..6127d59b9959 100644 --- a/community-resources/src/idea/IdeaApplicationInfo.xml +++ b/community-resources/src/idea/IdeaApplicationInfo.xml @@ -1,5 +1,5 @@ - + From 063d690e63b539b265eeaa9cc5b405b80e6ed574 Mon Sep 17 00:00:00 2001 From: Alexander Lobas Date: Tue, 7 Feb 2012 19:01:38 +0400 Subject: [PATCH 103/215] Module structure for new UI Designer --- plugins/android-designer/android-designer.iml | 27 ++++++++++++++++ .../android-designer/src/META-INF/plugin.xml | 10 ++++++ .../messages/AndroidDesignerBundle.properties | 0 .../swing-designer/src/META-INF/plugin.xml | 9 ++++++ .../messages/SwingDesignerBundle.properties | 0 plugins/swing-designer/swing-designer.iml | 31 +++++++++++++++++++ 6 files changed, 77 insertions(+) create mode 100644 plugins/android-designer/android-designer.iml create mode 100644 plugins/android-designer/src/META-INF/plugin.xml create mode 100644 plugins/android-designer/src/messages/AndroidDesignerBundle.properties create mode 100644 plugins/swing-designer/src/META-INF/plugin.xml create mode 100644 plugins/swing-designer/src/messages/SwingDesignerBundle.properties create mode 100644 plugins/swing-designer/swing-designer.iml diff --git a/plugins/android-designer/android-designer.iml b/plugins/android-designer/android-designer.iml new file mode 100644 index 000000000000..ddad786717bb --- /dev/null +++ b/plugins/android-designer/android-designer.iml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/plugins/android-designer/src/META-INF/plugin.xml b/plugins/android-designer/src/META-INF/plugin.xml new file mode 100644 index 000000000000..d7a2c911ecc7 --- /dev/null +++ b/plugins/android-designer/src/META-INF/plugin.xml @@ -0,0 +1,10 @@ + + Android Designer + com.intellij.android-designer + JetBrains + messages.AndroidDesignerBundle + com.intellij.java-i18n + com.intellij.properties + org.jetbrains.android + com.intellij.uiDesigner + diff --git a/plugins/android-designer/src/messages/AndroidDesignerBundle.properties b/plugins/android-designer/src/messages/AndroidDesignerBundle.properties new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/plugins/swing-designer/src/META-INF/plugin.xml b/plugins/swing-designer/src/META-INF/plugin.xml new file mode 100644 index 000000000000..7159d40459dc --- /dev/null +++ b/plugins/swing-designer/src/META-INF/plugin.xml @@ -0,0 +1,9 @@ + + Swing Designer + com.intellij.swing-designer + JetBrains + messages.SwingDesignerBundle + com.intellij.java-i18n + com.intellij.properties + com.intellij.uiDesigner + diff --git a/plugins/swing-designer/src/messages/SwingDesignerBundle.properties b/plugins/swing-designer/src/messages/SwingDesignerBundle.properties new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/plugins/swing-designer/swing-designer.iml b/plugins/swing-designer/swing-designer.iml new file mode 100644 index 000000000000..d77bfc09c235 --- /dev/null +++ b/plugins/swing-designer/swing-designer.iml @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From 9e43a15489adb27bf3a14cccd15ad401c32b6a16 Mon Sep 17 00:00:00 2001 From: "Maxim.Mossienko" Date: Tue, 7 Feb 2012 19:22:12 +0400 Subject: [PATCH 104/215] - do not scan words when token is expected to have no words (e.g. whitespace) - skip filterlexer creation when indexing --- .../cache/impl/idCache/JavaFilterLexer.java | 25 ++++++++++++++--- .../cache/impl/idCache/JavaIdIndexer.java | 5 +--- .../src/com/intellij/lexer/JavaLexer.java | 11 +++----- .../src/com/intellij/lexer/DelegateLexer.java | 2 +- .../cacheBuilder/DefaultWordsScanner.java | 25 +++++++++++++---- .../groovy/highlighter/GroovyTodoIndexer.java | 5 +--- .../impl/idCache/PropertiesIdIndexer.java | 9 +------ .../cache/impl/idCache/XHtmlFilterLexer.java | 7 ++--- .../cache/impl/idCache/XmlFilterLexer.java | 27 ++++++++++++++++--- 9 files changed, 77 insertions(+), 39 deletions(-) diff --git a/java/java-impl/src/com/intellij/psi/impl/cache/impl/idCache/JavaFilterLexer.java b/java/java-impl/src/com/intellij/psi/impl/cache/impl/idCache/JavaFilterLexer.java index d803bdaec1c9..4ecc16fc6986 100644 --- a/java/java-impl/src/com/intellij/psi/impl/cache/impl/idCache/JavaFilterLexer.java +++ b/java/java-impl/src/com/intellij/psi/impl/cache/impl/idCache/JavaFilterLexer.java @@ -22,18 +22,37 @@ import com.intellij.psi.impl.cache.impl.OccurrenceConsumer; import com.intellij.psi.impl.source.tree.ElementType; import com.intellij.psi.search.UsageSearchContext; import com.intellij.psi.tree.IElementType; +import com.intellij.psi.tree.TokenSet; /** * @author ven */ public class JavaFilterLexer extends BaseFilterLexer { + private static final TokenSet ourSkipWordsScanSet = TokenSet.orSet( + TokenSet.create( + JavaTokenType.WHITE_SPACE, + JavaTokenType.LPARENTH, + JavaTokenType.RPARENTH, + JavaTokenType.LBRACE, + JavaTokenType.RBRACE, + JavaTokenType.LBRACKET, + JavaTokenType.RBRACKET, + JavaTokenType.SEMICOLON, + JavaTokenType.COMMA, + JavaTokenType.DOT, + JavaTokenType.ELLIPSIS, + JavaTokenType.AT + ), + JavaTokenType.OPERATION_BIT_SET + ); + public JavaFilterLexer(final Lexer originalLexer, final OccurrenceConsumer table) { super(originalLexer, table); } @Override public void advance() { - final IElementType tokenType = getDelegate().getTokenType(); + final IElementType tokenType = myDelegate.getTokenType(); if (tokenType == JavaTokenType.IDENTIFIER || tokenType == JavaTokenType.LONG_LITERAL @@ -48,10 +67,10 @@ public class JavaFilterLexer extends BaseFilterLexer { scanWordsInToken(UsageSearchContext.IN_COMMENTS, false, false); advanceTodoItemCountsInToken(); } - else { + else if (!ourSkipWordsScanSet.contains(tokenType)) { scanWordsInToken(UsageSearchContext.IN_PLAIN_TEXT, false, false); } - getDelegate().advance(); + myDelegate.advance(); } } diff --git a/java/java-impl/src/com/intellij/psi/impl/cache/impl/idCache/JavaIdIndexer.java b/java/java-impl/src/com/intellij/psi/impl/cache/impl/idCache/JavaIdIndexer.java index 8522ed2d8105..1b0898a48e52 100644 --- a/java/java-impl/src/com/intellij/psi/impl/cache/impl/idCache/JavaIdIndexer.java +++ b/java/java-impl/src/com/intellij/psi/impl/cache/impl/idCache/JavaIdIndexer.java @@ -15,13 +15,11 @@ */ package com.intellij.psi.impl.cache.impl.idCache; -import com.intellij.lexer.FilterLexer; import com.intellij.lexer.JavaLexer; import com.intellij.lexer.Lexer; import com.intellij.pom.java.LanguageLevel; import com.intellij.psi.impl.cache.impl.OccurrenceConsumer; import com.intellij.psi.impl.cache.impl.id.LexerBasedIdIndexer; -import com.intellij.psi.impl.source.tree.StdTokenSets; public class JavaIdIndexer extends LexerBasedIdIndexer { @Override @@ -31,7 +29,6 @@ public class JavaIdIndexer extends LexerBasedIdIndexer { public static Lexer createIndexingLexer(OccurrenceConsumer consumer) { final JavaLexer javaLexer = new JavaLexer(LanguageLevel.JDK_1_3); - final JavaFilterLexer filterLexer = new JavaFilterLexer(javaLexer, consumer); - return new FilterLexer(filterLexer, new FilterLexer.SetFilter(StdTokenSets.WHITE_SPACE_OR_COMMENT_BIT_SET)); + return new JavaFilterLexer(javaLexer, consumer); } } diff --git a/java/java-psi-impl/src/com/intellij/lexer/JavaLexer.java b/java/java-psi-impl/src/com/intellij/lexer/JavaLexer.java index e4f4b3d83899..cee9feac4a2d 100644 --- a/java/java-psi-impl/src/com/intellij/lexer/JavaLexer.java +++ b/java/java-psi-impl/src/com/intellij/lexer/JavaLexer.java @@ -196,7 +196,7 @@ public class JavaLexer extends LexerBase { @Override public final IElementType getTokenType() { - locateToken(); + if (myTokenType == null) _locateToken(); return myTokenType; } @@ -208,22 +208,17 @@ public class JavaLexer extends LexerBase { @Override public final int getTokenEnd() { - locateToken(); + if (myTokenType == null) _locateToken(); return myTokenEndOffset; } @Override public final void advance() { - locateToken(); + if (myTokenType == null) _locateToken(); myTokenType = null; } - protected final void locateToken() { - if (myTokenType != null) return; - _locateToken(); - } - private void _locateToken() { if (myTokenEndOffset == myBufferEndOffset) { myTokenType = null; diff --git a/platform/core-api/src/com/intellij/lexer/DelegateLexer.java b/platform/core-api/src/com/intellij/lexer/DelegateLexer.java index e2ca198886fb..4b95562b6189 100644 --- a/platform/core-api/src/com/intellij/lexer/DelegateLexer.java +++ b/platform/core-api/src/com/intellij/lexer/DelegateLexer.java @@ -23,7 +23,7 @@ import com.intellij.psi.tree.IElementType; import org.jetbrains.annotations.Nullable; public class DelegateLexer extends LexerBase { - private final Lexer myDelegate; + protected final Lexer myDelegate; public DelegateLexer(Lexer delegate) { myDelegate = delegate; diff --git a/platform/lang-api/src/com/intellij/lang/cacheBuilder/DefaultWordsScanner.java b/platform/lang-api/src/com/intellij/lang/cacheBuilder/DefaultWordsScanner.java index 8f777e4864c9..3661f0524d16 100644 --- a/platform/lang-api/src/com/intellij/lang/cacheBuilder/DefaultWordsScanner.java +++ b/platform/lang-api/src/com/intellij/lang/cacheBuilder/DefaultWordsScanner.java @@ -19,6 +19,7 @@ import com.intellij.lexer.Lexer; import com.intellij.psi.tree.IElementType; import com.intellij.psi.tree.TokenSet; import com.intellij.util.Processor; +import org.jetbrains.annotations.NotNull; /** * The default implementation of a words scanner based on a custom language lexer. @@ -31,6 +32,7 @@ public class DefaultWordsScanner implements WordsScanner { private final TokenSet myIdentifierTokenSet; private final TokenSet myCommentTokenSet; private final TokenSet myLiteralTokenSet; + private final TokenSet mySkipCodeContextTokenSet; private boolean myMayHaveFileRefsInLiterals; /** @@ -43,18 +45,33 @@ public class DefaultWordsScanner implements WordsScanner { */ public DefaultWordsScanner(final Lexer lexer, final TokenSet identifierTokenSet, final TokenSet commentTokenSet, final TokenSet literalTokenSet) { + this(lexer, identifierTokenSet, commentTokenSet, literalTokenSet, TokenSet.EMPTY); + } + + /** + * Creates a new instance of the words scanner. + * + * @param lexer the lexer used for breaking the text into tokens. + * @param identifierTokenSet the set of token types which represent identifiers. + * @param commentTokenSet the set of token types which represent comments. + * @param literalTokenSet the set of token types which represent literals. + * @param SkipCodeContextTokenSet the set of token types which should not be considered as code context. + */ + public DefaultWordsScanner(final Lexer lexer, final TokenSet identifierTokenSet, final TokenSet commentTokenSet, + final TokenSet literalTokenSet, @NotNull TokenSet skipCodeContextTokenSet) { myLexer = lexer; myIdentifierTokenSet = identifierTokenSet; myCommentTokenSet = commentTokenSet; myLiteralTokenSet = literalTokenSet; + mySkipCodeContextTokenSet = skipCodeContextTokenSet; } public void processWords(CharSequence fileText, Processor processor) { myLexer.start(fileText); WordOccurrence occurrence = null; // shared occurrence - while (myLexer.getTokenType() != null) { - final IElementType type = myLexer.getTokenType(); + IElementType type; + while ((type = myLexer.getTokenType()) != null) { if (myIdentifierTokenSet.contains(type)) { if (occurrence == null) { occurrence = new WordOccurrence(fileText, myLexer.getTokenStart(), myLexer.getTokenEnd(), WordOccurrence.Kind.CODE); @@ -70,9 +87,7 @@ public class DefaultWordsScanner implements WordsScanner { else if (myLiteralTokenSet.contains(type)) { if (!stripWords(processor, fileText, myLexer.getTokenStart(),myLexer.getTokenEnd(),WordOccurrence.Kind.LITERALS,occurrence, myMayHaveFileRefsInLiterals)) return; } - else { - // process all word-like characters as words - // Plugin writers may have (Maximka in JavaScript especially) some keyword token types omitted from the identifierTokenSet + else if (!mySkipCodeContextTokenSet.contains(type)) { if (!stripWords(processor, fileText, myLexer.getTokenStart(), myLexer.getTokenEnd(), WordOccurrence.Kind.CODE, occurrence, false)) return; } myLexer.advance(); diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/highlighter/GroovyTodoIndexer.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/highlighter/GroovyTodoIndexer.java index 0ebf01cbb7c6..c9daf9280738 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/highlighter/GroovyTodoIndexer.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/highlighter/GroovyTodoIndexer.java @@ -15,13 +15,11 @@ */ package org.jetbrains.plugins.groovy.highlighter; -import com.intellij.lexer.FilterLexer; import com.intellij.lexer.Lexer; import com.intellij.psi.impl.cache.impl.OccurrenceConsumer; import com.intellij.psi.impl.cache.impl.todo.LexerBasedTodoIndexer; import org.jetbrains.plugins.groovy.lang.lexer.GroovyFilterLexer; import org.jetbrains.plugins.groovy.lang.lexer.GroovyLexer; -import org.jetbrains.plugins.groovy.lang.lexer.TokenSets; /** * @author Maxim.Medvedev @@ -29,7 +27,6 @@ import org.jetbrains.plugins.groovy.lang.lexer.TokenSets; public class GroovyTodoIndexer extends LexerBasedTodoIndexer { @Override public Lexer createLexer(OccurrenceConsumer consumer) { - final GroovyFilterLexer groovyFilterLexer = new GroovyFilterLexer(new GroovyLexer(), consumer); - return new FilterLexer(groovyFilterLexer, new FilterLexer.SetFilter(TokenSets.WHITE_SPACES_OR_COMMENTS)); + return new GroovyFilterLexer(new GroovyLexer(), consumer); } } diff --git a/plugins/properties/src/com/intellij/psi/impl/cache/impl/idCache/PropertiesIdIndexer.java b/plugins/properties/src/com/intellij/psi/impl/cache/impl/idCache/PropertiesIdIndexer.java index 112c77d3a7fc..4224983fc769 100644 --- a/plugins/properties/src/com/intellij/psi/impl/cache/impl/idCache/PropertiesIdIndexer.java +++ b/plugins/properties/src/com/intellij/psi/impl/cache/impl/idCache/PropertiesIdIndexer.java @@ -16,26 +16,19 @@ package com.intellij.psi.impl.cache.impl.idCache; import com.intellij.lang.properties.parsing.PropertiesLexer; -import com.intellij.lexer.FilterLexer; import com.intellij.lexer.Lexer; -import com.intellij.psi.TokenType; import com.intellij.psi.impl.cache.impl.OccurrenceConsumer; import com.intellij.psi.impl.cache.impl.id.LexerBasedIdIndexer; -import com.intellij.psi.tree.TokenSet; /** * @author Maxim.Mossienko */ public class PropertiesIdIndexer extends LexerBasedIdIndexer { - private static TokenSet WHITE_SPACE_SET = TokenSet.create(TokenType.WHITE_SPACE); - public Lexer createLexer(final OccurrenceConsumer consumer) { return createIndexingLexer(consumer); } static Lexer createIndexingLexer(OccurrenceConsumer consumer) { - final PropertiesFilterLexer propsLexer = - new PropertiesFilterLexer(new PropertiesLexer(), consumer); - return new FilterLexer(propsLexer, new FilterLexer.SetFilter(WHITE_SPACE_SET)); + return new PropertiesFilterLexer(new PropertiesLexer(), consumer); } } diff --git a/xml/impl/src/com/intellij/psi/impl/cache/impl/idCache/XHtmlFilterLexer.java b/xml/impl/src/com/intellij/psi/impl/cache/impl/idCache/XHtmlFilterLexer.java index d25652c781b3..075c8b9bbc2b 100644 --- a/xml/impl/src/com/intellij/psi/impl/cache/impl/idCache/XHtmlFilterLexer.java +++ b/xml/impl/src/com/intellij/psi/impl/cache/impl/idCache/XHtmlFilterLexer.java @@ -32,7 +32,7 @@ public class XHtmlFilterLexer extends BaseFilterLexer { } public void advance() { - final IElementType tokenType = getDelegate().getTokenType(); + final IElementType tokenType = myDelegate.getTokenType(); if (tokenType == XmlElementType.XML_COMMENT_CHARACTERS) { scanWordsInToken(UsageSearchContext.IN_COMMENTS, false, false); @@ -51,11 +51,12 @@ public class XHtmlFilterLexer extends BaseFilterLexer { false); if (inComments) advanceTodoItemCountsInToken(); - } else { + } + else if (!XmlFilterLexer.ourNoWordsTokenSet.contains(tokenType)) { scanWordsInToken(UsageSearchContext.IN_PLAIN_TEXT, false, false); } - getDelegate().advance(); + myDelegate.advance(); } } diff --git a/xml/impl/src/com/intellij/psi/impl/cache/impl/idCache/XmlFilterLexer.java b/xml/impl/src/com/intellij/psi/impl/cache/impl/idCache/XmlFilterLexer.java index 8809d088d223..e8e75da3c8bc 100644 --- a/xml/impl/src/com/intellij/psi/impl/cache/impl/idCache/XmlFilterLexer.java +++ b/xml/impl/src/com/intellij/psi/impl/cache/impl/idCache/XmlFilterLexer.java @@ -16,20 +16,41 @@ package com.intellij.psi.impl.cache.impl.idCache; import com.intellij.lexer.Lexer; +import com.intellij.psi.TokenType; import com.intellij.psi.impl.cache.impl.BaseFilterLexer; import com.intellij.psi.impl.cache.impl.OccurrenceConsumer; import com.intellij.psi.search.UsageSearchContext; import com.intellij.psi.tree.IElementType; +import com.intellij.psi.tree.TokenSet; import com.intellij.psi.xml.XmlElementType; +import com.intellij.psi.xml.XmlTokenType; public class XmlFilterLexer extends BaseFilterLexer { + static final TokenSet ourNoWordsTokenSet = TokenSet.create( + XmlTokenType.TAG_WHITE_SPACE, + TokenType.WHITE_SPACE, + XmlTokenType.XML_REAL_WHITE_SPACE, + XmlTokenType.XML_EQ, + XmlTokenType.XML_ATTRIBUTE_VALUE_START_DELIMITER, + XmlTokenType.XML_ATTRIBUTE_VALUE_END_DELIMITER, + XmlTokenType.XML_START_TAG_START, + XmlTokenType.XML_EMPTY_ELEMENT_END, + XmlTokenType.XML_END_TAG_START, + XmlTokenType.XML_TAG_END, + XmlTokenType.XML_DOCTYPE_END, + XmlTokenType.XML_COMMENT_START, + XmlTokenType.XML_COMMENT_END, + XmlTokenType.XML_PI_START, + XmlTokenType.XML_PI_END, + XmlTokenType.XML_CDATA_END + ); public XmlFilterLexer(Lexer originalLexer, OccurrenceConsumer table) { super(originalLexer, table); } public void advance() { - final IElementType tokenType = getDelegate().getTokenType(); + final IElementType tokenType = myDelegate.getTokenType(); if (tokenType == XmlElementType.XML_COMMENT_CHARACTERS) { scanWordsInToken(UsageSearchContext.IN_COMMENTS, false, false); @@ -48,10 +69,10 @@ public class XmlFilterLexer extends BaseFilterLexer { else if (tokenType == XmlElementType.XML_TEXT) { scanWordsInToken(UsageSearchContext.IN_PLAIN_TEXT | UsageSearchContext.IN_FOREIGN_LANGUAGES, false, false); } - else { + else if (!ourNoWordsTokenSet.contains(tokenType)) { scanWordsInToken(UsageSearchContext.IN_PLAIN_TEXT, false, false); } - getDelegate().advance(); + myDelegate.advance(); } } From 46cfd05608dec63b5e7ce6263f91848bfb624069 Mon Sep 17 00:00:00 2001 From: Maxim Shafirov Date: Tue, 7 Feb 2012 19:41:05 +0400 Subject: [PATCH 105/215] Rollback as it didn't work out anyway and causes problem testing in mixed env. --- .../src/com/intellij/core/CoreEnvironment.java | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/platform/core-impl/src/com/intellij/core/CoreEnvironment.java b/platform/core-impl/src/com/intellij/core/CoreEnvironment.java index 8957f43309fe..e754d84607d6 100644 --- a/platform/core-impl/src/com/intellij/core/CoreEnvironment.java +++ b/platform/core-impl/src/com/intellij/core/CoreEnvironment.java @@ -83,12 +83,10 @@ public class CoreEnvironment { myEncodingRegistry = new CoreEncodingRegistry(); myApplication = new MockApplication(parentDisposable); - if (ApplicationManager.getApplication() == null) { - ApplicationManager.setApplication(myApplication, - new StaticGetter(myFileTypeRegistry), - new StaticGetter(myEncodingRegistry), - parentDisposable); - } + ApplicationManager.setApplication(myApplication, + new StaticGetter(myFileTypeRegistry), + new StaticGetter(myEncodingRegistry), + parentDisposable); myLocalFileSystem = new CoreLocalFileSystem(); myJarFileSystem = new CoreJarFileSystem(); From f3d00912e3ef7b2915956e44aa89efe2af7734c2 Mon Sep 17 00:00:00 2001 From: peter Date: Tue, 7 Feb 2012 14:28:18 +0100 Subject: [PATCH 106/215] autopopup shouldn't prevent from entering an non-imported class name in code fragments --- .../com/intellij/codeInsight/completion/JavaCharFilter.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/java/java-impl/src/com/intellij/codeInsight/completion/JavaCharFilter.java b/java/java-impl/src/com/intellij/codeInsight/completion/JavaCharFilter.java index 8f8449945e4b..f8d3bdb8e7a0 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/JavaCharFilter.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/JavaCharFilter.java @@ -28,6 +28,7 @@ import com.intellij.codeInsight.lookup.CharFilter; import com.intellij.codeInsight.lookup.Lookup; import com.intellij.codeInsight.lookup.LookupElement; import com.intellij.codeInsight.lookup.impl.LookupImpl; +import com.intellij.lang.java.JavaLanguage; import com.intellij.patterns.PsiJavaPatterns; import com.intellij.psi.*; import com.intellij.psi.javadoc.PsiDocComment; @@ -84,7 +85,7 @@ public class JavaCharFilter extends CharFilter { public Result acceptChar(char c, final int prefixLength, final Lookup lookup) { if (!lookup.isCompletion()) return null; - if (!(lookup.getPsiFile() instanceof PsiJavaFile)) { + if (!lookup.getPsiFile().getLanguage().isKindOf(JavaLanguage.INSTANCE)) { return null; } From af0be0eae1092f6d720226c0c6b7f8af2f0035cc Mon Sep 17 00:00:00 2001 From: peter Date: Tue, 7 Feb 2012 15:23:55 +0100 Subject: [PATCH 107/215] don't redefine application in PathMacroManagerTest --- .../impl/ModulePathMacroManager.java | 4 ++- .../impl/ApplicationPathMacroManager.java | 3 ++ .../components/impl/BasePathMacroManager.java | 6 ++++ .../impl/ProjectPathMacroManager.java | 7 +++-- .../components/impl/PathMacroManagerTest.java | 29 +++++++------------ 5 files changed, 27 insertions(+), 22 deletions(-) diff --git a/platform/lang-impl/src/com/intellij/openapi/components/impl/ModulePathMacroManager.java b/platform/lang-impl/src/com/intellij/openapi/components/impl/ModulePathMacroManager.java index 693ebd26d06a..8136ae66517c 100644 --- a/platform/lang-impl/src/com/intellij/openapi/components/impl/ModulePathMacroManager.java +++ b/platform/lang-impl/src/com/intellij/openapi/components/impl/ModulePathMacroManager.java @@ -18,6 +18,7 @@ package com.intellij.openapi.components.impl; import com.intellij.application.options.PathMacrosImpl; import com.intellij.application.options.ReplacePathToMacroMap; +import com.intellij.openapi.application.PathMacros; import com.intellij.openapi.components.ExpandMacroToPathMap; import com.intellij.openapi.components.PathMacroMap; import com.intellij.openapi.module.Module; @@ -29,7 +30,8 @@ import java.io.File; public class ModulePathMacroManager extends BasePathMacroManager { private final Module myModule; - public ModulePathMacroManager(final Module module) { + public ModulePathMacroManager(PathMacros pathMacros, Module module) { + super(pathMacros); myModule = module; } diff --git a/platform/platform-impl/src/com/intellij/openapi/components/impl/ApplicationPathMacroManager.java b/platform/platform-impl/src/com/intellij/openapi/components/impl/ApplicationPathMacroManager.java index 134708f38230..1a93f02aff2f 100644 --- a/platform/platform-impl/src/com/intellij/openapi/components/impl/ApplicationPathMacroManager.java +++ b/platform/platform-impl/src/com/intellij/openapi/components/impl/ApplicationPathMacroManager.java @@ -19,4 +19,7 @@ package com.intellij.openapi.components.impl; * @author mike */ public class ApplicationPathMacroManager extends BasePathMacroManager { + public ApplicationPathMacroManager() { + super(null); + } } diff --git a/platform/platform-impl/src/com/intellij/openapi/components/impl/BasePathMacroManager.java b/platform/platform-impl/src/com/intellij/openapi/components/impl/BasePathMacroManager.java index c2bd7334b432..cb0c74515555 100644 --- a/platform/platform-impl/src/com/intellij/openapi/components/impl/BasePathMacroManager.java +++ b/platform/platform-impl/src/com/intellij/openapi/components/impl/BasePathMacroManager.java @@ -17,6 +17,7 @@ package com.intellij.openapi.components.impl; import com.intellij.application.options.PathMacrosImpl; import com.intellij.application.options.ReplacePathToMacroMap; +import com.intellij.openapi.application.PathMacros; import com.intellij.openapi.components.ExpandMacroToPathMap; import com.intellij.openapi.components.PathMacroManager; import com.intellij.openapi.components.PathMacroMap; @@ -34,6 +35,11 @@ import java.util.*; public class BasePathMacroManager extends PathMacroManager { private PathMacrosImpl myPathMacros; + + public BasePathMacroManager(@Nullable PathMacros pathMacros) { + myPathMacros = (PathMacrosImpl)pathMacros; + } + protected static void addFileHierarchyReplacements(ReplacePathToMacroMap result, String variableName, @Nullable String _path, @Nullable String stopAt) { diff --git a/platform/platform-impl/src/com/intellij/openapi/components/impl/ProjectPathMacroManager.java b/platform/platform-impl/src/com/intellij/openapi/components/impl/ProjectPathMacroManager.java index 1c9f79824353..e5ea2c207571 100644 --- a/platform/platform-impl/src/com/intellij/openapi/components/impl/ProjectPathMacroManager.java +++ b/platform/platform-impl/src/com/intellij/openapi/components/impl/ProjectPathMacroManager.java @@ -17,10 +17,10 @@ package com.intellij.openapi.components.impl; import com.intellij.application.options.PathMacrosImpl; import com.intellij.application.options.ReplacePathToMacroMap; +import com.intellij.openapi.application.PathMacros; import com.intellij.openapi.components.ExpandMacroToPathMap; import com.intellij.openapi.components.PathMacroMap; import com.intellij.openapi.project.Project; -import com.intellij.openapi.project.ex.ProjectEx; import com.intellij.openapi.util.text.StringUtil; import com.intellij.openapi.vfs.VirtualFile; import org.jetbrains.annotations.Nullable; @@ -28,9 +28,10 @@ import org.jetbrains.annotations.Nullable; import java.io.File; public class ProjectPathMacroManager extends BasePathMacroManager { - private final ProjectEx myProject; + private final Project myProject; - public ProjectPathMacroManager(final ProjectEx project) { + public ProjectPathMacroManager(PathMacros pathMacros, Project project) { + super(pathMacros); myProject = project; } diff --git a/platform/platform-tests/testSrc/com/intellij/openapi/components/impl/PathMacroManagerTest.java b/platform/platform-tests/testSrc/com/intellij/openapi/components/impl/PathMacroManagerTest.java index 47e6857aeabb..4d7ee34cd7d1 100644 --- a/platform/platform-tests/testSrc/com/intellij/openapi/components/impl/PathMacroManagerTest.java +++ b/platform/platform-tests/testSrc/com/intellij/openapi/components/impl/PathMacroManagerTest.java @@ -3,15 +3,12 @@ package com.intellij.openapi.components.impl; import com.intellij.application.options.PathMacrosImpl; import com.intellij.application.options.ReplacePathToMacroMap; import com.intellij.mock.MockFileSystem; -import com.intellij.openapi.Disposable; -import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.application.ModalityState; import com.intellij.openapi.application.PathMacros; import com.intellij.openapi.application.PathManager; import com.intellij.openapi.application.ex.ApplicationEx; import com.intellij.openapi.module.Module; import com.intellij.openapi.project.ex.ProjectEx; -import com.intellij.openapi.util.Disposer; import com.intellij.openapi.util.SystemInfo; import com.intellij.openapi.util.text.StringUtil; import com.intellij.openapi.vfs.VirtualFile; @@ -19,6 +16,7 @@ import com.intellij.util.SystemProperties; import com.intellij.util.io.fs.FileSystem; import com.intellij.util.io.fs.IFileSystem; import org.hamcrest.Description; +import org.jetbrains.annotations.Nullable; import org.jmock.Expectations; import org.jmock.Mockery; import org.jmock.api.Action; @@ -57,7 +55,6 @@ public class PathMacroManagerTest { private IFileSystem myOldFileSystem; protected MockFileSystem myFileSystem; protected PicoContainer myAppPico; - private Disposable myDisposable = Disposer.newDisposable(); @Before public final void setupApplication() throws Exception { @@ -66,9 +63,12 @@ public class PathMacroManagerTest { context.checking(new Expectations() { { - allowing(myApplication).isUnitTestMode(); will(returnValue(false)); - allowing(myApplication).getName(); will(returnValue("IDEA")); - allowing(myApplication).getPicoContainer(); will(returnValue(myAppPico)); + allowing(myApplication).isUnitTestMode(); + will(returnValue(false)); + allowing(myApplication).getName(); + will(returnValue("IDEA")); + allowing(myApplication).getPicoContainer(); + will(returnValue(myAppPico)); //some tests leave invokeLaters after them... allowing(myApplication).invokeLater(with(any(Runnable.class)), with(any(ModalityState.class))); @@ -81,6 +81,7 @@ public class PathMacroManagerTest { } @Override + @Nullable public Object invoke(final Invocation invocation) throws Throwable { ((Runnable)invocation.getParameter(0)).run(); return null; @@ -88,8 +89,6 @@ public class PathMacroManagerTest { }); } }); - - ApplicationManager.setApplication(myApplication, myDisposable); } @Before @@ -99,12 +98,6 @@ public class PathMacroManagerTest { FileSystem.FILE_SYSTEM = myFileSystem; } - @After - public final void restoreApplication() throws Exception { - Disposer.dispose(myDisposable); - myDisposable = null; - } - @After public final void restoreFilesystem() throws Exception { FileSystem.FILE_SYSTEM = myOldFileSystem; @@ -145,7 +138,7 @@ public class PathMacroManagerTest { setUpMocks("/tmp/foo"); - final ReplacePathToMacroMap replacePathMap = new ModulePathMacroManager(myModule).getReplacePathMap(); + final ReplacePathToMacroMap replacePathMap = new ModulePathMacroManager(myPathMacros, myModule).getReplacePathMap(); final String s = mapToString(replacePathMap); assertEquals("file:/tmp/foo/module -> file:$MODULE_DIR$\n" + "file://tmp/foo/module -> file:/$MODULE_DIR$\n" + @@ -190,7 +183,7 @@ public class PathMacroManagerTest { setUpMocks("/tmp/foo"); - final ReplacePathToMacroMap replacePathMap = new ProjectPathMacroManager(myProject).getReplacePathMap(); + final ReplacePathToMacroMap replacePathMap = new ProjectPathMacroManager(myPathMacros, myProject).getReplacePathMap(); final String s = mapToString(replacePathMap); assertEquals("file:/tmp/foo -> file:$PROJECT_DIR$\n" + "file://tmp/foo -> file:/$PROJECT_DIR$\n" + @@ -228,7 +221,7 @@ public class PathMacroManagerTest { setUpMocks(USER_HOME + "/IdeaProjects/foo"); - final ReplacePathToMacroMap replacePathMap = new ModulePathMacroManager(myModule).getReplacePathMap(); + final ReplacePathToMacroMap replacePathMap = new ModulePathMacroManager(myPathMacros, myModule).getReplacePathMap(); final String s = mapToString(replacePathMap); assertEquals("file:" + USER_HOME + "/IdeaProjects/foo/module -> file:$MODULE_DIR$\n" + "file:/" + USER_HOME + "/IdeaProjects/foo/module -> file:/$MODULE_DIR$\n" + From cceddecc1414d3fa8597c651b1535f19e8eab127 Mon Sep 17 00:00:00 2001 From: peter Date: Tue, 7 Feb 2012 15:28:40 +0100 Subject: [PATCH 108/215] make platform tests java-independent --- .../openapi/editor/actions/CutLineBackwardActionTest.java | 2 +- .../intellij/openapi/editor/actions/CutLineEndActionsTest.java | 2 +- .../intellij/openapi/editor/actions/KillRegionActionTest.java | 2 +- .../intellij/openapi/editor/actions/KillRingSaveActionTest.java | 2 +- .../openapi/editor/actions/KillToWordEndActionTest.java | 2 +- .../openapi/editor/actions/KillToWordStartActionTest.java | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/platform/platform-tests/testSrc/com/intellij/openapi/editor/actions/CutLineBackwardActionTest.java b/platform/platform-tests/testSrc/com/intellij/openapi/editor/actions/CutLineBackwardActionTest.java index 734b33c352a0..d3afe5be6e5d 100644 --- a/platform/platform-tests/testSrc/com/intellij/openapi/editor/actions/CutLineBackwardActionTest.java +++ b/platform/platform-tests/testSrc/com/intellij/openapi/editor/actions/CutLineBackwardActionTest.java @@ -65,7 +65,7 @@ public class CutLineBackwardActionTest extends LightPlatformCodeInsightTestCase } private void doTest(@NotNull String before, @NotNull String after) throws IOException { - configureFromFileText(getTestName(false) + ".java", before); + configureFromFileText(getTestName(false) + ".txt", before); cutLineBackward(); checkResultByText(after); } diff --git a/platform/platform-tests/testSrc/com/intellij/openapi/editor/actions/CutLineEndActionsTest.java b/platform/platform-tests/testSrc/com/intellij/openapi/editor/actions/CutLineEndActionsTest.java index 45d232865576..e570e9d2445b 100644 --- a/platform/platform-tests/testSrc/com/intellij/openapi/editor/actions/CutLineEndActionsTest.java +++ b/platform/platform-tests/testSrc/com/intellij/openapi/editor/actions/CutLineEndActionsTest.java @@ -78,7 +78,7 @@ public class CutLineEndActionsTest extends LightPlatformCodeInsightTestCase { } private void doTest(@NotNull String before, @NotNull String after) throws IOException { - configureFromFileText(getTestName(false) + ".java", before); + configureFromFileText(getTestName(false) + ".txt", before); cutToLineEnd(); checkResultByText(after); } diff --git a/platform/platform-tests/testSrc/com/intellij/openapi/editor/actions/KillRegionActionTest.java b/platform/platform-tests/testSrc/com/intellij/openapi/editor/actions/KillRegionActionTest.java index c6168b49cc7f..818257c04443 100644 --- a/platform/platform-tests/testSrc/com/intellij/openapi/editor/actions/KillRegionActionTest.java +++ b/platform/platform-tests/testSrc/com/intellij/openapi/editor/actions/KillRegionActionTest.java @@ -29,7 +29,7 @@ import java.awt.datatransfer.Transferable; public class KillRegionActionTest extends AbstractRegionToKillRingTest { protected void doTest(@NotNull String text) throws Exception { - configureFromFileText(getTestName(false) + ".java", text); + configureFromFileText(getTestName(false) + ".txt", text); Pair parseResult = parse(); killRegion(); if (parseResult.first != null) { diff --git a/platform/platform-tests/testSrc/com/intellij/openapi/editor/actions/KillRingSaveActionTest.java b/platform/platform-tests/testSrc/com/intellij/openapi/editor/actions/KillRingSaveActionTest.java index b06f803c503e..21c9e780625b 100644 --- a/platform/platform-tests/testSrc/com/intellij/openapi/editor/actions/KillRingSaveActionTest.java +++ b/platform/platform-tests/testSrc/com/intellij/openapi/editor/actions/KillRingSaveActionTest.java @@ -29,7 +29,7 @@ import java.awt.datatransfer.Transferable; public class KillRingSaveActionTest extends AbstractRegionToKillRingTest { protected void doTest(@NotNull String text) throws Exception { - configureFromFileText(getTestName(false) + ".java", text); + configureFromFileText(getTestName(false) + ".txt", text); Pair parseResult = parse(); String textBefore = myEditor.getDocument().getText(); killRingSave(); diff --git a/platform/platform-tests/testSrc/com/intellij/openapi/editor/actions/KillToWordEndActionTest.java b/platform/platform-tests/testSrc/com/intellij/openapi/editor/actions/KillToWordEndActionTest.java index 3a069eb7b5e7..11e54f1e6f15 100644 --- a/platform/platform-tests/testSrc/com/intellij/openapi/editor/actions/KillToWordEndActionTest.java +++ b/platform/platform-tests/testSrc/com/intellij/openapi/editor/actions/KillToWordEndActionTest.java @@ -85,7 +85,7 @@ public class KillToWordEndActionTest extends LightPlatformCodeInsightTestCase { } private void doTest(@NotNull String before, @NotNull String after) throws IOException { - configureFromFileText(getTestName(false) + ".java", before); + configureFromFileText(getTestName(false) + ".txt", before); killToWordEnd(); checkResultByText(after); } diff --git a/platform/platform-tests/testSrc/com/intellij/openapi/editor/actions/KillToWordStartActionTest.java b/platform/platform-tests/testSrc/com/intellij/openapi/editor/actions/KillToWordStartActionTest.java index 099e0a5e8a0d..cb185029e100 100644 --- a/platform/platform-tests/testSrc/com/intellij/openapi/editor/actions/KillToWordStartActionTest.java +++ b/platform/platform-tests/testSrc/com/intellij/openapi/editor/actions/KillToWordStartActionTest.java @@ -85,7 +85,7 @@ public class KillToWordStartActionTest extends LightPlatformCodeInsightTestCase } private void doTest(@NotNull String before, @NotNull String after) throws IOException { - configureFromFileText(getTestName(false) + ".java", before); + configureFromFileText(getTestName(false) + ".txt", before); killToWordStart(); checkResultByText(after); } From fc557e6442ce7723cf337f55f1d50eaadf867d01 Mon Sep 17 00:00:00 2001 From: peter Date: Tue, 7 Feb 2012 15:28:56 +0100 Subject: [PATCH 109/215] move java-dependent test to java-tests --- .../impl/FoldingProcessingOnDocumentModificationTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename {platform/platform-tests => java/java-tests}/testSrc/com/intellij/openapi/editor/impl/FoldingProcessingOnDocumentModificationTest.java (97%) diff --git a/platform/platform-tests/testSrc/com/intellij/openapi/editor/impl/FoldingProcessingOnDocumentModificationTest.java b/java/java-tests/testSrc/com/intellij/openapi/editor/impl/FoldingProcessingOnDocumentModificationTest.java similarity index 97% rename from platform/platform-tests/testSrc/com/intellij/openapi/editor/impl/FoldingProcessingOnDocumentModificationTest.java rename to java/java-tests/testSrc/com/intellij/openapi/editor/impl/FoldingProcessingOnDocumentModificationTest.java index 20c7ccdb4afa..6764d070b20d 100644 --- a/platform/platform-tests/testSrc/com/intellij/openapi/editor/impl/FoldingProcessingOnDocumentModificationTest.java +++ b/java/java-tests/testSrc/com/intellij/openapi/editor/impl/FoldingProcessingOnDocumentModificationTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2010 JetBrains s.r.o. + * Copyright 2000-2012 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. From 3cc6bdd92bf68da4c8cfa41f68a9c797f84d8f8a Mon Sep 17 00:00:00 2001 From: peter Date: Tue, 7 Feb 2012 15:34:50 +0100 Subject: [PATCH 110/215] typing re( shouldn't insert return --- .../com/intellij/codeInsight/completion/JavaCharFilter.java | 3 +++ .../codeInsight/completion/JavaAutoPopupTest.groovy | 6 ++++++ .../groovy/lang/completion/GroovyReferenceCharFilter.java | 3 +++ 3 files changed, 12 insertions(+) diff --git a/java/java-impl/src/com/intellij/codeInsight/completion/JavaCharFilter.java b/java/java-impl/src/com/intellij/codeInsight/completion/JavaCharFilter.java index f8d3bdb8e7a0..d513b80f588b 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/JavaCharFilter.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/JavaCharFilter.java @@ -142,6 +142,9 @@ public class JavaCharFilter extends CharFilter { return Result.SELECT_ITEM_AND_FINISH_LOOKUP; } } + if (c == '(' && PsiKeyword.RETURN.equals(item.getLookupString())) { + return Result.HIDE_LOOKUP; + } return null; } diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/completion/JavaAutoPopupTest.groovy b/java/java-tests/testSrc/com/intellij/codeInsight/completion/JavaAutoPopupTest.groovy index ef778329e358..6d46ad532c64 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/completion/JavaAutoPopupTest.groovy +++ b/java/java-tests/testSrc/com/intellij/codeInsight/completion/JavaAutoPopupTest.groovy @@ -1215,4 +1215,10 @@ class Foo {{ } } + public void testReturnLParen() { + myFixture.configureByText 'a.java', 'class Foo { int foo() { }}' + type 're(' + myFixture.checkResult 'class Foo { int foo() { re() }}' + } + } diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/completion/GroovyReferenceCharFilter.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/completion/GroovyReferenceCharFilter.java index 998d1ac5a3fb..185e62caa2c5 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/completion/GroovyReferenceCharFilter.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/completion/GroovyReferenceCharFilter.java @@ -72,6 +72,9 @@ public class GroovyReferenceCharFilter extends CharFilter { if (c == '[') return CharFilter.Result.SELECT_ITEM_AND_FINISH_LOOKUP; if (c == '<' && item.getObject() instanceof PsiClass) return Result.SELECT_ITEM_AND_FINISH_LOOKUP; + if (c == '(' && PsiKeyword.RETURN.equals(item.getLookupString())) { + return Result.HIDE_LOOKUP; + } return null; } From 82a2aa79d0f271d0b1e9d575f7a7128df2cd323b Mon Sep 17 00:00:00 2001 From: Roman Shevchenko Date: Mon, 6 Feb 2012 19:58:19 +0100 Subject: [PATCH 111/215] More detailed 'cannot set l&f' message --- .../src/com/intellij/ide/ui/LafManagerImpl.java | 10 +++++----- .../src/messages/IdeBundle.properties | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/platform/platform-impl/src/com/intellij/ide/ui/LafManagerImpl.java b/platform/platform-impl/src/com/intellij/ide/ui/LafManagerImpl.java index 1f4fd6388ea8..1b451d63bee9 100644 --- a/platform/platform-impl/src/com/intellij/ide/ui/LafManagerImpl.java +++ b/platform/platform-impl/src/com/intellij/ide/ui/LafManagerImpl.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2011 JetBrains s.r.o. + * Copyright 2000-2012 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -308,9 +308,9 @@ public final class LafManagerImpl extends LafManager implements ApplicationCompo try { UIManager.setLookAndFeel(laf); } - catch (Exception exc) { + catch (Exception e) { Messages.showMessageDialog( - IdeBundle.message("error.cannot.set.look.and.feel", lookAndFeelInfo.getName()), + IdeBundle.message("error.cannot.set.look.and.feel", lookAndFeelInfo.getName(), e.getMessage()), CommonBundle.getErrorTitle(), Messages.getErrorIcon() ); @@ -325,9 +325,9 @@ public final class LafManagerImpl extends LafManager implements ApplicationCompo } UIManager.setLookAndFeel(laf); } - catch (Exception exc) { + catch (Exception e) { Messages.showMessageDialog( - IdeBundle.message("error.cannot.set.look.and.feel", lookAndFeelInfo.getName()), + IdeBundle.message("error.cannot.set.look.and.feel", lookAndFeelInfo.getName(), e.getMessage()), CommonBundle.getErrorTitle(), Messages.getErrorIcon() ); diff --git a/platform/platform-resources-en/src/messages/IdeBundle.properties b/platform/platform-resources-en/src/messages/IdeBundle.properties index e7945d13d573..82b6261c6940 100644 --- a/platform/platform-resources-en/src/messages/IdeBundle.properties +++ b/platform/platform-resources-en/src/messages/IdeBundle.properties @@ -633,7 +633,7 @@ checkbox.use.antialiased.font.in.editor=Use anti-aliased font # this string must start with "IDEA" idea.default.look.and.feel=IDEA (4.5 default) confirm.set.look.and.feel=&Set look and feel -error.cannot.set.look.and.feel=Cannot set {0} look and feel +error.cannot.set.look.and.feel=Cannot set {0} look and feel:
{1} warning.problem.laf.1=GTK+ look and feel is known to be problematic on a JDK prior to 1.6 b12.
Please choose another look and feel, or upgrade your JDK. More info... error.adding.action.without.icon.to.toolbar=You are adding an action without icon to the toolbar. The default icon will be added to this action. title.unable.to.add.action.without.icon.to.toolbar=Unable to add action without icon to the toolbar From 29d81bc5baf49ec90601c3b8238902e64d7f5ae2 Mon Sep 17 00:00:00 2001 From: Roman Shevchenko Date: Mon, 6 Feb 2012 19:59:56 +0100 Subject: [PATCH 112/215] Fix JGoodies L&F loading --- .../src/com/intellij/idea/IdeaApplication.java | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/platform/platform-impl/src/com/intellij/idea/IdeaApplication.java b/platform/platform-impl/src/com/intellij/idea/IdeaApplication.java index 49af8ffddc52..cdbb5a984407 100644 --- a/platform/platform-impl/src/com/intellij/idea/IdeaApplication.java +++ b/platform/platform-impl/src/com/intellij/idea/IdeaApplication.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2011 JetBrains s.r.o. + * Copyright 2000-2012 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -139,12 +139,14 @@ public class IdeaApplication { UIManager.put("Panel.opaque", Boolean.TRUE); UIManager.installLookAndFeel("Quaqua", "ch.randelshofer.quaqua.QuaquaLookAndFeel"); } - else { - UIManager.installLookAndFeel("JGoodies Plastic", "com.jgoodies.looks.plastic.PlasticLookAndFeel"); - UIManager.installLookAndFeel("JGoodies Plastic 3D", "com.jgoodies.looks.plastic.Plastic3DLookAndFeel"); - UIManager.installLookAndFeel("JGoodies Plastic XP", "com.jgoodies.looks.plastic.PlasticXPLookAndFeel"); + + if (SystemInfo.isWindows) { UIManager.installLookAndFeel("JGoodies Windows L&F", "com.jgoodies.looks.windows.WindowsLookAndFeel"); } + + UIManager.installLookAndFeel("JGoodies Plastic", "com.jgoodies.looks.plastic.PlasticLookAndFeel"); + UIManager.installLookAndFeel("JGoodies Plastic 3D", "com.jgoodies.looks.plastic.Plastic3DLookAndFeel"); + UIManager.installLookAndFeel("JGoodies Plastic XP", "com.jgoodies.looks.plastic.PlasticXPLookAndFeel"); } protected class IdeStarter implements ApplicationStarter { From 4e07e688651c2975b91eabc9a96d471785bf4f8d Mon Sep 17 00:00:00 2001 From: Roman Shevchenko Date: Mon, 6 Feb 2012 21:08:50 +0100 Subject: [PATCH 113/215] Cleanup (IDEA-79952) --- .../src/com/intellij/idea/StartupUtil.java | 17 ++++------------- 1 file changed, 4 insertions(+), 13 deletions(-) diff --git a/platform/platform-impl/src/com/intellij/idea/StartupUtil.java b/platform/platform-impl/src/com/intellij/idea/StartupUtil.java index 4280c9bcf27d..0127e75b5b8d 100644 --- a/platform/platform-impl/src/com/intellij/idea/StartupUtil.java +++ b/platform/platform-impl/src/com/intellij/idea/StartupUtil.java @@ -43,8 +43,7 @@ public class StartupUtil { @NonNls public static final String NOSPLASH = "nosplash"; - private StartupUtil() { - } + private StartupUtil() { } public static void setDefaultLAF(String laf) { myDefaultLAF = laf; @@ -73,7 +72,7 @@ public class StartupUtil { } /** - * Checks if the program can run under the JDK it was started with + * Checks if the program can run under the JDK it was started with. */ private static boolean checkJdkVersion() { if (!"true".equals(System.getProperty("idea.no.jre.check"))) { @@ -111,16 +110,8 @@ public class StartupUtil { } if (activateStatus != SocketLock.ActivateStatus.NO_INSTANCE) { - if (isHeadless()) { //team server inspections - System.out.println("Only one instance of " + ApplicationNamesInfo.getInstance().getFullProductName() + " can be run at a time."); - return false; - } - if (activateStatus == SocketLock.ActivateStatus.CANNOT_ACTIVATE) { - JOptionPane.showMessageDialog(JOptionPane.getRootFrame(), - "Only one instance of " + ApplicationNamesInfo.getInstance().getFullProductName() + - " can be run at a time.", - "Error", - JOptionPane.INFORMATION_MESSAGE); + if (isHeadless() || activateStatus == SocketLock.ActivateStatus.CANNOT_ACTIVATE) { + showError("Error", "Only one instance of " + ApplicationNamesInfo.getInstance().getFullProductName() + " can be run at a time."); } return false; } From 90ceb3e0e7aa26703f76a9774f27f6af2ea1a56f Mon Sep 17 00:00:00 2001 From: Roman Shevchenko Date: Tue, 7 Feb 2012 13:21:17 +0100 Subject: [PATCH 114/215] Cleanup --- .../vfs/newvfs/persistent/PersistentFS.java | 2 +- .../openapi/vfs/local/LocalFileSystemTest.java | 15 ++++++--------- .../testFramework/LightPlatformTestCase.java | 5 ++--- .../intellij/testFramework/PlatformTestCase.java | 5 ++--- 4 files changed, 11 insertions(+), 16 deletions(-) diff --git a/platform/platform-impl/src/com/intellij/openapi/vfs/newvfs/persistent/PersistentFS.java b/platform/platform-impl/src/com/intellij/openapi/vfs/newvfs/persistent/PersistentFS.java index 0d387162d9fc..89a949f1ff66 100644 --- a/platform/platform-impl/src/com/intellij/openapi/vfs/newvfs/persistent/PersistentFS.java +++ b/platform/platform-impl/src/com/intellij/openapi/vfs/newvfs/persistent/PersistentFS.java @@ -1101,7 +1101,7 @@ public class PersistentFS extends ManagingFS implements ApplicationComponent { } @TestOnly - public void cleanPersistedContents() { + public static void cleanPersistedContents() { try { final int[] roots = FSRecords.listRoots(); for (int root : roots) { diff --git a/platform/platform-tests/testSrc/com/intellij/openapi/vfs/local/LocalFileSystemTest.java b/platform/platform-tests/testSrc/com/intellij/openapi/vfs/local/LocalFileSystemTest.java index c6669ea819b3..3dc2dd5ef977 100644 --- a/platform/platform-tests/testSrc/com/intellij/openapi/vfs/local/LocalFileSystemTest.java +++ b/platform/platform-tests/testSrc/com/intellij/openapi/vfs/local/LocalFileSystemTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2011 JetBrains s.r.o. + * Copyright 2000-2012 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -20,10 +20,7 @@ import com.intellij.ide.GeneralSettings; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.util.SystemInfo; import com.intellij.openapi.util.io.FileUtil; -import com.intellij.openapi.vfs.LocalFileSystem; -import com.intellij.openapi.vfs.SafeWriteRequestor; -import com.intellij.openapi.vfs.VfsUtil; -import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.openapi.vfs.*; import com.intellij.openapi.vfs.newvfs.ManagingFS; import com.intellij.openapi.vfs.newvfs.persistent.PersistentFS; import com.intellij.testFramework.PlatformLangTestCase; @@ -269,13 +266,13 @@ public class LocalFileSystemTest extends PlatformLangTestCase { FileUtil.writeToFile(file, "hello"); VirtualFile virtualFile = LocalFileSystem.getInstance().refreshAndFindFileByIoFile(file); assertNotNull(virtualFile); - String s = VfsUtil.loadText(virtualFile); + String s = VfsUtilCore.loadText(virtualFile); assertEquals("hello", s); assertEquals(5, virtualFile.getLength()); FileUtil.writeToFile(file, "new content"); - ((PersistentFS)ManagingFS.getInstance()).cleanPersistedContents(); - s = VfsUtil.loadText(virtualFile); + PersistentFS.cleanPersistedContents(); + s = VfsUtilCore.loadText(virtualFile); assertEquals("new content", s); assertEquals(11, virtualFile.getLength()); } @@ -307,7 +304,7 @@ public class LocalFileSystemTest extends PlatformLangTestCase { final VirtualFile check = LocalFileSystem.getInstance().findFileByIoFile(hardLinkFile); assertNotNull(check); - assertEquals("hello", VfsUtil.loadText(check)); + assertEquals("hello", VfsUtilCore.loadText(check)); } finally { GeneralSettings.getInstance().setUseSafeWrite(safeWrite); diff --git a/platform/testFramework/src/com/intellij/testFramework/LightPlatformTestCase.java b/platform/testFramework/src/com/intellij/testFramework/LightPlatformTestCase.java index 3165c27634dc..58c841027f5d 100644 --- a/platform/testFramework/src/com/intellij/testFramework/LightPlatformTestCase.java +++ b/platform/testFramework/src/com/intellij/testFramework/LightPlatformTestCase.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2009 JetBrains s.r.o. + * Copyright 2000-2012 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -75,7 +75,6 @@ import com.intellij.openapi.vfs.VirtualFile; import com.intellij.openapi.vfs.VirtualFileManager; import com.intellij.openapi.vfs.encoding.EncodingManager; import com.intellij.openapi.vfs.encoding.EncodingManagerImpl; -import com.intellij.openapi.vfs.newvfs.ManagingFS; import com.intellij.openapi.vfs.newvfs.persistent.PersistentFS; import com.intellij.profile.codeInspection.InspectionProfileManager; import com.intellij.profile.codeInspection.InspectionProjectProfileManager; @@ -184,7 +183,7 @@ public abstract class LightPlatformTestCase extends UsefulTestCase implements Da } private static void cleanPersistedVFSContent() { - ((PersistentFS)ManagingFS.getInstance()).cleanPersistedContents(); + PersistentFS.cleanPersistedContents(); } public static boolean isLight(Project project) { diff --git a/platform/testFramework/src/com/intellij/testFramework/PlatformTestCase.java b/platform/testFramework/src/com/intellij/testFramework/PlatformTestCase.java index 867b6e25909f..7c92f6ebc3b8 100644 --- a/platform/testFramework/src/com/intellij/testFramework/PlatformTestCase.java +++ b/platform/testFramework/src/com/intellij/testFramework/PlatformTestCase.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2009 JetBrains s.r.o. + * Copyright 2000-2012 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -55,7 +55,6 @@ import com.intellij.openapi.vfs.LocalFileSystem; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.openapi.vfs.impl.VirtualFilePointerManagerImpl; import com.intellij.openapi.vfs.impl.local.LocalFileSystemImpl; -import com.intellij.openapi.vfs.newvfs.ManagingFS; import com.intellij.openapi.vfs.newvfs.impl.VirtualDirectoryImpl; import com.intellij.openapi.vfs.newvfs.persistent.PersistentFS; import com.intellij.openapi.vfs.pointers.VirtualFilePointerManager; @@ -154,7 +153,7 @@ public abstract class PlatformTestCase extends UsefulTestCase implements DataPro } private static void cleanPersistedVFSContent() { - ((PersistentFS)ManagingFS.getInstance()).cleanPersistedContents(); + PersistentFS.cleanPersistedContents(); } @Override From 3a3d65a23f80350aeae3fda4856044e72cc15118 Mon Sep 17 00:00:00 2001 From: Roman Shevchenko Date: Tue, 7 Feb 2012 16:06:38 +0100 Subject: [PATCH 115/215] Cleanup --- .../openapi/vfs/newvfs/persistent/PersistentFS.java | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/platform/platform-impl/src/com/intellij/openapi/vfs/newvfs/persistent/PersistentFS.java b/platform/platform-impl/src/com/intellij/openapi/vfs/newvfs/persistent/PersistentFS.java index 89a949f1ff66..373447631020 100644 --- a/platform/platform-impl/src/com/intellij/openapi/vfs/newvfs/persistent/PersistentFS.java +++ b/platform/platform-impl/src/com/intellij/openapi/vfs/newvfs/persistent/PersistentFS.java @@ -352,11 +352,10 @@ public class PersistentFS extends ManagingFS implements ApplicationComponent { } @Override - public void setTimeStamp(@NotNull final VirtualFile file, final long modstamp) throws IOException { + public void setTimeStamp(@NotNull final VirtualFile file, final long modStamp) throws IOException { final int id = getFileId(file); - - FSRecords.setTimestamp(id, modstamp); - getDelegate(file).setTimeStamp(file, modstamp); + FSRecords.setTimestamp(id, modStamp); + getDelegate(file).setTimeStamp(file, modStamp); } private static int getFileId(final VirtualFile file) { From 80fe39178da859811c9e5670a583558795f3a713 Mon Sep 17 00:00:00 2001 From: Roman Shevchenko Date: Tue, 7 Feb 2012 17:19:45 +0100 Subject: [PATCH 116/215] Fix Gradle toolwindow content initialization --- plugins/gradle/src/META-INF/plugin.xml | 6 +- .../gradle/bootstrap/GradleBootstrap.java | 62 ------------------- .../gradle/ui/GradleToolWindowFactory.java | 25 ++++++++ 3 files changed, 28 insertions(+), 65 deletions(-) delete mode 100644 plugins/gradle/src/org/jetbrains/plugins/gradle/bootstrap/GradleBootstrap.java create mode 100644 plugins/gradle/src/org/jetbrains/plugins/gradle/ui/GradleToolWindowFactory.java diff --git a/plugins/gradle/src/META-INF/plugin.xml b/plugins/gradle/src/META-INF/plugin.xml index ac0f7b331fd5..ca35a79bc1eb 100644 --- a/plugins/gradle/src/META-INF/plugin.xml +++ b/plugins/gradle/src/META-INF/plugin.xml @@ -48,6 +48,9 @@ + + @@ -57,9 +60,6 @@ - - org.jetbrains.plugins.gradle.bootstrap.GradleBootstrap - org.jetbrains.plugins.gradle.sync.GradleProjectStructureChangesModel diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/bootstrap/GradleBootstrap.java b/plugins/gradle/src/org/jetbrains/plugins/gradle/bootstrap/GradleBootstrap.java deleted file mode 100644 index d44f8088e683..000000000000 --- a/plugins/gradle/src/org/jetbrains/plugins/gradle/bootstrap/GradleBootstrap.java +++ /dev/null @@ -1,62 +0,0 @@ -package org.jetbrains.plugins.gradle.bootstrap; - -import com.intellij.openapi.components.AbstractProjectComponent; -import com.intellij.openapi.project.DumbAwareRunnable; -import com.intellij.openapi.project.Project; -import com.intellij.openapi.startup.StartupManager; -import com.intellij.openapi.wm.ToolWindow; -import com.intellij.openapi.wm.ToolWindowAnchor; -import com.intellij.openapi.wm.ex.ToolWindowManagerEx; -import com.intellij.ui.content.impl.ContentImpl; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.plugins.gradle.diff.PlatformFacade; -import org.jetbrains.plugins.gradle.sync.GradleProjectStructureChangesModel; -import org.jetbrains.plugins.gradle.sync.GradleProjectStructureChangesPanel; -import org.jetbrains.plugins.gradle.sync.GradleProjectStructureHelper; -import org.jetbrains.plugins.gradle.ui.GradleIcons; -import org.jetbrains.plugins.gradle.util.GradleBundle; - -/** - * Encapsulates initialisation routine of the gradle integration. - * - * @author Denis Zhdanov - * @since 11/3/11 4:01 PM - */ -public class GradleBootstrap extends AbstractProjectComponent { - - private static final String GRADLE_TOOL_WINDOW_ID = GradleBundle.message("gradle.name"); - - private final GradleProjectStructureChangesModel myChangesModel; - private final PlatformFacade myPlatformFacade; - private final GradleProjectStructureHelper myProjectStructureHelper; - - public GradleBootstrap(@NotNull Project project, - @NotNull GradleProjectStructureChangesModel changesModel, - @NotNull PlatformFacade platformFacade, - @NotNull GradleProjectStructureHelper projectStructureHelper) { - super(project); - myChangesModel = changesModel; - myPlatformFacade = platformFacade; - myProjectStructureHelper = projectStructureHelper; - } - - @Override - public void projectOpened() { - StartupManager.getInstance(myProject).registerPostStartupActivity(new DumbAwareRunnable() { - @Override - public void run() { - initToolWindow(); - } - }); - } - - private void initToolWindow() { - final ToolWindowManagerEx manager = ToolWindowManagerEx.getInstanceEx(myProject); - ToolWindow toolWindow = manager.registerToolWindow(GRADLE_TOOL_WINDOW_ID, false, ToolWindowAnchor.RIGHT); - toolWindow.setIcon(GradleIcons.GRADLE_ICON); - String syncTitle = GradleBundle.message("gradle.sync.title.tab"); - final GradleProjectStructureChangesPanel projectStructureChanges - = new GradleProjectStructureChangesPanel(myProject, myChangesModel, myPlatformFacade, myProjectStructureHelper); - toolWindow.getContentManager().addContent(new ContentImpl(projectStructureChanges, syncTitle, true)); - } -} diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/ui/GradleToolWindowFactory.java b/plugins/gradle/src/org/jetbrains/plugins/gradle/ui/GradleToolWindowFactory.java new file mode 100644 index 000000000000..7fe40ad3f877 --- /dev/null +++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/ui/GradleToolWindowFactory.java @@ -0,0 +1,25 @@ +package org.jetbrains.plugins.gradle.ui; + +import com.intellij.openapi.components.ServiceManager; +import com.intellij.openapi.project.Project; +import com.intellij.openapi.wm.ToolWindow; +import com.intellij.openapi.wm.ToolWindowFactory; +import com.intellij.ui.content.impl.ContentImpl; +import org.jetbrains.plugins.gradle.diff.PlatformFacade; +import org.jetbrains.plugins.gradle.sync.GradleProjectStructureChangesModel; +import org.jetbrains.plugins.gradle.sync.GradleProjectStructureChangesPanel; +import org.jetbrains.plugins.gradle.sync.GradleProjectStructureHelper; +import org.jetbrains.plugins.gradle.util.GradleBundle; + +public class GradleToolWindowFactory implements ToolWindowFactory { + @Override + public void createToolWindowContent(final Project project, final ToolWindow toolWindow) { + final GradleProjectStructureChangesModel model = project.getComponent(GradleProjectStructureChangesModel.class); + final PlatformFacade facade = ServiceManager.getService(PlatformFacade.class); + final GradleProjectStructureHelper helper = project.getComponent(GradleProjectStructureHelper.class); + + final GradleProjectStructureChangesPanel panel = new GradleProjectStructureChangesPanel(project, model, facade, helper); + final String syncTitle = GradleBundle.message("gradle.sync.title.tab"); + toolWindow.getContentManager().addContent(new ContentImpl(panel, syncTitle, true)); + } +} From 85848547e747b4d0dc005c5276221bb0955434b5 Mon Sep 17 00:00:00 2001 From: Roman Shevchenko Date: Tue, 7 Feb 2012 17:20:17 +0100 Subject: [PATCH 117/215] Increase SVN test timeout --- .../svn/SvnChangesCorrectlyRefreshedTest.java | 41 +++++++++++++------ 1 file changed, 29 insertions(+), 12 deletions(-) diff --git a/plugins/svn4ideaOld/testSource/org/jetbrains/idea/svn/SvnChangesCorrectlyRefreshedTest.java b/plugins/svn4ideaOld/testSource/org/jetbrains/idea/svn/SvnChangesCorrectlyRefreshedTest.java index 08c6f77a4828..d49a3e711301 100644 --- a/plugins/svn4ideaOld/testSource/org/jetbrains/idea/svn/SvnChangesCorrectlyRefreshedTest.java +++ b/plugins/svn4ideaOld/testSource/org/jetbrains/idea/svn/SvnChangesCorrectlyRefreshedTest.java @@ -1,3 +1,18 @@ +/* + * Copyright 2000-2012 JetBrains s.r.o. + * + * 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. + */ package org.jetbrains.idea.svn; import com.intellij.openapi.fileEditor.impl.LoadTextUtil; @@ -12,6 +27,7 @@ import com.intellij.openapi.vcs.changes.ui.RollbackWorker; import com.intellij.openapi.vfs.LocalFileSystem; import com.intellij.openapi.vfs.VfsUtil; import com.intellij.openapi.vfs.VirtualFile; +import org.jetbrains.annotations.Nullable; import org.junit.Assert; import org.junit.Test; @@ -61,9 +77,9 @@ public class SvnChangesCorrectlyRefreshedTest extends SvnTestCase { } } - private static void sleep300() { + private static void sleep(final int millis) { try { - Thread.sleep(300); + Thread.sleep(millis); } catch (InterruptedException ignore) { } } @@ -73,14 +89,14 @@ public class SvnChangesCorrectlyRefreshedTest extends SvnTestCase { //ChangeListManagerImpl.DEBUG = true; final SubTree subTree = new SubTree(myWorkingCopyDir); checkin(); - sleep300(); + sleep(1000); editFileInCommand(myProject, subTree.myS1File, "new"); final CharSequence text1 = LoadTextUtil.loadText(subTree.myS1File); Assert.assertEquals("new", text1.toString()); - sleep300(); + sleep(1000); LocalFileSystem.getInstance().refreshAndFindFileByIoFile(new File(subTree.myS1File.getPath())); VcsDirtyScopeManager.getInstance(myProject).markEverythingDirty(); clManager.ensureUpToDate(false); @@ -115,7 +131,7 @@ public class SvnChangesCorrectlyRefreshedTest extends SvnTestCase { assertVF(subTree.mySourceDir, newName); - sleep300(); + sleep(300); VcsDirtyScopeManager.getInstance(myProject).markEverythingDirty(); clManager.ensureUpToDate(false); DuringChangeListManagerUpdateTestScheme.checkFilesAreInList(new VirtualFile[] {subTree.myS1File}, clManager.getDefaultListName(), clManager); @@ -140,7 +156,7 @@ public class SvnChangesCorrectlyRefreshedTest extends SvnTestCase { assertVF(subTree.myTargetDir, "s1.txt"); - sleep300(); + sleep(300); VcsDirtyScopeManager.getInstance(myProject).markEverythingDirty(); clManager.ensureUpToDate(false); DuringChangeListManagerUpdateTestScheme.checkFilesAreInList(new VirtualFile[] {subTree.myS1File}, clManager.getDefaultListName(), clManager); @@ -168,7 +184,7 @@ public class SvnChangesCorrectlyRefreshedTest extends SvnTestCase { assertVF(subTree.mySourceDir, "s1.txt"); assertVF(subTree.mySourceDir, "s2.txt"); - sleep300(); + sleep(300); VcsDirtyScopeManager.getInstance(myProject).markEverythingDirty(); clManager.ensureUpToDate(false); DuringChangeListManagerUpdateTestScheme.checkFilesAreInList(new VirtualFile[] {subTree.mySourceDir, subTree.myS1File, subTree.myS2File}, @@ -201,7 +217,7 @@ public class SvnChangesCorrectlyRefreshedTest extends SvnTestCase { final CharSequence text1 = LoadTextUtil.loadText(subTree.myS1File); Assert.assertEquals("new", text1.toString()); - sleep300(); + sleep(300); VcsDirtyScopeManager.getInstance(myProject).markEverythingDirty(); clManager.ensureUpToDate(false); DuringChangeListManagerUpdateTestScheme.checkFilesAreInList(new VirtualFile[] {subTree.mySourceDir, subTree.myS1File, subTree.myS2File}, @@ -264,7 +280,7 @@ public class SvnChangesCorrectlyRefreshedTest extends SvnTestCase { checkin(); deleteFileInCommand(subTree.myRootDir); - sleep300(); + sleep(300); VcsDirtyScopeManager.getInstance(myProject).markEverythingDirty(); clManager.ensureUpToDate(false); @@ -290,11 +306,12 @@ public class SvnChangesCorrectlyRefreshedTest extends SvnTestCase { DuringChangeListManagerUpdateTestScheme.checkFilesAreInList(new VirtualFile[] {}, clManager.getDefaultListName(), clManager); } - private VirtualFile assertVF(final VirtualFile parent, final String name) { + @Nullable + private static VirtualFile assertVF(final VirtualFile parent, final String name) { final VirtualFile[] files = parent.getChildren(); - final StringBuilder sb = new StringBuilder("Files: "); + //final StringBuilder sb = new StringBuilder("Files: "); for (VirtualFile file : files) { - sb.append(file.getName()).append(' '); + //sb.append(file.getName()).append(' '); if (name.equals(file.getName())) return file; } System.out.println("not found as child"); From a1d0ffceca00da98d6fb8bafe02b192fe9c458a0 Mon Sep 17 00:00:00 2001 From: Roman Shevchenko Date: Tue, 7 Feb 2012 17:49:11 +0100 Subject: [PATCH 118/215] EA-33558 (ensure no more NPEs of that kind) --- .../CompareValueWithClipboardAction.java | 11 +++++------ .../diff/impl/settings/DiffPreviewPanel.java | 1 + .../intellij/openapi/diff/DiffRequest.java | 8 +++++--- .../intellij/openapi/diff/SimpleContent.java | 6 ++++-- .../openapi/diff/SimpleDiffRequest.java | 12 +++++++----- .../CompareClipboardWithSelection.java | 7 ++++--- .../diff/actions/CompareFileWithEditor.java | 8 +++++--- .../diff/impl/mergeTool/MergeRequestImpl.java | 5 ++++- .../diff/impl/external/DiffManagerTest.java | 19 ++++++++++++++++++- .../vcs/ex/ShowLineStatusRangeDiffAction.java | 7 ++++++- 10 files changed, 59 insertions(+), 25 deletions(-) diff --git a/java/debugger/impl/src/com/intellij/debugger/actions/CompareValueWithClipboardAction.java b/java/debugger/impl/src/com/intellij/debugger/actions/CompareValueWithClipboardAction.java index e415e08eacd4..4f9f6cbdf741 100644 --- a/java/debugger/impl/src/com/intellij/debugger/actions/CompareValueWithClipboardAction.java +++ b/java/debugger/impl/src/com/intellij/debugger/actions/CompareValueWithClipboardAction.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2011 JetBrains s.r.o. + * Copyright 2000-2012 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,22 +16,20 @@ package com.intellij.debugger.actions; import com.intellij.debugger.DebuggerBundle; -import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.diff.*; import com.intellij.openapi.ide.CopyPasteManager; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.SystemInfo; +import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.awt.datatransfer.DataFlavor; import java.awt.datatransfer.Transferable; -/* - * Class SetValueAction +/** * @author Jeka */ public class CompareValueWithClipboardAction extends BaseValueAction { - private static final Logger LOG = Logger.getInstance("#com.intellij.debugger.actions.CompareValueWithClipboardAction"); protected void processText(final Project project, final String text) { DiffManager.getInstance().getDiffTool().show(new ClipboardSelectionContents(text, project)); } @@ -57,10 +55,11 @@ public class CompareValueWithClipboardAction extends BaseValueAction { return !SystemInfo.isMac; } + @NotNull public DiffContent[] getContents() { if (myContents != null) return myContents; DiffContent clipboardContent = createClipboardContent(); - if (clipboardContent == null) return null; + if (clipboardContent == null) clipboardContent = new SimpleContent(""); myContents = new DiffContent[2]; myContents[0] = clipboardContent; diff --git a/platform/lang-impl/src/com/intellij/openapi/diff/impl/settings/DiffPreviewPanel.java b/platform/lang-impl/src/com/intellij/openapi/diff/impl/settings/DiffPreviewPanel.java index e274135f8133..76a3f35cd3b6 100644 --- a/platform/lang-impl/src/com/intellij/openapi/diff/impl/settings/DiffPreviewPanel.java +++ b/platform/lang-impl/src/com/intellij/openapi/diff/impl/settings/DiffPreviewPanel.java @@ -123,6 +123,7 @@ public class DiffPreviewPanel implements PreviewPanel { super(project); } + @NotNull public DiffContent[] getContents() { return DiffPreviewProvider.getContents(); } diff --git a/platform/platform-api/src/com/intellij/openapi/diff/DiffRequest.java b/platform/platform-api/src/com/intellij/openapi/diff/DiffRequest.java index 388f25f7fc68..0f78e7a4e38a 100644 --- a/platform/platform-api/src/com/intellij/openapi/diff/DiffRequest.java +++ b/platform/platform-api/src/com/intellij/openapi/diff/DiffRequest.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2009 JetBrains s.r.o. + * Copyright 2000-2012 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -30,10 +30,11 @@ import java.util.*; * A request for a diff or merge operation. */ public abstract class DiffRequest { + @NonNls private static final String COMMON_DIFF_GROUP_KEY = "DiffWindow"; + private String myGroupKey = COMMON_DIFF_GROUP_KEY; private final Project myProject; private ToolbarAddons myToolbarAddons = ToolbarAddons.NOTHING; - @NonNls private static final String COMMON_DIFF_GROUP_KEY = "DiffWindow"; private Factory myBottomComponentFactory = null; private final HashSet myHints = new HashSet(); private final Map myGenericData; @@ -59,6 +60,7 @@ public abstract class DiffRequest { /** * @return contents to compare */ + @NotNull public abstract DiffContent[] getContents(); /** @@ -79,7 +81,7 @@ public abstract class DiffRequest { } /** - * Work in progess. Don't rely on this functionality
+ * Work in progress. Don't rely on this functionality
* @return not null (possibly empty) collection of hints for diff tool. */ public Collection getHints() { diff --git a/platform/platform-api/src/com/intellij/openapi/diff/SimpleContent.java b/platform/platform-api/src/com/intellij/openapi/diff/SimpleContent.java index fe6157574020..42e812a2f3c0 100644 --- a/platform/platform-api/src/com/intellij/openapi/diff/SimpleContent.java +++ b/platform/platform-api/src/com/intellij/openapi/diff/SimpleContent.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2009 JetBrains s.r.o. + * Copyright 2000-2012 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -25,6 +25,7 @@ import com.intellij.openapi.vfs.CharsetToolkit; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.util.SystemProperties; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.io.*; import java.nio.charset.Charset; @@ -38,6 +39,7 @@ import java.nio.ByteBuffer; */ public class SimpleContent extends DiffContent { private static final Logger LOG = Logger.getInstance("#com.intellij.openapi.diff.SimpleContent"); + private final byte[] myOriginalBytes; private final String myOriginalText; private final LineSeparators myLineSeparators = new LineSeparators(); @@ -53,7 +55,7 @@ public class SimpleContent extends DiffContent { this(text, null); } - public SimpleContent(@NotNull String text, FileType type) { + public SimpleContent(@NotNull String text, @Nullable FileType type) { this(text, type, EditorFactory.getInstance()); } diff --git a/platform/platform-api/src/com/intellij/openapi/diff/SimpleDiffRequest.java b/platform/platform-api/src/com/intellij/openapi/diff/SimpleDiffRequest.java index 0d0171c06971..2f82543a52a8 100644 --- a/platform/platform-api/src/com/intellij/openapi/diff/SimpleDiffRequest.java +++ b/platform/platform-api/src/com/intellij/openapi/diff/SimpleDiffRequest.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2009 JetBrains s.r.o. + * Copyright 2000-2012 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -15,7 +15,6 @@ */ package com.intellij.openapi.diff; -import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.project.Project; import com.intellij.openapi.vfs.VirtualFile; import org.jetbrains.annotations.NotNull; @@ -24,18 +23,20 @@ import org.jetbrains.annotations.NotNull; * Two contents for general diff */ public class SimpleDiffRequest extends DiffRequest { - private static final Logger LOG = Logger.getInstance("#com.intellij.openapi.diff.SimpleDiffRequest"); private final DiffContent[] myContents = new DiffContent[2]; private final String[] myContentTitles = new String[2]; private String myWindowTitle; - public SimpleDiffRequest(Project project, String windowtitle) { + public SimpleDiffRequest(Project project, String windowTitle) { super(project); - myWindowTitle = windowtitle; + myWindowTitle = windowTitle; } + @NotNull public DiffContent[] getContents() { return myContents; } + public String[] getContentTitles() { return myContentTitles; } + public String getWindowTitle() { return myWindowTitle; } public void setContents(@NotNull DiffContent content1, @NotNull DiffContent content2) { @@ -75,6 +76,7 @@ public class SimpleDiffRequest extends DiffRequest { super(project, title); } + @NotNull public DiffContent[] getContents() { return new DiffContent[]{ DiffContent.fromFile(getProject(), myVirtualFiles[0]), diff --git a/platform/platform-impl/src/com/intellij/openapi/diff/actions/CompareClipboardWithSelection.java b/platform/platform-impl/src/com/intellij/openapi/diff/actions/CompareClipboardWithSelection.java index 57c2cbae7bbf..230c58b55d50 100644 --- a/platform/platform-impl/src/com/intellij/openapi/diff/actions/CompareClipboardWithSelection.java +++ b/platform/platform-impl/src/com/intellij/openapi/diff/actions/CompareClipboardWithSelection.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2011 JetBrains s.r.o. + * Copyright 2000-2012 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -26,13 +26,13 @@ import com.intellij.openapi.ide.CopyPasteManager; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.SystemInfo; import com.intellij.openapi.util.TextRange; +import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.awt.datatransfer.DataFlavor; import java.awt.datatransfer.Transferable; public class CompareClipboardWithSelection extends BaseDiffAction { - @Nullable protected DiffRequest getDiffData(DataContext dataContext) { Project project = PlatformDataKeys.PROJECT.getData(dataContext); @@ -65,10 +65,11 @@ public class CompareClipboardWithSelection extends BaseDiffAction { return !SystemInfo.isMac; } + @NotNull public DiffContent[] getContents() { if (myContents != null) return myContents; DiffContent clipboardContent = createClipboardContent(); - if (clipboardContent == null) return null; + if (clipboardContent == null) clipboardContent = new SimpleContent(""); myContents = new DiffContent[2]; myContents[0] = clipboardContent; diff --git a/platform/platform-impl/src/com/intellij/openapi/diff/actions/CompareFileWithEditor.java b/platform/platform-impl/src/com/intellij/openapi/diff/actions/CompareFileWithEditor.java index 38a8c0e60445..85d005879f8c 100644 --- a/platform/platform-impl/src/com/intellij/openapi/diff/actions/CompareFileWithEditor.java +++ b/platform/platform-impl/src/com/intellij/openapi/diff/actions/CompareFileWithEditor.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2009 JetBrains s.r.o. + * Copyright 2000-2012 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -23,6 +23,7 @@ import com.intellij.openapi.fileEditor.FileDocumentManager; import com.intellij.openapi.fileEditor.FileEditorManager; import com.intellij.openapi.project.Project; import com.intellij.openapi.vfs.VirtualFile; +import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.NonNls; @@ -109,10 +110,11 @@ public class CompareFileWithEditor extends BaseDiffAction { return new String[]{getVirtualFileContentTitle(myFile), documentTitle}; } + @NotNull public DiffContent[] getContents() { return new DiffContent[]{ - DocumentContent.fromFile(getProject(), myFile), - DocumentContent.fromDocument(getProject(), myDocument) + DiffContent.fromFile(getProject(), myFile), + DiffContent.fromDocument(getProject(), myDocument) }; } diff --git a/platform/platform-impl/src/com/intellij/openapi/diff/impl/mergeTool/MergeRequestImpl.java b/platform/platform-impl/src/com/intellij/openapi/diff/impl/mergeTool/MergeRequestImpl.java index 9e171439601e..6798ec93fbca 100644 --- a/platform/platform-impl/src/com/intellij/openapi/diff/impl/mergeTool/MergeRequestImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/diff/impl/mergeTool/MergeRequestImpl.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2009 JetBrains s.r.o. + * Copyright 2000-2012 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -29,6 +29,7 @@ import com.intellij.openapi.ui.DialogWrapper; import com.intellij.openapi.ui.Messages; import com.intellij.openapi.vfs.VirtualFile; import org.jetbrains.annotations.NonNls; +import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import javax.swing.*; @@ -36,6 +37,7 @@ import java.io.IOException; public class MergeRequestImpl extends MergeRequest { private static final Logger LOG = Logger.getInstance("#com.intellij.openapi.diff.impl.mergeTool.MergeRequestImpl"); + private final DiffContent[] myDiffContents = new DiffContent[3]; private String myWindowTitle = null; private String[] myVersionTitles = null; @@ -87,6 +89,7 @@ public class MergeRequestImpl extends MergeRequest { myDiffContents[2] = right; } + @NotNull public DiffContent[] getContents() { return myDiffContents; } public String[] getContentTitles() { return myVersionTitles; } diff --git a/platform/platform-tests/testSrc/com/intellij/openapi/diff/impl/external/DiffManagerTest.java b/platform/platform-tests/testSrc/com/intellij/openapi/diff/impl/external/DiffManagerTest.java index e3d532d2aabe..525bcac7b374 100644 --- a/platform/platform-tests/testSrc/com/intellij/openapi/diff/impl/external/DiffManagerTest.java +++ b/platform/platform-tests/testSrc/com/intellij/openapi/diff/impl/external/DiffManagerTest.java @@ -1,3 +1,18 @@ +/* + * Copyright 2000-2012 JetBrains s.r.o. + * + * 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. + */ package com.intellij.openapi.diff.impl.external; import com.intellij.openapi.diff.BinaryContent; @@ -7,6 +22,7 @@ import com.intellij.openapi.diff.DiffTool; import com.intellij.openapi.fileTypes.FileTypes; import com.intellij.util.ArrayUtil; import junit.framework.TestCase; +import org.jetbrains.annotations.NotNull; import java.util.ArrayList; @@ -37,7 +53,7 @@ public class DiffManagerTest extends TestCase { return canShowImpl(request); } - private boolean canShowImpl(DiffRequest request) { + private static boolean canShowImpl(DiffRequest request) { return request.getContents().length == 4; } @@ -66,6 +82,7 @@ public class DiffManagerTest extends TestCase { return ArrayUtil.toStringArray(myContentTitles); } + @NotNull @Override public DiffContent[] getContents() { return myDiffContents.toArray(new DiffContent[myDiffContents.size()]); diff --git a/platform/vcs-impl/src/com/intellij/openapi/vcs/ex/ShowLineStatusRangeDiffAction.java b/platform/vcs-impl/src/com/intellij/openapi/vcs/ex/ShowLineStatusRangeDiffAction.java index 8f9fee4eab25..675d50396695 100644 --- a/platform/vcs-impl/src/com/intellij/openapi/vcs/ex/ShowLineStatusRangeDiffAction.java +++ b/platform/vcs-impl/src/com/intellij/openapi/vcs/ex/ShowLineStatusRangeDiffAction.java @@ -1,9 +1,12 @@ /* - * Copyright 2000-2010 JetBrains s.r.o. + * Copyright 2000-2012 JetBrains s.r.o. + * * 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. @@ -21,6 +24,7 @@ import com.intellij.openapi.util.IconLoader; import com.intellij.openapi.util.TextRange; import com.intellij.openapi.vcs.VcsBundle; import com.intellij.openapi.vfs.VirtualFile; +import org.jetbrains.annotations.NotNull; /** * @author irengrig @@ -48,6 +52,7 @@ public class ShowLineStatusRangeDiffAction extends BaseLineStatusRangeAction { private DiffRequest createDiffData() { return new DiffRequest(myLineStatusTracker.getProject()) { + @NotNull public DiffContent[] getContents() { return new DiffContent[]{createDiffContent(myLineStatusTracker.getUpToDateDocument(), myLineStatusTracker.getUpToDateRangeWithEndSymbol(myRange), null), From 5161838b89133f75a5b3dc65c3561986ea3ca63b Mon Sep 17 00:00:00 2001 From: Roman Shevchenko Date: Tue, 7 Feb 2012 17:55:34 +0100 Subject: [PATCH 119/215] Fix test data --- .../testData/xslt/highlighting/{XsltFreeze.xsl => xsltFreeze.xsl} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename plugins/xpath/xpath-lang/testData/xslt/highlighting/{XsltFreeze.xsl => xsltFreeze.xsl} (100%) diff --git a/plugins/xpath/xpath-lang/testData/xslt/highlighting/XsltFreeze.xsl b/plugins/xpath/xpath-lang/testData/xslt/highlighting/xsltFreeze.xsl similarity index 100% rename from plugins/xpath/xpath-lang/testData/xslt/highlighting/XsltFreeze.xsl rename to plugins/xpath/xpath-lang/testData/xslt/highlighting/xsltFreeze.xsl From 74e45d296a2f969f16db44dbcdbd81f227620c72 Mon Sep 17 00:00:00 2001 From: Roman Shevchenko Date: Tue, 7 Feb 2012 18:06:01 +0100 Subject: [PATCH 120/215] Cleanup --- .../util/src/com/intellij/openapi/util/io/FileSystemUtil.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/platform/util/src/com/intellij/openapi/util/io/FileSystemUtil.java b/platform/util/src/com/intellij/openapi/util/io/FileSystemUtil.java index d46a663babf1..cd2d7186e619 100644 --- a/platform/util/src/com/intellij/openapi/util/io/FileSystemUtil.java +++ b/platform/util/src/com/intellij/openapi/util/io/FileSystemUtil.java @@ -22,17 +22,15 @@ import com.sun.jna.Library; import com.sun.jna.Memory; import com.sun.jna.Native; import com.sun.jna.Pointer; -import com.sun.org.apache.bcel.internal.generic.NEW; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.io.File; -import java.io.IOException; import java.lang.reflect.Array; -import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.*; +// todo[r.sh] read attributes in one shot (IDEA 12) // todo[r.sh] use NIO2 API after migration to JDK 7 public class FileSystemUtil { private static final Logger LOG = Logger.getInstance("#com.intellij.openapi.util.io.FileSystemUtil"); From 7876474626e93a79c4401feb117d3d7f96bec4f7 Mon Sep 17 00:00:00 2001 From: "Gregory.Shrago" Date: Tue, 7 Feb 2012 21:49:16 +0300 Subject: [PATCH 121/215] make compare-with-clipboard action available in goto-action popup --- .../platform-resources/src/idea/PlatformActions.xml | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/platform/platform-resources/src/idea/PlatformActions.xml b/platform/platform-resources/src/idea/PlatformActions.xml index cfe8b1fa5ef4..21075aa6d238 100644 --- a/platform/platform-resources/src/idea/PlatformActions.xml +++ b/platform/platform-resources/src/idea/PlatformActions.xml @@ -227,9 +227,12 @@ - - - + + + + + + @@ -389,7 +392,7 @@ - + From debe1b1f6c538106f2195d95006f81a151ef487a Mon Sep 17 00:00:00 2001 From: anna Date: Tue, 7 Feb 2012 19:12:59 +0100 Subject: [PATCH 122/215] junit: run with suite when all in package --- .../src/com/intellij/junit4/JUnit46ClassesRequestBuilder.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/junit_rt/src/com/intellij/junit4/JUnit46ClassesRequestBuilder.java b/plugins/junit_rt/src/com/intellij/junit4/JUnit46ClassesRequestBuilder.java index 5f2ed3fefa1a..697620d242e1 100644 --- a/plugins/junit_rt/src/com/intellij/junit4/JUnit46ClassesRequestBuilder.java +++ b/plugins/junit_rt/src/com/intellij/junit4/JUnit46ClassesRequestBuilder.java @@ -58,6 +58,6 @@ public class JUnit46ClassesRequestBuilder { } } } - return false; + return classMethods.isEmpty(); } } \ No newline at end of file From 859d80f3e26acb2950197409fa059d83a95bc0db Mon Sep 17 00:00:00 2001 From: Konstantin Bulenkov Date: Tue, 7 Feb 2012 19:14:51 +0100 Subject: [PATCH 123/215] Control Enter should perform default action on dialogs --- .../openapi/keymap/impl/IdeKeyEventDispatcher.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/platform/platform-impl/src/com/intellij/openapi/keymap/impl/IdeKeyEventDispatcher.java b/platform/platform-impl/src/com/intellij/openapi/keymap/impl/IdeKeyEventDispatcher.java index d51391ad7c5e..28001031f8e4 100644 --- a/platform/platform-impl/src/com/intellij/openapi/keymap/impl/IdeKeyEventDispatcher.java +++ b/platform/platform-impl/src/com/intellij/openapi/keymap/impl/IdeKeyEventDispatcher.java @@ -34,6 +34,7 @@ import com.intellij.openapi.keymap.impl.keyGestures.KeyboardGestureProcessor; import com.intellij.openapi.keymap.impl.ui.ShortcutTextField; import com.intellij.openapi.project.DumbService; import com.intellij.openapi.project.Project; +import com.intellij.openapi.ui.DialogWrapper; import com.intellij.openapi.ui.TypingTarget; import com.intellij.openapi.ui.popup.JBPopup; import com.intellij.openapi.ui.popup.ListPopupStep; @@ -621,6 +622,8 @@ public final class IdeKeyEventDispatcher implements Disposable { myContext.setFoundComponent(null); myContext.getActions().clear(); + if (isControlEnterOnDialog(component, sc)) return myContext; + boolean hasSecondStroke = false; // here we try to find "local" shortcuts @@ -699,6 +702,11 @@ public final class IdeKeyEventDispatcher implements Disposable { return myContext; } + private static KeyboardShortcut CONTROL_ENTER = KeyboardShortcut.fromString("control ENTER"); + private static boolean isControlEnterOnDialog(Component component, Shortcut sc) { + return CONTROL_ENTER.equals(sc) && DialogWrapper.findInstance(component) != null; + } + /** * @return true if action is added and has second stroke */ From 2811cc0f5d4ef2307d2a791c738e8f2034d8038e Mon Sep 17 00:00:00 2001 From: Konstantin Bulenkov Date: Tue, 7 Feb 2012 19:44:49 +0100 Subject: [PATCH 124/215] cosmetics --- .../com/intellij/debugger/ui/ExpressionEvaluationDialog.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/java/debugger/impl/src/com/intellij/debugger/ui/ExpressionEvaluationDialog.java b/java/debugger/impl/src/com/intellij/debugger/ui/ExpressionEvaluationDialog.java index c3b76db7be21..7ffde13a2e95 100644 --- a/java/debugger/impl/src/com/intellij/debugger/ui/ExpressionEvaluationDialog.java +++ b/java/debugger/impl/src/com/intellij/debugger/ui/ExpressionEvaluationDialog.java @@ -87,7 +87,7 @@ public class ExpressionEvaluationDialog extends EvaluationDialog { exprPanel.add(new JLabel(DebuggerBundle.message("label.evaluate.dialog.expression")), BorderLayout.WEST); exprPanel.add(getExpressionCombo(), BorderLayout.CENTER); final JLabel help = new JLabel( - String.format("Press Enter to Evaluate or %s+Enter to evaluate and add to the Watches", SystemInfo.isMac ? "Meta" : "Control"), SwingConstants.RIGHT); + String.format("Press Enter to Evaluate or %s+Enter to evaluate and add to the Watches", SystemInfo.isMac ? "Command" : "Control"), SwingConstants.RIGHT); help.setBorder(IdeBorderFactory.createEmptyBorder(2,0,6,0)); UIUtil.applyStyle(UIUtil.ComponentStyle.MINI, help); help.setForeground(UIUtil.getInactiveTextColor()); From 10d52604cce313ac0c50bda16a5f2e8cea10e77a Mon Sep 17 00:00:00 2001 From: Eugene Zhuravlev Date: Tue, 7 Feb 2012 21:26:57 +0100 Subject: [PATCH 125/215] TranslatingCompilerFilesMonitor: suspend activity for projects where "compile server" mode is enabled --- .../intellij/compiler/impl/CompileDriver.java | 9 +- .../impl/TranslatingCompilerFilesMonitor.java | 177 ++++++++++++++++-- .../options/CompilerUIConfigurable.java | 5 +- .../openapi/compiler/CompilerPaths.java | 4 + 4 files changed, 177 insertions(+), 18 deletions(-) diff --git a/java/compiler/impl/src/com/intellij/compiler/impl/CompileDriver.java b/java/compiler/impl/src/com/intellij/compiler/impl/CompileDriver.java index 5751811c903b..857d42b0632b 100644 --- a/java/compiler/impl/src/com/intellij/compiler/impl/CompileDriver.java +++ b/java/compiler/impl/src/com/intellij/compiler/impl/CompileDriver.java @@ -144,8 +144,6 @@ public class CompileDriver { } }; - private OutputPathFinder myOutputFinder; // need this for updating zip archives (experimental feature) - private Set myAllOutputDirectories; private static final long ONE_MINUTE_MS = 60L /*sec*/ * 1000L /*millisec*/; @@ -665,6 +663,7 @@ public class CompileDriver { finish - start ); CompilerCacheManager.getInstance(myProject).flushCaches(); + FileUtil.delete(CompilerPaths.getRebuildMarkerFile(myProject)); } } }; @@ -755,8 +754,6 @@ public class CompileDriver { } myAllOutputDirectories = getAllOutputDirectories(compileContext); - // need this for updating zip archives experiment, uncomment if the feature is turned on - //myOutputFinder = new OutputPathFinder(myAllOutputDirectories); status = doCompile(compileContext, isRebuild, forceCompile, false); } catch (Throwable ex) { @@ -827,6 +824,10 @@ public class CompileDriver { } private void checkCachesVersion(final CompileContextImpl compileContext, final long currentVFSTimestamp) { + if (CompilerPaths.getRebuildMarkerFile(compileContext.getProject()).exists()) { + compileContext.requestRebuildNextTime("Compiler caches are out of date, project rebuild is required"); + return; + } final CompileStatus compileStatus = readStatus(); if (compileStatus == null) { compileContext.requestRebuildNextTime(CompilerBundle.message("error.compiler.caches.corrupted")); diff --git a/java/compiler/impl/src/com/intellij/compiler/impl/TranslatingCompilerFilesMonitor.java b/java/compiler/impl/src/com/intellij/compiler/impl/TranslatingCompilerFilesMonitor.java index 7f12839af0b4..f6c37ea4b2b9 100644 --- a/java/compiler/impl/src/com/intellij/compiler/impl/TranslatingCompilerFilesMonitor.java +++ b/java/compiler/impl/src/com/intellij/compiler/impl/TranslatingCompilerFilesMonitor.java @@ -19,6 +19,7 @@ import com.intellij.ProjectTopics; import com.intellij.compiler.CompileServerManager; import com.intellij.compiler.CompilerConfiguration; import com.intellij.compiler.CompilerIOUtil; +import com.intellij.compiler.CompilerWorkspaceConfiguration; import com.intellij.compiler.make.MakeUtil; import com.intellij.openapi.Disposable; import com.intellij.openapi.application.Application; @@ -82,12 +83,16 @@ public class TranslatingCompilerFilesMonitor implements ApplicationComponent { public static boolean ourDebugMode = false; @NonNls private static final String PATHS_TO_DELETE_FILENAME = "paths_to_delete.dat"; + private static final String SUSPENDED_PROJECTS_FILENAME = "suspended.dat"; private static final String OUTPUT_ROOTS_FILENAME = "output_roots.dat"; private static final FileAttribute ourSourceFileAttribute = new FileAttribute("_make_source_file_info_", 3); private static final FileAttribute ourOutputFileAttribute = new FileAttribute("_make_output_file_info_", 3); private static final Key> SOURCE_FILES_CACHE = Key.create("_source_url_to_vfile_cache_"); private final Object myDataLock = new Object(); + + private final TIntHashSet mySuspendedProjects = new TIntHashSet(); // projectId for allprojects that should not be monitored + private final TIntObjectHashMap mySourcesToRecompile = new TIntObjectHashMap(); // ProjectId->set of source file paths private PersistentHashMap>> myOutputRootsStorage; // ProjectId->map[moduleId->Pair(outputDirId, testOutputDirId)] private final TIntObjectHashMap> myOutputsToDelete = new TIntObjectHashMap>(); // Map: projectId -> Map{output path -> [sourceUrl; classname]} @@ -126,7 +131,7 @@ public class TranslatingCompilerFilesMonitor implements ApplicationComponent { } }; private final ProjectManager myProjectManager; - private final TIntIntHashMap myInitInProgress = new TIntIntHashMap(); // projectId fior successfully initialized projects + private final TIntIntHashMap myInitInProgress = new TIntIntHashMap(); // projectId for successfully initialized projects private final Object myAsyncScanLock = new Object(); public TranslatingCompilerFilesMonitor(VirtualFileManager vfsManager, ProjectManager projectManager, Application application) { @@ -140,6 +145,46 @@ public class TranslatingCompilerFilesMonitor implements ApplicationComponent { return ApplicationManager.getApplication().getComponent(TranslatingCompilerFilesMonitor.class); } + public void suspendProject(Project project) { + final int projectId = getProjectId(project); + + synchronized (myDataLock) { + if (!mySuspendedProjects.add(projectId)) { + return; + } + FileUtil.createIfDoesntExist(CompilerPaths.getRebuildMarkerFile(project)); + // cleanup internal structures to free memory + mySourcesToRecompile.remove(projectId); + myOutputsToDelete.remove(projectId); + myGeneratedDataPaths.remove(project); + myProjectOutputRoots.remove(projectId); + } + + try { + myOutputRootsStorage.remove(projectId); + } + catch (IOException e) { + LOG.info(e); + } + + } + + public void watchProject(Project project) { + synchronized (myDataLock) { + mySuspendedProjects.remove(getProjectId(project)); + } + } + + public boolean isSuspended(Project project) { + return isSuspended(getProjectId(project)); + } + + public boolean isSuspended(int projectId) { + synchronized (myDataLock) { + return mySuspendedProjects.contains(projectId); + } + } + @Nullable public static VirtualFile getSourceFileByOutput(VirtualFile outputFile) { final OutputFileInfo outputFileInfo = loadOutputInfo(outputFile); @@ -420,6 +465,36 @@ public class TranslatingCompilerFilesMonitor implements ApplicationComponent { } public void initComponent() { + loadSuspendedProjects(); + loadPathsToDelete(); + ensureOutputStorageInitialized(); + } + + private void loadSuspendedProjects() { + final File file = new File(CompilerPaths.getCompilerSystemDirectory(), SUSPENDED_PROJECTS_FILENAME); + try { + final DataInputStream is = new DataInputStream(new BufferedInputStream(new FileInputStream(file))); + try { + final int projectsCount = is.readInt(); + synchronized (myDataLock) { + for (int idx = 0; idx < projectsCount; idx++) { + mySuspendedProjects.add(is.readInt()); + } + } + } + finally { + is.close(); + } + } + catch (FileNotFoundException ignored) { + } + catch (IOException e) { + LOG.info(e); + FileUtil.delete(file); + } + } + + private void loadPathsToDelete() { final File file = new File(CompilerPaths.getCompilerSystemDirectory(), PATHS_TO_DELETE_FILENAME); try { final DataInputStream is = new DataInputStream(new BufferedInputStream(new FileInputStream(file))); @@ -430,20 +505,29 @@ public class TranslatingCompilerFilesMonitor implements ApplicationComponent { final int projectId = is.readInt(); final int size = is.readInt(); if (size > 0) { - final Map map = new HashMap(); - myOutputsToDelete.put(projectId, map); + final Map map; + if (mySuspendedProjects.contains(projectId)) { + map = null; + } + else { + map = new HashMap(); + myOutputsToDelete.put(projectId, map); + } for (int i = 0; i < size; i++) { - final String outputPath = FileUtil.toSystemIndependentName(CompilerIOUtil.readString(is)); + final String _outputPath = CompilerIOUtil.readString(is); final String srcUrl = CompilerIOUtil.readString(is); final String className = CompilerIOUtil.readString(is); + if (map == null) { + continue; + } if (LOG.isDebugEnabled() || ourDebugMode) { - final String message = "INIT path to delete: " + outputPath; + final String message = "INIT path to delete: " + FileUtil.toSystemIndependentName(_outputPath); LOG.debug(message); if (ourDebugMode) { System.out.println(message); } } - map.put(outputPath, new SourceUrlClassNamePair(srcUrl, className)); + map.put(FileUtil.toSystemIndependentName(_outputPath), new SourceUrlClassNamePair(srcUrl, className)); } } } @@ -462,8 +546,6 @@ public class TranslatingCompilerFilesMonitor implements ApplicationComponent { } FileUtil.delete(file); } - - ensureOutputStorageInitialized(); } private void ensureOutputStorageInitialized() { @@ -528,12 +610,46 @@ public class TranslatingCompilerFilesMonitor implements ApplicationComponent { } public void disposeComponent() { + saveSuspendedProjects(); + savePathsToDelete(); + } + + private void saveSuspendedProjects() { + final File file = new File(CompilerPaths.getCompilerSystemDirectory(), SUSPENDED_PROJECTS_FILENAME); + try { + FileUtil.createParentDirs(file); + final DataOutputStream os = new DataOutputStream(new BufferedOutputStream(new FileOutputStream(file))); + try { + synchronized (myDataLock) { + os.writeInt(mySuspendedProjects.size()); + for (int projectId : mySuspendedProjects.toArray()) { + os.writeInt(projectId); + } + } + } + finally { + os.close(); + } + } + catch (IOException e) { + LOG.error(e); + } + } + + private void savePathsToDelete() { final File file = new File(CompilerPaths.getCompilerSystemDirectory(), PATHS_TO_DELETE_FILENAME); try { FileUtil.createParentDirs(file); final DataOutputStream os = new DataOutputStream(new BufferedOutputStream(new FileOutputStream(file))); try { synchronized (myDataLock) { + mySuspendedProjects.forEach(new TIntProcedure() { + @Override + public boolean execute(int projectId) { + myOutputsToDelete.remove(projectId); + return true; + } + }); final int[] keys = myOutputsToDelete.keys(); os.writeInt(keys.length); for (int projectId : keys) { @@ -839,10 +955,12 @@ public class TranslatingCompilerFilesMonitor implements ApplicationComponent { } } - public void clearPaths(final int projectId){ + public boolean clearPaths(final int projectId){ if (myProjectToOutputPathMap != null) { - myProjectToOutputPathMap.remove(projectId); + final Serializable removed = myProjectToOutputPathMap.remove(projectId); + return removed != null; } + return false; } long getTimestamp(final int projectId) { @@ -899,7 +1017,7 @@ public class TranslatingCompilerFilesMonitor implements ApplicationComponent { } public static List getCompiledClassNames(VirtualFile srcFile, Project project) { - SourceFileInfo info = loadSourceInfo(srcFile); + final SourceFileInfo info = loadSourceInfo(srcFile); if (info == null) { return Collections.emptyList(); } @@ -1083,6 +1201,9 @@ public class TranslatingCompilerFilesMonitor implements ApplicationComponent { public void scanSourcesForCompilableFiles(final Project project) { final int projectId = getProjectId(project); + if (isSuspended(projectId)) { + return; + } startAsyncScan(projectId); StartupManager.getInstance(project).runWhenProjectIsInitialized(new Runnable() { public void run() { @@ -1186,11 +1307,21 @@ public class TranslatingCompilerFilesMonitor implements ApplicationComponent { final ProjectRef projRef = new ProjectRef(project); final int projectId = getProjectId(project); + if (CompilerWorkspaceConfiguration.getInstance(project).useCompileServer()) { + suspendProject(project); + } + else { + watchProject(project); + } + conn.subscribe(ProjectTopics.PROJECT_ROOTS, new ModuleRootListener() { private VirtualFile[] myRootsBefore; private Alarm myAlarm = new Alarm(Alarm.ThreadToUse.SWING_THREAD, project); public void beforeRootsChange(final ModuleRootEvent event) { + if (isSuspended(projectId)) { + return; + } try { myRootsBefore = ProjectRootManager.getInstance(projRef.get()).getContentSourceRoots(); } @@ -1200,6 +1331,9 @@ public class TranslatingCompilerFilesMonitor implements ApplicationComponent { } public void rootsChanged(final ModuleRootEvent event) { + if (isSuspended(projectId)) { + return; + } try { final VirtualFile[] rootsBefore = myRootsBefore; myRootsBefore = null; @@ -1323,6 +1457,9 @@ public class TranslatingCompilerFilesMonitor implements ApplicationComponent { if (srcInfo != null) { final boolean srcWillBeDeleted = VfsUtil.isAncestor(eventFile, srcFile, false); for (int projectId : srcInfo.getProjectIds().toArray()) { + if (isSuspended(projectId)) { + continue; + } if (srcInfo.isAssociated(projectId, filePath)) { if (srcWillBeDeleted) { if (LOG.isDebugEnabled() || ourDebugMode) { @@ -1351,6 +1488,9 @@ public class TranslatingCompilerFilesMonitor implements ApplicationComponent { deletionProc.setRootBeingDeleted(eventFile); final int sourceFileId = Math.abs(getFileId(file)); for (int projectId : projects.toArray()) { + if (isSuspended(projectId)) { + continue; + } // mark associated outputs for deletion srcInfo.processOutputPaths(projectId, deletionProc); if (LOG.isDebugEnabled() || ourDebugMode) { @@ -1390,7 +1530,15 @@ public class TranslatingCompilerFilesMonitor implements ApplicationComponent { final SourceFileInfo srcInfo = file.isValid()? loadSourceInfo(file) : null; if (srcInfo != null) { for (int projectId : srcInfo.getProjectIds().toArray()) { - addSourceForRecompilation(projectId, file, srcInfo); + if (isSuspended(projectId)) { + if (srcInfo.clearPaths(projectId)) { + srcInfo.updateTimestamp(projectId, -1L); + saveSourceInfo(file, srcInfo); + } + } + else { + addSourceForRecompilation(projectId, file, srcInfo); + } } } else { @@ -1415,8 +1563,11 @@ public class TranslatingCompilerFilesMonitor implements ApplicationComponent { if (!project.isInitialized()) { continue; // the content of this project will be scanned during its post-startup activities } - final ProjectRootManager rootManager = ProjectRootManager.getInstance(project); final int projectId = getProjectId(project); + if (isSuspended(projectId)) { + continue; + } + final ProjectRootManager rootManager = ProjectRootManager.getInstance(project); if (rootManager.getFileIndex().isInSourceContent(file)) { final TranslatingCompiler[] translators = CompilerManager.getInstance(project).getCompilers(TranslatingCompiler.class); processRecursively(file, false, new FileProcessor() { diff --git a/java/compiler/impl/src/com/intellij/compiler/options/CompilerUIConfigurable.java b/java/compiler/impl/src/com/intellij/compiler/options/CompilerUIConfigurable.java index 783925920601..11a36baa4e36 100644 --- a/java/compiler/impl/src/com/intellij/compiler/options/CompilerUIConfigurable.java +++ b/java/compiler/impl/src/com/intellij/compiler/options/CompilerUIConfigurable.java @@ -110,11 +110,14 @@ public class CompilerUIConfigurable implements SearchableConfigurable, Configura applyResourcePatterns(extensionString, (CompilerConfigurationImpl)CompilerConfiguration.getInstance(myProject)); // this will schedule for compilation all files that might become compilable after resource patterns' changing - TranslatingCompilerFilesMonitor.getInstance().scanSourcesForCompilableFiles(myProject); + final TranslatingCompilerFilesMonitor monitor = TranslatingCompilerFilesMonitor.getInstance(); if (!workspaceConfiguration.USE_COMPILE_SERVER) { CompileServerManager.getInstance().shutdownServer(); + monitor.watchProject(myProject); + monitor.scanSourcesForCompilableFiles(myProject); } else { + monitor.suspendProject(myProject); SwingUtilities.invokeLater(new Runnable() { public void run() { CompileServerManager.getInstance().sendReloadRequest(myProject); diff --git a/java/compiler/openapi/src/com/intellij/openapi/compiler/CompilerPaths.java b/java/compiler/openapi/src/com/intellij/openapi/compiler/CompilerPaths.java index 798e2b1d9fa2..7f21c224225f 100644 --- a/java/compiler/openapi/src/com/intellij/openapi/compiler/CompilerPaths.java +++ b/java/compiler/openapi/src/com/intellij/openapi/compiler/CompilerPaths.java @@ -82,6 +82,10 @@ public class CompilerPaths { return new File(getCompilerSystemDirectory(project), ".caches"); } + public static File getRebuildMarkerFile(Project project) { + return new File(getCompilerSystemDirectory(project), "rebuild_required"); + } + /** * @param project * @return a directory under IDEA "system" directory where all files related to compiler subsystem are stored (such as compiler caches or generated files) From 655797b066078b1c865265feecfbcfe17c9f6a6d Mon Sep 17 00:00:00 2001 From: Dmitry Boulytchev Date: Wed, 8 Feb 2012 03:22:25 +0400 Subject: [PATCH 126/215] A small optimization in integrate (compile server). --- .../ether/dependencyView/Mappings.java | 50 ++++++++++++++++++- 1 file changed, 48 insertions(+), 2 deletions(-) diff --git a/jps/model/src/org/jetbrains/ether/dependencyView/Mappings.java b/jps/model/src/org/jetbrains/ether/dependencyView/Mappings.java index 2d0141c4cb2d..0c58185cef4a 100644 --- a/jps/model/src/org/jetbrains/ether/dependencyView/Mappings.java +++ b/jps/model/src/org/jetbrains/ether/dependencyView/Mappings.java @@ -32,6 +32,23 @@ public class Mappings { private final boolean myIsDelta; private final boolean myDeltaIsTransient; + private boolean myIsDifferentiated = false; + + private final List myChangedClasses; + + private void addChangedClass(final DependencyContext.S it) { + assert (myChangedClasses != null); + myChangedClasses.add(it); + myIsDifferentiated = true; + } + + private Collection getChangedClasses() { + return myChangedClasses; + } + + private boolean isDifferentiated() { + return myIsDifferentiated; + } private final File myRootDir; private DependencyContext myContext; @@ -92,6 +109,7 @@ public class Mappings { private Mappings(final Mappings base) throws IOException { myIsDelta = true; + myChangedClasses = new LinkedList(); myDeltaIsTransient = base.myDeltaIsTransient; myRootDir = new File(FileUtil.toSystemIndependentName(base.myRootDir.getAbsolutePath()) + File.separatorChar + "delta"); myContext = base.myContext; @@ -102,6 +120,7 @@ public class Mappings { public Mappings(final File rootDir, final boolean transientDelta) throws IOException { myIsDelta = false; + myChangedClasses = null; myDeltaIsTransient = transientDelta; myRootDir = rootDir; createImplementation(); @@ -820,6 +839,8 @@ public class Mappings { self.appendDependents(it, dependants); + delta.addChangedClass(it.name); + debug("Changed: ", it.name); final int addedModifiers = diff.addedModifiers(); @@ -1382,6 +1403,7 @@ public class Mappings { debug("Processing removed classes:"); for (ClassRepr c : classDiff.removed()) { + delta.addChangedClass(c.name); self.appendDependents(c, dependants); debug("Adding usages of class ", c.name); affectedUsages.add(c.createUsage()); @@ -1390,6 +1412,8 @@ public class Mappings { debug("Processing added classes:"); for (ClassRepr c : classDiff.added()) { + delta.addChangedClass(c.name); + final Collection depClasses = myClassToClassDependency.get(c.name); if (depClasses != null) { @@ -1531,11 +1555,33 @@ public class Mappings { } } - myClassToSubclasses.putAll(delta.myClassToSubclasses); + if (delta.isDifferentiated()) { + for (DependencyContext.S c : delta.getChangedClasses()) { + myClassToSubclasses.remove(c); + + final Collection subClasses = delta.myClassToSubclasses.get(c); + + if (subClasses != null) { + myClassToSubclasses.put(c, subClasses); + } + + myClassToSourceFile.remove(c); + + final DependencyContext.S sourceFile = delta.myClassToSourceFile.get(c); + + if (sourceFile != null) { + myClassToSourceFile.put(c, sourceFile); + } + } + } + else { + myClassToSubclasses.putAll(delta.myClassToSubclasses); + myClassToSourceFile.putAll(delta.myClassToSourceFile); + } + mySourceFileToClasses.putAll(delta.mySourceFileToClasses); mySourceFileToUsages.putAll(delta.mySourceFileToUsages); mySourceFileToAnnotationUsages.putAll(delta.mySourceFileToAnnotationUsages); - myClassToSourceFile.putAll(delta.myClassToSourceFile); final Collection compiledSet = new HashSet(compiled.size()); From 7b29634fb8d06da0368c481faa05eb9b9813a2b7 Mon Sep 17 00:00:00 2001 From: "Denis.Zhdanov" Date: Tue, 7 Feb 2012 15:32:57 +0400 Subject: [PATCH 127/215] Correct editor size calculation in situation with the single long soft wrapped line --- .../src/com/intellij/openapi/editor/impl/EditorImpl.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorImpl.java b/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorImpl.java index f286def57c1f..90af164413ba 100644 --- a/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorImpl.java @@ -6090,6 +6090,11 @@ public final class EditorImpl extends UserDataHolderBase implements EditorEx, Hi Rectangle visibleArea = getScrollingModel().getVisibleArea(); startToUse = yPositionToLogicalLine(visibleArea.getLocation().y); endToUse = Math.min(endToUse, yPositionToLogicalLine(visibleArea.y + visibleArea.height)); + if (endToUse <= startToUse) { + // There is a possible case that there is the only soft-wrapped line, i.e. end == start. We still want to update the + // size container's width then. + endToUse = Math.min(myLineWidths.size(), startToUse + 1); + } } int maxWidth = 0; for (int i = startToUse; i < endToUse; i++) { From f7b7e4cad75f95f9a519f24a080db1c8f8d74e8f Mon Sep 17 00:00:00 2001 From: "Denis.Zhdanov" Date: Wed, 8 Feb 2012 11:58:40 +0400 Subject: [PATCH 128/215] IDEA-76142: Gradle support - cannot update IDEA projects once one of build.gradle files changes 1. Introduced 'import gradle entity' infrastructure; 2. Implemented 'import gradle library dependency'; --- .../openapi/ui/SimpleToolWindowPanel.java | 4 +- .../resources/i18n/GradleBundle.properties | 2 + plugins/gradle/src/META-INF/plugin.xml | 20 ++- .../action/GradleImportEntityAction.java | 131 +++++++++++++++ .../plugins/gradle/diff/PlatformFacade.java | 4 + .../gradle/diff/PlatformFacadeImpl.java | 8 + .../importing/GradleContentRootImporter.java | 16 ++ .../GradleModuleDependencyImporter.java | 152 ++++++++++++++++++ .../importing/GradleModuleImporter.java | 125 ++++++++++++++ .../importing/GradleModulesImporter.java | 1 + .../GradleAdjustImportSettingsStep.java | 2 +- .../adjust/GradleProjectStructureFactory.java | 2 +- .../gradle/model/GradleDependency.java | 3 + .../gradle/model/GradleEntityType.java | 9 ++ .../GradleProjectStructureChangesPanel.java | 37 ++++- .../sync/GradleProjectStructureHelper.java | 83 ++++++---- .../sync/GradleProjectStructureTreeModel.java | 29 ++-- .../plugins/gradle/ui/GradleDataKeys.java | 18 +++ .../gradle/ui/GradleProjectStructureNode.java | 17 +- .../GradleProjectStructureNodeDescriptor.java | 7 +- .../plugins/gradle/util/GradleConstants.java | 11 +- 21 files changed, 616 insertions(+), 65 deletions(-) create mode 100644 plugins/gradle/src/org/jetbrains/plugins/gradle/action/GradleImportEntityAction.java create mode 100644 plugins/gradle/src/org/jetbrains/plugins/gradle/importing/GradleContentRootImporter.java create mode 100644 plugins/gradle/src/org/jetbrains/plugins/gradle/importing/GradleModuleDependencyImporter.java create mode 100644 plugins/gradle/src/org/jetbrains/plugins/gradle/importing/GradleModuleImporter.java create mode 100644 plugins/gradle/src/org/jetbrains/plugins/gradle/model/GradleEntityType.java create mode 100644 plugins/gradle/src/org/jetbrains/plugins/gradle/ui/GradleDataKeys.java diff --git a/platform/platform-api/src/com/intellij/openapi/ui/SimpleToolWindowPanel.java b/platform/platform-api/src/com/intellij/openapi/ui/SimpleToolWindowPanel.java index 5db53a0c3157..8198230777a4 100644 --- a/platform/platform-api/src/com/intellij/openapi/ui/SimpleToolWindowPanel.java +++ b/platform/platform-api/src/com/intellij/openapi/ui/SimpleToolWindowPanel.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2009 JetBrains s.r.o. + * Copyright 2000-2012 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -24,6 +24,7 @@ import com.intellij.ui.switcher.QuickActionProvider; import com.intellij.util.ui.AwtVisitor; import com.intellij.util.ui.UIUtil; import org.jetbrains.annotations.NonNls; +import org.jetbrains.annotations.Nullable; import javax.swing.*; import java.awt.*; @@ -87,6 +88,7 @@ public class SimpleToolWindowPanel extends JPanel implements QuickActionProvider repaint(); } + @Nullable public Object getData(@NonNls String dataId) { return QuickActionProvider.KEY.is(dataId) && myProvideQuickActions ? this : null; } diff --git a/plugins/gradle/resources/i18n/GradleBundle.properties b/plugins/gradle/resources/i18n/GradleBundle.properties index 205b4ac96bb6..e85e37d53385 100644 --- a/plugins/gradle/resources/i18n/GradleBundle.properties +++ b/plugins/gradle/resources/i18n/GradleBundle.properties @@ -77,6 +77,8 @@ gradle.action.refresh.project.text=Refresh gradle project gradle.action.refresh.project.description=Allows to force linked gradle project refresh gradle.action.open.script.text=Open linked gradle project gradle.action.open.script.description=Allows to open project file of the linked gradle project at the editor +gradle.action.import.entity.text=Import +gradle.action.import.entity.description=Import target gradle entity gradle.settings.color.text.sample.conflict.node.name=node-with-conflicting-setup gradle.settings.color.text.sample.node.sync.name=node-with-same-setup diff --git a/plugins/gradle/src/META-INF/plugin.xml b/plugins/gradle/src/META-INF/plugin.xml index ca35a79bc1eb..ff4374eb52a2 100644 --- a/plugins/gradle/src/META-INF/plugin.xml +++ b/plugins/gradle/src/META-INF/plugin.xml @@ -34,17 +34,25 @@ - - + - + + + + + + + + + + @@ -72,10 +80,14 @@ + + + + \ No newline at end of file diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/action/GradleImportEntityAction.java b/plugins/gradle/src/org/jetbrains/plugins/gradle/action/GradleImportEntityAction.java new file mode 100644 index 000000000000..5000c5995b7e --- /dev/null +++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/action/GradleImportEntityAction.java @@ -0,0 +1,131 @@ +package org.jetbrains.plugins.gradle.action; + +import com.intellij.openapi.actionSystem.AnAction; +import com.intellij.openapi.actionSystem.AnActionEvent; +import com.intellij.openapi.actionSystem.DataContext; +import com.intellij.openapi.actionSystem.PlatformDataKeys; +import com.intellij.openapi.components.ServiceManager; +import com.intellij.openapi.diagnostic.Logger; +import com.intellij.openapi.module.Module; +import com.intellij.openapi.project.Project; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import org.jetbrains.plugins.gradle.config.GradleTextAttributes; +import org.jetbrains.plugins.gradle.importing.GradleModuleDependencyImporter; +import org.jetbrains.plugins.gradle.importing.GradleModuleImporter; +import org.jetbrains.plugins.gradle.model.GradleLibraryDependency; +import org.jetbrains.plugins.gradle.model.GradleLibraryDependencyId; +import org.jetbrains.plugins.gradle.model.GradleModule; +import org.jetbrains.plugins.gradle.sync.GradleProjectStructureHelper; +import org.jetbrains.plugins.gradle.ui.GradleDataKeys; +import org.jetbrains.plugins.gradle.ui.GradleProjectStructureNode; +import org.jetbrains.plugins.gradle.util.GradleBundle; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.List; + +/** + * Imports target {@link GradleTextAttributes#GRADLE_LOCAL_CHANGE 'gradle local'} entity to the current intellij project. + *

+ * Not thread-safe. + * + * @author Denis Zhdanov + * @since 2/7/12 10:32 AM + */ +public class GradleImportEntityAction extends AnAction { + + private static final Logger LOG = Logger.getInstance("#" + GradleImportEntityAction.class.getName()); + + public GradleImportEntityAction() { + getTemplatePresentation().setText(GradleBundle.message("gradle.action.import.entity.text")); + getTemplatePresentation().setDescription(GradleBundle.message("gradle.action.import.entity.description")); + } + + @Override + public void update(AnActionEvent e) { + final Collection> nodes = getInterestedNodes(e.getDataContext()); + e.getPresentation().setEnabled(!nodes.isEmpty()); + } + + @Override + public void actionPerformed(AnActionEvent e) { + final Project project = PlatformDataKeys.PROJECT.getData(e.getDataContext()); + if (project == null) { + LOG.warn("Can't import gradle-local entities. Reason: target intellij project is undefined"); + return; + } + + final Collection> nodes = getInterestedNodes(e.getDataContext()); + + // We need to import not only the selected nodes but their gradle-local parents as well. + List> nodesToImport = new ArrayList>(); + for (GradleProjectStructureNode node : nodes) { + collectHierarchyToImport(node, nodesToImport); + } + + GradleProjectStructureHelper projectStructureHelper = project.getComponent(GradleProjectStructureHelper.class); + GradleModuleImporter moduleImporter = ServiceManager.getService(GradleModuleImporter.class); + GradleModuleDependencyImporter dependencyImporter = ServiceManager.getService(GradleModuleDependencyImporter.class); + + for (GradleProjectStructureNode node : nodesToImport) { + switch (node.getType()) { + case MODULE: + final GradleModule gradleModule = projectStructureHelper.findGradleModuleByName(node.getDescriptor().getName()); + if (gradleModule != null) { + moduleImporter.importModule(gradleModule, project); + } + break; + case LIBRARY_DEPENDENCY: + final Object element = node.getDescriptor().getElement(); + if (!(element instanceof GradleLibraryDependencyId)) { + break; + } + GradleLibraryDependencyId id = (GradleLibraryDependencyId)element; + final GradleLibraryDependency dependency = projectStructureHelper.findLibraryDependency(id); + final Module intellijModule = projectStructureHelper.findIntellijModuleByName(id.getModuleName()); + if (dependency != null && intellijModule != null) { + dependencyImporter.importDependency(dependency, intellijModule); + } + break; + default: // Do nothing + } + } + } + + /** + * When particular gradle-local node is asked to be imported we need to import its gradle-local parent hierarchy as well. + *

+ * This method allows to collect all parent nodes of the given nodes that should be imported as well. + *

+ * Note: those nodes are added to the given collection starting from the topmost one. + * + * @param node target node + * @param storage target nodes storage + */ + private static void collectHierarchyToImport(@Nullable GradleProjectStructureNode node, + @NotNull Collection> storage) + { + if (node == null || node.getDescriptor().getAttributes() != GradleTextAttributes.GRADLE_LOCAL_CHANGE) { + return; + } + collectHierarchyToImport(node.getParent(), storage); + storage.add(node); + } + + @NotNull + private static Collection> getInterestedNodes(@NotNull DataContext context) { + final Collection> selectedNodes = GradleDataKeys.SYNC_TREE_NODE.getData(context); + if (selectedNodes == null) { + return Collections.emptyList(); + } + List> result = new ArrayList>(); + for (GradleProjectStructureNode node : selectedNodes) { + if (node.getDescriptor().getAttributes() == GradleTextAttributes.GRADLE_LOCAL_CHANGE) { + result.add(node); + } + } + return result; + } +} diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/diff/PlatformFacade.java b/plugins/gradle/src/org/jetbrains/plugins/gradle/diff/PlatformFacade.java index 529fea913a98..bc8c9302a5a3 100644 --- a/plugins/gradle/src/org/jetbrains/plugins/gradle/diff/PlatformFacade.java +++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/diff/PlatformFacade.java @@ -3,6 +3,7 @@ package org.jetbrains.plugins.gradle.diff; import com.intellij.openapi.module.Module; import com.intellij.openapi.project.Project; import com.intellij.openapi.roots.OrderEntry; +import com.intellij.openapi.roots.libraries.LibraryTable; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.pom.java.LanguageLevel; import org.jetbrains.annotations.NotNull; @@ -28,6 +29,9 @@ import java.util.Collection; */ public interface PlatformFacade { + @NotNull + LibraryTable getProjectLibraryTable(@NotNull Project project); + @NotNull LanguageLevel getLanguageLevel(@NotNull Project project); diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/diff/PlatformFacadeImpl.java b/plugins/gradle/src/org/jetbrains/plugins/gradle/diff/PlatformFacadeImpl.java index b4a82429a169..84ae46eda4a4 100644 --- a/plugins/gradle/src/org/jetbrains/plugins/gradle/diff/PlatformFacadeImpl.java +++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/diff/PlatformFacadeImpl.java @@ -8,6 +8,8 @@ import com.intellij.openapi.project.Project; import com.intellij.openapi.roots.LanguageLevelProjectExtension; import com.intellij.openapi.roots.ModuleRootManager; import com.intellij.openapi.roots.OrderEntry; +import com.intellij.openapi.roots.impl.libraries.ProjectLibraryTable; +import com.intellij.openapi.roots.libraries.LibraryTable; import com.intellij.openapi.util.IconLoader; import com.intellij.openapi.vfs.JarFileSystem; import com.intellij.openapi.vfs.VirtualFile; @@ -24,6 +26,12 @@ import java.util.Collection; */ public class PlatformFacadeImpl implements PlatformFacade { + @NotNull + @Override + public LibraryTable getProjectLibraryTable(@NotNull Project project) { + return ProjectLibraryTable.getInstance(project); + } + @NotNull @Override public LanguageLevel getLanguageLevel(@NotNull Project project) { diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/importing/GradleContentRootImporter.java b/plugins/gradle/src/org/jetbrains/plugins/gradle/importing/GradleContentRootImporter.java new file mode 100644 index 000000000000..16e0baf4b191 --- /dev/null +++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/importing/GradleContentRootImporter.java @@ -0,0 +1,16 @@ +package org.jetbrains.plugins.gradle.importing; + +import com.intellij.openapi.module.Module; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.plugins.gradle.model.GradleContentRoot; + +/** + * @author Denis Zhdanov + * @since 2/7/12 3:20 PM + */ +public class GradleContentRootImporter { + + public void importContentRoots(@NotNull Iterable contentRoots, @NotNull Module module) { + // TODO den implement + } +} diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/importing/GradleModuleDependencyImporter.java b/plugins/gradle/src/org/jetbrains/plugins/gradle/importing/GradleModuleDependencyImporter.java new file mode 100644 index 000000000000..ada5a3a5d389 --- /dev/null +++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/importing/GradleModuleDependencyImporter.java @@ -0,0 +1,152 @@ +package org.jetbrains.plugins.gradle.importing; + +import com.intellij.openapi.application.ApplicationManager; +import com.intellij.openapi.module.Module; +import com.intellij.openapi.roots.*; +import com.intellij.openapi.roots.libraries.Library; +import com.intellij.openapi.roots.libraries.LibraryTable; +import com.intellij.openapi.vfs.JarFileSystem; +import com.intellij.openapi.vfs.LocalFileSystem; +import com.intellij.openapi.vfs.VirtualFile; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.plugins.gradle.diff.PlatformFacade; +import org.jetbrains.plugins.gradle.model.*; +import org.jetbrains.plugins.gradle.util.GradleLog; + +import java.io.File; +import java.util.*; + +/** + * @author Denis Zhdanov + * @since 2/7/12 3:23 PM + */ +public class GradleModuleDependencyImporter { + + private static final Map LIBRARY_ROOT_MAPPINGS + = new EnumMap(LibraryPathType.class); + static { + LIBRARY_ROOT_MAPPINGS.put(LibraryPathType.BINARY, OrderRootType.CLASSES); + LIBRARY_ROOT_MAPPINGS.put(LibraryPathType.SOURCE, OrderRootType.SOURCES); + LIBRARY_ROOT_MAPPINGS.put(LibraryPathType.DOC, JavadocOrderRootType.getInstance()); + assert LibraryPathType.values().length == LIBRARY_ROOT_MAPPINGS.size(); + } + + @NotNull private final PlatformFacade myPlatformFacade; + + public GradleModuleDependencyImporter(@NotNull PlatformFacade platformFacade) { + myPlatformFacade = platformFacade; + } + + public void importDependency(@NotNull GradleDependency dependency, @NotNull Module module) { + importDependencies(Collections.singleton(dependency), module); + } + + public void importDependencies(@NotNull Iterable dependencies, @NotNull Module module) { + final List moduleDependencies = new ArrayList(); + final List libraryDependencies = new ArrayList(); + GradleEntityVisitor visitor = new GradleEntityVisitorAdapter() { + @Override + public void visit(@NotNull GradleModuleDependency dependency) { + moduleDependencies.add(dependency); + } + + @Override + public void visit(@NotNull GradleLibraryDependency dependency) { + libraryDependencies.add(dependency); + } + }; + for (GradleDependency dependency : dependencies) { + dependency.invite(visitor); + } + importLibraryDependencies(libraryDependencies, module); + importModuleDependencies(moduleDependencies, module); + } + + public void importModuleDependencies(@NotNull Iterable dependencies, @NotNull Module module) { + // TODO den implement + } + + public void importLibraryDependencies(@NotNull final Iterable dependencies, @NotNull final Module module) { + // TODO den make non-EDT agnostic + final LibraryTable libraryTable = myPlatformFacade.getProjectLibraryTable(module.getProject()); + final Map gradle2intellij = new HashMap(); + final Set librariesToCreate = new HashSet(); + for (final GradleLibraryDependency dependency : dependencies) { + // Try to find existing library in project libraries. + Library library = libraryTable.getLibraryByName(dependency.getName()); + if (library == null) { + librariesToCreate.add(dependency.getTarget()); + } + else { + gradle2intellij.put(dependency.getTarget(), library); + } + } + + ApplicationManager.getApplication().runWriteAction(new Runnable() { + @Override + public void run() { + // Create all necessary libraries. + if (!librariesToCreate.isEmpty()) { + final LibraryTable.ModifiableModel projectLibraryModel = libraryTable.getModifiableModel(); + try { + for (GradleLibrary library : librariesToCreate) { + final Library intellijLibrary = projectLibraryModel.createLibrary(library.getName()); + gradle2intellij.put(library, intellijLibrary); + final Library.ModifiableModel libraryModel = intellijLibrary.getModifiableModel(); + try { + registerPaths(library, libraryModel); + } + finally { + libraryModel.commit(); + } + } + } + finally { + projectLibraryModel.commit(); + } + } + + // Register library dependencies. + ModuleRootManager moduleRootManager = ModuleRootManager.getInstance(module); + final ModifiableRootModel moduleRootModel = moduleRootManager.getModifiableModel(); + try { + for (GradleLibraryDependency dependency : dependencies) { + LibraryOrderEntry orderEntry = moduleRootModel.addLibraryEntry(gradle2intellij.get(dependency.getTarget())); + orderEntry.setExported(dependency.isExported()); + orderEntry.setScope(dependency.getScope()); + } + } + finally { + moduleRootModel.commit(); + } + // TODO den refresh gradle project tree + } + }); + } + + private static void registerPaths(@NotNull GradleLibrary gradleLibrary, @NotNull Library.ModifiableModel model) { + for (LibraryPathType pathType : LibraryPathType.values()) { + for (String path : gradleLibrary.getPaths(pathType)) { + VirtualFile virtualFile = LocalFileSystem.getInstance().findFileByIoFile(new File(path)); + if (virtualFile == null) { + GradleLog.LOG.warn(String.format("Can't find %s of the library '%s' at path '%s'", pathType, gradleLibrary.getName(), path)); + continue; + } + if (virtualFile.isDirectory()) { + model.addRoot(virtualFile, LIBRARY_ROOT_MAPPINGS.get(pathType)); + } + else { + VirtualFile jarRoot = JarFileSystem.getInstance().getJarRootForLocalFile(virtualFile); + if (jarRoot == null) { + GradleLog.LOG.warn(String.format( + "Can't parse contents of the jar file at path '%s' for the library '%s''", path, gradleLibrary.getName() + )); + continue; + } + model.addRoot(jarRoot, LIBRARY_ROOT_MAPPINGS.get(pathType)); + } + } + } + } + +} diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/importing/GradleModuleImporter.java b/plugins/gradle/src/org/jetbrains/plugins/gradle/importing/GradleModuleImporter.java new file mode 100644 index 000000000000..7ee3a1eac434 --- /dev/null +++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/importing/GradleModuleImporter.java @@ -0,0 +1,125 @@ +package org.jetbrains.plugins.gradle.importing; + +import com.intellij.openapi.application.Application; +import com.intellij.openapi.application.ApplicationManager; +import com.intellij.openapi.module.Module; +import com.intellij.openapi.module.ModuleManager; +import com.intellij.openapi.module.StdModuleTypes; +import com.intellij.openapi.project.Project; +import com.intellij.util.Alarm; +import com.intellij.util.containers.hash.HashMap; +import com.intellij.util.ui.UIUtil; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.plugins.gradle.model.GradleModule; +import org.jetbrains.plugins.gradle.util.GradleLog; + +import java.io.File; +import java.util.Collections; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +/** + * Encapsulates functionality of importing gradle module to the intellij project. + * + * @author Denis Zhdanov + * @since 2/7/12 2:49 PM + */ +public class GradleModuleImporter { + + /** + * We can't modify project modules (add/remove) until it's initialised, so, we delay that activity. Current constant + * holds number of milliseconds to wait between 'after project initialisation' processing attempts. + */ + private static final int PROJECT_INITIALISATION_DELAY_MS = (int)TimeUnit.SECONDS.toMillis(1); + + private final Alarm myAlarm = new Alarm(Alarm.ThreadToUse.SHARED_THREAD); + + @NotNull private final GradleContentRootImporter myContentRootImporter; + @NotNull private final GradleModuleDependencyImporter myDependencyImporter; + + public GradleModuleImporter(@NotNull GradleContentRootImporter contentRootImporter, + @NotNull GradleModuleDependencyImporter dependencyImporter) + { + myContentRootImporter = contentRootImporter; + myDependencyImporter = dependencyImporter; + } + + public void importModule(@NotNull GradleModule module, @NotNull Project project) { + importModules(Collections.singleton(module), project, false); + } + + public void importModules(@NotNull final Iterable modules, @NotNull final Project project, final boolean recursive) { + if (!project.isInitialized()) { + myAlarm.addRequest(new ImportModulesTask(project, modules, recursive), PROJECT_INITIALISATION_DELAY_MS); + return; + } + UIUtil.invokeLaterIfNeeded(new Runnable() { + @Override + public void run() { + removeExistingModulesConfigs(modules); + Application application = ApplicationManager.getApplication(); + final Map moduleMappings = new HashMap(); + application.runWriteAction(new Runnable() { + @Override + public void run() { + final ModuleManager moduleManager = ModuleManager.getInstance(project); + for (GradleModule module : modules) { + final Module created = moduleManager.newModule(module.getModuleFilePath(), StdModuleTypes.JAVA); + moduleMappings.put(module, created); + } + } + }); + if (!recursive) { + return; + } + for (GradleModule gradleModule : modules) { + final Module intellijModule = moduleMappings.get(gradleModule); + myContentRootImporter.importContentRoots(gradleModule.getContentRoots(), intellijModule); + myDependencyImporter.importDependencies(gradleModule.getDependencies(), intellijModule); + } + } + }); + } + + private static void removeExistingModulesConfigs(@NotNull Iterable modules) { + for (GradleModule module : modules) { + // Remove existing '*.iml' file if necessary. + final String moduleFilePath = module.getModuleFilePath(); + File file = new File(moduleFilePath); + if (file.isFile()) { + boolean success = file.delete(); + if (!success) { + GradleLog.LOG.warn("Can't remove existing module file at '" + moduleFilePath + "'"); + } + } + } + } + + private class ImportModulesTask implements Runnable { + + private final Project myProject; + private final Iterable myModules; + private final boolean myRecursive; + + ImportModulesTask(@NotNull Project project, @NotNull Iterable modules, boolean recursive) { + myProject = project; + myModules = modules; + myRecursive = recursive; + } + + @Override + public void run() { + myAlarm.cancelAllRequests(); + if (!myProject.isInitialized()) { + myAlarm.addRequest( + new ImportModulesTask(myProject, myModules, myRecursive), + PROJECT_INITIALISATION_DELAY_MS + ); + return; + } + + importModules(myModules, myProject, myRecursive); + } + } + +} diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/importing/GradleModulesImporter.java b/plugins/gradle/src/org/jetbrains/plugins/gradle/importing/GradleModulesImporter.java index 0753b80c148f..5a6de37bf1d0 100644 --- a/plugins/gradle/src/org/jetbrains/plugins/gradle/importing/GradleModulesImporter.java +++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/importing/GradleModulesImporter.java @@ -40,6 +40,7 @@ import java.util.concurrent.TimeUnit; * @author Denis Zhdanov * @since 8/26/11 10:01 AM */ +// TODO den remove public class GradleModulesImporter { private static final Map LIBRARY_ROOT_MAPPINGS diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/importing/wizard/adjust/GradleAdjustImportSettingsStep.java b/plugins/gradle/src/org/jetbrains/plugins/gradle/importing/wizard/adjust/GradleAdjustImportSettingsStep.java index 4d6fb05e6100..f9bd8e7d8f6f 100644 --- a/plugins/gradle/src/org/jetbrains/plugins/gradle/importing/wizard/adjust/GradleAdjustImportSettingsStep.java +++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/importing/wizard/adjust/GradleAdjustImportSettingsStep.java @@ -260,7 +260,7 @@ public class GradleAdjustImportSettingsStep extends AbstractImportFromGradleWiza // We build tree node, its settings control and map them altogether. The only trick here is that nodes can reuse the same // settings control (e.g. more than one node may have the same library as a dependency, so, library dependency node for // every control will use the same settings control). - GradleProjectStructureNode result = new GradleProjectStructureNode(myFactory.buildDescriptor(entity)); + GradleProjectStructureNode result = new GradleProjectStructureNode(myFactory.buildDescriptor(entity), GradleEntityType.SYNTHETIC); Pair> pair = processed.get(entity); if (pair == null) { String cardName = String.valueOf(counter); diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/importing/wizard/adjust/GradleProjectStructureFactory.java b/plugins/gradle/src/org/jetbrains/plugins/gradle/importing/wizard/adjust/GradleProjectStructureFactory.java index 95989623ae96..fef410ddc578 100644 --- a/plugins/gradle/src/org/jetbrains/plugins/gradle/importing/wizard/adjust/GradleProjectStructureFactory.java +++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/importing/wizard/adjust/GradleProjectStructureFactory.java @@ -138,7 +138,7 @@ public class GradleProjectStructureFactory { return; } for (GradleProjectStructureNode node : treeNodes) { - node.getDescriptor().setText(evt.getNewValue().toString()); + node.getDescriptor().setName(evt.getNewValue().toString()); model.nodeChanged(node); } } diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/model/GradleDependency.java b/plugins/gradle/src/org/jetbrains/plugins/gradle/model/GradleDependency.java index cc6558f17909..a20b775c2a06 100644 --- a/plugins/gradle/src/org/jetbrains/plugins/gradle/model/GradleDependency.java +++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/model/GradleDependency.java @@ -15,6 +15,9 @@ public interface GradleDependency extends GradleEntity { @NotNull DependencyScope getScope(); + + @NotNull + GradleModule getOwnerModule(); @NotNull GradleDependency clone(@NotNull GradleEntityCloneContext context); diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/model/GradleEntityType.java b/plugins/gradle/src/org/jetbrains/plugins/gradle/model/GradleEntityType.java new file mode 100644 index 000000000000..948903544476 --- /dev/null +++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/model/GradleEntityType.java @@ -0,0 +1,9 @@ +package org.jetbrains.plugins.gradle.model; + +/** + * @author Denis Zhdanov + * @since 2/7/12 11:18 AM + */ +public enum GradleEntityType { + PROJECT, MODULE, LIBRARY_DEPENDENCY, SYNTHETIC +} diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/sync/GradleProjectStructureChangesPanel.java b/plugins/gradle/src/org/jetbrains/plugins/gradle/sync/GradleProjectStructureChangesPanel.java index 72c5e424f100..ee03292076d2 100644 --- a/plugins/gradle/src/org/jetbrains/plugins/gradle/sync/GradleProjectStructureChangesPanel.java +++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/sync/GradleProjectStructureChangesPanel.java @@ -1,20 +1,27 @@ package org.jetbrains.plugins.gradle.sync; +import com.intellij.ide.ui.customization.CustomizationUtil; import com.intellij.openapi.project.Project; import com.intellij.ui.treeStructure.Tree; import com.intellij.util.containers.ContainerUtil; import com.intellij.util.ui.UIUtil; +import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import org.jetbrains.plugins.gradle.config.GradleToolWindowPanel; import org.jetbrains.plugins.gradle.diff.GradleProjectStructureChange; import org.jetbrains.plugins.gradle.diff.PlatformFacade; +import org.jetbrains.plugins.gradle.ui.GradleDataKeys; +import org.jetbrains.plugins.gradle.ui.GradleProjectStructureNode; import org.jetbrains.plugins.gradle.util.GradleConstants; import javax.swing.*; import javax.swing.tree.DefaultMutableTreeNode; import javax.swing.tree.TreePath; import java.awt.*; +import java.util.ArrayList; import java.util.Collection; +import java.util.List; /** * UI control for showing difference between the gradle and intellij project structure. @@ -24,6 +31,7 @@ import java.util.Collection; */ public class GradleProjectStructureChangesPanel extends GradleToolWindowPanel { + private Tree myTree; private GradleProjectStructureTreeModel myTreeModel; private JPanel myContent; @@ -52,14 +60,16 @@ public class GradleProjectStructureChangesPanel extends GradleToolWindowPanel { private void init() { myContent = new JPanel(new GridBagLayout()); myTreeModel = new GradleProjectStructureTreeModel(getProject(), getProjectFacade(), getProjectStructureHelper()); - Tree tree = new Tree(myTreeModel); - applyInitialAppearance(tree, (DefaultMutableTreeNode)myTreeModel.getRoot()); + myTree = new Tree(myTreeModel); + applyInitialAppearance(myTree, (DefaultMutableTreeNode)myTreeModel.getRoot()); GridBagConstraints constraints = new GridBagConstraints(); constraints.fill = GridBagConstraints.BOTH; constraints.weightx = constraints.weighty = 1; - myContent.add(tree, constraints); - myContent.setBackground(tree.getBackground()); + myContent.add(myTree, constraints); + myContent.setBackground(myTree.getBackground()); + + CustomizationUtil.installPopupHandler(myTree, GradleConstants.ACTION_GROUP_SYNC_TREE, GradleConstants.SYNC_TREE_PLACE); } @NotNull @@ -75,6 +85,25 @@ public class GradleProjectStructureChangesPanel extends GradleToolWindowPanel { int i = 1; } + @Nullable + @Override + public Object getData(@NonNls String dataId) { + if (GradleDataKeys.SYNC_TREE_NODE.is(dataId)) { + TreePath[] paths = myTree.getSelectionPaths(); + if (paths == null) { + return null; + } + List> result = new ArrayList>(); + for (TreePath path : paths) { + result.add((GradleProjectStructureNode)path.getLastPathComponent()); + } + return result; + } + else { + return super.getData(dataId); + } + } + private static void applyInitialAppearance(@NotNull Tree tree, @NotNull DefaultMutableTreeNode node) { if (node.getUserObject() == GradleProjectStructureTreeModel.DEPENDENCIES_NODE_DESCRIPTOR) { tree.expandPath(new TreePath(node.getPath())); diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/sync/GradleProjectStructureHelper.java b/plugins/gradle/src/org/jetbrains/plugins/gradle/sync/GradleProjectStructureHelper.java index 96b2c8d8ece0..8fba1b558e74 100644 --- a/plugins/gradle/src/org/jetbrains/plugins/gradle/sync/GradleProjectStructureHelper.java +++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/sync/GradleProjectStructureHelper.java @@ -8,6 +8,7 @@ import com.intellij.openapi.roots.OrderEntry; import com.intellij.openapi.roots.RootPolicy; import com.intellij.openapi.util.Ref; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import org.jetbrains.plugins.gradle.diff.PlatformFacade; import org.jetbrains.plugins.gradle.model.*; @@ -37,20 +38,20 @@ public class GradleProjectStructureHelper extends AbstractProjectComponent { * false otherwise */ public boolean isIntellijLibraryDependencyExist(@NotNull final GradleLibraryDependencyId id) { - for (Module module : myFacade.getModules(myProject)) { - if (!id.getModuleName().equals(module.getName())) { - continue; + final Module module = findIntellijModuleByName(id.getModuleName()); + if (module == null) { + return false; + } + + RootPolicy visitor = new RootPolicy() { + @Override + public Boolean visitLibraryOrderEntry(LibraryOrderEntry libraryOrderEntry, Boolean value) { + return id.getLibraryName().equals(libraryOrderEntry.getLibraryName()); } - RootPolicy visitor = new RootPolicy() { - @Override - public Boolean visitLibraryOrderEntry(LibraryOrderEntry libraryOrderEntry, Boolean value) { - return id.getLibraryName().equals(libraryOrderEntry.getLibraryName()); - } - }; - for (OrderEntry entry : myFacade.getOrderEntries(module)) { - if (entry.accept(visitor, false)) { - return true; - } + }; + for (OrderEntry entry : myFacade.getOrderEntries(module)) { + if (entry.accept(visitor, false)) { + return true; } } return false; @@ -64,29 +65,55 @@ public class GradleProjectStructureHelper extends AbstractProjectComponent { * false otherwise */ public boolean isGradleLibraryDependencyExist(@NotNull final GradleLibraryDependencyId id) { + return findLibraryDependency(id) != null; + } + + @Nullable + public Module findIntellijModuleByName(@NotNull String name) { + for (Module module : myFacade.getModules(myProject)) { + if (name.equals(module.getName())) { + return module; + } + } + return null; + } + + @Nullable + public GradleModule findGradleModuleByName(@NotNull String name) { final GradleProject project = myModel.getGradleProject(); if (project == null) { - return false; + return null; } - final Ref matched = new Ref(); + for (GradleModule module : project.getModules()) { + if (name.equals(module.getName())) { + return module; + } + } + return null; + } + + @Nullable + public GradleLibraryDependency findLibraryDependency(@NotNull final GradleLibraryDependencyId id) { + final GradleModule module = findGradleModuleByName(id.getModuleName()); + if (module == null) { + return null; + } + final Ref ref = new Ref(); GradleEntityVisitor visitor = new GradleEntityVisitorAdapter() { @Override public void visit(@NotNull GradleLibraryDependency dependency) { - matched.set(id.getLibraryName().equals(dependency.getName())); - } - }; - for (GradleModule module : project.getModules()) { - if (!id.getModuleName().equals(module.getName())) { - continue; - } - for (GradleDependency dependency : module.getDependencies()) { - dependency.invite(visitor); - if (matched.get()) { - return true; + if (id.getLibraryName().equals(dependency.getName())) { + ref.set(dependency); } } - return false; + }; + for (GradleDependency dependency : module.getDependencies()) { + dependency.invite(visitor); + final GradleLibraryDependency result = ref.get(); + if (result != null) { + return result; + } } - return false; + return null; } } diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/sync/GradleProjectStructureTreeModel.java b/plugins/gradle/src/org/jetbrains/plugins/gradle/sync/GradleProjectStructureTreeModel.java index 9374826609b2..9a32b95e3338 100644 --- a/plugins/gradle/src/org/jetbrains/plugins/gradle/sync/GradleProjectStructureTreeModel.java +++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/sync/GradleProjectStructureTreeModel.java @@ -10,6 +10,7 @@ import com.intellij.util.containers.hash.HashMap; import org.jetbrains.annotations.NotNull; import org.jetbrains.plugins.gradle.config.GradleTextAttributes; import org.jetbrains.plugins.gradle.diff.*; +import org.jetbrains.plugins.gradle.model.GradleEntityType; import org.jetbrains.plugins.gradle.model.GradleLibraryDependencyId; import org.jetbrains.plugins.gradle.ui.GradleIcons; import org.jetbrains.plugins.gradle.ui.GradleProjectStructureNode; @@ -77,7 +78,8 @@ public class GradleProjectStructureTreeModel extends DefaultTreeModel { myModuleDependencies.clear(); myModules.clear(); - GradleProjectStructureNode root = buildNode(getProject(), getProject().getName(), myPlatformFacade.getProjectIcon()); + GradleProjectStructureNode root + = buildNode(getProject(), GradleEntityType.PROJECT, getProject().getName(), myPlatformFacade.getProjectIcon()); final Collection modules = myPlatformFacade.getModules(getProject()); RootPolicy policy = new RootPolicy() { @Override @@ -86,7 +88,7 @@ public class GradleProjectStructureTreeModel extends DefaultTreeModel { } }; for (Module module : modules) { - final GradleProjectStructureNode moduleNode = buildNode(module.getName(), GradleIcons.MODULE_ICON); + final GradleProjectStructureNode moduleNode = buildNode(GradleEntityType.MODULE, module.getName(), GradleIcons.MODULE_ICON); myModules.put(module.getName(), moduleNode); // Assuming that module names are unique. List libraryDependencies = new ArrayList(); for (OrderEntry orderEntry : myPlatformFacade.getOrderEntries(module)) { @@ -100,7 +102,7 @@ public class GradleProjectStructureTreeModel extends DefaultTreeModel { if (id == null) { continue; } - dependenciesNode.add(buildNode(id, id.getLibraryName(), GradleIcons.LIB_ICON)); + dependenciesNode.add(buildNode(id, GradleEntityType.LIBRARY_DEPENDENCY, id.getLibraryName(), GradleIcons.LIB_ICON)); } moduleNode.add(dependenciesNode); } @@ -119,14 +121,18 @@ public class GradleProjectStructureTreeModel extends DefaultTreeModel { return new GradleProjectStructureNodeDescriptor(entity, name, icon); } - private static GradleProjectStructureNode buildNode(@NotNull String name, @NotNull Icon icon) { - return buildNode(name, name, icon); + private static GradleProjectStructureNode buildNode(@NotNull GradleEntityType type, @NotNull String name, @NotNull Icon icon) { + return buildNode(name, type, name, icon); } - private static GradleProjectStructureNode buildNode(@NotNull T entity, @NotNull String name, @NotNull Icon icon) { - return new GradleProjectStructureNode(buildDescriptor(entity, name, icon)); + private static GradleProjectStructureNode buildNode(@NotNull T entity, + @NotNull GradleEntityType type, + @NotNull String name, + @NotNull Icon icon) + { + return new GradleProjectStructureNode(buildDescriptor(entity, name, icon), type); } - + private GradleProjectStructureNode getDependenciesNode(@NotNull String moduleName) { final GradleProjectStructureNode cached = myModuleDependencies.get(moduleName); if (cached != null) { @@ -134,11 +140,11 @@ public class GradleProjectStructureTreeModel extends DefaultTreeModel { } GradleProjectStructureNode moduleNode = myModules.get(moduleName); if (moduleNode == null) { - moduleNode = buildNode(moduleName, GradleIcons.MODULE_ICON); + moduleNode = buildNode(GradleEntityType.MODULE, moduleName, GradleIcons.MODULE_ICON); myModules.put(moduleName, moduleNode); } - GradleProjectStructureNode result = new GradleProjectStructureNode(DEPENDENCIES_NODE_DESCRIPTOR); + GradleProjectStructureNode result = new GradleProjectStructureNode(DEPENDENCIES_NODE_DESCRIPTOR, GradleEntityType.SYNTHETIC); moduleNode.add(result); myModuleDependencies.put(moduleName, result); @@ -184,7 +190,8 @@ public class GradleProjectStructureTreeModel extends DefaultTreeModel { return; } } - GradleProjectStructureNode newNode = buildNode(id, id.getLibraryName(), GradleIcons.LIB_ICON); + GradleProjectStructureNode newNode + = buildNode(id, GradleEntityType.LIBRARY_DEPENDENCY, id.getLibraryName(), GradleIcons.LIB_ICON); newNode.getDescriptor().setAttributes(attributes); dependenciesNode.add(newNode); nodeStructureChanged(dependenciesNode); diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/ui/GradleDataKeys.java b/plugins/gradle/src/org/jetbrains/plugins/gradle/ui/GradleDataKeys.java new file mode 100644 index 000000000000..134db91a6efc --- /dev/null +++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/ui/GradleDataKeys.java @@ -0,0 +1,18 @@ +package org.jetbrains.plugins.gradle.ui; + +import com.intellij.openapi.actionSystem.DataKey; + +import java.util.Collection; + +/** + * @author Denis Zhdanov + * @since 2/7/12 11:19 AM + */ +public class GradleDataKeys { + + /** Key for obtaining currently selected nodes at the gradle 'sync project structure' tree. */ + public static final DataKey>> SYNC_TREE_NODE = DataKey.create("gradle.sync.tree.node"); + + private GradleDataKeys() { + } +} diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/ui/GradleProjectStructureNode.java b/plugins/gradle/src/org/jetbrains/plugins/gradle/ui/GradleProjectStructureNode.java index 2551a3162a2e..e009d1a88b19 100644 --- a/plugins/gradle/src/org/jetbrains/plugins/gradle/ui/GradleProjectStructureNode.java +++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/ui/GradleProjectStructureNode.java @@ -3,6 +3,7 @@ package org.jetbrains.plugins.gradle.ui; import org.jetbrains.annotations.NotNull; import org.jetbrains.plugins.gradle.config.GradleTextAttributes; import org.jetbrains.plugins.gradle.diff.GradleProjectStructureChange; +import org.jetbrains.plugins.gradle.model.GradleEntityType; import javax.swing.tree.DefaultMutableTreeNode; import javax.swing.tree.MutableTreeNode; @@ -16,11 +17,14 @@ import java.util.*; public class GradleProjectStructureNode extends DefaultMutableTreeNode implements Iterable> { private final Set myConflictChanges = new HashSet(); - private final GradleProjectStructureNodeDescriptor myDescriptor; - public GradleProjectStructureNode(@NotNull GradleProjectStructureNodeDescriptor descriptor) { + private final GradleProjectStructureNodeDescriptor myDescriptor; + private final GradleEntityType myType; + + public GradleProjectStructureNode(@NotNull GradleProjectStructureNodeDescriptor descriptor, @NotNull GradleEntityType type) { super(descriptor); myDescriptor = descriptor; + myType = type; } @NotNull @@ -28,6 +32,11 @@ public class GradleProjectStructureNode extends DefaultMutableTreeNode implem return myDescriptor; } + @NotNull + public GradleEntityType getType() { + return myType; + } + @Override public GradleProjectStructureNode getChildAt(int index) { return (GradleProjectStructureNode)super.getChildAt(index); @@ -41,10 +50,10 @@ public class GradleProjectStructureNode extends DefaultMutableTreeNode implem @Override public void add(MutableTreeNode newChild) { GradleProjectStructureNode child = (GradleProjectStructureNode)newChild; - final String newText = child.getDescriptor().getText(); + final String newName = child.getDescriptor().getName(); for (int i = 0; i < getChildCount(); i++) { GradleProjectStructureNode node = getChildAt(i); - if (newText.compareTo(node.getDescriptor().getText()) < 0) { + if (newName.compareTo(node.getDescriptor().getName()) < 0) { insert(newChild, i); return; } diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/ui/GradleProjectStructureNodeDescriptor.java b/plugins/gradle/src/org/jetbrains/plugins/gradle/ui/GradleProjectStructureNodeDescriptor.java index 6fe8baa490f0..031e5077fa2e 100644 --- a/plugins/gradle/src/org/jetbrains/plugins/gradle/ui/GradleProjectStructureNodeDescriptor.java +++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/ui/GradleProjectStructureNodeDescriptor.java @@ -46,12 +46,7 @@ public class GradleProjectStructureNodeDescriptor extends PresentableNodeDesc return myData; } - @NotNull - public String getText() { - return myName; - } - - public void setText(@NotNull String name) { + public void setName(@NotNull String name) { myName = name; } diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/util/GradleConstants.java b/plugins/gradle/src/org/jetbrains/plugins/gradle/util/GradleConstants.java index 49f441744592..acc24a256475 100644 --- a/plugins/gradle/src/org/jetbrains/plugins/gradle/util/GradleConstants.java +++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/util/GradleConstants.java @@ -1,10 +1,7 @@ package org.jetbrains.plugins.gradle.util; -import com.intellij.openapi.util.IconLoader; import org.jetbrains.annotations.NonNls; -import javax.swing.*; - /** * Holds object representation of icons used at the Gradle plugin. * @@ -13,9 +10,13 @@ import javax.swing.*; */ public class GradleConstants { - @NonNls public static final String EXTENSION = "gradle"; - @NonNls public static final String DEFAULT_SCRIPT_NAME = "build.gradle"; + @NonNls public static final String EXTENSION = "gradle"; + @NonNls public static final String DEFAULT_SCRIPT_NAME = "build.gradle"; + @NonNls public static final String TOOL_WINDOW_TOOLBAR_PLACE = "GRADLE_SYNC_CHANGES_TOOLBAR"; + @NonNls public static final String SYNC_TREE_PLACE = "GRADLE_SYNC_TREE_PLACE"; + + @NonNls public static final String ACTION_GROUP_SYNC_TREE = "Gradle.SyncTreeGroup"; private GradleConstants() { } From 8899e68e0f9fab92667f4a8c9cb91dfee8287507 Mon Sep 17 00:00:00 2001 From: peter Date: Wed, 8 Feb 2012 09:45:25 +0100 Subject: [PATCH 129/215] IDEA-80691 Groovy: CCE at PostHighlightingPass.isEnumValuesMethodUsed() on enum definition --- .../codeInsight/daemon/impl/PostHighlightingPass.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/PostHighlightingPass.java b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/PostHighlightingPass.java index 815715a494fa..94249f82e089 100644 --- a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/PostHighlightingPass.java +++ b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/PostHighlightingPass.java @@ -640,9 +640,9 @@ public class PostHighlightingPass extends TextEditorHighlightingPass { } private static boolean isEnumValuesMethodUsed(PsiMember member, ProgressIndicator progress, GlobalUsageHelper helper) { - final PsiClassImpl containingClass = (PsiClassImpl)member.getContainingClass(); - if (containingClass == null) return true; - final PsiMethod valuesMethod = containingClass.getValuesMethod(); + final PsiClass containingClass = member.getContainingClass(); + if (containingClass == null || !(containingClass instanceof PsiClassImpl)) return true; + final PsiMethod valuesMethod = ((PsiClassImpl)containingClass).getValuesMethod(); if (valuesMethod == null) return true; return isMethodReferenced(valuesMethod, progress, helper); } From ea5a333663986652ff5113a7df2b6eb2e2ec5c7d Mon Sep 17 00:00:00 2001 From: Maxim Shafirov Date: Wed, 8 Feb 2012 14:17:29 +0400 Subject: [PATCH 130/215] Workaround for Scala compiler bug. IDEA-78649 --- .../intellij/psi/impl/compiled/StubBuildingVisitor.java | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/compiled/StubBuildingVisitor.java b/java/java-psi-impl/src/com/intellij/psi/impl/compiled/StubBuildingVisitor.java index 72de4e653c72..b071cc0053bc 100644 --- a/java/java-psi-impl/src/com/intellij/psi/impl/compiled/StubBuildingVisitor.java +++ b/java/java-psi-impl/src/com/intellij/psi/impl/compiled/StubBuildingVisitor.java @@ -350,8 +350,13 @@ public class StubBuildingVisitor implements ClassVisitor { final String desc, final String signature, final String[] exceptions) { - if ((access & Opcodes.ACC_SYNTHETIC) != 0) return null; - if ((access & Opcodes.ACC_BRIDGE) != 0) return null; + boolean isSynthetic = (access & Opcodes.ACC_SYNTHETIC) != 0; + + // JLS 13.1 says: Any constructs introduced by the compiler that do not have a corresponding construct in the source code + // must be marked as synthetic, except for default constructors and the class initialization method. + // However Scala compiler erroneously generates ACC_BRIDGE instead of ACC_SYNTHETIC flag for in-trait implementation delegation. See IDEA-78649 + if (isSynthetic) return null; + if (SYNTHETIC_CLINIT_METHOD.equals(name)) return null; boolean isDeprecated = (access & Opcodes.ACC_DEPRECATED) != 0; From ea33e711245a7ef60db7a2685c71ca0a5ca35e13 Mon Sep 17 00:00:00 2001 From: "Rustam.Vishnyakov" Date: Tue, 7 Feb 2012 18:03:51 +0400 Subject: [PATCH 131/215] Do not replace spaces with tabs for alignments inside line (IDEA-79095 and related) --- .../com/intellij/formatting/IndentInfo.java | 29 +++++-------------- 1 file changed, 7 insertions(+), 22 deletions(-) diff --git a/platform/lang-impl/src/com/intellij/formatting/IndentInfo.java b/platform/lang-impl/src/com/intellij/formatting/IndentInfo.java index 16788a89382e..9f7990b9bf12 100644 --- a/platform/lang-impl/src/com/intellij/formatting/IndentInfo.java +++ b/platform/lang-impl/src/com/intellij/formatting/IndentInfo.java @@ -56,29 +56,14 @@ public class IndentInfo { StringBuffer buffer = new StringBuffer(); StringUtil.repeatSymbol(buffer, '\n', myLineFeeds); - if (options.USE_TAB_CHARACTER && !myForceSkipTabulationsUsage) { - if (options.SMART_TABS) { - int tabCount = myIndentSpaces / options.TAB_SIZE; - int leftSpaces = myIndentSpaces - tabCount * options.TAB_SIZE; - if (tabCount > 0) { - StringUtil.repeatSymbol(buffer, '\t', tabCount); - } - if (leftSpaces + mySpaces > 0) { - StringUtil.repeatSymbol(buffer, ' ', leftSpaces + mySpaces); - } + if (options.USE_TAB_CHARACTER) { + int tabCount = myIndentSpaces / options.TAB_SIZE; + int leftSpaces = myIndentSpaces - tabCount * options.TAB_SIZE; + if (tabCount > 0) { + StringUtil.repeatSymbol(buffer, '\t', tabCount); } - else { - int size = getTotalSpaces(); - while (size > 0) { - if (size >= options.TAB_SIZE) { - buffer.append('\t'); - size -= options.TAB_SIZE; - } - else { - buffer.append(' '); - size--; - } - } + if (leftSpaces + mySpaces > 0) { + StringUtil.repeatSymbol(buffer, ' ', leftSpaces + mySpaces); } } else { From 72a3636ab5e41761b4abe0d2c9aae7c3122d0bb7 Mon Sep 17 00:00:00 2001 From: "Rustam.Vishnyakov" Date: Wed, 8 Feb 2012 14:46:09 +0400 Subject: [PATCH 132/215] Correctly fixed IDEA-79095 Code Style (php): alignment options not working in every case --- .../com/intellij/formatting/IndentInfo.java | 53 ++++++++++++++----- 1 file changed, 40 insertions(+), 13 deletions(-) diff --git a/platform/lang-impl/src/com/intellij/formatting/IndentInfo.java b/platform/lang-impl/src/com/intellij/formatting/IndentInfo.java index 9f7990b9bf12..6d7c0e80627b 100644 --- a/platform/lang-impl/src/com/intellij/formatting/IndentInfo.java +++ b/platform/lang-impl/src/com/intellij/formatting/IndentInfo.java @@ -24,6 +24,11 @@ public class IndentInfo { private final int mySpaces; private final int myIndentSpaces; private final int myLineFeeds; + // + // The flag is used for compatibility with older versions of Intellij IDEA where spaces could be replaced with tabs inside a line of code, + // not only in the beginning of the line. + // + private static boolean myInlineTabsEnabled = "true".equalsIgnoreCase(System.getProperty("enable.inline.tabs")); /** @see WhiteSpace#setForceSkipTabulationsUsage(boolean) */ private boolean myForceSkipTabulationsUsage; @@ -56,27 +61,49 @@ public class IndentInfo { StringBuffer buffer = new StringBuffer(); StringUtil.repeatSymbol(buffer, '\n', myLineFeeds); - if (options.USE_TAB_CHARACTER) { - int tabCount = myIndentSpaces / options.TAB_SIZE; - int leftSpaces = myIndentSpaces - tabCount * options.TAB_SIZE; - if (tabCount > 0) { - StringUtil.repeatSymbol(buffer, '\t', tabCount); + if (options.USE_TAB_CHARACTER && !myForceSkipTabulationsUsage) { + if (options.SMART_TABS) { + return fillUsingSmartTabs(buffer, options); } - if (leftSpaces + mySpaces > 0) { - StringUtil.repeatSymbol(buffer, ' ', leftSpaces + mySpaces); + else if (myLineFeeds > 0 || myInlineTabsEnabled) { + return fillUsingTabs(buffer, options); } } - else { - int spaces = getTotalSpaces(); - if (spaces > 0) { - StringUtil.repeatSymbol(buffer, ' ', spaces); - } + int spaces = getTotalSpaces(); + if (spaces > 0) { + StringUtil.repeatSymbol(buffer, ' ', spaces); } - return buffer.toString(); } + private String fillUsingTabs(StringBuffer buffer, CommonCodeStyleSettings.IndentOptions options) { + int size = getTotalSpaces(); + while (size > 0) { + if (size >= options.TAB_SIZE) { + buffer.append('\t'); + size -= options.TAB_SIZE; + } + else { + buffer.append(' '); + size--; + } + } + return buffer.toString(); + } + + private String fillUsingSmartTabs(StringBuffer buffer, CommonCodeStyleSettings.IndentOptions options) { + int tabCount = myIndentSpaces / options.TAB_SIZE; + int leftSpaces = myIndentSpaces - tabCount * options.TAB_SIZE; + if (tabCount > 0) { + StringUtil.repeatSymbol(buffer, '\t', tabCount); + } + if (leftSpaces + mySpaces > 0) { + StringUtil.repeatSymbol(buffer, ' ', leftSpaces + mySpaces); + } + return buffer.toString(); + } + public int getTotalSpaces() { return myIndentSpaces + mySpaces; } From d8381e18862fa29e960e9487fa1ba23d5d379105 Mon Sep 17 00:00:00 2001 From: anna Date: Wed, 8 Feb 2012 10:12:46 +0100 Subject: [PATCH 133/215] IDEA-80646 Scope views: when changing 'Show members' and 'Flatten packages' view options, the project view collapses --- .../ide/projectView/impl/AbstractProjectViewPane.java | 2 +- .../src/com/intellij/ide/scopeView/ScopeViewPane.java | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/platform/lang-impl/src/com/intellij/ide/projectView/impl/AbstractProjectViewPane.java b/platform/lang-impl/src/com/intellij/ide/projectView/impl/AbstractProjectViewPane.java index daa29aefff5c..d04635ae967b 100644 --- a/platform/lang-impl/src/com/intellij/ide/projectView/impl/AbstractProjectViewPane.java +++ b/platform/lang-impl/src/com/intellij/ide/projectView/impl/AbstractProjectViewPane.java @@ -450,7 +450,7 @@ public abstract class AbstractProjectViewPane implements DataProvider, Disposabl } } - void saveExpandedPaths() { + protected void saveExpandedPaths() { if (myTree != null) { TreeState treeState = TreeState.createOn(myTree); myReadTreeState.put(getSubId(), treeState); diff --git a/platform/lang-impl/src/com/intellij/ide/scopeView/ScopeViewPane.java b/platform/lang-impl/src/com/intellij/ide/scopeView/ScopeViewPane.java index f4af769a5f14..0ac0f595d497 100644 --- a/platform/lang-impl/src/com/intellij/ide/scopeView/ScopeViewPane.java +++ b/platform/lang-impl/src/com/intellij/ide/scopeView/ScopeViewPane.java @@ -108,8 +108,7 @@ public class ScopeViewPane extends AbstractProjectViewPane { myViewPanel = new ScopeTreeViewPanel(myProject); Disposer.register(this, myViewPanel); myViewPanel.initListeners(); - updateFromRoot(true); - + myViewPanel.selectScope(NamedScopesHolder.getScope(myProject, getSubId())); myTree = myViewPanel.getTree(); PopupHandler.installPopupHandler(myTree, IdeActions.GROUP_SCOPE_VIEW_POPUP, ActionPlaces.SCOPE_VIEW_POPUP); enableDnD(); @@ -152,7 +151,9 @@ public class ScopeViewPane extends AbstractProjectViewPane { } public ActionCallback updateFromRoot(boolean restoreExpandedPaths) { + saveExpandedPaths(); myViewPanel.selectScope(NamedScopesHolder.getScope(myProject, getSubId())); + restoreExpandedPaths(); return new ActionCallback.Done(); } From 3af7f1e2aab71b0aed6d395d2e4e69be3d3edcff Mon Sep 17 00:00:00 2001 From: anna Date: Wed, 8 Feb 2012 10:33:09 +0100 Subject: [PATCH 134/215] IDEA-56833 Renaming modules does not update Eclipse .project files --- .../idea/eclipse/config/EclipseClasspathStorageProvider.java | 1 + 1 file changed, 1 insertion(+) diff --git a/plugins/eclipse/src/org/jetbrains/idea/eclipse/config/EclipseClasspathStorageProvider.java b/plugins/eclipse/src/org/jetbrains/idea/eclipse/config/EclipseClasspathStorageProvider.java index 28471448c01d..86867b40a344 100644 --- a/plugins/eclipse/src/org/jetbrains/idea/eclipse/config/EclipseClasspathStorageProvider.java +++ b/plugins/eclipse/src/org/jetbrains/idea/eclipse/config/EclipseClasspathStorageProvider.java @@ -148,6 +148,7 @@ public class EclipseClasspathStorageProvider implements ClasspathStorageProvider LocalFileSystem.getInstance().refreshAndFindFileByIoFile(target); } final CachedXmlDocumentSet fileCache = getFileCache(module); + DotProjectFileHelper.saveDotProjectFile(module, fileCache.getParent(EclipseXml.PROJECT_FILE)); fileCache.delete(oldEmlName); fileCache.register(newName + EclipseXml.IDEA_SETTINGS_POSTFIX, ClasspathStorage.getModuleDir(module)); fileCache.load(newName + EclipseXml.IDEA_SETTINGS_POSTFIX); From bdbbe848bc2a54f2fcd2369dc58714e49b25f9e4 Mon Sep 17 00:00:00 2001 From: anna Date: Wed, 8 Feb 2012 11:11:24 +0100 Subject: [PATCH 135/215] IDEA-80383 Add support for Eclipse GROOVY_DSL_SUPPORT --- .../src/org/jetbrains/idea/eclipse/EclipseXml.java | 1 + .../idea/eclipse/config/EclipseModuleManager.java | 9 +++++++++ .../idea/eclipse/conversion/EclipseClasspathReader.java | 7 ++++++- .../idea/eclipse/conversion/EclipseClasspathWriter.java | 7 ++++++- 4 files changed, 22 insertions(+), 2 deletions(-) diff --git a/plugins/eclipse/src/org/jetbrains/idea/eclipse/EclipseXml.java b/plugins/eclipse/src/org/jetbrains/idea/eclipse/EclipseXml.java index 3d38360c09c7..8503577ab94f 100644 --- a/plugins/eclipse/src/org/jetbrains/idea/eclipse/EclipseXml.java +++ b/plugins/eclipse/src/org/jetbrains/idea/eclipse/EclipseXml.java @@ -41,6 +41,7 @@ public interface EclipseXml { @NonNls String JRE_CONTAINER_SPECIFIC = JRE_CONTAINER + "/" + "org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType"; @NonNls String USER_LIBRARY = "org.eclipse.jdt.USER_LIBRARY"; @NonNls String JUNIT_CONTAINER = "org.eclipse.jdt.junit.JUNIT_CONTAINER"; + @NonNls String GROOVY_DSL_CONTAINER = "GROOVY_DSL_SUPPORT"; @NonNls String JUNIT3 = JUNIT_CONTAINER + "/" + "3.8.1"; @NonNls String JUNIT4 = JUNIT_CONTAINER + "/" + "4"; @NonNls String ECLIPSE_PLATFORM = "org.eclipse.pde.core.requiredPlugins"; diff --git a/plugins/eclipse/src/org/jetbrains/idea/eclipse/config/EclipseModuleManager.java b/plugins/eclipse/src/org/jetbrains/idea/eclipse/config/EclipseModuleManager.java index 6488c4a6b196..da5f40a100e3 100644 --- a/plugins/eclipse/src/org/jetbrains/idea/eclipse/config/EclipseModuleManager.java +++ b/plugins/eclipse/src/org/jetbrains/idea/eclipse/config/EclipseModuleManager.java @@ -62,6 +62,7 @@ public class EclipseModuleManager implements PersistentStateComponent{ private int myExpectedModuleSourcePlace; private Map mySrcPlace = new LinkedHashMap(); private String myInvalidJdk; + private boolean myGroovyDslSupport = false; public EclipseModuleManager(Module module) { myModule = module; @@ -75,6 +76,14 @@ public class EclipseModuleManager implements PersistentStateComponent{ return myInvalidJdk; } + public void setGroovyDslSupport() { + myGroovyDslSupport = true; + } + + public boolean isGroovyDslSupport() { + return myGroovyDslSupport; + } + public static EclipseModuleManager getInstance(Module module) { return ModuleServiceManager.getService(module, EclipseModuleManager.class); } diff --git a/plugins/eclipse/src/org/jetbrains/idea/eclipse/conversion/EclipseClasspathReader.java b/plugins/eclipse/src/org/jetbrains/idea/eclipse/conversion/EclipseClasspathReader.java index db948129570d..e00ca1c1e376 100644 --- a/plugins/eclipse/src/org/jetbrains/idea/eclipse/conversion/EclipseClasspathReader.java +++ b/plugins/eclipse/src/org/jetbrains/idea/eclipse/conversion/EclipseClasspathReader.java @@ -272,7 +272,12 @@ public class EclipseClasspathReader { final Library.ModifiableModel modifiableModel = library.getModifiableModel(); modifiableModel.addRoot(getJunitClsUrl(junitName.contains("4")), OrderRootType.CLASSES); modifiableModel.commit(); - } else { + } + else if (path.equals(EclipseXml.GROOVY_DSL_CONTAINER)) { + eclipseModuleManager.setGroovyDslSupport(); + eclipseModuleManager.registerSrcPlace(EclipseXml.GROOVY_DSL_CONTAINER, idx); + } + else { eclipseModuleManager.registerUnknownCons(path); addNamedLibrary(rootModel, new ArrayList(), exported, path, LibraryTablesRegistrar.APPLICATION_LEVEL); } diff --git a/plugins/eclipse/src/org/jetbrains/idea/eclipse/conversion/EclipseClasspathWriter.java b/plugins/eclipse/src/org/jetbrains/idea/eclipse/conversion/EclipseClasspathWriter.java index 959992f9a95a..cb6c69f8f5c5 100644 --- a/plugins/eclipse/src/org/jetbrains/idea/eclipse/conversion/EclipseClasspathWriter.java +++ b/plugins/eclipse/src/org/jetbrains/idea/eclipse/conversion/EclipseClasspathWriter.java @@ -64,7 +64,8 @@ public class EclipseClasspathWriter { @NonNls String outputPath = "bin"; final String compilerOutputUrl = myModel.getModuleExtension(CompilerModuleExtension.class).getCompilerOutputUrl(); - final String linkedPath = EclipseModuleManager.getInstance(myModel.getModule()).getEclipseLinkedVarPath(compilerOutputUrl); + final EclipseModuleManager eclipseModuleManager = EclipseModuleManager.getInstance(myModel.getModule()); + final String linkedPath = eclipseModuleManager.getEclipseLinkedVarPath(compilerOutputUrl); if (linkedPath != null) { outputPath = linkedPath; } else { @@ -77,6 +78,10 @@ public class EclipseClasspathWriter { outputPath = EPathUtil.collapse2EclipsePath(compilerOutputUrl, myModel); } } + if (eclipseModuleManager.isGroovyDslSupport()) { + final Integer place = eclipseModuleManager.getSrcPlace(EclipseXml.GROOVY_DSL_CONTAINER); + addOrderEntry(EclipseXml.CON_KIND, EclipseXml.GROOVY_DSL_CONTAINER, classpathElement, place != null ? place.intValue() : -1); + } final Element orderEntry = addOrderEntry(EclipseXml.OUTPUT_KIND, outputPath, classpathElement); setAttributeIfAbsent(orderEntry, EclipseXml.PATH_ATTR, EclipseXml.BIN_DIR); } From 866c4c27a75864bcce683d8a1b7deaf59c9738ab Mon Sep 17 00:00:00 2001 From: anna Date: Wed, 8 Feb 2012 11:19:01 +0100 Subject: [PATCH 136/215] plugins: disable dbl click on plugin with disabled update action --- .../plugins/AvailablePluginsManagerMain.java | 21 ++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/platform/platform-impl/src/com/intellij/ide/plugins/AvailablePluginsManagerMain.java b/platform/platform-impl/src/com/intellij/ide/plugins/AvailablePluginsManagerMain.java index 04da5ea0bba2..39eaad692359 100644 --- a/platform/platform-impl/src/com/intellij/ide/plugins/AvailablePluginsManagerMain.java +++ b/platform/platform-impl/src/com/intellij/ide/plugins/AvailablePluginsManagerMain.java @@ -21,6 +21,7 @@ import com.intellij.openapi.actionSystem.AnAction; import com.intellij.openapi.actionSystem.AnActionEvent; import com.intellij.openapi.actionSystem.DefaultActionGroup; import com.intellij.openapi.actionSystem.ex.ComboBoxAction; +import com.intellij.openapi.extensions.PluginId; import com.intellij.openapi.options.ShowSettingsUtil; import com.intellij.openapi.project.DumbAware; import com.intellij.openapi.updateSettings.impl.UpdateSettings; @@ -101,7 +102,25 @@ public class AvailablePluginsManagerMain extends PluginManagerMain { if (e.getClickCount() != 2) return; if (pluginTable.columnAtPoint(e.getPoint()) < 0) return; if (pluginTable.rowAtPoint(e.getPoint()) < 0) return; - new ActionInstallPlugin(AvailablePluginsManagerMain.this, installed).install(); + IdeaPluginDescriptor[] selection = pluginTable.getSelectedObjects(); + if (selection != null) { + boolean enabled = true; + for (IdeaPluginDescriptor descr : selection) { + if (descr instanceof PluginNode) { + enabled &= !PluginManagerColumnInfo.isDownloaded((PluginNode)descr); + if (((PluginNode)descr).getStatus() == PluginNode.STATUS_INSTALLED) { + enabled &= InstalledPluginsTableModel.hasNewerVersion(descr.getPluginId()); + } + } + else if (descr instanceof IdeaPluginDescriptorImpl) { + PluginId id = descr.getPluginId(); + enabled &= InstalledPluginsTableModel.hasNewerVersion(id); + } + } + if (enabled) { + new ActionInstallPlugin(AvailablePluginsManagerMain.this, installed).install(); + } + } } }); } From 8faaf8e44225e70682b84fbafea016b912873d85 Mon Sep 17 00:00:00 2001 From: Dmitry Jemerov Date: Wed, 8 Feb 2012 12:07:13 +0100 Subject: [PATCH 137/215] installer build fix --- build/scripts/libLicenses.gant | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/build/scripts/libLicenses.gant b/build/scripts/libLicenses.gant index e0fe9f0cfa10..884423ea33bc 100644 --- a/build/scripts/libLicenses.gant +++ b/build/scripts/libLicenses.gant @@ -238,4 +238,5 @@ libraryLicense(name: "Kryo", libraryName: "Kryo", version: "1.04", license: "New jetbrainsLibrary("JPS") jetbrainsLibrary("Maven Embedder") jetbrainsLibrary("tcServiceMessages") -jetbrainsLibrary("optimizedFileManager.jar") \ No newline at end of file +jetbrainsLibrary("optimizedFileManager.jar") +jetbrainsLibrary("RunTime") From 35b9ee258e7a1be93a35b30c7f8ed07b9090a74c Mon Sep 17 00:00:00 2001 From: "Maxim.Mossienko" Date: Wed, 8 Feb 2012 15:19:55 +0400 Subject: [PATCH 138/215] cache id -> string mappings in valueOf --- .../com/intellij/util/io/PersistentStringEnumerator.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/platform/util/src/com/intellij/util/io/PersistentStringEnumerator.java b/platform/util/src/com/intellij/util/io/PersistentStringEnumerator.java index 3f98c07fcd1f..4a88a2a5490b 100644 --- a/platform/util/src/com/intellij/util/io/PersistentStringEnumerator.java +++ b/platform/util/src/com/intellij/util/io/PersistentStringEnumerator.java @@ -77,7 +77,11 @@ public class PersistentStringEnumerator extends PersistentEnumeratorDelegate Date: Wed, 8 Feb 2012 12:22:30 +0100 Subject: [PATCH 139/215] junit: comparison diff: ignore spaces (IDEA-80718) --- .../src/com/intellij/junit4/JUnit4TestResultsSender.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/junit_rt/src/com/intellij/junit4/JUnit4TestResultsSender.java b/plugins/junit_rt/src/com/intellij/junit4/JUnit4TestResultsSender.java index c427e578a122..bfb590a18a02 100644 --- a/plugins/junit_rt/src/com/intellij/junit4/JUnit4TestResultsSender.java +++ b/plugins/junit_rt/src/com/intellij/junit4/JUnit4TestResultsSender.java @@ -99,10 +99,10 @@ public class JUnit4TestResultsSender extends RunListener { Matcher matcher = Pattern.compile("\nExpected: (.*)\n\\s*got: (.*)", Pattern.DOTALL).matcher(message); if (!matcher.matches()) { - matcher = Pattern.compile("expected same:<(.*)> was not:<(.*)>", Pattern.DOTALL).matcher(message); + matcher = Pattern.compile("\\s*expected same:<(.*)> was not:<(.*)>", Pattern.DOTALL).matcher(message); } if (!matcher.matches()) { - matcher = Pattern.compile("expected:<(.*)> but was:<(.*)>", Pattern.DOTALL).matcher(message); + matcher = Pattern.compile("\\s*expected:<(.*)> but was:<(.*)>", Pattern.DOTALL).matcher(message); } if (!matcher.matches()) { matcher = Pattern.compile("\nExpected: \"(.*)\"\n\\s*but: was \"(.*)\"", Pattern.DOTALL).matcher(message); From de263ed1c3666fb2252214671bfa5eaa020bbb79 Mon Sep 17 00:00:00 2001 From: Dennis Ushakov Date: Fri, 3 Feb 2012 15:10:48 +0400 Subject: [PATCH 140/215] added borders --- .../src/com/intellij/debugger/ui/FramesPanel.java | 4 ++++ .../com/intellij/debugger/ui/impl/MainWatchPanel.java | 11 +++++++---- .../intellij/xdebugger/impl/frame/XFramesView.java | 4 ++++ .../intellij/xdebugger/impl/frame/XWatchesView.java | 7 +++++++ 4 files changed, 22 insertions(+), 4 deletions(-) diff --git a/java/debugger/impl/src/com/intellij/debugger/ui/FramesPanel.java b/java/debugger/impl/src/com/intellij/debugger/ui/FramesPanel.java index bcde86b2c743..79a45ec2c7b1 100644 --- a/java/debugger/impl/src/com/intellij/debugger/ui/FramesPanel.java +++ b/java/debugger/impl/src/com/intellij/debugger/ui/FramesPanel.java @@ -51,8 +51,10 @@ import com.intellij.openapi.project.Project; import com.intellij.openapi.ui.ComboBoxWithWidePopup; import com.intellij.openapi.util.Disposer; import com.intellij.openapi.util.IconLoader; +import com.intellij.ui.CaptionPanel; import com.intellij.ui.PopupHandler; import com.intellij.ui.ScrollPaneFactory; +import com.intellij.ui.border.CustomLineBorder; import com.intellij.ui.components.panels.Wrapper; import com.intellij.util.Alarm; import com.sun.jdi.ObjectCollectedException; @@ -114,6 +116,8 @@ public class FramesPanel extends UpdatableDebuggerView { final ActionToolbar toolbar = createToolbar(); Wrapper threads = new Wrapper(); + CustomLineBorder border = new CustomLineBorder(CaptionPanel.CNT_ACTIVE_COLOR, 0, 0, 1, 0); + threads.setBorder(border); threads.add(toolbar.getComponent(), BorderLayout.EAST); threads.add(myThreadsCombo, BorderLayout.CENTER); add(threads, BorderLayout.NORTH); diff --git a/java/debugger/impl/src/com/intellij/debugger/ui/impl/MainWatchPanel.java b/java/debugger/impl/src/com/intellij/debugger/ui/impl/MainWatchPanel.java index 314e360d2442..3230eb223e5c 100644 --- a/java/debugger/impl/src/com/intellij/debugger/ui/impl/MainWatchPanel.java +++ b/java/debugger/impl/src/com/intellij/debugger/ui/impl/MainWatchPanel.java @@ -43,10 +43,9 @@ import com.intellij.openapi.Disposable; import com.intellij.openapi.actionSystem.*; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.project.Project; -import com.intellij.ui.AnActionButton; -import com.intellij.ui.AnActionButtonRunnable; -import com.intellij.ui.ListenerUtil; -import com.intellij.ui.ToolbarDecorator; +import com.intellij.openapi.util.SystemInfo; +import com.intellij.ui.*; +import com.intellij.ui.border.CustomLineBorder; import javax.swing.*; import java.awt.*; @@ -225,6 +224,10 @@ public class MainWatchPanel extends WatchPanel implements DataProvider { executeAction(DebuggerActions.REMOVE_WATCH, tree); } }); + CustomLineBorder border = new CustomLineBorder(CaptionPanel.CNT_ACTIVE_COLOR, + SystemInfo.isMac ? 1 : 0, 0, + SystemInfo.isMac ? 0 : 1, 0); + decorator.setToolbarBorder(border); final JPanel panel = decorator.createPanel(); panel.setBorder(null); return panel; diff --git a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/frame/XFramesView.java b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/frame/XFramesView.java index d9f83fc1b4f5..8627536e625e 100644 --- a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/frame/XFramesView.java +++ b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/frame/XFramesView.java @@ -24,7 +24,9 @@ import com.intellij.openapi.actionSystem.ActionToolbar; import com.intellij.openapi.actionSystem.DefaultActionGroup; import com.intellij.openapi.actionSystem.impl.ActionToolbarImpl; import com.intellij.openapi.application.ApplicationManager; +import com.intellij.ui.CaptionPanel; import com.intellij.ui.ScrollPaneFactory; +import com.intellij.ui.border.CustomLineBorder; import com.intellij.ui.components.panels.Wrapper; import com.intellij.util.containers.HashMap; import com.intellij.xdebugger.XDebugSession; @@ -85,6 +87,8 @@ public class XFramesView extends XDebugViewBase { myThreadComboBox.addItemListener(new MyItemListener()); final ActionToolbar toolbar = createToolbar(); Wrapper threadsPanel = new Wrapper(); + CustomLineBorder border = new CustomLineBorder(CaptionPanel.CNT_ACTIVE_COLOR, 0, 0, 1, 0); + threadsPanel.setBorder(border); threadsPanel.add(toolbar.getComponent(), BorderLayout.EAST); threadsPanel.add(myThreadComboBox, BorderLayout.CENTER); myMainPanel.add(threadsPanel, BorderLayout.NORTH); diff --git a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/frame/XWatchesView.java b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/frame/XWatchesView.java index ea2d9f01d5bc..0818229d871c 100644 --- a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/frame/XWatchesView.java +++ b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/frame/XWatchesView.java @@ -21,9 +21,12 @@ import com.intellij.ide.dnd.DnDManager; import com.intellij.ide.dnd.DnDNativeTarget; import com.intellij.openapi.Disposable; import com.intellij.openapi.actionSystem.*; +import com.intellij.openapi.util.SystemInfo; import com.intellij.ui.AnActionButton; import com.intellij.ui.AnActionButtonRunnable; +import com.intellij.ui.CaptionPanel; import com.intellij.ui.ToolbarDecorator; +import com.intellij.ui.border.CustomLineBorder; import com.intellij.util.ArrayUtil; import com.intellij.util.ui.tree.TreeUtil; import com.intellij.xdebugger.XDebugSession; @@ -92,6 +95,10 @@ public class XWatchesView extends XDebugViewBase implements DnDNativeTarget { executeAction(XDebuggerActions.XREMOVE_WATCH); } }); + CustomLineBorder border = new CustomLineBorder(CaptionPanel.CNT_ACTIVE_COLOR, + SystemInfo.isMac ? 1 : 0, 0, + SystemInfo.isMac ? 0 : 1, 0); + decorator.setToolbarBorder(border); myDecoratedPanel = decorator.createPanel(); myDecoratedPanel.setBorder(null); From 947b7e961a7ec124fb366762d050d6abbbfa95aa Mon Sep 17 00:00:00 2001 From: Dennis Ushakov Date: Tue, 7 Feb 2012 12:11:46 +0400 Subject: [PATCH 141/215] add to watch for windows --- .../src/com/intellij/debugger/ui/impl/MainWatchPanel.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/java/debugger/impl/src/com/intellij/debugger/ui/impl/MainWatchPanel.java b/java/debugger/impl/src/com/intellij/debugger/ui/impl/MainWatchPanel.java index 3230eb223e5c..1674be4a3b11 100644 --- a/java/debugger/impl/src/com/intellij/debugger/ui/impl/MainWatchPanel.java +++ b/java/debugger/impl/src/com/intellij/debugger/ui/impl/MainWatchPanel.java @@ -46,6 +46,7 @@ import com.intellij.openapi.project.Project; import com.intellij.openapi.util.SystemInfo; import com.intellij.ui.*; import com.intellij.ui.border.CustomLineBorder; +import com.intellij.xdebugger.impl.actions.XDebuggerActions; import javax.swing.*; import java.awt.*; @@ -217,7 +218,10 @@ public class MainWatchPanel extends WatchPanel implements DataProvider { executeAction(DebuggerActions.NEW_WATCH, tree); } }); - // TODO[den]: add "Add to watches action" + // TODO[den]: add "Add to watches action" on Mac + if (!SystemInfo.isMac) { + decorator.addExtraAction(AnActionButton.fromAction(ActionManager.getInstance().getAction(XDebuggerActions.ADD_TO_WATCH))); + } decorator.setRemoveAction(new AnActionButtonRunnable() { @Override public void run(AnActionButton button) { From a3ddacd6db10b5c739e077803fb4dfa0cce044b3 Mon Sep 17 00:00:00 2001 From: Dennis Ushakov Date: Tue, 7 Feb 2012 12:43:59 +0400 Subject: [PATCH 142/215] IDEA-80808 Debug Tool Window: on hiding/restoring a view under Debugger tab focus jumps to the first tab in row --- .../intellij/execution/ui/layout/impl/RunnerContentUi.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/platform/lang-impl/src/com/intellij/execution/ui/layout/impl/RunnerContentUi.java b/platform/lang-impl/src/com/intellij/execution/ui/layout/impl/RunnerContentUi.java index 23ce51a8eddf..b2ed900aa16f 100644 --- a/platform/lang-impl/src/com/intellij/execution/ui/layout/impl/RunnerContentUi.java +++ b/platform/lang-impl/src/com/intellij/execution/ui/layout/impl/RunnerContentUi.java @@ -855,13 +855,14 @@ public class RunnerContentUi implements ContentUI, Disposable, CellTransform.Fac } } - tab.setHidden(true); + boolean hidden = true; for (Content content : contents) { if (!grid.isMinimized(content)) { - tab.setHidden(false); + hidden = false; break; } } + tab.setHidden(hidden); if (icon == null && contents.size() == 1) { icon = contents.get(0).getIcon(); } From 80b7103888b9bfbf7aa722752c13afd18d80a8bf Mon Sep 17 00:00:00 2001 From: Dennis Ushakov Date: Tue, 7 Feb 2012 12:49:34 +0400 Subject: [PATCH 143/215] IDEA-80821 Debug tool window: splitting Debugger tab into two tabs with two views in each results in two Debugger tabs wich is confusing --- .../execution/ui/layout/impl/RunnerContentUi.java | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/platform/lang-impl/src/com/intellij/execution/ui/layout/impl/RunnerContentUi.java b/platform/lang-impl/src/com/intellij/execution/ui/layout/impl/RunnerContentUi.java index b2ed900aa16f..59c1dfd29bc9 100644 --- a/platform/lang-impl/src/com/intellij/execution/ui/layout/impl/RunnerContentUi.java +++ b/platform/lang-impl/src/com/intellij/execution/ui/layout/impl/RunnerContentUi.java @@ -811,9 +811,10 @@ public class RunnerContentUi implements ContentUI, Disposable, CellTransform.Fac private void updateTabsUI(final boolean validateNow) { boolean hasToolbarContent = rebuildToolbar(); + Set usedNames = new HashSet(); List tabs = myTabs.getTabs(); for (TabInfo each : tabs) { - hasToolbarContent |= updateTabUI(each); + hasToolbarContent |= updateTabUI(each, usedNames); } int tabsCount = tabs.size(); for (RunnerContentUi child : myChildren) { @@ -827,7 +828,7 @@ public class RunnerContentUi implements ContentUI, Disposable, CellTransform.Fac } } - private boolean updateTabUI(TabInfo tab) { + private boolean updateTabUI(TabInfo tab, Set usedNames) { TabImpl t = getTabFor(tab); if (t == null) { return false; @@ -842,7 +843,7 @@ public class RunnerContentUi implements ContentUI, Disposable, CellTransform.Fac String title = contents.size() > 1 ? t.getDisplayName() : null; if (title == null) { final String name = myLayoutSettings.getDefaultDisplayName(t.getDefaultIndex()); - if (name != null && contents.size() > 1) { + if (name != null && contents.size() > 1 && !usedNames.contains(name)) { title = name; } else { title = StringUtil.join(contents, new NotNullFunction() { @@ -854,6 +855,7 @@ public class RunnerContentUi implements ContentUI, Disposable, CellTransform.Fac }, " | "); } } + usedNames.add(title); boolean hidden = true; for (Content content : contents) { From 52da0b3592ddc8a12148d72e7c31d25c670e6dba Mon Sep 17 00:00:00 2001 From: Dennis Ushakov Date: Wed, 8 Feb 2012 13:44:23 +0400 Subject: [PATCH 144/215] move 'set from' to banner --- .../options/TabbedLanguageCodeStylePanel.java | 40 +++++-------------- .../options/codeStyle/CodeStyleMainPanel.java | 20 +++++++++- 2 files changed, 30 insertions(+), 30 deletions(-) diff --git a/platform/lang-impl/src/com/intellij/application/options/TabbedLanguageCodeStylePanel.java b/platform/lang-impl/src/com/intellij/application/options/TabbedLanguageCodeStylePanel.java index d0732dd73fab..f90931fa3b75 100644 --- a/platform/lang-impl/src/com/intellij/application/options/TabbedLanguageCodeStylePanel.java +++ b/platform/lang-impl/src/com/intellij/application/options/TabbedLanguageCodeStylePanel.java @@ -28,7 +28,6 @@ import com.intellij.openapi.options.ConfigurationException; import com.intellij.openapi.project.Project; import com.intellij.openapi.project.ProjectUtil; import com.intellij.openapi.util.Disposer; -import com.intellij.openapi.util.IconLoader; import com.intellij.psi.codeStyle.*; import com.intellij.ui.components.JBTabbedPane; import org.jetbrains.annotations.NotNull; @@ -36,7 +35,8 @@ import org.jetbrains.annotations.Nullable; import javax.swing.*; import java.awt.*; -import java.awt.event.*; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; @@ -47,9 +47,6 @@ import java.util.List; */ public abstract class TabbedLanguageCodeStylePanel extends CodeStyleAbstractPanel { - - private final static Icon COPY_ICON = IconLoader.getIcon("/actions/import.png"); - private CodeStyleAbstractPanel myActiveTab; private List myTabs; private JPanel myPanel; @@ -120,37 +117,22 @@ public abstract class TabbedLanguageCodeStylePanel extends CodeStyleAbstractPane myTabs = new ArrayList(); myPanel.add(myTabbedPane); initTabs(getSettings()); - addSetFrom(); } assert !myTabs.isEmpty(); } - private void addSetFrom() { - myPredefinedCodeStyles = getPredefinedStyles(); - JLabel dummyLabel = new JLabel(""); - myTabbedPane.addTab("Set From...", dummyLabel); - int dummyIndex = myTabbedPane.indexOfComponent(dummyLabel); - myTabbedPane.setEnabledAt(dummyIndex, false); - JPanel setFromPanel = new JPanel(); - setFromPanel.setBorder(BorderFactory.createEtchedBorder()); - setFromPanel.setLayout(new FlowLayout(FlowLayout.LEFT, 10, 0)); - final JLabel setFromLabel = new JLabel("Set from..."); - setFromPanel.add(setFromLabel); - setFromLabel.setIcon(COPY_ICON); - setFromLabel.addMouseListener(new MouseAdapter() { - @Override - public void mousePressed(MouseEvent e) { - initCopyFromMenu(setFromLabel); - myCopyFromMenu.show(e.getComponent(), e.getX(), e.getY()); - } - }); - myTabbedPane.setTabComponentAt(dummyIndex, setFromPanel); + public void showSetFrom(Object e) { + final Container component = (Container)e; + final Component[] components = component.getComponents(); + final Component last = components[components.length - 1]; + initCopyFromMenu(last); + myCopyFromMenu.show(last, 0, last.getHeight() + 3); } - - private void initCopyFromMenu(JComponent parent) { + + private void initCopyFromMenu(Component component) { if (myCopyFromMenu == null) { myCopyFromMenu = new PopupMenu(); - parent.add(myCopyFromMenu); + component.add(myCopyFromMenu); setupCopyFromMenu(myCopyFromMenu); } } diff --git a/platform/lang-impl/src/com/intellij/application/options/codeStyle/CodeStyleMainPanel.java b/platform/lang-impl/src/com/intellij/application/options/codeStyle/CodeStyleMainPanel.java index 3ac71f3f27d8..3b4e324503e9 100644 --- a/platform/lang-impl/src/com/intellij/application/options/codeStyle/CodeStyleMainPanel.java +++ b/platform/lang-impl/src/com/intellij/application/options/codeStyle/CodeStyleMainPanel.java @@ -16,18 +16,20 @@ package com.intellij.application.options.codeStyle; +import com.intellij.application.options.CodeStyleAbstractPanel; +import com.intellij.application.options.TabbedLanguageCodeStylePanel; import com.intellij.lang.Language; import com.intellij.openapi.application.ApplicationBundle; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.ui.DetailsComponent; import com.intellij.psi.codeStyle.CodeStyleScheme; import com.intellij.psi.codeStyle.CodeStyleSchemes; -import com.intellij.psi.codeStyle.LanguageCodeStyleSettingsProvider; import com.intellij.util.Alarm; import org.jetbrains.annotations.NonNls; import javax.swing.*; import java.awt.*; +import java.awt.event.ActionEvent; import java.util.Collection; import java.util.HashMap; import java.util.Map; @@ -120,6 +122,7 @@ public class CodeStyleMainPanel extends JPanel implements LanguageSelectorListen ensureCurrentPanel().onSomethingChanged(); String schemeName = myModel.getSelectedScheme().getName(); myDetailsComponent.setText(schemeName); + updateSetFrom(); myLayout.show(mySettingsPanel, schemeName); } } @@ -137,6 +140,21 @@ public class CodeStyleMainPanel extends JPanel implements LanguageSelectorListen } } + private void updateSetFrom() { + final CodeStyleAbstractPanel selectedPanel = ensureCurrentPanel().getSelectedPanel(); + if (selectedPanel instanceof TabbedLanguageCodeStylePanel) { + myDetailsComponent.setBannerActions(new Action[]{new AbstractAction("Set from...") { + @Override + public void actionPerformed(ActionEvent e) { + final CodeStyleAbstractPanel selectedPanel = ensureCurrentPanel().getSelectedPanel(); + if (selectedPanel instanceof TabbedLanguageCodeStylePanel) { + ((TabbedLanguageCodeStylePanel)selectedPanel).showSetFrom(e.getSource()); + } + } + }}); + } + } + public NewCodeStyleSettingsPanel[] getPanels() { final Collection panels = mySettingsPanels.values(); return panels.toArray(new NewCodeStyleSettingsPanel[panels.size()]); From 52e45ed72fbbd490f9d0cea8c7eab1ab24747bd8 Mon Sep 17 00:00:00 2001 From: Dennis Ushakov Date: Wed, 8 Feb 2012 13:58:06 +0400 Subject: [PATCH 145/215] set min height to remove jumping --- .../application/options/codeStyle/CodeStyleMainPanel.java | 1 + 1 file changed, 1 insertion(+) diff --git a/platform/lang-impl/src/com/intellij/application/options/codeStyle/CodeStyleMainPanel.java b/platform/lang-impl/src/com/intellij/application/options/codeStyle/CodeStyleMainPanel.java index 3b4e324503e9..f998dfb410c7 100644 --- a/platform/lang-impl/src/com/intellij/application/options/codeStyle/CodeStyleMainPanel.java +++ b/platform/lang-impl/src/com/intellij/application/options/codeStyle/CodeStyleMainPanel.java @@ -95,6 +95,7 @@ public class CodeStyleMainPanel extends JPanel implements LanguageSelectorListen myDetailsComponent.setPaintBorder(false); myDetailsComponent.setContent(mySettingsPanel); myDetailsComponent.setText(getDisplayName()); + myDetailsComponent.setBannerMinHeight(24); add(myDetailsComponent.getComponent(), BorderLayout.CENTER); From 8c4e6cba3d7f3b3fce1832b1b9ac00cc2f396857 Mon Sep 17 00:00:00 2001 From: Oleg Shpynov Date: Wed, 8 Feb 2012 14:24:52 +0400 Subject: [PATCH 146/215] Highlight menu items in Code Style | Set from... action on Linux --- .../options/CodeStyleAbstractPanel.java | 6 ++-- .../options/TabbedLanguageCodeStylePanel.java | 30 +++++++++---------- 2 files changed, 17 insertions(+), 19 deletions(-) diff --git a/platform/lang-impl/src/com/intellij/application/options/CodeStyleAbstractPanel.java b/platform/lang-impl/src/com/intellij/application/options/CodeStyleAbstractPanel.java index cb467e646318..2ba65b47b927 100644 --- a/platform/lang-impl/src/com/intellij/application/options/CodeStyleAbstractPanel.java +++ b/platform/lang-impl/src/com/intellij/application/options/CodeStyleAbstractPanel.java @@ -615,10 +615,8 @@ public abstract class CodeStyleAbstractPanel implements Disposable { return myCurrentSettings; } - public void setupCopyFromMenu(Menu copyMenu) { - if (copyMenu.getItemCount() > 0) { - copyMenu.removeAll(); - } + public void setupCopyFromMenu(JPopupMenu copyMenu) { + copyMenu.removeAll(); } public boolean isCopyFromMenuAvailable() { diff --git a/platform/lang-impl/src/com/intellij/application/options/TabbedLanguageCodeStylePanel.java b/platform/lang-impl/src/com/intellij/application/options/TabbedLanguageCodeStylePanel.java index f90931fa3b75..8de3532808a5 100644 --- a/platform/lang-impl/src/com/intellij/application/options/TabbedLanguageCodeStylePanel.java +++ b/platform/lang-impl/src/com/intellij/application/options/TabbedLanguageCodeStylePanel.java @@ -52,7 +52,7 @@ public abstract class TabbedLanguageCodeStylePanel extends CodeStyleAbstractPane private JPanel myPanel; private JTabbedPane myTabbedPane; private PredefinedCodeStyle[] myPredefinedCodeStyles; - private PopupMenu myCopyFromMenu; + private JPopupMenu myCopyFromMenu; protected TabbedLanguageCodeStylePanel(@Nullable Language language, CodeStyleSettings currentSettings, CodeStyleSettings settings) { super(language, currentSettings, settings); @@ -131,8 +131,8 @@ public abstract class TabbedLanguageCodeStylePanel extends CodeStyleAbstractPane private void initCopyFromMenu(Component component) { if (myCopyFromMenu == null) { - myCopyFromMenu = new PopupMenu(); - component.add(myCopyFromMenu); + myCopyFromMenu = new JPopupMenu(); + //component.add(myCopyFromMenu); setupCopyFromMenu(myCopyFromMenu); } } @@ -265,13 +265,13 @@ public abstract class TabbedLanguageCodeStylePanel extends CodeStyleAbstractPane @Override - public void setupCopyFromMenu(Menu copyMenu) { + public void setupCopyFromMenu(JPopupMenu copyMenu) { super.setupCopyFromMenu(copyMenu); if (myPredefinedCodeStyles.length > 0) { - Menu langs = new Menu("Language"); //TODO: Move to resource bundle + JMenuItem langs = new JMenuItem("Language"); //TODO: Move to resource bundle copyMenu.add(langs); fillLanguages(langs); - Menu predefined = new Menu("Predefined Style"); //TODO: Move to resource bundle + JMenuItem predefined = new JMenuItem("Predefined Style"); //TODO: Move to resource bundle copyMenu.add(predefined); fillPredefined(predefined); } @@ -281,14 +281,14 @@ public abstract class TabbedLanguageCodeStylePanel extends CodeStyleAbstractPane } - private void fillLanguages(Menu parentMenu) { + private void fillLanguages(JComponent parentMenu) { Language[] languages = LanguageCodeStyleSettingsProvider.getLanguagesWithCodeStyleSettings(); @SuppressWarnings("UnnecessaryFullyQualifiedName") - java.util.List langItems = new ArrayList(); + java.util.List langItems = new ArrayList(); for (final Language lang : languages) { if (!lang.equals(getDefaultLanguage())) { final String langName = LanguageCodeStyleSettingsProvider.getLanguageName(lang); - MenuItem langItem = new MenuItem(langName); + JMenuItem langItem = new JMenuItem(langName); langItem.addActionListener(new ActionListener(){ @Override public void actionPerformed(ActionEvent e) { @@ -298,20 +298,20 @@ public abstract class TabbedLanguageCodeStylePanel extends CodeStyleAbstractPane langItems.add(langItem); } } - Collections.sort(langItems, new Comparator() { + Collections.sort(langItems, new Comparator() { @Override - public int compare(MenuItem item1, MenuItem item2) { - return item1.getLabel().compareToIgnoreCase(item2.getLabel()); + public int compare(JMenuItem item1, JMenuItem item2) { + return item1.getText().compareToIgnoreCase(item2.getText()); } }); - for (MenuItem langItem : langItems) { + for (JMenuItem langItem : langItems) { parentMenu.add(langItem); } } - private void fillPredefined(Menu parentMenu) { + private void fillPredefined(JMenuItem parentMenu) { for (final PredefinedCodeStyle predefinedCodeStyle : myPredefinedCodeStyles) { - MenuItem predefinedItem = new MenuItem(predefinedCodeStyle.getName()); + JMenuItem predefinedItem = new JMenuItem(predefinedCodeStyle.getName()); parentMenu.add(predefinedItem); predefinedItem.addActionListener(new ActionListener() { @Override From a781d2cdd32ade4ac50d181a8e38cbe9f1082528 Mon Sep 17 00:00:00 2001 From: Eugene Kudelevsky Date: Mon, 6 Feb 2012 17:28:19 +0400 Subject: [PATCH 147/215] clean up --- .../jetbrains/android/compiler/AndroidAptCompiler.java | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/plugins/android/src/org/jetbrains/android/compiler/AndroidAptCompiler.java b/plugins/android/src/org/jetbrains/android/compiler/AndroidAptCompiler.java index 154a71673ab2..2872cf8f95a8 100644 --- a/plugins/android/src/org/jetbrains/android/compiler/AndroidAptCompiler.java +++ b/plugins/android/src/org/jetbrains/android/compiler/AndroidAptCompiler.java @@ -29,6 +29,7 @@ import com.intellij.openapi.util.Computable; import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.vfs.LocalFileSystem; import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.util.ArrayUtil; import com.intellij.util.containers.HashMap; import com.intellij.util.containers.HashSet; import org.jetbrains.android.compiler.tools.AndroidApt; @@ -58,6 +59,7 @@ public class AndroidAptCompiler implements SourceGeneratingCompiler { private static final Logger LOG = Logger.getInstance("#org.jetbrains.android.compiler.AndroidAptCompiler"); private static final GenerationItem[] EMPTY_GENERATION_ITEM_ARRAY = {}; + @Nullable @Override public VirtualFile getPresentableFile(CompileContext context, Module module, VirtualFile outputRoot, VirtualFile generatedFile) { return null; @@ -265,11 +267,6 @@ public class AndroidAptCompiler implements SourceGeneratingCompiler { public boolean isTestSource() { return false; } - - @NotNull - public String getPackageFolderPath() { - return FileUtil.toSystemDependentName(mySourceRootPath + '/' + myPackage.replace('.', '/')); - } } @Nullable @@ -364,7 +361,7 @@ public class AndroidAptCompiler implements SourceGeneratingCompiler { } } - return result.toArray(new String[result.size()]); + return ArrayUtil.toStringArray(result); } } From 913e32b1590ea469c471cc0a46de25436c2ae9b1 Mon Sep 17 00:00:00 2001 From: Eugene Kudelevsky Date: Mon, 6 Feb 2012 18:50:03 +0400 Subject: [PATCH 148/215] refactoring: move apt,dx and idl runners to separate "android-rt" module --- .idea/modules.xml | 3 +- plugins/android/android.iml | 1 + plugins/android/rt/android-rt.iml | 25 ++++ .../android/compiler/tools/AndroidApt.java | 111 +++++++-------- .../compiler/tools/AndroidDxRunner.java | 0 .../android/compiler/tools/AndroidIdl.java | 18 +-- .../android/util/AndroidCommonUtils.java | 32 +++++ .../util/AndroidCompilerMessageKind.java | 8 ++ .../android/util/AndroidOSProcessHandler.java | 61 ++++++++ .../jetbrains/android/util/ExecutionUtil.java | 106 ++++++++++++++ .../android/compiler/AndroidAptCompiler.java | 34 +++-- .../android/compiler/AndroidCompileUtil.java | 70 ++++++--- .../android/compiler/AndroidIdlCompiler.java | 4 +- .../AndroidMavenResourcesCompiler.java | 6 +- .../AndroidPngFilesCachingCompiler.java | 6 +- .../compiler/AndroidProguardCompiler.java | 17 ++- .../compiler/AndroidRenderscriptCompiler.java | 6 +- .../AndroidResourcesPackagingCompiler.java | 14 +- .../compiler/tools/AndroidApkBuilder.java | 4 +- .../android/util/AndroidResourceUtil.java | 2 +- .../jetbrains/android/util/AndroidUtils.java | 18 +-- .../jetbrains/android/util/ExecutionUtil.java | 134 ------------------ 22 files changed, 405 insertions(+), 275 deletions(-) create mode 100644 plugins/android/rt/android-rt.iml rename plugins/android/{ => rt}/src/org/jetbrains/android/compiler/tools/AndroidApt.java (73%) rename plugins/android/{ => rt}/src/org/jetbrains/android/compiler/tools/AndroidDxRunner.java (100%) rename plugins/android/{ => rt}/src/org/jetbrains/android/compiler/tools/AndroidIdl.java (74%) create mode 100644 plugins/android/rt/src/org/jetbrains/android/util/AndroidCommonUtils.java create mode 100644 plugins/android/rt/src/org/jetbrains/android/util/AndroidCompilerMessageKind.java create mode 100644 plugins/android/rt/src/org/jetbrains/android/util/AndroidOSProcessHandler.java create mode 100644 plugins/android/rt/src/org/jetbrains/android/util/ExecutionUtil.java delete mode 100644 plugins/android/src/org/jetbrains/android/util/ExecutionUtil.java diff --git a/.idea/modules.xml b/.idea/modules.xml index 9e15d0263725..00d78128e8be 100644 --- a/.idea/modules.xml +++ b/.idea/modules.xml @@ -9,7 +9,8 @@ - + + diff --git a/plugins/android/android.iml b/plugins/android/android.iml index 1acddaf410cf..b6502266fba7 100644 --- a/plugins/android/android.iml +++ b/plugins/android/android.iml @@ -61,6 +61,7 @@ + diff --git a/plugins/android/rt/android-rt.iml b/plugins/android/rt/android-rt.iml new file mode 100644 index 000000000000..13bee7b61859 --- /dev/null +++ b/plugins/android/rt/android-rt.iml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/plugins/android/src/org/jetbrains/android/compiler/tools/AndroidApt.java b/plugins/android/rt/src/org/jetbrains/android/compiler/tools/AndroidApt.java similarity index 73% rename from plugins/android/src/org/jetbrains/android/compiler/tools/AndroidApt.java rename to plugins/android/rt/src/org/jetbrains/android/compiler/tools/AndroidApt.java index 465f38fbeeaf..7f112779b051 100644 --- a/plugins/android/src/org/jetbrains/android/compiler/tools/AndroidApt.java +++ b/plugins/android/rt/src/org/jetbrains/android/compiler/tools/AndroidApt.java @@ -16,13 +16,12 @@ package org.jetbrains.android.compiler.tools; import com.android.sdklib.IAndroidTarget; -import com.intellij.openapi.compiler.CompilerMessageCategory; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.util.io.FileUtil; import com.intellij.util.ArrayUtil; import com.intellij.util.containers.HashMap; -import org.jetbrains.android.compiler.AndroidCompileUtil; -import org.jetbrains.android.util.AndroidUtils; +import org.jetbrains.android.util.AndroidCommonUtils; +import org.jetbrains.android.util.AndroidCompilerMessageKind; import org.jetbrains.android.util.ExecutionUtil; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; @@ -47,22 +46,22 @@ public final class AndroidApt { private AndroidApt() { } - public static Map> compile(@NotNull IAndroidTarget target, - int platformToolsRevision, - @NotNull String manifestFileOsPath, - @NotNull String aPackage, - @NotNull String outDirOsPath, - @NotNull String[] resourceDirsOsPaths, - @NotNull String[] libPackages, - boolean isLibrary) throws IOException { - final Map> messages = new HashMap>(); - messages.put(CompilerMessageCategory.ERROR, new ArrayList()); - messages.put(CompilerMessageCategory.INFORMATION, new ArrayList()); + public static Map> compile(@NotNull IAndroidTarget target, + int platformToolsRevision, + @NotNull String manifestFileOsPath, + @NotNull String aPackage, + @NotNull String outDirOsPath, + @NotNull String[] resourceDirsOsPaths, + @NotNull String[] libPackages, + boolean isLibrary) throws IOException { + final Map> messages = new HashMap>(); + messages.put(AndroidCompilerMessageKind.ERROR, new ArrayList()); + messages.put(AndroidCompilerMessageKind.INFORMATION, new ArrayList()); final File outOsDir = new File(outDirOsPath); if (!outOsDir.exists()) { if (!outOsDir.mkdirs()) { - messages.get(CompilerMessageCategory.ERROR).add("Unable to create directory " + outDirOsPath); + messages.get(AndroidCompilerMessageKind.ERROR).add("Unable to create directory " + outDirOsPath); } } @@ -71,55 +70,55 @@ public final class AndroidApt { /* We actually need to delete the manifest.java as it may become empty and in this case aapt doesn't generate an empty one, but instead doesn't touch it */ - final File manifestJavaFile = new File(packageFolderOsPath + File.separatorChar + AndroidUtils.MANIFEST_JAVA_FILE_NAME); + final File manifestJavaFile = new File(packageFolderOsPath + File.separatorChar + AndroidCommonUtils.MANIFEST_JAVA_FILE_NAME); if (manifestJavaFile.exists()) { if (!FileUtil.delete(manifestJavaFile)) { - messages.get(CompilerMessageCategory.ERROR).add("Unable to delete " + manifestJavaFile.getPath()); + messages.get(AndroidCompilerMessageKind.ERROR).add("Unable to delete " + manifestJavaFile.getPath()); } } - - final File rJavaFile = new File(packageFolderOsPath + File.separatorChar + AndroidUtils.R_JAVA_FILENAME); + + final File rJavaFile = new File(packageFolderOsPath + File.separatorChar + AndroidCommonUtils.R_JAVA_FILENAME); if (rJavaFile.exists()) { if (!FileUtil.delete(rJavaFile)) { - messages.get(CompilerMessageCategory.ERROR).add("Unable to delete " + rJavaFile.getPath()); + messages.get(AndroidCompilerMessageKind.ERROR).add("Unable to delete " + rJavaFile.getPath()); } } - + final File[] libRJavaFiles = new File[libPackages.length]; - + for (int i = 0; i < libPackages.length; i++) { final String libPackageFolderOsPath = FileUtil.toSystemDependentName(outDirOsPath + '/' + libPackages[i].replace('.', '/')); - libRJavaFiles[i] = new File(libPackageFolderOsPath + File.separatorChar + AndroidUtils.R_JAVA_FILENAME); + libRJavaFiles[i] = new File(libPackageFolderOsPath + File.separatorChar + AndroidCommonUtils.R_JAVA_FILENAME); } for (File libRJavaFile : libRJavaFiles) { if (libRJavaFile.exists()) { if (!FileUtil.delete(libRJavaFile)) { - messages.get(CompilerMessageCategory.ERROR).add("Unable to delete " + libRJavaFile.getPath()); + messages.get(AndroidCompilerMessageKind.ERROR).add("Unable to delete " + libRJavaFile.getPath()); } } } if (platformToolsRevision < 0 || platformToolsRevision > 7) { - Map> map = + Map> map = doCompile(target, manifestFileOsPath, outDirOsPath, resourceDirsOsPaths, libPackages, null, isLibrary); - if (map.get(CompilerMessageCategory.ERROR).isEmpty()) { + if (map.get(AndroidCompilerMessageKind.ERROR).isEmpty()) { makeFieldsNotFinal(libRJavaFiles); } - AndroidCompileUtil.addMessages(messages, map); + ExecutionUtil.addMessages(messages, map); return messages; } else { - Map> map; + Map> map; map = doCompile(target, manifestFileOsPath, outDirOsPath, resourceDirsOsPaths, ArrayUtil.EMPTY_STRING_ARRAY, null, false); - AndroidCompileUtil.addMessages(messages, map); + ExecutionUtil.addMessages(messages, map); for (String libPackage : libPackages) { map = doCompile(target, manifestFileOsPath, outDirOsPath, resourceDirsOsPaths, ArrayUtil.EMPTY_STRING_ARRAY, libPackage, false); - AndroidCompileUtil.addMessages(messages, map); + ExecutionUtil.addMessages(messages, map); } return messages; } @@ -148,13 +147,13 @@ public final class AndroidApt { } } - private static Map> doCompile(@NotNull IAndroidTarget target, - @NotNull String manifestFileOsPath, - @NotNull String outDirOsPath, - @NotNull String[] resourceDirsOsPaths, - @NotNull String[] extraPackages, - @Nullable String customPackage, - boolean nonConstantIds) + private static Map> doCompile(@NotNull IAndroidTarget target, + @NotNull String manifestFileOsPath, + @NotNull String outDirOsPath, + @NotNull String[] resourceDirsOsPaths, + @NotNull String[] extraPackages, + @Nullable String customPackage, + boolean nonConstantIds) throws IOException { final List args = new ArrayList(); @@ -174,7 +173,7 @@ public final class AndroidApt { args.add("--extra-packages"); args.add(toPackagesString(extraPackages)); } - + if (customPackage != null) { args.add("--custom-package"); args.add(customPackage); @@ -193,8 +192,8 @@ public final class AndroidApt { args.add("-I"); args.add(target.getPath(IAndroidTarget.ANDROID_JAR)); - LOG.info(AndroidUtils.command2string(args)); - return ExecutionUtil.execute(ArrayUtil.toStringArray(args)); + LOG.info(AndroidCommonUtils.command2string(args)); + return ExecutionUtil.doExecute(ArrayUtil.toStringArray(args)); } @NotNull @@ -209,9 +208,9 @@ public final class AndroidApt { return builder.toString(); } - public static Map> crunch(@NotNull IAndroidTarget target, - @NotNull List resPaths, - @NotNull String outputPath) throws IOException { + public static Map> crunch(@NotNull IAndroidTarget target, + @NotNull List resPaths, + @NotNull String outputPath) throws IOException { final ArrayList args = new ArrayList(); //noinspection deprecation @@ -227,19 +226,19 @@ public final class AndroidApt { args.add("-C"); args.add(outputPath); - LOG.info(AndroidUtils.command2string(args)); - return ExecutionUtil.execute(ArrayUtil.toStringArray(args)); + LOG.info(AndroidCommonUtils.command2string(args)); + return ExecutionUtil.doExecute(ArrayUtil.toStringArray(args)); } - public static Map> packageResources(@NotNull IAndroidTarget target, - int platformToolsRevision, - @NotNull String manifestPath, - @NotNull String[] resPaths, - @Nullable String osAssetsPath, - @NotNull String outputPath, - @Nullable String configFilter, - boolean debugMode, - int versionCode) throws IOException { + public static Map> packageResources(@NotNull IAndroidTarget target, + int platformToolsRevision, + @NotNull String manifestPath, + @NotNull String[] resPaths, + @Nullable String osAssetsPath, + @NotNull String outputPath, + @Nullable String configFilter, + boolean debugMode, + int versionCode) throws IOException { final ArrayList args = new ArrayList(); //noinspection deprecation @@ -290,7 +289,7 @@ public final class AndroidApt { args.add("-F"); args.add(outputPath); - LOG.info(AndroidUtils.command2string(args)); - return ExecutionUtil.execute(ArrayUtil.toStringArray(args)); + LOG.info(AndroidCommonUtils.command2string(args)); + return ExecutionUtil.doExecute(ArrayUtil.toStringArray(args)); } } diff --git a/plugins/android/src/org/jetbrains/android/compiler/tools/AndroidDxRunner.java b/plugins/android/rt/src/org/jetbrains/android/compiler/tools/AndroidDxRunner.java similarity index 100% rename from plugins/android/src/org/jetbrains/android/compiler/tools/AndroidDxRunner.java rename to plugins/android/rt/src/org/jetbrains/android/compiler/tools/AndroidDxRunner.java diff --git a/plugins/android/src/org/jetbrains/android/compiler/tools/AndroidIdl.java b/plugins/android/rt/src/org/jetbrains/android/compiler/tools/AndroidIdl.java similarity index 74% rename from plugins/android/src/org/jetbrains/android/compiler/tools/AndroidIdl.java rename to plugins/android/rt/src/org/jetbrains/android/compiler/tools/AndroidIdl.java index daa4083bef6a..16e0bc1a3175 100644 --- a/plugins/android/src/org/jetbrains/android/compiler/tools/AndroidIdl.java +++ b/plugins/android/rt/src/org/jetbrains/android/compiler/tools/AndroidIdl.java @@ -16,8 +16,8 @@ package org.jetbrains.android.compiler.tools; import com.android.sdklib.IAndroidTarget; -import com.intellij.openapi.compiler.CompilerMessageCategory; import com.intellij.util.ArrayUtil; +import org.jetbrains.android.util.AndroidCompilerMessageKind; import org.jetbrains.android.util.ExecutionUtil; import org.jetbrains.annotations.NotNull; @@ -36,20 +36,22 @@ public final class AndroidIdl { } @NotNull - public static Map> execute(@NotNull IAndroidTarget target, - @NotNull String file, - @NotNull String outFile, - @NotNull String[] sourceRootPaths) throws IOException { - List commands = new ArrayList(); - String frameworkAidlPath = target.getPath(IAndroidTarget.ANDROID_AIDL); + public static Map> execute(@NotNull IAndroidTarget target, + @NotNull String file, + @NotNull String outFile, + @NotNull String[] sourceRootPaths) throws IOException { + final List commands = new ArrayList(); + final String frameworkAidlPath = target.getPath(IAndroidTarget.ANDROID_AIDL); + commands.add(target.getPath(IAndroidTarget.AIDL)); commands.add("-p" + frameworkAidlPath); + for (String path : sourceRootPaths) { commands.add("-I" + path); } commands.add(file); commands.add(outFile); - return ExecutionUtil.execute(ArrayUtil.toStringArray(commands)); + return ExecutionUtil.doExecute(ArrayUtil.toStringArray(commands)); } } diff --git a/plugins/android/rt/src/org/jetbrains/android/util/AndroidCommonUtils.java b/plugins/android/rt/src/org/jetbrains/android/util/AndroidCommonUtils.java new file mode 100644 index 000000000000..450687945d47 --- /dev/null +++ b/plugins/android/rt/src/org/jetbrains/android/util/AndroidCommonUtils.java @@ -0,0 +1,32 @@ +package org.jetbrains.android.util; + +import org.jetbrains.annotations.NonNls; +import org.jetbrains.annotations.NotNull; + +import java.util.Collection; +import java.util.Iterator; + +/** + * @author Eugene.Kudelevsky + */ +public class AndroidCommonUtils { + @NonNls public static final Object MANIFEST_JAVA_FILE_NAME = "Manifest.java"; + public static final String R_JAVA_FILENAME = "R.java"; + + private AndroidCommonUtils() { + } + + public static String command2string(@NotNull Collection command) { + final StringBuilder builder = new StringBuilder(); + for (Iterator it = command.iterator(); it.hasNext(); ) { + String s = it.next(); + builder.append('['); + builder.append(s); + builder.append(']'); + if (it.hasNext()) { + builder.append(' '); + } + } + return builder.toString(); + } +} diff --git a/plugins/android/rt/src/org/jetbrains/android/util/AndroidCompilerMessageKind.java b/plugins/android/rt/src/org/jetbrains/android/util/AndroidCompilerMessageKind.java new file mode 100644 index 000000000000..6c8a8cb80c50 --- /dev/null +++ b/plugins/android/rt/src/org/jetbrains/android/util/AndroidCompilerMessageKind.java @@ -0,0 +1,8 @@ +package org.jetbrains.android.util; + +/** + * @author Eugene.Kudelevsky + */ +public enum AndroidCompilerMessageKind { + ERROR, INFORMATION, WARNING +} diff --git a/plugins/android/rt/src/org/jetbrains/android/util/AndroidOSProcessHandler.java b/plugins/android/rt/src/org/jetbrains/android/util/AndroidOSProcessHandler.java new file mode 100644 index 000000000000..1811d0e24fc7 --- /dev/null +++ b/plugins/android/rt/src/org/jetbrains/android/util/AndroidOSProcessHandler.java @@ -0,0 +1,61 @@ +package org.jetbrains.android.util; + +import com.intellij.execution.process.BaseOSProcessHandler; +import com.intellij.execution.process.ProcessOutputTypes; +import com.intellij.openapi.util.Key; +import com.intellij.openapi.util.text.StringUtil; +import org.jetbrains.annotations.NonNls; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author Eugene.Kudelevsky + */ +public class AndroidOSProcessHandler extends BaseOSProcessHandler { + @NonNls private static final String IGNORING = "ignoring"; + @NonNls private static final String SKIPPING = "skipping"; + + private final List myInfoMessages = new ArrayList(); + private final List myErrorMessages = new ArrayList(); + + public AndroidOSProcessHandler(@NotNull final Process process, @Nullable final String commandLine) { + super(process, commandLine, null); + } + + @Override + public void notifyTextAvailable(String text, Key outputType) { + super.notifyTextAvailable(text, outputType); + + if (StringUtil.isEmptyOrSpaces(text)) { + return; + } + String[] lines = text.split("[\\n\\r]+"); + for (String line : lines) { + String l = line.toLowerCase(); + if (outputType == ProcessOutputTypes.STDOUT) { + myInfoMessages.add(line); + } + else if (outputType == ProcessOutputTypes.STDERR) { + if (l.contains(IGNORING) || l.contains(SKIPPING)) { + myInfoMessages.add(line); + } + else { + myErrorMessages.add(line); + } + } + } + } + + @NotNull + public List getInfoMessages() { + return myInfoMessages; + } + + @NotNull + public List getErrorMessages() { + return myErrorMessages; + } +} diff --git a/plugins/android/rt/src/org/jetbrains/android/util/ExecutionUtil.java b/plugins/android/rt/src/org/jetbrains/android/util/ExecutionUtil.java new file mode 100644 index 000000000000..a65663d4fc76 --- /dev/null +++ b/plugins/android/rt/src/org/jetbrains/android/util/ExecutionUtil.java @@ -0,0 +1,106 @@ +/* + * Copyright 2000-2010 JetBrains s.r.o. + * + * 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. + */ +package org.jetbrains.android.util; + +import org.jetbrains.annotations.NotNull; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * Abstract external tool for compiler. + * + * @author Alexey Efimov + */ +public final class ExecutionUtil { + + private ExecutionUtil() { + } + + @NotNull + public static Map> doExecute(String... argv) throws IOException { + ProcessBuilder builder = new ProcessBuilder(argv); + ProcessResult result = readProcessOutput(builder.start()); + Map> messages = result.getMessages(); + int code = result.getExitCode(); + List errMessages = messages.get(AndroidCompilerMessageKind.ERROR); + + if (code != 0 && errMessages.isEmpty()) { + throw new IOException("Command \"" + concat(argv) + "\" execution failed with exit code " + code); + } + else { + if (code == 0) { + messages.get(AndroidCompilerMessageKind.INFORMATION).addAll(errMessages); + errMessages.clear(); + } + return messages; + } + } + + private static String concat(String... strs) { + StringBuilder builder = new StringBuilder(); + for (int i = 0, n = strs.length; i < n; i++) { + builder.append(strs[i]); + if (i < n - 1) { + builder.append(' '); + } + } + return builder.toString(); + } + + @NotNull + private static ProcessResult readProcessOutput(Process process) throws IOException { + final AndroidOSProcessHandler handler = new AndroidOSProcessHandler(process, ""); + handler.startNotify(); + handler.waitFor(); + int exitCode = handler.getProcess().exitValue(); + return new ProcessResult(handler.getInfoMessages(), handler.getErrorMessages(), exitCode); + } + + private static final class ProcessResult { + private final int myExitCode; + private final Map> myMessages; + + public ProcessResult(List information, List error, int exitCode) { + myExitCode = exitCode; + myMessages = new HashMap>(2); + myMessages.put(AndroidCompilerMessageKind.INFORMATION, information); + myMessages.put(AndroidCompilerMessageKind.ERROR, error); + } + + public Map> getMessages() { + return myMessages; + } + + public int getExitCode() { + return myExitCode; + } + } + + public static void addMessages(@NotNull Map> messages, @NotNull Map> toAdd) { + for (Map.Entry> entry : toAdd.entrySet()) { + List list = messages.get(entry.getKey()); + if (list == null) { + list = new ArrayList(); + messages.put(entry.getKey(), list); + } + list.addAll(entry.getValue()); + } + } +} diff --git a/plugins/android/src/org/jetbrains/android/compiler/AndroidAptCompiler.java b/plugins/android/src/org/jetbrains/android/compiler/AndroidAptCompiler.java index 2872cf8f95a8..2d56bf86d2e9 100644 --- a/plugins/android/src/org/jetbrains/android/compiler/AndroidAptCompiler.java +++ b/plugins/android/src/org/jetbrains/android/compiler/AndroidAptCompiler.java @@ -40,6 +40,7 @@ import org.jetbrains.android.facet.AndroidRootUtil; import org.jetbrains.android.maven.AndroidMavenUtil; import org.jetbrains.android.sdk.AndroidPlatform; import org.jetbrains.android.util.AndroidBundle; +import org.jetbrains.android.util.AndroidCommonUtils; import org.jetbrains.android.util.AndroidUtils; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -120,10 +121,11 @@ public class AndroidAptCompiler implements SourceGeneratingCompiler { } try { - Map> messages = AndroidApt.compile(aptItem.myAndroidTarget, aptItem.myPlatformToolsRevision, - aptItem.myManifestFile.getPath(), aptItem.myPackage, - aptItem.mySourceRootPath, aptItem.myResourcesPaths, - aptItem.myLibraryPackages, aptItem.myIsLibrary); + Map> messages = AndroidCompileUtil.toCompilerMessageCategoryKeys( + AndroidApt.compile(aptItem.myAndroidTarget, aptItem.myPlatformToolsRevision, + aptItem.myManifestFile.getPath(), aptItem.myPackage, + aptItem.mySourceRootPath, aptItem.myResourcesPaths, + aptItem.myLibraryPackages, aptItem.myIsLibrary)); AndroidCompileUtil.addMessages(context, messages); if (messages.get(CompilerMessageCategory.ERROR).isEmpty()) { @@ -218,13 +220,14 @@ public class AndroidAptCompiler implements SourceGeneratingCompiler { myGeneratedFile2Package = new HashMap(); - myGeneratedFile2Package.put( - new File(sourceRootPath, aPackage.replace('.', File.separatorChar) + File.separator + AndroidUtils.R_JAVA_FILENAME), aPackage); + myGeneratedFile2Package + .put(new File(sourceRootPath, aPackage.replace('.', File.separatorChar) + File.separator + AndroidCommonUtils.R_JAVA_FILENAME), + aPackage); for (String libPackage : myLibraryPackages) { - myGeneratedFile2Package - .put(new File(sourceRootPath, libPackage.replace('.', File.separatorChar) + File.separator + AndroidUtils.R_JAVA_FILENAME), - libPackage); + myGeneratedFile2Package.put( + new File(sourceRootPath, libPackage.replace('.', File.separatorChar) + File.separator + AndroidCommonUtils.R_JAVA_FILENAME), + libPackage); } myNonExistingFiles = new HashSet(); @@ -237,13 +240,13 @@ public class AndroidAptCompiler implements SourceGeneratingCompiler { } myGeneratedFile2Package.put( - new File(sourceRootPath, aPackage.replace('.', File.separatorChar) + File.separator + AndroidUtils.MANIFEST_JAVA_FILE_NAME), + new File(sourceRootPath, aPackage.replace('.', File.separatorChar) + File.separator + AndroidCommonUtils.MANIFEST_JAVA_FILE_NAME), aPackage); for (String libraryPackage : myLibraryPackages) { - myGeneratedFile2Package.put( - new File(sourceRootPath, libraryPackage.replace('.', File.separatorChar) + File.separator + AndroidUtils.MANIFEST_JAVA_FILE_NAME), - libraryPackage); + myGeneratedFile2Package.put(new File(sourceRootPath, libraryPackage.replace('.', File.separatorChar) + + File.separator + + AndroidCommonUtils.MANIFEST_JAVA_FILE_NAME), libraryPackage); } } @@ -253,7 +256,7 @@ public class AndroidAptCompiler implements SourceGeneratingCompiler { } public String getPath() { - return myPackage.replace('.', '/') + '/' + AndroidUtils.R_JAVA_FILENAME; + return myPackage.replace('.', '/') + '/' + AndroidCommonUtils.R_JAVA_FILENAME; } public ValidityState getValidityState() { @@ -335,7 +338,8 @@ public class AndroidAptCompiler implements SourceGeneratingCompiler { String sourceRootPath = facet.getAptGenSourceRootPath(); if (sourceRootPath == null) { myContext.addMessage(CompilerMessageCategory.ERROR, - AndroidBundle.message("android.compilation.error.apt.gen.not.specified", module.getName()), null, -1, -1); + AndroidBundle.message("android.compilation.error.apt.gen.not.specified", module.getName()), + null, -1, -1); continue; } diff --git a/plugins/android/src/org/jetbrains/android/compiler/AndroidCompileUtil.java b/plugins/android/src/org/jetbrains/android/compiler/AndroidCompileUtil.java index 90a34eef8812..c5471799d7be 100644 --- a/plugins/android/src/org/jetbrains/android/compiler/AndroidCompileUtil.java +++ b/plugins/android/src/org/jetbrains/android/compiler/AndroidCompileUtil.java @@ -46,6 +46,7 @@ import com.intellij.psi.PsiFile; import com.intellij.psi.search.FileTypeIndex; import com.intellij.psi.search.GlobalSearchScope; import com.intellij.util.ArrayUtil; +import com.intellij.util.containers.HashMap; import com.intellij.util.containers.HashSet; import org.jetbrains.android.AndroidProjectComponent; import org.jetbrains.android.dom.resources.Attr; @@ -58,7 +59,9 @@ import org.jetbrains.android.fileTypes.AndroidIdlFileType; import org.jetbrains.android.fileTypes.AndroidRenderscriptFileType; import org.jetbrains.android.resourceManagers.LocalResourceManager; import org.jetbrains.android.sdk.AndroidPlatform; +import org.jetbrains.android.util.AndroidCompilerMessageKind; import org.jetbrains.android.util.AndroidUtils; +import org.jetbrains.android.util.ExecutionUtil; import org.jetbrains.android.util.ResourceEntry; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; @@ -77,16 +80,16 @@ import java.util.regex.Pattern; public class AndroidCompileUtil { private static final Logger LOG = Logger.getInstance("#org.jetbrains.android.compiler.AndroidCompileUtil"); private static Pattern R_PATTERN = Pattern.compile("R(\\$.*)?\\.class"); - + private static final Pattern ourMessagePattern = Pattern.compile("(.+):(\\d+):.+"); private static final Key RELEASE_BUILD_KEY = new Key("RELEASE_BUILD_KEY"); @NonNls private static final String RESOURCES_CACHE_DIR_NAME = "res-cache"; @NonNls private static final String GEN_MODULE_PREFIX = "~generated_"; - + @NonNls private static final String PROGUARD_CFG_FILE_NAME = "proguard.cfg"; @NonNls public static final String CLASSES_JAR_FILE_NAME = "classes.jar"; - + @NonNls private static final String[] SCALA_TEST_CONFIGURATIONS = {"ScalaTestRunConfiguration", "SpecsRunConfiguration", "Specs2RunConfiguration"}; @@ -94,6 +97,29 @@ public class AndroidCompileUtil { private AndroidCompileUtil() { } + @NotNull + public static Map toCompilerMessageCategoryKeys(@NotNull Map map) { + final Map result = new HashMap(); + + for (Map.Entry entry : map.entrySet()) { + final AndroidCompilerMessageKind key = entry.getKey(); + final T value = entry.getValue(); + + switch (key) { + case ERROR: + result.put(CompilerMessageCategory.ERROR, value); + break; + case INFORMATION: + result.put(CompilerMessageCategory.INFORMATION, value); + break; + case WARNING: + result.put(CompilerMessageCategory.WARNING, value); + break; + } + } + return result; + } + @Nullable public static VirtualFile getProguardConfigFile(@NotNull AndroidFacet facet) { final VirtualFile root = AndroidRootUtil.getMainContentRoot(facet); @@ -166,7 +192,7 @@ public class AndroidCompileUtil { if (root == anchor) { return; } - + VirtualFile parent = anchor.getParent(); if (parent == null) { return; @@ -191,7 +217,7 @@ public class AndroidCompileUtil { return; } Set rootsToExclude = new HashSet(); - collectChildrenRecursively(excludedRoot, root, rootsToExclude); + collectChildrenRecursively(excludedRoot, root, rootsToExclude); final ModifiableRootModel model = manager.getModifiableModel(); ContentEntry contentEntry = findContentEntryForRoot(model, excludedRoot); if (contentEntry != null) { @@ -218,7 +244,7 @@ public class AndroidCompileUtil { } }); } - + @NotNull private static String getGenModuleName(@NotNull Module module) { return GEN_MODULE_PREFIX + module.getName(); @@ -295,7 +321,7 @@ public class AndroidCompileUtil { } final VirtualFile moduleFile = genModule.getModuleFile(); moduleManager.disposeModule(genModule); - + if (moduleFile != null) { ApplicationManager.getApplication().invokeLater(new Runnable() { @Override @@ -397,10 +423,10 @@ public class AndroidCompileUtil { if (context == null) { return; } - + final Set affectedModules = new HashSet(); Collections.addAll(affectedModules, context.getCompileScope().getAffectedModules()); - + ApplicationManager.getApplication().invokeAndWait(new Runnable() { @Override public void run() { @@ -416,7 +442,7 @@ public class AndroidCompileUtil { } } }, ModalityState.defaultModalityState()); - + List itemsToGenerate = new ArrayList(); for (GeneratingCompiler.GenerationItem item : compiler.getGenerationItems(context)) { if (affectedModules.contains(item.getModule())) { @@ -530,15 +556,15 @@ public class AndroidCompileUtil { final Project project = facet.getModule().getProject(); final IntermediateOutputCompiler pngFilesCachingCompiler = collectResCacheDirs ? Extensions.findExtension(Compiler.EP_NAME, project, AndroidPngFilesCachingCompiler.class) : null; - + if (collectResCacheDirs) { assert pngFilesCachingCompiler != null; } - + final List result = new ArrayList(); doCollectResourceDirs(facet, collectResCacheDirs, result, context); - + for (AndroidFacet depFacet : AndroidUtils.getAllAndroidDependencies(facet.getModule(), true)) { doCollectResourceDirs(depFacet, collectResCacheDirs, result, context); } @@ -623,11 +649,11 @@ public class AndroidCompileUtil { public static boolean isFullBuild(@NotNull CompileContext context) { final RunConfiguration runConfiguration = CompileStepBeforeRun.getRunConfiguration(context); - + if (runConfiguration == null) { return true; } - + if (runConfiguration instanceof JUnitConfiguration) { return false; } @@ -802,7 +828,7 @@ public class AndroidCompileUtil { boolean packRClasses, @NotNull List> files) throws IOException { - + if (file.isDirectory()) { final File[] children = file.listFiles(); @@ -816,13 +842,13 @@ public class AndroidCompileUtil { if (!FileUtil.getExtension(file.getName()).equals("class")) { return; } - + if (!packRClasses && R_PATTERN.matcher(file.getName()).matches()) { return; } final String rootPath = rootDirectory.getAbsolutePath(); - + String path = file.getAbsolutePath(); path = FileUtil.toSystemIndependentName(path.substring(rootPath.length())); if (path.charAt(0) == '/') { @@ -861,4 +887,12 @@ public class AndroidCompileUtil { } return classFilesDirOsPaths; } + + // can't be invoked from dispatch thread + @NotNull + public static Map> execute(String... argv) throws IOException { + assert !ApplicationManager.getApplication().isDispatchThread(); + final Map> messages = ExecutionUtil.doExecute(argv); + return toCompilerMessageCategoryKeys(messages); + } } \ No newline at end of file diff --git a/plugins/android/src/org/jetbrains/android/compiler/AndroidIdlCompiler.java b/plugins/android/src/org/jetbrains/android/compiler/AndroidIdlCompiler.java index dddc60b173d4..8897732c4985 100644 --- a/plugins/android/src/org/jetbrains/android/compiler/AndroidIdlCompiler.java +++ b/plugins/android/src/org/jetbrains/android/compiler/AndroidIdlCompiler.java @@ -229,8 +229,8 @@ public class AndroidIdlCompiler implements SourceGeneratingCompiler { VirtualFile[] sourceRoots = AndroidPackagingCompiler.getSourceRootsForModuleAndDependencies(idlItem.myModule, false); final String[] sourceRootPaths = AndroidCompileUtil.toOsPaths(sourceRoots); - final Map> messages = AndroidIdl - .execute(idlItem.myAndroidTarget, idlItem.myFile.getPath(), idlItem.myGeneratedFile.getPath(), sourceRootPaths); + final Map> messages = AndroidCompileUtil.toCompilerMessageCategoryKeys( + AndroidIdl.execute(idlItem.myAndroidTarget, idlItem.myFile.getPath(), idlItem.myGeneratedFile.getPath(), sourceRootPaths)); ApplicationManager.getApplication().runReadAction(new Runnable() { public void run() { diff --git a/plugins/android/src/org/jetbrains/android/compiler/AndroidMavenResourcesCompiler.java b/plugins/android/src/org/jetbrains/android/compiler/AndroidMavenResourcesCompiler.java index 17d70f0d0d1d..7025e7bebf79 100644 --- a/plugins/android/src/org/jetbrains/android/compiler/AndroidMavenResourcesCompiler.java +++ b/plugins/android/src/org/jetbrains/android/compiler/AndroidMavenResourcesCompiler.java @@ -31,7 +31,7 @@ import org.jetbrains.android.facet.AndroidFacet; import org.jetbrains.android.facet.AndroidRootUtil; import org.jetbrains.android.maven.AndroidMavenProvider; import org.jetbrains.android.maven.AndroidMavenUtil; -import org.jetbrains.android.util.AndroidUtils; +import org.jetbrains.android.util.AndroidCommonUtils; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.idea.maven.project.MavenProject; @@ -144,13 +144,13 @@ public class AndroidMavenResourcesCompiler implements SourceGeneratingCompiler { myModule = module; myPackage = aPackage; myGeneratedFile = - new File(sourceRootPath, aPackage.replace('.', File.separatorChar) + File.separator + AndroidUtils.R_JAVA_FILENAME); + new File(sourceRootPath, aPackage.replace('.', File.separatorChar) + File.separator + AndroidCommonUtils.R_JAVA_FILENAME); mySourceRootPath = sourceRootPath; } @Nullable public String getPath() { - return myPackage.replace('.', '/') + '/' + AndroidUtils.R_JAVA_FILENAME; + return myPackage.replace('.', '/') + '/' + AndroidCommonUtils.R_JAVA_FILENAME; } public ValidityState getValidityState() { diff --git a/plugins/android/src/org/jetbrains/android/compiler/AndroidPngFilesCachingCompiler.java b/plugins/android/src/org/jetbrains/android/compiler/AndroidPngFilesCachingCompiler.java index a4a2a76d1e71..248c180d07f3 100644 --- a/plugins/android/src/org/jetbrains/android/compiler/AndroidPngFilesCachingCompiler.java +++ b/plugins/android/src/org/jetbrains/android/compiler/AndroidPngFilesCachingCompiler.java @@ -98,9 +98,9 @@ public class AndroidPngFilesCachingCompiler implements SourceGeneratingCompiler if (resCacheDirOsPath == null) { continue; } - - final Map> messages = - AndroidApt.crunch(item.getTarget(), Collections.singletonList(resDirOsPath), resCacheDirOsPath); + + final Map> messages = AndroidCompileUtil.toCompilerMessageCategoryKeys( + AndroidApt.crunch(item.getTarget(), Collections.singletonList(resDirOsPath), resCacheDirOsPath)); AndroidCompileUtil.addMessages(context, messages, null); if (context.getMessages(CompilerMessageCategory.ERROR).length == 0) { processedItems.add(item); diff --git a/plugins/android/src/org/jetbrains/android/compiler/AndroidProguardCompiler.java b/plugins/android/src/org/jetbrains/android/compiler/AndroidProguardCompiler.java index 466dbf7512a3..fb3ed1174edb 100644 --- a/plugins/android/src/org/jetbrains/android/compiler/AndroidProguardCompiler.java +++ b/plugins/android/src/org/jetbrains/android/compiler/AndroidProguardCompiler.java @@ -23,14 +23,19 @@ import org.jetbrains.android.facet.AndroidFacet; import org.jetbrains.android.facet.AndroidRootUtil; import org.jetbrains.android.sdk.AndroidPlatform; import org.jetbrains.android.util.AndroidBundle; -import org.jetbrains.android.util.AndroidUtils; -import org.jetbrains.android.util.ExecutionUtil; +import org.jetbrains.android.util.AndroidCommonUtils; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.io.*; -import java.util.*; +import java.io.DataInput; +import java.io.DataOutput; +import java.io.File; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Set; /** * @author Eugene.Kudelevsky @@ -250,8 +255,8 @@ public class AndroidProguardCompiler implements ClassPostProcessingCompiler { commands.add(quotePath(new File(logDirOutputOsPath, "mapping.txt").getAbsolutePath())); } - LOG.info(AndroidUtils.command2string(commands)); - return ExecutionUtil.execute(ArrayUtil.toStringArray(commands)); + LOG.info(AndroidCommonUtils.command2string(commands)); + return AndroidCompileUtil.execute(ArrayUtil.toStringArray(commands)); } private static String quotePath(String path) { diff --git a/plugins/android/src/org/jetbrains/android/compiler/AndroidRenderscriptCompiler.java b/plugins/android/src/org/jetbrains/android/compiler/AndroidRenderscriptCompiler.java index bb30b7b3ea2c..6b16f6aaf1d6 100644 --- a/plugins/android/src/org/jetbrains/android/compiler/AndroidRenderscriptCompiler.java +++ b/plugins/android/src/org/jetbrains/android/compiler/AndroidRenderscriptCompiler.java @@ -25,8 +25,8 @@ import org.jetbrains.android.facet.AndroidRootUtil; import org.jetbrains.android.fileTypes.AndroidRenderscriptFileType; import org.jetbrains.android.sdk.AndroidPlatform; import org.jetbrains.android.util.AndroidBundle; +import org.jetbrains.android.util.AndroidCommonUtils; import org.jetbrains.android.util.AndroidUtils; -import org.jetbrains.android.util.ExecutionUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -260,8 +260,8 @@ public class AndroidRenderscriptCompiler implements SourceGeneratingCompiler { command.add("-MD"); command.add(sourceFilePath); - LOG.info(AndroidUtils.command2string(command)); - return ExecutionUtil.execute(ArrayUtil.toStringArray(command)); + LOG.info(AndroidCommonUtils.command2string(command)); + return AndroidCompileUtil.execute(ArrayUtil.toStringArray(command)); } @Nullable diff --git a/plugins/android/src/org/jetbrains/android/compiler/AndroidResourcesPackagingCompiler.java b/plugins/android/src/org/jetbrains/android/compiler/AndroidResourcesPackagingCompiler.java index 50783b06c374..920bd48041dc 100644 --- a/plugins/android/src/org/jetbrains/android/compiler/AndroidResourcesPackagingCompiler.java +++ b/plugins/android/src/org/jetbrains/android/compiler/AndroidResourcesPackagingCompiler.java @@ -152,12 +152,14 @@ public class AndroidResourcesPackagingCompiler implements ClassPostProcessingCom ? item.myOutputPath + RELEASE_SUFFIX : item.myOutputPath; - Map> messages = AndroidApt.packageResources(item.myAndroidTarget, - item.myPlatformToolsRevision, - preprocessedManifestFile.getPath(), - item.myResourceDirPaths, - item.myAssetsDirPath, - outputPath, null, !releasePackage, 0); + Map> messages = AndroidCompileUtil.toCompilerMessageCategoryKeys( + AndroidApt.packageResources(item.myAndroidTarget, + item.myPlatformToolsRevision, + preprocessedManifestFile.getPath(), + item.myResourceDirPaths, + item.myAssetsDirPath, + outputPath, null, !releasePackage, 0)); + AndroidCompileUtil.addMessages(context, messages, presentableFilesMap); } catch (final IOException e) { diff --git a/plugins/android/src/org/jetbrains/android/compiler/tools/AndroidApkBuilder.java b/plugins/android/src/org/jetbrains/android/compiler/tools/AndroidApkBuilder.java index 5f097640f68d..a2e5c29d1997 100644 --- a/plugins/android/src/org/jetbrains/android/compiler/tools/AndroidApkBuilder.java +++ b/plugins/android/src/org/jetbrains/android/compiler/tools/AndroidApkBuilder.java @@ -33,11 +33,11 @@ import com.intellij.openapi.vfs.VirtualFile; import com.intellij.util.containers.HashMap; import com.intellij.util.containers.HashSet; import com.intellij.util.text.DateFormatUtil; +import org.jetbrains.android.compiler.AndroidCompileUtil; import org.jetbrains.android.facet.AndroidFacet; import org.jetbrains.android.sdk.AndroidPlatform; import org.jetbrains.android.util.AndroidBundle; import org.jetbrains.android.util.AndroidUtils; -import org.jetbrains.android.util.ExecutionUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -141,7 +141,7 @@ public class AndroidApkBuilder { map.putAll(map2); if (withAlignment && map.get(ERROR).size() == 0) { - map2 = ExecutionUtil.execute(zipAlignPath, "-f", "4", unalignedApk, finalApk); + map2 = AndroidCompileUtil.execute(zipAlignPath, "-f", "4", unalignedApk, finalApk); map.putAll(map2); } return map; diff --git a/plugins/android/src/org/jetbrains/android/util/AndroidResourceUtil.java b/plugins/android/src/org/jetbrains/android/util/AndroidResourceUtil.java index 553fb41e9c4a..d36a90ded8a2 100644 --- a/plugins/android/src/org/jetbrains/android/util/AndroidResourceUtil.java +++ b/plugins/android/src/org/jetbrains/android/util/AndroidResourceUtil.java @@ -99,7 +99,7 @@ public class AndroidResourceUtil { collectDirsForPackage(module, project, null, dirs, new HashSet(), onlyInOwnPackages); List rJavaFiles = new ArrayList(); for (PsiDirectory dir : dirs) { - VirtualFile file = dir.getVirtualFile().findChild(AndroidUtils.R_JAVA_FILENAME); + VirtualFile file = dir.getVirtualFile().findChild(AndroidCommonUtils.R_JAVA_FILENAME); if (file != null) { PsiFile psiFile = PsiManager.getInstance(project).findFile(file); if (psiFile instanceof PsiJavaFile) { diff --git a/plugins/android/src/org/jetbrains/android/util/AndroidUtils.java b/plugins/android/src/org/jetbrains/android/util/AndroidUtils.java index 9bc4c6a0675a..34333f8885fc 100644 --- a/plugins/android/src/org/jetbrains/android/util/AndroidUtils.java +++ b/plugins/android/src/org/jetbrains/android/util/AndroidUtils.java @@ -113,7 +113,6 @@ public class AndroidUtils { public static final Icon RESTART_LOGCAT_ICON = IconLoader.getIcon("/icons/restartLogcat.png"); public static final String NAMESPACE_KEY = "android"; public static final String SYSTEM_RESOURCE_PACKAGE = "android"; - public static final String R_JAVA_FILENAME = "R.java"; public static final String ANDROID_PACKAGE = "android"; public static final String VIEW_CLASS_NAME = ANDROID_PACKAGE + ".view.View"; public static final String APPLICATION_CLASS_NAME = "android.app.Application"; @@ -148,7 +147,6 @@ public class AndroidUtils { public static final String PROVIDER_CLASS_NAME = "android.content.ContentProvider"; @NonNls public static final String DEFAULT_PROPERTIES_FILE_NAME = "default.properties"; @NonNls public static final String PNG_EXTENSION = "png"; - @NonNls public static final Object MANIFEST_JAVA_FILE_NAME = "Manifest.java"; private AndroidUtils() { } @@ -259,7 +257,7 @@ public class AndroidUtils { } public static boolean isRClassFile(@NotNull AndroidFacet facet, @NotNull PsiFile file) { - if (file.getName().equals(R_JAVA_FILENAME) && file instanceof PsiJavaFile) { + if (file.getName().equals(AndroidCommonUtils.R_JAVA_FILENAME) && file instanceof PsiJavaFile) { PsiJavaFile javaFile = (PsiJavaFile)file; Manifest manifest = facet.getManifest(); if (manifest == null) return false; @@ -961,20 +959,6 @@ public class AndroidUtils { return xmlFiles; } - public static String command2string(@NotNull Collection command) { - final StringBuilder builder = new StringBuilder(); - for (Iterator it = command.iterator(); it.hasNext(); ) { - String s = it.next(); - builder.append('['); - builder.append(s); - builder.append(']'); - if (it.hasNext()) { - builder.append(' '); - } - } - return builder.toString(); - } - @Nullable public static String getProjectPropertyValue(Module module, String propertyName) { final String result = getPropertyValue(module, SdkConstants.FN_PROJECT_PROPERTIES, propertyName); diff --git a/plugins/android/src/org/jetbrains/android/util/ExecutionUtil.java b/plugins/android/src/org/jetbrains/android/util/ExecutionUtil.java deleted file mode 100644 index 9c5efe24f589..000000000000 --- a/plugins/android/src/org/jetbrains/android/util/ExecutionUtil.java +++ /dev/null @@ -1,134 +0,0 @@ -/* - * Copyright 2000-2010 JetBrains s.r.o. - * - * 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. - */ -package org.jetbrains.android.util; - -import com.intellij.execution.process.OSProcessHandler; -import com.intellij.execution.process.ProcessAdapter; -import com.intellij.execution.process.ProcessEvent; -import com.intellij.execution.process.ProcessOutputTypes; -import com.intellij.openapi.application.ApplicationManager; -import com.intellij.openapi.compiler.CompilerMessageCategory; -import com.intellij.openapi.util.Key; -import com.intellij.openapi.util.text.StringUtil; -import org.jetbrains.annotations.NotNull; - -import java.io.IOException; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -/** - * Abstract external tool for compiler. - * - * @author Alexey Efimov - */ -public final class ExecutionUtil { - - private static final String IGNORING = "ignoring"; - private static final String SKIPPING = "skipping"; - - private ExecutionUtil() { - } - - // can't be invoked from dispatch thread - @NotNull - public static Map> execute(String... argv) throws IOException { - assert !ApplicationManager.getApplication().isDispatchThread(); - ProcessBuilder builder = new ProcessBuilder(argv); - ProcessResult result = readProcessOutput(builder.start()); - Map> messages = result.getMessages(); - int code = result.getExitCode(); - List errMessages = messages.get(CompilerMessageCategory.ERROR); - - if (code != 0 && errMessages.isEmpty()) { - throw new IOException(AndroidBundle.message("command.0.execution.failed.with.exit.code.1", concat(argv), code)); - } - else { - if (code == 0) { - messages.get(CompilerMessageCategory.INFORMATION).addAll(errMessages); - errMessages.clear(); - } - return messages; - } - } - - private static String concat(String... strs) { - StringBuilder builder = new StringBuilder(); - for (int i = 0, n = strs.length; i < n; i++) { - builder.append(strs[i]); - if (i < n - 1) { - builder.append(' '); - } - } - return builder.toString(); - } - - @NotNull - private static ProcessResult readProcessOutput(Process process) throws IOException { - assert !ApplicationManager.getApplication().isDispatchThread(); - OSProcessHandler handler = new OSProcessHandler(process, ""); - final List information = new ArrayList(); - final List error = new ArrayList(); - handler.addProcessListener(new ProcessAdapter() { - public void onTextAvailable(final ProcessEvent event, final Key outputType) { - String output = event.getText(); - if (StringUtil.isEmptyOrSpaces(output)) { - return; - } - String[] lines = output.split("[\\n\\r]+"); - for (String line : lines) { - String l = line.toLowerCase(); - if (outputType == ProcessOutputTypes.STDOUT) { - information.add(line); - } - else if (outputType == ProcessOutputTypes.STDERR) { - if (l.contains(IGNORING) || l.contains(SKIPPING)) { - information.add(line); - } - else { - error.add(line); - } - } - } - } - }); - handler.startNotify(); - handler.waitFor(); - int exitCode = handler.getProcess().exitValue(); - return new ProcessResult(information, error, exitCode); - } - - private static final class ProcessResult { - private final int myExitCode; - private final Map> myMessages; - - public ProcessResult(List information, List error, int exitCode) { - myExitCode = exitCode; - myMessages = new HashMap>(2); - myMessages.put(CompilerMessageCategory.INFORMATION, information); - myMessages.put(CompilerMessageCategory.ERROR, error); - } - - public Map> getMessages() { - return myMessages; - } - - public int getExitCode() { - return myExitCode; - } - } -} From e74298de112a9822ef7e685a5b3be30d42b39054 Mon Sep 17 00:00:00 2001 From: Eugene Kudelevsky Date: Tue, 7 Feb 2012 16:22:40 +0400 Subject: [PATCH 149/215] android autogeneration independent on compilation --- .../AndroidRegenerateRJavaFileAction.java | 6 +- .../compiler/AndroidAutogenerator.java | 494 ++++++++++++++++++ .../compiler/AndroidAutogeneratorMode.java | 8 + .../android/compiler/AndroidCompileUtil.java | 84 +-- .../compiler/AndroidRenderscriptCompiler.java | 12 +- .../jetbrains/android/facet/AndroidFacet.java | 31 +- .../android/facet/AndroidFacetEditorTab.java | 6 +- .../facet/AndroidResourceFilesListener.java | 32 +- 8 files changed, 564 insertions(+), 109 deletions(-) create mode 100644 plugins/android/src/org/jetbrains/android/compiler/AndroidAutogenerator.java create mode 100644 plugins/android/src/org/jetbrains/android/compiler/AndroidAutogeneratorMode.java diff --git a/plugins/android/src/org/jetbrains/android/actions/AndroidRegenerateRJavaFileAction.java b/plugins/android/src/org/jetbrains/android/actions/AndroidRegenerateRJavaFileAction.java index 43597a15b8b3..bce1ab0ace7e 100644 --- a/plugins/android/src/org/jetbrains/android/actions/AndroidRegenerateRJavaFileAction.java +++ b/plugins/android/src/org/jetbrains/android/actions/AndroidRegenerateRJavaFileAction.java @@ -26,6 +26,7 @@ import com.intellij.openapi.compiler.CompilerManager; import com.intellij.openapi.module.Module; import com.intellij.openapi.project.Project; import org.jetbrains.android.compiler.AndroidAptCompiler; +import org.jetbrains.android.compiler.AndroidAutogeneratorMode; import org.jetbrains.android.compiler.AndroidCompileUtil; import org.jetbrains.android.facet.AndroidFacet; import org.jetbrains.android.util.AndroidBundle; @@ -96,7 +97,10 @@ public class AndroidRegenerateRJavaFileAction extends AnAction { @Override public boolean execute(CompileContext context) { // todo: compatibility with background autogenerating - AndroidCompileUtil.generate(new AndroidAptCompiler(), context); + + for (Module module : modules) { + AndroidCompileUtil.generate(module, AndroidAutogeneratorMode.AAPT, context); + } return true; } }, new ModuleCompileScope(project, modules, false), AndroidBundle.message("android.compile.messages.generating.r.java.content.name"), diff --git a/plugins/android/src/org/jetbrains/android/compiler/AndroidAutogenerator.java b/plugins/android/src/org/jetbrains/android/compiler/AndroidAutogenerator.java new file mode 100644 index 000000000000..e28ae99b78a3 --- /dev/null +++ b/plugins/android/src/org/jetbrains/android/compiler/AndroidAutogenerator.java @@ -0,0 +1,494 @@ +package org.jetbrains.android.compiler; + +import com.android.AndroidConstants; +import com.android.sdklib.IAndroidTarget; +import com.intellij.compiler.impl.ModuleCompileScope; +import com.intellij.openapi.application.ApplicationManager; +import com.intellij.openapi.application.ModalityState; +import com.intellij.openapi.compiler.CompileContext; +import com.intellij.openapi.compiler.CompilerMessageCategory; +import com.intellij.openapi.diagnostic.Logger; +import com.intellij.openapi.module.Module; +import com.intellij.openapi.project.Project; +import com.intellij.openapi.util.Computable; +import com.intellij.openapi.util.io.FileUtil; +import com.intellij.openapi.vfs.LocalFileSystem; +import com.intellij.openapi.vfs.ReadonlyStatusHandler; +import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.util.ArrayUtil; +import com.intellij.util.containers.HashMap; +import com.intellij.util.containers.HashSet; +import org.jetbrains.android.compiler.tools.AndroidApt; +import org.jetbrains.android.compiler.tools.AndroidIdl; +import org.jetbrains.android.dom.manifest.Manifest; +import org.jetbrains.android.facet.AndroidFacet; +import org.jetbrains.android.facet.AndroidRootUtil; +import org.jetbrains.android.fileTypes.AndroidIdlFileType; +import org.jetbrains.android.fileTypes.AndroidRenderscriptFileType; +import org.jetbrains.android.sdk.AndroidPlatform; +import org.jetbrains.android.util.AndroidBundle; +import org.jetbrains.android.util.AndroidCommonUtils; +import org.jetbrains.android.util.AndroidUtils; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.io.File; +import java.io.IOException; +import java.util.*; + +/** + * @author Eugene.Kudelevsky + */ +public class AndroidAutogenerator { + private static final Logger LOG = Logger.getInstance("#org.jetbrains.android.compiler.AndroidAutogenerator"); + + private AndroidAutogenerator() { + } + + public static void run(@NotNull AndroidAutogeneratorMode mode, @NotNull AndroidFacet facet, @NotNull CompileContext context) { + switch (mode) { + case AAPT: + runAapt(facet, context); + break; + case AIDL: + runAidl(facet, context); + break; + case RENDERSCRIPT: + runRenderscript(facet, context); + break; + } + } + + public static void runAapt(@NotNull final AndroidFacet facet, @NotNull final CompileContext context) { + final Module module = facet.getModule(); + + final AptAutogenerationItem item = ApplicationManager.getApplication().runReadAction(new Computable() { + @Nullable + @Override + public AptAutogenerationItem compute() { + if (module.isDisposed() || module.getProject().isDisposed()) { + return null; + } + + final AndroidPlatform platform = facet.getConfiguration().getAndroidPlatform(); + if (platform == null) { + context.addMessage(CompilerMessageCategory.ERROR, + AndroidBundle.message("android.compilation.error.specify.platform", module.getName()), null, -1, -1); + return null; + } + + final IAndroidTarget target = platform.getTarget(); + final int platformToolsRevision = platform.getSdk().getPlatformToolsRevision(); + final String[] resPaths = AndroidCompileUtil.collectResourceDirs(facet, false, context); + + if (resPaths.length == 0) { + return null; + } + + final VirtualFile manifestFile = AndroidRootUtil.getManifestFileForCompiler(facet); + if (manifestFile == null) { + context.addMessage(CompilerMessageCategory.ERROR, AndroidBundle.message("android.compilation.error.manifest.not.found"), + null, -1, -1); + return null; + } + + final Manifest manifest = AndroidUtils.loadDomElement(module, manifestFile, Manifest.class); + if (manifest == null) { + context.addMessage(CompilerMessageCategory.ERROR, "Cannot parse file", manifestFile.getUrl(), -1, -1); + return null; + } + + String packageName = manifest.getPackage().getValue(); + if (packageName != null) { + packageName = packageName.trim(); + } + + if (packageName == null || packageName.length() <= 0) { + context.addMessage(CompilerMessageCategory.ERROR, AndroidBundle.message("package.not.found.error"), manifestFile.getUrl(), + -1, -1); + return null; + } + + final String sourceRootPath = facet.getAptGenSourceRootPath(); + if (sourceRootPath == null) { + context.addMessage(CompilerMessageCategory.ERROR, + AndroidBundle.message("android.compilation.error.apt.gen.not.specified", module.getName()), + null, -1, -1); + return null; + } + + final String[] libPackages = getLibPackages(module, packageName); + final Map genFilePath2Package = new HashMap(); + + final String packageDir = sourceRootPath + '/' + packageName.replace('.', '/') + '/'; + genFilePath2Package.put(packageDir + AndroidCommonUtils.MANIFEST_JAVA_FILE_NAME, packageName); + genFilePath2Package.put(packageDir + AndroidCommonUtils.R_JAVA_FILENAME, packageName); + + for (String libPackage : libPackages) { + final String libPackageDir = sourceRootPath + '/' + libPackage.replace('.', '/') + '/'; + genFilePath2Package.put(libPackageDir + AndroidCommonUtils.MANIFEST_JAVA_FILE_NAME, packageName); + genFilePath2Package.put(libPackageDir + AndroidCommonUtils.R_JAVA_FILENAME, packageName); + } + + final String manifestFileOsPath = FileUtil.toSystemDependentName(manifestFile.getPath()); + + return new AptAutogenerationItem(target, platformToolsRevision, manifestFileOsPath, packageName, sourceRootPath, resPaths, + libPackages, facet.getConfiguration().LIBRARY_PROJECT, genFilePath2Package); + } + }); + + if (item == null) { + return; + } + + final Set filesToCheck = new HashSet(); + + for (String genFilePath : item.myGenFile2package.keySet()) { + if (new File(genFilePath).exists()) { + final VirtualFile genFile = LocalFileSystem.getInstance().findFileByPath(genFilePath); + + if (genFile != null) { + filesToCheck.add(genFile); + } + } + } + + if (!ensureFilesWritable(module.getProject(), filesToCheck)) { + return; + } + + try { + final Map> messages = AndroidCompileUtil.toCompilerMessageCategoryKeys( + AndroidApt.compile(item.myTarget, item.myPlatformToolsRevision, item.myManifestFileOsPath, item.myPackage, + item.myOutputDirOsPath, item.myResDirOsPaths, item.myLibPackages, item.myLibrary)); + + AndroidCompileUtil.addMessages(context, messages); + + for (Map.Entry entry : item.myGenFile2package.entrySet()) { + final String path = entry.getKey(); + final String aPackage = entry.getValue(); + removeDuplicateClasses(module, aPackage, new File(path), item.myOutputDirOsPath); + } + + final VirtualFile genSourceRoot = LocalFileSystem.getInstance().findFileByPath(item.myOutputDirOsPath); + if (genSourceRoot != null) { + genSourceRoot.refresh(false, true); + } + } + catch (final IOException e) { + LOG.info(e); + ApplicationManager.getApplication().runReadAction(new Runnable() { + public void run() { + if (module.getProject().isDisposed()) return; + context.addMessage(CompilerMessageCategory.ERROR, "I/O error: " + e.getMessage(), null, -1, -1); + } + }); + } + } + + public static void runAidl(@NotNull final AndroidFacet facet, @NotNull final CompileContext context) { + final Module module = facet.getModule(); + final ModuleCompileScope moduleCompileScope = new ModuleCompileScope(module, false); + final VirtualFile[] files = moduleCompileScope.getFiles(AndroidIdlFileType.ourFileType, true); + final List items = new ArrayList(); + + for (final VirtualFile file : files) { + final IdlAutogenerationItem item = ApplicationManager.getApplication().runReadAction(new Computable() { + @Nullable + @Override + public IdlAutogenerationItem compute() { + if (module.isDisposed() || module.getProject().isDisposed()) { + return null; + } + + final IAndroidTarget target = facet.getConfiguration().getAndroidTarget(); + if (target == null) { + context.addMessage(CompilerMessageCategory.ERROR, + AndroidBundle.message("android.compilation.error.specify.platform", module.getName()), null, -1, -1); + return null; + } + + final String packageName = AndroidUtils.getPackageName(module, file); + if (packageName == null) { + context.addMessage(CompilerMessageCategory.ERROR, "Cannot compute package for file", file.getUrl(), -1, -1); + return null; + } + + final String sourceRootPath = facet.getAidlGenSourceRootPath(); + if (sourceRootPath == null) { + context.addMessage(CompilerMessageCategory.ERROR, + AndroidBundle.message("android.compilation.error.apt.gen.not.specified", module.getName()), null, -1, -1); + return null; + } + + final VirtualFile[] sourceRoots = AndroidPackagingCompiler.getSourceRootsForModuleAndDependencies(module, false); + final String[] sourceRootOsPaths = AndroidCompileUtil.toOsPaths(sourceRoots); + + final String outFileOsPath = FileUtil.toSystemDependentName( + sourceRootPath + '/' + packageName.replace('.', '/') + '/' + file.getNameWithoutExtension() + ".java"); + + return new IdlAutogenerationItem(file, target, outFileOsPath, sourceRootOsPaths, sourceRootPath, packageName); + } + }); + + if (item != null) { + items.add(item); + } + } + + final Set filesToCheck = new HashSet(); + + for (IdlAutogenerationItem item : items) { + if (new File(FileUtil.toSystemDependentName(item.myFile.getPath())).exists()) { + filesToCheck.add(item.myFile); + } + } + + if (!ensureFilesWritable(module.getProject(), filesToCheck)) { + return; + } + + for (IdlAutogenerationItem item : items) { + final VirtualFile file = item.myFile; + final String fileOsPath = FileUtil.toSystemDependentName(file.getPath()); + + try { + final Map> messages = AndroidCompileUtil.toCompilerMessageCategoryKeys( + AndroidIdl.execute(item.myTarget, fileOsPath, item.myOutFileOsPath, item.mySourceRootOsPaths)); + + ApplicationManager.getApplication().runReadAction(new Runnable() { + public void run() { + if (module.getProject().isDisposed()) return; + + for (CompilerMessageCategory category : messages.keySet()) { + List messageList = messages.get(category); + for (String message : messageList) { + context.addMessage(category, message, file.getUrl(), -1, -1); + } + } + } + }); + + removeDuplicateClasses(module, item.myPackage, new File(item.myOutFileOsPath), item.myOutDirOsPath); + + final VirtualFile genDir = LocalFileSystem.getInstance().findFileByPath(item.myOutDirOsPath); + if (genDir != null) { + genDir.refresh(false, true); + } + } + catch (final IOException e) { + ApplicationManager.getApplication().runReadAction(new Runnable() { + public void run() { + if (module.getProject().isDisposed()) return; + context.addMessage(CompilerMessageCategory.ERROR, e.getMessage(), file.getUrl(), -1, -1); + } + }); + } + } + } + + private static void runRenderscript(@NotNull final AndroidFacet facet, @NotNull final CompileContext context) { + final Module module = facet.getModule(); + + final ModuleCompileScope moduleCompileScope = new ModuleCompileScope(module, false); + final VirtualFile[] files = moduleCompileScope.getFiles(AndroidRenderscriptFileType.INSTANCE, true); + + for (final VirtualFile file : files) { + + final RenderscriptAutogenerationItem item = + ApplicationManager.getApplication().runReadAction(new Computable() { + @Nullable + @Override + public RenderscriptAutogenerationItem compute() { + final AndroidPlatform platform = facet.getConfiguration().getAndroidPlatform(); + if (platform == null) { + context.addMessage(CompilerMessageCategory.ERROR, + AndroidBundle.message("android.compilation.error.specify.platform", module.getName()), null, -1, -1); + return null; + } + + final IAndroidTarget target = platform.getTarget(); + final String sdkLocation = platform.getSdk().getLocation(); + + final String packageName = AndroidUtils.getPackageName(module, file); + if (packageName == null) { + context.addMessage(CompilerMessageCategory.ERROR, "Cannot compute package for file", file.getUrl(), -1, -1); + return null; + } + + final String resourceDirPath = AndroidRootUtil.getResourceDirPath(facet); + assert resourceDirPath != null; + + final String sourceRootPath = AndroidRootUtil.getRenderscriptGenSourceRootPath(module); + if (sourceRootPath == null) { + return null; + } + + final String rawDirPath = resourceDirPath + '/' + AndroidConstants.FD_RES_RAW; + + return new RenderscriptAutogenerationItem(sdkLocation, target, sourceRootPath, rawDirPath); + } + }); + + try { + final Map> messages = AndroidRenderscriptCompiler. + launchRenderscriptCompiler(module.getProject(), item.mySdkLocation, item.myTarget, file, item.myGenDirPath, item.myRawDirPath); + + ApplicationManager.getApplication().runReadAction(new Runnable() { + public void run() { + if (module.getProject().isDisposed()) { + return; + } + + for (final CompilerMessageCategory category : messages.keySet()) { + final List messageList = messages.get(category); + for (final String message : messageList) { + context.addMessage(category, message, file.getUrl(), -1, -1); + } + } + } + }); + + final VirtualFile genDir = LocalFileSystem.getInstance().findFileByPath(item.myGenDirPath); + if (genDir != null) { + genDir.refresh(false, true); + } + } + catch (final IOException e) { + ApplicationManager.getApplication().runReadAction(new Runnable() { + public void run() { + if (module.getProject().isDisposed()) return; + context.addMessage(CompilerMessageCategory.ERROR, e.getMessage(), file.getUrl(), -1, -1); + } + }); + } + } + } + + private static boolean ensureFilesWritable(@NotNull final Project project, @NotNull final Collection filesToCheck) { + if (filesToCheck.size() == 0) { + return true; + } + final boolean[] run = {false}; + + ApplicationManager.getApplication().invokeAndWait(new Runnable() { + @Override + public void run() { + ApplicationManager.getApplication().runReadAction(new Runnable() { + @Override + public void run() { + run[0] = !project.isDisposed() && + ReadonlyStatusHandler.ensureFilesWritable(project, filesToCheck.toArray(new VirtualFile[filesToCheck.size()])); + } + }); + } + }, ModalityState.defaultModalityState()); + + return run[0]; + } + + private static void removeDuplicateClasses(@NotNull final Module module, + @NotNull final String aPackage, + @NotNull final File generatedFile, + @NotNull final String sourceRootPath) { + if (generatedFile.exists()) { + ApplicationManager.getApplication().runReadAction(new Runnable() { + public void run() { + if (module.getProject().isDisposed() || module.isDisposed()) { + return; + } + String className = FileUtil.getNameWithoutExtension(generatedFile); + AndroidCompileUtil.removeDuplicatingClasses(module, aPackage, className, generatedFile, sourceRootPath); + } + }); + } + } + + @NotNull + private static String[] getLibPackages(@NotNull Module module, @NotNull String packageName) { + final Set packageSet = new HashSet(); + packageSet.add(packageName); + + final List result = new ArrayList(); + + for (String libPackage : AndroidUtils.getDepLibsPackages(module)) { + if (packageSet.add(libPackage)) { + result.add(libPackage); + } + } + + return ArrayUtil.toStringArray(result); + } + + private static class AptAutogenerationItem { + final IAndroidTarget myTarget; + final int myPlatformToolsRevision; + final String myManifestFileOsPath; + final String myPackage; + final String myOutputDirOsPath; + final String[] myResDirOsPaths; + final String[] myLibPackages; + final boolean myLibrary; + final Map myGenFile2package; + + private AptAutogenerationItem(@NotNull IAndroidTarget target, + int platformToolsRevision, + @NotNull String manifestFileOsPath, + @NotNull String aPackage, + @NotNull String outputDirOsPath, + @NotNull String[] resDirOsPaths, + @NotNull String[] libPackages, + boolean library, + @NotNull Map genFile2package) { + myTarget = target; + myPlatformToolsRevision = platformToolsRevision; + myManifestFileOsPath = manifestFileOsPath; + myPackage = aPackage; + myOutputDirOsPath = outputDirOsPath; + myResDirOsPaths = resDirOsPaths; + myLibPackages = libPackages; + myLibrary = library; + myGenFile2package = genFile2package; + } + } + + private static class IdlAutogenerationItem { + final VirtualFile myFile; + final IAndroidTarget myTarget; + final String myOutFileOsPath; + final String[] mySourceRootOsPaths; + final String myOutDirOsPath; + final String myPackage; + + private IdlAutogenerationItem(@NotNull VirtualFile file, + @NotNull IAndroidTarget target, + @NotNull String outFileOsPath, + @NotNull String[] sourceRootOsPaths, + @NotNull String outDirOsPath, + @NotNull String aPackage) { + myFile = file; + myTarget = target; + myOutFileOsPath = outFileOsPath; + mySourceRootOsPaths = sourceRootOsPaths; + myOutDirOsPath = outDirOsPath; + myPackage = aPackage; + } + } + + private static class RenderscriptAutogenerationItem { + final String mySdkLocation; + final IAndroidTarget myTarget; + final String myGenDirPath; + final String myRawDirPath; + + private RenderscriptAutogenerationItem(@NotNull String sdkLocation, + @NotNull IAndroidTarget target, + @NotNull String genDirPath, + @NotNull String rawDirPath) { + mySdkLocation = sdkLocation; + myTarget = target; + myGenDirPath = genDirPath; + myRawDirPath = rawDirPath; + } + } +} diff --git a/plugins/android/src/org/jetbrains/android/compiler/AndroidAutogeneratorMode.java b/plugins/android/src/org/jetbrains/android/compiler/AndroidAutogeneratorMode.java new file mode 100644 index 000000000000..7b8852e674a0 --- /dev/null +++ b/plugins/android/src/org/jetbrains/android/compiler/AndroidAutogeneratorMode.java @@ -0,0 +1,8 @@ +package org.jetbrains.android.compiler; + +/** + * @author Eugene.Kudelevsky + */ +public enum AndroidAutogeneratorMode { + AAPT, AIDL, RENDERSCRIPT +} diff --git a/plugins/android/src/org/jetbrains/android/compiler/AndroidCompileUtil.java b/plugins/android/src/org/jetbrains/android/compiler/AndroidCompileUtil.java index c5471799d7be..9cadbdfff611 100644 --- a/plugins/android/src/org/jetbrains/android/compiler/AndroidCompileUtil.java +++ b/plugins/android/src/org/jetbrains/android/compiler/AndroidCompileUtil.java @@ -364,35 +364,35 @@ public class AndroidCompileUtil { return contentEntry; } - public static void generate(final Module module, final GeneratingCompiler compiler, boolean withDependentModules) { + public static void generate(final Module module, final AndroidAutogeneratorMode mode, boolean withDependentModules) { if (withDependentModules) { Set modules = new HashSet(); collectModules(module, modules, ModuleManager.getInstance(module.getProject()).getModules()); for (Module module1 : modules) { - generate(module1, compiler); + generate(module1, mode); } } else { - generate(module, compiler); + generate(module, mode); } } - public static void generate(final Module module, final GeneratingCompiler compiler) { + public static void generate(final Module module, final AndroidAutogeneratorMode mode) { final AndroidFacet facet = AndroidFacet.getInstance(module); if (facet != null) { - facet.scheduleSourceRegenerating(compiler); + facet.scheduleSourceRegenerating(mode); } } - public static void doGenerate(final Module module, final GeneratingCompiler compiler) { + public static void doGenerate(final Module module, final AndroidAutogeneratorMode mode) { final Project project = module.getProject(); final AndroidProjectComponent component = ApplicationManager.getApplication().runReadAction(new Computable() { @Nullable @Override public AndroidProjectComponent compute() { return !project.isDisposed() ? project.getComponent(AndroidProjectComponent.class) : null; - } + } }); if (component == null) { return; @@ -410,7 +410,7 @@ public class AndroidCompileUtil { contextWrapper[0] = new CompileContextImpl(project, task, scope, null, false, false); } }); - generate(compiler, contextWrapper[0]); + generate(module, mode, contextWrapper[0]); } }); } @@ -419,77 +419,27 @@ public class AndroidCompileUtil { return ArrayUtil.find(context.getCompileScope().getAffectedModules(), module) >= 0; } - public static void generate(GeneratingCompiler compiler, final CompileContext context) { + public static void generate(final Module module, AndroidAutogeneratorMode mode, final CompileContext context) { if (context == null) { return; } - final Set affectedModules = new HashSet(); - Collections.addAll(affectedModules, context.getCompileScope().getAffectedModules()); + final AndroidFacet facet = AndroidFacet.getInstance(module); + if (facet == null) { + return; + } ApplicationManager.getApplication().invokeAndWait(new Runnable() { @Override public void run() { - for (Module module : affectedModules) { - if (module.isDisposed() || module.getProject().isDisposed()) { - continue; - } - - final AndroidFacet facet = AndroidFacet.getInstance(module); - if (facet != null) { - AndroidCompileUtil.createGenModulesAndSourceRoots(facet); - } + if (facet.getModule().isDisposed() || facet.getModule().getProject().isDisposed()) { + return; } + AndroidCompileUtil.createGenModulesAndSourceRoots(facet); } }, ModalityState.defaultModalityState()); - List itemsToGenerate = new ArrayList(); - for (GeneratingCompiler.GenerationItem item : compiler.getGenerationItems(context)) { - if (affectedModules.contains(item.getModule())) { - itemsToGenerate.add(item); - } - } - - GeneratingCompiler.GenerationItem[] items = itemsToGenerate.toArray(new GeneratingCompiler.GenerationItem[itemsToGenerate.size()]); - - final boolean[] run = {true}; - final VirtualFile[] files = getFilesToCheckReadonlyStatus(items); - if (files.length > 0) { - ApplicationManager.getApplication().invokeAndWait(new Runnable() { - @Override - public void run() { - ApplicationManager.getApplication().runReadAction(new Runnable() { - @Override - public void run() { - final Project project = context.getProject(); - run[0] = !project.isDisposed() && ReadonlyStatusHandler.ensureFilesWritable(project, files); - } - }); - } - }, ModalityState.defaultModalityState()); - } - - if (run[0]) { - compiler.generate(context, items, null); - } - } - - private static VirtualFile[] getFilesToCheckReadonlyStatus(GeneratingCompiler.GenerationItem[] items) { - List filesToCheck = new ArrayList(); - for (GeneratingCompiler.GenerationItem item : items) { - if (item instanceof AndroidAptCompiler.AptGenerationItem) { - final Set generatedFiles = ((AndroidAptCompiler.AptGenerationItem)item).getGeneratedFiles().keySet(); - for (File generatedFile : generatedFiles) { - if (generatedFile.exists()) { - VirtualFile generatedVFile = LocalFileSystem.getInstance().findFileByIoFile(generatedFile); - if (generatedVFile != null) { - filesToCheck.add(generatedVFile); - } - } - } - } - } - return VfsUtil.toVirtualFileArray(filesToCheck); + AndroidAutogenerator.run(mode, facet, context); } private static void collectModules(Module module, Set result, Module[] allModules) { diff --git a/plugins/android/src/org/jetbrains/android/compiler/AndroidRenderscriptCompiler.java b/plugins/android/src/org/jetbrains/android/compiler/AndroidRenderscriptCompiler.java index 6b16f6aaf1d6..553cebfba03c 100644 --- a/plugins/android/src/org/jetbrains/android/compiler/AndroidRenderscriptCompiler.java +++ b/plugins/android/src/org/jetbrains/android/compiler/AndroidRenderscriptCompiler.java @@ -227,12 +227,12 @@ public class AndroidRenderscriptCompiler implements SourceGeneratingCompiler { } } - private static Map> launchRenderscriptCompiler(@NotNull Project project, - @NotNull final String sdkLocation, - @NotNull IAndroidTarget target, - @NotNull final VirtualFile sourceFile, - @NotNull final String genFolderPath, - @NotNull final String rawDirPath) + static Map> launchRenderscriptCompiler(@NotNull Project project, + @NotNull final String sdkLocation, + @NotNull IAndroidTarget target, + @NotNull final VirtualFile sourceFile, + @NotNull final String genFolderPath, + @NotNull final String rawDirPath) throws IOException { final List command = new ArrayList(); command.add( diff --git a/plugins/android/src/org/jetbrains/android/facet/AndroidFacet.java b/plugins/android/src/org/jetbrains/android/facet/AndroidFacet.java index 6e918c914c17..619b93362d78 100644 --- a/plugins/android/src/org/jetbrains/android/facet/AndroidFacet.java +++ b/plugins/android/src/org/jetbrains/android/facet/AndroidFacet.java @@ -37,7 +37,6 @@ import com.intellij.facet.FacetTypeRegistry; import com.intellij.lang.properties.IProperty; import com.intellij.lang.properties.psi.PropertiesFile; import com.intellij.openapi.application.ApplicationManager; -import com.intellij.openapi.compiler.GeneratingCompiler; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.module.Module; import com.intellij.openapi.module.ModuleUtil; @@ -73,10 +72,7 @@ import com.intellij.util.ui.update.MergingUpdateQueue; import com.intellij.util.ui.update.Update; import com.intellij.util.xml.ConvertContext; import com.intellij.util.xml.DomElement; -import org.jetbrains.android.compiler.AndroidAptCompiler; -import org.jetbrains.android.compiler.AndroidCompileUtil; -import org.jetbrains.android.compiler.AndroidIdlCompiler; -import org.jetbrains.android.compiler.AndroidRenderscriptCompiler; +import org.jetbrains.android.compiler.*; import org.jetbrains.android.dom.manifest.Manifest; import org.jetbrains.android.importDependencies.ImportDependenciesUtil; import org.jetbrains.android.resourceManagers.LocalResourceManager; @@ -112,17 +108,18 @@ public class AndroidFacet extends Facet { private final Map> myClassMaps = new HashMap>(); private final Object myClassMapLock = new Object(); - - private final Map, MergingUpdateQueue> mySourcesAutogeneratingQueueMap = new HashMap, MergingUpdateQueue>(); + + private final Map mySourcesAutogeneratingQueueMap = + new HashMap(); public AndroidFacet(@NotNull Module module, String name, @NotNull AndroidFacetConfiguration configuration) { super(getFacetType(), module, name, configuration, null); configuration.setFacet(this); - mySourcesAutogeneratingQueueMap.put(AndroidAptCompiler.class, createSourceGeneratingQueue("AndroidAptAutogeneratingQueue")); - mySourcesAutogeneratingQueueMap.put(AndroidIdlCompiler.class, createSourceGeneratingQueue("AndroidIdlAutogeneratingQueue")); + mySourcesAutogeneratingQueueMap.put(AndroidAutogeneratorMode.AAPT, createSourceGeneratingQueue("AndroidAptAutogeneratingQueue")); + mySourcesAutogeneratingQueueMap.put(AndroidAutogeneratorMode.AIDL, createSourceGeneratingQueue("AndroidIdlAutogeneratingQueue")); mySourcesAutogeneratingQueueMap - .put(AndroidRenderscriptCompiler.class, createSourceGeneratingQueue("AndroidRenderscriptAutogeneratingQueue")); + .put(AndroidAutogeneratorMode.RENDERSCRIPT, createSourceGeneratingQueue("AndroidRenderscriptAutogeneratingQueue")); } private MergingUpdateQueue createSourceGeneratingQueue(@NotNull String name) { @@ -385,12 +382,12 @@ public class AndroidFacet extends Facet { myListener.setResourceSet(resourceSet); if (getConfiguration().REGENERATE_R_JAVA && AndroidAptCompiler.isToCompileModule(module, getConfiguration())) { - AndroidCompileUtil.generate(module, new AndroidAptCompiler()); + AndroidCompileUtil.generate(module, AndroidAutogeneratorMode.AAPT); } if (getConfiguration().REGENERATE_JAVA_BY_AIDL) { - AndroidCompileUtil.generate(module, new AndroidIdlCompiler(project)); + AndroidCompileUtil.generate(module, AndroidAutogeneratorMode.AIDL); } - AndroidCompileUtil.generate(module, new AndroidRenderscriptCompiler()); + AndroidCompileUtil.generate(module, AndroidAutogeneratorMode.RENDERSCRIPT); activateSourceAutogenerating(); } @@ -774,17 +771,17 @@ public class AndroidFacet extends Facet { return moduleDirPath != null ? FileUtil.toSystemDependentName(moduleDirPath + path) : null; } - public void scheduleSourceRegenerating(@NotNull final GeneratingCompiler compiler) { - final MergingUpdateQueue queue = mySourcesAutogeneratingQueueMap.get(compiler.getClass()); + public void scheduleSourceRegenerating(@NotNull final AndroidAutogeneratorMode mode) { + final MergingUpdateQueue queue = mySourcesAutogeneratingQueueMap.get(mode); if (queue == null) { - LOG.error("Autogenerating is not supported for compiler " + compiler.getClass().getCanonicalName()); + LOG.error("Autogenerating is not supported for mode " + mode); } else { queue.queue(new Update(this) { @Override public void run() { - AndroidCompileUtil.doGenerate(getModule(), compiler); + AndroidCompileUtil.doGenerate(getModule(), mode); } }); } diff --git a/plugins/android/src/org/jetbrains/android/facet/AndroidFacetEditorTab.java b/plugins/android/src/org/jetbrains/android/facet/AndroidFacetEditorTab.java index 26cf05e4d4c8..9799c579ca92 100644 --- a/plugins/android/src/org/jetbrains/android/facet/AndroidFacetEditorTab.java +++ b/plugins/android/src/org/jetbrains/android/facet/AndroidFacetEditorTab.java @@ -37,8 +37,8 @@ import com.intellij.ui.components.JBLabel; import com.intellij.util.ArrayUtil; import com.intellij.util.ui.UIUtil; import org.jetbrains.android.compiler.AndroidAptCompiler; +import org.jetbrains.android.compiler.AndroidAutogeneratorMode; import org.jetbrains.android.compiler.AndroidCompileUtil; -import org.jetbrains.android.compiler.AndroidIdlCompiler; import org.jetbrains.android.maven.AndroidMavenProvider; import org.jetbrains.android.maven.AndroidMavenUtil; import org.jetbrains.android.util.AndroidBundle; @@ -437,10 +437,10 @@ public class AndroidFacetEditorTab extends FacetEditorTab { final Project project = module.getProject(); if (runApt) { - AndroidCompileUtil.generate(module, new AndroidAptCompiler(), true); + AndroidCompileUtil.generate(module, AndroidAutogeneratorMode.AAPT, true); } if (runIdl) { - AndroidCompileUtil.generate(module, new AndroidIdlCompiler(project)); + AndroidCompileUtil.generate(module, AndroidAutogeneratorMode.AIDL); } } } diff --git a/plugins/android/src/org/jetbrains/android/facet/AndroidResourceFilesListener.java b/plugins/android/src/org/jetbrains/android/facet/AndroidResourceFilesListener.java index e422429d59a3..49d095aedcb9 100644 --- a/plugins/android/src/org/jetbrains/android/facet/AndroidResourceFilesListener.java +++ b/plugins/android/src/org/jetbrains/android/facet/AndroidResourceFilesListener.java @@ -18,7 +18,6 @@ package org.jetbrains.android.facet; import com.android.resources.ResourceFolderType; import com.intellij.openapi.application.ApplicationManager; -import com.intellij.openapi.compiler.GeneratingCompiler; import com.intellij.openapi.module.Module; import com.intellij.openapi.module.ModuleUtil; import com.intellij.openapi.project.DumbService; @@ -28,7 +27,9 @@ import com.intellij.openapi.vfs.*; import com.intellij.util.containers.HashSet; import com.intellij.util.ui.update.MergingUpdateQueue; import com.intellij.util.ui.update.Update; -import org.jetbrains.android.compiler.*; +import org.jetbrains.android.compiler.AndroidAptCompiler; +import org.jetbrains.android.compiler.AndroidAutogeneratorMode; +import org.jetbrains.android.compiler.AndroidCompileUtil; import org.jetbrains.android.dom.manifest.Manifest; import org.jetbrains.android.fileTypes.AndroidIdlFileType; import org.jetbrains.android.fileTypes.AndroidRenderscriptFileType; @@ -146,18 +147,19 @@ class AndroidResourceFilesListener extends VirtualFileAdapter { return; } - final GeneratingCompiler compilerToRun = ApplicationManager.getApplication().runReadAction(new Computable() { - @Nullable - public GeneratingCompiler compute() { - return computeCompilerToRunAndInvalidateLocalAttributesMap(); - } - }); + final AndroidAutogeneratorMode autogenerationMode = + ApplicationManager.getApplication().runReadAction(new Computable() { + @Nullable + public AndroidAutogeneratorMode compute() { + return computeCompilerToRunAndInvalidateLocalAttributesMap(); + } + }); - if (compilerToRun == null) { + if (autogenerationMode == null) { return; } - if (compilerToRun instanceof AndroidAptCompiler && + if (autogenerationMode == AndroidAutogeneratorMode.AAPT && AndroidRootUtil.getManifestFile(myFacet.getModule()) != myEvent.getFile()) { final HashSet resourceSet = new HashSet(); @@ -173,11 +175,11 @@ class AndroidResourceFilesListener extends VirtualFileAdapter { myResourceSet = resourceSet; } } - AndroidCompileUtil.generate(myFacet.getModule(), compilerToRun, true); + AndroidCompileUtil.generate(myFacet.getModule(), autogenerationMode, true); } @Nullable - private GeneratingCompiler computeCompilerToRunAndInvalidateLocalAttributesMap() { + private AndroidAutogeneratorMode computeCompilerToRunAndInvalidateLocalAttributesMap() { if (myFacet.isDisposed()) { return null; } @@ -219,20 +221,20 @@ class AndroidResourceFilesListener extends VirtualFileAdapter { AndroidCompileUtil.removeDuplicatingClasses(myModule, myCachedPackage, AndroidUtils.R_CLASS_NAME, null, aptGenDirPath); } myCachedPackage = aPackage; - return new AndroidAptCompiler(); + return AndroidAutogeneratorMode.AAPT; } if (myFacet.getConfiguration().REGENERATE_JAVA_BY_AIDL && file.getFileType() == AndroidIdlFileType.ourFileType) { VirtualFile sourceRoot = findSourceRoot(myModule, file); if (sourceRoot != null && AndroidRootUtil.getAidlGenDir(module, myFacet) != sourceRoot) { - return new AndroidIdlCompiler(project); + return AndroidAutogeneratorMode.AIDL; } } if (file.getFileType() == AndroidRenderscriptFileType.INSTANCE) { final VirtualFile sourceRoot = findSourceRoot(myModule, file); if (sourceRoot != null && AndroidRootUtil.getRenderscriptGenDir(myModule) != sourceRoot) { - return new AndroidRenderscriptCompiler(); + return AndroidAutogeneratorMode.RENDERSCRIPT; } } return null; From ef174126cdc2957b29978308c22012ba017d5d57 Mon Sep 17 00:00:00 2001 From: Eugene Kudelevsky Date: Tue, 7 Feb 2012 18:46:24 +0400 Subject: [PATCH 150/215] android: compilers now generate sources outside the project --- .../android/compiler/AndroidAptCompiler.java | 100 +------- .../android/compiler/AndroidCompileUtil.java | 39 ++- .../android/compiler/AndroidIdlCompiler.java | 66 +----- .../compiler/AndroidPrecompileTask.java | 42 +--- .../compiler/AndroidRenderscriptCompiler.java | 223 +++++++++--------- 5 files changed, 171 insertions(+), 299 deletions(-) diff --git a/plugins/android/src/org/jetbrains/android/compiler/AndroidAptCompiler.java b/plugins/android/src/org/jetbrains/android/compiler/AndroidAptCompiler.java index 2d56bf86d2e9..a2f70b19129c 100644 --- a/plugins/android/src/org/jetbrains/android/compiler/AndroidAptCompiler.java +++ b/plugins/android/src/org/jetbrains/android/compiler/AndroidAptCompiler.java @@ -17,20 +17,16 @@ package org.jetbrains.android.compiler; import com.android.sdklib.IAndroidTarget; import com.android.sdklib.SdkConstants; -import com.intellij.compiler.impl.CompilerUtil; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.compiler.*; -import com.intellij.openapi.compiler.ex.CompileContextEx; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.module.Module; import com.intellij.openapi.module.ModuleManager; import com.intellij.openapi.util.Comparing; import com.intellij.openapi.util.Computable; import com.intellij.openapi.util.io.FileUtil; -import com.intellij.openapi.vfs.LocalFileSystem; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.util.ArrayUtil; -import com.intellij.util.containers.HashMap; import com.intellij.util.containers.HashSet; import org.jetbrains.android.compiler.tools.AndroidApt; import org.jetbrains.android.dom.manifest.Manifest; @@ -47,7 +43,6 @@ import org.jetbrains.annotations.Nullable; import java.io.DataInput; import java.io.DataOutput; -import java.io.File; import java.io.IOException; import java.util.*; @@ -80,37 +75,15 @@ public class AndroidAptCompiler implements SourceGeneratingCompiler { public GenerationItem[] generate(final CompileContext context, final GenerationItem[] items, VirtualFile outputRootDirectory) { if (items != null && items.length > 0) { context.getProgressIndicator().setText(AndroidBundle.message("android.compile.messages.generating.r.java")); - Computable computation = new Computable() { - public GenerationItem[] compute() { - if (context.getProject().isDisposed()) { - return EMPTY_GENERATION_ITEM_ARRAY; - } - return doGenerate(context, items); - } - }; - GenerationItem[] generationItems = computation.compute(); - List generatedVFiles = new ArrayList(); - for (GenerationItem item : generationItems) { - final Set generatedFiles = ((AptGenerationItem)item).myGeneratedFile2Package.keySet(); - for (File generatedFile : generatedFiles) { - CompilerUtil.refreshIOFile(generatedFile); - CompilerUtil.refreshIOFile(generatedFile.getParentFile()); - VirtualFile generatedVFile = LocalFileSystem.getInstance().findFileByIoFile(generatedFile); - if (generatedVFile != null) { - generatedVFiles.add(generatedVFile); - } - } + if (!context.getProject().isDisposed()) { + return doGenerate(context, items, outputRootDirectory); } - if (context instanceof CompileContextEx) { - ((CompileContextEx)context).markGenerated(generatedVFiles); - } - return generationItems; } return EMPTY_GENERATION_ITEM_ARRAY; } - private static GenerationItem[] doGenerate(final CompileContext context, GenerationItem[] items) { + private static GenerationItem[] doGenerate(final CompileContext context, GenerationItem[] items, VirtualFile outputRootDirectory) { List results = new ArrayList(items.length); for (GenerationItem item : items) { if (item instanceof AptGenerationItem) { @@ -120,34 +93,19 @@ public class AndroidAptCompiler implements SourceGeneratingCompiler { continue; } + final String outputDirOsPath = FileUtil.toSystemDependentName(outputRootDirectory.getPath()); + try { Map> messages = AndroidCompileUtil.toCompilerMessageCategoryKeys( AndroidApt.compile(aptItem.myAndroidTarget, aptItem.myPlatformToolsRevision, aptItem.myManifestFile.getPath(), aptItem.myPackage, - aptItem.mySourceRootPath, aptItem.myResourcesPaths, + outputDirOsPath, aptItem.myResourcesPaths, aptItem.myLibraryPackages, aptItem.myIsLibrary)); AndroidCompileUtil.addMessages(context, messages); if (messages.get(CompilerMessageCategory.ERROR).isEmpty()) { results.add(aptItem); } - for (Map.Entry entry : aptItem.myGeneratedFile2Package.entrySet()) { - final File generatedFile = entry.getKey(); - final String aPackage = entry.getValue(); - - if (generatedFile.exists()) { - ApplicationManager.getApplication().runReadAction(new Runnable() { - public void run() { - if (context.getProject().isDisposed() || aptItem.myModule.isDisposed()) { - return; - } - String className = FileUtil.getNameWithoutExtension(generatedFile); - AndroidCompileUtil.removeDuplicatingClasses(aptItem.myModule, aPackage, className, - generatedFile, aptItem.mySourceRootPath); - } - }); - } - } } catch (final IOException e) { LOG.info(e); @@ -187,22 +145,17 @@ public class AndroidAptCompiler implements SourceGeneratingCompiler { final Module myModule; final VirtualFile myManifestFile; final String[] myResourcesPaths; - final String mySourceRootPath; final IAndroidTarget myAndroidTarget; - final Map myGeneratedFile2Package; - final String myPackage; final String[] myLibraryPackages; final boolean myIsLibrary; - private final Set myNonExistingFiles; final int myPlatformToolsRevision; private AptGenerationItem(@NotNull Module module, @NotNull VirtualFile manifestFile, @NotNull String[] resourcesPaths, - @NotNull String sourceRootPath, @NotNull IAndroidTarget target, int platformToolsRevision, @NotNull String aPackage, @@ -211,48 +164,11 @@ public class AndroidAptCompiler implements SourceGeneratingCompiler { myModule = module; myManifestFile = manifestFile; myResourcesPaths = resourcesPaths; - mySourceRootPath = sourceRootPath; myAndroidTarget = target; myPackage = aPackage; myLibraryPackages = libPackages; myIsLibrary = isLibrary; myPlatformToolsRevision = platformToolsRevision; - - myGeneratedFile2Package = new HashMap(); - - myGeneratedFile2Package - .put(new File(sourceRootPath, aPackage.replace('.', File.separatorChar) + File.separator + AndroidCommonUtils.R_JAVA_FILENAME), - aPackage); - - for (String libPackage : myLibraryPackages) { - myGeneratedFile2Package.put( - new File(sourceRootPath, libPackage.replace('.', File.separatorChar) + File.separator + AndroidCommonUtils.R_JAVA_FILENAME), - libPackage); - } - - myNonExistingFiles = new HashSet(); - - // We need to check only R.java files, not Manifest.java files, so add Manifest files LATER - for (File generatedFile : myGeneratedFile2Package.keySet()) { - if (!generatedFile.exists()) { - myNonExistingFiles.add(FileUtil.toSystemIndependentName(generatedFile.getPath())); - } - } - - myGeneratedFile2Package.put( - new File(sourceRootPath, aPackage.replace('.', File.separatorChar) + File.separator + AndroidCommonUtils.MANIFEST_JAVA_FILE_NAME), - aPackage); - - for (String libraryPackage : myLibraryPackages) { - myGeneratedFile2Package.put(new File(sourceRootPath, libraryPackage.replace('.', File.separatorChar) + - File.separator + - AndroidCommonUtils.MANIFEST_JAVA_FILE_NAME), libraryPackage); - } - } - - @NotNull - public Map getGeneratedFiles() { - return myGeneratedFile2Package; } public String getPath() { @@ -260,7 +176,7 @@ public class AndroidAptCompiler implements SourceGeneratingCompiler { } public ValidityState getValidityState() { - return new MyValidityState(myModule, myNonExistingFiles, myPlatformToolsRevision); + return new MyValidityState(myModule, Collections.emptySet(), myPlatformToolsRevision); } public Module getModule() { @@ -345,7 +261,7 @@ public class AndroidAptCompiler implements SourceGeneratingCompiler { final String[] libPackages = getLibPackages(module, packageName); - items.add(new AptGenerationItem(module, manifestFile, resPaths, sourceRootPath, target, platformToolsRevision, + items.add(new AptGenerationItem(module, manifestFile, resPaths, target, platformToolsRevision, packageName, libPackages, facet.getConfiguration().LIBRARY_PROJECT)); } } diff --git a/plugins/android/src/org/jetbrains/android/compiler/AndroidCompileUtil.java b/plugins/android/src/org/jetbrains/android/compiler/AndroidCompileUtil.java index 9cadbdfff611..88a51f5c8cf4 100644 --- a/plugins/android/src/org/jetbrains/android/compiler/AndroidCompileUtil.java +++ b/plugins/android/src/org/jetbrains/android/compiler/AndroidCompileUtil.java @@ -17,6 +17,8 @@ package org.jetbrains.android.compiler; import com.android.resources.ResourceType; import com.intellij.CommonBundle; +import com.intellij.compiler.CompilerConfiguration; +import com.intellij.compiler.CompilerConfigurationImpl; import com.intellij.compiler.impl.CompileContextImpl; import com.intellij.compiler.impl.ModuleCompileScope; import com.intellij.compiler.options.CompileStepBeforeRun; @@ -27,6 +29,8 @@ import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.application.ModalityState; import com.intellij.openapi.compiler.*; import com.intellij.openapi.compiler.Compiler; +import com.intellij.openapi.compiler.options.ExcludeEntryDescription; +import com.intellij.openapi.compiler.options.ExcludedEntriesConfiguration; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.extensions.Extensions; import com.intellij.openapi.module.Module; @@ -285,17 +289,40 @@ public class AndroidCompileUtil { if (root != null) { final ModuleRootManager manager = ModuleRootManager.getInstance(module); unexcludeRootIfNeccessary(root, manager); + + boolean markedAsSource = false; + for (VirtualFile existingRoot : manager.getSourceRoots()) { - if (existingRoot == root) return; - } - ApplicationManager.getApplication().runWriteAction(new Runnable() { - public void run() { - addSourceRoot(manager, root); + if (existingRoot == root) { + markedAsSource = true; } - }); + } + + if (!markedAsSource) { + ApplicationManager.getApplication().runWriteAction(new Runnable() { + public void run() { + addSourceRoot(manager, root); + } + }); + } + + excludeFromCompilation(project, root); } } + private static void excludeFromCompilation(@NotNull Project project, @NotNull VirtualFile dir) { + final ExcludedEntriesConfiguration configuration = + ((CompilerConfigurationImpl)CompilerConfiguration.getInstance(project)).getExcludedEntriesConfiguration(); + + for (ExcludeEntryDescription description : configuration.getExcludeEntryDescriptions()) { + if (description.getVirtualFile() == dir) { + return; + } + } + + configuration.addExcludeEntryDescription(new ExcludeEntryDescription(dir, true, false, project)); + } + private static void removeGenModule(@NotNull final Module libModule) { final String genModuleName = getGenModuleName(libModule); final ModuleManager moduleManager = ModuleManager.getInstance(libModule.getProject()); diff --git a/plugins/android/src/org/jetbrains/android/compiler/AndroidIdlCompiler.java b/plugins/android/src/org/jetbrains/android/compiler/AndroidIdlCompiler.java index 8897732c4985..0c74c8766383 100644 --- a/plugins/android/src/org/jetbrains/android/compiler/AndroidIdlCompiler.java +++ b/plugins/android/src/org/jetbrains/android/compiler/AndroidIdlCompiler.java @@ -17,18 +17,15 @@ package org.jetbrains.android.compiler; import com.android.sdklib.IAndroidTarget; import com.android.sdklib.SdkConstants; -import com.intellij.compiler.impl.CompilerUtil; import com.intellij.facet.FacetManager; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.compiler.*; -import com.intellij.openapi.compiler.ex.CompileContextEx; import com.intellij.openapi.module.Module; import com.intellij.openapi.project.Project; import com.intellij.openapi.roots.ProjectFileIndex; import com.intellij.openapi.roots.ProjectRootManager; import com.intellij.openapi.util.Computable; import com.intellij.openapi.util.io.FileUtil; -import com.intellij.openapi.vfs.LocalFileSystem; import com.intellij.openapi.vfs.VirtualFile; import org.jetbrains.android.compiler.tools.AndroidIdl; import org.jetbrains.android.facet.AndroidFacet; @@ -39,7 +36,6 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.io.DataInput; -import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.List; @@ -59,6 +55,7 @@ public class AndroidIdlCompiler implements SourceGeneratingCompiler { myProject = project; } + @Nullable @Override public VirtualFile getPresentableFile(CompileContext context, Module module, VirtualFile outputRoot, VirtualFile generatedFile) { return null; @@ -71,23 +68,7 @@ public class AndroidIdlCompiler implements SourceGeneratingCompiler { public GenerationItem[] generate(CompileContext context, GenerationItem[] items, VirtualFile outputRootDirectory) { if (items != null && items.length > 0) { context.getProgressIndicator().setText("Generating AIDL files..."); - //Application application = ApplicationManager.getApplication(); - GenerationItem[] generationItems = /*application.runReadAction(new GenerateAction(context, items))*/ doGenerate(context, items); - List generatedVFiles = new ArrayList(); - for (GenerationItem item : generationItems) { - File generatedFile = ((IdlGenerationItem)item).myGeneratedFile; - if (generatedFile != null) { - CompilerUtil.refreshIOFile(generatedFile); - VirtualFile generatedVFile = LocalFileSystem.getInstance().findFileByIoFile(generatedFile); - if (generatedVFile != null) { - generatedVFiles.add(generatedVFile); - } - } - } - if (context instanceof CompileContextEx) { - ((CompileContextEx)context).markGenerated(generatedVFiles); - } - return generationItems; + return doGenerate(context, items, outputRootDirectory); } return EMPTY_GENERATION_ITEM_ARRAY; } @@ -103,7 +84,7 @@ public class AndroidIdlCompiler implements SourceGeneratingCompiler { @Nullable public ValidityState createValidityState(DataInput is) throws IOException { - return null; + return TimestampValidityState.load(is); } private final static class IdlGenerationItem implements GenerationItem { @@ -111,13 +92,10 @@ public class AndroidIdlCompiler implements SourceGeneratingCompiler { final VirtualFile myFile; final boolean myTestSource; final IAndroidTarget myAndroidTarget; - final File myGeneratedFile; final String myPackageName; - final String mySourceRootPath; public IdlGenerationItem(@NotNull Module module, @NotNull VirtualFile file, - @NotNull String sourceRootPath, boolean testSource, @NotNull IAndroidTarget androidTarget, @NotNull String packageName) { @@ -126,19 +104,16 @@ public class AndroidIdlCompiler implements SourceGeneratingCompiler { myTestSource = testSource; myAndroidTarget = androidTarget; myPackageName = packageName; - mySourceRootPath = sourceRootPath; - myGeneratedFile = - new File(sourceRootPath, packageName.replace('.', File.separatorChar) + File.separator + file.getNameWithoutExtension() + ".java"); } @Nullable public String getPath() { - return null; + return myPackageName.replace('.', '/') + '/' + myFile.getNameWithoutExtension() + ".java"; } @Nullable public ValidityState getValidityState() { - return null; + return new TimestampValidityState(myFile.getTimeStamp()); } public Module getModule() { @@ -198,21 +173,11 @@ public class AndroidIdlCompiler implements SourceGeneratingCompiler { return; } ProjectFileIndex fileIndex = ProjectRootManager.getInstance(myProject).getFileIndex(); - IdlGenerationItem generationItem = - new IdlGenerationItem(module, file, sourceRootPath, fileIndex.isInTestSourceContent(file), target, packageName); - if (myContext.isMake()) { - File generatedFile = generationItem.myGeneratedFile; - if (generatedFile == null || !generatedFile.exists() || generatedFile.lastModified() <= file.getModificationCount()) { - items.add(generationItem); - } - } - else { - items.add(generationItem); - } + items.add(new IdlGenerationItem(module, file, fileIndex.isInTestSourceContent(file), target, packageName)); } } - private static GenerationItem[] doGenerate(final CompileContext context, GenerationItem[] items) { + private static GenerationItem[] doGenerate(final CompileContext context, GenerationItem[] items, VirtualFile outputRootDirectory) { if (context.getProject().isDisposed()) { return EMPTY_GENERATION_ITEM_ARRAY; } @@ -229,8 +194,12 @@ public class AndroidIdlCompiler implements SourceGeneratingCompiler { VirtualFile[] sourceRoots = AndroidPackagingCompiler.getSourceRootsForModuleAndDependencies(idlItem.myModule, false); final String[] sourceRootPaths = AndroidCompileUtil.toOsPaths(sourceRoots); + final String outFilePath = FileUtil.toSystemDependentName( + outputRootDirectory.getPath() + '/' + idlItem.myPackageName.replace('.', '/') + '/' + + idlItem.myFile.getNameWithoutExtension() + ".java"); + final Map> messages = AndroidCompileUtil.toCompilerMessageCategoryKeys( - AndroidIdl.execute(idlItem.myAndroidTarget, idlItem.myFile.getPath(), idlItem.myGeneratedFile.getPath(), sourceRootPaths)); + AndroidIdl.execute(idlItem.myAndroidTarget, idlItem.myFile.getPath(), outFilePath, sourceRootPaths)); ApplicationManager.getApplication().runReadAction(new Runnable() { public void run() { @@ -241,17 +210,6 @@ public class AndroidIdlCompiler implements SourceGeneratingCompiler { if (messages.get(CompilerMessageCategory.ERROR).isEmpty()) { results.add(idlItem); } - if (idlItem.myGeneratedFile.exists()) { - ApplicationManager.getApplication().runReadAction(new Runnable() { - public void run() { - if (idlItem.myModule.getProject().isDisposed()) return; - String className = FileUtil.getNameWithoutExtension(idlItem.myGeneratedFile); - AndroidCompileUtil.removeDuplicatingClasses(idlItem.myModule, idlItem.myPackageName, className, - idlItem.myGeneratedFile.exists() ? idlItem.myGeneratedFile : null, - idlItem.mySourceRootPath); - } - }); - } } catch (final IOException e) { ApplicationManager.getApplication().runReadAction(new Runnable() { diff --git a/plugins/android/src/org/jetbrains/android/compiler/AndroidPrecompileTask.java b/plugins/android/src/org/jetbrains/android/compiler/AndroidPrecompileTask.java index f8355f3b7b68..2201045a0502 100644 --- a/plugins/android/src/org/jetbrains/android/compiler/AndroidPrecompileTask.java +++ b/plugins/android/src/org/jetbrains/android/compiler/AndroidPrecompileTask.java @@ -19,7 +19,10 @@ import com.intellij.compiler.CompilerConfiguration; import com.intellij.compiler.CompilerConfigurationImpl; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.application.ModalityState; -import com.intellij.openapi.compiler.*; +import com.intellij.openapi.compiler.CompilationStatusAdapter; +import com.intellij.openapi.compiler.CompileContext; +import com.intellij.openapi.compiler.CompileTask; +import com.intellij.openapi.compiler.CompilerManager; import com.intellij.openapi.compiler.options.ExcludeEntryDescription; import com.intellij.openapi.compiler.options.ExcludedEntriesConfiguration; import com.intellij.openapi.diagnostic.Logger; @@ -30,16 +33,12 @@ import com.intellij.openapi.progress.ProgressManager; import com.intellij.openapi.project.Project; import com.intellij.openapi.roots.ModuleRootManager; import com.intellij.openapi.util.io.FileUtil; -import com.intellij.openapi.util.text.StringUtil; -import com.intellij.openapi.vfs.LocalFileSystem; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.util.containers.hash.HashSet; import org.jetbrains.android.AndroidProjectComponent; import org.jetbrains.android.facet.AndroidFacet; -import org.jetbrains.android.facet.AndroidRootUtil; import org.jetbrains.android.sdk.AndroidPlatform; import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; import java.io.File; import java.util.Arrays; @@ -85,7 +84,7 @@ public class AndroidPrecompileTask implements CompileTask { }, indicator != null ? indicator.getModalityState() : ModalityState.NON_MODAL); if (context.isRebuild()) { - clearGenRootsAndResCache(facet, context); + clearResCache(facet, context); } final AndroidPlatform platform = facet.getConfiguration().getAndroidPlatform(); @@ -124,12 +123,8 @@ public class AndroidPrecompileTask implements CompileTask { return true; } - private static void clearGenRootsAndResCache(@NotNull AndroidFacet facet, @NotNull CompileContext context) { + private static void clearResCache(@NotNull AndroidFacet facet, @NotNull CompileContext context) { final Module module = facet.getModule(); - - removeAllPackages(AndroidRootUtil.getRenderscriptGenSourceRootPath(module), context); - removeAllPackages(facet.getAptGenSourceRootPath(), context); - removeAllPackages(facet.getAidlGenSourceRootPath(), context); final String dirPath = AndroidCompileUtil.findResourcesCacheDirectory(module, false, null); if (dirPath != null) { @@ -139,32 +134,7 @@ public class AndroidPrecompileTask implements CompileTask { } } } - - private static void removeAllPackages(@Nullable String sourceRootPath, @NotNull CompileContext context) { - final File sourceRoot = new File(sourceRootPath); - final File[] children = sourceRoot.listFiles(); - - if (children != null) { - for (File child : children) { - if (child.isDirectory() && - child.getName() != null && - StringUtil.isJavaIdentifier(child.getName())) { - - if (!FileUtil.delete(child)) { - context.addMessage(CompilerMessageCategory.ERROR, "Cannot delete file " + child.getAbsolutePath(), - null, -1, -1); - } - } - } - } - final VirtualFile vFile = LocalFileSystem.getInstance().refreshAndFindFileByIoFile(sourceRoot); - - if (vFile != null) { - vFile.refresh(false, true); - } - } - private static void unexcludeAllSourceRoots(Module module, ExcludedEntriesConfiguration configuration) { final VirtualFile[] sourceRoots = ModuleRootManager.getInstance(module).getSourceRoots(); diff --git a/plugins/android/src/org/jetbrains/android/compiler/AndroidRenderscriptCompiler.java b/plugins/android/src/org/jetbrains/android/compiler/AndroidRenderscriptCompiler.java index 553cebfba03c..02fd7b7b83aa 100644 --- a/plugins/android/src/org/jetbrains/android/compiler/AndroidRenderscriptCompiler.java +++ b/plugins/android/src/org/jetbrains/android/compiler/AndroidRenderscriptCompiler.java @@ -3,7 +3,6 @@ package org.jetbrains.android.compiler; import com.android.AndroidConstants; import com.android.sdklib.IAndroidTarget; import com.android.sdklib.SdkConstants; -import com.intellij.compiler.impl.CompilerUtil; import com.intellij.facet.FacetManager; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.compiler.*; @@ -19,6 +18,7 @@ import com.intellij.openapi.vfs.LocalFileSystem; import com.intellij.openapi.vfs.VfsUtilCore; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.util.ArrayUtil; +import com.intellij.util.containers.HashMap; import com.intellij.util.containers.HashSet; import org.jetbrains.android.facet.AndroidFacet; import org.jetbrains.android.facet.AndroidRootUtil; @@ -60,68 +60,64 @@ public class AndroidRenderscriptCompiler implements SourceGeneratingCompiler { } final VirtualFile[] files = context.getProjectCompileScope().getFiles(AndroidRenderscriptFileType.INSTANCE, true); - final List items = new ArrayList(files.length); - for (final VirtualFile file : files) { + final Map> module2files = new HashMap>(); + + for (VirtualFile file : files) { final Module module = context.getModuleByFile(file); - final AndroidFacet facet = FacetManager.getInstance(module).getFacetByType(AndroidFacet.ID); - if (facet != null) { - final AndroidPlatform platform = facet.getConfiguration().getAndroidPlatform(); - if (platform == null) { - context.addMessage(CompilerMessageCategory.ERROR, - AndroidBundle.message("android.compilation.error.specify.platform", module.getName()), null, -1, -1); - continue; + + if (module != null) { + Collection filesForModule = module2files.get(module); + + if (filesForModule == null) { + filesForModule = new ArrayList(); + module2files.put(module, filesForModule); } - final IAndroidTarget target = platform.getTarget(); - final String sdkLocation = platform.getSdk().getLocation(); - - final String packageName = AndroidUtils.getPackageName(module, file); - if (packageName == null) { - context.addMessage(CompilerMessageCategory.ERROR, "Cannot compute package for file", file.getUrl(), -1, -1); - continue; - } - - final String resourceDirPath = AndroidRootUtil.getResourceDirPath(facet); - assert resourceDirPath != null; - - addItem(context, file, facet, resourceDirPath, sdkLocation, target, packageName, items); - - if (facet.getConfiguration().LIBRARY_PROJECT) { - final HashSet usingModules = new HashSet(); - AndroidUtils.collectModulesDependingOn(module, usingModules); - - for (final Module module1 : usingModules) { - final AndroidFacet facet1 = AndroidFacet.getInstance(module1); - if (facet1 != null) { - addItem(context, file, facet1, resourceDirPath, sdkLocation, target, packageName, items); - } - } - } + filesForModule.add(file); } } + final List items = new ArrayList(files.length); + + for (Map.Entry> entry : module2files.entrySet()) { + final Module module = entry.getKey(); + final AndroidFacet facet = FacetManager.getInstance(module).getFacetByType(AndroidFacet.ID); + if (facet == null) { + continue; + } + + final AndroidPlatform platform = facet.getConfiguration().getAndroidPlatform(); + if (platform == null) { + context.addMessage(CompilerMessageCategory.ERROR, + AndroidBundle.message("android.compilation.error.specify.platform", module.getName()), null, -1, -1); + continue; + } + + final IAndroidTarget target = platform.getTarget(); + final String sdkLocation = platform.getSdk().getLocation(); + + final String resourceDirPath = AndroidRootUtil.getResourceDirPath(facet); + assert resourceDirPath != null; + + addItem(entry.getValue(), facet, resourceDirPath, sdkLocation, target, items); + } return items.toArray(new GenerationItem[items.size()]); } }); } - private static void addItem(@NotNull final CompileContext context, - @NotNull final VirtualFile sourceFile, + private static void addItem(@NotNull final Collection sourceFiles, @NotNull final AndroidFacet facet, @NotNull final String resourceDirPath, @NotNull String sdkLocation, @NotNull final IAndroidTarget target, - @NotNull final String packageName, @NotNull final List items) { final Module module = facet.getModule(); final String sourceRootPath = AndroidRootUtil.getRenderscriptGenSourceRootPath(module); if (sourceRootPath == null) { return; } - final ProjectFileIndex fileIndex = ProjectRootManager.getInstance(context.getProject()).getFileIndex(); final String rawDirPath = resourceDirPath + '/' + AndroidConstants.FD_RES_RAW; - - items.add(new MyGenerationItem(module, sourceFile, sourceRootPath, packageName, rawDirPath, fileIndex.isInTestSourceContent(sourceFile), - sdkLocation, target)); + items.add(new MyGenerationItem(module, sourceFiles, rawDirPath, sdkLocation, target)); } @Override @@ -133,19 +129,13 @@ public class AndroidRenderscriptCompiler implements SourceGeneratingCompiler { } context.getProgressIndicator().setText("Compiling RenderScript files..."); - final GenerationItem[] generationItems = doGenerate(context, items); + final GenerationItem[] generationItems = doGenerate(context, items, outputRootDirectory); final Set generatedVFiles = new HashSet(); final HashSet visited = new HashSet(); - for (GenerationItem item : generationItems) { - final MyGenerationItem genItem = (MyGenerationItem)item; - final File genDir = new File(genItem.myGenRootPath); - CompilerUtil.refreshIODirectories(Arrays.asList(genDir)); - final VirtualFile generatedVFile = LocalFileSystem.getInstance().findFileByIoFile(genDir); - if (generatedVFile != null) { - AndroidUtils.collectFiles(generatedVFile, visited, generatedVFiles); - } - } + outputRootDirectory.refresh(false, true); + AndroidUtils.collectFiles(outputRootDirectory, visited, generatedVFiles); + if (context instanceof CompileContextEx) { ((CompileContextEx)context).markGenerated(generatedVFiles); } @@ -169,11 +159,25 @@ public class AndroidRenderscriptCompiler implements SourceGeneratingCompiler { return new MyValidityState(in); } - private static GenerationItem[] doGenerate(@NotNull final CompileContext context, @NotNull final GenerationItem[] items) { + private static GenerationItem[] doGenerate(@NotNull final CompileContext context, + @NotNull final GenerationItem[] items, + VirtualFile outputRootDirectory) { if (context.getProject().isDisposed()) { return EMPTY_GENERATION_ITEM_ARRAY; } + // we have one item per module there, so clear output directory + final String genRootPath = FileUtil.toSystemDependentName(outputRootDirectory.getPath()); + final File genRootDir = new File(genRootPath); + if (genRootDir.exists()) { + if (!FileUtil.delete(genRootDir)) { + LOG.error("Cannot delete directory " + genRootPath); + } + if (!genRootDir.mkdir()) { + LOG.error("Cannot create directory " + genRootPath); + } + } + final List results = new ArrayList(items.length); for (final GenerationItem item : items) { if (item instanceof MyGenerationItem) { @@ -183,33 +187,35 @@ public class AndroidRenderscriptCompiler implements SourceGeneratingCompiler { continue; } - try { - final Map> messages = launchRenderscriptCompiler(context.getProject(), - genItem.mySdkLocation, - genItem.myAndroidTarget, - genItem.mySourceFile, - genItem.myGenRootPath, - genItem.myRawDirPath); - ApplicationManager.getApplication().runReadAction(new Runnable() { - public void run() { - if (context.getProject().isDisposed()) { - return; + for (final VirtualFile sourceFile : genItem.myFiles) { + try { + final Map> messages = launchRenderscriptCompiler(context.getProject(), + genItem.mySdkLocation, + genItem.myAndroidTarget, + sourceFile, + genRootPath, + genItem.myRawDirPath); + ApplicationManager.getApplication().runReadAction(new Runnable() { + public void run() { + if (context.getProject().isDisposed()) { + return; + } + addMessages(context, messages, sourceFile.getUrl()); } - addMessages(context, messages, genItem.mySourceFile.getUrl()); - } - }); + }); - if (messages.get(CompilerMessageCategory.ERROR).isEmpty()) { - results.add(genItem); - } - } - catch (final IOException e) { - ApplicationManager.getApplication().runReadAction(new Runnable() { - public void run() { - if (context.getProject().isDisposed()) return; - context.addMessage(CompilerMessageCategory.ERROR, e.getMessage(), genItem.mySourceFile.getUrl(), -1, -1); + if (messages.get(CompilerMessageCategory.ERROR).isEmpty()) { + results.add(genItem); } - }); + } + catch (final IOException e) { + ApplicationManager.getApplication().runReadAction(new Runnable() { + public void run() { + if (context.getProject().isDisposed()) return; + context.addMessage(CompilerMessageCategory.ERROR, e.getMessage(), sourceFile.getUrl(), -1, -1); + } + }); + } } } } @@ -288,43 +294,30 @@ public class AndroidRenderscriptCompiler implements SourceGeneratingCompiler { private static class MyGenerationItem implements GenerationItem { final Module myModule; final String mySdkLocation; - final VirtualFile mySourceFile; - final boolean myTestSource; + final Collection myFiles; final IAndroidTarget myAndroidTarget; - final String myGenRootPath; final String myRawDirPath; - final String myPackageName; - final boolean myFileExists; - final File myParentDirectory; public MyGenerationItem(@NotNull Module module, - @NotNull VirtualFile sourceFile, - @NotNull String genRootPath, - @NotNull String packageName, + @NotNull Collection files, @NotNull String rawDirPath, - boolean testSource, @NotNull String sdkLocation, @NotNull IAndroidTarget target) { myModule = module; - mySourceFile = sourceFile; + myFiles = files; myRawDirPath = rawDirPath; - myTestSource = testSource; mySdkLocation = sdkLocation; myAndroidTarget = target; - myGenRootPath = genRootPath; - myPackageName = packageName; - myParentDirectory = new File(myGenRootPath, myPackageName.replace('.', File.separatorChar)); - myFileExists = myParentDirectory.exists(); } @Nullable public String getPath() { - return null; + return ""; } @Nullable public ValidityState getValidityState() { - return new MyValidityState(mySourceFile, myFileExists); + return new MyValidityState(myFiles); } public Module getModule() { @@ -332,22 +325,28 @@ public class AndroidRenderscriptCompiler implements SourceGeneratingCompiler { } public boolean isTestSource() { - return myTestSource; + return false; } } - + private static class MyValidityState implements ValidityState { - private final long myTimestamp; - private final boolean myFileExists; - - public MyValidityState(@NotNull DataInput in) throws IOException { - myTimestamp = in.readLong(); - myFileExists = true; + private final Map myTimestamps = new HashMap(); + + MyValidityState(DataInput in) throws IOException { + final int size = in.readInt(); + + for (int i = 0; i < size; i++) { + final String path = in.readUTF(); + final long timestamp = in.readLong(); + + myTimestamps.put(path, timestamp); + } } - public MyValidityState(@NotNull VirtualFile file, boolean fileExists) { - myTimestamp = file.getTimeStamp(); - myFileExists = fileExists; + MyValidityState(@NotNull Collection files) { + for (VirtualFile file : files) { + myTimestamps.put(file.getPath(), file.getTimeStamp()); + } } @Override @@ -355,15 +354,17 @@ public class AndroidRenderscriptCompiler implements SourceGeneratingCompiler { if (!(otherState instanceof MyValidityState)) { return false; } - - final MyValidityState st = (MyValidityState)otherState; - return myTimestamp == st.myTimestamp && - myFileExists == st.myFileExists; + return ((MyValidityState)otherState).myTimestamps.equals(myTimestamps); } @Override public void save(DataOutput out) throws IOException { - out.writeLong(myTimestamp); + out.writeInt(myTimestamps.size()); + + for (Map.Entry entry : myTimestamps.entrySet()) { + out.writeUTF(entry.getKey()); + out.writeLong(entry.getValue()); + } } } } From 895f5dbbc330edea98837deaa6754fa3bd745260 Mon Sep 17 00:00:00 2001 From: Eugene Kudelevsky Date: Tue, 7 Feb 2012 18:56:44 +0400 Subject: [PATCH 151/215] we don't need to wait until background autogeneration finished before compilation anymore --- .../android/AndroidProjectComponent.java | 26 +------------- .../android/compiler/AndroidCompileUtil.java | 34 +++++-------------- .../compiler/AndroidPrecompileTask.java | 22 ------------ 3 files changed, 10 insertions(+), 72 deletions(-) diff --git a/plugins/android/src/org/jetbrains/android/AndroidProjectComponent.java b/plugins/android/src/org/jetbrains/android/AndroidProjectComponent.java index 65bff27a39de..e047daf6bb8b 100644 --- a/plugins/android/src/org/jetbrains/android/AndroidProjectComponent.java +++ b/plugins/android/src/org/jetbrains/android/AndroidProjectComponent.java @@ -19,15 +19,11 @@ import com.intellij.openapi.compiler.CompilerManager; import com.intellij.openapi.components.AbstractProjectComponent; import com.intellij.openapi.project.Project; import org.jetbrains.android.compiler.AndroidPrecompileTask; -import org.jetbrains.annotations.NotNull; /** * @author Eugene.Kudelevsky */ public class AndroidProjectComponent extends AbstractProjectComponent { - private volatile boolean myCompilationRunning = false; - private final Object COMPILATION_FLAG_LOCK = new Object(); - protected AndroidProjectComponent(Project project) { super(project); } @@ -35,26 +31,6 @@ public class AndroidProjectComponent extends AbstractProjectComponent { @Override public void projectOpened() { final CompilerManager manager = CompilerManager.getInstance(myProject); - manager.addBeforeTask(new AndroidPrecompileTask(this)); - } - - public void setCompilationStarted() { - synchronized (COMPILATION_FLAG_LOCK) { - myCompilationRunning = true; - } - } - - public void setCompilationFinished() { - synchronized (COMPILATION_FLAG_LOCK) { - myCompilationRunning = false; - } - } - - public void runIfNotInCompilation(@NotNull Runnable r) { - synchronized (COMPILATION_FLAG_LOCK) { - if (!myCompilationRunning) { - r.run(); - } - } + manager.addBeforeTask(new AndroidPrecompileTask()); } } diff --git a/plugins/android/src/org/jetbrains/android/compiler/AndroidCompileUtil.java b/plugins/android/src/org/jetbrains/android/compiler/AndroidCompileUtil.java index 88a51f5c8cf4..c06b0cacd06f 100644 --- a/plugins/android/src/org/jetbrains/android/compiler/AndroidCompileUtil.java +++ b/plugins/android/src/org/jetbrains/android/compiler/AndroidCompileUtil.java @@ -39,7 +39,6 @@ import com.intellij.openapi.project.DumbService; import com.intellij.openapi.project.Project; import com.intellij.openapi.roots.*; import com.intellij.openapi.ui.Messages; -import com.intellij.openapi.util.Computable; import com.intellij.openapi.util.Key; import com.intellij.openapi.util.Pair; import com.intellij.openapi.util.io.FileUtil; @@ -52,7 +51,6 @@ import com.intellij.psi.search.GlobalSearchScope; import com.intellij.util.ArrayUtil; import com.intellij.util.containers.HashMap; import com.intellij.util.containers.HashSet; -import org.jetbrains.android.AndroidProjectComponent; import org.jetbrains.android.dom.resources.Attr; import org.jetbrains.android.dom.resources.DeclareStyleable; import org.jetbrains.android.dom.resources.ResourceElement; @@ -414,32 +412,18 @@ public class AndroidCompileUtil { public static void doGenerate(final Module module, final AndroidAutogeneratorMode mode) { final Project project = module.getProject(); - final AndroidProjectComponent component = ApplicationManager.getApplication().runReadAction(new Computable() { - @Nullable - @Override - public AndroidProjectComponent compute() { - return !project.isDisposed() ? project.getComponent(AndroidProjectComponent.class) : null; - } - }); - if (component == null) { - return; - } - component.runIfNotInCompilation(new Runnable() { - @Override + assert !ApplicationManager.getApplication().isDispatchThread(); + final CompileContext[] contextWrapper = new CompileContext[1]; + + ApplicationManager.getApplication().runReadAction(new Runnable() { public void run() { - assert !ApplicationManager.getApplication().isDispatchThread(); - final CompileContext[] contextWrapper = new CompileContext[1]; - ApplicationManager.getApplication().runReadAction(new Runnable() { - public void run() { - if (project.isDisposed()) return; - CompilerTask task = new CompilerTask(project, true, "Android auto-generation", true); - CompileScope scope = new ModuleCompileScope(module, false); - contextWrapper[0] = new CompileContextImpl(project, task, scope, null, false, false); - } - }); - generate(module, mode, contextWrapper[0]); + if (project.isDisposed()) return; + CompilerTask task = new CompilerTask(project, true, "Android auto-generation", true); + CompileScope scope = new ModuleCompileScope(module, false); + contextWrapper[0] = new CompileContextImpl(project, task, scope, null, false, false); } }); + generate(module, mode, contextWrapper[0]); } public static boolean isModuleAffected(CompileContext context, Module module) { diff --git a/plugins/android/src/org/jetbrains/android/compiler/AndroidPrecompileTask.java b/plugins/android/src/org/jetbrains/android/compiler/AndroidPrecompileTask.java index 2201045a0502..bd629e58fc0e 100644 --- a/plugins/android/src/org/jetbrains/android/compiler/AndroidPrecompileTask.java +++ b/plugins/android/src/org/jetbrains/android/compiler/AndroidPrecompileTask.java @@ -35,7 +35,6 @@ import com.intellij.openapi.roots.ModuleRootManager; import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.util.containers.hash.HashSet; -import org.jetbrains.android.AndroidProjectComponent; import org.jetbrains.android.facet.AndroidFacet; import org.jetbrains.android.sdk.AndroidPlatform; import org.jetbrains.annotations.NotNull; @@ -49,20 +48,12 @@ import java.util.Set; * @author Eugene.Kudelevsky */ public class AndroidPrecompileTask implements CompileTask { - private final AndroidProjectComponent myOwner; - private static final Logger LOG = Logger.getInstance("#org.jetbrains.android.compiler.AndroidPrecompileTask"); - public AndroidPrecompileTask(@NotNull AndroidProjectComponent owner) { - myOwner = owner; - } - @Override public boolean execute(CompileContext context) { final Project project = context.getProject(); - myOwner.setCompilationStarted(); - ExcludedEntriesConfiguration configuration = ((CompilerConfigurationImpl)CompilerConfiguration.getInstance(project)).getExcludedEntriesConfiguration(); @@ -107,19 +98,6 @@ public class AndroidPrecompileTask implements CompileTask { LOG.debug("Files excluded by Android: " + addedEntries.size()); CompilerManager.getInstance(project).addCompilationStatusListener(new MyCompilationStatusListener(project, addedEntries), project); } - - CompilerManager.getInstance(project).addCompilationStatusListener(new CompilationStatusAdapter() { - @Override - public void compilationFinished(boolean aborted, int errors, int warnings, final CompileContext compileContext) { - ApplicationManager.getApplication().executeOnPooledThread(new Runnable() { - @Override - public void run() { - myOwner.setCompilationFinished(); - } - }); - } - }, project); - return true; } From acdfb9160727eb52d5091182e44fdf8982087f11 Mon Sep 17 00:00:00 2001 From: Eugene Kudelevsky Date: Tue, 7 Feb 2012 20:29:15 +0400 Subject: [PATCH 152/215] compilation errors instead of log errors --- .../android/compiler/AndroidRenderscriptCompiler.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/plugins/android/src/org/jetbrains/android/compiler/AndroidRenderscriptCompiler.java b/plugins/android/src/org/jetbrains/android/compiler/AndroidRenderscriptCompiler.java index 02fd7b7b83aa..9dff00c3448f 100644 --- a/plugins/android/src/org/jetbrains/android/compiler/AndroidRenderscriptCompiler.java +++ b/plugins/android/src/org/jetbrains/android/compiler/AndroidRenderscriptCompiler.java @@ -171,10 +171,12 @@ public class AndroidRenderscriptCompiler implements SourceGeneratingCompiler { final File genRootDir = new File(genRootPath); if (genRootDir.exists()) { if (!FileUtil.delete(genRootDir)) { - LOG.error("Cannot delete directory " + genRootPath); + context.addMessage(CompilerMessageCategory.ERROR, "Cannot delete directory " + genRootPath, null, -1, -1); + return EMPTY_GENERATION_ITEM_ARRAY; } if (!genRootDir.mkdir()) { - LOG.error("Cannot create directory " + genRootPath); + context.addMessage(CompilerMessageCategory.ERROR, "Cannot create directory " + genRootPath, null, -1, -1); + return EMPTY_GENERATION_ITEM_ARRAY; } } From 93c93eb1373b0eade5d925461c149c238d2460d2 Mon Sep 17 00:00:00 2001 From: Eugene Kudelevsky Date: Tue, 7 Feb 2012 20:31:13 +0400 Subject: [PATCH 153/215] generate R.java into temp directory first --- .../compiler/AndroidAutogenerator.java | 78 +++++++++++++++---- 1 file changed, 65 insertions(+), 13 deletions(-) diff --git a/plugins/android/src/org/jetbrains/android/compiler/AndroidAutogenerator.java b/plugins/android/src/org/jetbrains/android/compiler/AndroidAutogenerator.java index e28ae99b78a3..fdf56715d4ec 100644 --- a/plugins/android/src/org/jetbrains/android/compiler/AndroidAutogenerator.java +++ b/plugins/android/src/org/jetbrains/android/compiler/AndroidAutogenerator.java @@ -28,6 +28,7 @@ import org.jetbrains.android.fileTypes.AndroidRenderscriptFileType; import org.jetbrains.android.sdk.AndroidPlatform; import org.jetbrains.android.util.AndroidBundle; import org.jetbrains.android.util.AndroidCommonUtils; +import org.jetbrains.android.util.AndroidCompilerMessageKind; import org.jetbrains.android.util.AndroidUtils; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -120,12 +121,12 @@ public class AndroidAutogenerator { final String[] libPackages = getLibPackages(module, packageName); final Map genFilePath2Package = new HashMap(); - final String packageDir = sourceRootPath + '/' + packageName.replace('.', '/') + '/'; + final String packageDir = packageName.replace('.', '/') + '/'; genFilePath2Package.put(packageDir + AndroidCommonUtils.MANIFEST_JAVA_FILE_NAME, packageName); genFilePath2Package.put(packageDir + AndroidCommonUtils.R_JAVA_FILENAME, packageName); for (String libPackage : libPackages) { - final String libPackageDir = sourceRootPath + '/' + libPackage.replace('.', '/') + '/'; + final String libPackageDir = libPackage.replace('.', '/') + '/'; genFilePath2Package.put(libPackageDir + AndroidCommonUtils.MANIFEST_JAVA_FILE_NAME, packageName); genFilePath2Package.put(libPackageDir + AndroidCommonUtils.R_JAVA_FILENAME, packageName); } @@ -143,9 +144,11 @@ public class AndroidAutogenerator { final Set filesToCheck = new HashSet(); - for (String genFilePath : item.myGenFile2package.keySet()) { - if (new File(genFilePath).exists()) { - final VirtualFile genFile = LocalFileSystem.getInstance().findFileByPath(genFilePath); + for (String genFileRelPath : item.myGenFileRelPath2package.keySet()) { + final String genFileFullPath = item.myOutputDirOsPath + '/' + genFileRelPath; + + if (new File(genFileFullPath).exists()) { + final VirtualFile genFile = LocalFileSystem.getInstance().findFileByPath(genFileFullPath); if (genFile != null) { filesToCheck.add(genFile); @@ -157,15 +160,59 @@ public class AndroidAutogenerator { return; } + File tempOutDir = null; + try { - final Map> messages = AndroidCompileUtil.toCompilerMessageCategoryKeys( + // Aapt generation can be very long, so we generate it in temp directory first + tempOutDir = FileUtil.createTempDirectory("android_apt_autogeneration", "tmp"); + + final Map> messages = AndroidApt.compile(item.myTarget, item.myPlatformToolsRevision, item.myManifestFileOsPath, item.myPackage, - item.myOutputDirOsPath, item.myResDirOsPaths, item.myLibPackages, item.myLibrary)); + tempOutDir.getPath(), item.myResDirOsPaths, item.myLibPackages, item.myLibrary); - AndroidCompileUtil.addMessages(context, messages); + if (messages.get(AndroidCompilerMessageKind.ERROR).size() == 0) { + for (String genFileRelPath : item.myGenFileRelPath2package.keySet()) { + final File srcFile = new File(tempOutDir.getPath() + '/' + genFileRelPath); - for (Map.Entry entry : item.myGenFile2package.entrySet()) { - final String path = entry.getKey(); + if (srcFile.isFile()) { + final File dstFile = new File(item.myOutputDirOsPath + '/' + genFileRelPath); + + if (dstFile.exists()) { + if (!FileUtil.delete(dstFile)) { + ApplicationManager.getApplication().runReadAction(new Runnable() { + @Override + public void run() { + if (module.isDisposed() || module.getProject().isDisposed()) { + return; + } + context.addMessage(CompilerMessageCategory.ERROR, + "Cannot delete " + FileUtil.toSystemDependentName(dstFile.getPath()), null, -1, -1); + } + }); + } + } + + if (!srcFile.renameTo(dstFile)) { + ApplicationManager.getApplication().runReadAction(new Runnable() { + @Override + public void run() { + if (module.isDisposed() || module.getProject().isDisposed()) { + return; + } + context.addMessage(CompilerMessageCategory.ERROR, "Cannot move " + + FileUtil.toSystemDependentName(srcFile.getPath()) + + " to " + + FileUtil.toSystemDependentName(dstFile.getPath()), null, -1, -1); + } + }); + } + } + } + } + AndroidCompileUtil.addMessages(context, AndroidCompileUtil.toCompilerMessageCategoryKeys(messages)); + + for (Map.Entry entry : item.myGenFileRelPath2package.entrySet()) { + final String path = item.myOutputDirOsPath + '/' + entry.getKey(); final String aPackage = entry.getValue(); removeDuplicateClasses(module, aPackage, new File(path), item.myOutputDirOsPath); } @@ -184,6 +231,11 @@ public class AndroidAutogenerator { } }); } + finally { + if (tempOutDir != null) { + FileUtil.delete(tempOutDir); + } + } } public static void runAidl(@NotNull final AndroidFacet facet, @NotNull final CompileContext context) { @@ -429,7 +481,7 @@ public class AndroidAutogenerator { final String[] myResDirOsPaths; final String[] myLibPackages; final boolean myLibrary; - final Map myGenFile2package; + final Map myGenFileRelPath2package; private AptAutogenerationItem(@NotNull IAndroidTarget target, int platformToolsRevision, @@ -439,7 +491,7 @@ public class AndroidAutogenerator { @NotNull String[] resDirOsPaths, @NotNull String[] libPackages, boolean library, - @NotNull Map genFile2package) { + @NotNull Map genFileRelPath2package) { myTarget = target; myPlatformToolsRevision = platformToolsRevision; myManifestFileOsPath = manifestFileOsPath; @@ -448,7 +500,7 @@ public class AndroidAutogenerator { myResDirOsPaths = resDirOsPaths; myLibPackages = libPackages; myLibrary = library; - myGenFile2package = genFile2package; + myGenFileRelPath2package = genFileRelPath2package; } } From 9436070e527f928bb3107b169d77f631f652c7b1 Mon Sep 17 00:00:00 2001 From: Eugene Kudelevsky Date: Tue, 7 Feb 2012 23:19:03 +0400 Subject: [PATCH 154/215] mark files as autogenerated and delete obsolete files later --- .../compiler/AndroidAutogenerator.java | 99 +++++++++++++++---- .../jetbrains/android/facet/AndroidFacet.java | 85 +++++++++++----- 2 files changed, 139 insertions(+), 45 deletions(-) diff --git a/plugins/android/src/org/jetbrains/android/compiler/AndroidAutogenerator.java b/plugins/android/src/org/jetbrains/android/compiler/AndroidAutogenerator.java index fdf56715d4ec..ad464399e07c 100644 --- a/plugins/android/src/org/jetbrains/android/compiler/AndroidAutogenerator.java +++ b/plugins/android/src/org/jetbrains/android/compiler/AndroidAutogenerator.java @@ -2,6 +2,7 @@ package org.jetbrains.android.compiler; import com.android.AndroidConstants; import com.android.sdklib.IAndroidTarget; +import com.intellij.compiler.impl.CompilerUtil; import com.intellij.compiler.impl.ModuleCompileScope; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.application.ModalityState; @@ -47,6 +48,8 @@ public class AndroidAutogenerator { } public static void run(@NotNull AndroidAutogeneratorMode mode, @NotNull AndroidFacet facet, @NotNull CompileContext context) { + final Set obsoleteFiles = new HashSet(facet.getAutogeneratedFiles(mode)); + switch (mode) { case AAPT: runAapt(facet, context); @@ -57,10 +60,22 @@ public class AndroidAutogenerator { case RENDERSCRIPT: runRenderscript(facet, context); break; + default: + LOG.error("Unknown mode" + mode); + } + obsoleteFiles.removeAll(facet.getAutogeneratedFiles(mode)); + + for (String path : obsoleteFiles) { + final File file = new File(path); + + if (file.isFile()) { + FileUtil.delete(file); + CompilerUtil.refreshIOFile(file); + } } } - public static void runAapt(@NotNull final AndroidFacet facet, @NotNull final CompileContext context) { + private static void runAapt(@NotNull final AndroidFacet facet, @NotNull final CompileContext context) { final Module module = facet.getModule(); final AptAutogenerationItem item = ApplicationManager.getApplication().runReadAction(new Computable() { @@ -191,21 +206,7 @@ public class AndroidAutogenerator { }); } } - - if (!srcFile.renameTo(dstFile)) { - ApplicationManager.getApplication().runReadAction(new Runnable() { - @Override - public void run() { - if (module.isDisposed() || module.getProject().isDisposed()) { - return; - } - context.addMessage(CompilerMessageCategory.ERROR, "Cannot move " + - FileUtil.toSystemDependentName(srcFile.getPath()) + - " to " + - FileUtil.toSystemDependentName(dstFile.getPath()), null, -1, -1); - } - }); - } + FileUtil.rename(srcFile, dstFile); } } } @@ -221,6 +222,18 @@ public class AndroidAutogenerator { if (genSourceRoot != null) { genSourceRoot.refresh(false, true); } + + if (messages.get(AndroidCompilerMessageKind.ERROR).size() == 0) { + facet.clearAutogeneratedFiles(AndroidAutogeneratorMode.AAPT); + + for (String relPath : item.myGenFileRelPath2package.keySet()) { + final VirtualFile genFile = LocalFileSystem.getInstance().findFileByPath(item.myOutputDirOsPath + '/' + relPath); + + if (genFile != null && genFile.exists()) { + facet.markFileAutogenerated(AndroidAutogeneratorMode.AAPT, genFile); + } + } + } } catch (final IOException e) { LOG.info(e); @@ -238,7 +251,7 @@ public class AndroidAutogenerator { } } - public static void runAidl(@NotNull final AndroidFacet facet, @NotNull final CompileContext context) { + private static void runAidl(@NotNull final AndroidFacet facet, @NotNull final CompileContext context) { final Module module = facet.getModule(); final ModuleCompileScope moduleCompileScope = new ModuleCompileScope(module, false); final VirtualFile[] files = moduleCompileScope.getFiles(AndroidIdlFileType.ourFileType, true); @@ -300,6 +313,8 @@ public class AndroidAutogenerator { return; } + facet.clearAutogeneratedFiles(AndroidAutogeneratorMode.AIDL); + for (IdlAutogenerationItem item : items) { final VirtualFile file = item.myFile; final String fileOsPath = FileUtil.toSystemDependentName(file.getPath()); @@ -327,8 +342,14 @@ public class AndroidAutogenerator { if (genDir != null) { genDir.refresh(false, true); } + + final VirtualFile outFile = LocalFileSystem.getInstance().findFileByPath(item.myOutFileOsPath); + if (outFile != null && outFile.exists()) { + facet.markFileAutogenerated(AndroidAutogeneratorMode.AIDL, outFile); + } } catch (final IOException e) { + LOG.info(e); ApplicationManager.getApplication().runReadAction(new Runnable() { public void run() { if (module.getProject().isDisposed()) return; @@ -346,7 +367,6 @@ public class AndroidAutogenerator { final VirtualFile[] files = moduleCompileScope.getFiles(AndroidRenderscriptFileType.INSTANCE, true); for (final VirtualFile file : files) { - final RenderscriptAutogenerationItem item = ApplicationManager.getApplication().runReadAction(new Computable() { @Nullable @@ -382,9 +402,28 @@ public class AndroidAutogenerator { } }); + File tempOutDir = null; + try { + tempOutDir = FileUtil.createTempDirectory("android_renderscript_autogeneration", "tmp"); + final Map> messages = AndroidRenderscriptCompiler. - launchRenderscriptCompiler(module.getProject(), item.mySdkLocation, item.myTarget, file, item.myGenDirPath, item.myRawDirPath); + launchRenderscriptCompiler(module.getProject(), item.mySdkLocation, item.myTarget, file, tempOutDir.getPath(), item.myRawDirPath); + + if (messages.get(CompilerMessageCategory.ERROR).size() == 0) { + facet.clearAutogeneratedFiles(AndroidAutogeneratorMode.RENDERSCRIPT); + + final List newFiles = new ArrayList(); + moveAllFiles(tempOutDir, new File(item.myGenDirPath), newFiles); + + for (File newFile : newFiles) { + final VirtualFile newVFile = LocalFileSystem.getInstance().findFileByIoFile(newFile); + + if (newVFile != null) { + facet.markFileAutogenerated(AndroidAutogeneratorMode.RENDERSCRIPT, newVFile); + } + } + } ApplicationManager.getApplication().runReadAction(new Runnable() { public void run() { @@ -407,6 +446,7 @@ public class AndroidAutogenerator { } } catch (final IOException e) { + LOG.info(e); ApplicationManager.getApplication().runReadAction(new Runnable() { public void run() { if (module.getProject().isDisposed()) return; @@ -414,6 +454,27 @@ public class AndroidAutogenerator { } }); } + finally { + if (tempOutDir != null) { + FileUtil.delete(tempOutDir); + } + } + } + } + + private static void moveAllFiles(@NotNull File from, @NotNull File to, @NotNull Collection newFiles) throws IOException { + if (from.isFile()) { + FileUtil.rename(from, to); + newFiles.add(to); + } + else { + final File[] children = from.listFiles(); + + if (children != null) { + for (File child : children) { + moveAllFiles(child, new File(to, child.getName()), newFiles); + } + } } } diff --git a/plugins/android/src/org/jetbrains/android/facet/AndroidFacet.java b/plugins/android/src/org/jetbrains/android/facet/AndroidFacet.java index 619b93362d78..787ad7a2ceb5 100644 --- a/plugins/android/src/org/jetbrains/android/facet/AndroidFacet.java +++ b/plugins/android/src/org/jetbrains/android/facet/AndroidFacet.java @@ -64,15 +64,16 @@ import com.intellij.psi.search.GlobalSearchScope; import com.intellij.psi.search.ProjectScope; import com.intellij.psi.search.searches.ClassInheritorsSearch; import com.intellij.psi.xml.XmlTag; +import com.intellij.util.Alarm; import com.intellij.util.ArrayUtil; import com.intellij.util.Processor; import com.intellij.util.containers.HashMap; import com.intellij.util.containers.HashSet; -import com.intellij.util.ui.update.MergingUpdateQueue; -import com.intellij.util.ui.update.Update; import com.intellij.util.xml.ConvertContext; import com.intellij.util.xml.DomElement; -import org.jetbrains.android.compiler.*; +import org.jetbrains.android.compiler.AndroidAptCompiler; +import org.jetbrains.android.compiler.AndroidAutogeneratorMode; +import org.jetbrains.android.compiler.AndroidCompileUtil; import org.jetbrains.android.dom.manifest.Manifest; import org.jetbrains.android.importDependencies.ImportDependenciesUtil; import org.jetbrains.android.resourceManagers.LocalResourceManager; @@ -109,27 +110,69 @@ public class AndroidFacet extends Facet { private final Object myClassMapLock = new Object(); - private final Map mySourcesAutogeneratingQueueMap = - new HashMap(); + private final Set myDirtyModes = EnumSet.noneOf(AndroidAutogeneratorMode.class); + private final Map> myAutogeneratedFiles = new HashMap>(); + private final Set myInitializedModes = EnumSet.noneOf(AndroidAutogeneratorMode.class); + + private volatile boolean myAutogenerationEnabled = false; public AndroidFacet(@NotNull Module module, String name, @NotNull AndroidFacetConfiguration configuration) { super(getFacetType(), module, name, configuration, null); configuration.setFacet(this); - mySourcesAutogeneratingQueueMap.put(AndroidAutogeneratorMode.AAPT, createSourceGeneratingQueue("AndroidAptAutogeneratingQueue")); - mySourcesAutogeneratingQueueMap.put(AndroidAutogeneratorMode.AIDL, createSourceGeneratingQueue("AndroidIdlAutogeneratingQueue")); - mySourcesAutogeneratingQueueMap - .put(AndroidAutogeneratorMode.RENDERSCRIPT, createSourceGeneratingQueue("AndroidRenderscriptAutogeneratingQueue")); + for (AndroidAutogeneratorMode mode : AndroidAutogeneratorMode.values()) { + createAlarm(mode); + } } - private MergingUpdateQueue createSourceGeneratingQueue(@NotNull String name) { - return new MergingUpdateQueue(name, 1000, false, null, this, null, false); + private Alarm createAlarm(@NotNull final AndroidAutogeneratorMode mode) { + final Alarm alarm = new Alarm(Alarm.ThreadToUse.OWN_THREAD, this); + alarm.addRequest(new Runnable() { + @Override + public void run() { + synchronized (myDirtyModes) { + if (myAutogenerationEnabled && myDirtyModes.contains(mode)) { + myDirtyModes.remove(mode); + AndroidCompileUtil.doGenerate(getModule(), mode); + } + } + alarm.addRequest(this, 2000); + } + }, 2000); + return alarm; + } + + public void clearAutogeneratedFiles(@NotNull AndroidAutogeneratorMode mode) { + synchronized (myAutogeneratedFiles) { + final Set set = myAutogeneratedFiles.get(mode); + if (set != null) { + set.clear(); + } + } + } + + public void markFileAutogenerated(@NotNull AndroidAutogeneratorMode mode, @NotNull VirtualFile file) { + synchronized (myAutogeneratedFiles) { + Set set = myAutogeneratedFiles.get(mode); + + if (set == null) { + set = new HashSet(); + myAutogeneratedFiles.put(mode, set); + } + set.add(file.getPath()); + } + } + + @NotNull + public Set getAutogeneratedFiles(@NotNull AndroidAutogeneratorMode mode) { + synchronized (myAutogeneratedFiles) { + final Set set = myAutogeneratedFiles.get(mode); + return set != null ? new HashSet(set) : Collections.emptySet(); + } } private void activateSourceAutogenerating() { - for (MergingUpdateQueue queue : mySourcesAutogeneratingQueueMap.values()) { - queue.activate(); - } + myAutogenerationEnabled = true; } @Nullable @@ -772,18 +815,8 @@ public class AndroidFacet extends Facet { } public void scheduleSourceRegenerating(@NotNull final AndroidAutogeneratorMode mode) { - final MergingUpdateQueue queue = mySourcesAutogeneratingQueueMap.get(mode); - - if (queue == null) { - LOG.error("Autogenerating is not supported for mode " + mode); - } - else { - queue.queue(new Update(this) { - @Override - public void run() { - AndroidCompileUtil.doGenerate(getModule(), mode); - } - }); + synchronized (myDirtyModes) { + myDirtyModes.add(mode); } } } From a4ea6482af868ef6264e32fb8b775d338894464b Mon Sep 17 00:00:00 2001 From: Eugene Kudelevsky Date: Tue, 7 Feb 2012 23:29:57 +0400 Subject: [PATCH 155/215] do not autogenerate R.java in every lib package, because now we use it for resolve/completion only --- .../compiler/AndroidAutogenerator.java | 30 ++----------------- 1 file changed, 2 insertions(+), 28 deletions(-) diff --git a/plugins/android/src/org/jetbrains/android/compiler/AndroidAutogenerator.java b/plugins/android/src/org/jetbrains/android/compiler/AndroidAutogenerator.java index ad464399e07c..7bf60d90afd7 100644 --- a/plugins/android/src/org/jetbrains/android/compiler/AndroidAutogenerator.java +++ b/plugins/android/src/org/jetbrains/android/compiler/AndroidAutogenerator.java @@ -133,23 +133,16 @@ public class AndroidAutogenerator { return null; } - final String[] libPackages = getLibPackages(module, packageName); final Map genFilePath2Package = new HashMap(); final String packageDir = packageName.replace('.', '/') + '/'; genFilePath2Package.put(packageDir + AndroidCommonUtils.MANIFEST_JAVA_FILE_NAME, packageName); genFilePath2Package.put(packageDir + AndroidCommonUtils.R_JAVA_FILENAME, packageName); - for (String libPackage : libPackages) { - final String libPackageDir = libPackage.replace('.', '/') + '/'; - genFilePath2Package.put(libPackageDir + AndroidCommonUtils.MANIFEST_JAVA_FILE_NAME, packageName); - genFilePath2Package.put(libPackageDir + AndroidCommonUtils.R_JAVA_FILENAME, packageName); - } - final String manifestFileOsPath = FileUtil.toSystemDependentName(manifestFile.getPath()); return new AptAutogenerationItem(target, platformToolsRevision, manifestFileOsPath, packageName, sourceRootPath, resPaths, - libPackages, facet.getConfiguration().LIBRARY_PROJECT, genFilePath2Package); + facet.getConfiguration().LIBRARY_PROJECT, genFilePath2Package); } }); @@ -183,7 +176,7 @@ public class AndroidAutogenerator { final Map> messages = AndroidApt.compile(item.myTarget, item.myPlatformToolsRevision, item.myManifestFileOsPath, item.myPackage, - tempOutDir.getPath(), item.myResDirOsPaths, item.myLibPackages, item.myLibrary); + tempOutDir.getPath(), item.myResDirOsPaths, ArrayUtil.EMPTY_STRING_ARRAY, item.myLibrary); if (messages.get(AndroidCompilerMessageKind.ERROR).size() == 0) { for (String genFileRelPath : item.myGenFileRelPath2package.keySet()) { @@ -517,22 +510,6 @@ public class AndroidAutogenerator { } } - @NotNull - private static String[] getLibPackages(@NotNull Module module, @NotNull String packageName) { - final Set packageSet = new HashSet(); - packageSet.add(packageName); - - final List result = new ArrayList(); - - for (String libPackage : AndroidUtils.getDepLibsPackages(module)) { - if (packageSet.add(libPackage)) { - result.add(libPackage); - } - } - - return ArrayUtil.toStringArray(result); - } - private static class AptAutogenerationItem { final IAndroidTarget myTarget; final int myPlatformToolsRevision; @@ -540,7 +517,6 @@ public class AndroidAutogenerator { final String myPackage; final String myOutputDirOsPath; final String[] myResDirOsPaths; - final String[] myLibPackages; final boolean myLibrary; final Map myGenFileRelPath2package; @@ -550,7 +526,6 @@ public class AndroidAutogenerator { @NotNull String aPackage, @NotNull String outputDirOsPath, @NotNull String[] resDirOsPaths, - @NotNull String[] libPackages, boolean library, @NotNull Map genFileRelPath2package) { myTarget = target; @@ -559,7 +534,6 @@ public class AndroidAutogenerator { myPackage = aPackage; myOutputDirOsPath = outputDirOsPath; myResDirOsPaths = resDirOsPaths; - myLibPackages = libPackages; myLibrary = library; myGenFileRelPath2package = genFileRelPath2package; } From 5edefa66fc6fbe06b26dc9d64f84f8d8430492e0 Mon Sep 17 00:00:00 2001 From: Eugene Kudelevsky Date: Wed, 8 Feb 2012 14:16:02 +0400 Subject: [PATCH 156/215] return success --- .../org/jetbrains/android/compiler/AndroidCompileUtil.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/plugins/android/src/org/jetbrains/android/compiler/AndroidCompileUtil.java b/plugins/android/src/org/jetbrains/android/compiler/AndroidCompileUtil.java index c06b0cacd06f..039ff5c9768f 100644 --- a/plugins/android/src/org/jetbrains/android/compiler/AndroidCompileUtil.java +++ b/plugins/android/src/org/jetbrains/android/compiler/AndroidCompileUtil.java @@ -410,7 +410,7 @@ public class AndroidCompileUtil { } } - public static void doGenerate(final Module module, final AndroidAutogeneratorMode mode) { + public static boolean doGenerate(final Module module, final AndroidAutogeneratorMode mode) { final Project project = module.getProject(); assert !ApplicationManager.getApplication().isDispatchThread(); final CompileContext[] contextWrapper = new CompileContext[1]; @@ -424,6 +424,8 @@ public class AndroidCompileUtil { } }); generate(module, mode, contextWrapper[0]); + + return contextWrapper[0].getMessages(CompilerMessageCategory.ERROR).length == 0; } public static boolean isModuleAffected(CompileContext context, Module module) { From 1be81bef6072cfd520c7451311a7f2cd612dea6f Mon Sep 17 00:00:00 2001 From: Eugene Kudelevsky Date: Wed, 8 Feb 2012 14:17:07 +0400 Subject: [PATCH 157/215] force autogenerating if some generated file was removed --- .../jetbrains/android/facet/AndroidFacet.java | 32 ++++++++++++++++--- 1 file changed, 28 insertions(+), 4 deletions(-) diff --git a/plugins/android/src/org/jetbrains/android/facet/AndroidFacet.java b/plugins/android/src/org/jetbrains/android/facet/AndroidFacet.java index 787ad7a2ceb5..f02eb36984fa 100644 --- a/plugins/android/src/org/jetbrains/android/facet/AndroidFacet.java +++ b/plugins/android/src/org/jetbrains/android/facet/AndroidFacet.java @@ -112,7 +112,6 @@ public class AndroidFacet extends Facet { private final Set myDirtyModes = EnumSet.noneOf(AndroidAutogeneratorMode.class); private final Map> myAutogeneratedFiles = new HashMap>(); - private final Set myInitializedModes = EnumSet.noneOf(AndroidAutogeneratorMode.class); private volatile boolean myAutogenerationEnabled = false; @@ -130,10 +129,18 @@ public class AndroidFacet extends Facet { alarm.addRequest(new Runnable() { @Override public void run() { + boolean regenerate; + synchronized (myDirtyModes) { - if (myAutogenerationEnabled && myDirtyModes.contains(mode)) { - myDirtyModes.remove(mode); - AndroidCompileUtil.doGenerate(getModule(), mode); + regenerate = myDirtyModes.contains(mode); + } + regenerate = regenerate || isGeneratedFileRemoved(mode); + + if (myAutogenerationEnabled && regenerate) { + if (AndroidCompileUtil.doGenerate(getModule(), mode)) { + synchronized (myDirtyModes) { + myDirtyModes.remove(mode); + } } } alarm.addRequest(this, 2000); @@ -142,6 +149,23 @@ public class AndroidFacet extends Facet { return alarm; } + private boolean isGeneratedFileRemoved(@NotNull AndroidAutogeneratorMode mode) { + synchronized (myAutogeneratedFiles) { + final Set filePaths = myAutogeneratedFiles.get(mode); + + if (filePaths != null) { + for (String path : filePaths) { + final VirtualFile file = LocalFileSystem.getInstance().findFileByPath(path); + + if (file == null) { + return true; + } + } + } + } + return false; + } + public void clearAutogeneratedFiles(@NotNull AndroidAutogeneratorMode mode) { synchronized (myAutogeneratedFiles) { final Set set = myAutogeneratedFiles.get(mode); From d9417ecdbfed3ed0ddc2ce503970bf8aecb0684d Mon Sep 17 00:00:00 2001 From: Eugene Kudelevsky Date: Wed, 8 Feb 2012 15:07:34 +0400 Subject: [PATCH 158/215] bug fixes --- .../android/compiler/AndroidAutogenerator.java | 10 +++++++--- .../src/org/jetbrains/android/facet/AndroidFacet.java | 4 +++- .../android/facet/AndroidResourceFilesListener.java | 3 --- 3 files changed, 10 insertions(+), 7 deletions(-) diff --git a/plugins/android/src/org/jetbrains/android/compiler/AndroidAutogenerator.java b/plugins/android/src/org/jetbrains/android/compiler/AndroidAutogenerator.java index 7bf60d90afd7..a9dae21452f7 100644 --- a/plugins/android/src/org/jetbrains/android/compiler/AndroidAutogenerator.java +++ b/plugins/android/src/org/jetbrains/android/compiler/AndroidAutogenerator.java @@ -359,6 +359,8 @@ public class AndroidAutogenerator { final ModuleCompileScope moduleCompileScope = new ModuleCompileScope(module, false); final VirtualFile[] files = moduleCompileScope.getFiles(AndroidRenderscriptFileType.INSTANCE, true); + facet.clearAutogeneratedFiles(AndroidAutogeneratorMode.RENDERSCRIPT); + for (final VirtualFile file : files) { final RenderscriptAutogenerationItem item = ApplicationManager.getApplication().runReadAction(new Computable() { @@ -395,6 +397,10 @@ public class AndroidAutogenerator { } }); + if (item == null) { + continue; + } + File tempOutDir = null; try { @@ -404,13 +410,11 @@ public class AndroidAutogenerator { launchRenderscriptCompiler(module.getProject(), item.mySdkLocation, item.myTarget, file, tempOutDir.getPath(), item.myRawDirPath); if (messages.get(CompilerMessageCategory.ERROR).size() == 0) { - facet.clearAutogeneratedFiles(AndroidAutogeneratorMode.RENDERSCRIPT); - final List newFiles = new ArrayList(); moveAllFiles(tempOutDir, new File(item.myGenDirPath), newFiles); for (File newFile : newFiles) { - final VirtualFile newVFile = LocalFileSystem.getInstance().findFileByIoFile(newFile); + final VirtualFile newVFile = LocalFileSystem.getInstance().refreshAndFindFileByIoFile(newFile); if (newVFile != null) { facet.markFileAutogenerated(AndroidAutogeneratorMode.RENDERSCRIPT, newVFile); diff --git a/plugins/android/src/org/jetbrains/android/facet/AndroidFacet.java b/plugins/android/src/org/jetbrains/android/facet/AndroidFacet.java index f02eb36984fa..de9e8f017cda 100644 --- a/plugins/android/src/org/jetbrains/android/facet/AndroidFacet.java +++ b/plugins/android/src/org/jetbrains/android/facet/AndroidFacet.java @@ -143,7 +143,9 @@ public class AndroidFacet extends Facet { } } } - alarm.addRequest(this, 2000); + if (!alarm.isDisposed()) { + alarm.addRequest(this, 2000); + } } }, 2000); return alarm; diff --git a/plugins/android/src/org/jetbrains/android/facet/AndroidResourceFilesListener.java b/plugins/android/src/org/jetbrains/android/facet/AndroidResourceFilesListener.java index 49d095aedcb9..37e9c4105441 100644 --- a/plugins/android/src/org/jetbrains/android/facet/AndroidResourceFilesListener.java +++ b/plugins/android/src/org/jetbrains/android/facet/AndroidResourceFilesListener.java @@ -112,9 +112,6 @@ class AndroidResourceFilesListener extends VirtualFileAdapter { private void fileChanged(@NotNull final VirtualFileEvent e) { VirtualFile file = e.getFile(); - if (!file.isValid()) { - return; - } VirtualFile parent = e.getParent(); VirtualFile gp = parent != null ? parent.getParent() : null; From 851ec02ffc998e627706a36ec1fb5e84e6ce0cfb Mon Sep 17 00:00:00 2001 From: Eugene Kudelevsky Date: Wed, 8 Feb 2012 15:08:14 +0400 Subject: [PATCH 159/215] do not unexclude gen source roots --- .../compiler/AndroidPrecompileTask.java | 31 +++++++++++++++++-- 1 file changed, 28 insertions(+), 3 deletions(-) diff --git a/plugins/android/src/org/jetbrains/android/compiler/AndroidPrecompileTask.java b/plugins/android/src/org/jetbrains/android/compiler/AndroidPrecompileTask.java index bd629e58fc0e..83b77b39ec26 100644 --- a/plugins/android/src/org/jetbrains/android/compiler/AndroidPrecompileTask.java +++ b/plugins/android/src/org/jetbrains/android/compiler/AndroidPrecompileTask.java @@ -33,9 +33,11 @@ import com.intellij.openapi.progress.ProgressManager; import com.intellij.openapi.project.Project; import com.intellij.openapi.roots.ModuleRootManager; import com.intellij.openapi.util.io.FileUtil; +import com.intellij.openapi.vfs.LocalFileSystem; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.util.containers.hash.HashSet; import org.jetbrains.android.facet.AndroidFacet; +import org.jetbrains.android.facet.AndroidRootUtil; import org.jetbrains.android.sdk.AndroidPlatform; import org.jetbrains.annotations.NotNull; @@ -89,7 +91,7 @@ public class AndroidPrecompileTask implements CompileTask { excludeAllSourceRoots(module, configuration, addedEntries); } else { - unexcludeAllSourceRoots(module, configuration); + unexcludeAllSourceRoots(facet, configuration); } } } @@ -113,12 +115,35 @@ public class AndroidPrecompileTask implements CompileTask { } } - private static void unexcludeAllSourceRoots(Module module, + private static void unexcludeAllSourceRoots(AndroidFacet facet, ExcludedEntriesConfiguration configuration) { - final VirtualFile[] sourceRoots = ModuleRootManager.getInstance(module).getSourceRoots(); + final VirtualFile[] sourceRoots = ModuleRootManager.getInstance(facet.getModule()).getSourceRoots(); final Set sourceRootSet = new HashSet(); sourceRootSet.addAll(Arrays.asList(sourceRoots)); + final String aidlGenSourceRootPath = facet.getAidlGenSourceRootPath(); + if (aidlGenSourceRootPath != null) { + final VirtualFile aidlGenSourceRoot = LocalFileSystem.getInstance().findFileByPath(aidlGenSourceRootPath); + + if (aidlGenSourceRoot != null) { + sourceRootSet.remove(aidlGenSourceRoot); + } + } + + final String aptGenSourceRootPath = facet.getAptGenSourceRootPath(); + if (aptGenSourceRootPath != null) { + final VirtualFile aptGenSourceRoot = LocalFileSystem.getInstance().findFileByPath(aptGenSourceRootPath); + + if (aptGenSourceRoot != null) { + sourceRootSet.remove(aptGenSourceRoot); + } + } + + final VirtualFile rsGenRoot = AndroidRootUtil.getRenderscriptGenDir(facet.getModule()); + if (rsGenRoot != null) { + sourceRootSet.remove(rsGenRoot); + } + final ExcludeEntryDescription[] descriptions = configuration.getExcludeEntryDescriptions(); configuration.removeAllExcludeEntryDescriptions(); From 9aeb2af037a751a513d233fab902e50759f5ee29 Mon Sep 17 00:00:00 2001 From: Eugene Kudelevsky Date: Wed, 8 Feb 2012 15:39:30 +0400 Subject: [PATCH 160/215] remove all R.java and Manifest.java files in lib packages from gen root --- .../compiler/AndroidAutogenerator.java | 51 +++++++++++++++++-- 1 file changed, 47 insertions(+), 4 deletions(-) diff --git a/plugins/android/src/org/jetbrains/android/compiler/AndroidAutogenerator.java b/plugins/android/src/org/jetbrains/android/compiler/AndroidAutogenerator.java index a9dae21452f7..5121f6a31a6f 100644 --- a/plugins/android/src/org/jetbrains/android/compiler/AndroidAutogenerator.java +++ b/plugins/android/src/org/jetbrains/android/compiler/AndroidAutogenerator.java @@ -13,9 +13,8 @@ import com.intellij.openapi.module.Module; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.Computable; import com.intellij.openapi.util.io.FileUtil; -import com.intellij.openapi.vfs.LocalFileSystem; -import com.intellij.openapi.vfs.ReadonlyStatusHandler; -import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.openapi.vfs.*; +import com.intellij.psi.search.FilenameIndex; import com.intellij.util.ArrayUtil; import com.intellij.util.containers.HashMap; import com.intellij.util.containers.HashSet; @@ -208,7 +207,11 @@ public class AndroidAutogenerator { for (Map.Entry entry : item.myGenFileRelPath2package.entrySet()) { final String path = item.myOutputDirOsPath + '/' + entry.getKey(); final String aPackage = entry.getValue(); - removeDuplicateClasses(module, aPackage, new File(path), item.myOutputDirOsPath); + final File file = new File(path); + CompilerUtil.refreshIOFile(file); + + removeAllFilesWithSameName(module, file, item.myOutputDirOsPath); + removeDuplicateClasses(module, aPackage, file, item.myOutputDirOsPath); } final VirtualFile genSourceRoot = LocalFileSystem.getInstance().findFileByPath(item.myOutputDirOsPath); @@ -244,6 +247,46 @@ public class AndroidAutogenerator { } } + private static void removeAllFilesWithSameName(@NotNull final Module module, @NotNull File file, @NotNull String directoryPath) { + final VirtualFile vFile = LocalFileSystem.getInstance().findFileByIoFile(file); + final VirtualFile genDir = LocalFileSystem.getInstance().findFileByPath(directoryPath); + + if (vFile == null || genDir == null) { + return; + } + final Collection files = + FilenameIndex.getVirtualFilesByName(module.getProject(), file.getName(), module.getModuleScope(false)); + + final List filesToDelete = new ArrayList(); + + for (final VirtualFile f : files) { + if (f != vFile && VfsUtilCore.isAncestor(genDir, f, true)) { + filesToDelete.add(f); + } + } + + ApplicationManager.getApplication().invokeLater(new Runnable() { + @Override + public void run() { + ApplicationManager.getApplication().runWriteAction(new Runnable() { + @Override + public void run() { + for (VirtualFile f : filesToDelete) { + if (f.isValid() && f.exists()) { + try { + f.delete(module.getProject()); + } + catch (IOException e) { + LOG.error(e); + } + } + } + } + }); + } + }); + } + private static void runAidl(@NotNull final AndroidFacet facet, @NotNull final CompileContext context) { final Module module = facet.getModule(); final ModuleCompileScope moduleCompileScope = new ModuleCompileScope(module, false); From 13328e4c82276ecd31cd6343ba8edc595ac2e618 Mon Sep 17 00:00:00 2001 From: irengrig Date: Wed, 8 Feb 2012 15:58:52 +0400 Subject: [PATCH 161/215] SVN 1.7: svnkit 8595, with merge --- plugins/svn4idea/lib/svnkit-javahl.jar | Bin 327159 -> 328572 bytes plugins/svn4idea/lib/svnkit-javahl16.zip | Bin 164993 -> 165299 bytes plugins/svn4idea/lib/svnkit.jar | Bin 3078330 -> 3216672 bytes plugins/svn4idea/lib/svnkitsrc.zip | Bin 1978828 -> 2048348 bytes 4 files changed, 0 insertions(+), 0 deletions(-) diff --git a/plugins/svn4idea/lib/svnkit-javahl.jar b/plugins/svn4idea/lib/svnkit-javahl.jar index 01ecf37bb43cba6c012ce81828c67304f6cd0840..d7eb592d28f60a959dd7f5b11a64fcda5f4fc4c4 100644 GIT binary patch delta 60391 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 Z{x=Qz`CFMUE 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 delta 58974 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 JZzHl+^MA~uo(TW| diff --git a/plugins/svn4idea/lib/svnkit-javahl16.zip b/plugins/svn4idea/lib/svnkit-javahl16.zip index fbe729c06c7eacbe4fcad91437913eee5a224103..00c4886fd4f6356c6614589003617e042bb5b451 100644 GIT binary patch delta 19402 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 b;|knPEY>}13BN24_~Uz}A-cvqfHeOA&vjX4 diff --git a/plugins/svn4idea/lib/svnkit.jar b/plugins/svn4idea/lib/svnkit.jar index 37d118155a253872a68ad0d1e7e0711c0bedd02f..0087d15e25dd141b30ca93eedb855cad2e8bca30 100644 GIT binary patch delta 622271 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

v{c!S)Hp*5)F9STlRS&EDR_Ae)D*u^^*yFKR} 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/igylU6Z0-anjJ6 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

Tmwn_!8*n#)Zp={{hr zFx}QWZ9a0;?HvFv zp4x+>QIoSyZBQACIlxKF=P%vVTUxl*l4Dtz!x-(|;ab zb>V`mrt|1`)^QjRZ11tSUO%cuTewf|e6n-;FBKZ#yBGnXAtr9obzi`|^#&ADm!yTB zDNLBux4-Uq;0U|{S~=+8v)cFY=gS&3^o)?y zQO%K_tzqDlW$cN{;NL!`v1s}Hm=XG}Jepp?Ft>gSs?TzjCk`@1HRbzwi=E?lAO(wpgzbE|f@2*RX6OMA$f1rhYMNBmWsQ<#n=DXzyFSVR&7msgSf$3t3 z?)hee;+a_0#9QrO{$`b}AHSlYyWsxTZd^aVR_XUp{F23vkYUsij zxGDh{Wzf$ac*ueNQg(28)88_Z$SZ1FTZ#!dKQ&CeprsZgq3C6p8uk`b;t5g&L{Hdi zHKU-SQsqLRoD))U_Q@o?O)0=RT2#$o7x4+#{y@yyL#VwFM%eND(c{A=>J2eRe}a_- z5y2RjYm{(kRf0(b?A9TZi}3bU&^`0h)%ybo-owuZ)y!CT$g9H3gw#5hFk|em%+N+Q z-izOm;j^ zn{hC7#w?}?{b6hic8xrW5wyzd1kkr%+Nk)jC^q@#B>nWUyBX}#%5@C$Pb`=Y2U z4h7$q=Dxa8n)w|&R306=lkc}2w+QIc6*?LJ3JB)juxV&t4J02a9;<>&{Ka^Xfvdcc zh$`-sfFjMsc`6?|z#TqwZSUlRc*7cYGxgh+`fnx=2YCcnk4+|@a1k|ROCmvrc}ox1 zMiLs5k>29Rqc~ph=Ex1I8vFvpoF70tb8^sk z3MQY=1G(CO&5KQKzzxMXy1!O4^ASYB!)D}d{r*2;9$zj6g?Q%}D~rhOJfJ6y$xs5R z#KDRaK8whOdD>IGvKSY8;Q;r4CO*0~f&<3#&9A4dIyti!y5^=nt-uU*@>;S-k-QZk z?)CV6k8ss8k-C3ntRGq-$zOG}ar{{Ocf}p0-+r(l!dk(0nhTebQ~#E`*h7Ao`Ngf~ zuIBLCBlCM?hZ%WYP?dm}MYsEM@zwO_$iJc={5gMuM%E74#Mg$EYZ3rT8jFi_b_N9jpi6yAD7a{oq51AH=FH9$f+(xrj%rHB z9PjjIHn$PGcivRGb`)#wz7=?mnI7Mf4b!TLwTnBY*i}tyE?u|u#PzS1M@O7Uhfk^2 z=SFMGQES(B0nV+_qI5uI8^?vX@2l#RSh$OU7~T9yH8VYyvl2q%n7C9?@)?hmIr8rW zc}{V4rvzEMUshsNdxc+9YEjm9>COjeW4sLO;(6^0juHNA27f7X9 zQXTaS1i^@%Kycc_Z4{qTCHF*c$_r)HBU>WD)MDMo6@&M*@TUQqX&g|KaZ!DO?{kO_ z6v*8k{8`GZK&SOggb^Wu6Ay22B2lWlBvytAT#7;rQ$?YVDV0YrApNhf;bC0h&!t0- zLfp*tNfq>{scNeBd2=Ed9P%pAzo7^^9ou38beYy*(JaieK%cUA6XU8MkP;}A4&dkE zV{8LppVAL}I0gWnBi9^{lXXRS7ge*t@X!XAx4J15#}ee1GaE!Unvf!vk8dQ`6#iR? z^8KgBK~{Ss@-+@?;ZfOr(|e{K!x=^HKZaKXgMz-w8z7y#rAcXPJOs50pXDCeOF5lj zX=L;eWkstRdRpX!RbZ`8$AbE0YbRIa@Y36Ava^}XeuL7fu%`w*x)!J>F+EAnm(PWP78p8stC6%huq z)n4Tuk^=vvE>p}Z+ic_5(#Dk&r^R=Yy&-#Q%HANYYm;z8+`{r17%|(LpTfBj%cpkB zslZQ$L>j|Kn;XCQU?3W~eZ4V;+C|kqSmd>C^n}W1G1pv;km0!fo_f~M#0RZbgZ2s4@Ns|2)&lXR=^{zG7-Ouc`j}*=Na4$~a zOUg?VmH$A1|Aff{p8-dWo+6U|HkC!d6=1rlaB4_$y@7rG#w4==Tr!NFkEF{@p>x7$ zYk%)~&rjhaQ28|gt~1^Sa1bcubZg-xj1I`hi#;aymrnh7D9Yx@qWr9g>~XsFxJ{t? zB(>ZJL;`GRJon?;UP7YL;cgDNQOpr(MPJu`Uy2afyFr5$(Q!ax=F`IUDKj9L0On__ z>q@k6Q;2DtfCY41&c7`+oOm!R>D(2Z;^79lHY#Xui@q=vWM*f7XL3?1%c!LMQjpob zQj-_g@&}SJD9EVJ(`E@RS*ohCCCl##(>Y>cvzMXd{>+crD@n2`Y`YeyKGloa72P%Y zZmE(jsfbxfz8!~9A6rhA8OH^(0W#ojW7$Hn4^aEnAUswVTP zrc0Vnf>Q$ zvY|1^n%ibIYdA$D(N#3ic6Ad4}taa+Ih4SGP(5hMVWK(?NtIN<3~7w z7IFfnS0jcRSz+bdg=+DafS(!_<8%t;Y87v-!t#2~fgHs;<#WkP}?x;c9eVBDEG{o9tLdca9Lqgrv9P!5rd9rtl;V zu=1sKGU(`%`&It~ppg6{rg362%d)(NhU40=cv>dYd>{Ry)4y^hmw_GSwslTLUsc~8 zMPNSmu_QArIWs@UDTiTee+6nd_gB#$`pw!u<_d0WVe`N#IEiPpvJrhMGnyGjsXIPeYZC&MbSzEkdJDHsZ^Y2MhAVB8XR%v_j|a zQyzbi%E$ft5J7ExG-+r0(S~tcPyD$n>ZnFp!i8{7XXq7HaAp;FMs81!zq2+9ie^lP z`YJspVr~jufW9jjq%-=e@+$oXU_=`J`>~sf?tFlFw*nGL%vIsR8$VL>+y~q~<<>{O z{8XOsgUI~sB)pTZ9^YYFPV#?p@Z3OHzaI$ytPgT9UxU1@lh0$kz4{X1uDwbrx?-4n zj7YOHRQqfvpE?$OTgdbSBB>9-$qD&hAdy*q-NEAlUd;~_xZ5J8DHJsR*8fR}dE4Pb zJS)0I?PuOea)E+b>qLbN9dw*OhU@x_@eP7MH~FZY&lJbI5pYLgnvAn%fL14Qs;;_J z{4_{F{XMok0=!6+u79PHPMs2L@qqFBar0Xi!O&t^t)`+{Thp#{j)w4tDJm=ByF|fq z5<#>GP%g;3n8Nx4+zCoew13UkpX^N%AR4zS_WQ7-T-?3vHfoh9JkueaUUB{TRZA>! zbP~1yKsuKGxw%DB(>m1*Gvy$BO^*-Ae>v|A_qo2%7+AS-KVh9VBC(6*Bo?54oDAAf z;P|TJZ;p+6jvJNt$q^!@yai2XhS~HBs={U*FwUKh&}FO+nc0EiF}To6=TAQh#gQu1 znn;a&Vf)zHh2d11-XyH=qnkOyEL2;P`JR&7(canE-8s22Kex3kf6Url{R2qWJxV2w zdTzJ!_*}4pd?hvVdBmBp%_M1`G}=JMw`kt}Q@f!JoYM}f#44fB_NB@yh|lO~H%9v& zAeBBPuI1F8BP7{*#wlnGf?|KBw0y6)vP|x4FZseswsa?RU379~u|2DC>#181 zMNYf#x{unhu<%@x=+hxK&NoMaa4cKK9pxjxgSHv?Cg@3ptG@Tu*Z(u-!e+9U)h?c~`r_bP~<-ECc(C|A*cNacSVdwTO{%TeLOn<}P z%i9&|g=i70HRgupMME+M+$^U)!V``~U|8p$F2UuNUfZK<`G0qkys5 zDo0N)XB9n9I%5WXy;qNS4kD8<28{4)R8nq(#9nLT139uMkJV0V#ihFnv{pLZIty=) zf=-vbO93W0wyZSHo)_l zpEY&tGBPM;viv!t7-Vx6qOJ`Dw-7RJ(Br!6FG}8f&2@OlI2Op-Y>KplI4@cKUxaeG z$0=hUozB?{4aLu6S5vIO9pkPlf;S~XD5d$q2@)gya?&c9;x5Ku<2NY)1o?fyyQn_S zIrniAC~JYiu#9zsr@!hzF0W==1o&{OhDNgHiUW;qLwkKevhB(DoU5padPBUMkZpgs z*VXkiuznK!*l-*t)(eX{vN8?Emig56TQ4%yxIRDzIh#*p1Lr%IM%Nh_HF*4Ii|TF@ z&e5Kq%)D>s+bSLPVrvHQ%aXUXtK)KleYygC=h-2xfO!E; zL3)EsN5s-XssRU#rX}qlzL5U=yQ}bmN`uyW9xrbfFx2L?NfHHEGR@;SIWw+3cn)ZS z-Xnr;T20N=45(La(QfZ8$tyU)+N>BkbPw)=CV-4XfsnY$lJx;o3xZRRhvckr(v>${*ed!b|W2 z$zQ2Qn+0}@nuZJTBK8u)e+~|Ol&a7zvjF>$Q8}Dx{4(4T+g}`aaXpg<+3-Qw!zY5S z;xT9;2!seRQCNu;CKHA3oN1y6DJ5y+$rn~S2~6G_)DuuX4O`r!5GaSAN9q?nI|+N( z`z7$o6LT6AvnVf62Q7(NdP1wu(hmKgh_eJ~sxtC)o_Y>|s3EV%DjhY~P_~w|hE}^> zbQ-d1^TvBFwkYxtP9&-+J&lwy>I6IgLE6HjuXG)DVV}MVnS^wQWl^Na)jT@O9>e(X zK<(0I1DE3U>J3NN&PlGQd3tBtuJ4haw&Fz=S?zEAwSOEQCsf5l%B`ft1I3H@uzA^75$AY^opB(+=Pr1LDnzm(=!aARpXjhZzqA~N)&JG1zUxn+zEqQMOdm0 zU9Czn_p}N_Zl3>g7e!$TcVC5E-_=+J?I=HHYJ~wj4IJ$cp=dLMD1xpz2PQ73k=HXvH|G+w~A;5u%RUdXm&q$r_A*kLCg2crO? zJtACa-X??}4KWVh~= zANnZ<`<$c?g%P6~P9Xyl>1`2SG?_EvC55}_GC`wgLX+pB7JqqaKqNzsnjD$l-Y>=s zNp;xJp;amyhGBPYQ&#r?LI>(ef4R4qP!B*g>_BY!k-=@c`Bl6;=aSy5h$Uso!nnU^ zEbh)uT3uLt^bcTy_&FLJ!dC3UzWnk>x=kYIF-B#(^=VieA+>*bc> zMiI)%bZR-3R_-3fi5Lr6wqSmw_!#qVAco$U)nh%! zn|GygocPbLLraGsq2YTZMr=TPBm&AdppkonA9}=YSX>8Iq_>d!TxKO0-e`QWk&=4( zC9xL~ulrF=N(%?MMj{ZqnVP=D2CF?p@nR*jSKq8vuqT~iApqR5q|K3~`qcwg)Y+~l~45r~@iGg097{Kk^!xA(;#Q}og!;5Wl&}{Lr zgRI2e6A&x(RJVaUCM_orv^MoQMEXe5 zhh%##w+KEus~0b6GfUX|D!@Xv25QXNo|?cT%OXbU?aWz$tAIjK#(2*$0f~M7b|ZNF z8e~(so0lH~gq52Q_ae4gx(oYMTO=;74;i@ zle-Ci`{Cmc9b@KAH-9wFD0NyWKOhy)B`tlb*Ckva6p(&;amxeSPGLcnph`QAz_@9; zAyybtVD?LgnST5tgub;#=E-hG`YN=X5SrTXgeR0i*9Cm{fNWtI692qCf2h}n{8HvD zkjl<)-u&58vw1px%2(=LoCtjs<6U7B0ZL>VrOq`6fjgM4LpuB=irj#n1&;) z1vj_&rNhLoSR2a4hlI|~mXt*9t;P3yFD$$Tf2ydb9XpYcyc+zkRj%Aqz=|M1UUGv- zIzId?OrtO(kvHtv$LjTx@Tc)bS|;}6thTqt%WR`fs@Le8Hvo&+83Q&bGFycs3`Bn( z^e{0Ji49#r_HhiKurltlYmQ}sVJD@LB%%2#thsSj z6oFM=vP8DSBIYtaeO3O)E9IdiHbMA9jQo*TCTq@=3p-!$%%3%2F81F&T9^~8k|Ko` zcRYSoD}r|DAV6ZuUIXU%};g4`_u?eS#kG72QzhNoK?LTQtHpH7v62E#w0XEiy7HC#7$iwy#I6 zpWBtXg*n>R<`)?HBgJXA|0xPhs(z{u!%V#ORU<)C&x}^izTv^1gyC5LUD?2o< z7n_N1@(E-Zi~gngiPS^JeX(*t@GthF_qq;bYh>*PItv^ytnvb{ksx;z)U#*)0<*qL z?8*9p?+_d}=Jf%=N8`O77lB;RJ2LA2XhhH*1EA{;;(Ke;)h%z(tn; zql%17XK-efm>g2816df7okZbGr`0HAS~f|w>~-4nC14KX5z&iS+q2H1u^*Hv0G~m5 zcdYP4D~&E?)#Q)!+QVc(=^4b`(`QhFm{v=4OfA^AHRGRFp6+dvWn%gXSF4o~4WA<6 z2}rFcz^3PH6@O(&rD4*mXf)2KM@*x~-iJGc`t#F%fX<9rgZ|m%w=;20p)aOQ%79i) zXNXPm^?uv9Qf(g_W_D`Zs-<=ylN_dfrg#mi%zw0j~RBe z?o}T=V|MF+bBup(e>B6)?6sU{-63P=Am9$kz}gF&xxqI;Q%kU)zN+ws?%cEU?+?_P zI>jNIs!-2tH}I`g4KYCd$1YS-3rXC zOV_(%n2?%{g?B=YF$ItxoNIN>M~iCnMYpPs;&t3a{c$=mN}%U)ZXWL*3fouYbU#wp zHnrHIvbmUCH@mbwa~b`McG|#-@dU``&^Cn@5?NmDQ%b&H&6N#8umMk(1(~|X2B!s<3fOfP^c@8#OZ3eSxGrF-P4p5K<7@8GwTD7cg44quEARPI z;#Nkq7p8zI2Ysgv5S%vYwZxk0=6!TQE4*xudui?srePQUEazn)aADlXSOJD{%_0&k z_q3%vpPrx3BI%cRblBr=h@=fw`O~4&o_jIX3Fr?fsRcnb>jgSx{|;21Vub0ouA<)mY;jS<#*$sg#U0TBKE=F5EqJNYR&N9>)641n`__Ec*|$m zxp$M=frnGWMzJhkbKrv+dj%8?jcp{LFTgJJledIRO(&4UN}95AmTAb`R~LIpPRLc+ zjEcGq*jwA>FT3rsA~(5*j&w^`;rE;Bmb<}cEZM)HEmbF$9K@Qy|F&H|eISHZNKx2d zYzcgSdbqUN>*jlZQg__e_j_j|dEv(8Q??Okvggn_668GMX+u-%PzQKB!K%G?USygL zJ9(v28!>NBZ@LNG9GcJvS}&dkU2z#}7e7WH+Yj-mrjJLLIl16mFrwMUcHWWSV1lA8 z<81=Hk=Ks)yUOrqm(yqMQzj}Dtk)fSlCr@2zqW#ZGKeIwH^t4ZGiMxw=s$@Jfm|+C zh37A{218YEV?%8jfdP6962JU;H)p80a*hRrBSK%g3uNyM)h2e(7u2$ku0c(BIl#` zL<#!hFb_*P61(pz`(hXl4*Z%VBJaBx<{oSOhaMNf!%tU#lMYA^FvMQCkx`CSf~EFX zZQNThp%x?;44;XrylHL4%*BSjfpik;#*ro7QMh^ionDL@rK^yW)#81o&65Wb9jJBm<-kYXiI*i10#;UO#s@W_K z`;RMu&M`?ltpXri0io!$CB5Rf3+i|<5kKxcdJqSlArx~no%N`o z^ark#n&{{O0&;!c&$OgNZTMA)qUX10;hVt5OLKx-kyTvnjO~J5KE~htEu)@vOtxRbCCE@o$k1>Kj!om&u=mRuof8x4K_f-YZ;Tx&OYrKTdLZD=qkCb)9N5V zPue^Q{bHg&St|@%Miz!U*@ANIpw$X(Up{DL1M-KPaUV2ZS}j)9&Rpq5pFB=aI)Y#iYJ86a5&> z@ddC$`%SJc%IoQhzQ>(jHr$m)6TNuX72gjs-{FRcA2ihC^#`^1ipn~IT|XcK5#YtL zp^Z!I4~uq*MwhEJv~i1dlakDSLu|yH5ge&(ilRzk^Jl!NA^Rp7XIh*{Wbi4-YdTJe zb28;}21X`TjIef=(k{#Um7piK-Tonxk^ms{YuZjM*tO%4jTmpvS01<2b&%T{p(F8# z4WjcS%8m;BB}vSeDC$Q_0M(3?Z8f!%I54_RSW1_ zByn}>gFNRV!B6h;)Sk!=>zB1RNFex4ZYQ)U{fvq{vX6Pd zu|8^C-A4}#XOU2oRxS|VR4E;sFkI7HSuAcS0lLiT+@iZ<=vn0&Hucc}YpRJeoQ#6d z$pisjgFLW`IYhQ0Ox=p=z~%~av;aU@2JJI-{3gYDrAA5TrtuJMg;~M4kku$$TPI)16|@g;0zSi-%DpT;K1Fvv|;* z2f>1L5nP7I_JSJnG#J8WA{z3wlLM3(AbV&KZDI(tn5^vc`Lg-|8S;(B$ADM6ilKx| z|85z%ABBtQBsTKu1=yhsEz-cu<)y41dXC&i8k`0i9&{>5A*C;Wk!AZrM}i%=z1%cf z=`Z^%M5fYh&D5Ac4=3(U=m@XYOv}ly{L)P=qz__~`n@yCA6(yyL@z>u9LU@ZbG!a; zhYpfHw^FO}m-JR!l0fV{4!1rYzKcRk%te6oo{}rteR8Cns}s?c23GJt0LcG$;XRYt zN-%?ifFP!!vcvq>Y=@C%u)+Y7=9~@52?ZFCD?j9Jsmg}@1pBY?t~w9W81%m`J(-z+ z7dnV<<6RnRKH>jfY|$=&d;kN5Xi+SNgalR72G_0_GpHExuNZ=@7%;2oL#*ftSMwQB z^N1@y>Mrzt&!M}5KJycOd`h&x*v%rc750QG2k|$;G zup2vJdz^O%H!W*O+vujKfm_nsOW0uRRxSTs)=8^ax@vA}8vn|EHm6D&;~I^-+w$|^ zeco{CZrJb%#}))!z>)zAuiWQ}h^~v?UwQC5vXcAI>t8%`(uckQO%z`8&2_rKQl7DC zRYLyX_ZR&7g62HDx$p%1N$}ZvgF`BsWcn7oZOIlEw*)!o2VVS!WjQp6)VyAxxeU3b zJU{6g?nO^)rQeuSk>rXR7l$W`+Be2ZokRKQ2t7Ts7Dv?;4W{XB_3VyQ6vvO%@5&OS zzB7sAtv~X+ba(`&0Mn0L_9%k*#a_QBw-0ujeA`*-6wj6?j-hC?NsHM-gBu7Q$Q&@> zEY{bkuNB+YKrKhX>=1km31cg|m-sJBPCWo9x%2N@N+Qyh{;E(@yovV5txDdY6- zRv8gJ`1;1uith#br!}*DnE~p_j=7^xHY(3<#!voU7pUVthjWx?pJDvnv}nG)!`tq& z#UF%T{4`6*0Nz*QEsK47e87r`<{kN+ry7v}S>Hc*K@wu2L^ zp@!QTyAL#UR;#7HJfdot7cx|V{^Yh%;s>cT7Bh@VfUQZrT8NHoNdo6*-qoe;c2PLK zU*>ngR23}eJD5UutzoxmN~&chF~`wjNPnhW;bnIj5p0vB9Jy|A@l<}T!5OmTqvI?# z&E_(H3rA~Pqp{6wM_XsH8EFZ;2UG?>q!mJTLtbP4SVwaKSxEckTqwKE^sU`v3Y2f& zD#jf=plPy<8K ztce)Pg){#h=IGaJ6H?PTM27i|`sNOxI77BK09?YKi!f}i8DnVRZ)TVH;(NFnRjgUT zNR(iXvw;6y<10AhkuxVq9_NljtOm5M7?(dTC#DRi zJYXW02-|B6qgUA8FfbEcxA`SlSZ)ht{Gnf1Ge2zyV-}6q7!?v6W_kq|u?i{t2bsxC zSAE%|n~^Qou!*^02U6Hv;V(zuR1MR=cL!HwLWT___(7wQKlZoMm|TDajtsRuO$sX7vYjlBV}{ zH+1R!H*dbhA^xqC?jSuityXc#=8&_;DiR3o5Yy0I{sdlO1~f)d+?sZzTM-ml%p!ca zYn=XN6Ezj7h+o1yIQqNr%@D3H346w_dopK?g@Mts0Ij$wA?_s|=rl7*U-`^Het<*ApM->zog3gW7=afiHP)0L zJs8dwu68^A>S zX(IX+J9_&D$4W9WRiR(l!ljX&0dQe1Sf^`P-{GFQmzIyP;hueNRP2SZe2yQ|aaP|aegne}Rv%nF!FnV@Umt7ON5>uiP(4^M z+}<}poo?)92s!-IzKr&tIRO5-LbbQVoS*SR^|!ekpX^@}`#pEt9G`q&1H;5NA4;ET zzrU((sXvJEzclxic%}BgU;*U3Bg45?AH2kK82OT{0uzfc3`fUOn^VSwdL6oZIZK45 zWs|>=`j!6#&uqd)wzo8$ig+|mVRH)kfi^Z@IO5Za{YovtI8w(QCj;0B{Gp{6SzMTx z2H{MJ)GD_H*3*ZVWYNi~0>_sZVL0bYgk6%y&72W|Jblz@qFvUFCBvh5BXEIEv(0!l zu?xx3IZKNWs4ow#y?p(WJW=WJ5R4vWn9(yr03@9ZXBALn#A)Nn3EF?WnLJ5i^8~Eg40BA8M=1!7`lH zd}Wn?*_5%b7L;eqvzRKd%&*O%!byq9@JH$1@wvj{k46Uzs{%sFCdt(Ql%qjDrrz-Z zfsFlGg-3rE`4y%#sjbf_nn0SNhEiopRL~@J3d)m~XoK-3b1|Tq42Pf0WkZ2<=;};r z(YDr3#AfNVSuKg(b@h4KGf0DF@4kz%qMI*)tCB;8Pw$Dd<7_m$LbvE^2W>Ouh5= zs*gcXEVFs#l1;-UK#nGj?CNqi>#h>6GIrZDd4=p^F6%Sf!-YkvC0o__E~IzOD(ePG zhajVulG_3lkknevQ}}Ox_;T*glAdw;t-cxWC@cxA8KeEV+A|ok5roK@(G;kU1u*n z(l~m^!3h&4`To514bI26x{r?t*b6(my|RK`LKCXFcpQ1=&KfimP58QERuh>i$!q_R z%>*q=7Qj@o1oBAPpo5TVlJS z>I%HY#Jjh(6QKyhNY@my*kh#F?7$uhg*u^k6L-XZE?es<^^Yx@w;q|zKjpfMRls(I z%~(4?{d-iK9}kAW#jram*+kMnq$5pUIp1P75YQg|MQ(iJU_#r$(WINo#;YiX+$=tL zTwIIXk>@90EahcA(0GG`7T4zz*mpFMnN%%;&^|K^b#&rU1S23#j&{M0iHQK@EU_P; zU{4H2BS#MuAkt)Usr4IA4?NqI`d1fBW9#&Wp!g$i{L(PGcIznG^S5f{_dq>2Q#JFA z0np;GR5rem+nm{iP2(LTkMScDDC?{4Ya19e)YWzRx0O1j@0Yyrtn~^b4D+i(rICi^ z!T*?%z8-{EQy@2sLhz9_znKI0tQb;=)ulOaaTNoU*tM`8FunRj90QW{N%gMp_-fF3rI>DJ25EaxtR# zl3iF8DC55LcIPD9lld%m+EL^2H7Pzx2G;uKe*VS_k8Y@UV9F=$3En8K6}pDe6|usr z^=HJX|K$C6VV;HPWGYXBe(DvK#|^qprjSZU@jSA)cBh*G@`4s2D8nD>>7W=w0Lyn= zi!*mUa=giyrvmu%9*fH3Y;5$+zjqAwT(UWvW88SqwTmBQ&T?$ic>Ap_yBmZGUza5y zU-XH*?%_^BdXBHK-OKs!$`mD1cmw$lHh8CaOgq7~?p``O<1X?Yn^e>8pr|O&aKz}; z*2B?*68F&Jw^il(vH3AbvA1k3z*NBfaVa;(5fHJ)5Pms^5s%^srN+Ux*JeaX4CpqP zhE>k;Q3A8}%jqc~{1&`+rBX)9%&n`mpsw1Va3LfLXdTz$RM=u~npE1IkJnqi(c0cg zgkmNEQM6?IZE3a@$Fz~<{%7GkFg0u}Eh*KX#j5=eMW1@%;V1uKI6|1bU z;VUSmm3lLP2hIf1VULh{?3eBp$1D~z*Jb7hGej9xwGZkY3tXyBh(XunC4iIiWV z-)_99oN^Bqu{{;j>pX!V7BBX2S;*h3 zsONA|@bh8@*H8ke8zbWaSbDl%7f{sQ07LdcMw8qz==!t4!1(Z=x>5y&0gTzwYKqE7Luax5 z!!I5iz@bt>QMx>nZ0#D7YDmBp?$So30IOTe*!m=+9vW!7Y+Moe!>0q_c$Nacc8lR7 zJz+4O}>be~VJ9e2$pdI4Q5G5tDX; zDLq8Quk8Ef{>Rt4sYNfy*&kS8L5HIv7-q81w}&84)?#rQ%M)ey8$ou%W0)=3Q{aB| zftdt-u1%;&qh#i#?pfY+AM;wXGMxMT(MZj()%oz}Y=jacEI={S*tSk?=PE^q5t$9uVUIm?^Xj*Q%Y#(;%kI}+aA$A)Lo-kw2G zb{p^gQ_nIzvy?{@$xu$t^rBSyNt*0(0-p}^s*9T#S0+W})Dg5NE*?!N?RL!HD1I}E zM-u=MOEL(tsT<=wCyZCpW045H8hopg@%L2G*F7))!{qSL%c@KH zdt@E;j3(~ur-c>p>d&@hgK;zw3kH9GUg`rn;xX5nDnN5ogSjfprMD8cL^bXo6j6E_ zxXt~}<9Kq4J&*g_De(uzR~T8>K*@m!j7J#cG3EId`h_j=OVHLSB5C#ld6-bMPcwch zWyd8HuQT$qMhr&_j!Y)0Zm|2kYxT6v>QNk5i?J$6 z4hu8sG=BuU(qINQwna_^dySdumXW5KHMm|pBZmDg^dS~op|D;eD1pm@uSw7LT2Tu* z@nzg-8n1$AwcBa7D8UfY{foC!aA~)UdrhqaGazy3H)5p#=92nSjx130d4VWV2(Rt~ z32eq;*M?{-rlrYI=vEK|!w+AHdP^Mg*RJH7qAkjgx!?zsEv&Xu5oA(F(k-k`IXE9_ z0U2C@U%b*9C4cvVlgApPhYO5My%R6C`V;>hocy>G6v|4sgfQFDmR~3fi7H!6|APWi zY7D5ie`EUg8F_k#5OLzrMY56<6M>Dm_8Ntc{eB95NFPgf&Yu<;T$2zu*pS%oprzLo z<9!GDUB-A-k^oHuom*%f-8E!}<(RWBR@irpBhfLY?;9|js;!6RU?Q{cp3pFBwx+b- zWyxPX`FFiO)0|RJufsBG;;#bwQ@mUW|2H6AD%q@^Z3?%;(#m;dKXJ?=|9r4X-!+KU zpZT}Kl@&K$=u{$t9CG&0RBf$`dg1h>qUn@1v7`=5oeV~e4)5cdoX4Dw7dCD^Gn4xo@=uv6P`vO7V`0;h zPK(QY+D$be-};*$uz{(t)i}GjY!_sT(WO0$N=H5$8{GB2J=PU7upbo2Tno4;L5C!k zfDOrN%*Aq@)3D<8Vm8CXx-3;~FH`THc$%l{6IKobvBRC-jFX7ncv*t$X&+EBlLv5er8=C`W;y@u2xbAUBuHY5Ub_HxadI*z3;I`{Z%k=r z9;+SIutk+`Q-ZWTZaP#99-JA~l22BsK+!v+8Psh(FqZHERv#qU5CMtFgkHa&w=pTM zaN@=DyF_$0g+IC)TvPL&zdfwWl`&V68z&-Ul_fV)jJj1DR$j=#(FXwc52ehx7i~HZ zn%aqfVK4r}nvUpW6s4f@u|w4*tS z26dJUVZW|GH!fKv{IaxpIjFPiU@89$e^8`E)K9oBJh7L1$EKj0?4Tlho$fT-RHpi0 z4Cc&f+EiC1r?3LmG1nPqEEG*FO4>fJou_C`Q^L3!%fqgg#}Cuu?%1Cbp(A>Yq6?T(PRn z#jvl8>}l|W>wK3d5$-h5E)NkgT$xlycK%Jq-i;~_tSY8<@W2~I;BS9wF(CY0WzZEA z(sdy8Ke(!VpItyrk1V#xecId#>mG>rR-A!P!0&Iu@@}M1$kA6It{`ZRP%*SIDDthR zcRKZgV2;8je=gB3;-4|D1Dt)zDl_riiN?N6puN1{Cd>CL^|i!wb8 z_iW9H+s>ER%d6o6el1dl`i(WTkkZ_BfD3->JLwzT=M12vB?g7baw|jlei{ep!V~k< z61bpumFIDyFKx!qvOtXB(coT9fHh4@+_>Oh%gQT54WxNc ziW-=aeVY{mMS`M7!Pa>l;rDlNs0L^c24ItCqjBER`cEfLp4npnu=)39G5(RAEIO!n zXthGIRP)6D$JIMVXA*7Uy0O_&$F^xV1ibvKFbqqNg-7ym>tfobBakbmUPiXJ5s?h}OTvO` z6xF=&iW`YP>K5t9#Y}rpsKC?fM%>#Py-w2JoM3_z+-=zz57G^J)&qMLyvFB9(I?S# z-Hwa#Nq-4I>v^$V`8}f1MLaBS_YZ0oP-9G^&B#_eB0q?EeW5n&BYCO&Q94p}aUMn$_xnAyY|9Z4jJixE)b`WD%x-IXN*- zn63k0S7wbegI63$Npe;tTpx3T(l0j1U~?Ea=D_eAgxIO59DzpP;hH z+W)YoV~i1Sko2MeBE4R6!P03>x!CB?S-nrBpDS!Y=Vpnle@mtx8H2Jc@k%4c_t4>k z9Gmvc?n@=RvwEHS>rA#|^-;dA`0TBxk+&T{{5%SrwoNKl=e$Y`;yl{fYQtFZf!9lE zOD|1?l}R2>wxc^AfJnPYltzn}AYcw_^v1&&xL_2TRUKg1=tnD0rBq3vT+k2;mi30a z%dK$3RV?!L=5cox@Q;p0rH4bIw;-WGC;pK_=CqzUZq6W|axI?{m0)OI59vpjPo)be z5P>h$z-1AFc6!yS&V#hU#TVsNOHevwWoFk|F!{sjte5H5qynq}{ZTsPYUFVHnJ3KF zwlWBgfy-be$GM&6+Z7?3VtM(t=U2=(Ft5lrBR~Fw-t&@Ob({CSb$DS53&%5Ko~dhl zS+vW8+;TaRuOrJtHvFfL&*`-`@=tgG)ZRp3&A2hir$SmMgA4YVhx&E;ds5cwIiP7dihF`vcyOL#zaw-oe-hU5COpFYulz+cSQEK+fmH z#VMKqD=3Pl9U3J{MAdt<*jboYR5XyyU_;^LFHE4s);twBrpb05xzVjQ7-rs21x4fN z=gh=lOEM6X#qsm3&q=|62=3apdCl@%`|B{DQvz;ip$BGkU7)Dpy8KFExN`e5H%@5I zI_R4X9&2E7KTTZuyGvhMaCrlO-6DHi@z7V1Lm^oC$NTt1mK8eZl9)q*v{Y58E3Vm1 znRj<+nscCr3rgcnzs8H6PQ04b5f`B?y~4P&c_G9nnhN(O6RJeL4GUk+xxTjoc~ZA> zLu&dyy(MKvsMgl1@9Pv>pr+9@=j>%-e$GS(br~(T6XnkdQ?KeVfk-dN zg`-aYPh3x7gAN{0qPnesri}8bpxbG`EmH%4R94p5C~Qm-^DQ9$4JO@yp3MFjT=l`7 zM!xAfy>5RY`+{ds70EpM7epY%Spl4!nK&%ra(0@N_kQLwo4fDpA0O0wzYb`d@&svk z2cPym&JJ^Z{(wIHHFmq>9`09gnI0@> z<7hyUHDvCxhtIZW4gDO?g2DmC&~IY*d5iI$ha#n46Hua^8aK>lIxKq#O*u+`ubuXs zA6Fhp?oxOcJ&SUyL}C@QsXr5q3tW%l^mtvwcdunEPYJJo@xisGCY?iy4kU^m-{&Y% zqUR)@J{dv+1}bL@cs2*)&G4c=2^5jcjf^JxNzv4Sa_CMYV)(Qa1c$Ig|6a}I_?C^U zw2ZChjV{lO>~LagpiT3TMhV_8IGnRROxS<+8?}b+Rbq5FPh0bpG?~2bpgyBPy$26N z*@eY^QL<-x?5&^RtKJf3<9945d9GD1BlD!2u9htUQYUanOc_p*IT`0Hr7(V>bFWkC zFquY6^6i7N@1)w~3s&nl!(g7-9Gz9xtB5m(wvL+?O1;q(C`u(mvH=3|zi9kK&#M9! zcM~Tr0pEcD2n*QRY~c_i53oKZ9|F$P!kPSFa=PSN6Z|=;GA7w!ZTUG5WfI@SLfYcG z0=Y(do|at28n)VGIn+b>MeHq-*T5Z?R~MXA7qzLuyFXio|0AQe`b|gx%6}ro-v)r7 zHQ&MTa=7$?Ry3;rD5}lz5^@^+KM`kvzmT%b|JjNmhH8ZP&z3L+6vTgzN>M{)K>Vi} ztG-vqyl-8;LZ*Maudt+T(IK}nF+er`msm4_@&r}*jkmc3OIK$2?@3?)V%8QGqQ-W1 zCdQ_=D(0^4c5eS=*p#SDDc~}r^HVS;A;Chzk)MUM;*J+$ZetP`=hu?Zuv4jYxl$ng zjKTNLR{NmUA|k{52n;|!*g1=Eh*GPF=6>Gyo#ReBS>3);1nKfx?I+=J2mTG-Cm*5> zTSd@i@2=Rd5lZsG0<=Vjlow*IoxMAe971AbWT-K6HT;zJ^}687Bosjx!@V5)pf)b~9ZmhI$KbjZ}ll);``k$DX!7*Pu+7le`r z^?cnD*H7at(qz8y@hn*nWA@yWe86MCXq3p+I}u3p#?O$n-n9!6W)%B`vPdic4S0q+ zpb<16ul{r}QIBP!zO&Stv*!5Qt@SChaVo+Tx0Kyy?i zjHGj99Bah^`!()HV8(Gj^Thu@auP~Z;@Sgz_pdEfde9m=MY>T2I5a?7)x+Wc+sFUy z-5Iqh1u$mx9&t0T@;&f8SbO$#2aYWfW7)3Fy^2fY{2&k(>K z=g&=L<>;T7XoqAo54qF)WtP`H{(c<*kU;-67o+VUL;+mwlm+%+#Rj-fO!X>9X38)*NI5rIK_WDTCA%DUu=TPa6SnL- z+Cu@;EduY{+qZwa-2rovn?7o%aK~!c_nrWNg+MQh; z^)0Uxr+?65MH#EXqYhj+W1Cv;n+=M|0!|rIOrKSi_{*Kt&_S|@f%#rG$5$B;5aFto z8)qnNT1R)0KAVpmD(e ze`zx>F&68^mO22i`+?guw&#@yBp5Vs4M8|I^)NkKpS`*YmZ7XH(Yp z@JYPmT*lI$=?qp@ON9<^#ZUL$5HYqzuBEB?3RnJfK1T0l9EcOrc94Nk01ShOQ$u>n zHwAz}{6LTFvN9c12i^*wsB7Uk@G?ykq%q47_S8h^0#)x=S<{zVQ~yGF)!Q1&y+?9; zuVm+3B7S49MBtnvzH?pn14vKcUX|{l+2#$rGQi2d{#(x5!zN|_P~O$ere%Lu-qpi~ z4uPny>0N=UhN%7w(utJ-fV67TWUru?+6h0>U=*ypmb?QcBZPQB$+r(AfO>$*mjva9 zI&~J>1ib=rW6pmJ{DeG(6;cHAftz0n%msa*%Rd3(M?QrVVg&Pnou3Lc0DYjzUj^ww zIz<$61oMHP-wfOVeQ*@I0rNqge-9J@c_7Y@2k}QZMH9*cdqbE906_eaPT_?N!QSBJ zR}BP|{X>r0qykRVcdH0va;^oBzD|_|i9gqi0)#QL=K8=o5#~n%SHR!!<{blDLErG_ zlLK?X9-#9DLHXfNI}jcXAF+}arHdp2Tft3);z3lvtTR!H&!ljqN^VIi*+lokU5Fdpg>3^O*L-9K4({KOoQpyqP!uGZ4zFC1@ibA+_|_+$yAnI4}%uv&An3NwgjsE-YHk zh7=_BK}87ncv-^M*TTxQxxtDVNo%y|&OiziBooBSQRp22k_lsFD3lB$4^{brf=;3h z5gf((D@Qe9i*TZXs0d=hT1araDAjzPR);$n8^(g1pcb}=r+&K{#NUc`wl*c1gXdXFo< zbz^FKxg%rab^}(ZX|yV*Jm=S*8AKTo7sh}!i~=;Em34k8-YS41-*MrRSty>g9U9WI zU}rsW_IB}oqeCh;yf|ObunS}YzGp*xVCxdF2K^N#iEP;JUdYKKUcXJl% zZtxyJqs}ACqf4_(vZPv2#skAG5BVnKLEqDdONzi0wxMo%fP;A1;Pscw?E-| z5Jq9n4?9TwXWwS%Zol78`I5=&+U555R>;2I75T|~ez1WK6$r9Kh{DXllHGbm{O1b< zq8asd5)=~oz92P_%}6LX!o4=b5O5Eq!H$W5f8Wow|CTHGYP<_3DAp4?pK)QPuiG!^ z>6fJMk6Trx6aEcegI*v($awUV@5U5-)USS$3K;&6V88LEPUSGiEb#wD;NZ5S;p7$ zb&djSTpYZOhZajdM>EuyW&L9B!PEg$X|G^%7SjGbj7nOX7zl5{a@M}@7ay@`8O_}T zt{D%5VK{`UV=922I=|P&(BA&b%24;DrHinA;pAxL z=y9-_f&mGg6=ByHdE2`KS`%VuxkJQi`=% zmapk#`NQhU6cZQ;F4n)pqiaA;Gx&fYcK>wc=m;7GT+nu8*Qak>5M_%!Zz_r<#4 zn@(WRQfT9qlaFh#{`2qZ>PF0r^G{v9-JjGYpRFjCZT5n+V{L7;rBi^fzHvEe6VlEG z?ag&#`;D z-d^D?d_!C@+s4hKJTySf8o}?`kMKwv@n$OjX(L8|ebkIYN2q?p>l8bRZ~Y^4uMwxz<<9Hu-1#>l9=y@`Osc^d;`v*mX~)?pM#gNsD2I|a~#ig?x0h~TN%e*bL#T!zm|i@ zwZ{{7h_nb?gSC1)b=Re+FsQ_Kx^NZ1&|m6Lp7H(W_F_tBox}B9v!zYGBr*yfwjNO8 zpU{w8ymo+wp#+ycFLniQ1$RDNp2{mzl-s}0mgheP&~9_U)Eh;^EeXyoB=qIQD!1BH zE*+?j?+mzNKNLfeuc5TA2*%hqk00{K9cNs+%o5e8Mv$rtjA2#nS^CD5J&aPfhu{G6 zEMt}p`G_0Wb14yV{X^ys?<*at`HIfNqQB-44y^&PFTYZnDNtc~SFtv?WUK;o@jKc! z1UADgvj-QPjoV#V_G8Oo35O)|E+M!p}zP)`f$ap#ox{`z1e3=FPgDNclV z@mc`o?66K8CfT1U2I`t8!J4itKO@oFK&=~?anhh_}n|tXa1PKo}DBu|wnlDi{^40gU zqCCcM#Wc{T%ru_Iqi^;Q6^@=u zAh*)QuNL;Le3&9f?8VW-5&K;={slEB=DrL$@UrKKLDQOOZF|5Sk~p$P-o7$83^oGP zQ?Df$AvuZFxLcD`*-6kYmA3XQ*47#q3=^0w7*z`+O#U02J^N4+Ur z91-ZTrr$W7Y_$qL|Mwcz>o_}=t4666C~H(x+w;s6?Clt9^sZVte%tLP&dOjRxHh!d z_DZRZFw-X|Z54uImOiIIo|aq|4~&%b>-bB)gp_?Lk4Js}mAXZZ5`x;JFw53_RK6}e(rK5;uEz%DRd&YrG{ z=XqE8p0eKPiswb&thZVpLe-n9XS7{Lj8&>X>hfQSau7)#wwCY8R^7h50Ni+q!_OE57=i*s;Rfd=CzS@KNt8J3fL~=(eU?11r8?6#$y>+5}eAu7ZSJKdCJy zf8=<9EuiEnsl0!Rzy|OcIQBaVJ?l-&Kf5Aca=AyT1*A{_bg+Xn-ycLC_{{z&{br`R zi|idbPP-T_?;q9MSD_dR2ul$vEd$L&Do0ns&UZ1&1)XMnED?{^<~1Jaxm-wF?c4|7T+1P#su@qz@|JCv`kK3^F+UL|3G$n+lQjY?GmSrQHU z3W|?p1)I;)tW~+10MUKq|+d4}XL6=q%S&<}_e>KJ|zJh^&&xbsG8|p{*U+ z8!uK52hJn2J5oewe?E3PmigvPBX5L%#}c9HUGiSr~~Ab5dy#n24IvpBd6*?-|9oyGK6o|Zwa-LiIJ|LC`BnLEA>=riiz15TkWCe6p>=rc2 zeJJ=BRqR4;a1gia!l}jm!0v%ozh0(~?_CFGJ?mC_$=WmC+iI(=t1J;0q z%0qG=$`OyIfdtUa`143XYM}W5;u}~ZzaImtZ%e<|9K^+w-pN$oL!F%cub;Mry1Gq3dDS?1h!>3cnjJM4_;kjM3I!4M*<< z&-4qg`UMYAov;W0AuC;(C>0R8Sf_krTe_W;Cz$od`Mb=~n7ubd2Y`Hxw^B;#uKFeX zwEzSxvX0!!UtJFrec7G&o%ao#ema~3P5~n5U$*A};b>18BNVU|emU-$WKM3Ba-Gm* z+4urEQC7Ej?~ z2C@N0^A8(Fx#F33*q#>o35xpJC?f7~d_!K}iGD}$Y{&S^oBn{KAYD^L_K6W$qGB1g z`!JJZj{QjFU&c0oU0U~?SJ8*PZUyzij5a_A zfnfq3D`SdWx>J)YkTGg!8dnjO%4A#1JjVt=V)`?c+o#=FrU8kSu1?Py3ppA@a7eVo zwZ=7UibwM_#U=N|-f&`6s%%bYmbpTpF#?!I(omZc;CXbFS}JGuBQQ<02I55PB9tyt z%A9k?4#kp}DqF%_oX3W({B7fMV?uPsl{l{VSxvmX>7``NL0i(+M3A zOyN#o8fsn57WeS8DhXcJ%Fz)=l3NYW9%syGCqC8PFlj7f)P^h`+MMzyW#*{#=mgPC z%2O0`E5c~Sm3=IKi1YW&n=Tn;e_P{n0A`JFw&PZme_Zp)%D8(gygdD~&g*MIXZ5!6 zzjinG*x6g_I$)!2j&FWHCf|w*Cu{?NB)jr&lK-N91LKsWNnr=RV7*pd+2VGqqwFih z@GQQHn-46E5V{d6z4;46XVi^;Vwwku4!8k&ilJL&81Wc@XnwYLg=1TPn%+{Z4HMvm zy@n28!z_wb5uB-7%8CooHA%0xF4O*Mjga&F0%l~_decJ(;cyRlH6`aQ4sil}1BDhb zwudta`5lEL;4FioS|r@id0Cie^BDu58<~N;GG?nAP56ZI-=+Xp?{XqK*UxQvAMi=A zSAgeSyJ=VhAK4~l`+zUH*s!)Md?%XiZ(>T;WWqr=NU8;PA$oE;CxZh_1U8zta|gj} zl8L3VV@d@IP%h`5gb^VjTo+Je)(Wgeps~X{iv~lK#dlIMplkj0M9ILiCCt8bwTGAS zPl5vu^5+7%OYw~2JrreA1F9lBFXz%ijL=*b)I*Mqs5wgIU1bRuHKN2H=8R7x6^;u8ZT)aY;Pjx^Q;ls=7_?AF*-4|ZZMjj#r2ZilM2dZPRka; zXBc%puFk9;me{B0>f3+`+uFl=_RhHEbhKKuiOy?f_9B_VM^kOwZHlCcj(raLj1AsO z^(mJ!`||EVO-k8wxV$Ei6DYKF_eh6utZzG2J^y6$IQM47dMve+bH_62-Cj!J2YIGK1nGe&{NeI-D&f=)Ley(W`nbb+Gx zu(48Tp0lj5xV=}WRID;4?j)G(k+CTlHG=tHc0_I_G#e4Q=t(tp0rcMk0R`8GGI9Z? zy7jLJ4|{#+;er~nBwhTg7%EXM+?t`BVERYC1!Ik0ie$r>scOx4zt}eVQqSyjGv%_% zl`4~SqBsIG7}f!C$_iCTFLv^TB!2{tA;})=V25!$YGa!=++aubM;dK)t1q=gM4UA2 zr@?qg8eSEeVJx9_z2La%)1Nw=F)&E5C6x=nn4@fH&0`8TCN~Ex08LQmsxmUsIsUPx z&(lUgu;l^{pQ|f$yAA=#=c~*$qh{=DgRF6i4V`9bVsRT)`0ODrsM|H&UMo^6Cuk{(wh z1$zFmO%H%8Y)fS+zP-PdMvfr`rWRgs+3I8Dt%Y6|XGbClna6+7G14(Nn}=9wkRWit z%zKUMD_2@wYutZodx{*`2L8^B)3iR}0??Q$-6<$Ji(EX1&%C(&!64wV{PT&C935re z-1H|!&B&=HKp%5KQsao!-S>Eq2jkJnU*?iotg8>84mVo3Lp!092$SA(Ruw|*rXa&3 zdCBqzGL0+a48AJ3H|?19+$MXvT1YEHcZKG;#tqq6ua4*3ypLAqyZ!zPIZkbXqV6?q za1w|3QZ@)Pw>6Q}HMKcvMw(m|6$e=}`xwdOowdF1f7xx|K^*m>Ixzgw3vgoDulwr? zyp90M+w8|11G@ud8~0}6+3Gm9yq)v<4-5*rTAlqN&=UCI^g)+E^TnEEIk)JP1jwiG zX!Yw=r?OEgw?WIT3S{O->BxUnbS>^Aji{etaXoqu@y+QYk5lOi5x%FD>yD2)b$A}8 zEj$qh3R9Cye+%T892US(XC~NN4R5ILmR|vOqzAAtW{Sq^yYJTwZ?#^*hjE;F28Qd` zk#Z$%t+YCqoFTr=%b>^BaiG*SaHDUXIYmwQGiR7N>zCDgT7`>%l)2l)lMce977r?{ zXIYkah?OT6(Yzh&Mr%B9af50+}rY2G#x?H*d?OR4i5{asJE0pJTbuL z?ZoWNk2?1p+rw(9#EgAN3KrIGj!*?J5l97xbT7y3&@Od$cG$R4ao%V9$X zE~)gv!8z7%I>jwWc>J2IXO($i9@GPjg*v&fEO=O!k@820d$_P{hlH;O*g-d>yXB8( zDj?ZtgbAw1-A$Kt6k?t15%-zjv}Ruo=V$Ka3WYLLF0VMr{w;jubi0Q;f%(F7kFIx_ z06(%gzFN!_vd8VRNflcBEG&hlECdc(DQ41(5O% zodx1#=W93yG8Z~HX5p4fIIeAgloN?vQXAQKXUD96Qdu8m_xT82tfy$ly7J{b=(9G0 zRNvWnq<5E0;=?z74fJA4O%lA{ja0`r!tvkz2#EQ`SaRj~+q|~OM%-_6tHZqZW9(n> zack=8#TC^Q;r$qS0;+T1UbYS(_NTTtX8e(>)tw}^`!~m2CNbcAF6iE zDUUXv)FDfCHC(;@1=O0Fmjcz7c`Qi|3a(%BWOQVLpPn&ee%rub0-omo341bbt@lE; zDfVaO4Vb-z?9;O_)R%GPZFxF4XP~$_3~$d(qxGr4_WYG@{&6b22?@M|N{4ZdMSR*c zDedkCKfJ^^IO2ZlVLJf4pC~B9N8NAxgqI^QN67kB*@fWiuQR{k7qa|SqeY^2My5=o zcZ|99-D*TfZGJi#*?6}^Q27D}Vb*KPQ*Bp-w!4|{f&9I*bMyC5Alk;?oj&G`7Fm10 zjkI>{_yo~mYL`>0b0sv5CQ)mw0gRAMgN)u)kX+lOzH zv&dCbPAE7TkNSBf5#!iF?kA#B6nQL2VmfYd&;_CNulN_hK;?%5sXqNt83ap?%s)0k zQfDZ^sksiAQsqwl6;IlVS5dmfqq3>F1jEdKe0Q?Da@e>-?Ms($=BQrpaJ?t`-Hh#C zjOcJeL%q5ayZ~17G$ahMQgM6~OKl*kbE|j`if1bov@=$8C&{&ivga^=7>6fs0t;C- z`H_Yahq?*?IaA)>8tHgJ4@dakiVt7tecmst+CgDeWH$Oo*%DWPGz_}yIO9ES@Z5g3 z1zKK1s>=!dv(ISU-@OP_i@#O>a8UakR=q_R9q)AMQLn(ndQ4E4M~QrRV@~mYd97kV+RnIi%aNZ+Iv1@9T@Q4ygEi5nuSe~R^mp?*-D?Y<&QnySSSEf(A5)v&3t zQS7b&ejCF))mw2Lpkl^~@l{4j=r&XKGt0BB6gq>9={92>fJIXf?Q9nMqbN3884iCt z2E}*@M#G_EX{*I}MTx(Y=GrL39#~__OX}GuV;{J5wPAx;ZuHE6X&Eb%AFN}}2=lEL zdPgAFTL~OMV&X@<5Je+N_(h0^lL$-~(hS1`?A4Y*Z0YWZ4a}734@NLwQ3-oXs}QSz z3pd0bVa}y2H>@5}-P7IRM}6xLfgT}3sflnfe>uZN$_G+^8Ni}t^%B-ra_^DyL#)yx zMtn(~H<-UIytv^anf>3qe}-CgJCeiuj9PRAq?oppbeNw!LEm-ksXQo!NTMDIl28F% z^#z|#_08tOKE=8@0Z9X&KZxD&Q&chm^!|Oc+o-z!sMsWV#hGC`=zhO(R#hnS?Sbvi zwCqv;=ozQdV=ypl#QciIt568d7ZxJo8&0)`$F!SqZf`Mj0$;?U6+|B8-R@#jBC}QL zcrb3QF>~Tx5Ta+r{4~&V>=(E}=2`~sL24UL{f4o$+=vgN={kSjl4I&ey|6?BR!9si z7mkT6>D`5GYN}~H>NK~ca3<@Tt@sbB=sIz3*)jE_UwEQxCH+FgIZ1Ym7UUxwTTd~E z+jQJ;4>svL!EbXotZ_ki%oixiralG&TiC2&eimPJihHIbcZFYT%kKP>cdM%xQPJRX z|1r6e$VubM4%L?PW^A`vL8$@)V2|cVKS6FPhaE^G-W2z|5*Q0HXF0>FLCYf2(~|@r z_>_0sjWt8U&fFE#(UICdk`@&mm$m7+PS|V}B=P92IWVuE0*1g*M$0e5ll1iRR0yKg) z3#J@@+r>BSjl#vh8iOe5d|19cOelQLC9;qe;a%^Ve03iXe*Uu?6;I#1f2n5Dms%5> z(|+KSF<5gr=`&i0jwAP?CXD(lGD)=5To50S5g+|R**#G_m*cG{i}-YyX8XmCLvEwh zZ{1AjYlRaHKak;ulBG5T&{iA6uSjgNX7?;*qIao8tlmIgix?1UN| z>7U78ixN5+zGZtB-FSPx<-9i?fLBKVYXUOxk_bu`dHphPcXgwO-yK7=~nzLBMUPUgwmS{cN+=Ab`)wuOR-;Z6SgOFiXQG#4k2f&x2#NX~{(d z19A8lDjmSIKPj#w zfEKf1AIAzwr`;iMQYlR#K2kt)XyT>|q&pd)Jl%!HH3OAzO3}H;BuSiU=)JPiKutb+44 z!iD)6k|!a)8NZ6XJFPB3+HLq+7>6O*vlqZci=_nJfUEyXaz2BlN?<5b^s18CpRPg_LQnOO=0gsjIXXN+8dnxmcBXGu>{{QYi)z~RJB)i zt2p)ncbA;Q1I_Yodn@PWSl>MN-n&U_i6WOy!xc`jzv)FdcMjPZ!_ibwkS^^CwE@r& ze<%H~9p(|K;2&(k2X$|7-qB+te6K=lSnU-m8HHW#audfot1c{ZEgXGdpdtJLj5AU`Mf0zEyXr^&`|OtK3PkwEpjaVIQlt#$T!vg zc;TMe{_seXs8pDQxvZO0XTp*2RX%06_b#hBl2W#L*MgzhIejuoh2a_m>!)4<#l4~0 z-o&F_nXfCqt{G%u@Wa*v{h*eP>?+uX;b^}qJc|n}9fP*4zAG!iAL|3xV+(-Yp*7?I zL$%1nLkkp;G${w@zIMzSd*AH&5_!bQ3mj{Sf3bzDRuau?fc8N+^ktO1MZJJ zg+|3MsBwkR<~(VIl`*;e>FWV6LT1O&n168g>dgqq`a+I9r5rXa1l&y51oC7)%rXth z82iL>UNI(*H7f}FBtpz_xw3ar%)OIGZ#UKEZd8<7@1|bCb*Qsmi_8oIsxQam(?4D+ z8e0TpIhNbTfB5CuRS_oR-z_!9^iCTtbv5#SinO)~PCaQvX3Yly4t4}*2Nr6(R(*tVN60pUmm^wugRs7=k424+Dl&lOG^bYT z(qmQJZkd^~mQ~=VBJ6n#>d=cm?kM_YNCjEIf&zPXF0!pGC|vo~%CkYqQqgj?R5%54 zJbJ8dB*~j^1Kau~*=rXAifQfvj*#OaJyI>M>6ReMNlXCT#kF)?Mv8s1uBoPwM`{VA z^=pTMSww3DrG)M< zMzk0|OU#?trbb>yR%_@SXp-xQ%|(ZGBW>`ufTF0QqWv-ZeK-O}S98XkW2@j?gNjy*Ag1_n!znP`(aj`rGT zN+xY)S-Am)Z?0U01g-hoNfl%*VPvvi*-B77w+CQdc#)RkuaPHlO_5wooa5#s7K|(- z-BkKEwc!zqmIt(7!_2X4Kk!NoA|UKF8_HqBZx-6@Ui*cIZgoja)&-GC!|TdLbF1J1 zkvDI5G9B*E6x?Eae^IRbO=fPDpcj4YBfp25lBgF8Qxv*SCcvBqL zs!G5~o_T(Cj-l?JG`1cZmZfur{^XuK#x>z4{fBfraA%}+tw@9jlXNO>h+>EUH~83L z;m%1}vu-4PGkdBzoFDS~2&2(olPw3S$OhmHX?e@j%W|pVQ0SKkbQM#XE1`2Ia96c0 zPwx!$P{oQWXpbnZl09W=Nvm8gAz`((Zs-h-Q__qI(o(EiR&N~DqYvB1>D1Gwg)-*f zE^x@V1jarTZU{M+XPue4YqBbt?zFEs91?Ll*Y=_j4Z+mw-B^{|-rM^{wYKsuSi zBsOt~XbWOMDX2w{zCC`$5R`fNNoNlV3aPQ1GoGAQ^m`{qlBD~_VX`s%mJnOd?iMW{ z0yj0t4Dd@UFLT!IZ3-&GByJyD9RSqlqv_>13#73=w>ZaW+l$tm0;=>$d?9fO&dX7M zN|cMZYNJEJ;%gk4auj6ygcLqP1|N~r->_fq^{#cajBd^&8r$wtwcuB$ZYpQ|+%F5C zOoj{7YSJowe3f+zarF31x0B^B$7&OITjc%p>Ebj=oqh+KX2c%CU^va~I|5Mgc$_*c zy45_mM8nr;G}3Np))-!E1N5~8)I4}s!{r{JMYHJ5IoD_&OUHM07w0y=oxT%${`z{{ zh!%$jrC2}LPWU}HSt5AKo2o0dM~+w^ucIK4An7ueRWs|g>W$hFepO+Jd`&(r07B%y zVk6JKq)xxIPQS!Xztm2@_yA#_Zybw#e0nQCOTVNF0IA=A4ZIz)k3x^o>0PL3#|?#$ z*1MVe93cIV?Q=}KKbv-C#~#r)KRcNna(FrKMbpvSNBZNc8!_8} z{EBnQ%!&Xw#?OzEQ5x-IB3g{|pYGMeszcuSZ(Ql;_n{VC@N1-7Er2v0*=FegPtIHZ z5?mNcuxB3WsZvW&NK;Y9iNn&PMsCk#)X_D zm~C*OXCu1Ko#1b<4PccMYP*7?a|w7BInNK_wrR2ui|S_b)qKl*I_tEMlL50mB=jsr z*ZBdVUyx55C+wLY3-`+$y`n-vt_Ho&{LRN zDe&WDBTky<>R_~IyFDKF+4XRH+ba+k+2wG+;a|ps5||F2~+&Hqg>M+LC|w;~`%ZPQ^%2!(%BZ;Q+U z7B)Rhw*w+m7I#SmRRxu?M4dJ?7zYNK&pzA!U}asr6?d;r2#nZk5Bvp20Frs<514p? zG@)I*rR8ikYgdzCfd4y^5w-@H@|Fxqm>*o5^H_gyP;d~*_iNC$Uw=;;%+G6$)YZmd zB;;R!x+k!y8<{DM-1?o36_1+UrdtM-+@spQ5%VRC9UReriKIDu%tJkc#Sns2!C2r26a6~?R1yUnoM7`%dhVN3~hMk_B^#(xRCNm2G<&r49PZ8YZ&@t zo+)^|a_Jr&cG@ldu4cAd!v`14;1!;QWsls*8^FN6W0vB#3$l3QPlykMvjD$7sG-3% zvqo^1LiTAwuMbKSMn0pBtk*VP1lN#x%}HLOT@-R{)$m+;5p4w45Bs`bL~chM#aA?d zydSwy`8AnPG8B_qY{o_#VqmgRG!!i3EPPzsXN4;Wu!6Ri@L3ji?q-%6)vYSf0*JDj z1caEGb*fG;rjB7kvqvF3Jo|ubYgdv`r*Yck%$0ubqg!i6}nlHZVoF>Uzi)%)qKa+2iWTF_LS&9 zCLJ%DVhDa*P%SkDt#O0CN(JsnC+vQhSWe1I6DCO9V$JT6)#a@Whj0_HHC0E^OK`$wS_TWa|B75|d|o7?lW-}~(`ZJ;?9TEw9a9PAOLGd?HX^fz(kx22SOdtSWP zJUZ&ob`)Hu0`N~F%(BAKFZ{E101e7)knfT;bqf~Hv5lldccd6m2cd(@`d{(-$ppRo zVk~|$FQuP}roE#mhMI^2PK5{34K2I1(RscPf^W-@LlKPXr&OYh zwoi-cap-Gp`u-$}>bPle_H~Q6%eBR1=kkQzgibQtIE|^!0!-(yszS=E zT57O1Q-h|UYoFFI@fjad@HS?OpE~S#mZ|=lxvurUYKrox+=#WUSn}B@g9k9C8#lHo z95YXUmIZ{l&Gn^+7&}-ouahztuEz_C3`v?u-mr#Pd|o0AO($N+VqBuGSW2re2kgP= zV-Be~Udm?vYTXKR^T$x>2cV(0s11oMNWj8#(8X;2?k@}_$Hg|ozK&__Drff}P`v0G zEJ6FmJ+hkH%-pIDI@$g@>O&||Jc{*G`eL5xvo5U|hI@0{C7>o`SlUj_7tMu`EqmlT zmBB5t1fv$AoX{x%#1==D#2bw${`7V9v-43!N9l^EZnU>o1+poK01R>2W*CNa4_Z#M z=mS7#>FNF)bciv$Vl%_v#3|QcSI&q&Go-dE>^B$89U#o&aBEK!h5v4tO~l|_@z%?C zX?9PnC#x}J!M3PSN|?jY6W3Zj~7GJH*uqy)2g95KYy60T6)p&QPaet^R` zNy#6i?qQJg?;x(DyTn*Lwl~P`@GU+tSqTo#Jm0Hf{mAS&d-wHbefy@b*8%)@zaBIh znOQR_H8DA9m>cD2!E5}*4+=6fGC7uU_8tJs`I$n7FT#4^RSJ7urSDb?p>L*c6WfqS z`x9{7>Z0{ycp0uFlig9Xs?<}mZG~oQg7ufB{M5srpQR=>ToH9l5%*6xmZuDvn1&mb zwJs+?y*k9QiVGYMlTp{dKRvgpd@f3-K%h#Dw6`+qPHU$oShneUt-ZGz9%MjF)|LVC z+e=^x><%#saw+el#M`P`l)<%B9my#q~_!&pn8CM__P1WY(&?RaK|* zjWticO3o~;$k592o?-GC%y8mL6+HzX9gg9S_RHBoLRC!aYcfLn;OCp3vVnma@=X#s z`{~`C;1v$6IluCF(o8*zFC|Gr%vu3rJIf{G=7;fz4jf#j$`%CzezUnu?6@EVY(896 z+P0C6ek7{J!KW!V=;L&Z_qhAY48 zOr{R6%N}2!LvdQ&Q)FEzS-~jpx+0LyXx2BN{-n^|BgKyGGsUjKhnJ+g4EhDIA`kry zNEnw8bqWiYgb+}|qokUdo>(&W@@_o%;5-Kia9`)d{YmKgMeBChyp*v8iW&LB`-_1j zC^ML$c^{$2yuz`_K!Hp!`2Udgmr->^&AKiM!9BRUySoJ@?(XjHZX>w6LvV-S?ry=| zgF|qKpt*c|t-IU#&iOf8>vQ~iN_wxVw0)t_5{4Bs0~LTUqYNSMFo^O^Hp{RbbfI~9EoByUY_w0 zln~(=o8b?uJZUU70P7Q?jHn_^7XyXpdZ0f7B~}so#^a9n&mIgLVgQlJm}QJ6cp|0u z8$1PTh_T6rqP)S`V(r+GuPn@>tf+$8FbC^XsXA*(6#p0*=|98-I35N9Fogux$cO~F z0k8+qfEU=05`d5*9);nB6tC|D+NlGXV5AvLbv2xJ$L6bL%*S&J&K?go1H=|{VBVwf ze_NT%wyfcQtV|L1|K=MwKy~W&f9z?bm(m)-IsqP1>@A!mB@GQWLMjm-TG9e+j*i

Ue%}Azo*D}3D(Uk3Ev9iAV(*4A!-Nw6+J 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

Bq#+YLYu z%wJ4(8lW-b=_0?dloQ&x!y>jy$P7jt5s^yQ^e1R;{p3J#gHLD$m^Nl&=_M+m*N17mW;WcDKVHvXrVXlOP303k7*ry79kHaZw z^4k>u22Qda^&w8fadTwS7OD#$)&!=NC;4x!F+Llflk>OHGkyY2l-VBng~qxRz`xr)qczcHyX{h{ zUpKJR1oins2ikCW98~Qc%Z1PTo{^cI%-vtiUv8ycV^uu|GYsikswl18;avf-$(0{a zM8e2HjaP!n+aU0#vub^TUV@O`8vXZ7)VhXMEPKVMU)d3fKdug&!|B>V7kFlo+(^^s z=e>#FY9};mpu=^bX5TMS@Tq1V_gau@JnX<}B(J>hY(T?x{(Rl8HBe2|OyclMHBS@9 zgbC3p0Ly`>g4HxF198?_j6gRT&voJ&7(dHb8GMXKe|vH`rC=_cHTwZy)=72L0}e?Q z(2h$S8#GsmwY@x<#rUb4C(<5%+QWG^L$w}Z+Oh{x8&S8P7`!jCqD-kZjui_2_?AHd z$C<8%Z#yYmPu97E*20nLQIHt8$Y9~ODC4rHkPob356oU_6{%}9T+H^DKOrOm=H+=H z_xi-pCD{|*4`QyUf{@G35pp)T+1R> zQomq6ql9u?ej10v%*XDj16V{hjUCR-95l`6MbkRK(<|=(e985WJMW%)kRl<_XT083 z%X1c%H*gQ@wVV-G7!r{jj8fYNcKQ8CcxI<$nZItaA@u*{PE2fO&05S7n-7XiFtbc=kx7CY1v%)Y^E5~GlV!3>Z4h0a^D291SBq5^M9)m0*rDRhDfh3J zcw!BsA>2X>b86)$jo1@jKKJ|}%c8mKe!npNGKfOI>)X8PM}h$Io2f;?XEV|iG^JFF zpA-^d`J3T-P!nu@5XL?V1epKyuJtRtN*;c(aTWm~aXN9;QJO@24=9-O>6uD53~&5t z8bQ0!gy?N+HxI&F4_uq|FL{dA9*>wgh2c*p84W`CVsUHo}wdc?58W+Pha zdZxGtpGCJ~AC4`d>M`iwkKe5burz3e1X>(Y%6EqfA*15cal@M=u!vYUEh=R zPAXl099?SX$%%2Q0H(&txwLipC{^of%`oJa&p6CXV6DLUiziZ5)_XR|%ciKH`FzY3 zRzNqaygMD0CU_8YoYv%7IQdpg;JewHr);&~Shd$s;bqU*sQSxLnT2Aq>z@_lSo~xW zz)OJZb;{0)MNnLK+5H)52&(Jzwg_h>i8M5vqY|}cYm-c&0`T@Wko-E?96f(TK%bZm zvGrV1!u4l>_u|g;uhJylvZ*5g_7Tka)dz2yB!`&6K3b)4s ze?=aIYE9vx3Ocsi)wBN!jJj!jLr?r7Ad8-dY&q|-MHDHcgm65Dit;muICwM*JA?Xj zsNgPdd%7!KWeHs#hf5Onw`geNE>;M1S#D=nG98<4+aq6!)Yx zcEy{e=nnZvJ*&M4-^;EymwSS1}#ft}y# zejrd1c_&cQ>%{Q;?tD8~0!O8Xo(!nrMLKO zYsd-%#HYG*m37@kB~nrj`ocDgo|(^$h$!}DY`l6MlfHt_6&m9)vMvE-znFl(!Uf46 zP1zuxbfWN%JCn5T?XNPEbY_-DFz!nqZ%u$dHs_e$vL19x_i92J>TiO# z>aWPRl#GUCZfE(>>uE8S>uCe?HiW6sp+N3CgRe`z2MY8K3O$NN;{i&{1LVPV5Vge#0`u z+`aK*zTH!4%#UUJD6>>Oe8y_+BUAxyYW$(Icx3#$1E1anKFqRS)qucnr%+KVq+F<; zOJ{k(6%uPKs7)kQ-PWufV!O(d^1xp{4HeJx?i;Ns)J0!8DJmK;zO9nmk;#C93PD}h z`p`FqpWNMWab9e~&6p%BVpy||_O+VGl(watk{l*Jrosjvt%nD^lkhOPc1t=*GVZ4$ zL(F8E+jI^t1X-QSHq4txX2&~ZlTXBTh><_Tm33#qhO%SXS%L~1E-yJ8)qt_y=D4F( z*&C!9RUuF2#*6PHzk|uwthF#R0AqrZ)F5iFbba4&=>cOmgYH0m1P;${m_c9f9GvN3qR?eI`Jqtbyiy)Z(m zf|#SOL0$YuI*35UE9(jiLEx8u%k@4{d9Wto4}ZkXKBe#tC9nNv3`7rc9M7)LC*Md< zg8rQb?Vt9PJ^tGc81^H>%p}degDE)>4?m`4e>L%mA`AT_)Qf)Sg?Xwqzpwos`WuA= z#`+k$%SWBj%nVy`hp>6W3DxxvM4$e)|3bk~o)TOR6cj)E*S<7&K*|clWNa;xI?KJ? z2MI|3isCM()M7C96aCUv?yO6!aRS^&`$c<0P^Bastcg%VjaQQc{tHZrdjBov1%dA+ zCBX7d@`2ho3ekW>K(1Bcyf%rGi!Bk`#2}TS{oFj|=@+Id%G5`LtV~Y7KqY>$9jY%9 zYHLV4@7)t`V2y%(M8$zQL1$jw4V>;@MFJa~Rb1<_yrRQ0UR!q$QZ@dJbW2HW(7Zw! z^25mwnX=@)_6W@8@N(oci<*~+ekm2TD+6Lvn_sNQt#{~!|COfleD`;qR8ugogHti= zBKFKif1|`%5yL{k?5F9XIJ_4h65&D3jj1TXMfi^LM*$7dm}X0$*kUzUq+YtKF*YnJ zJ(yh+>3crx1S5re2I0Q6>CBR>GKsdP)k6eTf#R&P#!pn0`RmUQKX0(l#+&mp2!dze zy?jcF*}G&0Zu!z9o#$&5sq_8PD9WZJ!;{W|r3oJ2E`^F*6+8rJnZkP;38eqo(GXn6IrpCTdKObjK(RekLYD^C38T9kZ5FO-WcLmAnRy__&X*(Y? zZf#@v=Xw2hqPxwUYq6PXhMWInoL%8U|HDhb&Iyy`0;{{-6|;1fLYJG`Fn7IzEoi6> zX7rY}VJ*Gl^>ICbJf!tB#9kP>H~{(PNppTWs$v9Wk}Mho6n??NyGLL?G>BdcQC!J~ zm4#yOom_J+1H>atiMnw)eEa*5e*?=PxdpTqbwaAj2Od40qnQPL0|nke4UJ!zUbWr4 z%a@Rftqk|a^uwwiuZJ^~`|yd5-g++e4`wl_`}#_nWP9`Km|DW{=O!V*1AF+z9-DIqvB<8FOFg3*gjaLSTFUsE`(^4;oqg<$=SbZ!S)UXkfCeFjVGb ziKxpW!OW-3gwhlQG#Dqml6~HiB-;264b^}?o|?Gr4y3iuR>FHl*l2;>XhE5~@{GS$ z{t5zSG2ipL1mCWEt>v2=pNC=$==Mv=8d+zKz|$UlLjO_5IMB+j7C7JC%6;H}0CO6W zfIW`ylBLu@JHd4tl|Y=Yut{YgS3(20ojRyV*Lm)EFX5;5A^dPSmL$s%^ISezu)neV zm>w6Y9!N!7zYaBc7+jV!t!xpZWJ@GYWGIBH6-Z~f6ItB>gZuFq{`~q|gOUY##icrT z!H|IcuR&Oa(DV`5+RniOu_?x!kBY_7KGu7zIpS$rg52U{b^_ZOTM>NQ?wCW4QZ_>+ z&N>F&B?gg0SH_6&RFu=HLyHH|;ryl|i=Tq3DuCzve^{IU(c{E^#|_y$;E!}4fK7!9 zyr$@1#X&om)3H_Mu!%d;OamNFJQ&A)|l0TW`v=gT~r-rZ#levc~+lPgR{ z_XCh53d8;ncarg>vUSWaxquQphHJ#!u^*ULWjYO6IItvHvvlOasaGTja2ub5sp6w< zzX|qaIT;@I?kGQq84^n)P zxR^bCB28wQf(>p&s`wrzk$N;aTv<}El4KdRMgdT;z=p2zSKNNZb@h$uBT1Zgf;=5S z2#M=Aa*kk((#C)rV}??-7c$Ehrxky1u@_P4uAF>$zItKoJ5~XBh7ho>^|OgVG+zR+ zUTI2SCHz~I7nc>jlsy+Vas&yqtu$2_CQZBT{q&G5`>#!OmC7Q96}TnwYB71Qa@5n^ zdI_l+Qm)70EYFT!_AR^aqAbgAk)vdb;;xKgg~A$7d^0#B!eW<_3FP_rhy@<=N~U#X zQ_P?FB#p?D8>zyW=y3ZceGWuyv@ehV$Zk!zd9TBe*>TE)SIm z=)u1~5&Az}|09aZ#p8&b>`zjjWlp7&+I_ytgA2=*X7LVB+4$p{TTEl!=Q1s%^vSE@ z!qA6rpYcYi?Au$XuvX02|Wx zeA2X7J>j0OhtfNOA7I@Aq$miyez8Jj`+!#eh9P{Sf{!OUh1Q)B$EO0qL2sN{ zY1F2Qd#-51w^l;sS1ge1_&LeDxo%=_L)La9wy)Am25oj9!K;Fuc`6ij=7(!YQRP32 zxK8+T7|}s?#`T!pDJYnobYN5ExbN@e(uX-{l(I2R?&2xg1r|=MJ+4d#&!a7)z@Zv`l%gys~(N z35&bL)-?0#hD8O1-yg7(nlP$5qHLnD)Fy~_j=7S23dAMlbg92i4@g*UwQ`N$Xiw8J z0CHu8Z)&T`24;bC#*IdOjbVl4xO2e|-vaktD(}eXpodMTg2e2&)>p<~>>=J- zn8|;o@K2|+T|3>P>y+krmQlnl37ok#`I+a=#-G(+$l5!BNarZv7yO6@*(Tq;P}=R8 zr?rcIjJz>z$j)d_e#N2Ow{+w9`%&*sbAIF~rBxCW&c=;F2*5p0?)K9ThDBP;OQqV5 zc#Ko04y~i3zrLPQlHkS#ZLR|sc?j>{N6ygZ$&%RM0w;78pQ_^d+7KVa^n`5GkjOgo z#w(+_>L+3=;EJQ_)f2kUBcfgwc1tbs5q*gy4^qfezyRG-j8!?MkW@ILzY^j`OeydOC5>OPmn zC-q0+xu+Yywv-I}+fMr`r+(+y|8p%1_sLUUW+*`w02~h;!XYXgA~JcFlQal*f(DlW!JQC1!685h`R2*I>;29-KVbFRQ(axvyZ44Q)z{rCG#MKdTA$C8 zL(kKMj^Ejv#Z7g|tjAb$4k+(!3)#iZr=29q-DSJS>4oeY6nGpzDZFDluZNs_1!ON)pP9K_?0hL-=vs=gqF|{Wa*!a-6r4| zTaTMfHYVy3OIMcBu8b3u`^DaZ7>oa~8o56!==Hs8_er4J++jvfI!)8hO-Qj0=E#p> z*MlHNZs+{{uynoO*YGVCp)*Osz+-HZLWk%!EdHI}-4rXvx?=xqj>Y?^gQkA)a5u;C z$u*8L@_1!{CdX2)T(ualDPSRc{JMfRu1fchT{%ky3SaVatz@evc17Hh#u>%3pOA5G zPtvSR74No*YUS51$^I2m6=H{Zh0cw4T<&orpV@(g9a$>rnzX!H-SQ+>K?`CN_mS9k z@@#ga!fb}#pjs@O2KbiTx=m1~)$UW3VvprvTbPtcsH^4A46*tiq! zqU!Hb3;b2{J+iDmqWa8?(cDaaw2Bl;=~{f{nXPE!nW=)4QysI^HdPo4&hy;Vp>yhy zEcXak%XDz8>eakch$C5F?NBi_+{i)1-SG2^^%_`W-nDpxt-sG)$1p&wQs%%Hb6BHo z-z0>6Dww@o%~K_-YcL_7HQW3=B(v4)t<9I32tJ0Ck9d6yvY>5NFv3zWQscCrD4Af0 z3qE|W&Dhrw{1#n}^oIu!EcGWaD`>$h-3DD~h(#OqbRNFj0kx#(qw+@5pP?%2_t|mx z8sO@Vk2q)Vrt~Iit_(RHurRjjd9Zi+fR`=tnrkjXGay+X?Nv~O&sVgNfEk)@pRR&+ z^^GzExsT@L#XGsbEopCaJt6Q?)b5oOj;uoK3fEEvmz91qL5lXRwIpWY+o-w9D5JWcmU_ z2e4SQb#Wu_auqfN4;?yU25X~ZG1TV_Vvc#**y`NgFCqn`1Sk9Wd)`A6MfwP*D!J>%jD z*APl>Obg=Q($r({Th`GV(oZRoC#V$V-M(!wU9~yo%4Ydf3JreQNW97O<>L z?*#wg(f6FDGqr=SWo>RB;19hjx4dfG+U3gb0{E@oi#qluFB$5N|2VVybP$)4*RlBL zgE!%9f40&RJKAQ)E645xo9Yc`4(s0@O7BOtT2fdz3dhcXCG$(_##?{mC9yr8gO-)o z;17+1TN4#VdCqj%Iznc#d*|b&$>5C%zFCYr2p?w(g)2ORbp$P5My4pN7ce}Rk920y zvVsr<5#uzZUTB;J$4h zF_%!5DW2ljXe14t_9^I|PVpN5jJW$*T7HV&Edl+1Ga^-$Lh9)b>ut41gzx7?Ras?r ziULH2x1*4-?CLstG-Z_;U9WN%Mw%*ZY_np=2Bq{`eXv9Qmy<@b7y3pT(ZtIA)ZeYVJyp{Csy*MyN-6|oDwv4-3fyJ>nhKIW z80LO!t`g;GCfa_M)8#tu=j}{SNL>8lan3pww@)OT=+i1fx+hG;^0RO6HC%r|?Q8w7 z)L8v$h)ZA#Aw!CgE(+O#XY8Enz8H~5W1WV+1dS^S!Q>0A+9$EMHKs+*r?TCKpJaTi zA@&_lTw9evQom{oztY@cQ0Vp-K^ALoYo6#oRhw3dSDP8`@GWa0o6Q)fm@a;;Hrn~q zN*?h*FVrBG&7XUbJEq;z4#2&>&|TN-bqnvvjrgUfNox7=J-Y5sn@=uOTJ-zO;r5@N z12zI4@7nLK&z#Q=RyGc&I7U|NTKY53Uomgy?XKdKNO2?#UA*2EBR|53Hn9aAXzkWnR!RR`S|9D#%#RuIINDg^X0zk2J zRX`yOOw`l@w8M~13_ZXztc7j_K!AOUV+sJlP)24;06XlOp)G(B^&gb^a)~uh59Jbl zQT}7N86ccd>`Wb-E&vXg8ypXSD6ET`58wk#WMMW60Dy6jhcN(8SokJ!06Q2%Q*?D!qu%K?92q;W@XZ%hd^ zsteTrDDMB?j3bsExr3z&&<%_3s1~pR^D8Wm=?sQ;ctVBD4hYpkm00d@R)C_om zMP1wmIQ$>(cN_pg`8N$1iR4GjP&V}x>pyu5*i*n*0E&MsCS>gx@c7Sjdg1K*I4CDu00(gwh7z60N$lhh zl2bqi4B0#d?8D-NoC8i^o_BNN36G$;$o+5f$dH+H050St87hdd@(XYU>oN5kP!G%K z{R^P&AHn(`Wz7ZA2mqo(oKb-=yfqLNc!=>YlqQrQL{Dgv+&KTis;rQ?Y^c=2Kp_;# zK1*fC>S!VWet>1kMFPx&Etxq=AO#FJzGMW-;rxsF4L^__#>?7^0SjT*Fjax4u)F@C z2K0c%=d1-xMf?Z9QfU`pet>R%{RuJuM9c__&ol!HzN+W}6JaTA833b3lJZ+ zs#H2o?*7x8=t2BX&4K~uu*eno0y8Xj2bRJd%6kEuVL3ee0;yrwr~-fiFuT0>zz|rA z`UB7d=31NiLoO@SH8sNjPAwYbM*(z$??w<%7-mfp3@m}Q`a*z_Fu?%%FyJywFn~G* zh=cG?I)Ez;cnoWiX9EAi>?pH<&G0x-i2(_c3KB0>=tzzTkU3{6SP~G|G$3vVbq>%G zW}TP|osfUlnNKI#f>3KN1V|GH*8gD*fm$O$I7*@SJtZF~^{*dfxd15rF9h;J;6Ca< z2cA-{dgsu4pnwc>fY$;lXdMgo-FZyIdkNK>iyK z(tiRSG;$00jEVi<6c`TTl<7lbih|6)L4Ya&y?u=VxmX9HbwKSx5dN7MnFSYeLrv)Z zACv!F5p*Q|04l*|c=H^%|L+|IBgHSZK-iFnoBw%oP;Y^Hu;p!zK#Tx;(X71d{Kkb2 zRXL!7gh-O|K-6lX+5~M##FDVZ`-n~K30p6&c*HxfmL?%Fk=4H^$Ih3S5yp8(2|GUa zL+{H3A|yqdf)&D92W93z*0B?I{0tzTfUT0QKw>PIhw&idVwiuYXyPtdiz$^j8y1or zHve%L)R#IUgnF9le|+IKK-Cv$Gl&yl>oc~x#}^0sr{o-}v9SWxktvEMChGW|NlXQM zK~v-sqf!0~k*SNA6?RSU6Y)3L@WKPchp@0oRmtVmQQ_dO2>#a%GK6!N7zI+$1bv)6 zKNB0m)HS|L5z`a>Q+2Ya4osSd;4PxR{%=s^4yg4NENyTXjbH3 zQx!X>l~4$V^H@B<7@)%=#NBk#GiX^$=*gAot@@?eX4gh4vR;Eu>0FQhZjNQu zsFCuns;&P1((b2)@q0tZwsM|}-~7brPQl_AGr#)$JwN&L+-!IJ9{O7lhyr&QV~w+# zXz0^Pw6$sF2~HbMh$7<<=-T}5Uh2scncIY85VEgBei7`IlSt@Rg2=dM1*lx5!My3p z9-Z-Wv2oKLm{D=T$TtXY`GGgGwmH35k(JxEIlVtRH4_L>_ZYA;*&T@J98Zk9!t`Mp zN$a}e`a;ida{Af2GcQ-W)3ErPlJN8pfs0bMdNu{+5LkCJZ&X`PxQe-BpVZ{6$c921 zz@oQq!R4}h=vAO&9YqQJ7!|=f;vgJ|=?Ge{`o@5|{Efutfn@njBjp#JE4K45hbu>J zE!j<9ypuDYr<+1l0gc0HtH%S>1!HqSRF@IF(!4L@s?VUqitOBI#M0Go1DKpPQTm*- zvGkqx)?n$@t5zSmu4L7|nMC5f5uaWp4)0y-&aD`;&r^m`tUA35@bJ?fySjdDgbjm^ z`F<3pU*@pYo(Z**?<9#`Y*jctGm;Yj%d5}4}39CP{OnF8j<}^l(om&a} zTu$dt|9A~NbrIeU`*pp#qVwF1*dOw%+OIzrml|wf^c+)<_R;(3_r~)`vE5aThF~Ys z;5H>wj2yurCLtPQecWg}5o6Au7;}*T(-OgLATy4P<={6wn$NFZ+}z)rZ-4uCs+!S8 ze@Iu7ybN-(SV)u4QGFRf6k*a-Dw(0Pt)d~qp>JRM zEENJ~2>+oG=*>%zpcvkaiMY2sN-b59C-X23yhD|QY8j)!OTd9W@&|j*oHo?ko{2z-O@39Ab5&)`9P;#3np4^rWKgy& z!(?Lex{1`Nqb|rXU#h;REvgwUEbk_vPSGC8Dn6{IE<}R0 ze^X7-rkK~!P4`J+lW+ZZ6y{R!^P{-LBczQHt_rt^c&IU8$= z9Cx1Ei6@*@nBN{HjYiDjeVx5C(?Zod;?S=$2k_wsrM6t=eOL@l72mHba~o2>uqI}A zN{0Md*jWX=^CST(a+%5?f~(+OrK(%LEsy9yIz_w7xqEQ8pYr(zT>nCDQYw<{A@h zj4uzarsy2LC5w}_1PuCZ_D4`mE`wqPmYf`EhQFvv5>*Un#@o(0UF=?}hH;12KA^2x z98iP%{cd0Syl%DiB0~2@{az%%%gUK8e{Yd%JH1GLDge1pEcj1tz|xzSujBS2J}%P$!e(^Bwhu_oO#x1rBZgxcDRNyjXlFM>OJ_R+ zy5C2o0U|?Ra~7Q}Ty9F20oCWrL@Y#x{&~cy^bz8~sY-Ag`Uu%`x)u(hQ&)PnZfuGr6?P9j1^FsrBor|Z{be0`<+lGYZb5>oqhs@0Wc zMi-k+p4;{6WMrqLO3GOpLl@0=P%6n1GV^g|x%FdwQS)UMFr~L9C5+2+idx}(S{w;-4ZY1AVs?>auyuN&GK z%1x<&$TGFI5aR~ErLf8-Ls2&f@Dmf9U5G>+S{!tWvKTU$g&yQORI{H%bhp6F*EI}9 zp@o4?iS5XaX!$nz#5l+Vy`MHpn;5RcZNlHkA2=R2RX2AtgG|A%m`6+Z2I=sXlFWh( zLtkTu&y=Dpb@1+1CAN4 zth~92CSdQzBVbk`|I82+_s;n5WSt7-dn*F%s|`{yjFqYf3T&!jm+-c+1L8+T2?qRi zs;~k+!RRE%OB_CMXKt}LS8G&pEy?NNm~Nodu<539)tqY8B~$SbX1G$$KBZq|<1XLz zCn5(2?848LI?o>?)%ST=&cC{ei`DM^islR|%stvAMbfxJC8Zn)BNa;$U%W*2qFF2m z))EF^mfENMu#n>m#5Y^Gv~~#!Z1Y6O_PUazWqG@yqvzf%pA%!}s)-x6ch zT-v{j(LlBD=-YdyMqMpgbbx3xcgQDtV`7OKa)=hJ6YhPt+>RuLn@cp)*p+HO$X}_M-J;*rV^QL8eL$^M^9gRAZo6CnhOmq{K zP^b9Q?#K?SSp~)V3un4@^#{s~nyY%aur5Dfb)2ku44f7?X);&!ie5|L?F?_|J&HePiBTE# z{Z3%S#ru-@Vl=7M)z|zZiz6SEI9pEeHkbJ;inTIX1IPs39Ofg##bxgK zU9^{}!iK3HN8dVEmZ!66KSwUB$JwwewsBJO#t}i~=QBZ2$x~Sxo`=!NPO_68e^Oa6 z^_s#M5t4qekE4{S9Ehj_3qlfUideI>kuzMZkfvFAS>*m#;GnUMOq01G! z{EtGl=0)kFwy4JA&!?fg6t@B3ffXo)Qrh~V{b@hr8sr)?{<_k9m2?oWN{Yps@jx45 zZt(JsG20=&Nbp0af*3i4yrVMh+QKuD=tuShL|nj&+Dj3@E@4F4IdFa_Xt26oCiN&o{u?@2kgWwghF`U^LiLFS zbWI-y=F=og;LG18b)v7RjKA+t4I6JdO7fDoeK5baRGe70V;b;pFR43i@%R^>f^^1-HLx!uC+j)3jEqHbG;(=y&+-HFZ%Sp?}B!su%1n9^ofLF zxV(`9uMZ8!?FK>yhxZJ=lDpR*=3DG}6i)onAn=>aisQjJ@rP@8t`(T)SGNDNW>mpX z8DG>*sh{{r=mSF~qSP3+KjF*Wo+%rN0@&VD*K4S6ATCQKIpbDEQ2wTD z6lJImida99!7d_V(~z5EaT~Nx#;%o&^2kDSG$*Z#cx8avfv*<_9z=DCYCuqkzLP?4 zvXPSVO^%NZKc^diMYAlRDn-F-lQE|js)OFN%#Yr*?SsCB?3;FgcOLRyRWz>J*3>?t zXYgf447tw3?Gup(51tArD3%fp}??4yJkKaJ$FPVU+*waM!)FrV`OJW z!NSnnZpMK&T-L?~aNlaE80*ub%lPHm!>=YWMhh0v&uKQ=y#i^&eZjrCq$=GGHI*ULe1PFRXCvu~0$ouw?C`=vW=v@+-{fK^M#D zi4i07O$)q#dmDLpJCIJ9wT}ImFX8w5doYyVz?E9AbIDpp2Qz95d?Gwdv--?lib)=^ z#Tk}YHvTr)hf?=`NCj~0&OwC1w2mo@mUOZl=C%M=zEBWpSohVb`YSm>w;=PaiS&>^ zU9qZ1kx%58(ZC*wwjT&_&Et~13qs~1meUs@Y3J|)Ez8bGJD7S?ujB>TF70`3PT*!Z ze-C}XIqP1=jsth^BHxzd0`0ltZjqT6Cg@U=WRzCE`VK?&9(|QRe05C?k*aj`$VM&de*=G>>}8Ps&p^StVzdW9j~It{w+wCQRU#J zRSi_z({15RJe~YmXmCQbx^PM+JMaA3sH)>m%D>(vEdX3a!8vb|p?2aB`Q{v@i>1%Y zl)6Dy{g>c(gqch%eh|;H*AQ9Q!OxI3G5zB6b?mc%q9OAxGL|jmPmKjt2Hv{r9Pi$9 z!zb;duQp=3(BxG5hK6+?ymc!t_5q}%NVIVbTNT?Hs6g(swsRDbcqZO>>vJsL4vgk= z=7J2~Tcm+GY8AeC5Fg(oS|R;*sVcu?b9&*n}SEIZMhUhn? zV?f7{={&r8?C(8hkA#cZUlxTAaQAWGp_Xs`m!cyWJNgWRo|AzOA}k5Ci1F+SOSq`5t0enn)Af^4GCJC%E`J%MJdW^M_=(_&BJF`P zAx3sTy%BO8Q%s-0?!WG-D zk_`Shc;0lbZ8!SPwD9v}Q7Rd^>9TsUMc^rWUoGDNVk-d9e}V0jTZMH>#{CEz33i^W zsGA;pf?pj4XImrctQg#WC+lgXr<;d>liX)h!Id`RXW*s5@2`90*}Gu5oEMDdT?!V2 z?eb4olmPVp;#a#Jw=cik2%hl+FKOs!`o~+lOe$_vdG}ciiJU^sa%Be@Uf`qHFu?qZ zwaf$okh&B(H@^7;ts*na!NMc#1ZUgSvG`&qk!37?*%tQq#e)c9#82EJvp7s2Fc8w; zlYJm*37{F5e1w}`;`v}0u*?&;Ia%VQ-aht$YNUis{XWnvv7q=!gJ=Wu2)*hP3z;uP zfI8!!4(dmI3JSj$Q#2Yc14@hIKsvCx!?iVY+-4-4#a4-}rp{S}joCdLI)NsnppE!d zs9UL6()k)TJB9g{cU9CN*Or?k@idoIx4!T3+HrY06;H|fN9hi~1z*bUlrihbE$`#F z3B&wd?m_Ff$-{Po@OIvHe>Tc+n-VcGWE+aUI6t_BjBRO|y{-g{zg>x{ z=oe7~cjdj@eh4T~0e}7d6@9~%Uj0lx$X}&2Ueo$|iYLviAp6;)Twpe%Oz`nw;=4c$ zI(vF`?$_LsqvNja);>0c*d%c@mo4e+u=-xq(TmWD+X0RMn!#@JU@uYSU-uGcY99$U zpIu7WxbwQ@m$?Z2?dmp}UlW#rx2~HQKOqiL`l7NeIWr8ZikXr%6wG`{!vP(qO=FE* z3My`?Xn#X7jVUd;Mu?jk8?kF9zpmJ7CyXaSedDQ>ctNn7ZavVUdZ6#SS8Kvy-6&e+ zx{rZb$iG$B|LP{7H_k(J8)rPF^+$&${>S&dUV$LnMTaz1by=*I!JJT|$hVzZK1g+DyTJHHMz!)qD!IrJk{l z(Xb#iLkCP%a7_cwI$4_uEF$sz$8y3yBpH9mzwGG=^+u3fI!=e<&Py8($LUSW3M7tH z3nq4|59tbKtBGqXBudql&kIeDu?u1k-|~kbuO`ZNQrPa{h)WhWe$(0;wSLF_n)tC(i)g?49am;71{X$lc_fU*#b&6PFmxS0VvVa6$4wGo;6Ka@P`>Any7xDzr(4o-dVFkHRdr4%5wy#H`R? zxM$PN@?#V>Yo+^MO6ex|eogsGik8qfWuzP7c2v4k?<)yw7BEEA^h%3BtDuxgdf1$KpCD zWs1i;Iezh>oVWzMMZ2mV23nm*|{x?6El<)}JdRPt99ug4X&Cj^kK z#zP$lm?~s1em8YJh?)Eur(Y%F0B2&&arfSRS!MQ5t8-T3 z>zj9F8k0!7vysa0cboHV82rfdk|vCkUyM^nsF{Fx`mrdu8fNNe1S79HsUE(3lD*`- zG_#M}-C$MlVk&>(I(-j4R(rHC9B@f=SqQzZyZiTC3`@N7m!XUW%Uw(KQ1v251<9HI z@n6*cYvX~0TCY9|bdLpGmp6p#Gx@*T3w}orJm~86zba4zCnyqD`w`>;xxz}JHT)n_ z@_(O>X@Rz2HKIy=&@xPWIQSjNpXlGG&pseuSP!27P!Y_I1PpqD6^4LOplF!q;uz2l zOh+51mWxFIs`)L53keATy@qUcLThTX86ZiR$~Pd|Zha4`iF^Y+qaqwyD+_J|;XpLH z*ikx6azSS#{{~fR1O3lN3d44g9jsU-_9sIo0$LZ-`JcKNv>$E*jDtQemNggD;lJoPdKf*n_wclBj~|aFED3yId8doY0us^O&vxQ$7j^oz1OHvQ`r* z-^n+B%_FeOGo#xwCriDNMnl){EH*)&oL>N995@u0m$R3n9{k##K6mh5&CHm)|NZy* z&!ZnNkMLNofGbo6>c-}94ZQQ0lg0|?Pu%H`^uy8?i4+_Nux3}McF0=`TSy+vG~2H% z|7}IK#xmS1osOcOKvzg91e8R_t~Y@OJ(8?UXd>Q)lyz*H6T=%9Di<%7gOmr zP5p*p$VA^X5G0$&;B66#9owq8UKZLy;#m-FomZy7s9agKP`zOPu;-;KBrQbv!M6Cq z={A4=Y4TzC`KZK`@=%;A*8~2kFJ`vG>O_j|>XnKcm(b2A(vD>C>y&b3a8vIT-sh?L z$JavoMK_`yC{E_nI=l!wr$GDCNYuv(a%jiVu71c|B zkst@0kFBQL>Yltg@kh=hp7Y1=e~|%H-KNGhiXX{?0!WnoWmAJ<`y1Ystl)*Oa6LrQ z{ZXM`Q4k*+$OZkujCj_5D*v`g^9LipgY$u3sDHHKg8JjO?2!N{P#x^<0@;R?x3v5lGAlm+NNn?{mHCno(lC&ME`*Sr|3hOUqnVIGlSbHzc#*beo{@y< zO-@xa8*5G7WDcD+lMw3Lli8@^Ls%qY0;Ac~ zKM&CD;$K@C7L-U`S2v4b(^l4AW38c=(SDJ!1>R!w$``PI8LR_)a!nMc24-RWaVJ7K zoS0R85T;_%Fb$sF%W|cG?nL&-2Kpfh$+KuIzmh>q{&jLaf9yAB$TrbdW5W0zaE0AP znNOePz&!d$bfxM~A~eOdS~Qv9L6{l$tmq=SgW+WaSmWrhh+79-(RWE_=ueJSU9^)<3YskKPA2!da<%RMLT^0X61z@Kx|d_Fb59SV|rWfQoS;AxGUV<8$b#Q^NzD z-wBC|l}w}5ki>6GIAZ%iPfwg<0k7%IQ z&CuEU<7co!s%w}g<4)o%MQo#FA7OsaTo+mX&*RN7Gv6Xl4t{&ar}N<_-(pvROO?kU zFG`6c$=w1EJ|W!V7CiSG&Js)9!w)hUR2fv-1ODXsjJ%JEkIafFFFrBPSS1f*IX7~T zhPR?oZwes?#MIbW?7_gtyl28`k8GBHx_&H6wIDEb2Rh3m{iE)8fm*IZKE4)smmb0S+m>s0?B(FINK1#K@b&9b<}k+jpL zlvmBXzXG5jQ+()izphE!^~GElL4H!o4P^+Gn5GH)^~L-zRK*t^0HtiVzs?J-5Ewz; zh!s3lsCZonU^;0y4osZg!OP^ptLdM*7PopVY<}i2d?C>M?V6Xh{LME@iWVcJ1R$wJ z9*Yn!4JcZo#$$3(Owrj>t^1)WD<>~Wr-D+WuQOg}cdX$hH?D+FR7WH|sD#dI#2g{V zN^jssB19Wf+&s!u%K71qP$`!nN@NQ+a1yM`0@pPuXt<`XcMr+9YW9F*5W>T({XE35 z`zws|%iwWsYKAnObqPx#x_0d)JvAZufQLdhl6EtK24#cF;G%X@%vURGArzbONfprN zNj6a9q|-CEyxyVGWbr_6#&F}1e=0YX7Uy9Vn+ExQ`mnBbu~tGKX}o2f%4ixUs;V8Y6}g{KjqLtmE{tP8Fm=6;pBP>T?#X`ZX3qWhG7cl>!?Q6eC#ky@7^ z?9Z{2gl%b=(+~@Pspl&p#_B}911rNf$l`^uv-W6*C#fDNdI1%u2DBGR_OnCBEf$oz zvmr6sZ-~wVOrXka!bvaa<22YxsFk*xyLF?Uoawgk(-;i|>=QREBL9jGn2ixH}(_gEdcjJWqTQ{=y=vyQ6UtQC5# z=kxAC%y2EDzsLF@$j~278H@+!5k=B&z2=O6Z=F;oQX8UT)YOV$w~RStR4=%f+HQ{20dH_S+`P#i^hN>DJ3YuD3YSHQu=nwrvJyAZl zms|-CM!tuaTqzGqEhw%J!)w&SP2B5V-d04)9nQ_;PU6_1ji5Lymoq#+{T&` z^UBw7I5m`s?wIq{nY!PtPw|h*nQP;$?wAZkjr2sDyAAXlt=rV}J~bP0)GAwfGY=i4 zEm>y;ywTgCu1$D|tCepf`A*k{e2C*6QPy5FI}Eze`LnCNF}ISaD9qWZrI%t`UCU|1 z2kep4OB!(z#3=Zv7fhHP-WvH(;&Z%IZfoCLRrBG$&lK zAf!!QuN5+OkJ+q|Yhp8qc&%dr5K0Ou!)gV-W4kS2uRYqm=xPq2d?~=) z*ZTyQ?^<%hZum(ce~$WkUiI0lFys;JSgAGab3gQ;DM`f~L{8roQgW z^)__HKkX8+M!!qhn`D|lH3(Cpouocdgv5_@`U$3B$=}fjG_zAiGrS5ZqfA{?M$$qz z`x8JAH@`mtp0PPe2zd|^-LCj`uXtLHK=MVq?Ibt#gqc8O!Ww}&g04P*6NtMMMJpu5 zSPdb=8@VG4oR{IogHH$RQ_~x)AKKv&F3Tfq!Tkn^04>?z=s2Sf zlO|50a8H&!`Anh8>X`eECio+VjZEg^{qdmpi;-JNY z16xKKj4z7g&!t0lwqZh*ba&lbeqZ&}NQo|)Cy*2G>Jp8N7|mJW624?6A~IRVH=v}I z#DIM)_ZTJ`P(_uJvbe8_Q(R_>ip=RY{UtR(wAIy`t&a~yq^UJ>Z8N+=Q;7|FByI9>*c}N@2yHZyki7tKaLD9lyh_Z;#=}=_fN8)igmJg zc9~FHJB@fHUoPJs0P%M$4sJS`pNae9T>rDpd0WUSAh)u9YiDiK=*anwk3Hn&AmLO! z5=`4dTJ*k1F;;w&0y#An(RsxxP^^Rocu|n?BSKB}^D=`iJ->|Y;P|qwGuA9ZtB01; z#%ARTTWD%*pejWH3RURx{Ngqfo(0J*iVou|Sv*8v>0=750 z)w#qLh<}v&_9zdzMe1#fpmNn&=yrN&ih)!^*pDHH0b;jay9H9Na(*dz7POCHSn}4R zP_on@WkrvUw&C*eWj zHir|Mmc1%E|M^qd#k5O`I%IF(V)a&Yv!3yjJ)-~NcjjScBosw6a0%n5cthzFPawHg zQg%lt$1=n;$CEpZHwC>q?ur&15}$asHGr-`q*gfc$^Vrb=V7p}aHy#NuLpB$F5u+5 zqG>mPiW$Gnp>oL_!LUw^ueQb!5k`GDrBuQD)qy|Ups%knN{aN!qEYS?km!FK7X>mk zud#tAlmFzCZh4sChG#~V4v-#^1agw+Mua-eoWd)I5NMcxcG3t3*(_{<>oq`9;|C4! z6F$51RyL8Zkc&d3QL49w7|P1=zmFDtlu@Qe&o@fnMw3u2VQhD|7bIFJXCKY_&J@~eJeiYPOBhZm z?&+lFR8Df4eb%Lz*z=N3|14p`PP${H& z$|RURE1vS3I7yL6-0m%EeQf8H_z?joLHmT@ZobR;^w6m3pQSJ9KR_qI<2){rK(vq$ zvG)@t{O~lefx4AAG`$6XIT_D3L@@L!ZZ??YHRgJXeX>?ch#lrgE9=kSp#ArUQu@@j zJYB~FPF~6O3@Zqvj9?ol6~Sm9;33OUo!n>!T@wb`hJx^;+7FA@Sk=;eQ zNp1?k^~JMjbj6oOdhUkH;mxE+QwAIa2t~ZJyb1y1RATrCP9LOCt-GV&zmV~)B$*6^gK*01s!lRmLTr8^r9vIWghtitn-B|*;;M+SA z7Q*?%1Km^gSbcV8;8gkjWIjzRhV;}=A5gjj5YTm! z;e}Iv?-EC2_kwBDB8@O&U6)pV4X@)|zIm1XvF@6P6KCP}ZD-XFxjXyrSx2*kN0V+| zx-1z^JifJ$s+(LO7c3wZumDd8_;x&tswgNsCKo-=5j6$-aQ50YdYP2jorWkbd^$cg z0JX+H{+mB^+eaat)%ztV%B1#S(N%Cdh=@vWU1mv~_ym44dSNo)9ZK^d@gS^|B+XOH zYgU25(dVuqe;7>NvD`*tv>e0cqh^HG7lU5$wlN{grU%O;egeyxlZq+IYJ#F`EQcIj ze#Je9SdgXnaUg&szi&+?PY(=<8E3`1myquLz!$8uAZ!FBhB4&V?K za+y(8XIyjn+sO9`hO+Rdyzr?BL%~}Pos9zP^mt&4&;yBRZj_$zC2#W)gAI=lH%f^u zZ{Cc_=Zvyp*1kiMqiBsRZVh?N|KrZ|G$84=u)PirPE+l0zKG?CZ)c-4#!H*AI;LGd zoiJC&s2AzodDr$GfD4m*}!WU5(&7lZXU5sOj%sqpgE|=x+2MvLcML9qH~|?9`v0ZpB%s%jzA7 z;YBv!3vQQ=!9)eEd~6Fp(DEYU^KHu(RL;$)!>P$tog(Lxa(9di=N0>q+cS zXn!u#8S}XH+He%xsx(o<3!vh}K9J{V6)_9`^ts;JNEwy?{A@IC>7{dV7@t)lBeH5= zW{poO_j$&@TX1=WBx%GcqjQCO^mX#nhcK)Vw1H6hb-^@ZyU3RH1p|>yipW$!Fcwzd ze6?Vnw|3Dwf$`+b(%J~HnXwSN?M>Pq#72*!h#RoG=&5Fmxr@Zl>`^lud7CMP8I~Knw0=AlSR^lP4vFrSvs!%bs7q(1*=Br;j5y{TWNTDi{ar~n~ z<4$KtTG^IKufA%%LSPo1rv_`c6ODLRF~nximw+bYz3CD6nEuW(N*Zv|t3|`dXF7!X zzPS`a(agW=!eZp>%XT==Qa;7ueW|ZMQyRH?JqvwdxI9-7hhdDrwz=Va<*=?shOHQ( z%FL8e_DMV*d$+#Hnx$pTz@vaY)s_t&VYyh3>{|=}k+2(cYXPg~c?9?Zt;hO!nk%`o zw=gE8RZDQERb|N2P6KlRR7RG)U-HVSsLEhxv9dH^XecRne{8YlNgy&MH^Ql#RT?R& z5^v@Yd9J?^92R_0nJb3ellw;>F2ohdTk^oAF{g#jLmFfc#W@@IFB9T~#mM_#ZN|*B zSKo2Sa{=6avO-+vJ?Fuc+GFklR#yBxa5ZHUtv`Pg*sv}VW@$S*!zJ>@V=q`{BuFYt z&g$k>7bVup#eHFATm8IjaJ&Ahl7&6w*B7;kwYL54z@D8+r5I+VjY=N0`D?X7|%4-F^6E z)GT?YWSb@mr)`0Zvk6}bX;n5DdM&Ut(km2)RQtAX5d}k&?GsWfPa@InP&-UlSJoE1 z4g6gg0a9ddaOjr6ppCdZk+xt8aHO9Nn~(cA2|NCHD1v6NllbOV8cVdZ-zp#2h>A>! z=}c;zBG%RAXHvh0(-(LKwzZTt5K>x4LlL*mvY%Bt2fOYz`A<9gE*MUr>5e=NU&O z^!NrnzBpq@m)Xaz8Cep@Qu;G3EW-%Ss0Ipfph2U<2>^{*pqZFS#3CEmse~cy+)d(4 zsUF7Uu+Kk&Z3~yNS${=80c~Ea3Fv?U&1j4@(|&eXJ)sb`DK#;EI5a; zpi+tLpkv+%hY)mZDVaqRgJU>(ThZ#Zkt)e%uxl3Q7N0D#o zX{<)L@V_eFt}dj5@|(Q>`}}R#gn?$y$sRtzva>yPfn)$@tB^h`u6IYniCODsCG_?E zdNiodioonRYk!5`2;yneRu5)C!eFauo?GQ-R(Qb8C?=k#FkbIxbQfQ|*{r3;QlkUC zH1{X%CZUv5BkxA2Di-0C>E_G`Rk*O24i4L(I&-}@X923H(CiV>y#Y&}k)LTrE8E6q zN8yZ^+MZZAsOMb(PtIg`!|KwPSR9T9@W_ud!j|!D<$uYqb;wqpu34NV2)H(IK8?2O zTsm^ZVEmS6@MgYcm>thoJ%aGc|IfDnXNK`Uu@19X@ReJ~P1<7I z8n+%?uFwvIMSuK6dvil8%Le)T6Z(=!tSb;{>+Lhm zz0vN&lxxs>PY{mJ!+3XKBeT3>{x>)vPmb3#4Rymq29XxZZp_^-RMG*5U^+JJ>HvJh z4Hb-U2z24PNM#?5fW}i8At`1aAD^0k%ZvpdMhWD|y=;JsQHvm4x{oB;uc45ykxDbP zRe%3$)WuZ5DLa2gN2w#VoRU&oDq%~SV#iwg*l~r5kZ!TaP+NMAl5m1us1@>9IZJKH zSJrY~m1Xuk95G}-9gfK1qxh3L2~x=BWA=d>YHu`PDiP}k_Gq=c2xslo%_x**dhnFNBjF>widSbt1B_O(wd`(P-3O`7(>n))>f#e2&}V2tTZQEc3fP(X15T+PSMG6Ih>BoD@*xL@Vm zi3g}@$jhV>zB=doUy>nkGKmP+muh{*=L+kqhE0TD&wm_} zO_3=1s=PUzzi7SodkYKMw#ab-B6ciCGLJ-M1$2cO&{$_!AvS_r4NG*1X*hg-fsC^- z(+b2E>*aQt21}5+@&nVk*<~r<8HqP-Wk4g4({kMAl~2sx9G^)?MY&1ib`k~19{Bnt z;JvmW7P4gFUf?9yLz!@_?z2at94Xw#t?8#-ttQHyiWAV3b>!`He2+ zszAPK;xcjK|6{6_{~MyM+{^Ax!P!qUwraQHrvX!()c#O&EcpT z>?wG@A9h=uF+5}7jOs8IIX7Z2xHks5fw2Uij3e_=eWT%nB-~eOG{b%y_))`OlV^Za zv`*Linqo;NUZDkY<}uWPFVoA*#B109l|?OJY?q#;BDo!Zxq*z-Re$f?lr%D24PDyB z4#Ngk0$HLhjANzDMu5g`?*eHWQing>-s(>nH|$}p31$$Lj(|}nvD+`U7s#Sv+wf-8 zTxx5dNquIUZ5QkBMGtUunc>1!l^WawKOVr8!TJe&%3@wVq{eJq?+JynZ{E)~LtnlNdxk$!Hm)~R5*H5F^6cv+Aj{Bpj?F)pT|bpb^85c> z8`m>y-y(Ka#5&3X6DH@}DP3_Wj6R-*TP0?4=;2$BiFiP%Fn=TY>_-YvryPjKs|2#7 zkmKID3j}$gim@Vgya3f!?EERyU~zV>z$|7Oq~eUmV~ZlO?z$KsGi;{*!GCYqAgfUp%^VQ&hEH@TDqC(ez-ddC^pZ| zB+@6W5~i8)^EUJPMdY@Ux-)fcW&>ltg|Heey=*K{)5~o`idYZWY;(tS8)k*p#BM?xEl{JH zpVl=;JAcaK>8ir!C}(wAwJx+c6w-XFWp2;T-Gq#K0ZgNs z=BVwkRcqEB=y12JGV#)3YaTlXCmSJXz*rD{`+s2>z9Cb8E0E+cHe>m5xqSkvb)KBF zebvM%I~j&=WB9C%8jO-qAY;Bcc@MFrfkY3#^G;=z8K?HF?(1Nu)Dn1*G$jb~tD&+Q z$c|&1_)H-$OGon`!JRu~T!LI2NFwV?no>E?Fh8ryt%KIWNHA8$#u4Hi=a_xDrXnAn zbAPlh%Xb-I(_J;bLg`)vw8^8Swr)(ZiH#P`UcNrC% z`-LcivO57sSuts6n2S=^#&bP`*w4-|yVn{GS3_O4rFN(*BfA-4R-+ja{3Ns+v4;4H z53WP`deEc9^$q47`OuY~P%k5sV(ZYQwSNJSu+B@5v>$P`ZYdmLo|reU9}3&7t%#3`(rw056|II9Yuv2j6)iI@MDod_6V7-~(SBDp~H!$o< zPPq^5G8us%phpw^aad@zN7uptOaNgsm1iJmn98XEwn<$zd-iNLF%O$E2G@Fmz~b06 z8=X1m%uQ7|2P<5$_Z4P|#_|!th=1{dmCAP*xLi_dFJvZWqOLn#cTw?d@f=CLkE*+z z?^AWRdOuYkaQ>dE52_DQ^gx>SOBTRDD8ylB!RsPYYz~;D6f!_6Lcm z`i%NCRevl>RCJ0W6%|pE)Mu&s9JcOx^#w_Nk*YtzqF=(Ik1oK3AniRNDi&c~g6N>) zDDbH-i(>>*J8U*!J{eMlj`5zOV)>~!QGJDq0d$U0e@fL?)z=_SoJ`f%)i)&dXH@;U z_%Zg+WN2>lw z{Y+B-Ox3@rf2Hc@>fa>w3#$HI{RdV5ss4+qU#fqj>c6pbzk>W4L4QYp{Nf_oSTX0Pfvf`*VLMx(Lu~q^;aRSv! zfh##bMlu_l5_df2Q-Dknf~bP;^#vGs=6DwcxSLi+wUOE=Dz>B30jy9fhtAMOqcaAb zvFMZ|d=-#H8-qzkBg=dagX4e{wEfVxKN47(I8xHa=gUt9d4IVB27`703}kdpMdvth zv;)zpL}voV9itsYwS%=Pfh;Oi-Z16;Blcz&i)x2x6R9={xQ;d%My@u6YE!joRGTj9 zRGWd$Ol=l*KLF#>eLpzbY}Z{d{PI&iQf-blmuiPX72-NELbb!hH3FGF9L*)3a0DNtt)lK{#F(V5rrH|q zSV=n$1b-gwcvzg6(vSr+bXlsE|v~H^Ph}R3G z&1jF!x~ejrs_zBe# zNcpTVJr9j0xf+Gg!U9H%=3 za(~qDM^M_+3sn5G_!lbf5_ePa1!UwW;Y|Ai(!xpN9aKA6yq;>OXs1%`G^CW%#XVFz z1LDLNkiWi&&P?q90NpNZOWK(@bDo8%&c;+{Q|%m>yI?9ii)!a;=TYr^aMTa93nUE~ z!nd>wsdf=M7o+oSO!^)1dPxJ`a=G?hDt}GYuAtiYv@0bIxXEm7tE62;wX3yjsCKP( z9Y6{Q(yrIOPqiDgA5izl>MQv&{G2wg3@`4FaUQ!7IrdH3%^=7O*Z7TU+q552?G_a} z@m8w+NV|<{w`+GG&wrb0cVg*xA)4>T58Kgq5BheX?_OZ7+D=H~eiwuHVQ?4D`+tWG z3dI1oPf=~R27UK{_MoIaM74)u5hIS(pd%l_);%g#QSC8^(;f#((4Ii&NfhEf7ym}Z z+r>NbmD1C2nRP=l6s0{ywWq-mzjBd+3eCEw8_EOGOnU~MA0yM;pCz%&lcv<#-r7L5 zXSL_3_B@igg3j~UxW#+dICj~g_J0D^UWA2{_7m+XNqY%-&dXGL1snVdj3O8Y;QI-7 z`A-fksZ{%e_9=BucL78HBlh$m_Wot_oo$_gcV1TF3wcx;1z1wg(EcQ8 zpHc148W8tiwa+E(ZvrXFoPRk$R8$`q$edwg6J>)hQ2zJ=+1THy_77;AYmuvlYX8*! zMYS&x;At@bO_~G~8M|w=689oOL;+BvGeYKz-Kj;;zY%F)f#dSvbTK|lL@_SUs0=c* zys21to@G-4BOdw(`8?1d^sP#%KpoVzm^!Iz6i}n&f{t^8@JC%gaDQD+sms+Q5KjRd zHT}j)>W%`TawqzVO@_@F^2 zC8l+fVCf8hBVa(&B1(&CNkNP^^Da1gUoK!4D6CdQ3HXDkeGT0zHA zx}OV1<~(buftO`w5(9K{55&dshECjB+khx%8sCcaeC9A^H-@zuUB|v;^jmif3+KJZ z4J?e_8;Twp1}SvdtuToGg&K zf)1c&T-ZtJfqxnh(}7G_MJ871I-Sx9IAq5*#VXk~Co>o?1fFPdzk|fT2;}fA?qe-C z@I~p$)H`>W7q?#7DoUS8>A~9PlvaVfL=VB54sGkPl3P5svNy1q6$V)4*6vUYAQnE) zVePlgJ>2LA7Ep8|b)AjCRpnz#L|xx?T|r%!xh|I|w0~-{`%+4$h&NEzCoTYODxF5@ zbobTNeI>GPZ-MsT>DL2FbOxm}T@O$?%k_XnXHzR?wtu^cx-WBIPTgm^&!Y55^?p32W6!`-YZuW))OD|GC#6Txqp9;Dn8v7wE~d1W z)=}yOpYu`YW0cm@B@$gqsn7L*xv(>D9ieoYdcQ=MQ`!K67__dDx}I=7xpzoR-I;=I z1}@SpzAe!fN>|WUO8pe3ns#tpKX<)JX$P{Im4E0QgPk`okD~?I*C0{n%g$G*^Hp?y ziq24O4moU57IO_#!kc(OycU6mZ=~*HaotUjm&Z?UyJpk&Sc{ zrGJ}od>v*kXexnmN4f$qnm2@F%#DjA7JEK-s6m`WGnZ47{`wdU+P5XVSCqYWUtjw?1prj7?o( z=&nAAo=xdFS}%3I3zYAA2g(0jdLF7u9)HXdb{hlGE$7nJfx?KDg8G64iJ@psb>zQm!Q9h z={0PoZ!Ch@$1zq+#p@7zm%J=$=H~r@2q3?$IC|xDRk2SkP`(`b`1QF6_UV;TR4m;6xI=l8PT| z>#2LL`%vm$;$BMK9`|DEo{E^ChR$?!!fxPcTj*BmKFNJDbsyzEnz|RDuzff>3!S?J zA|1*95XD!Ss{R~jhXo?Uhck9D4}TlGQ0~ESIGv7Wt^h?E)fnU+<>GvtU zf&PHHd)zv8eeQx);k3N;JpAAwV)91nUhZxHIiLVOMcs`!v9-GWl-@*dhJUV~$xkj) zx(ylC57D^=I*Hy2j{6KG;x0E#38ki-VXc>_GzEv$kC3t7=DwEF+p&RnfKPja-bv|Q z?rVWw=DHpYPThAQ51i0sm-GyUkfl#YLZS3k`WmILyLVIf6Ms+^eM4MB-4CPh zXUJ3bfS~K%<9>{~pLIV+-7mOb1Wc;b{Zsdg)cvaaHGv!lLb4&5gB)E61Z$HD4@peo z@UxrrSa`bH)t^iyF*gO6vOAHP7*@kAsq(oAaX!Tx+W}p=9_1?^SZ)|gJ}5GjD$>}U z7!Jf)1@q-YHsosxsei@}d9Pvn&DS|B56aTK^l$7{BQn0?S|}S&4TV&JG|U&9{0o$9 zKzzKdCz%CUMsZoK94@Iu3#%Y$U&v(juJK@T&OT@@tir*mbM0QDDR25L5c)K9rEgY& zjQDe8aR>RLP*XTmImuk7baKu=sWK4n?(fy3N$UQqcn+m+(tlqFWGU+JE3G9BOeBVe zfGzd8nJt6Cm`Nw`HEB&H@HJMsnTXO~(qB>c>u%u5Zz1b_n~uoC4k^P%n7ZF{zmE%` zUsLx-?%z`Sj&?Jp@2U^MWXCP05o>|U1iRfag$qMPIeD|5oKl(S@9T@ju}7)<3->=L z{f+zYl)i`98GoI%^k>^nLmPl{AUM9ATQ3vL<3W)N=NsF(pro5LiYfu(mc<`g7SF zalLqsKo+*QHl!``bCh5tnZp#UwgNuHDfJ`wZg%F6&lWIW&Ve=WZ|U#w^_^%E6*iQ9 zEWy&|6Tq~DCK}Qxm@TAHD9aTf*jfgal>Q#(GO2?80e|P8_suO>)=O*$li8R_RWK9M zPhlcfAJ)E0#b;1`I}L5p^3!A6>z3#rDgBcQYh8Cgy8(+j@55HOxw4WvcY~1XydR@n z?3fyLK7av{O`*;QxgUs_Iv-~F_>KD1xd%gPtSiAZ=0KoM+|#7{qb}hybmF)UFEd5O z$tK620)O(ODFaUC_vAp-p~FY&oPuQj*8XVPvBhPD6=9Ih68o)}z;+5MY=~p3&4m`4 z>tH)8v4CwlC^7S3SAod4p9?NvNsLWPKNVJ3Ay|ObbpkoE;6nH%2nFof8~Lqc`vsR^ z8VVQIA!&!x3j@M_%6UmaCFDA8T^KC(n-B`1^M9;IG7Ex(1x(|+f;8jVhiVH&ZLX3E zpmu-iuE>J64gKkNO~TY+pAqELOi&VyMcFJ4Gw}?*k>;E;R~?3VVWzbnG(6hKEcB-g ztc9-)M1y+7GJ^skqhK@UeDOPw#c;m(9n2uM&@$`>tN9Xc4kH9}ejFw`Oi1eR{?B+q zH-8>c&AThi{I-Yc3T{F=HVZB$9ijOR;h`T+E!4_B^X=07=FUMM?%WGAT7HgbW**vW z$bj=yJIKibQNoFp;bGkZ*L#oQ}3M2&K~#a`npU+TB)6Vcn7g77|{c9LvfxuHU*zyVUFjyll;jlSQt*W zpRF>Vvcju**#o|)02QVr@OY7JItSpT|u$x=Zpr*m+ZEEXm z^>lh_YrTGdXRCKbyRX$-hX*~G${g0mgFUN}>iA*M;DqdyrXH;!){U>(z<=n% zC^I7^6gM}&36291hz8h8NiLn=fzmW&>rA-wfQ6lo##5@s>1f~y%V6jX1YeBznJF^x zr);rnLaB~4FOf-g8x~m}PIRD_)J$hqC{A96b4w|E$N>fZR6&xF1$--;TbKKqmO%2w z9zQUm0}L|g@V5GWz?$m#$bU@HLNR=8U1cAtBaJMJJ#~<-!-x6UH3s>R%Ai+)SaWFJ z>H*t zL_GyEAA3P4xmf4wi%^RWA?v!00?{-0xjsB}jyEu*Zll;o*czhR0)Me(F9_K+kR3A{ zz$4@H3pta`uI7lcXLg4Ds#>;s1V9>Fn-Iq~iUrTtS{k^$Y63~`}aZS_6>>RkX z;HEC_CWD5Cu>$0iFNzJ^mwCxjKFzb2g;&+p`x;=9k^HL~8+=X6@ku=-ogAPq ze&>>|^{_jm*vyyZ^Sx;<>s|v#7)@nhom-1*}gyLLss=Faw}ty>3fm)OkjZu$klj9Eop!Xn zjh0>0n#HR#?|;i2=vg%-7>Ol}8z;u*E}z{E$e9#RSAvWxT|HJ?@I@;2A)4o1kV7cz zkQ+BO*LeZ4-eX$4wIH-~f-F|YSSc*_*=1~g_I9?HA40%&e#)!*@ZPpQ&Xg<6HI%I| zf19Tbr5`o5h61Fd0_Ka88j^!Gv6lqQ6Y=$da0EaX$bZ7g`Mu(rO9qyc)xSvRdsc(K0dEro28`;4iiQDFFcHsN?`dyn6UfQ= zuZL35wtw}+V;j+SwPwIN@}!)lL-%P`wgI}c2ztQJnJL#ec9I-5Lgz78+4OBji*1`w<`W5%ACSKUzQ`r+QQXvhb7Dlv1` zsfH6E+Q%aO$RQLQxdzlLhcj^V-=%^o#}B$FGk;Z|tlowg@{n>^;^ul>U(!gL;C=pwowV z#3n;TH*Wn+4GxXpvS?l%h>HVud!TXAszKez>LvQ;JS?6#iv8;&%k(5H<@pY_$baP2 z4aoC`#8!@i0RFRwdr5JwVusOGxwdxM9e?mJXqhhJu;G>kx$@JlX6Ay$e;$|BXXHbc zSd*`zT6#8^+Hso2-N3ndRGg0J8uN~M+opCNn~52PEE|4LS@j{)X15HsxB9$M#<~Fy z!If8tZOl>Ic zG2YY*RK_=O8hw7huW3mqldN%QTFUPP@@!il)kXq|1PB|s^^t6ZV+0?h#ebH5*%WI_ zvyuVPn-8Zl+_49vjC+EIwE8fYd^q)U8o{d>gF7Lc!84vz<-D*{n_IR!-pulSsi$S7wKwLmWr8K?i`X8on!m4BUkoi ztPAV?_MOlJ2WCyiMa3>0XsAN+Hny~_LM>4fjCLP-ZFk_-#v&0t$oIR%1bd&P!oK&L z`p&nR@g|0PJjR&K=JxXSFets$&{1;bFIP|wzB^$Jui-8zQPRe(>wnS67HwvDAlh?b ztaERdOc`tN>@~T2oxYi|sM0he3C`R`q(unCS1|o&*cjH}n@&UWj7*V5^))tn>wKOz zuOGPyV;_7MBm2P_A0zjYm9>ms>wK-=+P3CaAiI%9lwklk-sEp@X=!dn zRdRiEYon(P&CC+!mVb`-gmF$Y&inVUPJD4!p zFl_i))l5?3HM`JU!JkqJTdRXIL|q`1zK$LR+_8DFzpb^M?Y_3R)Om2Aj<)Yq+Shs# zzVgdujWDb*y89!6cxtgY0?p}KTAN!8k!xTj`w;tvYkzV`wE1r(=6ww|f32*TYigNw zJ2y`s8PzxPr(o=DR~fbqE1b*o=T7!Ll~Eb$sSzFpXKRr>pVwKz}mz{_ODBkD+s6Mrd*4 zpr2$lO@FOzZmMta)iPttQt0Nz#`861Cr=rSWNkgk$_FsnurA>gl)5h{+h`-7<^Jj{ zX*pfH#>eqN1Mk45GLGnr>$nwX?xB_E%7iSL@7NivYR+)q?ZZ{3QB#J-YTJE8yV2Xq`dzX1v48Ve;hAl;?wjH|n{hB4x_}>A(RR9- zl%GPUgYDkuD?qUIj}sO?!#!o1so0#e03V_oM!*OHhEn(NPE6fRi7kVc2I3OdQ$6X3b(jD4yJq_hn#s z5m?RFoP1Eq#w#vN%Yxik$+O$Bp!D|unMnp?4i%Gg7mXb{(%gr@`=>1Hrr=(h4CQAT zgk;tj?lmk_kscR^qX9fMAx>uFJilAW%zrhN(^Cg*ZN}gTPtR1tt2IlQJp>=h$jr_R zdh2{``QMioNU(z&eD#+ESUU1dtJg_!_BM^AY&mV*_cxylebd%5?E zW(-TV0kNE~fl?Cqz_xV*SDPoK{Kh%}a(|HWO~I$L)$4C==b+UWaTT$85f=K+~(7;EV|YyUJNj(5@gyU2e`` zc9r=jz;Q5!zu9R)&}JF8&dXi@kbf;Ivst#|s*}H;iBGWNL~1=jJbeIGoJ;aWrG0N` zp1Bq``z)Wc6ocPgir^-C0&_A;F0m~2trnEv{oS5u$ae3GcW|9x_QG{>rg1nwZOtAR zHB1vZLCa0eolH7q3Tm@Q><<)dP5?&P6Ry4Z&ZuF5a6}#uCGeHwaB}l3V}IhR3wP@Y zep+2KHVqA>0Hpn`L;!75G04)Q5u zq_(hueG}=$8NC72U@qSHlYil;I)bkqUcO*z?lUe+VDY%g(%IJPY4T%vbp!4GWXQeg zT{ph1v8B`RZR>3F9@CbZk{Ug&%e}35<`EBc!VJY>C{2~%1H7=@q zLz7F|vK)xdUcQEb_Le0eqkGw=wI_)?>g;?e)aPe=wX*qcEouRL!>-VQ)&OPZ(GI%` zD)Uiowg>IYd;2ZTQhy}-t|G&_-B|8ZMzq#7M$7ZH;!CR}=bcE*^0_~1D?Gjr-p3ub zvZV+FIn=Rw>KZ#6nwO-^b5a^>l`FlB=fC+`F!Rc+cQX58n1{fIV@IB@TFXL-fO$JT;uDFP>dPQy7^_RFem$(fPYco=5uF@r`6Ml%Jo_oqTENGp^7?ZAkhQht z;x#%7*Ndh-n}5cH{k9mN@aGkvjb#g7d_0<;C*=qpVcI_#+W>>^aO9!*&rmAom&}}q zOa@<^VR{8}S4d9)c0$%evF4>O)Ys%`X@N<}vltJx4tcUR-AtHFaCSOI5JDyp1+NJO zpMn>JvfulS-v^A}2aVr{jNgZi-#y0fBkWhj$2o}Le19DL4(Ai3!uh20DF{D}Vd8`E zGtM8IVdt|Deh%^(VaF^8KW_`qhVToiu=7O-|HKx43BoTsUjcswzL3FwUp0PTv(@uD zgx|1*e+J>7XMBItRxZN%3tPAW!oReImqPegw(t@Nzhw)*4dGwg!tcQUyUyP*|9j5& z+3yF=4}UE@eFXo%wc+h|C1dfCVDMiJnEk~0d-(DP2-O1)1^C^6>QiLocH-PZM(iTu z)Sbk&ji}t`zKxaeDY$Ny_EzT~!KFN(^G~do1m|bYKO1E>K{_Xk zQCHnZw0ohd2gnHU7TrsVr|uxd)25Fv7k85q7nv&FOG@Eu8GIdiFBt`2M^(6XlJb=) zkPad;fK*9DVH_zICXjK$L1eOUFqt7#k;8>U$YNn419cIv+5)xK`7h^}4Afc%w1fHn z4S#5MGT&F=6PXVi;=+cA#AwLbkOouD%xuUsY=Scz=;`S&A3!81YO(?I6f#PfN-Biu zq)M0paL=@%cBTdIOhz&S^BJhcx7Q7bYT*lhtH9cJlF?g;By1xicxcQcWb9q(bRf*J z(Lse#iGUBs8wDAW zcz`%+Z4mEgLA;*@v0_1NqO=sMDBS{`3#7T5>@Sd16-C%bLOtMm2`LeLHt0(&=zmpF zGYYITpvRKvwB2O9gJfZ$0ftti4Mf|}5~(MdG;%0R^0JicWzyVA8-iRGf<{@*Nnv~^sd@_V1V6jU zA=wyT0~kLRFn)YC#!a}ya`+!Djxpdm%qUvry*N=InZN~XWvLc$W5o&sxDOy5@`Dg# zQLcx`q*c!CWU_yixSdS#?)c;?|P=gdXVUFsT!I z$xg$7z}{@$UJeJI38+WK}L!PhzBw_LKanp#7c1jgD)f= z1RT$i)~^SPRYvPiHCjKDwSQi;TF=_uI2{_?G-ErNcN0en_^!HMK(ANtzabkTRuOs*r5d zKYBZ9#`JQ9%+qfp?h0woXcvI7m5kX=TFO>bh`UHD=Hn?4gn#YC&+BcwnRMi=msQ!0 z;T@zSt1#$#13j#W5iFIeZzD4E-Hu6DR){dgQ~(J`fQe%;o4r-HL$7QjcarVaNCgG} zeexYrCR_p(e<`rw%gHq1yJWU-1z8|`j~p#rNtOs($SPqgIZn8m1chrzM7Wl$7p^Bs z;rrwy;RbS=@P7kxk#HlqRJe(36>cUs2tOp-gj>m-!hK}B@FTKAxSKpCY$wkO_mEeF z9pp9PUh*?x7x}fYn|vbNPyQl2Nd6`~B)Ei!1y$H1lnIXr@lfC)K~gFn27h9^i)^*xo;7?j*+HrpUy;Zs zMw|qgXc6aO4x!ALA0$;D>I5N6aN<61LgH;$vH$l3~d z7wM^HKvpOjth-vRP!Sq!I|*+k`&DR+`;Elk`F}SN?E!KENU`hoSb5XHqZJgv+h#&F z;dTqDU1TgE<~1@wcoX>IFF>mOCCC$sEa_VuMWn+~Vy%N( z0A_PGI>sXQW2{y$uv$G=Y%yAWFl%f29JE4gHHN|+P!`TX7e7Fvt6)_Ws}}d)LbM8K zYTvzN{dl0<3K14Yan_=ebYvtLGLrsPZbZo{;OzbWRWJi=Fldyq?di~N_}N$upMR%S zxGnjL2&IOEg}9z>`>!$n7s3A}0L^D6G~39B+sJz+e47xyt;D^Jyo?oW-U`w1d-zsD zD@0g;#`RT#STDPD)kV2Or8R#0u#tLzv(xR$+>hAcavc ztAFzr;$hY9CMP=x*0ckKOOQh<41aI%CQ^hsPhn+`+D1yZlT%^Z52um=sn418xIK#L;=NH99XgWmfRDqs+>D9c<;U3TFfDt^^8g7Z!@g;4DLq73Q)L z>xMaYnz#z`N@-NQT3lmL@qdv(!zz^KftAN;(@La=$m!VOXD})~lTqnej7raDRC*4h z(sTW*N+9Yypo;Th4FH1U89T`ZkC1Oxi{L+#`M<^F%CmNo3%8K{wv&r0TsNbTGOt3s ziHz7zF2-M%c-ypH zE+qFlE(T)zHhIZ$33<(NDS5+j1^L|ZJ@R+Q7NOK}l`z_IwNT}_Mp)#yo)JzTF!(Eo zM?4nDKqA+X!^Pu(aUtP&EW+_vgyRv9XM|HDxW!KK8$dWq$bUZ=k%+`k{vZa#AP~+e zOeT3ljY)CBpmX0vQ+Gbyt3G1EEjnhC!{S>9O61LVi48ohLq5NYYCUQ$T{CF zR7=1KW=@?ZiXfL>UoB0=`TF}i$PLEt5AgR!bZ!#wBR9`?m%F!;QbaZ^EHAqp%ef83 zflq{LS*TWoYJYY5F0!p!VL5=rc99=$Ar#2zmTGw$xo{eO1kYLAQ|{VI0%lFsnpyXD zaw`bGWk1?QZmZU|0h6`jZ@-C*PlfKdi4<=qcUqjLLKZ4CkwNU-Mef3i##JbSS%H&% z5%G&MwL-2??jv_^HTd6rtwPyFwxfiyy+YkZ?pax`-G2shMMh)=-7|IC^!tcotF;Jo zfY4knOhz@DFcp6dMt3Qx0`HB)<$wj7V;eBMTgV8>(F89w8Sy9tFnu7`fT;IJwL5 z1bN=^6o2`dX1hsKKJy28(7J7zHvVkr?M{O7JDP zni70S(Jo+si^U`gC1iwfl-MtB$Y6FG#Z3lX_J12w_6jEYjRYQ34AY<`@;yLy!0)}) zqA>~WbP&Gcxes^-u&|qOwYIBl_q4PX6ehUeV1G=ueSmWqkVsuS$%B{-q}{1$((Xfs zILW5ChgkwQ%w5}H=7i)&-b^ZBaagv8Rb*Qk9*18aL17hs9|d6*e;;G1A1`|%GxaR| z`hVn2r*C$iA-8L4ypnKU>)C#xKPBWoRB0MY$} zBpm+)V*3}l-0>wa=dZ{O(7(4k1#+*`L4RIyI>|4bBKeKeMLux4g)*lqjB#qhIA@Vi z^CjTtJG%%^>^A$O;NA0GGmskq7umjzi~!O?Uxj;5 zx$CxSDeaTYKgoM4q&)ys1$4n7Q1BsS68m*Q%v`1%JDeO1zekhB>~}82%(b{kH7SBV zMAhFom^b$)s&hOkaUMV_oD;}+=YPTEAZHah1b*i_E6HIHcR2Wugt()f2V1H)XpALV zH;U&PYPLr4JT{6QFr%CgpFPs~8gHx1NOLmcn~5-&ZPJSaCYw^|%UUR>Zp zM-t~NqtSQyR&v;AiF>9^o3WF;bj||TbX0tRM;h%KEx`vm1JU#H)~|lzoPV!uBhGT= zwx;dmr;z&9UF5ZDu>xh5*SC{5c9EX}mqmy>fLpy{;AJr>0lZ8lZs#;I!a1FkIRJb> zgTH5xF-{OAowLYv=WM{m9Kgd|(&RjptoVPVeFvNrMbmfH?DXWlw6_NXN6xpq2m*&J z0wMxRmW+T%5CkzRDk^5hKu}B|X5oJfC~&~t;h`uhsQ8#4BVt0qfH^0=s-E7tz2o$I zzwgx_H?=*fLxq1;SNBA^!stkM7#BH=oQxhYBa(*GBRxZyXOK3$jBlN{Yna~J&=}UrZlo0}>pS|eRyF-&Zppg2i;63^^ zl5rk&Qom~0MQZZ>g54GH0ompcD&WIm)$q{->d}uY;gfZdf<1vw!F6@G>j>(_zK|0c z0I|qG>cJtzRYRdeWH@w;j39r`Iu;I(jD&uX(bR)uV0vU6%#BP4x$AJ!Slky8=m_2P zWn_3Y8YfS`i74)sQ>EPih`~htX2LL7i@R>oZ&iWu8|XfE1G~lb6_84CIB+w3$}!;%GG&>_W;^vf#vs-|ycpgD39 zSdrO~8<~?8Xl@o(sF@18TF^khN57XUlnZ(KecW@kY~}r7pn0^K@GGEd?5}{YhbFfl z)CF<^CvrNy`HZXyyn=u5tp(v*9eov#SFLxgrl$q(I!V2&rL@Zhqzk{vGRstfZ)F9l z;Jdo5J{RJV`J|sN%6fmx@ck_nk|38zf8e0^Kd3*X-v0*;9}nO;^}e5kAfM{+J=I}Y zY6t21b;)5I{rN!wg?|aTkq^Y$=tuT$f8swsSHLeSBKvDFkiUP`G)cxZB9~K>t|hg5 z9khrnCY8Gc+C`R;klYNNBDcWE$gN?7y#+Zs4=d(BCv5aN;rzxq`Wh)D9bkyMt`jMn zNAyRj3r0e#z*nr*C2Pr&2VHVJJ)af2SCYU;ag#W;;`cfM#K=8aia&eSPFYi;)(6&< zsB$&S?CBer_v?SWb)!=JO#^@iXIH}?)c1d;P3nBRBvA=}4P{><-#3%Y44)G#Y=V0@ zVAMIuBlCF>mxvbp?OPQ4p0HR5JmhH;_1(8ViK!-v!->W z?7T!)fgK^|AW}xk>Op82c?jAP>n9?QK$pm)aAagH432-ShY695a6CQWj7X*IjY(Ah zF3?urMEz}XOTvCRJM5RU^$ID1OjW9WIa~IXE~#><6PVf{VXX}(69%abYc;(}-%OZ` zd+i3g#-lUqF)c7nu9nT3?IP*BS^;w+FmobG=A0lM`iat^KQ22c`V+ZRbQs&+71$iIJ>j}iH!3iU_@60rR-Ey|!MkOS9uw}a!m6=-m2yx{M&;CTs$b@5-#XJzu&mSPWAao+hI`VS`jpW ztFCj^tFVwcu%^;X2Q?*@ge@uJJhKYpRak#CtPDo7e|=KgRZruCa`$f4z;`#3mjT=u z&-bz#-w9@M`ODc)cu{X?sLK#ze6<+>bZ;FAG~W$9SM71->rWnjO|tq z&y3famG2-Kv{eQQRAcK2mDolG^|9>=a<`3jj0FxU$9Aj1Oq9_-W=&HGNc$iLE|XkH z9_%2^1)DR)c`n$2wRQ!Tq+N2$%a}|ohr3t}lQQY(o01|PWnLzrUxlf3)Q^^9$JLPM z8~P?Z#5a6z6L#VYJBPP){vUtbawuQeWjiblZt3zrxTR|uOlz_n`f@$HEr%ZJrNjOQ zFD(t8(7gPO+(dVk{Dfq1EYw3MV5pb&0VFx`WDNViYbKOn9BLRj`jSoT+@ z49!d#_6f_539mbsYWIJk{t?-S(=kW?SpS49%5m6E<~4B`?21sPt_VYJSLl0G1mp_+ zQx$T%LjOz}zhXQ|%`dbe&Cp2SOI+WdTDeb3^|91uPT{PHfXEX43o6N$nlJUQlo_0* zoYI(#bnY8Qu9%%7kMi?%S)QXz*V2cOaU4qOU>M}!^m4$rU>}%;$d?M6CyX67kbyDAA9Hq&@|DkjCvx&UHV177VA69<84OWA)QuvVIPn zq+dWtbsn6ep9>f0=fOq#e7Hnk09Wakgg(nDDkqEGt%YIlEev~aq3XRPObU7rdeD2m z)2CAp4yU(&UuQ;E(|^!^R0BF*Wg9lH-;E4Iv;K=>jXUUGb{<|%%Jigo zIgH@k9v*Nt(OE)91_v?j7u#V7oiKuH#w3Fbqohm^YU>NWYz(;ubW>2)#pgL{9PXSb zpVKfemD5~eWaaN(HNHzdUyav z>JJiUJp|MBH86)zz-jtgm`DEUe0@FfOF7)EZ-9T5%zY1Ue+3N>4VEqC>90Mx04l!rcf@5N@Jhv#49?a1wPg6;7qzwaamKP!XK7 z8ZJMm^P+_FabiLioE)_6_+h1o`W~T{T`+_Y=NSD%n4*75oJ@FM-$$}QSYQ7VmXlq*Pu~v@ zk%8N&e*@L}ckrzKJ;}t6@TNf6B{cY0Sn!L;!F-X64MYKs6pio_QH)oMCb(EM#hXPl zTq&C4eWE395Uuc8(HdVDZSif<4nKbu?eTNb0e=uBT0|tYs7PupMM_JGj#?MdCG-b& zK~I4av3v~Oghtvt3co;e5h1zDfoZTw=#dI?QtBBGaj8lKU6FJgJ zAA(;q)tCqyj4({gLs>`O(SCk2JVRzn;F)xwGExC~RCqQW?BL*(<2ixnoz`PGk37F~SsPf&%{?{CPd`mQ{B-&7 zb4c>e^M&;|&g09@mzT|#mtB7#FS}4)b`f2+fRTbNQ!!kQM{Xfq%(mpxaN5$4u6f7e z6;R^S11^%+Hc;dW4yQ3mChp>_`|(V9*-&3sF$Hd_E?X*OLk(`Atfl!cwUqS>9vUe% z)qJU~mzrhJMpdjyowOjlgf6s#3@N@fZZ3yw|DUu(F!L%WZ1Dnq;z@rMcq#w5kbhjJ zew@!&O|8JoRXq%DIGvxxe`Y3v5CG{Ix^%v8(@kYCC8PFL0vlK33R#USWi_r+DQ#Bx z=Bu;cyfFLCr|_HQv+2w=@=P7?Ms$bq;&7NMdcj(8Bs?bi!B%k;Y!d_FWpOmTCys&d z#31-x41oh;C~9H^M#X=zI9!au(PAu)6BF<_aU4z)6Y(T52~QW3@j`JtUM{BKwPGqR z5!3M|F$1@WnfSbzg>QUeF3Q4saS3yQ8Wa`9q6sg?5KY4f;1HFx z+c0}^0bUnCf{lN8eVu70acS0*8-~E8VGvTzMvfK9z7d$=Te^NLp}F zIWDHZ_dve-wS@lOUjvjGYWTj`j7t#+o>k)w6MRvLH&UxHEiw^~T4`c|_L6EOll>(H zIip}Kc00C|B*@Op^Tp!AXoUj$w!Xe^17%HxZ*=;1rEsIT z0d5yJLAAIUwusx{8Sr!L)$xA7dN(AQ+#M5UCMXVUbxOPsYl(CtY{;)>09yGFOE zxCv zH6?cg;gH1=&68|JrEHZQXjvmk$3p`ex^jO~Y#T@~Zh{7)lCWJB^bwDdWL3j)VhhY7 zRWMgcM4LRs2L-PHa$pv$6rD(VT(}Enh|Urd_Jrrep>l?;4Satj z<5|4A)C}WUrs$&LS!PC7(agvym30kdm8d{g8^E`s8~LM#WFDSpku?#A$vBy*VpmpNsVHRhqL9&x z#Nlc-wMg{hmef-Fy)$puI?z)&VxE65-`YgQiiqD@Fn_mO1%5d`7{iAWwHEZ?y5i+< zkF*rEa^j@hM-Ze>+K?+EgbF?xK$&~y6%f*jyr}zo(5xr)68fG|4*+zvbc;SChGqtp6Ik80_nc2HN3||a}%jIGZLG4%|jv%2h(9Bv; zlphK}ewfmhpJ5xKB-@a~rAu>EEBi|H&0rI4w$g{)Rm5za2EB+mL@_68pEOK{0BU7E zWKS;R`m7ZU7zrjjG|q+Gh~%pG7xdKItX`%|@oBm5L0pJLR03deszf`>W5!`$Fu zr0jOUY#CGFd?kLM5uktEARo9vK5(N#{82x;5jWAzbf}<5(V;T!l|egsXBAd$#?6__ z9t$q34ldh5uW~p#Fm*W;la38C3<`YmrARRo*W=^7OsrQK2yR*^-J#$I}M7kg=Dq}6k~s5F@UtK4!z+wH3QI} zwD~|8NgD!RilgNWz$nu4$4ISw9juWnkZiaSR*6A$okI+Lrx?t0f^auki6L~IS4)Ep z6~mPNoU5kCn<@r;f~Utf;@0iTG*i)&TGk3_x$NEOO8wjo3XD>S89kthk&+}*CRZG?37?gj6vW$3AR!KOGfBt}a-4r+` zXEZ#~Q=;WM=vgHZ$8ft;gFHd56g^KyPQrsraTaXNN2&cI>DnRu*mHjXpS!HLE^oMoJg7Z~$H8GBBtaTgs@ z-n>r7#aU$8$I5xRt}sxHBe`>#t3tV35Gv{gV!VHpyKiB!lDnVPY={mMv6Yx075_9W z7RO1sn~iZXkHDsNf093DHk^4 z)4llbGrehW8kXaWG5n9@9iEI0oUA696ED>{5yZpHgC&BO{TWg&Oeq%@%Y|G$q*ek- zg-d_pq4VJo5(+v@?ryN&)ktQdEFv}^%B3=f!%AJo&3X-PCWKi3YPebI-$?q`D_AJT zpZcY z>l$hd9j>Ov&|zWPp^lGK;Ok{j#FuA~(;I(`oN~6R40~1?MRHNWQ;3`Kzb*v(L?o*5 z%?Sy_LO2HLzjAyF<$smJcKQchp`oPQhQ?qjx{#oWMdP~ zAbWbUQHf_7Rd~Kpjh7ft;^oE`yplA_GUExn#dr$W8r!hKcp6_bp26M5b}49YKpa{t z=Q#?!Lh4&Z<)8?uMjpOCgPBXKjnAVwws-U99qAJ6GeoWQ5)u!ui@m6Uiz}ZNgm%nah7|M#>;J zSq?X>4i)G7Sw2Q!8(*Q}eifp|Yos?{heM1vvTS2#*|?)uyC}-iYBR_30tCdKmWv(zp>n_)-fZ4Km~)bAV*X;Y6lX$ib$^v*mx3+q?KqF!?WS zbbh9U>REQ+*%IGjFO(EbE7tO%qFD`jP1vA&TlG@COcG@WZk64<$KMN`aV=@6$Dp$&G)Ie4xr{Sl z5ur&i-X`9B2YlmQ!pDE_!C}TO=wrMO!;RfA()a+z7#|Ww{s^WRAH#{pCotF81M`ee zVS(`(Ty5-yWyU_T@t?y=V?S&%zK1H~Yk17~hHU+}u+#XFu<~z&m4AZIji2Ec;}`hd z_?__bA7~qYV%+!}TN?+klZn{X)Ucl!!NI1EqfCLLO%o@WHco#s9X!c&@oLky=A@y&&G`sb2+gU&w#ly-eTcC$dwAx(s;g%@3rtGcu1TgP6bnI7CNn@ zF~WF$`wZIA+KbavJiom-T`JdN%@b$HJfp+#Tjgc+!OwrCnl&;rbm|Rf*3N|%XNA7Q z?Mh|#uU|`%irHV2?m1L(_tzRE>CEGVR+CtT-|#kat*h|cI@_0-r4To}LnHGrXk+$( zL(DXEH+#ZSX0I%D+COwP`l}#R8)z=h=8WQ6Q0yErPla(`S7F@uljXRC!;eWBqWexp z<@1tZi2i>bh)a0#eHHwd*W%PDy!y9hN=aCi3Q(2E1V-oqKk&MzaQ)(Xo(b%=D%cs| z$&(ee zWgZWk&8hH|ISu|}PKW=RGvG~g7VI)l3YSVJ6-P#>2DVxwxGbdBh17pSYB*di`7i=w z;8JDyC&C5F@Y8^WL;ZdjrF&n-7PVU3d2VK?Bclj)do<+FOYUrw%$khJ8tD6Lo7GxI z>X(0vk@}T$Gk)XkvvA3<6y24Scjg4!32w&UBamfGbYBmQ32}nTBOS<;GA2gCH`tiS z)KlLy>hWyVi`A|SoS)5%#gXm6^|Y1iX-n7h5Z?&`d*!&AY)d)*k#@O)oD#C=-UAoa zn3b{vr_;5tXf-5~9DYAAwZu0SGCqTGKrMe{>~1ZCiR#(Cl3^(OUT9r&SI>IyYE!~f zNsEaU%l`gb&LI8io3%V+mZie&kYsG_oArZhSAuId0M})IZ(0u;7GrB{N5*X=9*2`N zMhzZ?1hM(a(B7O&?0pJpiBn;)c^a|z8E~9=CY)%V4QH6=z*2J_+-9B&)#iDy%{+e} zo;T;iN9G0aqj@2Mc@ajIMQ5# z$C)?bWOFG_F>kPtAo`*lB zz&M1NyNUD3h!`**he;#CG0W#ek?%_}7GzO8k3h5;x%i`lG?YyVKMOUg|RaYFLt!u_AmI6Xkz&XBo8R zlUca1F#N?aaKqQPCf6l5;sKtL+o-{I5Xp6z=9$x!)S%~OG&XOnqM?+q%pOL(&5fpQ z53)8TEmWB0d0EL!fQ8^%N8S-#l+y_18szy7wCRP9`%^2{%wvH2z0=l$W#RO4_7EcNCqF5z5vQ&8%1VsZ%Z_8E#c{yX4Ssj7ZsWv0FQ713#7vZEO&8iyhfG9T#J8Bi1-fGKQXFG%c(KWWe2t)Z}t*w)UzBMg7R7}KXnIq)mq+!N-aM) zf3-Xxm09g+r>y3z!)GrGXW@BOS_vk6H<|Kv4z&3q5;rQeg0#nrM9Cjsr>4>EL^@hV ze|dRVw8W2+58-HHKfUCh(Wl6b-8d=36bXvDF$|TWztk)ecLo_Bhn)fFrFE9Al+$vegl%Tb*#W zbts-@b-{mmR#&{h>V}tC-SIZ-FudRDfe%{2#K~^r#3>3g+psvK-d2=Lj(vNvP{y|I zg}%X}5^M+&agBa2Igck0buDo&Pok^|b?KULp~)I?ow#1kORf=%h>A#RG2N?6Y6($7 zQcL9`*p9eBF84A?`<|h~-JijBaRXgvV{2Hb-rIj!0dyCK!W8{4aU;33v!P#57n}#B zVwt!JazY#tJa7s;Rv{7rrm(sCqX<-@6^7HGzsUWziU41tlTJQDhHSG_+ zBVM>1x@IcdA*igJUn=|i6W>!p<#BEcKPi7sPb#R?O3MD;&KHTqI=YdDA(mj-_RUHy zxk*cu(QhiQ&{BLL`PMoT5f3l3TvUqS=+_&g5q(Skv!|^4_NgS%cs(YY6nRhLTfWMYYKc|oj`hG zDtv8CL)V&)h1Lwx4<}+%YbN%xPQrfy)@;%bCzF1di&L#raHe%C>4wwsRO<{p%Q_1$ zx6Z+wH{fU4S=P7m|)xfDc<2<3{UJthO%0oz@ljnsp_u6484(7HuyVcn`FtmRr)YlYU^TB#jn-64O2T_->* zcoXu(t>QM)KA({WSx&NFh;F6~8;51R!t17EbFqT-P#(<12I6+H67u03%n^4GRR9Z6 zh&zdjkv=F5?uAvbTiiuuaq{qbiMvU2<>D`3iF-&#xnSfH9)K)?Zd&Y0aEK}l49Kyk!M-|>5^joCnU9+ zbeJKjGNMdLJwTKtDb|U$q#l%kJf@b)IfZ6gJMj?Jz=M?Li-)N!3WsSqVvTqNa&R}C zB(+{{sP$yK#iLY`9jI6=E&r&h~sP zsnEK`v{IQP;U&gyn#TpwZ(U^5FxYm8p*1Df;;VS53t%iZt12EQl zILrfV3n{sTk$22FN?IF6XxUqNW+wKB%4LXJ*j8Dhe^DnWv!1X~(AMXJgemC3I>#&_ z-AfAPFtXz6s0YWCJotZRvO?=YNJ2}~QEHiS-{nXCcqp4vnoH(878ST3Ih-?LX2ctXv!Mn5dSOYa_N0rIBKYi^n58%#BGHjJBn;Q-R$7zSCNkO|pC z;`Aw;ZS8~etwS2BWh8g!iaiU z?OF1W*cPZTqE^W41g4maElDx&+LB_`e-|J?-Wndb1a&dd6S_Nfx8PJ#!c;LHpGj|_b277tS z31XZT(41dc$nJ&YBZn_90|JG7F!@mDX1@LbuG4>g)!N7j<=UunZFIRdrcxW5&O<_m zIh=&YNjfoY90QOFZ9H?_gevX0bbhrqae|*)rA?~TCZ`MJFGu}~$zPWGRY(Zr9B#}sKJfP}{M<@yI%DDrZ3cH}jGM-(721gv+RQTQAL>pj+z}Mcl7%jlClSfr z9P=G@a(0C_hwrfYF^+o7$+A%1F_%b&Z`2*9P*1sj{$}k|4FW*t>!s0h?X;M7IyWre z&sQEQVYf5nPwh;(>WDnO<^1a``W4|{*YSU^vsV+37-SNNN1Dsxv$^=3OtGCQp3KGb zR>Md+D5R1nU6IB$=FVBP_HvxYdrp3R}SawgDS#6CSf|c*=I+Svv}E*g3G<&V_I7 zJov#bK+}$4zFmmT>^P?EBJ625z`=GgjmG&TQjXhYaw1;S0?V;K>dziM%9~CM8&WtVbm9hD#U3jH7tf> zpn=@SuYeQ1#7^-dnWrD%I`UNiL-_Go*c?1hYXYvsJNa5q<#Fe0m5M6Rc7Z2eVm!)f zFhrc+h109wWxQ*mly^ zgP>`^cWk7?txw@twV4i4;yt-hVIK4qyJY%d5%d)A6Ia&G6W<-erVTXW3>S9Rf=#5! zk74YTP}pe&w8%m?yh(Cx0Cc6im17vB>(9%=O>;T@O&ZOC{JekC5R2tx?kIz!|Mk%& zSx;;FFIU!wtK=#&`*eudXAt+C3HkO}(A+*7dfW40fPF3uw$Foc_60E2zL1pXMR2;k z04}gEf#vq)u*$v)p0pQ+>sz>sG9A7%L{vLNM71+SR69dNwKGIiJ3~aZGelH7LqxSx zimffF45Hc@BC3DqLPWK-9z^wl_)vKWpVLtCXAt|;K-(rI3Dsi^KV>GO?{X(yyzZaQ zTvBIgi@g|JdkM6$ZwR;NrB{Sq(I@PRK4Dk%3A>_C*cE-kuILkXMW3)M`h;E4C+vzo zQiC~?Qre0rsjX^tz(<)5z^=*#m?`7-c@qC+qV{BfGwgpYHv(uH<S8JC~sMM}V=VpjJKbK%KzZLn}S7McR zm7hm{ua*&7lS6y`%V3&J`{U|1t6P_WHLB|H|L=e5*T*+S-E;;wu-_L+$P$PBmQ$PBkqnc`NW6t@zkxRofytwbqqB}#ECQHooMQrt?E;#Q&p zZjIn@#jPF=IEY(Od?xlP$@kUXuQ${?V^^&$Bv!a4vn9NCt=tk`_eD&*j*tKu^Uj;J z>wV4_(5@#$ut{4~yc}BkdbPHA0v9fdX-j|fN^R*T?S|m08|acIbuYOwxMW#y$uhbm z`%5MP0Qdyr_8w?ze+nh`XVBB$3rE}gV2J%W*`P0Iu)l)S?EP?s{WUDMzs=f}_=Zq% z+z@6d-5~a*qQ#ea+B)*^yDuG$zOI~YGtHZt$8JM7=UFFUX$3%oVrs@p%3Ui=A~ z*gsPw0-fcq!V%(ufijBA4H^|Tca+>fir3wLExu8sy+2si10U5p z+To^KwQ~m5Co5zE^Quz$O&w9ONTJO%pTI-cvhCGGG>EDG3~ zMA`YZSlBb4f#8{pF~kYS^0Z{lXDBTB849`gv@H{JoA9qkSMe@T`~eENF{Rvx8`mX* zExTEt#dY82Pf=vbY67fs6|em_anAuLA!+IAAoO%J=*3f*aiXMmEs4Ta6Jr%8|6nNEEr3U z67QmI!z`FDew34sm%$YI`3HYD4EV~c#827Vuo4seEY$W|S|@rE87SCO|9B@epD4+E z|AUt;s)3fD8@ZpSl9?6Uk^uh1UH)W={9f4#o-Jlr8`n#7o0R79ZfrL4{ISdlPj1$3 z)#RF&8U>QhiRUfn!Oks%9z2^)%;1*8XPkxJfqw_AKxgGP3B(F9#R`966eHp1U{H~G zUOcx-yUov$x!&6H8Z9!1zr*PiL)>Ws&77vt!D$9voaT^rT0mc?74bo9nB=r4KIj0` zof0_7Nx-R23g$b9z(S`JEOI&%KXifHovv`7(~bC{6xKW4VY71>JmvI&=bgjhU8fi9 zcKU=n8crbh_*c1N`(%Hjev{L|Pi5R$m=7~l*+LjAekUpiPJjjC4;sx}m<|_+KZ(lY zkqY@~kN8XR)1Hu@_K3_kjQ5DlH;nffpuo=_10_E-gJ*+}gFpwUmix0?)wYGxn#qDYSkn6=M zwN_egX4z*oIWAtgwsMnphwrVE=Vj9V^7_jA5tDFS&`kPPit`f~Z0E!!)UMF(Ondyw z2J&J~I=CyyFGz*?1zApvGYW(=8XRXV#GG-^+!+t;oe9v%IgW;Z5**=7hNGS1VX$)o zjB}>KS^vLW1Jvc8yN&6O~`*1H)(fqc0k`+E97(iTs7)B zYIJkf1s4QsHS$>Mvrk4!bNy(+UWUtgejd9Rc@^5-yq<%JewEsE)&Z@3C%7h`vjJiy z3_|%_xP?b0nPrr6UkB};bUrZ?LCAZD#B-NJDcc_T>JIekG8kNv;0?N^GskoI z`F>uQz)*jw-IvZOgZ5dM#9iN`%dpOM_md)XS3qN#|FSC0F?BzOc$1@;UAT*KYB*D7 z0y-y?GMY<9=@jC^Q^^RO1~Z(~VUBYKoaUSf7dhv^mCig;JmRLX}XDV7gg-YfH1Bo(;ve3qrclN3uu z6lQ;5Qg38%{AC?{XvCz#+zf9Sg;eJ}bm2-P&hysU9-2`U?mje4Es|)+pO{eJc8HcF zB^U8jN}V8@b0=8NT~O%U4MonqSwXbyors#NFFoXm_v&m#t{DxChANxp5W0fb+r6B< zk*Q2aTeMo{Y-y`YMHv{8U?0;SDaq>-(jeO5m&0K7(nCXhC%^5f?7bJ-drumAKHSgQWE$!tc1>a`s-&WPXsjPk#d>6b!z2H6u3Ndc8LGEMtMCv|+o>2yJeJk6P#T*$$1~AIv?On=R=(B?7<72 zPw^_}GhFQK#ao&TpjNeh1I_gVft!(8l?ju<-%t>SC6vD>Z_T3lV=MzY)f&t|O`7 z7IjozOQV&lBkxb@ z1+EEAT?^W~Hgt0xIL!4zZ@(!tl6|Q|d&o0d2c`$op_)z`nQ(tvjuP)u-9?Udt;7wZ zt{?{lj?sZeOJTre(pN1Ta1_H z<`8OAsAvGE7s%gzDpZ)MP|bMH=gq*}0+!&@SfWicDwCipW6X`a7*A< zH-Qm1g?VmAY~>z;rEX^&;2w&{x?OOp+f8b?Mx@`ahGUHOMhEiZ7Q>Me0>$BG=xLM? z2Nl6e=xQX0Y5@0<{!0?o5c8m|l-fdU1u^*nvp62B;8TAg^H8WaW`yu*h6GKTqzV*# znvroJh*Ay&QObe984?zmvW#JoCCeCu*^*-D<;b%sx!Vj=aizItNPrZT*U8j4(mE3* zkjkaH4mUc=G{P3x&p3qP6LiE@F|SwqxKevO9gURcU^*9Nt_P;c zbD(x9g?0Ck{qd$LTFeDx0xy+cF%Ott;V`?t5-s_7= z80$IV7j2E_h`SZ4)L|H`hv(omdHj_+@;UfO9)E@3BRr@_OB=IPb^ZhZn5t_;Q{zCE}3gvu%9NtpFutIo2&AYNc+Bg(|#zt2q z0F5PcYLd!R0?=3rg)S*u2|!~h6o#ZM{+`WptNeu||l-VMMvm z0)97o@ODek2X@JfgD4yc?-=RG^CSTM;Z0m!Q*_u*u#Sz!wr#618(WQS`xmQ0W81ck z#oin?$v$Nk6lsIz3_Re0n&;Baq$402Z?ur;IaeR%PkfSdB z^XMBzruvV5CCv}U!K~?#J}vCRQlKw}uI>m)uljJu6o1-wj`MC1DoIemL|N|!5OEM^ zZQWyW{UcARavF&hM5o+`v3MH!^(_sNhp+y32b;9kRA8w$YNON9_x>#Su-1}qC7Dp7 zn`}FpPjab;*+1}EndmH;&-fzia}M3nO@*xE>rGr%Lstt)Wq2%Sj;-;_ApA(8L8e_A zYnJr$lY1u4EJm2C6&$l$872!708>Ie4yAHQa!MKvA@OVHpjS%>A+B59SvuHPjiRnG zP#7+;bJ%S%k850Q8iSe zv*slRyPZaSTt{To#^TJ19?Zptb?!n}^3Wx3{JA*urXE5`yX+4C6I5%j9@KI>S6p2O z&ZU!mi1#K&?NnD5xi>}U!Ip67CF66y9^%_($1dIz;q!P`O5w8~`zC8t2eJX)Qy(+8 zCoQ*xkR`Sq8WNw80$#gav?gfD9En+|DdQa!^9~aMaY%7 zE!tS_62(B&I0_fMaHE;5O+XB{8h!^wt;c(}Jl78*PN(#>D(J4zuqvs~7J)rR{e3kk zTU-L`kq~0Tg8*E?BR=~1D%j~lu5w{Z?kEZ9yFs-nd-2)+rD|pG_-&YJWGtU9-qOat zVxu=5z1`W`{(Ogmd zl?R0<3Z|w|Su*M#Ev;sGb<^1-cjDslDL8bu?SA+7*5!QoP0SgpG~xG2rSw#ZtB1UI z>xQ@z-n7+k6(<5DbfjI+D;2BIn&6DT-3Xy?aI0S$(s-RvG*7O_d)>m?_dPSfvTuUT zmk#rWFW<&m04;{wdur|ea4>-o<@qy9ni`f^nHrW$v&y$LvQuoDJUNW=^Kh0q*CtOs zn6&l3iX{jftQ9s`a}Cc^f3mLP)Trz&UeA{X7$P0KAUNW(L zJl(Qa<4eaIFy(__PY%M&!yJwVP?YD{iCdmmcoUk^S>~{d_G|?XmxDoj5R6QA?}M-E z7^OxKmfq2$i%UB3`Kj{i^&ZaWXkgP&G7@NRx?ELnKWQC~YrX%~#s2Kv40;T>_Z5_r zY$)zdld9YJd>@GnOAjT~FJkGiG3dd&&Z@v>^r^1Xiz01Isr=YVMu zMuebrXLk6K%KO8k@b&EImx)q7SOkfaI;PkXo@W;q*p7IdO$zCH*452@vFzUe)bbi) zDS1TvbI8;t=l5tYqzR=pZ-Pqbi*p*(FsNr**%*&gy;ID}F9$G5meV_4ZuNlK?~qOi zu^R}e8L>!$qw_+%{NZ4~09dm-M;Jta#Vui&ggYuW661^VJIp0vcxz64tFOeG6O-k* zuj08M(&Pq{l(8Rd)@Ds^Mh8)hLr-YHB^SBdcE8jUA9vpe;gk#D4|y4D@*4;gznrdJ z_<&4q>*>F^v^Plw!k{;WqzgX9f4|v#ObUQpB?PV=k-YC%QuCt$1k?Sx(?cTD!rRVu zE58g>6o!MTYVooZ=3fL|KB;*Dge)Qv(}GeP{-htp^=Jaf=H5z~XNNnh`izX%x7Vyp zL|C3IowIaam>wyT#I%k0|_hX^z9`%#X^$Sq^)`#;ZFPsW9 zy^afBfOOy!zG9Jpug8Dtw}!ex)Ph0omp8`mJLgsxm9a8>RO&%698MYXxG4@M_-Q66 zFJp@1zB@jn_sp7U_pGdqEvk$LRwS{&;^fU+ydtymt52DZ#uF~Pn;8V4=U?;4L_z4YiP$B0rm&p@77F^6#A0K2Lxc7 zo$?N;%Q#TpVf~sl@N)O<{c<&UnWwH{cU=QJA~n#uz(vunL=Dx(IRTQpch`<#4VTUJ z>-P|M2>!!|kfScLUBnuq^V^s}hry5%25JQR6a~ek9{et;eE|3?##;{gAJY19syiD8=E%8BFf^|5>f>J?gOFZ+rY{b4LiVC>pUFOc*Wi@=#)5VVF6r;QxS0aY=;o{JaY%qcE>Z z2<@RwfDDgyBo)M5pr=E5RJ6GCoqR$a%a&WcucA<<{7}XrFS3k7qhsKpewITjOH#tK z^$%l(aew%OnoMTu)&n5B5=eyU&Kc$NcF~>mW_5|S>?4fW9p3jyBKz1m=@!6PD-ok$ zRc(9J3TbW;NuVQv1SqRT&eA?MIbT?y?P+h;*!SvA97?&sy*#Ky0DDS=2eSbwdnCDA zc}l_zcyo`EUj8f9))77iImxRUiB!-P3X+Ak!PM&9DT*Nk9{sR>fcXV+947B2rhePS z35x*tE5qujNXfqJgQl)#Y~iQ6{qRCXW&EjiLA|}zE1j10w#O<~eXIwY^R`rB;Pj_M z?9H^v(zG^#MSMKkMu1ihro!EMi94q2&gw$I(RVC+!u$KFkbo^u=8X*Gf-ZO|DW+ha zEphT(_#L<_qt>Ag03z8dC6sR&p>p+xAUPzfbt1Kl*D>u}{)aLf`Mi4onu+@64C>e)4#qPoAfDK z4qSMy>f&A+%3MFiH+?wnZ!r63w>X&lJCdL8cvE*70#~<;0Pb-ek@vPlmmS1HaQk4L zE>njRca>H_cV%^rZ8WzB0Ymw90Yi=Lg7#O7)ZBJ2PWeeH=0PrE5`Ka83Aq$dzQcA&Cs&E zQO<|UI*^5n4z3j%gi~x&8k3$exC2>ik2wd1*b(22ogjMDP!8ZOI%qGvV^EiIiitj5 zQxB|s?dcF_6L!26gwgErnl5pUF9c-QjQF$~0RrYRZ$|6Zp-=__yk?h5mY>@)3=erJ zxYc-?WwoEE`+QNAa^uhI-fy;tm7!ESu`KDoz?+{? z2Rk*SzW=1qea6K<>5{MV3HtZEZW#DvW>HdRXDCY*!jMINbjKmBSIEjpg#&LgROIhy z1-M8q@wH>&rA5zRmPU_iD~E(pvLQ+*TMLC;U?=C3T%?s-2FXD`ZBYbxA?I%~TI_Tw z@VDWmdlQ-1D$cN0I?Jk=6Qqx6TRI)p_ng`&`VSR-J!yZu0~L!@sucpN6$)kQIZ9QJ z%2kgaHCC=^j&0?OqB0}|gg&WMZ3WHPfJ2Cv>D?RC*Vt8nDj<&9MHJatQ&zqGyXBg} z<-VJ&>0W@Oji}z^+k)SE< z%gWfW6;gkOU?8cuT5{!Vak+_nh3XaDu1W zrkhg>;z!b5w5uFm*Is0-KNN(|*j3S2M12t8xiuB}*?ir%g5rb%K>(C{esq>Mi(V*-Fj|QUz!I@zM`9=t zpJ7-7iHYPaoU(;5&X10$NbfzFEq1VM#MvOUMS7Cd=_Q*@R>ZJ{jFr?GV4LN?Qd)#<*m9hX8>Xt`>kR&81}P)aTK~;HQTi{UI6X=>}m_8ZFHjRn=JW0`!O_dJb}TROt6x(2*cxx zejyjljUHv8;gG-C`^zm%^PbrP{Q~qyfu#k;1?)vZn5c9k7e49*cvgY$ZtZd04BZ;? ztJoVF5d!fA>+i;KkW_pDN;-jY_yvI%2k||-HWWk-2K)<}p-C(FT$&*U%Sw}P7p^#4J@-sI(u92TDM^1!H+%A^Fw@W zYC`lvS*c?t!nrQ|kZzKQGKVv(voY39kk3E^WnL-3v*Oc_dvkk<*GGtl^#>yFi$yBm zhwH?&l~Cwuuy*fFT%9G+TI!m9GY+k~QmH4w-&9i1uw!M_s9DCHsk~iqCDPGE+%_`7$RF^A&d5oUjyhk<0V46I`9#<#=-db{(t{gcE|M zxG=8V(lq95$`2AJ7{#b$GwEZL!Rw_G^h`?c)=EI4bVgKH?)s?7hmc z*(o&Up;eImtZ3%dRfzd4FYaYa|B5V$)+tLMP$#p*u&M!LiErJY;SS;4sd)fz3h8;w z6RF$Tt$%uo5o*dV`HFv9c?!NV=Z+Nbq;qhHx2B$E%34_WGCQ|X2rTT(VOFZH333BM zmp?zibUDy?C!q&CufXxBS7YbcV}13S>iF;QQ83qz2Z3b9M7j!i(1|MBIJs6tOoR>4 z=YfgRvy2i$#U@)h3%B9&EKRl&Y$&jhj%pLS=m#4(;Qon)NkU}qbgiApc0wQ>hA&eE z!8H835Cm zPUcmhLzOmr7JL%kv@E>q6`ZZn2pvG180f2$^2G&_>hdb4%N)~>%`>$`nI z+4JP|3LmLhxCt8fzhp`u!7t6e@bOK(poVQ|RQA85Bf5M}4)JW)He}kbich(pD<65g zh1?OjRo#JitiHr;UcC=yyZD(!%d>e)vpxniuH=}8e^7_~DYE@zG8hSr+jKRs;ENAu zDVB#B;h%m#ad?Jph4eZT#tHgmm`RwZ#En&aDty8k;7;@SGfQ=cdwuKSoh{pgpK( zEJ?N8)vYjowB^u-ye^6WDGWiP6chVRx|W5}7(F|SDQ0@=^gm2Ol1uxiXE|hIZ^OV) zI3|1PkKdE_CGTN-(hTzdbXsA+m4U4t^|JB3@cE*lbkeaHQMh)D zug;_~yL18Hojh|MLYIS*nx7-qZ0dp6eHF8Gcg76y7riz$1%NIKxmgG=U_w80)L|<2 zefqkBt4brB_cLjQwrZIPF9eojG}&l;meq%XDVChBL8hycoNLP!3|ezXubRXOR$k`V zSCscQ(FQ_xpWU*vNX_K-2j`7uDZjE@^_fc|>1c)rKGT9oVyIickZ1_9*xK@U-HP-? z3P4*nJ206)0+1T7t7(uD8zH6P#KsWDJ7to*RWP)0bkg&zQ zgjihT%VLi_^zv!U&QBl298hT4Ns%f$joHI5(!)ZvAwQ97RI{Wx4GS7UF7lCH4)vDs zXOI-pjR_>>!R0v~G$6naOZC8&L=7VyL9^swbYKbwA%boHWot`z@=FL}{BvF|^+lvd z$aVPa638s(^V42OjULd)N9J(?YpsWaI~a^oyh{svUJFfc8Du*V4LbJ$S8=&gV&L)l zR$-JR*$3?F(@}5JzK{Qc=_AdlZUobWw=b#s<=~hVs~!+BM=tM=cuis3tJLZ)43+10 zAee9k>w7l8+1d$jSxkAXS4?J^h5ekG9Z8CH0GLRP&}d$i?To58XetE3@erhWKt;tn z?}+iB$;USswDTjHjkb;SmJHzBB4`pH4Yb|LwTfj!${wuN%4LJQk3%YwO(Q<;(JI>Jy6^Y(H@z#=GO?pdpgpSuSRta z2guuPnN1{?{XB-Ss>N6_a9N|ySfd~u6C+>3LvteG91dB*$J$NRhZr9Fqe#jWT39(% zt6dyOTNp@tkU{Grvh_jMCegAtwYldxKtnL;w?vP|4w*Dpp7{7MxBFvB1p>qA1+_3S zWj)hGq2CX?vtA5BjWhn2AyY+MONU^fHn28~KCA+*Fup{?5u;v4 zw`*c1e)p~_kW|DvFKlu!`qB~}n1F*iqc_H!Bq?<0lEnzA%MT)6&xIcN1HY?L2iPmQ zL}E#!H=VAh42~DuXGAd>id$-tF;&atPdyq2xtg*Lt-sNzF4Bn}l!wj_t{+tAw|H^( zb?_37=+FIxkQcr%P$=%x*oqAL;&eDr&Rn<*cDr@6V7l^GZbNt-KMb(VN9S4HKD9v> zUz?0r$t5kd4XK7)Y!+EBqxUIp0X&Kj@ih0;Zqm!9)ybGcDMY(T1@qW(hE&O}6xGtv z{ouqU<~XJC4^R@&i%y(>Mt2(H{p!$#)w;FIOt=g{s)zD)$GA^=GE21&gA5@wGos!9 zzL*zGpNZ@hzTBh(Kp&HC&14f(C{k}N4Ad|gn#5B{RnT@}sFsb5=;_Mp0AU(R1srptCtEGro>--t{?1==)TY`8DcAxleg` zKLZ|oZC%QJ?K{Tc#+|=5f!Dfv8n)msi&Iapi@N-akDaEQ`wCVWzYV68{BJ_xlXHLL z>NlCe>=9`0_7NYx{&2b5swi5Cs3`kLy88_OOLj3hCCX`1@QrBV?{EG=Nptaa7cIeN zdO4gP^f;N#LEx6lK}zHn9@EC3i`@%;#J-O^Q_NiKvuPt_j8_n80yaRn#-q6{Z3Bl7 z%vNY~0`=-a^?yfSYqUWM#woDg34i6(=vJ;^gSh$sMx|&PS!bYyfb*?0SEei(D(!Jy){-3WQ|siMur<2zYbhl}sYF zb(b_Qce`dcIY zydzKX2|D8KKLF2sCs=y>{;L%6hcx!`nMnFHT=W@-;4TL4@>#)OrfM7aMm+tF3y)Y_ zyjw2EOy==pTXg?F?gXyXgZhk1@rP8SLR;l3?0;?>i@8i~4lcC37@^E`s`h|jhtY!!21$l*`CsgB5 zXqVuH30PtJLd+Sr-+_K%XgGAQl=7SA9sjCDeE~nC08El@%{g@m&Gyl2X(H?9(arBv z!}Uu0ZR$`fwO7wsF$`r@IXmPJYfWiW1WIpLybfzADOTl+R;#9ZB|j9Fxwj|)8sU7SYHRAagS4}!-~#fCLzwG=M1RChr0($> z@U&vRV}*P}N@v4ADDc>I^Nq=bvtq_?Hy)#IzpBD&G~q;K(*e>9hL>)5*Q^zTX;p(~X*8$Scii!avrY@DI(2qmhe9k}E~` z{QFh}$dO(@ahFI40(ndrfQd7b@KcbDC;As+%NzN*`{F z&UnBNRyM6>zTxpG8b{yiz!W~TKf`OegH=RNVZ2tVAwbK%tNEBTv!b?2Q8MJErL5zC z>3j5JT{F}!$3oXGQ#1k4H8!ZlMJ`x`NUbb4CIUFq{R1(Pe?`*J zsP6%g3UY)Y<@=2Ys&^$lWzCMfDdE*GQV*(GvI^&_xEy4sl(3VY$Ks-JHnLz4p9;!- zZMEbFKzO5>g! zJ8-hnx=l7=CYNIp83ov^D{c!tZfGP}?_BuhfnFHoUBE^_wlru;*Vd!?KhV zhpx)xboHHoMU2Rdo0esO?Hvd}eFK_iP4OOCrVm*p_dvZPp$}d|&S?MHTVqYQn6&41 zbG*Bg)uHWikGVi2tR|Y=j&QqhxKmCsBdmug?TVOKc4pApP6(7QAUbrnqcAFS^_iZw zIOMeB5Gu9w^19O5sP+V5E!tj3w*PAYkMyj|5X7{YbzP-B<+K1-yr5SZq&*s=^i-Ru z{b#7cd$sITkW*Bk*Q{dkT<*cUS*pq~rL;--y?Wdr`dKb#s|&e$aS0omFkrkXNxYx8 zRr41^2-$_t4G(~myz8@qeOaY2s1TIG9(z>Fru6V8$9EAMR{d&6NEb%(%6QSL4&7n8 z2pX!_^xO~8Rkjq~r2CU^=T4v)DSaPu(Tg4?D|QGh3smsuyPi*ku0ZAk#?RdbEyX|W zXSV(}$$@oyMC1k!&%}qbJuTF}3O<`Mm8>@kH%!Jpc{@O|iBUDBj&{khVHI&T>sfw4 zBjem|bEC%u`%=yE6+9z9e3?tr6fr;7*!w<+i?d-;7tW&NWcyMxI% z=OtJ<62+<)wX(u@^Cpy{6-w-)Q^QWH;IeX9voZ#UP%qpm<@FuZhp=9()>24*!a%pM z+|9hT9dN){riF94EQs%Z7?@ahjRF$`^#RO-b!#S;AgHNX1^204 zy(Kj1+tJ334=|sAeuEkEspXN}dpms6lr=BxXAvyqXymK0t{JJo`{UrpI?%R_+Yy?6 zo|1RMF~brtk9HzGGZ3<7Uhqc}l;~;DEl4|7h*LOTChfE?#!6dm;I~OUCv4i6W;(BJ z_9!q=w*`;c>!gYEkHvkgQXf>dE7ZxFi28w7Y!Popx(ilsLB}D}3-4&%-J#nT%XG!t zA%5+bZadM@I=DkQFO2gd3AaucGW>$1L(nVs(MnIB(}TNanP7nTLP@Q|ExE!n`BuK=2QAfpzO=pU zVsOlevRylD*T)l4YV_jdz3cuM5L~i>r~K_hm^^d$vDBZ-uFk!S)Zj%+3~C;xeHXY)oODSciM($;LXplrn2UGnA=+=AVQa|GhU%vkQ#t7t>2a zxg{?f%nE`E_r7V?S40+d$L9(o$xF|}W1Ry@>GR-%P}yXjaD<$2w|#B`G9ckMZCd*$ z1L!vSOPvWy-6{AlXjgXIuLJQymN&6GuZDK*?E+0ZLg-I1>%dwF&W3FW&T`zD{hq!i8iDoq&@23$d=cgmgAH&on8~UBA75l+{MujC^tSj zcFaP2u*ufXI_RCZDYo5jXsZqSQAeho<{c2-(r}H3s&8I!ZUZL`B+<-Y;PWlZq2=tn zjrKTu#dFlvNEuu06%>2MDWVZYH+*1sN?|d38p%4*QyRaMFAWaw*4!}ku=gaV)wP8v zgg3gxQxH!<|4HCe7Y@!(?^1&3h1+n=f#)_E@CfdQKHx-xYpr{mM zup}L|kp8{XnGKZ&nnkTFiV+%2EnGpS_KALH4nyDcHNK_V)LJ!K!`gDzX9XQ!5y5u& zv8{(VZ`Rp1lWxFfi@C=UVBBap5$c98tB@O&b)*`tsD!r# zW?Dh=$vGJP$!BXGS`7G#1!$x0@06C6)W{9lXKNFS1y#hmA)pYa#7hkKXgU+#%!n@IU6Hw(8;y_DyADUjq$Fc9_6us(5gq}wREHJS#nWxtv8Ket8jDqo~yP>_28jl z%>*LL6BvF1ym0$3MG2;V)k%LG0==boTxJmW+;puEsr*fSVCu+)5uu^2!}{DvH!!S6 z&XYBPzWHl-cB2jx-enW+;S)dGUtL8hWtaA>$z^(h)2=*5X=CSL>ku%ZSwq|2bF;hL z&n63>C34qEy5q&srqM%HC|ea{$_h7SL&;(&3!B?kP zm`UB{mg%vqKn!?0(ooykuE`T@>YiQjYAYq*W)(8jC3pBr)`&ZFm@rmV?K<~!ytW}$ zDfaVB?}FuB(CPH@&ecNVooH4Q{$w9OQ%qF8hQHT}%?+h?p_ps+_JmnIs*PWUE^IAZ>}&0#>sX@JJLgK5)SQU}^%1a3C~^$yOt!?xnjR|}dm0JZV*RSO#1 z(2*X;vNe+0ua4xiT}1HQZI9E@ZQ%KdwUH8YaBJ7Mx)l~>a8eNaD;2Fv68{`HZ1{Xa zbGaPn-tP%S{Gy$Dt`X*Ya?QNh9!&E?#=q)LBH?_65I;ks4|rYKoRr&|$0wr`7=z^< zXN2v<155*(uwG_H7sRGT^qtUzssfq@Rx_sU&~(Rqk;hxGf;*7KH$J20xx|G%Bcrfo zzppSNURYk3n^B22zdV9;iWC7;EI(~`oVAyNR~J4n-+o{CdkJy+F)pxkbief@?r94($hx3T znxtw(y#(g)es6`}Qx^7!d$G;w{N9SZcbBpkZAU-3kh=Qbj&K5GNu`kK1>7?h(#35> z-xC&c{5I_hb-|buBJILDF_yX#)egS*E3Eh}=%3jAL_EhLr6J1shI1m?yCPVKEQ+}v zaF611brn~QqGf}tymnUd-Xto(iF8sxZ3&3IV$V%VEt7PCob0c_yGku1KRlyJ<%qR| zo=C)nSO>Iq5(0qAX9@Ecixl4VD{vn79+szHnkB%h8ntXMyoLx+#U{H-$1ri=6}Y0&dUm^h3)4558648mB`_!~Xaph&=mL`5>c znE;uYq`cD<){DtC3DNIZxDzc~117;#-S+m1jMMb3kB_5AEPs+mozgu|0zTJsI2V53 zr#Ox~RjO<=usym2S@RUr`h5bWGz&R32`XNS%RgABGSasHD1C&OcP%X0E~?(@vMq`^ zl`L5Z3WetX{ptD9I6enYj*nzCen?wZ9kVqUhUYPYH> zcFh8yR`mTaBdtYQ#i?*Nwmo)n<)PqGpRcw52F-?c=u!&rG>~%^)%Bi0nAUdaWP;E} zt)?ZhA<#aa4sd2?D$#i36GEi?B*laa^Hsw%NvLA$aFTXx_4B;d<2J(6yFXn)<9_c^ z1M7M(C>*0dD6wp9?!Deh_lSV|qW=!=LuTVN6vkMqZvZ}tuLCJaU8}c)$;%UY%^l-g zZK4mJVQ)`d%~NL3TZcLFslb2G*+tk(#y|R|aQBR`P8!89Yz}>zQHx0|~gN}g;Nz^Mz zvLqR7LH%v={L;hSt#GsxSt1f_TJE6^{-*$|_Q-~qoZhqkB^d5-u?8yg;k+x(5bX?I)N9-j zoFh>P^uH_mo0#7B5gY{M6((g@l9Vzfx0ituC{o|nz!OLR#EjqkQNQ_}e$k@IN*0gW zM3&A-`cFTql})-LX8>k}BkX*wZ9N_pUSLi4@hstklEA0O?XxZs`!KZcQ|zq=RUQMn zCEVm_TATCH)|KDCLHhIMX}SkQZl{1bI|yZnM~<4CNJ5A)_y&qn)B{b$uruVBQK~u+ zr|c;GXPwq8c#i-hz+>9XQFujRm z2>ww!iM_5;qq$<7(|yoO2j`kAGZezN?1a$^u}8DUL8sLkXW4Y4axEIF;G?Z_m@f2Z zgYVL{-J68*JjWQJdFcLYREOK5MG_TIj9|^vVw6sJ()_N{L81~onqk*H)q25~O&36g zgp@wERmWvJa1#YtGNvp5n%=E~0kWj0{v+c2zK#KQ;O!;O)T?6RG>{nOlIhLFclR4R z1-@lc3jcJDp7nw)5X9P<(FW0Uc+-KCvq(;k?1ltO;@$PP^%ubojI-}$t%N&((S70A zf5NCLQuE895b$7ZpR7IP@Jw@chjK?%fQ!csb&wO581QbT-91ntmlefaMn7Obs4LxR z52etAgTsx~T&fMkLrt{JSFO{F7YptkvUd?wjg;Agl3SzI zVm~ZhTFmDVv`)j>dla;@dW;bUk>kA;+-oTM!b@G^w)o$GTyiMAh$uttU0N zL0>S^QLvnSZgRStj-= zBK;Eox*yH}in5sh=gj>6cTxLw>ED)%1d%dhOGKB_`-t-`g{F@IFJnH(5+wk$>5r_^aMgb=78X~>s=6j!A&!q!@VB9MeSO8Y z1@TA%usb2W!K_%9v!|ScD~Y09IUGII$s%(k6*28!rcJH_;7sKI=;wOV?QoB+X^@rPa zyu^n0{nkBinM^+9WDjsWEKz)k&IhmwpN8%^rzZQa&Y@U}I zsXfHonJb{bsBg}%3$KYWu-j}q z-RRf^=@q^p{=4_bZ@&g^gMoldLZt+h68x`eQBq)zaOeU0VAD2gT76+fG)65jYMF0I zx$5Pl#C_MDT2PuR=R=!Xfqs$G>M!T;`h@QwLSyyjqM-Szw24gfYyz9UUa$8P@9z&E z(EbQcu#Lvl0frlK1Dg<+BsAt_5E9I50W47!QWeaqa?FiWtJMsDag0V)BZNmi@iOx& z3_5&hDieXW98^)uyj2PPpjp82J z&rW62ncM2|k4$4IP^#Fbz$1H{d?PqQkBokpN8N#2AG?+6oo;JhiOI1E>_2mJUNQZ! z-Ati)0Vc42kT*@&I72Sl5d7*rQ*8`~H`ox@+4O-Gq-josZ*c2zpphLLqhoMG^mWtB zu1F@KQ|V2oo_kt6rRhc)!e4ASq0Q+>SAQXEmV~mr(7l`3nc;ocLn>+;PC>xS zf61>%=o8TjVOXk55k~s^vM9ot_sDS*jB7XH%Qv+t#$BhxQS$2CoX*2@+G-^v-Vd&2 z>5|_Ij^JE0>pG1!zdt~x@L?PpTsunkWaQ)W<50+q87cZWa{;m?w}?f$OT5bXvv=mr zDpn`|Gx)m#?SKfA%OB^hJ5s|Vvmv&@XFe;Nr zBL~apT+N42OHpSxz(gDb$F5g=uHs*PiO1?ilrx0oPZBm!@69x1u$x+RHQTx|gG+`` z5_RN$C;4l*0So6MC1-w~4%^GrBZ>T-?jq27d{NTtQ;Gs?b7# zz83tKxhe^{qmEH7#`BFA32pz3*|2O)1#E8M)xtZlX7 z2)*&xeXWUlt=Vhz+)umY7Pa;T`90NrUQ=?%^wdH(DDznvEUysfV48ytsdKDjC((P9 zQwq5OVf49$Kl6#suzJU2455CJ>fyHj9*i8P?NR&W9a7c>Q*N_q#GWeFZ?OOMsUMil z77YrX`$2PRX{M-^TFf(9H?a%%udJ#`*sIa9uz z40~Hqr zN#2GFsaS$c(0C+4T1a4oNj_XLJRuW2h6{~{$#kChc2ay>NH)B^wkT4Bkk$5A9w9Ux z%6jEVG9)i0MF*+{UZR^zxB09U6v5*$ByLA3z&X-t8 z5+Cc;)4iCZw+D;^i|#wU%#Hh1p?R5A!wedBteQ;oM%XK`1xKc%E!dRaWYVlJr_K5X zXDlh!M!%i{T{1*qMpM@xJY>rV&RUBK#HwXhV)&~q<~E5K0BhwWgFW<6*9}gVFi$l1 z+S~#gBNX=^+^r?Xql2vKE*o5Rk&!VRXvm5jN&}(>R8*G$c-RjXD;Z!OmnkUTcvn7=5=Li$MOXMpA$B~Aw(ljo>WhxE&>!N-8NC2nRt%8@Qpy-j z#ci5fVl>X%rZ3Ln8qrAwG)$IlFxN@+Ef;azBJ~95qu~!>R7@JFPN*?F##3gvb}cGn ze0NrN93||{cdMIiCQ7JF5H*e^smg(jogF!_rgK4hwnB~6VTy(B<>~rBUc&5WbNZ1i z9A`@%nc7<-?_a8pq7+^NN8Di^@dlWKQTrX$B%DyiIQYkT%_X&1-dPMboU$DF?5$Ky z_&@>8elMhHuCFz@RlR~M$J4oP!Gg>6Y%8j}T>-CYFV6xxvm@5(PHA>^m_Jn7mH5P9 zh?Nt0U$~xFgr7&m4OYc~n?z6dxeB&+yh)p4w6};82deLnv#Q5z$9_k%zvNGp%ve_h zVeXh8*vcc5bE!>AVrc2hK*pyetP5n3+NVRhG0y$ofwl{(^jeI` z72Z8=pLhq3F2#JsIne4pFN{3lW|JqCZxIMm_?l-9TB-$w=r#)r3r3l>1VlV!loHCR z9rb=0nn{zxjoPI@Co@ByW(s1%B^R+|PA7W#^53Q`%DR`Q4g~?hhw%S{12|x$8$1GF zZ~%FKMq`&99(s*6SXNg(D%}&(EWFE(y z{4H-D2>y`(oiA%{|9`TkIZr+{WlQD^>H8|(!gQ=Mak9z(&eQXNc8!LNRW z>7QI(ZUmhctPah)faO$9S7IdA?Y3rg^jFo?MuQ@W2dC8#0UCxA5A=~C@FSQ3nv%Nd zep9m@sYcbia9*L(2TAoZxK$cEyW$!k6qpoXHG)zxxYsPWWM=s*HyR2Y(88ZpZKI zwLwdnK|sXOyi_aN;Z-#v_KDlH)^pWjWce{K%Lx&Hz%0e@y$d+qf=r6iRBun}|0gO? zP+O{|F-vys{g`!4YqxUysv*Ha>yEwZ;AzL8hoP0t^~c0lt#VaY<<4a&vwLb`F6bg_Ju>+yZrFg#LF8foTh<7Ok@C3=0erSzBLM@0lCUw3|2|_-@5q(WW zsc~%v5^rBQS{(yX69fqT1EK}QQN9+ET@MkZp`e{d{oMJhq9|qM{^Ov&9(JF{#QB(* z{XHz1sw(G=Fs85YbA8qgK$z`1?MLasRFNWSrDCq!c)q4zsByy&XEy*(L+GFl{OC#K z{!t`3sr5b*XId#KWJy3!#r7;p=hzOG~8A zz4g*hw7hECg%{(M_`hE~q=kLRCg9jRJVW5%wTa3#p@_ZLv5H6-j!Z!~iM8;r$C+9ueCx|hHK)HeuVqH`mffejpue{*K)p+#0|X6o6ckPz?_wTa+od{kD?&=2Qy z#0Y5@kADCYU&(&YZVzt;F&FNZRE!o}#iC{2GK}{`m%CLqte9D*slhEz_K_oNOrYTO4V>k^5rBZbo3ABr(mJXj4^Lsq(cNE^I~xZ4rfhW_Tv zgq23OEw$mVoN-^;Fdy|@8^b+ka8*XGuN0%EaWtt)j0RV&(q-kF`RL}K4rOmpvn!2A zUhfc^T9cO=E1@j((+}f2gjBqzyC9$&&274O`{^lVkWVKrD9i6xqbB>NF}14(fP;z^ zlXrWfoe%Dz(pt^VH2$nqUhTI6DX6*-z`_$qv4Lze{~=rPGA4;+_#;L?Hh^1crH^@DW)NttgKYpBO6%tO`an^dBPu8C^9?QDN zoAX&q2rqhEW)`b0oZ3=6*4Q9>Biu&=y}@&X$gSv;s8Wlu-}-B_&W3}{(eR+X551oo zAi9_bud3-(xJV}3-z0%<%d}HD{tS;~-Tj?mn$87w7%8Blbn zuhdMWHb&r2iOn!lMY^JqkAK2Zx3q{rb89KbkaHN4CIJ#JYJ$xTr#~JaA$p5kEhOnC z8prw|3~e^M@MRcO!ei(_5_u04J{A96V7r?gQ#JNOUoM2g@gqV`>%c2KcCN#RPZ~+k z&DJ}N+=KyDTaCp*&@y6lPSrbAhaPN8F}#TPJyRur>w#9RZAlWVwL(O|#%sQSD%p*n zT(GU1A#DFgu2V4kdC*tDz~7=#d|Ht>lv28U0J|8t44E}!#Wqbfoy#~^Y0wlCsHDuy z5|$TDgE{M2x|bYPDccs!{t%GMX9oc!t1>hy*p*J&dbcmUVuJc3t~#M3 z?FSDE;U}rCMQaFl>YyyGTGI5 zAO&?1UF(Pk-}J-&{{CJv*M}MwuPx2}%UNPIhRmtR|%-VvDCT zBX@w!ye18SZ%vW}sm%li+{oXHrI0VYQOsi*SR-F0S2CYksjvdFKOqbORl4xm8xit4 z58D;rYavh=e=a82@2PFrG>2ol`pl%qR?aZS|7Fc<%$DSokz{3g_;jYv?-#yO@J)v& zqp0)I^wZn#Y;wGbZT^aH1BTOLsLI1A)~iP=lJ`POi z4mrZ-3yUyysRulGT46P-2Ybf)FLAHo93^uodx+(a_Q;u1+h%w|U_z86?t82ouSI;f zcKo8WPoN;rgs`6((k{$!0y#1H{NW&TR{lNT|81SH(!zC^5E!>${#QI@;Oe(oWi0)l zjqr(RjDb2T=zBAwBpPao-_hxqBeAj2B=;$hrQm{tWfXI|@`SePn0_Bc5^s4t5Jo>^ z75oU2zurF^UA8<=^3#YX?&|c1jqP?NXgJcC#+1UKY56;#64J>%a|9m!frNa#uIg;q zpA!y?G!lBgViHLbFVDat4s_X|wJe!jWz0ryLRd3oM?^7CyU8-=mHPlHAE@!LPu+hj z^AWeIHuf5N^Ciw%=z*Vk29Y2Y(|5fl4cYpVX*{?5&?KvO0m+9hz3$NW`m-$V6=ShA z)$DBd{{-AWqKDdUbQd_~4SpuTYfAl!d|NeIOB4`8xI zoLgLDIppT5P8vLF2imV_5*$Vlk& zQH1T`&mtCUjepK7GuS0h`~(KdWz+Dw?3JHj8`OVBPweD} zDt=hwXe!ZM?J_>nX2sqVSRoOLAvbx_(1@dunAK5=6G@JXy1fYUqp|0jDjh1=h?cx* z=!Im@4WaK<*UP8%dZ5ZHp=`TBR(E{P_X#~CX^mNOs!t3}!mJVh3o$}vWqn+dEfQu- zf&QEjNeHAc?X?kI7Q2<|!;}>j5LQT?wJ+)Wg&F1jh4-%m(y_qMsSN!IP5a`rtllB& zBY|_$h8wx;i>A}(ieU1N^yUz_`L3^H8r~oj?~nSm5yo)(&0<-B{I_;gN`?B$$Q|ge zt#y4xh~sAILlLu8hX^)Sl6d@THvXUg$0E@FB{K*&|51H4`9Saez|(b*H2*RfQ2H2P z!7qIbNWelheI-m0ECDevC9+kS{m!a8-fGCXA{(FX zgKp>7>u%z$7}gD%Auvh7L$%9gM#ueFriX43>{UmLNnacbuOpg zqPqE|?JN^dAj1sr@rS?*ix3-%DtHSK49pPDpaQU%J;$Z<&hM2j-2~Z#d|MNbo3wd5 z4q#ZUSyLwxmCS$99{*GbAJVUgIG8>0r*r^NDt!-M`2BMOs=R<{>`AEDjB&!yCLLDq zl`tOhF_p=6v9m42i~JZmk8ak5T{!t5asj{IWr(#lNN%&c^VVOto|3~#$u!va6i5xh zIWRo)IXE4wFaa7P__OM=`7Xp~SZRVDPiuMnpSb1O@yl2+J}`{}5i&lNQmyWZp7Ny~ zGEZ8QZ6T|PzdHC*iuBTLy5v#LePneUxlCRg#i06~1p(D!JmO_Z>c0mb7+YM#JYHm8ZlsPIGQIi2 zd_`r8Cc$;yi~Z7D?5x*k={%PA71V+&IB@9f8{kEP6LK4`|0lTgN3{PBzT^_S7?G!LF8WzBX#a7odOh~J@));G!+%0cUss1I ziGSuiWLF9;0t$HCw7!pXKR$J*2O~5qWKr{dbB*OAz6ACCTKtE*6(6M0?I(}$K>T5Z zdtAmWQdX6ETXg{@y(J_ai{|khVg(RM>**uv2#F)>*k3RpZZ~v=z^Kf)jzamDU}M|< zuV%?>+s^Zx7IX*05s#zb;Ep;Tm`Ik$e@Cz-dCXhCgLM6VR5?n%TrdrZk|Ix z_$hgnxBcdhzUhrqFkW{Uh+I;Q-ljRAiX-tlD%_Dn%}KRC9%Q~YQyo|eQa4kdV_zFc z1G)JYZ=-Os`^K~Z{C~#){CfmIbni9yxFEiy@A6H?^o|>cIKLb+5Y&`wXAbQBOX5@= zr?N@Uvw#TMz|WB9Jk)T#YC;u~`YT(;)~oI(NRRS7tB(2M=e9+&MLjVVwMm+Nm7vaZ z&LPu-Jr_iNmF(4Eg)hT5JYI!bGyoE(gV`#-L|n^FylpNOr4 z{0Bu*i9yFWmB~Dfmu7iNofS4yJIVGK<}1dYPe914?A0Q%FWgDL{x*8E$boqsbZ}4u zuk{!Qm0yVsHpt>ba~{?Tn}WC3x>%`+w#Ba^Y~ih^S@08GSzXpF6Q%W?PSq8?++=4d z+zY^3+hwaFQ6IWM^XCldi-v~{0jRmNRNzvH&CO3~$02#w4Dm>5c;j(lLcgHeV!sRt!|So?~;8f<<3{EKl;pFCI@WJ8BLiYOIg6yn^iAAVww9ZvNp}JHj7#P zmt^UQSx+ELzz?hI#FF=C=c>Tcs940jcKag94#~zKPdKFpF>hDHI)@k_7uOoiwu6) zEAs#C#z_lvBvIZJKtn)KqWlXeUcmyWfy*vf61eYfcPVEUl;k8Tn*9+a_|mmdXyg&1 zwZ_i7-_6BH!%7m?6ZY>tD}9=8mQlXP^FrM%Rw zwap)I>1Bo>BsiH-{e1u2R&{-dlRaG~On!3R6368-F~z;#_Mf&xFlB2kohFoo1PTP! zQbdwBg03LGnatt$2zW9Fvp0rKyHB6NnNqojb@}BDOD_?MekLmICPE6CirHo+8Zh|u z8fxUJ)?syXngxvb7UUDc3yqg7NZF)RJV% zgTpX?OT9Wgo9A%JZ?j$_)r9JccwiKG03PrM`e+(Xj5Vm2L2TYMVLAG?X6*M}w|Ecv zO5!X(F{@&V#`KcPR`Q8eQMZu<9c)zb{V&+L6pH~U*Ozbz38`6VVT-_1XJf+Q##%mg z%M7(F)PCgzLd__atWy$h&>gfXqQB0?D6cA#Elw_G5Nql=n?kW|A7gW^x>DML_z2SW zqwJoO8#&!+&v+fU79Kzc3_d*+iIv}GP}Md-b7-Q7b?(Khvodd4%Fcc3DLn6?VRaZ_ zh0kXlU}hBS6@!JFKL#*@0riv(ZQ25aJCAkHvxVaT-v-bJ!UNLnob>C*}Z+*oyQk>W_$ z<&viZ^DzvPt^o#L60k8gVx5s3M?4W7N4cXta5)X_9a!dCYRXk#2HYdhcC~*RpXMpU z(pXmMDO89a~3!8)^CDLFusJvmjL@nL&7&MDm3>D{vQ*rP=&q2lm~3QfK;R z#wn>g;{qDzPPT{yqDws|-Qsxmh_u0{&oJ0J@8EoB?rLM-&ecS?TVHDw^D-e~`*(Jg zoFvXDOxG{IU*pLB0eqvVSXPwe8(QBbk)ZswWQ`;TZ&@rM>{`$)-kYnB-%(Jj^pn38 z8CicB`U~txVf8S=ux*g|p+O7pLYzfb%2}86n*_}kLjWrm@HUc7K-CExik2-ULvMnK z3THp-Hvg5hvTx3$1aML0o3b_QO0aL|T3@6$;5XZGG26ipF_+} z(3Bv76P|}H+2p9j%s@|24%8-q5m$8-t9fQkMwd+P<`%hEdH)+B3&N}Or-PDhKH}dC zXjllEPUGpHK$za-aIW^gFfrEhQY=u0ObE4R@=nSib?>5h=|~h$1V&ZP4EWM2e#oG8 zzPX_Syfa(mUA!{E$yOX?lY#OBCMLckkDha;mXU1nu;sIt7fqrQAE|4LWpkLrllt6j zNAQZS6;6JZ3bEET`jYkieZ?FMw8|r(XIlY(^|htd((W^a92;@|^iMXc z6C?>ypkW^8PE4?D^96k+u^mE|xK^l253)=EXFuycUp?)nX~oTF??mG1 z;+No#k;#;A{@o<|ngkmDz3BTM1nO_UY4(-ct6oClZ@2{2-@3nye2_a4N<_Z+HshgjS6ZHY9lXI+pbR)RJHqdOXAGnAJ$2({YBhwZal7 zUMCtI@?i;Y(2B8HlPh}-ZVYhZ)$iERQuL#8mN=SsgYDC02y;VIsujTf;aPBN>f{nk zN*-pX%zqP4E!ut&?+Kav{{L`5C!h+JCBfaufN#L#k9RTFyIbw>*@Plhx-cnSo=Bn{ zTslQgn1gaCet#duCsB+jSVc|+Rx`G`i7`ro4bM&3EOmdC(ibyqBXu~dZ50X}EvsMZ z21i_P5M?itNrR`$$SG(>`G(%Dh92)5r}zGsZj;wtD8!$pLb=p~EPvVQ9f$H)e?6X z$ijm^!m(hm;h=S~kysKdIpuph;&QpaEsk!{3mvGMVKJsW=#P9sl}p(`x* zaa)buZJ#3P7*ox(?!u)xDCpcNj}gx6Z)@qUr?6QJ zd`o690UaZ(&dt_btC_l#w>8x<#Z^l;u6Nh~Ob|s@wCm`|?AAHx6S||v2oD1j3FVO@pd*rt78$b0f)X1DrrV`rKmBaCG69t7n*1(ySJcla=mrC|YW;rPzv7 z=t_AufrX9$C82My$oQ(%&!XCN$kvgx z%p6)n)Xhpk$WlQObLGQJ8sSGWzLmqu7ZR!lH}lfob9RM~D=YeRL?spKSLL9? zt9H}^cf&~Qj}TiHi7V$|D@!-1gM-l|+oKSm!aWq({flVt5M?kEzlVucj&ubbk zg77*PYB{+XIx<%XR*;WBA6-R?Nr1=0tvBe-KwY{pFWqx(femRq4iDn6;k!klZHCKt z^wpUK<@BUcElp*dcCH|MLPD2_KOfQ?bHgEobzO!VyI*LdYtas}gw6fJ7`Pf5?XB%~ zyC{|$E=a+*bDhb5RDpH_m_LTnTuxMz4E_zwRe~n?=^aN$tIRRP20E z7%X9WfF~ELd01;u4VKmsOZPB?t0`d;VM&K}8<4HFHaEUywFEiDWB)CpM*luErCq%b zz4UD{qF+mx$r~hh>}4o!*n0I#Upybz@A#Y4aBYy$bI0-MF9u+e=o?98PG_?24*-2G zQ_?3rg)%D_6`^tU*rS_$l})H{N@ad{!?iCAsenXwu(;eL5~T`2Q)`Vl^GDtpbPR3F zujcIj&)<$VBPdjW1|^{R{1n4u)G|!Cc4UB}XcVlLUXq+xp-&ApU?c!`Q?y^rFdZtU ztg|SmDSU3Mj2;*Px=DlkMRR03)6N6*p8&cmmN8l%Y?v8U1tVn$z*V6>m&%oTX~94D z22|@{m(NftzX>MyjiTn{)v}(Y_qBUc6Ci+2kxC{cLc!ktxX3SL?AI|h$;2Xoz`)gq;-l?sV_+;W8vPAg-XE*&5$u^t+)Lz7 zaCudA^+_ne@5Pp2XLAep9f#_{;~@YTqxvG1anQA+^oIF%AXNADJw*LF!4Ca>JmRR$ zOa`^I2CG3?8!ag`C)x~{pg*b{^Br&2x82;4Colf=*eq=XFQtOuTcNn{WmVK=@9>L{~^I~!Nm0c zQi(IL007|Wf6@)!k>Tl=&t|BsbnNHzDD6r57ruS2NK|HKhXx@0HFrxuGB&P@Xv5Dz zt%!N*c6m9vPPkk+y!P|1_WWRKztO#+5?$KGi+(0ZOJri>^ElYxyZ0dWIm~{4d%+im z-2hKV?y@RwnX~*I;tn&wbN)Nb9rE@S<|;ggf*hEE^7RLa2p)FPCWuh`LX71d(K5d3G>*vppJT)_=A zSwi2|s0|A1$wvq6f{ZV{pQKN;XqVOR4z)xk!=3J#S=rgX5W3l~k4=AioD&62hKB-O z$lE1PRmzMkn}y?yS7ql`p_>8+ubP7wv8|-(hJF}rAyCF8Fc%6B)(7K3!`xuVL*rOr zw|~-w+#fkk>nYN7X@*N#xRL6bK(3Y4Zjt$P{kswJ3pBJ#$``|P3>+-IUN>m2tD?Xr zG!-XIDeU$rQ-qD~HiV5{22g;4tOW>IF{+GOTqY48i+K~D z`>bM;V!Zi8;w3bPi=vSbpE%BQF;MKfeIM;a`psSx@y>aiT3PxMNoqkh=q@S>=SEy7 zGR|&fE^_?1{%fS?FE4666(3FOFtvq}qh6_CWmy`moTsg;0`miEgdW?HoSiwKidzQD z9Hy|JHHd6Gs;0tK2=9A|4$*h`ZZL!7m=pB(FJ)a~5_syv8R%8voc-(nFOfN@ru-vAFJRQIPJH_%oWsl)iYf$X?p9O-; zrV8JdSG4`^#-pL=5u^@k?|uu0bnI9p?TgTH!jVRjs_C~6zH_sRl8%kG#$tW9R2j_t zD_!Y%$~C+DOc^LQB#YaPUDZe2G*m<710%V8eusD-U)_)}4fyc7H1mm<~jN6BU(aunUB@q_mJPv zo0oIL3?xUr`qY_G^ptg4vHgk3Pssx@f@00SI{KoR&SfOGjE#L}EcQ{*{q+n*1YeIk zCG413&S_ag_LP~$14S`_rgBRprpt{6b`-0EQVCDc?q!CgdHx~(x11O!gyi#8Eam<| z@VB~qbC*V?oB26!Kk!dtnhW28QRlOrbzkRu_W>jcWLnwXb;{5P6v2IqE}k1=A4Ro7 zV-2nwh+((L+64zh@*ZUdV6DXXNbtMezV{)DLRJ9S9G|~8g`2^v+fiOcP3t%>-x)}HB8ZqJ;@6h-5Eq{2P`g* zSpQ=%xP8y?*mmQ|&wf%{rqftZiqo6B&c*$}!@~b?EVb_GuFLQZQJAY!Z93W*`@`MC z=~BD?>W>Y4G2AcSS$v3s%rrFb9U`gP!9~IzWa%N3QcvN|HKGsZz_m24sqUrTX+p?A zi+A$MDK_~myOwFh^2>-eIEuS}hXe<;&NH|_pZ~E2?QY8%N2%H~zF(DIv97<^YX}c| zlG;8!gV6Vgfa@M}2h zR#aN$k25B1kJHL&$H-O8f`xC%=G-07>u$*29bEQ&WX_Iy_ehI^7yaw-bXj$TWDYu6 z+gjcvf~lt$VU{q@Aa5W083iwUM6?8`p=DkC!Kgv5ukdfL#^)b=Qeq9e&G=w#M-Y2ILD5(0{Zf zJ6+6&)FE`d&BmC+{Te;ySUxf#p!#0>{)nC<2^9TEz;`mQ?xn{~TaC<(tZUKR_k|<0t~v#00zCM2ou(xpB-sE<$6~=f4XE z1a0o3B23smpaJKus9v30K*9&?8P^^p>&VK&q2*!S3Cn*1+4fL!eldSJeJ zaC+q9D2xWTRztf9cV;jihH2H|&zK^B1G#EDtl%0hg;eD+w`X)5UASU9ZpZHjtj-wc z>{|hk2xX2srd>a1A)#@a-(;9hS!pD?m}uHfzj{U`-SvObHgk|(X_TZ^z;PSo7?~We zp+KX?rmF|nAAb|Bta9kzWH_~8vE)e9*8h{Z4W^4B29QWNRTL|%`WCvr$_L3-k}mR! z4TTYa40i{`7pNXJgV_!N3p%}j^cd2rYdN6O1!2-H~J(7}dxiK$f#E%DK zPQC07!$@?q%}M2UCUlVvEs?&ucr6_0J4F>#W8=xetqijDFU{?5QRWXN81|7MogNkS z(6WcHaJfD!OwL^FDC~>L*tW0w;srk`c>)w}$aVI~8;5A@l8UEDh(*D^xO{tLOEkn1 z-vmKE`@7PkR987bUktBDtbsl2j3lMqcK)E4J+@}*?EZRRBE!)yS5dy`o5OVvF}~V! z!!JO4Q#2@&;Y&mp{n4@BdG1()X}~P5&c}G2kO&4wfJR z7~$6Y){(G4d{&`?K^v8k#@-jBrFHRcricZ%lK{Q~DLF~yjamZd5f-3IQ71MVAdyuA zIvW3c#skqRpFD{anbKh%%Glr!>6-6RTaodt*G&+neh#n}dqrz|rV41es{qjb%H&@F zackasJE@ZA=e+y~H#$+)C5(omZ1iY_++Wg9`0cB!%Zrcfv&W=9$vkV-CZ1Y(!yEBY zo5_J4`0je!qbh4^!cF0jIc~SyiCNN6PC<;HRMZzj)g|jKo%WnsP{!>(CIG4+_O2@` z*_9L=#tV45m-0z{0+5cWRWnXKHT{A_d^Cxw{p_{TR!9!V{=P<(PJO)`!0H*6Viv;` zAR9dkt$~P@iqgmtZASDtp^XV`@+^^g)SZ@$)iR5D(Eq#);*ZtdWB(ds?gXxLWiU2< z&eQ*s?LmcA&?WrwTzMhE0ZAX(9$$wTD8c$<0DR!5@Em0o?oqSd>KckF%m)Tqas4DYld3VzJlW`M%T63;Utz6TqV$95 z9M8^c_q_el1HHiVx}j&C+mp8iDKB^#Zaf?M=km=b4dvVFey2MoLOj4GR|kl%efbZa*7L$XS6@rq z$z_Ab@_@&1Y|?NO2ywLQ45C=G-4;Pa#a@X>LHQ}~m0QgbZe7X4B`=Xt!x$aZ$P(us zKm)z&Hau~9ZD#2!4SXvUr7C7GUXQmQlQI57>u+ouiVW`G7)FO*L9X|-MR-ctL8ovh zzs)x2NA$f`+{*gxNDm$`9MI%OM>a|EvP`|hp0f-&p!-75rJ?2B$fKe~)aQ5X>b3`Y zp7@wJla=ZnRvweb;cpUO_VQwtIZ;1l>d zitq|ljH0p{8icGA!J)#*Q>eG;h<2}7ZrKnn)=(cObyw%tf9?@_hjF9*3A510S!Tp3 zt~rre2dg!BPW|+zXn(nrY(?pTye5TuzWLuPet7vKLiS_H6#iGz0u88O{@v1C#=*jo z(bUe^@hGl5$KWmLhXDZOZ zZ$NutOXihR&Mq6wUjq~w`nmh&MAFMC#uINr2^)6nMvey%x~+OCA4W*;%m2wIQ&Bi8 z41JeD0-VET!{U7cQL1?d#J`fKNwZ-j#HM&FJ(Ch3VisIeX;(LWI(Dm?xz*>GCoe2Z zWY1LYt0|aUu2Rx|tVmFscPq{hYis&xI4hmSH5YchZysA&<_Bc5o#_9TSOc@zO(gbA z?1Ni+%uIy9u^Tk3_mrG_dl$L3 zOWl-wy00vZD~9MrGtx16vw@OA@1W!LX5)Ut_wxMZ;m=W0-SZuLmd-pz-0$%Eo7>eMxDVldr!mqxdu**9vEG}aPp5FlSD%iZ zbiW@k7? zU(LHo;R97P=u4Kw?bT`OL&Zg059KqrtV}eCil-(|@0zJLyH(1n6Dk#GuGrzZD{##pX6sB-LNy88i_^xh)Z~cnbK5BhdQ& z>U%R0#IYC}gjYZDBm8657v=g`m1o%{Yohn~bxh5d{psP8gOUQfSaWeAb4PITubiUw zF8H_+gnUoY@K(pnqREb|q7{$l8`NgkJ)@j2lsJ4dGQg5o!7GaaCC^ZZNii%HgzbDi z(IDgJE+;lMLXku#jwqA?HgsK(@94VjeK!15K{3-5a43MM28*Sb>yN86eH=2)vnZk0 zP0|Ev^+cJ=9&eP(-em1GmDwp2)H^~JFsc?9Wd4pbs^%ydIbHf$d(TP>hbNDqA_>VH zo8#uwIi}Z=ICi(de_3(U4@SW3r_cY<7}8({WPU>akH!%7gQ=z2#|o~4(XDZ)z*Ex< znBc8Z2CODUR)E95ox9iop8vLZIRFHZ{|unb1wj4$Ps^4Ukn!(X1b)EkzpWzyK6Vt@toKdrA70K|Wr>HEmhtP~{LpWpla1@!MoeLaKaxt=FTj z0rfk? zx!;5BPP-zgM7@I@+#!SOxXf4ZOoCxbUf0&X0}+!uN^`qP0^CuPUd}Mtn!8=GK|;Mb zrCI7hKifSa4cV^>yn(}r#GQ6qbOv_)Jg7KZWu<>P)Sq0`pAgl(Mg$sfe;R+j(duyq)?mZoeMBZSiw*ofMwsBtla z^eKaauJW($>qkvR3HB}^gPtRW-7O0ANg(7eOL8mnv~qIX$`tHNWU8Y?Ig!Iis#Z)) z=ldb;bj-6wdkKt@^;8kp0!!}LFoZO`2Q%H4SS1)l>qLdH(I}`4b4D>mr$bN9)0fRj3T^nzRWg zGO6F_`(?#i6QoRFCnyy?RNR*Ox>%a9XXc$sgdWtIx*zYVE3X!gyttr)%5&BM~%n$w| zC_OwFMlUH0r4EwBuBd5XWFQ(^It>Sce~ntTBuzZ8cV?r>ms^#Jia z*ZY9Gi!lDCJ3y!IKKy1Y(ohWtycrnHev>ycDvnhoJVhz-wj=bzY~-7X%dCU3Ek$DqqN*FDe~_ z1mGOYEat4bFw#&|o^V@aC!9@VesbzoTCXB7GM^6=72q5u_`of2Fb@m+Vk?T&MtmK# zii<7*pOAjBny0JLjoKpp;xKQUDgAn0NciUYMQk?l)chxn+c(D%MQdg=Fili#x@D-0 zR62S4avm{$+zaX*KmByu_9NIZDjOIL5t z(5*fRJ3%Af@JNb=Ls!*Jv1c?LJEjbF`0)y)oOlV(2sP|{X<4N%L3xze$;SYKk+b*?Oy?U4<=0^ z+9Bq$Xpm1E*lt9SLPbppQ(QN-%a&dJ{VChGuRKNu z*W8tbTy^syD1N$v>SSuZSQIk3&K`2lzz^r^U}YfLUDQB-RZDe#X@-A#U))E*c#N7k z;Z1477AumoGx}J<6^mWnx#KUQ#+R6;MdA?6126jxZkZhV@5^PW?hdU%ouU)c@dcYj z-|2RUI@?J&CWrRrlil~$cBW6(3y?-s7PW@oGTKIo7mssNtRi`kA~FiT--)tU0eer# zS#1`QQ-mv*9THLcZ@ouP~t>hAFq1MkRl_P$Wu_n|S{Io<13sk&*Ji$h~cwj_;j zWtK?Z;GuAg;@nY-swA7G^jG%pC!jZVjyTPg{f??@fsMCmy<1wj{E5uPm(n7+D_8N+ zy&p3Ahz01sh}|wVt9B|(08JXl9r4lECxmXu910Cl=N0P6d@Z)Mrh*;G^+y!$??_b? zsdij+Xm#Aecve+35rg?%)2FhEGv{{=i#ylg+_A9lY!}SZ3Yp<)$x%%(Q9%2&v15)u zRhH^CNqVG;+O#kvXNe@1`oxIASMx0w%4&xPl?GqL&E>_65Z`EMSm52&@jiYtq@rFJz834bqLnDyCQ-c+Q*9yy4^og}0Bof; z3*2C3lA-Xz*NmWoZMA9j1G8mn4*__ORc+6asCc$36w>0gbC*d@eM3oy59t|~P&uvi z*+UzL(FuU4!Jn@;eitHGfAg0P1%sBwQdBQw5N^F-Sen*O*?c#snEyYn&MCUHpw0S8 z$F^;wW81cEn;rafU~Uy`Yp(U#jvPB*Mid2#D6atqtVe0 zPHIGfXas;R?ZFGVVsvi=z$Mn|+h(=6mrdpMFv>jgosIV1#s0AHBn zBw$<@Pq>|_`0@8u-T;(SXdFQCAQ4Z=Ld!FxpR~dPYA6?Xczj**VeA6q^=i8D4t^kW zdnVGDn``z+Qv|ZFrUYJ;bkXv24ECPP-7h-AsX3<^gM9mvFKgaah6HfCb@eUYD>U2E zo`c3-g9&$I1bdW^+)^wtMICj(t=@LT;2B}F==t?YEh@8Twg6m3VH@kPb+_os{&vh6 z@z*aPH!FD-B(k*(p-+xK@g>_SLZ4TtXCX=@-E={J)S(}rewVoGB0m}@BGxOqi>(;5 zWwaj|^o|kf%u0wvggzyCGvE&7`yP}i)tNe$nbum(W>dSrWm4%UnHSSkF{PAY9@-Hl zj~)@x-kRq0Dgh2zVy2nj%WT#ys|x2g)|6$E|DrIe!5XGbGY6JW=f0qNlT8rBI7vz^ zIpsXN)ZLSHJ8^V-Oz)&CXJ%ZZ6+5*4spbjdJkxcO(pC{ks($dCGFU{E8h289x~7?+ z8h5oDp_zEZy&lf@^!(JwJ>G~Nz8g$Y5_W>1=d140`v>@wEfB}++J$^DzC4dJ1Pm`s3&P)$@JDYz7~KEH-~gnoqk4JnoApvxDR-Cf9I zKf&TzJg-K?PG_#S1vQ~0gvtk!T42g+0^#qxk~}*H&e+{yFo6noEG5Tmhp^`u68=qb zljzG&G7MPI#*bHDSdTkg$=_z@NPl$CvfMKj^Y`30+d4>CWFXn6Baf&wp|3CoSB5PxzYlRIdgbXo7ik5(~OL6sRw;A9L%Pbj$O zFb1&OsoTOohM2X%O^;W4aEp78>8tJHeWVxE0a61r-asY=%UmEd$AO#o)rj3GIu&*) zXGged`)d{MmDrxRjx6+?cFjV*0JLw#o4d0%2a>gMbo=yUn3H1HCe`huk?@`1I#aV& zaG~-BaEx7v^U16j*3S)`kIdTqx@Vel!2tc`As}7-5z`*?%t7!*A=vy1f-3)rYW?uN zj9az2QZ3^4hxIM33MItfCOVjeM1a34ACmDm#R_554g>BSN1DHGaK(9~e|=v;TE!HX z@J=1h7d>5}Ho6y<_~?hPJv+3jE$EF7zEggs9&AJgf!<>t{>!`H+1$Wh89xGhN&^fs zFj$RXOV6oX&`KJMY4HV|qn={ZOp_c-+8n%Tc8!}CLXxeMqelN`$-zvQzk0y>6IX%R zM-H}&$mT4)f6wDj2k(uhjaHv6zKg2@pI5dq&R_+or-P}q%AG6>;>_Ns2xF40STm1B z2~l7UT?3Yjw=&XIZ7Nq>MlcL{^99_(KT5t+si%0i9;;EaSN1nUGQYh0d^V}?!CzVW z5g>LDIElU^h2I!o#p@CBe*}{Fj=>#BgT9%AzL}bRPN&gTGk)otUVQ$#?q`^dS-yev z4VvC})q1k_2I=1A!8lo9=NJd;Ae^bXG~@t18S-+iAShhl9)DaD_OwlOrT{Dum?od< zs2JWGQG@E?PSGZBP4oH*TbKPMig@$Yh6qT|;;#%K%4o}(*EBhyr8WV01;4unQ(_IT zvT^0`4QxZWoc138=VtC>I84{p&xz|@nAeo?ZkL~!b|Qa=Biwb$ogWWbGC2zVlYiP* zZEc-<{*O>Ttc1Woe9siiPj7AnI>mnll{|%!9~UZx@dO(jpk!)jV(LWt`+qy6YUj=< zs;J+a9c*yYC?IrnU4Ck^$_Az3XyHL~=>N!VZKY^bN;4*H>swZ3-P!+@ykt6ll)&pN z3|~*(0OLZ2_Pk)?5kzu*q4+-VJMg&QpUmg&xcs?pJ>IzIKF(e~N&!@D|C$MU#;!pN z8JuHC2KYl>4d(`uAn`;TV>_SGTIfy z3xM^ydUE{%)Ec$jCBaUP^YSZKcy?P3Zi0;Jwc%sw%y`T$(#^-+K${vQwKehI!cxcc+f^{=<|D zE6=^VjZ_X$>O;g)4KnS0V*bK*T9tM%03w;y%mVBkFwKX_mtM!&?Ydth^MFp`{{1C!?ibX zV*=<5u!dVFI_l+8xMBnsS!SodQ%dF>C!AfOx{brKiXTuAw`y$>?`wxWef)F1K&qzNGE#WRC09b*O^qcTE)zym`23<{V=aEN6rGJ09x8Q5jV_%jKq)nkQRY5K z3j3th)vrI<)L~HvB_I<2BM0l>Xj2m3mLESl$~}B;mRNT4`~nK{+qOU3%Z!{#_7w6Z z-RPxyPkd!B%?+8hu=x-&Q1vAdiH^)Mg9Jf6; z$YVXQGTxe4Gr41Ozkg-1qnvyRbd<902#V}as+JLN2`#q=unG|a^8ZCHh2NRJd`k7V z$|F_APWC$I7zc>6Lx>OJYoI~|zSM_vD4;=L3=00!EVG2jAd|<{LJbLQDZ?YK{TAZQ zN3qCH((^CJ9AGWHMPq7-Hg54xXo13M-r2*+9BlR=*xnWPj)}Pi>FSAT3CuaUHvjO~ zzs0cIxBnOtddXtd-;-w$?o6y^IdxS&eTBRv_PKac6r0*3xuDRCMdTMiP>df@WKA$c z9|CS0PCi(OG3SZ#a-7-66C&UW4M(vrS9dXdV@(?_6|VgL^&h=#fy5~2LWdN-9&9xL ziXftIvYyxSlSgf(1ri!sBiLa@xP=sCU`k+NTp$YM?fg^Q0?9J3bLUbw85vT+?9D2H zX(lgyQPcp!TD!?nc2=5CcG}g`@HE3Vu*wZJ9NZ!75o5Kn((pd)P)%;6sR560F9mgh z5n=U*G6>jV&Z)Xa&V))i-75*{@uE< zQ#QkJ|59N@N%zV%@u^bDlY`sp+&91_W?6?y&t1zEsbkkQM(rWg>Ns>aSB3jX*UnRi zjgA{uXSE_ZL@2xb75@3jbBB5=RU@H;OyvSW=?t)%WY^Ni=owaYdB>+3a;=jtzvh+^ z9|FkobCXI`>CtfOXz{47c2joK8W*-O3tBL>=| z1Y#DA6y>kj7Fx2*JAM(1xJ!O#CAcyoQjGPcUN`R=;6-Z;Hqms9aM6MRm4fLN& z%0rTn`49^TXiO-jSMe8K3gbLBamvmb9XMc82g)OHagp!XEPhm`>jDM~4Gt1nh>-Rd zlOQRnU;t6C%*rB%WLIF^s7z{FO^f2W657HNSP(T~e(9Q0q;04|VI_K5)7p|&$`bvO zTDh&Q?%LV**mpL!v>GAs$NN3c>(yPB*H!B^@A~Hz56|=JR&l6BJayfC<3nxMmmuJ~ zVYd4Oh1*B!J3->RX%0|$&&-WyR>xc)FP<4ihiiWf+B8O@h|k7dY2KccaFHlR5CDaP zIXXI*MGRWXwl-zS#xh@-X;`e2w>Fh_H&W-wc5I;ZbKj>?m_*N#g0a*?(^I z`%XC1hxeD>!0M!TJXr3A#OiCFeCnfti*+?%efRkyRdM+0#LH`?*%;85#M}UeBeFXU zYTOjEJ11`aiIkCcXJf1HGsgCbJ9Bec64jaR2rJt~1ere)}YgXX5) zS?R5dW91hIaZCoqNgLEB;3%9X`)qo2=b9vqjdvOp9yF)zePiltrBT)KAwQED*{;Q* zL*iAdXZ15MO|$pEN!5+_7=TwU8vW^mk{hr|fs#IqI|j%XZNJT#fK2)q5I#+Q-iZzaG9KzjP;KX(W+WpizsV*ZUI09Knlg^B#u&df zr9Pu#NgC(&nakI-&L#ya5t&U@-f%XyM6dkB*W%=)ErKA7(A9s69??8>_Yv5)3?b3p z#jbpCKo9NRi;!8*@e_KbWhzT&Np06i<63h|UPYJJ=AaA}@cib=W`6?{;N}Bem5!dS zy!!TCcrYoYUA;Ym2k@2OieIhC^CZE;Sh)O<3`imj z`)3NffwETtMkLKwMzK$+Ma}a#jYu8Rg|0|Gur{UI*3Wl@p7}7)@ex#bWjy;uOT9%s zV}`0|V95`Q#Rsk^$v*H%M2#GGU4Y$dCRRm6Ec$E^_!sA&Yk+Ok>I^#MAGM4vSDALX zAvOXqEnBL=@#G+gh9I7;{2yiP0_p|VaVI@^RAb6Y-}Up*$kQwU$`NGH2nUMDJ$H2g z9P8>WcY7V33F9QHnbpW22_*PFZ&n;WR;a$uDnq@Gm=Q} z9O#ZrrPQEt9Lzu{yn9XqS)jkZdc2u2UD(e<=T9uHeu26nOvsWz5yCm!daRq1lK4*0hdHXR_4**^0D4cNk(pMC7xS zOTR%c7?D zoSOywJgEE()evGp8=+c+zXVK#jlk0v2!+mRQ2-?5aGqK+jRv zftaynU?-Mu=ilX2K|7e;Ws|Ukt&VsADV{S($!;L@lhU@U>?tj}ocaEsVCFeeNf|5G zx%{lZeC{nS(XBV22i$wFqNwfb*5bn5GVaIU?E=&pNgVaPIGmp=x?fEK0aW*d4G-G) zpnzS28SpiW!wlH2H2c~+@BsF^O0}-Zo%Pr8y?r1jt!I^81)Cf77kHX&%Nt$q<|KA3 zZ-i~@8?!B=!)ok?nCs>{wSeYZw*Z12JaGOIZn(CbD-&$iR0+cyVej%@1n2f%{e5v* z-$VlDm-B}H+>BH7q76HLseEw(JXY8*a6qUB#%0YNyJ+k%+*PbAui;Je%R0FG9e%)< z0AS$t3Y3YD#vSW}^cu{gV|r{mE-jns#gC_Je7pYc8O}F7r}hp3mTx2^bqu1MviAg4 zF^Ou>ki?`dHu$c&2LJX4 zKK|E8GtptkJ$lc67}e^uw`hE~0n9wTKkoc~W5ZIrfgV^Jn^vqIel^qq-aLJbaJZP^ z83#1SK{Rb@q{6sjc9g~Gd6pQ40)X|+*si_Hf%Q%K8Bz}17tHtK*fq`v`xmzy4&!!H z5xIN-#LS_pYD!Z3-HzH{PuVX44fp{59ql+DkH7dd0E-*(kJ{dEAfN?NdF&7QKX7r# zE1br+>pOs33K^4|;tziCZ*9W2nBJUQL*Y0hi9*z=tXL+@2hd7t_@!K0KyWxjo)n`> zejV0WRXnVzgnV6|l1iECKP+lpQw`OkygCn6H4yTM$-hgepD*p?;C ziUs--&WYHQF0+ydVt*$!0m0ZH{c5jPwB!MT<-Y`dhaBb2RQF+3N3>Im;NwE9!EB0W z%Z5nUxocz4Wtinjn~l?*aQ&mHfPb&4s!g+SeuwH;fx9%DK8Cja8?Ma%%^wwH-Zn-v zE^U1-C1s6~tg=K`QmVJ}_YHx|i6Ds6B$Kg0l_<^f>eeyhG`+VN5g?9YVsY~H;b0iV z6X6<-ox+a}F_UN~u5$X!8eq_P(6=Znzy#P@8QZFkfXG__nTpJ;!w(0mdVT#wNjpsP zL5Y^&LfEbV(`5r4o+n_(lNJ|66*3al-PDOWwMDhXs&T*ZJVYd?!T+l$h9{KxE_CpB zhD;vu)j&I|bmAa{B7iUH|-gX8VHpSoV?E`o-oLa_Vzx8jl|;8nbpDt$l{_ zEtN$&+Xd@SPuffjrFypsq-9in!}_AF^)JKnE9|Uss-X>z4A3gy{uT&Vj3NAL0-I<( znXCrr!PB6CZ!DRHE$>Ll$P1;nRImoI)1RrFmbrgqRruIT4_~_jhJPN$4nLhgn>355 z7U!Q|{d{^!^%l{c;ubU^ly2r)PD)PH^CL^jq})Pw3n{9HT>Om08P|4VV(U8IYfGYj z9;r^wLiNE31+e=`E^QN?84(c2x5Mc*W90B0uMEHAo=(ti4Q#UCg9 z?QrXca=fV?iXEj3wjoGSc5=0O>hgfQm$k3$G{QVO01kqhlD3{XENr6jCE37jgxy9r z?kMQam8*mp4cRm@S!${V+2PbF8=cSD$ElWfFDR`gS{$r#C)AZp2ri^lbC4OMBmTy= zIWY%yH4YI}5D{nMBrr83#32E6J$3XCl@G7WJtW1Cu+M0!&gK4v-Hr54ztfPJwQ+fi zvwWED0pthM?0_q*xgBP|0w2uy7}H&S(G`r8r6jfG1zH^iuSo5!6HKUnIIXC5_eREV z3w7B~o;A&Y_D>}38I<2(F`mYSqUY6=ATJrc+q_XH@>rjH`lt5EUV7w>EvOm@J@p7= zE3)_pstM?QmjSShIUdUCGO7Vx%s7FxT*gr^fW&Oe+XiFFP+l8o^hwvn)XJ}1iUWiS z80`)b;m^e`T5oL(uJi`sE>7GJ&%9piHej{PCmyP|20E);dzV~ykW4lR7XhfFGB%%( zlq`O~U%P%Rw0o4}DGSNVD!r=oIu5?FlA5o%S*8zsNJ>p@AcFNB?^_PHK+f=l&yE{9 zfH6mYn;OkmkSeb|KQ|sAoz14qE!kf&R#sU-<5#16a|nBpq4s(@TFSa`7@akB$mu@$ zn%aTdvv=pJAaoqN7d7nbd)b@@FV>P~Ujl-=iJ^IuRF0w*l@%t6Eaul0NBTh9!RepLDFZt)xUG8HU9CpJg6mw^7Re4 z%y}*eJpD#&tt{#&tf*=$b1Dstx#3m2z`j2FPAG36*>;e_a)K@aY$$3gIs1B6mRHsF z1?^~h<)1Ak=r&)O!ENAiMi2OwHlGAGdgXflIrXSi3pu2C&75Bc9;~)3K{5V8G`U7E z$2fllQP`@rDqjIC_?LXA6X4{}Zt>(l+_WjZ!;r%03*I%qdqT2Yd{#~?c}h1E-%{!r zm&KS*pi-l1ai&h1Kf;73VbjXw?>vLVX8yD#hoWW)vCl*eJdka+QPHVaStvH=*@M^) z+^aPd<(eekf_a4!EEhKKT8c}u0K#ZLcs8Tck;wBI=G9puxKHF1{D6;RlaOcJgFXh@ zauZY_23_O-S$T_jfA~siV2AKoW018aYYnw>jk0wmTx3vrc|(x7#?=PJ_cb2820>7@ z&RAk?i&DXlU;TB|P2}pnK{UN8X!z$v$@?T0?#7gP+lB|obzmQi3!0+f2NaeNH`9MM zNTuv9PUNxh6z8$xB{EYcWwHc^pW>!V)?1<{&3a<;V-!f2pf5<5pn4z0t2<{&TPs3C zgJDJ`&FQ+Z$5q+pd-+BF8tiPq`WK`&kN!qY+9vM{6Xh-{aQ=mOt^xy{-5Z+-lCFrmr`gbdweBR(Gih?={cDm1Z1W-^jR9gXc411~ z~=;!f}>Afn30U6Zr+& z6W~voI); zBy8Dv;j0`Um;sa$5EqwF4@V+mSNZmXC0%f3c88}6W1SFluCob9UY)1~qS=>*URk8s zlWdz#BFD)<|iWeE=@0`prt*9PP9+$YzcUv%FVHdw~YOk;?7C?@JeSdpd5Xt zx-N1QlbH5VPWs5Ec8e30GY~K}S+Lt;FEmSsq9E9IZ~)U?PrQlaKankQQ-7aO=VUS4 zf!k`3NZ5Now!~l<--ur-BWh8IE(W!3TJSUNdb79S7p?-;*8`n!+!UTZY@*JdR=RA9 zJL7!T<=z|YW%@E|>}3Q$Uf?f7CU|9^skjiuc)y%-;cZoOqL&R!Irm&GIcSk?>P9#> zsS&gxCIK$wqx~nj&i!I@g7to7%#(3T1j|Cbi*e*v%)Hz_%(Cu({QmFY(yB-(e%I(x|cA=FHl;uFz_$yK*w0WVC zg^s9zyewHcStqCeGK2u}+m-&pn&!fo20#l*mNUG33!aGcqNaOw*bm(rSVx_aX!w4F zdO#1#zy_;Fi^0Z$yTp#X#0LJP28oj)vJG-vY>D(k7VWWKo);APD|~as9|!?J|N7$e z@IU_j98t5FV{nAAn*h*nJrHAf7E`fA9G~0qBa{ zIyCzeYMjGn0SpR_(b(ST6(mAFX44T~LdB*0z2Ug*{t4Gf=!(|iMaVn~}(eQ#utJ3sW-FV+{^)5Gw< z@|Z_r3o)H-DNb+)NjtogYij{S!YJz#50S*(%u$p^OFETNoH7N^6fJDP&YWk31;yjC zdZ)}~vW=D-)cxDX4Kot|vDoETaStQ^CT?eo3j`&~x{yFrjw^OUkZcQvE&IIT-Ieg* ziVA)xs0}D^1?@nvB-*_;)D33N7fp;xiq0dQ8t%eSV2df3_xu%gK#U#b^h=(Y;-M{l zy6BK6DIK#FS-yDD8-8<$*#ZS)-iIdw-*4+$q%}hN#F2h+wgyUb0AQ8L@N{Nl&WXII zZ`h483-Dh8#!2cw+sf5HpBE6PwQ`%WCswQv@RjbKSFF$4iWHg5dho(y%?cf=^Mc~4 zkE_>AUDw`O>dbL_<+bI&ir$W5FE-c>&w?5W;mp)^Q!wTrNH$ryNXlS4-Cz;)!|OJA zG2;woJ#Y512x6|y0*IMwyA)H*dA7O~Jz8BCBq{oOjhr_;Ni}Jcu7bbA=KM=(U&x@< z8e-twq59NafPNIPO#(G+U-&g=&Vg)9Z4^@y3Re(tA%otD-Ix|3npT%Z70Wjrmrvpt zpIFQ{;TbLBLk-QDu+FKR>?9vZtgI|T>9`($$L*i(0X~rlY^ILv-SZkE3FgPGv}W*vReYeoQ?RM@-4Sz zFduvvnjTRj4dC!0-?{*Av~5XJoi6Tpv5!c58Fv+8jUVS&0@2I~dd|kHbe&aevw;A! zn{*>WSfPxWLdpFADCRz^KYEg6Ic_~9gk%f^YLL-njOt?F%ahv%zH_5Wq*+zG?FiC2NN!|{vS-b_cLv>57gFy*#=SD0&=M4}I$htI zbbL!)1=t5tBiO@fjk4cg>@mdKo>m76bN!&yAKc!t_TaBR7WSs=?$bY5e*N?1XTKx= zDrUNykrZXG2tJ0pl`D38X+;arM9a?{axdZZ#vp#!v_i61O1bSU3u`V(`cOR-ZcV;c zSHE+61oIWx?BQOZ>rl2m3|Ww~Q;)e_UZ79(0=yzM<}{arB6!C&C9<0q;Q>I*{=t{40{nHCIaIgcd*f2@!ZV+CKjjr^Mc5rbR2G7s z@k;-K)wcl&mbU^}LBwy1=zJjYoN9YxeB65_Ry6gse}VBW6>UW>I1K{Ccv-FDoT;qh z0RQjxzt66-WhNKy?JCsS_JjI?qT0gAGwR80SxFgGHumw>H`yD%}iu$oFR|0+n+zzb`mGtHra;hf95Vr(E3Drr2jd z>hT_+$JEWaSNi&2`4WGug0uw_!mR{{^(sBnaUcAU{Yhw-Y>CCwZXXQ)DIldf6)n)E zz|Uiw0d$q;1yFgVwV}ySK}Bw1y6HrrLZLN4Yb(P8dN6}-M=^y(Zz0_rzuQK$j2ifjKCB8p=;VDB2DVA>49LlIHq+Ff{n1lw9-FQhHW#I_g3TtW zIoc?_G7T&EjCcZVHmOR|Z)l5SONEXiP3^)bKyO*1wWG<%F@u$vtJD=l6)`s4b08P> z9aZKZTdX+$dPUon$H1v-r!Ho%xwnj9rFDS?TP*p=pfyZtz~|6mz+G)F!)3%qV=XUS z0>C!w3-y5uj7IaL{}cs)7vt?tdD(@@M7(Qm>f|Gut~s`(G`eo5O!B{2D^5@3#pTwa zna@sOWds(xPYBtHe`NMDwk#)OA-^7zGeC{IesGM)CyyEZaqh;PDl7xfavvMC1!tfb z&Sq>_4rUrq6H1SMQ-$5s4tdLO;9Hr(2ISv1Y^N$+2xrUbW9L@M|d+Fxe#S1iXo?L8^OcAE5%cr4~KL8Epyf61jy1v2GE*0 z2aB#{Ws~ssBk5*y|CpZYtGP+dK zlxs6$g&G~|%1`ovS&0dm#kr7tKpy&a z4l1YgKvkCnJr^;LgO^Pd5v@jc4eH4xCRv>)d88-mY^%SGWXeC&=L?=DEGhRd-m^Y~ zQt70?W3)_7!#Mu-5L~wabhVl~T?0>6!z4ZXtA{HFMDX2Z-5@bI{pJ4z;kP(7HE(}1 zVK?9@w@rBTDFSQQP$_c#*pMmbOFy~yA8NcJB5yODjdoLRE@8eBSR+B7k|@XwkPKshMV11~ z;GaH5Y^hT*!8)nBLD|nBvNToMu~YCA)XBYI@^U3U8dEiNCY&?e=J?eY9gm>igqi!y zJd%GF-g!!6PR5#3WvHhzr<|I)ad3lA=Ylb+Dl);@uMkiu1L4Z0v8tVhzfjEc28a2nGFnxn}4_#V-A zQBP`eR9`tMSfBb?k)J~`Ca2svWY_!8tqseEWwbk0p;c+1@&MZTZKSu#x(5SYq`KMtrtK2lDb!xFijZ##02qy~4=J8b!0qU)W zbE9eB!^q%SdKHzElsc1uc}9rnSG~@T|}lkX?`t<0C=DtV)+7oh^Thtq@ZxLou!*@kx_*shebei_}ePR+Vd7G#;vSYkyP*vGY|*m&&srn?jzdo@(4Lb>F|3 zy-ZOE!}j_U(g0>%-|t)3Utfo(-@Gr3eyv77phkyQJoOzZoGw3xHAl2AfXVRUOC8*@ zL9@NgN^!g2}=W81pJx=Kl zFEs=&p|Hl@&P#Hd)40b;W!4jYeES#lgO^4x zae+ZHJ>@V%{oqVh@-uzlqphQZ2+2p^_r?F?M)>tg9D1u^pYB7WS00owmo20}eGBnU zv_MP6AYA-B%w~Qm*wwba$l9VGg~KeWcy)d0!p+qKu&%{RBj@VcveXQP z+MId0epC+g+NbNfm5LARPKQou5gJ(VTc2a;3TCj?-6$wAclfXOCT8Rtm#~(AKqgge zGbtwgP%_kkO4ba$fn_MDg#L<9+?9uXaZ$6R5f%B~bI_X49|b-NJuRb6!M-Z{uoGR^ zT6}$(2r;(dv;6fwfa_Oi)goB`Z&`$QAy=QT)`+uTS*}~QyRKhDQ-w;3LUa!yEczT< z8EQXCrh|{Q&2wyQZr(Tvn_9~dgTg8*%sF&vQ|SE7u2#G+yUA`c>}wM*{ zY9w}_9xaUB0q>B4S)2=6vmWMzCG%RH!Ky0VRdG?v9yAIIrx8|oI&LrVs7-dZUW6nnC;hml(@0 z(EY>v9h~ats)*@YDL1=p(<$bL+fbq&XTXE7q93xG07g|kgW}wEVmjEB$TlJLvq#UM z=!FFgC=F@wQq@(Wnq?Zm5b8w**D`83x02hbs)0ZObyUGZmZ<80L^Ma16&THZFZKj4 z>MB~MDic3YcjOk1EX%=)u~Y;%pTb4n#!Ai&9CKx2bSzv^$&6y>^|k>5sR>Lsd(x`+ zsJQ`bK)UXwxpXqMT7Tt^Ikj)JKIO~5aQ$6duL?x+RbX&A}aXvO~YgFe`~Mq4j5JSG(D#>ooQ&s-@Rw=CgVIf z01Ei9DZ?$Lj;5aGJZkvS17jq+cR=I0#AB+zWo6U{U{zH@)525#g-a>^3rD$WqAnAK zgQyf9(cWw^D3KXmk1Y+=Qso%5LDTMSXbusri5#E@TWeKYP}!uR?VbD zFEPr~C=5?H*dM(U?$oFVCo?MTku-)Q0f^En4^qw9J{m`hpnqb8oC=SQ{s2}n=dx{+ z7uVKTs2HoyVg~^$zzwwto?DDcX|o3{>519t`dI0vdg>A7d6mYM>-$zto;p|H>c--C zsrzUSQ7!p+Vz9GQ_*uTRmAY5~O+B6@43!}uOkCXN@NY0f4RM>q6C#XLZsycRfYzS$ z+VWo7i(A#gsa!l+K|0jfL(>x)>$j1^SD;`Vy*(r6nV+A~9L^3^`QbcTf zHZqx>;dP69=J)~mVLw~a`M%~!iP_a$_IkB10fm`ydU?HE(q_ug_!+SP5Quwa97pPB z;wblhF%Tdj-fvkIth&`$j`xyu@UW4S(Cp4P>pK3-lIb5gJ` zx_LKB>v@7~K_JNmzvmzk7l7bAA0soEYH4NXh}YFSjy3ziN)ON#7T+I(PZ^#+LrV25 zoG;yQNi|Aw4K=Mvm83uf@b2|48}Ke{_Ir38h@V&rQ|(va#n+L|nf?K6w1Hz=V`gh6 zny}lO=&=gE^bPck{#H+j`E`Xv@G0&mD&}qJhU}O-IYOj*q|kP`pvD?=6x(8w_({r& zncCcDM zOuDiU8?nmJUi5A&q>rv~81Ixt+U&pYR17zVr}FL3>4KRjXZn)&&mzecUG)ShEhv7_ z$Rv<^^>fB5G9)tt0Aq$wallO?a%_5}>#=C!d$;0GyYo!kuZ3YXVxcGQ!B(jxK;nCNHs`@vOA=viMB#QppsPL`Z}1&F^w+gD5wy1dE_EZgd&`6E zIjgF2gzs@%f4{y-_+%@2L~nJ_fZvj4dlk7Lg`qf$Y=<%gpbr8?eXIojAi^na@uEs!F3d`oHIGB<|-?B`bV3$N5 zrAdO2#YyS{;yujBZbp(sxTCqpXQ22Ui{n-i{gMTiM%rD1QT2HI!az8RUNrQsBn?NH zUn7UJXj z?Ab4bNAXeB_`^OxQX35U$q87t7fiZ2n~DgceNyWH?4NwXz55=H3Hc3MMhY05v{h;P zQxsCr15bJ&;i^d@F{>Rf2G}yE0dw%hiv3v)GNIr}a@|CxaX856apm}TSi}4Xo;HQ5 zJUZe4%qDccX+Z|{)`kr=C-w~*=n-kHshs+SiCk#2*mX^w`8z~2+mX`Sr-FE*pJrv+ z1a5H}=Ymi4Y15yGekQ*%;7o;_^O4Pvvrfv@ko3K^bYPBuhEIl1Kxb0dg(Le4(Nf{% z15iVoEaJSz7%!+fd{Mu2M9QXPuaMJ^l$3M2xtF%$99YDy?CeO?lIlh+m1VA5hLw`(KyAtt4uZ7Wd;qcHVBk|y6Er*aqE@+ePCZagF-%uay)|tUXc+5^M%cH)SYzD9dD%!bXwwv%iu`>Gk0GV z>H`c4Ufx`w9zW#~`g+ycB$Il72hO#bwRRnSI~k9VVhj^0{{H=b!!ku?7#k&S0NHXvWDjux%B+bwk0N=uWe}UDF0G1Ukz$wpVfRG@yHanbh9@tz5aA8KL-B~&_A`GRBGNnz4?57Kbk zg@>A&KnWzuje>Bf@&jYOEEoPpt#HYi?+V0p6ijc&CQj`W0>tCwj9DAloVj@;QUuk7 zlNYpj-NOVa+^Me1;Twn1|Az|L{B(?s`9EkIq*Lsy|3SpmUSa#7{WmP;Hz-aN=zk+( zmW}Vpok@UzRJ2oW1MwLCJAsyxyF~{Lxb%kdR#{wqzRye>%}U!KO|ac7vG605K<>*| z0HKZr0%s&Ngel>W1jm#x+mrc~@2Y>MmJ&|fvH+LAC&ogAiiWYE26nEN(zT{_ncwJB zsk^U_KF_Whx5M=4&nTH-JO7(L=L zFq|thQf`#kCwJyI3twO{(C*Xd8m`9sa)yHl8#lV$C9_UR8#KvVBUGX z7_Fz6T`Q9*H~;9nA{pH8(LV410oCzuRsq#WOVvqx?MgbwMM_}jK=#)JDwKBP+ctUk^MPTILL1%Mp+wK9VLczZOk zJ7ozVeGWtQMOe_~az_C7m4NtGj|zyB{GuM*KDYxEzO9 zRO*a~9gZ5m2H#eDGKPINX0;TEzNo%5`he0a#(Q=usIYg0^jTb6^G8wCRM(V|$?=K$8yld> zs6#G7eiiWxKNSaxT^O-fz-4dZQ*L1m*(NcB`Zp=)G&U=Hlw?D_VE z?^s`(U+qA-mPw(TYi+GTeysDQLKDvdcgJGYiUipLUc4MT)q}jLyVa0v-Vve>2FSR; z&sZMaRTGuKeh08aVOh0s%g3>C@KOX5;; z(rzeW>vA@L@i2&_7p*sz_Loqv)X`az30YhJZZcS$SW&@q{Vt-|M;chAAmnmFVFx)T zT(I!p_Z58ROOz+x+1y65hK}F=Mb$e7XVQLM-1IG%ZZ3n$$Y$6xspYktxy8vctGwXvAm^tD zduk#^@`O$k0E~i%28&%nvN_vM(6!SoX0}Fr%K-HsAwJD%g2id>wHVw%!5D~#oOc>x zY@3rrN{HZ^O7iFE(`_8W@fUaeNsl733GX*N7=(Q`9LN$MTPs7dy58>axznC3Y2__r zMVh-7q@m^a8o3(0JXlTflA)uD2eU=#>)Kw)f)WZT41D@wBm8Sd62#h5S(JkZD+&M3 z_0RG}`T@cQ6_amMe-oJgUZI}=Gar_@btuMANtPQ*E6sV|ZQ(YgX0Z3k4i?H|j(;jx zOzteAVGF6jLEP5qb`pr1EL5XHrIcUQ5+KcA8MD-&LJevVn!!(e@#41f;5$4CkvCt` zDs(6d61Z%dC#!~~4qC@yY|nzHE|vo6(9{fi>^P|z2kuhtMQ3?LU%dQks+wy;xx~5N=u4j3q#U2zJN>i!S;lS_%{;1yDGr;}-#0KFP$xtKN;l^9 zocSX{%UVLA04TUEP|()VH{MvC&}pg>Or54%=sR^TB#-ez{uLaY8<@IWKoFs3`YX+p z3wZH&4hu~VoYU`cx3TFdSqM+iD4RGU(QA624Bk+}isUp6(9Yzt{cZL$j+@QbsFb8v z!L-HYyXHQDyNP{7_nYVtA5K=Q)ldCZTk zjRpaN+7UE*!!f`kRW|w3i^u2|8XQ^nC=em|d_Zn$bxe?1ND{_)+Oha7#6+8ntQxvS z{2c7PGlG}OlSw)_y)nSYpp+y{p0`wXQ!zl+C6RkwF{l`)GC0+;lp555ZBk{VmKoWc z8UTONM@|^!?;|O|Y=L;ic82b;RG4z+4v115Nw+MdW>zJVuv^moWpPlDjd_$V8%;mNeL=RYuAVYF-U`icUwkh_RS&kcv!>U}&vaZas zNFzTv{oL6lxNKS_Np?i#RV2?|CXZ5V?{@DbiXZrT+uzIe6jcT97u?_O64X1FE-3nJ zlU6pZ>?5+2R<6f}1p}*5t;UFtPx6Cea~6xT@qVlS_MVfgxE!ob+&dcpgtZ*{054Fw zy5bviGnC&d7xa$E^DovaQo}8uQ<1Yw%d2fOT(T~0kV98m4aMj)tr+!;(y}Ubl5LXD zvMPO$eX?=sE~8h(bS1G0A}Vf|)U}?UIXx+E7uB`Ax8R*oOi4R;bO|c!4j^zTY9Cio zUqF;~iGmwF&`B7%=S&CzR#?dq5DnES$D&C{-KD)(msJB+GR`3lPsE@2gzlS)+o82e zmkWZHwyhnpJK$X+%GgV_<(iai{I`7f`t=LR7LCd`7O!O8%luS+t`!6V?*HN!w*%~- zyj@bp#CYM}X{qnS(L5DF(9OHZaGYAou9aSxli&_nmsDQLrh1it-_x{djtPLYDzGU!f@tK!bof9QQ6g|~?464MGkH|L31q;j1 zwU>TzfS{jGP^6dZ^4XSCsDxN=L)Y_Baxb|8T*~kr!Ek#L&;dtzp=PoKHQ9k_VtLYq zPsNSd$_g2lDIVg$+0cE>Tp7L+1CKv4cYz*#Dhx2<#OGvyPsPtsMTU%X)us^@&n2tk z_qyCmmo_hvaE>KyBi1<&?ax7#o6z22eBVeU0K#oqdXoJ-JQz^^W;E3=l=G-2g#r?fV^?F6JEa^!BAwK|QM*qa=eTU{{t7CitYkZVBJy1lWB`@P zY~U;HT*$ch29C^Y^87hintVE#q**>NfvA=!L!aS~4ap(Zhn6>!r2!uCpQy&*V~M|c zr9ItZAyWxJ$ma3H-%l8=eJhFW=9jmu-ECtWfyej5%ctWOM3w3Y3iT3?{6SgvzFMQK zPrEZ!P_{kC5P#wC^JV74#t$QcC=jKznjUx6oeh5DX==!wTagyWeJtl~*JM7Ub3I~N zNXflu?2y3ie3LTU?{oYHk@8rJpiZ93V*XAvU2-}GGGy@o7IHcA`M>ZeMzdbW0A?dD zSuql26;G|wCJUqTxCSFFSw@fCJ%Lk>ahc7{?MJekO8Hdi)K!Z*dqQfxf`U&I39a2r zH6Y0&8Bo-&Ia=4BA{k2ST)micc-B{LXY$8K(DjXI)gRisl)HfLxmeJusV_;^S_8c$ z*1|WSN7RA%qoMB0hxCreh*j6jA2n5ln)2#&{R!4rT!KYvh8%uYjo`NOQZpN*d7h;m zoxqZC6b1CXGGg~~N_s!yI6);aln?#|8LsEb_!Y`HNC&9(`Ga-LkVpS>i-;5Xid2Cr zN6o3fR1cVojQC3nna`{}7Rd_6;ny#pb<6%hZ*TMkc&1Md*Z|L%$P)a90h+^4GK{WL z(Df~-DFPCTXBum1<~>9|s8tIILHe}vk59-h!p_j0bBWn`8L3+hGv(Zdf&8su9H6n4 zV059Q#H1`6o};IcfLCXe<=P#D!NUERV^P7dAGvH8A_%S4KIXn%$qCf7Us2i)P@)AG z^8!EeEUqcAX`iD{W#DWVeUYPXxl?T`qt#8`p^yn~DC@5EPk7 zdaNZ07GY?FcI4S7CTFb+YM27+gWZ3Ohxo}a(T?2F;{}wL=5x-ni=h_dzL=|!;a>dl z%#WGQ>6e!#^2R9vWFZ5|`aq%E1?W$px;kyR?~!fXVG9B+XgvOzK4ei2iiUX8z--Cr z-NSZvaIG{jYjF|H`fS+PLzb=b&w|K1d(M_0RgEpEAj~2Qimi3!!%EGyc>VWH-Un~- z%|Zvm+)m9aF0EbXgJNLvcirf`WNB*WdwfCff)-d6(#aTK9mnnsiuHOwm-;(!1w8QD zFZGa2xFo;lB7FEtUNc;50pHieL)B%f(ftA0LrvZ|ec8^?8*DC2tvA!?n*LM(qdV-n zcm7~8re8GRkaOJ;@&REJ`&50z+fv6zzb@07<95JVLotU+olNhRbjn3Q2cQtMd16(S zI0I+0{YA*63B%8E^zoyn^llUQ(;Py?ZxOfRyUGsT)8~(s-Q330RG738n4@L!lz48N zwe-+m2!NTDAnv(taXMIt-siYrLJwuoZoTOpEq}|*HUyO4gSR|+3GaJ_|L}5gY|w5I z*nq4u`a9X!p)~+^VD!Wczkcly7CHpnOhe?&PZ{0$WN=a~y!CLQq8$SWWGvi?f99>` zVdOAa$UJ@m&1LU>K8mwXkZo>kQ9(3e=DF^7n8xyrCd#2xj=1R-kr_#Z%!-y5 zV9gQf{VQ?tnde5hQ2lL9IUCgmwt>Ua&b`VDu_mfAQbXnqnfo#MyNPqZ7nO&=UqWphj!kx>QEB61PRCQ_<=M!9oD4+2bf5@=Q|~knk70DY zK3)xv!GXi=4u6hEExX>JZh|uoHeYqt-mz(&Q#u#al|uU*Mkr~ZCb}gy5N}~p#BB4( znE`wE)FhV+PnUc|#kRu2TPVSq0YmcR&Su6pQ&aiw@G~HZ)kOhFhnhW&3IM;dttc;< z5%LAbqLlPKV%dlw3D4xXer?uUzKp#ly#`lm^DA%;H7zG;v5UGREKKw)+EDEyq>r( za)}KapA*9FuIvNiC!RTVOPbc5R8dcyJpMCfu=E{F+L-h>tq6sD)Q9t&hQ7*bW;q{9UKlA- z;3uICqTJ_K7J8+N2bgoi7htQ%mI$({I)hFXCRngvXG;TR%F@rx5g;t+*%o-)6D?1* z(iJ!sK-;r0=DQkG35vANdq;ntIeR2c&-!tC*C)t6vsJn?{ zhA*d9)nzMyzS zFg;!FFgFGIC(wJu_(*GN^vS+6yo2a?hkm%)JHlmuVSjF}zcxBC9WxSd*wU{U(a}5e zi%G1kub0&pFK^2SSXtsYD!J(&k!suRb+{Mka6(&fNo5)m1YPA99amquIl21N(uUIWvlB9K;(}Jb= zJXqlG%{*C_?ee|ss#l`82U2cWcq}H#-c0%*yJ(}6y(Nz-7Mvi?7rIqOGA|j2&v13e!~e{K z{Ljcbe1FNF4lQ1k4MSfU?(iN@U!F(qEWgZ#Rnk_iaC`FUNQ=YU zU|>}^XLyNn_z=Sb3fGMS{jzX8Rc@4eQ+@$B?zB$HP&8BY;l;(Zz-OT_7pbK!%hz#= zCRmCEa?j;UXqSG?=oL+0US8(%Uf*GECPy)Kf8;!WIplo}ukpxjYS(*KR*&4q$4<;a z{;-)k=>#y%-q1Z39E-DA#L=z-z}C!Y)?vURb9Gy%v6hS!a@9#W86_MS%BL@Q&*K4^ zq?j5pM3~Bh-Vyv+Vu!AB+hlReq_s+zF7G<;JB{@9FqZ^r@YDt-d`sVm;i@cL&>|m? zFyAlvYdEGZ9$~Op+Rc47R$}bHJgix9ws)}>Ydv|z3p^EAym9!svAS9MW^UCnim=~bCN z))_)I8|7zm8_FIV&EY;q9pT$`Taq{H>~o&YJg43pe2;()wfEjw_1>$}3Cml& zrwFfdUMi;`sY1Gzrl(*BfS}e!w%iW!LH6j__ldVP{=?4naYq;ek3d8}_Xr|K1p1;7 z)Ly`^JJ4>lLG135@Jt~Ub2; zfR^kAFLqw_@^$Sny&QIj%CK2Ur0)5|b`xSe*Ouh5uZgBR@S1=4*abJEWg?}+3U}6r zN*5kg>~*X7;w2A4Klcl?^+OmcEu|jcvo&cuC4GStjNSiLl3#kI$O}(Bw|dt?`Qk1@ zal&n}SGcU&>Wvnm0O4V+T`!OTyMzv#cuR>A=vNUVw3p%x{%H4;)fS7j604mJQi}~* zixtd61-^S42>Az7kdPh%rp7Fw8tR!nzZ>>R?NpSaanHu!%X{-QM;Bijkcjzm7ecs&l(vhgi6mb#w@`S}}G&(Dj}p{|BmOhJ9DC!EEU`ZAKi ziCmVUN6Hc_Z(I??+;6he4bpbNMbVFGyLs+Y(C-yXAinGfwZGN`b8YfM--Jvebak*5 z&mj_i*aesVa9VP9fkLD9SvT$D+UPK5LrB9|b(2y&h#V%(wB(XdCCkdZ&=JIw^QQX> z`*xi^zH=lkJ=N1%$LS+yE#8)25;;D!L6L<{$&ka7{Z`ofRQz)|MnUTea>7 z*2OhDaJg&Z1hiUi_snhZZ#=r}N)s+$1W^dtZOT-uZEMBkD4TP?p*vzu%vBM8uC__T)OCpYwS>)I|q}Msa%OWM-)aa8um1!}RFb|A# z2;NK#rytgZF@L?l>7ee@m1@MinTGYl9Cn6Uf$*g_qTT|-c1OYvo{vDRdO z%=83H2OI=F8Ad%PWc1>j-8?%@amkh#mtiKw5jf*p{C}8vq+Z$#!@bY0&{l;ZFsiTA z*d+T~jyBduX=0pZ96)kdJ<|e*xVl+08c*^C1vytjHcPExi)0uP$mNq?QJw)7d3KiU;x zg{w10Yg^*BnzPix8aDoP>V@0mSI|U2To#L7OuIE^6aDM{y)dhyC-(bSWv>=jrR37x zMi0*AI#uF-@D|j}2i77(gwCV&m4kk9GikkRmT*EJOOY_BS^m|tL>LTy51?hOX z3g@NhY*^)S`AT#q{Jm`T-#Plbnizb4EbWM0K8y3}h1fx4BkOjwC62qX%Iz~bGshHB z^GDO~qdE_IlPUN^a6%(Ljy?VaDin_(``w5Z_F!&5v5D^6-LiT_lq@i~L4L+76zw>% zeFmNMrer~Wvm$Q0^V5C`PoE6&;_+8Rrre|PXH~did&~&O5CUB~(=Xn5^`_NtVY-vm z??vzq6=pxMIqnE|cfO{l#)p1anDHxA?L91^d-=6zGpNMeik)+Hi+Ya(Qz~ZOU^e2s zlByzWmXl98LKAO-w1lmRjkH2$Ret3f>rkkc>67%21@GvL-b?_EAhWIB z@bO=YtrU1r79TD5EVh{VLlleIz^ofd*ta2|3$>Ps2_T~f5e0nPx=?s5hGKFiE9deq zwD8;i6%VuJvxGD!!^3Hsm%+%vma5CObAPG{oD8AR8Rs=$BAovj#D0$dsngLMPdS;8q14wCev6&6 zI+{>W<)59r%9Wv=zhFI+aq+ogJ49j}$)FFR=h~L#avr-g9nF)Gmy$l$4WH~FWxI>k zq(X%IY!;=&CW4j$+U25jhYdeW*>|+e@@@+@dC_DI;g*GQ5FK^F|BGjHCfWHR)`4nq z{(@Y;C3fY-(KY=dSjWC_(i!yCXX85nc6kiNmCryXsFKyr|j% zTgwR`O%&{wKjWvteKn&i&|*MiC-$ZALwfUCZ?>Q%9MU*pI%cw++6ovbNSE>1@57^< z>ktjTRd7uz&~U99;nT}gs_9>r4MxsLDCQy&w~ za&Aje+$XRG$rKb+*OQ zykvUzJlBSO@hJFNk=0Exr{ZFoQZZudh^|#T%iN*D<}mVsmYt4G9Y@YMk>#7w^tj&k zz97>=y7^0tAAQ6Sp&#DhO5}G_nBk(cI!rk3++v-_BY`2pi5oasl|Cun6)5Kc-6Dk2 zLgMIBJQQrbD8hb5)M7y}Z^TQx@Mn7Q53T&KSzuIpg2Q|#TeF#Zr#^ixeGV*5S3$%z zt-=ai32cP?)V`=8Q*97b%wX&dEbf(aO0k=MCp0lJ-RM|TkE%g6m}U^qSbH?!pmM_9 z)Fbl=ZpuSkxV=#at5f@--PxqhO235pMG)_!HEn!J^L@G=t2vM+Wmill?EYyJVKQo1 z6S&-ku4pHA%pjG*wH z7-R6*5nOrG^k|e8@+VG~&zG%5NWY%@;188-{2*9p!~H#a5YZ;+O~QHQySv>iC)-ch4j+1qmO1DSr>K^ zt!9?$kEttHT0q<)&#iwwXoh(loR=b`M`2S_1c7jC$nwB^%Ec3!(X7TlL_tOb4pk@v zRM-j0`f1c!=;(BnBy|Zu_ev~Z?Cn9Xwq*jL`!$}sVorWf;QsJV zAa|VR3qbIW%r#5q584q{%B}(4M`-kYdY z^v1(AtmzC8$E(Nkx`%=vlzN0<@ru`>gBak9991y(izlu4e0@EaC_n5R?bHSxy-ZW3 z(rkhA*QcoYs>!12IV+tg{sPf^R2X<&4q3eOY`ke%;t*x^+&W86wqO?wtPO==|H0rq zK>)l9fb9ILv_@o0g6+*dQa98&`3!ZjhxAP!Mt_WVO+w;9i(N5h#D(Y_zBQY9Eo9Y^ zPCfrir>P8z{KMdLeUT=?`y1;2XE1DWpv67=4fV=S@K#GS2R}k`lN+2IDTaz4(+MJ)}*2zy1rd z7D7%D`oyM5iQT7zOQG4PLrL)p!~NN!r-b|dpZrK$9oG!%f3M8gO%5#n1OeGaPx14| zWop*Pef{~r)qMQMb;J4JovS}?(SIu>2*YLg59Xy9i+c$EKlm2L*^QKE83>4Sick`+ z91u$|%pd7jCXBft>tU=Qy_2sm>y`<}m~cJr9}dw*ts9S>7jJ-_7;3)CU3s(KlE-p` znoY&?a`Us|_f3ZT&DF*f`Pvrv#ur`#%fs>1-4w?T+s>rt^F;_Dgm2I_Svu!HQz|Hi zwsfBm8lJ3B9VC3UDNg2%R&^VKLsjmsA`qPrPh1EZg2q(63^J|SG?6kv_XsEQ4_$&T zI?my2MOyX1R<&xibcbNx!6mnJK-y}iRl)@i8Y|#d7lt>yB52#T$g+zX@A_V8Ry?T@0MvtG z+fC8UVAHr<&kq-HaVf{T$kz}=&vAgDT9aeImt(>Rr2Gj$%F7M$XBW$q>spfz)0=XM zw92^TRvUPU1{BFv-zYIetLsvd~Q)5Pux={xGFmtXn+0vTPSaA!n;JWHYM#n)Lpwu`sk`(RN;K2 z`k>M;)T4)jMTaAAAr%MO~otXPCbL zpsZ*1(M!GtD0K8CUDs1q-P6&nqVqkg^X>d8QCoW1J2yt0 zoI& z2)XZ1y&QR;uBn8hD_ZM^UrE$i zr1R=-=fty=Zl|f(5q0^nlKoa<%t%iY5kiKys6KC%%`O>xID&X|ChDpS-FAzNhf=&3 zl;)Qo8%op>9;2WHwk5_xDXBsM>aoiG5YZMGF78E+ODHPV zjKZsUlAv1=OI8{mnGLs>#uapP_^5p}^D` zhNvkyQyKGuq??qh^epE>Ug=ttDs_{2SanuKjZ6jTvE3WU?c#W-PL+>*@d{Tus5sN( ziKtP;mFXo)fAgt~sKI!kzhRwl{QGuW6`zSwJv{hny;CrFhsNVa{mQ@ehj_^`o;XLg zr(~96FXBV{F~~2Eq#_UrvMuMz6~u?V(nz&9zx|PDBLTK9FI(2 zR+U8aL#sQno}u9ID6vx*RWG@wu(JZ~&2qdg*s*%)@Z#{o^bOL(v4D6-bZSTTwoNR_ zF3B$8=qlZw73B|HJLM_);a{TR!wsr8V;B!A^Mykm;2{rHYlMG?=^KF@XSUhC+nXL- ztclSjKg_lI5&k`xWXBOyUFaso#Ao6v)dbk%2NGRQ2-_Zo@c&VawmbzlpTQnDogx%ZzTp+h5QS0!7HYGJQ_0xhGW5{?t8`-;wrbWZ_+v zV*)Aqz`T;0`Gu9zp z#SNgVr*IVteEBCCP^>Sc{%;&PucQkvB{1?w*JEx)RD4hIGLU4VXDLuO5@b9_ak`}b zZyNb!vAXL-PeHFp-wo9(nBR2_>!5(rn*iVzh-svJ`80!UKKjnc8PWR^6l`V7S5LU6 zP;paJ|Chu6Xvg$T=1}8a;OEYl6xVnD?oRsOq`z!kk&;hQLXK#2&FCec-axZD@x|j7orK<$KkTLfQGmv2nEUE4e=Y#7yZV%+Yb5 za`ATpT8vxD=^LwYz`{I5qx< z>UMUsQL!?~NKf<5BAQ!N5ANUIOh{s%nj4kuoR^QiP{fZ4&naJ{rO`Gi0ytS0La&A% z*njGtDJS}#ujYbNoeo>4r@)WTsr(YHV}wA4@u0M$VdgJNF>*(f71dFX&bziP*wvu^ zg9ouwuxh(>duA24yvno^J_Xf@@+EJ0Rt+U4<#?%HbG zb9jXF6aRPQzyJ84z8N3)EI(*T?fu$o*rDzr6$Iu|_VhE414GcfM3cN_*Lu_vcaW0) zR^@y3C$gM>m6T>u`bvdPk9h z28>X-`QP)G?83r)N%!qgzVh&W)>V3yg>h3$5zi?jLq}Ks6+v%E1S;P$zL~)mzG^oY2*EU9Hhp3m=DHTDwJtI?GJ^+*KV#>1BNjiJmp`~W_~HNgiKwohZ0(I5wiBkSHoIW3I?J7-mqukGNYhwii#hXdV_1Kq5_UaQi%RSP>f zdtDW<5FOrmp*g{ceo@Qr!iG6190{5?R`9`{=wI?VIi@Bmko_8Nx{QrOgytjv#PUzW z(zCb7+@{^~gf7}Z2KcwyZ&SL?aR>CKrzNteDfFkNr73t*8VDrnI=xE(=RUOPvIn=P z7qL`I>Y7SJaj~ne+(Y~P@i;SWtCnx&czP3=YLe;H(~(OPJnhC(_`#j=Z!rT(E#?UW~gMo>S0_>gXTtL53*_cSjAqdDn z^{aFQcFq0Wi%+(%Z3sDb@iM$b`b~uPByWi{vB+dH6G`XCvVI+bgroB6ouzj& zuaN7_udOk`zV0{<#-}@Bw&p8?9a^uEFdN*8q>ly#Jb?}>Hr|0;@{i&6{^50aYrJcH z^@!(5n~b~23)(Vunu+x+X7pQN-Aj+wq{Ss;79DqD?V!~o#h87nq%n?f$I8CQEbRQ~ zXviV!Bt{L+AAP0-2eo(95?TF^pc=*O{RygO1oje~F=&t!iBQqq{bQ?i@Ze=DTZF>_&_7^J)+fPJjUY5!JZKg4rL0hqpMXBK{kZn zfUH}PG!Sk;a~kMmWA4jp&OI^gh-&>diYrWDLi6ZBi4_?bW-m(U^r)9pn$JXRfnHZd zr_hw`amiX?PN@GY^00+`HBb=YbpW5=&Uh3R_|sDh9;?GcyQ~%@V!;v&8ZM*IQo&%O zecl71; zIJg7p;-89!Fnx0-N(8I4DFY8%dlTv{0$sU;qynxHcU~yl0?Vb5a%$ISshquWrsM!a z)5hrIqns7j$0f2aSr4|LNL&Bf!EkO}h3K#@}SFq_Hhzy_I)!(_H^8p7C!y4oPQPB^;_w`f* z(=wUznM#^uxx0I5jx*{}4RB6Y)4^yZm*lkiilzI_)#d#(ecABVIii6W+rgKIjkIR7 z{%F5xJI4BPQfQ$|4eSG^+!bHEosn4Ki{>*=mS9a%rLI`cJT63WdKlbm5NSmW{NGd& zjHQv6#K*r}@e*zAl%B;&Nwq?Oe;XP`E*_Q*aO=|}s<0DUhY4@TEeWXVc>^RR6*Q2J zy<{qFM3oXeQael0zS#-o!({|qg!2O70>J5w7caWX7<&W3#Mfvhe}f|6UhRf4X+y#` zaYzd{z+KkDk@?%twNT8hCXbA+8VYy9MZk@fXy#D^Ihl1N+G^u81v&>Z`V8788fhi=u+n zuP`=j;wBhTW4RFb9qU5?GQdPD+tGwoIo5VWTKy{f7gpTJW&W-~=qTJR`ST823>U3X z4)=0=j(wVy10cB1%by|Y@5|Ag7ipVZ$tGb_NLMy)GizP0f;9a_s4F3Iz7}!JVGW))HO7UGUpKei+f6jHO)|b zjXxh`WmvV9sVj`bDvJQ%-M(tB<{w*%y@3FI`*8Tuec1u|y``ue`orFsisSxaOy0e~ zqWy@XZn9An$QD8p+CjZmn%?F|;_kT@yF~_Ya0;c(po4DKA3xlizemfNn+-UVeEpXMw+Lq7rR0XSO9A!)UFz%6?2Sb=x@ zRBh-Cbix}xH%1fTm|(gZfhm>^_n%YF7-L{bKUV9hG!M2IacZCicNL zYBNV6&3u0o=E}?uw|zrAVxLf)bWcy0<{wBUh*QW-lr8;KK4q`mBIeYx8zpSAdmU)Z zX&k?KV%90h3NmwA`B$Lag{bM056_BAm88{x6#1>=d}Z=-=wQZEHVbJS%I6smcb=)! zj5pJx2n=ECn7fU2Si`|{F(P(nLO2FzI)~0ka`p*EEP#h8@Q3{LUBr~U{tX;Wb&pmC zL0kDq(zEPoy_sfvmW8G|m0F0RK7wP?#mGR~%iqzS3n7}+ffU2tYHEy!b}t85>3rls z;xe1QY~PeWLZ%-`yxBtAZQIA$*Ln(}f1#JQmyg-W4IL~hnio2jG51XX2Z*VfXv}W? z9;I%bx?dm(Y@3I7K{Cmhc!c-vo#=HzPF2{Il}#V`Qk=gW=LP9(iQWc8p^^SzA1w`b z_Jy3}i+d4GSRh;Jtt~8zPY*v`LO)aiO)9h=LfT$fs2l@q;BoEEvo0;1O6)3Po*$o( z0I=S{ZL6vB{Oywlf5KL9x3)-1(zl&m-;KSJr6>&0AH;R~Y_FYlvyz7#%+pJPM5>Zg zE8Pc_3Su(ml7kg#GL$frD@dI8?vc$TxM=>^{giMMsvJ;5YN+z(@m_@3A|3r+ z1FYLN)~D{KN}#G?vTKma0!h zf@*-@q#`th*2|y!0~a+ci*s)N=rDR>EDBPj3e3pCFUKu%RrJ|4GK<->OOQ7h@UB%CRLM395s-ths9A7UU&)5 z37RKiIvGhWCt+kPBFlgcFOz9ZafK$asBX z`PhmYAWu1=JpRB;no)x@8*b?8(ilNt+T4nd_P}t0OzQL* z=$2d*m~mFU#;Sq^IK~=B4hEdtSb;xn7%(*RW=~06qHy!NH}g#bEq7n>gi4bN!Pq>T zCa?k?+zN&P_k$dOCY#`A?SV;=>TNZCQ~7%hSX|qtsm%bOmU73`11dd7M9tup1&e6| zoAkBr<{DqtRM@J>)P#vkO{o3~mom4Q;Jh8b&MR+Hbf&9DO^fiABy-M}m9Y8N3AJ1A?^(D74nUwmXj7=3I0YBnvV zNxDd}K>?El8nb**l+u0Gv4}D;4ZN&RGogwW@BN~LlchHM!37*EohOK?k!xvL9N{&z z;!Rq0{BLtKn*#-@VzaR5X~e29xd3?`^4=w-#hiiDYN1Ww@;*=?OP&%-+>mi|o-I0m z(@JC8vir>B*`!{Qg0*n4rp`^l_cb`!jc#E3qV~+OFDhRvg<)~p%Xt8rby8zn%?9JB zQS_b|h??v6nlcFx6$uTcD-K~Sm7MxZG@!E4G_}n);L8&aH}W{2j?1un_!8aZez?rGft(NfvEb| zaDlZeAoXFqw97xzCO5q9Oq7~mG_1YOaB|agpL^IWSd^I`zodi@0^VArg5vN1(@K`( zLe^AfuF@Y5X~Cny8SZ_eI+ICPkxM07p=%j!)8{~(8)bttBX`@b!5bE7@xI|3{gqKX zzyTGaemY1cGRQ#qYY0`ge;5H<`vs*68#l%Xj6wk?Vp}b`8qot5ein3h;adoCmMMk5 z23H7wkV|`OAvVNLA51Ujiu#{fDhuW^CY|JJ@( zP8csbvff;J+|868nV49r^t`^hS%+kuu{Sb_UNWh%DB@kYRh*{^F5(6DmFesaUUeaR zyn(?!AsNgK=K}1JDps{I?Y-a;_q}I2Ly8|n>Oha(8Kr0roag>G0?}pEA}N_!i%c2} zGaq~53kDm6)-DALnY_?rcF!=jXAVC=P#xAy(Ae4{08(nT5ZFF}OLyuCykJh`cc)1m zOy=`hP|CK%MD?50xWDI`&6`#~hp)=%d*NBV$WquKcmjj%iYOqxij0{<9hkD&;ACPa z2Jslg>vv&4K&zZ_i3f_>V{4{>a3vraBeGGrKkz2+r8tLDlpaNOU_$(iTw^7h!|O0kC@v54v>@&<7y{?yfuCdgQ9CR-t>)D`rR2u5MJs`WN3?L-5g*dgEO&_Q)_vM)rqZEvYO`yP1s z-sIRP=hTn3XK8J93JtlCV_-)JFLl$COF-xjDr>Jue+hh+7$s9N4DmRs-%k*yLj5t0 zP08c)6nSZ0L4npns3lEWxHu-$?-cFqFz6SFI2c{~HM@YHw5sA$-kBKa3#RM}_sc(h zaH$0t@UPo5YW)0F-hUWp=J?MWGH;)OwAC!(Y0|K;{ZhrsTFkD2scR&A0uE%%PnjXm zstBldU;H$5-R>%G?kraF?MFr&PN@%OpUnz3a}3lru4=J|&h5UmBT@J)X6!Ndu+U13 zq}xjVwY;gl+@G>LX6)iN-LA?7Z_YjN*UTIkBp-V#<4FP0fw~ni!-L<`fdgC&tZuq} zo;4ky`dA`0UwD*0!hC!n7zBtN`%}9%HN!Q$ahVjDEjizrRX~M-ky&oUuCr9D@?#)) zT8-fcxQEPwM%Xr$Tt_pt-Y-GBwtRZ#Zxdabw#!kAgYu-gTQ9wO)C~_CJVG+^J2eAo zLM|#QwYA#%Olk~X6ba2aNmM7+u(Atk(}>o_#5ag^MDS`ICk@ZcJOq(lS1H}j;9 zl)5yN+T|#Tbdu-D@&~YfUa4p5-Rb}66T&xUoqHTTq3mx)!NRYXe{*6G>;NYbRM+}F z{3_oCJ#G?FXS_;-?x-`A$oEM6eJdUqI+YRAiGH_`be#~3MKocu1OL{Ea7B9bz@ z4Apk?(AM`G&L;AM=2a|)HpE*6oCi%RWeHv?H{MZGZL(>^V|;JQcJYMoXb}c@QcAkp zL|ApAaB&c$WQ%oFZU9ay3%{;#$D_@QJioW#xD(~GYnB$q8xS%O*fOUrGHmkKBi1{6 zWYOMnpABz#a;tR0wk|rNW3t~ucU2&(rz=u7=K8@|t;lUfQ{|zmo}XSc@vi|2F8RjKE}xH13FFXp`EOV-LFhZq)kEnW6og_TT^D?311>Z06NtaWtU@&V}=zD zzWqIu0EdW+9y_lUHu;bu$LP%MEk1KQ?LhK5yiHiKV^jvFm46(!Sy33!9`kPItA&1+ z;K;AjVmS`BL*2+(`887(_idUipKgn2=a|x$g2Z>~W5P=0&Vc>8i>Zh7S%|mp`}vwW zDq$y~fuP7~>a_KgZFV?|Da~1`^piFQr1g)oAmP9^Zm&d;2BBv%4@ z&zd3pcOE^k_xA<`r-K5J;2mcTwAoyf`(u`=<~PfRqwZx;|C(0@13Syab+J+E=z{Cd zhK%V$1clb%EPB<|E=PFMp#R6#IR)p^gzY-EofX@*ZQEaL8!O416`L!zZ992m+qP}4 zKlNAb+WTPFbX9jheK2z}(>>kSeLsbQYiAL!t-n^{+MWDf+!E!S?T}+XIPI;TOK=w= zdu`tInokkWV`u=lJC>22QNO+*S;IlERxKWX|AMVKl}RboY3(hVeA<^m29N>%dp3^~ z?ld2t$sd}&uBbQo7XC%Eg27!_Cim9RW{gYQ`+_NB>(RF_%^8S4b?9&FgZxi(UpClA zSo7gdppf%`Eb`OsmiWT1!>?&6BPZbIy8eX@@!wwv0^^sfv=Zx!UvZOGgsn|&U7?=c z$JRgpi31DRjM~I~5;RFWe*vv#YL*zWrdY~#@qrR^NJR1k9+}-jeL1>r#Kln0eMUVL zQ!~z!pcwel{U&fJ%5{sJz+!gb_PFo8BSUcCIZK`&at}9okHsr+|GQ_rxm2<{hWOr*>6ekxyO?qh{*q zx#|-!Xr!7%*{SDkSxu08v$n4cHX!s*M|9xPepJUR7}PY!B49IjsL<`sJF=Uir#dQC zg$P+i>vVr$U!}pPtcI{8CGRu60n7N~nc&H^xF$t5yaSt;DRGI_fWgy5IiIj5iYtQa z;+$4iv!c@6J*Gype5phCplAjw$(adwWFvUv0=TeQsG?Jz##0Q zj8LYQ7ig?w0I03RLjfK7?PO4fw^Zonp7c&&V6WL*SxIQqAYmWVZ_0}uTSim)pTSeP z{o;d%!Bt;Q6u4?*&HK=S+npLjdPh3PKJvvm*11FJIz=U@!Ifs*@=|={8fxTInI3AE zYD>*C?}XVCj=^R%VP)k=`3^eq51C`#O06#GtIx%~K?(hlqDY@>F>yp-*L1UU5S{WR1yK~Q&;2Pv|zr+6ff^^hP zzy0GSQ@U$F3UXtd(yE-9^brj(9aHh%Zjqqo+w; ziz#n41hCj0wHW38ga#HG%(Qo?FWcQEFTvgs$b7}Lf70;^+5E1But-O9BL}vtkw|5K zN!f`qHMP{ymT>z*cW0~9EvZ$jQJcDi=k_G|L}|dQtxI3Yb&;snEurODjI>kYfNf;1 zE6B#ewQ+HdT+b^*CcQ(q%~08j{%gCu(o@B$72p$Bvt7AeD%YDRxVZFDU)DI-uBz#I zdJaB40g<-8x<{8c@C%a7lCX96HJuIKN5FV89D~_(k6*`6S?gobUuUbl68v1O;k~Zr zS`|=K8RvB9t*+&{;6><~lP{-MdoV~{|9n1VaV3hT4Mi)*izP+s`Zp2<6Ch#9@cbP5yw(YK9!0R|-ck9IEb=SRgveB$ z_peE>1&eNZs>(f=w9inlayNiP_*3&sTuVqpXklrmycgSOo480Mq@zzQU;y#SO$u(( zaT3F>m>|2W7=EPC8V;QOEdiIL*EZEsY$puuUMbC3{cOF zfobH!%89e}*7SgD@KyQ1YVd`Z|LtGYs+0Wgoty)9V8x77f(IGci=O|T7=KK3F691X z__!~6p5P5qOdM#|n70zAp)FP+{WmN8Q*r|yJ3A$g+4H~4F7eb33U%dYLc-(e z#w^Q=^&j`2;RtGaG`MH1S8&J+*$Z1+Jk*MOFwHT3gUl+0x#n(b-H#?eH-J5@Y@Y6) zcg%USlao=F=t@m@d&9#XRb=-*^X;7s%Z7~AN@d7VB`2pyp(GB7Gj{uqnycC=;j{Ac zdXsCB)fCR8Kv9Ft5Cz*t4!ObTZlK1>@oe8S(-VZ%so5Savyb*{sH^q9qI179eB4Si zX%#{k2lkIcrdW1d;Ubn5JbDTrWtW~-NKKdExh1%)q)yPrV z(9QSNrO6q%UnyHBFn;S+#WxSQRg3GD+ZOAl*Cg9wg3-(1{!XV005D#O(H%IEbIr5O zGc>fwuFy6wb+kxU&Ntg2E=B7&b0GV@<SK-j?Q3b3Mzr$On6 zdDrXdRoY%Ok(t|f*VxZ;j{j1;q`cy5Sgx|&SsHy#c&;a9{Nf~bKEFTJjgl;ATQ0G^ zqRz1)z<5nix5|w8PjZv#YPOl-Cu`Rt4Zef&#d33Db3j#y8$;Dzkr1gsg{{EjxaJg< zZFh$Uf(>Au^Q5!EqpF6W)Q<^~J-nS?7CTO2PSXb~)wl-_OO8E;@{)_;OtrU34I21cMx7AXX)3VVzTVEnarPVdMB@KTPsNX>rjWHnW6B+1Xp4=j) z{*M^YCtI_WO-q`t_JfsWb33i_hP6QkS9Bnm8(jHp@k~dcSy}7un_PNZVdOXADHi~R zeuK$Iu`VDD=TyYC zAngotVGZ(v=7GWeg1)=kBvN7fGAG(Y1b%{Vi3)cBBW(|DybF%;J3del?p=odAFjw3 zBwSAEE*RW)-mW{GzX+Q%HN3QMQN)~w4LEg)>NXthJ;jlLa7rH@7C@@oC+(iFWHpG~ zsi*7;c&)k}r`^Y^STCh5+)~jki%61s9ku5Y-tW>ZH5Ol=BYQ2GAon}E>A-o~ZmV7R zxBha@Y<5%=mHP?kx?0Dxse8mVKSI*_!g(UQ`poIrv|GIZQe{@PVr`9pSmQl9L_(wN zM>z=M?_KR|5Q@SY4Zuo{`MmKP%hse8gQh?@1iY>FXP^tuk_dOl5P@P zfK134;zdrCZLY21>AGQa@7elJGn4xj(YlcPmEn4?JK&0L{39dKaWk(IvK5>U?d*Ix zd&k*d%X6D#+b#{|Yfl)W*s*zm;oM>DYH^Ek5U%x7)2&sOC1!XRE?#x9ymPBek0;k% zu(Z?t&SfiGgo2d@=VW?*>wqRjK?DgB{dCDKc)M((_uZV?vq}ZFdVYs0VG~!-d^3s09o2_MFWN%54Pe9heeFliLF`}K05n}Aw|=PJi7&5kp!U~Pn#=aIz})1Cwqw2 z10d)>VNP+rP7}T>mfid-$D7_h_jD7@5eRXjNKUhSm=cxc1EOw=Ti z(p>~83($L$$V{Z^LqslaEfAW%tOZJpX~3_|xHOAZi7werCSa`Oto087`<4C=jDX@! z;+GX7gKR-$|H=2Nz&_X{Uc0kT(j|<-Dgd-3*69|klCieNRzI#6Gg;#Zadd*NvT|aA zR_+%~zWTEIPnmzHwr6(kSrK_uc2P?DN>l0@a)8 zrrtJEnf5mgBn&dRXbaf)=z>odZO!bE^X!uxif!t07Za#znRv2V$y%v(2fuqXD+53( z6K~GyUbNW@85?lYQ}B>H((pOyvEVGvL7W?L)P8WT&U1z6(HpIl?msZf3=cR zIXR`COnC2u@#|s;wg`hW@zARXf;AN0^NcJW&+td5ru5515n^Y`@F1JeIqK;#Bm8ZR z3@YuHxr>X{e2e?1a~Re8$>fkQjNEOa=y_8))6fpgUYNPZrv9!L{0Vsmz|zVN<)d21 z3+bc5dfYLYC$(n)&~SfrY7ZT%{z9KXAbHJx^j)&q^^eHkH(WEMk+TMactW3}`N=ke z4sW9JY~5zCG&x&@T)qZ49zzFf?1G*xd_+XHem?MSBlfuv$)Zol0b)0~`|uVLk;{xE zn(28V>R-U;;z;L8JunXVN%ASwP~X*4QdE)OUWK1-z*9laN>FQ4Og7KDVN8WeRqE87 z%`iI+!ufm9YL0omBV^+M{m`7b^!s#*6R~jkpGXY-LGH#O_hc_(v-6}f_naTaL3dBf zahtRCD)__!U!@buO(q7H^_2TlvwOHvGI_On92O-xXH+&#}M3s2q2Xdz;mH<}#1u_}N*YX&{HG(kt zPg=@kfJgve|AjpuTVOBN)?wKLwS>OhM<{;h7mdJNDyavZbCH-mn zJ=tJ9W7UqqVSHOaF*ji? zZ4w2iGAs+wh@ar-Yi%gX?`p3yvv;+ItVI6slBGi851p1vIt#)!(6Nu z?P1Esko(e_ilBW-8FgT63zLJsvJT_@P~8_ROuaXNgcmfTWTx3rh;^~X5ycZe4-Qiq z6O(;~W0^i)5S>F1nX_>XZ}$g0dM868JP2Y~J9TT+v!wwAsiB7bSq3#p9pO4Q3RRMf zejAIdH(mQeXq%JWeV#YA85&nA<@FZM=9tj*IWim@$KU|FzYtOCa?&#@Uf?8&%t6xM zPtPwvXxZ3n`1(0<14->vhe|qsVw{yRE{95Ky<~bYVdkRMOf?VMrf6!+Qna<+Co7U* z9EU)5wyAYyo*aL);sfezHJk`^kvuIR?(t`lE*rg@qn zQ>Tk6-C}+L{fu}%ckTx`$mk5*J`T_Id#Nh7P*Aw)_{A3!E}J6tgR^2WML4gcOtf1f zGfX2LH+H=7V&huGe%5%8mM8`q$-OYytmA(>G1o{j_B z*uwPtGyPKD(|?p#fg&9e95!&~zCl$8h-HNN`eLLp<Fy@vJMXttu)js~zc?$f7jeWym@$DR4Faipn*G*>6|p z$Wb~trV1JHV7t_Hv<>8epcg86^iCW7?#%VTdkwK-T+g-YBRtkZR0%ya>VU}Dofe$$ zQ)GbM#eEl>tiPcul-AW4@_(}NFa|lkF9a*6bnqm^E%OxZkg)&qXUOI4XQvmsm{KYyLa%+Z=`}mSGy_~u&tt2)Pzm zE!URYJ!OL36k9Q;q%)+Tk1Xnv@Dw;$}k1M)BmvtsD3KzJ0fMs z8c~hkh|fo^uM{fULBSGHB122mp3S%)c?}n7$>% zlui7s#WYe#?=t#a(&&_yV$d3ZVyBiD@`Up7Jq%!d8jumsi z_MFBKQT9b$pmO`a>IeY!BXbI|Lji3Oo-3)f6f4Bjpi*wnG3b34V==72o@W`Ni|;$u!c%Gk?g_f0Sbduizp} zIoIZ&wtzAWMH^jVm?6hJVu9gf1qNE2RYJ7*?dPm6kRph1?; zzWfb7oj22x+dE*Oe1GQ!=k76I#zdy>2tqH?>(nxrThTgx^tc&EUGo6w;@!24rpxRs zxHso0W*=Tddhyh7Kb$yD>-*JQgm6vRu&eqnjiwdCTZT2#_p!NRm-vc{272{S$PG0v zKQ5MdYRxfEM$Lh+2Q=x5f`TVAG;{ZRaN^}5REnaD$l z0T?eHKqnmuGcfI+Pr~jA>yV?GLPo2?_ZukB^5?t|e%{)H#e4A~zpa+!CHFx4FwC%c zQGFNQy4^vRcwfgVFcrZJ!CNSO_Q;caWvA}jqcMtodfsK6_1ucSVUWmvPlHg=QB#>9 zo)Vg|5C^=4!BGuiH+4eURCA_lusy*YKkXi z3jVYtVUx&~RZ6v~WIK@(7#*cyf=vR>v*kO-$rqVtzVl^q@~aimgz3_MdEUv;gHi!= zcsKw+Dt0?o^KFodrdY?F{k)1$bd9VpwSmai1o!%8(mAvj zn*Ma+^hxJP@(Met&${B!DJJ4`(T4Q$G7BIm{0-$K*6%09D-p*|AHfoLLHbB;`dSYX zjoBg!*}@a`WoIioT0Q)Rlp_|CHhCXUxgj*mpj4uinbDZEl;%l_^2z#ejqAXNlI|2^ zvBk_Qr;%vpJ{e!G9syrCFBXoeSG1S#s?E2NO^?lFhM@wLT6HZ5L*97xA~0={R2ER| z?>BXOKxn2Wn`M7747wNt{lfhp0v&Jh@82qfTaYZHeB-wo6nbz%$9lQnEQa6h&EhcZ z{dJ=w&UKr0Oox^Z0rf<9apd=C1j`;t_f*5^Ppl&zv>fNjS&om{<+;N$f%l>J8LGa= z;t4ZGB#yIelFfjK>X0dg;Guy#$D{zt(+`Z_TgM;;3MW)Pc1<;S z0~XkLFw9fZ>s;T`do}ivYhWC-W&>qRhI%qNt}rNtiE2F|j(tNi2$j%$>T};>)mM1a zYb+ngmj|_%`xA*EjE)|atBc0HS<;&;OEUjOG>MtEt)hCdDNM3tL$DzLlo|m6bY}YE z{1hIJv=*kgdz=&=nKa+d{kz!=^xc9bqq{K`ucVmP8<{3O4iSF`JSb`Ba4kF{^~jR` zMr`vClXr(F0EPUbkReu)52s^YDDoN6w`juDIQo;sn!2i+Y7wi`+L9Xif>IjBpz z=>RB{K~ZI5LwZy#lP(Mpd=uP~i6J;PhQIy)?eDQzL;LZ^B^xl*824%nJ2qzwiXM364f8f)lMk;`|q`=7MV0KeYNzVW$s(zW0fy$=4RYG@i`{ zG6VZfg3(E%P&K8inDh|C9s5|-!y4d+O&8WW4=gTS^!Or|VojP0jrh8&2!?E=_O8N5 zjPUh>&Q|w1;Wxg`n@)Eic~E7p)jmlx_{{ohGmNJi1~I!;N_sQZ$YqZ7Izyb$hf zj|Cx;s5#rU$5R3C#^Vdj5ns;(+e!m%JoMivmj?mv8@=9%TAc3BS=q`?y&mJM2zGC^U1sr= zn?~ag#60RVn&CuLV*lasd{sV|;DRPUb5I!>aa=|Y`UOiM;MRcW+ zF3pxM?m@*m;ud$DaQh>aMv{b}o?Pp^E02~@5R2g$CLs&og_fX3?e*^|sTb2bnL6al zsHNL}MH2v>C-%2s;F~rfVTkoBA9zk(iT^LrWBEIJJAbr9K0y>*Xgegcl4e4Sbtqu@ zhJ4|N?^kY2z3ZTB3?}nVK`V0LM^78%%K=1_Cdv%@3|HN;2Dz@oX9z*vKaF?+OArfv z$ZG>;bd@qEt_ggtM|u6}EMITv$qvktxtmKpV^+Y|bUUWYY3u2-)!CZs@v+>Rt0%C_ zqzEQy<={QtuBRWUD@PFUU=9C`Q^wO0;tpB=*3OkBl@B=0f!M zmK6a1VPxKuV!#Vx?x#HcJMT$M;;(Q`h(1E@&@E3I?2H(C7XqOdW=kKQ6K_|D*#m+8 z!%e@!t)R&>boda_UJ(FcrmuDn@)a@V6GP4~RLMVXk7&2{*76nV8+e=_vm6X^EN&W| zmeOZ}Z8X_$f*pyCx;L;ov`-Pvh|!6G+XP4&Vnk<>YP#!t+Q-~a4qwyTRc*0Qzf4x@ zlI{A{ghSse+BMvFe^Li!61LR2d;0`b)YiD1^xOyA0Zj(4>p&*i6L-1{;P_HbzR8+W zl?Z=X@~hkQQeQxB9;)%BVwvg?)K0sJCfyXQy03K#-`Op2?qlzVg@&QUr))EBjt3Ys zxLgK=oGtA)hb5yXO zH0A2ihq|a$WWDw@Pc~ckAHB_Km?WvC0y&sIY&-jXGkBdtd6Y}sr0dp{f2){eJ<#NB z+@Z=+U@0hme0!JuT!(4O+?@v%#uH$gtC0pxSGR<@+KY+Be_S8Zj9msK4<0c~qm}=2 z2Ha*=q7E+-pi=JD%xA~ubnG?=(R zkKjlMsXV(Ev1lGs^|9itetKVGTfw^3&o0-A;l?NA?!`a$S-2BxAEgEGhp%3BG}E-}ineiZ@o zdrp@Nv}yF}NF*z10%@WA|Gy36j2__ z1mc;zZFTnr(uvXU4*-|SgavPoW>&Ehl2es3|ooOu=`~HRmqUp zA<-d+$#GBQKIgC7?yDVr`>C{POZgo?p+IX+I5}|cEKsksFMtdGKcpI36y1ahFXOCT zF@DDZnTvomphXd-UY_D!k2Oo9N&MNu?L@}>{;17{EK92!9>(laW4<(|idR19w4N9UHI%|iYNS2B?o z<2=R61(rI10lGNOlro|bO~3ZzaASN|(;l5~^H|Q>o#I%|8c``c5DG4oqGoWLc2yWl z`ba4O^3z%#eRt%JyEm{b_mZe^_}00O#TLsRBGPkKLlrE?;#zrRf>A;97pM*Kt!)Ekf+}d+AkPNHtlatVo(_WW@m@Pok_?A>J`l z?>Ag>K-|%h<#RvsEi~pL+bvZm^7Q0X2iiw=*i=>s&%wv8-RBsE3=LD%ytm zO|ePI9efo?yUAz<=Lv%z%oj2S6ae}IyMexY{>JTfV%jwPeae?V%uk4_+%a9VSFxf7?Rn{qqt!E2L<6{X8^yTx9Jmi9@UUBt* z!k@|goUVxL_~OBQsnSevN67u&U>KbbTcIsW;w&W&*>QiBCwhqGEQ;Fu^2StqVjr7~ zyOZj0T$Sx?wVBYbO+^7?J$1%@DRdvCl5HGlNG*Uyfk-TQL6ogB?=xj;i@dTdSWuRU z0LE6OVU|J&SK>tLmlCIauq-(^IwH*G^$-A*L>m0 zAl!ZNOky)F_9>C6CMXWI&%cPW5@@|-ihnT%XC|k4@O>pAX+SkpQ^yA#m}oR(!YZyv zkdEiMk8P18o7)(%=h(tc|64{*HT9#6TjY*g^icc5wp6^nYg0s0IS19KOS?Or^w1<% z^T*_J1Jh!sCVBuMD9WEswvE(g15(4OM=~ns#9W{PLV_9K@cf(9Cd}`31DbD*DK~wJ z`XPWD)@88U8S^TL^+g>c2!7YdS*Q%Xw4c|Rw_xWxoHe9QA}fSiH~fCqj{CnXaH>ex zJr`#}eX8jZ_cjoUN^mE0LKwf-PCb2unJBqk4rdx)3PN%~_&zJ=!C;kAuo@06T5~)- zFL}Ca9E<5S%P^`B!Sa+we9#`xbec2hm&hkUN|LeTE27^5R{caQE&%19mC^8s^w=|S zo%3sCHA6)iKnYr!887sQ+ko-Qjo5ag*|j6$4IQ^MbChRGJZNF>hGX!Il2wr_;U}K8 zpm3PwKngf>nU zMAsT<=FV>o*Kp#S&ww7}CBKm(u6GQ`-7V@4<^XiZ!aOjNj!5nMyvlEa08qJrLW2rm z;ZuS1{#v6L0-`mmwDM@(qJK`&Eh4Xg{Pkkm^bS}lQF_WN=V;53pnKFTqslh|;<(~q z@OzwdmY+C4d$fOc%smQN2ODNA|DTHdTjDe8XCQjZybh-x&?%2a=D`&^6uxC%zlxp4 zl{54mS#O6$hLr}M+RqjZsTg33DmVz{x`!2v#Sp{q1#)df?_`2-|4-qw^Ur6e6Fd9$ z`ajvjnduqI!OcD6Z+9t~~cAE{8Kmqq!3a zLaFipBtMNu0sq@B;sJki#r@yWshRpc?{5g;7e4rwE9{o5$z1lBrwPPdH}sqzUBPdr zf)AGP>kX8xI0?6ZgasdW;n!5e9RQ-aFLLphB$Y4XwPSYimj%=U9rJ9)%2?60`p-7syZR^ge><-f=s(|xg8vhZ{Kq`om6HGHC4Lr$BWp<} zdt*eM9YpO%C3XfIKEJ~JcREJo3=sK`b1+_s<;PKy6Ta9H@C&OLcEcgIVn_aN8?v=3 zm*Fy4FMX;W*1Iv+LG)?i=_<(HjbzJ@;B(SP7Vdc^mPh+A&S*oohyZ6s{@sFb zLP1;2&^p|ppBPiWj1$G zs{k`Z*Q6qrKbIhBQ=v2>ETk}q3$V?heyqc)r0o=2I8FpTQoqJf`0DmAQrtN`pqKS2 zBh3vo+uV6dvJtGajO{8-JS_hTqJeo}ZwB?gXi||vs^D$@k~EY7R@Z^&&HXg1V1775M1St&#;P8GmJ z=AhWllyTx#pnrn@l>~CCV+`c=sDlHTn#LM8YiUdlI z>eUb0(G5^!%NtSgPgIh1Brh`%LI%J(Xy?aXy-9hvvRFs$>KN(t)^N>~NtHDVy?Jko z0lk?YEo+qg9p310NCQ_x=vM;nWKtH^pLIM8J9D&$r?fHVfMeqjjttD&S#+ z0nSST`)KlJ9dcsKS202wojI_-ttn1i{VSGzTQVfG8k7SMd>vZ0s2eqbfEgQ0=A+L3 zGRPTr$T1^}Tp{_H4az%?M5GGGC7z3lePt$RVkA>(;n@r$X4Qj_RI=u8m}wf!0;+(; zf!Sng$*T0l?pU67Cp+Rt4>AA)N43xGu-BJoIuzD!jQc>6B|8q-j#LU)%v8?_os+=_ zBE%?Jer%23&o(s8Lq0$}{Z&Nd??X|>x4U+=yAC=t2Ql{6z$4;XfNnM&YlqTHM<7(V z^>6~c3%TyM3Ch$^(d26>7`ZA`n3bxn2z5LPe(OT?nZ;^ooUZe?9USll+gM z(2(YzqlfVK*5ys=<0;Xz*7um?8`Jo|*01E+Nv)m|shv8hp(bY)Upl0*cCi3KkyRwN za{3K?)iGU*-=gR>NPW&}eZL@}EA#)_v>j^-8iTopHBnS{6 zKEk5643MYtp5YM!hD@9(80(WwaKBtOs+p0OcYQXo)yb*X<`MLdL+T_mAfM*(wW%=w zNM%50&-=p2!S6v>qh^s1z+lTo?Lk@7Y|;=wbQYO->FPo;$xQ6opP{@;^J09H6Ho@I zleQHn1I^0S(@2tG<%(SL#Vb&L70c%9=rXv;E&<0>tDR~9>Qwq91SI-YOYp67h(M%r z882B~x-R-^?Ck_jm|SToSVQSd{KUme94c>owIaabx5|!ix5#ba3nj+7^HXI1Aoq`cBYg8R zu{+XKeBac7?EP0&UIq0cqHvyhT$4X;DclOYdivzqWLR?8;bF4ak#u*hvK?s&eRRs0 zzOahP&r%Ila7rSf>|z4)mevH!;mcKAVAK8M*=?tus0BEue^S=0&^g9MdW2lDAH*^7H2_G=+9y}(b`wp@3 zT+;DIe0^v-HZC5p=qooE&#c7}ANLe=x|b%XD-M)IL}1PGv3f)PwtFyTAvjN(9a#16 zKBIpD4#JZ?sOf78%wipwET5d*${pxP3D+U4XAasF5=$F?c8OB3K{YTB3E2s#e~RA8 z7_{-N$B3I@&EiAaRNLr#CzX+E2?GV9_(DF<3ra->@)f+HmWP=y&#&r0j!-47Jz$a? zAWt^8v^8na-uD6sfQR_Tvh>v6WL*{73iNRR){l^GR2UD5zYW(w#TjvyE8=5v6WF`5 z`~((jxN&Ya6(en80f?w#sy*T}}cVZ z^zn=!R7uw2t7f1tM(VIuDkwe%_J1C2&Oo5%X>R=}IR*nCg~@sGi#F~A)^+`PWHQG9 zPUlbYaDVIK@`dxg=;WKvR6cG{;9P?JSUiQmy5+k&^S zF>ft<^x!inA|#odI~@CagYpkpO*%Y(AbkG)x{uINSXMvd$x1tMR{bwPtT=a%ybFP2 zo^F=78>)Ifvrgw75}%M|qYiT`v@{H6ON&HEbO} zP$CgpXk0C#;vhQb9`VYfH^iie{@76bugeYxUb8=a_;9(8CbVoNvSZU|%9iFn(y?DZ z(Md20D)_4qjIohSx>o|nKalwo14}lSMD-uxd67_`&sp3o{TFQ4d~Om~Dh`S?z>bk; zRa~!a2j?Xte=Y@?7D^=)Z!y}d{Ht~~y*GdOj)Fen8+4)=K#Ka&YENui^{1*Hsv%UN z2|Ps`Tqnngcxd$SO?bMGb#jhj4CqEVCa=D9qf*lq&mY=pP2)z`YpJdoZ6vEJ`m&T{!<{(| z2#TDD4v#dGt*_HGkeB6?M`=)#-FeWm#K{oP+XRDLq&GqF)JF|ftcKDIRiM(+MlI#3 z7u0K4zj8jXDi`tg{M;NsR@Z}oRe2JNw_3B;_J@V_#B%KurY!cQUtrW?KH$LqZw5l! z_b78Lm}WN22@c^DO$HzFWZXV-V*)oe={J4g*fcl_04cbAdZ=!+9Rtak z&};xR6OOT(L&GVERwX*6879d%qbb&&e&?pm6Lcko4(zTQ5jS{v*)hVaR1SxmKQfiJBKd^4?a!Tz8a8s1N8 zJduv;Q@fB@+`xMe34xe_-aF|EJZP`&s)LEJk`M9x5%dngIuXWR@*g(*cxcxWN4qnM zrPYeNs7D@_Ay@!-=uobc>o(h=VqG*vDjR?CW<8;}arVJZH#@bs5@dz-YH@S*T}{V0 z`=g<7eDRG!3=2zf8!4Xz7=p7GU*=Yd=w!<$#f1=}M&-I*_Q(c^h%UB8iS zNddsb@@6VxrPHKYb6*i2+kY@Nsm6)yw>MG-I^(mc(ZQBaOqL<$X<4(a3x}u5 z{k*b>DG9^=j2v#Xtb& z-Q5&7e8iy%2&s95a>|Bi-qrj|Q!+MyY+@$N;(uKx=+a>3CEj8* zgl<6K=AqKUDa$`kxl(591ccRl7*PKXNQ)2IqD@<%nqoZ)*1V1`u|s9N_OeVPumemo z*Em}UVqQ&pvUdJ1euh6OQF5|iwy+S?I17>vBbebdhEq&aq8_V0G9T|^n37DhVkN-1 z3P|Eiuq?OXrv4flM04!7AFf_CvK!7G#@e*Clb~_FWIa&fH@h5g9Y%izdJ%@jVBc0d zqX^+J?O7g}e_G(1Y_4AxzY>YWL*&qO=FKTr<^|(UD0+d6c1i9 z*}Ot{l5V(|c5gCM@5zq!8SJJP8m1(4|FnzS+W%MC%%)|VJ!Nu*@t}Ey@0!iIs9zhy z<+x&zp4lXEjCJ*^QM_}lOADaqxLvwsd_6xtwG|lBC^<^v_ipEh56cgQp6?)<8(a5B zb|khATb*G#eEMh!XCvBwo`?aMNq%!cuzP+G@g?;tyBPm6^ky=@iw=wki<4*<6#1_k z#`6^2IwErZfvk&D7i0QJeAhGk77$@G;%T7IX0>VV&iy(tR!HNGxLSac$`R8S^O+!2@f_yp8fg zD;g!jp>uW3Kvr4F;2OZh80Dwoyf&tQv+t5!?blT80xCdY`KpOw9n4Au#q~mJH&4z* zBq8QX1UEUNVkY?K`q)3qLNJ7FvedccON2sJXU^uLgksOiqSo~rPsY*2vMOPy=zadN|-K&eI% zT)SIFPBUyg+DU~IxIeLobf{pqG%t*vTK6~oHBxj3WlWG;_hrZ{4B+R z*-~ZJG}qZF{Uw0kFC_veXD*LfM?zYbbp1e5mP$-K#)*VrCKX2X4oavA7jmpI7u=fU zqXjSA+WK<1T6md&K$*x`Z%Ivx?f!`z-OWJy<%7*j< zLp0~V80+JWwpCx~s4_pAW~M@ykT+1yG$NDAH&oimxO%|KCxlXF?t%FOUYCXcAF<=q z*U?Y7os6)%s5g#-l2!pf0Tl@%ZkPW7UO=J09-E|i(k$06CaRf6;-}X(n#9jbh(Zi( zCBad&8K@vV`cirIBh_Z&Th(Ua5OS%PInsA3&7W1D>(LbBiXL?a{W5)?H1z(Z&li4I zm6VCglgb1-sSRr@e>czG#m=viXTVI~3%7hCwmj{((geO-ze4FJ-RN1NpUe~Xtv>kJQ!J$LL9_b+3~eh-?)uIc zF=j!4z7=+hxJJ`m7$FPMo5s-_r^#|8CeiX)$%tzH3dj5%e=+k9WSM`WzQs{!8R%)5 z=uPF>mW9Dq0K+XCBP|z`tq{($!no9mV6GMS!@ugIo_-}UUXwJH7E+@ya2~N@G5rNA zo99Dro^Lmpr!SCp0|&Fc4P+wj#`?l4o3Kn@lyt?SWyG`FPd|2$*B&-&XzngHTR=qk zFtQ6oSyaX@e-u-+f?c$@j9r{C^UK&JqM?jknlO{$UuA5L?~`U$Y_pwti*DAkC#?N$2XDr)hP|2=qa{XYaxe=`D4a{^B;fhUi^Q$XNpLEvdg z;AutRIg!BAn!wYBz|)Sv)1JUn`2P?*OZ8-+|2K4xn3cVc_VUsNgiPt|m7A|F5^ok4 z1EQErGcX`M!3Z3IgiTAs+|-B5YzI~m9IF#zR%c{eU65mSMN_LAT39Eeoz)#hR!^K_ z^-2pof9vgkXm9;$^`X7>Wh(HjxBO%=g}dn2NO>fN_WHHb4J;ci_3P+96HQTHzn-pI zw3a9I<#aWGcEl@hsOq7w->BcD!0^6|?*Munn@W5bNV~-(0);6q288c{2*r^xb`|Wh zsvtO(aDN)%{&d3q8HD>jg!{h8v(7?ms~_=|fBxuh4e;&yGz1?6J$w-KP#~~TBtKl> zx~=?hf$J9X!v(JE$qzS?hiv)b7A-I_`Qd>|AHG6gsVsl{sn;luY5B8;_>0!DyyL_! zo9DMATy;Ggg>cpNGMWfiUC;8jN(I6O^wru;($pK!*NA;rS-aT_$Dk)v$QIR9$dpUO#B6-bPVVlrvkQGvv0B9`AklCun# z%yJTLB9sVMuz4w@N}Ihkg6MiA(e)^z>(NBlW6{ByAeV^x8z+A{`BO~*C?snyNl-a7 z8-&>~LNlb9WC~H5Aq^x`h*ctmTlL#~pI+`6RjW5PTj$B|yGo(t{|{17-rb4-LOub6 zD}BK_eZ7*Hm(!OEzwpAp?)u2 z=ajR>C2#~wtYCjj^Y>%f9`>)Hsf$;avSqv2HR8Gqn(idz*=sAn{<>MdCYeau{{?Nd+#2$qVkJY@?C6|Fv$tew$zo? zC1^qK_kXXcbSb0AN&B5}_U<603?o@+DqDi<@El$xAisZ#*JU{jf3YBeTa--*#6gxV z%O5bxFLJtA=M%@9K^$);alBc?@h(7P>q4}&E<$_jVw`MULQ>Qm^s(k*m^GiI zrzNX7xXxOPRn`)$x0d1_>tA@0e%7OzwUJiJ+tJaw1Kq4mBq?pd zX;ukIN_XNC>n_Z`kycZ=ix){5)JU>>!^Z>N8MJM>Z&PkoK&i;7!Rj<>#fNiw{pic@f2 zIu%yUfpdn?LvJl-w~4$JV#kkl5*)OYtt&^FAm$2`3r9k)lbIE4eUVc@;)3I48&N%# z94YtJ)S#!P2KN?-q$4%46w7It%ZVD7`?8kY%d(zEz@6jdY**i7f3UBk+gq; zgBW1Fgb~)u7;n8oJn~hd`PXoj^*WYXZ{S+%O)RIf*m_F>cP1@?XQG3CzZ8ZC;6!~V zEv*(tps8M_?I7wOkNPstjE&hO7MJV0XqFVAkDp^F&ACS+fyvqfQUVQNg;s~*4~fb?`oEwu z8umkaGLuSJvDaxnRc$1y>RWJZnko>4pl9l95n@F~f#(ZXpy)`3(3A`MN~0sIAQ`t& z;D>F5QHXI6K3T(MISvzKnXX`bhOqSoefgKP#C}BzcNlK{ z;471)a!N$&=#4s(APn?HrX&aW?TWolAWQ=DO^d zF;E0L@$sH0CB+y+3NW`z0mk&Ahe*-N--5V&K!|P??2Zy-QET%ph@`b{5)YFgQ?p1K z8rLMuy)ycRgc)I>^p+G2O)!56GiaouoI|6Vfy-p+!LYB`9JPKWk>xiMS$;rbMl zztDs}q(gw=q=1HA0UhTA3=9jHm=tg^EfB(tKmfA>HZBf0m_u!g0%2Soi1@~z4rr<3 z#AgvBPMUm{`OsbFFFVVmq9c^M1xcX-mnos5E~e>^YFnxpfA;B*`N4k@ri6H}znw}c zl~wAhmXvBOA%hAPR%D0~g74-k{tSUQG6NZ?7pOtN$V6VCCQb|_&@)iW|44eV|3SU{ z59+0h{5M?Ip3wKpwWyc;NL{uaAQ{R)Jv5P@YZ79-B!`vP(I@q%6j>#daz5klU4trp z{Cn$S;HXdFXh7gN0qp|~(K*lvJpzq!TA&H~1)AdAKr@U997Os9EZqVaUppV6PKqSSvsr$4U%)&*jDA7yJ#42Wu(G}dL|)}7^I3s3oRzU%>Cut}DqM1E8LKEL*vWPgn9A7hWDsS6 zupAoI_@o8K5Yde#q8o=sf$?Y&n1I5-L}E&li0CHctiXR1BDnJ~F))>w(zLWtpLC01 za$ZiCYdt5D>Z`w`zf1(z0$o)+$GP)|v9I!P5BoxDVNZ9momXPqT6-&B`)#4D3Qzl74#y9>BoBgK6*?&)WuRZ_3PeRMX!g z2nd_4=l&>cw!Kv7ZZ=Mm&@<5tE%bluZ>wMkkBq1f{k>!#1gWFN%J=Et2l|H!QewYU zI1hi`Aj!xB(_{}!Nm4RXKXQr!Nm{aV)}la|VGekCm>i#;%=F}UxiWzod$^9e`^n?F zJ7K42PjWo_G+6fO2-|0(w%rHK?6Yv9eKy+J{n6DPfWh`T7-bK}IC}`D+e5L~J{Q;7 zBYe@mE9&bXiR4L`PPId_M&In?;07NDH|T#KD|Pk;{S&FqTDV%$tq7D@=tcISHZGEM zD{wGb(ro}IVw9v?+ox99LO8IG!ojCRt)Jp}Qg-v;K=H_{G7Gnv{PkD1z z!1xjNucAOsF~XwZX=*5e&ctp))rm}!G_WXZt z_5#O#wNqHeYIs*(OkR0}9jst4iSR(tj#pCcFPF1dM0g;z9!k4gB-={3`w&|ZJh!KLY=57FEYRj@-zrL^Qfdj-he5Ko0=EfL-; zc%sf6Hk6Gae2rn_M2R!la<+zkuVKZaRCIeeEg7&!!?ef1wZ|dT9*-033219i#2NNv z46vtQxP2bc>@>``r(>0UKDOC2u-Bf6*X&vN+Mdl!`$Fc}7qh5+3F~CfWj%lF%h*tR zAscBgVq>VBYA?wcIV-&mHve;w4QOSx&9?_m>~Az zIejjPn=YG=i2fDTL>7=uzVU98Of1c0O$BJNP5NOuA56AR@obmftax@NTP}H*g%j99 z{cHUjnh$N+OfPKA=T7qd`nP}detEzCT{V3Cd;0f-{-avtNSKuibGv+r-TL`ndQ9PK z-%}VF^t^{**6kPxd{<_1+wjxXkf2GBYO?8 zmYb1BWm~)0SBN8|@qZq;|W7}JqRx!&JSbl$3V2*^h{pjYWhYeJ) z&PDbf_TEs&SRPB*RP18!7dd;_2SXE1Df=+qL$rJ(62=C1vyTNLsjpAGFkz~F>d^z$ zK9hN6Md)xS;T#~XCb%C<6Snle^|R5k&T{E-l~=B6carTP@ldKgm~0O#7qm{aG!#X= z@h03vm?c7qh&O-a=pOd@&_tAmEPj7c6w6P!oy297m6{et2A|%{cgdHfH zp9m-KRP-D7a`VN##Ko=IB6f{1d9v$7sfbqYz1R;UU_XkOy^o0YG33~f6Qh0>t?d`k z&pt@P#mmH~U&TcGH6q;CG1ops!o?d{Z@-BhZ;sgWS>rDoYt(cMu;nDcz9r&g*b?PuQIlP%%riM`t`ehKvk6s_ zG|MNA(9ubnjW8A%5kuuPVf&SJ<44Ia`xbZx&lG=?H2j&KJoRMBoJb zT4e&D>Nhg*yicy!z~0He6+!(0k^ z%|E94|EW^{KUdTLkJa`6i+Am(qx%0fVWvc5x#MI1K`i%A5;6Xwb?gY5IV5;G9K9V4 z=Qw{lhC2o>bu8TI*eG!v>~w;7&~b6d3FA8_mAUjBbdj;$0qpc^1Ye)k{^*OyKWdYV z47o6WEt#%HnEOmca%AJ*lGPd{7(c76H)_ybC*m;~(QTy(#?)eDRx%<8?ABDP;U;CE zd*xWzO(C~}{U$w-*ze`+kF}m~{3lh5(OrMSyp;V_&i+%*jtI;f4{;3DN;xC`TFUu= za;_yzYSgKb{Vp2WpVVm3!pB9Y-10l+f%HzfeSDpAOEw15I!$3u8ps@ikdq15$wIc1 zjiyd5ba85t8E#@^(;U3ruMy0AjJ<#2 zW9${eSVCg#c^_j>`WSmqVXP^(5yrCBY!tg;-WzKBZxA)_t~%-av}%UtfEjg-dTNFi zD*MC~CN`CFO1V?j_FvWTUyM2hrC2T88TA5EObR3)H;T+GeOu~xts+ubGK;MAI|2!7 zuf0uXeeZ&9L`=PC=>5cQ1hoiI55|8ejHTZLsW#9z!pIFIry01Di;$Ct#!f!+odUFT zPDDqiH6fxcdQtr}s`sIKe}{T=T46A?4WqVE)Hca!@7vY7tD{*=((#jrw2W6ZLC#Zr z)J#bxK%h2HzUG*8^e%x>-)NxhY9b+m5IPfS0%ER`3JZ8SPdluabajd>vC$DoZ!>>{%DgwB@8mLxq%e5!a0QRiTSU}|PRs0F*h(MoQcYNT z?#DxTgnsX!TFTHk8+8cCC&PBS)8y?%llK&2yS>rDISrki({Yw_28KF)G155;6P$iH z&p8_xIs-7rIR{IefmrSg#wuqh);lAy$r**aoH4l98H*jx2;5I?71V$B5VbwwjKg!z zc)aOM^e6tkil!{=Q#CQs-u99Ec2awzn$q6zw$V@?p7M;CDY;f7!CX284Fg zqpU2)UU?K9(2WU|H%U*pWxQ5G_wKW6u%6=JAX6n4V&95;Ys-6cs<}yKQsQ;QO*!(W zy2+a?RwCCGKdBP0EAFbNa{lPzQZh{tuP-h&P$_ccC7D@>pCEtQ8>Y9*^g+ClXm6a} zF46~;@g}0ZscdhUa8>RgU1SL2%}SED&aL3h>9@EwS0xE@RgxeQKzN==5+rW)k_3t0 zCkR3O=p;emL|8?|QCInCqw$gi@dDA_BJG3yoIt!~k|K(cnQ42^S*5&{{JIl87_L1U z8$XN3TBl=U?a_bOXd`ZFn~sgO)nKDtiu!WI2(rBqw3nHul+BD6ikmtpc*@f~NI?;7 zE3}`w3q5RX@^9^!BQ=-go}3(WZp$xlSzNLLa8KN$xF#3T%lAFuH>a; z60T4x30Lw`S`scA*-3I_HGFbcqmGDcUFEfU-nDgzXF2)8gK%Z)es$PBC%A);;4<~rTlUEF%)kk_@hI`r^+JMu^gwB#>;c&YbBOITCF4htsXP0Lj& z>z%=S9-V*sN+mq;`Bf^S(&sZl5e?t55=RkDyq91pKI5P!qEW#nWa;sg29++Ikeax` z`YqyTWUp9lEgs;RJR6Nn+srVtsLX#hPcR$P`jbs9xwPiwo9)ex)ZWSL zWu8i9F16$)MQC0ZOKBCJN~`d6#GUhz>CB*&cs5CJ7oe|mAxUc&VTf}Ht-6tj zoVnQS%*Wl%<)jE*frp(d@szUwFFOlqg?&s^yU|(AZgtkMyPRUS(^<rSa?ri60Ii>tu=YD>kQ^w~y<$S4A!8ba) z`BvuvzTbI}A9Nn#UpagEpUxv%%-N^aaUOrunmCVZot^#Kna%<2I_EiUz4N@b)psc3#rnabDKGc3#zfb6(SJ=a62*c|&jNysfu(-qCwF@9BM=_x1Cf5A`dZ zkMyO^$NKfoC;AHKQ+>7bxxT^qLchoPQZIGB(kq;=^~aoV^!?5c`a$PM{R8J0{R@BR zSN$jFH^Xp#H$u*zMib{R<3#5_M#mtGou6?%a|Pu7;}S;u{ans zt_y~Yn}cCvLojOG6O0-62Q!R^gEfq2f?39E!J5W9!G!U7u$J+CFvn!Ux~3gG!3+l* zni;{yW_GZtnG5EN=j-}Q<9q5FDa=}O{mu-shPc%q!xcSPm&6> zflRZL(OmAsXPX_2+)9bi0D zcoLchyCN@mvTvP_(kBZ*iH!L*{bXAOzBpXq>%j#^OR>3ENyBMnoal$Mcpi2$jx*WT z|2|t&UVa5Xy-K>K;3@Q>z3C(S;KX2GbO`oCzhHk14GzGl;5ir{9Fl+Lr}s&nW-Ip z>BJSBM4vDP^@8W2NpOEE4SyP12hT^(;Ec4Wt8^!>B!Tr(UTIV_+9_w~UPgQ6oz%-H zG&)ES^fEdcq@W9TF8Se>@6HuK0kY+X+iAP{;>k|_lbx$EzH}kroOHZN4}%x}Q*soe zYt^KOMmL{cURKe81OID!so;H*WYbsrcT&q)GTmXaZtj&SfxCY~oE&}{&cJE@&}GWu z;H89`IYeD^iMlQ$>Y7LBxdLs2SE6fhVH%YU^gnB$Pi2KZm9_S%EdMAf2yc&&z%g`ct4LSy| zB?fR^ny1om|LcE-`$!vZ^e}qLq{JtwiQfV(uZyGJ5%5_wOsWtr7nf zO84-7!hwdLEj}|rB4huAp;91~@c{*ChcXmYb0$OZM*7g3=tEZ!DpwLJR}m^#6USRa zsJt0x1dA~^xE8~Mw^X0#-bZU!AFV|`TH7igwhm})oMM0UuJYlhCO=%BC?>2YbN4{`Cvj=;sWgY8IX+FRf=Gx)i3tIU+=TNi&>d-yOS_Thq{rJ^`Ob{j}UlO~=KqJ2zq?~J6`GCo#Zm4~;*WV~YgNM>YlR&3=u)Dt_@o#;anVR6oC zSe$>Ty0R#ERpdy?k#|H#<2*Z5B9OMFjag-Uytp_)>i(TXb)u}c64gnv+Bh}5NFuOP z0&b<}z~zmObs)AGl=+zE%5OX-rjXWvp5@ajSccpeE#=b*ej5t9eM(cw-hPi)? z&(4ack;_s2wN3#wE`Tb}qx){Z#A1yka4(QQ1aL3RveSAy3R$hIpoj+P_ZCY>RZO8u z`T@<<`U(c64bnWF#7nb&9?m7!^${`Yk7*hE1dW29A~*OMS_Z!$X8k3t?T2w{@M~h) z-(Xw|w`Rq%fZ*3wG2-etJk~<|Y>ISgiwegbc;7vD# zkKHi7cVqa=jWff|WD&O}tLJ937H)#Iqk1Q|4m-uoVME;d>=yR~w%KjS?sgloC*8*E z1-A)%#cj&oaGSAj-CXvoTfif33tq=<$D6wCd0V$5AMF#-Z*x!L zC2luf>YmIWa=Y^<-JbkK_YD53dnW(L?Zdxx`)am(mKJsUX_@ZXTDChtJHb6iYwZry zPId=rr&7JIJ4_qk4%Y@zIochmjdw?Di`_BW_3l{hR(G6M;*QtK-HF<(?j-GFcd~Za zoud8jPStgHhThPfskd=w>79Sv+4`yOg?fMY5()J`k-*)`G7-Z|$r}4s)iU@Es3|w} zGgyRomG+I8_A%?xY#&{1c8`#D<(@pAg;GjS7T!NNG?2jQjiw4Nyb1SYU+hb z)NG`mm^}YN&r>129q5{{TbSsoXBmTJ{Q9YS$QW!4A(3UE4r3_2&BlLF?N8%ex*EhP z?Gd>Xi6yV^(eC0hkw>1Pa&Ueww)642mx(huqowosPP|dZhZL0Zi{;!3QSB17 zZdktmINkMS1&nmhdMSSiyO$x;orfHEKAO6hqlJ3~+PDjFy1Nhq+(j7SUWHliVk~l( zrU`sYe1TwzuL3L~yofAhIhZ0Luc0YMDG%}%7@|DLPe*5!WOD%8NFgv~MUqb%V=HX~ zJH|L;yn^FWB`?1v;g};f=Jq2jcH+F%rHV9|n|@-eJZpZzi}pj6+jC`;3{#cJqUT5;ka31t#FgxouI=84`tD6=?XExRnJd4 zC-M36>g94X?g~F-*YZMkE$Me_V+v-`IA-AjS*B???iPR8?wzRP-i3zl-Du|CgF<&J zy1Mrgq2Gro?hc&qmJ-45z-8|JKCB8AJ2Od}IYs4#5}BWpu$m`B{$w^N$;8AME;#x) zA!D*JRUO3Bi(r+Yq5bw>%g0xG^6?(NfEd8SA}g;bz=~|Gy`!}c+J&xN7%s(Hl7o|S zF<&H5L5qLtvE<^UEg&Wk6VHsV#f(HCZwm>?u}T7RO0&Wk@-l%=}PQe9`MuCt`wI@PuKy#)cft0+r+=rZ}C3HjU>B3o}LcEZxj_%)e9 z0aLo`+LY|$L1ri^6Z|?kn7%6ILuMKs=$HTQaWrj~4vZnF25{53(WLI#__U*NCPBzT>_ zAxccfZ~Sv&B#gf=O8z1ITsvpr!i|I=GMEWOpBW zx{sl^`#7y$PoR%`fL5^QF~mKH$?hw-+I}t zm)*m7GX#7eV)!jIov~1a1wwJwAe6xhLN!>sP!<~&%4QQnwb)gmI_&CD4!a>#pOt@y z3fRM;7VNQ5XZB903;QV4ojakPJSTJtuOB*%=Y>w^twU$>E}=erV5lD-6*`+w4)y2L zLIe5g&>((WXawIF8p$_@M)A8sqj`B~0)I3#i9Z>d%wGtd$6pCe<*!ruerP)XBy>Li zoXQ_UGx^V<*^)thhMKr1DQ~d?RjYr&ZooOlG?HSn*j4NdV>&UdOx(cFmh3Ce0_+Xr ze7c&!Ca`(>*Tkx7U^4e2En|W)C0BT=sTH1TlZ+Wc^5SnLB`^MJQu5+27&AS|i$AI) zuakL&G0T`utga_7GcJ%xTzd0T<3j0Nd^*3+xQNE$pby__Tuikf`tiG@jOc%20N-L< zLbWi4@Quc$G}1JAOT59DQ#oCWG1s_EnKsImsi}GN-dqusu&@1+MPM z_gvwxi;2ne6!Hqn*_j1Zc1S{(zzAK6XlM@Np}D9Xnuivl`REwB99=?JpnK@bG~-WC zUrOp}%u|v1Jyot&16_^z(ky>g8_kW&kJ@aw!npGI3^k#}|71`1qLwT5zTmifU-m!f zeW9`FID21yjNZTX_X4gGc`z&WzWBJuzVd%C_9g!L8~x}x@nkstsEx@fdT@lfEp#*N zQ2H@WVgEg0|L7v`WS+|JS!yH``fXFkLAIm!@Eg;QaSAd2)W>{rG8uo)ujUj;;Z~Q4 zeCnVM8p|@D#O-`kvg?O#qhYQ`I8;JpdnYnOTTv%;HyVew`W~8LQmFFOwozJikxEHw zBme00myD}@3+1&(9ad7EJX7_s5`I&aG;N_BG`9OuH?$KCLuF_h+J%;(iZn0Mv;#|g zOY`3ySi+5E#x-h;BD{Z9Y#ntWIIkd~DDBuyA&9Q5;HxT~mNiIv0}D83>Dy9=VsW`o z)>h8)_OeU|^j-u)k0KP>hgj$_0`lW%6gq%{&{IBNsNmpsEMRJyE zj@=}2`&uNAuk|(|uiwL0lPI{RNU!gyK_Ux!QUoW(a6}~-UvDf|!2lB#j8|uHRPdYs-+{Q4 zvm}&B)hXx2qKPMAEq)&Z)^#ulS3@MlT_DS=ag8j~(iDZhBbxl4)~p|p5&Dg2@(-F+ zf1-WpFLVn12d9UQpnn(`6gDw3tYKDI#{#M^30t_D$`yZM+lTe(X|P`H!+Nz3>(vU@ z0fN79=hta`a}})HW3+;GD*ceStM<{EqKq3zvAoeprqDW7@p&hgSjO7?3VutKWCr0- z8V7c?+lVnh*4Ak&<+z-q4%~2z6~;>CopPq~PB|gBl;64;*;L%N88Ir>N#7K{K6SWB z<@d(YJW+p6Fjg6>#k-6(#?7kdo~mb0t%&DV@C|8fF~$7kS`yAgW;iRY$1KUtgl|hR zsmmTL?pLctk7^lhektF$MI7FGhdjJ>Lf>4HVvcnXcopA?aDrZ63r)hc(IQ+2?ZP=I z3fE2B{!Gtv+9sLjRJ%~SNS+OyW86X@7W=-L%IJU7j+VfqGE^A1`YEfECw2As+bl6v zw?9P|6On0%-yZKFvzQp#Ry~CmxltcJfj*@n>V_MkVYo4xhnt`v+!S5I&2e%#FHJ&A z`y?fE)J0=|IjQe&T-K__9ppA+o#Mo~Dj;l0wIAX&HmJare|tPuS~9;q{0_Oby-93) zC3Ao9mGRAqK!Y;AMP$d}B{Dk>ztcY?D^SfLSu%S;xFx}&6>`IE&^Fu_ox<(VJ=`9> z!-X{KJ783}BPN84Fg4r>v%{TnMYszVhfg|&tuHB;Es=*taalWEW)5wO{wm#GC!C?u z?R6&!_zP)y?T@y`dSgSC&E1X0?FxcVD$9S~p}!@Cqs<{&d$Y<0V4915wHtumVa0x& zvF8?=2<#P69-gh?uDnX;z2=G~Zx_FN55GquWvfIAsrB1rP9lCUsn})wKJi1QBIVot z^wNQ}^wON5A+lPDY*w>m>EUQBvI$512uEiVz4k|=@BqTqIcOOkh}PjjgsUMK9Ugy* zN#S9b79NfnRL%*Hz~$kQSQZ|Io5EwTHar%a!{e|uJRbLlCt!DYA|4M0UAJYMRVW<^MPKpa?|isz-fL}a?@ufL{Re+{t@m5ph* zkOp%hE|z6lcwKlq?C=g`hwn${@J{pym*LbfJsaMIvEd3#3GXJ1?xFSeL0o@G<>ldr z{8={yG5vlS6x##MCA7tgyTAv~0v|vNRHipk`$Wz}8<)zI%pzOMlqw;v@|ylfI!jh7 z?p*}pyR|zMYraSASahVBcXl!xV}DP^NhVZB!3 zlx3PrXZTS9&0_?b$B`3$0!@Fz2hx~wdMf5*f~b!Exp*D56*3!wO&UN+6$>jf?$MSj zmU2DaBLepK9h)gck=>=t2 zkZ_1IV4-kTFDyd`Q5KbXBDv{J{xFGyGE(;&RqVO9e z!o7(b!f#L)L`jp+ySwY{`E%0wn%Vl>};2@57C4+ASoCrDN${<32T)Z?ZaP_{PZn)g}=v{;U6#{{3C{if5N!%&$QV7 zN;vwB#O&V*KYw6l_%FiEe^3%W;%7i6nD{uk(>Gb%={tGeX>8ZLa~tn8b`W-SSu2%C z{ZLIV%cg9*-{^lpIB~E}dK=lK60DKfaYzxmM)KDndSRS#3W*?YTJ{j}WLY{(SFEC( zFu3b@eUl=ikJ~q?!Z*FFP}YP_$Ke>4Iumhb1?yA6I%n`l>2DPu^2m5(Mkb(cWFi_y zCZTC$a+*=0lRvCZz7&|_yRT&*eG00v+ju}_Fn>tpPr85N?_Ghb6Z8DM%W_{*5dPoh zUAAT5k)KV-@v;dydqpVHo%tdGV6Hem6nT_s|3o$x!5hg`0!L-Pwm_g;7$Q)cAnTv&y%djXi zAL}BQV{_yRY>ixrha(H{d}JZZiCo1RMwYNPk)?m^?8v{^z{u5XOk^3G61j#=i(JcQ zN3Lg=MwYY7BR6Qtb6D45v9ZTEoo3x;TrO9$AhzNX$xmH8j0tk*FvP|nU_9uZugb3Q zvs+w|AJY+m9H~`i5QcXuaHd>OcfhKII62c2ue=p}XCb4Ye5g9nropq6d zL8X7gHH=67IsLKnJf861Iav!t_=eO) zS>BQKVh-$wU3Hz8jv0~l$cSt}%g9D_jNFbhB6pyFWD^EOHe*C&3noNLa9-q2%#7UQ zi;WWyRO>Dc-v`Sq|8(J5#$!^z&%j9IaqUF{OGk82rxx``J>vcm&krUZLy!ie!UfkRt zc5{E&&5bAJuwCNH9yXcrR5FJ#-lRSS9gID;V{qgAa{g>7n$zEnh5(UJR%AcX`jZ$Jc^Xq9&k#R;7V9I=VN>LJltx}eMdT&o$uFlRm)+}wdan=ay%MZk z)*etY(_WR`ID+lQv(lfV1#VQzQaW3B&Ue=DqD&O4{>MDAC>ftnC=Tl5uN=!!Ur#$` zf$n?tIPR+o%GZc8Und@Vh}+Ay!5{O0)Z{@{zoNI3P&_?v$TCsQxuZ&9;R z#{W%)S;pU%3K@ULW5Sj6uPWzTL_Q_3enuSmbK=Nfpj+fi^oo3iev!j8>A$8){|!kJ z-{Snpcep6>J?2GzAd3AFS4V!r>d4P&+LoWSifTzJT_g1=L8WVq7nL{G8oAaRvL+-3 zQ`T0<(*ZhSq(nvl-7tSxas7ViZ5%XSs-$gk<7ML&KizvkY8IP3$Tm=rHPRp}+KSQM zOM3CHFAJv3Db?9hq#!1kL!Vrkj>8gE*{9Ii!`~a4>vi>h76E$~|KM-BlR~B6UDeg_ zH`I#!fd-L3iIo2$^8F9ai82h0a!iV9m=|?%TQr0_qESDAUx9y$D6vT{>@1}#2lMVZRdhecB0zd7Zl z4!^w`%C0tPF#k{z_(#(3lSueunLC(&lCu^!O0zyq2vfL|+k^rB>26%lAST0Z)MTVL zPZzaphDZ2k;^=?ko&0kVf%ru+&K5tuFuIk1xUG6g%6H{#uE;xxy47TSddFYv zR;tBr`?1zFrWP~)sSp7?IwP7?bk;=F6rBkUO?0M9$1!5ZMFvR^B}ZNpIqPed^6xVE z_j#2!Mv2yU^B*_{`?|!pRV@3}=@M2FHfb3_quYOBM|U6`Ek%v!{m72)MD1u98b!;| zBf5(Stb&-xZk!u^5Tl|GVQTbYTo8Q(^P`XA+UP#q6@3i%MIZMWN)ObKgd_I<3nbxK zn5xK1u!8MA#J4MQu~DK{%rI_OD`pMcs#eU}SY^CR{fUDBuQlG&-Xe0jR%s_GuV{JA zc)x#&VDf=)ELo$r(N3)5Wg!nPuUX1!W$+&*gni!zWiF|*{}(+#zr_mt# z44Oxu^X;+?e76O9mH(k98Xu|;ZRUSy!)gpBANi!UP=DsMjts^2EUeClSvQQ8a%?Udfd|%lXeGXjJL+*v;Z_1NDo4w;6P8 zZ^3T<3xi}v`$a}CkGl4wZeEhZNnRMqmp_v^X=mohuL(k|N=o5X12<%PtkG_TTqyNUN=)1Ti`W}j-?_+cHL);nt2-|<6 zAN#Uve|5OHNg~xeZJu_y+(DhG_(>*KX!j7oiS_7SANuzy6)Au%+LhV@mHW586w5>( z3!!^Y8Xr@ech{mS4ke!$pZZzWJd61o$Iyi&L1htel|!)auw8j8j#z@_g}DXl$V2oz z?m+9l!fj(wQ`|usral)~B<^7A!exJAYsrzh(`rOIYJSQ>MSp4u-FUMQBWW(sp zz{XUcd+4vv9s1KOMD#Nv_|FlEenABPC32!)5eGetR?%+=k>8?2^gDEqevi|lKM*p1 z#I)#7m=pb(M2%mtIQj=RMgOEF=r6n&{SRJ?F@MQv<~xf|Lx$uR4yn}nl3#z=*o2m< z?RuQ5+6d%6O5gAW!Z(c1q}FTWMgO?ir~Tt%A5X@)V59N5+KpQyd5DG6aD(v$EmEno z3*GkXcL^^!xf%_Emyb`3DdxI3V&V z2_t9fhTqi7qMjYnJH$jtm%o1>({4#(rdcpxsHN5nC1`T=!g-htky-CTS@M*LKSq-; zW};rqLX#MA{+Nx{F$e8pLG+4+FfJCxd9f&F#A29D<-AxN3t|~q8LNSfu}s_^tBKNB zHXe=D!r@qL{1B^?rU;~`I8EaHN8_*(L4P#9R_f}H#y4`ssE1dR20nj0pEU5{fHLs4 z!(L_J>xKKOG4OqBeCHe3gYx~Exq0F+p)5n>oN6s{ZSTSrRoqfy^-&|%AnjE9kOGj4%x8;J4`=h$FhVC#LD1*nbnU* z5NeuCb1c*LNYo_sG$Q(JjJmNVXcTLT+*mWTj5Q}3%|-WEK1Rn1Fe%m&(_*cNMq6S| z>_l81YmFOYZLliV7OP|Ju_acBidY9c6)VCEu`c*Nb`pM#bxnV>1^C|JR7;}#H{(Zn zXjEOirT9}L_}<`nLGh>7I3Q_K@TXl$vPl<&f6|myi?@*+4y@jB2KZOw!TmS8x($Ut z$9xgeLFMHlq$40hJJKkrg0)b5PUuENPOc~>i>%=y%XvuT{Z8%ph7;jLK=YEmdZS*h=^jcNFpco@&6Dp@FOy?I#Q;AifEa}60!Pa8c)Qs^fFDOHnU9A zsj$j4gNi_zW>R67X%-bunHEUIGJ|EBO@&*gIn)>`(}IbJ!hKBOK2mx2*_-+k2=^0d z%1@%HJ{f1mreHwqJe(Vwiczs?m=c?gnX&V6No;=x=Er8@s@N=C6Pt~jVi%w|b|E&z zE+V?PnCRjXqKixMU~CStfVsp1F4J6nb8w_j)OBndGqG)BW81cEXOfMb4L9CwY}>YN zZ@4ix`u6?p`_KDLO--GezJ1T_r@N}_slKPLDy&)0iPAgnd)epDO#__G4~YXUpUL1> zI+S=Wi{HpL`4~?R3xSD9hZ64$7z*|}=QV<4xOup7JLaZ^Fi6^yaTd!0_MSL;0nQxzt zbE^b=;4(>gTAVYXgDfx%cq{2trUYy3?ZCGiZ*&g!+KPc$B7>GFKIS%a6y_^rH5&XR zeCcPW#eUQynSrV#huRfc%!4~7P{pE=mcCQ6nkza6WxGRi&8|3-=sRA&gkuGoY4yc3 zN_yJUt`C2NDb`iYF*YNKnXM$^xiK=Luk5w2KD3g0lHVj`MQS<@Zq;G066rS1~Vj;Pd?l@3Jt6U2Jf71cqAkQWAgnw&RFtk*M+JzmIAex%Nh<8s<0g?L_=Fq}2b@TdOkOYasl2j3(--H{M(6 zBI>FC?ndoev6H(yJ}*3Pzl5DUkSb>IwLbHvLHpo&t>1Bf&YwXKBz2T?bEA9fUm#&^PCynO*CZaWkOHd_8(a{e zWX~KKRhfD}*1(d(nI4l92Yl9M3NrQkBm&`gN!4j4J17>5TM;&r&l{@8Y?V?;2YANW zjKR;xGO|Giw)^*iS;U+Ia&o4S<~dxZ5|iHEr#23d7RPGpeF*bnC!c*v3G<>s;Wswc z1j0SO$pt+YSobZllLfy;EmvbpgSVvfNSD9HZu+3lX z{o?Z`&nI+DNycB{W0ZDw4-(tHY=;H~+)*1#`rS|r5VZ<8SC$X}ZD4_Yqlzy76#_(~TYcX<6ec>IA!EzYlSGQw9RJV~r9L_9t#E z-eCNRd(eAEoJ<+Izv|p*fEWNqQ??^9It|ZN49wkW*n>_cRR=8%OgH@6Ezf+W6z4j5 z&oIjg>yjhfbx}7{-4_CICK(@OqX@>=R@Ydcot z(2sR0qsXqf&~MzJl4Wh<*5A8}p=lybH~f3US7hC;+&8IJgNH5odT)mJ@jFtnf&Ae^ zUWH{pPuF0RZ%>>XK+QT*ijRAi@%2JT+~=}e0}{dwxta`0VKx=Uv&bHYqb4C(F{#-}EBpc|qW_?TqebXz7d7o8az@?ABXCnYHcZ)J116^qAyOm{7Cl)BA} z#DY%rExwm-zR+s$Iqky&nhJ4T(!a?Gl>Vs}bXoi1Vgxfg08*H;v^CelV1p8lo44W~ z<$!{~3^tf8zZwyfTKxQ=L7v;Nh@M9i+$QAAs!&)g&8QgcFU=_7aa^3#$|_Z9_;E`` z7grIsRZdFmeXrBqo;+PpJ26TwK*QjOo;L}D0NydW{ zW%d$Bg6i{DH~gjc3P-kd8@<2YOYP;%?4>OHOcDIb7@(~9%Pzhg;n4A`uBDBWtybcv z=A1k+(D5&v47wSVZi*ktEDGg~SBLIwt9z2$Sfwq?XMwgDgG1M(vYgh}!T-FQw}d`o zr7EetcBp@lPNU3ao|@1-sp;g6kJK4C%`*Ny*<@alQhh;bN=6tlsLDVuasm9RMn6y6 z_5Bh2O@gwtQsRi${hg!T2`|-3&4-ED^1kFT=9zbxh7MQx70b3KiJ4`(U?(p>*d=oL z&iY5NjhCt1_cdL1c9E5xD3rf_ zzZ8697hpyN1FIxSuVY4{NoNTKpr#j}FcP)|*#LME|FiCN2N=Qshlm0JO8-1Ke+5MU zV|ot(6#ess5o)>_1r7%0519_mMnIn)bjpaBzJ11s+wvX>NCy9pPieJgtsDgmOo1w$ zlmnV3efEqIt7SbJ(2w#TL0$&H{$H>td4S4)sH+f=^^Z!g7!dW3{BfTqm~`h=091?2EZ`9K zKL;$UfP{b6qh#-_q7-0Y5*F#KSWqAT?_fR||6{GkX&^wQ)!*Iyn)2W2eDZs_?telRh5<`% z1i7N#_oWi)hgEFh^>PyF$9RY?A!4Uc91g?iANSY7lH+-pkyk(M!fc)lD|nZ4@Jxl3 z@Vhjy@D7An?duQ;5YBu%)R$?N9`YgbhMd7w6vpBbP71{3xe?_?>WdM`e$&o0ycm?r z_AY~EyJka08kpGfhBl-f(@1(74ADB^1UYu%wD>v`8XgaGbQ&fR3V4%m9}eb?)3mgj z0JhKiHk><@TM(BheqT8kz+T<&8nlXyU#6}56i~o8mMI?4RAoACb&O>8TlHF2MeQZn-Jm|B!0rBqL zbW#YXA41zaA<6{Oj>QmNAJi0%$ju*EDg7v4x-fT=lb(vsVcDWkC4v$*(RziY*G8D$2B(mPJ@$zO(S}o* z-jXY)@+?kzq+@16|LF6*X(Ta+g0^--|8yXI6kWf`CV^V7^XBjEzC96^y{1#_$lm4< zKJ7jAd-Y@mDPtswCl3w_j!yp`C5=jEjMVQ8J@iZ(K~7goqToZ7A4@8fu23h6`2)A4 zRm!n9r&Rw=nZ>jQo&-D@#vmAc6gMoxW55vx%0sqRWC%NZvo4 zcMHGIrd_iin|58W=ToeAqsX8i6QG^==6M%3o=TyVDFbS@Re%QN${$Yf?I_)iQ~TBE8MfD4_*Q2DgAHwx^*p=WDb` z3||#%DX|ROU@K|@(j>uqhzRL!uSDidF1A|Iv`Vc))m%Q*NUwSf1HCsjpv_mjS3vY> z6a^YN_^jf_KHG|mhvJ*HPrK^4SU4Jb*wA3*6j`EKBAD1F;E{OWaxXs4f%Pujqa2| znw&paINHu<$WeqB3J-+Q)@m6h=6onQtV=Us73I3D+d3KG1J&#;J*|jO1ng-9&b|EF z{=O)(ERYak=)mO^3v*WQiVSY5R=Xk#8M+s7*tcG;^Bb}Hb_IW#?T1_OB%AI|qE;MB zogRITmY|$>b8vzJGArEJg?sIqqzzCmRRagP0d+caK!4LBSVP39k#!Qt{CRcSqIQ}> zEoJN9m%Y9o1loI@bBtNtF7DVCCUC4oABs%t{|HwuBxz+kEOebt8?I+C7GXI-JzgGj z?4=LreIb_a{)WR$6k)rDL*?NY%^;D3C#L8zc&#B7!VI`s;VXk6 zA%yvwi`*nIoN{?J%A`r_Sr}G^3%tJOI7N1im`FR(KzEnWdF7Ykr(*Z8V;*W}*|(G;lT? z5;dh<*~DhGhpl$*nqLSO0_VCK-*%M!5kY@)yH#}x*~H{;WpK#QAaJ3jxZrl(i40X+ zf&mj0Fi<5#dMHCU9oHLm6&+WlHWuG!3u8HMfSiM+&j()*{^+o@S=dKQ5V?vcXIoqs zhU+8J=g>jAZgsU2T-eHRL-kVk!^g{Je`q)xwjT9LrR9puN#SjbKYBq?x2htpME=9a z`mM743SE?s$JYY680-hyNA!#2#_{$`>IyNBik-`msbSp3E`2p|?d$BJb>PmM`jj!V=Wj)@LGkyv|J;G`8>2Tc>6sBwx%{|-@s2o6 zd<=Ik4GwYRbLkehzR0M*!OK0taN~~ElRzK#7Zm;F3^K~8*Ex8crZkv>5gjJD_}p1i zbjldN$mF||-BiP|MOt~bP>dCKxU8lg1%-Ne6K=cA!}BqgU@P*elq8>+Q@?*Hq2rUF zCeEo;H{lh$RYGADk+Xva-LHXeG(a|Je$!s9UsPi@;+O zr)XC;E%U$!O?y}fle4U%T>^K5khIzP6jfj*^FRPnP%n|xy(&cJb0}0$akDOpb*om?vxXK8)M~Q3|? z`5=mW;!av63}}WHc`-HFEV;F5Jl=0=`;NWFlyo?v*sfh7x9gX~lzPbaye*U7kamJV zZBVwLbYe?wP_WR{s8Qm;^JRqX8Pt$my>RN=-Y3INcK9%?A}2*nRJNet-jEzvzQE{S zq1ZAv#ph76;bHrezZC^B$Gt?+YYrvnve?hPU5j8dCX8>3dQnm4GQBW^X!cYj|FSsm z^qQzM0Zh?$&IY&X>>f=ImH9)9Pf)(Y!xt*z{JwPcF!C)9xsn{@pf?a34q_{R$M0U( z?fHIW#wVz#baGE2ShTRfHpFXID3kFFNc3EkrOzyEXgdhkWT3% zk)(CH!q-KWV_3rN{wGe^XpC zVEByq?EGnfC+aia_6jRv0!T1+NkM>UG}`~iLIhiC!l1_|N%_lnp}A8vKs?K>v2P8w zWTg*qJG2E2W+*_A`jK_!t$Xj=-vnn~=CgaLKgsa};_09?lTWfmE4KaPq&E$u3&djQ z;L<}Uvc;V!AM0T0FD1-H4_f!A`H$mtSE&*^=Y^oNd(Hsz&CjDkCy>Xw)CK!1@7x!R zlu!-@2A>+d6GMXr8&3l_YsFCLF3c$wx2d5?-nq?8sg)!SgOwzUN~|veE4L-%igD>Bn#@Sw$y)M3sMVJD+A1#1q6E^+Sw`32yy#|?i$yyq! z`mLSGO0p4W)8rtlnBnOL#txDco*X10gPeT}&#D@{;tW?$Z03$)4Dr zh)4G7naad_B<-w%u7v@qDhah8Ft7Qmew=S_t(vld{}D8+3B>KkHOKdkX?TtMUEez4 zMB7dh^ZkosLWtTqJ{0U-nGfZQg*~Lti^dBzR!XYd_2v=zln7o{x~e94KfZzRAu!hI zDTwr@FCzJ>6ao&FB79@dxyT6;ag3d9YO67mLUb#^MY z6;?C8%qLJ(&T301HNqcm$=UZ;ODOovyV=`>%zNp6YzyFlI z|Df*u7KIq_krn76TV;I-2Cm)R-}Nbh?e~|Lavag=M&YY=Dk=rqk{+MJRG_G zaDp5WRvOefm&Xy%m^zjZ-UJ1kYwXxB>V@Y~Y?ZCpPSZ^pzug7eGpK}F(Wj~e>a5>$ z?c)K2SP=5Vy&4@=@k$hL^(AEdR8ZiR)vyc|vcH&Y@>k=JmRxfAGcIC}d;*nCb1B&` zzut_^x_t3ZIfx9#(ln|0wW+Jj3-nGCmMax`^q@LWrMFsQ2Bq|*i10AzWD$AcR5bNf zbQ6gyP3Th~#i{*{`kF~C$!Dq;g?P(DaQJpW=5f?^*m2-Q%$!&#&eoR|4VprR7z=eo z^sMbXqDv}9L4Qj)4&E%Xw{UH=*P#fudtYIun*@;joJM@-mv^k2JW7;8C+EO6W^ra4 zikvL!g`<&lFTe2=k?5&^>wnw4Egw&sr-U9t)Yu%Af`8Q6_98eBxfy}j+Puebe!eyW z0ePdv_IzJzcjIzg=%VkGw8y_5A8Vwh9;aws2dXXJSud_$SX^3YXt3@|JEnVuRdLeu z#*Vfm*Bu(97P&OX?hpHh4hb%KSw-$eepl+f;B6WQ8svx5-Pt%rbGnPL@Hxn8aWirf zvkF3*EzzT~15U05x_Z60NHR=~x`Z7;S--z-H4|HpH0^w%5E1)LqAyk_18mVoT7*h6 zedyOOcVLhzEm1z(CG#d}0_3UD2Ecx+ps861_{hX}M2%}bt|v9+Wli8|D$AmZ$Fjx{ zo}c+H$eVjU+&-7sHW_hM2rXayiV*b(B;M%K6GYK1EC;sbhX;L6YU>+T=jq`F8G@|O z?50NJJB&s&Shvq#mk^7gfx#VCJUJ9QVt27wZd^E+6nD=hoj(d&%YS%_$ZQr)p*}82 z;>w{5CUC3^An$9?qDUYEEOQEPe#D3c|LEb`TWl)i&pIcaS;~djZagP6zqR)Xml5Y3 zmoDSZ4IkQ}87*iSq?Pk;ke}WJ-SABuz+}m0=c%PR=_{$@uq5K99Wt5d*%^(AJnMSg z;61S(kljXf9h*hGxSCy>T!ITonBDS5bY#`CKB`tK}mSPI@kMEa4YW=1k%M2HBhI|+8emZ3UTCuO_c*))P z`SNG1d%QIvck>-G4J!ENPP{*)AoX)uOafw+>8#31_Ckf;N6>=!q{w?~xT!KaY|DGb z^x={QBI1GQz^Txdcie1|on7N*bpDO7d|kkz$hR`sq|t?eqn!KgxR%A!h!Ju|l{qTa zm^W^2$rU#j19Q;|XHbF>q=lPD{pf1F$fdfdK6zY8W2maHsxzs}#iSBz?QYAhlv^ik zb^_OhC|LUkI$iq!>rSAX?cGr+cq@pAS##WwS0Xp09_zG~~ zCYT49fOPej`!&l4($yf|Z&f}zkdj_FUVhu?BI{FO+#81|88^z2I=Zt3K9yEQmnPK@ zAhTgqk`ayGpEow{*OF%{u1=pF_O5@x@%1pNS1Cet6?#8#aQtG_AZ=@iwF>z_t`8Wh zCq#-l{w*gE-NMeBQKu#`5C}?Lk~OrfrIZwdfkOniNB=qlt(Eb7(;wr+lm02EgFZ7r z^Q8Vu^C&GPO_PBUcN4W5*>yDCI|hSre^*M{ZgkOeL^2e-=|h@il3)MgoBCvqobSs7 z22up~4^%MYJds=Rm@>}6vioo)}#k(iU965rzuKhkd zCSn8~DRZoDK{bn%7R_LsASdEhZOr3 zafZ-O<*Xs(_Sa1%E+Y75J0Y}yYfrwVe=(v_?}Wwc0_`eYTXEJSen8~0J`Jh}Mf7AA zTo`9uyk&(*gsUd&krY|$>z2Q(oHXbk)OS~PiZHgsG1>(O9_aq~%yyainjCdcel^`Z zWL@Kc%1$vFN;_$fP+=NPc?gFC{v*_FM2sz^pN8hZ6PpD*&7}gNIoLw>8i_Ll@GSaw zH|@E>0wumqh4l=izinu$7-gu9s*pFFTEsg9gIBTCc5N$}f-5S{#%(NiD1R!8QLueb z`#Z2Pao|7Mgo{*yu7dAD2zO5+bn4WxbFkgPpfb)&`Olqxug&CDurO^RgYYMc$`~eBT@JkZt_@homd*9q0Zl-G zH}+dkyakyEOT4A(n3Zh=DQ*$hW-%4Rk=$3EKpASZW+n;ApDDD-T2dLg$Kon*420s0t|O?i7ezNwN?__4t0DsEGxvOJ4n)3hBB<#a zmmikM1h!{n9+$8hIG#DY9dNc&DsKX!)mYtoSu*tTgP6$v5EM_tbe16wUH@ zbHHub{bup)J+0iPc%50Z5xIMDS`nwU%9$*ZC&I|*;>IfPV;G}TgK58)FM?1XRnEKy z99D5(8~&*6Qpt~i3j~5zqaoXthsg~iLuRvn1QwXXiAnlB5Q7V+dF_V(ahRzCA<^o; zNeJVO$mVJYbmLn-MI7iFGpVs7M+ev%>MGJt&NRnOHJddLjJ6_?j9ZYH#_^(nNf^SK z&2dRT@~zslk2H(sD!;5L)->Sb*hiR@|HQ{BW@K~eOa6W1i-d|}(;06`V;wdWE-jat zue=gHd3t#Vg7L0y|At>5!e9a3RjtV*v_ZKxZ~uz(^ilkN#TLQl zQd%aTVuirjJE~r5V;_=nfK0vyqa$xYZ<_*_k5p14qF`F3--MkcL7?$*uWiz3Pncc! zYd(Xn^AXCR5U(Ar@0Q^gKKx{hi0(*+mUMGHwjxVOPbapfeTYOc)<%i|h#k9vRy0E) zx~(CRy18FQFFzr_FF8XZnKjt*Ie4Gi)vLTkYG968 zwEh>1%9IId#mLk_ZoR%83~|C5(vn4$axx>A%F$9=Ewn8$Y|qMYY#e7c&Ct?##If%K zj<(H78@48=$j*g1{jtI}h&_RnUcU znuEXQs`~0hGwP1DU8GQ(&NblY&fBTv)dzbIS7NdZO^ynL*9du&88ddtZ5XxTBf(!<%U5 zgtsu+z!Kt$O{dNvyiZ$gZebSkimj^Fw*;HHkd=8i)x|9ll-$p63?lk8z-FOk!Vy4i z+U4E)dMtz^;3x0x$h<+J40<*hEfySEKOgaYvJr-B?9cpZsjXM3&|tH0ae0dJ$@n;BRt0_=3T+*Q{Lt&SCmsXKmT{kZIrmb~sik%ca(t2`(uvrl z;`^kcOb2PFKd$&=ZRZ@0^`zo*aglFwURa-DyveIm7>AQ9d!?53uSQPr839f~4|=3~ zsu-4lPQbFmE-%a7h0y7vgL7=_i{w&ZsY9m0)aU>^$ka4hr-((Bn{^C5E8Z>0tUX3A zXC0!1wI9_P$=Sd|&>MzlQ)>&12qtm%_in0h5eb#z43?}XTn#nnIR+{7i}jPL8E&7Z)qe*7ZS@LZ0+OMHXfk^1Te8xUBf^=&}%!H;P>reh7x^Pu1s zk^Dvibf`wu9dLgfA8CG}%SL6cG%7ib0N7)prH5FKc56iv_0Ph*ezotbA5jKON+H<}L zA$KO>zheQ6eF8(&STIWtw6h})YC{#gc@+miw%MWdE^N68YB#Fc;VTF7o%jtmn%Q9r z-hdf9CZS$IUDgOIZrnWcKhW7TcM}6zEW|s#&;kp-!m42MP?#x6NM0t%!Qc~iBO1kC2g9rLvN^)JJIoWP zNyNw>(~8X^;^VpfD;+G-pq9>`0-yW7XN+l6CZgqYW*06snaVXQEWA_ALW@{u{r$2L z_d8x^@ENaMcoE!N8jOv&ND<{5?{E@H;y#j&6)F;QFE=F31(a}aF=sQ<^ZZDWVhU1e zVw1jEILz=+f;iV{*AOl6q+x=y60k84%xUFFFoNoa9ABPUzy2gU#St0x3|8Z}_g$>M zA)U2HdG;^cm5-KQ?Adcrokw~2i0{*`ji~QX;b|M}6u5}k&GUaNw`Xr596R5SY))%z zCSjj?WSTtUXsk+oqf_OWsL=2cmY^Eu$`)oe^e_~ir0_B798bp+)^Qt4nZMHm?M48y zSO(up@tLf{5wrGwYCgL(>owiAPZ8l(;89A9%Bdeu)$!QVLsqQ?v1)#^_GHsdqs7qJ zY)V{mFPksrjGHibAHJQSTyGPV;Mc0(uD)G2Bb^;8zs6vCi&~+~N51Re6KbmnTj9L% zF(RyK*DP;t?&nhbalWsyBD3@Ws&Wp|@hB)CPaSIXhpk3Z?@CsVD0n01PUHDgnO*6$BF>m}3Z|p~7I*`G zpnZPD-Cgk}1veC@^=3uxmphg2j2+&`=76jz*6$2Y+ig;hTA8Ekj9T7(P>Vza zXkao~{K)>skvF$6q(0bCF&N0b55R;jI z7p1|IF@$Jfz3c=7elX2_g){HIqXH|vG$%_fPx zi7&;TIwkpHfID7qMuO0U!<7!!WFIoq@Zq zcQ%@mTc#YlYD)uEwHrKY_;`#F)ovPzL*h+y15?yXRMHraAS#@M1d$t-e7?qLVvB&~ zs1>V5S5wS`a)rG+WPe=_7`87A1~g@6Nc4_jQn7rHuZQ3Ln-&esZn~$-TNUZ#-48Ab zG=~aQZ@yFB#ZfhSW1Wqmuk~}<1Qaw{?rxaXvIaQ>H(DCY;XCcEo0AqfKvYu7yse@v zyTi**O~j2bf-;EGbCtB&e%BUvi_u-msLREa6Mnzs@NI_sDrlo{M>}`YJgs$XW9N~3 zIZM~gH=|u~7duyew`9}wy@^gmJk|>Hr}yyu4QmRJvJ2lhZ$dGN&1t@2lI4{3)xlx? zQq>_Hz6D|oVdQw}GL!Of2AfxP6c_6h`xZA^J?oZv0~9}viOEFeHo$z0$3BkX znI`X){>>ezlQrcUnrX|j7CW2`D*BFuHqNmLbz`KOIuMpLPDttyBv)NL-BDg8YuKFq zioIl3ATg#~BTXOj;*SZO2cD%_xNer12|o5%#1`_cW2|0*I^j9k&EVeZ+tSiJoiXSM z7R;hIKyUMt@_uK{Q(a7JNhY@#%)Y z-)h1N#xvWBN85@E$%;vLrHLO!7d91JYMN_mnmRE@R^cs;z2{L#k|X%;s~?P<-VQTg zBxVz`i$cz~UJ~KZLpe;hDY_X!JGb86oe^FwE*^<(jM;=4#JrSLvC`KgtPo zr*j1a#P%FvZg%*KZp2U@__apQaAjSK#ghp2(?7d=3I=}VzfO2&f5Q}-nj5USW*6!S zh$r5~edd0{=ozRP4gdV1{uUm-FGLXk`Lp0!FEf5;P9K7fq!3fOz_wl`1>nxady3$? z&~=!vDf@GUCS$t@>rdJrYtOR^1nG% z#bg_Sbj=-QgWKuxEvWgbuQYTmRw`iuR2u7Ur%-91@p<>9W@@|co5_pze_GIuImd~A_&=pjp^ui zqOH?EH+?#S^j<6xWM$6GXfX8qu~z9~&vkd_>e-9ya^ctH-N*mU3j0zNHcYO93Shufpy_Ip*oFEiIoMojkAHr{W#X@3?o~*#BlS`8io``!#rd4m@qcf^8j6!s+0U zPLP{JgOki=vVf3mB|L_j%YdX+P?{yf5swmPYG!S*MWr0YJhGvU=san`ukv<}Ndi*~ zp{x#)qp}dck>XWy_%dza+*4y7%gZ&zH@;kvCM3tn}yZ+*zY9%)9T$wz|s30tUvqlG9^{M)oVgE#`Ca2(EzA zgH*4WkT>e4WbxvU3;~1hQpQCqxv>eTamf3!YIQ=}_+hNhZEPj(r_tX|WqH#q&3$!8 zeG5-LGC%;rwbYBaA-z!;h;yl=s6}g28lemVpyK0YH2GNYx9zzt#zQF3xwXGDMVd5@ zt_ggw$Lr6ry}h|Fgnuj5VPF=C^sWjR>t--fSMV%ymEw>y71}XI( z0f1fR0evWg)H!-k*~$hx&TXBoA?(sh>rj}b)j&m~S=cmFV!@sq-SsX%xi>P5%8Zww zX#(U$kEgIb=g!1+fx(vW#k&N2>TelmIw&Kckw!ymW|8mAU?0hN6}ZZu z*w^Ot`mO^SwN(T!v$`R4*8%kM`ud3D7@+_#jVai!TYFP~XV?vM{J3@MF6-EsamTUbXsWVrXRejLX&iq=hqQZPibM}aG< z+Hy z_`w0pe*Lt({1W+~A<@wfWQHrT#9GQOISXZPo{*c?3wX zgf39H#U5Q%AszWO6svI87g`lf#SgXP-S7ZbUQ5$B4{K`g~{ZVGSKrrNOi=D3N4l@;e=52`H>f87I zX#ULL2wJJhb@S&pB)Vk=xtMd^by_ePK+O#6^op#%V&o#9EQ8Fk@;9hv&6+n;Q$HYK zO=(xVkgdwul#>=pj=26$jY}1=&|p=O;y0wh(wt_FTxVSHbmN5`%9BHomalB-7h*9t zN9>|OFAXOUwzV5}9h#{4bII=ZgTxazCw2Srw}1f^LDYRRb8@yxSHViz-Su`}@zmo5 z2H@jeN}a-cn-T}il%-~qo|=XwQt%rYq6&LEZ_$ZNd6rGs zR{2)bP{CWY4Yv4CORkA+BjQBq3tsmGyrmI)S$b( zZ&@n)L(#s#q+#|zsxwQ@$@(4Stz56lkA(8LSGZZ!%7=K}ixDyQIDTdRqvS#^e713P z35~TDr9S>bM?&MnH)i#(Z?^nZcnpg4mMr9l9G%&6J%5YquJ~mhbf(Q;!ex{jMl`2j zb+D}c>AYGbJ9O^^vA-KtwVk(j@SfkQUBbz$U1h$7c4GVN97v2(>3{n?@BCFgs?Tui)l(PYR2sE6^Sy*;W5uHL~>HP#A!EH635UjpS1>%6L_XJV!SfQ^)rczDeW*R zM1k)v;?QesDDBd?V0QX~XlGXAb`oq^y5OWc+A19Ywb=p%auisGrN4PMW&Bx^?STkV z%VA@j$WBm*V%6e2Kcw*oYpvZK@-sg}2tf5PRU2J^$Ft;*KEiS}>0dzujCTh{p7;*n3}byQH_8V5#BA8-^{_Fr?*hd27-Q>i%2usE>AVHxg-v-L82LaenD8H(E{ z7P@6lL42hHb+ncG!Dw z*A6g%7v#l}Rf#?E8~P8c+Af+3ZibpESqw2=4_BZkS-qTCZ15GlV z6IQT5mkxCm%f2tF(=C1w7^@rESvy_V8}GDS-_B!~1w~j@@JWH*T&eS^!i<82K2pN; z`Z2B7NTL#g7_G(I2hlm6*a_e3aTrUq1Qs4#vj!Hbw}*n)&$cXn@~OHhYup4KuBaQn zK@_7FnW42->wF|#MQ}cB6xY;7mNRiz z;yQ}pF-T`uTAvhuwCwd37!rIqR}y`L8c>J8T@I++L*JRD_J?ZbPWtU++4z`yLA#+P>1OiN8TfdfR4Db>qRTvRLn6sb1hBUxaniz8h zWR+J`6NBz5iTsuB2|?0$M?@9}T^bnbuF$1UUm_1TnCVi5xvEK>VFrh$4Fxt~44Dm4 zV(LJ?jMHbMExe_*6Z(L{Q=lx2d7f3|OD#~WER1+=^?H^t^asbN3-SE;`D{yj=d2n@mhyo0eTMI#-x)F$bqZCu)Vyb^xV%=!~CgP*#ua zAVz@}Uj0C4E9nWlx+9P4KZ$7|ZsQ3;F}=(Fw2nQ6`AMhn7U@yFJqHX|)K0kUz81)z8 z#oiZJ}-!x!V3Hx8CFt7|v-7w9)t(LijxhjXxq9{BqgMgbbqo{$~6QR3YMj9Y4N zY0(cP5PaQ8kLkpYs8Udm*@Wsy*#8ohj(9HP48`p^oy8w zAe7Y~nzX#$4B@Dw&)WCB96}=K|0ALKa-^nf0ccUf2iidVCr)|PazirxD`4@3NdHDb z%#?0~1cXbk5&ruF4FIBps#Mw(Az9G^6h%cH;kebMvAzV$1k-$xwuV$y#zK=S?IKL( zVemZk`0|D(h>ZbF+$%+DnXWt+B+l-{)PvvS^XVM`sXQVJZZmmY`+WdIY>wan<^4py zRYNBZ@EhA=REqP`1feYKgAG)9G-*0VK8-CIg_QUITl{GaQ()^TGotdk7vWs6^ z4y>Q=4nt(G4~~5x1u=H}wU}&rU<-LdZNMu|G7A-bdM*=A1TX7+*D|dnlX!w* zBWYt1A+m|r|C($zS&&E)BmAXV9$m@Q*z^wiA|o4%&b+~e?KPC{rKko*-h`@bhRPF# zvmatfRlAqtHt+vV&?~2QrNG|_p@#qilWs`|0>Awe0?`u#m;Nbr=J}KA>;AU7z@+D+ zk^GyoGyo7fJ>ia#qQ!v}*zr#zMNa_~`iJbPfVGhS>3xXlfGhv}z0d=p{`;?)87Td) zQH~AR`@c#g9^mf3t~Y!@-+%feM`7UHKhYC5R9%$p-w@>>{=IMq;R8|AYlVTZEivLi z!+-8CB!HOztb;Ont%RV!z_#H3KkIbC7e<5@4OyV{KY|~Mz*&g@-qu%$l5kr85+tMt ztzuE9|M*};PygWrgh?m)!wA#TrvmK%M-r|Ey!Ej`P19yKjt$EqkWG<$q71-5N;z z&+Dcg5cCfjIsuLUwf4CK$-figwbN12(*X%kJoV!-s|A6D|FcO zZxAHH|CxZ4U7egQT-|Lf-2O?rs?_b&7QSE!%IS%UB}N2kO61Dwr36L(kRZBsc9wOC zO*47xE&Q$9Unrx{{NoehJ*a^F59FIlJhx1+=neRK#--)ew&3w*$J6B#u~9cT-iRm` zBwh-snRGuRzRKof_#Vx^^e6{K7VB4jj7wQOkcD+ND}&f1oBZHHvzoeu4DM#r4&2gK z(_-gu=cQUGFNQ63L|%;v%f^;p>`ZB{W#Vb1oz}QKVs`7b-o>ipF2_Z=>|^uan(x{( zmVg6#T5%?I4y{P%AoKN!1SKE$YLYyRmQbnAy4Dmw4W>j&vBDW($0X3inR^J$HQf~n zWOf`EBw`qter#c~nno{TVNK^+S2qR3*uYlmRJ=OrXtzDnR56(Oeckzkyy_5Rbo9(J zOikeTjrguMdU#p&sl{zH-{baPpxu_^)7V8PGqI)hZQ;3m9GC)6xQ6_aT;{_GM}hU} z&wcnjKE~r374xZT9-nSgZ`D76$+s$3pw>{tM?Yb<&b`DPwq(bh@X26mYh7orNtOul#2S~B)b$?=I%G;}vsvNGs* zB0|u#*ABUHJ4_8R>!l{`3}R^9V-C=HbM|ENRQ$re^>)#p#qDYR@{*YMwW`~3dd&)Jz%Gjq?(nVECX)xLb_Ad6o^<**^^Ehu(IdPsg> zdgcup!XfP@(Oj^IxaQ&mSo96yk+c>CxaEmO-UYa|vR&(3nrLe;2 zceK7$J5k!xugVRxIhU_S?mz!3SD=hbq#v8KMf(n>6eRTvwjwE3zk>#IoYM%<(SglO zJK$Mb+k7Ja5YhEWfcHtz=MrvhatAXqFu{Sc6i6_Jdww>5_T2^%Htt~WSRt53iFn!(4p$XT#; z`V5s=J5~4f6!nhoc2e>H$NrOjqfYq@#rdy+u&GS=fn#IGkS+m(jILGYvO5vMx49ht zTKsX}5ReE>+gsD>YR^|Y`7x~dU(K@)%G`1^^mx+DPa6u8L%kgF*s}d1bd@kpAI;Y@ zpwcVYERJ&Qwmw+9yp}j7YF_&4`n+8Uxn^eXhs*oYUhKou@)9Ezdqcfp3PQFJr`lY& zk~Sd{zLg%h_*#eiwtjDk`9*lneYdSn9xcjB{rUa@P;o&>wbA`@|H_{m!sHH#=0{7Pstk|%=Y+9 z{J4QV4zakE-$noXFdykx0j2|N^YHRoffi*?Y1oLc3h)!;VKrC?u(S}kC-WX^ZKFX< zyFz6VJr!UA#7rX?6B$|u{tdV-L5*NXz(9AK!S{hhlUhKb@*f#H0zwLrMeriQgh=Cd zFgk$utPA`ZSUS!AwuCsL9G3TZh#6O?3?dnan-BrT;l@Lj_JMr>UxjWMi~+bApH=Tk zJwb6@`_IiFp@iH=(BN_tAzw^@^#N^Grod!?l;c@&E>M=Z0Dc8P&?Rs_P}{Q#E(Xf% zHo&%kq^T`%4^Wn}1D^Y@_A9s%fatz~tpL2RV=xB*)t-TEF>wFgdNeMf-KHZv86c{N zI#O;-L>&q0r;r$>+w-5`0zfA83Jd}u)*Emrz@Y*SvIX!@z=XU4${@H98~~4v073)w zl=C4`k0WaOl*ahCd5}TWZGf?mX~dA{z|2WO3h4((Rw*Fw05$2(U8slkZx)tCkg!2;k;4#35uk%J0|W;k_G5-T0UiOnh)?;tC=w@x+&(@VVulC8 zfH0;;c|aU&5Ho-*o&!P*kmd0}PJyx%en>5_?9dUGH$8DMT~1g{u` z0^v@}jg71of^Y#^eiDVK0FC`sKmK4IMd6L}e<;vhP@jdShtk5E^ftWKo|4=qaXoHk z7pYtmq)}DNxz`*~TvkLV=z4C=%G8T`b$yiyl)wq4^R*dG-$}#XD(ko>()q%?MSz#r z^qfQzuOG6aGB5h)B|(>A;N@ZH^-;drK2j$152!~l09|*6B4Mj4!4dS;lPf6;^W(5@ z(YjXhK(&?($+u`YzZ<(~q!=yoa|_p@zs&>(O>a0!ygVnaHc6Nw?KrZ zvMeOH=8?UsbVJHlm^`1+ZMA~g;`mG2UF+iyF1-!gHsRgoZdx z56#G=Yj#NCn>XwWn)Ql8odn#i8oGnRkS_EU>&bhR1zV8*<*nk&hG}>a;tiEaqkwZjt%-WPK9+k)OuuOXBB-sk(r0 zFiw$!7v8Y>3dT9|(8qWSZ(Q)3TE;v{YFCDo)7(jZ^0!BZ-Zjlup6zlX>5?UHos;@I z!?}LOECj4=3s$jk^$w}DUpP5c*=AO8wfL2PIZQlzWLL=XxMrUOzRu_J%*V0r@z&?| zBjaM^FZk#UlT|#;6j52BfkIzdf1IU%z^`L^wK*!D$?V}HzhCn7&WbK>?UREyI|2~{ zSgk)rk{>=Bp}0L3g|q}qi6X=r>>}H~fkHo!*(kjl>q;EIIHisFrP%9mFdwt&J4dDR zYDOR>CxqxHdJ0rIc9Zb6YJdmGGhrM3M>AKn}cx2A$ah*PV3P_KIir9B^cUJ;S-K}ee=oh7-hjdvBc|Q`!cT+`N%m+F$2-FOV@r^Ti5`=n|JFM=GrfJ|C{#61L-gbznG{Soe<3 zlV#|pZEm@*eMHOlVzRu2&NnoD$7b)c;Tz6Je1YA1TJ!Ml1${&ESDOEObDn9smMe;y z159yH={!)oGEnw+Goy>tygfCNf90+(~o^5Dk@&Q-6%75>S9b%nbiM2aAY@E>N;;c z|3+9QH1s!?1%)vUE>nL?0te~EmJ>~93)K+s0>pHqx9CE zP9INL{TO}eA;10JBrVnSQkCMdBc#|EA-aiq4RmxuwIoV{7DZX8zMa+8W1M zX>hJHyWe)*K4us7f@O`?a+pCw#$a9=+hX#spR%VSaWgOG{Mg}wD@xjG4?3z|{UQB4 zkXDgmx0Fjp-DF4e=YYzToH>QB)Z)GXza3>svc3lnE$BR;aFd~dpNc|KKB>qZjz-A| z(^ULZGrgk!g;-(Io1p0R;%GrQvkfKZc6~Ty*snr`ngQOmpH#dAe=#B!kD4F!TRrxV zvusnBj7ol`EaZTM$5uF=fycO=(-U7WXBx)COdKjQ><##Tvl5KweY+{cACs5h1s^j+ zC+NLx9tqcMTg)+8T*|BojH=uvFd$J`phz(CX!)&kDNK_g9#ZJ9vGPvy4ST04)x_eM zb9kQ(tXr)AjH@BG+q2-Jui%)uKh1TqYH`X49E-FmK&2ps4}R%?_Q7XNEiXMWS z&{7OVqhn!H_j;kk9N0>v|9F!;9I8yTiPOn=yUup8DVQ|3R3F8aIQ*Ow#L6oh5TU-# z5LCbvylbubTBw*W;}1?{(u}{Y82g&xF>9N^0Sxu zvPaQmGdwMY(JPGceDNTC1Lbpqs-JY*bL|3?%dtH8QmsscFx)^%o7 zT1+++g#rk1+6?|j0YP4?Lj(W{J}pQ!K(VO{!2+OteMlQ{22^GW!2o=WY75AJj-8q{ zWE7}Hy|m>I)TX#Xb^(4t9uNEBRlqJl%{tO zO+17WfOwN2cmRdeYe*1)*Om$S&-rc6fxH1~O$s4_K%$?ea)=m!NB$1N2$YF6LG}PA zHg5VO<{;L+dz&PPFlLlDlnWt1^z=dS5Z!Ft6v)hW$TUFf)Cc(sw9RD%VhKPqlaNiI z@5fgKpDCdn=LkGRSURfj|8eQ&;Ko7{&qA~Sr+#*}1u}x_?8dv{QA9R;fP4lz2C)qJ zZzEmG{-?kRHOac&9d4nxV8J!LRP5c{y==9-9KC%U-Tr4Et*>oB{+Qx6YQUwTI#Uf z$t%6>a&0B#@UVfmK*q1<$vczb)*A3V)WY`R{qo~hh7ch#CW?z2j!9^vk zl+>{-9rZY<5aX>-lUWHd5bdI7FZAo0R3t04Y$auFWsJ1)9bRp`P!@f6yS$n{-n?`) zLF|+G!~XXCIP_=Zjl$Q|GUq_o4T`YsCN(ML&Q=8pJ!5)!U+(^UDYZvvo)h53vyYrr z`;WsW5n$BkHS@*;b;%xPE_qPn;~hJ;yiz1A4v>xaBzZoFhg1nWe8^GZ5D-I2hy`){ zMWqLNCA6TmRL8z0re~op?1bjq-*X0whhW=t^4B7zJ-nwpjgCV(jC~#_%T?;Z zIsTkchu_*P;chfd%u$2e)bf2w*W$r3pDWw@75m7BtS^{8HJrG%CUH?6F{LD&*6BZE zCH0P0?0{lKhWhPr6n}N#4%9C9nV31-RiP{~yXgUSv~|?K@$6}cLE(u99 z;~=n|w0Eq!QK0dqS(Nd?#>Sj!vx_W9N{mQO(pRHN0 zZIpQPlH+3i%f6!xO&?oAvdE*`hZ^&j1WoK0;zY9sIoY8^Kj{>BQm(ilz8Tf`FB7e4 z$Y~heIpMVN-oI#KI?r2VLkf}$%1+8{cs>i1SRFrWTX%-TZf?|aD|BKe@E_{#Q;*yx znc`{UXrnSaQ`2TBmr>8+sC4#?a)0MYDYFWrPG*pZ<;2^e_5|yqE+4+_fN{(Z@TTUD z0&x*4d+COf2e9quY)=OEpOt?4TJKLdeyYQJg@E$LmR^7Ti}t^!WZCJl5n^L&`cmYB#xyHCaV4Y=&y~H=bz#^8fWX6t8SFc`;FVB9=l!j zAj5f{J|!8v+{PFt&MlTQek6Hi)Eyvti+#)RId5Y|n2yq}rey*3(eg>Z5?wOMDMOq_@9|l0WQ6(C;b(!5B#n!8DzL6q1fmxfXg1^93udhlGKJLA;!qte{y;6}&h2 zuU{u;@b+n0c_p%PMrkqG5?s}kSa}KvS^S>V-Y9@8)2`QkqZ08^Jii>issHHU@@Q?k zCbQ;4nODuH1f!DFoi<8~??Vf6X7&772n$}$Sij~d>*vpt=p)wO9jxOx#yNW3H#cmV zE^E)GQFGZ~JIq8reL2`)v>3q2H;}68J4JypN%2S}wd$?DK>yF|aF*r!#0x+9TjVQ4 zr|LN0z`sdms|>Zy77qx0PJ66_t9YPCpqJ421R+#HMqzddecbNm)sOc|!Yg_%B5H1$ zEy1c$XsWJshJ+?$>l9Pd#7R|zd1l=-B$su>T>U5%OUe7A;L>i4@C4UzwYB{!dKM~Q z$`R%WJu>7>UUO1^JGBfJ|YET*77 zi+#g4uJxn0hf~8oBr_u=Z!gdL=2K%CPsSJx?#D8`OTBaEH*$Mwbv8DvTg@<&~Gay;K}fe22i|G2{0Ps2+$jH7Ue3Y4Q9$sITinCQPKI; zWegrb?mimuz@9BoVB|=5f zlTJMq>#|7ZzfzGBQo~Ie3)=*V|hmz!H~ z`bOlh7+%DCG#KbKCdo2#SsDKJqFM^PC@|Xdyp3wGtB7}rK&=w*=XV=%+lNChEnJFW zPd#G&)()b!{%lzDd|x+wn1PX9n3H?y}XA3x*6m&x|X7P-|rO!nMKM!}`m|DEJ^8vCnsuOw5|{u=MVpK?zI!<#kY ztL6#x7vC@KLMMDaP4wn`SFy(_H52;X@Ee}H_F!Qky?A=l*tkB*;j)Y}qA$xbU=BtZ z6iziw=IQg}^f1(F&vfT4n^}RLK-wI?id6RONbgy8$K>PS(&_@@i^;6!;m!RtN7m`k zBZBg0wNxEXvmeA6S~h>Ka9RZ!`wiqVRPD7}Gd|zprHEAnH3*<;%A@Qj zm??xoEKdcNyNCd}g=?hFS+(Ufk$W?c5d zngYu=N@dLzHtb8ON_IF@Ly`6FhY+)qc4`N@1xWr5+(wP;{XyV8o1-Y!y(Ld3Xk}rkLCt7A1$MzjruuN{EX^bZ7Ezw zSLaGQEWK1dxVn9dW9gh29xj#FXmE*R^WMnV`7)Tk;KE&Ovi^R4t=&^oSglNF6Zf-5 zRhyG0Z^!Xlq2Ki(j}$S_@LluQ8e1RvDXi!)sn4qE7}ute&)P=Gjy?2u&LK`YUDo_nyL}enETzluNiyU!r5 z|C*@OSb+4Bm%&13fTB!sf}Yum$`Q>QcD#+IXH#=R*?&>_!*1_4KK9m6xO?IYf_`~* z%_z(I<{;h#$ft}dyouKNO7h|)CuwxOg@h{V-0-nSuh=UxK6Me0B3e``xD?-hFNINF zSf){L32wY$MJ$2Xo2yieK6pLsS8SVeUY`%MtQ;EbClTvl`GHotx%;FnfM50M4qu|!^5qwjD+-TYnQmCEq1AZ@_kRUYNeK^sn%wEdZ+X9p8;?OGv zW;~14qAxK;8gHHV7`wA`b9Lg}lu46y1?|lA%~xB~)5TncyaykQ{u17zvPOR=MGF)n zdFwqa{?~qC)P2A6qzA&}PuzZ(_Yp$W;9r!(87-wE%F0d_{OZb|q)WQ6H#$AVmuP{V$6`B6lF@z`m_x zAF=^JxhD`S07Cl#!2@=BMAwj;J0Grz2wDQTaCL$#k3lG7l)1Z*kwLs5ff69`K~UI# zdr}-|F5vY|6F_Z%GGP*^I6&-U9}|0u^8XBp5k+}mfEXbmz)gr;q<~%n(iiSS9|4=e z2Vkfdz#*9)dJaHQOwgwQ|BZ*xSpct|1Nz@B?JF+mByj8Sj0gGwfJFG9s(|$3Qe#F} z)V8w~ba!@-c%cc!LU4$3(;>eLLHz+S6)q@uFJ%PiCPcHziV85BeCuF~st402(l34CMh3tqIo{AN|`C|4-llV@7WR#Y38!L(KrSJ1n92 zKu3<*LI1nHxN?Mk0WMiOGzL@sP@)Vl?hZx(b?!JwxjxN0hvD zL}4B(z~oMM6fzdVT@E#5tX@!WKxUpV^a&80au^291iB#lC6xESBZ)XD2Y|Pi2)zYr z_miPbOfn2aoeD$-S&fALmq}T*6)Fg*71j;K1q3JdL7xHaPX?f8 zKw!`%p?P)}s_9?;9Y4q*l2lOxSU3a4K}wE57XdQL38*L_SZfCA3osp7ghm3av{s;f zz^IY>GJN+z9jm+~M}&nx;6}_GL8+0p8_<^k$>BEizo;dGuh4#gSDGh8H6i_10LnmV0N{P1pkD^c+NkOGfa9J9RfOs^N>yD{ z9NIsVoyN?H>TX{1?m?_-LCl@hbHOK_muJ&iV3h-} zRLPXvo!IWilZ39Uye^I}DWBXs$?ugtc+e(?#kH@Y=15yCK>Nd=m3q$WPa}aYdamh! zLtQ%o$M?3^@KiOLn!dX1R5e<&Buhe81Ya9^e|oOz)E+y5fwvc^IM~{7d^A1bT`%vz zs9wUm!Mdc>x3o3Gyc45B3Geznq*#~utG-cg*NV{RbyT_M*}dX&>tF5~5St4Eg6W+d z2Bp6dTX3UX$%(xcn*9Dz#)SO%t-xH#vAy3k<~^g<3Afb!_+o*%v+=wgnW?NaotXV< zVu7z`$9X$)Q_E>O(fc{XRwnoKXv`-^=M&5$wwiJ!`}c?lYPWZcl(-1|z0T;0m#hOY zSf>So7^6fy&(MoStOM{_dH91kqL7|vWW`A905~@4i||3LQU0E1c*X6!9XY86w4K=f z!D4}lv)8;G1*uE4&+qkPiv>o^M)QVbri#!$$LxPB78pM}%o~!Millvx-p?u)7(H9g zyFNMEo*gn+q0yy;(4;Nu+>rh~1WoARC^8{5aZ4mOWOxrr6FNM4nGpJFi#Yesiz`M}8U8Es zC>ifF^5SlbUmUD50#^^By1mcvi{T?P_cY+4wphK%US|&k2nYm3f9KI=(b##OVGGbi z%bX?dzs>cs zBk1v^;SkX&d=+`yGh{cCAET&70aC#%_gZVDnj{MFo3`XVT*HnGWoe*l`ZcOzvyh z?O5+^`Opa9@m_d|=h8;fPjWjGw*WG2G%vh0_K#A(g3gkBB*Ie&_|LrKUgH;oz8yy!1Dg7@s&Wy0*n3gVBjCyNM>nGMc1%)dB3CYKP!Kc2EvU}M_3M+#qCqx zYX&Or_EW4*Tgs^pMjvyjkf(8DCp6v|Z6nt3pv)(g z9*8ubih37D3HP&i9P4Oei?1iGo=qz^za`xHI>r&_jQ^Z@`COr0^*lWz2tULt((~f^ zHG!>H$+d?k&75@WDywelJo}1P-uQ8@|F?pr(sOKd~%j_7SKz z>cJVh0uN2}r(|7z1PBajN2?e!|NW)v+14~|L3}C)mexDuU`uue>Cf_fb-jKnue^Cu=5MU_RT_=udT!;pRgOmk zF7|J_qS3OMm-yWy;cEsk-K%dDLVnM019S)Yn*FS3Rf68~H~A-}`Z~;RnU(3at7QaX zh>y=a%GfbYmxvlR(ck3Obbwdf$N^6qsluz@^=kTws;FLz{$bMLBCDC!X zxYB40(Wn>8itbE(-H%tqkvsa%nnMAxKi3JJ#48#)dh*tTCETKpblcYnBBv95pRK*)i+5=JfsKDRbzOJid^kO(;%JI}`?DX4{cuhIh zc>gYLdk+K0(KlD(srAQ4!*;RVs}BxE@gg7RFQFevsEe;W)f){fU;TAb@Kb38s_dr? zn_Nk44YEFN2rq6Ewfek%W+2WXc?EaD0_*=ufqP-ZK1qe&UQiTA#TFAkzV&rO$MF3@ zmMSVXy=|hCf_%GR>K_=WlIXT!;Trj=b(A1ML_HdVKtsIx*&8u&*TvJTfnh%_DoznU zx<{?x*Prpjrb8>fj~iE*TyPs`C`dec_MvO)&DDFEkQLtY zq=$#HXjq-x;XdonW7~%w^o$l~t&8C8Sg?B}4fdK5Fg^B48h&Q{&HLEkbTQ+3wLAZ; zTo=FO2h2`0sg?I|c}Ct{cPYkEhClu+h-x(}nYTL8@LW%?P3bo zf=?_Qhc7^>w`aXZ(gNeGUp9B6n70f+8wK9V?@uThw5qY!!y-B6FaG2;F)z$eW%%nz zhRU}|3P?`=IQtlkc$D2|>ze4?KN~l*ilvgtKGB^dI~nk}AJckPdH(7*`P|cxg4erk zS_*m(@AvA!eP?Oai-vg1eA)Gzd&8A=nVPlSY|R$NM2b{H#hV#mYa=wTsJGk3J~+}@ zOx+$iH*_+a=QNx;(oq}g{0zdLx7JN4m>JyTJbI#gKQ%q{ZEKY&H z4{>peUyQ_OTn@OA_>vX(rEL%LOK9*3f>d}1=e(o{?n0esU+q5|>5~$_JL`zq@ppNF zoKTIddX2=5pvbx_-t-YSOWh7sg6idizWTa$?nNr6@50Rk&Fv%1dwXi})>*lI++J+= zsY)F(p-zNreuyG7dPNDba^c^_To2^c!#vDP-U~G-ia$%50q?c8_pKNZ?D%uY)3xHxWd zFh(?cnvoH?rcnMIVR$dSPJcbBy+FkIt)SKf%xa5?z2LiNlvRfI#l&ERg0L3LjjivN^VYe+`AG*K9dV9OG(w&$mS>n^n_O;J1z>?pOt@vx<}o|H)IdXtFiIXeaYQRDs^s=WF!FR2KEgA_z6SxssO z2DP#_CC&*a)Y@K_4Rg+{b0Xec&&@K7nqA)dOppz~Gof*H8&JrImwYibKL3@I)zrFz zVgE1vRjq1yH(mLbeipOQkbh5IAHT3DjRGSCtFLF%xxQSdvBh%>vwE8GH*Dt`uCOoiQybv zz;G`6;!gcx2_98jWENYz` z{?&IIMy;y1)Q)K%dCHonB|49`C)Fy!hiiI%3MED6(zv4xGlwvq@@9xwV*T*WL*3yo z26G0_z7{Pinyb5x&J3xqZQD1<{;8jVE1D}Dl(HFb@9LARe#RY@JAl=eTaU1O0(GV& zO~tJZ4u{2eWUcb8H#faXb}wy=Y7t#&b}#osS6LMw-jk@5f~=Iq4)1tyQaC2RJ1MiK zsEl}0Vl+K_snall?QAa)sWw}NSh90vepw-Tx3;j#QV=SwGF;eK(8I(fqdxreYe)@M zZ3`V?L20pV-mBJva_d`G!gJ*HH?y7ig?uuX`CpCai2WAZ>y_5(8o8;N+PQjPrhbu`bexts(YYXPwa29v*Q@5LTp9z&{YpFH0~Hz zs3+uB)mbA*1*x1Xzm>FYeW>p0`<_c`l51^AG3SBVLXW!|zs@yP-_L<&tydJkW{%%v zIpn4%b;Umzez2-&mkQcnv$x;CrF7c^zf>#^me|%Ve6(X5@BR_Vca*nUp~XB%4UVqK zGCmoEv(HvuHt1eQ6>b~s2dq1~d0*HtL8Tvaj&}^y8W-Zb9zBS zt*HR_BUv9OW#HJMA$c`SV1>PLMQptu}_Tm`bu;E+^JrZxla1l_k|%B&k7-$Bsbj0 zoonCjuYT+Q5#*DoJUs9L11>Dqt5o(=Rq*#)32Jcq>f7dl5_Viy;>TYIUug_;Q?HX$ zAs(1@T3^zoCPDAB_~S;OFH<0|cZY^z=u~Tbx5}=xbSKQ~O?^zA+Owsue$0Jyu8NQP zz$o`-aa&iyQVbs9@b_X)k+twk+~4j`JFR;I3rS>f-ze`{l}e$YKkD#xsy~Fuf@wMK zOr{07{;9eTUX~W^m2H+OtKkO?ahQ?xItnm@YhQm6JoF;Xj@#{A{rfsc*3L}9TQ^ho zlb;OqvUcNP-Y$9Ohkfj$^Y*JSc<|Ei_;LlTR+4*3Cb)gC3Z5+ASWqj>; zRO|ajx1SjJr^4yPn`z%!N53i0lhP7DKF=d02-#57)w%FQasstlpo0^oW1FY)VqKZ+`1T z>S4_J_FZ<}rP9d2>tKxzLVl+!4+U9dPT{r2UeP-PUKhaH@!3#uFO$s?Gwz`RHM7@E(lJ`JqhCL)s}d}B+{?MaJOs}V#LR39$eo_+cul^cw<>nDI=jdTe(&(GVOSk?025jUdy~o)37Y)>EV& zHRuu)EmOH1JvtWU=u0{0nCpc-iFoTa$84K+AUEwzeebRpYZNVJVG5N_==s{4MxcBFd`!vO9(=qGhagZ#NzXW5hZPlGfL_=VMZg9p+4m@PclPfYMx2|j zppV*{X7j9@QlO6pn;71)FNi6BDTlq9EJc^r-qZz23#eg+yz8OH3vtYV zqb}E8Nv#^mt?d1hIfst#sBOAn_%02IR=MQJIL?MqD*;%HNlHjg0DK}boZ{i?S_UQ7LRlZ zuS~B$OTM8L>tVsp#>VkVhGDPmketiP5$Wyl=FsI6V&i(flz+UsSK%URm|RRLKBP2k z*Uu16S3YwpEY9$Nh;rvqq(;N+=!!=sefdM5s>IuL!f1T2Y`A>++TN!XkC*iJ4}HoK zZ&L{$<9TJs+pq2Ax`?VKdsB)}D}A-^pA9!HoPjrPWlAs!aqf{;kJc3$)UnKmA6lqq zfSyMPO@yQM-glF8s~bvlh@lvbQcLkjOLL=2NQY?-ke6K4Su{`}K!G|z#=HuuJot7h z`>wsFY-OPHQn-ytot7#Te_iJ#2&8jmti@DX08%TtKo&k7yN5qkO7NckA@guJJ6kK& zf-w zw$-3(HCp>#Ih`RBkBT&0Dmn(+H=xIASvI|%IxHq0Z{TTcRJkzQDp0w~XyYaU+dQYJ z+L#aiR62iuIDW~YWv`-+ov}w{nh}*LgKaa&KrPFG9PYIGJ)Lm zW5efcQ5!R-T4%H^0$r*Z+4L&tP?>zMpg@8&l}C{lNQzgWX;rqmO%R(ozIld@L$9+= z9A|(oT(ur_qI_!fy(^8GDul_l5>%kdR=C53}q9d+Gn+mRK!v>a!ira(KoWGNc%uV z%V6sspOB&BOiE|u%o)zeVUwbwvuJEnl_nk!e}d3)Ps!5hqsrp4%~RY}F>+4<=?ELz zq@=|to|U@1k1-fyiKkF=tQ*l`OQd2;owG@?)yd}4VJIDheb5m$v58EpP}Em*Y#O=G z#uvY!;@CJM&St_%meTM6MyS(lRAMyd7yqdA&^kq!?b_HTC+&u_p*HP?%j-oN2B%jY zJPm`(%dk%A-2*ByvL6=lbP+)@ib;>97GSJJ5W5szZDQoee#K+MohJ*7TwcQ8w5i01 ze>lYd5osYG@jZR4BTku=ek#k$fE}g4{Uk!Jjs{CXj37*imqNIoSM*U?E*|41?6*fS zMnX8YgrDk3e3@R+Iq*=b9B2?D%~m zkNI|n0%=0X6%oaZd#|&Ne9>@~=xf)A z;$=P$L5T-RmP|?H=gY5RDx=jnAzf`~?K%-y=QPd7|N`O&<4^U-j<) z!TBX3gE6&f(3kZ`;}`KKLinJC!x8cjd@G|0pMcsjvn>F;(z>z-_sM5+(8Tj^r0AcdMJ8*#Y(`vch7|uk@6jb zS?bCx{`V8DVoFF;OC(6qA?lHYXq)ed$ILPi4swSwsI%Td-AW9)5AHa$Pd>cnMse6i z`@bBJ>Q)TuKr>Vt&-cz911WxUvxpq=-0MZYm_9JA)+F9mglW45)aRe;OVHG8kar@m77|!u2mY z!2%t4dhX~B?6^sgh%g3UpgqJ93_|30bdNI_tbvx*WHAu4{VPLs_c5s7RTB3zINpsJ zGI)-`3F!O1&kP&*ceNwO45$@Ka zhS!95h~zYGUCJc)?xiv!Gl%~rUM92qlVQ0bk}sSIP5!7F-)*@ z;HjnOg2@BJdaaV*l8ySrb_3nNPi+6ki^B~S%FrhaD*;q=l!rM1ycQqBreSxyDx6@# zK<{mNz_5X~A9%yK0f^2YW(vp*4uus1vKa zeRRDM71VJC0*uF^7=|+20@wt=nWq?L28`9Kau^XX4uuu45I`EV4t55#OHFh_2Z?&` zF9HoQ^ALh+S1Tha;>eeq2@%u=>%9{$-3}W7W`GLiwiR{MU`wMTX8Tdk|38_C;C2`u z;*%dL!^G2Gm;oT^T^~#zXan{LjN)#bk&shZ2{0~bzf}?)sqfuu5=Nv{va%sa+!+ZG zwE?Kvg#0heoBB>@EEOX@)g6T3WIUF*gJK*QtpGDUa$-CL+PUt=hz+!J*Nbt2^sZ~% zr0qJoP|rINYPxs~<3`Aiz;F<(-i$;@%t*!=fWuNWqZt5+#4)-9yPsNAWq+!BB ztamd4F+~U6j1@pcQ^p`;4BcJ$6~kx7c_3Qpa+{G62qppVGV+n#)oTA@WCIvKzhX=y z1|IA;y$rJ8Ef|E&;77?=z*7-DxGq#Y73PG2&q= z0G|D88KyzN`i0c>vmjLW?rrfPJS9+Bdg!m2i4n;>Oqj@9c_u!pJE0DPE$+DFC`;!D zEFIM_97LWw6FGt>8udohOCu(7z{s;*n1%tio;rOolBj{m#sm!T9|;mgVhL!1=EcMU z^dtLoCT9T3jA2rtxRb}fLK&cjdcX~E{>^jTNN^q#Dggqjhs$FNnSdcrC}DD9xoh6< zF{W;ytbLk^7GS?L%Y=(g_;1E|IG>LpfYKun;kn2pfTUkwLPh2M8!P)ork4P8yv%e7 zKznOUA%HISUzvp2@9+vqnRx{6v=XP-G_OXnS^^>Jds%o8n@QZbNJ>TKPN2nK#MP!3 zP}K}r|EHP+2~}qPc*nb0jd=uMJ+9B}DRReJCW*Nhpj9b#*-yWJ?_P>LuyS}LaT6hU zs+qBn$|=mH_wTU3zhy>cVECuH$~$H}V374|nOA|C@%`^1jzX05F0B7&7&%{~49ovL za}^+ED(=(8AZqpuCHmK`d?;6&c@wbimlnC%N7(o7wUHot5C6@p|3)jMlld?3)Q1i- zlk(j4LB1aO?GKcg7!U$VikdU-5XUc=Q4xCoG`qfJz5;aob;TS9EcGNB%Ia3AmGc7? zuyWF;bJHNF{xG}X-jPUQu?*ARLD=*xFY)f6BzBh9fXYhBg`ICvujSwq0K`2RC}I~b zmL{Opq~!<>W9NJKv`+u8-Ux04YC^K*XR&dXe;@)j_JpgNXzKu^*4EY5^?wPn35 zw?JQ(_p{Ukx|=+HQV0Z| zO&qYW-a&|;$1G3oq5$8yYm~L2W==KRL1mPKY4aYaPUpHyDRIYv6IqDE8U|GV@kd?@{Iiz3>{xfzT*z>I zRs}$%5hB)yKsa9P7JF+upoyFb84JQAkDC-hT*M6p)UhOE9sI976s+X{@0V}zzMP=e zh|egGgM|K$gcwOq&B}O(h`95xv|z0N+rvWj7xD!SYcB3xJD@ODKb$)#lb!Vn2w`RI zdo>z@a{s*807qt1dO%MeiuAuntOdzu{|k$}BIFbQNzmft zW$6ENt(qUdFWk@2xBN&bI|1Wx2A zNdLPX{>}Rw{^OYTpM3-WuWAyURFh&0LUm1)4&lf{j83+ic<^OX;T3i(!Jm9~T2UETfKB&u2 z-|ePu=I-RSNi?v(AVndefPvw#lkrL7gA;+kRba2It>Azkcj8d*4iLwI6Re_nc&V&*J5N9rlX@8MLwW zP0Af0c&$hHP=5k=j{YJjzlEpSAI5nxJf~yGoy2*+p!jsoGdSt{JSlCS=9S- z|3aX;hyCP{=Kn6vJ1Gx6IXlsRxCdE&Y@4wwd=Sm)6=Bye%~N;zqAICX#Hn4J#d)|d z&FVe=Yk%>9m(yE$|J?QA`xTG{I6Wq~i|b|x2Nd4RpLGLfw?3TdVfXbXkZQ3Io$Lo1;yim+p>YzMZ4J=AkJz^F|-I)7Ens{nWx2_hostU&;ys9Zm6Znl5} zxNweE%zOV=G1mJK#7X3!%Top&{OT~KZuIgnhb|zxY!hY6h^QoK%O{>L(uFajCN|%y zv`v&zSLQLovM|_BYP(PdW6_l{sGNC`+APAUwLJf?+2Sm2Z8~-A!+>ew0{P#FS3AdK z47Dg@mwEw=(euKIAQKG<{$)GG!w{TT3_c`O<+B)3zIqLsf;>cB{IaN$j`ETVuGaGB z0bKwG^1OhH&C>8)2jm5jP`8Cslo`DZ;-t&`0SbBe@k1lXWE9HT2}uV}hM(O0u$1nH z?56E^Txhx=f7!yUWe0~YMx~2mDBaA`ux1B`Hpa>6fsSr=S=7C&V*nkUOH>rk2fJfE zMlM>K!eN?M{I9gL1E`6pNv`>JJ?2+abx^>rWW?QIV&11yH&|`9EfFJsq zPaB<`OH@|ZZEjnJpWXa$_1M4xo9@zFwowp959z^{d=pQ!pMw%XzDuIE&5~#q9UBrJ`-M>y9sWZgs&>RWKG6svDk326 z)F_J%e;F*WFU}~I4!;aMH(zM;>@|t6Uiflpm`<0cBO&{OO7E+pA@?l`|1L-drHGl%6-o%&B(x_e6yD*I1wQA`((!rBN0U>Bz zsg5}pzg#+9zO&Sh8EMzE`4aUsz8w8OXmPW8+WQ5(%Cf!GAz2wSo_(^NX| zvxZjfr@IDGqiVWF*Y&iHR|4Iq`|&R)pikWV$$$>r;z?Xx_z|QDowxD9+(|-;2&P@y zFt2r{FR-sM!({JyYJ}v$ZKq)ESeMBl%oj4WSt_bZ4TkDA8)Q(xxTET1Md-5HGCjW9 z4j3x@&o#|(nH*0F#%wB+uL#$=-d;9am8GZ9;s;YE>TG1MikgN#9GM(VU#r33=Qf;t z)`*GeI$8hc&A?T;ydYOlP*T|AuCBDBqST<+P;s$ttRZder#(O(T2)2$pxJpUMvehm zE*@0qWW{;icg>*CV?ik+Y^3wk3djnFx7zq=w_CoU1|vEpf*8@#fdOuA_L@SFYguye zd64O}D@@RSWJO4`Ad#i8tLjyDg+qAFRaS$gB*j3!1HTvt_1YRD6f0|R8pbN?$^pfr zR@GXeN}g{ts3c%vPC~SPT2L1kHOPc!9+jVvC`@dk?i<2o!C)S0xnInitZN3Wga9~JK zjOxAtuin$9`e9Igm$l)2p{Sq@pRZrGhK#-k?n*fA>p5N!ZT&vxerRahdx{oQT3!m>MFS);983jT&tW?14Gdy#x2!wwJXN48vfGCbo=@8$qC19#9;PW zpoH#W!HeL6?Gm51bx2>ktt;Yfs%<`%M zPJ^PVAPS~wAmlh@P-3iAPVee?T?vDhq@u5~$7^!MTjqv=$HSfxfW#557zWLCw1<3M_a9s2U>P+X3k=7UQJQ4;of zf_5TN#La8qUG1eVK-6_Zl7w2x*eP74zbaO2m$klLZ>Y4Cot>49eSfmQf=d**b4H@B zgA>ybXOi8f_S=F7DbYeXnIV$CUeech#9xeA@&c`Vyd+#07Tg7?ny3KnC9$WN z%1Av)DW)+#-^1rAM^b9h!@814_Ao0em1U3T6q0Sff^5QU$THvPy=It4(b^RKT=dAj zawRwI4TUMk( z!lDG{B3IsaU}T916V)+hM3TAv%@wsBVd1DtS#4G97UTgLsZK-*V8r94)Yw!BF~W#U1|N(%#1dEu zg#?NbbxdIxyC@!aqm5NNZ*KRqtY45FvURiOn;NNrT@#VM1WL3y%EQEGYz0BaQi-Sy z%@lFZ4|Q4V(S=skaTL7d9k|#C9bS={n$6hVSDDJduFE#|f^hd^R7gHk-OD{zU&zwV=Z6yJ>OmHc3Ilq_!n2Lp`?COV#m z$r@l;F-1=^cw`J#q-|k=cmuj5D~eFXPZ`>3TM9@=fJYMN4oK^z?SEC{lOhf|3oiSSkN6t#&$q<^ zE|=Q~HWM6oO*eBT;+N7j4!=CWDaU^OS}rIh@|GcY^KZOT@Y7#pZYAtuSXDuqvlM>?@ZxN(>L|#^43~}D+^tpm(#5-6$+hD)%g~!p~kqsK-v^)5lWRwlP_UuNfbV3UeHR#SjvZf z;;|qs$D>3OS6Y-?XkZsBo~d0`=oh?+!T|=}W0;c?ZG@R3cP*!5ngkdbajOIY6Co8= z#CXnIJ?MrOy4CF&9XF-NXkB4s=xoXay;R5b7@pW2#k;nUG_loKRO1qVYHY)Q9ab(c zM+R$&PK{x0C0H>^q%FKuq(oFT=d%Y}%0Yl$830FsmldJgSE<@dFFmp1NvpoQ7J3Ff z>u^dHtx8u~C5T=mPwSPSn^jl=XtE4VX1cnA=Je9Qc~k^Nor&B3K)B4+$8sISYIvaq zc+?6@Hl0Ku;v0z#XGwh*j_Rtct_8o%MLlWMjk`@Sa|hxQ5o=XEVb3J{(w(`r%Uisx zgb_(wY_mo$+*E3<3BUlar06?}bHk975idG8gqcN% zQk&DP700z;SQ{^hr(>4HU3!t)D#oa3E?qvC?q0dc>`nnf^D_>=vhu)STY4K-1;n!@`xd}Ca#AXX;y_BmFD_<%NzDhxb8D$d?~ZMlXt0pqDyIE{-s zD{%jWF;)+`4=*a`2S~U9J7qLEr`WL7!IkJ(M>p!bsAMYaVZ;{U#`uQ419o>?pDaf- z6CVUfBc^8r;O^JXLf_wK51xR?z;E@g6e+TAkp~j;Fr4#|FbwgkVcTP0w4#0k&Ov7` zmr(9Am&?yLQo*G()v@agJNt;wGxtOn!*Ux7*!bI<^rQ*;U#|Az2;A_Vk;mT^?adq)zg>c#&!A?N z?1wiy8cGOtgslYtlVjO8AZ^3lv%dwXrziFt)P$>cTrM15W6*6D(11`#z$KN)G@)$- z%-f8i=wurSZ12p1&q5MHH~yBVFxLsMR)OLW2|uD=Wa3r~YsPle#pKj$ZT)f)WOiG( zr?s~bTOHe&gS@QQ#i>e0&c?2D*w`9 zDt4wtt-bLgh;}_fHAH1f*j2$a**14$C)9m%5Z1E|_b}BMj#DnyeG&?sJ_!ZRjf{KJ zz`QXfG+P9qOE-Yq8L@3s$9jn^ESD;d=>%P7TbiAkJ+{{m&L2z9>JdH$0$zLg7)q0> z496*(irJu&N(gzGqlNM(s~LV86L!~o{f;p$q~+Y`hJ={;Seshu)oNd5um%o)%0Fb= zse{mbEJK6Bv2&f)9IGLFJ3yJ58u7jydZCk5C5RAUzBmo63ygITLv4w`+eVX@>THFy z1IH;o(@ddK`=)3;Mr>LFhEsuhz{VRrr<}p;wr?OjlXSoRk0LX<2+k9BS3*K6OW}3p zsVZztc3IJvHdN<#oa-c&FkSMp+jCK8MU#X?$c3}hpSFIS*SpZFf-^{Dayp{F%tf2t z>sIOj!8;w*mgU#MW21+zK_p?i1VUkaaz{UceE4HG=)X`|-6C+S<_bax z5PzP8DD(xj@*r0*KVbbz(SY}oCt6#Dpp38jwZD;|-nc$nrLP#_wK8B&qGNtr;vC<> zdZDdr|8zFa!QDZXS=}P1IPGfb@MK2;hmZk)kz69l!h*$KG8}!zG)sodp%t1`pDpu+ zZWZaVP9R@v3_G;3EJ*0EfJMb5k|M{uOr3;l7s?G+*lgBS63!J_+{W0AaUCMUeY8~+ zcJ`GuWHX8)lqdVkp_41bQHKnSPpMEIu7ydOLikN4FYBRnWs~$oUlc&?Gg}jB!d}Qt zkiA_;ktLRjw=GCY#y`EMKC!s%ga#7EgO{QJq1_hB6Ey2M$qeV2%Ci}NG6!iU=5Eq> zA%v7&a!#6dvQJI`C?K3Y#(~=*nH4TU?Ilv^WzkSB9NPEsEI+2F7>^lh!Jw^6kR^1o z^lh3xsTjjA8zKpQwL`p-yMkBDB@pLQAN zDWz+QmY)3x?Vpse9%-!^gUdI%IOan-Ds)n?2?VX11Y+h76h_)tWITqHyYd*jRb;PM zO>Z=RwK)XuYr&|c`guxjfvwH5Q9nkSCe1AxuWrq3aG{ow7*z=LRk zt1w@EM-Ci?sVQ(?izGi`?NiM&jPNGeodL6@)(tJ8ewk7=fz-mJ<5)MeD{Ff{)f&z- zjwjj7G>7m8a6D;Q0!fcow-zaDv#6AvnhcYpS+Kz8Of+%0$kHvb< zHP8;pG_B#|40@K{ZMn(I&KcqNOw6G6OWtBa&397GJJ;Z3azm$GZC!@ACJcm@%&!*O^zf} zIovBG;62&QGK-KPB@XMK7WCzJ0L*__uT|P#i}ADLCvbcMh22F-uS&HV_woFl zuHq@*lkxQNpDY}9KLncdj0NLqwwxM@xlBhbQ0JX4~gCPl8(mPkCBh3-5-%N0aQb* z=G$40y#M(&Nb)fph4~a|`8hjYMK+NX<+Jq=M&eut z&qT1a7^IDq$e6!UKI!?1J%!C~xHg2zsT?+3`4X~~Q591OpNVKKG`X}wQ+clrCz|c#ycw?P-(f50y z)LW?jBb31U*66|i7;t)`9no{;9{N%Hu|o@BIEwpMMn};X8@Lle#gFq3BN@3T{q3&u zW11GgenjBZ+J9nXj2(Z7Hvoc7YzKWGu6-Cv_QGk=e&<{*kzt^$P*B^i4!CV}AgiX0 z|ETM}Ff8Xqd|xm)$=9BYI&KUl`}2=Uwvn7)Y1c?Gn%deObKwrD2_v6x{wWYc7>I;|~F@rDa6C<;@CD=-*`@Hl1b>)o$tq zWTE>NE4h@o^7omNV+@K$K>#h$0$I5>^CdWqty#*r+J)b`N?$;T0*T@S5t6XiUQMoxN=iuciC+i6k@`xR~ zOe<*h5MwhTH<~T#&QeWJ3`G`sM}b^Fi#7m$sW=rv?vhN;6}(q+AfSbiEQ<*-`TCm1Yw(-mHmj+&Gxxv>sH)~ zN*NBpO6**;gRru&D*)83PrJ2ih_h=C8h^Ly=@Nxar|5mT=V;yIy z2_dd%tqb17YT#>VbvW-e9j&Um@I}@-Dd_T+q7ipaP@a3^=5%N|a-^m5bj@LChM*x& z(9RL*-;kslX>wL2TM84>Y~51e!X0T+*(?=pW|P6f3n20iw&IIM;0gkJerSWSciZ`( zRT@QTyxZ#5ZD?i(lw_lKE%yU2`0*DPPcUm4ip1u7!EaOyYBkb*LaTS*%LFo1^_a2{ zqT#EcG)cFU`B+`?dhCY?Hriw zo^T6ZdO+^?6*31DFE^*VF|b>Gw`EC3bF1!9H~!XqR2e-*CTmpef!DHLZ*?RwAhrKH z5v1n2V<(DLxt?TePRQJ*vjSGsn0diYAuTXs3EVkWNRbvI!9mWYy>r`;j78YCJRHd- z4`wR$ysTt+eN8q}(LNoShmfm%a5L{zD!UW@4!~r4kX#tCIANYfM?p(RkEhS*7&%Om zlmp6vH*9k4ySl3QP*@S_U;jstHmfPlJ8H%yEX*tf8hv6)Qo!THQcFlB$29Zdg2ZM1 zOz}4`${{?_>vLD-42#%AAUO-=q%nR@ff7c9VXj=61S&4&)mTmX>UfX(yQ|{`OG-&` z72qTIQ&9xgs@sS5y?*d$O#G#t8=pAq^bHGFbFdGXpXU zw`r9s`>1$0#Xz4g8!Sy1f5-NDlZDep_-Pk(&Yp zS7gO)CnNMMq0YhWW8@IYR6{`qpC10e@5-kYcZ;){eak6cdg@F_lmDu)@q$~sKSaih z&@+6W>!*XxKqiQ^+r59uoyusX#|7BCd(HIUA)h!Hm2q5W%N4uDZWG|fy{F2og6u6R z_^=w{>bW#d5`?K861Pa_?rH)yWzn!Q!oI<-m_1^(FXBEa+@AKy)RtH1stSE8#J?id z-gg)3?_~#py`S`CPY5~js8{K-4V-D==+ys7QV&N^$F}FxI5ywQMW0@*XaP?0eS59* zF8*!S1pHu($x`KE9tF4x0FxLkCFyYkKW2~h{?@` zdUsp}(x401=I#z&g5ut}DiGxtJiY6VMH=4XX*)L=*d4tzHRp#S56;qQGxX#N=gbKL zPMQ!^+1lHx+6oi-2t?4BG@jJm1ivQiBJ|KA=u`-{Ldw5lFUg;S?~>5VWm~&GIjW3( z(FCqKPp+to`QHl9?*KcgnG@W60|R|1mU@`=qic4SBUpp|x~!==WL1yBCe2HV*xY4{ z{e@l4;yYj2pSfXy;4VFd)q0tYwbM&4%ADgfbiuZ{WytA??TnKVcAL-1!?E!kkzL!P zrC)EOs~dT35{(;@FMi9>H7yH|$_5)p2Z@DFt|J|>e9Fr6b$~S4eWN#U2~}TV-|~(M zwkD!CG+Jv-Da{^TjzuH;%EMbRSKDTnUb)_6_q&f=<0W@jy2x+y5!we+@`fb;`lNnP z-Ze@a(!bx}K)7mqkAECj$@d>Ef6j-GXO637dyf@u7bzaTVq1^9{)?1o6N`dqDY-=p zg8~bRcr>1T06nyzzHiVr=lf6_kQP0(E+9a+22>x9L%)w3;opX8qe~(;M*j)j0Xnc! zr?mRXdKP2#I_f*yiYFEyp=0l(7T{6-d1y=0bSuwIsWYdsmdEqbm^N~{J0M9YmpEw=tq0Nvplwa+ud$AoINN2a$TXHKv)pY;&suy>NSX-pyhC>XfH`o+VS%yRc%KU*HlOu;U)| zrsNj?ZmX8#MGwcPH^ZBZaR^iV7EVWd_29VdQHpCrNh*QhJ$>zRZGvE{B?&xi0iXOvVsfMcsZ40Hragb}M7r9{_x7}`*%jF#Q9IALm^Cs&dB~KOpSZnZ zk%2Moi73A6#{PG|nU8S%z6I2s{ZSqN2l~M>=yJ)BJy5$P5Y<{bj0fCz)gL3tZ|yeT z7GOl{#sV7Qka$jq)Q*^V_w3^^2sY-7aj+=82h@fd+GpzUTL(UDAVuP|at~4?#$Gpw zq#J!E=%VgHHqyd4eiPom{Sw`c+UX1vbI?wh5LM&Lz>WJaNl!urfWJLoI^(q zNbRS8;gm>!(~2klL6Yi=I?`{<0EIt_-BR?!|8``CI{~K{kZ%{uJnp>4Yl9ct zj)7~%4EZE9FHACbsOOeP%TB402FMbqpEVns+=c3?W+-+-IZ9jqg%$a$Uwm+4IXr;` zB6Fc&+(9%+XnINH%M5cLQCxXwz6GrV)lp~j-;MCV!(f2S;9tt>KC-fY+!U?g4F71L zTNb`=Zlint+jC8tS6o<;9bD*dAvO&Now4Yq1Bp1LC^t(OPy>1g{e*?Q;ls1bf4@q8_BjA1%*pSP0re~+U-$R%``*g z>GGsmv0e_t0{6>@Zt&G}9bgG!4udba{}$6Q)Zwtfhh@cBq@AIDhI0802{T>8L%mONL`6#WC=?Zd5WzeLZQHjvMsgu73*8oRhOl z^MH}7ekX8;y}#sF;WR`0oUs=TOfeeSdtCmB@|qb1-Gc#vj4cE#JMS;cqOMZ$0~S>5 z(t6Ma8DnOd;jR|6QdRJ-(t0SV76Hnzm2H5t%AesY-(?cZ_ENy6ehXBoHhatf39GZ@ zCX=pp0>}C-I#YGZS2W2xVvp+CEC(JxcajIC6}SP2Bqd>pt2Fk2Kg(I;<5bs`?SUT*O22{>G!vP?s>ZNtzt>a;KH2IMmZK5$~8?-TXx*XPaO*dN`F!}L%}w=j$*?dDTbs|jX4zqVolNFgyJl+ z4(-gQZFntdM4htP?}q$tXoukqt;vMLXC$wTfSi7Pa|s||TdW>U1<~*;HcuuWQSTU5 zXGVUd`mK5n-TG#*f++q(npM5Ntz)UxePL9C8?-(KL%2SrdBDgXqP3r zm1;vK-hL$l;N)#>gS(-olV(gJEwMCf5Zg+{msp2Iv+l!?7<6GZQIc)^QwqyGSTQcM z3#`YS^8#SpUUC;;SKftorUIo5U}5$}nc4;scY^c)u?$GgZ>_LOE^~bz;?-C(uP>j~ z#~Llnh!kaR1><@CO$l~SNUeGHo1`euw9*BUY2bI5=xTl`2pg<4oOm!Mu%r!1vodLjXix=ucYCS-b0Z`usY2L58^uhBQvI#3ro zBkPdc_>P)UMx{SDu zPAwpv4N7dFGSbqwyfM#cwn)(~KV0+jf|$*D&AoWAhZye(Z~QBS^N$m~!Ayx$=UUWQ zF^Km&%g#N?X;RwSBs%dAEmVwFTu#na`-d0P?q5|i`@mNVZ{`xBw&_K2LV0R3@g6o^ zXj=C*wl^~l?Dni%S~pn%FBw>gPZ*ldqDFvF-1pkFg6gSd$WF)(oWfNtW4A5h7Hkx> zZ|Up3ha+w`PGRXy0|{iM0Am8X##DE5 zI*#CqnVpZy`xy4XwXp0ByaW^Pxf;$=MrKZ>eF%PtM$bIU#-4{4p6Nnr!!|odl^kL% zfsq%RFsAmyLg#5J{02~3>f5 zGdLyGjy0)&M8nIIZ3MbuY=HTy1FvlerwmvjR|GjCX@z#Zp`?Z#AvYco4W$b*mJ3am z2rbzAQZ7AyT{CQr5S>D^^sCt%D!PGOnoRC9ujRcIDE-;dB41NIJpjW3GIg5 znOHq!otP`G2%;9CJ|2y*t&h_Fi5C34YRk!_P@vIHq9UB}@}L_0kz)ZDKlS1;H18BP zpzwsPG!$k`U=j39lv<$@1c*J9H>z!9SCG_!x@lmq&&Cixb5j{ykG09U8e3UU9WHP( znU+fNj_QtSOzO{EL*MYe^xYKV2Dc`ioE@8vM`7 zHs(N&L$W1sc6(3X9OeV6)~zJas-6H2XVY9815)COtW1{EQY%l|1jHUJfzyWIOUv4Z zpdeLHr?eMuZuU_)wtXnuDAh> zKQi0-pB6KgZ9Kwo>U}NtZtXo5@Ks@YR7UD=hU^|NHOHeI=39Oc$`bimmj}z5ZyFd& zg}otkjx1stWpq;jytH{-8QYx}6;FmVZBIf}F(<_E)||?#_`c3UzV=*OzyK<B1C?bk8ToqOdg5p=^keAG7R+ntMk^X~Ktjx}^o2 zjuIln;+D(yw9KMvf;5aQGwrfy?IVM(_I`tu2qnMUof9))JkRtkMKa#TYhy2R+QF3C zC~Q{-!Ndd{WLswOvL32t<7Z0vjDz%?;0)UE!8U{!ZQx-mRhF(f%G-mA^Ey3qjQvj+ zc?nw@pKKJ&CE3xPwt|*j5Q`f(c3AaX-Zqr5LWNjE=X_@;1X+Q#PH60nO$+{K&$}U` zH&Cp(twl7zRtPk~;^ntaKfajo4b%%*$rHkoCKtALcS72GW7!(w69OBq>oH+DX_Nv# zene(H_@h3aRTKJ>DYc?<&a9r;gGb1ApPp$o#mRFai@lM3KGX{twu!wXhIg3vnmA8{ z@09Yo_txyr3Gfpz`<)*D6O<&jvmnBX(V-~z!QnIjT3AWZNv$re!|DxOaIY0piaq`a67{SAy6!4Gs|H5ULy2 zmi-|hSuPQ87;0*rBY+c!oWcC?*Wa(G(8^M$U`)E~!yV}Qt*g32Zy4?-rb}&k8bHwi zJVxU_sH3o8cp&^XGRmx)hHggGxe_~XmVs;mdp}q=SwGlg0t`0Fl=UVQ8C0f|f9##U zIkuF6!m8Nzq6xF4mY7YVSYV9vi>Y!DEQ3N4-h{a z0wEz!U6*1B2Ny9PTeXEmmt3?C#FPWu4Iu4V*vVn`Th2hzHHtaFFp5@Wn3UQDXmh5X znw4s(w<2N5*#~WEyYnNp`Wu%Lm3&r5c0dd(KF4CZR__~;nr)!BDfj7AG0Cbn86m8l z7Z_BIvMtI|bKv(x=7oJopB;}ip4?FbD4QK%s!O0=-oXx5(k$-$Vium^OzOXX+xbSN zKT_jP_=&%Mf|hu)Pl?wTN_euW z_kGu=!zG??zpCI&?`8dfh*k}rux3qn|MAq^5%R>G5W^!J2fZ-(LGs7P{Uv^Zr6_3wkBe>$`ZR=mE*goj?%9jy^WOca#X3{{ZpB>uFWgjF7UR+m%EfL@7`F=*S{4Ix9c5S+b6-LSRmCCO zaBQW1kTHW8=!Rxa^1$Ax;jbeg40#sGx+WK?SJ8`e{i@P>N1HM1Eobimgh;Q~Ub5qw zqU#sdsfK-ZNg38bi2ciehUsR=A+Yh*63oVcF{KX|UdO>p?w%L?-zDKQ_As968RB1j z=vv1}19$>)?SVgUjJW1FmQ$K(K~B)4`zZT8+Qhk)s{ic+UGh*Tl7w;3%7%x&G`aM6 zkbg?Vf?phRh3nlU1fcNuxRb9!aE@!m(Ha+;bt+h>7piEXH&lc|lPyU{9KM!B@&L3l z7IdjM1ZoDQl$7!`s^z|2W^ig7O{|!0zMO*VRdHnUqmSy#LIk=*Ek-7^qleIBIW`HlNj^s0_2em7C+x^&I zNzu(hS%0rQHF`IJ`V7N%x5GJ&DMSx6^$nNS{?cwY^2MoWFOQ46^xvoAF`>VV+WF2 ze=a^8>{p%eTjG5ZJt*^ko(_ck&^7zwgO4AWZ4vbTo3HhCvFd_2`jDF*td|F@x48Ph z=^*Z~P zluHa$#u;^Dyc%(;s(s22?A)1JQ7@g@_gkEJqE+Jfo$~xzhz?=%jrQm{EtToKb44i@o>zB|AjhVP^59F9docbR9?2y8Gi%Ts;m5~-ldfKPoBK*ZGI7tfQ z9Fu%JyTC<05YhjZjS$q^F{(@nRIvG~hD)xm4t{uJDF|(0_8ouowT&=SNum~;^bHm% zAyu|igCER`$6=>%x!Hj?$uNNuLwCOBv2^}9&eHq(Det#;txk9veixzfRDx8w zJ};V?8G6+K$Z3P0EJ8y5T$;VFu`9>gXg(0xO5YMqthd-8G>YqJf9JP&W%6FN z;&~O(`WJ52CjYp*ae=@T-3R`>zYB&i2WYdW~CZuo-hgFy^>uXpaCe(Nuxf9i3id) zm1ki~K%a^nPbDu`O~F!pnq~qoC-9Nc4)W`#+nU+?1GZyRiOfLV@<6yKoAk{38amz$ z#nh#0&CU2t+!7(H$d`o?yv@z3Lh;RJb3~BizQKqj0gb)YYhKs>AdTiYU2R}`LWKvQ zS>@}=$|Aho4nXjJ{($vG+&OUi)_&^h&Rr5l0Wr~jEXyZC*7T6e^{`ZqMt1>dy(@-< zNxc#riAshY3)c4oRcab!uutZ9>Y3cQ>}|lWl~~qax1Yd~hR7E}P|Y_tiq=3E(cMPN zy%qe>eY8hacmVk8MmcFcV+WPI*cuVyX zhKZh^-zqH$y_5!S=3^}f!j-14o$2|EfMP|f#^3Rt@&)>wz+bi@5ELOEKv%NpV~caC ziB#RmmsFmdB`w%nz@x@b@Q5FBzxq4-!>E>KZv<66=pPQB1%UxT(63^cvzz(B_JQp_ zFu0=xBC0Qt6@UR-2WSB5&fey}@fV5DxH|&@Ad>XHOcQ%|rsK|BL;j0K>+{Jf-#ZX6l6#of*!qHTY5ZmX#QU9i@j;#2 z-}|@wg&lJKTaf#kyJ_=#lKk$*6Y4ua{gz;U;X7jW7LYfe`3+Y6x~s7N89QOi-m3}J zE6dO$=g^}E`Q;z~fmLvq797<}y7fU^a8Dl+1|atNAUA|WlpG*V6zz~e+7_)iCH*k^ zt%pa!BvLSjigJ66G=M4|g-=A{6^Wiesus?70GmKNgXTMITG-pB1&i2vpzR(hXjC+Y z78l7=4^W0hqL1>qi^U}C8QAbcA}$t>PWDTn?u-&Xa&Roq{tazfk4bADF?ht|*v6w3 zof0+7;hBv|k2CZO3q8rSkwYk#sB~;mg4^9if2MP89iEwRLD0F@t!nh-=gB9 zYf$UFcadyAP*(snCn%Z)*##6|iPYly556D#1@N1DHOahh{4~#Yw4EQ;tSHS5V<+oZ ziByW&9WsSbtu5(;knyR*!?v1`JqrL{4B^`EG$>S#?~ReVfZi)govL;SHNXCof?JM|HB#VEzVt#{iyJMKI#K*Iwfn}c_N?j)%FtW zfr|ZLZKeL|RNHQ-zS=ylAk33E_6qn3@-2h?$4IZT+W?852`o)a^yS|~pga(HW@Gm@ z1Y`2x0!x?itGE3x;L6W7jiAmg>jCo40NNkPGu^pz3(=>d5*Le9FJ*F6%jbMs*M}mL zTS%|ktt7FJw03VWUX5}u3F990PS5It3XNb!eC>|taDH=OBY%CT8vyZWr%$am1dZir zYW1{|6p7`zy6(3DeWR)bn{}3$wdZRs{2j#GLhCw-xcW&jf^~o&!kue-QO~U6YsfWK zzgU8b^^28C7uuC72Brh4(ZP#)4~P-x-!LvF-QNKZM-mzI6b4;f&|@RuDWv;72}Xig zWN|^b9qqv9RHF@&Sk)}h#`y3W^ltR-j^i}U z>UgEppynH8ahY#}zQgGUaCa8z(Gf|62brb=MS+P5I*dFfN{K@l8w661Iua?CP7y1f z77j&00%(i0qE)VE!+x?VCQ=;8g(nys-SFn(|2d>BZ-w3Z{B^#|*dq8E)6m0y`+6aL zQ(iE{U$8g7fLuj1qw&>Fk(O>j>#O{=3k28)(%&=|c3qybFP|0dW0FrfQbfdSgo;=J z>t+K54MYD>JpDQx8dso^3ostaaH!&dX+N_;KPq+3j?XeiA}Ipamc|>PIX=9cE-gtD zgr>j+j0h22_WPNFy^{vNYQprIzQ!VHrS@X=#Ex+6s8@{e41LRHuZddrT`OzrhYgZ& z=S1};8H7rm2$e`39$ym`&kXOOr3tt@Qa&K15i;n*3lE_&Na;X@MOhmpwn0Y@Elbod zGl14o4>dDjEE+^Iw^|xB*8zvaTpD!O zL5ss)9NISi(!-z*A#0EqLqT;&+aYYlOF`x41cMjk!)j|GXZHt$tN~F9(zy24R_u|p zf>L=(6pGOFf0faclBsfJQG9cl=TFuED7^3i&ODnjhgMNp|1h#C0R=&n^nVvGReOG~ zWQGdMmr=H237r`U=;1B^CX=%; zTa9+Afut1oB5$IzG(=th8c(eA!H7E43EBHJg`m|QMMbGQH4lJ4LS`W2El8fpkcb!+ zGfT$N{t#af#G7CLutZu6yfsXj7#YN!tw-qHTx%^Zj_8D(3Lwas+jT}G{4hYI z#Kzc~<*uEZQJbJ*moIImV?6c%0v_s&q?8g~T^EhLS{d?!SGEIWR#tu!%L zimYGb(EugcF5}>X#Go$FFfys>lIF(pSK1N;5?92N#iyk z!!CvyqT`U`fit{A&>+(jOz;AiL!BKUJ;7+ML}UxPbP zZ&CZ0xkdxjK@8copqZX?j<4Y)HX;;{e9?Aa;+z@pN@Be0b*#@So#=SAOB1m&JW2~k ze3hM&;YO4BKtZ>{$OS8^VbV=H2#Lx?)Ic`qa7<`@nG@#+rWHy6$m{DJfg5it1Cv3P9pKIHmo+clam)V^L{AC7? z0moUV;LDjZd*W@exG;5bETr~5^8vRqE_GtA*R64Cr0I@6cDwuct9$A!YspQ8C}e3~ z(x2eqn4^?s$2oZfa28U-BZSc$#EwAA78ofEt-As)!X;hGN~_+bsvM!D7<-#Hqa?Ep zj)MbT$atZ*h@)-(uSF;z1R-1mR3%cP__u$_PAEu}<;GRMQJLH3fbCmLf=w(_x7uEd zotNZ4-zKWWU@*l?Bu$?sO;mG?NQNFGFB_!mcKkENCOz>W#+ZIXpU z;cXu=13rZb6n#QQg9H>YaXVivvrgv8fAJXDq4W~Ue3GV3<0+7}fqjegz0YeMVZ#Kl zMg%cH?1ace?YsxZiMf;Ld7Cg5W`E4^qKAJvR9h2Z=fjp4wB^hO+p6xICn}!WHVW~% zpBGuAh0Z&=wtz${C$>>M2v6Nw>N;{<@ zx1>0CNh9o|*Tpr4B(J16FWTIDBqewyOGU01Sw-0oph{Mz8l+mBS^@P^RQd~bF+Sv) zXF+KtwP`^KJ>8p9XiiOWhXbvoc_8RKp{Nif_-f3W5$!mpf})GM%EMM)MwB!ml1ata zjO)UTj1<*%^KHEDQCTU_FA`>(wTi9~_NcH$u*dD>#=pvEu^Y{=ie;M&ET~SliuX_WyE_aT+}+*X-EDApg1fs9 z?l3rm>)eNl`biJMI>e}5|y_0mW^}JTuG~yerVmHY5Z$d;6Dnv26 zS|BUV7ziohy*sx`8Km&WaRjlXUR(rJ!y;W@-X#ZI5hFK_aljl9?2$;v$Q%gG5z=28 z4B^@P7{AmNLN&M%f7e6grIlPq(FHFZAb2WHg%I!4J>zP>b8=@}J0r=ax@dc7k3x-k z*_P-0kr*#pHuGZ3rj9q39EG&4=SyQB39S~_XiRlx=9Pz9p=pcArAn_GH;d4xh&O#2 z)p75sHqAEYUjtI&FGn{dc9F$f{urTDlOJCJ9>6^o*-9)l#e6X6DzVca8MFma8RI2T z(O7xngE66ntrQZ}7YK`bjH%!VP)ShZZU&#Fo?bTu9=9bG-qsf|sZ!Gf$3oe>QAgG^ zbQv(Nt`pO0IStTWLa%P{n@O zR#B}QogRLj;J$e^dF|BYJEzpbu~JGhcSTAA)>L^W8J2_NbHiI}(4W89J92g{(4vv!NJpx$ge z@Hn5`st5AsIDAjzFAu5Cs-D;kWoSi=^{aNjfGMQ&$)(OU=gl=LCnyqGgbP>cfIAE; zSL@STyqMP2ub==x-OnwZf|&%5-`k4L{3$RdL$K0FmrtKFuL^Hp7!V{Pb9*B4MKa_$ zz0^AnM|Xr9Tar=p0E)VK&{THJDGe!vtF*ycj00Jf9&%w9Zt1L2EJdUFpcRsi3Vn0K zD=&S285n>(jmU0;dg1ahGD>>2gKeg17Ru=({usyKk!{24PP0)etu+qoOf&zo(*Sy* zAZx z6RVD>>{z==kYTfs-h-;5Ti{dS#>suj;FlLLz?Ko6#j+qRJWX8z*Ss+S`*6J0d(?1PUei^v_3aF*|a_duA5oU&0w#ZIv0m$)8XLy0uYt?>BmpM#UNrrrm!~&NTE*zYY<)OFL&tJ0o?F-NeHA7pD3trqkHN$`yh3!Z z+qYxjm)>ShG05`J#@IJDUG;;EOd~~**_FBePPF`%{@2Troylh$>;H`9r(BN&D`_BC_5a!-|v_m(SaeM0?koPo# zH+_3K?z3;q)uk45lKM0afowJE<#X1eeE8}sG4{QV+aZ&57R4|hPZb*Rzz zq5{Fv;N}5BRQc9;Xms2=0_UR}v}Vm*DE{Xyru324GSWMs);0GKma?Y(rUXanhhsd5 zd^XxJJwus4w&su5zIKHxn5dNuccp6iGmt3U58c(r@y|i12#q2ab9{W89Veh{S8S2u zd~uVAL}czwYUMpRR!^IpKv;SWNqItFOdb z@ZP-x@mh={%M=o#y<^^O(Cg9fng(Cmkb{CZj&JOz+wx6MR`bKQ zyFt&@+x+}Lz@FunEI6o@CFq3ogUk^6v}zVtVumdXW>?JCs7`E#MYT{PF2A{ED6GkD;R}6_b*#gR z9H;{WmR&(2$zXE<^tba}15fKqoqbG}z21G-Ox{;kF@iOxDJ&&1aO#u&A*J^>&i>ND z6}V%z-?|3@!LyU5q7nsd*)3k>_*t#dvvrPTV;Phb2NHE|($XaJthGdAr_$MDD{AH9 zF?CN$)2LFbR9gtFHB2birm{}N$!bzWMe-wnic0wrJbz~el*m=-ldLVqT7Jb61~N_zgCkLb3zjbcsx$z}Tt*V8MY{~9&m`|}z;6)4{pU9CklF>`-P4+PAZ#3_U@iU zV(FnEz9(9ryO(KRmNfWDb&{hx<+N6_MJQ|&++CelxfdZxiNJyuy=jmaQk!e zP+1mefP$CIiv#~Yo7*i_}{{S&IE1<%{sM#)$ooVDq! zK%@gSZqYu3=7JK&no~5_oi?X>BTUtwH>a%TH+2s*!@_02cr)+L_X~!c*Jj5mV2gsh z4O!BYnU7AFV_V~Vc!*2s0|!;_0S9}i$br>v@z{*3HI1b>c-xLQyT1M4%J{tN2^Wn` zJDLDm@6UbBl{s<4!TgeSDp>J2z_clq2RvV?>%Jz|7}CL#-SyWpNTvqnoen1Cup<$*1iDp|H@>$GuwQ82HGgSH=&@ zX|uLte_@@n-ZKDY2Q71@uv~o+RO9K;@rcY`L!0pQv$1Re8hLr{lnjg)IQLpiR-?#c z+4n;Yolczru2ZoR*1dv2o~a^Cavq{c7aV^c!pAXZ5yEFp{(9jNV#{3dx;+kZCP`&A zKVr<(meP_UEMg_V2Hvd1et2Kpvf&-bpPUN7TH3Y(bYV(5BCglYdiMDu)r=l}%m09f zyo1D;z%Een!3@1+*DCG;A`M$R2xka<>2Za!5s2PGA(fjwZ;8x8Mt5MX8kplCrrF<0&l_iOKh?P zdbsrnL8d!w%}{P%(?s7tXEbP;83DUOJN`t5FKmazTHG~$>E&G+h@UM_qvoQ~dUS3R z$?u&JkXE7|lEhQ~^YM_OD2K3MUlsu>bBzIKeL(#{4=Lq4l%`eBz{4uBV_6ISVh4_`i_`K6+I5R;|1bk$w{zRJM|!rG zJ`emaz6n<^ZAMKv{O#NNK!)Ih_9QI<1N7nMo%2mxMAHCT;IE(d$YGZK3Sl5HnE>y^EgMP%l`q&W@2>!~41-GY+Z_Wr8G}f# z;`P+0gwX5yHogGv-R3P~_~p^)@!-D5=e0|s0AzWcIc^izo8VZP%Qxf>B#;4i6z>kGJ|j&e1doG0+a;xPSH$4Z zTJVD3ZU8zD%>L2Z8OO>qCaQJMx=F)*Rh^vzJi2&zBK-p;>r^;ga~jURRo%XI{nHL$ ziVZOzkmhA${jVPRmCZLyUo^-<3T8wTUIte+szX0+4gHb&)7O|=s7^n|9;B?B7L4p= zC+7WY2TfsPoB8yH*%cMmNRH(kLJu({w_>W5d2j<(FZim|fL_!EA!-^iJ-?kj@T!o^ zhR_9Tlxy!Q2`^obA05LQ?MthaH>HiQzwD9#zy_s#Plm#61ztb+@NRSijT7DLIGH^# z3Vn2vC3f7f_P7A$+Aq%(cFZWfIivO}h{JZ7f-!Zdhg#ga33Vh|eN4x08xFm*EO5@Y z!+svRj!|{k`1ZKKi&{t+_PcHBC11}WH;m4hCxc-h2jkcJGp%9kau1H2vH>uPXQ+u# zVB0$pBsr~dM%KI;7x63gff)4Ahs;Gu;m=<=T}9m^j~L`PZY}1okptvE%E`dx4h-t} zhZNNY+e@8`Y&rMPTcWq3&(q&={eeQYCKF z`Ln-1pfwSrOi%)?P>b8KL^+qxFn*(8w8sTA*OoB-R)=TR8{X?&EU;P}n5l)*3RxO% z>sJatVM#woCJyaQgOe=3%V9W%+MD-M;6w-ybf1{Ufbcxy^-O&|H&sswH;GPqTVJo9){h?W~c&CQISlL=i0+z{8H~e>&J6NDb)E zZo4CaPmj>c=@v*F3dgd6;*AzG2iMQ*!n3V)#R?O-g0QkaFK@jd>~`ReleV&^f!hFw z;OI#qw{oHwFAS;}fsFwMc zg=T5V8UpgF3^F+Du0-)^D(q}97fdQvU`*^Zb39lDOWoR<7bRM%OcC%tdl3+MTHHWy zYE8ts+6&XY$s2R;4pqcmtCKzJiR0R zaUfWEt5zjuMJBEz*kq|@WC|>}_s_akavce&mq}r6}U-L3L&gA&&i^3 z9n}dvSk+YVLViTOL*IK(qWMDkBXV6*Vr|f4Z1`lJkA?80Hg8(@9~;zVIsMtD(+>BS zKXPK3%PdNvj1R8@w6zf{$$~?`fq?vl4+IJsZkR*3{vUtN|lqX<6{6l|2`V!cmT$~*Q^o% z0{>J+BEb9KyOb$_ayan9FJSUa9)R;d(F*?qFo5_!HB$}12m7D8ss(8OQ?m7d-=Iie z{e&L!f}LE5K|tKh|2yg=>G{V1`2Rzt-Oz>gRa;mPe43i@xuay{1%*QEPZH7~g%Cl2 zWup`>BA*Tk00l=FMH!M~ak2=S^{ZddI1Afdm9KK0fh!07T~k}5zaiV~-ulBtSNGz( zZjZ~QkIS6}OLAs$ivP#;k&nY>$M`3(#pg1q?622WFi2fU{IBgZx^iFx%EkcAz*f$M zdtfeuN5kF81ElMUX!_I4!3V=5=%a9ZXFMD*;;Z@lYYqG)E*O`rSRX#FDt~mMX^=F> zp3PP)KTl?GY>Yl0hP*!j^KQ?`V<;_CRM!2mxJ+@bf^8rms+iukd~gnj-I1g(p5Eo! zmc_6%ZBC5YmKLQa33U5eR)(*4E!qI+CCiJGy6zsS1ySu-;vi@iN8tj(;t0Of3hVVhRLV6cXM{+NbW2enuSySkh zZ(z>Y55BF@8=_t71CQTrQwU4Tven%OAD2OI3 zY9B5iVous)E&{H{mw&YpS%yazOs~wS&Iy0HbU#6_ug{WS&HELd|08nsrE%=oepDNQN_9v)n?2cH2ge^u4wts_D>#tLI4Rh6uA zw=Ez_3+MigDW~lB%ED7)s>f2HAL+t}I$H^?erAs0oWJ@S2jU%^7ooiQ|HkI!$NOh9 zUhL=#m^D~|QKlhj#D%w$nwQfS=GXSN=+R@}dxsBn_o9d>o%)G(U(-P4C5hE|N%VIh z^zDLk?4CU+9dP_fDBHr<%M`;ui^)aW#q7|gT-Lzt*B0!+8;!>us{`O#x zr>1J;_*L&Wz&d|K<)=o$0cadAhod~tkVxu}vkx|^>L5)`_HwuVY^?u8y0Uj*T0aEB zhx&?sOm^qDVjrB|6+&E4WLLc0=Ql&hShEIecPs6Bw_$ zzc+N4U9{zG z!QuT*wtNCXk^3M6W5Mlv6FLUs%ue2u)K!0^FD?)0hlA#~)TZ1`v_0C{ie zmORX820%eJbJCl)BPFAR)tU@^y#dn`Cq2J^K=$e<6Rv*V2WBS@9*BjxNS^LAvt#l8 zUA{OQU{EY9I6@p2?KOHy31EF50wRBk@tCbhi~gOTWL=msf#WxNmZxij2+9Pw<7Ud7 zO;3TGs&DPUdJTu2+#B4~PvXNF3q%XEu;A#12ZdG`OORohN=Uk*bGZZ8S$^vsY@zU@ zjUs>jePTs97sowD)%^Y#!jC?rX49jFBkuSVDZ{G3@Z_3k9A|w#L=AmgQ6h_O{)a+XHOsZ;2`L2HYs>;lZSjI!vm*BwJo(nGt z@gBMGhSTYp)c2z^@bww^DQN*aS1$T#{Ub99-2!ngNyGelzD|<_oT95c(37|BD{G+PutrOB`La{_KSPHPP92+q0^eN;<faN(i?gz}ay?vu!6Q%$ilsCFJ5XOl)MN=;j95Te`FD zy6Y{fc`4(~Zk1*y;y59?4B)&2n*%pNp?>eh_;gCc1jB>^yNG&}sV3t&xm%mwevg|4 z4daq87)W=>z@q!Q_(}!z3838<{W_$qV(4tO8R;##fbr%BhjKI@^v#_36En7~r0iTh zgoBnJ$rapPAs?As!aD!UZT^SVEuL;(AI0Y(f9R<3k3qEgFDh0Pekj$b@Ne$2f@?Di zU^{1n*xmalPN2gFq5G3O_8A!$UYn&`h)EDO+IiNgr%HTXbUcbT9Sc2Y|VBl%@gmGzi>oUpWY*{{DVDybSWv*agFn~XxN zNZ$H!^k&f9>qN~qf8xb2dHIYHq}fu-a|weg9DVmJprN2A*pqQ7OR)RmUgsd!xG`-3 zcI{NJRGsETERLC5TrQZl+=%NV(i`to3YsfhpEY*w2iZavbGV|bCkW9X{975)R^Zj? zH3VNpqX+kKj#I63_SD6?a0$^uTfaIXQlBs(()0ntFWvCBZ9p(&}7~;9p2{)2~%> z(`U|{4GQjLy0s3}c?3flXI@kcY6hI1!>7`3fCn@`XI|h8s%}-?42Cs#v4>m@kQG@0 z@?HfhM~J?uW1460{GEv?d8J>ssj6?WQonkiTw@{SqPJivThFLK^$Ix<;@v`Jzvn59 z;ETZCvZ~nU>m1d*%jKTfdXKrKDPvnI6MB4!GhcdX>fgKUUx4xy)`f4A&`K<*D&L8y_2cVDFgQ66NaX#Hy4 zqk(t6RA^O7b=e>o<&7HZC2n=gwPm1t`?(Plqcxj_Qj$)Gtim^@o%wObnH7el-8S0* z-{aU6T)MtCO&N-0W9~`x+XsoLSqm6?kFQI4Jhq;v=Lru*=eO|E8E9CO> z^;tMZBAeIkBhsA>X3#y=REMPxs`3s>IcM-SHyPlUvylqI4tUX{et|Tl!R?r5eah!Fgk+MVu3U`S5s-Ch+W-4cJ1#Wiw zWVGLCtblR}2D40(SRwNo#CLs<`XCuFmCqE}$l}=4RI@cbX#~_va+3OMKJx6znt8`f zK94)}ow|nLTpQaKmte>t@wmZ@bS@^RmN0{7vBI_@o>TGL+L;1glyqjq2>RpNfYC5iNH4nJxR&m^QI1Qi|z7Ra4u`6R6OUAtz~-d1paRX#)al zX8zg0wzW(?YrM59xumxdj>g}H>ta{K3eQxWH&6I3A=tmq{T1+itRJdl>X(Kd&Dtj# zV`4k@`G#Atldn_kPE+RN?Y^UhH81+ft7azp4epN-tg!**N^(HAo9ZV=UAc{LXt74Q z<1gqbcIej5Ww=A+?b8eS7u;2~rx-V2?zYbysX!dxuRsU}sbUwcZw$g6E`vG(`}m)2 zs5fypbIpr-iJ<(2=5c>lk!}LI+s$6*ES9?!~2{t&Ub~m5x(Q%|5mszOjVBwg71)}C5FtseCGYg zKleZ?_v8ngtN*zY;mTk_KjcqSUv_Yv(961XJUS?22t=C~P3UT= zekU5C=0#|WFv8osyB6>hTwX&miRALSu#wj`o@w`LHz9Wsl6UlZ( zV%2C$a#U5;=_OX?ruu7JbjulRtkTq_<{oM#;?b)>p2^mHCXzUGjz+;h=ROY`(mP~ zNYG=Q|2}M2TWu+FH0E#Aq-YWZ7AgbWX;X{prfc?BB#jewop>b*25VwOPD+`{3=piB zm!PJ#u#?td8doS&>^U*&U5uE|0?ln{tIgK7*;)vvjEF$*5x`@L*Q1aeL5mx3Dm1j~ zj+Cm-Et-aPQQp!?;y1oWGS5+TpOgZ5auPs$!an;}XFj?u9`XBmcXI3=*9@#5bu$Iw z%G4x0?70Rw>+U4KTK(Oy5tff02!J&!5yV2)CnL7+SlhNQ(q3H2R#_>|G@}6);9!c2 zcr^)?LgA*+ioU|=#)~S^ye3Vff9RehliraFHG%hD6W0&dNiCW0j-lYj3zRHSFlvFF zFy9t=KFPm97}?KE7;Yr_VL1Sn2ad^yUHQUhwLMo5`3Hq>ikV4@XfjEX6>4q^PMp(J z%1;%h6BoRy;MfA8#v#%7`ow2M990n*B3Q6vRfqN$0VoXnuHMe&_lEC}pZuFwWD1DQ z@)Ay+tXT&Udar{@Nej2`4r~pc@H+64xH7&+hv#Mc0#?Ev8ybum`~n4O9v1>oZc#@2B5X0OdEr2jRX*DXx63QXs^ zNUEe@eZE8jg5Ajde68grxJMZ}pZW@~9OgN$_=0^UpJ}7IpKQSLgNow4CxY_1^{miO zxnQ7L!4SCp#kZLqHga^#xt9&852B1dW~=J~rQs{gCJ&QvR-=M^`LJmcYfho zMg!rVXV{5-!BFmZOQk^|(!o1+UCJli=}Xo02oTZoZi%jYhF*M@p1wdgM1Ubrii_h$ ztp8i0D=XEkM}$Y1gH@e@X9(PbQZL&f9#vA4n%J!OE>PTr7GjbEo5k+VsMJniqMkm0 zR2Ma6Ey}pU4t0J_CVxf)&T?%GJ%ZeXf=Y*+N0w9kmMe`?_j`k2z&=5k(NwjnBStkw z@Lz4N>jHws_Egbn4md78qENRDb4>eTV=Y0rtCH*K`q7IzdP3O)F}=FxKoc9u+p}If zU1S%#D_|&^F7*6ryK$;rqdAFfQb=|&BAaxp6`E+FJYN^xx`?plh*72#7kc;-T^b=j z3TazT%1G)k)sl768q>EnWRf;y(l+ETLDm*e(iTtJ7M-|WhL#X*b!SMHZWDHgOoDX! ztxOK0l5ZIG*qN4Va+%8_l;QNZJF?lD1bv1xki3+D`kEk;TGC{UnRy4jbTTaTAOnk% z*_cKC6K2H~edT8;Bv^GE3<0#EwY-Apw#l&_r^LFv{gE|`b@}L06B_8P~ zEzjH*$2u@%>n;%tr|(^ARR=sx&^xR*y9aHd|1Q z=WE7!8{o3%pjyVnX~Dqz1mYbvTJ8lIph9z!YK@vqP0V+75zOx?k`w*ZIelj!{@)fB zBt5y;kxZ+3$1j95`0XVroLmS(YsAJB?7L&FxDhysLoYlA9Xk-(^pUt9X^l!hWHL;9 z;1ue&z}Vf%R1M7UsoEA~gR9clPt7R}89k>_)aX6AOg#4$CyLmSkmL93O-+d6f#2eX z6Nk}9_N4c3!6<+IPSO4@Y1_Z)_ST#vw_X zO_n%m3@>lyvP|ld$2^RH&yX=Bqh-Bbr#v_&SG+{3;(QkfdP?AB~;}kteIhP!wn%HEYb~eLFd8?%NBPU zp%okaj4JjHm~iK_z*W1Y*!7L%G9;Z!kGT7ixIMS>gZFCG&K}rtCL!F7LA9AsTN12n3SGH+gK={bxJ`{ydk1*FfT3aF`2r8D=uti!H861JIN$Rsj@cb{e^+NPs_XSi-?~90asiK zPaX&+oiBt2_*(m)>?Pk0()*TR1vY+AIVpZvDPP|f)#f9(->R-fS<>D%;q|u<&V}Jp zY(>dNn;vUktdm zbS8EFWTiX&P2UULg1RRVa?D|-WiupnjCfxv56RxxusBIPX_>U*LmXCJH+OAxat4MF&_${&s75N=7Dx%=u=UJKF&Uy@MQloG-%=$kxp z8cf*CT=3iqE=x_E^KCRb*Gn0xLR{^&wXs=xLZUv8f@OH(7V3!lRj5cO_MTdWUKep% zIdVVTL&1D*PIH#1EIqF(knSQO`N!|Yp^S}_YCAMO9jd-P=#f3^{TqZ^PdqQaaK1cA zB1Y19Vv2*AsYUsyVegnLsQ9xwgyxpz?VC(@-B|uV3T&n7X-6xFc6#mwgxUmUgdyWM zN0{~89j_c*3xb8IAFy!O-9jJmDdoUmnFqp?OKT=o5~?a~xzav>ltMzu+TP8pPNb za$jdu5ZUza5wO}AT=Cq6gabW`$hgIa@Ca6maZD-Gnm#SyGtruv`cH&C{c~IN!8-2r z$wKi2zK-7Qh~NTzAWLpG{aiI&rjg{~trCPuqlW!VEz8Hp)8?~HF&ag75Lq3>)Fx)e} z8uwPv!Bi_f5WMVRP%K0;c3+vyYhG$+DT9x#9D_8Th^w{!f-)U`a-wo%Sqm@p4`D>I z=FZz6;&R^+xhlPxH%T4JUrlsUa}CC&Y2bIw)-0(qjm0YBNur5t`J{)aXRI^J?itIE zySywvR9wa#FuENB(5T@%5nQUiv}dm!CrCTp9UM5&2tCLq%(Vv6!p6p^zB`-E$T zB7i(d1-4ENjE)_2R`u%FLpH;rrN{?f3k4lv88&CDc7$L9QnKgn}2NFn0zFD{!UimjWI5z6zaXw42?IQq&s)u6(Z* z1&BOgAUK|O5Pz6RkMxcKllw7Vq)0A*e;`&NY0Cvl%LS7(S6qLM)%xRrBYwRj3Vf>{ zU+kZNLVc*r)r0ND+5nLY8LeV{NcPnSrJox{PKy%KMapgjMI zGd8LnXbRF#R9Q*>+&3v|Z#-PhKGVLJ5c<5p00^Xhz6+Gq=MAOeSjy}qmaSjZUze_g zbUY?<4ryVJ*bL?Q%4V28XAHy~6^r}?!5f<_jRPMEf_y+P-or-^*(im)Z}&0?{n&Q7 z@MBuFO&KyGC$oP3hA_JLlTh!aSZ?edfr7izPbdbuQ59AVK&Oe9y4VOK`2zf%!^zvSYZ@&}P$t<*GH~Nq6$? z0;=v4^8clH{C8`gj~SP?^eca11S*|G6_hyry8X-E`gj)bMG-LEy<$RT_h<5Fy^+NI zV~0&nTI9ccv2x;)ca-Cz_~(zIVGn4zk#IPaEFn5nyAlUeBsF4-aGo_HCL$}I1#Y`e zoF<0zoF$;U`b~H)&OIk0{I7*sIK6d;fA586?S__aE$a8YZ^U+ybzGB7i@1L~bsiwn z6XCQ`RK$>R(}1$nrnAK?-9rggulP9ytqkObn`_!feU*)uiDf@8JK|aoAw)hLcwK1R zpqMh)slAjQa+vn_>t{>UtJTW!=(icL>34Ncm8N1gtVY$pD8yEOG3JfgUjRd_F{OJY zFhIZT4h&_vFMBAu%MM>ov~C3Ub&Cu|-M*GNXWKuC^1wIiYMi6&l^+_C;>~Y30m2Ru zrLKit0XhqONXNx`WG4_UNo>4YQmWgc>LvqQ@Opo>%JCTq+PbJyK_|xwUHJtu8rlYn z=z*dGgydx~K=?93m4^=K62qzRC)dtlmA;V?NexHq z9=!5)C=}aETtKCFznXO|DBwTrv&tnRL0Lz-&tT0YQe(^yg4`G16f9(y7$SS0*acQ| zo0%y7WOo9wNJUPl7a)5J)WgjwVpSA6c9@oIsQ}u-T?|8(Q;4&Q1H|uwq%bA}9#AvS zCy-r-C0^j2V+Hm2;fi`fYkNd{{t6rt$nCD?jJ3zm)=z=d?&66XQ1MFU;fG2Vdp6cQ z7uQ&6p&wjv-NC*9k8-Z@!{4F2(EPz$nOswTOzmV8MI=6RN7X;;!|rhrOHMn-YG30k z$zuKAM5ORM6I~Hg^}BF5z-KQGwN`ev?q+O3rt;u1g<1u`#nzbc3deIs+N&WXhD2 zFS927OXsjYb;aw4qDLfTj$FbYY@$`OZtwI|*Yh5lnW_b>0e!YGeZlQlA>XKCQyHpF znnhNuKt0-)z5%FYLDcCUnYq&$09?S9xNY( zCsK)*?|c)bw}XOK7_Rq|Y&zGhALiPea1tj}SHE-tf$BPG4nZe`RI6O{5@P&==$zZj zkz@ibYmKI-LCtZXynTzEcj~z#_jITR!A48l|6qO`xd_CIe>|uSlcXfti-bl0phVE) zU=Aq5!;P2g zYwMh=5&{fX)(P`#LUc8QgIw?m*kprh5^20gFiQA~C8Z-qxrm^{N@b++0)cym-f$(I z+K0(=2NAM4gfd#1H0p}8l%Iw;2~~hG$&m=iLOla#S$VlSjt{-H+|TN1gTj!&o_32g z{;-?i&RTZkPIX0ZH4!BH70YYpmA+44eTkWuJS_dDAJ5o9glJRxj+ib$`uUWB?!T9^ zMIzttunjsibvwsR5S(VdBW z8f0P!8#j>}Kkg5SL6Vbjg48U^=x@TYAn#-});QNoW)6#q0UVm?4MQtWkkN8rk*_Df zl2h%JhUlW%vjWT~V`{h`btH5baCs~=n;L+nSy}38jd`Y8zm3Dnxf-jrAyqwa=C#+T zD>o|-Pip;^R5uz*4(%j0dq%3}R`d>e0#D+e4%A45ZZAZ-%Y9M_MLlp;!i)5j8qLqX zKRESU-J~IMa`ZZO$9d2Cv*vOjZrp~9L>S|4;tX)!B(S{YI!rHx<(y73UpMKKti}WX z;HBkJ*D#z+1+|#H2G-qWWzG?Zc4`VZ3xk0JZ0FKSc&$}k^!qFvxS&nbBe1-j`G5ZO z3bSiN!@?z({BtIexqWncy}#Cz&y6wkl?X*%wd@ zh{F?{k-|5iR>r?E!?$)b*T)&UqsIkImhLyunYnu)|2}DngCsj_usHF;Xdx{^}< zUTqL*8tmtbccC0&E({z(HQ*Vcbh?qIPsPYozW)f0;1?WU3XX{}pJsv(adTXPxQgks z9)+C>qIk&8`A*mc7Kx}LAQ`6}j)OhktIPHmd8;V;fM)n1AaX0?hh23^;zV4O1h3&0 zf~cw^r39qH>9j+tDLtP0^5)&~HvbWxnMlG0ltSq$Rm%=e%}i!4QoSB^fkQF$@6 z3VAk)_7_UeUDT|ek_{MxvieZAfX|S|CXKwCZ*o4=ey*Fax}QWE2oWd%~8IMLH|Zu1Y)-Wdg6 z8mNdHpL+&($R~Wvslo3k*uF%Z*HD|}@a|r=_*6t&m4jAM`ys_S$Fc&#!&nLg1j(#@ z75cuo*tE|q3_BO!eet$#n8TRP|B&qmF5?e$a2?4iq2DN93;zEnFa6f7nWV4D$P4}} zKeluapaf)2$-q#hDmW2ejzYymOEpV>59xF(wadEaKsUHu&lCx>C`~SNEfuW1&>jsS z>?ISl@+jH3%XR5?nfZHn^#cfsBi4qQ`>ce3Zt{yROd3}|BWWh^1W>#E9m9Ge!dRnU z676tsiXC@vWF*4GV93pv;5S%0)XOJ4B>-8sIE<}1%i-In>zi{n#HFE`5UaXl)g zjho9-aL^|61Ts&kz7@dO^cgQP5aUCpX^bcyIzlVA0qVP6jK$&dKS$)yFlc__H- zbOS*A|BtM14v(b$wvBDu>e#kz+qT^kOotQO&cwDRwr7$|Y)shtmwXycL@kK)gc+5S+1UZdWY!X4{HzP{EjPngHaFn)KZRq_>QxZY*Hs512^+NJB%6%W*m8j^8-ZZ{ zr!rPUI2(4kmB}jq-aN^gXCz9qla<*lKa+?{e@hEdq_7q)ExsRfSzOU+hp9yFKY4u% z@(%IUiHQv0D2`%59(IP3A`a;}-ND0X&p)+O3Eu`_CWh=7TvnM6-nljm8W1srwOk4F z0lvs}48FimqjWri4_&vd1#NTP5z2B^3Z>M~euII4;JL1*I)t#(r>l}uQHUuP5~2ld z(vRi8M5T-1Sgr7+9|EZp5`iJX7<+_(aa_EF-Y9F2lwVh(R9P6wnj^AW-veQJ3~z-Y zq0?V>*iev;oWAdEXWmYT>ONYpg}yMtk7u_cmx<~s&*Q>OLhOLU?j{=%4zF z&;Cq$&E&^6D#$wKQ@}v)7OMheW!niSAFn|uP_?1Sm9);K93L8NN7358=Xz86CXe7O zfV~sXEb5~>48-qHOuPB>2Az~f=*xeZh5^ELeD&tW1d`qGIMcMvH$p~{C$ILifg;)! zW3)jw2@%g4k}h7imONV^aR^7k(fsWpSB{$OykZ5#ySa<;i$mgOH^KMI6N?h)2Mu9VKBDf_|4(k?ck9-W!Z_S-hB>F$Gx9BY<##mtApumn*Hh5%$rps<<~)^7I>8Jg7PGhJ#K+t5PPAx z&`F^`ApbE(RWE0YB~kH3`UuFS!#+?E>KlexW?51Ki!m=A}T%qtZy51w0XR?-;u$Uo=I3Gz%p z_05I;RbtXnRhA=OtLbKdD&Ln$hSi=Rj&h@n{&yfJkNRlR#l3Ahb4f3OfQy z-BU=17K->b?%|hlpSj6A{wctJ{f=J?vXCKZjb9rm&I1hku1s+aF*joUCd3{@20i4c zHG8^@k{3xAyH!b8pQQX?B>cIU35WYuavYV@v$y{&B;l#2qBLrV%ccrcHu&UB72`)8 zI*o|z+M0p`7T7L(#Mn01WzlV{1-n3^-XdotBP(o^Jwog)bFKDZ+Rtjbgmg94{)XD3 z$Rs3*VHj?!4Ek2niuwj6H4@;PW+1A1j3nLyeXUu-KKZ_ZhR>>a3!k*I77}Q38d4yT z62CSaA*!&+bn9qSj2ZvkaW!QBflR=Mzk?#5k%f@?>m6`<%sP53^*x4P8WuS03);*f z2(#K)FJ$f!S{eIZfkfhi%cSxhF$76{6s1*N72Wt(3eht>Y{ciNOhBl2lXR^H76t=B zMK2O=w#WBY(W*S53K%4#ewnB5(}y1|(*q3MWB|l(v+yK6Snr9!M}g!Q)oZ4<9F>hT zuB|iO(iblTJ|`JT7uHXCM{U5L7T0#yE`L!)Py1+`@`!)lw@bCGwu^pnzTII5L(b=s z6b6G$Q+;_?Op*nvt98!o7)iS3X(w|ka6ZyTJoYD51W6`QzC_aGi}}mHpm)nyd6lXmp7B@N zn`2RQ=7evEa9qA72bFg5-N(f1FQsl3HzMnrBj%kT z)tX_XXLuEAz8wFkO@zP7wLiZ8I7Kt*uc7Y^MFqqW1QLkcunCXQz6*lfK7K}3n6xrb9Y@92j{aL_+#Q$+6}sb`tsKJHxy$8csdN2Xv4#~b7ukJ79>j3ZKQhOn(q z3;)rY$McNd+x@J|ESTc98SP&;2_({}ow88y!0G~2K70@JJRR0B1B9gZ8dLBXqbI2R zXjBEG_OL))1YMj#8+L7AxVzd&rMPVVq;9gC&Im4&y;j?TKy6d^`t|WGvUXam)=7yr)gKiS|QHn;a&aU%pdJ%AN6ST z3Be02*~b1kJNATH3*Fh1dNgf8h3rnNWg?STrgTNhRXaA#9=_jzViSDXSYJ1(7Z0B& z9$IWd3cd z86QdFE6U^KOj)cKw#hC7cHJ%)Hp`9`c9^f!uvB2pE@2>0Atg4)9(yYUgp4PiU*8e^ zLN`uV#oAE13(knYM(@bW?)_z6eS1QLoMZy=- zkjC2--l!jJv}`9DrvhCl9dSQ?&ZW9~R2{=#oR_4ZT`Gd}`>LZ9&-m15PQ@Y9n=-qK zPKdyJq>BTTQqG}}rxM0$#vE)2+Gy^n$3{YG;pgq1am|yj0S{7Yqo)$`NV)^2%YJ9J z4_8Gr+oJMDZE@%rXzQc{++d=_1v(FDNO~$$25BG`1*=%}%#BCU^fvF^%E4P4!@HbN zA}EuVo8HB-1SUw$vLJBG664{{72s|uV zPR)Vj^n}t7>_NXLU!zw@Gp3?DKtmR`eUyGG-M`u_vviS(Rpv6wtpZD6tnL7vyHEHb z>-oClO9jGGJQ8`mcdUXV$ohBef-?5%1S$5sJeg?iVNrifi{L%j{lNG$kkm{B1>6}R zrF7$kqu^+VS*eHFSmanspju0)NaWaqQ}}^b$t6&=bp?>c$K*Ze2zxkuxus~dS8zT3 z#uzXovgWa(h#3)}YqIr#d()_2P_@wD>w^OA%HBjUtX|0wPtHP2h$Xa~sZ+8Ke1GkE zf$r?gU)3X?5H_p!7<}{p*#0QL4g=ehP=vX~DhqSrkPP)K5Nk$Iy<+)qCk_=3>>o=d zf04Tg^QjX=Nmsq6V@hYdq2qw895HD#zoFatPcTYQE;hs(h(i9yjz4V?g1A7w< z)2I6!a6@A`WWcepf+k^Nu_B+Y{y;|q!FZPL|3Jq9UY%b1K&J_=l@9qx7Y2@z9`Q&Q z4OB;2wyTR4V%zw^6q%k0`qB-x%x#$;MD>hZxP_+(-xY(HKd&Sp_cvrrz)e#ieZ1a? z^L)P81MM`aAR%p@rbkL&|60OZ%g%v(xE9eT2%oY&!dZO8mb5H6@0beyv<5zlGDnnt z{QV~jU01uVNGW|^<7{0)-AEl-+>lwYK6A3LjEH(K@sEO!Y!LbS9s18=VZ`_U6_cy^ zDzp3jQveBo{7;PS^ofoOvhO&*jpCUu1pHssV%c9hdbEE7aH$W3*u+0s`RvJuwjzfCh>D&uw-vx$SlNyv^Uz*|fpQ((8XSBebpH03sm&z095v zSHCw57+5pzikGH>yvKwtzEix#U9}RTz15X*JUvvl@Qw?^6 zt$!NeOw++PJzZ5DC_SJDUkA^KQfa*<>XR;9+X~|3a^&Xx^!;j2ets($CDKylDvHm@ z8}nV+TSop>{8i}}9FT#0HoUKJKH2&NyT0WVT+39f97nsWxOlK~z78ouwy|B~k)aTL zc+NKuZFR~*Uy_V+H5|wv?n5)6%0`8cJ(0n;L`rW;n5%3lidXMQcF00C<8A4oxK_*GI478S;j| zr||uu(!yVo!^@&kW?7;M-l3OmTC*V7Th-H-qVhMla^Z#gKnNO;NQJqx;uHr_th|aM z8J&>ICpTVHG$s~M_JJo+lZ%YuMB%nkh$0h~>#thiPm`ynfv8s|Cls@tgGM+dd2JU| zB+J^n&)ww_1pM~dBnas^a2Hxz$A?5`1UtSgV6`RTG*`HZP6|oneCrMx1D2xf$GR== z$vFNTEazY>eW7-cqj~{V)lt}=)x$QCJ|+dVw^Z$y83XK*X3fO5?|NW=QOI? zRo7NkDk9^pBnCinKb2n}9s7xGoS$iZs9-1}07UG(50;=l_sy%Eg3lZiIr!c37dy9#)0? zP+#&7%e2*`2|*Q%=fEpo*jR_v5boN{gBaSazcg}U- zA5ZuydL(xb1;71Iq3=C5*dj;ioRfwu)JBu8#Ii5Ti zSl0s+-?@_*i$t`Fp^}>{*&_bxKT={5eFqx7fIZ06>xB)#CahCPll{bU+jFfeo$mqE zA6Oz0{a_~=LLd@{M=6Gop_?O*5tUo_3I&TNn72%<9F|6C{86-!lQ_{$h0Uizk12V8 zrItx`yeN5qq{f#W5{;X^_+3>9)c|^lhN4-fM%hv_m(N`VI)# z+nzKne;|^ZO@5`QF%)HERszS>=tE{n=I+QTs>fnladx5-f@cR~Q3hifhY8Fq(UA@Q zrd^A%a-Z|V$+qpw34RiIJ1=-QC*c)x(k9ijlYWPksgFCvZMn6n{|~CT8>WR;H4`iF zg)-)@7_AL2HbLCM+sB>1B+4-uHH^SMoyS`thuP?3N7{-M4ESx_q&K+*lbs;}$ZzBUHc!X#QkhiaNe zbXdaC-(eYsjWr{Ue?|*)Mh0_6fji=atw_H)H*7__GCaGh=LF0<^1SVP*{xUTIsC z+6jSB+Y+hWtc_j;Uee;}!Emvy?ZD)0Teb1{e)f^`ImH{Kmkhpewbv_fxpD9^<8$%8 zdHWG`0|2Ar$+T)Gp_S*2s!OI8l!3uiP6YN3^dswzw^i{zVZdteWzZB8R`F#_M3sB& zp1gX1!a1z)BAa-BIR?|X&+I^HVayx|aA5@N!Qhs&xn<&@DEcyw+FRj;-&$4=K6@K} zIl2zh4_2LR@Q>qitq!q3=t|!VZix z`q6;M>rFn&yuace$JDlm&@DSsS0FQzx-ur2#d~$rqZL?}39LQLh_}FPf@j`Y>0oa~ zV?xm9Ysj|%M_J|79TZClLxVL#S>;>PM_F>KHy%L2$Ju3s=NYTV>pT6zaHSsXj$huJ z19bM>#`dL#HA%jvf8`fx&q@vqa|0Su?$OkGU!-0Dq2r(TE z6)m79)_)7zXrzdhtD_HJ6yId6;v7ADgb}&}Gjn9`-dI2+l6}`gW5ER;uzHpgyl{Ed z)pFLX!nxhLMNaN^S>}ktpq=||nl}0L*4o%nEa}5<2v$~{!HBD!W>(xB9#1G>VDQ$0 zIcR)wA^Q`Dn03QgS*NtGFhIEUSG-!@I+@8pJD|a)rhE#QE_;i_*#VU&Jj__7iZ#1K zNYAN)jq`?Bs|F3UnCfal=ntA-U0hA?zu1tq)Vg zy92En48Zv{G^pEfEv`vRsirEyvE0i^(EgCz9;{-(giHK21V95(GePZKh!^Ml?!|H0 zx}{ghj_A0%M8VvV-GL4Q^HZ@>zif>NVzT0ZU}D;oo)1H~&R_xF6GAdaTK};%Jiq1% za0n`N9do@nra(h^gqGrPNjIWx&n(lC7mqIut~cz_BokaLcYQ1~_?@RWI+4>al}sK( z%AX3xae2MQalj|UCa)f#0~e6b|0T2S@t2TizGC*{54oX4KL+|!s8;en@NJ8%EqnU} zT+ixa(A>*=F80^JN(LgkmcNjNg6FSrE^qNjZ9)xG{k;cKLWT85Sg86!{jc(*q@(`d z2LZ%W{@*3?Nw)k4PH2Pd`Bx>(gx^ez8Xv>|%nO&Uz*7LYpod!V2S$?l4m~HEW8d*& zguV;0#7F9|j;Q*Eti+D#W5aR#`!zAIsBK+{bTsAsWcNA&7B(b>8T-$1Zfz}yLFsE* zjBczLE$gZ+)i1Gd7Rt>WYVcDGYo4T_{1N(TdJ7;{-OX&M6P5oR`*>GF!d7PVvc$V4 zAtAEDGx|FNrVYl=L(?(VTY&uBc2PynX2h^ryHwjjDBYMZ_3uCpz7yNL!Z8VbD)kCw zO35Hh|2|;|Fo7_ngvK$a_+A6KQ>)41WI>nGpf5e?K%?dHml6`J7HT5OX)U3l0RO&DyEWZd=EF_hM1&D1Y6L}O z1aR9*zBK7k&W3qp2NsU}(06eK@t)i37m!3)onc->_lsup;61qMs;FhhAt*MR(!O znM8C1fdaJ>85;J?WKe0WgQE45|FgQGG*S#QokfhmxiO z9aFGrMLV3AR(!=7WWN^u#41p(PuzNmYIS~$0!n{7<`rU)py*h2qi5>2t;BgeE+;Cw zsB)4n*dUeuK@fg~*)2}%X?#o`GWbC#P`S%B40>47)~9s7q6t(|bIr!j%-NbpgqM-V z%gj=b1&B8lkEnSLb`h`YKAKX=&gPewFydvaLM+l zuVTN-m4>|R2E{uLkaou=CqxuD0|tx-s$RwWLYaB0J87~IiZOwIuO|@U8;ZqIq1#7h zD-r=b*}N(c9B7s#dK(hhjg}_@y~PRaXv-44)jwYto^)Qb!>RT~uCPz%x|BZuG3~p; z0B|vuZ%Mau8;()+O5_QM@t*$mO`I(R9y=L6UlcEu0%XbL(Mh}S@R^?8dtB{d+O(FR zA_e6nk3^6ckqLQNY3f-vbGgZcQ%T*kX7ef__zfCej?%uAk=^|IyAHITsX%rhx1g$) zy-N!0Zg5rf=R>=J_nxW~K`Xnvlfb6oN|>mL|EpgtIL#t4gn0Lr=!O=mDYReIHIE1D z=4!@4E%59r59IHY@w7qB=yUP(1v1o%O zlBVj>VARC*6>niRh;PG?C`yFz)!G>oss0kaVl<%#*uBTrh^bqq%cM)aE4+qyy@(guvF)08#a~`}gv)-ztw?!l4aV%!`QGHNDlQNA4|;*ngu)s^)!3e-Q0=b$l(R z^sYaw>&}2tq;NM*nk`>2`W00h7b_7YxpRI0&A3e5X>Lh33Y0FpSm7CD_BPniJup`4 zIn<&3aP2cJP*4cuzx-Q&91b5c%n}@{AS|stm%GHRl2Pco{A-NXCecGB98sOKz#lAW zs=sLVN|{n)$)}EW-X@rB0nbV>LfD z9f@1+vxb&76prF42*>na$Lm+AJ2cVQ+7M`|hA{#RSl$0JTvpy7gH;Z?jehtL>}fC*qL^ znP7XCrqZtfqxr#6Lr>JAvrQ4dYP)?1uE-Y_m4#&Q;9Lh1I+nBY_dS#87TvN$Cw^%E zbtx1GJN|HT?E>xlPneaR4HZF}>gyXe;x?juk&>(q5ThSZt_+6=P?Mt_)66Yy$HeMg zxC{=6^@k0U+#whXBg+9N$3r+*1v@LiS{j5pM)L&$E4l1^dA(uR0j$d5UE2nl7?fQC z%#H8-jo@yHxj3l5al~6w6E+m-TG1N~;D0-X|9RjY>qQnQO4xuD;Ibq<;VCE8ensL% z`SGJPfV`{KmSrF9i(x1KNmd&o+#d_+9)QNy3Fl?3A_7g@y)#v8;=c-%Bkc0~wPyaE1JG}-I#TZv7fl)O27bSX9liCoOPNs~GEm{9K)m>(8HADFuzfa?$9>kmNy z&?um-uxD*<)5&%V^L>{3{$*G5wU;VnEBl6Q%@c=L$r4jT7%Rh&b=;F*kvkU%pIX*0 z_xA2rTq4Ev%R4ZQa4ZBh1(i6x9y+K=2_A(^d*(cuFC)aI4 zyp@DJi+yU**{lSn zY9ORjZwU96XtqniG*1d}f@khzDz;HpyEt(6Bi;n0ODE*bmK4z01Oq)Yxo0Uvah$6@)*2u3y? ze8DPKk{PmOa&Fb?izoHm-(08>&rvSxgjjs}!3_SHJiJ?-EVjDBEKV2Am;TQjw)fY? z;vJ`uKh-sE-D;OBls#(8{G(seEi%{=dAu{PH!`d}X|Kog6Y+s0qp|!miqHFX7Jo|w zI#ha9fWpsWMEO6(te0rFVm3b7_Z~&G^(S;cr)LMMAPomBe!S9zEV*UJ{z6uE@FLKE z>>elj`p8w|^F;!wl(U$~Kmmb*!@=k75s*i*yLjUYHY<6@Q$^ z|ML$Qh(MYlYGo8l1Gd2et7$ahgD$XW6&H396ZrMwvjx(oat7D%j=QR-_vb7?K8ns) z<%~1;_OUPr{+&szChvg`<_L{WNUBNZdbD}{zjBKpKhMGnDPp62<&4WBaa_ie#(um; z9NjI*u6v$+B^k5!`yjf8V6eSv(gDvi8C8onJRIHlevGs7`t`pCX64BA;)BWzNCGvi ze}K&c^@|Aq*+Z+;mr`u|caKxR?T<$EIF<=i-`6elrHd?JTGru_lpQnjSFwe9PR`{w z_NFXgUf$tFtUa?4q_-WWrNUPD&O(bSg%Rvt$(dQFC*)6Ao&ksx8eIyfkb{M#&+nXj zQgD3)*=H@wIJ|S(y(1&9%{Q4DXHvufok?J0IWD!kgaLM3_4j94r!z8IbySJ zaHH5e?wN%+K`=Hbg&wqyyZv*a#&TnBNd~w!!AB&-n|Bf=%b^5A=5L z1a`q0oFd{`eacyVVp)B1S$$GjeM(t<5?LSg$kQs)0v}Cf&s`}XU!dqPxNf^A3u6{V z*FI#uFW|R53*&Fpqij?7jxdF|2T-Xad{ez7w?*^OmyJ9`o0VKu=UGh0wVz4It=KSY z2o@e);#b@;88fW|rUqudQeXT3c~jWXGHCmR$P{n&#PD4v;54^yK3A9I)+berk~YPxErToYl2-kaWI;8gdu>CdfcMh{Ba z?<0wt9uk~2Leq{Q^5zv>v9Vq}?v?Z(sSl;D--0shUzekR%beyPs86)NEjV+KKSF_s zT-^Bfj_f~IEWbCvze{*?#^5=aqO%3XwU1{|I%5#XQg|zBSR`NZYFiXvwKH@5bpMb( z@UFN977@Sc9A8Vh1YI-C_xd90ITJqbdfyBi>^&6;59FzvNXq`gtx~RGA)$!r743bZ zc-~dmk6}p$vh<4g`ep=P!#(ew?Z>zzu=L9HKH)s?vW(+y$qnLqaVckhw#hAmpI(*! z11{fR8ozu$=5BT3Z<%T@J&iG-D~op{igaM>ATJc|Riqu+fC}RnKnEhj#dbdO#%gN`>;( zdB8;J$p-B`)9uQjC73$s6=Rk2Rptaf-oiucm1MIUXXzq5l{s5DiKo+1Idpx$@tXC* z>v!Z3efl{VCkxXq_3f$h)%C^2FnW%(dxtxr8-jQoQE0zA9>TsiUE;F%*KU-`0|m3V zz|4kHpb{REv&XmG(GHll4%_9Cvkp3ko)JS&+ciuNwf^7%agQD3KPnH+gPcTP%DuLx zs1G5NS$)b!UNKVr6buhhF>WIwpC2Qi2ZvtK&3m&mMC7OP$qsYfGR^`>GHvp5I}f$s zGukSr-rO=tsSiofZc(G2WrkiY%!6YyfZ|gkK-$AT6^UD->HL6EK_0JZOg7Z-Q)|0y zJ~`mtqk0K@ct~Ny5(Pilu;hsb3kKMTDv66tUo5)V# zV%|~@y#|{1rev^C9^ztnpt70xC9QQdwVfN)y?6LPHX1LHC8bm&8n+J2S^?l87 z0a70Npxp|nxC{6^wC0{ot!W)P?6Cv0GDH-n@+l8zF>g)KZY73Zq0Qgv*?{L%Z5}o* zYaKIzxf6jwhKD9!jKs#&6j^oIBtpzXFsKpfu^2QNP%?_?XghL`cF3HZFN>>I+I2F0 zex}+-yU?A7*O7!PbZsvFnf*myYN|2v11MUmD9XIx{nj-D@7Z8TU`dEH6zDmev69RD zB_|OrQb0K27EV?O+%6K*GTzNJ5os(FYM+sah;YmbB*jciMu<9qJujLC7n%O0T7Hm1 z!qpauY!E782R@{I4^mG?bO|#dj*}6CaO^jfB@~Wr&7Rr~(?dnWDcifAAa##BE-+`> zV>xo~W%1`;!1a?ufT7-MLk|RGC+Qjkp_p1PIAjU~+*vBCgMnLUdRc3Q{xgN2YM{hj5!X0z zZkZ}DPVXaDd&9(Q)IliCumy6PK;f174X=?JP+_wUe?FvOA}bUDxFXa9p*i`nacp zQ&Z}?DW9AuL!}_s2bt>=2l`__=|Q%duxeMe+~}v_3ca!A@_MH<9$$$L@7hKvJP*jz&K8bz)=yDl9` z2)4Y;976v5V~8XH^IRScK?XnQ*tt?bjAfTSSI4$g);$%c#U#6am1YV@Sezk9On%UX zJxn>{jde;LD9o#sKDO8vQq>o3Uv|P+ui8SX;%wMbOBpVARqaGg!rAjZ-hGiPZHM)1pKs5HaVE zzh18*-s674S{cesx0{#rA6UQmZL)|62Sc!aeJ1%%H&IhkNN7d8m!WEAPnD_3R%)(4 z%mmY8)$yz}>Ci4{N~iPogRR(!VYd*t6+2abkl9M=+N5q`Qt@{t2^YF94fC82TDrCnE8quQ64cVzAi4M>EVMpThRL{dSlP@{EoaLgrdI_BY(Fwyc2w6X~ZgLPN} zDI~pDx)@w^V#7Ue;8-`F{_PLbqlaFRcKiG+|)G2+d`K8H#nIQl-|md0SouV$c>L^xFrZ!4BoesKxK4W!x? z=GE+lKY?tSOtR?;rV}h5DOLjZ74F7`bY-xaZa0G?cZL|RYp^+N3rD&iZ;R`jDMs##yR?1d05?7H_Fo>k1{5MNodD(_J=u)tQi@`cyV` z&UTPoUDZu3-YEQNQeZQS+N>ai@LiKO57`L119!0)&p#RbSwT7T>`4%aBBF(~(0*Rl zzW_;{o=gliCwDF>(HW!7^0$CYrcIB(w4_dV6_O$Cu>fnU_zXD;E2mIMfpe~}DE|V~ zjd{m7v*;J14Wh!eQ)_F1cW@H#dBTx@hGa(wPPX$D|A0~YAi+eTsdN(e>-y9+qZ8}6 zeQSRFwoj6fc;-Yo8J;X5Tcb-49I5abd*9dzH(5JcmQA{HXb&k2du>J?CGuO3okfow z`9Q!M?7$Oi;)@7CdHq1WYBK#dSSJ(p3S=y zNayqDeS3O^Zp+jH_=AIQreo; zU&sw#!t@Fq00k5_t#Cp5tPX(VUlA*$7R6#ZkqUq_U04?Y4|Mu`da!~oG8mdum10?* zqFK!x!yuxg(J;d36u1@fFpAYQI=kHE?34^>-Wfk19@t$QV9NEnH$`Oj!C=tIiC^BW z|7?8z77Cc6MIkCev^zt^v6S8*6b&{Wy<8cVB149nYlN6XrgHG4Cn3rs{)E~PPzoY@L-+s<@i zhy&O=6oWD1=0EM$3ARjSS^SV^5^50A>n<)F-GLkHp0ez!_l%3bS%b*?)&`o9!oZRI zhrK%b_A|tO$f?Vpng*vqXrwkjcUi# zg0&jK$jq1ogoWWdig&RF^*vTIW_G^3i0EeY>SBgqw?R6U5n17owuvc4Y;^yX8 z;(JAe@UM%XgGJ?JkLK=JpUxZ`a1xM8y!F{ZtSyE-tFMRC?r*}xfu#btr#f){=SAVK zct-WHd8asKz&MV=i|O!KgHqCD^Y^#a z@D}bu?bmS4XNCp9E4ju=_ybJk12+XxwANbqjW_l(1tmf49*i9+!MG3wCC{3)HXLoD ztbK##dmKl8;&a;|Tc7_}T@uxyjvL~j%(ES76z@$tac(hQ%sVz~93pxs$Z06_e-^)p zia=5$R(>uC@Bep6KuqU10N?|!myi)6S>VXoA{#9S!^zqHR(Sf9maJ#BD!%H`6wRX! z&A!v^b({|Y9Me!A*Snf-1&>;eMrU0{!4B)!VWB}-QrJCob{QkF5E|6e)uDXQw+I&; zwn~!>fAotkuD=v&UPF$?KGZ};1XHpPma#gCY+HA<_NZOwa-l<$E@3jBQG*Pd&p==G zKo!dEkF9cJHqONjryYi$E&Bf;@O&~Gp-cj=y!uaO(^!@MZUCUwyRT;5F9DPx*Vl_i zRX9X&193Zg;jkH5>A>4M)~H~AF=x(Xx0J0kLPYo|H!)4}_84NVam1GIQHS?6jXH^A zEj*d($`fAa{c2X6#fW=me?S{e=gUboS56N$1P}oishTO)G;UELvPFFM_@1hQIM`tb z(z(n6f{zi(CyI^wYPUn;B793EMx}`9If>tVt4-BLG0_gjK8()V;|T9UN=T?cuYK5` z3`Iu{Pg(%hoBfla0K&}iDqmQ9CHb`YT6#z(8*QJEMu}m+(iuBxcY12*JKmHLs|tVe(KFQe#Ydh( z^WsY;wlT(u=0ypI$$Gq=X^yQ7O9LX6(>Rxp=dN1ds+h#5pTZSS7#i{afg4EsOXauW z@WCj%7}Z|qUF|=TgHG$@XPC6l<@@{2ljHn5RO(#OrI+nj_#I7<%1^&AgHt)-`=SHz z?2c&p2t2S@sd2XUG9o{+hp=jg;PhMm|Hc5OjV!B`>F-7WaiDW1gC{nP^tDkqd@*4P z?$&>EXv(4E@`a7mBzK2Z_G_8veo4;1{ZGI1i{4>A(I$x&F^nqoc=1PY*01MiGCn>Z zOwp_tmL3TpPtd70V@8BYulS8KnZ8U@u`0uCtc9_z-YyC>3JG%mg-XP++Dbw4cX|xT zV4(R8_$52_?_c>}K53Fz-TKPaM|h3%WrR31_#^x~#;Y{sq@B};MMv)Fa&z4b>$V{~ zc5GayRA%35I4p7AU~G=7Iz#LJIJ#V!POo0cE}GmsO&YX8=)5~KaIho8upVQR`_>=p znT^S5$P=2HfiM=+yq(@D+=I|7+lLEa)(@RyfJ8sz#ywZ7+lI2RdAmKbU>jo>C#4&N z24(p_i8P_XI*laxH&jqZGrEf&)8rlFPKJs(s$1a1MG2Nhc>%xum;MdnXNQ8B(4F(LTfO@B6Qfvwz~3L;hfv_a5bUpD=9BmBY&` zfgMILG7qa~LjJz%l-iH!C!&7aR}*v#UR+AsrV+*``2Wc^VkWOMzJHoa)O2zc01J?v z*}~Dx!y{GGKx0u9>z(^2%z`XK+^$jh#Ak)jRW$1qZ{$KIjtw1qobXpq!h!H_$>Gr= zh}gtIu7MB3ztc+plOu2VqU*=XP6Wl9c5xWxxZ=d?vnn&FQ0B+@J`X0boKgMAEn%kDDoXDkh&x3{lt zI!wu7jdEJ`cN>$-B!b~{SE=GSC*F^O^ziNeXq&I(v`XZ5U!MKs6%B;ypR0gl_fp?? zxx)xtv%8SpRZo&my7inQl^9%ok2u#p@%-r+3jN11Tak?1z~~BF47~S zdyVvtv#3VE9Zlcny=Beyc{kig&tu*i2?^;@vWqI+xoa>nGX(G`lfiNuSyVC^zcGj|cNnsN|YtP4-1xqnhR>l+M z`9{ceEzBP_CN36djOeMLv_wY~fA+pPAg*!N7uN_imZ;y7c4EjU$n2=-W z!l$Q5nIma0UHF7uE==}z`6c^xm90-Yi>41mi0AZak#Ris-8gzj+0Z|Dq5wHD=*)o3y1)t*Twr1U4%uA{6=TV`DebU$9xO zmSu0TOD!GE_LTv$wElIs6Trq_}(3F+cMIdA1)wJ>!GM zo!cMN#Kvrtt6KK?4Z|^-x8Z0FEq#q-WBC?n* z$dolne|DT&QrbG)SQJdNN-^e-{ewS}{OJd-tsml$-^c~BPSJkzU31I^IUub0;`>GJ zYCKq%d>`}AXE(*Oo3R1^>_wk4wuXcuKy;+%W&*MUC(OiWva;xv#&HvegY++*gX=}!Xg0Zgl;8hpA%wDS_seZn(yl*c zWK%C6*Mx;&s(N~cMA#E0A8pH48^dwcR&Ll#))$+|uFXyVy|KZxeuK&7@^qu;JrTmk zuKsXJb%2FnN=Ky2%s+|~cFmF9y5OIg?1`Qg#`uTXs_#V@>&s)0DOGJVHkHCJc86+z zYW@O`GwoJEjl1B}YXMhS0@cg*8Ow{}k2A#_GPWZ=>UOEn_zTW4Z^gA)Mw0NZEN#^2 zP1mV@eB9WL_{iIYN@Ho_gKkBVMYYZFFzj(Lq-!RqiPCC~B~kfR_^uo}XWTA;i(Xl4 z%p^Vphb|gVA?}E~xxUC<4^LvL^P{DyU=3?3O&oo=1|P(euQz5BAKc4qFlI&xNNZt&9xRc!(^HG=GwAkCFvwG^TG z>f*YxjA?m99V}V2WkPsat{F{;;3zVuAzs`i>f*htH$u|dFMvEJ@@Z#vv*fGU7PJID z9PM;dezi~<-rb^&e`l{6+#4m0Ba%}te^~?%t6dgD=^cEUNX7y#=T~>LG}%`c__@p5 zDf||SJ(iU$5^_nGc8}H1=byiOL5hizf$hPU$v)RTS}HFr-{=|hQTkP)(a~K-zj+>y zShY;*ez&HtD^vMr#PhbcA9a?SSd&J+zWC|Rb2eJxYKnnMm{I!W(rI4?suVUBoIhk> zYO+!J$+atyX#?KtKm3rYmR#s`DkxV(>RFcC z=2 z&|)+(si#GKhH}>L`SYX8y6tAxg|7LuvgyIwRo(Ar)D=uKKKzkpak#9deTt^3hU2y% zcCtkJ)h}Nq5(SrjdiL+hVW3{TiYr{>Sgo*DM_%`tPY}i`=>2E|g zI#>06Jf(AH+4=ht{O@X(&OYETrBb%7Rl#%ry{^UyBkp~xb&Cqen}e%9=Xmv1~+?8&Qfeffy4OXrF? zt3#H{)>=A>sNc%@oMT!0{e=ANnp+>Qi+C0vleD;>ICcEfCrRObMRRjfZ$F)9+IFVy z`MoAa#=KTF-&uQ>maHxGN8a1t=JPIkvcbo*G}0nT_W=qtO2>}{0`&) zB2&tGkC{obn_Y^|geLxyQVd#lmgdr$j+`GopH-Axz)SajcKE|S$phzBa1v7yF_+S(fjIfsAFOjOs^y z#FxG>vVBHJ%(ZRb*oq&^XK(&AkjxyK$)9U?xA~3Mv{P|*m!-Gd;Y*#|pqBJbXUc2g zaAA0G;9Y`ptM7B#ao4$mW@~fj7b`Z+S8Q%Q=%xSIG}9(#@T;w3;1pZ; z-16VghW?wU`W|p?J77u8a_>EZVn~5*&>PKoc&cq&X|IW1PIIU65x-14XeWqYeV#No zB3IDn)8-J#C3+$48qwcN(py$w-&ZvhBwoIWJ+*@#FQN&eh`TI_>aD&s2Ekmhh_+7@ zPb#xk(3}Y72UEIAI)OP;7AX?nVl3=Hxn8Wk#D8}D(T2UhrUS-vA+C*>SBtHGE zd0S`Co;WGpMJ}U_$4h<2^LCk5gKh)gexx?^cKZo&Qi;TD3m-9Q@s>x?6Sc zUWjsO?^?GoBl$0BzdzS~&$*Cu;o_ks{trIC%-}gK({s1McyL&yXq&~*$FpifmKS{_ z+4UZSH`G2=PZ^>M)~~25?YC%qOpD&}qipMAQ+9d3blZ1@U+F*UwoW(wQ_^qJCatjf z+OOiR^`_J34sLutU14+EubGY0v;WK;41dm6*nIt$OCviwm)_g_%U)MTR&nY9w1(Mp^c8QHM9Y;Uhbof++ z+S=MC)wXQ0m8Rd}UH&!YO_psV3LQaJ<3oe0j34A$x({rA&X@GAjbDMaT&pNTc5Ovd z;(<8|tRStDL7C_IV#pNHt@qT}4-B+r{)+gxOmX@HF&mfiCaD$Urq?PAA8;JMsQnB5 z?Fu0UwotZilH#oPei~ziUfryIF}d)*e0IshI?GP2SCY{deXlOk)7@8e z-R^kx$>WdW`+!xNk^>)yFL|2Sn}1c1-2SSR_V(S^?d)SB=QLTlkKgQ4TdSKo7^ zRKGY*_f)6+r}IZ2c~@kpJ)LM@ahhjaMGJo;k58iM#?w}pQ%>4l5{>DZb!i~}hI^)- z=fcWya~HI3bIyEyvhu!i%6eg&Iw|d*3YTqN0i~0CuXW7}k^Q#)7t6v?ZI0K`GVjak zd9NlP=q+l@q|2~HW(7_5`klAw+~rulD?JszZ0%zhjf%ar(y7%*=EPcgBCa zH)Jlje&Me2u31wCSPS#I-;6u9$RKlW!@KXbP0#Y*=Y?MH4GTZtt?u{i-4{WbgHu;o z#N{M-`&4#F1RZx_?n_#= zzPWvU?;EM@HqZQQ>KNX>?_2B}_7C%E+D&y$Qqdfj*0b$Y*0}E0Ut-tGu6%#?=EONv zzSl*2vD??*%kN1^NS9Tg?Hn53zi46hOzS)9H;wvSPwUm|X3vN)`1#U?+2i|+9iQ{! zLPuYhb9K)3m0~&idsYXJTvrc|(F@vl)M&q*tHGqhuDzO0T6rgb9rtU{^d4Ls-M)3+ zzTLcVql4mWXH*8I|oN`y7JKHRYHQm9I{_dB1O+bx>pBTpN`3V#nHJ#Y>FfeKYe%qD1FiYFs{T@_|=#zKyH-rl?Wn z!amUTtT$7mcv3~v#qqIsUP_($=0Q8sKX^wYjN#RBb(!ToBk{6yNGnCZ$}$yGPIPBq zEV(?nZ`*vMiu5_<8C?VGI?K`ez+}Y@EnC&a-ej}H!%)!U!+C;Q*IIrSJysu(5D!zk z^zGZn)+b!5@W+>QlNI+}EP?cx@*T?g)*?U&ls<)n4AxvKE|?~T{@rOuplXgw;JICsJs z^NnjazkU>HxxhN8FLjf_;;DBRl}>oNDabK7KmF1Bj0oMIo+;7> zGu!W+y8rF-ea{0IevxgN_-5^ox2GS7Dp|Mr{T7+7_3Y}hF85dS7_J{9S*lCEIc16E z_E)(p)#+&+o#MyZPMDEmkq>hf1&Ol5S>5Zuw7Z*Kk)pW!MV*hBup$W zHVryA7fX~+zSuJ8%Wht?y+_qQJUVe;L$kVM_{58SgG$YQk{eYXt%$xbpt*gc+M}T8 z>H(YW-_;(iJl{RIrCC@)+w4Km(B6Tt<{gsSrkigMnl@jR%$=~gYtXp)gk-Mi=DUNI z%`cJ^*YUmFs37C7$EOPrZRXTC1 zH}CYkYi;(EqCKZRt41%Q^DmCit_GnzU zb8zCtK(%tSlyM%*UWj|#h_jYZw8}fk|NY$^zvc78KlGPgAU5d(+mJ&eoihS*9EuaPn@7-a&^~M(L3ZNw3(8y#f^> z4;hm^U0yi_W?X4`X&gB3O2`+pidQWwcD5_17q8s)PJhL#zQCWm@4U7Q{JHDStC~P& z;MZEO64w&D4Z95NLt=cx5`nQRW@XI~DdwcCiBr8gK6I!B<-@Mp+x>xU#Q|Q^=z_^RON)?G;L<1iy z_#JguuyP7L`8%t()#_RD^YC@j8mwwJriOUNQl97bYDzOwx8%CT^Nh^Zbf}-@G@R7u z!md|4(QVSWp!QC6w`-iq!&>)SuETN;rzo_P3k#z7h7W_9=Q|`%GZ={8J<46XO{<) z=b~79t;z6Kl`i}xfcVQMpoBJ38x2{I(afbI~B*t7JKUy*QsH zdO^8!bjp|YqTze%j0c!qiE@vO;vAbU6nt=s&i%4?TXTW-?4iA1^hLEZwDJe!MRWIQ z6%I^NOLZDL{N?;M`GRqVo8irEO~GC4NoJdk2k2epBZDbCOCt5|(rqsbm?@3hv#3)p z@9M_qEo<}bJ5(hL>4x`J7dM`jwMaXwr)Qh2I*^bM&5-k#PZN8YdZDn>qwqknchJTH zIa->PZa32>-)6;lo8<-c8s~F|vsKRCx;lN;7xmVZ?eWL$^v|$Dzc^IXO_!Z>V%aQq zZoF-j>(mUjJ^>29~-)@+CF)*+cI_n)-RW`FzT8lq9` z74GF-e5;LDZKv<;F9sGTCJnR&OkHgt`6c9}Crvh0{6OK9^tUOcDV}x5^#&gKH!VoI z)ET{hV_9)So~eRs;j))gnZ+AaGwM#hw6)e4U}v1X_QmhO9@qLBr($pI_mQ!4+jbhr z^H(Mt|9pAe#VqKS-Mw+rN^Ub(n;-A++a!AFu6OIik8v*qXY0Rm?f3Hyw%QPs8J}9# z%RW@JN#tky>Z3l9_bc{Jtgnj=W2I^Optmk=KW=Qz4Tl4`>iP{ilG^-c$YPj zcX>4nUcZfcV3R8JM)c6B)EfTpYo3|EeDUMxV%Aepvz_v6p$7v|h4ann`}g*5^R46k zbM?89I|xgPZBb|eN=8-;tYi^mSu_W)njg^`q7??sfFt8bFc_c>)l_IeO?#clz-52 zqTNq0+5K!%u~$wcyLf(8r}&KO87_&XZ#~bnh*@TAy+8gy;ZiI0-ecY=Mp2vXs+QGW zG5vHq-~jU7IKO1yjQgfB-*4ykwfc4IxGzvzIW;UR+%M7dN&oyF!yOxaR|uM{qbaPV z-7WHJvbd#qDBmt$o_(QtXvtmC^|!-@<~wR$-R-&~R(8F_o7ln;XZBNPd1uK&r$T;b zi}9|;uJrctn)9a?tUK1_>TE&3yx4i~Cry0Qn1gcp*Cv1Yum7Cb zmZ*<`Z+fF$RF(H`E_!EkBCm|S@{v=~2cIap%{HIi?VIPPNUdtbR(7X7bK7q>{@3$j z!s2TNUy~0!k6r)5bkW;8IX5GAE&M)ryP*F=x9vAB){3jLzDtw^obQ_Cec5$`My+-7 z`+%(#S10*sNK9gV3@sD;Hj(vJN=B?~1^c3}=F$bHGh(u*UN&!3_DCX}L~W_d+4b7QfrfcByZs<$+;$7Jjx2 zw`p;;EC1nkUf^otExsKAER6(*K}*Jt?xEs!N^H-LfrY>I>t5y#X8sYAZVHd!*|MX$ z-`BnEmw3m{*eT-<4y^1Hs^4ijxZ{Ay>&y0?MoP(U6^j`1bO-O5SA;rEqVxsJG@2E@Y2Kbjn<|0-5<5)WD~$ijIYv89?AFgJrNKTl?C)2*l+or8 zo9hQp(|!}%^M~qa#RQ$xHQG)Qd^5jxk%g0_AP>(I7%)p|259IJOQl-9lcp?)i9z2p z_{O7#Wpq(=-jYuO=P*#Y=u-w8I;++3ZK3MCyR_TH>B7bV8Xuu^^HZ7{@hkfotydT4 zbA1!(mk16ERYLj3u$=^aqFEtyL1a6?lC7>2rl$}uP;--^f3?HwFl#PdgplGnpFWQt zFFUc2E3Sj+~oO)&F=}%So+m&fpkZL@W3*9E-&7oQ-kPf0{E}CV7i+S z{!250u8rG)I**JWk5)#~rEyDRBI%z9+OQ4uENz@tIE%i9khBre>-n%UWOC=c`YmU1jJytos0h$N_ zq?^t=N+XOOzGI10H@OU<&_b(?@iiXWLuXlkK6L>H{y+fP425Sl)r zzam_s`GP)25I1i1TY4Qo{);h4f6kAK8Qg07j0xMHXN3^&2O~lZ0x{y%ZeQrr28MVy|(>uTSU?sE18X4qtWuFSWlynA zUZQ_0#4*f7p`+TmMoN5lL!NPrg}f)z8zk+1Y zK{kUp87s#S3z@%&G44-^cqrVZ@V8JTqfS8*iCkey;OJ5eRaX9s3T8Md%b`3rLjrZ2 zWyr`-t#4KVI#u*Ooz7^QhY;g9{tqdic{c@>?g*PN*8wuF9 zr?6|sRjdd;&AFuNenGqu4LUR zC2RQN#5#C+7}fG`TS*bZ868_i(a15<`qkS(Ol&F+&PkO*r(Uv%Hg3d#1O$L;hC5P4 zGCN2P?HvHH58xag2Sla0I{{Yf2n_El!SPciVrbJz2zRWxmk8yb*Z{rxBn)liDU}X6 zjZveYI~Zy>rBUU4wF}^y_i|$?jn3h6zgJ43B|Axj!ghkfahCv4&G>qeuoM@wz~}AS z8dDygk=5|RQi?*uI$X@ROVTK$h)I~2_5JJ02I$LM)OmOqRO&(8yhXbhT6mkp?E-}+ zKXDO{houqwG>Z_Swlm^J31pB>(6lBL5v<=>@Y&$(rn@nFc~D~}LlxEUW=NuSyUB>z zg+YgSIgl=%CooBW(~2HPES6Tr@e`!JTD;=_WFw8XX91H{;6-#(czCQiY*=~;9%Yk7 zvB?Y_Jip{5gYqBh9Emt2g|4Xc$|6=7cnQl{^i#PTcEgp1|G<#x6rrVB9M175Vh=P9 zmbBP=KdIm70d9350<&MSpZ-X!a|Q}W>W`5oG)sb>KaHWSjk%+=t>XRxP-Y4#d=iHc^YH+(OJmsMKJ)+8!pa1qI*2Z6p1W>K z$jdv=D}b)1F;sB+9JFcELkOdf5JuFFQtUv`Ywv{|h#i5pO}nYM6-dQ^lups#;Yg5L zJMv1RpM%gG*o}>b|Fen&4CvZ-+T+57E>V5>2-TDC|C>r zm_Si*%Y&ew=D|(>xpUlPCeQ}~y#7cAhF&oYO$!t8U`yTM{XJNd(14XUp+mk{LczPw^cGJ~woQPziB zM}S^mW^7JKUrx~bWH6L*(XrJT%k7~mR{vCeLkK~7Is-BS=D^MjsESZ1Q7W~cp@<6@ z;F|CB;B6TTWDXgr(^V*NL`*!9JwOsUzqb&y$ujN4_aw3Qc}&<-cQIc1X5gU0|Kqu*+l6G`~xpl zKLDjaj}WEa2N>FTX)IP6ev~M!KEP1IOK)MN`NxS;$!xO68D~SO)hVKM1(f23sn`y6 z)j+GRfrg+OCR9R@)@PH3-NOV3ml37RVOd)JaJ2OY-f`{Ly%gY;+01_t)!=?1d60IgK?hVIdh8Wlq!NAx`Yt2JjBq% zEAMj%tUOlB1>HQuD~{SOkn(2fc)yqg`W0ZNMa_&U7rB^z93s=*qKn-g8$iDS*h}s0 z5{(2sWKuDd{FuxR27U*2X#ssJLI5jU(mJDz~g^u@+D zQm7%J1q_7EiN9H=bYA$?DG=XNz0XBFPw16R;%F5@7xKx_a}<0XTLbjXKu^_rbP7gKeM; zr(jUmG(z_EqvTYV?@U1DM5xGC5KSHK(q|B)2FE}EHkEQa0|Mk`A=46uKJxhtEsxDW zO8#_)zXop02Cza_%0Kqh&2=X1)L>@(;wJ(q;%_$-m?lo9x%W|T$d;}6C+Z!tD91Dw3j7#?< z;NMqpa6we=%O`>-bR6G};q+hvf3%1X=5w%q#pj=8R;_>f!M4@V`c@Q=tU?n?7^VoC zh1fks08Z83kiKHg}*PHAa!pN7D8&pWRsf|gOrDBF~|(X z7n8CNW2N2e35Hk2jPbZ^coJ#ie#|zIPhEekh{i~r@ycx}0p9ts1h4-Oh8Vh2LMnTW zK?$1)sO~fP&8CzL)v)BK3r9e90?4M;JCIG#=a!PjT_^=9J_%T}z; z#)^FgDb?V;S(MuENkn#KjQMyy;-f{64gysQP*L0eX%a>?86A#+=>-HY6no+P^dIhF)A~JPLpaXPJP3ENslCFS&$^XR8jSRw~Eju9A zu)!2JHogL+yvih?_6l;b68la!=N)t@8cZBvp~?9xNZ6E3kg`(v#L)CJWY5O4SlwYF zLpG#CKS=!xA^CF)ja@Qmmyn{WLK23ut7=bKcPmx@DgUSil zVXMhpdQ*7n@I_#n29tkk_nvc$i|Kwf%r&v7J`xhYtrpDZg}Im=Maj}TT=ZhCaHk%d z*Wm3Kc^=G94Eiw0 zCyP(Iamn{DfaDwEXy78l8twiAUHrNZ*~L9B0<=>KgX~fHMKame-u+(U1TAL=fj66? zDnSDyU4V<7dI@+ZXk!JFQOYGU$xLhCH)AnOo*x^Hol_LB2-3xR{9>qfJWSTGYRlGv zl*Q8sXn7q>&aqN9R_bj>ly=oI#^I&Eu+qYRiJur8fdM#~&fT;&L& z_kw6@3<;;=^pY6;y!C6=ER70|4ML6AVPcIb;?cXeISm+BLI6@3&+Ww-CAb-poi2-* zX0;yH>3b#0!?OT(k*Om~aRyPBosHydGOrPw{UL`amDs{Bh3az1{v^``(EU;jnt&EJ zF%0lFYx8HR^DV4F`ArOS+{k&ujfbwm+VADsv1#N;4KlsTV4;Z1Fta?;!Y_na&16JM zr2R^>ftoGE@(;y@4KJxo!l>ywY`SCaILl{Sfz3w(V8En?vCkVWrr*tE!m=;Yxwsf; z-$KHoDw+3=iykZ!MpBpI|K&B4GXSN;@j5M2-R}<;7ekt|q`1XOj%46W zi()Z3gNkJFl`CXV>&J?vG|6Im3qu8$tQ1-nqYLq80dY%Bw(s>w+VmE394l)95i8+j z5w~9B7eBF8gUeZZ`GxF32*+&bg$@)8hv_84lB*0uoVKZYR&W6L{<-|vF#JA|q%9E= zAokC2hW3g?oTw1g#eBdRI#fjF%Rx^6BYj^4q} z3eI5Ryzf>pbc4p2u{u8lkqk#}FvL;PW2PK_jH$6@IKdi)Ux$u(4jy3xUz;GHkU-%p z1cXuRbyDs_^JsbR6J&m)_ap$$$z7nn(r5;{akk)ldLx|c}b z@7~m4F9&|7K@OrO@Mk{>RxzB_BWUGHVtW`*kmWgn0Zgc|B8*DZ8qXC*16`1c`!@>+ zAj5G?Eu8*omhgQncNsu@Q7wF|KT0pOE(jmbWX+hw`1kZcTV*@6Qa9uh7fQu=4F6^O zIGw47Ynwczr&bevcX{%p2xw+4sfR%MdL!4g#4|T z0%54b^5AvhQ3f-ELW9;pdvs*6h*g==Mz3kwur)5RXKW7*opR&$OyU(+g1nHy2OyX=W(<^vpDVTN(OoKq<{1qg$gy5tKcuUP#8X6k7blGYH_rSI5 zqSmAQaZC+dRpitBqFa#f92jHw?FT|}etzIbp2;j?O5i4#ns{#=9BnD_j)@GRErey| z{!C3=@`#;@+$ZpLv+USrvigjZ%HWpGj0)Zm6lLHR9v*>~4zdWVhH9JcMnR3dAa)^` zIDZ8RXqZs*Ie7djnC_LvGgrQAO7Q6rc~CGS-pC6~4& z$txvhg<_YqW&jIy-Y2C#N`A9fRs{_%C6|CbpLI($)L=CQ3{(|oG;kiYw}UYbA9;=y zRZdn#4IK;4xP17hXF}gb?kiX`n111qGDstz3>>@7#(M02#sU{F1O_b zBert3gWWeGJVeDuIhUi(da|V?nIWC8U;@$u#~sv3;N>|uD{5#FP$SMuu}Cz35`#{F zkqhDA-JPOJG=M{|fIi$}=;Nj(pLV77K&noFR85^&X@-#WoeUYYs*~Iki|d40waW$$ zM8~B#KRx7s0^HdKm84ELK1CCx0m_2n{G8JSuoS(=Bn`%n!pORdT+CQyt=(D&zS<6J zA8IhnN#mktiU`W!H%V|C)VA(ebrk~iI(UofsTGLBq=3}B$(l^)2K~E^a3Bqo)=fr7 z+`TKODxsCvz^Fp4jzd0&UL3vcCL?3RW~a0v$RC>_5mE;tj|*J%3(N!+(V`Eek|6uk zuS{6Wn}OS@yGf@S38n^f0TEO>RS@n(-6okXw|2aotOc6@FpN-{n0*A3&K+{Q#_5}D z>p6%3A!rwB%hr77kV>KbcgVR&@g49-%Mcgz>khe-8YU4KBMUvH4pN*mC8)%HQt9Q; zl1oftH~%S{|7xodyr*FG*o9T%2p7}fU4|0gZNKY3R>t2#*Y>oAE<5F#R&*Nb1f>rtw%NpQD1xXh|=* zh79WkpU_wwB2iS^OUCH3YT7&v2=_vWQ>uIUExG9HD+DDGtB;gt(+Bc4S`&DDAA=a_ z_*A|qVYhxh+KxTdbb*sH%oBJdyy+wNG=y>*Y&D=cun~uPR<606i{9-XTqMA9!bkT& zLp=!1^a*3@Pf-YzzD%?oOB2C|SnMNvozg@>4iWgT0oT?m!` z0sUS#JYhGzmx zNEE@tZ^T5eRpy(}Q3%bqz)Y=6^92s05Wem4cSeOh-%nh-N%xr2&j#kzki@97<|~(Q zX5p}vCQkDqkFr74A2Hg!0_Yd~Ltp%di~ejsNv}}g|Lh>p{{VZaXF{@k z=%WzR0G-|}B!@HxNcyelXK4>qbs7xURC)nHF8cZ?Az`#V`=K62d zZurBYM#uji4W2r){8}V*W9+RUvndHm(V3$P;}H>=9~8aLe(BmE^wE+@ zEbL(Y3`VGiQyG&ac@%%d<03ps?XiwX`xp8LoMXyzID zRS(tD2fZ^X)w>)?Wfj0!QQj;jF@(ugOWfKBOtRoq>Ja`6Ha@VXh4#Z6LW0n_)?i^& z@H&*|!z7Zc*R~msPeFh!)RsCgzPgSoK z#o+Wy5XHZb3mSPz?rEyN0;o8P3li-XB5!YDvx6u7x{^cCfclW|s8%;0BAEK$z|5fM z6?p_Th{=XRG%0%7{L1eO`p6~lkkTufWvkQ>XnZ$RGBdJbfSTOkS?W_<6Ph*B&H(So<+#Ona# z$mO{ZHL2iVTTaYi>%OGcQTl)HN@B~S2u!Sb+b9{@A}CB;jK$SH!thI7TsZw5866)? zT}`m`KjWV~*xoZr&wafMcgKtAZFSgHR$ZyF`Q!S%Q8uI`3xk5h0WwG{-Z3l`|sfvA{HjgPjqcP0m1zRI?F7I*VcaE zqOUg;R>4=H0*R8*?tC^Iv5s*)OC~S4-S(QN_Qoh5c;(mIt=3*Ssk?pCpJ!p>Zm|< zsQSiPb8)tX3(F#n?_^Er-$8QQbS^yMJDHS@U{Kf$F6hf&NOlOId^n%x)c;lj)c+FMi=c4=_3djGjYj*xznkOmKaQxb>0n1LRfD z<$~ZUk1%@lgOul7GIuie4UarI9oZ^L7q|o2O5XkGa$xq{UrVI7{hayad2BaF*Qo; zk~IY_-OydBRx81_I>+j|gOH~=q8|PNQ5CS4&cT1XzGo)5XNBcgTFU2y%rn>|!}_DvnL0)M9bkDX6{_ z?8L6>;d15(gPe!)IA)LbREmhAAp@2KE=*o<;KqHhe+kTZsR42^31^s(lNm&48tOq+ zmjS6AMdz<%oXia6)PwIHcfz4HW~B2wgMF$PG0dN+>-o4;l0mCULj9F%OpHl9a^oxpa`=ys z#fPC7x78y^LwgxGv;-VV9r>N$rG(&oGbA8Rick{=5duYIaVQkyA{>60d`bfmns8o4 z6*0S*q`m!D#A{51$r-Zv)-w@d9a}7bGJ4m@ zb5gjN!h4_{EEUMq?WO>ZD$S$f(s;z+-mb;)zGGCJNWHky8q?>#*#>auCSdGNanuQd zDNl(hJE|{55#$B7aUeO=uSmMLY^|-iCA0~47lxV%7vJQf|HCIHj5j21-x4K|_o0)6 z6aM?}VZop0aH4=Vj1{%xHbFY5!jwlE%A^-em7#mLz>yi=z2j}fq)>>Zm^wOqi|kmZ zF@j&PHXJ3$vl3H9S}G&~Qw0cKLofeJz#yJI$1-*~hCPrP#iUTYJyb$mm1I^^1%jor z+yvpOka@5b?%%uOdDL!1a<%rTYjpQ8@%xL3B2Ad%(cY!v`oxYYmLk*Io_-AkGvZ*zF_Y7X`1$`N4!sPD z(S{2Y7=7^(xo`47zZ=YUpwJ6W;i7*7^J?4=qB@{@lQjpDM1DHta2JU|BKBO6iWyU0 z6w@-YZ)JEPdaT1#)?NCg>SeD-~#vG7$vuWJ+ZQqX_y20~j;?^Jrk;w>y;dONrZVA7q!U%MD?BHKvsC^Z>&_c zhEpnuJPesE97-?*=*tBHvKEn$L%oJ%Vta={CvI~fT|CNhkA<$9eqcGxZsRn+WX9C{=C0czafhH)S& z;5P@7MaGli{ub7b&e;hwuss9p(hGIV-jE;VPlZkbs%6oh@k~8jRK<7@)h|Rq9mX)! zXr~AW;g>6MT*Dafc4H1Mho>SO+J!;COgIoRbo?$ZNr{6I==VRPxOy%nkY%ko^iy!sfS1#cI%&Y91bQzu z=6_5lNK@B>+c~+TgbrG>7I7dk^pg%dk(e9Bnsy(=9>$Ue&D6UvIg7dItQ3Qjm z1)Bl#a+Yx69So*2{^Y*X?`z_RoBfNiSDolx)Ofm~qA6_7J4qEGF?l{vZofjSLW_Qxqj-h=V}PXGSXK5q_Z11$sQy{W(tw z`fL-pzlf2RpLiaFJykOdi#BSuad}3Nj+nqaH3cc~MkriL?%&b|tW-pkQ!0qW zCNhZ^JXqX!epCy_8$(-CjbEoj(3j7Xl*79aZp)BCXS*!SD=iGiw*59^g1&x{q!QY+ zfqdYtiXP|TsSX#~ZO8f%zD9~$d2_d<*l6|;TewRQdkAF*WZ9XNhTgxBL$5VDE)GBR zv7Q069{;3z7hev&_-H<5!6PYr&-@8UXCIjQ$dF9%v%7AGy@&W}g3j(lQT=2Uhh7G~ zGb3}Lv^j{fSi^w?kheJ;6=ET=Yae5<3PcD%1W~=Jm&rxHrd1M--2bNfK1?1fi;An@ zIT{Zhr^$fN%BJFCC~Z7xPaTH8Jc0^xweF03btVC zonHqxW-CJnY-YhZ-SSF5> zRF}d{`Uhj9U~LmY?>?0&h7zmcLJ#J@*CwZaod2Kx>(@t}zDz@uw}>f-`YoBFNXe2M zDjAkw^m_v;E{&F5f!k?V=gS71R|qAzGmSXx<8VZ5Dpp+@l~WS=Ph}F>C$Hq^e_T)Ht~NZgvt`bWOZpCknOH$zBMW3X`hSSIY^ zD{h3%SC#4JVDM(iv3Ztv7Z=k_Yck&qT7wa(sT@cEU2l|<8BJZP$*UAcz=(;k0--u# z)?qHD{w^scbU&2zobz+dM(ph$`+yM=Ip?n+p&*ya#KK=(Mf8qoU`bp)6&FL<)5tC< z6{d6(d-NwqZ){?bKSeNUyobBRu@r11!XYJeR>BzTO^olkt9om5$>jN*}{N@X`^il$W1VDvDfYkdgP|(f%Yp zs4(^fId#4fB1q7moWV4}rQDhUQd)(uQX?cklQh$ECY0ujV5Np=&opT{lroc?+Q;nj zKlKL^n7!H98O3~fsVPaXlI1|Qh_nMpD$yknk5Cyg^nSjyB8vEnvoZYZL<~1ZR~$&I z-eRSOW&{^&7L#~dcW#BTG!L|43nV`39OQuuhg2GWR1>dT?JSUD=84PBa%4`#oA5$j z*D~y)bn9$*X&@!6a_164a4RFKq~Qx^j$|yFXPaK#1e)_9e#0qD=@C>WUG(Lcv@Y7@ zL?&vxG*@BlZ8s4xrbSRVv)7O1Y?w_hAwJFq!(YdY#r>U_#FOc}odCDpG8X^t#3a(G zt~21QL@I7EYLxu-d=u>DU=CmyH9lmMxS0MplSxKr4#=Cc1BbFKm?9{-R$2vr*BS2T zbPNvKMdcJi!hWRprY*?K_J!%{b(l?4b5P}ZE~am9q?J%S_DV!7=!0EAX!sQjH%8?y zK8Id zh{6Zc6Z$gB=nWW+Hf!y zfKDFhZ7K8}-#Au@BQdwXyA}yCU55?eWlHX2yV&jTgsFJ%Nb_J4Z+$EF04uL)Al_i6 zA>=coQK!FnXZ_$YrWLx)9E#=vt-s_tXqzXKm>V4O1VP5Se-Qx`G+#ysKkvc4Au|_X zGd&zeV1hRKkUpMRSmM3f{`X8X1@L?s40C=IZ7P-=rYTwT{${0lAg<7wgXo}vKUTW)-<47_#JfaIso2Y$yHTzKvVZu}C4hdFZL+FncsUK2MjfIQp?Xs;J@5^jI> zkEI4|VbvZ6O72J-Q-8Do#=WZ8r`Xl~eIJ_DVDb2QlL4KiOH z=ED1XWaJRThg{~b+LC#B2r6a+`xeyT6FM@MDaVH#P%pp_zLoh@Tn#ncmVx_f3&~uP z=G)K2QfCWzz>VWDY*vzAK;<+TeWTaxnNR8IFsYM;1uAvmdVQQ=`sPcHyc&LBM0W{M zdW!|~*&shA@fNr(7$kU}fExVB@r<$XiTq74#0-qGq8MaegOlPuw^~HDhW{cEvbdHI z0%?Z`oD+K*%N{}Ky@urkHE^;o5u~DvnMQb|UU}1T1?lqe+<**WNzvDJnIIhuV2Wg^ z$%>$Di^-*R_F_=l@SFn6puT!?R%O$8v+Ws}k9|sn>YkOaa2~u0v;E0sR){}HD|o|^ zCWUJKNkum?h`k+ou7`OG*r9-K)X2(?&W3N=7%zGU4G|40Z2cqH0LUSpURvhD$Dxi_Oa4^A!C+=`O6~ogC3H;VlGR6GCN@I#RT++xRkn9+7 zG8#G|&@r%AOi){|y_}1_8t8Ea?SUXF^$ZuJwTu+?BXHK?li-Xe@IR`k73Xkzywzft zk#mSc%RthKs!?QM8IyRyAMbKN_EZx(F29ylKy%W_-ll9f*8vM|3y2Qtx#Z89QAs7s zVYI{E4s3X@WN8gdH1xE`?u{5-AjD&_i8O*hGxj<)>mbl;(X`!<2J=mMJuyX<8GCA<^#m8<=Tjg|9;K`# zPuO*}OCzx@JnVfGREE9s+zdm&fH%I>D$t$>pQ!sQ%m^=z!HQ2Sj~2_L4p4;G&`D~R zeka9I4*})hmyRp7#0viVyD-@X3EXbziV_1Q)P2w4r`d2xWh!x z46St-4{@|;Y{)L%Hp-xZ*ZJleki%0-7ORCZP4HruFepA%P8Pp;B1fE=;Nk~<8}toA zTZBRGqIRI|O(esgu)nkXaFEk=b+lLK7thAfnl|eNb$D{<;9SGB)QjO z8wuF%C)`+OBpIf~820Tw7nT)8vS~&E)cT1F!k>b|E!Ji3Ui1+*Qs2W;!k&}Vv60;V z=O}|H`fV>SjDA4q;KQF;Yy+zvsP!PoXHvK_q)Lv+lIYRTp30qD*eZGT=dpO@}l^#jK@{}deGk*P2jo9&lG z(lA_Xqz+yGF|;`~-B$*TlK;*C>$EnJU68p6q|xAY9)G3b&#*&d*<${HfW!X`$^R19 z7A=C2ZWePKdhl1s8%)S%veaZVlSp1}o1xSm9y-TpZ&fG=p!kyta`<{5H`m%u<;W87 z{x%rDsaw2RTR2Q`WfQjIi0F$0d9#xU$Ulyp8^&X$H+FMMC6Qd6f*O*7I|?}0FoxT} z1L&9))3%VSSl=yB>X1&9MzEOzDDg7b7Q35ll!o9vYCmA^&JT@3onz}{ahTv+8bK`L z1}1|I@}dek5HZRAzq+mhtg5AJE7C39=a7;ItZOUStr*uv)N7-lUc11!Di~Od1sK>M zb_>|8*e%%IttkIHvxj~59KQcNk5})0*IKh?&6=4t{k_=SravlSJ>*hsi{Gx7NlnP( z$$VMswC%3QaA%xghdCmJgxb*?52X{s6~Y+VR2Vf)P; z_$d%|9cL`ELcCIP;KeH&+FO$RDZGh1Jka)ME}BPuH1TZ(>pdwi@c5I|ARg3B95dis zW!T_4N@%FSW8)<7c#(I_?S0sC40WrNX;9^oi$LN={xr8YBH69%ady1q_DScNnJ52& z3(P_S;{5SNTzXfMk@FD8y!928I}^t)N{|MB+uO4SmYHpC!pIhzA#EL`iOawhnI{oK1gtfqsS)9LGkE>})6d3d$ug=2tv@ZDS-f;UP`oToLvXwb)7WxLi;HxR|2jko;<$V^4n}ZNdvag~9~BkO zfRuAM7{MV^5-^k3j+oKiwjF}cc7!;wd25N|2b|u7B+ull(u=+w@8=2nXZRzU{+~_? zdUYb4sKq4i5GU7F+U^7gS`X(GYtwBUWI!U+@nAk%>U}#mOj9XTp0{C-Q(Gm%`Q~WEcq>6U!t%jM5|l?LAUNA=-chZa|*4 zCi0R=r*wVC%5*dlchY?TUn#8B#B2zi!~6+95L>AR6J#EivSBvF#?IzqC(VXf4_rQ| zwTdx0KbtT9%$>2M61}gDps^6!GJ2+fvyjj^Ar5SVLvW8FA+_Mu)6nQf2o(`)64@c% ztiI2i!#iTrxo*z_K>ZS3N4P+}dWBXv$c>1>T)wkqTH1$qL*Rw2(N2ol3|OPX^Xi(t z7268M>g4>n$mhq+jE3aT<=&OHrcT?nNcsi-h=buyyGz6w5UUp$OwqwDlhkz{B(>io zzy`$nrM(HsETK6-X+rmEX^Q9Zd6?}hnop;}c11M7Vy5j6YRS*PwRa`^_wceUTsGU5 zZe(qYvTYz3s_b!r$BMj2#))Lw@tfH1dPFY^&>)l$4b|+lmZ!yhUKZwCuAiVs;ry`M zQLL6f&T7f`%;yU|Y=ph-Dnm%yaSkS>PCqn{8h2(sI43o1slmr$LRc^k%JkT zyMWs_bpdSms6Z=QB6_ue`(!PXwGEo0hoFZ{#4^i%s$gopkk`&33n8!dYXxMga&RDL z7xMIOQ+((b1s>?{pjbStzVUa)Em-~?Tuw}HPdTz}H`-BZ0Ftzbr?+VlwNEpf2!-gBo5&RJt;=)2n7zu0Sulzlz+5!-l$56in|y zPv$M*!F1rhd9Uc2izjl^L@@94zeFZ!j>LH>lnAOWLKbBB(hx_M$=MV)swv^&%P{A2 zZz*5xExQcRxmq$5!WiP{*TUKgfh%Jj?6tWrq`0b{h+C1j!yItxe>pcz)N&9VkC2Jf zvUwWDy-5^$l$m}GJOcCyMovAVwc|EKZ1^S!9xW4)Fv{0EA7g5*;FL$ z(oBNFQ$wOyu2#{nY0agtg{dJOm~XZZn7BL$a@8=l7;f9Plx16zH)&|llhR7&bkZOS z@3WLtB!)|SC9To{)ovq07NjV_!IIgIO&ewme12sT)(01C|S_D&%=ZUtJ>gG6%lPht8KeuXFyl6~xm+C}NBp z+5dlVijNgi0iII>-`0iz`uapmK|k|>x&rPjcd!;Vxl=XsS3}M1gLG-3ralQ>6XL}3 zvNay}{dS0vh^%*@vd>$?vzfLA{L8eE38}pvEyBeO@Cqv5Gy{12zcMSsz1i_CX5fH4 z<8nigf$qqFIGuBIw1Vke2KETi4DUF77{mjQ)9peO-paP3Xb5 zW`cow#LM&n4Dx6u%BzTm9B?D@3dVbS+ti{8%19Vf!E& z5c6|*pU7lG=DkKGqnu39u^S+{>p@vjOXB(tCG`s>$tpcH4g|BGFaKMbU3x>5ObMjDK%1>Vjs+lW-}U!(%qR|B$A&(T{u2j#K}_@he{4?w{a1u8j7;OnJdW&SlxUwQHKr6{gQZ|nY zR%JuR@&P4?A$gn4M@42^Y2yD0h%t%Y%GbC@{%Nvd2Fi*a0Sy;Sb~RClC-sn{sdiQJ zG>Pjt2X=mqXjW8k-y9vrn%np;hRAKuW%YapldwWZ94*<#qq##AYPD2`EXj+#yzlL` zal*VyP_YRb2{EOSSu(u?d9$1Qe}e;ASL0ziON@8KO1OHfOm9VE9^pCGo-sW3cN4@BkS_Cg&-1(1)ON+W}2)C{B zmE&b$K6?FYd%^CjN#3!LAjv$CX+q*FJGqhXcte3T1grcelPzAZ<#wq1dvU|*5ZnP4Z7sNlW`@8R%rcz2A0kz= zw21iuUZ;W%0C_pP1i?YR16=>hl`Kc5Ac-bOqLGk9bv(~To#?ld6?t`lZ+j}J-k`WP zNdGET*DIbWAy-tuz9(X*(Tk|)<&ENe>FM(&5(@(<8G=Y4gyAcJyw7dd^(lwR~z6&krV6!iZuOQKhw3b7}}cb%mbA!egU z{btK+fQep=86hwY%T^@PAdk;YB&&lbenqkUM6op%=uNiC^wwltp>uhXnZ?_er`Njv zypBX@=OY$GAMCg1Ik6@IhxxYf1qDB+6hNW#XvjJXiLBov)0Zb34u@#ik-SA?$IcHU z1&47YuV}x5KyxG{h~=`C!*2Uk(0UNG7Mt(%9EpDAk&rM(TEEic)%0FXdclU6!S&d- zFY9Xd5gC-10KC>7v*-n#FirUFY^imvy`S3urkc?cU5x~$j+Ycn-;eP*-i_~< z?*9$V=JF3J)Zoib6 z!cK++Gtvpq4pr^}hfIKF(C5j&j0F3SvV6Q2buuJ?(O0m`$PEX5P0))yUco1c9#u;U zvh41k8ea#b^zIVTe`bDBh<@#Z%^CE-Et8+(X?68Bpx{xQyE-qRto~8JI))EdYS`zn*d=}{1=Tr6PLXBxC zO3};v+sO1NkO-6tdm5YS-*i#T%Or$Bi!l!>4q`gnE0oyO5cNrZF*Gb6O0;m7@Z^>* z{#s}=h46AXGcfdXB1V_^aLVlxpcS4nB%RQmPrr8dmA(QsE zqd8#81XH9?mtyKDm@dY+ShANXs6C6PdDpf>Ayh+iBX&?r>nV7OhEmsm%`5FLy-wHZ z{M{ZTCQe3s*O!>CoVEr zMvF{X5WdcZ7Eq!0dMogd8+-`a{05-&eH9Q>D*XnJGjk}e9;m>hvs{eH=U2FdmS!s8 zCh!eoL>%Lqn|zZ`CUDZ}1%?&O7+_Wtms?z~fLk~fry}_;FhfxSgZCB>KTi3y%k6}o zXLXRSfoI|9nQX=HxA>~Yu?2Y-s=zL%5Hg6isj*N?Z_uu9uYd5&7cLH9ZOWoKrWtXt zXbd=;2!3~JiI$6u$wQr_8+aJgm}ctAPn>bCqrUD;dg^kCDgQP?&3kr%JL!YX^;Bdb|cn3=B+z! zesNG%8k=8l!vUl2a&r&4i?aH4M#decOOENt;nk1B^4;H03$c^0$w-V-k-ZjpSNBHON*`R1RIe_IxDoS0P?yzh>!us z##^ z`#Sh4?;|a9Am0V;QiPli4JJnWh)kxWZ@!4;ieX1F&x?F@nR4s9mS@Sa zntSH~a_?D1BB~wf>O$%~G)f*NSvCA*r2QofyoV|6=U9qgN3z7s4UL zuJ2KVB<@d?tDBa7?${1JoLq2(6>*qI@6tk|-#Wz=Z=4Qrwb9-wu<;SpTijR1-Pmmy zOmnx#fa=6ZQ0G~$KH8-6Rn>;ghvDf~DsieOc7#M9easCb{$yn8ZOQE#4lmv{8@~}< z)v2;NTOIx$qhMA+hJvYTvW!(90H#eYiw)NEAoHEx( z!L%vD&77#8a+`-fh0T-6d?!tiBy-YJ-UO!t(d$!1!8tk7&4&Cb;k0-L{BvCywx0j^2Sz zI*R^#Y=X>bMozurGYl_YL5a#!Bq;1PpLg#18ebpIkQt20pA0uVTZ*uRdG%R}$InvW zE7oCOxaJMV>%0MOK3Brko84SVdI_|JLXA^o$dZ(M%iB!1w}9rZRzO>G-Atv&v1$LE zNbwfy6{+5O%e&JfJ0BKJK)D2=NfleZ*4q^HgD$`s<&LpyacJRHw7;Egbldd69THRA zVpk&)chgOu?0&}!^z1t*(eZ$Y-NM9q0p(9KLoMVcr{79S25npmhF^f+@Qmm<-(9%M+6`{BU;L zkFZio8SzE1?l=BU3iN8%Sb@LAo6_w$|C{S2|u0bblV;D zm*S}AkGl@fz;7Y`%x3>Mc%S+gJWhxn>dUFnKwv!XtuC<{fs5D>kFVUX?DeUec5RO^a%6k&k;%Sgz=J=LOmSwDF1apnigBOW^~DZaInJ8oe7$!ED| zddDZug67%KT#S1b{w32}lZ)+PBY7qu>nG$*t107N3}QAP+-LgDx5(5$*j${LpHWAq zwvOlPwhZvm!p|H2n?e z1umxMxwa<0G4A{U3);l>tJ=2xFR1zoU9_0>!ML(oX1ep6cSl83-UaOR` zuRnl3^;bakJ^5`M>#n)D&>b<$;kaUf731+{S(H;T-@8-07^0S7d#4PYpM};dwU`?u zlj4_$P`nEH&A%=-$Myyv+#X$9Q;QU)x*IMYqzPo@(a}6Vu{V;ZGqd7G6D#Zj<>aP| ze`q`y`Osq~qaVS&%EKMRCAY_;wB)2LZtZ6cflFB=Tz#AZnow3FUCgwULXGg8V@VOXRl)G9b1SU6UmG_vJLwX8LvqEbAMCv@1wO)7-!f(KJ<%nwqta{ikokUZWcH z>N9|pJrB)riZi=U zm^{q)IqdEPUBnfIGPqKj%fr#M9e5IX(pGmP5@f|CuQGt-zwz|7lE_h;a*!eLBP%65 zY>zuO_*CJnTPak43!o`0APdsB5yta5;P=7MWaCDwEhP(yO(mHn9%yFd*4E z=u~Ks$2?-c5rnEUMcj;}A8|L7_JGi;H!LF1YZ0p63{*XF_3Qgqk<*Bz8gqx(Zw$$Q zb}4Wt6JF}w?HeR)fcf-cK5_ng*IosEz(r(FUgT)#GIIA{V9G{Q+CpwfY4>pEfP%@| zR3pth1(_oKfjJ83-c@&3HZ8!)@YgY$S(Ra~^y|_8M`TPU|3oI~+y~RNwKd4gJ^LTz(uw!e6rc7=#LbDm zo`c!9w?*VYl6+$ znq2O^C7DY|xRu6UuZfvNmFJ+bCmXCZ(qT29p%V-*Kx!9MKe15SS;_R$&gFhn3)0$y zlwRv4miHOANR_<>vLl)$k4NtX2xl0|ULsVBS|Gw?4>lKt3y#r2UGV;?h>BYp5duo+4IZ%W1E$Mz|MRo9X z2VW~WDcWqd57hD*#>6xp7}J-%`Nb-#r3>=#HAJQ`Bg0*I(6Mmum@{;}>wc-?$f>BH zZx+t|fjN;`kCR>LJKPtMXVK|mt0U3^1*AMRtwRb}8u7cVN@p>>fyg5-d zMs+oJDn6!9bNHd;R z0=tkjcdnatKzzrkFkX78=3+XIy-K>d64g=<)(218KqGg>4&m>YO)U{U%Y_|H)IkC?xL^D?<{ zo8is+4~-q(mry>Y+BqumAkN~JIBZ}DZ%$_wZCpWn4|-3$IQ`~(T}ytx5G65wBX5D~ z#+rQj1}nd`(hV+p-j;cc8;$w5@9?3$VhA1qlis`O@u|{edNWs7XfFm$rwU8+;Ym$t z8|D5GDBt$6OhKZ4!6iI2JO>`?pCg7rn=vRqvFGlH6T>ALW<1L^ydE}b+;_|?l(`rD zL~KH;zSHugg=!p0ow~dU2@i!D%RURR)P$U)$oijJ1c^y)95a5aFbWsT@Zu%T2b5LU`F{_9rvIXR!~yDQBQ4MViW+_wctuFV>vUXN zn09>GwGxnvRwalp$*IH*_;3H2vp&Fpol%_P?gVo?EqSfV8fUg0u~XY?L#`o8+y|}1 z&=S}0_SSf_OdP0;#}Uxtkz4qO-cC2IoH|uB(*4U(Re%KGofTx9B-63yZMDjc#V3sO z0mW5560WYQkwU&EzyIX*Lsi-hg~b8(D1V7G4>R9H6QHuz4paAxQ(4kkV0wSK80s_+ zQZQBhOCw!n7x@>G_7CBz{iUhH6w0SxziVU$U*cfOeWO`5K>1-Zq$2C9X{76W&r`^~ zssakCu94<7ALL}2Ek$1F+t;F6<*F;__g7b0vXy71#ii^y*AXRE;q(hoH z6+b>4jJ(!IUd8aBLp_m68qA#mqh5sw31Y>-f|Pp^Frd7=zWG9^`7a0@0WTD5?mvwb zLR}lH6vLe}H6i&*GXuYdlN(Ao||4jS!Bn;k9-|rU7cskzSksAdtNe?+pt`B+YX(D7n?oU%;&(I34 z)K5y(K2evbX9He_6Y&ok{s{6dNWHnp{_6%@$S+DXC0Rk#zM)2Xa%ECOKvs(t5NeAJ zak{YSV}ZEO*u(JGmc5*a=4$o3kOS6!adeQL$u4d*293 zEY48iO&e>ZJA7js16qm)eq{SK-+)Gy);Z>W%{mv74^zgFlFvRdI4D~ z3vHqkn?Q2oZ6cAHoP~cf$*(#sIzZbU8~9*P!3Tfs7Mc9Cao@_O5c+7Z0{`BWH;zlo z+>Kob%h1#O;;_~wSEhF&&MJPhh+39|ygVrtYE3*T)2qnJd{jiY78(~ex$(visJ7gd==0wr{ft(;IoQ_< zNl$+yLuyjzF-%+7mOIthGv5caLHcw8UYrYA`&7Zy;~83i%ETJBv#lX?@Jj_A*hVAW zpF5$|s77=>Qx7^u3HpV-QP4ksqw*jZ+i-dJ+dy9R_cD$Vbvv%##mOFz(jd+4LSWuWv8NF4@ zpiaG@#1a~537J}0q+n|CTZJ>DC7GJo4oVCvR^U(QZyLf9uO88v`|5NjWqT7xcsszGoj8|s3VRfnwu)<`*h%W-nJ|58$IWE1oWZ} z8(Apmhj!Fh5K~K~epVf!M5wh$Bo%ZeTQ}7|5V{sZMaLOqr=SnBS37I->;5<7wRaS8 zb29U99@}qkPMTkY(Do>8F`TXIqG0;!qQ-n_N$K31zp8gLF!d^Bj*0FHrm7xld#ztp zsv(+pEnI zg%V*MWO<&_q(6lMy8-&vMTX4D$ZoI|P34YT#?_CgUschOMhL21?5RklWlyDQgFUY~ z4S{j<(7TCD>H!i{a(}gyK1*cgSs&+%5Z(p-mbgLob&Nu(0Ws?GWGHh#7mrtRRU;V(O( z=+|8O_2Dt;YnNkc>1BB)yV3AxhO;rch;i24JJjcttcw9DI0+}7)Qe|)PA|x7bXmqN z@EACvOPaUFHDgk5!?H`zPKy^}J#itP<6(~U$o`29GQ#+ocknIqO0gycj>dTd_*%#2LSQ#=TiG4L* zj4PW$7PxkgCIc=*QVfV$>+dQ>{XfAAc3SDSG@0Wh`l0=>T1nGh-Vag?rzoVn>c{hK z+8WPbG za7h)@XYc^v@kc2hNUR59XTtsx=ro1$wUCs7Is@^w_7$1IjLaLz&2VP+o9|;VFk9)O zJ9ggqNI@U`$dg|{P7M+~2=ZoO+K4M)MkWoykcC34D3tO^0Xcv2bdXM$P^&zN{WiZ6 zno*U9ZXkByhk|L)U`&}%c}asIua6N)n1<@VHAZ7Y3I=0_k3vO&%9`U2MU5XtY)NDc zM~23L>7cvJREZTxiltLZAVS+>#DLO|@dLH|!x9beh}Z~^E;LElt%TspP; zAVi{XJKD>d>;gU0=hhIU>Q_wx1r6oC@GxjdS5q`2=V9qaf~dd-GJScnrM?%x8=j{B zabh{Qp;&gkauy3h`VUhD?bAGl5`2Tj`cPn-A9yEE($$XLec47R^)dEf?8_I zovv*^7@_a-L61;ND3$kX6!KL6V)#u}se^y$wcQ{>CWLLWqVje%*q(2PUf&7}2;!VT zuZ_A)MgL-LiZaC+wCbCLuA>t|1+i@@+^WkodL*Xhs3xf+p~As zTWWvU12^%E!qySWl}MozxB^y&CLi!JBn6`|$fT;|UG<;*2KMNMfJ$_&*rN)jcSpQD z$lTrBh->wN+i&wni-TdQ=wGK!DVUm`@^aELO)cN=L_IVe+t6P&7c5`!LBZ7XgO>|q zV(Leaf%^XyEAZ?w+)2&?D%af6mw2x8u0&kN@)oD|SbXk`8}#wHB1sy{Tl!7(bF+ck z&!(i~W{n+7#AO_?ErU6x8SE`xQ^~M76ibcen0u_ZGgHo!+U{zEzVnds2*&($_g=0a z!5J!y@V3)346WPmU=He~CE60PNf_!fz z!k{4r$#mDnAo#xMH)d-XS2t$9$&(=G@;ZE3=Us=GFX3&?3;Ov_7W-V0Ov>_>ZboL3 z*M7KPjz*XUkS;n`{yxSKLeeHB*3@`GEGb1F3Vs+gKY3MZ|+(V2+l+iY$-k zlLYi;rgHuAd`V=8Plb@SEz0WIl|!pwY+Q!U&CadaeGR=}?_H@jKT~1}AoCVzEJ^q; zUjq`ApmAXLaz~vXnN<-3Ao~WoL0qR3ETI4r_SoB$oB{(I3qMGJ5)U6Lu}V|;wy#!G zfbD&(#T>PF0q>{S{ihroI#pAi^(4}D<|8Y-JOK+Pma?GD4=qD5vta5}$f^5_f8PDm z+e*5ln)chjE!ObGkc2^N<>@`y|Y`Mmtv@rFt)YAV~w`!YBNS9uXQAwbWbC&4C z&id$+tZBUMc{VNKWP}ZZ$pGDx27_EB`a%~UTj@@2TG~O=(HQ7yBq(k=)>o*Ovu_5P zwnFQ>+FSQ-RF^P`G&$6#Joz)7_YfBULCV2!88Rb1{^JT&ZT0t34+q@d5?ZEAWg!F8 z8p!nexF6jI`)cSOB%1z!<9lOG5Mx9m%Mk+8r!ErH@>m~x5;}v&`Ek~f#&lZczOn9@ zy4w($-hrggK*7*lAHqNMeB)%uov3E=tY~HeI)X=xX<1Ysj@OzGpwI!^aMJ89Gww|)v%YPD9Phi@2=Nr~J_=T|L{qSL+; zOO4$2pOxwD$m>LIieHJy?}U5_3QywE$5W@fVcGD=yU->`3a*8|3^!xXO;T0; zucVcu7b%ZL@}d`H;Pqo_YN%>R)U&Y%iqczYMzy26Iop(?_rIZ_KXN8mqR;4?d2S=< zm!owNT& zjdT1-+;WWa(w@O756$7`J2waB>t#bCS0a1&=3*m_+gu)(R-6lHVIvtbXU`t9oIk1A z;^I~0#1nC54WUp|n#%Oj@Vb~vIov|}TCIhzJ!y`|E|`?jdyC>caI0~{B;A4Z>`oGW z@f55V_IT)RL@Yb`8j|q0T!O`!nMfhWtr9dR+t-1Z%;b&4 z&L1a&R>D#_u#{NlpLa_1!3#=)_r!wF$Ke{2(DLfc1K^n%Ij7Nke9My+`P_!nqE{?? zgRXc#8bZ`<`InKPpCd7iJLGFxYO2M0AvCUcLZZl9h)$&6LT-lf6l#xm*=UM@YO}_u zn0`I@UH*!NsPDdbErj0GK&>-q5%7J#Bs_Z&Ryyd{2lQ*>-_lnY#+-aU#p`);waC81 z;n?mtlPu2A{K3@{nKYhF))n#c|DE3xqedbbFj zR1+&pn;?m)kjm?s!Y4%%QXubfh(ccX5I<{eV^DrQ3F&H$>n-XgolHLmuVo>XkUxF<5KO*7Cy&)+)j4UP&eklbG%t^>f#D3T>A{p4&+Yns)-$r>!u{&i131&vtPtQ)VQ5T#Nt~;LtiPO;%*4 zXZ%drLq%+R2F*5-XFm=9Tbg0Qo`HiJ7xMn0pCjqH43(ZPD-B(SK53SWXvnRSTf83t z(F??pbtIJX+RvHPUapaD2q@>)FqmEdTmyZs7_Gj1UPA6m4lL)9Vg7Omn)A8@3DK_B zwq5~b&pRnE$t!rEwwZo4d@p^COGAYTbF6?%Z&q@ZE2aYf>!XZ&k~1It%*o1Bj%QQ6 z$#)s|Cz@4U6-^o-4A>6mXt1L25XR2^=I2cg8C1ZV0cj=tlt|x1mnhvBL~MLd?G}~} zq9MmWomEji#+!JH)4hyT+^|8i2-j`Rig#i+JokWlEQU^=&&pF?<0<#h>C zKsDCztusB>0Qx&j0p*8QuptvRa8*uIJh;Ayn-h-=v>sFyjpH^4`Et!|8F(orI5Y$nox4+lz`x{YfDk{%k0@GRC$I$l%^;z7|T1j8Z`FdQ`Au zN-}xdAIGHiN7!}WQTKG<{r(~oI_3TqY{_!m2EsVs+3k=2f*#1*NB542wZj#hs^LhE z&B##oXBOA_HWTH&4{dGsPKMU? zy#S%jQRziPE?6uwnUM+W`JTh2>ml?g5pi$r6X?_Ox}>f^&wLs!a1+7MWtPfJwxs6< zjr7uO(gw&Yn=V7vBz&U=m(>mDo9lm4JbR^xOS?7(Zv^DMRsk)`K#P)7GQ)qK;!QTm zxGizmq*1Xp_^)3tx6^>^8fJ9FQCqKU1^t~ZuvgM1*pv1V%QivY)m<_k%0v}6ep-D! zEZ7#2g&2zDpOZ=5*{lJh_xL!`u|a#>J+xc5{4e2}K-m-FzLsR|mtbk#W0QT=OuC)@ zQmO7I4tFiwRQS9V3CrX$cfiJ?P%kj;D#i58Ph|39;V>EBKe#J$at}EP7m98)>2(Qx zOi8`6BIa29l)K_tOrr<`Mj9Cg^lSNw3~pumH#^{R3fbiKM)(_%J6ko< zm2&UK_uAeL>SjP)M3M3@BjI~zU8Yu@{iT%{rqjwDIoan?nQOc2jy%?NS8y_&io4;- z-ZR^H`*Uj>bUHmqB$Bo;L~IAN78g>;>Vn^#6vsekdF%Q{O4Kw?LG*4rUvs~6`oEWL zQGXvoF|j-PFhW5O8#s};9bBKuJ0LF&&zZ@I0>=#_WBrXu0VSf9{4FJVGf5&!PWCq- z0Xuo%Hg=~$*A*xkdeC2-77xI*KNZU8VjyA?OK_E6qZf* z>+=Cv@!N+f5-Q3jBRzUNME!zlnD&x?83|RlOY{Z%(5z6>FKJVUjZh)F?~8dKnUF?j zzi~4N%>Yz2BTe>WY)9#9S9A_q2eGH%&Dy}8((k(>)0>mtCb$WS(%0XyI*KlHC6}V# zd|g5Rdq1KjND zWtXcbE+P*OVsG4u0tJE9K`yYzo`OpYPy}N!J0mKv_OXIK{}HPGyd$V;RBCa*eV2NH zX;3MqDKBIuTXOE8#++%fsIE`zX_6M2w=x0l9XiCdX#O_!iXm#4CAtVvi{E&vj~0vi zqrWX#`UrCoRDs&f#y9c;Jsk{*^sT=tW~3tm#c2k`IS84tfWED2N;m zb0r+_uF5I2!jc4LA4E6W@=KzR&*5$~dv&$O!;toC#FrxJ9lRIw5c=kS2rwZ}a}cj0 zX;L;9&bt(Ep~_H$TvTofMN=r#Q32g_2*7hux!l%|>Qp^E3f{C6t2AO(F~iK{&2b69 z6(jq3J#oo{ydW2`kddjdR`E(688c^4Y-X3~;6U4nKrLJ>t1%3Kau5QxV z4@)+H-l~+k)_5|6nj7Y`Bt@WS6{y3wr5iSqvPV&k4F)I(x*X$06?+Ut^$YKKP~P|( z=)$s&aR)m?p+9(nLxxO;1>mYbI1JO>v!mXCrxs<(Z1LBf9`czfF-0FoBuBFuqxyLC zGu%EAftff3*f~We)hB%x1lVikyWW`g_B*E7uc5;by)HFfVp5$z+(6~~KO2#`8UFDa ze?-y;8zoZp1sr#ud;&9R)IrluAZs`Ang-2U!MXqs>E&uFYWt9wv-=^&7X5!?s z(>sxlC$WG^Ma7(isD5}ugNt$^hfZQSmO}R_l$0YulTTq>Uf~or71LB!thNq*iWFkd z7-ITY{^9I!o=hLWq-;I~DPNCBUo|xY&B(h`{Aj<)X+ZmqNl;!M>P?%|sLcq2Nfd>i z=SvXF{PNTMoaq4yJ;Bo%RAY3A*lT@FT+JV z&SDx-a~Z8i95`8elg~hC?HeMIB{_SBj|~bb{{E(jOPgEE|DF*#4+*}2UyI8l?{7== zO#k?^801kUKQ*1uax0YkgFm7(UAU{D4?l-c=*?MF9Lf}D5j?Ur5}}I^)rFj0#LFMl z5-brgNylLao`b$43M7cti^+H3{Do=!R9(4GP3EUU&N=+4D#&a8Tp_RH;{d+-h!#q~ zc?hlfLc&o|jmW_Bd>^dd;T_j^K#mGJit;>OE93<{=ki#ljE%g8(`SHIBU9pV*XNDQ zB;}{s1tfj+t^C!F+=Tl)S2KObU#k*fYt!kImqU*yLe zt=k!`DnKV=jp~9`7x|ZwaQcfxzY@&MOLFKx-WdfG&vTd``*o4;e0I;r=l8}XpY;O~ z-Iq940>vy$IhK>pSqkyFY!C9_6UMLe_QUgs8VB04M`_tI@I&i+ty-dPxgzow9eF=) zYkiRB?@Ft^Ddn;ti!Y%rQzK+vLRvj41(R*p{5{C?OBy#O%&z~qnR}5fJ(yZ_xTDp% zUKgqa+Os`6jKQhVvM%&Cs~D7vI2C-Z24}cY6)&9A7X=xEtJ%%Lqd`n>XTjvT{L4t_ zSBq;CS1r(rU7gGrF12=iK`)mj2ua0ov_f5pAte{Z+wY3ThS6J8KlZsh;+|u$huEr} zY{e7Ua|JsrXjQ3^eA{O;v~LZ1(W}Nsa_!+8UX1qS20hztP}d0b;s|Fev(F^0R=u3_SoW`d5b$s6RI~)!BZP=!(0ahrp%A+v)bZeMj=VSlvd4(c=~}kI`fJ zhH>>h{z9yCxzqsQ{$$Qjn1gm_|1E4Pp$tQFr_QDm)IAX}BhHY283{fA)286a#^eFF zVW`7%S%%c4|82gnGm(B)B?pu8-2%MGncEs?CV6VZ>wjKBUM#XHE*th*$ZaxxZlH}+ zt7)H2(?+?mAGUz;B z7x#O>I_*$mNm~NTlkxZXm>`i7tlgz0z;fqS5YTs#ne;c5VBJwALD+pb9nIUws1xg| zpy;x&wjj2_9nLEmCY|DKCzE*KJ|q@g(-P>D@Aq+Dj#~244jeKMzY|P)bqMk#Q3YIy zAq8NGmp=QD>;iNVjGBI)@{~~rkgX3;mcJ*XIiOgLLSQqVGt7rnckIZ zF8`e9iN+XAgQbvm&dFQeGh@l16*PVbhw9->s99EO%PBcZcCDxX*$YXz$V*M0x zG@a85e2Ua>4Ao)=WYkjxt`tk6nEyznW*44nyqQI5>6NqyF7$uckG2TSM}?4KuQaYC zpAbP$c*a|(bc&4~&soAh2U(DskFk@Lp5!Aj2e_Y1U0 zw88yYO)u{X^3f9(7YD>US93WxQ{h(heKN*yux?eG`(U7x+oCgGUBel^rv+h7TZ3SS zrm(F_%j=K8up10wXJoLJF?f;Sl_*cz$S{V0qP73M0mD)-h&^Vtbv%V`tB^H!dVL$s z+OL<$+L-kmTd_LGoIMrKg#8;jW!4r5GcT2T$Bm4kE+fk_TXf+oNa%iPF@$TkiIKSy znA(TYT3H^T@*5FRuw zp~l}C3I4B@3gZl0))@T(Z835s(wgXVT9kq%sr8X39QhFmcQ909OG>aU6x(2| z#J-eZW}kprn{zD8DA=B~?ad4Bv`ft6K4_%ev3M&gvBpvOGb0nf@PLw1m#||j#DA;_ZX>Z*`e$Ijexb@O&a`auG-=-S zb@Cv@m13JRi}T@fVqRyPeTC*jyK-&jb_{kW>0h}YZK2qao?6VDypIbuBtO1l@JJIX zDoSWGzdSZ``sp?#kNTA2>hldj0_EEE^;bkUxL6fbwBnpka_8AP^8BJc@;rP-zf9I#J)5vd;=hf*QD4IXO9_ z83Y6XsH7$_!EdcUj}DKZnkuniVOl|Tzf<~QsevlULu@Fc*RMFRtbUD`G&(qbH#7+9 znLZ@SHPVIxi}eM2%3d2}2#7B}lazC?w~%uo((tR5VRAI-zU=}>&!DVS)PU=0F3l>n zqEt7-Fb%3Et>UP!5)-x3`u2B)Bwuw(pQuaL0qAKo_1?LBi6;3B3_j;6?VHd(yF6vL z8B7oN>9kt_Yjq6v=`F%+o~<&{)ZO2U?SQTe%HWvLz*n4lS7`1F+dogF1sC#U+Bm zWPDrssqi^GI8tU6zag}(f6=zr-(k@T!THt=r*CY7N{&l*UOXDppm}aywJHNErQcDv z;%GVGew8PX0{@JxFwwWicOtO&?0ImSfldae8a>CgeGF|HiT?BmtO~feGez?9CD>#} zcUo&4he!81IjsyaCcW7g zLmjv?4I3c|j-+zx2wOHE7~vy-K${vL{_QGz^*R+PjRZI zIS#5{S|#%Z?;U}Fa%6ANGCx7|T>*N+fy`twN8tj3KGM|>M5uFE^2cjj(^Xx??SX$n z7=Pg}udUA2*;X0~np+vp;Ks)i*`1$YApKgET9siiOM2Xl8S~&EG!{tPx4pF4N2QeF zb+$D8)YblJhft2FY9!l3%I<4#F?|vj17XJM98a=6YWQRZaC@m3Y~#ldJ?ML@rKl(G zGAqwT6gKF&(5be!+r25vl2DsKkZfB_kEKs2Cw;WJ=~1pM9_YECk?q_4{pyEGk9f%Eh96h)c?waB83}u7^8TfS%X(`xU@pFDEH^)vN}dHfz>NMaCRA9X5~Mle_d<&Qyig zv(=K=)0K7G78=`@f9Z}}dTosI>}|X&>)mp`F!P zro5Sj&-MsEX2maYt;-%vC<){UCL?OohqHBNZCaA1OT~JlJ@2JKwv<_Bc{*=4z4WWQ zOrBnFz!SLwzvQvMHZiys-kfxpzMP(#rFGm+4&=El?J`HLOS*^`YM;vob>_4V zu}XrFG!JJZroP#*+Vb9N({5%NX|)#hx%xe2o}co>S;g)bex8)HUp)`Y8hjf*s2!QM zZ}ZN4nlD|*)^TPsnOpCF{IwxDwy`mh;^f%k00eRKwRl@Tu1!q|-&LpEY-VOfQRUd1 zN!MUnn?~?Z>uI}t>*6VOEL-0GgtulJ{r>C6_eQwt9Ioo+9|_vtHPmGp=ZgWzvl;i( zHryF$eX9mUa5;69@?o=zT)y7gE>MI9%_7)u|kpSPrLHzxZ=Lmvoc}qR2vkr-4oyupAB)f}A zqB&u^tFA&$^I-qp5|H7O4?64lde{u%?iv{0VLnMxejNU>I{}-w>Og{o>>xEE(N%t! zmj5kEBm-3dVnWWK?#AMmXyPWVk#{#59}S^W#E*W*vljUfi=zH_Z6RfuCk_ z72iw@onzE34QCFP)|2Fk>WIrR&&J9n^&^SB{~Fa?TGwd78M*|KXt%r1g4$&lb#i$_ zZMIi$OR7lS7c=`?)3OzNSemqE84ZM38nT4U<#x>4wM2^V#I5=4)Rte?Wb*V;Cm9qW4fK-I)Ei=@ExLydJ2TSg zJ{IrSzMuO<5vSB@S*3kqK@;RfKMW;YS+Bhe*pTtHHVwHy=4LxU(PEEJ>N`m+PnR}R z%Sq}S4`nMoTSW{5vh+}V9 zr6lT2n}13Esm+ue3y?8;l6XEqN)v`H2$l05)cuRGt-BbSs@S4?#Rr)EZ87=m_&ac! z-CQoPUn#I#YM11f+#HT4!TIe9v7S>-`d0ZU$z<`p(pb`$IOJEXDrnawnu+#+20lr)sOW=cPz94U}@8`gp^wT$FC$$r7`>~Su@IdwcCXsc)*jhq$7<>98; z_JxdXoUAzW*&o(vNUBp;PDnRTbBm^--Mw&gHrS34-eXmA3>eyazjouPFonz%*@^qy zmx^meax7?u7oOqeH^oZC=1neIrG}@|zNM$O>K>S#$1ULs|^d7X5hB zi3PE~#x81~+SC23#DuZYlx_|x`BI;E%jEUJayLGuE1AFvsn@meRv+aCNxA_8_>LJ1& zz4Nhec8Pl}B=|7fJAiHyUpHqP+FrCMD z@A&$I0oJOF#%>&exj^63w&IShnB9mFcelg#v6w9hz#t?x-Q`#p@pl7*xl3uayyzo` z%{UBk?e5m!i~kqW6gCFZKR57pR|Ot5+;cPd=80KUE=*XhTU%LP+X1X`wAC6 z;I&rKv%Iq0m$ZiEcV5C_G-ilB%X3tDfe)Ovk@;sz^!~c+q|&a9Qn_

nN$t+$-H%)00LV0PH3~lEtDfdM_KgeseUDcOP={Ni ziy=J`i}qoKEn_{Xg9w!2xUgQV;$>R9;YspaHHDd~5FAACCk%>I%WmkknaA7w(?fw% z?gJp?g(o&+$$ls|q;T|R5eucPEK~G{niL~jnpX3uwke-sFv4|R2~BNM+QXQmdkQF|@$ODR@jQwzR9F+OvHRWq7i1;ISRu z+>`qr)vwM7*lFutR*qSZFYBWqw4NEYOUxA`+rI~NM*~wY{c)VOp?l_kfTS@$I`-6Y zXK(ETuUX=zJ9W`dxBnhpP+e>KL;FJVWK8~64vTF!w}~Q3i`8GD+o(3Ua5x)16wPOX z+nQw6rgqaDVswm+?2ckWI`KYqLHmuy^+kvE*N6?S(w|_voiBEM$e?94tF=;p2wYtp zb;6xwn#d>R<)+p&Avv=BL7-@UKDb|n#JeP!q9dfbn@vKRt6ZMh=leQj!!lAC)6-+n zIRc!Vd!rw|)3{4?QKTiSH_3Fw;=j3L_=hCkl$*xlQ(J2|D zXZ){L-#5%zc&GXR%Y$dGpFK9C23rwf@0eLs*Gyo(5{Yfb*?KTnOaZ-BW%fp~HbXS; zgjl|;6=gYzhV&=m>`d6+QaTjnH01=w3D`3JSzz`_4Gf_@)gmr(^vQ9eEH>oI{4-DY zmmt1Kzy@wd4%vp4xuVAg^)W*#`TvBx^Pd@Vn~`n>lf@F?deR zFD$=I=1kKsZnt>+%p4f;uBcL7xi^gc9qaAai!g2JY|3N+b}@kg+;ktIvJapC&jtO} z+$37}!F!n3fGui)zY}#p-a=KaBF!s)Zgz6h=G18N;IVH z2iH&bCP~CPXHr*Dx8(0@w_}hGzboccYn?Avyu)8QBvZ<7VHALcoLMTo74%H*n`)QL z0wEmvIx#>BfLCeVx+Hl;o`bKs0=FWYufedGY^$>7SNc0C^jk|zh7q@(ybfIY|0PP zoTi2dW~Pp+n+*b4<)WE}ZXL~%RkNO+-zo82$OiWpgSKj89gc&_xw-5ma*VAi(5RnE zpzfH6Jy4wd5|;k>DzD?Sg{ia2vKFNpNq_DOQ8@Kvv2!-T?2E?r$c^3HV&gSkTM#%c z^mY}h0F(X&LSG$?1ZFC`unR<+=U%Zc$@qjSACRy>k!bpW@GO=J}M9Hho&6~L<=}=dX+ObR3f_Atu@kq?7JGBfL>amwb9nB&- z4X1Iuqje93UAxvO40J0&vjIAF(W7-pKv~ zRyQa}v=57D^oS{EG&BT6AbbY61eqj5G=_z?CDc6y`ac})^DrAhqkLV~Sf#eI6h$P1iye8_Bq(O!n2l*n)G)@xs?3e`Gx?pw=?gnuJdj8IiUynn-O&Hy$ah+Gy7Kg zmbg%cc*(YMqQ1}41q;TuRBF7cbvy*2z(-qz_tKlW!OBKF$4weV>WHafY8Si3|k9K_eWY|Tb$}PxiRv}l`G14PaW4jE^ZS>B2=Y-Rzs`7@aYC}1qS;> zaLr1-P<#BjY*~E7O>QZ5++TnO-qMo=>|l;XNpFAS~XnI1E)i3qoD=L6{s~d=xq)D+MDQ zmMr?9fL(0`gC9$|^2G!62!WCT(u8xLgd>6Z8Dj+)#^1&YFpX2k6rxxaK)55?WnjX? z^F<$MFzccZHsclbf*)0EUy#8Hwl73rM%#e+$9S%OsTXC!J<2!o_;-lxY%bVh7A5F~)bem0iWzxH z`Wc21JKI(A&Ba=&+7v4xGiaR~3>yn#ESYTK5oy~5nOyRj=%|!ZK7uB>Y;}wZd3VMU z+r`|3(~M)3k*vjBU^uUSwmzj3-VgM13P{4vmz zt)QB;v%f~YE{>?0p~+%HNApoBp->(VE*ix0GAW@@SP{knx1$%Q$qCYqDWY_3k1=i+ znaJx?j{QbZ7q_E)D!I@l1P!uf$VusE3OX3dejt!uDGvKscYgQti9B{_xNia%yH4hb+&}F9 zhxqc?pfKMiE_UV2jQs+IvM2qKJ-J(sksoEgu!m`jy+~j?Tcc1P<~tXW$9YfL`ix`L zC?4_FZA83d8Y&)zTf7ndGGC&@%f()3%uryMFaBGXes&JVb<%NP)Pvk@;0S!_6ZxUU zVgLaAu=oOfNVyn*17^1sPIwICDv%72&sL#)!yLO4M7blNn)}Ew?5UTFT{e?d_8%7i zhoQgW_eTKq)7oXxNkajK*&jF{i%l8+adNPK$-EBwz2+^CJskd&&jn;R$Rv~f$4Oit z_)e>Yf`44GIO1X&Nb?W(%Aya3Uc|EjEYraMLdyQhjOG4C#Q(#+|1k6eb+TL840O6b z8qt8p55ip>axs;&HSKJyE(<>xYW~+$r{F~(*NEu>=$T|bnp$a~t!Zf^jVv-{_-DC) z2AY54a`}H_rGKh{R<*t(t!Z$9>1Q@zReB^=Oz;@K^i)2|c?PGn@N(N`q8VYF$ zZ~nm5exAQfii4KxETP^fF_owlSR}NwzilTvb-2D!uI{HM4hi-h-yw}jL#?G2EVs64 zubr%aY@UI!?`2L$h03LV#Y90PLX!URb387jR|vxicpl>;qq>2sOM0e5fVsJPpy=hI z76_9roIxH1@n&@$;obi)ts4vqhgb|55m~6vF92MCeDwG%e$l=r%`$rTyv4**I+0h;=<~z;2fl4jsI+h)B zFlM2tQ>~?Lqor?cO`o+d-QpC8eu^J@0noY-rA!z#UQ%?NFDpYVy%gR}6%ig^gb03`66F(nQZ-SmJvWjic#xxJB)LP9gAdzP>Mu*cCd)oPB-Mp?I zW6O{Lbu?BFRFugtEdp+2!mJ)doEjSH2VwT9pF*4%&!B{Ya zchp)8s8e3sTBSF%gKBDMu$?!OAHi}8iG3Ze&Tv1ovuLO&y^~Pz^O(dcYIGvEpoMWank`wqlZa}DWXCsDDDLaLaK$fNqW_zf_ zX&hTO%k{T!>G7;tnJ~u*{N;0G4y@T4E<)(su<&LU%0X8ox{hfg@@9#L(_`naJ%uW; z*IZ0@VZ(sDrkBf^(qaZss}J1>EWE6^K(L}pixO&uorms0BZjfx)sER=dg_1>a49X< z;(rCr>zLOZOzXl*Q0(OEX#e1t+b!5n8Y>BwWtuNuZ5vb<6(B7)UKOXU1(M=)I_=Yk z%8LG}d6-yEaDa-gz$f(g*CsaS3uDYjY2aQ(YxASltQ8%{1OB;k>=3@ZteSSAAO5u+ zD%R@lC22B0C1}}~cnesI&s;ZamAF4thUY%2MvybjX&U)V8%rO~;N*0HSUZ{@>ogrQ z)6JTP+;lY9_+@04zuP2y3&?wC;yyD-M+c)F3KB16!4D#W)#GDGXyQ(%du_5Wly4My zs1&1~;;vr#!P9%#o{#5Z-pnNQQ?8)t7(!vhZv`hLr=Y>mGKz=i-|B%m0s0ehI~etAhsC`c4K z*MxQQI!k4EdN8rVvMXoPL&#)=kSTo$K_DT6B*sE3gO>RHGude}cIroO%K-{HT;-IW z1p6IXrWM8zhF5#Z;ssk6^L+TLsN!pcZ~wSWeVNxn8s`fZF_%HOE2J9TrPi$&J`)oU3sLn zGn$D;yg28B00$o*2F*aku&O0wGE7Q4OsbLCx@7t#e+aIBZ)6_hTgPy*qDO;ZBjh1N zVh9XYVmsJiD5Q9Xrlq$8`+>;sAjWJ1hGp2JpXqN`d_1b0I#B0|l=%II{o(R4A5Lnvm2E-=&isj@- z&`6DT)EVqFq>h9SY+*|B7IXKFMhy+yYV)CZ?nlCU&8dy_It%&cn*%J#k&Y2z#jc39 zuy`9Q2(EYFF9qZbA9n=c_~=TP95eY`)m*E(i;K))fr6#o65wY4_>vfxDmI>oZ6=-N z2OpWjEbmvYK>dAB)N0AKltd*f*qdNcXsmbTIUMr+*-d;#$d?upu+&CIBWwFi38auWXMvt=^rqV91_UyyhA`#$sFSfeoy z8J3bfT+8#4@q=M(5tBpjM;bR=N5|yH4K`~YKfwtO^(8Qs(C@JAIn?=SU3qdDVH zen!4u`Dr{!(v6*6ck6_YzZ3er){x>inqc5ohErtN{m#C zc^h{)LqPL%xO`tL5&3#n%_i{Mq0j({nKpzY@vQ^d(YR7h&AxnE8Y&nI$_L`1Yknb&e%cCb0PcyA9i8oC_H7nwKSJPxuH;Bj9>$12M=hU zlC-@a#oEQ5N&m!BANHK7=ZB=)(g>gOba>7f7S>hd`wkMQtFl{;R6nyQWn0Xd9>eY% zmJ7I>yQ7Zi!QQ}e!^{3!YM91!ui0eHkT-RWN^X&qT=C9-z`8O_w^BO3>vo^KRt#uVs}5g#VIMu#b=!V78b&PtGs4GVQUWR3^wjUg zAkj+ZdT_G;CE3?LjE3WA&&dVTVOoPlbpoAw=?Nz;yE~L!EI!+TV}T4d2dzONfkeEi zecF22WgnFPb=ZO21|m+4frCWE3Ju5&Rgy_+WSAhWfje})}?wjI@YyCIKCzp7K?=Xk-*Ue znlo=2$f7<-Jgi2+O3y#sfGXk~FRW`ZHjBv!q>#pPm1rYYGKAU6EgNYrqt&9e4A0um zrvJ7U7$Cq$Qn=f4rJpO@a~I9nE8jiKVC(9@z1z@mq7=AySqz92fF-nr zD5KjZNmJ+Ytj~WmiW|CHHGaEA4{}|K#$*#kDASZjLX4@qjt#M+K8a_SKE6F zR>X@tRI&aY*eHYdYr_v_#p_z}XXHy2F)sDu+wz2Lvj{Bc<^eT0?==fj#3xS#-mnbr z%e*cS$$l8F@g8k%9?W2Uo=2C3B|j|s<#k@&kNmUFMDjp)sD3bmQuP;>EW?cH?s&$5 z_Io-z#Vh#}q>_>>Cgnz;Gu=i9w>ALGs4${xD&3S(B*_iwHSt&7_FdIYLTzgmwEP7I zuVS9(r|}BupA+oRH%Zc$%8sD&t4|7-8wJF(w0H^iB-=#H?8#F{-{-y)ew{QRrQM9T zi|t-yyPY=S_oPFq;z?7s;5m$;ewpNwq}V=x>zDLX-rXy>ptLpyMz55cb(FRX7uEI( z^9lB1;8SflpV!#1)ajt5HFe_G<^g2UoJSy8!yc0XQll%Cyv#6$W$sl5q(T^fT(S7a z>tDNG#!OG$P;JxVJ&^UDi_%357$%-L8>e)2>|7w%8XUd?mvaEHy5-+wwCPIKBXN=g zJ&tng$VBtnEU_tp>)e;v2B8bfHdtRd3eJ9f4;02|%cYa7a>LcX9!$Z)0;_@+)>n~#%IC2a9{h|F(U+}I zGv(#9IX|~K>NC>X{Z7~Fcz!Nd<1n>tZ0cbu+@i|-3+{KKi(61!5+I^0QM9y}S6OC) z-%}c5)HS%pX@qdgt4t<&W00y`=Z!dQ>1~M3D<%8__R}XVW&hlF)tF|-PPul$^q2NQI2*Hu8vMR3e626!&T^Sv zU0)quZGPil>uO&ydpKT`xdvDW`??6@U_unTwT_Yf)Q0h@be{iIV*|pClzm~+mBqyRfoCSk`f*IB4Ggc43JPYs!%rP6{-nC@|0Pg`l@_sAzDnF$uKqL@F$`#qoty- z%)hsVfmh#51v_pm#PD10mnwH2bp}|daoXS9HL`G7e^gA|$25KFaD{0nl+0gJ^Azi1 z*a%XAR{0Ar#%UbX_l#WId~XFUOPlh_$At}~!V6y*bSNgvI6~3b?ZQ?mMzJuX78z#> zZ?@cK1_)E|Kb?FxJ-ZI|$zq9{ZMx@d`i*r_rGegzFH*ru4gz)Au&KOd5|3uyD7Z1n zw_p!5{B;PM=QyN+8Yp(_<`W$!ke`s(YY)WZGt#dj&72qVHC5f8w=NkAb3-LAWDo*I zDj)q`G>hWRaA$7A7Yrq0z7*9LNyPfiY|}N~Bck-6t^fYH?ir8kc0-aMev*-X3G%CO zwG)UyoBey|6Xa1du^($8^@EMS=e|kkD?)bfFl*@!m~x7*TYuxP)X!0o;!>~U(Mpbv z?azJKrUHpLzkPz%|2mJc!0==hhxdj7Yab~|4v%#Zjtw%QGWt@RT|5y>c_nvntPy)6 z|6uVd>bC7IS|tQ|_NBqGZOz=QlG)qozmv>>fmNkwcRy^xvD9e?#7nDT%uv4Y443(DK?rSE!$A00G7}6U`Jmh&PlE_B6<q{T#io#vhdKh=(v^)v~8fO@Kov7Ruqy+%gHg=Z!6O8W{#;% zt~wW)j`HkrR6lBUzxS-AwgdM3oJ-=NGB%(La$chiSe7CmJkXkrSUdB$b92JFNlO+@ z^#?+~Ksd+zO5c_PA%UoVXSK-@YB3lFuy)2~$Gfo9bCFjVWfVgnIT0EGwb2q)uj|zw z5UZh<25mae2EqYp-g^>f$nh}92bH09hrc!lLC7Di&dfl9W(Z^iOm+FNA9l;mG@^Qzfe^>VuR>xmUMODvPHACr@1wr?5)kZ{ zx<@L{xKF^i$K~+KuJ^jCf#&UyH3bn?A&!^++tu@_tYxo{C|D~HScLS6%UK^7Leu+k zW`8cb{h8P{(xF;*pSn369oXydpMO^j`R-yy*?qC(F)$9VqcbakoezT_v46EJsmp$x zKtPvI#5}{cu$B?V^#ym~N;dvGGfoC#-SdUcwNWO)e$KXg>w}dhr#`{Qs*{gE;E=#CT)9a^kK|5(TOi6X`S8ejRgxqQ8ojLMg7k-GzK zm}AEUb_8nc28wsv4II<)JCN(IJ>RJv=7Wxho}}8OAADu20)62!a?=GFMj_bA8Iv~%w^_29njVd^s*D_IFxc!$$0({hL!l1!7HrGAcP z`5b3}Y$-ZN{R|D3+rS+`C)4q(sMVj|CtPD1dTO~s0uie5=tenmcR5L^_O~%}$fpRsRAukuj-fk(b+Ozp0`mro*P+TEGzj3gaRX%?CB!y_+8-nY6ln z-;`@ZJv9mLjBWA1Pv+1)BTWc>r68g^3zSYlL_vSgyptsz17=HtPYfLu|b6D zWK7k-s|TLE<;!P(JjHzV+@FL1?yr?BhzDX4t3cE*y+?8)6JoUzY1AB`lhHwpTaDxZl-r75!< zzI+8jCd)lgI}Ve_dgGAs#zf-6klh#ssH*KjE}+h{oq27R_gfFUrxeeSUX^^QzhmC{ zo9w(9A$84`pJWLZsK6l!EgQ$p^#>o}k!{Q$IFy9czrQ<1l`+<-$!T}mu-mI=D6f){ z&eldUJIj8&aUISvJe8Y~M-M;xrP*4hVN?oiHlL;6I07r@8zeee5Uu=TNxKO!mQx{> zj`!=(D*$KYm+bHj-NR~?eT#rJ@v|fHI&&KCDfA#}ir3?xXg9%_jeDUCKM1hHDQMHY zZC8^Sq&&RL9oYADj2v%MQ$aKO(~DvqS+F~~1F;_=bbqA49X)3gT3^FGuZu?qwDSPY zg!A?DOP)US@V+)>EJmGHjQ}E*9LNe;IZmUy5{*ipGro&u-jxK$SW_61B{#whvw6t~ zeTN9XBfLl}tStL2v2|l=Ye@fD^=ex-L$z1gBw`9Zubtg!^!Fh%v?8p1=D2!z$0p43 zx~Ab0_7zU!Ky!tM-{5vYm!tV7t%hiz{}*<1EIwVqo+KU?BbCZP`W?>(v@r|*X2HF~ zg*D<|H>}+xLU%+;9vjH0=(O;r6u(`J<&XI$e6R&oTCcX~ZYvH(Ubc zCYD-!7H*AkYc+Fg4dW7D+xvx9lYVg7HeA$(ppPtWyBd0%DZ zBT}57rZCjwE(4Y78_LCGZuWZRI}=TmSzp4ww+euiUgCE&r+x+6hLbc@kRjuOLalY& zAA7_(?nwjceInxrgFbZwUsX9`t@ZT~51hgnGS!$Uco#9#KDTnf&MVZu_1 zi`jQof3isnk^J}NX}`qmF;dm$f%N&Vr1c>H~k zZ?w?K&;=_y22Um*W2J^H<0!_y5@c{j5Nr`p#*xJ3#W4a(;@HP{&GF57K=NanaWw>M zY**u*A|Oa$96ZM#HqwzylMBlW^9yT54m3724m9?10J@dI58i3sp-ii3wge8+p-jtZ z_G1F%xO2c7r<2L{gby9aG%k{pbkK(iq(YErCYTKdjF}T8n!gZ$z;U!}`4c`^pvkxj zw)`m{LeLz6iuDUDh#=0I<1HDi9cRs+KjVW2>H@}{u)k%41ICa6tQNgdV6(A3HlraQ zdXO^#aNLIgbQGt}W;E%83tEX=V>9~ULjt;w<6+zVxcq=-;yT!Nr+kP&mvP=~yOTcn zpq;oJz_n>_23UCPnSjhB;2W4?ERp~?_Xs~G10b^uhy%Nh(E}d6BxG=_c@N+oY|bjT*w?6#48=SFup#)o9_w*k{pwZ zOCiVsRIn*qZpXM1f;^-}KqzBbaV-FAPN$hpR1oo4SKKY&gpf?IYuVy>pL0Dr#1P^B0Ibhnb&w6Q1iJ0?Y3n&*r(V4JX(WUa8 z+GwTh{_ZohnN9^x&r8S|Bvv1dnqJ)+1lCSWE{_t}H~zu~vGkQn<^>vCe>?TIzId%~ zimG)0v8f}%HoFp3zfeiQ`!oF2IZS128~*fwL`|;95x3H80mpseR%`VWvhz~4FT}0$ zO0@~f?e(G^isO;eXhIIK73q;E2rj#gp$--+OUqHP)cdxLoA7(UN^4Ov)=MjEIs2V0 zU%=v-I^c^6bi|UAq>pN>D0~~!#p9-#H!fA2>Qeic{c_khYbyOprg1H!uFd*7m1GY5>n9l_rFAfKZJX1?l+_}7UCs1wFqlEJCx@KlN>nTt?K@8I5LRtSZ+Q( zb=co4507Rmk&QX-7G(cm&+l>=emxztGe_;{=cyG)|D67e{&b^LLV9gm(`1wJ8pGHe zC&TZUa$MUlacim%?68lYecWn8?39J*u*V*6_v@}$vE8ob`on{!TF0%tdipN7#^#&C zji{FwfQ+`RcgYohJL6TpU8K|}RpSENl3ORs77w$8I^vdY|Xt;hg;{; zPQfp;AaBjG;2R@vExZ65!>z%)g=IX^ySS0?`003YBmdD1c&s^#HsWnzba^2eV14{~ zmSx1-(n+8Pb1(0aG@>Q!G(RSL)=2U}YuPPO+=EPtF&ARNN{TTLueeS!G-65GqpG;P zCC)}x?Z-yOsoRH}ZNclqjj(_wRkkGO5ngPPN(TmjI}bcCFSV9Ew6F}zD#L}LJWv;2 zQLKT*@IX2{et4`)3cqg$R8fBz?D)P)K7XX1ED4WO=K&XuM$eFkvk;0Ku2xSitQauj zvM9;>Bd!vOB@*Xb=FSVIbXra5loCiT zTYRFIOEfb&B360<9IwnajU<{IfnMSs!P7v;6PQC+!G5mF3)C@o9&)tt zNI?f`h!oxL=f-9hb z%!}V~;0fFz4@belw&aV|F=w8B)ZSD;x;qhgD{Ic{iae0^wl1$HYHuch$Qm2$AGK%C z`+(VJthVGEbQ&6?H!C4Yrqw$1B(xwxr*|eOey1i?b_-Y-$Aty@hdicCGv-x9iOd-A z1F7CnZW&H=59in$yz*(^Xg|JfWZ=mA^tP7~)f?8W-ihU516zZ;5%nA4t>1~~p);Ga z%bWO%(lIEvBWhq~+jW=Xjm5p-mK6Mu#lugA@&4_}=Y;Z*>|+UD$iOO@DjverZ`#Kx zxpPtP@lO^f*CQgl^tS2?9((_#BTtB9q;lzEAbOI2wxxGGE`r#c$q7*L!I^O-3V zgw2g;r^~iR`%6}JF2q-OK{UjbDf1c|4KaX8XCFJB3NRPq_|*&wk*3+CNJa6}paq`8 z3APedW(ZV4rrje<-mDoR5LvMxQyEGGnW-RCEF_Dm@+MlBDsv`8zF<8YW~)*3?+7v0 zw51sIa+XZ;Q#}j=Gx=nDJ&YYQ)udN_=@czql7&CDE=oxmw*JKg6rhg3*eL$@i^&u+!Am9i;z*uh2X}WXO_Z4*xHl?X4)VtH%NEFgCKdIsJ0Eq!`>u1^ihs!zR5b6)%C7@KS%hs|YXTWY zY*|*x7{t$>JYtBbQ7kCx(SrpLE`u^lV+=k}=O$n6OeQQ?Po#QgoP=bfkVlk6M>Y|M zPa-dZ=_?eo4F;ZCL)xgCk;CagsFyE`qBKF2D^3RUX2Paj&963#cJH9IKx8lJ$mft{zLMmto*6D>*Qi!yHdur7<`*1?>JmYgK-3x1dfXa=8{f}~l=2gCn$ zp9V)iI-o>|f(`_u7d>L&52)7lYgxA}#$fr3l%Gi2P;K>8lbZD~y?1uW1|a$G3Juhg zK+k_;zvS(Gd540|Br2Y+WW9pUEUJ#qWd4HAG^&oSWWR#WJSy+bWVnLP6e{noWLIHV z9y#uXZk}N96-8jfp^3m0Q`i(!_IHm|J%ltpu3%ic4h)748z>@GHwq261sJ@-3-QW} zV#FEgr*NNKSk+K06fhNXA(AEF&=!anG($IvG1my8D9sn)lK^YNF3&MipaTK-@#mEoA$@9#6&iB3l>gwv% zYyarFyY625u3{OKq5bBpltZL%1kj8`hP%dw`K6g;8OEXct))O!q-zXhgo1Jj(Z2E5 zAxe@>n7h{W5lWJ6*rOKXUkb_%M1lsx00qS!B7U%B$qH?ogqzbUX{pOB-or!z%2Z=J-X~8)Hu)J67ALNcQX7P zoqd{3e`_Cw00PZ#J=X-NN7!HCLob=vnAcy5L&~V7csxgktoju^chbm`=syFG)JV(S z$P~*%NLy(9wVO%HoypYryK_k4YKnlXrLiR8yV6!Z9kHa*q%$Kp{Mk2fdiywYeN-;v z9Cu?JGc2N!C0MzZo3m^3&2EM4Vx3ZJ>YZXb1sfITl^Z41i*`#PglpQh8|8Sl8^zhx z8>M%10O;lE$k!Y&*^|Oh23_C$-UhmbzLXb>{K&D^1d*xD3WK4mr8_d`EE}^QB^*}3C3DN%QyvS0 zBfvSq3-r0ci_mJSm-uU|U(rLdU&ceTpZ`O&U-UzDkCeqrV*hL|3fjwBf%2!Wq(~UG zNmd!VSs1oSeO>g=GB))vZW18TNwkP)pkouJc@`1wF7h^u9dh(=pmEoAR+?cK9XWQc zh#%P?taH}#a264ITIA4!nc$gC4Wf4%)HTX2;*1qOo$vt`v9Ug}@qrw%9Y1Bqg!z#4 ztz7;1n`{+(FNQU(&Y8I!(yI>4AYc*MF|S$oPV+T9u&SBZ2oId%gbG+N#cgn>vlLd; zECs8n5FvER#$@VCti0H|vlW3|-(nnrS))lPPMs3wGUOCrzN`?XUWFE_ic8*rRvM-| z^h|8v7)_~agM3PzgL+D%kAXw|LCvoIMhIVBg%PUuGPIo>IfRrvu`@cJ_GI~^m$Rbb zoB90pPTIKhV12Si#4eEf5_v>}pGdyUM=neAxtz27#@n%>3Z-=Pct^EeGmBhjaOy`Y zryhI+%O1F639rpr=yvqRdZ!VdXS zodNMt?UL%E)(!(fm4FhzYBDUeA{H4zBbVw!(YM^A=*8^X;$CE@{^W27W#KZ6qOuoJ zVc}@!7+d14-mJu<#Z2N_SFX~dr$pwh+)S`bu~ENE)49N-{DAk`X<}g~IYVw|A)|Eg zl+8Yj!-^jTSPp!S^_a6mv|nKvTzi1u!Ru7(vUZPrJR`d9@hyA$#joaLVL-~?V2?_$ zh7dk=hA}8`jxfmapwXeOQ;pLs*P+E@&}#KKO=I=AKx4gh)bL=~UGc!!-SME>UGgBj zQPZtoTitC?Tj{G_TkET1U-m9cpkaO_uUB|cxu$JjwFVR;FlbfHRcw{cRZpEYU%;!F zs^$?h&~*3jX}jR|J?wbB+c?dcd93i3L74ZgfjD*LQ@xy9J2gMWyXQI0zPEjecuDqZ z@{^2Ru%F+(r#RKS$2i)!Upl2ZC79M&5U3?k{LJw)d{6bV7b)h4?EDb)l0AC{{y!ZI z!nglOS5hAD&3}EBjq$@tt;;3FYt+8lg#NG2g!lCgQlTE;v zY6UNK8UTQ6wgm73{xhq!3;+lR{HNARDk~^J;6FyI8z>+e^S>52E}$Odzg7o6U=QxU zRz5AD2L%3Wo?u}O3)?r4Z{JG3ry}K{;H4VI(-WuaC(uK-HZcI8|2@~o1hD+KJRJ*w z^S=vNumG|^K%Ku{1i=mv0{yQg!v)CuH+I1TIQS0#cIy>ZW#dN7fadE=109i|^%#c1=qqyrh zERke{BMH(=TYV47;zh}5)qAS=7o7Lliqow06RAAe-BdY}^iZPreohp<-CC1zfOt6PWzMKtKw`kcu${KV08oLZn zV#CUShm#V+=V>y~)nd3gqmqPd8ZLE5Js})#<>oti%W}_V1#Ktezb1zrj1(~DKU5?L zY9jWn@s{G1>Z^8K zkhzpcRYN>ICTNSY5+jh}u2nyeK=@+f)Y0y;qvlSd&p4^tyvSSjJm|5&tk37K{+d!A z#RVR%2J1Q7PU_Z*M=Z{Yx>@ijG3q+4zu@!SD0VRnKeT9>-dJA`tmBo;*-tq{zjwxS zE#i0kICMT)K|GNVDHBtyv(1x);QxIDD&vTRaq#-W{oqPpmDoyddjDx1#4ZS0<8Xde z^`9zAv!ktF)^?Z;$x?gzcQ<5DthVNKM_p+!ki^2`-3(CUax zxUV~7miq_##_dfbrE%7K7?yxB=QGXSYL71O7H$paEevOWd;KDpTadG$k1?7yNW*r# z=?TZtLd;iM3hny>KaE`OLb>BkN!atJ(3ov;_{6-*-^ADxm1c+M!Q}l&g%>qCI!L^* z{sK;EL#M1Sbvj6MxINkZ(Cc0o$WUncqp4F`5MnMM8ot5A=-~`GlECy?Z8g+~P-uO} zKJHup_ZucMAsz!1g4s=eQj+u+tnF$26T1FBK4yabQ86I0^oar`3%(-X#5vrmr4SJv z5=U&*#LGlyKDXUSEXQVyYao?+pvCulBnMnC6n6el6f!Rrymo8XDyrF9eiW#I(Q z;{!9dHg~%R3$P~&rdfmoXn5pBgTg~zZTAWD{}A@uf553t3_$n~lGY>uUsA&VjFm|J zUzn1T1;l^<@7RVS!2h4uNErYG{1>{Wz`farzmRba;vaNPO98-A4O8h6TZvTx(;)wy zb6^E8Tk)km)PPE@N2MW1{l9a-QmHfm@W5i#HK#RIRK1ZUZFO7<%hlCj{UfrTA~kwJ z|Dq7~aPQy2#Wq3Vv z*0Qecp5i~u1%AHZ{Nn9VQyg@H-)*Cj6UnGW%djtUSIBsE>LBh`JFcd(*zspY*azOl zv&J@hBn)*3_Ly+jEHyl4wGcTtZ@6`2v{rhDSiAF1oa<<>xxt>Rc?((JSDSatv2~FF z7T8u>ns3ol9YxIl+`Ei;TiwYmHPQK}KcZMwpHH+xjHPi@Wdmvq-RST;&70wtob_SC z4x<`uv`dx{HLJ4noKK6lkMPqoynt(s*-J7Dw*K=G-6G+;rzJmZF3x)xv&>&2@ioYo z&RhPjE#j$64h$td1|CDNa}&*0tQfLu<_jip5a)?zXhv6m(w!VpVbS8aO#1B6)xmBEVNoZal<{dL)d6?UHQo`q z7k`5FFU8ywVq{1djI_ZzR9!}vyizWfjY%h0bN5vYxhp3hGVda56?86nZ>~%#lq~4g z8{A07djaQPJIq$K=g!7L#+#o|UF@ff+Ab9+hg1q}(|jAm-hLN0)k=7|m-iV;$ECs2 zG2+=@t|@0kFw<9XMoOX0aRN(sx>#At%F^PjRc3VuT+uKTm6b+p&~d2Q>&uK`+*SV= zsqYK0(@kYC0g z4#Xcj{UITP`R*UfY3;yA7)&;oM0X_xjd)FGNz zEvU^-qzbBC@@`TM&-VNfdPk`kvT`C4HdAXLp)+JKH0Aam!2noza7mV+ei!nzX)tn< z0Rt$>f-5rBfh#iUOj2NATr>*!!kh3n%Mj_Va1hhCA*@_QIQXETw`NCgNKPz>rO<%p z{4G`7Dmbtyxa92cK#b6U!_a_6$E)o8EwF?hn8|l^P#_!X8x_BI=?{hr5)Av5&Oz3{ za}76utJHx*R7{6=WayPLJVCC(CS3TqPqgP>Dw__tFzmwx(e?Zeg@`t&1G@|@jRuNYv`$mIqevL-p)+pp}E^w+0#9%qWT*G&Q-(hT1V zl~7<4Rw-aLVul0Cs!$licCNMSCTd6?WQQlmcWMXXV|{|>7|nKMIwtaV^&q~vmxuc1%}4fK^{#rIuu37)U9qIz|qLg~&BGVh5T(dBa5|AC}@ zRylHAp6UkI$}v5Wmod)nq8OvDIFo0Z9R|nRtew`yXszBxM? zA2#<~cU&{7ACGh-$-!B8?<~jn+VY}nbE?mAW_Up-f!%U=r;}~ly`K`0sWXH&58a}5 zQ)@)b86GueyXm_+=dP(ztixJ7%i{tXYrQ*L%NYaoOJLKBeWYRX%1@AbrPeDoN+zc& zpOv_)mlk>B>fZrFZM} zolGKWZH?U+I>z(D==~A+6n|C#S^85esPRf-Z!5OY7#C%?4U=NfL+?l-!d^8F)#KpV z`$+^io`#^pgMrD@dfgm#4>=rj_s3e<@77f%4hra+RdB^0y&{<>W|={BW8TOLK>)o$ zB=@vBgurbrR{|^@6=2QyNLzuF7nbD#+q1uY15MUKDFIfwi)D~?dE}kLTymv4g}V17$9wsTkP~wUL_&Wvh$Se zw;V%r5jPRsI9VhP!VW0Gh2L*3gbqXqw+J~vAY2!XK2cGD!-t4{xR1);X(NA1!DA{+ zEm8tL+6WrY(OiQ~CPnB84}4D`9@spr24xpb$d6HwSfmgbche%9NR4xGl$5#%M3)jQS%;RR#hRfPcHwZ# zdl^mNIjAA@69ZgAg>IDNB%I&jUHSQr|F3dMxJMsdDWqp41DJ&a*sIGs?VLEpw^JH8hQ ztdqx}nu2Ov^}p&BelU(A*~Dc2ysGsNSlBXpi|Bb6dHeidfG6nHnrJHgMKXCn5(T>P zQsYQ@d$_&s%N5I~wr?FN7YD$Ci=2_pL9@Hm>t!uXf?q)tzhQ&m56mPDu~ zs|y!V5%-1dF0Pb_hwD`@f zf@x!K@F<%g!Ex4{++l)V<(=7%xVB}))TGq*7>`?l?iXCZ)K5N%KWnQPNe(LnlI#z^ zPv4VJtuuVcw5}i^$Or9FhxPMaR7(0)r|^M0Q&_=-1bZPyh|lt%HVh$jCXFqScUneDv;MrifxvDBJv&pGC=!Xf3|-;ILr9B%|B- z%XdE%UK37N#k|KOe11EZmwKlS)Kx~j6qPCqx#ECbF`I^JCl(Jmsj_N0$@R?b)Wdhv zWq@8?z=mqfR3i4R$2f}rqwvsKo)2%M>+As2idU6yntzrT;0iI-wDOBw#4%-?scM2U z-slH(!!a89^q8&IUI6`niT8So%j@=+TMr`jDv9=g4&<*nFsbhu^zgvsL_Gx*A=Hp5 z8+RS;)?7)oD;PvdG0nUPX{Zpvj5t*?D&zi*x=y;nHN6G`N{tU9ds$UvhBv?m<@Fyo zmCPU5+Xq?cjko-_lU(PQ0s=t5FX$@sEpS?MLQoo?=8R#r=uiq?-hHF!Q1kF93=9k^ zkDLIE?@2AYC*%MpNkZU=%?32AbE^qYjU^&xF$Klqiux9hca5`g2R{oR2$mJ5_dJ^| z0f+SC0K794DM#AGn;b~9^qeD4#%6KPF_*2ut-P(AM9zbf!Gd<_1I~A)TrRi3lb+q2 zg+m0$(X|+V`Wrd3%-X<<_~VN?5*V7|l0uc!pB+(`g#~8>EM36PhuloovNs9UPiy-5sO^>g}dCO6l#oY$@vAr{Cx& zvpntj8bduw3$cJU2>vdSt~MtS^xTyO&9*obk9SE{=*>K<{sU1jP8?J6?wwy!MF&X_|UwlL^6i^s{)`P&Kf?TvLK%v07^nfh_-~b zaK^(z-7qJnKU{I`u7nOK?wOjYj1-kHhk`vJhr^6!{T0B7b=o9HwTtWk9S0mj-3@<7 z)6utUBx}$q#G2}H0l|tKksSgC2&gEry=21Z)>IKM4{l@RHi$=(gphQgO2ww&$80F+ zfU&1w)!h(6kTDrOK1Kuq^w3z_Q;#Aq6>90u4pqJfbP0o;@ea@EwbY*iGrLjJr}gKd z*g;yd$qFE`wGku@M!nf!m1$OU5UnjF4MDxxP?c&{b41lDqB@cB1XLy;vi(Cw-3nTL ze0*EH>->BuCRK>IY1#<;gJ$Gcg+400)@!F<;sy35`JW*p@v0qnB%4@@((%gux4iVm zOP-4#|G%m_|G8=l4#wP31N-((9PV4I*-tLt-@7+sec}NpUzyUuP_CEPpy~wisI;8dbn1_8UV__mzvc9TK~~*!Ull*zZYb* z08su}bsd1if6FLOWXR`#(d@GSxkdb<*$}C}y8sA4RXr6P4pcr6lRz!p+ZDwG*3Eke zBPh~hs3hYkDM>if9oY06@~EG3i=BUJWVZ$G^Ruap5++?<=0iWqWNY@|IDcbPAXFyT zT<|@vJCnVCZodnByV&(arusv6rGku?b}2;Qr#=vX4c)CNsx*<3q(SBXquC>&XxkEm z28!1N7`Ctu+V_hc%gg#L+GCP$TQWBv7^?G7$+u1W+~8vIJf4Ccs_X&Z`d+%e(h@wv zsN&YGr?S|F+S5rQ_xX#dvWDW%W`)W@&S}r}MDn=53N+XxGpSGOg&J62Op?JZsNG`m zk4&+p7BMyL8WDOvH0!19h6|*DA<5GA$XS)Yz=BSo>Wrt^ArvFOIaf-SdD>(Xl}Gm)*H(@bTefc zL?@Dkk<<##SZA4J{pf@$CT}!cIe1uBQX1v#7Nv;jco5JmHx;nBa84=eHSrVmjhK+4>tsql(>h z%&P2*5q8yPV`%0hWOt^=b<_{Zn0_F=itGujK2KQq&EPiP_TcZ7gCiJL?tnaGry~^s z+l#Y|Q=QuK?242Sv)?KFJGpoZQ2Ta#u60FnYbY{X@-;ssosCq2EHV!+345SCo8vKjT*+}{{64@J;aWsgs@o_ncr?L`Kg^=7=#9y1 zfQ(K_wp>i=HdNN@0+(4mtw*KzX=82)YC4|HWOE$Bu6MWsOtS@41zxCA=hCO zG19zN9Y1h2F=(i0C{BCHAxj_0P@RPnd(q5Dg&tY0@N?0w+cixY%kQlqNMukqJ*pTd zNaAS7w?HQneKc)uaL%)^E@}2F$UqlC7$R3VrARTha0*Te&{9*W{t*&9h-TCpgDL_% z@ZoAVJs!3sZLyDgVX?8px>37O)ijQBxq#tZ|Y24wp? zRdm=LdQ-FdRYa7ZL{*qu-4Kph6KRc;{?f+lcYNcsPa>E`kmVsLxKpw^bIoOWD)SeCXW!hWInJp^gJm<8YR?_W@0c6sd;P-N>icqxxAb}eVHBWAbUuT&`^+Gw3g|I2xDIa#jw?8 zBuRLT$-tx8H$ROP1TMRr5|cO~iXwRhLMr)ID^L4oE{rRt2%2x-_|pH=Y2p7~ey;+Ef#{fw z6G?()!{D%_0AuNInLFP?mVbhh0*qh^4P|0XRc5^}v+vx9_<|G*QD+Iy$=j(OOCI&5 zdduGq&m?Iq-G88cTzdD6#F`&$WZzD%q_dctxtracZ6ff4d?VRcshxR0gV8F_e5a00%jm`?_p^L7ZFAV*g&(&?O70Ogv!4mj8|F{D}>U& zA;`749Em&f$TcnHLy+CN9*H?Z;5`(!6~g;cT@;0b;Jv6cG{S>YT@-}ZaHA?UWWo=j zx-W_5!w*odh=eLfcv}^u!WUAm=!Ak&{Z&Bmb-@%F>*2rb#=-lZPBJ1||$~<4QY*lZTuzW+n`{q={TR$R(X9%8em$|0(n+ zA{RealoYC1-G| zhN@6HjVXapUU86i+1P(Ieu`4#nhw@O? zECoq~c2c$LqQG&lON^m$uPfARph%q7r6)|(*Z;<75D+V5ux@1vOPp?qOYNrR2x!^ zwi%@LE5lD+z>~W4zY+vl#T#+C^`b@_>AzLsIxZ)b(z|2YAq_TWRBD3@y@@pgoygGXP_$P}&-`$E~SA^jzeZw$C`h}@8UqHY9oC~^=L3Ivc9 zW}5X-&q}NnfTs=_9^#?NsO!=~KLeUkb*1|jP_yLvz)*3eg!sU15R18$6(xlPpv9FL zlLGosW%CSK!Bi;I#QI#I;R_7`U=%72U|>rT=B(FMlU7uI^5!tdJ8sbUd0YC>iz*JF zVD3s+j9@%e9svP*sJtS5x2Ro`eZNt=#QRQByTtlBfv7%$eIuwo;(e*8J|cbi(0)Z* z7|?!&TMEz*vntNe4V0t#gs}k+s4gXWIADB~M{+_2&@U>2_d#kOykMVyOqL=sC_Uo0 zWagdQE0KbA4vFQl=CF%Bil!j@stGp8Wk|*JcP0H8}~Yyz6X8tXh-K-uV$H~XK4swM?&tc zsPW$F?3qj9jo5Et5a{Ygp^wxXzIi)Hu)_!aQRGcvwNuO6qV!fB-i;}frwm*mjd9YM z)+S38PDJ+qGoHMnT&M~U{`8Ys!yG{dPbSr~3>fQj+>mXfQ0}AW7Ki7$B89$ZJe_Wc z0Xs&vp+{4xNS4<#kd179wMv&N+h*;2ybjS!s9w%p6^uU&s!qE}fcRhqMGGv;*57!cvyN|${)M99qlLz#a zv2;kTZJH#wN~)>BQPb9H953vCHl3Los9|kLOP!$TbvN0Gd(=RkU-r)=thXOVS1+*CPsfk`h3-^H#=L zhpcJXkHX36;)EQ{r>#>~KW9oo_+<4-eLpOVqMYO3vV4H(ru+D{+U^G=3EY+vt=zpK z5rL?J26`3>98o>KYV%raW7dh8ntQbO;|#9nSjk|uSDyaqf*_@yio^opcPByT1v<%6 zrReJ5qxTELWPtu9cQ>@P-EfIzSWkn6m-he7Sg6Tl`Wve0#ms1-(5fmy=)t3QYK=MG zpAx&_r$6oEl6RT2hi^{BV#$x3U%ZbE;$5?rDZP^$ZNKoYkl_uI=xDl@K}eL@_AD>B zD=_DcU6jDpgrKcl+O7jNEU)Db`jYa$$7J2#+l5HxtDo!y3H<9p}mw zaCKQpclEc0S8psvD5Yh8oMS&za$RP)Q{o_J;#lr3cydJhuL*1i(A+%W1 z$W$W6t{#^yC#4-Az}1nr<94noGmqrP%{Qftn+JXKWfd*0%Gdk)X;su1`Je z&{5C(fuEN2hdwy!Ty|o5tyXq+n}l0wvCQ_*BO7+Xn61cuR0?-*JJD82ABAW6c9oKr zPloiS6Og)LyK2TQ&5k{02}QOTZ|D1{P9`tga;tWHAt@SsGFQn##wjpbKTCK5i>ok! zt+JcWl}0&Um1`uur_d+3)ULRFR=nciA$-0@vY01 zhWEZY8b51Qp{DjRWT8v zkVbJG*Aym6a{C1>E1NUi8Fpr1g@vtE$x;ma{>HtWey%c~I{b5o_VYO0A48kfC~0Ol zeWZ4lfz1MPF550wQbM>$ZoX&Q-cJ5R3X1kJy%F6J>=Gt|b1&VOA|xZzi_<|~hOGy% zYc{2cx>8eBL0Vv_O7tJsIasoHY$C2wx5|h4XALq>9a%vvbg{)8H+5We-tCN>I6xy+ z%-MU^%C2=M@qjSxy=^4{uGzsm(s49ayNtxD57{KJJ^!(8HCoi2WC|k3axXe3r(oKs)73n^c~S_a zOYVk4lJgVD$6Y!V#%C6@x#_<#%T=FLo}Oe}+&Ak*;fFquj@y8sQ0NnuxPY14lpx!l z{g!kc{`;V70)gy4o%6Dc)d@lNPjsyU{tLUE>hC*WO7alOcpav{vCPgiC&^>wF=ks` zFe+G!N}AmM!?z$gvUo({zD~Rth*YE)Vz8;4&YfOCr|`4ksDh3VSAR zMM;$zgLu}RBEJG_vxO9FU54m4d#i@d?}v0P2kM*JBbJEXHuys-O0{dH>l~J8x=fR| z*y*l-s_bkWUKzYSDRtqr@+0fB?64RWYwPPr)hY*Z28Ry|-p4YguFK19?%#TBhiD@; zS`b5-`jB$IRr`}sCogJ)0Dy)q6qqhJ2F|*byD2<8n$iR4mxfwDCGt%^mX`LgbmL04 z-xVGs?BZROU{Ja@wOW~?WR{?#*y{F&Qz8g~J()xHg}-2$mFp?+&EY)?7f%^ z4Vw%y>0wP1JGmtBDaW-g>}~GmgEzF*>)4o%J`t{ZzD+z75YGnQ!DIyHN7 zfkv0x_rEctWNi^E4N4%XQ)W;&I(5_yHDYQ7R}*KBY_-{YwQMmM-)|`)+);WDt->|} z%@^1@V)@WVBFS&CXEkwtbZ5&QeHM)Yb#jk^CXfZ$U_A#qft7K!N&kK`H_GQ$uOv*UNekX>LwMRi^!y{cNB%n1KT>%l2Dq>29GR)CV*E1HrEbP&Orb4|Of|B^044|w zZT(cGEZeQRQDaL3BS?x!>aG6^tV-X7S-IUD_YRavE~N%`(#)8ZVhw zb!0=Q;o}^l!=`GHjfz2PXRMcwuxu&Q_LA!qBQchuWo^Ktrb{LkwyZ!!k||I& z)lki7E()5hAtPfal_D9YpOBp@Vp-y(>n&m>9e(Q5q*KOrk{!XJNjLQ~wS%6p@H3Sz zECppK2 z&HSF=iN6X+p8biaRNP{hldBKRR5|BSx|}{k5dWcKm7v)xCM-7ArS5Y1vV5oKD#}_t zQt-lvFE=JHJw^D(Dm-7(*nODWSKQ59l002c6oIpdOD+sLW=gabSmu$yLHk?&gLPAy zcGj}FNsN6gYv8y@Pj=oW=DMI23BGj5|j>x`DoLvefxZYD!Ov!0YQc=ohA*(cMkVluDwazTZMYef`F?f z>EI_GlFZGYgW)4qVD3ti%xSt@IcZ_}Dtq?qFB9j95Q~Jr$i3yf#h$8nGrPem%FH)! z*9B5ZQJVs}B?;I4mQ+{_8E0w>$6JEZeO|jJ{S8ee{G=7K6!p=v%Md6K**Go~#_G-({i%5;PSjstfh^T_3F<@S8NFo4QTU)` zqfKX!!ODa)yajN_Pw%HJk3zAUB~ckdc+{g!Sd!c%b1YN%rdD1?AZi{3W9GsuX(Z5d z%<8{Lm83~CoSUf#?4cSTr7$|_idHBO{6l4N$YkS`wh!9FWML3cO!tCFMkttF`=!5r zj760kA-4B8(AX+uNP;T~I$WOFS1~O&q&#+N?OjwK$mS;p; zAzr#y1ZF~16pIrGsmiYE4OVmt6NDHu9-Ul7R9Ap!4yj5lBKc^O!vfty{*^_oWUs?L zlLrAbML?A7S5F8sl|+@BbpFR4IN>=Hhi`+F1W#l_RsTgyDuUK?&0 zbJpN+KI^1oRPyn7%Ro*%snt;M`neyxKd~rMAAWoj36RAZ=G|&SfI~SLy?b8ZD)aU5 zBUTKi06wQ#_J|ZcGqKPf8XMHt>Yaf;5A|*#v@K(t{cibNBSXXc zd!ssRBO^L#|L7FzGPHa{Qo0@7cmTGW1Y)c`R|S4t!Sk z(g~@p!Qpp;eXlafTPPfJ*1O^L>>+1x7=zgt%jjArV~9`fcuIYvN$rXPChsJO$-RO9 z!1zoNRnZP2GEwaeBu;rk`Q$o2{8*+Nx5e>}_QhcigkMbbx1}pCXU~mAH~APAU-l(? zx*izRnNNIsGU}h$@)NPZS5qXB2YRV{o(>!~aews``moyW6QjcO40jxuF>u9QZ4uI$ zqQsB8nQ0qk2o(3*VLD(P@WVH#W7{gfnR=vqeCg^#%XxW<_0@8X9=;@^m%Km3oO_>< z&{)Xwl%Xz}%+%($w-TH69XMcNqGa{sV}ad>ZvOZsU0W+ehvq_wZOkX30^EX|MDRN3 z0M+!f&3@T72IsnCDLDC~D>Q=`s^YwI@$xbjt+^2_HVJWf1o0&-jW3Kwe07iE@S#r> zS}Gu#JY?fpsb!v4ZwpjANmcO`pKl+%CamVUcP>lE`}hSh4($<;!~SBnCtCg@v=;EJ z#&&x+nXM8{*JippKX!Yd0aTE4x}heP?Y%NDcd3H1NuqX79MJ|lP)ZZ^)~1EftG_?# zKUME53N?YVJqupZAvF4IA!u}6UMZB9pfAhVx6hl~g!QoHT5JR@B|B_OYEcwR4tpA; zMG*3#k$?7ZfbPJ=pDyPyWN?@R-=G(RM{A|r`7A_EEu<@b|qU}VG5Y0#8LFngqy9p3M>+NOMlPk;w_e=wE|JW%ISlJ99fq0ZCpSQ zUaM)NwiIRW0PQ9`Q1xEFclL>Hg3P#?=@;Ff(Gv0T9x1sge&U(2jW6b;rqyOO^(U{D zG*T}t@nRcc#gC{>0{#Xsdx@i#{%Bl>pLJ<#T)~6%x+2p`)F^m2G^W=p)7X@os>A&v zjd4jK?``R4KRMZm1!VCKdsd(J6+&6wksSAv)}AaSB0=fP=nRAd9nP~((v#KZQj@0A zI~lL%CwFYhhUa0c@$jNpLo{6BZ3SeSSH<_}HSN|%nM%DLfP0=)6Z+>P_E>w*yp=S* zedsS*R^a!??=LPT5`J@KWcwGEHY(*(UnyH`q+efAK?C-ooO1<6%e4t<_z+EXX*11S zW$5zlB3{2ZYM~NFDImbF{ny<5dV~7&o4go2JpTb%{xBz2Wb_*1YdhDZ$r{AT71~Jo zS9P0aD$eK!VA~ABLDSQMFLoIj(h{nrKRbD7@2X1;Iz zVw|KgTl+$}$@8RZ>q4H=rwc?N>9{s#xNA z;n8Sd_G0 z3NfP_3=bp3R)CE%A;M~q4@Oib=F%39PONQOFccP}cr=QL8*C9Co{ppg<0q4>4dOtR>BYroa~37NHMb z6d{8$=!hs7AHI(y3}4N{91>sTu1#1WXiG{|fvSn-dnXcK^)w5S2l|XNG#^0#5J>DL zl#d~DgKN9J;600|||Ko@CIA_@r3z5>e!HEa}tKSHuP= z`i^=+U<`@~r)r@X1}Cl>G>R*^9Jn=bcNzy_zh!t$euiM*r|1Cz5$A3M1n+`?*#a#K zMIib{&^LC)qzjqb?|Ox`4rTDm?FrefZ;5l=Cy=Wrknib{MejaH`W;MnRGE+qaMT$`2Dm$)=cjidoen94ElM$3Zggoeh){>{sZ!KAlKaYIkSr3 zGwc4ax6WUGTOMaJ9x1(<$spXBp(6(k z3POY9jwQSPTc#W;L8HhZf(>&_f{LlPI=y#2wAP=J@p_w#tl^U1Ku??DKb-w8=ti{RsyPos@P8j-8>di zTNthBb&_0Bb+Q&lV@A1C@X}q`d8kjNTS!mYTUf18oXyWoe>dnGx@y_8C@iMhc)Ik& z-zRfzK4qT6O>szH1K}sc8X`CviQF?;LTx%myO^wynWaFDaz zk6e=3@}n5c{NimV85*Ls&>N;B4AQKvJmA%SMxb7TcYE;Atn^1f*+%8c)SC#J04%1o zjpu0?7ZQ1CWIZjORys(=rZ+g5R>nil`?*lWagGy`-Qk>SfMO-P#vYxST`RgUxAHKz zZsH}|oeqnkNb)0bC{9&b6!|q2BK$mTA&re==>yIKS&Jia=8j>}nqh+^ z*T8vpw_oV$+O)0ppvP`aQSzKrpl;+Tj_7xW<{|`VOfyd4Y5PaKQ}fxOuA8tcol5TQ z*?6MP(n0DQKnBsjk&2HpxUTNkZbp-Z|u!SyQA)${pk$iIt=21DPxz8lp(JDWBKG z9EXv%2R0mu5bw@rU|uosuo3Ap^clE>)s3vPAT|T9K5P^H@=dY@OJ*fNt&wh6-z)uL zHrgHG7D({ZYo>c0F{=gfc|;6O;W-<^1ky<^K=|)~d|d+MunrWyBk9qY_X?C9SpbxJ zzz80c*X{e+cK~sk1=;ex&F zVMFp3nnZxVPh9qv4RM+=*;6b@pP{}fMcYrvabWd#doE8l(PAt(YX ziZY6Ta`k{%T&R%iZFUg$Fvt=uD1K*B%6*bEY!}jiWA%VqTqyAyCAa@W)jNkr@;%YR z$;9Ty*v*C;XX9*a+qP{^oQ-YUwry);+qT|(KY8{0XQrOM=T=qU>ApQrKXp#|@)0HJ zk~~gCZ-RJbrDqYMD5$}BIS{k{jch;*BlhJl2k&G@4cpQ`1LqIcDTv=h6880TO-|RL zLm8_UV+{_jz>p$$Tfl*0Mu4L|3UG9r5Ea#+nnZvHU5YySQV7ruibWlW&?QS( zqm2>yHY@ph2>aS;>5?T$fd{F=z~aFaT$?)i_WsRU7MmK6)?v@oB~#%6XHxRbhyag& zmEq_f7NDCHn;MMPF&dGIe{d#F>Nj42src^uq~r_ijsREmh)Ca5BT~^JA-5$?8bzvg z&r>5}T@{o06m1zdKLv;TY>pkj2_o$4>e2Cr(ty^jN7;=f>p;YY zRojHDDG@rN4i#@(r0Oqi16moGZ*Cd*UIe)C<N`#|ZH7wqdDDA{0gy7#utpk5y|jmt<%q z6&NLURK^?qQ}9X@p9Qf^XJY8ftn^JsBGzS~7_tMg$yT|OZ{uH`{CJ)EpWVMYmZdIf zP#D!qxW4<6Qg(|*fDc~poPrag`Amx0r2Oo@dIjg`HWt`yL`~Zhu_5CA zj7);Us17q>Pt2N}sYmu02pv(4s2P1W0ya?k(?3)$8`AZn+ z`};}N$yfVtR==1{`Oog9S3HhxYk?^eNs_^;O6Dv4{WF!Beb<>yU5+uO1@BdFf<3si!j%J zH(4pWnT35RpA?;Z?*(ky;=g|;#st(hCOeb>CsTnTa3pRD)HWwO6aptxgUR@e5TR{N zcE}4(rV8W4fx6mdU59o{>Kj`QKCyvhwau~u^NiX}p#(U%fNH!{KLdXY-c+FUxq0wg zdE`C?A1J*rRRR=VK*dPudw&Ncgn}=*jB9Gt#HVw)AJVXoSA zAkSo{8^5P^BCrFYG+s3iM>c{oUcn9rx&2Y!>GArweXd^Ri@I(#Bo_4CU_NGCn)IR` zy_p7Rz?MljnYqWBpUz$pfgZOODq|PB&Y%akj#{1_x$X~159j^v53=(*?ObI}e{ANG zq{?(0l-rV7kgXwFhofN9r4pJLj&`*6uGpfx{P7{~mY{ zKR{t0BOgt;w{qVAevj7l+UQWJAxO*wfr5&Bip*C~J>gy|j~vc~zp*sx20SShv*&I}{HtapSbrN>jd$aW>NUB5|PqR!HW>m2v>`~|q zPaD5OSfCG}JIZKNMm^-<0{vU}J#)%V%)uR|z`iaU2y>QAp_`BA|%I7-D zwng|Ms3+O(yFySm1CUsu4;2y33tanJv~7)6oDRXO=Em##hN!KJOzX=8&)%H4(7My z@x(g@o$#S2uhL)XE!uCo^c_r09Zc*%LLRhw6VG6rE#p6Ie}A+mZ7dIGc9~0G7b=h$ zbNf^8cpmTaJLk3sExOhDA}IFrH&(BV5-U1eWqa)601sKiEcBpSdrj1x|E>i;o#!0W z#H}o?aV&DW_#MCJ;Gb$mAS`Eqvy+3ibkN+pwI1G;>Q^=@FHEzaht@_67dTolmgz&a zX8v4MDEMa9nytR*gkqS8ZpN_)254qtj2X{6Tc3I>Aff6Z0MoG|T}Mgcj3DOZbuKK{AGjsZbmB9O+?b5bt+!>e2imNAwdGWNPq2Xn6N< zQK#~L5GY@IHl)kE*sgOw;k|W})`v5*L5jOJ#$xwuf;I9#136i6Z)I-FRX_N**QHE8}Vw-}t-mOSNk2+vlt7%$0IU*hj& zRzg@AAy^tASnG4D2;$Rqk70}4j+z05x`}3GSOchU zE!jw5+);TL^mX=F3xz$Ya1H#_4Mdsr0lEscVbL&bQ*NpK?111CdS&&n>f5Nc2vOzu zH{CU|u@T&k-=}x0A)GZ%0D<2pcdKTFMU}uC%nD`MfG8B~#wy^Fr9l;h?P3|B;&bng zNQEKX3p)+XH4Sd=k0gccb!#+kGI-DxPXxW7=Mk!c;2g?i)2RZd-cNztV;-sB22@Xj zoebI8bhZ7{Mk(bTdAWSxa={S>>~Zf5k;g(SthTU4G$)%dc*2T(o8%F1!!7*%u~nHX z$%*v#g!?Kf@w6%Qjv?hj9Omo%$l)T%1C`Lbv3G$TTD|u4!ukgK^X^Bu4!u2S`b1S= zA&Ie$Rm!ac1x3W8_tIfg-PvjK5|BR^Q9Jw}CT~U))^$G#t6C|`c!yXL&^H|+Y_72G z0PVUeYO*S~1Y4eQp>s^*BB_}`SW$uO8E^izC#|3_?4ddqg=t-Tk8b@pJ2N&07xSO> z$e!Vz+E!f=Q1=RN&d&5VdknV)OdAh(TYM+PQ)l(XT3nm`0H;Wb5j^T*DBzu^Ewz+v z1%Ia#=PfEr*LPbqc(le8`+$h4P~dnc{VkT^@l|>8pnyF?U3|Mi*haI;9OTeI-CZ&> ztAsb!2jYR}y`aS$lT~Uly&#(N)}MW=+ujFamA(RmI(W)w_cY;>`%ZY=1Ut#DADi0n zBI0R!2ApGBTIA4kRB?*|=0N6@Mr~E3CkDHh_>^$KtSkrpzoUL36SDIlEYZUVjfbNsZ2lg(Bj;^>-CAbCMt@e|m;SHcHc4U^Bmgq8f&>5sRNRn9 zQ$~NcLRArI_!Ns)SBv&d0XIM?5#(hQGL_e>A}Nr6sVl=&5p_yl!!^r%-ncDBnk#1A z@tZAVpXDxbnJ~hgiGu!f`eu8dcJVUNY<%&4bCKEzQn4e7*V{B5No;j}shAcBp|!R> zf5wVY-B-$S+E}(lGYMzWyby^8Jim!LIP*KK3|Fr(ambzTH%c0dD_Lqk z0k(^IxYa`|>iJ*RHD{Nj#dKN@Ki~D2B#S+t7cjhX4pwPM<8Z6n4?JhYI-4`8b0W53 zQdkW;S=3X}Wpe$nu~c>|sL?d;uZuf*t4S(`?z=w!E&3eN@KgM5Iq-G_xGxk>B|2lM zL|I^b!^Jo-*C44@nI=XQJj;x$0H`(oMrJc{ue?%6+DnyWhbg#q90LxD=#ID zwDERe);wQQr@*hnJB)*EJd<1-|L6TOfW%p~ta1w%b#ETu$H6)2PK?69fmsuP6&<1d zU@);#vXGbinnp%xH1CB0+!Zd7SC`{t&|a)}E4Of~ySlMjlkGn7?Q+#~vpP=}ibrMs z$DAQAL}k8K?w+7g{gelpQe(WRI7s%WFzD)0_Orhi9v=T^Q&z6GHB;HKNbV57&>-VJ zIH`1OXoN7ismkmX*2d9eMv!A1_O_by-w(xjoOdv*W&~~5ITY%1Alh00)1;tIQpvw{ zd4N3`fnyL?8k@R5&r=>P{VUhRqLXLb4A_Wus@Y|?7F-&+&M7$NGgoGulDIi{9Qc5= z&w?^}Il5TDb!6Rbsv2pl(F**y0-aRj7M*6TtUwc->9;K*cq23Zl%2n}v3xplPNN2q zQ>&@zZU|Sxn-8j+!2W-_x5y(0bz)3yHYoZ$RV@M<4(;1;68I3&Vp}m^6{%fqQw+Z4Wd?zM{Ud6LRz1<>NuWGg>;<%YaLK6PF34@uRk!@}r z_Cbv&2O%mOk5)TByDgWCy{q}HVN)Q8%Zz%*WAkIr{r|ZCdCKLj2U$N$@>v02e7hM6 zfYet>ep~i+r3^F($Qr>H-;%8|IM=F1W9Lg^=&U`h&b@P%uU1;~C`hzfx8FRMZckoPrLH8gPMe;jd9h%W`QDRBT!qLncW zRAYuJfb0uBqz>@^vZS>DIbZYG-(UpezlaGwbP%7CX#bl>s{{kx$fXO&|DqM{>j93x zRwnyu>SE~=Z3dorWes3#L^T9le2ruZi`}ezj;MW(eCD3WQ~8;^j4@#E%LS_`fc-0A z1;_Bm<|okn3)t9b4!HfoR9FI-zS7&b27rF8>#;rH=4*7*5fJs|VRlrAA?|-3z!H7H zK=Bj1YH6?%!)ZQGwZ#RH_l4GV1N{2(72yF`|FW!s|4$?%9{}Cgv1C7h!k2X!01*4K zIRAd){-b0zPCrq2VD`l`S&RkXem!8WKx(nr zKhZxEr$klCrDsH4@L6UC0-}_-)k;Y5ziC*Fp1lCauhHq>@S=Y|N1OlOQH(~e z0YLuOBJU3YroXI~Q9$a~kF7EVK>H%jSj_`4zM=&!0^+}Lgew5{uf#Q00V4nD=M}C3 zN?`sI;H&OOe#85`Ws5Kqy@LqJ6Kx2=P#cr?0o>640awleS&;u(UUz^VsQ;#zRMr_V zAcBC1{7j^u1OJtXd;vgC#D@oiYm9vZ@FD((UW5Z{`BL~3nrLs2M*sl{Bue~IjZ2=W z(?dhtc!~&?`6UGyfd^LhCG*Eg2xg1)-{fi>aQ6vgw4xgs30H~wEw%Yzs@WXcHol%%%}vGfchVL z+ypEE{Xfgd6Rh?tkEU2KUfBPRy{3a5edTdj4(9rw|HRi=BKpKAC&HV817f&RqZ9hx_l;_Umy`-wJ4OXk5zI6oJ--G>EB}e)gZNU+(=!u)O?! zT3$c@aWMYSn#$q7^YCK+dxLGG&Glv?S@mUxOqx?%fb4|h^%mD_O8T=YI=A694UpUU znm^{njsX}zD77#ASQ_Io-W&NmJlLAws~@xS(~lr=8;#2=rj>Y!((&a_n|6n^=ye^j z_QU0GFP!1Y=O++uvZ+kW!;Q-;mL~{NEyh^a$1Lxcgv^1F_0Ved*x^o;mZ@*Yv8Weuh@2q=0@;=$+lN}&>J|= z8*%Q=@y_e(O3v2^h4+Ep&Kp_!kM+rm>rY2uAF?qIp08x@wPEjsw7~BhozPRABR%h= z!y6<|L75-JAJ;cQuhHlq)X<((!@#_)PPvERIpS|uU5?0w3wH&QxfQ1v>T=h!n2g75nfxumdTrg4EJ;?GH6vSV)SCQnM(hDU)WYGmupvzDN^pI6Q~!R zp^>+WwpAxtA{}-rZtW_iiF2j7zG6Do8`dPUOcb+It!crV$>!QAyeOe0ZkD^h_*L1W z7U-qqrv1~xzPxOY9a!9|6@$A9#r6FrvTRQX+dh_<#eJTdVP9!0Yf|)_S=1_V7xBog zkl5LEZjE4mOO_+)?{LXq0lw*(0v#%h5PFgYtKhhXIxB4gc;Vz#``&1ql|Q8EEQTbp zrFHrAeQ`?I5&k91sS5!)j@^!uMZ;wlrqImg@It+EPQNrQae=+wtgSU9ExKyz_EpsA z=BgXa)D0vI<=G@SDHsuT0Xfk+vvuVNvxS1p61`)JxW~B1YR9b5e~Mz0NJ`dIpG^nKj3FnOURNd1l-dlA@f5u3hEvJtmY zb60ONRTE6jT0j+4S6dv&A+009`+YJ-2uL-pr!3v(MBrOD(OccsMFi^w#!m`sBhoNig{q0Sp>HK>O4LxeNZQWbgxRNw1`AFR zA~pQ}SO{3vK#db&ft+k1G6nNEkb@vm+`bTSJb=Z#K5uqe!-Mo2C}`k0TD6pIn=Y}m zKJ|~_+g}164FZc5=vQBqDhOhk26C)5&(5#D6O%O7yP z*#!eCRvSkMztcTk@LX9rNH;y}w-BPUzIQte((3~kdQp@3YZ^+M4dJHXb`hv>2Erao+^0|P${HnxhE1H-ci?hB@R5==z(^;xaNKqTupW<`5dQt2A9sD9%0 z>mo^6AzIm~K*8y#Y;J!1g0PgEBWPwFFx_Z1$Wj~6ZqU)MqE^8-T}DjD5}sW>U-#nOEqxM2Gpig*H_;N@|Odt>4)9tIIEcM@(oYS@_xbZZ&*E05HhoW z3-mHPv3v2eP3lVi*1XJIBv!=}@|#pE1Nc~b=lgxe{D$KZI(8-PWGqy}gP?P5*h+-I zdsBUOW~PA%Hqq%6`5#bFGXHldc5M#lYElv-A{T=EU7$(7`RTjw{ESVWtS=5Ou$2*b z@pplCM^F&N=4e2sw?M`H23bpD)q|Cjo=y<5LEzud98)-^5M664CbQmONBzGs-?i-= zCW{f2Bhf3gutP#93CvEb$IA!R27=;%xgc%o>N%;%q23enNNmm1)=6zn@Tl|;_pMNs{8 z2-PgN!~WWftCIgiMrd4yf}IW8Uz~Z@C)SGeD;ZSM=a*R3SrA#B(*OA7GoMEA2lQkw z)SoXL^}-r3YsCQ1QnUyHMjsRbRB~vnkHfK7`DYyX`H^4bLKj~k3MYYHt`ki>pnGp1YI@-RfoDkxcQTbAgj2YSW7Z&7ITw=(uho2{3q=B zI9=%G~f?VX#P-RJ_>aF&3 zpIl@~rR$uPI49&kId@`L4bE=H_bC~OUNUN_Ed_DMX~Hb9AX{dG;&!u4;j_j$`D0UY zPt7P-A5BR}7P`pi0yoe(Sz0~{2RJ!VMx0fe8G~X!hG+HT z6@oi_@%Frq6IojI<8ODI1rWj)Q=?-WjfX$ECboA-lFPkxik0W#2=4gB+Y7vi@wFP~ zA`LmYqZ?QZ@SF3yp(P|D7IV{-RBF?PV`={!Z4bxV(>aSvHBn=j0o7<#KIY`CVMnZ0 zkByHHpyShgh)%(f#!Q!RhUuB5Q>28@;#9P;(Wg2ui?sPT2}{8cLapVk-RCN)?#%BZ zgx?0_Iu$!>=Pu@33GOoT-@6*sk0WdDpEJy@SFlEc3BmWkSGG%&V`rDqeM_Uzd}|Ha zL94f2234fY6%aF5fDH$A0^6l&X2lPNg&*KzH}DyzR{|LZR|*;XvcQJ9k0PW$$FvF0 zrO&DP?}(~$A5mvG-Kq)Ch0lrodw(|M2umV$!djP1Z0Q`D)T*;HyZ7$C~#nz ztr}kjsM4v@snfToixZ?~j}j)Pk_k9_W>nc%a)s5NSv}kG!JfgzBWK9e-0Fz+iLpcd zRXzJ>*xb_c2jSe%z}u_ajo?>?Anb8=yh`)!?*zo9XEsxxgmLeEC>%2SWz!F)<*Cvu z;ixo+4pdr1fNvAIg=%goT*EVDxse$(!xS^_wYx@G^hbV1?s@d+TfNQo#a%DD8RWHg|`pDi*bCThhtal{sjm;_GAwfXBpzN)+!g4 z^Wx6lQFndg6hgwTyNi)n!LPeD&0#nokQ@v620xiz3v{5THBMnZwQM->p0uONAzQj( zt2wa$<5rO`y>OF-7r|?gxzcK46ljZ;^>4=b@F{`j^M4?XV6<`$bb8jPKT5*GT!T#I z1P$iCPGWWoXs_cRTLWo7D}`+27ze%bx2$K}bkM36iS4^+PiUZPKmg|_n6D`JbVN2+SCSC*oi zAqVL}$?a@}%vQw+;Zi5Q?!pXgj9GjJZvIfgIA z-RHRVXxKavD>EFq{8@H;eB~++*{U^;Q$$ehy4VbAjI(5J6PbE7_FmtmuTQ6Bh^V81 zax*-FOJ{UTa>;*+7qL_=$MCE5VyO^bFprC6|L6FSiui1T%+B>xpw)M@AP7*G1!dp@ zRe6yb_?VJHd^~Mg(JxwlZ$Q=j+656TVzVXZ&#BusFI`umG75Av2<`cRPo7mn7M@zZ zZbZgI`*oMjl@$*b)tIx>|mBvh6Zm6rk`=rR6PP#2d`&{CXK++c~KXho%YjxD76p(@Xz zLHDQalw*ltnV3R+NsAg@Sx zEw?_kOV?nm@sV-mw>*-7Fp&)ZSPuR;e6{_f6>R@@Yb|mq3H&Dy@vp%yIfD`)&V8$& z?j{jBmnZAN=NkgE7Y3%vPA_BxQajliM549z{nao;BdHgBAMuB8L;R49;Hf>~SU;%r z_><#UKnmgebe6yzHB9H`8SF>T5G}2QA7NosWffcXp01BmTCQvA;YP)emFD7p_XiG2 zypdsh6Z9IhDr&Q@B6q3KWXq2M7m@5o!pTjBa)p+X8-8jostVWF$VbwN>8jbCuDimI zQrqeb!x$~KutGQ6AxE-n89l#Occ8MKESB3(d17CKP7VigLRUck35@S9aB7A;q_EwK zzBlT%T4rT!ep`XOriA2}I<-|pT2WNggaGBN?r^X)6;)JZ8sonkxvqx;QtA+nD9^_) zD8zqHn&i2;j%n#P&+qLqYl4uVhdUue01AxQ%Y`qUpU9S&kLV zy7NUyUFn^c@kF;u^GuDNHO^pqyMUJ)KhrG!BkA*V(L_7DUwbQWnY2bdJj21{X2sd} z)?^3|?4E}*_u^W4IYP`6_#n7G){P(kV*{h0kFT6}CqBUnzUPwuHV4YqQ(nenBHA@S zAI$u%Z-qeB_+ceu2~5RL7bm7y2X*iV2%?jf7xz8uX(K(h;=JLWxv~Ovc}Yd38XRHc zSOj8TXtTOlCwlv5s8yO8f*6t&^DUjfl&C?p&S!3 zUHty2_n|7Co`1?Y3Pl1mH5tm~FC%d)!jso9B@};y#3asn!Cm+rWb9oxSwhfv=sX@X zR~M@wUwK4Fw1Y9S8fGUOM^y|nCR%#R5@dMAx$;0-4*zoI_5gUELF{CXxKy17Omqgi z93s649SaO}h;-vlAdm+QgYp{I)T%cJErdlpVU0WKI=Pm~l{ezCu5tt|s-q?(<$9*& z7^ln_9KG$(iR@NgU9BCj-fB!|@dY^o*_*^C%+8Blzv)-WU~n&lH2-)mGib zB14+jm7u^Hr~x-h1+7vYsFSB&$jLdzdD_v-Y7}8p34xDI>7H|SrtL|k#f<3i@#CUy z89~_)b`L{`rPZCD)2&a=v&jXoV;%SLte|K+q$Hjs{@dp4O#hxC<*(5_oxYA{zepl3 z-Qpod%^_FR9lMEOvqlz{fS;Envkg{SQxV8Y$7dkzKsyrzuO{i^Kk6*BaDsbOXMy~` zO)9H{7GA1Q>>KNrq0UDGH7<4aen48C7~Py;A(XPsp~dxq^`IWSE*h@P{O}5xHy+Z( zGat_Kr#$E*xpLdD>mbG&xG8`4I>{n~d_&=W&gf-z34QqesthK;Z=XQL)_3LdDrj8e z$ze2W3>?~+ag2-^C*1dfj^8tlz~6XIiHa{#0YaIHbwcH#TEsIl2mK7b?24e0b8D}0 zK$L3H*1ZQ?y*MK!?(uqN>%l<4N*PEf&mI`rbYg>dRIV3D?U#C9QQvczI(KjSR|+Wt z!x$VQ0I@GnjS-H~8-Uos4tvblj??+)7!XCv_zqDk4AV5A?D2?8oKsyxGUOwAH?4 z6VOw-3=(>OrU!*}T~cyQ9qSKY36i_BzhxN1v6uWR=5)sLkgI;$ax3JwEfxGBydXWo zr$s1p8n(c?_z}AU%`}0e-anQno{uqjvF5TxTsL4j@1WK8d9$7jEq1IUr3;|5GEk44 z>%tsxTK{ISv+wpY4K%Vz|C|_whGphDf>el#~Fy`a12MTzL zd5a7}c{Tq?kf~jjr~qY%?ht)WqzvV%k-j?YEQ=6#-I3n9zh5%$jng^X4n??TJ7vc}TFOTp#{?W|_L5 z#d}VA*N3hnul5$40K~P;J4I=R#oUhkTI4t77><;FuHYT285(1pInVS?5zI{a7zhy0 zxLyQ55W9}Tv~=EgmL0HoWAO>5UA`zWCxbI4|%bJ z>U4^Pf>m%bnvs!=KJ;la;ws>cqmvohqVjM{>MOxL^2B6sF4BxFiSN*zqGSMEFHpDEg`XUlQ?e z7B);hT=ovDetF86pr}5BGzFM0!Z(Rfwq)p37$3W6nRGk>es^ww-p!q_dvx1ul}tfM@GR_>BEe_o^rNi71U9Tm9Nv(U(UGJNKy@-#K;7Oi5LK;4ZcXGwquWukcneD}a$V(|xA z5)n-uETYW-98E}0#qV~?^P_HxN2|`n@GR?e)RgMm*OnlpXb+9q$IS6xnxJRh4vrGkrh`+&7qq^A}!Ix%Vq~`s3W_GDdR_>7GLYa(#Iby zDVc@lkKbA%vMVcGSG6==n##7L>U(8@;BrWoFL#jHBPrK2D7fnIcrtqU|HXl(z1R~&ym6-hiAae z-r{s#j(r?h*TNf19w}rVbC}y?CC`DkM#`4EB4GvpY*6{wC$n0pSBn;RKMcl)QV%;*E=u6vB$)zyFcM!}aWOTT3e|HNzkMrcSl+)hd zy}741G7mE?p2=3;z&gOvGygnb4Sl$}A*Bj>;4N-7`A=2kS>z$j!rVejW>w1l;Dq&A zlY~10(z7QL1i5g5Hn_%A6tp|Qoq@#_UR^94DYAnUp1W4{v2|EC8Evt z8*tGQr8wm9CBr3Mhgs~==@H^8Jg;P2FHSw1Bk|)sW#^XM)R;hP$l)XCmyZ(939ym4 zo}NT_Q#Mdh)^{*n<=xJ=4cyDu@J7Ki7KKs+>H^fV>6(t12+9@{NkT7K;tSbmqFmAl z<|=m#ndOzfvH5e?l4q-F25b;fZuZ>s1;4i-Q#A#d%@#V!rjr}$+qRnPFb8ZXp|AY= z4O12(8;O2?zEj}=h1CY`ywhq^q+Kw43mZ51kgep!BVGknFOzUEWiHde&48{APh~s{ z6ySn!kMSq?`Dn1aip8B-=%++Oe&F`0X0P#&1TWE1$fG~`&*WdP#vQ#zA3j7)sqPK< zjHAED!rq5ap66A?a;K=(bUkkIyLdfaEjYy*6g^Er$IjC*?k0-+W`%Bnm+kt)vhv^Y zB_-daS_~YZn9%#eH9h)pQ0Qju5&XMxftT1DIuWJ;>iWx%KZC_dx~WdM*zV>MZ#ld{nI>tFxk^eY{pI#z2mi>z9+zp@r9n8TyJ;MH zs1P*gurB!o{lm^Qt*>z$ekfD_UU zT!E6MTZ$eS9+Ii~PF;Q^Zhiw((z@O2{#l&?Lp#QQA-q5d9}_QKHv&E1zgY%ScOqY{ zC|0pNOkHH5dLcyv6Ei?#+u;kIP<*So`CYgRI_+WK{DfyZU5Gq~W{-Z-6aa5Lo|70K$T*+#qounf>qcP8;&ID#Rn@fFs=s88<0@348ys; zfI4q!!HJ-yGbP$g{)B2rt}%^)+9$?2OqcWr{C~Rxghy@EgusiT7oxv*2_<8Smzgw@$1sUc2fs&dDXUn|n zd{r{wX-jg@g!PJT!{at`4>EO5-2IG8T5m=>Vhv|R)cGcu_0CZk@mhy7n{U*SB#eD7 z^p%Ssv^{^(rE(=EvWitUHCPElA6-hec!>Uj{(>>B3{SP2^CX_JI*wo|(6A#>seyYo zCZhFLkB(Dm)0Bq<+{5dQ0Cz%#>b8Utjs`=*#7FwAYX3Pj)-IMCRjV-kt1owAQs};4 zo{zeLGgEeN4c8C{c-m>L?}ST(I3vB zUjYwX-cBwX%A~~FJD`=O=QIp>d9>EVcEL9FC#v+K8 zwgh5z6n4cds@jVSm^vJjdlZvxD@sng<-a}RT1M1HVS?54c6|zgVWAupo65OI7LUUk z^qYePE(sZWtuq=x)!U4Z&{mp|oW%y*NHu+bj9r(pn_Q}6NoXSGBsLoBk#aT&~b3%d!H zwuiKBw6Ird%0w*;x$~Ea+~Q_z@%KVM+0zV-+s=4OF4bOeBQ%K2A3`G zQ*!+n60vmU$-|M5rC7>Jaq`mW4pn#_YPEoCpIYrk>1_Xu-H&z-v_m9wDDk-3qj}^7fD>9L=~a6vxMc?(rc zn%t|88(=b{&J1#$y~}4z_e)~wO)9~rQ)R}-MV;fH$mYRTGSXLuJhez0@s^L=(SG7B zv777${{uJV{&+Z$tq;E_kp7tBfFt#?n5+C4*4^&Y#P0au}8+I&php00^OK0@Q zZ0vC-0#XtwFIVR^!NJ|&yCpYgw&?Lr3KKu9ZD}G!$eHN03iiOiRa&*P4$V5*NgQ2Z zij%C@>TBM>Hz&;7S1t8=r{Hirlp$Zlae`{U0@%|gl<^o}`kbXF2;Y!2VaS@AwWX!y zqMjlNNM~~cXZr?R$p>e-H-hEFX6~qE;o3>ewDWaQ$i_mvy3BP!)vNiMrE4iR_%^DW z6VCytnSNZ5$*}WUGvkGf=vrTCz8QUBs=(bO!|VOuUAHrwc>=SAYag)~aTRn9yC^$& zILH|=Q%#2~R{lR?)!05^Z?|a$6Vja)h-6(kFi>a}2G}#SJs)qVR9#?E<4`|jIkJB^ z$s+bj?*tv9dtr6&{j5vs6dHY$RqY=^FeSDDg3fkBPUQfnvYm;+-peAftGDUC5);>0xfqrOF zZ#^h5eeg0}zx?U}Dy2SwIbweRza?y0AA`OJxg~uR6C41Gji31MB;Q5aM?RFSZ-8?g zuiAIQ?{g-%%qb%BS+)OeAi_|ab&ftWy93+gwnTRFH?nTcWI+9Q>8Y}stNqMG4Yp+xF^WQ=(EoP&N^B3S`=sf zGqMtdih#^WB-=jwTk4oh;-6 zSAC1QSv=|{O6lS%zpEc8Zgt0jR{vC_syUK)wU@OkZuSQV*=&%za)V;CI7bQAe(IPg z+cNtRBJe?3Ma#+b9PbfdK7Hph1=>nB(cLh{Iq_9BWLvIgpa}t%xz3thJ4U@ z!+%7=S7X`^+Y4N1Y%M2{<8aTy8mfFtZ*;nC z!)IR-<;V+$Aq_{w(STLiPAISw&YIBo$qs4`q@xmDJ>AauG4KplopkkMo#q<6YU-7VlDgu1_6@%_r%R&9 zdTG4)#0_TdopkXQPQ!R`KK{#5N72~m zVv)nq{Oc6$r=TY7=n-og&iAr5*4QPDjZkhw>B5%2o+I{-_s9{z<*iMcLKLsb=wrRJ z0=g%tX6z6M>@VGf2%d;SyXf=5s|+3ec8u4|m;O_Eh|Mk_?ei;Gd6&5v^`~+STKF~- zTQn14xxwgAN~Th6&+A{!R&2BfrE7b`Y!@^PQ=V6EST*n|T$r?dvc-aSQZD8!d z_V%!3?u#^nZyXPgR#$Fb^X)`0`(8qksqW4IC>CJ1jRZ>{>NCi*78@;C9oy>F0j76G zfadK<#|5a-tqbXvG|wH_v1h>=5_i_aZXC6htq4p$5+$C|4=~$Q^dTp-%xe2@Rb_MB!L(+n7cb_L3Gyj^Cw68zmsmox4f+hzW z@ER3mlqDGd;b*Ei$?117|B$vRuC088m5W8k#(4|n29A3{Cp6lle)!@ycK&+^BtLQy zX6%{K01Q9b=nkDE6Yyx0`v`WvGuQMeB~siNcimBWpMA_w3fmF71=ic=3^X^{1yixc zK_oLD=(iF%IZorD=9__VAKyvi38yA*j0-k2@8W_uwM!#g`R)R6Xm(Q=T+0Qhh>kCp zGu8Bc0x5)h`>$u8k4*fj2I!<*eHY#HU_k3>b&NOcGNYc0I&Y1!2F^LKDkn?>4~L>s z1b*|UkeFr6BGC<5!#2|M`8|V#%EcvCMHI%3x&&K}Q0xxV=4z^5?uOD78UuPN@T3}L}f~?=W4!B_J3Yw0@r}2m_&;cFon;adD6J_ z$ey*LwLkKZ0o%D#31WEUK{%{geBNNiQBgVG=-}<_p`zi;PJ5bsFSV?S+g(VT!aoL5 z<9WUn>WtnD+`H#qg%J{5oP%0yibFt9DarKd{f+#=g(4Q*?i5WVQCG3c18doz9iiwa z(1Z?AgKQ~Q3`q|-N$r!11O#653l-CyuM z(yN^x#><~A!5)u4z_KeAu4~+FlA~KhtM(qL+tP`%yI~i}FEh!Ylbtv#(6mbT%7SLy z2;PpqohAbxHE??@wbz4+RDI}?P{z2dR=EqcfVCG}Xl~^HqUx@K>S(&Q0pl*g-GjRa zcMIaB^y*AHyY<9lP8~uBJ`>nKggL2I`B|~XxRg1Yjq$O!=i@uNhi4GZdwm*La*C^m|MDqpcv%kwVpJ@eaGm~o!moO z%#81w8ID~jM6=0M%oozahul3THf9gMb+O~~Bs<%zY4F(gWPl3T8ZzX1@<-*ofh69X zLLJ>B^YR_&N4=w9TPXBe?~NUa8$$jl4`=%39QAB_>nUm_NSjC;H?$<+8<(5#5q|q* zUCsW4=fz{^D7x?cPfYVpIUSV7-%VCCRJ@Z(e0-xFoST^OYh=$06_9D@cq8O#MGqJn z*y4N&33tB{#pwai^nB99UbQ_@o^<{s-bx)py?x4k3KzXF4>pX?AQ{=qJ-9LT@@0+% z^pW8RF!Z>I?i-pB3Ax?$v_DxoT;IB+-{7#lSM;qy!t`7M*PfBR-c*P`sXBX3b_{QH ziTyLT;%9rJsz3WDdJeawPxR3S0g=NWvcx@{Pd&&V*}Z@(yf+^z6SlLy9pOf*{ip#5 zR$wPEdnZGBEl0iED2dj?fQ9hSl%=zpoX*&OWke%X8iFQNe_+@H(L~^}jiC!1CnY_( zzoAtXGk(&eSuuMzCtRe9rg%Zs!VOWkCn@#{dQHp)lIAPLjIbLEA*y(Px6(b+=buwY zTTTlHD}BI`A(1swql8J{KfPLg_Ej-NQOnA?dei+@(Up~OD?nCd=-$+0risl2QedbAi zTl281Ba0%{7p$id3tl^$g$Q6hDfQmSiD}r~U4Q`UEknWir|qpQco78?X!b)0-1j3= zgXkqw)ebsqwbekXp!SWMw!|0wU<1y0BEF!T_Ujb5LzcG(I3T;CF+Q%*H`g>OGd@EF z*&=0)12}QxS3f4?ew)G>=|;hCQO`OON=$%J)0C|Crr4>kcHFDyQPB9le2qTVL?OOx zOvC`>Fx`QlZ?yU%YRy5$%wp^ybqx4Wh>s%mHoo-v?DnU#oMwew{pGV`uNB=1-|%)3tGxH_Nb856>_`NNX%MOAq;j zLL?U9c~AZG1iLCkCeG;Eb1tc?^|t_LX?9td?6&>3;#+?sjTov=CWr}fDfN#Mon}>a zMW;3}?T}x0FO;>;NqnTL6;UZZ0ixU1y|qH~o9Lw%P}vz(1q`@4wp;1q9#eRKLOsMd zWK4(xh<{A5y@{Y%f^ZJ_=2#qaa8S-q_cN?@u)XVPmuny}vV}XU!^${9+s^K(G!J$u^T> z&cm9rsulO054=;>203Zp36)JHv0XxL4%!#4p%9CE`zfvlZ0tFM`i3h$CdbW#ugs0~ z%}8ci+erU_R#1NVnI$K-f4P#Wgr=4-#C)(VhI-wYUBg=hXFe=kNF#u*9s#J)il!ho z=f?KP>g?3)guILMT9(ahZ+~8?c@-8DgNiGfdoXM;gc*WePbJkE6 zP9j!?gq$KwTi<*o_UVk11(7z#NGsD0!nS)@WjqP zmvVhAucqRN7j_HmCIj(-48T=I=npag=ek-+1sWAmzK1-g zN;KPomAXSYD@au}T76HB(;(Zp9G-kIqP$Nnv1rUp-FkKm6j=r=brw@kw<#~@^5QQ% z}Xt$Z;a>dt%0NE!c4meZ8Ec6^9u%fE?Z-r8{{yrdZAeFY@s@=!Y?C zg-*LwEDY+DSJ9b(8goT2BW?{M40y(2(bsGrDq#G(XmS~LIld~RN)u3rfsjF2R$jd% z1<$6f(kV3mRDMBtYOGw7O@2}kk$r*At-B0gJ+Vxqf>Un5nv>~%pcx`XzDc8secoHu zUWq^+&?KX8bZb^E4hLmigA(lgVpWPL?-sv0&e6#ChuLnco-*&=qb}bUXrtk;+C-!E zj=f-0T18%ySJqs15r&X%13NEuox?O<83O~6k>B58lS-FhD15 zyDT|3ia$U745HcQ<$>+m8$s_&^JS&&>XCZLMklnXdD(?`62O2R4Qhl>XO%#_5|f6Px)WN! z!NkSQE$K(JwfJ>%3sm86b76SZjT&N>1^@fJGGY}&*7^S5-MI=u#vpu+D5JrT* z)7zf%H;`z|9AVo^|GJm%2^y)u1(Qwf#na@V6tL|b(lD$P*(&?d|6(aEQB#)2H$bB5 zz>*@jtDLT|OMOpWMPMkzL~8sM2n-G2c5~mB_?dV$$jY z*0~4l0VjKnyhYtT6t_oF`6FRpWHUSBF55DXnRl+-r#OL@iuMM_ZRE3bOVWR>dA9JE z5GNc2L>wejYOB((Lwkd>)}i(R$z^0`uWbyTGpTEJ+r{7)Ic{=C<_#q$7|I+1V!@HE z^2!piMC}}_9zOc-%x)d2YhKlCz+a|{`gcEczCL!bHC2q?9O^ta+3CGiHqxLe4H4ZV z%(1#!!G!5anBu$=RZ{|C({Xs-|5`p)WEJd_$qm{ow9~oevsVCOuU>xwN=PI30VRTo z+82lreig7Pwk6iW#OMxrdGoAj<+CN?nTq#N^eguwVsUI zO_Xt+$2J=Mu~)r(uyRxe{H=i;2r=MqT54PWr~?0VU+bE>G*@bt;x>i7gyyi*S_$w} z?`*Zc3&M(SLd3RT*6Zl5wsyl%Jy)ZUXUd$-%Ao#cOtLAVPNpZud_Kv?yi(IVZ$wpN&eKku*43A%EkELPl9X$1RRz}nzNmfmY* zjHl6vC$Hz7^(yhxxN3y?DrVu4!-skN-jl>zvSda&wgbTo_}ia+akKb)9jXLVpa-X1 z8v|?M&_lafaH4c$hN?)`o0Qw^@~6&^$OhOyi+(x2{|dVu<(OF6l_eZ%y@}$g6oH~r z1`O=_gxue92_#TL%c^9KT9i;9s8*{h&0c90K1tN8qQqN zp%Y~MfZX{l_Rhb;txdQPGfd-^eE6Te0;0X}a_cM4LN%C`91%zshGh!P_<6mmC%JZu z){97aeDj&Hr?+N7(m|;!WD^F4{ULd89O`gL+u2;ckqn?Y zfk%iK-~K+7X@*WszMO)ksgofGapG0B5#B>vl_cqI3H5c3U}-D>rXGAPuk0JU-`_=9>@@ps&R5K< zm9!Lpoh>k9LtqcC6;jCg)q7%%bR37(0ktup>8_zfx7`|G$|aqPMXl`s+u^5_ym3kH z@@?)(E_xws%>zV?49g!RZ;27K=p53(NX~ZpI1Kn!^5Zd>udY@5z~^RdQ9U;-YEY$zp@DhAy?%sM8GizR&yk1U<5^cE(qIo+BMVN7xu ziq$a{tZ*b8PV3#y`esNS?a=xv4BAmx6B6YYZZC^99OL?ljae8+K8DI{X5TIVgjML) zW^^@vSg_$TR^~cG+{!4;+^J=~1;zotmzs_CViHh#8*_e}BbQT?Ewq*iD;+EX5{OOB zx}-6sDwO;(Zc8t49+fiWLbSp3Zq2K>DZ`U}R5>BTS5a|K3R_g<5icQ?)=N;XWR=ek$|Ae6m}OT z%SXKO5V8CpZFCD9Wa=4dbm~Pv6Jw^$W`e|QjTw`7+6WEmA;MCY7W@>Afe+J??GaovU9R8)ayTY$64L_~R!1f;WY5Rypf|?nlc`1t+xqBR;ki7V zW0Jf=3*1SMEf5tevrqQCqDsi|gZ=sLld zgYc7^)ms@fXXzwmXji7}@lpr`V!v9M&p6#8i-gkEAkOAQVrvGK&kSVeSsMg*<)Hb{ z0_y+#5S{DF`M$$X&n)9voRknEFEGl+d4ad-OaDoe9YNBPEEEE;pt4#d%Xo)F7W(3e zClwxUy%8%R*2ei11g*Ukl)4XQsHpy`mC51=$+~oT#b{G$Stl{w&q^%+MUvs_RGGCK zzr!XhX}eBv=?vA#SC7kk*2rfUInoIYKkkHLti2r_x0P!~$mCV%R$9rPPQc7Z+kmrP znQW1D%n9{V703c`>9s=atL{w`Bi!+bN1?deSMf?VDcF?$fPV`@#a_YVC*$^@eduCXOfbG zZ6oOYDTBa1?+Q4?lp!s|6eZsz{6+2Ob~X|EE=rA&D2Qc1to)*SnyQ?6atjA%%j<6fAE2i@AusM_`KU~&4 zWExj^B`Sn}zagINQeB}F&BOD9Cw_JhLf+)r)Fc1>9!{qK*WAAf_b){ zxcXzJ$Gp{fXI^w0e;bY^1!D!LI9=IakFhr;Tb#21-G4P_ah~zpqknzv-Z``fKh9?R z23+ozoH!WWq&~qmrW)q^y0q(_+ zzW@QIKLn0&WwxB<@{Wk2j@M$aKtZOEwHR8Xk2BwghyLmG$U5N5T3R)_ioh^M*FeXO ztG!s}*$D2t##~y8D%iU9@DH1Eyr=n#hQ=vCzazdUA!yA&Y-FHD$mIhTsswqX{KM*? zI|;p~tF+FPUU+D5Ob-h0m&rdMTjLi+E8hTc?-0v|f10++%94x@Qs-<-=?7lKK)iz} zftVU|1f}%-tCrKu%G{U# zQ@%$G(-ZZ@C)Qt)s%Nrg`V|B_d_dHVeFIq^q<}q>``3?*gB=_Vg)P7#@&s_q?D=y& zU9n9@+ZRlG8U2a=yHU++4Z7vMxBu_^4PmRLUs zgH9;}TCs1sge?jREQ-*R88@@&5X%526@6nGHIr&V8kfqehn$2BdLuf6RVN zu%vNh-(@_{BNPq<)nLvy#dYWnl3-^WA3 z{uQ^04+w62LIDbul$N4(?#Fktxj6obV4o~R7kz|12hp!SabX?s)^pf^)^kd*3|la2 z?mpyy2UnpOLQpOMsKG68Qz3*$e{hsnm)3JW$EB?q-SYwuPt5nQvy;cp?9C&eV@Urr z!Tq5V3jZL%LrbIct$dOj*~%w#_v_e|kt>%NI+IlVK?lwR0UNHP3VbHDs5WWpG?Mtx zXT&scbBVNcmPvTW_V7`_k8qbV%-(H&uI)GIZ`XS6bp$c)N%9ZBA?Fa&=oJHy^)5v1 z1-U3i9-P39NOQNOy48L!iuy-e*f`Q{lc*9L!VH%itBnkRbwFeQf3`unwQ(rofe@LX zkFzSWzI|kZWf#AZrQRq7C}8vql^7d58$NbU_WyMuj#fRe3+y2TDDm^9gY}Q_fh#fY z?0_*WxJy7kZmg3{(k7v4<>_<4{92SqoA$O?JnZxy0Eb(4e%nhTqN6iRsGymglehS+*AEK zZ{&T1db@2_e(Z*16GYm$%X#Pc_YVC#GMjc;Q^JqIJG_U%cypm&dEMz}7vt6WbSGg) zn#HrcM@cyGQatg23m#c-Sk3jlVy?EzZb99ox*XZv#kOGWUm+C3B!R+!BeZtp!kn~O zeWtzMAv_NBh-us$X^i+b`NL^(*YncoRuKXaAiM!?aJ#TvO8x4YG zqdj%VIhCZq2i)UvWEqE6(c8Z**g~s~Iv|gjUh~Cc8lZJv%a##U#8cC-GWwcwz&i{} zmV5!iD$Tfl4Eku|Y(g%hy-DBSPOpvDo}RVKm~gQ|%aylXkqhC zGNh+&U30)E+zY}5mJC@_H@GnDH{K5zOmafq)+_~(tr80fR!-!q#1jnloyB;R$ov`$ z6}vrE2b~m@BlpNB5*_vaxo`}Xtwerxm62Y^0Sw4K*f<}EpL{qpmi?R~wt1AEnG6-& zw<48y0w>yTlZli~v{cI(NtQ<2?n8AIs;C&qChI}` z1_^)ChSA(eBI`N>_a=y7({g9)d+3EN@bB^ZO>gNF;{P5A|LlE1?g48NLxsZpkAG{? z`380NztKAu6anmi#u)(-)CTl_qgQe$cj*6EJJ$MZ8i6l8?*aDzTYGG&ACq5lUKb6N z)c<5TSO%yUnEx*9Ymu}zf&~LR#Q4v@`^uppq%KV{p|z;6L)pOo$KUnvLOuVFrt1)f z!iM>ef88XTW95Vb1A|QkCnci&Zx;Ft6GqE-DJY@;fp!+MP%YU1%_lX1TKOL*OBTU> zV#M&p$-4gUg!?lI3OQBM0_q#UtU+os18=*`SE(K7-1FpF)sDFAMOj{`SqwQ*z)2D+ad$7x5O42@2G!5 z^H+<^ZTD)4?R-l^dP<)sPL)xVzLQ}V8t^GvruS3qcs_#I!DIdm%DumK5&WPOx;nsl zk|6nvG<3cj6TH0>vj9*3v@Pq}J=FB$2m(+D)OacTY)B9V5fj9Rmgc^JT~btq=z!H z(JNK41(sZ1apcExG@GJI^=;+wmtzgi(L$8Oz{27?$5?!dyP?tgJztwnI#3xoXKw{n zxr_?^S2hV#wJ42lfP*&1vEqd7PP$ff;<~gjWV{f%B4FO)C#!6v>AFpGYQ{pHwoOdN znZ{kGYZ%>4sS3a=<*R{6akFq_Xpm}~6eIe4Y~o5(SEnB1O&NmvN#SoDx^-RyN%awx z1r-LD3zv_0?XhC59c6mxHjE-IO0%kmGESQy$2;+|?C%33DwW9vT9IFOLKOwGVUr!} zpuss?n*5a>M?b7e&EaiX-7Z{{0C&(dKH*VcWo$Bw7tfVT#yS}t+`?kr%h~--8QhvNkEETd6|+kwQ=^~56!r6% zK;^&6qkK%Dd*J8egO0q3eO0l_A)63IA^p>g&64aB#bRO%^fV%hv2OqI}F zgae?n2O9hkY{}0T)HChpchXawhWZ`s<4tdJJ(>Yc_Kn02Ns5AfsK(+}k|2v}?$}iW zB4~nEI1NZLy(-sTKW8h7JPS7V0&AMzc7MMx1JshIF~C~IwTHSeoh#5E9{!V=E*EM& zUaJX?K*yh9{dZS2I5T)aK6>Y6_g1o(86VK!;lI0;Pj?#ptpaPtu}Tnn>%f!dwToqOQ2Nnb6^$9e5r>`p=#zd*RVO zExDQwKPQarSod%-Am`~A#dazSSrp(*XY@>Gy3_7h#9vQ5&i4ukRxF{t>(75#eL9Yb zA_zHj8@nY=Jubh3FtgtZ04bB2ha#bYnKHB|$1PNJ%&7em_}5n#f+Qo@$(=2)C69Jt zWN*)0e_or{ZXs6MTqejNgrBLaOW=N}Q>P@bxK5~pZ?_I6UoY|6>R8l_BLxV!H@7rP zDuv{bHA}O0#z#sTDM(-wvl`qlu6;qXGF=?pwkGR9!x_`X>0Pg%yC^%p;gTdMH|3nB z0LFK1H+R~wl3JR$mK}F8r(n7OZv+Z(o2nd5N+$?(iL%nb)?9Q-7psWFQ zKO2kQ7KAtK=11S0$3(AQW#hO43u&f6V#pwZ=VXqS`IxpcbCqLGY4anbvM??Pv>AW@ zyI-9ug`a^>7MQ;+i2*jU-f+anE}67s$j!|f*+L0TM8Zt=?Yfh;+f z7_4*I;r@k?H|4LIZABXSVVsxHH?DXV8qDVHLY>vkCdAlIo#KNY`cNC(u?EAi!}p>k zJ75+=@ns7LxFw^{C!+uEij}8XfQ*cMT&-lJ(y$aK>;!th4+HK#mLfX=>&|>iw(Iw4 z#PAoGGZczw%CR3;Wyg(<*t?7veMbCqXRrw+Zcr;##~xehDGo#+nw2aG=j(iOV-|e8 zeKjk+%8iX;D_e6Lno|cPN+d<3l~;@7xuW;_p>slwDnUjyW?Js^K7O`1OLF&)eq)@eq7*K?a=vyj&i+4+r9vRnr|b%1Ze^UWRj3rHgPL6t2qgjV9+ zi2X}xCNY|i?!w0Z>S~OIBe{pgVH^6hb$W`fKN?*`XhCYSpM>5K-TT>!gmR&EZ9C5YRIPwL$x!aw?vq>;)b! zxg%-iAAqxlSY+{pbQlje>_n()3Bwrx!-G>w@k42s!+m41e|1jXJo9{m!+ln2g$#=&4Fw7qHUu@B< zLTa*I#W_wDEsXbk_ddV`%G%kRAh-O%LnRuOX+SHP+B9KwuhAmbZ%#&GM{C}-#A67v zW9WD*Q<2WHd@_97q@<@W<*j1Vr9w#S)bBn}_kBhMpaQTs-C{a)F|FIiM$?k@qiOUl z`sh=8X!>DYYxusPLQ~M0%KDXk9B6zt&ug9viLL<{n^5%@L;MyQIE$MGu%{Ya!(PU#^iwA19dMu3rkG~0 z;cMrJqfntu_{Dq}FCahNQi>U~?N0~=2diGSc{Pt%?}%YzgS(kp9K_Ko@zVz{W%|&lbynrLreua1RAvq zu0q|wOCg|3iACtwg6h0c=9Y6T85lBkGqNmB+UiI7wavA{d3wE}yqk0pL`%ffcTHV`m#2P^e zU9+>)*Q|0BsqUD3V&b)6b(m0yFQzBz-c7ZDh~lMV3`V~M!IfFtds;acln2k=-D2M3 z#WM!|LP}A-Rt!Sf@K%H{E*V+=5j{H@8jV^WOm; zuB%*nh|ThtRs#FO2j(BKkVUnY{NN2e)QQvuuCP6)#v$Do4&-A3PF$h`V}}i+6L}Lj z6MSi|Q!3eC8a+5UIc6sotSlw{&Bu%{NFmjUaU;4fa(*erQ;Ts&F85vze%;dV+zft! zf|Ij2r@wSw$XD)v$vD+@146711J@R4O=`OBPh{`SfA6izkL_9&P0psC(KEagy`av; z`)Qk)%R>kb&ui+u(D^kL_f*sv>zH-$6u!~wHW3?lvhZV8M-`=Ar9fPwB0LMUN=j zj-lDdQ-qf8sac^#A*Zuf#`l2D!$nk`7qYI6*(&ew;x&+htWc$31BmJUcQMI=P!q`E zJ*^l(Mfce1-#4oWi2OWfE}xU3Vth}Mo=fH(<~TEQCIp)9#16(l7uwn;M*T&F-pSlg z>fWHk{P)EJHc86Zh~1ODrdh;58VhW@rE|JhE(5+zcZ#UN&`}Z4BR1Apo(TAI&gsD_ zm=HPPh#av?in#ircev%hSh0T#S;$z9$!36TE+UkCof<`gh+I z1-U^J)7g$jh)SDp%Og8lQ`9&_!X5&@PA)3j=b+QYI%4FqS{Y*&S91FnM$v0a3DUA9 zA=c+Xf*EVlP!xa3s0?X~M%3aT268wY<1q{Ynm-(3M%i|E*hM9;Mva|O4%t^RA(!kc zLyyHSTbZa&Cs*>{4J22&fAiXC-=Zi33bBdotG1W#THcA{ZfJQwI-hIX&I?)UVWU=($dO+PZ|Y)kU!ewfc$r5@)8RUuYJ+gWn6XNJeKPHO8+&T%i94TaL{ z6h&v6JIHQ!y3eRV+<6YP#U!p4=clYy6wBUoz#5dPjFpx_!xGr5;WgTNAenyNyKCZRAy z%3`tGt4*GZeHS}`={huDUY_dh3^t3Gcpd8@gWV&MtT>A?X5&-uh>*3#hKav#wYsg`QUR;STy?w351+czFxF4X$laO}hj{&nBX`0J$Y zdTORE3z(n)@*Z6@8vB~->1FrLOtp6pT@*0e{K}zA71q!m4?J+vom?pSpDEOYYwT>~ z-cQ8UJp$b`Jo-DJX*&+9%3=qJ`rh`uaj6lg_2P_K>eR2t2hj*OO=A{sq)5aD-Cjkv zBcmNY<%iH-g?7#-xlzt9p|Jjzlw@L1{zBx#(-mU@V51i6kqMTcK|E~4rDroydvsN< zPpz}b^hFYwpZ&1vVS%ZM9Tb*8AFj9R!&1B=Ui9Z#R4rd(;?gBN5CpExop6-MK4~|b zm4&`R)3Cbq=@dT9tgG)B z`3sA_n1^zMPbJY3TE8b1+QbCB3XHVxFX^vtiz^)U34*xw)xSyJhB>;6sRo-2Cv)4Z z09#q;J!E66M(&G;iZy`C0>2cy$AJBsl5bv3pK5j&A|yB$SLfP&1#M@$GcQ2NBUlpY zBxA^fX7Q0QQpaudyNSwtL7Kp|JSR%Z4T4?3cW4M;c8J5dWqZo#5(8d+gjV{flqPpL zfi2hH*^%VL8JPmf;L;h<`Qwo580>cv{SF7$#}=9N`3&c2%;<&Hp#m@InUqQWW|sR> znM|<1I591%Y>!6Vkab;HLX7LvD9)l+$}&guUv(F0O8Okwf)q(Fd=r`8V&`XXtlGH% zsR*kvywa}X7~LCu9C|5tf!1IDs4!;TwjNN+?Bd-03=BIp6onc`lhdg03)Gg9eD1-a z0UK}YbkS!m1HG%!JHLf>un{G9?;rGmG8;o00#eR7x1&ww>gvhra!r08-Hmo)466*K zj|agjLeE(F(+C8nfGEsh)h@?N%)&*06OV=>d)I*0ou)6j^v&5>>R{i^pyR)8>ZBBm zQzZHgCn_k1O^zB`y{k8bNm3)Gb5Kfc5gBo|KhufBrkO9wocU|46Yu!N+OZ%-N~)-T z@}24Qil1QMDbzfUecbx|J_$elyEOSgC+Lm7%VD9NS}JL<;KDF&_K)6dVp9#koLdvu zKx2)SZM~Nh_TN}H(}vyZ#BX0`k0Kbhu9#Liy8R= zJL+ukv^9Fq08Ry>~*lF7gIO z7x|D6+L7T%WSe*Pl1&l#onD-K5X3JD7l7qy!yk@`eL>okd>g4F)1oq{;cVHc6xPiR z&p!9}$Kqf5+M^%WMTaJ@@88@T!ZCf6r-T*%y;!=8;k(=D{592{h7-n{i)4YXLhn)$f?)k3O0H4;h9SY5R$1)zgU%b7$u)|3$03e#64(H0Vp*`!|bEl6^h7G*%kKM zFGu{7T}sg3H*5+H(+K#|OVE+n{`}YLA1C`LiLXYj9odmJ{QlQ&jgO^bC_UV z<;8=y2(kCB%DzQN_PX=VU-|z=u`gBzpAtTQ6Yf1`F~Yol>EcoVOfC~T?kQxzAW1cx z`~ppQiYPFv>{d#2kGD`%{e^SCTClj88Im?+Blo{ot8ujw za<%HJY~s%AU6i%~=1jt1?*xd_cAV07eo~Gne;=n5x97e-zsU8ch)!`UX_|>&vl=Ag z7`{T^mCxPE&f7Fs6=KQPH@i z-$mDdRpwBbevyg#$KrVdFFkgawc-oRh$dS*UOrW?w&y4Tv?m{~QdqXkb_#Gz=F&!+ z&UpU$iT)ltv#&uHs!t2atZQ}6m66-?_sXF#6g+n;^;=!I)f*RGPvXlO%VA>!N=;t%y&DRJqhelv8`ZSLQi2CQ!}6bL48wsOTWe zHiapad~Njb0@ACCnp`QeMO&2OE(`Fz0~Y5T$_q7VKxo;LB&q^PPEaY;fv_`F zf`3f-({~B;s0`#Xy?8j;Nu7T;J0?wTyPPn5aAi*{&GGp1Wy9L~34SIqZCjp*`o}Wu z_RO_B$+oBU6v!r}GO53xu(`qMS6fVD*`Vncm!EW;0-)L@?SZxnE3Vn?an+id)5xa^ z?aJ?I4jRnUj|&8@h)8!;s|6&d;I19SG9Je!HZ$Na@dn}^XOylrtQv;#B)*P!q{K*b zt~lStZ49QlpZC+4o5P8mAF8QWF!oJt+W+Oel@#Xn;6NY<4W^-gzn zQZeEMa82dDhl6K!9c#RAPE9k;KIQ z6Tpno`n$tgfjy4xtGMNlP7bUXq5eRppkq&hsy>RjtHjCVsz%*}bkq zD!NTc>ciZ9T=I1KW@&@wnUO(qZU3=mEJhBs!D=@Rt>q7x9~Sl{s{5hK@~_Z#)Pt~h zOFSEhkSibO|2*d!^t{KP+;!`dgDh^d8v#Ez7b@kt%k7JmNQZJMHe_|IyGW|@s*|~% zT>d`P3c-e5s;LT1%%8pUR5d!8BOXA#JU6hf(wttkbc9MGfWr9x;ltc#A@mVvT)S>;!M+1Y}7D^1fv%>MqB+jomR&EFP@#1^`qjT)! z9hsBYaw3D<-KDf&k{>4&?k(7#c#PxwU0}>5uU*7Drym5dG#BMd)%6c&nx4hG=9Uvg z@Il-)_&81QMv63A2*MVU`E_Rt;sf|+ZtnEVcDzA%!7_dXj}|>9OOTZMz7*n%l9Z!? zSZQ9Qi6jBadnYwE5PlGaPi1uZQ}a$BRCN)(VJ2RH>eZjWIGekFcET#^#q)WuJv_5cZN@PZ+c0PtvS`Dga~ z;|3QR&-(I5gu4V-s$kP>_BK4>3VS70Z?9~taarzJ*SsnkSl7^7P#AYBVW)EFtBH-1s0J$~vwZ^hX7DP1qT$OpAdQV=?dKNYsW9XtT_^>{E4!#ES zE!kUOGFN6QUaU$3)VC5%vFS!uLMz-%cbN0ge^R^aQ=M~*iw)yNF{}^XF z@0an0?6d#*-!uNS@V=(y3~!X^B)MowVJ@nA;ED7~OpqP3C3lrrq;>+4MfwG<{sxQi%!nA0n;+rwnT2V8 zh951#iI8yLrcvP#p6dT`^-jToL<_t2Ol;eBGMShY+qP{RJ+U#dZB1<3wr$&UviDb~ z{`37+ebE1=Z-_&za}y)0bt9|7;)>w=8!}@j+Er-9a%V_T^anKJ zFHn{Z8?2t$ZtD-+IR!WzCM2OWyC&@@PF;fTzW!hs-ON+R8Wcdm43pCa5B^K~_yiiK z^f8QObX5+;YL4{8B6?|!e-6((1J8DDkYnF+V-Ts}oaZc3fZ}u`0=zu~RFyxhVJ%84=&Qwdymh%4LGN5si0;kl(A@ zgA2B4(PX`4#0gKgY*>boAp;8!YaDTZRN&mQz2)e-Ccg?Ci_x=CXkbz&^XygSRS{_M zTL><{$&{<&9)2hvwsUYQL1ae9h)LY}YXJh%t(= zpPt4Cxa9(otPz4?S~XkPzD=QmAm*RZs+O?s*llMULN9IRM>Jh-ki6qI^-`|hi10{G zvxr_XXy<=^{|%z+vim_y3j2)p=Z_p*EMgyFL(?L}=~Uch1>0-sc1x728DlUH#SalE z4aQYbzP^7cKB3J7kg2uIa&V3tVi?{Vr1g-u9U)mj5~UT`{)fI@C%?_N)c_>-7=Hvf zet4U-DOz{>*Coekp1(V79^6@L9w8pT#{L;gR6X_(UPu*b=9?3bj!ZXGPj8p9gvR86 z9ACSeyZkom-XZ`W{=Qt3TAyUr6O11~X2Ev8Tr<7E>5M&9SiW;)yNmJ)oy{L}ZRrW} z+6p-Z=m}8j?Zlr5ZQp@c&uYWs2xbhO`MJPfSAoM5o4er49m4ZO^s{j zEbH4Tj6a%OHsYO{Hke$V{|wXc`>*oQoysX0(5YFucUAV_T?upNLeslcKH;6;n$`7} zV4tug^Sw_P2Es~aaMgs=qQ>gu7*_oy-e8KZO1z(V8y)nk31nxNr<3D_?|tho42q)S z-n}rA)A0>?l%ln#pO~Ou2h$I8){UA2cNacXrb@sN=THebokwcu+9Gs@uEuiYcn{eK zuv?i|<(wHJg^mbMvr*8ognY*EBX64jz#EWlNzAt0gQ&Pvh_3;D>Tj#e9i!O0qbjyC zssv2+QAzPad8fHEn>$t1FxO!-U))S|Gqa9xWj1j@Ca&EG*NTbVp{#YNN;_wqHHS%T zrTsMc!9oqX+EQS$#f>Um8I>ixw}cu86o0puvaNoT{cR`Ec~8ofa3#p^&W?WD!4d#i zH;Uc%?XaXweUoC^9;Lv>EPw|IBkjz`$1GqxlV%jeu05|?%*S6cSBnakNa&|bhd^Jgqwf&Ba-6Wf1jG4IO&DTwMiJ+)Q};DTC1 zFA5M(6HFp1{7i7caqJ@XfUI7H2KP>pbWhH8WV@yc9^=JaBfTd`DqxQ-aC3;;9FXwD z^xHJRKh|0I+q|oeI=W-G_GJDMppFRXsRX+-k!29yZOw3s2cK45!HW}kN3$;46-(N0 zM!8|MNN9kdJ5s?uUWyoi7-xPBw2(N^P!!jr_6vY8A}4<+?lNs%lH5%G(%86iB2P}9 zt2n|ZgZu4DHtoL2qWimRRC3_hwnFE8n@DUbWSg(+eTgJQz2_Y>f~z2P_Mtov0Xyrt zEBUgz258wcM=*9G3fYlC_6UXziiX|6cOuNwdt+WZPQ28c>G0gS%f7Y z#EkuX{Q^ucTFbuie+@~q4d~=ElJ5k79N>2b=JOl8<5;hT zDYe5MT;h8P;R>lv#m8sneX=xD`sWg4PMEls1?l>2$h%wfirYb0g8I5G;6bwSgK_Gm zOtG@aZNdq5wOpm2r>TVb;H3Eo9qM-&VStw}UecjN0j3-=+?G)Mi-qQ3S5D$P-fV;( ziOMId%|7N%766Et-AOqUbipLw;-;J}9sBy?pA6vMb96~u-CTX`A`kf-yqfKLMm*nr z`g8c13i)Lr{)B=a7}D;~Ci?lAP<(CXO;(aJ@sGdkhBMp}I*qT_ULOewhIc zBHoCK2#ubM;FK~e|AZ=NPh!vZ7_ns`4#Fgy0wqnC=HFm{v5=C9<2C;ykra;>E@hoc z(bBesol^l;QQnHd(&BmdhddhPzo4gUmj18&GRoOyBc3T-f|#Wzp5a`xcs$zDMt|Oy zWw~J&Eq?+auzVS=^AeWc_v~a`hx~pzSZ=wTJXGR%OxK>pNg?*;@V!xq3FWmJoy6hP zgz^k|Jv2XUQ@CbMaLY`U$N|{u;F6d6ZVvCR*KexNhMj@I;TNow`Noz8piM$V}1~O!L}BuAJ>!MWs65m#!#c7@Psc_K5k8cl_?V8Jkn?;7vMDW!9TS zZ`O5hWY_byl=O-C>X;>cZ3MZVOI_Hj8N}Sh0dM@p;R8s&xrdU28>j9Mh>AZ`e~FaW z!W}@L@he z0pkNocLr>{+kB?|G!EzRYz}^xQ*9fPU17%!UleLP5y4DY7sh}RxFU$_&{2NR9yaLF z<;06Em_B=Y)`^28a&t&mAn0n-$Mu1Ue`f#QjOiKkC%a)GFB2eHJ_#7PqoA_{JWA+8C~ej8X{We!6KPB zYpfzVM~qW94??2?YmuudT)tqaS)L@HS(f9eA~9i}9q=e(t{493QZ@<(O)1I$eUPm8 zccnLEV}i`Z*Ip|oR&K6&XZ)t^N?50=eL~{Tv4Rn_!?yiyLXUfs<$I=-dWCswLoqvm zDX@BoofPjhBWf#NEByFVm(m@EL(i0%JmvZABeQd0Qu+lWJ++@B{wjV7tcjEXJXj(DyAd9*gK~%sidwM{G+3!k9-#a?$jjzrdYk{ZhV; z*e#&R5%O2?&9uHN=5Ydo@)h|1c4<3(vHS}81w**LSbi#C|D&mnO$NhChED{82GNmA z#!3Vu1Q2;_+=g67TtmifwLbnYvCsNH#6I{WVWG%4>q|~E(@WkuH`C64&yFxTkwY5$ zKjQ@;>aY!)5;NxP#lqTX#>=a7cCsJ>at-Q(b@!d!E>MMrqmduZLqm2|i~|F@?F09N zF@?1u8tvdRZ-aLlqeRcTxhj;`2C*9f67JIwxSD(jq1V(sFF#D1pZyVqpuxf-%^3!@ zC*bR+PpjIOYc|=UMQOb?AD~*ElG*Ts&sM=Lhc&#_GFu2-MdX@3#ad6zSBnK`j`756 zC_Z0?&0>@yt$^;+_I*l{b<7Z1k&Jc?g_V7ESUkNz-RYGB1+``z0&}WkDgy~%2>qCg zz))j|w1RP5*Se%nc}!J>$|%(!{?$18%~&y8dV%szEqgq-&Qvj%kKMH5=WhW!uOs6Tl=>|o*dYaX8NZ-Y-7Cn97WciA&>mVNau8Wid9S%0YM;OCI% zVaA2<$7)bFf1G#b#lHLbe9^I)inYhQokK{Ir<$w5hg^{4mZ;l2aXR&IPh9$#R8 z%hcnh^lE~#Rs@*`sZ$0n7W^&5LDsBc+oR%>bToJnAXpI;DP!q*0ar+BZ;Xn2p~Sol zSL$oL9~3U_i`2H1{rDhIa%-sH*tx4lwm(37_re%?>OV_!=|8fZx1wsoz_np&1l%9> zT>Ti2{zcR6%wO!}ihBfRLgNryf7Id7dOKTshfm%)A-FWt-V@k=hqo)9xqmb~n9^Td zYZ;wVH2lxbOr+U7nsN4n@I}Zq8_~1TZ6;N$@RB!r>k|Zcue5mC*^MmZ@y5ps?rl!R+&-@t}qrDA*`MU zGTUua6un(q{3eJSf=*dOBoWq$lDas}37Q3f6aS72!lGoT|H#PP4NGi8V*hGMLcL1Tp%!%aBuVIvijU^ZO3y_2BTdqb6v9hp42o^51b^ zxe+#b+KIkis=!Zn6&;;zT!$ZXn|Cu)Qo1qv))z%;pHhHCA;q_rhs`w$>zqK%cOG0# zh(h~$Q2CNixteUdKaeA{8Ow+T8DZ1n9bNw#YUAi}Kq=;s z-J=`w*ypGnK56c&2``IgjdnpY+x(csOCR0GU00#d!rR*Aj`mtU95%{`dxiq!x?{tu z9O)I+H(P#KhbP>;Vvops(n<_7u0o3GxW|&hwR~z`6r9XvdK#JDpSzN|#>g*+SXx_^ z|A>~`ZomaT!ayYzOjU%kE&b<3|DiT$i6vGL;JGJV&Zreb-|STt zVr7pfdBr!yuJwl8*CiKivVhPhDzZYx7Su+NspyiG5}k-K%kJ^~;*YHOjU5L{Hih-V z%V^|{_;YWTU{_RhEx?qgr`ygMrw=?0RUY2{JEq0N0*)DDc#OEOv`{{fDQ7P4;#M7T zUsyjoXw;t-KzjoR9SjhMpyR9hPn!NQywjOJAutbsSn!2>1;3zPU3>94p3@ZdiWc#Y zF{>};Sp4j~hJ?79&3eQdiENC?rQDv=)TQ5gK|e}pWZE3M{_({FKs%AH88^$`X6#IqMAG7S@EnhCxjQ7$2kBSQ-(=X6zhI&4$=llu2*8Gxhqv;=!@n$PCcDD}6XKL^rC54>491*VXF=*% zFlec6GP)j`OlblGeI`^h3Obt$Q@4hOBu#;G9f1oHMW|fm8m;lCdqa?0>uy&qPZ?g5PjpYeJa+Z6J;Az3Jaomtwr+O1oB?mlt+^YY zcm6)$Y`E{=@iVb+K`U_H_w|RT91@-Va^v(a$m?5b^uxDsXNfEP8W+E7;OhOE_cJFS z0hqt0#K+v>4!@q_`tDnVKy8>L^QU57cVsa2&M~Fugwz|)gCZChb zHMGAhQ+=`OF9{c}ln}cpfYxZqcj<}Ar@a8fX9a5A2TlHy0{IS47V6m=@exJpfqjbj zc~A0i%UV5#I7OM!cP5b{OT$yB;Q_9s5%O?T%}(iLsXLS4apf3|v~kr9Cl=}@gAwgZ zwL=TXR5_Yvt5W3{8hon)O^0l|sYPQy3RYj15y1!b0s=LvO|?@;Adzm-IE+EcB-PU+ z%oA*WUQ?u6J2`n2X5iT5v_`Q;xA3uJ^@oe%U#WnKnFC9Wv!S}#5`wdNqYet(`DM`u z^VylQdD{_+hD%eKs+j@}#zGT4=X~_5dYt?=Lzf<7MwByU8NV5uRODRW)yKRvdhdJYy{@7Gk+u6Ek}Y z_qd4_d;e}G>qwRUtYp6{xfRM=9&4`pdKt7>yebb)zo3Uejf>@s{Qvu=}746zp}^vLw!f~AcEl-`>W`o)+Pv2US+8Rd%WgD(>RTreS!3Z zyZc~J;&N{6XpvHJK&qJ;NBXh9W!MI_D(GO+imZh0Ph?1bW*<&;#Fqq-qOyTFLwvDH zKIybRZtau_pnI6_`eC%VMs>^4ykRrYH=@sCyl{!7x{xpQmuC&TStxh+D4IxkRlR_o z$hOkl(S^}~RqKtz4Ih8}q2`Ol z=0;aylVvoQLN^y$*-^MY57KuVa=&0jS*C<*$0pVjY3*1PU>6T^4Ixea@)qGw>dQ83 z+baau;*KzQSJ)=#6!=OZZS z_pNb(+_2J8&V?W9%)W1lh`J%;l5qksf9l(2Cu8T(G3anmB0wus!=!_nN=pkNgf5-> zgcyqU>x+Xd`~!q4I&9Z#ZbW*Q#BYA`206#?RtW}-T>l!IDI<`xa|mSN6vu_LzWILk zynBMBmeHI$6dvfxE-KVxOBpCV3R2cw7&B+aP#|J-ZUzcFv7XSIH`Vz!w3wyiRCLt zrocdS3m)NSZk)vJFeb|!9eNXrhUFl3RALd7qlsiHu&GUUF~%{9TAQgtT0&Jsr(Ajj z?)ym_%S|A9<35DQre>d~?WwFsQT7LKU~9eKl@6zZEb+6~czgVGKUynJ32*OVJ>6J&;sgpjrs62J1Ui?jzu^QY_r1 zZeZ_-Xc=OY?sTHBsrfcU=r=aLmkLe5+G)L%qntKx2QPF)LRx)XBWJ{;Nbg0gCl%qa zwx9Un2f#l8^se0}smt*gmxAqR2O0<6jG;q8H=z8!E0RV9BR)fQ#62UYNNb0wx@UDvI}LlMu1zV`qbKk-E1 zPmrYIb%LEoZDo3c&;N7;3l~Hrj(E8Ig{N>;ItUhasH6BP)Or9Rv>P`~W+5JP&TQO; zH@%-j{5L@j`__`xJHK5uehK^5vwa|zeOpz?w$~=OU18IBTc>#=mK_#ylg5sD|H83u zI}KW{DR`a4_zfY0bw3jg+O8Xr0exJ+X`*ZRaZfX18xI=XE=9G{b`VQ(^>ZJ=<8O}X z_-4g>X{Sy+H#{eu7+3>lXTHd2g&VeGQ~Ok`*S@aIrrj{)en6V{a4aJ2fRAuAlb$gK zXE0v;oBF&d=}b4~fv*rjYzL`7$sJeDU~J6j5Zp_%cW*4@L9^eRJzplE{~OZs7D-MK zHQpYchl&#JrNFaYh*x%$TE=rBNfx#!28)a3gn2*Gdo;H0)&*yy&ILXTx1+Cwq^2llOrhh%&){7bm^LburgHaQX@VZ0ew za#YPB%f8hplU}kN)@=pAW46umnzF}$1rBQ6QtA_fZunT19U6a@a?X|%*ynWFe6Z7) zf&!s!3bUvd>B>(qHF0c@F-BoxA*g@{;U7Um6Vf_JQ;8**Qt3aCf3fbGAU)+6*=l|5 zDO)={YA=MQc#5Hd&E(_2K`mvIcm_s06!$L#p679qfpAMB48sPnR9{%1o^5qfQNjn< zSe5FcWUO%0aJ6tx!9^0(?LKYZSO1>NfVg!<((0DZ;B= z_l-S#J8GlgC)C)_t*tfdERGIUCg|b0ansTlbj8}ACiM3jY>%NuQ8ZEIIpEV#HUTllvext%)p3)hx7XoI*LbVDbw zL);;2u#}AptZORIMEj0UFKFT&EZ}Wa|ITv{2#+)JVg5J@x{$cs@58&gY0X3v<2wvD zGlOYuB-a1JJNmiwAo+B<85Z%Y!KgSDe{JyZ#qGRdgV88J*(Y7JoE!NU*7wQDUqt13 zuCQ`@SAQrgtN+ERM2VdC1G%}Jrq+Mf+~rk%Ypypexax9W;H{5%;#bhClt}!e_~B7| zx#&^jSF;16(4m~RajG`8Ai~!LHnSsRSNB}=2Pvm*2V+2#ug>{q%$H%MDBTvP#!qgtA(lZxBjNvKUv^;sd}Jt%E#w!>)fxZFu32GjNFR z)fkCEgtV%Y2|kql^&rLnjhkwKFBID(GU=ejaHR{J=|`AA_DEkhE;pfpgK{a4JM&dB z{(~c$dOlWUYEHIodu^XK<7jtWv3!hKp5;GNR9ux{RTkgH?-`kNAeldjZ`PPFrb?$7HM**Q({TtC7cQ z+SLN&8sw1U`6cOYuZa2(rQ~=GN763Xa^s;j6ZhpJucuwi_HEWhCO<6KDIfA)FGqu> z#$z!vRjwjkoZ#TN8*zuOIjE6)rV+czNuQKhEc-8ac;Oh;%jqF{lE9e9Lq<%TYDH)v zM;v&ZCJ4C)@<0{XaZZ4~R4^#F=~=h)jdoExC)-$r(e}fzY5R5C&6&A0+aCHUzZ&&kR%hLMvX zv%Pm;ZJsX7mX8!~3=f+!4;1~$V zG-9z2`3@`F%@Gdrn9VOR_j6uVM)#X3|DivqAl$29UP7cs-_v-oc z1uA@UH?MJyN~Hi=iO|?VKvyj`m7{In zuPf6rDv~nR<!?3dbKTIM4-z5`!Y-2z9LG_Ij(YbSleZTB!IG!)B>&!qb$27$ z9(K$7+p!(n&ftuUVNh#@2~AKD%V?}8#j+!+60hySb-ki`c#*z2F?6or`_=Y3&v7lz zRl&G$T7|sZoA8lxOE|#I0miqv*BT+@0$Dmqs;Y+Bz@Vrlt~LJfgEK-hXrkMTwd3{f*_hNIJD+gA4k8ZVw?(s~$w55==-&^-IuoE>yHu+h-f@`K9RO}sQ zHKF{?yJ%G`9h5Ibr&W$Joy!3>DzH2q>W&~%F}s&i2z#>0UyH7^!@t5!0w1J!2sk77 z(@V2OZGI%Bzhbv5+e6TT`FS({gVUwxe{d;lP`sv61&32&k78EO>}zV}7f7_ADuq=+ zV}xDDLZYe#_kP6Ob>VZwj}HBryypwo+{jz%CaGyW`htQh~C$W zLgPWcQy-nnFK`NYru`Dg-x7A(63izk{F9aAmsK3rDVP5q9Q+J>iG~<0PJJ0y>Yfds zfjCPxg*wh2*ZDgkqGdo0b+e0jJ7#)cMB9Y-(lA?q(Pi6qa*Q%W3uY{dk2ZpLa5Sb?N%;-Eq2YCb@fVgmO38x3geHO3D0@4BPUI`HxzS7aseMs|J+|=Y> zl1Rsq9A`GnZ;2o+w?h~0&M?{ACCinN*yxVuNlZ>a)drVsx^e@7;nRO&*~W53FS3qRHotH*>sp!$>r$G^G_mQY=0YB1+nZ|%zrQUtOoE7|%f{HG z!hiiO^ID@?!#!hhc+ek;IHCpQS9p;;>K*>Zg+CLaX2(^@A zY9*gylYYeoZEIxRp1JagpztblGFRRTKi#Hf(`4P7dTts$Hy!xgUw0|R6UBD_3x*X!o?6a`4N z^>iwx#g${Cq*e_wHQ*~s3%V>@DjoGt{1*SO*RoE1f-5+WKWvRnYLc3|C^bzZ$GaYw zwr%_K=&4vn(3+`HB6?!Z`J9z73U}%rJg(TqKx131^-ZsUHA@)0GtkmI_2!tm=%F~Z zxhp)=J$T??NnP1DfXXAu;nicX!j7reCxYXJjrhsO8;6gm$~SZfdnju#hVvEG8zph%r++eq?5YA)QIk4>iDOVc8$2=53HJ>n_$1N z4IVT1D3Y`{OGO)@3%O@Qpqxu@j!%WyH-H7U@#o*}dE*fr%h4B2MZp>|qw z{?TYai#r+IziM^>C-+L&+!1P^%L&OSjJWLIvOX^dH14ImCnr%PE?@5E1-}Cgx1ipB zm4di8Wz#N;M2y;HLvzY8@u%&W&!uma8J^r`#2(D=60#5PsLK*y9fF?7aPH{Ot2*vh zr{o3Q=SI9@!gmdQ1a+b2!LK$MO;!>D7Cp##M78Kh++x>cg7@uGXz2qVj4E=Y>7kN! z>YNI>r!JYH(=;YsixC@`S@_4?&7Y%z7UU<&+W5__v*;S^qx9 zF?Hnh;ND+nPB9>S-@P�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®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 z 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 z z6K?F4kOpAFSU5;2P%FQ>G=lU6gYe|7=&`@z^mb^X#SQq(uw{`4K4mJl!%0gESE}F7VuFa z&B6~)6jw3E4&3h1?{j+XDFU^K_(|LSITE$bY_WC_>k&PN=7j5#54hfGT>C4;rg3?> zUTk-gg&y!E!Hd_83&BPzNMx*iE>~8eU84^_-b}xUPa%5|kpwz0yUlR&Fg~Q&!=+n(i6p^CvGL0l`sEakW0lX$Me6WR2ZwKlT_F5k z+2OETH21Di&%2g7PRkaL%WaYF_2o#cdQnNe^o;KNB4f!dx0c+NL7x=NLGz9SY|rhr z*^gy|_0$ft@UwT|2;LrX2wx5nK|PzApAqk5{Q@N>9wY}qAKVQPgV2H2=;%#nn3sn1 zY>bSE<6_jsjZYONo5mO$=FCEJ6z=8N#0?#bH6n_%r5pX2YPd$BsGJGW7$3e*ikJN% z#_Z7qnt}u1LkvFcf_{GnDnX)CCD&os*W4#z)`v?ahBY7L3%>-{m^z&IZLLltJv$=F zh#*ajSUKfSU2SbyC)KRU9Rs;h+E0D44@wZS;xjQ&DGI@K

ApclXbyN+?0d2mnIh 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 diff --git a/plugins/svn4idea/lib/svnkitsrc.zip b/plugins/svn4idea/lib/svnkitsrc.zip index 0d48d754443ece478c7910c452f00fba688f9b5f..1bc2a1918888246bfba1ec850c5796aa57c3fdcd 100644 GIT binary patch delta 370246 zcmV(vK^2umm4ou=@yiqZ!g1Qs z>M{0j7pd`b`pP&tK0Z5y|GYOwJuhX38_m-PFJ?wJogEp583YD>I5A?Du=t+Mj$jZR zXSDDWBat76KL`Glg$bJ(USiBxGL3)z8~BSK8tH-=b3b54docWJ_pc6&hlM{~;2@9D z+DI1BI+z&?@16mXDf9377%MMMjc5*EhrwrllEQ%N)Q>{IHG&~i7B3SV1nGN05*gmT z=Lg;mQ1Vh^k*2GEzJ8tDhj)H@G>w+81;C?4x(x7p_S^{B1B;D&7AG)nl2LyXpQMpj zQIY~6m_*DD2=LN-G}ic297GubW(yzoW(NoWJ{lX*iV#2H2EKl=@}_s*Ei;X5LlPU{|9@WnioaRecN60!eKR?zK*|A# zL420HBEC%gB`|wT{;X;1CBz#mc*;YqhtK%1$^Cj@wZj%-y@AAg>|07{5vj4G5Fx}v6Jub2O3v?0=a1UC>Hp!@@D{&|GV--1rD4|1LRLOsRW>a zs50`S`|?#`3_8R3>nG!irO0qa#*S|O&8Dew3rrQ(@IK$3BSVgYvNg&N)y80WB4dyU za71Qw0+DZ5am0VQQI0}q;sAt4x{l!({O4bRAKn@NH|~Gx53c)v9m&th-~RCJkYw(xyX_o!z7vp8| zC$H3fJAz?f;?CJ1f^S*;l13GKhri&wy(|m{+q@2fB3Xa@Riq|XFCXEr>`!7|PLNMPxaf1FWgS@#4oEaVAav!N)Crq;QVl zle6-v!e8oouGZ>$aw@M5Nb|qim~r7`ID!qm3jQZf&Dnp0&+2(m;VWD^*l=3Z;!25O zif4a2#-e}P;Wo|YdCv7;Q{ZyMZP3L>YTzrIyla^YyP270gr))B;&+8g1)Bj>cp$YI zjR<1XTQWI{a$NY7tEMWr8fIJIzUm2Yi1}S}28Frclo2jXnQzyouoFb`Zx9pK?G1ix zf4*|P#{@+Ut{B$?f{D;H;V46HFS9?^U?kyW+&hJUvjGdFj_xt z4EbT}P+xl8nxRf~hq4DXBc1AwW|=a)q}m!9qfO) zT{F^K-H|Tcnvve=j^tRwLET{QwFfin*z|ahp*rU0y5Y3h9){}<+GZW^x3rlblwilc zysR5f`v{oB-k|o7YafAj*9Ok58&3Na^lZ0|bz9n}pk2EO+Q$HP751TSIPJ5bD$vqs z+J~W}u~k{CeIB+j+sQts!L^*)@w9&rL(lA9j{9{ia#DL3UgRpac6=p#A=~gHGgxw0-|k;chJ!)33Q5sWI52Rw7v2n08eljXE3jMP&k4pg!3j$4!^sj1;0b^J`^#62 zR|08V+Fh$}_N?6)aM~Bq?K+`cObA}D7NN1zV4f!#4fwd$@EsUq_xPvT_%pETvp;<9b^0$ys>r2zO8tOZ52l= z7N?Kguh)X`*>YTa&?okoTn>Mno;li$;|<^tv1^{M<4G1Hj8YyZou)t31dU~My>)bQ z1k4UZ;E(53F2Q!(j@30s_GfD{G{ODaiTEub9(w5leON?^zTk4nWjCuTj#|+-(Ck8&h6Vj;!^hO^LNUclzswsa{z6W4-2%P87 zVDrPdf4h#k!>DlMvmgbP2n;-NhgRFZv;h;aasvT(oUJ8gs$;q7JSdQf_$Oc2k5>DW zJMK+B+5HAP-fEHROV%q)xB^2?7i@Z$te1uqG|!82XgY2ab#YQ;fQ1)(Ad_OuFfQ1) z40Ch6iSDjB8aeg_#b19e2jl9+D!Rp7arQw&uBQte!AQMZ!%KN3Ky!(RV}fbmqQW-& zZ412Iue)jEKK(pnLFyf@?rwiY8ME}01Opl#>_?L3BBT)l8CkOW?Lh~i>_%`xoC4x1 zx()q5fmLo`#d z@7nGNT{NrOkSoMiI6K;~?qT95DOz%YA2Li`BU2>lW6*s4Vcd)%8c=SPS>d}Vw+D_h z9yXgZGGR9-mhgX=EKlc4Q$=sq_HScrf<~)5vA%pX$FTmD9H_uR26QlYu%@CQk%2=q zHqoIzw1;32IY7MLi%{qy=Uv9$64zP8%R^)3uP9rcM$;(JChu4vX`4|;)6ikyIVhxc zC|*1EsOenakRh7o>-El)2pz)N{sMX%wiLMQvWjFW#>jt9)i^hM@oQjafP7`%vhh^K zsF_Hs6)YR%@o4qDfXgvKmgJl+?Q!3++Jmb;W)+%~-w^T@2%5p5aH|w5b;gJila*`F z{c!X{L-@=DtFanSUQo?;y&>V2y6H%ls=&bMScjUToX3W@niXpJn9sXSdUK9MQI>@| z3Z0Kq?@7)IeC2edDm?x6jt+GJ8N zoaKKQc%YFmV6LBwphNsSkBI0{$33F}@bG*fBT@Rd3C^@nIeJ8Mu zn3nNSTtOv#RR&Bo`BVyoCG(i5$BM1lkuiTxD#08XLs@c(;^_wX@WG2`yeud6Z~VXq zHYKiwu?}G&40CAjwFVs4D_EgLlIWMMZKx@UYmoQwvwfq9jBt9;PKny-IX zhiP=Et8%*5qaoZoQ&bVt) z@U&~UE2HQtm{T%rmn^w)E$dy7rYtsH`_OBX1c*ms!WpWmDyCQSA_R+9|;bhRCw67bm zVKI-8ZLlFP#)zGl%(0Q1(G<)RcVs%ddEw-^AfGAO6(=Y>ZiT7thov*4XDWZXU|@box|`&*(980WZ8WIxC!6QB-NZRMIWNu<46Erv@d2MU4GE;B+h$2w z(Y4(M3`uS*35vjnqcMwEf~J23Id#tqSn3(rM|aT0G~lIacgIcx4njHGmTD))idwoZ zYRo-Q`?KeUJ^Xs<40^hD+X+hMO9Ci7Gz=R2hzEZjN6Q~cTjN2j5=YN8m5fio`uf~p z-BHB%z>UDf7{`my=|aFX=OMgh8B*@x*>cAOt54pB)wMfY2WSW*so(jb_nvK^76r-H1^ajmk!Ap8tK$Sb_Vs*R}h*;}@rA0%Km; z5(>wkJG;r_5^qaB7gm3gbA_-!SYD%XWhh*QeZB#kB!-C97OJ0+`Z{?o_~YS~V|FkX z_uJTZ8icY=-&FBL$QZxAdc(liy^XzD14Z*4u-jeB?1N+895#iMFybGrlY#+`DSW!r zkG=;+(!6@`306krWXj{VFUZ~^qpAL9N2#pxIkq1;on43E|V37 zGA_1CRa0aq&`Wo6W%U7JW&Wa2$|*$o#UCV9~lSu+1v>u=G}S;*Q%Nwcf1dTkz@8< zvt8#^DJb4nqex>fOuQ)_a;@s)0u0Kw?F8^n-S#Y~AQO>PO{N!nQ+8trt_dKi^)VGN z?^Q5G2b-Y2`Bbn&RE==+Hc?UwSkZ4?!**`px5iV#3u~c$G5B zLD~8tVtjowZU@_xELBi;-vOhTPuhV7#bO^MP7%u-OV}deE0qO>HV@RKqf{7g8^X{^ zObG<&)^vY))jXWb-f++d0ks>_I|(WG8eq?`H4|zq%mRWFA8M&ft%Lbq&611Iw7(Q* zvA8P8D*ISM^(8v0EkvcANJy>E!O+WorkFF}T)LZdOI?MSksA-k1K5!lk<1e#jxZ>p zk*ODZG5XRcD7#^tP^Ac6Nzd4!C?^qtE_G?TG=zU}S^*)mUUcbi%UG#oQBd|UVV7sE zX6u+cdCR4*MHS2g5kcE6Cr@~)taKs&-V6O?!IPK#M9jb&N*@>tsaHVr1g3zab0jJ9 zJBocCjuZ!yU#k&ka(}BOug!EnS-X8Oisu#zGw(1Whn>-MN;A=HfD0In4i^A}N#W>AJ1HPc`Y!;}2|7~{a>R?ol?6^dB z1}sK}LfZ6;_8HROO}n+Z(n$V$jKXGwPc{kjpsyZrS!|0qYOWTlbWaQAwwJD4?&oQR|Br_O)Kw2(@*zWhstab76Fk$RPve`%B6UUjCD zeN(FZ(I<%+RHQZ;4L&sqYoMs=;-N{SJ4Wo}hovi%4fj`v>N~#6K~7k9(9 z#RC)g+NAqbWNG5*#6vTvE?_EyIL+oBr-fUQIpf~2sfS&vu??%dw7DljelvexdUA~+ z=6w`$A5O2Rn~zu&VWP1?6Y}RJDOTVUQ4y+%qhq`1LxCK%%uz!Y#S`4|6ZD)E1at7~ z*Ku=6&c}uSk1)Q|vq$-1X?A|!W*H_~kc^GZ54nR&2WKBFq&qc{ysJh+R>QtH#{GSe zyst(gE^8FAGz4T$>~7b(GP{3um!t}Px$>?s_}RQ0jAI&s_o!hzZFV%=MVRC!wafPZ z^eRfEnvhibB<>=3QgC}bg)mlyL|TL?2HhKWt)A7dxj3xQKIKM*Jb2!8%92FTC8ITK z_pP@8I}AAm!h_Dp;eX0;A{)Uvr1^r_e56pHY3knwpI7DwzZFL(>`AaOz=)x+cGgnyuVU#3&D4 z-mnCVAEGdLL`?xgfY;Gs-2+8`qdA2`<*q*SoRC?zI)ut3-m45pOj>dav&tUHhV{Vr zt)v4;{E$%a9pq~B2~dBIv@io&ag@w;vydOqRuR}u(M4@#_w8ysO6|DF6@^p_LR6!s zz}EUkg8ZH8s|=#xfFZ-L6aO~0s_TL`z_hBth)l)D(P${|x#+?XD7Go^GMJMh7(sRq zWrl+eh8ROczx6jA1gAv=Gk=C<(&81H!hIhxI6YjV3k=(d?Z|&MZ=gD>-lRFBOS!zS zn6GgaN)XtcRNFvut{}m})IBf2i;-oi*{*I@8$gQ1F15YP&Lu{ApO(_ z@o`z~b)dr!LzHPcY^s)-vu|v=hSPe@Zs21^Hli++-Q6}efV@|dIw4E3o>DKTlZgv= z2xrQgd<34fu*rXAr*FB`?vjcE)pcJSd62;&<8f82 zdBxroS@CzE#WzS}TUXc(7^ejosEb}dY&Jb=O1O~-RLP$`i3r3oo1Ivd`uUTcR~)y{ zY_t(|x>$ck9RFIJ3HgrKQuGYbJE@{mv}1KJPH27xiBVVQpf;5jf(xIZ3sXF_B>UH4 z_J&~NmEhxoe-3K&v)!pq&z6a|cV`<)#m2rUB!nHE)yin7Wl9j#!NEk=!doXg z5t8D@kUwmGZieMl*%t14C7!lc<4wQ0AJ|8$bsK+M{9bmpu;rSF6af%l^v951IGbtI z1o83pFtiHsB3>xy&9u4UcNv!Gex2wLFD4!F4Njk0D(neCHP@SvFWv)2e*9Cl*0t9i zvyV-uepXs{)C2!|7YXFtxqVti-z~jeAk2vSaOThFTq4nPlVUkkTeL9_*|Gpz z7!7}}o8f4cao`T#YT$Ns(lmDSs4+%s##@MH9SM~7KUv6 zMlSDYFuAN;ANAb~&dKJ=n=Y6PKT}aLT?2n6Pic=jB!MS0xyFv&1WGH1a!WO(%gp+M z5j3e|t=VULw4>i(83JioV1#>YsDz?ruI2jk;n3K^mLpxeUoFl`M5$fAmoVxTt6z{L zhRZE|^P)DQT_(*tE3DS(>u8p~q^U~ryEw)~LEWNfOn2<9bEO)`$#G`*2 zgZqPmo-x?~i$74|%Mv(G%9J0)P;mKwG0H7|2 z&Uo0xUhbAmVArHbH^3BH>G8+JL{&DwIDw-qqnPoA#8EhHZlMTDwmZ47`zCgJthvXr z0SUQ#kX>2LG6dl4gQbMGfqm-Jt#yBsL!uE{NHzd)CmqXeJNB^dw%Gzbf&NTNb(?;jG)2c0>MtqwZgfozs0vq2#xIk;k*9UD&z<)%YG8x%F1i z2C}z1wo(5=kdy>ju}ocirVT9bND9a@8Ga8&zzKrrLBsPZG1B&aI2$+wYGld!$;av6I-g{O-yd$pzRIh{=? zEm6Rc9VxAQtzta%47(WkrH(ga2NXy%>Qux25E*%UJ9%*UqwMPtw$0P=+2!dL_TKhV zmc=4 z*xZk=_y1si{efZ#IW_nDHs^I-o>#xfGU7!lDe3(G(OgCoo=605qGve`MI>J2RHveJ z)x(#FsqLcl0%hcc_g;<}_Pe;vEvTn2KM;tO20oJkY#VRFpY30>*}i`*&(<`Q#y(Q= zVWlk(VAG2XenM(C-{RsWB&Qko2vBAq)thj zdcQHW(e^T%5+b@1x<_G+a`mLXWV%G{EzSQ?xO!N@PP5Ic33Y!5`D0~jH?(E|Y-f81{W8%O70=7=EyZ42ynp`9THX_Hj3HCYz!6s< z51PO@$;!mByEK121SC~3a0FNs8n4t`+gFnz7ErY<^5`dSBbMN{^&@yasN$!LUPsTX zJ`$GZJ+k!D*cmTutCTFGp_c`6UXZEVOeHp_j?b}mn~9;8yqs0r#Y{sfaLb0m=Y!hN zN*RD`0atuXay|z<#XH2AplYu9GtYBdM7a!xH+GYbr*?lt8B95J!@03q*DSb9^Ie{` z=C&wBR`rwB@_AAno_n7e0Wd1oZ3X^K>}_7=Df}lhpP$%`;l?Rh#PphC;|GbU%Lwl@ zf$>zdEt0Coww~JUvcSGYbAC%8sEm}#spugNKfIU0A9_p`_}m=Y&xtn+6!piw3(L`6 z>dx5x(_AIE~-@030U@ZH(Q~~l^ zccUQjIY40$ZqV;G;l%LSS{* z*W2YPX}o#B!f1WFK&pv;(-0W3Hy(|tvJ5<#?%2gA+Z)lRxY0UYQ%xCoGQm2*n=*w< z^wPH0L4(hKpm!jellG-B@I7pHYSx*Ng(eA@zo&nwMI|T!h8)=dx!7GNMwLl?UE1?-BY<(CP&UWkQ?UA7e5zkQJ&5}B)Mjul{SlM;J{FM?Z z(O$gx>&1)z2eX28iY*Zvn@2#4^jAl65&!^>X8-^#laUY|lAr~XKcf(TS##S)5`MOR z#aO9LD2IlQ-ItAyjpLOQRmpP7R+8Fsxl#}@6k*}u0w86@)_>pbxiBXHQnX*zQb`-{E-%Djv2>!d`A}e7Ks=XV7bsaPR7Uqbgf7^XDn|} zgS%Vvcybe8Q&LvfQImt(Pz@2R6qZ@h!>z3}pO+xK_aKl6M3zO*sw%!a2N@o^@1B=g zMkmOn=jC}?+|VSG%%l<$e!n=as3^?GpSX=>c$s~*G znm9`)AGe?{VS>T-gghg-sfugBHoz5Nzo_|+WlW~Uv_$svxVm9`xP1z{^NQlYqAZ@K z1?-Hp!F`7!VWfB2zk;8-i5vLm4WH}f>Fb|Q|2(^R@#@cuR~Kg&f4`i*KD&JO)A{M2 zZ!TYhbs)!N`^okpBfzOt>5{EqU(nlkB)?;yYOSlbw&xW^gn-gugE~@&MS`+GLw_Ml zX~T7+6s&h=whE0=oKrw@&20im7(^u}11T}HF##LWREtSdR*`%s|NW7XKw$ucRnuqU zuPOm|VvnRnLWqAPf4-9AtWlbF@VWdGfrF~7U>~)E47E7`8f7I2i*Y$7>@&ZBH7*F^> zDTzmZF#wD|irMZry7G`cb5?vb-#w9^FUp4gK#nG5LQi=2f1_RY2g7_(HURK>YYZt0 ztD#~d@Xde?Fxy~3@|-3qyvpvzXe&~8T3yh!1L#`NG{nAw>_M!Yjt)d=FTlWvNsf<6 zv49BYU&K|+-aGPx=qL5!Gc&L0Jc}nl3!$bY{_)2Q{H96qo|ISb!Ow!}1osV6y1L^= zgFjZ15tax!e<}+Xp+~!Or7sqOfmNE73Asf%7fn?riwP2^lNdu3U}nCkAcUbTxB&yT zq(w?$`$yzAc;9Fw3=SqNs;UuClNlEmE>U`OX4I*QmpEoTUY5g0QsztT1A~Qf0S48X zdp+=Z(ScO0Z+kAw6t+BVxYF0bhog6k@>y%PMmI3d`Su% z>>a{CM~bH?qs4VIgNNULZ;#V?f1AFGEY5U}4()LUq5CcKQwZ_RqAJXY$&YuTJqzxR z{R)7>HB35IlM*PSMattFz$qH0JB~&Si__~AG0ONG%a|OYTnXmgZff4NscANiFgd_j z|277V6o9ddr&LX%gLBL>0U>~It|i`{)suLra(^KXW@O0V>&z%0GgehjXZ0D0K;qFV z2IbMCN1o^f#%Y%25PLBtL9R36;SE0HICv!Fn6acVjE`sYIRt&aXof}6JeV~lZ2;pL z8|Sw;7=p84DdDLM($FGz5w*)`otu(@fqG}C-W{p08>_Drtuv=IU(_=mUau9Z`+cN< zn}7Mz!V&qN?7ur~%>{={WpsH8U3|2HsX$Bb%^ld#JYrT2jj-~iW3o3^h8R9tY-uF= zy}QST6^s0eR*ntp+4(^e6CmePCvICX3~$oEXqO?D+qh#b&u4UUQ$rd{v4Rz_RkIkq zX?La|S3!>IIbeuY8IHHH8gxVNZp$j!K7WDSmmcln>k|xl{ByxGn$MfNLrGY*5;?q0 z!Jmewn8sNx=kN(mLA*Z2Nd^cH(}2A$3BH8cYa_<+DV^0yyI{f=f15(DD=IyeRzTqP zkUMT(b7=c6DJP`5^~BrKfdzHgxfFjq?bef$#eB3G^P!oJb)(<`-b?RZ$;Z+jM1O2G zZKr!1HO?ZKvleND4?arhYzV|Fx20b9V-X53zG2$|{@EM>E!OtluZgxf06# zepz%7W2I8)#lmkCm{nkGGeXIl#(x7^7CBp--NtvdJskZDkK~xdCUGs&+IA6K0BNmz zqAn3?A*m2sz5oq?^y{)}`1X(M2`n9{g9)Qm#H!K)R;FRRUO*rK`ruJYMRSNgRbo;| zl8g!@UO2VS>-PUyzA%p(4debmoBY)rpH={Bj z!FtvvVRK%jK$9vJC&TaV0s&tLvpw1_=E7^F_hQux$7flM&x@&@ZuYFEh%~dRyk!;j z(+?BM4s-^ZNXF90eXbU=Lwv-w!hy1c#-sP@fNETVUjVKk)~hQ!FR}L zU8M#612BIsACGj^j@#}cP~Hb)4s(qOi=;eLf^&5rzPBIV6AHtX;BJoma{J=E3bsCy zO|x>)$BHWf7fq1gjo3~`>2q#%F9cvi1Gvxf@v@-PI@?EVcO!V zsbWX~k{yCj;R@5jA?zi|LQJ{9o?{kuYDZpe;GCq>DWs{qR5dhF?TPm+{#yZwh?d95 zuwefRY;t%!pF-$-rj^xLlf{uhy-i+Gf4ah}A2&Q@f(1?{<)Uc%LQU0Labeu4iECiC z4Ff!pq$Q%Z#^+hArxwD+_X>K6Byi*qkz%%|&J1f2cS`G_sR<#a9Xjjy z@S=^2UuAk5z?q#_7%)@$g<1#8F@}QcOJGZr4airQ_b_a!5nZXu!=a^-V*YG6f2x#u zTd>2ss$5*pSR!u}+)~Ty0C?*7t{!W}PyIfKz?`VX3#iDMfWZuJIW@Nwl)~%%NKh}| zvxuq?#f!2IS5C$Gwj8EDfTpLgO^|W37OXTrxYmjRoq1|v)E(1ek}VRkjqJi}k4Tgv zLZwzgn;$yJ!8#(okfY|wh>-1xfAH2=MMv$)YlIM8K;Ejl9UZs*PK%`N<#X9Gv;ol% zcGwK*ot6^j#0^s0hLJm4QBu+12b#(fcAW#mdr3tUt_qh5JYzO=P^iX_zX$rHigP{+ zU3HKV&|^)+!nRmS0hRaTj~ z+aXJQ)0VlVVW~APZ2r(Ff72TGJ6KQH2K2v+I74UPVVafRi&i{kk+pYK&^9;~a^+=2 zjLh!#s?dcQ>pERhAfxU`vaXV7Lcu5TD;g__m)Gnq<%$~=>~xW4G{?)LcD?g^<@2qn4fm@+)a6D%9Cy{z6We=!ZSw%10*P(9bq z`eDiKaXsf1$P)O#&?j&o$1nw2Eu zmr~S`UOBa+8&l(Y6m=i0h2&~LZD!ZnOkGaYxlLkSqSP`}f3^g^Ol?*(5%+$R$bp?z z>(nMMaKDEgdfFT~ z?ln6NJK)AgIMEqIa>wN9erOWNB^vru8CS_E4>r99?&p$wY1ir?BHy&Vz zsJO@2>_h>we`m3FpSv~ZX!5yKhVJBD04sIK5%vWrO(>2?`CzwitD1%=bd1D4b%4qW@!oa$@ zQ%_dir~|Acw(xdv)X#Mof9L}9FvxoMYY+lq1O#XMa%#oqsur8$LhH`DVfAN8_%MN%w)xd1i@ax9qyZxQebunyyx6;X_GRo-r9*gab*c{UR4nUzN%;T`FlpKkY=>?f6T) zq;KM!>eo=5A-LlmE9o-}t=05}+{Z$EZj1sJB<~t$(Ct5VcSO*20`KzfsbS~dH{r?s z2x1*}5g;IT`IDBjVHwBA9n$Iu+QKq1Ne;?#I;GQb9wV0B$I!`>5VXhwJMfd*v>E}e zll8P@W#2M2hFBaANLcTK^B=4}zx~rhq4^Jd^UL30m1BmT0P}0gD!2`Oix(Hy{wC!K z*~9cg`@P_|?MwWvPjBf*eP7G-qZl2e?CULls5@UvG=XoUa&ozUFwp z^*^(HwQ*7pYKTTanT3W3?JfWST|okuVCVxMmtC_Q5`XPo`*YjKk^bF(1h|$B+%3I z>i)XFdF=h}S@65y?GipH=OCHfr_uFI9(4LU!K>f@{*SxxKYtD`Pr{r97s)Wc3sV++ z%m=+7*nc050(v+LQkJpwmJNC!1m#@bL|Kr@$Kl_jsL$ez4T3NW1}y8R(G~m=#X)|< zf?+gb!NJ+5zaO7|=mvK;QU3;o+$Yl@yGf>_L2wh^GAN|aqFXLw5~g{O4B>SUK8Ug$ z1WxlPi9xSR5Sg=doS_gbKOALA5Z;E-D7=D_!hbxt$@9ridwbb!{4L6R{bal+6ztvP z;}O1hJPcxX$I{@Ir5VW0RB7T#k~~SW929~|q^wH{kHh<5ioc=|Lju$m9u5axQ~(}L zgJeP)FR=sno=w93xA2+;NqXJO$Ixro3q7bP)G}qgyZ-BE&!X`pf#&-sG)XT?dhen6 zUw@asJe%f|X?~HXEF7CZLNkwg`)L~9e}s0o{C1FxMy!ujv;24xP6`biN*-VQ_4H$M zeH7>E{jXs>7_szq!z=K{A)DkkEuK3{(8Ws<-%vB}!#`M@M}PegYk3mJFm@UnJBnd?#o-7>)5||m(?`SM z!6*VjFaI>l%RiQ0{&9wvU*WW!gn94cHpbrUH@=%-Y3B^)Y?LR>{e(pvgYdJff5K=! z=fgy zGI;G`dVS3@UYQFpbbXe!eDgAdS73}k+xwmHBP@7x_0AY2Z}zU<1^rQ&ffq=V+X&oA zFlPBpGRVNvkCMA6z7Fyv072jxhC?vTF=&9|u2_D@SS&3vdZ3(*v!L?=AAA7@S=4t2 zeasyL2M7O!2eSZ2UOa#|hDnN|#(z*bEQowpKfzz~j7&NH|C`A>{LimY_6yJod`2eR zmAyVMiYh?c^l#9~U5Dr}PzYQO9s{_?+ve|`>)A6>_9pO4rumyZqJ@!I|+qH4a`gKzX-rdOgX%wPBN z)KbpTKK`GhoI!#u+SxIRcmd;!#=wgu$iB$Ke44pR2zGZfIo}s8jV6w*ARKfHO9wLp zX5(*v`H&Y~jt(N^3Zjen_ka)|vb5zforAL#Eaf*A*Yy`sO+*(9kALvqA2y#h!j zX0$Og0`?nDI{NmPFpK))>;F7^7QkncMz4v2trdP~EdNKd{2xo@lRd-_Vt;fn3+c2Eup8%m z6i0akUHxx{f7`8PLM{v@c7B64LrTgftRD>{FgEEl-p!*iS+ZetJ>^!A*`vQO4tN7LC+2!Omelt!T2T7Rv(2n_TU1H6rfF@(Tk7*0pIqc&0=uK^D;f*cgcgvs2^z?TFW z%X1Ky1;aEMlZBOHK>@JSQn(aXYB9je0YoBL*Eq=ovc2Gp`ZoyRKwOe(MReflK`;gf z7!>;b=VvhE-vUHuXT1F$s3XMp@b#C2&j6(#cG`6UcAx-uGk^$sUL=I`zf7`N;mV!JT{5`YkSgn$9vGemmyh!_pSWEu~u-S#s?v*9?C71j>W)ZvIY=QRpdu)_<2jN$J|J*Z8Xdk(ofvot+-M zWFN7bwwexZDb=F!`6qW0sfwzCNs^3&Ebk;X#z_<%_ z0vm+X*Y@1vHUbP_1sXmr2PW+v@EFJq`ID71FLE_ zP)XCJTGR^$wiIW2VGt?q6P98KAb^aJFrzSXF%67gU-L#G^HU(8yEMvG0zu1D;F~bx z5=_4WIDf(Xt7Qu7GdND9PJKhAyD-Cc@K|TY6dWgnVfS{7*0I`VRE_&v?T_F z>RpRf5%Xf8KW3dBnuh9KEb)iy@(|jw&5_$A8dOKyaaluC5q(ksF6$US25;X6G#s^u z@Kbt-W`?6ZI@(Bk(8pXQ4((M`Hx(`9U7k^x;V!LH*Kh=)rqYXP z1%KHlt$eIz%Bn|nS0+oFX`UK->Wa-XNm~e8V1|B>&dKNs8GmxSZt3pe>RulhJ!8V+ zv

^eZZe3Sr}MhqM48x(y?mJ6Ku4#yF`={IWvKz&VE^{$W8=>_m=^Fu;cyq$8 z&qX6RB=8?`H1pt$YYQc6LCY{ovmA;@zCj~RC*>I6)Sg~RMnw;lUpcXAgCpJb27l{M z(+u2-JXs5zVmVe_O~#)s$$N_cY=2s`fr5k^CX#rB(T5HDlkJ^1)6qNY_oL_?Sn3fA zvs_9QVfm>T)m{0;i5%uyC}GH=U$tqZO^YbL4M*UEE#b7-GsS3DyF8M z#nnH02+tq=A<91DyOg*^ttyilJ&-m|^baLd(GHaLtP{lFvUX@(uAH?^_J6cK{CU6t zyY|TmYLL-V=N|+;$yaA|^)_hugI2Y4gDVJUSqNY0<9+ABUJ+Vm!%!X7MHMyG43&fyGr=!vUVx$uVFIlq zI$>EBB3Y}x!L=xWHUOdOYk!S;Uk<*0KE3$->C@Ty<{5)skM|J zj)BbYAB?}KdjeKQ%vB`xDNP1b1U?+1aZJLUvs~&YKoT3}p<0Ado}yA*L}RcpCoYTD z#kCnxF0!TrDc8iJwbrX4HEK%I6hNzIHD-TB^9r3W4DAEV28K%)L4VHy&;5@e$OXqP zMYl8$)-UTVLsyl-6WEc{}G2U1Remy_>>+!|$*{KzfFnlAx5gzQKo-E>4paODjHriU(Ov-3w zg#&9Qx)zRdNc&)EiF!#zf@rmSiXN`CKtrt##}Hh&I-Pa-qxR*8%nyXZV_N@jHdvev~*6+Ab>ABWf4A!>Ot!o zCsA!i%O=ld$4u9eX_-rHa@qtM+06PJs6Nf_LR&vtB|Tyi6!#l0D+SsOirt0_r9)9E znz-AL4dwON`gG_rswqE9gtf=HK(z@jD&YB-=%EW{OC^pi4}Cd1|I6{|2mYMxfrGP? zljBPmF7OC#!Wk+nnQ$A7`^M7{ySiM(DAOaO5PUR4hApB^>ndO{_g#d+U4K_>8{eI# zBi@T3X~I$vFlK|-@urKPrFYyo@y6`bR}G^Ryct6fLd3^7BL__2=`C*;Z`yc!~e>YKH9|FCAW$;~(1p zlAvLclxr&>R3I|t541IjRV7|Il*kx_E`t_Y*s+yWi&u6nJY%_`xNJQcOUIrIt7aN6 zSzW*DBn<0Nk0I(+lPKHd2_BC{T;f__dvngXi{gK!6?ljrU#&4&$aP13xuV;~5-wCf z`B|4Ft2U?il>2wu3~k!(l@q4HmjZQgC8RuI+(qwVte1xjyfYKT=g> z)<2|E`Gz)Dr_umo5|C2y3x1Mto2t;HEz3PR`J{CZ`z`F}qx+(5P56yX0j+R@uo4g! zOJf%DS!j#=Ds!lCXGQcD=V>y^5GH@~>{?3A%+EgNhn^5_9*_l7dSJh@{x`8cHf1A3 zXEC0#MNwTZ_#BHbg(%F3<@XcL6-Y688phce@%BJQq-=osbnFg1X=B3;D5yxwAb z1$ba_DdQf-6iVbOAV5XdY|eG%dC(RoCVUW@i=(D6V^ADr#|xyHTF(Q0P;cJ=^u_Ze zDaRS(FdA^esx)(|l|)2`FTk@M3x}f@cSy5AuYt%u7PTNU3|y{Q%?^fQ8jm!ZqNc6i zCn*G~ztGEs1EImAS=(AML4AL8!F>A4w$5(As})xEI!p&6I)ZMfxLtBj_mhTZUjQ%( z9u_BDk%q=RZdQcM7skOT4>$=U2{`pL_lN}wi?)?>50_@k17(r|84ALPjz+&FdJ7Nh zsb~Y?eJuY1NB%$RaKxJeU8CU+1=;qHjk&ahi)^bfiSF;zfl(eibRY{Ig6MZ;@W6( zI>|VjxVjyEBx$CVjkbB-v;(mj0WN9Z;LLpA^0y3bEcGXp-(G+2Z?Ou>&$^I*HebKz zHesIq^X%USv44hpnVtTV!jJ{5q5sNWTIc^veJTap`M;__A^_XT@&uqK06hWd2|!N( zdIIn}AONe@N?XQn_)u*NlnT=!5Q0Hf!oTIcQC(gYGA$`u!H8ojP$);s7t5(mds{8} zi!kMpahl_PSp|O}q#KY!Q;dc13WhIwJQ6DgC+%@90PL8JulSxOV_$8dIrkYg4I*W+ z@g%>e6k97mjMsT3dJFMJ&}MPcM{H2rPp3)FezFRI>VOjqCzDacudU)uqNa?VY*D@v zZ_m?137OW}+C~yB3iEV#1N6P!FUl&<6fIG^kSoTEw ztnf;+!k#)`r&RBg?0EG&{G;*kbEiGmf8XT{9QKCqxLiU_H!Sk?JEu1UA2p5%ZeY=QUcM-MUd8dDM6({Pzli_Qrtomxl<#>fDy`@1xP26gwfMpeulxLm~g0Gv)leo5hwTTrv zVRTP7QOAOF-QApnL^gwi@C%jJiCBN|3zg`zH4ByIP0z0PIwgBXb1N4rEvu^Xv&1Z} z2wGy1mQ$->cvQ-NpgbbZX$TQgJV+zVr`hf(`X*7IN|D77;EXw2RbDj&4?;YV_JT`{ z4aN|;Czuh5`y7);fCM#U_^)XM^NHdOE=N0HVmF(P$6*@%o4uI#LI~+6(7Atw0PBYN z?hWO^5cLY^w?b!bs*^_7H!bve{9K*u zR9*ngLd@>aeO^qjBvJjc_eb^MtkmKK=`ugTD02^7&ab>mi?EBDLXXKYTJ@G)(&V`e zO)qZaO9E;=WH(T^PF3&T=hJ_~qxZ+BM~6Gyu>)(WU zDbVEfYJ=8x)IhalGp}C*yt;)_JUb3vC(e29Rs+W?oh)6RWVAFqB?5mFNnJqz#~q?N zPs!#)96S;X)iEXskhPpAVG8m8BJ+&=$00Tz$f|!+hr?C+EZRJaNlu~41%^W2!_d%vWMQg~b z(F!TG3SCrIKi6N?;{JbQ_O&Ef<51{5k?Bh!kO>lydt^DYQGWuZKXbk4;x14{kL~3@FGAeE5Dx>Q- zNtfU)`KaXUErKx`ExrKfN^2&yNJj#%{4UXV0bJ2Bm)hDLzM4dGcl9;jY{$2()ssu{ zcs}LenF9K(*tHqW;S=%{7usr3FRZATk@-E^zx;fD^iZyawW7RYNp;T~)@`r4klnq4 zeokiB+MSEh5DS0ian=L*P!=8#kK<>`%YU*5y z+lmaj<6aHahSmZ+f-{@%USyv>-?sGmMax@opCW;Nv5bpwpUC)v;vIQI!p;We&|5^R zHFv}MK=nHfRNI=7?=Mt!_;xMPiY}fng*9FL@?EciA64O45;(mKbfC8)GW zluD*l1*v51H#kaloF{37h0FD0v!5*K7kPbee(uquR4bNz+GSoBk9{}H@=UMw_&`1U z{2YIale>8BqEG!g6i<`-=+hN_E?^#35Pdp)wk_NrL`7#6NysL*Y7o2*^Dvw z8)lIaVL!*4M#M8+d`Qa6;DOPAPL~yDlc)FRQ@>GTaR@R^W1g!?~?Yl zW()wyK-WWHMKn6@lQOlo*FMfG;T(0dAJ#b={hQ^V?B`}^he-0XKNBNdr0W{Rn8p)R z$=D1kiu(J)W_GPZJbinS1|tC+@JWKh*1rI^r{&}Uw@C{(BDa@mWZsmb*IzL&T#bLA zgL>oT6A3?>UIY)q{BVn7k)zusb?azrMt(K7ok>Gf4gPF`)ZEt6D-D;QHD4xHdjnbB zMPN38wKtGeE&?mn-ld^C2UTyE^~EEi$=iREU-C;bX~m!1Of_R~UIDqtz0g;#EhyAenklLa zQTRD$gx&O((2MKS<(U;HASZ1ykvq!xeMas*er2;!0CD%4%Zlxgx4(!(uy!klVA-a^ z(_A_fe1~@qjroXZzI3Sex}mW-u8?v|GG!dev5v?S!!LNAe>5JmL4-FksLOwcl$k9V zMY>Ez4LsHQ=50RiSED>DN>hPQap}*!(!gC+c@vSSrKp{L(U_`^d7)CfI@x_ep0Ux; zt&_ZzNZjBcWyv0p;i6S`C+e|Yx7wEX@^vW7XAtSVh-!mmJeU!8wcj4O46(tKAZsj)6^P+I8fBq>e1L8-;nNoo)@U5wM_ z>LgX6S#MC{9YStN8xPp-n0SzPL-EWBUOqEI0)V#$Gyq++T9_i0qsMzMVgZ1Z-bR4I zYcUL?5oQm}K~>fUH38s$Q?5V1Y^k<}5-~wkO5Rl5%+uKsRZ8SdJy3s)elZU&CLn%Z zW|&kJ>9yiQo({N7meR#NX~2Ht|8AUxLNCY<7?l}_sJ$V#B@sg(iaY~LqxDa_o4~5A7|}I9JOu_*5QYZkn=n&^lSYj@OhbwM zPjR<>#*+&whlF{B7lMB>lJx@BxW2`*3*&Il4qYxus6%%)8T;21x&bu8tRFWCS7HB~ zvG_H9?n7DZvZFoSUj$&35AjV@k1Y-ThJy zzttufnoOscoYsh&xDl)VorAnfe)XsHk5 zwb$c*FlQ%Bf-J~mb* zb^c51BHQD1d1;5b%vunr%cQ|k8yuMp*F~ov(_i+ zDk*zw{{&!U)tHY z+i=jpOw{#U88OdXS0!zECd)I|p1EFA=DL*B<3zSqGp7MIo>~D_J$u^8bJgv+YHi=N zXR6INmd8}PQt4Xu-APIp7eN$k_dJ`%Jv;s6>~w$4F(DOlS{oX364Ub?sa++e1x?;S zPTLS$gBpHUc4>Hc9KT*T-ZRoGV5BV@tX-N_&%^Yas269X+ulU6YDU_9O3|k5qZWr1 zt?xE!%aMC)y^FeZ6z=0}qSgyp${y;9K);3BGt!=s_KdV=q&*|;8EMZ*x3RXKkrw~0 z&!vA=2p_jPwGG^rLQ`ew4J6XQWF9c>BH6Ps>PS z09xHWt)ftI>EmLI^D>SphoX%$%HeN+K>7AF;E&0Ex89ZAyd&EN3YScJ`(4;RQmFK= z=e#$U^S02}Her6#bQ49r7Tc!VL?c zcEg658ES{>DoF4IHHz{CwI`@OLG1}@Pf%|rL2Vf+o}u;(^$Hm3l~B{o`=tE_X`f_T zagxc?(VmX3(9z9_qeo(M{RZR5qjUZC;#D7n4b}yjz7#wUI2(15xN_FoVZuD)RC<3m zR+ruj3F=kO0ZV}^q=I)zhnGJQ?+beVJYm-`Nj(L;MHF!8rha*E(-5@2sD?HSU(R#d zlA4@f9wiB8QKpj_;C5(W_V&=bf$G%}czdCq_4R;!`GDNBzHZjHTV_n{K();HXjZG1 z54K60V~aCMv})#Jof{cpSF<@-;x&Jugb!dyuztQ?Ot3Z(>Ozn;VTFq(e4{CKjuH5~ zAmvofTL4gZ!G4;C_aCDyuRf@U9sC`{_#J$!{A@>S1#5_4($q#{a?va0rzxo|7%hp# zEgUNKx~h)?q7K8*C4M6pf(Hf2N5{>}LZ6yOSCr#5#qkF&c`LQ2sco-u?zexhMgZEx zYUobgrlyMM-r(|vWlGy|c&{`TjL|Ja+qee^F`HiHDPU^+%E$r9?j(K(MI>NHM&X20 z!I*WRpaj$CT`5dGtA2v#q(J^&%&w6KMNWXbaa0zw=2+Ya#;>$pBE>rpi~X`BZDL;b z0afsDNpLJgC3EBsJv9IvFR6bw#jUP(ZOc<-xt9v(t&0>I@Vq{}Eyb9FToozCFAM-< zWcnnw$IR=7nO#}%4bDREQjQ|NH%tI3Nmd%>sU-U3Jhd-PT*GX$0b5!?EMd5O-Wh#} zGwrOk>W+!uXn+rcj?tRIe*tiXNwlNY4L_K+>XdtecSP`$*&*du3vGV^<(Rk@l*Yl| z@1-W(#sAeSi=T&Q)qnZaxC4nV<>XCVy(9&?u7WJ5((O6)Lb{Zv7oxK4N?=odUFspF ztvbKXTZ5<8eWHDX6YZ`u`-@{{t@mHf4$s|l%m(n(F5Xon=jXo;vo1SdBh{zpeW#!}|mKpMNdXec=rMQ4RaN#wlL zlnv3?Xk-X!P*_-m9z0q7oP(I>1n0FaP)TfULn+WGh99?pz<8)9L@|eA>}kcejp}#n z5=^HPGStSbB7J{K+njN#(iTxkI&^4n@NeOGf_PbcE9G6mWP_&5ie0cUu)cM*MdjfC ztXourt9x-Wm?npz=@c5CNn8z!O-AdNCF?w4((Ao-!UxVc5K&R*ISolW) zR7J1UKvjDZvRyXuiJ;=#7|9JVRXdpw6GzJ|_~(&e&FAxv9@ThM<5A68uFv+!1|0MEG6OYgj7sfp7gqfN1sTjo_a?>T8q@Pr%OQ_n^dVeHv zQk3_(`2Ash-i!_LIv?L92hE%}Revt`BJ4C-^h?Hv#*9{9o0Z zIsT||VWR|>XkO$94^ZMUFYO5XPMq%6o@GqIc;Fh<`Dn&Ak!sN4laia$GEK4w>Db!F zYva*UhyZ(hX=bfUGRN&q`dX$$No|X`s@hA2FMf^tzXi5#c7oyqDd^ zy?&Cio;K|91V+70Iy(R9x8<3Iy7D5ISNT7sz%rmKEW6H3FWYi%bqp{5fb_zSRw0FnW2`&NWl^%cT zR6EJ_@_WGGd~|heK&>dF&j4zrwBqg

nLPu5poztOt;U8l@o>LWVkZxn4OTx&Pb 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

4D^FpLGzb^&L@6aQ&Y8Cid)of&l(>V; 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 delta 302703 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%0DAo(&$+O8vvWLP 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

0_aT?xG->Ihkf1X6T3GOW-DhY?K>!I<+4r9;v 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 Date: Tue, 7 Feb 2012 16:33:19 +0400 Subject: [PATCH 162/215] NotNull --- .../src/com/intellij/psi/ClassFileViewProviderFactory.java | 3 ++- .../core-api/src/com/intellij/psi/FileViewProviderFactory.java | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/java/java-psi-impl/src/com/intellij/psi/ClassFileViewProviderFactory.java b/java/java-psi-impl/src/com/intellij/psi/ClassFileViewProviderFactory.java index bb7fd8e6d9de..213468b0669f 100644 --- a/java/java-psi-impl/src/com/intellij/psi/ClassFileViewProviderFactory.java +++ b/java/java-psi-impl/src/com/intellij/psi/ClassFileViewProviderFactory.java @@ -23,10 +23,11 @@ import com.intellij.lang.Language; import com.intellij.openapi.extensions.Extensions; import com.intellij.openapi.fileTypes.ContentBasedFileSubstitutor; import com.intellij.openapi.vfs.VirtualFile; +import org.jetbrains.annotations.NotNull; public class ClassFileViewProviderFactory implements FileViewProviderFactory{ @Override - public FileViewProvider createFileViewProvider(final VirtualFile file, final Language language, final PsiManager manager, final boolean physical) { + public FileViewProvider createFileViewProvider(@NotNull final VirtualFile file, final Language language, @NotNull final PsiManager manager, final boolean physical) { // Define language for compiled file final ContentBasedFileSubstitutor[] processors = Extensions.getExtensions(ContentBasedFileSubstitutor.EP_NAME); for (ContentBasedFileSubstitutor processor : processors) { diff --git a/platform/core-api/src/com/intellij/psi/FileViewProviderFactory.java b/platform/core-api/src/com/intellij/psi/FileViewProviderFactory.java index a59327bf1409..66e25e3f9ca7 100644 --- a/platform/core-api/src/com/intellij/psi/FileViewProviderFactory.java +++ b/platform/core-api/src/com/intellij/psi/FileViewProviderFactory.java @@ -18,6 +18,7 @@ package com.intellij.psi; import com.intellij.lang.Language; import com.intellij.openapi.vfs.VirtualFile; +import org.jetbrains.annotations.NotNull; /** * Register in extension point {@code com.intellij.fileType.fileViewProviderFactory} @@ -26,5 +27,5 @@ import com.intellij.openapi.vfs.VirtualFile; * @author yole */ public interface FileViewProviderFactory { - FileViewProvider createFileViewProvider(final VirtualFile file, final Language language, final PsiManager manager, final boolean physical); + FileViewProvider createFileViewProvider(@NotNull VirtualFile file, Language language, @NotNull PsiManager manager, final boolean physical); } \ No newline at end of file From 57f889295b3864e84fad961241580524e0acff9c Mon Sep 17 00:00:00 2001 From: Alexey Kudravtsev Date: Wed, 8 Feb 2012 14:10:08 +0400 Subject: [PATCH 163/215] get rid of getPsiRoots() usages since they are indeterminate --- .../impl/AddOnDemandStaticImportAction.java | 4 ++- .../impl/source/codeStyle/ImportHelper.java | 2 +- .../codeStyle/JavaCodeStyleManagerImpl.java | 2 +- .../lang/java/parser/JavaParsingTestCase.java | 2 +- .../intellij/psi/search/LocalSearchScope.java | 3 +- .../com/intellij/psi/util/PsiTreeUtil.java | 4 +-- .../intellij/psi/impl/source/PsiFileImpl.java | 19 +++++----- .../codeInspection/ProblemsHolder.java | 3 +- .../com/intellij/psi/util/PsiUtilBase.java | 22 +++++++++--- .../daemon/impl/HectorComponent.java | 16 ++++----- .../daemon/impl/TrafficLightRenderer.java | 19 ++++++---- .../LossyEncodingInspection.java | 2 +- .../internal/psiView/ViewerTreeStructure.java | 8 +++-- .../psi/impl/search/PsiSearchHelperImpl.java | 4 +-- .../testFramework/ParsingTestCase.java | 35 +++++++++---------- .../util/containers/ContainerUtil.java | 6 ++-- 16 files changed, 84 insertions(+), 67 deletions(-) diff --git a/java/java-impl/src/com/intellij/codeInsight/intention/impl/AddOnDemandStaticImportAction.java b/java/java-impl/src/com/intellij/codeInsight/intention/impl/AddOnDemandStaticImportAction.java index 1810ff8cef1b..517f21e8def5 100644 --- a/java/java-impl/src/com/intellij/codeInsight/intention/impl/AddOnDemandStaticImportAction.java +++ b/java/java-impl/src/com/intellij/codeInsight/intention/impl/AddOnDemandStaticImportAction.java @@ -34,6 +34,8 @@ import gnu.trove.TIntProcedure; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import java.util.List; + /** * @author ven */ @@ -104,7 +106,7 @@ public class AddOnDemandStaticImportAction extends PsiElementBaseIntentionAction } importList.add(importStaticStatement); - PsiFile[] roots = file.getPsiRoots(); + List roots = file.getViewProvider().getAllFiles(); for (final PsiFile root : roots) { PsiElement copy = root.copy(); final PsiManager manager = root.getManager(); diff --git a/java/java-impl/src/com/intellij/psi/impl/source/codeStyle/ImportHelper.java b/java/java-impl/src/com/intellij/psi/impl/source/codeStyle/ImportHelper.java index 840947dedf8e..c85b542a0d13 100644 --- a/java/java-impl/src/com/intellij/psi/impl/source/codeStyle/ImportHelper.java +++ b/java/java-impl/src/com/intellij/psi/impl/source/codeStyle/ImportHelper.java @@ -696,7 +696,7 @@ public class ImportHelper{ PsiFile context) { String packageName = file.getPackageName(); - final PsiElement[] roots = file.getPsiRoots(); + final List roots = file.getViewProvider().getAllFiles(); for (PsiElement root : roots) { addNamesToImport(names, comments, root, packageName, context); } diff --git a/java/java-impl/src/com/intellij/psi/impl/source/codeStyle/JavaCodeStyleManagerImpl.java b/java/java-impl/src/com/intellij/psi/impl/source/codeStyle/JavaCodeStyleManagerImpl.java index 1da1f5915186..8e6d81444213 100644 --- a/java/java-impl/src/com/intellij/psi/impl/source/codeStyle/JavaCodeStyleManagerImpl.java +++ b/java/java-impl/src/com/intellij/psi/impl/source/codeStyle/JavaCodeStyleManagerImpl.java @@ -153,7 +153,7 @@ public class JavaCodeStyleManagerImpl extends JavaCodeStyleManager { } else { redundants = allImports; - final PsiElement[] roots = file.getPsiRoots(); + final List roots = file.getViewProvider().getAllFiles(); for (PsiElement root : roots) { root.accept(new JavaRecursiveElementWalkingVisitor() { @Override public void visitReferenceElement(PsiJavaCodeReferenceElement reference) { diff --git a/java/java-tests/testSrc/com/intellij/lang/java/parser/JavaParsingTestCase.java b/java/java-tests/testSrc/com/intellij/lang/java/parser/JavaParsingTestCase.java index bd5c08833ab1..79915cc67295 100644 --- a/java/java-tests/testSrc/com/intellij/lang/java/parser/JavaParsingTestCase.java +++ b/java/java-tests/testSrc/com/intellij/lang/java/parser/JavaParsingTestCase.java @@ -108,7 +108,7 @@ public abstract class JavaParsingTestCase extends ParsingTestCase { myFile = createPsiFile(name, text, parser); myFile.putUserData(PsiUtil.FILE_LANGUAGE_LEVEL_KEY, myLanguageLevel); try { - checkResult(name + ".txt", myFile); + checkResult(name, myFile); } catch (IOException e) { throw new RuntimeException(e); diff --git a/platform/core-api/src/com/intellij/psi/search/LocalSearchScope.java b/platform/core-api/src/com/intellij/psi/search/LocalSearchScope.java index 562c2b617f85..c092c70e2d10 100644 --- a/platform/core-api/src/com/intellij/psi/search/LocalSearchScope.java +++ b/platform/core-api/src/com/intellij/psi/search/LocalSearchScope.java @@ -66,7 +66,8 @@ public class LocalSearchScope extends SearchScope { for (final PsiElement element : scope) { LOG.assertTrue(element.getContainingFile() != null, element.getClass().getName()); if (element instanceof PsiFile) { - ContainerUtil.addAll(localScope, ((PsiFile)element).getPsiRoots()); + List files = ((PsiFile)element).getViewProvider().getAllFiles(); + ContainerUtil.addAll(localScope, files); } else { localScope.add(element); diff --git a/platform/core-api/src/com/intellij/psi/util/PsiTreeUtil.java b/platform/core-api/src/com/intellij/psi/util/PsiTreeUtil.java index 9aac4bf4323d..c43925dde0ff 100644 --- a/platform/core-api/src/com/intellij/psi/util/PsiTreeUtil.java +++ b/platform/core-api/src/com/intellij/psi/util/PsiTreeUtil.java @@ -713,7 +713,7 @@ public class PsiTreeUtil { int offset, @NotNull Class clazz, boolean strictStart) { - final PsiElement[] psiRoots = file.getPsiRoots(); + final List psiRoots = file.getViewProvider().getAllFiles(); T result = null; for (PsiElement root : psiRoots) { final PsiElement elementAt = root.findElementAt(offset); @@ -739,7 +739,7 @@ public class PsiTreeUtil { @NotNull Class clazz, boolean strictStart, @NotNull Class... stopAt) { - final PsiElement[] psiRoots = file.getPsiRoots(); + final List psiRoots = file.getViewProvider().getAllFiles(); T result = null; for (PsiElement root : psiRoots) { final PsiElement elementAt = root.findElementAt(offset); diff --git a/platform/core-impl/src/com/intellij/psi/impl/source/PsiFileImpl.java b/platform/core-impl/src/com/intellij/psi/impl/source/PsiFileImpl.java index 553de3e50cb9..dd202dd57883 100644 --- a/platform/core-impl/src/com/intellij/psi/impl/source/PsiFileImpl.java +++ b/platform/core-impl/src/com/intellij/psi/impl/source/PsiFileImpl.java @@ -519,18 +519,17 @@ public abstract class PsiFileImpl extends ElementBase implements PsiFileEx, PsiF } roots[i++] = psi; } - // getPsiRoots() returns languages in the same order - //if (roots.length > 1) { - // Arrays.sort(roots, FILE_BY_LANGUAGE_ID); - //} + if (roots.length > 1) { + Arrays.sort(roots, FILE_BY_LANGUAGE_ID); + } return roots; } - //private static final Comparator FILE_BY_LANGUAGE_ID = new Comparator() { - // @Override - // public int compare(PsiFile o1, PsiFile o2) { - // return o1.getLanguage().getID().compareTo(o2.getLanguage().getID()); - // } - //}; + private static final Comparator FILE_BY_LANGUAGE_ID = new Comparator() { + @Override + public int compare(PsiFile o1, PsiFile o2) { + return o1.getLanguage().getID().compareTo(o2.getLanguage().getID()); + } + }; @Override public boolean isPhysical() { diff --git a/platform/lang-api/src/com/intellij/codeInspection/ProblemsHolder.java b/platform/lang-api/src/com/intellij/codeInspection/ProblemsHolder.java index 9d1a226294f3..8933cb6006b8 100644 --- a/platform/lang-api/src/com/intellij/codeInspection/ProblemsHolder.java +++ b/platform/lang-api/src/com/intellij/codeInspection/ProblemsHolder.java @@ -28,7 +28,6 @@ import com.intellij.psi.PsiElement; import com.intellij.psi.PsiFile; import com.intellij.psi.PsiReference; import com.intellij.psi.util.PsiTreeUtil; -import com.intellij.util.ArrayUtil; import org.jetbrains.annotations.Nls; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -91,7 +90,7 @@ public class ProblemsHolder { private boolean isInPsiFile(@NotNull PsiElement element) { PsiFile file = element.getContainingFile(); - return ArrayUtil.indexOf(myFile.getPsiRoots(), file) != -1; + return myFile.getViewProvider() == file.getViewProvider(); } private void redirectProblem(@NotNull final ProblemDescriptor problem, @NotNull final PsiElement target) { diff --git a/platform/lang-api/src/com/intellij/psi/util/PsiUtilBase.java b/platform/lang-api/src/com/intellij/psi/util/PsiUtilBase.java index 283c09222413..56a9c1960525 100644 --- a/platform/lang-api/src/com/intellij/psi/util/PsiUtilBase.java +++ b/platform/lang-api/src/com/intellij/psi/util/PsiUtilBase.java @@ -42,6 +42,7 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import javax.swing.*; +import java.util.*; public class PsiUtilBase extends PsiUtilCore { @@ -51,6 +52,12 @@ public class PsiUtilBase extends PsiUtilCore { throw new IllegalAccessError(); } }; + public static final Comparator LANGUAGE_COMPARATOR = new Comparator() { + @Override + public int compare(Language o1, Language o2) { + return o1.getID().compareTo(o2.getID()); + } + }; public static int getRootIndex(PsiElement root) { ASTNode node = root.getNode(); @@ -59,11 +66,18 @@ public class PsiUtilBase extends PsiUtilCore { } if(node != null) root = node.getPsi(); final PsiFile containingFile = root.getContainingFile(); - final PsiFile[] psiRoots = containingFile.getPsiRoots(); - for (int i = 0; i < psiRoots.length; i++) { - if(root == psiRoots[i]) return i; + FileViewProvider provider = containingFile.getViewProvider(); + Set languages = provider.getLanguages(); + if (languages.size() == 1) { + return 0; } - throw new RuntimeException("invalid element"); + List array = new ArrayList(languages); + Collections.sort(array, LANGUAGE_COMPARATOR); + for (int i = 0; i < array.size(); i++) { + Language language = array.get(i); + if (provider.getPsi(language) == containingFile) return i; + } + throw new RuntimeException("Cannot find root for: "+root); } @NotNull diff --git a/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/HectorComponent.java b/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/HectorComponent.java index f43f4e7ad6ce..d8d1cea46466 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/HectorComponent.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/HectorComponent.java @@ -39,11 +39,13 @@ import com.intellij.profile.codeInspection.ui.ErrorsConfigurable; import com.intellij.psi.FileViewProvider; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiFile; +import com.intellij.psi.util.PsiUtilBase; import com.intellij.ui.Gray; import com.intellij.ui.HyperlinkLabel; import com.intellij.ui.IdeBorderFactory; import com.intellij.ui.awt.RelativePoint; import com.intellij.util.ui.UIUtil; +import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import javax.swing.*; @@ -55,6 +57,7 @@ import javax.swing.plaf.basic.BasicSliderUI; import java.awt.*; import java.lang.ref.WeakReference; import java.util.*; +import java.util.List; /** * User: anna @@ -70,7 +73,7 @@ public class HectorComponent extends JPanel { private final String myTitle = EditorBundle.message("hector.highlighting.level.title"); - public HectorComponent(PsiFile file) { + public HectorComponent(@NotNull PsiFile file) { super(new GridBagLayout()); setBorder(BorderFactory.createEmptyBorder(0, 0, 7, 0)); myFile = file; @@ -83,15 +86,8 @@ public class HectorComponent extends JPanel { final boolean notInLibrary = !fileIndex.isInLibrarySource(virtualFile) && !fileIndex.isInLibraryClasses(virtualFile) || fileIndex.isInContent(virtualFile); final FileViewProvider viewProvider = myFile.getViewProvider(); - //List languages = new ArrayList(viewProvider.getLanguages()); - //Collections.sort(languages, new Comparator() { - // @Override - // public int compare(Language o1, Language o2) { - // return o1.getID().compareTo(o2.getID()); - // } - //}); - Collection languages = viewProvider.getLanguages(); - + List languages = new ArrayList(viewProvider.getLanguages()); + Collections.sort(languages, PsiUtilBase.LANGUAGE_COMPARATOR); for (Language language : languages) { @SuppressWarnings("UseOfObsoleteCollectionType") final Hashtable sliderLabels = new Hashtable(); diff --git a/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/TrafficLightRenderer.java b/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/TrafficLightRenderer.java index 592797f8b32e..dd89cd16c6e2 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/TrafficLightRenderer.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/TrafficLightRenderer.java @@ -20,6 +20,7 @@ import com.intellij.codeHighlighting.HighlightDisplayLevel; import com.intellij.codeHighlighting.TextEditorHighlightingPass; import com.intellij.codeInsight.daemon.DaemonCodeAnalyzer; import com.intellij.codeInsight.daemon.impl.analysis.HighlightLevelUtil; +import com.intellij.lang.Language; import com.intellij.lang.annotation.HighlightSeverity; import com.intellij.openapi.Disposable; import com.intellij.openapi.application.ApplicationManager; @@ -36,6 +37,7 @@ import com.intellij.openapi.project.DumbService; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.Disposer; import com.intellij.openapi.util.IconLoader; +import com.intellij.psi.FileViewProvider; import com.intellij.psi.PsiFile; import com.intellij.ui.LayeredIcon; import com.intellij.util.ArrayUtil; @@ -50,6 +52,7 @@ import java.awt.*; import java.util.ArrayList; import java.util.Collections; import java.util.List; +import java.util.Set; public class TrafficLightRenderer implements ErrorStripeRenderer, Disposable { private static final Icon IN_PROGRESS_ICON = IconLoader.getIcon("/general/errorsInProgress.png"); @@ -166,13 +169,15 @@ public class TrafficLightRenderer implements ErrorStripeRenderer, Disposable { List noInspectionRoots = new ArrayList(); List noHighlightingRoots = new ArrayList(); - final PsiFile[] roots = myFile.getPsiRoots(); - for (PsiFile file : roots) { - if (!HighlightLevelUtil.shouldHighlight(file)) { - noHighlightingRoots.add(file.getLanguage().getID()); + FileViewProvider provider = myFile.getViewProvider(); + Set languages = provider.getLanguages(); + for (Language language : languages) { + PsiFile root = provider.getPsi(language); + if (!HighlightLevelUtil.shouldHighlight(root)) { + noHighlightingRoots.add(language.getID()); } - else if (!HighlightLevelUtil.shouldInspect(file)) { - noInspectionRoots.add(file.getLanguage().getID()); + else if (!HighlightLevelUtil.shouldInspect(root)) { + noInspectionRoots.add(language.getID()); } } DaemonCodeAnalyzerStatus status = new DaemonCodeAnalyzerStatus(); @@ -180,7 +185,7 @@ public class TrafficLightRenderer implements ErrorStripeRenderer, Disposable { status.noHighlightingRoots = noHighlightingRoots.isEmpty() ? null : ArrayUtil.toStringArray(noHighlightingRoots); status.errorCount = errorCount.clone(); - status.rootsNumber = roots.length; + status.rootsNumber = languages.size(); fillDaemonCodeAnalyzerErrorsStatus(status, fillErrorsCount, severityRegistrar); List passes = myDaemonCodeAnalyzer.getPassesToShowProgressFor(myDocument); status.passStati = passes.isEmpty() ? Collections.emptyList() : diff --git a/platform/lang-impl/src/com/intellij/codeInspection/LossyEncodingInspection.java b/platform/lang-impl/src/com/intellij/codeInspection/LossyEncodingInspection.java index 0da4475a2058..38747fe3759f 100644 --- a/platform/lang-impl/src/com/intellij/codeInspection/LossyEncodingInspection.java +++ b/platform/lang-impl/src/com/intellij/codeInspection/LossyEncodingInspection.java @@ -78,8 +78,8 @@ public class LossyEncodingInspection extends LocalInspectionTool { @Nullable public ProblemDescriptor[] checkFile(@NotNull PsiFile file, @NotNull InspectionManager manager, boolean isOnTheFly) { if (InjectedLanguageManager.getInstance(file.getProject()).isInjectedFragment(file)) return null; - if (ArrayUtil.find(file.getPsiRoots(), file) != 0) return null; if (!file.isPhysical()) return null; + if (file.getViewProvider().getBaseLanguage() != file.getLanguage()) return null; VirtualFile virtualFile = file.getVirtualFile(); if (virtualFile == null) return null; if (virtualFile.getFileSystem() != LocalFileSystem.getInstance() diff --git a/platform/lang-impl/src/com/intellij/internal/psiView/ViewerTreeStructure.java b/platform/lang-impl/src/com/intellij/internal/psiView/ViewerTreeStructure.java index b6e1235c8ab3..77fff7a7c9db 100644 --- a/platform/lang-impl/src/com/intellij/internal/psiView/ViewerTreeStructure.java +++ b/platform/lang-impl/src/com/intellij/internal/psiView/ViewerTreeStructure.java @@ -67,7 +67,11 @@ public class ViewerTreeStructure extends AbstractTreeStructure { if (myRootPsiElement == null) { return ArrayUtil.EMPTY_OBJECT_ARRAY; } - return myRootPsiElement instanceof PsiFile ? ((PsiFile)myRootPsiElement).getPsiRoots() : new Object[]{myRootPsiElement}; + if (!(myRootPsiElement instanceof PsiFile)) { + return new Object[]{myRootPsiElement}; + } + List files = ((PsiFile)myRootPsiElement).getViewProvider().getAllFiles(); + return PsiUtilCore.toPsiFileArray(files); } final Object[][] children = new Object[1][]; children[0] = ArrayUtil.EMPTY_OBJECT_ARRAY; @@ -79,10 +83,8 @@ public class ViewerTreeStructure extends AbstractTreeStructure { final ArrayList list = new ArrayList(); ASTNode root = element instanceof PsiElement? SourceTreeToPsiMap.psiElementToTree((PsiElement)element) : element instanceof ASTNode? (ASTNode)element : null; - boolean injected = false; if (element instanceof Inject) { root = SourceTreeToPsiMap.psiElementToTree(((Inject)element).getPsi()); - injected = true; } if (root != null) { diff --git a/platform/lang-impl/src/com/intellij/psi/impl/search/PsiSearchHelperImpl.java b/platform/lang-impl/src/com/intellij/psi/impl/search/PsiSearchHelperImpl.java index d264b1b5807b..addd3ad3365d 100644 --- a/platform/lang-impl/src/com/intellij/psi/impl/search/PsiSearchHelperImpl.java +++ b/platform/lang-impl/src/com/intellij/psi/impl/search/PsiSearchHelperImpl.java @@ -298,8 +298,8 @@ public class PsiSearchHelperImpl implements PsiSearchHelper { public void run() { try { if (myManager.getProject().isDisposed()) throw new ProcessCanceledException(); - PsiElement[] psiRoots = file.getPsiRoots(); - Set processed = new HashSet(psiRoots.length * 2, (float)0.5); + List psiRoots = file.getViewProvider().getAllFiles(); + Set processed = new HashSet(psiRoots.size() * 2, (float)0.5); for (PsiElement psiRoot : psiRoots) { if (progress != null) progress.checkCanceled(); if (!processed.add(psiRoot)) continue; diff --git a/platform/testFramework/src/com/intellij/testFramework/ParsingTestCase.java b/platform/testFramework/src/com/intellij/testFramework/ParsingTestCase.java index 85b0685884e9..81275c29dd81 100644 --- a/platform/testFramework/src/com/intellij/testFramework/ParsingTestCase.java +++ b/platform/testFramework/src/com/intellij/testFramework/ParsingTestCase.java @@ -51,17 +51,14 @@ import com.intellij.util.messages.MessageBus; import com.intellij.util.messages.MessageBusFactory; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; -import org.picocontainer.ComponentAdapter; -import org.picocontainer.MutablePicoContainer; -import org.picocontainer.PicoContainer; -import org.picocontainer.PicoInitializationException; -import org.picocontainer.PicoIntrospectionException; +import org.picocontainer.*; import org.picocontainer.defaults.AbstractComponentAdapter; import java.io.File; import java.io.FileNotFoundException; import java.io.FileWriter; import java.io.IOException; +import java.util.Set; public abstract class ParsingTestCase extends PlatformLiteFixture { protected String myFilePrefix = ""; @@ -201,7 +198,7 @@ public abstract class ParsingTestCase extends PlatformLiteFixture { assertEquals("doc text mismatch", text, myFile.getViewProvider().getDocument().getText()); assertEquals("psi text mismatch", text, myFile.getText()); if (checkResult){ - checkResult(name + ".txt", myFile); + checkResult(name, myFile); } else{ toParseTreeText(myFile, skipSpaces(), includeRanges()); @@ -218,7 +215,7 @@ public abstract class ParsingTestCase extends PlatformLiteFixture { myFile = createPsiFile(name, text); ensureParsed(myFile); assertEquals(text, myFile.getText()); - checkResult(name + suffix + ".txt", myFile); + checkResult(name + suffix, myFile); } protected void doCodeTest(String code) throws IOException { @@ -226,7 +223,7 @@ public abstract class ParsingTestCase extends PlatformLiteFixture { myFile = createPsiFile("a", code); ensureParsed(myFile); assertEquals(code, myFile.getText()); - checkResult(myFilePrefix + name + ".txt", myFile); + checkResult(myFilePrefix + name, myFile); } protected PsiFile createPsiFile(String name, String text) { @@ -253,15 +250,18 @@ public abstract class ParsingTestCase extends PlatformLiteFixture { String targetDataName, boolean skipSpaces, boolean printRanges) throws IOException { - final PsiElement[] psiRoots = checkAllPsiRoots? file.getPsiRoots() : PsiElement.EMPTY_ARRAY; - if(psiRoots.length > 1){ - for (int i = 0; i < psiRoots.length; i++) { - final PsiElement psiRoot = psiRoots[i]; - doCheckResult(myFullDataPath, targetDataName + "." + i, toParseTreeText(psiRoot, skipSpaces, printRanges).trim()); - } + FileViewProvider provider = file.getViewProvider(); + Set languages = provider.getLanguages(); + + if (!checkAllPsiRoots || languages.size() == 1) { + doCheckResult(myFullDataPath, targetDataName + ".txt", toParseTreeText(file, skipSpaces, printRanges).trim()); + return; } - else{ - doCheckResult(myFullDataPath, targetDataName, toParseTreeText(file, skipSpaces, printRanges).trim()); + + for (Language language : languages) { + PsiFile root = provider.getPsi(language); + String expectedName = targetDataName + "." + language.getID() + ".txt"; + doCheckResult(myFullDataPath, expectedName, toParseTreeText(root, skipSpaces, printRanges).trim()); } } @@ -297,8 +297,7 @@ public abstract class ParsingTestCase extends PlatformLiteFixture { } private static String doLoadFile(String myFullDataPath, String name) throws IOException { - String fullName = myFullDataPath + File.separatorChar + name; - String text = FileUtil.loadFile(new File(fullName), CharsetToolkit.UTF8).trim(); + String text = FileUtil.loadFile(new File(myFullDataPath, name), CharsetToolkit.UTF8).trim(); text = StringUtil.convertLineSeparators(text); return text; } diff --git a/platform/util/src/com/intellij/util/containers/ContainerUtil.java b/platform/util/src/com/intellij/util/containers/ContainerUtil.java index 4e64bb40842c..190020b187aa 100644 --- a/platform/util/src/com/intellij/util/containers/ContainerUtil.java +++ b/platform/util/src/com/intellij/util/containers/ContainerUtil.java @@ -128,11 +128,11 @@ public class ContainerUtil { return list.subList(from, list.size()); } - public static void addAll(@NotNull Collection collection, @NotNull Iterable appendix) { + public static void addAll(@NotNull Collection collection, @NotNull Iterable appendix) { addAll(collection, appendix.iterator()); } - public static void addAll(@NotNull Collection collection, @NotNull Iterator iterator) { + public static void addAll(@NotNull Collection collection, @NotNull Iterator iterator) { while (iterator.hasNext()) { T o = iterator.next(); collection.add(o); @@ -516,7 +516,7 @@ public class ContainerUtil { return collect(FilteringIterator.create((Iterator)iterator, instanceOf)); } - public static void addAll(@NotNull Collection collection, @NotNull Enumeration enumeration) { + public static void addAll(@NotNull Collection collection, @NotNull Enumeration enumeration) { while (enumeration.hasMoreElements()) { T element = enumeration.nextElement(); collection.add(element); From cea4e59392296230796266d35412b09b1c5539ce Mon Sep 17 00:00:00 2001 From: Alexey Kudravtsev Date: Wed, 8 Feb 2012 14:32:52 +0400 Subject: [PATCH 164/215] optimization: do not recalc diff for big documents --- .../openapi/editor/event/DocumentEvent.java | 11 ++-- .../editor/impl/PersistentRangeMarker.java | 21 ++++---- .../editor/impl/event/DocumentEventImpl.java | 54 ++++++++++++------- .../editor/event/MockDocumentEvent.java | 4 +- 4 files changed, 56 insertions(+), 34 deletions(-) diff --git a/platform/core-api/src/com/intellij/openapi/editor/event/DocumentEvent.java b/platform/core-api/src/com/intellij/openapi/editor/event/DocumentEvent.java index 181072e30c89..10f2b7ee9126 100644 --- a/platform/core-api/src/com/intellij/openapi/editor/event/DocumentEvent.java +++ b/platform/core-api/src/com/intellij/openapi/editor/event/DocumentEvent.java @@ -21,22 +21,27 @@ import org.jetbrains.annotations.NotNull; import java.util.EventObject; public abstract class DocumentEvent extends EventObject { - protected DocumentEvent(Document document) { + protected DocumentEvent(@NotNull Document document) { super(document); } - @NotNull public abstract Document getDocument(); + @NotNull + public abstract Document getDocument(); public abstract int getOffset(); public abstract int getOldLength(); + public abstract int getNewLength(); + @NotNull public abstract CharSequence getOldFragment(); + + @NotNull public abstract CharSequence getNewFragment(); public abstract long getOldTimeStamp(); - + public boolean isWholeTextReplaced() { return getOffset() == 0 && getNewLength() == getDocument().getTextLength(); } diff --git a/platform/core-impl/src/com/intellij/openapi/editor/impl/PersistentRangeMarker.java b/platform/core-impl/src/com/intellij/openapi/editor/impl/PersistentRangeMarker.java index e09639f0aded..e1b34cc49ad7 100644 --- a/platform/core-impl/src/com/intellij/openapi/editor/impl/PersistentRangeMarker.java +++ b/platform/core-impl/src/com/intellij/openapi/editor/impl/PersistentRangeMarker.java @@ -25,8 +25,8 @@ import com.intellij.util.diff.FilesTooBigForDiffException; * is replaced. *

* Example: consider that the user selects all text at editor (Ctrl+A), copies it to the buffer (Ctrl+C) and performs paste (Ctrl+V). - * All document text is replaced then but in essence it's the same, hence, we may want particular range markers to be still valid. - * + * All document text is replaced then but in essence it's the same, hence, we may want particular range markers to be still valid. + * * @author max */ class PersistentRangeMarker extends RangeMarkerImpl { @@ -69,22 +69,23 @@ class PersistentRangeMarker extends RangeMarkerImpl { private boolean translateViaDiff(final DocumentEventImpl event) { try { myStartLine = event.translateLineViaDiffStrict(myStartLine); - if (myStartLine < 0 || myStartLine >= getDocument().getLineCount()){ + if (myStartLine < 0 || myStartLine >= getDocument().getLineCount()) { invalidate(event); } - else{ + else { setIntervalStart(getDocument().getLineStartOffset(myStartLine) + myStartColumn); } myEndLine = event.translateLineViaDiffStrict(myEndLine); - if (myEndLine < 0 || myEndLine >= getDocument().getLineCount()){ + if (myEndLine < 0 || myEndLine >= getDocument().getLineCount()) { invalidate(event); } - else{ + else { setIntervalEnd(getDocument().getLineStartOffset(myEndLine) + myEndColumn); } return true; - } catch (FilesTooBigForDiffException e) { + } + catch (FilesTooBigForDiffException e) { return false; } } @@ -94,12 +95,12 @@ class PersistentRangeMarker extends RangeMarkerImpl { DocumentEventImpl event = (DocumentEventImpl)e; final boolean shouldTranslateViaDiff = PersistentRangeMarkerUtil.shouldTranslateViaDiff(event, this); boolean wasTranslated = shouldTranslateViaDiff; - if (shouldTranslateViaDiff){ + if (shouldTranslateViaDiff) { wasTranslated = translateViaDiff(event); } - if (! wasTranslated) { + if (!wasTranslated) { super.changedUpdateImpl(e); - if (isValid()){ + if (isValid()) { storeLinesAndCols(e); } } diff --git a/platform/core-impl/src/com/intellij/openapi/editor/impl/event/DocumentEventImpl.java b/platform/core-impl/src/com/intellij/openapi/editor/impl/event/DocumentEventImpl.java index 1bd95fca7b5c..993dda9c0535 100644 --- a/platform/core-impl/src/com/intellij/openapi/editor/impl/event/DocumentEventImpl.java +++ b/platform/core-impl/src/com/intellij/openapi/editor/impl/event/DocumentEventImpl.java @@ -38,6 +38,8 @@ public class DocumentEventImpl extends DocumentEvent { private final long myOldTimeStamp; private final boolean myIsWholeDocReplaced; private Diff.Change myChange; + private static final Diff.Change TOO_BIG_FILE = new Diff.Change(0, 0, 0, 0, null) { + }; private int myOptimizedLineShift = -1; private boolean myOptimizedLineShiftCalculated; @@ -45,7 +47,11 @@ public class DocumentEventImpl extends DocumentEvent { private int myOptimizedOldLineShift = -1; private boolean myOptimizedOldLineShiftCalculated; - public DocumentEventImpl(Document document, int offset, CharSequence oldString, CharSequence newString, long oldTimeStamp, + public DocumentEventImpl(@NotNull Document document, + int offset, + CharSequence oldString, + CharSequence newString, + long oldTimeStamp, boolean wholeTextReplaced) { super(document); myOffset = offset; @@ -83,11 +89,13 @@ public class DocumentEventImpl extends DocumentEvent { return myNewLength; } + @NotNull @Override public CharSequence getOldFragment() { return myOldString; } + @NotNull @Override public CharSequence getNewFragment() { return myNewString; @@ -96,11 +104,11 @@ public class DocumentEventImpl extends DocumentEvent { @Override @NotNull public Document getDocument() { - return (Document) getSource(); + return (Document)getSource(); } public int getStartOldIndex() { - if(isStartOldIndexCalculated) return myStartOldIndex; + if (isStartOldIndexCalculated) return myStartOldIndex; isStartOldIndexCalculated = true; myStartOldIndex = getDocument().getLineNumber(myOffset); @@ -108,21 +116,21 @@ public class DocumentEventImpl extends DocumentEvent { } public boolean isOnlyOneLineChanged() { - if(isOnlyOneLineChangedCalculated) return isOnlyOneLineChanged; + if (isOnlyOneLineChangedCalculated) return isOnlyOneLineChanged; isOnlyOneLineChangedCalculated = true; isOnlyOneLineChanged = true; - for(int i=0; i= change.line0 + change.deleted) { newLine += change.inserted - change.deleted; - } else { + } + else { int delta = Math.min(change.inserted, line - change.line0); newLine = change.line1 + delta; break; @@ -172,16 +179,23 @@ public class DocumentEventImpl extends DocumentEvent { } public int translateLineViaDiffStrict(int line) throws FilesTooBigForDiffException { - if (myChange == null) buildDiff(); - Diff.Change change = myChange; + Diff.Change change = reBuildDiffIfNeeded(); if (change == null) return line; return Diff.translateLine(change, line); } - private void buildDiff() throws FilesTooBigForDiffException { - //Diff diff = new Diff(strings1, strings2); - //myChange = diff.diff_2(false); - myChange = Diff.buildChanges(myOldString, myNewString); + private Diff.Change reBuildDiffIfNeeded() throws FilesTooBigForDiffException { + if (myChange == TOO_BIG_FILE) throw new FilesTooBigForDiffException(0); + if (myChange == null) { + try { + myChange = Diff.buildChanges(myOldString, myNewString); + } + catch (FilesTooBigForDiffException e) { + myChange = TOO_BIG_FILE; + throw e; + } + } + return myChange; } public int getOptimizedLineShift() { diff --git a/platform/platform-api/src/com/intellij/openapi/editor/event/MockDocumentEvent.java b/platform/platform-api/src/com/intellij/openapi/editor/event/MockDocumentEvent.java index 61df2222ab78..9efef1db5d3c 100644 --- a/platform/platform-api/src/com/intellij/openapi/editor/event/MockDocumentEvent.java +++ b/platform/platform-api/src/com/intellij/openapi/editor/event/MockDocumentEvent.java @@ -22,7 +22,7 @@ public class MockDocumentEvent extends DocumentEvent { private final int myOffset; private final long myTimestamp; - public MockDocumentEvent(Document document, int offset) { + public MockDocumentEvent(@NotNull Document document, int offset) { super(document); myOffset = offset; myTimestamp = document.getModificationStamp(); @@ -45,10 +45,12 @@ public class MockDocumentEvent extends DocumentEvent { return 0; } + @NotNull public CharSequence getOldFragment() { return ""; } + @NotNull public CharSequence getNewFragment() { return ""; } From 9d3c71c7e0816657ab7fd108dbd417f7bb4fa778 Mon Sep 17 00:00:00 2001 From: Alexey Kudravtsev Date: Wed, 8 Feb 2012 16:14:15 +0400 Subject: [PATCH 165/215] exception --- .../tree/injected/MultiHostRegistrarImpl.java | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/platform/lang-impl/src/com/intellij/psi/impl/source/tree/injected/MultiHostRegistrarImpl.java b/platform/lang-impl/src/com/intellij/psi/impl/source/tree/injected/MultiHostRegistrarImpl.java index 0c5d2887a08c..600282b97fe6 100644 --- a/platform/lang-impl/src/com/intellij/psi/impl/source/tree/injected/MultiHostRegistrarImpl.java +++ b/platform/lang-impl/src/com/intellij/psi/impl/source/tree/injected/MultiHostRegistrarImpl.java @@ -472,22 +472,23 @@ public class MultiHostRegistrarImpl implements MultiHostRegistrar, ModificationT while (range != null && !range.isEmpty()) { if (range.getStartOffset() >= shredEndOffset) { hostNum++; - shredEndOffset = shreds.get(hostNum).range.getEndOffset(); + PsiLanguageInjectionHost.Shred shred = shreds.get(hostNum); + shredEndOffset = shred.range.getEndOffset(); prevHostEndOffset = range.getStartOffset(); - host = shreds.get(hostNum).host; + host = shred.host; escaper = escapers.get(hostNum); - rangeInsideHost = shreds.get(hostNum).getRangeInsideHost(); - prefixLength = shreds.get(hostNum).prefix.length(); - suffixLength = shreds.get(hostNum).suffix.length(); + rangeInsideHost = shred.getRangeInsideHost(); + prefixLength = shred.prefix.length(); + suffixLength = shred.suffix.length(); } //in prefix/suffix or spills over to next fragment if (range.getStartOffset() < prevHostEndOffset + prefixLength) { range = new TextRange(prevHostEndOffset + prefixLength, range.getEndOffset()); } TextRange spilled = null; - if (range.getEndOffset() >= shredEndOffset - suffixLength) { + if (range.getEndOffset() > shredEndOffset - suffixLength) { spilled = new TextRange(shredEndOffset, range.getEndOffset()); - range = new TextRange(range.getStartOffset(), shredEndOffset); + range = new TextRange(range.getStartOffset(), shredEndOffset-suffixLength); } if (!range.isEmpty()) { int start = escaper.getOffsetInHost(range.getStartOffset() - prevHostEndOffset - prefixLength, rangeInsideHost); From 4983257487ee06c1d3190a7d89ba5dca78859d69 Mon Sep 17 00:00:00 2001 From: Roman Shevchenko Date: Wed, 8 Feb 2012 13:22:24 +0100 Subject: [PATCH 166/215] JGoodies licenses --- build/scripts/libLicenses.gant | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/build/scripts/libLicenses.gant b/build/scripts/libLicenses.gant index 884423ea33bc..38597d626387 100644 --- a/build/scripts/libLicenses.gant +++ b/build/scripts/libLicenses.gant @@ -190,9 +190,9 @@ libraryLicense(name: "JavaHelp", version: "2.0_02", license: "included as licens libraryLicense(name: "JCIP Annotations", libraryName: "jcip", license: "Creative Commons Attribution License", url: "http://www.jcip.net", licenseUrl: "http://creativecommons.org/licenses/by/2.5") libraryLicense(name: "JDOM", version: "1.1 (with patches by JetBrains)", license: "modified Apache", url: "http://www.jdom.org/", licenseUrl: "http://www.jdom.org/docs/faq.html#a0030") libraryLicense(name: "jgit-1.1.0", version: "1.1.0.201109151100", license: "EDL/BSD", url: "http://www.eclipse.org/jgit/", licenseUrl: "http://www.eclipse.org/org/documents/edl-v10.php", attachedTo: "git4idea") -libraryLicense(name: "JGoodies Forms", libraryName: "jgoodies-forms", version: "CVS snapshot as of 5 May 2006", license: "BSD ", url: "http://www.jgoodies.com/freeware/forms/", licenseUrl: "http://www.jgoodies.com/downloads/libraries.html") -libraryLicense(name: "JGoodies Looks", attachedTo: "platform-impl", version: "2.4.2", license: "BSD ", url: "http://www.jgoodies.com/freeware/looks/", licenseUrl: "http://www.jgoodies.com/downloads/libraries.html") -libraryLicense(name: "JGoodies Common", attachedTo: "platform-impl", version: "1.2.1", license: "BSD ", url: "http://www.jgoodies.com/freeware/looks/", licenseUrl: "http://www.jgoodies.com/downloads/libraries.html") +libraryLicense(name: "JGoodies Forms", libraryName: "jgoodies-forms", version: "1.1-preview 2006-05-04 11:55:37", license: "BSD ", url: "http://www.jgoodies.com/freeware/forms/", licenseUrl: "http://www.jgoodies.com/downloads/libraries.html") +libraryLicense(name: "JGoodies Looks", libraryName: "jgoodies-looks", version: "2.4.2", license: "BSD ", url: "http://www.jgoodies.com/freeware/looks/", licenseUrl: "http://www.jgoodies.com/downloads/libraries.html") +libraryLicense(name: "JGoodies Common", libraryName: "jgoodies-common", version: "1.2.1", license: "BSD ", url: "http://www.jgoodies.com/freeware/looks/", licenseUrl: "http://www.jgoodies.com/downloads/libraries.html") libraryLicense(name: "JNA", libraryName: "jna", version: "3.2.4", license: "LGPL 2.1", url: "https://jna.dev.java.net/", licenseUrl: "http://www.opensource.org/licenses/lgpl-2.1.php") libraryLicense(name: "JNA", libraryName: "jna.jar", version: "3.2.7", license: "LGPL 2.1", url: "https://jna.dev.java.net/", licenseUrl: "http://www.opensource.org/licenses/lgpl-2.1.php") libraryLicense(name: "JSch", libraryName: "JSch", version: "0.1.44", license: "BSD", url: "http://www.jcraft.com/jsch/", licenseUrl: "http://www.jcraft.com/jsch/LICENSE.txt") From 6ab824011b268d0ab60c05791737d4c151b59681 Mon Sep 17 00:00:00 2001 From: Eugene Kudelevsky Date: Wed, 8 Feb 2012 16:42:37 +0400 Subject: [PATCH 167/215] add android-rt module --- build/scripts/layouts.gant | 2 ++ 1 file changed, 2 insertions(+) diff --git a/build/scripts/layouts.gant b/build/scripts/layouts.gant index c26409ec2350..6dc01096ba64 100644 --- a/build/scripts/layouts.gant +++ b/build/scripts/layouts.gant @@ -364,6 +364,8 @@ public def layoutCommunityPlugins(String home) { include(name: "**/*.jar") exclude(name: "**/ddmlib_1.jar") } + + jar("android_rt.jar") {module("android-rt")} } } } From 8d8356c32d5fabaea6e3d6ba09ce20b1747bda8b Mon Sep 17 00:00:00 2001 From: Alexander Lobas Date: Wed, 8 Feb 2012 17:00:24 +0400 Subject: [PATCH 168/215] Module structure for new UI Designer --- plugins/android-designer/android-designer.iml | 2 +- .../android-designer/src/META-INF/plugin.xml | 2 +- .../swing-designer/src/META-INF/plugin.xml | 2 +- plugins/swing-designer/swing-designer.iml | 2 +- .../ui-designer-new/src/META-INF/plugin.xml | 8 +++++++ .../src/messages/UIDesignerBundle.properties | 0 .../ui-designer-new/ui-designer-new.iml | 24 +++++++++++++++++++ 7 files changed, 36 insertions(+), 4 deletions(-) create mode 100644 plugins/ui-designer/ui-designer-new/src/META-INF/plugin.xml create mode 100644 plugins/ui-designer/ui-designer-new/src/messages/UIDesignerBundle.properties create mode 100644 plugins/ui-designer/ui-designer-new/ui-designer-new.iml diff --git a/plugins/android-designer/android-designer.iml b/plugins/android-designer/android-designer.iml index ddad786717bb..9a14d495950f 100644 --- a/plugins/android-designer/android-designer.iml +++ b/plugins/android-designer/android-designer.iml @@ -21,7 +21,7 @@ - + diff --git a/plugins/android-designer/src/META-INF/plugin.xml b/plugins/android-designer/src/META-INF/plugin.xml index d7a2c911ecc7..6705ae7c0b31 100644 --- a/plugins/android-designer/src/META-INF/plugin.xml +++ b/plugins/android-designer/src/META-INF/plugin.xml @@ -6,5 +6,5 @@ com.intellij.java-i18n com.intellij.properties org.jetbrains.android - com.intellij.uiDesigner + com.intellij.ui-designer-new diff --git a/plugins/swing-designer/src/META-INF/plugin.xml b/plugins/swing-designer/src/META-INF/plugin.xml index 7159d40459dc..48e8a04476fe 100644 --- a/plugins/swing-designer/src/META-INF/plugin.xml +++ b/plugins/swing-designer/src/META-INF/plugin.xml @@ -5,5 +5,5 @@ messages.SwingDesignerBundle com.intellij.java-i18n com.intellij.properties - com.intellij.uiDesigner + com.intellij.ui-designer-new diff --git a/plugins/swing-designer/swing-designer.iml b/plugins/swing-designer/swing-designer.iml index d77bfc09c235..8c4b67627078 100644 --- a/plugins/swing-designer/swing-designer.iml +++ b/plugins/swing-designer/swing-designer.iml @@ -20,7 +20,7 @@ - + diff --git a/plugins/ui-designer/ui-designer-new/src/META-INF/plugin.xml b/plugins/ui-designer/ui-designer-new/src/META-INF/plugin.xml new file mode 100644 index 000000000000..1f86521a5c16 --- /dev/null +++ b/plugins/ui-designer/ui-designer-new/src/META-INF/plugin.xml @@ -0,0 +1,8 @@ + + UI Designer + com.intellij.ui-designer-new + JetBrains + messages.UIDesignerBundle + com.intellij.java-i18n + com.intellij.properties + diff --git a/plugins/ui-designer/ui-designer-new/src/messages/UIDesignerBundle.properties b/plugins/ui-designer/ui-designer-new/src/messages/UIDesignerBundle.properties new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/plugins/ui-designer/ui-designer-new/ui-designer-new.iml b/plugins/ui-designer/ui-designer-new/ui-designer-new.iml new file mode 100644 index 000000000000..9503087bf8c9 --- /dev/null +++ b/plugins/ui-designer/ui-designer-new/ui-designer-new.iml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + From e7aee0817f43bc2f053ab86175662abd2e03b47d Mon Sep 17 00:00:00 2001 From: Eugene Zhuravlev Date: Wed, 8 Feb 2012 14:02:42 +0100 Subject: [PATCH 169/215] force rebuild on IOExceptions --- .../jetbrains/jps/incremental/IncProjectBuilder.java | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/jps/jps-builders/src/org/jetbrains/jps/incremental/IncProjectBuilder.java b/jps/jps-builders/src/org/jetbrains/jps/incremental/IncProjectBuilder.java index de7c5fde53b0..1399c69ed651 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/incremental/IncProjectBuilder.java +++ b/jps/jps-builders/src/org/jetbrains/jps/incremental/IncProjectBuilder.java @@ -77,11 +77,13 @@ public class IncProjectBuilder { } catch (ProjectBuildException e) { final Throwable cause = e.getCause(); - if (cause instanceof PersistentEnumerator.CorruptedException || cause instanceof MappingFailedException) { + if (cause instanceof PersistentEnumerator.CorruptedException || cause instanceof MappingFailedException || cause instanceof IOException) { // force rebuild - myMessageDispatcher.processMessage(new CompilerMessage(COMPILE_SERVER_NAME, BuildMessage.Kind.INFO, - "Internal caches are corrupted or have outdated format, forcing project rebuild: " + - e.getMessage())); + myMessageDispatcher.processMessage(new CompilerMessage( + COMPILE_SERVER_NAME, BuildMessage.Kind.INFO, + "Internal caches are corrupted or have outdated format, forcing project rebuild: " + + e.getMessage()) + ); flushContext(context); context = createContext(new AllProjectScope(scope.getProject(), Collections.emptySet(), true), false, true); runBuild(context); From 925cf377d25df1863641ed8aed75ae7806191611 Mon Sep 17 00:00:00 2001 From: Dmitry Boulytchev Date: Wed, 8 Feb 2012 17:30:15 +0400 Subject: [PATCH 170/215] Import import interface (compile server). --- .../src/org/jetbrains/ether/dependencyView/Callbacks.java | 1 + .../src/org/jetbrains/ether/dependencyView/Mappings.java | 5 +++++ 2 files changed, 6 insertions(+) diff --git a/jps/model/src/org/jetbrains/ether/dependencyView/Callbacks.java b/jps/model/src/org/jetbrains/ether/dependencyView/Callbacks.java index a98010808e86..51d644f2ec40 100644 --- a/jps/model/src/org/jetbrains/ether/dependencyView/Callbacks.java +++ b/jps/model/src/org/jetbrains/ether/dependencyView/Callbacks.java @@ -28,5 +28,6 @@ public class Callbacks { void associate(String classFileName, SourceFileNameLookup sourceLookup, ClassReader cr); void markOverride(String className, String methodName, String methodSignature); void registerConstantUsage(String className, String fieldName, String fieldOwner); + void registerImports(Collection imports, String rootClass); } } diff --git a/jps/model/src/org/jetbrains/ether/dependencyView/Mappings.java b/jps/model/src/org/jetbrains/ether/dependencyView/Mappings.java index 0c58185cef4a..5cb34dc91432 100644 --- a/jps/model/src/org/jetbrains/ether/dependencyView/Mappings.java +++ b/jps/model/src/org/jetbrains/ether/dependencyView/Mappings.java @@ -1682,6 +1682,11 @@ public class Mappings { public void registerConstantUsage(final String className, final String fieldName, final String fieldOwner) { //To change body of implemented methods use File | Settings | File Templates. } + + @Override + public void registerImports(Collection imports, String rootClass) { + //To change body of implemented methods use File | Settings | File Templates. + } }; } From 8f02db52419b87904251e30fcfe06d2c0034ec71 Mon Sep 17 00:00:00 2001 From: "Rustam.Vishnyakov" Date: Wed, 8 Feb 2012 17:00:49 +0400 Subject: [PATCH 171/215] Autoindent Java case statement --- .../editorActions/JavaTypedHandler.java | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/java/java-impl/src/com/intellij/codeInsight/editorActions/JavaTypedHandler.java b/java/java-impl/src/com/intellij/codeInsight/editorActions/JavaTypedHandler.java index 21c23437de84..d684041bc68b 100644 --- a/java/java-impl/src/com/intellij/codeInsight/editorActions/JavaTypedHandler.java +++ b/java/java-impl/src/com/intellij/codeInsight/editorActions/JavaTypedHandler.java @@ -30,6 +30,7 @@ import com.intellij.openapi.util.Condition; import com.intellij.openapi.util.text.StringUtil; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.*; +import com.intellij.psi.codeStyle.CodeStyleManager; import com.intellij.psi.filters.ClassFilter; import com.intellij.psi.filters.position.SuperParentFilter; import com.intellij.psi.javadoc.PsiDocComment; @@ -146,6 +147,11 @@ public class JavaTypedHandler extends TypedHandlerDelegate { handleAfterJavaLT(editor, JavaTokenType.LT, JavaTokenType.GT, INVALID_INSIDE_REFERENCE); return Result.STOP; } + else if (c == ':') { + if (autoIndentCase(editor, project, file)) { + return Result.STOP; + } + } return Result.CONTINUE; } @@ -283,4 +289,18 @@ public class JavaTypedHandler extends TypedHandlerDelegate { return false; } + + private static boolean autoIndentCase(Editor editor, Project project, PsiFile file) { + int offset = editor.getCaretModel().getOffset(); + PsiDocumentManager.getInstance(project).commitDocument(editor.getDocument()); + PsiElement currElement = file.findElementAt(offset - 1); + if (currElement != null) { + PsiElement parent = currElement.getParent(); + if (parent != null && parent instanceof PsiSwitchLabelStatement) { + CodeStyleManager.getInstance(project).adjustLineIndent(file, parent.getTextOffset()); + return true; + } + } + return false; + } } From a873ad0f36c6146b5d6af6783dfb672104c80b16 Mon Sep 17 00:00:00 2001 From: "Rustam.Vishnyakov" Date: Wed, 8 Feb 2012 17:35:14 +0400 Subject: [PATCH 172/215] Revert the fix for IDEA-79095 --- .../com/intellij/formatting/IndentInfo.java | 64 ++++++++----------- 1 file changed, 26 insertions(+), 38 deletions(-) diff --git a/platform/lang-impl/src/com/intellij/formatting/IndentInfo.java b/platform/lang-impl/src/com/intellij/formatting/IndentInfo.java index 6d7c0e80627b..16788a89382e 100644 --- a/platform/lang-impl/src/com/intellij/formatting/IndentInfo.java +++ b/platform/lang-impl/src/com/intellij/formatting/IndentInfo.java @@ -24,11 +24,6 @@ public class IndentInfo { private final int mySpaces; private final int myIndentSpaces; private final int myLineFeeds; - // - // The flag is used for compatibility with older versions of Intellij IDEA where spaces could be replaced with tabs inside a line of code, - // not only in the beginning of the line. - // - private static boolean myInlineTabsEnabled = "true".equalsIgnoreCase(System.getProperty("enable.inline.tabs")); /** @see WhiteSpace#setForceSkipTabulationsUsage(boolean) */ private boolean myForceSkipTabulationsUsage; @@ -63,45 +58,38 @@ public class IndentInfo { if (options.USE_TAB_CHARACTER && !myForceSkipTabulationsUsage) { if (options.SMART_TABS) { - return fillUsingSmartTabs(buffer, options); - } - else if (myLineFeeds > 0 || myInlineTabsEnabled) { - return fillUsingTabs(buffer, options); - } - } - int spaces = getTotalSpaces(); - if (spaces > 0) { - StringUtil.repeatSymbol(buffer, ' ', spaces); - } - return buffer.toString(); - - } - - private String fillUsingTabs(StringBuffer buffer, CommonCodeStyleSettings.IndentOptions options) { - int size = getTotalSpaces(); - while (size > 0) { - if (size >= options.TAB_SIZE) { - buffer.append('\t'); - size -= options.TAB_SIZE; + int tabCount = myIndentSpaces / options.TAB_SIZE; + int leftSpaces = myIndentSpaces - tabCount * options.TAB_SIZE; + if (tabCount > 0) { + StringUtil.repeatSymbol(buffer, '\t', tabCount); + } + if (leftSpaces + mySpaces > 0) { + StringUtil.repeatSymbol(buffer, ' ', leftSpaces + mySpaces); + } } else { - buffer.append(' '); - size--; + int size = getTotalSpaces(); + while (size > 0) { + if (size >= options.TAB_SIZE) { + buffer.append('\t'); + size -= options.TAB_SIZE; + } + else { + buffer.append(' '); + size--; + } + } + } + } + else { + int spaces = getTotalSpaces(); + if (spaces > 0) { + StringUtil.repeatSymbol(buffer, ' ', spaces); } } - return buffer.toString(); - } - private String fillUsingSmartTabs(StringBuffer buffer, CommonCodeStyleSettings.IndentOptions options) { - int tabCount = myIndentSpaces / options.TAB_SIZE; - int leftSpaces = myIndentSpaces - tabCount * options.TAB_SIZE; - if (tabCount > 0) { - StringUtil.repeatSymbol(buffer, '\t', tabCount); - } - if (leftSpaces + mySpaces > 0) { - StringUtil.repeatSymbol(buffer, ' ', leftSpaces + mySpaces); - } return buffer.toString(); + } public int getTotalSpaces() { From ea8e50fc458beb3f0bb9467925c031917af112da Mon Sep 17 00:00:00 2001 From: Eugene Kudelevsky Date: Wed, 8 Feb 2012 17:51:48 +0400 Subject: [PATCH 173/215] fix installer: add license --- build/scripts/libLicenses.gant | 1 + plugins/android/rt/android-rt.iml | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/build/scripts/libLicenses.gant b/build/scripts/libLicenses.gant index 38597d626387..518f2e35d473 100644 --- a/build/scripts/libLicenses.gant +++ b/build/scripts/libLicenses.gant @@ -157,6 +157,7 @@ libraryLicense(name: "Axis", libraryName: "axis-1.4", version: "1.4", license: " libraryLicense(name: "CGLib", libraryName: "CGLIB", version: "2.2.2", license: "Apache", url: "http://cglib.sourceforge.net/", licenseUrl: "http://www.apache.org/foundation/licence-FAQ.html") libraryLicense(name: "classworlds", libraryName: "classworlds-1.1.jar", version: "1.1", license: "codehaus", url: "http://classworlds.codehaus.org/", licenseUrl: "http://classworlds.codehaus.org/license.html") libraryLicense(name: "Android SDK Tools", libraryName: "android-sdk-tools", license: "Apache 2.0", url: "http://source.android.com/") +libraryLicense(name: "Android SDK Tools JPS", libraryName: "android-sdk-tools-jps", license: "Apache 2.0", url: "http://source.android.com/") libraryLicense(name: "Apache Commons BeanUtils", libraryName: "commons-beanutils.jar", version: "1.6", license: "Apache 2.0", url: "http://commons.apache.org/beanutils/") libraryLicense(name: "Apache Commons Codec", libraryName: "commons-codec", version: "1.3", license: "Apache 2.0", url: "http://commons.apache.org/codec/", licenseUrl: "http://commons.apache.org/license.html") libraryLicense(name: "Apache Commons Collections", libraryName: "commons-collections", version: "3.1", license: "Apache 2.0", url: "http://commons.apache.org/collections/", licenseUrl: "http://commons.apache.org/license.html") diff --git a/plugins/android/rt/android-rt.iml b/plugins/android/rt/android-rt.iml index 13bee7b61859..59171f56fad5 100644 --- a/plugins/android/rt/android-rt.iml +++ b/plugins/android/rt/android-rt.iml @@ -10,7 +10,7 @@ - + From 5cda6055dff004384318a3b39720d9e5a873c51d Mon Sep 17 00:00:00 2001 From: Roman Shevchenko Date: Wed, 8 Feb 2012 15:21:07 +0100 Subject: [PATCH 174/215] Fix starting default browser on Linux; cleanup --- .../src/com/intellij/ide/BrowserUtil.java | 369 ++++++++---------- .../com/intellij/util/ui/OptionsDialog.java | 5 +- .../src/messages/IdeBundle.properties | 1 - 3 files changed, 166 insertions(+), 209 deletions(-) diff --git a/platform/platform-api/src/com/intellij/ide/BrowserUtil.java b/platform/platform-api/src/com/intellij/ide/BrowserUtil.java index 1fae47755094..3ab271d75bc3 100644 --- a/platform/platform-api/src/com/intellij/ide/BrowserUtil.java +++ b/platform/platform-api/src/com/intellij/ide/BrowserUtil.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2010 JetBrains s.r.o. + * Copyright 2000-2012 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,6 +16,8 @@ package com.intellij.ide; import com.intellij.CommonBundle; +import com.intellij.execution.ExecutionException; +import com.intellij.execution.configurations.GeneralCommandLine; import com.intellij.execution.util.ExecUtil; import com.intellij.openapi.application.*; import com.intellij.openapi.diagnostic.Logger; @@ -42,6 +44,7 @@ import javax.swing.*; import java.awt.*; import java.io.*; import java.lang.reflect.InvocationTargetException; +import java.net.MalformedURLException; import java.net.URL; import java.util.Arrays; import java.util.HashSet; @@ -58,20 +61,19 @@ public class BrowserUtil { // We have to violate the RFC since we need to distinguish // real schemes from local Windows paths; The only difference // with RFC is that we do not allow schemes with length=1 (in other case - // local paths like "C:/temp/index.html" whould be erroneously interpreted as + // local paths like "C:/temp/index.html" would be erroneously interpreted as // external URLs.) - @NonNls private static final Pattern ourExternalPrefix = Pattern.compile("^[\\w\\+\\.\\-]{2,}:"); - private static final Pattern ourAnchorsuffix = Pattern.compile("#(.*)$"); + private static final Pattern ourExternalPrefix = Pattern.compile("^[\\w\\+\\.\\-]{2,}:"); + private static final Pattern ourAnchorSuffix = Pattern.compile("#(.*)$"); - private BrowserUtil() { - } + private BrowserUtil() { } public static boolean isAbsoluteURL(String url) { return ourExternalPrefix.matcher(url.toLowerCase()).find(); } public static String getDocURL(String url) { - Matcher anchorMatcher = ourAnchorsuffix.matcher(url); + Matcher anchorMatcher = ourAnchorSuffix.matcher(url); if (anchorMatcher.find()) { return anchorMatcher.reset().replaceAll(""); @@ -81,7 +83,7 @@ public class BrowserUtil { } @Nullable - public static URL getURL(String url) throws java.net.MalformedURLException { + public static URL getURL(String url) throws MalformedURLException { if (!isAbsoluteURL(url)) { return new URL("file", "", url); } @@ -89,128 +91,95 @@ public class BrowserUtil { return VfsUtil.convertToURL(url); } - private static void launchBrowser(final String url, String[] command) { - try { - URL curl = getURL(url); + /** + * Main method: tries to launch a browser using every possible way. + * + * @param url an URL to open. + */ + public static void launchBrowser(@NonNls String url) { + LOG.debug("Launch browser: " + url); - if (curl != null) { - final String urlString = curl.toString(); - String[] commandLine; - if (SystemInfo.isWindows && isUseDefaultBrowser()) { - commandLine = new String[command.length + 2]; - System.arraycopy(command, 0, commandLine, 0, command.length); - commandLine[commandLine.length - 2] = "\"\""; - commandLine[commandLine.length - 1] = "\"" + redirectUrl(url, urlString) + "\""; - } - else { - commandLine = new String[command.length + 1]; - System.arraycopy(command, 0, commandLine, 0, command.length); - commandLine[commandLine.length - 1] = SystemInfo.isMac && isUseDefaultBrowser() ? escapeUrl(redirectUrl(url, urlString)) - : escapeUrl(urlString); - } - Runtime.getRuntime().exec(commandLine); - if (LOG.isDebugEnabled()) { - LOG.debug("Browser launched with command line: " + Arrays.toString(commandLine)); - } + if (url.startsWith("jar:")) { + url = extractFiles(url); + if (url == null) return; + } + + if (getGeneralSettingsInstance().isUseDefaultBrowser() && canStartDefaultBrowser()) { + final String[] command = getDefaultBrowserCommand(); + if (command != null) { + launchBrowserByCommand(url, command); } else { - showErrorMessage(IdeBundle.message("error.malformed.url", url), CommonBundle.getErrorTitle()); + launchBrowserUsingDesktopApi(url); } } - catch (final IOException e) { - showErrorMessage(IdeBundle.message("error.cannot.start.browser", e.getMessage()), - CommonBundle.getErrorTitle()); - } - } - - /** - * This method works around Windows 'start' command behaivor of dropping anchors from the url for local urls. - */ - private static String redirectUrl(String url, @NonNls String urlString) throws IOException { - if (url.indexOf('&') == -1 && (!urlString.startsWith("file:") || urlString.indexOf("#") == -1)) return urlString; - - File redirect = FileUtil.createTempFile("redirect", ".html"); - redirect.deleteOnExit(); - FileWriter writer = new FileWriter(redirect); - writer.write(""); - writer.close(); - return VfsUtil.pathToUrl(redirect.getAbsolutePath()); - } - - private static boolean isUseDefaultBrowser() { - Application application = ApplicationManager.getApplication(); - if (application == null) { - return true; - } else { - return getGeneralSettingsInstance().isUseDefaultBrowser(); + launchBrowserUsingStandardWay(url); } } - private static void showErrorMessage(final String message, final String title) { - final Application app = ApplicationManager.getApplication(); - if (app == null) { - return; // Not started yet. Not able to show message up. (Could happen in License panel under Linux). - } - - Runnable runnable = new Runnable() { - public void run() { - Messages.showMessageDialog(message, - title, - Messages.getErrorIcon()); - } - }; - - if (app.isDispatchThread()) { - runnable.run(); - } - else { - app.invokeLater(runnable, ModalityState.NON_MODAL); - } - } - - private static void launchBrowserUsingStandardWay(final String url) { - String[] command; - try { - String browserPath = getGeneralSettingsInstance().getBrowserPath(); - if (browserPath == null || browserPath.trim().length() == 0) { - showErrorMessage(IdeBundle.message("error.please.specify.path.to.web.browser"), - IdeBundle.message("title.browser.not.found")); - return; - } - - command = getOpenBrowserCommand(browserPath); - } - catch (NullPointerException e) { - // todo: fix the possible problem on startup, see SCR #35066 - command = getDefaultBrowserCommand(); - if (command == null) { - showErrorMessage(IdeBundle.message("error.please.open.url.manually", url, ApplicationNamesInfo.getInstance().getProductName()), - IdeBundle.message("title.browser.path.not.found")); - return; - } - } - // We do not need to check browserPath under Win32 - - launchBrowser(url, command); - } - private static GeneralSettings getGeneralSettingsInstance() { - final GeneralSettings settings = GeneralSettings.getInstance(); - if (settings != null) return settings; - return new GeneralSettings(); + final GeneralSettings settings = ApplicationManager.getApplication() != null ? GeneralSettings.getInstance() : null; + return settings != null ? settings : new GeneralSettings(); } - private static boolean launchDefaultBrowserUsingJdk6Api(String sUrl) { - try { - URL url = getURL(sUrl); - if (url == null) return false; - Desktop.getDesktop().browse(url.toURI()); - LOG.debug("Browser launched using JDK 1.6 API"); + public static boolean canStartDefaultBrowser() { + if (SystemInfo.isMac || SystemInfo.isWindows) { return true; } - catch (Exception e) { - return false; + else if (SystemInfo.isUnix && SystemInfo.hasXdgOpen) { + return true; + } + else if (Desktop.isDesktopSupported() && Desktop.getDesktop().isSupported(Desktop.Action.BROWSE)) { + return true; + } + + return false; + } + + @Nullable + @NonNls + private static String[] getDefaultBrowserCommand() { + if (SystemInfo.isWindows9x) { + return new String[]{"command.com", "/c", "start"}; + } + else if (SystemInfo.isWindows) { + return new String[]{"cmd.exe", "/c", "start"}; + } + else if (SystemInfo.isMac) { + return new String[]{ExecUtil.getOpenCommandPath()}; + } + else if (SystemInfo.isUnix && SystemInfo.hasXdgOpen) { + return new String[]{"xdg-open"}; + } + + return null; + } + + private static void launchBrowserByCommand(final String url, @NotNull final String[] command) { + URL curl; + try { + curl = getURL(url); + } + catch (MalformedURLException ignored) { + curl = null; + } + if (curl == null) { + showErrorMessage(IdeBundle.message("error.malformed.url", url), CommonBundle.getErrorTitle()); + return; + } + + try { + final GeneralCommandLine commandLine = new GeneralCommandLine(command); + commandLine.addParameter(curl.toString()); + commandLine.createProcess(); + + if (LOG.isDebugEnabled()) { + LOG.debug("Browser launched with command line: " + commandLine.getCommandLineString()); + } + } + catch (final ExecutionException e) { + showErrorMessage(IdeBundle.message("error.cannot.start.browser", e.getMessage()), CommonBundle.getErrorTitle()); } } @@ -224,6 +193,84 @@ public class BrowserUtil { } } + private static boolean launchBrowserUsingDesktopApi(final String sUrl) { + try { + URL url = getURL(sUrl); + if (url == null) return false; + Desktop.getDesktop().browse(url.toURI()); + LOG.debug("Browser launched using JDK 1.6 API"); + return true; + } + catch (Exception e) { + return false; + } + } + + private static void launchBrowserUsingStandardWay(final String url) { + String browserPath = getGeneralSettingsInstance().getBrowserPath(); + if (StringUtil.isEmptyOrSpaces(browserPath)) { + showErrorMessage(IdeBundle.message("error.please.specify.path.to.web.browser"), IdeBundle.message("title.browser.not.found")); + return; + } + + launchBrowserByCommand(url, getOpenBrowserCommand(browserPath)); + } + + /** + * @deprecated use {@link #getOpenBrowserCommand(String)} instead + */ + @SuppressWarnings({"UnusedDeclaration"}) + public static String[] getOpenBrowserCommand(final @NonNls @NotNull String browserPath, final String... parameters) { + return getOpenBrowserCommand(browserPath); + } + + public static String[] getOpenBrowserCommand(final @NonNls @NotNull String browserPath) { + final String[] command; + if (SystemInfo.isMac) { + if (new File(browserPath).isFile()) { + // versions before 10.6 don't allow to pass command line arguments to browser via 'open' command + // so we use full path to browser executable in such case + command = new String[] {browserPath}; + } + else { + command = new String[]{ExecUtil.getOpenCommandPath(), "-a", browserPath}; + } + } + else if (SystemInfo.isWindows) { + if (new File(browserPath).isFile()) { + command = new String[]{browserPath}; + } + else { + command = new String[]{SystemInfo.isWindows9x ? "command.com" : "cmd.exe", "/c", "start", browserPath}; + } + } + else { + command = new String[]{browserPath}; + } + return command; + } + + private static void showErrorMessage(final String message, final String title) { + final Application app = ApplicationManager.getApplication(); + if (app == null) { + return; // Not started yet. Not able to show message up. (Could happen in License panel under Linux). + } + + Runnable runnable = new Runnable() { + public void run() { + Messages.showMessageDialog(message, title, Messages.getErrorIcon()); + } + }; + + if (app.isDispatchThread()) { + runnable.run(); + } + else { + app.invokeLater(runnable, ModalityState.NON_MODAL); + } + } + + @Nullable private static String extractFiles(String url) { try { int sharpPos = url.indexOf('#'); @@ -350,100 +397,10 @@ public class BrowserUtil { return new File(PathManager.getSystemPath(), "ExtractedFiles"); } - public static void launchBrowser(@NonNls String url) { - LOG.debug("Launch browser: " + url); - if (url.startsWith("jar:")) { - url = extractFiles(url); - if (url == null) return; - } - if (canStartDefaultBrowser() && isUseDefaultBrowser()) { - if (SystemInfo.isLinux && launchDefaultBrowserUsingJdk6Api(url)) { - return; - } - - launchBrowser(url, getDefaultBrowserCommand()); - } - else { - launchBrowserUsingStandardWay(url); - } - } - - @NonNls - private static String[] getDefaultBrowserCommand() { - if (SystemInfo.isWindows9x) { - return new String[]{"command.com", "/c", "start"}; - } - else if (SystemInfo.isWindows) { - return new String[]{"cmd.exe", "/c", "start"}; - } - else if (SystemInfo.isMac) { - return new String[]{ExecUtil.getOpenCommandPath()}; - } - else if (SystemInfo.isUnix) { - return new String[]{"mozilla"}; - } - else { - return null; - } - } - - public static boolean canStartDefaultBrowser() { - if (SystemInfo.isMac || SystemInfo.isWindows) { - return true; - } - - if (SystemInfo.isLinux && Desktop.isDesktopSupported() && Desktop.getDesktop().isSupported(Desktop.Action.BROWSE)) { - return true; - } - - return false; - } - public static boolean isOpenCommandSupportArgs() { return SystemInfo.isMacOSSnowLeopard; } - /** - * @deprecated use {@link #getOpenBrowserCommand(String)} instead - */ - public static String[] getOpenBrowserCommand(final @NonNls @NotNull String browserPath, final String... parameters) { - return getOpenBrowserCommand(browserPath); - } - - public static String[] getOpenBrowserCommand(final @NonNls @NotNull String browserPath) { - String[] command; - if (SystemInfo.isMac) { - File browserExecutable = new File(browserPath); - if (browserExecutable.isFile()) { - //versions before 10.6 don't allow to pass command line arguments to browser via 'open' command so we use full path to browser executable in such cases - command = new String[] {browserPath}; - } - else { - command = new String[]{ExecUtil.getOpenCommandPath(), "-a", browserPath}; - } - } - else if (SystemInfo.isWindows9x) { - if (browserPath.indexOf(File.separatorChar) != -1) { - command = new String[]{browserPath}; - } - else { - command = new String[]{"command.com", "/c", "start", browserPath}; - } - } - else if (SystemInfo.isWindows) { - if (browserPath.indexOf(File.separatorChar) != -1) { - command = new String[]{browserPath}; - } - else { - command = new String[]{"cmd.exe", "/c", "start", browserPath}; - } - } - else { - command = new String[]{browserPath}; - } - return command; - } - private static class ConfirmExtractDialog extends OptionsDialog { private ConfirmExtractDialog() { super(null); diff --git a/platform/platform-api/src/com/intellij/util/ui/OptionsDialog.java b/platform/platform-api/src/com/intellij/util/ui/OptionsDialog.java index 76425e774f16..856ee05b2227 100644 --- a/platform/platform-api/src/com/intellij/util/ui/OptionsDialog.java +++ b/platform/platform-api/src/com/intellij/util/ui/OptionsDialog.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2009 JetBrains s.r.o. + * Copyright 2000-2012 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -18,6 +18,7 @@ package com.intellij.util.ui; import com.intellij.CommonBundle; import com.intellij.openapi.project.Project; import com.intellij.openapi.ui.DialogWrapper; +import org.jetbrains.annotations.Nullable; import java.awt.*; @@ -50,7 +51,7 @@ public abstract class OptionsDialog extends DialogWrapper { } } - protected OptionsDialog(Project project) { + protected OptionsDialog(@Nullable Project project) { super(project, true); myProject = project; setDoNotAskOption(new MyDoNotAsk()); diff --git a/platform/platform-resources-en/src/messages/IdeBundle.properties b/platform/platform-resources-en/src/messages/IdeBundle.properties index 82b6261c6940..a2613b7af5c5 100644 --- a/platform/platform-resources-en/src/messages/IdeBundle.properties +++ b/platform/platform-resources-en/src/messages/IdeBundle.properties @@ -3,7 +3,6 @@ error.malformed.url=Malformed url: {0} error.cannot.start.browser=Cannot start browser: {0} error.please.specify.path.to.web.browser=Please specify a path to web browser in File | Settings | Web Browsers title.browser.not.found=Browser Not Found -error.please.open.url.manually=Please open URL ({0}) manually. {1} can''t open it in browser title.browser.path.not.found=Browser Path Not Found action.sort.alphabetically=Sort Alphabetically button.finish=&Finish From 0a56b4a224937aaa8a07543ec8b62887f423f30e Mon Sep 17 00:00:00 2001 From: Roman Shevchenko Date: Wed, 8 Feb 2012 15:21:50 +0100 Subject: [PATCH 175/215] Google Chrome "path" for Macs --- .../src/com/intellij/ide/browsers/BrowsersConfiguration.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/xml/impl/src/com/intellij/ide/browsers/BrowsersConfiguration.java b/xml/impl/src/com/intellij/ide/browsers/BrowsersConfiguration.java index fdb43c9d78a3..95f0884d0f54 100644 --- a/xml/impl/src/com/intellij/ide/browsers/BrowsersConfiguration.java +++ b/xml/impl/src/com/intellij/ide/browsers/BrowsersConfiguration.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2009 JetBrains s.r.o. + * Copyright 2000-2012 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -66,7 +66,7 @@ public class BrowsersConfiguration implements PersistentStateComponent return new FirefoxSettings(); } }, - CHROME(XmlBundle.message("browsers.chrome"), getWindowsPathToChrome(), "google-chrome", null, IconLoader.getIcon("/xml/browsers/chrome16.png")) { + CHROME(XmlBundle.message("browsers.chrome"), getWindowsPathToChrome(), "google-chrome", "Google Chrome", IconLoader.getIcon("/xml/browsers/chrome16.png")) { @Override public BrowserSpecificSettings createBrowserSpecificSettings() { return new ChromeSettings(); From a017895ee71cb459e00bfc89c5a1f0a9003e5aea Mon Sep 17 00:00:00 2001 From: Serega Vasiliev Date: Wed, 8 Feb 2012 15:17:45 +0100 Subject: [PATCH 176/215] hiberante 4: SharedSessionContract injection (IDEA-80327) --- plugins/IntelliLang/java-support/resources/javaInjections.xml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/plugins/IntelliLang/java-support/resources/javaInjections.xml b/plugins/IntelliLang/java-support/resources/javaInjections.xml index f685f36e0415..2c49267f9269 100644 --- a/plugins/IntelliLang/java-support/resources/javaInjections.xml +++ b/plugins/IntelliLang/java-support/resources/javaInjections.xml @@ -102,10 +102,12 @@ Session.createQuery (org.hibernate) + Session.createSQLQuery (org.hibernate) + From 0527ea3b3ebfede1f43cdd505689cfde31661642 Mon Sep 17 00:00:00 2001 From: nik Date: Wed, 8 Feb 2012 16:27:40 +0400 Subject: [PATCH 177/215] jpa plugin for compile server moved to JavaEE plugin --- .idea/artifacts/jps_plugins.xml | 1 - .idea/modules.xml | 1 - jps/.idea/artifacts/jps_javaee.xml | 8 ----- jps/.idea/artifacts/jps_jpa.xml | 8 ----- jps/plugins/jpa/jps-jpa.iml | 15 -------- ...ins.jps.artifacts.LayoutElementTypeService | 1 - .../org.jetbrains.jps.idea.FacetTypeService | 1 - .../src/org/jetbrains/jps/jpa/JpaFacet.groovy | 10 ------ .../jps/jpa/JpaFacetDescriptorsElement.groovy | 34 ------------------- .../jpa/JpaFacetDescriptorsElementType.groovy | 21 ------------ .../org/jetbrains/jps/jpa/JpaFacetType.groovy | 29 ---------------- jps/plugins/jpa/testData/jpaTest/jpaTest.iml | 24 ------------- jps/plugins/jpa/testData/jpaTest/jpaTest.ipr | 24 ------------- .../jpaTest/src/META-INF/persistence.xml | 5 --- .../testSrc/org/jetbrains/jps/JpaTest.groovy | 29 ---------------- 15 files changed, 211 deletions(-) delete mode 100644 jps/.idea/artifacts/jps_javaee.xml delete mode 100644 jps/.idea/artifacts/jps_jpa.xml delete mode 100644 jps/plugins/jpa/jps-jpa.iml delete mode 100644 jps/plugins/jpa/src/META-INF/services/org.jetbrains.jps.artifacts.LayoutElementTypeService delete mode 100644 jps/plugins/jpa/src/META-INF/services/org.jetbrains.jps.idea.FacetTypeService delete mode 100644 jps/plugins/jpa/src/org/jetbrains/jps/jpa/JpaFacet.groovy delete mode 100644 jps/plugins/jpa/src/org/jetbrains/jps/jpa/JpaFacetDescriptorsElement.groovy delete mode 100644 jps/plugins/jpa/src/org/jetbrains/jps/jpa/JpaFacetDescriptorsElementType.groovy delete mode 100644 jps/plugins/jpa/src/org/jetbrains/jps/jpa/JpaFacetType.groovy delete mode 100644 jps/plugins/jpa/testData/jpaTest/jpaTest.iml delete mode 100644 jps/plugins/jpa/testData/jpaTest/jpaTest.ipr delete mode 100644 jps/plugins/jpa/testData/jpaTest/src/META-INF/persistence.xml delete mode 100644 jps/plugins/jpa/testSrc/org/jetbrains/jps/JpaTest.groovy diff --git a/.idea/artifacts/jps_plugins.xml b/.idea/artifacts/jps_plugins.xml index ef658048f36c..4e75ad6e99c3 100644 --- a/.idea/artifacts/jps_plugins.xml +++ b/.idea/artifacts/jps_plugins.xml @@ -4,7 +4,6 @@ - diff --git a/.idea/modules.xml b/.idea/modules.xml index 00d78128e8be..d1ee07a39b2b 100644 --- a/.idea/modules.xml +++ b/.idea/modules.xml @@ -61,7 +61,6 @@ - diff --git a/jps/.idea/artifacts/jps_javaee.xml b/jps/.idea/artifacts/jps_javaee.xml deleted file mode 100644 index 687d1ac5c3c5..000000000000 --- a/jps/.idea/artifacts/jps_javaee.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - $PROJECT_DIR$/out/artifacts - - - - - \ No newline at end of file diff --git a/jps/.idea/artifacts/jps_jpa.xml b/jps/.idea/artifacts/jps_jpa.xml deleted file mode 100644 index 95ed475bb3ce..000000000000 --- a/jps/.idea/artifacts/jps_jpa.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - $PROJECT_DIR$/out/artifacts - - - - - \ No newline at end of file diff --git a/jps/plugins/jpa/jps-jpa.iml b/jps/plugins/jpa/jps-jpa.iml deleted file mode 100644 index 9d7005eff21a..000000000000 --- a/jps/plugins/jpa/jps-jpa.iml +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - - - - - - - - diff --git a/jps/plugins/jpa/src/META-INF/services/org.jetbrains.jps.artifacts.LayoutElementTypeService b/jps/plugins/jpa/src/META-INF/services/org.jetbrains.jps.artifacts.LayoutElementTypeService deleted file mode 100644 index 93c232491864..000000000000 --- a/jps/plugins/jpa/src/META-INF/services/org.jetbrains.jps.artifacts.LayoutElementTypeService +++ /dev/null @@ -1 +0,0 @@ -org.jetbrains.jps.jpa.JpaFacetDescriptorsElementType \ No newline at end of file diff --git a/jps/plugins/jpa/src/META-INF/services/org.jetbrains.jps.idea.FacetTypeService b/jps/plugins/jpa/src/META-INF/services/org.jetbrains.jps.idea.FacetTypeService deleted file mode 100644 index 3617f029eafb..000000000000 --- a/jps/plugins/jpa/src/META-INF/services/org.jetbrains.jps.idea.FacetTypeService +++ /dev/null @@ -1 +0,0 @@ -org.jetbrains.jps.jpa.JpaFacetType \ No newline at end of file diff --git a/jps/plugins/jpa/src/org/jetbrains/jps/jpa/JpaFacet.groovy b/jps/plugins/jpa/src/org/jetbrains/jps/jpa/JpaFacet.groovy deleted file mode 100644 index 0ff329b873d5..000000000000 --- a/jps/plugins/jpa/src/org/jetbrains/jps/jpa/JpaFacet.groovy +++ /dev/null @@ -1,10 +0,0 @@ -package org.jetbrains.jps.jpa - -import org.jetbrains.jps.idea.Facet - -/** - * @author nik - */ -class JpaFacet extends Facet { - final List descriptors = [] -} diff --git a/jps/plugins/jpa/src/org/jetbrains/jps/jpa/JpaFacetDescriptorsElement.groovy b/jps/plugins/jpa/src/org/jetbrains/jps/jpa/JpaFacetDescriptorsElement.groovy deleted file mode 100644 index 55ef512d28cc..000000000000 --- a/jps/plugins/jpa/src/org/jetbrains/jps/jpa/JpaFacetDescriptorsElement.groovy +++ /dev/null @@ -1,34 +0,0 @@ -package org.jetbrains.jps.jpa - -import org.jetbrains.jps.Project -import org.jetbrains.jps.artifacts.ComplexLayoutElement -import org.jetbrains.jps.artifacts.FileCopyElement -import org.jetbrains.jps.artifacts.LayoutElement -import org.jetbrains.jps.artifacts.LayoutElementFactory -import org.jetbrains.jps.idea.ProjectLoadingErrorReporter - -/** - * @author nik - */ -class JpaFacetDescriptorsElement extends ComplexLayoutElement { - String facetId - ProjectLoadingErrorReporter errorReporter - - List getSubstitution(Project project) { - def moduleName = facetId.substring(0, facetId.indexOf('/')) - def facet = project.modules[moduleName]?.facets[facetId] - if (facet == null) { - errorReporter.error("Unknown facet id: $facetId") - } - - if (!(facet instanceof JpaFacet)) { - errorReporter.error("$facetId facet is not JPA facet") - } - - List result = [] - facet.descriptors.each {String path -> - result << LayoutElementFactory.createParentDirectories("META-INF", new FileCopyElement(filePath: path)) - } - return result - } -} diff --git a/jps/plugins/jpa/src/org/jetbrains/jps/jpa/JpaFacetDescriptorsElementType.groovy b/jps/plugins/jpa/src/org/jetbrains/jps/jpa/JpaFacetDescriptorsElementType.groovy deleted file mode 100644 index 78d5de1d5440..000000000000 --- a/jps/plugins/jpa/src/org/jetbrains/jps/jpa/JpaFacetDescriptorsElementType.groovy +++ /dev/null @@ -1,21 +0,0 @@ -package org.jetbrains.jps.jpa - -import org.jetbrains.jps.MacroExpander -import org.jetbrains.jps.Project -import org.jetbrains.jps.artifacts.LayoutElement -import org.jetbrains.jps.artifacts.LayoutElementTypeService -import org.jetbrains.jps.idea.ProjectLoadingErrorReporter - -/** - * @author nik - */ -class JpaFacetDescriptorsElementType extends LayoutElementTypeService { - JpaFacetDescriptorsElementType() { - super("jpa-descriptors") - } - - @Override - LayoutElement createElement(Project project, Node tag, MacroExpander macroExpander, ProjectLoadingErrorReporter errorReporter) { - return new JpaFacetDescriptorsElement(facetId: tag."@facet", errorReporter: errorReporter) - } -} diff --git a/jps/plugins/jpa/src/org/jetbrains/jps/jpa/JpaFacetType.groovy b/jps/plugins/jpa/src/org/jetbrains/jps/jpa/JpaFacetType.groovy deleted file mode 100644 index 50886e42cbef..000000000000 --- a/jps/plugins/jpa/src/org/jetbrains/jps/jpa/JpaFacetType.groovy +++ /dev/null @@ -1,29 +0,0 @@ -package org.jetbrains.jps.jpa - -import org.jetbrains.jps.idea.FacetTypeService -import org.jetbrains.jps.idea.Facet -import org.jetbrains.jps.Module -import org.jetbrains.jps.MacroExpander - -import org.jetbrains.jps.idea.IdeaProjectLoadingUtil - -/** - * @author nik - */ -class JpaFacetType extends FacetTypeService { - JpaFacetType() { - super("jpa") - } - - @Override - Facet createFacet(Module module, String name, Node facetConfiguration, MacroExpander macroExpander) { - JpaFacet facet = new JpaFacet(name: name) - facetConfiguration?.deploymentDescriptor?.each {Node tag -> - String path = macroExpander.expandMacros(IdeaProjectLoadingUtil.pathFromUrl(tag."@url")) - facet.descriptors << path - } - return facet - } - - -} diff --git a/jps/plugins/jpa/testData/jpaTest/jpaTest.iml b/jps/plugins/jpa/testData/jpaTest/jpaTest.iml deleted file mode 100644 index c44032a334dc..000000000000 --- a/jps/plugins/jpa/testData/jpaTest/jpaTest.iml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/jps/plugins/jpa/testData/jpaTest/jpaTest.ipr b/jps/plugins/jpa/testData/jpaTest/jpaTest.ipr deleted file mode 100644 index 3b17b74a3a30..000000000000 --- a/jps/plugins/jpa/testData/jpaTest/jpaTest.ipr +++ /dev/null @@ -1,24 +0,0 @@ - - - - - $PROJECT_DIR$/out/artifacts/jpaTest - - - - - - - - - - - - - - - - - - - diff --git a/jps/plugins/jpa/testData/jpaTest/src/META-INF/persistence.xml b/jps/plugins/jpa/testData/jpaTest/src/META-INF/persistence.xml deleted file mode 100644 index ec93f1cad212..000000000000 --- a/jps/plugins/jpa/testData/jpaTest/src/META-INF/persistence.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/jps/plugins/jpa/testSrc/org/jetbrains/jps/JpaTest.groovy b/jps/plugins/jpa/testSrc/org/jetbrains/jps/JpaTest.groovy deleted file mode 100644 index 11255f751ab0..000000000000 --- a/jps/plugins/jpa/testSrc/org/jetbrains/jps/JpaTest.groovy +++ /dev/null @@ -1,29 +0,0 @@ -package org.jetbrains.jps - -/** - * @author nik - */ -class JpaTest extends JpsBuildTestCase { - public void testOverwriteArtifacts() throws Exception { - doTest("plugins/jpa/testData/jpaTest/jpaTest.ipr", null, { - dir("artifacts") { - dir("jpaTest") { - dir("WEB-INF") { - dir("classes") { - dir("META-INF") { - file("persistence.xml") - } - } - } - } - } - dir("production") { - dir("jpaTest") { - dir("META-INF") { - file("persistence.xml") - } - } - } - }) - } -} From ee6fbb587ca43db6b29b0d1ca8bb9f608f09f44d Mon Sep 17 00:00:00 2001 From: nik Date: Wed, 8 Feb 2012 16:40:17 +0400 Subject: [PATCH 178/215] gwt plugin for compile server moved to Gwt IDEA plugin --- .idea/artifacts/jps_plugins.xml | 1 - .idea/modules.xml | 1 - jps/.idea/artifacts/jps_gwt.xml | 8 -- jps/.idea/artifacts/jps_sources.xml | 3 - jps/plugins/gwt/jps-gwt.iml | 16 ---- ...ins.jps.artifacts.LayoutElementTypeService | 1 - ...etbrains.jps.builders.ModuleBuilderService | 1 - .../org.jetbrains.jps.idea.FacetTypeService | 1 - .../jps/gwt/GwtCompilerOutputElement.groovy | 32 ------- .../gwt/GwtCompilerOutputElementType.groovy | 21 ----- .../src/org/jetbrains/jps/gwt/GwtFacet.groovy | 16 ---- .../org/jetbrains/jps/gwt/GwtFacetType.groovy | 42 --------- .../jetbrains/jps/gwt/GwtModuleBuilder.groovy | 94 ------------------- .../jps/gwt/GwtModuleBuilderService.groovy | 15 --- .../jetbrains/jps/gwt/GwtModuleUtil.groovy | 21 ----- .../jetbrains/jps/gwt/GwtModulesSearcher.java | 43 --------- .../gwt/testData/modules/com/app/App.gwt.xml | 6 -- .../modules/com/app/InvalidXml.gwt.xml | 5 - .../modules/com/app/NoEntryPoints.gwt.xml | 5 - .../jps/gwt/GwtModulesSearcherTest.java | 18 ---- 20 files changed, 350 deletions(-) delete mode 100644 jps/.idea/artifacts/jps_gwt.xml delete mode 100644 jps/plugins/gwt/jps-gwt.iml delete mode 100644 jps/plugins/gwt/src/META-INF/services/org.jetbrains.jps.artifacts.LayoutElementTypeService delete mode 100644 jps/plugins/gwt/src/META-INF/services/org.jetbrains.jps.builders.ModuleBuilderService delete mode 100644 jps/plugins/gwt/src/META-INF/services/org.jetbrains.jps.idea.FacetTypeService delete mode 100644 jps/plugins/gwt/src/org/jetbrains/jps/gwt/GwtCompilerOutputElement.groovy delete mode 100644 jps/plugins/gwt/src/org/jetbrains/jps/gwt/GwtCompilerOutputElementType.groovy delete mode 100644 jps/plugins/gwt/src/org/jetbrains/jps/gwt/GwtFacet.groovy delete mode 100644 jps/plugins/gwt/src/org/jetbrains/jps/gwt/GwtFacetType.groovy delete mode 100644 jps/plugins/gwt/src/org/jetbrains/jps/gwt/GwtModuleBuilder.groovy delete mode 100644 jps/plugins/gwt/src/org/jetbrains/jps/gwt/GwtModuleBuilderService.groovy delete mode 100644 jps/plugins/gwt/src/org/jetbrains/jps/gwt/GwtModuleUtil.groovy delete mode 100644 jps/plugins/gwt/src/org/jetbrains/jps/gwt/GwtModulesSearcher.java delete mode 100644 jps/plugins/gwt/testData/modules/com/app/App.gwt.xml delete mode 100644 jps/plugins/gwt/testData/modules/com/app/InvalidXml.gwt.xml delete mode 100644 jps/plugins/gwt/testData/modules/com/app/NoEntryPoints.gwt.xml delete mode 100644 jps/plugins/gwt/testSrc/org/jetbrains/jps/gwt/GwtModulesSearcherTest.java diff --git a/.idea/artifacts/jps_plugins.xml b/.idea/artifacts/jps_plugins.xml index 4e75ad6e99c3..89f5927429ed 100644 --- a/.idea/artifacts/jps_plugins.xml +++ b/.idea/artifacts/jps_plugins.xml @@ -3,7 +3,6 @@ $PROJECT_DIR$/out/artifacts/jps - diff --git a/.idea/modules.xml b/.idea/modules.xml index d1ee07a39b2b..ce8d7ca005f3 100644 --- a/.idea/modules.xml +++ b/.idea/modules.xml @@ -60,7 +60,6 @@ - diff --git a/jps/.idea/artifacts/jps_gwt.xml b/jps/.idea/artifacts/jps_gwt.xml deleted file mode 100644 index bdd54326be60..000000000000 --- a/jps/.idea/artifacts/jps_gwt.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - $PROJECT_DIR$/out/artifacts - - - - - \ No newline at end of file diff --git a/jps/.idea/artifacts/jps_sources.xml b/jps/.idea/artifacts/jps_sources.xml index b9c9e404bca3..2f527656df83 100644 --- a/jps/.idea/artifacts/jps_sources.xml +++ b/jps/.idea/artifacts/jps_sources.xml @@ -3,9 +3,6 @@ $PROJECT_DIR$/out/artifacts - - - diff --git a/jps/plugins/gwt/jps-gwt.iml b/jps/plugins/gwt/jps-gwt.iml deleted file mode 100644 index 704ab03cf56b..000000000000 --- a/jps/plugins/gwt/jps-gwt.iml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - - - - - - - - - diff --git a/jps/plugins/gwt/src/META-INF/services/org.jetbrains.jps.artifacts.LayoutElementTypeService b/jps/plugins/gwt/src/META-INF/services/org.jetbrains.jps.artifacts.LayoutElementTypeService deleted file mode 100644 index e6e827eede86..000000000000 --- a/jps/plugins/gwt/src/META-INF/services/org.jetbrains.jps.artifacts.LayoutElementTypeService +++ /dev/null @@ -1 +0,0 @@ -org.jetbrains.jps.gwt.GwtCompilerOutputElementType \ No newline at end of file diff --git a/jps/plugins/gwt/src/META-INF/services/org.jetbrains.jps.builders.ModuleBuilderService b/jps/plugins/gwt/src/META-INF/services/org.jetbrains.jps.builders.ModuleBuilderService deleted file mode 100644 index 0a91a2e156a1..000000000000 --- a/jps/plugins/gwt/src/META-INF/services/org.jetbrains.jps.builders.ModuleBuilderService +++ /dev/null @@ -1 +0,0 @@ -org.jetbrains.jps.gwt.GwtModuleBuilderService \ No newline at end of file diff --git a/jps/plugins/gwt/src/META-INF/services/org.jetbrains.jps.idea.FacetTypeService b/jps/plugins/gwt/src/META-INF/services/org.jetbrains.jps.idea.FacetTypeService deleted file mode 100644 index ca9265f096a7..000000000000 --- a/jps/plugins/gwt/src/META-INF/services/org.jetbrains.jps.idea.FacetTypeService +++ /dev/null @@ -1 +0,0 @@ -org.jetbrains.jps.gwt.GwtFacetType \ No newline at end of file diff --git a/jps/plugins/gwt/src/org/jetbrains/jps/gwt/GwtCompilerOutputElement.groovy b/jps/plugins/gwt/src/org/jetbrains/jps/gwt/GwtCompilerOutputElement.groovy deleted file mode 100644 index 845cebc23b18..000000000000 --- a/jps/plugins/gwt/src/org/jetbrains/jps/gwt/GwtCompilerOutputElement.groovy +++ /dev/null @@ -1,32 +0,0 @@ -package org.jetbrains.jps.gwt - -import org.jetbrains.jps.artifacts.ComplexLayoutElement -import org.jetbrains.jps.artifacts.LayoutElement -import org.jetbrains.jps.Project -import org.jetbrains.jps.idea.IdeaProjectLoadingUtil -import org.jetbrains.jps.idea.Facet -import org.jetbrains.jps.artifacts.DirectoryCopyElement -import org.jetbrains.jps.idea.ProjectLoadingErrorReporter - -/** - * @author nik - */ -class GwtCompilerOutputElement extends ComplexLayoutElement { - String facetId - ProjectLoadingErrorReporter errorReporter - - @Override - List getSubstitution(Project project) { - Facet facet = IdeaProjectLoadingUtil.findFacetByIdWithAssertion(project, facetId, errorReporter) - if (!(facet instanceof GwtFacet)) { - errorReporter.error("'$facetId' is not GWT facet!") - } - - GwtFacet gwtFacet = (GwtFacet)facet - return [new DirectoryCopyElement(dirPath: gwtFacet.tempOutputDir)] - } - - Facet findFacet(Project project) { - return IdeaProjectLoadingUtil.findFacetById(project, facetId) - } -} diff --git a/jps/plugins/gwt/src/org/jetbrains/jps/gwt/GwtCompilerOutputElementType.groovy b/jps/plugins/gwt/src/org/jetbrains/jps/gwt/GwtCompilerOutputElementType.groovy deleted file mode 100644 index 752ded36d090..000000000000 --- a/jps/plugins/gwt/src/org/jetbrains/jps/gwt/GwtCompilerOutputElementType.groovy +++ /dev/null @@ -1,21 +0,0 @@ -package org.jetbrains.jps.gwt - -import org.jetbrains.jps.MacroExpander -import org.jetbrains.jps.Project -import org.jetbrains.jps.artifacts.LayoutElement -import org.jetbrains.jps.artifacts.LayoutElementTypeService -import org.jetbrains.jps.idea.ProjectLoadingErrorReporter - -/** - * @author nik - */ -public class GwtCompilerOutputElementType extends LayoutElementTypeService { - public GwtCompilerOutputElementType() { - super("gwt-compiler-output") - } - - @Override - public LayoutElement createElement(Project project, Node tag, MacroExpander macroExpander, ProjectLoadingErrorReporter errorReporter) { - return new GwtCompilerOutputElement(facetId: tag."@facet", errorReporter: errorReporter) - } -} diff --git a/jps/plugins/gwt/src/org/jetbrains/jps/gwt/GwtFacet.groovy b/jps/plugins/gwt/src/org/jetbrains/jps/gwt/GwtFacet.groovy deleted file mode 100644 index 8da8527439b8..000000000000 --- a/jps/plugins/gwt/src/org/jetbrains/jps/gwt/GwtFacet.groovy +++ /dev/null @@ -1,16 +0,0 @@ -package org.jetbrains.jps.gwt - -import org.jetbrains.jps.Module -import org.jetbrains.jps.idea.Facet - -/** - * @author nik - */ -class GwtFacet extends Facet { - Module module - String compilerMaxHeapSize = "128" - String scriptOutputStyle = "DETAILED" - String additionalCompilerParameters = "" - String sdkPath - String tempOutputDir -} diff --git a/jps/plugins/gwt/src/org/jetbrains/jps/gwt/GwtFacetType.groovy b/jps/plugins/gwt/src/org/jetbrains/jps/gwt/GwtFacetType.groovy deleted file mode 100644 index 8ddf201eb5b9..000000000000 --- a/jps/plugins/gwt/src/org/jetbrains/jps/gwt/GwtFacetType.groovy +++ /dev/null @@ -1,42 +0,0 @@ -package org.jetbrains.jps.gwt - -import org.jetbrains.jps.MacroExpander -import org.jetbrains.jps.Module -import org.jetbrains.jps.idea.Facet -import org.jetbrains.jps.idea.FacetTypeService - -import org.jetbrains.jps.idea.IdeaProjectLoadingUtil - -/** - * @author nik - */ -class GwtFacetType extends FacetTypeService { - GwtFacetType() { - super("gwt") - } - - @Override - Facet createFacet(Module module, String name, Node facetConfiguration, MacroExpander macroExpander) { - def facet = new GwtFacet(module: module, name: name) - facetConfiguration.setting.each {Node child -> - String value = child."@value" - switch (child."@name") { - case "compilerMaxHeapSize": - facet.compilerMaxHeapSize = Integer.parseInt(value) - break - case "gwtScriptOutputStyle": - facet.scriptOutputStyle = value - break - case "additionalCompilerParameters": - facet.additionalCompilerParameters = value - break - case "gwtSdkUrl": - facet.sdkPath = macroExpander.expandMacros(IdeaProjectLoadingUtil.pathFromUrl(value)) - break - } - } - - return facet - } - -} diff --git a/jps/plugins/gwt/src/org/jetbrains/jps/gwt/GwtModuleBuilder.groovy b/jps/plugins/gwt/src/org/jetbrains/jps/gwt/GwtModuleBuilder.groovy deleted file mode 100644 index 90d7368f3cc4..000000000000 --- a/jps/plugins/gwt/src/org/jetbrains/jps/gwt/GwtModuleBuilder.groovy +++ /dev/null @@ -1,94 +0,0 @@ -package org.jetbrains.jps.gwt - -import org.jetbrains.jps.ModuleBuildState -import org.jetbrains.jps.ModuleBuilder -import org.jetbrains.jps.ModuleChunk -import org.jetbrains.jps.Project -import org.jetbrains.jps.artifacts.LayoutElement -import org.jetbrains.jps.artifacts.ArtifactLayoutElement -import org.jetbrains.jps.builders.BuildUtil -import org.jetbrains.jps.ProjectBuilder - -/** - * @author nik - */ -class GwtModuleBuilder implements ModuleBuilder { - def processModule(ModuleBuildState state, ModuleChunk moduleChunk, ProjectBuilder projectBuilder) { - List facets = [] - moduleChunk.modules.each { - it.facets.values().each { - if (it instanceof GwtFacet) { - facets << it - } - } - } - - if (facets.isEmpty()) return - - facets.each {GwtFacet facet -> - compileGwtFacet(facet, projectBuilder, state) - } - } - - def compileGwtFacet(GwtFacet facet, ProjectBuilder projectBuilder, ModuleBuildState state) { - if (!isIncludedInArtifact(facet, projectBuilder.project)) { - projectBuilder.info("GWT Facet in module '${facet.module.name}' isn't included in artifacts so GWT compiler won't be called") - return - } - - if (facet.tempOutputDir != null) return - - if (!new File(facet.sdkPath).exists()) { - projectBuilder.error("GWT SDK directory $facet.sdkPath not found") - } - - List gwtModules = GwtModulesSearcher.findGwtModules(facet.module.sourceRoots) - if (gwtModules.isEmpty()) { - projectBuilder.info("No GWT modules found in GWT facet in ${facet.module} module") - return - } - - String outputDir = projectBuilder.getTempDirectoryPath("GWT_Output_$facet.module.name") - facet.tempOutputDir = outputDir - - def ant = projectBuilder.binding.ant - BuildUtil.deleteDir(projectBuilder, outputDir) - ant.mkdir(dir: outputDir) - - gwtModules.each {String moduleName -> - projectBuilder.stage("Compiling GWT Module") - ant.java(fork: "true", classname: "com.google.gwt.dev.Compiler", failonerror: "true") { - jvmarg(line: "-Xmx${facet.compilerMaxHeapSize}m") - if (!facet.additionalCompilerParameters.isEmpty()) { - jvmarg(line: facet.additionalCompilerParameters) - } - classpath { - pathelement(location: "${facet.sdkPath}/gwt-dev.jar") - state.sourceRootsFromModuleWithDependencies.each { - pathelement(location: it) - } - state.classpath.each { - pathelement(location: it) - } - } - arg(value: "-war") - arg(value: outputDir) - arg(value: "-style") - arg(value: facet.scriptOutputStyle) - arg(value: moduleName) - } - } - } - - private boolean isIncludedInArtifact(GwtFacet gwtFacet, Project project) { - boolean included = false - project.artifacts.values()*.rootElement*.process(project) {LayoutElement element -> - if (element instanceof GwtCompilerOutputElement - && ((GwtCompilerOutputElement)element).findFacet(project) == gwtFacet) { - included = true - } - return !(element instanceof ArtifactLayoutElement) - } - return included - } -} diff --git a/jps/plugins/gwt/src/org/jetbrains/jps/gwt/GwtModuleBuilderService.groovy b/jps/plugins/gwt/src/org/jetbrains/jps/gwt/GwtModuleBuilderService.groovy deleted file mode 100644 index ee58cfeb3385..000000000000 --- a/jps/plugins/gwt/src/org/jetbrains/jps/gwt/GwtModuleBuilderService.groovy +++ /dev/null @@ -1,15 +0,0 @@ -package org.jetbrains.jps.gwt - -import org.jetbrains.jps.builders.ModuleBuilderService -import org.jetbrains.jps.ProjectBuilder - -/** - * @author nik - */ -class GwtModuleBuilderService extends ModuleBuilderService { - @Override - registerBuilders(ProjectBuilder builder) { - builder.weavingBuilders << new GwtModuleBuilder() - } - -} diff --git a/jps/plugins/gwt/src/org/jetbrains/jps/gwt/GwtModuleUtil.groovy b/jps/plugins/gwt/src/org/jetbrains/jps/gwt/GwtModuleUtil.groovy deleted file mode 100644 index cd744b880ac6..000000000000 --- a/jps/plugins/gwt/src/org/jetbrains/jps/gwt/GwtModuleUtil.groovy +++ /dev/null @@ -1,21 +0,0 @@ -package org.jetbrains.jps.gwt - -import org.xml.sax.SAXParseException; - -/** - * @author nik - */ -class GwtModuleUtil { - public static boolean hasEntryPoints(File child) { - try { - def root = new XmlParser(false, false).parse(child) - return !root."entry-point".isEmpty() - } - catch (IOException e) { - return true; - } - catch (SAXParseException e) { - return true; - } - } -} diff --git a/jps/plugins/gwt/src/org/jetbrains/jps/gwt/GwtModulesSearcher.java b/jps/plugins/gwt/src/org/jetbrains/jps/gwt/GwtModulesSearcher.java deleted file mode 100644 index b1e7658e06df..000000000000 --- a/jps/plugins/gwt/src/org/jetbrains/jps/gwt/GwtModulesSearcher.java +++ /dev/null @@ -1,43 +0,0 @@ -package org.jetbrains.jps.gwt; - -import groovy.util.XmlParser; - -import java.io.File; -import java.util.ArrayList; -import java.util.List; - -/** - * @author nik - */ -public class GwtModulesSearcher { - private static final String GWT_XML_SUFFIX = ".gwt.xml"; - - public static List findGwtModules(List sourcePaths) { - final List result = new ArrayList(); - for (CharSequence sourcePath : sourcePaths) { - collectGwtModules(new File(sourcePath.toString()), "", result); - } - return result; - } - - private static void collectGwtModules(File dir, String packageName, List result) { - if (!dir.isDirectory()) { - return; - } - - final File[] files = dir.listFiles(); - if (files != null) { - for (File child : files) { - final String name = child.getName(); - if (child.isFile() && name.endsWith(GWT_XML_SUFFIX)) { - if (GwtModuleUtil.hasEntryPoints(child)) { - result.add(packageName + name.substring(0, name.length() - GWT_XML_SUFFIX.length())); - } - } - else { - collectGwtModules(child, packageName + name + ".", result); - } - } - } - } -} diff --git a/jps/plugins/gwt/testData/modules/com/app/App.gwt.xml b/jps/plugins/gwt/testData/modules/com/app/App.gwt.xml deleted file mode 100644 index d31f3637779f..000000000000 --- a/jps/plugins/gwt/testData/modules/com/app/App.gwt.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - diff --git a/jps/plugins/gwt/testData/modules/com/app/InvalidXml.gwt.xml b/jps/plugins/gwt/testData/modules/com/app/InvalidXml.gwt.xml deleted file mode 100644 index 4e87e20e57f4..000000000000 --- a/jps/plugins/gwt/testData/modules/com/app/InvalidXml.gwt.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - diff --git a/jps/plugins/gwt/testData/modules/com/app/NoEntryPoints.gwt.xml b/jps/plugins/gwt/testData/modules/com/app/NoEntryPoints.gwt.xml deleted file mode 100644 index 86a82eb089d4..000000000000 --- a/jps/plugins/gwt/testData/modules/com/app/NoEntryPoints.gwt.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - diff --git a/jps/plugins/gwt/testSrc/org/jetbrains/jps/gwt/GwtModulesSearcherTest.java b/jps/plugins/gwt/testSrc/org/jetbrains/jps/gwt/GwtModulesSearcherTest.java deleted file mode 100644 index 0375f1105c49..000000000000 --- a/jps/plugins/gwt/testSrc/org/jetbrains/jps/gwt/GwtModulesSearcherTest.java +++ /dev/null @@ -1,18 +0,0 @@ -package org.jetbrains.jps.gwt; - -import junit.framework.TestCase; - -import java.util.Arrays; -import java.util.HashSet; -import java.util.List; - -/** - * @author nik - */ -public class GwtModulesSearcherTest extends TestCase { - public void test() { - List modules = GwtModulesSearcher.findGwtModules(Arrays.asList("plugins/gwt/testData/modules")); - assertEquals(new HashSet(Arrays.asList("com.app.App", "com.app.InvalidXml")), - new HashSet(modules)); - } -} From 317b2e3d6b72b22280f291d63cf9669039d3e520 Mon Sep 17 00:00:00 2001 From: sweinreuter Date: Wed, 8 Feb 2012 16:19:16 +0100 Subject: [PATCH 179/215] IDEA-80760: XSLT forward referenced global variables and templates appear in IDEA as errors (2) --- .../xslt/context/XsltVariableContext.java | 28 +++++++++---------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/plugins/xpath/xpath-lang/src/org/intellij/lang/xpath/xslt/context/XsltVariableContext.java b/plugins/xpath/xpath-lang/src/org/intellij/lang/xpath/xslt/context/XsltVariableContext.java index e52487221e03..ff860ddc2e87 100644 --- a/plugins/xpath/xpath-lang/src/org/intellij/lang/xpath/xslt/context/XsltVariableContext.java +++ b/plugins/xpath/xpath-lang/src/org/intellij/lang/xpath/xslt/context/XsltVariableContext.java @@ -76,21 +76,21 @@ public class XsltVariableContext implements VariableContext { final ResolveProcessor processor = new ResolveProcessor(reference.getReferencedName(), context); final XPathVariable variable = (XPathVariable)ResolveUtil.treeWalkUp(processor, context); - if (variable == null) { - if (!processForwardGlobals(context, processor)) { - final XmlFile file = PsiTreeUtil.getParentOfType(context, XmlFile.class, true); - if (file != null) { - XsltIncludeIndex.processBackwardDependencies(file, new Processor() { - public boolean process(XmlFile xmlFile) { - processor.processExternalFile(xmlFile, context); - return processor.shouldContinue(); - } - }); - return (XPathVariable)processor.getResult(); - } + if (variable != null) { + return variable; + } + if (!processForwardGlobals(context, processor)) { + final XmlFile file = PsiTreeUtil.getParentOfType(context, XmlFile.class, true); + if (file != null) { + XsltIncludeIndex.processBackwardDependencies(file, new Processor() { + public boolean process(XmlFile xmlFile) { + processor.processExternalFile(xmlFile, context); + return processor.shouldContinue(); + } + }); } } - return variable; + return (XPathVariable)processor.getResult(); } private static boolean processForwardGlobals(XmlTag context, VariableProcessor processor) { @@ -101,7 +101,7 @@ public class XsltVariableContext implements VariableContext { processor.process(context); context = PsiTreeUtil.getNextSiblingOfType(context, XmlTag.class); } - return processor.shouldContinue(); + return !processor.shouldContinue(); } @Nullable From 94337dae20e2ddcc4687173f79b1fc212bd2c069 Mon Sep 17 00:00:00 2001 From: Roman Shevchenko Date: Wed, 8 Feb 2012 16:35:26 +0100 Subject: [PATCH 180/215] More detailed logging in test --- .../testSrc/org/jetbrains/ether/FieldPropertyTest.java | 4 ++-- .../testSrc/org/jetbrains/ether/IncrementalTestCase.java | 5 +++-- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/jps/jps-builders/testSrc/org/jetbrains/ether/FieldPropertyTest.java b/jps/jps-builders/testSrc/org/jetbrains/ether/FieldPropertyTest.java index 9355a4a554d1..8af0a272f344 100644 --- a/jps/jps-builders/testSrc/org/jetbrains/ether/FieldPropertyTest.java +++ b/jps/jps-builders/testSrc/org/jetbrains/ether/FieldPropertyTest.java @@ -77,10 +77,10 @@ public class FieldPropertyTest extends IncrementalTestCase { } public void testNonIncremental1() throws Exception { - doTest(); + doTest(); } public void testNonIncremental2() throws Exception { - doTest(); + doTest(); } } diff --git a/jps/jps-builders/testSrc/org/jetbrains/ether/IncrementalTestCase.java b/jps/jps-builders/testSrc/org/jetbrains/ether/IncrementalTestCase.java index 31e596cef0b7..1f8ad241d08c 100644 --- a/jps/jps-builders/testSrc/org/jetbrains/ether/IncrementalTestCase.java +++ b/jps/jps-builders/testSrc/org/jetbrains/ether/IncrementalTestCase.java @@ -20,7 +20,6 @@ import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.util.SystemInfo; import com.intellij.openapi.util.io.FileUtil; import junit.framework.TestCase; -import junitx.framework.FileAssert; import org.apache.log4j.Level; import org.apache.log4j.PropertyConfigurator; import org.jetbrains.annotations.NonNls; @@ -342,7 +341,9 @@ public abstract class IncrementalTestCase extends TestCase { new AllProjectScope(project, Collections.emptySet(), false), true, false ); - FileAssert.assertEquals(new File(getBaseDir() + ".log"), new File(getWorkDir() + ".log")); + final String expected = FileUtil.loadFile(new File(getBaseDir() + ".log")); + final String actual = FileUtil.loadFile(new File(getWorkDir() + ".log")); + assertEquals(expected, actual); } finally { projectDescriptor.release(); From 1d791510a0f1db735aff31d8c9fb58c11ccd0d1b Mon Sep 17 00:00:00 2001 From: Roman Shevchenko Date: Wed, 8 Feb 2012 16:59:49 +0100 Subject: [PATCH 181/215] Cleanup --- build/scripts/libLicenses.gant | 1 - 1 file changed, 1 deletion(-) diff --git a/build/scripts/libLicenses.gant b/build/scripts/libLicenses.gant index 518f2e35d473..b90f42d3b3b4 100644 --- a/build/scripts/libLicenses.gant +++ b/build/scripts/libLicenses.gant @@ -240,4 +240,3 @@ jetbrainsLibrary("JPS") jetbrainsLibrary("Maven Embedder") jetbrainsLibrary("tcServiceMessages") jetbrainsLibrary("optimizedFileManager.jar") -jetbrainsLibrary("RunTime") From 5ad9081b5ad5be9f8bd650372f8a04da83317fd7 Mon Sep 17 00:00:00 2001 From: Roman Shevchenko Date: Wed, 8 Feb 2012 17:18:01 +0100 Subject: [PATCH 182/215] On Unix, detect file modification by size in addition to timestamp --- .../openapi/vfs/newvfs/persistent/RefreshWorker.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/platform/platform-impl/src/com/intellij/openapi/vfs/newvfs/persistent/RefreshWorker.java b/platform/platform-impl/src/com/intellij/openapi/vfs/newvfs/persistent/RefreshWorker.java index 9360c401f53d..cbe973491f77 100644 --- a/platform/platform-impl/src/com/intellij/openapi/vfs/newvfs/persistent/RefreshWorker.java +++ b/platform/platform-impl/src/com/intellij/openapi/vfs/newvfs/persistent/RefreshWorker.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2011 JetBrains s.r.o. + * Copyright 2000-2012 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -15,6 +15,7 @@ */ package com.intellij.openapi.vfs.newvfs.persistent; +import com.intellij.openapi.util.SystemInfo; import com.intellij.openapi.vfs.VfsUtil; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.openapi.vfs.newvfs.ManagingFS; @@ -122,8 +123,10 @@ public class RefreshWorker { else { long currentTimestamp = persistence.getTimeStamp(file); long upToDateTimestamp = delegate.getTimeStamp(file); + long currentLength = SystemInfo.isUnix ? persistence.getLength(file) : -1; + long upToDateLength = SystemInfo.isUnix ? delegate.getLength(file) : -1; - if (currentTimestamp != upToDateTimestamp) { + if (currentTimestamp != upToDateTimestamp || currentLength != upToDateLength) { scheduleUpdateContent(file); } } From 7b6d2b007f87746ddd758b11af8b561bd6c593e9 Mon Sep 17 00:00:00 2001 From: Roman Shevchenko Date: Wed, 8 Feb 2012 17:51:23 +0100 Subject: [PATCH 183/215] Fix tests --- .../testSrc/org/jetbrains/ether/IncrementalTestCase.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/jps/jps-builders/testSrc/org/jetbrains/ether/IncrementalTestCase.java b/jps/jps-builders/testSrc/org/jetbrains/ether/IncrementalTestCase.java index 1f8ad241d08c..48ed13b9920e 100644 --- a/jps/jps-builders/testSrc/org/jetbrains/ether/IncrementalTestCase.java +++ b/jps/jps-builders/testSrc/org/jetbrains/ether/IncrementalTestCase.java @@ -19,6 +19,7 @@ import com.intellij.openapi.application.ex.PathManagerEx; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.util.SystemInfo; import com.intellij.openapi.util.io.FileUtil; +import com.intellij.openapi.util.text.StringUtil; import junit.framework.TestCase; import org.apache.log4j.Level; import org.apache.log4j.PropertyConfigurator; @@ -341,8 +342,8 @@ public abstract class IncrementalTestCase extends TestCase { new AllProjectScope(project, Collections.emptySet(), false), true, false ); - final String expected = FileUtil.loadFile(new File(getBaseDir() + ".log")); - final String actual = FileUtil.loadFile(new File(getWorkDir() + ".log")); + final String expected = StringUtil.convertLineSeparators(FileUtil.loadFile(new File(getBaseDir() + ".log"))); + final String actual = StringUtil.convertLineSeparators(FileUtil.loadFile(new File(getWorkDir() + ".log"))); assertEquals(expected, actual); } finally { From 4c7e3a9fb01bf2a29b2824d8eb43fcbb2dd14d77 Mon Sep 17 00:00:00 2001 From: peter Date: Tue, 7 Feb 2012 17:44:12 +0100 Subject: [PATCH 184/215] minor --- ...erenceExpressionCompletionContributor.java | 22 +++++++++++-------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/java/java-impl/src/com/intellij/codeInsight/completion/ReferenceExpressionCompletionContributor.java b/java/java-impl/src/com/intellij/codeInsight/completion/ReferenceExpressionCompletionContributor.java index 277188306be0..8e5749cc746e 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/ReferenceExpressionCompletionContributor.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/ReferenceExpressionCompletionContributor.java @@ -419,13 +419,24 @@ public class ReferenceExpressionCompletionContributor { final Consumer result, PsiType qualifierType, final PsiType expectedType, JavaSmartCompletionParameters parameters) throws IncorrectOperationException { + final PsiReferenceExpression mockRef = createMockReference(place, qualifierType); + + final ElementFilter filter = getReferenceFilter(place, true); + for (final LookupElement item : completeFinalReference(place, mockRef, filter, parameters)) { + if (shoudChain(place, qualifierType, expectedType, item)) { + result.consume(new JavaChainLookupElement(qualifierItem, item)); + } + } + } + + private static PsiReferenceExpression createMockReference(PsiElement place, PsiType qualifierType) { final JavaCodeFragmentFactory factory = JavaCodeFragmentFactory.getInstance(place.getProject()); PsiType varType = qualifierType; if (varType instanceof PsiEllipsisType) { varType = ((PsiEllipsisType)varType).getComponentType(); } if (varType instanceof PsiWildcardType || varType instanceof PsiCapturedWildcardType) { - varType = TypeConversionUtil.erasure(expectedType); + varType = TypeConversionUtil.erasure(varType); } final String typeText = varType.getCanonicalText(); @@ -435,14 +446,7 @@ public class ReferenceExpressionCompletionContributor { LOG.error(typeText + " of " + varType.getClass()); } final PsiExpressionStatement expressionStatement = (PsiExpressionStatement)secondChild; - final PsiReferenceExpression mockRef = (PsiReferenceExpression) expressionStatement.getExpression(); - - final ElementFilter filter = getReferenceFilter(place, true); - for (final LookupElement item : completeFinalReference(place, mockRef, filter, parameters)) { - if (shoudChain(place, varType, expectedType, item)) { - result.consume(new JavaChainLookupElement(qualifierItem, item)); - } - } + return (PsiReferenceExpression) expressionStatement.getExpression(); } private static boolean shoudChain(PsiElement element, PsiType qualifierType, PsiType expectedType, LookupElement item) { From 979191114eafde2eab7b21ce732ec9f6e97fdfc1 Mon Sep 17 00:00:00 2001 From: peter Date: Tue, 7 Feb 2012 18:38:51 +0100 Subject: [PATCH 185/215] IDEA-58766 Recognize dot as completion prefix part for chained call suggestions --- .../JavaClassNameCompletionContributor.java | 7 +- .../completion/JavaCompletionContributor.java | 4 +- .../completion/JavaNoVariantsDelegator.java | 98 +++++++++++++++---- .../JavaSmartCompletionContributor.java | 29 ++++-- ...erenceExpressionCompletionContributor.java | 14 ++- .../completion/JavaAutoPopupTest.groovy | 12 +++ .../completion/CompletionParameters.java | 4 + 7 files changed, 131 insertions(+), 37 deletions(-) diff --git a/java/java-impl/src/com/intellij/codeInsight/completion/JavaClassNameCompletionContributor.java b/java/java-impl/src/com/intellij/codeInsight/completion/JavaClassNameCompletionContributor.java index 18ef89056b04..9015b4cb13c6 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/JavaClassNameCompletionContributor.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/JavaClassNameCompletionContributor.java @@ -57,7 +57,8 @@ public class JavaClassNameCompletionContributor extends CompletionContributor { } CompletionResultSet result = _result.withPrefixMatcher(CompletionUtil.findReferenceOrAlphanumericPrefix(parameters)); - addAllClasses(parameters, JavaCompletionSorting.addJavaSorting(parameters, result), parameters.getInvocationCount() <= 1, new Consumer() { + addAllClasses(parameters, parameters.getInvocationCount() <= 1, + JavaCompletionSorting.addJavaSorting(parameters, result).getPrefixMatcher(), new Consumer() { @Override public void consume(LookupElement element) { _result.addElement(element); @@ -68,8 +69,8 @@ public class JavaClassNameCompletionContributor extends CompletionContributor { } public static void addAllClasses(CompletionParameters parameters, - final CompletionResultSet result, final boolean filterByScope, + @NotNull final PrefixMatcher matcher, @NotNull final Consumer consumer) { final PsiElement insertedElement = parameters.getPosition(); @@ -110,7 +111,7 @@ public class JavaClassNameCompletionContributor extends CompletionContributor { } final boolean lookingForAnnotations = PsiJavaPatterns.psiElement().afterLeaf("@").accepts(insertedElement); - AllClassesGetter.processJavaClasses(parameters, result.getPrefixMatcher(), filterByScope, new Consumer() { + AllClassesGetter.processJavaClasses(parameters, matcher, filterByScope, new Consumer() { @Override public void consume(PsiClass psiClass) { if (lookingForAnnotations && !psiClass.isAnnotationType()) return; diff --git a/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionContributor.java b/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionContributor.java index 30f5c20fbef8..499040da4f31 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionContributor.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionContributor.java @@ -106,7 +106,7 @@ public class JavaCompletionContributor extends CompletionContributor { withParent(or(psiElement(PsiResourceVariable.class), psiElement(PsiResourceList.class))))); @Nullable - private static ElementFilter getReferenceFilter(PsiElement position) { + public static ElementFilter getReferenceFilter(PsiElement position) { // Completion after extends in interface, type parameter and implements in class final PsiClass containingClass = PsiTreeUtil.getParentOfType(position, PsiClass.class, false, PsiCodeBlock.class, PsiMethod.class, PsiExpressionList.class, PsiVariable.class); if (containingClass != null && psiElement().afterLeaf(PsiKeyword.EXTENDS, PsiKeyword.IMPLEMENTS, ",", "&").accepts(position)) { @@ -239,7 +239,7 @@ public class JavaCompletionContributor extends CompletionContributor { if (!isClassNamePossible(parameters.getPosition()) || !mayStartClassName(result, parameters.isRelaxedMatching())) return; if (mayShowAllClasses(parameters)) { - JavaClassNameCompletionContributor.addAllClasses(parameters, result, parameters.getInvocationCount() <= 2, new Consumer() { + JavaClassNameCompletionContributor.addAllClasses(parameters, parameters.getInvocationCount() <= 2, result.getPrefixMatcher(), new Consumer() { @Override public void consume(LookupElement element) { if (!inheritors.alreadyProcessed(element)) { diff --git a/java/java-impl/src/com/intellij/codeInsight/completion/JavaNoVariantsDelegator.java b/java/java-impl/src/com/intellij/codeInsight/completion/JavaNoVariantsDelegator.java index 9dcfb4a9f016..bdba7750740f 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/JavaNoVariantsDelegator.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/JavaNoVariantsDelegator.java @@ -15,10 +15,21 @@ */ package com.intellij.codeInsight.completion; +import com.intellij.codeInsight.completion.impl.CamelHumpMatcher; import com.intellij.codeInsight.lookup.AutoCompletionPolicy; import com.intellij.codeInsight.lookup.LookupElement; +import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiJavaCodeReferenceElement; +import com.intellij.psi.PsiReferenceExpression; +import com.intellij.psi.PsiType; +import com.intellij.psi.filters.ElementFilter; +import com.intellij.util.CollectConsumer; import com.intellij.util.Consumer; +import java.util.Collections; +import java.util.LinkedHashSet; +import java.util.Set; + /** * @author peter */ @@ -26,29 +37,80 @@ public class JavaNoVariantsDelegator extends NoVariantsDelegator { @Override protected void delegate(CompletionParameters parameters, CompletionResultSet result, Consumer passResult) { - if (parameters.getCompletionType() == CompletionType.BASIC && - parameters.getInvocationCount() <= 1 && - JavaCompletionContributor.mayStartClassName(result, false) && - JavaCompletionContributor.isClassNamePossible(parameters.getPosition())) { - final ClassByNameMerger merger = new ClassByNameMerger(parameters.getInvocationCount() == 0, result); + if (parameters.getCompletionType() == CompletionType.BASIC) { + PsiElement position = parameters.getPosition(); + if (parameters.getInvocationCount() <= 1 && + JavaCompletionContributor.mayStartClassName(result, false) && + JavaCompletionContributor.isClassNamePossible(position)) { + suggestNonImportedClasses(parameters, result); + return; + } - JavaClassNameCompletionContributor.addAllClasses(parameters, JavaCompletionSorting.addJavaSorting(parameters, result), - true, new Consumer() { - @Override - public void consume(LookupElement element) { - JavaPsiClassReferenceElement classElement = element.as(JavaPsiClassReferenceElement.CLASS_CONDITION_KEY); - if (classElement != null) { - classElement.setAutoCompletionPolicy(AutoCompletionPolicy.NEVER_AUTOCOMPLETE); + PsiElement parent = position.getParent(); + if (parent instanceof PsiJavaCodeReferenceElement) { + PsiElement qualifier = ((PsiJavaCodeReferenceElement)parent).getQualifier(); + if (qualifier instanceof PsiJavaCodeReferenceElement && + !((PsiJavaCodeReferenceElement)qualifier).isQualified() && + ((PsiJavaCodeReferenceElement)qualifier).resolve() == null) { + CompletionResultSet qualifiedCollector = result.withPrefixMatcher(position.getContainingFile().getText().substring(parent.getTextRange().getStartOffset(), parameters.getOffset())); + ElementFilter filter = JavaCompletionContributor.getReferenceFilter(position); + for (LookupElement base : suggestQualifierItems(parameters, result, (PsiJavaCodeReferenceElement)qualifier, filter)) { + PsiType type = JavaCompletionUtil.getLookupElementType(base); + if (type != null) { + PsiReferenceExpression ref = ReferenceExpressionCompletionContributor.createMockReference(position, type, base); + for (final LookupElement item : JavaSmartCompletionContributor.completeReference(position, ref, filter, true, true, parameters, + result.getPrefixMatcher())) { + qualifiedCollector.addElement(new JavaChainLookupElement(base, item)); + } + } } - - merger.consume(classElement); } - }); + } + } - merger.finishedClassProcessing(); - - } else if (parameters.getCompletionType() == CompletionType.SMART && parameters.getInvocationCount() == 2) { + if (parameters.getCompletionType() == CompletionType.SMART && parameters.getInvocationCount() == 2) { result.runRemainingContributors(parameters.withInvocationCount(3), passResult); } } + + private static Set suggestQualifierItems(CompletionParameters parameters, + CompletionResultSet result, + PsiJavaCodeReferenceElement qualifier, + ElementFilter filter) { + String referenceName = qualifier.getReferenceName(); + if (referenceName == null) { + return Collections.emptySet(); + } + + PrefixMatcher qMatcher = new CamelHumpMatcher(referenceName); + Set plainVariants = + JavaSmartCompletionContributor.completeReference(qualifier, qualifier, filter, true, true, parameters, qMatcher); + if (!plainVariants.isEmpty()) { + return plainVariants; + } + + final Set allClasses = new LinkedHashSet(); + JavaClassNameCompletionContributor.addAllClasses(parameters.withPosition(qualifier.getReferenceNameElement(), qualifier.getTextRange().getEndOffset()), + true, qMatcher, new CollectConsumer(allClasses)); + return allClasses; + } + + private static void suggestNonImportedClasses(CompletionParameters parameters, CompletionResultSet result) { + final ClassByNameMerger merger = new ClassByNameMerger(parameters.getInvocationCount() == 0, result); + + JavaClassNameCompletionContributor.addAllClasses(parameters, + true, JavaCompletionSorting.addJavaSorting(parameters, result).getPrefixMatcher(), new Consumer() { + @Override + public void consume(LookupElement element) { + JavaPsiClassReferenceElement classElement = element.as(JavaPsiClassReferenceElement.CLASS_CONDITION_KEY); + if (classElement != null) { + classElement.setAutoCompletionPolicy(AutoCompletionPolicy.NEVER_AUTOCOMPLETE); + } + + merger.consume(classElement); + } + }); + + merger.finishedClassProcessing(); + } } diff --git a/java/java-impl/src/com/intellij/codeInsight/completion/JavaSmartCompletionContributor.java b/java/java-impl/src/com/intellij/codeInsight/completion/JavaSmartCompletionContributor.java index 649a4ed6e7ff..e4825f5781f2 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/JavaSmartCompletionContributor.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/JavaSmartCompletionContributor.java @@ -155,14 +155,15 @@ public class JavaSmartCompletionContributor extends CompletionContributor { final ElementFilter filter = getReferenceFilter(element); if (filter != null) { final List infos = Arrays.asList(getExpectedTypes(parameters)); - for (final LookupElement item : completeReference(element, reference, filter, true, parameters)) { + for (final LookupElement item : completeReference(element, reference, filter, true, false, parameters, result.getPrefixMatcher())) { if (item.getObject() instanceof PsiClass) { result.addElement(decorate(LookupElementDecorator.withInsertHandler((LookupItem)item, ConstructorInsertHandler.SMART_INSTANCE), infos)); } } } else if (INSIDE_TYPECAST_EXPRESSION.accepts(element)) { - for (final LookupElement item : completeReference(element, reference, new GeneratorFilter(AssignableToFilter.class, new CastTypeGetter()), false, parameters)) { + for (final LookupElement item : completeReference(element, reference, new GeneratorFilter(AssignableToFilter.class, new CastTypeGetter()), false, true, parameters, + result.getPrefixMatcher())) { result.addElement(item); } } @@ -182,7 +183,7 @@ public class JavaSmartCompletionContributor extends CompletionContributor { final PsiElement element = parameters.getPosition(); final PsiReference reference = element.getContainingFile().findReferenceAt(parameters.getOffset()); assert reference != null; - for (final LookupElement item : completeReference(element, reference, THROWABLES_FILTER, true, parameters)) { + for (final LookupElement item : completeReference(element, reference, THROWABLES_FILTER, true, false, parameters, result.getPrefixMatcher())) { result.addElement(item); } } @@ -456,7 +457,12 @@ public class JavaSmartCompletionContributor extends CompletionContributor { return ExpectedTypesProvider.getExpectedTypes(expression, true, parameters.getCompletionType() == CompletionType.SMART, false); } - static Set completeReference(final PsiElement element, PsiReference reference, final ElementFilter filter, final boolean acceptClasses, CompletionParameters parameters) { + static Set completeReference(final PsiElement element, + PsiReference reference, + final ElementFilter filter, + final boolean acceptClasses, + final boolean acceptMembers, + CompletionParameters parameters, @Nullable final PrefixMatcher matcher) { if (reference instanceof PsiMultiReference) { reference = ContainerUtil.findInstance(((PsiMultiReference) reference).getReferences(), PsiJavaReference.class); } @@ -470,15 +476,18 @@ public class JavaSmartCompletionContributor extends CompletionContributor { } public boolean isClassAcceptable(Class hintClass) { - if (acceptClasses) { - return ReflectionCache.isAssignable(PsiClass.class, hintClass); + if (ReflectionCache.isAssignable(PsiClass.class, hintClass)) { + return acceptClasses; } - return ReflectionCache.isAssignable(PsiVariable.class, hintClass) || - ReflectionCache.isAssignable(PsiMethod.class, hintClass) || - ReflectionCache.isAssignable(CandidateInfo.class, hintClass); + if (ReflectionCache.isAssignable(PsiVariable.class, hintClass) || + ReflectionCache.isAssignable(PsiMethod.class, hintClass) || + ReflectionCache.isAssignable(CandidateInfo.class, hintClass)) { + return acceptMembers; + } + return false; } - }, true, parameters.getInvocationCount() <= 1, null, parameters); + }, true, parameters.getInvocationCount() <= 1, matcher, parameters); } return Collections.emptySet(); diff --git a/java/java-impl/src/com/intellij/codeInsight/completion/ReferenceExpressionCompletionContributor.java b/java/java-impl/src/com/intellij/codeInsight/completion/ReferenceExpressionCompletionContributor.java index 8e5749cc746e..e9559a88292f 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/ReferenceExpressionCompletionContributor.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/ReferenceExpressionCompletionContributor.java @@ -122,7 +122,7 @@ public class ReferenceExpressionCompletionContributor { final boolean secondTime = parameters.getParameters().getInvocationCount() >= 2; final Set base = - JavaSmartCompletionContributor.completeReference(element, reference, filter, false, parameters.getParameters()); + JavaSmartCompletionContributor.completeReference(element, reference, filter, false, true, parameters.getParameters(), null); for (final LookupElement item : base) { addSingleArrayElementAccess(element, item, parameters, result); } @@ -177,7 +177,7 @@ public class ReferenceExpressionCompletionContributor { public boolean isClassAcceptable(Class hintClass) { return true; } - }), false, parameters.getParameters()); + }), false, true, parameters.getParameters(), null); for (LookupElement lookupElement : elements) { if (lookupElement.getObject() instanceof PsiMethod) { final JavaMethodCallElement item = lookupElement.as(JavaMethodCallElement.CLASS_CONDITION_KEY); @@ -419,7 +419,7 @@ public class ReferenceExpressionCompletionContributor { final Consumer result, PsiType qualifierType, final PsiType expectedType, JavaSmartCompletionParameters parameters) throws IncorrectOperationException { - final PsiReferenceExpression mockRef = createMockReference(place, qualifierType); + final PsiReferenceExpression mockRef = createMockReference(place, qualifierType, qualifierItem); final ElementFilter filter = getReferenceFilter(place, true); for (final LookupElement item : completeFinalReference(place, mockRef, filter, parameters)) { @@ -429,7 +429,13 @@ public class ReferenceExpressionCompletionContributor { } } - private static PsiReferenceExpression createMockReference(PsiElement place, PsiType qualifierType) { + public static PsiReferenceExpression createMockReference(PsiElement place, @NotNull PsiType qualifierType, LookupElement qualifierItem) { + if (qualifierItem.getObject() instanceof PsiClass) { + return (PsiReferenceExpression)JavaPsiFacade.getElementFactory(place.getProject()) + .createExpressionFromText(((PsiClass)qualifierItem.getObject()).getQualifiedName() + ".xxx", place); + + } + final JavaCodeFragmentFactory factory = JavaCodeFragmentFactory.getInstance(place.getProject()); PsiType varType = qualifierType; if (varType instanceof PsiEllipsisType) { diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/completion/JavaAutoPopupTest.groovy b/java/java-tests/testSrc/com/intellij/codeInsight/completion/JavaAutoPopupTest.groovy index 6d46ad532c64..47542b0b1266 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/completion/JavaAutoPopupTest.groovy +++ b/java/java-tests/testSrc/com/intellij/codeInsight/completion/JavaAutoPopupTest.groovy @@ -1221,4 +1221,16 @@ class Foo {{ myFixture.checkResult 'class Foo { int foo() { re() }}' } + public void testAmbiguousClassQualifier() { + myFixture.addClass("package foo; public class Util { public static void foo() {} }") + myFixture.addClass("package bar; public class Util { public static void bar() {} }") + myFixture.configureByText 'a.java', 'class Foo {{ }}' + type 'Util.' + assert myFixture.lookupElementStrings == ['Util.bar', 'Util.foo'] + type 'fo\n' + myFixture.checkResult '''import foo.Util; + +class Foo {{ Util.foo(); }}''' + } + } diff --git a/platform/lang-api/src/com/intellij/codeInsight/completion/CompletionParameters.java b/platform/lang-api/src/com/intellij/codeInsight/completion/CompletionParameters.java index b7ac712d6767..56eb0c10af62 100644 --- a/platform/lang-api/src/com/intellij/codeInsight/completion/CompletionParameters.java +++ b/platform/lang-api/src/com/intellij/codeInsight/completion/CompletionParameters.java @@ -100,4 +100,8 @@ public class CompletionParameters { public boolean isRelaxedMatching() { return myRelaxedMatching; } + + public CompletionParameters withPosition(PsiElement element, int offset) { + return new CompletionParameters(element, myOriginalFile, myCompletionType, offset, myInvocationCount, myLookup, myRelaxedMatching); + } } From 3ac3fb5e95eef3f6fcc1f3e3e830f91d32ab60b6 Mon Sep 17 00:00:00 2001 From: peter Date: Tue, 7 Feb 2012 19:11:09 +0100 Subject: [PATCH 186/215] don't filter out DefaultGroovyMethods, move them to the bottom instead --- .../GroovyCompletionContributor.java | 82 +++++++------------ .../GrCompletionWithLibraryTest.groovy | 62 +++++++++++++- .../completion/GroovyCompletionTest.groovy | 12 +-- .../dsl/GroovyTransformationsTest.groovy | 2 +- 4 files changed, 92 insertions(+), 66 deletions(-) diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/completion/GroovyCompletionContributor.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/completion/GroovyCompletionContributor.java index 0b133fffb90b..45ecbc716a4f 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/completion/GroovyCompletionContributor.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/completion/GroovyCompletionContributor.java @@ -45,7 +45,6 @@ import com.intellij.util.PairConsumer; import com.intellij.util.ProcessingContext; import gnu.trove.THashSet; import org.jetbrains.annotations.NotNull; -import org.jetbrains.plugins.groovy.GroovyBundle; import org.jetbrains.plugins.groovy.lang.psi.GrReferenceElement; import org.jetbrains.plugins.groovy.lang.psi.GroovyFile; import org.jetbrains.plugins.groovy.lang.psi.GroovyPsiElementFactory; @@ -417,15 +416,6 @@ public class GroovyCompletionContributor extends CompletionContributor { GroovySmartCompletionContributor.generateInheritorVariants(parameters, result.getPrefixMatcher(), inheritorsHolder); } - final int invocationCount = parameters.getInvocationCount(); - final boolean firstCompletionInvoked = invocationCount < 2; - - final String prefix = result.getPrefixMatcher().getPrefix(); - final boolean skipAccessors = firstCompletionInvoked && !prefix.startsWith("g") && !prefix.startsWith("s") && !prefix.startsWith("i"); - result.restartCompletionOnPrefixChange("g"); - result.restartCompletionOnPrefixChange("i"); - result.restartCompletionOnPrefixChange("s"); - final Map staticMembers = hashMap(); final PsiElement qualifier = reference.getQualifier(); final PsiType qualifierType = qualifier instanceof GrExpression ? ((GrExpression)qualifier).getType() : null; @@ -445,7 +435,7 @@ public class GroovyCompletionContributor extends CompletionContributor { element = ((LookupElement)element).getObject(); } - final LookupElement lookupElement = element instanceof PsiClass + LookupElement lookupElement = element instanceof PsiClass ? GroovyCompletionUtil.createClassLookupItem(CompletionUtil.getOriginalOrSelf((PsiClass)element)) : GroovyCompletionUtil.getLookupElement(element); Object object = lookupElement.getObject(); @@ -460,45 +450,8 @@ public class GroovyCompletionContributor extends CompletionContributor { if (object instanceof PsiMember && JavaCompletionUtil.isInExcludedPackage((PsiMember)object, true)) { return; } + lookupElement = tweakPriority(lookupElement, object, substitutor, resolveResult, qualifierType); - final boolean autopopup = parameters.getInvocationCount() == 0; - //skip default groovy methods - if (firstCompletionInvoked && - object instanceof GrGdkMethod && - GroovyCompletionUtil.skipDefGroovyMethod((GrGdkMethod)object, substitutor, qualifierType)) { - if (!autopopup) { - showInfo(); - } - return; - } - - //skip operator methods - if (firstCompletionInvoked && - object instanceof PsiMethod && - GroovyCompletionUtil.OPERATOR_METHOD_NAMES.contains(((PsiMethod)object).getName())) { - if (!checkForIterator((PsiMethod)object)) { - if (!autopopup) { - showInfo(); - } - return; - } - } - - //skip accessors if there is no get, set, is prefix - if (skipAccessors && object instanceof PsiMethod && GroovyPropertyUtils.isSimplePropertyAccessor((PsiMethod)object)) { - if (!autopopup) { - showInfo(); - } - return; - } - - //skip inaccessible elements - if (firstCompletionInvoked && resolveResult != null && !resolveResult.isAccessible()) { - if (!autopopup) { - showInfo(); - } - return; - } if ((object instanceof PsiMethod || object instanceof PsiField) && ((PsiModifierListOwner)object).hasModifierProperty(PsiModifier.STATIC)) { @@ -545,11 +498,34 @@ public class GroovyCompletionContributor extends CompletionContributor { return InheritanceUtil.isInheritorOrSelf(containingClass, iterator, true); } - private static void showInfo() { - if (StringUtil.isEmpty(CompletionService.getCompletionService().getAdvertisementText())) { - CompletionService.getCompletionService() - .setAdvertisementText(GroovyBundle.message("invoke.completion.second.time.to.show.skipped.methods")); + + private static LookupElement tweakPriority(LookupElement lookupElement, + Object object, + PsiSubstitutor substitutor, + GroovyResolveResult resolveResult, + PsiType qualifierType) { + // default groovy methods + if (object instanceof GrGdkMethod && + GroovyCompletionUtil.skipDefGroovyMethod((GrGdkMethod)object, substitutor, qualifierType)) { + return PrioritizedLookupElement.withPriority(lookupElement, -1); } + + // operator methods + if (object instanceof PsiMethod && + GroovyCompletionUtil.OPERATOR_METHOD_NAMES.contains(((PsiMethod)object).getName()) && !checkForIterator((PsiMethod)object)) { + return PrioritizedLookupElement.withPriority(lookupElement, -3); + } + + // accessors if there is no get, set, is prefix + if (object instanceof PsiMethod && GroovyPropertyUtils.isSimplePropertyAccessor((PsiMethod)object)) { + return PrioritizedLookupElement.withPriority(lookupElement, -1); + } + + // inaccessible elements + if (resolveResult != null && !resolveResult.isAccessible()) { + return PrioritizedLookupElement.withPriority(lookupElement, -2); + } + return lookupElement; } static StaticMemberProcessor completeStaticMembers(CompletionParameters parameters) { diff --git a/plugins/groovy/test/org/jetbrains/plugins/groovy/completion/GrCompletionWithLibraryTest.groovy b/plugins/groovy/test/org/jetbrains/plugins/groovy/completion/GrCompletionWithLibraryTest.groovy index fbdb4e312da7..1c6f897345d6 100644 --- a/plugins/groovy/test/org/jetbrains/plugins/groovy/completion/GrCompletionWithLibraryTest.groovy +++ b/plugins/groovy/test/org/jetbrains/plugins/groovy/completion/GrCompletionWithLibraryTest.groovy @@ -170,7 +170,67 @@ toString wait wait wait -with\ +with +getThisProp +setThisProp +getSuperProp +setSuperProp +addShutdownHook +any +any +asBoolean +asType +collect +collect +dump +each +eachWithIndex +every +every +find +findAll +findIndexOf +findIndexOf +findIndexValues +findIndexValues +findLastIndexOf +findLastIndexOf +getAt +getClass +getMetaClass +getMetaPropertyValues +getProperties +grep +hasPerInstanceMetaClass +hasProperty +identity +inject +inspect +is +isCase +iterator +metaClass +primitiveArrayGet +primitiveArrayGet +primitiveArrayGet +primitiveArrayPut +print +print +printf +printf +println +println +println +putAt +respondsTo +respondsTo +setMetaClass +split +sprintf +sprintf +use +use +use\ """.split('\n') } diff --git a/plugins/groovy/test/org/jetbrains/plugins/groovy/completion/GroovyCompletionTest.groovy b/plugins/groovy/test/org/jetbrains/plugins/groovy/completion/GroovyCompletionTest.groovy index 94794bebd83b..c8ac6a4b037c 100644 --- a/plugins/groovy/test/org/jetbrains/plugins/groovy/completion/GroovyCompletionTest.groovy +++ b/plugins/groovy/test/org/jetbrains/plugins/groovy/completion/GroovyCompletionTest.groovy @@ -891,16 +891,6 @@ class B extends A { checkCompletion "assex", ' ', 'assert x' } - public void testDontShowAccessors() { - assertNull doContainsTest("getFoo", """ -class MyClass { - def foo -} - -def a = new MyClass() -a.""") - } - public void testPreferInstanceof() { caseSensitiveNone() @@ -1072,7 +1062,7 @@ class X { } public void testSortOrder0() { - doVariantableTest 'se', 'setMetaClass', 'setProperty', 'setSe' + doVariantableTest 'se', 'setProperty', 'setMetaClass', 'setSe' } public void testPrimitiveCastOverwrite() { diff --git a/plugins/groovy/test/org/jetbrains/plugins/groovy/dsl/GroovyTransformationsTest.groovy b/plugins/groovy/test/org/jetbrains/plugins/groovy/dsl/GroovyTransformationsTest.groovy index a46a38e51faa..0228220fa5ea 100644 --- a/plugins/groovy/test/org/jetbrains/plugins/groovy/dsl/GroovyTransformationsTest.groovy +++ b/plugins/groovy/test/org/jetbrains/plugins/groovy/dsl/GroovyTransformationsTest.groovy @@ -50,7 +50,7 @@ class GroovyTransformationsTest extends LightCodeInsightFixtureTestCase { public void testVetoableTransform() throws Throwable { doPlainTest() } - public void testNewifyTransform1() throws Throwable { doVariantsTest('newInstance', 'new', 'new', 'newInstance') } + public void testNewifyTransform1() throws Throwable { doVariantsTest('newInstance', 'new', 'new', 'newInstance', 'negative', 'next') } public void testNewifyTransform2() throws Throwable { doVariantsTest('Leaf', 'Leaf', 'Leaf') } From 55ebfba51f6a1e31701b6d6b6e3bef1fce683e9b Mon Sep 17 00:00:00 2001 From: peter Date: Tue, 7 Feb 2012 19:18:23 +0100 Subject: [PATCH 187/215] minor --- .../completion/JavaNoVariantsDelegator.java | 49 +++++++++++-------- 1 file changed, 28 insertions(+), 21 deletions(-) diff --git a/java/java-impl/src/com/intellij/codeInsight/completion/JavaNoVariantsDelegator.java b/java/java-impl/src/com/intellij/codeInsight/completion/JavaNoVariantsDelegator.java index bdba7750740f..a70318059c7c 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/JavaNoVariantsDelegator.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/JavaNoVariantsDelegator.java @@ -46,26 +46,7 @@ public class JavaNoVariantsDelegator extends NoVariantsDelegator { return; } - PsiElement parent = position.getParent(); - if (parent instanceof PsiJavaCodeReferenceElement) { - PsiElement qualifier = ((PsiJavaCodeReferenceElement)parent).getQualifier(); - if (qualifier instanceof PsiJavaCodeReferenceElement && - !((PsiJavaCodeReferenceElement)qualifier).isQualified() && - ((PsiJavaCodeReferenceElement)qualifier).resolve() == null) { - CompletionResultSet qualifiedCollector = result.withPrefixMatcher(position.getContainingFile().getText().substring(parent.getTextRange().getStartOffset(), parameters.getOffset())); - ElementFilter filter = JavaCompletionContributor.getReferenceFilter(position); - for (LookupElement base : suggestQualifierItems(parameters, result, (PsiJavaCodeReferenceElement)qualifier, filter)) { - PsiType type = JavaCompletionUtil.getLookupElementType(base); - if (type != null) { - PsiReferenceExpression ref = ReferenceExpressionCompletionContributor.createMockReference(position, type, base); - for (final LookupElement item : JavaSmartCompletionContributor.completeReference(position, ref, filter, true, true, parameters, - result.getPrefixMatcher())) { - qualifiedCollector.addElement(new JavaChainLookupElement(base, item)); - } - } - } - } - } + suggestChainedCalls(parameters, result, position); } if (parameters.getCompletionType() == CompletionType.SMART && parameters.getInvocationCount() == 2) { @@ -73,8 +54,34 @@ public class JavaNoVariantsDelegator extends NoVariantsDelegator { } } + private static void suggestChainedCalls(CompletionParameters parameters, CompletionResultSet result, PsiElement position) { + PsiElement parent = position.getParent(); + if (!(parent instanceof PsiJavaCodeReferenceElement)) { + return; + } + PsiElement qualifier = ((PsiJavaCodeReferenceElement)parent).getQualifier(); + if (!(qualifier instanceof PsiJavaCodeReferenceElement) || + ((PsiJavaCodeReferenceElement)qualifier).isQualified() || + ((PsiJavaCodeReferenceElement)qualifier).resolve() != null) { + return; + } + + String fullPrefix = position.getContainingFile().getText().substring(parent.getTextRange().getStartOffset(), parameters.getOffset()); + CompletionResultSet qualifiedCollector = result.withPrefixMatcher(fullPrefix); + ElementFilter filter = JavaCompletionContributor.getReferenceFilter(position); + for (LookupElement base : suggestQualifierItems(parameters, (PsiJavaCodeReferenceElement)qualifier, filter)) { + PsiType type = JavaCompletionUtil.getLookupElementType(base); + if (type != null && !PsiType.VOID.equals(type)) { + PsiReferenceExpression ref = ReferenceExpressionCompletionContributor.createMockReference(position, type, base); + for (final LookupElement item : JavaSmartCompletionContributor.completeReference(position, ref, filter, true, true, parameters, + result.getPrefixMatcher())) { + qualifiedCollector.addElement(new JavaChainLookupElement(base, item)); + } + } + } + } + private static Set suggestQualifierItems(CompletionParameters parameters, - CompletionResultSet result, PsiJavaCodeReferenceElement qualifier, ElementFilter filter) { String referenceName = qualifier.getReferenceName(); From 19593a00497f01cf77edd431267d9861b9256725 Mon Sep 17 00:00:00 2001 From: peter Date: Tue, 7 Feb 2012 19:46:43 +0100 Subject: [PATCH 188/215] minor refactoring --- .../GroovyCompletionContributor.java | 56 ++++++++++++------- 1 file changed, 35 insertions(+), 21 deletions(-) diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/completion/GroovyCompletionContributor.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/completion/GroovyCompletionContributor.java index 45ecbc716a4f..ddf92e0f0aeb 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/completion/GroovyCompletionContributor.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/completion/GroovyCompletionContributor.java @@ -45,6 +45,7 @@ import com.intellij.util.PairConsumer; import com.intellij.util.ProcessingContext; import gnu.trove.THashSet; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import org.jetbrains.plugins.groovy.lang.psi.GrReferenceElement; import org.jetbrains.plugins.groovy.lang.psi.GroovyFile; import org.jetbrains.plugins.groovy.lang.psi.GroovyPsiElementFactory; @@ -309,21 +310,26 @@ public class GroovyCompletionContributor extends CompletionContributor { addUnfinishedMethodTypeParameters(position, result); - final PsiElement parent = position.getParent(); - GrReferenceElement reference; - if (parent instanceof GrReferenceElement) { - reference = (GrReferenceElement)parent; - if (reference.getParent() instanceof GrImportStatement && reference.getQualifier() != null) { - result.addElement(LookupElementBuilder.create("*")); - } - } else if (couldContainReference(position)) { - reference = GroovyPsiElementFactory.getInstance(position.getProject()).createReferenceElementFromText("Foo", position); - } else { + GrReferenceElement reference = findGroovyReference(position); + if (reference == null) { return; } + if (reference.getParent() instanceof GrImportStatement && reference.getQualifier() != null) { + result.addElement(LookupElementBuilder.create("*")); + } + InheritorsHolder inheritors = new InheritorsHolder(position, result); - completeReference(parameters, result, reference, inheritors); + if (GroovySmartCompletionContributor.AFTER_NEW.accepts(position)) { + GroovySmartCompletionContributor.generateInheritorVariants(parameters, result.getPrefixMatcher(), inheritors); + } + + completeReference(parameters, reference, inheritors, result.getPrefixMatcher(), new Consumer() { + @Override + public void consume(LookupElement element) { + result.addElement(element); + } + }); if (reference.getQualifier() == null) { GroovySmartCompletionContributor.addExpectedClassMembers(parameters, result); @@ -360,6 +366,17 @@ public class GroovyCompletionContributor extends CompletionContributor { } + @Nullable private static GrReferenceElement findGroovyReference(PsiElement position) { + final PsiElement parent = position.getParent(); + if (parent instanceof GrReferenceElement) { + return (GrReferenceElement)parent; + } + if (couldContainReference(position)) { + return GroovyPsiElementFactory.getInstance(position.getProject()).createReferenceElementFromText("Foo", position); + } + return null; + } + private static boolean couldContainReference(PsiElement position) { return IN_CATCH_TYPE.accepts(position) || AFTER_AT.accepts(position) || @@ -408,21 +425,16 @@ public class GroovyCompletionContributor extends CompletionContributor { } private static void completeReference(final CompletionParameters parameters, - final CompletionResultSet result, - GrReferenceElement reference, final InheritorsHolder inheritorsHolder) { + GrReferenceElement reference, final InheritorsHolder inheritorsHolder, final PrefixMatcher matcher, final Consumer result) { final PsiElement position = parameters.getPosition(); - if (GroovySmartCompletionContributor.AFTER_NEW.accepts(position)) { - GroovySmartCompletionContributor.generateInheritorVariants(parameters, result.getPrefixMatcher(), inheritorsHolder); - } - final Map staticMembers = hashMap(); final PsiElement qualifier = reference.getQualifier(); final PsiType qualifierType = qualifier instanceof GrExpression ? ((GrExpression)qualifier).getType() : null; final ElementFilter classFilter = getClassFilter(position); - reference.processVariants(result.getPrefixMatcher(), parameters, new Consumer() { + reference.processVariants(matcher, parameters, new Consumer() { public void consume(Object element) { if (element instanceof PsiClass && inheritorsHolder.alreadyProcessed((PsiClass)element)) { return; @@ -463,7 +475,7 @@ public class GroovyCompletionContributor extends CompletionContributor { if (object instanceof PsiClass && !classFilter.isAcceptable(object, position)) { return; } - result.addElement(JavaCompletionUtil.highlightIfNeeded(qualifierType, lookupElement, object)); + result.consume(JavaCompletionUtil.highlightIfNeeded(qualifierType, lookupElement, object)); } }); @@ -475,7 +487,7 @@ public class GroovyCompletionContributor extends CompletionContributor { member = ((GrAccessorMethod)member).getProperty(); } final String name = member.getName(); - if (name == null || !result.getPrefixMatcher().prefixMatches(name)) { + if (name == null || !matcher.prefixMatches(name)) { staticMembers.remove(member); return; } @@ -485,7 +497,9 @@ public class GroovyCompletionContributor extends CompletionContributor { }); } - result.addAllElements(staticMembers.values()); + for (LookupElement element : staticMembers.values()) { + result.consume(element); + } } private static boolean checkForIterator(PsiMethod method) { From 3ea29bdefbed11d30e848b51050beb5ab0c87d50 Mon Sep 17 00:00:00 2001 From: peter Date: Tue, 7 Feb 2012 20:16:45 +0100 Subject: [PATCH 189/215] not all types can be transformed to text and parsed back (EA-33366) --- ...erenceExpressionCompletionContributor.java | 42 ++++++++++--------- 1 file changed, 23 insertions(+), 19 deletions(-) diff --git a/java/java-impl/src/com/intellij/codeInsight/completion/ReferenceExpressionCompletionContributor.java b/java/java-impl/src/com/intellij/codeInsight/completion/ReferenceExpressionCompletionContributor.java index e9559a88292f..24aa41aafa2e 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/ReferenceExpressionCompletionContributor.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/ReferenceExpressionCompletionContributor.java @@ -33,8 +33,11 @@ import com.intellij.psi.codeStyle.JavaCodeStyleManager; import com.intellij.psi.filters.*; import com.intellij.psi.filters.element.ModifierFilter; import com.intellij.psi.filters.types.AssignableFromFilter; +import com.intellij.psi.impl.FakePsiElement; +import com.intellij.psi.impl.light.LightVariableBuilder; import com.intellij.psi.impl.source.PostprocessReformattingAspect; import com.intellij.psi.infos.CandidateInfo; +import com.intellij.psi.scope.PsiScopeProcessor; import com.intellij.psi.util.InheritanceUtil; import com.intellij.psi.util.PsiTreeUtil; import com.intellij.psi.util.PsiUtil; @@ -429,30 +432,31 @@ public class ReferenceExpressionCompletionContributor { } } - public static PsiReferenceExpression createMockReference(PsiElement place, @NotNull PsiType qualifierType, LookupElement qualifierItem) { + public static PsiReferenceExpression createMockReference(final PsiElement place, @NotNull PsiType qualifierType, LookupElement qualifierItem) { + PsiElementFactory factory = JavaPsiFacade.getElementFactory(place.getProject()); if (qualifierItem.getObject() instanceof PsiClass) { - return (PsiReferenceExpression)JavaPsiFacade.getElementFactory(place.getProject()) + return (PsiReferenceExpression)factory .createExpressionFromText(((PsiClass)qualifierItem.getObject()).getQualifiedName() + ".xxx", place); - } - final JavaCodeFragmentFactory factory = JavaCodeFragmentFactory.getInstance(place.getProject()); - PsiType varType = qualifierType; - if (varType instanceof PsiEllipsisType) { - varType = ((PsiEllipsisType)varType).getComponentType(); - } - if (varType instanceof PsiWildcardType || varType instanceof PsiCapturedWildcardType) { - varType = TypeConversionUtil.erasure(varType); - } + return (PsiReferenceExpression) factory.createExpressionFromText("xxx.xxx", createContextWithXxxVariable(place, qualifierType)); + } - final String typeText = varType.getCanonicalText(); - final JavaCodeFragment block = factory.createCodeBlockCodeFragment(typeText + " xxx;xxx.xxx;", place, false); - final PsiElement secondChild = block.getChildren()[1]; - if (!(secondChild instanceof PsiExpressionStatement)) { - LOG.error(typeText + " of " + varType.getClass()); - } - final PsiExpressionStatement expressionStatement = (PsiExpressionStatement)secondChild; - return (PsiReferenceExpression) expressionStatement.getExpression(); + public static FakePsiElement createContextWithXxxVariable(final PsiElement place, final PsiType varType) { + return new FakePsiElement() { + @Override + public boolean processDeclarations(@NotNull PsiScopeProcessor processor, + @NotNull ResolveState state, + PsiElement lastParent, + @NotNull PsiElement place) { + return processor.execute(new LightVariableBuilder("xxx", varType, place), ResolveState.initial()); + } + + @Override + public PsiElement getParent() { + return place; + } + }; } private static boolean shoudChain(PsiElement element, PsiType qualifierType, PsiType expectedType, LookupElement item) { From 846ca5cf0afeab5fd2cedb31e66537007e9b33ab Mon Sep 17 00:00:00 2001 From: peter Date: Wed, 8 Feb 2012 12:58:25 +0100 Subject: [PATCH 190/215] non-first java completion contributors --- .../platform-resources/src/META-INF/LangExtensions.xml | 4 +--- resources/src/META-INF/IdeaPlugin.xml | 8 ++++++-- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/platform/platform-resources/src/META-INF/LangExtensions.xml b/platform/platform-resources/src/META-INF/LangExtensions.xml index 2d36ef88f549..0b87b66a01b1 100644 --- a/platform/platform-resources/src/META-INF/LangExtensions.xml +++ b/platform/platform-resources/src/META-INF/LangExtensions.xml @@ -443,7 +443,6 @@ - @@ -653,7 +652,7 @@ - + @@ -698,7 +697,6 @@ serviceImplementation="com.intellij.openapi.vcs.impl.CodeSmellDetectorImpl"/> - diff --git a/resources/src/META-INF/IdeaPlugin.xml b/resources/src/META-INF/IdeaPlugin.xml index 472fdda42908..bdef3c17b07e 100644 --- a/resources/src/META-INF/IdeaPlugin.xml +++ b/resources/src/META-INF/IdeaPlugin.xml @@ -213,10 +213,12 @@ + + order="before javaMemberName, before javaLegacy, after liveTemplates"/> + order="after xml"/> + + From 3bf3a8f187133b18ae96efa310f759a1d5ef657f Mon Sep 17 00:00:00 2001 From: peter Date: Wed, 8 Feb 2012 13:59:20 +0100 Subject: [PATCH 191/215] IDEA-58766 Recognize dot as completion prefix part for chained call suggestions, groovy --- .../completion/JavaChainLookupElement.java | 8 +- .../completion/JavaCompletionUtil.java | 3 + .../GroovyCompletionContributor.java | 103 ++++++++----- .../completion/GroovyNoVariantsDelegator.java | 139 +++++++++++++++--- .../CompleteReferenceExpression.java | 21 +-- .../completion/GroovyAutoPopupTest.groovy | 4 +- .../completion/GroovyCompletionTest.groovy | 12 ++ .../reference/tupleObjCompl.test | 3 +- .../oldCompletion/reference/untyped.test | 3 +- 9 files changed, 220 insertions(+), 76 deletions(-) diff --git a/java/java-impl/src/com/intellij/codeInsight/completion/JavaChainLookupElement.java b/java/java-impl/src/com/intellij/codeInsight/completion/JavaChainLookupElement.java index df36e2769cbf..6a8595751701 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/JavaChainLookupElement.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/JavaChainLookupElement.java @@ -65,7 +65,11 @@ public class JavaChainLookupElement extends LookupElementDecorator() { + addAllClasses(parameters, new Consumer() { @Override public void consume(LookupElement element) { result.addElement(element); } - }, inheritors); + }, inheritors, result.getPrefixMatcher()); } - public static void addAllClasses(CompletionParameters parameters, CompletionResultSet result, final Consumer consumer, final InheritorsHolder inheritors) { + public static void addAllClasses(CompletionParameters parameters, + final Consumer consumer, + final InheritorsHolder inheritors, final PrefixMatcher matcher) { final PsiElement position = parameters.getPosition(); final ElementFilter filter = getClassFilter(position); - AllClassesGetter.processJavaClasses(parameters, result.getPrefixMatcher(), parameters.getInvocationCount() <= 1, + AllClassesGetter.processJavaClasses(parameters, matcher, parameters.getInvocationCount() <= 1, new Consumer() { @Override public void consume(PsiClass psiClass) { @@ -324,12 +327,7 @@ public class GroovyCompletionContributor extends CompletionContributor { GroovySmartCompletionContributor.generateInheritorVariants(parameters, result.getPrefixMatcher(), inheritors); } - completeReference(parameters, reference, inheritors, result.getPrefixMatcher(), new Consumer() { - @Override - public void consume(LookupElement element) { - result.addElement(element); - } - }); + result.addAllElements(completeReference(parameters, reference, inheritors, result.getPrefixMatcher())); if (reference.getQualifier() == null) { GroovySmartCompletionContributor.addExpectedClassMembers(parameters, result); @@ -424,16 +422,30 @@ public class GroovyCompletionContributor extends CompletionContributor { super.fillCompletionVariants(parameters, result); } - private static void completeReference(final CompletionParameters parameters, - GrReferenceElement reference, final InheritorsHolder inheritorsHolder, final PrefixMatcher matcher, final Consumer result) { + static LinkedHashSet completeReference(final CompletionParameters parameters, + GrReferenceElement reference, final InheritorsHolder inheritorsHolder, final PrefixMatcher matcher) { final PsiElement position = parameters.getPosition(); final Map staticMembers = hashMap(); final PsiElement qualifier = reference.getQualifier(); final PsiType qualifierType = qualifier instanceof GrExpression ? ((GrExpression)qualifier).getType() : null; + LinkedHashSet result = new LinkedHashSet(); + if (reference instanceof GrReferenceExpression && (qualifier instanceof GrExpression || qualifier == null)) { + for (String string : CompleteReferenceExpression.getVariantsWithSameQualifier(matcher, (GrExpression)qualifier, (GrReferenceExpression)reference)) { + result.add(GroovyCompletionUtil.getLookupElement(string)); + } + if (parameters.getInvocationCount() < 2 && qualifier != null && qualifierType == null) { + if (parameters.getInvocationCount() == 1) { + showInfo(); + } + return result; + } + } + final ElementFilter classFilter = getClassFilter(position); + final List items = arrayList(); reference.processVariants(matcher, parameters, new Consumer() { public void consume(Object element) { if (element instanceof PsiClass && inheritorsHolder.alreadyProcessed((PsiClass)element)) { @@ -448,22 +460,20 @@ public class GroovyCompletionContributor extends CompletionContributor { } LookupElement lookupElement = element instanceof PsiClass - ? GroovyCompletionUtil.createClassLookupItem(CompletionUtil.getOriginalOrSelf((PsiClass)element)) - : GroovyCompletionUtil.getLookupElement(element); + ? GroovyCompletionUtil.createClassLookupItem(CompletionUtil.getOriginalOrSelf((PsiClass)element)) + : GroovyCompletionUtil.getLookupElement(element); Object object = lookupElement.getObject(); - PsiSubstitutor substitutor = null; - GroovyResolveResult resolveResult = null; if (object instanceof GroovyResolveResult) { - resolveResult = (GroovyResolveResult)object; - substitutor = resolveResult.getSubstitutor(); object = ((GroovyResolveResult)object).getElement(); } if (object instanceof PsiMember && JavaCompletionUtil.isInExcludedPackage((PsiMember)object, true)) { return; } - lookupElement = tweakPriority(lookupElement, object, substitutor, resolveResult, qualifierType); + int priority = assignPriority(lookupElement, qualifierType); + lookupElement = JavaCompletionUtil.highlightIfNeeded(qualifierType, + PrioritizedLookupElement.withPriority(lookupElement, priority), object); if ((object instanceof PsiMethod || object instanceof PsiField) && ((PsiModifierListOwner)object).hasModifierProperty(PsiModifier.STATIC)) { @@ -475,7 +485,8 @@ public class GroovyCompletionContributor extends CompletionContributor { if (object instanceof PsiClass && !classFilter.isAcceptable(object, position)) { return; } - result.consume(JavaCompletionUtil.highlightIfNeeded(qualifierType, lookupElement, object)); + + items.add(lookupElement); } }); @@ -497,8 +508,25 @@ public class GroovyCompletionContributor extends CompletionContributor { }); } - for (LookupElement element : staticMembers.values()) { - result.consume(element); + items.addAll(staticMembers.values()); + + for (Iterator iterator = items.iterator(); iterator.hasNext(); ) { + LookupElement element = iterator.next(); + PrioritizedLookupElement prio = element.as(PrioritizedLookupElement.CLASS_CONDITION_KEY); + if (prio == null || prio.getPriority() >= 0) { + result.add(element); + iterator.remove(); + } + } + result.addAll(items); + + return result; + } + + private static void showInfo() { + if (StringUtil.isEmpty(CompletionService.getCompletionService().getAdvertisementText())) { + CompletionService.getCompletionService() + .setAdvertisementText(GroovyBundle.message("invoke.completion.second.time.to.show.skipped.methods")); } } @@ -513,33 +541,38 @@ public class GroovyCompletionContributor extends CompletionContributor { } - private static LookupElement tweakPriority(LookupElement lookupElement, - Object object, - PsiSubstitutor substitutor, - GroovyResolveResult resolveResult, - PsiType qualifierType) { + private static int assignPriority(LookupElement lookupElement, PsiType qualifierType) { + Object object = lookupElement.getObject(); + PsiSubstitutor substitutor = null; + GroovyResolveResult resolveResult = null; + if (object instanceof GroovyResolveResult) { + resolveResult = (GroovyResolveResult)object; + substitutor = resolveResult.getSubstitutor(); + object = ((GroovyResolveResult)object).getElement(); + } + // default groovy methods if (object instanceof GrGdkMethod && GroovyCompletionUtil.skipDefGroovyMethod((GrGdkMethod)object, substitutor, qualifierType)) { - return PrioritizedLookupElement.withPriority(lookupElement, -1); + return -1; } // operator methods if (object instanceof PsiMethod && GroovyCompletionUtil.OPERATOR_METHOD_NAMES.contains(((PsiMethod)object).getName()) && !checkForIterator((PsiMethod)object)) { - return PrioritizedLookupElement.withPriority(lookupElement, -3); + return -3; } // accessors if there is no get, set, is prefix if (object instanceof PsiMethod && GroovyPropertyUtils.isSimplePropertyAccessor((PsiMethod)object)) { - return PrioritizedLookupElement.withPriority(lookupElement, -1); + return -1; } // inaccessible elements if (resolveResult != null && !resolveResult.isAccessible()) { - return PrioritizedLookupElement.withPriority(lookupElement, -2); + return -2; } - return lookupElement; + return 0; } static StaticMemberProcessor completeStaticMembers(CompletionParameters parameters) { diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/completion/GroovyNoVariantsDelegator.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/completion/GroovyNoVariantsDelegator.java index 957e080bd9f0..32fdbd4bb532 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/completion/GroovyNoVariantsDelegator.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/completion/GroovyNoVariantsDelegator.java @@ -16,9 +16,21 @@ package org.jetbrains.plugins.groovy.lang.completion; import com.intellij.codeInsight.completion.*; +import com.intellij.codeInsight.completion.impl.CamelHumpMatcher; import com.intellij.codeInsight.lookup.AutoCompletionPolicy; import com.intellij.codeInsight.lookup.LookupElement; +import com.intellij.psi.PsiClass; +import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiFile; +import com.intellij.psi.PsiType; import com.intellij.util.Consumer; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.plugins.groovy.lang.psi.GrReferenceElement; +import org.jetbrains.plugins.groovy.lang.psi.GroovyPsiElementFactory; + +import java.util.Collections; +import java.util.LinkedHashSet; +import java.util.Set; /** * @author peter @@ -27,27 +39,114 @@ public class GroovyNoVariantsDelegator extends NoVariantsDelegator { @Override protected void delegate(CompletionParameters parameters, CompletionResultSet result, Consumer passResult) { - if (parameters.getCompletionType() == CompletionType.BASIC && - parameters.getInvocationCount() <= 1 && - JavaCompletionContributor.mayStartClassName(result, false) && - GroovyCompletionContributor.isClassNamePossible(parameters.getPosition()) && - !MapArgumentCompletionProvider.isMapKeyCompletion(parameters)) { - final ClassByNameMerger merger = new ClassByNameMerger(parameters.getInvocationCount() == 0, result); - - GroovyCompletionContributor.addAllClasses(parameters, result, - new Consumer() { - @Override - public void consume(LookupElement element) { - JavaPsiClassReferenceElement classElement = element.as(JavaPsiClassReferenceElement.CLASS_CONDITION_KEY); - if (classElement != null) { - classElement.setAutoCompletionPolicy(AutoCompletionPolicy.NEVER_AUTOCOMPLETE); - } - merger.consume(classElement); - } - }, new InheritorsHolder(parameters.getPosition(), result)); - - merger.finishedClassProcessing(); + if (parameters.getCompletionType() == CompletionType.BASIC) { + if (parameters.getInvocationCount() <= 1 && + JavaCompletionContributor.mayStartClassName(result, false) && + GroovyCompletionContributor.isClassNamePossible(parameters.getPosition()) && + !MapArgumentCompletionProvider.isMapKeyCompletion(parameters)) { + suggestNonImportedClasses(parameters, result); + } + suggestChainedCalls(parameters, result); } } + + private static void suggestNonImportedClasses(CompletionParameters parameters, CompletionResultSet result) { + final ClassByNameMerger merger = new ClassByNameMerger(parameters.getInvocationCount() == 0, result); + + GroovyCompletionContributor.addAllClasses(parameters, new Consumer() { + @Override + public void consume(LookupElement element) { + JavaPsiClassReferenceElement classElement = + element.as(JavaPsiClassReferenceElement.CLASS_CONDITION_KEY); + if (classElement != null) { + classElement.setAutoCompletionPolicy(AutoCompletionPolicy.NEVER_AUTOCOMPLETE); + } + merger.consume(classElement); + } + }, new InheritorsHolder(parameters.getPosition(), result), result.getPrefixMatcher()); + + merger.finishedClassProcessing(); + } + + private static void suggestChainedCalls(CompletionParameters parameters, CompletionResultSet result) { + PsiElement position = parameters.getPosition(); + PsiElement parent = position.getParent(); + if (!(parent instanceof GrReferenceElement)) { + return; + } + PsiElement qualifier = ((GrReferenceElement)parent).getQualifier(); + if (!(qualifier instanceof GrReferenceElement) || + ((GrReferenceElement)qualifier).getQualifier() != null || + ((GrReferenceElement)qualifier).resolve() != null) { + return; + } + + String fullPrefix = position.getContainingFile().getText().substring(parent.getTextRange().getStartOffset(), parameters.getOffset()); + final CompletionResultSet qualifiedCollector = result.withPrefixMatcher(fullPrefix); + InheritorsHolder inheritors = new InheritorsHolder(position, result); + for (final LookupElement base : suggestQualifierItems(parameters, (GrReferenceElement)qualifier, inheritors)) { + final PsiType type = JavaCompletionUtil.getLookupElementType(base); + if (type != null && !PsiType.VOID.equals(type)) { + GrReferenceElement ref = createMockReference(position, type, base); + PsiElement refName = ref.getReferenceNameElement(); + assert refName != null; + for (LookupElement element : GroovyCompletionContributor.completeReference( + parameters.withPosition(refName, refName.getTextRange().getStartOffset()), ref, inheritors, qualifiedCollector.getPrefixMatcher())) { + qualifiedCollector.addElement(new JavaChainLookupElement(base, element) { + @Override + protected boolean shouldParenthesizeQualifier(PsiFile file, int startOffset, int endOffset) { + return false; + } + }); + } + } + } + } + + private static GrReferenceElement createMockReference(final PsiElement place, @NotNull PsiType qualifierType, LookupElement qualifierItem) { + GroovyPsiElementFactory factory = GroovyPsiElementFactory.getInstance(place.getProject()); + if (qualifierItem.getObject() instanceof PsiClass) { + return factory + .createReferenceExpressionFromText(((PsiClass)qualifierItem.getObject()).getQualifiedName() + ".xxx", place); + } + + return factory.createReferenceExpressionFromText("xxx.xxx", + ReferenceExpressionCompletionContributor + .createContextWithXxxVariable(place, qualifierType)); + } + + + private static Set suggestQualifierItems(CompletionParameters _parameters, + GrReferenceElement qualifier, + InheritorsHolder inheritors) { + CompletionParameters parameters = + _parameters.withPosition(qualifier.getReferenceNameElement(), qualifier.getTextRange().getEndOffset()); + String referenceName = qualifier.getReferenceName(); + if (referenceName == null) { + return Collections.emptySet(); + } + + final PrefixMatcher qMatcher = new CamelHumpMatcher(referenceName); + final Set variants = new LinkedHashSet(); + for (LookupElement element : GroovyCompletionContributor.completeReference(parameters, qualifier, inheritors, qMatcher)) { + if (qMatcher.prefixMatches(element)) { + variants.add(element); + } + } + + if (variants.isEmpty()) { + GroovyCompletionContributor.addAllClasses(parameters, new Consumer() { + @Override + public void consume(LookupElement element) { + if (qMatcher.prefixMatches(element)) { + variants.add(element); + } + } + }, inheritors, qMatcher); + } + return variants; + } + + } diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/statements/expressions/CompleteReferenceExpression.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/statements/expressions/CompleteReferenceExpression.java index 54bdbe6af25b..2c4a6af49cfb 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/statements/expressions/CompleteReferenceExpression.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/statements/expressions/CompleteReferenceExpression.java @@ -25,7 +25,6 @@ import com.intellij.psi.search.GlobalSearchScope; import com.intellij.psi.util.InheritanceUtil; import com.intellij.psi.util.PsiTreeUtil; import com.intellij.psi.util.TypeConversionUtil; -import com.intellij.util.ArrayUtil; import com.intellij.util.Consumer; import com.intellij.util.containers.hash.HashSet; import org.jetbrains.annotations.NotNull; @@ -48,7 +47,6 @@ import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.members.GrRe import org.jetbrains.plugins.groovy.lang.psi.impl.GroovyPsiManager; import org.jetbrains.plugins.groovy.lang.psi.impl.GroovyResolveResultImpl; import org.jetbrains.plugins.groovy.lang.psi.impl.PsiImplUtil; -import org.jetbrains.plugins.groovy.lang.psi.util.GrClassImplUtil; import org.jetbrains.plugins.groovy.lang.psi.util.PsiUtil; import org.jetbrains.plugins.groovy.lang.resolve.ClosureMissingMethodContributor; import org.jetbrains.plugins.groovy.lang.resolve.ResolveUtil; @@ -88,7 +86,6 @@ public class CompleteReferenceExpression { private static void getVariantsImpl(PrefixMatcher matcher, GrReferenceExpression refExpr, CompleteReferenceProcessor processor) { GrExpression qualifier = refExpr.getQualifierExpression(); - getVariantsWithSameQualifier(matcher, qualifier, refExpr, processor); if (qualifier == null) { ResolveUtil.treeWalkUp(refExpr, processor, true); @@ -228,7 +225,8 @@ public class CompleteReferenceExpression { return; } } - getVariantsFromQualifierType(refExpr, processor, GrClassImplUtil.getGroovyObjectType(refExpr), project); + getVariantsFromQualifierType(refExpr, processor, + PsiType.getJavaLangObject(refExpr.getManager(), qualifier.getResolveScope()), project); } else if (qualifierType instanceof PsiIntersectionType) { for (PsiType conjunct : ((PsiIntersectionType)qualifierType).getConjuncts()) { @@ -256,20 +254,19 @@ public class CompleteReferenceExpression { } } - private static String[] getVariantsWithSameQualifier(PrefixMatcher matcher,GrExpression qualifier, GrReferenceExpression refExpr, CompleteReferenceProcessor processor) { - if (qualifier != null && qualifier.getType() != null) return ArrayUtil.EMPTY_STRING_ARRAY; + public static Set getVariantsWithSameQualifier(PrefixMatcher matcher, @Nullable GrExpression qualifier, GrReferenceExpression refExpr) { + if (qualifier != null && qualifier.getType() != null) return Collections.emptySet(); final PsiElement scope = PsiTreeUtil.getParentOfType(refExpr, GrMember.class, PsiFile.class); Set result = new LinkedHashSet(); - addVariantsWithSameQualifier(matcher, scope, refExpr, qualifier, result, processor); - return ArrayUtil.toStringArray(result); + addVariantsWithSameQualifier(matcher, scope, refExpr, qualifier, result); + return result; } private static void addVariantsWithSameQualifier(PrefixMatcher matcher, PsiElement element, GrReferenceExpression patternExpression, GrExpression patternQualifier, - Set result, - CompleteReferenceProcessor processor) { + Set result) { if (element instanceof GrReferenceExpression && element != patternExpression && !PsiUtil.isLValue((GroovyPsiElement)element)) { final GrReferenceExpression refExpr = (GrReferenceExpression)element; final String refName = refExpr.getReferenceName(); @@ -279,21 +276,19 @@ public class CompleteReferenceExpression { if (PsiEquivalenceUtil.areElementsEquivalent(hisQualifier, patternQualifier)) { if (refExpr.resolve() == null) { result.add(refName); - processor.consume(refName); } } } else if (hisQualifier == null && patternQualifier == null) { if (refExpr.resolve() == null) { result.add(refName); - processor.consume(refName); } } } } for (PsiElement child = element.getFirstChild(); child != null; child = child.getNextSibling()) { - addVariantsWithSameQualifier(matcher, child, patternExpression, patternQualifier, result, processor); + addVariantsWithSameQualifier(matcher, child, patternExpression, patternQualifier, result); } } diff --git a/plugins/groovy/test/org/jetbrains/plugins/groovy/completion/GroovyAutoPopupTest.groovy b/plugins/groovy/test/org/jetbrains/plugins/groovy/completion/GroovyAutoPopupTest.groovy index 5cb4306414a9..e47e50a569e7 100644 --- a/plugins/groovy/test/org/jetbrains/plugins/groovy/completion/GroovyAutoPopupTest.groovy +++ b/plugins/groovy/test/org/jetbrains/plugins/groovy/completion/GroovyAutoPopupTest.groovy @@ -56,7 +56,7 @@ class GroovyAutoPopupTest extends CompletionAutoPopupTestCase { public void testNoLookupFocusOnUnresolvedQualifier() { myFixture.configureByText("a.groovy", """xxx.""") type 'h' //hashCode - assert !lookup.focused + assert !lookup } public void testNoLookupFocusOnUntypedQualifier() { @@ -65,7 +65,7 @@ class GroovyAutoPopupTest extends CompletionAutoPopupTestCase { xxx. }""") type 'h' - assert !lookup.focused + assert !lookup } public void testPossibleClosureParameter() { diff --git a/plugins/groovy/test/org/jetbrains/plugins/groovy/completion/GroovyCompletionTest.groovy b/plugins/groovy/test/org/jetbrains/plugins/groovy/completion/GroovyCompletionTest.groovy index c8ac6a4b037c..5adc0dd80ad8 100644 --- a/plugins/groovy/test/org/jetbrains/plugins/groovy/completion/GroovyCompletionTest.groovy +++ b/plugins/groovy/test/org/jetbrains/plugins/groovy/completion/GroovyCompletionTest.groovy @@ -1108,6 +1108,18 @@ public class KeyVO { checkSingleItemCompletion 'class Foo impl {}', 'class Foo implements {}' } + public void testAmbiguousClassQualifier() { + myFixture.addClass("package foo; public class Util { public static void foo() {} }") + myFixture.addClass("package bar; public class Util { public static void bar() {} }") + myFixture.configureByText 'a.groovy', 'Util.' + myFixture.completeBasic() + assert myFixture.lookupElementStrings[0..1] == ['Util.bar', 'Util.foo'] + myFixture.type 'f\n' + myFixture.checkResult '''import foo.Util + +Util.foo()''' + } + public void testPreferInterfacesInImplements() { myFixture.addClass('interface FooIntf {}') myFixture.addClass('class FooClass {}') diff --git a/plugins/groovy/testdata/groovy/oldCompletion/reference/tupleObjCompl.test b/plugins/groovy/testdata/groovy/oldCompletion/reference/tupleObjCompl.test index dc46468034b5..3da80cb6eb56 100644 --- a/plugins/groovy/testdata/groovy/oldCompletion/reference/tupleObjCompl.test +++ b/plugins/groovy/testdata/groovy/oldCompletion/reference/tupleObjCompl.test @@ -1,4 +1,3 @@ def (street, home, postCode) def s = street.toS ------ -toString \ No newline at end of file +----- \ No newline at end of file diff --git a/plugins/groovy/testdata/groovy/oldCompletion/reference/untyped.test b/plugins/groovy/testdata/groovy/oldCompletion/reference/untyped.test index 62a56f8f57b3..369b6e64961c 100644 --- a/plugins/groovy/testdata/groovy/oldCompletion/reference/untyped.test +++ b/plugins/groovy/testdata/groovy/oldCompletion/reference/untyped.test @@ -1,3 +1,2 @@ unknown.metaCl ------ -metaClass \ No newline at end of file +----- \ No newline at end of file From c2125f8ac57297f91ce3f43f1ae48836ae91e04b Mon Sep 17 00:00:00 2001 From: peter Date: Wed, 8 Feb 2012 15:39:38 +0100 Subject: [PATCH 192/215] show location package in chained call items (IDEA-58766) --- .../completion/JavaChainLookupElement.java | 13 ++++++++++++- .../lookup/LookupElementPresentation.java | 6 ++++++ .../groovy/completion/GroovyCompletionTest.groovy | 6 ++++++ 3 files changed, 24 insertions(+), 1 deletion(-) diff --git a/java/java-impl/src/com/intellij/codeInsight/completion/JavaChainLookupElement.java b/java/java-impl/src/com/intellij/codeInsight/completion/JavaChainLookupElement.java index 6a8595751701..83243e975e63 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/JavaChainLookupElement.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/JavaChainLookupElement.java @@ -19,11 +19,13 @@ import com.intellij.codeInsight.lookup.*; import com.intellij.featureStatistics.FeatureUsageTracker; import com.intellij.openapi.editor.Document; import com.intellij.openapi.util.ClassConditionKey; +import com.intellij.openapi.util.text.StringUtil; import com.intellij.psi.*; import com.intellij.psi.codeStyle.CodeStyleSettingsManager; import com.intellij.psi.util.PsiTreeUtil; import gnu.trove.THashSet; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.util.Set; @@ -65,11 +67,16 @@ public class JavaChainLookupElement extends LookupElementDecorator' myFixture.completeBasic() assert myFixture.lookupElementStrings[0..1] == ['Util.bar', 'Util.foo'] + + def presentation = LookupElementPresentation.renderElement(myFixture.lookupElements[0]) + assert 'Util.bar' == presentation.itemText + assert '() (bar)' == presentation.tailText + assert !presentation.tailGrayed + myFixture.type 'f\n' myFixture.checkResult '''import foo.Util From 335577008ad3012f612f6d6e21a7c061a6a575ec Mon Sep 17 00:00:00 2001 From: peter Date: Wed, 8 Feb 2012 16:36:48 +0100 Subject: [PATCH 193/215] chained property completion in groovy (IDEA-58766) --- .../groovy/lang/completion/GroovyNoVariantsDelegator.java | 2 +- .../plugins/groovy/completion/GroovyCompletionTest.groovy | 2 ++ .../testdata/groovy/completion/PropertyChain.groovy | 8 ++++++++ .../testdata/groovy/completion/PropertyChain_after.groovy | 8 ++++++++ 4 files changed, 19 insertions(+), 1 deletion(-) create mode 100644 plugins/groovy/testdata/groovy/completion/PropertyChain.groovy create mode 100644 plugins/groovy/testdata/groovy/completion/PropertyChain_after.groovy diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/completion/GroovyNoVariantsDelegator.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/completion/GroovyNoVariantsDelegator.java index 32fdbd4bb532..55a8f20a93e5 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/completion/GroovyNoVariantsDelegator.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/completion/GroovyNoVariantsDelegator.java @@ -92,7 +92,7 @@ public class GroovyNoVariantsDelegator extends NoVariantsDelegator { PsiElement refName = ref.getReferenceNameElement(); assert refName != null; for (LookupElement element : GroovyCompletionContributor.completeReference( - parameters.withPosition(refName, refName.getTextRange().getStartOffset()), ref, inheritors, qualifiedCollector.getPrefixMatcher())) { + parameters.withPosition(refName, refName.getTextRange().getStartOffset()), ref, inheritors, result.getPrefixMatcher())) { qualifiedCollector.addElement(new JavaChainLookupElement(base, element) { @Override protected boolean shouldParenthesizeQualifier(PsiFile file, int startOffset, int endOffset) { diff --git a/plugins/groovy/test/org/jetbrains/plugins/groovy/completion/GroovyCompletionTest.groovy b/plugins/groovy/test/org/jetbrains/plugins/groovy/completion/GroovyCompletionTest.groovy index 34299c798c27..fe133175c2fb 100644 --- a/plugins/groovy/test/org/jetbrains/plugins/groovy/completion/GroovyCompletionTest.groovy +++ b/plugins/groovy/test/org/jetbrains/plugins/groovy/completion/GroovyCompletionTest.groovy @@ -1131,4 +1131,6 @@ Util.foo()''' myFixture.addClass('class FooClass {}') doVariantableTest('FooIntf', 'FooClass') } + + public void testPropertyChain() { doBasicTest() } } \ No newline at end of file diff --git a/plugins/groovy/testdata/groovy/completion/PropertyChain.groovy b/plugins/groovy/testdata/groovy/completion/PropertyChain.groovy new file mode 100644 index 000000000000..cc24bcc939bc --- /dev/null +++ b/plugins/groovy/testdata/groovy/completion/PropertyChain.groovy @@ -0,0 +1,8 @@ +class A { + File myFile; + + def foo() { + myf.cap + } + +} \ No newline at end of file diff --git a/plugins/groovy/testdata/groovy/completion/PropertyChain_after.groovy b/plugins/groovy/testdata/groovy/completion/PropertyChain_after.groovy new file mode 100644 index 000000000000..84c0be7c409a --- /dev/null +++ b/plugins/groovy/testdata/groovy/completion/PropertyChain_after.groovy @@ -0,0 +1,8 @@ +class A { + File myFile; + + def foo() { + myFile.canonicalPath + } + +} \ No newline at end of file From 606b53b92152210a6f8487159f3b57db9f200a39 Mon Sep 17 00:00:00 2001 From: Dmitry Boulytchev Date: Wed, 8 Feb 2012 22:24:43 +0400 Subject: [PATCH 194/215] Import import and a modest enhancement in integrate (compile server). --- .../ether/dependencyView/Mappings.java | 62 +++++++++++++++++-- 1 file changed, 56 insertions(+), 6 deletions(-) diff --git a/jps/model/src/org/jetbrains/ether/dependencyView/Mappings.java b/jps/model/src/org/jetbrains/ether/dependencyView/Mappings.java index 5cb34dc91432..67d9f9af2d2a 100644 --- a/jps/model/src/org/jetbrains/ether/dependencyView/Mappings.java +++ b/jps/model/src/org/jetbrains/ether/dependencyView/Mappings.java @@ -35,10 +35,18 @@ public class Mappings { private boolean myIsDifferentiated = false; private final List myChangedClasses; + private final List myChangedFiles; private void addChangedClass(final DependencyContext.S it) { - assert (myChangedClasses != null); + assert (myChangedClasses != null && myChangedFiles != null); myChangedClasses.add(it); + + final DependencyContext.S file = myClassToSourceFile.get(it); + + if (file != null) { + myChangedFiles.add(it); + } + myIsDifferentiated = true; } @@ -46,6 +54,10 @@ public class Mappings { return myChangedClasses; } + private Collection getChangedFiles() { + return myChangedFiles; + } + private boolean isDifferentiated() { return myIsDifferentiated; } @@ -110,6 +122,7 @@ public class Mappings { private Mappings(final Mappings base) throws IOException { myIsDelta = true; myChangedClasses = new LinkedList(); + myChangedFiles = new LinkedList(); myDeltaIsTransient = base.myDeltaIsTransient; myRootDir = new File(FileUtil.toSystemIndependentName(base.myRootDir.getAbsolutePath()) + File.separatorChar + "delta"); myContext = base.myContext; @@ -121,6 +134,7 @@ public class Mappings { public Mappings(final File rootDir, final boolean transientDelta) throws IOException { myIsDelta = false; myChangedClasses = null; + myChangedFiles = null; myDeltaIsTransient = transientDelta; myRootDir = rootDir; createImplementation(); @@ -1579,9 +1593,32 @@ public class Mappings { myClassToSourceFile.putAll(delta.myClassToSourceFile); } - mySourceFileToClasses.putAll(delta.mySourceFileToClasses); - mySourceFileToUsages.putAll(delta.mySourceFileToUsages); - mySourceFileToAnnotationUsages.putAll(delta.mySourceFileToAnnotationUsages); + if (delta.isDifferentiated()) { + for (DependencyContext.S f : delta.getChangedFiles()) { + mySourceFileToClasses.remove(f); + final Collection classes = delta.mySourceFileToClasses.get(f); + if (classes != null){ + mySourceFileToClasses.put(f, classes); + } + + mySourceFileToUsages.remove(f); + final Collection clusters = delta.mySourceFileToUsages.get(f); + if (clusters != null){ + mySourceFileToUsages.put(f, clusters); + } + + mySourceFileToAnnotationUsages.remove(f); + final Collection usages = delta.mySourceFileToAnnotationUsages.get(f); + if (usages != null){ + mySourceFileToAnnotationUsages.put(f, usages); + } + } + } + else { + mySourceFileToClasses.putAll(delta.mySourceFileToClasses); + mySourceFileToUsages.putAll(delta.mySourceFileToUsages); + mySourceFileToAnnotationUsages.putAll(delta.mySourceFileToAnnotationUsages); + } final Collection compiledSet = new HashSet(compiled.size()); @@ -1684,8 +1721,21 @@ public class Mappings { } @Override - public void registerImports(Collection imports, String rootClass) { - //To change body of implemented methods use File | Settings | File Templates. + public void registerImports(final Collection imports, final String rootClass) { + final DependencyContext.S rootClassName = myContext.get(rootClass); + final DependencyContext.S fileName = myClassToSourceFile.get(rootClassName); + + for (final String i : imports) { + final DependencyContext.S iname = myContext.get(i); + + myClassToClassDependency.put(rootClassName, iname); + + if (fileName != null) { + final UsageRepr.Cluster cluster = new UsageRepr.Cluster(); + cluster.addUsage(rootClassName, UsageRepr.createClassUsage(myContext, iname)); + mySourceFileToUsages.put(fileName, cluster); + } + } } }; } From 40cd9cb9db0771b86e965b55a251bfbdc92dcbae Mon Sep 17 00:00:00 2001 From: Dmitry Jemerov Date: Wed, 8 Feb 2012 19:36:03 +0100 Subject: [PATCH 195/215] refresh files before showing diff (IDEA-81067) --- .../src/com/intellij/openapi/diff/DiffApplication.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/platform/platform-api/src/com/intellij/openapi/diff/DiffApplication.java b/platform/platform-api/src/com/intellij/openapi/diff/DiffApplication.java index 97d72513e9bf..e81347ff2d80 100644 --- a/platform/platform-api/src/com/intellij/openapi/diff/DiffApplication.java +++ b/platform/platform-api/src/com/intellij/openapi/diff/DiffApplication.java @@ -111,6 +111,8 @@ public class DiffApplication implements ApplicationStarterEx { settings.showInFrame = false; diffManager.showDiff(d1, d2, settings, null); } else { + file1.refresh(false, false); + file2.refresh(false, false); SimpleDiffRequest request = SimpleDiffRequest.compareFiles(file1, file2, null); request.addHint(DiffTool.HINT_SHOW_MODAL_DIALOG); DiffManager.getInstance().getIdeaDiffTool().show(request); From 14d2a6388806db1bd882b674409760d84fd46a53 Mon Sep 17 00:00:00 2001 From: Konstantin Bulenkov Date: Wed, 8 Feb 2012 19:38:01 +0100 Subject: [PATCH 196/215] IDEA-80929 focus is lost in commit dialog --- .../com/intellij/openapi/wm/impl/ToolWindowManagerImpl.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/platform/platform-impl/src/com/intellij/openapi/wm/impl/ToolWindowManagerImpl.java b/platform/platform-impl/src/com/intellij/openapi/wm/impl/ToolWindowManagerImpl.java index 2967be12aeee..d96b8b17f2b8 100644 --- a/platform/platform-impl/src/com/intellij/openapi/wm/impl/ToolWindowManagerImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/wm/impl/ToolWindowManagerImpl.java @@ -39,6 +39,7 @@ import com.intellij.openapi.project.DumbAwareRunnable; import com.intellij.openapi.project.DumbService; import com.intellij.openapi.project.Project; import com.intellij.openapi.startup.StartupManager; +import com.intellij.openapi.ui.DialogWrapper; import com.intellij.openapi.ui.MessageType; import com.intellij.openapi.ui.popup.Balloon; import com.intellij.openapi.ui.popup.JBPopupFactory; @@ -2186,6 +2187,9 @@ public final class ToolWindowManagerImpl extends ToolWindowManagerEx implements if (root != null) { JComponent toFocus = IdeFocusTraversalPolicy.getPreferredFocusedComponent(root); if (toFocus != null) { + if (DialogWrapper.findInstance(toFocus) != null) { + return new ActionCallback.Done(); //IDEA-80929 + } return IdeFocusManager.findInstanceByComponent(toFocus).requestFocus(toFocus, forced); } } From c83ffde9432d1a839e8f6bf068e423eb0286633b Mon Sep 17 00:00:00 2001 From: anna Date: Wed, 8 Feb 2012 13:00:11 +0100 Subject: [PATCH 197/215] collapse "-D" vm parameters if command line is too long (IDEA-76030) --- .../rt/execution/CommandLineWrapper.java | 39 ++++++++- .../openapi/projectRoots/JdkUtil.java | 83 ++++++++++++++----- 2 files changed, 98 insertions(+), 24 deletions(-) diff --git a/java/java-runtime/src/com/intellij/rt/execution/CommandLineWrapper.java b/java/java-runtime/src/com/intellij/rt/execution/CommandLineWrapper.java index e0b8236b9c72..57567b0a6d84 100644 --- a/java/java-runtime/src/com/intellij/rt/execution/CommandLineWrapper.java +++ b/java/java-runtime/src/com/intellij/rt/execution/CommandLineWrapper.java @@ -32,6 +32,7 @@ import java.util.ArrayList; import java.util.List; public class CommandLineWrapper { + private static final String PREFIX = "-D"; public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, IllegalAccessException, IOException, InstantiationException { @@ -54,9 +55,41 @@ public class CommandLineWrapper { reader.close(); } file.delete(); - String progClass = args[1]; - String[] progArgs = new String[args.length - 2]; - System.arraycopy(args, 2, progArgs, 0, progArgs.length); + + int startArgsIdx = 2; + if (args[1].equals("@vm_params")) { + startArgsIdx = 4; + final File vmParamsFile = new File(args[2]); + final BufferedReader vmParamsReader = new BufferedReader(new FileReader(vmParamsFile)); + try { + while (vmParamsReader.ready()) { + final String vmParam = vmParamsReader.readLine().trim(); + final int eqIdx = vmParam.indexOf("="); + String vmParamName; + String vmParamValue; + + if (eqIdx > -1 && eqIdx < vmParam.length() - 1) { + vmParamName = vmParam.substring(0, eqIdx); + vmParamValue = vmParam.substring(eqIdx + 1); + } else { + vmParamName = vmParam; + vmParamValue = ""; + } + vmParamName = vmParamName.trim(); + if (vmParamName.startsWith(PREFIX)) { + vmParamName = vmParamName.substring(PREFIX.length()); + System.setProperty(vmParamName, vmParamValue); + } + } + } + finally { + vmParamsReader.close(); + } + vmParamsFile.delete(); + } + String progClass = args[startArgsIdx - 1]; + String[] progArgs = new String[args.length - startArgsIdx]; + System.arraycopy(args, startArgsIdx, progArgs, 0, progArgs.length); ClassLoader loader = new URLClassLoader((URL[])urls.toArray(new URL[urls.size()]), null); final String classloader = System.getProperty("java.system.class.loader"); if (classloader != null) { diff --git a/platform/lang-api/src/com/intellij/openapi/projectRoots/JdkUtil.java b/platform/lang-api/src/com/intellij/openapi/projectRoots/JdkUtil.java index 23076fc95046..62ea6513fb23 100644 --- a/platform/lang-api/src/com/intellij/openapi/projectRoots/JdkUtil.java +++ b/platform/lang-api/src/com/intellij/openapi/projectRoots/JdkUtil.java @@ -40,6 +40,7 @@ import org.jetbrains.annotations.Nullable; import java.io.*; import java.nio.charset.Charset; import java.nio.charset.UnsupportedCharsetException; +import java.util.List; import java.util.jar.Attributes; import java.util.jar.JarFile; import java.util.jar.Manifest; @@ -147,32 +148,13 @@ public class JdkUtil { commandLine.setExePath(exePath); ParametersList parametersList = javaParameters.getVMParametersList(); - commandLine.addParameters(parametersList.getList()); - - // Value of -Dfile.encoding and charset of GeneralCommandLine should be in sync in order process's input and output be correctly handled. - String encoding = parametersList.getPropertyValue("file.encoding"); - if (encoding == null) { - Charset charset = javaParameters.getCharset(); - if (charset == null) charset = EncodingManager.getInstance().getDefaultCharset(); - if (charset == null) charset = CharsetToolkit.getDefaultSystemCharset(); - commandLine.addParameter("-Dfile.encoding=" + charset.name()); - commandLine.setCharset(charset); - } - else { - try { - Charset charset = Charset.forName(encoding); - commandLine.setCharset(charset); - } - catch (UnsupportedCharsetException ignore) { - } - } - commandLine.setEnvParams(javaParameters.getEnv()); commandLine.setPassParentEnvs(javaParameters.isPassParentEnvs()); final Class commandLineWrapper; if (forceDynamicClasspath && (commandLineWrapper = getCommandLineWrapperClass()) != null) { File classpathFile = null; + File vmParamsFile = null; if(!parametersList.hasParameter("-classpath") && !parametersList.hasParameter("-cp")){ try { classpathFile = FileUtil.createTempFile("classpath", null); @@ -199,16 +181,55 @@ public class JdkUtil { catch (IOException e) { LOG.error(e); } + + try { + vmParamsFile = FileUtil.createTempFile("vm_params", null); + final PrintWriter writer = new PrintWriter(vmParamsFile); + try { + for (String param : parametersList.getList()) { + if (param.startsWith("-D")) { + writer.println(param); + } + } + } + finally { + writer.close(); + } + } + catch (IOException e) { + LOG.error(e); + } } + final List list = parametersList.getList(); + if (vmParamsFile == null) { + commandLine.addParameters(list); + } else { + for (String param : list) { + if (!param.trim().startsWith("-D")) { + commandLine.addParameter(param); + } + } + } + appendEncoding(javaParameters, commandLine, parametersList); if (classpathFile != null) { commandLine.addParameter(commandLineWrapper.getName()); commandLine.addParameter(classpathFile.getAbsolutePath()); } + if (vmParamsFile != null) { + commandLine.addParameter("@vm_params"); + commandLine.addParameter(vmParamsFile.getAbsolutePath()); + } } - else if(!parametersList.hasParameter("-classpath") && !parametersList.hasParameter("-cp")){ + else if (!parametersList.hasParameter("-classpath") && !parametersList.hasParameter("-cp")){ + commandLine.addParameters(parametersList.getList()); + appendEncoding(javaParameters, commandLine, parametersList); + commandLine.addParameter("-classpath"); commandLine.addParameter(javaParameters.getClassPath().getPathsString()); + } else { + commandLine.addParameters(parametersList.getList()); + appendEncoding(javaParameters, commandLine, parametersList); } final String mainClass = javaParameters.getMainClass(); @@ -220,6 +241,26 @@ public class JdkUtil { return commandLine; } + private static void appendEncoding(SimpleJavaParameters javaParameters, GeneralCommandLine commandLine, ParametersList parametersList) { + // Value of -Dfile.encoding and charset of GeneralCommandLine should be in sync in order process's input and output be correctly handled. + String encoding = parametersList.getPropertyValue("file.encoding"); + if (encoding == null) { + Charset charset = javaParameters.getCharset(); + if (charset == null) charset = EncodingManager.getInstance().getDefaultCharset(); + if (charset == null) charset = CharsetToolkit.getDefaultSystemCharset(); + commandLine.addParameter("-Dfile.encoding=" + charset.name()); + commandLine.setCharset(charset); + } + else { + try { + Charset charset = Charset.forName(encoding); + commandLine.setCharset(charset); + } + catch (UnsupportedCharsetException ignore) { + } + } + } + @Nullable private static Class getCommandLineWrapperClass() { try { From 7f34d2b6f38874c95c0ace0c65f9f9546be5018c Mon Sep 17 00:00:00 2001 From: anna Date: Wed, 8 Feb 2012 13:13:23 +0100 Subject: [PATCH 198/215] introduce variable: reassign to existing one: reuse old name in everywhere --- .../introduceVariable/JavaVariableInplaceIntroducer.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/java/java-impl/src/com/intellij/refactoring/introduceVariable/JavaVariableInplaceIntroducer.java b/java/java-impl/src/com/intellij/refactoring/introduceVariable/JavaVariableInplaceIntroducer.java index 0ff43fa7f042..400611d56e47 100644 --- a/java/java-impl/src/com/intellij/refactoring/introduceVariable/JavaVariableInplaceIntroducer.java +++ b/java/java-impl/src/com/intellij/refactoring/introduceVariable/JavaVariableInplaceIntroducer.java @@ -45,6 +45,7 @@ import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; +import java.util.ArrayList; import java.util.List; /** @@ -85,8 +86,10 @@ public class JavaVariableInplaceIntroducer extends InplaceVariableIntroducer rangeMarkers = new ArrayList(occurrenceMarkers); + rangeMarkers.add(exprMarker); editor.putUserData(ReassignVariableUtil.OCCURRENCES_KEY, - occurrenceMarkers.toArray(new RangeMarker[occurrenceMarkers.size()])); + rangeMarkers.toArray(new RangeMarker[rangeMarkers.size()])); } myExpression = expression; final PsiType defaultType = elementToRename.getType(); From 1e784542b816af186635fcc9697c9965a039dacf Mon Sep 17 00:00:00 2001 From: anna Date: Wed, 8 Feb 2012 14:13:46 +0100 Subject: [PATCH 199/215] move: move inner class with other files with its top level only (EA-33583 - CCE: JavaMoveFilesOrDirectoriesHandler.obtainContainingFile) --- .../JavaMoveFilesOrDirectoriesHandler.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/java/java-impl/src/com/intellij/refactoring/move/moveFilesOrDirectories/JavaMoveFilesOrDirectoriesHandler.java b/java/java-impl/src/com/intellij/refactoring/move/moveFilesOrDirectories/JavaMoveFilesOrDirectoriesHandler.java index 370d0e4f271b..c67b7b7b0967 100644 --- a/java/java-impl/src/com/intellij/refactoring/move/moveFilesOrDirectories/JavaMoveFilesOrDirectoriesHandler.java +++ b/java/java-impl/src/com/intellij/refactoring/move/moveFilesOrDirectories/JavaMoveFilesOrDirectoriesHandler.java @@ -24,6 +24,7 @@ import com.intellij.openapi.project.Project; import com.intellij.psi.*; import com.intellij.psi.impl.file.JavaDirectoryServiceImpl; import com.intellij.psi.search.GlobalSearchScope; +import com.intellij.psi.util.PsiUtil; import com.intellij.psi.util.PsiUtilBase; import com.intellij.refactoring.move.MoveCallback; import com.intellij.util.ArrayUtil; @@ -76,9 +77,12 @@ public class JavaMoveFilesOrDirectoriesHandler extends MoveFilesOrDirectoriesHan @Override protected void run(Result result) throws Throwable { final List adjustedElements = new ArrayList(); - for (PsiElement element : elements) { + for (int i = 0, length = elements.length; i < length; i++) { + PsiElement element = elements[i]; if (element instanceof PsiClass) { - final PsiFile containingFile = obtainContainingFile(element, elements); + final PsiClass topLevelClass = PsiUtil.getTopLevelClass(element); + elements[i] = topLevelClass; + final PsiFile containingFile = obtainContainingFile(topLevelClass, elements); if (containingFile != null && !adjustedElements.contains(containingFile)) { adjustedElements.add(containingFile); } From 1551ce991fc97d3f1a64627dc70fe6f3cb454f57 Mon Sep 17 00:00:00 2001 From: anna Date: Wed, 8 Feb 2012 14:15:53 +0100 Subject: [PATCH 200/215] EA-33584 - assert: Alarm._addRequest --- .../src/com/intellij/diagnostic/logging/LogConsoleBase.java | 1 + 1 file changed, 1 insertion(+) diff --git a/platform/lang-impl/src/com/intellij/diagnostic/logging/LogConsoleBase.java b/platform/lang-impl/src/com/intellij/diagnostic/logging/LogConsoleBase.java index 6b6fd6351e66..452f22b6a61b 100644 --- a/platform/lang-impl/src/com/intellij/diagnostic/logging/LogConsoleBase.java +++ b/platform/lang-impl/src/com/intellij/diagnostic/logging/LogConsoleBase.java @@ -617,6 +617,7 @@ public abstract class LogConsoleBase extends AdditionalTabComponent implements L myAlarm.addRequest(this, 100); } }; + if (myAlarm.isDisposed()) return; myAlarm.addRequest(runnable, 10); } From c5fc815080a84c066d80390f78782a14a6372fe7 Mon Sep 17 00:00:00 2001 From: anna Date: Wed, 8 Feb 2012 19:38:41 +0100 Subject: [PATCH 201/215] check for writable: EA-33580 - IOE: CheckUtil.checkWritable --- .../codeInsight/daemon/impl/quickfix/PullAsAbstractUpFix.java | 1 + 1 file changed, 1 insertion(+) diff --git a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/PullAsAbstractUpFix.java b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/PullAsAbstractUpFix.java index 92134363acbf..883c17f21592 100644 --- a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/PullAsAbstractUpFix.java +++ b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/PullAsAbstractUpFix.java @@ -122,6 +122,7 @@ public class PullAsAbstractUpFix extends LocalQuickFixAndIntentionActionOnPsiEle } private static void pullUp(PsiMethod method, PsiClass containingClass, PsiClass baseClass) { + if (!CodeInsightUtilBase.prepareFileForWrite(baseClass.getContainingFile())) return; final MemberInfo memberInfo = new MemberInfo(method); memberInfo.setChecked(true); memberInfo.setToAbstract(true); From 64e49569a2a0237102ac87a2123a474020e96b6c Mon Sep 17 00:00:00 2001 From: Alexander Lobas Date: Wed, 8 Feb 2012 23:01:34 +0400 Subject: [PATCH 202/215] Android Designer --- plugins/android-designer/android-designer.iml | 2 + .../android-designer/src/META-INF/plugin.xml | 7 ++ .../designer/AndroidDesignerBundle.java | 50 ++++++++++ .../designer/AndroidDesignerEditor.java | 65 +++++++++++++ .../AndroidDesignerEditorProvider.java | 87 +++++++++++++++++ .../messages/AndroidDesignerBundle.properties | 1 + .../ui-designer-new/src/META-INF/plugin.xml | 11 ++- .../intellij/uiDesigner/DesignerEditor.java | 97 +++++++++++++++++++ .../intellij/uiDesigner/UIDesignerBundle.java | 50 ++++++++++ .../UIDesignerToolWindowManager.java | 52 ++++++++++ .../componentTree/ComponentTree.java | 30 ++++++ .../designSurface/DesignerEditorPanel.java | 48 +++++++++ .../uiDesigner/model/RadComponent.java | 47 +++++++++ .../uiDesigner/propertyTable/Property.java | 60 ++++++++++++ .../propertyTable/PropertyEditor.java | 29 ++++++ .../propertyTable/PropertyRenderer.java | 41 ++++++++ .../propertyTable/PropertyTable.java | 30 ++++++ .../propertyTable/PropertyTablePanel.java | 29 ++++++ 18 files changed, 735 insertions(+), 1 deletion(-) create mode 100644 plugins/android-designer/src/com/intellij/android/designer/AndroidDesignerBundle.java create mode 100644 plugins/android-designer/src/com/intellij/android/designer/AndroidDesignerEditor.java create mode 100644 plugins/android-designer/src/com/intellij/android/designer/AndroidDesignerEditorProvider.java create mode 100644 plugins/ui-designer/ui-designer-new/src/com/intellij/uiDesigner/DesignerEditor.java create mode 100644 plugins/ui-designer/ui-designer-new/src/com/intellij/uiDesigner/UIDesignerBundle.java create mode 100644 plugins/ui-designer/ui-designer-new/src/com/intellij/uiDesigner/UIDesignerToolWindowManager.java create mode 100644 plugins/ui-designer/ui-designer-new/src/com/intellij/uiDesigner/componentTree/ComponentTree.java create mode 100644 plugins/ui-designer/ui-designer-new/src/com/intellij/uiDesigner/designSurface/DesignerEditorPanel.java create mode 100644 plugins/ui-designer/ui-designer-new/src/com/intellij/uiDesigner/model/RadComponent.java create mode 100644 plugins/ui-designer/ui-designer-new/src/com/intellij/uiDesigner/propertyTable/Property.java create mode 100644 plugins/ui-designer/ui-designer-new/src/com/intellij/uiDesigner/propertyTable/PropertyEditor.java create mode 100644 plugins/ui-designer/ui-designer-new/src/com/intellij/uiDesigner/propertyTable/PropertyRenderer.java create mode 100644 plugins/ui-designer/ui-designer-new/src/com/intellij/uiDesigner/propertyTable/PropertyTable.java create mode 100644 plugins/ui-designer/ui-designer-new/src/com/intellij/uiDesigner/propertyTable/PropertyTablePanel.java diff --git a/plugins/android-designer/android-designer.iml b/plugins/android-designer/android-designer.iml index 9a14d495950f..a6cb9856732d 100644 --- a/plugins/android-designer/android-designer.iml +++ b/plugins/android-designer/android-designer.iml @@ -22,6 +22,8 @@ + + diff --git a/plugins/android-designer/src/META-INF/plugin.xml b/plugins/android-designer/src/META-INF/plugin.xml index 6705ae7c0b31..b808ad518995 100644 --- a/plugins/android-designer/src/META-INF/plugin.xml +++ b/plugins/android-designer/src/META-INF/plugin.xml @@ -2,9 +2,16 @@ Android Designer com.intellij.android-designer JetBrains + messages.AndroidDesignerBundle + com.intellij.java-i18n com.intellij.properties org.jetbrains.android com.intellij.ui-designer-new + + + + + diff --git a/plugins/android-designer/src/com/intellij/android/designer/AndroidDesignerBundle.java b/plugins/android-designer/src/com/intellij/android/designer/AndroidDesignerBundle.java new file mode 100644 index 000000000000..6442f216e766 --- /dev/null +++ b/plugins/android-designer/src/com/intellij/android/designer/AndroidDesignerBundle.java @@ -0,0 +1,50 @@ +/* + * Copyright 2000-2012 JetBrains s.r.o. + * + * 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. + */ +package com.intellij.android.designer; + +import com.intellij.CommonBundle; +import org.jetbrains.annotations.NonNls; +import org.jetbrains.annotations.PropertyKey; + +import java.lang.ref.Reference; +import java.lang.ref.SoftReference; +import java.util.ResourceBundle; + +/** + * @author yole + */ +public class AndroidDesignerBundle { + private static Reference ourBundle; + + @NonNls private static final String BUNDLE = "messages.AndroidDesignerBundle"; + + private AndroidDesignerBundle() { + } + + public static String message(@PropertyKey(resourceBundle = BUNDLE) String key, Object... params) { + return CommonBundle.message(getBundle(), key, params); + } + + private static ResourceBundle getBundle() { + ResourceBundle bundle = null; + if (ourBundle != null) bundle = ourBundle.get(); + if (bundle == null) { + bundle = ResourceBundle.getBundle(BUNDLE); + ourBundle = new SoftReference(bundle); + } + return bundle; + } +} \ No newline at end of file diff --git a/plugins/android-designer/src/com/intellij/android/designer/AndroidDesignerEditor.java b/plugins/android-designer/src/com/intellij/android/designer/AndroidDesignerEditor.java new file mode 100644 index 000000000000..da32138b3de3 --- /dev/null +++ b/plugins/android-designer/src/com/intellij/android/designer/AndroidDesignerEditor.java @@ -0,0 +1,65 @@ +/* + * Copyright 2000-2012 JetBrains s.r.o. + * + * 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. + */ +package com.intellij.android.designer; + +import com.intellij.openapi.fileEditor.FileEditorState; +import com.intellij.openapi.fileEditor.FileEditorStateLevel; +import com.intellij.openapi.project.Project; +import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.uiDesigner.DesignerEditor; +import org.jetbrains.annotations.NotNull; + +/** + * @author Alexander Lobas + */ +public final class AndroidDesignerEditor extends DesignerEditor { + public AndroidDesignerEditor(Project project, VirtualFile file) { + super(project, file); + } + + @NotNull + @Override + public String getName() { + return AndroidDesignerBundle.message("editor.tab.title"); + } + + @Override + public boolean isValid() { + return true; // TODO: Auto-generated method stub + } + + @NotNull + @Override + public FileEditorState getState(@NotNull FileEditorStateLevel level) { + // TODO: Auto-generated method stub + return new FileEditorState() { + @Override + public boolean canBeMergedWith(FileEditorState otherState, FileEditorStateLevel level) { + return false; + } + }; + } + + @Override + public void setState(@NotNull FileEditorState state) { + // TODO: Auto-generated method stub + } + + @Override + public boolean isModified() { + return false; + } +} \ No newline at end of file diff --git a/plugins/android-designer/src/com/intellij/android/designer/AndroidDesignerEditorProvider.java b/plugins/android-designer/src/com/intellij/android/designer/AndroidDesignerEditorProvider.java new file mode 100644 index 000000000000..cb4e2796aa59 --- /dev/null +++ b/plugins/android-designer/src/com/intellij/android/designer/AndroidDesignerEditorProvider.java @@ -0,0 +1,87 @@ +/* + * Copyright 2000-2012 JetBrains s.r.o. + * + * 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. + */ +package com.intellij.android.designer; + +import com.intellij.openapi.editor.Document; +import com.intellij.openapi.fileEditor.*; +import com.intellij.openapi.project.DumbAware; +import com.intellij.openapi.project.Project; +import com.intellij.openapi.util.Disposer; +import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.psi.PsiDocumentManager; +import com.intellij.psi.PsiFile; +import com.intellij.psi.xml.XmlFile; +import org.jdom.Element; +import org.jetbrains.android.dom.layout.LayoutDomFileDescription; +import org.jetbrains.android.facet.AndroidFacet; +import org.jetbrains.annotations.NotNull; + +/** + * @author Alexander Lobas + */ +public final class AndroidDesignerEditorProvider implements FileEditorProvider, DumbAware { + @Override + public boolean accept(@NotNull Project project, @NotNull VirtualFile file) { + Document document = FileDocumentManager.getInstance().getDocument(file); + if (document != null) { + PsiFile psiFile = PsiDocumentManager.getInstance(project).getPsiFile(document); + return psiFile instanceof XmlFile && + AndroidFacet.getInstance(psiFile) != null && + LayoutDomFileDescription.isLayoutFile((XmlFile)psiFile); + } + return false; + } + + @NotNull + @Override + public FileEditor createEditor(@NotNull Project project, @NotNull VirtualFile file) { + return new AndroidDesignerEditor(project, file); + } + + @Override + public void disposeEditor(@NotNull FileEditor editor) { + Disposer.dispose(editor); + } + + @NotNull + @Override + public FileEditorState readState(@NotNull Element sourceElement, @NotNull Project project, @NotNull VirtualFile file) { + // TODO: Auto-generated method stub + return new FileEditorState() { + @Override + public boolean canBeMergedWith(FileEditorState otherState, FileEditorStateLevel level) { + return false; + } + }; + } + + @Override + public void writeState(@NotNull FileEditorState state, @NotNull Project project, @NotNull Element targetElement) { + // TODO: Auto-generated method stub + } + + @NotNull + @Override + public String getEditorTypeId() { + return "android-designer"; + } + + @NotNull + @Override + public FileEditorPolicy getPolicy() { + return FileEditorPolicy.PLACE_BEFORE_DEFAULT_EDITOR; + } +} \ No newline at end of file diff --git a/plugins/android-designer/src/messages/AndroidDesignerBundle.properties b/plugins/android-designer/src/messages/AndroidDesignerBundle.properties index e69de29bb2d1..d45742e29143 100644 --- a/plugins/android-designer/src/messages/AndroidDesignerBundle.properties +++ b/plugins/android-designer/src/messages/AndroidDesignerBundle.properties @@ -0,0 +1 @@ +editor.tab.title=Design \ No newline at end of file diff --git a/plugins/ui-designer/ui-designer-new/src/META-INF/plugin.xml b/plugins/ui-designer/ui-designer-new/src/META-INF/plugin.xml index 1f86521a5c16..f17e6122d390 100644 --- a/plugins/ui-designer/ui-designer-new/src/META-INF/plugin.xml +++ b/plugins/ui-designer/ui-designer-new/src/META-INF/plugin.xml @@ -1,8 +1,17 @@ - UI Designer + UI Designer (Core) com.intellij.ui-designer-new JetBrains + messages.UIDesignerBundle + com.intellij.java-i18n com.intellij.properties + + + + com.intellij.uiDesigner.UIDesignerToolWindowManager + + + diff --git a/plugins/ui-designer/ui-designer-new/src/com/intellij/uiDesigner/DesignerEditor.java b/plugins/ui-designer/ui-designer-new/src/com/intellij/uiDesigner/DesignerEditor.java new file mode 100644 index 000000000000..9612ef06c6c3 --- /dev/null +++ b/plugins/ui-designer/ui-designer-new/src/com/intellij/uiDesigner/DesignerEditor.java @@ -0,0 +1,97 @@ +/* + * Copyright 2000-2012 JetBrains s.r.o. + * + * 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. + */ +package com.intellij.uiDesigner; + +import com.intellij.codeHighlighting.BackgroundEditorHighlighter; +import com.intellij.ide.structureView.StructureViewBuilder; +import com.intellij.openapi.fileEditor.FileEditor; +import com.intellij.openapi.fileEditor.FileEditorLocation; +import com.intellij.openapi.module.Module; +import com.intellij.openapi.module.ModuleUtil; +import com.intellij.openapi.project.Project; +import com.intellij.openapi.util.UserDataHolderBase; +import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.testFramework.LightVirtualFile; +import com.intellij.uiDesigner.designSurface.DesignerEditorPanel; +import org.jetbrains.annotations.NotNull; + +import javax.swing.*; +import java.beans.PropertyChangeListener; + +/** + * @author Alexander Lobas + */ +public abstract class DesignerEditor extends UserDataHolderBase implements FileEditor { + private final DesignerEditorPanel myDesignerPanel; + + public DesignerEditor(Project project, VirtualFile file) { + if (file instanceof LightVirtualFile) { + file = ((LightVirtualFile)file).getOriginalFile(); + } + Module module = ModuleUtil.findModuleForFile(file, project); + if (module == null) { + throw new IllegalArgumentException("No module for file " + file + " in project " + project); + } + myDesignerPanel = new DesignerEditorPanel(module, file); + } + + @NotNull + @Override + public JComponent getComponent() { + return myDesignerPanel; + } + + @Override + public JComponent getPreferredFocusedComponent() { + return myDesignerPanel.getPreferredFocusedComponent(); + } + + @Override + public void dispose() { + myDesignerPanel.dispose(); + } + + @Override + public void selectNotify() { + } + + @Override + public void deselectNotify() { + } + + @Override + public void addPropertyChangeListener(@NotNull PropertyChangeListener listener) { + } + + @Override + public void removePropertyChangeListener(@NotNull PropertyChangeListener listener) { + } + + @Override + public BackgroundEditorHighlighter getBackgroundHighlighter() { + return null; + } + + @Override + public FileEditorLocation getCurrentLocation() { + return null; + } + + @Override + public StructureViewBuilder getStructureViewBuilder() { + return null; + } +} \ No newline at end of file diff --git a/plugins/ui-designer/ui-designer-new/src/com/intellij/uiDesigner/UIDesignerBundle.java b/plugins/ui-designer/ui-designer-new/src/com/intellij/uiDesigner/UIDesignerBundle.java new file mode 100644 index 000000000000..ec46f725d320 --- /dev/null +++ b/plugins/ui-designer/ui-designer-new/src/com/intellij/uiDesigner/UIDesignerBundle.java @@ -0,0 +1,50 @@ +/* + * Copyright 2000-2012 JetBrains s.r.o. + * + * 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. + */ +package com.intellij.uiDesigner; + +import com.intellij.CommonBundle; +import org.jetbrains.annotations.NonNls; +import org.jetbrains.annotations.PropertyKey; + +import java.lang.ref.Reference; +import java.lang.ref.SoftReference; +import java.util.ResourceBundle; + +/** + * @author yole + */ +public class UIDesignerBundle { + private static Reference ourBundle; + + @NonNls private static final String BUNDLE = "messages.UIDesignerBundle"; + + private UIDesignerBundle() { + } + + public static String message(@PropertyKey(resourceBundle = BUNDLE) String key, Object... params) { + return CommonBundle.message(getBundle(), key, params); + } + + private static ResourceBundle getBundle() { + ResourceBundle bundle = null; + if (ourBundle != null) bundle = ourBundle.get(); + if (bundle == null) { + bundle = ResourceBundle.getBundle(BUNDLE); + ourBundle = new SoftReference(bundle); + } + return bundle; + } +} \ No newline at end of file diff --git a/plugins/ui-designer/ui-designer-new/src/com/intellij/uiDesigner/UIDesignerToolWindowManager.java b/plugins/ui-designer/ui-designer-new/src/com/intellij/uiDesigner/UIDesignerToolWindowManager.java new file mode 100644 index 000000000000..03f0171f0aaa --- /dev/null +++ b/plugins/ui-designer/ui-designer-new/src/com/intellij/uiDesigner/UIDesignerToolWindowManager.java @@ -0,0 +1,52 @@ +/* + * Copyright 2000-2012 JetBrains s.r.o. + * + * 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. + */ +package com.intellij.uiDesigner; + +import com.intellij.openapi.components.ProjectComponent; +import org.jetbrains.annotations.NonNls; +import org.jetbrains.annotations.NotNull; + +/** + * @author Alexander Lobas + */ +public final class UIDesignerToolWindowManager implements ProjectComponent { + @Override + public void projectOpened() { + // TODO: Auto-generated method stub + } + + @Override + public void projectClosed() { + // TODO: Auto-generated method stub + } + + @Override + public void initComponent() { + // TODO: Auto-generated method stub + } + + @Override + public void disposeComponent() { + // TODO: Auto-generated method stub + } + + @NotNull + @NonNls + @Override + public String getComponentName() { + return "UIDesignerToolWindowManager2"; + } +} \ No newline at end of file diff --git a/plugins/ui-designer/ui-designer-new/src/com/intellij/uiDesigner/componentTree/ComponentTree.java b/plugins/ui-designer/ui-designer-new/src/com/intellij/uiDesigner/componentTree/ComponentTree.java new file mode 100644 index 000000000000..25e524e08173 --- /dev/null +++ b/plugins/ui-designer/ui-designer-new/src/com/intellij/uiDesigner/componentTree/ComponentTree.java @@ -0,0 +1,30 @@ +/* + * Copyright 2000-2012 JetBrains s.r.o. + * + * 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. + */ +package com.intellij.uiDesigner.componentTree; + +import com.intellij.openapi.actionSystem.DataProvider; +import com.intellij.ui.treeStructure.Tree; +import org.jetbrains.annotations.NonNls; + +/** + * @author Alexander Lobas + */ +public final class ComponentTree extends Tree implements DataProvider { + @Override + public Object getData(@NonNls String dataId) { + return null; //To change body of implemented methods use File | Settings | File Templates. + } +} \ No newline at end of file diff --git a/plugins/ui-designer/ui-designer-new/src/com/intellij/uiDesigner/designSurface/DesignerEditorPanel.java b/plugins/ui-designer/ui-designer-new/src/com/intellij/uiDesigner/designSurface/DesignerEditorPanel.java new file mode 100644 index 000000000000..da8039a5f012 --- /dev/null +++ b/plugins/ui-designer/ui-designer-new/src/com/intellij/uiDesigner/designSurface/DesignerEditorPanel.java @@ -0,0 +1,48 @@ +/* + * Copyright 2000-2012 JetBrains s.r.o. + * + * 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. + */ +package com.intellij.uiDesigner.designSurface; + +import com.intellij.openapi.actionSystem.DataProvider; +import com.intellij.openapi.module.Module; +import com.intellij.openapi.vfs.VirtualFile; +import org.jetbrains.annotations.NonNls; +import org.jetbrains.annotations.NotNull; + +import javax.swing.*; +import java.awt.*; + +/** + * @author Alexander Lobas + */ +public final class DesignerEditorPanel extends JPanel implements DataProvider { + public DesignerEditorPanel(@NotNull Module module, @NotNull VirtualFile file) { + setLayout(new BorderLayout()); + add(new JLabel("Design Surface"), BorderLayout.CENTER); + } + + @Override + public Object getData(@NonNls String dataId) { + return null; //To change body of implemented methods use File | Settings | File Templates. + } + + public void dispose() { + // TODO: Auto-generated method stub + } + + public JComponent getPreferredFocusedComponent() { + return null; // TODO: Auto-generated method stub + } +} \ No newline at end of file diff --git a/plugins/ui-designer/ui-designer-new/src/com/intellij/uiDesigner/model/RadComponent.java b/plugins/ui-designer/ui-designer-new/src/com/intellij/uiDesigner/model/RadComponent.java new file mode 100644 index 000000000000..23225a438671 --- /dev/null +++ b/plugins/ui-designer/ui-designer-new/src/com/intellij/uiDesigner/model/RadComponent.java @@ -0,0 +1,47 @@ +/* + * Copyright 2000-2012 JetBrains s.r.o. + * + * 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. + */ +package com.intellij.uiDesigner.model; + +import com.intellij.uiDesigner.propertyTable.Property; + +import java.util.List; + +/** + * @author Alexander Lobas + */ +public abstract class RadComponent { + private RadComponent myParent; + + public RadComponent getRoot() { + return myParent == null ? this : myParent.getRoot(); + } + + public final RadComponent getParent() { + return myParent; + } + + public final void setParent(RadComponent parent) { + myParent = parent; + } + + public List getChildren() { + return null; + } + + public List getProperties() { + return null; + } +} \ No newline at end of file diff --git a/plugins/ui-designer/ui-designer-new/src/com/intellij/uiDesigner/propertyTable/Property.java b/plugins/ui-designer/ui-designer-new/src/com/intellij/uiDesigner/propertyTable/Property.java new file mode 100644 index 000000000000..f2b8bfd4171b --- /dev/null +++ b/plugins/ui-designer/ui-designer-new/src/com/intellij/uiDesigner/propertyTable/Property.java @@ -0,0 +1,60 @@ +/* + * Copyright 2000-2012 JetBrains s.r.o. + * + * 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. + */ +package com.intellij.uiDesigner.propertyTable; + +import com.intellij.uiDesigner.model.RadComponent; +import org.jetbrains.annotations.NonNls; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.List; + +/** + * @author Alexander Lobas + */ +public abstract class Property { + private final Property myParent; + @NotNull private final String myName; + + public Property(Property parent, @NotNull @NonNls String name) { + + myParent = parent; + myName = name; + } + + public final Property getParent() { + return myParent; + } + + @NotNull + public final String getName() { + return myName; + } + + public List getChildren(RadComponent component) { + return null; + } + + public Object getValue(RadComponent component) { + return null; + } + + @NotNull + public abstract PropertyRenderer getRenderer(); + + @Nullable + public abstract PropertyEditor getEditor(); +} \ No newline at end of file diff --git a/plugins/ui-designer/ui-designer-new/src/com/intellij/uiDesigner/propertyTable/PropertyEditor.java b/plugins/ui-designer/ui-designer-new/src/com/intellij/uiDesigner/propertyTable/PropertyEditor.java new file mode 100644 index 000000000000..91029fa37dbd --- /dev/null +++ b/plugins/ui-designer/ui-designer-new/src/com/intellij/uiDesigner/propertyTable/PropertyEditor.java @@ -0,0 +1,29 @@ +/* + * Copyright 2000-2012 JetBrains s.r.o. + * + * 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. + */ +package com.intellij.uiDesigner.propertyTable; + +import com.intellij.uiDesigner.model.RadComponent; + +import javax.swing.*; + +/** + * @author Alexander Lobas + */ +public interface PropertyEditor { + JComponent getComponent(RadComponent component, Object value); + + Object getValue(); +} \ No newline at end of file diff --git a/plugins/ui-designer/ui-designer-new/src/com/intellij/uiDesigner/propertyTable/PropertyRenderer.java b/plugins/ui-designer/ui-designer-new/src/com/intellij/uiDesigner/propertyTable/PropertyRenderer.java new file mode 100644 index 000000000000..5b63bf8b66ac --- /dev/null +++ b/plugins/ui-designer/ui-designer-new/src/com/intellij/uiDesigner/propertyTable/PropertyRenderer.java @@ -0,0 +1,41 @@ +/* + * Copyright 2000-2012 JetBrains s.r.o. + * + * 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. + */ +package com.intellij.uiDesigner.propertyTable; + +import com.intellij.uiDesigner.model.RadComponent; + +import javax.swing.*; + +/** + * @author Alexander Lobas + */ +public interface PropertyRenderer { + /** + * @return JComponent to represent the value + * somewhere in UI (for example in the JList of in the JTree). To be + * consistent with other UI additional parameter abount selection and + * focus are also passed. + */ + JComponent getComponent(RadComponent component, Object value, boolean selected, boolean hasFocus); + + /** + * Renderer should update UI of all its internal components to fit current + * IDEA Look And Feel. We cannot directly update UI of the component + * that is returned by {@link #getComponent } method + * because hidden component that are not in the Swing tree can exist. + */ + void updateUI(); +} \ No newline at end of file diff --git a/plugins/ui-designer/ui-designer-new/src/com/intellij/uiDesigner/propertyTable/PropertyTable.java b/plugins/ui-designer/ui-designer-new/src/com/intellij/uiDesigner/propertyTable/PropertyTable.java new file mode 100644 index 000000000000..0e79e343a095 --- /dev/null +++ b/plugins/ui-designer/ui-designer-new/src/com/intellij/uiDesigner/propertyTable/PropertyTable.java @@ -0,0 +1,30 @@ +/* + * Copyright 2000-2012 JetBrains s.r.o. + * + * 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. + */ +package com.intellij.uiDesigner.propertyTable; + +import com.intellij.openapi.actionSystem.DataProvider; +import com.intellij.ui.table.JBTable; +import org.jetbrains.annotations.NonNls; + +/** + * @author Alexander Lobas + */ +public final class PropertyTable extends JBTable implements DataProvider { + @Override + public Object getData(@NonNls String dataId) { + return null; //To change body of implemented methods use File | Settings | File Templates. + } +} \ No newline at end of file diff --git a/plugins/ui-designer/ui-designer-new/src/com/intellij/uiDesigner/propertyTable/PropertyTablePanel.java b/plugins/ui-designer/ui-designer-new/src/com/intellij/uiDesigner/propertyTable/PropertyTablePanel.java new file mode 100644 index 000000000000..b6f6e9ee00a2 --- /dev/null +++ b/plugins/ui-designer/ui-designer-new/src/com/intellij/uiDesigner/propertyTable/PropertyTablePanel.java @@ -0,0 +1,29 @@ +/* + * Copyright 2000-2012 JetBrains s.r.o. + * + * 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. + */ +package com.intellij.uiDesigner.propertyTable; + +import javax.swing.*; +import java.awt.*; + +/** + * @author Alexander Lobas + */ +public final class PropertyTablePanel extends JPanel { + public PropertyTablePanel() { + setLayout(new BorderLayout()); + add(new JLabel("Design Surface"), BorderLayout.CENTER); + } +} \ No newline at end of file From c57dd56afc2a4181bbdcb90bfab0c1e3a7fa50c5 Mon Sep 17 00:00:00 2001 From: Konstantin Bulenkov Date: Wed, 8 Feb 2012 20:16:42 +0100 Subject: [PATCH 203/215] IDEA-80905 Place.goFurther: please respect 'requestFocus' parameter --- platform/platform-api/src/com/intellij/ui/navigation/Place.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platform/platform-api/src/com/intellij/ui/navigation/Place.java b/platform/platform-api/src/com/intellij/ui/navigation/Place.java index d07c935dc48f..cc88c74b6745 100644 --- a/platform/platform-api/src/com/intellij/ui/navigation/Place.java +++ b/platform/platform-api/src/com/intellij/ui/navigation/Place.java @@ -97,7 +97,7 @@ public class Place implements ComparableObject { public static ActionCallback goFurther(Object object, Place place, final boolean requestFocus) { if (object instanceof Navigator) { - return ((Navigator)object).navigateTo(place, false); + return ((Navigator)object).navigateTo(place, requestFocus); } else { return new ActionCallback.Done(); } From 4a2642f4cf8bdd4392c3c02137df468a444d6314 Mon Sep 17 00:00:00 2001 From: Dmitry Boulytchev Date: Wed, 8 Feb 2012 23:25:15 +0400 Subject: [PATCH 204/215] Yet another modest enhancement in integrate (compile server). --- .../jetbrains/ether/dependencyView/Mappings.java | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/jps/model/src/org/jetbrains/ether/dependencyView/Mappings.java b/jps/model/src/org/jetbrains/ether/dependencyView/Mappings.java index 67d9f9af2d2a..7f6f3624d1c7 100644 --- a/jps/model/src/org/jetbrains/ether/dependencyView/Mappings.java +++ b/jps/model/src/org/jetbrains/ether/dependencyView/Mappings.java @@ -1626,8 +1626,22 @@ public class Mappings { compiledSet.add(myContext.get(FileUtil.toSystemIndependentName(c.getAbsolutePath()))); } + final Collection changedClasses = delta.getChangedClasses(); + for (DependencyContext.S file : delta.myClassToClassDependency.keyCollection()) { final Collection now = delta.myClassToClassDependency.get(file); + + if (delta.isDifferentiated()) { + final boolean classChanged = changedClasses.contains(file); + final HashSet depClasses = new HashSet(now); + + depClasses.retainAll(changedClasses); + + if (! classChanged && now.isEmpty()) { + continue; + } + } + final Collection past = myClassToClassDependency.get(file); if (past == null) { From 05125dd9cb6554644a184e7c97f4b5071cc689aa Mon Sep 17 00:00:00 2001 From: Dmitry Boulytchev Date: Wed, 8 Feb 2012 23:46:01 +0400 Subject: [PATCH 205/215] Some fix on that modest enhancement in integrate (compile server). --- .../src/org/jetbrains/ether/dependencyView/Mappings.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/jps/model/src/org/jetbrains/ether/dependencyView/Mappings.java b/jps/model/src/org/jetbrains/ether/dependencyView/Mappings.java index 7f6f3624d1c7..0a4a45bd44f3 100644 --- a/jps/model/src/org/jetbrains/ether/dependencyView/Mappings.java +++ b/jps/model/src/org/jetbrains/ether/dependencyView/Mappings.java @@ -34,8 +34,8 @@ public class Mappings { private final boolean myDeltaIsTransient; private boolean myIsDifferentiated = false; - private final List myChangedClasses; - private final List myChangedFiles; + private final Set myChangedClasses; + private final Set myChangedFiles; private void addChangedClass(final DependencyContext.S it) { assert (myChangedClasses != null && myChangedFiles != null); @@ -121,8 +121,8 @@ public class Mappings { private Mappings(final Mappings base) throws IOException { myIsDelta = true; - myChangedClasses = new LinkedList(); - myChangedFiles = new LinkedList(); + myChangedClasses = new HashSet(); + myChangedFiles = new HashSet(); myDeltaIsTransient = base.myDeltaIsTransient; myRootDir = new File(FileUtil.toSystemIndependentName(base.myRootDir.getAbsolutePath()) + File.separatorChar + "delta"); myContext = base.myContext; From 4bb4852d1d0813f330d30036307682953d918883 Mon Sep 17 00:00:00 2001 From: anna Date: Wed, 8 Feb 2012 20:23:43 +0100 Subject: [PATCH 206/215] plugins: no need to load in sync repository data (IDEA-81072) --- .../ide/plugins/InstalledPluginsTableModel.java | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/platform/platform-impl/src/com/intellij/ide/plugins/InstalledPluginsTableModel.java b/platform/platform-impl/src/com/intellij/ide/plugins/InstalledPluginsTableModel.java index 7985f2f04708..c813fd6d3448 100644 --- a/platform/platform-impl/src/com/intellij/ide/plugins/InstalledPluginsTableModel.java +++ b/platform/platform-impl/src/com/intellij/ide/plugins/InstalledPluginsTableModel.java @@ -19,6 +19,9 @@ import com.intellij.ide.IdeBundle; import com.intellij.openapi.application.ApplicationNamesInfo; import com.intellij.openapi.application.ex.ApplicationInfoEx; import com.intellij.openapi.extensions.PluginId; +import com.intellij.openapi.progress.ProgressIndicator; +import com.intellij.openapi.progress.ProgressManager; +import com.intellij.openapi.progress.Task; import com.intellij.openapi.ui.DialogWrapper; import com.intellij.openapi.ui.Messages; import com.intellij.openapi.updateSettings.impl.PluginDownloader; @@ -37,6 +40,7 @@ import com.intellij.util.containers.hash.HashSet; import com.intellij.util.ui.ColumnInfo; import com.intellij.util.ui.UIUtil; import org.jetbrains.annotations.NonNls; +import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import javax.swing.*; @@ -114,7 +118,12 @@ public class InstalledPluginsTableModel extends PluginTableModel { updatePluginDependencies(); - updateRepositoryPlugins(); + ProgressManager.getInstance().run(new Task.Backgroundable(null, "Load custom plugin repositories data...") { + @Override + public void run(@NotNull ProgressIndicator indicator) { + updateRepositoryPlugins(); + } + }); } public void updateRepositoryPlugins() { From f5a0d4fbe23c8d2451821e43a666e497173da896 Mon Sep 17 00:00:00 2001 From: Dmitry Boulytchev Date: Thu, 9 Feb 2012 00:33:02 +0400 Subject: [PATCH 207/215] Reverting some modest enhancement in integrate (compile server). --- .../ether/dependencyView/Mappings.java | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/jps/model/src/org/jetbrains/ether/dependencyView/Mappings.java b/jps/model/src/org/jetbrains/ether/dependencyView/Mappings.java index 0a4a45bd44f3..d5d3bd1957c0 100644 --- a/jps/model/src/org/jetbrains/ether/dependencyView/Mappings.java +++ b/jps/model/src/org/jetbrains/ether/dependencyView/Mappings.java @@ -1593,7 +1593,7 @@ public class Mappings { myClassToSourceFile.putAll(delta.myClassToSourceFile); } - if (delta.isDifferentiated()) { + if (delta.isDifferentiated() && false) { for (DependencyContext.S f : delta.getChangedFiles()) { mySourceFileToClasses.remove(f); final Collection classes = delta.mySourceFileToClasses.get(f); @@ -1628,32 +1628,32 @@ public class Mappings { final Collection changedClasses = delta.getChangedClasses(); - for (DependencyContext.S file : delta.myClassToClassDependency.keyCollection()) { - final Collection now = delta.myClassToClassDependency.get(file); + for (DependencyContext.S aClass : delta.myClassToClassDependency.keyCollection()) { + final Collection now = delta.myClassToClassDependency.get(aClass); if (delta.isDifferentiated()) { - final boolean classChanged = changedClasses.contains(file); + final boolean classChanged = changedClasses.contains(aClass); final HashSet depClasses = new HashSet(now); depClasses.retainAll(changedClasses); - if (! classChanged && now.isEmpty()) { + if (! classChanged && depClasses.isEmpty()) { continue; } } - final Collection past = myClassToClassDependency.get(file); + final Collection past = myClassToClassDependency.get(aClass); if (past == null) { - myClassToClassDependency.put(file, now); + myClassToClassDependency.put(aClass, now); } else { boolean changed = past.removeAll(compiledSet); changed |= past.addAll(now); if (changed) { - myClassToClassDependency.remove(file); - myClassToClassDependency.put(file, past); + myClassToClassDependency.remove(aClass); + myClassToClassDependency.put(aClass, past); } } } From 213ff0e7fc61dff180d541f7ad49de1a2820f8c3 Mon Sep 17 00:00:00 2001 From: anna Date: Wed, 8 Feb 2012 21:36:34 +0100 Subject: [PATCH 208/215] scopes: allow ~ in file names (IDEA-81005) --- .../FilePackageSetParserExtension.java | 4 + .../packageSet/PackageSetFactoryImpl.java | 5 +- .../packageSet/lexer/ScopeTokenTypes.java | 1 + .../scope/packageSet/lexer/_ScopesLexer.flex | 1 + .../scope/packageSet/lexer/_ScopesLexer.java | 295 +++++++++--------- 5 files changed, 153 insertions(+), 153 deletions(-) diff --git a/platform/lang-impl/src/com/intellij/psi/search/scope/packageSet/FilePackageSetParserExtension.java b/platform/lang-impl/src/com/intellij/psi/search/scope/packageSet/FilePackageSetParserExtension.java index 76a8887d309a..0ac74be01590 100644 --- a/platform/lang-impl/src/com/intellij/psi/search/scope/packageSet/FilePackageSetParserExtension.java +++ b/platform/lang-impl/src/com/intellij/psi/search/scope/packageSet/FilePackageSetParserExtension.java @@ -85,6 +85,10 @@ public class FilePackageSetParserExtension implements PackageSetParserExtension wasIdentifier = false; pattern.append("-"); } + else if (lexer.getTokenType() == ScopeTokenTypes.TILDE) { + wasIdentifier = false; + pattern.append("~"); + } else { break; } diff --git a/platform/lang-impl/src/com/intellij/psi/search/scope/packageSet/PackageSetFactoryImpl.java b/platform/lang-impl/src/com/intellij/psi/search/scope/packageSet/PackageSetFactoryImpl.java index 8f52b76f7ad3..19293742a3e5 100644 --- a/platform/lang-impl/src/com/intellij/psi/search/scope/packageSet/PackageSetFactoryImpl.java +++ b/platform/lang-impl/src/com/intellij/psi/search/scope/packageSet/PackageSetFactoryImpl.java @@ -128,7 +128,10 @@ public class PackageSetFactoryImpl extends PackageSetFactory { pattern.append("."); } else if (myLexer.getTokenType() == ScopeTokenTypes.MINUS) { pattern.append("-"); - } else if (myLexer.getTokenType() == ScopeTokenTypes.COLON) { + } else if (myLexer.getTokenType() == ScopeTokenTypes.TILDE) { + pattern.append("~"); + } + else if (myLexer.getTokenType() == ScopeTokenTypes.COLON) { pattern.append(":"); } else { error(AnalysisScopeBundle.message("error.packageset.token.expectations", getTokenText())); diff --git a/platform/lang-impl/src/com/intellij/psi/search/scope/packageSet/lexer/ScopeTokenTypes.java b/platform/lang-impl/src/com/intellij/psi/search/scope/packageSet/lexer/ScopeTokenTypes.java index 199f29de8553..d9e4d8f0219f 100644 --- a/platform/lang-impl/src/com/intellij/psi/search/scope/packageSet/lexer/ScopeTokenTypes.java +++ b/platform/lang-impl/src/com/intellij/psi/search/scope/packageSet/lexer/ScopeTokenTypes.java @@ -33,6 +33,7 @@ public interface ScopeTokenTypes extends TokenType { IElementType RBRACKET = new ScopeTokenType("Scope.RBRACKET"); IElementType LPARENTH = new ScopeTokenType("Scope.LPARENTH"); IElementType RPARENTH = new ScopeTokenType("Scope.RPARENTH"); + IElementType TILDE = new ScopeTokenType("TILDE"); IElementType DOT = new ScopeTokenType("Scope.DOT"); IElementType COLON = new ScopeTokenType("Scope.COLON"); IElementType ASTERISK = new ScopeTokenType("Scope.ASTERISK"); diff --git a/platform/lang-impl/src/com/intellij/psi/search/scope/packageSet/lexer/_ScopesLexer.flex b/platform/lang-impl/src/com/intellij/psi/search/scope/packageSet/lexer/_ScopesLexer.flex index 7c850c380607..b1400fda1f9f 100644 --- a/platform/lang-impl/src/com/intellij/psi/search/scope/packageSet/lexer/_ScopesLexer.flex +++ b/platform/lang-impl/src/com/intellij/psi/search/scope/packageSet/lexer/_ScopesLexer.flex @@ -34,6 +34,7 @@ DIGIT=[0-9]+ "!" { return ScopeTokenTypes.EXCL; } "$" { return ScopeTokenTypes.IDENTIFIER;} "-" { return ScopeTokenTypes.MINUS;} + "~" { return ScopeTokenTypes.TILDE;} "[" { return ScopeTokenTypes.LBRACKET; } "]" { return ScopeTokenTypes.RBRACKET; } diff --git a/platform/lang-impl/src/com/intellij/psi/search/scope/packageSet/lexer/_ScopesLexer.java b/platform/lang-impl/src/com/intellij/psi/search/scope/packageSet/lexer/_ScopesLexer.java index 92a2ec839142..4fcd0e7c424c 100644 --- a/platform/lang-impl/src/com/intellij/psi/search/scope/packageSet/lexer/_ScopesLexer.java +++ b/platform/lang-impl/src/com/intellij/psi/search/scope/packageSet/lexer/_ScopesLexer.java @@ -1,33 +1,16 @@ -/* - * Copyright 2000-2009 JetBrains s.r.o. - * - * 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. - */ - -/* The following code was generated by JFlex 1.4.1 on 2/13/08 6:36 PM */ +/* The following code was generated by JFlex 1.4.3 on 2/8/12 9:29 PM */ /* It's an automatically generated code. Do not modify it. */ package com.intellij.psi.search.scope.packageSet.lexer; - -import com.intellij.lexer.FlexLexer; import com.intellij.psi.tree.IElementType; +import com.intellij.lexer.FlexLexer; /** * This class is a scanner generated by - * JFlex 1.4.1 - * on 2/13/08 6:36 PM from the specification file - * /Users/max/Depot/Trunk/tools/lexer/_ScopesLexer.flex + * JFlex 1.4.3 + * on 2/8/12 9:29 PM from the specification file + * C:/work/IDEA/tools/lexer/../../community/platform/lang-impl/src/com/intellij/psi/search/scope/packageSet/lexer/_ScopesLexer.flex */ class _ScopesLexer implements FlexLexer { /** initial size of the lookahead buffer */ @@ -36,95 +19,105 @@ class _ScopesLexer implements FlexLexer { /** lexical states */ public static final int YYINITIAL = 0; + /** + * ZZ_LEXSTATE[l] is the state in the DFA for the lexical state l + * ZZ_LEXSTATE[l+1] is the state in the DFA for the lexical state l + * at the beginning of a line + * l is of the form l = 2*k, k a non negative integer + */ + private static final int ZZ_LEXSTATE[] = { + 0, 0 + }; + /** * Translates characters to character classes */ private static final String ZZ_CMAP_PACKED = "\11\2\1\3\1\3\1\0\2\3\16\2\4\0\1\3\1\7\2\0"+ - "\1\1\1\0\1\6\1\0\1\13\1\14\1\17\2\0\1\10\1\15"+ - "\1\20\12\4\1\16\6\0\32\1\1\11\1\0\1\12\1\0\1\1"+ - "\1\0\32\1\1\0\1\5\2\0\41\2\2\0\4\1\4\0\1\1"+ - "\2\0\1\2\7\0\1\1\4\0\1\1\5\0\27\1\1\0\37\1"+ - "\1\0\u013f\1\31\0\162\1\4\0\14\1\16\0\5\1\11\0\1\1"+ - "\21\0\130\2\5\0\23\2\12\0\1\1\13\0\1\1\1\0\3\1"+ - "\1\0\1\1\1\0\24\1\1\0\54\1\1\0\46\1\1\0\5\1"+ - "\4\0\202\1\1\0\4\2\3\0\105\1\1\0\46\1\2\0\2\1"+ - "\6\0\20\1\41\0\46\1\2\0\1\1\7\0\47\1\11\0\21\2"+ - "\1\0\27\2\1\0\3\2\1\0\1\2\1\0\2\2\1\0\1\2"+ - "\13\0\33\1\5\0\3\1\15\0\4\2\14\0\6\2\13\0\32\1"+ - "\5\0\13\1\16\2\7\0\12\2\4\0\2\1\1\2\143\1\1\0"+ - "\1\1\10\2\1\0\6\2\2\1\2\2\1\0\4\2\2\1\12\2"+ - "\3\1\2\0\1\1\17\0\1\2\1\1\1\2\36\1\33\2\2\0"+ - "\3\1\60\0\46\1\13\2\1\1\u014f\0\3\2\66\1\2\0\1\2"+ - "\1\1\20\2\2\0\1\1\4\2\3\0\12\1\2\2\2\0\12\2"+ - "\21\0\3\2\1\0\10\1\2\0\2\1\2\0\26\1\1\0\7\1"+ - "\1\0\1\1\3\0\4\1\2\0\1\2\1\1\7\2\2\0\2\2"+ - "\2\0\3\2\11\0\1\2\4\0\2\1\1\0\3\1\2\2\2\0"+ - "\12\2\4\1\15\0\3\2\1\0\6\1\4\0\2\1\2\0\26\1"+ - "\1\0\7\1\1\0\2\1\1\0\2\1\1\0\2\1\2\0\1\2"+ - "\1\0\5\2\4\0\2\2\2\0\3\2\13\0\4\1\1\0\1\1"+ - "\7\0\14\2\3\1\14\0\3\2\1\0\11\1\1\0\3\1\1\0"+ - "\26\1\1\0\7\1\1\0\2\1\1\0\5\1\2\0\1\2\1\1"+ - "\10\2\1\0\3\2\1\0\3\2\2\0\1\1\17\0\2\1\2\2"+ - "\2\0\12\2\1\0\1\1\17\0\3\2\1\0\10\1\2\0\2\1"+ - "\2\0\26\1\1\0\7\1\1\0\2\1\1\0\5\1\2\0\1\2"+ - "\1\1\6\2\3\0\2\2\2\0\3\2\10\0\2\2\4\0\2\1"+ - "\1\0\3\1\4\0\12\2\1\0\1\1\20\0\1\2\1\1\1\0"+ - "\6\1\3\0\3\1\1\0\4\1\3\0\2\1\1\0\1\1\1\0"+ - "\2\1\3\0\2\1\3\0\3\1\3\0\10\1\1\0\3\1\4\0"+ - "\5\2\3\0\3\2\1\0\4\2\11\0\1\2\17\0\11\2\11\0"+ - "\1\1\7\0\3\2\1\0\10\1\1\0\3\1\1\0\27\1\1\0"+ - "\12\1\1\0\5\1\4\0\7\2\1\0\3\2\1\0\4\2\7\0"+ - "\2\2\11\0\2\1\4\0\12\2\22\0\2\2\1\0\10\1\1\0"+ - "\3\1\1\0\27\1\1\0\12\1\1\0\5\1\2\0\1\2\1\1"+ - "\7\2\1\0\3\2\1\0\4\2\7\0\2\2\7\0\1\1\1\0"+ - "\2\1\4\0\12\2\22\0\2\2\1\0\10\1\1\0\3\1\1\0"+ - "\27\1\1\0\20\1\4\0\6\2\2\0\3\2\1\0\4\2\11\0"+ - "\1\2\10\0\2\1\4\0\12\2\22\0\2\2\1\0\22\1\3\0"+ - "\30\1\1\0\11\1\1\0\1\1\2\0\7\1\3\0\1\2\4\0"+ - "\6\2\1\0\1\2\1\0\10\2\22\0\2\2\15\0\60\1\1\2"+ - "\2\1\7\2\4\0\10\1\10\2\1\0\12\2\47\0\2\1\1\0"+ - "\1\1\2\0\2\1\1\0\1\1\2\0\1\1\6\0\4\1\1\0"+ - "\7\1\1\0\3\1\1\0\1\1\1\0\1\1\2\0\2\1\1\0"+ - "\4\1\1\2\2\1\6\2\1\0\2\2\1\1\2\0\5\1\1\0"+ - "\1\1\1\0\6\2\2\0\12\2\2\0\2\1\42\0\1\1\27\0"+ - "\2\2\6\0\12\2\13\0\1\2\1\0\1\2\1\0\1\2\4\0"+ - "\2\2\10\1\1\0\42\1\6\0\24\2\1\0\2\2\4\1\4\0"+ - "\10\2\1\0\44\2\11\0\1\2\71\0\42\1\1\0\5\1\1\0"+ - "\2\1\1\0\7\2\3\0\4\2\6\0\12\2\6\0\6\1\4\2"+ - "\106\0\46\1\12\0\51\1\7\0\132\1\5\0\104\1\5\0\122\1"+ - "\6\0\7\1\1\0\77\1\1\0\1\1\1\0\4\1\2\0\7\1"+ - "\1\0\1\1\1\0\4\1\2\0\47\1\1\0\1\1\1\0\4\1"+ - "\2\0\37\1\1\0\1\1\1\0\4\1\2\0\7\1\1\0\1\1"+ - "\1\0\4\1\2\0\7\1\1\0\7\1\1\0\27\1\1\0\37\1"+ - "\1\0\1\1\1\0\4\1\2\0\7\1\1\0\47\1\1\0\23\1"+ - "\16\0\11\2\56\0\125\1\14\0\u026c\1\2\0\10\1\12\0\32\1"+ - "\5\0\113\1\3\0\3\1\17\0\15\1\1\0\4\1\3\2\13\0"+ - "\22\1\3\2\13\0\22\1\2\2\14\0\15\1\1\0\3\1\1\0"+ - "\2\2\14\0\64\1\40\2\3\0\1\1\3\0\2\1\1\2\2\0"+ - "\12\2\41\0\3\2\2\0\12\2\6\0\130\1\10\0\51\1\1\2"+ - "\126\0\35\1\3\0\14\2\4\0\14\2\12\0\12\2\36\1\2\0"+ - "\5\1\u038b\0\154\1\224\0\234\1\4\0\132\1\6\0\26\1\2\0"+ - "\6\1\2\0\46\1\2\0\6\1\2\0\10\1\1\0\1\1\1\0"+ - "\1\1\1\0\1\1\1\0\37\1\2\0\65\1\1\0\7\1\1\0"+ - "\1\1\3\0\3\1\1\0\7\1\3\0\4\1\2\0\6\1\4\0"+ - "\15\1\5\0\3\1\1\0\7\1\17\0\4\2\32\0\5\2\20\0"+ - "\2\1\23\0\1\1\13\0\4\2\6\0\6\2\1\0\1\1\15\0"+ - "\1\1\40\0\22\1\36\0\15\2\4\0\1\2\3\0\6\2\27\0"+ - "\1\1\4\0\1\1\2\0\12\1\1\0\1\1\3\0\5\1\6\0"+ - "\1\1\1\0\1\1\1\0\1\1\1\0\4\1\1\0\3\1\1\0"+ - "\7\1\3\0\3\1\5\0\5\1\26\0\44\1\u0e81\0\3\1\31\0"+ - "\11\1\6\2\1\0\5\1\2\0\5\1\4\0\126\1\2\0\2\2"+ - "\2\0\3\1\1\0\137\1\5\0\50\1\4\0\136\1\21\0\30\1"+ - "\70\0\20\1\u0200\0\u19b6\1\112\0\u51a6\1\132\0\u048d\1\u0773\0\u2ba4\1"+ - "\u215c\0\u012e\1\2\0\73\1\225\0\7\1\14\0\5\1\5\0\1\1"+ - "\1\2\12\1\1\0\15\1\1\0\5\1\1\0\1\1\1\0\2\1"+ - "\1\0\2\1\1\0\154\1\41\0\u016b\1\22\0\100\1\2\0\66\1"+ - "\50\0\15\1\3\0\20\2\20\0\4\2\17\0\2\1\30\0\3\1"+ - "\31\0\1\1\6\0\5\1\1\0\207\1\2\0\1\2\4\0\1\1"+ - "\13\0\12\2\7\0\32\1\4\0\1\1\1\0\32\1\12\0\132\1"+ - "\3\0\6\1\2\0\6\1\2\0\6\1\2\0\3\1\3\0\2\1"+ - "\3\0\2\1\22\0\3\2\4\0"; + "\1\1\1\0\1\6\1\0\1\14\1\15\1\20\2\0\1\10\1\16"+ + "\1\21\12\4\1\17\6\0\32\1\1\12\1\0\1\13\1\0\1\1"+ + "\1\0\32\1\1\0\1\5\1\0\1\11\41\2\2\0\4\1\4\0"+ + "\1\1\2\0\1\2\7\0\1\1\4\0\1\1\5\0\27\1\1\0"+ + "\37\1\1\0\u013f\1\31\0\162\1\4\0\14\1\16\0\5\1\11\0"+ + "\1\1\21\0\130\2\5\0\23\2\12\0\1\1\13\0\1\1\1\0"+ + "\3\1\1\0\1\1\1\0\24\1\1\0\54\1\1\0\46\1\1\0"+ + "\5\1\4\0\202\1\1\0\4\2\3\0\105\1\1\0\46\1\2\0"+ + "\2\1\6\0\20\1\41\0\46\1\2\0\1\1\7\0\47\1\11\0"+ + "\21\2\1\0\27\2\1\0\3\2\1\0\1\2\1\0\2\2\1\0"+ + "\1\2\13\0\33\1\5\0\3\1\15\0\4\2\14\0\6\2\13\0"+ + "\32\1\5\0\13\1\16\2\7\0\12\2\4\0\2\1\1\2\143\1"+ + "\1\0\1\1\10\2\1\0\6\2\2\1\2\2\1\0\4\2\2\1"+ + "\12\2\3\1\2\0\1\1\17\0\1\2\1\1\1\2\36\1\33\2"+ + "\2\0\3\1\60\0\46\1\13\2\1\1\u014f\0\3\2\66\1\2\0"+ + "\1\2\1\1\20\2\2\0\1\1\4\2\3\0\12\1\2\2\2\0"+ + "\12\2\21\0\3\2\1\0\10\1\2\0\2\1\2\0\26\1\1\0"+ + "\7\1\1\0\1\1\3\0\4\1\2\0\1\2\1\1\7\2\2\0"+ + "\2\2\2\0\3\2\11\0\1\2\4\0\2\1\1\0\3\1\2\2"+ + "\2\0\12\2\4\1\15\0\3\2\1\0\6\1\4\0\2\1\2\0"+ + "\26\1\1\0\7\1\1\0\2\1\1\0\2\1\1\0\2\1\2\0"+ + "\1\2\1\0\5\2\4\0\2\2\2\0\3\2\13\0\4\1\1\0"+ + "\1\1\7\0\14\2\3\1\14\0\3\2\1\0\11\1\1\0\3\1"+ + "\1\0\26\1\1\0\7\1\1\0\2\1\1\0\5\1\2\0\1\2"+ + "\1\1\10\2\1\0\3\2\1\0\3\2\2\0\1\1\17\0\2\1"+ + "\2\2\2\0\12\2\1\0\1\1\17\0\3\2\1\0\10\1\2\0"+ + "\2\1\2\0\26\1\1\0\7\1\1\0\2\1\1\0\5\1\2\0"+ + "\1\2\1\1\6\2\3\0\2\2\2\0\3\2\10\0\2\2\4\0"+ + "\2\1\1\0\3\1\4\0\12\2\1\0\1\1\20\0\1\2\1\1"+ + "\1\0\6\1\3\0\3\1\1\0\4\1\3\0\2\1\1\0\1\1"+ + "\1\0\2\1\3\0\2\1\3\0\3\1\3\0\10\1\1\0\3\1"+ + "\4\0\5\2\3\0\3\2\1\0\4\2\11\0\1\2\17\0\11\2"+ + "\11\0\1\1\7\0\3\2\1\0\10\1\1\0\3\1\1\0\27\1"+ + "\1\0\12\1\1\0\5\1\4\0\7\2\1\0\3\2\1\0\4\2"+ + "\7\0\2\2\11\0\2\1\4\0\12\2\22\0\2\2\1\0\10\1"+ + "\1\0\3\1\1\0\27\1\1\0\12\1\1\0\5\1\2\0\1\2"+ + "\1\1\7\2\1\0\3\2\1\0\4\2\7\0\2\2\7\0\1\1"+ + "\1\0\2\1\4\0\12\2\22\0\2\2\1\0\10\1\1\0\3\1"+ + "\1\0\27\1\1\0\20\1\4\0\6\2\2\0\3\2\1\0\4\2"+ + "\11\0\1\2\10\0\2\1\4\0\12\2\22\0\2\2\1\0\22\1"+ + "\3\0\30\1\1\0\11\1\1\0\1\1\2\0\7\1\3\0\1\2"+ + "\4\0\6\2\1\0\1\2\1\0\10\2\22\0\2\2\15\0\60\1"+ + "\1\2\2\1\7\2\4\0\10\1\10\2\1\0\12\2\47\0\2\1"+ + "\1\0\1\1\2\0\2\1\1\0\1\1\2\0\1\1\6\0\4\1"+ + "\1\0\7\1\1\0\3\1\1\0\1\1\1\0\1\1\2\0\2\1"+ + "\1\0\4\1\1\2\2\1\6\2\1\0\2\2\1\1\2\0\5\1"+ + "\1\0\1\1\1\0\6\2\2\0\12\2\2\0\2\1\42\0\1\1"+ + "\27\0\2\2\6\0\12\2\13\0\1\2\1\0\1\2\1\0\1\2"+ + "\4\0\2\2\10\1\1\0\42\1\6\0\24\2\1\0\2\2\4\1"+ + "\4\0\10\2\1\0\44\2\11\0\1\2\71\0\42\1\1\0\5\1"+ + "\1\0\2\1\1\0\7\2\3\0\4\2\6\0\12\2\6\0\6\1"+ + "\4\2\106\0\46\1\12\0\51\1\7\0\132\1\5\0\104\1\5\0"+ + "\122\1\6\0\7\1\1\0\77\1\1\0\1\1\1\0\4\1\2\0"+ + "\7\1\1\0\1\1\1\0\4\1\2\0\47\1\1\0\1\1\1\0"+ + "\4\1\2\0\37\1\1\0\1\1\1\0\4\1\2\0\7\1\1\0"+ + "\1\1\1\0\4\1\2\0\7\1\1\0\7\1\1\0\27\1\1\0"+ + "\37\1\1\0\1\1\1\0\4\1\2\0\7\1\1\0\47\1\1\0"+ + "\23\1\16\0\11\2\56\0\125\1\14\0\u026c\1\2\0\10\1\12\0"+ + "\32\1\5\0\113\1\3\0\3\1\17\0\15\1\1\0\4\1\3\2"+ + "\13\0\22\1\3\2\13\0\22\1\2\2\14\0\15\1\1\0\3\1"+ + "\1\0\2\2\14\0\64\1\40\2\3\0\1\1\3\0\2\1\1\2"+ + "\2\0\12\2\41\0\3\2\2\0\12\2\6\0\130\1\10\0\51\1"+ + "\1\2\126\0\35\1\3\0\14\2\4\0\14\2\12\0\12\2\36\1"+ + "\2\0\5\1\u038b\0\154\1\224\0\234\1\4\0\132\1\6\0\26\1"+ + "\2\0\6\1\2\0\46\1\2\0\6\1\2\0\10\1\1\0\1\1"+ + "\1\0\1\1\1\0\1\1\1\0\37\1\2\0\65\1\1\0\7\1"+ + "\1\0\1\1\3\0\3\1\1\0\7\1\3\0\4\1\2\0\6\1"+ + "\4\0\15\1\5\0\3\1\1\0\7\1\17\0\4\2\32\0\5\2"+ + "\20\0\2\1\23\0\1\1\13\0\4\2\6\0\6\2\1\0\1\1"+ + "\15\0\1\1\40\0\22\1\36\0\15\2\4\0\1\2\3\0\6\2"+ + "\27\0\1\1\4\0\1\1\2\0\12\1\1\0\1\1\3\0\5\1"+ + "\6\0\1\1\1\0\1\1\1\0\1\1\1\0\4\1\1\0\3\1"+ + "\1\0\7\1\3\0\3\1\5\0\5\1\26\0\44\1\u0e81\0\3\1"+ + "\31\0\11\1\6\2\1\0\5\1\2\0\5\1\4\0\126\1\2\0"+ + "\2\2\2\0\3\1\1\0\137\1\5\0\50\1\4\0\136\1\21\0"+ + "\30\1\70\0\20\1\u0200\0\u19b6\1\112\0\u51a6\1\132\0\u048d\1\u0773\0"+ + "\u2ba4\1\u215c\0\u012e\1\2\0\73\1\225\0\7\1\14\0\5\1\5\0"+ + "\1\1\1\2\12\1\1\0\15\1\1\0\5\1\1\0\1\1\1\0"+ + "\2\1\1\0\2\1\1\0\154\1\41\0\u016b\1\22\0\100\1\2\0"+ + "\66\1\50\0\15\1\3\0\20\2\20\0\4\2\17\0\2\1\30\0"+ + "\3\1\31\0\1\1\6\0\5\1\1\0\207\1\2\0\1\2\4\0"+ + "\1\1\13\0\12\2\7\0\32\1\4\0\1\1\1\0\32\1\12\0"+ + "\132\1\3\0\6\1\2\0\6\1\2\0\6\1\2\0\3\1\3\0"+ + "\2\1\3\0\2\1\22\0\3\2\4\0"; /** * Translates characters to character classes @@ -139,10 +132,10 @@ class _ScopesLexer implements FlexLexer { private static final String ZZ_ACTION_PACKED_0 = "\1\0\1\1\1\2\1\3\1\4\2\1\1\5\1\6"+ "\1\7\1\10\1\11\1\12\1\13\1\14\1\15\1\16"+ - "\1\17\1\20"; + "\1\17\1\20\1\21"; private static int [] zzUnpackAction() { - int [] result = new int[19]; + int [] result = new int[20]; int offset = 0; offset = zzUnpackAction(ZZ_ACTION_PACKED_0, offset, result); return result; @@ -167,12 +160,12 @@ class _ScopesLexer implements FlexLexer { private static final int [] ZZ_ROWMAP = zzUnpackRowMap(); private static final String ZZ_ROWMAP_PACKED_0 = - "\0\0\0\21\0\42\0\63\0\104\0\125\0\146\0\21"+ - "\0\21\0\21\0\21\0\21\0\21\0\21\0\21\0\21"+ - "\0\21\0\21\0\21"; + "\0\0\0\22\0\44\0\66\0\110\0\132\0\154\0\22"+ + "\0\22\0\22\0\22\0\22\0\22\0\22\0\22\0\22"+ + "\0\22\0\22\0\22\0\22"; private static int [] zzUnpackRowMap() { - int [] result = new int[19]; + int [] result = new int[20]; int offset = 0; offset = zzUnpackRowMap(ZZ_ROWMAP_PACKED_0, offset, result); return result; @@ -197,11 +190,11 @@ class _ScopesLexer implements FlexLexer { private static final String ZZ_TRANS_PACKED_0 = "\1\2\1\3\1\2\1\4\1\5\1\6\1\7\1\10"+ "\1\11\1\12\1\13\1\14\1\15\1\16\1\17\1\20"+ - "\1\21\22\0\2\3\1\0\1\3\17\0\1\4\21\0"+ - "\1\5\21\0\1\22\21\0\1\23\12\0"; + "\1\21\1\22\23\0\2\3\1\0\1\3\20\0\1\4"+ + "\22\0\1\5\22\0\1\23\22\0\1\24\13\0"; private static int [] zzUnpackTrans() { - int [] result = new int[119]; + int [] result = new int[126]; int offset = 0; offset = zzUnpackTrans(ZZ_TRANS_PACKED_0, offset, result); return result; @@ -242,10 +235,10 @@ class _ScopesLexer implements FlexLexer { private static final int [] ZZ_ATTRIBUTE = zzUnpackAttribute(); private static final String ZZ_ATTRIBUTE_PACKED_0 = - "\1\0\1\11\5\1\14\11"; + "\1\0\1\11\5\1\15\11"; private static int [] zzUnpackAttribute() { - int [] result = new int[19]; + int [] result = new int[20]; int offset = 0; offset = zzUnpackAttribute(ZZ_ATTRIBUTE_PACKED_0, offset, result); return result; @@ -338,7 +331,7 @@ class _ScopesLexer implements FlexLexer { char [] map = new char[0x10000]; int i = 0; /* index in packed string */ int j = 0; /* index in unpacked array */ - while (i < 1690) { + while (i < 1692) { int count = packed.charAt(i++); char value = packed.charAt(i++); do map[j++] = value; while (--count > 0); @@ -346,17 +339,14 @@ class _ScopesLexer implements FlexLexer { return map; } - @Override public final int getTokenStart(){ return zzStartRead; } - @Override public final int getTokenEnd(){ return getTokenStart() + yylength(); } - @Override public void reset(CharSequence buffer, int start, int end,int initialState){ zzBuffer = buffer; zzBufferArray = com.intellij.util.text.CharArrayUtil.fromSequenceWithoutCopying(buffer); @@ -383,7 +373,6 @@ class _ScopesLexer implements FlexLexer { /** * Returns the current lexical state. */ - @Override public final int yystate() { return zzLexicalState; } @@ -394,7 +383,6 @@ class _ScopesLexer implements FlexLexer { * * @param newState the new lexical state */ - @Override public final void yybegin(int newState) { zzLexicalState = newState; } @@ -494,7 +482,6 @@ class _ScopesLexer implements FlexLexer { * @return the next token * @exception java.io.IOException if any I/O-Error occurs */ - @Override public IElementType advance() throws java.io.IOException { int zzInput; int zzAction; @@ -518,7 +505,7 @@ class _ScopesLexer implements FlexLexer { zzCurrentPosL = zzCurrentPos = zzStartRead = zzMarkedPosL; - zzState = zzLexicalState; + zzState = ZZ_LEXSTATE[zzLexicalState]; zzForAction: { @@ -569,67 +556,71 @@ class _ScopesLexer implements FlexLexer { case 5: { return ScopeTokenTypes.EXCL; } - case 17: break; - case 16: - { return ScopeTokenTypes.ANDAND; - } case 18: break; - case 9: - { return ScopeTokenTypes.LPARENTH; + case 7: + { return ScopeTokenTypes.TILDE; } case 19: break; - case 13: - { return ScopeTokenTypes.ASTERISK; + case 17: + { return ScopeTokenTypes.ANDAND; } case 20: break; - case 15: - { return ScopeTokenTypes.OROR; + case 10: + { return ScopeTokenTypes.LPARENTH; } case 21: break; - case 7: - { return ScopeTokenTypes.LBRACKET; + case 14: + { return ScopeTokenTypes.ASTERISK; } case 22: break; + case 16: + { return ScopeTokenTypes.OROR; + } + case 23: break; + case 8: + { return ScopeTokenTypes.LBRACKET; + } + case 24: break; case 4: { return ScopeTokenTypes.INTEGER_LITERAL; } - case 23: break; - case 12: + case 25: break; + case 13: { return ScopeTokenTypes.COLON; } - case 24: break; + case 26: break; case 3: { return ScopeTokenTypes.WHITE_SPACE; } - case 25: break; + case 27: break; case 2: { return ScopeTokenTypes.IDENTIFIER; } - case 26: break; - case 14: + case 28: break; + case 15: { return ScopeTokenTypes.DIV; } - case 27: break; - case 11: + case 29: break; + case 12: { return ScopeTokenTypes.DOT; } - case 28: break; - case 10: + case 30: break; + case 11: { return ScopeTokenTypes.RPARENTH; } - case 29: break; + case 31: break; case 1: { return ScopeTokenTypes.BAD_CHARACTER; } - case 30: break; - case 8: + case 32: break; + case 9: { return ScopeTokenTypes.RBRACKET; } - case 31: break; + case 33: break; case 6: { return ScopeTokenTypes.MINUS; } - case 32: break; + case 34: break; default: if (zzInput == YYEOF && zzStartRead == zzCurrentPos) { zzAtEOF = true; From 3e7ee98ea1c5e6b11f8517be1594391e4cd7c139 Mon Sep 17 00:00:00 2001 From: anna Date: Wed, 8 Feb 2012 21:56:39 +0100 Subject: [PATCH 209/215] tests: workaround for default suite presentation in our tree view (IDEA-81069) --- .../src/com/intellij/execution/junit2/info/PsiClassLocator.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/junit/src/com/intellij/execution/junit2/info/PsiClassLocator.java b/plugins/junit/src/com/intellij/execution/junit2/info/PsiClassLocator.java index 2e140a29dc6f..2be74bcef64c 100644 --- a/plugins/junit/src/com/intellij/execution/junit2/info/PsiClassLocator.java +++ b/plugins/junit/src/com/intellij/execution/junit2/info/PsiClassLocator.java @@ -35,7 +35,7 @@ public class PsiClassLocator implements PsiLocator { public static PsiClassLocator fromQualifiedName(final String name) { final int lastDot = name.lastIndexOf('.'); - if (lastDot == -1 || lastDot == name.length()) + if (lastDot == -1 || lastDot == name.length() || (name.endsWith("]") && name.contains("["))) return new PsiClassLocator(name, ""); else return new PsiClassLocator(name.substring(lastDot + 1), name.substring(0, lastDot)); From 3a5f6b86feacdff5315f995c024dae46bf11ae54 Mon Sep 17 00:00:00 2001 From: Roman Shevchenko Date: Wed, 8 Feb 2012 22:02:42 +0100 Subject: [PATCH 210/215] Fix file chooser title painting; cleanup --- .../openapi/fileChooser/FileElement.java | 7 ++- .../ui/components/labels/LinkLabel.java | 19 +++++--- .../fileChooser/ex/FileChooserDialogImpl.java | 43 +++++++++++-------- 3 files changed, 41 insertions(+), 28 deletions(-) diff --git a/platform/platform-api/src/com/intellij/openapi/fileChooser/FileElement.java b/platform/platform-api/src/com/intellij/openapi/fileChooser/FileElement.java index 8b18d2c56271..c18bd603b36e 100644 --- a/platform/platform-api/src/com/intellij/openapi/fileChooser/FileElement.java +++ b/platform/platform-api/src/com/intellij/openapi/fileChooser/FileElement.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2009 JetBrains s.r.o. + * Copyright 2000-2012 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -67,7 +67,10 @@ public class FileElement { if (myName != null) { return myName; } - return myFile.getName(); + else if (myFile != null) { + return myFile.getName(); + } + return ""; } public final String getName() { return myName; } diff --git a/platform/platform-api/src/com/intellij/ui/components/labels/LinkLabel.java b/platform/platform-api/src/com/intellij/ui/components/labels/LinkLabel.java index 8b948fee4ab6..5169e7a4e937 100644 --- a/platform/platform-api/src/com/intellij/ui/components/labels/LinkLabel.java +++ b/platform/platform-api/src/com/intellij/ui/components/labels/LinkLabel.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2009 JetBrains s.r.o. + * Copyright 2000-2012 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -22,6 +22,7 @@ import com.intellij.openapi.util.IconLoader; import com.intellij.openapi.wm.StatusBar; import com.intellij.ui.UI; import com.intellij.util.ui.UIUtil; +import org.jetbrains.annotations.Nullable; import javax.swing.*; import javax.swing.border.Border; @@ -60,20 +61,24 @@ public class LinkLabel extends JLabel { this("", LINK); } - public LinkLabel(String text, Icon icon) { + public LinkLabel(String text, @Nullable Icon icon) { this(text, icon, null, null, null); } - public LinkLabel(String text, Icon icon, LinkListener aListener) { + public LinkLabel(String text, @Nullable Icon icon, @Nullable LinkListener aListener) { this(text, icon, aListener, null, null); } - public LinkLabel(String text, Icon icon, LinkListener aListener, Object aLinkData) { + public LinkLabel(String text, @Nullable Icon icon, @Nullable LinkListener aListener, @Nullable Object aLinkData) { this(text, icon, aListener, aLinkData, null); } - public LinkLabel(String text, Icon icon, LinkListener aListener, Object aLinkData, String aVisitedLinksKey) { - super(text, icon, JLabel.LEFT); + public LinkLabel(String text, + @Nullable Icon icon, + @Nullable LinkListener aListener, + @Nullable Object aLinkData, + @Nullable String aVisitedLinksKey) { + super(text, icon, SwingConstants.LEFT); setOpaque(false); setListener(aListener, aLinkData); @@ -92,7 +97,7 @@ public class LinkLabel extends JLabel { myHoveringIcon = iconForHovering; } - public void setListener(LinkListener listener, Object linkData) { + public void setListener(LinkListener listener, @Nullable Object linkData) { myLinkListener = listener; myLinkData = linkData; } diff --git a/platform/platform-impl/src/com/intellij/openapi/fileChooser/ex/FileChooserDialogImpl.java b/platform/platform-impl/src/com/intellij/openapi/fileChooser/ex/FileChooserDialogImpl.java index a9e673168515..1c3aeb297301 100644 --- a/platform/platform-impl/src/com/intellij/openapi/fileChooser/ex/FileChooserDialogImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/fileChooser/ex/FileChooserDialogImpl.java @@ -21,7 +21,9 @@ import com.intellij.ide.util.PropertiesComponent; import com.intellij.ide.util.treeView.NodeRenderer; import com.intellij.idea.ActionsBundle; import com.intellij.openapi.actionSystem.*; -import com.intellij.openapi.application.*; +import com.intellij.openapi.application.ApplicationActivationListener; +import com.intellij.openapi.application.ApplicationManager; +import com.intellij.openapi.application.ModalityState; import com.intellij.openapi.fileChooser.FileChooserDescriptor; import com.intellij.openapi.fileChooser.FileChooserDialog; import com.intellij.openapi.fileChooser.FileElement; @@ -30,7 +32,6 @@ import com.intellij.openapi.fileChooser.impl.FileChooserFactoryImpl; import com.intellij.openapi.project.Project; import com.intellij.openapi.ui.DialogWrapper; import com.intellij.openapi.ui.Messages; -import com.intellij.openapi.ui.TitlePanel; import com.intellij.openapi.util.Disposer; import com.intellij.openapi.util.text.StringUtil; import com.intellij.openapi.vfs.LocalFileSystem; @@ -38,10 +39,12 @@ import com.intellij.openapi.vfs.VfsUtil; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.openapi.wm.IdeFrame; import com.intellij.ui.ScrollPaneFactory; +import com.intellij.ui.SideBorder; import com.intellij.ui.UIBundle; import com.intellij.ui.components.labels.LinkLabel; import com.intellij.ui.components.labels.LinkListener; import com.intellij.util.containers.HashMap; +import com.intellij.util.ui.UIUtil; import com.intellij.util.ui.update.MergingUpdateQueue; import com.intellij.util.ui.update.UiNotifyConnector; import com.intellij.util.ui.update.Update; @@ -64,7 +67,6 @@ import java.util.List; import java.util.Map; public class FileChooserDialogImpl extends DialogWrapper implements FileChooserDialog, FileLookup { - private final FileChooserDescriptor myChooserDescriptor; protected FileSystemTreeImpl myFileSystemTree; @@ -73,30 +75,31 @@ public class FileChooserDialogImpl extends DialogWrapper implements FileChooserD private VirtualFile[] myChosenFiles = VirtualFile.EMPTY_ARRAY; private JPanel myNorthPanel; - private TextFieldAction myTextFieldAction; - protected FileTextFieldImpl myPathTextField; - private JComponent myPathTextFieldWrapper; private MergingUpdateQueue myUiUpdater; - private boolean myTreeIsUpdating; public static DataKey PATH_FIELD = DataKey.create("PathField"); - public FileChooserDialogImpl(FileChooserDescriptor chooserDescriptor, Project project) { + public FileChooserDialogImpl(@NotNull final FileChooserDescriptor chooserDescriptor, Project project) { super(project, true); myProject = project; myChooserDescriptor = chooserDescriptor; - setTitle(UIBundle.message("file.chooser.default.title")); + setTitle(getChooserTitle(chooserDescriptor)); } - public FileChooserDialogImpl(FileChooserDescriptor chooserDescriptor, Component parent) { + public FileChooserDialogImpl(@NotNull final FileChooserDescriptor chooserDescriptor, Component parent) { super(parent, true); myChooserDescriptor = chooserDescriptor; - setTitle(UIBundle.message("file.chooser.default.title")); + setTitle(getChooserTitle(chooserDescriptor)); + } + + private static String getChooserTitle(final FileChooserDescriptor descriptor) { + final String title = descriptor.getTitle(); + return title != null ? title : UIBundle.message("file.chooser.default.title"); } @NotNull @@ -155,13 +158,14 @@ public class FileChooserDialogImpl extends DialogWrapper implements FileChooserD @Nullable protected final JComponent createTitlePane() { - final String title = myChooserDescriptor.getTitle(); final String description = myChooserDescriptor.getDescription(); - if ((StringUtil.isEmptyOrSpaces(title) || title.equals(UIBundle.message("file.chooser.default.title"))) && - StringUtil.isEmptyOrSpaces(description)) { - return null; - } - return new TitlePanel(title, description); + if (StringUtil.isEmptyOrSpaces(description)) return null; + + final JLabel label = new JLabel(description); + label.setBorder(BorderFactory.createCompoundBorder( + new SideBorder(UIUtil.getPanelBackground().darker(), SideBorder.BOTTOM), + BorderFactory.createEmptyBorder(0, 5, 10, 5))); + return label; } protected JComponent createCenterPanel() { @@ -271,7 +275,7 @@ public class FileChooserDialogImpl extends DialogWrapper implements FileChooserD myChooserDescriptor.validateSelectedFiles(selectedFiles); } catch (Exception e) { - Messages.showErrorDialog(getContentPane(), e.getMessage(), UIBundle.message("file.chooser.default.title")); + Messages.showErrorDialog(getContentPane(), e.getMessage(), getTitle()); return; } @@ -280,6 +284,7 @@ public class FileChooserDialogImpl extends DialogWrapper implements FileChooserD close(CANCEL_EXIT_CODE); return; } + //noinspection AssignmentToStaticFieldFromInstanceMethod ourLastFile = selectedFiles[selectedFiles.length - 1]; super.doOKAction(); @@ -372,7 +377,6 @@ public class FileChooserDialogImpl extends DialogWrapper implements FileChooserD } public void treeCollapsed(TreeExpansionEvent event) { - //Do not unwatch here!!! } } @@ -552,6 +556,7 @@ public class FileChooserDialogImpl extends DialogWrapper implements FileChooserD myTreeIsUpdating = false; setErrorText(null); if (requestFocus) { + //noinspection SSBasedInspection SwingUtilities.invokeLater(new Runnable() { public void run() { myFileSystemTree.getTree().requestFocus(); From acdf5ab2885f0b73af7bf384c55582f4ec871baa Mon Sep 17 00:00:00 2001 From: Roman Shevchenko Date: Wed, 8 Feb 2012 22:04:56 +0100 Subject: [PATCH 211/215] Fix message dialogs painting under GTK+ --- .../platform-api/src/com/intellij/openapi/ui/Messages.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/platform/platform-api/src/com/intellij/openapi/ui/Messages.java b/platform/platform-api/src/com/intellij/openapi/ui/Messages.java index e6c97ca5db6a..b9118e713be8 100644 --- a/platform/platform-api/src/com/intellij/openapi/ui/Messages.java +++ b/platform/platform-api/src/com/intellij/openapi/ui/Messages.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2011 JetBrains s.r.o. + * Copyright 2000-2012 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -1011,7 +1011,7 @@ public class Messages { messageComponent.setCaretPosition(0); } - if (UIUtil.isUnderNimbusLookAndFeel() || UIUtil.isUnderGTKLookAndFeel()) { + if (UIUtil.isUnderNimbusLookAndFeel()) { messageComponent.setOpaque(false); messageComponent.setBackground(UIUtil.TRANSPARENT_COLOR); } From 3923868331a90cbe1cfc8384d0e16f89c83a020d Mon Sep 17 00:00:00 2001 From: anna Date: Thu, 9 Feb 2012 09:28:21 +0100 Subject: [PATCH 212/215] spellchecker: forbid to suggest existing name when "Rename To" (IDEA-80936) --- .../PreferrableNameSuggestionProvider.java | 26 +++++++++++++++++++ .../inplace/InplaceVariableIntroducer.java | 5 +++- .../refactoring/rename/RenameDialog.java | 5 +++- .../rename/inplace/InplaceRefactoring.java | 5 +++- .../src/META-INF/SpellCheckerPlugin.xml | 2 +- .../DictionarySuggestionProvider.java | 9 +++++-- 6 files changed, 46 insertions(+), 6 deletions(-) create mode 100644 platform/lang-api/src/com/intellij/refactoring/rename/PreferrableNameSuggestionProvider.java diff --git a/platform/lang-api/src/com/intellij/refactoring/rename/PreferrableNameSuggestionProvider.java b/platform/lang-api/src/com/intellij/refactoring/rename/PreferrableNameSuggestionProvider.java new file mode 100644 index 000000000000..a99ce5ede9a9 --- /dev/null +++ b/platform/lang-api/src/com/intellij/refactoring/rename/PreferrableNameSuggestionProvider.java @@ -0,0 +1,26 @@ +/* + * Copyright 2000-2012 JetBrains s.r.o. + * + * 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. + */ +package com.intellij.refactoring.rename; + +/** + * User: anna + * Date: 2/8/12 + */ +public abstract class PreferrableNameSuggestionProvider implements NameSuggestionProvider { + public boolean shouldCheckOthers() { + return true; + } +} diff --git a/platform/lang-impl/src/com/intellij/refactoring/introduce/inplace/InplaceVariableIntroducer.java b/platform/lang-impl/src/com/intellij/refactoring/introduce/inplace/InplaceVariableIntroducer.java index 8d7d0c769521..21f0e587b203 100644 --- a/platform/lang-impl/src/com/intellij/refactoring/introduce/inplace/InplaceVariableIntroducer.java +++ b/platform/lang-impl/src/com/intellij/refactoring/introduce/inplace/InplaceVariableIntroducer.java @@ -33,7 +33,9 @@ import com.intellij.openapi.ui.popup.JBPopupFactory; import com.intellij.openapi.util.*; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiNamedElement; +import com.intellij.psi.codeStyle.SuggestedNameInfo; import com.intellij.refactoring.rename.NameSuggestionProvider; +import com.intellij.refactoring.rename.PreferrableNameSuggestionProvider; import com.intellij.refactoring.rename.inplace.InplaceRefactoring; import com.intellij.ui.awt.RelativePoint; import com.intellij.util.ui.PositionTracker; @@ -240,7 +242,8 @@ public abstract class InplaceVariableIntroducer extends In final LinkedHashSet names = new LinkedHashSet(); names.add(text); for (NameSuggestionProvider provider : Extensions.getExtensions(NameSuggestionProvider.EP_NAME)) { - provider.getSuggestedNames(psiVariable, psiVariable, names); + final SuggestedNameInfo suggestedNameInfo = provider.getSuggestedNames(psiVariable, psiVariable, names); + if (suggestedNameInfo != null && provider instanceof PreferrableNameSuggestionProvider && !((PreferrableNameSuggestionProvider)provider).shouldCheckOthers()) break; } final LookupElement[] items = new LookupElement[names.size()]; final Iterator iterator = names.iterator(); diff --git a/platform/lang-impl/src/com/intellij/refactoring/rename/RenameDialog.java b/platform/lang-impl/src/com/intellij/refactoring/rename/RenameDialog.java index 7ab5099e12a9..e3d2983c6b0f 100644 --- a/platform/lang-impl/src/com/intellij/refactoring/rename/RenameDialog.java +++ b/platform/lang-impl/src/com/intellij/refactoring/rename/RenameDialog.java @@ -138,7 +138,10 @@ public class RenameDialog extends RefactoringDialog { final NameSuggestionProvider[] providers = Extensions.getExtensions(NameSuggestionProvider.EP_NAME); for(NameSuggestionProvider provider: providers) { SuggestedNameInfo info = provider.getSuggestedNames(myPsiElement, myNameSuggestionContext, result); - if (info != null) mySuggestedNameInfo = info; + if (info != null) { + mySuggestedNameInfo = info; + if (provider instanceof PreferrableNameSuggestionProvider && !((PreferrableNameSuggestionProvider)provider).shouldCheckOthers()) break; + } } if (result.size() == 0) { result.add(UsageViewUtil.getShortName(myPsiElement)); diff --git a/platform/lang-impl/src/com/intellij/refactoring/rename/inplace/InplaceRefactoring.java b/platform/lang-impl/src/com/intellij/refactoring/rename/inplace/InplaceRefactoring.java index 71ac83cf8e95..9164e640fa5c 100644 --- a/platform/lang-impl/src/com/intellij/refactoring/rename/inplace/InplaceRefactoring.java +++ b/platform/lang-impl/src/com/intellij/refactoring/rename/inplace/InplaceRefactoring.java @@ -60,6 +60,7 @@ import com.intellij.openapi.util.Pair; import com.intellij.openapi.util.TextRange; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.*; +import com.intellij.psi.codeStyle.SuggestedNameInfo; import com.intellij.psi.impl.source.tree.injected.InjectedLanguageUtil; import com.intellij.psi.search.LocalSearchScope; import com.intellij.psi.search.ProjectScope; @@ -68,6 +69,7 @@ import com.intellij.psi.search.SearchScope; import com.intellij.psi.search.searches.ReferencesSearch; import com.intellij.psi.util.PsiTreeUtil; import com.intellij.refactoring.rename.NameSuggestionProvider; +import com.intellij.refactoring.rename.PreferrableNameSuggestionProvider; import com.intellij.refactoring.util.CommonRefactoringUtil; import com.intellij.util.containers.Stack; import org.jetbrains.annotations.NonNls; @@ -616,7 +618,8 @@ public abstract class InplaceRefactoring { if (names == null) { names = new LinkedHashSet(); for (NameSuggestionProvider provider : Extensions.getExtensions(NameSuggestionProvider.EP_NAME)) { - provider.getSuggestedNames(myElementToRename, myElementToRename, names); + final SuggestedNameInfo suggestedNameInfo = provider.getSuggestedNames(myElementToRename, myElementToRename, names); + if (suggestedNameInfo != null && provider instanceof PreferrableNameSuggestionProvider && !((PreferrableNameSuggestionProvider)provider).shouldCheckOthers()) break; } } myLookupItems = new LookupElement[names.size()]; diff --git a/plugins/spellchecker/src/META-INF/SpellCheckerPlugin.xml b/plugins/spellchecker/src/META-INF/SpellCheckerPlugin.xml index 7f4abf63d633..5a4a66dfba5f 100644 --- a/plugins/spellchecker/src/META-INF/SpellCheckerPlugin.xml +++ b/plugins/spellchecker/src/META-INF/SpellCheckerPlugin.xml @@ -28,7 +28,7 @@ key="spellchecking.inspection.name" groupKey="spelling" enabledByDefault="true" level="TYPO" implementationClass="com.intellij.spellchecker.inspections.SpellCheckingInspection"/> - + diff --git a/plugins/spellchecker/src/com/intellij/spellchecker/quickfixes/DictionarySuggestionProvider.java b/plugins/spellchecker/src/com/intellij/spellchecker/quickfixes/DictionarySuggestionProvider.java index 08978686773c..c0d1551251fd 100644 --- a/plugins/spellchecker/src/com/intellij/spellchecker/quickfixes/DictionarySuggestionProvider.java +++ b/plugins/spellchecker/src/com/intellij/spellchecker/quickfixes/DictionarySuggestionProvider.java @@ -18,14 +18,14 @@ package com.intellij.spellchecker.quickfixes; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiNamedElement; import com.intellij.psi.codeStyle.SuggestedNameInfo; -import com.intellij.refactoring.rename.NameSuggestionProvider; +import com.intellij.refactoring.rename.PreferrableNameSuggestionProvider; import com.intellij.spellchecker.SpellCheckerManager; import java.util.Set; import java.util.TreeSet; -public class DictionarySuggestionProvider implements NameSuggestionProvider { +public class DictionarySuggestionProvider extends PreferrableNameSuggestionProvider { private boolean active; @@ -33,6 +33,11 @@ public class DictionarySuggestionProvider implements NameSuggestionProvider { this.active = active; } + @Override + public boolean shouldCheckOthers() { + return !active; + } + public SuggestedNameInfo getSuggestedNames(PsiElement element, PsiElement nameSuggestionContext, Set result) { assert result != null; if (!active || nameSuggestionContext==null) { From 840df398c2848edecc07f4d386447e6550cc77d4 Mon Sep 17 00:00:00 2001 From: anna Date: Thu, 9 Feb 2012 09:46:53 +0100 Subject: [PATCH 213/215] EA-33601 - ISE: RedundantSuppressInspection.checkElement --- .../intellij/codeInspection/RedundantSuppressInspection.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/java/java-impl/src/com/intellij/codeInspection/RedundantSuppressInspection.java b/java/java-impl/src/com/intellij/codeInspection/RedundantSuppressInspection.java index 6d2efd17fbb9..e8cecdcef73c 100644 --- a/java/java-impl/src/com/intellij/codeInspection/RedundantSuppressInspection.java +++ b/java/java-impl/src/com/intellij/codeInspection/RedundantSuppressInspection.java @@ -167,14 +167,14 @@ public class RedundantSuppressInspection extends GlobalInspectionTool{ suppressedTools.add(tool); } else { iterator.remove(); - if (ids.isEmpty()) break; + break; } } else if (tool.getShortName().equals(shortName)) { //ignore global unused as it won't be checked anyway if (!(tool instanceof LocalInspectionToolWrapper) && !(tool instanceof GlobalInspectionToolWrapper)) { iterator.remove(); - if (ids.isEmpty()) break; + break; } else { suppressedTools.add(tool); } From 683bc308b3d37b7efd1382a317737cafa18240f6 Mon Sep 17 00:00:00 2001 From: Sergey Evdokimov Date: Thu, 9 Feb 2012 12:28:01 +0400 Subject: [PATCH 214/215] IDEA-81075 (Exception in maven integration) --- .../org/jetbrains/idea/maven/project/MavenProject.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenProject.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenProject.java index f6dbfa657089..767438724e2a 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenProject.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenProject.java @@ -891,7 +891,7 @@ public class MavenProject { volatile List myUnresolvedPluginsCache; volatile List myUnresolvedExtensionsCache; - ConcurrentHashMap myCache = new ConcurrentHashMap(); + transient ConcurrentHashMap myCache = new ConcurrentHashMap(); @Override public State clone() { @@ -940,5 +940,10 @@ public class MavenProject { return result; } + + private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException { + in.defaultReadObject(); + myCache = new ConcurrentHashMap(); + } } } From 0a9f631abe181fcc7cdbc59c0a46019715090ba3 Mon Sep 17 00:00:00 2001 From: anna Date: Thu, 9 Feb 2012 10:30:55 +0100 Subject: [PATCH 215/215] create from usage: do not suggest to create field in interfaces --- .../daemon/impl/quickfix/CreateFieldFromUsageFix.java | 5 +++++ .../daemon/impl/quickfix/CreateFromUsageBaseFix.java | 8 ++++++-- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/CreateFieldFromUsageFix.java b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/CreateFieldFromUsageFix.java index 59b5b6cd290a..2d4a27faa3c6 100644 --- a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/CreateFieldFromUsageFix.java +++ b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/CreateFieldFromUsageFix.java @@ -52,6 +52,11 @@ public class CreateFieldFromUsageFix extends CreateVarFromUsageFix { return false; } + @Override + protected boolean canBeTargetClass(PsiClass psiClass) { + return super.canBeTargetClass(psiClass) && !psiClass.isInterface() && !psiClass.isAnnotationType(); + } + @Override protected void invokeImpl(final PsiClass targetClass) { final Project project = myReferenceExpression.getProject(); diff --git a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/CreateFromUsageBaseFix.java b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/CreateFromUsageBaseFix.java index fc7fefb43761..027a045545ca 100644 --- a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/CreateFromUsageBaseFix.java +++ b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/CreateFromUsageBaseFix.java @@ -347,16 +347,20 @@ public abstract class CreateFromUsageBaseFix extends BaseIntentionAction { } } - private static void collectSupers(PsiClass psiClass, ArrayList classes) { + private void collectSupers(PsiClass psiClass, ArrayList classes) { classes.add(psiClass); final PsiClass[] supers = psiClass.getSupers(); for (PsiClass aSuper : supers) { - if (aSuper.getManager().isInProject(aSuper)) { + if (canBeTargetClass(aSuper)) { collectSupers(aSuper, classes); } } } + + protected boolean canBeTargetClass(PsiClass psiClass) { + return psiClass.getManager().isInProject(psiClass); + } protected static void startTemplate (@NotNull Editor editor, final Template template, @NotNull final Project project) { startTemplate(editor, template, project, null);

t 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