From b08395ee27509f8a30ae80b038a2451d84130dee Mon Sep 17 00:00:00 2001 From: bancika Date: Tue, 27 Mar 2012 02:36:31 +0000 Subject: [PATCH] lever guitar switch --- .../src/org/diylc/presenter/Presenter.java | 2 +- .../diylc-library/lib/diylc-core.jar | Bin 196216 -> 196217 bytes .../diylc/components/guitar/LeverSwitch.java | 370 ++++++++++++++++++ .../diylc-swing/lib/diylc-core.jar | Bin 196216 -> 196217 bytes .../diylc-swing/library/main.jar | Bin 181231 -> 188791 bytes .../diylc-swing/update.xml | 16 + 6 files changed, 387 insertions(+), 1 deletion(-) create mode 100644 diy-layout-creator --username bancika@gmail.com/diylc-library/src/org/diylc/components/guitar/LeverSwitch.java diff --git a/ diy-layout-creator --username bancika@gmail.com/diylc-core/src/org/diylc/presenter/Presenter.java b/ diy-layout-creator --username bancika@gmail.com/diylc-core/src/org/diylc/presenter/Presenter.java index e66354dd..928c45a7 100644 --- a/ diy-layout-creator --username bancika@gmail.com/diylc-core/src/org/diylc/presenter/Presenter.java +++ b/ diy-layout-creator --username bancika@gmail.com/diylc-core/src/org/diylc/presenter/Presenter.java @@ -56,7 +56,7 @@ public class Presenter implements IPlugInPort { private static final Logger LOG = Logger.getLogger(Presenter.class); - public static final VersionNumber CURRENT_VERSION = new VersionNumber(3, 6, 0); + public static final VersionNumber CURRENT_VERSION = new VersionNumber(3, 7, 0); public static final String DEFAULTS_KEY_PREFIX = "default."; public static final List> EMPTY_SELECTION = Collections.emptyList(); diff --git a/ diy-layout-creator --username bancika@gmail.com/diylc-library/lib/diylc-core.jar b/ diy-layout-creator --username bancika@gmail.com/diylc-library/lib/diylc-core.jar index f13796cf834a689b4120e1d3923c0f60371df855..24ab80a4b050d55cc18aeb41314747740fedd8c2 100644 GIT binary patch delta 3932 zcmY+Hdsxlc8pro~ceNX&js|I;RrD@L=$eZRVHD zF-)S#UFnCJ=TI({M08aug>Jh$NjG!WTJPHPJg0y5$9ws{?|Rqzt>4e5exsg#Ba=n* zlsbkA_E&o&Ho;_+vgStY^~ugeS#cv)9YGwFujuc0WF)hzFA_H;4O5pB5B_TcW4PT1 zy!gMjzyuLzr#8*eQ|Eypx0k^<{%fdoRlcVAla+n!H_c0@6<9)=i(Wj!1%oIATjLQ* z?wUT>0WA^c)*RHamWAB2$jYAZa#2HixM98Zg+UywhemKuTCBY_F{K6kE~+Yh13{tK zt)uqWv5_91Gb$7VVflrq1hpEn8#nHqelCl_7>ePQ6=Q6X_ zkH>!EHm*W=9hIxgU6=kP#i`Je5}%Hi@Eu1GI=?kQ*XLcfIy~KOZxSvi z^ZRyO&eDqUa)eT$XwX$3i5()Dy##}_%0qD&wIZPh1(qE!&6S)#iq(EheZYg&p_h~Rns02e^jSrVCTXK``hf?z?Y=~nmaf@~5^inZ zBi!!%j45}zdeI{H+((EXFz0YHfgAw#B+3p-GLxI+zw45GCAUp7B&oQX4EKclA+%PI z+CNhz>za}c7#nR)5_k>S(27jQtob&i7j1KF$xo=R8A|5qa!qe1vJW*aciH+UQ_VBd zRSi+eb8G&Rrn&vJcf!O!yrDPO}}^K-RK zJo*FOnIj-wm5Ghi+ysVl)jvrR_Pl#DX+)W*tps;f-tliT4U623BQZ!*c93aiywkYD zB*1{vy+o3U!>J!}d~Pru&JxLA2`cG!GZ@L&Pm$G_YjcMD7pW|XSl}vK&XZ+Gvs1}p zq*Is4HjJ~ouFc(aX>sWqvi;U%Q8NU%dOfbAlHeuNIEHVe_@k4S6DJGW` zV%)-fVvDx*1!N~udm)KOiYg_ykX$QB8FZ|FDazT%t5*HomnHjiASGqw@zGe#M{N|7!m;t?R=?g?IvH-mI zWsMcwL)#S_z#B$hVGG2B$A!Cq3wrmDhPzhWHqRH7mh2{z0|TLhaGLoQWb&7zY!C(+ zU{1Y$3rE{!XVGR{2PqUICC^0oLTX(N`f|tLppf5$a`tLigRwT>q!ixtq_N*96i$D{ z>Pg%CL04Y27PfdUyd9P7k?yue>9oH7ena%N(37uvY#r7*#H*qYT{}F@ctc6dZr64n zy(Q7!c8Z+Rntc{^TPlN_=QqB*VY2Ppwq2Kg*VBF+=(CRl*(nja?RoR|8QO;4-vW1R z&FNQ|qQkurci|b@CS*Y%w@G^+!DKcIDeDnTXAhC2lTAMg=%z_t*)Wm2HfF#vWa8*4Og5#gTS3GN<7OI{>Ft_*=z%ss^V+9b-;bQ?ra)@{ip*$v23yv>f zHMi`20joGPzYrz-3Sj{sLIMLe{@Oy?51Y^UBGK5cB3Q&-#YM1~!<%r18tK*7z3u7+90~?Z4mMSjr8m=*TF`y?!rb<(5^}7L^jdgV==!q(H&-B zp%F158qw5QjTm;ThCa0{W@@vr>~E$eSQ~}S)WyKDMO6Q~MGWb7i)dcIRSYSxmF_SL zKG#ZT!vwopg#7K%U7%avt~?GaDyz8-OPz3mats826_ zq}Y{wuoqTvXzHag%rdKw#xOY5N4J1M8wC>zet*2yr1||YV>mP2Zhd>{n!Q4?Hb9|p zWB*YVf9H1EBuX{iU@d)_NWZ M!Am#h5sg;-4{bWQO8@`> delta 3891 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 diff --git a/ diy-layout-creator --username bancika@gmail.com/diylc-library/src/org/diylc/components/guitar/LeverSwitch.java b/ diy-layout-creator --username bancika@gmail.com/diylc-library/src/org/diylc/components/guitar/LeverSwitch.java new file mode 100644 index 00000000..11e9b520 --- /dev/null +++ b/ diy-layout-creator --username bancika@gmail.com/diylc-library/src/org/diylc/components/guitar/LeverSwitch.java @@ -0,0 +1,370 @@ +package org.diylc.components.guitar; + +import java.awt.AlphaComposite; +import java.awt.Color; +import java.awt.Composite; +import java.awt.Graphics2D; +import java.awt.Point; +import java.awt.Shape; +import java.awt.geom.AffineTransform; +import java.awt.geom.Area; +import java.awt.geom.Ellipse2D; +import java.awt.geom.Rectangle2D; +import java.awt.geom.RoundRectangle2D; + +import org.diylc.appframework.miscutils.ConfigurationManager; +import org.diylc.common.IPlugInPort; +import org.diylc.common.ObjectCache; +import org.diylc.common.Orientation; +import org.diylc.components.AbstractTransparentComponent; +import org.diylc.core.ComponentState; +import org.diylc.core.IDIYComponent; +import org.diylc.core.IDrawingObserver; +import org.diylc.core.Project; +import org.diylc.core.Theme; +import org.diylc.core.VisibilityPolicy; +import org.diylc.core.annotations.ComponentDescriptor; +import org.diylc.core.annotations.EditableProperty; +import org.diylc.core.measures.Size; +import org.diylc.core.measures.SizeUnit; +import org.diylc.utils.Constants; + +@ComponentDescriptor(name = "Lever Switch", category = "Guitar", author = "Branislav Stojkovic", description = "Strat-style lever switch", stretchable = false, zOrder = IDIYComponent.COMPONENT, instanceNamePrefix = "SW") +public class LeverSwitch extends AbstractTransparentComponent { + + private static final long serialVersionUID = 1L; + + private static Color BASE_COLOR = Color.lightGray; + private static Color WAFER_COLOR = Color.decode("#CD8500"); + + private static Size BASE_WIDTH = new Size(10d, SizeUnit.mm); + private static Size BASE_LENGTH = new Size(47.5d, SizeUnit.mm); + private static Size WAFER_LENGTH = new Size(40d, SizeUnit.mm); + private static Size WAFER_SPACING = new Size(7.62d, SizeUnit.mm); + private static Size WAFER_THICKNESS = new Size(1.27d, SizeUnit.mm); + private static Size HOLE_SIZE = new Size(2d, SizeUnit.mm); + private static Size HOLE_SPACING = new Size(41.2d, SizeUnit.mm); + private static Size TERMINAL_WIDTH = new Size(2d, SizeUnit.mm); + private static Size TERMINAL_LENGTH = new Size(4d, SizeUnit.mm); + private static Size TERMINAL_SPACING = new Size(0.1d, SizeUnit.in); + + private String value = ""; + private Point[] controlPoints = new Point[] { new Point(0, 0) }; + transient Shape[] body; + private Orientation orientation = Orientation.DEFAULT; + private LeverSwitchType type = LeverSwitchType.DP3T; + + public LeverSwitch() { + super(); + updateControlPoints(); + } + + @Override + public void draw(Graphics2D g2d, ComponentState componentState, boolean outlineMode, + Project project, IDrawingObserver drawingObserver) { + Shape[] body = getBody(); + + g2d.setStroke(ObjectCache.getInstance().fetchBasicStroke(1)); + if (componentState != ComponentState.DRAGGING) { + Composite oldComposite = g2d.getComposite(); + if (alpha < MAX_ALPHA) { + g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 1f * alpha + / MAX_ALPHA)); + } + g2d.setColor(outlineMode ? Constants.TRANSPARENT_COLOR : BASE_COLOR); + g2d.fill(body[0]); + g2d.setColor(outlineMode ? Constants.TRANSPARENT_COLOR : WAFER_COLOR); + g2d.fill(body[1]); + g2d.setComposite(oldComposite); + } + + Color finalBorderColor; + if (outlineMode) { + Theme theme = (Theme) ConfigurationManager.getInstance().readObject( + IPlugInPort.THEME_KEY, Constants.DEFAULT_THEME); + finalBorderColor = componentState == ComponentState.SELECTED + || componentState == ComponentState.DRAGGING ? SELECTION_COLOR : theme + .getOutlineColor(); + } else { + finalBorderColor = componentState == ComponentState.SELECTED + || componentState == ComponentState.DRAGGING ? SELECTION_COLOR : BASE_COLOR + .darker(); + } + + g2d.setColor(finalBorderColor); + g2d.draw(body[0]); + + if (outlineMode) { + Theme theme = (Theme) ConfigurationManager.getInstance().readObject( + IPlugInPort.THEME_KEY, Constants.DEFAULT_THEME); + finalBorderColor = componentState == ComponentState.SELECTED + || componentState == ComponentState.DRAGGING ? SELECTION_COLOR : theme + .getOutlineColor(); + } else { + finalBorderColor = componentState == ComponentState.SELECTED + || componentState == ComponentState.DRAGGING ? SELECTION_COLOR : WAFER_COLOR + .darker(); + } + + g2d.draw(body[1]); + + g2d.setColor(METAL_COLOR); + g2d.fill(body[2]); + g2d.setColor(METAL_COLOR.darker()); + g2d.draw(body[2]); + } + + public Shape[] getBody() { + if (body == null) { + body = new Shape[3]; + + int x = controlPoints[0].x; + int y = controlPoints[0].y; + int baseWidth = (int) BASE_WIDTH.convertToPixels(); + int baseLength = (int) BASE_LENGTH.convertToPixels(); + int holeSize = getClosestOdd(HOLE_SIZE.convertToPixels()); + int holeSpacing = (int) HOLE_SPACING.convertToPixels(); + int waferLength = (int) WAFER_LENGTH.convertToPixels(); + int waferSpacing = (int) WAFER_SPACING.convertToPixels(); + int waferThickness = (int) WAFER_THICKNESS.convertToPixels(); + int terminalSpacing = (int) TERMINAL_SPACING.convertToPixels(); + int terminalLength = getClosestOdd(TERMINAL_LENGTH.convertToPixels()); + int terminalWidth = getClosestOdd(TERMINAL_WIDTH.convertToPixels()); + + int baseX = x - terminalLength / 2 - waferSpacing; + int baseY = y + - (baseLength - terminalSpacing * (type == LeverSwitchType.DP3T ? 7 : 12)) / 2; + Area baseArea = new Area(new Rectangle2D.Double(baseX, baseY, baseWidth, baseLength)); + baseArea.subtract(new Area(new Ellipse2D.Double(baseX + baseWidth / 2 - holeSize / 2, + baseY + (baseLength - holeSpacing) / 2 - holeSize / 2, holeSize, holeSize))); + baseArea.subtract(new Area(new Ellipse2D.Double(baseX + baseWidth / 2 - holeSize / 2, + baseY + (baseLength - holeSpacing) / 2 - holeSize / 2 + holeSpacing, holeSize, + holeSize))); + body[0] = baseArea; + + Area waferArea = new Area(new Rectangle2D.Double(x - terminalLength / 2 + - waferThickness / 2, + y - (waferLength - terminalSpacing * (type == LeverSwitchType.DP3T ? 7 : 12)) + / 2, waferThickness, waferLength)); + + if (type == LeverSwitchType._4P5T) { + waferArea.add(new Area(new Rectangle2D.Double(x - terminalLength / 2 + - waferThickness / 2 + waferSpacing, y + - (waferLength - terminalSpacing * (type == LeverSwitchType.DP3T ? 7 : 12)) + / 2, waferThickness, waferLength))); + } + body[1] = waferArea; + + double theta = 0; + // Rotate if needed + if (orientation != Orientation.DEFAULT) { + switch (orientation) { + case _90: + theta = Math.PI / 2; + break; + case _180: + theta = Math.PI; + break; + case _270: + theta = Math.PI * 3 / 2; + break; + } + } + + Area terminalArea = new Area(); + for (Point point : controlPoints) { + Area terminal = new Area(new RoundRectangle2D.Double(point.x - terminalLength / 2, + point.y - terminalWidth / 2, terminalLength, terminalWidth, + terminalWidth / 2, terminalWidth / 2)); + terminal.subtract(new Area( + new RoundRectangle2D.Double(point.x - terminalLength / 4, point.y + - terminalWidth / 4, terminalLength / 2, terminalWidth / 2, + terminalWidth / 2, terminalWidth / 2))); + // Rotate the terminal if needed + if (theta != 0) { + AffineTransform rotation = AffineTransform.getRotateInstance(theta, point.x, + point.y); + terminal.transform(rotation); + } + terminalArea.add(terminal); + } + body[2] = terminalArea; + + // Rotate if needed + if (theta != 0) { + AffineTransform rotation = AffineTransform.getRotateInstance(theta, x, y); + // Skip the last one because it's already rotated + for (int i = 0; i < body.length - 1; i++) { + Shape shape = body[i]; + Area area = (Area) shape; + area.transform(rotation); + } + } + } + return body; + } + + private void updateControlPoints() { + int x = controlPoints[0].x; + int y = controlPoints[0].y; + int waferSpacing = (int) WAFER_SPACING.convertToPixels(); + int terminalSpacing = (int) TERMINAL_SPACING.convertToPixels(); + int terminalLength = (int) TERMINAL_LENGTH.convertToPixels(); + + switch (type) { + case DP3T: + controlPoints = new Point[8]; + for (int i = 0; i < 8; i++) { + controlPoints[i] = new Point(x - (i % 2 == 1 ? terminalLength : 0), y + i + * terminalSpacing); + } + break; + case DP5T: + controlPoints = new Point[12]; + for (int i = 0; i < 12; i++) { + controlPoints[i] = new Point(x, y + i * terminalSpacing + + (i >= 6 ? terminalSpacing : 0)); + } + break; + case _4P5T: + controlPoints = new Point[24]; + for (int i = 0; i < 12; i++) { + controlPoints[i] = new Point(x, y + i * terminalSpacing + + (i >= 6 ? terminalSpacing : 0)); + controlPoints[i + 12] = new Point(x + waferSpacing, y + i * terminalSpacing + + (i >= 6 ? terminalSpacing : 0)); + } + break; + } + + // Rotate if needed + if (orientation != Orientation.DEFAULT) { + double theta = 0; + switch (orientation) { + case _90: + theta = Math.PI / 2; + break; + case _180: + theta = Math.PI; + break; + case _270: + theta = Math.PI * 3 / 2; + break; + } + AffineTransform rotation = AffineTransform.getRotateInstance(theta, x, y); + for (Point point : controlPoints) { + rotation.transform(point, point); + } + } + } + + @Override + public void drawIcon(Graphics2D g2d, int width, int height) { + g2d.setClip(width / 32, width / 32, width, height); + g2d.setColor(BASE_COLOR); + g2d.fillRect(0, 0, width * 2 / 3, height); + g2d.setColor(BASE_COLOR.darker()); + g2d.drawRect(0, 0, width * 2 / 3, height); + g2d.setColor(WAFER_COLOR); + g2d.fillRect(width / 8 * 3, 0, width / 8, height); + g2d.setColor(WAFER_COLOR.darker()); + g2d.drawRect(width / 8 * 3, 0, width / 8, height); + Area terminals = new Area(); + int terminalLength = getClosestOdd(11 * width / 32); + int terminalWidth = getClosestOdd(7 * width / 32); + Area terminal = new Area(new RoundRectangle2D.Double(width / 16 * 7, 4 * width / 32, + terminalLength, terminalWidth, terminalWidth / 2, terminalWidth / 2)); + terminal.subtract(new Area(new RoundRectangle2D.Double(width / 16 * 7 + terminalLength / 4 + + 1, 4 * width / 32 + terminalWidth / 4 + 1, terminalLength / 2, terminalWidth / 2, + terminalWidth / 4, terminalWidth / 4))); + terminals.add(terminal); + terminal = new Area(terminal); + terminal.transform(AffineTransform.getTranslateInstance(-terminalLength, terminalWidth + 2 + * width / 32)); + terminals.add(terminal); + terminal = new Area(terminal); + terminal.transform(AffineTransform.getTranslateInstance(terminalLength, terminalWidth + 2 + * width / 32)); + terminals.add(terminal); + g2d.setColor(METAL_COLOR); + g2d.fill(terminals); + g2d.setColor(METAL_COLOR.darker()); + g2d.draw(terminals); + } + + @Override + public int getControlPointCount() { + return controlPoints.length; + } + + @Override + public VisibilityPolicy getControlPointVisibilityPolicy(int index) { + return VisibilityPolicy.NEVER; + } + + @Override + public boolean isControlPointSticky(int index) { + return true; + } + + @Override + public Point getControlPoint(int index) { + return controlPoints[index]; + } + + @Override + public void setControlPoint(Point point, int index) { + this.controlPoints[index].setLocation(point); + // Invalidate the body + body = null; + } + + @Override + public String getValue() { + return value; + } + + @Override + public void setValue(String value) { + this.value = value; + } + + @EditableProperty + public Orientation getOrientation() { + return orientation; + } + + @EditableProperty + public LeverSwitchType getType() { + return type; + } + + public void setType(LeverSwitchType type) { + this.type = type; + updateControlPoints(); + // Invalidate body + this.body = null; + } + + public void setOrientation(Orientation orientation) { + this.orientation = orientation; + updateControlPoints(); + // Invalidate the body + body = null; + } + + public enum LeverSwitchType { + DP3T("DP3T (Standard Strat)"), _4P5T("4P5T (Super/Mega)"), DP5T("DP5T"); + + private String title; + + private LeverSwitchType(String title) { + this.title = title; + } + + @Override + public String toString() { + return title; + } + } +} diff --git a/ diy-layout-creator --username bancika@gmail.com/diylc-swing/lib/diylc-core.jar b/ diy-layout-creator --username bancika@gmail.com/diylc-swing/lib/diylc-core.jar index f13796cf834a689b4120e1d3923c0f60371df855..24ab80a4b050d55cc18aeb41314747740fedd8c2 100644 GIT binary patch delta 3932 zcmY+Hdsxlc8pro~ceNX&js|I;RrD@L=$eZRVHD zF-)S#UFnCJ=TI({M08aug>Jh$NjG!WTJPHPJg0y5$9ws{?|Rqzt>4e5exsg#Ba=n* zlsbkA_E&o&Ho;_+vgStY^~ugeS#cv)9YGwFujuc0WF)hzFA_H;4O5pB5B_TcW4PT1 zy!gMjzyuLzr#8*eQ|Eypx0k^<{%fdoRlcVAla+n!H_c0@6<9)=i(Wj!1%oIATjLQ* z?wUT>0WA^c)*RHamWAB2$jYAZa#2HixM98Zg+UywhemKuTCBY_F{K6kE~+Yh13{tK zt)uqWv5_91Gb$7VVflrq1hpEn8#nHqelCl_7>ePQ6=Q6X_ zkH>!EHm*W=9hIxgU6=kP#i`Je5}%Hi@Eu1GI=?kQ*XLcfIy~KOZxSvi z^ZRyO&eDqUa)eT$XwX$3i5()Dy##}_%0qD&wIZPh1(qE!&6S)#iq(EheZYg&p_h~Rns02e^jSrVCTXK``hf?z?Y=~nmaf@~5^inZ zBi!!%j45}zdeI{H+((EXFz0YHfgAw#B+3p-GLxI+zw45GCAUp7B&oQX4EKclA+%PI z+CNhz>za}c7#nR)5_k>S(27jQtob&i7j1KF$xo=R8A|5qa!qe1vJW*aciH+UQ_VBd zRSi+eb8G&Rrn&vJcf!O!yrDPO}}^K-RK zJo*FOnIj-wm5Ghi+ysVl)jvrR_Pl#DX+)W*tps;f-tliT4U623BQZ!*c93aiywkYD zB*1{vy+o3U!>J!}d~Pru&JxLA2`cG!GZ@L&Pm$G_YjcMD7pW|XSl}vK&XZ+Gvs1}p zq*Is4HjJ~ouFc(aX>sWqvi;U%Q8NU%dOfbAlHeuNIEHVe_@k4S6DJGW` zV%)-fVvDx*1!N~udm)KOiYg_ykX$QB8FZ|FDazT%t5*HomnHjiASGqw@zGe#M{N|7!m;t?R=?g?IvH-mI zWsMcwL)#S_z#B$hVGG2B$A!Cq3wrmDhPzhWHqRH7mh2{z0|TLhaGLoQWb&7zY!C(+ zU{1Y$3rE{!XVGR{2PqUICC^0oLTX(N`f|tLppf5$a`tLigRwT>q!ixtq_N*96i$D{ z>Pg%CL04Y27PfdUyd9P7k?yue>9oH7ena%N(37uvY#r7*#H*qYT{}F@ctc6dZr64n zy(Q7!c8Z+Rntc{^TPlN_=QqB*VY2Ppwq2Kg*VBF+=(CRl*(nja?RoR|8QO;4-vW1R z&FNQ|qQkurci|b@CS*Y%w@G^+!DKcIDeDnTXAhC2lTAMg=%z_t*)Wm2HfF#vWa8*4Og5#gTS3GN<7OI{>Ft_*=z%ss^V+9b-;bQ?ra)@{ip*$v23yv>f zHMi`20joGPzYrz-3Sj{sLIMLe{@Oy?51Y^UBGK5cB3Q&-#YM1~!<%r18tK*7z3u7+90~?Z4mMSjr8m=*TF`y?!rb<(5^}7L^jdgV==!q(H&-B zp%F158qw5QjTm;ThCa0{W@@vr>~E$eSQ~}S)WyKDMO6Q~MGWb7i)dcIRSYSxmF_SL zKG#ZT!vwopg#7K%U7%avt~?GaDyz8-OPz3mats826_ zq}Y{wuoqTvXzHag%rdKw#xOY5N4J1M8wC>zet*2yr1||YV>mP2Zhd>{n!Q4?Hb9|p zWB*YVf9H1EBuX{iU@d)_NWZ M!Am#h5sg;-4{bWQO8@`> delta 3891 zcmY+Hd05Wr8pq$~ep6bNQcbCBQ)nTEs1Xqk#*#fwrMMh}A(K6gF~d2Q=|XSjXI~~+ zVl0#TS>_zdQb~!Dl!TJ%Z7uq)?c-D7=P+8Hk~m=t!JcC zekLTX-f!ApJw9pm)e+8288xBINsK?UFV)wu=Dko}t2%xY@y)nemV@7i^1t13;zPuBY+Svyn2hz%nu2 zaUm)@_nwUq)wcm*jkAPcJYWDydUPFFIn+%+>w+58sSI`o(b^{eqV@TF{YNs*se~SqeJ91cr&l(UBOnaDOWb%!@sOmJiYyv>ZQNj75Gp`W#!EA4e{BCI+khns849Yl41{ z6LbC}!qPj87t7Mu+*wY=+%9cG>2p^TP(4{^=bcf?P8DVf3`@t_XooOc0jk+3J}o`K=D+-5q)U7a(2HGMmKs zg29+vP$-*=3cqDr*eu~KhDi0k%r^0wb{$H%)$K;O(fAotZhmM(i`;q_A*$0tK+=A; zN5sfZYBpY&=@mVmQKcHe(@0k1VjzlFfFk-z0+mHE1R%|rdzOi9# zXq#lmP9SM}vMKt?+~tvd*-q57{K?KQo@<_zE^C>sT<*+d6gWAM;X=tL+}UKbRS#y# zNbz5>0Z3207~g$Gbh;0VMJo4Y)_TJB*I2d(ZP62S6AGHl&ZEt68fzAQTrCgA9N;^%52VX7vyp15z({_zn#E!A_U~CGQusQC zyDD$p$VOq2+mVbPBBf`at!$LJpvb*!tf8Pg2U!X(&ig)xCI|AxnJxLL!B)Ci4aV}- zqiiwe+MHznK`Mx2-H~d}uz5%m6WC0oqrbB)NcLBCx!bO>UT8Zlv;N{amLFed9>SLV zCo@2&(QUQ{>4#J{3F+Z|b`fb)2Fpd7p2h5tR_3s6NcFia3Mu?KyN={q#Ojb7N|-m& zg177vHeg)FLU7T(D`ydEvCduYTifnn{AFdh&e=_1CgsVjyL99&Gm#o)<}a_SV(zFA zuVv>@bw(Y#EJ)(VqK|a3nQxCr6I+JfLm$}=q~2|8CDOi5UR~TNI5N!EgfF{+v__xV zCRqV3m6sZR#n>Eu_ysA%2!>xadib&B0B&+yVyj z6*I69FNb{39Pqi7^ST4R`?A&w?x6RQ4d4qSFSG+@syv8thzq!&ch>;8Z6$0|d_ip~ zC?EhDu!ZrnAVqu}Wy4@d#*EZO{E-)NX^UYASSTN^-9}Z*uX(Ce1J|lleWjd5&`a9d z0s3;-Qi$-Jb|^evwbbg5Z5GK*p=*5#E=^r^tXtwVdb8 znySjQ;r@nAH)`G1pIN)|g}(2d4SxB5sdbwy#nlK-i?64`76HJEXf0V6=cPY5cRVSiI6;n4&7JPJ^!nTuOs60vgi5 zTYyJ8Oc1ak9mWaZ!S+%?I`kI5b)<7uMZ-4(d<1OCfVl#mWx#X+E)QXnfQX0ijeyjL zFhziQCQKF(lnHYLBxOQ?0K-QFL60c?{3DnuT&<5NI3Noq3d@l!s#TLkF{82xqO-|W zl1+j`AHyt>wMz#jk0DT4d~#r(fCD)YBA_J)mI(-Z0zm>&bZaxKcI=9BX&-S9cJ zy5c$fU1U9c4od`h7Ld*_1u$D!N_7_B7o-#Wf~H*if_ffZNd3eX(mGccQt;R!3O-sy zv#2hjDUW$cmVGa&vC@}R)VrAPyK>@o74umr@T8cZCIxI>@!e72TOHhb#nTmwSqT?Z zAh-m^3WzHKe*sk`{MaZiuh*m#rGvY#sf6(xf?03)`B8#TyrJ~+HRClP-&XP6Q)2#I#dlZ%OD)AL)Kb=OS_-by@>{FKjH)Kf?rJKLS52-yHI%-*hWfc# zL(Lo3(jv{Qr5%p1rM3B3OM>I-$P!ye>1B14KD3^cBkO5dQtGM0t_>7Czky1eYM|iC z28tQnNUd(x!M#RWL-QtznWux}P1KK8XBpB=>3oauq}*?&ERzr9n)`v;IP-yG>U6G= zAL$Tn|47PDKJpHghx3aTx^~N3=(66|L9b6_iPS;iRK5g{i zMYq91Q9|2BF%#P<=2$!3(RvQ1yp8{T(4?sy;P0fEZq$}tyyBozEgh>;xhemO($DE_ z*3y*@dhTmGz+P>h43bAOI7zOZU?NI-cY-}Dm*#fDAfc6dHMl?MsZ@mqDwU&7h>wca v=}vGLLA~46=as(=+xg!RPX8A)TdMB_524)qGgo$&Mtz3i`WqkcXw`oK9Tmp1 diff --git a/ diy-layout-creator --username bancika@gmail.com/diylc-swing/library/main.jar b/ diy-layout-creator --username bancika@gmail.com/diylc-swing/library/main.jar index 972b5013ee5cc15d6b0efa2ad2053c912d4df42b..dcb2e55289eadfbc8a8e28a961c79ac638998178 100644 GIT binary patch delta 10811 zcmZvC1z1%}xc1(QknV1!yCfw91XNNm=x!;cbBmOKgw&Q0qy;3TJEc>)Q@Rle1^hQ_ zbIv{9`^%&2<^6Kad^58izu61MK549GfEmR2)YQ+P(bjFI0_RFA-Wqf!ayF20f7h- z#6(F^!w0i~8}N;6fV}h*Z3+gc`hevLCJ54aTd_c3DNcutx_$u5tlV zS^Mc*B(tuEh6MX21xWDG`Zh9&aa%5=Lv*)2q}Ayw0|4}+?VnBxg3I^%NX8(^nha#R zzhENG$I9@KV68F{0AGf8JLrQ20R&>m6!U17JBGfBptQHfl>ju8@3|xdfx@gP(#&t+ z5z_VO(raSSKFq^t2o69X9B46oDAZRY4pTOFHGiq;X6I35cAjSr{q&17Zs&vGjR2#A8#JS*61;Z?^BFoI@{Z zmaEZ3q6k7*c0Br>ocf(q`>S_OQVk=aIL0@FNIcW6+Ai2U>R;yx&|wU*DvJmCn!)Zh zwX%6cqCN>c(R$A+fNq8(kU6^K)g#E^;qz?8UYlF{cSRaioz6-`&5};`@z|$XVL!&JPRex^?ULk#8xOcM0qarEk4-3r)*f z-)P5k*;pIYqcD*-aKm-#BBDAFRKdky&TCkw5H8YI6?5<;HHhYCGSzBkYbRlH)NdAL zAyHmpm+M$*BUKJ5wpQ+RXDP8H`6_?RwMrsEZb9dSLrImo8maa?LhTM^s;eu^yNrpC zttY~?2D`!_KS5}-ak8mv4>^x(HQy4Q49c^mCE3Q$p?)aGB8!ZAD59`B1%v*xyI?@B7WdQH zx%n|fJ(I<#&(i##a{fN|i%a~@pmCEk$2xBIlSr1FzHn`HI7uEhY;3$hR7w=$l zsVleIAFJQ17QPPCMCx$8@xxVGQ_GGi!uQ>A_32NGPiQm+d$M*)o>yN+JpDY;uxKqb zc|p$6htav${*3hyN=`jl=@U$`RLyNVK1kEbZBw&1Y5%VH9qh8adL~I;-{{v4DO+o8 zkf!nMr}pN83MFFnTQ`B^yH-6_2SUqbC3PJ z@t8S4Bl$27y?h<^^x>qE+hstv;?I|Df(2{BCo>xU6c%Kpv)-d#k0sh{QJsJoIFshP zuY#l(@1MP()xS;Xi{2HxOKso0kM+Q2Vt@E;RsO9AJin(6tpT5GbyF&ANpVA22Gi1G zGE~-b?!srB@AtKd724WrXRC$do##0Eg-n%Vr7SDg|8`ADg;5aww7>6Z=NgdW%Xtyl zS*kxnaaZ_J`3Ku?O^i^T8jqQ`_ZU52pa3FWTZ}!1M+8gQRH_71tZEBn1;!B}z+z05 zew&)QWdECTnQreuZ@^lbAy;KRquvv%m6jz(G(6=g&jHa*B9%A2Mtl4%326gwXp%>* z(%AySizj52ySdS4?D%z z3!9P$jfW>ocQSug5rvA-F?t4QE#zsO>nsSP*_YBd;LXJE;~&ZezuDLtx|w+7az?=Y zi|}jnBwNOeUoqdk;j?@%j8?zVK{|$YJ5wCHQhgW%u{KD-qZ+w5Mt@1Sqme-%B0O-z z2f+W??UBo&KnL49b~Nr!s)zS{?{~(8DCKCseZ0hA0t^af2_`0fRJqp=AW+hv-l(_A z7E8UT_jaakP;BLIj_DLsynZtB>n%|+M|oDkm{j?3wU1S0k)2!Z^q6aYx%oi#yhu!! z8Bo@^B2s-a<24|5GUEgrkc?C_y!dSyiSj99&nxPq26@oT8_fh&UwoR|D(J(rk5vUx z6F1ro5}5~W@kN|66SmSk9^dTq#{VF1S(_W3hnh!LM`hiAFbL?dIhEV%+zT@=R1H$f z)aGb)l6vsv* zk`oFAKtWu#ikTkkp!`soQmH{Ap0#+^Btu`DxXZ@Ka?yqMt4d0e%=^2s5I-}daa!|jE6s_(Ij^#_nF0OS?WW+ z{2p_Acygv%qOWy}0L(2g$yM{-ZRwAikMBi35L{o4G2BS6vSLWn)X>$3{v42#E9+44 z+Taj7ma=o%QnE47oyEa^@9|T&K#jyOLx2Cctx=NihZekoDmQDjc4c02%BD!jso81u ztz(@|&U5FQr#UBtcloB$zp2-;6WwQ$Cwh$$SyXf^`II;BH{5rybKs)Oqs2fYk~>gOuejsw za^H&7)k{e+|06XEEN8?qRBU^0aAIWaTel*Ahvf6=M4nBnja`)*CwWW8WrHqO%wz-!1K_3}ogedwt&z$X(@U^s_Rwa}%J8IQ~+s>1q1SOoD8Z z09!EzQ+Ba}-~5wU`-|S+dO$ zPf$L}3IAClgF3d7e&v7|F7FrF2|A@*9|b4r zsTNkEZBrx#1~BII7p)jdSjg}XIf;H-%>Eoj!)!=aG!fjQb;D};JWQjxZNx^o$f;Fi z?_WW5B=h4_KuK3@(>NIo%(f+Y*e1v>-fd^LUW)IN{gaLzn7Dq<@b9?sg<}+PAN3sk zjj~i)G3+7ohlP*O^&V@-wFc-PXm$Hqh8G+MnxK@2*J`<>rMNRBPLPJ-W4sg~p(k*O zsKp}|qr>WS!RgMYTzfpU$3_tO%#j>ZzB)trHFxhT!JE-V@==udBE>@+mNt`zHZ4T0>?V39KXtW;HmKvi+qcaHw5i9uq;l<72o2=Qg-m2E zGt&Ha5pNMXqxL@v9!OIOFO+JmYOPka(L0z=s`%3WvwjMX8FtceH`;u+JA!X-L77+!Vhi z^%BEd8sDhmMU&s49{295wiiy&P808%kCT>7aMZ)UjQD+jeeb0q)9pLy?yOvM9^Tso zawbZyamzBbuo}%!!{*s&1IO9k?|~yWcj5(PzW9aL%zsoaudrKEl+#U7*k5M_AlIJBX6Of0d** z>~Bk7-BK%q-^CLg*xGu8(IMeam!*g^(~-O`*m5B}lj0#os)OT=#)?zN(RX8C#-A>u z1K0b_O`M*6OwXYvT!9(hKB#pee3ix8K6bVBlp){M1Y=}_-Ia2At#%@Ia`RSN&1&fC zMAXB!+r%&e6>09i3-NGAbg`6TW+F^{miA5@&!7~cbqqsDIF@s41mzKpZ^5u7=8sZW z^KrW5s&d<7iC{{9gOB96;;N~F>&(VZ$x;r3d;(iM5MMyDj7c1Mb!dH!bRT^<~> z5Xs68{iF*ZO0l2ye?6Y|#Z_OPwC zgqv+;)51cbsA6dSm($%TKgV>D`inxxd38Pgi(hwd53DX*PYKXcoPF-`s;Nu|p{1iSx0T#t#df*{>o@A`@d4H4oqt1w7`JdG`fn z*vm&A-C91nU392C61y|P8gJ4c5wF6nFV;Zu{Zq%Gmem=Z*_`*cfXxSZixKzBI|&~g z4#SK-J@e`M)cJ%-#hZunfec6Ex6x;n{rVbMw=EkqiTy$>QaSi1I@zVC*I#LMu}h0$ z-4eW0^m2(TCr6X?foQ1M8^&hsACHw=rS$qHe+WsGEb6#3-H98hkB-kv`5`|F>)bri zy@2L7&TR%4T%zayDIT4-`YDn-$8uJ=DK@zZyS#`l%Hv;~&Rerh`h6=tWZ1=Cx<3O| z4+k2SANe{jXDXt}V8@*>g8O(a>kEBg>2Hj(O~Q4>g{6KURJ!&)FP$%SNz(~~)poB? zl(gPwNfdT?CkHzf(}WcRC;NHE_OI0z44!Dr1gj+i6Ta=v_9;5Ll2{os`C>ur5s$t{ z!qOL#3EktW1ed|%~3gdhJ&;(xNr~YA;A1)XqN`A}9-dW?*^Bref z6JUv@Io!4IzQ>*Q6QlLp%{cbd zX=#{&Rtl6lr}jMen03ycju}hxv?!FBlFL1EW(eWY3$zz54R?pY7jD`%lRJtTG`o6Z zL+kuLoQk~`4UsBIOSLe0)i3*&%qXhAEzTLbG}4XEeBvWCf2wTTlH(|?+kyK&!e12j zHTxLSa|}sp>`&Hk@;-^z$2hW%V70W%x*l`aqj^dhPLZ-lc6u z(Xe1!k%9D=@>qE~Vt_A+P-P)iv)Iu1ozn|$BP$Z@tq+W!p2XNrgpquVH2MPQF@Dm7 z=nfE}xxaVJm4Dx{UrlDKe6k|OD3i*mC7m_1w(sHYfZuo!yl_||FJ7+ziyGhh0ZUc9 zh+lg#M>Zd8Y5^(zBM{X&~c*k2c+lb2|2d$%B^^CUdWj1A7 zsNk(b>pLYI_pDuEGHws)lzc1I;lGc%@c6c!@P8l0b{Y^{ugF>b^m1}MtaeT2FMafx zD1pY;!R@j{7G3-7m;VB1?OpT?t$Nu0qo1kWWbBQs4#c)+O%j*+>BHl@xKG^oDKD`l`(Iu1X5=-nW9`nGZ6nZ~%fO=!JqSYxb;LWmTXQQUw! z(JJomx5j>bt87!>7tAk9xWs+lsy=gO54F`9^U*fG)ORyg&`wJi>I#Z9*7u)>8Lpm0 zF5QB?Ykd3jOJe|D>Na74=!N_&%M&^6#iPZSf%>*ZCuiOz-ZO*}0h7R)w+k-wWi(uU zUVW4IXQ@)7RbyoJxjI?uL$9)Dk8;ivBkI`}_BSo11tU>xaf8RR-07b>y|FW;A8c!O zpbj2qxX}*9EBY;3MrZWLkve#&119F((31AUp(>$%Owo$jKIi#9zxb=#b02_SznV}g)B`4=`vvwz1qa;(t~LZ33H_-%IRTIi#tJUwuWs#D#j1e zcW%@jYkKz|b9y%)-$^d6_vf9|KP{;z;GOQ-5A`97Tw8v=#GDHVzE|z|;SPiPu9CHc ziAD&lUSN9T@urPD4aqo_2>xL*4ZJOmyaP?OBTV^9PRU`Ma&}78(5p`A73_=ZH$y-?l$JYROU2=;4~=oo^!Y%+!nA(7ZDut75)Xf_0*(u;KzRwCoHKo{rqd z4Z7_-*%0m^kZGE<^CSX=bpmF3!!EVsIZicylO^oKP5k3Yy4Fg{?pEmZ1r4XFBWhKj zD{DjRAc=&1E!Mm_8-39PPwR=+5Kt3D*LFgAI7IEt@B4~AeNY&_eJYZ|NrZ1Lk9NG~ z%wESTcKds&Lv}B$*vTmxU-(6vj7`XyCGVGvOF}&!om}7WbEOwu;hV621@jpfw%)+} zL6`Fh`PNN0;y)U_tjzo089pwZ3>uBQbUcXtXh!s~cGI^d*xX6#({hf4RF@~OI9kKU z_$~Js`MlUDq4dM5N)603Q~voqlCe{#YLp=pPKJaRZN@=yy3ADNVU;v(p2PDmg81g< z^}AswPrdY$bze$Z7ma(v631OIumh{rV$7Us)SU3dcY}M@ByfTywRVTSBQ9y9{dUJE zDC=A)A|HE&E2FpHdtuEiJGYS;nNNW%iiH1nzq>1ZiuI*uFCp`N}eC_EGv$8 z4D4F$?lnbLi=VRRtT?=^`AK#sKqO&l?c5s{lDhEhRLEBa-M5wJ$Fnk;#vHP9znEfa z4OCb<=Yi$JCEhapJ=kFRDW?wvmXq`%nr^k%GT^uA`6p)fbJ06HwA(F)k0MqW;3zCd zWEF`7lD#FN%Yy58$yqe1NxLSbA!pDwU@fkAl6yvQm=V-Ig3V6!V#k`={%x6L(lnjK*AMDsl4Rj2^`T zJ?~AY2R&NpZjNTM&2V~!3?#g6-8?%L!AvV>xziXd zpS{H{XMh#%(~%TkB-RxuAC#yyAl=%iyE3Dr>afBSEwnN>N%*s4RLwH{N&Mu_O2036 zizan%uE(+^Z{ZhMciGD#&h($tS*1}q+MUbKcvQ`mB5WKCJf!zTK9?-p6iEpWX=tle zk5eCPUbK!SGQp|-FpYj|A7YvV{Bk@Q+j6 zqICB4kKTH+XnJ2gsvSAMy4)tMR3|hr!iL1XQ}s=JIQ%KPJ2&1!9i=Z*HBlwW3Qu3b zDHp!_4e~_&^=dwR)_l&R=B-k8PZiVeDB`@gN=xLM7y4au3vilv+T>3cU7oPY;$RQC zv)AN~%FHt2ny|2O{zeThfITNSgi+#B>sNB(R0hW~v48yK*M0iaaCsl86QT%F9T(|1 z`C9dF@$a|T&nSNt9MT8;`3lq4+vMgERy@8`5^$dwlCZU=Yixz-O2q&8Y}B=eW9O+~ z!MA3~H#GeA=yt}R<~?qOBnrh_Z(;>>JZQgZWM?w&=J{f#`s+ z^-yws_hj^I-~7Um?~M)GUL!gW-45xFZ675GI`1lPo!d1$igAx~(I}`{#n?7A@rdOv zYksgLfR~>oKQ!`;Yw~p9)X<=Z>}wqNeMLN(OOt|zi~vt^SYLBzOy8&9WpC$}N4g~R zb6jcwu@Ap!VDVWOxtpAA7E-IsG%Xc}ax?KSW?mn?z#dT)d$+kKnh;j~Tw@h3_+zJ6 zqN&$SwMDPt{9PrXL;jx&&G$uR?`!j)8?>}Pvi0<=qnc1?*Qy@=JhQ!F7dlFRdS)@* z!6qyn7t`l%SJV0Kq2T12D9LhB}4_K{mo9I^c66Um!B@ACw6S|~NKdvj+gHOq;=^b6&n3uMP9YVr%YWF_hx zmI)9)lBK1mO}4d8ZvXC-E*YF(lJ!Y}b39L1%$%|bD11bI_;Y0GrmMri3xV$pXY)38 znePfc;R20n90Ye9KS*G9Gcw9(vPsLJeOFPxsWSUe{_#vNW-zY|vmS+irQ@v-(MBtB z@~#(pL&jY-0X=E8%_d4@{US%0MeYQU809BU$5jK!zy#8=(N${B2^EFOq%QbB3J zMr7q(TIeL$|E#28g~ov$-pVq5C>9bm-+`WDU3G~o>lC03=vR&1N*@(yBpQhDHKE)% zAd)tOPGW$F+6roi38JtUPzL}+7fw)iLJ+YBLbZ@wKrplwi5`YRT(0LeFKLkBBL>9LYI-zunVAt*r2qo3fhhVddYOB_4@^d zKx|NB2;Gog;Hp&s1{|*%z^-g>hN2?l_O(KNP(WLi4n*r4M8VzA79>*chvt%i-02eZ zC(>en1-gXHG@w3OFbEN&696;4TMyvFi)#VOO2%zy6cjY8*nvLB1``SrW;DEu=!BJ_ z#w?am!$IY+I)Jd!<_!7}>ACVZG!^-l+9-fE0GeTkBzR9FI`_I*@I_sK171`QkXGWO z11qSY{}U`=m<&XHH-P|5+^YfXJ-r>>f{64jW}%D*3{)Ay3Ctp6Sn~kCkjR1`;6~0z zyev?QoYltfIHIHm@W{994C86 zzy-;zz64N+!PK?`fqf)5{{}#G%&+QaKMa^da^E5VQBV(#la9DOfGAP8Vmjjb0HWUD zA?W}w2x`*-ArSmX2kwG8!Wn=f2wr6XDj*ol05m|roQV)2g1{Xz0eKKqW&-y?0AvAb z|A?sJ4p{&PXpx)+=z!oX3wQv;VGWARx>KbV1;d4_JU;A|EgVf%Ip<5(K%Q0do)# z762w7a4i6gKrmSV*nmKx5U>Klm%?jh%A#u~py)c)l_Efo;i^UZKUWSQ5Z?dX7s>Qf zIfkbd0d&~^Y16`+^8pgj?BC8VqDUnFGUGo3&B*^_#`GTyZz=%DKo|eh|AIic|8ik+ z4!V&1j~TKXrmh49NKmeByC7R=pWC9WQ4zJSiUNV${>w!P5!|>8AV>6^>ET`Z01g<@ z^?dhzR6GdeJ2eEt_?PW%HqaKl4+EF}0+52S z;>IHhzamnj{XYZbA^acxs4oC7sP8X{5)q9Ffsm3yAY6a>e=qj8J`Vgw2|xr+FiieQAM)FB>)Y`4qUO6TL0>z!ME=~vEip>h`~WDw!4XmfmN>%$$BCF z{{4a^rvEY0Ek(TG)jpG8*M=v727&M+21WF*gh#Ef^cmpAr2q>Uda@J|+S1{QMSQT8 z0j!_{p3M%X5X8-&S;UM8{pA4eb)_l?YF$)r5i=mhg_q=i&zV!el@>kxffbY#j$49w zjjOcyZt$wmBE~%mQ4%75d0h@i>T^0niQrGl5ruTMN!XSna(fc>uZRNPR1Sbg41C~9 zy;)3oUsnL1&-qXd;{p)dSbtmcPE{S+R62(Hq2J+OL>h^P%JNKtCzb(Pj#vAYIH_D|#W21eI}U_YB9 zS>q;v6wKS>ip{r2vWPDfK&lP>mGc0BG#)hKPm zN8I~n#P)i%Hxx7@ytKbXiuRkY=dt!>i&`;a&yr{T-y5G)GgW>LYajp2GW|u612n kuh(%@DFZ76A^!=^BcZ$3D$)1Px!9E!_RM+ie~j+KmJ|2e!1z5o-4lk$6yWrn4Ree z;b)#g$KiJ~jlgdSja2PH=JfycH-~@|{(cNWY|0#J*JpI$z7E2X&W9fC84%QrX zK~V2zr$KPVGs{uOsi_&){S5~k2pR2W&YEmAKXvQR=2U^9@YKMs9Z>mU&~F_P95q$p z;DyU482h1R$Kw77VU-+f8{Bx0=1U*Z>m*Cr!_hk+@SB1)e_Nh;$ z*R%8_z&P<=9MdCs{ntckNjj1;04sL!BfFilfh*#H=a-OKGXSyXf+v)it_Fc7%-75faYsd)uF3QQZ^tl$vum`n)8GNETJj{2B1nI9l z*h0-XNlN;5x>{z`vzM-w-7w#|cfXByV}77;VDl>YfPR_OT{)IT?_*Px%%e0;7JUCW zt&-@>-)OcS793qbkK_C*j|=HxXSD4pr`>YMb@lYL7Ht8o^pdna=%CX93!d}M%AN@t zLU!8|5{w12v*px5Nw(0r8dMZGExFhYggoYL8Q(`?>85gml}C4JrEK`Q2Q<$M$4dMk z{kJSHE2+Vh!+kTgY+61TF+AIP3;Hw5EwERz08Yv>COAMRMQ5WEtduEd=pjp%>+22Q z$RbPqAVu1S4FZ$&T{Hx)4Zw7-d|Y&5v?C$YJqQ^q(jCHHwu6VVc``)E&X+`khfKFA z2A<1E4YOf5E<5E#68s(4zf!UcUdnbAuK_zbcKIJ+lk}Ll39`L#!f(I&)!v^sXurlh zuffQY9l({P?*pAOU@wf4;+gwEBbRCHG3b$fSsHOjU(MZ4+L=dajO>X8+?2Eva7(gx zyCyZ8Ih$x_c27mts2n^6IWpeZdmeDzIoUu=O)YD<~l^^r=n_A>XDqwd|#w`5i;0Db#f#NXo1nFI&e7TOfioY z;{CR&XrdfDs|5_Ws=jOC8J&re)>%t=F^^i*WM2qs-E8K54g8qf3TkBW*Hvoq6;8nd zN#$Ho*IT2oj`~Pi9j-zkw##&tTXmmG>*?)O&(g1|VfG2?^Unk|l8wlu4x#gAQt;A< z3*LcAhraxcaXvrkvUwK4HbX}2k#6&@gC57#Wh{uC*`IHIS3)9eq^v zY_;NTCVRF0;{MS)c?0TrB-^>Idnk5`L0l2RxPLKJavKko_t;7qSbiG}LaIejhW}bA zS5~SAch*?1_GW$EC{rw7Mt5EK!_X$-?_TtA+V~?Fac*AN56<%CX{GTS-}b1OrD5lO zRF4X6#-Ts8^Vv(_>v+6P)M7j4-mcyu3GF<$2TsB*l;!d(7Bemp*75*h9l~C%ht!8kl{9}=nrKwPnLnB>sx0Bqn$jlsQFUycn$P9 zY_Qs!y;|`gcx^H_rz`CfGz=yiU4_ z#{}EirAEx@;t|`{OUlxv?z)HRduQkIyu9C8x?MYj)PN5R7Ht81hpAj7r#M<+2mTCX_dONggc http://code.google.com/p/diy-layout-creator/downloads/list + + + 3 + 7 + 0 + + 2012-03-21 20:00:00.000 CET + + + + NEW_FEATURE + Lever guitar switch + + + http://code.google.com/p/diy-layout-creator/downloads/list + \ No newline at end of file