From 6cc59d9409dc238994708a45ffa0a9d4360fd989 Mon Sep 17 00:00:00 2001 From: joelmoniz Date: Sat, 31 May 2014 14:14:56 +0530 Subject: [PATCH 01/88] Worked on GUI part of adding option to Pref window --- app/src/processing/app/Preferences.java | 717 ++++++++++++++++++++++++ 1 file changed, 717 insertions(+) diff --git a/app/src/processing/app/Preferences.java b/app/src/processing/app/Preferences.java index 68f94d44b..bfea138a5 100644 --- a/app/src/processing/app/Preferences.java +++ b/app/src/processing/app/Preferences.java @@ -28,6 +28,11 @@ import java.io.*; import java.util.*; import javax.swing.*; +import javax.swing.border.BevelBorder; +import javax.swing.border.EmptyBorder; +import javax.swing.event.DocumentEvent; +import javax.swing.event.DocumentListener; +import javax.swing.text.*; import processing.core.*; @@ -107,6 +112,8 @@ public class Preferences { int wide, high; JTextField sketchbookLocationField; + JTextField presentColor; + JTextField presentColorHex; JCheckBox editorAntialiasBox; JCheckBox deletePreviousBox; JCheckBox whinyBox; @@ -368,6 +375,80 @@ public class Preferences { fontSizeField.setSelectedItem(Preferences.getFont("editor.font.size")); top += d.height + GUI_BETWEEN; + // Here I am + + Container colorBox = Box.createHorizontalBox(); + + label = new JLabel("Background color when Presenting: "); + colorBox.add(label); + + final String colorTip = "" + + "Select the background color used when using Present.
" + + "Present is used to present a sketch in full-screen,
" + + "accessible from the Sketch menu."; + label.setToolTipText(colorTip); + + presentColor = new JTextField(" "); + presentColor.setOpaque(true); + presentColor.setEnabled(false); + presentColor.setBorder(BorderFactory.createLineBorder(Color.BLACK)); + presentColor.setBackground(Preferences.getColor("run.present.bgcolor")); + colorBox.add(presentColor); + + colorBox.add(Box.createHorizontalStrut(GUI_SMALL)); + + label = new JLabel("#"); + colorBox.add(label); + + presentColorHex = new JTextField(6); + presentColorHex.setText(Preferences.get("run.present.bgcolor").substring(1)); + presentColorHex.setEditable(false); + presentColorHex.setBackground(Color.WHITE); + + final CustomColorChooser c = new CustomColorChooser(Preferences.getColor("run.present.bgcolor"), + presentColorHex, presentColor); + + presentColorHex.addMouseListener(new MouseListener() { + + @Override + public void mouseReleased(MouseEvent e) { + } + + @Override + public void mousePressed(MouseEvent e) { + } + + @Override + public void mouseExited(MouseEvent e) { + } + + @Override + public void mouseEntered(MouseEvent e) { + } + + @Override + public void mouseClicked(MouseEvent e) { + c.show(); + } + }); + + presentColorHex.addActionListener(new ActionListener() { + + @Override + public void actionPerformed(ActionEvent e) { + c.hide(); + } + }); + + colorBox.add(presentColorHex); + + pain.add(colorBox); + d = colorBox.getPreferredSize(); + colorBox.setBounds(left, top, d.width, d.height); + + top += d.height + GUI_BETWEEN; + + // till here // [ ] Use smooth text in editor window @@ -634,7 +715,643 @@ public class Preferences { }); } + private class CustomColorChooser { + int hue, saturation, brightness; // range 360, 100, 100 + int red, green, blue; // range 256, 256, 256 + + ColorRange range; + ColorSlider slider; + + JTextField hueField, saturationField, brightnessField; + JTextField redField, greenField, blueField; + + JTextField hexField; + + JPanel colorPanel; + DocumentListener colorListener; + + JDialog window; + + JTextField externalHex, externalColor; + + + public CustomColorChooser(Color initialColor, final JTextField externalHex, + final JTextField externalColor) { + Frame owner = null; + this.externalHex = externalHex; + this.externalColor = externalColor; + window = new JDialog(owner, "Choose the background color for Present", true); + window.getContentPane().setLayout(new BorderLayout()); + + Box box = Box.createHorizontalBox(); + box.setBorder(new EmptyBorder(12, 12, 12, 12)); + + range = new ColorRange(); + range.init(); + Box rangeBox = new Box(BoxLayout.Y_AXIS); + rangeBox.setAlignmentY(0); + rangeBox.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED)); + rangeBox.add(range); + box.add(rangeBox); + box.add(Box.createHorizontalStrut(10)); + + slider = new ColorSlider(); + slider.init(); + Box sliderBox = new Box(BoxLayout.Y_AXIS); + sliderBox.setAlignmentY(0); + sliderBox.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED)); + sliderBox.add(slider); + box.add(sliderBox); + box.add(Box.createHorizontalStrut(10)); + + box.add(createColorFields(PROMPT_OK, new ActionListener() { + + @Override + public void actionPerformed(ActionEvent e) { + externalHex.setText(getHexColor().substring(1)); + externalColor.setBackground(getColor()); + hide(); + } + }, PROMPT_CANCEL, new ActionListener() { + + @Override + public void actionPerformed(ActionEvent e) { + hide(); + } + })); + + box.add(Box.createHorizontalStrut(10)); + + window.getContentPane().add(box, BorderLayout.CENTER); + + window.pack(); + window.setResizable(false); + + window.setLocationRelativeTo(null); + + window.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE); + window.addWindowListener(new WindowAdapter() { + public void windowClosing(WindowEvent e) { + hide(); + } + }); + Toolkit.registerWindowCloseKeys(window.getRootPane(), new ActionListener() { + public void actionPerformed(ActionEvent actionEvent) { + hide(); + } + }); + + Toolkit.setIcon(window); + + colorListener = new ColorListener(); + hueField.getDocument().addDocumentListener(colorListener); + saturationField.getDocument().addDocumentListener(colorListener); + brightnessField.getDocument().addDocumentListener(colorListener); + redField.getDocument().addDocumentListener(colorListener); + greenField.getDocument().addDocumentListener(colorListener); + blueField.getDocument().addDocumentListener(colorListener); + hexField.getDocument().addDocumentListener(colorListener); + + setColor(initialColor); + } + + + public void show() { + window.setVisible(true); + window.setCursor(Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR)); + } + + + public void hide() { + window.setVisible(false); + setColor(new Color(Integer.parseInt(externalHex.getText().substring(0, 2), 16), + Integer.parseInt(externalHex.getText().substring(2, 4), 16), + Integer.parseInt(externalHex.getText().substring(4, 6), 16))); + } + + + public Color getColor() { + return new Color(red, green, blue); + } + + + public void setColor(Color color) { + updateRGB(color.getRGB()); + } + + + public String getHexColor() { + return "#" + PApplet.hex(red, 2) + PApplet.hex(green, 2) + PApplet.hex(blue, 2); + } + + + public class ColorListener implements DocumentListener { + + public void changedUpdate(DocumentEvent e) { + } + + public void removeUpdate(DocumentEvent e) { + } + + + boolean updating; + + public void insertUpdate(DocumentEvent e) { + if (updating) return; // don't update forever recursively + updating = true; + + Document doc = e.getDocument(); + if (doc == hueField.getDocument()) { + hue = bounded(hue, hueField, 359); + updateRGB(); + updateHex(); + + } else if (doc == saturationField.getDocument()) { + saturation = bounded(saturation, saturationField, 99); + updateRGB(); + updateHex(); + + } else if (doc == brightnessField.getDocument()) { + brightness = bounded(brightness, brightnessField, 99); + updateRGB(); + updateHex(); + + } else if (doc == redField.getDocument()) { + red = bounded(red, redField, 255); + updateHSB(); + updateHex(); + + } else if (doc == greenField.getDocument()) { + green = bounded(green, greenField, 255); + updateHSB(); + updateHex(); + + } else if (doc == blueField.getDocument()) { + blue = bounded(blue, blueField, 255); + updateHSB(); + updateHex(); + + } else if (doc == hexField.getDocument()) { + String str = hexField.getText(); + if (str.startsWith("#")) { + str = str.substring(1); + } + while (str.length() < 6) { + str += "0"; + } + if (str.length() > 6) { + str = str.substring(0, 6); + } + updateRGB(Integer.parseInt(str, 16)); + updateHSB(); + } + range.redraw(); + slider.redraw(); + colorPanel.repaint(); + updating = false; + } + } + + + /** + * Set the RGB values based on the current HSB values. + */ + protected void updateRGB() { + updateRGB(Color.HSBtoRGB(hue / 359f, + saturation / 99f, + brightness / 99f)); + } + + + /** + * Set the RGB values based on a calculated ARGB int. + * Used by both updateRGB() to set the color from the HSB values, + * and by updateHex(), to unpack the hex colors and assign them. + */ + protected void updateRGB(int rgb) { + red = (rgb >> 16) & 0xff; + green = (rgb >> 8) & 0xff; + blue = rgb & 0xff; + + redField.setText(String.valueOf(red)); + greenField.setText(String.valueOf(green)); + blueField.setText(String.valueOf(blue)); + } + + + /** + * Set the HSB values based on the current RGB values. + */ + protected void updateHSB() { + float hsb[] = new float[3]; + Color.RGBtoHSB(red, green, blue, hsb); + + hue = (int) (hsb[0] * 359.0f); + saturation = (int) (hsb[1] * 99.0f); + brightness = (int) (hsb[2] * 99.0f); + + hueField.setText(String.valueOf(hue)); + saturationField.setText(String.valueOf(saturation)); + brightnessField.setText(String.valueOf(brightness)); + } + + + protected void updateHex() { + hexField.setText(getHexColor()); + } + + + /** + * Get the bounded value for a specific range. If the value is outside + * the max, you can't edit right away, so just act as if it's already + * been bounded and return the bounded value, then fire an event to set + * it to the value that was just returned. + */ + protected int bounded(int current, final JTextField field, final int max) { + String text = field.getText(); + if (text.length() == 0) { + return 0; + } + try { + int value = Integer.parseInt(text); + if (value > max) { + SwingUtilities.invokeLater(new Runnable() { + public void run() { + field.setText(String.valueOf(max)); + } + }); + return max; + } + return value; + + } catch (NumberFormatException e) { + return current; // should not be reachable + } + } + + + protected Container createColorFields(String buttonName, ActionListener buttonListener, + String buttonName2, ActionListener buttonListener2) { + Box box = Box.createVerticalBox(); + box.setAlignmentY(0); + + final int GAP = Base.isWindows() ? 5 : 0; + final int BETWEEN = Base.isWindows() ? 8 : 6; //10; + + Box row; + + row = Box.createHorizontalBox(); + if (Base.isMacOS()) { + row.add(Box.createHorizontalStrut(17)); + } else { + row.add(createFixedLabel("")); + } + // Can't just set the bg color of the panel because it also tints the bevel + // (on OS X), which looks odd. So instead we override paintComponent(). + colorPanel = new JPanel() { + public void paintComponent(Graphics g) { + g.setColor(new Color(red, green, blue)); + Dimension size = getSize(); + g.fillRect(0, 0, size.width, size.height); + } + }; + colorPanel.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED)); + Dimension dim = new Dimension(70, 25); + colorPanel.setMinimumSize(dim); + colorPanel.setMaximumSize(dim); + colorPanel.setPreferredSize(dim); + row.add(colorPanel); + row.add(Box.createHorizontalGlue()); + box.add(row); + box.add(Box.createVerticalStrut(BETWEEN)); + + row = Box.createHorizontalBox(); + row.add(createFixedLabel("H")); + row.add(hueField = new NumberField(4, false)); + row.add(new JLabel(" \u00B0")); // degree symbol + row.add(Box.createHorizontalGlue()); + box.add(row); + box.add(Box.createVerticalStrut(GAP)); + + row = Box.createHorizontalBox(); + row.add(createFixedLabel("S")); + row.add(saturationField = new NumberField(4, false)); + row.add(new JLabel(" %")); + row.add(Box.createHorizontalGlue()); + box.add(row); + box.add(Box.createVerticalStrut(GAP)); + + row = Box.createHorizontalBox(); + row.add(createFixedLabel("B")); + row.add(brightnessField = new NumberField(4, false)); + row.add(new JLabel(" %")); + row.add(Box.createHorizontalGlue()); + box.add(row); + box.add(Box.createVerticalStrut(BETWEEN)); + + row = Box.createHorizontalBox(); + row.add(createFixedLabel("R")); + row.add(redField = new NumberField(4, false)); + row.add(Box.createHorizontalGlue()); + box.add(row); + box.add(Box.createVerticalStrut(GAP)); + + row = Box.createHorizontalBox(); + row.add(createFixedLabel("G")); + row.add(greenField = new NumberField(4, false)); + row.add(Box.createHorizontalGlue()); + box.add(row); + box.add(Box.createVerticalStrut(GAP)); + + row = Box.createHorizontalBox(); + row.add(createFixedLabel("B")); + row.add(blueField = new NumberField(4, false)); + row.add(Box.createHorizontalGlue()); + box.add(row); + box.add(Box.createVerticalStrut(BETWEEN)); + + row = Box.createHorizontalBox(); + row.add(createFixedLabel("")); + // Windows needs extra space, OS X and Linux do not + // Mac OS X needs 6 because #CCCCCC is quite wide + final int hexCount = Base.isWindows() ? 7 : 6; + row.add(hexField = new NumberField(hexCount, true)); + row.add(Box.createHorizontalGlue()); + box.add(row); + box.add(Box.createVerticalStrut(GAP)); + + row = Box.createHorizontalBox(); + if (Base.isMacOS()) { + row.add(Box.createHorizontalStrut(11)); + } else { + row.add(createFixedLabel("")); + } + JButton button = new JButton(buttonName); + button.addActionListener(buttonListener); + + row.add(button); + row.add(Box.createHorizontalGlue()); + box.add(row); + + row = Box.createHorizontalBox(); + if (Base.isMacOS()) { + row.add(Box.createHorizontalStrut(11)); + } else { + row.add(createFixedLabel("")); + } + JButton button2 = new JButton(buttonName2); + button2.addActionListener(buttonListener2); + + row.add(button2); + row.add(Box.createHorizontalGlue()); + box.add(row); + + box.add(Box.createVerticalGlue()); + return box; + } + + + int labelH; + + /** + * return a label of a fixed width + */ + protected JLabel createFixedLabel(String title) { + JLabel label = new JLabel(title); + if (labelH == 0) { + labelH = label.getPreferredSize().height; + } + Dimension dim = new Dimension(15, labelH); + label.setPreferredSize(dim); + label.setMinimumSize(dim); + label.setMaximumSize(dim); + return label; + } + + + public class ColorRange extends PApplet { + + static final int WIDE = 256; + static final int HIGH = 256; + + int lastX, lastY; + + + public void setup() { + size(WIDE, HIGH); + noLoop(); + + colorMode(HSB, 360, 256, 256); + noFill(); + rectMode(CENTER); + + loadPixels(); + } + + public void draw() { + + if ((width != WIDE) || (height < HIGH)) { + return; + } + + int index = 0; + for (int j = 0; j < 256; j++) { + for (int i = 0; i < 256; i++) { + pixels[index++] = color(hue, i, 255 - j); + } + } + + updatePixels(); + stroke((brightness > 50) ? 0 : 255); + rect(lastX, lastY, 9, 9); + } + + public void mousePressed() { + updateMouse(); + } + + public void mouseDragged() { + updateMouse(); + } + + public void updateMouse() { + if ((mouseX >= 0) && (mouseX < 256) && + (mouseY >= 0) && (mouseY < 256)) { + int nsaturation = (int) (100 * (mouseX / 255.0f)); + int nbrightness = 100 - ((int) (100 * (mouseY / 255.0f))); + saturationField.setText(String.valueOf(nsaturation)); + brightnessField.setText(String.valueOf(nbrightness)); + + lastX = mouseX; + lastY = mouseY; + } + } + + public Dimension getPreferredSize() { + return new Dimension(WIDE, HIGH); + } + + public Dimension getMinimumSize() { + return new Dimension(WIDE, HIGH); + } + + public Dimension getMaximumSize() { + return new Dimension(WIDE, HIGH); + } + + public void keyPressed() { + if (key == ESC) { + CustomColorChooser.this.hide(); + // don't quit out of processing + // http://dev.processing.org/bugs/show_bug.cgi?id=1006 + key = 0; + } + } + } + + + public class ColorSlider extends PApplet { + + static final int WIDE = 20; + static final int HIGH = 256; + + public void setup() { + size(WIDE, HIGH); //, P3D); + colorMode(HSB, 255, 100, 100); + noLoop(); + loadPixels(); + } + + public void draw() { + if ((width != WIDE) || (height < HIGH)) { + return; + } + + int index = 0; + int sel = 255 - (int) (255 * (hue / 359f)); + for (int j = 0; j < 256; j++) { + int c = color(255 - j, 100, 100); + if (j == sel) c = 0xFF000000; + for (int i = 0; i < WIDE; i++) { + g.pixels[index++] = c; + } + } + updatePixels(); + } + + public void mousePressed() { + updateMouse(); + } + + public void mouseDragged() { + updateMouse(); + } + + public void updateMouse() { + if ((mouseX >= 0) && (mouseX < 256) && + (mouseY >= 0) && (mouseY < 256)) { + int nhue = 359 - (int) (359 * (mouseY / 255.0f)); + hueField.setText(String.valueOf(nhue)); + } + } + + public Dimension getPreferredSize() { + return new Dimension(WIDE, HIGH); + } + + public Dimension getMinimumSize() { + return new Dimension(WIDE, HIGH); + } + + public Dimension getMaximumSize() { + return new Dimension(WIDE, HIGH); + } + + public void keyPressed() { + if (key == ESC) { + CustomColorChooser.this.hide(); + // don't quit out of processing + // http://dev.processing.org/bugs/show_bug.cgi?id=1006 + key = 0; + } + } + } + + + /** + * Extension of JTextField that only allows numbers + */ + class NumberField extends JTextField { + + public boolean allowHex; + + public NumberField(int cols, boolean allowHex) { + super(cols); + this.allowHex = allowHex; + } + + protected Document createDefaultModel() { + return new NumberDocument(this); + } + + public Dimension getPreferredSize() { + if (!allowHex) { + return new Dimension(45, super.getPreferredSize().height); + } + return super.getPreferredSize(); + } + + public Dimension getMinimumSize() { + return getPreferredSize(); + } + + public Dimension getMaximumSize() { + return getPreferredSize(); + } + } + + + /** + * Document model to go with JTextField that only allows numbers. + */ + class NumberDocument extends PlainDocument { + + NumberField parentField; + + public NumberDocument(NumberField parentField) { + this.parentField = parentField; + } + + public void insertString(int offs, String str, AttributeSet a) + throws BadLocationException { + + if (str == null) return; + + char chars[] = str.toCharArray(); + int charCount = 0; + // remove any non-digit chars + for (int i = 0; i < chars.length; i++) { + boolean ok = Character.isDigit(chars[i]); + if (parentField.allowHex) { + if ((chars[i] >= 'A') && (chars[i] <= 'F')) ok = true; + if ((chars[i] >= 'a') && (chars[i] <= 'f')) ok = true; + if ((offs == 0) && (i == 0) && (chars[i] == '#')) ok = true; + } + if (ok) { + if (charCount != i) { // shift if necessary + chars[charCount] = chars[i]; + } + charCount++; + } + } + super.insertString(offs, new String(chars, 0, charCount), a); + } + } + + } + + public void sketchbookCallback(File file) { if (file != null) { sketchbookLocationField.setText(file.getAbsolutePath()); From 75fa9fd6c1173de7c213a5c50a98b9eec7e9f631 Mon Sep 17 00:00:00 2001 From: joelmoniz Date: Sat, 31 May 2014 14:31:44 +0530 Subject: [PATCH 02/88] Add 'link' between pref window and file for presnt Sets present.bgcolor on clicking OK, sets color in Preferences window from Preferences.txt on opening the window. --- app/src/processing/app/Preferences.java | 19 +++++++------------ 1 file changed, 7 insertions(+), 12 deletions(-) diff --git a/app/src/processing/app/Preferences.java b/app/src/processing/app/Preferences.java index bfea138a5..13453429a 100644 --- a/app/src/processing/app/Preferences.java +++ b/app/src/processing/app/Preferences.java @@ -28,10 +28,8 @@ import java.io.*; import java.util.*; import javax.swing.*; -import javax.swing.border.BevelBorder; -import javax.swing.border.EmptyBorder; -import javax.swing.event.DocumentEvent; -import javax.swing.event.DocumentListener; +import javax.swing.border.*; +import javax.swing.event.*; import javax.swing.text.*; import processing.core.*; @@ -432,14 +430,6 @@ public class Preferences { } }); - presentColorHex.addActionListener(new ActionListener() { - - @Override - public void actionPerformed(ActionEvent e) { - c.hide(); - } - }); - colorBox.add(presentColorHex); pain.add(colorBox); @@ -1501,6 +1491,8 @@ public class Preferences { consoleSizeField.setSelectedItem(getInteger("console.font.size")); } + setColor("run.present.bgcolor", presentColor.getBackground()); + setBoolean("editor.input_method_support", inputMethodBox.isSelected()); //$NON-NLS-1$ if (autoAssociateBox != null) { @@ -1559,6 +1551,9 @@ public class Preferences { fontSizeField.setSelectedItem(getInteger("editor.font.size")); consoleSizeField.setSelectedItem(getInteger("console.font.size")); + presentColor.setBackground(Preferences.getColor("run.present.bgcolor")); + presentColorHex.setText(Preferences.get("run.present.bgcolor").substring(1)); + memoryOverrideBox. setSelected(getBoolean("run.options.memory")); //$NON-NLS-1$ memoryField. From e594e4e9f67e49821e8f59a1b63b3423b3d2f36e Mon Sep 17 00:00:00 2001 From: joelmoniz Date: Sun, 1 Jun 2014 13:02:16 +0530 Subject: [PATCH 03/88] Changes as to how the user selects Present bckgrnd Clicking on the color preview brings up a color selector; Inputting a hex color automatically previews it --- app/src/processing/app/Preferences.java | 1393 ++++++++++++----------- 1 file changed, 718 insertions(+), 675 deletions(-) diff --git a/app/src/processing/app/Preferences.java b/app/src/processing/app/Preferences.java index 13453429a..0266fbae8 100644 --- a/app/src/processing/app/Preferences.java +++ b/app/src/processing/app/Preferences.java @@ -372,74 +372,137 @@ public class Preferences { // fontSizeField.setSelectedItem(editorFont.getSize()); fontSizeField.setSelectedItem(Preferences.getFont("editor.font.size")); top += d.height + GUI_BETWEEN; - - // Here I am Container colorBox = Box.createHorizontalBox(); - + label = new JLabel("Background color when Presenting: "); colorBox.add(label); - final String colorTip = "" + - "Select the background color used when using Present.
" + - "Present is used to present a sketch in full-screen,
" + - "accessible from the Sketch menu."; + final String colorTip = "" + + "Select the background color used when using Present.
" + + "Present is used to present a sketch in full-screen,
" + + "accessible from the Sketch menu."; label.setToolTipText(colorTip); - presentColor = new JTextField(" "); + presentColor = new JTextField(" "); presentColor.setOpaque(true); presentColor.setEnabled(false); presentColor.setBorder(BorderFactory.createLineBorder(Color.BLACK)); presentColor.setBackground(Preferences.getColor("run.present.bgcolor")); - colorBox.add(presentColor); - - colorBox.add(Box.createHorizontalStrut(GUI_SMALL)); - - label = new JLabel("#"); - colorBox.add(label); - + presentColor.setForeground(Preferences.getColor("run.present.bgcolor")); + presentColorHex = new JTextField(6); - presentColorHex.setText(Preferences.get("run.present.bgcolor").substring(1)); - presentColorHex.setEditable(false); - presentColorHex.setBackground(Color.WHITE); - - final CustomColorChooser c = new CustomColorChooser(Preferences.getColor("run.present.bgcolor"), - presentColorHex, presentColor); - - presentColorHex.addMouseListener(new MouseListener() { - - @Override - public void mouseReleased(MouseEvent e) { - } - - @Override - public void mousePressed(MouseEvent e) { - } - - @Override - public void mouseExited(MouseEvent e) { - } - - @Override - public void mouseEntered(MouseEvent e) { - } - - @Override - public void mouseClicked(MouseEvent e) { - c.show(); - } - }); + presentColorHex + .setText(Preferences.get("run.present.bgcolor").substring(1)); + presentColorHex.getDocument().addDocumentListener(new DocumentListener() { + + @Override + public void removeUpdate(DocumentEvent e) { + final String colorValue = presentColorHex.getText().toUpperCase(); + if (colorValue.length() == 7 && (colorValue.startsWith("#"))) + EventQueue.invokeLater(new Runnable() { + public void run() { + presentColorHex.setText(colorValue.substring(1)); + } + }); + if (colorValue.length() == 6 + && colorValue.matches("[0123456789ABCDEF]*")) { + presentColor.setBackground(new Color(Integer.parseInt( + colorValue.substring(0, 2), 16), Integer.parseInt( + colorValue.substring(2, 4), 16), Integer.parseInt( + colorValue.substring(4, 6), 16))); + if (!colorValue.equals(presentColorHex.getText())) + EventQueue.invokeLater(new Runnable() { + public void run() { + presentColorHex.setText(colorValue); + } + }); + } + } + + @Override + public void insertUpdate(DocumentEvent e) { + final String colorValue = presentColorHex.getText().toUpperCase(); + if (colorValue.length() == 7 && (colorValue.startsWith("#"))) + EventQueue.invokeLater(new Runnable() { + public void run() { + presentColorHex.setText(colorValue.substring(1)); + } + }); + if (colorValue.length() == 6 + && colorValue.matches("[0123456789ABCDEF]*")) { + presentColor.setBackground(new Color(Integer.parseInt( + colorValue.substring(0, 2), 16), Integer.parseInt( + colorValue.substring(2, 4), 16), Integer.parseInt( + colorValue.substring(4, 6), 16))); + if (!colorValue.equals(presentColorHex.getText())) + EventQueue.invokeLater(new Runnable() { + public void run() { + presentColorHex.setText(colorValue); + } + }); + } + } + + @Override + public void changedUpdate(DocumentEvent e) { + } + }); + + final CustomColorChooser c = new CustomColorChooser( + Preferences.getColor("run.present.bgcolor"), presentColorHex, + presentColor); + + presentColor.addMouseListener(new MouseListener() { + + @Override + public void mouseReleased(MouseEvent e) { + } + + @Override + public void mousePressed(MouseEvent e) { + } + + @Override + public void mouseExited(MouseEvent e) { + } + + @Override + public void mouseEntered(MouseEvent e) { + } + + @Override + public void mouseClicked(MouseEvent e) { + c.show(); + } + }); + + presentColorHex.addInputMethodListener(new InputMethodListener() { + + @Override + public void inputMethodTextChanged(InputMethodEvent event) { + } + + @Override + public void caretPositionChanged(InputMethodEvent event) { + } + }); + + colorBox.add(presentColor); + + colorBox.add(Box.createHorizontalStrut(GUI_SMALL)); + + label = new JLabel("#"); + colorBox.add(label); colorBox.add(presentColorHex); - + pain.add(colorBox); d = colorBox.getPreferredSize(); colorBox.setBounds(left, top, d.width, d.height); - + top += d.height + GUI_BETWEEN; - // till here - // [ ] Use smooth text in editor window editorAntialiasBox = new JCheckBox("Use smooth text in editor window"); @@ -705,58 +768,57 @@ public class Preferences { }); } - private class CustomColorChooser { + private class CustomColorChooser { - int hue, saturation, brightness; // range 360, 100, 100 - int red, green, blue; // range 256, 256, 256 + int hue, saturation, brightness; // range 360, 100, 100 + int red, green, blue; // range 256, 256, 256 - ColorRange range; - ColorSlider slider; + ColorRange range; + ColorSlider slider; - JTextField hueField, saturationField, brightnessField; - JTextField redField, greenField, blueField; + JTextField hueField, saturationField, brightnessField; + JTextField redField, greenField, blueField; - JTextField hexField; + JTextField hexField; - JPanel colorPanel; - DocumentListener colorListener; - - JDialog window; - - JTextField externalHex, externalColor; + JPanel colorPanel; + DocumentListener colorListener; - - public CustomColorChooser(Color initialColor, final JTextField externalHex, - final JTextField externalColor) { - Frame owner = null; - this.externalHex = externalHex; - this.externalColor = externalColor; - window = new JDialog(owner, "Choose the background color for Present", true); - window.getContentPane().setLayout(new BorderLayout()); + JDialog window; - Box box = Box.createHorizontalBox(); - box.setBorder(new EmptyBorder(12, 12, 12, 12)); + JTextField externalHex, externalColor; - range = new ColorRange(); - range.init(); - Box rangeBox = new Box(BoxLayout.Y_AXIS); - rangeBox.setAlignmentY(0); - rangeBox.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED)); - rangeBox.add(range); - box.add(rangeBox); - box.add(Box.createHorizontalStrut(10)); + public CustomColorChooser(Color initialColor, final JTextField externalHex, + final JTextField externalColor) { + Frame owner = null; + this.externalHex = externalHex; + this.externalColor = externalColor; + window = new JDialog(owner, "Choose the background color for Present", + true); + window.getContentPane().setLayout(new BorderLayout()); + Box box = Box.createHorizontalBox(); + box.setBorder(new EmptyBorder(12, 12, 12, 12)); - slider = new ColorSlider(); - slider.init(); - Box sliderBox = new Box(BoxLayout.Y_AXIS); - sliderBox.setAlignmentY(0); - sliderBox.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED)); - sliderBox.add(slider); - box.add(sliderBox); - box.add(Box.createHorizontalStrut(10)); + range = new ColorRange(); + range.init(); + Box rangeBox = new Box(BoxLayout.Y_AXIS); + rangeBox.setAlignmentY(0); + rangeBox.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED)); + rangeBox.add(range); + box.add(rangeBox); + box.add(Box.createHorizontalStrut(10)); + + slider = new ColorSlider(); + slider.init(); + Box sliderBox = new Box(BoxLayout.Y_AXIS); + sliderBox.setAlignmentY(0); + sliderBox.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED)); + sliderBox.add(slider); + box.add(sliderBox); + box.add(Box.createHorizontalStrut(10)); + + box.add(createColorFields(PROMPT_OK, new ActionListener() { - box.add(createColorFields(PROMPT_OK, new ActionListener() { - @Override public void actionPerformed(ActionEvent e) { externalHex.setText(getHexColor().substring(1)); @@ -764,584 +826,569 @@ public class Preferences { hide(); } }, PROMPT_CANCEL, new ActionListener() { - - @Override - public void actionPerformed(ActionEvent e) { - hide(); - } - })); - - box.add(Box.createHorizontalStrut(10)); - - window.getContentPane().add(box, BorderLayout.CENTER); - - window.pack(); - window.setResizable(false); - - window.setLocationRelativeTo(null); - - window.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE); - window.addWindowListener(new WindowAdapter() { - public void windowClosing(WindowEvent e) { - hide(); - } - }); - Toolkit.registerWindowCloseKeys(window.getRootPane(), new ActionListener() { - public void actionPerformed(ActionEvent actionEvent) { - hide(); - } - }); - - Toolkit.setIcon(window); - - colorListener = new ColorListener(); - hueField.getDocument().addDocumentListener(colorListener); - saturationField.getDocument().addDocumentListener(colorListener); - brightnessField.getDocument().addDocumentListener(colorListener); - redField.getDocument().addDocumentListener(colorListener); - greenField.getDocument().addDocumentListener(colorListener); - blueField.getDocument().addDocumentListener(colorListener); - hexField.getDocument().addDocumentListener(colorListener); - - setColor(initialColor); - } - - - public void show() { - window.setVisible(true); - window.setCursor(Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR)); - } - - - public void hide() { - window.setVisible(false); - setColor(new Color(Integer.parseInt(externalHex.getText().substring(0, 2), 16), - Integer.parseInt(externalHex.getText().substring(2, 4), 16), - Integer.parseInt(externalHex.getText().substring(4, 6), 16))); - } - - - public Color getColor() { - return new Color(red, green, blue); - } - - - public void setColor(Color color) { - updateRGB(color.getRGB()); - } - - - public String getHexColor() { - return "#" + PApplet.hex(red, 2) + PApplet.hex(green, 2) + PApplet.hex(blue, 2); - } - - - public class ColorListener implements DocumentListener { - - public void changedUpdate(DocumentEvent e) { - } - - public void removeUpdate(DocumentEvent e) { - } - - - boolean updating; - - public void insertUpdate(DocumentEvent e) { - if (updating) return; // don't update forever recursively - updating = true; - - Document doc = e.getDocument(); - if (doc == hueField.getDocument()) { - hue = bounded(hue, hueField, 359); - updateRGB(); - updateHex(); - - } else if (doc == saturationField.getDocument()) { - saturation = bounded(saturation, saturationField, 99); - updateRGB(); - updateHex(); - - } else if (doc == brightnessField.getDocument()) { - brightness = bounded(brightness, brightnessField, 99); - updateRGB(); - updateHex(); - - } else if (doc == redField.getDocument()) { - red = bounded(red, redField, 255); - updateHSB(); - updateHex(); - - } else if (doc == greenField.getDocument()) { - green = bounded(green, greenField, 255); - updateHSB(); - updateHex(); - - } else if (doc == blueField.getDocument()) { - blue = bounded(blue, blueField, 255); - updateHSB(); - updateHex(); - - } else if (doc == hexField.getDocument()) { - String str = hexField.getText(); - if (str.startsWith("#")) { - str = str.substring(1); - } - while (str.length() < 6) { - str += "0"; - } - if (str.length() > 6) { - str = str.substring(0, 6); - } - updateRGB(Integer.parseInt(str, 16)); - updateHSB(); - } - range.redraw(); - slider.redraw(); - colorPanel.repaint(); - updating = false; - } - } - - - /** - * Set the RGB values based on the current HSB values. - */ - protected void updateRGB() { - updateRGB(Color.HSBtoRGB(hue / 359f, - saturation / 99f, - brightness / 99f)); - } - - - /** - * Set the RGB values based on a calculated ARGB int. - * Used by both updateRGB() to set the color from the HSB values, - * and by updateHex(), to unpack the hex colors and assign them. - */ - protected void updateRGB(int rgb) { - red = (rgb >> 16) & 0xff; - green = (rgb >> 8) & 0xff; - blue = rgb & 0xff; - - redField.setText(String.valueOf(red)); - greenField.setText(String.valueOf(green)); - blueField.setText(String.valueOf(blue)); - } - - - /** - * Set the HSB values based on the current RGB values. - */ - protected void updateHSB() { - float hsb[] = new float[3]; - Color.RGBtoHSB(red, green, blue, hsb); - - hue = (int) (hsb[0] * 359.0f); - saturation = (int) (hsb[1] * 99.0f); - brightness = (int) (hsb[2] * 99.0f); - - hueField.setText(String.valueOf(hue)); - saturationField.setText(String.valueOf(saturation)); - brightnessField.setText(String.valueOf(brightness)); - } - - - protected void updateHex() { - hexField.setText(getHexColor()); - } - - - /** - * Get the bounded value for a specific range. If the value is outside - * the max, you can't edit right away, so just act as if it's already - * been bounded and return the bounded value, then fire an event to set - * it to the value that was just returned. - */ - protected int bounded(int current, final JTextField field, final int max) { - String text = field.getText(); - if (text.length() == 0) { - return 0; - } - try { - int value = Integer.parseInt(text); - if (value > max) { - SwingUtilities.invokeLater(new Runnable() { - public void run() { - field.setText(String.valueOf(max)); - } - }); - return max; - } - return value; - - } catch (NumberFormatException e) { - return current; // should not be reachable - } - } - - - protected Container createColorFields(String buttonName, ActionListener buttonListener, - String buttonName2, ActionListener buttonListener2) { - Box box = Box.createVerticalBox(); - box.setAlignmentY(0); - - final int GAP = Base.isWindows() ? 5 : 0; - final int BETWEEN = Base.isWindows() ? 8 : 6; //10; - - Box row; - - row = Box.createHorizontalBox(); - if (Base.isMacOS()) { - row.add(Box.createHorizontalStrut(17)); - } else { - row.add(createFixedLabel("")); - } - // Can't just set the bg color of the panel because it also tints the bevel - // (on OS X), which looks odd. So instead we override paintComponent(). - colorPanel = new JPanel() { - public void paintComponent(Graphics g) { - g.setColor(new Color(red, green, blue)); - Dimension size = getSize(); - g.fillRect(0, 0, size.width, size.height); - } - }; - colorPanel.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED)); - Dimension dim = new Dimension(70, 25); - colorPanel.setMinimumSize(dim); - colorPanel.setMaximumSize(dim); - colorPanel.setPreferredSize(dim); - row.add(colorPanel); - row.add(Box.createHorizontalGlue()); - box.add(row); - box.add(Box.createVerticalStrut(BETWEEN)); - - row = Box.createHorizontalBox(); - row.add(createFixedLabel("H")); - row.add(hueField = new NumberField(4, false)); - row.add(new JLabel(" \u00B0")); // degree symbol - row.add(Box.createHorizontalGlue()); - box.add(row); - box.add(Box.createVerticalStrut(GAP)); - - row = Box.createHorizontalBox(); - row.add(createFixedLabel("S")); - row.add(saturationField = new NumberField(4, false)); - row.add(new JLabel(" %")); - row.add(Box.createHorizontalGlue()); - box.add(row); - box.add(Box.createVerticalStrut(GAP)); - - row = Box.createHorizontalBox(); - row.add(createFixedLabel("B")); - row.add(brightnessField = new NumberField(4, false)); - row.add(new JLabel(" %")); - row.add(Box.createHorizontalGlue()); - box.add(row); - box.add(Box.createVerticalStrut(BETWEEN)); - - row = Box.createHorizontalBox(); - row.add(createFixedLabel("R")); - row.add(redField = new NumberField(4, false)); - row.add(Box.createHorizontalGlue()); - box.add(row); - box.add(Box.createVerticalStrut(GAP)); - - row = Box.createHorizontalBox(); - row.add(createFixedLabel("G")); - row.add(greenField = new NumberField(4, false)); - row.add(Box.createHorizontalGlue()); - box.add(row); - box.add(Box.createVerticalStrut(GAP)); - - row = Box.createHorizontalBox(); - row.add(createFixedLabel("B")); - row.add(blueField = new NumberField(4, false)); - row.add(Box.createHorizontalGlue()); - box.add(row); - box.add(Box.createVerticalStrut(BETWEEN)); - - row = Box.createHorizontalBox(); - row.add(createFixedLabel("")); - // Windows needs extra space, OS X and Linux do not - // Mac OS X needs 6 because #CCCCCC is quite wide - final int hexCount = Base.isWindows() ? 7 : 6; - row.add(hexField = new NumberField(hexCount, true)); - row.add(Box.createHorizontalGlue()); - box.add(row); - box.add(Box.createVerticalStrut(GAP)); - - row = Box.createHorizontalBox(); - if (Base.isMacOS()) { - row.add(Box.createHorizontalStrut(11)); - } else { - row.add(createFixedLabel("")); - } - JButton button = new JButton(buttonName); - button.addActionListener(buttonListener); - - row.add(button); - row.add(Box.createHorizontalGlue()); - box.add(row); - - row = Box.createHorizontalBox(); - if (Base.isMacOS()) { - row.add(Box.createHorizontalStrut(11)); - } else { - row.add(createFixedLabel("")); - } - JButton button2 = new JButton(buttonName2); - button2.addActionListener(buttonListener2); - - row.add(button2); - row.add(Box.createHorizontalGlue()); - box.add(row); - - box.add(Box.createVerticalGlue()); - return box; - } - - - int labelH; - - /** - * return a label of a fixed width - */ - protected JLabel createFixedLabel(String title) { - JLabel label = new JLabel(title); - if (labelH == 0) { - labelH = label.getPreferredSize().height; - } - Dimension dim = new Dimension(15, labelH); - label.setPreferredSize(dim); - label.setMinimumSize(dim); - label.setMaximumSize(dim); - return label; - } - - - public class ColorRange extends PApplet { - - static final int WIDE = 256; - static final int HIGH = 256; - - int lastX, lastY; - - - public void setup() { - size(WIDE, HIGH); - noLoop(); - - colorMode(HSB, 360, 256, 256); - noFill(); - rectMode(CENTER); - - loadPixels(); - } - - public void draw() { - - if ((width != WIDE) || (height < HIGH)) { - return; - } - - int index = 0; - for (int j = 0; j < 256; j++) { - for (int i = 0; i < 256; i++) { - pixels[index++] = color(hue, i, 255 - j); - } - } - - updatePixels(); - stroke((brightness > 50) ? 0 : 255); - rect(lastX, lastY, 9, 9); - } - - public void mousePressed() { - updateMouse(); - } - - public void mouseDragged() { - updateMouse(); - } - - public void updateMouse() { - if ((mouseX >= 0) && (mouseX < 256) && - (mouseY >= 0) && (mouseY < 256)) { - int nsaturation = (int) (100 * (mouseX / 255.0f)); - int nbrightness = 100 - ((int) (100 * (mouseY / 255.0f))); - saturationField.setText(String.valueOf(nsaturation)); - brightnessField.setText(String.valueOf(nbrightness)); - - lastX = mouseX; - lastY = mouseY; - } - } - - public Dimension getPreferredSize() { - return new Dimension(WIDE, HIGH); - } - - public Dimension getMinimumSize() { - return new Dimension(WIDE, HIGH); - } - - public Dimension getMaximumSize() { - return new Dimension(WIDE, HIGH); - } - - public void keyPressed() { - if (key == ESC) { - CustomColorChooser.this.hide(); - // don't quit out of processing - // http://dev.processing.org/bugs/show_bug.cgi?id=1006 - key = 0; - } - } - } - - - public class ColorSlider extends PApplet { - - static final int WIDE = 20; - static final int HIGH = 256; - - public void setup() { - size(WIDE, HIGH); //, P3D); - colorMode(HSB, 255, 100, 100); - noLoop(); - loadPixels(); - } - - public void draw() { - if ((width != WIDE) || (height < HIGH)) { - return; - } - - int index = 0; - int sel = 255 - (int) (255 * (hue / 359f)); - for (int j = 0; j < 256; j++) { - int c = color(255 - j, 100, 100); - if (j == sel) c = 0xFF000000; - for (int i = 0; i < WIDE; i++) { - g.pixels[index++] = c; - } - } - updatePixels(); - } - - public void mousePressed() { - updateMouse(); - } - - public void mouseDragged() { - updateMouse(); - } - - public void updateMouse() { - if ((mouseX >= 0) && (mouseX < 256) && - (mouseY >= 0) && (mouseY < 256)) { - int nhue = 359 - (int) (359 * (mouseY / 255.0f)); - hueField.setText(String.valueOf(nhue)); - } - } - - public Dimension getPreferredSize() { - return new Dimension(WIDE, HIGH); - } - - public Dimension getMinimumSize() { - return new Dimension(WIDE, HIGH); - } - - public Dimension getMaximumSize() { - return new Dimension(WIDE, HIGH); - } - - public void keyPressed() { - if (key == ESC) { - CustomColorChooser.this.hide(); - // don't quit out of processing - // http://dev.processing.org/bugs/show_bug.cgi?id=1006 - key = 0; - } - } - } - - - /** - * Extension of JTextField that only allows numbers - */ - class NumberField extends JTextField { - - public boolean allowHex; - - public NumberField(int cols, boolean allowHex) { - super(cols); - this.allowHex = allowHex; - } - - protected Document createDefaultModel() { - return new NumberDocument(this); - } - - public Dimension getPreferredSize() { - if (!allowHex) { - return new Dimension(45, super.getPreferredSize().height); - } - return super.getPreferredSize(); - } - - public Dimension getMinimumSize() { - return getPreferredSize(); - } - - public Dimension getMaximumSize() { - return getPreferredSize(); - } - } - - - /** - * Document model to go with JTextField that only allows numbers. - */ - class NumberDocument extends PlainDocument { - - NumberField parentField; - - public NumberDocument(NumberField parentField) { - this.parentField = parentField; - } - - public void insertString(int offs, String str, AttributeSet a) - throws BadLocationException { - - if (str == null) return; - - char chars[] = str.toCharArray(); - int charCount = 0; - // remove any non-digit chars - for (int i = 0; i < chars.length; i++) { - boolean ok = Character.isDigit(chars[i]); - if (parentField.allowHex) { - if ((chars[i] >= 'A') && (chars[i] <= 'F')) ok = true; - if ((chars[i] >= 'a') && (chars[i] <= 'f')) ok = true; - if ((offs == 0) && (i == 0) && (chars[i] == '#')) ok = true; - } - if (ok) { - if (charCount != i) { // shift if necessary - chars[charCount] = chars[i]; - } - charCount++; - } - } - super.insertString(offs, new String(chars, 0, charCount), a); - } - } - - } - - + + @Override + public void actionPerformed(ActionEvent e) { + hide(); + } + })); + + box.add(Box.createHorizontalStrut(10)); + + window.getContentPane().add(box, BorderLayout.CENTER); + + window.pack(); + window.setResizable(false); + + window.setLocationRelativeTo(null); + + window.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE); + window.addWindowListener(new WindowAdapter() { + public void windowClosing(WindowEvent e) { + hide(); + } + }); + Toolkit.registerWindowCloseKeys(window.getRootPane(), + new ActionListener() { + public void actionPerformed(ActionEvent actionEvent) { + hide(); + } + }); + + Toolkit.setIcon(window); + + colorListener = new ColorListener(); + hueField.getDocument().addDocumentListener(colorListener); + saturationField.getDocument().addDocumentListener(colorListener); + brightnessField.getDocument().addDocumentListener(colorListener); + redField.getDocument().addDocumentListener(colorListener); + greenField.getDocument().addDocumentListener(colorListener); + blueField.getDocument().addDocumentListener(colorListener); + hexField.getDocument().addDocumentListener(colorListener); + + setColor(initialColor); + } + + public void show() { + window.setVisible(true); + window.setCursor(Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR)); + } + + public void hide() { + window.setVisible(false); + setColor(new Color(Integer.parseInt( + externalHex.getText().substring(0, 2), 16), Integer.parseInt( + externalHex.getText().substring(2, 4), 16), Integer.parseInt( + externalHex.getText().substring(4, 6), 16))); + } + + public Color getColor() { + return new Color(red, green, blue); + } + + public void setColor(Color color) { + updateRGB(color.getRGB()); + } + + public String getHexColor() { + return "#" + PApplet.hex(red, 2) + PApplet.hex(green, 2) + + PApplet.hex(blue, 2); + } + + public class ColorListener implements DocumentListener { + + public void changedUpdate(DocumentEvent e) { + } + + public void removeUpdate(DocumentEvent e) { + } + + boolean updating; + + public void insertUpdate(DocumentEvent e) { + if (updating) + return; // don't update forever recursively + updating = true; + + Document doc = e.getDocument(); + if (doc == hueField.getDocument()) { + hue = bounded(hue, hueField, 359); + updateRGB(); + updateHex(); + + } else if (doc == saturationField.getDocument()) { + saturation = bounded(saturation, saturationField, 99); + updateRGB(); + updateHex(); + + } else if (doc == brightnessField.getDocument()) { + brightness = bounded(brightness, brightnessField, 99); + updateRGB(); + updateHex(); + + } else if (doc == redField.getDocument()) { + red = bounded(red, redField, 255); + updateHSB(); + updateHex(); + + } else if (doc == greenField.getDocument()) { + green = bounded(green, greenField, 255); + updateHSB(); + updateHex(); + + } else if (doc == blueField.getDocument()) { + blue = bounded(blue, blueField, 255); + updateHSB(); + updateHex(); + + } else if (doc == hexField.getDocument()) { + String str = hexField.getText(); + if (str.startsWith("#")) { + str = str.substring(1); + } + while (str.length() < 6) { + str += "0"; + } + if (str.length() > 6) { + str = str.substring(0, 6); + } + updateRGB(Integer.parseInt(str, 16)); + updateHSB(); + } + range.redraw(); + slider.redraw(); + colorPanel.repaint(); + updating = false; + } + } + + /** + * Set the RGB values based on the current HSB values. + */ + protected void updateRGB() { + updateRGB(Color.HSBtoRGB(hue / 359f, saturation / 99f, brightness / 99f)); + } + + /** + * Set the RGB values based on a calculated ARGB int. Used by both + * updateRGB() to set the color from the HSB values, and by updateHex(), to + * unpack the hex colors and assign them. + */ + protected void updateRGB(int rgb) { + red = (rgb >> 16) & 0xff; + green = (rgb >> 8) & 0xff; + blue = rgb & 0xff; + redField.setText(String.valueOf(red)); + greenField.setText(String.valueOf(green)); + blueField.setText(String.valueOf(blue)); + } + + /** + * Set the HSB values based on the current RGB values. + */ + protected void updateHSB() { + float hsb[] = new float[3]; + Color.RGBtoHSB(red, green, blue, hsb); + hue = (int) (hsb[0] * 359.0f); + saturation = (int) (hsb[1] * 99.0f); + brightness = (int) (hsb[2] * 99.0f); + + hueField.setText(String.valueOf(hue)); + saturationField.setText(String.valueOf(saturation)); + brightnessField.setText(String.valueOf(brightness)); + } + + protected void updateHex() { + hexField.setText(getHexColor()); + } + + /** + * Get the bounded value for a specific range. If the value is outside the + * max, you can't edit right away, so just act as if it's already been + * bounded and return the bounded value, then fire an event to set it to the + * value that was just returned. + */ + protected int bounded(int current, final JTextField field, final int max) { + String text = field.getText(); + if (text.length() == 0) { + return 0; + } + try { + int value = Integer.parseInt(text); + if (value > max) { + SwingUtilities.invokeLater(new Runnable() { + public void run() { + field.setText(String.valueOf(max)); + } + }); + return max; + } + return value; + } catch (NumberFormatException e) { + return current; // should not be reachable + } + } + + protected Container createColorFields(String buttonName, + ActionListener buttonListener, String buttonName2, + ActionListener buttonListener2) { + Box box = Box.createVerticalBox(); + box.setAlignmentY(0); + + final int GAP = Base.isWindows() ? 5 : 0; + final int BETWEEN = Base.isWindows() ? 8 : 6; // 10; + + Box row; + + row = Box.createHorizontalBox(); + if (Base.isMacOS()) { + row.add(Box.createHorizontalStrut(17)); + } else { + row.add(createFixedLabel("")); + } + // Can't just set the bg color of the panel because it also tints the + // bevel + // (on OS X), which looks odd. So instead we override paintComponent(). + colorPanel = new JPanel() { + public void paintComponent(Graphics g) { + g.setColor(new Color(red, green, blue)); + Dimension size = getSize(); + g.fillRect(0, 0, size.width, size.height); + } + }; + colorPanel + .setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED)); + Dimension dim = new Dimension(70, 25); + colorPanel.setMinimumSize(dim); + colorPanel.setMaximumSize(dim); + colorPanel.setPreferredSize(dim); + row.add(colorPanel); + row.add(Box.createHorizontalGlue()); + box.add(row); + box.add(Box.createVerticalStrut(BETWEEN)); + + row = Box.createHorizontalBox(); + row.add(createFixedLabel("H")); + row.add(hueField = new NumberField(4, false)); + row.add(new JLabel(" \u00B0")); // degree symbol + row.add(Box.createHorizontalGlue()); + box.add(row); + box.add(Box.createVerticalStrut(GAP)); + + row = Box.createHorizontalBox(); + row.add(createFixedLabel("S")); + row.add(saturationField = new NumberField(4, false)); + row.add(new JLabel(" %")); + row.add(Box.createHorizontalGlue()); + box.add(row); + box.add(Box.createVerticalStrut(GAP)); + + row = Box.createHorizontalBox(); + row.add(createFixedLabel("B")); + row.add(brightnessField = new NumberField(4, false)); + row.add(new JLabel(" %")); + row.add(Box.createHorizontalGlue()); + box.add(row); + box.add(Box.createVerticalStrut(BETWEEN)); + + row = Box.createHorizontalBox(); + row.add(createFixedLabel("R")); + row.add(redField = new NumberField(4, false)); + row.add(Box.createHorizontalGlue()); + box.add(row); + box.add(Box.createVerticalStrut(GAP)); + + row = Box.createHorizontalBox(); + row.add(createFixedLabel("G")); + row.add(greenField = new NumberField(4, false)); + row.add(Box.createHorizontalGlue()); + box.add(row); + box.add(Box.createVerticalStrut(GAP)); + + row = Box.createHorizontalBox(); + row.add(createFixedLabel("B")); + row.add(blueField = new NumberField(4, false)); + row.add(Box.createHorizontalGlue()); + box.add(row); + box.add(Box.createVerticalStrut(BETWEEN)); + + row = Box.createHorizontalBox(); + row.add(createFixedLabel("")); + // Windows needs extra space, OS X and Linux do not + // Mac OS X needs 6 because #CCCCCC is quite wide + final int hexCount = Base.isWindows() ? 7 : 6; + row.add(hexField = new NumberField(hexCount, true)); + row.add(Box.createHorizontalGlue()); + box.add(row); + box.add(Box.createVerticalStrut(GAP)); + + row = Box.createHorizontalBox(); + if (Base.isMacOS()) { + row.add(Box.createHorizontalStrut(11)); + } else { + row.add(createFixedLabel("")); + } + JButton button = new JButton(buttonName); + button.addActionListener(buttonListener); + + row.add(button); + row.add(Box.createHorizontalGlue()); + box.add(row); + + row = Box.createHorizontalBox(); + if (Base.isMacOS()) { + row.add(Box.createHorizontalStrut(11)); + } else { + row.add(createFixedLabel("")); + } + JButton button2 = new JButton(buttonName2); + button2.addActionListener(buttonListener2); + + row.add(button2); + row.add(Box.createHorizontalGlue()); + box.add(row); + + box.add(Box.createVerticalGlue()); + return box; + } + + int labelH; + + /** + * return a label of a fixed width + */ + protected JLabel createFixedLabel(String title) { + JLabel label = new JLabel(title); + if (labelH == 0) { + labelH = label.getPreferredSize().height; + } + Dimension dim = new Dimension(15, labelH); + label.setPreferredSize(dim); + label.setMinimumSize(dim); + label.setMaximumSize(dim); + return label; + } + + public class ColorRange extends PApplet { + + static final int WIDE = 256; + static final int HIGH = 256; + + int lastX, lastY; + + public void setup() { + size(WIDE, HIGH); + noLoop(); + + colorMode(HSB, 360, 256, 256); + noFill(); + rectMode(CENTER); + + loadPixels(); + } + + public void draw() { + + if ((width != WIDE) || (height < HIGH)) { + return; + } + + int index = 0; + for (int j = 0; j < 256; j++) { + for (int i = 0; i < 256; i++) { + pixels[index++] = color(hue, i, 255 - j); + } + } + + updatePixels(); + stroke((brightness > 50) ? 0 : 255); + rect(lastX, lastY, 9, 9); + } + + public void mousePressed() { + updateMouse(); + } + + public void mouseDragged() { + updateMouse(); + } + + public void updateMouse() { + if ((mouseX >= 0) && (mouseX < 256) && (mouseY >= 0) && (mouseY < 256)) { + int nsaturation = (int) (100 * (mouseX / 255.0f)); + int nbrightness = 100 - ((int) (100 * (mouseY / 255.0f))); + saturationField.setText(String.valueOf(nsaturation)); + brightnessField.setText(String.valueOf(nbrightness)); + + lastX = mouseX; + lastY = mouseY; + } + } + + public Dimension getPreferredSize() { + return new Dimension(WIDE, HIGH); + } + + public Dimension getMinimumSize() { + return new Dimension(WIDE, HIGH); + } + + public Dimension getMaximumSize() { + return new Dimension(WIDE, HIGH); + } + + public void keyPressed() { + if (key == ESC) { + CustomColorChooser.this.hide(); + // don't quit out of processing + // http://dev.processing.org/bugs/show_bug.cgi?id=1006 + key = 0; + } + } + } + + public class ColorSlider extends PApplet { + + static final int WIDE = 20; + static final int HIGH = 256; + + public void setup() { + size(WIDE, HIGH); // , P3D); + colorMode(HSB, 255, 100, 100); + noLoop(); + loadPixels(); + } + + public void draw() { + if ((width != WIDE) || (height < HIGH)) { + return; + } + + int index = 0; + int sel = 255 - (int) (255 * (hue / 359f)); + for (int j = 0; j < 256; j++) { + int c = color(255 - j, 100, 100); + if (j == sel) + c = 0xFF000000; + for (int i = 0; i < WIDE; i++) { + g.pixels[index++] = c; + } + } + updatePixels(); + } + + public void mousePressed() { + updateMouse(); + } + + public void mouseDragged() { + updateMouse(); + } + + public void updateMouse() { + if ((mouseX >= 0) && (mouseX < 256) && (mouseY >= 0) && (mouseY < 256)) { + int nhue = 359 - (int) (359 * (mouseY / 255.0f)); + hueField.setText(String.valueOf(nhue)); + } + } + + public Dimension getPreferredSize() { + return new Dimension(WIDE, HIGH); + } + + public Dimension getMinimumSize() { + return new Dimension(WIDE, HIGH); + } + + public Dimension getMaximumSize() { + return new Dimension(WIDE, HIGH); + } + + public void keyPressed() { + if (key == ESC) { + CustomColorChooser.this.hide(); + // don't quit out of processing + // http://dev.processing.org/bugs/show_bug.cgi?id=1006 + key = 0; + } + } + } + + /** + * Extension of JTextField that only allows numbers + */ + class NumberField extends JTextField { + + public boolean allowHex; + + public NumberField(int cols, boolean allowHex) { + super(cols); + this.allowHex = allowHex; + } + + protected Document createDefaultModel() { + return new NumberDocument(this); + } + + public Dimension getPreferredSize() { + if (!allowHex) { + return new Dimension(45, super.getPreferredSize().height); + } + return super.getPreferredSize(); + } + + public Dimension getMinimumSize() { + return getPreferredSize(); + } + + public Dimension getMaximumSize() { + return getPreferredSize(); + } + } + + /** + * Document model to go with JTextField that only allows numbers. + */ + class NumberDocument extends PlainDocument { + + NumberField parentField; + + public NumberDocument(NumberField parentField) { + this.parentField = parentField; + } + + public void insertString(int offs, String str, AttributeSet a) + throws BadLocationException { + + if (str == null) + return; + + char chars[] = str.toCharArray(); + int charCount = 0; + // remove any non-digit chars + for (int i = 0; i < chars.length; i++) { + boolean ok = Character.isDigit(chars[i]); + if (parentField.allowHex) { + if ((chars[i] >= 'A') && (chars[i] <= 'F')) + ok = true; + if ((chars[i] >= 'a') && (chars[i] <= 'f')) + ok = true; + if ((offs == 0) && (i == 0) && (chars[i] == '#')) + ok = true; + } + if (ok) { + if (charCount != i) { // shift if necessary + chars[charCount] = chars[i]; + } + charCount++; + } + } + super.insertString(offs, new String(chars, 0, charCount), a); + } + } + + } + public void sketchbookCallback(File file) { if (file != null) { sketchbookLocationField.setText(file.getAbsolutePath()); @@ -1552,12 +1599,8 @@ public class Preferences { consoleSizeField.setSelectedItem(getInteger("console.font.size")); presentColor.setBackground(Preferences.getColor("run.present.bgcolor")); - presentColorHex.setText(Preferences.get("run.present.bgcolor").substring(1)); - - memoryOverrideBox. - setSelected(getBoolean("run.options.memory")); //$NON-NLS-1$ - memoryField. - setText(get("run.options.memory.maximum")); //$NON-NLS-1$ + presentColorHex + .setText(Preferences.get("run.present.bgcolor").substring(1)); /* if (Base.isMacOS()) { From abf967d2e8e85719ab30ee9609b942c086e2fe78 Mon Sep 17 00:00:00 2001 From: joelmoniz Date: Tue, 3 Jun 2014 23:21:44 +0530 Subject: [PATCH 04/88] Shed a lot of weight, some UI changes Rm CustomColorChooser, add Cancel to ColorChooser, Formatting changes, Removed unnecessary listener, Inerchange preview color and text field. --- app/src/processing/app/ColorChooser.java | 17 + app/src/processing/app/Preferences.java | 695 ++--------------------- 2 files changed, 50 insertions(+), 662 deletions(-) diff --git a/app/src/processing/app/ColorChooser.java b/app/src/processing/app/ColorChooser.java index b4a6ccac8..b261096dd 100644 --- a/app/src/processing/app/ColorChooser.java +++ b/app/src/processing/app/ColorChooser.java @@ -442,6 +442,23 @@ public class ColorChooser { //extends JFrame implements DocumentListener { row.add(Box.createHorizontalGlue()); box.add(row); + row = Box.createHorizontalBox(); + if (Base.isMacOS()) { + row.add(Box.createHorizontalStrut(11)); + } else { + row.add(createFixedLabel("")); + } + button = new JButton("Cancel"); + button.addActionListener(new ActionListener() { + + @Override + public void actionPerformed(ActionEvent e) { + ColorChooser.this.hide(); + } + }); + row.add(button); + row.add(Box.createHorizontalGlue()); + box.add(row); // box.add(Box.createVerticalGlue()); diff --git a/app/src/processing/app/Preferences.java b/app/src/processing/app/Preferences.java index 0266fbae8..cc036c315 100644 --- a/app/src/processing/app/Preferences.java +++ b/app/src/processing/app/Preferences.java @@ -123,6 +123,8 @@ public class Preferences { JComboBox consoleSizeField; JCheckBox inputMethodBox; JCheckBox autoAssociateBox; + + ColorChooser selector; //JRadioButton bitsThirtyTwoButton; //JRadioButton bitsSixtyFourButton; @@ -372,7 +374,8 @@ public class Preferences { // fontSizeField.setSelectedItem(editorFont.getSize()); fontSizeField.setSelectedItem(Preferences.getFont("editor.font.size")); top += d.height + GUI_BETWEEN; - + + Container colorBox = Box.createHorizontalBox(); label = new JLabel("Background color when Presenting: "); @@ -389,7 +392,6 @@ public class Preferences { presentColor.setEnabled(false); presentColor.setBorder(BorderFactory.createLineBorder(Color.BLACK)); presentColor.setBackground(Preferences.getColor("run.present.bgcolor")); - presentColor.setForeground(Preferences.getColor("run.present.bgcolor")); presentColorHex = new JTextField(6); presentColorHex @@ -444,59 +446,44 @@ public class Preferences { } } - @Override - public void changedUpdate(DocumentEvent e) { - } + @Override public void changedUpdate(DocumentEvent e) {} }); - final CustomColorChooser c = new CustomColorChooser( - Preferences.getColor("run.present.bgcolor"), presentColorHex, - presentColor); + selector = new ColorChooser( + dialog, false, Preferences.getColor("run.present.bgcolor"), "OK", new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + String colorValue = selector.getHexColor(); + presentColorHex.setText(colorValue.substring(1)); + presentColor.setBackground(new Color(Integer.parseInt( + colorValue.substring(1, 3), 16), Integer.parseInt( + colorValue.substring(3, 5), 16), Integer.parseInt( + colorValue.substring(5, 7), 16))); + selector.hide(); + } + }); presentColor.addMouseListener(new MouseListener() { - - @Override - public void mouseReleased(MouseEvent e) { - } - - @Override - public void mousePressed(MouseEvent e) { - } - - @Override - public void mouseExited(MouseEvent e) { - } - - @Override - public void mouseEntered(MouseEvent e) { - } + @Override public void mouseReleased(MouseEvent e) {} + @Override public void mousePressed(MouseEvent e) {} + @Override public void mouseExited(MouseEvent e) {} + @Override public void mouseEntered(MouseEvent e) {} @Override public void mouseClicked(MouseEvent e) { - c.show(); + selector.show(); } }); - presentColorHex.addInputMethodListener(new InputMethodListener() { - - @Override - public void inputMethodTextChanged(InputMethodEvent event) { - } - - @Override - public void caretPositionChanged(InputMethodEvent event) { - } - }); - - colorBox.add(presentColor); - - colorBox.add(Box.createHorizontalStrut(GUI_SMALL)); - label = new JLabel("#"); colorBox.add(label); colorBox.add(presentColorHex); + colorBox.add(Box.createHorizontalStrut(GUI_SMALL)); + + colorBox.add(presentColor); + pain.add(colorBox); d = colorBox.getPreferredSize(); colorBox.setBounds(left, top, d.width, d.height); @@ -768,626 +755,6 @@ public class Preferences { }); } - private class CustomColorChooser { - - int hue, saturation, brightness; // range 360, 100, 100 - int red, green, blue; // range 256, 256, 256 - - ColorRange range; - ColorSlider slider; - - JTextField hueField, saturationField, brightnessField; - JTextField redField, greenField, blueField; - - JTextField hexField; - - JPanel colorPanel; - DocumentListener colorListener; - - JDialog window; - - JTextField externalHex, externalColor; - - public CustomColorChooser(Color initialColor, final JTextField externalHex, - final JTextField externalColor) { - Frame owner = null; - this.externalHex = externalHex; - this.externalColor = externalColor; - window = new JDialog(owner, "Choose the background color for Present", - true); - window.getContentPane().setLayout(new BorderLayout()); - Box box = Box.createHorizontalBox(); - box.setBorder(new EmptyBorder(12, 12, 12, 12)); - - range = new ColorRange(); - range.init(); - Box rangeBox = new Box(BoxLayout.Y_AXIS); - rangeBox.setAlignmentY(0); - rangeBox.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED)); - rangeBox.add(range); - box.add(rangeBox); - box.add(Box.createHorizontalStrut(10)); - - slider = new ColorSlider(); - slider.init(); - Box sliderBox = new Box(BoxLayout.Y_AXIS); - sliderBox.setAlignmentY(0); - sliderBox.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED)); - sliderBox.add(slider); - box.add(sliderBox); - box.add(Box.createHorizontalStrut(10)); - - box.add(createColorFields(PROMPT_OK, new ActionListener() { - - @Override - public void actionPerformed(ActionEvent e) { - externalHex.setText(getHexColor().substring(1)); - externalColor.setBackground(getColor()); - hide(); - } - }, PROMPT_CANCEL, new ActionListener() { - - @Override - public void actionPerformed(ActionEvent e) { - hide(); - } - })); - - box.add(Box.createHorizontalStrut(10)); - - window.getContentPane().add(box, BorderLayout.CENTER); - - window.pack(); - window.setResizable(false); - - window.setLocationRelativeTo(null); - - window.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE); - window.addWindowListener(new WindowAdapter() { - public void windowClosing(WindowEvent e) { - hide(); - } - }); - Toolkit.registerWindowCloseKeys(window.getRootPane(), - new ActionListener() { - public void actionPerformed(ActionEvent actionEvent) { - hide(); - } - }); - - Toolkit.setIcon(window); - - colorListener = new ColorListener(); - hueField.getDocument().addDocumentListener(colorListener); - saturationField.getDocument().addDocumentListener(colorListener); - brightnessField.getDocument().addDocumentListener(colorListener); - redField.getDocument().addDocumentListener(colorListener); - greenField.getDocument().addDocumentListener(colorListener); - blueField.getDocument().addDocumentListener(colorListener); - hexField.getDocument().addDocumentListener(colorListener); - - setColor(initialColor); - } - - public void show() { - window.setVisible(true); - window.setCursor(Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR)); - } - - public void hide() { - window.setVisible(false); - setColor(new Color(Integer.parseInt( - externalHex.getText().substring(0, 2), 16), Integer.parseInt( - externalHex.getText().substring(2, 4), 16), Integer.parseInt( - externalHex.getText().substring(4, 6), 16))); - } - - public Color getColor() { - return new Color(red, green, blue); - } - - public void setColor(Color color) { - updateRGB(color.getRGB()); - } - - public String getHexColor() { - return "#" + PApplet.hex(red, 2) + PApplet.hex(green, 2) - + PApplet.hex(blue, 2); - } - - public class ColorListener implements DocumentListener { - - public void changedUpdate(DocumentEvent e) { - } - - public void removeUpdate(DocumentEvent e) { - } - - boolean updating; - - public void insertUpdate(DocumentEvent e) { - if (updating) - return; // don't update forever recursively - updating = true; - - Document doc = e.getDocument(); - if (doc == hueField.getDocument()) { - hue = bounded(hue, hueField, 359); - updateRGB(); - updateHex(); - - } else if (doc == saturationField.getDocument()) { - saturation = bounded(saturation, saturationField, 99); - updateRGB(); - updateHex(); - - } else if (doc == brightnessField.getDocument()) { - brightness = bounded(brightness, brightnessField, 99); - updateRGB(); - updateHex(); - - } else if (doc == redField.getDocument()) { - red = bounded(red, redField, 255); - updateHSB(); - updateHex(); - - } else if (doc == greenField.getDocument()) { - green = bounded(green, greenField, 255); - updateHSB(); - updateHex(); - - } else if (doc == blueField.getDocument()) { - blue = bounded(blue, blueField, 255); - updateHSB(); - updateHex(); - - } else if (doc == hexField.getDocument()) { - String str = hexField.getText(); - if (str.startsWith("#")) { - str = str.substring(1); - } - while (str.length() < 6) { - str += "0"; - } - if (str.length() > 6) { - str = str.substring(0, 6); - } - updateRGB(Integer.parseInt(str, 16)); - updateHSB(); - } - range.redraw(); - slider.redraw(); - colorPanel.repaint(); - updating = false; - } - } - - /** - * Set the RGB values based on the current HSB values. - */ - protected void updateRGB() { - updateRGB(Color.HSBtoRGB(hue / 359f, saturation / 99f, brightness / 99f)); - } - - /** - * Set the RGB values based on a calculated ARGB int. Used by both - * updateRGB() to set the color from the HSB values, and by updateHex(), to - * unpack the hex colors and assign them. - */ - protected void updateRGB(int rgb) { - red = (rgb >> 16) & 0xff; - green = (rgb >> 8) & 0xff; - blue = rgb & 0xff; - redField.setText(String.valueOf(red)); - greenField.setText(String.valueOf(green)); - blueField.setText(String.valueOf(blue)); - } - - /** - * Set the HSB values based on the current RGB values. - */ - protected void updateHSB() { - float hsb[] = new float[3]; - Color.RGBtoHSB(red, green, blue, hsb); - hue = (int) (hsb[0] * 359.0f); - saturation = (int) (hsb[1] * 99.0f); - brightness = (int) (hsb[2] * 99.0f); - - hueField.setText(String.valueOf(hue)); - saturationField.setText(String.valueOf(saturation)); - brightnessField.setText(String.valueOf(brightness)); - } - - protected void updateHex() { - hexField.setText(getHexColor()); - } - - /** - * Get the bounded value for a specific range. If the value is outside the - * max, you can't edit right away, so just act as if it's already been - * bounded and return the bounded value, then fire an event to set it to the - * value that was just returned. - */ - protected int bounded(int current, final JTextField field, final int max) { - String text = field.getText(); - if (text.length() == 0) { - return 0; - } - try { - int value = Integer.parseInt(text); - if (value > max) { - SwingUtilities.invokeLater(new Runnable() { - public void run() { - field.setText(String.valueOf(max)); - } - }); - return max; - } - return value; - } catch (NumberFormatException e) { - return current; // should not be reachable - } - } - - protected Container createColorFields(String buttonName, - ActionListener buttonListener, String buttonName2, - ActionListener buttonListener2) { - Box box = Box.createVerticalBox(); - box.setAlignmentY(0); - - final int GAP = Base.isWindows() ? 5 : 0; - final int BETWEEN = Base.isWindows() ? 8 : 6; // 10; - - Box row; - - row = Box.createHorizontalBox(); - if (Base.isMacOS()) { - row.add(Box.createHorizontalStrut(17)); - } else { - row.add(createFixedLabel("")); - } - // Can't just set the bg color of the panel because it also tints the - // bevel - // (on OS X), which looks odd. So instead we override paintComponent(). - colorPanel = new JPanel() { - public void paintComponent(Graphics g) { - g.setColor(new Color(red, green, blue)); - Dimension size = getSize(); - g.fillRect(0, 0, size.width, size.height); - } - }; - colorPanel - .setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED)); - Dimension dim = new Dimension(70, 25); - colorPanel.setMinimumSize(dim); - colorPanel.setMaximumSize(dim); - colorPanel.setPreferredSize(dim); - row.add(colorPanel); - row.add(Box.createHorizontalGlue()); - box.add(row); - box.add(Box.createVerticalStrut(BETWEEN)); - - row = Box.createHorizontalBox(); - row.add(createFixedLabel("H")); - row.add(hueField = new NumberField(4, false)); - row.add(new JLabel(" \u00B0")); // degree symbol - row.add(Box.createHorizontalGlue()); - box.add(row); - box.add(Box.createVerticalStrut(GAP)); - - row = Box.createHorizontalBox(); - row.add(createFixedLabel("S")); - row.add(saturationField = new NumberField(4, false)); - row.add(new JLabel(" %")); - row.add(Box.createHorizontalGlue()); - box.add(row); - box.add(Box.createVerticalStrut(GAP)); - - row = Box.createHorizontalBox(); - row.add(createFixedLabel("B")); - row.add(brightnessField = new NumberField(4, false)); - row.add(new JLabel(" %")); - row.add(Box.createHorizontalGlue()); - box.add(row); - box.add(Box.createVerticalStrut(BETWEEN)); - - row = Box.createHorizontalBox(); - row.add(createFixedLabel("R")); - row.add(redField = new NumberField(4, false)); - row.add(Box.createHorizontalGlue()); - box.add(row); - box.add(Box.createVerticalStrut(GAP)); - - row = Box.createHorizontalBox(); - row.add(createFixedLabel("G")); - row.add(greenField = new NumberField(4, false)); - row.add(Box.createHorizontalGlue()); - box.add(row); - box.add(Box.createVerticalStrut(GAP)); - - row = Box.createHorizontalBox(); - row.add(createFixedLabel("B")); - row.add(blueField = new NumberField(4, false)); - row.add(Box.createHorizontalGlue()); - box.add(row); - box.add(Box.createVerticalStrut(BETWEEN)); - - row = Box.createHorizontalBox(); - row.add(createFixedLabel("")); - // Windows needs extra space, OS X and Linux do not - // Mac OS X needs 6 because #CCCCCC is quite wide - final int hexCount = Base.isWindows() ? 7 : 6; - row.add(hexField = new NumberField(hexCount, true)); - row.add(Box.createHorizontalGlue()); - box.add(row); - box.add(Box.createVerticalStrut(GAP)); - - row = Box.createHorizontalBox(); - if (Base.isMacOS()) { - row.add(Box.createHorizontalStrut(11)); - } else { - row.add(createFixedLabel("")); - } - JButton button = new JButton(buttonName); - button.addActionListener(buttonListener); - - row.add(button); - row.add(Box.createHorizontalGlue()); - box.add(row); - - row = Box.createHorizontalBox(); - if (Base.isMacOS()) { - row.add(Box.createHorizontalStrut(11)); - } else { - row.add(createFixedLabel("")); - } - JButton button2 = new JButton(buttonName2); - button2.addActionListener(buttonListener2); - - row.add(button2); - row.add(Box.createHorizontalGlue()); - box.add(row); - - box.add(Box.createVerticalGlue()); - return box; - } - - int labelH; - - /** - * return a label of a fixed width - */ - protected JLabel createFixedLabel(String title) { - JLabel label = new JLabel(title); - if (labelH == 0) { - labelH = label.getPreferredSize().height; - } - Dimension dim = new Dimension(15, labelH); - label.setPreferredSize(dim); - label.setMinimumSize(dim); - label.setMaximumSize(dim); - return label; - } - - public class ColorRange extends PApplet { - - static final int WIDE = 256; - static final int HIGH = 256; - - int lastX, lastY; - - public void setup() { - size(WIDE, HIGH); - noLoop(); - - colorMode(HSB, 360, 256, 256); - noFill(); - rectMode(CENTER); - - loadPixels(); - } - - public void draw() { - - if ((width != WIDE) || (height < HIGH)) { - return; - } - - int index = 0; - for (int j = 0; j < 256; j++) { - for (int i = 0; i < 256; i++) { - pixels[index++] = color(hue, i, 255 - j); - } - } - - updatePixels(); - stroke((brightness > 50) ? 0 : 255); - rect(lastX, lastY, 9, 9); - } - - public void mousePressed() { - updateMouse(); - } - - public void mouseDragged() { - updateMouse(); - } - - public void updateMouse() { - if ((mouseX >= 0) && (mouseX < 256) && (mouseY >= 0) && (mouseY < 256)) { - int nsaturation = (int) (100 * (mouseX / 255.0f)); - int nbrightness = 100 - ((int) (100 * (mouseY / 255.0f))); - saturationField.setText(String.valueOf(nsaturation)); - brightnessField.setText(String.valueOf(nbrightness)); - - lastX = mouseX; - lastY = mouseY; - } - } - - public Dimension getPreferredSize() { - return new Dimension(WIDE, HIGH); - } - - public Dimension getMinimumSize() { - return new Dimension(WIDE, HIGH); - } - - public Dimension getMaximumSize() { - return new Dimension(WIDE, HIGH); - } - - public void keyPressed() { - if (key == ESC) { - CustomColorChooser.this.hide(); - // don't quit out of processing - // http://dev.processing.org/bugs/show_bug.cgi?id=1006 - key = 0; - } - } - } - - public class ColorSlider extends PApplet { - - static final int WIDE = 20; - static final int HIGH = 256; - - public void setup() { - size(WIDE, HIGH); // , P3D); - colorMode(HSB, 255, 100, 100); - noLoop(); - loadPixels(); - } - - public void draw() { - if ((width != WIDE) || (height < HIGH)) { - return; - } - - int index = 0; - int sel = 255 - (int) (255 * (hue / 359f)); - for (int j = 0; j < 256; j++) { - int c = color(255 - j, 100, 100); - if (j == sel) - c = 0xFF000000; - for (int i = 0; i < WIDE; i++) { - g.pixels[index++] = c; - } - } - updatePixels(); - } - - public void mousePressed() { - updateMouse(); - } - - public void mouseDragged() { - updateMouse(); - } - - public void updateMouse() { - if ((mouseX >= 0) && (mouseX < 256) && (mouseY >= 0) && (mouseY < 256)) { - int nhue = 359 - (int) (359 * (mouseY / 255.0f)); - hueField.setText(String.valueOf(nhue)); - } - } - - public Dimension getPreferredSize() { - return new Dimension(WIDE, HIGH); - } - - public Dimension getMinimumSize() { - return new Dimension(WIDE, HIGH); - } - - public Dimension getMaximumSize() { - return new Dimension(WIDE, HIGH); - } - - public void keyPressed() { - if (key == ESC) { - CustomColorChooser.this.hide(); - // don't quit out of processing - // http://dev.processing.org/bugs/show_bug.cgi?id=1006 - key = 0; - } - } - } - - /** - * Extension of JTextField that only allows numbers - */ - class NumberField extends JTextField { - - public boolean allowHex; - - public NumberField(int cols, boolean allowHex) { - super(cols); - this.allowHex = allowHex; - } - - protected Document createDefaultModel() { - return new NumberDocument(this); - } - - public Dimension getPreferredSize() { - if (!allowHex) { - return new Dimension(45, super.getPreferredSize().height); - } - return super.getPreferredSize(); - } - - public Dimension getMinimumSize() { - return getPreferredSize(); - } - - public Dimension getMaximumSize() { - return getPreferredSize(); - } - } - - /** - * Document model to go with JTextField that only allows numbers. - */ - class NumberDocument extends PlainDocument { - - NumberField parentField; - - public NumberDocument(NumberField parentField) { - this.parentField = parentField; - } - - public void insertString(int offs, String str, AttributeSet a) - throws BadLocationException { - - if (str == null) - return; - - char chars[] = str.toCharArray(); - int charCount = 0; - // remove any non-digit chars - for (int i = 0; i < chars.length; i++) { - boolean ok = Character.isDigit(chars[i]); - if (parentField.allowHex) { - if ((chars[i] >= 'A') && (chars[i] <= 'F')) - ok = true; - if ((chars[i] >= 'a') && (chars[i] <= 'f')) - ok = true; - if ((offs == 0) && (i == 0) && (chars[i] == '#')) - ok = true; - } - if (ok) { - if (charCount != i) { // shift if necessary - chars[charCount] = chars[i]; - } - charCount++; - } - } - super.insertString(offs, new String(chars, 0, charCount), a); - } - } - - } public void sketchbookCallback(File file) { if (file != null) { @@ -1599,8 +966,12 @@ public class Preferences { consoleSizeField.setSelectedItem(getInteger("console.font.size")); presentColor.setBackground(Preferences.getColor("run.present.bgcolor")); - presentColorHex - .setText(Preferences.get("run.present.bgcolor").substring(1)); + presentColorHex.setText(Preferences.get("run.present.bgcolor").substring(1)); + + memoryOverrideBox. + setSelected(getBoolean("run.options.memory")); //$NON-NLS-1$ + memoryField. + setText(get("run.options.memory.maximum")); //$NON-NLS-1$ /* if (Base.isMacOS()) { From 0e7e40e3c414350484b88dfa1b55ba69ecec967a Mon Sep 17 00:00:00 2001 From: joelmoniz Date: Sat, 7 Jun 2014 01:01:38 +0530 Subject: [PATCH 05/88] Done adding Present bckgrnd color to Prefs window Cursor to hand on mouseover & new border for color preview --- app/src/processing/app/Preferences.java | 48 +++++++++++++++---------- 1 file changed, 29 insertions(+), 19 deletions(-) diff --git a/app/src/processing/app/Preferences.java b/app/src/processing/app/Preferences.java index cc036c315..6cf702a76 100644 --- a/app/src/processing/app/Preferences.java +++ b/app/src/processing/app/Preferences.java @@ -30,7 +30,6 @@ import java.util.*; import javax.swing.*; import javax.swing.border.*; import javax.swing.event.*; -import javax.swing.text.*; import processing.core.*; @@ -390,7 +389,9 @@ public class Preferences { presentColor = new JTextField(" "); presentColor.setOpaque(true); presentColor.setEnabled(false); - presentColor.setBorder(BorderFactory.createLineBorder(Color.BLACK)); + presentColor.setBorder(new CompoundBorder(BorderFactory.createMatteBorder( + 1, 1, 0, 0, new Color(195, 195, 195)), BorderFactory.createMatteBorder( + 0, 0, 1, 1, new Color(54, 54, 54)))); presentColor.setBackground(Preferences.getColor("run.present.bgcolor")); presentColorHex = new JTextField(6); @@ -449,25 +450,34 @@ public class Preferences { @Override public void changedUpdate(DocumentEvent e) {} }); - selector = new ColorChooser( - dialog, false, Preferences.getColor("run.present.bgcolor"), "OK", new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - String colorValue = selector.getHexColor(); - presentColorHex.setText(colorValue.substring(1)); - presentColor.setBackground(new Color(Integer.parseInt( - colorValue.substring(1, 3), 16), Integer.parseInt( - colorValue.substring(3, 5), 16), Integer.parseInt( - colorValue.substring(5, 7), 16))); - selector.hide(); - } - }); + selector = new ColorChooser(dialog, false, + Preferences.getColor("run.present.bgcolor"), "OK", + new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + String colorValue = selector.getHexColor(); + presentColorHex.setText(colorValue.substring(1)); + presentColor.setBackground(new Color(Integer.parseInt( + colorValue.substring(1, 3), 16), Integer.parseInt( + colorValue.substring(3, 5), 16), Integer.parseInt( + colorValue.substring(5, 7), 16))); + selector.hide(); + } + }); presentColor.addMouseListener(new MouseListener() { @Override public void mouseReleased(MouseEvent e) {} @Override public void mousePressed(MouseEvent e) {} - @Override public void mouseExited(MouseEvent e) {} - @Override public void mouseEntered(MouseEvent e) {} + + @Override + public void mouseExited(MouseEvent e) { + dialog.setCursor(Cursor.DEFAULT_CURSOR); + } + + @Override + public void mouseEntered(MouseEvent e) { + dialog.setCursor(Cursor.HAND_CURSOR); + } @Override public void mouseClicked(MouseEvent e) { @@ -480,10 +490,10 @@ public class Preferences { colorBox.add(presentColorHex); - colorBox.add(Box.createHorizontalStrut(GUI_SMALL)); + colorBox.add(Box.createHorizontalStrut(GUI_SMALL + 2 / 3 * GUI_SMALL)); colorBox.add(presentColor); - + pain.add(colorBox); d = colorBox.getPreferredSize(); colorBox.setBounds(left, top, d.width, d.height); From dd3de15d315f7ba77194cad1c37d69c5d28e4944 Mon Sep 17 00:00:00 2001 From: Jonathan Feinberg Date: Sun, 8 Jun 2014 22:27:26 -0400 Subject: [PATCH 06/88] Permit modes to enhance the text editor by adding their own typographical effects to the Painter. This permits Python mode to draw an indentation indicator, which is common in Python editors. --- app/src/processing/app/syntax/JEditTextArea.java | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/app/src/processing/app/syntax/JEditTextArea.java b/app/src/processing/app/syntax/JEditTextArea.java index de7eb16ce..221218d46 100644 --- a/app/src/processing/app/syntax/JEditTextArea.java +++ b/app/src/processing/app/syntax/JEditTextArea.java @@ -103,7 +103,7 @@ public class JEditTextArea extends JComponent } // Initialize some misc. stuff - painter = new TextAreaPainter(this, defaults); + painter = createPainter(defaults); documentHandler = new DocumentHandler(); eventListenerList = new EventListenerList(); caretEvent = new MutableCaretEvent(); @@ -176,6 +176,16 @@ public class JEditTextArea extends JComponent } + /** + * Override this to provide your own painter for this {@link JEditTextArea}. + * @param defaults + * @return a newly constructed {@link TextAreaPainter}. + */ + protected TextAreaPainter createPainter(final TextAreaDefaults defaults) { + return new TextAreaPainter(this, defaults); + } + + /** * Inline Input Method Support for Japanese. */ From adb82212627146f0f77b66b999c60c4514164cbb Mon Sep 17 00:00:00 2001 From: Kyle Feuz Date: Tue, 10 Jun 2014 01:01:37 -0700 Subject: [PATCH 07/88] Fixes Issue #2534 by setting the Application name for Linux --- .../processing/app/platform/LinuxPlatform.java | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/app/src/processing/app/platform/LinuxPlatform.java b/app/src/processing/app/platform/LinuxPlatform.java index 8e9ee7c71..8360cc49a 100644 --- a/app/src/processing/app/platform/LinuxPlatform.java +++ b/app/src/processing/app/platform/LinuxPlatform.java @@ -23,6 +23,7 @@ package processing.app.platform; import java.io.File; +import java.awt.Toolkit; import processing.app.Base; import processing.app.Platform; @@ -47,6 +48,20 @@ public class LinuxPlatform extends Platform { "placement. For more background, please read the wiki:\n" + "http://wiki.processing.org/w/Supported_Platforms#Linux", null); } + //Set x11 WM_CLASS property which is + //used as the application name by Gnome3 + //and other window managers + try{ + Toolkit xToolkit = Toolkit.getDefaultToolkit(); + java.lang.reflect.Field awtAppClassNameField = + xToolkit.getClass().getDeclaredField("awtAppClassName"); + awtAppClassNameField.setAccessible(true); + awtAppClassNameField.set(xToolkit, "Processing"); + } + catch(Exception e){ + //In case the implementation details change... + e.printStackTrace(); + } } From 45c9c94ce38e7d8cc00b509a5e81f3fd3d4d4024 Mon Sep 17 00:00:00 2001 From: Joel Moniz Date: Tue, 17 Jun 2014 17:14:47 +0530 Subject: [PATCH 08/88] Line coloring is now proper for filtered contribs Both when comboBox and filterFields are used --- .../processing/app/contrib/ContributionManagerDialog.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/app/src/processing/app/contrib/ContributionManagerDialog.java b/app/src/processing/app/contrib/ContributionManagerDialog.java index 6cbe3b888..a33fdf764 100644 --- a/app/src/processing/app/contrib/ContributionManagerDialog.java +++ b/app/src/processing/app/contrib/ContributionManagerDialog.java @@ -106,7 +106,7 @@ public class ContributionManagerDialog { status.setErrorMessage("Connection timed out while " + "downloading the contribution list."); } else { - status.setErrorMessage("Could not download the list" + + status.setErrorMessage("Could not download the list " + "of available contributions."); } exception.printStackTrace(); @@ -163,6 +163,7 @@ public class ContributionManagerDialog { category = null; } filterLibraries(category, filterField.filters); + contributionListPanel.updateColors(); } }); @@ -419,6 +420,8 @@ public class ContributionManagerDialog { filter = filter.replaceAll("[^\\x30-\\x39^\\x61-\\x7a^\\x3a]", " "); filters = Arrays.asList(filter.split(" ")); filterLibraries(category, filters); + + contributionListPanel.updateColors(); } public String getFilterText() { From b1fd7f330db216beae4450eecc86e1df78cfd40a Mon Sep 17 00:00:00 2001 From: Joel Moniz Date: Mon, 23 Jun 2014 11:29:28 +0530 Subject: [PATCH 09/88] Props file no longer overwritten with contribs.txt Unless something isn't right, in which case only that field is overwritten in properties --- .../app/contrib/AvailableContribution.java | 81 ++++++++++++++++--- 1 file changed, 69 insertions(+), 12 deletions(-) diff --git a/app/src/processing/app/contrib/AvailableContribution.java b/app/src/processing/app/contrib/AvailableContribution.java index a815ab6da..f2d3efe65 100644 --- a/app/src/processing/app/contrib/AvailableContribution.java +++ b/app/src/processing/app/contrib/AvailableContribution.java @@ -23,6 +23,7 @@ package processing.app.contrib; import java.io.*; import java.util.HashMap; +import java.util.List; import processing.app.Base; import processing.app.Editor; @@ -179,26 +180,82 @@ class AvailableContribution extends Contribution { /** - * We overwrite the properties file with the curated version from the - * Processing site. This ensures that things have been cleaned up (for - * instance, that the "sentence" is really a sentence) and that bad data - * from the contrib's .properties file doesn't break the manager. + * We overwrite those fields that aren't proper in the properties file with + * the curated version from the Processing site. This ensures that things have + * been cleaned up (for instance, that the "sentence" is really a sentence) + * and that bad data from the contrib's .properties file doesn't break the + * manager. However, it also ensures that valid fields in the properties file + * aren't overwritten, since the properties file may be more recent than the + * contributions.txt file. + * * @param propFile * @return */ public boolean writePropertiesFile(File propFile) { try { + + HashMap properties = Base.readSettings(propFile); + + String name = properties.get("name"); + if (name == null || name.isEmpty()) + name = getName(); + + String category; + List categoryList = parseCategories(properties.get("category")); + if (categoryList.size() == 1 && categoryList.get(0).equals("Unknown")) + category = getCategoryStr(); + else { + StringBuilder sb = new StringBuilder(); + for (String cat : categories) { + sb.append(cat); + sb.append(','); + } + sb.deleteCharAt(sb.length() - 1); + category = sb.toString(); + } + + String authorList = properties.get("authorList"); + if (authorList == null || authorList.isEmpty()) + authorList = getAuthorList(); + + String url = properties.get("url"); + if (url == null || url.isEmpty()) + url = getUrl(); + + String sentence = properties.get("sentence"); + if (sentence == null || sentence.isEmpty()) + sentence = getSentence(); + + String paragraph = properties.get("paragraph"); + if (paragraph == null || paragraph.isEmpty()) + paragraph = getParagraph(); + + int version; + try { + version = Integer.parseInt(properties.get("version")); + } catch (NumberFormatException e) { + version = getVersion(); + System.err.println("The version number for the “" + name + + "” library is not set properly."); + System.err + .println("Please contact the library author to fix it according to the guidelines."); + } + + String prettyVersion = properties.get("prettyVersion"); + if (prettyVersion == null || prettyVersion.isEmpty()) + prettyVersion = getPrettyVersion(); + if (propFile.delete() && propFile.createNewFile() && propFile.setWritable(true)) { PrintWriter writer = PApplet.createWriter(propFile); - writer.println("name=" + getName()); - writer.println("category=" + getCategoryStr()); - writer.println("authorList=" + getAuthorList()); - writer.println("url=" + getUrl()); - writer.println("sentence=" + getSentence()); - writer.println("paragraph=" + getParagraph()); - writer.println("version=" + getVersion()); - writer.println("prettyVersion=" + getPrettyVersion()); + writer.println("name=" + name); + writer.println("category=" + category); + writer.println("authorList=" + authorList); + writer.println("url=" + url); + writer.println("sentence=" + sentence); + writer.println("paragraph=" + paragraph); + writer.println("version=" + version); + writer.println("prettyVersion=" + prettyVersion); writer.flush(); writer.close(); From 309a5eb0ae50a3c3bad8bae9eb6935b1b4ec25df Mon Sep 17 00:00:00 2001 From: josh giesbrecht Date: Tue, 24 Jun 2014 08:21:26 -0700 Subject: [PATCH 10/88] fixed launch4j config for windows build --- build/windows/config-cmd.xml | 2 +- build/windows/config.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/build/windows/config-cmd.xml b/build/windows/config-cmd.xml index 7cd313d08..607d545c5 100755 --- a/build/windows/config-cmd.xml +++ b/build/windows/config-cmd.xml @@ -35,7 +35,7 @@ 1.7.0_40 - 256m + 256 An error occurred while starting the application. diff --git a/build/windows/config.xml b/build/windows/config.xml index 197e63680..1ff09ff00 100755 --- a/build/windows/config.xml +++ b/build/windows/config.xml @@ -35,7 +35,7 @@ 1.7.0_40 - 256m + 256 about.bmp From 08fcd1923a1b4e3d214112d07dc83bc9d695da1f Mon Sep 17 00:00:00 2001 From: Joel Moniz Date: Tue, 24 Jun 2014 23:59:38 +0530 Subject: [PATCH 11/88] Stage 1 complete: at least update manager opens --- app/src/processing/app/UpdateCheck.java | 11 +++---- .../app/contrib/ContributionListing.java | 29 +++++++++++++++++++ .../contrib/ContributionManagerDialog.java | 4 +++ 3 files changed, 39 insertions(+), 5 deletions(-) diff --git a/app/src/processing/app/UpdateCheck.java b/app/src/processing/app/UpdateCheck.java index fe98fab2b..fad5f4c59 100644 --- a/app/src/processing/app/UpdateCheck.java +++ b/app/src/processing/app/UpdateCheck.java @@ -50,7 +50,7 @@ public class UpdateCheck { Base base; String downloadURL = "http://processing.org/download/latest.txt"; - static final long ONE_DAY = 24 * 60 * 60 * 1000; + static final long ONE_DAY = 0;//24 * 60 * 60 * 1000; public UpdateCheck(Base base) { @@ -58,7 +58,7 @@ public class UpdateCheck { new Thread(new Runnable() { public void run() { try { - Thread.sleep(30 * 1000); // give the PDE time to get rolling + Thread.sleep(10 * 1000); // give the PDE time to get rolling updateCheck(); } catch (Exception e) { // this can safely be ignored, too many instances where no net @@ -122,13 +122,14 @@ public class UpdateCheck { if (offerToUpdateContributions) { // Wait for xml file to be downloaded and updates to come in. // (this should really be handled better). + base.rebuildContribModes(); Thread.sleep(5 * 1000); if ((!base.libraryManagerFrame.hasAlreadyBeenOpened() && - base.libraryManagerFrame.hasUpdates()) || + base.libraryManagerFrame.hasUpdates(base)) || (!base.toolManagerFrame.hasAlreadyBeenOpened() && - base.toolManagerFrame.hasUpdates()) || + base.toolManagerFrame.hasUpdates(base)) || (!base.modeManagerFrame.hasAlreadyBeenOpened() && - base.modeManagerFrame.hasUpdates())) { + base.modeManagerFrame.hasUpdates(base))) { promptToOpenContributionManager(); } } diff --git a/app/src/processing/app/contrib/ContributionListing.java b/app/src/processing/app/contrib/ContributionListing.java index 05531f63d..bd05f5cba 100644 --- a/app/src/processing/app/contrib/ContributionListing.java +++ b/app/src/processing/app/contrib/ContributionListing.java @@ -27,6 +27,8 @@ import java.util.*; import java.util.concurrent.locks.ReentrantLock; import processing.app.Base; +import processing.app.Editor; +import processing.app.Library; import processing.core.PApplet; @@ -379,14 +381,41 @@ public class ContributionListing { } return false; } + + boolean hasUpdates(Base base) { + System.out.println("here321"); + try { + System.out.println((base/*.getModeContribs()*/==null) ? "Null :(" : "what?!"); + } + catch (Exception e) + { + e.printStackTrace(); + } + System.out.println("Here too?!"); + for (ModeContribution m : base.getModeContribs()) + if (m.isInstalled()) { + System.out.println(m.getName()); + Contribution advertised = getAvailableContribution(m); + if (advertised == null) { + } + else { + System.out.println("Here2"); + if (advertised.getVersion() > m.getVersion()) + return true; + } + } + return false; + } boolean hasUpdates(Contribution contribution) { if (contribution.isInstalled()) { + System.out.println("Here"); Contribution advertised = getAvailableContribution(contribution); if (advertised == null) { return false; } + System.out.println("Here2"); return advertised.getVersion() > contribution.getVersion(); } return false; diff --git a/app/src/processing/app/contrib/ContributionManagerDialog.java b/app/src/processing/app/contrib/ContributionManagerDialog.java index 6cbe3b888..bc534faa9 100644 --- a/app/src/processing/app/contrib/ContributionManagerDialog.java +++ b/app/src/processing/app/contrib/ContributionManagerDialog.java @@ -74,6 +74,10 @@ public class ContributionManagerDialog { } + public boolean hasUpdates(Base base) { + return contribListing.hasUpdates(base); + } + public void showFrame(Editor editor) { this.editor = editor; From fa3df074394e8dfb556f9866fdfebb096167e15b Mon Sep 17 00:00:00 2001 From: Joel Moniz Date: Wed, 25 Jun 2014 13:20:00 +0530 Subject: [PATCH 12/88] Update Manager now displays on startup of Processing --- app/src/processing/app/UpdateCheck.java | 5 ++- .../app/contrib/ContributionListing.java | 31 +++++-------------- 2 files changed, 10 insertions(+), 26 deletions(-) diff --git a/app/src/processing/app/UpdateCheck.java b/app/src/processing/app/UpdateCheck.java index fad5f4c59..c1a3cb4d5 100644 --- a/app/src/processing/app/UpdateCheck.java +++ b/app/src/processing/app/UpdateCheck.java @@ -50,7 +50,7 @@ public class UpdateCheck { Base base; String downloadURL = "http://processing.org/download/latest.txt"; - static final long ONE_DAY = 0;//24 * 60 * 60 * 1000; + static final long ONE_DAY = 24 * 60 * 60 * 1000; public UpdateCheck(Base base) { @@ -58,7 +58,7 @@ public class UpdateCheck { new Thread(new Runnable() { public void run() { try { - Thread.sleep(10 * 1000); // give the PDE time to get rolling + Thread.sleep(20 * 1000); // give the PDE time to get rolling updateCheck(); } catch (Exception e) { // this can safely be ignored, too many instances where no net @@ -122,7 +122,6 @@ public class UpdateCheck { if (offerToUpdateContributions) { // Wait for xml file to be downloaded and updates to come in. // (this should really be handled better). - base.rebuildContribModes(); Thread.sleep(5 * 1000); if ((!base.libraryManagerFrame.hasAlreadyBeenOpened() && base.libraryManagerFrame.hasUpdates(base)) || diff --git a/app/src/processing/app/contrib/ContributionListing.java b/app/src/processing/app/contrib/ContributionListing.java index bd05f5cba..8d5ccf653 100644 --- a/app/src/processing/app/contrib/ContributionListing.java +++ b/app/src/processing/app/contrib/ContributionListing.java @@ -27,7 +27,6 @@ import java.util.*; import java.util.concurrent.locks.ReentrantLock; import processing.app.Base; -import processing.app.Editor; import processing.app.Library; import processing.core.PApplet; @@ -383,39 +382,25 @@ public class ContributionListing { } boolean hasUpdates(Base base) { - System.out.println("here321"); - try { - System.out.println((base/*.getModeContribs()*/==null) ? "Null :(" : "what?!"); - } - catch (Exception e) - { - e.printStackTrace(); - } - System.out.println("Here too?!"); for (ModeContribution m : base.getModeContribs()) - if (m.isInstalled()) { - System.out.println(m.getName()); - Contribution advertised = getAvailableContribution(m); - if (advertised == null) { - } - else { - System.out.println("Here2"); - if (advertised.getVersion() > m.getVersion()) - return true; - } - } + if (hasUpdates(m)) + return true; + for (Library l : base.getActiveEditor().getMode().contribLibraries) + if (hasUpdates(l)) + return true; + for (ToolContribution t : base.getActiveEditor().contribTools) + if (hasUpdates(t)) + return true; return false; } boolean hasUpdates(Contribution contribution) { if (contribution.isInstalled()) { - System.out.println("Here"); Contribution advertised = getAvailableContribution(contribution); if (advertised == null) { return false; } - System.out.println("Here2"); return advertised.getVersion() > contribution.getVersion(); } return false; From 5137b0468cbe4d37dd2e94275d77692d9fe56da1 Mon Sep 17 00:00:00 2001 From: josh giesbrecht Date: Wed, 25 Jun 2014 06:08:03 -0700 Subject: [PATCH 13/88] Revert "fixed launch4j config for windows build" This reverts commit 309a5eb0ae50a3c3bad8bae9eb6935b1b4ec25df. --- build/windows/config-cmd.xml | 2 +- build/windows/config.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/build/windows/config-cmd.xml b/build/windows/config-cmd.xml index 607d545c5..7cd313d08 100755 --- a/build/windows/config-cmd.xml +++ b/build/windows/config-cmd.xml @@ -35,7 +35,7 @@ 1.7.0_40 - 256 + 256m An error occurred while starting the application. diff --git a/build/windows/config.xml b/build/windows/config.xml index 1ff09ff00..197e63680 100755 --- a/build/windows/config.xml +++ b/build/windows/config.xml @@ -35,7 +35,7 @@ 1.7.0_40 - 256 + 256m about.bmp From ed6edbf9db2f43328f1d31aa20a70616a313faa7 Mon Sep 17 00:00:00 2001 From: josh giesbrecht Date: Wed, 25 Jun 2014 06:13:59 -0700 Subject: [PATCH 14/88] small fix to l4j config so windows build works --- build/windows/config-cmd.xml | 2 +- build/windows/config.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/build/windows/config-cmd.xml b/build/windows/config-cmd.xml index 7cd313d08..607d545c5 100755 --- a/build/windows/config-cmd.xml +++ b/build/windows/config-cmd.xml @@ -35,7 +35,7 @@ 1.7.0_40 - 256m + 256 An error occurred while starting the application. diff --git a/build/windows/config.xml b/build/windows/config.xml index 197e63680..1ff09ff00 100755 --- a/build/windows/config.xml +++ b/build/windows/config.xml @@ -35,7 +35,7 @@ 1.7.0_40 - 256m + 256 about.bmp From 987d20d1643ded0f8ae12ab62f6d5a96d4c919ee Mon Sep 17 00:00:00 2001 From: joelmoniz Date: Fri, 27 Jun 2014 18:19:48 +0530 Subject: [PATCH 15/88] Correct mode is now selected in modeMenu --- app/src/processing/app/Editor.java | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/app/src/processing/app/Editor.java b/app/src/processing/app/Editor.java index ae90ba51f..9d9b06dae 100644 --- a/app/src/processing/app/Editor.java +++ b/app/src/processing/app/Editor.java @@ -390,6 +390,16 @@ public abstract class Editor extends JFrame implements RunnerListener { item.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { base.changeMode(m); + if (sketch.isModified()) { + for (Component c : modeMenu.getPopupMenu().getComponents()) { + if (c instanceof JRadioButtonMenuItem) { + if (((JRadioButtonMenuItem)c).getText() == mode.getTitle()) { + ((JRadioButtonMenuItem)c).setSelected(true); + break; + } + } + } + } } }); modeMenu.add(item); From aee3d3c49c1226d6a8c3be5c516d47c65a8d87ec Mon Sep 17 00:00:00 2001 From: Jakub Valtar Date: Sat, 5 Jul 2014 03:37:25 +0200 Subject: [PATCH 16/88] new lighting shaders --- core/src/processing/opengl/LightFrag.glsl | 31 +++++++++++++ core/src/processing/opengl/LightVert.glsl | 44 +++++++++++------- .../processing/opengl/PGraphicsOpenGL.java | 9 +++- core/src/processing/opengl/TexlightFrag.glsl | 36 +++++++++++++++ core/src/processing/opengl/TexlightVert.glsl | 46 +++++++++++-------- 5 files changed, 129 insertions(+), 37 deletions(-) create mode 100644 core/src/processing/opengl/LightFrag.glsl create mode 100644 core/src/processing/opengl/TexlightFrag.glsl diff --git a/core/src/processing/opengl/LightFrag.glsl b/core/src/processing/opengl/LightFrag.glsl new file mode 100644 index 000000000..b566c8e5b --- /dev/null +++ b/core/src/processing/opengl/LightFrag.glsl @@ -0,0 +1,31 @@ +/* + Part of the Processing project - http://processing.org + + Copyright (c) 2011-13 Ben Fry and Casey Reas + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License version 2.1 as published by the Free Software Foundation. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General + Public License along with this library; if not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, + Boston, MA 02111-1307 USA + */ + +#ifdef GL_ES +precision mediump float; +precision mediump int; +#endif + +varying vec4 vertColor; +varying vec4 backVertColor; + +void main() { + gl_FragColor = gl_FrontFacing ? vertColor : backVertColor; +} \ No newline at end of file diff --git a/core/src/processing/opengl/LightVert.glsl b/core/src/processing/opengl/LightVert.glsl index bfbb6a8d3..8d75f970a 100644 --- a/core/src/processing/opengl/LightVert.glsl +++ b/core/src/processing/opengl/LightVert.glsl @@ -43,6 +43,7 @@ attribute vec4 emissive; attribute float shininess; varying vec4 vertColor; +varying vec4 backVertColor; const float zero_float = 0.0; const float one_float = 1.0; @@ -82,17 +83,17 @@ void main() { // Normal vector in eye coordinates vec3 ecNormal = normalize(normalMatrix * normal); - - if (dot(-one_float * ecVertex, ecNormal) < zero_float) { - // If normal is away from camera, choose its opposite. - // If we add backface culling, this will be backfacing - ecNormal *= -one_float; - } + vec3 ecNormalInv = ecNormal * -one_float; // Light calculations vec3 totalAmbient = vec3(0, 0, 0); - vec3 totalDiffuse = vec3(0, 0, 0); - vec3 totalSpecular = vec3(0, 0, 0); + + vec3 totalFrontDiffuse = vec3(0, 0, 0); + vec3 totalFrontSpecular = vec3(0, 0, 0); + + vec3 totalBackDiffuse = vec3(0, 0, 0); + vec3 totalBackSpecular = vec3(0, 0, 0); + for (int i = 0; i < 8; i++) { if (lightCount == i) break; @@ -118,24 +119,33 @@ void main() { : one_float; if (any(greaterThan(lightAmbient[i], zero_vec3))) { - totalAmbient += lightAmbient[i] * falloff; + totalAmbient += lightAmbient[i] * falloff; } if (any(greaterThan(lightDiffuse[i], zero_vec3))) { - totalDiffuse += lightDiffuse[i] * falloff * spotf * - lambertFactor(lightDir, ecNormal); + totalFrontDiffuse += lightDiffuse[i] * falloff * spotf * + lambertFactor(lightDir, ecNormal); + totalBackDiffuse += lightDiffuse[i] * falloff * spotf * + lambertFactor(lightDir, ecNormalInv); } if (any(greaterThan(lightSpecular[i], zero_vec3))) { - totalSpecular += lightSpecular[i] * falloff * spotf * - blinnPhongFactor(lightDir, ecVertex, ecNormal, shininess); + totalFrontSpecular += lightSpecular[i] * falloff * spotf * + blinnPhongFactor(lightDir, ecVertex, ecNormal, shininess); + totalBackSpecular += lightSpecular[i] * falloff * spotf * + blinnPhongFactor(lightDir, ecVertex, ecNormalInv, shininess); } } // Calculating final color as result of all lights (plus emissive term). // Transparency is determined exclusively by the diffuse component. - vertColor = vec4(totalAmbient, 0) * ambient + - vec4(totalDiffuse, 1) * color + - vec4(totalSpecular, 0) * specular + - vec4(emissive.rgb, 0); + vertColor = vec4(totalAmbient, 0) * ambient + + vec4(totalFrontDiffuse, 1) * color + + vec4(totalFrontSpecular, 0) * specular + + vec4(emissive.rgb, 0); + + backVertColor = vec4(totalAmbient, 0) * ambient + + vec4(totalBackDiffuse, 1) * color + + vec4(totalBackSpecular, 0) * specular + + vec4(emissive.rgb, 0); } \ No newline at end of file diff --git a/core/src/processing/opengl/PGraphicsOpenGL.java b/core/src/processing/opengl/PGraphicsOpenGL.java index f177bfa67..52063719d 100644 --- a/core/src/processing/opengl/PGraphicsOpenGL.java +++ b/core/src/processing/opengl/PGraphicsOpenGL.java @@ -160,6 +160,11 @@ public class PGraphicsOpenGL extends PGraphics { PGraphicsOpenGL.class.getResource("ColorFrag.glsl"); static protected URL defTextureShaderFragURL = PGraphicsOpenGL.class.getResource("TextureFrag.glsl"); + static protected URL defLightShaderFragURL = + PGraphicsOpenGL.class.getResource("LightFrag.glsl"); + static protected URL defTexlightShaderFragURL = + PGraphicsOpenGL.class.getResource("TexlightFrag.glsl"); + static protected URL defLineShaderVertURL = PGraphicsOpenGL.class.getResource("LineVert.glsl"); static protected URL defLineShaderFragURL = @@ -6740,7 +6745,7 @@ public class PGraphicsOpenGL extends PGraphics { if (useDefault || !polyShader.checkPolyType(PShader.TEXLIGHT)) { if (ppg.defTexlightShader == null) { String[] vertSource = pgl.loadVertexShader(defTexlightShaderVertURL, 120); - String[] fragSource = pgl.loadFragmentShader(defTextureShaderFragURL, 120); + String[] fragSource = pgl.loadFragmentShader(defTexlightShaderFragURL, 120); ppg.defTexlightShader = new PShader(parent, vertSource, fragSource); } shader = ppg.defTexlightShader; @@ -6751,7 +6756,7 @@ public class PGraphicsOpenGL extends PGraphics { if (useDefault || !polyShader.checkPolyType(PShader.LIGHT)) { if (ppg.defLightShader == null) { String[] vertSource = pgl.loadVertexShader(defLightShaderVertURL, 120); - String[] fragSource = pgl.loadFragmentShader(defColorShaderFragURL, 120); + String[] fragSource = pgl.loadFragmentShader(defLightShaderFragURL, 120); ppg.defLightShader = new PShader(parent, vertSource, fragSource); } shader = ppg.defLightShader; diff --git a/core/src/processing/opengl/TexlightFrag.glsl b/core/src/processing/opengl/TexlightFrag.glsl new file mode 100644 index 000000000..f423e49d3 --- /dev/null +++ b/core/src/processing/opengl/TexlightFrag.glsl @@ -0,0 +1,36 @@ +/* + Part of the Processing project - http://processing.org + + Copyright (c) 2011-13 Ben Fry and Casey Reas + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License version 2.1 as published by the Free Software Foundation. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General + Public License along with this library; if not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, + Boston, MA 02111-1307 USA + */ + +#ifdef GL_ES +precision mediump float; +precision mediump int; +#endif + +uniform sampler2D texture; + +uniform vec2 texOffset; + +varying vec4 vertColor; +varying vec4 backVertColor; +varying vec4 vertTexCoord; + +void main() { + gl_FragColor = texture2D(texture, vertTexCoord.st) * (gl_FrontFacing ? vertColor : backVertColor); +} \ No newline at end of file diff --git a/core/src/processing/opengl/TexlightVert.glsl b/core/src/processing/opengl/TexlightVert.glsl index 6542bf8fb..d9f2cde3a 100644 --- a/core/src/processing/opengl/TexlightVert.glsl +++ b/core/src/processing/opengl/TexlightVert.glsl @@ -45,6 +45,7 @@ attribute vec4 emissive; attribute float shininess; varying vec4 vertColor; +varying vec4 backVertColor; varying vec4 vertTexCoord; const float zero_float = 0.0; @@ -85,17 +86,17 @@ void main() { // Normal vector in eye coordinates vec3 ecNormal = normalize(normalMatrix * normal); - - if (dot(-one_float * ecVertex, ecNormal) < zero_float) { - // If normal is away from camera, choose its opposite. - // If we add backface culling, this will be backfacing - ecNormal *= -one_float; - } + vec3 ecNormalInv = ecNormal * -one_float; // Light calculations vec3 totalAmbient = vec3(0, 0, 0); - vec3 totalDiffuse = vec3(0, 0, 0); - vec3 totalSpecular = vec3(0, 0, 0); + + vec3 totalFrontDiffuse = vec3(0, 0, 0); + vec3 totalFrontSpecular = vec3(0, 0, 0); + + vec3 totalBackDiffuse = vec3(0, 0, 0); + vec3 totalBackSpecular = vec3(0, 0, 0); + for (int i = 0; i < 8; i++) { if (lightCount == i) break; @@ -121,27 +122,36 @@ void main() { : one_float; if (any(greaterThan(lightAmbient[i], zero_vec3))) { - totalAmbient += lightAmbient[i] * falloff; + totalAmbient += lightAmbient[i] * falloff; } if (any(greaterThan(lightDiffuse[i], zero_vec3))) { - totalDiffuse += lightDiffuse[i] * falloff * spotf * - lambertFactor(lightDir, ecNormal); + totalFrontDiffuse += lightDiffuse[i] * falloff * spotf * + lambertFactor(lightDir, ecNormal); + totalBackDiffuse += lightDiffuse[i] * falloff * spotf * + lambertFactor(lightDir, ecNormalInv); } if (any(greaterThan(lightSpecular[i], zero_vec3))) { - totalSpecular += lightSpecular[i] * falloff * spotf * - blinnPhongFactor(lightDir, ecVertex, ecNormal, shininess); - } + totalFrontSpecular += lightSpecular[i] * falloff * spotf * + blinnPhongFactor(lightDir, ecVertex, ecNormal, shininess); + totalBackSpecular += lightSpecular[i] * falloff * spotf * + blinnPhongFactor(lightDir, ecVertex, ecNormalInv, shininess); + } } // Calculating final color as result of all lights (plus emissive term). // Transparency is determined exclusively by the diffuse component. - vertColor = vec4(totalAmbient, 0) * ambient + - vec4(totalDiffuse, 1) * color + - vec4(totalSpecular, 0) * specular + - vec4(emissive.rgb, 0); + vertColor = vec4(totalAmbient, 0) * ambient + + vec4(totalFrontDiffuse, 1) * color + + vec4(totalFrontSpecular, 0) * specular + + vec4(emissive.rgb, 0); + backVertColor = vec4(totalAmbient, 0) * ambient + + vec4(totalBackDiffuse, 1) * color + + vec4(totalBackSpecular, 0) * specular + + vec4(emissive.rgb, 0); + // Calculating texture coordinates, with r and q set both to one vertTexCoord = texMatrix * vec4(texCoord, 1.0, 1.0); } From 280860dd1850f466ac65726db561438ca1937ad0 Mon Sep 17 00:00:00 2001 From: Jakub Valtar Date: Sat, 5 Jul 2014 03:42:41 +0200 Subject: [PATCH 17/88] corrections of normals and front faces --- core/src/processing/core/PGraphics.java | 2 +- .../processing/opengl/PGraphicsOpenGL.java | 141 +++++++++++------- 2 files changed, 88 insertions(+), 55 deletions(-) diff --git a/core/src/processing/core/PGraphics.java b/core/src/processing/core/PGraphics.java index ed29c0ee4..5151ae64d 100644 --- a/core/src/processing/core/PGraphics.java +++ b/core/src/processing/core/PGraphics.java @@ -2405,7 +2405,7 @@ public class PGraphics extends PImage implements PConstants { protected void rectImpl(float x1, float y1, float x2, float y2) { - quad(x1, y1, x2, y1, x2, y2, x1, y2); + quad(x1, y1, x1, y2, x2, y2, x2, y1); } diff --git a/core/src/processing/opengl/PGraphicsOpenGL.java b/core/src/processing/opengl/PGraphicsOpenGL.java index 52063719d..e824bb295 100644 --- a/core/src/processing/opengl/PGraphicsOpenGL.java +++ b/core/src/processing/opengl/PGraphicsOpenGL.java @@ -1827,7 +1827,7 @@ public class PGraphicsOpenGL extends PGraphics { pgl.disable(PGL.SCISSOR_TEST); } - pgl.frontFace(PGL.CW); + pgl.frontFace(PGL.CCW); pgl.disable(PGL.CULL_FACE); pgl.activeTexture(PGL.TEXTURE0); @@ -3242,7 +3242,9 @@ public class PGraphicsOpenGL extends PGraphics { normalMode = NORMAL_MODE_SHAPE; inGeo.setMaterial(fillColor, strokeColor, strokeWeight, ambientColor, specularColor, emissiveColor, shininess); - inGeo.setNormal(normalX, normalY, normalZ); + // TODO: Arc should be drawn in CCW order (left-handed) + // Temp fix: invert arc normal + inGeo.setNormal(normalX, normalY, -normalZ); inGeo.addArc(x, y, w, h, start, stop, fill, stroke, mode); endShape(); } @@ -6536,16 +6538,21 @@ public class PGraphicsOpenGL extends PGraphics { lightSpecular(0, 0, 0); } - // Because y is flipped, the vertices that should be specified by - // the user in CCW order to define a front-facing facet, end up being CW. - pgl.frontFace(PGL.CW); + // Vertices should be specified by user in CCW order (left-handed) + // That is CW order (right-handed). Vertex shader inverts + // Y-axis and outputs vertices in CCW order (right-handed). + // Culling occurs after the vertex shader, so FRONT FACE + // has to be set to CCW (right-handed) for OpenGL to correctly + // recognize FRONT and BACK faces. + pgl.frontFace(PGL.CCW); pgl.disable(PGL.CULL_FACE); // Processing uses only one texture unit. pgl.activeTexture(PGL.TEXTURE0); // The current normal vector is set to be parallel to the Z axis. - normalX = normalY = normalZ = 0; + normalX = normalY = 0; + normalZ = 1; // Clear depth and stencil buffers. pgl.depthMask(true); @@ -7830,12 +7837,14 @@ public class PGraphicsOpenGL extends PGraphics { float v10z = z0 - z1; // The automatic normal calculation in Processing assumes - // that vertices as given in CCW order so: - // n = v12 x v10 - // so that the normal outwards. - float nx = v12y * v10z - v10y * v12z; - float ny = v12z * v10x - v10z * v12x; - float nz = v12x * v10y - v10x * v12y; + // that vertices are given by user in CCW order (left-handed), + // internally in CW order (right-handed) so: + // n = v10 x v12 + // so that the normal extends outwards from the front face. + float nx = v10y * v12z - v12y * v10z; + float ny = v10z * v12x - v12z * v10x; + float nz = v10x * v12y - v12x * v10y; + float d = PApplet.sqrt(nx * nx + ny * ny + nz * nz); nx /= d; ny /= d; @@ -7881,14 +7890,14 @@ public class PGraphicsOpenGL extends PGraphics { for (int i = 1; i < vertexCount - 1; i++) { int i1 = i; int i0, i2; - if (i % 2 == 0) { - // The even triangles (0, 2, 4...) should be CW - i0 = i + 1; - i2 = i - 1; - } else { - // The even triangles (1, 3, 5...) should be CCW + if (i % 2 == 1) { + // The odd triangles (1, 3, 5...) should be CCW (left-handed) i0 = i - 1; i2 = i + 1; + } else { + // The even triangles (2, 4, 6...) should be CW (left-handed) + i0 = i + 1; + i2 = i - 1; } calcTriangleNormal(i0, i1, i2); } @@ -7913,8 +7922,14 @@ public class PGraphicsOpenGL extends PGraphics { int i2 = 2 * qd; int i3 = 2 * qd + 1; - calcTriangleNormal(i0, i3, i1); - calcTriangleNormal(i0, i2, i3); + // Vertices are ordered as: + // 0-2 ... + // |/| ... + // 1-3 ... + // thus (0, 1, 2) and (2, 1, 3) are triangles + // in CCW order (left-handed). + calcTriangleNormal(i0, i1, i2); + calcTriangleNormal(i2, i1, i3); } } @@ -7988,26 +8003,20 @@ public class PGraphicsOpenGL extends PGraphics { void addRect(float a, float b, float c, float d, boolean stroke) { addQuad(a, b, 0, - c, b, 0, - c, d, 0, a, d, 0, + c, d, 0, + c, b, 0, stroke); } void addRect(float a, float b, float c, float d, float tl, float tr, float br, float bl, boolean stroke) { - if (nonZero(tr)) { - addVertex(c-tr, b, VERTEX, true); - addQuadraticVertex(c, b, 0, c, b+tr, 0, false); + if (nonZero(tl)) { + addVertex(a, b+tl, VERTEX, false); + addQuadraticVertex(a, b, 0, a+tl, b, 0, false); } else { - addVertex(c, b, VERTEX, true); - } - if (nonZero(br)) { - addVertex(c, d-br, VERTEX, false); - addQuadraticVertex(c, d, 0, c-br, d, 0, false); - } else { - addVertex(c, d, VERTEX, false); + addVertex(a, b, VERTEX, false); } if (nonZero(bl)) { addVertex(a+bl, d, VERTEX, false); @@ -8015,11 +8024,17 @@ public class PGraphicsOpenGL extends PGraphics { } else { addVertex(a, d, VERTEX, false); } - if (nonZero(tl)) { - addVertex(a, b+tl, VERTEX, false); - addQuadraticVertex(a, b, 0, a+tl, b, 0, false); + if (nonZero(br)) { + addVertex(c, d-br, VERTEX, false); + addQuadraticVertex(c, d, 0, c-br, d, 0, false); } else { - addVertex(a, b, VERTEX, false); + addVertex(c, d, VERTEX, false); + } + if (nonZero(tr)) { + addVertex(c-tr, b, VERTEX, true); + addQuadraticVertex(c, b, 0, c, b+tr, 0, false); + } else { + addVertex(c, b, VERTEX, true); } } @@ -8051,7 +8066,7 @@ public class PGraphicsOpenGL extends PGraphics { float val = 0; for (int i = 0; i < accuracy; i++) { idx = addVertex(centerX + cosLUT[(int) val] * radiusH, - centerY + sinLUT[(int) val] * radiusV, + centerY - sinLUT[(int) val] * radiusV, VERTEX, i == 0 && !fill); val = (val + inc) % SINCOS_LENGTH; @@ -8136,6 +8151,18 @@ public class PGraphicsOpenGL extends PGraphics { void addBox(float w, float h, float d, boolean fill, boolean stroke) { + + // Correct normals if some dimensions are negative so they always + // extend from front face. We could just take absolute value + // of dimensions, but that would affect texturing. + boolean invertNormX = (h > 0) != (d > 0); + boolean invertNormY = (w > 0) != (d > 0); + boolean invertNormZ = (w > 0) != (h > 0); + + int normX = invertNormX ? -1 : 1; + int normY = invertNormY ? -1 : 1; + int normZ = invertNormZ ? -1 : 1; + float x1 = -w/2f; float x2 = w/2f; float y1 = -h/2f; float y2 = h/2f; float z1 = -d/2f; float z2 = d/2f; @@ -8143,7 +8170,7 @@ public class PGraphicsOpenGL extends PGraphics { int idx1 = 0, idx2 = 0, idx3 = 0, idx4 = 0; if (fill || stroke) { // back face - setNormal(0, 0, -1); + setNormal(0, 0, -normZ); idx1 = addVertex(x1, y1, z1, 0, 0, VERTEX, true); idx2 = addVertex(x2, y1, z1, 1, 0, VERTEX, false); idx3 = addVertex(x2, y2, z1, 1, 1, VERTEX, false); @@ -8157,7 +8184,7 @@ public class PGraphicsOpenGL extends PGraphics { } // front face - setNormal(0, 0, 1); + setNormal(0, 0, normZ); idx1 = addVertex(x2, y1, z2, 0, 0, VERTEX, false); idx2 = addVertex(x1, y1, z2, 1, 0, VERTEX, false); idx3 = addVertex(x1, y2, z2, 1, 1, VERTEX, false); @@ -8171,7 +8198,7 @@ public class PGraphicsOpenGL extends PGraphics { } // right face - setNormal(1, 0, 0); + setNormal(normX, 0, 0); idx1 = addVertex(x2, y1, z1, 0, 0, VERTEX, false); idx2 = addVertex(x2, y1, z2, 1, 0, VERTEX, false); idx3 = addVertex(x2, y2, z2, 1, 1, VERTEX, false); @@ -8185,7 +8212,7 @@ public class PGraphicsOpenGL extends PGraphics { } // left face - setNormal(-1, 0, 0); + setNormal(-normX, 0, 0); idx1 = addVertex(x1, y1, z2, 0, 0, VERTEX, false); idx2 = addVertex(x1, y1, z1, 1, 0, VERTEX, false); idx3 = addVertex(x1, y2, z1, 1, 1, VERTEX, false); @@ -8198,8 +8225,8 @@ public class PGraphicsOpenGL extends PGraphics { closeEdge(idx4, idx1); } - // bottom face - setNormal(0, -1, 0); + // top face + setNormal(0, -normY, 0); idx1 = addVertex(x1, y1, z2, 0, 0, VERTEX, false); idx2 = addVertex(x2, y1, z2, 1, 0, VERTEX, false); idx3 = addVertex(x2, y1, z1, 1, 1, VERTEX, false); @@ -8212,8 +8239,8 @@ public class PGraphicsOpenGL extends PGraphics { closeEdge(idx4, idx1); } - // top face - setNormal(0, 1, 0); + // bottom face + setNormal(0, normY, 0); idx1 = addVertex(x1, y2, z1, 0, 0, VERTEX, false); idx2 = addVertex(x2, y2, z1, 1, 0, VERTEX, false); idx3 = addVertex(x2, y2, z2, 1, 1, VERTEX, false); @@ -8274,8 +8301,8 @@ public class PGraphicsOpenGL extends PGraphics { int i1 = vert0 + i; int i0 = vert0 + i - detailU; - indices[3 * i + 0] = i1; - indices[3 * i + 1] = i0; + indices[3 * i + 0] = i0; + indices[3 * i + 1] = i1; indices[3 * i + 2] = i1 + 1; addEdge(i0, i1, true, true); @@ -8308,13 +8335,13 @@ public class PGraphicsOpenGL extends PGraphics { int i1 = vert0 + i; int i0 = vert0 + i - detailU - 1; - indices[indCount + 6 * i + 0] = i1; - indices[indCount + 6 * i + 1] = i0; + indices[indCount + 6 * i + 0] = i0; + indices[indCount + 6 * i + 1] = i1; indices[indCount + 6 * i + 2] = i0 + 1; indices[indCount + 6 * i + 3] = i1; - indices[indCount + 6 * i + 4] = i0 + 1; - indices[indCount + 6 * i + 5] = i1 + 1; + indices[indCount + 6 * i + 4] = i1 + 1; + indices[indCount + 6 * i + 5] = i0 + 1; addEdge(i0, i1, true, true); addEdge(i1, i1 + 1, true, true); @@ -9200,9 +9227,15 @@ public class PGraphicsOpenGL extends PGraphics { float v10y = y0 - y1; float v10z = z0 - z1; - float nx = v12y * v10z - v10y * v12z; - float ny = v12z * v10x - v10z * v12x; - float nz = v12x * v10y - v10x * v12y; + // The automatic normal calculation in Processing assumes + // that vertices are given by user in CCW order (left-handed), + // internally in CW order (right-handed) so: + // n = v10 x v12 + // so that the normal extends outwards from the front face. + float nx = v10y * v12z - v12y * v10z; + float ny = v10z * v12x - v12z * v10x; + float nz = v10x * v12y - v12x * v10y; + float d = PApplet.sqrt(nx * nx + ny * ny + nz * nz); nx /= d; ny /= d; From 8aa69b1789bf63f47a15e6f133985138899ea29c Mon Sep 17 00:00:00 2001 From: tyfkda Date: Sun, 8 Jun 2014 19:54:57 +0900 Subject: [PATCH 18/88] Remove writer Seems writer is not used in Runner#generateTrace. --- app/src/processing/mode/java/runner/Runner.java | 4 ---- 1 file changed, 4 deletions(-) diff --git a/app/src/processing/mode/java/runner/Runner.java b/app/src/processing/mode/java/runner/Runner.java index 314e37f0d..8812627c9 100644 --- a/app/src/processing/mode/java/runner/Runner.java +++ b/app/src/processing/mode/java/runner/Runner.java @@ -639,9 +639,6 @@ public class Runner implements MessageConsumer { //vm.setDebugTraceMode(debugTraceMode); // vm.setDebugTraceMode(VirtualMachine.TRACE_ALL); // vm.setDebugTraceMode(VirtualMachine.TRACE_NONE); // formerly, seems to have no effect - - // For internal debugging - PrintWriter writer = null; // Calling this seems to set something internally to make the // Eclipse JDI wake up. Without it, an ObjectCollectedException @@ -735,7 +732,6 @@ public class Runner implements MessageConsumer { // we don't interrupt } //System.out.println("and leaving"); - if (writer != null) writer.close(); } From 6df349b68e9fcf9f5934e8613cb348b084284363 Mon Sep 17 00:00:00 2001 From: Jakub Valtar Date: Sun, 13 Jul 2014 22:33:37 +0200 Subject: [PATCH 19/88] new Arc implementation for OpenGL renderers --- core/src/processing/core/PGraphics.java | 4 +- .../processing/opengl/PGraphicsOpenGL.java | 109 ++++++++++++------ 2 files changed, 76 insertions(+), 37 deletions(-) diff --git a/core/src/processing/core/PGraphics.java b/core/src/processing/core/PGraphics.java index 5151ae64d..7ad1d26ba 100644 --- a/core/src/processing/core/PGraphics.java +++ b/core/src/processing/core/PGraphics.java @@ -2664,8 +2664,8 @@ public class PGraphics extends PImage implements PConstants { } if (stop - start > TWO_PI) { - start = 0; - stop = TWO_PI; + // don't change start, it is visible in PIE mode + stop = start + TWO_PI; } arcImpl(x, y, w, h, start, stop, mode); } diff --git a/core/src/processing/opengl/PGraphicsOpenGL.java b/core/src/processing/opengl/PGraphicsOpenGL.java index e824bb295..419c4b8fd 100644 --- a/core/src/processing/opengl/PGraphicsOpenGL.java +++ b/core/src/processing/opengl/PGraphicsOpenGL.java @@ -3242,9 +3242,8 @@ public class PGraphicsOpenGL extends PGraphics { normalMode = NORMAL_MODE_SHAPE; inGeo.setMaterial(fillColor, strokeColor, strokeWeight, ambientColor, specularColor, emissiveColor, shininess); - // TODO: Arc should be drawn in CCW order (left-handed) - // Temp fix: invert arc normal - inGeo.setNormal(normalX, normalY, -normalZ); + + inGeo.setNormal(normalX, normalY, normalZ); inGeo.addArc(x, y, w, h, start, stop, fill, stroke, mode); endShape(); } @@ -8101,50 +8100,90 @@ public class PGraphicsOpenGL extends PGraphics { int startLUT = (int) (0.5f + (start / TWO_PI) * SINCOS_LENGTH); int stopLUT = (int) (0.5f + (stop / TWO_PI) * SINCOS_LENGTH); - int idx0 = addVertex(centerX, centerY, VERTEX, true); + // get length before wrapping indexes so (startLUT <= stopLUT); + int length = PApplet.constrain(stopLUT - startLUT, 0, SINCOS_LENGTH); - int increment = 1; // what's a good algorithm? stopLUT - startLUT; - int pidx = 0, idx = 0; - for (int i = startLUT; i < stopLUT; i += increment) { - int ii = i % SINCOS_LENGTH; - // modulo won't make the value positive + boolean fullCircle = length == SINCOS_LENGTH; + + if (fullCircle && arcMode == CHORD) { + // get rid of overlapping vertices, + // solves problem with closing edge in P3D + length -= 1; + stopLUT -= 1; + } + + { // wrap indexes so they are safe to use in LUT + startLUT %= SINCOS_LENGTH; + if (startLUT < 0) startLUT += SINCOS_LENGTH; + + stopLUT %= SINCOS_LENGTH; + if (stopLUT < 0) stopLUT += SINCOS_LENGTH; + } + + int idx0; + if (arcMode == CHORD || arcMode == OPEN) { + // move center to the middle of flat side + // to properly display arcs smaller than PI + float relX = (cosLUT[startLUT] + cosLUT[stopLUT]) * 0.5f * hr; + float relY = (sinLUT[startLUT] + sinLUT[stopLUT]) * 0.5f * vr; + idx0 = addVertex(centerX + relX, centerY + relY, VERTEX, true); + } else { + idx0 = addVertex(centerX, centerY, VERTEX, true); + } + + int inc; + { // initializes inc the same way ellipse does + float sx1 = pg.screenX(x, y); + float sy1 = pg.screenY(x, y); + float sx2 = pg.screenX(x + w, y + h); + float sy2 = pg.screenY(x + w, y + h); + + int accuracy = + PApplet.min(MAX_POINT_ACCURACY, PApplet.max(MIN_POINT_ACCURACY, + (int) (TWO_PI * PApplet.dist(sx1, sy1, sx2, sy2) / + POINT_ACCURACY_FACTOR))); + inc = PApplet.max(1, SINCOS_LENGTH / accuracy); + } + + int idx = idx0; + int pidx; + + int i = -inc; + int ii; + + // i: (0 -> length) inclusive + // ii: (stopLUT -> startLUT) inclusive, going CCW (left-handed), + // wrapping around end of LUT + do { + i += inc; + i = PApplet.min(i, length); // clamp so last vertex won't go over + + ii = stopLUT - i; // ii is never smaller than -SINCOS_LENGTH if (ii < 0) ii += SINCOS_LENGTH; + + pidx = idx; idx = addVertex(centerX + cosLUT[ii] * hr, centerY + sinLUT[ii] * vr, - VERTEX, i == startLUT && !fill); + VERTEX, i == 0 && !fill); if (stroke) { - if (arcMode == PIE) { - addEdge(pidx, idx, i == startLUT, false); - } else if (startLUT < i) { - addEdge(pidx, idx, i == startLUT + 1, arcMode == 0 && - i == stopLUT - 1); + if (arcMode == CHORD || arcMode == PIE) { + addEdge(pidx, idx, i == 0, false); + } else if (0 < i) { + // when drawing full circle, the edge is closed later + addEdge(pidx, idx, i == inc, i == length && !fullCircle); } } + } while (i < length); + + // keeping last vertex as idx and second last vertex as pidx - pidx = idx; - } - // draw last point explicitly for accuracy - idx = addVertex(centerX + cosLUT[stopLUT % SINCOS_LENGTH] * hr, - centerY + sinLUT[stopLUT % SINCOS_LENGTH] * vr, - VERTEX, false); if (stroke) { - if (arcMode == PIE) { + if (arcMode == CHORD || arcMode == PIE) { addEdge(idx, idx0, false, false); closeEdge(idx, idx0); - } - } - if (arcMode == CHORD || arcMode == OPEN) { - // Add a last vertex coincident with the first along the perimeter - pidx = idx; - int i = startLUT; - int ii = i % SINCOS_LENGTH; - if (ii < 0) ii += SINCOS_LENGTH; - idx = addVertex(centerX + cosLUT[ii] * hr, - centerY + sinLUT[ii] * vr, - VERTEX, false); - if (stroke && arcMode == CHORD) { - addEdge(pidx, idx, false, true); + } else if (fullCircle) { + closeEdge(pidx, idx); } } } From bbcade378361381b6ca4356d2dfa32e74d902f2f Mon Sep 17 00:00:00 2001 From: Manindra Moharana Date: Mon, 14 Jul 2014 06:14:57 +0530 Subject: [PATCH 20/88] cc trigger bug fix --- pdex/src/processing/mode/experimental/TextArea.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pdex/src/processing/mode/experimental/TextArea.java b/pdex/src/processing/mode/experimental/TextArea.java index fe333c8e4..9575ff8c5 100644 --- a/pdex/src/processing/mode/experimental/TextArea.java +++ b/pdex/src/processing/mode/experimental/TextArea.java @@ -246,7 +246,7 @@ public class TextArea extends JEditTextArea { // errorCheckerService.runManualErrorCheck(); // Provide completions only if it's enabled if (ExperimentalMode.codeCompletionsEnabled - && !ExperimentalMode.ccTriggerEnabled) { + && (!ExperimentalMode.ccTriggerEnabled || suggestion.isVisible())) { log("[KeyEvent]" + evt2.getKeyChar() + " |Prediction started: " + System.currentTimeMillis()); log("Typing: " + fetchPhrase(evt2) + " " From 76a68bfcb6ad5936d3669440fdd35e32ae8663c3 Mon Sep 17 00:00:00 2001 From: Manindra Moharana Date: Mon, 14 Jul 2014 22:29:45 +0530 Subject: [PATCH 21/88] updated todo --- pdex/todo.txt | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/pdex/todo.txt b/pdex/todo.txt index c177853c6..0495b9457 100644 --- a/pdex/todo.txt +++ b/pdex/todo.txt @@ -12,11 +12,17 @@ Manindra Moharana (me@mkmoharana.com) Critical Bugs ------------- --[ ] Better memory management. #1 +-[x] Better memory management. #1 -[ ] Breakpoints in classes. #47 +Misc Tasks +---------- + +-[ ] Trim CompilationChecker class + + Normal Bugs ----------- -[x] Sketch NOC 6_09: steer PVector, doesn't show completion. #68 @@ -35,16 +41,14 @@ Enhancements/New Features -[ ] Gotta fix PEH for multiple errors per line. Will be slightly meticulous. +-[ ] Better comment/uncomment + -[ ] When viewing Outline View, instead of showing the beginning of the list, it should select the current node element within which the cursor is presently positioned. -[ ] Begin work on code snippets. --[ ] JUnit Testing? - -[ ] Preferences panel -[ ] Line Numbers - - From 2592a1d1afd7cc9eb52ebac476e7a0de7ab9abb1 Mon Sep 17 00:00:00 2001 From: Manindra Moharana Date: Mon, 14 Jul 2014 23:19:27 +0530 Subject: [PATCH 22/88] slight improvements to toggle comment feature --- .../mode/experimental/DebugEditor.java | 73 +++++++++++++++++++ 1 file changed, 73 insertions(+) diff --git a/pdex/src/processing/mode/experimental/DebugEditor.java b/pdex/src/processing/mode/experimental/DebugEditor.java index 8d1f83368..b56310c5c 100755 --- a/pdex/src/processing/mode/experimental/DebugEditor.java +++ b/pdex/src/processing/mode/experimental/DebugEditor.java @@ -1683,6 +1683,79 @@ public class DebugEditor extends JavaEditor implements ActionListener { errorCheckerService.runManualErrorCheck(); } } + + /** + * Handles toggle comment. Slightly improved from the default implementation + * in {@link processing.app.Editor} + */ + protected void handleCommentUncomment() { + // log("Entering handleCommentUncomment()"); + startCompoundEdit(); + + String prefix = getCommentPrefix(); + int prefixLen = prefix.length(); + + int startLine = textarea.getSelectionStartLine(); + int stopLine = textarea.getSelectionStopLine(); + + int lastLineStart = textarea.getLineStartOffset(stopLine); + int selectionStop = textarea.getSelectionStop(); + // If the selection ends at the beginning of the last line, + // then don't (un)comment that line. + if (selectionStop == lastLineStart) { + // Though if there's no selection, don't do that + if (textarea.isSelectionActive()) { + stopLine--; + } + } + + // If the text is empty, ignore the user. + // Also ensure that all lines are commented (not just the first) + // when determining whether to comment or uncomment. + boolean commented = true; + for (int i = startLine; commented && (i <= stopLine); i++) { + String lineText = textarea.getLineText(i).trim(); + if (lineText.length() == 0) + continue; //ignore blank lines + commented = lineText.startsWith(prefix); + } + + // log("Commented: " + commented); + + // This is the line start offset of the first line, which is added to + // all other lines while adding a comment. Required when commenting + // lines which have uneven whitespaces in the beginning. Makes the + // commented lines look more uniform. + int lso = Math.abs(textarea.getLineStartNonWhiteSpaceOffset(startLine) + - textarea.getLineStartOffset(startLine)); + + for (int line = startLine; line <= stopLine; line++) { + int location = textarea.getLineStartNonWhiteSpaceOffset(line); + String lineText = textarea.getLineText(line); + if (lineText.trim().length() == 0) + continue; //ignore blank lines + if (commented) { + // remove a comment + if (lineText.trim().startsWith(prefix + " ")) { + textarea.select(location, location + prefixLen + 1); + } else { + textarea.select(location, location + prefixLen); + } + textarea.setSelectedText(""); + } else { + // add a comment + location = textarea.getLineStartOffset(line) + lso; + textarea.select(location, location); + textarea.setSelectedText(prefix + " "); //Add a '// ' + } + } + // Subtract one from the end, otherwise selects past the current line. + // (Which causes subsequent calls to keep expanding the selection) + textarea.select(textarea.getLineStartOffset(startLine), + textarea.getLineStopOffset(stopLine) - 1); + stopCompoundEdit(); + sketch.setModified(true); + } // TweakMode code /** From 31e835d7a7996c8b736bb276a32350a1a5c504ac Mon Sep 17 00:00:00 2001 From: Manindra Moharana Date: Mon, 14 Jul 2014 23:28:37 +0530 Subject: [PATCH 23/88] updated todo --- pdex/todo.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pdex/todo.txt b/pdex/todo.txt index 0495b9457..29487b765 100644 --- a/pdex/todo.txt +++ b/pdex/todo.txt @@ -41,7 +41,7 @@ Enhancements/New Features -[ ] Gotta fix PEH for multiple errors per line. Will be slightly meticulous. --[ ] Better comment/uncomment +-[x] Better comment/uncomment - ignores leading whitespaces, and more uniform // placement. -[ ] When viewing Outline View, instead of showing the beginning of the list, it should select the current node element within which the cursor is presently From aaedc5448e035455125f04bbe6b96d8fab13d165 Mon Sep 17 00:00:00 2001 From: Manindra Moharana Date: Mon, 14 Jul 2014 23:35:13 +0530 Subject: [PATCH 24/88] trimmed CC --- .../mode/experimental/CompilationChecker.java | 107 ++++++------------ 1 file changed, 36 insertions(+), 71 deletions(-) diff --git a/pdex/src/processing/mode/experimental/CompilationChecker.java b/pdex/src/processing/mode/experimental/CompilationChecker.java index 9b7e72a78..8d56c5855 100644 --- a/pdex/src/processing/mode/experimental/CompilationChecker.java +++ b/pdex/src/processing/mode/experimental/CompilationChecker.java @@ -1,3 +1,21 @@ +/* + * Copyright (C) 2012-14 Martin Leopold and Manindra Moharana + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License as published by the Free Software + * Foundation; either version 2 of the License, or (at your option) any later + * version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more + * details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., 59 Temple + * Place - Suite 330, Boston, MA 02111-1307, USA. + */ + package processing.mode.experimental; import java.io.BufferedReader; @@ -42,6 +60,13 @@ import org.eclipse.jdt.internal.compiler.impl.CompilerOptions; import org.eclipse.jdt.internal.compiler.problem.DefaultProblemFactory; import org.eclipse.jface.text.Document; +/** + * + * Provides compilation checking functionality + * + * @author Manindra Moharana <me@mkmoharana.com> + * + */ public class CompilationChecker { /** * ICompilationUnit implementation @@ -355,59 +380,6 @@ public class CompilationChecker { return null; } - private void compileAndRun(ICompilationUnit unit, boolean runIt) { - - Map settings = new HashMap(); - settings.put(CompilerOptions.OPTION_LineNumberAttribute, - CompilerOptions.GENERATE); - settings.put(CompilerOptions.OPTION_SourceFileAttribute, - CompilerOptions.GENERATE); - - CompilerOptions ops = new CompilerOptions(settings); - - CompileRequestorImpl requestor = new CompileRequestorImpl(); - Compiler compiler = new Compiler(new NameEnvironmentImpl(unit), - DefaultErrorHandlingPolicies - .proceedWithAllProblems(), ops, - requestor, - new DefaultProblemFactory(Locale - .getDefault())); - - compiler.compile(new ICompilationUnit[] { unit }); - // System.out.println(unit.getContents()); - List problems = requestor.getProblems(); - boolean error = false; - for (Iterator it = problems.iterator(); it.hasNext();) { - IProblem problem = (IProblem) it.next(); - StringBuffer buffer = new StringBuffer(); - buffer.append(problem.getMessage()); - buffer.append(" line: "); - buffer.append(problem.getSourceLineNumber()); - String msg = buffer.toString(); - if (problem.isError()) { - error = true; - msg = "Error:\n" + msg + " " + problem.toString(); - } else if (problem.isWarning()) - msg = "Warning:\n" + msg; - - System.out.println(msg); - } - - if (!error && runIt) { - try { - ClassLoader loader = new CustomClassLoader(getClass().getClassLoader(), - requestor.getResults()); - String className = CharOperation.toString(unit.getPackageName()) + "." - + new String(unit.getMainTypeName()); - Class clazz = loader.loadClass(className); - Method m = clazz.getMethod("main", new Class[] { String[].class }); - m.invoke(clazz, new Object[] { new String[0] }); - } catch (Exception e) { - e.printStackTrace(); - } - } - } - private void compileMeQuitely(ICompilationUnit unit, Map compilerSettings) { Map settings; @@ -433,13 +405,13 @@ public class CompilationChecker { settings = compilerSettings; } - CompilerOptions cop = new CompilerOptions(); - cop.set(settings); +// CompilerOptions cop = new CompilerOptions(); +// cop.set(settings); CompileRequestorImpl requestor = new CompileRequestorImpl(); Compiler compiler = new Compiler(new NameEnvironmentImpl(unit), DefaultErrorHandlingPolicies .proceedWithAllProblems(), - settings, requestor, + new CompilerOptions(settings), requestor, new DefaultProblemFactory(Locale .getDefault())); compiler.compile(new ICompilationUnit[] { unit }); @@ -526,6 +498,14 @@ public class CompilationChecker { return prob; } + /** + * Performs compiler error check. + * @param sourceName - name of the class + * @param source - source code + * @param settings - compiler options + * @param classLoader - custom classloader which can load all dependencies + * @return IProblem[] - list of compiler errors and warnings + */ public IProblem[] getErrors(String sourceName, String source, Map settings, URLClassLoader classLoader) { fileName = sourceName; @@ -536,21 +516,6 @@ public class CompilationChecker { compileMeQuitely(generateCompilationUnit(), settings); // System.out.println("getErrors(), Done."); -// if (prob.length > 0) { -// Object[][] data = new Object[prob.length][10]; -// for (int i = 0; i < data.length; i++) { -// IProblem p = prob[i]; -// // data[i] = new -// // Object[]{p.getMessage(),p.getSourceLineNumber(),p.isError(),p}; -// data[i] = new Object[] { p.getOriginatingFileName(), -// p.getMessage(), p.getID(), p.getArguments(), 0, -// p.getSourceStart(), p.getSourceEnd(), -// p.getSourceLineNumber(), p.isError(), p.isWarning() }; -// -// } -// -// return data; -// } return prob; } From 9fc005d7946c64e835acbb45d97b1aabce45692a Mon Sep 17 00:00:00 2001 From: Manindra Moharana Date: Mon, 14 Jul 2014 23:40:18 +0530 Subject: [PATCH 25/88] refactoring can now be undone with one undo --- pdex/src/processing/mode/experimental/ASTGenerator.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/pdex/src/processing/mode/experimental/ASTGenerator.java b/pdex/src/processing/mode/experimental/ASTGenerator.java index e568ff6ae..614cd2b9e 100644 --- a/pdex/src/processing/mode/experimental/ASTGenerator.java +++ b/pdex/src/processing/mode/experimental/ASTGenerator.java @@ -2020,6 +2020,7 @@ public class ASTGenerator { pdeOffsets[i][2] = awrap.getPDECodeOffsetForSN(this); } + editor.startCompoundEdit(); for (int i = 0; i < defCU.getChildCount(); i++) { ASTNodeWrapper awrap = (ASTNodeWrapper) ((DefaultMutableTreeNode) (defCU .getChildAt(i))).getUserObject(); @@ -2043,6 +2044,7 @@ public class ASTGenerator { //int k = JOptionPane.showConfirmDialog(new JFrame(), "Rename?","", JOptionPane.INFORMATION_MESSAGE); editor.ta.setSelectedText(newName); } + editor.stopCompoundEdit(); errorCheckerService.resumeThread(); editor.getSketch().setModified(true); errorCheckerService.runManualErrorCheck(); From 2ea3d589d507a535b85ad6b8437b9ff09c69420a Mon Sep 17 00:00:00 2001 From: Manindra Moharana Date: Mon, 14 Jul 2014 23:40:56 +0530 Subject: [PATCH 26/88] updated todo --- pdex/todo.txt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/pdex/todo.txt b/pdex/todo.txt index 29487b765..15ef9c206 100644 --- a/pdex/todo.txt +++ b/pdex/todo.txt @@ -20,7 +20,9 @@ Critical Bugs Misc Tasks ---------- --[ ] Trim CompilationChecker class +-[x] Trim CompilationChecker class + +-[x] Refactoring should support single undo Normal Bugs From f593b59bf067dc3afd3ebb58bf7362245d4b40d7 Mon Sep 17 00:00:00 2001 From: Manindra Moharana Date: Mon, 14 Jul 2014 23:49:38 +0530 Subject: [PATCH 27/88] commented out debug messages --- .../experimental/ErrorCheckerService.java | 16 +++++----- .../experimental/ErrorMessageSimplifier.java | 14 ++++---- .../mode/experimental/OffsetMatcher.java | 32 +++++++++---------- 3 files changed, 31 insertions(+), 31 deletions(-) diff --git a/pdex/src/processing/mode/experimental/ErrorCheckerService.java b/pdex/src/processing/mode/experimental/ErrorCheckerService.java index dbaba3d94..f69cacb78 100644 --- a/pdex/src/processing/mode/experimental/ErrorCheckerService.java +++ b/pdex/src/processing/mode/experimental/ErrorCheckerService.java @@ -404,7 +404,7 @@ public class ErrorCheckerService implements Runnable{ * Triggers error check */ public void runManualErrorCheck() { - log("Error Check."); + // log("Error Check."); textModified.incrementAndGet(); } @@ -418,7 +418,7 @@ public class ErrorCheckerService implements Runnable{ public void insertUpdate(DocumentEvent e) { if (ExperimentalMode.errorCheckEnabled){ runManualErrorCheck(); - log("doc insert update, man error check.."); + //log("doc insert update, man error check.."); } } @@ -426,7 +426,7 @@ public class ErrorCheckerService implements Runnable{ public void removeUpdate(DocumentEvent e) { if (ExperimentalMode.errorCheckEnabled){ runManualErrorCheck(); - log("doc remove update, man error check.."); + //log("doc remove update, man error check.."); } } @@ -434,7 +434,7 @@ public class ErrorCheckerService implements Runnable{ public void changedUpdate(DocumentEvent e) { if (ExperimentalMode.errorCheckEnabled){ runManualErrorCheck(); - log("doc changed update, man error check.."); + //log("doc changed update, man error check.."); } } @@ -699,8 +699,8 @@ public class ErrorCheckerService implements Runnable{ // Code in pde tabs stored as PlainDocument PlainDocument pdeTabs[] = new PlainDocument[editor.getSketch() .getCodeCount()]; - log("calcPDEOffsetsForProbList() mco: " + mainClassOffset + " CU state: " - + compilationUnitState); +// log("calcPDEOffsetsForProbList() mco: " + mainClassOffset + " CU state: " +// + compilationUnitState); javaSource.insertString(0, sourceCode, null); for (int i = 0; i < pdeTabs.length; i++) { @@ -725,8 +725,8 @@ public class ErrorCheckerService implements Runnable{ for (Problem p : problemsList) { int prbStart = p.getIProblem().getSourceStart() - pkgNameOffset, prbEnd = p .getIProblem().getSourceEnd() - pkgNameOffset; - log(p.toString()); - log("IProblem Start " + prbStart + ", End " + prbEnd); + // log(p.toString()); + // log("IProblem Start " + prbStart + ", End " + prbEnd); int javaLineNumber = p.getSourceLineNumber() - ((compilationUnitState != 2) ? 1 : 2); Element lineElement = javaSource.getDefaultRootElement() diff --git a/pdex/src/processing/mode/experimental/ErrorMessageSimplifier.java b/pdex/src/processing/mode/experimental/ErrorMessageSimplifier.java index 2f6f2bcf8..eec97986e 100644 --- a/pdex/src/processing/mode/experimental/ErrorMessageSimplifier.java +++ b/pdex/src/processing/mode/experimental/ErrorMessageSimplifier.java @@ -64,12 +64,12 @@ public class ErrorMessageSimplifier { return null; IProblem iprob = problem.getIProblem(); String args[] = iprob.getArguments(); - log("Simplifying message: " + problem.getMessage() + " ID: " - + getIDName(iprob.getID())); - log("Arg count: " + args.length); - for (int i = 0; i < args.length; i++) { - log("Arg " + args[i]); - } +// log("Simplifying message: " + problem.getMessage() + " ID: " +// + getIDName(iprob.getID())); +// log("Arg count: " + args.length); +// for (int i = 0; i < args.length; i++) { +// log("Arg " + args[i]); +// } String result = null; switch (iprob.getID()) { @@ -151,7 +151,7 @@ public class ErrorMessageSimplifier { break; } - log("Simplified Error Msg: " + result); +// log("Simplified Error Msg: " + result); if (result == null) return problem.getMessage(); return result; diff --git a/pdex/src/processing/mode/experimental/OffsetMatcher.java b/pdex/src/processing/mode/experimental/OffsetMatcher.java index ef907b50d..afc9f6f23 100644 --- a/pdex/src/processing/mode/experimental/OffsetMatcher.java +++ b/pdex/src/processing/mode/experimental/OffsetMatcher.java @@ -42,7 +42,7 @@ public class OffsetMatcher { if(pdeCodeLine.trim().equals(javaCodeLine.trim())){ //TODO: trim() needed here? matchingNeeded = false; offsetMatch = new ArrayList(); - log("Offset Matching not needed"); + //log("Offset Matching not needed"); } else { @@ -61,25 +61,25 @@ public class OffsetMatcher { } public int getPdeOffForJavaOff(int start, int length) { - log("PDE :" + pdeCodeLine + "\nJAVA:" + javaCodeLine); + // log("PDE :" + pdeCodeLine + "\nJAVA:" + javaCodeLine); if(!matchingNeeded) return start; int ans = getPdeOffForJavaOff(start), end = getPdeOffForJavaOff(start + length - 1); - log(start + " java start off, pde start off " - + ans); - log((start + length - 1) + " java end off, pde end off " - + end); - log("J: " + javaCodeLine.substring(start, start + length) + "\nP: " - + pdeCodeLine.substring(ans, end + 1)); +// log(start + " java start off, pde start off " +// + ans); +// log((start + length - 1) + " java end off, pde end off " +// + end); +// log("J: " + javaCodeLine.substring(start, start + length) + "\nP: " +// + pdeCodeLine.substring(ans, end + 1)); return ans; } public int getJavaOffForPdeOff(int start, int length) { if(!matchingNeeded) return start; int ans = getJavaOffForPdeOff(start); - log(start + " pde start off, java start off " - + getJavaOffForPdeOff(start)); - log((start + length - 1) + " pde end off, java end off " - + getJavaOffForPdeOff(start + length - 1)); +// log(start + " pde start off, java start off " +// + getJavaOffForPdeOff(start)); +// log((start + length - 1) + " pde end off, java end off " +// + getJavaOffForPdeOff(start + length - 1)); return ans; } @@ -91,8 +91,8 @@ public class OffsetMatcher { } else if (offsetMatch.get(i).javaOffset == javaOff) { // int j = i; while (offsetMatch.get(--i).javaOffset == javaOff) { - log("MP " + offsetMatch.get(i).javaOffset + " " - + offsetMatch.get(i).pdeOffset); +// log("MP " + offsetMatch.get(i).javaOffset + " " +// + offsetMatch.get(i).pdeOffset); } int pdeOff = offsetMatch.get(++i).pdeOffset; while (i > 0 && offsetMatch.get(--i).pdeOffset == pdeOff); @@ -140,8 +140,8 @@ public class OffsetMatcher { // word2 = reverse(word2); int len1 = pdeCodeLine.length(); int len2 = javaCodeLine.length(); - log(pdeCodeLine + " len: " + len1); - log(javaCodeLine + " len: " + len2); + // log(pdeCodeLine + " len: " + len1); + // log(javaCodeLine + " len: " + len2); // len1+1, len2+1, because finally return dp[len1][len2] int[][] dp = new int[len1 + 1][len2 + 1]; From afd66fb818e08f5659a5314302e700f76b95b9b8 Mon Sep 17 00:00:00 2001 From: Manindra Moharana Date: Tue, 15 Jul 2014 00:01:19 +0530 Subject: [PATCH 28/88] updated todo --- pdex/todo.txt | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/pdex/todo.txt b/pdex/todo.txt index 15ef9c206..b8d2c6d7e 100644 --- a/pdex/todo.txt +++ b/pdex/todo.txt @@ -24,6 +24,12 @@ Misc Tasks -[x] Refactoring should support single undo +Import Suggestion +----------------- + +-[ ] Ignore case while looking for classname + +-[ ] Prevent running into a suggestion loop Normal Bugs ----------- From 72b95f671131950a689f847c22f889fc00d0723d Mon Sep 17 00:00:00 2001 From: Jakub Valtar Date: Tue, 15 Jul 2014 00:38:54 +0200 Subject: [PATCH 29/88] fixes #2619 After a call to get()/set(), pixels array has been treated as up-to-date even though user has been drawing. Because of this, loadPixels() was not updating pixels array with changes. --- core/src/processing/opengl/PGraphicsOpenGL.java | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/core/src/processing/opengl/PGraphicsOpenGL.java b/core/src/processing/opengl/PGraphicsOpenGL.java index f177bfa67..643e63343 100644 --- a/core/src/processing/opengl/PGraphicsOpenGL.java +++ b/core/src/processing/opengl/PGraphicsOpenGL.java @@ -379,8 +379,8 @@ public class PGraphicsOpenGL extends PGraphics { /** PImage that wraps filterTexture. */ protected PImage filterImage; - /** Flag to indicate if the user is manipulating the - * pixels array through the set()/get() methods */ + /** Flag to indicate that pixels array is up-to-date and + * ready to be manipulated through the set()/get() methods */ protected boolean setgetPixels; // ........................................................ @@ -2133,6 +2133,9 @@ public class PGraphicsOpenGL extends PGraphics { shape = kind; inGeo.clear(); + // We are going to draw, pixels won't be up-to-date anymore. + setgetPixels = false; + curveVertexCount = 0; breakShape = false; defaultEdges = true; @@ -5447,6 +5450,9 @@ public class PGraphicsOpenGL extends PGraphics { readPixels(); } + // Pixels are now up-to-date, set the flag. + setgetPixels = true; + if (needEndDraw) { endDraw(); } @@ -5566,7 +5572,6 @@ public class PGraphicsOpenGL extends PGraphics { @Override public int get(int x, int y) { loadPixels(); - setgetPixels = true; return super.get(x, y); } @@ -5576,7 +5581,6 @@ public class PGraphicsOpenGL extends PGraphics { int sourceWidth, int sourceHeight, PImage target, int targetX, int targetY) { loadPixels(); - setgetPixels = true; super.getImpl(sourceX, sourceY, sourceWidth, sourceHeight, target, targetX, targetY); } @@ -5585,7 +5589,6 @@ public class PGraphicsOpenGL extends PGraphics { @Override public void set(int x, int y, int argb) { loadPixels(); - setgetPixels = true; super.set(x, y, argb); } @@ -5596,7 +5599,6 @@ public class PGraphicsOpenGL extends PGraphics { int sourceWidth, int sourceHeight, int targetX, int targetY) { loadPixels(); - setgetPixels = true; super.setImpl(sourceImage, sourceX, sourceY, sourceWidth, sourceHeight, targetX, targetY); // do we need this? From b38f5b6c12fd784e7c7677cf869937c5cb69c531 Mon Sep 17 00:00:00 2001 From: Manindra Moharana Date: Tue, 15 Jul 2014 06:08:27 +0530 Subject: [PATCH 30/88] Sketch menu update, added Tweak --- .../mode/experimental/DebugEditor.java | 59 +++++++++++++------ .../mode/experimental/ExperimentalMode.java | 18 +++--- 2 files changed, 52 insertions(+), 25 deletions(-) diff --git a/pdex/src/processing/mode/experimental/DebugEditor.java b/pdex/src/processing/mode/experimental/DebugEditor.java index b56310c5c..ab116429a 100755 --- a/pdex/src/processing/mode/experimental/DebugEditor.java +++ b/pdex/src/processing/mode/experimental/DebugEditor.java @@ -82,6 +82,7 @@ import processing.app.syntax.JEditTextArea; import processing.app.syntax.PdeTextAreaDefaults; import processing.core.PApplet; import processing.mode.java.JavaEditor; +import processing.mode.java.JavaToolbar; /** * Main View Class. Handles the editor window including tool bar and menu. Has @@ -568,22 +569,7 @@ public class DebugEditor extends JavaEditor implements ActionListener { debugMenu.add(printThreads); debugMenu.addSeparator(); debugMenu.add(toggleVariableInspectorMenuItem); - debugMenu.addSeparator(); - - // TweakMode code - enableTweakCB = new JCheckBoxMenuItem("Tweak Enabled"); - enableTweakCB.setSelected(ExperimentalMode.enableTweak); - enableTweakCB.addActionListener(new ActionListener() { - - @Override - public void actionPerformed(ActionEvent e) { - ExperimentalMode.enableTweak = ((JCheckBoxMenuItem) e - .getSource()).isSelected(); - dmode.savePreferences(); - } - }); - debugMenu.add(enableTweakCB); - // TweakMode code end + // debugMenu.addSeparator(); // XQMode menu items /* @@ -691,6 +677,45 @@ public class DebugEditor extends JavaEditor implements ActionListener { public JMenu buildModeMenu() { return buildDebugMenu(); } + + public JMenu buildSketchMenu() { + JMenuItem runItem = Toolkit.newJMenuItem(DebugToolbar + .getTitle(DebugToolbar.RUN, false), 'R'); + runItem.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + handleRun(); + } + }); + + JMenuItem presentItem = Toolkit.newJMenuItemShift(DebugToolbar + .getTitle(DebugToolbar.RUN, true), 'R'); + presentItem.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + handlePresent(); + } + }); + + JMenuItem stopItem = new JMenuItem(DebugToolbar.getTitle(DebugToolbar.STOP, + false)); + stopItem.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + handleStop(); + } + }); + + JMenuItem enableTweak = Toolkit.newJMenuItemShift("Tweak", 'T'); + enableTweak.setSelected(ExperimentalMode.enableTweak); + enableTweak.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + ExperimentalMode.enableTweak = true; + handleRun(); + } + }); + + return buildSketchMenu(new JMenuItem[] { + runItem, presentItem, enableTweak, stopItem }); + } /** * Callback for menu items. Implementation of Swing ActionListener. @@ -1761,7 +1786,7 @@ public class DebugEditor extends JavaEditor implements ActionListener { /** * Show warnings menu item */ - protected JCheckBoxMenuItem enableTweakCB; + //protected JCheckBoxMenuItem enableTweakCB; String[] baseCode; diff --git a/pdex/src/processing/mode/experimental/ExperimentalMode.java b/pdex/src/processing/mode/experimental/ExperimentalMode.java index c87f73cd8..a4ca9d71a 100755 --- a/pdex/src/processing/mode/experimental/ExperimentalMode.java +++ b/pdex/src/processing/mode/experimental/ExperimentalMode.java @@ -178,8 +178,8 @@ public class ExperimentalMode extends JavaMode { defaultAutoSaveEnabled = Preferences.getBoolean(prefDefaultAutoSave); ccTriggerEnabled = Preferences.getBoolean(prefCCTriggerEnabled); - // TweakMode code - enableTweak = Preferences.getBoolean(prefEnableTweak); + // TweakMode code - not a sticky preference anymore + // enableTweak = Preferences.getBoolean(prefEnableTweak); } public void savePreferences() { @@ -196,8 +196,8 @@ public class ExperimentalMode extends JavaMode { Preferences.setBoolean(prefDefaultAutoSave, defaultAutoSaveEnabled); Preferences.setBoolean(prefCCTriggerEnabled, ccTriggerEnabled); - // TweakMode code - Preferences.setBoolean(prefEnableTweak, enableTweak); + // TweakMode code - not a sticky preference anymore + // Preferences.setBoolean(prefEnableTweak, enableTweak); } public void ensurePrefsExist() { @@ -225,10 +225,10 @@ public class ExperimentalMode extends JavaMode { if (Preferences.get(prefCCTriggerEnabled) == null) Preferences.setBoolean(prefCCTriggerEnabled, ccTriggerEnabled); - // TweakMode code - if (Preferences.get(prefEnableTweak) == null) { - Preferences.setBoolean(prefEnableTweak, enableTweak); - } + // TweakMode code - not a sticky preference anymore +// if (Preferences.get(prefEnableTweak) == null) { +// Preferences.setBoolean(prefEnableTweak, enableTweak); +// } } @@ -343,6 +343,7 @@ public class ExperimentalMode extends JavaMode { public Runner handleRun(Sketch sketch, RunnerListener listener) throws SketchException { if (enableTweak) { + enableTweak = false; return handleTweakPresentOrRun(sketch, listener, false); } else { @@ -366,6 +367,7 @@ public class ExperimentalMode extends JavaMode { public Runner handlePresent(Sketch sketch, RunnerListener listener) throws SketchException { if (enableTweak) { + enableTweak = false; return handleTweakPresentOrRun(sketch, listener, true); } else { From ceebc1498419f7164bc5e8c25db65477d7b61fba Mon Sep 17 00:00:00 2001 From: Manindra Moharana Date: Tue, 15 Jul 2014 06:12:33 +0530 Subject: [PATCH 31/88] avoid NPE while running Tweak --- pdex/src/processing/mode/experimental/ErrorCheckerService.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/pdex/src/processing/mode/experimental/ErrorCheckerService.java b/pdex/src/processing/mode/experimental/ErrorCheckerService.java index f69cacb78..8956de542 100644 --- a/pdex/src/processing/mode/experimental/ErrorCheckerService.java +++ b/pdex/src/processing/mode/experimental/ErrorCheckerService.java @@ -360,6 +360,9 @@ public class ErrorCheckerService implements Runnable{ protected void updateSketchCodeListeners() { for (final SketchCode sc : editor.getSketch().getCode()) { boolean flag = false; + if (sc.getDocument() == null + || ((SyntaxDocument) sc.getDocument()).getDocumentListeners() == null) + continue; for (DocumentListener dl : ((SyntaxDocument)sc.getDocument()).getDocumentListeners()) { if(dl.equals(sketchChangedListener)){ flag = true; From eeee483e7a4b20e590d8132aacf7aa60ea3ecb05 Mon Sep 17 00:00:00 2001 From: Manindra Moharana Date: Tue, 15 Jul 2014 06:31:06 +0530 Subject: [PATCH 32/88] Removed Window menu from Sketch menu --- app/src/processing/app/Editor.java | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/app/src/processing/app/Editor.java b/app/src/processing/app/Editor.java index ae90ba51f..8c08b09a7 100644 --- a/app/src/processing/app/Editor.java +++ b/app/src/processing/app/Editor.java @@ -902,8 +902,6 @@ public abstract class Editor extends JFrame implements RunnerListener { // Menu Listener that populates the menu only when the menu is opened List menuList = new ArrayList(); - JMenu windowMenu = new JMenu("Window"); - @Override public void menuSelected(MenuEvent event) { JMenuItem item; @@ -928,19 +926,18 @@ public abstract class Editor extends JFrame implements RunnerListener { editor.toFront(); } }); - windowMenu.add(item); + sketchMenu.add(item); menuList.add(item); } - sketchMenu.add(windowMenu); + // sketchMenu.add(windowMenu); } @Override public void menuDeselected(MenuEvent event) { for (JMenuItem item : menuList) { - windowMenu.remove(item); + sketchMenu.remove(item); } menuList.clear(); - sketchMenu.remove(windowMenu); } @Override From dd000f79895872717c72ebab8e57db2a6f87a29a Mon Sep 17 00:00:00 2001 From: Manindra Moharana Date: Tue, 15 Jul 2014 06:34:55 +0530 Subject: [PATCH 33/88] nope, dont need you --- app/src/processing/app/Editor.java | 1 - 1 file changed, 1 deletion(-) diff --git a/app/src/processing/app/Editor.java b/app/src/processing/app/Editor.java index 8c08b09a7..f29b8d967 100644 --- a/app/src/processing/app/Editor.java +++ b/app/src/processing/app/Editor.java @@ -929,7 +929,6 @@ public abstract class Editor extends JFrame implements RunnerListener { sketchMenu.add(item); menuList.add(item); } - // sketchMenu.add(windowMenu); } @Override From 78c8cee520c27e0751b8b2c8c8c837ef7705a05b Mon Sep 17 00:00:00 2001 From: Manindra Moharana Date: Tue, 15 Jul 2014 07:28:08 +0530 Subject: [PATCH 34/88] Tab outline, SO's little bro --- .../mode/experimental/ASTGenerator.java | 5 +- .../mode/experimental/TabOutline.java | 302 ++++++++++++++++++ 2 files changed, 305 insertions(+), 2 deletions(-) create mode 100644 pdex/src/processing/mode/experimental/TabOutline.java diff --git a/pdex/src/processing/mode/experimental/ASTGenerator.java b/pdex/src/processing/mode/experimental/ASTGenerator.java index 614cd2b9e..fe249c059 100644 --- a/pdex/src/processing/mode/experimental/ASTGenerator.java +++ b/pdex/src/processing/mode/experimental/ASTGenerator.java @@ -2327,8 +2327,9 @@ public class ASTGenerator { protected SketchOutline sketchOutline; protected void showSketchOutline(){ - sketchOutline = new SketchOutline(codeTree, errorCheckerService); - sketchOutline.show(); + //sketchOutline = new SketchOutline(codeTree, errorCheckerService); + //sketchOutline.show(); + new TabOutline(errorCheckerService).show(); } public int javaCodeOffsetToLineStartOffset(int line, int jOffset){ diff --git a/pdex/src/processing/mode/experimental/TabOutline.java b/pdex/src/processing/mode/experimental/TabOutline.java new file mode 100644 index 000000000..7a866f149 --- /dev/null +++ b/pdex/src/processing/mode/experimental/TabOutline.java @@ -0,0 +1,302 @@ +package processing.mode.experimental; + +import java.awt.Dimension; +import java.awt.Point; +import java.awt.event.KeyAdapter; +import java.awt.event.KeyEvent; +import java.awt.event.WindowEvent; +import java.awt.event.WindowFocusListener; + +import javax.swing.BoxLayout; +import javax.swing.JFrame; +import javax.swing.JPanel; +import javax.swing.JScrollPane; +import javax.swing.JTextField; +import javax.swing.JTree; +import javax.swing.ScrollPaneConstants; +import javax.swing.SwingWorker; +import javax.swing.event.DocumentEvent; +import javax.swing.event.DocumentListener; +import javax.swing.event.TreeSelectionEvent; +import javax.swing.event.TreeSelectionListener; +import javax.swing.tree.DefaultMutableTreeNode; +import javax.swing.tree.DefaultTreeModel; +import javax.swing.tree.TreeSelectionModel; + +import processing.app.SketchCode; +import static processing.mode.experimental.ExperimentalMode.log; + +public class TabOutline { + protected JFrame frmOutlineView; + + protected JScrollPane jsp; + + protected DefaultMutableTreeNode tabNode, tempNode; + + protected JTree tabTree; + + protected JTextField searchField; + + protected DebugEditor editor; + + protected ErrorCheckerService errorCheckerService; + + protected boolean internalSelection = false; + + public TabOutline(ErrorCheckerService ecs) { + errorCheckerService = ecs; + editor = ecs.getEditor(); + createAndShowGUI(); + } + + private void createAndShowGUI() { + frmOutlineView = new JFrame(); + frmOutlineView.setAlwaysOnTop(true); + frmOutlineView.setUndecorated(true); + Point tp = errorCheckerService.getEditor().ta.getLocationOnScreen(); + + int minWidth = (int) (editor.getMinimumSize().width * 0.7f), maxWidth = (int) (editor + .getMinimumSize().width * 0.9f); + frmOutlineView.setLayout(new BoxLayout(frmOutlineView.getContentPane(), + BoxLayout.Y_AXIS)); + JPanel panelTop = new JPanel(), panelBottom = new JPanel(); + panelTop.setLayout(new BoxLayout(panelTop, BoxLayout.Y_AXIS)); + panelBottom.setLayout(new BoxLayout(panelBottom, BoxLayout.Y_AXIS)); + searchField = new JTextField(); + searchField.setMinimumSize(new Dimension(minWidth, 25)); + panelTop.add(searchField); + + jsp = new JScrollPane(); + populateTabTree(); + jsp.setViewportView(tabTree); + jsp.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED); + jsp.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED); + jsp.setMinimumSize(new Dimension(minWidth, editor.ta.getHeight() - 10)); + jsp.setMaximumSize(new Dimension(maxWidth, editor.ta.getHeight() - 10)); + + panelBottom.add(jsp); + frmOutlineView.add(panelTop); + frmOutlineView.add(panelBottom); + frmOutlineView.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); + frmOutlineView.pack(); + frmOutlineView.setBounds(tp.x + + errorCheckerService.getEditor().ta + .getWidth() - minWidth, + tp.y, + minWidth, + estimateFrameHeight()); + frmOutlineView.setMinimumSize(new Dimension(minWidth, Math + .min(errorCheckerService.getEditor().ta.getHeight(), + frmOutlineView.getHeight()))); + frmOutlineView.setLocation(tp.x + + errorCheckerService.getEditor().ta + .getWidth() - frmOutlineView.getWidth(), + frmOutlineView.getY() + + (editor.ta.getHeight() - frmOutlineView + .getHeight()) / 2); + addListeners(); + } + + private void addListeners() { + searchField.addKeyListener(new KeyAdapter() { + public void keyPressed(KeyEvent evt) { + if (tabTree.getRowCount() == 0) + return; + + internalSelection = true; + + if (evt.getKeyCode() == KeyEvent.VK_ESCAPE) { + close(); + } else if (evt.getKeyCode() == KeyEvent.VK_ENTER) { + if (tabTree.getLastSelectedPathComponent() != null) { + DefaultMutableTreeNode tnode = (DefaultMutableTreeNode) tabTree + .getLastSelectedPathComponent(); + log("Enter Key, Tab: " + tnode); + switchToTab(tnode.toString()); + close(); + } + } else if (evt.getKeyCode() == KeyEvent.VK_UP) { + if (tabTree.getLastSelectedPathComponent() == null) { + tabTree.setSelectionRow(0); + return; + } + + int x = tabTree.getLeadSelectionRow() - 1; + int step = jsp.getVerticalScrollBar().getMaximum() + / tabTree.getRowCount(); + if (x == -1) { + x = tabTree.getRowCount() - 1; + jsp.getVerticalScrollBar().setValue(jsp.getVerticalScrollBar() + .getMaximum()); + } else { + jsp.getVerticalScrollBar().setValue((jsp.getVerticalScrollBar() + .getValue() - step)); + } + tabTree.setSelectionRow(x); + } else if (evt.getKeyCode() == KeyEvent.VK_DOWN) { + if (tabTree.getLastSelectedPathComponent() == null) { + tabTree.setSelectionRow(0); + return; + } + int x = tabTree.getLeadSelectionRow() + 1; + + int step = jsp.getVerticalScrollBar().getMaximum() + / tabTree.getRowCount(); + if (x == tabTree.getRowCount()) { + x = 0; + jsp.getVerticalScrollBar().setValue(jsp.getVerticalScrollBar() + .getMinimum()); + } else { + jsp.getVerticalScrollBar().setValue((jsp.getVerticalScrollBar() + .getValue() + step)); + } + tabTree.setSelectionRow(x); + } + } + }); + + searchField.getDocument().addDocumentListener(new DocumentListener() { + + public void insertUpdate(DocumentEvent e) { + updateSelection(); + } + + public void removeUpdate(DocumentEvent e) { + updateSelection(); + } + + public void changedUpdate(DocumentEvent e) { + updateSelection(); + } + + private void updateSelection() { + SwingWorker worker = new SwingWorker() { + protected Object doInBackground() throws Exception { + String text = searchField.getText().toLowerCase(); + tempNode = new DefaultMutableTreeNode(); + filterTree(text, tempNode, tabNode); + return null; + } + + protected void done() { + tabTree.setModel(new DefaultTreeModel(tempNode)); + ((DefaultTreeModel) tabTree.getModel()).reload(); +// for (int i = 0; i < tabTree.getRowCount(); i++) { +// tabTree.expandRow(i); +// } + internalSelection = true; + tabTree.setSelectionRow(0); + } + }; + worker.execute(); + } + }); + + tabTree.addTreeSelectionListener(new TreeSelectionListener() { + + public void valueChanged(TreeSelectionEvent e) { + + if (internalSelection) { + log("Internal selection"); + internalSelection = (false); + return; + } + // log(e); + SwingWorker worker = new SwingWorker() { + + protected Object doInBackground() throws Exception { + return null; + } + + protected void done() { + if (tabTree.getLastSelectedPathComponent() == null) { + return; + } + DefaultMutableTreeNode tnode = (DefaultMutableTreeNode) tabTree + .getLastSelectedPathComponent(); + log("Clicked " + tnode); + switchToTab(tnode.toString()); + close(); + } + }; + worker.execute(); + } + }); + + frmOutlineView.addWindowFocusListener(new WindowFocusListener() { + public void windowLostFocus(WindowEvent e) { + close(); + } + + public void windowGainedFocus(WindowEvent e) { + } + }); + } + + private void switchToTab(String tabName) { + for (SketchCode sc : editor.getSketch().getCode()) { + if (sc.getPrettyName().equals(tabName)) { + editor.getSketch().setCurrentCode(editor.getSketch().getCodeIndex(sc)); + } + } + } + + private void populateTabTree() { + tabNode = new DefaultMutableTreeNode("Tabs"); + for (SketchCode sc : editor.getSketch().getCode()) { + DefaultMutableTreeNode tab = new DefaultMutableTreeNode( + sc.getPrettyName()); + tabNode.add(tab); + } + tempNode = tabNode; + tabTree = new JTree(tabNode); + tabTree.getSelectionModel() + .setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION); + tabTree.setRootVisible(false); + tabTree.setSelectionRow(editor.getSketch().getCurrentCodeIndex()); + } + + protected boolean filterTree(String prefix, DefaultMutableTreeNode tree, + DefaultMutableTreeNode mainTree) { + if (mainTree.isLeaf()) { + return (mainTree.getUserObject().toString().toLowerCase() + .startsWith(prefix)); + } + + boolean found = false; + for (int i = 0; i < mainTree.getChildCount(); i++) { + DefaultMutableTreeNode tNode = new DefaultMutableTreeNode( + ((DefaultMutableTreeNode) mainTree + .getChildAt(i)) + .getUserObject()); + if (filterTree(prefix, tNode, + (DefaultMutableTreeNode) mainTree.getChildAt(i))) { + found = true; + tree.add(tNode); + } + } + return found; + } + + private int estimateFrameHeight(){ + // Assuming each tree node height to be 25 pixels + return Math.min(20 * (editor.getSketch().getCodeCount() + 1), + frmOutlineView.getHeight()); +// return Math.min(editor.ta.getHeight(), +// frmOutlineView.getHeight()); + } + + public void show() { + frmOutlineView.setVisible(true); + } + + public void close() { + frmOutlineView.setVisible(false); + frmOutlineView.dispose(); + } + + public boolean isVisible() { + return frmOutlineView.isVisible(); + } + +} From 3c79c5f2c794ed3e8cea1c7142c30fe5987c6363 Mon Sep 17 00:00:00 2001 From: Manindra Moharana Date: Tue, 15 Jul 2014 07:34:00 +0530 Subject: [PATCH 35/88] Tab outline stuff --- .../processing/mode/experimental/ASTGenerator.java | 7 +++++-- .../processing/mode/experimental/DebugEditor.java | 13 +++++++++++-- .../processing/mode/experimental/TabOutline.java | 6 +++--- 3 files changed, 19 insertions(+), 7 deletions(-) diff --git a/pdex/src/processing/mode/experimental/ASTGenerator.java b/pdex/src/processing/mode/experimental/ASTGenerator.java index fe249c059..971700b50 100644 --- a/pdex/src/processing/mode/experimental/ASTGenerator.java +++ b/pdex/src/processing/mode/experimental/ASTGenerator.java @@ -2327,8 +2327,11 @@ public class ASTGenerator { protected SketchOutline sketchOutline; protected void showSketchOutline(){ - //sketchOutline = new SketchOutline(codeTree, errorCheckerService); - //sketchOutline.show(); + sketchOutline = new SketchOutline(codeTree, errorCheckerService); + sketchOutline.show(); + } + + protected void showTabOutline(){ new TabOutline(errorCheckerService).show(); } diff --git a/pdex/src/processing/mode/experimental/DebugEditor.java b/pdex/src/processing/mode/experimental/DebugEditor.java index ab116429a..3985a6c6f 100755 --- a/pdex/src/processing/mode/experimental/DebugEditor.java +++ b/pdex/src/processing/mode/experimental/DebugEditor.java @@ -183,7 +183,7 @@ public class DebugEditor extends JavaEditor implements ActionListener { /** * Show outline view */ - protected JMenuItem showOutline; + protected JMenuItem showOutline, showTabOutline; /** * Enable/Disable error logging @@ -670,6 +670,11 @@ public class DebugEditor extends JavaEditor implements ActionListener { showOutline.addActionListener(this); debugMenu.add(showOutline); + showTabOutline = Toolkit.newJMenuItem("Show Outline", KeyEvent.VK_SEMICOLON); + showTabOutline.addActionListener(this); + debugMenu.add(showTabOutline); + + return debugMenu; } @@ -773,9 +778,13 @@ public class DebugEditor extends JavaEditor implements ActionListener { Logger.getLogger(DebugEditor.class.getName()).log(Level.INFO, "Invoked 'Toggle Variable Inspector' menu item"); toggleVariableInspector(); } else if (source.equals(showOutline)){ - log("Show Outline :D"); + log("Show Sketch Outline:"); errorCheckerService.getASTGenerator().showSketchOutline(); } + else if (source.equals(showTabOutline)){ + log("Show Tab Outline:"); + errorCheckerService.getASTGenerator().showTabOutline(); + } } // @Override diff --git a/pdex/src/processing/mode/experimental/TabOutline.java b/pdex/src/processing/mode/experimental/TabOutline.java index 7a866f149..bb8f75302 100644 --- a/pdex/src/processing/mode/experimental/TabOutline.java +++ b/pdex/src/processing/mode/experimental/TabOutline.java @@ -111,7 +111,7 @@ public class TabOutline { if (tabTree.getLastSelectedPathComponent() != null) { DefaultMutableTreeNode tnode = (DefaultMutableTreeNode) tabTree .getLastSelectedPathComponent(); - log("Enter Key, Tab: " + tnode); + //log("Enter Key, Tab: " + tnode); switchToTab(tnode.toString()); close(); } @@ -197,7 +197,7 @@ public class TabOutline { public void valueChanged(TreeSelectionEvent e) { if (internalSelection) { - log("Internal selection"); + //log("Internal selection"); internalSelection = (false); return; } @@ -214,7 +214,7 @@ public class TabOutline { } DefaultMutableTreeNode tnode = (DefaultMutableTreeNode) tabTree .getLastSelectedPathComponent(); - log("Clicked " + tnode); + //log("Clicked " + tnode); switchToTab(tnode.toString()); close(); } From 233c2a4c47db2e73f707ac91c14c91674a0c1204 Mon Sep 17 00:00:00 2001 From: Manindra Moharana Date: Tue, 15 Jul 2014 07:52:55 +0530 Subject: [PATCH 36/88] Tab outline shortcut update --- pdex/src/processing/mode/experimental/DebugEditor.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pdex/src/processing/mode/experimental/DebugEditor.java b/pdex/src/processing/mode/experimental/DebugEditor.java index 3985a6c6f..5d1a6aece 100755 --- a/pdex/src/processing/mode/experimental/DebugEditor.java +++ b/pdex/src/processing/mode/experimental/DebugEditor.java @@ -670,7 +670,7 @@ public class DebugEditor extends JavaEditor implements ActionListener { showOutline.addActionListener(this); debugMenu.add(showOutline); - showTabOutline = Toolkit.newJMenuItem("Show Outline", KeyEvent.VK_SEMICOLON); + showTabOutline = Toolkit.newJMenuItem("Show Outline", KeyEvent.VK_Y); showTabOutline.addActionListener(this); debugMenu.add(showTabOutline); From cad78e9b4aa6a64da8dc884f5d09bd6600ecaf4e Mon Sep 17 00:00:00 2001 From: Manindra Moharana Date: Tue, 15 Jul 2014 11:07:45 +0530 Subject: [PATCH 37/88] Error messages updated --- .../experimental/ErrorMessageSimplifier.java | 35 ++++++++++--------- 1 file changed, 19 insertions(+), 16 deletions(-) diff --git a/pdex/src/processing/mode/experimental/ErrorMessageSimplifier.java b/pdex/src/processing/mode/experimental/ErrorMessageSimplifier.java index eec97986e..27a8f47c6 100644 --- a/pdex/src/processing/mode/experimental/ErrorMessageSimplifier.java +++ b/pdex/src/processing/mode/experimental/ErrorMessageSimplifier.java @@ -72,6 +72,7 @@ public class ErrorMessageSimplifier { // } String result = null; + switch (iprob.getID()) { case IProblem.ParsingError: if (args.length > 0) { @@ -107,7 +108,8 @@ public class ErrorMessageSimplifier { break; case IProblem.UndefinedMethod: if (args.length > 2) { - result = "I don't know the function \"" + args[args.length - 2] + "\""; + result = "The method \"" + args[args.length - 2] + "(" + + getSimpleName(args[args.length - 1]) + ")\" doesn't exist"; } break; case IProblem.ParameterMismatch: @@ -118,42 +120,43 @@ public class ErrorMessageSimplifier { result = "The method \"" + args[1] + "\" doesn't expect any parameters"; } else { - result = "The method \"" + args[1] + "\" expects parameters (" + result = "The method \"" + args[1] + + "\" expects parameters like this: " + args[1] + "(" + getSimpleName(args[2]) + ")"; } } break; case IProblem.UndefinedField: if (args.length > 0) { - result = "I don't know the global variable \"" + args[0] + "\""; + result = "The global variable \"" + args[0] + "\" doesn't exist"; } break; case IProblem.UndefinedType: if (args.length > 0) { - result = "I don't know the class \"" + args[0] + "\""; + result = "The class \"" + args[0] + "\" doesn't exist"; } break; case IProblem.UnresolvedVariable: if (args.length > 0) { - result = "I can't recognize the variable \"" + args[0] + "\""; + result = "The variable \"" + args[0] + "\" doesn't exist"; } break; case IProblem.UndefinedName: if (args.length > 0) { - result = "I don't recognize the name \"" + args[0] + "\""; + result = "The name \"" + args[0] + "\" can't be recognized"; } break; case IProblem.TypeMismatch: if (args.length > 1) { - result = "You can't assign a \"" + getSimpleName(args[0]) - + "\" type to a \"" + getSimpleName(args[1]) + "\" type"; + result = "Type mismatch, \"" + getSimpleName(args[0]) + + "\" doesn't match with \"" + getSimpleName(args[1]) + "\""; } break; } // log("Simplified Error Msg: " + result); if (result == null) - return problem.getMessage(); + result = problem.getMessage(); return result; } @@ -189,25 +192,25 @@ public class ErrorMessageSimplifier { String result = null; switch (c) { case ';': - result = "You're missing a semi-colon \";\""; + result = "Missing a semi-colon \";\""; break; case '[': - result = "I sense a missing opening square bracket \"[\""; + result = "Missing opening square bracket \"[\""; break; case ']': - result = "Looks like you forgot to close your square bracket \"]\""; + result = "Missing closing square bracket \"]\""; break; case '(': - result = "I sense a missing opening parentheses \"(\""; + result = "Missing opening parentheses \"(\""; break; case ')': - result = "Looks like you forgot to close your parentheses \")\""; + result = "Missing closing parentheses \")\""; break; case '{': - result = "I sense a missing opening curly brace \"{\""; + result = "Missing opening curly bracket \"{\""; break; case '}': - result = "Looks like you forgot to close your curly brace \"}\""; + result = "Missing closing curly bracket \"}\""; break; default: result = "Consider adding a \"" + c + "\""; From fd8fd591351d18025e75c997c281185818f27ee3 Mon Sep 17 00:00:00 2001 From: Manindra Moharana Date: Tue, 15 Jul 2014 11:12:21 +0530 Subject: [PATCH 38/88] Disabling debug messages --- .../processing/mode/experimental/DebugEditor.java | 13 ++++++++----- .../mode/experimental/ErrorCheckerService.java | 11 ++++------- .../mode/experimental/ExperimentalMode.java | 2 +- 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/pdex/src/processing/mode/experimental/DebugEditor.java b/pdex/src/processing/mode/experimental/DebugEditor.java index 5d1a6aece..ad7664c35 100755 --- a/pdex/src/processing/mode/experimental/DebugEditor.java +++ b/pdex/src/processing/mode/experimental/DebugEditor.java @@ -195,6 +195,9 @@ public class DebugEditor extends JavaEditor implements ActionListener { */ protected JCheckBoxMenuItem completionsEnabled; + /** + * UNUSED. Disbaled for now. + */ protected AutoSaveUtil autosaver; public DebugEditor(Base base, String path, EditorState state, Mode mode) { @@ -813,7 +816,7 @@ public class DebugEditor extends JavaEditor implements ActionListener { */ @Override protected boolean handleOpenInternal(String path) { - log("handleOpenInternal, path: " + path); + // log("handleOpenInternal, path: " + path); boolean didOpen = super.handleOpenInternal(path); if (didOpen && dbg != null) { // should already been stopped (open calls handleStop) @@ -822,10 +825,10 @@ public class DebugEditor extends JavaEditor implements ActionListener { variableInspector().reset(); // clear contents of variable inspector } //if(didOpen){ - autosaver = new AutoSaveUtil(this, ExperimentalMode.autoSaveInterval); // this is used instead of loadAutosaver(), temp measure - //loadAutoSaver(); - viewingAutosaveBackup = autosaver.isAutoSaveBackup(); - log("handleOpenInternal, viewing autosave? " + viewingAutosaveBackup); + // autosaver = new AutoSaveUtil(this, ExperimentalMode.autoSaveInterval); // this is used instead of loadAutosaver(), temp measure + // loadAutoSaver(); + // viewingAutosaveBackup = autosaver.isAutoSaveBackup(); + // log("handleOpenInternal, viewing autosave? " + viewingAutosaveBackup); //} return didOpen; } diff --git a/pdex/src/processing/mode/experimental/ErrorCheckerService.java b/pdex/src/processing/mode/experimental/ErrorCheckerService.java index 8956de542..9417ee3de 100644 --- a/pdex/src/processing/mode/experimental/ErrorCheckerService.java +++ b/pdex/src/processing/mode/experimental/ErrorCheckerService.java @@ -370,7 +370,7 @@ public class ErrorCheckerService implements Runnable{ } } if(!flag){ - log("Adding doc listener to " + sc.getPrettyName()); + // log("Adding doc listener to " + sc.getPrettyName()); sc.getDocument().addDocumentListener(sketchChangedListener); } } @@ -446,15 +446,13 @@ public class ErrorCheckerService implements Runnable{ public int compilationUnitState = 0; protected boolean checkCode() { - //log("checkCode() " + textModified.get() ); - log("checkCode() " + textModified.get()); + // log("checkCode() " + textModified.get()); lastTimeStamp = System.currentTimeMillis(); try { sourceCode = preprocessCode(editor.getSketch().getMainProgram()); compilationUnitState = 0; syntaxCheck(); - log(editor.getSketch().getName() + "1 MCO " - + mainClassOffset); + // log(editor.getSketch().getName() + "1 MCO " + mainClassOffset); // No syntax errors, proceed for compilation check, Stage 2. //if(hasSyntaxErrors()) astGenerator.buildAST(null); @@ -474,8 +472,7 @@ public class ErrorCheckerService implements Runnable{ // log(sourceCode); // log("--------------------------"); compileCheck(); - log(editor.getSketch().getName() + "2 MCO " - + mainClassOffset); + // log(editor.getSketch().getName() + "2 MCO " + mainClassOffset); } astGenerator.buildAST(cu); diff --git a/pdex/src/processing/mode/experimental/ExperimentalMode.java b/pdex/src/processing/mode/experimental/ExperimentalMode.java index a4ca9d71a..dda9d116a 100755 --- a/pdex/src/processing/mode/experimental/ExperimentalMode.java +++ b/pdex/src/processing/mode/experimental/ExperimentalMode.java @@ -289,7 +289,7 @@ public class ExperimentalMode extends JavaMode { + "field_protected_obj.png"); localVarIcon = new ImageIcon(iconPath + File.separator + "field_default_obj.png"); - log("Icons loaded"); + // log("Icons loaded"); } From 98ad9ffd047f3bce9d8aa6e165605fb76908be4c Mon Sep 17 00:00:00 2001 From: Manindra Moharana Date: Tue, 15 Jul 2014 11:14:11 +0530 Subject: [PATCH 39/88] Disabling debug messages.. --- .../mode/experimental/ASTGenerator.java | 68 +++++++++---------- 1 file changed, 34 insertions(+), 34 deletions(-) diff --git a/pdex/src/processing/mode/experimental/ASTGenerator.java b/pdex/src/processing/mode/experimental/ASTGenerator.java index 971700b50..fe8d8c3f2 100644 --- a/pdex/src/processing/mode/experimental/ASTGenerator.java +++ b/pdex/src/processing/mode/experimental/ASTGenerator.java @@ -2612,7 +2612,7 @@ public class ASTGenerator { // WARNING: You're entering the Rube Goldberg territory of Experimental Mode. // To debug this code, thou must take the Recursive Leap of Faith. - log("entering --findDeclaration1 -- " + findMe.toString()); + // log("entering --findDeclaration1 -- " + findMe.toString()); ASTNode declaringClass = null; ASTNode parent = findMe.getParent(); ASTNode ret = null; @@ -2628,8 +2628,8 @@ public class ASTGenerator { if (exp != null) { constrains.add(ASTNode.TYPE_DECLARATION); - log("MI EXP: " + exp.toString() + " of type " - + exp.getClass().getName() + " parent: " + exp.getParent()); +// log("MI EXP: " + exp.toString() + " of type " +// + exp.getClass().getName() + " parent: " + exp.getParent()); if (exp instanceof MethodInvocation) { SimpleType stp = extracTypeInfo(findDeclaration(((MethodInvocation) exp) .getName())); @@ -2652,7 +2652,7 @@ public class ASTGenerator { if (stp == null) return null; declaringClass = findDeclaration(stp.getName()); - log("MI.SN " + getNodeAsString(declaringClass)); +// log("MI.SN " + getNodeAsString(declaringClass)); constrains.add(ASTNode.METHOD_DECLARATION); return definedIn(declaringClass, ((MethodInvocation) parent) .getName().toString(), constrains, declaringClass); @@ -2670,8 +2670,8 @@ public class ASTGenerator { if (exp != null) { constrains.add(ASTNode.TYPE_DECLARATION); - log("FA EXP: " + exp.toString() + " of type " - + exp.getClass().getName() + " parent: " + exp.getParent()); +// log("FA EXP: " + exp.toString() + " of type " +// + exp.getClass().getName() + " parent: " + exp.getParent()); if (exp instanceof MethodInvocation) { SimpleType stp = extracTypeInfo(findDeclaration(((MethodInvocation) exp) .getName())); @@ -2695,7 +2695,7 @@ public class ASTGenerator { if (stp == null) return null; declaringClass = findDeclaration(stp.getName()); - log("FA.SN " + getNodeAsString(declaringClass)); +// log("FA.SN " + getNodeAsString(declaringClass)); constrains.add(ASTNode.METHOD_DECLARATION); return definedIn(declaringClass, fa.getName().toString(), constrains, declaringClass); @@ -2711,10 +2711,10 @@ public class ASTGenerator { if (!findMe.toString().equals(qn.getQualifier().toString())) { SimpleType stp = extracTypeInfo(findDeclaration((qn.getQualifier()))); - log(qn.getQualifier() + "->" + qn.getName()); +// log(qn.getQualifier() + "->" + qn.getName()); declaringClass = findDeclaration(stp.getName()); - log("QN decl class: " + getNodeAsString(declaringClass)); +// log("QN decl class: " + getNodeAsString(declaringClass)); constrains.clear(); constrains.add(ASTNode.TYPE_DECLARATION); constrains.add(ASTNode.FIELD_DECLARATION); @@ -2724,16 +2724,16 @@ public class ASTGenerator { else{ if(findMe instanceof QualifiedName){ QualifiedName qnn = (QualifiedName) findMe; - log("findMe is a QN, " - + (qnn.getQualifier().toString() + " other " + qnn.getName() - .toString())); +// log("findMe is a QN, " +// + (qnn.getQualifier().toString() + " other " + qnn.getName() +// .toString())); SimpleType stp = extracTypeInfo(findDeclaration((qnn.getQualifier()))); - log(qnn.getQualifier() + "->" + qnn.getName()); +// log(qnn.getQualifier() + "->" + qnn.getName()); declaringClass = findDeclaration(stp.getName()); - log("QN decl class: " - + getNodeAsString(declaringClass)); +// log("QN decl class: " +// + getNodeAsString(declaringClass)); constrains.clear(); constrains.add(ASTNode.TYPE_DECLARATION); constrains.add(ASTNode.FIELD_DECLARATION); @@ -2766,7 +2766,7 @@ public class ASTGenerator { // .toString())); // } while (parent != null) { - log("findDeclaration1 -> " + getNodeAsString(parent)); +// log("findDeclaration1 -> " + getNodeAsString(parent)); for (Object oprop : parent.structuralPropertiesForType()) { StructuralPropertyDescriptor prop = (StructuralPropertyDescriptor) oprop; if (prop.isChildProperty() || prop.isSimpleProperty()) { @@ -2818,8 +2818,8 @@ public class ASTGenerator { if (exp != null) { constrains.add(ASTNode.TYPE_DECLARATION); - log("MI EXP: " + exp.toString() + " of type " - + exp.getClass().getName() + " parent: " + exp.getParent()); +// log("MI EXP: " + exp.toString() + " of type " +// + exp.getClass().getName() + " parent: " + exp.getParent()); if (exp instanceof MethodInvocation) { SimpleType stp = extracTypeInfo(findDeclaration2(((MethodInvocation) exp) .getName(), @@ -2845,7 +2845,7 @@ public class ASTGenerator { if (stp == null) return null; declaringClass = findDeclaration2(stp.getName(), alternateParent); - log("MI.SN " + getNodeAsString(declaringClass)); +// log("MI.SN " + getNodeAsString(declaringClass)); constrains.add(ASTNode.METHOD_DECLARATION); return definedIn(declaringClass, ((MethodInvocation) parent) .getName().toString(), constrains, declaringClass); @@ -2864,8 +2864,8 @@ public class ASTGenerator { if (exp != null) { constrains.add(ASTNode.TYPE_DECLARATION); - log("FA EXP: " + exp.toString() + " of type " - + exp.getClass().getName() + " parent: " + exp.getParent()); +// log("FA EXP: " + exp.toString() + " of type " +// + exp.getClass().getName() + " parent: " + exp.getParent()); if (exp instanceof MethodInvocation) { SimpleType stp = extracTypeInfo(findDeclaration2(((MethodInvocation) exp) .getName(), @@ -2892,7 +2892,7 @@ public class ASTGenerator { if (stp == null) return null; declaringClass = findDeclaration2(stp.getName(), alternateParent); - log("FA.SN " + getNodeAsString(declaringClass)); +// log("FA.SN " + getNodeAsString(declaringClass)); constrains.add(ASTNode.METHOD_DECLARATION); return definedIn(declaringClass, fa.getName().toString(), constrains, declaringClass); @@ -2913,8 +2913,8 @@ public class ASTGenerator { if(stp == null) return null; declaringClass = findDeclaration2(stp.getName(), alternateParent); - log(qn.getQualifier() + "->" + qn.getName()); - log("QN decl class: " + getNodeAsString(declaringClass)); +// log(qn.getQualifier() + "->" + qn.getName()); +// log("QN decl class: " + getNodeAsString(declaringClass)); constrains.clear(); constrains.add(ASTNode.TYPE_DECLARATION); constrains.add(ASTNode.FIELD_DECLARATION); @@ -2924,16 +2924,16 @@ public class ASTGenerator { else{ if(findMe instanceof QualifiedName){ QualifiedName qnn = (QualifiedName) findMe; - log("findMe is a QN, " - + (qnn.getQualifier().toString() + " other " + qnn.getName() - .toString())); +// log("findMe is a QN, " +// + (qnn.getQualifier().toString() + " other " + qnn.getName() +// .toString())); SimpleType stp = extracTypeInfo(findDeclaration2((qnn.getQualifier()), alternateParent)); - log(qnn.getQualifier() + "->" + qnn.getName()); +// log(qnn.getQualifier() + "->" + qnn.getName()); declaringClass = findDeclaration2(stp.getName(), alternateParent); - log("QN decl class: " - + getNodeAsString(declaringClass)); +// log("QN decl class: " +// + getNodeAsString(declaringClass)); constrains.clear(); constrains.add(ASTNode.TYPE_DECLARATION); constrains.add(ASTNode.FIELD_DECLARATION); @@ -2951,7 +2951,7 @@ public class ASTGenerator { // constrains.add(ASTNode.FIELD_DECLARATION); } // TODO: in findDec, we also have a case where parent of type TD is handled. // Figure out if needed here as well. - log("Alternate parent: " + getNodeAsString(alternateParent)); +// log("Alternate parent: " + getNodeAsString(alternateParent)); while (alternateParent != null) { // log("findDeclaration2 -> " // + getNodeAsString(alternateParent)); @@ -3004,14 +3004,14 @@ public class ASTGenerator { - editor.textArea() .getLineStartNonWhiteSpaceOffset(editor.textArea().getCaretLine()); int x = pdeLine.indexOf("//"); - log(x + " , " + caretPos + ", Checking line for comment " + pdeLine); +// log(x + " , " + caretPos + ", Checking line for comment " + pdeLine); //lineStartOffset = editor.textArea(). if (x >= 0 && caretPos > x) { - log("INSIDE a comment"); +// log("INSIDE a comment"); return true; } - log("not within comment"); +// log("not within comment"); return false; } From f8ed842e5a099a42b701df2d2331eb199be5e0e0 Mon Sep 17 00:00:00 2001 From: Manindra Moharana Date: Tue, 15 Jul 2014 11:25:21 +0530 Subject: [PATCH 40/88] Disabling debug messages... --- .../mode/experimental/ASTGenerator.java | 58 +++++++++---------- .../mode/experimental/CompletionPanel.java | 6 +- .../mode/experimental/TextAreaPainter.java | 4 +- 3 files changed, 34 insertions(+), 34 deletions(-) diff --git a/pdex/src/processing/mode/experimental/ASTGenerator.java b/pdex/src/processing/mode/experimental/ASTGenerator.java index fe8d8c3f2..d1f9f7afc 100644 --- a/pdex/src/processing/mode/experimental/ASTGenerator.java +++ b/pdex/src/processing/mode/experimental/ASTGenerator.java @@ -1264,7 +1264,7 @@ public class ASTGenerator { // First, see if the classname is a fully qualified name and loads straightaway tehClass = loadClass(className); if(tehClass instanceof Class){ - log(tehClass.getName() + " located straightaway"); + //log(tehClass.getName() + " located straightaway"); return tehClass; } @@ -1290,7 +1290,7 @@ public class ASTGenerator { return tehClass; } - log("Doesn't exist in package: " + impS.getImportName()); + //log("Doesn't exist in package: " + impS.getImportName()); } @@ -1301,7 +1301,7 @@ public class ASTGenerator { log(tehClass.getName() + " located."); return tehClass; } - log("Doesn't exist in package: " + impS); + //log("Doesn't exist in package: " + impS); } for (String impS : p.getDefaultImports()) { @@ -1311,7 +1311,7 @@ public class ASTGenerator { log(tehClass.getName() + " located."); return tehClass; } - log("Doesn't exist in package: " + impS); + // log("Doesn't exist in package: " + impS); } } @@ -1322,7 +1322,7 @@ public class ASTGenerator { log(tehClass.getName() + " located."); return tehClass; } - log("Doesn't exist in java.lang"); + //log("Doesn't exist in java.lang"); return tehClass; } @@ -1618,8 +1618,8 @@ public class ASTGenerator { // Convert tab based pde line number to actual line number int pdeLineNumber = lineNumber + errorCheckerService.mainClassOffset; - log("----getASTNodeAt---- CU State: " - + errorCheckerService.compilationUnitState); +// log("----getASTNodeAt---- CU State: " +// + errorCheckerService.compilationUnitState); if (errorCheckerService != null) { editor = errorCheckerService.getEditor(); int codeIndex = editor.getSketch().getCodeIndex(editor.getCurrentTab()); @@ -1634,11 +1634,11 @@ public class ASTGenerator { } // Find closest ASTNode to the linenumber - log("getASTNodeAt: Node line number " + pdeLineNumber); +// log("getASTNodeAt: Node line number " + pdeLineNumber); ASTNode lineNode = findLineOfNode(compilationUnit, pdeLineNumber, offset, name); - log("Node text +> " + lineNode); +// log("Node text +> " + lineNode); ASTNode decl = null; String nodeLabel = null; String nameOfNode = null; // The node name which is to be scrolled to @@ -1649,14 +1649,14 @@ public class ASTGenerator { .getSketch().getCurrentCodeIndex(), lineNumber); String javaCodeLine = getJavaSourceCodeLine(pdeLineNumber); - log(lineNumber + " Original Line num.\nPDE :" + pdeCodeLine); - log("JAVA:" + javaCodeLine); - log("Clicked on: " + name + " start offset: " + offset); +// log(lineNumber + " Original Line num.\nPDE :" + pdeCodeLine); +// log("JAVA:" + javaCodeLine); +// log("Clicked on: " + name + " start offset: " + offset); // Calculate expected java offset based on the pde line OffsetMatcher ofm = new OffsetMatcher(pdeCodeLine, javaCodeLine); int javaOffset = ofm.getJavaOffForPdeOff(offset, name.length()) + lineNode.getStartPosition(); - log("JAVA ast offset: " + (javaOffset)); +// log("JAVA ast offset: " + (javaOffset)); // Find the corresponding node in the AST ASTNode simpName = dfsLookForASTNode(errorCheckerService.getLatestCU(), @@ -1683,22 +1683,22 @@ public class ASTGenerator { // SimpleName instance found, now find its declaration in code if (simpName instanceof SimpleName) { nameOfNode = simpName.toString(); - log(getNodeAsString(simpName)); + // log(getNodeAsString(simpName)); decl = findDeclaration((SimpleName) simpName); if (decl != null) { - logE("DECLA: " + decl.getClass().getName()); +// logE("DECLA: " + decl.getClass().getName()); nodeLabel = getLabelIfType(new ASTNodeWrapper(decl), (SimpleName) simpName); //retLabelString = getNodeAsString(decl); } else { - logE("null"); +// logE("null"); if (scrollOnly) { editor.statusMessage(simpName + " is not defined in this sketch", DebugEditor.STATUS_ERR); } } - log(getNodeAsString(decl)); +// log(getNodeAsString(decl)); /* // - findDecl3 testing @@ -1725,8 +1725,8 @@ public class ASTGenerator { * since it contains all the properties. */ ASTNode simpName2 = getNodeName(decl, nameOfNode); - logE("FINAL String decl: " + getNodeAsString(decl)); - logE("FINAL String label: " + getNodeAsString(simpName2)); +// logE("FINAL String decl: " + getNodeAsString(decl)); +// logE("FINAL String label: " + getNodeAsString(simpName2)); //errorCheckerService.highlightNode(simpName2); ASTNodeWrapper declWrap = new ASTNodeWrapper(simpName2, nodeLabel); //errorCheckerService.highlightNode(declWrap); @@ -2063,8 +2063,8 @@ public class ASTGenerator { */ public void highlightPDECode(int tab, int lineNumber, int lineStartWSOffset, int length) { - log("ASTGen.highlightPDECode: T " + tab + ",L: " + lineNumber + ",LSO: " - + lineStartWSOffset + ",Len: " + length); +// log("ASTGen.highlightPDECode: T " + tab + ",L: " + lineNumber + ",LSO: " +// + lineStartWSOffset + ",Len: " + length); editor.toFront(); editor.getSketch().setCurrentCode(tab); lineStartWSOffset += editor.ta.getLineStartOffset(lineNumber); @@ -2266,8 +2266,8 @@ public class ASTGenerator { public ASTNode dfsLookForASTNode(ASTNode root, String name, int startOffset, int endOffset) { - log("dfsLookForASTNode() lookin for " + name + " Offsets: " + startOffset - + "," + endOffset); +// log("dfsLookForASTNode() lookin for " + name + " Offsets: " + startOffset +// + "," + endOffset); Stack stack = new Stack(); stack.push(root); @@ -2287,10 +2287,10 @@ public class ASTGenerator { && (temp.getStartPosition() + temp.getLength()) >= endOffset) { if(temp instanceof SimpleName){ if(name.equals(temp.toString())){ - log("Found simplename: " + getNodeAsString(temp)); +// log("Found simplename: " + getNodeAsString(temp)); return temp; } - log("Bummer, didn't match"); +// log("Bummer, didn't match"); } else stack.push(temp); @@ -2305,13 +2305,13 @@ public class ASTGenerator { if (temp.getStartPosition() <= startOffset && (temp.getStartPosition() + temp.getLength()) >= endOffset) { stack.push(temp); - log("Pushed onto stack: " + getNodeAsString(temp)); +// log("Pushed onto stack: " + getNodeAsString(temp)); if(temp instanceof SimpleName){ if(name.equals(temp.toString())){ - log("Found simplename: " + getNodeAsString(temp)); +// log("Found simplename: " + getNodeAsString(temp)); return temp; } - log("Bummer, didn't match"); +// log("Bummer, didn't match"); } else stack.push(temp); @@ -2321,7 +2321,7 @@ public class ASTGenerator { } } } - log("dfsLookForASTNode() not found " + name); +// log("dfsLookForASTNode() not found " + name); return null; } diff --git a/pdex/src/processing/mode/experimental/CompletionPanel.java b/pdex/src/processing/mode/experimental/CompletionPanel.java index 00ee4e105..5c3da8b42 100644 --- a/pdex/src/processing/mode/experimental/CompletionPanel.java +++ b/pdex/src/processing/mode/experimental/CompletionPanel.java @@ -106,7 +106,7 @@ public class CompletionPanel { textarea.requestFocusInWindow(); popupMenu.show(textarea, location.x, textarea.getBaseline(0, 0) + location.y); - log("Suggestion shown: " + System.currentTimeMillis()); + //log("Suggestion shown: " + System.currentTimeMillis()); } public boolean isVisible() { @@ -114,7 +114,7 @@ public class CompletionPanel { } public void setVisible(boolean v){ - log("Pred popup visible."); + //log("Pred popup visible."); popupMenu.setVisible(v); } @@ -243,7 +243,7 @@ public class CompletionPanel { textarea.setCaretPosition(insertionPosition + selectedSuggestion.length()); } - log("Suggestion inserted: " + System.currentTimeMillis()); + //log("Suggestion inserted: " + System.currentTimeMillis()); return true; } catch (BadLocationException e1) { e1.printStackTrace(); diff --git a/pdex/src/processing/mode/experimental/TextAreaPainter.java b/pdex/src/processing/mode/experimental/TextAreaPainter.java index bade2b345..3ed928771 100644 --- a/pdex/src/processing/mode/experimental/TextAreaPainter.java +++ b/pdex/src/processing/mode/experimental/TextAreaPainter.java @@ -513,8 +513,8 @@ public class TextAreaPainter extends processing.app.syntax.TextAreaPainter String tooltipText = errorCheckerService.getASTGenerator() .getLabelForASTNode(line, word, xLS); - log(errorCheckerService.mainClassOffset + " MCO " - + "|" + line + "| offset " + xLS + word + " <= offf: "+off+ "\n"); +// log(errorCheckerService.mainClassOffset + " MCO " +// + "|" + line + "| offset " + xLS + word + " <= offf: "+off+ "\n"); if (tooltipText != null) return tooltipText; return word; From 0e43695fe6adaa9e1d28675ae879332d03773300 Mon Sep 17 00:00:00 2001 From: Manindra Moharana Date: Tue, 15 Jul 2014 11:29:18 +0530 Subject: [PATCH 41/88] Disabling debug messages.... --- pdex/src/processing/mode/experimental/ASTGenerator.java | 2 +- pdex/src/processing/mode/experimental/TextArea.java | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/pdex/src/processing/mode/experimental/ASTGenerator.java b/pdex/src/processing/mode/experimental/ASTGenerator.java index d1f9f7afc..c764d9a61 100644 --- a/pdex/src/processing/mode/experimental/ASTGenerator.java +++ b/pdex/src/processing/mode/experimental/ASTGenerator.java @@ -2496,7 +2496,7 @@ public class ASTGenerator { CompilationUnit root = (CompilationUnit) node.getRoot(); // log("Inside "+getNodeAsString(node) + " | " + root.getLineNumber(node.getStartPosition())); if (root.getLineNumber(node.getStartPosition()) == lineNumber) { - logE(3 + getNodeAsString(node) + " len " + node.getLength()); + // logE(3 + getNodeAsString(node) + " len " + node.getLength()); return node; // if (offset < node.getLength()) // return node; diff --git a/pdex/src/processing/mode/experimental/TextArea.java b/pdex/src/processing/mode/experimental/TextArea.java index 9575ff8c5..43d4885dc 100644 --- a/pdex/src/processing/mode/experimental/TextArea.java +++ b/pdex/src/processing/mode/experimental/TextArea.java @@ -774,7 +774,7 @@ public class TextArea extends JEditTextArea { - getLineStartOffset(getCaretLine())); location.y = lineToY(getCaretLine()) + getPainter().getFontMetrics().getHeight() + getPainter().getFontMetrics().getDescent(); - log("TA position: " + location); + //log("TA position: " + location); } catch (Exception e2) { e2.printStackTrace(); return; @@ -805,7 +805,7 @@ public class TextArea extends JEditTextArea { protected void hideSuggestion() { if (suggestion != null) { suggestion.hide(); - log("Suggestion hidden."); + //log("Suggestion hidden."); suggestion = null; } } From 2149db22044297f461d8e8b2cb6dc5876cd1ede4 Mon Sep 17 00:00:00 2001 From: Manindra Moharana Date: Tue, 15 Jul 2014 11:42:35 +0530 Subject: [PATCH 42/88] better tab outline width --- pdex/src/processing/mode/experimental/TabOutline.java | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/pdex/src/processing/mode/experimental/TabOutline.java b/pdex/src/processing/mode/experimental/TabOutline.java index bb8f75302..68a6ba8c8 100644 --- a/pdex/src/processing/mode/experimental/TabOutline.java +++ b/pdex/src/processing/mode/experimental/TabOutline.java @@ -57,6 +57,7 @@ public class TabOutline { int minWidth = (int) (editor.getMinimumSize().width * 0.7f), maxWidth = (int) (editor .getMinimumSize().width * 0.9f); + minWidth = Math.min(minWidth, estimateFrameWidth()); frmOutlineView.setLayout(new BoxLayout(frmOutlineView.getContentPane(), BoxLayout.Y_AXIS)); JPanel panelTop = new JPanel(), panelBottom = new JPanel(); @@ -278,6 +279,15 @@ public class TabOutline { return found; } + private int estimateFrameWidth() { + int w = 100; + for (int i = 0; i < editor.getSketch().getCodeCount(); i++) { + w = Math.max(w, + editor.getSketch().getCode(i).getPrettyName().length() * 10); + } + return w; + } + private int estimateFrameHeight(){ // Assuming each tree node height to be 25 pixels return Math.min(20 * (editor.getSketch().getCodeCount() + 1), From 037487fb4f4a75992a3af600e0720d5dbb0886b5 Mon Sep 17 00:00:00 2001 From: Manindra Moharana Date: Tue, 15 Jul 2014 11:54:09 +0530 Subject: [PATCH 43/88] tab outline now with a label --- .../processing/mode/experimental/TabOutline.java | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/pdex/src/processing/mode/experimental/TabOutline.java b/pdex/src/processing/mode/experimental/TabOutline.java index 68a6ba8c8..aa25f6161 100644 --- a/pdex/src/processing/mode/experimental/TabOutline.java +++ b/pdex/src/processing/mode/experimental/TabOutline.java @@ -1,6 +1,8 @@ package processing.mode.experimental; +import java.awt.Component; import java.awt.Dimension; +import java.awt.GridBagLayout; import java.awt.Point; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; @@ -9,11 +11,13 @@ import java.awt.event.WindowFocusListener; import javax.swing.BoxLayout; import javax.swing.JFrame; +import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTextField; import javax.swing.JTree; import javax.swing.ScrollPaneConstants; +import javax.swing.SwingConstants; import javax.swing.SwingWorker; import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentListener; @@ -60,12 +64,16 @@ public class TabOutline { minWidth = Math.min(minWidth, estimateFrameWidth()); frmOutlineView.setLayout(new BoxLayout(frmOutlineView.getContentPane(), BoxLayout.Y_AXIS)); - JPanel panelTop = new JPanel(), panelBottom = new JPanel(); - panelTop.setLayout(new BoxLayout(panelTop, BoxLayout.Y_AXIS)); + JPanel panelTop = new JPanel(), panelMiddle = new JPanel(), panelBottom = new JPanel(); + panelTop.setLayout(new GridBagLayout()); + panelMiddle.setLayout(new BoxLayout(panelMiddle, BoxLayout.Y_AXIS)); panelBottom.setLayout(new BoxLayout(panelBottom, BoxLayout.Y_AXIS)); + JLabel label = new JLabel("Tabs List (type to filter)"); + label.setAlignmentX(Component.LEFT_ALIGNMENT); + panelTop.add(label); searchField = new JTextField(); searchField.setMinimumSize(new Dimension(minWidth, 25)); - panelTop.add(searchField); + panelMiddle.add(searchField); jsp = new JScrollPane(); populateTabTree(); @@ -77,6 +85,7 @@ public class TabOutline { panelBottom.add(jsp); frmOutlineView.add(panelTop); + frmOutlineView.add(panelMiddle); frmOutlineView.add(panelBottom); frmOutlineView.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); frmOutlineView.pack(); From c74193d48a3be374ba845d2832c903aae3d9f49d Mon Sep 17 00:00:00 2001 From: Manindra Moharana Date: Tue, 15 Jul 2014 13:25:42 +0530 Subject: [PATCH 44/88] tab outline popup location changed --- pdex/src/processing/mode/experimental/TabOutline.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pdex/src/processing/mode/experimental/TabOutline.java b/pdex/src/processing/mode/experimental/TabOutline.java index aa25f6161..c22b96b93 100644 --- a/pdex/src/processing/mode/experimental/TabOutline.java +++ b/pdex/src/processing/mode/experimental/TabOutline.java @@ -100,7 +100,7 @@ public class TabOutline { frmOutlineView.getHeight()))); frmOutlineView.setLocation(tp.x + errorCheckerService.getEditor().ta - .getWidth() - frmOutlineView.getWidth(), + .getWidth()/2 - frmOutlineView.getWidth()/2, frmOutlineView.getY() + (editor.ta.getHeight() - frmOutlineView .getHeight()) / 2); From 9f5466890527e069d3c3b502314ff8ab0d33a220 Mon Sep 17 00:00:00 2001 From: Manindra Moharana Date: Tue, 15 Jul 2014 13:29:44 +0530 Subject: [PATCH 45/88] sketch outline popup location changed --- pdex/src/processing/mode/experimental/DebugEditor.java | 4 ++-- pdex/src/processing/mode/experimental/SketchOutline.java | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/pdex/src/processing/mode/experimental/DebugEditor.java b/pdex/src/processing/mode/experimental/DebugEditor.java index ad7664c35..9eecaf5a9 100755 --- a/pdex/src/processing/mode/experimental/DebugEditor.java +++ b/pdex/src/processing/mode/experimental/DebugEditor.java @@ -669,11 +669,11 @@ public class DebugEditor extends JavaEditor implements ActionListener { }); debugMenu.add(jitem); */ - showOutline = Toolkit.newJMenuItem("Show Outline", KeyEvent.VK_L); + showOutline = Toolkit.newJMenuItem("Show Sketch Outline", KeyEvent.VK_L); showOutline.addActionListener(this); debugMenu.add(showOutline); - showTabOutline = Toolkit.newJMenuItem("Show Outline", KeyEvent.VK_Y); + showTabOutline = Toolkit.newJMenuItem("Show Tabs List", KeyEvent.VK_Y); showTabOutline.addActionListener(this); debugMenu.add(showTabOutline); diff --git a/pdex/src/processing/mode/experimental/SketchOutline.java b/pdex/src/processing/mode/experimental/SketchOutline.java index 895ffcd01..c95ef073e 100644 --- a/pdex/src/processing/mode/experimental/SketchOutline.java +++ b/pdex/src/processing/mode/experimental/SketchOutline.java @@ -112,7 +112,7 @@ public class SketchOutline { .min(errorCheckerService.getEditor().ta.getHeight(), frmOutlineView.getHeight()))); frmOutlineView.setLocation(tp.x + errorCheckerService.getEditor().ta - .getWidth() - frmOutlineView.getWidth(), + .getWidth()/2 - frmOutlineView.getWidth()/2, frmOutlineView.getY() + (editor.ta.getHeight() - frmOutlineView .getHeight()) / 2); From 6feb76dfb958c9d5ed726c0d1a56a747f9c431b1 Mon Sep 17 00:00:00 2001 From: Manindra Moharana Date: Tue, 15 Jul 2014 13:48:15 +0530 Subject: [PATCH 46/88] tab outline min height bugfix --- pdex/src/processing/mode/experimental/TabOutline.java | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/pdex/src/processing/mode/experimental/TabOutline.java b/pdex/src/processing/mode/experimental/TabOutline.java index c22b96b93..454041b8a 100644 --- a/pdex/src/processing/mode/experimental/TabOutline.java +++ b/pdex/src/processing/mode/experimental/TabOutline.java @@ -298,11 +298,9 @@ public class TabOutline { } private int estimateFrameHeight(){ - // Assuming each tree node height to be 25 pixels - return Math.min(20 * (editor.getSketch().getCodeCount() + 1), - frmOutlineView.getHeight()); -// return Math.min(editor.ta.getHeight(), -// frmOutlineView.getHeight()); + // Assuming each tree node height to be 20 pixels + int t = Math.max(4, editor.getSketch().getCodeCount() + 1); + return Math.min(20 * t, frmOutlineView.getHeight()); } public void show() { From 9caf096564da324591da5c744d8bf0df5e0c0d57 Mon Sep 17 00:00:00 2001 From: Manindra Moharana Date: Tue, 15 Jul 2014 18:38:14 +0530 Subject: [PATCH 47/88] refactoring, moving things around --- .../mode/experimental/SketchOutline.java | 21 ++++++++++++------- .../mode/experimental/TabOutline.java | 4 ++-- 2 files changed, 15 insertions(+), 10 deletions(-) diff --git a/pdex/src/processing/mode/experimental/SketchOutline.java b/pdex/src/processing/mode/experimental/SketchOutline.java index c95ef073e..3df7c985b 100644 --- a/pdex/src/processing/mode/experimental/SketchOutline.java +++ b/pdex/src/processing/mode/experimental/SketchOutline.java @@ -52,10 +52,21 @@ public class SketchOutline { protected JTextField searchField; protected DebugEditor editor; + + protected boolean internalSelection = false; public SketchOutline(DefaultMutableTreeNode codeTree, ErrorCheckerService ecs) { errorCheckerService = ecs; editor = ecs.getEditor(); + soNode = new DefaultMutableTreeNode(); + generateSketchOutlineTree(soNode, codeTree); + soNode = (DefaultMutableTreeNode) soNode.getChildAt(0); + tempNode = soNode; + soTree = new JTree(soNode); + createGUI(); + } + + private void createGUI(){ frmOutlineView = new JFrame(); frmOutlineView.setAlwaysOnTop(true); frmOutlineView.setUndecorated(true); @@ -79,11 +90,7 @@ public class SketchOutline { panelTop.add(searchField); jsp = new JScrollPane(); - soNode = new DefaultMutableTreeNode(); - generateSketchOutlineTree(soNode, codeTree); - soNode = (DefaultMutableTreeNode) soNode.getChildAt(0); - tempNode = soNode; - soTree = new JTree(soNode); + soTree.getSelectionModel() .setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION); soTree.setRootVisible(false); @@ -117,11 +124,8 @@ public class SketchOutline { + (editor.ta.getHeight() - frmOutlineView .getHeight()) / 2); addListeners(); - } - protected boolean internalSelection = false; - protected void addListeners() { searchField.addKeyListener(new KeyAdapter() { @@ -257,6 +261,7 @@ public class SketchOutline { awrap.highlightNode(errorCheckerService.astGenerator); // log(awrap); //errorCheckerService.highlightNode(awrap); + close(); } } }; diff --git a/pdex/src/processing/mode/experimental/TabOutline.java b/pdex/src/processing/mode/experimental/TabOutline.java index 454041b8a..3059877de 100644 --- a/pdex/src/processing/mode/experimental/TabOutline.java +++ b/pdex/src/processing/mode/experimental/TabOutline.java @@ -50,10 +50,10 @@ public class TabOutline { public TabOutline(ErrorCheckerService ecs) { errorCheckerService = ecs; editor = ecs.getEditor(); - createAndShowGUI(); + createGUI(); } - private void createAndShowGUI() { + private void createGUI() { frmOutlineView = new JFrame(); frmOutlineView.setAlwaysOnTop(true); frmOutlineView.setUndecorated(true); From d022e77f18771c93aa8d95e903c02b633445a7b5 Mon Sep 17 00:00:00 2001 From: Manindra Moharana Date: Tue, 15 Jul 2014 18:51:55 +0530 Subject: [PATCH 48/88] correct mouse click behavior in lists --- .../mode/experimental/SketchOutline.java | 56 +++++++++++-------- .../mode/experimental/TabOutline.java | 15 +++++ 2 files changed, 49 insertions(+), 22 deletions(-) diff --git a/pdex/src/processing/mode/experimental/SketchOutline.java b/pdex/src/processing/mode/experimental/SketchOutline.java index 3df7c985b..ad3375a01 100644 --- a/pdex/src/processing/mode/experimental/SketchOutline.java +++ b/pdex/src/processing/mode/experimental/SketchOutline.java @@ -7,6 +7,8 @@ import java.awt.Dimension; import java.awt.Point; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; import java.awt.event.WindowEvent; import java.awt.event.WindowFocusListener; import java.io.File; @@ -244,30 +246,40 @@ public class SketchOutline { return; } // log(e); - SwingWorker worker = new SwingWorker() { - - protected Object doInBackground() throws Exception { - return null; - } - - protected void done() { - if (soTree.getLastSelectedPathComponent() == null) { - return; - } - DefaultMutableTreeNode tnode = (DefaultMutableTreeNode) soTree - .getLastSelectedPathComponent(); - if (tnode.getUserObject() instanceof ASTNodeWrapper) { - ASTNodeWrapper awrap = (ASTNodeWrapper) tnode.getUserObject(); - awrap.highlightNode(errorCheckerService.astGenerator); - // log(awrap); - //errorCheckerService.highlightNode(awrap); - close(); - } - } - }; - worker.execute(); + scrollToNode(); } }); + + soTree.addMouseListener(new MouseAdapter() { + public void mouseClicked(MouseEvent me) { + scrollToNode(); + } + }); + } + + private void scrollToNode(){ + SwingWorker worker = new SwingWorker() { + + protected Object doInBackground() throws Exception { + return null; + } + + protected void done() { + if (soTree.getLastSelectedPathComponent() == null) { + return; + } + DefaultMutableTreeNode tnode = (DefaultMutableTreeNode) soTree + .getLastSelectedPathComponent(); + if (tnode.getUserObject() instanceof ASTNodeWrapper) { + ASTNodeWrapper awrap = (ASTNodeWrapper) tnode.getUserObject(); + awrap.highlightNode(errorCheckerService.astGenerator); + // log(awrap); + //errorCheckerService.highlightNode(awrap); + close(); + } + } + }; + worker.execute(); } protected boolean filterTree(String prefix, DefaultMutableTreeNode tree, diff --git a/pdex/src/processing/mode/experimental/TabOutline.java b/pdex/src/processing/mode/experimental/TabOutline.java index 3059877de..f00deddcb 100644 --- a/pdex/src/processing/mode/experimental/TabOutline.java +++ b/pdex/src/processing/mode/experimental/TabOutline.java @@ -6,6 +6,8 @@ import java.awt.GridBagLayout; import java.awt.Point; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; import java.awt.event.WindowEvent; import java.awt.event.WindowFocusListener; @@ -232,6 +234,19 @@ public class TabOutline { worker.execute(); } }); + + tabTree.addMouseListener(new MouseAdapter() { + public void mouseClicked(MouseEvent me) { + if (tabTree.getLastSelectedPathComponent() == null) { + return; + } + DefaultMutableTreeNode tnode = (DefaultMutableTreeNode) tabTree + .getLastSelectedPathComponent(); + //log("Clicked " + tnode); + switchToTab(tnode.toString()); + close(); + } + }); frmOutlineView.addWindowFocusListener(new WindowFocusListener() { public void windowLostFocus(WindowEvent e) { From d80afc4ffa635739b96f52ba5e1c8cec7a50e37f Mon Sep 17 00:00:00 2001 From: Manindra Moharana Date: Tue, 15 Jul 2014 23:27:38 +0530 Subject: [PATCH 49/88] tab outline height estimation --- pdex/src/processing/mode/experimental/TabOutline.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/pdex/src/processing/mode/experimental/TabOutline.java b/pdex/src/processing/mode/experimental/TabOutline.java index f00deddcb..c03003c3a 100644 --- a/pdex/src/processing/mode/experimental/TabOutline.java +++ b/pdex/src/processing/mode/experimental/TabOutline.java @@ -312,10 +312,10 @@ public class TabOutline { return w; } - private int estimateFrameHeight(){ - // Assuming each tree node height to be 20 pixels - int t = Math.max(4, editor.getSketch().getCodeCount() + 1); - return Math.min(20 * t, frmOutlineView.getHeight()); + private int estimateFrameHeight() { + int textHeight = jsp.getGraphics().getFontMetrics().getHeight() + 2; + int t = Math.max(4, editor.getSketch().getCodeCount() + 3); + return Math.min(textHeight * t, frmOutlineView.getHeight()); } public void show() { From 00ee473b14f456a69d5d688725d568ad0105f22e Mon Sep 17 00:00:00 2001 From: Manindra Moharana Date: Wed, 16 Jul 2014 00:10:41 +0530 Subject: [PATCH 50/88] tab outline width bugfix --- .../mode/experimental/TabOutline.java | 27 ++++++++++++------- 1 file changed, 18 insertions(+), 9 deletions(-) diff --git a/pdex/src/processing/mode/experimental/TabOutline.java b/pdex/src/processing/mode/experimental/TabOutline.java index c03003c3a..6c06303b3 100644 --- a/pdex/src/processing/mode/experimental/TabOutline.java +++ b/pdex/src/processing/mode/experimental/TabOutline.java @@ -2,6 +2,7 @@ package processing.mode.experimental; import java.awt.Component; import java.awt.Dimension; +import java.awt.FontMetrics; import java.awt.GridBagLayout; import java.awt.Point; import java.awt.event.KeyAdapter; @@ -26,6 +27,7 @@ import javax.swing.event.DocumentListener; import javax.swing.event.TreeSelectionEvent; import javax.swing.event.TreeSelectionListener; import javax.swing.tree.DefaultMutableTreeNode; +import javax.swing.tree.DefaultTreeCellRenderer; import javax.swing.tree.DefaultTreeModel; import javax.swing.tree.TreeSelectionModel; @@ -42,6 +44,8 @@ public class TabOutline { protected JTree tabTree; protected JTextField searchField; + + protected JLabel lblCaption; protected DebugEditor editor; @@ -60,19 +64,19 @@ public class TabOutline { frmOutlineView.setAlwaysOnTop(true); frmOutlineView.setUndecorated(true); Point tp = errorCheckerService.getEditor().ta.getLocationOnScreen(); - - int minWidth = (int) (editor.getMinimumSize().width * 0.7f), maxWidth = (int) (editor + lblCaption = new JLabel("Tabs List (type to filter)"); +// int minWidth = (int) (editor.getMinimumSize().width * 0.7f), maxWidth = (int) (editor +// .getMinimumSize().width * 0.9f); + int minWidth = estimateFrameWidth(), maxWidth = (int) (editor .getMinimumSize().width * 0.9f); - minWidth = Math.min(minWidth, estimateFrameWidth()); frmOutlineView.setLayout(new BoxLayout(frmOutlineView.getContentPane(), BoxLayout.Y_AXIS)); JPanel panelTop = new JPanel(), panelMiddle = new JPanel(), panelBottom = new JPanel(); panelTop.setLayout(new GridBagLayout()); panelMiddle.setLayout(new BoxLayout(panelMiddle, BoxLayout.Y_AXIS)); panelBottom.setLayout(new BoxLayout(panelBottom, BoxLayout.Y_AXIS)); - JLabel label = new JLabel("Tabs List (type to filter)"); - label.setAlignmentX(Component.LEFT_ALIGNMENT); - panelTop.add(label); + lblCaption.setAlignmentX(Component.LEFT_ALIGNMENT); + panelTop.add(lblCaption); searchField = new JTextField(); searchField.setMinimumSize(new Dimension(minWidth, 25)); panelMiddle.add(searchField); @@ -106,6 +110,10 @@ public class TabOutline { frmOutlineView.getY() + (editor.ta.getHeight() - frmOutlineView .getHeight()) / 2); + DefaultTreeCellRenderer renderer = (DefaultTreeCellRenderer) tabTree.getCellRenderer(); + renderer.setLeafIcon(null); + renderer.setClosedIcon(null); + renderer.setOpenIcon(null); addListeners(); } @@ -304,10 +312,11 @@ public class TabOutline { } private int estimateFrameWidth() { - int w = 100; + FontMetrics fm = editor.ta.getGraphics().getFontMetrics(); + int w = fm.stringWidth(lblCaption.getText()) + 10; for (int i = 0; i < editor.getSketch().getCodeCount(); i++) { - w = Math.max(w, - editor.getSketch().getCode(i).getPrettyName().length() * 10); + w = Math.max(w, fm.stringWidth(editor.getSketch().getCode(i) + .getPrettyName()) + 10); } return w; } From cde6050277cea8bbcbce2d0d7ebd908e24c9f189 Mon Sep 17 00:00:00 2001 From: wirsing Date: Wed, 16 Jul 2014 11:49:07 -0700 Subject: [PATCH 51/88] effects can be passed to analyzers. started on making inputs modulatable --- .../libraries/sound/{README.txt => README.md} | 0 .../processing_sound_MethClaInterface.h | 32 ++-- .../cpp/processing_sound_MethClaInterface.cpp | 140 +++++++++++++++--- .../sound/src/processing/sound/BandPass.java | 11 +- .../sound/src/processing/sound/Delay.java | 11 +- .../sound/src/processing/sound/Engine.java | 16 +- .../sound/src/processing/sound/Env.java | 6 +- .../sound/src/processing/sound/HighPass.java | 11 +- .../sound/src/processing/sound/LowPass.java | 11 +- .../processing/sound/MethClaInterface.java | 14 +- .../sound/src/processing/sound/Reverb.java | 11 +- .../sound/src/processing/sound/SawOsc.java | 32 ++++ .../sound/src/processing/sound/SqrOsc.java | 3 +- java/libraries/sound/todo.txt | 6 +- 14 files changed, 227 insertions(+), 77 deletions(-) rename java/libraries/sound/{README.txt => README.md} (100%) diff --git a/java/libraries/sound/README.txt b/java/libraries/sound/README.md similarity index 100% rename from java/libraries/sound/README.txt rename to java/libraries/sound/README.md diff --git a/java/libraries/sound/src/cpp/include/processing_sound_MethClaInterface.h b/java/libraries/sound/src/cpp/include/processing_sound_MethClaInterface.h index 0b309e286..250633821 100644 --- a/java/libraries/sound/src/cpp/include/processing_sound_MethClaInterface.h +++ b/java/libraries/sound/src/cpp/include/processing_sound_MethClaInterface.h @@ -47,6 +47,14 @@ JNIEXPORT void JNICALL Java_processing_sound_MethClaInterface_synthStop JNIEXPORT void JNICALL Java_processing_sound_MethClaInterface_oscSet (JNIEnv *, jobject, jfloat, jfloat, jfloat, jfloat, jintArray); +/* + * Class: processing_sound_MethClaInterface + * Method: oscAudioSet + * Signature: ([I[I[I[I[I)V + */ +JNIEXPORT void JNICALL Java_processing_sound_MethClaInterface_oscAudioSet + (JNIEnv *, jobject, jintArray, jintArray, jintArray, jintArray, jintArray); + /* * Class: processing_sound_MethClaInterface * Method: sinePlay @@ -210,9 +218,9 @@ JNIEXPORT void JNICALL Java_processing_sound_MethClaInterface_brownNoiseSet /* * Class: processing_sound_MethClaInterface * Method: envelopePlay - * Signature: ([IFFFF)I + * Signature: ([IFFFF)[I */ -JNIEXPORT jint JNICALL Java_processing_sound_MethClaInterface_envelopePlay +JNIEXPORT jintArray JNICALL Java_processing_sound_MethClaInterface_envelopePlay (JNIEnv *, jobject, jintArray, jfloat, jfloat, jfloat, jfloat); /* @@ -226,25 +234,25 @@ JNIEXPORT jint JNICALL Java_processing_sound_MethClaInterface_doneAfter /* * Class: processing_sound_MethClaInterface * Method: highPassPlay - * Signature: ([IFF)I + * Signature: ([IFF)[I */ -JNIEXPORT jint JNICALL Java_processing_sound_MethClaInterface_highPassPlay +JNIEXPORT jintArray JNICALL Java_processing_sound_MethClaInterface_highPassPlay (JNIEnv *, jobject, jintArray, jfloat, jfloat); /* * Class: processing_sound_MethClaInterface * Method: lowPassPlay - * Signature: ([IFF)I + * Signature: ([IFF)[I */ -JNIEXPORT jint JNICALL Java_processing_sound_MethClaInterface_lowPassPlay +JNIEXPORT jintArray JNICALL Java_processing_sound_MethClaInterface_lowPassPlay (JNIEnv *, jobject, jintArray, jfloat, jfloat); /* * Class: processing_sound_MethClaInterface * Method: bandPassPlay - * Signature: ([IFF)I + * Signature: ([IFF)[I */ -JNIEXPORT jint JNICALL Java_processing_sound_MethClaInterface_bandPassPlay +JNIEXPORT jintArray JNICALL Java_processing_sound_MethClaInterface_bandPassPlay (JNIEnv *, jobject, jintArray, jfloat, jfloat); /* @@ -258,9 +266,9 @@ JNIEXPORT void JNICALL Java_processing_sound_MethClaInterface_filterSet /* * Class: processing_sound_MethClaInterface * Method: delayPlay - * Signature: ([IFFF)I + * Signature: ([IFFF)[I */ -JNIEXPORT jint JNICALL Java_processing_sound_MethClaInterface_delayPlay +JNIEXPORT jintArray JNICALL Java_processing_sound_MethClaInterface_delayPlay (JNIEnv *, jobject, jintArray, jfloat, jfloat, jfloat); /* @@ -274,9 +282,9 @@ JNIEXPORT void JNICALL Java_processing_sound_MethClaInterface_delaySet /* * Class: processing_sound_MethClaInterface * Method: reverbPlay - * Signature: ([IFFF)I + * Signature: ([IFFF)[I */ -JNIEXPORT jint JNICALL Java_processing_sound_MethClaInterface_reverbPlay +JNIEXPORT jintArray JNICALL Java_processing_sound_MethClaInterface_reverbPlay (JNIEnv *, jobject, jintArray, jfloat, jfloat, jfloat); /* diff --git a/java/libraries/sound/src/cpp/processing_sound_MethClaInterface.cpp b/java/libraries/sound/src/cpp/processing_sound_MethClaInterface.cpp index f603bd6ca..2d0adef8d 100644 --- a/java/libraries/sound/src/cpp/processing_sound_MethClaInterface.cpp +++ b/java/libraries/sound/src/cpp/processing_sound_MethClaInterface.cpp @@ -140,6 +140,75 @@ JNIEXPORT void JNICALL Java_processing_sound_MethClaInterface_oscSet (JNIEnv *en env->ReleaseIntArrayElements(nodeId, m_nodeId, 0); }; +JNIEXPORT void JNICALL Java_processing_sound_MethClaInterface_oscAudioSet(JNIEnv *env, jobject object, jintArray freq, jintArray amp, jintArray add, jintArray pos, jintArray nodeId){ + + jint* m_freq = env->GetIntArrayElements(freq, 0); + jint* m_amp = env->GetIntArrayElements(amp, 0); + jint* m_add = env->GetIntArrayElements(add, 0); + jint* m_pos = env->GetIntArrayElements(pos, 0); + jint* m_nodeId = env->GetIntArrayElements(nodeId, 0); + + Methcla::Request request(engine()); + request.openBundle(Methcla::immediately); + + if (m_freq[0] != -1) + { + Methcla::AudioBusId freq_bus = m_engine->audioBusId().alloc(); + request.set(m_nodeId[0], 0 , 0); + request.free(m_freq[1]); + request.mapOutput(m_freq[0], 0, freq_bus); + request.mapInput(m_nodeId[0], 0, freq_bus); + + std::cout << "freq" << std::endl; + } + + if (m_amp[0] != -1) + { + + Methcla::AudioBusId amp_bus = m_engine->audioBusId().alloc(); + //request.set(m_nodeId[0], 1 , 0); + //request.free(m_amp[1]); + request.mapOutput(m_amp[0], 0, amp_bus); + std::cout << m_amp[0] << std::endl; + request.set(m_amp[0], 0, 200); + + request.mapInput(m_nodeId[0], 1, amp_bus); + + std::cout << "amp" << std::endl; + } + + if (m_add[0] != -1) + { + Methcla::AudioBusId add_bus = m_engine->audioBusId().alloc(); + request.set(m_nodeId[0], 2 , 0); + request.free(m_add[1]); + request.mapOutput(m_add[0], 0, add_bus); + request.mapInput(m_nodeId[0], 2, add_bus); + + std::cout << "add" << std::endl; + } + + if (m_pos[0] != -1) + { + Methcla::AudioBusId pos_bus = m_engine->audioBusId().alloc(); + request.set(m_nodeId[1], 0 , 0); + request.free(m_pos[1]); + request.mapOutput(m_pos[0], 0, pos_bus); + request.mapInput(m_nodeId[1], 0, pos_bus); + + std::cout << "pos" << std::endl; + } + + request.closeBundle(); + request.send(); + + env->ReleaseIntArrayElements(freq, m_freq, 0); + env->ReleaseIntArrayElements(amp, m_amp, 0); + env->ReleaseIntArrayElements(add, m_add, 0); + env->ReleaseIntArrayElements(pos, m_pos, 0); + env->ReleaseIntArrayElements(nodeId, m_nodeId, 0); +}; + // SineOsc JNIEXPORT jintArray JNICALL Java_processing_sound_MethClaInterface_sinePlay(JNIEnv *env, jobject object, jfloat freq, jfloat amp, jfloat add, jfloat pos){ @@ -316,6 +385,7 @@ JNIEXPORT void JNICALL Java_processing_sound_MethClaInterface_sqrSet(JNIEnv *env Methcla::Request request(engine()); request.openBundle(Methcla::immediately); request.set(m_nodeId[0], 0 , freq); + request.set(m_nodeId[0], 0 , 0.5f); request.set(m_nodeId[0], 2 , amp); request.set(m_nodeId[1], 0 , pos); request.closeBundle(); @@ -780,9 +850,11 @@ JNIEXPORT void JNICALL Java_processing_sound_MethClaInterface_brownNoiseSet(JNIE }; -JNIEXPORT jint JNICALL Java_processing_sound_MethClaInterface_envelopePlay(JNIEnv *env, jobject object, jintArray nodeId, jfloat attackTime, jfloat sustainTime, jfloat sustainLevel, jfloat releaseTime){ +JNIEXPORT jintArray JNICALL Java_processing_sound_MethClaInterface_envelopePlay(JNIEnv *env, jobject object, jintArray nodeId, jfloat attackTime, jfloat sustainTime, jfloat sustainLevel, jfloat releaseTime){ jint* m_nodeId = env->GetIntArrayElements(nodeId, 0); + jintArray returnId = env->NewIntArray(2); + jint *m_returnId = env->GetIntArrayElements(returnId, NULL); Methcla::AudioBusId in_bus = m_engine->audioBusId().alloc(); Methcla::AudioBusId out_bus = m_engine->audioBusId().alloc(); @@ -813,15 +885,21 @@ JNIEXPORT jint JNICALL Java_processing_sound_MethClaInterface_envelopePlay(JNIEn request.closeBundle(); request.send(); - + + m_returnId[0]=synth.id(); + m_returnId[1]=m_nodeId[1]; + + env->ReleaseIntArrayElements(returnId, m_returnId, 0); env->ReleaseIntArrayElements(nodeId, m_nodeId, 0); - return synth.id(); + return returnId; }; -JNIEXPORT jint JNICALL Java_processing_sound_MethClaInterface_highPassPlay(JNIEnv *env, jobject object, jintArray nodeId, jfloat freq, jfloat res){ +JNIEXPORT jintArray JNICALL Java_processing_sound_MethClaInterface_highPassPlay(JNIEnv *env, jobject object, jintArray nodeId, jfloat freq, jfloat res){ jint* m_nodeId = env->GetIntArrayElements(nodeId, 0); + jintArray returnId = env->NewIntArray(2); + jint *m_returnId = env->GetIntArrayElements(returnId, NULL); Methcla::AudioBusId in_bus = m_engine->audioBusId().alloc(); Methcla::AudioBusId out_bus = m_engine->audioBusId().alloc(); @@ -845,14 +923,20 @@ JNIEXPORT jint JNICALL Java_processing_sound_MethClaInterface_highPassPlay(JNIEn request.closeBundle(); request.send(); - env->ReleaseIntArrayElements(nodeId, m_nodeId, 0); + m_returnId[0]=synth.id(); + m_returnId[1]=m_nodeId[1]; - return synth.id(); + env->ReleaseIntArrayElements(returnId, m_returnId, 0); + env->ReleaseIntArrayElements(nodeId, m_nodeId, 0); + + return returnId; }; -JNIEXPORT jint JNICALL Java_processing_sound_MethClaInterface_lowPassPlay(JNIEnv *env, jobject object, jintArray nodeId, jfloat freq, jfloat res){ +JNIEXPORT jintArray JNICALL Java_processing_sound_MethClaInterface_lowPassPlay(JNIEnv *env, jobject object, jintArray nodeId, jfloat freq, jfloat res){ jint* m_nodeId = env->GetIntArrayElements(nodeId, 0); + jintArray returnId = env->NewIntArray(2); + jint *m_returnId = env->GetIntArrayElements(returnId, NULL); Methcla::AudioBusId in_bus = m_engine->audioBusId().alloc(); Methcla::AudioBusId out_bus = m_engine->audioBusId().alloc(); @@ -876,14 +960,20 @@ JNIEXPORT jint JNICALL Java_processing_sound_MethClaInterface_lowPassPlay(JNIEnv request.closeBundle(); request.send(); - env->ReleaseIntArrayElements(nodeId, m_nodeId, 0); + m_returnId[0]=synth.id(); + m_returnId[1]=m_nodeId[1]; - return synth.id(); + env->ReleaseIntArrayElements(returnId, m_returnId, 0); + env->ReleaseIntArrayElements(nodeId, m_nodeId, 0); + + return returnId; }; -JNIEXPORT jint JNICALL Java_processing_sound_MethClaInterface_bandPassPlay(JNIEnv *env, jobject object, jintArray nodeId, jfloat freq, jfloat res){ +JNIEXPORT jintArray JNICALL Java_processing_sound_MethClaInterface_bandPassPlay(JNIEnv *env, jobject object, jintArray nodeId, jfloat freq, jfloat res){ jint* m_nodeId = env->GetIntArrayElements(nodeId, 0); + jintArray returnId = env->NewIntArray(2); + jint *m_returnId = env->GetIntArrayElements(returnId, NULL); Methcla::AudioBusId in_bus = m_engine->audioBusId().alloc(); Methcla::AudioBusId out_bus = m_engine->audioBusId().alloc(); @@ -907,9 +997,13 @@ JNIEXPORT jint JNICALL Java_processing_sound_MethClaInterface_bandPassPlay(JNIEn request.closeBundle(); request.send(); + m_returnId[0]=synth.id(); + m_returnId[1]=m_nodeId[1]; + + env->ReleaseIntArrayElements(returnId, m_returnId, 0); env->ReleaseIntArrayElements(nodeId, m_nodeId, 0); - return synth.id(); + return returnId; }; JNIEXPORT void JNICALL Java_processing_sound_MethClaInterface_filterSet(JNIEnv *env, jobject object, jfloat freq, jfloat res, jint nodeId){ @@ -922,9 +1016,11 @@ JNIEXPORT void JNICALL Java_processing_sound_MethClaInterface_filterSet(JNIEnv * request.send(); }; -JNIEXPORT jint JNICALL Java_processing_sound_MethClaInterface_delayPlay(JNIEnv *env, jobject object, jintArray nodeId, jfloat maxDelayTime, jfloat delayTime, jfloat feedBack){ +JNIEXPORT jintArray JNICALL Java_processing_sound_MethClaInterface_delayPlay(JNIEnv *env, jobject object, jintArray nodeId, jfloat maxDelayTime, jfloat delayTime, jfloat feedBack){ - jint* m_nodeId = env->GetIntArrayElements(nodeId, 0); + jint* m_nodeId = env->GetIntArrayElements(nodeId, 0); + jintArray returnId = env->NewIntArray(2); + jint *m_returnId = env->GetIntArrayElements(returnId, NULL); Methcla::AudioBusId in_bus = m_engine->audioBusId().alloc(); Methcla::AudioBusId out_bus = m_engine->audioBusId().alloc(); @@ -947,10 +1043,14 @@ JNIEXPORT jint JNICALL Java_processing_sound_MethClaInterface_delayPlay(JNIEnv * request.closeBundle(); request.send(); - + + m_returnId[0]=synth.id(); + m_returnId[1]=m_nodeId[1]; + + env->ReleaseIntArrayElements(returnId, m_returnId, 0); env->ReleaseIntArrayElements(nodeId, m_nodeId, 0); - return synth.id(); + return returnId; }; @@ -963,9 +1063,11 @@ JNIEXPORT void JNICALL Java_processing_sound_MethClaInterface_delaySet(JNIEnv *e request.send(); }; -JNIEXPORT jint JNICALL Java_processing_sound_MethClaInterface_reverbPlay(JNIEnv *env, jobject object, jintArray nodeId, jfloat room, jfloat damp, jfloat wet){ +JNIEXPORT jintArray JNICALL Java_processing_sound_MethClaInterface_reverbPlay(JNIEnv *env, jobject object, jintArray nodeId, jfloat room, jfloat damp, jfloat wet){ jint* m_nodeId = env->GetIntArrayElements(nodeId, 0); + jintArray returnId = env->NewIntArray(2); + jint *m_returnId = env->GetIntArrayElements(returnId, NULL); Methcla::AudioBusId in_bus = m_engine->audioBusId().alloc(); Methcla::AudioBusId out_bus = m_engine->audioBusId().alloc(); @@ -991,9 +1093,13 @@ JNIEXPORT jint JNICALL Java_processing_sound_MethClaInterface_reverbPlay(JNIEnv request.closeBundle(); request.send(); + m_returnId[0]=synth.id(); + m_returnId[1]=m_nodeId[1]; + + env->ReleaseIntArrayElements(returnId, m_returnId, 0); env->ReleaseIntArrayElements(nodeId, m_nodeId, 0); - return synth.id(); + return returnId; }; JNIEXPORT void JNICALL Java_processing_sound_MethClaInterface_reverbSet(JNIEnv *env, jobject object, jfloat room, jfloat damp, jfloat wet, jint nodeId){ diff --git a/java/libraries/sound/src/processing/sound/BandPass.java b/java/libraries/sound/src/processing/sound/BandPass.java index 61476d494..6fac50289 100644 --- a/java/libraries/sound/src/processing/sound/BandPass.java +++ b/java/libraries/sound/src/processing/sound/BandPass.java @@ -6,8 +6,7 @@ public class BandPass implements SoundObject{ PApplet parent; private Engine m_engine; - private int m_nodeId; - private int[] m_m = {0,0}; + private int[] m_nodeId = {-1,-1}; private float m_freq = 100; private float m_res = 1; @@ -29,7 +28,7 @@ public class BandPass implements SoundObject{ } private void set(){ - m_engine.filterSet(m_freq, m_res, m_nodeId); + m_engine.filterSet(m_freq, m_res, m_nodeId[0]); } public void set(float freq, float res){ @@ -48,14 +47,14 @@ public class BandPass implements SoundObject{ } public int[] returnId(){ - return m_m; + return m_nodeId; } public void stop(){ - //m_engine.synthStop(m_nodeId); + m_engine.synthStop(m_nodeId); } public void dispose() { - //m_engine.synthStop(m_nodeId); + m_engine.synthStop(m_nodeId); } } diff --git a/java/libraries/sound/src/processing/sound/Delay.java b/java/libraries/sound/src/processing/sound/Delay.java index f2540f9a6..262105a8f 100644 --- a/java/libraries/sound/src/processing/sound/Delay.java +++ b/java/libraries/sound/src/processing/sound/Delay.java @@ -6,8 +6,7 @@ public class Delay implements SoundObject{ PApplet parent; private Engine m_engine; - private int m_nodeId; - private int[] m_m = {0,0}; + private int m_nodeId[] = {-1,-1}; private float m_maxDelayTime = 2; private float m_delayTime = 0; private float m_feedBack = 0; @@ -35,7 +34,7 @@ public class Delay implements SoundObject{ } private void set(){ - m_engine.delaySet(m_delayTime, m_feedBack, m_nodeId); + m_engine.delaySet(m_delayTime, m_feedBack, m_nodeId[0]); } public void set(float delayTime, float feedBack){ @@ -54,14 +53,14 @@ public class Delay implements SoundObject{ } public int[] returnId(){ - return m_m; + return m_nodeId; } public void stop(){ - //m_engine.synthStop(m_nodeId); + m_engine.synthStop(m_nodeId); } public void dispose() { - //m_engine.synthStop(m_nodeId); + m_engine.synthStop(m_nodeId); } } diff --git a/java/libraries/sound/src/processing/sound/Engine.java b/java/libraries/sound/src/processing/sound/Engine.java index 1612d6b71..07cca75e0 100644 --- a/java/libraries/sound/src/processing/sound/Engine.java +++ b/java/libraries/sound/src/processing/sound/Engine.java @@ -62,6 +62,10 @@ public class Engine { public static void oscSet(float freq, float amp, float add, float pos, int[] nodeId){ methCla.oscSet(freq, amp, add, pos, nodeId); }; + + public static void oscAudioSet(int[] freqId, int[] ampId, int[] addId, int[] posId, int[] nodeId){ + methCla.oscAudioSet(freqId, ampId, addId, posId, nodeId); + }; // Sine Wave Oscillator @@ -163,7 +167,7 @@ public class Engine { // Envelope - public static int envelopePlay(int[] input, float attackTime, float sustainTime, float sustainLevel, float releaseTime){ + public static int[] envelopePlay(int[] input, float attackTime, float sustainTime, float sustainLevel, float releaseTime){ return methCla.envelopePlay(input, attackTime, sustainTime, sustainLevel, releaseTime); }; @@ -173,15 +177,15 @@ public class Engine { // Filters - public static int highPassPlay(int[] input, float freq, float res){ + public static int[] highPassPlay(int[] input, float freq, float res){ return methCla.highPassPlay(input, freq, res); }; - public static int lowPassPlay(int[] input, float freq, float res){ + public static int[] lowPassPlay(int[] input, float freq, float res){ return methCla.lowPassPlay(input, freq, res); }; - public static int bandPassPlay(int[] input, float freq, float res){ + public static int[] bandPassPlay(int[] input, float freq, float res){ return methCla.bandPassPlay(input, freq, res); }; @@ -191,7 +195,7 @@ public class Engine { // Delay - public static int delayPlay(int[] input, float maxDelayTime, float delayTime, float feedBack){ + public static int[] delayPlay(int[] input, float maxDelayTime, float delayTime, float feedBack){ return methCla.delayPlay(input, maxDelayTime, delayTime, feedBack); }; @@ -201,7 +205,7 @@ public class Engine { // Reverb - public static int reverbPlay(int[] input, float room, float damp, float wet){ + public static int[] reverbPlay(int[] input, float room, float damp, float wet){ return methCla.reverbPlay(input, room, damp, wet); }; diff --git a/java/libraries/sound/src/processing/sound/Env.java b/java/libraries/sound/src/processing/sound/Env.java index 9ff122a5e..499f9ccdc 100644 --- a/java/libraries/sound/src/processing/sound/Env.java +++ b/java/libraries/sound/src/processing/sound/Env.java @@ -5,7 +5,7 @@ public class Env { PApplet parent; private Engine m_engine; - int m_nodeId; + int[] m_nodeId = {-1, -1}; public Env (PApplet theParent) { this.parent = theParent; @@ -18,11 +18,11 @@ public class Env { m_nodeId = m_engine.envelopePlay(input.returnId(), attackTime, sustainTime, sustainLevel, releaseTime); } - public int returnId(){ + public int[] returnId(){ return m_nodeId; } public void dispose(){ - //m_engine.synthStop(m_nodeId); + m_engine.synthStop(m_nodeId); } }; diff --git a/java/libraries/sound/src/processing/sound/HighPass.java b/java/libraries/sound/src/processing/sound/HighPass.java index 4cf7c5550..2574f04b0 100644 --- a/java/libraries/sound/src/processing/sound/HighPass.java +++ b/java/libraries/sound/src/processing/sound/HighPass.java @@ -6,8 +6,7 @@ public class HighPass implements SoundObject{ PApplet parent; private Engine m_engine; - private int m_nodeId; - private int[] m_m = {0,0}; + private int[] m_nodeId = {-1,-1}; private float m_freq = 100; private float m_res = 1; @@ -29,7 +28,7 @@ public class HighPass implements SoundObject{ } private void set(){ - m_engine.filterSet(m_freq, m_res, m_nodeId); + m_engine.filterSet(m_freq, m_res, m_nodeId[0]); } public void set(float freq, float res){ @@ -48,14 +47,14 @@ public class HighPass implements SoundObject{ } public int[] returnId(){ - return m_m; + return m_nodeId; } public void stop(){ - //m_engine.synthStop(m_nodeId); + m_engine.synthStop(m_nodeId); } public void dispose() { - //m_engine.synthStop(m_nodeId); + m_engine.synthStop(m_nodeId); } } diff --git a/java/libraries/sound/src/processing/sound/LowPass.java b/java/libraries/sound/src/processing/sound/LowPass.java index e16d898f2..bcb889e20 100644 --- a/java/libraries/sound/src/processing/sound/LowPass.java +++ b/java/libraries/sound/src/processing/sound/LowPass.java @@ -6,8 +6,7 @@ public class LowPass implements SoundObject{ PApplet parent; private Engine m_engine; - private int m_nodeId; - private int[] m_m = {0,0}; + private int[] m_nodeId = {-1, -1}; private float m_freq = 100; private float m_res = 1; @@ -29,7 +28,7 @@ public class LowPass implements SoundObject{ } private void set(){ - m_engine.filterSet(m_freq, m_res, m_nodeId); + m_engine.filterSet(m_freq, m_res, m_nodeId[0]); } public void set(float freq, float res){ @@ -48,14 +47,14 @@ public class LowPass implements SoundObject{ } public int[] returnId(){ - return m_m; + return m_nodeId; } public void stop(){ - //m_engine.synthStop(m_nodeId); + m_engine.synthStop(m_nodeId); } public void dispose() { - //m_engine.synthStop(m_nodeId); + m_engine.synthStop(m_nodeId); } } diff --git a/java/libraries/sound/src/processing/sound/MethClaInterface.java b/java/libraries/sound/src/processing/sound/MethClaInterface.java index 35fafaf60..ae5b1c455 100644 --- a/java/libraries/sound/src/processing/sound/MethClaInterface.java +++ b/java/libraries/sound/src/processing/sound/MethClaInterface.java @@ -23,6 +23,8 @@ public class MethClaInterface // general Oscillator methods public native void oscSet(float freq, float amp, float add, float pos, int[] nodeId); + + public native void oscAudioSet(int[] freqId, int[] ampId, int[] addId, int[] posId, int[] nodeId); // Sine Wave Oscillator @@ -86,29 +88,29 @@ public class MethClaInterface // Envelope - public native int envelopePlay(int[] input, float attackTime, float sustainTime, float sustainLevel, float releaseTime); + public native int[] envelopePlay(int[] input, float attackTime, float sustainTime, float sustainLevel, float releaseTime); public native int doneAfter(float seconds); // Filters - public native int highPassPlay(int[] input, float freq, float res); + public native int[] highPassPlay(int[] input, float freq, float res); - public native int lowPassPlay(int[] input, float freq, float res); + public native int[] lowPassPlay(int[] input, float freq, float res); - public native int bandPassPlay(int[] input, float freq, float res); + public native int[] bandPassPlay(int[] input, float freq, float res); public native void filterSet(float freq, float res, int nodeId); // Delay - public native int delayPlay(int[] input, float maxDelayTime, float delayTime, float feedBack); + public native int[] delayPlay(int[] input, float maxDelayTime, float delayTime, float feedBack); public native void delaySet(float delayTime, float feedBack, int nodeId); // Reverb - public native int reverbPlay(int[] input, float room, float damp, float wet); + public native int[] reverbPlay(int[] input, float room, float damp, float wet); public native void reverbSet(float room, float damp, float wet, int nodeId); diff --git a/java/libraries/sound/src/processing/sound/Reverb.java b/java/libraries/sound/src/processing/sound/Reverb.java index 8a4a6a4b1..1c7ee96b3 100644 --- a/java/libraries/sound/src/processing/sound/Reverb.java +++ b/java/libraries/sound/src/processing/sound/Reverb.java @@ -6,8 +6,7 @@ public class Reverb implements SoundObject{ PApplet parent; private Engine m_engine; - private int m_nodeId; - private int[] m_m = {0,0}; + private int[] m_nodeId = {-1, -1}; private float m_room = 1; private float m_damp = 0; private float m_wet = 0.5f; @@ -39,7 +38,7 @@ public class Reverb implements SoundObject{ } private void set(){ - m_engine.reverbSet(m_room, m_damp, m_wet, m_nodeId); + m_engine.reverbSet(m_room, m_damp, m_wet, m_nodeId[0]); } public void set(float room, float damp, float wet){ @@ -63,14 +62,14 @@ public class Reverb implements SoundObject{ } public int[] returnId(){ - return m_m; + return m_nodeId; } public void stop(){ - //m_engine.synthStop(m_nodeId); + m_engine.synthStop(m_nodeId); } public void dispose() { - //m_engine.synthStop(m_nodeId); + m_engine.synthStop(m_nodeId); } } diff --git a/java/libraries/sound/src/processing/sound/SawOsc.java b/java/libraries/sound/src/processing/sound/SawOsc.java index 365580a3a..a2e05a410 100644 --- a/java/libraries/sound/src/processing/sound/SawOsc.java +++ b/java/libraries/sound/src/processing/sound/SawOsc.java @@ -6,6 +6,12 @@ public class SawOsc implements Oscillator{ PApplet parent; private Engine m_engine; private int[] m_nodeId = {-1,-1}; + + private int[] m_freqId = {-1,-1}; + private int[] m_ampId = {-1,-1}; + private int[] m_addId = {-1,-1}; + private int[] m_posId = {-1,-1}; + private float m_freq = 440; private float m_amp = 0.5f; private float m_add = 0; @@ -42,6 +48,12 @@ public class SawOsc implements Oscillator{ m_engine.oscSet(m_freq, m_amp, m_add, m_pos, m_nodeId); } } + + private void audioSet(){ + if(m_nodeId[0] != -1 ) { + m_engine.oscAudioSet(m_freqId, m_ampId, m_addId, m_posId, m_nodeId); + } + } public void set(float freq, float amp, float add, float pos){ m_freq=freq; m_amp=amp; m_add=add; m_pos=pos; @@ -53,21 +65,41 @@ public class SawOsc implements Oscillator{ this.set(); } + public void freq(SoundObject freq){ + m_freqId=freq.returnId(); + this.audioSet(); + } + public void amp(float amp){ m_amp=amp; this.set(); } + + public void amp(SoundObject amp){ + m_ampId=amp.returnId(); + this.audioSet(); + } public void add(float add){ m_add=add; this.set(); } + public void add(SoundObject add){ + m_addId=add.returnId(); + this.audioSet(); + } + public void pan(float pos){ m_pos=pos; this.set(); } + public void pan(SoundObject pos){ + m_posId=pos.returnId(); + this.audioSet(); + } + public void stop(){ m_engine.synthStop(m_nodeId); } diff --git a/java/libraries/sound/src/processing/sound/SqrOsc.java b/java/libraries/sound/src/processing/sound/SqrOsc.java index 6dd14a6ef..68d56e5b3 100644 --- a/java/libraries/sound/src/processing/sound/SqrOsc.java +++ b/java/libraries/sound/src/processing/sound/SqrOsc.java @@ -20,7 +20,8 @@ public class SqrOsc implements SoundObject { } public void play(){ - m_nodeId = m_engine.sqrPlay(m_freq, m_amp, m_add-1, m_pos); + //m_nodeId = m_engine.pulsePlay(m_freq, 0.5f, m_amp*2, m_add-1, m_pos); + m_nodeId = m_engine.sqrPlay(m_freq, m_amp, m_add-1, m_pos); }; public void play(float freq, float amp, float add, float pos){ diff --git a/java/libraries/sound/todo.txt b/java/libraries/sound/todo.txt index 9255340eb..c9461bacc 100644 --- a/java/libraries/sound/todo.txt +++ b/java/libraries/sound/todo.txt @@ -3,11 +3,13 @@ 2.0 SOUND FOR RELEASE - + + - Improve/make examples + Bugs: - Fix FFT Crash - Fix Low Pass Distortion - - Fix problem of passing effects to Analyzers + + Fix problem of passing effects to Analyzers Features: - Make oscillators modulatable From be62826a0e1dd23a82f3d52158f66aa82eb9a369 Mon Sep 17 00:00:00 2001 From: wirsing Date: Thu, 17 Jul 2014 15:29:13 -0700 Subject: [PATCH 52/88] AudioInput works now --- .../examples/IO/AudioInput/AudioInput.pde | 46 +++++++++++++++++++ .../processing_sound_MethClaInterface.h | 12 ++++- .../cpp/processing_sound_MethClaInterface.cpp | 26 ++++++++--- .../sound/src/processing/sound/AudioIn.java | 9 ++-- .../sound/src/processing/sound/Engine.java | 11 ++++- .../processing/sound/MethClaInterface.java | 4 +- .../src/processing/sound/Oscillator.java | 13 +----- .../sound/src/processing/sound/PinkNoise.java | 6 ++- 8 files changed, 98 insertions(+), 29 deletions(-) create mode 100644 java/libraries/sound/examples/IO/AudioInput/AudioInput.pde diff --git a/java/libraries/sound/examples/IO/AudioInput/AudioInput.pde b/java/libraries/sound/examples/IO/AudioInput/AudioInput.pde new file mode 100644 index 000000000..59afab706 --- /dev/null +++ b/java/libraries/sound/examples/IO/AudioInput/AudioInput.pde @@ -0,0 +1,46 @@ +/* +Be Careful with your speaker volume, you might produce a painful +feedback. We recommend to wear headphones for this example. + +*/ + +import processing.sound.*; + +AudioIn input; +Amplitude rms; + +int scale=1; + +void setup() { + size(640,360); + background(255); + + //Create an Audio input and grab the 1st channel + input = new AudioIn(this, 0); + + // start the Audio Input + input.play(); + + // create a new Amplitude analyzer + rms = new Amplitude(this); + + // Patch the input to an volume analyzer + rms.input(input); +} + + +void draw() { + background(125,255,125); + + // adjust the volume of the audio input + input.amp(map(mouseY, 0, height, 0.0, 1.0)); + + // rms.analyze() return a value between 0 and 1. To adjust + // the scaling and mapping of an ellipse we scale from 0 to 0.5 + scale=int(map(rms.analyze(), 0, 0.5, 1, 350)); + noStroke(); + + fill(255,0,150); + // We draw an ellispe coupled to the audio analysis + ellipse(width/2, height/2, 1*scale, 1*scale); +} diff --git a/java/libraries/sound/src/cpp/include/processing_sound_MethClaInterface.h b/java/libraries/sound/src/cpp/include/processing_sound_MethClaInterface.h index 250633821..5fcfdd911 100644 --- a/java/libraries/sound/src/cpp/include/processing_sound_MethClaInterface.h +++ b/java/libraries/sound/src/cpp/include/processing_sound_MethClaInterface.h @@ -114,10 +114,10 @@ JNIEXPORT void JNICALL Java_processing_sound_MethClaInterface_pulseSet /* * Class: processing_sound_MethClaInterface * Method: audioInPlay - * Signature: (FFFZ)[I + * Signature: (FFFI)[I */ JNIEXPORT jintArray JNICALL Java_processing_sound_MethClaInterface_audioInPlay - (JNIEnv *, jobject, jfloat, jfloat, jfloat, jboolean); + (JNIEnv *, jobject, jfloat, jfloat, jfloat, jint); /* * Class: processing_sound_MethClaInterface @@ -295,6 +295,14 @@ JNIEXPORT jintArray JNICALL Java_processing_sound_MethClaInterface_reverbPlay JNIEXPORT void JNICALL Java_processing_sound_MethClaInterface_reverbSet (JNIEnv *, jobject, jfloat, jfloat, jfloat, jint); +/* + * Class: processing_sound_MethClaInterface + * Method: out + * Signature: (I[I)V + */ +JNIEXPORT void JNICALL Java_processing_sound_MethClaInterface_out + (JNIEnv *, jobject, jint, jintArray); + /* * Class: processing_sound_MethClaInterface * Method: amplitude diff --git a/java/libraries/sound/src/cpp/processing_sound_MethClaInterface.cpp b/java/libraries/sound/src/cpp/processing_sound_MethClaInterface.cpp index 2d0adef8d..a8c1a8669 100644 --- a/java/libraries/sound/src/cpp/processing_sound_MethClaInterface.cpp +++ b/java/libraries/sound/src/cpp/processing_sound_MethClaInterface.cpp @@ -451,13 +451,12 @@ JNIEXPORT void JNICALL Java_processing_sound_MethClaInterface_pulseSet(JNIEnv *e env->ReleaseIntArrayElements(nodeId, m_nodeId, 0); }; -JNIEXPORT jintArray JNICALL Java_processing_sound_MethClaInterface_audioInPlay(JNIEnv *env, jobject object, jfloat amp, jfloat add, jfloat pos, jboolean out){ +JNIEXPORT jintArray JNICALL Java_processing_sound_MethClaInterface_audioInPlay(JNIEnv *env, jobject object, jfloat amp, jfloat add, jfloat pos, jint in){ jintArray nodeId = env->NewIntArray(2); jint *m_nodeId = env->GetIntArrayElements(nodeId, NULL); Methcla::AudioBusId bus = m_engine->audioBusId().alloc(); - Methcla::AudioBusId in = m_engine->audioBusId().alloc(); Methcla::Request request(engine()); request.openBundle(Methcla::immediately); @@ -471,11 +470,11 @@ JNIEXPORT jintArray JNICALL Java_processing_sound_MethClaInterface_audioInPlay(J auto pan = request.synth( METHCLA_PLUGINS_PAN2_URI, engine().root(), - {pos, 0}, + {pos, 1.f}, {Methcla::Value(1.f)} ); - request.mapInput(synth.id(), 0, in, Methcla::kBusMappingExternal); + request.mapInput(synth.id(), 0, Methcla::AudioBusId(in), Methcla::kBusMappingExternal); request.mapOutput(synth.id(), 0, bus); request.mapInput(pan.id(), 0, bus); @@ -490,7 +489,7 @@ JNIEXPORT jintArray JNICALL Java_processing_sound_MethClaInterface_audioInPlay(J request.send(); m_nodeId[0]=synth.id(); - m_nodeId[1]=pan.id(); + m_nodeId[1]= pan.id(); env->ReleaseIntArrayElements(nodeId, m_nodeId, 0); @@ -1027,6 +1026,7 @@ JNIEXPORT jintArray JNICALL Java_processing_sound_MethClaInterface_delayPlay(JNI Methcla::Request request(engine()); request.openBundle(Methcla::immediately); + auto synth = request.synth( METHCLA_PLUGINS_DELAY_URI, Methcla::NodePlacement::after(m_nodeId[0]), @@ -1053,7 +1053,6 @@ JNIEXPORT jintArray JNICALL Java_processing_sound_MethClaInterface_delayPlay(JNI return returnId; }; - JNIEXPORT void JNICALL Java_processing_sound_MethClaInterface_delaySet(JNIEnv *env, jobject object, jfloat delayTime, jfloat feedBack, jint nodeId){ Methcla::Request request(engine()); request.openBundle(Methcla::immediately); @@ -1293,3 +1292,18 @@ JNIEXPORT jint JNICALL Java_processing_sound_MethClaInterface_out(JNIEnv *env, j }; */ +JNIEXPORT void JNICALL Java_processing_sound_MethClaInterface_out(JNIEnv *env, jobject object, jint out, jintArray nodeId){ + + jint* m_nodeId = env->GetIntArrayElements(nodeId, 0); + + Methcla::Request request(engine()); + request.openBundle(Methcla::immediately); + + request.mapOutput(m_nodeId[0], 0, Methcla::AudioBusId(out), Methcla::kBusMappingExternal); + + request.closeBundle(); + request.send(); + + env->ReleaseIntArrayElements(nodeId, m_nodeId, 0); +}; + diff --git a/java/libraries/sound/src/processing/sound/AudioIn.java b/java/libraries/sound/src/processing/sound/AudioIn.java index 382d4de3d..42f572972 100644 --- a/java/libraries/sound/src/processing/sound/AudioIn.java +++ b/java/libraries/sound/src/processing/sound/AudioIn.java @@ -2,25 +2,26 @@ package processing.sound; import processing.core.PApplet; -public class AudioIn { +public class AudioIn implements SoundObject{ PApplet parent; private Engine m_engine; private int[] m_nodeId = {-1,-1}; private float m_amp = 1.f; private float m_add = 0; - private boolean m_out = true; + private int m_in = 0; private float m_pos = 0; - public AudioIn(PApplet theParent) { + public AudioIn (PApplet theParent, int in) { this.parent = theParent; parent.registerMethod("dispose", this); m_engine.setPreferences(theParent, 512, 44100); m_engine.start(); + m_in = in; } public void play(){ - m_nodeId = m_engine.audioInPlay(m_amp, m_add, m_pos, m_out); + m_nodeId = m_engine.audioInPlay(m_amp, m_add, m_pos, m_in); } public void play(float amp, float add, float pos){ diff --git a/java/libraries/sound/src/processing/sound/Engine.java b/java/libraries/sound/src/processing/sound/Engine.java index 07cca75e0..7052996b6 100644 --- a/java/libraries/sound/src/processing/sound/Engine.java +++ b/java/libraries/sound/src/processing/sound/Engine.java @@ -105,8 +105,8 @@ public class Engine { // AudioIn - public static int[] audioInPlay(float amp, float add, float pos, boolean out){ - return methCla.audioInPlay(amp, add, pos, out); + public static int[] audioInPlay(float amp, float add, float pos, int in){ + return methCla.audioInPlay(amp, add, pos, in); }; public static void audioInSet(float amp, float add, float pos, int[] nodeId){ @@ -241,6 +241,13 @@ public class Engine { methCla.destroy_fft(ptr); }; + // Out + + public static void out(int out, int[] nodeId){ + methCla.out(out, nodeId); + }; + + public static void engineStop() { methCla.engineStop(); } diff --git a/java/libraries/sound/src/processing/sound/MethClaInterface.java b/java/libraries/sound/src/processing/sound/MethClaInterface.java index ae5b1c455..51e5078f9 100644 --- a/java/libraries/sound/src/processing/sound/MethClaInterface.java +++ b/java/libraries/sound/src/processing/sound/MethClaInterface.java @@ -52,7 +52,7 @@ public class MethClaInterface // Audio In - public native int[] audioInPlay(float amp, float add, float pos, boolean out); + public native int[] audioInPlay(float amp, float add, float pos, int in); public native void audioInSet(float amp, float add, float pos, int[] nodeId); @@ -120,7 +120,7 @@ public class MethClaInterface // Pan + Out - // public native int out(float pos, int nodeId); + public native void out(int out, int[] nodeId); // connect diff --git a/java/libraries/sound/src/processing/sound/Oscillator.java b/java/libraries/sound/src/processing/sound/Oscillator.java index 3ad893013..94eb2f61d 100644 --- a/java/libraries/sound/src/processing/sound/Oscillator.java +++ b/java/libraries/sound/src/processing/sound/Oscillator.java @@ -6,18 +6,7 @@ public interface Oscillator extends SoundObject { public void play(float freq, float amp, float add); public void play(float freq, float amp); public void play(); - /* for modulation - public void play(Oscillator freq, float amp, float add); - public void play(Oscillator freq, float amp); - public void play(float freq, Oscillator amp, float add); - public void play(float freq, Oscillator amp); - public void play(float freq, float amp, Oscillator add); - public void play(Oscillator freq, Oscillator amp, float add); - public void play(Oscillator freq, Oscillator amp); - public void play(float freq, Oscillator amp, Oscillator add); - public void play(Oscillator freq, float amp, Oscillator add); - public void play(Oscillator freq, Oscillator amp, Oscillator add); - */ + public void freq(float freq); public void amp(float amp); public void add(float add); diff --git a/java/libraries/sound/src/processing/sound/PinkNoise.java b/java/libraries/sound/src/processing/sound/PinkNoise.java index 79ca3518d..45d557c9b 100644 --- a/java/libraries/sound/src/processing/sound/PinkNoise.java +++ b/java/libraries/sound/src/processing/sound/PinkNoise.java @@ -61,7 +61,11 @@ public class PinkNoise implements SoundObject{ m_pos=pos; this.set(); } - +/* + public void out(int out){ + m_engine.out(out, m_nodeId); + } +*/ public void stop(){ m_engine.synthStop(m_nodeId); } From fbf8dbeca94b3c908dd7829b2364aebbda2a7f90 Mon Sep 17 00:00:00 2001 From: wirsing Date: Thu, 17 Jul 2014 15:30:51 -0700 Subject: [PATCH 53/88] updated todo.txt --- java/libraries/sound/todo.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/java/libraries/sound/todo.txt b/java/libraries/sound/todo.txt index c9461bacc..39a692f0b 100644 --- a/java/libraries/sound/todo.txt +++ b/java/libraries/sound/todo.txt @@ -10,6 +10,7 @@ - Fix FFT Crash - Fix Low Pass Distortion + Fix problem of passing effects to Analyzers + + Make audio input work Features: - Make oscillators modulatable From c52911db7321073b16700bbb61540a0ad639edea Mon Sep 17 00:00:00 2001 From: wirsing Date: Thu, 17 Jul 2014 20:03:35 -0700 Subject: [PATCH 54/88] Fixed FFT Bug --- .../cpp/processing_sound_MethClaInterface.cpp | 83 +++++++++++-------- java/libraries/sound/todo.txt | 2 +- 2 files changed, 50 insertions(+), 35 deletions(-) diff --git a/java/libraries/sound/src/cpp/processing_sound_MethClaInterface.cpp b/java/libraries/sound/src/cpp/processing_sound_MethClaInterface.cpp index a8c1a8669..47a0dc166 100644 --- a/java/libraries/sound/src/cpp/processing_sound_MethClaInterface.cpp +++ b/java/libraries/sound/src/cpp/processing_sound_MethClaInterface.cpp @@ -38,21 +38,37 @@ Methcla::Engine* m_engine; Methcla::Engine& engine() { return *m_engine; } -std::mutex mutex; +std::mutex mutex_fft_in; +std::mutex mutex_fft_out; +std::mutex mutex_amp_in; +std::mutex mutex_amp_out; + static Methcla_Time kLatency = 0.1; -typedef struct data_v{ - int id; - std::atomic amp; -} ServerValue, *ServerValuePtr; - -typedef struct data_a{ - int id; - int fftSize=512; - std::vector fft; -} ServerArray, *ServerArrayPtr; +struct ServerValue{ + ServerValue() : + amp(0), + id(-1) + { + + } + float amp; + int id; +}; +struct ServerArray{ + ServerArray() : + fftSize(512), + fft(fftSize), + id(-1) + { + + } + int fftSize; + std::vector fft; + int id; +}; // Engine @@ -1126,7 +1142,7 @@ JNIEXPORT jlong JNICALL Java_processing_sound_MethClaInterface_amplitude(JNIEnv Methcla::Request request(engine()); - ServerValue *amp_ptr = (ServerValue *) malloc(sizeof(ServerValue)); + ServerValue * amp_ptr = new ServerValue; ptr = (jlong)amp_ptr; @@ -1151,8 +1167,8 @@ JNIEXPORT jlong JNICALL Java_processing_sound_MethClaInterface_amplitude(JNIEnv auto id = engine().addNotificationHandler([amp_ptr](const OSCPP::Server::Message& msg) { if (msg == "/amplitude") { OSCPP::Server::ArgStream args(msg.args()); - while (!args.atEnd()) { - + std::lock_guard guard(mutex_amp_in); + while (!args.atEnd()) { amp_ptr->amp = args.float32(); } return false; @@ -1167,9 +1183,8 @@ JNIEXPORT jlong JNICALL Java_processing_sound_MethClaInterface_amplitude(JNIEnv }; JNIEXPORT jfloat JNICALL Java_processing_sound_MethClaInterface_poll_1amplitude(JNIEnv * env, jobject object, jlong ptr){ - ServerValue *amp_ptr = (ServerValue*)ptr; - + std::lock_guard guard(mutex_amp_out); return amp_ptr->amp; }; @@ -1177,20 +1192,18 @@ JNIEXPORT void JNICALL Java_processing_sound_MethClaInterface_destroy_1amplitude ServerValue *amp_ptr = (ServerValue*)ptr; engine().removeNotificationHandler(amp_ptr->id); - free(amp_ptr); - + delete amp_ptr; }; JNIEXPORT jlong JNICALL Java_processing_sound_MethClaInterface_fft(JNIEnv *env, jobject object, jintArray nodeId, jint fftSize){ jlong ptr; jint* m_nodeId = env->GetIntArrayElements(nodeId, 0); - ServerArray *fft_ptr = (ServerArray *) malloc(sizeof(ServerArray) + fftSize*(sizeof(std::vector))); - - std::cout << "1" << std::endl; + //ServerArray *fft_ptr = (ServerArray *) malloc(sizeof(ServerArray)); - fft_ptr->fft.resize(fftSize); - std::cout << "2" << std::endl; + ServerArray * fft_ptr = new ServerArray; + + fft_ptr->fft.resize(fftSize, 0); fft_ptr->fftSize=fftSize; ptr = (jlong)fft_ptr; @@ -1203,6 +1216,8 @@ JNIEXPORT jlong JNICALL Java_processing_sound_MethClaInterface_fft(JNIEnv *env, Methcla::Request request(engine()); request.openBundle(Methcla::immediately); + std::cout << fftSize << std::endl; + auto synth = request.synth( METHCLA_PLUGINS_FFT_URI, Methcla::NodePlacement::after(m_nodeId[0]), @@ -1223,12 +1238,14 @@ JNIEXPORT jlong JNICALL Java_processing_sound_MethClaInterface_fft(JNIEnv *env, if (msg == "/fft") { OSCPP::Server::ArgStream args(msg.args()); int i=0; - while (!args.atEnd()) { - fft_ptr->fft[i] = args.float32(); - std::lock_guard guard(mutex); - i++; - } - return false; + { + std::lock_guard guard(mutex_fft_in); + while (!args.atEnd()) { + fft_ptr->fft[i] = args.float32(); + i++; + } + } + return false; } return false; }); @@ -1243,12 +1260,10 @@ JNIEXPORT jlong JNICALL Java_processing_sound_MethClaInterface_fft(JNIEnv *env, JNIEXPORT jfloatArray JNICALL Java_processing_sound_MethClaInterface_poll_1fft(JNIEnv *env, jobject object, jlong ptr){ ServerArray *fft_ptr = (ServerArray*)ptr; - jfloatArray fft_mag = env->NewFloatArray(fft_ptr->fftSize); - - jfloat *m_fft_mag = env->GetFloatArrayElements(fft_mag, NULL); + std::lock_guard guard(mutex_fft_out); for (int i = 0; i < fft_ptr->fftSize; ++i) { m_fft_mag[i]=fft_ptr->fft[i]; @@ -1260,9 +1275,9 @@ JNIEXPORT jfloatArray JNICALL Java_processing_sound_MethClaInterface_poll_1fft(J }; JNIEXPORT void JNICALL Java_processing_sound_MethClaInterface_destroy_1fft(JNIEnv *env, jobject object, jlong ptr){ - ServerArray *fft_ptr = (ServerArray*)ptr; + ServerArray * fft_ptr = (ServerArray*)ptr; engine().removeNotificationHandler(fft_ptr->id); - free(fft_ptr); + delete fft_ptr; }; /* OLD VARIABLE IN OUT FUNCTION diff --git a/java/libraries/sound/todo.txt b/java/libraries/sound/todo.txt index 39a692f0b..a2837eb54 100644 --- a/java/libraries/sound/todo.txt +++ b/java/libraries/sound/todo.txt @@ -7,7 +7,7 @@ - Improve/make examples Bugs: - - Fix FFT Crash + + Fix FFT Crash - Fix Low Pass Distortion + Fix problem of passing effects to Analyzers + Make audio input work From 09bac0b1a09537dfa596ef7687518b2752074b53 Mon Sep 17 00:00:00 2001 From: wirsing Date: Mon, 21 Jul 2014 19:42:14 -0700 Subject: [PATCH 55/88] updated doc pdf, made interfaces non-public + added noise interface --- .../src/processing/sound/BrownNoise.java | 2 +- .../sound/src/processing/sound/Noise.java | 19 +++++++++++++++++++ .../src/processing/sound/Oscillator.java | 3 ++- .../sound/src/processing/sound/PinkNoise.java | 2 +- .../src/processing/sound/SoundObject.java | 2 +- .../src/processing/sound/WhiteNoise.java | 2 +- java/libraries/sound/todo.txt | 10 ++++++---- 7 files changed, 31 insertions(+), 9 deletions(-) create mode 100644 java/libraries/sound/src/processing/sound/Noise.java diff --git a/java/libraries/sound/src/processing/sound/BrownNoise.java b/java/libraries/sound/src/processing/sound/BrownNoise.java index 2dfdf6576..74bbd80df 100644 --- a/java/libraries/sound/src/processing/sound/BrownNoise.java +++ b/java/libraries/sound/src/processing/sound/BrownNoise.java @@ -1,7 +1,7 @@ package processing.sound; import processing.core.*; -public class BrownNoise implements SoundObject{ +public class BrownNoise implements Noise{ PApplet parent; private Engine m_engine; diff --git a/java/libraries/sound/src/processing/sound/Noise.java b/java/libraries/sound/src/processing/sound/Noise.java new file mode 100644 index 000000000..78a6ac917 --- /dev/null +++ b/java/libraries/sound/src/processing/sound/Noise.java @@ -0,0 +1,19 @@ +package processing.sound; + +interface Noise extends SoundObject { + + public void play(float amp, float add, float pos); + public void play(float amp, float pos); + public void play(float amp); + public void play(); + + public void amp(float amp); + public void add(float add); + public void pan(float pos); + public void set(); + public void set(float amp, float add, float pan); + public void stop(); + public void dispose(); + + public int[] returnId(); +} diff --git a/java/libraries/sound/src/processing/sound/Oscillator.java b/java/libraries/sound/src/processing/sound/Oscillator.java index 94eb2f61d..b09f9fc0c 100644 --- a/java/libraries/sound/src/processing/sound/Oscillator.java +++ b/java/libraries/sound/src/processing/sound/Oscillator.java @@ -1,6 +1,6 @@ package processing.sound; -public interface Oscillator extends SoundObject { +interface Oscillator extends SoundObject { public void play(float freq, float amp, float add, float pos); public void play(float freq, float amp, float add); @@ -11,6 +11,7 @@ public interface Oscillator extends SoundObject { public void amp(float amp); public void add(float add); public void pan(float pos); + public void set(); public void set(float freq, float amp, float add, float pan); public void stop(); public void dispose(); diff --git a/java/libraries/sound/src/processing/sound/PinkNoise.java b/java/libraries/sound/src/processing/sound/PinkNoise.java index 45d557c9b..afccc8ced 100644 --- a/java/libraries/sound/src/processing/sound/PinkNoise.java +++ b/java/libraries/sound/src/processing/sound/PinkNoise.java @@ -1,7 +1,7 @@ package processing.sound; import processing.core.*; -public class PinkNoise implements SoundObject{ +public class PinkNoise implements Noise{ PApplet parent; private Engine m_engine; diff --git a/java/libraries/sound/src/processing/sound/SoundObject.java b/java/libraries/sound/src/processing/sound/SoundObject.java index 12b74f8be..4afa032a7 100644 --- a/java/libraries/sound/src/processing/sound/SoundObject.java +++ b/java/libraries/sound/src/processing/sound/SoundObject.java @@ -1,6 +1,6 @@ package processing.sound; -public interface SoundObject { +interface SoundObject { //public int numBusses=128; //public int topBus=0; diff --git a/java/libraries/sound/src/processing/sound/WhiteNoise.java b/java/libraries/sound/src/processing/sound/WhiteNoise.java index 4143b5399..b69f8cff5 100644 --- a/java/libraries/sound/src/processing/sound/WhiteNoise.java +++ b/java/libraries/sound/src/processing/sound/WhiteNoise.java @@ -1,7 +1,7 @@ package processing.sound; import processing.core.*; -public class WhiteNoise implements SoundObject{ +public class WhiteNoise implements Noise{ PApplet parent; private Engine m_engine; diff --git a/java/libraries/sound/todo.txt b/java/libraries/sound/todo.txt index a2837eb54..4c314a86d 100644 --- a/java/libraries/sound/todo.txt +++ b/java/libraries/sound/todo.txt @@ -2,17 +2,19 @@ 2.0 SOUND - FOR RELEASE + FOR RELEASE (GSoC) - Improve/make examples - Bugs: + Bugs (GSoC): + Fix FFT Crash - Fix Low Pass Distortion + Fix problem of passing effects to Analyzers + Make audio input work + - Use Patch Cables for signal splitting for effects - Features: + Features (GSoC): + - Compile Windows Version - Make oscillators modulatable - Bandlimit oscillators - Introduce wet/dry for Delay @@ -21,7 +23,7 @@ - If you loop a sample and use jump make it play from the beginning NICE - - Pitchtracker + - Pitchtracker (GSoC optional) - isPlaying method for Synths - helper functions (ampToDB, midiToFreq etc..) - make non-bandlimited a pro option From b2899c63ceaa1acf9db6853baff2cd7fa0dc41d5 Mon Sep 17 00:00:00 2001 From: Jakub Valtar Date: Tue, 22 Jul 2014 16:40:09 +0200 Subject: [PATCH 56/88] Moved pixels invalidation to endShape Moved to account for a possibility that user uses get(), set() or loadPixels() inside of beginShape()/endShape() block. --- core/src/processing/opengl/PGraphicsOpenGL.java | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/core/src/processing/opengl/PGraphicsOpenGL.java b/core/src/processing/opengl/PGraphicsOpenGL.java index 643e63343..38d11e2c3 100644 --- a/core/src/processing/opengl/PGraphicsOpenGL.java +++ b/core/src/processing/opengl/PGraphicsOpenGL.java @@ -2133,9 +2133,6 @@ public class PGraphicsOpenGL extends PGraphics { shape = kind; inGeo.clear(); - // We are going to draw, pixels won't be up-to-date anymore. - setgetPixels = false; - curveVertexCount = 0; breakShape = false; defaultEdges = true; @@ -2154,6 +2151,9 @@ public class PGraphicsOpenGL extends PGraphics { if ((flushMode == FLUSH_CONTINUOUSLY) || (flushMode == FLUSH_WHEN_FULL && tessGeo.isFull())) { flush(); + } else { + // pixels array is not up-to-date anymore + setgetPixels = false; } } @@ -2169,6 +2169,9 @@ public class PGraphicsOpenGL extends PGraphics { if (flushMode == FLUSH_CONTINUOUSLY || (flushMode == FLUSH_WHEN_FULL && tessGeo.isFull())) { flush(); + } else { + // pixels array is not up-to-date anymore + setgetPixels = false; } } From 8853ef40a96402b4583ba1d132a2c14b22935f0c Mon Sep 17 00:00:00 2001 From: Jakub Valtar Date: Tue, 22 Jul 2014 16:46:03 +0200 Subject: [PATCH 57/88] Changed setgetPixels to arePixelsUpToDate Changed the name to better reflect the purpose of the variable. --- core/src/processing/opengl/PGraphicsOpenGL.java | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/core/src/processing/opengl/PGraphicsOpenGL.java b/core/src/processing/opengl/PGraphicsOpenGL.java index 38d11e2c3..1edfdc438 100644 --- a/core/src/processing/opengl/PGraphicsOpenGL.java +++ b/core/src/processing/opengl/PGraphicsOpenGL.java @@ -381,7 +381,7 @@ public class PGraphicsOpenGL extends PGraphics { /** Flag to indicate that pixels array is up-to-date and * ready to be manipulated through the set()/get() methods */ - protected boolean setgetPixels; + protected boolean arePixelsUpToDate; // ........................................................ @@ -2153,7 +2153,7 @@ public class PGraphicsOpenGL extends PGraphics { flush(); } else { // pixels array is not up-to-date anymore - setgetPixels = false; + arePixelsUpToDate = false; } } @@ -2171,7 +2171,7 @@ public class PGraphicsOpenGL extends PGraphics { flush(); } else { // pixels array is not up-to-date anymore - setgetPixels = false; + arePixelsUpToDate = false; } } @@ -2449,7 +2449,7 @@ public class PGraphicsOpenGL extends PGraphics { tessGeo.clear(); texCache.clear(); - setgetPixels = false; + arePixelsUpToDate = false; } @@ -5441,7 +5441,7 @@ public class PGraphicsOpenGL extends PGraphics { needEndDraw = true; } - if (!setgetPixels) { + if (!arePixelsUpToDate) { // Draws any remaining geometry in case the user is still not // setting/getting new pixels. flush(); @@ -5449,12 +5449,12 @@ public class PGraphicsOpenGL extends PGraphics { allocatePixels(); - if (!setgetPixels) { + if (!arePixelsUpToDate) { readPixels(); } // Pixels are now up-to-date, set the flag. - setgetPixels = true; + arePixelsUpToDate = true; if (needEndDraw) { endDraw(); @@ -6574,7 +6574,7 @@ public class PGraphicsOpenGL extends PGraphics { clearColorBuffer = false; modified = false; - setgetPixels = false; + arePixelsUpToDate = false; } From e93ffbbfb368033730e710775e7fe0715623e0ff Mon Sep 17 00:00:00 2001 From: Jakub Valtar Date: Tue, 22 Jul 2014 18:31:57 +0200 Subject: [PATCH 58/88] corrected expected front face orientation CCW -> CW --- core/src/processing/core/PGraphics.java | 2 +- .../processing/opengl/PGraphicsOpenGL.java | 138 +++++++++--------- 2 files changed, 69 insertions(+), 71 deletions(-) diff --git a/core/src/processing/core/PGraphics.java b/core/src/processing/core/PGraphics.java index 7ad1d26ba..7d950eecc 100644 --- a/core/src/processing/core/PGraphics.java +++ b/core/src/processing/core/PGraphics.java @@ -2405,7 +2405,7 @@ public class PGraphics extends PImage implements PConstants { protected void rectImpl(float x1, float y1, float x2, float y2) { - quad(x1, y1, x1, y2, x2, y2, x2, y1); + quad(x1, y1, x2, y1, x2, y2, x1, y2); } diff --git a/core/src/processing/opengl/PGraphicsOpenGL.java b/core/src/processing/opengl/PGraphicsOpenGL.java index 419c4b8fd..1e74f305d 100644 --- a/core/src/processing/opengl/PGraphicsOpenGL.java +++ b/core/src/processing/opengl/PGraphicsOpenGL.java @@ -1827,7 +1827,7 @@ public class PGraphicsOpenGL extends PGraphics { pgl.disable(PGL.SCISSOR_TEST); } - pgl.frontFace(PGL.CCW); + pgl.frontFace(PGL.CW); pgl.disable(PGL.CULL_FACE); pgl.activeTexture(PGL.TEXTURE0); @@ -6537,13 +6537,13 @@ public class PGraphicsOpenGL extends PGraphics { lightSpecular(0, 0, 0); } - // Vertices should be specified by user in CCW order (left-handed) - // That is CW order (right-handed). Vertex shader inverts - // Y-axis and outputs vertices in CCW order (right-handed). + // Vertices should be specified by user in CW order (left-handed) + // That is CCW order (right-handed). Vertex shader inverts + // Y-axis and outputs vertices in CW order (right-handed). // Culling occurs after the vertex shader, so FRONT FACE - // has to be set to CCW (right-handed) for OpenGL to correctly + // has to be set to CW (right-handed) for OpenGL to correctly // recognize FRONT and BACK faces. - pgl.frontFace(PGL.CCW); + pgl.frontFace(PGL.CW); pgl.disable(PGL.CULL_FACE); // Processing uses only one texture unit. @@ -7809,6 +7809,7 @@ public class PGraphicsOpenGL extends PGraphics { // // Normal calculation + // Expects vertices in CW (left-handed) order. void calcTriangleNormal(int i0, int i1, int i2) { int index; @@ -7836,14 +7837,12 @@ public class PGraphicsOpenGL extends PGraphics { float v10z = z0 - z1; // The automatic normal calculation in Processing assumes - // that vertices are given by user in CCW order (left-handed), - // internally in CW order (right-handed) so: - // n = v10 x v12 - // so that the normal extends outwards from the front face. - float nx = v10y * v12z - v12y * v10z; - float ny = v10z * v12x - v12z * v10x; - float nz = v10x * v12y - v12x * v10y; - + // that vertices as given in CCW order (right-handed) so: + // n = v12 x v10 + // so that the normal extends from the front face. + float nx = v12y * v10z - v10y * v12z; + float ny = v12z * v10x - v10z * v12x; + float nz = v12x * v10y - v10x * v12y; float d = PApplet.sqrt(nx * nx + ny * ny + nz * nz); nx /= d; ny /= d; @@ -7889,12 +7888,16 @@ public class PGraphicsOpenGL extends PGraphics { for (int i = 1; i < vertexCount - 1; i++) { int i1 = i; int i0, i2; + // Vertices are specified by user as: + // 1-3 ... + // |\|\ ... + // 0-2-4 ... if (i % 2 == 1) { - // The odd triangles (1, 3, 5...) should be CCW (left-handed) + // The odd triangles (1, 3, 5...) should be CW (left-handed) i0 = i - 1; i2 = i + 1; } else { - // The even triangles (2, 4, 6...) should be CW (left-handed) + // The even triangles (2, 4, 6...) should be CCW (left-handed) i0 = i + 1; i2 = i - 1; } @@ -7921,12 +7924,12 @@ public class PGraphicsOpenGL extends PGraphics { int i2 = 2 * qd; int i3 = 2 * qd + 1; - // Vertices are ordered as: - // 0-2 ... - // |/| ... - // 1-3 ... + // Vertices are specified by user as: + // 1-3-5 ... + // |\|\| ... + // 0-2-4 ... // thus (0, 1, 2) and (2, 1, 3) are triangles - // in CCW order (left-handed). + // in CW order (left-handed). calcTriangleNormal(i0, i1, i2); calcTriangleNormal(i2, i1, i3); } @@ -8002,26 +8005,20 @@ public class PGraphicsOpenGL extends PGraphics { void addRect(float a, float b, float c, float d, boolean stroke) { addQuad(a, b, 0, - a, d, 0, - c, d, 0, c, b, 0, + c, d, 0, + a, d, 0, stroke); } void addRect(float a, float b, float c, float d, float tl, float tr, float br, float bl, boolean stroke) { - if (nonZero(tl)) { - addVertex(a, b+tl, VERTEX, false); - addQuadraticVertex(a, b, 0, a+tl, b, 0, false); + if (nonZero(tr)) { + addVertex(c-tr, b, VERTEX, true); + addQuadraticVertex(c, b, 0, c, b+tr, 0, false); } else { - addVertex(a, b, VERTEX, false); - } - if (nonZero(bl)) { - addVertex(a+bl, d, VERTEX, false); - addQuadraticVertex(a, d, 0, a, d-bl, 0, false); - } else { - addVertex(a, d, VERTEX, false); + addVertex(c, b, VERTEX, true); } if (nonZero(br)) { addVertex(c, d-br, VERTEX, false); @@ -8029,11 +8026,17 @@ public class PGraphicsOpenGL extends PGraphics { } else { addVertex(c, d, VERTEX, false); } - if (nonZero(tr)) { - addVertex(c-tr, b, VERTEX, true); - addQuadraticVertex(c, b, 0, c, b+tr, 0, false); + if (nonZero(bl)) { + addVertex(a+bl, d, VERTEX, false); + addQuadraticVertex(a, d, 0, a, d-bl, 0, false); } else { - addVertex(c, b, VERTEX, true); + addVertex(a, d, VERTEX, false); + } + if (nonZero(tl)) { + addVertex(a, b+tl, VERTEX, false); + addQuadraticVertex(a, b, 0, a+tl, b, 0, false); + } else { + addVertex(a, b, VERTEX, false); } } @@ -8065,7 +8068,7 @@ public class PGraphicsOpenGL extends PGraphics { float val = 0; for (int i = 0; i < accuracy; i++) { idx = addVertex(centerX + cosLUT[(int) val] * radiusH, - centerY - sinLUT[(int) val] * radiusV, + centerY + sinLUT[(int) val] * radiusV, VERTEX, i == 0 && !fill); val = (val + inc) % SINCOS_LENGTH; @@ -8152,14 +8155,14 @@ public class PGraphicsOpenGL extends PGraphics { int ii; // i: (0 -> length) inclusive - // ii: (stopLUT -> startLUT) inclusive, going CCW (left-handed), + // ii: (startLUT -> stopLUT) inclusive, going CW (left-handed), // wrapping around end of LUT do { i += inc; i = PApplet.min(i, length); // clamp so last vertex won't go over - ii = stopLUT - i; // ii is never smaller than -SINCOS_LENGTH - if (ii < 0) ii += SINCOS_LENGTH; + ii = startLUT + i; // ii from 0 to (2 * SINCOS_LENGTH - 1) + if (ii >= SINCOS_LENGTH) ii -= SINCOS_LENGTH; pidx = idx; idx = addVertex(centerX + cosLUT[ii] * hr, @@ -8211,9 +8214,9 @@ public class PGraphicsOpenGL extends PGraphics { // back face setNormal(0, 0, -normZ); idx1 = addVertex(x1, y1, z1, 0, 0, VERTEX, true); - idx2 = addVertex(x2, y1, z1, 1, 0, VERTEX, false); + idx2 = addVertex(x1, y2, z1, 0, 1, VERTEX, false); idx3 = addVertex(x2, y2, z1, 1, 1, VERTEX, false); - idx4 = addVertex(x1, y2, z1, 0, 1, VERTEX, false); + idx4 = addVertex(x2, y1, z1, 1, 0, VERTEX, false); if (stroke) { addEdge(idx1, idx2, true, false); addEdge(idx2, idx3, false, false); @@ -8224,9 +8227,9 @@ public class PGraphicsOpenGL extends PGraphics { // front face setNormal(0, 0, normZ); - idx1 = addVertex(x2, y1, z2, 0, 0, VERTEX, false); + idx1 = addVertex(x1, y2, z2, 1, 1, VERTEX, false); idx2 = addVertex(x1, y1, z2, 1, 0, VERTEX, false); - idx3 = addVertex(x1, y2, z2, 1, 1, VERTEX, false); + idx3 = addVertex(x2, y1, z2, 0, 0, VERTEX, false); idx4 = addVertex(x2, y2, z2, 0, 1, VERTEX, false); if (stroke) { addEdge(idx1, idx2, true, false); @@ -8239,9 +8242,9 @@ public class PGraphicsOpenGL extends PGraphics { // right face setNormal(normX, 0, 0); idx1 = addVertex(x2, y1, z1, 0, 0, VERTEX, false); - idx2 = addVertex(x2, y1, z2, 1, 0, VERTEX, false); + idx2 = addVertex(x2, y2, z1, 0, 1, VERTEX, false); idx3 = addVertex(x2, y2, z2, 1, 1, VERTEX, false); - idx4 = addVertex(x2, y2, z1, 0, 1, VERTEX, false); + idx4 = addVertex(x2, y1, z2, 1, 0, VERTEX, false); if (stroke) { addEdge(idx1, idx2, true, false); addEdge(idx2, idx3, false, false); @@ -8252,9 +8255,9 @@ public class PGraphicsOpenGL extends PGraphics { // left face setNormal(-normX, 0, 0); - idx1 = addVertex(x1, y1, z2, 0, 0, VERTEX, false); + idx1 = addVertex(x1, y2, z1, 1, 1, VERTEX, false); idx2 = addVertex(x1, y1, z1, 1, 0, VERTEX, false); - idx3 = addVertex(x1, y2, z1, 1, 1, VERTEX, false); + idx3 = addVertex(x1, y1, z2, 0, 0, VERTEX, false); idx4 = addVertex(x1, y2, z2, 0, 1, VERTEX, false); if (stroke) { addEdge(idx1, idx2, true, false); @@ -8266,9 +8269,9 @@ public class PGraphicsOpenGL extends PGraphics { // top face setNormal(0, -normY, 0); - idx1 = addVertex(x1, y1, z2, 0, 0, VERTEX, false); + idx1 = addVertex(x2, y1, z1, 1, 1, VERTEX, false); idx2 = addVertex(x2, y1, z2, 1, 0, VERTEX, false); - idx3 = addVertex(x2, y1, z1, 1, 1, VERTEX, false); + idx3 = addVertex(x1, y1, z2, 0, 0, VERTEX, false); idx4 = addVertex(x1, y1, z1, 0, 1, VERTEX, false); if (stroke) { addEdge(idx1, idx2, true, false); @@ -8281,9 +8284,9 @@ public class PGraphicsOpenGL extends PGraphics { // bottom face setNormal(0, normY, 0); idx1 = addVertex(x1, y2, z1, 0, 0, VERTEX, false); - idx2 = addVertex(x2, y2, z1, 1, 0, VERTEX, false); + idx2 = addVertex(x1, y2, z2, 0, 1, VERTEX, false); idx3 = addVertex(x2, y2, z2, 1, 1, VERTEX, false); - idx4 = addVertex(x1, y2, z2, 0, 1, VERTEX, false); + idx4 = addVertex(x2, y2, z1, 1, 0, VERTEX, false); if (stroke) { addEdge(idx1, idx2, true, false); addEdge(idx2, idx3, false, false); @@ -8340,8 +8343,8 @@ public class PGraphicsOpenGL extends PGraphics { int i1 = vert0 + i; int i0 = vert0 + i - detailU; - indices[3 * i + 0] = i0; - indices[3 * i + 1] = i1; + indices[3 * i + 0] = i1; + indices[3 * i + 1] = i0; indices[3 * i + 2] = i1 + 1; addEdge(i0, i1, true, true); @@ -8374,13 +8377,13 @@ public class PGraphicsOpenGL extends PGraphics { int i1 = vert0 + i; int i0 = vert0 + i - detailU - 1; - indices[indCount + 6 * i + 0] = i0; - indices[indCount + 6 * i + 1] = i1; + indices[indCount + 6 * i + 0] = i1; + indices[indCount + 6 * i + 1] = i0; indices[indCount + 6 * i + 2] = i0 + 1; indices[indCount + 6 * i + 3] = i1; - indices[indCount + 6 * i + 4] = i1 + 1; - indices[indCount + 6 * i + 5] = i0 + 1; + indices[indCount + 6 * i + 4] = i0 + 1; + indices[indCount + 6 * i + 5] = i1 + 1; addEdge(i0, i1, true, true); addEdge(i1, i1 + 1, true, true); @@ -8413,8 +8416,8 @@ public class PGraphicsOpenGL extends PGraphics { int i0 = vert0 + i; int i1 = vert0 + i + detailU + 1; - indices[indCount + 3 * i + 0] = i0; - indices[indCount + 3 * i + 1] = i1; + indices[indCount + 3 * i + 0] = i1; + indices[indCount + 3 * i + 1] = i0; indices[indCount + 3 * i + 2] = i0 + 1; addEdge(i0, i0 + 1, true, true); @@ -9240,6 +9243,7 @@ public class PGraphicsOpenGL extends PGraphics { // // Normal calculation + // Expects vertices in CW (left-handed) order. void calcPolyNormal(int i0, int i1, int i2) { int index; @@ -9266,15 +9270,9 @@ public class PGraphicsOpenGL extends PGraphics { float v10y = y0 - y1; float v10z = z0 - z1; - // The automatic normal calculation in Processing assumes - // that vertices are given by user in CCW order (left-handed), - // internally in CW order (right-handed) so: - // n = v10 x v12 - // so that the normal extends outwards from the front face. - float nx = v10y * v12z - v12y * v10z; - float ny = v10z * v12x - v12z * v10x; - float nz = v10x * v12y - v12x * v10y; - + float nx = v12y * v10z - v10y * v12z; + float ny = v12z * v10x - v10z * v12x; + float nz = v12x * v10y - v10x * v12y; float d = PApplet.sqrt(nx * nx + ny * ny + nz * nz); nx /= d; ny /= d; From 6cc396152f2537a02c4d99c4d5729a19cf50f03f Mon Sep 17 00:00:00 2001 From: codeanticode Date: Tue, 22 Jul 2014 15:55:54 -0400 Subject: [PATCH 59/88] testing some functions/methods in PShapeOpenGL in advance of upcoming refactoring --- core/src/processing/opengl/PShapeOpenGL.java | 111 ++++++++++++++++--- 1 file changed, 94 insertions(+), 17 deletions(-) diff --git a/core/src/processing/opengl/PShapeOpenGL.java b/core/src/processing/opengl/PShapeOpenGL.java index 6db7fddca..a771ff053 100644 --- a/core/src/processing/opengl/PShapeOpenGL.java +++ b/core/src/processing/opengl/PShapeOpenGL.java @@ -58,6 +58,13 @@ import java.util.Stack; * DXF: http://en.wikipedia.org/wiki/AutoCAD_DXF */ public class PShapeOpenGL extends PShape { + // Testing these constants, not use as they might go away... + static public final int POSITION = 0; + static public final int NORMAL = 1; + static public final int TEXCOORD = 2; + static public final int DIRECTION = 3; + static public final int OFFSET = 4; + static protected final int TRANSLATE = 0; static protected final int ROTATE = 1; static protected final int SCALE = 2; @@ -108,6 +115,9 @@ public class PShapeOpenGL extends PShape { public int glPointAttrib; public int glPointIndex; + // Testing this field, not use as it might go away... + public int glUsage = PGL.STATIC_DRAW; + // ........................................................ // Offsets for geometry aggregation and update. @@ -2493,6 +2503,73 @@ public class PShapeOpenGL extends PShape { return tess; } + // Testing this method, not use as it might go away... + public float[] getTessellation(int kind, int data) { + updateTessellation(); + + if (kind == TRIANGLES) { + if (data == POSITION) { + if (is3D()) { + root.setModifiedPolyVertices(firstPolyVertex, lastPolyVertex); + } else if (is2D()) { + int last1 = lastPolyVertex + 1; + if (-1 < firstLineVertex) last1 = firstLineVertex; + if (-1 < firstPointVertex) last1 = firstPointVertex; + root.setModifiedPolyVertices(firstPolyVertex, last1 - 1); + } + return tessGeo.polyVertices; + } else if (data == NORMAL) { + if (is3D()) { + root.setModifiedPolyNormals(firstPolyVertex, lastPolyVertex); + } else if (is2D()) { + int last1 = lastPolyVertex + 1; + if (-1 < firstLineVertex) last1 = firstLineVertex; + if (-1 < firstPointVertex) last1 = firstPointVertex; + root.setModifiedPolyNormals(firstPolyVertex, last1 - 1); + } + return tessGeo.polyNormals; + } else if (data == TEXCOORD) { + if (is3D()) { + root.setModifiedPolyTexCoords(firstPolyVertex, lastPolyVertex); + } else if (is2D()) { + int last1 = lastPolyVertex + 1; + if (-1 < firstLineVertex) last1 = firstLineVertex; + if (-1 < firstPointVertex) last1 = firstPointVertex; + root.setModifiedPolyTexCoords(firstPolyVertex, last1 - 1); + } + return tessGeo.polyTexCoords; + } + } else if (kind == LINES) { + if (data == POSITION) { + if (is3D()) { + root.setModifiedLineVertices(firstLineVertex, lastLineVertex); + } else if (is2D()) { + root.setModifiedPolyVertices(firstLineVertex, lastLineVertex); + } + return tessGeo.lineVertices; + } else if (data == DIRECTION) { + if (is2D()) { + root.setModifiedLineAttributes(firstLineVertex, lastLineVertex); + } + return tessGeo.lineDirections; + } + } else if (kind == POINTS) { + if (data == POSITION) { + if (is3D()) { + root.setModifiedPointVertices(firstPointVertex, lastPointVertex); + } else if (is2D()) { + root.setModifiedPolyVertices(firstPointVertex, lastPointVertex); + } + return tessGeo.pointVertices; + } else if (data == OFFSET) { + if (is2D()) { + root.setModifiedPointAttributes(firstPointVertex, lastPointVertex); + } + return tessGeo.pointOffsets; + } + } + return null; + } /////////////////////////////////////////////////////////// @@ -3652,56 +3729,56 @@ public class PShapeOpenGL extends PShape { glPolyVertex = PGraphicsOpenGL.createVertexBufferObject(context, pgl); pgl.bindBuffer(PGL.ARRAY_BUFFER, glPolyVertex); pgl.bufferData(PGL.ARRAY_BUFFER, 4 * sizef, - tessGeo.polyVerticesBuffer, PGL.STATIC_DRAW); + tessGeo.polyVerticesBuffer, glUsage); tessGeo.updatePolyColorsBuffer(); if (glPolyColor == 0) glPolyColor = PGraphicsOpenGL.createVertexBufferObject(context, pgl); pgl.bindBuffer(PGL.ARRAY_BUFFER, glPolyColor); pgl.bufferData(PGL.ARRAY_BUFFER, sizei, - tessGeo.polyColorsBuffer, PGL.STATIC_DRAW); + tessGeo.polyColorsBuffer, glUsage); tessGeo.updatePolyNormalsBuffer(); if (glPolyNormal == 0) glPolyNormal = PGraphicsOpenGL.createVertexBufferObject(context, pgl); pgl.bindBuffer(PGL.ARRAY_BUFFER, glPolyNormal); pgl.bufferData(PGL.ARRAY_BUFFER, 3 * sizef, - tessGeo.polyNormalsBuffer, PGL.STATIC_DRAW); + tessGeo.polyNormalsBuffer, glUsage); tessGeo.updatePolyTexCoordsBuffer(); if (glPolyTexcoord == 0) glPolyTexcoord = PGraphicsOpenGL.createVertexBufferObject(context, pgl); pgl.bindBuffer(PGL.ARRAY_BUFFER, glPolyTexcoord); pgl.bufferData(PGL.ARRAY_BUFFER, 2 * sizef, - tessGeo.polyTexCoordsBuffer, PGL.STATIC_DRAW); + tessGeo.polyTexCoordsBuffer, glUsage); tessGeo.updatePolyAmbientBuffer(); if (glPolyAmbient == 0) glPolyAmbient = PGraphicsOpenGL.createVertexBufferObject(context, pgl); pgl.bindBuffer(PGL.ARRAY_BUFFER, glPolyAmbient); pgl.bufferData(PGL.ARRAY_BUFFER, sizei, - tessGeo.polyAmbientBuffer, PGL.STATIC_DRAW); + tessGeo.polyAmbientBuffer, glUsage); tessGeo.updatePolySpecularBuffer(); if (glPolySpecular == 0) glPolySpecular = PGraphicsOpenGL.createVertexBufferObject(context, pgl); pgl.bindBuffer(PGL.ARRAY_BUFFER, glPolySpecular); pgl.bufferData(PGL.ARRAY_BUFFER, sizei, - tessGeo.polySpecularBuffer, PGL.STATIC_DRAW); + tessGeo.polySpecularBuffer, glUsage); tessGeo.updatePolyEmissiveBuffer(); if (glPolyEmissive == 0) glPolyEmissive = PGraphicsOpenGL.createVertexBufferObject(context, pgl); pgl.bindBuffer(PGL.ARRAY_BUFFER, glPolyEmissive); pgl.bufferData(PGL.ARRAY_BUFFER, sizei, - tessGeo.polyEmissiveBuffer, PGL.STATIC_DRAW); + tessGeo.polyEmissiveBuffer, glUsage); tessGeo.updatePolyShininessBuffer(); if (glPolyShininess == 0) glPolyShininess = PGraphicsOpenGL.createVertexBufferObject(context, pgl); pgl.bindBuffer(PGL.ARRAY_BUFFER, glPolyShininess); pgl.bufferData(PGL.ARRAY_BUFFER, sizef, - tessGeo.polyShininessBuffer, PGL.STATIC_DRAW); + tessGeo.polyShininessBuffer, glUsage); pgl.bindBuffer(PGL.ARRAY_BUFFER, 0); @@ -3711,7 +3788,7 @@ public class PShapeOpenGL extends PShape { pgl.bindBuffer(PGL.ELEMENT_ARRAY_BUFFER, glPolyIndex); pgl.bufferData(PGL.ELEMENT_ARRAY_BUFFER, tessGeo.polyIndexCount * PGL.SIZEOF_INDEX, - tessGeo.polyIndicesBuffer, PGL.STATIC_DRAW); + tessGeo.polyIndicesBuffer, glUsage); pgl.bindBuffer(PGL.ELEMENT_ARRAY_BUFFER, 0); } @@ -3727,21 +3804,21 @@ public class PShapeOpenGL extends PShape { glLineVertex = PGraphicsOpenGL.createVertexBufferObject(context, pgl); pgl.bindBuffer(PGL.ARRAY_BUFFER, glLineVertex); pgl.bufferData(PGL.ARRAY_BUFFER, 4 * sizef, - tessGeo.lineVerticesBuffer, PGL.STATIC_DRAW); + tessGeo.lineVerticesBuffer, glUsage); tessGeo.updateLineColorsBuffer(); if (glLineColor == 0) glLineColor = PGraphicsOpenGL.createVertexBufferObject(context, pgl); pgl.bindBuffer(PGL.ARRAY_BUFFER, glLineColor); pgl.bufferData(PGL.ARRAY_BUFFER, sizei, - tessGeo.lineColorsBuffer, PGL.STATIC_DRAW); + tessGeo.lineColorsBuffer, glUsage); tessGeo.updateLineDirectionsBuffer(); if (glLineAttrib == 0) glLineAttrib = PGraphicsOpenGL.createVertexBufferObject(context, pgl); pgl.bindBuffer(PGL.ARRAY_BUFFER, glLineAttrib); pgl.bufferData(PGL.ARRAY_BUFFER, 4 * sizef, - tessGeo.lineDirectionsBuffer, PGL.STATIC_DRAW); + tessGeo.lineDirectionsBuffer, glUsage); pgl.bindBuffer(PGL.ARRAY_BUFFER, 0); @@ -3751,7 +3828,7 @@ public class PShapeOpenGL extends PShape { pgl.bindBuffer(PGL.ELEMENT_ARRAY_BUFFER, glLineIndex); pgl.bufferData(PGL.ELEMENT_ARRAY_BUFFER, tessGeo.lineIndexCount * PGL.SIZEOF_INDEX, - tessGeo.lineIndicesBuffer, PGL.STATIC_DRAW); + tessGeo.lineIndicesBuffer, glUsage); pgl.bindBuffer(PGL.ELEMENT_ARRAY_BUFFER, 0); } @@ -3767,21 +3844,21 @@ public class PShapeOpenGL extends PShape { glPointVertex = PGraphicsOpenGL.createVertexBufferObject(context, pgl); pgl.bindBuffer(PGL.ARRAY_BUFFER, glPointVertex); pgl.bufferData(PGL.ARRAY_BUFFER, 4 * sizef, - tessGeo.pointVerticesBuffer, PGL.STATIC_DRAW); + tessGeo.pointVerticesBuffer, glUsage); tessGeo.updatePointColorsBuffer(); if (glPointColor == 0) glPointColor = PGraphicsOpenGL.createVertexBufferObject(context, pgl); pgl.bindBuffer(PGL.ARRAY_BUFFER, glPointColor); pgl.bufferData(PGL.ARRAY_BUFFER, sizei, - tessGeo.pointColorsBuffer, PGL.STATIC_DRAW); + tessGeo.pointColorsBuffer, glUsage); tessGeo.updatePointOffsetsBuffer(); if (glPointAttrib == 0) glPointAttrib = PGraphicsOpenGL.createVertexBufferObject(context, pgl); pgl.bindBuffer(PGL.ARRAY_BUFFER, glPointAttrib); pgl.bufferData(PGL.ARRAY_BUFFER, 2 * sizef, - tessGeo.pointOffsetsBuffer, PGL.STATIC_DRAW); + tessGeo.pointOffsetsBuffer, glUsage); pgl.bindBuffer(PGL.ARRAY_BUFFER, 0); @@ -3791,7 +3868,7 @@ public class PShapeOpenGL extends PShape { pgl.bindBuffer(PGL.ELEMENT_ARRAY_BUFFER, glPointIndex); pgl.bufferData(PGL.ELEMENT_ARRAY_BUFFER, tessGeo.pointIndexCount * PGL.SIZEOF_INDEX, - tessGeo.pointIndicesBuffer, PGL.STATIC_DRAW); + tessGeo.pointIndicesBuffer, glUsage); pgl.bindBuffer(PGL.ELEMENT_ARRAY_BUFFER, 0); } From 6c4d4d75783173ae63eb05b224c2862a7efeb8b1 Mon Sep 17 00:00:00 2001 From: Ben Fry Date: Tue, 22 Jul 2014 16:02:58 -0400 Subject: [PATCH 60/88] misc notes --- todo.txt | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/todo.txt b/todo.txt index 087bc1ead..e036c6a85 100644 --- a/todo.txt +++ b/todo.txt @@ -3,6 +3,10 @@ X increase heap size to 256m (-Xmx256) per Manindra request X use a ButtonGroup so that the current Mode cannot be de-selected X https://github.com/processing/processing/issues/2545 +_ add a new pref for the 3.0 sketchbook location +_ remove minim +_ add the new sound library to the build process + pulls X Implementation of a list of open sketches in the Sketch menu @@ -590,6 +594,7 @@ _ https://github.com/processing/processing/issues/943 PDE / Manager +_ something to set min/max versions that are supported by a library _ contrib properties files ignored in favor of contributions.txt from p5.org _ https://github.com/processing/processing/issues/2572 _ ability to cancel a download/install From c3f0e62b1c3753c8513638fbdfee4ee9a9c9dd80 Mon Sep 17 00:00:00 2001 From: Ben Fry Date: Tue, 22 Jul 2014 16:03:28 -0400 Subject: [PATCH 61/88] table bug fixes and additions --- core/src/processing/data/Table.java | 39 +++++++++++++++++++++++--- core/src/processing/data/TableRow.java | 3 ++ core/todo.txt | 9 ++++-- 3 files changed, 45 insertions(+), 6 deletions(-) diff --git a/core/src/processing/data/Table.java b/core/src/processing/data/Table.java index c270dd96e..1e963abb0 100644 --- a/core/src/processing/data/Table.java +++ b/core/src/processing/data/Table.java @@ -155,11 +155,12 @@ public class Table { public Table(Iterable rows) { init(); - boolean typed = false; + boolean firstRow = true; for (TableRow row : rows) { - if (!typed) { + if (firstRow) { setColumnTypes(row.getColumnTypes()); - typed = true; + setColumnTitles(row.getColumnTitles()); + firstRow = false; } addRow(row); } @@ -505,6 +506,7 @@ public class Table { if (count > 0) { setString(row, col, new String(c, 0, count)); } + row++; // set row to row count (the current row index + 1) if (alloc != row) { setRowCount(row); // shrink to the actual size } @@ -1841,7 +1843,6 @@ public class Table { for (int col = 0; col < columns.length; col++) { switch (columnTypes[col]) { - case CATEGORY: case INT: setInt(row, col, source.getInt(col)); break; @@ -1857,6 +1858,14 @@ public class Table { case STRING: setString(row, col, source.getString(col)); break; + case CATEGORY: + int index = source.getInt(col); + setInt(row, col, index); + if (columnCategories[col].hasCategory(index)) { + columnCategories[col].setCategory(index, source.getString(col)); + } + break; + default: throw new RuntimeException("no types"); } @@ -2289,6 +2298,14 @@ public class Table { public int[] getColumnTypes() { return table.getColumnTypes(); } + + public String getColumnTitle(int column) { + return table.getColumnTitle(column); + } + + public String[] getColumnTitles() { + return table.getColumnTitles(); + } } @@ -3609,6 +3626,18 @@ public class Table { return indexToData.get(index); } + boolean hasCategory(int index) { + return index < size() && indexToData.get(index) != null; + } + + void setCategory(int index, String name) { + while (indexToData.size() <= index) { + indexToData.add(null); + } + indexToData.set(index, name); + dataToIndex.put(name, index); + } + int size() { return dataToIndex.size(); } @@ -3630,9 +3659,11 @@ public class Table { void read(DataInputStream input) throws IOException { int count = input.readInt(); + System.out.println("found " + count + " entries in category map"); dataToIndex = new HashMap(count); for (int i = 0; i < count; i++) { String str = input.readUTF(); + System.out.println(i + " " + str); dataToIndex.put(str, i); indexToData.add(str); } diff --git a/core/src/processing/data/TableRow.java b/core/src/processing/data/TableRow.java index 7107ee693..87e288825 100644 --- a/core/src/processing/data/TableRow.java +++ b/core/src/processing/data/TableRow.java @@ -109,4 +109,7 @@ public interface TableRow { public int getColumnType(int column); public int[] getColumnTypes(); + + public String getColumnTitle(int column); + public String[] getColumnTitles(); } diff --git a/core/todo.txt b/core/todo.txt index 224efcd5a..e27a87278 100644 --- a/core/todo.txt +++ b/core/todo.txt @@ -8,8 +8,13 @@ o Jer and Dan will look at their code, plus toxiclibs table X major performance improvements to 'newlines' parsing -X debugging table parsing with header rows -X bug fix for setting data type +X last row was being skipped on tables with the 'newlines' option set +X debug table parsing with header rows +X bug fix for setting data types +X add getColumnTitle(int) and getColumnTitles() to TableRow interface +X fixes for new Table(Iterable) +X category data types were not importing their dictionary +X column titles weren't set on the new table applet removal From 5cf458e53912b677d4848c5090aa27725b4c4236 Mon Sep 17 00:00:00 2001 From: Ben Fry Date: Tue, 22 Jul 2014 16:21:00 -0400 Subject: [PATCH 62/88] actually fix the category bug, and remove debug lines. ahem. --- core/src/processing/data/Table.java | 14 +++++++------- core/todo.txt | 2 ++ 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/core/src/processing/data/Table.java b/core/src/processing/data/Table.java index 1e963abb0..5272a2d66 100644 --- a/core/src/processing/data/Table.java +++ b/core/src/processing/data/Table.java @@ -1503,7 +1503,7 @@ public class Table { int[] intData = new int[rowCount]; for (int row = 0; row < rowCount; row++) { String s = getString(row, column); - intData[row] = PApplet.parseInt(s, missingInt); + intData[row] = (s == null) ? missingInt : PApplet.parseInt(s, missingInt); } columns[column] = intData; break; @@ -1513,7 +1513,7 @@ public class Table { for (int row = 0; row < rowCount; row++) { String s = getString(row, column); try { - longData[row] = Long.parseLong(s); + longData[row] = (s == null) ? missingLong : Long.parseLong(s); } catch (NumberFormatException nfe) { longData[row] = missingLong; } @@ -1525,7 +1525,7 @@ public class Table { float[] floatData = new float[rowCount]; for (int row = 0; row < rowCount; row++) { String s = getString(row, column); - floatData[row] = PApplet.parseFloat(s, missingFloat); + floatData[row] = (s == null) ? missingFloat : PApplet.parseFloat(s, missingFloat); } columns[column] = floatData; break; @@ -1535,7 +1535,7 @@ public class Table { for (int row = 0; row < rowCount; row++) { String s = getString(row, column); try { - doubleData[row] = Double.parseDouble(s); + doubleData[row] = (s == null) ? missingDouble : Double.parseDouble(s); } catch (NumberFormatException nfe) { doubleData[row] = missingDouble; } @@ -1861,7 +1861,7 @@ public class Table { case CATEGORY: int index = source.getInt(col); setInt(row, col, index); - if (columnCategories[col].hasCategory(index)) { + if (!columnCategories[col].hasCategory(index)) { columnCategories[col].setCategory(index, source.getString(col)); } break; @@ -3659,11 +3659,11 @@ public class Table { void read(DataInputStream input) throws IOException { int count = input.readInt(); - System.out.println("found " + count + " entries in category map"); + //System.out.println("found " + count + " entries in category map"); dataToIndex = new HashMap(count); for (int i = 0; i < count; i++) { String str = input.readUTF(); - System.out.println(i + " " + str); + //System.out.println(i + " " + str); dataToIndex.put(str, i); indexToData.add(str); } diff --git a/core/todo.txt b/core/todo.txt index e27a87278..ad25fb3fd 100644 --- a/core/todo.txt +++ b/core/todo.txt @@ -15,6 +15,8 @@ X add getColumnTitle(int) and getColumnTitles() to TableRow interface X fixes for new Table(Iterable) X category data types were not importing their dictionary X column titles weren't set on the new table +X when using setColumnType(), replace nulls with missingInt, missingFloat, etc +X formerly, was throwing a NullPointerException applet removal From 90f84a3b94aa16629ff8591ceafcac4a48728042 Mon Sep 17 00:00:00 2001 From: codeanticode Date: Tue, 22 Jul 2014 17:28:05 -0400 Subject: [PATCH 63/88] should fix #2630 --- core/src/processing/opengl/PJOGL.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/processing/opengl/PJOGL.java b/core/src/processing/opengl/PJOGL.java index 9957204c8..9aa70d2d1 100644 --- a/core/src/processing/opengl/PJOGL.java +++ b/core/src/processing/opengl/PJOGL.java @@ -167,7 +167,7 @@ public class PJOGL extends PGL { /** This countdown latch is used to maintain the synchronization between * Processing's drawing thread and JOGL's rendering thread */ - protected CountDownLatch drawLatch; + protected CountDownLatch drawLatch = new CountDownLatch(0); /** Flag used to do request final display() call to make sure that the * buffers are properly swapped. From 8873944ef9ed39dfaa7702fb315a69a8973642ea Mon Sep 17 00:00:00 2001 From: Ben Fry Date: Tue, 22 Jul 2014 17:30:35 -0400 Subject: [PATCH 64/88] add setRow() and fixes for Table(Iterable) performance --- core/src/processing/data/Table.java | 36 ++++++++++++++++++++++------- core/todo.txt | 1 + 2 files changed, 29 insertions(+), 8 deletions(-) diff --git a/core/src/processing/data/Table.java b/core/src/processing/data/Table.java index 5272a2d66..a76ec9bfe 100644 --- a/core/src/processing/data/Table.java +++ b/core/src/processing/data/Table.java @@ -155,14 +155,30 @@ public class Table { public Table(Iterable rows) { init(); - boolean firstRow = true; - for (TableRow row : rows) { - if (firstRow) { - setColumnTypes(row.getColumnTypes()); - setColumnTitles(row.getColumnTitles()); - firstRow = false; + + int row = 0; + int alloc = 10; + + for (TableRow incoming : rows) { + if (row == 0) { + setColumnTypes(incoming.getColumnTypes()); + setColumnTitles(incoming.getColumnTitles()); + // Do this after setting types, otherwise it'll attempt to parse the + // allocated but empty rows, and drive CATEGORY columns nutso. + setRowCount(alloc); + + } else if (row == alloc) { + // Far more efficient than re-allocating all columns and doing a copy + alloc *= 2; + setRowCount(alloc); } - addRow(row); + + //addRow(row); + setRow(row++, incoming); + } + // Shrink the table to only the rows that were used + if (row != alloc) { + setRowCount(row); } } @@ -1837,7 +1853,11 @@ public class Table { * @param source a reference to the original row to be duplicated */ public TableRow addRow(TableRow source) { - int row = rowCount; + return setRow(rowCount, source); + } + + + public TableRow setRow(int row, TableRow source) { // Make sure there are enough columns to add this data ensureBounds(row, source.getColumnCount() - 1); diff --git a/core/todo.txt b/core/todo.txt index ad25fb3fd..3061686db 100644 --- a/core/todo.txt +++ b/core/todo.txt @@ -15,6 +15,7 @@ X add getColumnTitle(int) and getColumnTitles() to TableRow interface X fixes for new Table(Iterable) X category data types were not importing their dictionary X column titles weren't set on the new table +X drastic performance improvements for addRow() X when using setColumnType(), replace nulls with missingInt, missingFloat, etc X formerly, was throwing a NullPointerException From db98fa474c43ecf1d96d8fe8769a8e11a1a7fd91 Mon Sep 17 00:00:00 2001 From: Jakub Valtar Date: Wed, 23 Jul 2014 03:02:23 +0200 Subject: [PATCH 65/88] Filling in missing alpha for blending operations Fixes #2012, fixes #2275. It's the same problem as #2030 - Java won't set the high bits when RGB, returns 0 for alpha in BlendingContext#compose(Raster, Raster, WritableRaster) --- core/src/processing/core/PGraphicsJava2D.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/core/src/processing/core/PGraphicsJava2D.java b/core/src/processing/core/PGraphicsJava2D.java index 4b43c7e90..a2828d08a 100644 --- a/core/src/processing/core/PGraphicsJava2D.java +++ b/core/src/processing/core/PGraphicsJava2D.java @@ -743,11 +743,14 @@ public class PGraphicsJava2D extends PGraphics { int[] srcPixels = new int[width]; int[] dstPixels = new int[width]; + // Java won't set the high bits when RGB, returns 0 for alpha + int alphaFiller = (dstIn.getNumBands() == 3) ? (0xFF << 24) : 0x00; + for (int y = 0; y < height; y++) { src.getDataElements(0, y, width, 1, srcPixels); dstIn.getDataElements(0, y, width, 1, dstPixels); for (int x = 0; x < width; x++) { - dstPixels[x] = blendColor(srcPixels[x], dstPixels[x], mode); + dstPixels[x] = blendColor(srcPixels[x], alphaFiller | dstPixels[x], mode); } dstOut.setDataElements(0, y, width, 1, dstPixels); } @@ -1671,7 +1674,7 @@ public class PGraphicsJava2D extends PGraphics { if (textFont == null) { defaultFontOrDeath("textWidth"); } - + Font font = (Font) textFont.getNative(); //if (font != null && (textFont.isStream() || hints[ENABLE_NATIVE_FONTS])) { if (font != null) { From f0b0f9abd916141fb2aa7ff007fd21d38e7142b8 Mon Sep 17 00:00:00 2001 From: Ben Fry Date: Thu, 24 Jul 2014 13:59:45 -0400 Subject: [PATCH 66/88] use 7u65 for OS X builds --- build/build.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/build.xml b/build/build.xml index 045ab9027..164865dc7 100755 --- a/build/build.xml +++ b/build/build.xml @@ -151,7 +151,7 @@ - + From a9a4d48ba92411dbf445a6a6123682480d97b9e7 Mon Sep 17 00:00:00 2001 From: Ben Fry Date: Fri, 25 Jul 2014 10:21:08 -0400 Subject: [PATCH 67/88] more bug fixes --- core/src/processing/data/FloatDict.java | 28 +++++++++++++++++++------ core/todo.txt | 5 +++++ 2 files changed, 27 insertions(+), 6 deletions(-) diff --git a/core/src/processing/data/FloatDict.java b/core/src/processing/data/FloatDict.java index e9b902396..71ea99ffd 100644 --- a/core/src/processing/data/FloatDict.java +++ b/core/src/processing/data/FloatDict.java @@ -411,13 +411,21 @@ public class FloatDict { public String minKey() { checkMinMax("minKey"); - return keys[minIndex()]; + int index = minIndex(); + if (index == -1) { + return null; + } + return keys[index]; } public float minValue() { checkMinMax("minValue"); - return values[minIndex()]; + int index = minIndex(); + if (index == -1) { + return Float.NaN; + } + return values[index]; } @@ -452,17 +460,25 @@ public class FloatDict { } - /** The key for a max value. */ + /** The key for a max value, or null if everything is NaN (no max). */ public String maxKey() { checkMinMax("maxKey"); - return keys[maxIndex()]; + int index = maxIndex(); + if (index == -1) { + return null; + } + return keys[index]; } - /** The max value. */ + /** The max value. (Or NaN if they're all NaN.) */ public float maxValue() { checkMinMax("maxValue"); - return values[maxIndex()]; + int index = maxIndex(); + if (index == -1) { + return Float.NaN; + } + return values[index]; } diff --git a/core/todo.txt b/core/todo.txt index 3061686db..8fdf0de6c 100644 --- a/core/todo.txt +++ b/core/todo.txt @@ -19,6 +19,11 @@ X drastic performance improvements for addRow() X when using setColumnType(), replace nulls with missingInt, missingFloat, etc X formerly, was throwing a NullPointerException +data types +X if all data is NaN in a FloatDict, return NaN for maxValue() and minValue() +X formerly as AIOOBE -1 because -1 means "not found" +X but that was indexing directly into the data array +_ add this handling for IntDict and others applet removal _ remove Applet as base class From f8144565fcbcba393fc19040feffd7c3b5f96a24 Mon Sep 17 00:00:00 2001 From: Ben Fry Date: Fri, 25 Jul 2014 18:07:32 -0400 Subject: [PATCH 68/88] fix for serial library exports on Windows --- app/src/processing/mode/java/JavaBuild.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/app/src/processing/mode/java/JavaBuild.java b/app/src/processing/mode/java/JavaBuild.java index 46c18816d..021f7ea5e 100644 --- a/app/src/processing/mode/java/JavaBuild.java +++ b/app/src/processing/mode/java/JavaBuild.java @@ -1446,7 +1446,11 @@ public class JavaBuild { } // https://github.com/processing/processing/issues/2239 runOptions.add("-Djna.nosys=true"); - + // https://github.com/processing/processing/issues/2559 + if (exportPlatform == PConstants.WINDOWS) { + runOptions.add("-Djava.library.path=\"%EXEDIR%\\lib;%PATH%\""); + } + /// macosx: write out Info.plist (template for classpath, etc) From e2f565b82554b93539a075d4ea51d0de40e7d80e Mon Sep 17 00:00:00 2001 From: Ben Fry Date: Fri, 25 Jul 2014 18:19:04 -0400 Subject: [PATCH 69/88] clean up indents and formatting --- .../processing/app/platform/LinuxPlatform.java | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/app/src/processing/app/platform/LinuxPlatform.java b/app/src/processing/app/platform/LinuxPlatform.java index 8360cc49a..85d2b4e9a 100644 --- a/app/src/processing/app/platform/LinuxPlatform.java +++ b/app/src/processing/app/platform/LinuxPlatform.java @@ -48,18 +48,19 @@ public class LinuxPlatform extends Platform { "placement. For more background, please read the wiki:\n" + "http://wiki.processing.org/w/Supported_Platforms#Linux", null); } - //Set x11 WM_CLASS property which is - //used as the application name by Gnome3 - //and other window managers - try{ + + // Set x11 WM_CLASS property which is used as the application + // name by Gnome3 and other window managers. + // https://github.com/processing/processing/issues/2534 + try { Toolkit xToolkit = Toolkit.getDefaultToolkit(); java.lang.reflect.Field awtAppClassNameField = - xToolkit.getClass().getDeclaredField("awtAppClassName"); + xToolkit.getClass().getDeclaredField("awtAppClassName"); awtAppClassNameField.setAccessible(true); awtAppClassNameField.set(xToolkit, "Processing"); - } - catch(Exception e){ - //In case the implementation details change... + + } catch(Exception e) { + // In case the implementation details change e.printStackTrace(); } } From a7566fd7a5a930fe441b890732bf5ae1c291787c Mon Sep 17 00:00:00 2001 From: Ben Fry Date: Fri, 25 Jul 2014 18:57:34 -0400 Subject: [PATCH 70/88] cleaning up the todo lists --- core/todo.txt | 34 +++++++++++++++++++++++----------- todo.txt | 47 ++++++++++++++++++++++++++++++++++++++++------- 2 files changed, 63 insertions(+), 18 deletions(-) diff --git a/core/todo.txt b/core/todo.txt index 8fdf0de6c..78a196ef8 100644 --- a/core/todo.txt +++ b/core/todo.txt @@ -5,6 +5,22 @@ X http://code.google.com/p/processing/issues/detail?id=218 X https://github.com/processing/processing/issues/257 X PVector discussion with Dan o Jer and Dan will look at their code, plus toxiclibs +X blendMode() broken with default renderer +X fix from Jakub Valtar +X https://github.com/processing/processing/issues/2012 +X may have been introduced between 2.0b7 and 2.0b8 +X https://github.com/processing/processing/issues/2275 +X https://github.com/processing/processing/issues/2276 +X https://github.com/processing/processing/issues/2483 +X if all data is NaN in a FloatDict, return NaN for maxValue() and minValue() +X formerly as AIOOBE -1 because -1 means "not found" +X but that was indexing directly into the data array + +pulls +X filter() not applying to images produced by saveframe() consistently +X https://github.com/processing/processing/issues/2619 +X drawLatch in PJOGL can be null after requesting frame rendering +X https://github.com/processing/processing/issues/2630 table X major performance improvements to 'newlines' parsing @@ -19,17 +35,19 @@ X drastic performance improvements for addRow() X when using setColumnType(), replace nulls with missingInt, missingFloat, etc X formerly, was throwing a NullPointerException -data types -X if all data is NaN in a FloatDict, return NaN for maxValue() and minValue() -X formerly as AIOOBE -1 because -1 means "not found" -X but that was indexing directly into the data array -_ add this handling for IntDict and others applet removal _ remove Applet as base class _ performance issues on OS X (might be threading due to Applet) _ https://github.com/processing/processing/issues/2423 +_ fix for maxValue() and minValue() when all entries are bad +_ on FloatDict it was NaN, check across the lists and other dict types + +_ better full screen mode for OS X +_ https://github.com/processing/processing/issues/2641 +_ http://stackoverflow.com/questions/6873568/fullscreen-feature-for-java-apps-on-osx-lion + _ bring back chaining in JSON (and add to XML) @@ -66,12 +84,6 @@ _ image = gc.createCompatibleVolatileImage(source.width, source.height, Transp _ https://github.com/processing/processing/issues/1844 _ 'collector' class.. Dict that points to a list _ String as a key, int/float/string list as values -_ blendMode(ADD) is broken with default renderer -_ https://github.com/processing/processing/issues/2012 -_ may have been introduced between 2.0b7 and 2.0b8 -_ https://github.com/processing/processing/issues/2275 -_ https://github.com/processing/processing/issues/2276 -_ https://github.com/processing/processing/issues/2483 _ add option to have full screen span across screens _ display=all in cmd line _ sketchDisplay() -> 0 for all, or 1, 2, 3... diff --git a/todo.txt b/todo.txt index e036c6a85..0c9be75e5 100644 --- a/todo.txt +++ b/todo.txt @@ -3,16 +3,51 @@ X increase heap size to 256m (-Xmx256) per Manindra request X use a ButtonGroup so that the current Mode cannot be de-selected X https://github.com/processing/processing/issues/2545 -_ add a new pref for the 3.0 sketchbook location -_ remove minim -_ add the new sound library to the build process +earlier +X cpu usage when nothing happening (unmarked duplicate) +X https://github.com/processing/processing/issues/1074 +gsoc +X Line coloring incorrect for filtered contribution listings +X https://github.com/processing/processing/issues/2583 +X https://github.com/processing/processing/pull/2598 +X Added Present's background color as an option to the Preferences window +X https://github.com/processing/processing/pull/2568 +X check for updates with contribs +X https://github.com/processing/processing/pull/2636 +X shows update manager on startup +X contrib properties files ignored in favor of contributions.txt from p5.org +X https://github.com/processing/processing/issues/2572 +X tweak mode integrated +X https://github.com/processing/processing/pull/2624 pulls X Implementation of a list of open sketches in the Sketch menu X https://github.com/processing/processing/pull/2551 -_ color selector for the pref (not reading it properly) -_ https://github.com/processing/processing/pull/2568 +X color selector for the pref (not reading it properly) +X https://github.com/processing/processing/pull/2568 +X lighting issues with non-planar triangle strips or quad strips +X https://github.com/processing/processing/issues/2014 +X https://github.com/processing/processing/issues/2018 +X https://github.com/processing/processing/pull/2644 +X set application name on Linux +X https://github.com/processing/processing/issues/2534 +X https://github.com/processing/processing/pull/2584 +X serial not working on export +X https://github.com/processing/processing/issues/2559 +X build error on Windows +X https://github.com/processing/processing/issues/2603 +X https://github.com/processing/processing/pull/2610 + + +_ add a new pref for the 3.0 sketchbook location +_ remove minim +_ add the new sound library to the build process + +_ double-clicking a .pde file doesn't open properly on OS X +_ https://github.com/processing/processing/issues/2639 +_ OS X export button not disabled on other platforms +_ https://github.com/processing/processing/issues/2642 _ look at the sound library https://github.com/wirsing/ProcessingSound @@ -595,8 +630,6 @@ _ https://github.com/processing/processing/issues/943 PDE / Manager _ something to set min/max versions that are supported by a library -_ contrib properties files ignored in favor of contributions.txt from p5.org -_ https://github.com/processing/processing/issues/2572 _ ability to cancel a download/install _ we shouldn't use .properties extension for modes, et al _ because a .properties file is iso8859-1 From ec07e271b92c4a2fab95e4fe6c42b9d44f09c476 Mon Sep 17 00:00:00 2001 From: Ben Fry Date: Fri, 25 Jul 2014 19:11:57 -0400 Subject: [PATCH 71/88] write release notes --- build/shared/revisions.txt | 100 +++++++++++++++++++++++++++++++++++++ 1 file changed, 100 insertions(+) diff --git a/build/shared/revisions.txt b/build/shared/revisions.txt index 4b6516220..c39e9aebd 100644 --- a/build/shared/revisions.txt +++ b/build/shared/revisions.txt @@ -1,3 +1,103 @@ +PROCESSING 3.0a1 (REV 0228) - 25 July 2014 + +Kicking off the 3.0 release process. The focus for Processing 3 is improving +the editor and the coding process, so we'll be integrating what was formerly +PDE X as the main editor. + +This release also includes a number of bug fixes and changes, based on +in-progress Google Summer of Code projects and others: + + +[ contributed fixes! ] + ++ Fix blendMode() problems in the default renderer (thanks Jakub Valtar!) + https://github.com/processing/processing/issues/2012 + https://github.com/processing/processing/issues/2275 + https://github.com/processing/processing/issues/2276 + https://github.com/processing/processing/issues/2483 + ++ Lighting issues with non-planar triangle strips or quad strips + https://github.com/processing/processing/issues/2014 + https://github.com/processing/processing/issues/2018 + https://github.com/processing/processing/pull/2644 + ++ Set the application name on Linux + https://github.com/processing/processing/issues/2534 + https://github.com/processing/processing/pull/2584 + ++ Serial library not working on export + https://github.com/processing/processing/issues/2559 + ++ Fix build problems on Windows + https://github.com/processing/processing/issues/2603 + https://github.com/processing/processing/pull/2610 + ++ filter() not applying to images produced by saveframe() consistently + https://github.com/processing/processing/issues/2619 + ++ drawLatch in PJOGL can be null after requesting frame rendering + https://github.com/processing/processing/issues/2630 + + +[ summer of code ] + ++ Line coloring incorrect for filtered contribution listings + https://github.com/processing/processing/issues/2583 + https://github.com/processing/processing/pull/2598 + ++ Added Present's background color as an option to the Preferences window + https://github.com/processing/processing/pull/2568 + ++ Check for updates on startup + https://github.com/processing/processing/pull/2636 + ++ Avoid problems with out-of-date contribution list + https://github.com/processing/processing/issues/2572 + ++ Integrate tweak mode into the new editor + https://github.com/processing/processing/pull/2624 + ++ Implementation of a list of open sketches in the Sketch menu + https://github.com/processing/processing/pull/2551 + ++ Add preference to set the present color + https://github.com/processing/processing/pull/2568 + + +[ more bug fixes ] + ++ Prevent the current Mode from being de-selected + https://github.com/processing/processing/issues/2545 + ++ Prevent ArrayIndexOutOfBoundsException when calling min/maxValue() + on a FloatDict that only contains NaN values + ++ Last row was being skipped on tables with the 'newlines' option set + ++ Debug table parsing with header rows + ++ Bug fix for setting Table data types + ++ Fixes for new Table(Iterable). Category data types were not importing + their dictionary, column titles weren't set, and performance improvements + were badly needed. + ++ When using setColumnType(), replace nulls with missingInt, missingFloat, etc + Formerly, this was throwing a NullPointerException. + + +[ changes ] + ++ Add copy() method to PVector + ++ Major performance improvements to parsing w/ the 'newlines' option + ++ add getColumnTitle(int) and getColumnTitles() to TableRow interface + + +. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . + + PROCESSING 2.2.1 (REV 0227) - 19 May 2014 A handful of bug fixes, the most prominent rolls back a change that broke From 4bf6256c574e885e8b83bb614ae2aad59cbbc2e5 Mon Sep 17 00:00:00 2001 From: Ben Fry Date: Fri, 25 Jul 2014 21:17:29 -0400 Subject: [PATCH 72/88] mark version --- core/todo.txt | 2 +- todo.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/core/todo.txt b/core/todo.txt index 78a196ef8..218aaaabf 100644 --- a/core/todo.txt +++ b/core/todo.txt @@ -1,4 +1,4 @@ -0228 core +0228 core (3.0a1) X add copy() method to PVector X modify PVector to include better methods for chaining operations X http://code.google.com/p/processing/issues/detail?id=218 diff --git a/todo.txt b/todo.txt index 0c9be75e5..ce8c46437 100644 --- a/todo.txt +++ b/todo.txt @@ -1,4 +1,4 @@ -0228 pde +0228 pde (3.0a1) X increase heap size to 256m (-Xmx256) per Manindra request X use a ButtonGroup so that the current Mode cannot be de-selected X https://github.com/processing/processing/issues/2545 From 4a60bfbfd2e9a06273acff09debbcf1dc1d77ea0 Mon Sep 17 00:00:00 2001 From: wirsing Date: Fri, 25 Jul 2014 20:10:33 -0700 Subject: [PATCH 73/88] repaired Filter + took out res + introduced Bandwidth for BPass. fixed some public/private bugs --- .../sound/examples/Effects/Filter/BPF/BPF.pde | 11 ++-- .../sound/examples/Effects/Filter/HPF/HPF.pde | 3 +- .../sound/examples/Effects/Filter/LPF/LPF.pde | 8 +-- java/libraries/sound/src/cpp/Makefile | 1 + .../src/cpp/include/methcla/plugins/bpf.h | 25 +++++++++ .../processing_sound_MethClaInterface.h | 18 +++++-- .../cpp/processing_sound_MethClaInterface.cpp | 52 +++++++++++-------- .../sound/src/processing/sound/BandPass.java | 26 ++++++---- .../sound/src/processing/sound/Engine.java | 20 ++++--- .../sound/src/processing/sound/HighPass.java | 23 +++----- .../sound/src/processing/sound/LowPass.java | 23 +++----- .../processing/sound/MethClaInterface.java | 11 ++-- .../sound/src/processing/sound/Mix.java | 42 +++++++++++++++ .../sound/src/processing/sound/Noise.java | 1 - .../src/processing/sound/Oscillator.java | 1 - java/libraries/sound/todo.txt | 11 ++-- 16 files changed, 180 insertions(+), 96 deletions(-) create mode 100644 java/libraries/sound/src/cpp/include/methcla/plugins/bpf.h create mode 100644 java/libraries/sound/src/processing/sound/Mix.java diff --git a/java/libraries/sound/examples/Effects/Filter/BPF/BPF.pde b/java/libraries/sound/examples/Effects/Filter/BPF/BPF.pde index cac2334ec..30a1f0746 100644 --- a/java/libraries/sound/examples/Effects/Filter/BPF/BPF.pde +++ b/java/libraries/sound/examples/Effects/Filter/BPF/BPF.pde @@ -6,7 +6,7 @@ In this example it is started and stopped by clicking into the renderer window. import processing.sound.*; WhiteNoise noise; -BandPass bPass; +BandPass bandPass; float amp=0.0; @@ -16,14 +16,15 @@ void setup() { // Create the noise generator + Filter noise = new WhiteNoise(this); - bPass = new BandPass(this); + bandPass = new BandPass(this); + noise.play(0.5); - bPass.process(noise, 100); + bandPass.process(noise, 100); } void draw() { - bPass.freq(map(mouseX, 0, 350, 20, 10000)); + bandPass.freq(map(mouseX, 0, width, 20, 10000)); - bPass.res(map(mouseY, 0, 350, 0.05, 1.0)); + bandPass.bw(map(mouseY, 0, height, 100, 1000)); } diff --git a/java/libraries/sound/examples/Effects/Filter/HPF/HPF.pde b/java/libraries/sound/examples/Effects/Filter/HPF/HPF.pde index 0ea52b2ae..d4a82cac9 100644 --- a/java/libraries/sound/examples/Effects/Filter/HPF/HPF.pde +++ b/java/libraries/sound/examples/Effects/Filter/HPF/HPF.pde @@ -17,10 +17,11 @@ void setup() { // Create the noise generator + filter noise = new WhiteNoise(this); highPass = new HighPass(this); + noise.play(0.5); highPass.process(noise, 100); } void draw() { - highPass.freq(map(mouseX, 0, 350, 20, 10000)); + highPass.freq(map(mouseX, 0, width, 80, 10000)); } diff --git a/java/libraries/sound/examples/Effects/Filter/LPF/LPF.pde b/java/libraries/sound/examples/Effects/Filter/LPF/LPF.pde index ab866be0c..070b280ed 100644 --- a/java/libraries/sound/examples/Effects/Filter/LPF/LPF.pde +++ b/java/libraries/sound/examples/Effects/Filter/LPF/LPF.pde @@ -6,7 +6,7 @@ In this example it is started and stopped by clicking into the renderer window. import processing.sound.*; WhiteNoise noise; -LowPass lPass; +LowPass lowPass; float amp=0.0; @@ -16,11 +16,11 @@ void setup() { // Create the noise generator + filter noise = new WhiteNoise(this); - lPass = new LowPass(this); + lowPass = new LowPass(this); noise.play(0.2); - lPass.process(noise, 800); + lowPass.process(noise, 800); } void draw() { - lPass.freq(map(mouseX, 0, 350, 800, 10000)); + lowPass.freq(map(mouseX, 0, width, 80, 10000)); } diff --git a/java/libraries/sound/src/cpp/Makefile b/java/libraries/sound/src/cpp/Makefile index 7ac3036da..7e866267d 100644 --- a/java/libraries/sound/src/cpp/Makefile +++ b/java/libraries/sound/src/cpp/Makefile @@ -8,3 +8,4 @@ clean: install: cp libMethClaInterface.jnilib ../../library/macosx + cp libMethClaInterface.jnilib /Users/wirsing/Documents/Processing/libraries/sound/library/macosx/ diff --git a/java/libraries/sound/src/cpp/include/methcla/plugins/bpf.h b/java/libraries/sound/src/cpp/include/methcla/plugins/bpf.h new file mode 100644 index 000000000..c58b8931c --- /dev/null +++ b/java/libraries/sound/src/cpp/include/methcla/plugins/bpf.h @@ -0,0 +1,25 @@ +/* + Copyright 2012-2013 Samplecount S.L. + + 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. +*/ + +#ifndef METHCLA_PLUGINS_BPF_H_INCLUDED +#define METHCLA_PLUGINS_BPF_H_INCLUDED + +#include + +METHCLA_EXPORT const Methcla_Library* methcla_plugins_bpf(const Methcla_Host*, const char*); +#define METHCLA_PLUGINS_BPF_URI METHCLA_PLUGINS_URI "/bpf" + +#endif /* METHCLA_PLUGINS_BPF_H_INCLUDED */ diff --git a/java/libraries/sound/src/cpp/include/processing_sound_MethClaInterface.h b/java/libraries/sound/src/cpp/include/processing_sound_MethClaInterface.h index 5fcfdd911..de571b3a0 100644 --- a/java/libraries/sound/src/cpp/include/processing_sound_MethClaInterface.h +++ b/java/libraries/sound/src/cpp/include/processing_sound_MethClaInterface.h @@ -234,18 +234,18 @@ JNIEXPORT jint JNICALL Java_processing_sound_MethClaInterface_doneAfter /* * Class: processing_sound_MethClaInterface * Method: highPassPlay - * Signature: ([IFF)[I + * Signature: ([IF)[I */ JNIEXPORT jintArray JNICALL Java_processing_sound_MethClaInterface_highPassPlay - (JNIEnv *, jobject, jintArray, jfloat, jfloat); + (JNIEnv *, jobject, jintArray, jfloat); /* * Class: processing_sound_MethClaInterface * Method: lowPassPlay - * Signature: ([IFF)[I + * Signature: ([IF)[I */ JNIEXPORT jintArray JNICALL Java_processing_sound_MethClaInterface_lowPassPlay - (JNIEnv *, jobject, jintArray, jfloat, jfloat); + (JNIEnv *, jobject, jintArray, jfloat); /* * Class: processing_sound_MethClaInterface @@ -258,9 +258,17 @@ JNIEXPORT jintArray JNICALL Java_processing_sound_MethClaInterface_bandPassPlay /* * Class: processing_sound_MethClaInterface * Method: filterSet - * Signature: (FFI)V + * Signature: (FI)V */ JNIEXPORT void JNICALL Java_processing_sound_MethClaInterface_filterSet + (JNIEnv *, jobject, jfloat, jint); + +/* + * Class: processing_sound_MethClaInterface + * Method: filterBwSet + * Signature: (FFI)V + */ +JNIEXPORT void JNICALL Java_processing_sound_MethClaInterface_filterBwSet (JNIEnv *, jobject, jfloat, jfloat, jint); /* diff --git a/java/libraries/sound/src/cpp/processing_sound_MethClaInterface.cpp b/java/libraries/sound/src/cpp/processing_sound_MethClaInterface.cpp index 47a0dc166..796bb8593 100644 --- a/java/libraries/sound/src/cpp/processing_sound_MethClaInterface.cpp +++ b/java/libraries/sound/src/cpp/processing_sound_MethClaInterface.cpp @@ -27,6 +27,7 @@ #include "methcla/plugins/fft.h" #include "methcla/plugins/hpf.h" #include "methcla/plugins/lpf.h" +#include "methcla/plugins/bpf.h" #include "methcla/plugins/delay.h" #include "methcla/plugins/reverb.h" #include "methcla/plugins/audio_in.h" @@ -50,9 +51,7 @@ struct ServerValue{ ServerValue() : amp(0), id(-1) - { - - } + {} float amp; int id; }; @@ -62,9 +61,7 @@ struct ServerArray{ fftSize(512), fft(fftSize), id(-1) - { - - } + {} int fftSize; std::vector fft; int id; @@ -93,7 +90,8 @@ JNIEXPORT jint JNICALL Java_processing_sound_MethClaInterface_engineNew (JNIEnv .addLibrary(methcla_plugins_pan2) .addLibrary(methcla_plugins_amplitude_follower) .addLibrary(methcla_plugins_hpf) - .addLibrary(methcla_plugins_lpf) + .addLibrary(methcla_plugins_lpf) + .addLibrary(methcla_plugins_bpf) .addLibrary(methcla_plugins_delay) .addLibrary(methcla_plugins_reverb) .addLibrary(methcla_plugins_fft) @@ -170,8 +168,8 @@ JNIEXPORT void JNICALL Java_processing_sound_MethClaInterface_oscAudioSet(JNIEnv if (m_freq[0] != -1) { Methcla::AudioBusId freq_bus = m_engine->audioBusId().alloc(); - request.set(m_nodeId[0], 0 , 0); - request.free(m_freq[1]); + //request.set(m_nodeId[0], 0 , 0); + //request.free(m_freq[1]); request.mapOutput(m_freq[0], 0, freq_bus); request.mapInput(m_nodeId[0], 0, freq_bus); @@ -179,15 +177,12 @@ JNIEXPORT void JNICALL Java_processing_sound_MethClaInterface_oscAudioSet(JNIEnv } if (m_amp[0] != -1) - { + { Methcla::AudioBusId amp_bus = m_engine->audioBusId().alloc(); //request.set(m_nodeId[0], 1 , 0); //request.free(m_amp[1]); request.mapOutput(m_amp[0], 0, amp_bus); - std::cout << m_amp[0] << std::endl; - request.set(m_amp[0], 0, 200); - request.mapInput(m_nodeId[0], 1, amp_bus); std::cout << "amp" << std::endl; @@ -272,7 +267,6 @@ JNIEXPORT jintArray JNICALL Java_processing_sound_MethClaInterface_sinePlay(JNIE }; JNIEXPORT jintArray JNICALL Java_processing_sound_MethClaInterface_sawPlay(JNIEnv *env, jobject object, jfloat freq, jfloat amp, jfloat add, jfloat pos){ - jintArray nodeId = env->NewIntArray(2); jint *m_nodeId = env->GetIntArrayElements(nodeId, NULL); @@ -293,6 +287,9 @@ JNIEXPORT jintArray JNICALL Java_processing_sound_MethClaInterface_sawPlay(JNIEn {Methcla::Value(1.f)} ); + engine().addNotificationHandler(engine().freeNodeIdHandler(synth.id())); + engine().addNotificationHandler(engine().freeNodeIdHandler(pan.id())); + request.mapOutput(synth.id(), 0, bus); request.mapInput(pan.id(), 0, bus); request.mapOutput(pan.id(), 0, Methcla::AudioBusId(0), Methcla::kBusMappingExternal); @@ -910,7 +907,7 @@ JNIEXPORT jintArray JNICALL Java_processing_sound_MethClaInterface_envelopePlay( return returnId; }; -JNIEXPORT jintArray JNICALL Java_processing_sound_MethClaInterface_highPassPlay(JNIEnv *env, jobject object, jintArray nodeId, jfloat freq, jfloat res){ +JNIEXPORT jintArray JNICALL Java_processing_sound_MethClaInterface_highPassPlay(JNIEnv *env, jobject object, jintArray nodeId, jfloat freq){ jint* m_nodeId = env->GetIntArrayElements(nodeId, 0); jintArray returnId = env->NewIntArray(2); @@ -924,7 +921,7 @@ JNIEXPORT jintArray JNICALL Java_processing_sound_MethClaInterface_highPassPlay( auto synth = request.synth( METHCLA_PLUGINS_HPF_URI, Methcla::NodePlacement::after(m_nodeId[0]), - {freq, res}, + {freq}, {} ); @@ -947,7 +944,7 @@ JNIEXPORT jintArray JNICALL Java_processing_sound_MethClaInterface_highPassPlay( return returnId; }; -JNIEXPORT jintArray JNICALL Java_processing_sound_MethClaInterface_lowPassPlay(JNIEnv *env, jobject object, jintArray nodeId, jfloat freq, jfloat res){ +JNIEXPORT jintArray JNICALL Java_processing_sound_MethClaInterface_lowPassPlay(JNIEnv *env, jobject object, jintArray nodeId, jfloat freq){ jint* m_nodeId = env->GetIntArrayElements(nodeId, 0); jintArray returnId = env->NewIntArray(2); @@ -961,7 +958,7 @@ JNIEXPORT jintArray JNICALL Java_processing_sound_MethClaInterface_lowPassPlay(J auto synth = request.synth( METHCLA_PLUGINS_LPF_URI, Methcla::NodePlacement::after(m_nodeId[0]), - {freq, res}, + {freq}, {} ); @@ -984,7 +981,7 @@ JNIEXPORT jintArray JNICALL Java_processing_sound_MethClaInterface_lowPassPlay(J return returnId; }; -JNIEXPORT jintArray JNICALL Java_processing_sound_MethClaInterface_bandPassPlay(JNIEnv *env, jobject object, jintArray nodeId, jfloat freq, jfloat res){ +JNIEXPORT jintArray JNICALL Java_processing_sound_MethClaInterface_bandPassPlay(JNIEnv *env, jobject object, jintArray nodeId, jfloat freq, jfloat bw){ jint* m_nodeId = env->GetIntArrayElements(nodeId, 0); jintArray returnId = env->NewIntArray(2); @@ -996,9 +993,9 @@ JNIEXPORT jintArray JNICALL Java_processing_sound_MethClaInterface_bandPassPlay( Methcla::Request request(engine()); request.openBundle(Methcla::immediately); auto synth = request.synth( - METHCLA_PLUGINS_HPF_URI, + METHCLA_PLUGINS_BPF_URI, Methcla::NodePlacement::after(m_nodeId[0]), - {freq, res}, + {freq, bw}, {} ); @@ -1021,12 +1018,21 @@ JNIEXPORT jintArray JNICALL Java_processing_sound_MethClaInterface_bandPassPlay( return returnId; }; -JNIEXPORT void JNICALL Java_processing_sound_MethClaInterface_filterSet(JNIEnv *env, jobject object, jfloat freq, jfloat res, jint nodeId){ +JNIEXPORT void JNICALL Java_processing_sound_MethClaInterface_filterSet(JNIEnv *env, jobject object, jfloat freq, jint nodeId){ Methcla::Request request(engine()); request.openBundle(Methcla::immediately); request.set(nodeId, 0, freq); - request.set(nodeId, 1, res); + request.closeBundle(); + request.send(); +}; + +JNIEXPORT void JNICALL Java_processing_sound_MethClaInterface_filterBwSet(JNIEnv *env, jobject object, jfloat freq, jfloat bw, jint nodeId){ + + Methcla::Request request(engine()); + request.openBundle(Methcla::immediately); + request.set(nodeId, 0, freq); + request.set(nodeId, 1, bw); request.closeBundle(); request.send(); }; diff --git a/java/libraries/sound/src/processing/sound/BandPass.java b/java/libraries/sound/src/processing/sound/BandPass.java index 6fac50289..91d173f47 100644 --- a/java/libraries/sound/src/processing/sound/BandPass.java +++ b/java/libraries/sound/src/processing/sound/BandPass.java @@ -7,8 +7,8 @@ public class BandPass implements SoundObject{ PApplet parent; private Engine m_engine; private int[] m_nodeId = {-1,-1}; - private float m_freq = 100; - private float m_res = 1; + private float m_freq = 4000; + private float m_bw = 1000; public BandPass(PApplet theParent) { this.parent = theParent; @@ -17,22 +17,26 @@ public class BandPass implements SoundObject{ m_engine.start(); } - public void process(SoundObject input, float freq, float res){ - m_freq=freq; m_res=res; - m_nodeId = m_engine.bandPassPlay(input.returnId(), m_freq, m_res); + public void process(SoundObject input, float freq, float bw){ + m_freq=freq; m_bw=bw; + m_nodeId = m_engine.bandPassPlay(input.returnId(), m_freq, m_bw); } public void process(SoundObject input, float freq){ m_freq=freq; - m_nodeId = m_engine.bandPassPlay(input.returnId(), m_freq, m_res); + m_nodeId = m_engine.bandPassPlay(input.returnId(), m_freq, m_bw); } + public void process(SoundObject input){ + m_nodeId = m_engine.bandPassPlay(input.returnId(), m_freq, m_bw); + } + private void set(){ - m_engine.filterSet(m_freq, m_res, m_nodeId[0]); + m_engine.filterBwSet(m_freq, m_bw, m_nodeId[0]); } - public void set(float freq, float res){ - m_freq=freq; m_res=res; + public void set(float freq, float bw){ + m_freq=freq; m_bw=bw; this.set(); } @@ -41,8 +45,8 @@ public class BandPass implements SoundObject{ this.set(); } - public void res(float res){ - m_res=res; + public void bw(float bw){ + m_bw=bw; this.set(); } diff --git a/java/libraries/sound/src/processing/sound/Engine.java b/java/libraries/sound/src/processing/sound/Engine.java index 7052996b6..51a04a40f 100644 --- a/java/libraries/sound/src/processing/sound/Engine.java +++ b/java/libraries/sound/src/processing/sound/Engine.java @@ -177,20 +177,24 @@ public class Engine { // Filters - public static int[] highPassPlay(int[] input, float freq, float res){ - return methCla.highPassPlay(input, freq, res); + public static int[] highPassPlay(int[] input, float freq){ + return methCla.highPassPlay(input, freq); }; - public static int[] lowPassPlay(int[] input, float freq, float res){ - return methCla.lowPassPlay(input, freq, res); + public static int[] lowPassPlay(int[] input, float freq){ + return methCla.lowPassPlay(input, freq); }; - public static int[] bandPassPlay(int[] input, float freq, float res){ - return methCla.bandPassPlay(input, freq, res); + public static int[] bandPassPlay(int[] input, float freq, float bw){ + return methCla.bandPassPlay(input, freq, bw); }; - public static void filterSet(float freq, float res, int nodeId){ - methCla.filterSet(freq, res, nodeId); + public static void filterSet(float freq, int nodeId){ + methCla.filterSet(freq, nodeId); + }; + + public static void filterBwSet(float freq, float bw, int nodeId){ + methCla.filterBwSet(freq, bw, nodeId); }; // Delay diff --git a/java/libraries/sound/src/processing/sound/HighPass.java b/java/libraries/sound/src/processing/sound/HighPass.java index 2574f04b0..01e23f120 100644 --- a/java/libraries/sound/src/processing/sound/HighPass.java +++ b/java/libraries/sound/src/processing/sound/HighPass.java @@ -8,7 +8,6 @@ public class HighPass implements SoundObject{ private Engine m_engine; private int[] m_nodeId = {-1,-1}; private float m_freq = 100; - private float m_res = 1; public HighPass(PApplet theParent) { this.parent = theParent; @@ -17,22 +16,21 @@ public class HighPass implements SoundObject{ m_engine.start(); } - public void process(SoundObject input, float freq, float res){ - m_freq=freq; m_res=res; - m_nodeId = m_engine.highPassPlay(input.returnId(), m_freq, m_res); - } - public void process(SoundObject input, float freq){ m_freq=freq; - m_nodeId = m_engine.highPassPlay(input.returnId(), m_freq, m_res); + m_nodeId = m_engine.highPassPlay(input.returnId(), m_freq); } + public void process(SoundObject input){ + m_nodeId = m_engine.highPassPlay(input.returnId(), m_freq); + } + private void set(){ - m_engine.filterSet(m_freq, m_res, m_nodeId[0]); + m_engine.filterSet(m_freq, m_nodeId[0]); } - public void set(float freq, float res){ - m_freq=freq; m_res=res; + public void set(float freq){ + m_freq=freq; this.set(); } @@ -40,11 +38,6 @@ public class HighPass implements SoundObject{ m_freq=freq; this.set(); } - - public void res(float res){ - m_res=res; - this.set(); - } public int[] returnId(){ return m_nodeId; diff --git a/java/libraries/sound/src/processing/sound/LowPass.java b/java/libraries/sound/src/processing/sound/LowPass.java index bcb889e20..5f2a17a3d 100644 --- a/java/libraries/sound/src/processing/sound/LowPass.java +++ b/java/libraries/sound/src/processing/sound/LowPass.java @@ -8,7 +8,6 @@ public class LowPass implements SoundObject{ private Engine m_engine; private int[] m_nodeId = {-1, -1}; private float m_freq = 100; - private float m_res = 1; public LowPass(PApplet theParent) { this.parent = theParent; @@ -17,22 +16,21 @@ public class LowPass implements SoundObject{ m_engine.start(); } - public void process(SoundObject input, float freq, float res){ - m_freq=freq; m_res=res; - m_nodeId = m_engine.lowPassPlay(input.returnId(), m_freq, m_res); - } - public void process(SoundObject input, float freq){ m_freq=freq; - m_nodeId = m_engine.lowPassPlay(input.returnId(), m_freq, m_res); + m_nodeId = m_engine.lowPassPlay(input.returnId(), m_freq); + } + + public void process(SoundObject input){ + m_nodeId = m_engine.lowPassPlay(input.returnId(), m_freq); } private void set(){ - m_engine.filterSet(m_freq, m_res, m_nodeId[0]); + m_engine.filterSet(m_freq, m_nodeId[0]); } - public void set(float freq, float res){ - m_freq=freq; m_res=res; + public void set(float freq){ + m_freq=freq; this.set(); } @@ -41,11 +39,6 @@ public class LowPass implements SoundObject{ this.set(); } - public void res(float res){ - m_res=res; - this.set(); - } - public int[] returnId(){ return m_nodeId; } diff --git a/java/libraries/sound/src/processing/sound/MethClaInterface.java b/java/libraries/sound/src/processing/sound/MethClaInterface.java index 51e5078f9..bb1a7d4c7 100644 --- a/java/libraries/sound/src/processing/sound/MethClaInterface.java +++ b/java/libraries/sound/src/processing/sound/MethClaInterface.java @@ -94,13 +94,16 @@ public class MethClaInterface // Filters - public native int[] highPassPlay(int[] input, float freq, float res); + public native int[] highPassPlay(int[] input, float freq); - public native int[] lowPassPlay(int[] input, float freq, float res); + public native int[] lowPassPlay(int[] input, float freq); - public native int[] bandPassPlay(int[] input, float freq, float res); + public native int[] bandPassPlay(int[] input, float freq, float bw); + + public native void filterSet(float freq, int nodeId); + + public native void filterBwSet(float freq, float bw, int nodeId); - public native void filterSet(float freq, float res, int nodeId); // Delay diff --git a/java/libraries/sound/src/processing/sound/Mix.java b/java/libraries/sound/src/processing/sound/Mix.java new file mode 100644 index 000000000..1cc9e5a69 --- /dev/null +++ b/java/libraries/sound/src/processing/sound/Mix.java @@ -0,0 +1,42 @@ +package processing.sound; + +import processing.core.PApplet; + +public class Mix implements SoundObject{ + + PApplet parent; + private Engine m_engine; + private int m_nodeId[] = {-1,-1}; + private int[] m_nodeInIds; + private float[] m_amps; + + public Mix(PApplet theParent) { + this.parent = theParent; + parent.registerMethod("dispose", this); + m_engine.setPreferences(theParent, 512, 44100); + m_engine.start(); + } + + public void play(SoundObject[] input, float[] amps){ + m_amps=amps; + for (int i=0; i Date: Mon, 9 Jun 2014 19:42:49 +0530 Subject: [PATCH 74/88] Version nos. display below tool/lib/mode --- .../processing/app/contrib/ContributionPanel.java | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/app/src/processing/app/contrib/ContributionPanel.java b/app/src/processing/app/contrib/ContributionPanel.java index ca6f2da4e..ff5424e2a 100644 --- a/app/src/processing/app/contrib/ContributionPanel.java +++ b/app/src/processing/app/contrib/ContributionPanel.java @@ -359,6 +359,20 @@ class ContributionPanel extends JPanel { } description.append(sentence); } + + String version = contrib.getPrettyVersion(); + + if (version != null && !version.isEmpty()) { + description.append("
"); + if (version.toLowerCase().startsWith("build")) // For Python mode + description.append("v" + + version.substring(5, version.indexOf(',')).trim()); + else if (version.toLowerCase().startsWith("v")) // For ketai library + description.append(version); + else + description.append("v" + version); + } + description.append(""); //descriptionText.setText(description.toString()); descriptionBlock.setText(description.toString()); From 588d2462791702da68b6248389eaf95a57d243e2 Mon Sep 17 00:00:00 2001 From: Joel Moniz Date: Wed, 11 Jun 2014 23:42:22 +0530 Subject: [PATCH 75/88] Added version number in new version available msg --- .../app/contrib/ContributionListing.java | 18 ++++++++++++++++++ .../app/contrib/ContributionPanel.java | 6 +++++- 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/app/src/processing/app/contrib/ContributionListing.java b/app/src/processing/app/contrib/ContributionListing.java index 8d5ccf653..65c16048f 100644 --- a/app/src/processing/app/contrib/ContributionListing.java +++ b/app/src/processing/app/contrib/ContributionListing.java @@ -407,6 +407,24 @@ public class ContributionListing { } + String getLatestVersion(Contribution contribution) { + Contribution newestContrib = getAvailableContribution(contribution); + String latestVersion = newestContrib.getPrettyVersion(); + if (latestVersion != null && !latestVersion.isEmpty()) { + if (latestVersion.toLowerCase().startsWith("build")) // For Python mode + return ("v" + latestVersion.substring(5, latestVersion.indexOf(',')) + .trim()); + else if (latestVersion.toLowerCase().startsWith("v")) // For ketai library + return latestVersion; + else + return ("v" + latestVersion); + } + else + return null; + } + + + boolean hasDownloadedLatestList() { return hasDownloadedLatestList; } diff --git a/app/src/processing/app/contrib/ContributionPanel.java b/app/src/processing/app/contrib/ContributionPanel.java index ff5424e2a..e4d46c7ac 100644 --- a/app/src/processing/app/contrib/ContributionPanel.java +++ b/app/src/processing/app/contrib/ContributionPanel.java @@ -385,7 +385,11 @@ class ContributionPanel extends JPanel { // Already marked for deletion, see requiresRestart() notes below. versionText.append("To finish an update, reinstall this contribution after restarting."); } else { - versionText.append("New version available!"); + String latestVersion = contribListing.getLatestVersion(contrib); + if (latestVersion != null) + versionText.append("New version (" + latestVersion + ") available!"); + else + versionText.append("New version available!"); if (contrib.getType().requiresRestart()) { // If a contribution can't be reinstalled in-place, the user may need // to remove the current version, restart Processing, then install. From 2aedcb765388459c9e43c77ee8db448159a86bcc Mon Sep 17 00:00:00 2001 From: Joel Moniz Date: Sat, 14 Jun 2014 15:32:04 +0530 Subject: [PATCH 76/88] "Last Updated" shows if "lastUpdated" field is present lastUpdate field is a Unix Timestamp in millisecs TODO: Add lastUpdated everywhere in contributions.txt, .properties file --- .../app/contrib/AvailableContribution.java | 12 ++++++++++-- app/src/processing/app/contrib/Contribution.java | 6 ++++++ .../processing/app/contrib/ContributionPanel.java | 11 +++++++++++ .../processing/app/contrib/LocalContribution.java | 9 ++++++++- 4 files changed, 35 insertions(+), 3 deletions(-) diff --git a/app/src/processing/app/contrib/AvailableContribution.java b/app/src/processing/app/contrib/AvailableContribution.java index f2d3efe65..639cbe9db 100644 --- a/app/src/processing/app/contrib/AvailableContribution.java +++ b/app/src/processing/app/contrib/AvailableContribution.java @@ -54,6 +54,13 @@ class AvailableContribution extends Contribution { version = PApplet.parseInt(versionStr, 0); } prettyVersion = params.get("prettyVersion"); + String lastUpdatedStr = params.get("lastUpdated"); + if (lastUpdatedStr != null) + try { + lastUpdated = Long.parseLong(lastUpdatedStr); + } catch (NumberFormatException e) { + lastUpdated = 0; + } } @@ -235,8 +242,8 @@ class AvailableContribution extends Contribution { version = Integer.parseInt(properties.get("version")); } catch (NumberFormatException e) { version = getVersion(); - System.err.println("The version number for the “" + name - + "” library is not set properly."); + System.err.println("The version number for the " + name + + " library is not set properly."); System.err .println("Please contact the library author to fix it according to the guidelines."); } @@ -256,6 +263,7 @@ class AvailableContribution extends Contribution { writer.println("paragraph=" + paragraph); writer.println("version=" + version); writer.println("prettyVersion=" + prettyVersion); + writer.println("lastUpdated=" + getLastUpdated()); writer.flush(); writer.close(); diff --git a/app/src/processing/app/contrib/Contribution.java b/app/src/processing/app/contrib/Contribution.java index 8367b98d3..9fc73c851 100644 --- a/app/src/processing/app/contrib/Contribution.java +++ b/app/src/processing/app/contrib/Contribution.java @@ -43,6 +43,7 @@ abstract public class Contribution { protected String paragraph; // protected int version; // 102 protected String prettyVersion; // "1.0.2" + protected long lastUpdated; // 1402805757 // "Sound" @@ -120,6 +121,11 @@ abstract public class Contribution { public String getPrettyVersion() { return prettyVersion; } + + // 1402805757 + public long getLastUpdated() { + return lastUpdated; + } abstract public ContributionType getType(); diff --git a/app/src/processing/app/contrib/ContributionPanel.java b/app/src/processing/app/contrib/ContributionPanel.java index e4d46c7ac..37b4fb6b3 100644 --- a/app/src/processing/app/contrib/ContributionPanel.java +++ b/app/src/processing/app/contrib/ContributionPanel.java @@ -28,6 +28,8 @@ import java.net.MalformedURLException; import java.net.URL; import java.util.regex.Matcher; import java.util.regex.Pattern; +import java.util.Date; +import java.text.DateFormat; import javax.swing.*; import javax.swing.border.EmptyBorder; @@ -373,6 +375,15 @@ class ContributionPanel extends JPanel { description.append("v" + version); } + long lastUpdatedUTC = contrib.getLastUpdated(); + if (lastUpdatedUTC != 0) { + DateFormat dateFormatter = DateFormat.getDateInstance(DateFormat.MEDIUM); + Date lastUpdatedDate = new Date(lastUpdatedUTC); + if (version != null && !version.isEmpty()) + description.append(", "); + description.append("Last Updated on " + dateFormatter.format(lastUpdatedDate)); + } + description.append(""); //descriptionText.setText(description.toString()); descriptionBlock.setText(description.toString()); diff --git a/app/src/processing/app/contrib/LocalContribution.java b/app/src/processing/app/contrib/LocalContribution.java index 03a6e0f31..7b485cde4 100644 --- a/app/src/processing/app/contrib/LocalContribution.java +++ b/app/src/processing/app/contrib/LocalContribution.java @@ -1,4 +1,4 @@ -/* -*- mode: java; c-basic-offset: 2; indent-tabs-mode: nil -*- */ +/* -*- mode: java; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* Part of the Processing project - http://processing.org @@ -74,6 +74,13 @@ public abstract class LocalContribution extends Contribution { System.err.println("Please contact the library author to fix it according to the guidelines."); } prettyVersion = properties.get("prettyVersion"); + try { + lastUpdated = Long.parseLong(properties.get("lastUpdated")); + } catch (NumberFormatException e) { + lastUpdated = 0; + System.err.println("The last updated timestamp for the “" + name + "” library is not set properly."); + System.err.println("Please contact the library author to fix it according to the guidelines."); + } } else { Base.log("No properties file at " + propertiesFile.getAbsolutePath()); From 84e248c23f2204e30c1cac43214601b033510e9c Mon Sep 17 00:00:00 2001 From: joelmoniz Date: Sat, 26 Jul 2014 13:17:20 +0400 Subject: [PATCH 77/88] A few final changes to Last Updated --- .../app/contrib/AvailableContribution.java | 23 +++++++++++++++---- .../app/contrib/LocalContribution.java | 6 +++-- 2 files changed, 22 insertions(+), 7 deletions(-) diff --git a/app/src/processing/app/contrib/AvailableContribution.java b/app/src/processing/app/contrib/AvailableContribution.java index 639cbe9db..44ed86888 100644 --- a/app/src/processing/app/contrib/AvailableContribution.java +++ b/app/src/processing/app/contrib/AvailableContribution.java @@ -1,4 +1,4 @@ -/* -*- mode: java; c-basic-offset: 2; indent-tabs-mode: nil -*- */ +/* -*- mode: java; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* Part of the Processing project - http://processing.org @@ -242,16 +242,29 @@ class AvailableContribution extends Contribution { version = Integer.parseInt(properties.get("version")); } catch (NumberFormatException e) { version = getVersion(); - System.err.println("The version number for the " + name - + " library is not set properly."); + System.err.println("The version number for the “" + name + + "” contribution is not set properly."); System.err - .println("Please contact the library author to fix it according to the guidelines."); + .println("Please contact the author to fix it according to the guidelines."); } String prettyVersion = properties.get("prettyVersion"); if (prettyVersion == null || prettyVersion.isEmpty()) prettyVersion = getPrettyVersion(); + long lastUpdated; + try { + lastUpdated = Long.parseLong(properties.get("lastUpdated")); + } + catch (NumberFormatException nfe) { + lastUpdated = getLastUpdated(); + // Better comment these out till all contribs have a lastUpdated +// System.err.println("The last updated date for the “" + name +// + "” contribution is not set properly."); +// System.err +// .println("Please contact the author to fix it according to the guidelines."); + } + if (propFile.delete() && propFile.createNewFile() && propFile.setWritable(true)) { PrintWriter writer = PApplet.createWriter(propFile); @@ -263,7 +276,7 @@ class AvailableContribution extends Contribution { writer.println("paragraph=" + paragraph); writer.println("version=" + version); writer.println("prettyVersion=" + prettyVersion); - writer.println("lastUpdated=" + getLastUpdated()); + writer.println("lastUpdated=" + lastUpdated); writer.flush(); writer.close(); diff --git a/app/src/processing/app/contrib/LocalContribution.java b/app/src/processing/app/contrib/LocalContribution.java index 7b485cde4..57ac2ffc9 100644 --- a/app/src/processing/app/contrib/LocalContribution.java +++ b/app/src/processing/app/contrib/LocalContribution.java @@ -78,8 +78,10 @@ public abstract class LocalContribution extends Contribution { lastUpdated = Long.parseLong(properties.get("lastUpdated")); } catch (NumberFormatException e) { lastUpdated = 0; - System.err.println("The last updated timestamp for the “" + name + "” library is not set properly."); - System.err.println("Please contact the library author to fix it according to the guidelines."); + + // Better comment these out till all contribs have a lastUpdated +// System.err.println("The last updated timestamp for the “" + name + "” library is not set properly."); +// System.err.println("Please contact the library author to fix it according to the guidelines."); } } else { From d20a9de36183cbe1dbfdeeffc048614a6434ccb1 Mon Sep 17 00:00:00 2001 From: Ben Fry Date: Sat, 26 Jul 2014 10:25:10 -0400 Subject: [PATCH 78/88] incorporate Mode fix from Joel (issue #2615) --- app/src/processing/app/Editor.java | 9 +++++++-- build/shared/revisions.txt | 4 ++++ todo.txt | 2 ++ 3 files changed, 13 insertions(+), 2 deletions(-) diff --git a/app/src/processing/app/Editor.java b/app/src/processing/app/Editor.java index dbbd9c7ec..4ac6b163a 100644 --- a/app/src/processing/app/Editor.java +++ b/app/src/processing/app/Editor.java @@ -389,8 +389,13 @@ public abstract class Editor extends JFrame implements RunnerListener { JRadioButtonMenuItem item = new JRadioButtonMenuItem(m.getTitle()); item.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { - base.changeMode(m); - if (sketch.isModified()) { + if (!sketch.isModified()) { + base.changeMode(m); + + } else { + // Re-select the old checkbox, because it was automatically + // updated by Java, even though the Mode could not be changed. + // https://github.com/processing/processing/issues/2615 for (Component c : modeMenu.getPopupMenu().getComponents()) { if (c instanceof JRadioButtonMenuItem) { if (((JRadioButtonMenuItem)c).getText() == mode.getTitle()) { diff --git a/build/shared/revisions.txt b/build/shared/revisions.txt index c39e9aebd..d15d52b01 100644 --- a/build/shared/revisions.txt +++ b/build/shared/revisions.txt @@ -63,6 +63,10 @@ in-progress Google Summer of Code projects and others: + Add preference to set the present color https://github.com/processing/processing/pull/2568 ++ Fix a problem where mode menu selection would change even if + the change was canceled due to the sketch being modified + https://github.com/processing/processing/issues/2615 + [ more bug fixes ] diff --git a/todo.txt b/todo.txt index ce8c46437..01e3bab05 100644 --- a/todo.txt +++ b/todo.txt @@ -20,6 +20,8 @@ X contrib properties files ignored in favor of contributions.txt from p5.org X https://github.com/processing/processing/issues/2572 X tweak mode integrated X https://github.com/processing/processing/pull/2624 +X wrong mode selected if sketch is modified (checkbox changes) +X https://github.com/processing/processing/issues/2615 pulls X Implementation of a list of open sketches in the Sketch menu From 4b7cf3137388808622968767e78222809d0fcfa7 Mon Sep 17 00:00:00 2001 From: Ben Fry Date: Sat, 26 Jul 2014 10:56:14 -0400 Subject: [PATCH 79/88] move sketch modified on mode change warning --- app/src/processing/app/Base.java | 6 ------ app/src/processing/app/Editor.java | 4 ++++ build/shared/revisions.txt | 3 +++ todo.txt | 2 ++ 4 files changed, 9 insertions(+), 6 deletions(-) diff --git a/app/src/processing/app/Base.java b/app/src/processing/app/Base.java index b2361d2bf..493f10a49 100644 --- a/app/src/processing/app/Base.java +++ b/app/src/processing/app/Base.java @@ -605,12 +605,6 @@ public class Base { protected void changeMode(Mode mode) { if (activeEditor.getMode() != mode) { Sketch sketch = activeEditor.getSketch(); - if (sketch.isModified()) { - Base.showWarning("Save", - "Please save the sketch before changing the mode.", - null); - return; - } nextMode = mode; // If the current editor contains file extensions that the new mode can handle, then diff --git a/app/src/processing/app/Editor.java b/app/src/processing/app/Editor.java index 4ac6b163a..806771478 100644 --- a/app/src/processing/app/Editor.java +++ b/app/src/processing/app/Editor.java @@ -393,6 +393,10 @@ public abstract class Editor extends JFrame implements RunnerListener { base.changeMode(m); } else { + Base.showWarning("Save", + "Please save the sketch before changing the mode.", + null); + // Re-select the old checkbox, because it was automatically // updated by Java, even though the Mode could not be changed. // https://github.com/processing/processing/issues/2615 diff --git a/build/shared/revisions.txt b/build/shared/revisions.txt index d15d52b01..d417bbda2 100644 --- a/build/shared/revisions.txt +++ b/build/shared/revisions.txt @@ -67,6 +67,9 @@ in-progress Google Summer of Code projects and others: the change was canceled due to the sketch being modified https://github.com/processing/processing/issues/2615 ++ Add date and time stamps to the Contribution Manager + https://github.com/processing/processing/pull/2651 + [ more bug fixes ] diff --git a/todo.txt b/todo.txt index 01e3bab05..faa9cd79c 100644 --- a/todo.txt +++ b/todo.txt @@ -22,6 +22,8 @@ X tweak mode integrated X https://github.com/processing/processing/pull/2624 X wrong mode selected if sketch is modified (checkbox changes) X https://github.com/processing/processing/issues/2615 +X Add date and time stamps to the Contribution Manager +X https://github.com/processing/processing/pull/2651 pulls X Implementation of a list of open sketches in the Sketch menu From d01710cc45673e0c15759e53ee0e81a2525e8d23 Mon Sep 17 00:00:00 2001 From: Ben Fry Date: Sat, 26 Jul 2014 11:02:28 -0400 Subject: [PATCH 80/88] remove depracted api usage --- app/src/processing/app/Preferences.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/processing/app/Preferences.java b/app/src/processing/app/Preferences.java index 363f37b6b..77343774e 100644 --- a/app/src/processing/app/Preferences.java +++ b/app/src/processing/app/Preferences.java @@ -477,12 +477,12 @@ public class Preferences { @Override public void mouseExited(MouseEvent e) { - dialog.setCursor(Cursor.DEFAULT_CURSOR); + dialog.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); } @Override public void mouseEntered(MouseEvent e) { - dialog.setCursor(Cursor.HAND_CURSOR); + dialog.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR)); } @Override From faace6ca12f84902cdf8a9ba870db73988d5cff1 Mon Sep 17 00:00:00 2001 From: Ben Fry Date: Sat, 26 Jul 2014 11:21:17 -0400 Subject: [PATCH 81/88] clean up several warnings --- app/src/processing/mode/java/JavaMode.java | 2 +- pdex/.externalToolBuilders/Ant_Builder.launch | 1 + pdex/src/com/illposed/osc/OSCBundle.java | 6 +- .../galsasson/mode/tweak/ColorSelector.java | 3 - .../galsasson/mode/tweak/HProgressBar.java | 5 +- pdex/src/galsasson/mode/tweak/Handle.java | 7 +- .../galsasson/mode/tweak/SketchParser.java | 2 - .../mode/experimental/ASTGenerator.java | 65 +++++++++---------- .../mode/experimental/ASTNodeWrapper.java | 4 +- .../mode/experimental/AutoSaveUtil.java | 9 +-- .../mode/experimental/CompilationChecker.java | 7 +- .../experimental/CompletionCandidate.java | 1 - .../mode/experimental/DebugEditor.java | 8 +-- .../mode/experimental/DebugToolbar.java | 2 +- .../mode/experimental/Debugger.java | 6 +- .../experimental/ErrorCheckerService.java | 5 -- .../experimental/ErrorMessageSimplifier.java | 2 - .../mode/experimental/ExperimentalMode.java | 3 +- .../mode/experimental/LineBreakpoint.java | 13 ++-- .../mode/experimental/OffsetMatcher.java | 2 +- .../mode/experimental/SketchOutline.java | 6 -- .../mode/experimental/TabOutline.java | 2 - .../mode/experimental/TextArea.java | 1 - .../mode/experimental/TextAreaPainter.java | 6 +- .../mode/experimental/VariableInspector.java | 14 ++-- .../mode/experimental/XQPreprocessor.java | 17 ++--- 26 files changed, 81 insertions(+), 118 deletions(-) diff --git a/app/src/processing/mode/java/JavaMode.java b/app/src/processing/mode/java/JavaMode.java index 0753404b5..4515d46d7 100644 --- a/app/src/processing/mode/java/JavaMode.java +++ b/app/src/processing/mode/java/JavaMode.java @@ -46,7 +46,7 @@ public class JavaMode extends Mode { public String getTitle() { - return "Java"; + return "Java (2.0)"; } diff --git a/pdex/.externalToolBuilders/Ant_Builder.launch b/pdex/.externalToolBuilders/Ant_Builder.launch index ad7738bd9..2f93ff37a 100644 --- a/pdex/.externalToolBuilders/Ant_Builder.launch +++ b/pdex/.externalToolBuilders/Ant_Builder.launch @@ -12,6 +12,7 @@ + diff --git a/pdex/src/com/illposed/osc/OSCBundle.java b/pdex/src/com/illposed/osc/OSCBundle.java index bce88824d..5ce38235e 100644 --- a/pdex/src/com/illposed/osc/OSCBundle.java +++ b/pdex/src/com/illposed/osc/OSCBundle.java @@ -155,13 +155,13 @@ public class OSCBundle extends OSCPacket { */ protected void computeTimeTagByteArray(OSCJavaToByteArrayConverter stream) { if ((null == timestamp) || (timestamp == TIMESTAMP_IMMEDIATE)) { - stream.write((int) 0); - stream.write((int) 1); + stream.write(0); + stream.write(1); return; } long millisecs = timestamp.getTime(); - long secsSince1970 = (long) (millisecs / 1000); + long secsSince1970 = millisecs / 1000; long secs = secsSince1970 + SECONDS_FROM_1900_TO_1970.longValue(); // this line was cribbed from jakarta commons-net's NTP TimeStamp code diff --git a/pdex/src/galsasson/mode/tweak/ColorSelector.java b/pdex/src/galsasson/mode/tweak/ColorSelector.java index ede620633..d2dbe82cb 100644 --- a/pdex/src/galsasson/mode/tweak/ColorSelector.java +++ b/pdex/src/galsasson/mode/tweak/ColorSelector.java @@ -2,14 +2,11 @@ package galsasson.mode.tweak; import java.awt.BorderLayout; import java.awt.Color; -import java.awt.Container; import java.awt.Cursor; import java.awt.Dimension; -import java.awt.FlowLayout; import javax.swing.Box; import javax.swing.JFrame; -import javax.swing.border.EmptyBorder; import processing.core.PApplet; import processing.core.PGraphics; diff --git a/pdex/src/galsasson/mode/tweak/HProgressBar.java b/pdex/src/galsasson/mode/tweak/HProgressBar.java index 9501163dc..f94e04974 100644 --- a/pdex/src/galsasson/mode/tweak/HProgressBar.java +++ b/pdex/src/galsasson/mode/tweak/HProgressBar.java @@ -1,6 +1,5 @@ package galsasson.mode.tweak; -import java.awt.Color; import java.awt.Graphics2D; import java.awt.Polygon; import java.awt.geom.AffineTransform; @@ -20,10 +19,10 @@ public class HProgressBar { setPos(0); - int xl[] = {0, 0, -(int)((float)size/1.5)}; + int xl[] = {0, 0, -(int)(size/1.5)}; int yl[] = {-(int)((float)size/3), (int)((float)size/3), 0}; leftPoly = new Polygon(xl, yl, 3); - int xr[] = {0, (int)((float)size/1.5), 0}; + int xr[] = {0, (int)(size/1.5), 0}; int yr[] = {-(int)((float)size/3), 0, (int)((float)size/3)}; rightPoly = new Polygon(xr, yr, 3); } diff --git a/pdex/src/galsasson/mode/tweak/Handle.java b/pdex/src/galsasson/mode/tweak/Handle.java index 73731a44d..3e9453a6c 100644 --- a/pdex/src/galsasson/mode/tweak/Handle.java +++ b/pdex/src/galsasson/mode/tweak/Handle.java @@ -1,11 +1,6 @@ package galsasson.mode.tweak; -import java.awt.BasicStroke; -import java.awt.Color; -import java.awt.Graphics; import java.awt.Graphics2D; -import java.awt.Polygon; -import java.awt.RenderingHints; import java.awt.geom.AffineTransform; import java.math.BigDecimal; import java.util.Comparator; @@ -176,7 +171,7 @@ public class Handle { private float getChange() { int pixels = xCurrent - xLast; - return (float)pixels*incValue; + return pixels*incValue; } public void setPos(int nx, int ny) diff --git a/pdex/src/galsasson/mode/tweak/SketchParser.java b/pdex/src/galsasson/mode/tweak/SketchParser.java index affa86e97..8c42f27e9 100644 --- a/pdex/src/galsasson/mode/tweak/SketchParser.java +++ b/pdex/src/galsasson/mode/tweak/SketchParser.java @@ -8,8 +8,6 @@ import java.util.Set; import java.util.regex.Matcher; import java.util.regex.Pattern; -import processing.app.Sketch; - public class SketchParser { public ArrayList colorBoxes[]; diff --git a/pdex/src/processing/mode/experimental/ASTGenerator.java b/pdex/src/processing/mode/experimental/ASTGenerator.java index c764d9a61..f68f8c2c1 100644 --- a/pdex/src/processing/mode/experimental/ASTGenerator.java +++ b/pdex/src/processing/mode/experimental/ASTGenerator.java @@ -1008,28 +1008,23 @@ public class ASTGenerator { ASTNode childExpr = getChildExpression(testnode); log("Parent expression : " + getParentExpression(testnode)); log("Child expression : " + childExpr); - if (childExpr instanceof ASTNode) { - if (!noCompare) { - log("Original testnode " - + getNodeAsString(testnode)); - testnode = getParentExpression(testnode); - log("Corrected testnode " - + getNodeAsString(testnode)); - } - ClassMember expr = resolveExpression3rdParty(nearestNode, testnode, - noCompare); - if (expr == null) { - log("Expr is null"); - } else { - log("Expr is " + expr.toString()); - candidates = getMembersForType(expr, childExpr.toString(), - noCompare, false); - } - } - else - { - log("ChildExpr is null"); + + if (!noCompare) { + log("Original testnode " + + getNodeAsString(testnode)); + testnode = getParentExpression(testnode); + log("Corrected testnode " + + getNodeAsString(testnode)); } + ClassMember expr = resolveExpression3rdParty(nearestNode, testnode, + noCompare); + if (expr == null) { + log("Expr is null"); + } else { + log("Expr is " + expr.toString()); + candidates = getMembersForType(expr, childExpr.toString(), + noCompare, false); + } } showPredictions(word); @@ -1263,7 +1258,9 @@ public class ASTGenerator { Class tehClass = null; // First, see if the classname is a fully qualified name and loads straightaway tehClass = loadClass(className); - if(tehClass instanceof Class){ + + // do you mean to check for 'null' here? otherwise, this expression is always true [fry] + if (tehClass instanceof Class) { //log(tehClass.getName() + " located straightaway"); return tehClass; } @@ -1458,8 +1455,7 @@ public class ASTGenerator { .structuralPropertiesForType().iterator(); // logE("Props of " + node.getClass().getName()); while (it.hasNext()) { - StructuralPropertyDescriptor prop = (StructuralPropertyDescriptor) it - .next(); + StructuralPropertyDescriptor prop = it.next(); if (prop.isChildProperty() || prop.isSimpleProperty()) { if (node.getStructuralProperty(prop) != null) { @@ -1505,9 +1501,9 @@ public class ASTGenerator { } List nodes = null; if (parent instanceof TypeDeclaration) { - nodes = (List) ((TypeDeclaration) parent).bodyDeclarations(); + nodes = ((TypeDeclaration) parent).bodyDeclarations(); } else if (parent instanceof Block) { - nodes = (List) ((Block) parent).statements(); + nodes = ((Block) parent).statements(); } else { System.err.println("THIS CONDITION SHOULD NOT OCCUR - findClosestNode " + getNodeAsString(parent)); @@ -2196,13 +2192,12 @@ public class ASTGenerator { * @param tnode */ public static void visitRecur(ASTNode node, DefaultMutableTreeNode tnode) { - Iterator it = node - .structuralPropertiesForType().iterator(); + Iterator it = + node.structuralPropertiesForType().iterator(); //logE("Props of " + node.getClass().getName()); DefaultMutableTreeNode ctnode = null; while (it.hasNext()) { - StructuralPropertyDescriptor prop = (StructuralPropertyDescriptor) it - .next(); + StructuralPropertyDescriptor prop = it.next(); if (prop.isChildProperty() || prop.isSimpleProperty()) { if (node.getStructuralProperty(prop) != null) { @@ -2274,11 +2269,10 @@ public class ASTGenerator { while (!stack.isEmpty()) { ASTNode node = (ASTNode) stack.pop(); //log("Popped from stack: " + getNodeAsString(node)); - Iterator it = node - .structuralPropertiesForType().iterator(); + Iterator it = + node.structuralPropertiesForType().iterator(); while (it.hasNext()) { - StructuralPropertyDescriptor prop = (StructuralPropertyDescriptor) it - .next(); + StructuralPropertyDescriptor prop = it.next(); if (prop.isChildProperty() || prop.isSimpleProperty()) { if (node.getStructuralProperty(prop) instanceof ASTNode) { @@ -2463,8 +2457,7 @@ public class ASTGenerator { .structuralPropertiesForType().iterator(); //logE("Props of " + node.getClass().getName()); while (it.hasNext()) { - StructuralPropertyDescriptor prop = (StructuralPropertyDescriptor) it - .next(); + StructuralPropertyDescriptor prop = it.next(); if (prop.isChildProperty() || prop.isSimpleProperty()) { if (node.getStructuralProperty(prop) != null) { diff --git a/pdex/src/processing/mode/experimental/ASTNodeWrapper.java b/pdex/src/processing/mode/experimental/ASTNodeWrapper.java index 9798f3e8f..62d84a3ca 100644 --- a/pdex/src/processing/mode/experimental/ASTNodeWrapper.java +++ b/pdex/src/processing/mode/experimental/ASTNodeWrapper.java @@ -43,7 +43,6 @@ import org.eclipse.jdt.core.dom.SingleVariableDeclaration; import org.eclipse.jdt.core.dom.StructuralPropertyDescriptor; import org.eclipse.jdt.core.dom.Type; import org.eclipse.jdt.core.dom.TypeDeclaration; -import org.eclipse.jdt.core.dom.VariableDeclarationFragment; /** * Wrapper class for ASTNode objects @@ -162,8 +161,7 @@ public class ASTNodeWrapper { .structuralPropertiesForType().iterator(); boolean flag = true; while (it.hasNext()) { - StructuralPropertyDescriptor prop = (StructuralPropertyDescriptor) it - .next(); + StructuralPropertyDescriptor prop = it.next(); if (prop.isChildListProperty()) { List nodelist = (List) thisNode .getStructuralProperty(prop); diff --git a/pdex/src/processing/mode/experimental/AutoSaveUtil.java b/pdex/src/processing/mode/experimental/AutoSaveUtil.java index 7efa14ec0..f93b7aa17 100644 --- a/pdex/src/processing/mode/experimental/AutoSaveUtil.java +++ b/pdex/src/processing/mode/experimental/AutoSaveUtil.java @@ -18,17 +18,16 @@ package processing.mode.experimental; +import static processing.mode.experimental.ExperimentalMode.log; + import java.io.File; import java.io.FileFilter; import java.io.IOException; import java.util.Timer; -import java.util.TimerTask; import processing.app.Base; import processing.app.Sketch; -import static processing.mode.experimental.ExperimentalMode.log; - /** * Autosave utility for saving sketch backups in the background after * certain intervals @@ -42,7 +41,7 @@ public class AutoSaveUtil { private Timer timer; - private int saveTime; +// private int saveTime; private File autosaveDir, pastSave; @@ -334,6 +333,7 @@ public class AutoSaveUtil { * @author quarkninja * */ + /* private class SaveTask extends TimerTask{ @Override @@ -348,5 +348,6 @@ public class AutoSaveUtil { } } + */ } diff --git a/pdex/src/processing/mode/experimental/CompilationChecker.java b/pdex/src/processing/mode/experimental/CompilationChecker.java index 8d56c5855..3e570bd41 100644 --- a/pdex/src/processing/mode/experimental/CompilationChecker.java +++ b/pdex/src/processing/mode/experimental/CompilationChecker.java @@ -26,7 +26,6 @@ import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; -import java.lang.reflect.Method; import java.net.MalformedURLException; import java.net.URL; import java.net.URLClassLoader; @@ -280,6 +279,7 @@ public class CompilationChecker { /** * ClassLoader implementation */ + /* private class CustomClassLoader extends ClassLoader { private Map classMap; @@ -301,6 +301,7 @@ public class CompilationChecker { return super.findClass(name); } }; + */ private ICompilationUnit generateCompilationUnit() { ASTParser parser = ASTParser.newParser(AST.JLS4); @@ -432,13 +433,13 @@ public class CompilationChecker { static private String[] getSimpleNames(String qualifiedName) { StringTokenizer st = new StringTokenizer(qualifiedName, "."); - ArrayList list = new ArrayList(); + ArrayList list = new ArrayList(); while (st.hasMoreTokens()) { String name = st.nextToken().trim(); if (!name.equals("*")) list.add(name); } - return (String[]) list.toArray(new String[list.size()]); + return list.toArray(new String[0]); } public static void main(String[] args) { diff --git a/pdex/src/processing/mode/experimental/CompletionCandidate.java b/pdex/src/processing/mode/experimental/CompletionCandidate.java index ef29d5963..cf7ad5c40 100644 --- a/pdex/src/processing/mode/experimental/CompletionCandidate.java +++ b/pdex/src/processing/mode/experimental/CompletionCandidate.java @@ -1,5 +1,4 @@ package processing.mode.experimental; -import static processing.mode.experimental.ExperimentalMode.log; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.util.List; diff --git a/pdex/src/processing/mode/experimental/DebugEditor.java b/pdex/src/processing/mode/experimental/DebugEditor.java index 9eecaf5a9..bc4c449ac 100755 --- a/pdex/src/processing/mode/experimental/DebugEditor.java +++ b/pdex/src/processing/mode/experimental/DebugEditor.java @@ -24,7 +24,6 @@ import galsasson.mode.tweak.SketchParser; import java.awt.BorderLayout; import java.awt.CardLayout; import java.awt.Color; -import java.awt.Component; import java.awt.Container; import java.awt.EventQueue; import java.awt.FlowLayout; @@ -42,8 +41,6 @@ import java.io.IOException; import java.nio.charset.Charset; import java.util.ArrayList; import java.util.List; -import java.util.Timer; -import java.util.TimerTask; import java.util.concurrent.atomic.AtomicBoolean; import java.util.logging.Level; import java.util.logging.Logger; @@ -63,7 +60,6 @@ import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.SwingUtilities; import javax.swing.SwingWorker; -import javax.swing.border.Border; import javax.swing.border.EtchedBorder; import javax.swing.table.TableModel; import javax.swing.text.Document; @@ -74,7 +70,6 @@ import processing.app.Base; import processing.app.EditorState; import processing.app.EditorToolbar; import processing.app.Mode; -import processing.app.Preferences; import processing.app.Sketch; import processing.app.SketchCode; import processing.app.Toolkit; @@ -82,7 +77,6 @@ import processing.app.syntax.JEditTextArea; import processing.app.syntax.PdeTextAreaDefaults; import processing.core.PApplet; import processing.mode.java.JavaEditor; -import processing.mode.java.JavaToolbar; /** * Main View Class. Handles the editor window including tool bar and menu. Has @@ -392,7 +386,7 @@ public class DebugEditor extends JavaEditor implements ActionListener { for (String errMsg : errorCheckerService.tempErrorLog.keySet()) { IProblem ip = errorCheckerService.tempErrorLog.get(errMsg); if(ip != null){ - sbuff.append(errorCheckerService.errorMsgSimplifier.getIDName(ip.getID())); + sbuff.append(ErrorMessageSimplifier.getIDName(ip.getID())); sbuff.append(','); sbuff.append("{"); for (int i = 0; i < ip.getArguments().length; i++) { diff --git a/pdex/src/processing/mode/experimental/DebugToolbar.java b/pdex/src/processing/mode/experimental/DebugToolbar.java index c9616e179..b13d83f45 100755 --- a/pdex/src/processing/mode/experimental/DebugToolbar.java +++ b/pdex/src/processing/mode/experimental/DebugToolbar.java @@ -23,9 +23,9 @@ import java.awt.event.MouseEvent; import java.awt.image.BufferedImage; import java.util.logging.Level; import java.util.logging.Logger; + import processing.app.Base; import processing.app.Editor; -import processing.app.Preferences; import processing.app.Toolkit; import processing.mode.java.JavaToolbar; diff --git a/pdex/src/processing/mode/experimental/Debugger.java b/pdex/src/processing/mode/experimental/Debugger.java index 50b5d9846..916745268 100755 --- a/pdex/src/processing/mode/experimental/Debugger.java +++ b/pdex/src/processing/mode/experimental/Debugger.java @@ -960,7 +960,7 @@ public class Debugger implements VMEventListener { */ protected List getLocals(ThreadReference t, int depth) { //System.out.println("getting locals"); - List vars = new ArrayList(); + List vars = new ArrayList(); try { if (t.frameCount() > 0) { StackFrame sf = t.frame(0); @@ -1016,7 +1016,7 @@ public class Debugger implements VMEventListener { */ protected List getFields(Value value, int depth, int maxDepth, boolean includeInherited) { // remember: Value <- ObjectReference, ArrayReference - List vars = new ArrayList(); + List vars = new ArrayList(); if (depth <= maxDepth) { if (value instanceof ArrayReference) { return getArrayFields((ArrayReference) value); @@ -1057,7 +1057,7 @@ public class Debugger implements VMEventListener { * @return list of array fields */ protected List getArrayFields(ArrayReference array) { - List fields = new ArrayList(); + List fields = new ArrayList(); if (array != null) { String arrayType = array.type().name(); if (arrayType.endsWith("[]")) { diff --git a/pdex/src/processing/mode/experimental/ErrorCheckerService.java b/pdex/src/processing/mode/experimental/ErrorCheckerService.java index 9417ee3de..a68a2ebe8 100644 --- a/pdex/src/processing/mode/experimental/ErrorCheckerService.java +++ b/pdex/src/processing/mode/experimental/ErrorCheckerService.java @@ -20,11 +20,7 @@ package processing.mode.experimental; import static processing.mode.experimental.ExperimentalMode.log; import static processing.mode.experimental.ExperimentalMode.logE; -import java.awt.EventQueue; import java.io.File; -import java.io.FileFilter; -import java.lang.reflect.Method; -import java.net.MalformedURLException; import java.net.URL; import java.net.URLClassLoader; import java.util.ArrayList; @@ -50,7 +46,6 @@ import org.eclipse.jdt.core.dom.ASTNode; import org.eclipse.jdt.core.dom.ASTParser; import org.eclipse.jdt.core.dom.CompilationUnit; import org.eclipse.jdt.internal.compiler.impl.CompilerOptions; -import org.eclipse.jdt.internal.compiler.problem.DefaultProblem; import processing.app.Base; import processing.app.Editor; diff --git a/pdex/src/processing/mode/experimental/ErrorMessageSimplifier.java b/pdex/src/processing/mode/experimental/ErrorMessageSimplifier.java index 27a8f47c6..20a737dc4 100644 --- a/pdex/src/processing/mode/experimental/ErrorMessageSimplifier.java +++ b/pdex/src/processing/mode/experimental/ErrorMessageSimplifier.java @@ -7,8 +7,6 @@ import java.util.TreeMap; import org.eclipse.jdt.core.compiler.IProblem; import org.eclipse.jdt.internal.compiler.problem.DefaultProblem; -import static processing.mode.experimental.ExperimentalMode.log; -import static processing.mode.experimental.ExperimentalMode.logE; public class ErrorMessageSimplifier { diff --git a/pdex/src/processing/mode/experimental/ExperimentalMode.java b/pdex/src/processing/mode/experimental/ExperimentalMode.java index dda9d116a..94d0f9778 100755 --- a/pdex/src/processing/mode/experimental/ExperimentalMode.java +++ b/pdex/src/processing/mode/experimental/ExperimentalMode.java @@ -116,7 +116,8 @@ public class ExperimentalMode extends JavaMode { @Override public String getTitle() { - return "PDE X"; + //return "PDE X"; + return "Java"; } diff --git a/pdex/src/processing/mode/experimental/LineBreakpoint.java b/pdex/src/processing/mode/experimental/LineBreakpoint.java index e35cea22e..696726b8a 100755 --- a/pdex/src/processing/mode/experimental/LineBreakpoint.java +++ b/pdex/src/processing/mode/experimental/LineBreakpoint.java @@ -17,17 +17,16 @@ */ package processing.mode.experimental; -import com.sun.jdi.AbsentInformationException; -import com.sun.jdi.Location; -import com.sun.jdi.ReferenceType; -import com.sun.jdi.request.BreakpointRequest; +import static processing.mode.experimental.ExperimentalMode.log; + import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; -import static processing.mode.experimental.ExperimentalMode.log; -import static processing.mode.experimental.ExperimentalMode.logE; -import static processing.mode.experimental.ExperimentalMode.log2; +import com.sun.jdi.AbsentInformationException; +import com.sun.jdi.Location; +import com.sun.jdi.ReferenceType; +import com.sun.jdi.request.BreakpointRequest; /** * Model/Controller of a line breakpoint. Can be set before or while debugging. diff --git a/pdex/src/processing/mode/experimental/OffsetMatcher.java b/pdex/src/processing/mode/experimental/OffsetMatcher.java index afc9f6f23..3623e4161 100644 --- a/pdex/src/processing/mode/experimental/OffsetMatcher.java +++ b/pdex/src/processing/mode/experimental/OffsetMatcher.java @@ -63,7 +63,7 @@ public class OffsetMatcher { public int getPdeOffForJavaOff(int start, int length) { // log("PDE :" + pdeCodeLine + "\nJAVA:" + javaCodeLine); if(!matchingNeeded) return start; - int ans = getPdeOffForJavaOff(start), end = getPdeOffForJavaOff(start + length - 1); + int ans = getPdeOffForJavaOff(start); //, end = getPdeOffForJavaOff(start + length - 1); // log(start + " java start off, pde start off " // + ans); // log((start + length - 1) + " java end off, pde end off " diff --git a/pdex/src/processing/mode/experimental/SketchOutline.java b/pdex/src/processing/mode/experimental/SketchOutline.java index ad3375a01..eafda9366 100644 --- a/pdex/src/processing/mode/experimental/SketchOutline.java +++ b/pdex/src/processing/mode/experimental/SketchOutline.java @@ -1,7 +1,5 @@ package processing.mode.experimental; -import static processing.mode.experimental.ExperimentalMode.log; - import java.awt.Component; import java.awt.Dimension; import java.awt.Point; @@ -11,11 +9,9 @@ import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.event.WindowEvent; import java.awt.event.WindowFocusListener; -import java.io.File; import java.util.List; import javax.swing.BoxLayout; -import javax.swing.ImageIcon; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JScrollPane; @@ -38,8 +34,6 @@ import org.eclipse.jdt.core.dom.MethodDeclaration; import org.eclipse.jdt.core.dom.TypeDeclaration; import org.eclipse.jdt.core.dom.VariableDeclarationFragment; -import processing.app.Base; - public class SketchOutline { protected JFrame frmOutlineView; diff --git a/pdex/src/processing/mode/experimental/TabOutline.java b/pdex/src/processing/mode/experimental/TabOutline.java index 6c06303b3..b570a10e0 100644 --- a/pdex/src/processing/mode/experimental/TabOutline.java +++ b/pdex/src/processing/mode/experimental/TabOutline.java @@ -20,7 +20,6 @@ import javax.swing.JScrollPane; import javax.swing.JTextField; import javax.swing.JTree; import javax.swing.ScrollPaneConstants; -import javax.swing.SwingConstants; import javax.swing.SwingWorker; import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentListener; @@ -32,7 +31,6 @@ import javax.swing.tree.DefaultTreeModel; import javax.swing.tree.TreeSelectionModel; import processing.app.SketchCode; -import static processing.mode.experimental.ExperimentalMode.log; public class TabOutline { protected JFrame frmOutlineView; diff --git a/pdex/src/processing/mode/experimental/TextArea.java b/pdex/src/processing/mode/experimental/TextArea.java index 43d4885dc..82a8e311c 100644 --- a/pdex/src/processing/mode/experimental/TextArea.java +++ b/pdex/src/processing/mode/experimental/TextArea.java @@ -38,7 +38,6 @@ import java.util.Map; import javax.swing.DefaultListModel; import javax.swing.SwingUtilities; import javax.swing.SwingWorker; -import javax.swing.text.BadLocationException; import processing.app.syntax.JEditTextArea; import processing.app.syntax.TextAreaDefaults; diff --git a/pdex/src/processing/mode/experimental/TextAreaPainter.java b/pdex/src/processing/mode/experimental/TextAreaPainter.java index 3ed928771..cebe21e84 100644 --- a/pdex/src/processing/mode/experimental/TextAreaPainter.java +++ b/pdex/src/processing/mode/experimental/TextAreaPainter.java @@ -358,7 +358,7 @@ public class TextAreaPainter extends processing.app.syntax.TextAreaPainter // horizontalAdjustment); int y = ta.lineToY(line); y += fm.getLeading() + fm.getMaxDescent(); - int height = fm.getHeight(); +// int height = fm.getHeight(); int start = ta.getLineStartOffset(line) + problem.getPDELineStartOffset(); int pLength = problem.getPDELineStopOffset() + 1 - problem.getPDELineStartOffset(); @@ -623,7 +623,7 @@ public class TextAreaPainter extends processing.app.syntax.TextAreaPainter for (int tab=0; tab(); + locals = new ArrayList(); + thisFields = new ArrayList(); + declaredThisFields = new ArrayList(); this.setTitle(editor.getSketch().getName()); @@ -537,7 +540,6 @@ public class VariableInspector extends javax.swing.JFrame { * WARNING: Do NOT modify this code. The content of this method is always * regenerated by the Form Editor. */ - @SuppressWarnings("unchecked") // //GEN-BEGIN:initComponents private void initComponents() { @@ -805,7 +807,7 @@ public class VariableInspector extends javax.swing.JFrame { * @return the filtered list. */ protected List filterNodes(List nodes, VariableNodeFilter filter) { - List filtered = new ArrayList(); + List filtered = new ArrayList(); for (VariableNode node : nodes) { if (filter.accept(node)) { filtered.add(node); diff --git a/pdex/src/processing/mode/experimental/XQPreprocessor.java b/pdex/src/processing/mode/experimental/XQPreprocessor.java index 91b613521..b9a63b45a 100755 --- a/pdex/src/processing/mode/experimental/XQPreprocessor.java +++ b/pdex/src/processing/mode/experimental/XQPreprocessor.java @@ -107,14 +107,15 @@ public class XQPreprocessor { // System.out.println("------------XQPreProc End-----------------"); // Calculate main class offset - int position = doc.get().indexOf("{") + 1; - int lines = 0; - for (int i = 0; i < position; i++) { - if (doc.get().charAt(i) == '\n') { - lines++; - } - } - lines += 2; + // removed unused 'lines' tabulation [fry 140726] +// int position = doc.get().indexOf("{") + 1; +// int lines = 0; +// for (int i = 0; i < position; i++) { +// if (doc.get().charAt(i) == '\n') { +// lines++; +// } +// } +// lines += 2; // System.out.println("Lines: " + lines); return doc.get(); From d4fc996a8526a8e0d92fd1345b12fdea4eea7599 Mon Sep 17 00:00:00 2001 From: Ben Fry Date: Sat, 26 Jul 2014 11:32:16 -0400 Subject: [PATCH 82/88] finish up revisions --- build/shared/revisions.txt | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/build/shared/revisions.txt b/build/shared/revisions.txt index d417bbda2..1ee1fa795 100644 --- a/build/shared/revisions.txt +++ b/build/shared/revisions.txt @@ -1,11 +1,14 @@ -PROCESSING 3.0a1 (REV 0228) - 25 July 2014 +PROCESSING 3.0a1 (REV 0228) - 26 July 2014 Kicking off the 3.0 release process. The focus for Processing 3 is improving the editor and the coding process, so we'll be integrating what was formerly PDE X as the main editor. This release also includes a number of bug fixes and changes, based on -in-progress Google Summer of Code projects and others: +in-progress Google Summer of Code projects and a few helpful souls on Github. + +Please contribute to the Processing 3 release by testing and reporting bugs. +Or better yet, helping us fix them and submitting pull requests. [ contributed fixes! ] From e28a61c453dd42075d66de3ec5f68d5001c89263 Mon Sep 17 00:00:00 2001 From: Ben Fry Date: Sat, 26 Jul 2014 11:43:28 -0400 Subject: [PATCH 83/88] remove minim, remove sound.jar, add sound to build process --- build/build.xml | 2 + .../examples/AnalyzeSound/AnalyzeSound.pde | 58 ---- .../examples/AnalyzeSound/data/jingle.mp3 | Bin 154366 -> 0 bytes .../CreateAnInstrument/CreateAnInstrument.pde | 85 ------ .../examples/GetMetaData/GetMetaData.pde | 57 ---- .../examples/GetMetaData/data/groove.mp3 | Bin 434176 -> 0 bytes .../minim/examples/GetMetaData/data/serif.vlw | Bin 22500 -> 0 bytes .../examples/MonitorInput/MonitorInput.pde | 61 ----- .../PatchingAnInput/PatchingAnInput.pde | 56 ---- .../minim/examples/PlayAFile/PlayAFile.pde | 48 ---- .../PlayAFile/data/marcus_kellis_theme.mp3 | Bin 3050972 -> 0 bytes .../RecordAudioInput/RecordAudioInput.pde | 87 ------ .../RecordAudioOutput/RecordAudioOutput.pde | 93 ------- .../minim/examples/Scrubbing/Scrubbing.pde | 71 ----- .../minim/examples/Scrubbing/button.pde | 255 ------------------ .../examples/Scrubbing/data/fair1939.wav | Bin 290338 -> 0 bytes .../examples/SequenceSound/SequenceSound.pde | 85 ------ .../examples/SoundSpectrum/SoundSpectrum.pde | 180 ------------- .../SoundSpectrum/data/ArialMT-12.vlw | Bin 21244 -> 0 bytes .../examples/SoundSpectrum/data/jingle.mp3 | Bin 154366 -> 0 bytes .../SynthesizeSound/SynthesizeSound.pde | 100 ------- .../TriggerASample/TriggerASample.pde | 84 ------ .../minim/examples/TriggerASample/data/BD.mp3 | Bin 6047 -> 0 bytes .../minim/examples/TriggerASample/data/SD.wav | Bin 8220 -> 0 bytes .../examples/delayExample/delayExample.pde | 90 ------- .../examples/filterExample/filterExample.pde | 84 ------ .../frequencyModulation.pde | 81 ------ .../examples/loadFileIntoBuffer/data/SD.wav | Bin 8220 -> 0 bytes .../loadFileIntoBuffer/loadFileIntoBuffer.pde | 93 ------- java/libraries/minim/library/export.txt | 1 - java/libraries/minim/license.txt | 165 ------------ java/libraries/minim/version.txt | 1 - java/libraries/sound/build.xml | 2 +- java/libraries/sound/library/.gitignore | 2 + 34 files changed, 5 insertions(+), 1836 deletions(-) delete mode 100644 java/libraries/minim/examples/AnalyzeSound/AnalyzeSound.pde delete mode 100644 java/libraries/minim/examples/AnalyzeSound/data/jingle.mp3 delete mode 100644 java/libraries/minim/examples/CreateAnInstrument/CreateAnInstrument.pde delete mode 100644 java/libraries/minim/examples/GetMetaData/GetMetaData.pde delete mode 100644 java/libraries/minim/examples/GetMetaData/data/groove.mp3 delete mode 100644 java/libraries/minim/examples/GetMetaData/data/serif.vlw delete mode 100644 java/libraries/minim/examples/MonitorInput/MonitorInput.pde delete mode 100644 java/libraries/minim/examples/PatchingAnInput/PatchingAnInput.pde delete mode 100644 java/libraries/minim/examples/PlayAFile/PlayAFile.pde delete mode 100644 java/libraries/minim/examples/PlayAFile/data/marcus_kellis_theme.mp3 delete mode 100644 java/libraries/minim/examples/RecordAudioInput/RecordAudioInput.pde delete mode 100644 java/libraries/minim/examples/RecordAudioOutput/RecordAudioOutput.pde delete mode 100644 java/libraries/minim/examples/Scrubbing/Scrubbing.pde delete mode 100755 java/libraries/minim/examples/Scrubbing/button.pde delete mode 100755 java/libraries/minim/examples/Scrubbing/data/fair1939.wav delete mode 100644 java/libraries/minim/examples/SequenceSound/SequenceSound.pde delete mode 100644 java/libraries/minim/examples/SoundSpectrum/SoundSpectrum.pde delete mode 100644 java/libraries/minim/examples/SoundSpectrum/data/ArialMT-12.vlw delete mode 100644 java/libraries/minim/examples/SoundSpectrum/data/jingle.mp3 delete mode 100644 java/libraries/minim/examples/SynthesizeSound/SynthesizeSound.pde delete mode 100644 java/libraries/minim/examples/TriggerASample/TriggerASample.pde delete mode 100644 java/libraries/minim/examples/TriggerASample/data/BD.mp3 delete mode 100644 java/libraries/minim/examples/TriggerASample/data/SD.wav delete mode 100644 java/libraries/minim/examples/delayExample/delayExample.pde delete mode 100644 java/libraries/minim/examples/filterExample/filterExample.pde delete mode 100644 java/libraries/minim/examples/frequencyModulation/frequencyModulation.pde delete mode 100644 java/libraries/minim/examples/loadFileIntoBuffer/data/SD.wav delete mode 100644 java/libraries/minim/examples/loadFileIntoBuffer/loadFileIntoBuffer.pde delete mode 100644 java/libraries/minim/library/export.txt delete mode 100644 java/libraries/minim/license.txt delete mode 100644 java/libraries/minim/version.txt create mode 100644 java/libraries/sound/library/.gitignore diff --git a/build/build.xml b/build/build.xml index 164865dc7..f72d71e0d 100755 --- a/build/build.xml +++ b/build/build.xml @@ -226,6 +226,7 @@ + @@ -237,6 +238,7 @@ + diff --git a/java/libraries/minim/examples/AnalyzeSound/AnalyzeSound.pde b/java/libraries/minim/examples/AnalyzeSound/AnalyzeSound.pde deleted file mode 100644 index 46bdec13a..000000000 --- a/java/libraries/minim/examples/AnalyzeSound/AnalyzeSound.pde +++ /dev/null @@ -1,58 +0,0 @@ -/** - * This sketch demonstrates how to use an FFT to analyze - * the audio being generated by an AudioPlayer. - *

- * FFT stands for Fast Fourier Transform, which is a - * method of analyzing audio that allows you to visualize - * the frequency content of a signal. You've seen - * visualizations like this before in music players - * and car stereos. - *

- * For more information about Minim and additional features, - * visit http://code.compartmental.net/minim/ - */ - -import ddf.minim.analysis.*; -import ddf.minim.*; - -Minim minim; -AudioPlayer jingle; -FFT fft; - -void setup() -{ - size(512, 200, P3D); - - minim = new Minim(this); - - // specify that we want the audio buffers of the AudioPlayer - // to be 1024 samples long because our FFT needs to have - // a power-of-two buffer size and this is a good size. - jingle = minim.loadFile("jingle.mp3", 1024); - - // loop the file indefinitely - jingle.loop(); - - // create an FFT object that has a time-domain buffer - // the same size as jingle's sample buffer - // note that this needs to be a power of two - // and that it means the size of the spectrum will be half as large. - fft = new FFT( jingle.bufferSize(), jingle.sampleRate() ); - -} - -void draw() -{ - background(0); - stroke(255); - - // perform a forward FFT on the samples in jingle's mix buffer, - // which contains the mix of both the left and right channels of the file - fft.forward( jingle.mix ); - - for(int i = 0; i < fft.specSize(); i++) - { - // draw the line for frequency band i, scaling it up a bit so we can see it - line( i, height, i, height - fft.getBand(i)*8 ); - } -} diff --git a/java/libraries/minim/examples/AnalyzeSound/data/jingle.mp3 b/java/libraries/minim/examples/AnalyzeSound/data/jingle.mp3 deleted file mode 100644 index 8774a7632f48812d482517d1799951062d78d67c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 154366 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

}e;T90JwMTh~39AKG30+K-5 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⋘UNKS-RgR$Jf?ySvUHslzz`P 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 S|G9yNq=>wXh - * For more complex examples of using playNote check out algorithmicCompExample and compositionExample - * in the Synthesis folder. - *

- * For more information about Minim and additional features, visit http://code.compartmental.net/minim/ - */ - -import ddf.minim.*; -import ddf.minim.ugens.*; - -Minim minim; -AudioOutput out; - -// to make an Instrument we must define a class -// that implements the Instrument interface. -class SineInstrument implements Instrument -{ - Oscil wave; - Line ampEnv; - - SineInstrument( float frequency ) - { - // make a sine wave oscillator - // the amplitude is zero because - // we are going to patch a Line to it anyway - wave = new Oscil( frequency, 0, Waves.SINE ); - ampEnv = new Line(); - ampEnv.patch( wave.amplitude ); - } - - // this is called by the sequencer when this instrument - // should start making sound. the duration is expressed in seconds. - void noteOn( float duration ) - { - // start the amplitude envelope - ampEnv.activate( duration, 0.5f, 0 ); - // attach the oscil to the output so it makes sound - wave.patch( out ); - } - - // this is called by the sequencer when the instrument should - // stop making sound - void noteOff() - { - wave.unpatch( out ); - } -} - -void setup() -{ - size(512, 200, P3D); - - minim = new Minim(this); - - // use the getLineOut method of the Minim object to get an AudioOutput object - out = minim.getLineOut(); - - // when providing an Instrument, we always specify start time and duration - out.playNote( 0.0, 0.9, new SineInstrument( 97.99 ) ); - out.playNote( 1.0, 0.9, new SineInstrument( 123.47 ) ); - - // we can use the Frequency class to create frequencies from pitch names - out.playNote( 2.0, 2.9, new SineInstrument( Frequency.ofPitch( "C3" ).asHz() ) ); - out.playNote( 3.0, 1.9, new SineInstrument( Frequency.ofPitch( "E3" ).asHz() ) ); - out.playNote( 4.0, 0.9, new SineInstrument( Frequency.ofPitch( "G3" ).asHz() ) ); -} - -void draw() -{ - background(0); - stroke(255); - - // draw the waveforms - for(int i = 0; i < out.bufferSize() - 1; i++) - { - line( i, 50 + out.left.get(i)*50, i+1, 50 + out.left.get(i+1)*50 ); - line( i, 150 + out.right.get(i)*50, i+1, 150 + out.right.get(i+1)*50 ); - } -} diff --git a/java/libraries/minim/examples/GetMetaData/GetMetaData.pde b/java/libraries/minim/examples/GetMetaData/GetMetaData.pde deleted file mode 100644 index 717152ba2..000000000 --- a/java/libraries/minim/examples/GetMetaData/GetMetaData.pde +++ /dev/null @@ -1,57 +0,0 @@ -/** - * Get Meta Data - * by Damien Di Fede. - * - * This sketch demonstrates how to use the getMetaData - * method of AudioPlayer. This method is also available - * for AudioSnippet and AudioSample. - * You should use this method when you want to retrieve metadata - * about a file that you have loaded, like ID3 tags from an mp3 file. - * If you load WAV file or other non-tagged file, most of the metadata - * will be empty, but you will still have information like the filename - * and the length. - *

- * For more information about Minim and additional features, - * visit http://code.compartmental.net/minim/ - */ - -import ddf.minim.*; - -Minim minim; -AudioPlayer groove; -AudioMetaData meta; - -void setup() -{ - size(512, 256, P2D); - - minim = new Minim(this); - groove = minim.loadFile("groove.mp3"); - meta = groove.getMetaData(); - - textFont(createFont("Serif", 12)); -} - -int ys = 25; -int yi = 15; - -void draw() -{ - background(0); - int y = ys; - text("File Name: " + meta.fileName(), 5, y); - text("Length (in milliseconds): " + meta.length(), 5, y+=yi); - text("Title: " + meta.title(), 5, y+=yi); - text("Author: " + meta.author(), 5, y+=yi); - text("Album: " + meta.album(), 5, y+=yi); - text("Date: " + meta.date(), 5, y+=yi); - text("Comment: " + meta.comment(), 5, y+=yi); - text("Track: " + meta.track(), 5, y+=yi); - text("Genre: " + meta.genre(), 5, y+=yi); - text("Copyright: " + meta.copyright(), 5, y+=yi); - text("Disc: " + meta.disc(), 5, y+=yi); - text("Composer: " + meta.composer(), 5, y+=yi); - text("Orchestra: " + meta.orchestra(), 5, y+=yi); - text("Publisher: " + meta.publisher(), 5, y+=yi); - text("Encoded: " + meta.encoded(), 5, y+=yi); -} diff --git a/java/libraries/minim/examples/GetMetaData/data/groove.mp3 b/java/libraries/minim/examples/GetMetaData/data/groove.mp3 deleted file mode 100644 index 22fd64fd4aaf02d15f25047a5271bca10d86ac82..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 434176 zcmdpdRajg>)8^pruE8CGySuwva2VVrKp?mWcZb1UgA;n+THJ6 zrme2?&sMB=miX^t3QrdbFAqv>8C9u&w}}G)$`UFv6izN4o)nHi2Wv+^Hf>EQrFYps ztGPaMu)in&PYLppDE)t{P#@@Q`>uoW{-nYI@c97%7&t^^bWChK0%Eccl(h7WENmRy zy!=8U;*v6Qippx5+Ij{?pUkan?H!%nJbnBEzI+XfjE+r6N=eVm$tx@dl~>l(H8!_> z@9OOz7#ba)oS9!-Sp#qF>>V7RUi`Vfdwh9)Z%^f4UvRMr@VdkH{T_IAD;cha_lAO8#$0#vubO_DPGidn7_!>1aa|< zFUbh%K$&6hCxE@T&VL#ptC`;=l$KsoHkjALnP@ByR+F~ETS(-y_MsWO46(9 zR*T|c?y}NYb!PSt+Zrbl=s;E`>))A}0~f^%>a3T9(&WArx_Phb9FEtzOm&vXBviTE zT}3y$!0WGoJfjIYowDJaMOh6BEdx;v;yg7~;C0}y;N z26oJt(|yp`1aY;72UD3f+Vtip!X18lz0P(RVtDn~c4wcE$>0v0r?CwYS7hYr1h#U= zVJlBArD@yS|K5T2lB{>iD~3oy9Drv@>1Yr^tw_hhWx5 z=F%vhf+nV}7R?2G-r!!k^f9Ycv67V*I(SS0>jO>{v}6&$87&hr7tYqxFJ!loP^EO2 zl_8lWVlCQcP2q&cmKAmag3QviU!UADZhGFzy0DQqS}6^J5Sf5iI6Q5P@oHx5HwCF} zsyC$wJ`8Y%V8?{%L?P1u?7y5Ex!N$lHVKj-{N%E12YN7Ym3N}Gg1$FBpbh-tbUWB< zz!jJKhB3c(1t5Wr%V*sJOCD6yPW&B_~d_oCfKb&}cUn%t12r}PHv>9j0Q zkUj;hlJLZ~f8Pm_MeMN8$@2r(twnV_Od2^YU@x56Dk}L`R$CsNr;|5V&mRvzNEFp} z5(h3HIDPAkSRB|We8OL)<`yg_Hfei4lVKP!=$?#h=ok)GOR8~<6wGq($Hf@aD{Bfg zU<)>ZRpm5hr)Q&9Bl%!Xg1D+sQbmZth=E9@HV1+KQdWiAYAi?7@i>l|EOIU!mPCs7 z(f(x^1rN_=gp9Y-rBV#`b1#hu!fEm-8IN-mQ6surjawYgtH*X>_d zJ$wm4Yt!oe9-eK&zz<43bpiu>mdA{Mh2xq?;bpyC+hQn@XIfgi5f(V=6DVi8(8I7P z7yMjIbpds0PQ-DqPPiE#n%7QLuiKXctb3Nfyjgi- zbliMY?tzA4N+S1+Zbp!YGTdU8-81uGkV@UA`UXjdJof`AF!9*P)D&{ZG#j`XRO<8R znJbF(tNNQ0>A7NuD?dDwF#jG>hAXLNjzStDNjbn}q@Qu1jZd6CYE}L5Db`NW+pbJ7 zExPf#%&4h42PfT+Ld^i zv|1Ejm+D6wCpVP^`;Ls`RM!|;YOzua)Q!jOA^OM})PtQxeY>A~(QR4ne(=#$)vq6K z1&(oj6l^hS*>1J!)I*CLzwR0jQ;oe#Hgehqx)P%Eh>6<^M7pj2)qTq?h7L5yYHk9#s}UDw60&Dqe~i6_*yH~wG^eY3vn zysh&>7(09bxz3xcU%Sbm7EHGCtK(WQ`HUo-E}SlsSE$YF3ZcciDxUpP!DRD0JAE6Dt@KkVv0=>uYS0%&-#(Fw?! zj98M|NhA*}Sh)q^IVIR~S`{#UURB^H=xMrE!X-e3%UMqx%tDUt6W>zf3n;BUe~r(WmpWk$Yx8#euy5^e(0@jX z*MAL|lh>E{4v$P6D$od$5Km4HeVrT5a$Q|4PP#eZP82of;AG=S zwt=UUC(IS$&`|C#G?jopW;u{O(zdc!%;)mv0j#&nYaYTSR z9N^58iQL3-HO6XkL0mj`wMMgF5RtG5Fw#eHt2I%eZ);=#dHE%c7mV=gVDsiuU~zD^ zzBzSVYN)Wo)6t%cJl9Cq$N2|9uGs50TizvhSS3IlX2Xr}#pcsCgoDC&a(4kCL=xum z;@DaYa)^ggZV)B4E3Y2h>R>XS1A$CRW3m_iK^2gtCJ6fhP|!QbGZKS9eyJn!8=AX* zPZS>b0R=$CB>-jTKhK}_K_Gu6p$OsNp;6IMu%QUeNTJ~Xp_oHP!kcV_I~mJIN06ED zI$7C_!e7QQq9I=S;9?v8y|gveF1_qah*-f31Qe#Uhf#7eu|Er&tw$e3@|UrzuU5tW z0WX?L&@JyEICITa|p~?3wdCvwl!k$G9nMU`5tsC_UiGW(OQ|@$`!!Kzopt$ zQYYW+C#)+-;jPOCT_`2qF-}j#BB{e6;diSqpK9;PZvt(u8NmcD{=FhbP+Z}mk0nKc z@w<2j?sQp)gj(2^>M(MMd$uFL!iPYon?BW2YUCLypuMNp0t_6PU8Rlm;ZwGMDj5lR zAujmhz^R)Z1m8$#S;2IK4^!PfGJI!fVRV@Oh7g}VtY9H9?BUygb?%1ZSwp4}zu?o` z^UFbRxqauymocJdmgJ5J8@UEk&DzM+Rqm`Fhi_apnNCdSKsS^SJvYw^^rm~^_FT$D^pnQE?B{QBl1 zdW^K+8vh2gA3zBUQ`3ViK<=tw^dd7N;vtZrAKQg~G@cuMX<5>yrCeNJ&gDmik=yEJ zvqGM6DBU*3nAAe;ylCt!RO+WsvzX$U|(Uoa$6F0o9ZrCqL*s-VBaCs(0SL9G1wi~RvpY;48~o3=!u`u z3oHYdEoWE{j6TPCyi!> zJ{pAaU7w3c>)&OS@U`w8>P$KX9x;CcvF)+0WLI6*I-XBkcO5lN@qTb_dFit5_mSO5 zzjR1}9*A0Oco?T_zwqXWt0i4_`dnep`^!bMD|gi{tb{{PJxFt}WR$)$uO%S51OcaA z1yvz@{&=z_*31(j^C{8)bS02}C5-@~EwttB>AH=pbti5HOfqw*>8CoAMqa-CWE5vG zHuA8|cgC^M^wLsYILI@PL<^T&aP4`oL@>=qbB-)WmVDl`Y%240EJ@r7PdykgFbmtf z$u7+hfg`0XZXipA&pw1>oOUBi|0yjw7C)4!$;%ls02uDNgVlbV9RTU={G{_kf_#OKUgkX+!Ht&Wg74?s#|yP<&mIU zGY*h*jWSH?n=8Dg`rl=3(DS#&YdceL!NOu{uzn&M^D5`{UYW@KKC9XitujI5^ouuG zXCU~InCZvY7Mx%@24E%fM%5SxS9Ia>#+b#N*$Hj5#>$Ob(W`})h0}@yk)^|aB49A(Nu*pGM;)>?QKnscCIl4Nt$e1%kKGzw{MO#z#xk=r*HUR|i) z_``Kd{cpfe3MQBN&a*h}4BeCS4Y}g8#qi^3W^uxL6k$Iqh*qI6$qbSzD=}$Cv!#P6 ze*J-}fRd3&;uV!f<PzuMaPYpe-s5>k!_ea{m_^dMp+t_xa|y$u_66DYNt3X45qxL41fV^ zobZM~V)ZyiQT_zkYYj$EG)Y)WA>>&2llMva0^qX^kx*^`tTK2dAyQ4NP-HYp;r+t1-)R2ugt zc{Vv4k>0>iF{wl_VI`KtrgHwCB$-m1^@#W>J{grZ39rogXN3sxD1#_)Shg>o&z82D z$;tP@8l2skgilHN0j|ghne;PW#Xbp}Z((-ag3i=8Qo%qjXtP8M>1f>PBy3VS^qqMV zdL1K@N_wvkCJrh*gp537!k|uO=~63adyB97tE+>@3j*;*=O++|O79c|QZY1jTLl1U zx^w3^^I0V?kwh1!8}TzK@Dr{{>-pS(5|nHhY3p=2zQ98auxTGPqd^Toip%O!`j z@!gKb)5ld_&#H%G`rmd~F&S^pMT>;Sl7TUBT4 z{lrn!j9_M4@{cC;oXyIum6$Z0d3hM8|8)nQmyFt4&oZ=g5ni# zBI6MA!$AdsYuo7V#zknDzNg(c$*bPqQmE!e%OD5We2Q)QEjt}mKWi`)rs~tH==Rq{2+o<}_1lZPxb-7VNMlDG6l=%C@)eKYaFfC0< zj8Ma(w~YjfdojnD^oIoE%KSHwqu=y{kXWsY$(Fz++l>HfHZ7kTU6ParVYtFE-)+Hf zNM4^l02(#>@GM=xYRZO|#D)6JC{^bt|GF9Nse7M}CWovt6^f(zTMK*x`cN-&c)#(O zZ_dYRWe?w1X>u!ySu0b`qSAdeWOD}6;>p9OhVb;OTe^XbFGXdaa~mi|IkHU$`#)pH zJf6iYq&jEpxUF{?5{O)hj6(re?>y8VPJf(03tndXe~-WzM6z?)5RZi(NOqrdm`b~ zk4c}DSme(i##{xkA_Rjx{XHo$^PN85FV|5r7xwr&nBvL6^f!FRc!s`=KyClqppB<2 zgNSYHJkblbhxYjJ6?FZ5Lp6U3uX;IlW_)*fmuH^brjnQscmb=N{!Zh8H%MUSD8+=3-5=#z-o=gH?Fn?vjnMbVPyDFe%1 zmv4?gdTX8JCJB-lRs6mPql(oi+PuU&$W6B8lioRG9aWDe%N7_-^TllC=WHnSwTk)# zg1@Zv-QR2rOnAQ|M<&act?em+Wr}X4aZ*^(*20s+*yD=HVEEDEV7ox#p$LM13oL5@ z91~F4#rzjyt`kw-84VQHR0&_12)PC0KlGf^lRRLKSh^wXRtxulOp*=kQt3#ouQ-Uw zk#3C=RmZQ(U1pYevnmi)B5Gt=7Yn<_|pi9>EES3@dmDi2nJ;oZ~X2xld&&jm2(CvB`IJe`k z$KevlNzO-Q>%srKsIunDSKeK4;FHa>y`jEG@A6%>Z7N|EZyjg`mlKVbsaO`z^AeM1 z{)F6a0He8VZDKji9NWu0rgP2t5Jba~db2bzD2|E@#MKIdyu8V$vD7-&u&0h4FtsYi z&`H2<)6-OPNG`*>E+k>HM+@P{oD9*#AV9@@ZDaraH8ClAI@ThZFN~PIosArxMnbl% z8Jp?on`}Nj%(ZATT9cfCN2tNRR`Lb;i(}AuFzHj8!c`q)X zTk92%NV@%Q0~`sQ)9J~;CT_x#X&0#Fq0m{HNtToo_6H=Kb?#mYGbc3I6i!5^Ny zaX2hvxHZ>?PaVAGD1n=nHm}{Z@~brUD!DFH!+-Hla$;=Ilf-py zY2RIpS~+TjAQ27ze0<|5gQSIcVW#3kyU6zNUQy|!AYJ$}9T!QGcQQ%h5mUDN=IfIN zKRcz?hiI#$)f6-Yx5P(d5uyfI)Dho23oJZSA%sjG=)DR>ba+((W#e-aT88xzf-<_V zt@z)2U{d9Ithi%brx^K^7e{wQe3di(RH@W}JQy$UrY9hjMB?@3Gkgr3L6fs)tQ-rsykM7p+{ zf#{l7!?E^4Q-@WslfZp;ACD#*o_=Q$_SYcC>l;rcdBKYIL}0Oai!b{Pd`|lnO=OIC zB<<>+O;vt{y3od)f~wRig!9H1_|2rYym5 zLtZLh%nK8%l>JmDX#j*sOROE`Auz~Xv_9|1l112V{P>vUj_(VdAD_fRp_9Qa1`bAb zhOX}yImvQvP8JXA&b&A*LFa5FR;28E6&fw81y5}dRWgdidQPoES?5`K$6fI-{Bc(? zNKj;MGs*k&`ROm%SA6J#iO()d9rv3XeDIB z#W;1IE&Zq8z~_TQ)tNYhtol7}jzYP$5!*NvsU;1xJ533qNt68JF*U0nAZm+w+;L-7 zCqs~_?OeKL)hWq1DqR(&qInsCC$q9K6-zK5RIb+Y{3kx}J{eWhEmUQEuX^Lg+zY9l zOmSs&>u}(}Nc~i2UziqyIJTUzo9bs|o59(320vw^Y>tS) zHSEzxkC``f{peN!&+UR5^~lusm*OQ#f)!;cMzQv6%*;w?|T($}W>oL1J?Tbt=buTHxH1OEo> zEkOR~`NF&J-*@2`M2d|Al9Sptl;o;g*DRCee+gFq{-_9}GTp4uoewX!o@76+O3`T# z-pg(0FB!AsN}4WE&P^&#!5%JA&5IvvzG1-{d0{S#-s$-=zIw;mbkDg^x?5E)9IwS;pAzx+>G$8~J_mOM;MKZZH;Hqtw6gAwDMS0`d%5^j#hlA3pS3VuDFnZ$$RATy^Yjx!qY0;q%Kme0JOCV> z;k2_gO>iIT*vX`DGOklJPe%j*dYiL?kNjGmcQn(En*<+WUH^wTdwQB|kV1$ROc5sU z3sCT|mS_RshFFV5c=9Nn+i)tUVr(osxSyac13hY0lT58D?MaoL2O^47;=#CYd9|`i z(2H*vh-uDZymYeJLE=qlK6n9Hv#ldOdv3W2a0%X?rzV=p0)?u;7ewz~qD!i?}Z@^<#813V9-M;(;7@DnUD_)u!l23)070 zsq&;4T1IV|<8}Tu{-UNIsm!>&0yRfZ1O4 z_7-J{!im#8ptyv^+EwWbRY5iW+@wA#a!0Z#`E*Jn?wyVGkZX2`e1Oq)j zt6bRfb-1mj-Qe4 zFC7d@CZ*5N`&I35}%K`j-UO9_+SCx zbS-C`&1n)Vs*k5e8iKWZvc$gMV@rj09`UhXOQawsg%GBs!bX|lwn>)SxiwNdUSs{x zV#ws~zcnP`{G(8_a~Idee#`eN)Dy zrO^>XF$_KR3s4zvBpWqwoqnhxchGa~7|&vNDTdk0QcY0P)IEHX-9WgN{K2wk{o99; z>Q=|jBCo4($ByH6)-O47A4J-FJfFVjdW$$blzl(PdtO^=T7Rugze8UOKewN*T-~+E z-|Awk^~>Q<6SXg&(y94MPfJ~XbFfJPfL2waP8VQJUt?<<=h7N~C`!$By}HC_11J4K zn$Ha~KLrU|D5r|j4h_Xh#{02rdIuhr(=P)jw(pq@YCifOVvJ0GxGD}3Ho-F=zrpg_ z7LH#279RrSs5e(k>U&-dlSJQ?8fa;>eUL3?1Qj17I= z)FDt_tf%+o!bkP4w>_d+KtRblw|j75wd-WY=zZut2LmXQ7zopy$3QpM+yM&lG+dnb zC`5@8wN7=?RGfx2c%gz#a;LQY=Th3-pUZ4nU|VigK}>blpR373i-~!VxYe^rbHFT; z1V05QQhD1)&Hbz;Qx$cAI#qU4Ej_mIHa}K-6cTzqgtS1^V0 z$dHn*$~xfpt4mqZktS#7gj+?`ma)qqvK?-BJ;}gx&=4f)&e~|+dT$&S4*D0Lzy*N4 z2P(O|!{=G?L_P2DId&F^wLFVw7pleP_J$C4oMuz%r^4U4!sOctdHJaUTKc5(`B;Wd zF_QG9X_hqvwa@2#G`X6heCpyQTgRtdvX}m(Efe?%4G2a~V{|V@uC-Fk3Gp>v7fV1> zf*rZWn(non_69-^v!U>sApTbWib}Yc#|g9m&yI<{5rm13al^_?*E{>WH5u3I)dJ4= zmcu$D40B-h@^rI^+>3%bt=B_tVD5=pAb!hT_RGL6iHq^n`ubXpThOf>{&9_PlUwIj z7tqI{`m&|^?zhc{-^(vzXhD^}VoptGVmV|EwFDv2f^*U>8f-{AgA~k}b6G34^tD3)^8R92}oOio_XBEz^TDv0fm9?>X`q}(??2!dG*Xd%Gskg#9au=U){$(@p zL~2`9agf)L1hcP4mnP^DF|Rr^*g@Yu_g%OJ5sCz`wJD&SS{hPWU#gN7c^wm znGm6l=MlE1yZjwWcUt|illHm8exaBYMWvoc|N2X7xb~?j{(0od#l+;KOX0G{*&l)u z;9j#|%=NW2qPNQuFVA;#SM15J4zi)Q25D=qD-alc49l$&0h^q9@T@L-+uZ;ZahzH* zj35tR2pg0s%T*f=>5p+{S-ewo-}Kv<4cfqtFZVew*a-m(L~6W_l0c%yGMT~~xNIws z1FwoGftjsJ-ZBx@JP2G``R!$_tX!k!nfeQe0 zZZ`vrV0{dqBATMH8N!?bF~-p%?4q}Tj>8JMnd>q(Zy~3vCEAl9%dBhDC0Vh&HAi1{ zZy-(62yOB)0bUdqiz*b7JbFlSQj7fP3-XWD&k5Seu@O{NQS;FqiX^w~sGWtmXlz&x zNFZtH4?n7vpcfkjOuhU9)X*)Dk*4~qgU}*dTlD<(qNX4|K3QUQ!p)j;Lx;ugaPAYe zDxqg3B)~JORYM-eUU40>^i{h_9{kD9`L3JkBDl^`nKFA6F5y^Ln)*0hxF*;*<#ifG zh6<*+TQ%vbNct*iHYAC=6}x5%hfd@Enx2hY%^&9)=$e&n0n!w6`}jwVu+mg$B($tI zZ+cXnKj}F*QKTG~I)vqhV=VmTx^b)4Aev~ScGW{3a>0x0P<_~`lu36wG{ z9;3U|dAt{9kZ*_asPesRE2HaQUsGQbx zgst+`5=~3hGu}y>t{tNXuDk85`uo;YtZd!zOt4 zhrD;04ykN@`TW*uTuNGTOd?@-&PajeUw@^|(;{U>3+8$xj4xm(I6LV_emH%fzO6n0 z;Jkp!=OVul3(<&r${V0)-x11=+EV1+X8H&AKY+d9R*mFeP4Z9T^nkz9Bfe~;`2T@Mc${b1R!nlvTidS`V@lk0 z48j?iiDP1MCf3(iWQWCjmJ%>@cv(~X-MW6vUufzAx#^>_%!g{{c$YG&T%X+hKeBvD z{|v8w?7*gEQ~a!XZe*ASR&2fU=XQ1+su=q8NdG)xTgfMxaOFVQbo&)j+e%)SkiN>} zUtJ_DI5Fr3Jz>gk5b|wsVC8;o?XmM!+24sbQ@~-i;naG=`_TtgtF}$E zqKzJ_OC~4xu&zcf9jZL(@+Sgbi>ViP^{-;-val(H%6*s^sY4}Y2ln@H~ z4=BXE{lOdPyzqM>G|p2R*VK9l3hy^mtCGdRdTR0sqQx?23se@v?_WiU0789aAfYQ< z=bC%F<@bJXmkCDq%x}14sL&Z_?K@_r5(qRDBCEAZSj)%mhgeLVNpcLH5AA`iChT zAA*7pODWWsH9G_9RFp}*@x|DI*|b@xQ$aWp;)#q!hhs7z_uw46>E2{>7c3dLCIBXz zdLQz-^g**&TgA2=A>eyXe2kf%{wXYf(!morD3+m7BB(_9vUF7o>45~@`8PA})v~s) zQxp6%Mr?59E6#kfXog^T{E2=ax8!Lif z#IwkYd>66nwK;N}Nx3&FfjxP$NdSs!Hxoj`A1D=>fiHFTnF8!XP$jwhL>H-gHI7>_ zqBJ3&T5c$I7=}9F%fY(mR%^wRO=^V7JYiVK($OKG{9Y%tzU?)lOJVLF42AVLML=x{ zz6Pzv$D`ERI}Tb8HC&LNc^it@ zd-Dq`^&d;?KT2w5{+u!Fk{Eif{k_ax^PxZt(pUf9Ki^MBHt!N36RSCWYDxq@wlg9~ zKZUsi7{t|yZdFlPps}Ys)iqvR@ooQg=KrP#~q3Tie z(T(j~63qGS1j2spVuU%t<4_jlPAU$0`RrpSB@~q3jZ9 z2vDU_tX!N=9SD3#N$~K`#D98=mN4R2xvixcsM(ixzM)Bay#KZ1%RUGshf(n(vEVn7 z#*nY2mIP7&ssVuCx3FsDjA1AQ1o$M*wSjNro{X@N}V?wJ3gMm1e$i{_d>PxP>(q`!t-DmfEd!K7=0! z)*3`c1$Z`C_*;A(N4ccT9R&A)`^Gm$4d zvyme9rhc4%lbAQrypHe=zs>bL(9(?C!;ahn6h(b+Jo#fRLIr-Hs<^xs=}NNKUv@uv zpnZv#-^0#5UAy3OUhEV3T-xjW8s#nJBS=h~(zHEsp=mwtJgHZHPK-cxsEBdD)!G-8%+C zr_3#z^827oApO+IKKtU*J!U}XkzC+CDCFz5Kk2t0iR>hIS!<~0K2mEP?dR1!eWa`< zu(4I3{_0cn*`i~(vD-O&CZmAL#tf@!$vZpc<83Dw`N^f5nV+Uj2inw~n zr!efdc@hDTShEvdOa;x)vo9bBKi;Tp+vuvuv!d7<+f;ajA;~! z7}ilqQDvc-8!zFgl87MY@W830&Bh~=@v@Q)-PS$t_1?#Sx}M&Q zik7h0_fP)UK!qjXy5(Wmmb3dA2A6II4LykT_PTY6yrIrLpmbx z#rQ&qs?sowfk2h{AX)e=Y}_%p<#woi#lRYlAtv&KQdEq`x{^6l!%*`%L%ls?xM6ND zt-Z{Dgo#L5Ma0X2(y}T117+n1xhELYd|IKE5x}1C1&EWn}c{GC|$oK-nRvDN0`4qM1g!i`c{uSCe*+t7a{Sp zSn-O8V*r%Fb;4NLN58Iz99Ev_2c=raqPtiXVM~WsMa#8f zD8`-*BF**=k1$8exp6lxNM0`_(Ynq5q`s~8qvtb-NL7Kh`C4&>5!4}>l0qOql?xX| zb5pI7)a}Tl#EKn#%W62f8+S|LF!^6RrSE!z=S>V-4yyk*d&J zY_69*mTD|PG~F9Tj;SR7izxj=u7%2>HMDH^FbS>^ZCYbJ&A+_^9RL>aY3=D7J2B`? z(cGGD7!xncvW#$magX!tHU;gq&z9zJ3u>+`{f<$Qc3Qb?!SP<_ttGo$WDv~Vbt?4p z{sw^nS8?-zJZ`2WGg%jiLMdYcP@4AE4L;;etKDl9`rz1B)sA<6-Su&a+9a4sDmA%k zcB1MWT(Zae*``>Vd+r#gMKjMei6p4xCUT3y;~NqliyOI6YfI&~e_jYTokwG&r* z^tWV03QL3FIH3^=wrB=+Lk_pSUh5V{z(*A-Cv{e0o0HP65|#UabCJbiS%F5U=-r30VyMa3Me zjQcQM8tI+f6-ZyPZfR(~nlQwrU9a+GGl4=Sw1JLU?&5BPI92UgPC|B${+9_e8baBd zYoUCKicM?G!@ocmFOxDHd+ePFK)DzEUY&U z6~1wKX+1dqeHs-QRWzOW*+rXATGj6`mM`s)`x%FKQei#28i*f1xlY!lIm76LKg^>g zwf7;%-C1QpG+fcJC&XNMj>c+9JD>$M&Ss1Uc`J+}#;zj83B=^-24zjKAekV)FS`y{ zw11jNRi1<|;9QW_un!p6&GPG-kgjGb=%5FVt1Q|p?CMsLDo=K&=t9guP0k|%Mo3CI z#Msg0IFsdnQ-)I$>$Nhkcq$znhC5dfPwO}s1H?a2J6*GkFF!i#Hc}hRu#ymO*=W}- z1=jxdhNYVwwW~8CNr_%#@YDBhy_2=@s2+ii9^7MfS&f8Ww!ZY~ntf}>TrCw*XiCh0ngvC?Ymm4&& z0h*h>D32+JT-uDVZIjJ8f(nzBY6s1depceRRiUvYShBzlc_~K2E;KQcxx3Phh2U;w zRROz`SSA?uVxW~<6bMa$VU_(=k*FgrX_*6|@K*8Og+k&|34M)ghxi;isHB-j;=eI{ z;&#KrslPF#;?g|akEUQh$co6K3ZMh5u8H8S2~`+GMVg9h^;W9!LXm7D24JH&aY=qa zOS;lQCQQFa$b2Z z%Rq}FDGQ6nF0#RsbVpkZdZc6vlk5HzscUhMO>zN_j&KWarFYx=yT|JNOCD*OC! z(7_zC;T)c4h3Q~^?jrlaimS2wvFBr)ehR5V16_m^w{GVIS+DYsKnd=sh)D<7uZ2L| zgk=jwno|W#8kQ(xM_9!s*P${ET9Oe-4IYc3rR<@|YA6^0nQ166wOedCY zMg&(}IdOmg@P|8jYc(4fJFiooA0?UQav}-^S`o?1R>BOyYD>t3{Il_+vu6kgKKfAj zaq~*7-nabF#V7r{gVt%uxCy2AAQEC8#^6yJ=#G!ZF)dF4(N>pA%81>#x!=29f(}IV z22{8ZOFlAZFRyI87OsrcNKL3d43B3GW(R8N77An=A7|P?ru_yQZs<;4$4iL&vR{ZU zo6l--XkNTu=o`J`xLB{&b9hauA0}C7u@z+ZGK2)aPl2P|(@I8EbyfM(CYOP#pDvEn z0^6@&Nu~!{9U7Si#$TVc>+O5E64_hCN*Ok-==t1i?HNYhGjmF7Cl8z3B;$rLTB)QQ`7wYi>3%aKX+`o#=$nc zW);SkzroGm2B-Simz($m9uvF(r1v#$n~I`;h~v@Tl~>KY0qOF_{)BF zMJdTGIv`4(Bcp8H!W>n;lLziRji9#1p%ya^^w)7j#?b^ae>JE%&*RArJ?GUy;$ajR zt}R1?xBN-TU(&vYQ02rI9QyXDIVF^^7*+z&{Do{RS6`6+9A9;;ECOOR)7h7ZMD(TE z|31hi#nDQOt{pSp2tYr8r}eYn@fik4-HpmNB7VQZf`bO;(X93KW)C z+H;rvs(e2nx?hIffpIT1`x8)+w+u>>>08`15Lxc9ifw z`XSDrU3aV*g*X51PB>Qbj!W#Eok^31i1dop{0st)3@4wAj8t#7Gj?RQ(SVaxKgzl_3hdfu89I8y0kU*p&wiVZ)pE*9+^D*n zG%(k56}z8$#0K#0LKQvd=4o6-0deZ5d5r zvIEnd4QqmDR|`Ek5F>MseHv3b&mOBGt~zua^N>7UDk0K7*mqT%19_k?LCVsEe7v_j zZ{s4H%O5F)quJK`)x;7q*=Hp1kdeOixA(XT`FT+zIXOX@U>t@z8XLQ6Pb6l^G?0Y% zq<`;Vbi+%tmL^_-F8PQ`%Ds|tInHfm?BkP_VOF*?tK-*^?tKCqAd;qpO7iYMkE0HT z*)^R5MsbhFI1#G|kJe)+mB_W+22N337inERld0rO~MM$BvrI(5o)AEn|?UdN_U5_LJH9f`> zIz+@2bs5cBd?!Tol!Td)W^GoHynQ-HbjGa=<%y~L;Maz<%y$p(Ln%uc+f^6;E>PJ{ zvgMN7+N;~oFR`F`B4H|oK4ny?wPwt}dbeg%x=$`}->5uoJf0YI_ja30%CB>N zT%#L>Mlkg5oglQ)jppTUIi-^8ZLP6r%M{K=NQ|w^u(wM)3|_*`xV$C!5sSG>wyA+d z#C}+$fRazEBUQ1AD(#ix5ZI=CxNo)Dwz`ijSISwl7VdCjx2y4md|STEYEj456l%e% z2LJoeL@)pZsZY@EVc-Cx$@(qKJOCkqnZLQ6f5aQJI4d)s@TALwWuZcP?NGgI);EKx zn{Nv6tyt=Kcg&MQx0)7pn#rHN|DWw>n)9cDrdJ z6u$`Kb}w4vBiz=sC&Nmsdu?hAd`>m(;8CJMb( zL1V*=mx-oI(k|n~`Thj-_=}qBdW%}Z+<4c%DRvD;i6dnKw0s{aF z!eYT7wC<;mBZvsdBM=eB)bnsdNib*{I6@*~I*RytkA!RWytnPaIB--c5? z0TAO-XRNV;RLHVmWkmuKK?)QJziTqOlFNH%kdqn&h#WSVQ3q+9#Im7__GU#SNP!^& zz|aoIm<$_2>qoWC$~TMeBagrlMxNZ`Xe6Pngv`cY3#rL`u3vi&1wbcC_F&0~pq+6Y zyVhXJC<)PcU5PzQ->v6kJ;>z_!e#Zyb^*W>F_p8#f?{&286-W}c9v?IhCRRjb38wP zpZ|Ry2Z{#+e^MPeBX8{k&b8nuap8uQO?j=@d10Y%E5jU*)5EY6?Gyj}p+p0RKjTQA z6g~iBgnWgiZLaNqzq+yj2E`~epdd8w;cLJKG@uF2MBpg`;GrP^Zo`Phg5iZkS#*;T zgB*0oFh>*#t}i&GvR8{+ZP)|I^hvOcPs`dUpGxU8@dapgUkXV#LTMw73qAQS&co-?xlgyC58|K!8hu_ zv={^y(xA6Nl(Xh%C4pcJtXS^3dp_rc1fcV8>3rB2u?@vD)Fm9-qs=XAu)`y_BZ$bS zFr2rAC+E-4xPBW_u^4FRr)Ugci?O>WLPRj;g6qm8E;E$@!;TB-59KvMJGtpxxBvAS z6PG{#p#TUF!YBg@7gDNeg66u1q)Q=hK5g`II?^h{>?y&A6@ih!g~jNU7^?MK0-M^8m zrPK(sp;)I^ubJw`Hpr1*Kw&f-7FB86wwHAZ9;7-+f){MoXwke$qphJSCdBkallC33 z;sj}!bhghPXp=GR_IAi}J5)0&;xO3CS4^OcxYGM#b~}s<$J{ST;npll)sF&j1Oz1L zG>_EcjGq?N5!Nn9H98WfswtgWjX`B~GcpgYCG4x0Hy4gCSmH;C9kUOfu-aN9pfyHra&x+d0;cUXj@uP-k!X6rkcP;`mSr~C z+#aHDGhC11NXEEoji^%D?2=XUi-XF-Wo(aEkss0%R0vU|dj~Sxd(P#PQq#c9U0M#S zStre}zvDyA^&2#%EAs}k-w$s+b&p6oh4EeH@$2JW+xgf3TDEIk;_z!&m=G#J1&W(p zuQKc=D$C}O(FxDuS1SYTzl-poBS2EXrY>V#PRVM7f)jB$15^^F~ss5I1W+XAuB1E%I52;SzfD9 zm6%7O?Lw|+x_MNYO)6Me)srZd>zB>$3=DJlD##d2D_9;my0dmysSQxWX&^CL*;iSg zAM0;iV&U!;F{ttkHT%cIo-ZTWqr7o|`W0WsbEV(6LwyqQGp$QV4)dsSY^{6k64Z%m z#kO^9SNvZ7*0nb!t!R17`^>u)7)+4z%AqD=mrp;=l3=-QDWb6y-i@$FwV<*1(uSwf zx_+mvII$L1|5$yOGgG3qOH9%ki`TlYjJ5H3X(=N5hoUs+#Mljk!6K-E11OaYhEV`g zAj$J#RtyDJmXSn+|NF2+NQU-pc~S!@9?-q58gXHUtWt%aOw2IN!oacVL6#bMsYIK(;;vl^ zGEx&H=3ve<+F|W9w|`7`FyO+%1}s^EFiVXnRnV!q@Ph-LXv4|oP|Vm@>PhsF;}Zf6 zZ~}rLT1DoEWm=%lywkX+p}TDLChs>KVN?E?5IIAf{_;;Z@Lpnc!a!xCH z8f8n&7hPsEE*>(mGT|upEFy^xSSb2%A<9NUNvdSCs-?(+s|J$^HA}eh=qe7^W?Qqp zmx0Wdm!t|Xl+7Ct+D-Ju8jL1xBN0sZUSL;nF0MB1vTn!$i9kDKQfo2U%M)^!N^V_A zC7do3#3MtSp$9{^{c$&*p}AA$6IUy9cC@6zR7^pQnB{)#lUlW`({{FLK;uq4-?XbG zp&?wedFI(yh^OT}E%9f9%h77oZE{?$ap2|8X64GVO`1zwuX^t!O(lKylesI)?N`qz zHBw@qJGmT0iaFX$^(*@sM!sV*L}-;}cjBZ26>tSKxl&5BGXhh&PaO+r?!};{LoIi2 z%b-a_KKWTAFA@nr)V8w@kpMF%1f+u`gt8ICXqPN47l&7&dG| zEKSTN0A;C58r1*$utW!d1OR2%>4`CVeXQ#(Bxc(YVSiiaq|B-ivg`E3nLKE`8+N4x zQjDV(m}d*BB1(SW3N=W2x247cvRnSPTO5s1-jb4zOKK|8Nd%_eD?2sMX?B)#d@VrM zhM%WbZBDGN=(z`8^nclX#@A-IojoMBK1?+wav&4O0DziaOded1bUvuNx+U@nV zO?;UOXzOxYWR6Y_047x=Ri@}=gh=3m3qIuBQA#$vSjyW)XoWcIQD3N-n5A@^*-NA0 zwlE=3)ePTBMMMI+sA{GPp*7J`(g+>~IUL!zVc>9`65;~5q7!H$c_qv6s2-W;G%k6& z5vzGeG_EU>5@YL|TPbvtLG`ucUY!=TFe5ZnGQ3?ivTpqID@@um%Hnhj1g9!J`H(3e zOyvHk8KhxQj7`smheIg3XnMw&{AYn{K#3f9+WYk|^<&2wC^T!t@d zTB0=`sZioX)e}va@$J~5#i^Z}&y;FQU4109k2EyKSxF{H%L#+!$QM~tM@*JVPCHJ{ z#rqDY?wcRznoS(C*=>?{$M7;Vi8uJDX!1o05lqw=ZNE-Q=$z=o$qXBe2cXsJ8I59E ziQSHqsH&+4H0R%n(vp>Fq8y@kRR$td1avfP zDvmj0O&^t3n;4mjdqA6(Y!=lyxX^OskX+fgnkYEwzn_is)PmJ-e|NEdsC;$WqWYp=2Fe-kF+N~sJ=Td!}NwtFjDrhq)Hn5NdGe&ji zb1C2ERBAWiq^X>auPEV^Z(VhizLm4T3DSV(WVWZcqrR zO2K0rm(g$wD_l?rZw9#rFeW2WEyfO|5%NZcc6virHKMYt4=P@H%$)x!ea&-FZ6`8= zZsMe_$Vy9tjz$6?4b-X7lPT9MlFKdZJbEp{0+rjfdRKCq)wlvnA)3m-fq;MsG3X(o zRBBM@m7oOmpzSE&`A)n^iG_s9XH$6Cvx+cu{K|Nw@zS%fh{|gz6r_l0j^R_$0U-- z(mfsuH=1ltwV(HXq+&%Yf#_!G>P)6JGGdfEaS3@1l}3vOv;~9XXSj1x>UA+fw#zr2 zF-*ef<+g7`2iHD*ihmVAnbv%#RE$LAN_lK57VpUFP+E`zOT=(q$_t~)fe3#+SaoA-)a8Q*lNc^q;2s?a&y`$QRkccM z9W+j4%jatkk7Kh?#`)w6@3)|DI}XmHrxDNie_mN^@`fV2|D?KKgE=SE)Hk$B5hS#vv70RVk=JM6sRYD+s0HxyYp$wl`jD(Hvns zRfo>ohSqr`US2Vc9G&^jZvXqBL@xjYb68PtJs=2}Y?>|SqybQgZ%3z@5$Y8(X!P`% zHEgpd$mC99my1x{NfqRmX=r0PY4-6p@uL`5eZf0h zia6Z1?ZRAxW^4yji$q2T?FzW@9G4A5aypB$ z-?;xF$5bbCK#K|abUG*ZL!=L^;d_fCLj;(P`*1`i2aeJv_*7Q0bjRr?AW7AGBz+ z^ck#AISV8*v!fu=jv86fa&XE#WLz{H3xUvHaFo*ta()*%y^!xR-m5^G8y=q##cpd| z%O|^%<%RV1In&96a)?qR4XmF1T%|mwBaxSQe@(roa9b686@bfK#|?!)0nG1W#D z5?g@=q!5qhk4r#bV@VX!aoftU^tUN3K_%iaOA9h*OTsFP-hsY;n}voX=kgaP+vq_O zkbxLp)MY_pEmXcEP?k!2j>vfG0HIO{Tj|oT6%cttFRDFvA)bZc`uHVX?5~ z0z_9+N1bh!-N*_Qnu`fqqzFST@t~?a3cyK3e)+iI zCakchl1)c#ZDxr!Z(6TD@N*G?xBvUFL?nO(PiWD7J>UqP?HUcIumKbOJw>^PfI@00 zDR(fyNWOtB;6{Pwdp6~LoMJQf{pzk)i<{BCmaC7vOB&UY=GdtYJQ%(0GzyDwwc8&e%#FGFl5w!Cj+)s4?M z^M?gR?mGmx)OhYF6DZw!dX?|BEd#5WYhSyJoh@VMnTs+6^=>ZuJ5O5_9QJpfYbH-O zIQG(!F?#>!d`~@RRk=?0^|g;$S--vd|60uaH?$5ag7VYRKy%+q{4CNhzy98qx7HXi zkl1KgEe(pthgG!IMg@@e0!NAM44U;V>{{f^#F{0?1sdWfl*IHR-Y%S(;VMlD(Jb#b z2^A!E96)sC4D(`adj<38&+hFxN0Y*Tb{DL+-u9=x=|*K_I4>I|ex&xVhgxBlK2}&E zK6cHzLC&k@#7lYWUWXsZ$|1Q~SHt*|Tb4}gdd>cG|JUy68gE$JhXo4ydis>-B_8mRg#Q0<(7X~kPjc9t8NAfhTIv(zQ9bUsY9(S43QnaQ8A_d3$Xkv#;9M-M&q&TV3ZZkLy-?EAHF7p69oJlDTQQ5kMfg zAquJh777ZdN{Q4fb*k)Z(6~({Vu23-``|wlowD198QIxw8rIajs3S->XRH=c+?-E3LJemU0($5hXxEwP6m5C9?$G>PUg8{%6 zk7*3TyL&8!lZ>L8ZuX+eL;N(>MS9ep$b9$z-#h*4f%6WacW(=kIY0tfzFys{v#b4L!?YbQ2 z^M97V|MKtQZ$HmI*mwTvv5RN|5W=Lem}IJDak$;HO5Cxb4ibkzhEh#i$qq$Vs#MGC zHmG9D-;rDZa06&!q~RP0d4CqOk<8D8twP;d;xQ1WD3}wh>`s5g<%M2S&WXNrml*p} zDlMY&n>Cu2)sPuiZFjZb$D{l1DMYrUB&wpF>U!~WGn7p3`|l~GX~Nuu8KwNub5Oj6 zchm0M#s07V{{2LCDijeG(8{+)L!vy>wmn0w>yNAMnAgtYQ&-$UaV}Xu(y7+i$n|?# zeJG!{CDcsChXxH_!Fdb+|NsC0|NsC0|MRQkS&N9(PymV)If)W1^bFJ*#GhDYf65{b z3&lLC7<;^D73t#%D4ik{IxdCXbZe2#$kymb%vdP|l*VnRK}&Iiy9pBJ!MNlWMyJ)Z)d|~Sk!B9 zXVbNO2>y>^LXr+5MpsPf+uK5h%XTVbRI|vQBq*~&ffgH!=(M+sB+W2wcI@|%mDh`! z?vqwX5Mj~;+O1vc@@`vt{ck$HU}{g8-j~)qP3scCS_lFnBrybeN^^jhJZuTBwN=)t zintIBFPLaxg(R@R4gov`ARdpU+kid>uPesDPjcL^GD$B7%bB6s))c0!r@n>MC>qrlz&y{oTJe9vs( z5}y^QbpTcQsG#k(1|ukkYRfFjASfbQ^gB+JKI3OgKNOmMv57~hTu7OhksonCG{|W~ z<|JVeb%Q7D@f#pb5|x~YiP6nTP7JxJIX4`%IwK(N2*M~4I~Rno>N`;em4)rHt)Qbr-Y%P{u zFEd5o=mlg37#4L=_;4}S3pF6Ri6ahTlA18zB9^nzPD@oWXZwVl5EJ|!fv?gd08Oua(+C2CQ!MgsgSGYM`ic)YE3xXRJ_*LbAz znRAN$KebK*c?L3!khda~3g&93T9juJ9&nc1J3>!LvaPZ(KwzUX%C%<-=OqG#>OgNM z+a^ytd#2XcC$VBNL%lqB?k&(>RY4*imPl_E1|r>1l>r4nubon zqKI?mlz2>{fPqJ_NEDQ_>?o+IS6x&Uxu)C|z7mW@G$&#;nyY$6$}}E8youP<)xA%3 zWQFy}<&xVhlcrb%s*H02Lt;v_VP|HZPU7UjS@GsC2x|N)*S2X>vj;JBDYYWp3iWRq z#+sAHS-FduqgdEIzA@FFj#kFZ#g_5C+kBEp#9fNl>ZeEFm1(<->(qHEjhWkd+WoH? zdFlOT)ge9slj@!1)JAfKvP?W9DE<`v1s!e6tg=@x42%c`#HuG69+WhJ>NQJI8g(9q z#gOJsX;yN?9CQ3E8bL`T;+ifZ_%@qqJDhlOlbflik*pYn1Zb$sv@DJC>ZYW}mPM$N zH&T3rHmkYE!xE4A)zYrOC@QXdb`>6Q86vUuw27*BBQ=Mh(3Ch@=T!kp(sEg~u3m(Y zz={wR?WEY+A+(E;ZjHfY4^uAl77Q$aHJZ<RlI)H4N%{_(< zPZf<#rg^vN`)+le^j zt0qjY^Ph08Z>fiz+Gej!PZNltb3d9!d-?Q_{pjkq`#l_fTNPhlmxq!)nH3ejsYA#gJu zlVi}^8mfue!&2HG194b_<%-bMg|v;zUSlyW8UY9$XH>3edNv&*nwSFGiMcJZ$#`cI zQYZjMkT!{twWypvhpZPgoE<3RlEXAlCu&ISOvJQlA9(gh!tn0)S*zJK%f@7gzB|l% zQHPb{UZC_$vyII(g>g;IB~fLzQ^Qf#gm%gNi}>7sU$es(F=m^cM^a0Y1gM1^kz0*O z;ofr!DlMyTp!&A21gqf5kbtTH3B9KzlW`Ui@-Q72`2YK`L@XOF>^faN zCO=SFqerKhapD`aX*BZ>T!=k1`61_{md7+EO#Ifc@(39Q|Gt;~!9o~`8rRnmZpRk! zU+>v7SW&f4oBJUT=G!A!>qPQ92|hIJN{XLVxRodTl}wxb&krr_-_vz-P%Vc`!VK1H zEa{uvYj(RVCCbt(liG7w#I2v**1vx&?VZd37Se7-B(h#2gGFe#s<8>-w!~x4(Ik>o z%2Hmaja>on?)J11w&^nJJxBjiO2MF1W6+$c3>w$)SEGE zA_*emph81pC!{kGsUTyn&WegV2(=KQS)=5u3Um+!kfTw{CARW}9cWsR=G|bt>S-Qc zG1kEe>i(&mLh<8Py3|*XtyhfeH)_AiX-=nwYwFead?xcKyvDaR4AqhW5=oD**Qb-ZT+Xe|G2qg;3W5Le0N#K%;C>;p|z}2W-X~ohON);95#s_1a zA`NV7G)d+oOU<8XMUpdm>MTZq|CuiKQ4Hep9$CfR5Fi>!Cs^+LTy^ZvZOp^A%-u%2 zuJsw*Anh86cr>-l=JuU(zEex^0HP_Rf^s={WIB?EgT-30X~DBluf^*kCvPtI-gPu@ zOc_*AE53Gna;Y|AQ(cofJI$Q-+6oH^lvec?AMWBPi2^J{{1C~IM&T2)Wk=P0fX*Jfg zo3iez4+iqMNuo7CkviDr4rWIf_z|O)1E}q)iqe-vNd}0rdjI>dL=^x8sbbLWJs=94 z%^Di4BmopbYfD*%5<+(^YAZ0pNV2RpRD@Mki!$x}z|t*1p;^XOY2F(&?s?}siIL|d z_GLCj8caa*(As>)z8*madS(5z#3rK%+m=SyrDRFlT1jp+1{gTYm~zmHB#cW-l+JbD^Axbc`Z^-bJ~VU8cfC>61vQ~j4~BJY*IUw-05gq zIJIU6>IK_bGDf2&Gb1IfG?7j>Yp3qLBme?Kvc#m!PPr^iAxktV)AW%KEvzSH(roL< z@r_O3@y?ywj*T%|$BW6ddx-5cYU4OgRuYE-Z5@ocvE2yR4wlx<;DrwuaRl(x=~=0| zD=meyh#;emLD9WP@-{UQ{ThAvQnUo*yEIsIRZ4ow zeL`xf(X|cXrc(2Lo}~A5%>Vw(*CK?0>tjHAzyI6-00B=Vw3=>5wULI!nuHG^hE&vU zX|G%DX(T&R6~!eOm_Iu{M(K;~7?t5CG?b>Xu@cBj*e;Z@jax_Hl>_j>c|iR?A$6g7 zc>LwGz<+1py<1C_uJ*X?n@x7wmFz=A&#sM#*k;d<0tB{b(CveL|)t+`3(a7*62 z(L1Qa29mUEp;k$4+|4qaEk<_ocQ005q=#QMkv&NIv^J}}qLg~@jGna1I%FEO@_mQH zuaU`QGI!w`wJtGOCuNby%WgY+a88}EP)v-l;6ZrG!>R6!QYfs*awwV}C2Ty>3PX%E zy86yFiG#wG(&Z&JT^z+(n`@J7uu637h^AhkoSVpObo!^gYXTBC^%x^PkYy`swKijt zLrIy~Qylt2v&n6a$5vBsqC|=?yV=95IXZL3?>sGaavSzbX5(FQi=tty))-Q8R(Fv3 zw{-b#!R{;&5}VlDj$SN;LNY4E>7rqY2?#77ov_TEtfN84D5FP3!I2kpcOuwAXt658 z;aUP%oF0WEICWhBa_6-8miLOESm@S8M4jCHj5`863jxa&YnPQBFXqX#K z7mIWF+wA<-8mufWnnoy&G?+R@jxI3e#cX5AA@Z#AO3yV2vD7yU&ol7#Yi8BsEtRh_ zVqYlNqectML~K5;2GpDgyA(|_l4ZJ8A~wU21~Q5|OI0^DDxaHoqW}BQL=6B0?r6_# zVSoslEV>=6BmrJ+>127C6hpQ>Z7VY}h||_!yJMt_*ks`7ZqfPr#@%NBR4CkdrmX#E z`wqDkU4HL36-yV}%beu53$6SSOA+Htt2&kTSwZaaho8r7_oFq3^EW!b?9+B!IA6&x z6vX9h^Ls40`AGiVGe_Carp;PrXYFaTbojNa!_#%r;_ETpcp7)#f(UwQ)J6!$igQUx&9#+T3}#vqCX$j) zs!HUc71Tr5&owlfGexww*5aINdaM0ORwMl>wDbxMs~Jf8w#hnaWlgQBU0B04@&Zx- zj7TF=I_&i5G9#E19FsH|d|=EGxxJ`sIhZwY$r1e=$RThAj4n_+0_V*LBLGH#-iu&c zF!x0dbQnP}u;Mryz*8DxcpYiGJc))#B{4$@@L5C<(70($*(3tlgH-`=4q&<YhAP{B1DgZw~yOBbCX9i%J8G?#w-A%A)K-)n(lZ5!Q!{Z%7lNtv|nrW2> zv&Sk!zMM*8dKPG;Mrp_~fP{kheU*sy zs54_8E;rj}hy)N0X}0BB6gMhY%bbQG+-En&H!vmh=qT{;e1mY;9<)o?vU|NG!X5Dwe_Q`@fOi6dpwxpdUJTsXHKsKbR1JdCBRqt)j+`mXHir>iV%imt3z!Elj2?St1i!&>R` z-d8d3#OYzPaji3iSI-$Gj^C)XWrE)t8w)fh$Bo#u9{wE8QDv`x8ykru>P+ED<3ELp zK%<3X=4vv1yw|*F6F0HKg(s2C$~|8CeNwuf+m=m3uCE$-mYsQZDs#<)cg-Oxcv6zR_SSIoQMYP znt0s&PV8b;a^zynmR%f)OCYJJwBB^td}0{oCKa;1`ogAI)s#aMQkiuex{hZICnXg( zR(^h8*$k?!J-n%TIjcSTYHVZq)ThSBZDnV-^2**5kWww9=|eHV(3ijID!GlDoCW`lH`2SC1wi z{xxfw`EPx^P}29@(wH z3_S5FXrfH8@kPOrP-NjFVXz8RP$3nQz^JVdqHju)b7;wnoFhVHoxMnbqCl~{S!Pn4 zv{&ioERcf}Bv=u6OLUp>&m0YOcjlDoW2+%5Q*fvuP&wkzt9sflYFMUf@%KrUohO)L zqkDXJ+oz?LhQOji>JX}DP!8P{GGR8~7bSJH*s?uFo)F?}pH?VcF$t9#j@3aiM52@_ zwAsrl#g<&tsn&=j#SB2m%S$_+D^sOP+7p<_SonOwW02GAn-(W9P9#uH={!v)7A1zF zOb#a$m73^LY>Uj4{2qDhD%Ckr&Wa3Jg$Xi*gd~{;78M$a3l?Om>!^*77F?#Nc@2A< z7gIB!%#+nY80^}zXdz9lb6W{X6*QEkldRbLSNWv>mm79}G1;#tH*E$e5CRu@|NF2+ zUxww~Y}11;O7gqSYLQ{-cvdyFOAN5liomw%!IX;mv%>pMhV}J+A-o~=g`20NV$2z@ z5geW{tsH?4fNU;a3o130GM0eC#IHxCAjL1ONOQW0Lcoot4Z#Y~53tz_a3oLz6OkHO z6PIk=6l4-vRf^1bqHs*gacxy7aN9^qmeyz0KLm+U(GQ8)Giq|m6=<1rGD8bp*zr#EDl-t5KdOtie0q%lcpAg|kb*srd^wz^m zvwtNwL+L}opg<9c!5$41w;F3jX}ZOu!s8T>3p|0~i2eBlnV$kE2j}Tbhq3Y@%;g#~ zYG%(MF)>3PK*`bbNlL{%UH=2CORzmd^|KxmpInA}bNtg2!|$R(O?oLsWCgD5JfNAV zqA3Wm3<|mu6!j-eSKj+!(bMrg%81 zK;Jn@QzF$>7UtD#ycCW6YHj}*;o#z5u+NM`9g06R^2QwQdQR_ zsx!n+V6sWk`^{c(*i}V(cEVdyax+=Mh$xfF$~4Y_Tuy?fdA-h>d&0LG?>C9NHy%|0 zLA6yN)-!mU?!hX*vBSc{O_hMCH9ajAj#~#(@t)YYbEhdR;o8&YHT#&8Ar)YYJh1=! zutXVv1h!yNiwrVw!7REUWr>s+gKyeeEHx)(t9!mRBSg zT^=gcq4Qx?4#p6Yq^zp;SI9}OLUg(qMH4J!D^gc$lGB#eth6IGXOqia6rZU+IK6Hs z0Iv*1zrIqHsqV6Lnb>Hp!XYrO`Q+GqQ^I zpereTV^-bB5Ne@ByfHQ|pde>IM=B-ikRvWdQJw)C7x~Q`X&WG-N=&lDSoxMXC{CU6YBx9u)FdBg@x~e?J0Z$QsPo@}a>J&2SG{YDLAyk}2X>Np(jI1^L?M$OR z`~0g@=_$=O(fI4At=_A-d8bOdx!Y|Ww3*BuMKW2Zm9Kj>{!vzpWK90vofz5L?=D$mu1tTf4T)LQ*Rx`O+e(l5sZPF5;FF91N1sEyO+@44Tfywb%7`g`$+n$i<-b z=_GF^sU_CkJ|l^uN5t8?-LpH}Yiky-Nh_X4sS@zI6qZjm$dN>j;#--gX|tW5cdeUB z{%Nm1lce%>nzJjKNHu(w2v!+oQvn50ug zlFp>7>+)5!=T%v>?(OGYLX+nmPer3864OxT^NhG9CCTT9ssOT*a>*^OPHTjrRWjyS z?;8L6utW%e1NUgsY33XFdF&dEB*Sk|9iv63n0I0NGifOFm<^oc(@$pBX1tva$qx9e4Ng*|LXdNpH*@6*QAxsj($_1!$t=(5%!!3U=EjC5 z!6q;>BV55V5IF^?TwQ@s*`5ng1Z-uEZ+fG47Dt^VKvp^@vOecmDzj99;iw5>NSc)x zP$F6=e;Y-_xG$A&pK27MqO*l09c3boq9Fd|iQCXV1F=M_!-%-;L?K4Bpy4*MlwQacUm!3lKY%(4`ai?CG zQYP#lr$sdx1gB-I3F>Waill9atdkKxF?;h3$uO?joqjySzkli+7jsXYu#;tV%X+P3 zx6DN5npw*`_P& z=_sQ4PSpgdG?GVc*M2+)f!8BtdP9OTaT%9;$$d_WXx(IPQ-0Fr_oC5c#l#_m<0GNV z`DiWe4GT4IQhDy}If~oTCGyEzM22S{*8amgQ>hj>%K)ocUvy) z8@ZR_|NEdsGXMkiXwqrvFj$7|8a+KGj}dL7MWmS=q7pP{sPv&cnCES~*?D}P%zbJz zSF*3LmOST29ln2DNDj2_jwv0M^LP*nS%lS*mVGr<^=__WuP@OYpSIUpHQG@O6enh? zzRToE5`-F6d9;)ZIW=UJm(>1rhYEw(H z_jOa-bnR86k5^c|*4K%4n9ASvpZt7$%9(uKW(ielD%osn`OB<$uaf+*0#iiet~oaC zgAFcnEYGw;K8+DFJtx-l8bV`}DxC1imZ1r#2ouhkp0rtrd28~bKD=N?lhIFVrRFnO zA@ui*$iLf5V<9vKrz1X;^qJKB`F|Ml85RkZ34+7YMci=fDp+iu#gt3ai4GM%>5}Hk z8A?2}pBmp%q7jZGRK%M4=w;@-Pc_wRF+7qZG(l-MHQ~@D6iTF1*HB^F16WP~6>$1b26e1PksEpv56L!J)W2!QI`81*a`g z+})uR_X5RgynMd@-_5%>d$SiSv(Gbg=A1K;XBFQYxesXE6RzC&B&eaS&|8K>taKBF z06Umz<-uHMk*an_yJR~9`1pS&WmEu^S1+a@hcxz~QgBTPN}lRsBV z{20Lv7PdB)s3mF`ZwX}&8Ty9P)yb?mJwv*-#x^Ai2BB&5R9YEoCak=>fQ>qcbxE;$ zZOiAiw*D&gKE;Vd(85!zIv86yA&f_90Q>oy0gU?Q+e{L%Tk)sTl*;kMl8HrC+3$O< zb^yB3*E3PEAfx6=x<23<%(!Lq7v0x(`xC$4PO*xXX4MJTO{e>}$rTDdWlq{J(wHnI;ol_W z@!B%npJNM%d;bWS-pXrqy9pbp>n{H^Qt^(P+acjw>5ThX<$Gf892BfHKe&mP4qr6r z<|dZ&5KJQXy#Oo0VY|9!XsF`OL~c``NF|k!HT_`M(;E$>aPHZHsAI5R(=@7~E{jj$ zGyQSDY=1$2?mu@JwohuE?!!0A=5om*Ua=Fc9{o3|#5=TUdQgb`=^%YySs^L^YxP|xLi{nELIujKshyOUPJcRP?6ZV7jJYr-vE zFS822B11X>Yg)d3daw`Pf}{s*7w#@!AE_@NEf80ht^L8c^j2x_RM^&maI)-!ojgW@ zV@rCok)X%kyZV|e!64Hrtjno|@$q>a8p8Tg_UJhJL=Zzk5lgf@NnK||z+>l|M1$(Y zfWxvQ-%}1Cf&hsyR=J8d2ZaVvDP>?TyAtWM`qgOeB?X}~kaI>G`}5sBd0ns!RVY_q zSjwY+4mNia{+hjha%4Kk-K9!AVEOD+Bv$gIq2<}inEvmPLG2}pk}SiQrj37W-LOWd zcif%)!DO6V(lz4_>oOV*>T|WPq2lrI{YH?_4|CAXsdZE;TU7v5qx0kmC7PHh^~UlQ zYb`LsU4qQB!9`e#l*)*DOG7Z0n?=(5*uMf5A2${0|)zN37u{S2cz$O`sWw2wS2Q6yg7FFZ{uK6k=CAz<&A@dXoFp%0$QNB z<(c_Gd+eJv43u1*N8nbRqG$|-LjM9=Q5uEyApd60qh&-*be_@+!z(pa#*B~mGpc(I3J*Z62J z{9+H|7luM3EREJB`=xl+1q*xg-9!g5e>VfetWLc2zH?&Qjbi7h$K#RpF2~6IWgpR2DatTW8HJnqu?6@zJ4t1}ffV@Y72^x%=@V&h5gVD82k~WFdTYqh$Pql? z4{ym_zE7$`=muZ2?S7jzz}Z42gc?OC&}o^LD+QN>17ZzBOHc`AN|6AlNQI(!_b8Qy zcuh z!0dQ^u5%qVy@zlhph|!)P7=CcHH*jVliPKHrEA6ZQ&`nkD3};9So<|O(f-(>THfju zzF?B?&4u_thT2g`M8e61dh`xbM6Ql56j{ zRp+;MlaOOdamO&El}6VlRnR3@5et{X#SX6~AQrr15*^AGJah0U7$hFgWPo^s)mGL! z53Vxz9mVN&K|tgTQdYT?9-CwvY;-KqSg;FiO^mdq|p8jnZeiUsQ}B}PxxQfkVlbZhcRj*$k7s3k;w3UC!$lZ zi16Hn=0l3ZzI{WxqM$>}iO0X}cHdqi4!tP)hl_2|E&gTh)Z~5&&B+3orXGNGC~*>w z2tn%QQdAsQ0TYIJhjWs~AbDCwKT2u45uprM+B8*s%{NBnB?m|=a5Er>P&DVzt79;_ zoYvBbnu<2ZnU3aDz<}IH$9nQrc+IqQUxqAZNlw+zRwA#6Lpo6b5;!>HC^E+3bd=gC zEJ`X!RF=_Xd@(P^T+eBTR)wGunF1V;uM(VZSROr;7(_Ljh>tJKn__;i_<>3sr;^Go zGJ=y2^~;Nu#s7|<+}aTal|^mdQ7qn}@n(PJ#V!~#7Mc`-;6Z+z-kmu*K&U{gNoH>UUKDOdj}S6s_8TVB|9i6MONLq5;W<;QmdCeb`g^L-b9h(hDSR?;ULivjqRJj^ zt{krEzaIR5SO34$-zEyTN4$U9+|u5%x(OPj!(sf))#0zoZqee%@pX)t0_lbPN?R0a z+w{7@lxY69X49`SfPV8&T#PjdD-deLWun}>L*d_ThyBRXo+%*2HPpR3)%Tn&7KYaO zckYv$WII~CIPQ?0gC@k_kL*R%K`kq$E@^5P5&r&1t-oM$7~7j^TdD?c^-On+Y}b^_ z7qPYj8%me}Pv}7kbxUf)KO+RLw$_}DC7*~uPyi*yMmw9U;U%e<$Y^R=C53LhzIy~pJ|yE)dS(>$Fn8sE=V1ehXNazfZsSmXfuq}u()-a+!m zmkECEWARzlzE@mA1XV@GiLKlT0%Q#u-$c1~EI!gGv*()r2EFMh2x>cth8Zi)Gim7i zBJ(gsmpqMJU&QNl;{B8pS-DKA$3RiGFTZorRvRwm2HC!kXrJtUlc@!hPiX#^sjxeK z-R%IasWtKRme85uE1mYXl*pJ^vJtX%Ro|(pg|1O=rq(Z7CJmFd6deRSc*&b^P<^&K zpSZHxHn^zw8Q&Ob>uoUXZB2I7Lu4?2_}%j>^Yoy%-lQ+;ebDoP)#pj}dp-q%*=UR= zGcrU}*6FQw$Q=*cz`b4ZBJc$ARiUg)P+WydL7!)~T$^U_U z4^xThFs^pYLiYAQwJ!tio#?woq;o;bo+NR&6!Wsada@cPa0PQ)!T~8Fcen6Rz$Vyx zO}X#;24kAfFHFD8PpG+8Qhc5;Tc+Q||dN97a{sJInw=Mgur7lty$znK{WI^q2c zf>cplyOKPZa7+)kvrFr)7@Ah75!8DKY>w``H+gXzc}hshbWXJ!fNC5*G2ELsZ;+aBW3TBh=*<${#d zmuiWV!rgnTWhQ~{U?X_O7;ln1TF8Aw3JIgV+3&lGr9is`0o*h$oYWeT>u%c(e-3rc z;Y(RP)E4El!ETq&)wjFxrN8S9GxhO?jGZJH8|eJ2 z-t@F6l#!%qUDAQO=#m^#;?r@zSO~w81fjWeJ66XqD{vi+D|43tH5BU@l}$l+xh89O zs$Vnm7$_nt!<6d3TO0G13=!6P%5yEE{tJ#5dYms)2#Y`qo%hUfvS}KlRDELg zF?5PGhqOtNxk1kL3soyp6CA)!Om$}{@>iRZY=ogH$ck*J*5ZK}GWgwXYI5J>$?SPHV!<`&&z|18YEX>*cho`Z{b{4NTU_{fZDVv$CDNq-vC)TGGeY6B? z*VGg;>L21x8loq!>e>UIZ-QUBVanrI%`b5f%E>e>s6%B)1=<%V%8pm&rA!BMg6UbE1{r2O z__GE%y8XP_#B`67b&O!GHm;UUM3J;QC+dPWn;tt3b_4dKcN}$V45g%7@YzpVqP}fo z81~{PajA}x!dD!qA#3bo9PAN4|6G@!3l>B&lgKNl*y&c0loXamLXgr7%v7m6{Y!PO zbFRlr5xcz#>kUT!)8e;|)5-glhhQJWmi_u){&PBx25G`7UaA7l(GFQ+@r5<<3m)nL zZTPEaJ%6;uqZCkg%(|60W2eES_M9!9(t1XbZ%c_)PReyfZ#PsGCJ=nbAI&J+SjNZ) z=Y%;+nN)6RMQpek^nzM8q1A-I(8_irewivDSin|i#(6^5|hlHCbRHxwq-J_*0uyYG=S{U8<04Conr;$mw2r_9*_DJz}Yf(7m(NgQ4F| zAN@48@VIw7BA+ZOJ%IGQWfsN?m-j!@QfJZ#>n;24G2f_C>X@FkByD@NQ#ra`vuuem z_r)@mNoP1~!ukBR=bg!WAFeEu9Iygqr|SM#YhKHrMI9b)B6_Ah8WPjBg`lSaP%QJJ zBM1Mtsg=A4_w^*HX=!uoC3;X`biWlCkDr-8s(Xt2plCCWqmGh&LqjiJWlgTZ zDK>XA&Ze1S9@F|4i|P~*K9rzubLys`R@?!ZH`ZVGT&G=!A7&W~>N^hF?H?wO>&UfF z>nQ%#<`Ek8V6rd&U+oZrl4-km!9<6d>9pQZUXDbxm7{I+GgS`G&(T3Xpc0tvWIeB{ zQu*Q$rk#Vpe@2X;B%TSp{>CvMdQDk%|A+UUUNdh{(CD-huUwi5X@p*jAhGp=!(K04!C%W+u?k$7J2 z@-dg#(n-W5)*UpCWqb6s9B!JqXbWQbTMy<<2iOF%8!d_J4)lnP9uhcS~zgBBO zoHj}HMpp~n>p3W<1rW?F3h=BvAJxgQ@?O=UDSGj7Qt?>E3J#|woBdPimUmp9IkG;6 zILWcLwF=l8LM(jZYP;<{s^Gt7f$CMZitJ8T-0p@}vHJ`gE&u?biWsrWnsbr~aKqe> zpv%Jk3d!BW5f7VE(=s1j2qUwo-OW(CRBo)BTF(8a0i@Z_F!OFfo#;e)sPqZ_&cY^+ zisT8#C~E8+U4439Q)CA9A(wXGwqmJdz1{2PD5PxrROg<#O1I%?v{-16w%icBY62~^ zgV?gQdmhcayO4c#WBwDpw2rSCtNNSs;YYvL5nYK_eag-|e;udu_t$49o%8_!07*<( zNQqGlAxuXR7h8tP$lNvzM^gEV-~oC#26C7!8W{-3cL|&kM2rSQFBB+_Y-VDUlg&hT zSP9c3SJ-tkKlzX9#Q;DTvOc`DGnm7kESQ>fJSRRV)A?`@VDJ-kn0cvI*{7q4(J6Mr zr$gjubQ{Gp{DePT4qqT@JadE0GRZ3R z&+Ynx3TqXF(rx7EHTGN~FfOi+C*93oIsXK^e|Mfy2mKUb@1qYs+JilPKun~| z>#X6B^j@0Ajn_1dBQ~;?aV2KhoV}EG9H9B{jz*jNfgP*p^3!E(b%*F zNE3T(W`L797rNuaRQF+O(^f)Y$y^8>HRvlEAmpQpZMh^6dx={ZGvNo5!~0i*b#OvQ zDDt$&J zpLOs%h?yovwRU52g00@dMTj7Mb%M>?cf7f3IyX0W_{=-S6iLCndOfQNV4$KBqfb4W z!LGK)-LR)OpiRc?MeX<+4qi~SXClv^S7MN=?sB3|B0BLtR;p81tp%kGcr*$B#43`O zhh#7e-la$1WnGVO?_J9q`t)}M$~@1THBSm)NHj_Z$=_%B+=5?^Y+P<;)8^s#8?~>Nc z*#H349YCGC(Ikxj7Hw2?6p43B+ULCf;pYxpQp`MBp#hp|y#4Hye5dyJsr zueR!7U&I7UHZV1APDrr%FdkJ_NsKramk(CM5D&b7z{?BTI_tB|VQHYIW zd#VkKh&ffUm7DQ^O}n+sKi^}s{f0~>h~bM)FH;7ha?Q(Fzhi0&jMI8Bn7m9(h9-|i z6x4!!UfZ1v@0Hj8i8{?1J3s1@Y35#^VR36%ptIrVgK z(|ebZyv;?&;6|I)87|Ve4cf>O`I4M7XV|q#?$pCQOEmp!qPj!K1I$u=@_@u*=|INW)-bm|;}-#Wd}TQ#Utmwe*!CKe6W8I!;-?2fh4$2 zP;2AlbVE(V-P4FF#@CPRjwca$@1^(D-tSxDf+-(<#ZNd7IW8=cnxx(gUx^S1c$eu_ zr&;lk#*^s4Ajef<%HK+sPDGFZ^lT$k1u&;veE_Ph;UI>`!ly$>%PZ}QU?Mpjda?Vo(EkKjw^Ds z74AC?SnJkYkemG1=%NQih}q38;PKi=CP3^g7+tjv%9NDKr%JK-p)V0fv&qw8CrzKf zUtS@EB(?m}zApO1=$M1#y8U8pt<})moAIv%fUT4QVxM`?#zNLgzvJ z^AFO>`_gtZ*Ca@Sn{ct0$>J+LJ=jARMn&$W$v+`XTDT0*Fe|4Tq~BgpdSjht8-=w` z`Rx&l$>jO;T`15k1fplb z?8A%cuOilmV@UWBVWslZgYWHk5#sqoOW*^xCV4q~y6}Z__NdwoDU%`S*w|mhthz|V zhVEUOj^D@Dh6iR3{;ARzC$359Z~;vaX5HQ4Al>S^yi1}mdn(wyrL8w``gqvJG`Ge@ z1&h0x!7tG(h0$F=qcefFMp{2fC44f?vZ`^Ftu~gW2 zqowbnHjl|98fJ+3cQuW`+e*LWaO(0vR+NpoOU0VlsPe0IgZJpC)9vHQTAQQ=E3i66 z?4a~phsx~I2g03O@409tdJ3>j>xSaz0SO+KxOG<(hl2Sk{=|19N0*CZ6##$?CKGVw z9hEsXsWP-b>qQee`=1JT&3?}LMH`UIMJZlYjzmMBhcM0$9&G1tfAiuDJxO3>e7|Q< zEqb5_;*bp8AN{#uXa*!$B4Cf>AXVa0im`K8P|h_$_gmGoT)^ba?0;jizi&H7sn4W! zh9x^mV%9!8gvul^!4BsbYQd73*svh7*k3P4S0a^HN9o@K>HJ@d6yo=%)fGO^r{I=#=~7WQv9U&37}!)*SRUVT$6) zLkvxYpiyRNSEQ*NDsL(@iOC}smGG+t4YPR&?X*xWpq3+`Qn#&8;n(6X!<-zsqG z)`#VS5$buLX(xp#79ypk{NdQM7HuGcgj$7|`!W_yAI+hs`EP`42 zLBtB=T-Efb2qLo0nNRz<`A1iqpY!)3Ljc&K&1IG`#}8#%F!oKFoW>aOSuvf*dD))O z*LZwH*-+0Pv&E^aY@6oRETo*D3Y~{#%IFJhkB1OS>8l_b76U5Ja^8J|I7DrqA&$k@ zB<@i(`q%OVV!wKOEH|(tv?jKNMB-WMgv{Mub@BE36{r>X(2s^P{GF!F$&A%o~GPy%{gn%8tDDxEzcBpY4yJTY3i2w{p-P`K4td}v-7_FsPFJ<=v)Ta z*)VoO=>Gu2`#pkqV$Zz9g*^_RgX;t)65GA`lTB8(+O;K!eZccGKE?BCGO7#`K-S{R zNkNaom`>SJ+Ayz7^^o|FTiK{et2#LJ<6pLQZ~>&mFxuO@b!(bw%{JA+2eodLO6YuDEQ9-DBbPlKY>%v&JN%SpK zHF5tV0jgga12yMLJu3F&5)=W6{>ui-j>6w@cf$UAxrI=c5n;8MutBEs5JL86$$pxMldcEF_jy_T~{N{cd0cUDX-JVXUqz3t$>Tu=q#F@bWOR@iU~E<7zTG^~ zmoGxm9Mpa~?DGC&0Yt;Q!PNE0$FygBvCC%5EIH7x_Er~BJE_`bn7(=7@_u0Z$@^}- zb8qv)$EOh`RpY&~n%s3SSD97S>G}sHonQ>CXrjzel4|cx&jPk4JvCqyd*k2M!o(C2 zmtH*`9n(2P>%jrpR^83P#AFW_S6wRBd~^WB@uopTd`9B;L9*{P^RJ zMNhtx6cFx~uO|=t#k9>DQWloPK$Py`poFQSk*qrX`<|!E z=&ItcA7g~#&PcbXy6z{fPw|dVTej*%;f2Ar>fZN|Ib-2vM zI0fOn?kiNd&C=}fV=?XSdN&^BG&=d>odr-~-b-^Ywumj2GHo?@IQo8lp5VKz)*Mmc z9j;PQ{X~Hl4wvJ*uT40n0omRNIPlP$C7r(`RXb;6|I7(7exUq*xFgNcjc-~GkJ@!y zQ)#N2ywb}^EYh6*FEix|u_k;sKX)kLAAv*ZFFBY@gea5Oj|h1w?(CDAzMv?LX~LGi z`>_jQFmnJc(M}>ySrW;D~GvL=&TWT6Eu4yiJl#J?XbC0O!;Ijdu zV=P*kKHL&@d)h{>^VrJ;VpG((^J3YvMz}K&Rn^W|3*$%Ut8f?svZ0MZoLIH&4!JU zzCeYn;eJ8Dc{FFVwM#fxfrYC>q&Yc_D6H=znI2`9CZQ`oY&q2oq~m#EvzSW=)er*C zN4SgDd7e8^umQJv-Q-|Q)CDbHff}ek(PBa}&aeL(y7XMXu8~Kwm-`1AzwjW-z4dhM zE0nKWs%-h~h<9}Y>EjNRM|3@5c9sPJnXZ?pU3j}%8$t_x*w5cx88o|SBkG^~4!PFH z^o%j;&N>1s%|eO05x2`F#*R%NrWGGr4%V{Srskh!d*Fux3qNdbT80YLdYpZ!9uPjm z69%8W@AdPKf?J$tU%&#o1$zVb4%6oLDK*7nGQNv(x?SXB zKY!Br!c=gH!Sb&EEv5nhG-=c2W#|drjx!bI)NVOJjmUfBC}5anrPBj%dWzhHzl~Od z;b2`@7px&ZU^t$Tszt_At$h&F&$YU~Vfm&nz*I%3q&F0S9GXgXsL*kKH$i4$smc1W zW4>?LBQ7{N;AOz?WqO5B-H~WJN40*~1CkC;>_F5YJ-5eme1TESOTB{}?;vE|eC{M< z8jg&FE;~A=tp5}^Nv@)X5}|is`w9(7CLUTKQumh@=fqsdBFBm+Q49h*VdZ-7g5#X_ zWih#;;}?$*j{0)U_;R^yzn?YldB=O(zXofY##t2^g%nK3iR1ncT)VospHfv*wtV+` zC_9*91*=ZC{;qxwy6N#bD$3g0kDc9HtMR_rsH}`?soc4Gv+T0*`7PJGLIemf^BIP2_h{pquFATzmz?n9$R^n+g4Qu^i}FGndGZ-nsk^Ii1wv(LwYouJhZ zZ=M(LUT_~Af9RTXkBJH36^bY$tEN<>WU6*i)p}k7>c4}@&%9ZdqGq1|YT$3GBToLA zXWk4RJJ;@sljL>;aERBe*$fxLmi;mL8=IY{Qn1*v^rkA}3!N8Ya$;jQ8oZ6lUJof4 zeZ(y)yA`VX7_d}j`NMA}b7KVWzT@#lMFho^agN;TQI3cf8lBR+~sx(VAeZOnHjED{JjRqn7phGf zBMODZ_H!xfZ4q@RA{0cJEZgTuD4_CVoF}X}Zy3^)zJF8X5K+(6v5obMMP;K~j2?7k zDzxb%6RmD*yEb0hVf$|}Wd)$pST7qup>)}7XOxqCK!SdP|M}+{RiB;lr>9V+5xL(U z*t)+S@pH?o#t)AG{QL0z^@d>4_>~vvt2^t%@x*G~ z6b^3x%yahtQn`EShu&WccI1b_&(D7*J6}GwS6i9?7GfRzhE(obO^RCHQkZtsE?T?3 zqYsU}H|xX!U^Yd|n||vS&Mibhi8Rh#x~QyIhv+UtdU}yN7;2Q}JL{YCC)bSynyCNO zdlyWFMf0|GwQrHovfWnl4WsRSXgWjd1@{OnT2tV` zlNI0N!&MW}vh29?-#D2s_}07!jgOP*%&atm$w9?;npQ%dGg9 z%Qbjr({P@?7tm}iXsnnm4?b+2@I5%_5-jKb?Q;kB*eYn{l1g`|GQgK{jzdT9|3HE> zA!VvjgIE0W%NM~_x|r8DsKha?QX& zs5PHV@(KT%^q0H#(3TA$?V&5JTaL49JyyqU>sqgttj(>)`Lymk?HUG|T7?0~w$g(R z03X9!c)#aE<^i@7?6vV)X)qnj(!aulqX*|%LIycX9T0PA80gZLL#^I6;>k@gn?wVKJTqk?xgG#qry%w=ZL}x4?v}_nF`C9i$0>bKNEU+@^ipwhEH` zH$U`-IST-`geQ$QHzpX1GBPrM?SPjOwAT^L z^1apH`2mw@YnN_xD15**&q?+k!s>YIZ*4-L(qvso|<4e`m#?Rp2Ou4vj{$8 z*BB$OhcuxGRpz_F`JV-*ELoDbpR?v&7ae&H|8&pr{5$;uz)~3kW;w5-`&d1GGTyE| z9~g>=k7Oa8=g((D8oHo%+FzNO?}|!yM)`oFQt?MKZFDI2(NYPvz2N2icjWUo9wG0v z@<4%B9^U!Q*DlRrKE%q8FMp8Q2!@%4DzqMdjs`GoGK7d@Gd3<4Wm z!rsu?UxF_;F6m*}IIo_PIp!uhMUcK*A)%FTf2_c9kWP4oa!QAvhUBO3Z^8!;4WB5Z zuH)jplOij7Wk|Zu1PP1Cuft4qEhSI)BXkgF(WNHB@$cgP6S?_v~A+K`z zORF{%Ih&q-b_inikLgjbMtbUfTIC{C`fhfA?V79o8wVEY^!D+ZPY-e7@#5ZLvy&A& zqHB;FJDWLx4XWDye>Nu(l=icZ7`)0+>Xek`qrrGX9xoC1h3&V1Jrs?cX@e#EIIlUy zWa6V3OMc*{@aW?1YrD<+wdT)jPRrU(2R-rxc5)NSkEMd;2i<<0&be#NY7HJC0B^Pq z?!F$B$g|336!1=U0Qr>QpAPNuyI0IE=O?wbs#t1QV$57IrW5ovHa)}Hx|y(wyZw&$ifw_tkOA6uL))0f*~T^f^G~5-Sjoc3 zRfFf$%mojbX9WLWkb{@L*39nbuN@xH^( zb;<%DLUmLbRJsv0TrntH?HE#2a2~};K3n3nxSgQMH7mytlm6D+NGZvr^FiH2J4A1} zwP1@D_mzg7K_k8J|mEUvu2cH7fS^P30&&;)kEx#EIXym;dLp3tCU=AF!~Ez^F1YPZ@j5Cw{6 zz*2h7TtZrhUj5REEC!JRUj4M0JvpKJk2gzcKA4P;nkQRT?0Ry>f9!dS>qReE_2$MJ zr_&KUt`#}dsn%nR{-{3sNN1cqsqw3pLO(gBiT(KyQ%6|vtugjj7xyA@4NWw5)`v<& zQ|0v~o~bR${JyQ|yVz8!F4^)ak4N$OVkEm*Zev$=I1>Mur$fcM5yMiDuG&flq$}Xu z>@AnSv$!Tax`Q#ddxGqH^U-4qHU#@22bANj;~#@g#gsl$t7|8Q((cVVSUi}rFIWDZ z6lW|!B3yp3hSYM3Q)qfT!clz0YK8&BL?DZ^Q1lnth<}^-t+b@T`ayozJRCG= zw4mY9xNhVHWD%{cqv3sxBY=bgV(C2cp0PNahJ+tL*1>(z+Kthy5kR#g9dqQUuyAAjTgG!=qq#Bs1dhOd6y|bDwIT!=` zO0BdZIrD~Cv6I}CI457p;|kxdO(ir8>2`lx2b;xy`{likkTLpRfYxHAA|SmVg*C8H@n;_@y0pzKb z?~=p$biR$v(G(n*|LsCJAt>m!S|^9pzXBa8X{4C3wCG>#N6LpzU$Iwv-qLTW4n@b* zvq=X`>l_HC4EQyO&2Om9GZ|MW=gSix85Ca77X=)q%c$5x*Zk}~>4tfShUl=X!`S{l zwWiv`ydt^^&lcOeE|&;0S1Jk6V|ksC)sa4I#No@8C6&jxoA#$k`{m5tuA;wiQB(6b zf~XXF)0;W5lA0J^<_C+@5V8rRscx>@L)sgzv={7rsEF#?VD3C3dLKns6Tsx%DlhN= z*IJ_RK^6KIA-`!TC5u{XYWZ&Ewsb|6vxgaF20!FiLv+u&<0oBh_dpY`&X*Z1StF_< zUuTq3*t8WnTr+AtHzmwb%v_EHdt3*QXn5>!PO}s2NTJ9W!k70L7Z3&d)Hsr&5fP$z zD;*?!A{XV*QPjqZ0ygWN-{6@Y=}9Mts~i>QeAkhpo4JAFEbJB)V8ahtQ4?kq{Tz{hn^G`e`N zgs7IipHv7>eg!pFFOUm_uiptn6$e=TyGyl}l%G)i7{qhq$;@M5{3HxJWM zd$6em4Stgse#4%msT`Z~hFfnOW!lh`)!w>Ga#_FK?t2s}ys1R!qvpa7dE$HBF>iH0 z3nD7vnMZ{W&QO8Y`~TUG2m(-At!H0AZOrs|f1DRk+hXXf)wm%TBrhfWMx^1G;i)bA z)8av+3d}KaLm~t1pS9gTJt5~ysa}F^efHl7iCl)udxHDj z2+S80Dx7gSMeDMY46W0gN^K%QO}rnHO2>dhgeFQmj=s7af`T#dtP+=8yb=#gnNtS= zLe$X}S!QORE{bDJog~guce_2Tu^3%8ae?U{4#pTAKwFD~>$tcnAJzu;Q0NQVvs!J& zoqrL_0{xO^K7o0$A9QxQmSCq-!*Wagq#gt5Np+}gTNHjtpv^>%TrnJ=Bp3{E%TJ zR;HGjtq~bk|BZj}XRvpobFZ-J$m1whlh)07t_UjgiV+lnl1Rj8Em7py<OfUTR6zA#w%Hkj53sLz?=~OobBxy*N}iJKjv`j)>ozy1%b{=d@`$kNy$bx7Le?*;%n1fyWG>gn9ILNQsx z<6B6G(CZ*tc~KlpaRj;LqNpuP*el_v%kI?M*KN~DE=~)&Sz4!r^~VgbliiKLLmTr+ zial&kY6xv^RbEHKQB}f3A^@2c1)b#GokOOR(G{oD2r5!OR;0kb+WL!r$neL+)yC)O zfZw!EC?Qs*1s;{c)!bsU&PlafKN7!51s#>X%GJYFGQ0g_(Jo@74vD&1z=X(wg;2ZBM2uf zV27-j&_vN5FIscCW8mL%aofsz0Ka^tNCJ+Yuw2eJ`_sOgu<(+kGG215*l_>iQSx73 zh&JhP!Cw~-`VH{l3bwc~2awJUYG4DG#y9!dWuqvY8#P=|`^^aUNyh6CEQ{Qkj78@O z{0ua2t`SJh%?si`<#7sv_?v%o?SHs+r{zPmTJ-PRA|y}Io8LQ!av-_m+zRPGCfknY zxrL%JnJ{PMoJo>)Qf9$E^6Gj=U9^goFXnvm&1|n>{%&`e)?1EFp2k^_EK&E6wlnVs zj1NY}<-PTBi#1ibyxm^k=II$6y1Ie{{JEsPtNUZSm6Cru0Ed>iWz0Y_cKo*J z^IB}z#gUbGdM3-c-Gt}gBlo&OuM;*F`!ijmE-jjHRuXCP?Kq|oN~W-l{h###Wn#A(|{szaWOOGf-$V~lR7kU9j0IgtEeZJy#kX= zTp!gQBJGVcc3U5JELmqbF2#3hpzMJ6p|qoeuU0ZtneC5GA&FWF2JBnGMU%zZx9|Uh zGI0TSZmzmm*uwmsljASb0rTg$T-7;&g9EY6HL~fszB&7;xoLVcYL>cG3DZiKOGR0V zObchqQc2fL?DSp8;THwmk{7A4osB)<3I(re`&qzB=P8p*qx6UUq44r)7Cu7JcI0-s zQ7&2()l=^lgV=XQQ|WQa7tG-)UYi%>5OmX}_i-O~rngF!muFg$qL~F(#hGFm6&9qn zCB~j2_gvI>a(3#UC;yE|`)BDp85nK=pvZsUI2KW4C^EL)?T+3I`{Y&Q(+_1yv^8gf z5PLk%Uk{i=*3}Yh!(ec<9}KLA+7dgT{4`6%!2hL%p7@qQFpo1KBg62?Ia?aOO#GneZi|_ zQLfoKJS(g{z?w;c={SpXF$t>@*V>Gf_=t#}#Wv?CHN~u~K3N{qai>Hx-Xc@Gp;F(~ zoM0A!Pg+8qD2dKG0-P5MIRG)r+7Sb)Nn_@3viWL7(_{HU#&||UF&sp{Yj3Np`3Ei# zdKQ@nGr>c9;j>K`d{yLx(oKH+&Y;JeXd$5?YF7|8U@{Us{*ke=n~w z9cAUSl@EUB;1#P6wInSDh7U*8lgQYc3YLd6-UvC~d1}S5w0vgcG7an@8a9mN;(xEv zGn0V0O%h?1Ca)wxODSWZ_hk@VA5uY+`9`i5o16PX7zY)eKtV>wVk(o%(m2Og?&jeS z&no4mEoFDqqq~K$8q#a0OL4@hD@Q3Z3-$yWym2yPSQCKR%Pu6$solN|E|eYj(Ds~b zjY*GK%W&-Z;y7tJA5+_6|2hmM7R)UCa2eH|`Z^5<)oWYRs%vTX7wV29ymK#>JvIf6 zo-u|YbW}g=FOX$FX1m_W8x+1vJ*98nUYrMi;67iE%quOm3g-I zVEA9A_oD4^6f|b*>XR{6E*|B0+xab3=bYh!6+43=moj*f3t97Y_mQ?ysP{6p;*Gomi(R=-Yh#(_yZiyWo(iSlJbKq~84F$$~_dgvJcoOL_F5p9Wu- zH2%vIC;=!VFZ>ZcI`oYC?!ZbQk_A$ZV^;wXgwhRr5Xv!EK6f_oxcKgOo~a0dwAID9 zBNyS|H>;~}vt}8v54YT)!*!VI8-_W%%Mes!vS!sP`|2vcecn$5u$-zAsN(lmq%7XD z#MQI}DT2%Bb+rl=;;ZAFhZ>R;D68zFmLd04@T_P>;>-!E+zrz{?R0BI^&G2cy$g54 zm(IswhM`!44ckVwuaOa!!&(^W4Aqsj7;O~{7o~{s^O|aUT`T%(I~-&EmQNhGlci}8 zGi2XIlZeX6GD>id4%nev$Sb!+tfWC*{5Hp?g1vKlDn})1&8CP|Snp3W@p9gUw}q6q zei{2^L}a=^df|K(-WgtMYuL4AFa26JY6<{=Z{$gdjYotz4ek3tR6G#kE%fz=*(+Qt z)`B>_kC2;8S~qmVz%!0l99Uw6J`JyJ{O5BCV2n`EA@l~ zdk#(f6o|uwU55dnY`5~V$&_P+k^}Sp(8&Hqeh>m>JFp>lqMyxv_U`1HeGY5A(OpopsyNt!UW(1L_bZRlU{4Nu%t+vll5m)jp zsXn9fCJf~9jS??&wEXMZeblVbxTU4@=DtK4F2`VR5f`eCNuj>Y=33QB=Ry%y2J9d< z+BHg#7Te6kgzw2*c9EO{kU7@; zx@4Ua#6UWnEHtu`nE4(kv}G~rq3 z_3rXbYY`kHgkVxZ=4=;7nkxOlbS6+F1+@^znJS-8%Ph;*TY&4|(X;C#bwMYkUTMm_ zwAUkiQ2W&P$nB77dguCkUf8!~|A}17hm1LG{mRc6t?YpW( z?!-yw=HdUBkN^>V1C~l zmIXe042W^2FRdzBeqA1_5iwm_9XLu9Ok-nBSR`E7FSiVXm`TTaX=TLe|9=1&LFc{| zC2>wMubnUi04ceB1U2$RgijU{xmMWuI`z%FPS6I-;D|&5$X-DtpAkhXnDbt9KiruqX$0bQc5UNrJeA)gC-0}qcG~*`2_1=RJkfid&dP$a zn-lWKF~mKpt9j&o#d%bqnrOuYD+)bnP!f2xlhbZ&xWf84NP=YmkN_mN6P_4}1?)Ek zMo^&ySfSxJL!cL_87bu|-MH$bXtZWz-fFz;e5fP@@l)Y0rPdWbB#x;-W@P+4zJN2J5){xoVR^q3^~X$?iu=H)@fXKlHQ%!;I@ zqwboh#k}k8S7k>^L!!riu5#VJ;e>NA>a&|p)!w^u=X*Cx?5bx8DsYJzPb1nHLyD_h zo7u~fCRZq@(}7e{+N)da_IFwSnos~1lX6Dy9pR9aI*`^LkjR`Eq3M$wb0^@dD9{R) zlQSJ!W_%{@O0IHtN`ppJI(ms{>pURxMH(eZHquy23rE(i*F_T6qOFl!!Oe=Sc{A%k zEaaU|%-MTwy`LU`=XJ`oii&(N(_t=?nuBUb6q4P}YrB()9MM!!sL{{t@8*72N}X60 zh)75T%}V5(h(ME!B;u1@Q9wFM4LyQnjx#eJjs0OHW|0fY+Py0MWSDl@a=Xj+7`!mpzwFuauuheOjesx^Av15l<(IkY$@st z)2*&4%~9FEU9`BfsG{-6#u|>Rc}q>(=B)Z#pc7I!+~Jr$!6Sl%5kN``giwGp6pe(I ziDsfyH9b0HKqeBMH`ebc%Nmje%q4_oH5f*zZ8KAoEYy_D_&uhzk5k0PctEMS^_i*F zMSZ`Uw?2;MzlUmgrtbH)cF%U4U&`96Y-w-beeKn7cZ5u|-792eOt@qnnWyj>dGVbQ6Kn~M5?)kJ`_I)`lvR z)BpRRL^OazNodhK3^4eG?HX!fCJ7T=qeZmzfFf|TXsWP~1Ystv)Ftu^zh`P&F&A)| zPI60;l35sr%#&Fu&p&xpg@6DL9g<6Xt}LN2FeDZ*l70K1z2Z z7U-LvWvrIrL{e>;Vkq{9joiK8vc*>a3I5N?ZDYQ34OO(EbuT~vlhJ=O-d{@rL;-Ec z?2~Q`@R1T%G1P1%S>rJir3z|wllfolq6$S2vzH^sonj^E;u#Z)7GX35P0mm1CX^RD z$VllYr5I-}^ED-92u-D!9>%8pnUwWiQ3fLZQd*)_YK}s-8s!=#hsI2_^hD2PSv0vk z++N_Ecgc>a15>mGO3#1QoePb^_H}nv87#J2DdUurF>56`Nr}!b$xkDHJthPRDBF{c z47I?f;MU&={X9I+p|`R%EQ2BtHC+_5Ayef@V9>-DZ>BtI23uwjMUuRW`ZlR zEoxZ(`AtBTseQ=KaD@CJET8}8=cXEUq=sqoLR?DQTe5uyvW^KD)aCZ&e^USe00;<* zLNOr!``|?ArxguW2B70erx_Y!&W}TZFw31b!OPb%(Ga())oR#H&$`Cm z#>7m!IV6oU4tC)g_m04@NgCYH^?VENT-Ic|--L!ecE?-y>GfXUFgP`15hBNk^^XzW zVugYndS>}!XT3dX9<Zck>G z8kf?_bGtuMug4;xP|Ma_MxkEbu%eV@VzugP{jme6Bs$B~vR6;29;9kpV*f4FrQ}kr zY%$}PKT&tG`TKVzn&;(*-^(1eSAV>B_cyxb<1RZVk1~b{4?vdDQ6fM8d49kD`Tzg_ z{pa)l_xkI2*X8u|tUZ&xDGuwbI;VlvI}`u^|MLBS0Rlo0iA^@%rvP!^G6FO#NXZFK zK^kW*>~LY$=1kl~9tv>VW#VF%enicdWA!fwR(GrgMmGp{+)lsZA?%L=3Vp9rN}p>n z7iJv;AY6gs3)~!Ytm3k%3^P47F2W>!5^GW(AS5EF!~s*?+%8#OwO{-D1^~d;nv9{% zX}=N4ni);Zwe>Y}tt~1DXW;i~h(HdjIdpY$y!LZnTUb+5cF%Xug5Rcw{4^M>x8hN` z1{UvAR?jT|AI8o*t*-w0+LG#M=Os_ns$D|iH7NZxEo->y&Ryl(Ip>e(_O5+=?BsHr z#>Q4C00000AOr*i0)tcXea3u~u#90WG?N9~NLjX0x{CAu$brGK3Ij z$ik&DJO%aDgRbB>l7KLsHUXNJKJa9&CkIPu)M+x7QyNEFD5Pq{W@39hY?M&~>M-b< zvg2zS(%##>TR*_8&ALRjfI!vDVw%R6^8B@XI(>JI-IYqGU&V~v8P#r8xk2>S`Pj`p zyI6NTa9=W{=3ULR*T=m2%@`t4+{XlHU-!lqP9HC0wbbF_*oXsGyUTLc~=$ZKy=1z~osa zPEI!?OtoEGoLbm!Q+A3!9*L<&Y_z*erh=WV$*3@n4MIc7v`)pl5Xx5M;I5~RmsS3f zg3A)U9wR{i`=CTd0EFje(;s0V3ZN{igX|;$P~nkNMkK*18!~E~^q72zSF>(3p>I^x z$ya8zc!!0~0Yx`_;B=H8iJH^Kom+3&x<~CWV;I_nye8*M9nZ>CH(tBSR*RK zP_5K<+oKzU<=+X~#@B*X{>vDAA4!oRXeQ_~Ra=utCXrh^Ov(w)RFfVBQIW2@1s_ZJ zsYpE6S?`^~^|W;r03BUP9CLKwqJ`EfDte=314ASqK*d7POrrD&BQ;Ydjaq4=ECo#? zEa-QxcSRm`n~x-9qy8TyGr@eh$5Bg~NpV>g=|Pf8lv&W6++(Wr*?Dg=hMLk9C6tqz z&6l20f>NH4VPR%ZTNoiCs$PB@+F(ZG1e zEVx*RDjOw{Km-9`i4%5>p%$%XD$b*F5;bf00|`SO*@cls-G;PFvQ;i|Ibr3(deb&U ziUtfMUM1f!v|y69s-@|+UMF*5^UwLEa@iA{(uq0#A1LGD=OToql_`+>XFeWYWhK$b z$1M_e>}p*t4Uk$-2Ci$)uH8^N384T42`5@|_R!rlD+`RW;^0R(by7hD3L-F!vM8$5 z_Q0_zDR`Wl@&EgvL=%X_7-Z8?=`d=5%i5YfCLK@Ze@REM!72PP>CE()UFT7)#FVw!val$C86+Vo zAwY;UAUZ5cLXc%yCo@StM|!bd>gE=eru!Iiv21R4>C=!U-B*HPHi}DLV!v!8U&cNt z;LI=t|_T0pQu9fba zO(6w456A*aOB~#yP>9P4f|RUtZWa+XK?o*n2c@At3v(=rEcnb3yZhNGXFW&~FG_@u zKP1URsF8@uAw&*$EZom2G-iCxlbw?HMbC}5oKtV_%J|*e|9<)Wb zjRy_%{XErgF`ulRIi-;?Ht_OuB9zV&Dm~!iyDg_S>oE%5b1E)n-elPIj+nqSw^t~>%CiPy5+;d>fdmC!(b47{`h-lXDq-dyPWfj^r;OEU@-XRW^9}t+a%9)ZgxKa#t(OY%T zlOafpdLiV)lAQU9H_-{~>y%kHi23}!ZurxiFZpe9KP23<^r_`eV>bG&y~cOP#?Ei? z|HypTs=DomGdJ2>Z2fo5>`N=#?a5(RGqBl~`4?+R151&WvH$=DBQ41MT$^m#hedBs zJ92Z3*SAk<@(bCLE*h2HD*9LaMFCKxh%;@QBziE2MrBe{R}h3mT>vssl{-6HXEuB= zi@BgA+FQm%pO3LymxjG%+~+>pYum#_>Lm8x!F`F6YKOsd=wy8dvHY*hgjsJ7&{amqo2yLiBcY_tb=`gB*>^e<6!>Li-b3?TBfGSZiXtuDh1$EiK zE`DQV=W43)ja6&qEW)8Fp`ws;?3wR`03iURjmc%)C8w|=&-3Apx#95UplqFv0wz2- z@#71Jx;9 z*q2SC>9ZcF5Iu%k84koBF9p?S1{|KKJIM86^&IU>su3cPfl3LREsQg^spvBo6aWEo zNhH?Y@IJ<%ML99TqLC*Vu8b_N)|Mj>Ido{GfrZs^A7zB4s1Qw-8M&HoJ53`xZCSIV zF<68JKq@^4W0Tn_Ge)_FELld1jJZZ zI%SH^hOEU;Pq>fN$2Aj?BHBdS1yv=d=AhS;MzsP4IaJRy!pKy{jRL5L8f_YEO3=(+ z3}>aKHK|lZ;Ww;}_8{s+<1MD5@!V2185o+>Lz@U<1bkzzO}&$;w8{yfNtm{aQ^uCP zg7=EL6O&9Y6>n}aLt3_7Qb%s#U>m68_xSK{00jb*k;!)3sR3#k2BMNHd`8Fz>xST`vY@&h|n~fY(m!8axyYRXrU8(Cf2r8Sp4#%QOk5!oL8RKCTZ?ch>lK> zB%3R0@={kBh{;AFCJ^6U0`)NcB_yqvx(U0}az#l;!QLxhPtF#NdBzN*l|g&GYj$&n z%B1bKWUDe&yZY2qsndiOOoTN@@&%Oak-06mZmkDF60&rtd~Hm0ZR8aN-pEi|6lRdz zY^O!7XX}u}^Gg=I$9&zC1)$CrA_1}PHJF|TGi;b*Z$Bwb3b&?qs(kuxV@lgV&q zc@Uze@PUv@@9tq>DsIZqn2Z1WphPl&1KVa%Y33XHgDn~@Jtip+Noz%{Aj4_=v1qjO z4rPrg4b@H&P|NOvortk?hb_#lDAZVz0JfY?GTe6E&Hy+AQ5s8F3a)`*iNQnB9YWI0 z3q4qQmYos2*2BB(s9Rnl*j)>aMH(q3@#LwH?Aa|V77EsBd~MB7co zT>tf1DK^HfXPnr~`>!V6s^R^8bg3`39y2l@Cw;3}+}$k-ZxzlB;$oWr-@iQ0-|sx& zkSbRsl3lm%K=NG4p-WZHK|~_Lky}L)M^%Wm!HEBc5@KqH@~GOHNujx%&5SLpKaV$M z?n7I?mRnv@Ozwtb=FZ)hsDdk75P&Aia^n=ari|Y%&0P3|%*|vsNx^;G7|D+X!cN|4 zSN2H0ea`HDO-aV#ArQ zPp;@h&XmawDwM;KD^n6DaHi^6k(D534JUCJ?u|`QCaIZG+#ELT(JCi+w%l@3Ko!wI zxIbJ-h#BDY)?yG#HVr+GKcOhezD++2AYL5oN~)kWno;}>(RDh{{_wY6Cdbqsm$lBu z0lAxDFjV||O`2c7tv5B{vuYkW|NEdsDS!k2XwOp&Fc^VN8ZA7-uMjn(Kddmpq82o0 zb%dB4a^OhB{}W#fg|u$Q<4(rjJUwRHO}zN?e;xKL?6=LwU2MPR*_gln_uSN0gcU3F7a8Pw>xw6@%G~Q>`$22am~7MdW|O3TVaY~!)i!< zhrgE*QAbXqq^f4(ItitPsZR9koO0hKYG-;kwjDUe+E!@&%q)fWsJ)tG7dIkRcRwSm zqsApjV_r}R4cQ(Zy~jZ|XJ4@h%)tj*ZnoM{*)|zqa7sXUTw-Wgi(6i{%(80xs9>2k z8#JFuD4H3Tx}VV#c^eQdq{vSZ!2Tb3kb)Msx`>Y&?uuzuy^kxcu5W8z3?;e1{7v>N z-+S%9+x`0z-J{gB-$bwB6fGvkHYnZ3RkGCy-nOf8kJ#R8Z56x=HJ!% zq(9l#)?|sTIdh(-eKRMMiR@~3dHU`n0F?OJz>vngVdRk%>fs%!cq{PF0NmxPe?zmwPBL07h zxt0~E7*kO+8$d@ZQ&d{H+cG6oBRc0iX|Cl3vyn5xa&ohM49Qa=%n9-g;I5Zu8+Hu1 zY;NX8V1a2(HL_iI|AawPGLe`{(xsCgY=FZyn2btY>4ZE~{l9ZsjjDyk;hj)rnT1J5!KnM-<|c!NzNa%HJ_RMyeUz4DGc zCv&cJpIh-F+rN6ou4a1sSGzi9?E2pMey8`G-=6;{64R};+p}%C0TYc1glR1#4G}IS zE{0qRmSIWKa?;RjL@_Ht;-M#S&d0kH%3}`7J?|dPj1)zuzucGabe2Jc7_%;x z^L6wI0I9BiIH{$SI*D29W46+i+aGMoPzx~eXdJ$j%B>O? zR8hBCHQ}v2Xj63jv^Q(7HOV6DVO+{m3>?UN*l(EF8wsAWW=yPfw1 z5hXdvovB7mHyXW%{kpb&TD5s7$8FWM?mymDBmr)?oNe1}+!&#)uK5#vR^2qFH=UXo z0^F8eOAT{vF(fOaX@!WO^a54UmX5%@*h?2Gf-qLe)i8v$6YI`36hv$+vXGMqC)PnM zQzJNUf_pTf1Psobddm{j;z+`A>!T+(I%;Uqr&IOmMJ44+-lwZDqnfzM%i9y4!c{fv z_`#U7HkDbrgmx>rMp;3M)agB6u$(1LRbOLf;)#huVIbO4NbS3AB^8Eq!#l@-a!7>- zt#|Rht4`M4YPid&A0@7@V0#2P*9(Zw58}Hl1hJFHpKxyi1CxR+AcZdEhaJsvOUGouNY8(QQxeZ-)#W33E(TcNy!-AiA9%RWUgA zw+pY){G*-Lv<)2|uZ+O`x>ae`+goYLNdoHc&dlue(hqG^1rm2Yx&tDTmUdT z9STGNk)p)b?4s1>W~mU3;sFJ2iU)&6Alj4-I$CB@38m&%Bcai%AN zC`C(QjtA@;c(#R%g2O@3Rpy72bkj^$F}qzVOuqG@2QLY(hZ! z$ECOaiGA3$T#5(08?jbH2ryqk3yPQj^Fzs@PHvpO z=q%iS7bt%QfLk*$V;u1djUd&6v^-3TL;wH({r~^}%nb|;(^D848JE%kU?Ln2NX_8O zPNs_Gs_|YXnwzaelw=8p3JpcT4n0{sLg7I=5*Z`Zr%$~rWRa&@D<(v7UB8XSI|arb zNae@cRf@%MU1;i=!}e%0fnd01bCOwXYE`N4j?qe@aO@Foq-wK)4`Ze@43tkvGW*WI!CZm%~_eqCCg)oOlyEsNaG3wytX{QLXn zd&3?7?)81){N3F3pK#V6&fLQ;*6fS`GD5Bf^XC9)Cs&L;@k2!fb`acXQbCjX>j*5y zBrM}o5E@k)3$O)9T}jqb!(7+h>FiN{vNutbv-(xYxFoWeg!IDzi%Z-#Clr%MtWwLQ zHs)njW08pTiakMQHx1!2E2gbAF;cxGr#d;T<9Wdt zn=B@*V_w}gOEx?BQ~nt0_it*?F|m!S9ucHODrh40_UPN}HPrx6{D5F(qALA+rL@pX zFm;xKjQRUD7`_M!%j^%b?RSOI>^0(~jv0;X| zSzWhE4J6wOSv%>0rVlXfBaR5rkXC&fZEbC+Ydv#TOpD4#m}cFdC!HuRD9clsG|ZW9 zr=n6;Rm*R^{rqK9WgJzQi9&eL2AAh-T@zNyQlmQ_bVWyF!3JkA? z8oAyC(vJfKn(FnLrF0A&p&tU1hhG_UeJEy2PDM(&UibmSffrpg`EW}eN5!Zr7M&Bq zRK?-$C1ij)I~AKqY#^A{7FE@xaTSo>!}lYpjjvp-7j7*&DW*)iJcWb{SxaUCNx{NV zDI|auM*Te&VaUA!!N}>CIcFMF6*H$y+PrdFRY}jQMjE`jIpuqAF@|p-lxv)E+fAyb zZHkR9fvWp_=J|_RLf$BRQ7V&oY^>;vu!#Ckp^)Ifur@} zSOw-JE-=xhDpw6OHQ4*IwV>G@R%rV*HX^SlrYyI2L$ExticT_Tww4-|#|VJ743U zOs_f9G2~9|SU(B#AO$B3vemLV1;vofm4Fyih>ss z8G(fp1Ziz;_FasP|CLLUgL0JvfK&q9ai>OE6SUc64+0<d9U&8+FBK6n0N~;f zoarSEOTcxg$^+_U=wsF4Ctk9Cbb8AR6%|q{PI|nu%PE$7&9?}WO2YZU`ejeJ@|5Y9 z(*F@%$km&nxWUpM9iyY)Sl{<*skOYR36+eoLz_3tTDw$718|1`VDiK&BUZ>HZltZ8%JetWM znwZ5Z5$q}#E@tQTNOc;Q;(L*s^H+?Ll4uIFmCmSQB(GKEiP{EgMIN!Hn=&sFRzvAt z#agtZi5zftBub5frmd59G>VEq^5kP9t@Afbt*7dFF9@1aM5}h%o?rQ#&-d=Tv9H{W z{QL6$zD<7Bugn*=6##Ttsbz9?IN+-K=~&iPtBV_(GIdP>MX3ui{J|?+D!8i_864%* zD@!hLhg(walIt$xGkEc*vy_l8y2(fvyDsMWvy>}Ctg&_3W93yN4D@BgZsvbh$at(; z?)TQQy5^MLwI4fuEL~n|UN*IRJic4$@k(DhkDRc=g=}sotsq-by{}AW20r3G)X<>D zkDXd zUVVMStT>ROv&^V}KA_R6jqRAET2^^A4wu~UGY%xXn-gBO@FU_Tvl_Yhy=flwt?8L> zNS406H;dO>_uVb5<2$F`pxQIc!;7m%g_~}X^{*e}TeYC;S*%yYitkQ&I~#kIfB*mi z1Pl%XQK{)^Z90M>0RY|8k^Ei5Xcs^d?pqchNCK>2OBJhv|NG!X6aWVUW?WWdB_PdA z%ahDuBwsC=Zh4HPgCjF8UonJ`L_}a(F_n)|{7T~DDL`W(VBPpGb|F<@nq(o+5d%W) zKX43khF63||Fcgvw3)*Kw##KP+34+DC}%LG!`Nd5lQA4!s(Eg%*|}qs{ngu9O6t%{ zsqEIhQl*QM${O6Hr0t3b#y5AWTQw_xD_fzzIadC5ZCtTmQ+V>vGSzAOm1NU(=XW)Z zHK^)xwy?@k`>FfhuGYVls-KpysfGHo+w}2>W>sPRe{D}jZN#NjzMKF5|HLvv#FUyU zB-@fas#fkJ;gJlO2!z7|oCVP=8=79!MiVl-K)`c|>b(GWZ;Nou+Kck!E$0!IBegsh z)M40v3D@(Ow<=lOVT-k)%W{aVolnftXD*+!NtZIEyV~@%Deg=0sh2UrlKrX**k_Gf zGaUOgx3SL|MiAv{xJ2(?y^USm&Re=(ZvXQwVXW;^(p=US>QYb4U#V_(rCe%HPGNRa zt6A8$-rSH)&`(;GS*53y*ynNNt5>yJ&R;o=%5BuOUpYorrfOj~hB~eGbw~jO$%RJk zp_)#WBMzqVkYyt@fEE)N0^m2`6|hxV5D+H|l^}7(;i0@##(V;hFd-omV8uy^qe_AT zNCt*XJ1JPtA%9&=n)Ax*qAa<6Mpu2=a|x8VGAhjVq%(Ra8CFJ_tG?1`=C4l5Y+qe5 zSB>0?#N7y!$kXHysKfn3ODWb>qtUG6bMu+Csz=^K7o4>M%JIfie=6Ihl+4uCENdD{ zc*Hvwj7amB&h~M~+-i;*nY~L|n<}$2Q5kfK%x=7@mNS*6nMomj`(4zzVgIMjS$dZ| zrsei1CaJfp5iIuZMIv<1)tYm8~C^1XeEeDF&6ql@X}1-4_Ke2b*X8# z``ocfdSX=?y-6sydi|&xyt<_}Fb#^|yft#Yd37YOmu_!=Z})D!iqY83Sxy*bNtZiw zcw?Tg^HzWJ-zl%}8S9@(+f%ZNdv@w_p0)eD#|*0XD|lYclfS)XZ*;aSMlJTO`nImt z?)#~oV>2$og3aH{94p~^ttV^L`!sZv*KOx{KtgFH!~_=}GO{diFxpdei8a)JWs&#wgS>1??4q^E0l|KsmAt#% z+^Aogl(etA-8o)ZyWhr0!QQ8qE4#9q*;Ck?%H7Fw=CeT>lDiU`X?5Dv*-lu-p00R6 z>>ZRotN#YG1GT!;((lTeuPa-zjOBZITrp4jdTD200~o4OKrF9wlCUP0|NjcI3XqR0SvH! zN>Jjt0+B*8w1@^wmADb1ArU|?13)g;)X2i#dlw?>6s~7OqP84r$0*8WI|F+<=Cj3y zp44k6EgM;2s~fD*+;+<5kh2TpQ5)k;1~u1Jk~Uu5&&Q-XO4q1$yf~S8m@yvKu&hG{bDF z2*cq_HG)A;`;h`Ne#U8NrBdoUHKo(F>E%aQHIe&Rsv0pA_cPw@P`~Tkm|8glsJzG)~eDcb+hl@&v|1>Z*LdQ@-r6p=f?0Gd;xA}IT4MjUBv2Nu|rtJQIy=8X(_o{kGg&piS zollvwGgp+fS8ZCiYNzssmn(TwPgKtRtZidrm$q@w8@2V9InL{v-{t?if+UR#u?+zY zBmqZLU2qERw&=KKoA3c4bDjivU~K$UY;+*SsY|5~WzagYmLy2-L(Yo~7Xqzm<7+x; zBHgI+>9#FvNYbKWs+=tq4{)WEaS`wFrw0c&7W2L$No8vBt2(`{NI|Ju)iY26s1#6zf@Oh(7;Bd`X{GtXTVqia zicGTRMXJt%s_>m1=GCzK*i%im)qXUCP7Y7)uPZ`y(;zN~gJ5Qr!Hv=(V zJ@F!1S!aDS%4#Ou>kD?qXP)q1I*Ag|-(7*`@Y#n8&n%a=uW4p#$A>L57Te7%{@RY+ zo#q5dYk1S%3|{utfvL3)*?nw4v+=02?dsO5mJ<$N5qOwm#JJd)}o-SNs&g~4567tJ&wz>pSsj&Y}mDOu3i88utXXN z#9La@I|d%QlFWKDWh0$Y6?aKYFwLqyu4xUFnl;z&9As4Ocb23vU+!G=Qz4M-)-d;n z{8k;0vl4fI($+rQ^o`aWW3mVhtLS-l%F~~|(Qi$VAtL)o(do!l??+BpX-`H(rlese z?YMw{_?D>!<@P#~J7B2nmx`DmEJERugh3uCK^2ABFTxX(*+UGXAIEi)Bo((CHVbL9 z!dpU7#ll2|6#^#G^$e$LO~qgvQNU@H+3`M{TSqDTL#Sep*VbwZZo^ws7fW&(y&?>Y zv8Zri_f;Qaf_~uRkojWxtmD}NCYwD25)Lm>MWi5yM17 zfDBkfI4^aIonRo_cbVT}jm3Iy$l);H;kXIt!pn&fwG=}$nf@~!N2%hM}wZbDB=W)CR2o4csSjJQ`XNg z-zC0&W9LY=Dc|Ir+MF@B-gn?3xQN{#PoXTw5U0m?jB{i5Y-^s|Io{i1_c>|St@AN9 z=vQY{IrDw8y5J@OMaqTj7s!K;53f5)jbrd( zM1he>1|pZan8yGDne^2Ia033Wir{?e3siMVm-?SZ>`gK z<)zX~M|Nv;he`{>inpw8$m5C&?NRp=CNu@vG@l4Hc{Rc-PwrvZNOV8WyVxxLQ4aaNs`APr# zphPr?qx)OZ8SF8thisZhJj1zARewh3u*d2UuxSm4nT0WU+4Ik*Dc7%?S6$1^YwcMt ztVaiXU<3l(mhs*UKy89B2+$i4uq-J;3>2+`k_E)z_{lU~o?Ywsaq){y-$qk5_>>|| z=kKMk4QZLH-eHvbarO1RZzAm_R5Z<4hBJ(28k}6KUO7jiUYUY_C79DVkzS>QDRiuKKosP=qC_ygfmxK8nj_RF z7>7wm@dgtWh;2r;7Tjs{JEoK+OpErk&(Lb-W8Fc7w;=CFofWmWoQ!s-t-r3UZX+n2 zHKm>R?(%Q?c&yUj+e#YjnzZbVlnYAm$9;D?nf;&nk-3uce!_p1I&sd`4wXV1x?bf) z`M0CpPx5&Spha=r+lme@w2o-c3IarC9WeseWL<*{jy5n>P4KY?f*>5wzybjYq&zBE zH*EIp%R|DN#zt(3MXAqs;;YuYKHf$%v>#6mIq9iQKU*P1c6Zli#$=_pC|o0TPL3^< z=T*LIJW5rGkhES4x?4*a%;jb~7+2jxH~hZYxjX*CIlYWUf9hHRNoC#03kcz24M}xL z2)N}G#6B~Dr6V=jwGrg;B1CrzcF!f77TGH*h~+cQ!6b`oLpIm!_0<-8AXOjdO#m9t z|NF2+Ac({_XwjMG9oUSG8dG5?dk{&ZM(3D!;ubV%4D$|rm|9(|7H*58HgS-(R&BWy zQSiy2gfYj?{sg8uSTHk!g%InJ-0lS7g|7tRLRzpWN>0b`hc&99s-XGQsbcwM{USJ1 zvkn51P5kM4BJ4>@QI+^ebe$A3_Lj4hK%ivM+zbdaW2kVb5JIJ!rqRTg7VBKubl^sK zGV)dt{6Ml;U|_4aaHoys*qc;5M`a-f4`MD9=q1Y;)I-)Izcb8R%Qq-IA2yC0?o~2b zCOhj>5eBj~k2raDSmFdRmNns{VMfw;KKW(+(XLbgkiy9;3-Jin(6k8`ebYKd+_Z3#ev% z$1Oa5ULeG?bb{}Cn(Oau>Fc%QXMb7SV+@c9Qq%8!^+xMa^vs*%JC5%ACH?O(+Kb;q zrte~^WivNR_nzkn840^>=b%<9L@Wu_NHBn^r3F|+b~%G?rEJ5YjHh5nF7F8dO+i7( zy^o|5qA;kZJ1nFE%bPXJ6moNjw7n<)w9z}ckO{UpnvQdu%}YNgg)-3WQpV^|H9P(r)B&|83;fm z)r08w6N8x4G@THFTqmilKL0!=++d4p0u`ZAI;0%`;O^2e^zPyLMP*!Gx95mxRJB~s zvnY@l2$jL*ktl{%G4R7WiD&(~nzpv}&rR`B(x=)xi2KIia;sQMrjc5TZe7`6^k zHhfM7XaUJC>ZJ22f_|m4Js>3jN*YUsR}xolLueV1mA`!ES?~ew4`jStJY^1~&8VZ}H26)|3t_SqyV( z_{8b6|NF2+8;GOgXwp&U8+eZm8aH7kixT~#MO5^FB8IeRp0L0Kj?Cht#wlu42p!3y zkqeQUu?7S278oiJcZL^g1`Tl_kUBn;U8% zWs0+lpdev5m-uUVnF{UcgiOgcnLbmkJw7SkzM!*>g`>Q({K_m$uJxGL5`KJdxri9+ z$$UHcbD=D%`?XYSKHDt7C_WnXpJsEr?WXSUjVo>3F}1&*&9`*z-amG;!U9y5|Mo3& z0Pr!#q`4c0Q8+&2YEaQd35{SjaOG;TLiM6pbU;>4@|$R<6q&?JS$Vfw*j|_+Nn~c5 zrQJl!dXiIe$>puK`7esr9N8n4!u6ez@)nhH@zi#&XwoT3tS3msmJ|t#CRK!;R!U6x(Fr)^AXH*0pSUZZec2=7R_XY=oLY)(?qUny2HVTJ$z000nB z5W4P~U7qG;+zlEAfpG1yz`9+KOvse)RH0ms8|^<6sVr&hPMZl%5cC?%*purJici&d zA{C$cOrrn$z(gPb2gP{TZes}$xNFNQ%snI#odIC^grtIGrR<+F^pIUvMN(>6CDruL zUrJddT#*=zlFm|_H1hiP60xKrB=9(ntMyG1cB!ea*s=92+AaD90zzK3qFFZ2+nH6? z>3&!ES(k4+sAj*{A$r>aC@WeC5yR!QvohSO-j#R%edj;9=ase8G$1lSpLv@;i z`=EcWN}|yzb$V<6|NsB}|NsAW;I?0Bt;nB;UI1|+Zo}~;cO^eoQ;jW}ws5P-SL^@( z|NsC0|NsC0|NsC0l{uY_+r5|o00aO46hZ60qGNi^_WD@Agds=)5)jOIrm~0J0~4u& z?nabmT`CUJ2?YBWg$cMzkfBy#A<2bmx#70Mi169#7D_#CYPoN2Dq+YRl+@D+R^m!Swo^D_Jtb0Wm6O= z*R}IYQuWq%_f<-+8)|N3`xHp)i)IcpHEUewfB*i!|NpI0S-bqle=hF)J7VJEU;p~9 z00I(LPj=eM!-mvh)i{Wh<=|!l#8SXeRb7ifEZ!>tHyRay(NLMzlqx0?AZSVq2uzqO zr_mx`5)_>Sx}=G@Yh^)L>ANR7Mo=t3(h+qcr3#u%P;O*^8DgY}MQ03c(v$A&`$9LP9ha zVgpYE0KLS-N7<+movZ)*utX351twb8zF~4#yK8F>N)RPD)I%h$!x%xPjH&|= zR3;Fs0L&Au>=6X8AqE@d0Xt%$a(^^KWtwPMRmNnJ4O(7CXL)q{43TZ7%E@I)&8bGE zbV#gR{X!z57f;?tt!Ble-xQ>*N#~Ah)pV@R=^d)h5o;GPU*;TV*|gQgC%g*Jt>aqW zf4|m#w{MK*Vy+bef`F{DKmX_eDLXaaJumDQGByOy;!Xo&VD03h^uH*6?CQd`Nefw5 zGqw={PzLp;g={EFi6toE3uI)fv|Yr?D7KIzO#vebNx7{BlTwW{3Wt#kQ4}(0o1PO= zusF5Vvei>Fg-YeLo}g8l)M#MKbG2uhp(n{nrmF9^BoUnThqbhorLfjlZZcag3s!oJ zDiefrvzI7(%deO3{n`KjRFy5?^y>*m6=KLM;>ah3>ZHdF0x_DGwYDJ(6TA zSmWL}D`^%&+cV*QHSSfV$(9Lg3@7xF07!ojAUsk0R$*((l{Z`%sGo&mJ~o%)P;`-_XDh`YA(b%I^{_a zoVrmXLNXjCDYFjln;)6i4Lzs;F9858+qbh6ji5h;%0wkGEH zA8))}B4zAOQCi7ar`FBpN_k72*==Z_pFBs3wr`D$-m?t#O?UMN^_uyaw)u|zwAN53 zCf{^90E$Qsvq2VcSmp)Ax)Wu z8QBofKrsPms@srK&w^F~hF*zFYq3+Um^6=E6ZFO>atv}|X}Cg#A7N!PU0CXeF(Ym? zOq{-?av}lck z4sDk=A*if%V%6CRP*rxe%TarSMN8WKxzZN# zaa2zfx?5ML`03cRLtoRnJo0JsNCAglnsh5Qz7@%}ZBk##zC+{Z)_)u8Ll_k|sf+0wZ(;_NHS#+9*A_}IWENLi|I7WuwT!g2Rq8pe0XAfgw;}DEu z3mj*vy^eYb4tP3n7Q)p40HO&b?%Qt;FK3B-D*{!?TZ@Py6S}Ys(Sk}SV$p8e)vFcd zx(D6ThzeXe!Rk?BcLFqVT}Jg7fEksUd95~sJ}bpiK5(mgdDHLf8%-4m8Ibq@h34+; zMq9+HyE(?ETm;75)leHqs_<2a|NEe1Hh=^yUD4|X9Qu7Msy#g;ZBOx|MMtD>Vi_#x z^@NSRCcO!>v%a#=4thr+ooX}g8wfAmBI@?P5&#ae04hm#@aVfR-Y6GzOAC205%t*T zIl-}!QZdmBWki#C3y`}eGbHb@r$D>9TM(r|g*Iud!H$Sw?ivBn&p4!QG6cXzh3@8c zd=Z#&1WK!^W>%L+9W6Q$g%g=Nm5gB}&E|c&l;lIrr=^5n&X%OUW{zn8&TJT$T!;Ya z0T%7I5{ML9qpc#0`D;j#0qB4TfC)}*w;Ho6Y$a8)weavh&WkmD-HFB_A0}K( zP?fe&32f22G+|QAsZT=Z)RdM!loP0dRom9O%VMXqW8?HIp2+v-d^$gmR&N&>h%-ix}u5RiQLqpDyi~;lH3>(%e z005#b6z%)|t3J;0b-_GcGbu~K@`zF=Q|mc-N=}g(WO0bak~6}V?r&o|Pw-6A0MMug z6pAXQV2QaMLV>ALc0^x0yGllTnMVKn&_pEw1gmJ#?L8m}n#@`%r=$U3#u=|!s(r)n zGc2n$mXI{M^@!mL^P^YUPF_)EiDNAJTMb^*D=UaL)N9fO+Kx&ztf7j^WU9>6VYi;D zG1@%;xAIpsx5w0DS&GJ43XCO^^}aFnRZ_T1>mUFDGUea?zFL=YIT65)b4W$NIT7=r z+1R*>qEVee03nm>=#21ba)A;IS|Z(R$AlM`pW;_cM# zq>>hkPZLf|OSzVuO%jml}tS-veft(x#d7Itt^Ym6Dz%omTO50tJH zW^=p7=MN~cD~lIuRQ=RCQMu~SgyQ+$5aG-KfB_0PXlh05&CiFcl)4i)&CQdRbxPc+ z>;X-}8pa@3QgFtfG-1bCV5&pG6M!fzcA1okb25MfI|EQ)Hj@NQ5LqHX(ib2HPy--9 z$q~X;Ma;>xkESU=F~b8HhiC-`6XvK8^9C!E>o1qh!>AUFGoSzv)IFt|vm0ZklBNZl(;7CIlPA7gQLWKLHsCJiB_AQr62( zXtQ+}&zc*T0I-lGJV9{Pp{^Gg4FDG4F`&aD1@Hg@vbe3`;kgM_mf9E4{ zS^97iVDStf07c0n(mJ$Nr{`?Viw0;IX_lzRkdtBb7pLvt!u>sQt--4p1ceGfqbSIK zI2R~-*K@B=_i62dfF4l9Qa2AEG_3r4+x*`C>~5aiU%i*x!3Gy9OD!hoU&mooBl&B5 z{5kvn?>^hlvi$Wg%FQGM)15|%VW&C}8VR-k|N8&`{r|-|+%wh`c0PWkj42T{Qmmr! ziyp%mIc1iM?2b*lgC}6>|NsBtHID#R!QA0DCV0gagaa~_aMF@QLjDvdD@NA7>l7dZ zsyPHKLX5l6my*DMyg?7pnmkUSB@tq1@c;YZL>rFh8+KF=W#9ttO^T81-~b-w;Ytj> zH;e|nsez}bDet1`;PsNy6l5n^>P`{FmsF}1==4g$suGeRZ8jU!z2d$SeNwJp zfU8uiR?%^j>ifAaVz56%p-Prz+sOJ;GNGNTDMt!Ihcs5^cTpJPDw9#AjXN@xJf(R* z)I7yIi5)i)Oz-Ssvd(x3`T9!~^BQBOh^R8WaTzci&X)LN&W1N#y zXN5_KrJS!?mRQEU`WaN$FJ=0NE#94xN^VQ+OX+1(6Y`nqnRQ$~F`sMY&%>GHZ$HY- zt2?hxUbc6tb9W_mW%P4(^-F)a^DbjaV(iu3SJhir=H{x?V`DniEpzR2JZ%F7BE}v* zmXt(*S>tzuSg^TDP_&kiG^SRqqf}f=piw9nLNZY(DO_O;GKrFyJLhd*jTit8cqRFH zm%^&T);(6$`JyqlDa!^r~z5}chioQEQa zupgx5OwzvC*o!Y{Hrp2!f?R_+Rb|x-PZDUTPdwEvZcZq~Y>HNeGHvAyF7d?%hrU#4 z4=<{e^3pBzjE6+A+T%1X*HM|1DaCSNlz=p7+>~+jD2bqSx#6UcqFl{6+ca*gGp^A2 z5>+Gb#TR+T+(7~<9mA$oG^?L&&Iw~SwWyt#MAR&@s>@?iiN86rz6@+AkkG_4gg~JK z2&^(!3>pHR1Pcc(1P^))(3DpmB91|aOnG3S0u*K)cnFgO1qwq@V6=%zxbo18Br$hW z={$ymAyRB3C1!1Y1YL)Egjx_~!9-h12*c?8F9uSK7fHcuJj$~PUZ+D5kc(-QUSklZ zR-_Xd(G5mjmKUA0WmK+9ACO?#R8+yKrxesiGb>dpR56xZCtO<1=QrlIl_;0$B?rn2$i)e-|U2vQ@^!60A& zknoUMC~B0Wd54Fhfo|4`FuFUj)mjY=Sfn84WQZdR1c)&LSQG(RTE&#IS!^{w0cxBK88Ys#IHW$8~^*jWG(>axnk3UZ%o3jO zHcJ37IxMju@X~@}QdZgYB3H~jf+05Jqu)<7JzTTc+NpfCgEgqPz? z-bj}+F{2E=iH?cI!G1 zyNrb-R`s#ITH$?=X|*+u$%(@Vq-jQ~`RWIN{%u4Fo23S=&PTHQpDh*5pE2dM2q$4g ziY~U}am&^Tqo}YbSpjg#V$>*Nw6OZUmt!rBg)Uf$pn(I323}e|^hp zNi!ii%)7aN^(u#kNZ4c=yrTsXG>3`O>^)r6p985A3kggAr&2+>h6^pN3DMJEaG zoU)kQXf-jbCruAoCuv-0+svUo0S6xflf*_5baf!0rOHYgZle>V_|vM*M2^8U7d1|X zmUZN`c3>onrjml3%SEEMmDtF*l(Eg7tvS$7>uyyoRhw_;-aB@$j@_F4=a=nI*`2AU ze`3JVA#D_($^Zd!%^k}P3X=*7tb~B4s?3Sz9} z02{TLc6p2>gFmw_w=sf{5}DMltd8sJrt8^z`#lWqQBPNK8*#f-n8a!8(oxdx)p|_i z)Y6=%?%20p{N0V)<@x)TyMH=7dENI`{?2!Ev%i?NPiDlHlACmMHm`1Xx9W1`d)&wF zXZG{XwLN;7R?kPyZC3?T(QpzDMj0G+?r~do|`+GvAxvRu$}pS=>$Yt zU?iK3J-j52WgbFl$iGJe|DCabk(7|5jsd}maSi##^&Yr>GxLmEo)c0`9Sot_~Y*; zf99%Vjy0=&tn5)^V$8*A*yEo#)2~V(M}7{cj#J8Lxx065)wO2{%(dNRJ6kLE<+c0T zncvGBHsa2#yN>($^A~4m=xE}f|Ns7cS(ktS00IO95ecN!s(C*wH5hW*>8MJ*z<&sg zgU%Y+QY^(MQou1~ylqzs?I{X#2NmI9%SEoh5Hi$-KnkI4)_1eLOAJV%`F5zOrn0vw zuP(EUrrj-#+?}m=@U>UGoaZgxp2s|OIo{Xp+FI84oqIIZr98(Q7HZIQE4=L0J?`Dr z+J0q8-0$kvb#kZXvbko)dZo*CY<*7E`q)fHu*%l%RliNj^!9gdhnH?)MTV~O%_jFX zz2DZY+{eEUQ$%UED9**1s~>w;|Nm$I!z=|9(~VO-yaEUR``|21|lHt8Q&lxpRyY5tcRS7~Nx zSZfM;-j_pFX{T-LP%r1oTQb#$g}aS?%B82Lmv&cX#WglM=Qn2_^GXc7WlIdvTEqab z>XZ3W|MNUGpVG^BcCXjFQmxkk70ZaEQ>?oPLaUS!&4H{+=q_Eo%Cd`;|2a>FR5F`8 z<~j57!}7u4i%m$K>L;CdGMBwwJF^e7cmMzY@PLtFhkyV805WAJoJpr7#%jpa;-L5d zlCr~tE%AC%rZk%Z;=@byzyye~z(GnwaX}NQCsK*WYfiI5v+bQrO)Z$7uifi8u3EoR-5uDb6SCTRT3TyZ zT)j_AJDtm0vyVUf^?qH37+SlQtaA-v&Eu9F-aE(ceQj?X@UNWjH;2@_Nl!VxMr-bu zEWdx3<4ac$ua#|G)ogwIfFJiF3YEhWr;bS;o0VE;|NsBx&;bdT5{g-PBn0DeR=5PU z9T9*O5FBxy2!UqgZXBIp(SacxYYh}8*90=@eu;#u4kA=HtNC^|1=!%UhEEM%Yi@(K z@Vy!K^^ERfx8l1VjZQY%}t2(h-_Br!7)dRH`k4fTlPz)Vb zQz(69AOHXUcmM%N$mD6cW!MT)GVB#y88WGm)1(fBB$4IlCOqUI0AY3ukP>*oEXB_p z8fK;85n0R60!^~F-6EG;faKlfB%U0xS!vd(yHhfGL^(HdJsiC$nUv*AFR3vZxk~#* zEycMrD2T(gB{)ee#Ovp3p0-t~=jkj%RcJ5Pmsh*H+4kn_;f7Xz_i+5O?O&^fE;wO5 zD*E&|)7jO_mF-dg+udyGrf{aOV=dEXHQ4v(NuMs?&wT&xSEZTSox)ezmaX5;-HDo6 zP3joU1m3P{T~8{t|NsB(t#tqZKxH=Un{W1Mja|?!q7u~6J`fC@A#p?kjEpqF!YP(X zmMCLJsKZkhU>yQMF^v^zpjMvSN!U99rh(ZbyFXG7qJ}0p0lO12==^${Iz3~bv>9Ap zFUxl5t>5K6T)V&f6tg*6o0*uaUkaavPH#Vza^0)A%+lvMX6_gN`@lp#fCe95Ts~(B zAi*medd*=bS}8wpd960f8?Ei@HKf=r+`XUkcz63rDwTJ(ug-GS>UmWZZfcV%vW?IE zP3Lw3PRcu~ncS^sRkeRCHI`qz|5;gD=U4y$00RySO{-QN zo$h&B#~gclzOCy%V}<_Vdw@VwN#V08SrE<4B~R;1^Gy$U>K}15YSK(pd_RYJ|F-D4kTbWV9+wz zGh$$jbuksSI@D3DNYjN`T*f60Hq-PDCK3jZ6O~Hl*bJ4NwhlF^6*`f2=e6sE_{#^T%ytAvBZkny# z*Y0&KYW+^d^}Map{c+KgW6inN+?JRB=NW)jfB*m>!j+5eXFQc4zyX5{4uI~4RS+N= z2engjAn-~yX#mUCL1)Sko6}=njmaRW2DUaJ47_N#V zapalK8Y zrI_ts`&i+RaQk=np6O@q=ayG#Gq>9sz1~rCEbZ3H=VNZ07~Q#*q8i#s zkfVk1o@D2qvDh*ZP)H~kN;;r~IvK4LWrKzX1wb(X3?Q`9CJvuN#lb<5bxYM_LqnpN zBvXXDsbec?xXm-Di-(Pw9KORvVX4y^cBUgzn%P~eJ1dpaQq5Fp(9~VooS2y1N^7&0 z;mywDgzQ>o&FWiqDemhUPS^cR;XRb2Kh|2Sj`9Bg=a=VF-Rs-CYPCKZ<@=R`g@~W7 z&U9s@+4}GQ|Nrz9Ty4oCY?5M@gk&&~jF|BoAsN7}AR}{-81LK#P%>^z0z-!2=LMI(vz8mi zRc_v_-nmJI-^W>7yOtI5%B{ThUzP7;%J_Hh>pbjtI-R}OqjL{HNz|l~NB{qN{1Dwk_ld|=~*OfjV0Ns30*SCwf;!( zi{+cw70UbpO*tvT9+k_h&p(lTDdp1mVjiWbjl8e!%(jM?8x!@UxLdDx3i9dA%4^yC zm+xb1_e(`hoqYLw3mVHTE8NQsbG7%)U2p_6;0gv>3Qjrg|M~y`001dRHFG_d!b4)D z(~S&5XTl1I5(Z#NnTm!K>2J&S95BbKJ0yY1K|zZq7;HI7AR_|zkfKx+7*(SskJN&t zRh2812E#4O3HwkB`w!s##qCL*2Z{H+OHEcYV)hIXaY>$do1+2c62D@WlQ{*t8uRjs zT6>hU7Odgit7@Lz`**1@x68IH=YFl+sd=n9%s-LqAKhw?ecpLtmRM(wJNsE@`{wh< zUygONy?FT&gO-Vqa-oejw0(yr!Zm2yKi_L305Gsp;78jikZ7z1G|)H|Y5)7cL<@if z^*~sjX9*&-Y3p~*VYU*9gGl`JfGTq`=_|0n1t=lH2_ObU2q~c`2@`a%5{fW1L`@nC z;NZWFY9zy3r2Gj(URx=2U>q(xumuc4ozqelDYt|jD8p1$Z2lX9-%6IUy?!X~KGtP& zxKrH~zfV7FxzoQ|rIg4itm9?$otVE%2>SCq<<3Oq^1A%X8r#O^U6tqfW1i`&=-365 z)wz}XQHX~l&;SHkZAkQy#1VxyYQmUGq5&?tgTG-x20$T@MkMf%uwbJi1O&9ZLJ}Zh zNy;3eL8A%)h?=`*-9~E;*oP{~;*)t!KC;;)T1hLMv46I+>~ZV4B7v#!wMm>c168Se z2*jR#&G_`qi3P0gPFR#-k1k23DD^WEvyHvq>_-Y3e6CBW<8esU>Iusl-(_}wS4+)R z?TgyOxK!@B|A#-F$9VJqm3x0Iu&KN)25oa}XZx0vZU87LHQ$zE3|WarZy}0UGki9bWAe4 zcC9gxPTr*UO#5#=u*7n!!l92DgClZ#Nq_(bMYkp0k(C6Z}4;EtF2C*?1j;b^`6!o=n;h=UnbBg%DanQ%5^+@`_&PAnp$&lAKQQj~GXo96&(?(B#1ysZ|{Z|NEds zB?trkWzrew8~TeYnrb}AsZaf*Nk^D-q7^M^-1M1!F~y;{2*6uFBwWa{q_FyGY|ksGtA<=_xJ$rbO^JgLI^Zif=va zdcZrJ+U*I>Ox`rETb|05bBw@>dPN&K%Ub=zfwfYv_g$q42(x*lP%oD7Me=F8lug}= zHD1NZQEEV*&2W@D%`p4RJdu6-QC72Z@DWaW@7ZjAs9`Q;RHM?9x@=rB7guEzH#l^7Igoy>ZOK7C2@j7U=oPk|Y(F%WH?wK!j8*5F;hoWZi^_5G6X6 zcDy`?EMWnG9Og}|(4u6v%&sVsVFK&_J8ikmePLy-%a2{OoDd{$!bGY_&e~lv}8QOQ$DdJ64FB|p{yJwd8$m1>o@=y`^tqUk>=n4%5kO)Aaq>|qR zr2)XnLn$Z&Kt%MQA<|(Z+gMh}k@W8JG)cC)ua(9wzgmp*Fon5kD}rrJh!;gatU|S` zxGgxrE|Ql9tw~-&XW~Kh)j*l*B9=6qq|7W37JVgI$adE&9JDXPxN zNw@_fRT2ag65N;g;Px9jWf2;uP$t^1qdF$6<7k0vOG2|mRSs;2IEWt5QEo(4H{}{N z|NEds7l1>}Rnk%EKzfAidP+TpEl`D{M@OW~;t8~9jP#lmoSkk{JqVQ4=e(zUx$}#b zy0ykOQ8@!foNLs}BSB`w?70QpwHlVy7Kb%Svw6xflwkE@yPcmy=UxsQ!gh3HkwZqYTp*5 zc2Og4q%VC`Cos()*W7J7K0DomZ88rzy7=!~R#s`*+@8E02bW0@sLeOo1&$Q z8JYk4utW#|1PEKv(djdKfvlP{Jj1Dl==SB6=Vc1Cx~T5M%4JQ4`!vTxpw445noP2;5N?xqt^Ya`ONL#xBaG-o zk%}tF8#QwuF$|2~Nyc8am}+}TxaY(%jqx>oBmSc^uJf$Z-cqgvlzQK8OX{Ei6y4lc zkOgIT8Mh|$dt4^bX=+sH^~yse3DTug8m!oGnZ;EZnrV*K3CXhq(N2{f?GaLI{MKyD zV(iYXveSO>U-zYKE;}5eLkVS98v*3tvM|&@`6lj@5_b_;ggYr68$V? z&N`FfMlAzlX&h5S_;kFYzz9(9I0!HSCgi_{gfnZ_3~Dyb3L+)SD}{@~kBMl~7k-Ci zJSUVLZq#nHsY4Ytp-}p!O62bN4_s`39>YuD|7rb+NK_nq!ad#Iwh~OuE$N}XTP9_t zO)vJ;-+h^wZCiFn44)H-;!ez4hTPVWqHr!uk-HTM+- znKsWSWV^?tyhD6FWy8U_lYPsNmfykG@#Noy>w2idvklpHA)kVmP=+IiPeM_N=Jsjn z;jG6il?oLAf6^)=2_pZ)Er0|RotN^s$h!lYw@w&4p-kQdFsj0tVK(Sd@a{YXTy#>qeP&&E*>{&gC(sdfQ`OG+o8k+HS(-L z{mg`<|NEdsE&xN;ThY;m9C(J!8ah0~zYqOuM@OW`>H{$7^z#mVIGU3L3gVm^iGqa3 zTD&uNRnKEv(;MJ@#f5SSK`Plg#xS`-c zNp5Yw6;5et#eW{#Bs4Y?Ni|6nXz*6kAZjI{8$uiDwHmgg@*E1&f~n~*PAMHSl}D?a zC)}6z$Tqc^JA_FRCWboS9?~Rp7Ji9!L-lSzJs&==1Sz&rcD8q?`uDo>*Am9w2G|^p#U)8p9phf3T??DdJs7%DRZX{_xBz7Hp%GI>aO7#*f>AL0v z?d`&Fg^P8$oVTxHeJ2*7-?qBa1mf&aTeokIWnphO>p6X0A?>4_V9gp8^^Jj1_F<&#B6q`~SBGic=Y7(Bue(tXJV%&j-D zP=Lg)8X8s}prdfn1jAy&5sQQPmM@P#yW3naf(OfG26=l*Z{XBygVdWcSMSjz-tvBkn)7|%VRi^ z$jdVzl0}8Qv#Bd|^(Q+OlaXkq6YP-0YIm&v`8{aOoY~T}pPQ+4ouBklc`e_*t@cz~ zOI%YZsLH3GS%a3h!)-L{*`s4L7hoSeK6L)&A~n#{h9#yyR5?nrWZ z6+Yko+1q=~k=SJ6-S_O?^si@XU8bG43-eVD$jAVaq`Q7PS;lPJ!;BVK$@J6{?nauZ zsH%3X^kJSI|NF2+5P(DmXwm8B9e9B&S~@Vpy-_)%MWz^Y;t;c_^@NT+VP3@5rdR(E z#_okd$n7+?ns}=@2eVobAm?YB)A!bO3Hhyt>)dDTOk1^7xf0`Qn%lPekC{H5vCsC> z$G&BW#RmYx7+O23@bs!cD7qzn*+w2UN{vf4C(2v8+GpkzbN~Pga_!9%ktq7Zy+T@C zpsajDQn>dWQU@MTnQzYi#JgY8@gmbby%+}xme7Q(@|eQVbkFBx*>8tMm2DSH^;M}; z9POJ;oI#I8j0&0@`#EQkj70}#UFlJ{f3`PsR-{!N)kjroW=dMD<`)UV<_;kr+q!o7c{Ix5B%(``*u-f` zrDc%H$kInCh+dP-CnVzxOhV7@hSIyCMeY(HvsuvgS&5Yt00NG?ct&1G z4pEIHdUCdQxdFu}Cub;dk#(n_Mk##WpF+vy&cnujXs+PjjzzJz)QDP1mZU#UJs5SF zt(!^Y9O&4yQIp`xu!Goy;jUz}s#J4W4{|=O$zzbvaTJ=78_LQ|W`WU{b9S)FwUD=O z0c0bl6($1QC6d+|m5j+8oMx>GG5`SpoY(F$7zK7}QbJ#=HcoE}w;8MTJd{cn$6k#_ zB3w;moRnqqt}Q0LmBJC2?X6oLk!#F9dq2Y5fgq)!*)jyvUwy30^;&bXTj{etnHasX zJET8THYNYOu5ADNphPc#1LIxM>4qJ8g{>MbF(!o%Rd+|G7;)+zv}m;S4t$$2nF$a| zyXO|kT=vQt5|<@rJShn$3E;gI2&__}MnC`n0#aSU&@cn+>H{?sWs}0V>Rx^=R!peD zfGrWZ_m)RM-$0>VghMW-fpWDQPwsQ?AB%`B`lYfrh}wU@$CGg=l@_C&X|Y~?^r_Nw zO5f1m@=mDh?86z0cXN4};HL|F#P3yg+di*0-)jw=WYKEg?TN5-1417 zkp;vE1QMj%ZkV7qyNw;MCRz)ek(;v--DP7k6FsBs!1bF~jHHim*WCCjqM+MF{+mdx zd6Q`;sFluoWRjBX^po47p^v`xvvGJ$s1=!jf>#$w1~kHgGziFQ(9)VQ-BsM05%3gl zxvpCvET8prEP1efovUqAqwt6*Q2+oS5}TKB^nDEHHDr~9tkP$fbfQ7Oy_xpP^*YmA zH8}FhaHIv)K(pS0Z!AhR5Y;kJyGFICQ{O!6P~z=_nkzKH$k1sttE;Mg)Q&;Mm?FBm zyK@cCf(;CIqT$2^CTG?RZE4^j0o+rnzkcGaB_#0xj-dsIfU-0+5aH?5sY%V?I>x}& z3L?k^lw6kXNF6}bE2Bb)HL)l*6IAy$(HzGXXyPhr&>KQX>1!?{DUdhHSCc=Pg~*j@ zYrL}PVpaHRhHb zNsP5)$mOrLdLNZ@$bu%UfDk3OZu}b{01?b**$F#JuNPe*6a4p}cp)pEFFdSO=P4V_ zbI!MKx50CjMW6N-d`xOhnq!-}58Sw&s@z=6n*;hftmvNi`!Qt`_k)=Bo|M)jvzboE zOTE`F|DMp!#rKFYa*MON7IdY)D`WX*9i+ix8H_XSMaV7!gQnB>wKCQ0Um#wwE#9;?xY~%avA# zC2{n3G0NSn6iTO|2}8DW#VZ-mNj}1X>8$iRPGccaB^0M&xLfFV&54ZW6rrLRQsUTU zvsh#(?yR87kO2U>cHD3>GDWtr<=Z4^uIdoK5n2_&^Qvy9+=H_32IUqx80L#`p3YOq zc#fu;U~ZJiYb#7RtqNKXk4!wJtiFy&7(uK#DF4DoQb(Wh0f4&t@oVA5zSz9hPvRA#+nBB2O;x7*Zer0D|4R@;UKa0%|ZoaRCxU zs5rWUl@&-U&?faxcymD1OF+wMFvasyCPcHYn>m!-1h=7D_p*b zscUb@HOyp!@>{kgN_^bfE@@onUhH|sBenNWKO$qkGsJ%VzwhgAuQjFfab@cud^TGi z?C-amKN~Oh#{*HIQy_%p+kAupisPk{9K5OI)GUkIGoxOxEX^5qD@q&b>q$})V~?jU zT|_lP>LWth$fAK;id8C~T_%)z2@@YH73(7b0zFx%Np*c}_m^~Ou~K%mIeEwAC8*P# zWEN&+si?wuzJID;T5{<8F;1p)-A?}M<+-8- zkP32JmxeQ&WC&`b**KmUNCl+{+a%=KFnzNGi5$%_j~Vn@MQ~k7EFT*An=o?Jp^W*x z)}mqtb-lo)Wxo6kK(#OLce6sIk^F17-hIhx({`KUkQgMMEJpTC>t1*sTg9)&86d*6 z8S!1yIJ6lhhxcv4v-(};tsc@}as4R<7C+3C$F=nim9~GTX`4oD-Er+ad_~4!W9Huz zW7qCl0002R1Q29MBo77e@WZV-bH@pnYdpuFm;%sim8`>zfRCkd2!vQ0J^~P05CyCp z2pLirczuDrgB7mMEPwz2|NG!XAOHwdgIZQty1RfW_P$BUOp$3Q#_zG|h?*dO5fS5q%5rQ&53n*!fFl<v6w&l2p>l=8ejebm1SAhoo*42T9Dt5TJV?Y5 z{y~7pgAjR`yAk;Z6k-rR0J)Im1;Rvs;%x@olH_<_@dufvLBupJ04z*dAt1nHfe9#F zIN1N>fth^1O_j%3d}AgdIAn3q7l`5(aG^H>xwijH%DNZ^K*OZ!jdFvRZ}}H-ZiNrDchJO-WjQP zu;pWb{pRTL>T?iaD<@%!uVjsgINToc6Ro*7uH(FSs8o+0JLO(nU*07kHA1vqL1(3G z=K5%pwX3l}|PBt?TbM-RX*Faq;b(-#dfl;ouE$ z#t*1!#Lsk^)V*KBP$R;a&FlQ!9Vs!ibFPD0i?ZyKRm^oV6Z93~A9ZeFW=ycDR+R1T z+M#8+iTbVt7)zGv*>J9IT*+1|(($(*K4gCj7uzqLcIx@d>$Tafx&+WO3L{=3H^RHv z^{d#C;ru{sc>e3s+A5u?t<8RTQKfRz$Zk?Gxnb>@aWqBTcZx@nwO8r;YX&tD{ovXp zmG2uIVcFzqqE)T*HAH6i=81eb`@CORZSk`W_Nh$fo7cwuHH~UMUMtC3Lxf2Vxv#S5 z>}fcdcraCDO=h7^LE_p_GNOtdZAobH$XhhYG=ojF?{+8s`roRKR=+it5^=AEDBXNYafg z1FnI|E(ssuO!U=!_mauWs!DXMnbu`zM7Bchy)+B8#@&6cF7k1(Q;lXS{|k%m*zPj*(G0HHu$ zzviZyMKa8CM;gqLigrF0wn3ln$aIl(?y0-$6|8qq;b?V+?l-MJ^&uGo_NDxO%WDFBUZJlX}WcU9f=SaCdgBkP?0Hw6-k_a z!I=G9$S045cr69&=Po_H)8<@FLC72P->7zlO6GG6a&T1Rb`11?HCW`Mp5^EIN=W=7 z$(sA8Qzw%pM`8p}gXI@i9j3!&S}DZ0tiCMnt)!gM9VioDX1e!KQ)TdlVnZj(DabW-oS_pvKFgZ$ay;BA!<}9|ILc^E8uGTJoBcs-K);(qhyP`aCYxC*N zPiXet9g@f=&I>%f(EoST;1hQB_pOb2Z4&Nk^O5;)W-&Y|+!O(OhNkB~USdMH!`Mj= z0Rrd01Y?+5H8+8r1x9DOg2&X0#A;&QNNgDIp$PosY_QD^Ml+TMg*~$psk{b;L?Ja! z{-0>7K?^D+2|{wIb*uIJWt)0v*nyLpQ2B}L+jIKUFlC{ReNIAtflNEbHs}$o)*j0i zz*MRQLS7SObLC0Iv7c&EZ#=ApJ07G_C(JJJvPSF_57%BI*J-jJy;|F0bm-L#AtQSEv;UKW07Ty5V^&MFveUl zRIvEY&&25^gQjvK^)+kNx4Teu=G9t8XJFgu4FCJEL>q>618dc(i5}9HEDGo(%dS%) zqge!*nF?vOD`1l*sTGP*X6A7&>{WO9TuNl+`cO=lVYQH?3o$Atl5Alo2>000DpB%pBe@ zMCW>$Pd;%^vaB<-YGw!O|7*EMprf!o+YSGpU9_6s+4Ju88|}B-pn{EjR}xJ@+JD+{ zU9@x0Rgi@&sW~bh@*-VPHc_lXnQ+LFV_0>wZW9)y0Mv*&VPw)d+$@@zDohKVc48@# z@>rOI1ku>d0?;WEIA2Wg_{H8AI?{VGkNgl_GkZ77X1mXmMwB9i z138t2>LjGBf?_HnW=M@H)pb(lk>Rr;}q-TST!=;_LY68 z072$SO&3`N!T=C!B%B**fmwBpjR=I{gn0{1!qry)`>;d}fCTJ#R^cl)!jkP8{3OYq zQr)dtXQa)FOSNn8WE+?`oTsZN1fdo6{t2MPnnHDTTtbRkmP)z3%v-uWQs+Zh+ul_( zdQGUe>b+Lgo@`x9rc+IYhph5-Ef*->_C1VYix~4H+ht`&D^euM;~ZLsi=f+}duiYr z7qxNs4K6a5Xdi@AH*-11H-e)w_L9q{vQE#g|25-3?Aw)$|F-tWPGdAk015(uO4}R@ zxLk2qKG!b6wHjipO(zKjwQ3%yjkBgVXvNbd%7Tx*n8@!)p`3-`M%26RE$_2xu=vDx z!@6bWdiS06_&XJv`tV!~G?&|qQid*J`xcd58c&35-10C+!ZqwGRK8p>b30OM<*#kJ znw?x_$97G^ORAwJWlE*6PBLnv24#0`^1tis{QNrd5xJru06|GL;#%>KUaJxm+Lh8^ zO(e)WZRzq8Bne*Suu84 z2KgU$zct=_zou{MAD#cDgq2w3lzTm(+8yH@Ne}=400eTAAee#)kT{UqNL-&mc_us+(BaV5*9hcPdx+3HHWC)}clz@s8qSz_Z9JX_q1onZbhIZ}uGNUUjcP?_N@ zl&uE@XRO4?pt!-b^yjWg2qGwaARKHVc#!)!^H+t==d;WByC+4l+-~{FL(x2F z|8nU8K7P%~aJW8L-s*Y9S4tO@C(s>`)dAk*3*aUd5Y?MEFhE?vM1OU?u zK8q5rkWmJ(u?vzUwG&{T%CaaisO=PmscbtGa5f==>ne|a*nreolPLNmWaV7yxFNJG z`wyXv`zI=O4OzOXn-F=Lp7R=O-GGKt$sFflN1k3ER z&E=saPN>|dfU?pfALz1erxl5_%~N6L2z{hd3{$5?iM_RllW2sqiT5j^`jQgrmvgvRoX7UIrX!{ly!qCFa0Q2ystq`AGL?j%Eu@ExP-ppRleEI z_fm1IS}X7@VRMdwQ?lM)T1`Lx?C@k(W6QHY+`O;5OZoA(pS4y>oYi$M#83bLI*3h! zcG4q2+DcN1Mo8x7VKP_A6{qDVPFR^4wDxJjC84|! zN{-e}gY7Z*+ZEwZqSQs|D77Z7WFj1k0r+dJF!56J z^y9ybmScIfRn(F8(9yiC+snMp``R(zXC^k5#iRqE0g}YkaS?3Cy0qCnD@SOV5n(8x zLzJnMDKx6>IO7b_3Q>4?gCze`JjEe)qvAsZxXu4mPZ-S@+3(@?twrEE(Ag-ea-A4O zD~I1H%g?4Cyf6;b*}F*TStx_3L?K!!j-qX|H8tf_pnHuTF(pxT%t?4My-ja7S;;fE zbd8v=nJU#1dFBwWYFR5z_d5ZKyhK^(yXF+!(UMsr0N@F7Q4qi$F=&^j?GX@RtD1tQ zT*B-&MyAxtGK) zBEIX9F^(>+ZuYH5SWxRqJl^JURm+%R>+-&OYMzQRFxSMvbjCclhil-AKR;TxmvoWK z*n(@N{V>BdfMf=tYw99FrRIt%NQ{>{4HK}IAgJSQ5u=>Zx)4hv1>gOv@rL%JyQ*8- zmT$G~MlaX(w7sn^U&=nIG&BEcrSHzky>3dt z_Z`A1&jG?oGxj`|{!-1B6#GW z`q@mxl}0K;CEX>Cnx0jy{(t621!BBW8gu7ckbJLWk=vI-yj|L{9SnS#KVN^E%KQ7G zNfJQ`*yL_%u0V~Xro8dU5v6vcL(^Ili?i&0DeB=-iYG(u(FpzGSZh>9$AJne(wLdd z3fT{mg=vN{M%7Wx6YpP^x|wf>nz^l9*&0M*Vf!a?#foh)#m(O+m=JpUkNj&L`|WQ{ zt?Ql(GVfK{^M0E+Wtl}KVq4T@`JT;G!iHN0D7OB6lKkr+0ssLr7i^maaYxNG0a#13 zq%_jYlaO5EljRkwQavWUtfboLra$mR-g@T8*DIht#Sq+?LS|gWgSie0Lbi?1F<+~+ zr0L0T@wfW4j+0iIO42&s1hl9zrRH;4KPp7pMTciGe!uGIJKO?9S5ki z3xbkWUMkY*$&yD=6?(;LUt?gpw`Yp#GNDH1XWFj!^>8+b`VmnVStx)pUNFDP{3%4L z6)NGGaTWYXl+$x`71|LKdb{6{?*2N%Hh|@cNqzs_DWjad6*S&p=*y}%5Et$qe z>DE|T=rq2uxC!y)>XRs)y2iU-^s8p9MyedyTCZ^x+Nw)7VY);gFwzxPD8u0$q$deAV7{j&u5v)>mUFCJ2*2tY&iyxjB+?`-L-eoQ?4}d zkjpXGzHG`B%13O{kCj&HWAn#Pd0_I@U_vgM>0CheqHHhDyyZ5-ZU+pq-=Cw-hz>{l&Ubb=EE6b78Z8%qQa+$Uu3KdaM>-Ruqz zeeu#t5bm3Yr~3!$BL7)Ij}K-c66xy6vIJ8R?{N4aWE0cE$25bVr=R(l-UFO$ex&#DJVewh1DuNc?0QdVj+EK*ml-GHo#gG@<-mxy|VInInc=$}ir znzx9dFFB@fV?9;6!vAF`uTo*(6;9SixO7f|NcLkj7(hqFW96ZQ?dGqmwwp*7cs?6g z^6F1mep2!>jkJm&g;_Zv>S)|rngm(bZla3mdEVF5E`Ozb7@pR**!UYBf!5f`KxhGt z<1L&>L_Q1Udkyx(1ZNyzyY17vy_)2g97-{!qf5-x>U4WvmAG+5(45M5a!Ob8)zUQi zK@?F|G*>j|c`qwl{=iLoRncl?UE4|Qj7b}}AfeX!iwu#nm^|M1mqgqD`>(#3@|O*&%snPXQ$>+kh8Zo&S~)80!w)$PGNjjughZ=>GfkKmL6AQwx=cw6RD`=a z_!XNXg)#R$$X&}+|M&+lIp=q2@AKrXmzMg-009UJJ`&-DJ1D429R_()jvzuoLdVk! zrWb<22!M9C4GJO{G7?$`8si}};D$7&B+(&|qlto9RvoISfI=AUdd{>cxH{_YBP$&W zZTIJUxovTteq&SiZEc!+H$H2(h%op6#=ZM4nIy89r(H%`zrOADtZD9cV+bkr&?iP5BS@9&ps zE;N~@hO+(6f2h-;4vO@JcUjf^1erdqOFw~ykonWdWvSfmrp4~|8tOZnwDzSn+ZkK5 zC5YILh!zgcG5egSOArJ1g$GQYj^a+Y`9?Xy_V z9kZsDwreKcc-66`OWfROjX}B2QXAK36ts66O`lsW7m((GWtsaWI7K=CKg#?5-ZK-c zmz^?DUSLaal&fzZ+IFlT zI#8sKq)NA14=`D+W}Ft1UP#R?v!r!Xk%nB%Y<$T#xm6WDN_9S8G|PYGL;w4*L@EFT z)N@qXCQR^{49d79$(~W|kxhmfH^MhEYH-Au_#~JL`;1mmc8dZ*K4t7Q;a4Ix%pN~C zSB#FNm10esXCpLkN^K&VqY#2psKus?vzVQECtC~M$$Z<}&n&O=-Dl~<70}r~>JUNz zZI@J6S>z>oQW_#5dJRP}116JUjOQLm=G3DPD#Tc{3<-y;IKQn40KoiVW)?Co8_*tLc`8>uiDwy&ww? zQ8LvO#qKD6nP+WUUSDUaG_9kwwAG!;^o)P!J8a<~UBpEYu5DvMeT$+6CuO5su-nMv zeIk9%xn?BVdQR$Zx|GgbMLESxL}u(sjkPkzH5M7p`B(l~XuE=pg5-|8mc`~O)hiYn zNQe;>k(oYPDaEW&^ILoA8%i5e9t{;Lb-*mK4^z;cZ8QnmqyYJsAw=TWWYQ?BM6E_w z39yP+k=0qohETZt{OKo0Fom9v%25Y83LvxIWCDyhIE+!Y3LCh;h{J4u%2;slHoBovwhin8<@GPLb3 znKj~L;3CJ4tV+4zif(qurAVk`L{mi+ZIFR_$Xr9B0|E$c3U#W{bSOapl{xTLET?3i zrJr^IljNd}>)oy5652A?1bViayvz+&;TQVIow+pb(|;N%F4eHxjfNuDMFB7W`=CTA z00cE<()sBzpok2bTqOpaPgRdegpC!c`?6_h^B{5OD_iDjc*WnGW~#SDC;$8BVyhc> zCDHRz^7&iKB`0%HB)UNyW6PBnL|wHUJtdM~X#l5Cb;JQHUQ|SrM#48W0Iu>`8|z8^ zx|z7vu7ib~_3LJ6EZAyelC45yVPO~^QLbfW3mw>~fNvG1KepQDmz(}}xoSr*KNW{; z#pUJ|JCO9ZV(TVCO(urM-1&u67)K4@NxT#gG zAYrMxRoEus+xfhxEhi(E{eY8stxd^7sh1))sVP83FC+AcW@9Ch6FBU4K_SWvQn@HD z0g65a8Z;To^FY8#M_c4?W0+F4Nf@?JXPOWr8Zk3NB2-%1N#a4(VzKm(8Le?J{IN$5 z6?)tMzbADS^MjQhFk3<7oe-)ug_#JDZX`t@DH5oh^EAy5IYM|CF~p)3irU6Itl)^X#2~k^B0eV^SK>%zVfi*p%w4j%xRRd_bU(J7)G5*pj_;5QJMgRMt zL>GVq`d!fBX)tPj%sOo(rU6jZe@W+=5$YH;X|$6fJRJS)%$6E)r=e-{F!rcVg=z?? zwBuDeQ)J0~ud}u3^>s<>=WM)#wbN%`Nk;h~+bhU+lg#hug>t=fM$(xf9M^YMXmuhB z7+FN0zB13(yb_g=Q;s&@T7bMTT|8@tY2lCRW-)!ql~nsS+vNLk09@@?B=F-W-gqpKkOCX zf2w`2;q&HyxjpA&CBWdaQb;gKXlZETWGh*7R|(6f1DlsqG)p9rCy-c2X_R1`>cshI zTT2jSHp6yCn*cp;G zq2_aSs$!!`ZvUD}*ju?WV;@DD)H;!^M_&fop!ptuRDsIH7h} zs>%wYfC^|m&&m*2+RBn8ByHfF39pf`N`(_@j1iFDnNh8mM1(>HB_u~V31!6cv$Q+* z#R~amB7ygs&HNvoJgFe^jh?ddg}RzvCo}8EY&O!-xMrMj_A*IpKA5zzyHVvg2D1CD zFE0%t(gsv@9BPbux@w4XiY!#agP{3ZRDC%rWQVT~tE7mqWM4EeWeL{WB&5?xOamJK z`>;d>00ahT&*_UY0DjCG9ASnFP=S|0rDdoz864jp_f)_nC^&)pv` z#p!VqK?RhN{Hr>pDq8ii_g443Af=YHiA59%giMUNW1cdSjOUWTF%idsl7a(^jJjfTnITuiL!mE-Flcc;pEFa+N~SSN5m&Pe32ac~jeAERM=wAtJITl zM9}7fAe2QD(E}_e78F4lV1d#!PD4IyURxRP^f8qe=<6(!5lu=?P~nJZm=d_MoYZ@< zVXGbR+NU=vU7a&D!_O~ssQR$+W~oNnr{6}_GB^jT${+CIt}{qd%-A0ipLUXtb1=6_y)fCMSlJU za;a@(^oK}~i{=&{Q3m3t1Puv7FxP=bF)MY;iZjWGdhdB1w?Dbw{~~_l?Is-ei2998X8hk?pzJFa|C(}ZFA6=(gIwuW z?sjZV6wJbj+b#x9PbGG0dY{7#O4DDgcIP_eX#|o;AWR#)JXD;^C5@_#KJ-nURU+-~ zW_g(~A6f|=M-xYNOv1wrwW5@EeTZg=t59=7z1WWf>KE_aqmF@e9x#O7Ek){QS5hy! ztvyyT3_2m!?aL(uNiiH}P?EAlG%0q-gd0R+thIC?)L#g~wtQ&D zV=i-FH@D7$C^S)RdE#d@&VkqdawpBc{?u1?&cWZ;<(yio9gB#9aoA~~i1uQ;d}00bRk&*AAa`hu)l96ZR6Q00q1hnW%L472ET^C110d~(U$(h&lzEtxyt z9YlwJW-Kt8vib9#bm353C|yaJRmgEaEdoy{-IyJfv`H=haoXpWQnT5HqlW1n$7dCp z?tW*NYcR??c2>``tlw&6tm=n;+pLVoGJZQ739VCn^XL5O2{fXgk!~hHN`-;JUdqK9 zj4p4Rys=kWfa85$nurb(8xD6gwSf-Vf?AtAPSX-%9K$(;b>kL?5xF6m{U4Q79(Lq4q@|0i*M!B-&YG=9vR z63q*g<5t(%l>&0k8j%!!I72_FnL)2~?B1f%fIrlajAROEq3o2!g;irau}irZpKfF)zOO%MLI1*bzLG&x%kLS{oj?BBo(e;ocdqkRvvfde-3E)v*|{iCcg6ivoW$9P0b{} zo$NI9%m4eJL@R(Kb7#=`=1qErOxhhi2Bi>CVK?upTMy0g1=eDGs+NLj5VreXi8Kv4Il$?qvR8&E0e5>4FtCj6CfjEMbMoL5z z4+e;jZv|Z}2h_>g_VSG_hc$!->Nct6VSgEQ6R^|A7re93zM8YxRWMa8WocU&X0XzT zQd#42b@#EEec%62o$ve9_q^xK`M->uZ+y=sQ$%7uS;e61R5ZcdMU)zE4f9ZLHaeX) zAzOJQiWESUF!*63T=HrvWhsKT+~-J})>@4w(gegN5Y&Y6>y#Pbw!wt*QL8}nR4r_Y zhmp6cwam)XGF#pW2_GlKd)YeA)6z+2Ok;uqPPZtx?D&CYugDR}ME^F0qMCqMnjWoD|R%7|n|;`SWAGUc#us%{9h5Sh|q8 zMAQ;c)2^V*s49h}C)OIq$DB5zZb>^4JF%HZiPrAnR>lPH-zz-PIH3M4d8{^s%Hyq| zZ)U5_p+x3t>D^-jS{5nfTufSG?Rqf$#WqoY=w+nSN>E>%>$V4K=gw0yHC?d{qlM{! zvIP}tx=Td=`_M!X00hWpP1QXh0;^3K{iZwt9(p5FxXF@3;zVlqA3{iwwkZxNKy4ay zz94BEE{a%g1nszuQ)Zso`6!*&M!LQcX_xHmQ2dh0Fv(a|OPrQM87(H4j50sNUk#aP zZ}-<)OGEY=ML0qbN61m#kYhT$nt_WiB#KH; zQ@F|~Q>Bx~2{?*T#M)%21Y25v44JlY!FCd(77WbUYH(~ga*TfENU+pwaNV*q;#hJy zO9pz;k|Mfiu-~C&BrGpZ!!{bGP~oY!J6LmSzI9u=%quIsAyso043S~Y4v}8#!>;Qz zTkh_A#BF*(`CMld-R{iGxgI;k;=-Tud>TWwHQxyl!!p#sY80RYGVzJpLQz_2K^nkPC5EWEZ%`7&y=21wYs5O`exh{YycDkQ2^nH5Cy^mLjd9l(1U^6z;Y0DfDUn%|NsC0|Ns9q9p%G9 z4sTg~H!dC^LI5Ea-DM!#w?^D@oZtk503hLvz{3UrVS{8F z1_wxPWbB%H49iivkSI}f9b^nYaK>W3EMnjT0t^6yhrR|J2#=0k6}wS%U7Ct$BAU}N zTRq*tIH92f51b5eAsmJ?3r`f7T-bra&&(lY%wUoiS=m?}h5!poJSzjR@Bk*x$&5YT zNy>Nr3x=p<5mvW6%Rm4>jq|m@WTA)Jtx!%B0LgO%!oD$ZN|W*yV}T~DAL0B@8Q!lU zMIqRvY@tGE!ciOy58oH{Bl2F@*n}F%7wnEog4j=0FE*ZYPp>Kzj#r*X%2jK0H+WJ} zfelnMLb{=bK3gV>xVP3GQtDQu%PVP-r_;=Ys8YCb)in$N{^cArLJtd882*Z=n2KmV(^ zAV2^DKv5ME35NrLV;{D*s1B?glS5*0RwUM3SUIh~@N$+z66fxabWRImo}$AUd{y|H zYjU}!l*;ePScC4^o`_#zdZ3m|?W`06`7%XTb~TjzB2_G{+-Ys{mkUz(rFm3pc1=k? zOBuZ$!sR`CmazFm)Wr;G`-5Y4vX5D*E}4{9V$tUEfMcPh(an=rXcEoBPrtvLX6 zcrjWr5lOC8OI)3$Kvf9%#sv?M)Uoc!HBxg^c+x1V?5d6S?WZf36R*mnaIsaW+P*P8 z6ZL4M-TPA}Ev_l8vSkj~>6hE{)@)~EA! ztkxZI2=)g6gkjl8wHAPyAJQ(ovhz<>EM+Y|MxvjNp#%35V>A7Zx%>q0&W*4#CqR8Un)}C{L ztFSWG7G1O2H1K2D<85GP5%UjQyhhAG?`sco>s9k>-*7hLERZjcoobYxw7oBSUKAT= zR>tj&T0QMZs|m~PzS%UWyD^hVlCrImKt_S=s;WtgNmA1?D_NG2NhB@9TW7NcAjB^> zDn5}tNg7RA7FH~%*MtgpvySni%4!Q&z#D8{R6+K-K&K~^Y`5^8 z9v0;$j3#j%0*aDYtZc@UZPUz}w#t5quao+wVDRDI?_dB_KmY*HOj|`pOB^qi!~&_R z$55Bid=EEKDB;+3V;ukcpkz>hBnDqy=_5C)p-%eiFvz@64O?l1nHd6rx@%y=Bax`# zOx`n}W*iS-ERu z?yQ%Lc3fFABps}sMsqw7&5Mm;_!)jSmD2d;Hh!7bRQF2vu6B{0-d&`q#Ew9OL1`r# zKp|%;XwidWNsPO_PZ)T9VSy91h(pJ7LbOv{qFb#td^8ITXo$h$aRj|ViAOPIG5`X_ z;-YiKWwQD!;gNC@dFogRsoh2qu$l~5zZa!7a_i2|)!F@pnU(9HeH|OKKDG4>JXu71 zhWpH`d3Y^iQk%l=N^Qdn`5NB7U0lrBI`A}(>H0hUnh$7_APRvA@AC+pt%{^P7iPr#>GnZu-}H+Me`jyWs`) zJs4@5Dxk*XYVPmW5>XHU2oWKVndc$lbeKD`ZoyWuoiBZp#bDS*hp}fdB3#m}w*``= zAf2d`X(?1mGX(Cr)2h>*BcQ@tK&jv4ff-L0-g0vYzl?PkFe{@fn({;@)D$?w^N2Ri z83V;jW`Zt`50D+P_lWc&n<4>+QQ6S7`;HqLO;baWOA5o06v)TwyuBjy^VS58~{S;pO#Jyji?z9F7@ zkov3&A;yNTIg>&PV+I89g29||jgr00IVdCN=ahL@1i+7h9afssOajZyo{J_~S9B3> zfyPn2y5C+*hA))2e3Xb$A)2!d)Po{3DGnk^JK=#wqPh)AU3QN0!h zhl7F5Rp&ZRT@Kah8WR@mj!6l`LX-(pe$q7w9AZ$&(Mfx=B9jao!8fN$QI`rlLfe=& z{bo?xsG^8FvIHqTvV~#bVvGO#pkyh4Bn@BLX(C3FpsuRhFvGr234v#XjL`y0ysNmA z4=9U@*7o!w^z?_d4Pm7~a!|7bRx2{(DhM@Hk9R{I5*><#W@{fbwlKmRQr-Hf+)lCx z01ynv=aw`&iwEKT6_cepLo>!&(?cVp;`_(t)dmUQ#}1dR7=TlPsdE6#PLMn(dN&9p z#2_S(MUNWJ6|xkMzh)RkH7NPqKTKu75j%E0r_Y{_FZ5>g^mTh#sP~0FXHFb?;IyR{ za%eQ*(q~D_vIT6hJ~uI>38p5gP|jGEFp3?ad$kq8_~NT;MG|UKnuoYjHy|m1v2ZYv zBi+(!$X?vG2_Ppz3MT+O&KG->Wc-zH;+aBMs9k8m000sb-!J?jd!&-^j;N_<_`_7Z zbFuyOE6rcUeeJE?y8CwKJsMPAM5FIv@-UCGAhDN(D zX^*c+F||cRMisg;7HOamuDE0&00000K~O#f94veer8Nej5g=k#SWZrf#C$Ydvs(ri zG|HkS=8{T5hX3K#IJ#-X{Sr09wo&Ax_hRot$r zj9=fl)Nbp-8BwSCr$n}$&*1=NCKHe6Wj%{WIWKju0YWC;oe(dDP^lL!T8m`~_BTHG zW%yL8p_Q%Y$ouS@I>`UDOn?9)4-)R={lS4!T+0)P19BKaFSOJ+}nKLGh0oYvvpsZ*x)lR z`=-On1Bkq*A?gcEu~)5AsN<0I)IpwEzFdEt!amJ;MyK;!w!h6g*84kl(5Kn%RuxjA z2}q3eA+ivy^LY2?L7)Yshmeaz6>u$dk9HgyQ8eTIsA*MM`F&?qi{gGPeda~_bldk=_rB*XzA9z^$BzWc z&f5o~|2w;Oqc^0ZI~}N&Oy^8Cw8^OEBc~R})v1R(iCNC&>xN=-U(L@oBT^z4CF$B^ zR>`ZmX_j{ni;0(IGZ8w;1Qd(PLCOF7uw({+1QA?V`RPJ(pzfN^FvyNixszpv2@b+p zy(=t}BbeD?L*0=`sOh8BXvqz_{l|6lca-`CA|QCvp*OhB_>2AQ-qjAeI8SO@b6D!M z7&88ylM?q=^^F}h{Z&0(Tc7iH1r{N;HlfFh@H&)mc1%lb@Ho1wIZ6rxXg&;~R+^Ze z(hUwp_`CbFWO966(;*>(i92+gLm>bF0006Es9#z}D~%>2O=2rulEWo~W2Q^mK+-f6 zp@z`1I6Xy$O-bR^M*^KuY(k1mue?}ELQWE8Q4dbZDp}&7ria_shIRs9*SSfuTZ%&m z#hgtDAqo#B?v{sHCnt&slD8v8RH7OYMuL$*Ylotxn#GYE(>1I@OzT_AP2HkjxlV(= zV9$X`~|J&TwFaZF*Soo3>VhFz!3i zzeVDpO~V?WZwW07(xLiL&FQ3Jk~zZ*q*_judPGIsjNqE(TubZ~4~(dh(qfMg21O2$ zwFkM3!$HwaX;f}GH_90TJPaRoc0TSJM*qmQR6)Z}o4!`=Z6l((GN8&FLQ-p@01zCJ zDj8Z~w8TQJf%N}@#4OCWp6M91q@Qlh)lA0npWAg+26GqT3vQxC3aa`RGx zjU7C~zBp#%YE)X8ApYW1{K97ZYgXKi(Ib;?<(3xwW#1fJL=kpPs+uH000coY`e;QG z0|~0aL}~HIN&rif#7WM{LpGC0S-;V=|NFp15r72MX;mR6OX8p{I@~ml-RSH$M^2x%#e)>~Y zyFm}WQf8r%jZ5pXb&)-(ukaU?rKJaI+PxcZ+Sfv+jC$}N%FUi~c zlUUH<>P#^^l3Cg6CZhem|F!ImtGN40=@cDJXKC*t9=iMmoDxa!bmHkgyejhb<+UPe6W1*(O7?U#Eto=R!{F}38)HpWBL*3PtL^>yQh z7A8WkRKhGw7&TI|AFe-gS8^b&++>ScW^80fd#q6{$$D1Q(h2mcEN|ugmBIGJo>hFol(2+w=hJS z7`$*r)(oO;_JxGc6J^>D6R-D0iLE>whuor#J#{ySPYO=0=M1ddi5b~JIiGAWNA($+ zGQh{zL*$6~YHPrq;HnGt&jLkhDwjnO31BABA#A!ehKHUYyFx((N~zr@RxZp~X_Z@< zWH6c)CpoDo9h^PQWY27Ig(_qsS*{|ga}%7~a>$R@R2Qo6HDeY%38;ee03@hz)mbPXvYO5cyCo*R6TyK~ z$FS4Nin6L;mK$lPa$Y-I*Q2nFctnGYm6khM9v1>8hJ(^nvChJYuoytH#DINi}r$98J}KEuFU-sSrD@qBPMK}YjW|Z zVm3(CzHsBS@gc{cvu}c^et$(XOw#b`VMP z?N=j%&PErf4dp3 zjP^*WER|?vG7%yqRRI_eD_5#ME18j$>p$(@3Q=TT8*VbTW967lJGwe9`@}^aed{w$ zDFbQ2h++jl>#LG7k(l;GQeNJ<74GZg&AjJkZ2$YPL?wU(XJu9Kh8=R6ENZ(j$Uai} zpI2m{+=_j(>kz{ynfiGYUQjg6;h}A~-yNiw|DKl}dV4d@GZThZ$?Kfu_1$(>YyGz7jT8ZZUwqOxQU_^L85AI_l@MLglOV*K zRVm*TNWy@cz_B8(dbyC1PRK#!3yl^7h0H>p(T1NJAfu#%>?p?YesOz-(CwdbkvBS2BRuYEbOp>X&Ve$2b!bv zZz+qp%f>5&F^L-_+{G~?SABHXp~!+LgXvfMf@;C-Y;|82qbHvqoGdCicM;V77vWO{ z7&xwzfVF7fV2~K&d2@r$$;ckqpz1r9OkTA%&!# zI@u$ZQwkYm#wXJ_Fw8wCpfOPQVY{F@4AaL zjSEm`BCgF$R$Clhlr?j?@*K<(@?CP2s=L;S0T2KI7<2^_lP|%7$-AzqsllCtC})UP zMol**FKXfv148pn85aBh+@1bO_SQt~g4(LBt}=H2`>fHV2nTOPDC! z_6GnRCQy`snRLb)M@GpYD_DVaBmlwTNrm%eZSO;BthzN_HN0ng_BpvID4ZuR<*wvy zF?@UTTs_Nsoy+V@k^mr10)W#xL{KW6raUMV1(A>&5(tQ-n`;NuPDEmsU{Im$nClSr zx|K~Nmpd&gDKgs^T-C?N^{iy*GVn;k)z3J^I1p;Nm6@XcJ#r--;$N&H|gtemU$%~9K zRT8Q4QbGGFGO}zMc*v_aM@b_{)uD?K6k$+sbH2JiO4Aci!=u*QYcuzo#lh1o;tYvY%i zg=*Sw>#_=AzEXB1yPn9`t;%vTYCYyvUbE9TMAxl4yi$(Kgxvr8utXpM1e$47@rF%u zkF2W9B?i1xt(QlKr65XgGU;seCVA9(TdZ?q=WOkLfl*^*wLJUI{o&xVeA$}ltJfck zXI7*pim}2KSz20w?5d(^991pOXp2Z>z9#l9&qd_>VsG84)ME|t%j&cKkw<2)EtciU z$$pYnNIr-HOuDC8S?hLzu}FmoD-fLg9lG2Vri6cq`YB1KXlX?r1t$}vopkcQc!L!%piMG6=Fwc~72HbFFiE0v7$ zxOcA>u9aDuC9wILuXR}7(2hkOHkB)KH6$GmRaGv=a8YS1C(#zsWe-MVIU;GzYaFVt zM#KYK<63KWwUw?#LeNmRQK@F;+$u{pq!*wd!LFX z{UMuGBv!#Vl||4(QhqG5N*H>0RRZpdFJ|N>swTpNqRmoaIb!5Te7yS}{klu|DICRTYM`87Sqj`_u1c8A@v&=NfaA|NF2+82|(sW69<@c7PwE#ULN;kIJ*R8230!!9O@v+%1 z&tL1jSGL;}8zYsq&GqlRb_Q=zxOBh5^De4QM#eQanfk=$pp209A4&8h&6&1g2|{c? z5V;ebiJ?uAN`|CmBT{NJ&1q)HYQLPmZnKS7Yb3LO%8Fh!&vt?;BveSEQ7Qm1(y=Cc z)L=qa5aZT-2NP}uop7BMF5&35^q2eaqc?7H=xPk6R=vcUrhZptcD!UZjAkkEbdPrP zO#5H$;t+{UO%ruWq(d#iPCr@co;d8n9ZR)o8K^udV`sC=6+We!sf|2!6iDH6L8!A6 zjwFXDkm}{-5!FX$b}L0d1lk!0gqDb}W=3D6p!k+c{NLL_`v#;@;Ik zM)tRVtJ=@$tM`t_!oFUj(zPiHd8I^du?J#eNr*B{c^hwsf4UD@{2 zpqpOq#}LzR>-NRG70`gU+EM#)5q)1`Espy-V{_{5m5qv*H_1+&40QkdphPTy1S@CH z>E=Q5flQhmB*=bG@qa<4Ak*p&vS{?S7!^sa;AR|$G#x$E4T^O78Ja35fP@=}28g2K zFv%uMXdFVG9=@Z9Tv8J0plu=FVoD@RX(a$s%rLp7gyLaDkb(j9OMKwOM9e@KD9 zc#VV^m5Ihmn)7i=$J6z$lgvC04hrzym0}wlh>Lw;I=p4aRd?Gp*h5d_OuA%EqmItB zH5VIKUUjlmtn{?Fw-TdrC%j~9Z3=k~XuJs+?3_qF1w+NXRKc_+Il22Fn^=-;qDcWk z8E8_qD10R@D=u@6XP}SQwEdyAd1A#b>~~m@aN2rBA*ws`E}UyjM9p8ISqQ0Hrn^C{ z?>SR3It`EF`Fo;EIQzG?sv1U`qamN0Q(U6w5!o+ujnhm#qIT}gK`o?I(b0RDJj#OS za69gr^2eb;BhLW`3+EGy^@*0+DIygHlOIa~c~Jz!$a<7-mxmi?Der5-X%??BY!lMe%f2V`R`sg z+hb##RI=}F4MiQRQ7sL*C}pE0NpjGzvxE(VxCput6~QfVqI zbaX*1x?8@p&Lh@S+KHS*FI?lS>b$Z^64*J6XzdO8Rr6Ia5fgoD$6xjs|NEds8h``) zV9{xYL;8s9Df~SKpHGp2J*Sxg$@{QqG{YgdL3Bx>2)4;P_*N{SA- zoiQMadupT&q*)oV8r{R#-=wmbMV{!@<}Qls@7QUuL5a|FL+E)aaWVsjn1hDY*1v$d z(RGm!10GLWA1gB~Iar`Wiro=oChDC&?Nuh%bgaUiW|TmQESVn^`1qw2@XExZj&Y!wM4#t9LmYQ;l*uxXqSinT}Ff!=q zI)?ciXC{_HOQ?=v7FqPA%;Z!x&PBQtaTsL9XKn-Wf^?@MrM}-(QRrLLLvI>wv39KE z&v=90mJCQk@q?6MFBc*am&>FQTqMiB#1kf5|r77n1z;W^&AQ$X|3U z!Jy*PkLtsb+KHW#5!I(GsvhVCE>m!0Fo2*b+BFks4_ z#LQA+(9H*FSVWbviH!MMPYpPFDwji$hC;f}-h2aIg7?p}bSE#Z#*t|f=rZzHatA2@ z$&v*eG=rb+RBCezMFYP$@{qu!G1>bq+Oxsrc{-tWbUz-lT-9e*nM3P1G*dfA-q_ey zJ$QCxcfc9erqQwK5ZA3b_Gi!ImAlcR*?4`Xv8NG7rg`~;jz#6;9^Y80HqJE{Q37{L zPPgHT`lIKnYc3ShBAG0dnv@SZsbJEognPMXS?EgS`dW~KJ=D4X<}{vjq)({yP|LXd zf{fBjTXYfAqs7{;p;k{NAJu4S1Te|I47|9}bD{5{4f}_c7lQ+{ zsA3kxt+fy$8|53NS=Pm4!~__eP}DeFq|!n96sov(fy(vG1j{NSi7mwC7Lo`NPSdqh z;vn7=M)Y_PDod~R3EJD1<;~-1)YS8gQ8eVxra0P2uYfYPQfhXhpoDwEC1J-SA4;yo zV8(s_q|Vs5&1ZgidpgYY_(muC@KqG{)hxoo88R)g3~dy;F~}SGQl zvX77Tru#Pk;VG&RN0(GIG>Rw#0&6~jL_*+D439`jyVZc5H0xI*Y9c_6-dYEdn}{%fjhChxqb3eIbc~y6|NEds zEPwK?M_bd(#Ni@s9%=+zw<=BBo~9q>rytlH0w zsYs-xS`jHrCL7h1p^w@bFzJ4yYyw7TWFt08Ocet=ENSJ`g06be^2*t1l$f7dme59Y z#)52WDQem8Xu%i0+K=8+i$^bFa<6zzWYpPG?#L6YJq)w^WggSBjp}FTsgD&;&C&*J z&gjK6(=kSo{iZrTK<&RO5u&BUkcs4Jo@UD}*!MRw{Cmx|-xf5vt;7@JQu%1Dt_Y#< zNdBBm5u^-3_5WaaH;J7Pn=Z7Dku#zZ%!VLKbG@y=hwA_P zphOn{1O;f#>4q?%hiv*SBxdDM9fvojB*O|7GU#-~8eQeDDB$;XO;Q9J;$|Z~9b5B0 zwzu!Uw*LCxb|Pk2&z&TnBjen>=czk?`lwYuzHV1>#@xrBX=}4(EyyVcBxwNR41wsp z(CsFR+g4BCP|cNiU{gz3ZY2vTP==vo+Q^K}3IPHXX(W+I?iA?I8s1mT4kW6BLK>KoX!5apO)neETs?$5(-5) zRwjq(PdOVXcLiWiVC*{$Rw6=KHYG)E;nARoz3wGH)FS-r#ap1u!=>x#^dVi2n$~o8 z8J2>KuI)EB+s^)6HfmM751E7urCA+OiDc=oGG_LUa!5RZD^j<#OL?kqmrab@*gZi& zc+_@E*!jrEGZ`YGU2)HX5DoRHn?$t9P%(F6bUHSz%TXqR1T~Q_a*LEJuR@~_Ib|hI zFGplQM-xcF@nGqr%3h7XCWB0dzb2(P&f{No0NxNvsWaMiqsolN%4k%=-?M3qzBp0a zO$==@yG`4(ew|U~Whc`n(0ya;&#@V_?~}2HWuZ8$dUf8^Stl!9vKjE~u6?SDmxQ2_ z|NFp10)Pa$X-!o0DPq_RN0gsA4B*u}Y?B$|pKOU?f4 zVOogH)?O$QM;2mz^-M2iVJgh1%8LIl4wi)-x+an>qMa_peRWPc@+^2%S9MW=SsYVd zWJ?u_@m+lBBS}N8J`bvk6ge&0Ob?8UnuB6Cjfs@CR8A;1HbZ+6c{zuk#G>6L2xeAW z*vy>eXhRAR*yn8xNw3H38iF_q~n>$q>D+*5}dfFcRRI#@BjuO z{{}I-@C@rx%F}hsfLKe=-22TnX@Xyyq?*EC*>xo^WbuwoWhBoZq>Ig8j84k(vsW%n zZ?c%pxSdJ4JvY~(jntyb=Kp%NV=da&ak=Sc>q|9n^Sh4wpMMzk7ASJ3mQ=A6{!1

%!e&)#)mrvsnL=^BB9Hmi;oMT6h+JmNvmR_kgGX)**ECyR za$ba(iMC3t7c8OWPpercu$NDB5r+@LaHRd|LR(e2L*wf(@$sL`a`Vbzy%Je}Ll(1L zGgh+g9zM@9#;l_l-=4vEx16L)Dei66&7F@{uTt!5(NUEinbc9&oxa`k`%upgEd^L{ zBG_Q)FB7h^S@1bC5b^Z{000081%~4l_hYNs!xJMhuyb?>C`vZC zAcPeE``}~_00{VH=k9Md(!NZ)Jp*81p>x854-6GVl>l>P!ewHLEM{*H$*5Pa|k$To~Z_LJl2XLReIH?{|g$zEtJtyzYls$cy3V(l!d&FC5Ile&4znR{H1y^s4{R*GkZO0nm2F`%wD0yE{74vVa^OhGX=cE4I~mv0NNk&X(u9 zj{h5mtzKbnP(68=d!A?VO}5;|g$g#YjNZ|U!nwVniFYCt*!qx_ztrCIvW3W>%y-SU}@UOeH`UN)_&|?)Yk%omR(D93!4jVEcBNPKF z0Eh)7;{i&lo-Zr(rwTagv{lZR&vT5nxaEU$3Suva0Gw=>g7U%NV7Va}LsMN*i z^p0!o#-WNFA~ow;mrhXEipr|k`*vW2h{7a@u| z(3azzj|ksn)n{dH zUXFIP&0MK0x2|WaTKv1)c;&reb9%q5>|LeT-=MEg-rthn{mwylv8Sey)UQ`LBx{PmMY{B~bTqWnlG$wSJtdxDL-SC??x(C?$}W$k59`-Hn_4jGQI z%;b|n6-&i&s!^{#a$UKo9;zNC7i`d6*rTy#KGp1pJkRjSZFF+oIQgZ^nvpQ@>iWZQMdn zM5N_5B5V>`L`5L6m}pQ^1q;=}RU#ZpGoPv`#B_@kw)Wt5PTqt)ob=~>~2ofB0WLP)Rb-)VCNV=3_R{|p1 z&|xxI?K(j=sxtrkz(fy>#T02&iwQL#mdvWMVdgFseW6S&F&5HLG%87iq7d*q%f_nw zavQB3AQS}xLYCVRgaA?^LHmFu(K5zMQ0XJP;j2Pa?ZD=Bi-gYYcyuR~yVIgtYvX!U z)qJ1GAx*C(;oWO0l7H07PTDU!BdK_G^taekGucSr0GvT0o&wxz4rOUF3r>Ww1gR8M zkJ6%EG}-3g`>|}tCQ(dqHJHjh0#GJEBsqH1Ayw!TEsV`qmlK44rUPw6WIYfekP7mE z*K2s*^;GA&H&J9vB8e9p-c$=amUXXj-hY4>+HKEu(_YFJ4_o8okXFvikoF#4ElsR1#%YOx;G zDC3iMrjo$u1ZZh)ZRAnp0|Equ4L6$Vmn}v<)`$XMcD?{ZV`^!_i){FysG2S1C=RfQ)bF!JW;x+^Je2J*sb zqjs}-7lCM!t|prD!xm{UAv}B5}95P zBRY3k>i85R#V3OSWHH|s%z=yk~%T9P{H z5n{Gu_{@>lbkoi1{@kH_acdVh7mGI~PT1m+qA6(UOx3(|+(>#HjjHdH>0t;{g?kzy z5Z1+FnUw>Yh8RM%_fIDQl+}t+Qedq$RRTmw*}vB1SJV?ZgsVD^qeTNH7lScHI)vBi z{SqNrd8eeUSf5gI4c~9aLhbq!a@Ls69#fI=m0GrI=~^t7NL*%<#9fY5TDu)JO7F{a z+P7e-VO3tFRHM~jhX4DZL@odX6=d2`CPliK44QIa$f!^uk7DGo%ql9hYpC>^G#Kh( zNIliZOVMJ-E_>9eBBYTDHO)Ouln@1lM@Z0xR-!Z;BIi~JH%N>OzUb5uQKN8e{gH%!^Sj*?Lm91ISb9xG4WL zOwSBKBuhpo8Br2R#;;oKcChrS*3K)eF66DuH7U(t@}VQ9UQ~mtee^9&DvvIl)p&Z> zymd%|Dk><*U&*tYC?8E|9`=NkA0cW67@!NEt^U^F0Zs4inKR3{ol-Mz@DzKfa*-zDaMDayJ zu`043l3(?Uuss#rmU zuMv-pD~as{Po_*;ZBr=!`>;d}hy*%d*ExtcN`lO){V@i=QT>-rXPFvmG&1V+^qM8I zBq?j!f1z75wTu7j!`zJ=R`rYB#nANDIN7)4FvqY@WE`R+zY?5T$qRCgTesY-=+;Fl zV=jkMnp2}&QwQNN3%qePijWaO95W=u_f~B~TSVMnjW&xwqEr=09Aj^?R)@sflUEuV`se2mmx*63E_>H_ppGCQN0?|FekT{C16rhGhiEB}^ zG|I9M@pmGw52c;Cuazuy^9Nj0RD3l{NWmI6tBo$Z8C7blQgNBH&u=Qel#;MfN60yk zJb@X-ZpDWbrzO;*6GH`?>OcS>0HT`xteV5S0zRc!RW=*O3I3~XE={b{DN;#k5KJRC zh~D#k2%zj>O4F$0@_TX;EXJXmrO(Uy-wgMhJB-JtvuFQ5x|@!Dt@9cG+l^v)f7UGg z?U~!N!@n&N*|(J23r1){IM!}DWf38D46D0E{37{wVMiwf3D&^sHJHT`7h9#d6KJ_g zLS#e$1R1OMvh;v1ftWkX_=^}sVYNJ47+9XTFZHPvcY9}hnmk6eWEMn8)wW2FF8eWk zHZ8aeNuft7)@x|C@7}tHnE(5*L?H--s$tVn=0_@xYwC(Uh;LIZk49`g4eB*A>9vQL zy*?6}i&&)h93&Pef%7y~)FC127U9vsWK(g`+ur ziNY9?E-gicV94P_FM7Y|<9^Y5g8oGlpMR`%yU>=+dXOzs@j%p1Rc5#Lt+??^${bT# zLMw)tQveaDAbKf#cUGZ~854kCx zo`K;xLZb%M%En@1j$Ab6>EIXbZR${&Kt&`YB4*3QxyBQ9t+{fTjg@=n4V+n8g7a=S zyolO3y)88t@4BY{&`6zte#)k83YAo6tV-Eu(i4c(Zizv|MKQ#|gpxUGUJ$e#vSsVz z2h=7?z}nzHqoE|4yM{i+mQ8Uz4gk##%yqJ|3bbS&D<`zFc(i`%I!+#!o+Knx;ZaE# zqA=<)-I5~ZT~t^y9&*9~L{!^by9i96q7mV_EMv60oudr|X{pO{l^3G1R9NS9i9(za zvt}w%YBc2|#@#+pLFfoDe~^>t$T=iXE|N}Z&sl3Tg;eK2!v5$(V6cu`iqR(S3QVJQT2~T=djP}G%#uC z^r5}IF7x)6`}XT+9o*$;r|bzy`k(hLyjC`q07uJ1&j0%#i_MqD`_HGvr-gn_jK}xV zJqk+G)O*I+HnxSMFsMRZ+%rA^66W7Y$6_E_1#ld}CkSYgmI6vC1BL)}lpQJ%;Tdw4 zd1fh^6aVeO<5U^cY-)mf2`7MGwnXJ=i0*zZ|$RT z{v9Qhg&b)}E-yTHD@snaxl=@pm6M4s1(>2B;ZjJBNe~s$^oL3h4e5ZTFW+n15oCpl z_>#OQ#3;@;9G1%zz)2t^GUS&=!Z_5NiceT{gJ_(Yo18LbR}ijA2o%=wG6+;-w zPB*ESx`F!0;e!TT&7~zs>uvfwO(iFLcqScXqJ~w962X;wrVj2BhLS6ClI|}nB<&VH z(dOnQ5OGE!@+VQF{syq|Gm!@hIcccV0y(TI1xxOo$Rn=@5&l39VtRP1TGOr-A3Nkv z(odRr`p-p1s%qI8+dIzL6>HaGMG636(aknt^GgpZ#)1R^2CM_E7W;1n3q{*;VMt6M zz2Cc#-~4{Ey-VAADX_id2p&>rkpKIjL@@xa`Od4lB2ES54pGI`_fGS@w zX=tcf)4BEvk_h#{}lG#w-TQ$qv#p|GeQt}VBQ5Q!Nt%G_iPu&0oH*eN< zAmLVwV|;uPCejj%Pn)d;Bx8oWemCj=oFBepb24+ir59srRz$PWKPXeT*8%FQZ5@7ll98P z&@ju_tKD+W7#$oJoi{yG|Fgmb0zu=a?jEAVuiATXHoyl!k9+E%rukNudP&LK8s6xu zzIg4p)LiXS5sMCHaD4XVkey;g&$X%PBr;WTFOI{tlQB3|qJDdH15oddKMob1kq-0?td(7Oh!SFQ5{t-QpHa z$)zNCMI(tIZ&&ZeYVEFJ(+mVU4J|LKR7|oJuX(&dbbV zw3c4U1H9Ps@RFj0bx`rtDxQR9k6^p{f47~`mNuUwU5#Aqzci~Eeh4QmRcl`hDK+vc zA0arKPRgs}i-1Yzp zvNq~ln2-TWh{A0G2*-%l&;ZnnQqP%^*H+1xjpc~$kRzlx;GGD%M4-tP%t<3dLNuH# zvSvh3w4+klT@oBFV{4oth4UoJB_i>;!tuGGo@|jgUokX}c;hxE7|5z*wlF@CvL*D? z;eZ0)fKY&D00R&NgfDrKaMr1TyQa%@&@eVp5i=|Rz{Z&e2Jj1zb*#FjAnfKyAJSwP z(`Z^iq{S{FVE{qAVVMue1_&&{94RW7c6G1T$@JY6-uQz6)-b+cDKKw<001`-3A{a! zz2T<^$R8kd<1hdJ|NsC0{+p=--~fAaP4Cl7lLD-~nR=tOcSC(6{jA*3?#+frFk+GwDyy4dS5a4g8uS;)qul zKTl<*i&2{($RLZR8{o6ZuxP<=11=^Z#0BgOh!_Cld-SgKk1X8#A2(#n?7UBacSu<{ zVPI$=1P~q=0Llaj3+xT%6A_pUfGQvV|NsC0|L$Oc4-kN7{sFNGosismT@?xeb742p z=`)@ge>lkibB+%V1d1rTZQ}C$bal(=qre%@xi6Wz=?m%9+h7An2-CTVx#f-A89>UXQlls7I`HdnO; zor+iV3pI1AQU3lZw$|s4EVVHa{PLHVzsOSYUhr%TZ{HT>=5FAS9jgT66>a~2=kq`Y zYT#Hbqc|KR5(`j-WKi%<9t;YGw<;$-fmO)cQDH#>Hpa#6rq`*bGR#v8s6crN>9;uQ z5@gd{^H(L-d!}1rgI7|0ctkWAX0aKAtk223YAw#QS*fal(0$d&kw&NCS0_$+44zM5 zURIjOQ@k$n=;b2Lou6?5CoF{P@_8kCYqUuxG_uMM!Q7u3R{i%a+Wd9KY})Y8|*5wZm2KD3NacH zB|LpHq)DSh(+jSqiW;c&xe?A3)Z^3hSe}JLJCM0Qki!AuoQ<7h-GbVEG>_PNHj^D= zZ>%}hD;#X-n!#72RLiSOZwk$8;}eFHMFl}g!0anjA0s6nodaPF8CiTwR2&(I1=I2Q zj2Nyh7RzVL%?nG5j2S5)m5dAM0pK=X1q5-)p|P9BM#WO<(#Va=uA%>VeQf7iS19T< z)37*ub5=!4`_GU70VEVqWm1VDGghIhCi(@ASt7&TzzI_XX=ys%qFQvN8Yi`)%f5|n z0Zmn$p02{Twbu!}#2YG1@KE^S!%L7@GDu-I89-cgR78B3U#kt7V`GMyCl4JW6~R)l z_D>VgbfX))QOT3E^^uj;NNrS(vrJ5@RPu6%C6+|OFG+5M1VX-bQCWvvo2=zh{UtSBSloTD$5&*L$<$KJcRXPinlz}? zq<|akmQaw86XxiKQg7S~DK6r}meEX+U8p{6{r~&GL>i9919VaYDK?UsR^f=A-!eIjbYF@zbmR)6qUxGhJ_8gn9;wiA=Gph5TgNsnJD6#JEY-6 zCh%WbEGv?hsFF5F)Tsp<6}cOPJT${&tle(y+S|&er~R)L-%BctEWD+cHdEb~PpeU8 z3ZPOTs>9|@;8}-Vnxuk_GT4zd5jglli!{dKw3qVir-yY{xQLgwUOqcKE$}OgU?hN> z>jbL6Dagvnkmq|=yS8KuwDarsE?Y>^2H9BKz;R7#hGW^+U^NKo=T4gthL%~Ez>L}4bhU7MCx(+ais2uqr=DkPEgr|Yik2&v zzY&>}QfIKx>OnH9^^~HOt|x1g7{Wda+<=5rWHz}NH%xO{6JmO(9TSG>+}LZqvl{vq zy{XM-agvcaM>-+B!maINM>Xq93K9?b6}Xl-dtWrl+et9B-iv)>SEZt1ENuf(5UJ!k z6|zdanTsPQcMe5qixruG03J&H^`2G;D>!~>x2I)bi2W#tcCDG7t-@~@#BPT@W~3N$ z$!R5U(n|b`sF@ZDB%JgT$`+{WsXpQ_G(M_owtAYIYD@mxh@Ki~U};XRrlPK@=DFJ( zC*ymIQiZPD_8DnzlMLE4EXQ9FH0ZP~9Zt;@7FHm=HZoP*smUv64gk4qy*i|fcoN1z z;Bp2r$|Q+m?phV3nAjz!rjO7IJY5+E1y1eChEI;Lty)=|K+IHpXgf`x88k^bgq-iG z7cEld5~<9|mL#4_)8lWP{}ozA7j_cmYc*`vyW?M`h9n*3o9CII&3y6SInfoakJ9RT z-|ONzJLIhcSm0w0Jsdhn!4lESlTAdYZZrv@Q*Wg5m|}V4WRit2Yz^88wFqafqLe|A zIIHk13dsb}z?=6$#c}5)?z6o{ORkbQj`!8=!;m3AWnhK^aG_Kz&(%ia#IqYFW{3bpxqi2|mx2_xv{0qB5eU`~6D;fSRU=oYsMsX%QIK(2+9te` zv<39?CcU3ZVdr_$M{X(&iy|b6`ui@sesUH?$yO!37kdBuutX#X#9(LBx%e_ljSM=9 zVJ3@F#hXV=q|)kNG-*wPChXRd+Z8A5cc_-T#U$}2Q`CQ$-QP0)Y`CDTzTPpwocA++ zZu#3ur%Q}3i}gF@-7U{%GBSbt6=2?=^;J85#h0;fh!p?;bQO2jd>Eq=f#Y$-E3&>W zkOo%8S;KanfBQE6(j0;a03i_>c7@<2Dn!8?k*N2vdHNc5vDA|>CM6whHa0W!$S`go zdI@f%%~hS|^3+spO{v>=vu}ATTXDKgKkv(*wXPKOmOTDJDSZ1H)wIGAxyJpTeE%Bz zF4fE;MMkx?l#^ypRwF_Tl!n;{P$}CdVnx|hL&2qcCoR)dNGGjDAhe^V>@=r)VpEUt z))O~p689wK>4U8>(L;B2b5m+T{?6QPv(sfYQd5j^B;PJRcI?=Fp7wseLOG1s+qe58 zF#}z^?7ikPqq9r;CAA+b|NX*lQH_X4g8KBoZd*(@%&62;H(wJ;N1ur&_KtLLro|G4 zo?5wJOoCk3UicS)s+-Kr|NF2+D~Nr zTe_7U=21oFRGnm)YcAe=LI3~&q6KfI-K8R{ventc^0s8`Vdzdp&jGN>_dZ#<1NB50 zhmp~BqbAX~jFB+}!^@*#?yJvHhhwT;c``mc9yoFCcg&efK_XC8g&37PIkTB2%+bkJ zRZ>%vF6hkFRaW}*BysZ|YZ5tZ``e<^o(=5W{AqV0tb5IhipttZ>3KBVmo%+0w2{XZ zD7rR_$-3LE*{cr$M2y?*xS9ZJ5K%xP4kgKyki%L^7xXd=cns=hk#+z+x;rB{rsGnN zZ1%RAHKXa(GoE|9^G#?})n?YMA6E)z$Ad{-{#MI(Wx6n1N(JTWF4dpkc$~E}zD_gZ zN51@XlYoNdtt`Vl z0O012K!`6I9U5xKU+HYYORitVhlMoPzDG>)C8#_qASEI+Ato6Z17eY(N@TK(cPo=Y z=2)SOG=&g=Pzv3QpASbDP+OH!qpxo@=c&rmt7kWm!p&xh~o7LW6*B|ck zEVq{G%VT_d+}hXe9xAK1t<&7(i1I7uqC^Oq8+KnR;J8x$Zn>WebJYL<08s+%`rej` z3Oxbj540$fvkN6fogkA|Ftb60iI~70D0e#KStQj?rk;y*3nPuiQdFmMo!6S=cI$G@ z=3NckGrY%rrH0zYNYZk1%2~7OCF$Fhm$kcchFtBv)B0wH<+K0$utYKl#8YU|YY#B^ zm`wU7VJM4HU86~?FwkOMv}nzS8Wi>N@~6V`+OZgqJ|mT#ovpXrS!Is1@-IF%pg|=+ zO>eKCPiNfVUrU(3tA-Sh}bLW|csCbixX%>|>Q;s-enLv56SptKUeB4zDPP=B2 zw*#@4NHavH|LfE_*j5N7wu7K)Y;GEeyV9Aew4J>Wf1kioLt;V6O;Uo3j+|m|B=U7C z%#g{lYxT6|kOVRiCWJleM-r4%)T(0szQ@V!dyS=0C&s)+`OT%Hsk<8%*#4XEh%yJ4 z-&=9t{5i_x*^BPad;K%+JLYBUGi%ql_m+Y=tY8;u+uOfi9-mmSRJ&Wp0RRjbPKvrfvCl~pwrh!mNCL)EaN5`okFeDqQDJgH&+%d>SCmf|Rcyt_R z3ei(3d_t8cRg@BH>f}H*o-5F&;FB8eB{Xs_irqOQ5=^C+YRz#66Piq;WaOnHQb2)Y z5w~k;M+z!DlO%DOWII-UpYK|p<%{`_(|g~yYJ{1)ZQ`2{uK=Wp|NEdsHi*Q2Xwhl! zF!+h>8bdvXRS<2XMCYW+VlK33&4wA2`izR!!YqNre}>3L8e3%Mtt|ObAB7b8$R??M zZ?i7ZnK&dBFShW;2yt!&aLg@5l9e^D@$!79TfZNZ$LJN1(DS}Z$ot-o*6%ja zx33?w!t&Sk3ygQFLS5mbOvlA3k4>$~~%NJ4V!ZwGL~LWhxm zL>x)cfOU+l85K}O@iGcH5T$~LUPs0hVb)rWyJ=%h2oQ~5nqCkBX=rQtjFAq%PSA_o z=|yhsOVr-I?%q0AhIwmta@BrwO-mg%no@tx!+AxUb7QZ2MOJMW_E$Ws%)kH5Geje3 zS?)qtNVj)Gs%|PDyf^-f0o$#;1WA1NE9G{}6G?@v#+FDWZe1~E4DhgkXe2f`AkH(P zhDn5x$X*RprSa$$NXchN84AR-{85`-H!TM^5?@nupr0s;s+MfM+`KLYot|Z*ZmVIQOv$>QTfNgcT*x~4RBBsm zDrjNtyEVA}aK`TJ=YSxk+TFzHIFPiVfPaYTC=umo=Fs`MI$U%v>7NB$=PIljitXt! zV^}!5Y)0cELqT`{qN*6v?@X!Ayb(pv}!gaMy;DW2a3U@}ZgMU;Fu# zVl#gkrSbb`^}mzPs1u7MV;Ojz6O{Z3ZO>=EBzKOMpxbx144n&PP>RBzR$gthZ*stb zU7F3r@ZLVq2-LB9T#uIEe3Ihhq%B@>=b064O2d{u7{tTUZ5o|3tQ{frXv==*pL1-?HAFRzY>19F=F`M1-Ir40i z5moz2TTG=5000@OZnp4tGnVCOXP5=VD1)GKpU+>T*Ngh4UQN}e;d#_vi(pQg49KJX zWX*0uo1BzsM40Yv8zYG72H-`ImlovQNQXK*P$l!+X0=G_H#7Qs_!e(wlPCWZ%b}1 z)vFY`Z>N?u=DwMtYcbm~d1;4|(j;iGCBCTR6pw0ymR&cZ^8(xXtrRR`je*+Sv0w0o$&<1|sXa8$w#PAT=)=#(J=e z3b3-ZRRV!J2nZ!8`fnnO+SuXuDnRhORwE6Ma6CIfADfQF>(gT>s}Ea+H+b~Rxf`5= zoM|MQ-rkZoR&i1gY%yHK3cHTJWXFC_Ua^~^fY=8HA|CMmL zYMUD!t$!Rp9dCGHe?3*s_bl1gHhX_{aL*plfB*mh1SA6!t=#ptPw!lj0)twLz=1Wk zxXKU=;VqU47*gt?4*$mO)Qni1r}EjLy8mSpu4{F^zv3+7M5$WS4vMbVHeaunUAI3{#f;zx zgJ}QAC?nRTGTS%hvZ)K!++AzV3hb-fnUvLyJ`HLCjxs5jW@@dE|KcziqyO@%hK_)MKoGC28Ss+?;NlrDr412hE$T1; z3#=*;Iv_?!5L^`yIFW%oLCyebK<|Ko;j7Drr7*vtYv4`8E8&I)LZ}lTo}R3A_IVk6XX!SVqGT;3&{nw z7-K~uWM+f)47@p^jYe3eMMp4)|NsB`CM!tD!18D%KmY#4=P`7Rl5@%cMgUd%;W7=~ zV2rW&+Q7f+D5;;faeq8-0AwA+l;0eKpyqE})UlTMhiLSna7&`GjY`Clb6Lve)2Nb8 z$(kZE4T1Cr7;4NiD|X*L-_3}wZ*L}Dx3*?9NuPI-X%6r9 z>g@Bsjj3PXG~BF^W9xgoZC<;@V%`?m_C>>s!1XS>1K!#$4?R zSpWO5WK#h3#bs8HVc-PKF6yx7yZ}&XmvyEX&FaWJs{r(x@iA==F!AEXfm(ZNK!`sf zWOmabQnN+QU*}KmNw#f1H2FN*yG)+%6p0_n$bhh;hkXqyF(!g($1PAf6 zxpyMP;BFlw#J#EHre?)jvzU~&r@T)NE~95N=P~yW(^--&@2cA_bk*_L@2l=@Q^mvC zY&$lHsVtGC>SdxDkV(_9d>AVb(XL)F#A#9O6=m8*QNxC*iQ)2!pp9Nco>i1prQUTY zirBbw2;qu4eZMO{HS5dnCeHTk&yU)pGmf8gFL^l8+jg#n7Yz*rx0vuu>qw`Aq`XbZ z4|0rxgGcWb8$6?Jx36&zZ@z1wr%Kz^$#s)GNT-yH(;R9--BoHah4|_{O~%Dhkhm9i z#5y8uouP*cHbu-MwJR!pQ3=XHvS@{@l~>!Kw@zX~QfFqI#tGCWaau2vd-j~#VyiCM zl4*EnM+D@YSDO=6v03@TWJgEnNg;9@Y!Ku~ z283*s(!|l{5ZW6VY(Aiar^_?bcD&zoH z&@_OhG^J8x?a83Uow*a(?{-$bF=)|RuJo4cGi>j`@fj((6ONfOwV`Ep5swlY9?8bn zIH{ih`>)d3^X91&3d6=$*xj;mrhJP!@_U3Y6*iPa6na*yPDiS1y+J9 zizs99;-eDj6q1VIsFuV+2~rZ~qH73C>12JlXU{CNsfik5Z;?qPY>|c}{xSYt<6Pg* z_bDH{wM~2LXyQ@e=07(+wNnc_Sudt6PD{Z9i!#X$41oiRt>~LoRnhoFCaoMPWTZ)0BboMoXPIw!28Xe1Fa2L!6m^UkrKc|y;9**kQ8n$)%(Q(1Kj zS$1qvL$r75%;8EJgx9uY(?I+xVfJ&1oV+~JCL-zQCHT^04xz`QN8I%R#ClX7*MHjn8w5@f?}l+Qxe_%@YkvjS~W5){{TnC;w}UkF_eFyv85 zDN&}}L_<`SckG)ZQr+eJCzs#tW{G*){BMrEP-cLME>cs?DnfXPF;6l6uPFgUWhsD! zg)T>dwoacjqtfK(4;0h1G^TEim}1Efi+s(P1%P5xd@ARkM{PZ18HMh?cAR`RP?vMB z8xe}XyH}f0c`3`H(_KFeSsp`dX2p`zxt*Na?$|i`gx$QIuzW@oRUOUUL9I%P+$=}d zBIL+@$b>15pj0-2!I0@WBg9L6NV0(MDTxbSC*dfP<(|Q-J=$fGI3>t-TsSJ4Vllc- zGixTLst8DyCC==eR-RqU#Opz*Bv*GRnl$qE)}eC>$~f27*IpYrzj1RVNs)ZDqrPbG zPD7Y32A{-CCE(VhgGJ7Eh%Sp*y$%M#IJPVyv8WFoFh^LD3b;pBF$b)Ph#6KvML0S* zIuU1r6-bNiruA;4l#7NMbnRV5Y5)RTvsZrcxgiiVJXGNvr8x29Oi-#2DpS>1AP+c{ zmmupIYd8I!Ez11v4XOtqouHW6Qso8_D9UlCRh0n_h@liS2{4gTHl^N0$S$HJYK(M? zRiPf6NW!sH|NEdsEr5g&VA$ycPpX-$YGPo?o>5JYTc#Nl>LD?zsPvh5Gg{iJxnn0U zDfy613sSDuURRDhQrV@3Q&kJqR&vGFW1@p+`C+0FWCs)?#sMTc3aTPyyE1exUag(1 z#+riWmc^v<>FHgW_!7@RE!i^RC`j2PNYYgokKOY?Se8QfpF5v3BTTtD+bHFmWJ^=Y zM$2bZ)EwF67x9MdPEJQ-@7`73--h?gDtmIYpF6gEbt4Om8dp(VRuQI&X0>m*B-27f zbu!$#v0v8ZTILW!qm7;vxl;B_{6AD)>LdUE=l~a7cT4?=M}$DEH94VTR-=*C4P#{c zD_?T^Y{X+!EH-(AkhnD}*3(sioZQBKB^sP@n!@OhMozRS1lXb&ri50ia%pCf`zD!M z7rUd^5Fx1wEoGyto(HwviRGq=BaPJukt=N`=)K!d45?RXL-;wMwh)Cz7C`ca%o3XL zCkl#(t0?7CItls#-PTysd?A4=2WfqbNeBZ0+R8>`+CAQXzcPc5m$sV!B z!V2@$%;Rt_FUc}fNa85@Yj&j4+^x?nlPgVX(^bE2nsXl?Wh&4p-qg6=rgxV5OKBnB z%-NfdvdOm1ZAnv9leKS`kF%3a*_zn`CIN)Gx{jjf(AF+mO$xMO@LBpQ000Ye>3-Hd zK*T*7$>xV`^UDAGutW&}gh6B0X@*W}h>VKeF$Td=QIkUySACj_L{O%n_j^Y4R|Pk{*^lgW`^}kbUc@R$TR(im6?r zm(BFym6AbB9RA99y^DyMMo7AdBwq5XapWnkt7){TDy56Lx|SuWhDDKP-G+14YcP#} z+go(AC`wm1jWM>ordm@-9kOnfRN7TKBIb-Z+&g=lP3wTC%MZl}H-32GtId9fRRyW?Lmn%VuU-M;_7#g>Ge*A({^1BK>C0DD7r;fs@BD z#S)`UNDhQ(l1yQ=GhA4F($rj8B(?MaU2^}Vbv!S@OkW6c1xP?wNn~ppk+)+?k&$TO zA@Z~n^~`j71yYd$sYHckwQ!cRj29Lp#H&+AD~u>ybc+mu#~P(5&s@&) z5NZ{C?9=emqn}a}ff|)TT5CbYAJY6x$wDbvGiuZ@?YTxNM^LDHEqfhpXqIw_L)Mhq zwmUY8-zoqBt*O4&_VOGepzdNunkEExlzVh$TCKmOV4_*~4zkOLio!FW^H78pQX3o+ zb?B+X4IFO7C0{~0|NF2+9SDR@WYf{;T>6L1+MPVeYf@p8M@%s(>O{0@DTJYnUc zBhRsCtb%kGac7n;_8~;~DI(bRNzF8a4lq}+q?0R(o?*?hHI9|uJquxj=~iNHB9^Fq zyzNVMb!|Us&SI+o(A8S@nD>c?cq({F9K&i>YR8SJDCVY?mX;`bOQJ)mOA{iauG%AQ zRCDs62&pBK_ynM$CI!IPUo`@5PsA*ELeccIO0SdX7e9_r1h9Ny2oer@`?0>n^l}qphWoUahtOLUOi^iM_OPB6yuI{ z>P--(fuw6Nq&p%KhCJ(OMW@)}^&}9A&s7JA0)tg0$&)OBabl}TmRFe1>5{jjOf=yH zZ6U%`Xkns);)^gZa9Ly|-SDpsHI~F~HApb=NE%Y2VZz+JbH@~2->6n%uKut3Qfc}h zQ9C&F#8};{gYt%ovEndtEG!?S3$wEggN7Le+d9_99~!Pz00IdXoQ`uaNyKb|r_qAq ziC}3W4%5CX(?}dJfN-P`!V+ppnc&Af$C+TQP-BG+Bbfi$@=42$XZ%&|?XI6kn5!|G zRD4{Fv?C$52?vdmuY3RdphPJEghgf1(dI*HhzuHvJjj_){hv!mu*0e^G->GcnUsNp zk)~p`q}{%h#CDN}a_x1i(Gu+QEJTQLcP#X}51XuER8XAC9RhMt!kl4=5PL1fu3Li} zKmY@!$!)u?i+OuFU!@Jz$|4aAGf^y!?C_t>3IvJcrC#RkFjm-RnQc6ZYto(e&!(kI zYD|`rFB>rlGg*|m7mlj@LHm1h)VZa(ySXjL!9hq6N2%d*6;2;Rdxg?jm1u!#9HklBafcTz} zA9%iPMpiOZIRT8zDD={$prQmX9^G+b=!o5j)>P$~dg0)f+$d*u*(DWx?#zW8+h6PC z9gf)RX@=J?X4k;H-TchfXl_v+=Y7rkieD`pC#rVR(ycJcNkaV2;28|kr7KMc#JXs- zl@HNccP{++ja2l)_1y3`D%-9P$_QRAL7xQVG*{TZ;lrLIV>^ zr%A#If*fR!I>8}?CbzldHh=u$gH!qMvo%Frk!ZL1lz9>KOY>Nyt^W&Rwb6~v){ssY zj`~0?<64u7ik|#3jn~f+yEcEWwujiSfngCKMjwoXb5RTT$tH7L%OG}2Xnc3Vl>jL@ zY;(87BuDBEAkdgXHo%pG|NF2+35WzkWzxCqG0KL`8iz2*oe-s?O6R1*q9QTr+?E)1 zvasyq+_=Q5JW2$PC_PjW3M}$d3_(2o^y@co%N3G}Rtl@Xuq@(a4P*<%&o?mK)UuSt z#%Wr{JRbCU@BSew&fRTa-hW#DuReFn{C?}qH8ka^-Y~SEFpcNUnxhR@B9TTSGz|@+ zM<8Jn2<=lk3eSqKI8Y5YZnAb94u=vkc)H-_>V)>kvapPb2uso=gCRYI*a=cnLC_|G zpsl!^PDZTwXYNNssNkz0NQ-l>OG{XqTI$-PmwL3fH*vPPlefJK8jTX(Onj?x3~;atR7}QkHS$i$M;)oO+{^MHr!8 zljk$Dmvf)Inc4p>;Ju(s%t<`uh*iC8+*X?eg|979^YAJZW2$v@(E~jPB;+ z{6&)K;gW+MtZ5@gSNY4G#iOPDVt@)$OKk89fa3%3R3!&Ogh8{3M6&~uDUogkj|HjG zSQe7OfX2#amdta=NuWu@r1qHIq{SAl7Lg3QxI*{jw)!pl9t5X?Muv3j*o1NiNT_VR6+J?%l87F3tb@&_p5t1ovps9X)^uqs!(tni{VtX zpCqPvK%6wma#3n39#Sb|9u3b$&A4QmIM>EdE_ETHWxB)13Yc4U|7T)_m5VITRpswS z&ROG?ab&o=5Rd!UCbipnr(Me&w`4XfyKmH?TWuAeQTJWgw$C#P*DSHN8`T6ej`&+n zt_daQhDHERj5uX3f-rLlBlB1*&k?XF7 zkubqz;b^E;QAuR^yPAi<8FW_UO*GHU4Ud^QAUFlcH^+nv=`NxsM2*VpFMwbH4jhqN z2Q)FA%neYyzF$n=8iQ9bbG?wV!wD3dNTsfv&? zLV*C_Gy#B+FfxJ$Y>olLfegn+^X5y%+PVaAS6|NsC0|Nr?1qJjmJiaZEo?BOz6 zbJ8OkyXwNWWs(USOSYXgte3(W@c;Y3L=B9_Qf}0bVc-J3?W(fpyZ}{gwN@-7*P2-} ztAz6+nGiD2cLaA#!&HGkUP!{o z(`-YG@&nfxH^0gn*2@v8!VXo5H7dHw%GXgN(ga!b+S!{br;Q#inJ3#L8@j`e;o!e+ zbvrYz`*5`jaPgge){wm=Us0$4_exbtKx6^Hwgm)vCQ11>p~8P8NZ7BAkyzeB&cX_C zkkRQm*OJq!oABc^9Lp{Cg4Xu2^@j%UO1Q~bxRPkzJS%11pG&R4is}nDyl4B5x!IYg zjQ*2uTwzTbw2t~7e(9U%Ule_scIl}}cM2{fv)UsDU z`xE{;hNn($1Llu+-I+TrL}HF+>{-KOjn0=5A+cqTqprArR^wFbS`*W*92<1!mf3ZT zi@?#Kfb0EvHrBnhZ`HYG?(5NQZn}>yrJA+2V70$mwnl3^nZFI0eBaOV-z>W1T}AaF zJB`cMEQ1wMu>OyV+z*SQPb*11_P*>@l+J&SQp(%O^|>;M1-yOSa-*`^+m;RUqb@?N z_AC6MEo1D-sUHpGx)7cT7vLsjS6rtZ`H!iKJ|fUZIw0igJ$%swLg+MKJy?*SHwZIQp@N zTk_0E`pTDTyBw-%L(hlaETLRu4=DAq7QPtB8>UT~F3{5lJ+-^q_NaW^N*08(T~tL6 zW+?h_=N;2hg#_{tmB>g3d8Vr5fTk_2<-jCHy1W83$rpN-$kKJtb%O{(CuN2R_}i^G zHe3x(3q#nsVzcEWgVlueNFb{qEk7@A~K z7?cNQU{um6%iPtuBWrl;b+F$6VVX=`@lpW48=!fRErEY0-CIvl3@m{REeQX zOt92~XS1ovgCe1rlzej&2I`q!fEh?Jae*qi*uVd^6?R+>Z=nqn&gl_It{X4vLm|tSbt%X zk3-j*zVz((JXRX$b|a2NjP*JU*WGpcwb3};rfRMEsXITClUr`q+LM_aM@y$h{vtKa z*1%uQx@wmz_v-Gupa)Th(pe9PfluTOCMgYxfkjj=PN=Fqf)E`6aDe0(2oh{%ax$`m zBx#h5saU9b!i(meXo|Y__ydKKc#(Btn$^ZO*oEu)cwZ4se<1suTEM{ki zkb}mRu2Ynq|(V@06h$u4;F$6RAA9i-nFGO=N4mL`R6 ziaCYgViS_|EO_7RJf-|Qekf7^002=bclOO=le9)9<$g|Qh`T^yxj>S*mo12;^rOg8 zIm*IOA`>1_1x9DRHcoj)B27V09~q?*N1;JoQng>q|7W>h5|6K6-=EpH=Dg>;YM1xB zZ(E8IO3dP2RU~EHzQn4#Ban9Xt!Ar+-`UNVNR0pcphP){1U+cj>5VjqkPNztV8gBu zDT7-_nH1_2vFtSSCcTwu$)&X&P)Lf1$*bHcv1p~5m6}ih0R>4UMPEW{6VqWdL}F&{ zI%C6*p==?QVIoAKFjB?$e;O2i#G0%y7bbSBaVMrpsWX?+cOHQZ-AJ6;HA^dL6Q~Po zV@1;xnUv~0tu0ls`MJxpowj>E!#iT7;-@>GFI$-PDlR>3^kahJUd#}#9JQF*OEXd@ z+a)6~YIJw(W(>lh&eWGkfI(n6G>a*&Z4HKGnB3fO;!ket%Y>z#TKKw)lt{c zzZy+&HJEjl2*-x@tdyC0%tYKmRH!WI-rbI_6mk=zTDsMY%DrQn;_VuzQdm(0ZdYDu z;k(%v9zly5)aI3SUD@x@(=KGGrI{QvC$=pL?JkN4kEmHJi<1sfg48P;ir|$r03a8A z+yC^MI*6&NIsC5`kTi4U(yqx^E4mj46e+$0pvyzE`IEHIiK1E!J<5$XW%_xVp45Eb z{8obY6ag ztx=7YQ>U4Aq3klL%)<^fwHlQcrx3KdshvT^nt3BK+)+L|xa^+i@ zm^V!VFb|YhBJgnHq>Q9`bqu;mvGcY(>v*V*=C(Jx@$+`|P=s29(OscQXywmo71rAa zJgDh}RcWTwtH;7pVyygiw31$r)bkw6Lns=Qq|z9XZLrrw0*TB2)^<>93=ql+lra>q zFkl$v==FvvX*yi|R}{=@Q-&Lme@EY;Byif%PZP3oXPfq0Z5HQI4dGXM(apzR(A}l6 zdCG%*qk~zpyKZC5<5ttjN&oTcdY30o!K$)UJp)Ict72+mVp{3>;m?O(9_G3^osM!e z{H+qy7JJ&py{uj5Px8y^YET}#OPgsgeE_UJoDkBaDPTZNfRX7-A<1 zpXH7%Go+}2M({kcmlTbdH8aZ2k2;>;)t$4BJEM&gHayVGR!fqSmc}`go5G*wXKscd zN`!01GT&vQcx&H=c=c10@`|T1KtjPp7Gxv{FkyjjiW@Lo6qe9x04Ynfo3RnB1+YC~ zcQ0y0@^Bv2M1YjHS7{NQ#)U1JqGWTu>-2pky%!#KvRNy9Q-yevHaP zJ%&|L?VCt!Fwp8Ivgpk8qGegPK-F;QZ(iQpO>WobIL&LlYC9fRpGC2=rLU|`-F4H} z(5-c)>%IQ7PfHe@w@cfw;d#>xloutocgb=_S{W-Y(ynLnR7HpaKqiUv*0l7%vweX% zZ^g<#D4!|39$XJevN2}!J9v6m&A-fbTc7e}973v9QC|Lf*Ab#p5EGiM~ne2Xyas?BITzdb^Uc57#egQg+l zOJ+!#&)o%rf7`HJP(w*rb>m9j$!Fko(mM-%IL4KP!F$}k3Y43Hx$NLn2;$5wq7x?q z%y+%$`$oQPK6{CcPa_{wN_=0*9t!wH3WxlSPCUh_WxF)N?$ zo7oTH@wvqu6ik5WPY3Nk%6~OGh@Th0!E=5#6?xBnm}R z>0Q-Cy~9C$Ng?Alw!}csm3ZgJCcUNe-xU>qMpRToN(zYm+V>A~j69KPN3lXiz^U^= zNre==q#QW+I6}mKY6aV_y#EZsL?umC=xI~ceP~Z)rl)b6|NF2+3yef7WYQVzLTZZ* z3S&JcZ4rs1Mr<(4;t(@worIZPL}qYg@q^k{wkxplNFeJhX5YgFF6{Lp=wXFitCc-n zo|d#YkFR1)Fawzr|-P#?ln)MQnjCi+apA8!-rz&&7~ zj7CHvM2)DNl#@ir{wp{(eUkFYp%JH0K~|>PG>l=v3eLQRQP(LP@$Y#Fc8EV)_%R07h*3pi5ZUkA-`=|H4l!iXrAEdU z#w)A))-yikmw+iPv%|@XAxlw&!B?fQ1QQ@-iJusmK1El;*mJ0q{;VUSWVN0AyvOq` z$p358>0ONL%gMXO-LjWtjM_`ML|cPc=VfS*cCaK}kO{8*<{JD{tK*EkR`7 za_@3XLZ33dHNNXrzMNVGr+V|KvXV4_yb50eibRi{utXvN!{lhwx#>ap zhHTnXJtk#Sg_B0~_5doUv*^yA@C7Q2A4HG06=SaKZ7jOv*H){G1%`1q6?qO#@7zZ! zwM*EL({J5i7l>qE2KN_geQ><(S9+ zcbx+gLD>32HJdKKFaG_zJpTKV`Dn~XcjeQ&!$*JHd!m?18_BrZq>W@b%wRc8({1Oy zp8F@FA_M_4?Qc3zgSd}dJK(C9E6GB@-4$kgE033jTA;T2Tl!^ji6ykexPHxXr##~6 zEZ1iz7+wsI%c-_gFy$xI9xsN@S0T-A*8H)>505Od9rDmU`0I%eFB0aghD(AQ`*F*x zTAlN~O8T|bo8wof%Tq5_evMKd-P(QrD#3Q%#nIgxO+7`iS!8(v?_#@s zvsol8D*;Dky$w7KA)b~JGewx4jHshD^h1k@=FZB+fty8P(HVgq0Y1qUNj8pcM1uzp zybZ<6ou9X1nhbXhJyAdUg2z3s;U9I?KC2(K>*@>{qp0&XFa7l{XN8{izW%m_BC|f< zF)5faaaP~yNN{L$KaZ=yrl{M!`ev^t)n&z-9Y&;B&?JQ08U{V6)bf#cXd7{bXf|)V z|NG!XB!CCthSr{9 zi6HTCy7SCQBq5p)hq;Hg%o)M(_cHdGBE%SwAmo8Smn^7Y4v}vl<)S#cnRL|Hk{-!~ z3(jI4p*k1D6DQ7?DDhmfnKEB4m7JYEMFQoAAReGySrc=``X;J6e6(7eFQ!y9S^Fbj)2PEjAZ{XaUk7R~djYp~GV!f|C=QW+t~~ zD9x+BWVO;s`&~6o=u4S zZxCVN41fZFSPqeM0KVt{|NsC0|Nqb;b94)afB+Z(1Qh}ofyq{BZdkk4xu{AEd7=hC zY_dxzOSE!)U3*KJw45>r#OFwJG9U>(i8`rFPXSC4d@7Lpm(_B*3S7Nl*I-u0Q)Uxe z#d*qcn#PDy94*kHut(dBR<^ooVo?aciIN4Wu6efHu-Os*qBbj#g2}B!%wejZ!a`bD zk#JiYbFT|`L*wM=HyTNxx|@1Jk5>pfaBz1HHdO5H*44&bROXeZF(DYpS$HnUqwMfm zViEHCU@e|U>DV_TllW$dY(EaT%SxiOONTL~6h2O2fFJ=9pNM|Gd<2Ssbg>T>geba` z^*TW3FG__BOHGfOYybcM|NsC0{qvpTzW@LK|NsC0`qD$giG%|H07#HVD;gbKV=3B0 zp;$Nt+;PY>V{WC84W-7^o)}cbNljg`Bo@uMiyC--9(z|^WCz$w(YZR*^Q&2v>@13L zL@6ze^lYUTmLowe9F1kPAw0!q2(l$s(1v@wFGkcNX&molf~L*mL42)_eK1R8vEp?V z4QClRM$xuKAuCZJSGTG4ZMVOTX*8W&$XjJfGpqbcxmR144EJF}qcXokPGHR;Zc3A| zoTn0sxlO>2AtnIwC|L#J=1JE#Bu|NsC0|NsC0|NsC0|NsC0dKVzd2nYaq8CpuN$04lP zvoC<<)AELqEx$K*qa;G2q?o}$Oc4ngA|GC7R5??cT6t76+{S3?m{dr5|NFp190Em& zc~r+?AONz>s-f&K08)vaRSYEs%6qgb)q^AfNM}qQwiQ)3)gxkTZc5scT8lf;vDbFO zqtN)m+tuMm=JwW7N|dBNX{gRxtEj7VzOrt3$Ucr(a+B~zDfSMal4Z-AC&-RkgvVG+ z)WvHg5=O=xFrR}emPq)8V|Jt=wu($Ztut?nC}QTJcZe#h7UKg$0)w~hj@L)A#i zA-MM>cj@I*k?3vW%8l(mqhta&{(6UV@|l^^*CW>BPWoyb*6bNI(fjP7`(KSVxWwYD z`W61|FxR~ou!_gWPcd|Vyz{Rz?VgF8X4y+#&&91>>wlxG7^Q3M#rpKJaSX1!YD$nf z#5>Wm!;8woIso{vJ3(Blu_P$Cuy%B0%cb;uzHF-XGgj|X7EtKLmZm~-kh?Xd=h5zO zS0H;S^E1pLA5sVX)AYCGAP$5F3Z+)!lec1h+ash693T?5Ny)^eWQf^`C@Hf9v}q=i zJCYoE1y(sfJ&r-9n4$Q9)E~qaD7JoKR=gbw+dX#rNXi=!s*vL%eYRUJ^xK0-=&ONjkf8 z%8FS{Nu5goKf@b&XR02ys*m#R&=0DKm|(vk#i9MRZt_j$!iN%D+~~ zkvB}Zm7LRgll|Kw0Rh5EpSmGKYP8bDkS;4sWY0P~WvfV6L8C?&MwZZTvBaZ1txX9O z=~*;!MT*T*(5*Eg;>9k@MIAeRPdv+OOZUt%qNFhQGAfdI7HdJIP_P3C_b-(H`>;eT z03^n4(<$jd@}4a^h%m{XQaPDOOeDj~XEZ56geG~eIqu{X*(8V=$Q+s-FoG^q!0_Z* z4SU@#DMurk6w_AHRB%daQa*8GGczXoN&&RMA^RO~6fL zQa-{qWVdE+UP#d_Xc1{7q`b>9Hp;|@6^lkvoVi{3@y%+n0F^N=a=L`Bx5`fF0b8iL z<-R6TnF^h8-k|C_5?QfhrK1rR$hA!!t69><-fBc$mz(4Wd?ikBtxX2QE7cr!Qjx~D zY%B=l7bVgTs@t1>-}-isdUl^Ib{d2~-%B{LU*Z(hR3r1`GnE<~XMXR<6{!m)K!7e1LK@}XBCWcV6Q#m)RI7~e{(N3c@Y}Q1h4=`|z2V6_>-oG^+ zzjT*>zISnLLmHPNymm?&se{v`*=dbI(AB8TMr$;rO{3PC53sD!B0#%BX|yFWtS2j2 z;iF>76S=LWm7%i>H7=aia?qP`@@r8z#V{mJZc+C8di4QlW<_Rgx864eI$h)dasbK2 z*h(B<(BqXcJZ&=LWQi5S56u@7uU13(*C^=^7mQu1f1Q@*U`v(%$%{QnS3hi$>;L

TZ9Vo_lM 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≧b7W#T`lVV-p()%MNo|yO+$RS4{94(q zNcjzZ^DJ*%;5f$1i^<->wRGuBy!QY5utY8Z1hhg`o?+=A#mvfg%si43v3o(h^nfZ{ zE$DZizy*hVRyXVqp}EGTkoYj*ZTva5-8?8d!#tS9b*smbstnL-*W}K#iR^|1^_)1; z5mz@>zx01nzyJU7Pyhua4%{=2N}MKkR}i@bEoAFh zWj~P!_Q=Ups=d-W1AW?|M>>^yfRTowfV-6nY=WdX-ld$OIY5ltoU+XwKX$3!u~`m= zbLt%~`9P0kP#Frx>?h;)jHhBtD+7yz8@TseLuPA-J52ErDgu1{ZRIV6U7Mqao{w@A7z5lK2<5buCz5m`NeGTni(d^7veRtFU|Nr^c zl4A|^lnEfIZNC>%kcFw|bgfp9WmAM?%vPp~OA%%Xc(ce(u4LJ{E_6&@Y?RZ|PPLaZ zUQKGzZGl<`xW*>I6Qrso=G?6d4=&}Jn`8vmK-3vQg_ZYh%-Wa8=giEbNGhl0S4qQZ zd)oDOoi#Ky<#{H0$<5@eMfRGJJlu6vvU!)Q!hSEELZ=DCHZ_*=rUCR)<0~kTI@$mL z0dni{FIFB)>bkciN8Cf9naVq2g^f(vd7*{JC`-&euGM0K@uCz9kMSO6(k06%#20n1 zZ8J>!{jjjVnt%PO!233FRqDDVuAMh{(cSOsj5s zt@Wf9nOR2r^zRUwZ;agQEoUiKrhnq%$WIzE)=ajG>6|NF2+5P$>nOVR0xGHjonwDS)15=9eNZe}u>B8p9g;rxUX$0*LvX9+@?N&Cy>H(2u*$fZV9j7bXK%-oh- zBHV|o)m}vW)}w$ZT|ukQ3odWEvn9RNO<|p2%$^tEmy|GdUJLB&H*_@J3IX>odV+|6 z000#2yMiI$W$i7aLIfpd1pC^pxTO+RRWz)0h5T;KvfY@3h3jO6te+#FJfCS)>&rCS zZK%ZQ2giHJF%%w~?Ic#Oe6tt1MkhN2+Fdx-yv;KkhdO=M`+a@OM

ERGO9_AqJ{o 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